ima2-gen 2.0.15 → 2.0.16

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 (125) hide show
  1. package/README.md +30 -0
  2. package/bin/commands/skill.js +336 -17
  3. package/bin/ima2.js +22 -2
  4. package/bin/lib/doctor-checks.js +6 -4
  5. package/config.js +1 -0
  6. package/docs/CLI.md +25 -3
  7. package/docs/PROMPT_STUDIO.ko.md +29 -0
  8. package/docs/PROMPT_STUDIO.md +31 -0
  9. package/docs/migration/runtime-test-inventory.md +7 -1
  10. package/lib/agentImageVideoGen.js +8 -0
  11. package/lib/agentQueueStore.js +36 -10
  12. package/lib/agentQueueWorker.js +79 -7
  13. package/lib/agentRuntime.js +2 -0
  14. package/lib/assetLifecycle.js +40 -8
  15. package/lib/canvasVersionStore.js +86 -0
  16. package/lib/cardNewsGenerator.js +37 -3
  17. package/lib/cardNewsJobStore.js +10 -0
  18. package/lib/cardNewsManifestStore.js +6 -12
  19. package/lib/cardNewsPath.js +25 -0
  20. package/lib/db.js +2 -0
  21. package/lib/generatePipeline.js +474 -0
  22. package/lib/generationInputValidation.js +32 -0
  23. package/lib/grokImageCore.js +18 -1
  24. package/lib/historyIndex.js +11 -4
  25. package/lib/historyList.js +3 -0
  26. package/lib/imageMetadata.js +3 -0
  27. package/lib/inflight.js +30 -3
  28. package/lib/multimodePipeline.js +462 -0
  29. package/lib/nodeGeneration.js +440 -0
  30. package/lib/nodeValidation.js +23 -0
  31. package/lib/oauthProxy/generators.js +3 -246
  32. package/lib/oauthProxy/multimodeGenerators.js +251 -0
  33. package/lib/routeHelpers.js +9 -2
  34. package/package.json +2 -2
  35. package/routes/agent.js +4 -4
  36. package/routes/canvasVersions.js +21 -1
  37. package/routes/cardNews.js +2 -1
  38. package/routes/edit.js +25 -9
  39. package/routes/events.js +5 -1
  40. package/routes/generate.js +2 -481
  41. package/routes/keys.js +31 -39
  42. package/routes/multimode.js +2 -502
  43. package/routes/nodes.js +3 -448
  44. package/routes/video.js +12 -3
  45. package/routes/videoExtended.js +19 -4
  46. package/server.js +53 -1
  47. package/skills/ima2/SKILL.md +204 -0
  48. package/skills/ima2-front/SKILL.md +611 -0
  49. package/skills/ima2-front/references/a11y-patterns.md +134 -0
  50. package/skills/ima2-front/references/aesthetics.md +327 -0
  51. package/skills/ima2-front/references/anti-slop.md +241 -0
  52. package/skills/ima2-front/references/asset-requirements.md +431 -0
  53. package/skills/ima2-front/references/brand-asset-sourcing.md +122 -0
  54. package/skills/ima2-front/references/color-system.md +132 -0
  55. package/skills/ima2-front/references/consistency-locks.md +20 -0
  56. package/skills/ima2-front/references/crud-ui.md +53 -0
  57. package/skills/ima2-front/references/dropdown-layer.md +110 -0
  58. package/skills/ima2-front/references/i18n-global.md +104 -0
  59. package/skills/ima2-front/references/iterative-design.md +90 -0
  60. package/skills/ima2-front/references/korea-2026.md +174 -0
  61. package/skills/ima2-front/references/layout-discipline.md +161 -0
  62. package/skills/ima2-front/references/liquid-glass.md +181 -0
  63. package/skills/ima2-front/references/logo-sections.md +194 -0
  64. package/skills/ima2-front/references/mobile-ux.md +144 -0
  65. package/skills/ima2-front/references/performance-budget.md +106 -0
  66. package/skills/ima2-front/references/preflight-full.md +58 -0
  67. package/skills/ima2-front/references/product-density.md +53 -0
  68. package/skills/ima2-front/references/prototype-variants.md +54 -0
  69. package/skills/ima2-front/references/reference-capture.md +120 -0
  70. package/skills/ima2-front/references/responsive-viewport.md +139 -0
  71. package/skills/ima2-front/references/seo-baseline.md +123 -0
  72. package/skills/ima2-front/references/soft-3d-asset-gates.md +70 -0
  73. package/skills/ima2-front/references/stacks/astro.md +204 -0
  74. package/skills/ima2-front/references/stacks/mobile-native.md +281 -0
  75. package/skills/ima2-front/references/stacks/nextjs.md +219 -0
  76. package/skills/ima2-front/references/stacks/react.md +264 -0
  77. package/skills/ima2-front/references/stacks/svelte.md +235 -0
  78. package/skills/ima2-front/references/stacks/vanilla.md +226 -0
  79. package/skills/ima2-front/references/theme-switching.md +82 -0
  80. package/skills/ima2-front/references/top-bar.md +126 -0
  81. package/skills/ima2-front/references/typography-wrapping.md +270 -0
  82. package/skills/ima2-front/references/ux-writing-ko.md +62 -0
  83. package/skills/ima2-front/references/visual-verification.md +102 -0
  84. package/skills/ima2-uiux/SKILL.md +477 -0
  85. package/skills/ima2-uiux/references/anti-slop-judgment.md +39 -0
  86. package/skills/ima2-uiux/references/color-system.md +80 -0
  87. package/skills/ima2-uiux/references/design-isms.md +194 -0
  88. package/skills/ima2-uiux/references/design-read-example.md +33 -0
  89. package/skills/ima2-uiux/references/design-system-bootstrap.md +133 -0
  90. package/skills/ima2-uiux/references/favicon-logo.md +355 -0
  91. package/skills/ima2-uiux/references/form-patterns.md +118 -0
  92. package/skills/ima2-uiux/references/intent-discovery-ladder.md +86 -0
  93. package/skills/ima2-uiux/references/korean-design-vocabulary.md +52 -0
  94. package/skills/ima2-uiux/references/layout-macrostructures.md +54 -0
  95. package/skills/ima2-uiux/references/logo-trust-sections.md +96 -0
  96. package/skills/ima2-uiux/references/mobile-native-ux.md +207 -0
  97. package/skills/ima2-uiux/references/product-personalities.md +118 -0
  98. package/skills/ima2-uiux/references/responsive-nav.md +66 -0
  99. package/skills/ima2-uiux/references/typography-line-breaks.md +193 -0
  100. package/skills/ima2-uiux/references/ux-preflight.md +65 -0
  101. package/skills/ima2-uiux/references/ux-states.md +197 -0
  102. package/skills/ima2-uiux/references/visual-hierarchy.md +115 -0
  103. package/ui/dist/.vite/manifest.json +13 -13
  104. package/ui/dist/assets/AgentWorkspace-CtYt4SF5.js +3 -0
  105. package/ui/dist/assets/{CardNewsWorkspace-Cdxn1ohU.js → CardNewsWorkspace-DN5cVqG5.js} +1 -1
  106. package/ui/dist/assets/GenerationRequestLogPanel-DnmUQdKR.js +1 -0
  107. package/ui/dist/assets/{NodeCanvas-C67sLboA.js → NodeCanvas-CxpfIBI0.js} +1 -1
  108. package/ui/dist/assets/PromptBuilderPanel-C2R3ObtR.js +2 -0
  109. package/ui/dist/assets/{PromptImportDialog-DeQXsEEv.js → PromptImportDialog-BIxz_yEx.js} +2 -2
  110. package/ui/dist/assets/PromptImportDiscoverySection-BQTlPMME.js +1 -0
  111. package/ui/dist/assets/PromptImportFolderSection-Ds_Th9O3.js +1 -0
  112. package/ui/dist/assets/{PromptLibraryPanel-Db3xEPM_.js → PromptLibraryPanel-Rs4l45pV.js} +2 -2
  113. package/ui/dist/assets/{SettingsWorkspace-BDk_1W-V.js → SettingsWorkspace-p1AZ6uT9.js} +1 -1
  114. package/ui/dist/assets/index-0-_vgFGs.js +4 -0
  115. package/ui/dist/assets/index-Dm3pFxV4.js +23 -0
  116. package/ui/dist/assets/index-J8yDF3Ch.css +1 -0
  117. package/ui/dist/index.html +2 -2
  118. package/ui/dist/assets/AgentWorkspace-DAg_7zpY.js +0 -3
  119. package/ui/dist/assets/GenerationRequestLogPanel-C_qvEUi2.js +0 -1
  120. package/ui/dist/assets/PromptBuilderPanel-DjvVdAie.js +0 -2
  121. package/ui/dist/assets/PromptImportDiscoverySection-CrwyUKYI.js +0 -1
  122. package/ui/dist/assets/PromptImportFolderSection-CToGMqYE.js +0 -1
  123. package/ui/dist/assets/index-2oG6in1i.css +0 -1
  124. package/ui/dist/assets/index-CoxMOXAU.js +0 -23
  125. package/ui/dist/assets/index-p8egnGHk.js +0 -4
@@ -0,0 +1,174 @@
1
+ # Korea 2026 — Korean-First Frontend Rules
2
+
3
+ Use this when the UI is Korean-first, Korea-facing, or likely to be judged against Korean consumer/product norms.
4
+
5
+ ## Product Defaults
6
+
7
+ Korean product UI often values:
8
+
9
+ - dense but scannable information
10
+ - fast task completion over empty hero space
11
+ - mobile-first navigation and sticky actions
12
+ - trust-first presentation in finance, public services, healthcare, education, and B2B
13
+ - concrete visual assets over abstract gradient atmosphere
14
+ - familiar Korean copy with low friction
15
+
16
+ Do not treat "Korean design" as automatically cute, pastel, or mascot-heavy.
17
+
18
+ ## Domain Profiles
19
+
20
+ | Domain | Direction | Avoid |
21
+ | --- | --- | --- |
22
+ | Fintech/payment | calm, precise, explainable, reversible | childish mascots, vague trust claims, generic 3D icons |
23
+ | Public/gov | KRDS/KWCAG-minded, plain, predictable | decorative motion, cute assets, low contrast |
24
+ | B2B/SaaS/ops | dense, restrained, repeatable workflows | landing-page hero composition, card-heavy dashboards |
25
+ | Commerce/community | familiar, local, warm, concrete | generic global SaaS copy, fake reviews |
26
+ | Education/kids | guided, encouraging, visual, forgiving | confusing decoration, inaccessible contrast |
27
+ | AI tools | provenance, process, undo, permission clarity | magical gradients, no error/retry/cancel states |
28
+
29
+ ## Public Service / Regulated Korean UI
30
+
31
+ For government, public-service, finance, healthcare, education administration, or other regulated Korean surfaces:
32
+
33
+ - Use KRDS-minded structure when applicable: predictable navigation, consistent tokens, clear service patterns, and plain Korean labels.
34
+ - Apply KWCAG/WCAG accessibility thinking from the start: labels, keyboard operation, focus order, contrast, alternatives, error recovery, and status messaging.
35
+ - Favor trust, reversibility, and task completion over decorative personality.
36
+ - Avoid cute characters, playful metaphors, soft 3D mascots, and heavy motion unless they explain a task and pass stakeholder/a11y review.
37
+ - Treat 44×44px hit areas as a conservative mobile baseline; smaller targets must still satisfy WCAG 2.2 target-size/spacing requirements.
38
+
39
+ ## Korean Typography
40
+
41
+ - Use CJK-safe stacks first: Pretendard, SUIT, Noto Sans KR, Apple SD Gothic Neo, system sans fallback.
42
+ - Latin display fonts are optional accents, not the default for Hangul.
43
+ - Avoid negative letter-spacing as a default for Korean text.
44
+ - Body line-height should usually sit around 1.55-1.75.
45
+ - Large Korean headings need optical restraint; avoid hero-scale type inside tools.
46
+ - Test labels with long Hangul strings before delivery.
47
+
48
+ ### Korean Hero / Large Display Type (verified 2026-07-08)
49
+
50
+ Big bold Hangul is NOT the same as big bold Latin. Each Korean syllable is a
51
+ dense, near-square block with little ascender/descender rhythm, so at the same
52
+ px and weight it reads as a heavier graphic mass (Typotheque CJK typesetting;
53
+ Morisawa Hangeul guide). Scaling Hangul to Latin-poster size and weight is a
54
+ slop signal on landing/campaign surfaces too, not only inside tools — a
55
+ `clamp(..., 10rem)` / `line-height: 0.9` / weight `800-900` Korean hero is the
56
+ tell.
57
+
58
+ Measured on live premium Korean services (2026-07-08, Playwright computed style):
59
+
60
+ | Service | Korean hero (desktop) | Note |
61
+ | --- | --- | --- |
62
+ | Toss home | 66px / 700 / lh 1.4 | keep-all, letter-spacing normal |
63
+ | Toss team | 72px / 700 / lh 1.3 | keep-all |
64
+ | Daangn about | 64px / 700 / lh 1.31 | keep-all |
65
+ | Kakao corp | 70px / 700 / lh 1.27 | letter-spacing -3px |
66
+ | Woowa | Korean 40px / 700 | its 900 is on ENGLISH display only |
67
+ | Naver / Musinsa | 32px/600, 20px/600 | content- and image-led |
68
+
69
+ Rules (DEFAULT):
70
+ - **Weight**: `700` is the premium ceiling for long Korean hero copy; `600` for a
71
+ quieter tone. Reserve `800/900` for SHORT brand phrases (e.g. "토스페이스"),
72
+ English display, or deliberate poster impact — `900` on long Hangul reads blunt
73
+ before it reads refined.
74
+ - **Size**: keep desktop Korean heroes ~`56-72px`; avoid 100px+ walls of Hangul.
75
+ Mobile ~`26-40px`. Do not let a `vw`-relative clamp push Hangul past this.
76
+ - **Line-height**: `1.25-1.4` for multi-line Hangul. Do not copy Latin display
77
+ `line-height: 0.9-1.0`; dense Hangul needs air between lines.
78
+ - **Breaks**: `word-break: keep-all` + manual `<br>` at 어절/meaning boundaries;
79
+ never split inside a word.
80
+ - **Tracking**: default `normal` (0). Mild negative (`-0.01` to `-0.02em`) on
81
+ large display is an observed premium practice but optional and QA-gated; keep
82
+ body Korean at normal.
83
+ - **Structure over scale**: short Korean headline + supporting copy + whitespace +
84
+ imagery, or an English display accent, beats a giant Hangul wall. This is how
85
+ Toss/Woowa/Naver read premium.
86
+ - **Fonts**: Pretendard (safe premium default), Wanted Sans (brand-forward),
87
+ Spoqa Han Sans Neo (practical); reserve custom faces (Toss Product Sans style)
88
+ for brand budgets.
89
+
90
+ Sources: live pages toss.im, about.daangn.com, kakaocorp.com, woowahan.com,
91
+ navercorp.com, musinsa.com; Typotheque CJK typesetting; Morisawa Hangeul guide;
92
+ W3C Korean Layout Requirements (KLREQ); Pretendard / Wanted Sans / Spoqa docs.
93
+
94
+ ### Korean Serif / Myeongjo Display (verified 2026-07-09)
95
+
96
+ The Latin serif renaissance has a Korean lane, but it is **editorial myeongjo
97
+ display**, not a verified KR-AI-brand wave — do not claim Korean AI services
98
+ moved to myeongjo the way Anthropic moved to serif. Use myeongjo as a
99
+ domain-gated display direction for editorial, literary, cultural, publication,
100
+ and trust/heritage surfaces.
101
+
102
+ Webfont ranking (DEFAULT):
103
+ - **MaruBuri** (Naver, 명조/부리, ExtraLight-Bold): the best warm Korean
104
+ display serif for screens; use 400-600 for headlines, never for tiny UI text.
105
+ - **Noto Serif KR**: widest coverage and weight range, but heavy CJK payload —
106
+ subset aggressively or use the variable build.
107
+ - **Nanum Myeongjo**: familiar and literary, but reads dated for premium tech.
108
+ - **Chosun Myeongjo family**: strong newspaper-authority signal; choose it for
109
+ press/heritage tone, not soft AI warmth.
110
+
111
+ Pairing grammar mirrors the Latin three-role system: **myeongjo display +
112
+ Pretendard/SUIT/system sans UI** (+ mono accent for technical surfaces).
113
+ Keep myeongjo out of dashboards, dense tools, and body-size UI text; Hangul
114
+ serif strokes degrade at small sizes on low-DPI screens.
115
+
116
+ Adjacent sans-display lane: light centered Hangul display heroes use
117
+ Pretendard/SUIT/Wanted Sans at 300-400 **at display sizes only**
118
+ (>= ~40px; FE-HERO-LIGHT-CENTER-01). Hairline Hangul below display scale is a
119
+ legibility failure. This does not change the MaruBuri serif display band:
120
+ MaruBuri keeps its own 400-600 range for editorial myeongjo headlines.
121
+
122
+ Sources: hangeul.naver.com MaruBuri (명조/부리 category, 5 weights);
123
+ notofonts/noto-cjk Serif KR; live checks 2026-07-09 found no myeongjo-led
124
+ Korean AI product home (Brunch-class editorial products observed on sans).
125
+
126
+ ## Korean Formats
127
+
128
+ - Dates: `2026년 5월 10일`, `5월 10일`, `오후 9:41`.
129
+ - Counts: use Arabic numerals, Korean units where natural: `3개`, `1.2만`, `3억`.
130
+ - Currency: `1,234,567원`.
131
+ - Phone-like examples should use Korean patterns when relevant: `010-1234-5678`.
132
+
133
+ Use locale-aware formatters when possible rather than hand-building strings.
134
+
135
+ ## Mobile Patterns
136
+
137
+ Korean mobile product flows commonly expect:
138
+
139
+ - bottom sheets for lightweight choices
140
+ - full-screen flows for complex funnel steps
141
+ - sticky bottom actions for primary submit/continue
142
+ - snackbar/toast for reversible or low-risk confirmations
143
+ - pull-to-refresh where feed/list mental models exist
144
+ - safe-area handling on modern mobile devices
145
+
146
+ Do not use a modal for every decision.
147
+
148
+ ## Copy
149
+
150
+ For Korean copy, read `ux-writing-ko.md`. The short version:
151
+
152
+ - familiar words
153
+ - direct recovery actions in errors
154
+ - feature purpose over internal feature names
155
+ - minimal honorifics
156
+ - no translationese
157
+ - no childish friendliness in high-trust flows
158
+
159
+ ## Verified 2026 Additions (2026-07-02)
160
+
161
+ - **Pretendard** remains a strong Korean-first default; current release line includes
162
+ `Pretendard Variable` 1.3.9. Do not claim it as "the standard of Toss/당근" without a
163
+ product-specific source — verify brand font rules per product.
164
+ - **W3C KLREQ** (Korean Layout Requirements) has a 2026-03-21 note version — the
165
+ authoritative reference for Korean line-breaking and orphan rules.
166
+ - **Rendered screenshot gate**: after responsive changes, verify `word-break: keep-all`,
167
+ `text-wrap: balance` on short descriptors, and no lone particles/endings ("합니다.",
168
+ "화.") at target viewports. No browser API detects Korean orphans — screenshots are the gate.
169
+
170
+ | Claim | Source | Checked |
171
+ |---|---|---|
172
+ | Pretendard Variable 1.3.9 | https://github.com/orioncactus/pretendard | 2026-07-02 |
173
+ | KLREQ note 2026-03-21 | https://www.w3.org/TR/klreq/ | 2026-07-02 |
174
+ | keep-all CJK behavior | https://developer.mozilla.org/en-US/docs/Web/CSS/word-break | 2026-07-02 |
@@ -0,0 +1,161 @@
1
+ # Layout Discipline Rules
2
+
3
+ ## Hero Discipline (MANDATORY)
4
+ 1. Hero MUST fit initial viewport — headline ≤2 lines, subtext ≤20 words, CTA visible
5
+ 2. Font-scale: plan font + image together; default text-4xl md:text-5xl lg:text-6xl
6
+ 3. Top padding cap: max pt-24 (6rem) at desktop
7
+ 4. Stack discipline: max 4 text elements (eyebrow|brand-strip, headline, subtext, CTAs)
8
+ 5. Banned inside hero: tagline below CTAs, trust strip, pricing teaser, feature bullets
9
+ 6. "Used by" logo wall → separate section directly below hero
10
+
11
+ ## Hero Composition Grammar (verified 2026-07-09)
12
+
13
+ The classic SaaS split hero — left bold headline + subcopy + CTA, right boxed
14
+ product screenshot/mockup card — is the exhausted Stripe(2020)->Linear(2023)
15
+ template lineage; "Linear Design" is now a reproducible kit/template category
16
+ (LogRocket 2026-02-03). Treat it as a slop signal on brand/product homepages.
17
+ **FE-HERO-SPLIT-01: never choose a split hero unprompted — build one ONLY when
18
+ the user explicitly requests a split/2-column hero.** The one context where it
19
+ is worth *proposing* is a conversion-focused paid-acquisition landing page
20
+ where 5-second clarity beats brand memorability (Unbounce anatomy) — but even
21
+ there, suggest it and let the user decide; no universal A/B evidence favors
22
+ either shape (VWO). "This looks like a landing page" is NOT an exception.
23
+
24
+ Core inversion (DEFAULT): **the product visual is the STAGE, not a polite
25
+ right-column card.** Choose from the verified replacement menu (heroes
26
+ live-checked 2026-07-09):
27
+
28
+ | Composition | Shape | Verified users |
29
+ | --- | --- | --- |
30
+ | Centered stacked over media | centered headline + CTA over full-width media/video/canvas | OpenAI, Dia, Framer, Raycast |
31
+ | Product-as-stage | headline spans the width; huge product UI rises full-width BELOW, not beside | Linear, Cursor |
32
+ | Editorial opener | large text-led mission headline, no screenshot; editorial modules follow | Anthropic |
33
+ | Evolved split | copy left + giant animated canvas/visual behind/right — never a boxed screenshot card | Stripe, Vercel |
34
+ | Full-bleed consumer hero | centered copy over full-bleed photography/brand imagery | Toss |
35
+
36
+ Rules (DEFAULT):
37
+ - Without an explicit user request for a split hero (FE-HERO-SPLIT-01), do not
38
+ place a boxed screenshot, media, or device-mockup card in a right column of
39
+ the hero. If the product must appear in the first viewport, make it
40
+ full-width, background, environment, or an interactive demo surface.
41
+ - **FE-HERO-LIGHT-CENTER-01 (DEFAULT): Light Centered Display Hero.** A centered
42
+ hero headline is allowed as an intentional named pattern when the headline is
43
+ LIGHT weight (300-400, explicitly not bold), set over a full-width real media
44
+ or motion backdrop (photography, generated texture, or video; never a
45
+ gradient wash), with generous whitespace and a minimal copy stack (FE-HERO-01
46
+ copy budget still applies). Evidence: OpenAI announcement grammar; aside.com
47
+ measured 2026-07-10 with a custom display variable font, weight 400, 36px,
48
+ centered, over soft sky photography. The generic centered BOLD hero plus
49
+ template composition remains banned. This exception exists ONLY when the
50
+ light-weight headline and authored-media backdrop conditions both hold.
51
+ Composition ownership lives here; type exemplar details live in
52
+ `aesthetics.md` / `design-isms.md`.
53
+ - Korean note: "left bold Pretendard headline + right mockup" is the same dead
54
+ template in Korean surfaces; Toss itself uses centered copy over full-bleed
55
+ imagery, not a split.
56
+ - Replacement trend labels: story-driven heroes, scrollytelling, immersive 3D,
57
+ dimensionality/layers (SaaSFrame / Figma / Digidop / Contra, 2025-2026).
58
+
59
+ Sources: LogRocket "Linear Design" (2026-02-03); Nordcraft "why do all websites
60
+ look the same" (2024-09-03); Rectangle "The Linear effect" (2023-01-10); live
61
+ hero inspections of openai.com, linear.app, cursor.com, anthropic.com,
62
+ stripe.com, vercel.com, raycast.com, diabrowser.com, framer.com, toss.im
63
+ (2026-07-09); Unbounce landing-page anatomy; VWO A/B testing guide.
64
+
65
+ ## Eyebrow Restraint (MANDATORY)
66
+ - Maximum 1 eyebrow per 3 sections (hero counts as 1)
67
+ - Pre-flight mechanical check: count uppercase+tracking instances ≤ ceil(sectionCount / 3)
68
+ - Alternative: drop the eyebrow. Headline alone is enough.
69
+
70
+ ## Section Layout Repetition Ban
71
+ - Each layout family (3-col cards, split-text-image, full-width-quote, etc.) at most ONCE per page
72
+ - 8-section page needs ≥4 different layout families
73
+ - Cross-ref: aesthetics.md § Spatial Composition also bans 3-col cards and
74
+ centered heroes, except the named FE-HERO-LIGHT-CENTER-01 pattern above.
75
+
76
+ ## Zigzag Alternation Cap
77
+ - Max 2 consecutive left-image/right-text alternating sections
78
+ - 3rd consecutive = fail. Break with full-width, vertical-stack, bento, or different family
79
+ - Note: aesthetics.md recommends zigzag as alternative to 3-cards — that's fine for 1-2 uses, this rule caps overuse
80
+
81
+ ## Split-Header Ban
82
+ - "Left big headline + right small explainer paragraph" as section header: BANNED as default
83
+ - Stack vertically: headline on top, body below, max-width 65ch
84
+
85
+ ## Bento Rules
86
+ - Cell count: EXACTLY as many cells as content items. No empty cells.
87
+ - Background diversity: ≥2-3 cells need real visual variation (image, gradient, pattern)
88
+ - Rhythm: no one-sided repetition (6 left-image/right-text rows)
89
+
90
+ ### Bento Composition (FE-BENTO-01, DEFAULT)
91
+
92
+ A bento is one composed object, not a pile of cards. Catch these failures before styling:
93
+
94
+ - **Ragged rows**: cells in the same visual row ending at different heights with dead air below the short ones. Compose on an explicit grid (`grid-template-rows` / `grid-row: span n`) so every row edge lands on a shared line. If a cell can't fill its slot, its span is wrong or its content is thin.
95
+ - **Uniform-span monotony**: 6+ cells all 1x1 is a card grid wearing a bento costume. A real bento has 1 dominant cell (2x2 or 2x1) and clear size hierarchy: big = most important, not "whatever fit".
96
+ - **Span-content mismatch**: cell size must track content weight. A 2x2 cell holding one metric, or a 1x1 cell with a cramped 4-row table, both fail. Resize the cell or recut the content.
97
+ - **Orphan tail row**: last row with 1 cell + void. Re-span the tail cell to full width or merge its content upward.
98
+ - **Sealed-box syndrome**: every cell = same radius + same border + same padding + same background. Vary surface treatment: let 1-2 cells go borderless, let an image bleed to cell edges, let one cell be a flat stat with no chrome.
99
+ - **Density whiplash**: one cell packed with a data table next to a cell holding 3 words. Balance per-cell content weight before styling.
100
+ - **Gap drift**: one `gap` value for the whole bento, followed by random local margins, breaks the object illusion.
101
+
102
+ **Pre-ship check**: screenshot the bento, squint. If it reads as one interlocking slab, pass. If it reads as boxes floating near each other, recompose spans before touching colors.
103
+
104
+ ## Section Content Limits
105
+ - Default per section: short headline (≤8 words) + sub-paragraph (≤25 words) + one visual/CTA
106
+ - Long lists (>5 items): use cards/tabs/accordion/scroll-snap/carousel, not default <ul>
107
+ - Carousel is for browsing long homogeneous lists (product catalog, image gallery), NOT a default response to "복잡한" or "complex" briefs. If Design Read does not specify list-browsing UX, do not add carousels.
108
+ - Spec sheets: 2-col card grid, scroll-snap pills, grouped chunks, or featured-vs-rest
109
+ - Quotes: max 3 lines, attribution = name + role [+ company]
110
+
111
+ ## Page Containment (MANDATORY)
112
+ See `responsive-viewport.md` for the canonical containment rule (`max-w-[1400px] mx-auto`) and full explanation. Full-bleed sections break out with `w-screen` or negative margins; content inside stays contained.
113
+
114
+ ## Responsive Transforms by Section Type (MANDATORY)
115
+
116
+ Every section type MUST declare its behavior at each viewport tier. "Tailwind handles it" is not a responsive strategy.
117
+
118
+ ### Hero
119
+ - **Desktop (≥1024px)**: Side-by-side text+image or full-bleed. `text-4xl md:text-5xl lg:text-6xl`.
120
+ - **Tablet (768-1023px)**: Stack image behind/above, text below. One font-scale step down.
121
+ - **Mobile (<768px)**: Vertical stack. Image max 60vh. `text-3xl` max. Subtext ≤15 words. CTA visible without scroll. Full-width button.
122
+
123
+ ### Split Text-Image (60/40, 50/50)
124
+ - **Desktop**: Side-by-side columns.
125
+ - **Tablet**: Side-by-side if container ≥900px with tighter gap; stack if container <900px (use `@container`, not viewport).
126
+ - **Mobile**: Always stack. Image first (product/visual), text first (story/narrative). Never side-by-side.
127
+
128
+ ### Multi-Column Cards/Features (3+ columns)
129
+ - **Desktop**: `grid-cols-3` or `grid-cols-4`.
130
+ - **Tablet**: `grid-cols-2`.
131
+ - **Mobile**: `grid-cols-1`. Limit visible to 3-4 cards; rest behind "Show more" or horizontal scroll-snap.
132
+
133
+ ### Full-Width Quote
134
+ - **Desktop**: Large text, generous padding.
135
+ - **Tablet**: Same layout, one font-scale step down.
136
+ - **Mobile**: `text-xl` max. `px-6`. Attribution inline below quote.
137
+
138
+ ### Bento Grid
139
+ - **Desktop**: Multi-cell asymmetric layout.
140
+ - **Tablet**: Reduce to 2-column grid.
141
+ - **Mobile**: Single column. Each cell full-width.
142
+
143
+ ### Zigzag (Alternating Left/Right)
144
+ - **Desktop**: Left/right alternation.
145
+ - **Tablet**: Same if container ≥900px, else stack (use `@container`).
146
+ - **Mobile**: Always stack. Consistent order (no alternation). Pick image-then-text or text-then-image and keep it.
147
+
148
+ ### CTA Section
149
+ - **Desktop**: Centered with breathing room.
150
+ - **Tablet**: Same, tighter padding.
151
+ - **Mobile**: Full-width button. Remove decorative elements. Consider sticky bottom bar (see `mobile-ux.md`).
152
+
153
+ ### Logo Wall
154
+ - **Desktop**: Horizontal row or multi-row grid.
155
+ - **Tablet**: Wrap to 2 rows if needed.
156
+ - **Mobile**: Horizontal scroll-snap marquee or compact 2×3 grid. No orphan cells.
157
+
158
+ ### Pricing/Spec Grid
159
+ - **Desktop**: 2-3 column card layout.
160
+ - **Tablet**: 2 columns.
161
+ - **Mobile**: 1 column. Featured plan first. Comparison table → accordion.
@@ -0,0 +1,181 @@
1
+ # Liquid Glass & Translucent Materials - Implementation Guide
2
+
3
+ Implementation rules for Apple-class translucent materials ("Liquid Glass"),
4
+ classic glassmorphism, and the cheaper pill-over-imagery alternative.
5
+ Sources: Apple HIG Materials + aside.com rendered measurements + dcinside
6
+ practitioner notes (verified 2026-07-07; evidence:
7
+ `devlog/_fin/260707_liquid_glass_motion_trends/000_research.md`).
8
+ Design judgment (is glass domain-correct at all?) is owned by
9
+ `ima2-uiux` - this file owns material recipes. Top-bar composition,
10
+ slots, and scroll choreography live in `references/core/top-bar.md`.
11
+
12
+ ---
13
+
14
+ ## Layer Discipline (FE-LIQUID-LAYER-01, DEFAULT)
15
+
16
+ Apple's 2025-2026 material system treats glass as a **functional-layer
17
+ material**, and the rule ports directly to the web:
18
+
19
+ - Glass belongs to floating **controls and navigation**: sticky headers, tab
20
+ bars, sidebars, floating toolbars, command palettes, media overlays.
21
+ Content scrolls and "peeks through" beneath it - that is the entire point.
22
+ - **Never in the content layer.** Cards-as-content, app backgrounds, article
23
+ panels, and form bodies use solid or standard translucent surfaces, not
24
+ glass. Glass-on-everything flattens hierarchy and reads as 2026 AI slop.
25
+ Exception: a transient interactive element (slider/toggle mid-interaction)
26
+ may momentarily adopt glass to emphasize interactivity.
27
+ - **Use sparingly.** One glass layer class per viewport region. If two glass
28
+ surfaces stack, the lower one loses its meaning; merge, solidify, or demote
29
+ one.
30
+ - Prefer named material states over generic "regular glass" decisions. Text
31
+ chrome defaults to near-opaque pill material; highly transparent glass is a
32
+ media-overlay exception, not the baseline.
33
+
34
+ ## Named Material States (FE-LIQUID-STATE-01, DEFAULT)
35
+
36
+ | State | Legal Use | Material Contract |
37
+ | --- | --- | --- |
38
+ | `pill-at-top` | Text-bearing top bar ONLY while resting over a hero authored with a calm bar zone. | Pill chrome at about 70-80% opacity. No busy imagery, hard contrast, or scrolling content may sit beneath text. |
39
+ | `pill-scrolled` | Default text-bearing chrome state once content can pass beneath the bar. | Near-opaque 85-95% surface with blur 12-16px when blur is affordable; may collapse to blur-free near-opaque. |
40
+ | `media-overlay` | Media/photo/video controls where the image remains the subject. | The old canvas-55% regular recipe, demoted to overlay chrome only. Avoid dense text. |
41
+ | `clear` | Sparse, large controls over rich media only. | No blur backing; tint/border only. Never for text-heavy nav, menus, forms, or body content. |
42
+
43
+ Scroll-adaptive top bars transition from `pill-at-top` to `pill-scrolled` by
44
+ animating background-color/opacity only. Do not morph size, radius, padding, or
45
+ layout on a blurred bar; that belongs in `top-bar.md` composition planning and
46
+ is also a performance constraint below.
47
+
48
+ Bar-spawned surfaces (dropdowns, menus, popovers, combobox panels, date pickers,
49
+ and hover/tap-revealed chrome) are **unconditionally near-opaque, blur-free
50
+ SOLID**. They do not inherit `pill-at-top`, `pill-scrolled`, `media-overlay`, or
51
+ `clear`. This resolves glass-on-glass stacking and preserves the <= 2 visible
52
+ blurred-surfaces budget.
53
+
54
+ ## Pill Nesting (FE-PILL-NEST-01, DEFAULT)
55
+
56
+ Inside a pill container (border-radius >= 24px or the `9999px` chrome class),
57
+ child elements must NOT render their own capsule border or outline at rest. The
58
+ `( () () () )` nested-ring look is banned.
59
+
60
+ This is a visual border/outline rule, not a functional ban:
61
+
62
+ - Solid fills are not restricted by this rule, at any count.
63
+ - One-primary-action and accent-budget hierarchy rules still apply on top.
64
+ - The container's own single hairline border stays legal.
65
+ - Shadow-only children are legal.
66
+ - Hover, active, and `aria-current` fills/tints are legal at rest.
67
+
68
+ ## CSS Recipes (STYLE_SAMPLE)
69
+
70
+ ```css
71
+ /* pill-at-top - text-bearing top bar over an authored calm hero zone */
72
+ .liquid-pill-at-top {
73
+ background: rgb(255 255 255 / 0.76);
74
+ border: 1px solid rgb(255 255 255 / 0.26);
75
+ border-radius: 9999px;
76
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.16),
77
+ 0 8px 28px rgb(0 0 0 / 0.10);
78
+ }
79
+
80
+ /* pill-scrolled - default text-bearing chrome */
81
+ .liquid-pill-scrolled {
82
+ background: rgb(255 255 255 / 0.90);
83
+ backdrop-filter: blur(14px) saturate(1.25);
84
+ -webkit-backdrop-filter: blur(14px) saturate(1.25);
85
+ border: 1px solid rgb(255 255 255 / 0.24);
86
+ border-radius: 9999px;
87
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.14),
88
+ 0 10px 32px rgb(0 0 0 / 0.12);
89
+ }
90
+
91
+ /* media-overlay - old "regular glass", now only for media/photo overlay chrome */
92
+ .liquid-media-overlay {
93
+ background: color-mix(in oklab, canvas 55%, transparent);
94
+ backdrop-filter: blur(16px) saturate(1.4);
95
+ -webkit-backdrop-filter: blur(16px) saturate(1.4);
96
+ border: 1px solid rgb(255 255 255 / 0.18);
97
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.12),
98
+ 0 8px 32px rgb(0 0 0 / 0.12);
99
+ }
100
+
101
+ /* clear - sparse controls over rich media only */
102
+ .liquid-clear {
103
+ background: rgb(255 255 255 / 0.10);
104
+ border: 1px solid rgb(255 255 255 / 0.25);
105
+ /* no backdrop-filter: content behind stays crisp */
106
+ }
107
+
108
+ /* bar-spawned menu/popover/select surface */
109
+ .chrome-surface-solid {
110
+ background: rgb(255 255 255 / 0.96);
111
+ border: 1px solid rgb(0 0 0 / 0.08);
112
+ border-radius: 18px;
113
+ box-shadow: 0 18px 48px rgb(0 0 0 / 0.16);
114
+ }
115
+
116
+ /* blur-free pill chip - aside.com pattern */
117
+ .pill-chip {
118
+ background: rgb(255 255 255 / 0.92);
119
+ border-radius: 9999px;
120
+ box-shadow: 0 2px 12px rgb(0 0 0 / 0.08);
121
+ }
122
+ ```
123
+
124
+ ### Glass without blur (aside.com pattern, measured 2026-07-07)
125
+
126
+ The user-visible "liquid glass feel" often needs NO backdrop-filter at all.
127
+ aside.com renders 0 `backdrop-filter` elements site-wide; the material feel
128
+ comes from **opaque/translucent white pills and rounded cards floating over
129
+ soft photographic or pastel-gradient backgrounds**.
130
+
131
+ Prefer this pattern when: many chips/cards per viewport, mid/low-end device
132
+ targets, or text-heavy chips - it is cheaper, more legible, and still reads
133
+ as the 2026 Apple-pastel language.
134
+
135
+ ### Pill geometry (STYLE_SAMPLE, aside.com measured)
136
+
137
+ Rounded systems read as designed when radii form a small scale, not one
138
+ global value: e.g. 8px (inputs, small cards) / 12px (cards) / 16-20px
139
+ (containers, modals) + `9999px` pill class for chips, CTAs, and eyebrows.
140
+ Interactive chips are pills; page-level containers take the largest tier.
141
+ Do not mix a pill CTA with a 4px-radius input in the same cluster.
142
+
143
+ ## Performance Gate (FE-LIQUID-PERF-01, DEFAULT)
144
+
145
+ Conservative local guidance. The cost model below is Tier-1 corroborated,
146
+ not locally benchmarked (see the research doc in the header) - treat
147
+ `backdrop-filter` as expensive by default until profiling says otherwise:
148
+
149
+ - Keep blurred surfaces **small**: chrome bars and chips, never full-page
150
+ overlays or hero-sized panels.
151
+ - Keep radius modest (12-16px for pill chrome; 8-20px broader range); expect
152
+ cost to grow with blurred area and radius.
153
+ - Avoid `backdrop-filter` on elements inside scrolling containers or on
154
+ elements that animate size, position, radius, padding, or layout; scroll
155
+ state changes on blurred bars animate background-color/opacity only.
156
+ - Per-viewport budget: aim for <= 2 backdrop-filtered surfaces visible at
157
+ once; prefer blur-free near-opaque surfaces beyond that.
158
+ - Profile on a mid-range phone before shipping any glass-heavy surface; if
159
+ scrolling stutters, swap blurred states for near-opaque solid surfaces first.
160
+
161
+ ## Accessibility Gate (FE-LIQUID-A11Y-01, STRICT)
162
+
163
+ This gate is supreme over all named states. Under reduced-transparency or
164
+ high-contrast preferences, every translucent state collapses to solid or
165
+ near-opaque; state names do not override the user preference.
166
+
167
+ - Honor user material preferences: reduce or remove translucency under
168
+ `@media (prefers-reduced-transparency: reduce)` (check current browser
169
+ support before relying on it; provide a solid fallback background
170
+ regardless) and raise surface opacity under `@media (prefers-contrast:
171
+ more)`.
172
+ - **Contrast on translucent states is unprovable from tokens alone**: text
173
+ over `pill-at-top`, `pill-scrolled`, `media-overlay`, or `clear` must pass
174
+ WCAG contrast against the WORST-case background that can appear beneath it.
175
+ Verify with a rendered screenshot over the busiest background state, not
176
+ against the tint color. Unconditionally opaque spawned surfaces are audited
177
+ for normal contrast, not translucency.
178
+ - Blur is not a contrast tool. If text needs the blur to be readable, the
179
+ surface opacity is too low.
180
+ - `backdrop-filter` failures (unsupported engines) must degrade to a solid
181
+ or near-opaque background via `@supports not (backdrop-filter: blur(1px))`.