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.

ItemWhat it is
ct-assanThe theme. Layouts, Customizer options, WooCommerce templates.
ct-assan-childA ready-made child theme. Put your changes here.
assan-coreRequired plugin. The 54 Elementor widgets, the component library, portfolio/team/testimonial content types and the demo importer.
assan-careersOptional plugin. A job listing content type with an application form.
assan-coming-soonOptional 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.

Installing from the right file

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

 MinimumRecommended
WordPress6.07.0 or newer
PHP7.48.1 – 8.3
MySQL / MariaDB5.7 / 10.38.0 / 10.6
PHP memory limit128 MB256 MB — Elementor and the demo import both benefit
PHP max_execution_time60s300s for the demo import
PHP upload_max_filesize8 MB32 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

  1. Go to Appearance › Themes › Add New › Upload Theme.
  2. Choose theme/ct-assan.zip and press Install Now.
  3. Press Activate.
  4. A notice appears listing the plugins the theme needs. Follow it — see the next section.

By FTP

  1. Unzip ct-assan.zip on your computer.
  2. Upload the resulting ct-assan folder into wp-content/themes/.
  3. 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.

Where each plugin comes from

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.

PluginRequiredComes fromWhat it does
Assan CoreYesIncluded in the themeAll 54 Elementor widgets, the component library, portfolio / team / testimonial content types, the demo importer. The theme’s pages will not render without it.
ElementorYesWordPress.orgThe page builder every demo page is built with.
WooCommerceNoWordPress.orgOnly if you are selling. All shop options stay hidden until it is active.
Assan CareersNoIncluded in the themeJob listings with an application form.
Assan Coming SoonNoIncluded in the themeA coming-soon or maintenance screen.
Yoast SEONoWordPress.orgSearch 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.

Elementor Pro is not required

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

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.

Safe to run twice

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.

  1. Go to Elementor › Editor › Tools, or open /wp-admin/admin.php?page=elementor-tools directly.
  2. On the General tab, press Regenerate Files & Data.
  3. 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.

Clearing the cache does not rebuild it

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.

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.

  1. Go to Settings › Permalinks (/wp-admin/options-permalink.php).
  2. 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 demo photographs are for preview only

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:

  1. Download the current package from your account there and unzip it.
  2. Install the new ct-assan.zip over 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.
  3. 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.

An update replaces the theme’s own files. Anything you changed inside 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.

PanelCovers
Assan: GeneralColours & skin, typography (body and heading fonts), page layout and container width
Assan: HeaderHeader layout, search icon, My Account icon, logo extras, top info bar, header button
Assan: FooterFooter layout, footer tone (dark/light) and footer content
Assan: Blog & PagesBlog archive, single post, page header
Assan: Social ProfilesThe social links used by headers, footers and author boxes
Assan: ShopShop archive layout, single product layout, badges, ratings and sorting. Only appears when WooCommerce is active.
Assan: Portfolio & TeamPortfolio 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:

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.

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.

ConnectionWhenWhat is sentHow 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:

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

LayoutBehaviour
DefaultSolid bar with a shadow
TransparentOverlays the hero
Fixed topAlways visible
Sticky fixedTransparent at the top, solid once scrolled
StickyReveals on scroll up
Centered logoLogo centred above the navigation
Info barContact strip above the nav
Search barExpandable site search
OffcanvasHamburger side panel
Shopping cartAccount 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

LayoutStyle
Footer 1Dark — call to action and link columns
Footer 2Light — widget columns
Footer 3Dark — newsletter focus
Footer 4Light — compact
Footer 5Dark — large brand mark
Footer 6Dark — gradient panel
Footer 7Dark — split call to action
Footer 8Light — centred
Footer 9Dark — 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:

SettingDoes
Follow the layout (default)Each layout keeps the tone it was designed with — the demo appearance.
DarkForces every footer dark, whichever layout is chosen.
LightForces 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.

It recolours the whole footer, not just the background

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

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).

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.

Appearance › Menus. Four locations:

LocationUsed by
Primary MenuThe main navbar, all header layouts. Three levels.
Offcanvas Panel MenuThe hamburger side panel
Header Top Bar MenuThe info-bar header’s small top strip
Footer Bottom MenuThe 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):

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.

AreaAppears in
Primary SidebarBlog and page sidebars
Shop SidebarWooCommerce archives. Registered only when WooCommerce is active.
Offcanvas PanelBelow the menu in the hamburger panel
Footer NewsletterThe 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

Content 31

Media 8

Posts 7

Every option, widget by widget

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:

  1. 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.
  2. 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.
  3. For a widget that paints its own background edge to edge — a hero, a parallax band, a call to action — use assan-section-full on 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.

An option is missing from the panel?

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.

Widgets follow your content settings

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.

TypeProvided byTaxonomies
PortfolioAssan CorePortfolio categories
TeamAssan Core—
TestimonialsAssan Core—
JobsAssan CareersJob 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.

Switching a type off keeps the content

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

Product card styles

Badges, ratings, add-to-cart buttons, the result count and the sort dropdown can each be switched on or off.

Single product layouts

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.

  1. Install and activate ct-assan-child.zip (the parent must stay installed).
  2. Add CSS to ct-assan-child/style.css.
  3. 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
Do not edit the parent theme

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:

ProductionSource
assets/css/theme.min.cssassets/css/theme.css
assets/css/theme-skin.min.cssassets/css/theme-skin.css
assets/css/theme.rtl.min.cssassets/css/theme.rtl.css
assets/js/theme.bundle.min.jsassets/js/theme.bundle.js
assets/css/shop-components.min.cssassets/css/shop-components.css
In the Assan Core plugin
assets/components.min.cssassets/components.css
assets/elementor.min.cssassets/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.

If you rebuild a skin

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.

FolderHolds
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:

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.

After adding or changing image sizes

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.

FilterDoes
assan_newsletter_actionSets the form action on the footer newsletter. Empty by default, which leaves the form inert — point it at your mailing-list provider.
assan_component_vectorResolves a vector shape name to a URL.
assan_component_argsFilters the arguments passed to any component before it renders.
assan_core_post_type_registryAdds to or alters the registered content types.
assan_coming_soon_templateSwaps the coming-soon screen template.
assan_widget_directoriesAdds a directory of your own Elementor widgets.
assan_font_familiesAdds to or alters the fonts offered under Typography in the Customizer.
assan_google_font_familiesFilters the list of families requested from Google Fonts.
assan_elementor_article_typesThe post types that keep the theme’s article layout (title, meta, sidebar) when edited with Elementor. Posts by default.
assan_header_has_accountWhether 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:

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

LibraryVersionLicenceHome
Bootstrap5.xMITgetbootstrap.com
Bootstrap Icons1.11.3MITicons.getbootstrap.com
Plyr—MITplyr.io
GLightbox—MITgithub.com/biati-digital/glightbox
AOS—MITmichalsnik.github.io/aos
Splitting—MITsplitting.js.org
particles.js2.0.0MITgithub.com/VincentGarreau/particles.js
jQuery Countdown2.2.0MITgithub.com/hilios/jQuery.countdown
jQuery Easing—BSDgsgd.co.uk/sandbox/jquery/easing
Jarallax2.2.1MITgithub.com/nk-o/jarallax
smooth-scroll16.1.3MITgithub.com/cferdinandi/smooth-scroll
CountUp.js—MITgithub.com/inorganik/countUp.js
TGM Plugin Activation2.6.1GPL-2.0-or-latertgmpluginactivation.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.

ComponentVersionTerms
Isotope3.0.6GPLv3 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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 the uploads folder writable by the web server.
  5. 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.

The full version history is in ct-assan/readme.txt for the theme and assan-core/readme.txt for the widgets, under Changelog.