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,96 @@
|
|
|
1
|
+
# Logo Trust Sections — Design Patterns & Judgment
|
|
2
|
+
|
|
3
|
+
Design guidance for integration/partner/client logo sections. These are trust signals, not UI components.
|
|
4
|
+
|
|
5
|
+
Read `dev-frontend/references/core/logo-sections.md` for the CSS implementation.
|
|
6
|
+
Read `dev-frontend/references/core/brand-asset-sourcing.md` for SVG sourcing.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. Purpose
|
|
11
|
+
|
|
12
|
+
Logo sections serve ONE job: **social proof**. They answer: "Who else uses this?"
|
|
13
|
+
|
|
14
|
+
They are NOT:
|
|
15
|
+
- Navigation (users don't click them)
|
|
16
|
+
- Feature lists (no detailed info needed)
|
|
17
|
+
- Calls to action (no conversion expected)
|
|
18
|
+
- Interactive components (no hover/click feedback expected)
|
|
19
|
+
|
|
20
|
+
Design them as passive, ambient trust signals. Like a restaurant displaying a Michelin star — you notice it, you don't interact with it.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Pattern Decision Table
|
|
25
|
+
|
|
26
|
+
| Situation | Pattern | Rationale |
|
|
27
|
+
|-----------|---------|-----------|
|
|
28
|
+
| 3-6 recognizable logos | Static flex row, centered | Clean, scannable, no animation needed |
|
|
29
|
+
| 8-15 logos | Single-row marquee | Avoids orphan cells, shows volume |
|
|
30
|
+
| 15+ logos | Dual-row opposing marquee | Shows scale, feels dynamic |
|
|
31
|
+
| Logos link to case studies | Static grid, clickable | Links add value, hover justified |
|
|
32
|
+
| Premium/enterprise feel | Static grid, generous spacing | Motion can feel unserious |
|
|
33
|
+
| Startup/modern SaaS feel | Marquee, fast but smooth | Energy matches brand |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Anti-Patterns (Do NOT)
|
|
38
|
+
|
|
39
|
+
### 1. Individual hover effects on non-clickable logos
|
|
40
|
+
Users hover, expect a click target, find nothing. Trust signals should never feel broken.
|
|
41
|
+
|
|
42
|
+
### 2. CSS Grid with orphan cells
|
|
43
|
+
One logo alone on the last row looks broken. Use flexbox or marquee instead.
|
|
44
|
+
|
|
45
|
+
### 3. Generic stroke icons instead of brand marks
|
|
46
|
+
Use actual brand SVGs from Simple Icons, SVGL, or press kits. See `brand-asset-sourcing.md`.
|
|
47
|
+
|
|
48
|
+
### 4. Colorful logos clashing with each other
|
|
49
|
+
Multiple full-color logos fight for attention. Apply uniform grayscale treatment.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Visual Treatment
|
|
54
|
+
|
|
55
|
+
**Default state:** All logos monochrome, dimmed, uniform height (28-32px).
|
|
56
|
+
|
|
57
|
+
**Dark mode:** Invert for visibility with `brightness(1.2) invert(1)`.
|
|
58
|
+
|
|
59
|
+
**Consistent sizing:** Set a uniform `height` and let `width: auto` maintain aspect ratios. Do NOT stretch logos.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Placement on Page
|
|
64
|
+
|
|
65
|
+
| Position | Effectiveness | Notes |
|
|
66
|
+
|----------|--------------|-------|
|
|
67
|
+
| Below hero, above fold | Highest | Immediate credibility before scroll |
|
|
68
|
+
| Near pricing/CTA | High | Reduces purchase anxiety |
|
|
69
|
+
| Mid-page section break | Medium | Trust reinforcement during consideration |
|
|
70
|
+
| Footer area | Low | Afterthought feel |
|
|
71
|
+
|
|
72
|
+
**Best practice:** Place near the primary conversion point (pricing, sign-up, CTA). "Trusted by" directly above the CTA is a strong pattern.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Marquee Speed Guidelines
|
|
77
|
+
|
|
78
|
+
| Speed | Duration | Feel | Use |
|
|
79
|
+
|-------|----------|------|-----|
|
|
80
|
+
| Very slow | 50-60s | Calm, premium | Enterprise, finance |
|
|
81
|
+
| Slow | 30-40s | Professional | General SaaS |
|
|
82
|
+
| Medium | 20-30s | Energetic | Startups, dev tools |
|
|
83
|
+
| Fast | <15s | Cheap, frantic | **Avoid** |
|
|
84
|
+
|
|
85
|
+
`linear` timing function only — no easing. Constant speed feels intentional; eased motion feels like a carousel.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Accessibility Requirements
|
|
90
|
+
|
|
91
|
+
- [ ] `aria-label` on marquee container: "Trusted by leading companies"
|
|
92
|
+
- [ ] Duplicate logos get `aria-hidden="true"` and empty `alt=""`
|
|
93
|
+
- [ ] `prefers-reduced-motion: reduce` stops all animation
|
|
94
|
+
- [ ] Sufficient contrast between logos and background
|
|
95
|
+
- [ ] Logos have meaningful `alt` text (first set only)
|
|
96
|
+
- [ ] Pause-on-hover behavior for marquee
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Mobile Native UX Conventions
|
|
2
|
+
|
|
3
|
+
**Last reviewed**: 2026-06-16
|
|
4
|
+
**Applies to**: iOS 18+, Android 15+, cross-platform (RN/Flutter/KMP)
|
|
5
|
+
**When to read**: Native mobile app UX decisions, platform conventions, deep linking, app store submission, native mobile product work
|
|
6
|
+
**Canonical owner**: `ima2-uiux` — platform UX judgment (when/why)
|
|
7
|
+
**Non-goals**: Framework selection and code patterns (→ `dev-frontend/references/stacks/mobile-native.md`), push/offline API (→ `dev-backend/references/core/mobile-api.md`), mobile web UX (→ `dev-frontend/references/core/mobile-ux.md`)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Platform UX Conventions
|
|
12
|
+
|
|
13
|
+
| Convention | iOS (HIG) | Android (Material 3) | Cross-Platform Guidance |
|
|
14
|
+
|-----------|----------|---------------------|------------------------|
|
|
15
|
+
| **Navigation** | Tab bar (bottom), back via swipe-right | Bottom nav bar, back via system gesture/button | Use platform-native nav; don't force iOS tabs on Android or vice versa |
|
|
16
|
+
| **Primary action** | Right side of nav bar or prominent button | FAB (56dp) or top app bar action | Respect platform placement; FAB on Android, bar button on iOS |
|
|
17
|
+
| **Destructive confirm** | Action sheet from bottom | Dialog (centered) | Use platform-native confirmation pattern |
|
|
18
|
+
| **Pull to refresh** | Native `UIRefreshControl` spinner | `SwipeRefresh` circular indicator | Use platform-native indicator; don't custom-animate |
|
|
19
|
+
| **Settings** | System Settings deep link for permissions | In-app settings screen | iOS: link to Settings app for system permissions; Android: handle in-app |
|
|
20
|
+
| **Typography** | SF Pro (system), Dynamic Type support mandatory | Roboto (system), `sp` units for accessibility scaling | Always use system font; support dynamic/accessibility text sizing |
|
|
21
|
+
| **Haptics** | `UIImpactFeedbackGenerator` (light/medium/heavy) | `HapticFeedbackConstants` (confirm/reject/long press) | Map semantic haptics to platform API; never skip on destructive actions |
|
|
22
|
+
|
|
23
|
+
### Platform detection decision
|
|
24
|
+
|
|
25
|
+
| Approach | When | Risk |
|
|
26
|
+
|----------|------|------|
|
|
27
|
+
| Single UI, platform-adaptive widgets | MVP, small team, content-heavy apps | May feel "off" to power users |
|
|
28
|
+
| Platform-specific UI shells, shared logic | Production apps, platform-critical UX | Higher maintenance, better native feel |
|
|
29
|
+
| Fully native per platform | Finance, health, OS-integrated apps | 2x effort, best UX |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. Native Gestures
|
|
34
|
+
|
|
35
|
+
| Gesture | iOS | Android | Usage |
|
|
36
|
+
|---------|-----|---------|-------|
|
|
37
|
+
| Swipe-to-dismiss | `interactiveDismissTransition` / sheet detent | `predictiveBackGesture` (Android 14+) | Modal/detail screens; always provide alternative close button |
|
|
38
|
+
| Long press | `UIContextMenuInteraction` (peek/pop) | `onLongClickListener` → context menu | Secondary actions; discoverable via visible menu icon |
|
|
39
|
+
| Pinch zoom | `UIPinchGestureRecognizer` | `ScaleGestureDetector` | Images, maps; show zoom controls for accessibility |
|
|
40
|
+
| Edge swipe | System back gesture (left edge) | System back (both edges on gesture nav) | Never override system back; use `popGesture` only within app nav |
|
|
41
|
+
| Pull down | Refresh (`UIRefreshControl`) | Notification shade (system) | iOS: pull-to-refresh is standard; Android: avoid pull-to-refresh conflict with notification shade |
|
|
42
|
+
|
|
43
|
+
### Gesture conflict resolution
|
|
44
|
+
|
|
45
|
+
| Conflict | Resolution |
|
|
46
|
+
|----------|-----------|
|
|
47
|
+
| Horizontal swipe (carousel) vs edge-back | Inset carousel 16dp from edges; let edge gesture pass through |
|
|
48
|
+
| Pull-to-refresh vs scroll-up | Trigger refresh only when `scrollY === 0` |
|
|
49
|
+
| Bottom sheet drag vs list scroll | Lock sheet drag when inner list is scrollable and `scrollY > 0` |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 3. Deep Linking
|
|
54
|
+
|
|
55
|
+
### Universal Links (iOS) + App Links (Android)
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
// apple-app-site-association (AASA) — host at /.well-known/
|
|
59
|
+
{
|
|
60
|
+
"applinks": {
|
|
61
|
+
"apps": [],
|
|
62
|
+
"details": [{
|
|
63
|
+
"appID": "TEAMID.com.example.app",
|
|
64
|
+
"paths": ["/product/*", "/invite/*", "/u/*"]
|
|
65
|
+
}]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
// assetlinks.json — host at /.well-known/
|
|
72
|
+
[{
|
|
73
|
+
"relation": ["delegate_permission/common.handle_all_urls"],
|
|
74
|
+
"target": {
|
|
75
|
+
"namespace": "android_app",
|
|
76
|
+
"package_name": "com.example.app",
|
|
77
|
+
"sha256_cert_fingerprints": ["AB:CD:..."]
|
|
78
|
+
}
|
|
79
|
+
}]
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Deferred deep linking (first install)
|
|
83
|
+
|
|
84
|
+
| Method | Mechanism | Accuracy |
|
|
85
|
+
|--------|-----------|----------|
|
|
86
|
+
| Clipboard-based | Copy link → app reads on first launch | High but requires user consent prompt (iOS 16+) |
|
|
87
|
+
| Fingerprint matching | IP + UA + timestamp → match install to click | ~80%, degrades with VPN/carrier NAT |
|
|
88
|
+
| Platform SDK | Firebase Dynamic Links (deprecated) → use Branch.io or Adjust | High, third-party dependency |
|
|
89
|
+
|
|
90
|
+
### Korean in-app browser fallback
|
|
91
|
+
|
|
92
|
+
카카오톡, 네이버 앱 내 브라우저는 Universal Links/App Links를 무시하는 경우가 많다.
|
|
93
|
+
|
|
94
|
+
| Platform | Workaround |
|
|
95
|
+
|----------|-----------|
|
|
96
|
+
| KakaoTalk in-app | Intent scheme (`intent://...#Intent;scheme=myapp;package=com.example.app;end`) for Android; iOS는 `kakaolink://` scheme으로 외부 브라우저 유도 |
|
|
97
|
+
| Naver in-app | `naversearchapp://` intent or JavaScript bridge `openExternalBrowser()` |
|
|
98
|
+
| General fallback | `window.location.href = "myapp://path"` → setTimeout → redirect to store |
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
// Universal fallback pattern for Korean in-app browsers
|
|
102
|
+
function openAppOrStore(appUrl, iosStore, androidStore) {
|
|
103
|
+
const ua = navigator.userAgent;
|
|
104
|
+
const isAndroid = /android/i.test(ua);
|
|
105
|
+
const isKakao = /kakaotalk/i.test(ua);
|
|
106
|
+
const isNaver = /naver/i.test(ua);
|
|
107
|
+
|
|
108
|
+
if (isAndroid && (isKakao || isNaver)) {
|
|
109
|
+
// Intent scheme bypasses in-app browser restrictions
|
|
110
|
+
location.href = `intent://${appUrl}#Intent;scheme=myapp;package=com.example.app;S.browser_fallback_url=${encodeURIComponent(androidStore)};end`;
|
|
111
|
+
} else {
|
|
112
|
+
location.href = `myapp://${appUrl}`;
|
|
113
|
+
setTimeout(() => {
|
|
114
|
+
location.href = isAndroid ? androidStore : iosStore;
|
|
115
|
+
}, 1500);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 4. Onboarding & Permissions
|
|
123
|
+
|
|
124
|
+
### Permission request timing
|
|
125
|
+
|
|
126
|
+
| Permission | When to Ask | Never Ask |
|
|
127
|
+
|-----------|-------------|-----------|
|
|
128
|
+
| Push notifications | After first value delivery (e.g., first order placed) | On app launch before any interaction |
|
|
129
|
+
| Camera | When user taps "scan" or "take photo" | During onboarding |
|
|
130
|
+
| Location | When showing map or nearby results | Before showing why location is needed |
|
|
131
|
+
| Contacts | When user taps "invite friends" | During onboarding |
|
|
132
|
+
| Tracking (ATT) | After explaining personalized experience benefit | As the very first screen (iOS rejects) |
|
|
133
|
+
|
|
134
|
+
### Korean privacy compliance (개인정보보호법)
|
|
135
|
+
|
|
136
|
+
| Requirement | Implementation |
|
|
137
|
+
|-------------|---------------|
|
|
138
|
+
| 개인정보 수집·이용 동의 | Separate consent checkbox, not bundled with terms of service |
|
|
139
|
+
| 마케팅 수신 동의 | Opt-in (not opt-out), separate from service consent |
|
|
140
|
+
| 만 14세 미만 | Legal guardian consent required; age gate before signup |
|
|
141
|
+
| 수집 항목 명시 | List exact fields collected (이름, 이메일, 전화번호) in consent screen |
|
|
142
|
+
| 보유 기간 | State retention period explicitly ("회원 탈퇴 시까지" or specific duration) |
|
|
143
|
+
|
|
144
|
+
### Consent screen pattern
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
┌─────────────────────────────────┐
|
|
148
|
+
│ [서비스 이용약관] (필수) [보기>] │ ☑
|
|
149
|
+
│ [개인정보 수집·이용] (필수) [보기>]│ ☑
|
|
150
|
+
│ [마케팅 수신 동의] (선택) [보기>] │ ☐
|
|
151
|
+
│ [위치정보 이용] (선택) [보기>] │ ☐
|
|
152
|
+
│ │
|
|
153
|
+
│ [전체 동의] │
|
|
154
|
+
│ [다음] │
|
|
155
|
+
└─────────────────────────────────┘
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 5. App Store UX
|
|
161
|
+
|
|
162
|
+
### Screenshot specifications
|
|
163
|
+
|
|
164
|
+
| Store | Size (iPhone 16 Pro Max) | Size (Pixel 9 Pro) | Count |
|
|
165
|
+
|-------|------------------------|--------------------:|-------|
|
|
166
|
+
| App Store | 1320 × 2868 px (6.9") | — | 3-10 per locale |
|
|
167
|
+
| Google Play | — | 1080 × 2400 px | 2-8 per locale |
|
|
168
|
+
|
|
169
|
+
| Rule | Detail |
|
|
170
|
+
|------|--------|
|
|
171
|
+
| First 2 screenshots | Must show core value proposition; 80% of users decide without scrolling further |
|
|
172
|
+
| Text overlay | Max 5 words per screenshot, 60pt+ font, high contrast |
|
|
173
|
+
| Locale adaptation | Korean screenshots for KR store (not English with Korean subtitle) |
|
|
174
|
+
| Status bar | Show realistic status bar (time, signal, battery) or crop above it |
|
|
175
|
+
|
|
176
|
+
### App icon requirements
|
|
177
|
+
|
|
178
|
+
| Platform | Size | Shape | Notes |
|
|
179
|
+
|----------|------|-------|-------|
|
|
180
|
+
| iOS | 1024 × 1024 px | Auto-masked to rounded square | No transparency; no alpha channel |
|
|
181
|
+
| Android | 1024 × 1024 px (foreground) + 512 × 512 px (background) | Adaptive icon (foreground + background layers) | Safe zone: inner 66% circle for foreground content |
|
|
182
|
+
| Both | — | — | Test at 29px (notification), 60px (home), 1024px (store) |
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 6. Anti-Patterns & Pre-flight
|
|
187
|
+
|
|
188
|
+
### Anti-patterns
|
|
189
|
+
|
|
190
|
+
| Banned | Symptom | Fix |
|
|
191
|
+
|--------|---------|-----|
|
|
192
|
+
| iOS-style bottom tabs on Android | Users expect Material bottom nav behavior (no swipe between tabs) | Use platform-native navigation component |
|
|
193
|
+
| Custom back button overriding system gesture | Predictive back animation breaks, user disoriented | Use system back; add close button only as secondary |
|
|
194
|
+
| Permission request on first launch | Low opt-in rate (<30%), user distrust | Ask at point of need with pre-prompt explaining value |
|
|
195
|
+
| Alert dialog for everything | User fatigue, dismissed without reading | Action sheets (iOS) / bottom sheets (Android) for choices; dialogs only for confirmations |
|
|
196
|
+
| Ignoring Dynamic Type / `sp` scaling | Accessibility failure, app store rejection risk | Test at largest accessibility text size |
|
|
197
|
+
|
|
198
|
+
### Pre-flight checklist
|
|
199
|
+
|
|
200
|
+
- [ ] Navigation uses platform-native pattern (tab bar iOS, bottom nav Android)
|
|
201
|
+
- [ ] All gestures have accessible button alternatives
|
|
202
|
+
- [ ] Deep links configured: AASA (iOS) + assetlinks.json (Android) validated
|
|
203
|
+
- [ ] Korean in-app browser (KakaoTalk, Naver) fallback tested
|
|
204
|
+
- [ ] 개인정보 수집·이용 동의 separate from 이용약관, 마케팅 opt-in separate
|
|
205
|
+
- [ ] Screenshots prepared per locale with Korean text for KR store
|
|
206
|
+
- [ ] App icon tested at 29px, 60px, 1024px; Android adaptive icon safe zone verified
|
|
207
|
+
- [ ] Dynamic Type (iOS) / `sp` scaling (Android) tested at max accessibility size
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
## 1. Product Personality Database
|
|
2
|
+
|
|
3
|
+
Last reviewed: 2026-07-02 — brand tokens are snapshots; verify against the live product (per search skill) before shipping.
|
|
4
|
+
|
|
5
|
+
When the user references a product ("Notion 느낌", "Linear처럼"), map to these exact design parameters.
|
|
6
|
+
|
|
7
|
+
### Notion
|
|
8
|
+
**Essence:** Warm minimalism — paper-like, approachable, quietly structured.
|
|
9
|
+
```yaml
|
|
10
|
+
colors: { bg: "#ffffff", surface: "#f6f5f4", text: "#000", secondary: "#787774", accent: "#097fe8", border: "#dfdcd9" }
|
|
11
|
+
typography: { font: "Inter (or custom NotionInter)", heading_weight: 600-700, body_weight: 400, optional_serif: "Lyon Text" }
|
|
12
|
+
spacing: "4px scale (4, 8, 12, 16, 24, 32, 48, 64)"
|
|
13
|
+
radius: "8px elements, 12px cards"
|
|
14
|
+
shadows: "multi-layered soft — rgba(25,25,25,0.027)"
|
|
15
|
+
signature: "off-white surface, serif option for content, hand-drawn illustrations, block-based composition"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### Linear
|
|
19
|
+
**Essence:** Dark precision — engineering-grade, sharp, purple-accented.
|
|
20
|
+
```yaml
|
|
21
|
+
colors: { bg: "#000", text: "dark-gray-on-black", accent: "purple gradient" }
|
|
22
|
+
typography: { font: "Inter", weight: "400-600" }
|
|
23
|
+
spacing: "8px scale (8, 16, 32, 64)"
|
|
24
|
+
radius: "6-8px"
|
|
25
|
+
shadows: "minimal — relies on surface layering"
|
|
26
|
+
signature: "pure black bg, extreme keyboard-first, command palette (Cmd+K), modular components, speed above all"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Figma
|
|
30
|
+
**Essence:** Bright playground — collaborative, vibrant, tool-as-canvas.
|
|
31
|
+
```yaml
|
|
32
|
+
colors: { chrome: "neutral gray", content: "colorful", schemes: "tonal vibrancy, electric pairings" }
|
|
33
|
+
typography: { font: "custom grotesque sans-serif", styles: "sans, condensed, mono, hand" }
|
|
34
|
+
radius: "8px"
|
|
35
|
+
signature: "infinite canvas metaphor, real-time presence (cursors/avatars), dual-panel (layers left, properties right), abstract playful primitives"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Arc Browser
|
|
39
|
+
**Essence:** Gradient personality — organic, macOS-native, context-shifting.
|
|
40
|
+
```yaml
|
|
41
|
+
colors: { per_space_gradients: true, work: "linear-gradient(135deg, #667eea, #764ba2)", personal: "linear-gradient(135deg, #f093fb, #f5576c)" }
|
|
42
|
+
typography: { font: "-apple-system, system-ui" }
|
|
43
|
+
radius: "contextual (--radius-sm, --radius-lg)"
|
|
44
|
+
shadows: "0 4px 24px rgba(0,0,0,0.2)"
|
|
45
|
+
animation: "spring(response: 0.3, dampingFraction: 0.7)"
|
|
46
|
+
signature: "per-Space gradient theming, sidebar replaces tab bar, CSS variables exposed for user theming"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Vercel
|
|
50
|
+
**Essence:** Monochrome precision — black, white, Geist, nothing else.
|
|
51
|
+
```yaml
|
|
52
|
+
colors: { bg: "#000", fg: "#fff", accent_blue: "#0070F3 (functional only)", grays: "10-step ramp #F7F7F7→#0A0A0A" }
|
|
53
|
+
typography: { font: "Geist", mono: "Geist Mono", letter_spacing: "-0.04em headings, -0.01em body" }
|
|
54
|
+
spacing: "4-8px base, 96-128px section padding"
|
|
55
|
+
radius: "0-4px marketing, 6-8px UI"
|
|
56
|
+
shadows: "minimal or none"
|
|
57
|
+
signature: "almost entirely grayscale, aggressive whitespace, blueprint grid bg, no illustrations, CSS-preferred animations"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Stripe
|
|
61
|
+
**Essence:** Gradient elegance — illustrated, polished, technically confident.
|
|
62
|
+
```yaml
|
|
63
|
+
colors: { signature: "purple gradients", palette: ["blue", "yellow", "pink", "purple", "orange", "red"] }
|
|
64
|
+
typography: { weight: 300, style: "sharp, clear, restrained" }
|
|
65
|
+
effects: { hero: "WebGL animated gradient mesh", illustrations: "telling animations that communicate without copy" }
|
|
66
|
+
signature: "weight-300 type elegance, complementary multi-color gradients, sharp minimal copy, restrained with no frills"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Apple
|
|
70
|
+
**Essence:** Frosted glass, system font, spacious — hardware-grade polish.
|
|
71
|
+
```yaml
|
|
72
|
+
colors: { bg: "#fff/#000 (light/dark)", surface: "rgba with context-adaptive opacity", accent: "system blue" }
|
|
73
|
+
typography: { font: "-apple-system, SF Pro", weight: "200-800 variable" }
|
|
74
|
+
effects: { liquid_glass: "backdrop-filter: blur(20px); background: rgba(255,255,255,0.3); border: 0.5px solid rgba(255,255,255,0.3)" }
|
|
75
|
+
spacing: "40px+ padding on glass, very generous sections"
|
|
76
|
+
radius: "12-20px"
|
|
77
|
+
signature: "system font, Liquid Glass adapts contextually, specular highlights on motion, generous spacing = luxury"
|
|
78
|
+
```
|
|
79
|
+
Liquid Glass judgment (HIG, verified 2026-07-07): glass is a functional-layer
|
|
80
|
+
material for floating controls/navigation only — never content-layer cards;
|
|
81
|
+
`regular` variant for text-bearing chrome, `clear` only over rich media; the
|
|
82
|
+
system adapts it to reduced-transparency/contrast settings. Vocabulary:
|
|
83
|
+
`design-isms.md` §1.12; implementation: `dev-frontend/references/core/liquid-glass.md`.
|
|
84
|
+
|
|
85
|
+
### Aside (2026 AI-product pastel)
|
|
86
|
+
**Essence:** Apple-circular warmth for AI products — pill chips as content, pastel photography washes, glass feel without blur. (Tokens measured from the live site 2026-07-07; STYLE_SAMPLE.)
|
|
87
|
+
```yaml
|
|
88
|
+
colors: { hero: "sky-photo / soft pastel washes (pink/teal/green/blue) per card", surface: "near-opaque white rgba(255,255,255,0.92)", cta: "black pill, white text" }
|
|
89
|
+
typography: { font: "Geist", headlines: "large sentence-case declaratives ending with a period ('...but it's a browser.')" }
|
|
90
|
+
radius: { tiers: "8.4px / 11.2px / 16.8px + 9999px pill class", page: "22-34px rounded macOS-window container" }
|
|
91
|
+
effects: { glass: "NONE — 0 backdrop-filter site-wide; translucent white pills over rich backgrounds carry the material feel" }
|
|
92
|
+
chips: "prompt strings, scheduling options, bookmarks = pill chips WITH real brand icons; the chip is the primary content unit"
|
|
93
|
+
composition: "full-bleed photo hero + centered copy + one pill CTA + one bordered pill eyebrow; 3-card pastel feature rows with real product screenshots + floating prompt pills"
|
|
94
|
+
signature: "macOS-window page metaphor, chips-as-content, Apple-newsroom copy cadence, warmth without gradients-on-cards"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### OpenAI (2026 warm-sans organic)
|
|
98
|
+
**Essence:** Precise but humane platform — warm geometric sans, huge whitespace, soft natural imagery, opaque capsule labels. (In-house Feb-2025 rebrand + ABC Dinamo type + Studio Dumbar motion; verified 2026-07-09; STYLE_SAMPLE.)
|
|
99
|
+
```yaml
|
|
100
|
+
colors: { base: "off-white / near-black, palette inspired by natural environments", imagery: "soft-focus landscape/still-life photography + film grain, some AI-generated texture", accent: "imagery carries color; UI stays neutral" }
|
|
101
|
+
typography: { font: "OpenAI Sans (warm geometric, rounded-approachable) — Geist as open stand-in", headlines: "large but restrained, generous whitespace over scale" }
|
|
102
|
+
radius: { capsule: "9999px opaque white pills for labels/CTAs", cards: "20-28px" }
|
|
103
|
+
effects: { glass: "none — opaque capsules over expressive imagery; grain/texture on the background layer only" }
|
|
104
|
+
composition: "centered stacked hero over full-width media; announcement card = organic photographic field + white capsule with model name"
|
|
105
|
+
hero_grammar: "FE-HERO-LIGHT-CENTER-01 (light centered display over full-width media)"
|
|
106
|
+
signature: "blossom mark, expressive/functional layer split, humanized-AI warmth without losing platform precision"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Anthropic / Claude (serif bookish)
|
|
110
|
+
**Essence:** Research institute as a thoughtful book — serif display at light weights on warm paper tones. (Identity by Geist: Styrene + Tiempos lineage, now custom Anthropic Serif/Sans/Mono; measured live 2026-07-09; STYLE_SAMPLE.)
|
|
111
|
+
```yaml
|
|
112
|
+
colors: { base: "warm off-white/cream page metaphor (#faf9f5-class) + near-black ink", accent: "muted terracotta/clay used sparingly" }
|
|
113
|
+
typography: { display: "Anthropic Serif 56px/weight 330 (claude.ai), editorial H2 ~68px/400", ui: "Anthropic Sans 15-16px/500-550", accent: "Anthropic Mono for technical" }
|
|
114
|
+
radius: { general: "8-12px, quiet" }
|
|
115
|
+
effects: { none: "no glass, no gradients — paper flatness with generous margins" }
|
|
116
|
+
composition: "editorial/institutional opener (text-led mission headline, no hero screenshot); long-form reading surfaces"
|
|
117
|
+
signature: "bookish serif-led trust, three-role type system (serif display + sans UI + mono accent), safety-culture calm"
|
|
118
|
+
```
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
## 1. Responsive Strategy
|
|
2
|
+
|
|
3
|
+
### Canonical Breakpoint Tiers
|
|
4
|
+
|
|
5
|
+
See `dev-frontend/references/core/responsive-viewport.md` for the canonical T1–T5+ breakpoint table, page containment rules, container query patterns, and split-screen guidance. All responsive references share that single source of truth.
|
|
6
|
+
|
|
7
|
+
### Mobile-First vs Desktop-First
|
|
8
|
+
|
|
9
|
+
| Choose Mobile-First When | Choose Desktop-First When |
|
|
10
|
+
|--------------------------|--------------------------|
|
|
11
|
+
| Consumer / public-facing product | Internal tool / admin panel |
|
|
12
|
+
| Content consumption primary use | Data-dense productivity tool |
|
|
13
|
+
| New project (progressive enhancement) | Existing desktop app adding mobile |
|
|
14
|
+
|
|
15
|
+
### Container Queries & Split-Screen
|
|
16
|
+
|
|
17
|
+
See `dev-frontend/references/core/responsive-viewport.md` for canonical container query examples, `@container` vs `@media` decision guide, and split-screen/half-window rules. Nav-specific guidance below.
|
|
18
|
+
|
|
19
|
+
For navigation components, prefer `@container` so the same nav adapts in a sidebar, modal, or full-width header without viewport-dependent media queries.
|
|
20
|
+
|
|
21
|
+
### Responsive Navigation by Density Profile
|
|
22
|
+
|
|
23
|
+
| Density | Desktop Navigation | Mobile Navigation |
|
|
24
|
+
|---------|-------------------|-------------------|
|
|
25
|
+
| D1–D3 (campaign/consumer) | Horizontal top nav | Hamburger menu |
|
|
26
|
+
| D4–D6 (SaaS/productivity) | Collapsible sidebar (256px→64px) | Bottom tab bar (4–5 items) |
|
|
27
|
+
| D7–D8 (ops/developer) | Fixed sidebar + top breadcrumb | Sidebar stays, no collapse |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 2. Navigation & Information Architecture
|
|
32
|
+
|
|
33
|
+
### Sidebar
|
|
34
|
+
- Expanded: 256px fixed width. Collapsed: 64px (icons only).
|
|
35
|
+
- Item height: 36px. Horizontal padding: 12px.
|
|
36
|
+
- Active state: 8% primary color background + 3px left accent border.
|
|
37
|
+
- Transition: 200ms ease-in-out.
|
|
38
|
+
- Group sections with subtle separators and 10px uppercase section labels.
|
|
39
|
+
|
|
40
|
+
### Tab Bar (Bottom Navigation — Mobile)
|
|
41
|
+
- Maximum 5 items. Active item has filled icon + label. Inactive: outline icon only.
|
|
42
|
+
- Safe area padding for notch/home-indicator devices.
|
|
43
|
+
- Center the primary action if it has elevated importance (FAB pattern).
|
|
44
|
+
|
|
45
|
+
### Command Palette (Cmd+K)
|
|
46
|
+
- Centered modal at 20% from top, max-width 600px.
|
|
47
|
+
- Instant search with fuzzy matching.
|
|
48
|
+
- Category grouping (Actions, Pages, Settings).
|
|
49
|
+
- Recent items shown on empty query.
|
|
50
|
+
- Keyboard navigation: arrow keys + Enter.
|
|
51
|
+
|
|
52
|
+
### Breadcrumbs
|
|
53
|
+
- Use for hierarchical navigation deeper than 2 levels.
|
|
54
|
+
- Show abbreviated path on mobile (... > Parent > Current).
|
|
55
|
+
- Clickable segments except the current page.
|
|
56
|
+
- Separator: `/` or `>` — pick one and be consistent.
|
|
57
|
+
|
|
58
|
+
### By Product Surface
|
|
59
|
+
|
|
60
|
+
| Surface | Primary Nav | Secondary Nav | Search |
|
|
61
|
+
|---------|-------------|---------------|--------|
|
|
62
|
+
| Landing/marketing | Horizontal top nav | Footer links | Not needed |
|
|
63
|
+
| Consumer app | Bottom tab bar (mobile), sidebar (desktop) | In-context navigation | Optional |
|
|
64
|
+
| SaaS/productivity | Collapsible sidebar | Breadcrumbs + tabs | Command palette |
|
|
65
|
+
| Dashboard/ops | Fixed sidebar | Tab groups per section | Always visible search bar |
|
|
66
|
+
| Developer tool | Sidebar + command palette | Breadcrumbs | Prominent Cmd+K |
|