Ryan Perez · Embed the library

Two tags, and a page speaks LAKA.

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.

Step 1 · Install

Add the two tags

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">
Tokens only

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">

Scoping

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.

Step 2 · CSS

Tokens and components

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.

Colour tokens

PropertyValueUse
--rp-canvas#07090DPage background
--rp-surface#0B0E14Cards, inputs
--rp-raised#1A1D24Elevated surfaces
--rp-heading#F5F7FAHeadings, labels
--rp-body#C5C7CEBody text (11.8:1 on canvas)
--rp-accent#3F6EE9CTAs, highlights — not body-size text
--rp-success / --rp-warning / --rp-dangerStatus

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.

Component classes

ClassWhat it is
.laka-btn --primary / --outline / --ghostPill buttons; 44px targets, real focus rings
.laka-card .laka-panelSurface + bordered info panels (--warn, --ok)
.laka-field .laka-label .laka-input .laka-textarea .laka-selectForm kit; aria-invalid styles the error state
.laka-banner --info/--success/--warning/--dangerDismissable banners
.laka-chip .laka-chip--hotTag pills
.laka-display .laka-h3 .laka-h4 .laka-eyebrow .laka-lede .laka-microThe type scale
.laka-header + __seal __name __left __rightThe four-element header contract
.laka-section .laka-rail .laka-grid .laka-hairline .laka-visually-hiddenLayout + a11y utilities
Live demo — rendered by the embedded laka.css
chip hot chip
Card
A surface card

Surface background, hairline border, 16px radius, spaced with the scale.

Hint text at the muted floor.
Step 3 · JS

What laka.js adds

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.

Declarative behaviours

<!-- 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>

The LAKA global

// 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: [] })
Live demo — driven by the embedded laka.js
This banner is dismissable — the button is wired by data-laka-dismiss.
Contrast, computed in this browser by LAKA.contrast: …
Framework notes

Astro, Next.js, WordPress

<!-- 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]);
});
SPA / dynamic content

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.

Rules that travel with the files

Embedding doesn't waive the system

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>