gspec 1.7.0 → 1.10.0

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.
Files changed (72) hide show
  1. package/bin/gspec.js +275 -8
  2. package/commands/gspec.analyze.md +1 -1
  3. package/commands/gspec.implement.md +3 -3
  4. package/commands/gspec.practices.md +3 -1
  5. package/commands/gspec.stack.md +11 -6
  6. package/commands/gspec.style.md +18 -23
  7. package/dist/antigravity/gspec-analyze/SKILL.md +1 -1
  8. package/dist/antigravity/gspec-architect/SKILL.md +1 -1
  9. package/dist/antigravity/gspec-feature/SKILL.md +1 -1
  10. package/dist/antigravity/gspec-implement/SKILL.md +4 -4
  11. package/dist/antigravity/gspec-migrate/SKILL.md +5 -5
  12. package/dist/antigravity/gspec-practices/SKILL.md +4 -2
  13. package/dist/antigravity/gspec-profile/SKILL.md +1 -1
  14. package/dist/antigravity/gspec-research/SKILL.md +3 -3
  15. package/dist/antigravity/gspec-stack/SKILL.md +12 -7
  16. package/dist/antigravity/gspec-style/SKILL.md +19 -24
  17. package/dist/claude/gspec-analyze/SKILL.md +1 -1
  18. package/dist/claude/gspec-architect/SKILL.md +1 -1
  19. package/dist/claude/gspec-feature/SKILL.md +1 -1
  20. package/dist/claude/gspec-implement/SKILL.md +4 -4
  21. package/dist/claude/gspec-migrate/SKILL.md +5 -5
  22. package/dist/claude/gspec-practices/SKILL.md +4 -2
  23. package/dist/claude/gspec-profile/SKILL.md +1 -1
  24. package/dist/claude/gspec-research/SKILL.md +3 -3
  25. package/dist/claude/gspec-stack/SKILL.md +12 -7
  26. package/dist/claude/gspec-style/SKILL.md +19 -24
  27. package/dist/codex/gspec-analyze/SKILL.md +1 -1
  28. package/dist/codex/gspec-architect/SKILL.md +1 -1
  29. package/dist/codex/gspec-feature/SKILL.md +1 -1
  30. package/dist/codex/gspec-implement/SKILL.md +4 -4
  31. package/dist/codex/gspec-migrate/SKILL.md +5 -5
  32. package/dist/codex/gspec-practices/SKILL.md +4 -2
  33. package/dist/codex/gspec-profile/SKILL.md +1 -1
  34. package/dist/codex/gspec-research/SKILL.md +3 -3
  35. package/dist/codex/gspec-stack/SKILL.md +12 -7
  36. package/dist/codex/gspec-style/SKILL.md +19 -24
  37. package/dist/cursor/gspec-analyze.mdc +1 -1
  38. package/dist/cursor/gspec-architect.mdc +1 -1
  39. package/dist/cursor/gspec-feature.mdc +1 -1
  40. package/dist/cursor/gspec-implement.mdc +4 -4
  41. package/dist/cursor/gspec-migrate.mdc +5 -5
  42. package/dist/cursor/gspec-practices.mdc +4 -2
  43. package/dist/cursor/gspec-profile.mdc +1 -1
  44. package/dist/cursor/gspec-research.mdc +3 -3
  45. package/dist/cursor/gspec-stack.mdc +12 -7
  46. package/dist/cursor/gspec-style.mdc +19 -24
  47. package/dist/opencode/gspec-analyze/SKILL.md +168 -0
  48. package/dist/opencode/gspec-architect/SKILL.md +361 -0
  49. package/dist/opencode/gspec-feature/SKILL.md +204 -0
  50. package/dist/opencode/gspec-implement/SKILL.md +200 -0
  51. package/dist/opencode/gspec-migrate/SKILL.md +118 -0
  52. package/dist/opencode/gspec-practices/SKILL.md +137 -0
  53. package/dist/opencode/gspec-profile/SKILL.md +221 -0
  54. package/dist/opencode/gspec-research/SKILL.md +302 -0
  55. package/dist/opencode/gspec-stack/SKILL.md +305 -0
  56. package/dist/opencode/gspec-style/SKILL.md +224 -0
  57. package/package.json +3 -1
  58. package/starters/features/about-page.md +98 -0
  59. package/starters/features/contact-form.md +147 -0
  60. package/starters/features/contact-page.md +103 -0
  61. package/starters/features/home-page.md +103 -0
  62. package/starters/features/responsive-navbar.md +113 -0
  63. package/starters/features/services-page.md +103 -0
  64. package/starters/features/site-footer.md +121 -0
  65. package/starters/features/theme-switcher.md +124 -0
  66. package/starters/practices/tdd-pipeline-first.md +192 -0
  67. package/starters/stacks/astro-tailwind-github-pages.md +283 -0
  68. package/starters/stacks/nextjs-supabase-vercel.md +319 -0
  69. package/starters/stacks/nextjs-vercel-typescript.md +264 -0
  70. package/starters/styles/clean-professional.md +316 -0
  71. package/starters/styles/dark-minimal-developer.md +442 -0
  72. package/templates/spec-sync.md +1 -1
@@ -0,0 +1,442 @@
1
+ ---
2
+ gspec-version: 1.8.0
3
+ description: Dark-first minimal design system with purple accent, inspired by developer documentation sites
4
+ ---
5
+
6
+ # Visual Style Guide
7
+
8
+ ## 1. Overview
9
+
10
+ ### Design Vision Statement
11
+
12
+ A clean, minimal design system that feels like well-written documentation — spacious, readable, and quietly confident. The aesthetic communicates technical credibility without being cold, using generous whitespace, clear typographic hierarchy, and a single vibrant accent color against a neutral dark canvas.
13
+
14
+ ### Target Platforms
15
+
16
+ - **Web** — Primary. Responsive web application.
17
+ - **Mobile web** — Fully responsive. No native mobile app.
18
+
19
+ ### Visual Personality
20
+
21
+ **Clean & Minimal** — Generous whitespace, restrained color usage, strong typography. The design gets out of the way and lets content speak. Inspired by the best developer documentation sites (Stripe, Tailwind, Astro docs) where clarity is the primary design value.
22
+
23
+ ### Design Rationale
24
+
25
+ Developer tools earn trust through clarity, not decoration. The target audience values scannability, readability, and speed. A minimal aesthetic with a single vibrant accent creates visual interest without visual noise. Dark-first design matches the environment developers already work in (editors, terminals).
26
+
27
+ ---
28
+
29
+ ## 2. Color Palette
30
+
31
+ ### Primary Colors
32
+
33
+ | Token | Hex | RGB | HSL | Usage |
34
+ |-------|-----|-----|-----|-------|
35
+ | `primary-500` | `#8B5CF6` | `139, 92, 246` | `263, 90%, 66%` | Primary accent — CTAs, links, active states, key UI elements |
36
+ | `primary-400` | `#A78BFA` | `167, 139, 250` | `255, 92%, 76%` | Hover states, secondary emphasis |
37
+ | `primary-600` | `#7C3AED` | `124, 58, 237` | `262, 83%, 58%` | Pressed/active states |
38
+ | `primary-300` | `#C4B5FD` | `196, 181, 253` | `252, 95%, 85%` | Light accent text on dark backgrounds |
39
+ | `primary-900` | `#1E1338` | `30, 19, 56` | `258, 49%, 15%` | Tinted dark backgrounds, subtle accent surfaces |
40
+
41
+ **Selection rationale:** Purple sits outside the typical blue/green palette of most dev tools, giving the brand a distinctive presence. It carries connotations of creativity and precision without the corporate weight of blue. The violet hue has excellent contrast against both dark and light neutrals.
42
+
43
+ ### Secondary Colors
44
+
45
+ | Token | Hex | RGB | HSL | Usage |
46
+ |-------|-----|-----|-----|-------|
47
+ | `secondary-500` | `#06B6D4` | `6, 182, 212` | `189, 94%, 43%` | Code highlights, secondary actions, complementary accent |
48
+ | `secondary-400` | `#22D3EE` | `34, 211, 238` | `188, 85%, 53%` | Hover states for secondary elements |
49
+ | `secondary-600` | `#0891B2` | `8, 145, 178` | `192, 91%, 36%` | Pressed states for secondary elements |
50
+
51
+ **Usage:** The cyan secondary complements the purple primary (split-complementary relationship). Use sparingly for code syntax highlighting, badges, or secondary interactive elements. Never compete with the primary accent for attention.
52
+
53
+ ### Neutral Colors
54
+
55
+ | Token | Hex | RGB | HSL | Usage |
56
+ |-------|-----|-----|-----|-------|
57
+ | `neutral-950` | `#0A0A0F` | `10, 10, 15` | `240, 20%, 5%` | Page background (dark mode) |
58
+ | `neutral-900` | `#131318` | `19, 19, 24` | `240, 12%, 8%` | Elevated surface background |
59
+ | `neutral-800` | `#1E1E26` | `30, 30, 38` | `240, 12%, 13%` | Card backgrounds, code blocks |
60
+ | `neutral-700` | `#2E2E3A` | `46, 46, 58` | `240, 12%, 20%` | Borders, dividers |
61
+ | `neutral-600` | `#4A4A5A` | `74, 74, 90` | `240, 10%, 32%` | Subtle borders, disabled elements |
62
+ | `neutral-500` | `#6B6B80` | `107, 107, 128` | `240, 9%, 46%` | Placeholder text, muted icons |
63
+ | `neutral-400` | `#9494A8` | `148, 148, 168` | `240, 10%, 62%` | Secondary text |
64
+ | `neutral-300` | `#B8B8CC` | `184, 184, 204` | `240, 18%, 76%` | Tertiary text, captions |
65
+ | `neutral-200` | `#D4D4E0` | `212, 212, 224` | `240, 20%, 85%` | Body text (dark mode) |
66
+ | `neutral-100` | `#EDEDF4` | `237, 237, 244` | `240, 33%, 94%` | Headings, primary text (dark mode) |
67
+ | `neutral-50` | `#F8F8FC` | `248, 248, 252` | `240, 50%, 98%` | Emphasis text, high contrast |
68
+
69
+ **Note:** Neutrals carry a subtle cool-violet undertone (240° hue) to harmonize with the purple primary. Pure grays would feel disconnected.
70
+
71
+ ### Semantic Colors
72
+
73
+ | Token | Hex | Contrast on `neutral-900` | Usage |
74
+ |-------|-----|---------------------------|-------|
75
+ | `success` | `#34D399` | 8.2:1 ✓ AA | Success states, confirmations, valid inputs |
76
+ | `warning` | `#FBBF24` | 10.4:1 ✓ AA | Warnings, caution states |
77
+ | `error` | `#F87171` | 5.8:1 ✓ AA | Errors, destructive actions, invalid inputs |
78
+ | `info` | `#60A5FA` | 5.5:1 ✓ AA | Informational messages, tips, notes |
79
+
80
+ Each semantic color has a muted background variant at 10% opacity for banner/alert backgrounds (e.g., `success-bg: #34D3991A`).
81
+
82
+ ---
83
+
84
+ ## 3. Typography
85
+
86
+ ### Font Families
87
+
88
+ | Role | Font | Fallback Stack | Source |
89
+ |------|------|---------------|--------|
90
+ | **Headings** | Inter | `system-ui, -apple-system, sans-serif` | Google Fonts |
91
+ | **Body** | Inter | `system-ui, -apple-system, sans-serif` | Google Fonts |
92
+ | **Monospace** | JetBrains Mono | `ui-monospace, 'Cascadia Code', 'Fira Code', monospace` | Google Fonts |
93
+
94
+ **Why Inter:** Designed for screens, excellent readability at all sizes, wide weight range, slightly technical feel without being cold. Free and widely available.
95
+
96
+ **Why JetBrains Mono:** Purpose-built for code, excellent ligature support, pairs well with Inter. Developers recognize and trust it.
97
+
98
+ ### Type Scale
99
+
100
+ Base size: `16px` (1rem). Scale ratio: 1.25 (Major Third).
101
+
102
+ | Level | Size (rem) | Size (px) | Weight | Line Height | Letter Spacing | Usage |
103
+ |-------|-----------|-----------|--------|-------------|----------------|-------|
104
+ | **Display** | 3.5rem | 56px | 700 | 1.1 | -0.02em | Hero headlines |
105
+ | **H1** | 2.441rem | 39px | 700 | 1.2 | -0.02em | Page titles |
106
+ | **H2** | 1.953rem | 31px | 600 | 1.25 | -0.01em | Section headings |
107
+ | **H3** | 1.563rem | 25px | 600 | 1.3 | -0.01em | Subsection headings |
108
+ | **H4** | 1.25rem | 20px | 600 | 1.4 | 0 | Card titles, minor headings |
109
+ | **H5** | 1rem | 16px | 600 | 1.5 | 0.01em | Labels, overlines |
110
+ | **H6** | 0.875rem | 14px | 600 | 1.5 | 0.02em | Small labels, uppercase overlines |
111
+ | **Body Large** | 1.125rem | 18px | 400 | 1.7 | 0 | Lead paragraphs, feature descriptions |
112
+ | **Body** | 1rem | 16px | 400 | 1.7 | 0 | Default body text |
113
+ | **Body Small** | 0.875rem | 14px | 400 | 1.6 | 0 | Captions, helper text, metadata |
114
+ | **Code** | 0.875rem | 14px | 400 | 1.6 | 0 | Inline and block code |
115
+
116
+ ### Responsive Scaling
117
+
118
+ - **Mobile (< 640px):** Display drops to 2.5rem, H1 to 1.953rem. Body remains 1rem.
119
+ - **Tablet (640–1024px):** Display at 3rem, H1 at 2.2rem.
120
+ - **Desktop (≥ 1024px):** Full scale as defined above.
121
+
122
+ ---
123
+
124
+ ## 4. Spacing & Layout
125
+
126
+ ### Spacing Scale
127
+
128
+ Base unit: **4px**. All spacing values are multiples of 4.
129
+
130
+ | Token | Value | Usage |
131
+ |-------|-------|-------|
132
+ | `space-0` | 0px | Reset |
133
+ | `space-1` | 4px | Tight inline spacing (icon-text gap) |
134
+ | `space-2` | 8px | Small gaps, compact padding |
135
+ | `space-3` | 12px | Default inline spacing |
136
+ | `space-4` | 16px | Default component padding |
137
+ | `space-5` | 20px | Medium spacing |
138
+ | `space-6` | 24px | Section internal spacing |
139
+ | `space-8` | 32px | Component gaps, card padding |
140
+ | `space-10` | 40px | Section gaps |
141
+ | `space-12` | 48px | Large section spacing |
142
+ | `space-16` | 64px | Page section separators |
143
+ | `space-20` | 80px | Major page sections |
144
+ | `space-24` | 96px | Hero sections, large vertical rhythm |
145
+
146
+ ### Grid System
147
+
148
+ | Breakpoint | Columns | Gutter | Container Max-Width |
149
+ |------------|---------|--------|---------------------|
150
+ | Mobile (< 640px) | 4 | 16px | 100% (16px side padding) |
151
+ | Tablet (640–1024px) | 8 | 24px | 768px |
152
+ | Desktop (1024–1280px) | 12 | 24px | 1024px |
153
+ | Wide (≥ 1280px) | 12 | 32px | 1152px |
154
+
155
+ ### Layout Patterns
156
+
157
+ - **Content width:** Prose content maxes out at `65ch` (~680px) for optimal readability.
158
+ - **Component spacing:** Adjacent components within a section use `space-8` (32px) gaps.
159
+ - **Section spacing:** Between major page sections use `space-16` (64px) on mobile, `space-24` (96px) on desktop.
160
+ - **Consistent padding:** All cards and containers use `space-6` (24px) padding on mobile, `space-8` (32px) on desktop.
161
+
162
+ ---
163
+
164
+ ## 5. Themes
165
+
166
+ ### Dark Mode (Primary)
167
+
168
+ | Token | Color | Usage |
169
+ |-------|-------|-------|
170
+ | `bg-page` | `neutral-950` (#0A0A0F) | Page background |
171
+ | `bg-surface` | `neutral-900` (#131318) | Cards, elevated surfaces |
172
+ | `bg-surface-raised` | `neutral-800` (#1E1E26) | Code blocks, nested surfaces |
173
+ | `bg-overlay` | `neutral-950` at 80% opacity | Modal/drawer overlays |
174
+ | `text-primary` | `neutral-100` (#EDEDF4) | Headings, emphasis text |
175
+ | `text-body` | `neutral-200` (#D4D4E0) | Default body text |
176
+ | `text-secondary` | `neutral-400` (#9494A8) | Secondary text, captions |
177
+ | `text-muted` | `neutral-500` (#6B6B80) | Placeholders, disabled text |
178
+ | `border-default` | `neutral-700` (#2E2E3A) | Default borders |
179
+ | `border-subtle` | `neutral-800` (#1E1E26) | Subtle dividers |
180
+
181
+ ### Light Mode (Secondary)
182
+
183
+ | Token | Color | Usage |
184
+ |-------|-------|-------|
185
+ | `bg-page` | `neutral-50` (#F8F8FC) | Page background |
186
+ | `bg-surface` | `#FFFFFF` | Cards, elevated surfaces |
187
+ | `bg-surface-raised` | `neutral-100` (#EDEDF4) | Code blocks, nested surfaces |
188
+ | `bg-overlay` | `neutral-950` at 50% opacity | Modal/drawer overlays |
189
+ | `text-primary` | `neutral-950` (#0A0A0F) | Headings, emphasis text |
190
+ | `text-body` | `neutral-800` (#1E1E26) | Default body text |
191
+ | `text-secondary` | `neutral-600` (#4A4A5A) | Secondary text, captions |
192
+ | `text-muted` | `neutral-500` (#6B6B80) | Placeholders, disabled text |
193
+ | `border-default` | `neutral-300` (#B8B8CC) | Default borders |
194
+ | `border-subtle` | `neutral-200` (#D4D4E0) | Subtle dividers |
195
+
196
+ ### Theme Token Mapping
197
+
198
+ - All theme values are expressed as CSS custom properties so light and dark palettes share the same token names.
199
+ - Dark mode is the primary theme. Light mode is provided as an alternative.
200
+ - Primary accent (`primary-500`) works in both themes without adjustment.
201
+ - Semantic colors remain constant across themes — their background variants adjust opacity (10% on dark, 8% on light).
202
+
203
+ ---
204
+
205
+ ## 6. Component Styling
206
+
207
+ > **This section defines visual styling only** — colors, borders, typography, and spacing for common UI elements. Component structure, behavior, and layout patterns are defined in feature PRDs.
208
+
209
+ ### Buttons
210
+
211
+ - **Primary**: Background `primary-500`, text white, border-radius 8px, font weight 500.
212
+ - **Primary Hover**: Background `primary-400`.
213
+ - **Primary Active**: Background `primary-600`.
214
+ - **Secondary**: Background transparent, border 1px `neutral-700` (dark) / `neutral-300` (light), text `neutral-100` (dark) / `neutral-800` (light).
215
+ - **Secondary Hover**: Background `neutral-800` (dark) / `neutral-100` (light), border `neutral-600`.
216
+ - **Ghost**: Background transparent, no border, text `primary-500`. Hover: `primary-900` background.
217
+ - **Disabled**: 40% opacity, `cursor: not-allowed`.
218
+ - **Focus**: 2px `primary-400` outline with 2px offset.
219
+ - **Sizes**: Small (32px height, 14px text), Default (40px height, 16px text), Large (48px height, 18px text). Minimum touch target 44x44px.
220
+
221
+ ### Form Elements
222
+
223
+ - **Input Background**: `neutral-900` (dark) / `#FFFFFF` (light).
224
+ - **Input Border**: 1px solid `neutral-700` (dark) / `neutral-300` (light), border-radius 8px.
225
+ - **Input Text**: `neutral-100` (dark) / `neutral-900` (light). Placeholder: `neutral-500`.
226
+ - **Focus**: Border `primary-500`, 2px ring in `primary-500` at 25% opacity.
227
+ - **Error**: Border `error` (#F87171), helper text in `error`.
228
+ - **Disabled**: 50% opacity, `neutral-800` background.
229
+ - **Labels**: Body Small (0.875rem), weight 500, `neutral-200` (dark) / `neutral-700` (light).
230
+ - **Helper Text**: Body Small (0.875rem), weight 400, `neutral-400` default.
231
+ - **Checkboxes/Radios**: 18px, 2px border `neutral-600`. Checked: `primary-500` fill, white mark. Radius: 4px (checkbox), 50% (radio).
232
+
233
+ ### Cards & Containers
234
+
235
+ - **Background**: `bg-surface` (`neutral-900` dark / `#FFFFFF` light).
236
+ - **Border**: 1px solid `border-default`.
237
+ - **Border-radius**: 12px.
238
+ - **Padding**: `space-6` (24px) mobile, `space-8` (32px) desktop.
239
+ - **Shadow**: None by default in dark mode (relies on border contrast). Light mode uses elevation 1.
240
+ - **Hover (interactive)**: Border shifts to `neutral-600` (dark) / `neutral-400` (light).
241
+
242
+ ### Navigation Elements
243
+
244
+ - **Link Color**: `neutral-300` default, `neutral-100` on hover, `primary-400` when active.
245
+ - **Link Weight**: 400 default, 500 when active.
246
+ - **Nav Background**: `neutral-950` at 80% opacity with `backdrop-filter: blur(12px)`.
247
+ - **Nav Border**: 1px solid `neutral-800` bottom edge.
248
+
249
+ ---
250
+
251
+ ## 7. Visual Effects
252
+
253
+ ### Shadows & Elevation
254
+
255
+ All shadows use a violet-tinted black for cohesion with the palette.
256
+
257
+ | Level | CSS Value | Usage |
258
+ |-------|-----------|-------|
259
+ | **Elevation 0** | none | Default flat elements |
260
+ | **Elevation 1** | `0 1px 3px rgba(10, 10, 15, 0.3), 0 1px 2px rgba(10, 10, 15, 0.2)` | Cards (light mode), subtle lift |
261
+ | **Elevation 2** | `0 4px 6px rgba(10, 10, 15, 0.3), 0 2px 4px rgba(10, 10, 15, 0.2)` | Hover states, popovers |
262
+ | **Elevation 3** | `0 10px 15px rgba(10, 10, 15, 0.35), 0 4px 6px rgba(10, 10, 15, 0.2)` | Dropdowns, tooltips |
263
+ | **Elevation 4** | `0 20px 25px rgba(10, 10, 15, 0.4), 0 8px 10px rgba(10, 10, 15, 0.2)` | Modals, dialogs |
264
+
265
+ **Dark mode note:** Shadows are less visible on dark backgrounds. Dark mode relies primarily on border contrast and surface color differentiation for depth. Shadows are most impactful in light mode.
266
+
267
+ ### Border Radius
268
+
269
+ | Token | Value | Usage |
270
+ |-------|-------|-------|
271
+ | `radius-sm` | 4px | Small elements (badges, tags, checkboxes) |
272
+ | `radius-md` | 8px | Buttons, inputs, small cards |
273
+ | `radius-lg` | 12px | Cards, containers, modals |
274
+ | `radius-xl` | 16px | Large feature cards, hero elements |
275
+ | `radius-full` | 9999px | Pills, avatars, circular buttons |
276
+
277
+ ### Transitions & Animations
278
+
279
+ #### Duration Standards
280
+ | Token | Value | Usage |
281
+ |-------|-------|-------|
282
+ | `duration-fast` | 100ms | Color changes, opacity |
283
+ | `duration-normal` | 200ms | Most interactions (hover, focus, toggle) |
284
+ | `duration-slow` | 300ms | Layout changes, expand/collapse |
285
+ | `duration-slower` | 500ms | Page transitions, large reveals |
286
+
287
+ #### Easing Functions
288
+ | Token | Value | Usage |
289
+ |-------|-------|-------|
290
+ | `ease-default` | `cubic-bezier(0.4, 0, 0.2, 1)` | General purpose |
291
+ | `ease-in` | `cubic-bezier(0.4, 0, 1, 1)` | Elements exiting view |
292
+ | `ease-out` | `cubic-bezier(0, 0, 0.2, 1)` | Elements entering view |
293
+ | `ease-spring` | `cubic-bezier(0.34, 1.56, 0.64, 1)` | Playful micro-interactions (sparingly) |
294
+
295
+ #### Animation Principles
296
+ - Prefer opacity and transform animations (GPU-accelerated).
297
+ - No animation on page load for above-the-fold content — content should appear instantly.
298
+ - Subtle scroll-triggered fade-ins for below-the-fold sections: `opacity: 0 → 1`, `translateY(8px) → 0`, `duration-slow`.
299
+ - Loading states: Use skeleton screens with a subtle pulse animation (`opacity: 0.5 → 1`, 1.5s, infinite).
300
+
301
+ ---
302
+
303
+ ## 8. Iconography
304
+
305
+ ### Icon Library
306
+ - **Library:** [Lucide Icons](https://lucide.dev/) — MIT-licensed, consistent stroke-based set, excellent coverage for developer tool UIs
307
+ - **Style:** Outlined (stroke-based)
308
+ - **Stroke width:** 1.5px
309
+ - **Default size:** 20px (pairs with body text), 24px (navigation/buttons), 16px (small/inline)
310
+
311
+ ### Usage Guidelines
312
+ - Icons should be accompanied by text labels in navigation — icon-only buttons require tooltips.
313
+ - **Icon-text spacing:** `space-2` (8px)
314
+ - **Icon color:** Inherits text color by default. Interactive icons use `neutral-400` default, `neutral-100` on hover.
315
+ - Keep icon usage restrained — not every list item or label needs an icon.
316
+
317
+ ---
318
+
319
+ ## 9. Imagery & Media
320
+
321
+ ### Photography Style
322
+
323
+ Not Applicable — developer tooling site relies on code examples, diagrams, and UI illustrations rather than photography.
324
+
325
+ ### Illustrations
326
+
327
+ - **Style:** Minimal, geometric line illustrations using the primary and secondary palette.
328
+ - **Stroke weight:** Match icon stroke (1.5px) for cohesion.
329
+ - **Color usage:** Primary purple for emphasis, neutrals for structure, cyan secondary for accents.
330
+ - **Use cases:** Hero section visuals, feature explanations, empty states.
331
+ - Keep illustrations abstract and functional — avoid characters or lifestyle imagery.
332
+
333
+ ### Code Blocks
334
+ - **Background:** `neutral-800` (#1E1E26)
335
+ - **Border:** 1px solid `neutral-700`
336
+ - **Border radius:** `radius-lg` (12px)
337
+ - **Padding:** `space-6` (24px)
338
+ - **Font:** JetBrains Mono, 0.875rem
339
+ - **Line numbers:** `neutral-500`
340
+ - **Syntax highlighting:** Use primary purple, secondary cyan, semantic colors, and neutrals for a cohesive code theme.
341
+
342
+ ---
343
+
344
+ ## 10. Accessibility
345
+
346
+ ### Contrast Requirements
347
+ - **Target:** WCAG 2.1 AA compliance
348
+ - **Normal text:** Minimum 4.5:1 contrast ratio
349
+ - **Large text (≥ 18px bold or ≥ 24px regular):** Minimum 3:1 contrast ratio
350
+ - **Interactive elements:** Minimum 3:1 against adjacent colors
351
+ - All color pairings in this guide meet AA requirements. Key validations:
352
+ - `neutral-200` on `neutral-950`: 14.8:1 ✓
353
+ - `neutral-400` on `neutral-950`: 5.6:1 ✓
354
+ - `primary-500` on `neutral-950`: 5.1:1 ✓
355
+
356
+ ### Focus States
357
+ - **Focus ring:** 2px solid `primary-400` (#A78BFA) with 2px offset from the element
358
+ - **Focus ring (high contrast):** Falls back to browser default outline in `forced-colors` mode
359
+ - **All interactive elements** must have visible focus indicators — never use `outline: none` without a replacement
360
+ - **Tab order:** Follows logical reading order (top-to-bottom, left-to-right)
361
+
362
+ ### Text Accessibility
363
+ - **Minimum body font size:** 16px (1rem) — never go below 14px for any readable text
364
+ - **Maximum line length:** 65ch (~680px) for body text
365
+ - **Line height:** Minimum 1.5 for body text
366
+ - **Avoid justified text** — use left-aligned (or right-aligned for RTL) only
367
+ - **Link distinction:** Links use `primary-400` color AND underline-on-hover (color alone is insufficient)
368
+
369
+ ---
370
+
371
+ ## 11. Responsive Design
372
+
373
+ ### Breakpoints
374
+
375
+ | Name | Min Width | Tailwind Prefix |
376
+ |------|-----------|-----------------|
377
+ | Mobile | 0px | (default) |
378
+ | Small | 640px | `sm:` |
379
+ | Medium | 768px | `md:` |
380
+ | Large | 1024px | `lg:` |
381
+ | XL | 1280px | `xl:` |
382
+
383
+ ### Scaling Strategy
384
+ - **Mobile-first** — Default styles target mobile, breakpoints add complexity for larger screens.
385
+ - Typography scales down on mobile (see Type Scale responsive section).
386
+ - Spacing reduces by one step on mobile (e.g., `space-24` desktop → `space-16` mobile for section gaps).
387
+ - Grid collapses from 12 columns to 4 on mobile with single-column stacking.
388
+
389
+ ### Mobile-Specific Patterns
390
+ - **Touch targets:** Minimum 44px × 44px for all interactive elements
391
+ - **Navigation:** Hamburger menu with fullscreen overlay. No horizontal scrolling nav.
392
+ - **Cards:** Stack vertically with full width, `space-4` (16px) gaps
393
+ - **Buttons:** Full-width on mobile for primary actions in forms/CTAs
394
+ - **Scroll behavior:** `scroll-padding-top: 80px` to account for fixed header when using anchor links
395
+
396
+ ---
397
+
398
+ ## 12. Usage Examples
399
+
400
+ ### Component Combinations
401
+
402
+ #### Hero Section
403
+ - Full-width dark background (`neutral-950`)
404
+ - Display heading in `neutral-100`, max 15 words
405
+ - Body Large subtitle in `neutral-400`, max 2 lines
406
+ - Primary CTA button + Secondary ghost button side by side
407
+ - `space-24` (96px) vertical padding
408
+
409
+ #### Feature Card Grid
410
+ - 3-column grid on desktop, single column on mobile
411
+ - Cards with `neutral-900` background, `neutral-700` border, `radius-lg`
412
+ - Icon (Lucide, 24px, `primary-400`) top-left
413
+ - H4 title, Body Small description in `neutral-300`
414
+ - `space-8` (32px) gap between cards
415
+
416
+ #### Code Example Block
417
+ - `neutral-800` background, `radius-lg`, `neutral-700` border
418
+ - Language badge top-right: `primary-900` background, `primary-300` text, `radius-sm`, Body Small
419
+ - JetBrains Mono at 14px
420
+ - Copy button: ghost style, top-right, icon-only with tooltip
421
+ - `space-6` padding
422
+
423
+ #### Documentation Page
424
+ - Fixed sidebar navigation (left, 240px width) on desktop, hidden on mobile
425
+ - Content area centered, max `65ch`
426
+ - H2 sections separated by `space-16`
427
+ - In-page table of contents (right sidebar, 200px) on wide screens (≥ 1280px)
428
+
429
+ ### Do's and Don'ts
430
+
431
+ **Do:**
432
+ - Use the primary purple for a single focal action per viewport (one primary CTA)
433
+ - Maintain generous whitespace — when in doubt, add more space
434
+ - Use monospace font for any code references, CLI commands, or technical identifiers
435
+ - Keep text under 65ch line length for readability
436
+
437
+ **Don't:**
438
+ - Use purple backgrounds for large areas — reserve it for accents and interactive elements
439
+ - Mix multiple accent colors in the same component
440
+ - Use shadows as the primary depth indicator in dark mode — use surface colors and borders
441
+ - Reduce touch targets below 44px on mobile
442
+ - Use color alone to convey meaning — pair with icons, text, or patterns
@@ -13,7 +13,7 @@ These specs define what the product is, how it should look, what technology it u
13
13
  3. **Update specs that your changes contradict** — If your code change makes a spec statement incorrect (e.g., you changed the data model, switched a dependency, altered a UI pattern, or added a new API endpoint), update the spec to reflect reality. Common candidates:
14
14
  - `gspec/architecture.md` — project structure, data model, API routes, component hierarchy
15
15
  - `gspec/stack.md` — dependencies, frameworks, infrastructure
16
- - `gspec/style.md` — design tokens, component patterns, visual conventions
16
+ - `gspec/style.md` — design tokens, component styling, visual conventions
17
17
  - `gspec/practices.md` — coding standards, testing conventions, workflows
18
18
  - `gspec/profile.md` — product scope, target users, value proposition (rarely changes)
19
19