@codemonster-ru/vueforge 0.73.0 → 0.75.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/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/@codemonster-ru/vueforge)](https://www.npmjs.com/package/@codemonster-ru/vueforge)
4
4
  [![downloads](https://img.shields.io/npm/dw/@codemonster-ru/vueforge)](https://www.npmjs.com/package/@codemonster-ru/vueforge)
5
- [![license](https://img.shields.io/npm/l/@codemonster-ru/vueforge)](LICENSE.md)
5
+ [![license](https://img.shields.io/npm/l/@codemonster-ru/vueforge)](LICENSE)
6
6
 
7
- Open source component-level UI library for Vue.js.
7
+ Open source component-level UI library for Vue 3.
8
8
 
9
9
  ## Install
10
10
 
@@ -18,83 +18,13 @@ Peer dependencies:
18
18
  - `vue-router` (v4)
19
19
  - `@codemonster-ru/vueiconify`
20
20
 
21
- ## Usage
21
+ ## Quick Start
22
22
 
23
23
  ```ts
24
24
  import { createApp } from 'vue';
25
- import {
26
- VueForge,
27
- DefaultTheme,
28
- Container,
29
- Button,
30
- ButtonGroup,
31
- Input,
32
- InputGroup,
33
- InputAddon,
34
- InlineEdit,
35
- SearchInput,
36
- MentionInput,
37
- PasswordInput,
38
- OtpInput,
39
- ColorPicker,
40
- MaskedInput,
41
- NumberInput,
42
- Form,
43
- FormField,
44
- Textarea,
45
- RichTextEditor,
46
- FileUpload,
47
- Breadcrumbs,
48
- Divider,
49
- PageHeader,
50
- Select,
51
- Autocomplete,
52
- Combobox,
53
- MultiSelect,
54
- TagInput,
55
- DatePicker,
56
- Calendar,
57
- DateRangePicker,
58
- TimePicker,
59
- DateTimePicker,
60
- Pagination,
61
- DataTable,
62
- Checkbox,
63
- Switch,
64
- SegmentedControl,
65
- Alert,
66
- EmptyState,
67
- Skeleton,
68
- Progress,
69
- Spinner,
70
- Badge,
71
- Chip,
72
- FilterChips,
73
- Accordion,
74
- AccordionItem,
75
- Slider,
76
- Splitter,
77
- SplitterPanel,
78
- Stepper,
79
- Wizard,
80
- WizardStep,
81
- Timeline,
82
- Rating,
83
- Tree,
84
- TreeSelect,
85
- VirtualScroller,
86
- Drawer,
87
- ConfirmDialog,
88
- Dropdown,
89
- SplitButton,
90
- ContextMenu,
91
- CommandPalette,
92
- NotificationCenter,
93
- AppShell,
94
- KanbanBoard,
95
- Tour,
96
- } from '@codemonster-ru/vueforge';
25
+ import { VueForge, DefaultTheme } from '@codemonster-ru/vueforge';
97
26
  import '@codemonster-ru/vueforge/dist/index.css';
27
+ import App from './App.vue';
98
28
 
99
29
  const app = createApp(App);
100
30
 
@@ -106,3260 +36,52 @@ app.use(VueForge, {
106
36
  ```
107
37
 
108
38
  ```vue
109
- <Button label="Hello" severity="primary" />
110
- <ButtonGroup attached variant="outlined" size="small">
111
- <Button label="Day" />
112
- <Button label="Week" />
113
- <Button label="Month" />
114
- </ButtonGroup>
115
- <Form v-model="formValues" :validate="validateForm" @submit="onSubmit">
116
- <template #default="{ values, errors, touched, setFieldValue, setFieldTouched }">
117
- <FormField label="Email" :error="touched.email ? errors.email : ''">
118
- <template #default>
119
- <Input
120
- :model-value="String(values.email ?? '')"
121
- @update:model-value="value => setFieldValue('email', value)"
122
- @blur="() => setFieldTouched('email', true)"
123
- />
39
+ <template>
40
+ <Container size="lg">
41
+ <PageHeader title="Dashboard" subtitle="Manage projects and teams">
42
+ <template #actions>
43
+ <Button label="Create project" />
124
44
  </template>
125
- </FormField>
126
- <Button type="submit" label="Submit" />
127
- </template>
128
- </Form>
129
- <FormField label="Name" hint="Required field">
130
- <Input v-model="name" placeholder="Your name" />
131
- </FormField>
132
- <InputGroup>
133
- <InputAddon>$</InputAddon>
134
- <NumberInput v-model="price" :min="0" :step="0.5" />
135
- <InputAddon>.00</InputAddon>
136
- </InputGroup>
137
- <InlineEdit v-model="name" placeholder="No name" />
138
- <SearchInput v-model="query" placeholder="Search components" clearable />
139
- <MentionInput v-model="message" :suggestions="mentionSuggestions" placeholder="Type @name" />
140
- <PasswordInput v-model="password" placeholder="Enter password" show-strength />
141
- <OtpInput v-model="otp" :length="6" />
142
- <ColorPicker v-model="brandColor" :presets="['#2b6cb0', '#0cbc87', '#d6293e']" />
143
- <MaskedInput v-model="phone" mask="+7 (###) ###-##-##" />
144
- <NumberInput v-model="age" :min="0" :max="120" :step="1" />
145
- <Textarea v-model="bio" placeholder="Tell us about yourself" />
146
- <RichTextEditor v-model="article" />
147
- <FileUpload v-model="resume" accept=".pdf,.doc,.docx" />
148
- <Breadcrumbs :items="breadcrumbItems" />
149
- <Divider label="OR" />
150
- <PageHeader title="Projects" subtitle="Manage active projects and team workload.">
151
- <template #actions>
152
- <Button label="Import" variant="outlined" severity="secondary" />
153
- <Button label="New project" icon="plus" />
154
- </template>
155
- </PageHeader>
156
- <Select v-model="role" :options="roles" placeholder="Choose role" />
157
- <Autocomplete v-model="country" :options="countries" placeholder="Find country" />
158
- <Combobox v-model="countryId" :options="countries" placeholder="Pick country" clearable />
159
- <MultiSelect v-model="countries" :options="countryOptions" placeholder="Select countries" clearable />
160
- <TagInput v-model="skills" :options="skillOptions" placeholder="Add skills" clearable />
161
- <DatePicker v-model="birthday" placeholder="Pick birthday" />
162
- <Calendar v-model="selectedDate" />
163
- <DateRangePicker v-model="range" placeholder="Pick range" />
164
- <TimePicker v-model="meetingTime" placeholder="Pick time" />
165
- <DateTimePicker v-model="meetingAt" placeholder="Pick date and time" />
166
- <Pagination v-model="page" :total-items="240" :page-size="20" />
167
- <DataTable :columns="columns" :rows="rows" sortable striped />
168
- <Checkbox v-model="agreed" label="I agree" />
169
- <Switch v-model="darkMode" label="Dark mode" />
170
- <SegmentedControl
171
- v-model="view"
172
- :options="[
173
- { label: 'List', value: 'list' },
174
- { label: 'Grid', value: 'grid' },
175
- ]"
176
- />
177
- <Alert severity="info" title="Heads up" message="Project settings were updated." />
178
- <EmptyState title="No projects yet" description="Create your first project to get started." icon="📂" />
179
- <Skeleton height="12px" width="140px" />
180
- <Progress :value="64" />
181
- <Spinner label="Loading..." />
182
- <Badge label="Beta" />
183
- <Chip label="New" />
184
- <FilterChips
185
- v-model="filters"
186
- :options="[
187
- { label: 'Open', value: 'open' },
188
- { label: 'Done', value: 'done' },
189
- ]"
190
- clearable
191
- />
192
- <Slider v-model="volume" :min="0" :max="100" :step="5" show-value />
193
- <Splitter v-model="splitSizes" style="height: 280px">
194
- <SplitterPanel :min-size="20">Left panel</SplitterPanel>
195
- <SplitterPanel :min-size="20">Right panel</SplitterPanel>
196
- </Splitter>
197
- <Stepper v-model="step" :steps="steps" clickable />
198
- <Wizard v-model="wizardStep" :steps="wizardSteps">
199
- <WizardStep value="account">Account step</WizardStep>
200
- <WizardStep value="confirm">Confirm step</WizardStep>
201
- </Wizard>
202
- <Timeline :items="timelineItems" />
203
- <Rating v-model="rating" allow-half />
204
- <Tree v-model="selectedNode" v-model:expandedKeys="expandedKeys" :items="treeItems" />
205
- <TreeSelect v-model="selectedNode" v-model:expandedKeys="expandedKeys" :items="treeItems" placeholder="Select node" />
206
- <VirtualScroller :items="largeItems" :item-height="40" height="320px">
207
- <template #default="{ item, index }">
208
- {{ index + 1 }}. {{ item.label }}
209
- </template>
210
- </VirtualScroller>
211
- <Accordion v-model="faq">
212
- <AccordionItem value="shipping" title="Shipping">
213
- Shipping details
214
- </AccordionItem>
215
- <AccordionItem value="returns" title="Returns">
216
- Returns policy
217
- </AccordionItem>
218
- </Accordion>
219
- <Drawer v-model="drawerOpen" title="Filters" position="right">
220
- <template #body>
221
- Drawer content
222
- </template>
223
- </Drawer>
224
- <ConfirmDialog
225
- v-model="confirmOpen"
226
- title="Delete item?"
227
- message="This action cannot be undone."
228
- confirm-label="Delete"
229
- @confirm="removeItem"
230
- />
231
- <Dropdown :items="menuItems">
232
- <template #trigger>
233
- <Button label="Actions" />
234
- </template>
235
- </Dropdown>
236
- <SplitButton
237
- label="Save"
238
- :items="[
239
- { label: 'Save draft', command: saveDraft },
240
- { label: 'Save and publish', command: publish },
241
- ]"
242
- @click="save"
243
- />
244
- <ContextMenu :items="menuItems">
245
- <div>Right-click here</div>
246
- </ContextMenu>
247
- <CommandPalette
248
- v-model="commandPaletteOpen"
249
- :items="[
250
- { label: 'Open docs', value: 'docs', group: 'Navigation' },
251
- { label: 'Save as draft', value: 'draft', group: 'Actions' },
252
- ]"
253
- />
254
- <NotificationCenter v-model="notificationsOpen" v-model:items="notificationsItems" />
255
- <AppShell v-model="sidebarCollapsed">
256
- <template #sidebar>Sidebar content</template>
257
- <template #header>Header content</template>
258
- <div>Main content</div>
259
- </AppShell>
260
- <KanbanBoard v-model:items="kanbanItems" :columns="kanbanColumns" />
261
- <Tour v-model="tourOpen" :steps="tourSteps" />
262
- ```
263
-
264
- ## Components
265
-
266
- - Button
267
- - ButtonGroup
268
- - Card
269
- - Container
270
- - Checkbox
271
- - RadioGroup
272
- - RadioButton
273
- - SegmentedControl
274
- - Tabs
275
- - Tab
276
- - TabPanel
277
- - Accordion
278
- - AccordionItem
279
- - Toast
280
- - ToastContainer
281
- - Alert
282
- - EmptyState
283
- - Input
284
- - InputGroup
285
- - InputAddon
286
- - InlineEdit
287
- - SearchInput
288
- - MentionInput
289
- - PasswordInput
290
- - OtpInput
291
- - ColorPicker
292
- - MaskedInput
293
- - NumberInput
294
- - Form
295
- - FormField
296
- - Textarea
297
- - RichTextEditor
298
- - FileUpload
299
- - Link
300
- - Breadcrumbs
301
- - Divider
302
- - PageHeader
303
- - Menu
304
- - Modal
305
- - ConfirmDialog
306
- - Drawer
307
- - Dropdown
308
- - SplitButton
309
- - ContextMenu
310
- - CommandPalette
311
- - NotificationCenter
312
- - AppShell
313
- - KanbanBoard
314
- - Tour
315
- - Popover
316
- - Select
317
- - Autocomplete
318
- - Combobox
319
- - MultiSelect
320
- - TagInput
321
- - DatePicker
322
- - Calendar
323
- - DateRangePicker
324
- - TimePicker
325
- - DateTimePicker
326
- - Pagination
327
- - DataTable
328
- - Switch
329
- - Tooltip
330
- - Skeleton
331
- - Progress
332
- - Spinner
333
- - Badge
334
- - Chip
335
- - FilterChips
336
- - Avatar
337
- - Slider
338
- - Splitter
339
- - SplitterPanel
340
- - Stepper
341
- - Wizard
342
- - WizardStep
343
- - Timeline
344
- - Rating
345
- - Tree
346
- - TreeSelect
347
- - VirtualScroller
348
-
349
- Input / InputGroup / Search / Password / Textarea (quick API):
350
-
351
- - `Input`: single-line control, supports `v-model`, `size`, `variant`, `disabled`, `readonly`.
352
- - `ButtonGroup`: grouped button actions with shared size/variant/severity and attached/stacked layouts.
353
- - `InputGroup`: horizontal control combiner for field/addon/button layouts with unified corners and borders.
354
- - `EmptyState`: reusable empty-data block with icon/title/description/actions for table/list/search blank states.
355
- - `InlineEdit`: inline value editing with view/edit states, save/cancel actions, and text/number modes.
356
- - `SearchInput`: search-focused control with `debounce`, `clearable`, `loading`, `size`, and `variant`.
357
- - `MentionInput`: text input with `@`/`#` triggers, suggestions panel, keyboard selection, and mention insertion events.
358
- - `PasswordInput`: password control, supports visibility toggle, strength meter, CapsLock hint, `size`, and `variant`.
359
- - `OtpInput`: one-time code control, supports fixed length, paste handling, numeric/alphanumeric modes, `size`, and `variant`.
360
- - `ColorPicker`: color control with presets, optional alpha channel, and output formats (`hex`/`rgb`/`hsl`).
361
- - `MaskedInput`: formatted input control with string/function masks and optional raw output (`unmask`).
362
- - `NumberInput`: numeric control, supports `v-model`, `min`, `max`, `step`, `precision`, `controls`, `size`, `variant`.
363
- - `Splitter`: resizable multi-panel container with draggable separators and `v-model` percentage sizes.
364
- - `Tour`: guided step-by-step onboarding overlay anchored to target elements.
365
- - `NotificationCenter`: persistent notifications inbox with read/unread state and bulk actions.
366
- - `AppShell`: application layout shell with sidebar/header/main/footer regions, collapse toggle, and mobile drawer behavior.
367
- - `KanbanBoard`: task board with draggable cards, customizable column/card slots, and move events.
368
- - `RichTextEditor`: formatting editor with toolbar actions and Markdown/HTML output.
369
- - `Divider`: horizontal/vertical visual separator with optional label and style variants.
370
- - `Spinner`: lightweight loading indicator with inline/overlay variants and severity colors.
371
- - `PageHeader`: page-level heading block with breadcrumbs/meta/actions slots for dashboard screens.
372
- - `Wizard`: multi-step flow container with linear navigation, per-step validation, and completion events.
373
- - `Textarea`: multi-line control, same as Input plus `rows`.
374
- - `TagInput`: token/tag control, supports `v-model` (array), suggestions, custom tags, `maxTags`, `clearable`, `size`, `variant`.
375
- - `FilterChips`: compact chip-based filter toggles with single/multiple selection modes and optional clear action.
376
- - `SearchInput`, `MentionInput`, `InlineEdit`, `OtpInput`, `ColorPicker`, `MaskedInput`, `RichTextEditor`, `Checkbox`, `Select`, `Autocomplete`, `MultiSelect`, `TagInput`, `DatePicker`, `Calendar`, `DateRangePicker`, `DateTimePicker`, `Pagination`, `DataTable`, `SegmentedControl`, and `TreeSelect` also support `variant: 'filled' | 'outlined'`.
377
-
378
- ## Form
379
-
380
- Props:
381
-
382
- - `modelValue?: Record<string, unknown>` (v-model)
383
- - `initialValues?: Record<string, unknown>`
384
- - `validate?: (values) => Record<string, string> | string | boolean | null | Promise<...>`
385
- - `validateOn?: 'submit' | 'input' | 'change' | 'blur' | Array<'submit' | 'input' | 'change' | 'blur'>` (default `submit`)
386
- - `disabled?: boolean`
387
- - `novalidate?: boolean` (default `true`)
388
- - `id?: string`
389
- - `ariaLabel?: string`
390
- - `ariaLabelledby?: string`
391
-
392
- Events:
393
-
394
- - `update:modelValue`
395
- - `change`
396
- - `blur`
397
- - `validate`
398
- - `submit`
399
- - `invalidSubmit`
400
- - `reset`
401
-
402
- Slots:
403
-
404
- - `default` - form helpers:
405
- `{ values, errors, touched, isValid, isDirty, isSubmitting, setFieldValue, setFieldTouched, setFieldError, validate, submit, reset }`
406
-
407
- Example:
408
-
409
- ```vue
410
- <Form v-model="values" :validate="validateForm" validate-on="blur" @submit="send">
411
- <template #default="{ values, errors, touched, setFieldValue, setFieldTouched }">
412
- <FormField label="Email" :error="touched.email ? errors.email : ''">
413
- <template #default>
414
- <Input
415
- :model-value="String(values.email ?? '')"
416
- @update:model-value="value => setFieldValue('email', value)"
417
- @blur="() => setFieldTouched('email', true)"
418
- />
419
- </template>
420
- </FormField>
421
- <Button type="submit" label="Send" />
422
- </template>
423
- </Form>
424
- ```
425
-
426
- ### Form tokens
427
-
428
- Component tokens (override via `theme.overrides.components.form`):
429
-
430
- - `gap`, `textColor`, `disabledOpacity`
431
-
432
- ## FormField
433
-
434
- Props:
435
-
436
- - `id?: string` (used in `label for` and slot props)
437
- - `label?: string`
438
- - `hint?: string`
439
- - `error?: string`
440
- - `required?: boolean`
441
- - `disabled?: boolean`
442
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
443
-
444
- Slots:
445
-
446
- - `default` - form control wrapper slot props: `{ id, describedBy, invalid, required }`
447
- - `label` (optional)
448
- - `hint` (optional)
449
- - `error` (optional)
450
-
451
- Example:
452
-
453
- ```vue
454
- <FormField label="Email" hint="We never share it" :error="emailError">
455
- <template #default="{ id, describedBy }">
456
- <Input :id="id" v-model="email" :aria-describedby="describedBy" placeholder="name@example.com" />
457
- </template>
458
- </FormField>
459
- ```
460
-
461
- When `error` is set, `FormField` applies invalid-state border highlighting to nested form controls.
462
- Customize these colors via `theme.overrides.components.formField.errorBorderColor` and `errorFocusBorderColor`.
463
-
464
- ## InputGroup / InputAddon
465
-
466
- Props (`InputGroup`):
467
-
468
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
469
- - `variant?: 'filled' | 'outlined'` (default `filled`)
470
- - `disabled?: boolean` (default `false`)
471
-
472
- Props (`InputAddon`):
473
-
474
- - `as?: string` (default `span`)
475
-
476
- Slots:
477
-
478
- - `default` - group controls/addons content
479
-
480
- Example:
481
-
482
- ```vue
483
- <InputGroup>
484
- <InputAddon>$</InputAddon>
485
- <NumberInput v-model="price" :min="0" :step="0.5" />
486
- <Button label="Apply" />
487
- </InputGroup>
488
- ```
489
-
490
- ### InputGroup tokens
491
-
492
- Component tokens (override via `theme.overrides.components.inputGroup`):
493
-
494
- - `gap`, `borderRadius`
495
- - `addonPadding`, `addonFontSize`
496
- - `addonBackgroundColor`, `addonOutlinedBackgroundColor`
497
- - `addonTextColor`, `addonBorderColor`, `disabledOpacity`
498
- - `small.addonPadding`, `small.addonFontSize`
499
- - `large.addonPadding`, `large.addonFontSize`
500
-
501
- ## InlineEdit
502
-
503
- Props:
504
-
505
- - `modelValue?: string | number | null` (v-model)
506
- - `type?: 'text' | 'number'` (default `text`)
507
- - `placeholder?: string`
508
- - `disabled?: boolean`
509
- - `readonly?: boolean`
510
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
511
- - `variant?: 'filled' | 'outlined'` (default `filled`)
512
- - `editLabel?: string` (default `Edit`)
513
- - `saveLabel?: string` (default `Save`)
514
- - `cancelLabel?: string` (default `Cancel`)
515
-
516
- Events:
517
-
518
- - `update:modelValue`
519
- - `save`
520
- - `cancel`
521
- - `start`
522
- - `end`
523
- - `focus`
524
- - `blur`
525
-
526
- Example:
527
-
528
- ```vue
529
- <InlineEdit v-model="projectName" placeholder="No project name" />
530
- <InlineEdit v-model="budget" type="number" variant="outlined" />
531
- ```
532
-
533
- ### InlineEdit tokens
534
-
535
- Component tokens (override via `theme.overrides.components.inlineEdit`):
536
-
537
- - `gap`, `fontSize`, `padding`
538
- - `borderRadius`, `borderColor`
539
- - `backgroundColor`, `textColor`, `placeholderColor`
540
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`, `disabledOpacity`
541
- - `actionsGap`
542
- - `buttonPadding`, `buttonRadius`, `buttonBorderColor`
543
- - `buttonBackgroundColor`, `buttonTextColor`, `buttonHoverBackgroundColor`
544
- - `cancelButtonBackgroundColor`, `cancelButtonTextColor`, `cancelButtonBorderColor`
545
- - `small.fontSize`, `small.padding`, `small.buttonPadding`
546
- - `large.fontSize`, `large.padding`, `large.buttonPadding`
547
-
548
- ## MentionInput
549
-
550
- Props:
551
-
552
- - `modelValue?: string` (v-model)
553
- - `suggestions?: Array<{ label: string; value?: string | number; trigger?: string; disabled?: boolean }>` (default `[]`)
554
- - `triggers?: Array<string>` (default `['@', '#']`)
555
- - `placeholder?: string`
556
- - `disabled?: boolean`
557
- - `readonly?: boolean`
558
- - `loading?: boolean` (default `false`)
559
- - `loadingText?: string` (default `Loading...`)
560
- - `emptyText?: string` (default `No matches`)
561
- - `minQueryLength?: number` (default `1`)
562
- - `maxSuggestions?: number` (default `8`)
563
- - `appendSpace?: boolean` (default `true`)
564
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
565
- - `variant?: 'filled' | 'outlined'` (default `filled`)
566
- - `ariaLabel?: string`
567
-
568
- Events:
569
-
570
- - `update:modelValue`
571
- - `input`
572
- - `change`
573
- - `search` (payload: `{ trigger: string; query: string }`)
574
- - `select`
575
- - `insert` (payload: `{ trigger, query, option, text, range }`)
576
- - `focus`
577
- - `blur`
578
-
579
- Example:
580
-
581
- ```vue
582
- <MentionInput
583
- v-model="message"
584
- :suggestions="[
585
- { label: 'alice', value: 'alice', trigger: '@' },
586
- { label: 'frontend', value: 'frontend', trigger: '#' },
587
- ]"
588
- placeholder="Type @name or #topic"
589
- />
590
- ```
591
-
592
- ### MentionInput tokens
593
-
594
- Component tokens (override via `theme.overrides.components.mentionInput`):
595
-
596
- - `minWidth`, `fontSize`, `padding`
597
- - `borderRadius`, `borderColor`
598
- - `backgroundColor`, `textColor`, `placeholderColor`
599
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`, `disabledOpacity`
600
- - `panelBackgroundColor`, `panelBorderColor`, `panelPadding`, `panelMaxHeight`, `panelRadiusOffset`, `panelShadow`
601
- - `optionPadding`, `optionGap`, `optionBorderRadius`, `optionFontSize`
602
- - `optionHoverBackgroundColor`, `optionTriggerColor`
603
- - `emptyPadding`, `emptyColor`
604
- - `small.fontSize`, `small.padding`
605
- - `large.fontSize`, `large.padding`
606
-
607
- Note: default filled backgrounds for Input/Select/Textarea use `controls.backgroundColor` (defaults to `bgSoftColor`). Set it to `bgColor` to disable soft backgrounds.
608
-
609
- ## Autocomplete
610
-
611
- Props:
612
-
613
- - `modelValue?: string | number` (v-model)
614
- - `options?: Array<{ label: string; value: string | number; disabled?: boolean }>`
615
- - `optionLabel?: string` (default `label`)
616
- - `optionValue?: string` (default `value`)
617
- - `placeholder?: string`
618
- - `disabled?: boolean`
619
- - `readonly?: boolean`
620
- - `loading?: boolean`
621
- - `loadingText?: string` (default `Loading...`)
622
- - `emptyText?: string` (default `No results`)
623
- - `filter?: boolean` (default `true`)
624
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
625
- - `variant?: 'filled' | 'outlined'` (default `filled`)
626
-
627
- Events:
628
-
629
- - `update:modelValue`
630
- - `change`
631
- - `search`
632
- - `focus`
633
- - `blur`
634
-
635
- Example:
636
-
637
- ```vue
638
- <Autocomplete v-model="country" :options="countries" placeholder="Find country" />
639
- ```
640
-
641
- ## Combobox
642
-
643
- Props:
644
-
645
- - `modelValue?: string | number` (v-model selected value)
646
- - `inputValue?: string` (v-model:inputValue typed query)
647
- - `options?: Array<{ label: string; value: string | number; disabled?: boolean }>`
648
- - `optionLabel?: string` (default `label`)
649
- - `optionValue?: string` (default `value`)
650
- - `placeholder?: string`
651
- - `disabled?: boolean`
652
- - `readonly?: boolean`
653
- - `loading?: boolean`
654
- - `loadingText?: string` (default `Loading...`)
655
- - `emptyText?: string` (default `No results`)
656
- - `filter?: boolean` (default `true`)
657
- - `strict?: boolean` (default `true`)
658
- - `allowCreate?: boolean` (default `false`)
659
- - `clearable?: boolean` (default `false`)
660
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
661
- - `variant?: 'filled' | 'outlined'` (default `filled`)
662
-
663
- Events:
664
-
665
- - `update:modelValue`
666
- - `update:inputValue`
667
- - `change`
668
- - `search`
669
- - `create`
670
- - `focus`
671
- - `blur`
672
-
673
- Example:
674
-
675
- ```vue
676
- <Combobox v-model="countryId" v-model:inputValue="countryQuery" :options="countries" placeholder="Pick country" />
677
- ```
678
-
679
- ### Combobox tokens
680
-
681
- Component tokens (override via `theme.overrides.components.combobox`):
682
-
683
- - `minWidth`, `fontSize`, `controlGap`, `chevronSize`
684
- - `padding`, `borderRadius`, `borderColor`
685
- - `backgroundColor`, `textColor`, `placeholderColor`
686
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
687
- - `disabledOpacity`
688
- - `panelBackgroundColor`, `panelBorderColor`, `panelPadding`, `panelMaxHeight`, `panelRadiusOffset`, `panelShadow`
689
- - `optionPadding`, `optionBorderRadius`
690
- - `optionHoverBackgroundColor`, `optionActiveBackgroundColor`, `optionActiveTextColor`, `optionHighlightedBackgroundColor`
691
- - `emptyPadding`, `emptyColor`
692
- - `loadingPadding`, `loadingColor`
693
- - `clearSize`, `clearRadius`, `clearHoverBackgroundColor`
694
- - `small.fontSize`, `small.padding`
695
- - `large.fontSize`, `large.padding`
696
-
697
- ## MultiSelect
698
-
699
- Props:
700
-
701
- - `modelValue?: Array<string | number>` (v-model)
702
- - `options?: Array<{ label: string; value: string | number; disabled?: boolean }>`
703
- - `optionLabel?: string` (default `label`)
704
- - `optionValue?: string` (default `value`)
705
- - `placeholder?: string`
706
- - `searchPlaceholder?: string` (default `Search...`)
707
- - `disabled?: boolean`
708
- - `readonly?: boolean`
709
- - `loading?: boolean`
710
- - `loadingText?: string` (default `Loading...`)
711
- - `emptyText?: string` (default `No results`)
712
- - `filter?: boolean` (default `true`)
713
- - `clearable?: boolean` (default `false`)
714
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
715
- - `variant?: 'filled' | 'outlined'` (default `filled`)
716
-
717
- Events:
718
-
719
- - `update:modelValue`
720
- - `change`
721
- - `search`
722
- - `focus`
723
- - `blur`
724
-
725
- Example:
726
-
727
- ```vue
728
- <MultiSelect v-model="countries" :options="countryOptions" placeholder="Select countries" clearable />
729
- ```
730
-
731
- ## TagInput
732
-
733
- Props:
734
-
735
- - `modelValue?: Array<string | number>` (v-model)
736
- - `options?: Array<{ label: string; value: string | number; disabled?: boolean }>`
737
- - `optionLabel?: string` (default `label`)
738
- - `optionValue?: string` (default `value`)
739
- - `placeholder?: string`
740
- - `disabled?: boolean`
741
- - `readonly?: boolean`
742
- - `loading?: boolean`
743
- - `loadingText?: string` (default `Loading...`)
744
- - `emptyText?: string` (default `No results`)
745
- - `filter?: boolean` (default `true`)
746
- - `allowCustom?: boolean` (default `true`)
747
- - `maxTags?: number`
748
- - `clearable?: boolean` (default `false`)
749
- - `validateTag?: (value: string) => boolean`
750
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
751
- - `variant?: 'filled' | 'outlined'` (default `filled`)
752
-
753
- Events:
754
-
755
- - `update:modelValue`
756
- - `change`
757
- - `search`
758
- - `add` (payload: `{ value: string | number; source: 'option' | 'custom' }`)
759
- - `remove`
760
- - `reject` (payload: `{ reason: 'duplicate' | 'maxTags' | 'invalid' | 'readonly'; value: string }`)
761
- - `focus`
762
- - `blur`
763
-
764
- Example:
765
-
766
- ```vue
767
- <TagInput v-model="skills" :options="skillOptions" placeholder="Add skills" clearable />
768
- ```
769
-
770
- ### TagInput tokens
771
-
772
- Component tokens (override via `theme.overrides.components.taginput`):
773
-
774
- - `minWidth`, `minHeight`, `fontSize`, `controlGap`, `chevronSize`
775
- - `padding`, `borderRadius`, `borderColor`
776
- - `backgroundColor`, `textColor`, `placeholderColor`
777
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
778
- - `disabledOpacity`
779
- - `panelBackgroundColor`, `panelBorderColor`, `panelPadding`, `panelMaxHeight`, `panelRadiusOffset`, `panelShadow`
780
- - `optionPadding`, `optionBorderRadius`
781
- - `optionHoverBackgroundColor`, `optionHighlightedBackgroundColor`
782
- - `emptyPadding`, `emptyColor`
783
- - `loadingPadding`, `loadingColor`
784
- - `inputMinWidth`
785
- - `chipGap`, `chipPadding`, `chipRadius`, `chipBackgroundColor`, `chipTextColor`, `chipFontSize`
786
- - `chipRemoveSize`, `chipRemoveRadius`, `chipRemoveHoverBackgroundColor`
787
- - `clearSize`, `clearRadius`, `clearHoverBackgroundColor`
788
- - `small.fontSize`, `small.padding`, `small.chipPadding`, `small.chipFontSize`
789
- - `large.fontSize`, `large.padding`, `large.chipPadding`, `large.chipFontSize`
790
-
791
- ### MultiSelect tokens
792
-
793
- Component tokens (override via `theme.overrides.components.multiselect`):
794
-
795
- - `minWidth`, `fontSize`, `controlGap`, `chevronSize`
796
- - `padding`, `borderRadius`, `borderColor`
797
- - `backgroundColor`, `textColor`, `placeholderColor`
798
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
799
- - `disabledOpacity`
800
- - `panelBackgroundColor`, `panelBorderColor`, `panelPadding`, `panelMaxHeight`, `panelRadiusOffset`, `panelShadow`
801
- - `searchPadding`, `searchBorderColor`, `searchBorderRadius`
802
- - `optionPadding`, `optionBorderRadius`
803
- - `optionHoverBackgroundColor`, `optionActiveBackgroundColor`, `optionActiveTextColor`, `optionHighlightedBackgroundColor`
804
- - `emptyPadding`, `emptyColor`
805
- - `loadingPadding`, `loadingColor`
806
- - `clearSize`, `clearRadius`, `clearHoverBackgroundColor`
807
- - `small.fontSize`, `small.padding`
808
- - `large.fontSize`, `large.padding`
809
-
810
- ## DatePicker
811
-
812
- Props:
813
-
814
- - `modelValue?: string` (v-model, ISO date `YYYY-MM-DD`)
815
- - `placeholder?: string`
816
- - `disabled?: boolean`
817
- - `readonly?: boolean`
818
- - `min?: string` (ISO date `YYYY-MM-DD`)
819
- - `max?: string` (ISO date `YYYY-MM-DD`)
820
- - `locale?: string` (default `en-US`)
821
- - `firstDayOfWeek?: number` (default `0`, Sunday)
822
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
823
- - `variant?: 'filled' | 'outlined'` (default `filled`)
824
-
825
- Events:
826
-
827
- - `update:modelValue`
828
- - `change`
829
- - `focus`
830
- - `blur`
831
-
832
- Example:
833
-
834
- ```vue
835
- <DatePicker v-model="startDate" placeholder="Pick date" min="2026-01-01" max="2026-12-31" />
836
- ```
837
-
838
- ## Calendar
839
-
840
- Props:
841
-
842
- - `modelValue?: string` (v-model, ISO date `YYYY-MM-DD`)
843
- - `disabled?: boolean`
844
- - `readonly?: boolean`
845
- - `min?: string` (ISO date `YYYY-MM-DD`)
846
- - `max?: string` (ISO date `YYYY-MM-DD`)
847
- - `locale?: string` (default `en-US`)
848
- - `firstDayOfWeek?: number` (default `0`, Sunday)
849
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
850
- - `variant?: 'filled' | 'outlined'` (default `filled`)
851
-
852
- Events:
853
-
854
- - `update:modelValue`
855
- - `change`
856
-
857
- Example:
858
-
859
- ```vue
860
- <Calendar v-model="selectedDate" min="2026-01-01" max="2026-12-31" />
861
- <Calendar v-model="selectedDateAlt" variant="outlined" :first-day-of-week="1" />
862
- ```
863
-
864
- ### Calendar tokens
865
-
866
- Component tokens (override via `theme.overrides.components.calendar`):
867
-
868
- - `width`, `fontSize`, `padding`
869
- - `borderRadius`, `borderColor`
870
- - `backgroundColor`, `textColor`
871
- - `disabledOpacity`
872
- - `headerGap`, `headerPadding`, `monthLabelFontSize`, `monthLabelFontWeight`
873
- - `navButtonSize`, `navButtonRadius`, `navButtonFontSize`
874
- - `weekdayColor`, `weekdayFontSize`, `weekdaysMarginBottom`
875
- - `daysGap`, `daySize`, `dayFontSize`, `dayBorderRadius`
876
- - `dayHoverBackgroundColor`, `daySelectedBackgroundColor`, `daySelectedTextColor`, `dayMutedColor`, `dayTodayBorderColor`
877
- - `small.fontSize`, `small.padding`, `small.daySize`
878
- - `large.fontSize`, `large.padding`, `large.daySize`
879
-
880
- ## DateRangePicker
881
-
882
- Props:
883
-
884
- - `modelValue?: [string | null, string | null] | null` (v-model, ISO date `YYYY-MM-DD`)
885
- - `placeholder?: string`
886
- - `startPlaceholder?: string` (default `Start`)
887
- - `endPlaceholder?: string` (default `End`)
888
- - `separator?: string` (default `-`)
889
- - `disabled?: boolean`
890
- - `readonly?: boolean`
891
- - `min?: string` (ISO date `YYYY-MM-DD`)
892
- - `max?: string` (ISO date `YYYY-MM-DD`)
893
- - `locale?: string` (default `en-US`)
894
- - `firstDayOfWeek?: number` (default `0`, Sunday)
895
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
896
- - `variant?: 'filled' | 'outlined'` (default `filled`)
897
-
898
- Events:
899
-
900
- - `update:modelValue`
901
- - `change`
902
- - `focus`
903
- - `blur`
904
-
905
- Example:
906
-
907
- ```vue
908
- <DateRangePicker v-model="dateRange" placeholder="Pick date range" min="2026-01-01" max="2026-12-31" />
909
- ```
910
-
911
- ## TimePicker
912
-
913
- Props:
914
-
915
- - `modelValue?: string` (v-model, time `HH:mm`)
916
- - `placeholder?: string`
917
- - `disabled?: boolean`
918
- - `readonly?: boolean`
919
- - `min?: string` (time `HH:mm`)
920
- - `max?: string` (time `HH:mm`)
921
- - `step?: number` (minutes, default `30`)
922
- - `format?: '24h' | '12h'` (default `24h`)
923
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
924
- - `variant?: 'filled' | 'outlined'` (default `filled`)
925
-
926
- Events:
927
-
928
- - `update:modelValue`
929
- - `change`
930
- - `focus`
931
- - `blur`
932
-
933
- Example:
934
-
935
- ```vue
936
- <TimePicker v-model="meetingTime" placeholder="Pick time" min="09:00" max="18:00" :step="15" />
937
- ```
938
-
939
- ### TimePicker tokens
940
-
941
- Component tokens (override via `theme.overrides.components.timepicker`):
942
-
943
- - `minWidth`, `fontSize`, `controlGap`, `chevronSize`
944
- - `padding`, `borderRadius`, `borderColor`
945
- - `backgroundColor`, `textColor`, `placeholderColor`
946
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
947
- - `disabledOpacity`
948
- - `panelBackgroundColor`, `panelBorderColor`, `panelPadding`, `panelMaxHeight`, `panelRadiusOffset`, `panelShadow`
949
- - `optionPadding`, `optionBorderRadius`
950
- - `optionHoverBackgroundColor`, `optionActiveBackgroundColor`, `optionActiveTextColor`
951
- - `small.fontSize`, `small.padding`
952
- - `large.fontSize`, `large.padding`
953
-
954
- ## DateTimePicker
955
-
956
- Props:
957
-
958
- - `modelValue?: string` (v-model, ISO datetime `YYYY-MM-DDTHH:mm`)
959
- - `placeholder?: string`
960
- - `disabled?: boolean`
961
- - `readonly?: boolean`
962
- - `min?: string` (ISO datetime `YYYY-MM-DDTHH:mm`)
963
- - `max?: string` (ISO datetime `YYYY-MM-DDTHH:mm`)
964
- - `locale?: string` (default `en-US`)
965
- - `firstDayOfWeek?: number` (default `0`, Sunday)
966
- - `minuteStep?: number` (default `30`)
967
- - `format?: '24h' | '12h'` (default `24h`)
968
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
969
- - `variant?: 'filled' | 'outlined'` (default `filled`)
970
-
971
- Events:
972
-
973
- - `update:modelValue`
974
- - `change`
975
- - `focus`
976
- - `blur`
977
-
978
- Example:
979
-
980
- ```vue
981
- <DateTimePicker v-model="meetingAt" placeholder="Pick date and time" />
982
- <DateTimePicker
983
- v-model="meetingAtAlt"
984
- variant="outlined"
985
- min="2026-01-10T09:00"
986
- max="2026-12-31T18:00"
987
- :minute-step="15"
988
- format="12h"
989
- />
990
- ```
991
-
992
- ### DateTimePicker tokens
993
-
994
- Component tokens (override via `theme.overrides.components.datetimepicker`):
995
-
996
- - `minWidth`, `fontSize`, `controlGap`, `chevronSize`
997
- - `padding`, `borderRadius`, `borderColor`
998
- - `backgroundColor`, `textColor`, `placeholderColor`
999
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
1000
- - `disabledOpacity`
1001
- - `panelWidth`, `panelBackgroundColor`, `panelBorderColor`, `panelPadding`, `panelRadiusOffset`, `panelShadow`, `panelGap`
1002
- - `headerGap`, `headerPadding`, `monthLabelFontSize`, `monthLabelFontWeight`
1003
- - `navButtonSize`, `navButtonRadius`, `navButtonFontSize`
1004
- - `weekdayColor`, `weekdayFontSize`, `weekdaysMarginBottom`
1005
- - `daysGap`, `daySize`, `dayFontSize`, `dayBorderRadius`
1006
- - `dayHoverBackgroundColor`, `daySelectedBackgroundColor`, `daySelectedTextColor`, `dayMutedColor`, `dayTodayBorderColor`
1007
- - `timesWidth`, `timesMaxHeight`, `timesPaddingLeft`, `timesBorderColor`
1008
- - `timeOptionPadding`, `timeOptionBorderRadius`, `timeOptionFontSize`
1009
- - `timeOptionHoverBackgroundColor`, `timeOptionActiveBackgroundColor`, `timeOptionActiveTextColor`
1010
- - `small.fontSize`, `small.padding`, `small.daySize`
1011
- - `large.fontSize`, `large.padding`, `large.daySize`
1012
-
1013
- ## Pagination
1014
-
1015
- Props:
1016
-
1017
- - `modelValue?: number` (v-model, default `1`)
1018
- - `totalItems?: number` (default `0`)
1019
- - `pageSize?: number` (default `10`)
1020
- - `totalPages?: number` (optional override instead of `totalItems/pageSize`)
1021
- - `siblingCount?: number` (default `1`)
1022
- - `boundaryCount?: number` (default `1`)
1023
- - `disabled?: boolean`
1024
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1025
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1026
- - `prevLabel?: string` (default `Prev`)
1027
- - `nextLabel?: string` (default `Next`)
1028
- - `ellipsisLabel?: string` (default `...`)
1029
-
1030
- Events:
1031
-
1032
- - `update:modelValue`
1033
- - `change`
1034
-
1035
- Slots:
1036
-
1037
- - `indicator` - slot props: `{ step, index, status, active, completed, upcoming, error }`
1038
- - `step` - slot props: `{ step, index, status, active, completed, upcoming, error }`
1039
-
1040
- Example:
1041
-
1042
- ```vue
1043
- <Pagination v-model="page" :total-items="240" :page-size="20" />
1044
- ```
1045
-
1046
- ### Pagination tokens
1047
-
1048
- Component tokens (override via `theme.overrides.components.pagination`):
1049
-
1050
- - `gap`, `itemMinWidth`, `fontSize`, `padding`
1051
- - `borderRadius`, `borderColor`
1052
- - `backgroundColor`, `textColor`
1053
- - `hoverBackgroundColor`
1054
- - `activeBorderColor`, `activeBackgroundColor`, `activeTextColor`
1055
- - `focusBorderColor`, `focusRingShadow`
1056
- - `disabledOpacity`, `ellipsisPadding`
1057
- - `small.fontSize`, `small.padding`
1058
- - `large.fontSize`, `large.padding`
1059
-
1060
- ## DataTable
1061
-
1062
- Props:
1063
-
1064
- - `rows?: Array<Record<string, unknown>>`
1065
- - `columns?: Array<{ field: string; header?: string; sortable?: boolean; align?: 'left' | 'center' | 'right'; width?: string; minWidth?: string; formatter?: (row, value, column) => string | number }>`
1066
- - `rowKey?: string | ((row, index) => string | number)`
1067
- - `sortable?: boolean`
1068
- - `sortField?: string | null`
1069
- - `sortOrder?: 'asc' | 'desc' | null`
1070
- - `loading?: boolean`
1071
- - `loadingText?: string` (default `Loading...`)
1072
- - `emptyText?: string` (default `No data`)
1073
- - `striped?: boolean` (default `false`)
1074
- - `hover?: boolean` (default `true`)
1075
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1076
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1077
- - `showHeader?: boolean` (default `true`)
1078
- - `ariaLabel?: string` (default `Data table`)
1079
-
1080
- Events:
1081
-
1082
- - `update:sortField`
1083
- - `update:sortOrder`
1084
- - `sort`
1085
- - `rowClick`
1086
-
1087
- Slots:
1088
-
1089
- - `header-{field}`
1090
- - `cell-{field}`
1091
- - `empty`
1092
- - `loading`
1093
-
1094
- Example:
1095
-
1096
- ```vue
1097
- <DataTable
1098
- :columns="[
1099
- { field: 'name', header: 'Name', sortable: true },
1100
- { field: 'role', header: 'Role' },
1101
- { field: 'age', header: 'Age', align: 'right', sortable: true },
1102
- ]"
1103
- :rows="[
1104
- { id: 1, name: 'Alice', role: 'Developer', age: 29 },
1105
- { id: 2, name: 'Bob', role: 'Designer', age: 34 },
1106
- ]"
1107
- row-key="id"
1108
- sortable
1109
- striped
1110
- />
1111
- ```
1112
-
1113
- ### DataTable tokens
1114
-
1115
- Component tokens (override via `theme.overrides.components.datatable`):
1116
-
1117
- - `borderColor`, `borderRadius`, `backgroundColor`
1118
- - `fontSize`, `textColor`
1119
- - `headerBackgroundColor`, `headerTextColor`, `headerFontSize`, `headerFontWeight`, `headerBorderColor`, `headerGap`
1120
- - `rowBackgroundColor`, `rowTextColor`, `rowBorderColor`
1121
- - `cellPadding`
1122
- - `stripedBackgroundColor`, `hoverBackgroundColor`
1123
- - `sortIconColor`, `sortIconActiveColor`, `sortIconSize`
1124
- - `statePadding`, `stateTextColor`
1125
- - `small.fontSize`, `small.cellPadding`
1126
- - `large.fontSize`, `large.cellPadding`
1127
-
1128
- ## Textarea
1129
-
1130
- Props:
1131
-
1132
- - `modelValue?: string` (v-model)
1133
- - `placeholder?: string`
1134
- - `disabled?: boolean`
1135
- - `readonly?: boolean`
1136
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1137
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1138
- - `rows?: number` (default `3`)
1139
-
1140
- Events:
1141
-
1142
- - `update:modelValue`
1143
- - `input`
1144
- - `change`
1145
- - `focus`
1146
- - `blur`
1147
-
1148
- Example:
1149
-
1150
- ```vue
1151
- <Textarea v-model="bio" placeholder="Tell us about yourself" rows="4" />
1152
- ```
1153
-
1154
- ## RichTextEditor
1155
-
1156
- Props:
1157
-
1158
- - `modelValue?: string` (v-model)
1159
- - `placeholder?: string`
1160
- - `disabled?: boolean`
1161
- - `readonly?: boolean`
1162
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1163
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1164
- - `format?: 'markdown' | 'html'` (default `markdown`)
1165
- - `rows?: number` (default `6`)
1166
- - `maxLength?: number` (default `0`, disabled when `0`)
1167
- - `showToolbar?: boolean` (default `true`)
1168
- - `toolbar?: Array<'bold' | 'italic' | 'underline' | 'link' | 'bulletList' | 'orderedList' | 'code'>`
1169
- - `toolbarLabel?: string` (default `Text formatting toolbar`)
1170
- - `ariaLabel?: string` (default `Rich text editor`)
1171
-
1172
- Events:
1173
-
1174
- - `update:modelValue`
1175
- - `input`
1176
- - `change`
1177
- - `focus`
1178
- - `blur`
1179
- - `action` (payload: `action`, `nextValue`)
1180
-
1181
- Example:
1182
-
1183
- ```vue
1184
- <RichTextEditor
1185
- v-model="article"
1186
- format="markdown"
1187
- :rows="8"
1188
- :max-length="2000"
1189
- :toolbar="['bold', 'italic', 'link', 'bulletList', 'code']"
1190
- />
1191
- ```
1192
-
1193
- ## FileUpload
1194
-
1195
- Props:
1196
-
1197
- - `modelValue?: File | File[] | null` (v-model)
1198
- - `multiple?: boolean`
1199
- - `accept?: string`
1200
- - `disabled?: boolean`
1201
- - `readonly?: boolean`
1202
- - `maxSize?: number` (bytes)
1203
- - `maxFiles?: number`
1204
- - `placeholder?: string`
1205
- - `buttonLabel?: string` (default `Browse`)
1206
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1207
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1208
-
1209
- Events:
1210
-
1211
- - `update:modelValue`
1212
- - `change`
1213
- - `reject` (payload: `Array<{ file: File; reason: 'maxSize' | 'maxFiles'; maxSize?: number; maxFiles?: number }>` )
1214
- - `focus`
1215
- - `blur`
1216
-
1217
- Example:
1218
-
1219
- ```vue
1220
- <FileUpload v-model="attachments" multiple :max-files="5" :max-size="10_000_000" />
1221
- ```
1222
-
1223
- ### FileUpload tokens
1224
-
1225
- Component tokens (override via `theme.overrides.components.fileUpload`):
1226
-
1227
- - `minHeight`, `fontSize`, `gap`, `padding`
1228
- - `borderRadius`, `borderColor`
1229
- - `backgroundColor`, `textColor`, `placeholderColor`
1230
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
1231
- - `disabledOpacity`, `dragBackgroundColor`
1232
- - `listGap`, `itemPadding`, `itemBorderColor`, `itemBackgroundColor`, `itemRadius`, `itemTextColor`, `sizeTextColor`
1233
- - `buttonPadding`, `buttonRadius`, `buttonBorderColor`, `buttonBackgroundColor`, `buttonTextColor`, `buttonHoverBackgroundColor`
1234
- - `removeSize`, `removeRadius`, `removeHoverBackgroundColor`
1235
- - `small.fontSize`, `small.padding`, `small.buttonPadding`
1236
- - `large.fontSize`, `large.padding`, `large.buttonPadding`
1237
-
1238
- ## SearchInput
1239
-
1240
- Props:
1241
-
1242
- - `modelValue?: string` (v-model)
1243
- - `placeholder?: string`
1244
- - `disabled?: boolean`
1245
- - `readonly?: boolean`
1246
- - `debounce?: number` (default `300`)
1247
- - `loading?: boolean` (default `false`)
1248
- - `clearable?: boolean` (default `false`)
1249
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1250
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1251
- - `ariaLabel?: string` (default `Search input`)
1252
-
1253
- Events:
1254
-
1255
- - `update:modelValue`
1256
- - `input`
1257
- - `change`
1258
- - `search`
1259
- - `clear`
1260
- - `focus`
1261
- - `blur`
1262
-
1263
- Example:
1264
-
1265
- ```vue
1266
- <SearchInput v-model="query" placeholder="Search..." clearable />
1267
- <SearchInput v-model="query" placeholder="Search..." :debounce="500" loading variant="outlined" />
1268
- ```
1269
-
1270
- ### SearchInput tokens
1271
-
1272
- Component tokens (override via `theme.overrides.components.searchInput`):
1273
-
1274
- - `gap`, `fontSize`, `padding`
1275
- - `borderRadius`, `borderColor`
1276
- - `backgroundColor`, `textColor`, `placeholderColor`
1277
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
1278
- - `disabledOpacity`
1279
- - `iconSize`, `iconColor`
1280
- - `clearSize`, `clearRadius`, `clearHoverBackgroundColor`
1281
- - `loadingSize`, `loadingBorderColor`, `loadingTopBorderColor`
1282
- - `small.fontSize`, `small.padding`, `small.iconSize`, `small.clearSize`
1283
- - `large.fontSize`, `large.padding`, `large.iconSize`, `large.clearSize`
1284
-
1285
- ## NumberInput
1286
-
1287
- Props:
1288
-
1289
- - `modelValue?: number | null` (v-model)
1290
- - `min?: number`
1291
- - `max?: number`
1292
- - `step?: number` (default `1`)
1293
- - `precision?: number`
1294
- - `placeholder?: string`
1295
- - `disabled?: boolean`
1296
- - `readonly?: boolean`
1297
- - `controls?: boolean` (default `true`)
1298
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1299
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1300
- - `ariaLabel?: string` (default `Number input`)
1301
-
1302
- Events:
1303
-
1304
- - `update:modelValue`
1305
- - `input`
1306
- - `change`
1307
- - `focus`
1308
- - `blur`
1309
-
1310
- Example:
1311
-
1312
- ```vue
1313
- <NumberInput v-model="quantity" :min="0" :max="10" :step="1" />
1314
- ```
1315
-
1316
- ## PasswordInput
1317
-
1318
- Props:
1319
-
1320
- - `modelValue?: string` (v-model)
1321
- - `placeholder?: string`
1322
- - `disabled?: boolean`
1323
- - `readonly?: boolean`
1324
- - `autocomplete?: string` (default `current-password`)
1325
- - `showToggle?: boolean` (default `true`)
1326
- - `showStrength?: boolean` (default `false`)
1327
- - `showCapsLockHint?: boolean` (default `true`)
1328
- - `revealLabel?: string` (default `Show password`)
1329
- - `hideLabel?: string` (default `Hide password`)
1330
- - `revealText?: string` (default `Show`)
1331
- - `hideText?: string` (default `Hide`)
1332
- - `capsLockHint?: string` (default `Caps Lock is on`)
1333
- - `weakLabel?: string` (default `Weak password`)
1334
- - `mediumLabel?: string` (default `Medium password`)
1335
- - `strongLabel?: string` (default `Strong password`)
1336
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1337
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1338
- - `ariaLabel?: string` (default `Password input`)
1339
-
1340
- Events:
1341
-
1342
- - `update:modelValue`
1343
- - `input`
1344
- - `change`
1345
- - `focus`
1346
- - `blur`
1347
- - `toggleVisibility` (payload: `boolean`)
1348
-
1349
- Example:
1350
-
1351
- ```vue
1352
- <PasswordInput v-model="password" show-strength />
1353
- ```
1354
-
1355
- ### PasswordInput tokens
1356
-
1357
- Component tokens (override via `theme.overrides.components.passwordInput`):
1358
-
1359
- - `gap`, `fontSize`, `padding`
1360
- - `borderRadius`, `borderColor`
1361
- - `backgroundColor`, `textColor`, `placeholderColor`
1362
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
1363
- - `disabledOpacity`
1364
- - `toggleSize`, `toggleRadius`, `toggleColor`, `toggleHoverBackgroundColor`
1365
- - `strengthGap`, `strengthTrackHeight`, `strengthTrackRadius`, `strengthTrackBackgroundColor`
1366
- - `strengthWeakColor`, `strengthMediumColor`, `strengthStrongColor`
1367
- - `metaFontSize`, `hintColor`
1368
- - `small.fontSize`, `small.padding`
1369
- - `large.fontSize`, `large.padding`
1370
-
1371
- ## OtpInput
1372
-
1373
- Props:
1374
-
1375
- - `modelValue?: string` (v-model)
1376
- - `length?: number` (default `6`)
1377
- - `placeholder?: string`
1378
- - `disabled?: boolean`
1379
- - `readonly?: boolean`
1380
- - `mask?: boolean` (default `false`)
1381
- - `alphanumeric?: boolean` (default `false`)
1382
- - `autocomplete?: string` (default `one-time-code`)
1383
- - `autoFocus?: boolean` (default `false`)
1384
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1385
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1386
- - `ariaLabel?: string` (default `OTP input`)
1387
-
1388
- Events:
1389
-
1390
- - `update:modelValue`
1391
- - `change`
1392
- - `complete` (payload: `string`)
1393
- - `focus`
1394
- - `blur`
1395
- - `paste` (payload: `string`)
1396
-
1397
- Example:
1398
-
1399
- ```vue
1400
- <OtpInput v-model="otp" :length="6" />
1401
- <OtpInput v-model="backupCode" :length="8" alphanumeric variant="outlined" />
1402
- ```
1403
-
1404
- ### OtpInput tokens
1405
-
1406
- Component tokens (override via `theme.overrides.components.otpInput`):
1407
-
1408
- - `gap`, `fontSize`, `cellSize`, `padding`
1409
- - `borderRadius`, `borderColor`
1410
- - `backgroundColor`, `textColor`, `placeholderColor`
1411
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
1412
- - `disabledOpacity`
1413
- - `small.cellSize`, `small.fontSize`, `small.padding`
1414
- - `large.cellSize`, `large.fontSize`, `large.padding`
1415
-
1416
- ## ColorPicker
1417
-
1418
- Props:
1419
-
1420
- - `modelValue?: string` (v-model)
1421
- - `format?: 'hex' | 'rgb' | 'hsl'` (default `hex`)
1422
- - `alpha?: boolean` (default `false`)
1423
- - `presets?: string[]` (default `[]`)
1424
- - `placeholder?: string`
1425
- - `disabled?: boolean`
1426
- - `readonly?: boolean`
1427
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1428
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1429
- - `ariaLabel?: string` (default `Color picker`)
1430
-
1431
- Events:
1432
-
1433
- - `update:modelValue`
1434
- - `change`
1435
- - `open`
1436
- - `close`
1437
-
1438
- Example:
1439
-
1440
- ```vue
1441
- <ColorPicker v-model="brandColor" />
1442
- <ColorPicker v-model="brandColorRgba" format="rgb" alpha variant="outlined" />
1443
- ```
1444
-
1445
- ### ColorPicker tokens
1446
-
1447
- Component tokens (override via `theme.overrides.components.colorPicker`):
1448
-
1449
- - `minWidth`, `gap`, `fontSize`, `padding`
1450
- - `borderRadius`, `borderColor`
1451
- - `backgroundColor`, `textColor`, `placeholderColor`
1452
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
1453
- - `disabledOpacity`
1454
- - `swatchSize`, `swatchRadius`
1455
- - `panelPadding`, `panelBorderColor`, `panelBackgroundColor`, `panelShadow`, `panelGap`
1456
- - `rangeAccentColor`
1457
- - `presetSize`, `presetRadius`, `presetBorderColor`, `presetHoverBorderColor`
1458
- - `small.padding`, `small.fontSize`, `small.swatchSize`, `small.presetSize`
1459
- - `large.padding`, `large.fontSize`, `large.swatchSize`, `large.presetSize`
1460
-
1461
- ## MaskedInput
1462
-
1463
- Props:
1464
-
1465
- - `modelValue?: string` (v-model)
1466
- - `mask?: string | ((value: string) => string)` (default `''`)
1467
- - `placeholder?: string`
1468
- - `placeholderChar?: string` (default `_`)
1469
- - `disabled?: boolean`
1470
- - `readonly?: boolean`
1471
- - `unmask?: boolean` (default `false`)
1472
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1473
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1474
-
1475
- Events:
1476
-
1477
- - `update:modelValue`
1478
- - `input`
1479
- - `change`
1480
- - `focus`
1481
- - `blur`
1482
- - `complete`
1483
-
1484
- Example:
1485
-
1486
- ```vue
1487
- <MaskedInput v-model="phone" mask="+7 (###) ###-##-##" />
1488
- <MaskedInput v-model="licenseRaw" mask="AA-####" unmask variant="outlined" />
1489
- ```
1490
-
1491
- ### MaskedInput tokens
1492
-
1493
- Component tokens (override via `theme.overrides.components.maskedInput`):
1494
-
1495
- - `gap`, `fontSize`, `padding`
1496
- - `borderRadius`, `borderColor`
1497
- - `backgroundColor`, `textColor`, `placeholderColor`
1498
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
1499
- - `disabledOpacity`
1500
- - `small.fontSize`, `small.padding`
1501
- - `large.fontSize`, `large.padding`
1502
-
1503
- ## RadioGroup / RadioButton
1504
-
1505
- Props (RadioGroup):
1506
-
1507
- - `modelValue?: string | number | boolean` (v-model)
1508
- - `name?: string`
1509
- - `disabled?: boolean`
1510
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1511
- - `direction?: 'vertical' | 'horizontal'` (default `vertical`)
1512
-
1513
- Props (RadioButton):
1514
-
1515
- - `value?: string | number | boolean`
1516
- - `label?: string`
1517
- - `disabled?: boolean`
1518
- - `name?: string`
1519
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1520
-
1521
- Example:
1522
-
1523
- ```vue
1524
- <RadioGroup v-model="plan" direction="horizontal">
1525
- <RadioButton value="basic">Basic</RadioButton>
1526
- <RadioButton value="pro">Pro</RadioButton>
1527
- </RadioGroup>
1528
- ```
1529
-
1530
- ## ButtonGroup
1531
-
1532
- Props:
1533
-
1534
- - `size?: 'small' | 'normal' | 'large'` (inherits to nested `Button`/`SplitButton` when child props are not set)
1535
- - `variant?: 'filled' | 'outlined' | 'text'` (inherits to nested `Button`/`SplitButton`)
1536
- - `severity?: 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'danger'` (inherits to nested `Button`/`SplitButton`)
1537
- - `disabled?: boolean` (default `false`)
1538
- - `orientation?: 'horizontal' | 'vertical'` (default `horizontal`)
1539
- - `attached?: boolean` (default `false`)
1540
-
1541
- Slots:
1542
-
1543
- - `default` - place `Button` / `SplitButton` items
1544
-
1545
- Example:
1546
-
1547
- ```vue
1548
- <ButtonGroup attached size="small" variant="outlined" severity="primary">
1549
- <Button label="Day" />
1550
- <Button label="Week" />
1551
- <Button label="Month" />
1552
- </ButtonGroup>
1553
- ```
1554
-
1555
- ### ButtonGroup tokens
1556
-
1557
- Component tokens (override via `theme.overrides.components.buttonGroup`):
1558
-
1559
- - `gap`, `borderRadius`, `disabledOpacity`
1560
-
1561
- ## Container
1562
-
1563
- Props:
1564
-
1565
- - `as?: string` (default `div`)
1566
- - `size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'` (default `lg`)
1567
- - `maxWidth?: string` (optional runtime override)
1568
- - `paddingX?: string` (optional runtime override)
1569
-
1570
- Slots:
1571
-
1572
- - `default`
1573
-
1574
- Example:
1575
-
1576
- ```vue
1577
- <Container size="xl">
1578
- <PageHeader title="Projects" subtitle="Manage active projects and team workload." />
1579
- </Container>
1580
- <Container as="main" max-width="90rem" padding-x="2rem">
1581
- <div>Custom width and horizontal padding</div>
1582
- </Container>
1583
- ```
1584
-
1585
- ### Container tokens
1586
-
1587
- Component tokens (override via `theme.overrides.components.container`):
1588
-
1589
- - `maxWidth`, `maxWidthSm`, `maxWidthMd`, `maxWidthLg`, `maxWidthXl`
1590
- - `paddingX`, `paddingXSm`, `paddingXLg`
1591
-
1592
- ## Breadcrumbs
1593
-
1594
- Props:
1595
-
1596
- - `items?: Array<{ label?: string; to?: string; href?: string; url?: string; active?: boolean; disabled?: boolean }>`
1597
- - `separator?: string` (default `/`)
1598
- - `ariaLabel?: string` (default `Breadcrumbs`)
1599
-
1600
- Slots:
1601
-
1602
- - `item` - slot props: `{ item, index, isLast, active }`
1603
- - `separator` (optional) - slot props: `{ separator }`
1604
-
1605
- Example:
1606
-
1607
- ```vue
1608
- <Breadcrumbs
1609
- :items="[
1610
- { label: 'Home', to: '/' },
1611
- { label: 'Settings', to: '/settings' },
1612
- { label: 'Profile', active: true },
1613
- ]"
1614
- />
1615
- ```
1616
-
1617
- ### Breadcrumbs tokens
1618
-
1619
- Component tokens (override via `theme.overrides.components.breadcrumbs`):
1620
-
1621
- - `gap`, `fontSize`, `textColor`, `hoverColor`, `activeColor`
1622
- - `separatorColor`, `disabledOpacity`
1623
-
1624
- ## Divider
1625
-
1626
- Props:
1627
-
1628
- - `orientation?: 'horizontal' | 'vertical'` (default `horizontal`)
1629
- - `variant?: 'solid' | 'dashed' | 'dotted'` (default `solid`)
1630
- - `inset?: boolean` (default `false`)
1631
- - `label?: string`
1632
- - `ariaLabel?: string` (default `Divider`)
1633
-
1634
- Slots:
1635
-
1636
- - `default` (optional) - custom label content (horizontal mode only)
1637
-
1638
- Example:
1639
-
1640
- ```vue
1641
- <Divider />
1642
- <Divider label="OR" />
1643
- <div style="height: 32px; display: flex; align-items: center; gap: 8px">
1644
- <span>Left</span>
1645
- <Divider orientation="vertical" />
1646
- <span>Right</span>
1647
- </div>
1648
- ```
1649
-
1650
- ### Divider tokens
1651
-
1652
- Component tokens (override via `theme.overrides.components.divider`):
1653
-
1654
- - `color`, `textColor`, `thickness`, `minLength`
1655
- - `gap`, `inset`
1656
- - `labelPadding`, `labelFontSize`
1657
-
1658
- ## PageHeader
1659
-
1660
- Props:
1661
-
1662
- - `title?: string`
1663
- - `subtitle?: string`
1664
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1665
- - `divider?: boolean` (default `false`)
1666
-
1667
- Slots:
1668
-
1669
- - `breadcrumbs` (optional)
1670
- - `title` (optional) - replaces `title` prop rendering
1671
- - `subtitle` (optional) - replaces `subtitle` prop rendering
1672
- - `meta` (optional)
1673
- - `actions` (optional)
1674
- - `default` (optional) - additional body content
1675
-
1676
- Example:
1677
-
1678
- ```vue
1679
- <PageHeader title="Projects" subtitle="Manage active projects and team workload.">
1680
- <template #breadcrumbs>
1681
- <Breadcrumbs :items="breadcrumbItems" />
1682
- </template>
1683
- <template #meta>
1684
- <Badge severity="info" variant="soft">24 active</Badge>
1685
- <Chip label="Last sync: 2m ago" />
1686
- </template>
1687
- <template #actions>
1688
- <Button label="Import" variant="outlined" severity="secondary" />
1689
- <Button label="New project" icon="plus" />
1690
- </template>
1691
- </PageHeader>
1692
- ```
1693
-
1694
- ### PageHeader tokens
1695
-
1696
- Component tokens (override via `theme.overrides.components.pageHeader`):
1697
-
1698
- - `gap`, `contentGap`, `breadcrumbGap`, `actionsGap`, `metaGap`
1699
- - `padding`, `borderRadius`, `borderColor`, `backgroundColor`, `textColor`, `dividerColor`
1700
- - `titleFontSize`, `titleLineHeight`, `titleFontWeight`
1701
- - `subtitleFontSize`, `subtitleColor`
1702
- - `small.padding`, `small.titleFontSize`, `small.subtitleFontSize`
1703
- - `large.padding`, `large.titleFontSize`, `large.subtitleFontSize`
1704
-
1705
- ## SegmentedControl
1706
-
1707
- Props:
1708
-
1709
- - `modelValue?: string | number` (v-model)
1710
- - `options?: Array<{ label: string; value: string | number; disabled?: boolean }>` (default `[]`)
1711
- - `disabled?: boolean`
1712
- - `fullWidth?: boolean` (default `false`)
1713
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1714
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1715
- - `ariaLabel?: string`
1716
- - `ariaLabelledby?: string`
1717
-
1718
- Events:
1719
-
1720
- - `update:modelValue`
1721
- - `change`
1722
- - `focus`
1723
- - `blur`
1724
-
1725
- Example:
1726
-
1727
- ```vue
1728
- <SegmentedControl
1729
- v-model="view"
1730
- :options="[
1731
- { label: 'List', value: 'list' },
1732
- { label: 'Grid', value: 'grid' },
1733
- { label: 'Board', value: 'board' },
1734
- ]"
1735
- />
1736
- ```
1737
-
1738
- ### SegmentedControl tokens
1739
-
1740
- Component tokens (override via `theme.overrides.components.segmentedControl`):
1741
-
1742
- - `fontSize`, `padding`, `gap`
1743
- - `borderRadius`, `borderColor`, `backgroundColor`, `textColor`
1744
- - `hoverBackgroundColor`, `activeBackgroundColor`, `activeTextColor`
1745
- - `focusRingShadow`, `disabledOpacity`
1746
- - `segmentPadding`, `segmentRadius`, `segmentFontWeight`
1747
- - `small.fontSize`, `small.padding`, `small.segmentPadding`
1748
- - `large.fontSize`, `large.padding`, `large.segmentPadding`
1749
-
1750
- ## Tabs / Tab / TabPanel
1751
-
1752
- Props (Tabs):
1753
-
1754
- - `modelValue?: string | number` (v-model)
1755
- - `disabled?: boolean`
1756
- - `orientation?: 'horizontal' | 'vertical'` (default `horizontal`)
1757
-
1758
- Props (Tab):
1759
-
1760
- - `value: string | number`
1761
- - `label?: string`
1762
- - `disabled?: boolean`
1763
-
1764
- Props (TabPanel):
1765
-
1766
- - `value: string | number`
1767
-
1768
- Example:
1769
-
1770
- ```vue
1771
- <Tabs v-model="tab">
1772
- <template #tabs>
1773
- <Tab value="overview">Overview</Tab>
1774
- <Tab value="settings">Settings</Tab>
1775
- </template>
1776
- <template #panels>
1777
- <TabPanel value="overview">Overview content</TabPanel>
1778
- <TabPanel value="settings">Settings content</TabPanel>
1779
- </template>
1780
- </Tabs>
1781
- ```
1782
-
1783
- ### Tabs tokens
1784
-
1785
- Component tokens (override via `theme.overrides.components.tabs`):
1786
-
1787
- - `gap`, `listGap`, `listBorderWidth`, `listBorderColor`, `listVerticalPadding`
1788
- - `tabPadding`, `tabFontSize`, `tabBorderRadius`
1789
- - `tabTextColor`, `tabBackgroundColor`, `tabHoverBackgroundColor`
1790
- - `tabActiveTextColor`, `tabActiveBackgroundColor`, `tabActiveBorderColor`, `tabActiveBorderWidth`
1791
- - `panelPadding`, `panelBorderRadius`, `panelBackgroundColor`, `panelTextColor`
1792
- - `disabledOpacity`
1793
-
1794
- ## Accordion / AccordionItem
1795
-
1796
- Props (Accordion):
1797
-
1798
- - `modelValue?: string | number | Array<string | number>` (v-model)
1799
- - `multiple?: boolean` (default `false`)
1800
- - `disabled?: boolean`
1801
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1802
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1803
- - `ariaLabel?: string`
1804
- - `ariaLabelledby?: string`
1805
-
1806
- Props (AccordionItem):
1807
-
1808
- - `value: string | number`
1809
- - `title?: string`
1810
- - `disabled?: boolean`
1811
- - `unmount?: boolean` (default `false`)
1812
-
1813
- Events:
1814
-
1815
- - `update:modelValue`
1816
- - `change`
1817
-
1818
- Example:
1819
-
1820
- ```vue
1821
- <Accordion v-model="faq">
1822
- <AccordionItem value="shipping" title="Shipping">
1823
- Shipping details
1824
- </AccordionItem>
1825
- <AccordionItem value="returns" title="Returns">
1826
- Returns policy
1827
- </AccordionItem>
1828
- </Accordion>
1829
- ```
1830
-
1831
- ### Accordion tokens
1832
-
1833
- Component tokens (override via `theme.overrides.components.accordion`):
1834
-
1835
- - `gap`, `borderRadius`, `borderColor`, `backgroundColor`
1836
- - `headerGap`, `headerPadding`, `headerFontSize`, `headerFontWeight`
1837
- - `headerTextColor`, `headerBackgroundColor`, `headerHoverBackgroundColor`, `headerActiveBackgroundColor`
1838
- - `contentPadding`, `contentTextColor`, `contentBackgroundColor`
1839
- - `iconSize`, `iconColor`, `dividerColor`
1840
- - `focusRingShadow`, `disabledOpacity`
1841
- - `small.headerPadding`, `small.headerFontSize`, `small.contentPadding`
1842
- - `large.headerPadding`, `large.headerFontSize`, `large.contentPadding`
1843
-
1844
- ## Toast / ToastContainer
1845
-
1846
- Props (Toast):
1847
-
1848
- - `modelValue?: boolean` (v-model)
1849
- - `title?: string`
1850
- - `message?: string`
1851
- - `severity?: 'neutral' | 'info' | 'success' | 'warn' | 'danger'` (default `neutral`)
1852
- - `closable?: boolean` (default `true`)
1853
- - `duration?: number` (ms, default `0`, no auto-close)
1854
-
1855
- Props (ToastContainer):
1856
-
1857
- - `position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'` (default `top-right`)
1858
-
1859
- Example:
1860
-
1861
- ```vue
1862
- <ToastContainer position="top-right">
1863
- <Toast v-model="toastOpen" title="Saved" message="Changes are saved." severity="success" :duration="2500" />
1864
- </ToastContainer>
1865
- ```
1866
-
1867
- ### Toast tokens
1868
-
1869
- Component tokens (override via `theme.overrides.components.toast`):
1870
-
1871
- - `gap`, `padding`, `borderRadius`, `borderColor`
1872
- - `backgroundColor`, `textColor`, `shadow`, `minWidth`
1873
- - `fontSize`, `lineHeight`, `bodyGap`
1874
- - `titleFontSize`, `titleFontWeight`, `closeSize`
1875
- - `containerGap`, `containerPadding`, `containerMaxWidth`, `zIndex`
1876
- - `info.*`, `success.*`, `warn.*`, `danger.*` (backgroundColor/borderColor/textColor)
1877
-
1878
- ## Alert
1879
-
1880
- Props:
1881
-
1882
- - `modelValue?: boolean` (optional v-model)
1883
- - `title?: string`
1884
- - `message?: string`
1885
- - `severity?: 'neutral' | 'info' | 'success' | 'warn' | 'danger'` (default `neutral`)
1886
- - `closable?: boolean` (default `false`)
1887
- - `icon?: string`
1888
-
1889
- Slots:
1890
-
1891
- - `default` - message content (fallbacks to `message`)
1892
- - `title` (optional)
1893
- - `icon` (optional)
1894
- - `actions` (optional)
1895
- - `close` (optional)
1896
-
1897
- Events:
1898
-
1899
- - `update:modelValue`
1900
- - `close`
1901
-
1902
- Example:
1903
-
1904
- ```vue
1905
- <Alert v-model="alertOpen" severity="warn" title="Unsaved changes" closable>
1906
- You have unsaved form changes.
1907
- <template #actions>
1908
- <Button label="Save" size="small" />
1909
- </template>
1910
- </Alert>
1911
- ```
1912
-
1913
- ### Alert tokens
1914
-
1915
- Component tokens (override via `theme.overrides.components.alert`):
1916
-
1917
- - `gap`, `padding`, `borderRadius`, `borderColor`
1918
- - `backgroundColor`, `textColor`, `iconColor`
1919
- - `fontSize`, `lineHeight`, `bodyGap`
1920
- - `titleFontSize`, `titleFontWeight`
1921
- - `actionsGap`, `closeSize`, `closeRadius`, `closeFontSize`, `closeHoverBackgroundColor`
1922
- - `info.*`, `success.*`, `warn.*`, `danger.*` (backgroundColor/borderColor/textColor)
1923
-
1924
- ## EmptyState
1925
-
1926
- Props:
1927
-
1928
- - `title?: string`
1929
- - `description?: string`
1930
- - `icon?: string`
1931
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
1932
- - `variant?: 'filled' | 'outlined'` (default `filled`)
1933
-
1934
- Slots:
1935
-
1936
- - `default` - description content (fallbacks to `description`)
1937
- - `title` (optional)
1938
- - `icon` (optional)
1939
- - `actions` (optional)
1940
-
1941
- Example:
1942
-
1943
- ```vue
1944
- <EmptyState title="No projects yet" description="Create your first project to get started." icon="📂">
1945
- <template #actions>
1946
- <Button label="Create project" size="small" />
1947
- <Button label="Import" size="small" severity="secondary" />
1948
- </template>
1949
- </EmptyState>
1950
- ```
1951
-
1952
- ### EmptyState tokens
1953
-
1954
- Component tokens (override via `theme.overrides.components.emptyState`):
1955
-
1956
- - `gap`, `bodyGap`, `padding`, `borderRadius`
1957
- - `borderColor`, `backgroundColor`, `textColor`, `maxWidth`
1958
- - `iconSize`, `iconColor`
1959
- - `titleFontSize`, `titleLineHeight`, `titleFontWeight`, `titleColor`
1960
- - `descriptionFontSize`, `descriptionLineHeight`, `descriptionColor`
1961
- - `actionsGap`
1962
- - `small.padding`, `small.iconSize`, `small.titleFontSize`, `small.descriptionFontSize`
1963
- - `large.padding`, `large.iconSize`, `large.titleFontSize`, `large.descriptionFontSize`
1964
-
1965
- ### Textarea tokens
1966
-
1967
- Component tokens (override via `theme.overrides.components.textarea`):
1968
-
1969
- - `gap`, `fontSize`, `padding`
1970
- - `borderRadius`, `borderColor`
1971
- - `backgroundColor`, `textColor`, `placeholderColor`
1972
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
1973
- - `disabledOpacity`
1974
- - `minHeight`, `resize`
1975
- - `small.fontSize`, `small.padding`
1976
- - `large.fontSize`, `large.padding`
1977
-
1978
- ### RichTextEditor tokens
1979
-
1980
- Component tokens (override via `theme.overrides.components.richTextEditor`):
1981
-
1982
- - `gap`, `fontSize`, `padding`
1983
- - `borderRadius`, `borderColor`
1984
- - `backgroundColor`, `textColor`, `placeholderColor`
1985
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
1986
- - `disabledOpacity`
1987
- - `minHeight`, `resize`
1988
- - `toolbarGap`, `toolbarPadding`, `toolbarBorderColor`, `toolbarBackgroundColor`
1989
- - `toolbarButtonMinWidth`, `toolbarButtonPadding`, `toolbarButtonRadius`
1990
- - `toolbarButtonBorderColor`, `toolbarButtonBackgroundColor`, `toolbarButtonTextColor`
1991
- - `toolbarButtonHoverBackgroundColor`, `toolbarButtonActiveBackgroundColor`
1992
- - `counterFontSize`, `counterColor`, `counterDangerColor`
1993
- - `small.fontSize`, `small.padding`, `small.toolbarButtonPadding`
1994
- - `large.fontSize`, `large.padding`, `large.toolbarButtonPadding`
1995
-
1996
- ## Modal
1997
-
1998
- Props:
1999
-
2000
- - `modelValue?: boolean` (v-model)
2001
- - `title?: string`
2002
- - `size?: 'sm' | 'md' | 'lg'`
2003
- - `closeOnOverlay?: boolean` (default true)
2004
- - `closeOnEsc?: boolean` (default true)
2005
- - `showClose?: boolean` (default true)
2006
- - `lockScroll?: boolean` (default true)
2007
-
2008
- Slots:
2009
-
2010
- - `header` (optional) - replaces the title area
2011
- - `body` (optional) - modal content (defaults to default slot if not provided)
2012
- - `default` (optional) - modal content if `body` slot is not used
2013
- - `footer` (optional)
2014
- - `close` (optional) - custom close button; slot props: `{ close }`
2015
-
2016
- Events:
2017
-
2018
- - `update:modelValue`
2019
- - `open`
2020
- - `close`
2021
-
2022
- Example:
2023
-
2024
- ```vue
2025
- <Modal v-model="open" title="Confirm action" size="sm">
2026
- <template #body>
2027
- <p>Are you sure?</p>
2028
- </template>
2029
- <template #footer>
2030
- <Button label="Cancel" severity="secondary" @click="open = false" />
2031
- <Button label="Confirm" @click="open = false" />
2032
- </template>
2033
- </Modal>
2034
- ```
2035
-
2036
- ### Modal tokens
2037
-
2038
- Component tokens (override via `theme.overrides.components.modal`):
2039
-
2040
- - `width`, `maxWidth`, `maxHeight`
2041
- - `widthSm`, `maxWidthSm`
2042
- - `widthLg`, `maxWidthLg`
2043
- - `padding`, `borderRadius`
2044
- - `backgroundColor`, `textColor`
2045
- - `overlayBackgroundColor`
2046
- - `shadow`
2047
- - `zIndex`
2048
- - `headerGap`, `bodyGap`, `footerGap`
2049
- - `titleFontSize`, `titleLineHeight`, `titleFontWeight`
2050
- - `closeSize`, `closeRadius`, `closeOffset`
2051
- - `closeColor`, `closeFontSize`, `closeHoverBackgroundColor`
2052
-
2053
- ## ConfirmDialog
2054
-
2055
- Props:
2056
-
2057
- - `modelValue?: boolean` (v-model)
2058
- - `title?: string` (default `Confirm action`)
2059
- - `message?: string`
2060
- - `confirmLabel?: string` (default `Confirm`)
2061
- - `cancelLabel?: string` (default `Cancel`)
2062
- - `confirmSeverity?: 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'danger'` (default `danger`)
2063
- - `loading?: boolean` (default `false`)
2064
- - `closeOnConfirm?: boolean` (default `true`)
2065
- - `size?: 'sm' | 'md' | 'lg'` (default `sm`)
2066
- - `closeOnOverlay?: boolean` (default `true`)
2067
- - `closeOnEsc?: boolean` (default `true`)
2068
- - `showClose?: boolean` (default `true`)
2069
- - `lockScroll?: boolean` (default `true`)
2070
-
2071
- Slots:
2072
-
2073
- - `default` (optional) - dialog message/body content (fallbacks to `message`)
2074
- - `actions` (optional) - custom action buttons; slot props: `{ confirm, cancel }`
2075
-
2076
- Events:
2077
-
2078
- - `update:modelValue`
2079
- - `confirm`
2080
- - `cancel`
2081
- - `open`
2082
- - `close`
2083
-
2084
- Example:
2085
-
2086
- ```vue
2087
- <ConfirmDialog
2088
- v-model="open"
2089
- title="Delete item?"
2090
- message="This action cannot be undone."
2091
- confirm-label="Delete"
2092
- @confirm="removeItem"
2093
- />
2094
- ```
2095
-
2096
- ### ConfirmDialog tokens
2097
-
2098
- Component tokens (override via `theme.overrides.components.confirmDialog`):
2099
-
2100
- - `maxWidth`
2101
- - `messageColor`, `messageFontSize`, `messageLineHeight`
2102
- - `actionsGap`
2103
-
2104
- ## Drawer
2105
-
2106
- Props:
2107
-
2108
- - `modelValue?: boolean` (v-model)
2109
- - `title?: string`
2110
- - `position?: 'left' | 'right' | 'top' | 'bottom'` (default `right`)
2111
- - `size?: 'sm' | 'md' | 'lg'`
2112
- - `overlay?: boolean` (default `true`)
2113
- - `closeOnOverlay?: boolean` (default `true`)
2114
- - `closeOnEsc?: boolean` (default `true`)
2115
- - `showClose?: boolean` (default `true`)
2116
- - `lockScroll?: boolean` (default `true`)
2117
-
2118
- Slots:
2119
-
2120
- - `header` (optional) - replaces the title area
2121
- - `body` (optional) - drawer content (defaults to default slot if not provided)
2122
- - `default` (optional) - drawer content if `body` slot is not used
2123
- - `footer` (optional)
2124
- - `close` (optional) - custom close button; slot props: `{ close }`
2125
-
2126
- Events:
2127
-
2128
- - `update:modelValue`
2129
- - `open`
2130
- - `close`
2131
-
2132
- Example:
2133
-
2134
- ```vue
2135
- <Drawer v-model="open" title="Filters" position="right">
2136
- <template #body>
2137
- <p>Drawer content</p>
2138
- </template>
2139
- <template #footer>
2140
- <Button label="Reset" severity="secondary" size="small" />
2141
- <Button label="Apply" size="small" @click="open = false" />
2142
- </template>
2143
- </Drawer>
2144
- ```
2145
-
2146
- ### Drawer tokens
2147
-
2148
- Component tokens (override via `theme.overrides.components.drawer`):
2149
-
2150
- - `width`, `widthSm`, `widthLg`
2151
- - `height`, `heightSm`, `heightLg`
2152
- - `padding`, `borderRadius`
2153
- - `backgroundColor`, `textColor`
2154
- - `overlayBackgroundColor`
2155
- - `shadow`
2156
- - `zIndex`
2157
- - `headerGap`, `bodyGap`, `footerGap`
2158
- - `titleFontSize`, `titleLineHeight`, `titleFontWeight`
2159
- - `closeSize`, `closeRadius`, `closeOffset`
2160
- - `closeColor`, `closeFontSize`, `closeHoverBackgroundColor`
2161
-
2162
- ## Dropdown
2163
-
2164
- Props:
2165
-
2166
- - `modelValue?: boolean` (v-model)
2167
- - `items?: Array<{ label?: string; to?: string; href?: string; url?: string; icon?: string; disabled?: boolean; separator?: boolean; command?: () => void }>`
2168
- - `placement?: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end' | 'bottom' | 'top'` (default `bottom-start`)
2169
- - `offset?: number` (default `6`)
2170
- - `disabled?: boolean`
2171
- - `closeOnSelect?: boolean` (default `true`)
2172
- - `closeOnEsc?: boolean` (default `true`)
2173
- - `matchTriggerWidth?: boolean` (default `true`)
2174
-
2175
- Slots:
2176
-
2177
- - `trigger`
2178
- - `default` (optional) - dropdown content (defaults to `items` list if provided)
2179
-
2180
- Note: For custom dropdown content, add `data-dropdown-close` to clickable elements to auto-close on click.
2181
-
2182
- Events:
2183
-
2184
- - `update:modelValue`
2185
- - `open`
2186
- - `close`
2187
- - `select`
2188
-
2189
- Example:
2190
-
2191
- ```vue
2192
- <Dropdown :items="menuItems">
2193
- <template #trigger>
2194
- <Button label="Actions" />
2195
- </template>
2196
- </Dropdown>
2197
- ```
2198
-
2199
- ### Dropdown tokens
2200
-
2201
- Component tokens (override via `theme.overrides.components.dropdown`):
2202
-
2203
- - `panelPadding`, `panelBorderRadius`, `panelBorderColor`
2204
- - `panelBackgroundColor`, `panelShadow`, `zIndex`
2205
- - `disabledOpacity`, `itemPadding`
2206
-
2207
- ## ContextMenu
2208
-
2209
- Props:
2210
-
2211
- - `modelValue?: boolean` (v-model)
2212
- - `items?: Array<{ label?: string; to?: string; href?: string; url?: string; icon?: string; disabled?: boolean; separator?: boolean; command?: () => void }>`
2213
- - `disabled?: boolean`
2214
- - `closeOnSelect?: boolean` (default `true`)
2215
- - `closeOnEsc?: boolean` (default `true`)
2216
- - `offset?: number` (default `2`)
2217
-
2218
- Slots:
2219
-
2220
- - `default` - context area/target
2221
- - `menu` (optional) - menu content (defaults to `items` list if provided)
2222
-
2223
- Note: For custom menu content, add `data-context-menu-close` to clickable elements to auto-close on click.
2224
-
2225
- Events:
2226
-
2227
- - `update:modelValue`
2228
- - `open`
2229
- - `close`
2230
- - `select`
2231
- - `contextmenu`
2232
-
2233
- Example:
2234
-
2235
- ```vue
2236
- <ContextMenu :items="menuItems">
2237
- <div class="surface">Right-click here</div>
2238
- </ContextMenu>
2239
- ```
2240
-
2241
- ### ContextMenu tokens
2242
-
2243
- Component tokens (override via `theme.overrides.components.contextMenu`):
2244
-
2245
- - `minWidth`
2246
- - `panelPadding`, `panelBorderRadius`, `panelBorderColor`
2247
- - `panelBackgroundColor`, `panelShadow`, `zIndex`
2248
- - `disabledOpacity`, `itemPadding`
2249
-
2250
- ## CommandPalette
2251
-
2252
- Props:
2253
-
2254
- - `modelValue?: boolean` (v-model)
2255
- - `items?: Array<{ label: string; value?: string | number; description?: string; shortcut?: string; group?: string; disabled?: boolean; keywords?: Array<string>; command?: () => void }>`
2256
- - `placeholder?: string` (default `Type a command or search...`)
2257
- - `emptyText?: string` (default `No commands found`)
2258
- - `ariaLabel?: string` (default `Command palette`)
2259
- - `closeOnOverlay?: boolean` (default `true`)
2260
- - `closeOnEsc?: boolean` (default `true`)
2261
- - `closeOnSelect?: boolean` (default `true`)
2262
- - `filter?: boolean` (default `true`)
2263
- - `enableShortcut?: boolean` (default `true`)
2264
- - `shortcutKey?: string` (default `k`)
2265
-
2266
- Events:
2267
-
2268
- - `update:modelValue`
2269
- - `open`
2270
- - `close`
2271
- - `select`
2272
- - `search`
2273
-
2274
- Example:
2275
-
2276
- ```vue
2277
- <CommandPalette
2278
- v-model="open"
2279
- :items="[
2280
- { label: 'Open docs', value: 'docs', group: 'Navigation' },
2281
- { label: 'Save and publish', value: 'publish', group: 'Actions', shortcut: 'Ctrl+Enter' },
2282
- ]"
2283
- @select="onCommand"
2284
- />
2285
- ```
2286
-
2287
- ### CommandPalette tokens
2288
-
2289
- Component tokens (override via `theme.overrides.components.commandPalette`):
2290
-
2291
- - `width`, `maxWidth`, `maxHeight`
2292
- - `padding`, `borderRadius`, `borderColor`
2293
- - `backgroundColor`, `textColor`, `overlayBackgroundColor`
2294
- - `shadow`, `zIndex`, `headerGap`
2295
- - `inputPadding`, `inputBorderRadius`, `inputBorderColor`
2296
- - `inputBackgroundColor`, `inputTextColor`, `inputPlaceholderColor`
2297
- - `inputFocusBorderColor`, `inputFocusRingShadow`
2298
- - `listGap`, `groupGap`
2299
- - `groupLabelPadding`, `groupLabelColor`, `groupLabelFontSize`
2300
- - `itemPadding`, `itemBorderRadius`, `itemGap`
2301
- - `itemTextColor`, `itemDescriptionColor`, `itemDescriptionFontSize`
2302
- - `itemActiveBackgroundColor`, `itemActiveTextColor`, `itemDisabledOpacity`
2303
- - `shortcutPadding`, `shortcutBorderRadius`, `shortcutBorderColor`
2304
- - `shortcutBackgroundColor`, `shortcutTextColor`, `shortcutFontSize`
2305
- - `emptyPadding`, `emptyColor`
2306
-
2307
- ## NotificationCenter
2308
-
2309
- Props:
2310
-
2311
- - `modelValue?: boolean` (v-model)
2312
- - `items?: Array<{ id: string | number; title: string; message?: string; date?: string; read?: boolean; severity?: 'neutral' | 'info' | 'success' | 'warn' | 'danger'; avatar?: string }>`
2313
- - `title?: string` (default `Notifications`)
2314
- - `emptyText?: string` (default `No notifications`)
2315
- - `closeOnOverlay?: boolean` (default `true`)
2316
- - `closeOnEsc?: boolean` (default `true`)
2317
- - `markAllLabel?: string` (default `Mark all as read`)
2318
- - `clearLabel?: string` (default `Clear`)
2319
- - `closeLabel?: string` (default `Close notifications`)
2320
- - `readLabel?: string` (default `Mark as read`)
2321
- - `unreadLabel?: string` (default `Mark as unread`)
2322
-
2323
- Slots:
2324
-
2325
- - `item` (optional) - slot props `{ item, index, toggleRead }`
2326
- - `empty` (optional)
2327
-
2328
- Events:
2329
-
2330
- - `update:modelValue`
2331
- - `update:items`
2332
- - `open`
2333
- - `close`
2334
- - `click`
2335
- - `read`
2336
- - `readAll`
2337
- - `clear`
2338
-
2339
- Example:
2340
-
2341
- ```vue
2342
- <NotificationCenter v-model="open" v-model:items="notifications" />
2343
- ```
2344
-
2345
- ### NotificationCenter tokens
2346
-
2347
- Component tokens (override via `theme.overrides.components.notificationCenter`):
2348
-
2349
- - `zIndex`, `overlayBackgroundColor`
2350
- - `top`, `right`, `width`, `maxWidth`, `maxHeight`
2351
- - `borderColor`, `borderRadius`, `backgroundColor`, `textColor`, `shadow`
2352
- - `dividerColor`, `headerGap`, `headerPadding`
2353
- - `titleGap`, `titleFontSize`, `titleLineHeight`, `titleFontWeight`
2354
- - `badgeSize`, `badgeBackgroundColor`, `badgeTextColor`, `badgeFontSize`
2355
- - `actionsGap`, `closeSize`, `closeHoverBackgroundColor`, `disabledOpacity`
2356
- - `itemGap`, `itemPadding`, `unreadBackgroundColor`
2357
- - `avatarSize`, `avatarBackgroundColor`, `avatarTextColor`, `avatarFontSize`
2358
- - `itemTitleFontSize`, `itemTitleFontWeight`, `itemMetaFontSize`, `itemMetaColor`
2359
- - `emptyPadding`, `emptyColor`
2360
-
2361
- ## AppShell
2362
-
2363
- Props:
2364
-
2365
- - `modelValue?: boolean` (v-model collapsed state on desktop)
2366
- - `sidebarWidth?: string` (default `16rem`)
2367
- - `sidebarCollapsedWidth?: string` (default `4.25rem`)
2368
- - `mobileBreakpoint?: number` (default `1024`)
2369
- - `stickyHeader?: boolean` (default `true`)
2370
- - `fullHeight?: boolean` (default `true`)
2371
- - `showToggle?: boolean` (default `true`)
2372
- - `closeOnEsc?: boolean` (default `true`)
2373
- - `toggleLabel?: string` (default `Toggle sidebar`)
2374
- - `closeSidebarLabel?: string` (default `Close sidebar`)
2375
- - `toggleIcon?: string` (default `☰`)
2376
- - `mainAriaLabel?: string` (default `Main content`)
2377
-
2378
- Slots:
2379
-
2380
- - `sidebar` (optional) - slot props `{ mobile, collapsed }`
2381
- - `header` (optional) - slot props `{ mobile, collapsed, mobileSidebarOpen, toggleSidebar }`
2382
- - `default` - main content
2383
- - `footer` (optional) - slot props `{ mobile, collapsed }`
2384
-
2385
- Events:
2386
-
2387
- - `update:modelValue`
2388
- - `sidebar-toggle`
2389
- - `breakpoint-change`
2390
-
2391
- Example:
2392
-
2393
- ```vue
2394
- <AppShell v-model="collapsed">
2395
- <template #sidebar>Sidebar</template>
2396
- <template #header>Header</template>
2397
- <div>Main</div>
2398
- <template #footer>Footer</template>
2399
- </AppShell>
2400
- ```
2401
-
2402
- ### AppShell tokens
2403
-
2404
- Component tokens (override via `theme.overrides.components.appShell`):
2405
-
2406
- - `gap`, `backgroundColor`, `textColor`
2407
- - `sidebarBackgroundColor`, `sidebarBorderColor`
2408
- - `headerHeight`, `headerPadding`, `headerGap`, `headerBackgroundColor`, `headerBorderColor`
2409
- - `contentPadding`, `mainBackgroundColor`
2410
- - `footerPadding`, `footerBorderColor`, `footerBackgroundColor`
2411
- - `toggleSize`, `toggleBorderRadius`, `toggleBackgroundColor`, `toggleTextColor`, `toggleHoverBackgroundColor`
2412
- - `overlayBackgroundColor`, `zIndex`
2413
-
2414
- ## KanbanBoard
2415
-
2416
- Props:
2417
-
2418
- - `columns?: Array<{ id: string | number; title: string }>`
2419
- - `items?: Array<{ id: string | number; columnId: string | number; title: string; description?: string; assignee?: string; priority?: 'low' | 'medium' | 'high'; tags?: string[] }>`
2420
- - `ariaLabel?: string` (default `Kanban board`)
2421
- - `emptyColumnText?: string` (default `Drop cards here`)
2422
-
2423
- Slots:
2424
-
2425
- - `column-header` (optional) - slot props `{ column, items }`
2426
- - `card` (optional) - slot props `{ item, column, index }`
2427
- - `column-footer` (optional) - slot props `{ column, items }`
2428
- - `empty-column` (optional) - slot props `{ column }`
2429
-
2430
- Events:
2431
-
2432
- - `update:items`
2433
- - `move`
2434
- - `click`
2435
-
2436
- Example:
2437
-
2438
- ```vue
2439
- <KanbanBoard v-model:items="items" :columns="columns" @move="onMove" />
2440
- ```
2441
-
2442
- ### KanbanBoard tokens
2443
-
2444
- Component tokens (override via `theme.overrides.components.kanbanBoard`):
2445
-
2446
- - `gap`, `columnMinWidth`, `columnGap`
2447
- - `columnBorderColor`, `columnBorderRadius`, `columnBackgroundColor`
2448
- - `columnHeaderPadding`, `columnHeaderBorderColor`
2449
- - `columnTitleFontSize`, `columnTitleFontWeight`, `columnCountFontSize`, `columnCountColor`
2450
- - `bodyPadding`
2451
- - `cardGap`, `cardPadding`, `cardBorderRadius`, `cardBorderColor`, `cardBackgroundColor`, `cardHoverBorderColor`
2452
- - `cardTitleFontSize`, `cardTitleFontWeight`, `cardDescriptionFontSize`, `cardDescriptionColor`
2453
- - `priorityLowColor`, `priorityMediumColor`, `priorityHighColor`
2454
- - `tagGap`, `tagPadding`, `tagBorderRadius`, `tagBackgroundColor`, `tagTextColor`
2455
- - `assigneeFontSize`, `assigneeColor`
2456
- - `emptyPadding`, `emptyColor`
2457
- - `columnFooterPadding`, `columnFooterBorderColor`
2458
- - `dragOpacity`
2459
-
2460
- ## Tour
45
+ </PageHeader>
46
+ </Container>
47
+ </template>
2461
48
 
2462
- Props:
2463
-
2464
- - `modelValue?: boolean` (v-model)
2465
- - `steps?: Array<{ target?: string | HTMLElement; title?: string; content?: string; placement?: 'top' | 'bottom' | 'left' | 'right'; offset?: number }>`
2466
- - `startIndex?: number` (default `0`)
2467
- - `placement?: 'top' | 'bottom' | 'left' | 'right'` (default `bottom`)
2468
- - `offset?: number` (default `10`)
2469
- - `mask?: boolean` (default `true`)
2470
- - `closeOnOverlay?: boolean` (default `true`)
2471
- - `closeOnEsc?: boolean` (default `true`)
2472
- - `showSkip?: boolean` (default `true`)
2473
- - `showProgress?: boolean` (default `true`)
2474
- - `spotlightPadding?: number` (default `6`)
2475
- - `nextLabel?: string` (default `Next`)
2476
- - `prevLabel?: string` (default `Back`)
2477
- - `finishLabel?: string` (default `Finish`)
2478
- - `skipLabel?: string` (default `Skip`)
2479
- - `ariaLabel?: string` (default `Tour`)
2480
-
2481
- Slots:
2482
-
2483
- - `default` - step content with slot props `{ step, index }`
2484
- - `title` (optional) - step title with slot props `{ step, index }`
2485
- - `actions` (optional) - custom actions with slot props `{ step, index, isFirst, isLast, prev, next, skip }`
2486
-
2487
- Events:
2488
-
2489
- - `update:modelValue`
2490
- - `open`
2491
- - `close` (payload reason: `overlay | esc | complete | skip`)
2492
- - `stepChange`
2493
- - `next`
2494
- - `prev`
2495
- - `complete`
2496
- - `skip`
2497
-
2498
- Example:
2499
-
2500
- ```vue
2501
- <Tour
2502
- v-model="tourOpen"
2503
- :steps="[
2504
- { target: '#tour-start', title: 'Start', content: 'Launch onboarding here.' },
2505
- { target: '#tour-search', title: 'Search', content: 'Find projects quickly.', placement: 'bottom' },
2506
- ]"
2507
- />
2508
- ```
2509
-
2510
- ### Tour tokens
2511
-
2512
- Component tokens (override via `theme.overrides.components.tour`):
2513
-
2514
- - `zIndex`, `overlayBackgroundColor`
2515
- - `width`, `maxWidth`, `padding`
2516
- - `borderRadius`, `borderColor`
2517
- - `backgroundColor`, `textColor`, `shadow`
2518
- - `titleGap`, `titleFontSize`, `titleLineHeight`, `titleFontWeight`
2519
- - `contentGap`, `contentFontSize`, `contentLineHeight`, `contentColor`
2520
- - `progressGap`, `progressFontSize`, `progressColor`
2521
- - `actionsGap`
2522
- - `buttonMinWidth`, `buttonPadding`, `buttonRadius`
2523
- - `buttonBorderColor`, `buttonBackgroundColor`, `buttonTextColor`, `buttonHoverBackgroundColor`
2524
- - `secondaryButtonBorderColor`, `secondaryButtonBackgroundColor`, `secondaryButtonTextColor`, `secondaryButtonHoverBackgroundColor`
2525
- - `spotlightRadius`, `spotlightBorderWidth`, `spotlightBorderColor`
2526
- - `disabledOpacity`
2527
-
2528
- ## Tooltip
2529
-
2530
- Props:
2531
-
2532
- - `text?: string`
2533
- - `placement?: 'top' | 'bottom' | 'left' | 'right'` (default `top`)
2534
- - `disabled?: boolean`
2535
- - `arrow?: boolean` (default `false`)
2536
-
2537
- Slots:
2538
-
2539
- - `default` - trigger content
2540
- - `content` (optional) - tooltip content (fallbacks to `text`)
2541
-
2542
- Example:
2543
-
2544
- ```vue
2545
- <Tooltip text="Helpful hint" arrow>
2546
- <Button label="Hover me" />
2547
- </Tooltip>
2548
- ```
2549
-
2550
- ## Skeleton
2551
-
2552
- Props:
2553
-
2554
- - `width?: string | number`
2555
- - `height?: string | number`
2556
- - `variant?: 'text' | 'rect' | 'circle'` (default `text`)
2557
- - `animated?: boolean` (default `true`)
2558
-
2559
- Example:
2560
-
2561
- ```vue
2562
- <Skeleton width="240px" height="14px" />
2563
- <Skeleton width="180px" height="14px" />
2564
- <Skeleton variant="circle" width="48" />
2565
- ```
2566
-
2567
- ## Badge
2568
-
2569
- Props:
2570
-
2571
- - `label?: string`
2572
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
2573
- - `variant?: 'solid' | 'soft' | 'outline'` (default `soft`)
2574
- - `severity?: 'neutral' | 'info' | 'success' | 'warn' | 'danger'` (default `neutral`)
2575
- - `ariaLabel?: string`
2576
-
2577
- Slots:
2578
-
2579
- - `default` - badge content (fallbacks to `label`)
2580
-
2581
- Example:
2582
-
2583
- ```vue
2584
- <Badge label="Beta" />
2585
- <Badge severity="success" variant="outline">Active</Badge>
2586
- ```
2587
-
2588
- ### Badge tokens
2589
-
2590
- Component tokens (override via `theme.overrides.components.badge`):
2591
-
2592
- - `fontSize`, `lineHeight`, `paddingX`, `paddingY`, `borderRadius`, `gap`
2593
- - `backgroundColor`, `textColor`, `borderColor`
2594
- - `softBackgroundColor`, `softTextColor`, `softBorderColor`
2595
- - `outlineTextColor`, `outlineBorderColor`
2596
- - `info.*`, `success.*`, `warn.*`, `danger.*` (backgroundColor/textColor/borderColor/soft*/outline*)
2597
- - `small.fontSize`, `small.paddingX`, `small.paddingY`
2598
- - `large.fontSize`, `large.paddingX`, `large.paddingY`
2599
-
2600
- ## Chip
2601
-
2602
- Props:
2603
-
2604
- - `label?: string`
2605
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
2606
- - `variant?: 'solid' | 'soft' | 'outline'` (default `soft`)
2607
- - `severity?: 'neutral' | 'info' | 'success' | 'warn' | 'danger'` (default `neutral`)
2608
- - `disabled?: boolean`
2609
- - `closable?: boolean` (default `false`)
2610
- - `icon?: string`
2611
- - `ariaLabel?: string`
2612
- - `closeLabel?: string` (default `Remove`)
2613
-
2614
- Slots:
2615
-
2616
- - `default` - chip content (fallbacks to `label`)
2617
- - `icon` (optional)
2618
- - `close` (optional)
2619
-
2620
- Events:
2621
-
2622
- - `close`
2623
-
2624
- Example:
2625
-
2626
- ```vue
2627
- <Chip label="New" />
2628
- <Chip severity="info" closable>Info</Chip>
2629
- ```
2630
-
2631
- ### Chip tokens
2632
-
2633
- Component tokens (override via `theme.overrides.components.chip`):
2634
-
2635
- - `fontSize`, `lineHeight`, `paddingX`, `paddingY`, `borderRadius`, `gap`
2636
- - `backgroundColor`, `textColor`, `borderColor`
2637
- - `softBackgroundColor`, `softTextColor`, `softBorderColor`
2638
- - `outlineTextColor`, `outlineBorderColor`
2639
- - `iconSize`, `closeSize`, `closeFontSize`, `closeRadius`, `closeColor`, `closeHoverBackgroundColor`, `disabledOpacity`
2640
- - `info.*`, `success.*`, `warn.*`, `danger.*` (backgroundColor/textColor/borderColor/soft*/outline*)
2641
- - `small.fontSize`, `small.paddingX`, `small.paddingY`
2642
- - `large.fontSize`, `large.paddingX`, `large.paddingY`
2643
-
2644
- ## FilterChips
2645
-
2646
- Props:
2647
-
2648
- - `modelValue?: string | number | Array<string | number> | null` (v-model)
2649
- - `options?: Array<{ label: string; value: string | number; disabled?: boolean; count?: number }>` (default `[]`)
2650
- - `multiple?: boolean` (default `true`)
2651
- - `allowEmpty?: boolean` (default `true`, used in single mode)
2652
- - `clearable?: boolean` (default `false`)
2653
- - `clearText?: string` (default `Clear`)
2654
- - `clearLabel?: string` (default `Clear filters`)
2655
- - `disabled?: boolean`
2656
- - `wrap?: boolean` (default `true`)
2657
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
2658
- - `variant?: 'soft' | 'outline' | 'solid'` (default `soft`)
2659
- - `ariaLabel?: string`
2660
- - `ariaLabelledby?: string`
2661
-
2662
- Events:
2663
-
2664
- - `update:modelValue`
2665
- - `change`
2666
- - `clear`
2667
-
2668
- Example:
2669
-
2670
- ```vue
2671
- <FilterChips
2672
- v-model="activeFilters"
2673
- :options="[
2674
- { label: 'Open', value: 'open', count: 12 },
2675
- { label: 'In progress', value: 'progress', count: 7 },
2676
- { label: 'Done', value: 'done', count: 18 },
2677
- ]"
2678
- clearable
2679
- />
2680
- <FilterChips v-model="activeStatus" :options="statusOptions" :multiple="false" variant="outline" />
2681
- ```
2682
-
2683
- ### FilterChips tokens
2684
-
2685
- Component tokens (override via `theme.overrides.components.filterChips`):
2686
-
2687
- - `fontSize`, `gap`
2688
- - `chipGap`, `chipPadding`, `chipBorderRadius`
2689
- - `chipBorderColor`, `chipBackgroundColor`, `chipTextColor`
2690
- - `chipHoverBackgroundColor`, `chipHoverBorderColor`
2691
- - `chipActiveBackgroundColor`, `chipActiveBorderColor`, `chipActiveTextColor`
2692
- - `chipSolidActiveBackgroundColor`, `chipSolidActiveBorderColor`, `chipSolidActiveTextColor`
2693
- - `countPadding`, `countFontSize`, `countBackgroundColor`, `countTextColor`
2694
- - `countActiveBackgroundColor`, `countActiveTextColor`
2695
- - `disabledOpacity`
2696
- - `small.fontSize`, `small.chipPadding`
2697
- - `large.fontSize`, `large.chipPadding`
2698
-
2699
- ## Avatar
2700
-
2701
- Props:
2702
-
2703
- - `src?: string`
2704
- - `alt?: string`
2705
- - `name?: string`
2706
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
2707
- - `shape?: 'circle' | 'rounded'` (default `circle`)
2708
- - `status?: 'online' | 'offline' | 'busy' | 'away'`
2709
-
2710
- Slots:
2711
-
2712
- - `default` - custom avatar content
2713
-
2714
- Example:
2715
-
2716
- ```vue
2717
- <Avatar name="Ada Lovelace" />
2718
- <Avatar src="/img/ada.png" alt="Ada Lovelace" size="large" />
2719
- <Avatar name="Ada Lovelace" status="online" />
2720
- ```
2721
-
2722
- ### Avatar tokens
2723
-
2724
- Component tokens (override via `theme.overrides.components.avatar`):
2725
-
2726
- - `size`, `fontSize`, `fontWeight`
2727
- - `backgroundColor`, `textColor`, `borderColor`, `borderWidth`, `borderRadius`
2728
- - `statusSize`, `statusBorderWidth`, `statusBorderColor`
2729
- - `statusOnlineColor`, `statusOfflineColor`, `statusBusyColor`, `statusAwayColor`
2730
- - `small.size`, `small.fontSize`, `small.statusSize`
2731
- - `large.size`, `large.fontSize`, `large.statusSize`
2732
-
2733
- ## Progress
2734
-
2735
- Props:
2736
-
2737
- - `value?: number` (0-100; omit for indeterminate)
2738
- - `variant?: 'linear' | 'circular'` (default `linear`)
2739
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
2740
- - `label?: string`
2741
- - `showValue?: boolean` (default `false`)
2742
- - `severity?: 'neutral' | 'info' | 'success' | 'warn' | 'danger'` (default `neutral`)
2743
- - `ariaLabel?: string`
2744
-
2745
- Example:
2746
-
2747
- ```vue
2748
- <Progress :value="64" />
2749
- <Progress variant="circular" :value="42" size="small" />
2750
- <Progress variant="linear" severity="success" showValue :value="85" />
2751
- <Progress variant="linear" />
2752
- ```
2753
-
2754
- ### Progress tokens
2755
-
2756
- Component tokens (override via `theme.overrides.components.progress`):
2757
-
2758
- - `width`, `height`, `borderRadius`
2759
- - `backgroundColor`, `barColor`
2760
- - `labelColor`, `labelFontSize`, `gap`
2761
- - `circularSize`, `circularThickness`
2762
- - `animationDuration`
2763
- - `info.barColor`, `success.barColor`, `warn.barColor`, `danger.barColor`
2764
- - `small.height`, `small.labelFontSize`, `small.circularSize`, `small.circularThickness`
2765
- - `large.height`, `large.labelFontSize`, `large.circularSize`, `large.circularThickness`
2766
-
2767
- ## Spinner
2768
-
2769
- Props:
2770
-
2771
- - `variant?: 'inline' | 'overlay'` (default `inline`)
2772
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
2773
- - `severity?: 'neutral' | 'info' | 'success' | 'warn' | 'danger'` (default `neutral`)
2774
- - `label?: string`
2775
- - `ariaLabel?: string` (default `Loading`)
2776
-
2777
- Slots:
2778
-
2779
- - `default` (optional) - custom label content
2780
-
2781
- Example:
2782
-
2783
- ```vue
2784
- <Spinner />
2785
- <Spinner label="Loading users..." size="small" />
2786
- <Spinner variant="overlay" severity="info" label="Sync in progress" />
2787
- ```
2788
-
2789
- ### Spinner tokens
2790
-
2791
- Component tokens (override via `theme.overrides.components.spinner`):
2792
-
2793
- - `size`, `thickness`, `color`, `trackColor`
2794
- - `gap`, `labelColor`, `labelFontSize`
2795
- - `animationDuration`
2796
- - `overlayMinHeight`, `overlayPadding`, `overlayBorderRadius`, `overlayBackgroundColor`
2797
- - `info.color`, `success.color`, `warn.color`, `danger.color`
2798
- - `small.size`, `small.thickness`, `small.labelFontSize`
2799
- - `large.size`, `large.thickness`, `large.labelFontSize`
2800
-
2801
- ## Slider
2802
-
2803
- Props:
2804
-
2805
- - `modelValue?: number | [number, number]` (v-model)
2806
- - `min?: number` (default `0`)
2807
- - `max?: number` (default `100`)
2808
- - `step?: number` (default `1`)
2809
- - `range?: boolean` (default `false`)
2810
- - `disabled?: boolean`
2811
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
2812
- - `variant?: 'filled' | 'outlined'` (default `filled`)
2813
- - `showValue?: boolean` (default `false`)
2814
- - `marks?: Array<{ value: number; label?: string }>`
2815
-
2816
- Events:
2817
-
2818
- - `update:modelValue`
2819
- - `input`
2820
- - `change`
2821
- - `focus`
2822
- - `blur`
2823
-
2824
- Example:
2825
-
2826
- ```vue
2827
- <Slider v-model="volume" :min="0" :max="100" :step="5" show-value />
2828
- <Slider v-model="priceRange" :min="0" :max="1000" :step="10" range />
2829
- ```
2830
-
2831
- ### Slider tokens
2832
-
2833
- Component tokens (override via `theme.overrides.components.slider`):
2834
-
2835
- - `width`, `gap`
2836
- - `textColor`
2837
- - `trackHeight`, `trackBackgroundColor`, `trackRadius`, `fillBackgroundColor`
2838
- - `thumbSize`, `thumbColor`, `thumbBorderColor`, `thumbBorderWidth`, `thumbShadow`
2839
- - `focusRingShadow`, `disabledOpacity`
2840
- - `markSize`, `markColor`, `markLabelFontSize`, `markLabelColor`, `marksHeight`
2841
- - `valueFontSize`, `valueColor`
2842
- - `small.trackHeight`, `small.thumbSize`, `small.valueFontSize`
2843
- - `large.trackHeight`, `large.thumbSize`, `large.valueFontSize`
2844
-
2845
- ## Splitter / SplitterPanel
2846
-
2847
- Props (`Splitter`):
2848
-
2849
- - `modelValue?: number[]` (v-model panel sizes in %)
2850
- - `minSizes?: number[]` (panel minimum sizes in %)
2851
- - `direction?: 'horizontal' | 'vertical'` (default `horizontal`)
2852
- - `gutterSize?: number | string` (default `8`)
2853
- - `disabled?: boolean` (default `false`)
2854
-
2855
- Props (`SplitterPanel`):
2856
-
2857
- - `size?: number` (initial panel size in % when `v-model` is not provided)
2858
- - `minSize?: number` (minimum panel size in %)
2859
-
2860
- Events (`Splitter`):
2861
-
2862
- - `update:modelValue`
2863
- - `change`
2864
-
2865
- Example:
2866
-
2867
- ```vue
2868
- <Splitter v-model="splitSizes" :min-sizes="[20, 20]" style="height: 280px">
2869
- <SplitterPanel>Navigation</SplitterPanel>
2870
- <SplitterPanel>Content</SplitterPanel>
2871
- </Splitter>
2872
- ```
2873
-
2874
- ### Splitter tokens
2875
-
2876
- Component tokens (override via `theme.overrides.components.splitter`):
2877
-
2878
- - `borderColor`, `borderRadius`
2879
- - `panelBackgroundColor`
2880
- - `handleWidth`, `handleHeight`, `handleRadius`, `handleColor`
2881
- - `gutterActiveBackgroundColor`
2882
- - `disabledOpacity`
2883
-
2884
- ## Stepper
2885
-
2886
- Props:
2887
-
2888
- - `modelValue?: string | number` (v-model)
2889
- - `steps?: Array<{ label?: string; description?: string; value?: string | number; disabled?: boolean; status?: 'completed' | 'active' | 'upcoming' | 'error' }>`
2890
- - `orientation?: 'horizontal' | 'vertical'` (default `horizontal`)
2891
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
2892
- - `clickable?: boolean` (default `false`)
2893
- - `ariaLabel?: string`
2894
- - `ariaLabelledby?: string`
2895
-
2896
- Events:
2897
-
2898
- - `update:modelValue`
2899
- - `change`
2900
-
2901
- Example:
2902
-
2903
- ```vue
2904
- <Stepper v-model="step" :steps="steps" clickable />
2905
- <Stepper v-model="step" :steps="steps" orientation="vertical" size="small" />
2906
- ```
2907
-
2908
- ### Stepper tokens
2909
-
2910
- Component tokens (override via `theme.overrides.components.stepper`):
2911
-
2912
- - `gap`, `itemGap`, `lineThickness`, `lineLength`, `lineColor`
2913
- - `indicatorSize`, `indicatorBorderRadius`, `indicatorBorderWidth`, `indicatorFontSize`
2914
- - `indicatorBackgroundColor`, `indicatorTextColor`, `indicatorBorderColor`
2915
- - `activeIndicatorBackgroundColor`, `activeIndicatorTextColor`, `activeIndicatorBorderColor`
2916
- - `completedIndicatorBackgroundColor`, `completedIndicatorTextColor`, `completedIndicatorBorderColor`
2917
- - `errorIndicatorBackgroundColor`, `errorIndicatorTextColor`, `errorIndicatorBorderColor`
2918
- - `labelFontSize`, `labelColor`, `descriptionFontSize`, `descriptionColor`
2919
- - `disabledOpacity`
2920
- - `small.indicatorSize`, `small.indicatorFontSize`, `small.labelFontSize`, `small.descriptionFontSize`, `small.lineLength`, `small.itemGap`
2921
- - `large.indicatorSize`, `large.indicatorFontSize`, `large.labelFontSize`, `large.descriptionFontSize`, `large.lineLength`, `large.itemGap`
2922
-
2923
- ## Wizard / WizardStep
2924
-
2925
- Props (`Wizard`):
2926
-
2927
- - `modelValue?: string | number` (v-model active step value)
2928
- - `steps?: Array<{ value: string | number; title?: string; description?: string; optional?: boolean; disabled?: boolean; validate?: (value, index) => boolean | string | Promise<...> }>`
2929
- - `linear?: boolean` (default `true`)
2930
- - `disabled?: boolean` (default `false`)
2931
- - `nextLabel?: string` (default `Next`)
2932
- - `prevLabel?: string` (default `Back`)
2933
- - `finishLabel?: string` (default `Finish`)
2934
- - `validateStep?: (step, index, value) => boolean | string | Promise<...>`
2935
- - `ariaLabel?: string`
2936
- - `ariaLabelledby?: string`
2937
-
2938
- Props (`WizardStep`):
2939
-
2940
- - `value: string | number` (must match one of `Wizard.steps[].value`)
2941
-
2942
- Slots (`Wizard`):
2943
-
2944
- - `default` - place `WizardStep` components
2945
- - `indicator` (optional) - slot props `{ step, index }`
2946
- - `actions` (optional) - slot props `{ step, index, isFirst, isLast, next, prev, complete }`
2947
-
2948
- Events (`Wizard`):
2949
-
2950
- - `update:modelValue`
2951
- - `change`
2952
- - `next`
2953
- - `prev`
2954
- - `complete`
2955
- - `invalidStep`
2956
-
2957
- Example:
2958
-
2959
- ```vue
2960
- <Wizard v-model="wizardStep" :steps="wizardSteps">
2961
- <WizardStep value="account">
2962
- <Input v-model="email" placeholder="Email" />
2963
- </WizardStep>
2964
- <WizardStep value="plan">
2965
- <Select v-model="plan" :options="plans" />
2966
- </WizardStep>
2967
- <WizardStep value="confirm">
2968
- Review and finish
2969
- </WizardStep>
2970
- </Wizard>
2971
- ```
2972
-
2973
- ### Wizard tokens
2974
-
2975
- Component tokens (override via `theme.overrides.components.wizard`):
2976
-
2977
- - `gap`, `borderColor`, `headerPaddingBottom`
2978
- - `itemGap`, `stepGap`
2979
- - `indicatorSize`, `indicatorBorderRadius`, `indicatorFontSize`
2980
- - `indicatorBorderColor`, `indicatorBackgroundColor`, `indicatorTextColor`
2981
- - `activeIndicatorBorderColor`, `activeIndicatorBackgroundColor`, `activeIndicatorTextColor`
2982
- - `completedIndicatorBorderColor`, `completedIndicatorBackgroundColor`, `completedIndicatorTextColor`
2983
- - `errorIndicatorBorderColor`, `errorIndicatorBackgroundColor`, `errorIndicatorTextColor`
2984
- - `titleFontSize`, `titleColor`, `descriptionFontSize`, `descriptionColor`
2985
- - `actionsGap`
2986
- - `buttonMinWidth`, `buttonPadding`, `buttonBorderRadius`
2987
- - `buttonBorderColor`, `buttonBackgroundColor`, `buttonTextColor`, `buttonHoverBackgroundColor`
2988
- - `secondaryButtonBorderColor`, `secondaryButtonBackgroundColor`, `secondaryButtonTextColor`, `secondaryButtonHoverBackgroundColor`
2989
- - `disabledOpacity`
2990
-
2991
- ## Timeline
2992
-
2993
- Props:
2994
-
2995
- - `items?: Array<{ id?: string | number; title?: string; description?: string; date?: string; icon?: string; status?: 'neutral' | 'info' | 'success' | 'warn' | 'danger' }>` (default `[]`)
2996
- - `orientation?: 'vertical' | 'horizontal'` (default `vertical`)
2997
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
2998
- - `ariaLabel?: string`
2999
- - `ariaLabelledby?: string`
3000
-
3001
- Slots:
3002
-
3003
- - `marker` (props: `item`, `index`)
3004
- - `item` (props: `item`, `index`)
3005
-
3006
- Example:
3007
-
3008
- ```vue
3009
- <Timeline
3010
- :items="[
3011
- { title: 'Created', description: 'Issue created', date: '2026-02-17', status: 'info' },
3012
- { title: 'In progress', description: 'Developer started work', date: '2026-02-18', status: 'warn' },
3013
- { title: 'Done', description: 'Issue closed', date: '2026-02-19', status: 'success' },
3014
- ]"
3015
- />
3016
- <Timeline :items="events" orientation="horizontal" size="small" />
3017
- ```
3018
-
3019
- ### Timeline tokens
3020
-
3021
- Component tokens (override via `theme.overrides.components.timeline`):
3022
-
3023
- - `gap`, `itemGap`
3024
- - `markerSize`, `markerBorderRadius`, `markerBorderWidth`, `markerBackgroundColor`, `markerBorderColor`, `markerTextColor`, `markerIconSize`, `dotSize`
3025
- - `lineThickness`, `lineLength`, `lineColor`
3026
- - `titleFontSize`, `titleColor`, `descriptionFontSize`, `descriptionColor`, `dateFontSize`, `dateColor`
3027
- - `info.markerBackgroundColor`, `info.markerBorderColor`, `info.markerTextColor`, `info.lineColor`
3028
- - `success.markerBackgroundColor`, `success.markerBorderColor`, `success.markerTextColor`, `success.lineColor`
3029
- - `warn.markerBackgroundColor`, `warn.markerBorderColor`, `warn.markerTextColor`, `warn.lineColor`
3030
- - `danger.markerBackgroundColor`, `danger.markerBorderColor`, `danger.markerTextColor`, `danger.lineColor`
3031
- - `small.itemGap`, `small.markerSize`, `small.markerIconSize`, `small.dotSize`, `small.lineLength`, `small.dateFontSize`, `small.titleFontSize`, `small.descriptionFontSize`
3032
- - `large.itemGap`, `large.markerSize`, `large.markerIconSize`, `large.dotSize`, `large.lineLength`, `large.dateFontSize`, `large.titleFontSize`, `large.descriptionFontSize`
3033
-
3034
- ## Rating
3035
-
3036
- Props:
3037
-
3038
- - `modelValue?: number` (v-model)
3039
- - `max?: number` (default `5`)
3040
- - `allowHalf?: boolean` (default `false`)
3041
- - `readonly?: boolean`
3042
- - `disabled?: boolean`
3043
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
3044
- - `ariaLabel?: string`
3045
-
3046
- Events:
3047
-
3048
- - `update:modelValue`
3049
- - `change`
3050
- - `focus`
3051
- - `blur`
3052
-
3053
- Example:
3054
-
3055
- ```vue
3056
- <Rating v-model="score" />
3057
- <Rating v-model="score" allow-half size="large" />
3058
- ```
3059
-
3060
- ### Rating tokens
3061
-
3062
- Component tokens (override via `theme.overrides.components.rating`):
3063
-
3064
- - `gap`, `size`, `color`, `activeColor`, `hoverColor`
3065
- - `focusRingShadow`, `focusRadius`, `disabledOpacity`
3066
- - `small.size`
3067
- - `large.size`
3068
-
3069
- ## Tree
3070
-
3071
- Props:
3072
-
3073
- - `items?: Array<{ key: string | number; label: string; disabled?: boolean; children?: Array<...> }>` (default `[]`)
3074
- - `modelValue?: string | number | Array<string | number>` (v-model)
3075
- - `expandedKeys?: Array<string | number>` (`v-model:expandedKeys`)
3076
- - `multiple?: boolean` (default `false`)
3077
- - `selectable?: boolean` (default `true`)
3078
- - `expandOnClick?: boolean` (default `true`)
3079
- - `disabled?: boolean`
3080
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
3081
- - `variant?: 'filled' | 'outlined'` (default `filled`)
3082
- - `ariaLabel?: string`
3083
- - `ariaLabelledby?: string`
3084
-
3085
- Events:
3086
-
3087
- - `update:modelValue`
3088
- - `update:expandedKeys`
3089
- - `change`
3090
- - `toggle`
3091
- - `nodeClick`
3092
-
3093
- Example:
3094
-
3095
- ```vue
3096
- <Tree v-model="selectedNode" v-model:expandedKeys="expandedKeys" :items="treeItems" />
3097
- <Tree v-model="selectedMany" :items="treeItems" multiple variant="outlined" />
3098
- ```
3099
-
3100
- ### Tree tokens
3101
-
3102
- Component tokens (override via `theme.overrides.components.tree`):
3103
-
3104
- - `gap`, `indent`, `rowGap`, `rowPadding`, `rowPaddingInline`
3105
- - `rowBorderRadius`, `rowBorderColor`, `rowFontSize`, `rowTextColor`
3106
- - `rowBackgroundColor`, `rowHoverBackgroundColor`, `rowSelectedBackgroundColor`, `rowSelectedTextColor`
3107
- - `toggleSize`, `toggleRadius`, `toggleBorderColor`, `toggleBackgroundColor`, `toggleTextColor`, `toggleHoverBackgroundColor`
3108
- - `focusRingShadow`, `disabledOpacity`
3109
- - `small.rowPadding`, `small.rowPaddingInline`, `small.rowFontSize`, `small.toggleSize`
3110
- - `large.rowPadding`, `large.rowPaddingInline`, `large.rowFontSize`, `large.toggleSize`
3111
-
3112
- ## TreeSelect
3113
-
3114
- Props:
3115
-
3116
- - `items?: Array<{ key: string | number; label: string; disabled?: boolean; children?: Array<...> }>` (default `[]`)
3117
- - `modelValue?: string | number | Array<string | number>` (v-model)
3118
- - `expandedKeys?: Array<string | number>` (`v-model:expandedKeys`)
3119
- - `multiple?: boolean` (default `false`)
3120
- - `selectable?: boolean` (default `true`)
3121
- - `expandOnClick?: boolean` (default `true`)
3122
- - `placeholder?: string`
3123
- - `searchPlaceholder?: string` (default `Search...`)
3124
- - `disabled?: boolean`
3125
- - `readonly?: boolean`
3126
- - `loading?: boolean` (default `false`)
3127
- - `loadingText?: string` (default `Loading...`)
3128
- - `emptyText?: string` (default `No results`)
3129
- - `filter?: boolean` (default `true`)
3130
- - `clearable?: boolean` (default `false`)
3131
- - `size?: 'small' | 'normal' | 'large'` (default `normal`)
3132
- - `variant?: 'filled' | 'outlined'` (default `filled`)
3133
-
3134
- Events:
3135
-
3136
- - `update:modelValue`
3137
- - `change`
3138
- - `update:expandedKeys`
3139
- - `toggle`
3140
- - `nodeClick`
3141
- - `search`
3142
- - `focus`
3143
- - `blur`
3144
-
3145
- Slots:
3146
-
3147
- - `label` - forwarded Tree node label slot props: `{ node, level, selected, expanded, disabled }`
3148
-
3149
- Example:
3150
-
3151
- ```vue
3152
- <TreeSelect
3153
- v-model="selectedNode"
3154
- v-model:expandedKeys="expandedKeys"
3155
- :items="treeItems"
3156
- placeholder="Select docs section"
3157
- clearable
3158
- />
3159
- <TreeSelect v-model="selectedMany" :items="treeItems" multiple variant="outlined" />
3160
- ```
3161
-
3162
- ### TreeSelect tokens
3163
-
3164
- Component tokens (override via `theme.overrides.components.treeselect`):
3165
-
3166
- - `minWidth`, `fontSize`, `controlGap`, `chevronSize`
3167
- - `padding`, `borderRadius`, `borderColor`
3168
- - `backgroundColor`, `textColor`, `placeholderColor`
3169
- - `focusBorderColor`, `focusRingShadow`, `hoverBorderColor`
3170
- - `disabledOpacity`
3171
- - `panelBackgroundColor`, `panelBorderColor`, `panelPadding`, `panelMaxHeight`, `panelRadiusOffset`, `panelShadow`
3172
- - `searchPadding`, `searchBorderColor`, `searchBorderRadius`
3173
- - `emptyPadding`, `emptyColor`
3174
- - `loadingPadding`, `loadingColor`
3175
- - `clearSize`, `clearRadius`, `clearHoverBackgroundColor`
3176
- - `small.fontSize`, `small.padding`
3177
- - `large.fontSize`, `large.padding`
3178
-
3179
- ## VirtualScroller
3180
-
3181
- Props:
3182
-
3183
- - `items?: Array<unknown>` (default `[]`)
3184
- - `itemHeight?: number` (default `36`)
3185
- - `height?: string` (default `18rem`)
3186
- - `overscan?: number` (default `4`)
3187
- - `keyField?: string` (default `id`)
3188
- - `virtual?: boolean` (default `true`)
3189
- - `ariaLabel?: string` (default `Virtual list`)
3190
- - `emptyText?: string` (default `No items`)
3191
-
3192
- Events:
3193
-
3194
- - `scroll`
3195
- - `rangeChange` (payload: `{ start: number; end: number }`)
3196
- - `reachEnd`
3197
-
3198
- Slots:
3199
-
3200
- - `default` - item content with slot props `{ item, index }`
3201
- - `empty` - empty state content
3202
-
3203
- Example:
3204
-
3205
- ```vue
3206
- <VirtualScroller :items="users" :item-height="44" height="320px" :overscan="6" key-field="id">
3207
- <template #default="{ item, index }">
3208
- <div>{{ index + 1 }}. {{ item.name }}</div>
3209
- </template>
3210
- </VirtualScroller>
49
+ <script setup lang="ts">
50
+ import { Container, PageHeader, Button } from '@codemonster-ru/vueforge';
51
+ </script>
3211
52
  ```
3212
53
 
3213
- ### VirtualScroller tokens
3214
-
3215
- Component tokens (override via `theme.overrides.components.virtualScroller`):
3216
-
3217
- - `fontSize`
3218
- - `borderColor`, `borderRadius`
3219
- - `backgroundColor`, `textColor`
3220
- - `focusRingShadow`
3221
- - `itemPadding`, `itemBorderColor`
3222
- - `emptyPadding`, `emptyColor`
3223
-
3224
- ## Tokens
3225
-
3226
- VueForge exposes design tokens as CSS variables generated from the theme preset. Core groups:
3227
-
3228
- - `colors.*` → `--vf-{color}` + shades (`--vf-{color}-100..900`)
3229
- - `radii.*` → corner radii
3230
- - `typography.*` → base font size & line height
3231
- - `states.*` → focus ring, disabled opacity
3232
- - `controls.*` → base control sizing (height, padding)
3233
- - `sizes.sm/lg` → shared small/large sizing for Button/Input/Select
3234
-
3235
- Typed tokens:
3236
-
3237
- - `ThemeTokens`/`ThemeOptions`/`ThemePreset` are exported for type-safe theming in TS.
3238
- - `components.*` accepts component-specific tokens (typed keys: button/buttonGroup/card/container/checkbox/radio/tabs/accordion/toast/alert/emptyState/input/inputGroup/inlineEdit/searchInput/mentionInput/passwordInput/otpInput/colorPicker/maskedInput/numberInput/form/formField/textarea/richTextEditor/link/breadcrumbs/divider/pageHeader/menu/modal/confirmDialog/drawer/popover/dropdown/contextMenu/commandPalette/notificationCenter/appShell/kanbanBoard/tour/select/autocomplete/combobox/multiselect/taginput/datepicker/calendar/daterangepicker/timepicker/datetimepicker/pagination/switch/segmentedControl/tooltip/skeleton/progress/spinner/badge/chip/filterChips/avatar/datatable/slider/splitter/stepper/wizard/rating/tree/treeselect/virtualScroller).
54
+ ## Components
3239
55
 
3240
- Default core values (from `DefaultTheme`):
56
+ VueForge currently includes core building blocks for:
3241
57
 
3242
- | Token | Value |
3243
- | ------------------------ | ---------------------------------------------- |
3244
- | `borderWidth` | `1px` |
3245
- | `controls.height` | `2rem` |
3246
- | `controls.paddingY` | `0.25rem` |
3247
- | `controls.paddingX` | `0.6rem` |
3248
- | `radii.sm` | `4px` |
3249
- | `radii.md` | `6px` |
3250
- | `radii.lg` | `10px` |
3251
- | `typography.fontSize` | `1rem` |
3252
- | `typography.lineHeight` | `1.4` |
3253
- | `states.disabledOpacity` | `0.6` |
3254
- | `states.focusRingShadow` | `0 0 0 3px rgba(var(--vf-blue-600-rgb), 0.12)` |
3255
- | `sizes.sm.fontSize` | `0.875rem` |
3256
- | `sizes.sm.paddingY` | `0.2rem` |
3257
- | `sizes.sm.paddingX` | `0.5rem` |
3258
- | `sizes.lg.fontSize` | `1.125rem` |
3259
- | `sizes.lg.paddingY` | `0.5rem` |
3260
- | `sizes.lg.paddingX` | `1rem` |
58
+ - Layout and navigation: `Container`, `Section`, `Grid`, `AppShell`, `Menu`, `Link`, `Breadcrumbs`, `PageHeader`, `Divider`
59
+ - Forms and inputs: `Form`, `FormField`, `Input`, `Textarea`, `Select`, `Autocomplete`, `Combobox`, `MultiSelect`, `TagInput`, `Date*`, `Time*`
60
+ - Data display: `DataTable`, `Pagination`, `VirtualScroller`, `Card`, `EmptyState`
61
+ - Overlays and feedback: `Modal`, `Drawer`, `Popover`, `Dropdown`, `ContextMenu`, `Tooltip`, `Toast`, `Alert`, `NotificationCenter`
62
+ - Advanced interaction: `CommandPalette`, `Tour`, `KanbanBoard`, `Tree`, `TreeSelect`, `Wizard`, `Stepper`, `Tabs`, `Accordion`
3261
63
 
3262
- Example override:
64
+ Full catalog: [`docs/components/README.md`](docs/components/README.md)
3263
65
 
3264
- ```ts
3265
- setTheme({
3266
- preset: DefaultTheme,
3267
- overrides: {
3268
- typography: {
3269
- fontSize: '0.9375rem',
3270
- lineHeight: '1.4',
3271
- },
3272
- controls: {
3273
- height: '2rem',
3274
- paddingY: '0.25rem',
3275
- paddingX: '0.6rem',
3276
- },
3277
- sizes: {
3278
- sm: { fontSize: '0.8125rem', paddingY: '0.2rem', paddingX: '0.45rem' },
3279
- lg: { fontSize: '1.125rem', paddingY: '0.5rem', paddingX: '1rem' },
3280
- },
3281
- },
3282
- });
3283
- ```
66
+ ## Documentation
3284
67
 
3285
- ## Examples
68
+ - Theming: [`docs/theming.md`](docs/theming.md)
69
+ - Components catalog: [`docs/components/README.md`](docs/components/README.md)
70
+ - Roadmap / execution checklist: [`CHECKLIST.md`](CHECKLIST.md)
71
+ - Release notes: [`CHANGELOG.md`](CHANGELOG.md)
3286
72
 
3287
- The example app lives in `src/example` and showcases all components.
73
+ ## Development
3288
74
 
3289
75
  ```bash
3290
76
  npm run dev
3291
- ```
3292
-
3293
- ## Theming
3294
-
3295
- VueForge maps the theme preset to CSS variables. You can override parts of the preset and it will recompute shades for color tokens.
3296
-
3297
- ```ts
3298
- app.use(VueForge, {
3299
- theme: {
3300
- preset: DefaultTheme,
3301
- strict: false,
3302
- overrides: {
3303
- colors: {
3304
- green: '#18a66a',
3305
- },
3306
- },
3307
- selector: ':root',
3308
- darkSelector: ':root[data-theme=dark]',
3309
- },
3310
- });
3311
- ```
3312
-
3313
- You can also update the theme at runtime:
3314
-
3315
- ```ts
3316
- import { setTheme, updateTheme } from '@codemonster-ru/vueforge';
3317
-
3318
- setTheme({ preset: DefaultTheme });
3319
- updateTheme({
3320
- overrides: {
3321
- colors: { blue: '#2b6cb0' },
3322
- },
3323
- });
3324
- ```
3325
-
3326
- Notes:
3327
-
3328
- - Non-hex colors (e.g. `rgb(...)`, `hsl(...)`, `var(--brand)`) are allowed, but shade variables (`--vf-*-100..900`) will not be generated.
3329
- - Set `theme.strict: true` to throw on invalid token values (non-string / non-plain object) during theme application.
3330
-
3331
- ## Theme API
3332
-
3333
- Core methods:
3334
-
3335
- - `setTheme(options)` — apply a theme preset (with optional overrides).
3336
- - `updateTheme(partial)` — update only parts of the current theme.
3337
- - `getTheme()` — get the last applied theme options.
3338
-
3339
- Key options:
3340
-
3341
- - `preset`: base theme object (e.g. `DefaultTheme`)
3342
- - `overrides`: partial overrides merged into preset
3343
- - `selector`: CSS selector for base variables (default `:root`)
3344
- - `darkSelector`: selector for dark scheme (default `:root[data-theme=dark]`)
3345
- - `strict`: throw on invalid token values (otherwise warnings)
3346
-
3347
- Example:
3348
-
3349
- ```ts
3350
- setTheme({
3351
- preset: DefaultTheme,
3352
- overrides: {
3353
- colors: { blue: '#2b6cb0' },
3354
- typography: { fontSize: '0.95rem' },
3355
- },
3356
- strict: true,
3357
- });
77
+ npm run test
78
+ npm run typecheck
79
+ npm run build
3358
80
  ```
3359
81
 
3360
82
  ## License
3361
83
 
3362
- [MIT](https://github.com/codemonster-ru/vueforge/blob/main/LICENSE)
84
+ [MIT](LICENSE)
3363
85
 
3364
86
  ## Author
3365
87