@usevyre/ai-context 0.1.1 → 0.2.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/dist/anti-patterns.json +222 -0
- package/dist/cheat-sheets/accordion.md +25 -0
- package/dist/cheat-sheets/alert.md +35 -0
- package/dist/cheat-sheets/avatar.md +34 -0
- package/dist/cheat-sheets/badge.md +41 -0
- package/dist/cheat-sheets/breadcrumb.md +26 -0
- package/dist/cheat-sheets/button.md +63 -0
- package/dist/cheat-sheets/calendar.md +27 -0
- package/dist/cheat-sheets/card.md +37 -0
- package/dist/cheat-sheets/checkbox.md +32 -0
- package/dist/cheat-sheets/command.md +29 -0
- package/dist/cheat-sheets/dropdownmenu.md +25 -0
- package/dist/cheat-sheets/field.md +36 -0
- package/dist/cheat-sheets/index.md +34 -0
- package/dist/cheat-sheets/input.md +28 -0
- package/dist/cheat-sheets/label.md +22 -0
- package/dist/cheat-sheets/modal.md +33 -0
- package/dist/cheat-sheets/pagination.md +15 -0
- package/dist/cheat-sheets/popover.md +32 -0
- package/dist/cheat-sheets/progress.md +27 -0
- package/dist/cheat-sheets/select.md +32 -0
- package/dist/cheat-sheets/separator.md +26 -0
- package/dist/cheat-sheets/sheet.md +28 -0
- package/dist/cheat-sheets/sidebar.md +33 -0
- package/dist/cheat-sheets/skeleton.md +27 -0
- package/dist/cheat-sheets/slider.md +22 -0
- package/dist/cheat-sheets/switch.md +26 -0
- package/dist/cheat-sheets/table.md +28 -0
- package/dist/cheat-sheets/tabs.md +24 -0
- package/dist/cheat-sheets/toast.md +41 -0
- package/dist/cheat-sheets/tooltip.md +30 -0
- package/dist/cheat-sheets/typography.md +22 -0
- package/dist/claude-context.md +716 -40
- package/dist/copilot-instructions.md +716 -40
- package/dist/cursor-rules.md +255 -261
- package/dist/full-context.md +715 -40
- package/dist/index.js +5054 -584
- package/dist/schema.json +1278 -0
- package/dist/version-info.json +233 -0
- package/dist/windsurf-rules.md +716 -40
- package/package.json +6 -2
package/dist/cursor-rules.md
CHANGED
|
@@ -3,294 +3,288 @@ description: useVyre design system rules — follow these when writing UI code
|
|
|
3
3
|
alwaysApply: true
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# useVyre Design System —
|
|
7
|
-
# Version: 0.
|
|
8
|
-
# Include this file in your AI agent's system prompt, .cursor/rules, or CLAUDE.md
|
|
9
|
-
# Source: https://usevyre.com/ai-context
|
|
6
|
+
# useVyre Design System — Cursor Rules
|
|
7
|
+
# Version: 0.2.0
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
You are working in a project using the useVyre design system (@usevyre/react).
|
|
10
|
+
Follow these rules strictly when generating any UI code.
|
|
12
11
|
|
|
13
|
-
##
|
|
12
|
+
## Critical Rules
|
|
13
|
+
- NEVER use color/size values that are not in the valid prop lists below
|
|
14
|
+
- ALWAYS use semantic tokens (--vyre-color-semantic-*), never hardcode colors
|
|
15
|
+
- ALWAYS add aria-label to Button size="icon" (no visible text)
|
|
16
|
+
- NEVER render <Toast> directly — use useToast() hook
|
|
17
|
+
- NEVER use <Input type="search"> for search UI — use Command component
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
(variables) as its single source of truth, making it inherently AI-friendly — no magic,
|
|
17
|
-
no runtime transforms, just semantic token names that describe intent.
|
|
19
|
+
## Component Rules
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
## Accordion
|
|
22
|
+
Vertically stacked collapsible sections. Compose with AccordionItem, AccordionTrigger, AccordionContent.
|
|
23
|
+
Import: `import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from "@usevyre/react"`
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
Never do:
|
|
26
|
+
- ❌ Accordion without AccordionItem → ✅ Always compose: Accordion > AccordionItem > AccordionTrigger + AccordionContent
|
|
22
27
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
## Alert
|
|
29
|
+
Inline feedback message for info, success, warning, or danger states.
|
|
30
|
+
Import: `import { Alert } from "@usevyre/react"`
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
Valid props:
|
|
33
|
+
- variant: "info" | "success" | "warning" | "danger" [default: info]
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
Never do:
|
|
36
|
+
- ❌ variant="error" → ✅ Use variant="danger"
|
|
37
|
+
- ❌ variant="primary" → ✅ Use variant="info" | "success" | "warning" | "danger"
|
|
33
38
|
|
|
34
|
-
##
|
|
39
|
+
## Avatar
|
|
40
|
+
User profile image with fallback initials or icon.
|
|
41
|
+
Import: `import { Avatar } from "@usevyre/react"`
|
|
35
42
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
@import "@usevyre/react/styles"; /* component styles (React) */
|
|
40
|
-
/* or */
|
|
41
|
-
@import "@usevyre/vue/styles"; /* component styles (Vue) */
|
|
42
|
-
```
|
|
43
|
+
Valid props:
|
|
44
|
+
- size: "sm" | "md" | "lg" | "xl" [default: md]
|
|
45
|
+
- status: "online" | "offline" | "busy" | "away"
|
|
43
46
|
|
|
44
|
-
|
|
47
|
+
Never do:
|
|
48
|
+
- ❌ size="xs" → ✅ Use size="sm"
|
|
49
|
+
- ❌ size="2xl" → ✅ Use size="xl"
|
|
45
50
|
|
|
46
|
-
##
|
|
51
|
+
## Badge
|
|
52
|
+
Small label for status, category, or count. Use dot prop for live status indicator.
|
|
53
|
+
Import: `import { Badge } from "@usevyre/react"`
|
|
47
54
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
--vyre-[category]-[subcategory]-[variant]
|
|
51
|
-
```
|
|
55
|
+
Valid props:
|
|
56
|
+
- variant: "default" | "accent" | "teal" | "success" | "warning" | "danger" [default: default]
|
|
52
57
|
|
|
53
|
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
- `--vyre-typography-font-size-sm` ✅ 13px font size
|
|
58
|
+
Never do:
|
|
59
|
+
- ❌ variant="primary" → ✅ Use variant="accent" for brand color
|
|
60
|
+
- ❌ variant="error" → ✅ Use variant="danger"
|
|
61
|
+
- ❌ variant="info" → ✅ Use variant="teal" for info-like styling
|
|
58
62
|
|
|
59
|
-
|
|
63
|
+
## Breadcrumb
|
|
64
|
+
Navigation trail showing current page location in hierarchy.
|
|
65
|
+
Import: `import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbSeparator } from "@usevyre/react"`
|
|
60
66
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
### Surface layers (background → foreground)
|
|
64
|
-
- `--vyre-color-semantic-background` Page background. Deepest layer.
|
|
65
|
-
- `--vyre-color-semantic-surface` Cards, panels, sidebars.
|
|
66
|
-
- `--vyre-color-semantic-surface-raised` Dropdowns, inputs, elevated cards.
|
|
67
|
-
- `--vyre-color-semantic-surface-overlay` Modals, tooltips.
|
|
68
|
-
|
|
69
|
-
### Borders
|
|
70
|
-
- `--vyre-color-semantic-border-subtle` Dividers, subtle separators.
|
|
71
|
-
- `--vyre-color-semantic-border` Default card/input borders.
|
|
72
|
-
- `--vyre-color-semantic-border-strong` Focus rings, selected states.
|
|
73
|
-
|
|
74
|
-
### Text hierarchy
|
|
75
|
-
- `--vyre-color-semantic-text-primary` Headings, body text.
|
|
76
|
-
- `--vyre-color-semantic-text-secondary` Subtitles, descriptions.
|
|
77
|
-
- `--vyre-color-semantic-text-muted` Placeholders, helper text.
|
|
78
|
-
- `--vyre-color-semantic-text-disabled` Disabled state text.
|
|
79
|
-
- `--vyre-color-semantic-text-inverse` Text on light/accent backgrounds.
|
|
80
|
-
|
|
81
|
-
### Brand colors
|
|
82
|
-
- `--vyre-color-semantic-accent` Primary CTA, highlights. (amber)
|
|
83
|
-
- `--vyre-color-semantic-accent-hover` Hover for accent elements.
|
|
84
|
-
- `--vyre-color-semantic-accent-subtle` Low-opacity accent backgrounds.
|
|
85
|
-
- `--vyre-color-semantic-teal` Secondary accent. Code, success. (teal)
|
|
86
|
-
- `--vyre-color-semantic-teal-hover` Hover for teal elements.
|
|
87
|
-
- `--vyre-color-semantic-teal-subtle` Low-opacity teal backgrounds.
|
|
88
|
-
|
|
89
|
-
### Semantic status colors
|
|
90
|
-
- `--vyre-color-semantic-success` Confirmations, complete states.
|
|
91
|
-
- `--vyre-color-semantic-success-subtle` Success badge backgrounds.
|
|
92
|
-
- `--vyre-color-semantic-warning` Warnings, beta indicators.
|
|
93
|
-
- `--vyre-color-semantic-warning-subtle` Warning badge backgrounds.
|
|
94
|
-
- `--vyre-color-semantic-danger` Errors, destructive actions.
|
|
95
|
-
- `--vyre-color-semantic-danger-hover` Hover for danger elements.
|
|
96
|
-
- `--vyre-color-semantic-danger-subtle` Error badge backgrounds.
|
|
67
|
+
Never do:
|
|
68
|
+
- ❌ Using plain <a> tags inside Breadcrumb → ✅ Use BreadcrumbItem > BreadcrumbLink for each crumb
|
|
97
69
|
|
|
98
|
-
|
|
70
|
+
## Button
|
|
71
|
+
Triggers actions and navigation. The most commonly used interactive element.
|
|
72
|
+
Import: `import { Button } from "@usevyre/react"`
|
|
99
73
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
- `--vyre-typography-font-family-display` Headlines, hero text (serif)
|
|
104
|
-
- `--vyre-typography-font-family-body` UI text, labels, body copy (sans-serif)
|
|
105
|
-
- `--vyre-typography-font-family-mono` Code, tokens, technical text (monospace)
|
|
106
|
-
|
|
107
|
-
### Font sizes
|
|
108
|
-
- `--vyre-typography-font-size-2xs` 10px — tiny labels
|
|
109
|
-
- `--vyre-typography-font-size-xs` 11px — badge text, captions
|
|
110
|
-
- `--vyre-typography-font-size-sm` 13px — default UI text, buttons
|
|
111
|
-
- `--vyre-typography-font-size-md` 15px — body text
|
|
112
|
-
- `--vyre-typography-font-size-lg` 18px — large body, small headings
|
|
113
|
-
- `--vyre-typography-font-size-xl` 22px — section headings
|
|
114
|
-
- `--vyre-typography-font-size-2xl` 28px — page headings
|
|
115
|
-
- `--vyre-typography-font-size-3xl` 36px — large headings
|
|
116
|
-
- `--vyre-typography-font-size-4xl` 48px — hero headings
|
|
117
|
-
- `--vyre-typography-font-size-5xl` 64px — display headings
|
|
118
|
-
|
|
119
|
-
### Font weights
|
|
120
|
-
- `--vyre-typography-font-weight-light` 300
|
|
121
|
-
- `--vyre-typography-font-weight-regular` 400
|
|
122
|
-
- `--vyre-typography-font-weight-medium` 500
|
|
123
|
-
- `--vyre-typography-font-weight-semibold` 600
|
|
124
|
-
- `--vyre-typography-font-weight-bold` 700
|
|
74
|
+
Valid props:
|
|
75
|
+
- variant: "primary" | "secondary" | "ghost" | "accent" | "teal" | "danger" [default: secondary]
|
|
76
|
+
- size: "sm" | "md" | "lg" | "icon" [default: md]
|
|
125
77
|
|
|
126
|
-
|
|
78
|
+
Never do:
|
|
79
|
+
- ❌ variant="blue" → ✅ Use variant="accent" for brand amber, or variant="teal" for teal
|
|
80
|
+
- ❌ size="xl" → ✅ Use size="lg"
|
|
81
|
+
- ❌ color="..." → ✅ Use variant prop instead
|
|
82
|
+
- ❌ icon={...} → ✅ Use leftIcon={...} or rightIcon={...}
|
|
83
|
+
- ❌ size="icon" without aria-label → ✅ Add aria-label describing the action
|
|
127
84
|
|
|
128
|
-
##
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
- `--vyre-spacing-2` 8px
|
|
132
|
-
- `--vyre-spacing-3` 12px
|
|
133
|
-
- `--vyre-spacing-4` 16px
|
|
134
|
-
- `--vyre-spacing-5` 20px
|
|
135
|
-
- `--vyre-spacing-6` 24px
|
|
136
|
-
- `--vyre-spacing-8` 32px
|
|
137
|
-
- `--vyre-spacing-10` 40px
|
|
138
|
-
- `--vyre-spacing-12` 48px
|
|
139
|
-
- `--vyre-spacing-16` 64px
|
|
140
|
-
- `--vyre-spacing-20` 80px
|
|
141
|
-
- `--vyre-spacing-24` 96px
|
|
85
|
+
## Calendar
|
|
86
|
+
Date picker calendar widget for selecting single dates or ranges.
|
|
87
|
+
Import: `import { Calendar } from "@usevyre/react"`
|
|
142
88
|
|
|
143
|
-
|
|
89
|
+
Valid props:
|
|
144
90
|
|
|
145
|
-
|
|
91
|
+
Never do:
|
|
92
|
+
- ❌ Using Calendar for time selection → ✅ Combine with a separate time Input if time selection is needed
|
|
146
93
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
- `--vyre-border-radius-lg` 12px — cards, panels
|
|
151
|
-
- `--vyre-border-radius-xl` 16px — large cards
|
|
152
|
-
- `--vyre-border-radius-2xl` 24px — modals, sheets
|
|
153
|
-
- `--vyre-border-radius-full` 9999px — badges, pills, avatars
|
|
94
|
+
## Card
|
|
95
|
+
Content container with optional header, body, and footer sections.
|
|
96
|
+
Import: `import { Card, CardHeader, CardBody, CardFooter } from "@usevyre/react"`
|
|
154
97
|
|
|
155
|
-
|
|
98
|
+
Valid props:
|
|
99
|
+
- variant: "default" | "elevated" | "outlined" | "ghost" | "accent" [default: default]
|
|
156
100
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
### Button
|
|
160
|
-
|
|
161
|
-
```tsx
|
|
162
|
-
import { Button } from "@usevyre/react"
|
|
163
|
-
|
|
164
|
-
// Props:
|
|
165
|
-
// variant = "primary" | "secondary" | "ghost" | "accent" | "teal" | "danger"
|
|
166
|
-
// size = "sm" | "md" | "lg" | "icon"
|
|
167
|
-
// loading = boolean
|
|
168
|
-
// disabled = boolean
|
|
169
|
-
// as = React.ElementType (default: "button")
|
|
170
|
-
// leftIcon = ReactNode
|
|
171
|
-
// rightIcon = ReactNode
|
|
172
|
-
|
|
173
|
-
// Examples:
|
|
174
|
-
<Button variant="accent" size="lg">Get Started</Button>
|
|
175
|
-
<Button variant="ghost" size="sm">Cancel</Button>
|
|
176
|
-
<Button variant="danger" loading>Deleting...</Button>
|
|
177
|
-
<Button as="a" href="/docs" variant="secondary">Read Docs</Button>
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### Badge
|
|
181
|
-
|
|
182
|
-
```tsx
|
|
183
|
-
import { Badge } from "@usevyre/react"
|
|
184
|
-
|
|
185
|
-
// Props:
|
|
186
|
-
// variant = "default" | "accent" | "teal" | "success" | "warning" | "danger"
|
|
187
|
-
// dot = boolean (live status indicator dot)
|
|
188
|
-
|
|
189
|
-
// Examples:
|
|
190
|
-
<Badge variant="success" dot>Online</Badge>
|
|
191
|
-
<Badge variant="warning">Beta</Badge>
|
|
192
|
-
<Badge variant="danger">Error</Badge>
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
### Card
|
|
196
|
-
|
|
197
|
-
```tsx
|
|
198
|
-
import { Card, CardHeader, CardBody, CardFooter } from "@usevyre/react"
|
|
199
|
-
|
|
200
|
-
// Card props:
|
|
201
|
-
// variant = "default" | "elevated" | "outlined" | "ghost" | "accent"
|
|
202
|
-
// hoverable = boolean
|
|
203
|
-
// clickable = boolean
|
|
204
|
-
|
|
205
|
-
// Examples:
|
|
206
|
-
<Card variant="elevated">
|
|
207
|
-
<CardHeader>
|
|
208
|
-
<Badge variant="teal">New</Badge>
|
|
209
|
-
</CardHeader>
|
|
210
|
-
<CardBody>
|
|
211
|
-
<h3>Card Title</h3>
|
|
212
|
-
<p>Description text.</p>
|
|
213
|
-
</CardBody>
|
|
214
|
-
<CardFooter>
|
|
215
|
-
<Button variant="ghost" size="sm">Learn more</Button>
|
|
216
|
-
</CardFooter>
|
|
217
|
-
</Card>
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
### Field + Input + Textarea
|
|
221
|
-
|
|
222
|
-
```tsx
|
|
223
|
-
import { Field, Input, Textarea } from "@usevyre/react"
|
|
224
|
-
|
|
225
|
-
// Field props:
|
|
226
|
-
// label = string
|
|
227
|
-
// hint = string
|
|
228
|
-
// state = "idle" | "error" | "success" | "warning"
|
|
229
|
-
// required = boolean
|
|
230
|
-
|
|
231
|
-
// Input props:
|
|
232
|
-
// size = "sm" | "md" | "lg"
|
|
233
|
-
// leftElement = ReactNode
|
|
234
|
-
// rightElement = ReactNode
|
|
235
|
-
// + all native input props
|
|
236
|
-
|
|
237
|
-
// Examples:
|
|
238
|
-
<Field label="Email" state="error" hint="Invalid format">
|
|
239
|
-
<Input type="email" placeholder="you@example.com" />
|
|
240
|
-
</Field>
|
|
241
|
-
|
|
242
|
-
<Field label="Search">
|
|
243
|
-
<Input leftElement={<SearchIcon />} placeholder="Search..." />
|
|
244
|
-
</Field>
|
|
245
|
-
|
|
246
|
-
<Field label="Bio">
|
|
247
|
-
<Textarea rows={4} placeholder="Tell us about yourself..." />
|
|
248
|
-
</Field>
|
|
249
|
-
```
|
|
101
|
+
Never do:
|
|
102
|
+
- ❌ variant="primary" → ✅ Use variant="elevated" | "outlined" | "ghost" | "accent"
|
|
250
103
|
|
|
251
|
-
|
|
104
|
+
## Checkbox
|
|
105
|
+
Binary toggle for boolean form values.
|
|
106
|
+
Import: `import { Checkbox } from "@usevyre/react"`
|
|
252
107
|
|
|
253
|
-
|
|
108
|
+
Valid props:
|
|
109
|
+
- size: "sm" | "md" [default: md]
|
|
254
110
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
3. Text hierarchy: `text-primary` → `text-secondary` → `text-muted` → `text-disabled`
|
|
258
|
-
4. Interactive hover states: add `-hover` suffix to base token
|
|
259
|
-
5. Low-opacity backgrounds: use `-subtle` suffix tokens
|
|
260
|
-
6. Spacing: always use `--vyre-spacing-*` — never raw px values in component code
|
|
261
|
-
7. Transitions: use `--vyre-transition-duration-*` and `--vyre-transition-easing-*`
|
|
111
|
+
Never do:
|
|
112
|
+
- ❌ size="lg" → ✅ Use size="md"
|
|
262
113
|
|
|
263
|
-
|
|
114
|
+
## Command
|
|
115
|
+
Command palette / search dialog. Use for search-first navigation or quick actions.
|
|
116
|
+
Import: `import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandDialog } from "@usevyre/react"`
|
|
117
|
+
|
|
118
|
+
Never do:
|
|
119
|
+
- ❌ Using Input type="search" for search UI → ✅ Use Command + CommandInput + CommandList + CommandItem
|
|
120
|
+
|
|
121
|
+
## DropdownMenu
|
|
122
|
+
Contextual menu triggered by a button. Supports items, separators, checkbox items, radio groups, and sub-menus.
|
|
123
|
+
Import: `import { DropdownMenu, DropdownItem, DropdownSeparator, DropdownCheckboxItem, DropdownRadioGroup, DropdownRadioItem, DropdownSub } from "@usevyre/react"`
|
|
124
|
+
|
|
125
|
+
Valid props:
|
|
126
|
+
|
|
127
|
+
Never do:
|
|
128
|
+
- ❌ DropdownItem variant="primary" → ✅ Use variant="danger" for destructive items only
|
|
129
|
+
|
|
130
|
+
## Field
|
|
131
|
+
Form field wrapper providing label, hint text, and validation state for Input or Textarea.
|
|
132
|
+
Import: `import { Field, Input, Textarea } from "@usevyre/react"`
|
|
133
|
+
|
|
134
|
+
Valid props:
|
|
135
|
+
- state: "idle" | "error" | "success" | "warning" [default: idle]
|
|
136
|
+
|
|
137
|
+
Never do:
|
|
138
|
+
- ❌ Applying state prop directly to Input → ✅ Wrap Input in <Field state="error"> to apply validation styling
|
|
139
|
+
|
|
140
|
+
## Input
|
|
141
|
+
Text input field. Wrap in Field for labels and validation. Use leftElement/rightElement for icons.
|
|
142
|
+
Import: `import { Input } from "@usevyre/react"`
|
|
143
|
+
|
|
144
|
+
Valid props:
|
|
145
|
+
- size: "sm" | "md" | "lg" [default: md]
|
|
146
|
+
|
|
147
|
+
Never do:
|
|
148
|
+
- ❌ size="icon" → ✅ Use size="sm" | "md" | "lg"
|
|
149
|
+
- ❌ type="search" for search UI → ✅ Import Command from @usevyre/react for search palettes
|
|
150
|
+
|
|
151
|
+
## Label
|
|
152
|
+
Accessible form label. Associate with input via htmlFor.
|
|
153
|
+
Import: `import { Label } from "@usevyre/react"`
|
|
154
|
+
|
|
155
|
+
Valid props:
|
|
156
|
+
|
|
157
|
+
## Modal
|
|
158
|
+
Dialog overlay for confirmations, forms, or focused content.
|
|
159
|
+
Import: `import { Modal, ModalHeader, ModalBody, ModalFooter } from "@usevyre/react"`
|
|
160
|
+
|
|
161
|
+
Valid props:
|
|
162
|
+
- size: "sm" | "md" | "lg" | "full" [default: md]
|
|
163
|
+
|
|
164
|
+
Never do:
|
|
165
|
+
- ❌ size="xl" → ✅ Use size="lg" or size="full"
|
|
166
|
+
|
|
167
|
+
## Pagination
|
|
168
|
+
Page navigation for paginated lists or tables.
|
|
169
|
+
Import: `import { Pagination } from "@usevyre/react"`
|
|
170
|
+
|
|
171
|
+
Valid props:
|
|
172
|
+
|
|
173
|
+
## Popover
|
|
174
|
+
Floating content panel anchored to a trigger element. For simple labels use Tooltip instead.
|
|
175
|
+
Import: `import { Popover } from "@usevyre/react"`
|
|
176
|
+
|
|
177
|
+
Valid props:
|
|
178
|
+
- placement: "top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end" [default: bottom]
|
|
179
|
+
|
|
180
|
+
Never do:
|
|
181
|
+
- ❌ placement="top-center" → ✅ Use placement="top" for centered placement
|
|
182
|
+
|
|
183
|
+
## Progress
|
|
184
|
+
Visual progress indicator for tasks, uploads, or completion status.
|
|
185
|
+
Import: `import { Progress } from "@usevyre/react"`
|
|
186
|
+
|
|
187
|
+
Valid props:
|
|
188
|
+
- size: "sm" | "md" | "lg" [default: md]
|
|
189
|
+
- variant: "default" | "accent" | "teal" | "success" | "danger" [default: default]
|
|
190
|
+
|
|
191
|
+
Never do:
|
|
192
|
+
- ❌ value > 100 → ✅ Normalize your value to 0–100 range before passing
|
|
193
|
+
|
|
194
|
+
## Select
|
|
195
|
+
Dropdown for selecting one option from a list.
|
|
196
|
+
Import: `import { Select } from "@usevyre/react"`
|
|
197
|
+
|
|
198
|
+
Valid props:
|
|
199
|
+
- size: "sm" | "md" | "lg" [default: md]
|
|
200
|
+
|
|
201
|
+
Never do:
|
|
202
|
+
- ❌ Passing strings directly as children → ✅ Pass options={[{ value: 'a', label: 'Option A' }]}
|
|
203
|
+
|
|
204
|
+
## Separator
|
|
205
|
+
Horizontal or vertical divider line.
|
|
206
|
+
Import: `import { Separator } from "@usevyre/react"`
|
|
207
|
+
|
|
208
|
+
Valid props:
|
|
209
|
+
- orientation: "horizontal" | "vertical" [default: horizontal]
|
|
210
|
+
|
|
211
|
+
## Sheet
|
|
212
|
+
Side panel (drawer) that slides in from the edge. For forms, detail views, or settings.
|
|
213
|
+
Import: `import { Sheet, SheetHeader, SheetBody, SheetFooter } from "@usevyre/react"`
|
|
214
|
+
|
|
215
|
+
Valid props:
|
|
216
|
+
- size: "sm" | "md" | "lg" | "full" [default: md]
|
|
217
|
+
- side: "left" | "right" [default: right]
|
|
218
|
+
|
|
219
|
+
## Sidebar
|
|
220
|
+
App navigation sidebar. Use AppLayout as the root layout wrapper.
|
|
221
|
+
Import: `import { AppLayout, Sidebar, SidebarHeader, SidebarContent, SidebarSection, SidebarItem, SidebarFooter } from "@usevyre/react"`
|
|
222
|
+
|
|
223
|
+
Valid props:
|
|
224
|
+
- variant: "default" | "floating" [default: default]
|
|
225
|
+
|
|
226
|
+
## Skeleton
|
|
227
|
+
Loading placeholder that mimics the shape of content while data loads.
|
|
228
|
+
Import: `import { Skeleton } from "@usevyre/react"`
|
|
229
|
+
|
|
230
|
+
Valid props:
|
|
231
|
+
- variant: "rect" | "circle" | "text" [default: rect]
|
|
232
|
+
|
|
233
|
+
## Slider
|
|
234
|
+
Range input for selecting a numeric value within a range.
|
|
235
|
+
Import: `import { Slider } from "@usevyre/react"`
|
|
236
|
+
|
|
237
|
+
Valid props:
|
|
238
|
+
- size: "sm" | "md" [default: md]
|
|
239
|
+
|
|
240
|
+
## Switch
|
|
241
|
+
Toggle switch for boolean on/off settings.
|
|
242
|
+
Import: `import { Switch } from "@usevyre/react"`
|
|
243
|
+
|
|
244
|
+
Valid props:
|
|
245
|
+
- size: "sm" | "md" [default: md]
|
|
246
|
+
|
|
247
|
+
## Table
|
|
248
|
+
Data table with optional sorting. Compose with TableHeader, TableRow, TableCell.
|
|
249
|
+
Import: `import { Table, TableHead, TableBody, TableRow, TableHeader, TableCell } from "@usevyre/react"`
|
|
250
|
+
|
|
251
|
+
## Tabs
|
|
252
|
+
Tabbed navigation for switching between content panels.
|
|
253
|
+
Import: `import { Tabs, TabList, Tab, TabPanels, TabPanel } from "@usevyre/react"`
|
|
254
|
+
|
|
255
|
+
Valid props:
|
|
256
|
+
|
|
257
|
+
## Toast
|
|
258
|
+
Transient notification. Use the useToast hook to trigger toasts imperatively.
|
|
259
|
+
Import: `import { useToast, ToastProvider } from "@usevyre/react"`
|
|
260
|
+
|
|
261
|
+
Valid props:
|
|
262
|
+
- variant: "default" | "success" | "warning" | "danger" [default: default]
|
|
263
|
+
|
|
264
|
+
Never do:
|
|
265
|
+
- ❌ Rendering <Toast> directly in JSX → ✅ Use: const { toast } = useToast(); then toast({ title, variant })
|
|
266
|
+
- ❌ variant="error" → ✅ Use variant="danger"
|
|
267
|
+
- ❌ variant="info" → ✅ Use variant="default"
|
|
268
|
+
|
|
269
|
+
## Tooltip
|
|
270
|
+
Short label that appears on hover/focus. For rich content use Popover instead.
|
|
271
|
+
Import: `import { Tooltip } from "@usevyre/react"`
|
|
272
|
+
|
|
273
|
+
Valid props:
|
|
274
|
+
- placement: "top" | "bottom" | "left" | "right" [default: top]
|
|
275
|
+
|
|
276
|
+
Never do:
|
|
277
|
+
- ❌ Using Tooltip for rich content (forms, buttons, etc.) → ✅ Use Popover for rich interactive content
|
|
278
|
+
|
|
279
|
+
## Typography
|
|
280
|
+
Text rendering components with semantic scale. Includes Text, Heading, Lead, Code, Blockquote.
|
|
281
|
+
Import: `import { Text, Heading, Lead, Code, Blockquote } from "@usevyre/react"`
|
|
282
|
+
|
|
283
|
+
Never do:
|
|
284
|
+
- ❌ Using raw <h1>, <p> tags instead of Typography components → ✅ Use <Heading>, <Text>, <Lead> from @usevyre/react
|
|
285
|
+
|
|
286
|
+
## Token Rules
|
|
264
287
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
```tsx
|
|
269
|
-
<div style={{ display: "grid", gridTemplateColumns: "260px 1fr", minHeight: "100vh" }}>
|
|
270
|
-
<aside style={{ background: "var(--vyre-color-semantic-surface)", borderRight: "1px solid var(--vyre-color-semantic-border-subtle)" }}>
|
|
271
|
-
{/* sidebar content */}
|
|
272
|
-
</aside>
|
|
273
|
-
<main style={{ padding: "var(--vyre-spacing-12)" }}>
|
|
274
|
-
{/* main content */}
|
|
275
|
-
</main>
|
|
276
|
-
</div>
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
### Form with validation
|
|
280
|
-
```tsx
|
|
281
|
-
<form>
|
|
282
|
-
<Field label="Email" state={errors.email ? "error" : "idle"} hint={errors.email}>
|
|
283
|
-
<Input type="email" value={email} onChange={e => setEmail(e.target.value)} />
|
|
284
|
-
</Field>
|
|
285
|
-
<Button variant="accent" type="submit" loading={isSubmitting}>
|
|
286
|
-
Submit
|
|
287
|
-
</Button>
|
|
288
|
-
</form>
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
### Status badge with live indicator
|
|
292
|
-
```tsx
|
|
293
|
-
<Badge variant="success" dot>Live</Badge>
|
|
294
|
-
<Badge variant="danger" dot>Offline</Badge>
|
|
295
|
-
<Badge variant="warning">Beta</Badge>
|
|
296
|
-
```
|
|
288
|
+
Use --vyre-color-semantic-* for all colors. Never use primitive tokens.
|
|
289
|
+
Use --vyre-spacing-* for all spacing. Never use raw px in component code.
|
|
290
|
+
Use --vyre-border-radius-* for border radius.
|