aiblueprint-cli 1.4.81 → 1.4.82
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 +21 -17
- package/agents-config/claude-config/scripts/statusline/data/.gitignore +8 -0
- package/agents-config/claude-config/scripts/statusline/data/.gitkeep +0 -0
- package/agents-config/claude-config/scripts/statusline/defaults.json +10 -10
- package/agents-config/claude-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
- package/agents-config/claude-config/scripts/statusline/src/index.ts +100 -9
- package/agents-config/claude-config/scripts/statusline/src/lib/config.ts +28 -2
- package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/presets.ts +13 -13
- package/agents-config/claude-config/scripts/statusline/statusline.config.free.json +4 -1
- package/agents-config/claude-config/scripts/statusline/statusline.config.json +44 -23
- package/agents-config/scripts/statusline/data/.gitignore +8 -0
- package/agents-config/scripts/statusline/data/.gitkeep +0 -0
- package/agents-config/scripts/statusline/defaults.json +10 -10
- package/agents-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
- package/agents-config/scripts/statusline/src/index.ts +100 -9
- package/agents-config/scripts/statusline/src/lib/config.ts +28 -2
- package/agents-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
- package/agents-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
- package/agents-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
- package/agents-config/scripts/statusline/src/lib/presets.ts +13 -13
- package/agents-config/scripts/statusline/statusline.config.free.json +4 -1
- package/agents-config/scripts/statusline/statusline.config.json +44 -23
- package/agents-config/skills/agents-managers/SKILL.md +1 -1
- package/agents-config/skills/agents-managers/references/writing-agent-prompts.md +1 -1
- package/agents-config/{commands/prompts/create-vitejs-app.md → skills/create-vitejs-app/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/SKILL.md +6 -6
- package/agents-config/skills/environments-manager/examples/{claude/commands/dev.md → skills/dev/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/examples/{claude/commands/lint.md → skills/lint/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/examples/{claude/commands/test.md → skills/test/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/examples/{claude/commands/typecheck.md → skills/typecheck/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/references/claude.md +13 -9
- package/agents-config/skills/environments-manager/references/cursor.md +2 -2
- package/agents-config/{commands/prompts/nextjs-add-prisma-db.md → skills/nextjs-add-prisma-db/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/nextjs-setup-better-auth.md → skills/nextjs-setup-better-auth/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/nextjs-setup-project.md → skills/nextjs-setup-project/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/prompt.md → skills/prompt/SKILL.md} +5 -0
- package/agents-config/{commands/prompts/saas-challenge-idea.md → skills/saas-challenge-idea/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-architecture.md → skills/saas-create-architecture/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-headline.md → skills/saas-create-headline/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-landing-copywritting.md → skills/saas-create-landing-copywritting/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-legals-docs.md → skills/saas-create-legals-docs/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-logos.md → skills/saas-create-logos/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-prd.md → skills/saas-create-prd/SKILL.md} +4 -3
- package/agents-config/{commands/prompts/saas-create-tasks.md → skills/saas-create-tasks/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-define-pricing.md → skills/saas-define-pricing/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-find-domain-name.md → skills/saas-find-domain-name/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-implement-landing-page.md → skills/saas-implement-landing-page/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/setup-tmux.md → skills/setup-tmux/SKILL.md} +5 -0
- package/agents-config/{commands/prompts/tools.md → skills/tools/SKILL.md} +1 -0
- package/agents-config/skills/ultrathink/SKILL.md +1 -1
- package/agents-config/skills/use-style/SKILL.md +7 -4
- package/agents-config/skills/use-style/examples/luma.html +221 -0
- package/agents-config/skills/use-style/examples/testspirite.html +340 -0
- package/agents-config/skills/use-style/styles/ios-app.md +350 -0
- package/agents-config/skills/use-style/styles/luma.md +422 -0
- package/agents-config/skills/use-style/styles/new-york-times.md +1 -1
- package/agents-config/skills/use-style/styles/split-auth.md +2 -2
- package/agents-config/skills/use-style/styles/testspirite.md +397 -0
- package/dist/cli.js +17 -80
- package/package.json +1 -1
- package/agents-config/claude-config/scripts/.claude/commands/fix-on-my-computer.md +0 -87
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# iOS App Style
|
|
2
|
+
|
|
3
|
+
NowStack Mobile "Ink & Spark" style for iOS/Expo app screens, React Native + NativeWind UI, phone-frame mockups, and companion app shells. The product should feel like a senior engineer's shipped mobile boilerplate: exact, calm, monochrome, and quietly expensive.
|
|
4
|
+
|
|
5
|
+
**Reference vibe:** NowStack Mobile. White paper, near-black ink, one yellow spark, native iOS chrome, flat hairline cards, generous touch targets, and a single product language across mobile, landing, `/app`, and `/admin`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Core Vibe
|
|
10
|
+
|
|
11
|
+
- **Ink and paper first.** Most of the interface is `#0A0A0A`, `#FFFFFF`, neutral grays, and hairlines.
|
|
12
|
+
- **One yellow spark.** `#FFE040` is reserved for the highest-intent action or a rare brand moment. Two yellow elements on one screen is usually wrong.
|
|
13
|
+
- **Native app, not mobile web.** Build iOS screens with status bar, safe areas, stack headers, sheets, keyboard behavior, and OS-native tab bars.
|
|
14
|
+
- **Flat by default.** Resting surfaces use 1px borders or rings. Shadows are only for lifted, interactive, or modal surfaces.
|
|
15
|
+
- **Premium restraint.** No decorative filler, no template feature grids, no AI-SaaS purple/blue gradients.
|
|
16
|
+
- **Light and dark parity.** The same tokens invert cleanly. The yellow spark stays fixed in both modes.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Invocation Aliases
|
|
21
|
+
|
|
22
|
+
Normalize these to `ios-app`:
|
|
23
|
+
|
|
24
|
+
- `$use-style ios-app`
|
|
25
|
+
- `/useskill ios-app`
|
|
26
|
+
- `use the ios app style`
|
|
27
|
+
- `nowstack-mobile`
|
|
28
|
+
- `nowstack mobile`
|
|
29
|
+
- `Ink & Spark`
|
|
30
|
+
- `iPhone app style`
|
|
31
|
+
- `Expo app style`
|
|
32
|
+
- `React Native NativeWind app style`
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Color
|
|
37
|
+
|
|
38
|
+
Use semantic tokens whenever the project has them. In NowStack Mobile, `mobile-app/lib/theme.ts` is the source of truth. Do not inline hex values in app screens unless the color is fixed-contrast by design.
|
|
39
|
+
|
|
40
|
+
### Light Theme
|
|
41
|
+
|
|
42
|
+
| Role | Hex | Token | Usage |
|
|
43
|
+
|------|-----|-------|-------|
|
|
44
|
+
| Background | `#FFFFFF` | `background` | Screen background |
|
|
45
|
+
| Foreground | `#0A0A0A` | `foreground` | Primary text, icons |
|
|
46
|
+
| Card | `#FFFFFF` | `card` | Card surfaces |
|
|
47
|
+
| Muted surface | `#F5F5F5` | `muted`, `secondary`, `accent` | Secondary buttons, filled fields, toolbars |
|
|
48
|
+
| Border | `#E5E5E5` | `border`, `input` | Hairlines, inputs, dividers |
|
|
49
|
+
| Muted ink | `#737373` | `muted-foreground` | Captions, helper copy, inactive nav |
|
|
50
|
+
| Primary | `#0A0A0A` | `primary` | Main pill button |
|
|
51
|
+
| Primary foreground | `#FAFAFA` | `primary-foreground` | Text on ink |
|
|
52
|
+
| Brand spark | `#FFE040` | `brand` | Highest-intent CTA only |
|
|
53
|
+
| Spark ink | `#1A1A1A` | `brand-foreground` | Text on yellow |
|
|
54
|
+
| Success | `#10B981` | `success` | Positive state only |
|
|
55
|
+
| Warning | `#F59E0B` | `warning` | Warning state only |
|
|
56
|
+
| Destructive | `#EF4444` | `destructive` | Error/destructive state only |
|
|
57
|
+
|
|
58
|
+
### Dark Theme
|
|
59
|
+
|
|
60
|
+
| Role | Hex | Token | Usage |
|
|
61
|
+
|------|-----|-------|-------|
|
|
62
|
+
| Background | `#0A0A0A` | `background` | Screen background |
|
|
63
|
+
| Foreground | `#FAFAFA` | `foreground` | Primary text, icons |
|
|
64
|
+
| Card | `#171717` | `card` | Card surfaces |
|
|
65
|
+
| Muted surface | `#262626` | `muted`, `secondary`, `accent` | Secondary surfaces |
|
|
66
|
+
| Border | `#262626` | `border`, `input` | Hairlines, inputs, dividers |
|
|
67
|
+
| Muted ink | `#A3A3A3` | `muted-foreground` | Captions, helper copy |
|
|
68
|
+
| Primary | `#FAFAFA` | `primary` | Main pill button in dark mode |
|
|
69
|
+
| Primary foreground | `#0A0A0A` | `primary-foreground` | Text on light primary |
|
|
70
|
+
| Brand spark | `#FFE040` | `brand` | Highest-intent CTA only |
|
|
71
|
+
| Spark ink | `#1A1A1A` | `brand-foreground` | Text on yellow |
|
|
72
|
+
|
|
73
|
+
### Named Color Rules
|
|
74
|
+
|
|
75
|
+
- **Single Spark Rule:** yellow appears on <=10% of the screen and ideally only one element.
|
|
76
|
+
- **No Indigo Rule:** do not use blue, sky, indigo, or violet as an accent. Re-point generic shadcn primary tokens to ink.
|
|
77
|
+
- **Spark Contrast Rule:** text on yellow is `#1A1A1A`, never white.
|
|
78
|
+
- **Semantic Color Rule:** success, warning, and destructive colors are for actual state, not decoration.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Typography
|
|
83
|
+
|
|
84
|
+
| Surface | Font |
|
|
85
|
+
|---------|------|
|
|
86
|
+
| iOS / React Native | `DM Sans`, then system sans |
|
|
87
|
+
| Web companion | `Geist Variable`, then system sans |
|
|
88
|
+
| Code / IDs / technical values | `Geist Mono`, `ui-monospace` |
|
|
89
|
+
| Rare landing display | `Instrument Serif`, `Georgia`, serif |
|
|
90
|
+
|
|
91
|
+
### Scale
|
|
92
|
+
|
|
93
|
+
| Level | Pattern |
|
|
94
|
+
|-------|---------|
|
|
95
|
+
| Screen title | 28px, 700 on mobile; tight but readable line height |
|
|
96
|
+
| Section heading | 20-24px, 600 or 500 |
|
|
97
|
+
| Card title | 16px, 500-600 |
|
|
98
|
+
| Body | 15-16px, 400, line height 1.45-1.55 |
|
|
99
|
+
| Label | 13px, 600; uppercase tracked labels only when needed |
|
|
100
|
+
| Meta / captions | 12-13px, muted ink |
|
|
101
|
+
|
|
102
|
+
Rules:
|
|
103
|
+
|
|
104
|
+
- Use weight and spacing before adding color.
|
|
105
|
+
- Headings should feel medium-weight and precise, not loud.
|
|
106
|
+
- Do not stack tiny uppercase eyebrows above every section.
|
|
107
|
+
- Keep body text high contrast. `#737373` is secondary text, not primary copy.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Layout
|
|
112
|
+
|
|
113
|
+
### Device Shell
|
|
114
|
+
|
|
115
|
+
For phone mockups or mobile app screens, build the native shell first:
|
|
116
|
+
|
|
117
|
+
- Status bar area.
|
|
118
|
+
- Safe-area aware root view.
|
|
119
|
+
- Stack header or centered nav title.
|
|
120
|
+
- Scroll region with stable bottom padding.
|
|
121
|
+
- Native bottom tab bar when the app has tabs.
|
|
122
|
+
- Home indicator clearance.
|
|
123
|
+
|
|
124
|
+
Use a 390px wide mental model for iPhone layouts. Typical screen padding is 16-20px. Primary actions should sit in the thumb zone and never under the tab bar or home indicator.
|
|
125
|
+
|
|
126
|
+
### Screen Rhythm
|
|
127
|
+
|
|
128
|
+
| Element | Pattern |
|
|
129
|
+
|---------|---------|
|
|
130
|
+
| Root | `bg-background text-foreground` |
|
|
131
|
+
| Content padding | 16-20px mobile, 24-32px tablet |
|
|
132
|
+
| Section gap | 24-32px |
|
|
133
|
+
| Card gap | 12-16px |
|
|
134
|
+
| Card padding | 16-20px |
|
|
135
|
+
| Touch target | >=44pt, primary actions 52pt |
|
|
136
|
+
| Card radius | 16px mobile, 14px web, cap at 18px |
|
|
137
|
+
| Button radius | Full pill for primary/brand, 10px for non-pill buttons |
|
|
138
|
+
|
|
139
|
+
### Keyboard Screens
|
|
140
|
+
|
|
141
|
+
Any screen with text inputs must keep the input and submit button visible above the keyboard:
|
|
142
|
+
|
|
143
|
+
- Put `KeyboardAvoidingView` on the outer screen or bottom-panel container.
|
|
144
|
+
- Use `behavior={Platform.OS === "ios" ? "padding" : "height"}`.
|
|
145
|
+
- For long forms, use `ScrollView keyboardShouldPersistTaps="handled"`.
|
|
146
|
+
- Do not bury keyboard avoidance inside a nested form component.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Components
|
|
151
|
+
|
|
152
|
+
### Buttons
|
|
153
|
+
|
|
154
|
+
Primary actions are generous full pills.
|
|
155
|
+
|
|
156
|
+
| Variant | Treatment |
|
|
157
|
+
|---------|-----------|
|
|
158
|
+
| Primary | Ink fill, inverse text, full pill, 52pt high on mobile |
|
|
159
|
+
| Brand | Yellow spark fill, spark-ink text, full pill, one per screen maximum |
|
|
160
|
+
| Secondary | Muted surface fill, ink text, modest 10px radius |
|
|
161
|
+
| Outline | Paper/card fill, 1px border, ink text |
|
|
162
|
+
| Ghost | Transparent, ink text, surface wash on press/hover |
|
|
163
|
+
| Destructive | Faint destructive wash with destructive text, not solid red |
|
|
164
|
+
|
|
165
|
+
React Native / NativeWind example:
|
|
166
|
+
|
|
167
|
+
```tsx
|
|
168
|
+
<Pressable className="h-[52px] items-center justify-center rounded-full bg-primary px-6 active:opacity-80">
|
|
169
|
+
<Text className="text-[17px] font-semibold text-primary-foreground">Continue</Text>
|
|
170
|
+
</Pressable>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Brand action:
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
<Pressable className="h-[52px] items-center justify-center rounded-full bg-brand px-6 active:opacity-80">
|
|
177
|
+
<Text className="text-[17px] font-semibold text-brand-foreground">Start building</Text>
|
|
178
|
+
</Pressable>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Cards
|
|
182
|
+
|
|
183
|
+
- Background: `card`.
|
|
184
|
+
- Border: 1px `border`.
|
|
185
|
+
- Radius: 16px on mobile.
|
|
186
|
+
- Padding: 16-20px.
|
|
187
|
+
- Shadow: none by default.
|
|
188
|
+
- Elevated card: `shadow-sm` only, with no wide blur.
|
|
189
|
+
- Do not put cards inside cards.
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
<View className="rounded-2xl border border-border bg-card px-5 py-4">
|
|
193
|
+
<Text className="text-base font-semibold text-card-foreground">Project ready</Text>
|
|
194
|
+
<Text className="mt-1 text-sm leading-5 text-muted-foreground">
|
|
195
|
+
Your first build can be submitted from this app shell.
|
|
196
|
+
</Text>
|
|
197
|
+
</View>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Inputs
|
|
201
|
+
|
|
202
|
+
- Height: 44pt minimum, 52pt for prominent auth/onboarding fields.
|
|
203
|
+
- Radius: 12-14px.
|
|
204
|
+
- Border: 1px `input` or `border`.
|
|
205
|
+
- Background: `card` or `muted`.
|
|
206
|
+
- Placeholder: muted ink.
|
|
207
|
+
- Focus: border/ring shifts to ink. No glow.
|
|
208
|
+
|
|
209
|
+
```tsx
|
|
210
|
+
<TextInput
|
|
211
|
+
className="h-12 rounded-xl border border-input bg-card px-4 text-[16px] text-foreground"
|
|
212
|
+
placeholderTextColor={colors["muted-foreground"]}
|
|
213
|
+
/>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Badges And Chips
|
|
217
|
+
|
|
218
|
+
Use muted surface fill, ink text, full pill radius, and small padding. Semantic chips can use faint state washes.
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
<View className="rounded-full bg-muted px-2.5 py-1">
|
|
222
|
+
<Text className="text-xs font-semibold text-foreground">Beta ready</Text>
|
|
223
|
+
</View>
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Navigation
|
|
227
|
+
|
|
228
|
+
- Use `NativeTabs` from `expo-router/unstable-native-tabs` for tabbed mobile apps.
|
|
229
|
+
- Let the OS own the tab bar surface. Do not set a custom tab background.
|
|
230
|
+
- Tint only the active item with the theme color.
|
|
231
|
+
- Use SF Symbols on iOS where available.
|
|
232
|
+
- Stack headers should be quiet: centered title, back affordance, optional right action.
|
|
233
|
+
|
|
234
|
+
### Sheets And Modals
|
|
235
|
+
|
|
236
|
+
- Use card or muted surfaces.
|
|
237
|
+
- Radius: 18px maximum.
|
|
238
|
+
- Add a top drag handle only when the sheet is gesture-dismissable.
|
|
239
|
+
- Use `shadow-sm` or native modal elevation, not large web shadows.
|
|
240
|
+
- Keep the primary action pinned above the safe area when the sheet is action-heavy.
|
|
241
|
+
|
|
242
|
+
### Paywalls And Onboarding
|
|
243
|
+
|
|
244
|
+
- The yellow brand button belongs here when it is the single highest-intent action.
|
|
245
|
+
- Benefits should be scannable rows, not a repeated icon-card grid.
|
|
246
|
+
- Keep the product value direct and concrete.
|
|
247
|
+
- Avoid fake metrics, giant stat heroes, or generic AI feature claims.
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Web Companion Surfaces
|
|
252
|
+
|
|
253
|
+
When applying `ios-app` to web landing, `/app`, or `/admin` surfaces, keep the same language:
|
|
254
|
+
|
|
255
|
+
- Same ink primary button.
|
|
256
|
+
- Same yellow spark CTA, still one per viewport.
|
|
257
|
+
- Same hairline cards.
|
|
258
|
+
- Same modest radii.
|
|
259
|
+
- Same mono treatment for code and technical values.
|
|
260
|
+
- Web primary cards use `ring-1 ring-foreground/10` more often than heavy borders.
|
|
261
|
+
- Landing pages may use the "hero orbit": slow, gray, concentric rings behind a phone mockup. No colored gradient orbs.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Implementation Rules
|
|
266
|
+
|
|
267
|
+
### In NowStack Mobile Repos
|
|
268
|
+
|
|
269
|
+
- Use existing `components/ui/` primitives before adding screen-local styling.
|
|
270
|
+
- Use NativeWind classes and semantic tokens (`bg-background`, `text-foreground`, `bg-brand`, `border-border`).
|
|
271
|
+
- Read native-only colors from `const { colors } = useTheme()` in `lib/theme-store.tsx`.
|
|
272
|
+
- Keep `mobile-app/lib/theme.ts` as the single source of truth for themed colors.
|
|
273
|
+
- Do not hardcode themed hex values in screens or shared components.
|
|
274
|
+
- Keep `ThemeProvider` inside `SafeAreaProvider` and wrapping the router.
|
|
275
|
+
|
|
276
|
+
### Portable Projects
|
|
277
|
+
|
|
278
|
+
If the project lacks these tokens, create the equivalent theme names first:
|
|
279
|
+
|
|
280
|
+
```css
|
|
281
|
+
:root {
|
|
282
|
+
--background:#FFFFFF;
|
|
283
|
+
--foreground:#0A0A0A;
|
|
284
|
+
--card:#FFFFFF;
|
|
285
|
+
--muted:#F5F5F5;
|
|
286
|
+
--muted-foreground:#737373;
|
|
287
|
+
--border:#E5E5E5;
|
|
288
|
+
--primary:#0A0A0A;
|
|
289
|
+
--primary-foreground:#FAFAFA;
|
|
290
|
+
--brand:#FFE040;
|
|
291
|
+
--brand-foreground:#1A1A1A;
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
Dark mode:
|
|
296
|
+
|
|
297
|
+
```css
|
|
298
|
+
.dark {
|
|
299
|
+
--background:#0A0A0A;
|
|
300
|
+
--foreground:#FAFAFA;
|
|
301
|
+
--card:#171717;
|
|
302
|
+
--muted:#262626;
|
|
303
|
+
--muted-foreground:#A3A3A3;
|
|
304
|
+
--border:#262626;
|
|
305
|
+
--primary:#FAFAFA;
|
|
306
|
+
--primary-foreground:#0A0A0A;
|
|
307
|
+
--brand:#FFE040;
|
|
308
|
+
--brand-foreground:#1A1A1A;
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## Motion
|
|
315
|
+
|
|
316
|
+
- Use 150-200ms ease-out for press, hover, and small reveals.
|
|
317
|
+
- Pressed buttons can dim to 80% opacity or nudge down by 1px.
|
|
318
|
+
- Respect reduced motion.
|
|
319
|
+
- Ambient motion is rare. The only sanctioned landing decoration is slow monochrome orbit rings around a phone mockup.
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## Anti-Patterns
|
|
324
|
+
|
|
325
|
+
| Avoid | Why |
|
|
326
|
+
|-------|-----|
|
|
327
|
+
| Blue, indigo, violet, or sky accent colors | Breaks the monochrome + spark identity |
|
|
328
|
+
| More than one yellow CTA per screen | Weakens the single highest-intent signal |
|
|
329
|
+
| White text on yellow | Fails contrast |
|
|
330
|
+
| Gradient orbs, blurred blobs, decorative glows | Generic AI-SaaS look |
|
|
331
|
+
| Glassmorphism as default panels | Too decorative and template-like |
|
|
332
|
+
| Static cards with big soft shadows | Violates the hairline-first system |
|
|
333
|
+
| Nested cards | Creates noisy, confused hierarchy |
|
|
334
|
+
| 24px+ card radii | Over-rounded and off-brand |
|
|
335
|
+
| Tiny uppercase eyebrow on every section | Looks like a generated SaaS scaffold |
|
|
336
|
+
| Ionicons replacing SF Symbols in native tabs | Breaks platform feel |
|
|
337
|
+
| Content under tab bar, keyboard, or home indicator | Breaks mobile ergonomics |
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Completion Checklist
|
|
342
|
+
|
|
343
|
+
- The screen reads monochrome first, yellow second.
|
|
344
|
+
- There is no generic purple/blue SaaS accent.
|
|
345
|
+
- Primary CTA is an ink pill unless the screen deserves the one yellow spark.
|
|
346
|
+
- Touch targets are >=44pt and main actions are about 52pt.
|
|
347
|
+
- Cards are separated by hairlines, not broad shadows.
|
|
348
|
+
- Safe areas, tab bars, and keyboard behavior are handled.
|
|
349
|
+
- Tokens come from the project theme, not scattered hex literals.
|
|
350
|
+
- Dark mode keeps the same hierarchy and the same yellow spark.
|