ui-ux-pro-max-cli 2.8.8
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 +99 -0
- package/assets/data/_sync_all.py +414 -0
- package/assets/data/app-interface.csv +31 -0
- package/assets/data/charts.csv +26 -0
- package/assets/data/colors.csv +162 -0
- package/assets/data/design.csv +1776 -0
- package/assets/data/draft.csv +1779 -0
- package/assets/data/google-fonts.csv +1924 -0
- package/assets/data/icons.csv +106 -0
- package/assets/data/landing.csv +35 -0
- package/assets/data/products.csv +162 -0
- package/assets/data/react-performance.csv +45 -0
- package/assets/data/stacks/angular.csv +51 -0
- package/assets/data/stacks/astro.csv +54 -0
- package/assets/data/stacks/flutter.csv +53 -0
- package/assets/data/stacks/html-tailwind.csv +56 -0
- package/assets/data/stacks/javafx.csv +76 -0
- package/assets/data/stacks/jetpack-compose.csv +53 -0
- package/assets/data/stacks/laravel.csv +51 -0
- package/assets/data/stacks/nextjs.csv +53 -0
- package/assets/data/stacks/nuxt-ui.csv +71 -0
- package/assets/data/stacks/nuxtjs.csv +59 -0
- package/assets/data/stacks/react-native.csv +52 -0
- package/assets/data/stacks/react.csv +54 -0
- package/assets/data/stacks/shadcn.csv +61 -0
- package/assets/data/stacks/svelte.csv +54 -0
- package/assets/data/stacks/swiftui.csv +51 -0
- package/assets/data/stacks/threejs.csv +54 -0
- package/assets/data/stacks/vue.csv +50 -0
- package/assets/data/styles.csv +85 -0
- package/assets/data/typography.csv +74 -0
- package/assets/data/ui-reasoning.csv +162 -0
- package/assets/data/ux-guidelines.csv +100 -0
- package/assets/scripts/core.py +263 -0
- package/assets/scripts/design_system.py +1157 -0
- package/assets/scripts/search.py +114 -0
- package/assets/skills/banner-design/SKILL.md +196 -0
- package/assets/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
- package/assets/skills/brand/SKILL.md +97 -0
- package/assets/skills/brand/references/approval-checklist.md +169 -0
- package/assets/skills/brand/references/asset-organization.md +157 -0
- package/assets/skills/brand/references/brand-guideline-template.md +140 -0
- package/assets/skills/brand/references/color-palette-management.md +186 -0
- package/assets/skills/brand/references/consistency-checklist.md +94 -0
- package/assets/skills/brand/references/logo-usage-rules.md +185 -0
- package/assets/skills/brand/references/messaging-framework.md +85 -0
- package/assets/skills/brand/references/typography-specifications.md +214 -0
- package/assets/skills/brand/references/update.md +118 -0
- package/assets/skills/brand/references/visual-identity.md +96 -0
- package/assets/skills/brand/references/voice-framework.md +88 -0
- package/assets/skills/brand/scripts/extract-colors.cjs +341 -0
- package/assets/skills/brand/scripts/inject-brand-context.cjs +349 -0
- package/assets/skills/brand/scripts/sync-brand-to-tokens.cjs +266 -0
- package/assets/skills/brand/scripts/validate-asset.cjs +387 -0
- package/assets/skills/brand/templates/brand-guidelines-starter.md +275 -0
- package/assets/skills/design/SKILL.md +313 -0
- package/assets/skills/design/data/cip/deliverables.csv +51 -0
- package/assets/skills/design/data/cip/industries.csv +21 -0
- package/assets/skills/design/data/cip/mockup-contexts.csv +21 -0
- package/assets/skills/design/data/cip/styles.csv +21 -0
- package/assets/skills/design/data/icon/styles.csv +16 -0
- package/assets/skills/design/data/logo/colors.csv +56 -0
- package/assets/skills/design/data/logo/industries.csv +56 -0
- package/assets/skills/design/data/logo/styles.csv +56 -0
- package/assets/skills/design/references/banner-sizes-and-styles.md +118 -0
- package/assets/skills/design/references/cip-deliverable-guide.md +95 -0
- package/assets/skills/design/references/cip-design.md +121 -0
- package/assets/skills/design/references/cip-prompt-engineering.md +84 -0
- package/assets/skills/design/references/cip-style-guide.md +68 -0
- package/assets/skills/design/references/design-routing.md +207 -0
- package/assets/skills/design/references/icon-design.md +122 -0
- package/assets/skills/design/references/logo-color-psychology.md +101 -0
- package/assets/skills/design/references/logo-design.md +92 -0
- package/assets/skills/design/references/logo-prompt-engineering.md +158 -0
- package/assets/skills/design/references/logo-style-guide.md +109 -0
- package/assets/skills/design/references/slides-copywriting-formulas.md +84 -0
- package/assets/skills/design/references/slides-create.md +4 -0
- package/assets/skills/design/references/slides-html-template.md +295 -0
- package/assets/skills/design/references/slides-layout-patterns.md +137 -0
- package/assets/skills/design/references/slides-strategies.md +94 -0
- package/assets/skills/design/references/slides.md +42 -0
- package/assets/skills/design/references/social-photos-design.md +329 -0
- package/assets/skills/design/scripts/cip/core.py +215 -0
- package/assets/skills/design/scripts/cip/generate.py +484 -0
- package/assets/skills/design/scripts/cip/render-html.py +424 -0
- package/assets/skills/design/scripts/cip/search.py +127 -0
- package/assets/skills/design/scripts/icon/generate.py +487 -0
- package/assets/skills/design/scripts/logo/core.py +175 -0
- package/assets/skills/design/scripts/logo/generate.py +362 -0
- package/assets/skills/design/scripts/logo/search.py +114 -0
- package/assets/skills/design-system/SKILL.md +244 -0
- package/assets/skills/design-system/data/slide-backgrounds.csv +11 -0
- package/assets/skills/design-system/data/slide-charts.csv +26 -0
- package/assets/skills/design-system/data/slide-color-logic.csv +14 -0
- package/assets/skills/design-system/data/slide-copy.csv +26 -0
- package/assets/skills/design-system/data/slide-layout-logic.csv +16 -0
- package/assets/skills/design-system/data/slide-layouts.csv +26 -0
- package/assets/skills/design-system/data/slide-strategies.csv +16 -0
- package/assets/skills/design-system/data/slide-typography.csv +15 -0
- package/assets/skills/design-system/references/component-specs.md +236 -0
- package/assets/skills/design-system/references/component-tokens.md +214 -0
- package/assets/skills/design-system/references/primitive-tokens.md +203 -0
- package/assets/skills/design-system/references/semantic-tokens.md +215 -0
- package/assets/skills/design-system/references/states-and-variants.md +241 -0
- package/assets/skills/design-system/references/tailwind-integration.md +251 -0
- package/assets/skills/design-system/references/token-architecture.md +224 -0
- package/assets/skills/design-system/scripts/embed-tokens.cjs +99 -0
- package/assets/skills/design-system/scripts/fetch-background.py +317 -0
- package/assets/skills/design-system/scripts/generate-slide.py +770 -0
- package/assets/skills/design-system/scripts/generate-tokens.cjs +205 -0
- package/assets/skills/design-system/scripts/html-token-validator.py +327 -0
- package/assets/skills/design-system/scripts/search-slides.py +218 -0
- package/assets/skills/design-system/scripts/slide-token-validator.py +35 -0
- package/assets/skills/design-system/scripts/slide_search_core.py +453 -0
- package/assets/skills/design-system/scripts/validate-tokens.cjs +251 -0
- package/assets/skills/design-system/templates/design-tokens-starter.json +143 -0
- package/assets/skills/slides/SKILL.md +40 -0
- package/assets/skills/slides/references/copywriting-formulas.md +84 -0
- package/assets/skills/slides/references/create.md +4 -0
- package/assets/skills/slides/references/html-template.md +295 -0
- package/assets/skills/slides/references/layout-patterns.md +137 -0
- package/assets/skills/slides/references/slide-strategies.md +94 -0
- package/assets/skills/ui-styling/LICENSE.txt +202 -0
- package/assets/skills/ui-styling/SKILL.md +324 -0
- package/assets/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/assets/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/assets/skills/ui-styling/references/shadcn-components.md +424 -0
- package/assets/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/assets/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/assets/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/assets/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/assets/skills/ui-styling/scripts/requirements.txt +17 -0
- package/assets/skills/ui-styling/scripts/shadcn_add.py +308 -0
- package/assets/skills/ui-styling/scripts/tailwind_config_gen.py +473 -0
- package/assets/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/assets/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/assets/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/assets/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/assets/templates/base/quick-reference.md +297 -0
- package/assets/templates/base/skill-content.md +368 -0
- package/assets/templates/platforms/agent.json +21 -0
- package/assets/templates/platforms/augment.json +18 -0
- package/assets/templates/platforms/claude.json +21 -0
- package/assets/templates/platforms/codebuddy.json +21 -0
- package/assets/templates/platforms/codex.json +21 -0
- package/assets/templates/platforms/continue.json +21 -0
- package/assets/templates/platforms/copilot.json +21 -0
- package/assets/templates/platforms/cursor.json +21 -0
- package/assets/templates/platforms/droid.json +21 -0
- package/assets/templates/platforms/gemini.json +21 -0
- package/assets/templates/platforms/kilocode.json +21 -0
- package/assets/templates/platforms/kiro.json +21 -0
- package/assets/templates/platforms/opencode.json +21 -0
- package/assets/templates/platforms/qoder.json +21 -0
- package/assets/templates/platforms/roocode.json +21 -0
- package/assets/templates/platforms/trae.json +21 -0
- package/assets/templates/platforms/warp.json +18 -0
- package/assets/templates/platforms/windsurf.json +21 -0
- package/dist/index.js +10630 -0
- package/package.json +51 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Semantic Tokens
|
|
2
|
+
|
|
3
|
+
Purpose-based aliases referencing primitive tokens.
|
|
4
|
+
|
|
5
|
+
## Color Semantics
|
|
6
|
+
|
|
7
|
+
### Background & Foreground
|
|
8
|
+
|
|
9
|
+
```css
|
|
10
|
+
:root {
|
|
11
|
+
/* Page background */
|
|
12
|
+
--color-background: var(--color-gray-50);
|
|
13
|
+
--color-foreground: var(--color-gray-900);
|
|
14
|
+
|
|
15
|
+
/* Card/surface background */
|
|
16
|
+
--color-card: white;
|
|
17
|
+
--color-card-foreground: var(--color-gray-900);
|
|
18
|
+
|
|
19
|
+
/* Popover/dropdown */
|
|
20
|
+
--color-popover: white;
|
|
21
|
+
--color-popover-foreground: var(--color-gray-900);
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Primary
|
|
26
|
+
|
|
27
|
+
```css
|
|
28
|
+
:root {
|
|
29
|
+
--color-primary: var(--color-blue-600);
|
|
30
|
+
--color-primary-hover: var(--color-blue-700);
|
|
31
|
+
--color-primary-active: var(--color-blue-800);
|
|
32
|
+
--color-primary-foreground: white;
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Secondary
|
|
37
|
+
|
|
38
|
+
```css
|
|
39
|
+
:root {
|
|
40
|
+
--color-secondary: var(--color-gray-100);
|
|
41
|
+
--color-secondary-hover: var(--color-gray-200);
|
|
42
|
+
--color-secondary-foreground: var(--color-gray-900);
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Muted
|
|
47
|
+
|
|
48
|
+
```css
|
|
49
|
+
:root {
|
|
50
|
+
--color-muted: var(--color-gray-100);
|
|
51
|
+
--color-muted-foreground: var(--color-gray-500);
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Accent
|
|
56
|
+
|
|
57
|
+
```css
|
|
58
|
+
:root {
|
|
59
|
+
--color-accent: var(--color-gray-100);
|
|
60
|
+
--color-accent-foreground: var(--color-gray-900);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Destructive
|
|
65
|
+
|
|
66
|
+
```css
|
|
67
|
+
:root {
|
|
68
|
+
--color-destructive: var(--color-red-600);
|
|
69
|
+
--color-destructive-hover: var(--color-red-700);
|
|
70
|
+
--color-destructive-foreground: white;
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Status Colors
|
|
75
|
+
|
|
76
|
+
```css
|
|
77
|
+
:root {
|
|
78
|
+
--color-success: var(--color-green-600);
|
|
79
|
+
--color-success-foreground: white;
|
|
80
|
+
|
|
81
|
+
--color-warning: var(--color-yellow-500);
|
|
82
|
+
--color-warning-foreground: var(--color-gray-900);
|
|
83
|
+
|
|
84
|
+
--color-error: var(--color-red-600);
|
|
85
|
+
--color-error-foreground: white;
|
|
86
|
+
|
|
87
|
+
--color-info: var(--color-blue-500);
|
|
88
|
+
--color-info-foreground: white;
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Border & Ring
|
|
93
|
+
|
|
94
|
+
```css
|
|
95
|
+
:root {
|
|
96
|
+
--color-border: var(--color-gray-200);
|
|
97
|
+
--color-input: var(--color-gray-200);
|
|
98
|
+
--color-ring: var(--color-blue-500);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Spacing Semantics
|
|
103
|
+
|
|
104
|
+
```css
|
|
105
|
+
:root {
|
|
106
|
+
/* Component internal spacing */
|
|
107
|
+
--spacing-component-xs: var(--space-1);
|
|
108
|
+
--spacing-component-sm: var(--space-2);
|
|
109
|
+
--spacing-component: var(--space-3);
|
|
110
|
+
--spacing-component-lg: var(--space-4);
|
|
111
|
+
|
|
112
|
+
/* Section spacing */
|
|
113
|
+
--spacing-section-sm: var(--space-8);
|
|
114
|
+
--spacing-section: var(--space-12);
|
|
115
|
+
--spacing-section-lg: var(--space-16);
|
|
116
|
+
|
|
117
|
+
/* Page margins */
|
|
118
|
+
--spacing-page-x: var(--space-4);
|
|
119
|
+
--spacing-page-y: var(--space-6);
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Typography Semantics
|
|
124
|
+
|
|
125
|
+
```css
|
|
126
|
+
:root {
|
|
127
|
+
/* Headings */
|
|
128
|
+
--font-heading: var(--font-size-2xl);
|
|
129
|
+
--font-heading-lg: var(--font-size-3xl);
|
|
130
|
+
--font-heading-xl: var(--font-size-4xl);
|
|
131
|
+
|
|
132
|
+
/* Body */
|
|
133
|
+
--font-body: var(--font-size-base);
|
|
134
|
+
--font-body-sm: var(--font-size-sm);
|
|
135
|
+
--font-body-lg: var(--font-size-lg);
|
|
136
|
+
|
|
137
|
+
/* Labels & Captions */
|
|
138
|
+
--font-label: var(--font-size-sm);
|
|
139
|
+
--font-caption: var(--font-size-xs);
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Interactive States
|
|
144
|
+
|
|
145
|
+
```css
|
|
146
|
+
:root {
|
|
147
|
+
/* Focus ring */
|
|
148
|
+
--ring-width: 2px;
|
|
149
|
+
--ring-offset: 2px;
|
|
150
|
+
--ring-color: var(--color-ring);
|
|
151
|
+
|
|
152
|
+
/* Opacity for disabled */
|
|
153
|
+
--opacity-disabled: 0.5;
|
|
154
|
+
|
|
155
|
+
/* Transitions */
|
|
156
|
+
--transition-colors: color, background-color, border-color;
|
|
157
|
+
--transition-transform: transform;
|
|
158
|
+
--transition-all: all;
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Dark Mode Overrides
|
|
163
|
+
|
|
164
|
+
```css
|
|
165
|
+
.dark {
|
|
166
|
+
--color-background: var(--color-gray-950);
|
|
167
|
+
--color-foreground: var(--color-gray-50);
|
|
168
|
+
|
|
169
|
+
--color-card: var(--color-gray-900);
|
|
170
|
+
--color-card-foreground: var(--color-gray-50);
|
|
171
|
+
|
|
172
|
+
--color-popover: var(--color-gray-900);
|
|
173
|
+
--color-popover-foreground: var(--color-gray-50);
|
|
174
|
+
|
|
175
|
+
--color-muted: var(--color-gray-800);
|
|
176
|
+
--color-muted-foreground: var(--color-gray-400);
|
|
177
|
+
|
|
178
|
+
--color-secondary: var(--color-gray-800);
|
|
179
|
+
--color-secondary-foreground: var(--color-gray-50);
|
|
180
|
+
|
|
181
|
+
--color-accent: var(--color-gray-800);
|
|
182
|
+
--color-accent-foreground: var(--color-gray-50);
|
|
183
|
+
|
|
184
|
+
--color-border: var(--color-gray-800);
|
|
185
|
+
--color-input: var(--color-gray-800);
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Usage Patterns
|
|
190
|
+
|
|
191
|
+
### Applying Semantic Tokens
|
|
192
|
+
|
|
193
|
+
```css
|
|
194
|
+
/* Good - uses semantic tokens */
|
|
195
|
+
.card {
|
|
196
|
+
background: var(--color-card);
|
|
197
|
+
color: var(--color-card-foreground);
|
|
198
|
+
border: 1px solid var(--color-border);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* Bad - uses primitive tokens directly */
|
|
202
|
+
.card {
|
|
203
|
+
background: var(--color-gray-50);
|
|
204
|
+
color: var(--color-gray-900);
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Theme Switching
|
|
209
|
+
|
|
210
|
+
Semantic tokens enable instant theme switching:
|
|
211
|
+
|
|
212
|
+
```js
|
|
213
|
+
// Toggle dark mode
|
|
214
|
+
document.documentElement.classList.toggle('dark');
|
|
215
|
+
```
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# States and Variants
|
|
2
|
+
|
|
3
|
+
Component state definitions and variant patterns.
|
|
4
|
+
|
|
5
|
+
## Interactive States
|
|
6
|
+
|
|
7
|
+
### State Definitions
|
|
8
|
+
|
|
9
|
+
| State | Trigger | Visual Change |
|
|
10
|
+
|-------|---------|---------------|
|
|
11
|
+
| default | None | Base appearance |
|
|
12
|
+
| hover | Mouse over | Slight color shift |
|
|
13
|
+
| focus | Tab/click | Focus ring |
|
|
14
|
+
| active | Mouse down | Darkest color |
|
|
15
|
+
| disabled | disabled attr | Reduced opacity |
|
|
16
|
+
| loading | Async action | Spinner + opacity |
|
|
17
|
+
|
|
18
|
+
### State Priority
|
|
19
|
+
|
|
20
|
+
When multiple states apply, priority (highest to lowest):
|
|
21
|
+
|
|
22
|
+
1. disabled
|
|
23
|
+
2. loading
|
|
24
|
+
3. active
|
|
25
|
+
4. focus
|
|
26
|
+
5. hover
|
|
27
|
+
6. default
|
|
28
|
+
|
|
29
|
+
### State Transitions
|
|
30
|
+
|
|
31
|
+
```css
|
|
32
|
+
/* Standard transition for interactive elements */
|
|
33
|
+
.interactive {
|
|
34
|
+
transition-property: color, background-color, border-color, box-shadow;
|
|
35
|
+
transition-duration: var(--duration-fast);
|
|
36
|
+
transition-timing-function: ease-in-out;
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
| Transition | Duration | Easing |
|
|
41
|
+
|------------|----------|--------|
|
|
42
|
+
| Color changes | 150ms | ease-in-out |
|
|
43
|
+
| Background | 150ms | ease-in-out |
|
|
44
|
+
| Transform | 200ms | ease-out |
|
|
45
|
+
| Opacity | 150ms | ease |
|
|
46
|
+
| Shadow | 200ms | ease-out |
|
|
47
|
+
|
|
48
|
+
## Focus States
|
|
49
|
+
|
|
50
|
+
### Focus Ring Spec
|
|
51
|
+
|
|
52
|
+
```css
|
|
53
|
+
/* Standard focus ring */
|
|
54
|
+
.focusable:focus-visible {
|
|
55
|
+
outline: none;
|
|
56
|
+
box-shadow: 0 0 0 var(--ring-offset) var(--color-background),
|
|
57
|
+
0 0 0 calc(var(--ring-offset) + var(--ring-width)) var(--ring-color);
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
| Property | Value |
|
|
62
|
+
|----------|-------|
|
|
63
|
+
| Ring width | 2px |
|
|
64
|
+
| Ring offset | 2px |
|
|
65
|
+
| Ring color | primary (blue-500) |
|
|
66
|
+
| Offset color | background |
|
|
67
|
+
|
|
68
|
+
### Focus Within
|
|
69
|
+
|
|
70
|
+
```css
|
|
71
|
+
/* Container focus when child is focused */
|
|
72
|
+
.container:focus-within {
|
|
73
|
+
border-color: var(--color-ring);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Disabled States
|
|
78
|
+
|
|
79
|
+
### Visual Treatment
|
|
80
|
+
|
|
81
|
+
```css
|
|
82
|
+
.disabled {
|
|
83
|
+
opacity: var(--opacity-disabled); /* 0.5 */
|
|
84
|
+
pointer-events: none;
|
|
85
|
+
cursor: not-allowed;
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
| Property | Disabled Value |
|
|
90
|
+
|----------|----------------|
|
|
91
|
+
| Opacity | 50% |
|
|
92
|
+
| Pointer events | none |
|
|
93
|
+
| Cursor | not-allowed |
|
|
94
|
+
| Background | muted |
|
|
95
|
+
| Color | muted-foreground |
|
|
96
|
+
|
|
97
|
+
### Accessibility
|
|
98
|
+
|
|
99
|
+
- Use `aria-disabled="true"` for semantic disabled
|
|
100
|
+
- Use `disabled` attribute for form elements
|
|
101
|
+
- Maintain sufficient contrast (3:1 minimum)
|
|
102
|
+
|
|
103
|
+
## Loading States
|
|
104
|
+
|
|
105
|
+
### Spinner Placement
|
|
106
|
+
|
|
107
|
+
| Component | Spinner Position |
|
|
108
|
+
|-----------|------------------|
|
|
109
|
+
| Button | Replace icon or center |
|
|
110
|
+
| Input | Trailing position |
|
|
111
|
+
| Card | Center overlay |
|
|
112
|
+
| Page | Center of viewport |
|
|
113
|
+
|
|
114
|
+
### Loading Treatment
|
|
115
|
+
|
|
116
|
+
```css
|
|
117
|
+
.loading {
|
|
118
|
+
position: relative;
|
|
119
|
+
pointer-events: none;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.loading::after {
|
|
123
|
+
content: '';
|
|
124
|
+
/* spinner styles */
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.loading > * {
|
|
128
|
+
opacity: 0.7;
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Error States
|
|
133
|
+
|
|
134
|
+
### Visual Indicators
|
|
135
|
+
|
|
136
|
+
```css
|
|
137
|
+
.error {
|
|
138
|
+
border-color: var(--color-error);
|
|
139
|
+
color: var(--color-error);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.error:focus-visible {
|
|
143
|
+
box-shadow: 0 0 0 2px var(--color-background),
|
|
144
|
+
0 0 0 4px var(--color-error);
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
| Element | Error Treatment |
|
|
149
|
+
|---------|-----------------|
|
|
150
|
+
| Input border | red-500 |
|
|
151
|
+
| Input focus ring | red/20% |
|
|
152
|
+
| Helper text | red-600 |
|
|
153
|
+
| Icon | red-500 |
|
|
154
|
+
|
|
155
|
+
### Error Messages
|
|
156
|
+
|
|
157
|
+
- Position below input
|
|
158
|
+
- Use error color
|
|
159
|
+
- Include icon for accessibility
|
|
160
|
+
- Clear on valid input
|
|
161
|
+
|
|
162
|
+
## Variant Patterns
|
|
163
|
+
|
|
164
|
+
### Color Variants
|
|
165
|
+
|
|
166
|
+
```css
|
|
167
|
+
/* Pattern for color variants */
|
|
168
|
+
.component {
|
|
169
|
+
--component-bg: var(--color-primary);
|
|
170
|
+
--component-fg: var(--color-primary-foreground);
|
|
171
|
+
background: var(--component-bg);
|
|
172
|
+
color: var(--component-fg);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.component.secondary {
|
|
176
|
+
--component-bg: var(--color-secondary);
|
|
177
|
+
--component-fg: var(--color-secondary-foreground);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.component.destructive {
|
|
181
|
+
--component-bg: var(--color-destructive);
|
|
182
|
+
--component-fg: var(--color-destructive-foreground);
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Size Variants
|
|
187
|
+
|
|
188
|
+
```css
|
|
189
|
+
/* Pattern for size variants */
|
|
190
|
+
.component {
|
|
191
|
+
--component-height: 40px;
|
|
192
|
+
--component-padding: var(--space-4);
|
|
193
|
+
--component-font: var(--font-size-sm);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.component.sm {
|
|
197
|
+
--component-height: 32px;
|
|
198
|
+
--component-padding: var(--space-3);
|
|
199
|
+
--component-font: var(--font-size-xs);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.component.lg {
|
|
203
|
+
--component-height: 48px;
|
|
204
|
+
--component-padding: var(--space-6);
|
|
205
|
+
--component-font: var(--font-size-base);
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Accessibility Requirements
|
|
210
|
+
|
|
211
|
+
### Color Contrast
|
|
212
|
+
|
|
213
|
+
| Element | Minimum Ratio |
|
|
214
|
+
|---------|---------------|
|
|
215
|
+
| Normal text | 4.5:1 |
|
|
216
|
+
| Large text (18px+) | 3:1 |
|
|
217
|
+
| UI components | 3:1 |
|
|
218
|
+
| Focus indicator | 3:1 |
|
|
219
|
+
|
|
220
|
+
### State Indicators
|
|
221
|
+
|
|
222
|
+
- Never rely on color alone
|
|
223
|
+
- Use icons, text, or patterns
|
|
224
|
+
- Ensure focus is visible
|
|
225
|
+
- Provide loading announcements
|
|
226
|
+
|
|
227
|
+
### ARIA States
|
|
228
|
+
|
|
229
|
+
```html
|
|
230
|
+
<!-- Disabled -->
|
|
231
|
+
<button disabled aria-disabled="true">Submit</button>
|
|
232
|
+
|
|
233
|
+
<!-- Loading -->
|
|
234
|
+
<button aria-busy="true" aria-describedby="loading-text">
|
|
235
|
+
<span id="loading-text" class="sr-only">Loading...</span>
|
|
236
|
+
</button>
|
|
237
|
+
|
|
238
|
+
<!-- Error -->
|
|
239
|
+
<input aria-invalid="true" aria-describedby="error-msg">
|
|
240
|
+
<span id="error-msg" role="alert">Error message</span>
|
|
241
|
+
```
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# Tailwind Integration
|
|
2
|
+
|
|
3
|
+
Map design system tokens to Tailwind CSS configuration.
|
|
4
|
+
|
|
5
|
+
## CSS Variables Setup
|
|
6
|
+
|
|
7
|
+
### Base Layer
|
|
8
|
+
|
|
9
|
+
```css
|
|
10
|
+
/* globals.css */
|
|
11
|
+
@tailwind base;
|
|
12
|
+
@tailwind components;
|
|
13
|
+
@tailwind utilities;
|
|
14
|
+
|
|
15
|
+
@layer base {
|
|
16
|
+
:root {
|
|
17
|
+
/* Primitives */
|
|
18
|
+
--color-blue-600: 37 99 235; /* HSL: 217 91% 60% */
|
|
19
|
+
|
|
20
|
+
/* Semantic */
|
|
21
|
+
--background: 0 0% 100%;
|
|
22
|
+
--foreground: 222 47% 11%;
|
|
23
|
+
--primary: 217 91% 60%;
|
|
24
|
+
--primary-foreground: 0 0% 100%;
|
|
25
|
+
--secondary: 220 14% 96%;
|
|
26
|
+
--secondary-foreground: 222 47% 11%;
|
|
27
|
+
--muted: 220 14% 96%;
|
|
28
|
+
--muted-foreground: 220 9% 46%;
|
|
29
|
+
--accent: 220 14% 96%;
|
|
30
|
+
--accent-foreground: 222 47% 11%;
|
|
31
|
+
--destructive: 0 84% 60%;
|
|
32
|
+
--destructive-foreground: 0 0% 100%;
|
|
33
|
+
--border: 220 13% 91%;
|
|
34
|
+
--input: 220 13% 91%;
|
|
35
|
+
--ring: 217 91% 60%;
|
|
36
|
+
--radius: 0.5rem;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.dark {
|
|
40
|
+
--background: 222 47% 4%;
|
|
41
|
+
--foreground: 210 40% 98%;
|
|
42
|
+
--primary: 217 91% 60%;
|
|
43
|
+
--primary-foreground: 0 0% 100%;
|
|
44
|
+
--secondary: 217 33% 17%;
|
|
45
|
+
--secondary-foreground: 210 40% 98%;
|
|
46
|
+
--muted: 217 33% 17%;
|
|
47
|
+
--muted-foreground: 215 20% 65%;
|
|
48
|
+
--accent: 217 33% 17%;
|
|
49
|
+
--accent-foreground: 210 40% 98%;
|
|
50
|
+
--destructive: 0 62% 30%;
|
|
51
|
+
--destructive-foreground: 0 0% 100%;
|
|
52
|
+
--border: 217 33% 17%;
|
|
53
|
+
--input: 217 33% 17%;
|
|
54
|
+
--ring: 217 91% 60%;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Tailwind Config
|
|
60
|
+
|
|
61
|
+
### tailwind.config.ts
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import type { Config } from 'tailwindcss'
|
|
65
|
+
|
|
66
|
+
const config: Config = {
|
|
67
|
+
darkMode: ['class'],
|
|
68
|
+
content: ['./src/**/*.{ts,tsx}'],
|
|
69
|
+
theme: {
|
|
70
|
+
extend: {
|
|
71
|
+
colors: {
|
|
72
|
+
background: 'hsl(var(--background))',
|
|
73
|
+
foreground: 'hsl(var(--foreground))',
|
|
74
|
+
primary: {
|
|
75
|
+
DEFAULT: 'hsl(var(--primary))',
|
|
76
|
+
foreground: 'hsl(var(--primary-foreground))',
|
|
77
|
+
},
|
|
78
|
+
secondary: {
|
|
79
|
+
DEFAULT: 'hsl(var(--secondary))',
|
|
80
|
+
foreground: 'hsl(var(--secondary-foreground))',
|
|
81
|
+
},
|
|
82
|
+
muted: {
|
|
83
|
+
DEFAULT: 'hsl(var(--muted))',
|
|
84
|
+
foreground: 'hsl(var(--muted-foreground))',
|
|
85
|
+
},
|
|
86
|
+
accent: {
|
|
87
|
+
DEFAULT: 'hsl(var(--accent))',
|
|
88
|
+
foreground: 'hsl(var(--accent-foreground))',
|
|
89
|
+
},
|
|
90
|
+
destructive: {
|
|
91
|
+
DEFAULT: 'hsl(var(--destructive))',
|
|
92
|
+
foreground: 'hsl(var(--destructive-foreground))',
|
|
93
|
+
},
|
|
94
|
+
border: 'hsl(var(--border))',
|
|
95
|
+
input: 'hsl(var(--input))',
|
|
96
|
+
ring: 'hsl(var(--ring))',
|
|
97
|
+
card: {
|
|
98
|
+
DEFAULT: 'hsl(var(--card))',
|
|
99
|
+
foreground: 'hsl(var(--card-foreground))',
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
borderRadius: {
|
|
103
|
+
lg: 'var(--radius)',
|
|
104
|
+
md: 'calc(var(--radius) - 2px)',
|
|
105
|
+
sm: 'calc(var(--radius) - 4px)',
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
plugins: [],
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export default config
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## HSL Format Benefits
|
|
116
|
+
|
|
117
|
+
Using HSL without function allows opacity modifiers:
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
// With HSL format (space-separated)
|
|
121
|
+
<div className="bg-primary/50"> // 50% opacity
|
|
122
|
+
<div className="text-primary/80"> // 80% opacity
|
|
123
|
+
|
|
124
|
+
// CSS output
|
|
125
|
+
background-color: hsl(217 91% 60% / 0.5);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Component Classes
|
|
129
|
+
|
|
130
|
+
### Button Example
|
|
131
|
+
|
|
132
|
+
```css
|
|
133
|
+
@layer components {
|
|
134
|
+
.btn {
|
|
135
|
+
@apply inline-flex items-center justify-center
|
|
136
|
+
rounded-md font-medium
|
|
137
|
+
transition-colors
|
|
138
|
+
focus-visible:outline-none focus-visible:ring-2
|
|
139
|
+
focus-visible:ring-ring focus-visible:ring-offset-2
|
|
140
|
+
disabled:pointer-events-none disabled:opacity-50;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.btn-default {
|
|
144
|
+
@apply bg-primary text-primary-foreground
|
|
145
|
+
hover:bg-primary/90;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.btn-secondary {
|
|
149
|
+
@apply bg-secondary text-secondary-foreground
|
|
150
|
+
hover:bg-secondary/80;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.btn-outline {
|
|
154
|
+
@apply border border-input bg-background
|
|
155
|
+
hover:bg-accent hover:text-accent-foreground;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.btn-ghost {
|
|
159
|
+
@apply hover:bg-accent hover:text-accent-foreground;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.btn-destructive {
|
|
163
|
+
@apply bg-destructive text-destructive-foreground
|
|
164
|
+
hover:bg-destructive/90;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* Sizes */
|
|
168
|
+
.btn-sm { @apply h-8 px-3 text-xs; }
|
|
169
|
+
.btn-md { @apply h-10 px-4 text-sm; }
|
|
170
|
+
.btn-lg { @apply h-12 px-6 text-base; }
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Spacing Integration
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
// tailwind.config.ts
|
|
178
|
+
theme: {
|
|
179
|
+
extend: {
|
|
180
|
+
spacing: {
|
|
181
|
+
// Map to CSS variables if needed
|
|
182
|
+
'section': 'var(--spacing-section)',
|
|
183
|
+
'component': 'var(--spacing-component)',
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Animation Tokens
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
// tailwind.config.ts
|
|
193
|
+
theme: {
|
|
194
|
+
extend: {
|
|
195
|
+
transitionDuration: {
|
|
196
|
+
fast: '150ms',
|
|
197
|
+
normal: '200ms',
|
|
198
|
+
slow: '300ms',
|
|
199
|
+
},
|
|
200
|
+
keyframes: {
|
|
201
|
+
'accordion-down': {
|
|
202
|
+
from: { height: '0' },
|
|
203
|
+
to: { height: 'var(--radix-accordion-content-height)' },
|
|
204
|
+
},
|
|
205
|
+
'accordion-up': {
|
|
206
|
+
from: { height: 'var(--radix-accordion-content-height)' },
|
|
207
|
+
to: { height: '0' },
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
animation: {
|
|
211
|
+
'accordion-down': 'accordion-down 0.2s ease-out',
|
|
212
|
+
'accordion-up': 'accordion-up 0.2s ease-out',
|
|
213
|
+
},
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Dark Mode Toggle
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
// Toggle dark mode
|
|
222
|
+
function toggleDarkMode() {
|
|
223
|
+
document.documentElement.classList.toggle('dark')
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// System preference
|
|
227
|
+
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
228
|
+
document.documentElement.classList.add('dark')
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## shadcn/ui Alignment
|
|
233
|
+
|
|
234
|
+
This configuration aligns with shadcn/ui conventions:
|
|
235
|
+
|
|
236
|
+
- Same CSS variable naming
|
|
237
|
+
- Same HSL format
|
|
238
|
+
- Same color scale structure
|
|
239
|
+
- Compatible with `npx shadcn@latest add` commands
|
|
240
|
+
|
|
241
|
+
### Using with shadcn/ui
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
# Initialize (uses same token structure)
|
|
245
|
+
npx shadcn@latest init
|
|
246
|
+
|
|
247
|
+
# Add components (styled with these tokens)
|
|
248
|
+
npx shadcn@latest add button card input
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Components will automatically use your design system tokens.
|