Meridian handbook
Everything you need to customise, translate and integrate the template into your CMS — in about ten minutes of reading.
Getting started
Thank you for purchasing Meridian. The template is plain HTML, CSS and JavaScript — no build tools are required to use it.
- Unzip the package.
- Open
index.htmlin your browser — or better, serve the folder with any local web server so fonts and relative paths behave exactly like on a real host. - Pick the homepage you need (
index.html,home-shop.htmlorlanding.html), delete the pages you don’t use and start replacing content.
# Any of these starts a local server in the template folder
npx serve .
python3 -m http.server 8000
php -S localhost:8000assets/scss, assets/vendor/bootstrap/scss, partials and this documentation folder, which are for development only) to your web host.File structure
meridian/
├── assets/
│ ├── css/ meridian.min.css (production) · meridian.css (readable)
│ ├── scss/ _variables.scss + component partials (source)
│ ├── js/ meridian.js — all interactions, vanilla JS
│ ├── img/ brand · hero · portfolio · shop · blog · team · misc
│ ├── fonts/ Plus Jakarta Sans variable (woff2)
│ └── vendor/ bootstrap (js + scss) · bootstrap-icons
├── documentation/ this guide
├── partials/ head.html · header.html · footer.html · processwire/_main.php
├── sl/ Slovenian homepage example
├── sitemap.xml · robots.txt · llms.txt · site.webmanifest
└── *.html 26 pagesPages
| File | Purpose |
|---|---|
index.html | Agency / studio homepage |
home-shop.html | Online store homepage |
landing.html | SaaS / product landing page |
about.html | About, values, team, timeline |
services.html | Services overview |
service-detail.html | Single service with sidebar |
pricing.html | Plans, billing toggle, comparison table |
faq.html | Grouped FAQ / help center |
contact.html | Contact form, details, consent-based map |
portfolio.html | Filterable project grid |
project.html | Case study with gallery & lightbox |
blog.html | Article list, featured post, sidebar |
blog-post.html | Article with TOC, author, comments |
search.html | Search results with type tabs |
shop.html | Catalogue with filters & sorting |
product.html | Product detail, variants, reviews |
cart.html | Cart, coupon, summary |
checkout.html | 4-step checkout |
login.html / register.html | Authentication screens |
account.html | Customer dashboard |
elements.html | UI components library |
404.html | Not-found page |
privacy.html / terms.html | Legal pages (sample text) |
sl/index.html | Translated homepage example |
Colors, fonts & logo
All design tokens live in assets/scss/_variables.scss. Change them, then recompile the stylesheet:
// assets/scss/_variables.scss
$primary: #4338ff; // main brand color
$accent: #ff6b3d; // secondary highlight
$ink: #0f1222; // dark surfaces & text
$paper: #f7f6f2; // page background
$border-radius-xl: 1.5rem;
$font-family-sans-serif: "Plus Jakarta Sans", system-ui, sans-serif;npm install -g sass
sass --style=compressed --no-source-map assets/scss/meridian.scss assets/css/meridian.min.cssWithout Sass
Small tweaks can be done by overriding CSS variables in your own stylesheet loaded after meridian.min.css:
:root { --bs-primary: #0a7cff; --bs-primary-rgb: 10,124,255;
--mr-grad: linear-gradient(120deg, #0a7cff, #00c2a8); }Logo & favicon
Replace the .brand-logo markup in header and footer with an <img> or inline SVG. Replace assets/img/brand/favicon.svg, apple-touch-icon.png and og-image.jpg (1200×630).
Fonts
The font is self-hosted from assets/fonts. To use another font, add its woff2 files, update _fonts.scss and $font-family-sans-serif, and update the <link rel="preload"> in each page head.
Header, menu & footer
The header contains a topbar, sticky navbar, mega menu, language switcher, search modal trigger, theme toggle, account and cart buttons. On screens below 992px the menu becomes an offcanvas panel.
- Active link: add
activeandaria-current="page"to the current.nav-link. - Mega menu: a dropdown with the extra class
dropdown-megaon the<li>. Its content is a normal Bootstrap grid. - Hover: dropdowns open on hover on desktop devices with a mouse; click/tap always works.
- Topbar: remove
.topbarif you don’t need it.
<li class="nav-item dropdown dropdown-mega">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown"
aria-expanded="false" data-bs-auto-close="outside">Pages</a>
<div class="dropdown-menu">
<div class="row g-3">
<div class="col-lg-3">
<div class="mega-title">Company</div>
<a class="mega-link" href="about.html">
<span class="mega-icon"><i class="bi bi-building"></i></span>
<span><strong>About us</strong><small>Story, team & values</small></span>
</a>
</div>
<!-- more columns -->
</div>
</div>
</li>partials/ — include those files from your CMS or build tool instead of copying them into every page.JavaScript features
assets/js/meridian.js is dependency-free (besides Bootstrap). Each feature runs only if its markup is present and is configured with data attributes:
| Feature | Markup |
|---|---|
| Dark mode toggle | data-theme-toggle |
| Reveal on scroll | class="reveal" |
| Animated counter | data-count-to="340" data-suffix="+" |
| Filterable grid | data-filter-group="#grid", data-filter="web", .work-item[data-category] |
| Lightbox | <a href="big.webp" data-lightbox="group" data-caption="…"> |
| Form validation | form.needs-validation (+ data-demo-submit) |
| Honeypot | .hp-field with hidden input |
| Password reveal | data-password-toggle="#id" |
| Billing toggle | input[name=billing] + data-price-monthly/yearly |
| Sorting | data-sort-grid="#grid" |
| Click-to-load map / video | data-map-src, data-video-src |
| Copy to clipboard | data-copy="text" |
| Tooltips / popovers | data-bs-toggle="tooltip|popover" |
| Cookie consent | .cookie-bar, event mr:consent |
// React to the visitor's cookie choice (e.g. load analytics)
document.addEventListener('mr:consent', (e) => {
if (e.detail === 'all') { /* load analytics / marketing scripts here */ }
});Forms & backend
All forms use Bootstrap validation, real <label>s, help text and error messages. Forms with data-demo-submit only simulate sending. To connect a backend, remove that attribute and set action/method, or send via fetch:
// in meridian.js, replace the setTimeout demo block with:
fetch(form.action, { method: 'POST', body: new FormData(form) })
.then(r => r.ok ? showSuccess() : showError());Every public form includes a hidden honeypot field. Pair it with server-side validation, rate limiting and optionally Cloudflare Turnstile or reCAPTCHA.
Shop & cart
The shop UI ships with a working client-side demo cart (stored in localStorage). It powers the mini cart, cart page, checkout summary, free-shipping bar and coupon (demo code MERIDIAN10).
<button type="button" class="btn btn-primary"
data-add-to-cart data-id="p4" data-name="Orbit Table Lamp"
data-price="89" data-img="assets/img/shop/product-4-sm.webp">Add to cart</button>
<!-- outputs -->
<span class="cart-count"></span>
<div data-cart-lines="mini"></div> <!-- or "page" -->
<span data-cart-sub></span> <span data-cart-ship></span> <span data-cart-total></span>For a real store, keep the markup and replace the cart object methods in meridian.js with calls to your shop API (PrestaShop, WooCommerce, Snipcart, Stripe Checkout or custom). Constants FREE_SHIP and SHIP set the demo shipping rules; currency comes from <html data-currency="EUR">.
Multilingual
- Set
<html lang="xx">on every page. - Keep
<link rel="alternate" hreflang="…">tags for every translation plusx-default. - Translate the JS strings in the
I18Nobject at the top ofmeridian.js. - Layouts are designed for longer strings (German, Slovenian…) — buttons and menus wrap gracefully.
- The font includes the latin-ext subset (č, š, ž, ć, đ, ő, ł…).
const I18N = {
en: { added: 'added to cart', empty: 'Your cart is empty', ... },
sl: { added: 'dodano v košarico', empty: 'Vaša košarica je prazna', ... },
de: { added: 'zum Warenkorb hinzugefügt', empty: 'Ihr Warenkorb ist leer', ... }
};See sl/index.html for a fully translated page.
SEO & GEO
Every page has a unique title, meta description, canonical URL, Open Graph/Twitter tags, a single h1, breadcrumbs and relevant JSON-LD structured data.
| Schema type | Page |
|---|---|
| Organization, WebSite + SearchAction, FAQPage | index.html |
| LocalBusiness | contact.html |
| Product + AggregateRating + Offer | product.html |
| BlogPosting / Blog | blog-post.html, blog.html |
| Store | home-shop.html |
| SoftwareApplication | landing.html |
| Service, ItemList | services.html, service-detail.html |
| CreativeWork | project.html |
| BreadcrumbList | all inner pages |
GEO (generative engine optimisation): llms.txt gives AI assistants a concise summary of the site, robots.txt allows AI crawlers (remove the lines to opt out), and content uses clear headings, summaries and FAQ blocks that are easy to quote.
https://example.com/ everywhere (canonical, hreflang, OG, JSON-LD, sitemap.xml, robots.txt, llms.txt).ProcessWire & CMS
Each <section> is a self-contained block designed to become a Repeater Matrix type (or PageTable / page-builder block):
| Block | Suggested fields |
|---|---|
| Hero | headline, text, image, buttons (repeater) |
| Features | repeater: icon (text, e.g. bi-palette), title, text, link |
| Stats | repeater: value, suffix, label |
| Portfolio | page reference to project pages, category Page field |
| Testimonials | repeater: quote, name, role, photo |
| Pricing | repeater: name, price_monthly, price_yearly, features, featured |
| FAQ | repeater: question, answer (also output as FAQPage JSON-LD) |
| CTA band | title, text, buttons |
| Gallery | images field |
Use multilingual field types (TextLanguage, TextareaLanguage, PageTitleLanguage) and language-specific page names. partials/processwire/_main.php is a starter layout with a dynamic menu, hreflang output and block rendering.
<?php foreach($page->blocks as $block) echo $block->render(); // /site/templates/blocks/{{type}}.php ?>The same structure maps cleanly to PrestaShop (Smarty), WordPress (block patterns / ACF flexible content), Statamic, Craft or any headless CMS.
Performance & accessibility
- One stylesheet (~43 KB gzipped incl. all of Bootstrap), two deferred scripts, no jQuery.
- Self-hosted variable font, preloaded,
font-display: swap. - Images in WebP with explicit
width/heightandloading="lazy"below the fold; hero image usesfetchpriority="high". - Optional: run PurgeCSS on your final templates to remove unused CSS.
- Skip link, visible focus states, ARIA labels on icon buttons, semantic landmarks.
- Animations respect
prefers-reduced-motion. - Color contrast meets WCAG 2.2 AA.
Credits & license
| Asset | License |
|---|---|
| Bootstrap 5.3.9 | MIT |
| Bootstrap Icons 1.13.2 | MIT |
| Plus Jakarta Sans | SIL OFL 1.1 |
| Placeholder images | Generated, free to use |
Your purchase includes a license to use Meridian according to the license terms on pyxios.com. Redistribution or resale of the template itself, in original or modified form, is not permitted.
Changelog & support
1.0.0 — November 12, 2026
Initial release.
Need help or custom work? Contact us via pyxios.com. Please include your order number.