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