howone 0.1.20 → 0.1.23
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/nextjs/lib/sdk.ts +3 -0
- package/templates/vite/.howone/skills/hallmark/LICENSE +21 -0
- package/templates/vite/.howone/skills/hallmark/README.md +147 -0
- package/templates/vite/.howone/skills/hallmark/ROADMAP.md +201 -0
- package/templates/vite/.howone/skills/hallmark/SKILL.md +551 -0
- package/templates/vite/.howone/skills/hallmark/docs/recipes.md +186 -0
- 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 +176 -0
- package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +364 -0
- package/templates/vite/.howone/skills/hallmark/package.json +36 -0
- package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +412 -0
- package/templates/vite/.howone/skills/hallmark/references/assets.md +399 -0
- package/templates/vite/.howone/skills/hallmark/references/color.md +95 -0
- package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +256 -0
- package/templates/vite/.howone/skills/hallmark/references/components/c1-outlined-chip.md +12 -0
- package/templates/vite/.howone/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -0
- package/templates/vite/.howone/skills/hallmark/references/components/c3-typographic-link.md +8 -0
- package/templates/vite/.howone/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f1-bento-grid.md +20 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f4-step-sequence.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f6-product-card-grid.md +41 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft1-mast-headed.md +13 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft4-dense-typographic.md +10 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft5-statement.md +21 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +19 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft7-newsletter-first.md +27 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h1-marquee.md +15 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h2-split-diptych.md +15 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h3-quote-led.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h4-stat-led.md +14 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h5-letter-hero.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h6-photographic-fold.md +16 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n2-floating-chip.md +14 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n3-side-rail.md +14 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n5-floating-pill.md +28 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n7-brutal-slab.md +22 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n8-terminal-command.md +21 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -0
- package/templates/vite/.howone/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -0
- package/templates/vite/.howone/skills/hallmark/references/components/s2-hanging.md +13 -0
- package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +19 -0
- package/templates/vite/.howone/skills/hallmark/references/components/s4-inline-no-break.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/s5-bottom-anchored.md +13 -0
- package/templates/vite/.howone/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -0
- package/templates/vite/.howone/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -0
- package/templates/vite/.howone/skills/hallmark/references/components/t3-single-huge-quote.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -0
- package/templates/vite/.howone/skills/hallmark/references/contract.md +24 -0
- package/templates/vite/.howone/skills/hallmark/references/copy.md +182 -0
- package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +626 -0
- package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +329 -0
- package/templates/vite/.howone/skills/hallmark/references/design-md.md +116 -0
- package/templates/vite/.howone/skills/hallmark/references/export-formats.md +328 -0
- package/templates/vite/.howone/skills/hallmark/references/floating-nav.md +89 -0
- package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +65 -0
- package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +70 -0
- package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +67 -0
- package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +65 -0
- package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +474 -0
- package/templates/vite/.howone/skills/hallmark/references/imagery-kit.md +170 -0
- package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +207 -0
- package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +111 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/02-long-document.md +34 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +32 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/05-workbench.md +32 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/07-manifesto.md +32 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/08-photographic.md +34 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/09-quote-led.md +32 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/10-specimen.md +32 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/11-catalogue.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/13-index-first.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/15-split-studio.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/21-component-playground.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +89 -0
- package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +260 -0
- package/templates/vite/.howone/skills/hallmark/references/motion.md +109 -0
- package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +49 -0
- package/templates/vite/.howone/skills/hallmark/references/responsive.md +138 -0
- package/templates/vite/.howone/skills/hallmark/references/slop-test.md +205 -0
- package/templates/vite/.howone/skills/hallmark/references/structure.md +164 -0
- package/templates/vite/.howone/skills/hallmark/references/study.md +486 -0
- package/templates/vite/.howone/skills/hallmark/references/typography.md +243 -0
- package/templates/vite/.howone/skills/hallmark/references/verbs/audit.md +25 -0
- package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +269 -0
- 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 +71 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +64 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +240 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +65 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +105 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +250 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +64 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +131 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +240 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +67 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +86 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +262 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +63 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +167 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +457 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +65 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +159 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +288 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +64 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +146 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +484 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +64 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +116 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +354 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +638 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +515 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +515 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +608 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +587 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +157 -0
- 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 +77 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +238 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +110 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +326 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +134 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +262 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +30 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +17 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +56 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +160 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +29 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +63 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +72 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +374 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +52 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +29 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +61 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +193 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +66 -0
- package/templates/vite/.howone/skills/hallmark/site/css/base.css +194 -0
- package/templates/vite/.howone/skills/hallmark/site/css/components.css +4886 -0
- package/templates/vite/.howone/skills/hallmark/site/css/sections.css +2072 -0
- package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +1129 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +475 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +1584 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +96 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +344 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +103 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +1103 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +83 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +368 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +133 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +1062 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +97 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +84 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +446 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +1087 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +101 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +359 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +1168 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +81 -0
- package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +5 -0
- package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +5 -0
- package/templates/vite/.howone/skills/hallmark/site/index.html +1043 -0
- package/templates/vite/.howone/skills/hallmark/site/js/main.js +1175 -0
- package/templates/vite/.howone/skills/hallmark/vercel.json +6 -0
- package/templates/vite/.howone/skills/howone-sdk/01-architect/01-app-generation.md +126 -0
- package/templates/vite/.howone/skills/howone-sdk/{references/08-manifest-codegen.md → 01-architect/02-manifest-codegen.md} +31 -19
- package/templates/vite/.howone/skills/howone-sdk/02-database/01-schema-design.md +147 -0
- package/templates/vite/.howone/skills/howone-sdk/02-database/02-schema-operations.md +96 -0
- package/templates/vite/.howone/skills/howone-sdk/02-database/03-data-access-patterns.md +172 -0
- package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/01-client-setup.md +3 -3
- package/templates/vite/.howone/skills/howone-sdk/{references/04-auth.md → 03-sdk/03-auth.md} +120 -3
- package/templates/vite/.howone/skills/howone-sdk/{references/06-react-integration.md → 03-sdk/04-react-integration.md} +2 -4
- package/templates/vite/.howone/skills/howone-sdk/{references/03-ai-actions.md → 03-sdk/07-ai-action-calls.md} +31 -34
- package/templates/vite/.howone/skills/howone-sdk/04-ai/.gitkeep +1 -0
- package/templates/vite/.howone/skills/howone-sdk/04-ai/01-ai-capability-architecture.md +142 -0
- package/templates/vite/.howone/skills/howone-sdk/04-ai/02-workflow-contract-rules.md +169 -0
- package/templates/vite/.howone/skills/howone-sdk/04-ai/03-ai-sdk-handoff.md +80 -0
- package/templates/vite/.howone/skills/howone-sdk/SKILL.md +118 -93
- package/templates/vite/.howone/skills/howone-sdk/agents/openai.yaml +3 -3
- package/templates/vite/.howone/skills/impeccable/SKILL.md +168 -0
- package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +101 -0
- package/templates/vite/.howone/skills/impeccable/reference/adapt.md +190 -0
- package/templates/vite/.howone/skills/impeccable/reference/animate.md +175 -0
- package/templates/vite/.howone/skills/impeccable/reference/audit.md +133 -0
- package/templates/vite/.howone/skills/impeccable/reference/bolder.md +113 -0
- package/templates/vite/.howone/skills/impeccable/reference/brand.md +118 -0
- package/templates/vite/.howone/skills/impeccable/reference/clarify.md +174 -0
- package/templates/vite/.howone/skills/impeccable/reference/codex.md +105 -0
- package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +106 -0
- package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +105 -0
- package/templates/vite/.howone/skills/impeccable/reference/colorize.md +154 -0
- package/templates/vite/.howone/skills/impeccable/reference/craft.md +123 -0
- package/templates/vite/.howone/skills/impeccable/reference/critique.md +273 -0
- package/templates/vite/.howone/skills/impeccable/reference/delight.md +302 -0
- package/templates/vite/.howone/skills/impeccable/reference/distill.md +111 -0
- package/templates/vite/.howone/skills/impeccable/reference/document.md +427 -0
- package/templates/vite/.howone/skills/impeccable/reference/extract.md +69 -0
- package/templates/vite/.howone/skills/impeccable/reference/harden.md +347 -0
- package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +234 -0
- package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +195 -0
- package/templates/vite/.howone/skills/impeccable/reference/layout.md +141 -0
- package/templates/vite/.howone/skills/impeccable/reference/live.md +622 -0
- package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +109 -0
- package/templates/vite/.howone/skills/impeccable/reference/onboard.md +234 -0
- package/templates/vite/.howone/skills/impeccable/reference/optimize.md +258 -0
- package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +130 -0
- package/templates/vite/.howone/skills/impeccable/reference/personas.md +179 -0
- package/templates/vite/.howone/skills/impeccable/reference/polish.md +242 -0
- package/templates/vite/.howone/skills/impeccable/reference/product.md +62 -0
- package/templates/vite/.howone/skills/impeccable/reference/quieter.md +99 -0
- package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +114 -0
- package/templates/vite/.howone/skills/impeccable/reference/shape.md +165 -0
- package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +100 -0
- package/templates/vite/.howone/skills/impeccable/reference/teach.md +156 -0
- package/templates/vite/.howone/skills/impeccable/reference/typeset.md +124 -0
- package/templates/vite/.howone/skills/impeccable/reference/typography.md +159 -0
- package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +107 -0
- package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
- package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +94 -0
- package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +242 -0
- package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +820 -0
- package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +21 -0
- package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
- package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +69 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +595 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +4860 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +75 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +18 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +446 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +200 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +48 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +838 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +254 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +47 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +632 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +247 -0
- package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +141 -0
- package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +214 -0
- package/templates/vite/AGENTS.md +2 -12
- package/templates/vite/package.json +1 -1
- package/templates/vite/src/lib/sdk.ts +3 -0
- /package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/02-entity-operations.md +0 -0
- /package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/05-file-upload.md +0 -0
- /package/templates/vite/.howone/skills/howone-sdk/{references/07-raw-http.md → 03-sdk/06-raw-http.md} +0 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Imagery kit — curated abstract assets, hosted, ready
|
|
2
|
+
|
|
3
|
+
A small set of pre-generated abstract / decorative imagery that any Hallmark output can pull from when a brief allows non-photographic imagery. The kit lives at:
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
https://www.usehallmark.com/imagery/<category>/<file>
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
The skill doesn't ship the binaries — it ships the manifest. References are absolute URLs. If the asset is missing (404), the skill falls back to source canon #2 in [`assets.md` § Placeholder strategy](assets.md) (hand-built SVG) without erroring.
|
|
10
|
+
|
|
11
|
+
**Why this exists.** The v0.9.0 watercolor sprinkle was generated per-emit and was inconsistent. The kit recovers that aesthetic but as discrete, swappable, deliberately-composed assets. Compose with them like a senior frontend engineer: layered transparent PNG behind text, biased off-centre, intentionally large, mix-blend-mode where it earns its place. Not "abstract gradient on top of headline" — that's the AI default.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Categories
|
|
16
|
+
|
|
17
|
+
| Category | What | Format | Example uses |
|
|
18
|
+
| --- | --- | --- | --- |
|
|
19
|
+
| **watercolor** | Full-bleed soft-edge painterly fields. Warm + cool variants per palette family. | WebP | Section background accent; hero-half flood; behind-quote wash. |
|
|
20
|
+
| **transparent** | Organic blob / brushstroke / stylized mark on transparent background. | PNG | Layered hero composition (large, off-centre, behind text). The masterclass move. |
|
|
21
|
+
| **ornament** | Small hand-drawn stamps, plates, roman numerals, decorative flourishes. | SVG | Beside a quote; in the section-label gutter; closing a letter. |
|
|
22
|
+
| **texture** | Subtle paper, weave, riso-dot, cross-hatch fields. Tile-able. | WebP | Body grain via `mix-blend-mode: multiply`; section-divider banding. |
|
|
23
|
+
| **silhouette** | Abstract bottle / box / device / book / mug / card shapes. | PNG | Empty product slots before user uploads photos; comparison rows. |
|
|
24
|
+
| **pattern** | Repeating motifs that read as fabric / paper / printed material. | WebP | Section-band texture; full-bleed fills behind decorative text. |
|
|
25
|
+
|
|
26
|
+
**Naming:** `<category>-<palette-family>-<variant>.<ext>` — e.g. `watercolor-warm-01.webp`, `transparent-brush-cool-03.png`, `ornament-stamp-01.svg`, `texture-grain-paper-02.webp`. Palette families: `warm` · `cool` · `neutral` · `chromatic`.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Manifest (placeholder until generation pass ships)
|
|
31
|
+
|
|
32
|
+
When images land in `site/public/imagery/<category>/`, list them here as a key/value catalogue:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
watercolor-warm-01.webp 1600×900 warm orange · cream paper hero half-flood, atmospheric
|
|
36
|
+
watercolor-cool-01.webp 1600×900 cool blue · greyscale quote-behind wash
|
|
37
|
+
transparent-brush-warm-01 1200×1200 burnt orange brushstroke layered hero, off-centre
|
|
38
|
+
transparent-blob-cool-01 1200×1200 cobalt organic shape layered hero, behind headline
|
|
39
|
+
ornament-stamp-01.svg inline ink-only stamp w/ numeral label-gutter, letter close
|
|
40
|
+
texture-grain-paper-01 512×512 cream paper grain (tileable) body grain, blend-multiply
|
|
41
|
+
silhouette-bottle-01.png 600×900 abstract bottle, transparent empty product slot
|
|
42
|
+
silhouette-card-01.png 900×600 abstract product card comparison row
|
|
43
|
+
pattern-cross-warm-01 400×400 cross-hatch warm (tileable) section-band texture
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The skill picks an asset by matching the active theme's palette family + the brief's tone, then references it by absolute URL. Picking logic lives in Step 4 of [SKILL.md](../SKILL.md) — eyeball the manifest, choose the closest match, fall back if the file 404s.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Usage patterns — how a senior engineer would compose these
|
|
51
|
+
|
|
52
|
+
### Layered hero composition (the masterclass move)
|
|
53
|
+
|
|
54
|
+
A transparent abstract object behind hero text. The image is bigger than you think it should be — that's what makes it feel intentional, not decorative.
|
|
55
|
+
|
|
56
|
+
```css
|
|
57
|
+
.hero { position: relative; isolation: isolate; }
|
|
58
|
+
|
|
59
|
+
.hero__art {
|
|
60
|
+
position: absolute;
|
|
61
|
+
top: 50%;
|
|
62
|
+
right: -10%;
|
|
63
|
+
transform: translateY(-50%);
|
|
64
|
+
width: clamp(60%, 80vh, 1400px);
|
|
65
|
+
height: auto;
|
|
66
|
+
z-index: 0;
|
|
67
|
+
pointer-events: none;
|
|
68
|
+
/* Optional warmth: */
|
|
69
|
+
mix-blend-mode: multiply;
|
|
70
|
+
opacity: 0.85;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.hero__art--bias-left { right: auto; left: -10%; }
|
|
74
|
+
|
|
75
|
+
.hero > * { position: relative; z-index: 1; }
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Bias to one side (left or right, never centred). The text sits at `z-index: 1`, the art at `z-index: 0`. Test mobile: art may need to scale down or shift to avoid the headline at 320 px.
|
|
79
|
+
|
|
80
|
+
### Section background wash
|
|
81
|
+
|
|
82
|
+
A watercolor file as a full-bleed section accent. One section per page, never global.
|
|
83
|
+
|
|
84
|
+
```css
|
|
85
|
+
.section--wash { position: relative; isolation: isolate; }
|
|
86
|
+
.section--wash::before {
|
|
87
|
+
content: "";
|
|
88
|
+
position: absolute;
|
|
89
|
+
inset: 0;
|
|
90
|
+
background: url("https://www.usehallmark.com/imagery/watercolor/watercolor-warm-01.webp") center / cover no-repeat;
|
|
91
|
+
opacity: 0.6;
|
|
92
|
+
z-index: -1;
|
|
93
|
+
pointer-events: none;
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Decoration
|
|
98
|
+
|
|
99
|
+
Inline ornament beside a quote or in the section-label gutter. Small. No border, no shadow, no animation.
|
|
100
|
+
|
|
101
|
+
```html
|
|
102
|
+
<p class="section-label">
|
|
103
|
+
<span class="num">02</span>
|
|
104
|
+
<img class="section-label__ornament" src="…/imagery/ornament/ornament-stamp-01.svg" alt="" aria-hidden="true" />
|
|
105
|
+
<span>Examples</span>
|
|
106
|
+
</p>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
```css
|
|
110
|
+
.section-label__ornament { width: 1.5em; height: auto; vertical-align: middle; }
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Texture overlay
|
|
114
|
+
|
|
115
|
+
Grain over a solid colour. Always opacity-capped at `0.15`.
|
|
116
|
+
|
|
117
|
+
```css
|
|
118
|
+
.texture-grain {
|
|
119
|
+
background-image: url("…/imagery/texture/texture-grain-paper-01.webp"), var(--paper-fill);
|
|
120
|
+
background-size: 256px 256px, cover;
|
|
121
|
+
background-blend-mode: multiply;
|
|
122
|
+
opacity: 1; /* the grain texture is at 0.15 in the source asset */
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Empty state
|
|
127
|
+
|
|
128
|
+
Generic silhouette in unfilled data slots, greyscale-tinted, with a "Replace with real photo" hint visible to the developer (HTML comment).
|
|
129
|
+
|
|
130
|
+
```html
|
|
131
|
+
<!-- TODO: Replace with real product photo, target size: 600×900 -->
|
|
132
|
+
<picture class="product-card__photo product-card__photo--empty">
|
|
133
|
+
<img src="…/imagery/silhouette/silhouette-bottle-01.png" alt="Hand-poured ceramic vessel, studio lighting" />
|
|
134
|
+
</picture>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Anti-patterns
|
|
140
|
+
|
|
141
|
+
- **Don't use kit imagery as the literal subject.** An abstract bottle is *not* a stand-in for an actual coffee-shop hero — those need photographic placeholders (Picsum / Unsplash). The kit is for atmosphere / composition / decoration, not subject replacement.
|
|
142
|
+
- **Don't layer 3+ kit pieces on one page.** Restraint. One transparent object in the hero + one wash in a later section is the cap.
|
|
143
|
+
- **Don't apply the same watercolor wash to multiple sections.** It's a section accent, not a global treatment.
|
|
144
|
+
- **Don't use kit imagery in modern-minimal genre** (Stripe / Linear / ElevenLabs school). That genre's whole point is the absence of decorative imagery.
|
|
145
|
+
- **Don't centre the layered hero art.** Centred behind text is the AI-default move. Bias to one side, off-axis.
|
|
146
|
+
- **Don't use mix-blend-mode without testing on the active paper.** `multiply` over a dark canvas inverts; `screen` over light paper washes out. Eyeball the result per theme.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Generation pipeline (out-of-band, one-time)
|
|
151
|
+
|
|
152
|
+
The kit is generated once per palette family, post-processed, and committed to the marketing site's public folder:
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
site/public/imagery/
|
|
156
|
+
├── watercolor/ ~6 files × 4 palette families = 24 WebPs
|
|
157
|
+
├── transparent/ ~6 files × 4 palette families = 24 PNGs
|
|
158
|
+
├── ornament/ ~8 SVGs (palette-agnostic, use currentColor)
|
|
159
|
+
├── texture/ ~6 tile-able WebPs
|
|
160
|
+
├── silhouette/ ~6 PNGs (palette-agnostic, transparent)
|
|
161
|
+
└── pattern/ ~6 tile-able WebPs
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Tooling.** Nanobanana 2 / Recraft V4 with reference images. Prompt seed-list per category lives at the top of each file's directory in a `prompts.md` (one-line prompts, results pinned by seed for reproducibility).
|
|
165
|
+
|
|
166
|
+
**Post-processing.** Trim, transparent-background where applicable, colour-balance against Hallmark's OKLCH palette tokens, save as WebP for size + PNG where alpha matters. Ornaments as inline SVG so they inherit `currentColor`.
|
|
167
|
+
|
|
168
|
+
**Total target weight.** ≤ 5 MB across all categories. Each individual file ≤ 200 KB. Lossy WebP at q=80 unless the image needs lossless (ornaments → SVG; transparents → PNG with `pngquant`).
|
|
169
|
+
|
|
170
|
+
**Re-generation.** Treat the kit as a refreshable batch, not a one-off. When the palette catalogue changes (new theme, new accent hue), re-generate the relevant palette family. Manifest above is the spec; assets are the deliverable.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Interaction and states
|
|
2
|
+
|
|
3
|
+
Every interactive element has eight states. Most AI-generated UI styles two (default, hover) and forgets the rest. That's where interfaces break.
|
|
4
|
+
|
|
5
|
+
## The eight states
|
|
6
|
+
|
|
7
|
+
| State | When | Treatment |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| Default | At rest | Base styling |
|
|
10
|
+
| Hover | Pointer over (only with `@media (hover: hover)`) | Small shift: colour, 1px translate, subtle border |
|
|
11
|
+
| Focus | Keyboard or programmatic focus | Visible ring, `:focus-visible` |
|
|
12
|
+
| Active / Pressed | During press | Pressed-in: darker, translate(0 1px) |
|
|
13
|
+
| Disabled | Not interactive | Reduced opacity (0.5) + `cursor: not-allowed` + `aria-disabled` |
|
|
14
|
+
| Loading | Processing | Inline spinner or progress, label stays readable |
|
|
15
|
+
| Error | Failed state | Red border, error icon, message, `aria-invalid` |
|
|
16
|
+
| Success | Completed | Green check, confirmation, auto-dismiss |
|
|
17
|
+
|
|
18
|
+
If any of these is missing on a production element, the element isn't finished.
|
|
19
|
+
|
|
20
|
+
## Focus rings
|
|
21
|
+
|
|
22
|
+
Visible, always, on every interactive element. The default focus ring most browsers give you is fine; a custom one is better.
|
|
23
|
+
|
|
24
|
+
```css
|
|
25
|
+
:focus { outline: none; }
|
|
26
|
+
:focus-visible {
|
|
27
|
+
outline: 2px solid var(--color-focus);
|
|
28
|
+
outline-offset: 2px;
|
|
29
|
+
border-radius: inherit;
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Requirements:
|
|
34
|
+
|
|
35
|
+
- 2–3px, ≥ 3:1 contrast against both element and page.
|
|
36
|
+
- 2px offset from the element.
|
|
37
|
+
- `:focus-visible`, not `:focus`, so it's keyboard-only.
|
|
38
|
+
- Never `outline: none` without a replacement. `outline: none` with no other focus style is the most common accessibility bug and an immediate audit failure.
|
|
39
|
+
|
|
40
|
+
## Hit targets
|
|
41
|
+
|
|
42
|
+
Minimum 44×44 CSS px for any touch-reachable element. Use padding or an `::before` overlay to expand the hit target without changing visual size:
|
|
43
|
+
|
|
44
|
+
```css
|
|
45
|
+
.icon-btn {
|
|
46
|
+
position: relative;
|
|
47
|
+
}
|
|
48
|
+
.icon-btn::before {
|
|
49
|
+
content: "";
|
|
50
|
+
position: absolute;
|
|
51
|
+
inset: -12px;
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Forms
|
|
56
|
+
|
|
57
|
+
- Labels above inputs. Visible. Never placeholder-as-label.
|
|
58
|
+
- Placeholders show format, not instruction. `Placeholder: 01 Jan 2026`, not `Placeholder: Enter your birth date`.
|
|
59
|
+
- Helper text below input. Error text replaces helper text.
|
|
60
|
+
- Validate on **blur**, not on every keystroke. Revalidate on change once the field has been blurred once (the "touched" pattern).
|
|
61
|
+
- Error message: (1) what broke, (2) why, (3) what to do. One sentence if possible.
|
|
62
|
+
- Associate errors with `aria-describedby`. Set `aria-invalid="true"` on the field.
|
|
63
|
+
- Required fields marked with `aria-required`, never with colour alone.
|
|
64
|
+
- Disable the submit button only when the form is in a known-invalid or in-flight state. Never on idle.
|
|
65
|
+
|
|
66
|
+
## Input field states — the exhaustive checklist
|
|
67
|
+
|
|
68
|
+
This is where the most "almost right" UIs lose. An input field with two states (default + hover) and a different border-width on focus reads as a default settings page — the geometry shifts, the eye notices, the page feels untuned. Every text input, textarea, select, and combobox must satisfy every rule below.
|
|
69
|
+
|
|
70
|
+
### The no-layout-shift rule
|
|
71
|
+
|
|
72
|
+
**Border thickness is constant across every state.** Default · hover · focus · error · disabled — the `border-width` value never changes. Layout shift on focus is a tell. State changes go to `background-color`, `outline`, or `box-shadow`, never to `border-width`.
|
|
73
|
+
|
|
74
|
+
```css
|
|
75
|
+
.input {
|
|
76
|
+
border: 1px solid var(--color-rule-2); /* 1px, always — every state */
|
|
77
|
+
outline: 2px solid transparent; /* reserved slot for focus ring; no shift on activate */
|
|
78
|
+
outline-offset: 1px;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The outline starts transparent at 2 px so when the focus ring appears, the box geometry is already correct. No layout shift. No paint thrash.
|
|
83
|
+
|
|
84
|
+
### State-by-state recipe
|
|
85
|
+
|
|
86
|
+
| State | Treatment | Why |
|
|
87
|
+
| --- | --- | --- |
|
|
88
|
+
| **Default** | `border: 1px solid var(--color-rule-2)` · `background: var(--color-paper)` · placeholder in `var(--color-muted)` | Visible field, readable empty signal |
|
|
89
|
+
| **Hover** | `background: var(--color-paper-2)` (4–6 % darker than paper) · border unchanged | Subtle background shift, no border flash. Border colour changing alone is missable. |
|
|
90
|
+
| **Focus** | `outline: 2px solid var(--color-focus)` · `outline-offset: 1px` · border may deepen to `var(--color-ink-2)` but width stays 1 px | Outline is the focus signal; never animated; ≥ 3:1 contrast against page AND field. |
|
|
91
|
+
| **Active / typing** | Same as focus. Don't add a separate "typing" state. | Focus already says "active here". A second signal is noise. |
|
|
92
|
+
| **Filled** | Same as default — the value carries the state. Optionally a subtle ink-2 border to visually distinguish from empty. | Don't fight the user's content with a styled chrome change. |
|
|
93
|
+
| **Disabled** | `opacity: 0.55` · `cursor: not-allowed` · placeholder `var(--color-rule-2)` · `aria-disabled="true"` · `tabindex="-1"` | Three independent signals (opacity + cursor + colour) so no single channel carries the whole load. |
|
|
94
|
+
| **Error** | `border-color: var(--color-error, oklch(58% 0.20 25))` · helper-text replaced by error message · `aria-invalid="true"` · small ⚠ glyph at right edge | Border colour flip is OK *because* helper-text and aria signal it too. Never colour alone. |
|
|
95
|
+
| **Success** | Subtle accent-coloured border (3 % chroma above default) · small ✓ glyph · auto-clear if user re-edits | Quiet; success doesn't deserve celebration unless it was hard. |
|
|
96
|
+
| **Loading** (validating, async) | Inline spinner at the right edge replacing the standard glyph slot · field stays editable but submit disabled | Don't lock the user out of the field. They may want to fix what they typed. |
|
|
97
|
+
|
|
98
|
+
### Heights and rhythm
|
|
99
|
+
|
|
100
|
+
- **Input height = button height.** A page with 44 px buttons and 38 px inputs feels untuned. Pick one base height (44 px is the touch-target floor) and apply it to every text input AND every adjacent button.
|
|
101
|
+
- **Vertical padding = `(height − line-height-px) / 2`.** No magic numbers.
|
|
102
|
+
- **Right-edge slot reserved.** Every input reserves a ~24 px right-edge slot for an optional clear button, error glyph, or loading spinner. If unused, the slot sits empty — never reflow on icon appearance.
|
|
103
|
+
|
|
104
|
+
### Labels, helper, error
|
|
105
|
+
|
|
106
|
+
- **Label above** the input, 4–8 px gap. Never inline (placeholder-as-label is a tell).
|
|
107
|
+
- **Helper text below**, ~4 px gap. Same `font-size` as the label, lower visual weight.
|
|
108
|
+
- **Error replaces helper** — same position, same size, error colour. Never both at once (causes vertical jump on validation).
|
|
109
|
+
- **Helper has stable height.** Reserve a 1-line height even when empty, so adding an error doesn't push the page down. CSS: `min-height: 1lh` on the helper container.
|
|
110
|
+
|
|
111
|
+
### Don't, list
|
|
112
|
+
|
|
113
|
+
- Don't transition `border-width`, `padding`, or `height` on any state. Always layout-shift.
|
|
114
|
+
- Don't transition the focus ring's `opacity` or `transform`. Focus must be instant.
|
|
115
|
+
- Don't put hover effects inside `@media (hover: hover)` — wait, *do* put them inside `@media (hover: hover)` so touch users don't get stuck states.
|
|
116
|
+
- Don't disable the field as a way to indicate "wait, loading" — use a loading state with the field still editable.
|
|
117
|
+
- Don't change `cursor` on `:focus`. The pointer is already a beam; don't fight it.
|
|
118
|
+
- Don't use `outline: none` on focus without an explicit replacement.
|
|
119
|
+
|
|
120
|
+
### Specific control overrides
|
|
121
|
+
|
|
122
|
+
- **Textarea.** Same rules as input, plus `resize: vertical` (never `none`, never `both` on a small textarea), `min-height: 6rem` for multi-line UX.
|
|
123
|
+
- **Select.** Custom-styled `<select>` only if you can replicate native a11y (keyboard, screen-reader). Otherwise leave it native and style the wrapper.
|
|
124
|
+
- **Checkbox / radio.** Use `accent-color: var(--color-accent)` for cheap correct styling on modern browsers; only build a custom one when the design requires it. If custom: still a 1 px outline-offset focus ring.
|
|
125
|
+
- **Toggle / switch.** It IS a checkbox. Same a11y rules. The visual design doesn't change the contract.
|
|
126
|
+
- **Range / slider.** The thumb gets focus state, not the track. Thumb hit-target ≥ 44 px even if visual size is smaller (use a transparent expansion).
|
|
127
|
+
- **File input.** Always wrap in a styled label. Native `<input type="file">` is unstyleable; the label is the surface.
|
|
128
|
+
- **Combobox / search.** Listbox sits below, `aria-expanded` mirrors visibility, arrow-keys cycle, Enter selects, Escape closes — and the listbox doesn't push page content (use `position: absolute` + a parent `position: relative`).
|
|
129
|
+
|
|
130
|
+
## Modals and overlays
|
|
131
|
+
|
|
132
|
+
- Use the native `<dialog>` element. It handles focus trap, escape to close, and `::backdrop` styling for free.
|
|
133
|
+
- Set `inert` on the page content behind a modal so tab order doesn't leak.
|
|
134
|
+
- Close on: escape key, backdrop click, explicit close button.
|
|
135
|
+
- First focus goes to the first interactive element, not the close button.
|
|
136
|
+
|
|
137
|
+
## Dropdowns, tooltips, popovers
|
|
138
|
+
|
|
139
|
+
- Use the Popover API (`popover` attribute). It handles light-dismiss, stacking, and escape for free, and works in every modern browser.
|
|
140
|
+
- Position with CSS Anchor Positioning where it's available; fall back to `position: fixed` + `getBoundingClientRect()`.
|
|
141
|
+
- Never put a dropdown inside an `overflow: hidden` container without escape. It will clip.
|
|
142
|
+
- Flip when near the viewport edge.
|
|
143
|
+
|
|
144
|
+
## Undo over confirm
|
|
145
|
+
|
|
146
|
+
- For reversible actions, skip the confirm dialog. Do the thing. Show a toast with an Undo button for 5–10 seconds.
|
|
147
|
+
- For destructive, irreversible actions (delete account, drop table), keep the confirm — and make the user type the thing being destroyed, not just click "OK".
|
|
148
|
+
|
|
149
|
+
## Loading and empty states
|
|
150
|
+
|
|
151
|
+
- **Skeleton** screens over spinners for content that has a predictable shape (lists, cards, tables).
|
|
152
|
+
- **Inline spinners** for in-button state. Replace the label, don't add beside it.
|
|
153
|
+
- **Empty states** always have: an illustration or icon (a small one), a one-line explanation of why it's empty, an action to fix it.
|
|
154
|
+
- Never show a generic "No results" with no context.
|
|
155
|
+
|
|
156
|
+
## Bans
|
|
157
|
+
|
|
158
|
+
- Placeholder-as-label.
|
|
159
|
+
- Hover-only functionality (touch users can't hover).
|
|
160
|
+
- Focus rings removed without replacement.
|
|
161
|
+
- Confirmation dialogs for low-stakes actions.
|
|
162
|
+
- Touch targets < 44px.
|
|
163
|
+
- Custom cursors on interactive elements.
|
|
164
|
+
- Disabled elements with no explanation of why they're disabled.
|
|
165
|
+
- Colour-only error states.
|
|
166
|
+
- Spinners where a skeleton would show layout.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Contrast discipline
|
|
171
|
+
|
|
172
|
+
Hallmark output must pass slop-test gates 46–50 before shipping. Compute contrast for every `(color, background-color)` pair on the page. The common failures Hallmark output trips on:
|
|
173
|
+
|
|
174
|
+
1. **Text on a flipped surface.** `.section--ink { background: var(--color-ink); }` flips the surface dark; nested text still inherits `color: var(--color-ink)` → ink-on-ink. Fix: any rule that sets a dark `background` must *also* set `color: var(--color-paper)` in the same rule.
|
|
175
|
+
2. **Button text on accent fill.** `background: var(--color-accent); color: white;` — but white is 4.5:1 against this accent only if `--color-accent` is dark enough. Use `var(--color-accent-ink)` instead, which the theme guarantees passes ≥ APCA Lc 60.
|
|
176
|
+
3. **Muted text on tinted paper.** `color: var(--color-muted); background: var(--color-paper-3);` — both mid-lightness, often falls below 4.5:1. Use `--color-neutral` (darker) or lift the background to `--color-paper`.
|
|
177
|
+
4. **Focus ring on accent-coloured button.** `outline: 2px solid var(--color-focus);` on a button whose fill is `--color-accent` — if `--color-focus = --color-accent`, the ring vanishes. Use the contrast pair: `--color-focus` set to a colour with ≥ 3:1 against both the element and the page.
|
|
178
|
+
|
|
179
|
+
### Computation
|
|
180
|
+
|
|
181
|
+
For each `(text-colour, background-colour)` pair the page actually renders:
|
|
182
|
+
|
|
183
|
+
- Run **APCA Lc** (preferred — perceptual) or **WCAG 2.1 ratio**.
|
|
184
|
+
- Pre-check: if both are in OKLCH with `|L_a − L_b| < 50 %`, flag for full check.
|
|
185
|
+
- Body text passes at **APCA Lc ≥ 60** ≈ WCAG 4.5:1.
|
|
186
|
+
- Large text / focus rings / icons pass at **APCA Lc ≥ 45** ≈ WCAG 3:1.
|
|
187
|
+
|
|
188
|
+
### Token contract
|
|
189
|
+
|
|
190
|
+
Every theme MUST define `--color-accent-ink` — the text colour to use whenever `--color-accent` fills a surface that carries text. The accent-ink colour is verified ≥ APCA Lc 60 against the accent at the time the theme is built. Hallmark code that uses `background: var(--color-accent)` must also set `color: var(--color-accent-ink)`. Falling back to hardcoded `color: white` is a tell — the theme's accent could be a light colour, and white-on-light is the bug.
|
|
191
|
+
|
|
192
|
+
### When the surface flips
|
|
193
|
+
|
|
194
|
+
The rule: **any rule that overrides `background-color` must also state the appropriate `color`.** Don't rely on inheritance for surface-flipping classes. Example:
|
|
195
|
+
|
|
196
|
+
```css
|
|
197
|
+
/* WRONG — text inherits color: var(--color-ink); section is now dark; ink-on-ink */
|
|
198
|
+
.section--manifesto { background: var(--color-ink); }
|
|
199
|
+
|
|
200
|
+
/* RIGHT */
|
|
201
|
+
.section--manifesto {
|
|
202
|
+
background: var(--color-ink);
|
|
203
|
+
color: var(--color-paper);
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Same applies to per-theme overrides like `[data-theme="manifesto"] .vs__col:first-child { background: var(--color-ink); }` — set `color: var(--color-paper)` at the same time, OR declare the rule on a parent and let descendants inherit explicitly.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Layout and space
|
|
2
|
+
|
|
3
|
+
Layout is where "AI-generated" gets caught. Equal columns, everything centred, every card identical — these are the tells.
|
|
4
|
+
|
|
5
|
+
## Principles
|
|
6
|
+
|
|
7
|
+
- A layout has a **primary axis**. Left-biased, right-biased, top-heavy, or bottom-weighted. Centre-biased is a default, not a choice.
|
|
8
|
+
- **Asymmetry reads as intentional.** Symmetry reads as generated. When in doubt, shift.
|
|
9
|
+
- **Spacing is a scale, not a value.** Pick one scale. Use it everywhere. Don't type raw px.
|
|
10
|
+
- **Varied spacing.** If every gap is 24px, the page is a template. Mix small, medium, and large gaps within the same layout.
|
|
11
|
+
- **Break the grid on purpose.** A page with one element crossing the grid is stronger than a page that never does.
|
|
12
|
+
|
|
13
|
+
## The spacing scale
|
|
14
|
+
|
|
15
|
+
4pt base. Nine steps. Named by role, not size.
|
|
16
|
+
|
|
17
|
+
```css
|
|
18
|
+
:root {
|
|
19
|
+
--space-3xs: 0.125rem; /* 2px */
|
|
20
|
+
--space-2xs: 0.25rem; /* 4px */
|
|
21
|
+
--space-xs: 0.5rem; /* 8px */
|
|
22
|
+
--space-sm: 0.75rem; /* 12px */
|
|
23
|
+
--space-md: 1rem; /* 16px */
|
|
24
|
+
--space-lg: 1.5rem; /* 24px */
|
|
25
|
+
--space-xl: 2.5rem; /* 40px */
|
|
26
|
+
--space-2xl: 4rem; /* 64px */
|
|
27
|
+
--space-3xl: 6rem; /* 96px */
|
|
28
|
+
--space-4xl: 9rem; /* 144px */
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- Use `gap` for sibling spacing. It's cleaner than stacked margins, it participates in flex/grid, and it collapses predictably.
|
|
33
|
+
- Use `margin` only for optical adjustments or breaking out of the flow. Never `margin` for a list of siblings.
|
|
34
|
+
|
|
35
|
+
## Grids
|
|
36
|
+
|
|
37
|
+
- **Prefer CSS Grid** for page layout, **Flexbox** for component internals.
|
|
38
|
+
- `grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))` for fluid responsive grids without media queries.
|
|
39
|
+
- **Don't default to 3 columns of equal cards with icon-above-heading-above-copy.** This is *the* AI feature-grid. Break it: vary column widths with `grid-template-columns: 1.2fr 1fr 0.8fr`, or use a 12-column underlying grid and give each item a different span, or use 4-up with a 2-span hero, etc.
|
|
40
|
+
- Use **named grid areas** for complex layouts and rename them at breakpoints.
|
|
41
|
+
|
|
42
|
+
## Asymmetry techniques
|
|
43
|
+
|
|
44
|
+
- **Wide left margin.** Treat the left as a permanent negative space — narrow column of labels, wide column of content. **Labels must NOT be section eyebrows / numbers paired with the heading** — that's gate-66-banned. Reserve this technique for body-level micro-labels (caption, footnote, date) alongside body copy.
|
|
45
|
+
- **Hanging headers.** ⚠️ **Opt-in only.** Section labels sit in the left margin; content flows to the right. Permitted only when the user explicitly asks for an editorial / hanging-header layout AND no eyebrow / number / chapter tag sits in the left margin. The eyebrow-left / heading-right pattern is banned by slop-test gate 66 — it's the most reliable templated-editorial AI tell. Default to a stacked single-column section head.
|
|
46
|
+
- **Offset grids.** Odd columns wider than even. Or the other way.
|
|
47
|
+
- **Grid-breaks.** One element that deliberately extends past a column boundary: a pull-quote, a photograph, a rule, a number.
|
|
48
|
+
- **Generous top, tight bottom** (or vice-versa). Sections don't need to be evenly padded.
|
|
49
|
+
|
|
50
|
+
## Depth
|
|
51
|
+
|
|
52
|
+
- Depth is **weight and scale**, not shadow. A heavier weight, a larger size, a warmer hue — these create hierarchy better than drop shadows.
|
|
53
|
+
- If you use shadow, use one:
|
|
54
|
+
- **Whisper** — `0 1px 2px oklch(20% 0.01 <hue> / 0.05)` for hovering cards.
|
|
55
|
+
- **Hairline** — `0 0 0 1px oklch(30% 0.01 <hue> / 0.06)` as an alternative to a 1px border.
|
|
56
|
+
- Never stack multiple shadows. Never use a coloured glow on a light background.
|
|
57
|
+
- Z-index has **six levels, named.** Don't freestyle numbers.
|
|
58
|
+
|
|
59
|
+
```css
|
|
60
|
+
:root {
|
|
61
|
+
--z-base: 1;
|
|
62
|
+
--z-raised: 10;
|
|
63
|
+
--z-dropdown: 100;
|
|
64
|
+
--z-sticky: 200;
|
|
65
|
+
--z-modal: 400;
|
|
66
|
+
--z-toast: 500;
|
|
67
|
+
--z-tooltip: 600;
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Bans
|
|
72
|
+
|
|
73
|
+
- **Centre-aligned everything.** Headings + body + CTA all centred is the landing-page template every LLM emits.
|
|
74
|
+
- **`min-height: 100vh` hero with one centred sentence.** Stop.
|
|
75
|
+
- **Card-in-card.** A bordered container inside a bordered container. Pick one.
|
|
76
|
+
- **Identical feature grid.** Three columns, three icons, three two-line headings, three three-line bodies. Change *something*.
|
|
77
|
+
- **Equal padding on everything.** If the card padding equals the section padding equals the page padding, the rhythm is flat.
|
|
78
|
+
- **`z-index: 9999`** and other ad-hoc z values. Use the scale.
|
|
79
|
+
- **Shadow-on-dark accidental glow.** A drop shadow on a dark card creates a glow; that's wrong.
|
|
80
|
+
|
|
81
|
+
## Page-edge clipping
|
|
82
|
+
|
|
83
|
+
The clipped-edge enrichment archetype (E1) — and any other deliberately overflowing element (full-bleed marquee, oversized headline that exceeds the viewport on small screens, a tilted figure that pushes past a column) — needs a parent that *visually* shows the overflow without letting the document scroll horizontally.
|
|
84
|
+
|
|
85
|
+
The default is unsafe: a `width: calc(100% + 12vw)` figure inside a section with `overflow: visible` makes the document scroll horizontally on every viewport. The page feels broken on touch devices. Slop-test gate 36 fails on this.
|
|
86
|
+
|
|
87
|
+
**Always pair clipped-edge with a global clip.** At the top of the stylesheet:
|
|
88
|
+
|
|
89
|
+
```css
|
|
90
|
+
html { overflow-x: clip; }
|
|
91
|
+
body { overflow-x: clip; } /* fallback for older Safari */
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Use `overflow-x: clip` rather than `overflow-x: hidden`:
|
|
95
|
+
|
|
96
|
+
- `clip` preserves `position: sticky` and `position: fixed` on descendants.
|
|
97
|
+
- `hidden` creates a new scroll container, which breaks sticky and can trap focus on overflowing inputs.
|
|
98
|
+
|
|
99
|
+
The clipped-edge mockup keeps its visual extension; the page no longer scrolls horizontally. Same pattern works for full-bleed marquees, oversized headlines, and any deliberately-decorative overflow.
|
|
100
|
+
|
|
101
|
+
The hero or section that *contains* the overflowing element keeps `overflow: visible` (so the figure renders past the parent edge); the global clip on `html` and `body` is the only safety net needed.
|
|
102
|
+
|
|
103
|
+
## When in doubt
|
|
104
|
+
|
|
105
|
+
If the layout looks fine but flat, do one of these before shipping:
|
|
106
|
+
|
|
107
|
+
1. Add one break-out element.
|
|
108
|
+
2. Unbalance a column width.
|
|
109
|
+
3. Move the primary CTA out of the centre.
|
|
110
|
+
4. Remove a card and replace it with negative space.
|
|
111
|
+
5. Change one section's padding so the rhythm is uneven.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
## 01 · Bento Grid
|
|
2
|
+
|
|
3
|
+
Modular blocks of varying sizes laid out as an irregular grid. Each block is a feature, a quote, an image, a stat. Visual rhythm comes from size variation, not card uniformity.
|
|
4
|
+
|
|
5
|
+
- **Heading:** centered display in a fixed-height hero (not full viewport).
|
|
6
|
+
- **Body:** asymmetric grid — 8–15 blocks of mixed spans (1×1, 2×1, 1×2, 2×2).
|
|
7
|
+
- **Divider:** consistent 12–24 px gap; no rules; the grid itself is the rhythm.
|
|
8
|
+
- **Button:** outlined chip on the hero; tile-internal CTAs as typographic links.
|
|
9
|
+
- **Image:** tightly cropped inside individual blocks; never full-bleed.
|
|
10
|
+
- **Reveal:** none, or a subtle one-shot fade on grid-tile entry.
|
|
11
|
+
|
|
12
|
+
Reach for it when the brief is "many small things to show", a feature page, a SaaS landing, or anywhere users have multiple equally-valid entry points.
|
|
13
|
+
|
|
14
|
+
Avoid when the message is a single hero idea — Bento spreads attention; one-idea pages need Marquee or Stat-Led.
|
|
15
|
+
|
|
16
|
+
Reference: Apple in-page sections, Framer feature pages, Tailwind UI templates.
|
|
17
|
+
|
|
18
|
+
**Sample opening lines** (imitate the *specificity*, not the wording):
|
|
19
|
+
> *"Tracejam · v0.4 · for SREs. Distributed tracing that explains itself."* — paraphrased from real observability tools
|
|
20
|
+
> *"Resend is the email API for developers. Send transactional and marketing emails at scale."* — resend.com
|
|
21
|
+
> *"The product development system for teams and agents."* — linear.app
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<header class="hero-fixed">…</header>
|
|
25
|
+
<section class="bento">
|
|
26
|
+
<article class="cell span-2x2">…</article> <!-- hero feature -->
|
|
27
|
+
<article class="cell span-1x1">…</article>
|
|
28
|
+
<article class="cell span-2x1">…</article> <!-- wide stat -->
|
|
29
|
+
<article class="cell span-1x2">…</article> <!-- tall image -->
|
|
30
|
+
<article class="cell span-1x1">…</article>
|
|
31
|
+
<article class="cell span-1x1">…</article>
|
|
32
|
+
</section>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
## 02 · Long Document
|
|
2
|
+
|
|
3
|
+
Reads like a memo, a letter, or a journal entry. No marketing structure. Continuous prose with inline section heads. The page is *literature* about the product.
|
|
4
|
+
|
|
5
|
+
- **Heading:** inline with body — section heads emerge from the paragraph flow as small caps or bold short phrases.
|
|
6
|
+
- **Body:** single column, generous line-height (1.65+), measure 60–65ch.
|
|
7
|
+
- **Divider:** negative space; the gap is the divider; occasionally a centered ornament for emphasis.
|
|
8
|
+
- **Button:** typographic link inside a paragraph, not a separate block.
|
|
9
|
+
- **Image:** inline, sized to text measure; never full-bleed.
|
|
10
|
+
- **Reveal:** none. The page is just *there*.
|
|
11
|
+
|
|
12
|
+
Reach for it for case studies, founder posts, mission pages, products whose sale is *philosophical*. The brief is "tell a story", not "list features".
|
|
13
|
+
|
|
14
|
+
Avoid when there's a single decisive action to take — Long Document hides CTAs, which is wrong for transactional pages.
|
|
15
|
+
|
|
16
|
+
Reference: Frank Chimero's site, destroytoday.com, long-form Substack essays in product disguise.
|
|
17
|
+
|
|
18
|
+
**Sample opening lines** (imitate the *specificity*, not the wording):
|
|
19
|
+
> *"Saturday, 6:14 a.m. The dough went in at midnight."* — opens with a time-stamp; the brand introduces itself as a moment in the day
|
|
20
|
+
> *"A monthly art publication featuring contributions by some of the most engaged thinkers working today."* — e-flux.com/journal
|
|
21
|
+
> *"We design everything for everyone."* — pentagram.com — refusal of the verb, treats design as universal practice
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<article class="prose">
|
|
25
|
+
<p class="lede">…</p>
|
|
26
|
+
<p>…</p>
|
|
27
|
+
<h2 class="inline">A small heading.</h2>
|
|
28
|
+
<p>…</p>
|
|
29
|
+
<blockquote>…</blockquote>
|
|
30
|
+
<p>… <a href="">read more →</a> …</p>
|
|
31
|
+
</article>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
## 03 · Marquee Hero
|
|
2
|
+
|
|
3
|
+
The hero IS the page above the fold. A single bold statement or visual fills the viewport. No subhead, no CTA in fold. Below the fold the page becomes something else (a list, a grid, prose).
|
|
4
|
+
|
|
5
|
+
- **Heading:** display fills the fold — 8–14 vw type, hugging the viewport edges.
|
|
6
|
+
- **Body:** below-fold becomes a list of work or a single content block; the hero doesn't continue.
|
|
7
|
+
- **Divider:** a thick rule between hero and below-fold, OR a hard colour change.
|
|
8
|
+
- **Button:** none in fold; first CTA arrives below.
|
|
9
|
+
- **Image:** none in fold (typography is the visual), OR a single full-bleed photograph as the fold *background*.
|
|
10
|
+
- **Reveal:** the fold is static; below-fold may sweep in horizontally.
|
|
11
|
+
|
|
12
|
+
Reach for it when the brand or person *is* the message — designer/director portfolios, indie products with a single declarative voice, any "this is who we are" page.
|
|
13
|
+
|
|
14
|
+
Avoid for products whose value requires explanation in seconds. Marquee makes the user scroll before they understand.
|
|
15
|
+
|
|
16
|
+
Reference: 14islands.com, destroytoday.com, many design studio homepages.
|
|
17
|
+
|
|
18
|
+
**Sample opening lines** (imitate the *specificity*, not the wording):
|
|
19
|
+
> *"Type, set with care."* — Hallmark Specimen — refusal of the verb, treats type as material
|
|
20
|
+
> *"A studio for what's next."* — italic editorial display, names the practice without explaining it
|
|
21
|
+
> *"Design like print: warm, off-register, intentional."* — Hallmark Riso — declarative, three modifiers, full stop
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<section class="marquee">
|
|
25
|
+
<h1 class="display-xxl">A statement.</h1>
|
|
26
|
+
</section>
|
|
27
|
+
<hr class="rule-thick" />
|
|
28
|
+
<section class="below-fold">…</section>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
## 04 · Stat-Led
|
|
2
|
+
|
|
3
|
+
The hero is a giant number — a metric, a count, a percentage. Everything that follows supports or qualifies it. Data is the narrative.
|
|
4
|
+
|
|
5
|
+
- **Heading:** numeric display (8–12 rem), tabular figures, small qualifier line below.
|
|
6
|
+
- **Body:** sections each anchored by a supporting stat or chart.
|
|
7
|
+
- **Divider:** hairline rules between stat blocks; tabular-nums everywhere.
|
|
8
|
+
- **Button:** outlined chip aligned beneath the qualifier.
|
|
9
|
+
- **Image:** charts and small data-viz; no photography.
|
|
10
|
+
- **Reveal:** number-tick on the hero figure — counter from 0 to target over ~500 ms.
|
|
11
|
+
|
|
12
|
+
Reach for it when the brief is "we have proof in numbers" — enterprise/B2B, fundraising platforms, climate or impact pages.
|
|
13
|
+
|
|
14
|
+
Avoid for products without a defensible single metric. A fake big number is worse than no number.
|
|
15
|
+
|
|
16
|
+
Reference: Ahrefs, Stripe Sessions stat blocks, climate-impact dashboards, venture firm portfolio pages.
|
|
17
|
+
|
|
18
|
+
**Sample opening lines** (imitate the *specificity*, not the wording — the number does the work):
|
|
19
|
+
> *"+47% · faster · decide late."* — italicised number, three-word qualifier
|
|
20
|
+
> *"4 seconds. From the alert link to the slow span."* — pairs the number with what it bought
|
|
21
|
+
> *"434 total posts. New CSS you feel like you could use today."* — adam argyle, nerdy.dev — the count grounds the page in real volume
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<section class="stat-hero">
|
|
25
|
+
<div class="figure tnum">99.97<span class="unit">%</span></div>
|
|
26
|
+
<p class="qualifier">uptime across 2026, measured externally.</p>
|
|
27
|
+
<a class="cta-outline">Read the report →</a>
|
|
28
|
+
</section>
|
|
29
|
+
<section class="supporting-stats">…</section>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
## 05 · Workbench
|
|
2
|
+
|
|
3
|
+
Product screenshots in frames are the primary content. The page is a guided tour of the app in use. Less marketing copy, more "here's what you do with it."
|
|
4
|
+
|
|
5
|
+
- **Heading:** small, functional — workbench pages don't shout.
|
|
6
|
+
- **Body:** sequence of screenshot blocks, each with a short caption and an inline annotation arrow.
|
|
7
|
+
- **Divider:** the screenshot frame *is* the divider; sections separate by gap and frame.
|
|
8
|
+
- **Button:** sticky-bottom CTA bar after the third screenshot ("Try it →"), once context is built.
|
|
9
|
+
- **Image:** central — browser/device frames around real product captures, with annotation arrows.
|
|
10
|
+
- **Reveal:** type-unmask on captions; screenshots load instantly.
|
|
11
|
+
|
|
12
|
+
Reach for it for SaaS, developer tools, IDE extensions — anywhere seeing the product in motion is the sale.
|
|
13
|
+
|
|
14
|
+
Avoid when the product is conceptual or services-led. Workbench needs a UI to show.
|
|
15
|
+
|
|
16
|
+
Reference: Linear.app, Vercel, Raycast, Arc Browser.
|
|
17
|
+
|
|
18
|
+
**Sample opening lines** (imitate the *specificity*, not the wording — the page walks the user through):
|
|
19
|
+
> *"$ streampipe parse access.log --filter status=5xx | jq"* — open on a real command, not a marketing claim
|
|
20
|
+
> *"Read anything that emits lines. Files, pipes, sockets, kubectl logs."* — names the inputs, refuses abstraction
|
|
21
|
+
> *"Open the trace, find the span, fix the regression. No glossary required."* — three concrete verbs, then a refusal
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<header class="lite">…</header>
|
|
25
|
+
<section class="screenshot-frame">
|
|
26
|
+
<figure><img src="step-1.png" /><figcaption>Open a project.</figcaption></figure>
|
|
27
|
+
</section>
|
|
28
|
+
<section class="screenshot-frame">…</section>
|
|
29
|
+
<aside class="sticky-cta">Try it free →</aside>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|