Assan
A multipurpose Bootstrap 5 WordPress theme with ten header layouts, nine footers, seven colour skins, light/dark mode, 54 Elementor widgets and full WooCommerce support — all configured from the WordPress Customizer.
Thank you for buying Assan. This document covers installation, every option, and how to extend the theme. If something here does not match what you see, please get in touch before leaving a rating — see Support.
What you have
Assan is a WordPress theme. The design is built with Elementor, and the theme’s own widgets and components live in a companion plugin, Assan Core, that is bundled with the theme and installed for you.
| Item | What it is |
|---|---|
ct-assan | The theme. Layouts, Customizer options, WooCommerce templates. |
ct-assan-child | A ready-made child theme. Put your changes here. |
assan-core | Required plugin. The 54 Elementor widgets, the component library, portfolio/team/testimonial content types and the demo importer. |
assan-careers | Optional plugin. A job listing content type with an application form. |
assan-coming-soon | Optional plugin. A coming-soon / maintenance screen. |
Package contents
The download unzips to:
assan/
├── theme/
│ ├── ct-assan.zip the theme - install this one
│ └── ct-assan-child.zip optional child theme
├── documentation/
│ ├── index.html this file
│ ├── elements.html every widget and option
│ └── assets/doc.css
└── licensing/
└── third-party-licenses.txt
The theme’s own plugins — Assan Core, Assan Careers and Assan Coming Soon — are inside ct-assan.zip. The theme offers them after activation and installs each one from its own files; you do not install them by hand and nothing is downloaded for them. See Required & optional plugins.
Upload theme/ct-assan.zip. If you upload the whole download instead, WordPress will refuse it with “The package could not be installed. The theme is missing the style.css stylesheet.”
Requirements
| Minimum | Recommended | |
|---|---|---|
| WordPress | 6.0 | 7.0 or newer |
| PHP | 7.4 | 8.1 – 8.3 |
| MySQL / MariaDB | 5.7 / 10.3 | 8.0 / 10.6 |
| PHP memory limit | 128 MB | 256 MB — Elementor and the demo import both benefit |
PHP max_execution_time | 60s | 300s for the demo import |
PHP upload_max_filesize | 8 MB | 32 MB or more. ct-assan.zip is about 5 MB; below that, install by FTP |
Tested against WordPress 7.1 and PHP 8.3. The theme requires the mbstring and json PHP extensions, both standard.
Browsers. The two most recent versions of Chrome, Firefox, Safari and Edge, on desktop and mobile. Internet Explorer is not supported.
Installing the theme
From the WordPress admin
- Go to Appearance › Themes › Add New › Upload Theme.
- Choose
theme/ct-assan.zipand press Install Now. - Press Activate.
- A notice appears listing the plugins the theme needs. Follow it — see the next section.
By FTP
- Unzip
ct-assan.zipon your computer. - Upload the resulting
ct-assanfolder intowp-content/themes/. - Activate it under Appearance › Themes.
Using the child theme
Install ct-assan-child.zip the same way, then activate the child instead of the parent. Both must be present; only the child is activated. You can switch to the child at any time, before or after the demo import: your Customizer settings (header, footer, logo, colours) are carried across the first time you activate it. See Child theme for why you probably want this.
Required & optional plugins
After activating the theme you will see a notice at the top of the admin, and an Install Plugins screen. Nothing is installed or activated without you asking.
The screen is under Appearance › Install Plugins at first. Once Assan Core is active it moves to Assan Settings › Install Plugins, and when every plugin is installed and active it disappears, because there is nothing left to do. To install everything in one go, tick the box at the top of the list, choose Install and press Apply; then do the same with Activate.
Elementor and WooCommerce each open their own welcome or setup screen the first time you visit the dashboard after activating them. Both can be skipped; the demo import sets up what the theme needs.
Assan Core, Careers and Coming Soon are installed from files inside the theme — no internet connection is used. Elementor, WooCommerce, WordPress Importer and Yoast SEO come from WordPress.org, so your site needs outbound HTTPS for those. On a host that blocks it, download them from WordPress.org yourself and upload them under Plugins › Add New › Upload Plugin.
| Plugin | Required | Comes from | What it does |
|---|---|---|---|
| Assan Core | Yes | Included in the theme | All 54 Elementor widgets, the component library, portfolio / team / testimonial content types, the demo importer. The theme’s pages will not render without it. |
| Elementor | Yes | WordPress.org | The page builder every demo page is built with. |
| WooCommerce | No | WordPress.org | Only if you are selling. All shop options stay hidden until it is active. |
| Assan Careers | No | Included in the theme | Job listings with an application form. |
| Assan Coming Soon | No | Included in the theme | A coming-soon or maintenance screen. |
| Yoast SEO | No | WordPress.org | Search titles and descriptions, social sharing tags, sitemaps and schema. Recommended for any public site. |
Search engines and social sharing
The theme adds no SEO tags of its own; that is a plugin’s job. Install Yoast SEO from the plugin list (or use any SEO plugin you prefer) for page descriptions, social sharing previews and schema. With Yoast SEO active, the breadcrumb follows Yoast’s settings under Yoast SEO › Settings › Advanced › Breadcrumbs — the home text, which category is shown, a custom breadcrumb title per page — and is still drawn in the theme’s own style. Without an SEO plugin the theme builds the breadcrumb itself.
Every demo page is built with free Elementor plus Assan Core. Elementor Pro works alongside the theme if you have it, but nothing in the demo depends on it.
Importing the demo
Go to Assan Settings › Import Demo Data and press Import demo content. One run brings in everything: the pages, posts, products, portfolio, team, testimonials and jobs, the menus, the images, and the theme’s own settings.
Before you start
- WordPress Importer must be active. It is free, comes from WordPress.org, and the theme offers it on the plugin notice. The import screen links to it if it is missing.
- Elementor must be active — the demo pages are built with it.
- The demo’s pages, posts, products and settings are included with Assan Core. Only the images are downloaded, from the Assan demo site, so your site needs outbound HTTPS for those. Untick Download images to import with no connection at all.
- WooCommerce only if you want the shop pages and the demo catalogue.
The two options
Download images — on by default. Fetches the demo’s photographs and logos so the pages look as they do on the preview. Clear it for a much faster run that imports the content with empty image slots, which you can fill with your own pictures afterwards.
Use the demo’s homepage as this site’s front page — on by default. Also sets the blog page. Clear it to keep your current front page.
What happens
The import runs in short steps rather than one long request, so it works on hosts with strict timeouts. A progress bar and a log show each stage: reading the demo file, categories and tags, downloading images, pages and posts and products, menus, then the settings. With images, expect around five minutes, depending on your host’s connection; without images it takes well under a minute. Leave the tab open until it finishes.
The last stage applies the demo’s colours, header and footer choices, widgets, menu locations, permalinks and Elementor global styles, so there is nothing to configure afterwards.
If WooCommerce is active, two more things happen. The empty Shop, Cart, Checkout and My Account pages WooCommerce created on activation are replaced by the demo’s, so you do not end up with duplicates such as shop-2. A page you have already edited is not deleted: it is kept as a draft with -old added to its address. WooCommerce’s “coming soon” mode is also switched off, so visitors can see the shop; turn it back on under WooCommerce › Settings › Site visibility if you are not ready to open.
The import matches what is already there rather than duplicating it, and rebuilds the demo menus from scratch so menu items never stack up. Content you have added of your own is left alone. If a run is interrupted, start it again.
If the design does not match the preview
Elementor caches the stylesheet it generates for each page, and for the site’s global colours and fonts. If those files are stale or missing, pages render with the right content but the wrong spacing, colours or type — the usual sign is a page that looks unstyled or oddly plain.
- Go to Elementor › Editor › Tools, or open
/wp-admin/admin.php?page=elementor-toolsdirectly. - On the General tab, press Regenerate Files & Data.
- Reload the front end of your site once. Elementor rebuilds each page’s stylesheet the first time that page is viewed.
If a single page is still wrong, open it in Elementor and press Update — that rewrites its own stylesheet. If the colours or fonts are wrong across the whole site, that is the global stylesheet: open any page in Elementor, choose Site Settings from the menu at the top left of the editor, and press Update.
Elementor’s Regenerate Files & Data deletes the cached stylesheets; they are written again the next time each page is viewed. So always load the front end afterwards rather than judging the result from the admin.
If pages return “404 Not Found”
The import sets permalinks to /%postname%/ and rewrites the rules for you. Some hosts will not let it write the .htaccess file, though, in which case the setting is right but the server has not been told to route those addresses — the front page works and everything else 404s.
- Go to Settings › Permalinks (
/wp-admin/options-permalink.php). - Press Save Changes. You do not need to alter anything — saving is what rewrites the rules.
It is worth doing this once after any import as a matter of course. If the 404s persist, your host may have .htaccess overrides disabled (Apache’s AllowOverride) or need the rules added to an nginx config — ask them to enable pretty permalinks for the site.
If the import stalls
Each step is small, but a very strict host can still cut one short. If the progress bar stops or the log reports an error, run the import again — it carries on from where it stopped. If it keeps failing, raise these in php.ini (or ask your host) and try once more:
max_execution_time = 300
memory_limit = 256M
If images are missing
Images are downloaded one by one, and a few can fail on a slow connection without stopping the rest. The screen reports how many did not arrive. Run the import again to pick up the stragglers, or add those pictures yourself. A site that blocks outbound requests cannot download any of them — import with Download images cleared and use your own.
The photographs shown on the live preview and brought in by the demo import are for preview purposes only and are not included in your purchase. They are there so you can see the layouts working. Replace them with your own pictures before you put the site live. The client names and logos are invented for the preview; replace those with your own too.
Updating the theme and plugins
A new version of Assan arrives as a new download from the marketplace you bought it on. To update:
- Download the current package from your account there and unzip it.
- Install the new
ct-assan.zipover the old one: Appearance → Themes → Add New Theme → Upload Theme, choose the file, and when WordPress says the theme is already installed, choose Replace installed with uploaded. - The new theme carries the current Assan plugins. If any of yours are older, a notice appears at the top of the dashboard: follow it, or go to Assan Settings → Install Plugins, and press Update beside each one. They update from files inside the theme; nothing is downloaded.
If your marketplace has its own update plugin for WordPress, it can do steps 1 and 2 for you; step 3 is the same.
ct-assan is lost. Keep your changes in the child theme, which is never updated. Your content, settings and Elementor pages are not touched.Theme options
Everything lives in the WordPress Customizer, under Appearance › Customize. There is no separate options panel to learn.
| Panel | Covers |
|---|---|
| Assan: General | Colours & skin, typography (body and heading fonts), page layout and container width |
| Assan: Header | Header layout, search icon, My Account icon, logo extras, top info bar, header button |
| Assan: Footer | Footer layout, footer tone (dark/light) and footer content |
| Assan: Blog & Pages | Blog archive, single post, page header |
| Assan: Social Profiles | The social links used by headers, footers and author boxes |
| Assan: Shop | Shop archive layout, single product layout, badges, ratings and sorting. Only appears when WooCommerce is active. |
| Assan: Portfolio & Team | Portfolio archive layout, team archive |
Site title, logo, site icon, menus and widgets stay where WordPress puts them, so anything you already know about WordPress still applies.
WordPress’s own options
The options WordPress itself adds to the Customizer all work with Assan:
- Colors › Background Color and Background Image — the page background. It shows wherever a section does not paint a background of its own. The colour applies to the light colour mode; dark mode keeps its own.
- Header Image — becomes the picture behind the page title band, on every page that shows the band. A page’s or post’s own featured image still takes priority there.
- Site Identity, Menus, Widgets and Homepage Settings — as in any theme.
Shop options and header icons
Everything to do with the shop appears only while WooCommerce is active: the Assan: Shop panel, the cart icon in the header, and the My Account icon beside it. Without WooCommerce none of them is shown or offered.
- Cart icon — Assan: Shop › Show the mini cart in the header. Always on for the “Shopping cart” header layout.
- My Account icon — Assan: Header › Show the My Account icon. Independent of the cart, so either can be shown without the other.
Connections the theme makes
The theme and its plugins contact other servers in two cases only. None of them sends anything about you, your visitors or your content.
| Connection | When | What is sent | How to turn it off |
|---|---|---|---|
Google Fonts (fonts.googleapis.com, fonts.gstatic.com) | On every page view, to load the fonts. | The visitor’s browser requests the font files, as with any web font. | Return an empty array from the assan_google_font_families filter. The site then uses system fonts. |
Demo images (www.crazy-themes.com) | Only while the demo import runs with Download images ticked. | A request for each demo picture. | Untick Download images. |
Elementor, WooCommerce and WordPress itself make connections of their own (to WordPress.org, for example); those are theirs to document. Videos you add from YouTube or Vimeo load from those sites, as anywhere.
Fonts
Each colour skin comes with its own fonts. To use different ones, go to Assan: General › Typography:
- Body font — paragraphs, menus, buttons and forms.
- Heading font — every heading, including the large display titles.
Each list holds about forty popular Google fonts. For any other one choose Other… and type its name exactly as it appears on fonts.google.com (for example Space Grotesk). The preview updates as you choose. The first entry in each list, Default, names the font in use now; leave a field on it to keep the skin’s own font.
Only Google fonts are supported; a name Google does not have shows the system font instead. The small italic accents some sections use keep the skin’s serif. To add fonts to the lists use the assan_font_families filter, and to load no fonts from Google at all return an empty array from assan_google_font_families.
Header layouts
Appearance › Customize › Assan: Header › Header Layout
| Layout | Behaviour |
|---|---|
| Default | Solid bar with a shadow |
| Transparent | Overlays the hero |
| Fixed top | Always visible |
| Sticky fixed | Transparent at the top, solid once scrolled |
| Sticky | Reveals on scroll up |
| Centered logo | Logo centred above the navigation |
| Info bar | Contact strip above the nav |
| Search bar | Expandable site search |
| Offcanvas | Hamburger side panel |
| Shopping cart | Account link and mini cart |
The primary menu supports three levels. Third-level items open as fly-outs to the side, and flip direction automatically when there is no room on the right.
Footer layouts
Appearance › Customize › Assan: Footer › Footer Layout
| Layout | Style |
|---|---|
| Footer 1 | Dark — call to action and link columns |
| Footer 2 | Light — widget columns |
| Footer 3 | Dark — newsletter focus |
| Footer 4 | Light — compact |
| Footer 5 | Dark — large brand mark |
| Footer 6 | Dark — gradient panel |
| Footer 7 | Dark — split call to action |
| Footer 8 | Light — centred |
| Footer 9 | Dark — contact details |
Footer tone
Six of the nine layouts were designed dark and three light. Footer tone, in the same section, overrides that for every page at once:
| Setting | Does |
|---|---|
| Follow the layout (default) | Each layout keeps the tone it was designed with — the demo appearance. |
| Dark | Forces every footer dark, whichever layout is chosen. |
| Light | Forces every footer light. |
A single page can override it from the Assan Layout box on its edit screen, the same way it overrides the layout itself.
The footer is a Bootstrap data-bs-theme scope, so headings, body copy, links, borders and form fields all follow the tone. Nothing in the footer is painted a fixed white or black that would be left stranded when you switch.
Colour skins & dark mode
Appearance › Customize › Assan: General › Colours & Skin
- Default (blue), Green, Orange, Pink, Purple, Teal
- Serif — an alternate typographic treatment rather than a colour change
Each skin is a separately compiled stylesheet, so switching costs nothing at run time.
Light / dark / auto. Assan uses Bootstrap’s data-bs-theme. “Auto” follows the visitor’s operating-system setting. The choice is remembered per visitor in their browser, and applied before first paint so there is no flash of the wrong theme.
Right-to-left. A compiled RTL stylesheet ships with the theme and loads automatically for RTL locales. Nothing to switch on.
Per-page overrides
Any post, page or product can override the global layout. Look for the Assan Layout box on its edit screen (in the sidebar).
- Header layout
- Footer layout
- Footer tone — dark or light
- Sidebar position — left, right or none
The box stores nothing but a layout choice. If you switch theme, the page still renders; it simply falls back to the new theme’s own layout.
Menus
Appearance › Menus. Four locations:
| Location | Used by |
|---|---|
| Primary Menu | The main navbar, all header layouts. Three levels. |
| Offcanvas Panel Menu | The hamburger side panel |
| Header Top Bar Menu | The info-bar header’s small top strip |
| Footer Bottom Menu | The legal links row at the very bottom |
Menu item icons
Add a CSS class to any menu item (switch on CSS Classes under Screen Options if you do not see the field):
bi-namefor a Bootstrap Icon, e.g.bi-house
The full set is at icons.getbootstrap.com. Bootstrap Icons is the only icon font the theme loads, and it is used by every component that shows an icon.
Widget areas
Appearance › Widgets.
| Area | Appears in |
|---|---|
| Primary Sidebar | Blog and page sidebars |
| Shop Sidebar | WooCommerce archives. Registered only when WooCommerce is active. |
| Offcanvas Panel | Below the menu in the hamburger panel |
| Footer Newsletter | The newsletter slot in footers that have one |
Elementor widgets
Assan Core adds 54 widgets to Elementor, grouped into four panels — Heroes, Content, Media and Posts. Open any page with Edit with Elementor and search for “Assan”.
Heroes 8
- Assan Hero
- Assan Hero Split
- Assan Hero Slider
- Assan Hero Video
- Assan Hero Typed Text
- Assan Hero Newsletter
- Assan Hero Pricing
- Assan Hero Media Player
Content 31
- Assan Accordion
- Assan Account Form
- Assan Billing Switch
- Assan Blockquote
- Assan Button
- Assan Call To Action
- Assan Case Study Intro
- Assan Contact Form
- Assan Countdown
- Assan Counter
- Assan Feature Card
- Assan Featured Testimonial
- Assan Icon Card
- Assan List
- Assan Logo Strip
- Assan Media & Text
- Assan Modal
- Assan Newsletter Panel
- Assan Page Header
- Assan Pricing Table
- Assan Process Steps
- Assan Progress Bars
- Assan Project Links
- Assan Section Divider
- Assan Section Heading
- Assan Sidebar
- Assan Tabs
- Assan Team Member
- Assan Testimonial
- Assan Timeline
- Assan Typed Text
Media 8
- Assan Card Grid
- Assan Figure
- Assan Gallery
- Assan Map
- Assan Marquee
- Assan Parallax
- Assan Video
- Assan Video Popup
Posts 7
- Assan Next Project
- Assan Portfolio Grid
- Assan Post Grid
- Assan Products
- Assan Team Grid
- Assan Testimonial List
- Assan Testimonial Slider
The element reference lists all 54 widgets (plus the two from Assan Careers) with every option, the choices it offers, its default, and when it appears in the panel.
Building a page the way the demo is built
The demo pages are not laid out with Elementor’s spacing sliders. Each band of a page is a container with a class name, and the widgets sit inside it:
- Add a container and, under Advanced → CSS Classes, give it
assan-section. That is one band of the page, with the theme’s own spacing above and below. - Inside it add a container for each row with
assan-row assan-row-3(or-1,-2,-4) and drop the widgets in. They line up in equal columns and stack on phones without further settings. - For a widget that paints its own background edge to edge — a hero, a parallax band, a call to action — use
assan-section-fullon the outer container instead, so nothing is added around it.
The quickest way to learn the pattern is to open an imported page in Elementor and click through its containers. The full list of classes — tinted bands, half-height backgrounds, boxed panels, narrow columns — is in the element reference.
Options only appear where they have something to act on. A logo strip shows Columns for its carousel and plain-columns layouts only; a testimonial slider has no column count because it shows one story at a time. Each option’s “Shown when” note in the reference says what brings it up.
If you switch off Portfolio, Team, Testimonials or Jobs (see below), the widgets that depend on them disappear from the Elementor panel too. Your existing content is kept, not deleted — switch the type back on and everything returns.
Blog posts in Elementor
A blog post can be written in the block editor or built with Elementor (Edit with Elementor on the post). Either way it stays an article: the title band, featured image, date and author line, sidebar, tags, share links, author box and related posts are drawn by the theme, and Elementor builds only the body between them. The demo’s standard posts are built this way, from text, quote and picture widgets, so you can see how an article is put together.
To have another post type treated the same way, add it with the assan_elementor_article_types filter. A page built with Elementor is different: there Elementor owns the whole layout.
Portfolio, team, testimonials, jobs
Assan Core registers three content types, and Assan Careers adds a fourth. Each can be switched off under Assan Settings if you do not need it.
| Type | Provided by | Taxonomies |
|---|---|---|
| Portfolio | Assan Core | Portfolio categories |
| Team | Assan Core | — |
| Testimonials | Assan Core | — |
| Jobs | Assan Careers | Job categories, job types |
Portfolio archive layouts — Classic (image, title, categories), Overlay (details on hover) and Masonry (uneven heights). Set the archive’s layout under Assan: Portfolio & Team; the Portfolio Grid widget offers the same three, plus case-study, full-width and carousel layouts for hand-built pages.
Jobs come with an application form that emails the address you set, and stores each application in the admin.
A job’s page has two parts. The frame is filled from the job itself: the title, the location and contract line, the lead paragraph (the job’s Excerpt), the “Job Description” box (category, location, contract type, working hours and deadline, from the fields under the editor) and the Apply bar pinned to the foot of the window. The body between them is yours: open the job with Edit with Elementor and build it from widgets. The demo jobs use a Text Editor for the paragraphs and headings, the Assan List widget in its “Ticks, roomy” style for the two lists, and an Assan Figure for the picture. A job with no Elementor layout shows its ordinary editor content instead.
Turning off Portfolio hides the admin menu, the archive and the related widgets. Nothing is deleted. Turn it back on and the posts are exactly as they were.
WooCommerce
Activate WooCommerce and Appearance › Customize › Assan: Shop appears. Until then every shop option stays hidden, so a non-shop site is not cluttered with settings it cannot use.
Archive layouts
- Grid — product cards in a contained row
- List — image beside details, one product per row
- Full width — edge-to-edge grid, sidebar hidden
Product card styles
- Overlay — price swaps to a link on hover
- Classic — title, rating, price, button
- Minimal
Badges, ratings, add-to-cart buttons, the result count and the sort dropdown can each be switched on or off.
Single product layouts
- Gallery with thumbnail strip — slider with a vertical thumb rail
- Stacked gallery — every image down the page, no JavaScript
- Default — WooCommerce’s own gallery
- Full width — wide gallery above the details
Description and reviews render as Tabs, an Accordion or Stacked sections. The shop page can override the archive layout, and any product can override its own, from the Assan Layout box.
Images & demo assets
What ships with the theme
Background textures, decorative patterns, illustrations, stickers and vector shapes used by the components. These are part of the theme and are used automatically.
What the demo import adds
The photographs and logos seen on the preview are not inside the download. With Download images ticked, the importer fetches them from the Assan demo site and places them in your Media library, so every image slot is filled and the layouts look as they do on the preview. With it cleared, the pages import with empty image slots and the layout is otherwise identical.
To keep the import quick, it brings in one sample photograph for each image size rather than every picture on the preview. Slots of the same size therefore show the same photo — all the products share one, as do the team members — while every slot keeps exactly the size and shape it has on the preview. Logos, icons and app screens are each imported as they are.
The demo photographs are for preview purposes only and are not included in your purchase. They are licensed to us to show the layouts, and that licence does not pass to you. Replace them with your own pictures before you launch.
Client and partner logos
The company names and logos in the demo (Northwind, Staywise, Lumora and the rest) are invented for the preview and do not stand for real businesses. Swap them for your own clients’ logos: open the logo widget in Elementor and choose an image from the media library for each one.
Demo images live in your media library
The images the demo uses are copied into Media on import, not linked out of the theme folder. That means you can open Media and replace any of them like any other upload, and they survive if you later move to a child theme or another theme entirely.
Child theme
Use the child theme for anything you change. A parent theme update overwrites the parent’s files; it never touches the child.
- Install and activate
ct-assan-child.zip(the parent must stay installed). - Add CSS to
ct-assan-child/style.css. - Add PHP to
ct-assan-child/functions.php.
To override a template, copy it from the parent into the child keeping the same path, then edit the copy:
ct-assan/template-parts/footer/footer-3.php
→ ct-assan-child/template-parts/footer/footer-3.php
Changes to ct-assan/ are lost the next time you update. There is no exception to this; use the child theme.
Source files & build
There is no build step to run. The theme ships compiled CSS and JavaScript, and the unminified source of each alongside it:
| Production | Source |
|---|---|
assets/css/theme.min.css | assets/css/theme.css |
assets/css/theme-skin.min.css | assets/css/theme-skin.css |
assets/css/theme.rtl.min.css | assets/css/theme.rtl.css |
assets/js/theme.bundle.min.js | assets/js/theme.bundle.js |
assets/css/shop-components.min.css | assets/css/shop-components.css |
| In the Assan Core plugin | |
assets/components.min.css | assets/components.css |
assets/elementor.min.css | assets/elementor.css |
assets/vendor/node_modules/css/aos.css is the exception: the file the vendor ships is
already minified, so there is no .min sibling and none is needed.
How the skin stylesheets fit together
theme.css is the whole compiled build. A colour skin is not a second copy of it — it holds only the rules that differ, which is under two per cent of them, and loads after the base:
Default skin theme.min.css
Purple skin theme.min.css + theme-purple.min.css (27 KB)
Right-to-left theme.rtl.min.css (full build, no skin)
So a skin file is never loaded on its own, and editing one changes only that skin. Eight full builds would have put about five megabytes of near-identical CSS in the download.
Keep it as a difference against theme.css. Pasting a complete build into theme-purple.css still works — it just makes the download large again, and the rules it shares with the base are already loaded.
To work against the readable source, switch on SCRIPT_DEBUG in wp-config.php:
define( 'SCRIPT_DEBUG', true );
The theme then serves every unminified file instead of its .min counterpart. Turn it off for production.
Where things are
ct-assan/
├── assets/
│ ├── css/ compiled Bootstrap builds, one per skin, min + source
│ ├── js/ theme.bundle (design kit) and assan.js (WordPress glue)
│ ├── fonts/ Bootstrap Icons
│ ├── img/ the theme's own graphics - see below
│ └── vendor/ Plyr, GLightbox, AOS, Splitting, particles.js
├── inc/ setup, enqueue, customizer, template tags, WooCommerce
├── plugins/ Assan Core, Assan Careers and Assan Coming Soon, installed from here
├── template-parts/ header, footer, content and page-header partials
├── woocommerce/ WooCommerce template overrides
└── languages/ ct-assan.pot
assan-core/
├── components/ the markup of every design block
├── widgets/ the Elementor widgets and their options
├── includes/ content types, Elementor setup, demo importer
├── demo/ the demo content and settings the importer reads
├── assets/ styles and scripts for the components
└── languages/ assan-core.pot
What is in assets/img
Deliberately small. The theme ships only the graphics its components draw with; everything else is content you supply or the demo importer puts in your media library.
| Folder | Holds |
|---|---|
logo/ | logo.svg and logo-white.svg — the placeholder marks the demo importer sets as your logo. Replace them in Customize › Site Identity. |
vectors/ | Four decorative SVGs the components position behind sections: two dot patterns, a line and a quote mark. A child theme can override any of them by shipping a file of the same name in assets/img/vectors/. |
graphics/illustration/ | Six illustrations, including the 404 and under-construction artwork. |
stickers/ | Four feature-card icons used by the demo content. |
No photography, no client logos and no icon set beyond Bootstrap Icons — see Images & demo assets and Credits.
Performance
The theme does what a theme can do about page speed: every stylesheet and script is minified and versioned, the big design bundle and the theme glue are deferred, the colour skins ship as small overrides rather than full builds, Swiper comes from Elementor instead of a second bundled copy, and the icon font plus the first hero image are preloaded so they are not discovered late. The two things left are the server's job and your images.
Caching headers — worth checking on your host
A theme cannot send caching headers for its own files: by the time PHP runs, the browser has already been handed the CSS and JS by the web server. Most managed WordPress hosts set a far-future expiry for static assets already. If yours does not, repeat visitors re-validate every file on every page view instead of reading it from their own cache.
To check, look for cache-control or expires in the response headers
of any stylesheet:
curl -sI https://example.com/wp-content/themes/ct-assan/assets/css/theme.min.css | grep -i 'cache-control\|expires'
If nothing comes back, add this to the site's root .htaccess on Apache or
LiteSpeed, above the # BEGIN WordPress marker — WordPress
rewrites only the block between its own markers, so anything placed above it survives a
permalink save:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
</IfModule>
<IfModule mod_headers.c>
<FilesMatch "\.(css|js|woff2?|jpe?g|png|gif|svg|webp|avif)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
</IfModule>
A year is safe because every theme asset is requested with a version string that changes when the theme updates, so a new file is never masked by an old cache entry.
On nginx the equivalent goes in the server block:
location ~* \.(css|js|woff2?|jpe?g|png|gif|svg|webp|avif)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
Compression
Compression is normally on by default — it is what takes the main stylesheet from about 420 KB on disk to roughly 60 KB on the wire, so it matters more than any other single setting here. Confirm rather than assume:
curl -sI -H 'Accept-Encoding: gzip, br' https://example.com/wp-content/themes/ct-assan/assets/css/theme.min.css | grep -i content-encoding
You want gzip or br in the reply. If the header is missing, ask your
host to enable gzip or Brotli; it is a server setting, not something a theme can switch on.
Images are usually the largest part of a page
On a media-rich page, pictures routinely account for three quarters or more of what a visitor downloads — far more than the CSS and JavaScript combined. Two habits make the difference:
- Upload at a sensible size. A full-bleed background needs about 1920 px wide; anything larger is downscaled by the browser after being downloaded in full.
- Use WebP. WordPress accepts WebP uploads, and it typically saves half to three quarters of the file size of a JPEG or PNG at the same visible quality. It is the single biggest saving available on most sites. An image-optimisation plugin will convert an existing library for you.
Backgrounds set in Elementor are a particular case worth knowing about: a CSS background cannot
offer the browser a choice of sizes the way an <img> can, so whatever you
upload is what every visitor downloads, phone included. Keep those files small.
The theme registers four crops of its own (see Images & demo assets). Images already in the media library were resized when they were uploaded, so if you install the theme over an existing site, run a plugin such as Regenerate Thumbnails once so the crops exist for older uploads.
Caching and optimisation plugins
The theme is built to cooperate with them rather than duplicate them. A page-caching plugin can see the real rendered pages and so can do things a theme cannot — critical-CSS extraction, combining files, and deferring unused CSS. If you use one, let it handle those; the theme does not try to.
One setting to leave alone: do not have an optimisation plugin add defer or
async to jQuery. WooCommerce and Elementor both expect it loaded normally, and
deferring it breaks add-to-cart and the Elementor front-end.
Filters you can use
A few deliberate extension points, for use from your child theme’s functions.php.
| Filter | Does |
|---|---|
assan_newsletter_action | Sets the form action on the footer newsletter. Empty by default, which leaves the form inert — point it at your mailing-list provider. |
assan_component_vector | Resolves a vector shape name to a URL. |
assan_component_args | Filters the arguments passed to any component before it renders. |
assan_core_post_type_registry | Adds to or alters the registered content types. |
assan_coming_soon_template | Swaps the coming-soon screen template. |
assan_widget_directories | Adds a directory of your own Elementor widgets. |
assan_font_families | Adds to or alters the fonts offered under Typography in the Customizer. |
assan_google_font_families | Filters the list of families requested from Google Fonts. |
assan_elementor_article_types | The post types that keep the theme’s article layout (title, meta, sidebar) when edited with Elementor. Posts by default. |
assan_header_has_account | Whether the header shows the My Account icon. |
Example — sending the footer newsletter to your provider:
add_filter( 'assan_newsletter_action', function () {
return 'https://example.us21.list-manage.com/subscribe/post?u=…';
} );
Translating
Every string in the theme and its plugins is translatable. Templates are included:
ct-assan/languages/ct-assan.potct-assan-child/languages/ct-assan-child.potassan-core/languages/assan-core.potassan-careers/languages/assan-careers.potassan-coming-soon/languages/assan-coming-soon.pot
Open the .pot in Poedit (or Loco Translate inside WordPress), translate, and save the .po/.mo pair into the same languages/ folder named for your locale — for example ct-assan-fr_FR.mo.
Right-to-left locales are handled automatically; see Colour skins.
Credits & licences
Assan itself is released under the GNU General Public License v2 or later. Your purchase is governed by the licence you bought from the marketplace.
The theme bundles the third-party work below. Each remains under its own licence, and those licences are not granted by us.
Open-source libraries
| Library | Version | Licence | Home |
|---|---|---|---|
| Bootstrap | 5.x | MIT | getbootstrap.com |
| Bootstrap Icons | 1.11.3 | MIT | icons.getbootstrap.com |
| Plyr | — | MIT | plyr.io |
| GLightbox | — | MIT | github.com/biati-digital/glightbox |
| AOS | — | MIT | michalsnik.github.io/aos |
| Splitting | — | MIT | splitting.js.org |
| particles.js | 2.0.0 | MIT | github.com/VincentGarreau/particles.js |
| jQuery Countdown | 2.2.0 | MIT | github.com/hilios/jQuery.countdown |
| jQuery Easing | — | BSD | gsgd.co.uk/sandbox/jquery/easing |
| Jarallax | 2.2.1 | MIT | github.com/nk-o/jarallax |
| smooth-scroll | 16.1.3 | MIT | github.com/cferdinandi/smooth-scroll |
| CountUp.js | — | MIT | github.com/inorganik/countUp.js |
| TGM Plugin Activation | 2.6.1 | GPL-2.0-or-later | tgmpluginactivation.com |
Licensed components
The following are commercial or dual-licensed. They are included under a licence held by Crazy-Themes for use in this theme; that licence covers your use of Assan but is not transferable to your own separate projects.
| Component | Version | Terms |
|---|---|---|
| Isotope | 3.0.6 | GPLv3 for open-source use; Assan is GPL v2-or-later. metafizzy.co/isotope |
Supplied by a required plugin
Swiper (MIT) is not shipped with the theme. Every carousel asks for the swiper handle, which Elementor registers on each front-end request and serves from its own copy — Elementor is a required plugin, so it is always there. The single-product gallery falls back to a JavaScript-free stacked layout if it ever is not.
Images
Photographs used on the live demo are for preview purposes only and are not included in your purchase. They are not inside the download; the demo importer fetches them from the demo site so you can see the layouts, and you must replace them before launch — see Images & demo assets. Illustrations, patterns, textures and vector shapes that are included are either our own work or licensed for redistribution within this theme.
Troubleshooting
Pages look unstyled, or widgets are missing from Elementor
Assan Core is not active. Go to Appearance › Install Plugins and activate it.
“The uploaded file exceeds the upload_max_filesize directive in php.ini”
Your host allows smaller uploads than the theme’s zip, which is about 5 MB. Either ask the host to raise upload_max_filesize and post_max_size to 32 MB, or install the theme by FTP, which has no size limit. On some hosts the same cause shows as “The link you followed has expired.”
“The theme is missing the style.css stylesheet”
You uploaded the whole download instead of the theme. Upload theme/ct-assan.zip.
A page has lost its styling
Spacing, colours or layout have gone, on one page or on all of them. Work through these in order — the first one fixes it in almost every case.
- Regenerate Elementor’s files. Go to Elementor › Editor › Tools and, on the General tab, press Regenerate Files & Data (older versions call it Regenerate CSS & Data), then reload the page. Each page’s stylesheet is rebuilt the next time that page is opened.
- Clear every other cache. Empty your caching plugin and any CDN, then hard-refresh the browser (Ctrl+Shift+R, or Cmd+Shift+R on a Mac). A cache can keep serving a link to a stylesheet that no longer exists.
- If colours, fonts or the content width are wrong on every page, the site-wide stylesheet is the one missing. Open any page with Edit with Elementor, open Site Settings from the top-left menu, change nothing, and press Update.
- Check the folder is writable. Elementor writes its stylesheets to
wp-content/uploads/elementor/css/. If the server cannot write there, nothing is regenerated. Ask your host to make theuploadsfolder writable by the web server. - A workaround while that is being fixed. Under Elementor › Settings › Performance (Advanced on older versions) set CSS Print Method to Internal Embedding. Elementor then prints the styles into the page itself and does not need the folder.
If only the Assan widgets look unstyled — plain text with no layout — this is not the cache: see the first entry above. Straight after a demo import, see also If the design does not match the preview.
A page I edited in Elementor still shows the old version
Elementor caches rendered markup. Elementor › Editor › Tools › Regenerate Files & Data, then reload.
The demo import stops part-way
Raise max_execution_time and memory_limit (see Importing the demo) and run it again. Re-running is safe.
Imported pages have no images
The images are downloaded from the Assan demo site during the import. Check that Download images was ticked and that your host allows outbound HTTPS requests, then run the import again — it only fetches what is missing. See Images & demo assets.
Shop options are missing from the Customizer
They appear only when WooCommerce is active.
My changes disappeared after updating
They were made in the parent theme. Use the child theme; you will need to re-apply them there.
The footer newsletter form does nothing
By design — it has no mailing-list provider attached. Point it at yours with the assan_newsletter_action filter (see Filters).
Support & changelog
Support covers the theme working as described here: bugs, installation problems and questions about the options. It does not cover customisation work, third-party plugins, or hosting configuration.
- Please include your WordPress version, PHP version, the theme version, and the active plugin list.
- A screenshot and the page URL usually save a round trip.
- If you see a PHP error, paste the full message rather than a summary of it.
The full version history is in ct-assan/readme.txt for the theme and assan-core/readme.txt for the widgets, under Changelog.