@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,62 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: meta-accessibility
|
|
3
|
+
DEMONSTRATES: focus order example, semantic HTML samples, ARIA role example, screen-reader-only text, skip-link
|
|
4
|
+
COMPOSITION: 5 sections showing one a11y pattern each with HTML excerpts
|
|
5
|
+
COPY VOICE: technical but plain
|
|
6
|
+
WHEN SCAFFOLDED: meta (universal)
|
|
7
|
+
NOTES: This is the project's a11y reference page. Don't list WCAG criteria — those are universal. List PROJECT-specific patterns (skip-link target, focus-trap conventions, sr-only utility class).
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Meta — accessibility</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
|
|
18
|
+
.skip-link { position: absolute; top: -100px; left: 8px; padding: 8px 12px; background: var(--accent); color: var(--accent-fg); border-radius: var(--radius-sm); transition: top var(--dur-flip); z-index: 999; }
|
|
19
|
+
.skip-link:focus { top: 8px; }
|
|
20
|
+
pre { background: var(--bg-0); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 12px 14px; font-family: var(--font-mono); font-size: 12px; line-height: 1.6; color: var(--fg-0); overflow-x: auto; }
|
|
21
|
+
</style>
|
|
22
|
+
</head>
|
|
23
|
+
<body class="app" data-theme="dark">
|
|
24
|
+
<a href="#main" class="skip-link">Skip to main content</a>
|
|
25
|
+
<main id="main" class="specimen">
|
|
26
|
+
<h1>Accessibility</h1>
|
|
27
|
+
<p class="lede">Project-specific a11y patterns. WCAG criteria are universal — this page covers <em>how this project applies them</em>: skip-link target, focus-trap convention, screen-reader-only utility, semantic landmarks.</p>
|
|
28
|
+
|
|
29
|
+
<h2>Skip link</h2>
|
|
30
|
+
<p>The first focusable element on every page jumps to <code>#main</code>. Tab once on any page to reveal it.</p>
|
|
31
|
+
<pre><a href="#main" class="skip-link">Skip to main content</a>
|
|
32
|
+
<main id="main"> … </main></pre>
|
|
33
|
+
|
|
34
|
+
<h2>Screen-reader-only text</h2>
|
|
35
|
+
<p>Use the <code>.sr-only</code> utility for content that screen readers should hear but sighted users don't need to see.</p>
|
|
36
|
+
<pre><button>
|
|
37
|
+
<svg aria-hidden="true">…</svg>
|
|
38
|
+
<span class="sr-only">Open menu</span>
|
|
39
|
+
</button></pre>
|
|
40
|
+
|
|
41
|
+
<h2>Semantic landmarks</h2>
|
|
42
|
+
<p>Every page MUST have one <code><main></code>, one <code><h1></code>. Nav inside <code><nav aria-label="…"></code>, complementary content inside <code><aside></code>.</p>
|
|
43
|
+
<pre><header>…</header>
|
|
44
|
+
<nav aria-label="Primary">…</nav>
|
|
45
|
+
<main id="main">
|
|
46
|
+
<h1>Page title</h1>
|
|
47
|
+
…
|
|
48
|
+
</main>
|
|
49
|
+
<aside>…</aside>
|
|
50
|
+
<footer>…</footer></pre>
|
|
51
|
+
|
|
52
|
+
<h2>Focus trap (modals)</h2>
|
|
53
|
+
<p>Modal dialogs use <code>role="dialog" aria-modal="true"</code> and trap Tab focus inside. Esc closes. After close, focus returns to the trigger.</p>
|
|
54
|
+
|
|
55
|
+
<h2>ARIA live regions</h2>
|
|
56
|
+
<p>Use <code>aria-live="polite"</code> on status updates (notifications, count badges that change). Use <code>aria-live="assertive"</code> only for true emergencies (form errors blocking submit).</p>
|
|
57
|
+
|
|
58
|
+
<h2>Focus indicators</h2>
|
|
59
|
+
<p>Every focusable element has a visible focus indicator via <code>:focus-visible</code> — see <a href="../foundations/focus.html">foundations/focus</a>. Never <code>outline: none</code> without a replacement.</p>
|
|
60
|
+
</main>
|
|
61
|
+
</body>
|
|
62
|
+
</html>
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: meta-i18n
|
|
3
|
+
DEMONSTRATES: RTL support, long-text overflow handling, pluralization patterns, lang attribute
|
|
4
|
+
COMPOSITION: 4 sections — RTL flip (Hebrew/Arabic sample), text overflow (ellipsis vs wrap), pluralization (1 / N / 0), lang attribute usage
|
|
5
|
+
COPY VOICE: real translation candidates from CMS
|
|
6
|
+
WHEN SCAFFOLDED: meta (when project supports i18n)
|
|
7
|
+
NOTES: RTL is `dir="rtl"` on the parent — the layout flips automatically with logical properties (margin-inline-start, etc.). Long-text overflow needs a strategy per surface — ellipsis for chips, wrap for body. Pluralization always covers 0 case (often the most distinct copy).
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Meta — i18n</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.demo-card { background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 16px; margin: 0 0 16px; max-width: 480px; }
|
|
18
|
+
.demo-card .lbl { font-size: var(--type-xs); color: var(--fg-2); margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.04em; }
|
|
19
|
+
.chip { background: var(--bg-3); border: 1px solid var(--border-default); padding: 4px 12px; border-radius: var(--radius-pill); display: inline-block; max-width: 160px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; }
|
|
20
|
+
.rtl { direction: rtl; }
|
|
21
|
+
</style>
|
|
22
|
+
</head>
|
|
23
|
+
<body class="app" data-theme="dark">
|
|
24
|
+
<main class="specimen">
|
|
25
|
+
<h1>Internationalization</h1>
|
|
26
|
+
<p class="lede">Four project-specific i18n patterns — RTL flip, text overflow strategy, pluralization, and the <code>lang</code> attribute.</p>
|
|
27
|
+
|
|
28
|
+
<h2>RTL — layout flips automatically</h2>
|
|
29
|
+
<div class="demo-card">
|
|
30
|
+
<div class="lbl">English (ltr)</div>
|
|
31
|
+
<div style="display: flex; align-items: center; gap: 12px;">
|
|
32
|
+
<span style="width: 32px; height: 32px; background: var(--bg-3); border-radius: 50%;"></span>
|
|
33
|
+
<div><strong>Kim Park</strong><div style="color: var(--fg-1); font-size: var(--type-sm);">#9 · captain</div></div>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
<div class="demo-card rtl" lang="ar">
|
|
37
|
+
<div class="lbl">Arabic (rtl)</div>
|
|
38
|
+
<div style="display: flex; align-items: center; gap: 12px;">
|
|
39
|
+
<span style="width: 32px; height: 32px; background: var(--bg-3); border-radius: 50%;"></span>
|
|
40
|
+
<div><strong>كيم بارك</strong><div style="color: var(--fg-1); font-size: var(--type-sm);">#9 · القائد</div></div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<h2>Long-text overflow</h2>
|
|
45
|
+
<div class="demo-card">
|
|
46
|
+
<div class="lbl">Chips — ellipsis at 160px</div>
|
|
47
|
+
<span class="chip">Forward</span>
|
|
48
|
+
<span class="chip">Defender</span>
|
|
49
|
+
<span class="chip">Mittelfeldspieler</span>
|
|
50
|
+
<span class="chip">Aanvallende middenvelder</span>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="demo-card">
|
|
53
|
+
<div class="lbl">Body — wraps freely</div>
|
|
54
|
+
<p style="margin: 0; color: var(--fg-1); line-height: 1.5;">Speeleranzahl ist begrenzt auf maximal 24 Spieler pro Kader; Ersatzspieler werden separat geführt.</p>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<h2>Pluralization (0 / 1 / N)</h2>
|
|
58
|
+
<div class="demo-card">
|
|
59
|
+
<p style="margin: 0 0 8px;"><strong>Empty:</strong> No players in this squad — invite some.</p>
|
|
60
|
+
<p style="margin: 0 0 8px;"><strong>One:</strong> 1 player on the bench.</p>
|
|
61
|
+
<p style="margin: 0;"><strong>Many:</strong> 7 players on the bench.</p>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<h2><code>lang</code> attribute</h2>
|
|
65
|
+
<p>Set on <code><html></code> globally; override per section when content language differs. Browsers + screen readers use this for hyphenation, quotation marks, and pronunciation.</p>
|
|
66
|
+
<pre style="background: var(--bg-0); padding: 12px 14px; border-radius: var(--radius-md); border: 1px solid var(--border-default); font-family: var(--font-mono); font-size: 12px;"><html lang="en">
|
|
67
|
+
<blockquote lang="fr">
|
|
68
|
+
Le football est un jeu simple.
|
|
69
|
+
</blockquote>
|
|
70
|
+
</html></pre>
|
|
71
|
+
</main>
|
|
72
|
+
</body>
|
|
73
|
+
</html>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: meta-presence-multiplayer
|
|
3
|
+
DEMONSTRATES: forward-pointer to v1.x multiplayer features — live cursors with labels, awareness pills, conflict-free type indicators
|
|
4
|
+
COMPOSITION: full mockup of a shared canvas with 3 cursors + awareness rail + typing indicator
|
|
5
|
+
COPY VOICE: real names, real "X is editing" strings
|
|
6
|
+
WHEN SCAFFOLDED: meta + presence family (typically v1.1+ projects with Yjs)
|
|
7
|
+
NOTES: This is a forward-pointer specimen showing what the multiplayer UX looks like once Phase 8 (Yjs LAN) lands. The cursor color is per-user (hashed from user ID into an OKLCH band). Don't blink cursors — too noisy.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Meta — presence multiplayer</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.canvas-frame { position: relative; background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 32px; min-height: 320px; overflow: hidden; }
|
|
18
|
+
.cursor { position: absolute; display: flex; align-items: flex-start; gap: 2px; pointer-events: none; }
|
|
19
|
+
.cursor-label { background: currentColor; color: var(--accent-fg); font-size: 11px; padding: 1px 6px; border-radius: var(--radius-pill); margin-top: 12px; margin-left: 4px; white-space: nowrap; }
|
|
20
|
+
.awareness-rail { position: absolute; top: 12px; right: 12px; display: flex; align-items: center; gap: 4px; }
|
|
21
|
+
.av-chip { display: flex; align-items: center; gap: 4px; background: var(--bg-2); border: 1px solid var(--border-default); padding: 3px 8px; border-radius: var(--radius-pill); font-size: var(--type-xs); }
|
|
22
|
+
.av-chip .dot { width: 6px; height: 6px; border-radius: 50%; }
|
|
23
|
+
.typing { position: absolute; bottom: 12px; left: 12px; background: var(--bg-2); border: 1px solid var(--border-default); padding: 4px 10px; border-radius: var(--radius-pill); font-size: var(--type-xs); color: var(--fg-1); display: flex; align-items: center; gap: 6px; }
|
|
24
|
+
.typing .pulse { width: 6px; height: 6px; border-radius: 50%; background: var(--status-success); animation: pulse 1s ease-in-out infinite; }
|
|
25
|
+
@keyframes pulse { 0%,100% { opacity: 0.4; } 50% { opacity: 1; } }
|
|
26
|
+
@media (prefers-reduced-motion: reduce) { .typing .pulse { animation: none; } }
|
|
27
|
+
</style>
|
|
28
|
+
</head>
|
|
29
|
+
<body class="app" data-theme="dark">
|
|
30
|
+
<main class="specimen">
|
|
31
|
+
<h1>Presence — multiplayer</h1>
|
|
32
|
+
<p class="lede">Forward-pointer to what multiplayer looks like when Yjs lands (v1.1+). Three concepts compose: live cursors with labels, an awareness rail listing who's connected, and a typing indicator when someone's editing a field.</p>
|
|
33
|
+
|
|
34
|
+
<div class="canvas-frame">
|
|
35
|
+
<div class="awareness-rail">
|
|
36
|
+
<div class="av-chip"><span class="dot" style="background: oklch(64% 0.20 264);"></span>Kim</div>
|
|
37
|
+
<div class="av-chip"><span class="dot" style="background: oklch(68% 0.18 145);"></span>Marta</div>
|
|
38
|
+
<div class="av-chip"><span class="dot" style="background: oklch(72% 0.15 50);"></span>Jonas</div>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<h3 style="margin: 0 0 8px;">Match recap · vs. Sparta U17</h3>
|
|
42
|
+
<p style="color: var(--fg-1); margin: 0 0 16px;">Three editors live — every change syncs in milliseconds via Yjs CRDT.</p>
|
|
43
|
+
|
|
44
|
+
<div style="background: var(--bg-3); padding: 8px 12px; border-radius: var(--radius-sm); margin-bottom: 8px;">Final score: <strong>3 - 1</strong></div>
|
|
45
|
+
<div style="background: var(--bg-3); padding: 8px 12px; border-radius: var(--radius-sm); margin-bottom: 8px;">Captain Kim — hat-trick (12', 38', 67')</div>
|
|
46
|
+
<div style="background: var(--bg-3); padding: 8px 12px; border-radius: var(--radius-sm); margin-bottom: 8px; outline: 2px solid oklch(68% 0.18 145); outline-offset: -1px;">Squad rating: <strong>B+</strong> <em style="color: var(--fg-2);">(Marta is editing)</em></div>
|
|
47
|
+
|
|
48
|
+
<div class="cursor" style="top: 70px; left: 40%; color: oklch(64% 0.20 264);">
|
|
49
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M3 3 L21 12 L13 14 L11 22 Z"/></svg>
|
|
50
|
+
<span class="cursor-label">Kim</span>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="cursor" style="top: 180px; left: 70%; color: oklch(68% 0.18 145);">
|
|
53
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M3 3 L21 12 L13 14 L11 22 Z"/></svg>
|
|
54
|
+
<span class="cursor-label">Marta · typing</span>
|
|
55
|
+
</div>
|
|
56
|
+
<div class="cursor" style="top: 220px; left: 15%; color: oklch(72% 0.15 50);">
|
|
57
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M3 3 L21 12 L13 14 L11 22 Z"/></svg>
|
|
58
|
+
<span class="cursor-label">Jonas</span>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<div class="typing">
|
|
62
|
+
<span class="pulse"></span>Marta is editing the squad rating
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<footer class="legend">
|
|
67
|
+
<p>Per-user color is hashed from the user ID into a stable OKLCH band — same user, same color across sessions. Don't store the color; derive it.</p>
|
|
68
|
+
</footer>
|
|
69
|
+
</main>
|
|
70
|
+
</body>
|
|
71
|
+
</html>
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: meta-tokens-index
|
|
3
|
+
DEMONSTRATES: full visual TOC of every token family in colors_and_type.css — colors, type, spacing, motion, radii
|
|
4
|
+
COMPOSITION: 5 sections, each a grid of swatches/samples for one token family, with the var() name visible
|
|
5
|
+
COPY VOICE: literal token names + their semantic role
|
|
6
|
+
WHEN SCAFFOLDED: meta (universal — every project benefits from a single overview page)
|
|
7
|
+
NOTES: This is the dev-server's landing page if no canvas is selected. Acts as a token catalog the design-system-completeness-critic can grep for known tokens. Don't hardcode any non-token values here.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Meta — tokens index</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.token-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px; margin: 0 0 32px; }
|
|
18
|
+
.tok { display: grid; gap: 4px; padding: 8px; background: var(--bg-1); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); font-size: var(--type-xs); }
|
|
19
|
+
.tok .sample { height: 24px; border-radius: var(--radius-xs); }
|
|
20
|
+
.tok code { color: var(--fg-1); font-size: 10px; }
|
|
21
|
+
.tok .role { color: var(--fg-2); font-size: 10px; }
|
|
22
|
+
</style>
|
|
23
|
+
</head>
|
|
24
|
+
<body class="app" data-theme="dark">
|
|
25
|
+
<main class="specimen">
|
|
26
|
+
<h1>Tokens index</h1>
|
|
27
|
+
<p class="lede">Visual catalog of every token in <code>colors_and_type.css</code>. Useful as a landing page in the dev server, and as a check that nothing's been added inline without being promoted to a token.</p>
|
|
28
|
+
|
|
29
|
+
<h2>Surfaces</h2>
|
|
30
|
+
<div class="token-grid">
|
|
31
|
+
<div class="tok"><div class="sample" style="background: var(--bg-0);"></div><code>--bg-0</code><span class="role">page</span></div>
|
|
32
|
+
<div class="tok"><div class="sample" style="background: var(--bg-1);"></div><code>--bg-1</code><span class="role">card</span></div>
|
|
33
|
+
<div class="tok"><div class="sample" style="background: var(--bg-2);"></div><code>--bg-2</code><span class="role">nested</span></div>
|
|
34
|
+
<div class="tok"><div class="sample" style="background: var(--bg-3);"></div><code>--bg-3</code><span class="role">input</span></div>
|
|
35
|
+
<div class="tok"><div class="sample" style="background: var(--bg-4);"></div><code>--bg-4</code><span class="role">pressed</span></div>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<h2>Text</h2>
|
|
39
|
+
<div class="token-grid">
|
|
40
|
+
<div class="tok"><div class="sample" style="background: var(--fg-0);"></div><code>--fg-0</code><span class="role">primary</span></div>
|
|
41
|
+
<div class="tok"><div class="sample" style="background: var(--fg-1);"></div><code>--fg-1</code><span class="role">secondary</span></div>
|
|
42
|
+
<div class="tok"><div class="sample" style="background: var(--fg-2);"></div><code>--fg-2</code><span class="role">muted</span></div>
|
|
43
|
+
<div class="tok"><div class="sample" style="background: var(--fg-3);"></div><code>--fg-3</code><span class="role">disabled</span></div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<h2>Accent + status</h2>
|
|
47
|
+
<div class="token-grid">
|
|
48
|
+
<div class="tok"><div class="sample" style="background: var(--accent);"></div><code>--accent</code><span class="role">primary</span></div>
|
|
49
|
+
<div class="tok"><div class="sample" style="background: var(--accent-hover);"></div><code>--accent-hover</code></div>
|
|
50
|
+
<div class="tok"><div class="sample" style="background: var(--accent-active);"></div><code>--accent-active</code></div>
|
|
51
|
+
<div class="tok"><div class="sample" style="background: var(--status-success);"></div><code>--status-success</code></div>
|
|
52
|
+
<div class="tok"><div class="sample" style="background: var(--status-warn);"></div><code>--status-warn</code></div>
|
|
53
|
+
<div class="tok"><div class="sample" style="background: var(--status-error);"></div><code>--status-error</code></div>
|
|
54
|
+
<div class="tok"><div class="sample" style="background: var(--status-info);"></div><code>--status-info</code></div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<h2>Radii</h2>
|
|
58
|
+
<div class="token-grid">
|
|
59
|
+
<div class="tok"><div class="sample" style="background: var(--accent); border-radius: var(--radius-xs);"></div><code>--radius-xs</code></div>
|
|
60
|
+
<div class="tok"><div class="sample" style="background: var(--accent); border-radius: var(--radius-sm);"></div><code>--radius-sm</code></div>
|
|
61
|
+
<div class="tok"><div class="sample" style="background: var(--accent); border-radius: var(--radius-md);"></div><code>--radius-md</code></div>
|
|
62
|
+
<div class="tok"><div class="sample" style="background: var(--accent); border-radius: var(--radius-lg);"></div><code>--radius-lg</code></div>
|
|
63
|
+
<div class="tok"><div class="sample" style="background: var(--accent); border-radius: var(--radius-xl);"></div><code>--radius-xl</code></div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<h2>Type scale</h2>
|
|
67
|
+
<div style="display: grid; gap: 6px; margin: 0 0 32px;">
|
|
68
|
+
<div style="font-size: var(--type-xs); line-height: var(--lh-xs);">--type-xs · The quick brown fox</div>
|
|
69
|
+
<div style="font-size: var(--type-sm); line-height: var(--lh-sm);">--type-sm · The quick brown fox</div>
|
|
70
|
+
<div style="font-size: var(--type-base); line-height: var(--lh-base);">--type-base · The quick brown fox</div>
|
|
71
|
+
<div style="font-size: var(--type-md); line-height: var(--lh-md);">--type-md · The quick brown fox</div>
|
|
72
|
+
<div style="font-size: var(--type-lg); line-height: var(--lh-lg);">--type-lg · The quick brown fox</div>
|
|
73
|
+
<div style="font-size: var(--type-xl); line-height: var(--lh-xl);">--type-xl · The quick brown fox</div>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<h2>Motion</h2>
|
|
77
|
+
<p style="color: var(--fg-1);"><code>--dur-flip</code> · <code>--dur-panel</code> · <code>--dur-route</code> · <code>--dur-soft</code> · <code>--ease-out</code> · <code>--ease-in-out</code> — see <a href="../core/preview/motion.html">motion specimen</a> for live demos.</p>
|
|
78
|
+
</main>
|
|
79
|
+
</body>
|
|
80
|
+
</html>
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: pattern-auth
|
|
3
|
+
DEMONSTRATES: sign-in, sign-up, forgot-password screens; oauth provider buttons; magic link variant
|
|
4
|
+
COMPOSITION: 3 auth screens side-by-side with consistent shell (logo + title + form + footer link)
|
|
5
|
+
COPY VOICE: terse + literal ("Sign in", "Create account", "Send reset link")
|
|
6
|
+
WHEN SCAFFOLDED: patterns (universal — most products need auth)
|
|
7
|
+
NOTES: Single-column always (don't make people scroll horizontally to log in). OAuth buttons go above the email/password split with an "or continue with email" divider. Forgot link goes below the form, not inline with the password field.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Pattern — auth</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.auth { background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-lg); padding: 32px; max-width: 360px; margin: 0; box-shadow: var(--shadow-md); }
|
|
18
|
+
.auth .logo { width: 36px; height: 36px; background: var(--accent); border-radius: var(--radius-sm); margin: 0 0 20px; }
|
|
19
|
+
.auth h2 { margin: 0 0 6px; font-family: var(--font-display); font-size: var(--type-xl); font-weight: 600; }
|
|
20
|
+
.auth .sub { color: var(--fg-1); margin: 0 0 20px; font-size: var(--type-sm); }
|
|
21
|
+
.auth input { background: var(--bg-3); color: var(--fg-0); border: 1px solid var(--border-default); padding: 10px 12px; border-radius: var(--radius-sm); font: inherit; width: 100%; margin: 0 0 10px; box-sizing: border-box; }
|
|
22
|
+
.auth button.primary { background: var(--accent); color: var(--accent-fg); border: 0; padding: 10px 16px; border-radius: var(--radius-sm); font: inherit; width: 100%; cursor: pointer; }
|
|
23
|
+
.auth .oauth { display: flex; gap: 8px; margin: 0 0 14px; }
|
|
24
|
+
.auth .oauth button { flex: 1; background: var(--bg-3); border: 1px solid var(--border-default); color: var(--fg-0); padding: 8px 10px; border-radius: var(--radius-sm); font: inherit; cursor: pointer; }
|
|
25
|
+
.divider { display: flex; align-items: center; gap: 12px; color: var(--fg-2); font-size: var(--type-xs); margin: 0 0 14px; }
|
|
26
|
+
.divider::before, .divider::after { content: ''; flex: 1; height: 1px; background: var(--border-subtle); }
|
|
27
|
+
.footer { margin-top: 16px; text-align: center; font-size: var(--type-sm); color: var(--fg-2); }
|
|
28
|
+
.footer a { color: var(--accent); text-decoration: none; }
|
|
29
|
+
</style>
|
|
30
|
+
</head>
|
|
31
|
+
<body class="app" data-theme="dark">
|
|
32
|
+
<main class="specimen">
|
|
33
|
+
<h1>Auth screens</h1>
|
|
34
|
+
<p class="lede">Sign-in, sign-up, forgot-password — single-column, OAuth above email split, footer link below the primary action.</p>
|
|
35
|
+
|
|
36
|
+
<div class="row" style="gap: 16px; align-items: flex-start;">
|
|
37
|
+
<div class="auth">
|
|
38
|
+
<div class="logo"></div>
|
|
39
|
+
<h2>Sign in</h2>
|
|
40
|
+
<p class="sub">Welcome back — pick up where you left off.</p>
|
|
41
|
+
<div class="oauth">
|
|
42
|
+
<button>Continue with Google</button>
|
|
43
|
+
<button>SSO</button>
|
|
44
|
+
</div>
|
|
45
|
+
<div class="divider">or continue with email</div>
|
|
46
|
+
<input type="email" placeholder="Email" value="kim@fc-riverside.club" />
|
|
47
|
+
<input type="password" placeholder="Password" value="••••••••" />
|
|
48
|
+
<button class="primary">Sign in</button>
|
|
49
|
+
<div class="footer">Forgot password? · <a href="#">Reset it</a></div>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<div class="auth">
|
|
53
|
+
<div class="logo"></div>
|
|
54
|
+
<h2>Create account</h2>
|
|
55
|
+
<p class="sub">Two minutes. Then your squad is in.</p>
|
|
56
|
+
<div class="oauth">
|
|
57
|
+
<button>Continue with Google</button>
|
|
58
|
+
</div>
|
|
59
|
+
<div class="divider">or sign up with email</div>
|
|
60
|
+
<input type="text" placeholder="Full name" />
|
|
61
|
+
<input type="email" placeholder="Email" />
|
|
62
|
+
<input type="password" placeholder="Password (8+ chars)" />
|
|
63
|
+
<button class="primary">Create account</button>
|
|
64
|
+
<div class="footer">Already have an account? · <a href="#">Sign in</a></div>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<div class="auth">
|
|
68
|
+
<div class="logo"></div>
|
|
69
|
+
<h2>Reset password</h2>
|
|
70
|
+
<p class="sub">We'll email you a one-time link.</p>
|
|
71
|
+
<input type="email" placeholder="Email" />
|
|
72
|
+
<button class="primary">Send reset link</button>
|
|
73
|
+
<div class="footer">Remember it? · <a href="#">Sign in</a></div>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</main>
|
|
77
|
+
</body>
|
|
78
|
+
</html>
|
package/plugins/design/templates/design-system-inspiration/patterns/patterns-data-density.html
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: pattern-data-density
|
|
3
|
+
DEMONSTRATES: same data rendered at 3 densities — sparse (consumer), default (pro), compact (admin)
|
|
4
|
+
COMPOSITION: same 5-row dataset shown in 3 visual densities, with the same tokens but different padding/typography
|
|
5
|
+
COPY VOICE: identical strings across all three (only density differs)
|
|
6
|
+
WHEN SCAFFOLDED: patterns (cross-audience — useful for any project that has multiple surface densities)
|
|
7
|
+
NOTES: Density is mostly --space-* + --type-* choices. Don't change tokens — change which tokens you reach for. Sparse uses --space-4/5 + --type-md; default uses --space-2/3 + --type-sm; compact uses --space-1/2 + --type-xs.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Pattern — data density</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.density-card { background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 16px; max-width: 480px; margin: 0 0 24px; }
|
|
18
|
+
.density-card h3 { margin: 0 0 12px; font-size: var(--type-sm); color: var(--fg-2); text-transform: uppercase; letter-spacing: 0.04em; }
|
|
19
|
+
|
|
20
|
+
.sparse .row { padding: 16px 0; border-bottom: 1px solid var(--border-subtle); font-size: var(--type-md); }
|
|
21
|
+
.default .row { padding: 8px 0; border-bottom: 1px solid var(--border-subtle); font-size: var(--type-sm); }
|
|
22
|
+
.compact .row { padding: 4px 0; border-bottom: 1px solid var(--border-subtle); font-size: var(--type-xs); font-family: var(--font-mono); }
|
|
23
|
+
.row:last-child { border-bottom: 0; }
|
|
24
|
+
.row { display: grid; grid-template-columns: 1fr 60px 60px; gap: 12px; align-items: center; }
|
|
25
|
+
.num { text-align: right; font-variant-numeric: tabular-nums; color: var(--fg-1); }
|
|
26
|
+
</style>
|
|
27
|
+
</head>
|
|
28
|
+
<body class="app" data-theme="dark">
|
|
29
|
+
<main class="specimen">
|
|
30
|
+
<h1>Data density</h1>
|
|
31
|
+
<p class="lede">Same dataset, three densities. Density isn't a token — it's a pattern of which tokens you choose. Sparse for consumer dashboards, default for working surfaces, compact for power-user admin views.</p>
|
|
32
|
+
|
|
33
|
+
<div class="density-card sparse">
|
|
34
|
+
<h3>Sparse · consumer</h3>
|
|
35
|
+
<div class="row"><span>Kim Park · #9</span><span class="num">24</span><span class="num">14</span></div>
|
|
36
|
+
<div class="row"><span>Jonas Weber · #14</span><span class="num">22</span><span class="num">3</span></div>
|
|
37
|
+
<div class="row"><span>Marta Silva · #4</span><span class="num">23</span><span class="num">1</span></div>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<div class="density-card default">
|
|
41
|
+
<h3>Default · pro</h3>
|
|
42
|
+
<div class="row"><span>Kim Park · #9</span><span class="num">24</span><span class="num">14</span></div>
|
|
43
|
+
<div class="row"><span>Jonas Weber · #14</span><span class="num">22</span><span class="num">3</span></div>
|
|
44
|
+
<div class="row"><span>Marta Silva · #4</span><span class="num">23</span><span class="num">1</span></div>
|
|
45
|
+
<div class="row"><span>Liam Chen · #1</span><span class="num">19</span><span class="num">0</span></div>
|
|
46
|
+
<div class="row"><span>Sara Novak · #11</span><span class="num">20</span><span class="num">8</span></div>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<div class="density-card compact">
|
|
50
|
+
<h3>Compact · admin</h3>
|
|
51
|
+
<div class="row"><span>kpark #9</span><span class="num">24</span><span class="num">14</span></div>
|
|
52
|
+
<div class="row"><span>jweber #14</span><span class="num">22</span><span class="num">3</span></div>
|
|
53
|
+
<div class="row"><span>msilva #4</span><span class="num">23</span><span class="num">1</span></div>
|
|
54
|
+
<div class="row"><span>lchen #1</span><span class="num">19</span><span class="num">0</span></div>
|
|
55
|
+
<div class="row"><span>snovak #11</span><span class="num">20</span><span class="num">8</span></div>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<footer class="legend"><p>Compact uses --font-mono for the names — they're identifiers in this density, not display strings. The padding choice is doing the work, not the font.</p></footer>
|
|
59
|
+
</main>
|
|
60
|
+
</body>
|
|
61
|
+
</html>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: pattern-error-pages
|
|
3
|
+
DEMONSTRATES: 404, 500, offline, maintenance — full-page error variants
|
|
4
|
+
COMPOSITION: 4 stacked frames each showing one error type with status code + headline + body + CTA
|
|
5
|
+
COPY VOICE: friendly + specific ("Can't find the canvas you're looking for") — never "404 not found"
|
|
6
|
+
WHEN SCAFFOLDED: patterns (universal)
|
|
7
|
+
NOTES: Use status numbers as the eyebrow, not the headline. Headline names what's wrong in plain language. Body explains and sometimes apologizes (not always — only when fault is ours). CTA = "what now": go home, retry, status page.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Pattern — error pages</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.err-page { background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-lg); padding: 64px 32px; text-align: center; margin: 0 0 16px; max-width: 600px; }
|
|
18
|
+
.err-page .eyebrow { font-size: var(--type-xs); text-transform: uppercase; letter-spacing: 0.08em; color: var(--fg-2); font-family: var(--font-mono); margin-bottom: 8px; }
|
|
19
|
+
.err-page h2 { font-family: var(--font-display); font-size: var(--type-2xl); font-weight: 600; margin: 0 0 12px; }
|
|
20
|
+
.err-page p { color: var(--fg-1); margin: 0 0 24px; max-width: 40ch; margin-left: auto; margin-right: auto; }
|
|
21
|
+
.err-page .actions { display: flex; justify-content: center; gap: 12px; }
|
|
22
|
+
.btn-primary { background: var(--accent); color: var(--accent-fg); border: 0; padding: 8px 16px; border-radius: var(--radius-sm); font: inherit; }
|
|
23
|
+
.btn-secondary { background: transparent; color: var(--fg-1); border: 1px solid var(--border-default); padding: 8px 16px; border-radius: var(--radius-sm); font: inherit; }
|
|
24
|
+
</style>
|
|
25
|
+
</head>
|
|
26
|
+
<body class="app" data-theme="dark">
|
|
27
|
+
<main class="specimen">
|
|
28
|
+
<h1>Error pages</h1>
|
|
29
|
+
<p class="lede">Four full-page errors. Each names what went wrong in plain language, then offers a concrete next step.</p>
|
|
30
|
+
|
|
31
|
+
<div class="err-page">
|
|
32
|
+
<div class="eyebrow">404</div>
|
|
33
|
+
<h2>Can't find that canvas</h2>
|
|
34
|
+
<p>It might have been renamed, archived, or never existed. Check the canvas index, or start a new one.</p>
|
|
35
|
+
<div class="actions">
|
|
36
|
+
<button class="btn-primary">Go to canvases</button>
|
|
37
|
+
<button class="btn-secondary">New canvas</button>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<div class="err-page">
|
|
42
|
+
<div class="eyebrow">500</div>
|
|
43
|
+
<h2>Something broke on our end</h2>
|
|
44
|
+
<p>We've logged it. Try again in a moment — if it persists, check the status page.</p>
|
|
45
|
+
<div class="actions">
|
|
46
|
+
<button class="btn-primary">Try again</button>
|
|
47
|
+
<button class="btn-secondary">Status page</button>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<div class="err-page">
|
|
52
|
+
<div class="eyebrow">offline</div>
|
|
53
|
+
<h2>You're offline</h2>
|
|
54
|
+
<p>Recent edits are saved locally — they'll sync when the connection comes back.</p>
|
|
55
|
+
<div class="actions">
|
|
56
|
+
<button class="btn-primary">Retry now</button>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div class="err-page">
|
|
61
|
+
<div class="eyebrow">maintenance</div>
|
|
62
|
+
<h2>Quick tune-up in progress</h2>
|
|
63
|
+
<p>We're rolling out faster sync. Should take about 5 minutes — your data is safe.</p>
|
|
64
|
+
<div class="actions">
|
|
65
|
+
<button class="btn-secondary">Status page</button>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
</main>
|
|
69
|
+
</body>
|
|
70
|
+
</html>
|
package/plugins/design/templates/design-system-inspiration/patterns/patterns-form-layouts.html
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: pattern-form-layouts
|
|
3
|
+
DEMONSTRATES: 4 form layout patterns — single column, two column, inline labels, floating labels
|
|
4
|
+
COMPOSITION: 4 mini-forms each demonstrating one layout strategy
|
|
5
|
+
COPY VOICE: real product fields (Email, Squad role, Birth year, …)
|
|
6
|
+
WHEN SCAFFOLDED: patterns (universal — every project has forms)
|
|
7
|
+
NOTES: Single-column is the default — easiest to scan, works on mobile. Two-column only for closely-related pairs (first / last name). Inline labels for compact admin tables. Floating labels for short forms with strong design opinions.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Pattern — form layouts</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.form { background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 20px; max-width: 480px; margin: 0 0 24px; }
|
|
18
|
+
.field { display: grid; gap: 4px; margin: 0 0 14px; }
|
|
19
|
+
.field label { font-size: var(--type-sm); color: var(--fg-1); }
|
|
20
|
+
.field input, .field select { background: var(--bg-3); color: var(--fg-0); border: 1px solid var(--border-default); padding: 8px 10px; border-radius: var(--radius-sm); font: inherit; }
|
|
21
|
+
.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 0 0 14px; }
|
|
22
|
+
.inline-field { display: grid; grid-template-columns: 140px 1fr; gap: 12px; align-items: center; padding: 8px 0; border-bottom: 1px solid var(--border-subtle); }
|
|
23
|
+
.inline-field:last-child { border-bottom: 0; }
|
|
24
|
+
.float-field { position: relative; margin: 0 0 14px; }
|
|
25
|
+
.float-field input { width: 100%; padding: 18px 10px 6px; box-sizing: border-box; }
|
|
26
|
+
.float-field label { position: absolute; top: 12px; left: 10px; font-size: var(--type-sm); color: var(--fg-2); transition: all var(--dur-flip) var(--ease-out); pointer-events: none; }
|
|
27
|
+
.float-field.is-filled label, .float-field input:focus + label { top: 4px; font-size: 10px; color: var(--accent); }
|
|
28
|
+
</style>
|
|
29
|
+
</head>
|
|
30
|
+
<body class="app" data-theme="dark">
|
|
31
|
+
<main class="specimen">
|
|
32
|
+
<h1>Form layouts</h1>
|
|
33
|
+
<p class="lede">Single-column is the default. The other three (two-column, inline-label, floating-label) exist for specific contexts.</p>
|
|
34
|
+
|
|
35
|
+
<h2>1. Single column (default)</h2>
|
|
36
|
+
<form class="form">
|
|
37
|
+
<div class="field"><label>Email</label><input type="email" value="kim@fc-riverside.club" /></div>
|
|
38
|
+
<div class="field"><label>Squad role</label><input type="text" value="Captain" /></div>
|
|
39
|
+
<div class="field"><label>Birth year</label><input type="text" value="2005" /></div>
|
|
40
|
+
<button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 8px 14px; border-radius: var(--radius-sm); font: inherit; margin-top: 4px;">Save</button>
|
|
41
|
+
</form>
|
|
42
|
+
|
|
43
|
+
<h2>2. Two column (related pairs)</h2>
|
|
44
|
+
<form class="form">
|
|
45
|
+
<div class="two-col">
|
|
46
|
+
<div class="field"><label>First name</label><input type="text" value="Kim" /></div>
|
|
47
|
+
<div class="field"><label>Last name</label><input type="text" value="Park" /></div>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="two-col">
|
|
50
|
+
<div class="field"><label>City</label><input type="text" value="Prague" /></div>
|
|
51
|
+
<div class="field"><label>Postal code</label><input type="text" value="11000" /></div>
|
|
52
|
+
</div>
|
|
53
|
+
</form>
|
|
54
|
+
|
|
55
|
+
<h2>3. Inline labels (settings panel)</h2>
|
|
56
|
+
<form class="form">
|
|
57
|
+
<div class="inline-field"><label style="font-size: var(--type-sm); color: var(--fg-1);">Notifications</label><div><input type="checkbox" checked /> Match results</div></div>
|
|
58
|
+
<div class="inline-field"><label style="font-size: var(--type-sm); color: var(--fg-1);">Theme</label><select><option>System</option><option>Dark</option><option>Light</option></select></div>
|
|
59
|
+
<div class="inline-field"><label style="font-size: var(--type-sm); color: var(--fg-1);">Time zone</label><select><option>Europe/Prague</option></select></div>
|
|
60
|
+
</form>
|
|
61
|
+
|
|
62
|
+
<h2>4. Floating labels (compact, short forms)</h2>
|
|
63
|
+
<form class="form">
|
|
64
|
+
<div class="float-field is-filled"><input type="text" value="kim@fc-riverside.club" id="ff1" /><label for="ff1">Email</label></div>
|
|
65
|
+
<div class="float-field is-filled"><input type="text" value="••••••••" id="ff2" /><label for="ff2">Password</label></div>
|
|
66
|
+
<button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 8px 14px; border-radius: var(--radius-sm); font: inherit; width: 100%;">Sign in</button>
|
|
67
|
+
</form>
|
|
68
|
+
</main>
|
|
69
|
+
</body>
|
|
70
|
+
</html>
|