@phuc1403/musketeer 0.8.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 (236) hide show
  1. package/INSTALLATION.md +52 -52
  2. package/README.md +49 -49
  3. package/bin/musketeer.js +168 -168
  4. package/manifest.json +333 -301
  5. package/package.json +48 -48
  6. package/src/dotnet-scaffold-copier.js +79 -79
  7. package/src/provisioner/detect.js +93 -93
  8. package/src/self-update.js +77 -77
  9. package/template/.claude/agents/code-reviewer.md +182 -166
  10. package/template/.claude/agents/git-manager.md +18 -18
  11. package/template/.claude/agents/hallmark-auditor.md +78 -78
  12. package/template/.claude/agents/researcher.md +33 -33
  13. package/template/.claude/hooks/block-unsafe-adr-title.cjs +85 -85
  14. package/template/.claude/hooks/git-skill-reminder.cjs +53 -0
  15. package/template/.claude/hooks/init-adr-dir.cjs +173 -173
  16. package/template/.claude/hooks/inject-adr-flags.cjs +94 -94
  17. package/template/.claude/hooks/lib/adr/command-scan.cjs +115 -115
  18. package/template/.claude/hooks/lib/characteristics/checker.cjs +357 -357
  19. package/template/.claude/hooks/lib/colors.cjs +180 -122
  20. package/template/.claude/hooks/lib/git-info-cache.cjs +191 -191
  21. package/template/.claude/hooks/lib/transcript-parser.cjs +300 -277
  22. package/template/.claude/hooks/sync-adr-toc.cjs +146 -146
  23. package/template/.claude/hooks/{usage-context-awareness.cjs → usage-quota-cache-refresh.cjs} +166 -166
  24. package/template/.claude/hooks/validate-characteristics-hook.cjs +66 -66
  25. package/template/.claude/hooks/validate-cml-hook.js +145 -145
  26. package/template/.claude/skills/adr-writer/SKILL.md +48 -48
  27. package/template/.claude/skills/adr-writer/references/adr-example.md +35 -35
  28. package/template/.claude/skills/architecture-characteristic-writer/SKILL.md +215 -215
  29. package/template/.claude/skills/architecture-characteristic-writer/assets/worksheet-template.md +29 -29
  30. package/template/.claude/skills/architecture-characteristic-writer/references/characteristics-catalog.md +40 -40
  31. package/template/.claude/skills/architecture-characteristic-writer/scripts/ranking-table.cjs +171 -171
  32. package/template/.claude/skills/code-review/SKILL.md +201 -54
  33. package/template/.claude/skills/code-review/references/checklist-workflow.md +96 -0
  34. package/template/.claude/skills/code-review/references/checklists/api.md +52 -52
  35. package/template/.claude/skills/code-review/references/checklists/base.md +100 -100
  36. package/template/.claude/skills/code-review/references/checklists/web-app.md +54 -54
  37. package/template/.claude/skills/code-review/references/code-review-reception.md +113 -0
  38. package/template/.claude/skills/code-review/references/codebase-scan-workflow.md +30 -0
  39. package/template/.claude/skills/code-review/references/edge-case-scouting.md +119 -0
  40. package/template/.claude/skills/code-review/references/input-mode-resolution.md +135 -0
  41. package/template/.claude/skills/code-review/references/parallel-review-workflow.md +76 -0
  42. package/template/.claude/skills/code-review/references/requesting-code-review.md +116 -0
  43. package/template/.claude/skills/code-review/references/spec-compliance-review.md +43 -0
  44. package/template/.claude/skills/code-review/references/task-management-reviews.md +140 -0
  45. package/template/.claude/skills/code-review/references/verification-before-completion.md +139 -0
  46. package/template/.claude/skills/context-map/SKILL.md +80 -80
  47. package/template/.claude/skills/context-map/example.cml +106 -106
  48. package/template/.claude/skills/context-map/reference/Bounded Context/Bounded Context.md +40 -40
  49. package/template/.claude/skills/context-map/reference/Bounded Context/businessModel.md +5 -5
  50. package/template/.claude/skills/context-map/reference/Bounded Context/domainVisionStatement.md +2 -2
  51. package/template/.claude/skills/context-map/reference/Bounded Context/evolution.md +5 -5
  52. package/template/.claude/skills/context-map/reference/Bounded Context/implementationTechnology.md +1 -1
  53. package/template/.claude/skills/context-map/reference/Bounded Context/implements.md +1 -1
  54. package/template/.claude/skills/context-map/reference/Bounded Context/knowledgeLevel.md +4 -4
  55. package/template/.claude/skills/context-map/reference/Bounded Context/realizes.md +9 -9
  56. package/template/.claude/skills/context-map/reference/Bounded Context/refines.md +10 -10
  57. package/template/.claude/skills/context-map/reference/Bounded Context/responsibilities.md +26 -26
  58. package/template/.claude/skills/context-map/reference/Bounded Context/type.md +23 -23
  59. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Anticorruption Layer.md +5 -5
  60. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Bounded Context Relationship.md +12 -12
  61. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Conformist.md +5 -5
  62. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Customer-Supplier (C-S).md +22 -22
  63. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Open Host Service.md +4 -4
  64. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Partnership (P).md +13 -13
  65. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Published Language.md +4 -4
  66. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Shared Kernel (SK).md +12 -12
  67. package/template/.claude/skills/context-map/reference/Context Map.md +62 -62
  68. package/template/.claude/skills/context-map/reference/Domain/Domain.md +30 -30
  69. package/template/.claude/skills/context-map/reference/Domain/supports.md +33 -33
  70. package/template/.claude/skills/context-map/reference/Domain/type.md +3 -3
  71. package/template/.claude/skills/context-map/reference/Semantic Rules.md +32 -32
  72. package/template/.claude/skills/git/SKILL.md +131 -115
  73. package/template/.claude/skills/git/references/branch-management.md +88 -88
  74. package/template/.claude/skills/git/references/commit-standards.md +46 -46
  75. package/template/.claude/skills/git/references/context-efficiency.md +54 -0
  76. package/template/.claude/skills/git/references/gh-cli-guide.md +109 -109
  77. package/template/.claude/skills/git/references/safety-protocols.md +69 -69
  78. package/template/.claude/skills/git/references/workflow-commit.md +58 -58
  79. package/template/.claude/skills/git/references/workflow-merge-pr.md +136 -0
  80. package/template/.claude/skills/git/references/workflow-merge.md +48 -48
  81. package/template/.claude/skills/git/references/workflow-pr.md +58 -58
  82. package/template/.claude/skills/git/references/workflow-push.md +52 -52
  83. package/template/.claude/skills/hallmark/SKILL.md +552 -552
  84. package/template/.claude/skills/hallmark/references/anti-patterns.md +412 -412
  85. package/template/.claude/skills/hallmark/references/assets.md +406 -406
  86. package/template/.claude/skills/hallmark/references/color.md +95 -95
  87. package/template/.claude/skills/hallmark/references/component-cookbook.md +256 -256
  88. package/template/.claude/skills/hallmark/references/components/c1-outlined-chip.md +12 -12
  89. package/template/.claude/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -16
  90. package/template/.claude/skills/hallmark/references/components/c3-typographic-link.md +8 -8
  91. package/template/.claude/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -16
  92. package/template/.claude/skills/hallmark/references/components/f1-bento-grid.md +20 -20
  93. package/template/.claude/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -20
  94. package/template/.claude/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -11
  95. package/template/.claude/skills/hallmark/references/components/f4-step-sequence.md +11 -11
  96. package/template/.claude/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -11
  97. package/template/.claude/skills/hallmark/references/components/f6-product-card-grid.md +41 -41
  98. package/template/.claude/skills/hallmark/references/components/ft1-mast-headed.md +13 -13
  99. package/template/.claude/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -10
  100. package/template/.claude/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -12
  101. package/template/.claude/skills/hallmark/references/components/ft4-dense-typographic.md +10 -10
  102. package/template/.claude/skills/hallmark/references/components/ft5-statement.md +21 -21
  103. package/template/.claude/skills/hallmark/references/components/ft6-letter-close.md +19 -19
  104. package/template/.claude/skills/hallmark/references/components/ft7-newsletter-first.md +27 -27
  105. package/template/.claude/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -25
  106. package/template/.claude/skills/hallmark/references/components/h1-marquee.md +15 -15
  107. package/template/.claude/skills/hallmark/references/components/h2-split-diptych.md +15 -15
  108. package/template/.claude/skills/hallmark/references/components/h3-quote-led.md +11 -11
  109. package/template/.claude/skills/hallmark/references/components/h4-stat-led.md +14 -14
  110. package/template/.claude/skills/hallmark/references/components/h5-letter-hero.md +11 -11
  111. package/template/.claude/skills/hallmark/references/components/h6-photographic-fold.md +16 -16
  112. package/template/.claude/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -27
  113. package/template/.claude/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -23
  114. package/template/.claude/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -27
  115. package/template/.claude/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -12
  116. package/template/.claude/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -19
  117. package/template/.claude/skills/hallmark/references/components/n2-floating-chip.md +14 -14
  118. package/template/.claude/skills/hallmark/references/components/n3-side-rail.md +14 -14
  119. package/template/.claude/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -9
  120. package/template/.claude/skills/hallmark/references/components/n5-floating-pill.md +28 -28
  121. package/template/.claude/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -24
  122. package/template/.claude/skills/hallmark/references/components/n7-brutal-slab.md +22 -22
  123. package/template/.claude/skills/hallmark/references/components/n8-terminal-command.md +21 -21
  124. package/template/.claude/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -17
  125. package/template/.claude/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -15
  126. package/template/.claude/skills/hallmark/references/components/s2-hanging.md +13 -13
  127. package/template/.claude/skills/hallmark/references/components/s3-sticky-pinned.md +19 -19
  128. package/template/.claude/skills/hallmark/references/components/s4-inline-no-break.md +11 -11
  129. package/template/.claude/skills/hallmark/references/components/s5-bottom-anchored.md +13 -13
  130. package/template/.claude/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -12
  131. package/template/.claude/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -19
  132. package/template/.claude/skills/hallmark/references/components/t3-single-huge-quote.md +11 -11
  133. package/template/.claude/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -14
  134. package/template/.claude/skills/hallmark/references/contract.md +24 -24
  135. package/template/.claude/skills/hallmark/references/copy.md +182 -182
  136. package/template/.claude/skills/hallmark/references/custom-craft.md +626 -626
  137. package/template/.claude/skills/hallmark/references/custom-theme.md +329 -329
  138. package/template/.claude/skills/hallmark/references/design-md.md +116 -116
  139. package/template/.claude/skills/hallmark/references/export-formats.md +328 -328
  140. package/template/.claude/skills/hallmark/references/floating-nav.md +89 -89
  141. package/template/.claude/skills/hallmark/references/genres/atmospheric.md +65 -65
  142. package/template/.claude/skills/hallmark/references/genres/editorial.md +70 -70
  143. package/template/.claude/skills/hallmark/references/genres/modern-minimal.md +67 -67
  144. package/template/.claude/skills/hallmark/references/genres/playful.md +65 -65
  145. package/template/.claude/skills/hallmark/references/hero-enrichment.md +474 -474
  146. package/template/.claude/skills/hallmark/references/imagery-kit.md +170 -170
  147. package/template/.claude/skills/hallmark/references/interaction-and-states.md +207 -207
  148. package/template/.claude/skills/hallmark/references/layout-and-space.md +111 -111
  149. package/template/.claude/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -35
  150. package/template/.claude/skills/hallmark/references/macrostructures/02-long-document.md +34 -34
  151. package/template/.claude/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -31
  152. package/template/.claude/skills/hallmark/references/macrostructures/04-stat-led.md +32 -32
  153. package/template/.claude/skills/hallmark/references/macrostructures/05-workbench.md +32 -32
  154. package/template/.claude/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -33
  155. package/template/.claude/skills/hallmark/references/macrostructures/07-manifesto.md +32 -32
  156. package/template/.claude/skills/hallmark/references/macrostructures/08-photographic.md +34 -34
  157. package/template/.claude/skills/hallmark/references/macrostructures/09-quote-led.md +32 -32
  158. package/template/.claude/skills/hallmark/references/macrostructures/10-specimen.md +32 -32
  159. package/template/.claude/skills/hallmark/references/macrostructures/11-catalogue.md +23 -23
  160. package/template/.claude/skills/hallmark/references/macrostructures/12-letter.md +23 -23
  161. package/template/.claude/skills/hallmark/references/macrostructures/13-index-first.md +23 -23
  162. package/template/.claude/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -23
  163. package/template/.claude/skills/hallmark/references/macrostructures/15-split-studio.md +23 -23
  164. package/template/.claude/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -23
  165. package/template/.claude/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -23
  166. package/template/.claude/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -23
  167. package/template/.claude/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -23
  168. package/template/.claude/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -23
  169. package/template/.claude/skills/hallmark/references/macrostructures/21-component-playground.md +23 -23
  170. package/template/.claude/skills/hallmark/references/macrostructures.md +89 -89
  171. package/template/.claude/skills/hallmark/references/microinteractions.md +260 -260
  172. package/template/.claude/skills/hallmark/references/motion.md +109 -109
  173. package/template/.claude/skills/hallmark/references/preview-examples.md +49 -49
  174. package/template/.claude/skills/hallmark/references/responsive.md +138 -138
  175. package/template/.claude/skills/hallmark/references/slop-test.md +205 -205
  176. package/template/.claude/skills/hallmark/references/structure.md +164 -164
  177. package/template/.claude/skills/hallmark/references/study.md +511 -511
  178. package/template/.claude/skills/hallmark/references/typography.md +243 -243
  179. package/template/.claude/skills/hallmark/references/verbs/audit.md +25 -25
  180. package/template/.claude/skills/hallmark/references/verbs/redesign.md +269 -269
  181. package/template/.claude/skills/hallmark-loop/SKILL.md +105 -105
  182. package/template/.claude/skills/hallmark-loop/references/auditor-call.md +60 -60
  183. package/template/.claude/skills/hallmark-loop/references/capture.md +78 -78
  184. package/template/.claude/skills/hallmark-loop/references/loop-control.md +79 -79
  185. package/template/.claude/skills/handoff/SKILL.md +15 -15
  186. package/template/.claude/skills/knowledge-crunching/SKILL.md +94 -94
  187. package/template/.claude/skills/research/SKILL.md +69 -69
  188. package/template/.claude/skills/skill-creator/LICENSE.txt +201 -201
  189. package/template/.claude/skills/skill-creator/SKILL.md +154 -149
  190. package/template/.claude/skills/skill-creator/agents/analyzer.md +274 -274
  191. package/template/.claude/skills/skill-creator/agents/comparator.md +202 -202
  192. package/template/.claude/skills/skill-creator/agents/grader.md +223 -223
  193. package/template/.claude/skills/skill-creator/assets/eval_review.html +146 -146
  194. package/template/.claude/skills/skill-creator/eval-viewer/generate_review.py +471 -471
  195. package/template/.claude/skills/skill-creator/eval-viewer/viewer.html +1325 -1325
  196. package/template/.claude/skills/skill-creator/references/benchmark-optimization-guide.md +86 -86
  197. package/template/.claude/skills/skill-creator/references/distribution-guide.md +79 -79
  198. package/template/.claude/skills/skill-creator/references/eval-infrastructure-guide.md +129 -129
  199. package/template/.claude/skills/skill-creator/references/eval-schemas.md +121 -121
  200. package/template/.claude/skills/skill-creator/references/mcp-skills-integration.md +71 -71
  201. package/template/.claude/skills/skill-creator/references/metadata-quality-criteria.md +94 -94
  202. package/template/.claude/skills/skill-creator/references/plugin-marketplace-hosting.md +104 -104
  203. package/template/.claude/skills/skill-creator/references/plugin-marketplace-overview.md +89 -89
  204. package/template/.claude/skills/skill-creator/references/plugin-marketplace-schema.md +93 -93
  205. package/template/.claude/skills/skill-creator/references/plugin-marketplace-sources.md +103 -103
  206. package/template/.claude/skills/skill-creator/references/plugin-marketplace-troubleshooting.md +76 -76
  207. package/template/.claude/skills/skill-creator/references/script-quality-criteria.md +106 -106
  208. package/template/.claude/skills/skill-creator/references/skill-anatomy-and-requirements.md +77 -77
  209. package/template/.claude/skills/skill-creator/references/skill-creation-workflow.md +152 -151
  210. package/template/.claude/skills/skill-creator/references/skill-design-patterns.md +75 -75
  211. package/template/.claude/skills/skill-creator/references/skillmark-benchmark-criteria.md +102 -102
  212. package/template/.claude/skills/skill-creator/references/structure-organization-criteria.md +114 -114
  213. package/template/.claude/skills/skill-creator/references/testing-and-iteration.md +78 -78
  214. package/template/.claude/skills/skill-creator/references/token-efficiency-criteria.md +74 -74
  215. package/template/.claude/skills/skill-creator/references/troubleshooting-guide.md +81 -81
  216. package/template/.claude/skills/skill-creator/references/validation-checklist.md +83 -83
  217. package/template/.claude/skills/skill-creator/references/writing-effective-instructions.md +88 -88
  218. package/template/.claude/skills/skill-creator/references/yaml-frontmatter-reference.md +92 -92
  219. package/template/.claude/skills/skill-creator/scripts/aggregate_benchmark.py +401 -401
  220. package/template/.claude/skills/skill-creator/scripts/encoding_utils.py +36 -36
  221. package/template/.claude/skills/skill-creator/scripts/generate_report.py +326 -326
  222. package/template/.claude/skills/skill-creator/scripts/improve_description.py +248 -248
  223. package/template/.claude/skills/skill-creator/scripts/init_skill.py +360 -360
  224. package/template/.claude/skills/skill-creator/scripts/package_skill.py +143 -143
  225. package/template/.claude/skills/skill-creator/scripts/quick_validate.py +110 -110
  226. package/template/.claude/skills/skill-creator/scripts/run_eval.py +310 -310
  227. package/template/.claude/skills/skill-creator/scripts/run_loop.py +332 -332
  228. package/template/.claude/skills/skill-creator/scripts/utils.py +47 -47
  229. package/template/.claude/skills/tdd/SKILL.md +142 -142
  230. package/template/.claude/skills/tdd/deep-modules.md +15 -15
  231. package/template/.claude/skills/tdd/interface-design.md +31 -31
  232. package/template/.claude/skills/tdd/mocking.md +59 -59
  233. package/template/.claude/skills/tdd/refactoring.md +10 -10
  234. package/template/.claude/skills/tdd/tests.md +61 -61
  235. package/template/.claude/statusline.cjs +0 -0
  236. package/template/.claude/skills/code-review/references/adversarial-review.md +0 -223
@@ -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
+ ---