@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.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/cli/bin/maude.exe +15 -0
  4. package/cli/bin/maude.mjs +45 -0
  5. package/cli/bin/mdcc.exe +10 -0
  6. package/cli/bin/mdcc.mjs +7 -0
  7. package/cli/cli-wrapper.cjs +67 -0
  8. package/cli/commands/config.mjs +94 -0
  9. package/cli/commands/design.mjs +386 -0
  10. package/cli/commands/help.mjs +57 -0
  11. package/cli/commands/init.mjs +178 -0
  12. package/cli/commands/version.mjs +7 -0
  13. package/cli/install.cjs +113 -0
  14. package/cli/lib/argv.mjs +37 -0
  15. package/cli/lib/argv.test.mjs +46 -0
  16. package/cli/lib/copy-tree.mjs +78 -0
  17. package/package.json +94 -0
  18. package/plugins/design/dev-server/annotations-context-toolbar.tsx +397 -0
  19. package/plugins/design/dev-server/annotations-layer.tsx +1717 -0
  20. package/plugins/design/dev-server/api.ts +674 -0
  21. package/plugins/design/dev-server/bin/_screenshot-playwright.mjs +50 -0
  22. package/plugins/design/dev-server/bin/bootstrap-check.sh +83 -0
  23. package/plugins/design/dev-server/bin/canvas-edit.sh +48 -0
  24. package/plugins/design/dev-server/bin/handoff.sh +27 -0
  25. package/plugins/design/dev-server/bin/screenshot.sh +232 -0
  26. package/plugins/design/dev-server/bin/server-up.sh +135 -0
  27. package/plugins/design/dev-server/bin/slug.sh +22 -0
  28. package/plugins/design/dev-server/bin/smoke.sh +272 -0
  29. package/plugins/design/dev-server/build.ts +267 -0
  30. package/plugins/design/dev-server/canvas-build.ts +219 -0
  31. package/plugins/design/dev-server/canvas-edit.ts +388 -0
  32. package/plugins/design/dev-server/canvas-header.ts +165 -0
  33. package/plugins/design/dev-server/canvas-icons.tsx +131 -0
  34. package/plugins/design/dev-server/canvas-lib-inline.ts +260 -0
  35. package/plugins/design/dev-server/canvas-lib-resolver.ts +85 -0
  36. package/plugins/design/dev-server/canvas-lib.tsx +1995 -0
  37. package/plugins/design/dev-server/canvas-meta.schema.json +181 -0
  38. package/plugins/design/dev-server/canvas-pipeline.ts +270 -0
  39. package/plugins/design/dev-server/canvas-shell.tsx +813 -0
  40. package/plugins/design/dev-server/client/app.jsx +2027 -0
  41. package/plugins/design/dev-server/client/hmr.mjs +85 -0
  42. package/plugins/design/dev-server/client/iframe-lazy.mjs +121 -0
  43. package/plugins/design/dev-server/client/index.html +15 -0
  44. package/plugins/design/dev-server/client/styles/0-reset.css +18 -0
  45. package/plugins/design/dev-server/client/styles/1-tokens.css +297 -0
  46. package/plugins/design/dev-server/client/styles/2-layout.css +35 -0
  47. package/plugins/design/dev-server/client/styles/3-shell.css +906 -0
  48. package/plugins/design/dev-server/client/styles/4-components.css +1268 -0
  49. package/plugins/design/dev-server/client/styles/5-utilities.css +4 -0
  50. package/plugins/design/dev-server/client/styles/_index.css +24 -0
  51. package/plugins/design/dev-server/client/styles.css +1419 -0
  52. package/plugins/design/dev-server/config.schema.json +147 -0
  53. package/plugins/design/dev-server/context-menu.tsx +343 -0
  54. package/plugins/design/dev-server/context.ts +173 -0
  55. package/plugins/design/dev-server/dist/client.bundle.js +20323 -0
  56. package/plugins/design/dev-server/dist/styles.css +2875 -0
  57. package/plugins/design/dev-server/examples/README.md +9 -0
  58. package/plugins/design/dev-server/examples/perf-100-artboards.tsx +113 -0
  59. package/plugins/design/dev-server/fs-watch.ts +63 -0
  60. package/plugins/design/dev-server/handoff.ts +721 -0
  61. package/plugins/design/dev-server/history.ts +125 -0
  62. package/plugins/design/dev-server/hmr-broadcast.ts +114 -0
  63. package/plugins/design/dev-server/http.ts +413 -0
  64. package/plugins/design/dev-server/input-router.tsx +485 -0
  65. package/plugins/design/dev-server/inspect.ts +365 -0
  66. package/plugins/design/dev-server/locator.ts +159 -0
  67. package/plugins/design/dev-server/mem.ts +97 -0
  68. package/plugins/design/dev-server/runtime-bundle.ts +235 -0
  69. package/plugins/design/dev-server/server.mjs +1246 -0
  70. package/plugins/design/dev-server/server.ts +131 -0
  71. package/plugins/design/dev-server/test/_helpers.ts +81 -0
  72. package/plugins/design/dev-server/test/active-state.test.ts +145 -0
  73. package/plugins/design/dev-server/test/annotations-api.test.ts +146 -0
  74. package/plugins/design/dev-server/test/annotations-layer.test.ts +419 -0
  75. package/plugins/design/dev-server/test/binary-smoke.test.ts +47 -0
  76. package/plugins/design/dev-server/test/bundle-smoke.test.ts +29 -0
  77. package/plugins/design/dev-server/test/canvas-build.test.ts +78 -0
  78. package/plugins/design/dev-server/test/canvas-edit.test.ts +139 -0
  79. package/plugins/design/dev-server/test/canvas-header.test.ts +127 -0
  80. package/plugins/design/dev-server/test/canvas-lib-inline.test.ts +146 -0
  81. package/plugins/design/dev-server/test/canvas-lib-resolver.test.ts +112 -0
  82. package/plugins/design/dev-server/test/canvas-meta-api.test.ts +236 -0
  83. package/plugins/design/dev-server/test/canvas-pipeline.test.ts +180 -0
  84. package/plugins/design/dev-server/test/canvas-route.test.ts +176 -0
  85. package/plugins/design/dev-server/test/fs-watch.test.ts +41 -0
  86. package/plugins/design/dev-server/test/handoff-static-frames.test.ts +215 -0
  87. package/plugins/design/dev-server/test/handoff.test.ts +281 -0
  88. package/plugins/design/dev-server/test/history-rollback.test.ts +62 -0
  89. package/plugins/design/dev-server/test/hmr-broadcast.test.ts +108 -0
  90. package/plugins/design/dev-server/test/input-router.test.ts +316 -0
  91. package/plugins/design/dev-server/test/locator.test.ts +214 -0
  92. package/plugins/design/dev-server/test/perf-harness.ts +193 -0
  93. package/plugins/design/dev-server/test/phase-3.6-smoke.test.ts +77 -0
  94. package/plugins/design/dev-server/test/runtime-bundle.test.ts +69 -0
  95. package/plugins/design/dev-server/test/server-lifecycle.test.ts +28 -0
  96. package/plugins/design/dev-server/test/tool-palette.test.tsx +55 -0
  97. package/plugins/design/dev-server/test/use-annotation-selection.test.tsx +77 -0
  98. package/plugins/design/dev-server/test/use-artboard-drag.test.ts +325 -0
  99. package/plugins/design/dev-server/test/use-selection-set.test.tsx +166 -0
  100. package/plugins/design/dev-server/test/use-snap-guides.test.ts +190 -0
  101. package/plugins/design/dev-server/test/use-tool-mode.test.tsx +93 -0
  102. package/plugins/design/dev-server/test/ws-handshake.test.ts +33 -0
  103. package/plugins/design/dev-server/tool-palette.tsx +278 -0
  104. package/plugins/design/dev-server/tsconfig.json +26 -0
  105. package/plugins/design/dev-server/use-annotation-selection.tsx +92 -0
  106. package/plugins/design/dev-server/use-annotations-visibility.tsx +43 -0
  107. package/plugins/design/dev-server/use-artboard-drag.tsx +445 -0
  108. package/plugins/design/dev-server/use-selection-set.tsx +224 -0
  109. package/plugins/design/dev-server/use-snap-guides.tsx +215 -0
  110. package/plugins/design/dev-server/use-tool-mode.tsx +114 -0
  111. package/plugins/design/dev-server/ws.ts +90 -0
  112. package/plugins/design/templates/_shell.html +177 -0
  113. package/plugins/design/templates/canvas.tsx.template +54 -0
  114. package/plugins/design/templates/design-system-inspiration/_MAPPING.md +277 -0
  115. package/plugins/design/templates/design-system-inspiration/_README.md +71 -0
  116. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-banner.html +68 -0
  117. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-empty-state-generous.html +39 -0
  118. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-feature-grid.html +62 -0
  119. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-marketing-card.html +63 -0
  120. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-testimonial.html +80 -0
  121. package/plugins/design/templates/design-system-inspiration/audience-developer/components-code-block.html +71 -0
  122. package/plugins/design/templates/design-system-inspiration/audience-developer/components-diff-view.html +65 -0
  123. package/plugins/design/templates/design-system-inspiration/audience-developer/components-log-stream.html +62 -0
  124. package/plugins/design/templates/design-system-inspiration/audience-developer/components-monospace-table.html +57 -0
  125. package/plugins/design/templates/design-system-inspiration/audience-developer/components-terminal-pane.html +67 -0
  126. package/plugins/design/templates/design-system-inspiration/audience-developer/type-mono.html +57 -0
  127. package/plugins/design/templates/design-system-inspiration/audience-pro/colors-presence.html +74 -0
  128. package/plugins/design/templates/design-system-inspiration/audience-pro/components-command-palette.html +90 -0
  129. package/plugins/design/templates/design-system-inspiration/audience-pro/components-keyboard.html +51 -0
  130. package/plugins/design/templates/design-system-inspiration/audience-pro/components-list.html +89 -0
  131. package/plugins/design/templates/design-system-inspiration/audience-pro/components-shortcuts-overlay.html +85 -0
  132. package/plugins/design/templates/design-system-inspiration/audience-pro/components-toast-menu.html +80 -0
  133. package/plugins/design/templates/design-system-inspiration/core/INDEX.md.tpl +25 -0
  134. package/plugins/design/templates/design-system-inspiration/core/README.orchestration.md.tpl +71 -0
  135. package/plugins/design/templates/design-system-inspiration/core/README.philosophy.md.tpl +77 -0
  136. package/plugins/design/templates/design-system-inspiration/core/SKILL.md.tpl +50 -0
  137. package/plugins/design/templates/design-system-inspiration/core/colors_and_type.css.tpl +111 -0
  138. package/plugins/design/templates/design-system-inspiration/core/config.json.tpl +28 -0
  139. package/plugins/design/templates/design-system-inspiration/core/preview/_layout.css +113 -0
  140. package/plugins/design/templates/design-system-inspiration/core/preview/colors-accent.html +48 -0
  141. package/plugins/design/templates/design-system-inspiration/core/preview/colors-surfaces.html +49 -0
  142. package/plugins/design/templates/design-system-inspiration/core/preview/colors-text.html +52 -0
  143. package/plugins/design/templates/design-system-inspiration/core/preview/components-buttons.html +83 -0
  144. package/plugins/design/templates/design-system-inspiration/core/preview/components-cards.html +79 -0
  145. package/plugins/design/templates/design-system-inspiration/core/preview/components-inputs.html +82 -0
  146. package/plugins/design/templates/design-system-inspiration/core/preview/motion.html +66 -0
  147. package/plugins/design/templates/design-system-inspiration/core/preview/spacing-scale.html +53 -0
  148. package/plugins/design/templates/design-system-inspiration/core/preview/type-scale.html +62 -0
  149. package/plugins/design/templates/design-system-inspiration/foundations/borders.html +39 -0
  150. package/plugins/design/templates/design-system-inspiration/foundations/elevation.html +46 -0
  151. package/plugins/design/templates/design-system-inspiration/foundations/focus.html +48 -0
  152. package/plugins/design/templates/design-system-inspiration/foundations/grid.html +51 -0
  153. package/plugins/design/templates/design-system-inspiration/foundations/iconography.html +73 -0
  154. package/plugins/design/templates/design-system-inspiration/foundations/opacity.html +45 -0
  155. package/plugins/design/templates/design-system-inspiration/foundations/radii.html +40 -0
  156. package/plugins/design/templates/design-system-inspiration/foundations/selection.html +45 -0
  157. package/plugins/design/templates/design-system-inspiration/meta/accessibility.html +62 -0
  158. package/plugins/design/templates/design-system-inspiration/meta/i18n.html +73 -0
  159. package/plugins/design/templates/design-system-inspiration/meta/presence-multiplayer.html +71 -0
  160. package/plugins/design/templates/design-system-inspiration/meta/tokens-index.html +80 -0
  161. package/plugins/design/templates/design-system-inspiration/patterns/patterns-auth.html +78 -0
  162. package/plugins/design/templates/design-system-inspiration/patterns/patterns-data-density.html +61 -0
  163. package/plugins/design/templates/design-system-inspiration/patterns/patterns-error-pages.html +70 -0
  164. package/plugins/design/templates/design-system-inspiration/patterns/patterns-form-layouts.html +70 -0
  165. package/plugins/design/templates/design-system-inspiration/patterns/patterns-onboarding.html +71 -0
  166. package/plugins/design/templates/design-system-inspiration/patterns/patterns-pricing.html +83 -0
  167. package/plugins/design/templates/design-system-inspiration/platform-desktop/components-resize-panels.html +63 -0
  168. package/plugins/design/templates/design-system-inspiration/platform-desktop/ui_kits-desktop-index.html +55 -0
  169. package/plugins/design/templates/design-system-inspiration/platform-desktop/ui_kits-desktop-showcase.html +302 -0
  170. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-bottom-sheet.html +63 -0
  171. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-pull-to-refresh.html +74 -0
  172. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-segmented-control.html +51 -0
  173. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-tab-bar.html +57 -0
  174. package/plugins/design/templates/design-system-inspiration/platform-mobile/ui_kits-mobile-index.html +58 -0
  175. package/plugins/design/templates/design-system-inspiration/platform-mobile/ui_kits-mobile-showcase.html +237 -0
  176. package/plugins/design/templates/design-system-inspiration/status/colors-status.html +49 -0
  177. package/plugins/design/templates/design-system-inspiration/status/components-status.html +63 -0
  178. package/plugins/design/templates/design-system-inspiration/status/skeletons.html +74 -0
  179. package/plugins/design/templates/design-system-inspiration/theme-both/colors-themes-side-by-side.html +59 -0
  180. package/plugins/design/templates/design-system-inspiration/universal/components-callout.html +74 -0
  181. package/plugins/design/templates/design-system-inspiration/universal/components-dialogs.html +81 -0
  182. package/plugins/design/templates/design-system-inspiration/universal/components-tables.html +101 -0
  183. package/plugins/design/templates/design-system-inspiration/universal/components-toggles.html +74 -0
  184. package/plugins/design/templates/design-system-inspiration/universal/components-tooltips.html +74 -0
  185. package/plugins/design/templates/design-system-inspiration/universal/empty-state.html.tpl +34 -0
  186. package/plugins/design/templates/design-system-inspiration/universal/logo.html +42 -0
  187. package/plugins/design/templates/ds-specimen.tsx.template +59 -0
  188. package/plugins/flow/.claude-plugin/config.schema.json +398 -0
  189. package/plugins/flow/README.md +45 -0
  190. package/plugins/flow/templates/ai-skeleton/INDEX.md +50 -0
  191. package/plugins/flow/templates/ai-skeleton/README.md +46 -0
  192. package/plugins/flow/templates/ai-skeleton/browser/har/.gitkeep +0 -0
  193. package/plugins/flow/templates/ai-skeleton/browser/snapshots/.gitkeep +0 -0
  194. package/plugins/flow/templates/ai-skeleton/business/README.md +12 -0
  195. package/plugins/flow/templates/ai-skeleton/context/README.md +12 -0
  196. package/plugins/flow/templates/ai-skeleton/decisions/README.md +20 -0
  197. package/plugins/flow/templates/ai-skeleton/design-import/.gitkeep +0 -0
  198. package/plugins/flow/templates/ai-skeleton/dev-logs/.gitkeep +0 -0
  199. package/plugins/flow/templates/ai-skeleton/device/.gitkeep +0 -0
  200. package/plugins/flow/templates/ai-skeleton/docs/README.md +5 -0
  201. package/plugins/flow/templates/ai-skeleton/logs/.gitkeep +0 -0
  202. package/plugins/flow/templates/ai-skeleton/logs/README.md +13 -0
  203. package/plugins/flow/templates/ai-skeleton/plans/README.md +16 -0
  204. package/plugins/flow/templates/ai-skeleton/plans/archive/.gitkeep +0 -0
  205. package/plugins/flow/templates/ai-skeleton/release-guide.md +35 -0
  206. package/plugins/flow/templates/ai-skeleton/reviews/README.md +15 -0
  207. package/plugins/flow/templates/ai-skeleton/scenarios/README.md +26 -0
  208. package/plugins/flow/templates/ai-skeleton/scenarios/_lib/.gitkeep +0 -0
  209. package/plugins/flow/templates/ai-skeleton/state/STATE.md +25 -0
  210. package/plugins/flow/templates/ai-skeleton/templates/HANDOFF.md +32 -0
  211. package/plugins/flow/templates/ai-skeleton/workflows.config.json +74 -0
@@ -0,0 +1,71 @@
1
+ <!--
2
+ SPECIMEN: pattern-onboarding
3
+ DEMONSTRATES: welcome screen, 3-step tour, dismissible coachmarks
4
+ COMPOSITION: welcome card + 3-step horizontal flow + tooltip-style coachmark on an inline element
5
+ COPY VOICE: friendly imperative ("Connect your league account") — never "Welcome to the future of…"
6
+ WHEN SCAFFOLDED: patterns (universal — most consumer apps have onboarding)
7
+ NOTES: Onboarding ≤ 3 steps. More than that = product complexity to fix, not UI to add. Skip button always present in top-right. Progress dots show position; don't number 1/3 unless steps are non-linear.
8
+ -->
9
+ <!doctype html>
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="utf-8" />
13
+ <title>Pattern — onboarding</title>
14
+ <link rel="stylesheet" href="../core/colors_and_type.css" />
15
+ <link rel="stylesheet" href="../core/preview/_layout.css" />
16
+ <style>
17
+ .ob-card { background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-lg); padding: 32px; max-width: 480px; position: relative; box-shadow: var(--shadow-md); margin: 0 0 24px; }
18
+ .ob-card .skip { position: absolute; top: 16px; right: 16px; background: transparent; border: 0; color: var(--fg-2); font: inherit; font-size: var(--type-sm); cursor: pointer; }
19
+ .ob-card h2 { margin: 0 0 8px; font-family: var(--font-display); font-size: var(--type-xl); font-weight: 600; }
20
+ .ob-card p { color: var(--fg-1); margin: 0 0 20px; }
21
+ .ob-card .actions { display: flex; justify-content: space-between; align-items: center; }
22
+ .dots { display: flex; gap: 6px; }
23
+ .dots .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--fg-3); }
24
+ .dots .dot.is-active { background: var(--accent); }
25
+ .coachmark-frame { position: relative; background: var(--bg-1); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: 32px; min-height: 200px; }
26
+ .coachmark-target { background: var(--bg-3); border: 1px solid var(--border-default); padding: 8px 12px; border-radius: var(--radius-sm); display: inline-block; outline: 2px solid var(--accent); outline-offset: 4px; }
27
+ .coachmark { position: absolute; background: var(--bg-1); border: 1px solid var(--border-default); box-shadow: var(--shadow-md); padding: 12px 14px; border-radius: var(--radius-md); width: 220px; }
28
+ </style>
29
+ </head>
30
+ <body class="app" data-theme="dark">
31
+ <main class="specimen">
32
+ <h1>Onboarding</h1>
33
+ <p class="lede">Three forms — welcome screen, multi-step tour, inline coachmark. Cap onboarding at 3 steps; more than that signals product complexity to simplify, not a longer flow to design.</p>
34
+
35
+ <h2>Welcome screen</h2>
36
+ <div class="ob-card">
37
+ <button class="skip">Skip</button>
38
+ <h2>Welcome to Sideline</h2>
39
+ <p>Three quick steps to get your squad set up. Should take about a minute.</p>
40
+ <div class="actions">
41
+ <div class="dots"><span class="dot is-active"></span><span class="dot"></span><span class="dot"></span></div>
42
+ <button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 8px 16px; border-radius: var(--radius-sm); font: inherit;">Let's go</button>
43
+ </div>
44
+ </div>
45
+
46
+ <h2>Step 2 of 3</h2>
47
+ <div class="ob-card">
48
+ <button class="skip">Skip</button>
49
+ <h2>Connect your league account</h2>
50
+ <p>We'll pull your fixtures and rosters automatically. You can do this later from Settings.</p>
51
+ <div class="actions">
52
+ <div class="dots"><span class="dot"></span><span class="dot is-active"></span><span class="dot"></span></div>
53
+ <div style="display: flex; gap: 8px;">
54
+ <button style="background: transparent; color: var(--fg-1); border: 0; padding: 8px 16px; font: inherit;">Do it later</button>
55
+ <button style="background: var(--accent); color: var(--accent-fg); border: 0; padding: 8px 16px; border-radius: var(--radius-sm); font: inherit;">Connect</button>
56
+ </div>
57
+ </div>
58
+ </div>
59
+
60
+ <h2>Inline coachmark</h2>
61
+ <div class="coachmark-frame">
62
+ <p style="margin: 0 0 12px; color: var(--fg-1);">After you create a canvas, the inspector lives here →</p>
63
+ <span class="coachmark-target">Inspector</span>
64
+ <div class="coachmark" style="top: 90px; left: 180px;">
65
+ <strong>Cmd+click to scope edits</strong>
66
+ <p style="color: var(--fg-1); font-size: var(--type-sm); margin: 4px 0 0;">Click any element to focus your next edit on just that piece.</p>
67
+ </div>
68
+ </div>
69
+ </main>
70
+ </body>
71
+ </html>
@@ -0,0 +1,83 @@
1
+ <!--
2
+ SPECIMEN: pattern-pricing
3
+ DEMONSTRATES: 3-tier pricing table with feature list, highlighted "popular" tier, monthly/annual toggle
4
+ COMPOSITION: monthly/annual segmented control + 3 pricing cards (Free / Club / Federation) + comparison row
5
+ COPY VOICE: outcome-named features ("Unlimited rosters", "Match recap exports") — never feature dumps
6
+ WHEN SCAFFOLDED: patterns (consumer + marketing flavored)
7
+ NOTES: 3 tiers is the sweet spot (decision paralysis past 4). Middle tier is usually "popular" — pre-selected. Feature list = positive checks (no "Limited to 3 squads" — phrase as "Up to 3 squads"). Match the accent on the popular card border.
8
+ -->
9
+ <!doctype html>
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="utf-8" />
13
+ <title>Pattern — pricing</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; margin: 0 0 24px; }
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; }
19
+ .seg button.is-active { background: var(--bg-1); color: var(--fg-0); box-shadow: var(--shadow-sm); font-weight: 500; }
20
+ .tier { background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-lg); padding: 24px; display: grid; gap: 16px; }
21
+ .tier.popular { border-color: var(--accent); position: relative; }
22
+ .tier.popular::before { content: 'Most popular'; position: absolute; top: -10px; left: 24px; background: var(--accent); color: var(--accent-fg); padding: 2px 10px; border-radius: var(--radius-pill); font-size: 11px; font-weight: 500; }
23
+ .tier .name { font-family: var(--font-display); font-size: var(--type-lg); font-weight: 600; }
24
+ .tier .price { display: flex; align-items: baseline; gap: 4px; }
25
+ .tier .price .num { font-family: var(--font-display); font-size: var(--type-3xl); font-weight: 600; }
26
+ .tier .price .per { color: var(--fg-2); }
27
+ .tier ul { margin: 0; padding-left: 0; list-style: none; color: var(--fg-1); font-size: var(--type-sm); display: grid; gap: 6px; }
28
+ .tier li::before { content: '✓'; color: var(--status-success); margin-right: 8px; }
29
+ .tier .cta { background: var(--accent); color: var(--accent-fg); border: 0; padding: 10px 14px; border-radius: var(--radius-sm); font: inherit; font-weight: 500; cursor: pointer; }
30
+ .tier:not(.popular) .cta { background: var(--bg-3); color: var(--fg-0); border: 1px solid var(--border-default); }
31
+ </style>
32
+ </head>
33
+ <body class="app" data-theme="dark">
34
+ <main class="specimen">
35
+ <h1>Pricing</h1>
36
+ <p class="lede">Three tiers — Free, Club, Federation. Middle tier pre-marked as "Most popular". Toggle for monthly vs annual.</p>
37
+
38
+ <div class="seg">
39
+ <button>Monthly</button>
40
+ <button class="is-active">Annual <span style="color: var(--accent);">−20%</span></button>
41
+ </div>
42
+
43
+ <div class="grid" style="grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px;">
44
+ <div class="tier">
45
+ <div class="name">Free</div>
46
+ <div class="price"><span class="num">$0</span><span class="per">/month</span></div>
47
+ <ul>
48
+ <li>1 squad</li>
49
+ <li>5 match recaps / month</li>
50
+ <li>Roster sync (manual)</li>
51
+ </ul>
52
+ <button class="cta">Get started</button>
53
+ </div>
54
+
55
+ <div class="tier popular">
56
+ <div class="name">Club</div>
57
+ <div class="price"><span class="num">$19</span><span class="per">/month</span></div>
58
+ <ul>
59
+ <li>Up to 5 squads</li>
60
+ <li>Unlimited match recaps</li>
61
+ <li>League sync (automatic)</li>
62
+ <li>Match recap exports</li>
63
+ <li>Email + chat support</li>
64
+ </ul>
65
+ <button class="cta">Start 14-day trial</button>
66
+ </div>
67
+
68
+ <div class="tier">
69
+ <div class="name">Federation</div>
70
+ <div class="price"><span class="num">Custom</span></div>
71
+ <ul>
72
+ <li>Everything in Club</li>
73
+ <li>Unlimited squads</li>
74
+ <li>Custom league integrations</li>
75
+ <li>SSO + audit log</li>
76
+ <li>Dedicated support</li>
77
+ </ul>
78
+ <button class="cta">Talk to sales</button>
79
+ </div>
80
+ </div>
81
+ </main>
82
+ </body>
83
+ </html>
@@ -0,0 +1,63 @@
1
+ <!--
2
+ SPECIMEN: platform-desktop-resize-panels
3
+ DEMONSTRATES: split-pane resizer, hover state on the drag handle, snap-to-default, min-width constraints
4
+ COMPOSITION: 3-pane layout (sidebar | main | inspector) with visible drag handles
5
+ COPY VOICE: terse pane labels
6
+ WHEN SCAFFOLDED: platform-desktop
7
+ NOTES: Drag handle is a 4px-wide invisible hit area centered on a 1px visible border. Cursor: col-resize. On double-click, snap to default width. Min width prevents collapse-to-zero (better UX than allowing zero).
8
+ -->
9
+ <!doctype html>
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="utf-8" />
13
+ <title>Platform desktop — resize panels</title>
14
+ <link rel="stylesheet" href="../core/colors_and_type.css" />
15
+ <link rel="stylesheet" href="../core/preview/_layout.css" />
16
+ <style>
17
+ .layout { display: grid; grid-template-columns: 220px 4px 1fr 4px 280px; height: 360px; background: var(--bg-1); border: 1px solid var(--border-default); border-radius: var(--radius-md); overflow: hidden; }
18
+ .pane { padding: 12px 16px; overflow: auto; }
19
+ .pane.sidebar { background: var(--bg-1); border-right: 1px solid var(--border-subtle); }
20
+ .pane.main { background: var(--bg-0); }
21
+ .pane.inspector { background: var(--bg-1); border-left: 1px solid var(--border-subtle); }
22
+ .resizer { background: var(--border-subtle); cursor: col-resize; transition: background var(--dur-flip) var(--ease-out); }
23
+ .resizer:hover { background: var(--accent); }
24
+ .pane h4 { font-size: var(--type-xs); text-transform: uppercase; letter-spacing: 0.06em; color: var(--fg-2); margin: 0 0 8px; }
25
+ .pane ul { margin: 0; padding-left: 16px; color: var(--fg-1); font-size: var(--type-sm); }
26
+ </style>
27
+ </head>
28
+ <body class="app" data-theme="dark">
29
+ <main class="specimen">
30
+ <h1>Resizable panels</h1>
31
+ <p class="lede">3-pane desktop layout with drag-resize handles. Each handle is a 1px visible border with a 4px hit area; cursor changes to <code>col-resize</code> on hover. Double-click snaps to default width.</p>
32
+
33
+ <div class="layout">
34
+ <aside class="pane sidebar">
35
+ <h4>Squad</h4>
36
+ <ul>
37
+ <li>Roster</li>
38
+ <li>Bench</li>
39
+ <li>Reserves</li>
40
+ </ul>
41
+ </aside>
42
+ <div class="resizer" title="Drag to resize · double-click to reset"></div>
43
+ <main class="pane main">
44
+ <h4>Match recap · vs. Sparta U17</h4>
45
+ <p style="color: var(--fg-1); margin: 4px 0 0;">Final 3-1 · captain hat-trick · auto-saved 19:42</p>
46
+ </main>
47
+ <div class="resizer" title="Drag to resize · double-click to reset"></div>
48
+ <aside class="pane inspector">
49
+ <h4>Inspector</h4>
50
+ <p style="color: var(--fg-1); font-size: var(--type-sm); margin: 0;">Selected: Kim Park · #9</p>
51
+ <ul>
52
+ <li>24 matches</li>
53
+ <li>14 goals · 5 assists</li>
54
+ </ul>
55
+ </aside>
56
+ </div>
57
+
58
+ <footer class="legend">
59
+ <p>Min widths: sidebar 180px, inspector 240px, main flex (no max). Persisting widths to localStorage is the user's friend — restoring last layout on reload removes a constant tax.</p>
60
+ </footer>
61
+ </main>
62
+ </body>
63
+ </html>
@@ -0,0 +1,55 @@
1
+ <!--
2
+ SPECIMEN: platform-desktop-ui-kits-index
3
+ DEMONSTRATES: cover page for desktop UI kit — lists all desktop-specific specimens with thumbnails
4
+ COMPOSITION: index page with desktop specimens (resize-panels) + cross-references to universal (tables, dialogs, etc.)
5
+ COPY VOICE: terse — this is an index, not a tutorial
6
+ WHEN SCAFFOLDED: platform-desktop
7
+ NOTES: Desktop kit is smaller than mobile because most desktop UX lives in /universal/ (tables, dialogs, tooltips work on desktop natively). Only desktop-only patterns (resizable panels, command-palette, keyboard shortcuts) get their own specimens.
8
+ -->
9
+ <!doctype html>
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="utf-8" />
13
+ <title>UI kits — desktop</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-family: var(--font-mono); 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>Desktop UI kit</h1>
27
+ <p class="lede">Desktop-specific patterns. Most desktop UX uses the <code>universal/</code> specimens (tables, dialogs, tooltips, tabs); this kit covers only what's truly desktop-only — resizable layouts and the keyboard-first density patterns.</p>
28
+
29
+ <div class="grid" style="grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));">
30
+ <a href="./components-resize-panels.html" class="kit-card">
31
+ <div class="thumb">▤ │ ▤ │ ▤</div>
32
+ <span class="title">Resizable panels</span>
33
+ <p class="body">3-pane split with drag handles and snap-to-default.</p>
34
+ </a>
35
+ <a href="../audience-pro/components-command-palette.html" class="kit-card">
36
+ <div class="thumb">⌘K</div>
37
+ <span class="title">Command palette</span>
38
+ <p class="body">Keyboard-first action launcher (shared with pro tool kit).</p>
39
+ </a>
40
+ <a href="../audience-pro/components-shortcuts-overlay.html" class="kit-card">
41
+ <div class="thumb">?</div>
42
+ <span class="title">Shortcuts overlay</span>
43
+ <p class="body">Press ? to surface; grouped table of bindings.</p>
44
+ </a>
45
+ <a href="../universal/components-tables.html" class="kit-card">
46
+ <div class="thumb">≡≡≡</div>
47
+ <span class="title">Tables</span>
48
+ <p class="body">Dense data table (shared with universal).</p>
49
+ </a>
50
+ </div>
51
+
52
+ <footer class="legend"><p>Add to this kit only if the pattern doesn't make sense on mobile (drag-resize, multi-window, hover-only). Otherwise it belongs in <code>universal/</code>.</p></footer>
53
+ </main>
54
+ </body>
55
+ </html>
@@ -0,0 +1,302 @@
1
+ <!--
2
+ SPECIMEN: ui_kits/desktop/index
3
+ DEMONSTRATES: every Core token composed into a realistic desktop product surface — nav + sidebar + multi-view content + status bar + theme/accent parameterization
4
+ COMPOSITION: full-bleed desktop shell (1400px+) with:
5
+ - top nav (56px): brand wordmark · view-mode segmented · search · theme toggle · accent picker · user avatar
6
+ - left sidebar (240px): section heading + collapsible nav tree, active item highlighted by --accent
7
+ - main content (fluid): switchable between 3 screens — "Roster", "Activity", "Settings"
8
+ - status bar (28px): mono indicators (port, version, sync state)
9
+ - vanilla JS view switcher + theme switcher + [data-team="cyan|indigo|emerald|rose"] accent parameterization
10
+ COPY VOICE: real product strings — team-sports flavored for portability across scaffolds; substitute for project context during scaffold
11
+ WHEN SCAFFOLDED: always-on (Universal). Adapt every "Roster" / "Activity" / "Squadron" string and every screen's content to project context. KEEP the chrome shape — nav + sidebar + 3 switchable screens + status bar is the canonical "DS in use" composition.
12
+ NOTES:
13
+ - The EDITMODE-BEGIN/END markers around DEFAULTS let Claude Code edit defaults in-place without parsing JS (dugmate convention — adopted here for ui_kits).
14
+ - Theme toggle flips data-theme on <html>; accent picker flips data-team. The token CSS must define [data-team="..."] selectors to back this. If your tokens don't, the picker is decorative.
15
+ - This is THE single highest-leverage file in the bootstrap output. A reader who only opens one specimen should be able to understand the DS by reading this.
16
+ -->
17
+ <!doctype html>
18
+ <html lang="en" data-theme="dark" data-team="default">
19
+ <head>
20
+ <meta charset="utf-8" />
21
+ <title>UI kit · desktop · 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; }
26
+ .specimen { max-width: none; margin: 0; padding: 0; }
27
+
28
+ .app-shell {
29
+ display: grid;
30
+ grid-template-rows: 56px 1fr 28px;
31
+ grid-template-columns: 240px 1fr;
32
+ grid-template-areas:
33
+ "topnav topnav"
34
+ "sidebar main"
35
+ "status status";
36
+ min-height: 100vh;
37
+ }
38
+
39
+ /* ─── Top nav ─── */
40
+ .topnav { grid-area: topnav; display: flex; align-items: center; gap: var(--space-4); padding: 0 var(--space-4); background: var(--bg-1); border-bottom: 1px solid var(--border-subtle); }
41
+ .brand { display: flex; align-items: center; gap: var(--space-2); font-family: var(--font-display); font-weight: 600; font-size: var(--type-md); letter-spacing: var(--tracking-display, -0.022em); color: var(--fg-0); }
42
+ .brand .mark { width: 20px; height: 20px; background: var(--accent); border-radius: var(--radius-sm); display: grid; place-items: center; color: var(--accent-fg); font-family: var(--font-mono); font-weight: 700; font-size: 11px; }
43
+ .segmented { display: inline-flex; background: var(--bg-2); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: 2px; gap: 2px; margin-left: var(--space-3); }
44
+ .segmented > button { background: transparent; border: 0; color: var(--fg-1); padding: 5px 12px; border-radius: calc(var(--radius-md) - 2px); cursor: pointer; font: inherit; font-size: var(--type-sm); font-family: var(--font-mono); transition: background var(--dur-flip) var(--ease-out), color var(--dur-flip) var(--ease-out); }
45
+ .segmented > button.is-on { background: var(--accent); color: var(--accent-fg); font-weight: 500; }
46
+ .topnav .spacer { flex: 1; }
47
+ .search { background: var(--bg-3); border: 1px solid var(--border-default); color: var(--fg-1); padding: 6px 10px; border-radius: var(--radius-sm); font: inherit; font-size: var(--type-sm); width: 220px; font-family: var(--font-mono); }
48
+ .icon-btn { width: 32px; height: 32px; display: grid; place-items: center; background: transparent; border: 1px solid var(--border-subtle); color: var(--fg-1); cursor: pointer; border-radius: var(--radius-sm); transition: background var(--dur-flip) var(--ease-out); font-family: var(--font-mono); font-size: 14px; }
49
+ .icon-btn:hover { background: var(--bg-2); color: var(--fg-0); }
50
+ .accent-picker { display: flex; gap: 4px; padding: 0 var(--space-2); border-left: 1px solid var(--border-subtle); border-right: 1px solid var(--border-subtle); margin: 0 var(--space-2); height: 32px; align-items: center; }
51
+ .accent-swatch { width: 16px; height: 16px; border-radius: var(--radius-pill); border: 2px solid transparent; cursor: pointer; transition: transform var(--dur-flip) var(--ease-out); padding: 0; }
52
+ .accent-swatch:hover { transform: scale(1.15); }
53
+ .accent-swatch.is-on { border-color: var(--fg-0); }
54
+ .avatar { width: 28px; height: 28px; border-radius: var(--radius-pill); background: var(--accent); border: 1px solid var(--border-default); display: grid; place-items: center; color: var(--accent-fg); font-size: var(--type-xs); font-weight: 600; font-family: var(--font-mono); }
55
+
56
+ /* ─── Sidebar ─── */
57
+ .sidebar { grid-area: sidebar; background: var(--bg-1); border-right: 1px solid var(--border-subtle); padding: var(--space-4) var(--space-2); overflow-y: auto; }
58
+ .sidebar h3 { font-family: var(--font-mono); font-size: var(--type-xs); letter-spacing: 0.06em; text-transform: uppercase; color: var(--fg-2); margin: 0 0 var(--space-2); padding: 0 var(--space-2); }
59
+ .sidebar ul { list-style: none; padding: 0; margin: 0 0 var(--space-4); }
60
+ .sidebar li a { display: flex; align-items: center; gap: var(--space-2); padding: 6px 10px; color: var(--fg-1); text-decoration: none; border-radius: var(--radius-sm); font-size: var(--type-sm); cursor: pointer; transition: background var(--dur-flip) var(--ease-out), color var(--dur-flip) var(--ease-out); }
61
+ .sidebar li a:hover { background: var(--bg-2); color: var(--fg-0); }
62
+ .sidebar li a.is-active { background: var(--accent); color: var(--accent-fg); font-weight: 500; }
63
+ .sidebar li a .count { margin-left: auto; font-family: var(--font-mono); font-size: var(--type-xs); color: var(--fg-2); }
64
+ .sidebar li a.is-active .count { color: var(--accent-fg); opacity: 0.75; }
65
+
66
+ /* ─── Main + screens ─── */
67
+ .main { grid-area: main; background: var(--bg-0); padding: var(--space-6) var(--space-6); overflow-y: auto; }
68
+ .screen { display: none; }
69
+ .screen.is-on { display: block; }
70
+ .hero { display: flex; justify-content: space-between; align-items: flex-end; gap: var(--space-5); margin: 0 0 var(--space-6); padding-bottom: var(--space-4); border-bottom: 1px solid var(--border-subtle); }
71
+ .hero h1 { font-family: var(--font-display); font-size: var(--type-3xl); line-height: var(--lh-3xl); letter-spacing: var(--tracking-display, -0.022em); font-weight: 600; margin: 0 0 var(--space-2); color: var(--fg-0); }
72
+ .hero .lede { color: var(--fg-1); font-size: var(--type-md); line-height: var(--lh-md); margin: 0; max-width: 60ch; }
73
+ .hero .actions { display: flex; gap: var(--space-2); flex-shrink: 0; }
74
+ .btn { font: inherit; font-weight: 500; padding: 7px 14px; border-radius: var(--radius-md); border: 1px solid transparent; cursor: pointer; transition: background var(--dur-flip) var(--ease-out); }
75
+ .btn--primary { background: var(--accent); color: var(--accent-fg); }
76
+ .btn--primary:hover { background: var(--accent-hover); }
77
+ .btn--secondary { background: var(--bg-2); color: var(--fg-0); border-color: var(--border-default); }
78
+ .btn--secondary:hover { background: var(--bg-3); }
79
+
80
+ /* Roster cards */
81
+ .card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--space-3); }
82
+ .card { background: var(--bg-1); border: 1px solid var(--border-subtle); border-radius: var(--radius-lg); padding: var(--space-4); display: grid; gap: var(--space-2); transition: border-color var(--dur-flip) var(--ease-out), transform var(--dur-flip) var(--ease-out); }
83
+ .card:hover { border-color: var(--border-default); transform: translateY(-1px); }
84
+ .card .head { display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-3); }
85
+ .card .title { font-family: var(--font-display); font-weight: 600; font-size: var(--type-md); line-height: var(--lh-md); color: var(--fg-0); }
86
+ .card .meta { color: var(--fg-2); font-size: var(--type-xs); font-family: var(--font-mono); }
87
+ .card .body { color: var(--fg-1); font-size: var(--type-sm); margin: 0; line-height: var(--lh-sm); }
88
+ .pill { background: var(--accent); color: var(--accent-fg); padding: 1px 7px; border-radius: var(--radius-pill); font-size: var(--type-xs); font-family: var(--font-mono); font-weight: 500; }
89
+ .pill--ghost { background: transparent; color: var(--fg-1); border: 1px solid var(--border-default); }
90
+
91
+ /* Activity table */
92
+ .activity { background: var(--bg-1); border: 1px solid var(--border-subtle); border-radius: var(--radius-lg); overflow: hidden; }
93
+ .activity-row { display: grid; grid-template-columns: 32px 1fr auto; gap: var(--space-3); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--border-subtle); align-items: center; transition: background var(--dur-flip) var(--ease-out); }
94
+ .activity-row:last-child { border-bottom: 0; }
95
+ .activity-row:hover { background: var(--bg-2); }
96
+ .activity-row .dot { width: 8px; height: 8px; border-radius: 50%; }
97
+ .activity-row .dot.success { background: var(--status-success); }
98
+ .activity-row .dot.info { background: var(--status-info); }
99
+ .activity-row .dot.warn { background: var(--status-warn); }
100
+ .activity-row .text { color: var(--fg-0); font-size: var(--type-sm); }
101
+ .activity-row .text .who { color: var(--fg-1); }
102
+ .activity-row .when { color: var(--fg-2); font-family: var(--font-mono); font-size: var(--type-xs); }
103
+
104
+ /* Settings */
105
+ .settings { display: grid; gap: var(--space-4); max-width: 640px; }
106
+ .setting-row { display: flex; justify-content: space-between; align-items: center; padding: var(--space-3) var(--space-4); background: var(--bg-1); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); }
107
+ .setting-row .title { font-weight: 500; color: var(--fg-0); font-size: var(--type-sm); }
108
+ .setting-row .sub { color: var(--fg-2); font-size: var(--type-xs); margin-top: 2px; font-family: var(--font-mono); }
109
+
110
+ /* Switch (settings) */
111
+ .switch { position: relative; width: 36px; height: 20px; background: var(--bg-4); border-radius: var(--radius-pill); transition: background var(--dur-flip) var(--ease-out); cursor: pointer; border: 1px solid var(--border-default); }
112
+ .switch::after { content: ''; position: absolute; top: 1px; left: 1px; width: 16px; height: 16px; background: var(--fg-0); border-radius: 50%; transition: transform var(--dur-flip) var(--ease-out); }
113
+ .switch.is-on { background: var(--accent); border-color: var(--accent); }
114
+ .switch.is-on::after { transform: translateX(16px); background: var(--accent-fg); }
115
+
116
+ /* ─── Status bar ─── */
117
+ .status { grid-area: status; display: flex; align-items: center; gap: var(--space-4); padding: 0 var(--space-4); background: var(--bg-1); border-top: 1px solid var(--border-subtle); font-family: var(--font-mono); font-size: var(--type-xs); color: var(--fg-2); }
118
+ .status .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--status-success); }
119
+ .status .accent-text { color: var(--accent); }
120
+ .status .spacer { flex: 1; }
121
+ </style>
122
+ </head>
123
+ <body class="app">
124
+ <main class="specimen">
125
+ <div class="app-shell">
126
+ <!-- TOP NAV -->
127
+ <header class="topnav">
128
+ <a class="brand"><span class="mark">S</span>Squadron</a>
129
+ <div class="segmented" role="group" aria-label="View density">
130
+ <button class="is-on" data-density="cozy">cozy</button>
131
+ <button data-density="compact">compact</button>
132
+ </div>
133
+ <div class="spacer"></div>
134
+ <input class="search" type="search" placeholder="search… (⌘ K)" />
135
+ <div class="accent-picker" role="group" aria-label="Accent">
136
+ <button class="accent-swatch is-on" data-team="default" style="background: var(--accent);" aria-label="default"></button>
137
+ <button class="accent-swatch" data-team="cyan" style="background: oklch(72% 0.16 220);" aria-label="cyan"></button>
138
+ <button class="accent-swatch" data-team="emerald" style="background: oklch(70% 0.16 150);" aria-label="emerald"></button>
139
+ <button class="accent-swatch" data-team="violet" style="background: oklch(64% 0.20 300);" aria-label="violet"></button>
140
+ </div>
141
+ <button class="icon-btn" id="theme-toggle" title="Toggle theme">☾</button>
142
+ <div class="avatar" aria-label="Kim Park">KP</div>
143
+ </header>
144
+
145
+ <!-- SIDEBAR -->
146
+ <aside class="sidebar">
147
+ <h3>Workspace</h3>
148
+ <ul>
149
+ <li><a class="is-active" data-screen="roster">Roster<span class="count">11</span></a></li>
150
+ <li><a data-screen="activity">Activity<span class="count">23</span></a></li>
151
+ <li><a data-screen="settings">Settings<span class="count">—</span></a></li>
152
+ </ul>
153
+ <h3>Saved views</h3>
154
+ <ul>
155
+ <li><a>Forwards U21<span class="count">5</span></a></li>
156
+ <li><a>Last 5 matches<span class="count">5</span></a></li>
157
+ <li><a>Free agents<span class="count">23</span></a></li>
158
+ </ul>
159
+ </aside>
160
+
161
+ <!-- MAIN -->
162
+ <section class="main">
163
+ <!-- Screen 1: Roster -->
164
+ <div class="screen is-on" data-screen="roster">
165
+ <div class="hero">
166
+ <div>
167
+ <h1>Roster</h1>
168
+ <p class="lede">Eleven players selected for this weekend's match against the Greens. Two open slots remain — drag from Reserves to fill.</p>
169
+ </div>
170
+ <div class="actions">
171
+ <button class="btn btn--secondary">Share</button>
172
+ <button class="btn btn--primary">Publish lineup</button>
173
+ </div>
174
+ </div>
175
+ <div class="card-grid">
176
+ <article class="card"><div class="head"><span class="title">Kim Park</span><span class="pill">captain</span></div><p class="meta">#9 · Forward · age 27</p><p class="body">24 matches · 14 goals · 3 assists. Top scorer this season.</p></article>
177
+ <article class="card"><div class="head"><span class="title">Jonas Weber</span><span class="pill pill--ghost">starter</span></div><p class="meta">#8 · Midfield · age 24</p><p class="body">22 matches · 3 goals · 9 assists. Tempo setter.</p></article>
178
+ <article class="card"><div class="head"><span class="title">Marta Silva</span><span class="pill pill--ghost">starter</span></div><p class="meta">#4 · Defender · age 29</p><p class="body">23 matches · 1 goal · clean sheets in 11.</p></article>
179
+ <article class="card"><div class="head"><span class="title">Liam Chen</span><span class="pill pill--ghost">starter</span></div><p class="meta">#1 · Goalkeeper · age 31</p><p class="body">19 matches · 0.84 goals conceded per match.</p></article>
180
+ <article class="card"><div class="head"><span class="title">Amara Okafor</span><span class="pill pill--ghost">starter</span></div><p class="meta">#10 · Winger · age 22</p><p class="body">18 matches · 6 goals · 11 assists. Fastest player on roster.</p></article>
181
+ <article class="card"><div class="head"><span class="title">Open slot</span><span class="pill pill--ghost">draft</span></div><p class="meta">— · — · —</p><p class="body">Drag a player from Reserves to fill this position.</p></article>
182
+ </div>
183
+ </div>
184
+
185
+ <!-- Screen 2: Activity -->
186
+ <div class="screen" data-screen="activity">
187
+ <div class="hero">
188
+ <div>
189
+ <h1>Activity</h1>
190
+ <p class="lede">Every roster change, sync event, and squad note across the team. Filter by author, action, or date.</p>
191
+ </div>
192
+ <div class="actions">
193
+ <button class="btn btn--secondary">Export CSV</button>
194
+ </div>
195
+ </div>
196
+ <div class="activity">
197
+ <div class="activity-row"><span class="dot success"></span><span class="text"><strong>Kim Park</strong> <span class="who">confirmed match availability</span></span><span class="when">2m ago</span></div>
198
+ <div class="activity-row"><span class="dot info"></span><span class="text"><strong>Coach Reyes</strong> <span class="who">moved Marta Silva to starter</span></span><span class="when">12m ago</span></div>
199
+ <div class="activity-row"><span class="dot warn"></span><span class="text"><strong>Jonas Weber</strong> <span class="who">flagged a fitness concern</span></span><span class="when">1h ago</span></div>
200
+ <div class="activity-row"><span class="dot success"></span><span class="text"><strong>System</strong> <span class="who">auto-saved roster draft</span></span><span class="when">2h ago</span></div>
201
+ <div class="activity-row"><span class="dot info"></span><span class="text"><strong>Amara Okafor</strong> <span class="who">updated medical clearance</span></span><span class="when">3h ago</span></div>
202
+ <div class="activity-row"><span class="dot success"></span><span class="text"><strong>Coach Reyes</strong> <span class="who">published lineup for Sun 14:00 match</span></span><span class="when">yesterday</span></div>
203
+ </div>
204
+ </div>
205
+
206
+ <!-- Screen 3: Settings -->
207
+ <div class="screen" data-screen="settings">
208
+ <div class="hero">
209
+ <div>
210
+ <h1>Settings</h1>
211
+ <p class="lede">Workspace preferences for the active roster. Changes apply immediately and sync across devices.</p>
212
+ </div>
213
+ </div>
214
+ <div class="settings">
215
+ <div class="setting-row">
216
+ <div><div class="title">Auto-snapshot on edit</div><div class="sub">enables /rollback</div></div>
217
+ <span class="switch is-on" role="switch" aria-checked="true"></span>
218
+ </div>
219
+ <div class="setting-row">
220
+ <div><div class="title">Send anonymized usage data</div><div class="sub">helps improve the design tools</div></div>
221
+ <span class="switch" role="switch" aria-checked="false"></span>
222
+ </div>
223
+ <div class="setting-row">
224
+ <div><div class="title">Run a11y critic on save</div><div class="sub">slows save by ~200ms</div></div>
225
+ <span class="switch is-on" role="switch" aria-checked="true"></span>
226
+ </div>
227
+ <div class="setting-row">
228
+ <div><div class="title">Beta features</div><div class="sub">org admin only</div></div>
229
+ <span class="switch" role="switch" aria-checked="false"></span>
230
+ </div>
231
+ </div>
232
+ </div>
233
+ </section>
234
+
235
+ <!-- STATUS BAR -->
236
+ <footer class="status">
237
+ <span class="dot" aria-hidden="true"></span>
238
+ <span>synced · 19:42:08</span>
239
+ <span class="spacer"></span>
240
+ <span>v0.12.3</span>
241
+ <span class="accent-text">match-day mode</span>
242
+ <span>11 / 11 confirmed</span>
243
+ </footer>
244
+ </div>
245
+ </main>
246
+
247
+ <script>
248
+ /* EDITMODE-BEGIN — agents may edit these defaults in-place */
249
+ const DEFAULTS = {
250
+ screen: 'roster',
251
+ density: 'cozy',
252
+ team: 'default',
253
+ theme: 'dark'
254
+ };
255
+ /* EDITMODE-END */
256
+
257
+ const root = document.documentElement;
258
+
259
+ // Theme toggle
260
+ root.setAttribute('data-theme', DEFAULTS.theme);
261
+ root.setAttribute('data-team', DEFAULTS.team);
262
+ document.getElementById('theme-toggle').addEventListener('click', () => {
263
+ const next = root.getAttribute('data-theme') === 'dark' ? 'light' : 'dark';
264
+ root.setAttribute('data-theme', next);
265
+ });
266
+
267
+ // Accent picker
268
+ document.querySelectorAll('.accent-swatch').forEach(btn => {
269
+ btn.addEventListener('click', () => {
270
+ document.querySelectorAll('.accent-swatch').forEach(b => b.classList.remove('is-on'));
271
+ btn.classList.add('is-on');
272
+ root.setAttribute('data-team', btn.dataset.team);
273
+ });
274
+ });
275
+
276
+ // View switcher
277
+ document.querySelectorAll('.sidebar a[data-screen]').forEach(link => {
278
+ link.addEventListener('click', e => {
279
+ e.preventDefault();
280
+ const target = link.dataset.screen;
281
+ document.querySelectorAll('.sidebar a[data-screen]').forEach(a => a.classList.toggle('is-active', a === link));
282
+ document.querySelectorAll('.screen').forEach(s => s.classList.toggle('is-on', s.dataset.screen === target));
283
+ });
284
+ });
285
+
286
+ // Density toggle (segmented)
287
+ document.querySelectorAll('.segmented > button').forEach(btn => {
288
+ btn.addEventListener('click', () => {
289
+ btn.parentElement.querySelectorAll('button').forEach(b => b.classList.toggle('is-on', b === btn));
290
+ });
291
+ });
292
+
293
+ // Settings switches
294
+ document.querySelectorAll('.switch').forEach(sw => {
295
+ sw.addEventListener('click', () => {
296
+ sw.classList.toggle('is-on');
297
+ sw.setAttribute('aria-checked', sw.classList.contains('is-on'));
298
+ });
299
+ });
300
+ </script>
301
+ </body>
302
+ </html>