omnidesign 1.0.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.
- package/LICENSE +21 -0
- package/QUICKREF.md +150 -0
- package/README.md +576 -0
- package/bin/cli.js +390 -0
- package/bin/detect-ide.js +50 -0
- package/bin/install.js +8 -0
- package/logo.jpg +0 -0
- package/package.json +84 -0
- package/recipes/components/README.md +29 -0
- package/recipes/components/agent-card.md +314 -0
- package/recipes/components/ai-chat.md +252 -0
- package/recipes/components/bento-grid.md +186 -0
- package/recipes/components/code-block.md +503 -0
- package/recipes/components/file-upload.md +483 -0
- package/recipes/components/forms.md +238 -0
- package/recipes/components/hero-section.md +161 -0
- package/recipes/components/navbar.md +214 -0
- package/recipes/components/prompt-input.md +293 -0
- package/recipes/components/thinking-indicator.md +372 -0
- package/recipes/motion/README.md +3 -0
- package/recipes/motion/motion-system.md +437 -0
- package/recipes/patterns/README.md +3 -0
- package/skills/aider/omnidesign.md +67 -0
- package/skills/amp/SKILL.md +114 -0
- package/skills/antigravity/SKILL.md +114 -0
- package/skills/claude/omnidesign.md +111 -0
- package/skills/continue/omnidesign.yaml +29 -0
- package/skills/cursor/omnidesign.md +110 -0
- package/skills/kilo/SKILL.md +114 -0
- package/skills/opencode/omnidesign.md +110 -0
- package/skills/vscode/package.json +66 -0
- package/skills/zed/omnidesign.json +7 -0
- package/tokens/motion/README.md +3 -0
- package/tokens/primitives/README.md +3 -0
- package/tokens/primitives/color.json +219 -0
- package/tokens/primitives/motion.json +56 -0
- package/tokens/primitives/radii.json +37 -0
- package/tokens/primitives/shadows.json +34 -0
- package/tokens/primitives/spacing.json +67 -0
- package/tokens/primitives/typography.json +127 -0
- package/tokens/semantic/README.md +3 -0
- package/tokens/semantic/color.json +114 -0
- package/tokens/semantic/motion.json +44 -0
- package/tokens/semantic/radii.json +29 -0
- package/tokens/semantic/shadows.json +24 -0
- package/tokens/semantic/spacing.json +69 -0
- package/tokens/semantic/typography.json +118 -0
- package/tokens/shadows/README.md +3 -0
- package/tokens/themes/README.md +3 -0
- package/tokens/themes/berry.json +143 -0
- package/tokens/themes/brutalist.json +143 -0
- package/tokens/themes/coral.json +143 -0
- package/tokens/themes/corporate.json +143 -0
- package/tokens/themes/cream.json +143 -0
- package/tokens/themes/cyberpunk.json +143 -0
- package/tokens/themes/daylight.json +143 -0
- package/tokens/themes/deep-space.json +143 -0
- package/tokens/themes/forest.json +143 -0
- package/tokens/themes/graphite.json +143 -0
- package/tokens/themes/lavender.json +143 -0
- package/tokens/themes/midnight.json +143 -0
- package/tokens/themes/mint.json +143 -0
- package/tokens/themes/navy.json +143 -0
- package/tokens/themes/noir.json +143 -0
- package/tokens/themes/obsidian.json +143 -0
- package/tokens/themes/ocean.json +143 -0
- package/tokens/themes/paper.json +143 -0
- package/tokens/themes/ruby.json +143 -0
- package/tokens/themes/slate.json +143 -0
- package/tokens/themes/snow.json +143 -0
- package/tokens/themes/solar.json +143 -0
- package/tokens/themes/spring.json +143 -0
- package/tokens/themes/starry-night.json +143 -0
- package/tokens/themes/sunset.json +143 -0
- package/tokens/typography/FONT_GUIDE.md +381 -0
- package/tokens/typography/README.md +37 -0
- package/tokens/typography/font-collection.json +221 -0
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
# Motion System
|
|
2
|
+
|
|
3
|
+
Comprehensive motion and animation guidelines including duration by interaction type, easing selection, reduced motion behavior, and animation choreography patterns.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
**Use motion for:**
|
|
8
|
+
- Providing feedback on user interactions (hover, click, focus)
|
|
9
|
+
- Guiding attention to important elements
|
|
10
|
+
- Indicating state changes (loading, success, error)
|
|
11
|
+
- Creating smooth transitions between states
|
|
12
|
+
- Enhancing perceived performance
|
|
13
|
+
|
|
14
|
+
**Don't use motion for:**
|
|
15
|
+
- Decorative animations without purpose
|
|
16
|
+
- Auto-playing animations (let user control)
|
|
17
|
+
- Rapid or flashing animations (accessibility risk)
|
|
18
|
+
- Animations that distract from content
|
|
19
|
+
- Animations on every interaction (reserve for important moments)
|
|
20
|
+
|
|
21
|
+
## Motion Tokens
|
|
22
|
+
|
|
23
|
+
### Duration
|
|
24
|
+
|
|
25
|
+
| Token | Value | Use Case |
|
|
26
|
+
|-------|-------|----------|
|
|
27
|
+
| `duration.fast` | 150ms | Hover feedback, quick state changes |
|
|
28
|
+
| `duration.normal` | 300ms | Standard transitions, element entry |
|
|
29
|
+
| `duration.slow` | 500ms | Page transitions, major layout changes |
|
|
30
|
+
| `duration.slowest` | 800ms | Cinematic animations, hero sections |
|
|
31
|
+
|
|
32
|
+
**Duration selection:**
|
|
33
|
+
- **Fast (150ms)**: Hover states, button feedback, subtle transitions
|
|
34
|
+
- **Normal (300ms)**: Element appearance, modal open, form validation
|
|
35
|
+
- **Slow (500ms)**: Page transitions, hero animations, major state changes
|
|
36
|
+
- **Slowest (800ms)**: Cinematic sequences, landing page animations
|
|
37
|
+
|
|
38
|
+
### Easing
|
|
39
|
+
|
|
40
|
+
| Token | Curve | Use Case |
|
|
41
|
+
|-------|-------|----------|
|
|
42
|
+
| `easing.easeOut` | Cubic Bezier (0.33, 0.66, 0.66, 1) | Elements appearing, entering viewport |
|
|
43
|
+
| `easing.easeIn` | Cubic Bezier (0.33, 0, 0.66, 0.33) | Elements disappearing, leaving viewport |
|
|
44
|
+
| `easing.easeInOut` | Cubic Bezier (0.42, 0, 0.58, 1) | Smooth, natural motion for page transitions |
|
|
45
|
+
| `easing.spring` | Spring physics (stiffness: 300, damping: 30) | Bouncy, playful interactions, emphasis |
|
|
46
|
+
|
|
47
|
+
**Easing selection:**
|
|
48
|
+
- **easeOut**: Use when element is appearing or entering (feels responsive)
|
|
49
|
+
- **easeIn**: Use when element is disappearing or leaving (feels natural)
|
|
50
|
+
- **easeInOut**: Use for continuous motion or page transitions (smooth)
|
|
51
|
+
- **spring**: Use for emphasis, playful feedback, or attention-grabbing
|
|
52
|
+
|
|
53
|
+
### Semantic Motion Tokens
|
|
54
|
+
|
|
55
|
+
| Token | Duration | Easing | Use Case |
|
|
56
|
+
|-------|----------|--------|----------|
|
|
57
|
+
| `motion.hover` | 150ms | easeOut | Hover states, button feedback |
|
|
58
|
+
| `motion.enter` | 300ms | easeOut | Elements appearing, modal open |
|
|
59
|
+
| `motion.exit` | 150ms | easeIn | Elements disappearing, modal close |
|
|
60
|
+
| `motion.page` | 500ms | easeInOut | Page transitions, major layout changes |
|
|
61
|
+
| `motion.spring` | 300ms | spring | Bouncy interactions, emphasis |
|
|
62
|
+
|
|
63
|
+
## Implementation Patterns
|
|
64
|
+
|
|
65
|
+
### Hover Feedback
|
|
66
|
+
|
|
67
|
+
**Pattern:**
|
|
68
|
+
```
|
|
69
|
+
Element at rest → User hovers → Subtle visual change (150ms easeOut)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Properties to animate:**
|
|
73
|
+
- Background color (primary → primary.hover)
|
|
74
|
+
- Scale (1 → 1.02 for lift effect)
|
|
75
|
+
- Shadow (shadow.card → shadow.card elevated)
|
|
76
|
+
- Opacity (100% → 100%, no change needed)
|
|
77
|
+
|
|
78
|
+
**Token usage:**
|
|
79
|
+
- Duration: `motion.hover` (150ms)
|
|
80
|
+
- Easing: `easing.easeOut`
|
|
81
|
+
- Properties: background-color, transform, box-shadow
|
|
82
|
+
|
|
83
|
+
**Example:**
|
|
84
|
+
```css
|
|
85
|
+
.button {
|
|
86
|
+
background-color: color.interactive.primary;
|
|
87
|
+
transition: background-color 150ms ease-out, transform 150ms ease-out;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.button:hover {
|
|
91
|
+
background-color: color.interactive.primary.hover;
|
|
92
|
+
transform: scale(1.02);
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Element Entry
|
|
97
|
+
|
|
98
|
+
**Pattern:**
|
|
99
|
+
```
|
|
100
|
+
Element hidden → Element appears → Fade in + slide up (300ms easeOut)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Properties to animate:**
|
|
104
|
+
- Opacity (0% → 100%)
|
|
105
|
+
- Transform (translateY(10px) → translateY(0))
|
|
106
|
+
- Scale (0.95 → 1)
|
|
107
|
+
|
|
108
|
+
**Token usage:**
|
|
109
|
+
- Duration: `motion.enter` (300ms)
|
|
110
|
+
- Easing: `easing.easeOut`
|
|
111
|
+
- Properties: opacity, transform
|
|
112
|
+
|
|
113
|
+
**Example:**
|
|
114
|
+
```css
|
|
115
|
+
@keyframes slideUp {
|
|
116
|
+
from {
|
|
117
|
+
opacity: 0;
|
|
118
|
+
transform: translateY(10px);
|
|
119
|
+
}
|
|
120
|
+
to {
|
|
121
|
+
opacity: 1;
|
|
122
|
+
transform: translateY(0);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.modal {
|
|
127
|
+
animation: slideUp 300ms ease-out;
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Element Exit
|
|
132
|
+
|
|
133
|
+
**Pattern:**
|
|
134
|
+
```
|
|
135
|
+
Element visible → User closes → Fade out + slide down (150ms easeIn)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Properties to animate:**
|
|
139
|
+
- Opacity (100% → 0%)
|
|
140
|
+
- Transform (translateY(0) → translateY(10px))
|
|
141
|
+
- Scale (1 → 0.95)
|
|
142
|
+
|
|
143
|
+
**Token usage:**
|
|
144
|
+
- Duration: `motion.exit` (150ms)
|
|
145
|
+
- Easing: `easing.easeIn`
|
|
146
|
+
- Properties: opacity, transform
|
|
147
|
+
|
|
148
|
+
**Example:**
|
|
149
|
+
```css
|
|
150
|
+
@keyframes slideDown {
|
|
151
|
+
from {
|
|
152
|
+
opacity: 1;
|
|
153
|
+
transform: translateY(0);
|
|
154
|
+
}
|
|
155
|
+
to {
|
|
156
|
+
opacity: 0;
|
|
157
|
+
transform: translateY(10px);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.modal.closing {
|
|
162
|
+
animation: slideDown 150ms ease-in;
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Page Transition
|
|
167
|
+
|
|
168
|
+
**Pattern:**
|
|
169
|
+
```
|
|
170
|
+
Page A visible → User navigates → Fade out (150ms) → Page B fades in (300ms)
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Properties to animate:**
|
|
174
|
+
- Opacity (100% → 0% → 100%)
|
|
175
|
+
- Scale (1 → 0.98 → 1)
|
|
176
|
+
|
|
177
|
+
**Token usage:**
|
|
178
|
+
- Duration: `motion.page` (500ms)
|
|
179
|
+
- Easing: `easing.easeInOut`
|
|
180
|
+
- Properties: opacity, transform
|
|
181
|
+
|
|
182
|
+
**Example:**
|
|
183
|
+
```css
|
|
184
|
+
@keyframes pageTransition {
|
|
185
|
+
0% {
|
|
186
|
+
opacity: 1;
|
|
187
|
+
transform: scale(1);
|
|
188
|
+
}
|
|
189
|
+
50% {
|
|
190
|
+
opacity: 0;
|
|
191
|
+
transform: scale(0.98);
|
|
192
|
+
}
|
|
193
|
+
100% {
|
|
194
|
+
opacity: 1;
|
|
195
|
+
transform: scale(1);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.page {
|
|
200
|
+
animation: pageTransition 500ms ease-in-out;
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Loading State
|
|
205
|
+
|
|
206
|
+
**Pattern:**
|
|
207
|
+
```
|
|
208
|
+
User submits form → Spinner appears → Button disabled → Success/Error feedback
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Properties to animate:**
|
|
212
|
+
- Spinner rotation (0deg → 360deg, continuous)
|
|
213
|
+
- Button opacity (100% → 80%)
|
|
214
|
+
- Button pointer-events (auto → none)
|
|
215
|
+
|
|
216
|
+
**Token usage:**
|
|
217
|
+
- Duration: `motion.hover` (150ms) for state change
|
|
218
|
+
- Easing: `easing.easeOut`
|
|
219
|
+
- Properties: opacity, pointer-events
|
|
220
|
+
|
|
221
|
+
**Example:**
|
|
222
|
+
```css
|
|
223
|
+
@keyframes spin {
|
|
224
|
+
from {
|
|
225
|
+
transform: rotate(0deg);
|
|
226
|
+
}
|
|
227
|
+
to {
|
|
228
|
+
transform: rotate(360deg);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.spinner {
|
|
233
|
+
animation: spin 1s linear infinite;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.button.loading {
|
|
237
|
+
opacity: 0.8;
|
|
238
|
+
pointer-events: none;
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Staggered List Animation
|
|
243
|
+
|
|
244
|
+
**Pattern:**
|
|
245
|
+
```
|
|
246
|
+
List appears → Each item fades in sequentially (50ms stagger)
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**Properties to animate:**
|
|
250
|
+
- Opacity (0% → 100%)
|
|
251
|
+
- Transform (translateY(10px) → translateY(0))
|
|
252
|
+
|
|
253
|
+
**Token usage:**
|
|
254
|
+
- Duration: `motion.enter` (300ms)
|
|
255
|
+
- Easing: `easing.easeOut`
|
|
256
|
+
- Stagger: 50ms between items
|
|
257
|
+
|
|
258
|
+
**Example:**
|
|
259
|
+
```css
|
|
260
|
+
@keyframes slideUp {
|
|
261
|
+
from {
|
|
262
|
+
opacity: 0;
|
|
263
|
+
transform: translateY(10px);
|
|
264
|
+
}
|
|
265
|
+
to {
|
|
266
|
+
opacity: 1;
|
|
267
|
+
transform: translateY(0);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.list-item {
|
|
272
|
+
animation: slideUp 300ms ease-out backwards;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.list-item:nth-child(1) { animation-delay: 0ms; }
|
|
276
|
+
.list-item:nth-child(2) { animation-delay: 50ms; }
|
|
277
|
+
.list-item:nth-child(3) { animation-delay: 100ms; }
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Reduced Motion Behavior
|
|
281
|
+
|
|
282
|
+
### Implementation
|
|
283
|
+
|
|
284
|
+
**Respect `prefers-reduced-motion` media query:**
|
|
285
|
+
```css
|
|
286
|
+
@media (prefers-reduced-motion: reduce) {
|
|
287
|
+
* {
|
|
288
|
+
animation-duration: 0.01ms !important;
|
|
289
|
+
animation-iteration-count: 1 !important;
|
|
290
|
+
transition-duration: 0.01ms !important;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**Alternative approach (per-component):**
|
|
296
|
+
```css
|
|
297
|
+
@media (prefers-reduced-motion: reduce) {
|
|
298
|
+
.button {
|
|
299
|
+
transition: none;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.spinner {
|
|
303
|
+
animation: none;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### React Implementation
|
|
309
|
+
|
|
310
|
+
**Detect reduced motion preference:**
|
|
311
|
+
```javascript
|
|
312
|
+
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
313
|
+
|
|
314
|
+
// Use in conditional rendering or state
|
|
315
|
+
const duration = prefersReducedMotion ? 0 : 300;
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Apply to animations:**
|
|
319
|
+
```javascript
|
|
320
|
+
const animationProps = prefersReducedMotion
|
|
321
|
+
? { animation: 'none' }
|
|
322
|
+
: { animation: 'slideUp 300ms ease-out' };
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## Animation Choreography
|
|
326
|
+
|
|
327
|
+
### Principle: Sequential Entrance
|
|
328
|
+
|
|
329
|
+
**Pattern:**
|
|
330
|
+
```
|
|
331
|
+
1. Background/container appears (fade in, 300ms)
|
|
332
|
+
2. Content fades in (300ms, 100ms delay)
|
|
333
|
+
3. CTA button scales in (300ms, 200ms delay)
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**Effect:** Creates sense of anticipation and guides user attention
|
|
337
|
+
|
|
338
|
+
**Token usage:**
|
|
339
|
+
- All animations use `motion.enter` (300ms, easeOut)
|
|
340
|
+
- Stagger with 100ms delays between elements
|
|
341
|
+
|
|
342
|
+
### Principle: Unified Exit
|
|
343
|
+
|
|
344
|
+
**Pattern:**
|
|
345
|
+
```
|
|
346
|
+
1. CTA button fades out (150ms)
|
|
347
|
+
2. Content fades out (150ms, 50ms delay)
|
|
348
|
+
3. Background fades out (150ms, 100ms delay)
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**Effect:** Feels cohesive and intentional
|
|
352
|
+
|
|
353
|
+
**Token usage:**
|
|
354
|
+
- All animations use `motion.exit` (150ms, easeIn)
|
|
355
|
+
- Stagger with 50ms delays
|
|
356
|
+
|
|
357
|
+
### Principle: Emphasis on Interaction
|
|
358
|
+
|
|
359
|
+
**Pattern:**
|
|
360
|
+
```
|
|
361
|
+
1. User hovers button → Scale up (150ms, spring)
|
|
362
|
+
2. User clicks button → Scale down (100ms, easeIn)
|
|
363
|
+
3. Loading state → Spinner rotates (continuous)
|
|
364
|
+
4. Success → Checkmark appears (300ms, spring)
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
**Effect:** Provides clear feedback at each step
|
|
368
|
+
|
|
369
|
+
**Token usage:**
|
|
370
|
+
- Hover: `motion.hover` (150ms, spring)
|
|
371
|
+
- Click: `motion.exit` (100ms, easeIn)
|
|
372
|
+
- Loading: Custom duration (1s, linear)
|
|
373
|
+
- Success: `motion.enter` (300ms, spring)
|
|
374
|
+
|
|
375
|
+
## Acceptance Criteria
|
|
376
|
+
|
|
377
|
+
- [ ] Hover animations use `motion.hover` token (150ms, easeOut)
|
|
378
|
+
- [ ] Element entry uses `motion.enter` token (300ms, easeOut)
|
|
379
|
+
- [ ] Element exit uses `motion.exit` token (150ms, easeIn)
|
|
380
|
+
- [ ] Page transitions use `motion.page` token (500ms, easeInOut)
|
|
381
|
+
- [ ] Spring animations use `motion.spring` token (300ms, spring easing)
|
|
382
|
+
- [ ] All animations respect `prefers-reduced-motion` media query
|
|
383
|
+
- [ ] No auto-playing animations (user-triggered only)
|
|
384
|
+
- [ ] No rapid animations (>3 per second)
|
|
385
|
+
- [ ] Staggered animations use 50-100ms delays between items
|
|
386
|
+
- [ ] Loading states show spinner with continuous rotation
|
|
387
|
+
- [ ] Success/error states use appropriate color tokens
|
|
388
|
+
- [ ] All animations use semantic motion tokens (not hardcoded values)
|
|
389
|
+
|
|
390
|
+
## Performance Considerations
|
|
391
|
+
|
|
392
|
+
### GPU Acceleration
|
|
393
|
+
|
|
394
|
+
**Use these properties for smooth 60fps animations:**
|
|
395
|
+
- `transform` (translate, rotate, scale)
|
|
396
|
+
- `opacity`
|
|
397
|
+
|
|
398
|
+
**Avoid these properties (cause repaints):**
|
|
399
|
+
- `width`, `height`, `left`, `top`
|
|
400
|
+
- `margin`, `padding`
|
|
401
|
+
- `background-color` (use opacity + background instead)
|
|
402
|
+
|
|
403
|
+
### Optimization
|
|
404
|
+
|
|
405
|
+
**Best practices:**
|
|
406
|
+
- Use `will-change: transform` for animated elements
|
|
407
|
+
- Use `transform: translateZ(0)` to force GPU acceleration
|
|
408
|
+
- Limit simultaneous animations (max 3-4 per screen)
|
|
409
|
+
- Use `requestAnimationFrame` for custom animations
|
|
410
|
+
- Debounce scroll/resize listeners
|
|
411
|
+
|
|
412
|
+
**Example:**
|
|
413
|
+
```css
|
|
414
|
+
.animated-element {
|
|
415
|
+
will-change: transform;
|
|
416
|
+
transform: translateZ(0);
|
|
417
|
+
}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
## Accessibility
|
|
421
|
+
|
|
422
|
+
### Motion Sensitivity
|
|
423
|
+
- Respect `prefers-reduced-motion: reduce` for users with vestibular disorders
|
|
424
|
+
- Provide instant state changes when reduced motion is preferred
|
|
425
|
+
- Test with actual users who have motion sensitivity
|
|
426
|
+
|
|
427
|
+
### Clarity
|
|
428
|
+
- Use motion to clarify, not confuse
|
|
429
|
+
- Avoid rapid or flashing animations
|
|
430
|
+
- Ensure motion doesn't obscure content
|
|
431
|
+
- Provide alternative feedback (color, icon) in addition to motion
|
|
432
|
+
|
|
433
|
+
### Testing
|
|
434
|
+
- Test animations on low-end devices (60fps target)
|
|
435
|
+
- Test with `prefers-reduced-motion` enabled
|
|
436
|
+
- Test with screen readers (ensure motion doesn't interfere)
|
|
437
|
+
- Test on actual mobile devices for performance
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# OmniDesign Conventions
|
|
2
|
+
|
|
3
|
+
Design system guidelines for AI-assisted development.
|
|
4
|
+
|
|
5
|
+
## Token-First Development
|
|
6
|
+
|
|
7
|
+
Always use design tokens instead of hardcoded values:
|
|
8
|
+
|
|
9
|
+
✅ **DO:**
|
|
10
|
+
```css
|
|
11
|
+
.button {
|
|
12
|
+
background: var(--color-interactive-primary);
|
|
13
|
+
padding: var(--spacing-md);
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
❌ **DON'T:**
|
|
18
|
+
```css
|
|
19
|
+
.button {
|
|
20
|
+
background: #2563EB;
|
|
21
|
+
padding: 16px;
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 25 Themes Available
|
|
26
|
+
|
|
27
|
+
Professional: corporate, navy, slate, forest, ruby, graphite
|
|
28
|
+
Creative: sunset, ocean, berry, mint, coral, lavender
|
|
29
|
+
Dark: midnight, noir, cyberpunk, obsidian, deep-space, brutalist
|
|
30
|
+
Light: daylight, paper, cream, snow, spring, solar
|
|
31
|
+
Specialty: starry-night
|
|
32
|
+
|
|
33
|
+
## Component Patterns
|
|
34
|
+
|
|
35
|
+
### Chat Interface
|
|
36
|
+
- Use semantic tokens for message bubbles
|
|
37
|
+
- Support streaming states with thinking indicators
|
|
38
|
+
- Include copy/regenerate actions
|
|
39
|
+
|
|
40
|
+
### Forms
|
|
41
|
+
- Use `color-surface-sunken` for inputs
|
|
42
|
+
- Use `color-border-default` for borders
|
|
43
|
+
- Show validation with `color-status-error`
|
|
44
|
+
|
|
45
|
+
### Cards
|
|
46
|
+
- Use `color-surface-raised` for background
|
|
47
|
+
- Use `shadow-card` for elevation
|
|
48
|
+
- Use `radii-lg` for border radius
|
|
49
|
+
|
|
50
|
+
## Accessibility Requirements
|
|
51
|
+
|
|
52
|
+
- Minimum 4.5:1 contrast ratio for text
|
|
53
|
+
- Focus rings with `shadow-focus`
|
|
54
|
+
- Keyboard navigation support
|
|
55
|
+
- Screen reader labels
|
|
56
|
+
|
|
57
|
+
## Font Usage
|
|
58
|
+
|
|
59
|
+
- UI: Geist Sans or Inter
|
|
60
|
+
- Code: JetBrains Mono or Fira Code
|
|
61
|
+
- Display: Space Grotesk or Clash Display
|
|
62
|
+
- Dev Tools: JetBrainsMono Nerd Font
|
|
63
|
+
|
|
64
|
+
## Resources
|
|
65
|
+
|
|
66
|
+
- Docs: https://omnidesign.dev
|
|
67
|
+
- Quick Ref: See QUICKREF.md
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: omnidesign
|
|
3
|
+
description: Universal design system with 25 themes, 40+ fonts, and AI industry components
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility:
|
|
6
|
+
product: amp-code
|
|
7
|
+
systems: [node, npm]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# OmniDesign Skill
|
|
11
|
+
|
|
12
|
+
You are an expert in the OmniDesign design system. Use these guidelines when helping users build web applications.
|
|
13
|
+
|
|
14
|
+
## Design Tokens Available
|
|
15
|
+
|
|
16
|
+
### Colors (Semantic)
|
|
17
|
+
- `color.text.default` — Primary text
|
|
18
|
+
- `color.text.muted` — Secondary text
|
|
19
|
+
- `color.text.inverted` — Text on dark surfaces
|
|
20
|
+
- `color.surface.default` — Default background
|
|
21
|
+
- `color.surface.raised` — Cards, elevated surfaces
|
|
22
|
+
- `color.surface.sunken` — Inputs, depressed surfaces
|
|
23
|
+
- `color.interactive.primary` — Buttons, links
|
|
24
|
+
- `color.interactive.primary.hover` — Hover states
|
|
25
|
+
- `color.status.success` — Success states
|
|
26
|
+
- `color.status.warning` — Warning states
|
|
27
|
+
- `color.status.error` — Error states
|
|
28
|
+
|
|
29
|
+
### Spacing
|
|
30
|
+
- `spacing.4` (4px), `spacing.8` (8px), `spacing.16` (16px)
|
|
31
|
+
- `spacing.24` (24px), `spacing.32` (32px), `spacing.48` (48px)
|
|
32
|
+
- `spacing.64` (64px)
|
|
33
|
+
|
|
34
|
+
### Typography
|
|
35
|
+
- Font families: Geist Sans, Inter, JetBrains Mono, Space Grotesk
|
|
36
|
+
- Sizes: 2xs (10px) through 9xl (128px)
|
|
37
|
+
- Weights: thin (100) through black (900)
|
|
38
|
+
|
|
39
|
+
### Shadows
|
|
40
|
+
- `shadow.card` — Cards, buttons
|
|
41
|
+
- `shadow.dropdown` — Dropdowns, popovers
|
|
42
|
+
- `shadow.modal` — Modals, dialogs
|
|
43
|
+
- `shadow.focus` — Focus rings
|
|
44
|
+
|
|
45
|
+
## 25 Themes Available
|
|
46
|
+
|
|
47
|
+
**Professional:** corporate, navy, slate, forest, ruby, graphite
|
|
48
|
+
**Creative:** sunset, ocean, berry, mint, coral, lavender
|
|
49
|
+
**Dark:** midnight, noir, cyberpunk, obsidian, deep-space, brutalist
|
|
50
|
+
**Light:** daylight, paper, cream, snow, spring, solar
|
|
51
|
+
**Specialty:** starry-night
|
|
52
|
+
|
|
53
|
+
Apply themes via: `data-theme="theme-name"` on html element
|
|
54
|
+
|
|
55
|
+
## AI Industry Components
|
|
56
|
+
|
|
57
|
+
When building AI-powered applications, use these patterns:
|
|
58
|
+
|
|
59
|
+
### Chat Interface
|
|
60
|
+
- Message bubbles with markdown support
|
|
61
|
+
- Code blocks with syntax highlighting
|
|
62
|
+
- Streaming/thinking indicators
|
|
63
|
+
- Copy/regenerate actions
|
|
64
|
+
|
|
65
|
+
### Prompt Input
|
|
66
|
+
- Autocomplete suggestions
|
|
67
|
+
- Token counter
|
|
68
|
+
- Modifier chips (--ar, --v, --style)
|
|
69
|
+
|
|
70
|
+
### Agent Cards
|
|
71
|
+
- Status indicators (online/busy/offline)
|
|
72
|
+
- Capability tags
|
|
73
|
+
- One-click selection
|
|
74
|
+
|
|
75
|
+
## Best Practices
|
|
76
|
+
|
|
77
|
+
1. **Always use tokens** — Never hardcode colors, spacing, or fonts
|
|
78
|
+
2. **Test multiple themes** — Components should work across all 25 themes
|
|
79
|
+
3. **Follow accessibility** — WCAG 2.1 AA minimum
|
|
80
|
+
4. **Use Nerd Fonts for dev tools** — Icons + code in one font
|
|
81
|
+
5. **Match semantic tokens to context** — Use `text-muted` for secondary text
|
|
82
|
+
|
|
83
|
+
## Quick Examples
|
|
84
|
+
|
|
85
|
+
```css
|
|
86
|
+
/* Card component */
|
|
87
|
+
.card {
|
|
88
|
+
background: var(--color-surface-raised);
|
|
89
|
+
border-radius: var(--radii-lg);
|
|
90
|
+
padding: var(--spacing-lg);
|
|
91
|
+
box-shadow: var(--shadow-card);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* Button */
|
|
95
|
+
.button {
|
|
96
|
+
background: var(--color-interactive-primary);
|
|
97
|
+
color: var(--color-text-inverted);
|
|
98
|
+
padding: var(--spacing-sm) var(--spacing-md);
|
|
99
|
+
border-radius: var(--radii-md);
|
|
100
|
+
font-family: var(--font-sans);
|
|
101
|
+
font-weight: var(--font-weight-medium);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.button:hover {
|
|
105
|
+
background: var(--color-interactive-primary-hover);
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Resources
|
|
110
|
+
|
|
111
|
+
- Full docs: https://omnidesign.dev
|
|
112
|
+
- Quick ref: See QUICKREF.md
|
|
113
|
+
- Themes: Run `npm run themes:list`
|
|
114
|
+
- Fonts: Run `npm run fonts:list`
|