agemon 0.1.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +732 -28
  2. package/assets/skills/architecture/agemon-architecture/LICENSE +21 -0
  3. package/assets/skills/architecture/agemon-architecture/NOTICE.md +9 -0
  4. package/assets/skills/architecture/agemon-architecture/SKILL.md +275 -0
  5. package/assets/skills/code-quality/agemon-clean-code/LICENSE +21 -0
  6. package/assets/skills/code-quality/agemon-clean-code/NOTICE.md +9 -0
  7. package/assets/skills/code-quality/agemon-clean-code/SKILL.md +78 -0
  8. package/assets/skills/code-quality/agemon-house-rules/SKILL.md +103 -0
  9. package/assets/skills/commit/agemon-commit/SKILL.md +87 -0
  10. package/assets/skills/design/agemon-design/LICENSE +21 -0
  11. package/assets/skills/design/agemon-design/NOTICE.md +9 -0
  12. package/assets/skills/design/agemon-design/SKILL.md +391 -0
  13. package/assets/skills/design/agemon-design/references/accessibility.md +182 -0
  14. package/assets/skills/design/agemon-design/references/agents.md +63 -0
  15. package/assets/skills/design/agemon-design/references/ai-chat.md +158 -0
  16. package/assets/skills/design/agemon-design/references/brief.md +186 -0
  17. package/assets/skills/design/agemon-design/references/color.md +216 -0
  18. package/assets/skills/design/agemon-design/references/components.md +91 -0
  19. package/assets/skills/design/agemon-design/references/copy.md +300 -0
  20. package/assets/skills/design/agemon-design/references/craft-intent.md +160 -0
  21. package/assets/skills/design/agemon-design/references/dashboard.md +131 -0
  22. package/assets/skills/design/agemon-design/references/dataviz.md +197 -0
  23. package/assets/skills/design/agemon-design/references/finish-bar.md +243 -0
  24. package/assets/skills/design/agemon-design/references/forms.md +192 -0
  25. package/assets/skills/design/agemon-design/references/heuristics.md +403 -0
  26. package/assets/skills/design/agemon-design/references/inspiration.md +287 -0
  27. package/assets/skills/design/agemon-design/references/layout.md +236 -0
  28. package/assets/skills/design/agemon-design/references/loops.md +155 -0
  29. package/assets/skills/design/agemon-design/references/metadata.md +98 -0
  30. package/assets/skills/design/agemon-design/references/modern-css.md +448 -0
  31. package/assets/skills/design/agemon-design/references/motion.md +434 -0
  32. package/assets/skills/design/agemon-design/references/personas.md +206 -0
  33. package/assets/skills/design/agemon-design/references/principles-catalog.md +299 -0
  34. package/assets/skills/design/agemon-design/references/recipe-auth.md +88 -0
  35. package/assets/skills/design/agemon-design/references/recipe-dashboard.md +130 -0
  36. package/assets/skills/design/agemon-design/references/recipe-landing.md +122 -0
  37. package/assets/skills/design/agemon-design/references/responsive.md +168 -0
  38. package/assets/skills/design/agemon-design/references/review.md +340 -0
  39. package/assets/skills/design/agemon-design/references/sound.md +150 -0
  40. package/assets/skills/design/agemon-design/references/spec.md +123 -0
  41. package/assets/skills/design/agemon-design/references/stack.md +522 -0
  42. package/assets/skills/design/agemon-design/references/state-design.md +188 -0
  43. package/assets/skills/design/agemon-design/references/themes.md +229 -0
  44. package/assets/skills/design/agemon-design/references/tokens.md +350 -0
  45. package/assets/skills/design/agemon-design/references/typography.md +246 -0
  46. package/assets/skills/design/agemon-design-dashboard/LICENSE +21 -0
  47. package/assets/skills/design/agemon-design-dashboard/NOTICE.md +9 -0
  48. package/assets/skills/design/agemon-design-dashboard/SKILL.md +113 -0
  49. package/assets/skills/design/agemon-design-editorial/LICENSE +21 -0
  50. package/assets/skills/design/agemon-design-editorial/NOTICE.md +9 -0
  51. package/assets/skills/design/agemon-design-editorial/SKILL.md +98 -0
  52. package/assets/skills/design/agemon-design-minimal/LICENSE +21 -0
  53. package/assets/skills/design/agemon-design-minimal/NOTICE.md +9 -0
  54. package/assets/skills/design/agemon-design-minimal/SKILL.md +97 -0
  55. package/assets/skills/geo-seo/geo/LICENSE +21 -0
  56. package/assets/skills/geo-seo/geo/NOTICE.md +18 -0
  57. package/assets/skills/geo-seo/geo/SKILL.md +145 -0
  58. package/assets/skills/geo-seo/geo-audit/LICENSE +21 -0
  59. package/assets/skills/geo-seo/geo-audit/NOTICE.md +17 -0
  60. package/assets/skills/geo-seo/geo-audit/SKILL.md +371 -0
  61. package/assets/skills/geo-seo/geo-audit/references/ai-visibility.md +233 -0
  62. package/assets/skills/geo-seo/geo-audit/references/content.md +329 -0
  63. package/assets/skills/geo-seo/geo-audit/references/platform-analysis.md +294 -0
  64. package/assets/skills/geo-seo/geo-audit/references/schema.md +383 -0
  65. package/assets/skills/geo-seo/geo-audit/references/technical.md +368 -0
  66. package/assets/skills/geo-seo/geo-brand-mentions/LICENSE +21 -0
  67. package/assets/skills/geo-seo/geo-brand-mentions/NOTICE.md +15 -0
  68. package/assets/skills/geo-seo/geo-brand-mentions/SKILL.md +459 -0
  69. package/assets/skills/geo-seo/geo-citability/LICENSE +21 -0
  70. package/assets/skills/geo-seo/geo-citability/NOTICE.md +14 -0
  71. package/assets/skills/geo-seo/geo-citability/SKILL.md +320 -0
  72. package/assets/skills/geo-seo/geo-content/LICENSE +21 -0
  73. package/assets/skills/geo-seo/geo-content/NOTICE.md +14 -0
  74. package/assets/skills/geo-seo/geo-content/SKILL.md +352 -0
  75. package/assets/skills/geo-seo/geo-crawlers/LICENSE +21 -0
  76. package/assets/skills/geo-seo/geo-crawlers/NOTICE.md +15 -0
  77. package/assets/skills/geo-seo/geo-crawlers/SKILL.md +388 -0
  78. package/assets/skills/geo-seo/geo-llmstxt/LICENSE +21 -0
  79. package/assets/skills/geo-seo/geo-llmstxt/NOTICE.md +14 -0
  80. package/assets/skills/geo-seo/geo-llmstxt/SKILL.md +433 -0
  81. package/assets/skills/geo-seo/geo-platform-optimizer/LICENSE +21 -0
  82. package/assets/skills/geo-seo/geo-platform-optimizer/NOTICE.md +14 -0
  83. package/assets/skills/geo-seo/geo-platform-optimizer/SKILL.md +282 -0
  84. package/assets/skills/geo-seo/geo-report/LICENSE +21 -0
  85. package/assets/skills/geo-seo/geo-report/NOTICE.md +14 -0
  86. package/assets/skills/geo-seo/geo-report/SKILL.md +406 -0
  87. package/assets/skills/geo-seo/geo-report-pdf/LICENSE +21 -0
  88. package/assets/skills/geo-seo/geo-report-pdf/NOTICE.md +20 -0
  89. package/assets/skills/geo-seo/geo-report-pdf/SKILL.md +153 -0
  90. package/assets/skills/geo-seo/geo-report-pdf/templates/geo-report-template.html +548 -0
  91. package/assets/skills/geo-seo/geo-schema/LICENSE +21 -0
  92. package/assets/skills/geo-seo/geo-schema/NOTICE.md +16 -0
  93. package/assets/skills/geo-seo/geo-schema/SKILL.md +396 -0
  94. package/assets/skills/geo-seo/geo-technical/LICENSE +21 -0
  95. package/assets/skills/geo-seo/geo-technical/NOTICE.md +15 -0
  96. package/assets/skills/geo-seo/geo-technical/SKILL.md +566 -0
  97. package/assets/skills/performance/agemon-performance/NOTICE.md +1 -0
  98. package/assets/skills/performance/agemon-performance/SKILL.md +76 -0
  99. package/assets/skills/security/agemon-security/LICENSE +21 -0
  100. package/assets/skills/security/agemon-security/NOTICE.md +8 -0
  101. package/assets/skills/security/agemon-security/SKILL.md +356 -0
  102. package/assets/skills/self-review/agemon-review-intake/LICENSE +21 -0
  103. package/assets/skills/self-review/agemon-review-intake/NOTICE.md +9 -0
  104. package/assets/skills/self-review/agemon-review-intake/SKILL.md +205 -0
  105. package/assets/skills/self-review/agemon-review-request/LICENSE +21 -0
  106. package/assets/skills/self-review/agemon-review-request/NOTICE.md +9 -0
  107. package/assets/skills/self-review/agemon-review-request/SKILL.md +104 -0
  108. package/assets/skills/self-review/agemon-review-request/code-reviewer.md +188 -0
  109. package/assets/skills/self-review/agemon-root-cause/LICENSE +21 -0
  110. package/assets/skills/self-review/agemon-root-cause/NOTICE.md +10 -0
  111. package/assets/skills/self-review/agemon-root-cause/SKILL.md +283 -0
  112. package/assets/skills/self-review/agemon-root-cause/condition-based-waiting-example.ts +158 -0
  113. package/assets/skills/self-review/agemon-root-cause/condition-based-waiting.md +115 -0
  114. package/assets/skills/self-review/agemon-root-cause/defense-in-depth.md +122 -0
  115. package/assets/skills/self-review/agemon-root-cause/find-polluter.sh +72 -0
  116. package/assets/skills/self-review/agemon-root-cause/root-cause-tracing.md +169 -0
  117. package/assets/skills/self-review/agemon-root-cause/test-academic.md +14 -0
  118. package/assets/skills/self-review/agemon-root-cause/test-pressure-1.md +58 -0
  119. package/assets/skills/self-review/agemon-root-cause/test-pressure-2.md +68 -0
  120. package/assets/skills/self-review/agemon-root-cause/test-pressure-3.md +69 -0
  121. package/assets/skills/self-review/agemon-verify-before-done/LICENSE +21 -0
  122. package/assets/skills/self-review/agemon-verify-before-done/NOTICE.md +9 -0
  123. package/assets/skills/self-review/agemon-verify-before-done/SKILL.md +120 -0
  124. package/assets/skills/team-lead/agemon-plan-rfc/SKILL.md +317 -0
  125. package/assets/skills/team-lead/prd-generator/SKILL.md +437 -0
  126. package/assets/skills/team-lead/skill-headofit-audit/SKILL.md +72 -0
  127. package/assets/skills/team-lead/skill-incident-rca/SKILL.md +66 -0
  128. package/assets/skills/team-lead/skill-meeting-lifecycle/SKILL.md +63 -0
  129. package/assets/skills/team-lead/skill-obsidian-vault-sync/SKILL.md +69 -0
  130. package/assets/skills/team-lead/skill-prd-decomposer/SKILL.md +71 -0
  131. package/assets/skills/team-lead/skill-sec-check/SKILL.md +70 -0
  132. package/assets/skills/team-lead/skill-task-extractor/SKILL.md +79 -0
  133. package/assets/skills/team-lead/skill-tech-spike/SKILL.md +57 -0
  134. package/assets/skills/team-lead/skill-techlead-reviewer/SKILL.md +81 -0
  135. package/assets/tools/code-review-graph-constraints.txt +1418 -0
  136. package/assets/tools/package-lock.json +111 -0
  137. package/assets/tools/package.json +6 -0
  138. package/dist/chunk-5LATHJYU.js +4026 -0
  139. package/dist/chunk-5LATHJYU.js.map +1 -0
  140. package/dist/fake-subprocess-2BETWZVZ.js +666 -0
  141. package/dist/fake-subprocess-2BETWZVZ.js.map +1 -0
  142. package/dist/index.js +21101 -1956
  143. package/dist/index.js.map +1 -1
  144. package/package.json +30 -17
@@ -0,0 +1,122 @@
1
+ # Recipe: Landing Page
2
+
3
+ Outcome recipe for marketing landing pages — composition, section grammar, and the bar that makes the result publishable without a design retouch. Component rules live in [components.md](components.md), copy rules in [copy.md](copy.md), pattern evidence in [inspiration.md](inspiration.md). This file decides what to build and in what order.
4
+
5
+ **Who this serves:** zero-questions path → strong default. Designers treat the compositions as skeletons.
6
+
7
+ **Portfolios / case studies:** use this recipe with **DESIGN_VARIANCE 8** (craft-intent default) — variable grid aspects, one hero project above fold, asymmetric about/contact. Marketing patterns (§5) apply; default composition is often message-forward or proof-forward with editorial type.
8
+
9
+ **Load [craft-intent.md](craft-intent.md)** and [inspiration.md](inspiration.md) hero archetypes — apply marketing patterns (§5), default **DESIGN_VARIANCE 7** (6 for waitlist-only), pick **signature bet** from craft-intent §3 marketing list in the Craft Read.
10
+
11
+ ## Step 0 — Three inputs (defaults if unanswered)
12
+
13
+ | Input | Options | Default |
14
+ |---|---|---|
15
+ | What exists to show | live product (screenshots possible) / pre-launch (no product yet) / sales-led service | live product |
16
+ | Theme | a preset from [themes.md](themes.md) or existing brand tokens | brand tokens if present, else **Graphite** |
17
+ | One conversion action | trial signup / demo request / waitlist / purchase | trial signup |
18
+ | Variance | DESIGN_VARIANCE 1-10 | 7 (6 if pre-launch / waitlist only) |
19
+ | Signature bet | one from [craft-intent.md](craft-intent.md) §3 marketing list | hero crop or floating proof card |
20
+
21
+ The first answer selects the composition. One page, ONE conversion action — every section either advances it or gets cut.
22
+
23
+ ## Step 1 — Decide what the fold argues, then draw its geometry
24
+
25
+ Two decisions, in this order, and they are not the same decision. **What the fold argues** is yours to choose from the brief. **How it is laid out** is drawn, not chosen.
26
+
27
+ Until 2026-08-13 this section shipped three ASCII diagrams, one per strategy, and the first was labelled *default*. Its geometry was text one side and a visual the other — which is the `split` composition class, the one `fold_candidates` deliberately draws last because *"it is the fold every generator reaches for unprompted."* Measured across seven landing builds, every fold that got built was one of the three geometries those diagrams prescribed, and none was the class the draw had offered. A drawn class cannot introduce variety while this file ships the answer with a picture, so the pictures are gone and the content grammar stayed.
28
+
29
+ ### 1a — What it argues
30
+
31
+ | Strategy | Lead with | Fold carries |
32
+ |---|---|---|
33
+ | **Product-forward** — live product to show | the product doing its job | badge (what's new, or none) · H1 2-3 lines · sub ≤2 sentences · primary + ghost CTA · one micro-trust line · a real product shot, cropped at the fold **and** an edge · at most one floating mini-card over it (live metric, notification) for depth |
34
+ | **Message-forward** — pre-launch, waitlist, no product to show | the claim, in language | H1 as the largest thing on the page · sub one sentence · email input with the join CTA attached to it · proof placed off-centre on purpose (avatars + count one side, badge the other) · an abstract motif rather than a screenshot |
35
+ | **Proof-forward** — sales-led, B2B service | evidence before argument | compact H1 + sub + demo CTA · an outcome strip of exactly 3 specific metrics in large numerals · a case block: quote + attributed face + numbers · capability rows alternating beneath |
36
+
37
+ No strategy is a default. A brief with a live product picks product-forward; a brief without one cannot.
38
+
39
+ ### 1b — What it looks like
40
+
41
+ Call **`fold_candidates`** and commit to one of the classes it returns. Do not pick by taste: asking a model for a composition returns its default every time, which is how eight builds in a row produced the same hero. The draw is seeded per project, so two projects start somewhere different and one project stays reproducible.
42
+
43
+ The six classes are geometric and orthogonal to 1a — `type-only`, `full-bleed-overlay`, `split`, `stacked`, `product-dominant`, `band`. Most strategies can be built as most classes. The exclusions are the ones where the geometry cannot carry the argument:
44
+
45
+ - **product-forward** cannot be `type-only` — no visual means no product
46
+ - **message-forward** cannot be `product-dominant` — nothing to dominate with
47
+ - **proof-forward** cannot be `full-bleed-overlay` — one dominating image cannot hold three metrics and a case block
48
+
49
+ Anything else the draw offers is legitimate. If it draws a class that fights the brief for a reason not listed above, say which reason in the Craft Read and draw again — do not silently substitute the shape you had in mind.
50
+
51
+ ### 1c — Verify what you actually built
52
+
53
+ Render it and call **`check_fold` with `expected_class`** set to the class you committed to. Without that argument it reports what the fold *is* and cannot tell you whether it is what you intended — and it will say so rather than imply agreement.
54
+
55
+ If it reports drift, the geometry moved while you were writing. Fix the build to match the class, or record in the brief that the class changed and why. A declared class the code does not honour is worse than no declaration: it reads as compliance to anyone auditing the transcript.
56
+
57
+ Record the class in the brief's spent list ([brief.md](brief.md)) so the next landing in this project draws something else.
58
+
59
+ ### Hero discipline (all compositions)
60
+
61
+ The hero is a single moment, not a feature list. Hard limits:
62
+
63
+ - **Max 4 text elements:** one eyebrow/badge (or none), headline (≤2 lines desktop), subtext (≤20 words, ≤4 lines), CTAs (1 primary + ≤1 secondary). If the value prop needs more than 20 words of subtext, the value prop is unclear — fix the copy, not the limit.
64
+ - **Plan font scale and asset together.** Headline >6 words with a large hero shot → start at 48-60px, not 72-80px. A 4-line hero headline is always a font-size error.
65
+ - **Nothing else rides the hero:** trust micro-strips, pricing teasers, feature bullets, avatar rows, and the logo wall all live in dedicated sections **below** the fold line. One micro-trust line under the CTAs is the ceiling.
66
+ - **The headline starts 18-30% down the fold, not at the top.** This used to read "top padding cap ~96px", and that cap was wrong: on a 900px viewport it puts the headline at 11%, which is where a dense app starts its content, not a landing. Measured on four surfaces whose design is the reason people copy them, the first headline pixel lands at **19%, 20%, 24% and 64%** of the fold. 18-30% is the working band; above 30% is a deliberate, centred composition and needs the rest of the fold to be nearly empty to earn it. On 900px that is **160-270px of clear space** above the eyebrow — an amount that feels wrong while you are writing the CSS and correct the moment you look at the render.
67
+ - **Ink density in the fold: 15-35 text nodes.** The same four measured 16, 34, 34 and 88 — and the 88 is a page whose fold is 68% one product screenshot, so its text is concentrated inside that image. A fold with 50 separate text nodes is a dashboard. Count them: if the fold has more than ~35, something in it belongs to the section below.
68
+ - **The hero asset is 30-70% of the fold, or it is absent.** Measured: 68%, 32%, 31%, and one page with no hero image at all. What does not work is the middle: a 4:1 letterbox band or a small framed card reads as a placeholder for a real asset. Either give the product most of the fold and crop it at the edge, or commit to type alone.
69
+ - **No decorative cues:** no "Scroll to explore", no ↓ arrows, no version badges (BETA, v0.6) unless the brief is literally a launch announcement, no mono-caps decoration strips at the hero foot.
70
+
71
+ Order, each answering ONE question; spacing 80-160px between majors, varied:
72
+
73
+ 1. **Proof strip** — "do people like me use this?" Logos at low contrast + one specific stat ("teams cut X from 6h to 20min" beats "trusted by thousands").
74
+ 2. **Feature rows × 2-3** — "what does it do for me?" Asymmetric alternating rows with REAL visuals (chart, flow, screenshot detail). NEVER a uniform 3-column icon grid — that's the #1 template tell.
75
+ 3. **How it works / depth section** — "is it credible?" 3 steps max, or one technical diagram. Cut it if the product is self-evident.
76
+ 4. **Pricing teaser or full pricing** — "can I afford it?" See pricing block below.
77
+ 5. **Final CTA** — "ok, how do I start?" Restate the primary action + the micro-trust line. One section, not a wall.
78
+ 6. **Footer** — boring on purpose. Sitemap, legal, socials. Footers that try to be clever bury the links people need. No fake version stamps (`v1.4.2`, `Build 0048`) — those are devtool fixtures, not marketing content.
79
+
80
+ **Layout-family budget.** A layout family (3-column cards, split text+image, full-width quote, bento, marquee) appears **at most once per page**; a page with 8 sections needs ≥4 distinct families. Max 2 consecutive image+text splits — the third consecutive zigzag is a fail; break it with a full-width section, a vertical stack, or a bento. "Selected work" must not look like "What we do".
81
+
82
+ **Eyebrow budget.** Max 1 uppercase tracked micro-label per 3 sections (hero counts as one). Mechanical check: count `uppercase` + wide-tracking labels above headings; if count > ceil(sections / 3), delete eyebrows until it passes — the headline alone is enough.
83
+
84
+ **Imagery is not optional.** Marketing pages are visual products; a text-only page is incomplete work, not minimalism. Priority order: (1) real product shots / brand assets, (2) image-generation tool if available in the environment, (3) clearly-labeled placeholder slots plus a list for the user of what's needed — never div-built fake screenshots or hand-drawn decorative SVG scenes. Logo walls use real SVG marks (both themes); invented brands get a simple monogram mark, never styled text wordmarks. Logos only — no industry labels printed under each logo.
85
+
86
+ **Pricing block rules** (when present): highlight the recommended plan (border/badge/size) without making siblings look irrelevant; sticky column headers on long comparison tables; tooltips on hover for feature jargon; discounts shown as % under $100 and absolute amounts above (perceived size); charm pricing where the brand tolerates it; scarcity only if genuinely true — faked urgency reads instantly and burns trust.
87
+
88
+ ## Step 3 — Craft constraints (the ones landings break most)
89
+
90
+ - **CTA hierarchy is three levels that must not tie:** nav CTA ≠ hero primary ≠ section CTAs. Hero primary is the most prominent interactive element on the page ([components.md](components.md)).
91
+ - **Headline carries a dual benefit** where honest — immediate + long-term ("Answers today, confidence at month-end"). Front-load the key noun. No jargon: a stranger gets the value in one read.
92
+ - **One signature detail** — drawn underline on the key word, a custom marker, a motif from the brand mark. Exactly one.
93
+ - **Specific beats vague, everywhere:** metrics with units, named customers, real UI. Every "world-class/powerful/seamless" is a slot where evidence should be.
94
+ - **Gradients**: if used, adjacent hues only, plus subtle grain/noise to kill the flat plastic look. Never the purple-cyan template wash.
95
+ - **Copy budget:** no section over 2-3 sentences; CTAs are verb + outcome ("Start free trial", not "Get started" twice in different colors).
96
+
97
+ ## Step 4 — Build order
98
+
99
+ 1. Tokens (preset or brand) → 2. Nav + hero (squint test must pass with hero alone; then check the two numbers: headline top at 18-30% of the fold, and 4-6 distinct font sizes on the page with a 2.5x+ jump to display — see [typography.md](typography.md)) → 3. Proof strip → 4. Feature rows → 5. Pricing → 6. Final CTA + footer → 7. Responsive pass ([responsive.md](responsive.md) — hero stacks text-first on mobile, shot below, still cropped) → 8. Motion: entrances subtle, one scroll reveal per section max ([motion.md](motion.md)) → 9. Finish: [finish-bar.md](finish-bar.md) passes 1-4 + 8.
100
+
101
+ ## Acceptance bar — publishable without retouching?
102
+
103
+ - [ ] Squint test on the hero: H1 → primary CTA, in that order; nothing competes
104
+ - [ ] One conversion action; every section advances it
105
+ - [ ] Product/visual cropped at fold or edge (scroll tease); no visual floating in dead air
106
+ - [ ] CTA hierarchy: 3 distinct levels, no ties
107
+ - [ ] At least one specific, attributed proof point; zero unattributed superlatives
108
+ - [ ] No uniform icon-card grid anywhere
109
+ - [ ] Section spacing 80-160px, varied; every section answers one question
110
+ - [ ] One signature detail, exactly one
111
+ - [ ] Mobile: hero readable without zoom, CTAs thumb-reachable, no horizontal scroll
112
+ - [ ] Craft Read declared; variance and signature bet match the built page
113
+ - [ ] No two adjacent sections share the same layout structure; no layout family repeats; ≤2 consecutive image+text splits
114
+ - [ ] Hero discipline: ≤4 text elements, subtext ≤20 words, headline ≤2 lines, logo wall below the hero
115
+ - [ ] Eyebrow count ≤ ceil(sections / 3); no numbered section eyebrows; no scroll cues
116
+ - [ ] One CTA label per intent across the page (nav, hero, footer reuse the same words); every CTA fits one line at desktop and passes AA contrast on its own background
117
+ - [ ] Real imagery where the composition calls for it; no div-built fake screenshots; logo wall is real SVG marks
118
+ - [ ] `prefers-reduced-motion` honored; entrances ≤400ms; no scroll-jacking
119
+
120
+ ## Cross-refs
121
+
122
+ [inspiration.md](inspiration.md) observed patterns · [components.md](components.md) buttons, links, nav · [copy.md](copy.md) voice, CTAs, numbers · [themes.md](themes.md) presets · [recipe-dashboard.md](recipe-dashboard.md) when the hero shot needs a product UI worth showing
@@ -0,0 +1,168 @@
1
+ # Responsive & Adaptive Design
2
+
3
+ Adaptation is not just scaling — it's rethinking for each context.
4
+
5
+ ---
6
+
7
+ ## Breakpoint Strategy: Content-Driven (Preferred)
8
+
9
+ Add breakpoints where the content breaks, not at conventional device widths. Container queries are the preferred mechanism — components respond to their container, not to the viewport.
10
+
11
+ ```css
12
+ .card-container { container-type: inline-size; }
13
+
14
+ @container (min-width: 400px) {
15
+ .card { grid-template-columns: 1fr 2fr; }
16
+ }
17
+ ```
18
+
19
+ Use fluid sizing to eliminate most breakpoints entirely:
20
+
21
+ ```css
22
+ /* Fluid font: 16px at 320px → 20px at 1200px */
23
+ font-size: clamp(1rem, 0.5rem + 1.5vw, 1.25rem);
24
+
25
+ /* Fluid spacing */
26
+ padding: clamp(1rem, 2vw, 3rem);
27
+ ```
28
+
29
+ For full container query patterns — style queries, named containers, when to prefer container over media queries — see [modern-css.md](modern-css.md).
30
+
31
+ ---
32
+
33
+ ## Breakpoint Strategy: Device Reference (Fallback)
34
+
35
+ When the project's existing system uses device breakpoints, match it. The conventional ranges:
36
+
37
+ - Mobile: < 768px
38
+ - Tablet: 768–1023px
39
+ - Desktop: 1024px+
40
+
41
+ Use these only when integrating with an existing system. New code should prefer container queries (see above).
42
+
43
+ ### Verify Coverage
44
+
45
+ - Mobile, tablet, laptop, ultra-wide
46
+ - Portrait AND landscape
47
+ - Different browsers (Safari, Chrome, Firefox)
48
+ - iOS Low Power Mode, macOS Safari
49
+
50
+ ---
51
+
52
+ ## Mobile Adaptation (Desktop → Mobile)
53
+
54
+ ### Layout
55
+ - Single column (not multi-column)
56
+ - Vertical stacking
57
+ - Full-width components
58
+ - Bottom navigation (not top/side)
59
+
60
+ ### Interaction
61
+ - Touch targets **44x44px minimum**
62
+ - Swipe gestures only for reversible, spatially-implied actions — dismiss a sheet, page a carousel, reveal a row action. **Why:** a swipe leaves no visible affordance, so anything discovered only by swiping is undiscoverable to a first-time user, and anything destructive behind it is irreversible-by-accident. Every swipe needs a visible equivalent: a button, a menu item, or a drag handle.
63
+ - Bottom sheets instead of dropdowns
64
+ - **Thumbs-first design** — primary and navigational actions inside the bottom-center thumb zone; destructive or cancel actions deliberately OUTSIDE easy reach. **Why:** the thumb zone optimizes for the action you want repeated; placing "Delete" there optimizes for accidents.
65
+ - More spacing between interactive elements
66
+
67
+ ### Content
68
+ - **Progressive disclosure** — don't show everything at once
69
+ - Secondary content in tabs/accordions
70
+ - Shorter, more concise text
71
+ - Minimum **16px font size** (prevents iOS zoom)
72
+
73
+ ### Navigation
74
+ - Hamburger or bottom nav
75
+ - Reduce complexity
76
+ - Sticky headers for context
77
+ - Back button in flows
78
+
79
+ ---
80
+
81
+ ## Tablet Adaptation
82
+
83
+ - Two-column layouts (not single or three)
84
+ - Master-detail views (list + detail)
85
+ - Adaptive per orientation (portrait vs landscape)
86
+ - Support both touch and pointer
87
+ - Touch targets 44px but allow denser layouts than phone
88
+
89
+ ---
90
+
91
+ ## Desktop Adaptation (Mobile → Desktop)
92
+
93
+ ### Layout
94
+ - Multi-column (use horizontal space)
95
+ - Side navigation: always visible on desktop (1024px+). On tablet (768–1023px): collapse to icon rail or persistent narrow sidebar. On mobile: collapse to a drawer or bottom-nav pattern. **Why:** primary navigation must remain discoverable; visible-by-default at desktop trades screen real estate for discoverability, while mobile trades discoverability for content room — both are correct in their context.
96
+ - Multiple information panels
97
+ - Max-width constraints (don't stretch to 4K)
98
+
99
+ ### Interaction
100
+ - Hover states for additional info
101
+ - Keyboard shortcuts
102
+ - Right-click context menus
103
+ - Drag and drop, multi-select with Shift/Cmd
104
+
105
+ ### Content
106
+ - Show more info upfront (less progressive disclosure)
107
+ - Data tables with many columns
108
+ - Richer visualizations
109
+
110
+ ---
111
+
112
+ ## Responsive Grid (No Breakpoints)
113
+
114
+ ```css
115
+ .grid {
116
+ display: grid;
117
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
118
+ gap: var(--space-lg);
119
+ }
120
+ ```
121
+
122
+ ---
123
+
124
+ ## Responsive Images
125
+
126
+ ```html
127
+ <picture>
128
+ <source media="(min-width: 768px)" srcset="large.webp">
129
+ <img src="small.webp" alt="..." width="600" height="400" loading="lazy">
130
+ </picture>
131
+ ```
132
+
133
+ ---
134
+
135
+ ## Viewport Units
136
+
137
+ Use `dvh` instead of `100vh` or Tailwind's `h-screen` for any surface meant to fill the viewport. Mobile browsers change the visible viewport height as the URL bar shows and hides — `100vh` measures the *largest* possible viewport and locks to it, so a full-height hero or modal ends up taller than what's actually visible and the bottom gets clipped behind the browser chrome. `dvh` (dynamic viewport height) tracks the real, current viewport instead.
138
+
139
+ ---
140
+
141
+ ## Safe Areas
142
+
143
+ Any fixed or sticky element must respect `env(safe-area-inset-*)` on notched devices — a bottom nav bar or sticky CTA that ignores the inset sits under the home indicator or gets clipped by it.
144
+
145
+ ```css
146
+ .fixed-bottom {
147
+ padding-bottom: env(safe-area-inset-bottom);
148
+ }
149
+ ```
150
+
151
+ ---
152
+
153
+ ## Print Adaptation
154
+
155
+ - Remove navigation, footer, interactive elements
156
+ - Page breaks at logical points
157
+ - Expand shortened content (show full URLs)
158
+ - Black and white or limited color
159
+ - Add page numbers, headers, print date
160
+
161
+ ---
162
+
163
+ ## Never
164
+
165
+ - Don't hide core functionality on mobile — feature parity is the floor; if a feature is too complex for mobile, redesign the feature, don't hide it.
166
+ - Don't assume touch only on mobile — tablets and 2-in-1 laptops blur the line; design pointer-agnostic.
167
+ - Don't forget landscape orientation — mobile in landscape and tablet in portrait often have similar dimensions and need similar treatment.
168
+ - Don't ship horizontal scroll at any breakpoint without an explicit scroll affordance — accidental horizontal scroll is the most common AI-template responsive failure.
@@ -0,0 +1,340 @@
1
+ # UI Review & Critique
2
+
3
+ Systematic methodology for reviewing interface quality — visual design, interaction, accessibility, and performance.
4
+
5
+ ---
6
+
7
+ ## Feedback Hierarchy
8
+
9
+ Evaluate in order: Value → Ease of Use → Delight. Aesthetic feedback that arrives before Value and Ease is feedback misallocation — it tells the team to polish a thing that may not be solving the right problem, or polish a thing the user can't actually use.
10
+
11
+ ### 1. Value — does this solve the problem the user came for?
12
+
13
+ - Confirm the surface answers the user's question (cite the brief.md success metric if available).
14
+ - Test against the primary user (also from brief.md) — does the path from arrival to outcome exist, and is it the shortest path the design allows?
15
+ - Findings here block all subsequent feedback. If Value fails, the visual review is not yet useful.
16
+ - Examples of Value findings:
17
+ - "User cannot find the report they came to read — search is hidden in a settings menu."
18
+ - "The empty state is decorative but doesn't explain how to add the first item."
19
+ - "Primary CTA leads somewhere unexpected — clicked Save, taken to a list view, no confirmation."
20
+
21
+ ### 2. Ease of Use — can the user accomplish the task?
22
+
23
+ - Path length: count clicks/taps from arrival to outcome. Compare against the user's expectation.
24
+ - State coverage: every state the user encounters has explicit affordance (loading, empty, error, partial, success).
25
+ - Friction points: where does the user need to think, type, or wait? Each friction point earns a finding.
26
+ - Accessibility floor: if a path is unusable for a keyboard or screen-reader user, it's an Ease of Use failure (not a Delight failure — defer this in your head before promoting).
27
+ - Cross-ref: `accessibility.md`, `state-design.md`, `forms.md`.
28
+
29
+ ### 3. Delight — does it feel polished?
30
+
31
+ - This is the layer most reviews start with — and most reviews stay here, missing the failures above.
32
+ - Delight findings are real and valuable, but they are **the last 20% of leverage**, not the first.
33
+ - The full Delight pass is the Finish Bar (`finish-bar.md` — 10 passes).
34
+ - Common Delight findings: hierarchy ratios off, type weights inconsistent, motion missing, microcopy generic, surface stack flat.
35
+
36
+ ### How to triage
37
+
38
+ - Start by reading the surface against the brief (Value).
39
+ - If Value findings exist, write them as the first section of the report. Recommend the team fix Value before considering Delight feedback. **Do not include Delight findings in a report where Value is failing — it dilutes the signal.**
40
+ - If Value passes, evaluate Ease of Use. Same rule: surface Ease findings before Delight.
41
+ - If Value and Ease both pass, run the Finish Bar.
42
+ - The brief's principles can downgrade or defer findings (e.g., a brief that records "speed over completeness" defers some Ease findings about progressive disclosure).
43
+
44
+ ### When to skip Value-first
45
+
46
+ - Pure visual review at the request of design (e.g., "review this hero animation") — the user has explicitly scoped to Delight. Honor it; note in the report header that Value was not assessed.
47
+ - Library/component reviews where the component is generic and Value depends on consumer code. Run Ease and Delight only.
48
+ - Brand/marketing surfaces where conversion is the metric — Value is "did the user do the conversion action?" — apply the hierarchy but the bar shifts.
49
+
50
+ ---
51
+
52
+ ## How to Use
53
+
54
+ - **`/ui-craft:critique <file>`** — UX critique, flag issues, no code changes
55
+ - **`/ui-craft:audit <file>`** — Technical audit (a11y, perf, responsive), severity-ranked
56
+ - **`/ui-craft:polish <file>`** — Apply the Polish Pass compound details directly
57
+
58
+ ---
59
+
60
+ ## Review Output Format
61
+
62
+ For file reviews, use terse findings:
63
+
64
+ ```
65
+ file:line - [category] description of issue → fix
66
+ ```
67
+
68
+ Example:
69
+ ```
70
+ components/modal.tsx:45 - [animation] Exit 400ms exceeds 300ms limit → reduce to 200ms
71
+ components/button.css:12 - [interaction] Missing :active transform → add scale(0.97)
72
+ ```
73
+
74
+ ---
75
+
76
+ ## Critique Methodology (for screenshots or deep review)
77
+
78
+ Follow this sequence. Each section is a separate lens.
79
+
80
+ ### Step 0: Context
81
+ - **What is this?** (app type, screen purpose, target user)
82
+ - **Emotional context?** (stressful? casual? high-stakes? routine?)
83
+
84
+ ### Step 1: Anti-Slop Detection (CRITICAL)
85
+
86
+ Run the Anti-Slop Test from SKILL.md (Critical → Major → Minor). Every item present is a finding.
87
+
88
+ **The test**: "If someone said AI made this, would they believe it immediately?"
89
+
90
+ ### Step 2: First Impressions
91
+ One paragraph on gut reaction. Be honest and direct. This is the "noticing" step — seeing what's actually there, not what you expect.
92
+
93
+ ### Step 3: Visual Design
94
+
95
+ | Dimension | What to Look For |
96
+ |-----------|-----------------|
97
+ | Color intentionality | Every color purposeful? Too many competing backgrounds/accents? |
98
+ | Typographic hierarchy | Clear scale from most to least important? Count distinct sizes/weights |
99
+ | Shadow & stroke quality | Crisp or muddy? Borders competing with content? |
100
+ | Visual weight vs importance | Heaviest elements = most important? Decorative stealing attention? |
101
+ | Spacing & alignment | Consistent? Clear grid? Excess padding? |
102
+ | Icon consistency | Same family, weight, stroke width, optical size? |
103
+
104
+ For each issue:
105
+ > **[Issue name]** — [Specific factual observation]. [Impact on user]. [What it could be instead.]
106
+
107
+ Be precise. Count things. Quote text. Name colors. Measure relative sizes.
108
+
109
+ ### Step 4: Interface Design
110
+
111
+ | Dimension | What to Look For |
112
+ |-----------|-----------------|
113
+ | Focusing mechanism | Clear where to look first? Visual entry point? |
114
+ | Progressive disclosure | Complexity revealed gradually? 40 things when 5 would suffice? |
115
+ | Information density | Appropriate for context? |
116
+ | Expectation setting | User knows what happens next? Progress communicated? |
117
+ | Feedback & reward | Actions acknowledged? Completed items celebrated? |
118
+ | Redundancy | Labels repeating known information? Can anything be removed? |
119
+
120
+ Frame as missed opportunities:
121
+ > "We're missing an opportunity to [reward progress / reduce cognitive load / etc.]"
122
+
123
+ ### Step 5: Consistency & Conventions
124
+
125
+ | Dimension | What to Look For |
126
+ |-----------|-----------------|
127
+ | Pattern consistency | Similar actions handled the same way? |
128
+ | Platform conventions | Follows established patterns? Deviations intentional? |
129
+ | Component reuse | Elements that should be same component but aren't? |
130
+ | Visual language cohesion | Feels like one designer or assembled from different kits? |
131
+
132
+ ### Step 6: User Context
133
+ - **How does this make the user feel?** Name the emotion.
134
+ - **User's likely state of mind?** Anxious? Focused? Under pressure?
135
+ - **Does the interface respect that state?**
136
+ - **What would "uncommon care" look like here?**
137
+
138
+ ---
139
+
140
+ ## Evidence Gate
141
+
142
+ A finding only counts once it clears three bars. Anything missing one of these is a **candidate**, not a finding — drop it or keep investigating, but don't write it into the report as-is.
143
+
144
+ 1. **Cite the rule.** Name the specific rule or decision the issue violates — a line from this file, from `brief.md`, from the token spine, from an explicit accessibility requirement. "This feels off" is not a citation.
145
+ 2. **Prove it reaches the rendered surface.** Trace the real path — file:line through the actual render, import, or token-resolution chain — that gets you from the code you're pointing at to the pixels the user sees. Two components sharing a name, or a token that merely looks related, is not proof; grep proximity is not proof. If you can't walk the chain, you don't have a finding yet.
146
+ 3. **One concrete fix.** Exactly one, specific enough to apply directly — not a menu of options, not "consider revisiting."
147
+
148
+ **Falsification pass.** Before the report goes out, re-open the evidence for every candidate and actively try to disprove it — check whether the cited rule actually applies in this context, whether the traced path really executes, whether the fix could break something the candidate didn't account for. Only candidates that survive an honest attempt to kill them get written up.
149
+
150
+ **Signal cap.** Rank surviving findings by impact × confidence and report the ones that matter — roughly the top 3-5, not an exhaustive list. Say explicitly what else was observed and cut, so the reader knows the noise was filtered, not missed. A short, high-confidence report beats an exhaustive, noisy one.
151
+
152
+ **Scope discipline.** A review or audit pass fixes what it found — it does not refactor unrelated code, swap libraries or frameworks, or add ARIA and abstraction layers where native semantics already solve the problem. The smallest change that resolves the finding is the correct one.
153
+
154
+ ---
155
+
156
+ ## Craft Report
157
+
158
+ Every review, polish, audit, or refine pass ends with a Craft Report — a receipt of the run. This is non-negotiable: **a pass that changes nothing still produces the report.** "Everything checked out" is a finding, and the most important one to surface — a silent no-op reads as the tool doing nothing, while a receipt turns the same no-op into validation the user can act on.
159
+
160
+ Sections may be omitted when empty, except **Checked** and **Verdict** — those two always appear, even on a pure pass.
161
+
162
+ - **Checked** — which dimensions or rule sets actually ran (anti-slop scan, hierarchy, type, color/contrast, motion, a11y, states…) and over what scope (which files or surfaces). Never imply coverage broader than what actually ran.
163
+ - **Passed** — what was inspected and found sound, with a word on the evidence behind it (e.g. "focus states present on all interactive elements in nav + forms," not "looks fine"). This is the payload when little or nothing changed — treat it with the same rigor as a finding, not as filler.
164
+ - **Changed** — each change, one line, with a file reference and the rule or decision it serves. Every entry here already cleared the Evidence Gate above — no changes ship without a citation and a fix.
165
+ - **Left alone** — deliberate non-changes: things that look unusual but are intentional or brand, things technically correct so untouched, things out of scope or that need a user decision. One line each with the why — this is what separates "didn't notice" from "noticed, chose not to touch."
166
+ - **Verdict** — one sentence: overall state, plus the single highest-leverage next step if one exists (or "ship it" if none does).
167
+
168
+ Keep it honest and short. The report reflects what this run actually inspected — no padding, no invented coverage, no claiming a dimension was checked because it usually is.
169
+
170
+ ---
171
+
172
+ ## Comprehensive Audit Checklist
173
+
174
+ ### Animation Audit
175
+ - [ ] No `transition: all` — properties listed explicitly
176
+ - [ ] No `scale(0)` entry — starts from `scale(0.95)` with `opacity: 0`
177
+ - [ ] No `ease-in` on UI elements — use `ease-out` or custom curve
178
+ - [ ] No `transform-origin: center` on popovers — set to trigger location (modals exempt)
179
+ - [ ] No animation on keyboard actions
180
+ - [ ] No duration > 300ms on UI elements
181
+ - [ ] No hover animation without `@media (hover: hover) and (pointer: fine)`
182
+ - [ ] No keyframes on rapidly-triggered elements — use CSS transitions
183
+ - [ ] Animation library uses compositor-promoted properties under load
184
+ - [ ] Exit faster than enter
185
+ - [ ] Stagger delays ≤ 50ms per item
186
+ - [ ] `prefers-reduced-motion` respected
187
+ - [ ] No entrance animation on first paint for default-state elements (`initial={false}` on `AnimatePresence`)
188
+
189
+ ### Interaction Audit
190
+
191
+ Full checklist lives in `accessibility.md` (**Quick Checklist** + **Forms**). Fast pass:
192
+
193
+ - [ ] Full keyboard navigation (WAI-ARIA APG)
194
+ - [ ] Visible focus rings (`:focus-visible`)
195
+ - [ ] Hit targets ≥ 24px (44px mobile)
196
+ - [ ] URL reflects state (filters, tabs, pagination)
197
+ - [ ] Links use `<a>`/`<Link>`, not `<div onClick>`
198
+ - [ ] Destructive actions confirmed or Undo provided
199
+ - [ ] Loading buttons show spinner + keep label
200
+ - [ ] Forms: paste not blocked, errors inline, autocomplete set
201
+ - [ ] `overscroll-behavior: contain` in modals/drawers
202
+ - [ ] `touch-action: manipulation` on controls
203
+
204
+ ### Layout Audit
205
+ - [ ] Optical alignment (±1px adjustments where needed)
206
+ - [ ] Deliberate grid/baseline/edge alignment
207
+ - [ ] Responsive: mobile, laptop, ultra-wide verified
208
+ - [ ] Safe areas respected
209
+ - [ ] No unwanted scrollbars
210
+ - [ ] Flex children have `min-w-0` for truncation
211
+ - [ ] Text containers handle long content
212
+ - [ ] Empty states handled
213
+
214
+ ### Design Audit
215
+ - [ ] Layered shadows (ambient + direct)
216
+ - [ ] Nested radii: child ≤ parent
217
+ - [ ] Hue-consistent borders/shadows on colored backgrounds
218
+ - [ ] APCA contrast met
219
+ - [ ] Interactions increase contrast
220
+ - [ ] `color-scheme: dark` on html in dark themes
221
+ - [ ] `theme-color` matches background
222
+ - [ ] `tabular-nums` for number comparisons
223
+ - [ ] `text-wrap: balance` on headings
224
+ - [ ] Images have inset outline `black/10` (light) / `white/10` (dark) — never tinted
225
+ - [ ] `-webkit-font-smoothing: antialiased` on root (macOS)
226
+
227
+ ### Performance Audit
228
+ - [ ] Only compositor props animated (`transform`, `opacity`)
229
+ - [ ] No layout thrashing (interleaved reads/writes)
230
+ - [ ] Large lists virtualized (>50 items)
231
+ - [ ] Images: preload above-fold, lazy rest, explicit dimensions
232
+ - [ ] Re-renders minimized
233
+ - [ ] CSS variables not animated on deep trees
234
+ - [ ] `will-change` used temporarily and surgically
235
+ - [ ] Blur ≤ 8px, never continuous, never on large surfaces
236
+
237
+ ---
238
+
239
+ ## Output Format for Critiques
240
+
241
+ ```
242
+ ## Context
243
+ [1-2 sentences]
244
+
245
+ ## Anti-Slop Verdict
246
+ [Pass/fail with specific tells]
247
+
248
+ ## First Impressions
249
+ [1 paragraph, direct]
250
+
251
+ ## Visual Design
252
+ [Issues as: **Issue Name** — observation. Impact. Opportunity.]
253
+
254
+ ## Interface Design
255
+ [Issues framed as missed opportunities]
256
+
257
+ ## Consistency & Conventions
258
+ [Pattern issues]
259
+
260
+ ## User Context
261
+ [Empathy-driven observations]
262
+
263
+ ## Top Opportunities
264
+ [Ranked 3-5 highest-impact changes, one sentence each]
265
+ ```
266
+
267
+ ---
268
+
269
+ ## Voice Rules
270
+
271
+ ### BE:
272
+ - **Specific** — "There are six columns per row" not "a lot of data"
273
+ - **Decisive** — "This is overwhelming" not "might feel overwhelming"
274
+ - **Factual first** — State what you see before judging
275
+ - **Impact-aware** — Connect observation to user impact
276
+ - **Constructive** — Every problem paired with opportunity
277
+ - **Quantitative** — Count elements, name colors, measure sizes
278
+
279
+ ### DO NOT:
280
+ - Hedge ("maybe", "perhaps")
281
+ - Apologize ("unfortunately")
282
+ - Be vague ("feels off" without specifics)
283
+ - Add praise padding (no manufactured positivity)
284
+ - Prescribe without reasoning
285
+
286
+ ### Severity Priority
287
+ 1. **Structural** — information architecture, mental model, missing functionality
288
+ 2. **Behavioral** — response, flow, communication
289
+ 3. **Visual** — color, type, spacing, shadows
290
+
291
+ ---
292
+
293
+ ## Polish Pass (Compound Details)
294
+
295
+ The difference between "correct" and "crafted" is 20 small things done right. Run this checklist after the UI works (required when CRAFT_LEVEL is 8+):
296
+
297
+ - **Brand names use `&nbsp;`** — prevent "UI" on one line and "Craft" on the next
298
+ - **Confirmation feedback is visual, not just color** — swap icon to checkmark, not just green tint
299
+ - **One visual anchor per text-heavy page** — a code block, screenshot, or diagram breaks monotony
300
+ - **Headings sit closer to their content than to the previous section** — unequal spacing creates grouping
301
+ - **Footer earns its space or disappears** — generic "Built by Name" adds nothing
302
+ - **Test on mobile before declaring done** — drag interactions, overflow, label overlap, touch targets
303
+ - **Secondary actions don't compete with primary** — outline/ghost for secondary, solid for primary
304
+ - **Data-heavy content uses monospace or tabular-nums** — even in casual contexts
305
+ - **Images inside interactive containers can't be natively dragged** — kills slider/carousel UX
306
+ - **Every `<section>` on a landing page answers one question** — if it answers two, split it
307
+
308
+ ---
309
+
310
+ ## Common Issues (What We See in Real Projects)
311
+
312
+ When reviewing or polishing existing UI, these are the most frequent problems:
313
+
314
+ | Issue | How to spot it | Fix |
315
+ |-------|---------------|-----|
316
+ | Everything is the same shade of gray | Squint test — no visual hierarchy | Darken headings to 900, lighten secondary to 500, add one accent |
317
+ | Cards all look identical | 4+ cards with same border, radius, shadow | Differentiate primary card, vary content types, break the grid |
318
+ | Hover states missing or default | Buttons/cards don't respond to cursor | Add translateY(-1px) + shadow on cards, bg darken on buttons |
319
+ | Spacing is uniform everywhere | Same gap between all sections | Vary: tighter within groups, looser between sections |
320
+ | No loading/empty/error states | Only the happy path is designed | Add skeleton, empty state with CTA, inline errors |
321
+
322
+ ---
323
+
324
+ ## Component Craft
325
+
326
+ - **Interactive elements have three states minimum** — rest, hover/focus, active/pressed. If it looks the same when you click it, it feels broken.
327
+ - **Button hierarchy guides action** — primary = solid, secondary = outline/ghost, destructive = red outline. Only ONE primary per view section.
328
+ - **Feedback must be visual, not just color** — swap icon to checkmark, show inline confirmation, animate the state change. Color alone fails colorblind users.
329
+ - **Metric cards vary treatment** — if 3+ cards share structure, differentiate the primary (heavier weight, slightly larger number, subtle bg tint — never thick colored borders).
330
+ - **Price typography splits weight** — dollar sign lighter/smaller than the number, period label ("/month") in secondary color.
331
+ - **Prevent native image drag** on interactive overlays — `user-drag: none; -webkit-user-drag: none; pointer-events: none` on images inside sliders/carousels.
332
+ - **Placeholders are visual, not text** — skeleton bars, subtle grid lines, muted pattern. "Chart would render here" looks unfinished.
333
+
334
+ **Hover & interaction micro-details** (gate behind `@media (hover: hover) and (pointer: fine)`):
335
+
336
+ - Cards: `transform: translateY(-1px)` + shadow increase — `transition: transform 200ms ease-out, box-shadow 200ms ease-out` / Tailwind: `hover:-translate-y-px hover:shadow-md transition-[transform,box-shadow] duration-200`
337
+ - Buttons: slight bg darkening, not a full color swap — `transition: background 150ms ease-out` / Tailwind: `hover:bg-accent/90 transition-colors duration-150`
338
+ - Table rows: subtle bg — `hover:bg-gray-50` / Tailwind: `hover:bg-slate-50/50`
339
+ - Links: `text-underline-offset: 2px; text-decoration-skip-ink: auto` / Tailwind: `underline-offset-2 decoration-skip-ink-auto`
340
+ - Active/pressed: `transform: scale(0.98)` on buttons for tactile feedback