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.
- package/README.md +30 -0
- package/bin/commands/skill.js +336 -17
- package/bin/ima2.js +22 -2
- package/bin/lib/doctor-checks.js +6 -4
- package/config.js +1 -0
- package/docs/CLI.md +25 -3
- package/docs/PROMPT_STUDIO.ko.md +29 -0
- package/docs/PROMPT_STUDIO.md +31 -0
- package/docs/migration/runtime-test-inventory.md +7 -1
- package/lib/agentImageVideoGen.js +8 -0
- package/lib/agentQueueStore.js +36 -10
- package/lib/agentQueueWorker.js +79 -7
- package/lib/agentRuntime.js +2 -0
- package/lib/assetLifecycle.js +40 -8
- package/lib/canvasVersionStore.js +86 -0
- package/lib/cardNewsGenerator.js +37 -3
- package/lib/cardNewsJobStore.js +10 -0
- package/lib/cardNewsManifestStore.js +6 -12
- package/lib/cardNewsPath.js +25 -0
- package/lib/db.js +2 -0
- package/lib/generatePipeline.js +474 -0
- package/lib/generationInputValidation.js +32 -0
- package/lib/grokImageCore.js +18 -1
- package/lib/historyIndex.js +11 -4
- package/lib/historyList.js +3 -0
- package/lib/imageMetadata.js +3 -0
- package/lib/inflight.js +30 -3
- package/lib/multimodePipeline.js +462 -0
- package/lib/nodeGeneration.js +440 -0
- package/lib/nodeValidation.js +23 -0
- package/lib/oauthProxy/generators.js +3 -246
- package/lib/oauthProxy/multimodeGenerators.js +251 -0
- package/lib/routeHelpers.js +9 -2
- package/package.json +2 -2
- package/routes/agent.js +4 -4
- package/routes/canvasVersions.js +21 -1
- package/routes/cardNews.js +2 -1
- package/routes/edit.js +25 -9
- package/routes/events.js +5 -1
- package/routes/generate.js +2 -481
- package/routes/keys.js +31 -39
- package/routes/multimode.js +2 -502
- package/routes/nodes.js +3 -448
- package/routes/video.js +12 -3
- package/routes/videoExtended.js +19 -4
- package/server.js +53 -1
- package/skills/ima2/SKILL.md +204 -0
- package/skills/ima2-front/SKILL.md +611 -0
- package/skills/ima2-front/references/a11y-patterns.md +134 -0
- package/skills/ima2-front/references/aesthetics.md +327 -0
- package/skills/ima2-front/references/anti-slop.md +241 -0
- package/skills/ima2-front/references/asset-requirements.md +431 -0
- package/skills/ima2-front/references/brand-asset-sourcing.md +122 -0
- package/skills/ima2-front/references/color-system.md +132 -0
- package/skills/ima2-front/references/consistency-locks.md +20 -0
- package/skills/ima2-front/references/crud-ui.md +53 -0
- package/skills/ima2-front/references/dropdown-layer.md +110 -0
- package/skills/ima2-front/references/i18n-global.md +104 -0
- package/skills/ima2-front/references/iterative-design.md +90 -0
- package/skills/ima2-front/references/korea-2026.md +174 -0
- package/skills/ima2-front/references/layout-discipline.md +161 -0
- package/skills/ima2-front/references/liquid-glass.md +181 -0
- package/skills/ima2-front/references/logo-sections.md +194 -0
- package/skills/ima2-front/references/mobile-ux.md +144 -0
- package/skills/ima2-front/references/performance-budget.md +106 -0
- package/skills/ima2-front/references/preflight-full.md +58 -0
- package/skills/ima2-front/references/product-density.md +53 -0
- package/skills/ima2-front/references/prototype-variants.md +54 -0
- package/skills/ima2-front/references/reference-capture.md +120 -0
- package/skills/ima2-front/references/responsive-viewport.md +139 -0
- package/skills/ima2-front/references/seo-baseline.md +123 -0
- package/skills/ima2-front/references/soft-3d-asset-gates.md +70 -0
- package/skills/ima2-front/references/stacks/astro.md +204 -0
- package/skills/ima2-front/references/stacks/mobile-native.md +281 -0
- package/skills/ima2-front/references/stacks/nextjs.md +219 -0
- package/skills/ima2-front/references/stacks/react.md +264 -0
- package/skills/ima2-front/references/stacks/svelte.md +235 -0
- package/skills/ima2-front/references/stacks/vanilla.md +226 -0
- package/skills/ima2-front/references/theme-switching.md +82 -0
- package/skills/ima2-front/references/top-bar.md +126 -0
- package/skills/ima2-front/references/typography-wrapping.md +270 -0
- package/skills/ima2-front/references/ux-writing-ko.md +62 -0
- package/skills/ima2-front/references/visual-verification.md +102 -0
- package/skills/ima2-uiux/SKILL.md +477 -0
- package/skills/ima2-uiux/references/anti-slop-judgment.md +39 -0
- package/skills/ima2-uiux/references/color-system.md +80 -0
- package/skills/ima2-uiux/references/design-isms.md +194 -0
- package/skills/ima2-uiux/references/design-read-example.md +33 -0
- package/skills/ima2-uiux/references/design-system-bootstrap.md +133 -0
- package/skills/ima2-uiux/references/favicon-logo.md +355 -0
- package/skills/ima2-uiux/references/form-patterns.md +118 -0
- package/skills/ima2-uiux/references/intent-discovery-ladder.md +86 -0
- package/skills/ima2-uiux/references/korean-design-vocabulary.md +52 -0
- package/skills/ima2-uiux/references/layout-macrostructures.md +54 -0
- package/skills/ima2-uiux/references/logo-trust-sections.md +96 -0
- package/skills/ima2-uiux/references/mobile-native-ux.md +207 -0
- package/skills/ima2-uiux/references/product-personalities.md +118 -0
- package/skills/ima2-uiux/references/responsive-nav.md +66 -0
- package/skills/ima2-uiux/references/typography-line-breaks.md +193 -0
- package/skills/ima2-uiux/references/ux-preflight.md +65 -0
- package/skills/ima2-uiux/references/ux-states.md +197 -0
- package/skills/ima2-uiux/references/visual-hierarchy.md +115 -0
- package/ui/dist/.vite/manifest.json +13 -13
- package/ui/dist/assets/AgentWorkspace-CtYt4SF5.js +3 -0
- package/ui/dist/assets/{CardNewsWorkspace-Cdxn1ohU.js → CardNewsWorkspace-DN5cVqG5.js} +1 -1
- package/ui/dist/assets/GenerationRequestLogPanel-DnmUQdKR.js +1 -0
- package/ui/dist/assets/{NodeCanvas-C67sLboA.js → NodeCanvas-CxpfIBI0.js} +1 -1
- package/ui/dist/assets/PromptBuilderPanel-C2R3ObtR.js +2 -0
- package/ui/dist/assets/{PromptImportDialog-DeQXsEEv.js → PromptImportDialog-BIxz_yEx.js} +2 -2
- package/ui/dist/assets/PromptImportDiscoverySection-BQTlPMME.js +1 -0
- package/ui/dist/assets/PromptImportFolderSection-Ds_Th9O3.js +1 -0
- package/ui/dist/assets/{PromptLibraryPanel-Db3xEPM_.js → PromptLibraryPanel-Rs4l45pV.js} +2 -2
- package/ui/dist/assets/{SettingsWorkspace-BDk_1W-V.js → SettingsWorkspace-p1AZ6uT9.js} +1 -1
- package/ui/dist/assets/index-0-_vgFGs.js +4 -0
- package/ui/dist/assets/index-Dm3pFxV4.js +23 -0
- package/ui/dist/assets/index-J8yDF3Ch.css +1 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/AgentWorkspace-DAg_7zpY.js +0 -3
- package/ui/dist/assets/GenerationRequestLogPanel-C_qvEUi2.js +0 -1
- package/ui/dist/assets/PromptBuilderPanel-DjvVdAie.js +0 -2
- package/ui/dist/assets/PromptImportDiscoverySection-CrwyUKYI.js +0 -1
- package/ui/dist/assets/PromptImportFolderSection-CToGMqYE.js +0 -1
- package/ui/dist/assets/index-2oG6in1i.css +0 -1
- package/ui/dist/assets/index-CoxMOXAU.js +0 -23
- 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))`.
|