Documentation
Everything you need to build with Vantage.
Getting started
Vantage ships as plain, static HTML. Every page in the root of the download opens directly in a browser — no server, no build step, no package install. If that is all you need, copy the folder into your project and start editing.
The build tooling is included for people who want it. It compiles the stylesheet from Sass and generates the HTML pages from shared partials, so you are not maintaining the sidebar in twenty files.
Install dependencies
npm install
Requires Node 18 or newer. Installs Bootstrap and Sass only.
Build the stylesheet and pages
npm run build
Compiles assets/scss/app.scss and regenerates every page.
Work with live rebuilds
npm run dev
Watches Sass and serves the template at http://localhost:4321.
File structure
vantage/
├── index.html Compiled pages — these are what you ship
├── orders.html
├── …
├── assets/
│ ├── css/app.css Compiled stylesheet (do not edit by hand)
│ ├── fonts/ Inter variable font + its SIL OFL license
│ ├── img/ Favicon and any imagery you add
│ ├── js/
│ │ ├── app.js Template behavior — yours to edit
│ │ └── bootstrap.bundle.min.js
│ └── scss/
│ ├── app.scss Entry point: tokens → Bootstrap → components
│ ├── _shell.scss Sidebar, topbar, page frame
│ ├── _auth.scss Sign-in, sign-up, error screens
│ ├── _mailbox.scss Inbox
│ ├── _calendar.scss Month view
│ └── _kit.scss UI Kit page only — safe to delete
└── src/ Page sources (only needed if you use the builder)
├── layouts/ app · auth · blank
├── partials/ sidebar · topbar · icons
└── pages/ One file per page, with JSON front matter
Editing pages directly is fine
If you would rather not use the builder, edit the compiled
.html files and delete src/. Nothing else depends on it.
Build process
A page source looks like this — JSON front matter, then the body:
---
{ "title": "Orders", "layout": "app", "active": "orders" }
---
<h1 class="app-page__title">Orders</h1>
| Key | Purpose |
|---|---|
title | Page title, used in <title> and nothing else. |
layout | app, auth or blank. |
active | Matches a data-nav value in the sidebar to highlight it. |
bodyClass | Extra classes for <body>. |
Three placeholders are available inside layouts and pages:
{{> partialName }}— inline a file fromsrc/partials/.{{ key }}— substitute a front-matter value, HTML-escaped.{{{ key }}}— substitute without escaping.
Navigation highlighting is applied after rendering: the builder adds
is-active to whichever element carries a data-nav
matching the page's active. Partials stay free of conditionals.
Design tokens
Color, type, spacing, radii, shadows and motion all live in one file:
packages/tokens/tokens.json. Running npm run tokens
compiles it into Bootstrap Sass variables and CSS custom properties.
This is the part worth understanding, because it is what keeps the HTML and
WordPress editions of Vantage identical rather than merely similar — the
same token file generates the Bootstrap variables here and the
theme.json palette there.
/* Every token is also a CSS custom property at runtime */
.my-component {
color: var(--spm-neutral-700);
background: var(--spm-neutral-0);
padding: var(--spm-space-5);
border-radius: var(--spm-radius-lg);
box-shadow: var(--spm-shadow-md);
transition: all var(--spm-motion-base) var(--spm-motion-ease);
}
To change the palette, edit the JSON and rebuild. Nothing else needs touching.
Theming & skins
Dark mode uses Bootstrap 5.3's native color modes:
<html data-bs-theme="dark">
The <head> of every page carries a small inline script that sets this
before first paint, reading a saved preference from localStorage and
falling back to the operating system setting. That is what prevents the white
flash you get with a deferred theme script. Keep it inline and keep it first.
Skins are accent presets, set on the same element:
<html data-spm-skin="ocean">
Six ship with the template: indigo, ocean,
forest, ember, rose and slate.
Add your own in the skins block of tokens.json.
Skins recolor the whole interface
Accents derive from --bs-primary-rgb, so navigation, avatars,
badges, selection states and charts all follow the skin — not only buttons.
Charts
Vantage includes a small SVG chart renderer with no dependencies — no Chart.js, no ApexCharts, nothing to license or keep updated. Charts are declared in markup and read their data from attributes.
<div class="chart-frame"
data-chart="area"
data-height="280"
data-alt="Revenue by month, rising from 18,400 dollars in January to 42,700 dollars in December"
data-series="[18400, 21200, 19800, 24600]"
data-labels='["Jan","Feb","Mar","Apr"]'></div>
| Attribute | Purpose |
|---|---|
data-chart | area, bars or donut. |
data-series | Array of numbers, or of {label, value} for donuts. |
data-labels | Axis labels. Not used by donuts. |
data-height | Height in pixels. Optional. |
data-alt | Describes the chart for screen readers. Always write one. |
Charts measure their container and redraw on resize and on theme change, so
they stay proportional in narrow columns instead of being squashed by a fixed
viewBox. If you prefer a full charting library, delete the
renderer from app.js and drop yours in — the markup is just a div.
Icons
The icon set is original, drawn on a 24×24 grid, and inlined as an SVG sprite
in src/partials/icons.html. There is no icon font and no external
request, so the template works offline and from file://.
<svg class="icon" aria-hidden="true">
<use href="#i-search"></use>
</svg>
Icons inherit currentColor and their size from the
.icon class, so they match the text beside them automatically.
The UI Kit lists every icon and copies the
snippet when you click one.
Accessibility
What is built in, so you do not undo it by accident:
- Every page opens with a skip link to the main region.
- Focus is never removed —
:focus-visibledraws a visible ring for keyboard users. - Status is never carried by color alone; badges have dots, trends have arrows and words.
- Tables use real
<th scope>headers and a visually hidden<caption>. - Icon-only buttons carry an
aria-label. - Charts expose
role="img"with a written description. prefers-reduced-motiondisables every animation in the template.- Body text meets WCAG AA contrast in both light and dark modes.
When you add content
Keep the aria-label on icon-only buttons and write a
data-alt for every chart. Those are the two that get dropped most often.
Support
Support covers template bugs, build problems and questions about how something in Vantage works. It does not cover customisation of your own application code, third-party plugins, or hosting.
Include your browser and version, the page you are on, and a screenshot or short description of what you expected. That usually turns a two-day thread into a one-reply answer.
Social Points Media — see the item page for current support contact details.