@auronui/vue 1.1.0 → 1.1.1

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 (45) hide show
  1. package/ai-rules.md +884 -0
  2. package/bin/setup-ai.mjs +74 -0
  3. package/dist/cjs/index.cjs +1003 -891
  4. package/dist/cjs/index.cjs.map +1 -1
  5. package/dist/components/checkbox/Checkbox.js.map +1 -1
  6. package/dist/components/checkbox/Checkbox.vue_vue_type_script_setup_true_lang.js +8 -0
  7. package/dist/components/checkbox/Checkbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  8. package/dist/components/checkbox/CheckboxGroup.js.map +1 -1
  9. package/dist/components/checkbox/CheckboxGroup.vue_vue_type_script_setup_true_lang.js +17 -2
  10. package/dist/components/checkbox/CheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  11. package/dist/components/checkbox/checkbox-group.context.js.map +1 -1
  12. package/dist/components/date-picker/DatePicker.js.map +1 -1
  13. package/dist/components/date-picker/DatePicker.vue_vue_type_script_setup_true_lang.js +9 -3
  14. package/dist/components/date-picker/DatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  15. package/dist/components/date-range-picker/DateRangePicker.js.map +1 -1
  16. package/dist/components/date-range-picker/DateRangePicker.vue_vue_type_script_setup_true_lang.js +9 -3
  17. package/dist/components/date-range-picker/DateRangePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  18. package/dist/components/date-time-picker/DateTimePicker.js.map +1 -1
  19. package/dist/components/date-time-picker/DateTimePicker.vue_vue_type_script_setup_true_lang.js +9 -3
  20. package/dist/components/date-time-picker/DateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/components/form/validation.js +1 -1
  22. package/dist/components/form/validation.js.map +1 -1
  23. package/dist/components/modal/ModalContent.vue_vue_type_script_setup_true_lang.js +1 -1
  24. package/dist/components/popover/PopoverContent.js.map +1 -1
  25. package/dist/components/popover/PopoverContent.vue_vue_type_script_setup_true_lang.js +46 -34
  26. package/dist/components/popover/PopoverContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  27. package/dist/components/radio/Radio.js.map +1 -1
  28. package/dist/components/radio/Radio.vue_vue_type_script_setup_true_lang.js +9 -1
  29. package/dist/components/radio/Radio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/components/radio/RadioGroup.js.map +1 -1
  31. package/dist/components/radio/RadioGroup.vue_vue_type_script_setup_true_lang.js +14 -2
  32. package/dist/components/radio/RadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/components/radio/radio-group.context.js.map +1 -1
  34. package/dist/components/switch/Switch.js.map +1 -1
  35. package/dist/components/switch/Switch.vue_vue_type_script_setup_true_lang.js +8 -0
  36. package/dist/components/switch/Switch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/components/switch/SwitchGroup.js.map +1 -1
  38. package/dist/components/switch/SwitchGroup.vue_vue_type_script_setup_true_lang.js +17 -2
  39. package/dist/components/switch/SwitchGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/switch/switch-group.context.js.map +1 -1
  41. package/dist/components/tooltip/TooltipContent.js.map +1 -1
  42. package/dist/components/tooltip/TooltipContent.vue_vue_type_script_setup_true_lang.js +46 -34
  43. package/dist/components/tooltip/TooltipContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  44. package/dist/index.d.ts +78 -20
  45. package/package.json +9 -3
package/ai-rules.md ADDED
@@ -0,0 +1,884 @@
1
+ # AuronUI Rules for AI Assistants
2
+
3
+ > `@auronui/vue` — 85+ accessible Vue 3 components built on Reka UI, Tailwind CSS 4.
4
+ > **These rules override default code generation behavior.**
5
+ > When generating Vue code for a project using `@auronui/vue`, follow every rule below exactly.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ pnpm add @auronui/vue vue@^3.5.0 reka-ui@^2.9.0 @vueuse/core@^14.0.0
11
+ ```
12
+
13
+ Import the stylesheet once in your app entry:
14
+
15
+ ```ts
16
+ import '@auronui/vue/style'
17
+ ```
18
+
19
+ ## Rules
20
+
21
+ 1. **NEVER use raw HTML elements** when an AuronUI component covers the use case
22
+ 2. **NEVER write** `<button>`, `<input>`, `<textarea>`, `<select>`, `<dialog>`, `<a>`, `<label>`, `<kbd>`, `<hr>`, `<progress>`, `<details>`, `<summary>`
23
+ 3. **ALWAYS import from `@auronui/vue`** — never import directly from `reka-ui`
24
+ 4. **ALWAYS use `v-model`** — never wire `:value` + `@input` manually
25
+ 5. **ALWAYS use component `variant`/`color`/`size` props** instead of raw Tailwind utility classes on interactive elements. Use `classNames` slot props only for layout/spacing adjustments
26
+ 6. **ALWAYS use compound sub-components** — e.g. `<Modal>` requires `<ModalContent>`, `<ModalHeader>`, etc.; never use the root component alone when a compound structure is defined
27
+
28
+ ## HTML → Component Substitution Table
29
+
30
+ | Raw HTML | Use instead |
31
+ |---------------------------|--------------------------|
32
+ | `<button>` | `<Button>` |
33
+ | `<input>` | `<Input>` |
34
+ | `<textarea>` | `<Textarea>` |
35
+ | `<select>` + `<option>` | `<Select>` compound |
36
+ | `<dialog>` | `<Modal>` compound |
37
+ | `<a>` (navigation) | `<Link>` |
38
+ | `<label>` | `<Label>` |
39
+ | `<kbd>` | `<Kbd>` |
40
+ | `<hr>` | `<Separator>` |
41
+ | `<progress>` | `<ProgressBar>` |
42
+ | `<details>`/`<summary>` | `<Collapsible>` compound |
43
+
44
+ ## Anti-Patterns
45
+
46
+ ### 1. Raw button instead of Button
47
+
48
+ ```vue
49
+ <!-- ❌ Never -->
50
+ <button class="bg-primary-500 px-4 py-2 rounded-lg text-white font-medium" @click="save">
51
+ Save
52
+ </button>
53
+
54
+ <!-- ✅ Always -->
55
+ <Button color="primary" @click="save">Save</Button>
56
+ ```
57
+
58
+ ### 2. Raw input with manual v-model wiring
59
+
60
+ ```vue
61
+ <!-- ❌ Never -->
62
+ <input
63
+ type="email"
64
+ :value="email"
65
+ @input="email = ($event.target as HTMLInputElement).value"
66
+ class="border border-gray-300 rounded px-3 py-2 w-full"
67
+ placeholder="you@example.com"
68
+ />
69
+
70
+ <!-- ✅ Always -->
71
+ <Input v-model="email" type="email" label="Email" placeholder="you@example.com" />
72
+ ```
73
+
74
+ ### 3. Importing from reka-ui directly
75
+
76
+ ```ts
77
+ // ❌ Never
78
+ import { Button } from 'reka-ui'
79
+ import { DialogRoot, DialogContent } from 'reka-ui'
80
+
81
+ // ✅ Always
82
+ import { Button, Modal, ModalContent } from '@auronui/vue'
83
+ ```
84
+
85
+ ### 4. Raw Tailwind on interactive elements
86
+
87
+ ```vue
88
+ <!-- ❌ Never — bypasses design system -->
89
+ <Button class="bg-red-500 hover:bg-red-600 active:bg-red-700 text-white">Delete</Button>
90
+
91
+ <!-- ✅ Always — use the color prop -->
92
+ <Button color="danger">Delete</Button>
93
+ ```
94
+
95
+ ### 5. dialog element instead of Modal
96
+
97
+ ```vue
98
+ <!-- ❌ Never -->
99
+ <dialog :open="isOpen">
100
+ <h2>Confirm Delete</h2>
101
+ <p>This action cannot be undone.</p>
102
+ <button @click="isOpen = false">Cancel</button>
103
+ <button @click="handleDelete">Delete</button>
104
+ </dialog>
105
+
106
+ <!-- ✅ Always -->
107
+ <Modal v-model:open="isOpen">
108
+ <ModalContent>
109
+ <ModalHeader>
110
+ <ModalTitle>Confirm Delete</ModalTitle>
111
+ </ModalHeader>
112
+ <ModalBody>This action cannot be undone.</ModalBody>
113
+ <ModalFooter>
114
+ <Button variant="ghost" @click="isOpen = false">Cancel</Button>
115
+ <Button color="danger" @click="handleDelete">Delete</Button>
116
+ </ModalFooter>
117
+ </ModalContent>
118
+ </Modal>
119
+ ```
120
+
121
+ ### 6. select + option instead of Select
122
+
123
+ ```vue
124
+ <!-- ❌ Never -->
125
+ <select v-model="country">
126
+ <option value="">Select country</option>
127
+ <option value="us">United States</option>
128
+ <option value="gb">United Kingdom</option>
129
+ </select>
130
+
131
+ <!-- ✅ Always -->
132
+ <Select v-model="country" label="Country" placeholder="Select country">
133
+ <SelectTrigger />
134
+ <SelectContent>
135
+ <SelectItem value="us">United States</SelectItem>
136
+ <SelectItem value="gb">United Kingdom</SelectItem>
137
+ </SelectContent>
138
+ </Select>
139
+ ```
140
+
141
+ ### 7. hr instead of Separator
142
+
143
+ ```vue
144
+ <!-- ❌ Never -->
145
+ <hr class="my-4 border-gray-200" />
146
+
147
+ <!-- ✅ Always -->
148
+ <Separator />
149
+ ```
150
+
151
+ ### 8. progress instead of ProgressBar
152
+
153
+ ```vue
154
+ <!-- ❌ Never -->
155
+ <progress :value="upload.progress" :max="100" class="w-full"></progress>
156
+
157
+ <!-- ✅ Always -->
158
+ <ProgressBar :value="upload.progress" :max="100" label="Upload progress" />
159
+ ```
160
+
161
+ ### 9. details/summary instead of Collapsible
162
+
163
+ ```vue
164
+ <!-- ❌ Never -->
165
+ <details>
166
+ <summary class="cursor-pointer font-medium">Advanced options</summary>
167
+ <div class="mt-2">Hidden content</div>
168
+ </details>
169
+
170
+ <!-- ✅ Always -->
171
+ <Collapsible>
172
+ <CollapsibleTrigger as-child>
173
+ <Button variant="ghost">Advanced options</Button>
174
+ </CollapsibleTrigger>
175
+ <CollapsibleContent>Hidden content</CollapsibleContent>
176
+ </Collapsible>
177
+ ```
178
+
179
+ ---
180
+
181
+ ## Components
182
+
183
+ ### Presentational
184
+
185
+ **Spinner** — loading indicator
186
+ ```vue
187
+ <Spinner size="md" color="primary" />
188
+ <!-- size: xs | sm | md | lg | xl -->
189
+ <!-- color: default | primary | secondary | success | warning | danger | current -->
190
+ ```
191
+
192
+ **Skeleton** — loading placeholder
193
+ ```vue
194
+ <Skeleton class="h-8 w-32 rounded-lg" />
195
+ ```
196
+
197
+ **Separator** — horizontal or vertical dividing line
198
+ ```vue
199
+ <Separator orientation="horizontal" />
200
+ ```
201
+
202
+ **Badge** — small status label
203
+ ```vue
204
+ <Badge variant="solid" color="primary">New</Badge>
205
+ <!-- variant: solid | flat | outline -->
206
+ <!-- color: default | primary | secondary | success | warning | danger -->
207
+ ```
208
+
209
+ **Chip** — closeable tag/filter pill
210
+ ```vue
211
+ <Chip variant="flat" color="primary" @close="remove">Label</Chip>
212
+ ```
213
+
214
+ **Text** — semantic text with size/weight variants
215
+ ```vue
216
+ <Text size="sm" weight="medium">Hello</Text>
217
+ ```
218
+
219
+ **Label** — accessible form label
220
+ ```vue
221
+ <Label for="email">Email</Label>
222
+ ```
223
+
224
+ **Kbd** — keyboard shortcut display
225
+ ```vue
226
+ <Kbd>⌘K</Kbd>
227
+ ```
228
+
229
+ **Avatar** — user avatar with image + fallback initials
230
+ ```vue
231
+ <Avatar src="/user.jpg" name="Jane Doe" size="md" />
232
+ <AvatarGroup :max="3">
233
+ <Avatar name="Alice" />
234
+ <Avatar name="Bob" />
235
+ </AvatarGroup>
236
+ ```
237
+
238
+ **Card** — content container with optional header/body/footer slots
239
+ ```vue
240
+ <Card>
241
+ <CardHeader>Title</CardHeader>
242
+ <CardBody>Content</CardBody>
243
+ <CardFooter>Actions</CardFooter>
244
+ </Card>
245
+ ```
246
+
247
+ **EmptyState** — zero-data placeholder
248
+ ```vue
249
+ <EmptyState>
250
+ <EmptyStateContent>No results found</EmptyStateContent>
251
+ </EmptyState>
252
+ ```
253
+
254
+ ---
255
+
256
+ ### Buttons & Actions
257
+
258
+ **Button** — primary interactive element
259
+ ```vue
260
+ <Button variant="solid" color="primary" size="md" radius="md" @click="handle">
261
+ Click me
262
+ </Button>
263
+ <!-- variant: solid | bordered | light | flat | faded | shadow | ghost -->
264
+ <!-- color: default | primary | secondary | success | warning | danger -->
265
+ <!-- size: xs | sm | md | lg | xl -->
266
+ <!-- radius: none | sm | md | lg | full -->
267
+ <!-- isIconOnly: boolean — square icon button -->
268
+ <!-- isLoading: boolean — shows spinner -->
269
+ <!-- fullWidth: boolean -->
270
+ <!-- disabled: boolean -->
271
+ ```
272
+
273
+ **ButtonGroup** — group of related buttons
274
+ ```vue
275
+ <ButtonGroup variant="bordered" size="sm">
276
+ <Button>Left</Button>
277
+ <Button>Middle</Button>
278
+ <Button>Right</Button>
279
+ </ButtonGroup>
280
+ ```
281
+
282
+ **ToggleButton** — pressable on/off button
283
+ ```vue
284
+ <ToggleButton v-model="pressed">Bold</ToggleButton>
285
+ ```
286
+
287
+ **ToggleButtonGroup** — single/multiple selection from button set
288
+ ```vue
289
+ <ToggleButtonGroup v-model="selected" selection-mode="single">
290
+ <ToggleButton value="left">Left</ToggleButton>
291
+ <ToggleButton value="center">Center</ToggleButton>
292
+ <ToggleButton value="right">Right</ToggleButton>
293
+ </ToggleButtonGroup>
294
+ ```
295
+
296
+ **CloseButton** — accessible × dismiss button
297
+ ```vue
298
+ <CloseButton @click="close" />
299
+ ```
300
+
301
+ **Link** — accessible anchor element
302
+ ```vue
303
+ <Link href="/docs">Read the docs</Link>
304
+ ```
305
+
306
+ ---
307
+
308
+ ### Form Inputs
309
+
310
+ **Input** — text field with floating label, validation, and clear button
311
+ ```vue
312
+ <Input
313
+ v-model="value"
314
+ label="Email"
315
+ type="email"
316
+ placeholder="you@example.com"
317
+ :is-required="true"
318
+ :is-invalid="!!error"
319
+ :error-message="error"
320
+ />
321
+ <!-- variant: flat | bordered | faded | underlined -->
322
+ <!-- size: sm | md | lg -->
323
+ <!-- labelPlacement: inside | outside | outside-left -->
324
+ <!-- isClearable: boolean -->
325
+ <!-- showPasswordToggle: boolean (for type="password") -->
326
+ ```
327
+
328
+ **Textarea** — multiline text input
329
+ ```vue
330
+ <Textarea v-model="bio" label="Bio" :min-rows="3" />
331
+ ```
332
+
333
+ **NumberField** — numeric input with increment/decrement
334
+ ```vue
335
+ <NumberField v-model="qty" label="Quantity" :min="0" :max="99" :step="1" />
336
+ ```
337
+
338
+ **Checkbox** — single checkbox
339
+ ```vue
340
+ <Checkbox v-model="agreed">I agree to the terms</Checkbox>
341
+ ```
342
+
343
+ **CheckboxGroup** — grouped checkboxes
344
+ ```vue
345
+ <CheckboxGroup v-model="selected" label="Options">
346
+ <Checkbox value="a">Option A</Checkbox>
347
+ <Checkbox value="b">Option B</Checkbox>
348
+ </CheckboxGroup>
349
+ ```
350
+
351
+ **Radio / RadioGroup** — radio button group
352
+ ```vue
353
+ <RadioGroup v-model="plan" label="Plan">
354
+ <Radio value="free">Free</Radio>
355
+ <Radio value="pro">Pro</Radio>
356
+ </RadioGroup>
357
+ ```
358
+
359
+ **Switch** — toggle switch
360
+ ```vue
361
+ <Switch v-model="enabled">Notifications</Switch>
362
+ ```
363
+
364
+ **Select** — dropdown select
365
+ ```vue
366
+ <Select v-model="country" label="Country" placeholder="Pick one">
367
+ <SelectTrigger />
368
+ <SelectContent>
369
+ <SelectItem value="us">United States</SelectItem>
370
+ <SelectItem value="gb">United Kingdom</SelectItem>
371
+ </SelectContent>
372
+ </Select>
373
+ ```
374
+
375
+ **InputOTP** — one-time password input
376
+ ```vue
377
+ <InputOTP v-model="code" :length="6" />
378
+ ```
379
+
380
+ **Fieldset** — groups related form fields
381
+ ```vue
382
+ <Fieldset legend="Personal info">
383
+ <Input v-model="name" label="Name" />
384
+ <Input v-model="email" label="Email" />
385
+ </Fieldset>
386
+ ```
387
+
388
+ **Form / FormField** — form wrapper with validation
389
+ ```vue
390
+ <Form @submit="onSubmit">
391
+ <FormField name="email" :rules="{ required: true }">
392
+ <Input v-model="email" label="Email" />
393
+ </FormField>
394
+ </Form>
395
+ ```
396
+
397
+ ---
398
+
399
+ ### Overlays
400
+
401
+ **Modal** — dialog overlay
402
+ ```vue
403
+ <Modal v-model:open="isOpen">
404
+ <ModalTrigger as-child>
405
+ <Button>Open</Button>
406
+ </ModalTrigger>
407
+ <ModalContent>
408
+ <ModalHeader>
409
+ <ModalTitle>Title</ModalTitle>
410
+ <ModalDescription>Description</ModalDescription>
411
+ </ModalHeader>
412
+ <ModalBody>Content here</ModalBody>
413
+ <ModalFooter>
414
+ <Button variant="ghost" @click="isOpen = false">Cancel</Button>
415
+ <Button color="primary">Confirm</Button>
416
+ </ModalFooter>
417
+ </ModalContent>
418
+ </Modal>
419
+ ```
420
+
421
+ **AlertDialog** — destructive confirmation dialog
422
+ ```vue
423
+ <AlertDialog v-model:open="isOpen">
424
+ <AlertDialogTrigger as-child>
425
+ <Button color="danger">Delete</Button>
426
+ </AlertDialogTrigger>
427
+ <AlertDialogContent>
428
+ <AlertDialogHeader>
429
+ <AlertDialogTitle>Are you sure?</AlertDialogTitle>
430
+ <AlertDialogDescription>This cannot be undone.</AlertDialogDescription>
431
+ </AlertDialogHeader>
432
+ <AlertDialogFooter>
433
+ <AlertDialogCancel>Cancel</AlertDialogCancel>
434
+ <AlertDialogAction>Delete</AlertDialogAction>
435
+ </AlertDialogFooter>
436
+ </AlertDialogContent>
437
+ </AlertDialog>
438
+ ```
439
+
440
+ **Drawer** — slide-in panel
441
+ ```vue
442
+ <Drawer v-model:open="isOpen" placement="right">
443
+ <DrawerTrigger as-child><Button>Open</Button></DrawerTrigger>
444
+ <DrawerContent>
445
+ <DrawerHeader><DrawerTitle>Settings</DrawerTitle></DrawerHeader>
446
+ <DrawerBody>Content</DrawerBody>
447
+ </DrawerContent>
448
+ </Drawer>
449
+ <!-- placement: left | right | top | bottom -->
450
+ ```
451
+
452
+ **Tooltip** — hover label
453
+ ```vue
454
+ <TooltipProvider>
455
+ <Tooltip>
456
+ <TooltipTrigger as-child>
457
+ <Button>Hover me</Button>
458
+ </TooltipTrigger>
459
+ <TooltipContent>Helpful text</TooltipContent>
460
+ </Tooltip>
461
+ </TooltipProvider>
462
+ ```
463
+
464
+ **Popover** — click-triggered floating panel
465
+ ```vue
466
+ <Popover>
467
+ <PopoverTrigger as-child><Button>Open</Button></PopoverTrigger>
468
+ <PopoverContent>Panel content</PopoverContent>
469
+ </Popover>
470
+ ```
471
+
472
+ ---
473
+
474
+ ### Feedback
475
+
476
+ **Alert** — inline status message
477
+ ```vue
478
+ <Alert severity="success">
479
+ <AlertIcon />
480
+ <AlertTitle>Done!</AlertTitle>
481
+ <AlertDescription>Your changes were saved.</AlertDescription>
482
+ </Alert>
483
+ <!-- severity: info | success | warning | danger -->
484
+ ```
485
+
486
+ **Toast** — ephemeral notification (imperative API)
487
+ ```vue
488
+ <script setup>
489
+ import { useToast } from '@auronui/vue'
490
+ const { toast } = useToast()
491
+ function notify() {
492
+ toast({ title: 'Saved!', variant: 'success' })
493
+ }
494
+ </script>
495
+ <template>
496
+ <ToastProvider>
497
+ <ToastViewport />
498
+ </ToastProvider>
499
+ </template>
500
+ ```
501
+
502
+ **ProgressBar** — linear progress
503
+ ```vue
504
+ <ProgressBar :value="60" :max="100" label="Upload" />
505
+ ```
506
+
507
+ **ProgressCircle** — circular progress
508
+ ```vue
509
+ <ProgressCircle :value="75" size="md" />
510
+ ```
511
+
512
+ **Meter** — bounded measurement (e.g. disk usage)
513
+ ```vue
514
+ <Meter :value="40" :min="0" :max="100" label="Storage" />
515
+ ```
516
+
517
+ ---
518
+
519
+ ### Navigation
520
+
521
+ **Tabs** — tabbed content panels
522
+ ```vue
523
+ <Tabs default-value="one" variant="primary">
524
+ <TabList>
525
+ <Tab value="one">Overview</Tab>
526
+ <Tab value="two">Details</Tab>
527
+ <TabIndicator />
528
+ </TabList>
529
+ <TabPanel value="one">Overview content</TabPanel>
530
+ <TabPanel value="two">Details content</TabPanel>
531
+ </Tabs>
532
+ <!-- variant: primary | secondary -->
533
+ <!-- orientation: horizontal | vertical -->
534
+ ```
535
+
536
+ **Accordion** — collapsible sections
537
+ ```vue
538
+ <Accordion type="single" collapsible>
539
+ <AccordionItem value="a">
540
+ <AccordionHeader>
541
+ <AccordionTrigger>Section A</AccordionTrigger>
542
+ </AccordionHeader>
543
+ <AccordionContent>Body A</AccordionContent>
544
+ </AccordionItem>
545
+ </Accordion>
546
+ ```
547
+
548
+ **Collapsible** — single show/hide section
549
+ ```vue
550
+ <Collapsible v-model:open="open">
551
+ <CollapsibleTrigger as-child><Button>Toggle</Button></CollapsibleTrigger>
552
+ <CollapsibleContent>Hidden content</CollapsibleContent>
553
+ </Collapsible>
554
+ ```
555
+
556
+ **Breadcrumbs** — hierarchical navigation
557
+ ```vue
558
+ <Breadcrumbs>
559
+ <BreadcrumbItem href="/">Home</BreadcrumbItem>
560
+ <BreadcrumbItem href="/docs">Docs</BreadcrumbItem>
561
+ <BreadcrumbItem>Current</BreadcrumbItem>
562
+ </Breadcrumbs>
563
+ ```
564
+
565
+ **Pagination** — page navigation
566
+ ```vue
567
+ <Pagination v-model:page="page" :total="100" :per-page="10">
568
+ <PaginationContent>
569
+ <PaginationPrev />
570
+ <PaginationItem v-for="p in pages" :key="p" :value="p">{{ p }}</PaginationItem>
571
+ <PaginationNext />
572
+ </PaginationContent>
573
+ </Pagination>
574
+ ```
575
+
576
+ ---
577
+
578
+ ### Selection & Menus
579
+
580
+ **ListBox** — accessible list selection
581
+ ```vue
582
+ <ListBox v-model="selected" selection-mode="single">
583
+ <ListBoxItem value="a">Option A</ListBoxItem>
584
+ <ListBoxItem value="b">Option B</ListBoxItem>
585
+ </ListBox>
586
+ ```
587
+
588
+ **Dropdown** — context menu / action menu
589
+ ```vue
590
+ <Dropdown>
591
+ <DropdownTrigger as-child><Button>Actions</Button></DropdownTrigger>
592
+ <DropdownMenu>
593
+ <DropdownItem @click="edit">Edit</DropdownItem>
594
+ <DropdownItem @click="remove" class="text-danger">Delete</DropdownItem>
595
+ </DropdownMenu>
596
+ </Dropdown>
597
+ ```
598
+
599
+ **ComboBox** — searchable dropdown
600
+ ```vue
601
+ <ComboBox v-model="value" :items="options" label="Framework">
602
+ <ComboBoxInput placeholder="Search..." />
603
+ <ComboBoxContent>
604
+ <ComboBoxItem v-for="item in filtered" :key="item.value" :value="item.value">
605
+ {{ item.label }}
606
+ </ComboBoxItem>
607
+ <ComboBoxEmpty>No results</ComboBoxEmpty>
608
+ </ComboBoxContent>
609
+ </ComboBox>
610
+ ```
611
+
612
+ ---
613
+
614
+ ### Data Display
615
+
616
+ **Table** — accessible data table
617
+ ```vue
618
+ <Table>
619
+ <TableHeader>
620
+ <TableRow>
621
+ <TableHeaderCell>Name</TableHeaderCell>
622
+ <TableHeaderCell>Role</TableHeaderCell>
623
+ </TableRow>
624
+ </TableHeader>
625
+ <TableBody>
626
+ <TableRow v-for="row in rows" :key="row.id">
627
+ <TableCell>{{ row.name }}</TableCell>
628
+ <TableCell>{{ row.role }}</TableCell>
629
+ </TableRow>
630
+ </TableBody>
631
+ </Table>
632
+ ```
633
+
634
+ ---
635
+
636
+ ### Specialized
637
+
638
+ **Slider** — range input
639
+ ```vue
640
+ <Slider v-model="volume" :min="0" :max="100" :step="1" />
641
+ ```
642
+
643
+ **ScrollArea** — custom scrollbar container
644
+ ```vue
645
+ <ScrollArea class="h-64">
646
+ <div v-for="item in longList" :key="item">{{ item }}</div>
647
+ </ScrollArea>
648
+ ```
649
+
650
+ **ScrollShadow** — fades content edges to indicate overflow
651
+ ```vue
652
+ <ScrollShadow class="h-64 overflow-y-auto">
653
+ Long content...
654
+ </ScrollShadow>
655
+ ```
656
+
657
+ **Stepper** — multi-step wizard indicator
658
+ ```vue
659
+ <Stepper :value="currentStep">
660
+ <StepperItem :step="1">
661
+ <StepperIndicator />
662
+ <StepperTitle>Account</StepperTitle>
663
+ </StepperItem>
664
+ <StepperSeparator />
665
+ <StepperItem :step="2">
666
+ <StepperIndicator />
667
+ <StepperTitle>Profile</StepperTitle>
668
+ </StepperItem>
669
+ </Stepper>
670
+ ```
671
+
672
+ **Calendar** — date picker calendar
673
+ ```vue
674
+ <Calendar v-model="date" />
675
+ ```
676
+
677
+ **DatePicker** — date picker with input
678
+ ```vue
679
+ <DatePicker v-model="date" label="Pick a date" />
680
+ ```
681
+
682
+ **ColorPicker** — full color picker
683
+ ```vue
684
+ <ColorPicker v-model="color" />
685
+ ```
686
+
687
+ **AspectRatio** — enforces a width/height ratio
688
+ ```vue
689
+ <AspectRatio :ratio="16/9">
690
+ <img src="..." class="w-full h-full object-cover" />
691
+ </AspectRatio>
692
+ ```
693
+
694
+ **Toolbar** — accessible horizontal toolbar
695
+ ```vue
696
+ <Toolbar>
697
+ <ToolbarButton>Bold</ToolbarButton>
698
+ <ToolbarSeparator />
699
+ <ToolbarButton>Italic</ToolbarButton>
700
+ </Toolbar>
701
+ ```
702
+
703
+ **Tree** — hierarchical tree view
704
+ ```vue
705
+ <Tree v-model:expanded="expanded" v-model:selected="selected">
706
+ <TreeItem value="root" label="Root">
707
+ <TreeItem value="child" label="Child" />
708
+ </TreeItem>
709
+ </Tree>
710
+ ```
711
+
712
+ **SplitterGroup** — resizable panel splitter
713
+ ```vue
714
+ <SplitterGroup direction="horizontal">
715
+ <SplitterPanel :default-size="30">Sidebar</SplitterPanel>
716
+ <SplitterResizeHandle />
717
+ <SplitterPanel>Main</SplitterPanel>
718
+ </SplitterGroup>
719
+ ```
720
+
721
+ ---
722
+
723
+ ## Common Patterns
724
+
725
+ ### Login Form
726
+
727
+ ```vue
728
+ <script setup lang="ts">
729
+ import { ref } from 'vue'
730
+ import { Button, Input, Form, FormField, Link, Separator, Text } from '@auronui/vue'
731
+
732
+ const email = ref('')
733
+ const password = ref('')
734
+
735
+ async function onSubmit() {
736
+ // handle login
737
+ }
738
+ </script>
739
+
740
+ <template>
741
+ <Form @submit="onSubmit" class="space-y-4 w-full max-w-sm">
742
+ <FormField name="email">
743
+ <Input v-model="email" type="email" label="Email" :is-required="true" />
744
+ </FormField>
745
+ <FormField name="password">
746
+ <Input v-model="password" type="password" label="Password" :show-password-toggle="true" />
747
+ </FormField>
748
+ <Button type="submit" color="primary" :full-width="true">Sign in</Button>
749
+ <Separator />
750
+ <Text size="sm" class="text-center">
751
+ No account? <Link href="/register">Sign up</Link>
752
+ </Text>
753
+ </Form>
754
+ </template>
755
+ ```
756
+
757
+ ### Confirm Delete Dialog
758
+
759
+ ```vue
760
+ <script setup lang="ts">
761
+ import {
762
+ Button, AlertDialog, AlertDialogTrigger, AlertDialogContent,
763
+ AlertDialogHeader, AlertDialogTitle, AlertDialogDescription,
764
+ AlertDialogFooter, AlertDialogAction, AlertDialogCancel,
765
+ } from '@auronui/vue'
766
+
767
+ const emit = defineEmits<{ deleted: [] }>()
768
+ </script>
769
+
770
+ <template>
771
+ <AlertDialog>
772
+ <AlertDialogTrigger as-child>
773
+ <Button color="danger" variant="bordered">Delete account</Button>
774
+ </AlertDialogTrigger>
775
+ <AlertDialogContent>
776
+ <AlertDialogHeader>
777
+ <AlertDialogTitle>Delete account?</AlertDialogTitle>
778
+ <AlertDialogDescription>
779
+ This will permanently delete your account and all your data.
780
+ This action cannot be undone.
781
+ </AlertDialogDescription>
782
+ </AlertDialogHeader>
783
+ <AlertDialogFooter>
784
+ <AlertDialogCancel>Cancel</AlertDialogCancel>
785
+ <AlertDialogAction @click="emit('deleted')">Delete account</AlertDialogAction>
786
+ </AlertDialogFooter>
787
+ </AlertDialogContent>
788
+ </AlertDialog>
789
+ </template>
790
+ ```
791
+
792
+ ### Data Table with Pagination
793
+
794
+ ```vue
795
+ <script setup lang="ts">
796
+ import { ref, computed } from 'vue'
797
+ import {
798
+ Table, TableHeader, TableBody, TableRow, TableHeaderCell, TableCell,
799
+ Pagination, PaginationContent, PaginationItem, PaginationPrev, PaginationNext,
800
+ Spinner,
801
+ } from '@auronui/vue'
802
+
803
+ const props = defineProps<{
804
+ rows: Array<{ id: string; name: string; email: string; role: string }>
805
+ loading?: boolean
806
+ }>()
807
+
808
+ const page = ref(1)
809
+ const perPage = 10
810
+ const totalPages = computed(() => Math.ceil(props.rows.length / perPage))
811
+ const pageRows = computed(() =>
812
+ props.rows.slice((page.value - 1) * perPage, page.value * perPage)
813
+ )
814
+ </script>
815
+
816
+ <template>
817
+ <div class="space-y-4">
818
+ <div v-if="loading" class="flex justify-center py-8">
819
+ <Spinner size="lg" color="primary" />
820
+ </div>
821
+ <Table v-else>
822
+ <TableHeader>
823
+ <TableRow>
824
+ <TableHeaderCell>Name</TableHeaderCell>
825
+ <TableHeaderCell>Email</TableHeaderCell>
826
+ <TableHeaderCell>Role</TableHeaderCell>
827
+ </TableRow>
828
+ </TableHeader>
829
+ <TableBody>
830
+ <TableRow v-for="row in pageRows" :key="row.id">
831
+ <TableCell>{{ row.name }}</TableCell>
832
+ <TableCell>{{ row.email }}</TableCell>
833
+ <TableCell>{{ row.role }}</TableCell>
834
+ </TableRow>
835
+ </TableBody>
836
+ </Table>
837
+ <Pagination v-model:page="page" :total="rows.length" :per-page="perPage">
838
+ <PaginationContent>
839
+ <PaginationPrev />
840
+ <PaginationItem v-for="p in totalPages" :key="p" :value="p">{{ p }}</PaginationItem>
841
+ <PaginationNext />
842
+ </PaginationContent>
843
+ </Pagination>
844
+ </div>
845
+ </template>
846
+ ```
847
+
848
+ ---
849
+
850
+ ## Imports
851
+
852
+ ```ts
853
+ import {
854
+ Button, ButtonGroup, CloseButton, ToggleButton, ToggleButtonGroup,
855
+ Input, Textarea, NumberField, Checkbox, CheckboxGroup,
856
+ Radio, RadioGroup, Switch, SwitchGroup,
857
+ Select, SelectTrigger, SelectContent, SelectItem,
858
+ Modal, ModalTrigger, ModalContent, ModalHeader, ModalBody, ModalFooter,
859
+ ModalTitle, ModalDescription, ModalClose,
860
+ AlertDialog, AlertDialogTrigger, AlertDialogContent, AlertDialogHeader,
861
+ AlertDialogBody, AlertDialogFooter, AlertDialogTitle, AlertDialogDescription,
862
+ AlertDialogAction, AlertDialogCancel,
863
+ Drawer, DrawerTrigger, DrawerContent, DrawerHeader, DrawerBody,
864
+ Tooltip, TooltipProvider, TooltipTrigger, TooltipContent,
865
+ Popover, PopoverTrigger, PopoverContent,
866
+ Tabs, TabList, Tab, TabPanel, TabIndicator,
867
+ Accordion, AccordionItem, AccordionHeader, AccordionTrigger, AccordionContent,
868
+ Alert, AlertIcon, AlertTitle, AlertDescription,
869
+ ToastProvider, Toast, ToastViewport, useToast,
870
+ Badge, Chip, Avatar, AvatarGroup, Card, CardHeader, CardBody, CardFooter,
871
+ Spinner, Skeleton, Separator, Text, Label, Kbd,
872
+ Pagination, PaginationContent, PaginationItem, PaginationPrev, PaginationNext,
873
+ Table, TableHeader, TableBody, TableRow, TableCell, TableHeaderCell,
874
+ ListBox, ListBoxItem, Dropdown, DropdownTrigger, DropdownMenu, DropdownItem,
875
+ ComboBox, ComboBoxInput, ComboBoxContent, ComboBoxItem, ComboBoxEmpty,
876
+ TagGroup, TagGroupInput, Tag, TagText, TagDelete,
877
+ Slider, ScrollArea, ScrollShadow, ProgressBar, ProgressCircle, Meter,
878
+ Calendar, DatePicker, ColorPicker,
879
+ Breadcrumbs, BreadcrumbItem, Toolbar, ToolbarButton, ToolbarSeparator,
880
+ Collapsible, CollapsibleTrigger, CollapsibleContent,
881
+ Stepper, StepperItem, StepperIndicator, StepperTitle, StepperSeparator,
882
+ Tree, TreeItem, AspectRatio, SplitterGroup, SplitterPanel, SplitterResizeHandle,
883
+ } from '@auronui/vue'
884
+ ```