The design system ships as a hosted stylesheet and script. Link them from any site — static HTML, Astro, Next.js, WordPress — and you get the tokens, the components, the motion system and a client for the design-system API. Every demo on this page is rendered by the exact files you embed.
Put the stylesheet in <head> and the script anywhere with defer. The script is dependency-free (~12 KB), idempotent under double-inclusion, and initialises itself on DOMContentLoaded.
<!-- in <head> --> <link rel="stylesheet" href="https://designsystem.bowtiekreative.com/dist/laka.css"> <script src="https://designsystem.bowtiekreative.com/dist/laka.js" defer></script> <!-- Inter is the system typeface; load it if the page doesn't already --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap">
Just want the custom properties, generated fresh from the source of truth? Link the API's CSS endpoint instead: <link rel="stylesheet" href="https://api.designsystem.bowtiekreative.com/v1/tokens.css">
Everything is namespaced — --rp-* properties, .laka-* classes, data-laka-* attributes, one window.LAKA global — so the files are safe to drop into an existing page. Add class="laka-scope" to a container to opt its contents into the base canvas, type and focus styles.
laka.css carries the full token set as custom properties plus the core component classes. Build with the variables, not raw values — the contrast rules are baked into the palette.
| Property | Value | Use |
|---|---|---|
--rp-canvas | #07090D | Page background |
--rp-surface | #0B0E14 | Cards, inputs |
--rp-raised | #1A1D24 | Elevated surfaces |
--rp-heading | #F5F7FA | Headings, labels |
--rp-body | #C5C7CE | Body text (11.8:1 on canvas) |
--rp-accent | #3F6EE9 | CTAs, highlights — not body-size text |
--rp-success / --rp-warning / --rp-danger | Status |
Plus --space-1…10 (4→80px), --radius-control/card/panel/media/pill, --ease-out, --target-preferred: 44px and the focus-ring pair. Full set: GET /v1/tokens.
| Class | What it is |
|---|---|
.laka-btn --primary / --outline / --ghost | Pill buttons; 44px targets, real focus rings |
.laka-card .laka-panel | Surface + bordered info panels (--warn, --ok) |
.laka-field .laka-label .laka-input .laka-textarea .laka-select | Form kit; aria-invalid styles the error state |
.laka-banner --info/--success/--warning/--danger | Dismissable banners |
.laka-chip .laka-chip--hot | Tag pills |
.laka-display .laka-h3 .laka-h4 .laka-eyebrow .laka-lede .laka-micro | The type scale |
.laka-header + __seal __name __left __right | The four-element header contract |
.laka-section .laka-rail .laka-grid .laka-hairline .laka-visually-hidden | Layout + a11y utilities |
Surface background, hairline border, 16px radius, spaced with the scale.
Behaviour, not decoration: declarative attributes for the interactive patterns, the motion system, offline WCAG math, and the API client. No framework required; call LAKA.bind(container) after injecting DOM dynamically.
<!-- MENU toggle: manages aria-expanded, hidden, Escape --> <button class="laka-btn laka-btn--outline" data-laka-menu="#site-menu">Menu</button> <nav id="site-menu">…</nav> <!-- dismissable banner --> <div class="laka-banner laka-banner--info"> Saved. <button data-laka-dismiss>×</button> </div> <!-- accessible tabs with arrow-key support --> <div data-laka-tabs> <button data-laka-tab="#panel-a">First</button> <button data-laka-tab="#panel-b">Second</button> </div> <!-- scroll reveal: 24px rise, 600ms, 90ms sibling stagger, automatically disabled under prefers-reduced-motion --> <section data-laka-reveal>…</section>
// tokens, frozen LAKA.tokens.color.accent // "#3F6EE9" LAKA.tokens.space // [4, 8, 12, …, 80] // WCAG 2.2 contrast, offline, token-aware LAKA.contrast('accent', 'canvas', { fontSizePx: 16 }) // → { ratio: 4.38, verdict: { passes: false, … } } // re-bind after injecting DOM LAKA.bind(document.getElementById('new-content')) // design-system API client (see API Reference) await LAKA.api.rules({ systems: 'forms', severity: 'block' }) await LAKA.api.validate({ gate: 'accessibility', passed: [] })
…
<!-- Astro: src/layouts/Layout.astro --> <head> <link rel="stylesheet" href="https://designsystem.bowtiekreative.com/dist/laka.css"> <script is:inline defer src="https://designsystem.bowtiekreative.com/dist/laka.js"></script> </head> // Next.js (app router): app/layout.tsx import Script from 'next/script'; // in <head>: the <link>; before </body>: <Script src="…/dist/laka.js" strategy="afterInteractive" />
// WordPress: functions.php add_action('wp_enqueue_scripts', function () { wp_enqueue_style('laka', 'https://designsystem.bowtiekreative.com/dist/laka.css', [], '1.0.0'); wp_enqueue_script('laka', 'https://designsystem.bowtiekreative.com/dist/laka.js', [], '1.0.0', ['strategy' => 'defer', 'in_footer' => true]); });
After client-side navigation or DOM injection (React, Vue, htmx), call LAKA.bind(newContainer) so menus, tabs, banners and reveals attach to the new nodes. Binding is idempotent — already-wired elements are skipped.
The header keeps exactly four elements (seal, uppercase site name, MENU pill, one CTA pill — the contract). The seal is always the canonical logo — brand/btk-seal-white.png on dark, brand/btk-seal.png on light, shield crop below 24px — never a custom symbol, letterform or initial (rule brand.seal-asset; asset URLs ship in the nav-contract response). Accent is never body-size text — LAKA.contrast will tell you. Every site carries the “Powered by Bow Tie Kreative” footer backlink. Before shipping, run the page through POST /v1/audit/markup or the full POST /v1/audit/site gate.
<!-- the four-element header with the canonical seal --> <header class="laka-header"> <div class="laka-header__left"> <img class="laka-header__seal" alt="Bow Tie Kreative" src="https://designsystem.bowtiekreative.com/brand/btk-seal-white.png"> <a class="laka-header__name" href="/">SITE <span>NAME</span></a> </div> <div class="laka-header__right"> <button class="laka-btn laka-btn--outline" data-laka-menu="#menu">Menu</button> <a class="laka-btn laka-btn--primary" href="/contact">Get started</a> </div> </header>