@1agh/maude 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/cli/bin/maude.exe +15 -0
- package/cli/bin/maude.mjs +45 -0
- package/cli/bin/mdcc.exe +10 -0
- package/cli/bin/mdcc.mjs +7 -0
- package/cli/cli-wrapper.cjs +67 -0
- package/cli/commands/config.mjs +94 -0
- package/cli/commands/design.mjs +386 -0
- package/cli/commands/help.mjs +57 -0
- package/cli/commands/init.mjs +178 -0
- package/cli/commands/version.mjs +7 -0
- package/cli/install.cjs +113 -0
- package/cli/lib/argv.mjs +37 -0
- package/cli/lib/argv.test.mjs +46 -0
- package/cli/lib/copy-tree.mjs +78 -0
- package/package.json +94 -0
- package/plugins/design/dev-server/annotations-context-toolbar.tsx +397 -0
- package/plugins/design/dev-server/annotations-layer.tsx +1717 -0
- package/plugins/design/dev-server/api.ts +674 -0
- package/plugins/design/dev-server/bin/_screenshot-playwright.mjs +50 -0
- package/plugins/design/dev-server/bin/bootstrap-check.sh +83 -0
- package/plugins/design/dev-server/bin/canvas-edit.sh +48 -0
- package/plugins/design/dev-server/bin/handoff.sh +27 -0
- package/plugins/design/dev-server/bin/screenshot.sh +232 -0
- package/plugins/design/dev-server/bin/server-up.sh +135 -0
- package/plugins/design/dev-server/bin/slug.sh +22 -0
- package/plugins/design/dev-server/bin/smoke.sh +272 -0
- package/plugins/design/dev-server/build.ts +267 -0
- package/plugins/design/dev-server/canvas-build.ts +219 -0
- package/plugins/design/dev-server/canvas-edit.ts +388 -0
- package/plugins/design/dev-server/canvas-header.ts +165 -0
- package/plugins/design/dev-server/canvas-icons.tsx +131 -0
- package/plugins/design/dev-server/canvas-lib-inline.ts +260 -0
- package/plugins/design/dev-server/canvas-lib-resolver.ts +85 -0
- package/plugins/design/dev-server/canvas-lib.tsx +1995 -0
- package/plugins/design/dev-server/canvas-meta.schema.json +181 -0
- package/plugins/design/dev-server/canvas-pipeline.ts +270 -0
- package/plugins/design/dev-server/canvas-shell.tsx +813 -0
- package/plugins/design/dev-server/client/app.jsx +2027 -0
- package/plugins/design/dev-server/client/hmr.mjs +85 -0
- package/plugins/design/dev-server/client/iframe-lazy.mjs +121 -0
- package/plugins/design/dev-server/client/index.html +15 -0
- package/plugins/design/dev-server/client/styles/0-reset.css +18 -0
- package/plugins/design/dev-server/client/styles/1-tokens.css +297 -0
- package/plugins/design/dev-server/client/styles/2-layout.css +35 -0
- package/plugins/design/dev-server/client/styles/3-shell.css +906 -0
- package/plugins/design/dev-server/client/styles/4-components.css +1268 -0
- package/plugins/design/dev-server/client/styles/5-utilities.css +4 -0
- package/plugins/design/dev-server/client/styles/_index.css +24 -0
- package/plugins/design/dev-server/client/styles.css +1419 -0
- package/plugins/design/dev-server/config.schema.json +147 -0
- package/plugins/design/dev-server/context-menu.tsx +343 -0
- package/plugins/design/dev-server/context.ts +173 -0
- package/plugins/design/dev-server/dist/client.bundle.js +20323 -0
- package/plugins/design/dev-server/dist/styles.css +2875 -0
- package/plugins/design/dev-server/examples/README.md +9 -0
- package/plugins/design/dev-server/examples/perf-100-artboards.tsx +113 -0
- package/plugins/design/dev-server/fs-watch.ts +63 -0
- package/plugins/design/dev-server/handoff.ts +721 -0
- package/plugins/design/dev-server/history.ts +125 -0
- package/plugins/design/dev-server/hmr-broadcast.ts +114 -0
- package/plugins/design/dev-server/http.ts +413 -0
- package/plugins/design/dev-server/input-router.tsx +485 -0
- package/plugins/design/dev-server/inspect.ts +365 -0
- package/plugins/design/dev-server/locator.ts +159 -0
- package/plugins/design/dev-server/mem.ts +97 -0
- package/plugins/design/dev-server/runtime-bundle.ts +235 -0
- package/plugins/design/dev-server/server.mjs +1246 -0
- package/plugins/design/dev-server/server.ts +131 -0
- package/plugins/design/dev-server/test/_helpers.ts +81 -0
- package/plugins/design/dev-server/test/active-state.test.ts +145 -0
- package/plugins/design/dev-server/test/annotations-api.test.ts +146 -0
- package/plugins/design/dev-server/test/annotations-layer.test.ts +419 -0
- package/plugins/design/dev-server/test/binary-smoke.test.ts +47 -0
- package/plugins/design/dev-server/test/bundle-smoke.test.ts +29 -0
- package/plugins/design/dev-server/test/canvas-build.test.ts +78 -0
- package/plugins/design/dev-server/test/canvas-edit.test.ts +139 -0
- package/plugins/design/dev-server/test/canvas-header.test.ts +127 -0
- package/plugins/design/dev-server/test/canvas-lib-inline.test.ts +146 -0
- package/plugins/design/dev-server/test/canvas-lib-resolver.test.ts +112 -0
- package/plugins/design/dev-server/test/canvas-meta-api.test.ts +236 -0
- package/plugins/design/dev-server/test/canvas-pipeline.test.ts +180 -0
- package/plugins/design/dev-server/test/canvas-route.test.ts +176 -0
- package/plugins/design/dev-server/test/fs-watch.test.ts +41 -0
- package/plugins/design/dev-server/test/handoff-static-frames.test.ts +215 -0
- package/plugins/design/dev-server/test/handoff.test.ts +281 -0
- package/plugins/design/dev-server/test/history-rollback.test.ts +62 -0
- package/plugins/design/dev-server/test/hmr-broadcast.test.ts +108 -0
- package/plugins/design/dev-server/test/input-router.test.ts +316 -0
- package/plugins/design/dev-server/test/locator.test.ts +214 -0
- package/plugins/design/dev-server/test/perf-harness.ts +193 -0
- package/plugins/design/dev-server/test/phase-3.6-smoke.test.ts +77 -0
- package/plugins/design/dev-server/test/runtime-bundle.test.ts +69 -0
- package/plugins/design/dev-server/test/server-lifecycle.test.ts +28 -0
- package/plugins/design/dev-server/test/tool-palette.test.tsx +55 -0
- package/plugins/design/dev-server/test/use-annotation-selection.test.tsx +77 -0
- package/plugins/design/dev-server/test/use-artboard-drag.test.ts +325 -0
- package/plugins/design/dev-server/test/use-selection-set.test.tsx +166 -0
- package/plugins/design/dev-server/test/use-snap-guides.test.ts +190 -0
- package/plugins/design/dev-server/test/use-tool-mode.test.tsx +93 -0
- package/plugins/design/dev-server/test/ws-handshake.test.ts +33 -0
- package/plugins/design/dev-server/tool-palette.tsx +278 -0
- package/plugins/design/dev-server/tsconfig.json +26 -0
- package/plugins/design/dev-server/use-annotation-selection.tsx +92 -0
- package/plugins/design/dev-server/use-annotations-visibility.tsx +43 -0
- package/plugins/design/dev-server/use-artboard-drag.tsx +445 -0
- package/plugins/design/dev-server/use-selection-set.tsx +224 -0
- package/plugins/design/dev-server/use-snap-guides.tsx +215 -0
- package/plugins/design/dev-server/use-tool-mode.tsx +114 -0
- package/plugins/design/dev-server/ws.ts +90 -0
- package/plugins/design/templates/_shell.html +177 -0
- package/plugins/design/templates/canvas.tsx.template +54 -0
- package/plugins/design/templates/design-system-inspiration/_MAPPING.md +277 -0
- package/plugins/design/templates/design-system-inspiration/_README.md +71 -0
- package/plugins/design/templates/design-system-inspiration/audience-consumer/components-banner.html +68 -0
- package/plugins/design/templates/design-system-inspiration/audience-consumer/components-empty-state-generous.html +39 -0
- package/plugins/design/templates/design-system-inspiration/audience-consumer/components-feature-grid.html +62 -0
- package/plugins/design/templates/design-system-inspiration/audience-consumer/components-marketing-card.html +63 -0
- package/plugins/design/templates/design-system-inspiration/audience-consumer/components-testimonial.html +80 -0
- package/plugins/design/templates/design-system-inspiration/audience-developer/components-code-block.html +71 -0
- package/plugins/design/templates/design-system-inspiration/audience-developer/components-diff-view.html +65 -0
- package/plugins/design/templates/design-system-inspiration/audience-developer/components-log-stream.html +62 -0
- package/plugins/design/templates/design-system-inspiration/audience-developer/components-monospace-table.html +57 -0
- package/plugins/design/templates/design-system-inspiration/audience-developer/components-terminal-pane.html +67 -0
- package/plugins/design/templates/design-system-inspiration/audience-developer/type-mono.html +57 -0
- package/plugins/design/templates/design-system-inspiration/audience-pro/colors-presence.html +74 -0
- package/plugins/design/templates/design-system-inspiration/audience-pro/components-command-palette.html +90 -0
- package/plugins/design/templates/design-system-inspiration/audience-pro/components-keyboard.html +51 -0
- package/plugins/design/templates/design-system-inspiration/audience-pro/components-list.html +89 -0
- package/plugins/design/templates/design-system-inspiration/audience-pro/components-shortcuts-overlay.html +85 -0
- package/plugins/design/templates/design-system-inspiration/audience-pro/components-toast-menu.html +80 -0
- package/plugins/design/templates/design-system-inspiration/core/INDEX.md.tpl +25 -0
- package/plugins/design/templates/design-system-inspiration/core/README.orchestration.md.tpl +71 -0
- package/plugins/design/templates/design-system-inspiration/core/README.philosophy.md.tpl +77 -0
- package/plugins/design/templates/design-system-inspiration/core/SKILL.md.tpl +50 -0
- package/plugins/design/templates/design-system-inspiration/core/colors_and_type.css.tpl +111 -0
- package/plugins/design/templates/design-system-inspiration/core/config.json.tpl +28 -0
- package/plugins/design/templates/design-system-inspiration/core/preview/_layout.css +113 -0
- package/plugins/design/templates/design-system-inspiration/core/preview/colors-accent.html +48 -0
- package/plugins/design/templates/design-system-inspiration/core/preview/colors-surfaces.html +49 -0
- package/plugins/design/templates/design-system-inspiration/core/preview/colors-text.html +52 -0
- package/plugins/design/templates/design-system-inspiration/core/preview/components-buttons.html +83 -0
- package/plugins/design/templates/design-system-inspiration/core/preview/components-cards.html +79 -0
- package/plugins/design/templates/design-system-inspiration/core/preview/components-inputs.html +82 -0
- package/plugins/design/templates/design-system-inspiration/core/preview/motion.html +66 -0
- package/plugins/design/templates/design-system-inspiration/core/preview/spacing-scale.html +53 -0
- package/plugins/design/templates/design-system-inspiration/core/preview/type-scale.html +62 -0
- package/plugins/design/templates/design-system-inspiration/foundations/borders.html +39 -0
- package/plugins/design/templates/design-system-inspiration/foundations/elevation.html +46 -0
- package/plugins/design/templates/design-system-inspiration/foundations/focus.html +48 -0
- package/plugins/design/templates/design-system-inspiration/foundations/grid.html +51 -0
- package/plugins/design/templates/design-system-inspiration/foundations/iconography.html +73 -0
- package/plugins/design/templates/design-system-inspiration/foundations/opacity.html +45 -0
- package/plugins/design/templates/design-system-inspiration/foundations/radii.html +40 -0
- package/plugins/design/templates/design-system-inspiration/foundations/selection.html +45 -0
- package/plugins/design/templates/design-system-inspiration/meta/accessibility.html +62 -0
- package/plugins/design/templates/design-system-inspiration/meta/i18n.html +73 -0
- package/plugins/design/templates/design-system-inspiration/meta/presence-multiplayer.html +71 -0
- package/plugins/design/templates/design-system-inspiration/meta/tokens-index.html +80 -0
- package/plugins/design/templates/design-system-inspiration/patterns/patterns-auth.html +78 -0
- package/plugins/design/templates/design-system-inspiration/patterns/patterns-data-density.html +61 -0
- package/plugins/design/templates/design-system-inspiration/patterns/patterns-error-pages.html +70 -0
- package/plugins/design/templates/design-system-inspiration/patterns/patterns-form-layouts.html +70 -0
- package/plugins/design/templates/design-system-inspiration/patterns/patterns-onboarding.html +71 -0
- package/plugins/design/templates/design-system-inspiration/patterns/patterns-pricing.html +83 -0
- package/plugins/design/templates/design-system-inspiration/platform-desktop/components-resize-panels.html +63 -0
- package/plugins/design/templates/design-system-inspiration/platform-desktop/ui_kits-desktop-index.html +55 -0
- package/plugins/design/templates/design-system-inspiration/platform-desktop/ui_kits-desktop-showcase.html +302 -0
- package/plugins/design/templates/design-system-inspiration/platform-mobile/components-bottom-sheet.html +63 -0
- package/plugins/design/templates/design-system-inspiration/platform-mobile/components-pull-to-refresh.html +74 -0
- package/plugins/design/templates/design-system-inspiration/platform-mobile/components-segmented-control.html +51 -0
- package/plugins/design/templates/design-system-inspiration/platform-mobile/components-tab-bar.html +57 -0
- package/plugins/design/templates/design-system-inspiration/platform-mobile/ui_kits-mobile-index.html +58 -0
- package/plugins/design/templates/design-system-inspiration/platform-mobile/ui_kits-mobile-showcase.html +237 -0
- package/plugins/design/templates/design-system-inspiration/status/colors-status.html +49 -0
- package/plugins/design/templates/design-system-inspiration/status/components-status.html +63 -0
- package/plugins/design/templates/design-system-inspiration/status/skeletons.html +74 -0
- package/plugins/design/templates/design-system-inspiration/theme-both/colors-themes-side-by-side.html +59 -0
- package/plugins/design/templates/design-system-inspiration/universal/components-callout.html +74 -0
- package/plugins/design/templates/design-system-inspiration/universal/components-dialogs.html +81 -0
- package/plugins/design/templates/design-system-inspiration/universal/components-tables.html +101 -0
- package/plugins/design/templates/design-system-inspiration/universal/components-toggles.html +74 -0
- package/plugins/design/templates/design-system-inspiration/universal/components-tooltips.html +74 -0
- package/plugins/design/templates/design-system-inspiration/universal/empty-state.html.tpl +34 -0
- package/plugins/design/templates/design-system-inspiration/universal/logo.html +42 -0
- package/plugins/design/templates/ds-specimen.tsx.template +59 -0
- package/plugins/flow/.claude-plugin/config.schema.json +398 -0
- package/plugins/flow/README.md +45 -0
- package/plugins/flow/templates/ai-skeleton/INDEX.md +50 -0
- package/plugins/flow/templates/ai-skeleton/README.md +46 -0
- package/plugins/flow/templates/ai-skeleton/browser/har/.gitkeep +0 -0
- package/plugins/flow/templates/ai-skeleton/browser/snapshots/.gitkeep +0 -0
- package/plugins/flow/templates/ai-skeleton/business/README.md +12 -0
- package/plugins/flow/templates/ai-skeleton/context/README.md +12 -0
- package/plugins/flow/templates/ai-skeleton/decisions/README.md +20 -0
- package/plugins/flow/templates/ai-skeleton/design-import/.gitkeep +0 -0
- package/plugins/flow/templates/ai-skeleton/dev-logs/.gitkeep +0 -0
- package/plugins/flow/templates/ai-skeleton/device/.gitkeep +0 -0
- package/plugins/flow/templates/ai-skeleton/docs/README.md +5 -0
- package/plugins/flow/templates/ai-skeleton/logs/.gitkeep +0 -0
- package/plugins/flow/templates/ai-skeleton/logs/README.md +13 -0
- package/plugins/flow/templates/ai-skeleton/plans/README.md +16 -0
- package/plugins/flow/templates/ai-skeleton/plans/archive/.gitkeep +0 -0
- package/plugins/flow/templates/ai-skeleton/release-guide.md +35 -0
- package/plugins/flow/templates/ai-skeleton/reviews/README.md +15 -0
- package/plugins/flow/templates/ai-skeleton/scenarios/README.md +26 -0
- package/plugins/flow/templates/ai-skeleton/scenarios/_lib/.gitkeep +0 -0
- package/plugins/flow/templates/ai-skeleton/state/STATE.md +25 -0
- package/plugins/flow/templates/ai-skeleton/templates/HANDOFF.md +32 -0
- package/plugins/flow/templates/ai-skeleton/workflows.config.json +74 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: motion
|
|
3
|
+
DEMONSTRATES: --dur-flip, --dur-panel, --dur-route, --dur-soft, --ease-out, --ease-in-out, prefers-reduced-motion guard
|
|
4
|
+
COMPOSITION: 4 motion role cards with live hover/transition demos
|
|
5
|
+
COPY VOICE: role-named ("flip", "panel slide", "route enter", "soft fade")
|
|
6
|
+
WHEN SCAFFOLDED: always (Core)
|
|
7
|
+
NOTES: Each example must use a compositor-only property (transform, opacity) — never layout-dirty (width/top). The reduced-motion guard must short-circuit all to 1ms.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Motion</title>
|
|
14
|
+
<link rel="stylesheet" href="../colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="./_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.motion-card { background: var(--bg-1); padding: 20px; border-radius: var(--radius-md); border: 1px solid var(--border-default); display: flex; flex-direction: column; gap: 12px; }
|
|
18
|
+
.motion-card .demo { height: 80px; background: var(--bg-2); border-radius: var(--radius-sm); display: flex; align-items: center; justify-content: center; position: relative; overflow: hidden; }
|
|
19
|
+
.motion-card:hover .flip-target { transform: translateY(-12px); }
|
|
20
|
+
.motion-card:hover .panel-target { transform: translateX(0); }
|
|
21
|
+
.motion-card:hover .route-target { opacity: 1; transform: scale(1); }
|
|
22
|
+
.motion-card:hover .soft-target { opacity: 1; }
|
|
23
|
+
.flip-target { transition: transform var(--dur-flip) var(--ease-out); background: var(--accent); width: 32px; height: 32px; border-radius: var(--radius-sm); }
|
|
24
|
+
.panel-target { transition: transform var(--dur-panel) var(--ease-in-out); background: var(--accent); width: 64px; height: 32px; border-radius: var(--radius-sm); transform: translateX(-80px); }
|
|
25
|
+
.route-target { transition: opacity var(--dur-route) var(--ease-out), transform var(--dur-route) var(--ease-out); background: var(--accent); width: 64px; height: 32px; border-radius: var(--radius-sm); opacity: 0; transform: scale(0.92); }
|
|
26
|
+
.soft-target { transition: opacity var(--dur-soft) var(--ease-out); background: var(--accent); width: 64px; height: 32px; border-radius: var(--radius-sm); opacity: 0; }
|
|
27
|
+
</style>
|
|
28
|
+
</head>
|
|
29
|
+
<body class="app" data-theme="dark">
|
|
30
|
+
<main class="specimen">
|
|
31
|
+
<h1>Motion</h1>
|
|
32
|
+
<p class="lede">Four durations × two eases — every animation in the system maps to one of these tokens. Hover over each card to play the canonical motion for that role.</p>
|
|
33
|
+
|
|
34
|
+
<div class="grid" style="grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));">
|
|
35
|
+
<div class="motion-card">
|
|
36
|
+
<strong>Flip</strong>
|
|
37
|
+
<div class="demo"><div class="flip-target"></div></div>
|
|
38
|
+
<code style="color: var(--fg-2);">--dur-flip · --ease-out</code>
|
|
39
|
+
<span style="color: var(--fg-1); font-size: var(--type-sm);">Small, snappy. Press-down, hover lift.</span>
|
|
40
|
+
</div>
|
|
41
|
+
<div class="motion-card">
|
|
42
|
+
<strong>Panel slide</strong>
|
|
43
|
+
<div class="demo"><div class="panel-target"></div></div>
|
|
44
|
+
<code style="color: var(--fg-2);">--dur-panel · --ease-in-out</code>
|
|
45
|
+
<span style="color: var(--fg-1); font-size: var(--type-sm);">Drawer / sidebar entry.</span>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="motion-card">
|
|
48
|
+
<strong>Route enter</strong>
|
|
49
|
+
<div class="demo"><div class="route-target"></div></div>
|
|
50
|
+
<code style="color: var(--fg-2);">--dur-route · --ease-out</code>
|
|
51
|
+
<span style="color: var(--fg-1); font-size: var(--type-sm);">Page transition. Opacity + tiny scale.</span>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="motion-card">
|
|
54
|
+
<strong>Soft fade</strong>
|
|
55
|
+
<div class="demo"><div class="soft-target"></div></div>
|
|
56
|
+
<code style="color: var(--fg-2);">--dur-soft · --ease-out</code>
|
|
57
|
+
<span style="color: var(--fg-1); font-size: var(--type-sm);">Toast, tooltip, soft reveal.</span>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<footer class="legend">
|
|
62
|
+
<p><code>@media (prefers-reduced-motion: reduce)</code> short-circuits every duration to 1ms. Never use <code>!important</code> to override — the cascade carries.</p>
|
|
63
|
+
</footer>
|
|
64
|
+
</main>
|
|
65
|
+
</body>
|
|
66
|
+
</html>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: spacing-scale
|
|
3
|
+
DEMONSTRATES: --space-0..8 (4px base)
|
|
4
|
+
COPY VOICE: terse role labels ("inline", "stack", "section gutter")
|
|
5
|
+
COMPOSITION: 9 horizontal bars sized to each space token, plus realistic stack/inline examples
|
|
6
|
+
WHEN SCAFFOLDED: always (Core)
|
|
7
|
+
NOTES: Scale is 4-px base, non-linear at top end (24/32/48/64). Use --space-2/3 for inline gaps, --space-4/5 for stack gaps, --space-6+ for section gutters.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Spacing scale</title>
|
|
14
|
+
<link rel="stylesheet" href="../colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="./_layout.css" />
|
|
16
|
+
</head>
|
|
17
|
+
<body class="app" data-theme="dark">
|
|
18
|
+
<main class="specimen">
|
|
19
|
+
<h1>Spacing</h1>
|
|
20
|
+
<p class="lede">4-pixel base scale, non-linear at the top end to keep section gutters readable on large screens. Use small steps for inline content; large steps for section separations.</p>
|
|
21
|
+
|
|
22
|
+
<h2>Scale</h2>
|
|
23
|
+
<div style="display: grid; gap: 8px; margin: 16px 0;">
|
|
24
|
+
<div style="display: flex; gap: 12px; align-items: center;"><span style="background: var(--accent); height: 8px; width: 0;"></span><code style="color: var(--fg-2); width: 80px;">--space-0</code><span style="color: var(--fg-1);">0px · reset</span></div>
|
|
25
|
+
<div style="display: flex; gap: 12px; align-items: center;"><span style="background: var(--accent); height: 8px; width: 4px;"></span><code style="color: var(--fg-2); width: 80px;">--space-1</code><span style="color: var(--fg-1);">4px · hairline gap</span></div>
|
|
26
|
+
<div style="display: flex; gap: 12px; align-items: center;"><span style="background: var(--accent); height: 8px; width: 8px;"></span><code style="color: var(--fg-2); width: 80px;">--space-2</code><span style="color: var(--fg-1);">8px · inline gap</span></div>
|
|
27
|
+
<div style="display: flex; gap: 12px; align-items: center;"><span style="background: var(--accent); height: 8px; width: 12px;"></span><code style="color: var(--fg-2); width: 80px;">--space-3</code><span style="color: var(--fg-1);">12px · padding default</span></div>
|
|
28
|
+
<div style="display: flex; gap: 12px; align-items: center;"><span style="background: var(--accent); height: 8px; width: 16px;"></span><code style="color: var(--fg-2); width: 80px;">--space-4</code><span style="color: var(--fg-1);">16px · stack gap</span></div>
|
|
29
|
+
<div style="display: flex; gap: 12px; align-items: center;"><span style="background: var(--accent); height: 8px; width: 24px;"></span><code style="color: var(--fg-2); width: 80px;">--space-5</code><span style="color: var(--fg-1);">24px · section gap</span></div>
|
|
30
|
+
<div style="display: flex; gap: 12px; align-items: center;"><span style="background: var(--accent); height: 8px; width: 32px;"></span><code style="color: var(--fg-2); width: 80px;">--space-6</code><span style="color: var(--fg-1);">32px · section gutter</span></div>
|
|
31
|
+
<div style="display: flex; gap: 12px; align-items: center;"><span style="background: var(--accent); height: 8px; width: 48px;"></span><code style="color: var(--fg-2); width: 80px;">--space-7</code><span style="color: var(--fg-1);">48px · page gutter</span></div>
|
|
32
|
+
<div style="display: flex; gap: 12px; align-items: center;"><span style="background: var(--accent); height: 8px; width: 64px;"></span><code style="color: var(--fg-2); width: 80px;">--space-8</code><span style="color: var(--fg-1);">64px · hero spacing</span></div>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<h2>In use — inline</h2>
|
|
36
|
+
<div class="row" style="background: var(--bg-1); padding: var(--space-3); border-radius: var(--radius-md); gap: var(--space-2);">
|
|
37
|
+
<span style="background: var(--accent); color: var(--accent-fg); padding: 2px 8px; border-radius: var(--radius-pill); font-size: var(--type-xs);">live</span>
|
|
38
|
+
<span style="color: var(--fg-0);">Captain · 92'</span>
|
|
39
|
+
<span style="color: var(--fg-2);">hat-trick</span>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<h2>In use — stack</h2>
|
|
43
|
+
<div style="background: var(--bg-1); padding: var(--space-4); border-radius: var(--radius-md); display: grid; gap: var(--space-4);">
|
|
44
|
+
<div><strong>Match summary</strong></div>
|
|
45
|
+
<div style="color: var(--fg-1);">Auto-saved 19:42 · 3 highlights</div>
|
|
46
|
+
<div class="row" style="gap: var(--space-2);">
|
|
47
|
+
<button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 6px 12px; border-radius: var(--radius-sm);">View</button>
|
|
48
|
+
<button style="background: var(--bg-3); color: var(--fg-0); border: 1px solid var(--border-default); padding: 6px 12px; border-radius: var(--radius-sm);">Share</button>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</main>
|
|
52
|
+
</body>
|
|
53
|
+
</html>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: type-scale
|
|
3
|
+
DEMONSTRATES: --type-xs..3xl, --lh-xs..3xl, --font-display, --font-body
|
|
4
|
+
COMPOSITION: 8-step ladder with size + line-height labels + realistic copy at each step
|
|
5
|
+
COPY VOICE: real product strings at each step — no Lorem
|
|
6
|
+
WHEN SCAFFOLDED: always (Core)
|
|
7
|
+
NOTES: Each step should have a distinct semantic role. Don't use 8 levels in one screen; the ladder is for picking the right one per region.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Type — scale</title>
|
|
14
|
+
<link rel="stylesheet" href="../colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="./_layout.css" />
|
|
16
|
+
</head>
|
|
17
|
+
<body class="app" data-theme="dark">
|
|
18
|
+
<main class="specimen">
|
|
19
|
+
<h1>Type scale</h1>
|
|
20
|
+
<p class="lede">Eight steps, modular but irregular — sizes chosen for legible separation, not strict geometric progression. Use display font (<code>--font-display</code>) at <code>--type-xl</code> and above; body font for everything below.</p>
|
|
21
|
+
|
|
22
|
+
<div style="display: grid; gap: 16px; margin: 24px 0;">
|
|
23
|
+
<div>
|
|
24
|
+
<span style="display: block; font-family: var(--font-display); font-size: var(--type-3xl); line-height: var(--lh-3xl); font-weight: 600;">Match Recap</span>
|
|
25
|
+
<code style="color: var(--fg-2);">--type-3xl / --lh-3xl · display</code>
|
|
26
|
+
</div>
|
|
27
|
+
<div>
|
|
28
|
+
<span style="display: block; font-family: var(--font-display); font-size: var(--type-2xl); line-height: var(--lh-2xl); font-weight: 600;">Hat-trick from the captain</span>
|
|
29
|
+
<code style="color: var(--fg-2);">--type-2xl / --lh-2xl · display</code>
|
|
30
|
+
</div>
|
|
31
|
+
<div>
|
|
32
|
+
<span style="display: block; font-family: var(--font-display); font-size: var(--type-xl); line-height: var(--lh-xl); font-weight: 600;">Section heading</span>
|
|
33
|
+
<code style="color: var(--fg-2);">--type-xl / --lh-xl · display</code>
|
|
34
|
+
</div>
|
|
35
|
+
<div>
|
|
36
|
+
<span style="display: block; font-size: var(--type-lg); line-height: var(--lh-lg); font-weight: 500;">Sub-section heading</span>
|
|
37
|
+
<code style="color: var(--fg-2);">--type-lg / --lh-lg · body</code>
|
|
38
|
+
</div>
|
|
39
|
+
<div>
|
|
40
|
+
<span style="display: block; font-size: var(--type-md); line-height: var(--lh-md);">Lead paragraph or callout text that needs slightly more presence than body copy.</span>
|
|
41
|
+
<code style="color: var(--fg-2);">--type-md / --lh-md · body</code>
|
|
42
|
+
</div>
|
|
43
|
+
<div>
|
|
44
|
+
<span style="display: block; font-size: var(--type-base); line-height: var(--lh-base);">Body copy. Default reading size — every block of text in flowing layout starts here.</span>
|
|
45
|
+
<code style="color: var(--fg-2);">--type-base / --lh-base · body</code>
|
|
46
|
+
</div>
|
|
47
|
+
<div>
|
|
48
|
+
<span style="display: block; font-size: var(--type-sm); line-height: var(--lh-sm); color: var(--fg-1);">Secondary text. Captions, meta, dense table rows.</span>
|
|
49
|
+
<code style="color: var(--fg-2);">--type-sm / --lh-sm · body</code>
|
|
50
|
+
</div>
|
|
51
|
+
<div>
|
|
52
|
+
<span style="display: block; font-size: var(--type-xs); line-height: var(--lh-xs); color: var(--fg-2);">Tiny. Pill labels, timestamps, footnotes.</span>
|
|
53
|
+
<code style="color: var(--fg-2);">--type-xs / --lh-xs · body</code>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<footer class="legend">
|
|
58
|
+
<p>Picking from the ladder: don't use more than 3 sizes in one section. Hierarchy comes from contrast (size jump ≥ 2 steps), not from gradient.</p>
|
|
59
|
+
</footer>
|
|
60
|
+
</main>
|
|
61
|
+
</body>
|
|
62
|
+
</html>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: foundations-borders
|
|
3
|
+
DEMONSTRATES: --border-subtle, --border-default, --border-strong, --accent, --status-error
|
|
4
|
+
COMPOSITION: 5 stacked panels demonstrating border weights + colored border states (accent, error)
|
|
5
|
+
COPY VOICE: terse role labels
|
|
6
|
+
WHEN SCAFFOLDED: foundations (universal)
|
|
7
|
+
NOTES: Borders derive from --bg-1 via oklch(from var(--bg-1) calc(l + N) c h) — see colors_and_type.css. Match the visual weight to the role: subtle for ambient, strong for active selection, accent for primary CTA outlines, error for validation.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Foundations — borders</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
</head>
|
|
17
|
+
<body class="app" data-theme="dark">
|
|
18
|
+
<main class="specimen">
|
|
19
|
+
<h1>Borders</h1>
|
|
20
|
+
<p class="lede">Three weights for separation hierarchy, plus accent + error states. Borders derive from the surface bg in OKLCH so they stay visually consistent across themes.</p>
|
|
21
|
+
|
|
22
|
+
<div style="display: grid; gap: 12px; margin: 24px 0; max-width: 480px;">
|
|
23
|
+
<div style="padding: 12px 16px; border: 1px solid var(--border-subtle); border-radius: var(--radius-md);"><strong>Subtle</strong> · ambient separation</div>
|
|
24
|
+
<div style="padding: 12px 16px; border: 1px solid var(--border-default); border-radius: var(--radius-md);"><strong>Default</strong> · standard card / input outline</div>
|
|
25
|
+
<div style="padding: 12px 16px; border: 1px solid var(--border-strong); border-radius: var(--radius-md);"><strong>Strong</strong> · hover, selection, focus surrounds</div>
|
|
26
|
+
<div style="padding: 12px 16px; border: 1px solid var(--accent); border-radius: var(--radius-md);"><strong>Accent</strong> · primary CTA outline / focus ring base</div>
|
|
27
|
+
<div style="padding: 12px 16px; border: 1px solid var(--status-error); border-radius: var(--radius-md);"><strong>Error</strong> · validation fail / destructive confirm</div>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<h2>In context — input states</h2>
|
|
31
|
+
<div class="row" style="gap: 12px;">
|
|
32
|
+
<input type="text" value="default" style="background: var(--bg-3); color: var(--fg-0); border: 1px solid var(--border-default); padding: 6px 10px; border-radius: var(--radius-sm); font: inherit;" />
|
|
33
|
+
<input type="text" value="hover" style="background: var(--bg-3); color: var(--fg-0); border: 1px solid var(--border-strong); padding: 6px 10px; border-radius: var(--radius-sm); font: inherit;" />
|
|
34
|
+
<input type="text" value="focused" style="background: var(--bg-3); color: var(--fg-0); border: 1px solid var(--border-strong); padding: 6px 10px; border-radius: var(--radius-sm); font: inherit; outline: 2px solid var(--accent); outline-offset: 2px;" />
|
|
35
|
+
<input type="text" value="error" style="background: var(--bg-3); color: var(--fg-0); border: 1px solid var(--status-error); padding: 6px 10px; border-radius: var(--radius-sm); font: inherit;" />
|
|
36
|
+
</div>
|
|
37
|
+
</main>
|
|
38
|
+
</body>
|
|
39
|
+
</html>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: foundations-elevation
|
|
3
|
+
DEMONSTRATES: --shadow-sm, --shadow-md, --shadow-lg
|
|
4
|
+
COMPOSITION: 3 floating cards + a "no shadow" baseline showing what flat looks like
|
|
5
|
+
COPY VOICE: terse role labels
|
|
6
|
+
WHEN SCAFFOLDED: foundations (almost always)
|
|
7
|
+
NOTES: Shadows are reserved for floating UI (popovers, dropdowns, dialogs). Stationary cards use border + bg step, NOT shadow. Misuse is the #1 visual-noise tell.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Foundations — elevation</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
</head>
|
|
17
|
+
<body class="app" data-theme="dark">
|
|
18
|
+
<main class="specimen">
|
|
19
|
+
<h1>Elevation</h1>
|
|
20
|
+
<p class="lede">Three levels of shadow — and one explicit zero. Shadow is reserved for things that <em>float</em> above the page (popovers, dropdowns, dialogs). Stationary cards use border + bg step, not shadow.</p>
|
|
21
|
+
|
|
22
|
+
<div class="grid" style="grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));">
|
|
23
|
+
<div style="background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 24px; text-align: center;">
|
|
24
|
+
<strong style="display: block;">flat</strong>
|
|
25
|
+
<code style="color: var(--fg-2);">border + bg-1</code>
|
|
26
|
+
</div>
|
|
27
|
+
<div style="background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 24px; text-align: center; box-shadow: var(--shadow-sm);">
|
|
28
|
+
<strong style="display: block;">--shadow-sm</strong>
|
|
29
|
+
<code style="color: var(--fg-2);">hover lift</code>
|
|
30
|
+
</div>
|
|
31
|
+
<div style="background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 24px; text-align: center; box-shadow: var(--shadow-md);">
|
|
32
|
+
<strong style="display: block;">--shadow-md</strong>
|
|
33
|
+
<code style="color: var(--fg-2);">popover, menu</code>
|
|
34
|
+
</div>
|
|
35
|
+
<div style="background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 24px; text-align: center; box-shadow: var(--shadow-lg);">
|
|
36
|
+
<strong style="display: block;">--shadow-lg</strong>
|
|
37
|
+
<code style="color: var(--fg-2);">dialog, sheet</code>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<footer class="legend">
|
|
42
|
+
<p>If a card sits on the page surface and doesn't move, no shadow. Shadows imply "floats above" — use them when that's literally true.</p>
|
|
43
|
+
</footer>
|
|
44
|
+
</main>
|
|
45
|
+
</body>
|
|
46
|
+
</html>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: foundations-focus
|
|
3
|
+
DEMONSTRATES: --accent (as focus ring), outline + outline-offset pattern, focus-visible vs focus
|
|
4
|
+
COMPOSITION: 4 focusable controls each shown idle + focused, plus a contrast block proving accent vs surface clears WCAG
|
|
5
|
+
COPY VOICE: terse — focus tokens are utility, not branding
|
|
6
|
+
WHEN SCAFFOLDED: foundations (universal — every interactive surface needs this)
|
|
7
|
+
NOTES: Ring is `outline: 2px solid var(--accent); outline-offset: 2px` — NOT inset box-shadow (which masks the border). focus-visible only (not :focus) so mouse clicks don't paint rings.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Foundations — focus</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.focusable { padding: 8px 14px; border-radius: var(--radius-sm); background: var(--bg-3); border: 1px solid var(--border-default); color: var(--fg-0); font: inherit; }
|
|
18
|
+
.focusable:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-color: var(--border-strong); }
|
|
19
|
+
.ring { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
20
|
+
</style>
|
|
21
|
+
</head>
|
|
22
|
+
<body class="app" data-theme="dark">
|
|
23
|
+
<main class="specimen">
|
|
24
|
+
<h1>Focus</h1>
|
|
25
|
+
<p class="lede">The focus ring is <code>outline: 2px solid var(--accent)</code> with <code>outline-offset: 2px</code> — applied via <code>:focus-visible</code>, not <code>:focus</code> (so mouse clicks don't paint rings on buttons).</p>
|
|
26
|
+
|
|
27
|
+
<h2>Live (Tab through these)</h2>
|
|
28
|
+
<div class="row">
|
|
29
|
+
<button class="focusable">Button</button>
|
|
30
|
+
<input class="focusable" type="text" placeholder="Input" />
|
|
31
|
+
<a href="#" class="focusable" style="text-decoration: none;">Link</a>
|
|
32
|
+
<span class="focusable" tabindex="0">Custom focusable</span>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<h2>Idle vs focused (visual)</h2>
|
|
36
|
+
<div class="row">
|
|
37
|
+
<button class="focusable">Idle</button>
|
|
38
|
+
<button class="focusable ring">Focused (ring shown)</button>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<h2>Why outline, not box-shadow</h2>
|
|
42
|
+
<p>Outline lives outside the layout box — it never shifts adjacent content. Inset box-shadow masks the element's border + can be clipped by parent <code>overflow: hidden</code>. The 2px offset prevents the ring from touching the element's border, so contrast stays clean even on edge cases.</p>
|
|
43
|
+
|
|
44
|
+
<h2>Contrast guarantee</h2>
|
|
45
|
+
<p>The accent token MUST clear <strong>3:1</strong> against every adjacent <code>--bg-*</code> level. Verify on theme switch.</p>
|
|
46
|
+
</main>
|
|
47
|
+
</body>
|
|
48
|
+
</html>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: foundations-grid
|
|
3
|
+
DEMONSTRATES: --layout-max-w, --layout-gutter, column grid, responsive breakpoints
|
|
4
|
+
COMPOSITION: visible 12-col grid overlay + a real layout (header + main + aside) at the grid + breakpoint table
|
|
5
|
+
COPY VOICE: terse role labels
|
|
6
|
+
WHEN SCAFFOLDED: foundations (default for desktop and tablet projects; mobile uses single-column)
|
|
7
|
+
NOTES: 12-column flexible grid with --layout-gutter spacing. Breakpoints: sm 480, md 768, lg 1024, xl 1280. Mobile-first — desktop layouts opt INTO the grid via min-width media queries.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Foundations — grid</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.grid-overlay { display: grid; grid-template-columns: repeat(12, 1fr); gap: var(--layout-gutter); max-width: var(--layout-max-w); margin: 16px auto; padding: 8px; background: var(--bg-1); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); }
|
|
18
|
+
.grid-overlay > div { background: var(--accent); opacity: 0.2; height: 40px; border-radius: var(--radius-xs); }
|
|
19
|
+
.layout { display: grid; grid-template-columns: 1fr 280px; gap: var(--layout-gutter); max-width: var(--layout-max-w); margin: 16px auto; }
|
|
20
|
+
.layout > * { background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 16px; }
|
|
21
|
+
</style>
|
|
22
|
+
</head>
|
|
23
|
+
<body class="app" data-theme="dark">
|
|
24
|
+
<main class="specimen">
|
|
25
|
+
<h1>Grid</h1>
|
|
26
|
+
<p class="lede">12-column flexible grid scoped by <code>--layout-max-w</code> with <code>--layout-gutter</code> spacing. Mobile-first: layouts start single-column and opt INTO multi-column via min-width queries.</p>
|
|
27
|
+
|
|
28
|
+
<h2>12-column overlay</h2>
|
|
29
|
+
<div class="grid-overlay">
|
|
30
|
+
<div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<h2>Real layout — main + aside</h2>
|
|
34
|
+
<div class="layout">
|
|
35
|
+
<div><strong>Main content area</strong><p style="color: var(--fg-1);">Spans flexibly — fills whatever the side panel doesn't claim.</p></div>
|
|
36
|
+
<div><strong>Side panel</strong><p style="color: var(--fg-1); font-size: var(--type-sm);">Fixed 280px on desktop; stacks below main on mobile.</p></div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<h2>Breakpoints</h2>
|
|
40
|
+
<table style="width: 100%; max-width: 480px; background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); border-collapse: collapse; overflow: hidden;">
|
|
41
|
+
<thead><tr><th style="text-align: left; padding: 8px 12px; background: var(--bg-2); border-bottom: 1px solid var(--border-default);">Token</th><th style="text-align: left; padding: 8px 12px; background: var(--bg-2); border-bottom: 1px solid var(--border-default);">Width</th><th style="text-align: left; padding: 8px 12px; background: var(--bg-2); border-bottom: 1px solid var(--border-default);">Used for</th></tr></thead>
|
|
42
|
+
<tbody>
|
|
43
|
+
<tr><td style="padding: 8px 12px; border-bottom: 1px solid var(--border-subtle);"><code>sm</code></td><td style="padding: 8px 12px; border-bottom: 1px solid var(--border-subtle);">≥ 480px</td><td style="padding: 8px 12px; border-bottom: 1px solid var(--border-subtle); color: var(--fg-1);">Large phone, two-up grids</td></tr>
|
|
44
|
+
<tr><td style="padding: 8px 12px; border-bottom: 1px solid var(--border-subtle);"><code>md</code></td><td style="padding: 8px 12px; border-bottom: 1px solid var(--border-subtle);">≥ 768px</td><td style="padding: 8px 12px; border-bottom: 1px solid var(--border-subtle); color: var(--fg-1);">Tablet, side panels appear</td></tr>
|
|
45
|
+
<tr><td style="padding: 8px 12px; border-bottom: 1px solid var(--border-subtle);"><code>lg</code></td><td style="padding: 8px 12px; border-bottom: 1px solid var(--border-subtle);">≥ 1024px</td><td style="padding: 8px 12px; border-bottom: 1px solid var(--border-subtle); color: var(--fg-1);">Desktop</td></tr>
|
|
46
|
+
<tr><td style="padding: 8px 12px;"><code>xl</code></td><td style="padding: 8px 12px;">≥ 1280px</td><td style="padding: 8px 12px; color: var(--fg-1);">Wide desktop, dual-aside layouts</td></tr>
|
|
47
|
+
</tbody>
|
|
48
|
+
</table>
|
|
49
|
+
</main>
|
|
50
|
+
</body>
|
|
51
|
+
</html>
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: foundations-iconography
|
|
3
|
+
DEMONSTRATES: SVG icon family, stroke width consistency, sizing scale (16/20/24), color inheritance via currentColor
|
|
4
|
+
COMPOSITION: 4 sample Lucide-style icons at 3 sizes each, plus icon-in-button context
|
|
5
|
+
COPY VOICE: terse — icon names + roles
|
|
6
|
+
WHEN SCAFFOLDED: foundations (universal — every project picks an icon family)
|
|
7
|
+
NOTES: Use ONE family (Lucide / Phosphor / Heroicons) — never mix. Stroke width is constant (1.5px Lucide default, 1px Lucide thin, etc.). Color via currentColor inherits from parent. Filled vs outline is a per-state choice, not a per-icon choice.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Foundations — iconography</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.icon-row { display: flex; gap: 24px; align-items: flex-end; margin: 24px 0; flex-wrap: wrap; }
|
|
18
|
+
.icon-tile { display: grid; gap: 6px; justify-items: center; }
|
|
19
|
+
.icon-tile svg { color: var(--fg-0); display: block; }
|
|
20
|
+
.icon-tile .label { font-size: var(--type-xs); color: var(--fg-1); }
|
|
21
|
+
</style>
|
|
22
|
+
</head>
|
|
23
|
+
<body class="app" data-theme="dark">
|
|
24
|
+
<main class="specimen">
|
|
25
|
+
<h1>Iconography</h1>
|
|
26
|
+
<p class="lede">Lucide outline, 1.5px stroke, three sizes. One family, one stroke weight — mixing icon sets is the fastest way to make a system feel cheap. Color inherits from <code>currentColor</code> so icons follow their parent's foreground.</p>
|
|
27
|
+
|
|
28
|
+
<h2>Sizes (16 / 20 / 24)</h2>
|
|
29
|
+
<div class="icon-row">
|
|
30
|
+
<div class="icon-tile">
|
|
31
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12l2-2 4 4 8-8 4 4"/></svg>
|
|
32
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12l2-2 4 4 8-8 4 4"/></svg>
|
|
33
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12l2-2 4 4 8-8 4 4"/></svg>
|
|
34
|
+
<span class="label">trending</span>
|
|
35
|
+
</div>
|
|
36
|
+
<div class="icon-tile">
|
|
37
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 3"/></svg>
|
|
38
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 3"/></svg>
|
|
39
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 3"/></svg>
|
|
40
|
+
<span class="label">clock</span>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="icon-tile">
|
|
43
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="m20 20-3-3"/></svg>
|
|
44
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="m20 20-3-3"/></svg>
|
|
45
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="m20 20-3-3"/></svg>
|
|
46
|
+
<span class="label">search</span>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="icon-tile">
|
|
49
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6h16M7 12h10M10 18h4"/></svg>
|
|
50
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6h16M7 12h10M10 18h4"/></svg>
|
|
51
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6h16M7 12h10M10 18h4"/></svg>
|
|
52
|
+
<span class="label">filter</span>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<h2>In button context</h2>
|
|
57
|
+
<div class="row">
|
|
58
|
+
<button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 8px 14px; border-radius: var(--radius-sm); display: inline-flex; align-items: center; gap: 6px; font: inherit;">
|
|
59
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="m20 20-3-3"/></svg>
|
|
60
|
+
Search
|
|
61
|
+
</button>
|
|
62
|
+
<button style="background: var(--bg-3); color: var(--fg-0); border: 1px solid var(--border-default); padding: 8px 14px; border-radius: var(--radius-sm); display: inline-flex; align-items: center; gap: 6px; font: inherit;">
|
|
63
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6h16M7 12h10M10 18h4"/></svg>
|
|
64
|
+
Filter
|
|
65
|
+
</button>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<footer class="legend">
|
|
69
|
+
<p>Color inherits from text — never hardcode <code>stroke="#000"</code>. Use <code>color: var(--fg-0)</code> on the parent + <code>stroke="currentColor"</code> on the SVG.</p>
|
|
70
|
+
</footer>
|
|
71
|
+
</main>
|
|
72
|
+
</body>
|
|
73
|
+
</html>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: foundations-opacity
|
|
3
|
+
DEMONSTRATES: opacity scale (0.4 / 0.6 / 0.8 / 1.0), disabled state, overlay veil
|
|
4
|
+
COMPOSITION: 4-step opacity ladder + disabled-button + modal-veil sample
|
|
5
|
+
COPY VOICE: terse
|
|
6
|
+
WHEN SCAFFOLDED: foundations (universal)
|
|
7
|
+
NOTES: Disabled = opacity 0.5 + pointer-events: none, NOT a separate token color. Veil = oklch(0 0 0 / 0.4–0.6) over the page. No --opacity-* tokens — opacity is a base value, not a token.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Foundations — opacity</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
</head>
|
|
17
|
+
<body class="app" data-theme="dark">
|
|
18
|
+
<main class="specimen">
|
|
19
|
+
<h1>Opacity</h1>
|
|
20
|
+
<p class="lede">A short ladder — light / medium / heavy / disabled. Used for overlays and the disabled state. Opacity isn't a token (it's a value); the ladder exists to keep usage consistent.</p>
|
|
21
|
+
|
|
22
|
+
<div class="grid">
|
|
23
|
+
<div class="swatch"><div style="height: 64px; background: var(--accent); opacity: 0.4;"></div><div class="meta"><strong>0.4</strong>light overlay</div></div>
|
|
24
|
+
<div class="swatch"><div style="height: 64px; background: var(--accent); opacity: 0.6;"></div><div class="meta"><strong>0.6</strong>medium veil</div></div>
|
|
25
|
+
<div class="swatch"><div style="height: 64px; background: var(--accent); opacity: 0.8;"></div><div class="meta"><strong>0.8</strong>heavy veil</div></div>
|
|
26
|
+
<div class="swatch"><div style="height: 64px; background: var(--accent); opacity: 1.0;"></div><div class="meta"><strong>1.0</strong>opaque</div></div>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<h2>Disabled state</h2>
|
|
30
|
+
<div class="row">
|
|
31
|
+
<button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 8px 14px; border-radius: var(--radius-sm);">Save</button>
|
|
32
|
+
<button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 8px 14px; border-radius: var(--radius-sm); opacity: 0.5; cursor: not-allowed;">Save (disabled)</button>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<h2>Modal veil</h2>
|
|
36
|
+
<div style="position: relative; background: var(--bg-0); padding: 32px; border-radius: var(--radius-md); border: 1px solid var(--border-subtle); margin: 16px 0; min-height: 160px; overflow: hidden;">
|
|
37
|
+
<div style="position: absolute; inset: 0; background: oklch(0 0 0 / 0.5);"></div>
|
|
38
|
+
<div style="position: relative; background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 16px; max-width: 320px; box-shadow: var(--shadow-lg);">
|
|
39
|
+
<strong>Modal on top of veil</strong>
|
|
40
|
+
<p style="color: var(--fg-1); margin: 4px 0 0;">Veil = oklch(0 0 0 / 0.5) over page surface.</p>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</main>
|
|
44
|
+
</body>
|
|
45
|
+
</html>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: foundations-radii
|
|
3
|
+
DEMONSTRATES: --radius-xs, --radius-sm, --radius-md, --radius-lg, --radius-xl, --radius-pill
|
|
4
|
+
COMPOSITION: 6 swatch tiles showing the radii ladder + applied to a real surface (card, button, pill)
|
|
5
|
+
COPY VOICE: terse role labels
|
|
6
|
+
WHEN SCAFFOLDED: foundations (almost always — every project has radii)
|
|
7
|
+
NOTES: Pair this with components-buttons + components-cards which consume these. Pill must be 999px or `9999px`, never `calc(100%)`.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Foundations — radii</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
</head>
|
|
17
|
+
<body class="app" data-theme="dark">
|
|
18
|
+
<main class="specimen">
|
|
19
|
+
<h1>Radii</h1>
|
|
20
|
+
<p class="lede">Six steps from sharp inline pills to soft hero shapes. Stick to the ladder — every off-token corner radius is visual noise.</p>
|
|
21
|
+
|
|
22
|
+
<div class="grid">
|
|
23
|
+
<div class="swatch"><div style="height: 64px; background: var(--accent); border-radius: var(--radius-xs);"></div><div class="meta"><strong>--radius-xs</strong>inline chip</div></div>
|
|
24
|
+
<div class="swatch"><div style="height: 64px; background: var(--accent); border-radius: var(--radius-sm);"></div><div class="meta"><strong>--radius-sm</strong>buttons, inputs</div></div>
|
|
25
|
+
<div class="swatch"><div style="height: 64px; background: var(--accent); border-radius: var(--radius-md);"></div><div class="meta"><strong>--radius-md</strong>cards, panels</div></div>
|
|
26
|
+
<div class="swatch"><div style="height: 64px; background: var(--accent); border-radius: var(--radius-lg);"></div><div class="meta"><strong>--radius-lg</strong>dialogs</div></div>
|
|
27
|
+
<div class="swatch"><div style="height: 64px; background: var(--accent); border-radius: var(--radius-xl);"></div><div class="meta"><strong>--radius-xl</strong>hero shapes</div></div>
|
|
28
|
+
<div class="swatch"><div style="height: 64px; width: 64px; background: var(--accent); border-radius: var(--radius-pill); margin: 0 auto;"></div><div class="meta"><strong>--radius-pill</strong>avatars, pills</div></div>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<h2>In context</h2>
|
|
32
|
+
<div class="row">
|
|
33
|
+
<button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 8px 14px; border-radius: var(--radius-sm);">Button (sm)</button>
|
|
34
|
+
<div style="background: var(--bg-1); border: 1px solid var(--border-default); padding: 14px 18px; border-radius: var(--radius-md);">Card (md)</div>
|
|
35
|
+
<span style="background: var(--accent); color: var(--accent-fg); padding: 2px 10px; border-radius: var(--radius-pill); font-size: var(--type-xs);">Pill</span>
|
|
36
|
+
<div style="width: 32px; height: 32px; background: var(--bg-3); border: 1px solid var(--border-default); border-radius: var(--radius-pill);"></div>
|
|
37
|
+
</div>
|
|
38
|
+
</main>
|
|
39
|
+
</body>
|
|
40
|
+
</html>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: foundations-selection
|
|
3
|
+
DEMONSTRATES: ::selection pseudo, multi-select row state, range selection
|
|
4
|
+
COMPOSITION: paragraph with explicit text selection sample + multi-select list with shift+click range + checked state
|
|
5
|
+
COPY VOICE: real product strings (player names, match notes)
|
|
6
|
+
WHEN SCAFFOLDED: foundations (universal — every text surface + list has selection)
|
|
7
|
+
NOTES: ::selection bg uses --accent at low opacity (oklch with 0.3 alpha) for readability with foreground. Row selection uses --bg-4 (the pressed-state token). Never use accent for row selection — rows aren't navigation.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Foundations — selection</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.demo-text ::selection,
|
|
18
|
+
.demo-text::selection { background: oklch(from var(--accent) l c h / 0.32); color: var(--fg-0); }
|
|
19
|
+
.multi-row { display: flex; gap: 12px; padding: 8px 12px; align-items: center; border-radius: var(--radius-sm); cursor: pointer; }
|
|
20
|
+
.multi-row.is-selected { background: var(--bg-4); }
|
|
21
|
+
.multi-row.is-range { background: var(--bg-3); }
|
|
22
|
+
.multi-row .check { width: 16px; height: 16px; border: 1px solid var(--border-default); border-radius: var(--radius-sm); display: inline-flex; align-items: center; justify-content: center; }
|
|
23
|
+
.multi-row.is-selected .check, .multi-row.is-range .check { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }
|
|
24
|
+
</style>
|
|
25
|
+
</head>
|
|
26
|
+
<body class="app" data-theme="dark">
|
|
27
|
+
<main class="specimen">
|
|
28
|
+
<h1>Selection</h1>
|
|
29
|
+
<p class="lede">Two distinct concepts share the word "selection": text selection in flowing content, and multi-select in lists. They use different visual languages — text gets a tinted accent overlay, rows get the neutral pressed-state surface.</p>
|
|
30
|
+
|
|
31
|
+
<h2>Text selection</h2>
|
|
32
|
+
<p class="demo-text">Drag-select this paragraph. The highlight is the accent color at low opacity (32%) — readable on top of the body text. Selection works across line breaks and adapts to dark / light theme without manual tuning because OKLCH carries the alpha cleanly.</p>
|
|
33
|
+
|
|
34
|
+
<h2>Multi-select rows</h2>
|
|
35
|
+
<div style="background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 8px; max-width: 360px;">
|
|
36
|
+
<div class="multi-row is-selected"><span class="check">✓</span> Kim Park · #9 forward</div>
|
|
37
|
+
<div class="multi-row is-range"><span class="check">✓</span> Jonas Weber · #14 midfield</div>
|
|
38
|
+
<div class="multi-row is-range"><span class="check">✓</span> Marta Silva · #4 defender</div>
|
|
39
|
+
<div class="multi-row is-range"><span class="check">✓</span> Liam Chen · #1 goalkeeper</div>
|
|
40
|
+
<div class="multi-row"><span class="check"></span> Sara Novak · #11 forward</div>
|
|
41
|
+
</div>
|
|
42
|
+
<p style="color: var(--fg-2); font-size: var(--type-xs); margin-top: 8px;">Click selects (--bg-4); Shift+Click extends a range (--bg-3); Esc clears.</p>
|
|
43
|
+
</main>
|
|
44
|
+
</body>
|
|
45
|
+
</html>
|