aiblueprint-cli 1.4.74 → 1.4.76
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 +7 -0
- package/agents-config/skills/use-style/SKILL.md +54 -0
- package/agents-config/skills/use-style/examples/anthropic.html +400 -0
- package/agents-config/skills/use-style/examples/dusk.html +368 -0
- package/agents-config/skills/use-style/examples/gumroad.html +396 -0
- package/agents-config/skills/use-style/examples/linear.html +389 -0
- package/agents-config/skills/use-style/examples/new-york-times.html +417 -0
- package/agents-config/skills/use-style/examples/raycast.html +402 -0
- package/agents-config/skills/use-style/examples/split-auth.html +366 -0
- package/agents-config/skills/use-style/examples/stripe.html +386 -0
- package/agents-config/skills/use-style/examples/vercel.html +379 -0
- package/agents-config/skills/use-style/styles/anthropic.md +266 -0
- package/agents-config/skills/use-style/styles/dusk.md +269 -0
- package/agents-config/skills/use-style/styles/grid.md +284 -0
- package/agents-config/skills/use-style/styles/gumroad.md +273 -0
- package/agents-config/skills/use-style/styles/linear.md +355 -0
- package/agents-config/skills/use-style/styles/new-york-times.md +277 -0
- package/agents-config/skills/use-style/styles/raycast.md +285 -0
- package/agents-config/skills/use-style/styles/split-auth.md +281 -0
- package/agents-config/skills/use-style/styles/stripe.md +372 -0
- package/agents-config/skills/use-style/styles/vercel-simple.md +322 -0
- package/dist/cli.js +100 -19
- package/package.json +1 -1
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
# Split Auth Style
|
|
2
|
+
|
|
3
|
+
Two-column authentication style for sign-in, signup, OAuth, magic-code, password reset, and account recovery screens. It is not a marketing homepage. It is a focused auth surface with a strong brand panel and a clean form panel.
|
|
4
|
+
|
|
5
|
+
**Reference vibe:** premium SaaS auth page with a dark visual brand panel on the left and a quiet, high-clarity form on the right.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Core vibe
|
|
10
|
+
|
|
11
|
+
- **Split auth layout.** Desktop is two panels: visual brand story on one side, form task on the other. Mobile hides the visual panel and keeps the form first.
|
|
12
|
+
- **One strong bitmap.** Use a real optimized image or generated bitmap as the visual panel background. Avoid SVG-only decoration.
|
|
13
|
+
- **Quiet form column.** The form panel is white or token-card colored, with no nested card shell unless the app design system requires it.
|
|
14
|
+
- **Brand line, not feature list.** The visual panel gets one concise positioning line and one support sentence.
|
|
15
|
+
- **Monochrome OAuth.** Social buttons are black with white text and white icons. Do not use colored Google marks here.
|
|
16
|
+
- **Compact verification.** OTP/code inputs are centered, stable size, and never stretch across the form width.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Invocation aliases
|
|
21
|
+
|
|
22
|
+
Use this style when the user says:
|
|
23
|
+
|
|
24
|
+
- `/usestyle split-auth`
|
|
25
|
+
- `$use-style split-auth`
|
|
26
|
+
- `use split-auth`
|
|
27
|
+
- `/usestyle signin 2pages`
|
|
28
|
+
- `two-column auth`
|
|
29
|
+
- `auth split`
|
|
30
|
+
- `make the sign in page like the example`
|
|
31
|
+
|
|
32
|
+
Normalize those to `split-auth`.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Layout
|
|
37
|
+
|
|
38
|
+
### Desktop shell
|
|
39
|
+
|
|
40
|
+
Use a full viewport grid. Left panel is visual, right panel is task.
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
<main className="grid min-h-screen bg-background text-foreground lg:grid-cols-[minmax(0,1.08fr)_minmax(420px,0.92fr)]">
|
|
44
|
+
<section className="relative hidden overflow-hidden bg-black lg:block">
|
|
45
|
+
<div className="absolute inset-0 bg-cover bg-center" />
|
|
46
|
+
<div className="absolute inset-0 bg-[linear-gradient(180deg,rgba(7,9,15,0.18),rgba(7,9,15,0.78))]" />
|
|
47
|
+
<div className="relative flex h-full min-h-screen flex-col justify-between p-12 text-white xl:p-16">
|
|
48
|
+
{brand}
|
|
49
|
+
{positioning}
|
|
50
|
+
{footer}
|
|
51
|
+
</div>
|
|
52
|
+
</section>
|
|
53
|
+
<section className="flex min-h-screen flex-col bg-card">
|
|
54
|
+
<header className="flex items-center justify-between px-5 py-4 sm:px-8 lg:px-10 lg:py-8" />
|
|
55
|
+
<div className="flex flex-1 items-center justify-center px-5 pb-10 pt-4 sm:px-8 lg:px-10 lg:py-12">
|
|
56
|
+
<div className="w-full max-w-[420px]">{form}</div>
|
|
57
|
+
</div>
|
|
58
|
+
</section>
|
|
59
|
+
</main>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Mobile shell
|
|
63
|
+
|
|
64
|
+
- Hide the visual panel with `hidden lg:block`.
|
|
65
|
+
- Keep brand logo in the top form header.
|
|
66
|
+
- Use `px-5`, a max width of the full viewport, and enough top spacing to avoid feeling cramped.
|
|
67
|
+
- Do not show the bitmap as a mobile background unless it improves readability.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Visual panel
|
|
72
|
+
|
|
73
|
+
### Background image
|
|
74
|
+
|
|
75
|
+
Use one optimized bitmap:
|
|
76
|
+
|
|
77
|
+
- Preferred formats: WebP or AVIF.
|
|
78
|
+
- Target size: 1200-2200px wide for desktop visual panels.
|
|
79
|
+
- Target weight: under 150 KB when possible.
|
|
80
|
+
- If source is HEIC, PNG, or large JPG, convert before serving.
|
|
81
|
+
- Use `background-size: cover` and `background-position: center`.
|
|
82
|
+
|
|
83
|
+
### Overlay
|
|
84
|
+
|
|
85
|
+
Add a dark overlay so white text stays readable:
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
<div className="absolute inset-0 bg-[radial-gradient(circle_at_20%_20%,rgba(255,255,255,0.18),transparent_28%),linear-gradient(180deg,rgba(7,9,15,0.18),rgba(7,9,15,0.78))]" />
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Brand lockup
|
|
92
|
+
|
|
93
|
+
Small brand mark at the top, not a giant logo.
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
<a className="flex w-fit items-center gap-3">
|
|
97
|
+
<span className="flex size-11 items-center justify-center rounded-xl border border-white/20 bg-white/10 shadow-lg shadow-black/20 backdrop-blur-md">
|
|
98
|
+
<Logo className="text-white" />
|
|
99
|
+
</span>
|
|
100
|
+
<span className="text-xl font-semibold">{Product}</span>
|
|
101
|
+
</a>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Positioning copy
|
|
105
|
+
|
|
106
|
+
Use one direct brand line. Keep it literal and adapted to the product.
|
|
107
|
+
|
|
108
|
+
Pattern examples:
|
|
109
|
+
|
|
110
|
+
- `{Product} - the workspace your team finally enjoys.`
|
|
111
|
+
- `{Product} - the calmer way to manage your work.`
|
|
112
|
+
- `{Product} - everything important, without the noise.`
|
|
113
|
+
|
|
114
|
+
Support copy examples:
|
|
115
|
+
|
|
116
|
+
- `Access your workspace, pick up where you left off, and keep moving.`
|
|
117
|
+
- `Secure sign-in for teams that need speed without clutter.`
|
|
118
|
+
- `One account, one focused place for the work that matters.`
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Form panel
|
|
123
|
+
|
|
124
|
+
### Heading block
|
|
125
|
+
|
|
126
|
+
```tsx
|
|
127
|
+
<div className="space-y-3">
|
|
128
|
+
<p className="text-sm font-medium text-primary">Welcome back</p>
|
|
129
|
+
<div className="space-y-2">
|
|
130
|
+
<h1 className="text-3xl font-semibold leading-tight text-foreground">
|
|
131
|
+
Sign in to {Product}
|
|
132
|
+
</h1>
|
|
133
|
+
<p className="text-sm leading-6 text-muted-foreground">
|
|
134
|
+
Use your email code or continue with a connected provider.
|
|
135
|
+
</p>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Inputs
|
|
141
|
+
|
|
142
|
+
- Height: 44px.
|
|
143
|
+
- Radius: 8px or existing design-system `rounded-lg`.
|
|
144
|
+
- Background: panel background or app token `bg-background`.
|
|
145
|
+
- Label: small, medium, high contrast.
|
|
146
|
+
- Placeholder: practical, not playful.
|
|
147
|
+
|
|
148
|
+
```tsx
|
|
149
|
+
<Input
|
|
150
|
+
placeholder="you@example.com"
|
|
151
|
+
autoComplete="email"
|
|
152
|
+
size="lg"
|
|
153
|
+
className="h-11 rounded-lg bg-background"
|
|
154
|
+
/>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Primary action
|
|
158
|
+
|
|
159
|
+
Use the app primary color. Keep it full width and stable height.
|
|
160
|
+
|
|
161
|
+
```tsx
|
|
162
|
+
<LoadingButton className="h-11 w-full rounded-lg">Send code</LoadingButton>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Social buttons
|
|
166
|
+
|
|
167
|
+
All OAuth buttons use the same monochrome treatment:
|
|
168
|
+
|
|
169
|
+
```tsx
|
|
170
|
+
<button className="h-11 w-full rounded-lg border-black bg-black text-white hover:bg-black/90 hover:text-white">
|
|
171
|
+
<GithubIcon className="text-white" />
|
|
172
|
+
<span className="text-white">Sign in with GitHub</span>
|
|
173
|
+
</button>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Rules:
|
|
177
|
+
|
|
178
|
+
- Icon must be white.
|
|
179
|
+
- Text must be white.
|
|
180
|
+
- Do not use colored Google icon segments.
|
|
181
|
+
- Button fill stays black in light mode and dark mode.
|
|
182
|
+
- Use `currentColor` SVGs when possible.
|
|
183
|
+
|
|
184
|
+
### Divider
|
|
185
|
+
|
|
186
|
+
Use thin lines and a centered lowercase `or`.
|
|
187
|
+
|
|
188
|
+
```tsx
|
|
189
|
+
<div className="flex items-center gap-6 text-sm">
|
|
190
|
+
<div className="h-px flex-1 bg-border" />
|
|
191
|
+
<span>or</span>
|
|
192
|
+
<div className="h-px flex-1 bg-border" />
|
|
193
|
+
</div>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### OTP/code state
|
|
197
|
+
|
|
198
|
+
Persist code-entry state in the URL when the user can leave and return from an email app.
|
|
199
|
+
|
|
200
|
+
```tsx
|
|
201
|
+
await navigate({
|
|
202
|
+
to: '/auth/signin',
|
|
203
|
+
search: { email, step: 'otp' },
|
|
204
|
+
replace: true,
|
|
205
|
+
});
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Compact code inputs:
|
|
209
|
+
|
|
210
|
+
```tsx
|
|
211
|
+
<InputOTP maxLength={6} containerClassName="justify-center">
|
|
212
|
+
<InputOTPGroup>
|
|
213
|
+
<InputOTPSlot index={0} className="size-10 bg-background" />
|
|
214
|
+
<InputOTPSlot index={1} className="size-10 bg-background" />
|
|
215
|
+
<InputOTPSlot index={2} className="size-10 bg-background" />
|
|
216
|
+
<InputOTPSlot index={3} className="size-10 bg-background" />
|
|
217
|
+
<InputOTPSlot index={4} className="size-10 bg-background" />
|
|
218
|
+
<InputOTPSlot index={5} className="size-10 bg-background" />
|
|
219
|
+
</InputOTPGroup>
|
|
220
|
+
</InputOTP>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Do not stretch OTP slots with `w-full justify-between`; that causes clipping on mobile.
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Auth page variants
|
|
228
|
+
|
|
229
|
+
### Sign in
|
|
230
|
+
|
|
231
|
+
- Eyebrow: `Welcome back`
|
|
232
|
+
- Title: `Sign in to {Product}`
|
|
233
|
+
- Description: `Use your email code or continue with a connected provider.`
|
|
234
|
+
- Primary action: `Send code`
|
|
235
|
+
- Secondary: OAuth buttons
|
|
236
|
+
- Footer link: `No account yet? Create one`
|
|
237
|
+
|
|
238
|
+
### Signup
|
|
239
|
+
|
|
240
|
+
- Eyebrow: `Create your account`
|
|
241
|
+
- Title: `Sign up to {Product}`
|
|
242
|
+
- Description: `We just need a few details to get you started.`
|
|
243
|
+
- Footer link: `You already have an account? Sign in`
|
|
244
|
+
|
|
245
|
+
### Password reset
|
|
246
|
+
|
|
247
|
+
- Icon in small muted square.
|
|
248
|
+
- Title: `Reset your password`
|
|
249
|
+
- Description: `Enter your email and we will send you a reset link.`
|
|
250
|
+
- Primary action: `Send reset link`
|
|
251
|
+
|
|
252
|
+
### Verify email
|
|
253
|
+
|
|
254
|
+
- Centered icon, title, and one sentence.
|
|
255
|
+
- No card wrapper.
|
|
256
|
+
- Keep it inside the shared form panel.
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Anti-patterns
|
|
261
|
+
|
|
262
|
+
- Do not add cards inside cards.
|
|
263
|
+
- Do not use a marketing navbar on auth pages.
|
|
264
|
+
- Do not use colored social icons in monochrome OAuth buttons.
|
|
265
|
+
- Do not use stock-photo people unless the product specifically needs human trust imagery.
|
|
266
|
+
- Do not put instructional text explaining how the UI works.
|
|
267
|
+
- Do not use visible keyboard shortcut copy on auth pages.
|
|
268
|
+
- Do not let OTP slots resize or shift on input.
|
|
269
|
+
- Do not make the form column wider than 460px.
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Review checklist
|
|
274
|
+
|
|
275
|
+
- The layout has two panels on desktop and one clean form panel on mobile.
|
|
276
|
+
- The image is optimized and loads from a browser-friendly format.
|
|
277
|
+
- Social buttons have white icons and white text.
|
|
278
|
+
- Form controls have stable heights and no layout shift.
|
|
279
|
+
- OTP state survives reload, tab switching, and return from email app when relevant.
|
|
280
|
+
- Text does not overlap the visual background or preceding content.
|
|
281
|
+
- Mobile screenshot has no clipped inputs, buttons, or OTP slots.
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
# Stripe Style
|
|
2
|
+
|
|
3
|
+
Clean fintech product UI. Light, airy, trust-driven. Soft elevation over hard lines, blurple accent, rounded geometry.
|
|
4
|
+
|
|
5
|
+
**Reference vibe:** Stripe Dashboard, Checkout, and docs. App panels, settings pages, payment forms.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Core vibe
|
|
10
|
+
|
|
11
|
+
- **Trust-first fintech.** Polished, premium, calm. Feels like money software, not a marketing funnel.
|
|
12
|
+
- **Light canvas.** Off-white / pale blue background, white cards, dark navy ink.
|
|
13
|
+
- **Soft elevation.** Subtle layered shadows define cards, NOT 1px borders. This is the key contrast with `grid` / `vercel-simple`.
|
|
14
|
+
- **Rounded geometry.** `8px` cards, `6px` inputs/buttons, `radius-full` pills and avatars.
|
|
15
|
+
- **Blurple accent.** `#635BFF` for primary actions, active states, links. Green (`#24B47E`) for success/confirm CTAs.
|
|
16
|
+
- **Sans everywhere.** Clean grotesk (Inter / system / sohne). Mono only for card numbers, IDs, code.
|
|
17
|
+
- **Generous whitespace.** Wide gutters, airy row padding, breathing room around values.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Color
|
|
22
|
+
|
|
23
|
+
Portable palette. Map to project tokens when available.
|
|
24
|
+
|
|
25
|
+
| Role | Hex | CSS var (suggested) | Usage |
|
|
26
|
+
|------|-----|---------------------|-------|
|
|
27
|
+
| Canvas | `#F6F9FC` | `--sp-bg` | Page background (pale blue-gray) |
|
|
28
|
+
| Surface | `#FFFFFF` | `--sp-surface` | Cards, panels, inputs |
|
|
29
|
+
| Surface sunken | `#F7FAFC` | `--sp-sunken` | Inset blocks, table headers, hover rows |
|
|
30
|
+
| Ink | `#0A2540` | `--sp-fg` | Headlines, primary values |
|
|
31
|
+
| Slate ink | `#425466` | `--sp-slate` | Body copy, descriptions |
|
|
32
|
+
| Muted ink | `#697386` | `--sp-muted-fg` | Metadata, labels, inactive tabs |
|
|
33
|
+
| Subtle ink | `#8792A2` | `--sp-subtle-fg` | Placeholders, helper text |
|
|
34
|
+
| Border | `#E3E8EE` | `--sp-border` | Input outlines, dividers, table lines |
|
|
35
|
+
| Border strong | `#CFD7DF` | `--sp-border-strong` | Hover/focus outlines |
|
|
36
|
+
| Primary | `#635BFF` | `--sp-primary` | Buttons, active tab, links, focus ring |
|
|
37
|
+
| Primary hover | `#5249E0` | `--sp-primary-hover` | Button hover |
|
|
38
|
+
| Primary surface | `#F5F4FF` | `--sp-primary-surface` | Active row / selected card tint |
|
|
39
|
+
| Success | `#24B47E` | `--sp-success` | Confirm CTA, connected status, paid |
|
|
40
|
+
| Warning | `#D97917` | `--sp-warning` | Pending, attention |
|
|
41
|
+
| Error | `#DF1B41` | `--sp-error` | Failed, destructive |
|
|
42
|
+
| Link | `#635BFF` | `--sp-link` | Text links |
|
|
43
|
+
|
|
44
|
+
### Dark variant (Checkout dark, dashboards)
|
|
45
|
+
|
|
46
|
+
| Role | Hex |
|
|
47
|
+
|------|-----|
|
|
48
|
+
| Canvas | `#0A2540` |
|
|
49
|
+
| Surface | `#1A2B45` / `#15233B` |
|
|
50
|
+
| Ink | `#FFFFFF` |
|
|
51
|
+
| Muted ink | `#A3ACBA` |
|
|
52
|
+
| Border | `#2A3A55` |
|
|
53
|
+
| Primary CTA | `#24B47E` (green) or `#635BFF` |
|
|
54
|
+
|
|
55
|
+
### Tailwind mapping (when no project tokens)
|
|
56
|
+
|
|
57
|
+
```css
|
|
58
|
+
:root {
|
|
59
|
+
--sp-bg: #f6f9fc;
|
|
60
|
+
--sp-surface: #fff;
|
|
61
|
+
--sp-fg: #0a2540;
|
|
62
|
+
--sp-slate: #425466;
|
|
63
|
+
--sp-muted-fg: #697386;
|
|
64
|
+
--sp-border: #e3e8ee;
|
|
65
|
+
--sp-primary: #635bff;
|
|
66
|
+
--sp-success: #24b47e;
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
| Tailwind | Value |
|
|
71
|
+
|----------|-------|
|
|
72
|
+
| `bg-[#f6f9fc]` | Canvas |
|
|
73
|
+
| `bg-white` | Card / surface |
|
|
74
|
+
| `text-[#0a2540]` | Primary ink |
|
|
75
|
+
| `text-[#697386]` | Muted |
|
|
76
|
+
| `border-[#e3e8ee]` | Structure |
|
|
77
|
+
| `bg-[#635bff]` | Primary action |
|
|
78
|
+
| `bg-[#24b47e]` | Success CTA |
|
|
79
|
+
|
|
80
|
+
**Rule:** Keep the layout neutral (navy/slate/gray) and reserve saturated color for actions, active state, and status. Blurple is the signature; use it deliberately, not everywhere.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Typography
|
|
85
|
+
|
|
86
|
+
### Font stacks
|
|
87
|
+
|
|
88
|
+
| Role | Stack |
|
|
89
|
+
|------|-------|
|
|
90
|
+
| Sans (everything) | `Inter, "Sohne", ui-sans-serif, system-ui, -apple-system, sans-serif` |
|
|
91
|
+
| Mono (card #, IDs, code) | `"Berkeley Mono", ui-monospace, SFMono-Regular, Menlo, monospace` |
|
|
92
|
+
|
|
93
|
+
Load Inter via `@fontsource/inter` or `next/font`. Stripe's own face is "sohne"; Inter is the closest free substitute.
|
|
94
|
+
|
|
95
|
+
### Scale
|
|
96
|
+
|
|
97
|
+
| Level | Pattern |
|
|
98
|
+
|-------|---------|
|
|
99
|
+
| Page title | `text-2xl md:text-3xl font-semibold tracking-tight text-[#0a2540]` |
|
|
100
|
+
| Section heading | `text-lg md:text-xl font-semibold text-[#0a2540]` |
|
|
101
|
+
| Section label | `text-xs font-medium uppercase tracking-wide text-[#697386]` |
|
|
102
|
+
| Body | `text-sm md:text-base leading-relaxed text-[#425466]` |
|
|
103
|
+
| Large metric | `text-3xl md:text-4xl font-semibold tabular-nums text-[#0a2540]` |
|
|
104
|
+
| Metadata | `text-xs text-[#697386]` |
|
|
105
|
+
| Card number / ID | `font-mono text-sm tabular-nums text-[#0a2540]` |
|
|
106
|
+
|
|
107
|
+
### Weight & tracking
|
|
108
|
+
|
|
109
|
+
- Headlines: `font-semibold` (600), `tracking-tight`.
|
|
110
|
+
- Body: `font-normal` (400), normal tracking, relaxed leading.
|
|
111
|
+
- Labels: `font-medium` (500), light uppercase tracking.
|
|
112
|
+
- Numbers: always `tabular-nums`.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Layout tokens
|
|
117
|
+
|
|
118
|
+
| Token | Value |
|
|
119
|
+
|-------|-------|
|
|
120
|
+
| `SP_SHELL` | `mx-auto w-full max-w-6xl px-4 sm:px-6 md:px-8` |
|
|
121
|
+
| `SP_SHELL_NARROW` | `max-w-3xl` (settings, forms) |
|
|
122
|
+
| `SP_SECTION` | `py-10 md:py-14 lg:py-16` |
|
|
123
|
+
| `SP_CARD_PAD` | `p-5 sm:p-6 md:p-8` |
|
|
124
|
+
| `SP_GAP_SECTION` | `space-y-8 md:space-y-10` |
|
|
125
|
+
|
|
126
|
+
### App shell (dashboard)
|
|
127
|
+
|
|
128
|
+
Top nav + horizontal tab bar + content on pale canvas. Optional right-rail app dock.
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
<div className="min-h-screen bg-[#f6f9fc] text-[#0a2540]">
|
|
132
|
+
<header className="border-b border-[#e3e8ee] bg-white">
|
|
133
|
+
<div className={cn(SP_SHELL, "flex h-16 items-center justify-between")}>...</div>
|
|
134
|
+
<nav className={cn(SP_SHELL, "flex gap-1")}>{tabs}</nav>
|
|
135
|
+
</header>
|
|
136
|
+
<main className={cn(SP_SHELL, "py-8")}>...</main>
|
|
137
|
+
</div>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Settings / form shell (narrow)
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
<main className={cn(SP_SHELL_NARROW, "py-12")}>
|
|
144
|
+
<nav className="mb-6 text-sm text-[#697386]">Settings › Authorized apps › <span className="text-[#635bff]">SuperTodo</span></nav>
|
|
145
|
+
<h1 className="text-3xl font-semibold tracking-tight">...</h1>
|
|
146
|
+
<div className="mt-8 space-y-8">{rows}</div>
|
|
147
|
+
</main>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Borders, radius & elevation
|
|
153
|
+
|
|
154
|
+
This is where Stripe diverges from the line-driven styles. **Cards float on soft shadows; borders are thin and quiet.**
|
|
155
|
+
|
|
156
|
+
| Context | Radius | Border | Shadow |
|
|
157
|
+
|---------|--------|--------|--------|
|
|
158
|
+
| Card / panel | `rounded-lg` (8px) | none or `border-[#e3e8ee]` | `SP_SHADOW_CARD` |
|
|
159
|
+
| Floating panel (app dock, popover) | `rounded-xl` (12px) | none | `SP_SHADOW_FLOAT` |
|
|
160
|
+
| Input | `rounded-md` (6px) | `border-[#e3e8ee]` | `SP_SHADOW_INPUT` (inset-ish) |
|
|
161
|
+
| Button | `rounded-md` (6px) | none | `SP_SHADOW_BTN` |
|
|
162
|
+
| Tab / segmented item | `rounded-md` (6px) | none | none until active |
|
|
163
|
+
| Pill / badge / avatar | `rounded-full` | optional | none |
|
|
164
|
+
|
|
165
|
+
### Shadow tokens (Stripe's signature soft elevation)
|
|
166
|
+
|
|
167
|
+
```css
|
|
168
|
+
--sp-shadow-card: 0 1px 3px rgba(50,50,93,0.10), 0 1px 2px rgba(0,0,0,0.06);
|
|
169
|
+
--sp-shadow-float: 0 7px 14px rgba(50,50,93,0.10), 0 3px 6px rgba(0,0,0,0.08);
|
|
170
|
+
--sp-shadow-input: 0 1px 1px rgba(0,0,0,0.03);
|
|
171
|
+
--sp-shadow-btn: 0 1px 1px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.08);
|
|
172
|
+
--sp-focus-ring: 0 0 0 3px rgba(99,91,255,0.25);
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Tailwind arbitrary equivalents:
|
|
176
|
+
|
|
177
|
+
```tsx
|
|
178
|
+
// card
|
|
179
|
+
className="shadow-[0_1px_3px_rgba(50,50,93,0.10),0_1px_2px_rgba(0,0,0,0.06)]"
|
|
180
|
+
// floating panel
|
|
181
|
+
className="shadow-[0_7px_14px_rgba(50,50,93,0.10),0_3px_6px_rgba(0,0,0,0.08)]"
|
|
182
|
+
// focus
|
|
183
|
+
className="focus:shadow-[0_0_0_3px_rgba(99,91,255,0.25)]"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Dividers: `border-t border-[#e3e8ee]`.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Component patterns
|
|
191
|
+
|
|
192
|
+
### Primary button (blurple)
|
|
193
|
+
|
|
194
|
+
```tsx
|
|
195
|
+
<button className="rounded-md bg-[#635bff] px-4 py-2.5 text-sm font-medium text-white shadow-[0_1px_1px_rgba(0,0,0,0.06),0_1px_2px_rgba(0,0,0,0.08)] transition-colors hover:bg-[#5249e0]">
|
|
196
|
+
Save changes
|
|
197
|
+
</button>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Success CTA (green pay button)
|
|
201
|
+
|
|
202
|
+
```tsx
|
|
203
|
+
<button className="w-full rounded-md bg-[#24b47e] px-4 py-3 text-base font-semibold text-white transition-colors hover:bg-[#1f9e6e]">
|
|
204
|
+
Pay $24.90
|
|
205
|
+
</button>
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Secondary button
|
|
209
|
+
|
|
210
|
+
```tsx
|
|
211
|
+
<button className="rounded-md border border-[#e3e8ee] bg-white px-4 py-2 text-sm font-medium text-[#0a2540] shadow-[0_1px_1px_rgba(0,0,0,0.04)] transition-colors hover:bg-[#f7fafc]">
|
|
212
|
+
Uninstall app
|
|
213
|
+
</button>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Input
|
|
217
|
+
|
|
218
|
+
```tsx
|
|
219
|
+
<input
|
|
220
|
+
className="w-full rounded-md border border-[#e3e8ee] bg-white px-3 py-2.5 text-sm text-[#0a2540] placeholder:text-[#8792a2] shadow-[0_1px_1px_rgba(0,0,0,0.03)] transition-shadow focus:border-[#635bff] focus:shadow-[0_0_0_3px_rgba(99,91,255,0.25)] focus:outline-none"
|
|
221
|
+
placeholder="orders@supertodo.me"
|
|
222
|
+
/>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Tab bar (horizontal nav)
|
|
226
|
+
|
|
227
|
+
Active: blurple pill background + white/dark text. Inactive: muted, transparent.
|
|
228
|
+
|
|
229
|
+
```tsx
|
|
230
|
+
<button className={cn(
|
|
231
|
+
"rounded-md px-3 py-1.5 text-sm font-medium transition-colors",
|
|
232
|
+
active ? "bg-[#635bff] text-white" : "text-[#425466] hover:bg-[#f7fafc]"
|
|
233
|
+
)}>Home</button>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Card
|
|
237
|
+
|
|
238
|
+
```tsx
|
|
239
|
+
<div className="rounded-lg bg-white p-6 shadow-[0_1px_3px_rgba(50,50,93,0.10),0_1px_2px_rgba(0,0,0,0.06)]">
|
|
240
|
+
...
|
|
241
|
+
</div>
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Metric block (dashboard "Today")
|
|
245
|
+
|
|
246
|
+
```tsx
|
|
247
|
+
<div>
|
|
248
|
+
<p className="text-sm font-medium text-[#697386]">Gross volume</p>
|
|
249
|
+
<p className="mt-1 text-3xl font-semibold tabular-nums text-[#0a2540]">$12,198.72</p>
|
|
250
|
+
<p className="mt-1 text-xs text-[#8792a2]">1:00 PM</p>
|
|
251
|
+
</div>
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Status pill
|
|
255
|
+
|
|
256
|
+
```tsx
|
|
257
|
+
// success
|
|
258
|
+
<span className="inline-flex items-center gap-1.5 rounded-full bg-[#ecfdf5] px-2.5 py-0.5 text-xs font-medium text-[#24b47e]">
|
|
259
|
+
<span className="h-1.5 w-1.5 rounded-full bg-[#24b47e]" /> Connected
|
|
260
|
+
</span>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Sidebar info panel (settings right rail)
|
|
264
|
+
|
|
265
|
+
```tsx
|
|
266
|
+
<aside className="rounded-lg bg-[#f7fafc] p-6 text-sm">
|
|
267
|
+
<p className="text-xs font-medium uppercase tracking-wide text-[#697386]">Version</p>
|
|
268
|
+
<p className="mt-1 text-[#0a2540]">v1.4.2</p>
|
|
269
|
+
</aside>
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Radio / toggle row
|
|
273
|
+
|
|
274
|
+
```tsx
|
|
275
|
+
<label className="flex items-center gap-2 text-sm text-[#0a2540]">
|
|
276
|
+
<input type="radio" className="accent-[#635bff]" /> Yes
|
|
277
|
+
</label>
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Floating app panel (dock popover)
|
|
281
|
+
|
|
282
|
+
```tsx
|
|
283
|
+
<div className="rounded-xl bg-white shadow-[0_7px_14px_rgba(50,50,93,0.10),0_3px_6px_rgba(0,0,0,0.08)]">
|
|
284
|
+
<header className="flex items-center justify-between rounded-t-xl bg-[#ec4899] px-4 py-3 text-white">...</header>
|
|
285
|
+
<div className="p-6">...</div>
|
|
286
|
+
</div>
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Hero / marketing (Stripe.com style)
|
|
292
|
+
|
|
293
|
+
When building a marketing page rather than a product UI:
|
|
294
|
+
|
|
295
|
+
- **Diagonal gradient hero.** The famous angled blurple-to-cyan band. Skew a colored block behind the content.
|
|
296
|
+
- Gradient: `linear-gradient(101deg, #635bff 0%, #00d4ff 100%)` or the warmer `#a960ee → #ff333d → #ffcb57`.
|
|
297
|
+
- Light content on top, then white cards float over the seam.
|
|
298
|
+
|
|
299
|
+
```tsx
|
|
300
|
+
<section className="relative overflow-hidden bg-[#f6f9fc]">
|
|
301
|
+
<div className="absolute inset-0 origin-top-left -skew-y-6 bg-[linear-gradient(101deg,#635bff,#00d4ff)]" />
|
|
302
|
+
<div className="relative mx-auto max-w-6xl px-6 py-32 text-white">...</div>
|
|
303
|
+
</section>
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
Keep this for marketing only. Product/app UIs stay flat pale-blue, no gradient.
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## Charts (fintech data viz)
|
|
311
|
+
|
|
312
|
+
Soft, light, blurple-led - the Stripe dashboard look:
|
|
313
|
+
|
|
314
|
+
- Series as a **blurple ramp**: `#635bff → #9b96ff → #cdcaff → #e9e8ff`. The primary/highlighted series is full blurple `#635bff`; supporting series fade toward light lavender.
|
|
315
|
+
- Use `#24b47e` (green) for explicitly positive/paid series, `#df1b41` for negative, sparingly.
|
|
316
|
+
- **Rounded bars** (`borderRadius: 6-8`), flat fills, no gradients or glow.
|
|
317
|
+
- Background stays white/`#f6f9fc`; gridlines `#e3e8ee`; axis text sans (`Inter`), muted `#697386`, tabular nums.
|
|
318
|
+
- Tooltip: navy `#0a2540` background, white text, `8px` corners.
|
|
319
|
+
- Doughnut: white segment stroke (`#fff`), `60-62%` cutout; legend in sans.
|
|
320
|
+
|
|
321
|
+
```js
|
|
322
|
+
const PRIMARY="#635bff", S2="#9b96ff", S3="#cdcaff", S4="#e9e8ff", GRID="#e3e8ee";
|
|
323
|
+
Chart.defaults.font.family = "Inter, system-ui, sans-serif";
|
|
324
|
+
Chart.defaults.color = "#697386";
|
|
325
|
+
// bars: backgroundColor:[S2, PRIMARY], borderRadius:6
|
|
326
|
+
// grid: { color: GRID }
|
|
327
|
+
// tooltip: { backgroundColor:"#0a2540", cornerRadius:8 }
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## Motion & effects
|
|
333
|
+
|
|
334
|
+
- Soft shadow IS the depth language - keep it; do not strip it like in `grid`/`vercel-simple`.
|
|
335
|
+
- Hover: slight bg shift (`#f7fafc`), darker fill on primary buttons, never scale-jump.
|
|
336
|
+
- Focus: 3px blurple ring (`rgba(99,91,255,0.25)`) on inputs and focusable controls. Always visible.
|
|
337
|
+
- `transition-colors duration-150` on interactive elements; `transition-shadow` on inputs.
|
|
338
|
+
- Subtle card lift on hover is OK for clickable cards: shadow `card → float`.
|
|
339
|
+
- No glow halos, no neon, no glass blur on product surfaces.
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## Mode selection
|
|
344
|
+
|
|
345
|
+
| Surface type | Background | Accent | Notes |
|
|
346
|
+
|--------------|------------|--------|-------|
|
|
347
|
+
| Dashboard / app UI | `#f6f9fc` flat | blurple | shadows + rounded, tabular nums |
|
|
348
|
+
| Settings / forms | `#f6f9fc`, white cards | blurple | narrow shell, breadcrumb nav |
|
|
349
|
+
| Checkout / payment | white OR dark navy | green CTA | rounded inputs, payment-method tabs |
|
|
350
|
+
| Marketing / landing | gradient hero + white | blurple | diagonal skew band |
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## Anti-patterns
|
|
355
|
+
|
|
356
|
+
| Avoid | Why |
|
|
357
|
+
|-------|-----|
|
|
358
|
+
| `rounded-none` / sharp corners on cards | Stripe is soft and rounded, not blueprint-square |
|
|
359
|
+
| Removing shadows in favor of 1px borders only | Elevation is the core depth language here |
|
|
360
|
+
| Pure black `#000` background | Use navy `#0a2540` for dark, pale `#f6f9fc` for light |
|
|
361
|
+
| Blurple on large fills / backgrounds | Reserve it for actions and active state |
|
|
362
|
+
| Mono for body text | Sans for prose; mono only for card #, IDs, code |
|
|
363
|
+
| Heavy `shadow-2xl` drop shadows | Use the layered soft tokens, not one big blur |
|
|
364
|
+
| Gradient on product/app surfaces | Gradient is marketing-hero only; product stays flat |
|
|
365
|
+
| Skipping the focus ring | Fintech trust UI must keep visible focus states |
|
|
366
|
+
| Saturated multi-color UI | Keep layout neutral; one accent + status colors |
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## Project overrides
|
|
371
|
+
|
|
372
|
+
If the repo defines `.agents/styles/stripe.md` or `.agents/styles/stripe-theme.md`, prefer those tokens and components over this portable spec.
|