waypoint-skills 1.3.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 (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +348 -0
  3. package/README.npm.md +56 -0
  4. package/cli/bin/cli.js +127 -0
  5. package/cli/bin/lib/paths.mjs +31 -0
  6. package/cli/bin/postinstall.mjs +25 -0
  7. package/manifest.json +107 -0
  8. package/package.json +44 -0
  9. package/packages/agents/inspiration-scout.md +105 -0
  10. package/packages/agents/orchestrator.md +186 -0
  11. package/packages/agents/scrutiny-validator.md +136 -0
  12. package/packages/agents/user-testing-validator.md +171 -0
  13. package/packages/agents/validator.md +102 -0
  14. package/packages/agents/worker.md +116 -0
  15. package/packages/agents/wp-router.md +69 -0
  16. package/packages/hooks/hooks.json.example +12 -0
  17. package/packages/hooks/templates/mission-worktree-bootstrap.sh +88 -0
  18. package/packages/hooks/templates/run-assertions.sh +48 -0
  19. package/packages/rules/adversarial-context-isolation.mdc +57 -0
  20. package/packages/rules/serial-git-enforcement.mdc +77 -0
  21. package/packages/skills/caveman/SKILL.md +78 -0
  22. package/packages/skills/design-taste-frontend/SKILL.md +1206 -0
  23. package/packages/skills/gpt-taste/SKILL.md +74 -0
  24. package/packages/skills/impeccable/SKILL.md +164 -0
  25. package/packages/skills/impeccable/reference/adapt.md +311 -0
  26. package/packages/skills/impeccable/reference/animate.md +201 -0
  27. package/packages/skills/impeccable/reference/audit.md +133 -0
  28. package/packages/skills/impeccable/reference/bolder.md +120 -0
  29. package/packages/skills/impeccable/reference/brand.md +108 -0
  30. package/packages/skills/impeccable/reference/clarify.md +288 -0
  31. package/packages/skills/impeccable/reference/codex.md +105 -0
  32. package/packages/skills/impeccable/reference/colorize.md +257 -0
  33. package/packages/skills/impeccable/reference/craft.md +123 -0
  34. package/packages/skills/impeccable/reference/critique.md +780 -0
  35. package/packages/skills/impeccable/reference/delight.md +302 -0
  36. package/packages/skills/impeccable/reference/distill.md +111 -0
  37. package/packages/skills/impeccable/reference/document.md +429 -0
  38. package/packages/skills/impeccable/reference/extract.md +69 -0
  39. package/packages/skills/impeccable/reference/harden.md +347 -0
  40. package/packages/skills/impeccable/reference/hooks.md +90 -0
  41. package/packages/skills/impeccable/reference/init.md +172 -0
  42. package/packages/skills/impeccable/reference/interaction-design.md +189 -0
  43. package/packages/skills/impeccable/reference/layout.md +161 -0
  44. package/packages/skills/impeccable/reference/live.md +718 -0
  45. package/packages/skills/impeccable/reference/onboard.md +234 -0
  46. package/packages/skills/impeccable/reference/optimize.md +258 -0
  47. package/packages/skills/impeccable/reference/overdrive.md +130 -0
  48. package/packages/skills/impeccable/reference/polish.md +241 -0
  49. package/packages/skills/impeccable/reference/product.md +60 -0
  50. package/packages/skills/impeccable/reference/quieter.md +99 -0
  51. package/packages/skills/impeccable/reference/shape.md +165 -0
  52. package/packages/skills/impeccable/reference/typeset.md +279 -0
  53. package/packages/skills/impeccable/scripts/command-metadata.json +94 -0
  54. package/packages/skills/impeccable/scripts/context-signals.mjs +225 -0
  55. package/packages/skills/impeccable/scripts/context.mjs +961 -0
  56. package/packages/skills/impeccable/scripts/critique-storage.mjs +242 -0
  57. package/packages/skills/impeccable/scripts/detect-csp.mjs +198 -0
  58. package/packages/skills/impeccable/scripts/detect.mjs +21 -0
  59. package/packages/skills/impeccable/scripts/detector/browser/injected/index.mjs +1937 -0
  60. package/packages/skills/impeccable/scripts/detector/cli/main.mjs +290 -0
  61. package/packages/skills/impeccable/scripts/detector/design-system.mjs +750 -0
  62. package/packages/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +5185 -0
  63. package/packages/skills/impeccable/scripts/detector/detect-antipatterns.mjs +50 -0
  64. package/packages/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +277 -0
  65. package/packages/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +568 -0
  66. package/packages/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +1015 -0
  67. package/packages/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +234 -0
  68. package/packages/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
  69. package/packages/skills/impeccable/scripts/detector/findings.mjs +12 -0
  70. package/packages/skills/impeccable/scripts/detector/node/file-system.mjs +198 -0
  71. package/packages/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
  72. package/packages/skills/impeccable/scripts/detector/registry/antipatterns.mjs +459 -0
  73. package/packages/skills/impeccable/scripts/detector/rules/checks.mjs +2707 -0
  74. package/packages/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
  75. package/packages/skills/impeccable/scripts/detector/shared/constants.mjs +101 -0
  76. package/packages/skills/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
  77. package/packages/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
  78. package/packages/skills/impeccable/scripts/hook-admin.mjs +660 -0
  79. package/packages/skills/impeccable/scripts/hook-before-edit.mjs +476 -0
  80. package/packages/skills/impeccable/scripts/hook-lib.mjs +1632 -0
  81. package/packages/skills/impeccable/scripts/hook.mjs +61 -0
  82. package/packages/skills/impeccable/scripts/lib/design-parser.mjs +842 -0
  83. package/packages/skills/impeccable/scripts/lib/impeccable-config.mjs +638 -0
  84. package/packages/skills/impeccable/scripts/lib/impeccable-paths.mjs +128 -0
  85. package/packages/skills/impeccable/scripts/lib/is-generated.mjs +69 -0
  86. package/packages/skills/impeccable/scripts/lib/target-args.mjs +42 -0
  87. package/packages/skills/impeccable/scripts/live/browser-script-parts.mjs +49 -0
  88. package/packages/skills/impeccable/scripts/live/completion.mjs +19 -0
  89. package/packages/skills/impeccable/scripts/live/event-validation.mjs +137 -0
  90. package/packages/skills/impeccable/scripts/live/insert-ui.mjs +458 -0
  91. package/packages/skills/impeccable/scripts/live/manual-apply.mjs +939 -0
  92. package/packages/skills/impeccable/scripts/live/manual-edit-routes.mjs +357 -0
  93. package/packages/skills/impeccable/scripts/live/manual-edits-buffer.mjs +152 -0
  94. package/packages/skills/impeccable/scripts/live/session-store.mjs +289 -0
  95. package/packages/skills/impeccable/scripts/live/svelte-component.mjs +826 -0
  96. package/packages/skills/impeccable/scripts/live/sveltekit-adapter.mjs +274 -0
  97. package/packages/skills/impeccable/scripts/live/ui-core.mjs +180 -0
  98. package/packages/skills/impeccable/scripts/live/vocabulary.mjs +36 -0
  99. package/packages/skills/impeccable/scripts/live-accept.mjs +812 -0
  100. package/packages/skills/impeccable/scripts/live-browser-dom.js +146 -0
  101. package/packages/skills/impeccable/scripts/live-browser-session.js +123 -0
  102. package/packages/skills/impeccable/scripts/live-browser.js +11173 -0
  103. package/packages/skills/impeccable/scripts/live-commit-manual-edits.mjs +1241 -0
  104. package/packages/skills/impeccable/scripts/live-complete.mjs +75 -0
  105. package/packages/skills/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
  106. package/packages/skills/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
  107. package/packages/skills/impeccable/scripts/live-inject.mjs +583 -0
  108. package/packages/skills/impeccable/scripts/live-insert.mjs +272 -0
  109. package/packages/skills/impeccable/scripts/live-manual-edit-evidence.mjs +363 -0
  110. package/packages/skills/impeccable/scripts/live-poll.mjs +384 -0
  111. package/packages/skills/impeccable/scripts/live-resume.mjs +94 -0
  112. package/packages/skills/impeccable/scripts/live-server.mjs +1135 -0
  113. package/packages/skills/impeccable/scripts/live-status.mjs +61 -0
  114. package/packages/skills/impeccable/scripts/live-target.mjs +30 -0
  115. package/packages/skills/impeccable/scripts/live-wrap.mjs +894 -0
  116. package/packages/skills/impeccable/scripts/live.mjs +297 -0
  117. package/packages/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  118. package/packages/skills/impeccable/scripts/palette.mjs +633 -0
  119. package/packages/skills/impeccable/scripts/pin.mjs +214 -0
  120. package/packages/skills/ponytail/SKILL.md +117 -0
  121. package/packages/skills/stitch-design-taste/DESIGN.md +121 -0
  122. package/packages/skills/stitch-design-taste/SKILL.md +184 -0
  123. package/packages/skills/waypoint/SKILL.md +67 -0
  124. package/packages/skills/wp/SKILL.md +330 -0
  125. package/packages/skills/wp/caveman-wire.md +148 -0
  126. package/packages/skills/wp/reference.md +411 -0
  127. package/scripts/detect-platform.sh +32 -0
  128. package/scripts/install.sh +123 -0
  129. package/scripts/lib/common.sh +215 -0
  130. package/scripts/sync-skills.sh +21 -0
  131. package/scripts/uninstall.sh +38 -0
  132. package/scripts/waypoint +281 -0
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: gpt-taste
3
+ description: Elite UX/UI & Advanced GSAP Motion Engineer. Enforces Python-driven true randomization for layout variance, strict AIDA page structure, wide editorial typography (bans 6-line wraps), gapless bento grids, strict GSAP ScrollTriggers (pinning, stacking, scrubbing), inline micro-images, and massive section spacing.
4
+ ---
5
+
6
+ # CORE DIRECTIVE: AWWWARDS-LEVEL DESIGN ENGINEERING
7
+ You are an elite, award-winning frontend design engineer. Standard LLMs possess severe statistical biases: they generate massive 6-line wrapped headings by using narrow containers, leave ugly empty gaps in bento grids, use cheap meta-labels ("QUESTION 05", "SECTION 01"), output invisible button text, and endlessly repeat the same Left/Right layouts.
8
+
9
+ Your goal is to aggressively break these defaults. Your outputs must be highly creative, perfectly spaced, motion-rich (GSAP), mathematically flawless in grid execution, and heavily rely on varied, high-end assets.
10
+
11
+ DO NOT USE EMOJIS IN YOUR CODE, COMMENTS, OR OUTPUT. Maintain strictly professional formatting.
12
+
13
+ ## 1. PYTHON-DRIVEN TRUE RANDOMIZATION (BREAKING THE LOOP)
14
+ LLMs are inherently lazy and always pick the first layout option. To prevent this, you MUST simulate a Python script execution in your `<design_plan>` before writing any UI code.
15
+ Use a deterministic seed (e.g., character count of the user prompt modulo math) to simulate `random.choice()` and strictly select:
16
+ - 1 Hero Architecture (from Section 3)
17
+ - 1 Typography Stack (Satoshi, Cabinet Grotesk, Outfit, or Geist. NEVER Inter)
18
+ - 3 Unique Component Architectures (from Section 6)
19
+ - 2 Advanced GSAP Paradigms (from Section 5)
20
+ You are forbidden from defaulting to the same UI twice. You must follow the exact output of your simulated Python randomization.
21
+
22
+ ## 2. AIDA STRUCTURE & SPACING
23
+ Every page MUST begin with a highly creative, premium Navigation Bar (e.g., floating glass pill, or minimal split nav).
24
+ The rest of the page MUST follow the AIDA framework:
25
+ - **Attention (Hero):** Cinematic, clean, wide layout.
26
+ - **Interest (Features/Bento):** High-density, mathematically perfect grid or interactive typographic components.
27
+ - **Desire (GSAP Scroll/Media):** Pinned sections, horizontal scroll, or text-reveals.
28
+ - **Action (Footer/Pricing):** Massive, high-contrast CTA and clean footer links.
29
+ **SPACING RULE:** Add huge vertical padding between all major sections (e.g., `py-32 md:py-48`). Sections must feel like distinct, cinematic chapters. Do not cramp elements together.
30
+
31
+ ## 3. HERO ARCHITECTURE & THE 2-LINE IRON RULE
32
+ The Hero must breathe. It must NOT be a narrow, 6-line text wall.
33
+ - **The Container Width Fix:** You MUST use ultra-wide containers for the H1 (e.g., `max-w-5xl`, `max-w-6xl`, `w-full`). Allow the words to flow horizontally.
34
+ - **The Line Limit:** The H1 MUST NEVER exceed 2 to 3 lines. 4, 5, or 6 lines is a catastrophic failure. Make the font size smaller (`clamp(3rem, 5vw, 5.5rem)`) and the container wider to ensure this.
35
+ - **Hero Layout Options (Randomly Assigned via Python):**
36
+ 1. *Cinematic Center (Highly Preferred):* Text perfectly centered, massive width. Below the text, exactly two high-contrast CTAs. Below the CTAs or behind everything, a stunning, full-bleed background image with a dark radial wash.
37
+ 2. *Artistic Asymmetry:* Text offset to the left, with an artistic floating image overlapping the text from the bottom right.
38
+ 3. *Editorial Split:* Text left, image right, but with massive negative space.
39
+ - **Button Contrast:** Buttons must be perfectly legible. Dark background = white text. Light background = dark text. Invisible text is a failure.
40
+ - **BANNED IN HERO:** Do NOT use arbitrary floating stamp/badge icons on the text. Do NOT use pill-tags under the hero. Do NOT place raw data/stats in the hero.
41
+
42
+ ## 4. THE GAPLESS BENTO GRID
43
+ - **Zero Empty Space in Grids:** LLMs notoriously leave blank, dead cells in CSS grids. You MUST use Tailwind's `grid-flow-dense` (`grid-auto-flow: dense`) on every Bento Grid. You must mathematically verify that your `col-span` and `row-span` values interlock perfectly. No grid shall have a missing corner or empty void.
44
+ - **Card Restraint:** Do not use too many cards. 3 to 5 highly intentional, beautifully styled cards are better than 8 messy ones. Fill them with a mix of large imagery, dense typography, or CSS effects.
45
+
46
+ ## 5. ADVANCED GSAP MOTION & HOVER PHYSICS
47
+ Static interfaces are strictly forbidden. You must write real GSAP (`@gsap/react`, `ScrollTrigger`).
48
+ - **Hover Physics:** Every clickable card and image must react. Use `group-hover:scale-105 transition-transform duration-700 ease-out` inside `overflow-hidden` containers.
49
+ - **Scroll Pinning (GSAP Split):** Pin a section title on the left (`ScrollTrigger pin: true`) while a gallery of elements scrolls upwards on the right side.
50
+ - **Image Scale & Fade Scroll:** Images must start small (`scale: 0.8`). As they scroll into view, they grow to `scale: 1.0`. As they scroll out of view, they smoothly darken and fade out (`opacity: 0.2`).
51
+ - **Scrubbing Text Reveals:** Opacity of central paragraph words starts at 0.1 and scrubs to 1.0 sequentially as the user scrolls.
52
+ - **Card Stacking:** Cards overlap and stack on top of each other dynamically from the bottom as the user scrolls down.
53
+
54
+ ## 6. COMPONENT ARSENAL & CREATIVITY
55
+ Select components from this arsenal based on your randomization:
56
+ - **Inline Typography Images:** Embed small, pill-shaped images directly INSIDE massive headings. Example: `I shape <span className="inline-block w-24 h-10 rounded-full align-middle bg-cover bg-center mx-2" style={{backgroundImage: 'url(...)'}}></span> digital spaces.`
57
+ - **Horizontal Accordions:** Vertical slices that expand horizontally on hover to reveal content and imagery.
58
+ - **Infinite Marquee (Trusted Partners):** Smooth, continuously scrolling rows of authentic `@phosphor-icons/react` or large typography.
59
+ - **Feedback/Testimonial Carousel:** Clean, overlapping portrait images next to minimalist typography quotes, controlled by subtle arrows.
60
+
61
+ ## 7. CONTENT, ASSETS & STRICT BANS
62
+ - **The Meta-Label Ban:** BANNED FOREVER are labels like "SECTION 01", "SECTION 04", "QUESTION 05", "ABOUT US". Remove them entirely. They look cheap and unprofessional.
63
+ - **Image Context & Style:** Use `https://picsum.photos/seed/{keyword}/1920/1080` and match the keyword to the vibe. Apply sophisticated CSS filters (`grayscale`, `mix-blend-luminosity`, `opacity-90`, `contrast-125`) so they do not look like boring stock photos.
64
+ - **Creative Backgrounds:** Inject subtle, professional ambient design. Use deep radial blurs, grainy mesh gradients, or shifting dark overlays. Avoid flat, boring colors.
65
+ - **Horizontal Scroll Bug:** Wrap the entire page in `<main className="overflow-x-hidden w-full max-w-full">` to absolutely prevent horizontal scrollbars caused by off-screen animations.
66
+
67
+ ## 8. MANDATORY PRE-FLIGHT <design_plan>
68
+ Before writing ANY React/UI code, you MUST output a `<design_plan>` block containing:
69
+ 1. **Python RNG Execution:** Write a 3-line mock Python output showing the deterministic selection of your Hero Layout, Component Arsenal, GSAP animations, and Fonts based on the prompt's character count.
70
+ 2. **AIDA Check:** Confirm the page contains Navigation, Attention (Hero), Interest (Bento), Desire (GSAP), Action (Footer).
71
+ 3. **Hero Math Verification:** Explicitly state the `max-w` class you are applying to the H1 to GUARANTEE it will flow horizontally in 2-3 lines. Confirm NO stamp icons or spam tags exist.
72
+ 4. **Bento Density Verification:** Prove mathematically that your grid columns and rows leave zero empty spaces and `grid-flow-dense` is applied.
73
+ 5. **Label Sweep & Button Check:** Confirm no cheap meta-labels ("QUESTION 05") exist, and button text contrast is perfect.
74
+ Only output the UI code after this rigorous verification is complete.
@@ -0,0 +1,164 @@
1
+ ---
2
+ name: impeccable
3
+ description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
4
+ version: 3.9.1
5
+ license: Apache 2.0
6
+ ---
7
+
8
+ Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
9
+
10
+ ## Setup
11
+
12
+ You MUST do these steps before proceeding:
13
+
14
+ 1. Run `node .cursor/skills/impeccable/scripts/context.mjs` once per session. If the request names or implies a file, route, or app inside a monorepo, infer the concrete path and run `node .cursor/skills/impeccable/scripts/context.mjs --target <path>` instead. If you've already seen its output in this conversation, do not re-run it. The script either prints the project's PRODUCT.md (and DESIGN.md when present) as a markdown block, or tells you it's missing. Follow whatever it prints. **If it reports `NO_PRODUCT_MD`, stop and follow `reference/init.md` before doing anything else.** If the output ends with an `UPDATE_AVAILABLE` directive, follow it (ask the user once about updating, then continue). It never blocks the current task.
15
+ 2. If the user invoked a sub-command (`craft`, `shape`, `audit`, `polish`, ...), you MUST read `reference/<command>.md` next. Non-optional. The reference defines the command's flow; without it you will skip steps the user expects.
16
+ 3. Familiarize yourself with any existing design system, conventions, and components in the code. Read at least one project file (CSS / tokens / theme / a representative component or page). **Required even when you've loaded a sub-command reference in step 2.** Don't reinvent the wheel; use what's there when it works, branch out when the UX wins.
17
+ 4. Read the matching register reference. **This is non-optional; skipping it produces generic output.** If the project is marketing, a landing page, a campaign, long-form content, or a portfolio (design IS the product), read `reference/brand.md`. If it is app UI, admin, a dashboard, or a tool (design SERVES the product), read `reference/product.md`. Pick by first match: (1) task cue ("landing page" vs "dashboard"); (2) surface in focus (the page, file, or route being worked on); (3) `register` field in PRODUCT.md.
18
+ 5. **If the project is brand-new (no existing CSS tokens / theme / committed brand colors found in step 3)**, run `node .cursor/skills/impeccable/scripts/palette.mjs` to receive a brand seed color and composition guidance. This is the anchor for your primary brand color. Compose the rest of the palette (bg, surface, ink, accent, muted) around it per the script's instructions. Use OKLCH throughout. **Skip this step only if step 3 found committed brand colors in existing tokens; in that case identity-preservation wins.**
19
+
20
+ ## Design guidance
21
+
22
+ Produce ready-to-ship, production-grade code, not prototypes or starting points. Take no shortcuts unless the user asks for them (when in doubt, ask). Don't stop until arriving at a complete implementation (beautiful, responsive, fast, precise, bug-free, on brand). You take attention to detail seriously: every page, section or component crafted is battle tested using the tools available to you (browser screenshotting, computer use, etc). the model is capable of extraordinary work. Don't hold back.
23
+
24
+ ### General rules
25
+
26
+ #### Color
27
+
28
+ - **Verify contrast.** Body text must hit ≥4.5:1 against its background; large text (≥18px or bold ≥14px) needs ≥3:1. Placeholder text needs the same 4.5:1, not the muted-gray default. The most common failure: muted gray body text on a tinted near-white. If the contrast is even close, bump the body color toward the ink end of the ramp; light gray "for elegance" is the single biggest reason AI designs feel hard to read.
29
+ - Gray text on a colored background looks washed out. Use a darker shade of the background's own hue, or a transparency of the text color.
30
+
31
+ #### Typography
32
+
33
+ - Cap body line length at 65–75ch.
34
+ - Don't pair fonts that are similar but not identical (two geometric sans-serifs, two humanist sans-serifs). Pair on a contrast axis (serif + sans, geometric + humanist) or use one family in multiple weights.
35
+ - Hero / display heading ceiling: clamp() max ≤ 6rem (~96px). Above that the page is shouting, not designing.
36
+ - Display heading letter-spacing floor: ≥ -0.04em. Anything tighter and letters touch; cramped, not "designed".
37
+ - Use `text-wrap: balance` on h1–h3 for even line lengths; `text-wrap: pretty` on long prose to reduce orphans.
38
+
39
+ #### Layout
40
+
41
+ - Vary spacing for rhythm.
42
+ - Cards are the lazy answer. Use them only when they're truly the best affordance. Nested cards are always wrong.
43
+ - Flexbox for 1D, Grid for 2D. Don't default to Grid when `flex-wrap` would be simpler.
44
+ - For responsive grids without breakpoints: `repeat(auto-fit, minmax(280px, 1fr))`.
45
+ - Build a semantic z-index scale (dropdown → sticky → modal-backdrop → modal → toast → tooltip). Never arbitrary values like 999 or 9999.
46
+
47
+ #### Motion
48
+ - Motion should be intentional, and not be an afterthought. consider it as part of the build.
49
+ - Don't animate CSS layout properties unless truly needed.
50
+ - Ease out with exponential curves (ease-out-quart / quint / expo). No bounce, no elastic.
51
+ - Use libraries for more advanced motion needs (e.g. motion, gsap, anime.js, lenis etc)
52
+ - Reduced motion is not optional. Every animation needs a `@media (prefers-reduced-motion: reduce)` alternative: typically a crossfade or instant transition.
53
+ - Staggering the items within one list is legitimate. The tell is the uniform reflex (one identical entrance applied to every section), not motion itself; each reveal should fit what it reveals. Suppressing the reflex is never a reason to ship a page with no motion at all.
54
+ - Reveal animations must enhance an already-visible default. Don't gate content visibility on a class-triggered transition; transitions pause on hidden tabs and headless renderers, so the reveal never fires and the section ships blank.
55
+ - Premium motion materials are not just transform/opacity. Blur, backdrop-filter, clip-path, mask, and shadow/glow are part of the palette when they materially improve the effect and stay smooth.
56
+
57
+ #### Interaction
58
+
59
+ - Dropdowns rendered with `position: absolute` inside an `overflow: hidden` or `overflow: auto` container will be clipped. Use the native `<dialog>` / popover API, `position: fixed`, or a portal to escape the stacking context.
60
+
61
+ ### New projects only (when no prior work exists)
62
+
63
+ #### Color & Theme
64
+
65
+ - Use OKLCH.
66
+ - **The cream / sand / beige body bg is the saturated AI default of 2026.** The whole warm-neutral band (OKLCH L 0.84-0.97, C < 0.06, hue 40-100) reads as cream/sand/paper/parchment regardless of what you call it. Token names like `--paper`, `--cream`, `--sand`, `--bone`, `--flour`, `--linen`, `--parchment`, `--wheat`, `--biscuit`, `--ivory` are tells in themselves. If the brief is "warm, traditional, family-coastal-Italian" or "magazine-warm" or "editorial-restraint", DO NOT translate that into a near-white warm-tinted bg; that's the AI move. Pick: (a) a saturated brand color as the body (terracotta, oxblood, deep ochre, near-black), (b) a true off-white at chroma 0 (or chroma toward the brand's own hue, not toward warmth-by-default), or (c) a darker mid-tone tinted neutral that's clearly the brand's own. "Warmth" in the brand is carried by accent + typography + imagery, not by body bg.
67
+ - Tinted neutrals: add 0.005–0.015 chroma toward the brand's hue. Don't default-tint toward warm or cool "because the brand feels that way"; that's the cross-project monoculture move.
68
+ - When picking a theme: Dark vs. light is never a default. Not dark "because tools look cool dark." Not light "to be safe.".Before choosing, write one sentence of physical scene: who uses this, where, under what ambient light, in what mood. If the sentence doesn't force the answer, it's not concrete enough. Add detail until it does.
69
+ - Pick a **color strategy** before picking colors. Four steps on the commitment axis:
70
+ - **Restrained**: tinted neutrals + one accent ≤10%. Product default; brand minimalism.
71
+ - **Committed**: one saturated color carries 30–60% of the surface. Brand default for identity-driven pages.
72
+ - **Full palette**: 3–4 named roles, each used deliberately. Brand campaigns; product data viz.
73
+ - **Drenched**: the surface IS the color. Brand heroes, campaign pages.
74
+
75
+ ### Absolute bans
76
+
77
+ Match-and-refuse. If you're about to write any of these, rewrite the element with different structure.
78
+
79
+ - **Side-stripe borders.** `border-left` or `border-right` greater than 1px as a colored accent on cards, list items, callouts, or alerts. Never intentional. Rewrite with full borders, background tints, leading numbers/icons, or nothing.
80
+ - **Gradient text.** `background-clip: text` combined with a gradient background. Decorative, never meaningful. Use a single solid color. Emphasis via weight or size.
81
+ - **Glassmorphism as default.** Blurs and glass cards used decoratively. Rare and purposeful, or nothing.
82
+ - **The hero-metric template.** Big number, small label, supporting stats, gradient accent. SaaS cliché.
83
+ - **Identical card grids.** Same-sized cards with icon + heading + text, repeated endlessly.
84
+ - **Tiny uppercase tracked eyebrow above every section.** The 2023-era kicker (small all-caps text with wide tracking, "ABOUT" "PROCESS" "PRICING" above each heading) is now the saturated AI scaffold; it appears on 55-95% of generations regardless of brief, which is the definition of a tell. One named kicker as a deliberate brand system is voice; an eyebrow on every section is AI grammar. Choose a different cadence.
85
+ - **Numbered section markers as default scaffolding (01 / 02 / 03).** Putting `01 · About / 02 · Process / 03 · Pricing` above every section is the eyebrow trope one tier deeper: reach for it because "landing pages do this" and you're scaffolding by reflex. Numbers earn their place when the section actually IS a sequence (a real 3-step process, an ordered flow, a typed timeline) and the order carries information the reader needs. One deliberate numbered sequence on one page is voice; numbered eyebrows on every section across the site is AI grammar.
86
+ - **Text that overflows its container.** Long heading words plus large clamp scales plus narrow grids cause headline overflow on tablet/mobile. Test the heading copy at every breakpoint; if it overflows, reduce the clamp max or rewrite the copy. The viewport is part of the design.
87
+
88
+ ### The AI slop test
89
+
90
+ If someone could look at this interface and say "AI made that" without doubt, it's failed. Cross-register failures are the absolute bans above. Register-specific failures live in each reference.
91
+
92
+ **Category-reflex check.** Run at two altitudes; the second one catches what the first one misses.
93
+
94
+ - **First-order:** if someone could guess the theme + palette from the category alone, it's the first training-data reflex. Rework the scene sentence and color strategy until the answer isn't obvious from the domain.
95
+ - **Second-order:** if someone could guess the aesthetic family from category-plus-anti-references ("AI workflow tool that's not SaaS-cream → editorial-typographic", "fintech that's not navy-and-gold → terminal-native dark mode"), it's the trap one tier deeper. The first reflex was avoided; the second wasn't. Rework until both answers are not obvious. The brand register's [reflex-reject aesthetic lanes](reference/brand.md) list catches the currently-saturated families.
96
+
97
+ ## Commands
98
+
99
+ | Command | Category | Description | Reference |
100
+ |---|---|---|---|
101
+ | `craft [feature]` | Build | Shape, then build a feature end-to-end | [reference/craft.md](reference/craft.md) |
102
+ | `shape [feature]` | Build | Plan UX/UI before writing code | [reference/shape.md](reference/shape.md) |
103
+ | `init` | Build | Set up project context: PRODUCT.md, DESIGN.md, live config, next steps | [reference/init.md](reference/init.md) |
104
+ | `document` | Build | Generate DESIGN.md from existing project code | [reference/document.md](reference/document.md) |
105
+ | `extract [target]` | Build | Pull reusable tokens and components into design system | [reference/extract.md](reference/extract.md) |
106
+ | `critique [target]` | Evaluate | UX design review with heuristic scoring | [reference/critique.md](reference/critique.md) |
107
+ | `audit [target]` | Evaluate | Technical quality checks (a11y, perf, responsive) | [reference/audit.md](reference/audit.md) |
108
+ | `polish [target]` | Refine | Final quality pass before shipping | [reference/polish.md](reference/polish.md) |
109
+ | `bolder [target]` | Refine | Amplify safe or bland designs | [reference/bolder.md](reference/bolder.md) |
110
+ | `quieter [target]` | Refine | Tone down aggressive or overstimulating designs | [reference/quieter.md](reference/quieter.md) |
111
+ | `distill [target]` | Refine | Strip to essence, remove complexity | [reference/distill.md](reference/distill.md) |
112
+ | `harden [target]` | Refine | Production-ready: errors, i18n, edge cases | [reference/harden.md](reference/harden.md) |
113
+ | `onboard [target]` | Refine | Design first-run flows, empty states, activation | [reference/onboard.md](reference/onboard.md) |
114
+ | `animate [target]` | Enhance | Add purposeful animations and motion | [reference/animate.md](reference/animate.md) |
115
+ | `colorize [target]` | Enhance | Add strategic color to monochromatic UIs | [reference/colorize.md](reference/colorize.md) |
116
+ | `typeset [target]` | Enhance | Improve typography hierarchy and fonts | [reference/typeset.md](reference/typeset.md) |
117
+ | `layout [target]` | Enhance | Fix spacing, rhythm, and visual hierarchy | [reference/layout.md](reference/layout.md) |
118
+ | `delight [target]` | Enhance | Add personality and memorable touches | [reference/delight.md](reference/delight.md) |
119
+ | `overdrive [target]` | Enhance | Push past conventional limits | [reference/overdrive.md](reference/overdrive.md) |
120
+ | `clarify [target]` | Fix | Improve UX copy, labels, and error messages | [reference/clarify.md](reference/clarify.md) |
121
+ | `adapt [target]` | Fix | Adapt for different devices and screen sizes | [reference/adapt.md](reference/adapt.md) |
122
+ | `optimize [target]` | Fix | Diagnose and fix UI performance | [reference/optimize.md](reference/optimize.md) |
123
+ | `live` | Iterate | Visual variant mode: pick elements in the browser, generate alternatives | [reference/live.md](reference/live.md) |
124
+
125
+ Plus three management commands: `pin <command>`, `unpin <command>`, and `hooks <on|off|status|...>`, detailed below.
126
+
127
+ ### Routing rules
128
+
129
+ 1. **No argument**: the user is asking "what should I do?" Make the menu context-aware instead of static. Setup has already run `context.mjs`; if that reported `NO_PRODUCT_MD` you are already in init (setup), so finish that and skip this. Otherwise run `node .cursor/skills/impeccable/scripts/context-signals.mjs` once and read its JSON, then lead with the **2-3 highest-value next commands**, each with a one-line reason pulled from the signals, followed by the full menu (the table above, grouped by category). **Never auto-run a command; the recommendation is a suggestion the user confirms.**
130
+
131
+ Reason over the signals; there is no score to obey:
132
+ - `setup.hasDesign` false while `setup.hasCode` true → `document` (capture the visual system).
133
+ - `critique.latest` is `null` → the project has never been critiqued; for a set-up project with a real surface, offering `/impeccable critique <surface>` is a strong default.
134
+ - `critique.latest` with a low `score` or non-zero `p0` / `p1` → `polish` (it reads that snapshot as its backlog), or re-run `critique` if the snapshot looks stale.
135
+ - `git.changedFiles` pointing at one surface → scope `audit` or `polish` to those files specifically, naming them.
136
+ - `devServer.running` true → `live` is available for in-browser iteration; if false, don't lead with `live`.
137
+ - Otherwise group by intent exactly as init's "Recommend starting points" step does (build new / improve what's there / iterate visually), tailored to `setup.register`.
138
+
139
+ **If `scan.targets` is non-empty, run `node .cursor/skills/impeccable/scripts/detect.mjs --json <scan.targets joined by spaces>` once** (the bundled detector over local files: no network, no npx). `scan.via` tells you what they are: `git-changes` (the markup/style files in your dirty tree, the most relevant set), `source-dir` (e.g. `src`, `app`), `html`, or `root`. Fold the hits into your picks: many quality / contrast hits → `audit` or `polish`; a specific slop family → the matching command (gradient text or eyebrows → `quieter` / `typeset`, flat or gray palette → `colorize`, and so on). It's a real, current signal that beats guessing. If detect errors or the tree is large and slow, skip it and recommend the user run `audit` themselves; never block the suggestion on it.
140
+
141
+ Keep it to 2-3 pointed picks with the exact command to type. The menu stays the fallback; the recommendation is the lede.
142
+ 2. **First word matches a command** (table above OR `pin` / `unpin` / `hooks`): load its reference file and follow its instructions. Everything after the command name is the target.
143
+ 3. **First word doesn't match, but the intent clearly maps to one command** (e.g. "fix the spacing" → `layout`, "rewrite this error message" → `clarify`, "the colors feel flat" → `colorize`): load that command's reference and proceed as if invoked. If two commands could fit, ask once which.
144
+ 4. **No clear command match**: general design invocation. Apply the setup steps, the General rules, and the loaded register reference, using the full argument as context.
145
+
146
+ Setup (context gathering, register) is already loaded by then; sub-commands don't re-invoke `/impeccable`.
147
+
148
+ If the first word is `craft`, setup still runs first, but [reference/craft.md](reference/craft.md) owns the rest of the flow. If setup invokes `init` as a blocker, finish init, refresh context, then resume the original command and target.
149
+
150
+ `teach` is a deprecated alias for `init`: if the user types it, load [reference/init.md](reference/init.md) and proceed as if they ran `init`.
151
+
152
+ ## Pin / Unpin
153
+
154
+ **Pin** creates a standalone shortcut so `/<command>` invokes `/impeccable <command>` directly. **Unpin** removes it. The script writes to every harness directory present in the project.
155
+
156
+ ```bash
157
+ node .cursor/skills/impeccable/scripts/pin.mjs <pin|unpin> <command>
158
+ ```
159
+
160
+ Valid `<command>` is any command from the table above. Report the script's result concisely. Confirm the new shortcut on success, relay stderr verbatim on error.
161
+
162
+ ## Hooks
163
+
164
+ `/impeccable hooks <on|off|status|ignore-rule|ignore-file|ignore-value|reset>` manages the design detector hook for this project. The hook auto-runs the detector after direct UI file edits and surfaces findings as system reminders. Full flow is in [reference/hooks.md](reference/hooks.md); load it when the user invokes `/impeccable hooks` with any argument.
@@ -0,0 +1,311 @@
1
+ > **Additional context needed**: target platforms/devices and usage contexts.
2
+
3
+ Adapt an existing design to a different context: another screen size, device, platform, or use case. The trap is treating adaptation as scaling. The job is rethinking the experience for the new context.
4
+
5
+
6
+ ---
7
+
8
+ ## Assess Adaptation Challenge
9
+
10
+ Understand what needs adaptation and why:
11
+
12
+ 1. **Identify the source context**:
13
+ - What was it designed for originally? (Desktop web? Mobile app?)
14
+ - What assumptions were made? (Large screen? Mouse input? Fast connection?)
15
+ - What works well in current context?
16
+
17
+ 2. **Understand target context**:
18
+ - **Device**: Mobile, tablet, desktop, TV, watch, print?
19
+ - **Input method**: Touch, mouse, keyboard, voice, gamepad?
20
+ - **Screen constraints**: Size, resolution, orientation?
21
+ - **Connection**: Fast wifi, slow 3G, offline?
22
+ - **Usage context**: On-the-go vs desk, quick glance vs focused reading?
23
+ - **User expectations**: What do users expect on this platform?
24
+
25
+ 3. **Identify adaptation challenges**:
26
+ - What won't fit? (Content, navigation, features)
27
+ - What won't work? (Hover states on touch, tiny touch targets)
28
+ - What's inappropriate? (Desktop patterns on mobile, mobile patterns on desktop)
29
+
30
+ **CRITICAL**: Adaptation is rethinking the experience for the new context, not scaling pixels.
31
+
32
+ ## Plan Adaptation Strategy
33
+
34
+ Create context-appropriate strategy:
35
+
36
+ ### Mobile Adaptation (Desktop → Mobile)
37
+
38
+ **Layout Strategy**:
39
+ - Single column instead of multi-column
40
+ - Vertical stacking instead of side-by-side
41
+ - Full-width components instead of fixed widths
42
+ - Bottom navigation instead of top/side navigation
43
+
44
+ **Interaction Strategy**:
45
+ - Touch targets 44x44px minimum (not hover-dependent)
46
+ - Swipe gestures where appropriate (lists, carousels)
47
+ - Bottom sheets instead of dropdowns
48
+ - Thumbs-first design (controls within thumb reach)
49
+ - Larger tap areas with more spacing
50
+
51
+ **Content Strategy**:
52
+ - Progressive disclosure (don't show everything at once)
53
+ - Prioritize primary content (secondary content in tabs/accordions)
54
+ - Shorter text (more concise)
55
+ - Larger text (16px minimum)
56
+
57
+ **Navigation Strategy**:
58
+ - Hamburger menu or bottom navigation
59
+ - Reduce navigation complexity
60
+ - Sticky headers for context
61
+ - Back button in navigation flow
62
+
63
+ ### Tablet Adaptation (Hybrid Approach)
64
+
65
+ **Layout Strategy**:
66
+ - Two-column layouts (not single or three-column)
67
+ - Side panels for secondary content
68
+ - Master-detail views (list + detail)
69
+ - Adaptive based on orientation (portrait vs landscape)
70
+
71
+ **Interaction Strategy**:
72
+ - Support both touch and pointer
73
+ - Touch targets 44x44px but allow denser layouts than phone
74
+ - Side navigation drawers
75
+ - Multi-column forms where appropriate
76
+
77
+ ### Desktop Adaptation (Mobile → Desktop)
78
+
79
+ **Layout Strategy**:
80
+ - Multi-column layouts (use horizontal space)
81
+ - Side navigation always visible
82
+ - Multiple information panels simultaneously
83
+ - Fixed widths with max-width constraints (don't stretch to 4K)
84
+
85
+ **Interaction Strategy**:
86
+ - Hover states for additional information
87
+ - Keyboard shortcuts
88
+ - Right-click context menus
89
+ - Drag and drop where helpful
90
+ - Multi-select with Shift/Cmd
91
+
92
+ **Content Strategy**:
93
+ - Show more information upfront (less progressive disclosure)
94
+ - Data tables with many columns
95
+ - Richer visualizations
96
+ - More detailed descriptions
97
+
98
+ ### Print Adaptation (Screen → Print)
99
+
100
+ **Layout Strategy**:
101
+ - Page breaks at logical points
102
+ - Remove navigation, footer, interactive elements
103
+ - Black and white (or limited color)
104
+ - Proper margins for binding
105
+
106
+ **Content Strategy**:
107
+ - Expand shortened content (show full URLs, hidden sections)
108
+ - Add page numbers, headers, footers
109
+ - Include metadata (print date, page title)
110
+ - Convert charts to print-friendly versions
111
+
112
+ ### Email Adaptation (Web → Email)
113
+
114
+ **Layout Strategy**:
115
+ - Narrow width (600px max)
116
+ - Single column only
117
+ - Inline CSS (no external stylesheets)
118
+ - Table-based layouts (for email client compatibility)
119
+
120
+ **Interaction Strategy**:
121
+ - Large, obvious CTAs (buttons not text links)
122
+ - No hover states (not reliable)
123
+ - Deep links to web app for complex interactions
124
+
125
+ ## Implement Adaptations
126
+
127
+ Apply changes systematically:
128
+
129
+ ### Responsive Breakpoints
130
+
131
+ Choose appropriate breakpoints:
132
+ - Mobile: 320px-767px
133
+ - Tablet: 768px-1023px
134
+ - Desktop: 1024px+
135
+ - Or content-driven breakpoints (where design breaks)
136
+
137
+ ### Layout Adaptation Techniques
138
+
139
+ - **CSS Grid/Flexbox**: Reflow layouts automatically
140
+ - **Container Queries**: Adapt based on container, not viewport
141
+ - **`clamp()`**: Fluid sizing between min and max
142
+ - **Media queries**: Different styles for different contexts
143
+ - **Display properties**: Show/hide elements per context
144
+
145
+ ### Touch Adaptation
146
+
147
+ - Increase touch target sizes (44x44px minimum)
148
+ - Add more spacing between interactive elements
149
+ - Remove hover-dependent interactions
150
+ - Add touch feedback (ripples, highlights)
151
+ - Consider thumb zones (easier to reach bottom than top)
152
+
153
+ ### Content Adaptation
154
+
155
+ - Use `display: none` sparingly (still downloads)
156
+ - Progressive enhancement (core content first, enhancements on larger screens)
157
+ - Lazy loading for off-screen content
158
+ - Responsive images (`srcset`, `picture` element)
159
+
160
+ ### Navigation Adaptation
161
+
162
+ - Transform complex nav to hamburger/drawer on mobile
163
+ - Bottom nav bar for mobile apps
164
+ - Persistent side navigation on desktop
165
+ - Breadcrumbs on smaller screens for context
166
+
167
+ **IMPORTANT**: Test on real devices. Device emulation in DevTools is helpful but not perfect.
168
+
169
+ **NEVER**:
170
+ - Hide core functionality on mobile (if it matters, make it work)
171
+ - Assume desktop = powerful device (consider accessibility, older machines)
172
+ - Use different information architecture across contexts (confusing)
173
+ - Break user expectations for platform (mobile users expect mobile patterns)
174
+ - Forget landscape orientation on mobile/tablet
175
+ - Use generic breakpoints blindly (use content-driven breakpoints)
176
+ - Ignore touch on desktop (many desktop devices have touch)
177
+
178
+ ## Verify Adaptations
179
+
180
+ Test thoroughly across contexts:
181
+
182
+ - **Real devices**: Test on actual phones, tablets, desktops
183
+ - **Different orientations**: Portrait and landscape
184
+ - **Different browsers**: Safari, Chrome, Firefox, Edge
185
+ - **Different OS**: iOS, Android, Windows, macOS
186
+ - **Different input methods**: Touch, mouse, keyboard
187
+ - **Edge cases**: Very small screens (320px), very large screens (4K)
188
+ - **Slow connections**: Test on throttled network
189
+
190
+ When the adaptation feels native to each context, hand off to `/impeccable polish` for the final pass.
191
+
192
+ ---
193
+
194
+ ## Reference Material
195
+
196
+ The sections below were previously `responsive-design.md` and live inline now so the adapt flow has its deep responsive reference in one place.
197
+
198
+ ### Responsive Design
199
+
200
+ #### Mobile-First: Write It Right
201
+
202
+ Start with base styles for mobile, use `min-width` queries to layer complexity. Desktop-first (`max-width`) means mobile loads unnecessary styles first.
203
+
204
+ #### Breakpoints: Content-Driven
205
+
206
+ Don't chase device sizes; let content tell you where to break. Start narrow, stretch until design breaks, add breakpoint there. Three breakpoints usually suffice (640, 768, 1024px). Use `clamp()` for fluid values without breakpoints.
207
+
208
+ #### Detect Input Method, Not Just Screen Size
209
+
210
+ **Screen size doesn't tell you input method.** A laptop with touchscreen, a tablet with keyboard. Use pointer and hover queries:
211
+
212
+ ```css
213
+ /* Fine pointer (mouse, trackpad) */
214
+ @media (pointer: fine) {
215
+ .button { padding: 8px 16px; }
216
+ }
217
+
218
+ /* Coarse pointer (touch, stylus) */
219
+ @media (pointer: coarse) {
220
+ .button { padding: 12px 20px; } /* Larger touch target */
221
+ }
222
+
223
+ /* Device supports hover */
224
+ @media (hover: hover) {
225
+ .card:hover { transform: translateY(-2px); }
226
+ }
227
+
228
+ /* Device doesn't support hover (touch) */
229
+ @media (hover: none) {
230
+ .card { /* No hover state - use active instead */ }
231
+ }
232
+ ```
233
+
234
+ **Critical**: Don't rely on hover for functionality. Touch users can't hover.
235
+
236
+ #### Safe Areas: Handle the Notch
237
+
238
+ Modern phones have notches, rounded corners, and home indicators. Use `env()`:
239
+
240
+ ```css
241
+ body {
242
+ padding-top: env(safe-area-inset-top);
243
+ padding-bottom: env(safe-area-inset-bottom);
244
+ padding-left: env(safe-area-inset-left);
245
+ padding-right: env(safe-area-inset-right);
246
+ }
247
+
248
+ /* With fallback */
249
+ .footer {
250
+ padding-bottom: max(1rem, env(safe-area-inset-bottom));
251
+ }
252
+ ```
253
+
254
+ **Enable viewport-fit** in your meta tag:
255
+ ```html
256
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
257
+ ```
258
+
259
+ #### Responsive Images: Get It Right
260
+
261
+ ##### srcset with Width Descriptors
262
+
263
+ ```html
264
+ <img
265
+ src="hero-800.jpg"
266
+ srcset="
267
+ hero-400.jpg 400w,
268
+ hero-800.jpg 800w,
269
+ hero-1200.jpg 1200w
270
+ "
271
+ sizes="(max-width: 768px) 100vw, 50vw"
272
+ alt="Hero image"
273
+ >
274
+ ```
275
+
276
+ **How it works**:
277
+ - `srcset` lists available images with their actual widths (`w` descriptors)
278
+ - `sizes` tells the browser how wide the image will display
279
+ - Browser picks the best file based on viewport width AND device pixel ratio
280
+
281
+ ##### Picture Element for Art Direction
282
+
283
+ When you need different crops/compositions (not just resolutions):
284
+
285
+ ```html
286
+ <picture>
287
+ <source media="(min-width: 768px)" srcset="wide.jpg">
288
+ <source media="(max-width: 767px)" srcset="tall.jpg">
289
+ <img src="fallback.jpg" alt="...">
290
+ </picture>
291
+ ```
292
+
293
+ #### Layout Adaptation Patterns
294
+
295
+ **Navigation**: Three stages: hamburger + drawer on mobile, horizontal compact on tablet, full with labels on desktop. **Tables**: Transform to cards on mobile using `display: block` and `data-label` attributes. **Progressive disclosure**: Use `<details>/<summary>` for content that can collapse on mobile.
296
+
297
+ #### Testing: Don't Trust DevTools Alone
298
+
299
+ DevTools device emulation is useful for layout but misses:
300
+
301
+ - Actual touch interactions
302
+ - Real CPU/memory constraints
303
+ - Network latency patterns
304
+ - Font rendering differences
305
+ - Browser chrome/keyboard appearances
306
+
307
+ **Test on at least**: One real iPhone, one real Android, a tablet if relevant. Cheap Android phones reveal performance issues you'll never see on simulators.
308
+
309
+ ---
310
+
311
+ **Avoid**: Desktop-first design. Device detection instead of feature detection. Separate mobile/desktop codebases. Ignoring tablet and landscape. Assuming all mobile devices are powerful.