ui/docs/index.html

308 lines
16 KiB
HTML
Raw Permalink Normal View History

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>lvl0/ui — style reference</title>
<meta name="theme-color" content="#000000">
<link rel="stylesheet" href="./styles.css">
</head>
<body class="bg-black antialiased min-h-screen font-mono text-primary p-6 lg:p-10">
<main class="mx-auto w-full max-w-4xl">
<header class="mb-14">
<h1 class="text-primary text-4xl lg:text-5xl font-bold uppercase tracking-widest glow-red-text mb-4">
&gt; lvl0/ui
</h1>
<p class="text-primary/60 text-sm max-w-2xl leading-relaxed">
The shared visual style for lvl0 projects. This page is built with the package it
documents, so it breaks visibly if the package does. Read the values here rather
than from another project.
</p>
<p class="text-primary/40 text-xs mt-4">
<a href="https://forge.lvl0.xyz/lvl0/ui" class="hover:text-primary transition-colors">[SOURCE]</a>
<span class="text-bordeaux px-2">|</span>
<code>npm i git+ssh://git@forge.lvl0.xyz:2222/lvl0/ui.git#v0.1.0</code>
</p>
</header>
<hr class="border-0 border-t-2 border-bordeaux glow-bordeaux-line mb-10">
<!-- PALETTE -->
<section class="mb-16">
<h2 class="text-primary text-xs uppercase tracking-wider mb-1">&gt; Palette</h2>
<p class="text-primary/50 text-xs mb-6">Click a value to copy. Use token names, never raw <code>red-*</code> steps.</p>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<!-- swatch: primary -->
<div class="border-2 border-bordeaux glow-bordeaux">
<div class="h-20" style="background: var(--color-primary)"></div>
<div class="p-3 text-xs">
<div class="text-primary font-bold">--color-primary</div>
<button class="copy text-primary/50 hover:text-primary transition-colors mt-1" data-v="oklch(63.7% 0.237 25.331)">oklch(63.7% 0.237 25.331)</button>
<p class="text-primary/40 mt-2 leading-snug">House red. Text, active borders, focus, glow source.</p>
</div>
</div>
<div class="border-2 border-bordeaux glow-bordeaux">
<div class="h-20" style="background: var(--color-bordeaux)"></div>
<div class="p-3 text-xs">
<div class="text-primary font-bold">--color-bordeaux</div>
<button class="copy text-primary/50 hover:text-primary transition-colors mt-1" data-v="oklch(25.8% 0.092 26.042)">oklch(25.8% 0.092 26.042)</button>
<p class="text-primary/40 mt-2 leading-snug">Secondary. Dividers, resting borders, recessed chrome.</p>
</div>
</div>
<div class="border-2 border-bordeaux glow-bordeaux">
<div class="h-20 border-b-2 border-bordeaux" style="background: var(--color-background)"></div>
<div class="p-3 text-xs">
<div class="text-primary font-bold">--color-background</div>
<button class="copy text-primary/50 hover:text-primary transition-colors mt-1" data-v="oklch(10% 0 0)">oklch(10% 0 0)</button>
<p class="text-primary/40 mt-2 leading-snug">Near-black page ground.</p>
</div>
</div>
<div class="border-2 border-bordeaux glow-bordeaux">
<div class="h-20 border-b-2 border-bordeaux" style="background: var(--color-card)"></div>
<div class="p-3 text-xs">
<div class="text-primary font-bold">--color-card</div>
<button class="copy text-primary/50 hover:text-primary transition-colors mt-1" data-v="oklch(12% 0 0)">oklch(12% 0 0)</button>
<p class="text-primary/40 mt-2 leading-snug">Raised surface.</p>
</div>
</div>
<div class="border-2 border-bordeaux glow-bordeaux">
<div class="h-20" style="background: var(--color-muted)"></div>
<div class="p-3 text-xs">
<div class="text-primary font-bold">--color-muted</div>
<button class="copy text-primary/50 hover:text-primary transition-colors mt-1" data-v="oklch(20% 0 0)">oklch(20% 0 0)</button>
<p class="text-primary/40 mt-2 leading-snug">Muted surface.</p>
</div>
</div>
<div class="border-2 border-bordeaux glow-bordeaux">
<div class="h-20" style="background: var(--color-muted-foreground)"></div>
<div class="p-3 text-xs">
<div class="text-primary font-bold">--color-muted-foreground</div>
<button class="copy text-primary/50 hover:text-primary transition-colors mt-1" data-v="oklch(50% 0.1 25)">oklch(50% 0.1 25)</button>
<p class="text-primary/40 mt-2 leading-snug">Muted text.</p>
</div>
</div>
<div class="border-2 border-bordeaux glow-bordeaux">
<div class="h-20" style="background: var(--color-destructive)"></div>
<div class="p-3 text-xs">
<div class="text-primary font-bold">--color-destructive</div>
<button class="copy text-primary/50 hover:text-primary transition-colors mt-1" data-v="oklch(57.7% 0.245 27.325)">oklch(57.7% 0.245 27.325)</button>
<p class="text-primary/40 mt-2 leading-snug">Destructive actions.</p>
</div>
</div>
</div>
<h3 class="text-primary/60 text-xs uppercase tracking-wider mt-8 mb-3">Chart colours</h3>
<div class="grid grid-cols-5 gap-2">
<div class="border-2 border-bordeaux"><div class="h-12" style="background: var(--color-chart-1)"></div><div class="p-2 text-[10px] text-primary/50">chart-1</div></div>
<div class="border-2 border-bordeaux"><div class="h-12" style="background: var(--color-chart-2)"></div><div class="p-2 text-[10px] text-primary/50">chart-2</div></div>
<div class="border-2 border-bordeaux"><div class="h-12" style="background: var(--color-chart-3)"></div><div class="p-2 text-[10px] text-primary/50">chart-3</div></div>
<div class="border-2 border-bordeaux"><div class="h-12" style="background: var(--color-chart-4)"></div><div class="p-2 text-[10px] text-primary/50">chart-4</div></div>
<div class="border-2 border-bordeaux"><div class="h-12" style="background: var(--color-chart-5)"></div><div class="p-2 text-[10px] text-primary/50">chart-5</div></div>
</div>
<p class="text-primary/40 text-xs mt-4">
<code class="text-primary/60">--radius: 0</code> — square corners throughout.
</p>
</section>
<hr class="border-0 border-t-2 border-bordeaux glow-bordeaux-line mb-10">
<!-- GLOWS -->
<section class="mb-16">
<h2 class="text-primary text-xs uppercase tracking-wider mb-1">&gt; Glows</h2>
<p class="text-primary/50 text-xs mb-6">
The part a values table cannot convey. All four against the real background.
</p>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-8">
<div>
<div class="border-2 border-primary glow-red p-6 mb-3 text-center text-sm">.glow-red</div>
<p class="text-primary/40 text-xs leading-snug">
Box-shadow bloom in primary, brightening on <code>:hover</code> and
<code>:focus</code>. For bordered elements that are active or focusable.
</p>
</div>
<div>
<div class="p-6 mb-3 text-center">
<span class="text-primary text-2xl font-bold uppercase tracking-widest glow-red-text">.glow-red-text</span>
</div>
<p class="text-primary/40 text-xs leading-snug">
Two-layer text-shadow. <strong class="text-primary/70">Use this on text</strong>
<code>.glow-red</code> haloes the element's box, which smudges around a
borderless heading instead of tracing the letters.
</p>
</div>
<div>
<div class="border-2 border-bordeaux glow-bordeaux p-6 mb-3 text-center text-sm">.glow-bordeaux</div>
<p class="text-primary/40 text-xs leading-snug">
Softer bloom for bordeaux-bordered elements. <strong class="text-primary/70">Emits
primary-tinted light, not bordeaux</strong> — bordeaux at
<code>oklch(25.8%)</code> is too dark to bloom against a near-black ground,
so a bordeaux halo is invisible. Dim element, brighter glow, as CRT
phosphor behaves.
</p>
</div>
<div>
<div class="p-6 mb-3 flex items-center">
<hr class="w-full border-0 border-t-2 border-bordeaux glow-bordeaux-line">
</div>
<p class="text-primary/40 text-xs leading-snug">
<code>.glow-bordeaux-line</code> — a single wide shadow on a hairline has no
box to hug and just fades out. This uses a tight core plus a wider spill so a
2px rule reads as lit.
</p>
</div>
</div>
</section>
<hr class="border-0 border-t-2 border-bordeaux glow-bordeaux-line mb-10">
<!-- FONT -->
<section class="mb-16">
<h2 class="text-primary text-xs uppercase tracking-wider mb-1">&gt; Font</h2>
<p class="text-primary/50 text-xs mb-6">
<code>.font-digital</code> — 7-Segment by
<a href="http://torinak.com/7segment" class="underline hover:text-primary">Jan Bobrowski</a>,
SIL OFL 1.1. <code>fonts/OFL.txt</code> must ship wherever the font does.
</p>
<div class="border-2 border-bordeaux glow-bordeaux p-6 mb-4">
<div class="font-digital text-primary text-6xl mb-4">0123456789</div>
<div class="font-digital text-primary text-3xl mb-4">0123456789</div>
<div class="font-digital text-primary text-lg">0123456789</div>
</div>
<div class="border-2 border-destructive p-4">
<p class="text-primary/60 text-xs leading-snug">
<strong class="text-primary">Numerals only.</strong> Letters render badly —
the face has no strokes for most of them:
</p>
<div class="font-digital text-primary/50 text-2xl mt-3">ABCDEFGHIJKLM</div>
</div>
</section>
<hr class="border-0 border-t-2 border-bordeaux glow-bordeaux-line mb-10">
<!-- USAGE -->
<section class="mb-16">
<h2 class="text-primary text-xs uppercase tracking-wider mb-6">&gt; Primary or bordeaux?</h2>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-6 text-xs">
<div class="border-2 border-primary glow-red p-5">
<h3 class="text-primary font-bold uppercase tracking-wider mb-3">Primary</h3>
<ul class="text-primary/60 space-y-2 leading-snug">
<li>&gt; All text</li>
<li>&gt; Focused input borders</li>
<li>&gt; Borders of clickable things</li>
<li>&gt; Filled button backgrounds on hover</li>
<li>&gt; The source colour of every glow</li>
</ul>
</div>
<div class="border-2 border-bordeaux glow-bordeaux p-5">
<h3 class="text-primary font-bold uppercase tracking-wider mb-3">Bordeaux</h3>
<ul class="text-primary/60 space-y-2 leading-snug">
<li>&gt; Dividers and rules</li>
<li>&gt; Resting input borders</li>
<li>&gt; Panel outlines</li>
<li>&gt; Row separators</li>
<li>&gt; Scrollbar thumbs</li>
</ul>
</div>
</div>
<p class="text-primary/40 text-xs mt-5 leading-relaxed">
The contrast is full red against bordeaux — never two brightnesses of red. An
element commonly moves from bordeaux to primary on focus, with its glow rising at
the same time, so the state change is signalled twice.
</p>
</section>
<hr class="border-0 border-t-2 border-bordeaux glow-bordeaux-line mb-10">
<!-- WORKED EXAMPLE -->
<section class="mb-16">
<h2 class="text-primary text-xs uppercase tracking-wider mb-1">&gt; Worked example</h2>
<p class="text-primary/50 text-xs mb-6">
The anagram-finder form and results panel — the whole system in one screen.
</p>
<div class="border-2 border-bordeaux p-6">
<label for="demo" class="block text-primary text-xs uppercase tracking-wider mb-2">&gt; Letters</label>
<input
id="demo"
type="text"
value="eamstoxil"
autocomplete="off"
class="w-full bg-black border-bordeaux text-primary focus:border-primary text-3xl tracking-wider uppercase rounded-none border-2 focus:ring-0 focus:outline-none transition-all glow-bordeaux px-4 py-3 mb-4"
>
<div class="flex gap-3 mb-8">
<button class="w-2/3 bg-black hover:bg-primary text-primary hover:text-black text-sm font-bold border-primary rounded-none border-2 uppercase tracking-wider transition-all glow-bordeaux cursor-pointer px-4 py-2">
[FIND WORDS]
</button>
<a href="#" class="w-1/3 inline-flex items-center justify-center bg-black hover:bg-bordeaux text-primary/60 hover:text-primary text-sm font-bold border-bordeaux hover:border-primary rounded-none border-2 glow-bordeaux uppercase tracking-wider transition-all px-4 py-2">
[CLEAR]
</a>
</div>
<hr class="border-0 border-t-2 border-bordeaux glow-bordeaux-line mb-8">
<section class="border-bordeaux rounded-none border-2 glow-bordeaux">
<h3 class="text-primary text-xs uppercase tracking-wider border-bordeaux border-b-2 glow-bordeaux-line px-4 py-2">
&gt; 3 matches
</h3>
<ul class="divide-bordeaux divide-y text-[1.3125rem] max-h-48 overflow-y-auto scrollbar-red">
<li class="flex items-baseline justify-between px-4 py-1.5 text-primary hover:bg-bordeaux">
<span>steam</span><span class="font-digital text-primary text-2xl">5</span>
</li>
<li class="flex items-baseline justify-between px-4 py-1.5 text-primary hover:bg-bordeaux">
<span>mates</span><span class="font-digital text-primary text-2xl">5</span>
</li>
<li class="flex items-baseline justify-between px-4 py-1.5 text-primary hover:bg-bordeaux">
<span>exalt</span><span class="font-digital text-primary text-2xl">5</span>
</li>
</ul>
</section>
</div>
</section>
<footer class="border-t border-bordeaux pt-4 flex flex-wrap items-center justify-between gap-2 text-xs uppercase tracking-wider text-primary/40">
<span>
@lvl0/ui 0.1.0
<span class="text-bordeaux px-1">|</span>
a <a href="https://lvl0.xyz" class="hover:text-primary transition-colors">lvl0</a> project
</span>
<a href="https://forge.lvl0.xyz/lvl0/ui" rel="license" class="hover:text-primary transition-colors">[SOURCE]</a>
</footer>
</main>
<script>
document.querySelectorAll('.copy').forEach((b) => {
b.addEventListener('click', async () => {
try {
await navigator.clipboard.writeText(b.dataset.v);
const original = b.textContent;
b.textContent = 'copied';
setTimeout(() => { b.textContent = original; }, 1000);
} catch (e) {
/* clipboard unavailable over plain http — leave the value visible */
}
});
});
</script>
</body>
</html>