@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,63 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: platform-mobile-bottom-sheet
|
|
3
|
+
DEMONSTRATES: bottom-anchored sheet with drag handle, snap points (peek / half / full), safe-area padding
|
|
4
|
+
COMPOSITION: mobile chrome frame (375x812) with a half-snapped bottom sheet + peek state hint
|
|
5
|
+
COPY VOICE: action-verb titles, terse body
|
|
6
|
+
WHEN SCAFFOLDED: platform-mobile
|
|
7
|
+
NOTES: Drag handle is a 36x4px pill, --fg-3 color, centered. Sheet has rounded top corners (--radius-lg) only — bottom is flush. Backdrop is partially transparent so user knows there's content beneath.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Platform mobile — bottom sheet</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.mobile-frame { width: 375px; height: 600px; background: var(--bg-0); border: 1px solid var(--border-strong); border-radius: 32px; margin: 16px 0; position: relative; overflow: hidden; }
|
|
18
|
+
.status-bar { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; color: var(--fg-1); font-size: var(--type-xs); }
|
|
19
|
+
.content { padding: 16px 20px; }
|
|
20
|
+
.sheet { position: absolute; left: 0; right: 0; bottom: 0; background: var(--bg-1); border-radius: var(--radius-lg) var(--radius-lg) 0 0; border-top: 1px solid var(--border-default); box-shadow: var(--shadow-lg); padding: 8px 20px 24px; }
|
|
21
|
+
.handle { width: 36px; height: 4px; background: var(--fg-3); border-radius: var(--radius-pill); margin: 0 auto 12px; }
|
|
22
|
+
.veil { position: absolute; inset: 0; background: oklch(0 0 0 / 0.4); }
|
|
23
|
+
</style>
|
|
24
|
+
</head>
|
|
25
|
+
<body class="app" data-theme="dark">
|
|
26
|
+
<main class="specimen">
|
|
27
|
+
<h1>Bottom sheet</h1>
|
|
28
|
+
<p class="lede">Mobile bottom-anchored sheet with snap points — peek, half, full. Drag handle is the universal "I can be dragged" signal. Three snap states keep the sheet predictable.</p>
|
|
29
|
+
|
|
30
|
+
<div class="row" style="gap: 24px; align-items: flex-start;">
|
|
31
|
+
<div class="mobile-frame">
|
|
32
|
+
<div class="status-bar"><span>9:41</span><span>●</span></div>
|
|
33
|
+
<div class="content">
|
|
34
|
+
<h3 style="margin: 0 0 8px;">Roster</h3>
|
|
35
|
+
<p style="color: var(--fg-1); margin: 0;">24 players · last synced 2m ago</p>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="veil"></div>
|
|
38
|
+
<div class="sheet" style="height: 50%;">
|
|
39
|
+
<div class="handle"></div>
|
|
40
|
+
<strong style="display: block; margin-bottom: 4px;">Edit player</strong>
|
|
41
|
+
<div style="color: var(--fg-1); font-size: var(--type-sm); margin-bottom: 16px;">Kim Park · #9 · captain</div>
|
|
42
|
+
<button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 10px 16px; border-radius: var(--radius-md); font: inherit; width: 100%;">Save changes</button>
|
|
43
|
+
<button style="background: transparent; color: var(--fg-1); border: 0; padding: 10px 16px; font: inherit; width: 100%; margin-top: 4px;">Cancel</button>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div class="mobile-frame">
|
|
48
|
+
<div class="status-bar"><span>9:41</span><span>●</span></div>
|
|
49
|
+
<div class="content">
|
|
50
|
+
<h3 style="margin: 0 0 8px;">Match recap</h3>
|
|
51
|
+
<p style="color: var(--fg-1); margin: 0;">vs. Sparta U17 · final 3-1</p>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="sheet" style="height: 96px;">
|
|
54
|
+
<div class="handle"></div>
|
|
55
|
+
<strong>Pull up for details</strong>
|
|
56
|
+
<div style="color: var(--fg-2); font-size: var(--type-xs); margin-top: 2px;">Stats · highlights · player ratings</div>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
<footer class="legend"><p>Snap points: peek (96px, hint), half (50%, primary), full (90%, immersive). Don't expose more than 3 — sheets aren't pages.</p></footer>
|
|
61
|
+
</main>
|
|
62
|
+
</body>
|
|
63
|
+
</html>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: platform-mobile-pull-to-refresh
|
|
3
|
+
DEMONSTRATES: 3 states of pull-to-refresh — idle, pulling (threshold), refreshing
|
|
4
|
+
COMPOSITION: mobile-frame mock × 3 states with chevron / spinner indicator
|
|
5
|
+
COPY VOICE: silent or 1-word ("Refreshing")
|
|
6
|
+
WHEN SCAFFOLDED: platform-mobile
|
|
7
|
+
NOTES: Threshold is ~80px pull. Indicator (chevron) rotates 180° when crossed. After release, spinner replaces chevron until data loads. Don't auto-fire — user gesture only.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Platform mobile — pull to refresh</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.mobile-frame { width: 280px; height: 480px; background: var(--bg-0); border: 1px solid var(--border-strong); border-radius: 32px; position: relative; overflow: hidden; }
|
|
18
|
+
.status-bar { height: 44px; display: flex; align-items: center; padding: 0 20px; color: var(--fg-1); font-size: var(--type-xs); justify-content: space-between; }
|
|
19
|
+
.ptr-indicator { display: flex; justify-content: center; align-items: center; height: 60px; color: var(--fg-2); font-size: var(--type-xs); flex-direction: column; gap: 4px; }
|
|
20
|
+
.ptr-indicator svg { transition: transform var(--dur-flip) var(--ease-out); }
|
|
21
|
+
.ptr-indicator.is-pull svg { transform: rotate(180deg); color: var(--accent); }
|
|
22
|
+
.ptr-content { padding: 12px 20px; }
|
|
23
|
+
.ptr-content .item { padding: 12px 0; border-bottom: 1px solid var(--border-subtle); }
|
|
24
|
+
.ptr-content .item:last-child { border-bottom: 0; }
|
|
25
|
+
.spinner { width: 18px; height: 18px; border: 2px solid var(--bg-3); border-top-color: var(--accent); border-radius: 50%; animation: spin var(--dur-route) linear infinite; }
|
|
26
|
+
@keyframes spin { to { transform: rotate(360deg); } }
|
|
27
|
+
@media (prefers-reduced-motion: reduce) { .spinner { animation: none; } }
|
|
28
|
+
</style>
|
|
29
|
+
</head>
|
|
30
|
+
<body class="app" data-theme="dark">
|
|
31
|
+
<main class="specimen">
|
|
32
|
+
<h1>Pull to refresh</h1>
|
|
33
|
+
<p class="lede">Three states: idle (no indicator), pulling past threshold (chevron rotated, accent color, "Release to refresh"), refreshing (spinner replaces chevron until done).</p>
|
|
34
|
+
|
|
35
|
+
<div class="row" style="gap: 16px; align-items: flex-start;">
|
|
36
|
+
<div class="mobile-frame">
|
|
37
|
+
<div class="status-bar"><span>9:41</span><span>●</span></div>
|
|
38
|
+
<div class="ptr-content">
|
|
39
|
+
<div class="item">Match recap · 19:42</div>
|
|
40
|
+
<div class="item">Roster updated · 18:15</div>
|
|
41
|
+
<div class="item">Captain assigned · 17:30</div>
|
|
42
|
+
</div>
|
|
43
|
+
<div style="position: absolute; bottom: 12px; left: 0; right: 0; text-align: center; color: var(--fg-2); font-size: var(--type-xs);">idle</div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<div class="mobile-frame">
|
|
47
|
+
<div class="status-bar"><span>9:41</span><span>●</span></div>
|
|
48
|
+
<div class="ptr-indicator is-pull">
|
|
49
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M6 9l6 6 6-6"/></svg>
|
|
50
|
+
<span style="color: var(--accent);">Release to refresh</span>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="ptr-content" style="margin-top: 12px;">
|
|
53
|
+
<div class="item">Match recap · 19:42</div>
|
|
54
|
+
<div class="item">Roster updated · 18:15</div>
|
|
55
|
+
</div>
|
|
56
|
+
<div style="position: absolute; bottom: 12px; left: 0; right: 0; text-align: center; color: var(--fg-2); font-size: var(--type-xs);">pulling past threshold</div>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div class="mobile-frame">
|
|
60
|
+
<div class="status-bar"><span>9:41</span><span>●</span></div>
|
|
61
|
+
<div class="ptr-indicator">
|
|
62
|
+
<div class="spinner"></div>
|
|
63
|
+
<span>Refreshing</span>
|
|
64
|
+
</div>
|
|
65
|
+
<div class="ptr-content" style="margin-top: 12px;">
|
|
66
|
+
<div class="item">Match recap · 19:42</div>
|
|
67
|
+
<div class="item">Roster updated · 18:15</div>
|
|
68
|
+
</div>
|
|
69
|
+
<div style="position: absolute; bottom: 12px; left: 0; right: 0; text-align: center; color: var(--fg-2); font-size: var(--type-xs);">refreshing</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
</main>
|
|
73
|
+
</body>
|
|
74
|
+
</html>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: platform-mobile-segmented-control
|
|
3
|
+
DEMONSTRATES: iOS-style segmented control (pill background, active segment with bg + shadow), 2/3/4-segment variants
|
|
4
|
+
COMPOSITION: 3 segmented controls (2-segment toggle, 3-segment date range, 4-segment filter) on mobile chrome
|
|
5
|
+
COPY VOICE: 1-word labels ("Today", "Week", "Month", "All time")
|
|
6
|
+
WHEN SCAFFOLDED: platform-mobile (and desktop where Apple-aesthetic matters)
|
|
7
|
+
NOTES: Background of the unselected track is --bg-3; active segment is --bg-1 (lifts forward via small shadow). Border between segments is implicit (track padding does the work). Animate transform on the active indicator, not background.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Platform mobile — segmented control</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.seg { display: inline-flex; background: var(--bg-3); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: 3px; gap: 2px; }
|
|
18
|
+
.seg button { background: transparent; border: 0; color: var(--fg-1); font: inherit; font-size: var(--type-sm); padding: 5px 14px; border-radius: calc(var(--radius-md) - 3px); cursor: pointer; transition: background var(--dur-flip) var(--ease-out); }
|
|
19
|
+
.seg button.is-active { background: var(--bg-1); color: var(--fg-0); box-shadow: var(--shadow-sm); font-weight: 500; }
|
|
20
|
+
</style>
|
|
21
|
+
</head>
|
|
22
|
+
<body class="app" data-theme="dark">
|
|
23
|
+
<main class="specimen">
|
|
24
|
+
<h1>Segmented control</h1>
|
|
25
|
+
<p class="lede">Pill-tracked, active segment lifts forward with a soft shadow. Use for view-mode switches (List / Grid), date ranges (Today / Week / Month), and filter sets — never for primary actions.</p>
|
|
26
|
+
|
|
27
|
+
<h2>2-segment toggle</h2>
|
|
28
|
+
<div class="seg">
|
|
29
|
+
<button class="is-active">List</button>
|
|
30
|
+
<button>Grid</button>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<h2>3-segment date range</h2>
|
|
34
|
+
<div class="seg">
|
|
35
|
+
<button>Today</button>
|
|
36
|
+
<button class="is-active">Week</button>
|
|
37
|
+
<button>Month</button>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<h2>4-segment filter</h2>
|
|
41
|
+
<div class="seg">
|
|
42
|
+
<button class="is-active">All</button>
|
|
43
|
+
<button>Live</button>
|
|
44
|
+
<button>Upcoming</button>
|
|
45
|
+
<button>Past</button>
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<footer class="legend"><p>If you have 5+ segments, switch to <code>components-tabs</code> — segmented controls degrade in usability past 4. Tabs scroll; segmented controls don't.</p></footer>
|
|
49
|
+
</main>
|
|
50
|
+
</body>
|
|
51
|
+
</html>
|
package/plugins/design/templates/design-system-inspiration/platform-mobile/components-tab-bar.html
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: platform-mobile-tab-bar
|
|
3
|
+
DEMONSTRATES: bottom tab bar with 4-5 tabs, icon + label, active state via accent color (not background fill), safe-area padding for home indicator
|
|
4
|
+
COMPOSITION: mobile frame with 5-tab bar, one tab active; second frame shows 4-tab variant (more common for simpler apps)
|
|
5
|
+
COPY VOICE: 1-word tab labels ("Roster", "Stats", "Profile") — never 2-3 word labels
|
|
6
|
+
WHEN SCAFFOLDED: platform-mobile
|
|
7
|
+
NOTES: Tab labels stay always-visible (Material 3 / iOS HIG agree on this). Active state uses --accent for icon + label color, not for the background. Bottom safe-area = 34px on iPhone (home indicator).
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Platform mobile — tab bar</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.mobile-frame { width: 320px; height: 520px; background: var(--bg-0); border: 1px solid var(--border-strong); border-radius: 32px; position: relative; overflow: hidden; }
|
|
18
|
+
.status-bar { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; color: var(--fg-1); font-size: var(--type-xs); }
|
|
19
|
+
.body { height: calc(100% - 44px - 84px); padding: 16px 20px; }
|
|
20
|
+
.tab-bar { position: absolute; bottom: 0; left: 0; right: 0; display: flex; background: var(--bg-1); border-top: 1px solid var(--border-default); padding: 8px 0 34px; }
|
|
21
|
+
.tab { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 4px; color: var(--fg-2); font-size: var(--type-xs); cursor: pointer; }
|
|
22
|
+
.tab.is-active { color: var(--accent); }
|
|
23
|
+
.tab svg { color: currentColor; }
|
|
24
|
+
</style>
|
|
25
|
+
</head>
|
|
26
|
+
<body class="app" data-theme="dark">
|
|
27
|
+
<main class="specimen">
|
|
28
|
+
<h1>Tab bar</h1>
|
|
29
|
+
<p class="lede">Bottom tabs on mobile. Labels stay always visible — never hide them, no matter how small the screen. Active state colors icon + label with the accent; never fills the background.</p>
|
|
30
|
+
|
|
31
|
+
<div class="row" style="gap: 24px; align-items: flex-start;">
|
|
32
|
+
<div class="mobile-frame">
|
|
33
|
+
<div class="status-bar"><span>9:41</span><span>●</span></div>
|
|
34
|
+
<div class="body"><h3 style="margin: 0;">Roster</h3><p style="color: var(--fg-1); margin: 4px 0 0;">24 players · 12 available</p></div>
|
|
35
|
+
<nav class="tab-bar">
|
|
36
|
+
<div class="tab is-active"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M3 6h18M3 12h18M3 18h18"/></svg><span>Roster</span></div>
|
|
37
|
+
<div class="tab"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M3 18V8M9 18V4M15 18v-7M21 18V12"/></svg><span>Stats</span></div>
|
|
38
|
+
<div class="tab"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="12" r="10"/><path d="M12 8v8M8 12h8"/></svg><span>Match</span></div>
|
|
39
|
+
<div class="tab"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/></svg><span>Inbox</span></div>
|
|
40
|
+
<div class="tab"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 4-7 8-7s8 3 8 7"/></svg><span>Profile</span></div>
|
|
41
|
+
</nav>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<div class="mobile-frame">
|
|
45
|
+
<div class="status-bar"><span>9:41</span><span>●</span></div>
|
|
46
|
+
<div class="body"><h3 style="margin: 0;">Match</h3></div>
|
|
47
|
+
<nav class="tab-bar">
|
|
48
|
+
<div class="tab"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M3 12l9-8 9 8M5 10v10h14V10"/></svg><span>Home</span></div>
|
|
49
|
+
<div class="tab"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="11" cy="11" r="7"/><path d="m20 20-3-3"/></svg><span>Search</span></div>
|
|
50
|
+
<div class="tab is-active"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 3"/></svg><span>Match</span></div>
|
|
51
|
+
<div class="tab"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 4-7 8-7s8 3 8 7"/></svg><span>Me</span></div>
|
|
52
|
+
</nav>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</main>
|
|
56
|
+
</body>
|
|
57
|
+
</html>
|
package/plugins/design/templates/design-system-inspiration/platform-mobile/ui_kits-mobile-index.html
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: platform-mobile-ui-kits-index
|
|
3
|
+
DEMONSTRATES: cover page for mobile UI kit — lists all mobile-specific specimens with thumbnails + links
|
|
4
|
+
COMPOSITION: index page with 5 mobile specimens (bottom-sheet, pull-to-refresh, tab-bar, segmented-control, …) each as a thumbnail card
|
|
5
|
+
COPY VOICE: terse — this is an index, not a tutorial
|
|
6
|
+
WHEN SCAFFOLDED: platform-mobile (only when project actually has mobile)
|
|
7
|
+
NOTES: This is the "ui_kits/mobile/index.html" entry point that the dev server links to. Each card links to a sub-specimen.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>UI kits — mobile</title>
|
|
14
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
15
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
16
|
+
<style>
|
|
17
|
+
.kit-card { background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 16px; text-decoration: none; color: inherit; display: grid; gap: 8px; transition: background var(--dur-flip) var(--ease-out), border-color var(--dur-flip) var(--ease-out); }
|
|
18
|
+
.kit-card:hover { background: var(--bg-2); border-color: var(--border-strong); }
|
|
19
|
+
.kit-card .thumb { height: 96px; background: var(--bg-3); border-radius: var(--radius-sm); display: flex; align-items: center; justify-content: center; color: var(--fg-2); font-size: var(--type-xs); }
|
|
20
|
+
.kit-card .title { font-weight: 500; }
|
|
21
|
+
.kit-card .body { color: var(--fg-1); font-size: var(--type-sm); margin: 0; }
|
|
22
|
+
</style>
|
|
23
|
+
</head>
|
|
24
|
+
<body class="app" data-theme="dark">
|
|
25
|
+
<main class="specimen">
|
|
26
|
+
<h1>Mobile UI kit</h1>
|
|
27
|
+
<p class="lede">Mobile-specific patterns — gestures, native chrome, safe areas. Browse + open each specimen below in the dev server.</p>
|
|
28
|
+
|
|
29
|
+
<div class="grid" style="grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));">
|
|
30
|
+
<a href="./components-bottom-sheet.html" class="kit-card">
|
|
31
|
+
<div class="thumb">▭▭▭</div>
|
|
32
|
+
<span class="title">Bottom sheet</span>
|
|
33
|
+
<p class="body">Drag handle, snap points, safe-area padding.</p>
|
|
34
|
+
</a>
|
|
35
|
+
<a href="./components-pull-to-refresh.html" class="kit-card">
|
|
36
|
+
<div class="thumb">↓ ↻</div>
|
|
37
|
+
<span class="title">Pull to refresh</span>
|
|
38
|
+
<p class="body">Idle / pulling / refreshing states.</p>
|
|
39
|
+
</a>
|
|
40
|
+
<a href="./components-tab-bar.html" class="kit-card">
|
|
41
|
+
<div class="thumb">▢▢▣▢▢</div>
|
|
42
|
+
<span class="title">Tab bar</span>
|
|
43
|
+
<p class="body">4–5 bottom tabs with always-visible labels.</p>
|
|
44
|
+
</a>
|
|
45
|
+
<a href="./components-segmented-control.html" class="kit-card">
|
|
46
|
+
<div class="thumb">▢▣▢</div>
|
|
47
|
+
<span class="title">Segmented control</span>
|
|
48
|
+
<p class="body">2–4 mutually exclusive options.</p>
|
|
49
|
+
</a>
|
|
50
|
+
<a href="../universal/components-dialogs.html" class="kit-card">
|
|
51
|
+
<div class="thumb">⬚</div>
|
|
52
|
+
<span class="title">Dialogs</span>
|
|
53
|
+
<p class="body">Modal, sheet, alert (shared with universal).</p>
|
|
54
|
+
</a>
|
|
55
|
+
</div>
|
|
56
|
+
</main>
|
|
57
|
+
</body>
|
|
58
|
+
</html>
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: ui_kits/mobile/index
|
|
3
|
+
DEMONSTRATES: Core tokens in a mobile product surface (375 × 812, iPhone-class artboard)
|
|
4
|
+
COMPOSITION: full-bleed mobile screen with top bar (status + nav), main scroll content (header + card list), bottom tab bar
|
|
5
|
+
- top bar (48px tall): back chevron + screen title centered + action button right
|
|
6
|
+
- main content: section header + scrollable card list with realistic data rows
|
|
7
|
+
- bottom tab bar (64px): 3–4 tabs with icon + label; active tab uses --accent
|
|
8
|
+
COPY VOICE: real product strings — same family-flavored copy as desktop counterpart; substitute during scaffold
|
|
9
|
+
WHEN SCAFFOLDED: conditional on Q3 platforms ∈ {mobile + desktop, tablet-first}
|
|
10
|
+
NOTES:
|
|
11
|
+
- Touch targets ≥ 44×44 — the tab bar items and the action button are sized accordingly.
|
|
12
|
+
- The card list is the primary content pattern on mobile; cards are full-width with 16px gutters.
|
|
13
|
+
- Bottom tab bar uses --bg-1 with a 1px top border in --border-subtle; the active tab is the only place --accent fills a region.
|
|
14
|
+
- This is a single-screen artboard, not a multi-screen flow — the bootstrap output shows the DS on one mobile surface to prove tokens compose at this size.
|
|
15
|
+
-->
|
|
16
|
+
<!doctype html>
|
|
17
|
+
<html lang="en">
|
|
18
|
+
<head>
|
|
19
|
+
<meta charset="utf-8" />
|
|
20
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
|
21
|
+
<title>UI kit · mobile · index</title>
|
|
22
|
+
<link rel="stylesheet" href="../core/colors_and_type.css" />
|
|
23
|
+
<link rel="stylesheet" href="../core/preview/_layout.css" />
|
|
24
|
+
<style>
|
|
25
|
+
body { padding: 0; margin: 0; background: oklch(8% 0.005 60); display: grid; place-items: start center; min-height: 100vh; }
|
|
26
|
+
.specimen { max-width: none; margin: 0; padding: var(--space-5) 0; }
|
|
27
|
+
|
|
28
|
+
.artboard {
|
|
29
|
+
width: 375px;
|
|
30
|
+
height: 812px;
|
|
31
|
+
background: var(--bg-0);
|
|
32
|
+
border: 1px solid var(--border-default);
|
|
33
|
+
border-radius: 40px;
|
|
34
|
+
overflow: hidden;
|
|
35
|
+
display: grid;
|
|
36
|
+
grid-template-rows: 48px 1fr 64px;
|
|
37
|
+
box-shadow: var(--shadow-lg);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.topbar {
|
|
41
|
+
display: flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
gap: var(--space-2);
|
|
44
|
+
padding: 0 var(--space-3);
|
|
45
|
+
background: var(--bg-1);
|
|
46
|
+
border-bottom: 1px solid var(--border-subtle);
|
|
47
|
+
}
|
|
48
|
+
.icon-btn {
|
|
49
|
+
min-width: 44px;
|
|
50
|
+
min-height: 44px;
|
|
51
|
+
display: grid;
|
|
52
|
+
place-items: center;
|
|
53
|
+
background: transparent;
|
|
54
|
+
border: 0;
|
|
55
|
+
color: var(--fg-1);
|
|
56
|
+
cursor: pointer;
|
|
57
|
+
border-radius: var(--radius-sm);
|
|
58
|
+
transition: background var(--dur-flip) var(--ease-out);
|
|
59
|
+
font-family: var(--font-mono);
|
|
60
|
+
font-size: var(--type-md);
|
|
61
|
+
}
|
|
62
|
+
.icon-btn:hover { background: var(--bg-2); color: var(--fg-0); }
|
|
63
|
+
.topbar .title {
|
|
64
|
+
flex: 1;
|
|
65
|
+
text-align: center;
|
|
66
|
+
font-family: var(--font-display);
|
|
67
|
+
font-size: var(--type-md);
|
|
68
|
+
font-weight: 600;
|
|
69
|
+
letter-spacing: var(--tracking-display);
|
|
70
|
+
color: var(--fg-0);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.main {
|
|
74
|
+
overflow-y: auto;
|
|
75
|
+
padding: var(--space-3);
|
|
76
|
+
}
|
|
77
|
+
.section-head {
|
|
78
|
+
display: flex;
|
|
79
|
+
justify-content: space-between;
|
|
80
|
+
align-items: baseline;
|
|
81
|
+
margin: 0 0 var(--space-3);
|
|
82
|
+
padding: 0 var(--space-2);
|
|
83
|
+
}
|
|
84
|
+
.section-head h2 {
|
|
85
|
+
font-family: var(--font-display);
|
|
86
|
+
font-size: var(--type-lg);
|
|
87
|
+
line-height: var(--lh-lg);
|
|
88
|
+
letter-spacing: var(--tracking-display);
|
|
89
|
+
font-weight: 600;
|
|
90
|
+
margin: 0;
|
|
91
|
+
color: var(--fg-0);
|
|
92
|
+
}
|
|
93
|
+
.section-head .meta {
|
|
94
|
+
font-family: var(--font-mono);
|
|
95
|
+
font-size: var(--type-xs);
|
|
96
|
+
color: var(--fg-2);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.row-card {
|
|
100
|
+
background: var(--bg-1);
|
|
101
|
+
border: 1px solid var(--border-subtle);
|
|
102
|
+
border-radius: var(--radius-md);
|
|
103
|
+
padding: var(--space-3) var(--space-4);
|
|
104
|
+
margin: 0 0 var(--space-2);
|
|
105
|
+
display: grid;
|
|
106
|
+
grid-template-columns: 36px 1fr auto;
|
|
107
|
+
align-items: center;
|
|
108
|
+
gap: var(--space-3);
|
|
109
|
+
transition: background var(--dur-flip) var(--ease-out);
|
|
110
|
+
}
|
|
111
|
+
.row-card:hover { background: var(--bg-2); }
|
|
112
|
+
.row-card .avatar {
|
|
113
|
+
width: 36px; height: 36px;
|
|
114
|
+
border-radius: var(--radius-pill);
|
|
115
|
+
background: var(--bg-3);
|
|
116
|
+
border: 1px solid var(--border-default);
|
|
117
|
+
display: grid; place-items: center;
|
|
118
|
+
color: var(--fg-0);
|
|
119
|
+
font-size: var(--type-xs);
|
|
120
|
+
font-weight: 600;
|
|
121
|
+
font-family: var(--font-mono);
|
|
122
|
+
}
|
|
123
|
+
.row-card .name { color: var(--fg-0); font-size: var(--type-sm); font-weight: 500; }
|
|
124
|
+
.row-card .sub { color: var(--fg-2); font-size: var(--type-xs); font-family: var(--font-mono); }
|
|
125
|
+
.row-card .stat { color: var(--accent); font-family: var(--font-mono); font-size: var(--type-sm); font-weight: 500; min-width: 44px; text-align: right; }
|
|
126
|
+
|
|
127
|
+
.tabbar {
|
|
128
|
+
display: grid;
|
|
129
|
+
grid-template-columns: repeat(4, 1fr);
|
|
130
|
+
background: var(--bg-1);
|
|
131
|
+
border-top: 1px solid var(--border-subtle);
|
|
132
|
+
}
|
|
133
|
+
.tab {
|
|
134
|
+
display: grid;
|
|
135
|
+
justify-items: center;
|
|
136
|
+
gap: 2px;
|
|
137
|
+
padding: var(--space-2) 0;
|
|
138
|
+
background: transparent;
|
|
139
|
+
border: 0;
|
|
140
|
+
cursor: pointer;
|
|
141
|
+
color: var(--fg-2);
|
|
142
|
+
font: inherit;
|
|
143
|
+
transition: color var(--dur-flip) var(--ease-out);
|
|
144
|
+
}
|
|
145
|
+
.tab .icon { font-family: var(--font-mono); font-size: var(--type-md); }
|
|
146
|
+
.tab .label { font-size: var(--type-xs); font-family: var(--font-mono); letter-spacing: var(--tracking-caps); text-transform: uppercase; }
|
|
147
|
+
.tab.is-active { color: var(--accent); }
|
|
148
|
+
</style>
|
|
149
|
+
</head>
|
|
150
|
+
<body class="app" data-theme="dark">
|
|
151
|
+
<main class="specimen">
|
|
152
|
+
<div class="artboard">
|
|
153
|
+
<header class="topbar">
|
|
154
|
+
<button class="icon-btn" aria-label="Back">←</button>
|
|
155
|
+
<div class="title">Squad</div>
|
|
156
|
+
<button class="icon-btn" aria-label="Filter">⌄</button>
|
|
157
|
+
</header>
|
|
158
|
+
|
|
159
|
+
<section class="main">
|
|
160
|
+
<div class="section-head">
|
|
161
|
+
<h2>Starting XI</h2>
|
|
162
|
+
<span class="meta">11 / 11</span>
|
|
163
|
+
</div>
|
|
164
|
+
|
|
165
|
+
<article class="row-card">
|
|
166
|
+
<div class="avatar">KP</div>
|
|
167
|
+
<div>
|
|
168
|
+
<div class="name">Kim Park</div>
|
|
169
|
+
<div class="sub">#9 · forward · captain</div>
|
|
170
|
+
</div>
|
|
171
|
+
<div class="stat">14 g</div>
|
|
172
|
+
</article>
|
|
173
|
+
<article class="row-card">
|
|
174
|
+
<div class="avatar">JW</div>
|
|
175
|
+
<div>
|
|
176
|
+
<div class="name">Jonas Weber</div>
|
|
177
|
+
<div class="sub">#8 · midfield</div>
|
|
178
|
+
</div>
|
|
179
|
+
<div class="stat">9 a</div>
|
|
180
|
+
</article>
|
|
181
|
+
<article class="row-card">
|
|
182
|
+
<div class="avatar">MS</div>
|
|
183
|
+
<div>
|
|
184
|
+
<div class="name">Marta Silva</div>
|
|
185
|
+
<div class="sub">#4 · defender</div>
|
|
186
|
+
</div>
|
|
187
|
+
<div class="stat">11 cs</div>
|
|
188
|
+
</article>
|
|
189
|
+
<article class="row-card">
|
|
190
|
+
<div class="avatar">LC</div>
|
|
191
|
+
<div>
|
|
192
|
+
<div class="name">Liam Chen</div>
|
|
193
|
+
<div class="sub">#1 · goalkeeper</div>
|
|
194
|
+
</div>
|
|
195
|
+
<div class="stat">0.84</div>
|
|
196
|
+
</article>
|
|
197
|
+
<article class="row-card">
|
|
198
|
+
<div class="avatar">AO</div>
|
|
199
|
+
<div>
|
|
200
|
+
<div class="name">Amara Okafor</div>
|
|
201
|
+
<div class="sub">#10 · winger</div>
|
|
202
|
+
</div>
|
|
203
|
+
<div class="stat">6 g</div>
|
|
204
|
+
</article>
|
|
205
|
+
|
|
206
|
+
<div class="section-head" style="margin-top: var(--space-5);">
|
|
207
|
+
<h2>Bench</h2>
|
|
208
|
+
<span class="meta">7 ready</span>
|
|
209
|
+
</div>
|
|
210
|
+
<article class="row-card">
|
|
211
|
+
<div class="avatar">RA</div>
|
|
212
|
+
<div>
|
|
213
|
+
<div class="name">Rita Alvares</div>
|
|
214
|
+
<div class="sub">#15 · midfield</div>
|
|
215
|
+
</div>
|
|
216
|
+
<div class="stat">2 g</div>
|
|
217
|
+
</article>
|
|
218
|
+
<article class="row-card">
|
|
219
|
+
<div class="avatar">TK</div>
|
|
220
|
+
<div>
|
|
221
|
+
<div class="name">Tom Kwon</div>
|
|
222
|
+
<div class="sub">#16 · defender</div>
|
|
223
|
+
</div>
|
|
224
|
+
<div class="stat">0 g</div>
|
|
225
|
+
</article>
|
|
226
|
+
</section>
|
|
227
|
+
|
|
228
|
+
<nav class="tabbar">
|
|
229
|
+
<button class="tab is-active"><span class="icon" aria-hidden="true">⌘</span><span class="label">Squad</span></button>
|
|
230
|
+
<button class="tab"><span class="icon" aria-hidden="true">▦</span><span class="label">Matches</span></button>
|
|
231
|
+
<button class="tab"><span class="icon" aria-hidden="true">⟐</span><span class="label">Scout</span></button>
|
|
232
|
+
<button class="tab"><span class="icon" aria-hidden="true">≡</span><span class="label">More</span></button>
|
|
233
|
+
</nav>
|
|
234
|
+
</div>
|
|
235
|
+
</main>
|
|
236
|
+
</body>
|
|
237
|
+
</html>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPECIMEN: status-colors
|
|
3
|
+
DEMONSTRATES: --status-success, --status-warn, --status-error, --status-info, plus optional --status-offline
|
|
4
|
+
COMPOSITION: 4-state swatch grid + contextual badges + in-flow callouts
|
|
5
|
+
COPY VOICE: status-named ("live", "saved", "deferred", "couldn't sync") — never abstract labels
|
|
6
|
+
WHEN SCAFFOLDED: status family (IF "status" ∈ activeFamilies — almost always; rare opt-out)
|
|
7
|
+
NOTES: Status family is SEPARATE from accent. Don't reuse accent for success — accent is for primary action, success is for "things worked". Greens for success, ambers for warn, reds for error, blues for info.
|
|
8
|
+
-->
|
|
9
|
+
<!doctype html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<title>Status — colors</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>Status colors</h1>
|
|
20
|
+
<p class="lede">Four status semantics — success, warn, error, info. Separate from the accent family because actions and outcomes need distinct signals: accent says "do this", status says "this happened".</p>
|
|
21
|
+
|
|
22
|
+
<div class="grid">
|
|
23
|
+
<div class="swatch"><div style="height: 64px; background: var(--status-success);"></div><div class="meta"><strong>--status-success</strong>saved / synced / live</div></div>
|
|
24
|
+
<div class="swatch"><div style="height: 64px; background: var(--status-warn);"></div><div class="meta"><strong>--status-warn</strong>deferred / due soon</div></div>
|
|
25
|
+
<div class="swatch"><div style="height: 64px; background: var(--status-error);"></div><div class="meta"><strong>--status-error</strong>failed / blocked</div></div>
|
|
26
|
+
<div class="swatch"><div style="height: 64px; background: var(--status-info);"></div><div class="meta"><strong>--status-info</strong>note / heads-up</div></div>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<h2>In context</h2>
|
|
30
|
+
<div class="row" style="gap: 8px;">
|
|
31
|
+
<span style="background: var(--status-success); color: var(--accent-fg); padding: 2px 10px; border-radius: var(--radius-pill); font-size: var(--type-xs);">● live</span>
|
|
32
|
+
<span style="background: var(--status-warn); color: var(--accent-fg); padding: 2px 10px; border-radius: var(--radius-pill); font-size: var(--type-xs);">due in 2h</span>
|
|
33
|
+
<span style="background: var(--status-error); color: var(--accent-fg); padding: 2px 10px; border-radius: var(--radius-pill); font-size: var(--type-xs);">sync failed</span>
|
|
34
|
+
<span style="background: var(--status-info); color: var(--accent-fg); padding: 2px 10px; border-radius: var(--radius-pill); font-size: var(--type-xs);">new feature</span>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<h2>Inline tags (low-density)</h2>
|
|
38
|
+
<div class="row" style="gap: 8px;">
|
|
39
|
+
<span style="border: 1px solid var(--status-success); color: var(--status-success); padding: 2px 8px; border-radius: var(--radius-sm); font-size: var(--type-xs);">passed</span>
|
|
40
|
+
<span style="border: 1px solid var(--status-warn); color: var(--status-warn); padding: 2px 8px; border-radius: var(--radius-sm); font-size: var(--type-xs);">pending</span>
|
|
41
|
+
<span style="border: 1px solid var(--status-error); color: var(--status-error); padding: 2px 8px; border-radius: var(--radius-sm); font-size: var(--type-xs);">failed</span>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<footer class="legend">
|
|
45
|
+
<p>Use the solid-fill form for high-contrast UI elements (badges, callouts). Use the outline form for low-noise inline tags inside dense data tables.</p>
|
|
46
|
+
</footer>
|
|
47
|
+
</main>
|
|
48
|
+
</body>
|
|
49
|
+
</html>
|