howone 0.1.29 → 0.1.31
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/package.json +1 -1
- package/templates/vite/.howone/skills/hallmark/SKILL.md +48 -42
- package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +12 -6
- package/templates/vite/.howone/skills/hallmark/references/assets.md +7 -0
- package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +19 -10
- package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +1 -1
- package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +1 -1
- package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +1 -1
- package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +1 -1
- package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +1 -1
- package/templates/vite/.howone/skills/hallmark/references/components/n11-mega-menu.md +40 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n12-banner-retract.md +34 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n13-inline-cmdk-pill.md +39 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n1b-saas-three-section.md +35 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +1 -1
- package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +2 -2
- package/templates/vite/.howone/skills/hallmark/references/copy.md +8 -8
- package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +2 -2
- package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +50 -12
- package/templates/vite/.howone/skills/hallmark/references/export-formats.md +1 -1
- package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +11 -7
- package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +6 -4
- package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +10 -6
- package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +15 -10
- package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +13 -12
- package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +2 -1
- package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +4 -3
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +3 -1
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +1 -1
- package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +1 -1
- package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +1 -3
- package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +12 -12
- package/templates/vite/.howone/skills/hallmark/references/responsive.md +8 -8
- package/templates/vite/.howone/skills/hallmark/references/slop-test.md +72 -85
- package/templates/vite/.howone/skills/hallmark/references/structure.md +9 -13
- package/templates/vite/.howone/skills/hallmark/references/study.md +40 -17
- package/templates/vite/.howone/skills/hallmark/references/themes/carnival.md +301 -0
- package/templates/vite/.howone/skills/hallmark/references/themes/cobalt.md +146 -0
- package/templates/vite/.howone/skills/hallmark/references/themes/hum.md +403 -0
- package/templates/vite/.howone/skills/hallmark/references/themes/lumen.md +478 -0
- package/templates/vite/.howone/skills/hallmark/references/typography.md +3 -3
- package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +1 -1
- package/templates/vite/.howone/skills/howone/01-architect/01-app-generation.md +132 -176
- package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/01-schema-design.md +3 -1
- package/templates/vite/.howone/skills/howone/{04-ai → 03-ai-capabilities}/01-ai-capability-architecture.md +6 -5
- package/templates/vite/.howone/skills/howone/{04-ai/04-service-capability-catalog.md → 03-ai-capabilities/03-service-capability-catalog.md} +15 -11
- package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/01-client-setup.md +6 -4
- package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/07-ai-action-calls.md +3 -3
- package/templates/vite/.howone/skills/howone/{04-ai/03-ai-sdk-handoff.md → 04-app-sdk/08-ai-manifest-handoff.md} +2 -2
- package/templates/vite/.howone/skills/howone/SKILL.md +98 -131
- package/templates/vite/.howone/skills/howone/agents/openai.yaml +3 -3
- package/templates/vite/AGENTS.md +2 -2
- package/templates/vite/.howone/skills/hallmark/LICENSE +0 -21
- package/templates/vite/.howone/skills/hallmark/README.md +0 -147
- package/templates/vite/.howone/skills/hallmark/ROADMAP.md +0 -201
- package/templates/vite/.howone/skills/hallmark/docs/recipes.md +0 -186
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-anya.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-bananastudio.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-hyperlane.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-najm.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-slow-pour.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-soroe.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-tally.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-wayfare.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/study-examples.md +0 -176
- package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +0 -364
- package/templates/vite/.howone/skills/hallmark/package.json +0 -36
- package/templates/vite/.howone/skills/hallmark/site/OG-hallmark.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/brief.md +0 -71
- package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +0 -64
- package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +0 -240
- package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +0 -65
- package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +0 -105
- package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +0 -250
- package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +0 -64
- package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +0 -131
- package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +0 -240
- package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +0 -67
- package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +0 -86
- package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +0 -262
- package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +0 -63
- package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +0 -167
- package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +0 -457
- package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +0 -65
- package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +0 -159
- package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +0 -288
- package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +0 -64
- package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +0 -146
- package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +0 -484
- package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +0 -64
- package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +0 -116
- package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +0 -354
- package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +0 -638
- package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +0 -515
- package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +0 -515
- package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +0 -608
- package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +0 -587
- package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +0 -157
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-example.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Podcast-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/after-quiet-hour.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/audit-example.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/before-quiet-hour.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/example-redesign-uractivation.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/study-example.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/uractivation-after-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/index.html +0 -77
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +0 -238
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +0 -110
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +0 -326
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +0 -134
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +0 -262
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +0 -30
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +0 -17
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +0 -56
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +0 -160
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +0 -29
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +0 -63
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +0 -72
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +0 -374
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +0 -52
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +0 -29
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +0 -61
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +0 -193
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +0 -66
- package/templates/vite/.howone/skills/hallmark/site/css/base.css +0 -194
- package/templates/vite/.howone/skills/hallmark/site/css/components.css +0 -4886
- package/templates/vite/.howone/skills/hallmark/site/css/sections.css +0 -2072
- package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +0 -1129
- package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +0 -475
- package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +0 -1584
- package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +0 -96
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +0 -344
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +0 -103
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +0 -1103
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +0 -83
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +0 -368
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +0 -133
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +0 -1062
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +0 -97
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +0 -84
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +0 -446
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +0 -1087
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +0 -101
- package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +0 -359
- package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +0 -1168
- package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +0 -81
- package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +0 -5
- package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +0 -5
- package/templates/vite/.howone/skills/hallmark/site/index.html +0 -1043
- package/templates/vite/.howone/skills/hallmark/site/js/main.js +0 -1175
- package/templates/vite/.howone/skills/hallmark/vercel.json +0 -6
- package/templates/vite/.howone/skills/impeccable/SKILL.md +0 -168
- package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +0 -101
- package/templates/vite/.howone/skills/impeccable/reference/adapt.md +0 -190
- package/templates/vite/.howone/skills/impeccable/reference/animate.md +0 -175
- package/templates/vite/.howone/skills/impeccable/reference/audit.md +0 -133
- package/templates/vite/.howone/skills/impeccable/reference/bolder.md +0 -113
- package/templates/vite/.howone/skills/impeccable/reference/brand.md +0 -118
- package/templates/vite/.howone/skills/impeccable/reference/clarify.md +0 -174
- package/templates/vite/.howone/skills/impeccable/reference/codex.md +0 -105
- package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +0 -106
- package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +0 -105
- package/templates/vite/.howone/skills/impeccable/reference/colorize.md +0 -154
- package/templates/vite/.howone/skills/impeccable/reference/craft.md +0 -123
- package/templates/vite/.howone/skills/impeccable/reference/critique.md +0 -273
- package/templates/vite/.howone/skills/impeccable/reference/delight.md +0 -302
- package/templates/vite/.howone/skills/impeccable/reference/distill.md +0 -111
- package/templates/vite/.howone/skills/impeccable/reference/document.md +0 -427
- package/templates/vite/.howone/skills/impeccable/reference/extract.md +0 -69
- package/templates/vite/.howone/skills/impeccable/reference/harden.md +0 -347
- package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +0 -234
- package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +0 -195
- package/templates/vite/.howone/skills/impeccable/reference/layout.md +0 -141
- package/templates/vite/.howone/skills/impeccable/reference/live.md +0 -622
- package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +0 -109
- package/templates/vite/.howone/skills/impeccable/reference/onboard.md +0 -234
- package/templates/vite/.howone/skills/impeccable/reference/optimize.md +0 -258
- package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +0 -130
- package/templates/vite/.howone/skills/impeccable/reference/personas.md +0 -179
- package/templates/vite/.howone/skills/impeccable/reference/polish.md +0 -242
- package/templates/vite/.howone/skills/impeccable/reference/product.md +0 -62
- package/templates/vite/.howone/skills/impeccable/reference/quieter.md +0 -99
- package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +0 -114
- package/templates/vite/.howone/skills/impeccable/reference/shape.md +0 -165
- package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +0 -100
- package/templates/vite/.howone/skills/impeccable/reference/teach.md +0 -156
- package/templates/vite/.howone/skills/impeccable/reference/typeset.md +0 -124
- package/templates/vite/.howone/skills/impeccable/reference/typography.md +0 -159
- package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +0 -107
- package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +0 -284
- package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +0 -94
- package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +0 -242
- package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +0 -820
- package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +0 -198
- package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +0 -21
- package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +0 -110
- package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +0 -69
- package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +0 -595
- package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +0 -123
- package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +0 -4860
- package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +0 -75
- package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +0 -18
- package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +0 -446
- package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +0 -200
- package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +0 -48
- package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +0 -838
- package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +0 -254
- package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +0 -47
- package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +0 -632
- package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +0 -247
- package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +0 -141
- package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +0 -14
- package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +0 -214
- /package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/02-schema-operations.md +0 -0
- /package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/03-data-access-patterns.md +0 -0
- /package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/04-query-dsl-and-responses.md +0 -0
- /package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/05-ai-persistence-patterns.md +0 -0
- /package/templates/vite/.howone/skills/howone/{04-ai → 03-ai-capabilities}/02-workflow-contract-rules.md +0 -0
- /package/templates/vite/.howone/skills/howone/{04-ai/05-workflow-operations.md → 03-ai-capabilities/04-workflow-operations.md} +0 -0
- /package/templates/vite/.howone/skills/howone/{04-ai/06-ai-feature-playbooks.md → 03-ai-capabilities/05-ai-feature-playbooks.md} +0 -0
- /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/02-entity-operations.md +0 -0
- /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/03-auth.md +0 -0
- /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/04-react-integration.md +0 -0
- /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/05-file-upload.md +0 -0
- /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/06-raw-http.md +0 -0
- /package/templates/vite/.howone/skills/howone/{03-sdk/08-extension-boundaries.md → 04-app-sdk/09-extension-boundaries.md} +0 -0
- /package/templates/vite/.howone/skills/howone/{03-sdk/09-workflow-execute-sse.md → 04-app-sdk/10-workflow-execute-sse.md} +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
### N12 · Announcement banner + retracting nav
|
|
2
|
+
A coloured promo **banner** stacked above one real nav. On scroll-down the banner slides up and retracts, leaving a single clean nav docked to the top; on scroll-up it slides back. A dismiss × removes the banner for good (its height zeroes so no gap is left). Apple-style coupled bars, but the top tier is a *banner*, not a second nav — the colour contrast is what stops it reading as "two navs".
|
|
3
|
+
*Use when:* there's a genuine, time-bound announcement (a launch, a sale, free shipping) worth a persistent strip, over a product/marketing page. Great for stat-led or commerce pages.
|
|
4
|
+
*Don't confuse with:* a static announcement bar that never moves (fine, but not N12); N1b (single bar, no banner).
|
|
5
|
+
|
|
6
|
+
```html
|
|
7
|
+
<header class="nav" id="nav">
|
|
8
|
+
<div class="nav__banner" id="banner">
|
|
9
|
+
<p class="nav__banner-text"><span class="nav__banner-spark"></span> New — <b>shared habits</b>. <a class="nav__banner-link">Try it →</a></p>
|
|
10
|
+
<button class="nav__banner-x" id="banner-x" aria-label="Dismiss"><span></span></button>
|
|
11
|
+
</div>
|
|
12
|
+
<div class="nav__bar"><div class="nav__bar-inner">
|
|
13
|
+
<a class="nav__brand">Tally</a>
|
|
14
|
+
<nav class="nav__links">…</nav>
|
|
15
|
+
<a class="btn btn--accent">Start</a>
|
|
16
|
+
</div></div>
|
|
17
|
+
</header>
|
|
18
|
+
```
|
|
19
|
+
```css
|
|
20
|
+
:root { --banner-h: 42px; --bar-h: 64px; }
|
|
21
|
+
.nav { position: fixed; inset: 0 0 auto; z-index: 500; transform: translateY(0); transition: transform 320ms var(--ease-out); }
|
|
22
|
+
.nav.is-compact { transform: translateY(calc(var(--banner-h) * -1)); } /* banner hides, bar docks to top */
|
|
23
|
+
.nav.is-dismissed { transform: none; }
|
|
24
|
+
.nav.is-dismissed .nav__banner { display: none; }
|
|
25
|
+
.nav__banner { height: var(--banner-h); display: flex; align-items: center; justify-content: center;
|
|
26
|
+
background: linear-gradient(100deg, var(--color-accent), var(--color-accent-deep)); color: var(--color-paper); }
|
|
27
|
+
/* content clears both at rest; zero --banner-h on dismiss so calc() reflows with no gap */
|
|
28
|
+
.demo-hero { padding-top: calc(var(--banner-h) + var(--bar-h) + 4rem); }
|
|
29
|
+
```
|
|
30
|
+
*JS:* track scroll direction — past ~48px going down → `.is-compact`; going up → remove it; near top → always show. Dismiss × sets `--banner-h: 0px` (via `documentElement.style`) and adds `.is-dismissed`.
|
|
31
|
+
|
|
32
|
+
**Knobs** — *Banner fill:* solid accent · gradient (default) · tint+ink · *Dismiss:* yes (default) · none · *Bar scroll:* sticky (default) · also-frosts · *Banner content:* promo · status · countdown.
|
|
33
|
+
*Anti-pattern:* never make the top tier a second set of nav links — that's the "two nav bars" smell the banner exists to avoid. Keep the banner one line, one link, one dismiss. Don't animate banner height directly (janky); translate the whole `.nav` and zero the height only on dismiss.
|
|
34
|
+
*Mobile:* banner text truncates / drops the leading glyph; nav links collapse; the Buy/primary CTA stays.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
### N13 · Inline ⌘K search pill
|
|
2
|
+
A **visible** search pill sits inline in the bar — placeholder text plus a `⌘K` kbd hint — alongside (not replacing) the links. Click it, or press ⌘K / Ctrl K, to open a spotlight modal with grouped, keyboard-navigable results. The opposite of N4 (which *hides* nav behind the shortcut): here the affordance is on the surface for newcomers, with the shortcut for power users. Tailwind, Linear, Raycast, docs sites.
|
|
3
|
+
*Use when:* the product is search-heavy or docs-heavy and search is a primary action (dev tools, music/library apps, large content sites).
|
|
4
|
+
*Don't confuse with:* N4 (no visible nav, ⌘K only); a plain search icon that just focuses an input in place.
|
|
5
|
+
|
|
6
|
+
```html
|
|
7
|
+
<header class="nav" id="nav"><div class="nav__inner">
|
|
8
|
+
<a class="nav__brand">Crank</a>
|
|
9
|
+
<button class="searchpill" id="searchpill" aria-label="Search (⌘K)">
|
|
10
|
+
<span class="searchpill__ico"></span><span class="searchpill__text">Search docs…</span>
|
|
11
|
+
<span class="searchpill__kbd"><kbd>⌘</kbd><kbd>K</kbd></span>
|
|
12
|
+
</button>
|
|
13
|
+
<nav class="nav__right"><a class="nav__link">Docs</a><a class="btn btn--accent">Start</a></nav>
|
|
14
|
+
</div></header>
|
|
15
|
+
<div class="cmdk" id="cmdk" aria-hidden="true">
|
|
16
|
+
<div class="cmdk__backdrop" data-close></div>
|
|
17
|
+
<div class="cmdk__panel" role="dialog" aria-modal="true">
|
|
18
|
+
<div class="cmdk__field"><span class="cmdk__field-ico"></span><input id="cmdk-input" placeholder="Search docs…"><kbd>esc</kbd></div>
|
|
19
|
+
<div class="cmdk__results"><p class="cmdk__group">Suggested</p><button class="cmdk__item is-active">…</button></div>
|
|
20
|
+
<div class="cmdk__foot"><span><kbd>↑</kbd><kbd>↓</kbd> navigate</span><span><kbd>↵</kbd> open</span><span><kbd>esc</kbd> close</span></div>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
```
|
|
24
|
+
```css
|
|
25
|
+
.searchpill { display: flex; align-items: center; gap: 0.6rem; height: 40px; padding: 0 0.55rem 0 0.85rem;
|
|
26
|
+
background: var(--color-paper-2); border: 1px solid var(--color-rule); border-radius: 999px; color: var(--color-muted);
|
|
27
|
+
transition: border-color 200ms, box-shadow 200ms; }
|
|
28
|
+
.searchpill:hover { border-color: var(--color-rule-2); box-shadow: 0 4px 16px -10px oklch(0% 0 0 / 0.3); }
|
|
29
|
+
.cmdk { position: fixed; inset: 0; z-index: 700; opacity: 0; visibility: hidden; transition: opacity 200ms, visibility 200ms; }
|
|
30
|
+
.cmdk.is-open { opacity: 1; visibility: visible; }
|
|
31
|
+
.cmdk__panel { position: absolute; top: 14vh; left: 50%; transform: translateX(-50%) translateY(-8px) scale(0.98);
|
|
32
|
+
width: min(560px, calc(100vw - 2rem)); transition: transform 240ms var(--ease-spring); }
|
|
33
|
+
.cmdk.is-open .cmdk__panel { transform: translateX(-50%) translateY(0) scale(1); }
|
|
34
|
+
```
|
|
35
|
+
*JS:* ⌘K / Ctrl K toggles, Esc closes, backdrop-click closes, ↑/↓ move the active item, Enter selects, focus the input on open and lock body scroll.
|
|
36
|
+
|
|
37
|
+
**Knobs** — *Pill placement:* centred (default) · right-of-brand · *Result groups:* flat · grouped (default) · *Footer hints:* shown (default) · hidden · *Open trigger:* pill+⌘K (default) · ⌘K only (→ that's N4, not N13).
|
|
38
|
+
*Anti-pattern:* don't fake the modal with a `<div>` that traps no focus and ignores Esc — if you ship the pill you ship the keyboard model. The pill must look like search (icon + placeholder), not a generic button.
|
|
39
|
+
*Mobile:* the pill collapses to a search icon; the modal goes full-height sheet.
|
package/templates/vite/.howone/skills/hallmark/references/components/n1b-saas-three-section.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
### N1b · Canonical SaaS three-section
|
|
2
|
+
Wordmark hard-left · a centred cluster of 4–6 links (some opening hover dropdowns) · a sign-in text link + filled CTA hard-right. The dominant marketing-nav of 2024–26 (Stripe, Linear, Vercel, Figma, Notion, PostHog). The structural opposite of N1's *minimal* two-link variant — this one is dense and balanced.
|
|
3
|
+
*Use when:* a SaaS / product / dev-tool page with several real destinations and a clear primary action. The default reach for modern-minimal and (Hum-styled) playful product pages.
|
|
4
|
+
*Don't confuse with:* N1a (wordmark + 2 links, no centre cluster); N5 (detached pill); N11 (mega-menu panels, not small dropdowns).
|
|
5
|
+
|
|
6
|
+
```html
|
|
7
|
+
<header class="nav"><div class="nav__inner">
|
|
8
|
+
<a class="nav__brand">Conduit</a>
|
|
9
|
+
<nav class="nav__center">
|
|
10
|
+
<div class="nav__item nav__item--menu">
|
|
11
|
+
<button class="nav__link" aria-expanded="false">Product <span class="nav__caret"></span></button>
|
|
12
|
+
<div class="nav__dropdown"><a class="nav__dropitem"><b>Gateway</b><i>one endpoint</i></a></div>
|
|
13
|
+
</div>
|
|
14
|
+
<a class="nav__link">Docs</a><a class="nav__link">Pricing</a>
|
|
15
|
+
</nav>
|
|
16
|
+
<div class="nav__right"><a class="btn btn--text">Sign in</a><a class="btn btn--accent">Start</a></div>
|
|
17
|
+
</div></header>
|
|
18
|
+
```
|
|
19
|
+
```css
|
|
20
|
+
.nav { position: fixed; inset: 0 0 auto; z-index: 500; background: transparent; border-bottom: 1px solid transparent;
|
|
21
|
+
transition: background 240ms, border-color 240ms, box-shadow 240ms; }
|
|
22
|
+
.nav.is-scrolled { background: color-mix(in oklch, var(--color-paper) 72%, transparent);
|
|
23
|
+
backdrop-filter: blur(18px) saturate(160%); border-bottom-color: var(--color-rule); box-shadow: 0 8px 28px -18px oklch(0% 0 0 / 0.4); }
|
|
24
|
+
.nav__inner { max-width: var(--page-max); margin: 0 auto; padding-inline: var(--page-gutter); height: 64px;
|
|
25
|
+
display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; }
|
|
26
|
+
.nav__brand { justify-self: start; } .nav__center { justify-self: center; display: flex; gap: 0.35rem; } .nav__right { justify-self: end; }
|
|
27
|
+
.nav__dropdown { position: absolute; opacity: 0; visibility: hidden; transform: translateY(-6px) scale(0.98);
|
|
28
|
+
transition: opacity 200ms, transform 220ms var(--ease-spring), visibility 200ms; }
|
|
29
|
+
.nav__item--menu:hover .nav__dropdown, .nav__item--menu:focus-within .nav__dropdown { opacity: 1; visibility: visible; transform: none; }
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Knobs** — *Centre links:* 3 · 4 · 5–6 · *Dropdowns:* none · 1 · 2 · *Scroll state:* frost-on-scroll (default) · always-solid · transparent-fixed · *CTA pair:* sign-in + fill · fill only.
|
|
33
|
+
*Scroll behaviour (default):* transparent at rest over the hero, frosts (blur backdrop + hairline border + soft shadow) past ~24px, and tightens height ~8px. Always rAF-throttle the scroll handler.
|
|
34
|
+
*Anti-pattern:* don't let the centre cluster collide with brand/CTA — if it can't sit centred with breathing room, drop to 3 links or route to N1a. Never ship a dropdown that opens on click only with no hover/focus affordance.
|
|
35
|
+
*Mobile:* hide `.nav__center` below ~900px; brand + CTA (or hamburger) remain.
|
package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
### N9 · Edge-aligned minimal
|
|
2
2
|
Wordmark hard-left, single CTA hard-right, vast empty space between, no link row at all. The *absence* is the design — Apple product pages, Carl Hauser, luxury sites.
|
|
3
|
-
*Use when:* the page is luxury / quiet / Atelier /
|
|
3
|
+
*Use when:* the page is luxury / quiet / Atelier / Garden and the brand earns the silence.
|
|
4
4
|
*Don't confuse with:* N1 Wordmark + 2 links (which fills the middle).
|
|
5
5
|
|
|
6
6
|
```html
|
|
@@ -11,9 +11,9 @@ Heading remains in viewport while content scrolls beneath. Orientation aid.
|
|
|
11
11
|
```
|
|
12
12
|
```css
|
|
13
13
|
/* If the page has a sticky top nav, offset by its height so the sticky
|
|
14
|
-
head docks BENEATH it instead of bleeding over (slop-test gate
|
|
14
|
+
head docks BENEATH it instead of bleeding over (slop-test gate 56).
|
|
15
15
|
Use --z-sticky (in-page) so the nav's --z-sticky-nav out-paints it. */
|
|
16
16
|
.head-sticky { position: sticky; top: var(--banner-height, 0px); background: var(--color-paper); padding-block: var(--space-sm); border-bottom: 1px solid var(--color-ink); z-index: var(--z-sticky); }
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
**Sticky pairing rule:** if the page emits a sticky `<header>` / `<nav>` / `.banner` (anything with `position: sticky; top: 0`), you MUST also declare `--banner-height` (a px value matching the nav's height) and `--z-sticky-nav` (≥ 1 above `--z-sticky`) in `tokens.css`. The S3 recipe above pulls both. Without those tokens the section head paints over the nav during scroll — see slop-test gate
|
|
19
|
+
**Sticky pairing rule:** if the page emits a sticky `<header>` / `<nav>` / `.banner` (anything with `position: sticky; top: 0`), you MUST also declare `--banner-height` (a px value matching the nav's height) and `--z-sticky-nav` (≥ 1 above `--z-sticky`) in `tokens.css`. The S3 recipe above pulls both. Without those tokens the section head paints over the nav during scroll — see slop-test gate 56.
|
|
@@ -105,7 +105,7 @@ Three voice patterns: *poetic restraint*, *passion via enumeration*, *vulnerabil
|
|
|
105
105
|
- *"Design engineer creating software that makes people feel something."* — rauno.me — emotional outcome over feature list; "feel something" avoids genre cliché
|
|
106
106
|
- *"All I want to do is build websites. Typography, motion design, copywriting, performance — the web is an endless medium of opportunity."* — paco.me — passion via enumeration; vulnerability ("scratched the surface")
|
|
107
107
|
- *"I craft UI demos that explore the power of the web and help others sharpen their skills."* — jhey.dev — names the verb (*craft*), names the audience (*others*)
|
|
108
|
-
- *"Soft, but exact."* — Hallmark
|
|
108
|
+
- *"Soft, but exact."* — Hallmark Hum — two short adjectives, one comma, full stop
|
|
109
109
|
- *"This page is soft because the surface should be soft. The rules underneath are not."* — pairs claim with refusal
|
|
110
110
|
|
|
111
111
|
### Technical
|
|
@@ -127,9 +127,9 @@ Three voice patterns: *heritage with specifics*, *refusal as sophistication*, *n
|
|
|
127
127
|
|
|
128
128
|
- *"The world's most acclaimed creative collective, where 23 partners work independently and collaboratively to shape the future of design."* — pentagram.com — heritage (implied longevity), named scale (23 partners)
|
|
129
129
|
- *"By appointment."* — atelier-style — refusal as gatekeeping
|
|
130
|
-
- *"A
|
|
131
|
-
- *"A page should arrive like a person — composed, deliberate, in good clothes."* — Hallmark
|
|
132
|
-
- *"With pleasure, you are most welcome."* — Hallmark
|
|
130
|
+
- *"A study in the senses."* — Hallmark Atelier — single nominal phrase, comma-free
|
|
131
|
+
- *"A page should arrive like a person — composed, deliberate, in good clothes."* — Hallmark Atelier — analogy treats the page as social
|
|
132
|
+
- *"With pleasure, you are most welcome."* — Hallmark Editorial salutation — formal address
|
|
133
133
|
- *"Restraint, repeated, becomes a signature."* — Hallmark Atelier — three commas, four words, philosophical
|
|
134
134
|
- *"A studied hand."* — three words; the determiner does the work
|
|
135
135
|
- *"A small, opinionated craftsmanship engine that argues with your AI assistant on your behalf — and wins."* — Hallmark Atelier — names the role precisely, embraces the conflict
|
|
@@ -151,12 +151,12 @@ Three voice patterns: *analogy via pop-culture*, *food/sensory metaphor*, *antic
|
|
|
151
151
|
|
|
152
152
|
Three voice patterns: *extreme abbreviation*, *principle as opening*, *refusal of marketing language*.
|
|
153
153
|
|
|
154
|
-
- *"Hello."* — Hallmark
|
|
155
|
-
- *"This is a page that doesn't try."* —
|
|
154
|
+
- *"Hello."* — Hallmark Coral salutation — one word; the period is the design
|
|
155
|
+
- *"This is a page that doesn't try."* — Coral — declares the position openly
|
|
156
156
|
- *"Things Become Other Things."* — craigmod.com — three words; treats brand as essay title
|
|
157
157
|
- *"Lightness above weightiness, elevate everyone you encounter."* — craigmod.com — principle-first positioning
|
|
158
|
-
- *"A quiet skill."* — Hallmark
|
|
159
|
-
- *"Software can be soft and exact at once. That's the trick."* — Hallmark
|
|
158
|
+
- *"A quiet skill."* — Hallmark Coral — three words; the article is doing work
|
|
159
|
+
- *"Software can be soft and exact at once. That's the trick."* — Hallmark Hum — names the contradiction, names the resolution
|
|
160
160
|
- *"One HTML file."* — Anya (test 06) footer — three words; the count is the boast
|
|
161
161
|
- *"This page doesn't move."* — names the design decision openly
|
|
162
162
|
|
|
@@ -350,7 +350,7 @@ The Lottie Tell, version 2026: a generic LottieFiles pull where pure CSS would h
|
|
|
350
350
|
**Brief:** "Build a landing page for a small bakery in Lisbon."
|
|
351
351
|
|
|
352
352
|
**Step 2 (macrostructure):** Long Document — the bakery is a story-led brand, not a SaaS product.
|
|
353
|
-
**Step 3 (theme):**
|
|
353
|
+
**Step 3 (theme):** Atelier — warm-paper, prose-led, intimate.
|
|
354
354
|
**Step 4 (enrichment):** E5 Custom Illustration Centerpiece. Tier B (hand-built SVG).
|
|
355
355
|
|
|
356
356
|
**The output:**
|
|
@@ -362,7 +362,7 @@ A 60-line SVG of a single loaf, three paths (crust + crumb + scoring marks), pos
|
|
|
362
362
|
* H5 hero: Letter (intimate salutation + 2-paragraph body)
|
|
363
363
|
* enrichment: E5 Custom Illustration · craft: tier-B SVG (60 lines)
|
|
364
364
|
* animation: @property --rise (6s, alternate) + stroke-dasharray draw-on
|
|
365
|
-
* theme:
|
|
365
|
+
* theme: Atelier · accent: warm-amber ~3% · studied: no
|
|
366
366
|
*/
|
|
367
367
|
```
|
|
368
368
|
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
# Custom theme — protocol
|
|
2
2
|
|
|
3
|
-
Loaded only when the user has opted into the **custom** theme route in Step 1 of the Design flow. Custom
|
|
3
|
+
Loaded only when the user has opted into the **custom** theme route in Step 1 of the Design flow. Custom is **made-to-measure for one brief**, written inline into the page's `:root`, never a permanent catalog entry. It spans a **spectrum of depth**: at its lightest, a complete OKLCH palette + free-font pairing tuned to the brief while keeping Hallmark's structures (the *combination* is per-brief); at its fullest — **bespoke** — the page's *structure and composition* are designed from first principles too, bound to no catalog theme, genre, or macrostructure. One route, chosen depth.
|
|
4
4
|
|
|
5
|
-
**The freedom is the combination,
|
|
5
|
+
**The freedom is the combination — and, at the bespoke depth, the whole structure — but never the floor.** Every constraint in [`color.md`](color.md), [`typography.md`](typography.md), and [`anti-patterns.md`](anti-patterns.md) still applies, and **every slop-test gate fires unchanged at every depth** — the gates are the floor that never moves. The Step 5 preview surfaces the palette + pairing (plus the bespoke structure, when there is one) in plain text *before* any code is emitted, so the user can redirect.
|
|
6
6
|
|
|
7
|
-
## Two
|
|
7
|
+
## Two routes, plain English
|
|
8
8
|
|
|
9
|
-
- **catalog** — the named-theme catalogue. Hallmark's
|
|
10
|
-
- **custom** — made-to-measure
|
|
9
|
+
- **catalog** — the named-theme catalogue. Hallmark's 20 themes (Specimen, Midnight, Brutal, Garden, Atelier, Newsprint, Terminal, Manifesto, Almanac, Sport, Studio, Riso, Bloom, Coral, Cobalt, Aurora, Editorial, Carnival, Lumen, Hum). Each one is a fixed combination of paper-band, display-style, and accent-hue. The rotation rule cycles through them so two consecutive runs don't read alike. **This is the default.** Most briefs use it.
|
|
10
|
+
- **custom** — made-to-measure, at the depth the brief needs:
|
|
11
|
+
- **Tuned** — a one-off OKLCH palette + font pairing built for one brief, *keeping* Hallmark's structures, archetypes, and macrostructures. The rules (paper L bands, accent chroma caps, font ban list, all slop-test gates) still apply; only the *combination* is per-brief.
|
|
12
|
+
- **Bespoke** — when the brief's *structure itself* is the ask, custom goes further and designs the whole page from first principles — its own palette, type, **and** composition — dropping the catalog's structures too, floored only by the universal slop-test gates. Same route, deeper end. See **§ Bespoke depth** below.
|
|
13
|
+
|
|
14
|
+
Either way, custom does **not** extend the catalog with a permanent theme.
|
|
11
15
|
|
|
12
16
|
## When to surface this fork — Step 1 trigger signals
|
|
13
17
|
|
|
@@ -15,12 +19,13 @@ Hallmark must **not** offer catalog-vs-custom on every prompt. That's friction,
|
|
|
15
19
|
|
|
16
20
|
1. **Explicit ask** — the user types `custom`, "custom theme", "tailored to our brand", "make it ours", "something unique", "play around with the colors and fonts", "I want my own palette".
|
|
17
21
|
2. **Named brand colour** — the user gives a specific anchor colour as a hex / OKLCH / brand name. Example: "use our terracotta", "the brand red is hex #c0392b", "anchor on sea-blue".
|
|
18
|
-
3. **Multi-attribute aesthetic the catalog can't carry** — three or more vibe words pointing at a specific, off-catalog feel. Examples: "moss, lichen, soft pink, herbal" / "sun-drenched, market-day, carbon-black" / "late-night, neon, brutalist deli". Compare against the
|
|
22
|
+
3. **Multi-attribute aesthetic the catalog can't carry** — three or more vibe words pointing at a specific, off-catalog feel. Examples: "moss, lichen, soft pink, herbal" / "sun-drenched, market-day, carbon-black" / "late-night, neon, brutalist deli". Compare against the 20 catalog themes; if no single catalog theme is within one axis-step of the vibe, fire the fork. **One adjective ("warm", "technical", "playful") is not a signal — that's a tone, the catalog already carries it.**
|
|
19
23
|
4. **Brand-mood reference attached** — the user attaches a colour swatch, a moodboard, a Pantone chip. (If they attach a *page* screenshot, route to `study` instead; custom is for brand colour / mood, study is for design DNA.)
|
|
24
|
+
5. **A singular structural vision** (→ the *bespoke* depth) — the brief names a *structure or composition*, not just a palette/mood: "no theme / from scratch / fully bespoke / ignore the catalog / art-direct it", or a one-of-a-kind page-shape the macrostructure catalog has no entry for (a scroll-assembling poem, a ticket-shaped page, an interactive periodic table). Routes to custom's **bespoke depth** (§ Bespoke depth below). A palette or mood that's merely off-catalog is *tuned* custom, not bespoke.
|
|
20
25
|
|
|
21
26
|
If any signal fires, ask one short follow-up before picking a theme:
|
|
22
27
|
|
|
23
|
-
> *"This brief reads like a custom palette would fit better than the
|
|
28
|
+
> *"This brief reads like a custom palette would fit better than the 20 named themes. Want me to construct a custom OKLCH palette + free-font pairing tuned to <one-line summary of the vibe>, or stay on the catalog for variety + speed?"*
|
|
24
29
|
|
|
25
30
|
Wait for the user to answer. If they say custom (or yes / go) → continue this protocol from § A. If they say catalog (or no / stay catalog) → drop the fork and proceed with the catalog route. **Default to catalog** — silence routes to catalog, not custom.
|
|
26
31
|
|
|
@@ -42,6 +47,39 @@ If the user gives just two or three words ("sun-drenched"), proceed; the recipe
|
|
|
42
47
|
|
|
43
48
|
---
|
|
44
49
|
|
|
50
|
+
## § Bespoke depth — custom that designs the whole page
|
|
51
|
+
|
|
52
|
+
Most custom runs are *tuned* (a palette + pairing on Hallmark's existing structures). **Bespoke** is the deep end, fired by signal 5: the brief's *structure itself* is the ask and no catalog shape fits. At this depth custom designs the page from first principles — palette, type, **and** composition — and the only thing it inherits is the floor.
|
|
53
|
+
|
|
54
|
+
Confirm the route once (same discipline as any custom — default to catalog on silence), then take **one** input: *"the direction in a sentence or two — what should this page feel like and do that an off-the-shelf theme wouldn't?"*
|
|
55
|
+
|
|
56
|
+
**It drops** (only at this depth):
|
|
57
|
+
- the named-theme tokens — write the palette inline for this page only (§ B still governs *how*);
|
|
58
|
+
- the genre cluster routing — no editorial / atmospheric / modern-minimal / playful archetype defaults;
|
|
59
|
+
- the fixed macrostructure + archetype catalog — compose the page's structure for the brief; a novel hero, nav, or section is *encouraged* when it serves the idea;
|
|
60
|
+
- the diversification rotation — bespoke is a one-off (like studied-DNA), though it shouldn't clone a recent bespoke run.
|
|
61
|
+
|
|
62
|
+
**It keeps** — the non-negotiable floor, identical to tuned custom:
|
|
63
|
+
- **every universal slop-test gate** ([`slop-test.md`](slop-test.md)) — the guarantee that survives the freedom;
|
|
64
|
+
- accessibility & contrast (APCA / WCAG), a visible `:focus-visible`, `prefers-reduced-motion`, semantic landmarks, alt text;
|
|
65
|
+
- the **font ban-list** (Gate 1) and free-baseline-only discipline (§ C);
|
|
66
|
+
- **OKLCH palette discipline** (§ B) — tinted neutrals, no pure `#000`/`#fff`, accent kept to a signal unless the concept earns more;
|
|
67
|
+
- one orchestrated motion; the Step 5 preview before code; the Step 6 stamp + log.
|
|
68
|
+
|
|
69
|
+
**Process:** read the brief + the one-line direction → design the *system and the one central move* (the idea that makes it not-a-template) → run the gates *as you compose* → surface the preview (palette, type, structure, central idea) → build, stamp, log. Bespoke is **more** design judgment, not less — a bespoke page that reads generic, or trips a gate, has failed; re-design.
|
|
70
|
+
|
|
71
|
+
**Stamp (bespoke runs):**
|
|
72
|
+
```css
|
|
73
|
+
/* Hallmark · route: custom (bespoke) · structure: <one-line shape> · idea: "<central move>"
|
|
74
|
+
* paper: oklch(...) · accent: oklch(...) · display: <font> · body: <font>
|
|
75
|
+
* axes: <paper-band> / <display-style> / <accent-hue> · gates: all-pass · studied: no
|
|
76
|
+
*/
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Bespoke is rare.** Most briefs are catalog; some are tuned custom; few are bespoke. Reaching for bespoke on a vanilla brief is over-reach — route to catalog.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
45
83
|
## § B · Palette construction
|
|
46
84
|
|
|
47
85
|
Build the palette in this order. Each step cites the rule it's obeying — do not restate the rule, just apply it.
|
|
@@ -95,9 +133,9 @@ These are not arbitrary. The L-step gives the palette **typographic depth** with
|
|
|
95
133
|
|
|
96
134
|
### B.7 · Verification
|
|
97
135
|
|
|
98
|
-
- **Gate
|
|
99
|
-
- **Gate
|
|
100
|
-
- **Gate
|
|
136
|
+
- **Gate 7** (no pure #000 / #fff base): paper and ink both have chroma > 0. Pass.
|
|
137
|
+
- **Gate 22** (no zero-chroma neutrals): every grey has chroma ≥ 0.005. Pass.
|
|
138
|
+
- **Gate 23** (accent ≤ 5 % footprint): plan the accent's role on the page (active state, one wordmark dot, one CTA fill). Don't carpet a section in accent.
|
|
101
139
|
|
|
102
140
|
---
|
|
103
141
|
|
|
@@ -213,7 +251,7 @@ Custom runs extend the existing schema with a `theme_axes` field and an optional
|
|
|
213
251
|
"brief": "Coffeebox · subscription" }
|
|
214
252
|
```
|
|
215
253
|
|
|
216
|
-
Catalog entries continue to record `theme: <name>` and skip `theme_axes` (the catalog's axes are looked up from [`tokens.css`](
|
|
254
|
+
Catalog entries continue to record `theme: <name>` and skip `theme_axes` (the catalog's axes are looked up from [`tokens.css`](../../../site/css/tokens.css)). Step 2.5 logic uses the same diversification check on both — for catalog entries it reads the axes from tokens.css; for custom entries it reads them from the entry.
|
|
217
255
|
|
|
218
256
|
When rotating, **a custom run that follows another custom run must differ on at least one axis from the previous custom** — same rule as catalog-vs-catalog. A custom run that follows a catalog run must differ on at least one axis from the catalog's axes. The diversification rule is theme-route-blind.
|
|
219
257
|
|
|
@@ -321,7 +359,7 @@ The vibe names two hues: *moss* (greenish, ~140°) and *soft pink* (warm, ~350°
|
|
|
321
359
|
## What custom does **not** do (worth restating)
|
|
322
360
|
|
|
323
361
|
1. **Does not invent themes that ignore the rules.** Every paper L band, accent chroma cap, neutral-tinting requirement, font ban, and slop-test gate carries forward. The freedom is the *combination* — not the rules.
|
|
324
|
-
2. **Does not save themes for reuse.** A custom run is per-output. The skill does not write back to [`tokens.css`](
|
|
362
|
+
2. **Does not save themes for reuse.** A custom run is per-output. The skill does not write back to [`tokens.css`](../../../site/css/tokens.css). If the user wants a permanent theme, they paste the custom palette into tokens.css themselves and name it.
|
|
325
363
|
3. **Does not ask multiple follow-up questions.** One vibe answer (+ optional anchor) is enough. The audience/use/tone from Step 1 plus the brief plus the macrostructure pick already give the model 80 % of the signal.
|
|
326
364
|
4. **Does not relax the diversification rule.** Custom entries declare their three axes the same way catalog entries do; the rotation rule fires on both, theme-route-blind.
|
|
327
365
|
5. **Does not bypass the Step 5 preview.** The custom palette + pairing surface in plain text *before* any code is emitted, so the user can redirect early.
|
|
@@ -116,7 +116,7 @@ Or, if the project uses a CSS bundler / framework that doesn't honour bare `@imp
|
|
|
116
116
|
}
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
-
**Worked example — modern-minimal theme (
|
|
119
|
+
**Worked example — modern-minimal theme (austere, pure-white):**
|
|
120
120
|
|
|
121
121
|
```css
|
|
122
122
|
:root {
|
|
@@ -8,33 +8,35 @@ Brief mentions any of: *AI tool, generative, music, video, image, voice, late-ni
|
|
|
8
8
|
|
|
9
9
|
## Themes that belong
|
|
10
10
|
|
|
11
|
-
`Bloom` (canonical), `Midnight`, `Terminal`.
|
|
11
|
+
`Bloom` (canonical light-paper), `Midnight`, `Terminal`, `Aurora`, `Lumen`. Five themes; the rotation walks them when atmospheric is active.
|
|
12
|
+
|
|
13
|
+
`Lumen` is the premium AI-tool register — Modal / Anthropic / Together / ElevenLabs / Cluely / Adept / Granola. One focal CSS artefact + classical italic-serif headline + mono technical eyebrow. **Two palette drops** (Night Foundry — dark amber-gold, emits; Day Foundry — light indigo, refracts). The only atmospheric theme with a serif display and the only one whose canvas treatment is one *built* artefact rather than two diffuse blooms.
|
|
12
14
|
|
|
13
15
|
## Voice
|
|
14
16
|
|
|
15
17
|
- **Display** — Geist Sans 600 or similar weighty sans, plain English, no ornament. Letter-spacing tight (`-0.03em` or tighter).
|
|
16
18
|
- **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
|
|
19
|
+
- **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 2 universal — gradient text stays banned).
|
|
18
20
|
- **Layout** — centred or near-centred heroes. The canvas itself is the design; the type sits on top of an atmospheric ground.
|
|
19
21
|
- **Motion** — fade-in only. No slide, no bounce. The atmosphere does the work.
|
|
20
22
|
- **Copy tone** — direct, slightly poetic, specific. *"Make a house song about quitting your job."* is the calibration.
|
|
21
23
|
|
|
22
24
|
## What this genre allows
|
|
23
25
|
|
|
24
|
-
- **Radial-gradient bloom** on the body background — up to two blooms, each ~20–30 % footprint, fixed-attached, no animation. Gate
|
|
25
|
-
- **Centred heroes** — gate
|
|
26
|
+
- **Radial-gradient bloom** on the body background — up to two blooms, each ~20–30 % footprint, fixed-attached, no animation. Gate 29 universal is loosened here.
|
|
27
|
+
- **Centred heroes** — gate 6 universal is loosened. The canvas frames the type.
|
|
26
28
|
- **Pill-rounded CTAs** with accent fill — confident, not pastel.
|
|
27
29
|
- **Glow shadows** on hover (cards lift toward the user with a soft warm shadow).
|
|
28
30
|
- **Larger expressive type** — display can hit 6 rem (`clamp(3rem, 6vw + 1rem, 6rem)`).
|
|
29
31
|
|
|
30
32
|
## What this genre disallows
|
|
31
33
|
|
|
32
|
-
- **Light-paper aesthetics** — the canvas is dark. Don't sneak white sections
|
|
33
|
-
- **Italic
|
|
34
|
+
- **Light-paper aesthetics** — the *default* canvas is dark. Bloom and Lumen's Day Foundry are the documented light-paper exceptions; both still emit/refract light from a focal canvas treatment. Don't sneak white sections into a dark-paper build.
|
|
35
|
+
- **Italic in headers** — banned globally (a top AI tell). Atmospheric display is roman; Lumen ships Instrument Serif as a **roman** headline face, with the verb landmark carried by accent colour + a drawn underline, never italics. Body stays Geist Sans.
|
|
34
36
|
- **Hairlines** — atmospheric uses elevated cards (`paper-2`, `paper-3`) instead of hairline-on-paper.
|
|
35
37
|
- **Multiple accent hues** — one warm bloom + one secondary (pink/red) is the maximum. No teal-and-amber juggling.
|
|
36
38
|
- **Glassmorphism** — banned. Atmospheric is *atmospheric*, not glass.
|
|
37
|
-
- **Gradient text** — gate
|
|
39
|
+
- **Gradient text** — gate 2 universal. Stays banned.
|
|
38
40
|
|
|
39
41
|
## Voice fixtures
|
|
40
42
|
|
|
@@ -43,6 +45,8 @@ Brief mentions any of: *AI tool, generative, music, video, image, voice, late-ni
|
|
|
43
45
|
- *"A canvas, then a tool."*
|
|
44
46
|
- *"Generate, refine, ship — between Tuesday and Wednesday."*
|
|
45
47
|
- *"The instrument is dark. The output is yours."*
|
|
48
|
+
- *"Built to think in real time."* — Lumen voice; the verb is the landmark via accent colour + underline, never italics.
|
|
49
|
+
- *"A single primitive that scales down to zero."* — Lumen voice; technical, declarative.
|
|
46
50
|
|
|
47
51
|
## Nav and footer voice
|
|
48
52
|
|
|
@@ -10,11 +10,13 @@ Default. Pick editorial when the brief does not name a specialised aesthetic —
|
|
|
10
10
|
|
|
11
11
|
## Themes that belong
|
|
12
12
|
|
|
13
|
-
`Specimen`, `Newsprint`, `Atelier`, `Garden`, `
|
|
13
|
+
`Specimen`, `Newsprint`, `Atelier`, `Garden`, `Almanac`, `Studio`, `Riso`, `Sport`, `Brutal`, `Manifesto`, `Editorial`, `Carnival`. Twelve themes — plenty of variety inside the genre.
|
|
14
|
+
|
|
15
|
+
`Carnival` is the loud-maximalist editorial register — Dropout TV / Fly.io / Stones Throw / Third Man Records. Duo-tone accent system (mustard + oxblood), chunky variable display, decorative ornaments, hard-offset shadows. The loud sibling to Riso / Manifesto / Brutal.
|
|
14
16
|
|
|
15
17
|
## Voice
|
|
16
18
|
|
|
17
|
-
- **Display** —
|
|
19
|
+
- **Display** — roman serif, condensed sans, or display-heavy. Not Inter. Not Geist. The weight commits to an extreme (300 or 700+). Italic is body-emphasis only — never the header face (global rule).
|
|
18
20
|
- **Body** — workhorse serif (Newsreader, Cormorant) or a plain non-default sans (The Future, Söhne). Readable at 45–75 ch.
|
|
19
21
|
- **Accent** — single warm or cool hue, used at < 5 % of any viewport.
|
|
20
22
|
- **Layout** — asymmetric. Hairlines, not card borders. Generous whitespace.
|
|
@@ -35,11 +37,11 @@ Default. Pick editorial when the brief does not name a specialised aesthetic —
|
|
|
35
37
|
The universal slop-test gates apply, plus these editorial-specific bans:
|
|
36
38
|
|
|
37
39
|
- **Pill-rounded buttons** with gradient fill — pill is fine, gradient on a pill is not.
|
|
38
|
-
- **Centred-everything heroes** (gate
|
|
40
|
+
- **Centred-everything heroes** (gate 6 universal). Editorial heroes are left-biased or asymmetric.
|
|
39
41
|
- **Card-in-card** layouts (gate 4 universal).
|
|
40
42
|
- **Three-column equal-icon-tile feature grid** (gate 3 universal).
|
|
41
43
|
- **Glassmorphism** — never; the medium is paper, not glass.
|
|
42
|
-
- **Pure black or pure white** as paper or ink (gate
|
|
44
|
+
- **Pure black or pure white** as paper or ink (gate 7). Tint everything toward the anchor.
|
|
43
45
|
|
|
44
46
|
## Voice fixtures
|
|
45
47
|
|
|
@@ -8,7 +8,11 @@ Brief mentions any of: *SaaS, enterprise, API, platform, developer tool, infra,
|
|
|
8
8
|
|
|
9
9
|
## Themes that belong
|
|
10
10
|
|
|
11
|
-
`
|
|
11
|
+
`Coral` (canonical) — warm-grey paper, single warm coral accent, Geist throughout, soft pill CTAs. The "Stripe-not-Linear" warmth.
|
|
12
|
+
|
|
13
|
+
`Cobalt` — the cool dev-tool / API / docs register (the GitBook + Firecrawl school, executed **cobalt-on-light, not orange**). Cool engineered near-white paper, one electric cobalt signal accent, Space Grotesk display + Inter body + JetBrains Mono code, ruler-drawn hairlines, tight 6 px radii, a bordered ⌘K nav, and a live code/API request–response hero. The technical, instrument-panel sibling to Coral's warmth — the rotation walks Coral ⇄ Cobalt when modern-minimal is active.
|
|
14
|
+
|
|
15
|
+
The two differ on every axis a glance registers: Coral is warm-grey + coral + Geist + pills; Cobalt is cool-white + electric blue + Space Grotesk/mono + tight-radius bordered controls. Future themes can join this genre too — anything monochrome or near-monochrome with an Inter-class sans display and a single restrained accent.
|
|
12
16
|
|
|
13
17
|
## Voice
|
|
14
18
|
|
|
@@ -22,8 +26,8 @@ Brief mentions any of: *SaaS, enterprise, API, platform, developer tool, infra,
|
|
|
22
26
|
## What this genre allows
|
|
23
27
|
|
|
24
28
|
- **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
|
|
26
|
-
- **Zero-chroma neutrals** — gate
|
|
29
|
+
- **Pure white paper** (`#fff` / `oklch(100% 0 0)`) — gate 7 is loosened here.
|
|
30
|
+
- **Zero-chroma neutrals** — gate 22 is loosened here. The Stripe / ElevenLabs school is monochrome by design.
|
|
27
31
|
- **Two-column hero with title-left + paragraph-right** — explicitly canonical for this genre.
|
|
28
32
|
- **Refined card surface** with very subtle border (`oklch(91% 0 0)`) and 8 px radius.
|
|
29
33
|
- **Large, tight-set displays** (`clamp(2.5rem, 5vw + 0.5rem, 4.75rem)`).
|
|
@@ -34,8 +38,8 @@ Brief mentions any of: *SaaS, enterprise, API, platform, developer tool, infra,
|
|
|
34
38
|
- **Hairline-everything** — borders are thin but visible, not the editorial 0.5 px hairline aesthetic.
|
|
35
39
|
- **Asymmetric prose columns** — modern-minimal aligns left, justified to a regular grid.
|
|
36
40
|
- **Drop caps, fleurons, ornament** — none of it.
|
|
37
|
-
- **Bouncy / overshoot easings** — gate
|
|
38
|
-
- **Gradient text** — gate
|
|
41
|
+
- **Bouncy / overshoot easings** — gate 12 universal applies strictly here.
|
|
42
|
+
- **Gradient text** — gate 2 universal. Stays banned.
|
|
39
43
|
- **Glassmorphism** — banned.
|
|
40
44
|
|
|
41
45
|
## Voice fixtures
|
|
@@ -52,7 +56,7 @@ Brief mentions any of: *SaaS, enterprise, API, platform, developer tool, infra,
|
|
|
52
56
|
- **Acceptable also:** N1 Wordmark + 2 links (when destinations are genuinely minimal); N9 Edge-aligned minimal (when the brand earns the silence).
|
|
53
57
|
- **Default footer:** Ft2 Inline single line — wordmark + tagline + tiny credit, hairline rule above. Restrained.
|
|
54
58
|
- **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
|
|
59
|
+
- **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 43).
|
|
56
60
|
|
|
57
61
|
See [`component-cookbook.md`](../component-cookbook.md) § Navigation and § Footers for the full archetypes + code.
|
|
58
62
|
|
|
@@ -8,7 +8,9 @@ Brief mentions any of: *fun, consumer, casual, family, kids, friendly, approacha
|
|
|
8
8
|
|
|
9
9
|
## Themes that belong
|
|
10
10
|
|
|
11
|
-
`
|
|
11
|
+
`Hum` (vibrant, alive) is the genre's canonical theme — the post-Brilliant-alive register: multi-accent cream + pear + cyan + coral, mandatory motion, a single character moment. Pick it when the brief wants "feels alive in the room with you." For the quieter, more restrained end of friendly — "friendly but soft" rather than "alive" — reach instead for modern-minimal (Coral): a single low-chroma accent on warm paper, smooth easings, motion optional.
|
|
12
|
+
|
|
13
|
+
`Hum` is the catalog's only **rounded-sans-multi-accent** theme — it relaxes several playful defaults: bouncy spring easings are allowed (and canonical) on its primary CTA, accent chroma goes higher than 0.16, and motion is mandatory not optional. It answers a specific brief: a learning platform for curious adults, a daily-curiosity app, a habit tracker with character — products that should feel warm and alive, not merely tidy.
|
|
12
14
|
|
|
13
15
|
## Voice
|
|
14
16
|
|
|
@@ -29,20 +31,23 @@ Brief mentions any of: *fun, consumer, casual, family, kids, friendly, approacha
|
|
|
29
31
|
|
|
30
32
|
## What this genre disallows
|
|
31
33
|
|
|
32
|
-
- **Saturated consumer-app pinks / purples** —
|
|
34
|
+
- **Saturated consumer-app pinks / purples** — playful keeps chroma low by default. **Hum is the documented exception** — pear-yellow at chroma 0.18, sky-cyan at 0.18, coral at 0.24 are allowed and canonical for Hum builds only.
|
|
33
35
|
- **Emoji-as-decoration** — emoji can appear in copy ("we built X 🌱") but never as visual ornament replacing iconography.
|
|
34
|
-
- **Comic Sans, Comic Neue, anything that signals "we're zany"** — playful stays sophisticated.
|
|
35
|
-
- **Bouncy / overshoot easings** —
|
|
36
|
+
- **Comic Sans, Comic Neue, anything that signals "we're zany"** — playful stays sophisticated, even at full vibrancy.
|
|
37
|
+
- **Bouncy / overshoot easings** — playful uses smooth easings by default. **Hum is the documented exception** — spring overshoot (`cubic-bezier(0.34, 1.56, 0.64, 1)`) is canonical on the primary CTA and character moment (one each per page).
|
|
36
38
|
- **Glassmorphism** — banned across all genres.
|
|
37
|
-
- **Gradient text** — gate
|
|
39
|
+
- **Gradient text** — gate 2 universal. Stays banned.
|
|
38
40
|
|
|
39
41
|
## Voice fixtures
|
|
40
42
|
|
|
41
|
-
- *"Made for teams who write together."*
|
|
42
|
-
- *"Soft, but exact."*
|
|
43
|
-
- *"Software can be soft and exact at once. That's the trick."*
|
|
44
|
-
- *"
|
|
45
|
-
- *"
|
|
43
|
+
- *"Made for teams who write together."* — Hum voice
|
|
44
|
+
- *"Soft, but exact."* — Hum voice
|
|
45
|
+
- *"Software can be soft and exact at once. That's the trick."* — Hum voice
|
|
46
|
+
- *"A small tool, gently opinionated."* — Hum voice
|
|
47
|
+
- *"Your daily 30-second curio."* — Hum voice
|
|
48
|
+
- *"Get really good at one thing this quarter."* — Hum voice
|
|
49
|
+
- *"Notice yourself, in 30 seconds."* — Hum voice
|
|
50
|
+
- *"Learn something genuinely new today."* — Hum voice
|
|
46
51
|
|
|
47
52
|
## Nav and footer voice
|
|
48
53
|
|
|
@@ -68,7 +68,7 @@ If the brief contains explicit visual cues, pick from this map:
|
|
|
68
68
|
• "bakery", "kitchen", "café", "atelier" + craft brief → E5 custom illustration (Tier B SVG)
|
|
69
69
|
• "agency", "studio", "portfolio" → E8 photography or no enrichment
|
|
70
70
|
• "manifesto", "essay", "book", "letter" → no enrichment (typography only)
|
|
71
|
-
•
|
|
71
|
+
• Coral theme picked → no enrichment (the theme IS restraint)
|
|
72
72
|
|
|
73
73
|
Else if the brief is genuinely ambiguous, ask one question:
|
|
74
74
|
"Want me to add a demo video, an illustration, or keep it
|
|
@@ -99,7 +99,7 @@ A display headline left, a demo video right, and the rightmost ~10–20 % of the
|
|
|
99
99
|
- Aspect ratio (16/10 · 16/9 · 4/3)
|
|
100
100
|
- Frame treatment (hairline 1 px frame · browser chrome · none)
|
|
101
101
|
|
|
102
|
-
**Example.** Tracejam (SaaS observability — see [`site/_tests/05-tracejam-saas/`](
|
|
102
|
+
**Example.** Tracejam (SaaS observability — see [`site/_tests/05-tracejam-saas/`](../../../site/_tests/05-tracejam-saas/)). Display headline left ("Distributed tracing that explains itself."); hand-built CSS-art trace waterfall right, tilted -0.4°, extending 12 vw past the viewport's right edge. Aspect 16/10. Hairline frame. **Not a real video** — the mockup is custom-built CSS at Tier A (rectangles on a percentage grid simulating a flame chart). Mobile (< 60 rem): drop the clip, stack vertically.
|
|
103
103
|
|
|
104
104
|
```html
|
|
105
105
|
<section class="hero hero--clipped">
|
|
@@ -204,7 +204,7 @@ A hand-built SVG (the default, Tier B) or a generated raster (Tier C, when chara
|
|
|
204
204
|
- Animation (none · loop · scroll-linked)
|
|
205
205
|
- Scale (small accent · dominant)
|
|
206
206
|
|
|
207
|
-
**Example.** Maple Street Bread (bakery — see [`site/_tests/03-maple-bakery/`](
|
|
207
|
+
**Example.** Maple Street Bread (bakery — see [`site/_tests/03-maple-bakery/`](../../../site/_tests/03-maple-bakery/)). Letter-style hero copy left ("Saturday, 6:14 a.m. The dough went in at midnight."), 60-line hand-built SVG loaf right, 3 paths (body, shade, score-marks). Animated with `@property --rise` for a subtle 4 px breathing-loop over 6 s, alternating; the score-marks draw themselves on first paint via `stroke-dasharray`. Tier B, dominant scale, animation: loop. Reduced-motion fallback is a static keyframe.
|
|
208
208
|
|
|
209
209
|
For *how* to build a hand-drawn loaf in 60 lines of SVG and animate its breath with `@property`, see [`custom-craft.md`](custom-craft.md) — there's a full bakery worked example, plus four more recipes (workflow diagram, mascot, architectural diagram, botanical accent).
|
|
210
210
|
|
|
@@ -227,7 +227,7 @@ A small custom-built loop — an orbiting dot, a breathing rectangle, an animate
|
|
|
227
227
|
A two-colour CSS gradient at low chroma, overlaid with SVG `<feTurbulence>` grain at < 0.1 opacity. *Not* aurora; *not* purple-to-cyan mesh; *not* floating orbs. The point is *texture you can barely see* — paper-quality, not decoration.
|
|
228
228
|
|
|
229
229
|
*Use when:* the page would feel synthetic with a flat surface.
|
|
230
|
-
*Avoid when:* the theme already has a paper feel (Specimen,
|
|
230
|
+
*Avoid when:* the theme already has a paper feel (Specimen, Atelier, Riso). Doubling the grain is muddy.
|
|
231
231
|
|
|
232
232
|
**Knobs:**
|
|
233
233
|
- Gradient direction (45° / 135° / radial)
|
|
@@ -358,10 +358,10 @@ hero?.addEventListener('pointermove', (e) => {
|
|
|
358
358
|
|
|
359
359
|
### HP4 · Decorative-numeral
|
|
360
360
|
|
|
361
|
-
A huge edition number / year / chapter glyph set in display-italic in a hero corner. The numeral *means something* — issue 22, year 2026, chapter 03, version 0.8. Reads as editorial ·
|
|
361
|
+
A huge edition number / year / chapter glyph set in display-italic in a hero corner. The numeral *means something* — issue 22, year 2026, chapter 03, version 0.8. Reads as editorial · newsprint · almanac.
|
|
362
362
|
|
|
363
363
|
*Use when:* the page genuinely has an edition / issue / chapter / version semantic — magazines, journals, archived work, dated essays.
|
|
364
|
-
*Avoid when:* the numeral has no semantic anchor. A random "42" in the corner reads as decoration, which is slop (see slop-test gate
|
|
364
|
+
*Avoid when:* the numeral has no semantic anchor. A random "42" in the corner reads as decoration, which is slop (see slop-test gate 45).
|
|
365
365
|
|
|
366
366
|
```html
|
|
367
367
|
<header class="hero hero--num">
|
|
@@ -385,9 +385,10 @@ A huge edition number / year / chapter glyph set in display-italic in a hero cor
|
|
|
385
385
|
|
|
386
386
|
Every hero — enriched or not, polished or not — obeys these rules.
|
|
387
387
|
|
|
388
|
-
- **Footprint.** The hero takes 70–90 % of the first viewport's height — no more, no less. `min-height: 100vh / 100dvh` is the AI fingerprint (gate
|
|
389
|
-
- **
|
|
390
|
-
- **
|
|
388
|
+
- **Footprint.** The hero takes 70–90 % of the first viewport's height — no more, no less. `min-height: 100vh / 100dvh` is the AI fingerprint (gate 6); a hero that's only 20 % of the viewport feels like a header. Aim for `min-height: clamp(60vh, 75dvh, 88dvh)` and let content settle inside.
|
|
389
|
+
- **Fit the fold — content, not just the box.** The Footprint rule caps the hero's *height*; this caps its *content*. On a 13″ laptop (~800 px tall) the eyebrow + headline + lede + primary CTA must all be visible **without scrolling**. When they aren't, it's almost always wasted vertical space — an oversized display `clamp()` max, display line-height near 1.2, a 3-line lede, or `padding-block` bloat. Pull the clamp max down, set display line-height 1.0–1.1, hold the lede to ~2 lines, trim the padding. **Right-size, don't cramp** — a hero that already fits needs no shrinking, and this never means tiny type or no whitespace. Slop-test gate 44 enforces this.
|
|
390
|
+
- **Asymmetric padding.** `padding-block-end` ≥ 1.3× `padding-block-start`. The hero sits *into* the page; symmetric padding floats. Slop-test gate 44 enforces this.
|
|
391
|
+
- **Never centre everything.** Eyebrow + title + lede + CTA all stacked centred is the AI fingerprint. Pick at most *two* centred elements; break alignment for the others. Gate 6 enforces this. Centred-narrow heroes are admissible only when the genre is editorial / atelier *and* the eyebrow or CTA breaks alignment.
|
|
391
392
|
- **Entrance animation.** Pick one of {fade, sweep, none} per element — never both fade *and* sweep on the same element. Duration ≤ 220 ms. Disable on `prefers-reduced-motion: reduce`. Cross-reference the "One orchestrated reveal per page" rule below.
|
|
392
393
|
- **Headline typography.** Prefer one display weight + tight tracking (-0.02em to -0.04em) over default 0; line-height 0.95–1.05 for display, never 1.2 (which inherits the body line-height and reads as un-set type). Avoid two display weights on the same headline (a `<strong>` in a different weight inside the title is AI's idea of "emphasis"; pick one weight, let the words carry).
|
|
393
394
|
- **One polish pattern, max.** HP1–HP4 are mutually exclusive on a single hero. A vertical rail *and* a marquee-overflow *and* a cursor spotlight *and* a decorative numeral on one hero is a panic attack. Pick one.
|
|
@@ -438,7 +439,7 @@ Every question must answer *yes* before the enrichment ships. If any answer is *
|
|
|
438
439
|
5. If illustration: built or generated with intent? **Not picked from a Lottie library as a shortcut?**
|
|
439
440
|
6. If background: under one accent colour at < 5 % footprint? (Aurora and mesh-gradients fail this.)
|
|
440
441
|
7. Does it survive being deleted? (If the hero still works without it, it earned its place. If the hero collapses without it, you propped weak typography on a crutch.)
|
|
441
|
-
8. Does its tone match the page's tone? (Risograph illustration on a Brutal page = wrong. Hand-drawn doodle on a Workbench developer-tool page = wrong. Three.js bloom on a
|
|
442
|
+
8. Does its tone match the page's tone? (Risograph illustration on a Brutal page = wrong. Hand-drawn doodle on a Workbench developer-tool page = wrong. Three.js bloom on a Coral page = wrong.)
|
|
442
443
|
|
|
443
444
|
The slop test ([`SKILL.md`](../SKILL.md) §5) carries four binary gates that mirror these questions; the audit verb runs them.
|
|
444
445
|
|
|
@@ -454,7 +455,7 @@ When you ship enrichment, the macrostructure stamp records the choice:
|
|
|
454
455
|
* polish: HP3 Cursor-spotlight (scoped to hero, reduced-motion fallback pinned at 50%/30%)
|
|
455
456
|
* nav: N5 Floating pill · footer: Ft5 Statement
|
|
456
457
|
* craft: tier-A CSS art (no real video — pure custom-built mockup)
|
|
457
|
-
* theme:
|
|
458
|
+
* theme: Newsprint · accent: steel-blue ~3% · studied: no
|
|
458
459
|
*/
|
|
459
460
|
```
|
|
460
461
|
|
|
@@ -468,7 +469,7 @@ This signals to future Hallmark runs (and to the audit verb) what was chosen and
|
|
|
468
469
|
|
|
469
470
|
- **Defaulting to E5 illustration on every brief.** Most heroes don't want an illustration. Reach for E0 (typography only) first; reach for E1–E4 when there's a *thing* to show; reach for E5 only when illustration genuinely matches the tone.
|
|
470
471
|
- **Using a stock Lottie checkmark as the hero animation.** That's tier E used to skip tiers A–D. Build the checkmark in pure CSS (`stroke-dasharray` animated to draw the tick); it's 8 lines.
|
|
471
|
-
- **Adding a grain background everywhere.** Grain is a treatment, not a default. Half the existing themes already carry texture (Riso,
|
|
472
|
+
- **Adding a grain background everywhere.** Grain is a treatment, not a default. Half the existing themes already carry texture (Riso, Atelier, Specimen). Don't double up.
|
|
472
473
|
- **Treating the abstract background as the hero.** It isn't. The headline is. The background is paper.
|
|
473
474
|
- **Shipping the unmodified Storyset SVG.** That's tier D ungrounded — the library look. Customise the colour to your anchor hue at minimum; recompose if you can.
|
|
474
475
|
- **A clipped-edge video on mobile.** The clip reads as broken on a 375-px viewport. Always collapse to stacked at < 60 rem.
|