@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.
- package/INSTALLATION.md +52 -52
- package/README.md +49 -49
- package/bin/musketeer.js +168 -168
- package/manifest.json +333 -301
- package/package.json +48 -48
- package/src/dotnet-scaffold-copier.js +79 -79
- package/src/provisioner/detect.js +93 -93
- package/src/self-update.js +77 -77
- package/template/.claude/agents/code-reviewer.md +182 -166
- package/template/.claude/agents/git-manager.md +18 -18
- package/template/.claude/agents/hallmark-auditor.md +78 -78
- package/template/.claude/agents/researcher.md +33 -33
- package/template/.claude/hooks/block-unsafe-adr-title.cjs +85 -85
- package/template/.claude/hooks/git-skill-reminder.cjs +53 -0
- package/template/.claude/hooks/init-adr-dir.cjs +173 -173
- package/template/.claude/hooks/inject-adr-flags.cjs +94 -94
- package/template/.claude/hooks/lib/adr/command-scan.cjs +115 -115
- package/template/.claude/hooks/lib/characteristics/checker.cjs +357 -357
- package/template/.claude/hooks/lib/colors.cjs +180 -122
- package/template/.claude/hooks/lib/git-info-cache.cjs +191 -191
- package/template/.claude/hooks/lib/transcript-parser.cjs +300 -277
- package/template/.claude/hooks/sync-adr-toc.cjs +146 -146
- package/template/.claude/hooks/{usage-context-awareness.cjs → usage-quota-cache-refresh.cjs} +166 -166
- package/template/.claude/hooks/validate-characteristics-hook.cjs +66 -66
- package/template/.claude/hooks/validate-cml-hook.js +145 -145
- package/template/.claude/skills/adr-writer/SKILL.md +48 -48
- package/template/.claude/skills/adr-writer/references/adr-example.md +35 -35
- package/template/.claude/skills/architecture-characteristic-writer/SKILL.md +215 -215
- package/template/.claude/skills/architecture-characteristic-writer/assets/worksheet-template.md +29 -29
- package/template/.claude/skills/architecture-characteristic-writer/references/characteristics-catalog.md +40 -40
- package/template/.claude/skills/architecture-characteristic-writer/scripts/ranking-table.cjs +171 -171
- package/template/.claude/skills/code-review/SKILL.md +201 -54
- package/template/.claude/skills/code-review/references/checklist-workflow.md +96 -0
- package/template/.claude/skills/code-review/references/checklists/api.md +52 -52
- package/template/.claude/skills/code-review/references/checklists/base.md +100 -100
- package/template/.claude/skills/code-review/references/checklists/web-app.md +54 -54
- package/template/.claude/skills/code-review/references/code-review-reception.md +113 -0
- package/template/.claude/skills/code-review/references/codebase-scan-workflow.md +30 -0
- package/template/.claude/skills/code-review/references/edge-case-scouting.md +119 -0
- package/template/.claude/skills/code-review/references/input-mode-resolution.md +135 -0
- package/template/.claude/skills/code-review/references/parallel-review-workflow.md +76 -0
- package/template/.claude/skills/code-review/references/requesting-code-review.md +116 -0
- package/template/.claude/skills/code-review/references/spec-compliance-review.md +43 -0
- package/template/.claude/skills/code-review/references/task-management-reviews.md +140 -0
- package/template/.claude/skills/code-review/references/verification-before-completion.md +139 -0
- package/template/.claude/skills/context-map/SKILL.md +80 -80
- package/template/.claude/skills/context-map/example.cml +106 -106
- package/template/.claude/skills/context-map/reference/Bounded Context/Bounded Context.md +40 -40
- package/template/.claude/skills/context-map/reference/Bounded Context/businessModel.md +5 -5
- package/template/.claude/skills/context-map/reference/Bounded Context/domainVisionStatement.md +2 -2
- package/template/.claude/skills/context-map/reference/Bounded Context/evolution.md +5 -5
- package/template/.claude/skills/context-map/reference/Bounded Context/implementationTechnology.md +1 -1
- package/template/.claude/skills/context-map/reference/Bounded Context/implements.md +1 -1
- package/template/.claude/skills/context-map/reference/Bounded Context/knowledgeLevel.md +4 -4
- package/template/.claude/skills/context-map/reference/Bounded Context/realizes.md +9 -9
- package/template/.claude/skills/context-map/reference/Bounded Context/refines.md +10 -10
- package/template/.claude/skills/context-map/reference/Bounded Context/responsibilities.md +26 -26
- package/template/.claude/skills/context-map/reference/Bounded Context/type.md +23 -23
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Anticorruption Layer.md +5 -5
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Bounded Context Relationship.md +12 -12
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Conformist.md +5 -5
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Customer-Supplier (C-S).md +22 -22
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Open Host Service.md +4 -4
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Partnership (P).md +13 -13
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Published Language.md +4 -4
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Shared Kernel (SK).md +12 -12
- package/template/.claude/skills/context-map/reference/Context Map.md +62 -62
- package/template/.claude/skills/context-map/reference/Domain/Domain.md +30 -30
- package/template/.claude/skills/context-map/reference/Domain/supports.md +33 -33
- package/template/.claude/skills/context-map/reference/Domain/type.md +3 -3
- package/template/.claude/skills/context-map/reference/Semantic Rules.md +32 -32
- package/template/.claude/skills/git/SKILL.md +131 -115
- package/template/.claude/skills/git/references/branch-management.md +88 -88
- package/template/.claude/skills/git/references/commit-standards.md +46 -46
- package/template/.claude/skills/git/references/context-efficiency.md +54 -0
- package/template/.claude/skills/git/references/gh-cli-guide.md +109 -109
- package/template/.claude/skills/git/references/safety-protocols.md +69 -69
- package/template/.claude/skills/git/references/workflow-commit.md +58 -58
- package/template/.claude/skills/git/references/workflow-merge-pr.md +136 -0
- package/template/.claude/skills/git/references/workflow-merge.md +48 -48
- package/template/.claude/skills/git/references/workflow-pr.md +58 -58
- package/template/.claude/skills/git/references/workflow-push.md +52 -52
- package/template/.claude/skills/hallmark/SKILL.md +552 -552
- package/template/.claude/skills/hallmark/references/anti-patterns.md +412 -412
- package/template/.claude/skills/hallmark/references/assets.md +406 -406
- package/template/.claude/skills/hallmark/references/color.md +95 -95
- package/template/.claude/skills/hallmark/references/component-cookbook.md +256 -256
- package/template/.claude/skills/hallmark/references/components/c1-outlined-chip.md +12 -12
- package/template/.claude/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -16
- package/template/.claude/skills/hallmark/references/components/c3-typographic-link.md +8 -8
- package/template/.claude/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -16
- package/template/.claude/skills/hallmark/references/components/f1-bento-grid.md +20 -20
- package/template/.claude/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -20
- package/template/.claude/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -11
- package/template/.claude/skills/hallmark/references/components/f4-step-sequence.md +11 -11
- package/template/.claude/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -11
- package/template/.claude/skills/hallmark/references/components/f6-product-card-grid.md +41 -41
- package/template/.claude/skills/hallmark/references/components/ft1-mast-headed.md +13 -13
- package/template/.claude/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -10
- package/template/.claude/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -12
- package/template/.claude/skills/hallmark/references/components/ft4-dense-typographic.md +10 -10
- package/template/.claude/skills/hallmark/references/components/ft5-statement.md +21 -21
- package/template/.claude/skills/hallmark/references/components/ft6-letter-close.md +19 -19
- package/template/.claude/skills/hallmark/references/components/ft7-newsletter-first.md +27 -27
- package/template/.claude/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -25
- package/template/.claude/skills/hallmark/references/components/h1-marquee.md +15 -15
- package/template/.claude/skills/hallmark/references/components/h2-split-diptych.md +15 -15
- package/template/.claude/skills/hallmark/references/components/h3-quote-led.md +11 -11
- package/template/.claude/skills/hallmark/references/components/h4-stat-led.md +14 -14
- package/template/.claude/skills/hallmark/references/components/h5-letter-hero.md +11 -11
- package/template/.claude/skills/hallmark/references/components/h6-photographic-fold.md +16 -16
- package/template/.claude/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -27
- package/template/.claude/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -23
- package/template/.claude/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -27
- package/template/.claude/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -12
- package/template/.claude/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -19
- package/template/.claude/skills/hallmark/references/components/n2-floating-chip.md +14 -14
- package/template/.claude/skills/hallmark/references/components/n3-side-rail.md +14 -14
- package/template/.claude/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -9
- package/template/.claude/skills/hallmark/references/components/n5-floating-pill.md +28 -28
- package/template/.claude/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -24
- package/template/.claude/skills/hallmark/references/components/n7-brutal-slab.md +22 -22
- package/template/.claude/skills/hallmark/references/components/n8-terminal-command.md +21 -21
- package/template/.claude/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -17
- package/template/.claude/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -15
- package/template/.claude/skills/hallmark/references/components/s2-hanging.md +13 -13
- package/template/.claude/skills/hallmark/references/components/s3-sticky-pinned.md +19 -19
- package/template/.claude/skills/hallmark/references/components/s4-inline-no-break.md +11 -11
- package/template/.claude/skills/hallmark/references/components/s5-bottom-anchored.md +13 -13
- package/template/.claude/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -12
- package/template/.claude/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -19
- package/template/.claude/skills/hallmark/references/components/t3-single-huge-quote.md +11 -11
- package/template/.claude/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -14
- package/template/.claude/skills/hallmark/references/contract.md +24 -24
- package/template/.claude/skills/hallmark/references/copy.md +182 -182
- package/template/.claude/skills/hallmark/references/custom-craft.md +626 -626
- package/template/.claude/skills/hallmark/references/custom-theme.md +329 -329
- package/template/.claude/skills/hallmark/references/design-md.md +116 -116
- package/template/.claude/skills/hallmark/references/export-formats.md +328 -328
- package/template/.claude/skills/hallmark/references/floating-nav.md +89 -89
- package/template/.claude/skills/hallmark/references/genres/atmospheric.md +65 -65
- package/template/.claude/skills/hallmark/references/genres/editorial.md +70 -70
- package/template/.claude/skills/hallmark/references/genres/modern-minimal.md +67 -67
- package/template/.claude/skills/hallmark/references/genres/playful.md +65 -65
- package/template/.claude/skills/hallmark/references/hero-enrichment.md +474 -474
- package/template/.claude/skills/hallmark/references/imagery-kit.md +170 -170
- package/template/.claude/skills/hallmark/references/interaction-and-states.md +207 -207
- package/template/.claude/skills/hallmark/references/layout-and-space.md +111 -111
- package/template/.claude/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -35
- package/template/.claude/skills/hallmark/references/macrostructures/02-long-document.md +34 -34
- package/template/.claude/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -31
- package/template/.claude/skills/hallmark/references/macrostructures/04-stat-led.md +32 -32
- package/template/.claude/skills/hallmark/references/macrostructures/05-workbench.md +32 -32
- package/template/.claude/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -33
- package/template/.claude/skills/hallmark/references/macrostructures/07-manifesto.md +32 -32
- package/template/.claude/skills/hallmark/references/macrostructures/08-photographic.md +34 -34
- package/template/.claude/skills/hallmark/references/macrostructures/09-quote-led.md +32 -32
- package/template/.claude/skills/hallmark/references/macrostructures/10-specimen.md +32 -32
- package/template/.claude/skills/hallmark/references/macrostructures/11-catalogue.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/12-letter.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/13-index-first.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/15-split-studio.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/21-component-playground.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures.md +89 -89
- package/template/.claude/skills/hallmark/references/microinteractions.md +260 -260
- package/template/.claude/skills/hallmark/references/motion.md +109 -109
- package/template/.claude/skills/hallmark/references/preview-examples.md +49 -49
- package/template/.claude/skills/hallmark/references/responsive.md +138 -138
- package/template/.claude/skills/hallmark/references/slop-test.md +205 -205
- package/template/.claude/skills/hallmark/references/structure.md +164 -164
- package/template/.claude/skills/hallmark/references/study.md +511 -511
- package/template/.claude/skills/hallmark/references/typography.md +243 -243
- package/template/.claude/skills/hallmark/references/verbs/audit.md +25 -25
- package/template/.claude/skills/hallmark/references/verbs/redesign.md +269 -269
- package/template/.claude/skills/hallmark-loop/SKILL.md +105 -105
- package/template/.claude/skills/hallmark-loop/references/auditor-call.md +60 -60
- package/template/.claude/skills/hallmark-loop/references/capture.md +78 -78
- package/template/.claude/skills/hallmark-loop/references/loop-control.md +79 -79
- package/template/.claude/skills/handoff/SKILL.md +15 -15
- package/template/.claude/skills/knowledge-crunching/SKILL.md +94 -94
- package/template/.claude/skills/research/SKILL.md +69 -69
- package/template/.claude/skills/skill-creator/LICENSE.txt +201 -201
- package/template/.claude/skills/skill-creator/SKILL.md +154 -149
- package/template/.claude/skills/skill-creator/agents/analyzer.md +274 -274
- package/template/.claude/skills/skill-creator/agents/comparator.md +202 -202
- package/template/.claude/skills/skill-creator/agents/grader.md +223 -223
- package/template/.claude/skills/skill-creator/assets/eval_review.html +146 -146
- package/template/.claude/skills/skill-creator/eval-viewer/generate_review.py +471 -471
- package/template/.claude/skills/skill-creator/eval-viewer/viewer.html +1325 -1325
- package/template/.claude/skills/skill-creator/references/benchmark-optimization-guide.md +86 -86
- package/template/.claude/skills/skill-creator/references/distribution-guide.md +79 -79
- package/template/.claude/skills/skill-creator/references/eval-infrastructure-guide.md +129 -129
- package/template/.claude/skills/skill-creator/references/eval-schemas.md +121 -121
- package/template/.claude/skills/skill-creator/references/mcp-skills-integration.md +71 -71
- package/template/.claude/skills/skill-creator/references/metadata-quality-criteria.md +94 -94
- package/template/.claude/skills/skill-creator/references/plugin-marketplace-hosting.md +104 -104
- package/template/.claude/skills/skill-creator/references/plugin-marketplace-overview.md +89 -89
- package/template/.claude/skills/skill-creator/references/plugin-marketplace-schema.md +93 -93
- package/template/.claude/skills/skill-creator/references/plugin-marketplace-sources.md +103 -103
- package/template/.claude/skills/skill-creator/references/plugin-marketplace-troubleshooting.md +76 -76
- package/template/.claude/skills/skill-creator/references/script-quality-criteria.md +106 -106
- package/template/.claude/skills/skill-creator/references/skill-anatomy-and-requirements.md +77 -77
- package/template/.claude/skills/skill-creator/references/skill-creation-workflow.md +152 -151
- package/template/.claude/skills/skill-creator/references/skill-design-patterns.md +75 -75
- package/template/.claude/skills/skill-creator/references/skillmark-benchmark-criteria.md +102 -102
- package/template/.claude/skills/skill-creator/references/structure-organization-criteria.md +114 -114
- package/template/.claude/skills/skill-creator/references/testing-and-iteration.md +78 -78
- package/template/.claude/skills/skill-creator/references/token-efficiency-criteria.md +74 -74
- package/template/.claude/skills/skill-creator/references/troubleshooting-guide.md +81 -81
- package/template/.claude/skills/skill-creator/references/validation-checklist.md +83 -83
- package/template/.claude/skills/skill-creator/references/writing-effective-instructions.md +88 -88
- package/template/.claude/skills/skill-creator/references/yaml-frontmatter-reference.md +92 -92
- package/template/.claude/skills/skill-creator/scripts/aggregate_benchmark.py +401 -401
- package/template/.claude/skills/skill-creator/scripts/encoding_utils.py +36 -36
- package/template/.claude/skills/skill-creator/scripts/generate_report.py +326 -326
- package/template/.claude/skills/skill-creator/scripts/improve_description.py +248 -248
- package/template/.claude/skills/skill-creator/scripts/init_skill.py +360 -360
- package/template/.claude/skills/skill-creator/scripts/package_skill.py +143 -143
- package/template/.claude/skills/skill-creator/scripts/quick_validate.py +110 -110
- package/template/.claude/skills/skill-creator/scripts/run_eval.py +310 -310
- package/template/.claude/skills/skill-creator/scripts/run_loop.py +332 -332
- package/template/.claude/skills/skill-creator/scripts/utils.py +47 -47
- package/template/.claude/skills/tdd/SKILL.md +142 -142
- package/template/.claude/skills/tdd/deep-modules.md +15 -15
- package/template/.claude/skills/tdd/interface-design.md +31 -31
- package/template/.claude/skills/tdd/mocking.md +59 -59
- package/template/.claude/skills/tdd/refactoring.md +10 -10
- package/template/.claude/skills/tdd/tests.md +61 -61
- package/template/.claude/statusline.cjs +0 -0
- package/template/.claude/skills/code-review/references/adversarial-review.md +0 -223
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
# Floating nav on scroll — the cross-fade morph
|
|
2
|
-
|
|
3
|
-
The recipe for **N10 · Floating-on-scroll morph** (see [`component-cookbook.md` § Navigation](component-cookbook.md)). One DOM, two visual modes, single class toggle, one timing curve. AI defaults botch every one of the four laws below — which is why N10 is the most demanding nav in the cookbook.
|
|
4
|
-
|
|
5
|
-
## The structure
|
|
6
|
-
|
|
7
|
-
One `<header>` with an inner wrapper. The outer owns the **default bar** visuals; the inner owns the **floating pill** visuals. As `.is-floating` toggles past a scroll threshold, each layer cross-fades its own visuals out while the other fades in.
|
|
8
|
-
|
|
9
|
-
```html
|
|
10
|
-
<header class="nav">
|
|
11
|
-
<div class="nav__inner">
|
|
12
|
-
<a class="wordmark">Hallmark</a>
|
|
13
|
-
<ul class="nav__links">…</ul>
|
|
14
|
-
<a class="cta">Install</a>
|
|
15
|
-
</div>
|
|
16
|
-
</header>
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## The four laws — non-negotiable
|
|
20
|
-
|
|
21
|
-
**1. Total nav height stays constant.** If outer height changes when state flips, every pixel below shifts vertically. Users perceive this as "the page jumped" mid-scroll. Compensate the inner's shrink with the outer's `padding-block` so the math sums to the same total in both states.
|
|
22
|
-
|
|
23
|
-
**2. Visible offset uses `transform: translateY()`, never `padding`/`margin`.** The pill should sit detached from the viewport top with breathing room. The naïve add-padding-to-outer fix breaks Law 1. `transform` doesn't affect layout — pill drops visually, box stays put.
|
|
24
|
-
|
|
25
|
-
**3. Cross-fade ownership of every shared visual.** For every property the outer carries in default (background, border, backdrop-filter, box-shadow), explicitly neutralise it in `.is-floating` *and* put it in the transition list. Forgetting one — say a stale `backdrop-filter: blur(14px)` on the outer in floating mode — yields an invisible blurred strip dragging across the viewport behind nothing.
|
|
26
|
-
|
|
27
|
-
**4. Single timing curve across every property.** Eight properties on eight curves reads as eight animations. Same eight on `var(--dur-mid)` + `var(--ease-out)` reads as one motion. Use `cubic-bezier(0.16, 1, 0.3, 1)` (exponential ease-out) and ~520 ms.
|
|
28
|
-
|
|
29
|
-
## The property morph (10 properties, one curve)
|
|
30
|
-
|
|
31
|
-
| Element | Property | Default | Floating |
|
|
32
|
-
|---|---|---|---|
|
|
33
|
-
| `.nav` | `padding-block` | `0` | `var(--space-2xs)` |
|
|
34
|
-
| `.nav` | `background-color` | dark/0.62 | `transparent` |
|
|
35
|
-
| `.nav` | `border-block-end-color` | rule | `transparent` |
|
|
36
|
-
| `.nav` | `backdrop-filter` | `saturate(1.4) blur(14px)` | `blur(0)` |
|
|
37
|
-
| `.nav__inner` | `max-width` | `var(--page-max)` | `~58rem` |
|
|
38
|
-
| `.nav__inner` | `min-height` | `60px` | `52px` |
|
|
39
|
-
| `.nav__inner` | `padding-block` | `12px` | `4px` |
|
|
40
|
-
| `.nav__inner` | `border-radius` | `0` | `var(--radius-pill, 999px)` |
|
|
41
|
-
| `.nav__inner` | `background-color` | `transparent` | dark/0.82 |
|
|
42
|
-
| `.nav__inner` | `backdrop-filter` | `blur(0)` | `blur(18px)` |
|
|
43
|
-
| `.nav__inner` | `box-shadow` | `none` | drop + tinted glow + inset hairline |
|
|
44
|
-
| `.nav__inner` | `transform` | `translateY(0)` | `translateY(12px)` |
|
|
45
|
-
|
|
46
|
-
Use `blur(0)` not `none` — `none` snaps, `blur(0)` transitions. `backdrop-filter` transitions are 2024+ baseline (Chrome 107+, Safari 14+, Firefox 103+).
|
|
47
|
-
|
|
48
|
-
## The scroll handler
|
|
49
|
-
|
|
50
|
-
```js
|
|
51
|
-
(() => {
|
|
52
|
-
const nav = document.querySelector(".nav");
|
|
53
|
-
if (!nav) return;
|
|
54
|
-
const THRESHOLD = 80; // ≥ 60 px to avoid micro-scroll twitches
|
|
55
|
-
let floating = false;
|
|
56
|
-
let ticking = false;
|
|
57
|
-
const update = () => {
|
|
58
|
-
const next = window.scrollY > THRESHOLD;
|
|
59
|
-
if (next !== floating) { // boolean-flip guard — toggle once per state change
|
|
60
|
-
floating = next;
|
|
61
|
-
nav.classList.toggle("is-floating", floating);
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
window.addEventListener("scroll", () => {
|
|
65
|
-
if (ticking) return;
|
|
66
|
-
ticking = true;
|
|
67
|
-
requestAnimationFrame(() => { update(); ticking = false; });
|
|
68
|
-
}, { passive: true }); // mobile scroll-perf — keep main thread free
|
|
69
|
-
update();
|
|
70
|
-
})();
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
Three discipline points:
|
|
74
|
-
- **`passive: true`** — listener won't `preventDefault`, browser keeps main thread free for scrolling.
|
|
75
|
-
- **`requestAnimationFrame` throttle** — caps to 60 calls/s, aligns with paint.
|
|
76
|
-
- **Boolean-flip guard** — class operation runs once per state change, not once per scroll event.
|
|
77
|
-
|
|
78
|
-
## Anti-patterns Hallmark refuses
|
|
79
|
-
|
|
80
|
-
1. Two separate `<header>` elements that swap via opacity. Doubles DOM, fights focus order, can desync content.
|
|
81
|
-
2. Animating `top` / `margin-top` to add the floating offset. Triggers layout. `transform` is the only correct lever.
|
|
82
|
-
3. Using `backdrop-filter: none` in the floating state. Snaps. Use `blur(0)` so it transitions.
|
|
83
|
-
4. Letting nav height change between states. Causes content jitter — the single most damaging mistake in this pattern.
|
|
84
|
-
5. Different transition durations per property ("speed up the radius", "delay the shadow"). Reads as broken even though everything moves. One curve.
|
|
85
|
-
6. `scroll` event without `{ passive: true }` or without rAF throttling. Both kill mobile scroll perf.
|
|
86
|
-
7. Threshold = 0 (morph fires at the slightest scroll). Too jumpy. Use ≥ 60 px.
|
|
87
|
-
8. Forgetting the boolean-flip guard — toggling the class on every scroll event causes layout thrash.
|
|
88
|
-
|
|
89
|
-
The pattern works because it's restrained — one orchestrated morph, no embellishment. Pour the polish into the timing curve, the shadow stack, and the height-constant math; not into "more."
|
|
1
|
+
# Floating nav on scroll — the cross-fade morph
|
|
2
|
+
|
|
3
|
+
The recipe for **N10 · Floating-on-scroll morph** (see [`component-cookbook.md` § Navigation](component-cookbook.md)). One DOM, two visual modes, single class toggle, one timing curve. AI defaults botch every one of the four laws below — which is why N10 is the most demanding nav in the cookbook.
|
|
4
|
+
|
|
5
|
+
## The structure
|
|
6
|
+
|
|
7
|
+
One `<header>` with an inner wrapper. The outer owns the **default bar** visuals; the inner owns the **floating pill** visuals. As `.is-floating` toggles past a scroll threshold, each layer cross-fades its own visuals out while the other fades in.
|
|
8
|
+
|
|
9
|
+
```html
|
|
10
|
+
<header class="nav">
|
|
11
|
+
<div class="nav__inner">
|
|
12
|
+
<a class="wordmark">Hallmark</a>
|
|
13
|
+
<ul class="nav__links">…</ul>
|
|
14
|
+
<a class="cta">Install</a>
|
|
15
|
+
</div>
|
|
16
|
+
</header>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## The four laws — non-negotiable
|
|
20
|
+
|
|
21
|
+
**1. Total nav height stays constant.** If outer height changes when state flips, every pixel below shifts vertically. Users perceive this as "the page jumped" mid-scroll. Compensate the inner's shrink with the outer's `padding-block` so the math sums to the same total in both states.
|
|
22
|
+
|
|
23
|
+
**2. Visible offset uses `transform: translateY()`, never `padding`/`margin`.** The pill should sit detached from the viewport top with breathing room. The naïve add-padding-to-outer fix breaks Law 1. `transform` doesn't affect layout — pill drops visually, box stays put.
|
|
24
|
+
|
|
25
|
+
**3. Cross-fade ownership of every shared visual.** For every property the outer carries in default (background, border, backdrop-filter, box-shadow), explicitly neutralise it in `.is-floating` *and* put it in the transition list. Forgetting one — say a stale `backdrop-filter: blur(14px)` on the outer in floating mode — yields an invisible blurred strip dragging across the viewport behind nothing.
|
|
26
|
+
|
|
27
|
+
**4. Single timing curve across every property.** Eight properties on eight curves reads as eight animations. Same eight on `var(--dur-mid)` + `var(--ease-out)` reads as one motion. Use `cubic-bezier(0.16, 1, 0.3, 1)` (exponential ease-out) and ~520 ms.
|
|
28
|
+
|
|
29
|
+
## The property morph (10 properties, one curve)
|
|
30
|
+
|
|
31
|
+
| Element | Property | Default | Floating |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| `.nav` | `padding-block` | `0` | `var(--space-2xs)` |
|
|
34
|
+
| `.nav` | `background-color` | dark/0.62 | `transparent` |
|
|
35
|
+
| `.nav` | `border-block-end-color` | rule | `transparent` |
|
|
36
|
+
| `.nav` | `backdrop-filter` | `saturate(1.4) blur(14px)` | `blur(0)` |
|
|
37
|
+
| `.nav__inner` | `max-width` | `var(--page-max)` | `~58rem` |
|
|
38
|
+
| `.nav__inner` | `min-height` | `60px` | `52px` |
|
|
39
|
+
| `.nav__inner` | `padding-block` | `12px` | `4px` |
|
|
40
|
+
| `.nav__inner` | `border-radius` | `0` | `var(--radius-pill, 999px)` |
|
|
41
|
+
| `.nav__inner` | `background-color` | `transparent` | dark/0.82 |
|
|
42
|
+
| `.nav__inner` | `backdrop-filter` | `blur(0)` | `blur(18px)` |
|
|
43
|
+
| `.nav__inner` | `box-shadow` | `none` | drop + tinted glow + inset hairline |
|
|
44
|
+
| `.nav__inner` | `transform` | `translateY(0)` | `translateY(12px)` |
|
|
45
|
+
|
|
46
|
+
Use `blur(0)` not `none` — `none` snaps, `blur(0)` transitions. `backdrop-filter` transitions are 2024+ baseline (Chrome 107+, Safari 14+, Firefox 103+).
|
|
47
|
+
|
|
48
|
+
## The scroll handler
|
|
49
|
+
|
|
50
|
+
```js
|
|
51
|
+
(() => {
|
|
52
|
+
const nav = document.querySelector(".nav");
|
|
53
|
+
if (!nav) return;
|
|
54
|
+
const THRESHOLD = 80; // ≥ 60 px to avoid micro-scroll twitches
|
|
55
|
+
let floating = false;
|
|
56
|
+
let ticking = false;
|
|
57
|
+
const update = () => {
|
|
58
|
+
const next = window.scrollY > THRESHOLD;
|
|
59
|
+
if (next !== floating) { // boolean-flip guard — toggle once per state change
|
|
60
|
+
floating = next;
|
|
61
|
+
nav.classList.toggle("is-floating", floating);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
window.addEventListener("scroll", () => {
|
|
65
|
+
if (ticking) return;
|
|
66
|
+
ticking = true;
|
|
67
|
+
requestAnimationFrame(() => { update(); ticking = false; });
|
|
68
|
+
}, { passive: true }); // mobile scroll-perf — keep main thread free
|
|
69
|
+
update();
|
|
70
|
+
})();
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Three discipline points:
|
|
74
|
+
- **`passive: true`** — listener won't `preventDefault`, browser keeps main thread free for scrolling.
|
|
75
|
+
- **`requestAnimationFrame` throttle** — caps to 60 calls/s, aligns with paint.
|
|
76
|
+
- **Boolean-flip guard** — class operation runs once per state change, not once per scroll event.
|
|
77
|
+
|
|
78
|
+
## Anti-patterns Hallmark refuses
|
|
79
|
+
|
|
80
|
+
1. Two separate `<header>` elements that swap via opacity. Doubles DOM, fights focus order, can desync content.
|
|
81
|
+
2. Animating `top` / `margin-top` to add the floating offset. Triggers layout. `transform` is the only correct lever.
|
|
82
|
+
3. Using `backdrop-filter: none` in the floating state. Snaps. Use `blur(0)` so it transitions.
|
|
83
|
+
4. Letting nav height change between states. Causes content jitter — the single most damaging mistake in this pattern.
|
|
84
|
+
5. Different transition durations per property ("speed up the radius", "delay the shadow"). Reads as broken even though everything moves. One curve.
|
|
85
|
+
6. `scroll` event without `{ passive: true }` or without rAF throttling. Both kill mobile scroll perf.
|
|
86
|
+
7. Threshold = 0 (morph fires at the slightest scroll). Too jumpy. Use ≥ 60 px.
|
|
87
|
+
8. Forgetting the boolean-flip guard — toggling the class on every scroll event causes layout thrash.
|
|
88
|
+
|
|
89
|
+
The pattern works because it's restrained — one orchestrated morph, no embellishment. Pour the polish into the timing curve, the shadow stack, and the height-constant math; not into "more."
|
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
# Genre — atmospheric
|
|
2
|
-
|
|
3
|
-
For the AI-creative product page. Dark canvas with warm radial blooms, confident sans display, expressive but plain-English copy, single warm accent. The aesthetic of a tool you'd actually want to use after dark — generative music, video, image, voice.
|
|
4
|
-
|
|
5
|
-
## When to pick it
|
|
6
|
-
|
|
7
|
-
Brief mentions any of: *AI tool, generative, music, video, image, voice, late-night, atmospheric, dark mode, expressive, creative tool, model playground, vibe-coded, dreamlike, nocturnal*. Also pick when the user names a *mood* that requires darkness (e.g. "moody", "cinematic", "after hours").
|
|
8
|
-
|
|
9
|
-
## Themes that belong
|
|
10
|
-
|
|
11
|
-
`Bloom` (canonical), `Midnight`, `Terminal`. Three dark-paper themes; the rotation walks them when atmospheric is active.
|
|
12
|
-
|
|
13
|
-
## Voice
|
|
14
|
-
|
|
15
|
-
- **Display** — Geist Sans 600 or similar weighty sans, plain English, no ornament. Letter-spacing tight (`-0.03em` or tighter).
|
|
16
|
-
- **Body** — same family, 400. Light grey on dark (`oklch(86% 0.008 40)`).
|
|
17
|
-
- **Accent** — single warm hue (orange / amber / red / pink). Used in radial-gradient blooms on the canvas, on focus rings, on small tags. Never on display text (that's gate 5 universal — gradient text stays banned).
|
|
18
|
-
- **Layout** — centred or near-centred heroes. The canvas itself is the design; the type sits on top of an atmospheric ground.
|
|
19
|
-
- **Motion** — fade-in only. No slide, no bounce. The atmosphere does the work.
|
|
20
|
-
- **Copy tone** — direct, slightly poetic, specific. *"Make a house song about quitting your job."* is the calibration.
|
|
21
|
-
|
|
22
|
-
## What this genre allows
|
|
23
|
-
|
|
24
|
-
- **Radial-gradient bloom** on the body background — up to two blooms, each ~20–30 % footprint, fixed-attached, no animation. Gate 31 universal is loosened here.
|
|
25
|
-
- **Centred heroes** — gate 7 universal is loosened. The canvas frames the type.
|
|
26
|
-
- **Pill-rounded CTAs** with accent fill — confident, not pastel.
|
|
27
|
-
- **Glow shadows** on hover (cards lift toward the user with a soft warm shadow).
|
|
28
|
-
- **Larger expressive type** — display can hit 6 rem (`clamp(3rem, 6vw + 1rem, 6rem)`).
|
|
29
|
-
|
|
30
|
-
## What this genre disallows
|
|
31
|
-
|
|
32
|
-
- **Light-paper aesthetics** — the canvas is dark. Don't sneak white sections in.
|
|
33
|
-
- **Italic serif body** — atmospheric stays sans top-to-bottom.
|
|
34
|
-
- **Hairlines** — atmospheric uses elevated cards (`paper-2`, `paper-3`) instead of hairline-on-paper.
|
|
35
|
-
- **Multiple accent hues** — one warm bloom + one secondary (pink/red) is the maximum. No teal-and-amber juggling.
|
|
36
|
-
- **Glassmorphism** — banned. Atmospheric is *atmospheric*, not glass.
|
|
37
|
-
- **Gradient text** — gate 5 universal. Stays banned.
|
|
38
|
-
|
|
39
|
-
## Voice fixtures
|
|
40
|
-
|
|
41
|
-
- *"Built for the dark."*
|
|
42
|
-
- *"The page should feel like a place you could sit in."*
|
|
43
|
-
- *"A canvas, then a tool."*
|
|
44
|
-
- *"Generate, refine, ship — between Tuesday and Wednesday."*
|
|
45
|
-
- *"The instrument is dark. The output is yours."*
|
|
46
|
-
|
|
47
|
-
## Nav and footer voice
|
|
48
|
-
|
|
49
|
-
- **Default nav:** N5 Floating pill — the blur backdrop sells the atmospheric mood. The pill sits over the dark canvas and the bloom shows through the blur.
|
|
50
|
-
- **Acceptable also:** N9 Edge-aligned minimal (when the canvas is loud enough that nav should disappear into it); N4 ⌘K-only (when the audience is technical).
|
|
51
|
-
- **Default footer:** Ft5 Statement — closes the page with a sentence. Atmospheric pages argue something; the footer states it.
|
|
52
|
-
- **Acceptable also:** Ft1 Mast-headed; Ft2 Inline single line.
|
|
53
|
-
- **Banned for atmospheric:** N6 Newspaper masthead (editorial vocabulary); N7 Brutal slab (fights the calm); Ft8 Marquee scroll (kinetic, breaks the dark canvas); Ft3 Index columns (AI-footer fingerprint).
|
|
54
|
-
|
|
55
|
-
See [`component-cookbook.md`](../component-cookbook.md) § Navigation and § Footers for the full archetypes + code.
|
|
56
|
-
|
|
57
|
-
## Stamp signature
|
|
58
|
-
|
|
59
|
-
```css
|
|
60
|
-
/* Hallmark · genre: atmospheric · macrostructure: <name> · theme: <name> · enrichment: <tier> · nav: <N#> · footer: <Ft#> */
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## Reference register
|
|
64
|
-
|
|
65
|
-
The aesthetic to match: dark canvas with two warm blooms behind the content, plain-English heroic display, single warm accent on small surfaces. Hand-built, not stock-AI.
|
|
1
|
+
# Genre — atmospheric
|
|
2
|
+
|
|
3
|
+
For the AI-creative product page. Dark canvas with warm radial blooms, confident sans display, expressive but plain-English copy, single warm accent. The aesthetic of a tool you'd actually want to use after dark — generative music, video, image, voice.
|
|
4
|
+
|
|
5
|
+
## When to pick it
|
|
6
|
+
|
|
7
|
+
Brief mentions any of: *AI tool, generative, music, video, image, voice, late-night, atmospheric, dark mode, expressive, creative tool, model playground, vibe-coded, dreamlike, nocturnal*. Also pick when the user names a *mood* that requires darkness (e.g. "moody", "cinematic", "after hours").
|
|
8
|
+
|
|
9
|
+
## Themes that belong
|
|
10
|
+
|
|
11
|
+
`Bloom` (canonical), `Midnight`, `Terminal`. Three dark-paper themes; the rotation walks them when atmospheric is active.
|
|
12
|
+
|
|
13
|
+
## Voice
|
|
14
|
+
|
|
15
|
+
- **Display** — Geist Sans 600 or similar weighty sans, plain English, no ornament. Letter-spacing tight (`-0.03em` or tighter).
|
|
16
|
+
- **Body** — same family, 400. Light grey on dark (`oklch(86% 0.008 40)`).
|
|
17
|
+
- **Accent** — single warm hue (orange / amber / red / pink). Used in radial-gradient blooms on the canvas, on focus rings, on small tags. Never on display text (that's gate 5 universal — gradient text stays banned).
|
|
18
|
+
- **Layout** — centred or near-centred heroes. The canvas itself is the design; the type sits on top of an atmospheric ground.
|
|
19
|
+
- **Motion** — fade-in only. No slide, no bounce. The atmosphere does the work.
|
|
20
|
+
- **Copy tone** — direct, slightly poetic, specific. *"Make a house song about quitting your job."* is the calibration.
|
|
21
|
+
|
|
22
|
+
## What this genre allows
|
|
23
|
+
|
|
24
|
+
- **Radial-gradient bloom** on the body background — up to two blooms, each ~20–30 % footprint, fixed-attached, no animation. Gate 31 universal is loosened here.
|
|
25
|
+
- **Centred heroes** — gate 7 universal is loosened. The canvas frames the type.
|
|
26
|
+
- **Pill-rounded CTAs** with accent fill — confident, not pastel.
|
|
27
|
+
- **Glow shadows** on hover (cards lift toward the user with a soft warm shadow).
|
|
28
|
+
- **Larger expressive type** — display can hit 6 rem (`clamp(3rem, 6vw + 1rem, 6rem)`).
|
|
29
|
+
|
|
30
|
+
## What this genre disallows
|
|
31
|
+
|
|
32
|
+
- **Light-paper aesthetics** — the canvas is dark. Don't sneak white sections in.
|
|
33
|
+
- **Italic serif body** — atmospheric stays sans top-to-bottom.
|
|
34
|
+
- **Hairlines** — atmospheric uses elevated cards (`paper-2`, `paper-3`) instead of hairline-on-paper.
|
|
35
|
+
- **Multiple accent hues** — one warm bloom + one secondary (pink/red) is the maximum. No teal-and-amber juggling.
|
|
36
|
+
- **Glassmorphism** — banned. Atmospheric is *atmospheric*, not glass.
|
|
37
|
+
- **Gradient text** — gate 5 universal. Stays banned.
|
|
38
|
+
|
|
39
|
+
## Voice fixtures
|
|
40
|
+
|
|
41
|
+
- *"Built for the dark."*
|
|
42
|
+
- *"The page should feel like a place you could sit in."*
|
|
43
|
+
- *"A canvas, then a tool."*
|
|
44
|
+
- *"Generate, refine, ship — between Tuesday and Wednesday."*
|
|
45
|
+
- *"The instrument is dark. The output is yours."*
|
|
46
|
+
|
|
47
|
+
## Nav and footer voice
|
|
48
|
+
|
|
49
|
+
- **Default nav:** N5 Floating pill — the blur backdrop sells the atmospheric mood. The pill sits over the dark canvas and the bloom shows through the blur.
|
|
50
|
+
- **Acceptable also:** N9 Edge-aligned minimal (when the canvas is loud enough that nav should disappear into it); N4 ⌘K-only (when the audience is technical).
|
|
51
|
+
- **Default footer:** Ft5 Statement — closes the page with a sentence. Atmospheric pages argue something; the footer states it.
|
|
52
|
+
- **Acceptable also:** Ft1 Mast-headed; Ft2 Inline single line.
|
|
53
|
+
- **Banned for atmospheric:** N6 Newspaper masthead (editorial vocabulary); N7 Brutal slab (fights the calm); Ft8 Marquee scroll (kinetic, breaks the dark canvas); Ft3 Index columns (AI-footer fingerprint).
|
|
54
|
+
|
|
55
|
+
See [`component-cookbook.md`](../component-cookbook.md) § Navigation and § Footers for the full archetypes + code.
|
|
56
|
+
|
|
57
|
+
## Stamp signature
|
|
58
|
+
|
|
59
|
+
```css
|
|
60
|
+
/* Hallmark · genre: atmospheric · macrostructure: <name> · theme: <name> · enrichment: <tier> · nav: <N#> · footer: <Ft#> */
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Reference register
|
|
64
|
+
|
|
65
|
+
The aesthetic to match: dark canvas with two warm blooms behind the content, plain-English heroic display, single warm accent on small surfaces. Hand-built, not stock-AI.
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
# Genre — editorial (default)
|
|
2
|
-
|
|
3
|
-
The canonical Hallmark voice. Pages built for content-led briefs: portfolios, manifestos, type specimens, agency sites, magazine pieces, indie podcasts, bakery / brand stories, considered B2C marketing.
|
|
4
|
-
|
|
5
|
-
This is what Hallmark looks like when no other genre signal fires. It is the silent default.
|
|
6
|
-
|
|
7
|
-
## When to pick it
|
|
8
|
-
|
|
9
|
-
Default. Pick editorial when the brief does not name a specialised aesthetic — when the user said "a landing page for X" without telling you whether X is enterprise, atmospheric, or playful. Most briefs land here.
|
|
10
|
-
|
|
11
|
-
## Themes that belong
|
|
12
|
-
|
|
13
|
-
`Specimen`, `Newsprint`, `Atelier`, `Garden`, `Salon`, `Linen`, `Almanac`, `Studio`, `Riso`, `Sport`, `Brutal`, `Manifesto`. Twelve themes — plenty of variety inside the genre.
|
|
14
|
-
|
|
15
|
-
## Voice
|
|
16
|
-
|
|
17
|
-
- **Display** — italic serif, condensed sans, or display-heavy. Not Inter. Not Geist. The weight commits to an extreme (300 or 700+).
|
|
18
|
-
- **Body** — workhorse serif (Newsreader, Cormorant) or a plain non-default sans (The Future, Söhne). Readable at 45–75 ch.
|
|
19
|
-
- **Accent** — single warm or cool hue, used at < 5 % of any viewport.
|
|
20
|
-
- **Layout** — asymmetric. Hairlines, not card borders. Generous whitespace.
|
|
21
|
-
- **Motion** — quiet. One orchestrated entrance. No bounces.
|
|
22
|
-
- **Copy tone** — specific, hand-set, slightly literary. Verbs over adjectives.
|
|
23
|
-
|
|
24
|
-
## What this genre allows
|
|
25
|
-
|
|
26
|
-
- Hairline rules, fleurons, drop caps, double rules.
|
|
27
|
-
- Italic body in long-form content.
|
|
28
|
-
- Asymmetric column counts (2:5, 3:7) on prose pages.
|
|
29
|
-
- Hand-built SVG illustrations, pure-CSS art (Tier A enrichment).
|
|
30
|
-
- Numbered display labels, edge-aligned headlines.
|
|
31
|
-
- Single-accent-colour highlighting (`<mark>` band at x-height).
|
|
32
|
-
|
|
33
|
-
## What this genre disallows
|
|
34
|
-
|
|
35
|
-
The universal slop-test gates apply, plus these editorial-specific bans:
|
|
36
|
-
|
|
37
|
-
- **Pill-rounded buttons** with gradient fill — pill is fine, gradient on a pill is not.
|
|
38
|
-
- **Centred-everything heroes** (gate 7 universal). Editorial heroes are left-biased or asymmetric.
|
|
39
|
-
- **Card-in-card** layouts (gate 4 universal).
|
|
40
|
-
- **Three-column equal-icon-tile feature grid** (gate 3 universal).
|
|
41
|
-
- **Glassmorphism** — never; the medium is paper, not glass.
|
|
42
|
-
- **Pure black or pure white** as paper or ink (gate 8). Tint everything toward the anchor.
|
|
43
|
-
|
|
44
|
-
## Voice fixtures
|
|
45
|
-
|
|
46
|
-
Each macrostructure under editorial picks from these opening-line patterns. Imitate the *shape*, not the wording.
|
|
47
|
-
|
|
48
|
-
- *"Type, set with care."*
|
|
49
|
-
- *"Print discipline, on screen."*
|
|
50
|
-
- *"A small skill that argues against the average."*
|
|
51
|
-
- *"We compose the page like a broadsheet — hairlines, columns, restraint."*
|
|
52
|
-
- *"Restraint, repeated, becomes a signature."*
|
|
53
|
-
|
|
54
|
-
## Nav and footer voice
|
|
55
|
-
|
|
56
|
-
- **Default nav:** N6 Newspaper masthead — full-width, large centred wordmark, thin issue/date row in serif small caps, double-rule below. Reads as broadsheet.
|
|
57
|
-
- **Acceptable also:** N1 Wordmark + 2 links (when destinations are minimal); N9 Edge-aligned minimal (when the page is letter-shaped or atelier-quiet).
|
|
58
|
-
- **Default footer:** Ft1 Mast-headed (wordmark anchors a single horizontal band, tagline + small links beside).
|
|
59
|
-
- **Acceptable also:** Ft2 Inline single line; Ft4 Dense colophon (newsprint / almanac voices); Ft6 Letter close (atelier / garden / personal); Ft7 Newsletter-first (when the brand legitimately publishes).
|
|
60
|
-
- **Banned for editorial:** N5 Floating pill (modern-minimal vocabulary), N7 Brutal slab (fights the restraint), Ft8 Marquee scroll (kinetic; wrong genre).
|
|
61
|
-
|
|
62
|
-
See [`component-cookbook.md`](../component-cookbook.md) § Navigation and § Footers for the full archetypes + code.
|
|
63
|
-
|
|
64
|
-
## Stamp signature
|
|
65
|
-
|
|
66
|
-
Output's CSS comment header reads:
|
|
67
|
-
|
|
68
|
-
```css
|
|
69
|
-
/* Hallmark · genre: editorial · macrostructure: <name> · theme: <name> · enrichment: <tier> · nav: <N#> · footer: <Ft#> */
|
|
70
|
-
```
|
|
1
|
+
# Genre — editorial (default)
|
|
2
|
+
|
|
3
|
+
The canonical Hallmark voice. Pages built for content-led briefs: portfolios, manifestos, type specimens, agency sites, magazine pieces, indie podcasts, bakery / brand stories, considered B2C marketing.
|
|
4
|
+
|
|
5
|
+
This is what Hallmark looks like when no other genre signal fires. It is the silent default.
|
|
6
|
+
|
|
7
|
+
## When to pick it
|
|
8
|
+
|
|
9
|
+
Default. Pick editorial when the brief does not name a specialised aesthetic — when the user said "a landing page for X" without telling you whether X is enterprise, atmospheric, or playful. Most briefs land here.
|
|
10
|
+
|
|
11
|
+
## Themes that belong
|
|
12
|
+
|
|
13
|
+
`Specimen`, `Newsprint`, `Atelier`, `Garden`, `Salon`, `Linen`, `Almanac`, `Studio`, `Riso`, `Sport`, `Brutal`, `Manifesto`. Twelve themes — plenty of variety inside the genre.
|
|
14
|
+
|
|
15
|
+
## Voice
|
|
16
|
+
|
|
17
|
+
- **Display** — italic serif, condensed sans, or display-heavy. Not Inter. Not Geist. The weight commits to an extreme (300 or 700+).
|
|
18
|
+
- **Body** — workhorse serif (Newsreader, Cormorant) or a plain non-default sans (The Future, Söhne). Readable at 45–75 ch.
|
|
19
|
+
- **Accent** — single warm or cool hue, used at < 5 % of any viewport.
|
|
20
|
+
- **Layout** — asymmetric. Hairlines, not card borders. Generous whitespace.
|
|
21
|
+
- **Motion** — quiet. One orchestrated entrance. No bounces.
|
|
22
|
+
- **Copy tone** — specific, hand-set, slightly literary. Verbs over adjectives.
|
|
23
|
+
|
|
24
|
+
## What this genre allows
|
|
25
|
+
|
|
26
|
+
- Hairline rules, fleurons, drop caps, double rules.
|
|
27
|
+
- Italic body in long-form content.
|
|
28
|
+
- Asymmetric column counts (2:5, 3:7) on prose pages.
|
|
29
|
+
- Hand-built SVG illustrations, pure-CSS art (Tier A enrichment).
|
|
30
|
+
- Numbered display labels, edge-aligned headlines.
|
|
31
|
+
- Single-accent-colour highlighting (`<mark>` band at x-height).
|
|
32
|
+
|
|
33
|
+
## What this genre disallows
|
|
34
|
+
|
|
35
|
+
The universal slop-test gates apply, plus these editorial-specific bans:
|
|
36
|
+
|
|
37
|
+
- **Pill-rounded buttons** with gradient fill — pill is fine, gradient on a pill is not.
|
|
38
|
+
- **Centred-everything heroes** (gate 7 universal). Editorial heroes are left-biased or asymmetric.
|
|
39
|
+
- **Card-in-card** layouts (gate 4 universal).
|
|
40
|
+
- **Three-column equal-icon-tile feature grid** (gate 3 universal).
|
|
41
|
+
- **Glassmorphism** — never; the medium is paper, not glass.
|
|
42
|
+
- **Pure black or pure white** as paper or ink (gate 8). Tint everything toward the anchor.
|
|
43
|
+
|
|
44
|
+
## Voice fixtures
|
|
45
|
+
|
|
46
|
+
Each macrostructure under editorial picks from these opening-line patterns. Imitate the *shape*, not the wording.
|
|
47
|
+
|
|
48
|
+
- *"Type, set with care."*
|
|
49
|
+
- *"Print discipline, on screen."*
|
|
50
|
+
- *"A small skill that argues against the average."*
|
|
51
|
+
- *"We compose the page like a broadsheet — hairlines, columns, restraint."*
|
|
52
|
+
- *"Restraint, repeated, becomes a signature."*
|
|
53
|
+
|
|
54
|
+
## Nav and footer voice
|
|
55
|
+
|
|
56
|
+
- **Default nav:** N6 Newspaper masthead — full-width, large centred wordmark, thin issue/date row in serif small caps, double-rule below. Reads as broadsheet.
|
|
57
|
+
- **Acceptable also:** N1 Wordmark + 2 links (when destinations are minimal); N9 Edge-aligned minimal (when the page is letter-shaped or atelier-quiet).
|
|
58
|
+
- **Default footer:** Ft1 Mast-headed (wordmark anchors a single horizontal band, tagline + small links beside).
|
|
59
|
+
- **Acceptable also:** Ft2 Inline single line; Ft4 Dense colophon (newsprint / almanac voices); Ft6 Letter close (atelier / garden / personal); Ft7 Newsletter-first (when the brand legitimately publishes).
|
|
60
|
+
- **Banned for editorial:** N5 Floating pill (modern-minimal vocabulary), N7 Brutal slab (fights the restraint), Ft8 Marquee scroll (kinetic; wrong genre).
|
|
61
|
+
|
|
62
|
+
See [`component-cookbook.md`](../component-cookbook.md) § Navigation and § Footers for the full archetypes + code.
|
|
63
|
+
|
|
64
|
+
## Stamp signature
|
|
65
|
+
|
|
66
|
+
Output's CSS comment header reads:
|
|
67
|
+
|
|
68
|
+
```css
|
|
69
|
+
/* Hallmark · genre: editorial · macrostructure: <name> · theme: <name> · enrichment: <tier> · nav: <N#> · footer: <Ft#> */
|
|
70
|
+
```
|
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
# Genre — modern-minimal
|
|
2
|
-
|
|
3
|
-
For the polished enterprise / dev-tool / API page. Stripe / Linear / ElevenLabs school: Geist sans, large confident displays, generous whitespace, pill CTAs, monochrome with optional accent. Minimalism with conviction, not the absence of choice.
|
|
4
|
-
|
|
5
|
-
## When to pick it
|
|
6
|
-
|
|
7
|
-
Brief mentions any of: *SaaS, enterprise, API, platform, developer tool, infra, B2B, dashboard, billing, Stripe-like, Linear-like, ElevenLabs-like, dev experience, ship fast*. Also pick when the user names a brand colour but the rest of the brief is restrained.
|
|
8
|
-
|
|
9
|
-
## Themes that belong
|
|
10
|
-
|
|
11
|
-
`Quiet` (canonical). Future themes can be added to this genre — anything monochrome or near-monochrome with Geist / Inter-class sans display and pill CTAs.
|
|
12
|
-
|
|
13
|
-
## Voice
|
|
14
|
-
|
|
15
|
-
- **Display** — Geist Sans 500–700, Inter Tight Display 600+, or similar. Letter-spacing tight (`-0.02em` to `-0.035em`).
|
|
16
|
-
- **Body** — Geist Sans 400, Inter 400. Same family as display (single-family discipline).
|
|
17
|
-
- **Accent** — monochrome (accent IS ink) or a single restrained hue used only on focus rings. No chromatic floods.
|
|
18
|
-
- **Layout** — two-column heroes (title left, lede right), generous whitespace, refined card surfaces with subtle borders.
|
|
19
|
-
- **Motion** — minimal. Reveals are off; the page is composed.
|
|
20
|
-
- **Copy tone** — declarative, specific, technical. "Built for X" is not banned but must name the X concretely.
|
|
21
|
-
|
|
22
|
-
## What this genre allows
|
|
23
|
-
|
|
24
|
-
- **Pill-rounded CTAs** — both filled and outlined. Black-filled primary + white-outlined secondary is the canonical pair.
|
|
25
|
-
- **Pure white paper** (`#fff` / `oklch(100% 0 0)`) — gate 8 is loosened here.
|
|
26
|
-
- **Zero-chroma neutrals** — gate 24 is loosened here. The Stripe / ElevenLabs school is monochrome by design.
|
|
27
|
-
- **Two-column hero with title-left + paragraph-right** — explicitly canonical for this genre.
|
|
28
|
-
- **Refined card surface** with very subtle border (`oklch(91% 0 0)`) and 8 px radius.
|
|
29
|
-
- **Large, tight-set displays** (`clamp(2.5rem, 5vw + 0.5rem, 4.75rem)`).
|
|
30
|
-
|
|
31
|
-
## What this genre disallows
|
|
32
|
-
|
|
33
|
-
- **Italic serif body** — modern-minimal stays sans top-to-bottom.
|
|
34
|
-
- **Hairline-everything** — borders are thin but visible, not the editorial 0.5 px hairline aesthetic.
|
|
35
|
-
- **Asymmetric prose columns** — modern-minimal aligns left, justified to a regular grid.
|
|
36
|
-
- **Drop caps, fleurons, ornament** — none of it.
|
|
37
|
-
- **Bouncy / overshoot easings** — gate 13 universal applies strictly here.
|
|
38
|
-
- **Gradient text** — gate 5 universal. Stays banned.
|
|
39
|
-
- **Glassmorphism** — banned.
|
|
40
|
-
|
|
41
|
-
## Voice fixtures
|
|
42
|
-
|
|
43
|
-
- *"Built to ship."*
|
|
44
|
-
- *"The platform that scales with you."*
|
|
45
|
-
- *"From idea to production in an afternoon."*
|
|
46
|
-
- *"Thirty thousand teams build with X."*
|
|
47
|
-
- *"One API. Every channel."*
|
|
48
|
-
|
|
49
|
-
## Nav and footer voice
|
|
50
|
-
|
|
51
|
-
- **Default nav:** N5 Floating pill — content-sized, detached from edges, blur backdrop, soft shadow. Vercel / Linear / Framer / Raycast vocabulary.
|
|
52
|
-
- **Acceptable also:** N1 Wordmark + 2 links (when destinations are genuinely minimal); N9 Edge-aligned minimal (when the brand earns the silence).
|
|
53
|
-
- **Default footer:** Ft2 Inline single line — wordmark + tagline + tiny credit, hairline rule above. Restrained.
|
|
54
|
-
- **Acceptable also:** Ft1 Mast-headed; Ft5 Statement (when the page wants a closing line).
|
|
55
|
-
- **Banned for modern-minimal:** N6 Newspaper masthead (editorial vocabulary); N7 Brutal slab (fights the restraint); Ft8 Marquee scroll (kinetic, wrong voice); Ft3 Index columns at full saturation (the AI-footer fingerprint — gate 52).
|
|
56
|
-
|
|
57
|
-
See [`component-cookbook.md`](../component-cookbook.md) § Navigation and § Footers for the full archetypes + code.
|
|
58
|
-
|
|
59
|
-
## Stamp signature
|
|
60
|
-
|
|
61
|
-
```css
|
|
62
|
-
/* Hallmark · genre: modern-minimal · macrostructure: <name> · theme: <name> · enrichment: <tier> · nav: <N#> · footer: <Ft#> */
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## Reference register (for the LLM, not credited to anyone)
|
|
66
|
-
|
|
67
|
-
The aesthetic to match: confident sans display, clean white canvas, two-column hero, pill CTAs, mono accent. The user knows what this looks like when they see it. Do not name external sites in the output.
|
|
1
|
+
# Genre — modern-minimal
|
|
2
|
+
|
|
3
|
+
For the polished enterprise / dev-tool / API page. Stripe / Linear / ElevenLabs school: Geist sans, large confident displays, generous whitespace, pill CTAs, monochrome with optional accent. Minimalism with conviction, not the absence of choice.
|
|
4
|
+
|
|
5
|
+
## When to pick it
|
|
6
|
+
|
|
7
|
+
Brief mentions any of: *SaaS, enterprise, API, platform, developer tool, infra, B2B, dashboard, billing, Stripe-like, Linear-like, ElevenLabs-like, dev experience, ship fast*. Also pick when the user names a brand colour but the rest of the brief is restrained.
|
|
8
|
+
|
|
9
|
+
## Themes that belong
|
|
10
|
+
|
|
11
|
+
`Quiet` (canonical). Future themes can be added to this genre — anything monochrome or near-monochrome with Geist / Inter-class sans display and pill CTAs.
|
|
12
|
+
|
|
13
|
+
## Voice
|
|
14
|
+
|
|
15
|
+
- **Display** — Geist Sans 500–700, Inter Tight Display 600+, or similar. Letter-spacing tight (`-0.02em` to `-0.035em`).
|
|
16
|
+
- **Body** — Geist Sans 400, Inter 400. Same family as display (single-family discipline).
|
|
17
|
+
- **Accent** — monochrome (accent IS ink) or a single restrained hue used only on focus rings. No chromatic floods.
|
|
18
|
+
- **Layout** — two-column heroes (title left, lede right), generous whitespace, refined card surfaces with subtle borders.
|
|
19
|
+
- **Motion** — minimal. Reveals are off; the page is composed.
|
|
20
|
+
- **Copy tone** — declarative, specific, technical. "Built for X" is not banned but must name the X concretely.
|
|
21
|
+
|
|
22
|
+
## What this genre allows
|
|
23
|
+
|
|
24
|
+
- **Pill-rounded CTAs** — both filled and outlined. Black-filled primary + white-outlined secondary is the canonical pair.
|
|
25
|
+
- **Pure white paper** (`#fff` / `oklch(100% 0 0)`) — gate 8 is loosened here.
|
|
26
|
+
- **Zero-chroma neutrals** — gate 24 is loosened here. The Stripe / ElevenLabs school is monochrome by design.
|
|
27
|
+
- **Two-column hero with title-left + paragraph-right** — explicitly canonical for this genre.
|
|
28
|
+
- **Refined card surface** with very subtle border (`oklch(91% 0 0)`) and 8 px radius.
|
|
29
|
+
- **Large, tight-set displays** (`clamp(2.5rem, 5vw + 0.5rem, 4.75rem)`).
|
|
30
|
+
|
|
31
|
+
## What this genre disallows
|
|
32
|
+
|
|
33
|
+
- **Italic serif body** — modern-minimal stays sans top-to-bottom.
|
|
34
|
+
- **Hairline-everything** — borders are thin but visible, not the editorial 0.5 px hairline aesthetic.
|
|
35
|
+
- **Asymmetric prose columns** — modern-minimal aligns left, justified to a regular grid.
|
|
36
|
+
- **Drop caps, fleurons, ornament** — none of it.
|
|
37
|
+
- **Bouncy / overshoot easings** — gate 13 universal applies strictly here.
|
|
38
|
+
- **Gradient text** — gate 5 universal. Stays banned.
|
|
39
|
+
- **Glassmorphism** — banned.
|
|
40
|
+
|
|
41
|
+
## Voice fixtures
|
|
42
|
+
|
|
43
|
+
- *"Built to ship."*
|
|
44
|
+
- *"The platform that scales with you."*
|
|
45
|
+
- *"From idea to production in an afternoon."*
|
|
46
|
+
- *"Thirty thousand teams build with X."*
|
|
47
|
+
- *"One API. Every channel."*
|
|
48
|
+
|
|
49
|
+
## Nav and footer voice
|
|
50
|
+
|
|
51
|
+
- **Default nav:** N5 Floating pill — content-sized, detached from edges, blur backdrop, soft shadow. Vercel / Linear / Framer / Raycast vocabulary.
|
|
52
|
+
- **Acceptable also:** N1 Wordmark + 2 links (when destinations are genuinely minimal); N9 Edge-aligned minimal (when the brand earns the silence).
|
|
53
|
+
- **Default footer:** Ft2 Inline single line — wordmark + tagline + tiny credit, hairline rule above. Restrained.
|
|
54
|
+
- **Acceptable also:** Ft1 Mast-headed; Ft5 Statement (when the page wants a closing line).
|
|
55
|
+
- **Banned for modern-minimal:** N6 Newspaper masthead (editorial vocabulary); N7 Brutal slab (fights the restraint); Ft8 Marquee scroll (kinetic, wrong voice); Ft3 Index columns at full saturation (the AI-footer fingerprint — gate 52).
|
|
56
|
+
|
|
57
|
+
See [`component-cookbook.md`](../component-cookbook.md) § Navigation and § Footers for the full archetypes + code.
|
|
58
|
+
|
|
59
|
+
## Stamp signature
|
|
60
|
+
|
|
61
|
+
```css
|
|
62
|
+
/* Hallmark · genre: modern-minimal · macrostructure: <name> · theme: <name> · enrichment: <tier> · nav: <N#> · footer: <Ft#> */
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Reference register (for the LLM, not credited to anyone)
|
|
66
|
+
|
|
67
|
+
The aesthetic to match: confident sans display, clean white canvas, two-column hero, pill CTAs, mono accent. The user knows what this looks like when they see it. Do not name external sites in the output.
|