create-agentic-app 1.1.57 → 1.1.58
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/package.json +1 -1
- package/template/AGENTS.md +21 -77
- package/template/DESIGN.md +451 -0
package/package.json
CHANGED
package/template/AGENTS.md
CHANGED
|
@@ -1,87 +1,31 @@
|
|
|
1
|
-
|
|
1
|
+
# CRITICAL RULES - MUST FOLLOW
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## RESPONSES
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
- Keep responses concise and to the point - unless the user asks otherwise
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## PLANNING MODE
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
- Always ask clarifying questions
|
|
10
|
+
- Never assume design, tech stack or features
|
|
11
|
+
- Use deep-dive sub-agents to assist with research
|
|
12
|
+
- Use deep-dive sub-agents to review the different aspects of your plan before presenting to the user
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
## CHANGE / EDIT MODE
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
16
|
+
- Never implement features yourself when possible - use sub-agents!
|
|
17
|
+
- Identify changes from the plan that can be implemented in parallel, and use sub-agents to implement the features efficiently
|
|
18
|
+
- When using sub-agents to implement features, act as a coordinator only
|
|
19
|
+
- Use the best model for the task - premium models for complex tasks (like coding) and mid-tier models for simpler tasks, like documentation
|
|
20
|
+
- After completing features (large or small), always run commands like lint and type check to check code quality
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
## TESTING
|
|
19
23
|
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
- A code review gate runs between waves
|
|
24
|
-
- Issues from review are dispatched back to coder agents
|
|
25
|
-
- The cycle repeats until everything passes
|
|
24
|
+
- Use any testing tools, libraries available to the project for testing your changes
|
|
25
|
+
- Never assume your changes simply work, always test!
|
|
26
|
+
- If the project does not have any testing tools, scripts, MCP tools, skills, etc. available for testing, ask the user whether testing should be skipped.
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
## UI DESIGN
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
- Any feature with 2+ tasks or files to change
|
|
32
|
-
- Any work that came out of a planning conversation
|
|
33
|
-
- Any time the user says "implement", "build", "create this feature", or similar after discussing what to build
|
|
34
|
-
|
|
35
|
-
### When does it NOT apply?
|
|
36
|
-
|
|
37
|
-
- Single-file bug fixes or trivial changes
|
|
38
|
-
- Quick config edits or one-line patches
|
|
39
|
-
- Tasks the user explicitly asks to do inline ("just fix this here")
|
|
40
|
-
|
|
41
|
-
If in doubt, ask the user: "This looks like it could benefit from a spec — should I create one, or would you prefer I implement it directly?"
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
# Project Agent Instructions
|
|
46
|
-
|
|
47
|
-
## Skills
|
|
48
|
-
|
|
49
|
-
This repo ships agent skills under `.claude/skills` (mirrored at `.agents/skills`). **Read and follow the relevant skill** when your task matches its domain—skills encode stack conventions and patterns for this project.
|
|
50
|
-
|
|
51
|
-
Use **`find-skills`** when you are unsure whether a skill exists for a task or want to discover installable skills from registries.
|
|
52
|
-
|
|
53
|
-
## Pre-flight (non-trivial tasks)
|
|
54
|
-
|
|
55
|
-
1. Map the work to skills using the routing table below.
|
|
56
|
-
2. Open and follow matching skills before writing substantial code or making architectural decisions.
|
|
57
|
-
|
|
58
|
-
If you start down the wrong path, stop, invoke the right skill, and continue from there.
|
|
59
|
-
|
|
60
|
-
## Task → skill routing
|
|
61
|
-
|
|
62
|
-
| If you are about to… | Invoke first |
|
|
63
|
-
| --- | --- |
|
|
64
|
-
| Plan a feature, create a spec, break work into tasks | `create-spec` |
|
|
65
|
-
| Implement a planned feature, execute a spec | `implement-feature` |
|
|
66
|
-
| Create a checkpoint commit | `checkpoint` |
|
|
67
|
-
| Review a pull request | `review-pr` |
|
|
68
|
-
| Touch Next.js App Router, routing, RSC, data fetching, deployment | `nextjs` |
|
|
69
|
-
| Touch shadcn/ui components or registries | `shadcn` |
|
|
70
|
-
| Touch Better Auth configuration or auth flows | `better-auth-best-practices` |
|
|
71
|
-
| Optimize or review React / Next.js performance | `vercel-react-best-practices` |
|
|
72
|
-
| Build, modify, or review an MCP server | `mcp-builder` |
|
|
73
|
-
| Build or review a frontend design / UI | `frontend-design`, `web-design-guidelines` |
|
|
74
|
-
| Automate browser testing (Playwright) | `playwright-cli` |
|
|
75
|
-
| Create or refine project agent skills | `skill-creator` |
|
|
76
|
-
| Look for a skill or extend capabilities | `find-skills` |
|
|
77
|
-
|
|
78
|
-
Stack skills compose: invoking `nextjs` does not excuse skipping `shadcn` or `better-auth-best-practices` when those layers are involved.
|
|
79
|
-
|
|
80
|
-
## Hard rules
|
|
81
|
-
|
|
82
|
-
1. **Never touch the Next.js / shadcn / Better Auth / MCP layers without reading their corresponding skill** for this repo. They are mandatory references, not optional browsing.
|
|
83
|
-
2. **Before claiming work is done, fixed, or passing**, run the project’s verification commands (see workspace rules: lint and typecheck scripts) and only assert success when the output supports it.
|
|
84
|
-
|
|
85
|
-
## If no skill matches
|
|
86
|
-
|
|
87
|
-
Fall back to sound engineering judgment. State explicitly: _"I checked the skills list and none applied because …"_ so the user can correct a missed skill.
|
|
30
|
+
- Always following the UI design system when creating or reviewing components or pages.
|
|
31
|
+
- Design System: @DESIGN.md
|
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
# Design System
|
|
2
|
+
|
|
3
|
+
This document defines the visual design system for the project. All new components and pages **must** follow these tokens, patterns, and conventions.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Stack
|
|
8
|
+
|
|
9
|
+
- **Framework:** Next.js (App Router) + React + TypeScript
|
|
10
|
+
- **Styling:** Tailwind CSS v4 (CSS-first config via `@theme inline` in `globals.css` — no `tailwind.config.ts`)
|
|
11
|
+
- **Components:** shadcn/ui (new-york style, neutral base)
|
|
12
|
+
- **Icons:** Lucide React
|
|
13
|
+
- **Fonts:** Geist (sans) + Geist Mono (mono) via `next/font/google`
|
|
14
|
+
- **Dark mode:** next-themes (class-based, system default)
|
|
15
|
+
- **Utilities:** `cn()` from `@/lib/utils` (clsx + tailwind-merge)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Colors
|
|
20
|
+
|
|
21
|
+
All values use the **oklch** color space. Colors are defined as CSS custom properties in `globals.css` and bridged to Tailwind via `@theme inline`.
|
|
22
|
+
|
|
23
|
+
### Semantic Tokens
|
|
24
|
+
|
|
25
|
+
| Token | Light | Dark | Usage |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| `background` | `oklch(1 0 0)` | `oklch(0.141 0.005 285.823)` | Page background |
|
|
28
|
+
| `foreground` | `oklch(0.141 0.005 285.823)` | `oklch(0.985 0 0)` | Primary text |
|
|
29
|
+
| `primary` | `oklch(0.21 0.034 270)` | `oklch(0.92 0.02 270)` | Buttons, links, accents |
|
|
30
|
+
| `primary-foreground` | `oklch(0.985 0 0)` | `oklch(0.21 0.006 285.885)` | Text on primary |
|
|
31
|
+
| `secondary` | `oklch(0.967 0.001 286.375)` | `oklch(0.274 0.006 286.033)` | Secondary buttons, subtle bg |
|
|
32
|
+
| `secondary-foreground` | `oklch(0.21 0.006 285.885)` | `oklch(0.985 0 0)` | Text on secondary |
|
|
33
|
+
| `muted` | `oklch(0.967 0.001 286.375)` | `oklch(0.274 0.006 286.033)` | Subdued backgrounds |
|
|
34
|
+
| `muted-foreground` | `oklch(0.552 0.016 285.938)` | `oklch(0.705 0.015 286.067)` | Subdued text, placeholders |
|
|
35
|
+
| `accent` | `oklch(0.96 0.012 270)` | `oklch(0.28 0.018 270)` | Hover backgrounds, highlights |
|
|
36
|
+
| `accent-foreground` | `oklch(0.21 0.006 285.885)` | `oklch(0.985 0 0)` | Text on accent |
|
|
37
|
+
| `destructive` | `oklch(0.577 0.245 27.325)` | `oklch(0.704 0.191 22.216)` | Error states, delete actions |
|
|
38
|
+
| `card` | `oklch(1 0 0)` | `oklch(0.21 0.006 285.885)` | Card backgrounds |
|
|
39
|
+
| `card-foreground` | `oklch(0.141 0.005 285.823)` | `oklch(0.985 0 0)` | Card text |
|
|
40
|
+
| `popover` | `oklch(1 0 0)` | `oklch(0.21 0.006 285.885)` | Popover/dropdown bg |
|
|
41
|
+
| `popover-foreground` | `oklch(0.141 0.005 285.823)` | `oklch(0.985 0 0)` | Popover/dropdown text |
|
|
42
|
+
| `border` | `oklch(0.92 0.004 286.32)` | `oklch(1 0 0 / 10%)` | Borders, dividers |
|
|
43
|
+
| `input` | `oklch(0.92 0.004 286.32)` | `oklch(1 0 0 / 15%)` | Input borders |
|
|
44
|
+
| `ring` | `oklch(0.705 0.06 270)` | `oklch(0.552 0.05 270)` | Focus rings |
|
|
45
|
+
|
|
46
|
+
### Chart Colors
|
|
47
|
+
|
|
48
|
+
| Token | Light | Dark |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `chart-1` | `oklch(0.646 0.222 41.116)` | `oklch(0.488 0.243 264.376)` |
|
|
51
|
+
| `chart-2` | `oklch(0.6 0.118 184.704)` | `oklch(0.696 0.17 162.48)` |
|
|
52
|
+
| `chart-3` | `oklch(0.398 0.07 227.392)` | `oklch(0.769 0.188 70.08)` |
|
|
53
|
+
| `chart-4` | `oklch(0.828 0.189 84.429)` | `oklch(0.627 0.265 303.9)` |
|
|
54
|
+
| `chart-5` | `oklch(0.769 0.188 70.08)` | `oklch(0.645 0.246 16.439)` |
|
|
55
|
+
|
|
56
|
+
### Sidebar Colors
|
|
57
|
+
|
|
58
|
+
| Token | Light | Dark |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| `sidebar` | `oklch(0.985 0 0)` | `oklch(0.21 0.006 285.885)` |
|
|
61
|
+
| `sidebar-foreground` | `oklch(0.141 0.005 285.823)` | `oklch(0.985 0 0)` |
|
|
62
|
+
| `sidebar-primary` | `oklch(0.21 0.006 285.885)` | `oklch(0.488 0.243 264.376)` |
|
|
63
|
+
| `sidebar-primary-foreground` | `oklch(0.985 0 0)` | `oklch(0.985 0 0)` |
|
|
64
|
+
| `sidebar-accent` | `oklch(0.967 0.001 286.375)` | `oklch(0.274 0.006 286.033)` |
|
|
65
|
+
| `sidebar-accent-foreground` | `oklch(0.21 0.006 285.885)` | `oklch(0.985 0 0)` |
|
|
66
|
+
| `sidebar-border` | `oklch(0.92 0.004 286.32)` | `oklch(1 0 0 / 10%)` |
|
|
67
|
+
| `sidebar-ring` | `oklch(0.705 0.015 286.067)` | `oklch(0.552 0.016 285.938)` |
|
|
68
|
+
|
|
69
|
+
### Ad-hoc Status Colors
|
|
70
|
+
|
|
71
|
+
Use these Tailwind utilities for status indicators — they are not part of the token system but are used consistently:
|
|
72
|
+
|
|
73
|
+
- **Success:** `text-green-600` / `dark:text-green-400`, `bg-green-500`
|
|
74
|
+
- **Error:** `text-red-600`, `text-destructive`
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Typography
|
|
79
|
+
|
|
80
|
+
### Font Families
|
|
81
|
+
|
|
82
|
+
| Token | Font | Usage |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| `--font-geist-sans` | Geist | All UI text (applied to body) |
|
|
85
|
+
| `--font-geist-mono` | Geist Mono | Code, monospace content |
|
|
86
|
+
|
|
87
|
+
Body has `font-feature-settings: "rlig" 1, "calt" 1` and `antialiased` enabled.
|
|
88
|
+
|
|
89
|
+
### Type Scale
|
|
90
|
+
|
|
91
|
+
| Class | Size | Usage |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| `text-xs` | 12px | Timestamps, shortcuts, helper text, code |
|
|
94
|
+
| `text-sm` | 14px | Descriptions, labels, body copy, card descriptions |
|
|
95
|
+
| `text-base` | 16px | Base text, inputs (mobile) |
|
|
96
|
+
| `text-lg` | 18px | Dialog titles, sub-headings |
|
|
97
|
+
| `text-xl` | 20px | Section titles, header logo |
|
|
98
|
+
| `text-2xl` | 24px | Page titles, card titles |
|
|
99
|
+
| `text-3xl` | 30px | Dashboard/profile headings |
|
|
100
|
+
| `text-4xl` | 36px | Large display text |
|
|
101
|
+
| `text-5xl` | 48px | Hero title |
|
|
102
|
+
|
|
103
|
+
### Font Weights
|
|
104
|
+
|
|
105
|
+
| Class | Weight | Usage |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| `font-medium` | 500 | Buttons, labels, nav items |
|
|
108
|
+
| `font-semibold` | 600 | Card titles, section headings, badges, dialog titles |
|
|
109
|
+
| `font-bold` | 700 | Page titles, hero heading |
|
|
110
|
+
|
|
111
|
+
### Line Heights & Tracking
|
|
112
|
+
|
|
113
|
+
| Class | Usage |
|
|
114
|
+
|---|---|
|
|
115
|
+
| `leading-none` | Labels, card titles |
|
|
116
|
+
| `leading-5` | Code blocks |
|
|
117
|
+
| `leading-6` | List items |
|
|
118
|
+
| `leading-7` | Paragraphs (markdown) |
|
|
119
|
+
| `tracking-tight` | Hero/display text |
|
|
120
|
+
| `tracking-widest` | Keyboard shortcuts |
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Spacing
|
|
125
|
+
|
|
126
|
+
### Container Pattern
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
container mx-auto px-4
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Responsive overrides where needed:
|
|
133
|
+
- Header: `px-3 sm:px-4`
|
|
134
|
+
- Footer: `px-4 sm:px-6 lg:px-8`
|
|
135
|
+
|
|
136
|
+
### Max Widths
|
|
137
|
+
|
|
138
|
+
| Class | Value | Usage |
|
|
139
|
+
|---|---|---|
|
|
140
|
+
| `max-w-sm` | 24rem | Auth forms |
|
|
141
|
+
| `max-w-md` | 28rem | Login/register cards, error pages |
|
|
142
|
+
| `max-w-lg` | 32rem | Dialog content (sm+) |
|
|
143
|
+
| `max-w-2xl` | 42rem | Large dialogs |
|
|
144
|
+
| `max-w-3xl` | 48rem | Embeds, protected state |
|
|
145
|
+
| `max-w-4xl` | 56rem | Main content pages |
|
|
146
|
+
|
|
147
|
+
### Vertical Spacing (space-y)
|
|
148
|
+
|
|
149
|
+
| Class | Usage |
|
|
150
|
+
|---|---|
|
|
151
|
+
| `space-y-1` | Tight lists, inline stacks |
|
|
152
|
+
| `space-y-1.5` | Card header |
|
|
153
|
+
| `space-y-2` | Form field groups, small stacks |
|
|
154
|
+
| `space-y-3` | Footer stacks |
|
|
155
|
+
| `space-y-4` | Form sections, dialog content |
|
|
156
|
+
| `space-y-6` | Card content sections |
|
|
157
|
+
| `space-y-8` | Page-level sections |
|
|
158
|
+
|
|
159
|
+
### Padding
|
|
160
|
+
|
|
161
|
+
| Class | Usage |
|
|
162
|
+
|---|---|
|
|
163
|
+
| `p-1` | Dropdown content, icon buttons |
|
|
164
|
+
| `p-2` | Code blocks, muted backgrounds |
|
|
165
|
+
| `p-3` | Chat bubbles, inputs |
|
|
166
|
+
| `p-4` | Grid items, action buttons, list items |
|
|
167
|
+
| `p-6` | Cards, dialog content |
|
|
168
|
+
|
|
169
|
+
### Page Vertical Padding
|
|
170
|
+
|
|
171
|
+
| Class | Usage |
|
|
172
|
+
|---|---|
|
|
173
|
+
| `py-3 sm:py-4` | Header |
|
|
174
|
+
| `py-4 sm:py-6` | Footer |
|
|
175
|
+
| `py-8` | Standard content pages |
|
|
176
|
+
| `py-12` | Home page, dashboard |
|
|
177
|
+
| `py-16` | Error/not-found pages |
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Border Radius
|
|
182
|
+
|
|
183
|
+
| Token | Value | Class |
|
|
184
|
+
|---|---|---|
|
|
185
|
+
| `--radius` | `0.625rem` (10px) | Base |
|
|
186
|
+
| `--radius-sm` | `calc(--radius - 4px)` = 6px | `rounded-sm` |
|
|
187
|
+
| `--radius-md` | `calc(--radius - 2px)` = 8px | `rounded-md` |
|
|
188
|
+
| `--radius-lg` | `var(--radius)` = 10px | `rounded-lg` |
|
|
189
|
+
| `--radius-xl` | `calc(--radius + 4px)` = 14px | `rounded-xl` |
|
|
190
|
+
| — | 9999px | `rounded-full` |
|
|
191
|
+
|
|
192
|
+
**Usage:**
|
|
193
|
+
- `rounded-md` — Buttons, inputs, textarea, code blocks, dropdowns
|
|
194
|
+
- `rounded-lg` — Cards, dialogs, feature cards, chat bubbles
|
|
195
|
+
- `rounded-xl` — Hero logo container
|
|
196
|
+
- `rounded-full` — Badges, avatars
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Shadows
|
|
201
|
+
|
|
202
|
+
| Class | Usage |
|
|
203
|
+
|---|---|
|
|
204
|
+
| `shadow-xs` | Inputs, textarea, secondary/outline buttons |
|
|
205
|
+
| `shadow-sm` | Card base |
|
|
206
|
+
| `shadow-md` | Card hover, dropdown content |
|
|
207
|
+
| `shadow-lg` | Dialogs, dropdown sub-content |
|
|
208
|
+
|
|
209
|
+
No custom shadow definitions — all Tailwind defaults.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Animations
|
|
214
|
+
|
|
215
|
+
### Custom Keyframes
|
|
216
|
+
|
|
217
|
+
| Name | Effect | Duration | Easing |
|
|
218
|
+
|---|---|---|---|
|
|
219
|
+
| `fade-in` | Opacity 0 → 1 | 0.3s | ease-out |
|
|
220
|
+
| `fade-up` | Opacity 0 → 1 + translateY(8px → 0) | 0.4s | ease-out |
|
|
221
|
+
| `scale-in` | Opacity 0 → 1 + scale(0.97 → 1) | 0.2s | ease-out |
|
|
222
|
+
|
|
223
|
+
Use via: `animate-fade-in`, `animate-fade-up`, `animate-scale-in`
|
|
224
|
+
|
|
225
|
+
### tw-animate-css Animations
|
|
226
|
+
|
|
227
|
+
Used on dialogs and dropdowns:
|
|
228
|
+
- `animate-in` / `animate-out`
|
|
229
|
+
- `fade-in-0` / `fade-out-0`
|
|
230
|
+
- `zoom-in-95` / `zoom-out-95`
|
|
231
|
+
- `slide-in-from-{top|bottom|left|right}-2`
|
|
232
|
+
|
|
233
|
+
### Transition Classes
|
|
234
|
+
|
|
235
|
+
| Class | Usage |
|
|
236
|
+
|---|---|
|
|
237
|
+
| `transition-colors` | Links, hover color changes |
|
|
238
|
+
| `transition-opacity` | Avatar hover, reveal-on-hover |
|
|
239
|
+
| `transition-all duration-200` | Card interactive hover, buttons |
|
|
240
|
+
| `transition-[color,box-shadow]` | Input/textarea focus |
|
|
241
|
+
|
|
242
|
+
### Utility Classes
|
|
243
|
+
|
|
244
|
+
```css
|
|
245
|
+
.card-interactive {
|
|
246
|
+
@apply transition-all duration-200 ease-out;
|
|
247
|
+
}
|
|
248
|
+
.card-interactive:hover {
|
|
249
|
+
@apply shadow-md -translate-y-0.5;
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
```css
|
|
254
|
+
.auth-bg {
|
|
255
|
+
background-image: radial-gradient(
|
|
256
|
+
circle at 50% 0%,
|
|
257
|
+
var(--accent) 0%,
|
|
258
|
+
transparent 50%
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Layout
|
|
266
|
+
|
|
267
|
+
### Root Structure
|
|
268
|
+
|
|
269
|
+
```
|
|
270
|
+
<body class="antialiased min-h-screen flex flex-col">
|
|
271
|
+
<SiteHeader />
|
|
272
|
+
<main id="main-content" class="flex-1">{children}</main>
|
|
273
|
+
<SiteFooter />
|
|
274
|
+
<Toaster />
|
|
275
|
+
</body>
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Page Layout Patterns
|
|
279
|
+
|
|
280
|
+
**Auth pages:**
|
|
281
|
+
```
|
|
282
|
+
flex min-h-[calc(100vh-4rem)] items-center justify-center p-4
|
|
283
|
+
→ Card w-full max-w-md
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**Standard content pages:**
|
|
287
|
+
```
|
|
288
|
+
container mx-auto px-4 py-8
|
|
289
|
+
→ max-w-4xl mx-auto
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**Error/not-found pages:**
|
|
293
|
+
```
|
|
294
|
+
container mx-auto px-4 py-16
|
|
295
|
+
→ max-w-md mx-auto text-center
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Grid Patterns
|
|
299
|
+
|
|
300
|
+
| Pattern | Usage |
|
|
301
|
+
|---|---|
|
|
302
|
+
| `grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6` | Feature cards (4-col) |
|
|
303
|
+
| `grid grid-cols-1 md:grid-cols-2 gap-6` | Dashboard cards |
|
|
304
|
+
| `grid grid-cols-1 md:grid-cols-2 gap-4` | Profile info |
|
|
305
|
+
| `grid grid-cols-1 md:grid-cols-3 gap-4` | Quick actions |
|
|
306
|
+
|
|
307
|
+
### Responsive Breakpoints
|
|
308
|
+
|
|
309
|
+
Standard Tailwind breakpoints:
|
|
310
|
+
- `sm:` (640px) — Padding adjustments, text alignment, button sizing
|
|
311
|
+
- `md:` (768px) — Grid column changes (→ 2 col), input font size
|
|
312
|
+
- `lg:` (1024px) — Grid column changes (→ 4 col), wide padding
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## Icons
|
|
317
|
+
|
|
318
|
+
**Library:** Lucide React
|
|
319
|
+
|
|
320
|
+
### Sizing Convention
|
|
321
|
+
|
|
322
|
+
| Size | Classes | Usage |
|
|
323
|
+
|---|---|---|
|
|
324
|
+
| XS | `h-3 w-3` | Inline badge icons |
|
|
325
|
+
| SM | `h-3.5 w-3.5` | Copy buttons |
|
|
326
|
+
| Default | `h-4 w-4` or `size-4` | Standard UI icons |
|
|
327
|
+
| MD | `h-5 w-5` | Header logo icon |
|
|
328
|
+
| LG | `h-7 w-7` | Hero logo icon |
|
|
329
|
+
| XL | `h-16 w-16` | Error/empty state illustrations |
|
|
330
|
+
|
|
331
|
+
### Commonly Used Icons
|
|
332
|
+
|
|
333
|
+
`Bot`, `User`, `Lock`, `Shield`, `Mail`, `Calendar`, `Copy`, `Check`, `Loader2`, `LogOut`, `Sun`, `Moon`, `Github`, `ArrowLeft`, `RefreshCw`, `AlertCircle`, `FileQuestion`, `Database`, `Palette`, `Video`
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Components (shadcn/ui)
|
|
338
|
+
|
|
339
|
+
All components live in `src/components/ui/`. They use `data-slot` attributes, accept `className` for overrides via `cn()`, and follow either `React.forwardRef` or functional component patterns.
|
|
340
|
+
|
|
341
|
+
### Button
|
|
342
|
+
|
|
343
|
+
6 variants, 4 sizes (CVA-based):
|
|
344
|
+
|
|
345
|
+
| Variant | Usage |
|
|
346
|
+
|---|---|
|
|
347
|
+
| `default` | Primary actions |
|
|
348
|
+
| `secondary` | Secondary actions |
|
|
349
|
+
| `outline` | Tertiary actions |
|
|
350
|
+
| `ghost` | Subtle/icon actions |
|
|
351
|
+
| `destructive` | Delete/danger actions |
|
|
352
|
+
| `link` | Inline text links |
|
|
353
|
+
|
|
354
|
+
| Size | Height | Padding |
|
|
355
|
+
|---|---|---|
|
|
356
|
+
| `sm` | h-8 | px-3 |
|
|
357
|
+
| `default` | h-9 | px-4 |
|
|
358
|
+
| `lg` | h-10 | px-6 |
|
|
359
|
+
| `icon` | size-9 | — |
|
|
360
|
+
|
|
361
|
+
### Card
|
|
362
|
+
|
|
363
|
+
6 sub-components: `Card`, `CardHeader`, `CardTitle`, `CardDescription`, `CardContent`, `CardFooter`
|
|
364
|
+
|
|
365
|
+
Base: `rounded-lg border bg-card text-card-foreground shadow-sm`
|
|
366
|
+
|
|
367
|
+
### Input / Textarea
|
|
368
|
+
|
|
369
|
+
- Height: `h-9` (input), `min-h-16` (textarea)
|
|
370
|
+
- Border: `border bg-transparent rounded-md shadow-xs`
|
|
371
|
+
- Focus: `focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]`
|
|
372
|
+
- Validation: `aria-invalid:border-destructive aria-invalid:ring-destructive/20`
|
|
373
|
+
- Responsive font: `text-base md:text-sm`
|
|
374
|
+
|
|
375
|
+
### Badge
|
|
376
|
+
|
|
377
|
+
4 variants: `default`, `secondary`, `destructive`, `outline`
|
|
378
|
+
|
|
379
|
+
Base: `rounded-full border px-2.5 py-0.5 text-xs font-semibold`
|
|
380
|
+
|
|
381
|
+
### Dialog
|
|
382
|
+
|
|
383
|
+
Radix-based with overlay (`bg-black/50`), fade + zoom animations, optional close button.
|
|
384
|
+
|
|
385
|
+
### DropdownMenu
|
|
386
|
+
|
|
387
|
+
Radix-based. Content: `rounded-md border p-1 shadow-md min-w-[8rem]`. Items support a `destructive` variant.
|
|
388
|
+
|
|
389
|
+
### Spinner
|
|
390
|
+
|
|
391
|
+
Sizes: `sm` (h-4 w-4), `md` (h-6 w-6), `lg` (h-8 w-8). Uses `Loader2` with `animate-spin`.
|
|
392
|
+
|
|
393
|
+
### Toast (Sonner)
|
|
394
|
+
|
|
395
|
+
Custom icons per state (success, info, warning, error, loading). Themed via CSS variable overrides.
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## Focus & Interaction States
|
|
400
|
+
|
|
401
|
+
### Focus Ring (Global)
|
|
402
|
+
|
|
403
|
+
```css
|
|
404
|
+
outline-2 outline-offset-2 outline-ring/70
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
Component-level override:
|
|
408
|
+
```
|
|
409
|
+
focus-visible:ring-ring/50 focus-visible:ring-[3px]
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### Disabled
|
|
413
|
+
|
|
414
|
+
```
|
|
415
|
+
disabled:pointer-events-none disabled:opacity-50
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### Interactive Card Hover
|
|
419
|
+
|
|
420
|
+
```
|
|
421
|
+
transition-all duration-200 ease-out
|
|
422
|
+
hover:shadow-md hover:-translate-y-0.5
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## Dark Mode
|
|
428
|
+
|
|
429
|
+
- **Method:** Class-based via `next-themes` with `attribute="class"` and `disableTransitionOnChange`
|
|
430
|
+
- **Default:** System preference
|
|
431
|
+
- **Toggle:** 3-way dropdown — Light / Dark / System
|
|
432
|
+
- All semantic color tokens swap automatically via `.dark` CSS selector
|
|
433
|
+
- Use `dark:` prefix for component-specific overrides (e.g., `dark:bg-input/30`)
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## Branding
|
|
438
|
+
|
|
439
|
+
### Logo Text
|
|
440
|
+
|
|
441
|
+
```
|
|
442
|
+
bg-gradient-to-r from-primary to-primary/70 bg-clip-text text-transparent
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Logo Icon Container
|
|
446
|
+
|
|
447
|
+
```
|
|
448
|
+
w-8 h-8 rounded-lg bg-primary/10 flex items-center justify-center
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
Hero variant: `w-12 h-12 rounded-xl`
|