@phuc1403/musketeer 0.9.0 → 0.10.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 (163) hide show
  1. package/INSTALLATION.md +52 -52
  2. package/bin/musketeer.js +168 -168
  3. package/package.json +48 -48
  4. package/src/dotnet-scaffold-copier.js +79 -79
  5. package/src/provisioner/detect.js +93 -93
  6. package/src/self-update.js +77 -77
  7. package/template/.claude/agents/git-manager.md +18 -18
  8. package/template/.claude/agents/hallmark-auditor.md +78 -78
  9. package/template/.claude/agents/researcher.md +33 -33
  10. package/template/.claude/hooks/block-unsafe-adr-title.cjs +85 -85
  11. package/template/.claude/hooks/init-adr-dir.cjs +173 -173
  12. package/template/.claude/hooks/inject-adr-flags.cjs +94 -94
  13. package/template/.claude/hooks/lib/adr/command-scan.cjs +115 -115
  14. package/template/.claude/hooks/lib/characteristics/checker.cjs +357 -357
  15. package/template/.claude/hooks/lib/git-info-cache.cjs +191 -191
  16. package/template/.claude/hooks/sync-adr-toc.cjs +146 -146
  17. package/template/.claude/hooks/usage-quota-cache-refresh.cjs +166 -166
  18. package/template/.claude/hooks/validate-characteristics-hook.cjs +66 -66
  19. package/template/.claude/hooks/validate-cml-hook.js +145 -145
  20. package/template/.claude/skills/adr-writer/SKILL.md +48 -48
  21. package/template/.claude/skills/adr-writer/references/adr-example.md +35 -35
  22. package/template/.claude/skills/architecture-characteristic-writer/SKILL.md +215 -215
  23. package/template/.claude/skills/architecture-characteristic-writer/assets/worksheet-template.md +29 -29
  24. package/template/.claude/skills/architecture-characteristic-writer/references/characteristics-catalog.md +40 -40
  25. package/template/.claude/skills/architecture-characteristic-writer/scripts/ranking-table.cjs +171 -171
  26. package/template/.claude/skills/context-map/SKILL.md +80 -80
  27. package/template/.claude/skills/context-map/example.cml +106 -106
  28. package/template/.claude/skills/context-map/reference/Bounded Context/Bounded Context.md +40 -40
  29. package/template/.claude/skills/context-map/reference/Bounded Context/businessModel.md +5 -5
  30. package/template/.claude/skills/context-map/reference/Bounded Context/domainVisionStatement.md +2 -2
  31. package/template/.claude/skills/context-map/reference/Bounded Context/evolution.md +5 -5
  32. package/template/.claude/skills/context-map/reference/Bounded Context/implementationTechnology.md +1 -1
  33. package/template/.claude/skills/context-map/reference/Bounded Context/implements.md +1 -1
  34. package/template/.claude/skills/context-map/reference/Bounded Context/knowledgeLevel.md +4 -4
  35. package/template/.claude/skills/context-map/reference/Bounded Context/realizes.md +9 -9
  36. package/template/.claude/skills/context-map/reference/Bounded Context/refines.md +10 -10
  37. package/template/.claude/skills/context-map/reference/Bounded Context/responsibilities.md +26 -26
  38. package/template/.claude/skills/context-map/reference/Bounded Context/type.md +23 -23
  39. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Anticorruption Layer.md +5 -5
  40. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Bounded Context Relationship.md +12 -12
  41. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Conformist.md +5 -5
  42. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Customer-Supplier (C-S).md +22 -22
  43. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Open Host Service.md +4 -4
  44. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Partnership (P).md +13 -13
  45. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Published Language.md +4 -4
  46. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Shared Kernel (SK).md +12 -12
  47. package/template/.claude/skills/context-map/reference/Context Map.md +62 -62
  48. package/template/.claude/skills/context-map/reference/Domain/Domain.md +30 -30
  49. package/template/.claude/skills/context-map/reference/Domain/supports.md +33 -33
  50. package/template/.claude/skills/context-map/reference/Domain/type.md +3 -3
  51. package/template/.claude/skills/context-map/reference/Semantic Rules.md +32 -32
  52. package/template/.claude/skills/hallmark/SKILL.md +552 -552
  53. package/template/.claude/skills/hallmark/references/anti-patterns.md +412 -412
  54. package/template/.claude/skills/hallmark/references/assets.md +406 -406
  55. package/template/.claude/skills/hallmark/references/color.md +95 -95
  56. package/template/.claude/skills/hallmark/references/component-cookbook.md +256 -256
  57. package/template/.claude/skills/hallmark/references/components/c1-outlined-chip.md +12 -12
  58. package/template/.claude/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -16
  59. package/template/.claude/skills/hallmark/references/components/c3-typographic-link.md +8 -8
  60. package/template/.claude/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -16
  61. package/template/.claude/skills/hallmark/references/components/f1-bento-grid.md +20 -20
  62. package/template/.claude/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -20
  63. package/template/.claude/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -11
  64. package/template/.claude/skills/hallmark/references/components/f4-step-sequence.md +11 -11
  65. package/template/.claude/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -11
  66. package/template/.claude/skills/hallmark/references/components/f6-product-card-grid.md +41 -41
  67. package/template/.claude/skills/hallmark/references/components/ft1-mast-headed.md +13 -13
  68. package/template/.claude/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -10
  69. package/template/.claude/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -12
  70. package/template/.claude/skills/hallmark/references/components/ft4-dense-typographic.md +10 -10
  71. package/template/.claude/skills/hallmark/references/components/ft5-statement.md +21 -21
  72. package/template/.claude/skills/hallmark/references/components/ft6-letter-close.md +19 -19
  73. package/template/.claude/skills/hallmark/references/components/ft7-newsletter-first.md +27 -27
  74. package/template/.claude/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -25
  75. package/template/.claude/skills/hallmark/references/components/h1-marquee.md +15 -15
  76. package/template/.claude/skills/hallmark/references/components/h2-split-diptych.md +15 -15
  77. package/template/.claude/skills/hallmark/references/components/h3-quote-led.md +11 -11
  78. package/template/.claude/skills/hallmark/references/components/h4-stat-led.md +14 -14
  79. package/template/.claude/skills/hallmark/references/components/h5-letter-hero.md +11 -11
  80. package/template/.claude/skills/hallmark/references/components/h6-photographic-fold.md +16 -16
  81. package/template/.claude/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -27
  82. package/template/.claude/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -23
  83. package/template/.claude/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -27
  84. package/template/.claude/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -12
  85. package/template/.claude/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -19
  86. package/template/.claude/skills/hallmark/references/components/n2-floating-chip.md +14 -14
  87. package/template/.claude/skills/hallmark/references/components/n3-side-rail.md +14 -14
  88. package/template/.claude/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -9
  89. package/template/.claude/skills/hallmark/references/components/n5-floating-pill.md +28 -28
  90. package/template/.claude/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -24
  91. package/template/.claude/skills/hallmark/references/components/n7-brutal-slab.md +22 -22
  92. package/template/.claude/skills/hallmark/references/components/n8-terminal-command.md +21 -21
  93. package/template/.claude/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -17
  94. package/template/.claude/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -15
  95. package/template/.claude/skills/hallmark/references/components/s2-hanging.md +13 -13
  96. package/template/.claude/skills/hallmark/references/components/s3-sticky-pinned.md +19 -19
  97. package/template/.claude/skills/hallmark/references/components/s4-inline-no-break.md +11 -11
  98. package/template/.claude/skills/hallmark/references/components/s5-bottom-anchored.md +13 -13
  99. package/template/.claude/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -12
  100. package/template/.claude/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -19
  101. package/template/.claude/skills/hallmark/references/components/t3-single-huge-quote.md +11 -11
  102. package/template/.claude/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -14
  103. package/template/.claude/skills/hallmark/references/contract.md +24 -24
  104. package/template/.claude/skills/hallmark/references/copy.md +182 -182
  105. package/template/.claude/skills/hallmark/references/custom-craft.md +626 -626
  106. package/template/.claude/skills/hallmark/references/custom-theme.md +329 -329
  107. package/template/.claude/skills/hallmark/references/design-md.md +116 -116
  108. package/template/.claude/skills/hallmark/references/export-formats.md +328 -328
  109. package/template/.claude/skills/hallmark/references/floating-nav.md +89 -89
  110. package/template/.claude/skills/hallmark/references/genres/atmospheric.md +65 -65
  111. package/template/.claude/skills/hallmark/references/genres/editorial.md +70 -70
  112. package/template/.claude/skills/hallmark/references/genres/modern-minimal.md +67 -67
  113. package/template/.claude/skills/hallmark/references/genres/playful.md +65 -65
  114. package/template/.claude/skills/hallmark/references/hero-enrichment.md +474 -474
  115. package/template/.claude/skills/hallmark/references/imagery-kit.md +170 -170
  116. package/template/.claude/skills/hallmark/references/interaction-and-states.md +207 -207
  117. package/template/.claude/skills/hallmark/references/layout-and-space.md +111 -111
  118. package/template/.claude/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -35
  119. package/template/.claude/skills/hallmark/references/macrostructures/02-long-document.md +34 -34
  120. package/template/.claude/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -31
  121. package/template/.claude/skills/hallmark/references/macrostructures/04-stat-led.md +32 -32
  122. package/template/.claude/skills/hallmark/references/macrostructures/05-workbench.md +32 -32
  123. package/template/.claude/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -33
  124. package/template/.claude/skills/hallmark/references/macrostructures/07-manifesto.md +32 -32
  125. package/template/.claude/skills/hallmark/references/macrostructures/08-photographic.md +34 -34
  126. package/template/.claude/skills/hallmark/references/macrostructures/09-quote-led.md +32 -32
  127. package/template/.claude/skills/hallmark/references/macrostructures/10-specimen.md +32 -32
  128. package/template/.claude/skills/hallmark/references/macrostructures/11-catalogue.md +23 -23
  129. package/template/.claude/skills/hallmark/references/macrostructures/12-letter.md +23 -23
  130. package/template/.claude/skills/hallmark/references/macrostructures/13-index-first.md +23 -23
  131. package/template/.claude/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -23
  132. package/template/.claude/skills/hallmark/references/macrostructures/15-split-studio.md +23 -23
  133. package/template/.claude/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -23
  134. package/template/.claude/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -23
  135. package/template/.claude/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -23
  136. package/template/.claude/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -23
  137. package/template/.claude/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -23
  138. package/template/.claude/skills/hallmark/references/macrostructures/21-component-playground.md +23 -23
  139. package/template/.claude/skills/hallmark/references/macrostructures.md +89 -89
  140. package/template/.claude/skills/hallmark/references/microinteractions.md +260 -260
  141. package/template/.claude/skills/hallmark/references/motion.md +109 -109
  142. package/template/.claude/skills/hallmark/references/preview-examples.md +49 -49
  143. package/template/.claude/skills/hallmark/references/responsive.md +138 -138
  144. package/template/.claude/skills/hallmark/references/slop-test.md +205 -205
  145. package/template/.claude/skills/hallmark/references/structure.md +164 -164
  146. package/template/.claude/skills/hallmark/references/study.md +511 -511
  147. package/template/.claude/skills/hallmark/references/typography.md +243 -243
  148. package/template/.claude/skills/hallmark/references/verbs/audit.md +25 -25
  149. package/template/.claude/skills/hallmark/references/verbs/redesign.md +269 -269
  150. package/template/.claude/skills/hallmark-loop/SKILL.md +105 -105
  151. package/template/.claude/skills/hallmark-loop/references/auditor-call.md +60 -60
  152. package/template/.claude/skills/hallmark-loop/references/capture.md +78 -78
  153. package/template/.claude/skills/hallmark-loop/references/loop-control.md +79 -79
  154. package/template/.claude/skills/handoff/SKILL.md +15 -15
  155. package/template/.claude/skills/knowledge-crunching/SKILL.md +94 -94
  156. package/template/.claude/skills/research/SKILL.md +69 -69
  157. package/template/.claude/skills/tdd/SKILL.md +142 -142
  158. package/template/.claude/skills/tdd/deep-modules.md +15 -15
  159. package/template/.claude/skills/tdd/interface-design.md +31 -31
  160. package/template/.claude/skills/tdd/mocking.md +59 -59
  161. package/template/.claude/skills/tdd/refactoring.md +10 -10
  162. package/template/.claude/skills/tdd/tests.md +61 -61
  163. package/template/.claude/statusline.cjs +100 -37
@@ -1,16 +1,16 @@
1
- ### C2 · Inline form-as-CTA
2
- The CTA *is* the form — a single email input with a "Submit →" beside it. No separate landing for sign-up.
3
- *Use when:* the action is collecting an email.
4
- *Don't confuse with:* C1 Outlined chip (which navigates, not submits).
5
-
6
- ```html
7
- <form class="cta-form">
8
- <label for="email" class="visually-hidden">Email</label>
9
- <input id="email" type="email" placeholder="you@example.com" />
10
- <button type="submit">Send →</button>
11
- </form>
12
- ```
13
- ```css
14
- .cta-form { display: grid; grid-template-columns: 1fr auto; border-bottom: 1px solid var(--color-ink); }
15
- .cta-form input { background: none; border: 0; padding: 0.7rem 0; min-height: 44px; }
16
- ```
1
+ ### C2 · Inline form-as-CTA
2
+ The CTA *is* the form — a single email input with a "Submit →" beside it. No separate landing for sign-up.
3
+ *Use when:* the action is collecting an email.
4
+ *Don't confuse with:* C1 Outlined chip (which navigates, not submits).
5
+
6
+ ```html
7
+ <form class="cta-form">
8
+ <label for="email" class="visually-hidden">Email</label>
9
+ <input id="email" type="email" placeholder="you@example.com" />
10
+ <button type="submit">Send →</button>
11
+ </form>
12
+ ```
13
+ ```css
14
+ .cta-form { display: grid; grid-template-columns: 1fr auto; border-bottom: 1px solid var(--color-ink); }
15
+ .cta-form input { background: none; border: 0; padding: 0.7rem 0; min-height: 44px; }
16
+ ```
@@ -1,8 +1,8 @@
1
- ### C3 · Typographic link
2
- Just a word, an arrow, and a 1-px underline. No box, no fill.
3
- *Use when:* the page is editorial / Long Document; CTAs should not shout.
4
- *Don't confuse with:* C1 Outlined chip (which is bordered).
5
-
6
- ```html
7
- <a class="link">Read the case study →</a>
8
- ```
1
+ ### C3 · Typographic link
2
+ Just a word, an arrow, and a 1-px underline. No box, no fill.
3
+ *Use when:* the page is editorial / Long Document; CTAs should not shout.
4
+ *Don't confuse with:* C1 Outlined chip (which is bordered).
5
+
6
+ ```html
7
+ <a class="link">Read the case study →</a>
8
+ ```
@@ -1,16 +1,16 @@
1
- ### C4 · Sticky bottom bar
2
- A horizontal bar pinned to the viewport bottom, holding a CTA + a brief reassurance line.
3
- *Use when:* the page is long and the CTA needs to be reachable always.
4
- *Don't confuse with:* anything in the fold; this is a *persistent* element, not a hero CTA.
5
-
6
- ```html
7
- <aside class="cta-sticky">
8
- <span>Try it free for 14 days.</span>
9
- <a class="cta-outline">Start →</a>
10
- </aside>
11
- ```
12
- ```css
13
- .cta-sticky { position: fixed; left: 0; right: 0; bottom: 0; padding: var(--space-sm) var(--space-md); background: var(--color-paper); border-top: 1px solid var(--color-rule); display: flex; justify-content: space-between; align-items: center; }
14
- ```
15
-
16
- ---
1
+ ### C4 · Sticky bottom bar
2
+ A horizontal bar pinned to the viewport bottom, holding a CTA + a brief reassurance line.
3
+ *Use when:* the page is long and the CTA needs to be reachable always.
4
+ *Don't confuse with:* anything in the fold; this is a *persistent* element, not a hero CTA.
5
+
6
+ ```html
7
+ <aside class="cta-sticky">
8
+ <span>Try it free for 14 days.</span>
9
+ <a class="cta-outline">Start →</a>
10
+ </aside>
11
+ ```
12
+ ```css
13
+ .cta-sticky { position: fixed; left: 0; right: 0; bottom: 0; padding: var(--space-sm) var(--space-md); background: var(--color-paper); border-top: 1px solid var(--color-rule); display: flex; justify-content: space-between; align-items: center; }
14
+ ```
15
+
16
+ ---
@@ -1,20 +1,20 @@
1
-
2
- ### F1 · Bento grid
3
- Asymmetric grid of 8–15 tiles in mixed spans (1×1, 2×1, 1×2, 2×2). Visual rhythm via size.
4
- *Use when:* multiple equally-valid entry points; SaaS feature page.
5
- *Don't confuse with:* F2 Sticky-scroll (which stacks vertically with sticky pacing).
6
-
7
- ```html
8
- <section class="bento">
9
- <article class="cell span-2x2">…</article>
10
- <article class="cell span-1x1">…</article>
11
- <article class="cell span-2x1">…</article>
12
- </section>
13
- ```
14
- ```css
15
- .bento { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 12rem; gap: var(--space-md); }
16
- .span-2x2 { grid-column: span 2; grid-row: span 2; }
17
- .span-2x1 { grid-column: span 2; }
18
- .span-1x2 { grid-row: span 2; }
19
- @media (max-width: 56rem) { .bento { grid-template-columns: repeat(2, 1fr); } }
20
- ```
1
+
2
+ ### F1 · Bento grid
3
+ Asymmetric grid of 8–15 tiles in mixed spans (1×1, 2×1, 1×2, 2×2). Visual rhythm via size.
4
+ *Use when:* multiple equally-valid entry points; SaaS feature page.
5
+ *Don't confuse with:* F2 Sticky-scroll (which stacks vertically with sticky pacing).
6
+
7
+ ```html
8
+ <section class="bento">
9
+ <article class="cell span-2x2">…</article>
10
+ <article class="cell span-1x1">…</article>
11
+ <article class="cell span-2x1">…</article>
12
+ </section>
13
+ ```
14
+ ```css
15
+ .bento { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 12rem; gap: var(--space-md); }
16
+ .span-2x2 { grid-column: span 2; grid-row: span 2; }
17
+ .span-2x1 { grid-column: span 2; }
18
+ .span-1x2 { grid-row: span 2; }
19
+ @media (max-width: 56rem) { .bento { grid-template-columns: repeat(2, 1fr); } }
20
+ ```
@@ -1,20 +1,20 @@
1
- ### F2 · Sticky-scroll stack
2
- Sticky left pane, scrolling right pane that cycles through related screenshots.
3
- *Use when:* feature has multiple sub-states worth showing in sequence.
4
- *Don't confuse with:* F4 Step sequence (which is linearly numbered, not synced).
5
-
6
- ```html
7
- <section class="sticky-stack">
8
- <div class="pane-sticky"><h3>…</h3><p>…</p></div>
9
- <div class="pane-scroll">
10
- <figure>1</figure><figure>2</figure><figure>3</figure>
11
- </div>
12
- </section>
13
- ```
14
- ```css
15
- .sticky-stack { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2xl); }
16
- /* `calc(--banner-height + --space-xl)` so the sticky pane docks below the
17
- nav with breathing room. Falls back to --space-xl alone when no sticky
18
- nav is on the page (slop-test gate 68). */
19
- .pane-sticky { position: sticky; top: calc(var(--banner-height, 0px) + var(--space-xl)); align-self: start; z-index: var(--z-sticky); }
20
- ```
1
+ ### F2 · Sticky-scroll stack
2
+ Sticky left pane, scrolling right pane that cycles through related screenshots.
3
+ *Use when:* feature has multiple sub-states worth showing in sequence.
4
+ *Don't confuse with:* F4 Step sequence (which is linearly numbered, not synced).
5
+
6
+ ```html
7
+ <section class="sticky-stack">
8
+ <div class="pane-sticky"><h3>…</h3><p>…</p></div>
9
+ <div class="pane-scroll">
10
+ <figure>1</figure><figure>2</figure><figure>3</figure>
11
+ </div>
12
+ </section>
13
+ ```
14
+ ```css
15
+ .sticky-stack { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2xl); }
16
+ /* `calc(--banner-height + --space-xl)` so the sticky pane docks below the
17
+ nav with breathing room. Falls back to --space-xl alone when no sticky
18
+ nav is on the page (slop-test gate 68). */
19
+ .pane-sticky { position: sticky; top: calc(var(--banner-height, 0px) + var(--space-xl)); align-self: start; z-index: var(--z-sticky); }
20
+ ```
@@ -1,11 +1,11 @@
1
- ### F3 · Tabular spec sheet
2
- Each row is a feature; columns hold name, value, footnote. Hairline rules between rows. Tabular numerics.
3
- *Use when:* features compare quantitatively.
4
- *Don't confuse with:* F1 Bento (which is non-tabular and visually rhythmic).
5
-
6
- ```html
7
- <table class="spec-sheet tnum">
8
- <tr><th>Latency</th><td>p99 &lt; 50 ms</td><td class="muted">measured externally</td></tr>
9
- <tr>…</tr>
10
- </table>
11
- ```
1
+ ### F3 · Tabular spec sheet
2
+ Each row is a feature; columns hold name, value, footnote. Hairline rules between rows. Tabular numerics.
3
+ *Use when:* features compare quantitatively.
4
+ *Don't confuse with:* F1 Bento (which is non-tabular and visually rhythmic).
5
+
6
+ ```html
7
+ <table class="spec-sheet tnum">
8
+ <tr><th>Latency</th><td>p99 &lt; 50 ms</td><td class="muted">measured externally</td></tr>
9
+ <tr>…</tr>
10
+ </table>
11
+ ```
@@ -1,11 +1,11 @@
1
- ### F4 · Step sequence
2
- Numbered stages (`1.0 → 2.0 → 3.0`) flow vertically. Each stage has a heading, a paragraph, sometimes a small visual.
3
- *Use when:* the product is a workflow, not a single moment.
4
- *Don't confuse with:* F2 Sticky-scroll (which doesn't number stages).
5
-
6
- ```html
7
- <ol class="steps">
8
- <li><span class="stage">1.0</span><h3>Intake.</h3><p>…</p></li>
9
- <li><span class="stage">2.0</span><h3>Plan.</h3><p>…</p></li>
10
- </ol>
11
- ```
1
+ ### F4 · Step sequence
2
+ Numbered stages (`1.0 → 2.0 → 3.0`) flow vertically. Each stage has a heading, a paragraph, sometimes a small visual.
3
+ *Use when:* the product is a workflow, not a single moment.
4
+ *Don't confuse with:* F2 Sticky-scroll (which doesn't number stages).
5
+
6
+ ```html
7
+ <ol class="steps">
8
+ <li><span class="stage">1.0</span><h3>Intake.</h3><p>…</p></li>
9
+ <li><span class="stage">2.0</span><h3>Plan.</h3><p>…</p></li>
10
+ </ol>
11
+ ```
@@ -1,11 +1,11 @@
1
- ### F5 · Annotated screenshot
2
- A product capture sits centre-stage with arrows or short labels pointing to UI details.
3
- *Use when:* the product UI itself is the explanation.
4
- *Don't confuse with:* F2 Sticky-scroll (which uses multiple screenshots in sequence).
5
-
6
- ```html
7
- <figure class="annotated">
8
- <img src="" />
9
- <span class="callout" style="--x:60%; --y:30%;">→ assigns automatically.</span>
10
- </figure>
11
- ```
1
+ ### F5 · Annotated screenshot
2
+ A product capture sits centre-stage with arrows or short labels pointing to UI details.
3
+ *Use when:* the product UI itself is the explanation.
4
+ *Don't confuse with:* F2 Sticky-scroll (which uses multiple screenshots in sequence).
5
+
6
+ ```html
7
+ <figure class="annotated">
8
+ <img src="" />
9
+ <span class="callout" style="--x:60%; --y:30%;">→ assigns automatically.</span>
10
+ </figure>
11
+ ```
@@ -1,41 +1,41 @@
1
- ### F6 · Product card grid
2
- Each card is a product, not a feature. Image · name · price · one micro-action. Reads like a shop floor, not a marketing site.
3
- *Use when:* the brief is commerce, catalogue, lookbook, marketplace — anything where the page sells *things*, not *features*.
4
- *Don't confuse with:* F1 Bento (which sells *features*; tiles vary in size and span). Product cards are uniform on purpose — the rhythm comes from the products, not the layout.
5
-
6
- **Variation knobs:** card ratio (3/4 portrait · 1/1 square · 4/3 landscape) · density (3-up · 4-up · 5-up) · price treatment (under name · over image · hover-reveal) · micro-action (Add · Save · View → · none).
7
-
8
- ```html
9
- <section class="product-grid">
10
- <article class="product">
11
- <a class="product__media" href=""><img src="" alt="" loading="lazy" /></a>
12
- <div class="product__meta">
13
- <h3 class="product__name">Linen Apron · Indigo</h3>
14
- <p class="product__price tabular-nums">¥ 6,400</p>
15
- </div>
16
- <button class="product__add" aria-label="Add Linen Apron to bag">+</button>
17
- </article>
18
- <!-- ... more products, uniform shape ... -->
19
- </section>
20
- ```
21
- ```css
22
- .product-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-xl) var(--space-lg); }
23
- @media (max-width: 60rem) { .product-grid { grid-template-columns: repeat(2, 1fr); } }
24
- .product { display: grid; gap: var(--space-sm); position: relative; }
25
- .product__media { display: block; aspect-ratio: 3 / 4; background: var(--color-paper-2); overflow: hidden; }
26
- .product__media img { width: 100%; height: 100%; object-fit: cover; transition: transform var(--dur-long) var(--ease-out); }
27
- .product__media:hover img { transform: scale(1.02); }
28
- .product__name { font-family: var(--font-body); font-size: var(--text-md); margin: 0; }
29
- .product__price { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--color-ink-2); }
30
- .product__add { position: absolute; top: var(--space-sm); right: var(--space-sm); width: 32px; height: 32px; background: var(--color-paper); border: var(--rule-hair) solid var(--color-rule-2); cursor: pointer; opacity: 0; transition: opacity var(--dur-short) var(--ease-out); }
31
- .product:hover .product__add, .product:focus-within .product__add { opacity: 1; }
32
- @media (pointer: coarse) { .product__add { opacity: 1; } }
33
- ```
34
-
35
- **Anti-patterns to avoid in product grids:**
36
- - Don't borrow Bento's irregular spans — products want uniform rhythm.
37
- - Don't put feature-style two-line descriptions under product names. The price *is* the description.
38
- - Don't auto-scale the image on idle — only on hover, and only by 1.02× max.
39
- - Don't use cards with shadow + radius + border + tile + ribbon. Pick one container signal.
40
-
41
- ---
1
+ ### F6 · Product card grid
2
+ Each card is a product, not a feature. Image · name · price · one micro-action. Reads like a shop floor, not a marketing site.
3
+ *Use when:* the brief is commerce, catalogue, lookbook, marketplace — anything where the page sells *things*, not *features*.
4
+ *Don't confuse with:* F1 Bento (which sells *features*; tiles vary in size and span). Product cards are uniform on purpose — the rhythm comes from the products, not the layout.
5
+
6
+ **Variation knobs:** card ratio (3/4 portrait · 1/1 square · 4/3 landscape) · density (3-up · 4-up · 5-up) · price treatment (under name · over image · hover-reveal) · micro-action (Add · Save · View → · none).
7
+
8
+ ```html
9
+ <section class="product-grid">
10
+ <article class="product">
11
+ <a class="product__media" href=""><img src="" alt="" loading="lazy" /></a>
12
+ <div class="product__meta">
13
+ <h3 class="product__name">Linen Apron · Indigo</h3>
14
+ <p class="product__price tabular-nums">¥ 6,400</p>
15
+ </div>
16
+ <button class="product__add" aria-label="Add Linen Apron to bag">+</button>
17
+ </article>
18
+ <!-- ... more products, uniform shape ... -->
19
+ </section>
20
+ ```
21
+ ```css
22
+ .product-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-xl) var(--space-lg); }
23
+ @media (max-width: 60rem) { .product-grid { grid-template-columns: repeat(2, 1fr); } }
24
+ .product { display: grid; gap: var(--space-sm); position: relative; }
25
+ .product__media { display: block; aspect-ratio: 3 / 4; background: var(--color-paper-2); overflow: hidden; }
26
+ .product__media img { width: 100%; height: 100%; object-fit: cover; transition: transform var(--dur-long) var(--ease-out); }
27
+ .product__media:hover img { transform: scale(1.02); }
28
+ .product__name { font-family: var(--font-body); font-size: var(--text-md); margin: 0; }
29
+ .product__price { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--color-ink-2); }
30
+ .product__add { position: absolute; top: var(--space-sm); right: var(--space-sm); width: 32px; height: 32px; background: var(--color-paper); border: var(--rule-hair) solid var(--color-rule-2); cursor: pointer; opacity: 0; transition: opacity var(--dur-short) var(--ease-out); }
31
+ .product:hover .product__add, .product:focus-within .product__add { opacity: 1; }
32
+ @media (pointer: coarse) { .product__add { opacity: 1; } }
33
+ ```
34
+
35
+ **Anti-patterns to avoid in product grids:**
36
+ - Don't borrow Bento's irregular spans — products want uniform rhythm.
37
+ - Don't put feature-style two-line descriptions under product names. The price *is* the description.
38
+ - Don't auto-scale the image on idle — only on hover, and only by 1.02× max.
39
+ - Don't use cards with shadow + radius + border + tile + ribbon. Pick one container signal.
40
+
41
+ ---
@@ -1,13 +1,13 @@
1
-
2
- ### Ft1 · Mast-headed
3
- A wordmark and tagline anchor a single horizontal band. Two or three small links beside, address or licence below.
4
- *Use when:* the page has heavy content; the footer should be quiet and singular.
5
- *Don't confuse with:* Ft2 Inline-rule (which is even more reduced).
6
-
7
- ```html
8
- <footer class="foot-mast">
9
- <p class="wordmark">Studio Name</p>
10
- <p class="tagline muted">Designs that don't look generated.</p>
11
- <p class="links muted">Imprint · Privacy · Contact</p>
12
- </footer>
13
- ```
1
+
2
+ ### Ft1 · Mast-headed
3
+ A wordmark and tagline anchor a single horizontal band. Two or three small links beside, address or licence below.
4
+ *Use when:* the page has heavy content; the footer should be quiet and singular.
5
+ *Don't confuse with:* Ft2 Inline-rule (which is even more reduced).
6
+
7
+ ```html
8
+ <footer class="foot-mast">
9
+ <p class="wordmark">Studio Name</p>
10
+ <p class="tagline muted">Designs that don't look generated.</p>
11
+ <p class="links muted">Imprint · Privacy · Contact</p>
12
+ </footer>
13
+ ```
@@ -1,10 +1,10 @@
1
- ### Ft2 · Inline-rule single line
2
- A single horizontal line of credits, address, copyright. Hairline rule above. No columns.
3
- *Use when:* the page is editorial and the footer is afterthought.
4
- *Don't confuse with:* Ft4 Dense typographic (which packs more in).
5
-
6
- ```html
7
- <footer class="foot-line">
8
- <p>© 2026 · 137 Marlow Street · MIT licensed</p>
9
- </footer>
10
- ```
1
+ ### Ft2 · Inline-rule single line
2
+ A single horizontal line of credits, address, copyright. Hairline rule above. No columns.
3
+ *Use when:* the page is editorial and the footer is afterthought.
4
+ *Don't confuse with:* Ft4 Dense typographic (which packs more in).
5
+
6
+ ```html
7
+ <footer class="foot-line">
8
+ <p>© 2026 · 137 Marlow Street · MIT licensed</p>
9
+ </footer>
10
+ ```
@@ -1,12 +1,12 @@
1
- ### Ft3 · Index-style category list
2
- Three or four short columns, each headed by a category in small caps, holding 4–6 links each.
3
- *Use when:* the page is a hub or a documentation root.
4
- *Don't confuse with:* Ft4 Dense typographic (which is one big block, not columns).
5
-
6
- ```html
7
- <footer class="foot-index">
8
- <div><p class="caps">Product</p><ul>…</ul></div>
9
- <div><p class="caps">Company</p><ul>…</ul></div>
10
- <div><p class="caps">Resources</p><ul>…</ul></div>
11
- </footer>
12
- ```
1
+ ### Ft3 · Index-style category list
2
+ Three or four short columns, each headed by a category in small caps, holding 4–6 links each.
3
+ *Use when:* the page is a hub or a documentation root.
4
+ *Don't confuse with:* Ft4 Dense typographic (which is one big block, not columns).
5
+
6
+ ```html
7
+ <footer class="foot-index">
8
+ <div><p class="caps">Product</p><ul>…</ul></div>
9
+ <div><p class="caps">Company</p><ul>…</ul></div>
10
+ <div><p class="caps">Resources</p><ul>…</ul></div>
11
+ </footer>
12
+ ```
@@ -1,10 +1,10 @@
1
- ### Ft4 · Dense typographic
2
- One large block of text — credits, references, licence, address — in a small monospace font, fully justified or ragged-right. Editorial colophon energy.
3
- *Use when:* the brand is editorial and a colophon-style sign-off fits.
4
- *Don't confuse with:* Ft3 Index (which navigates).
5
-
6
- ```html
7
- <footer class="foot-dense mono">
8
- <p>Hallmark v0.2.0. Built with The Future, Fraunces, IBM Plex Mono. MIT licensed. Powered by Together AI. 137 Marlow Street, 2026.</p>
9
- </footer>
10
- ```
1
+ ### Ft4 · Dense typographic
2
+ One large block of text — credits, references, licence, address — in a small monospace font, fully justified or ragged-right. Editorial colophon energy.
3
+ *Use when:* the brand is editorial and a colophon-style sign-off fits.
4
+ *Don't confuse with:* Ft3 Index (which navigates).
5
+
6
+ ```html
7
+ <footer class="foot-dense mono">
8
+ <p>Hallmark v0.2.0. Built with The Future, Fraunces, IBM Plex Mono. MIT licensed. Powered by Together AI. 137 Marlow Street, 2026.</p>
9
+ </footer>
10
+ ```
@@ -1,21 +1,21 @@
1
- ### Ft5 · Statement
2
- One large display sentence dominates the footer — a closing line, not a sitemap. Wordmark, minimal links, copyright sit beneath in muted small type. Stripe (older), Mailchimp pre-rebrand, agency portfolio closers.
3
- *Use when:* the page wants a *closing line* — editorial, manifesto, atmospheric. The sentence pairs with the page's argument.
4
- *Don't confuse with:* Ft1 Mast-headed (which leads with the wordmark, not a sentence).
5
-
6
- ```html
7
- <footer class="foot-stmt">
8
- <p class="foot-stmt__line">Build something they'll remember.</p>
9
- <div class="foot-stmt__meta">
10
- <span class="wordmark">Studio</span>
11
- <span class="muted">© 2026 · MIT</span>
12
- </div>
13
- </footer>
14
- ```
15
- ```css
16
- .foot-stmt { padding: var(--space-2xl) var(--page-gutter) var(--space-xl); display: grid; gap: var(--space-lg); }
17
- .foot-stmt__line { font-family: var(--font-display); font-size: clamp(1.75rem, 5vw, 3.25rem); line-height: 1.0; letter-spacing: -0.02em; max-width: 28ch; margin: 0; }
18
- .foot-stmt__meta { display: flex; justify-content: space-between; align-items: baseline; padding-block-start: var(--space-sm); border-top: var(--rule-hair) solid var(--color-rule); }
19
- ```
20
-
21
- *Anti-pattern:* using a Statement footer on a docs root or hub. The sentence reads as marketing fluff there; default Ft3 instead.
1
+ ### Ft5 · Statement
2
+ One large display sentence dominates the footer — a closing line, not a sitemap. Wordmark, minimal links, copyright sit beneath in muted small type. Stripe (older), Mailchimp pre-rebrand, agency portfolio closers.
3
+ *Use when:* the page wants a *closing line* — editorial, manifesto, atmospheric. The sentence pairs with the page's argument.
4
+ *Don't confuse with:* Ft1 Mast-headed (which leads with the wordmark, not a sentence).
5
+
6
+ ```html
7
+ <footer class="foot-stmt">
8
+ <p class="foot-stmt__line">Build something they'll remember.</p>
9
+ <div class="foot-stmt__meta">
10
+ <span class="wordmark">Studio</span>
11
+ <span class="muted">© 2026 · MIT</span>
12
+ </div>
13
+ </footer>
14
+ ```
15
+ ```css
16
+ .foot-stmt { padding: var(--space-2xl) var(--page-gutter) var(--space-xl); display: grid; gap: var(--space-lg); }
17
+ .foot-stmt__line { font-family: var(--font-display); font-size: clamp(1.75rem, 5vw, 3.25rem); line-height: 1.0; letter-spacing: -0.02em; max-width: 28ch; margin: 0; }
18
+ .foot-stmt__meta { display: flex; justify-content: space-between; align-items: baseline; padding-block-start: var(--space-sm); border-top: var(--rule-hair) solid var(--color-rule); }
19
+ ```
20
+
21
+ *Anti-pattern:* using a Statement footer on a docs root or hub. The sentence reads as marketing fluff there; default Ft3 instead.
@@ -1,19 +1,19 @@
1
- ### Ft6 · Letter close
2
- Closes the page like a letter — `Yours, the team. 2026.` Optional postscript line beneath. Sets the page as a piece of writing rather than a product.
3
- *Use when:* the page voice is warm, hand-written, editorial-quiet — Garden, Atelier, Salon, personal sites.
4
- *Don't confuse with:* Ft1 Mast-headed (which is a wordmark anchor, not a signoff).
5
-
6
- ```html
7
- <footer class="foot-letter">
8
- <p class="foot-letter__close">Yours,<br><span class="foot-letter__sign">— Studio</span></p>
9
- <p class="foot-letter__ps muted">P.S. — letters back welcome at <a href="mailto:hello@studio">hello@studio</a>.</p>
10
- </footer>
11
- ```
12
- ```css
13
- .foot-letter { padding: var(--space-2xl) var(--page-gutter); max-width: 60ch; }
14
- .foot-letter__close { font-family: var(--font-display); font-style: italic; font-size: var(--text-lg); line-height: 1.4; }
15
- .foot-letter__sign { font-style: normal; font-weight: 600; }
16
- .foot-letter__ps { font-size: var(--text-sm); margin-top: var(--space-md); }
17
- ```
18
-
19
- *Anti-pattern:* using Ft6 on a stat-led / B2B product page — voice mismatch reads as twee. Reserve for genuinely letter-shaped pages.
1
+ ### Ft6 · Letter close
2
+ Closes the page like a letter — `Yours, the team. 2026.` Optional postscript line beneath. Sets the page as a piece of writing rather than a product.
3
+ *Use when:* the page voice is warm, hand-written, editorial-quiet — Garden, Atelier, Salon, personal sites.
4
+ *Don't confuse with:* Ft1 Mast-headed (which is a wordmark anchor, not a signoff).
5
+
6
+ ```html
7
+ <footer class="foot-letter">
8
+ <p class="foot-letter__close">Yours,<br><span class="foot-letter__sign">— Studio</span></p>
9
+ <p class="foot-letter__ps muted">P.S. — letters back welcome at <a href="mailto:hello@studio">hello@studio</a>.</p>
10
+ </footer>
11
+ ```
12
+ ```css
13
+ .foot-letter { padding: var(--space-2xl) var(--page-gutter); max-width: 60ch; }
14
+ .foot-letter__close { font-family: var(--font-display); font-style: italic; font-size: var(--text-lg); line-height: 1.4; }
15
+ .foot-letter__sign { font-style: normal; font-weight: 600; }
16
+ .foot-letter__ps { font-size: var(--text-sm); margin-top: var(--space-md); }
17
+ ```
18
+
19
+ *Anti-pattern:* using Ft6 on a stat-led / B2B product page — voice mismatch reads as twee. Reserve for genuinely letter-shaped pages.
@@ -1,27 +1,27 @@
1
- ### Ft7 · Newsletter-first
2
- The form (label + input + submit) is the *primary* element of the footer; everything else (wordmark, links, copyright) is set in 12 px muted type beneath. Stratechery, Substack-shaped sites, indie magazines.
3
- *Use when:* the brand legitimately publishes — and the page above the fold has *already* offered a subscription. The footer is a final invitation, not an ambush.
4
- *Don't confuse with:* Ft1 (which doesn't ask for anything).
5
-
6
- ```html
7
- <footer class="foot-news">
8
- <form class="foot-news__form" action="/subscribe" method="post">
9
- <label for="foot-email">Letters from the studio · monthly</label>
10
- <div class="foot-news__row">
11
- <input id="foot-email" name="email" type="email" required placeholder="you@domain">
12
- <button type="submit" class="cta-fill">Subscribe</button>
13
- </div>
14
- </form>
15
- <p class="foot-news__meta muted">Studio · © 2026 · <a href="/imprint">Imprint</a></p>
16
- </footer>
17
- ```
18
- ```css
19
- .foot-news { padding: var(--space-2xl) var(--page-gutter); display: grid; gap: var(--space-lg); max-width: 56ch; }
20
- .foot-news__form label { display: block; font-size: var(--text-sm); margin-block-end: var(--space-2xs); }
21
- .foot-news__row { display: flex; gap: var(--space-2xs); }
22
- .foot-news__row input { flex: 1; min-height: 44px; padding-inline: var(--space-sm); border: var(--rule-hair) solid var(--color-rule); border-radius: var(--radius-input); background: var(--color-paper); }
23
- .foot-news__row input:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 1px; }
24
- .foot-news__meta { font-size: var(--text-xs); }
25
- ```
26
-
27
- *Anti-pattern:* Ft7 when the page never said "subscribe" above the fold. The footer is an honest *conclusion*; if you didn't ask, don't ambush. Drop to Ft2 instead.
1
+ ### Ft7 · Newsletter-first
2
+ The form (label + input + submit) is the *primary* element of the footer; everything else (wordmark, links, copyright) is set in 12 px muted type beneath. Stratechery, Substack-shaped sites, indie magazines.
3
+ *Use when:* the brand legitimately publishes — and the page above the fold has *already* offered a subscription. The footer is a final invitation, not an ambush.
4
+ *Don't confuse with:* Ft1 (which doesn't ask for anything).
5
+
6
+ ```html
7
+ <footer class="foot-news">
8
+ <form class="foot-news__form" action="/subscribe" method="post">
9
+ <label for="foot-email">Letters from the studio · monthly</label>
10
+ <div class="foot-news__row">
11
+ <input id="foot-email" name="email" type="email" required placeholder="you@domain">
12
+ <button type="submit" class="cta-fill">Subscribe</button>
13
+ </div>
14
+ </form>
15
+ <p class="foot-news__meta muted">Studio · © 2026 · <a href="/imprint">Imprint</a></p>
16
+ </footer>
17
+ ```
18
+ ```css
19
+ .foot-news { padding: var(--space-2xl) var(--page-gutter); display: grid; gap: var(--space-lg); max-width: 56ch; }
20
+ .foot-news__form label { display: block; font-size: var(--text-sm); margin-block-end: var(--space-2xs); }
21
+ .foot-news__row { display: flex; gap: var(--space-2xs); }
22
+ .foot-news__row input { flex: 1; min-height: 44px; padding-inline: var(--space-sm); border: var(--rule-hair) solid var(--color-rule); border-radius: var(--radius-input); background: var(--color-paper); }
23
+ .foot-news__row input:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 1px; }
24
+ .foot-news__meta { font-size: var(--text-xs); }
25
+ ```
26
+
27
+ *Anti-pattern:* Ft7 when the page never said "subscribe" above the fold. The footer is an honest *conclusion*; if you didn't ask, don't ambush. Drop to Ft2 instead.
@@ -1,25 +1,25 @@
1
- ### Ft8 · Marquee scroll
2
- A horizontal infinite-scroll line of repeating tagline + dot separator: `STUDIO · 2026 · STUDIO · 2026 · STUDIO · 2026 ·`. Sport-genre sites, fashion lookbooks, brand-forward agencies.
3
- *Use when:* the brand voice is loud, kinetic, sport-or-manifesto.
4
- *Don't confuse with:* Ft4 Dense colophon (which is static text).
5
-
6
- ```html
7
- <footer class="foot-marquee" aria-label="Footer">
8
- <div class="foot-marquee__track" aria-hidden="true">
9
- <span>STUDIO · 2026 · STUDIO · 2026 · STUDIO · 2026 · STUDIO · 2026 ·</span>
10
- <span>STUDIO · 2026 · STUDIO · 2026 · STUDIO · 2026 · STUDIO · 2026 ·</span>
11
- </div>
12
- <p class="visually-hidden">Studio · 2026 · MIT licensed</p>
13
- </footer>
14
- ```
15
- ```css
16
- .foot-marquee { overflow: hidden; border-top: 2px solid var(--color-ink); }
17
- .foot-marquee__track { display: flex; gap: var(--space-2xl); white-space: nowrap; padding-block: var(--space-md); animation: foot-marquee 32s linear infinite; }
18
- .foot-marquee__track span { font-family: var(--font-display); font-weight: 700; letter-spacing: 0.08em; font-size: clamp(1rem, 2.5vw, 1.5rem); }
19
- @keyframes foot-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
20
- @media (prefers-reduced-motion: reduce) { .foot-marquee__track { animation: none; } }
21
- ```
22
-
23
- *Anti-pattern:* using Ft8 on editorial / quiet contexts — the motion reads as loud. Pair only with playful / sport / manifesto voices, and always honour `prefers-reduced-motion: reduce`.
24
-
25
- ---
1
+ ### Ft8 · Marquee scroll
2
+ A horizontal infinite-scroll line of repeating tagline + dot separator: `STUDIO · 2026 · STUDIO · 2026 · STUDIO · 2026 ·`. Sport-genre sites, fashion lookbooks, brand-forward agencies.
3
+ *Use when:* the brand voice is loud, kinetic, sport-or-manifesto.
4
+ *Don't confuse with:* Ft4 Dense colophon (which is static text).
5
+
6
+ ```html
7
+ <footer class="foot-marquee" aria-label="Footer">
8
+ <div class="foot-marquee__track" aria-hidden="true">
9
+ <span>STUDIO · 2026 · STUDIO · 2026 · STUDIO · 2026 · STUDIO · 2026 ·</span>
10
+ <span>STUDIO · 2026 · STUDIO · 2026 · STUDIO · 2026 · STUDIO · 2026 ·</span>
11
+ </div>
12
+ <p class="visually-hidden">Studio · 2026 · MIT licensed</p>
13
+ </footer>
14
+ ```
15
+ ```css
16
+ .foot-marquee { overflow: hidden; border-top: 2px solid var(--color-ink); }
17
+ .foot-marquee__track { display: flex; gap: var(--space-2xl); white-space: nowrap; padding-block: var(--space-md); animation: foot-marquee 32s linear infinite; }
18
+ .foot-marquee__track span { font-family: var(--font-display); font-weight: 700; letter-spacing: 0.08em; font-size: clamp(1rem, 2.5vw, 1.5rem); }
19
+ @keyframes foot-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
20
+ @media (prefers-reduced-motion: reduce) { .foot-marquee__track { animation: none; } }
21
+ ```
22
+
23
+ *Anti-pattern:* using Ft8 on editorial / quiet contexts — the motion reads as loud. Pair only with playful / sport / manifesto voices, and always honour `prefers-reduced-motion: reduce`.
24
+
25
+ ---