aiblueprint-cli 1.4.93 → 1.4.95
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 +1 -0
- package/agents-config/skills/use-artifacts/SKILL.md +25 -7
- package/agents-config/skills/use-style/SKILL.md +6 -5
- package/agents-config/skills/use-style/agents/openai.yaml +7 -0
- package/agents-config/skills/use-style/assets/codex-icon.svg +19 -0
- package/agents-config/skills/use-style/styles/{vercel-simple.md → black-grid.md} +3 -3
- package/agents-config/skills/use-style/styles/linear.md +2 -2
- package/agents-config/skills/use-style/styles/luma.md +1 -1
- package/agents-config/skills/use-style/styles/raycast.md +1 -1
- package/agents-config/skills/use-style/styles/stripe.md +2 -2
- package/agents-config/skills/use-style/styles/testspirite.md +1 -1
- package/agents-config/skills/use-style/styles/vercel.md +162 -0
- package/dist/cli.js +7 -0
- package/package.json +1 -1
- package/agents-config/skills/use-style/examples/split-auth.html +0 -366
- package/agents-config/skills/use-style/styles/split-auth.md +0 -281
package/README.md
CHANGED
|
@@ -166,6 +166,7 @@ npx skills add Melvynx/aiblueprint --skill skill-manager
|
|
|
166
166
|
| `nextjs-setup-project` | Set up a production-ready Next.js project |
|
|
167
167
|
| `create-vitejs-app` | Create a Vite app with Tailwind and shadcn/ui |
|
|
168
168
|
| `use-style` | Apply named UI style guides before implementation |
|
|
169
|
+
| `use-artifacts` | Create polished local HTML plans, prototypes, and visualizations |
|
|
169
170
|
| `rules-manager` | Create and maintain AGENTS.md and agent rule files |
|
|
170
171
|
| `agents-managers` | Manage Claude Code agents and Task-tool orchestration |
|
|
171
172
|
| `environments-manager` | Set up per-worktree agent environments |
|
|
@@ -67,12 +67,27 @@ Do not expose private chain-of-thought. Show public reasoning: conclusions, evid
|
|
|
67
67
|
|
|
68
68
|
Always use `$use-style` before designing the artifact UI.
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
When the artifact is for an existing application, the default style is that
|
|
71
|
+
application's actual visual language. Inspect the relevant UI code, styles,
|
|
72
|
+
design tokens, components, typography, spacing, colors, radii, shadows, and
|
|
73
|
+
interaction patterns, then make the artifact feel native to the product. Treat
|
|
74
|
+
the application's current implementation as the source of truth; do not impose
|
|
75
|
+
an unrelated preset merely because the user gave no visual direction.
|
|
76
|
+
|
|
77
|
+
Use the closest `$use-style` guide as supporting design guidance when useful,
|
|
78
|
+
but adapt it to the application rather than replacing the application's style.
|
|
79
|
+
Record the project-derived style in `HIGHLOGIC.md` and in `manifest.json` with a
|
|
80
|
+
clear value such as `project:<app-name>`.
|
|
81
|
+
|
|
82
|
+
If there is no existing application or usable visual context, use a simple,
|
|
83
|
+
minimalist style: restrained neutral colors, clear typography, generous
|
|
84
|
+
spacing, subtle borders, minimal decoration, and only the structure needed to
|
|
85
|
+
communicate the artifact. In that case, use the closest preset below when it
|
|
86
|
+
fits; otherwise use `black-grid` as the minimal technical fallback:
|
|
72
87
|
|
|
73
88
|
- `anthropic`: Claude-like artifacts, writing/research surfaces, calm AI tools
|
|
74
89
|
- `linear`: dense dashboards, admin tools, issue trackers, list/detail workflows
|
|
75
|
-
- `black-grid`:
|
|
90
|
+
- `black-grid`: minimal technical fallback for developer utilities, plans, calculators, indexes, and CLI-like tools
|
|
76
91
|
- `grid`: blueprint/product landing pages, structured spec pages, Codelynx-flavored pages
|
|
77
92
|
- `ios-app`: mobile app concepts, iPhone flows, Expo/React Native previews
|
|
78
93
|
- `stripe`: billing, checkout, finance, pricing, account flows
|
|
@@ -83,18 +98,21 @@ default to `black-grid`:
|
|
|
83
98
|
- `new-york-times`: editorial, newspaper, magazine, long-form reading
|
|
84
99
|
- `testspirite`: calm light dev-tool dashboards with onboarding or empty states
|
|
85
100
|
|
|
86
|
-
If
|
|
87
|
-
|
|
101
|
+
If the user explicitly requests a visual direction, follow it even when it
|
|
102
|
+
differs from the application. State briefly whether the artifact uses the
|
|
103
|
+
application style, a requested style, or the minimalist fallback.
|
|
88
104
|
|
|
89
105
|
## Creation Workflow
|
|
90
106
|
|
|
91
107
|
1. Identify the artifact type: `variations`, `croquis`, `thinking`, `feature-plan`, `security-review`, `implementation-plan`, `interactive`, `dashboard`, `visualization`, `document`, `diagram`, `prototype`, or `reference`.
|
|
92
|
-
2.
|
|
108
|
+
2. Determine the style source in this order: the user's explicit direction,
|
|
109
|
+
the existing application's actual style, then the minimalist fallback. Load
|
|
110
|
+
the closest `use-style` file for supporting guidance.
|
|
93
111
|
3. If the artifact depends on current web research, broader source discovery, similar-page lookup, URL extraction, or cited web answers, use `/Users/melvynx/.agents/skills/exa-search/SKILL.md`.
|
|
94
112
|
4. Scaffold the workspace:
|
|
95
113
|
|
|
96
114
|
```bash
|
|
97
|
-
python3 /Users/melvynx/.agents/skills/use-artifacts/scripts/create_artifact.py "<short title>" --style
|
|
115
|
+
python3 /Users/melvynx/.agents/skills/use-artifacts/scripts/create_artifact.py "<short title>" --style "<requested, project:app-name, or fallback style>" --kind thinking
|
|
98
116
|
```
|
|
99
117
|
|
|
100
118
|
5. Implement the artifact in `index.html`.
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: use-style
|
|
3
|
-
description: Apply named visual style guides to landing pages, app shells, and UI. Use for $use-style, /useskill, list styles, or styles like ios-app, grid, vercel-
|
|
3
|
+
description: Apply named visual style guides to landing pages, app shells, and UI. Use for $use-style, /useskill, list styles, or styles like ios-app, grid, vercel, black-grid, stripe, linear, raycast, gumroad, dusk, or luma.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Load and apply a named style before designing or implementing any UI.
|
|
7
7
|
|
|
8
8
|
## Invocation
|
|
9
9
|
|
|
10
|
-
- Explicit: `$use-style ios-app`, `$use-style
|
|
10
|
+
- Explicit: `$use-style ios-app`, `$use-style vercel`, `$use-style black-grid`, `/useskill list`, or "use the grid style"
|
|
11
11
|
- Implicit: user references NowStack Mobile, Ink & Spark, an iOS app shell, Expo / React Native / NativeWind app UI, `/aiblueprint`, `/agents`, `/aibuilder`, "grid theme", Vercel, Geist, a minimalist dark tool UI, Stripe / fintech / checkout / dashboard UI, Linear / issue tracker / app-shell sidebar UI, NYT / newspaper / editorial / broadsheet / magazine layouts, Anthropic / Claude / warm cream AI-lab pages, Gumroad / neo-brutalist / loud commerce / bold yellow-pink pages, Raycast / glossy dark / glow gradients / floating glass nav / premium product marketing, Dusk / Attio / dark CRM dashboard floating on a twilight backdrop / blue data viz / colorful category pills, Luma / lu.ma / event timeline / calendar / RSVP / discover / a dark consumer events-and-calendar app with photo-led cards, a top teal aurora, and a white pill button, or TestSprite / TestSpirite / calm light dev-tool dashboard / warm paper canvas with one forest-green accent / grouped sidebar + promo rail / isometric line-art empty states
|
|
12
12
|
|
|
13
|
-
Parse the style name from `$ARGUMENTS` or the message. Treat `ios`, `ios app`, `ios-app`, `iphone app`, `nowstack-mobile`, `nowstack mobile`, and `ink & spark` as `ios-app`. Treat `
|
|
13
|
+
Parse the style name from `$ARGUMENTS` or the message. Treat `ios`, `ios app`, `ios-app`, `iphone app`, `nowstack-mobile`, `nowstack mobile`, and `ink & spark` as `ios-app`. Treat `use-vercel`, `vercel style`, and `current vercel` as `vercel`. Treat `vercel-simple`, `old vercel`, `black grid`, and `black-grid` as `black-grid`. Treat `testsprite`, `test-sprite`, and `test sprite` as `testspirite`. Treat `luma`, `lu.ma`, and `luma.com` as `luma`. Treat `list`, `styles`, `available styles`, and missing style names with no implicit match as a request to list available styles and ask the user to choose before designing. Default to `ios-app` when the user references NowStack Mobile, Ink & Spark, an iOS app shell, Expo, React Native, NativeWind, or OS-native tabs. Default to `grid` for Codelynx product landings. Default to `vercel` when the user references Vercel, the Vercel dashboard, Geist, Vercel's changelog, or black infrastructure marketing with large editorial whitespace. Default to `black-grid` for austere monochrome developer tools, calculators, indexes, or line-driven data products. Default to `linear` when the user references Linear, an issue tracker, or a dense sidebar + list + detail app shell. Default to `new-york-times` when the user references a newspaper, broadsheet, magazine, or serif editorial layout. Default to `anthropic` when the user references Anthropic, Claude, or a warm cream + serif AI-lab aesthetic. Default to `gumroad` when the user references Gumroad, neo-brutalism, hard offset shadows, or a loud yellow/pink bordered look. Default to `raycast` when the user references Raycast, a glossy dark page with glow gradients, a floating glass nav, or premium dark product marketing. Default to `dusk` when the user references Attio, a dark CRM/data dashboard floating on a twilight/aurora backdrop, vivid-blue charts, or colorful category pills. Default to `testspirite` when the user references TestSprite, a calm light dev-tool dashboard, a warm paper canvas with a single forest-green accent, a grouped sidebar with a free-trial/upgrade promo rail, or isometric line-art empty states. Default to `luma` when the user references Luma, lu.ma, an event timeline/feed, a calendar or RSVP/invite app, a discover page, or a dark consumer events UI with photo-led cards, a top teal aurora, and a white pill button.
|
|
14
14
|
|
|
15
15
|
If the parsed style is `list`, or if no style can be inferred, do not load a style file. Reply with the available styles table below, add one short line asking which style to use, and stop until the user chooses.
|
|
16
16
|
|
|
@@ -30,7 +30,8 @@ If the parsed style is `list`, or if no style can be inferred, do not load a sty
|
|
|
30
30
|
|-------|------|------|
|
|
31
31
|
| `ios-app` | `styles/ios-app.md` | NowStack Mobile Ink & Spark. iOS/Expo app UI with monochrome ink/paper, one yellow `#FFE040` spark, NativeWind tokens, OS-native tabs, flat hairline cards. |
|
|
32
32
|
| `grid` | `styles/grid.md` | Blueprint landing. Square geometry, 1px borders, mono data, condensed display type. |
|
|
33
|
-
| `vercel
|
|
33
|
+
| `vercel` | `styles/vercel.md` | Current Vercel product language. Black canvas, Geist Sans, hairline dashboard structure, dense deployment lists, vast editorial marketing space, restrained semantic color. |
|
|
34
|
+
| `black-grid` | `styles/black-grid.md` | Austere monochrome developer tools. Black canvas, Geist + mono, sharp line-defined indexes and calculators, no decoration. |
|
|
34
35
|
| `stripe` | `styles/stripe.md` | Stripe fintech UI. Pale `#f6f9fc` canvas, white cards on soft shadows, blurple `#635BFF` accent, green CTA, rounded geometry. |
|
|
35
36
|
| `linear` | `styles/linear.md` | Linear app shell. Near-black `#08090a` canvas, dense aligned sidebar + list + detail panes, indigo `#5e6ad2` accent, Inter Display headings, quiet line-defined chrome. |
|
|
36
37
|
| `new-york-times` | `styles/new-york-times.md` | Print-newspaper editorial. Paper-white, serif headlines (Cheltenham/Georgia), Franklin sans kickers, blackletter masthead, hairline rules, multi-column grid, red/blue accents only. |
|
|
@@ -39,7 +40,6 @@ If the parsed style is `list`, or if no style can be inferred, do not load a sty
|
|
|
39
40
|
| `raycast` | `styles/raycast.md` | Glossy dark product marketing. Near-black `#0a0a0a` + red `#ff6363` glow, floating glass nav (`backdrop-blur`), oversized bold pricing, large-radius `rounded-3xl` cards, soft glow over hard shadows. |
|
|
40
41
|
| `dusk` | `styles/dusk.md` | Refined dark data app (Attio-style). Rounded near-black window floating on a twilight gradient backdrop, vivid sky-blue `#38bdf8` charts, `#3b6eff` primary, colorful category pills, Inter + mono numbers. |
|
|
41
42
|
| `luma` | `styles/luma.md` | Dark consumer events + calendar app (Luma/lu.ma). Near-black `#0a0a0b` canvas with one soft teal aurora at the top, near-borderless `rounded-2xl` photo-led cards, white pill primary buttons, blue `#2f6bff` status pills, gold `#f5b13d` event times, centered timeline column. |
|
|
42
|
-
| `split-auth` | `styles/split-auth.md` | Two-column auth and OAuth pages. Left visual brand panel with optimized bitmap background, right clean form panel, monochrome social buttons, compact code inputs. |
|
|
43
43
|
| `testspirite` | `styles/testspirite.md` | Calm light dev-tool app shell (TestSprite). Warm paper-white `#f7f7f3` canvas, one forest-green `#3d7c4e` accent, grouped sidebar + promo rail, soft `rounded-xl` cards on quiet borders, pale-green `#eaf3ea` status pills, isometric line-art empty states. |
|
|
44
44
|
|
|
45
45
|
Add new styles as `styles/<name>.md` and register them here.
|
|
@@ -54,4 +54,5 @@ Add new styles as `styles/<name>.md` and register them here.
|
|
|
54
54
|
## Related skills
|
|
55
55
|
|
|
56
56
|
- `frontend-design` / `frontend-skill`: general UI craft. Defer to `use-style` when a named style is requested.
|
|
57
|
+
- `use-feature`: reusable feature and UX implementation patterns that are not visual styles.
|
|
57
58
|
- `impeccable`: polish pass after the style is applied.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Use Style"
|
|
3
|
+
short_description: "Apply named visual style guides to landing pages, app..."
|
|
4
|
+
icon_small: "./assets/codex-icon.svg"
|
|
5
|
+
icon_large: "./assets/codex-icon.svg"
|
|
6
|
+
brand_color: "#02195C"
|
|
7
|
+
default_prompt: "Use $use-style to help with this task."
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<!-- @license lucide-static v1.24.0 - ISC -->
|
|
2
|
+
<svg role="img" aria-label="use-style skill icon"
|
|
3
|
+
class="lucide lucide-palette"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="128"
|
|
6
|
+
height="128"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
stroke="#F5F5F5"
|
|
10
|
+
stroke-width="2"
|
|
11
|
+
stroke-linecap="round"
|
|
12
|
+
stroke-linejoin="round"
|
|
13
|
+
>
|
|
14
|
+
<path d="M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z" />
|
|
15
|
+
<circle cx="13.5" cy="6.5" r=".5" fill="currentColor" />
|
|
16
|
+
<circle cx="17.5" cy="10.5" r=".5" fill="currentColor" />
|
|
17
|
+
<circle cx="6.5" cy="12.5" r=".5" fill="currentColor" />
|
|
18
|
+
<circle cx="8.5" cy="7.5" r=".5" fill="currentColor" />
|
|
19
|
+
</svg>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Black Grid Style
|
|
2
2
|
|
|
3
3
|
Minimal dark-mode developer UI. High contrast, line-driven structure, no decoration.
|
|
4
4
|
|
|
5
|
-
**Reference vibe:**
|
|
5
|
+
**Reference vibe:** austere black developer tools, country indexes, calculators, and line-driven data products.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -319,4 +319,4 @@ When unsure, default to mono + sharp for new tool UIs, and sans + `rounded-lg` f
|
|
|
319
319
|
|
|
320
320
|
## Project overrides
|
|
321
321
|
|
|
322
|
-
If the repo defines `.agents/styles/
|
|
322
|
+
If the repo defines `.agents/styles/black-grid.md` or `.agents/styles/black-grid-theme.md`, prefer those tokens and components over this portable spec.
|
|
@@ -327,8 +327,8 @@ Chart.defaults.color = "#8a8f98";
|
|
|
327
327
|
|---------|-----|
|
|
328
328
|
| Issue tracker, inbox, dashboard, settings, admin panel | Strong fit |
|
|
329
329
|
| Tool with sidebar + list + detail panes | Strong fit |
|
|
330
|
-
| Marketing landing / hero page | Poor fit - use `grid` or `vercel
|
|
331
|
-
| Data calculator / index of tools | Use `
|
|
330
|
+
| Marketing landing / hero page | Poor fit - use `grid` or `vercel` |
|
|
331
|
+
| Data calculator / index of tools | Use `black-grid` (mono + sharp) |
|
|
332
332
|
|
|
333
333
|
Linear style is for **product app shells**. If the request is a marketing page, redirect to another style.
|
|
334
334
|
|
|
@@ -394,7 +394,7 @@ No drop shadows on cards - elevation is the fill step from `#0a0a0b` → `#16161
|
|
|
394
394
|
| Consumer social/community product (dark) | Strong fit |
|
|
395
395
|
| Dense analytics dashboard (KPIs, charts) | Poor fit - use `dusk` |
|
|
396
396
|
| 3-pane issue tracker | Use `linear` |
|
|
397
|
-
| Marketing hero / landing page | Use `raycast`, `grid`, or `vercel
|
|
397
|
+
| Marketing hero / landing page | Use `raycast`, `grid`, or `vercel` |
|
|
398
398
|
|
|
399
399
|
Luma is for **dark consumer event/calendar/account app shells** built around a centered column and photo-led cards.
|
|
400
400
|
|
|
@@ -261,7 +261,7 @@ Chart.defaults.color = "#6b6b6b";
|
|
|
261
261
|
- Hover: subtle bg lift (`#1c1c1e → #242424`), border lighten, or a gentle glow bloom. No hard movement.
|
|
262
262
|
- `backdrop-blur` on the floating nav and any glass surface.
|
|
263
263
|
- `transition-colors duration-150`; the featured card may breathe a slow glow.
|
|
264
|
-
- Avoid hard offset shadows (that's Gumroad), avoid flat-no-glow (that's
|
|
264
|
+
- Avoid hard offset shadows (that's Gumroad), avoid flat-no-glow (that's black-grid). Raycast is glossy-soft.
|
|
265
265
|
|
|
266
266
|
---
|
|
267
267
|
|
|
@@ -10,7 +10,7 @@ Clean fintech product UI. Light, airy, trust-driven. Soft elevation over hard li
|
|
|
10
10
|
|
|
11
11
|
- **Trust-first fintech.** Polished, premium, calm. Feels like money software, not a marketing funnel.
|
|
12
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` / `
|
|
13
|
+
- **Soft elevation.** Subtle layered shadows define cards, NOT 1px borders. This is the key contrast with `grid` / `black-grid`.
|
|
14
14
|
- **Rounded geometry.** `8px` cards, `6px` inputs/buttons, `radius-full` pills and avatars.
|
|
15
15
|
- **Blurple accent.** `#635BFF` for primary actions, active states, links. Green (`#24B47E`) for success/confirm CTAs.
|
|
16
16
|
- **Sans everywhere.** Clean grotesk (Inter / system / sohne). Mono only for card numbers, IDs, code.
|
|
@@ -331,7 +331,7 @@ Chart.defaults.color = "#697386";
|
|
|
331
331
|
|
|
332
332
|
## Motion & effects
|
|
333
333
|
|
|
334
|
-
- Soft shadow IS the depth language - keep it; do not strip it like in `grid`/`
|
|
334
|
+
- Soft shadow IS the depth language - keep it; do not strip it like in `grid`/`black-grid`.
|
|
335
335
|
- Hover: slight bg shift (`#f7fafc`), darker fill on primary buttons, never scale-jump.
|
|
336
336
|
- Focus: 3px blurple ring (`rgba(99,91,255,0.25)`) on inputs and focusable controls. Always visible.
|
|
337
337
|
- `transition-colors duration-150` on interactive elements; `transition-shadow` on inputs.
|
|
@@ -369,7 +369,7 @@ Chart.defaults.color = "#8a8d84";
|
|
|
369
369
|
| Dev-tool dashboard, test runner, monitoring, settings, plan/billing | Strong fit |
|
|
370
370
|
| App shell with grouped sidebar + content + promo rail | Strong fit |
|
|
371
371
|
| Onboarding / empty states with illustrated CTAs | Strong fit |
|
|
372
|
-
| Marketing hero / landing page | Poor fit - use `grid`, `vercel
|
|
372
|
+
| Marketing hero / landing page | Poor fit - use `grid`, `vercel`, or `raycast` |
|
|
373
373
|
| Dense issue-tracker triage (3-pane) | Use `linear` |
|
|
374
374
|
|
|
375
375
|
TestSpirite is for **calm light-mode product app shells**. If the request is a marketing page, redirect to another style.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Vercel Style
|
|
2
|
+
|
|
3
|
+
Current Vercel product language across the dashboard, marketing homepage, and changelog: exact black canvas, quiet gray hierarchy, Geist typography, hairline structure, and large editorial whitespace.
|
|
4
|
+
|
|
5
|
+
## Core vibe
|
|
6
|
+
|
|
7
|
+
- **Premium infrastructure, not a terminal theme.** Precise and technical, but polished enough for product marketing.
|
|
8
|
+
- **Black is the canvas.** Use `#000`; lift app rows and cards only to `#0a0a0a` or `#111`.
|
|
9
|
+
- **Hairlines create the interface.** Dividers and outlines are subtle `#262626`, never a visible grid motif.
|
|
10
|
+
- **Typography carries the page.** Large, light-weight Geist headlines; compact medium labels; mono only for hashes, branches, metrics, and agent copy.
|
|
11
|
+
- **Two density modes.** Dashboard surfaces are dense and aligned; marketing surfaces are extremely spacious and editorial.
|
|
12
|
+
- **Mostly monochrome.** Color appears only in semantic status, deployment environment, avatars, and rare product imagery.
|
|
13
|
+
|
|
14
|
+
## Palette
|
|
15
|
+
|
|
16
|
+
| Role | Value | Usage |
|
|
17
|
+
|---|---:|---|
|
|
18
|
+
| Canvas | `#000000` | Global page and sidebar |
|
|
19
|
+
| Surface | `#0a0a0a` | Rows, cards, inset dashboard regions |
|
|
20
|
+
| Hover | `#171717` | Active nav, selected filter, row hover |
|
|
21
|
+
| Primary text | `#ededed` | Headlines, names, primary values |
|
|
22
|
+
| Secondary text | `#a1a1a1` | Metadata and descriptions |
|
|
23
|
+
| Quiet text | `#666666` | Placeholders and low-priority labels |
|
|
24
|
+
| Hairline | `#262626` | Borders and separators |
|
|
25
|
+
| Strong hairline | `#333333` | Focus and hover outline |
|
|
26
|
+
| White action | `#ededed` | Primary button fill |
|
|
27
|
+
| Vercel blue | `#0070f3` | Production/environment state only |
|
|
28
|
+
| Ready | `#45dec4` | Healthy deployment dot |
|
|
29
|
+
| Error | `#f33a4a` | Error or blocked state |
|
|
30
|
+
|
|
31
|
+
Keep at least 90% of the page black, gray, and white. Never introduce a decorative brand gradient.
|
|
32
|
+
|
|
33
|
+
## Typography
|
|
34
|
+
|
|
35
|
+
- Use `Geist, Arial, sans-serif`; use `Geist Mono, SFMono-Regular, monospace` only for technical metadata.
|
|
36
|
+
- Marketing display: `clamp(3rem, 6vw, 5.5rem)`, `font-weight: 400`, `line-height: .92`, `letter-spacing: -.055em`.
|
|
37
|
+
- Page heading: `text-4xl md:text-6xl`, regular weight, tight tracking.
|
|
38
|
+
- Dashboard title and row labels: `14-16px`, medium weight.
|
|
39
|
+
- Metadata: `13-14px`, muted; technical metadata may be mono.
|
|
40
|
+
- Avoid uppercase everywhere. Reserve spaced uppercase mono for short agent/infrastructure statements.
|
|
41
|
+
|
|
42
|
+
## Geometry
|
|
43
|
+
|
|
44
|
+
| Element | Radius | Treatment |
|
|
45
|
+
|---|---:|---|
|
|
46
|
+
| Dashboard rows and large tables | `0-8px` outer only | Hairline separators; no individual floating cards |
|
|
47
|
+
| Search and select controls | `8px` | Black fill, `1px` hairline |
|
|
48
|
+
| Secondary buttons | `8px` | Black fill, subtle outline |
|
|
49
|
+
| Primary buttons | `8px` | White fill, black text |
|
|
50
|
+
| Status/environment chips | `999px` | Compact semantic pills |
|
|
51
|
+
| Marketing article cards | `0` | Large near-black slabs, usually no visible radius |
|
|
52
|
+
|
|
53
|
+
Do not make every element a pill. Pills are for status, compact filters, and identity chips only.
|
|
54
|
+
|
|
55
|
+
## Dashboard composition
|
|
56
|
+
|
|
57
|
+
- Use a fixed left sidebar around `240px`, a thin right border, and compact icon + label rows.
|
|
58
|
+
- Put workspace switcher at the top and profile/utility controls at the bottom.
|
|
59
|
+
- Use a slim top bar with context on the left, centered page title, and agent/product action on the right.
|
|
60
|
+
- Place filters in one aligned horizontal row above a dense list or table.
|
|
61
|
+
- Rows should be `56-72px` high with stable columns: title, status, environment, project, commit, branch, time, avatar.
|
|
62
|
+
- Prefer one continuous bordered list over a collection of floating cards.
|
|
63
|
+
- Selected navigation uses `#1f1f1f`; inactive items are gray with no container.
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
<div className="min-h-screen bg-black text-[#ededed]">
|
|
67
|
+
<aside className="fixed inset-y-0 w-60 border-r border-[#262626]">...</aside>
|
|
68
|
+
<main className="ml-60 min-w-0">
|
|
69
|
+
<header className="h-16 border-b border-[#262626]">...</header>
|
|
70
|
+
<section className="p-6">...</section>
|
|
71
|
+
</main>
|
|
72
|
+
</div>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Marketing composition
|
|
76
|
+
|
|
77
|
+
- Use a centered max-width around `1720px` with generous `48-96px` side padding.
|
|
78
|
+
- Keep the header sparse: triangle mark, four quiet links, two outlined actions, avatar.
|
|
79
|
+
- Hero sections should occupy most of the viewport and use three-part composition: oversized statement, restrained central visual, compact technical support copy.
|
|
80
|
+
- Allow dramatic emptiness. Do not fill blank space with generic feature cards.
|
|
81
|
+
- Customer marks may form a quiet monochrome baseline near the fold.
|
|
82
|
+
- For changelogs/editorial indexes, use a large heading and category navigation, then a strict three-column grid of oversized story cards.
|
|
83
|
+
- Featured story cards are tall, flat `#0a0a0a` slabs with title near the top and description/byline anchored near the bottom.
|
|
84
|
+
|
|
85
|
+
## Signature imagery
|
|
86
|
+
|
|
87
|
+
- The Vercel triangle may be used as a single focal object.
|
|
88
|
+
- Render it monochrome, geometric, and centered; a soft white backlight is allowed behind the mark.
|
|
89
|
+
- Glow belongs to the hero object only. Never add ambient purple/blue auroras, glass cards, or glossy gradients.
|
|
90
|
+
- Product screenshots should retain true dashboard density instead of being simplified into decorative mockups.
|
|
91
|
+
|
|
92
|
+
## Components
|
|
93
|
+
|
|
94
|
+
### Buttons
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
const primary = "rounded-lg bg-[#ededed] px-5 py-2.5 text-sm font-medium text-black hover:bg-white";
|
|
98
|
+
const secondary = "rounded-lg border border-[#333] bg-black px-5 py-2.5 text-sm font-medium text-[#ededed] hover:bg-[#111]";
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Dashboard filter
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
<button className="flex h-11 items-center gap-3 rounded-lg border border-[#262626] bg-black px-4 text-sm text-[#a1a1a1] hover:border-[#333]">
|
|
105
|
+
<Icon className="size-4" />
|
|
106
|
+
<span>All Environments</span>
|
|
107
|
+
</button>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Deployment row
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
<div className="grid min-h-14 grid-cols-[minmax(280px,1fr)_160px_140px_160px_100px_120px_90px_28px] items-center gap-4 border-b border-[#262626] px-4 text-sm last:border-b-0 hover:bg-[#0a0a0a]">
|
|
114
|
+
<span className="truncate text-[#ededed]">fix: harden workflow compatibility</span>
|
|
115
|
+
<span className="flex items-center gap-2"><i className="size-2 rounded-full bg-[#45dec4]" />Ready</span>
|
|
116
|
+
<span className="w-fit rounded-full border border-[#262626] px-2.5 py-1">Production</span>
|
|
117
|
+
<span className="truncate">project-name</span>
|
|
118
|
+
<code className="text-[#a1a1a1]">f269f37</code>
|
|
119
|
+
<code className="truncate text-[#a1a1a1]">main</code>
|
|
120
|
+
<time className="text-right text-[#a1a1a1]">11h ago</time>
|
|
121
|
+
<Avatar />
|
|
122
|
+
</div>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Editorial card
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
<article className="flex min-h-[510px] flex-col bg-[#0a0a0a] p-8">
|
|
129
|
+
<p className="text-sm text-[#a1a1a1]">30 June General</p>
|
|
130
|
+
<h2 className="mt-7 max-w-[18ch] text-4xl font-normal leading-tight tracking-[-0.04em]">Run any Dockerfile on Vercel</h2>
|
|
131
|
+
<div className="mt-auto space-y-7 text-[#a1a1a1]">...</div>
|
|
132
|
+
</article>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Motion
|
|
136
|
+
|
|
137
|
+
- Use `120-180ms` color and border transitions.
|
|
138
|
+
- No card lift, spring bounce, parallax, or ornamental motion.
|
|
139
|
+
- Loading uses quiet skeleton slabs on `#111`.
|
|
140
|
+
- A hero glow may breathe almost imperceptibly; respect reduced motion.
|
|
141
|
+
|
|
142
|
+
## Responsive behavior
|
|
143
|
+
|
|
144
|
+
- Collapse the sidebar to a drawer or icon rail below desktop.
|
|
145
|
+
- Turn dashboard filter rows into horizontal overflow rather than wrapping unevenly.
|
|
146
|
+
- Hide lower-priority table columns progressively; keep title, status, project, and time.
|
|
147
|
+
- Marketing heroes stack text, visual, and support copy; preserve generous vertical space.
|
|
148
|
+
- Changelog grids move from three columns to one without shrinking headline type excessively.
|
|
149
|
+
|
|
150
|
+
## Anti-patterns
|
|
151
|
+
|
|
152
|
+
- Do not add visible graph-paper grids, plus marks, coordinate labels, or blueprint decoration. That is `black-grid`.
|
|
153
|
+
- Do not turn the style into a generic rounded-card SaaS dashboard.
|
|
154
|
+
- Do not use neon gradients, glassmorphism, heavy shadows, or multiple glows.
|
|
155
|
+
- Do not overuse mono or uppercase; current Vercel relies primarily on Geist Sans.
|
|
156
|
+
- Do not outline every marketing section. Empty black space is part of the system.
|
|
157
|
+
- Do not use blue as a general brand wash. Keep it semantic and sparse.
|
|
158
|
+
- Do not replace dense dashboard lists with oversized cards.
|
|
159
|
+
|
|
160
|
+
## Project overrides
|
|
161
|
+
|
|
162
|
+
If the repo defines `.agents/styles/vercel.md` or `.agents/styles/vercel-theme.md`, prefer those tokens and components over this portable spec.
|
package/dist/cli.js
CHANGED
|
@@ -33019,6 +33019,13 @@ async function updateSettings(options, claudeDir) {
|
|
|
33019
33019
|
};
|
|
33020
33020
|
}
|
|
33021
33021
|
}
|
|
33022
|
+
if (!settings.env || typeof settings.env !== "object" || Array.isArray(settings.env)) {
|
|
33023
|
+
settings.env = {};
|
|
33024
|
+
}
|
|
33025
|
+
if (settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL === "claude-sonnet-4-6[1m]") {
|
|
33026
|
+
delete settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL;
|
|
33027
|
+
}
|
|
33028
|
+
settings.env.CLAUDE_CODE_DISABLE_1M_CONTEXT = "1";
|
|
33022
33029
|
if (!settings.permissions) {
|
|
33023
33030
|
settings.permissions = {};
|
|
33024
33031
|
}
|
package/package.json
CHANGED
|
@@ -1,366 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>Split Auth Style Demo</title>
|
|
7
|
-
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
8
|
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
9
|
-
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
|
|
10
|
-
<style>
|
|
11
|
-
:root {
|
|
12
|
-
--bg:#ffffff;
|
|
13
|
-
--fg:#111216;
|
|
14
|
-
--muted:#747884;
|
|
15
|
-
--border:#dedfe5;
|
|
16
|
-
--soft:#f7f7f8;
|
|
17
|
-
--primary:#126fe0;
|
|
18
|
-
--primary-hover:#0f61c6;
|
|
19
|
-
--black:#050506;
|
|
20
|
-
--white:#ffffff;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
* { box-sizing:border-box; margin:0; padding:0; }
|
|
24
|
-
html { -webkit-text-size-adjust:100%; }
|
|
25
|
-
body {
|
|
26
|
-
min-height:100vh;
|
|
27
|
-
font-family:Inter, ui-sans-serif, system-ui, sans-serif;
|
|
28
|
-
color:var(--fg);
|
|
29
|
-
background:var(--bg);
|
|
30
|
-
line-height:1.5;
|
|
31
|
-
-webkit-font-smoothing:antialiased;
|
|
32
|
-
}
|
|
33
|
-
button, input { font:inherit; }
|
|
34
|
-
a { color:inherit; }
|
|
35
|
-
|
|
36
|
-
.shell {
|
|
37
|
-
min-height:100vh;
|
|
38
|
-
display:grid;
|
|
39
|
-
grid-template-columns:minmax(0,1.1fr) minmax(420px,.9fr);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
.visual {
|
|
43
|
-
position:relative;
|
|
44
|
-
min-height:100vh;
|
|
45
|
-
overflow:hidden;
|
|
46
|
-
background:#030306;
|
|
47
|
-
color:var(--white);
|
|
48
|
-
}
|
|
49
|
-
.visual::before {
|
|
50
|
-
content:"";
|
|
51
|
-
position:absolute;
|
|
52
|
-
inset:-12%;
|
|
53
|
-
background:
|
|
54
|
-
radial-gradient(circle at 65% 38%, rgba(255,255,255,.30), transparent 9%),
|
|
55
|
-
radial-gradient(circle at 28% 70%, rgba(126,158,255,.32), transparent 10%),
|
|
56
|
-
linear-gradient(125deg, transparent 0 34%, rgba(255,255,255,.18) 46%, transparent 58%),
|
|
57
|
-
linear-gradient(150deg, transparent 0 42%, rgba(155,177,255,.20) 52%, transparent 66%),
|
|
58
|
-
#030306;
|
|
59
|
-
filter:blur(.2px) contrast(115%);
|
|
60
|
-
}
|
|
61
|
-
.visual::after {
|
|
62
|
-
content:"";
|
|
63
|
-
position:absolute;
|
|
64
|
-
inset:0;
|
|
65
|
-
background:
|
|
66
|
-
radial-gradient(circle at 20% 18%, rgba(255,255,255,.14), transparent 28%),
|
|
67
|
-
linear-gradient(180deg, rgba(4,6,12,.1), rgba(4,6,12,.86));
|
|
68
|
-
}
|
|
69
|
-
.visual-inner {
|
|
70
|
-
position:relative;
|
|
71
|
-
z-index:1;
|
|
72
|
-
min-height:100vh;
|
|
73
|
-
display:flex;
|
|
74
|
-
flex-direction:column;
|
|
75
|
-
justify-content:space-between;
|
|
76
|
-
padding:64px;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
.brand {
|
|
80
|
-
display:flex;
|
|
81
|
-
align-items:center;
|
|
82
|
-
gap:12px;
|
|
83
|
-
width:max-content;
|
|
84
|
-
text-decoration:none;
|
|
85
|
-
font-size:20px;
|
|
86
|
-
font-weight:700;
|
|
87
|
-
}
|
|
88
|
-
.mark {
|
|
89
|
-
width:44px;
|
|
90
|
-
height:44px;
|
|
91
|
-
border:1px solid rgba(255,255,255,.22);
|
|
92
|
-
border-radius:14px;
|
|
93
|
-
display:grid;
|
|
94
|
-
place-items:center;
|
|
95
|
-
background:rgba(255,255,255,.10);
|
|
96
|
-
backdrop-filter:blur(18px);
|
|
97
|
-
box-shadow:0 16px 48px rgba(0,0,0,.26);
|
|
98
|
-
}
|
|
99
|
-
.mark svg { width:22px; height:22px; }
|
|
100
|
-
|
|
101
|
-
.story {
|
|
102
|
-
max-width:610px;
|
|
103
|
-
}
|
|
104
|
-
.story h1 {
|
|
105
|
-
max-width:10ch;
|
|
106
|
-
font-size:clamp(52px,5.5vw,82px);
|
|
107
|
-
line-height:1.01;
|
|
108
|
-
letter-spacing:-.05em;
|
|
109
|
-
font-weight:800;
|
|
110
|
-
}
|
|
111
|
-
.story p {
|
|
112
|
-
margin-top:26px;
|
|
113
|
-
max-width:510px;
|
|
114
|
-
color:rgba(255,255,255,.72);
|
|
115
|
-
font-size:19px;
|
|
116
|
-
line-height:1.7;
|
|
117
|
-
}
|
|
118
|
-
.visual-foot {
|
|
119
|
-
color:rgba(255,255,255,.45);
|
|
120
|
-
font-size:14px;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
.auth {
|
|
124
|
-
min-height:100vh;
|
|
125
|
-
display:flex;
|
|
126
|
-
flex-direction:column;
|
|
127
|
-
background:var(--bg);
|
|
128
|
-
}
|
|
129
|
-
.topbar {
|
|
130
|
-
display:flex;
|
|
131
|
-
justify-content:space-between;
|
|
132
|
-
align-items:center;
|
|
133
|
-
padding:32px 40px;
|
|
134
|
-
}
|
|
135
|
-
.mobile-brand {
|
|
136
|
-
display:none;
|
|
137
|
-
align-items:center;
|
|
138
|
-
gap:10px;
|
|
139
|
-
font-size:20px;
|
|
140
|
-
font-weight:700;
|
|
141
|
-
}
|
|
142
|
-
.mobile-brand .mark {
|
|
143
|
-
width:32px;
|
|
144
|
-
height:32px;
|
|
145
|
-
color:var(--fg);
|
|
146
|
-
border-color:var(--border);
|
|
147
|
-
background:var(--soft);
|
|
148
|
-
box-shadow:none;
|
|
149
|
-
}
|
|
150
|
-
.icon-button {
|
|
151
|
-
width:32px;
|
|
152
|
-
height:32px;
|
|
153
|
-
border:0;
|
|
154
|
-
border-radius:999px;
|
|
155
|
-
background:transparent;
|
|
156
|
-
color:var(--fg);
|
|
157
|
-
cursor:pointer;
|
|
158
|
-
}
|
|
159
|
-
.center {
|
|
160
|
-
flex:1;
|
|
161
|
-
display:flex;
|
|
162
|
-
align-items:center;
|
|
163
|
-
justify-content:center;
|
|
164
|
-
padding:20px 40px 72px;
|
|
165
|
-
}
|
|
166
|
-
.card {
|
|
167
|
-
width:100%;
|
|
168
|
-
max-width:420px;
|
|
169
|
-
}
|
|
170
|
-
.eyebrow {
|
|
171
|
-
color:var(--primary);
|
|
172
|
-
font-size:14px;
|
|
173
|
-
font-weight:700;
|
|
174
|
-
margin-bottom:12px;
|
|
175
|
-
}
|
|
176
|
-
.card h2 {
|
|
177
|
-
font-size:32px;
|
|
178
|
-
line-height:1.15;
|
|
179
|
-
letter-spacing:-.03em;
|
|
180
|
-
font-weight:750;
|
|
181
|
-
}
|
|
182
|
-
.sub {
|
|
183
|
-
margin-top:12px;
|
|
184
|
-
color:var(--muted);
|
|
185
|
-
font-size:15px;
|
|
186
|
-
line-height:1.65;
|
|
187
|
-
}
|
|
188
|
-
.form {
|
|
189
|
-
display:grid;
|
|
190
|
-
gap:16px;
|
|
191
|
-
margin-top:32px;
|
|
192
|
-
}
|
|
193
|
-
label {
|
|
194
|
-
display:grid;
|
|
195
|
-
gap:8px;
|
|
196
|
-
font-size:14px;
|
|
197
|
-
font-weight:650;
|
|
198
|
-
}
|
|
199
|
-
input {
|
|
200
|
-
height:44px;
|
|
201
|
-
width:100%;
|
|
202
|
-
border:1px solid var(--border);
|
|
203
|
-
border-radius:10px;
|
|
204
|
-
background:var(--bg);
|
|
205
|
-
color:var(--fg);
|
|
206
|
-
padding:0 14px;
|
|
207
|
-
outline:none;
|
|
208
|
-
transition:border-color .18s ease, box-shadow .18s ease;
|
|
209
|
-
}
|
|
210
|
-
input:focus {
|
|
211
|
-
border-color:rgba(18,111,224,.7);
|
|
212
|
-
box-shadow:0 0 0 3px rgba(18,111,224,.14);
|
|
213
|
-
}
|
|
214
|
-
.primary {
|
|
215
|
-
height:44px;
|
|
216
|
-
border:0;
|
|
217
|
-
border-radius:10px;
|
|
218
|
-
background:var(--primary);
|
|
219
|
-
color:var(--white);
|
|
220
|
-
font-weight:750;
|
|
221
|
-
cursor:pointer;
|
|
222
|
-
}
|
|
223
|
-
.primary:hover { background:var(--primary-hover); }
|
|
224
|
-
|
|
225
|
-
.divider {
|
|
226
|
-
display:flex;
|
|
227
|
-
align-items:center;
|
|
228
|
-
gap:24px;
|
|
229
|
-
margin:24px 0;
|
|
230
|
-
color:var(--fg);
|
|
231
|
-
font-size:15px;
|
|
232
|
-
}
|
|
233
|
-
.divider::before,
|
|
234
|
-
.divider::after {
|
|
235
|
-
content:"";
|
|
236
|
-
height:1px;
|
|
237
|
-
flex:1;
|
|
238
|
-
background:var(--border);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
.socials {
|
|
242
|
-
display:grid;
|
|
243
|
-
gap:12px;
|
|
244
|
-
}
|
|
245
|
-
.social {
|
|
246
|
-
height:44px;
|
|
247
|
-
display:flex;
|
|
248
|
-
align-items:center;
|
|
249
|
-
justify-content:center;
|
|
250
|
-
gap:10px;
|
|
251
|
-
border:1px solid var(--black);
|
|
252
|
-
border-radius:10px;
|
|
253
|
-
background:var(--black);
|
|
254
|
-
color:var(--white);
|
|
255
|
-
font-weight:750;
|
|
256
|
-
cursor:pointer;
|
|
257
|
-
}
|
|
258
|
-
.social svg {
|
|
259
|
-
width:17px;
|
|
260
|
-
height:17px;
|
|
261
|
-
color:var(--white);
|
|
262
|
-
}
|
|
263
|
-
.switch {
|
|
264
|
-
margin-top:34px;
|
|
265
|
-
color:var(--muted);
|
|
266
|
-
font-size:14px;
|
|
267
|
-
text-align:center;
|
|
268
|
-
}
|
|
269
|
-
.switch a {
|
|
270
|
-
color:var(--fg);
|
|
271
|
-
font-weight:750;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
@media (max-width:980px) {
|
|
275
|
-
.shell { grid-template-columns:1fr; }
|
|
276
|
-
.visual { display:none; }
|
|
277
|
-
.topbar { padding:20px; }
|
|
278
|
-
.mobile-brand { display:flex; }
|
|
279
|
-
.center {
|
|
280
|
-
align-items:flex-start;
|
|
281
|
-
padding:82px 20px 44px;
|
|
282
|
-
}
|
|
283
|
-
.card { max-width:100%; }
|
|
284
|
-
}
|
|
285
|
-
@media (max-width:430px) {
|
|
286
|
-
.center { padding-top:68px; }
|
|
287
|
-
.card h2 { font-size:30px; }
|
|
288
|
-
}
|
|
289
|
-
</style>
|
|
290
|
-
</head>
|
|
291
|
-
<body>
|
|
292
|
-
<main class="shell">
|
|
293
|
-
<section class="visual" aria-label="Brand panel">
|
|
294
|
-
<div class="visual-inner">
|
|
295
|
-
<a class="brand" href="#">
|
|
296
|
-
<span class="mark" aria-hidden="true">
|
|
297
|
-
<svg viewBox="0 0 24 24" fill="none">
|
|
298
|
-
<path d="M5 6h14M5 12h14M5 18h8" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" />
|
|
299
|
-
</svg>
|
|
300
|
-
</span>
|
|
301
|
-
Product
|
|
302
|
-
</a>
|
|
303
|
-
|
|
304
|
-
<div class="story">
|
|
305
|
-
<h1>The calmer way to get back to work.</h1>
|
|
306
|
-
<p>Secure access for teams that want speed, clarity, and fewer distractions.</p>
|
|
307
|
-
</div>
|
|
308
|
-
|
|
309
|
-
<p class="visual-foot">Product</p>
|
|
310
|
-
</div>
|
|
311
|
-
</section>
|
|
312
|
-
|
|
313
|
-
<section class="auth">
|
|
314
|
-
<header class="topbar">
|
|
315
|
-
<div class="mobile-brand">
|
|
316
|
-
<span class="mark" aria-hidden="true">
|
|
317
|
-
<svg viewBox="0 0 24 24" fill="none">
|
|
318
|
-
<path d="M5 6h14M5 12h14M5 18h8" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" />
|
|
319
|
-
</svg>
|
|
320
|
-
</span>
|
|
321
|
-
Product
|
|
322
|
-
</div>
|
|
323
|
-
<button class="icon-button" type="button" aria-label="Toggle theme">☼</button>
|
|
324
|
-
</header>
|
|
325
|
-
|
|
326
|
-
<div class="center">
|
|
327
|
-
<div class="card">
|
|
328
|
-
<p class="eyebrow">Welcome back</p>
|
|
329
|
-
<h2>Sign in to Product</h2>
|
|
330
|
-
<p class="sub">Use your email code or continue with a connected provider.</p>
|
|
331
|
-
|
|
332
|
-
<form class="form">
|
|
333
|
-
<label>
|
|
334
|
-
Email
|
|
335
|
-
<input type="email" value="you@example.com" autocomplete="email" />
|
|
336
|
-
</label>
|
|
337
|
-
<button class="primary" type="button">Send code</button>
|
|
338
|
-
</form>
|
|
339
|
-
|
|
340
|
-
<div class="divider">or</div>
|
|
341
|
-
|
|
342
|
-
<div class="socials">
|
|
343
|
-
<button class="social" type="button">
|
|
344
|
-
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
|
345
|
-
<path d="M12 .5A12 12 0 0 0 8.2 23.9c.6.1.8-.3.8-.6v-2.1c-3.3.7-4-1.4-4-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.9 1.3 1.9 1.3 1 .1.7 2.9 2.7 3.6-.3.1-.8.4-1 .8-.9-2.6-3.7-1.3-3.7-6 0-1.3.5-2.4 1.3-3.3-.1-.3-.6-1.7.1-3.4 0 0 1-.3 3.4 1.2a11.8 11.8 0 0 1 6.2 0C18 5.2 19 5.5 19 5.5c.7 1.7.2 3.1.1 3.4.8.9 1.3 2 1.3 3.3 0 4.8-2.9 5.8-5.6 6.1.5.4.9 1.2.9 2.4v3.6c0 .3.2.7.9.6A12 12 0 0 0 12 .5Z"/>
|
|
346
|
-
</svg>
|
|
347
|
-
Sign in with GitHub
|
|
348
|
-
</button>
|
|
349
|
-
<button class="social" type="button">
|
|
350
|
-
<svg viewBox="0 0 256 262" fill="currentColor" aria-hidden="true">
|
|
351
|
-
<path d="M255.9 133.5c0-10.7-.9-18.6-2.8-26.7H130.6v48.4h71.9c-1.5 12-9.3 30.2-26.7 42.4l-.2 1.6 38.8 30 2.7.3c24.6-22.8 38.8-56.3 38.8-96Z"/>
|
|
352
|
-
<path d="M130.6 261.1c35.2 0 64.8-11.6 86.4-31.6l-41.2-31.9c-11 7.7-25.8 13.1-45.2 13.1-34.5 0-63.8-22.8-74.3-54.3l-1.5.1-40.3 31.2-.5 1.5c21.5 42.6 65.6 71.9 116.6 71.9Z"/>
|
|
353
|
-
<path d="M56.3 156.4a80.4 80.4 0 0 1-.1-51.7l-.1-1.7-40.8-31.7-1.3.6A130 130 0 0 0 0 130.6c0 21 5.1 40.9 14 58.6l42.3-32.8Z"/>
|
|
354
|
-
<path d="M130.6 50.5c24.5 0 41 10.6 50.4 19.4l36.9-36C195.2 12.9 165.8 0 130.6 0 79.5 0 35.4 29.3 14 71.9l42.1 32.8c10.6-31.5 39.9-54.2 74.5-54.2Z"/>
|
|
355
|
-
</svg>
|
|
356
|
-
Sign in with Google
|
|
357
|
-
</button>
|
|
358
|
-
</div>
|
|
359
|
-
|
|
360
|
-
<p class="switch">No account yet? <a href="#">Create one</a></p>
|
|
361
|
-
</div>
|
|
362
|
-
</div>
|
|
363
|
-
</section>
|
|
364
|
-
</main>
|
|
365
|
-
</body>
|
|
366
|
-
</html>
|
|
@@ -1,281 +0,0 @@
|
|
|
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
|
-
- `/useskill split-auth`
|
|
25
|
-
- `$use-style split-auth`
|
|
26
|
-
- `use split-auth`
|
|
27
|
-
- `/useskill 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.
|