@codemonster-ru/vueforge
v0.72.0
Published
Open source UI components for Vue.js.
Maintainers
Readme
VueForge
Open source component-level UI library for Vue.js.
Install
npm i @codemonster-ru/vueforgePeer dependencies:
vue(v3)vue-router(v4)@codemonster-ru/vueiconify
Usage
import { createApp } from 'vue';
import {
VueForge,
DefaultTheme,
Button,
ButtonGroup,
Input,
InputGroup,
InputAddon,
InlineEdit,
SearchInput,
MentionInput,
PasswordInput,
OtpInput,
ColorPicker,
MaskedInput,
NumberInput,
Form,
FormField,
Textarea,
RichTextEditor,
FileUpload,
Breadcrumbs,
Divider,
PageHeader,
Select,
Autocomplete,
Combobox,
MultiSelect,
TagInput,
DatePicker,
Calendar,
DateRangePicker,
TimePicker,
DateTimePicker,
Pagination,
DataTable,
Checkbox,
Switch,
SegmentedControl,
Alert,
EmptyState,
Skeleton,
Progress,
Spinner,
Badge,
Chip,
FilterChips,
Accordion,
AccordionItem,
Slider,
Splitter,
SplitterPanel,
Stepper,
Wizard,
WizardStep,
Timeline,
Rating,
Tree,
TreeSelect,
VirtualScroller,
Drawer,
ConfirmDialog,
Dropdown,
SplitButton,
ContextMenu,
CommandPalette,
NotificationCenter,
AppShell,
KanbanBoard,
Tour,
} from '@codemonster-ru/vueforge';
import '@codemonster-ru/vueforge/dist/index.css';
const app = createApp(App);
app.use(VueForge, {
theme: {
preset: DefaultTheme,
},
});<Button label="Hello" severity="primary" />
<ButtonGroup attached variant="outlined" size="small">
<Button label="Day" />
<Button label="Week" />
<Button label="Month" />
</ButtonGroup>
<Form v-model="formValues" :validate="validateForm" @submit="onSubmit">
<template #default="{ values, errors, touched, setFieldValue, setFieldTouched }">
<FormField label="Email" :error="touched.email ? errors.email : ''">
<template #default>
<Input
:model-value="String(values.email ?? '')"
@update:model-value="value => setFieldValue('email', value)"
@blur="() => setFieldTouched('email', true)"
/>
</template>
</FormField>
<Button type="submit" label="Submit" />
</template>
</Form>
<FormField label="Name" hint="Required field">
<Input v-model="name" placeholder="Your name" />
</FormField>
<InputGroup>
<InputAddon>$</InputAddon>
<NumberInput v-model="price" :min="0" :step="0.5" />
<InputAddon>.00</InputAddon>
</InputGroup>
<InlineEdit v-model="name" placeholder="No name" />
<SearchInput v-model="query" placeholder="Search components" clearable />
<MentionInput v-model="message" :suggestions="mentionSuggestions" placeholder="Type @name" />
<PasswordInput v-model="password" placeholder="Enter password" show-strength />
<OtpInput v-model="otp" :length="6" />
<ColorPicker v-model="brandColor" :presets="['#2b6cb0', '#0cbc87', '#d6293e']" />
<MaskedInput v-model="phone" mask="+7 (###) ###-##-##" />
<NumberInput v-model="age" :min="0" :max="120" :step="1" />
<Textarea v-model="bio" placeholder="Tell us about yourself" />
<RichTextEditor v-model="article" />
<FileUpload v-model="resume" accept=".pdf,.doc,.docx" />
<Breadcrumbs :items="breadcrumbItems" />
<Divider label="OR" />
<PageHeader title="Projects" subtitle="Manage active projects and team workload.">
<template #actions>
<Button label="Import" variant="outlined" severity="secondary" />
<Button label="New project" icon="plus" />
</template>
</PageHeader>
<Select v-model="role" :options="roles" placeholder="Choose role" />
<Autocomplete v-model="country" :options="countries" placeholder="Find country" />
<Combobox v-model="countryId" :options="countries" placeholder="Pick country" clearable />
<MultiSelect v-model="countries" :options="countryOptions" placeholder="Select countries" clearable />
<TagInput v-model="skills" :options="skillOptions" placeholder="Add skills" clearable />
<DatePicker v-model="birthday" placeholder="Pick birthday" />
<Calendar v-model="selectedDate" />
<DateRangePicker v-model="range" placeholder="Pick range" />
<TimePicker v-model="meetingTime" placeholder="Pick time" />
<DateTimePicker v-model="meetingAt" placeholder="Pick date and time" />
<Pagination v-model="page" :total-items="240" :page-size="20" />
<DataTable :columns="columns" :rows="rows" sortable striped />
<Checkbox v-model="agreed" label="I agree" />
<Switch v-model="darkMode" label="Dark mode" />
<SegmentedControl
v-model="view"
:options="[
{ label: 'List', value: 'list' },
{ label: 'Grid', value: 'grid' },
]"
/>
<Alert severity="info" title="Heads up" message="Project settings were updated." />
<EmptyState title="No projects yet" description="Create your first project to get started." icon="📂" />
<Skeleton height="12px" width="140px" />
<Progress :value="64" />
<Spinner label="Loading..." />
<Badge label="Beta" />
<Chip label="New" />
<FilterChips
v-model="filters"
:options="[
{ label: 'Open', value: 'open' },
{ label: 'Done', value: 'done' },
]"
clearable
/>
<Slider v-model="volume" :min="0" :max="100" :step="5" show-value />
<Splitter v-model="splitSizes" style="height: 280px">
<SplitterPanel :min-size="20">Left panel</SplitterPanel>
<SplitterPanel :min-size="20">Right panel</SplitterPanel>
</Splitter>
<Stepper v-model="step" :steps="steps" clickable />
<Wizard v-model="wizardStep" :steps="wizardSteps">
<WizardStep value="account">Account step</WizardStep>
<WizardStep value="confirm">Confirm step</WizardStep>
</Wizard>
<Timeline :items="timelineItems" />
<Rating v-model="rating" allow-half />
<Tree v-model="selectedNode" v-model:expandedKeys="expandedKeys" :items="treeItems" />
<TreeSelect v-model="selectedNode" v-model:expandedKeys="expandedKeys" :items="treeItems" placeholder="Select node" />
<VirtualScroller :items="largeItems" :item-height="40" height="320px">
<template #default="{ item, index }">
{{ index + 1 }}. {{ item.label }}
</template>
</VirtualScroller>
<Accordion v-model="faq">
<AccordionItem value="shipping" title="Shipping">
Shipping details
</AccordionItem>
<AccordionItem value="returns" title="Returns">
Returns policy
</AccordionItem>
</Accordion>
<Drawer v-model="drawerOpen" title="Filters" position="right">
<template #body>
Drawer content
</template>
</Drawer>
<ConfirmDialog
v-model="confirmOpen"
title="Delete item?"
message="This action cannot be undone."
confirm-label="Delete"
@confirm="removeItem"
/>
<Dropdown :items="menuItems">
<template #trigger>
<Button label="Actions" />
</template>
</Dropdown>
<SplitButton
label="Save"
:items="[
{ label: 'Save draft', command: saveDraft },
{ label: 'Save and publish', command: publish },
]"
@click="save"
/>
<ContextMenu :items="menuItems">
<div>Right-click here</div>
</ContextMenu>
<CommandPalette
v-model="commandPaletteOpen"
:items="[
{ label: 'Open docs', value: 'docs', group: 'Navigation' },
{ label: 'Save as draft', value: 'draft', group: 'Actions' },
]"
/>
<NotificationCenter v-model="notificationsOpen" v-model:items="notificationsItems" />
<AppShell v-model="sidebarCollapsed">
<template #sidebar>Sidebar content</template>
<template #header>Header content</template>
<div>Main content</div>
</AppShell>
<KanbanBoard v-model:items="kanbanItems" :columns="kanbanColumns" />
<Tour v-model="tourOpen" :steps="tourSteps" />Components
- Button
- ButtonGroup
- Card
- Checkbox
- RadioGroup
- RadioButton
- SegmentedControl
- Tabs
- Tab
- TabPanel
- Accordion
- AccordionItem
- Toast
- ToastContainer
- Alert
- EmptyState
- Input
- InputGroup
- InputAddon
- InlineEdit
- SearchInput
- MentionInput
- PasswordInput
- OtpInput
- ColorPicker
- MaskedInput
- NumberInput
- Form
- FormField
- Textarea
- RichTextEditor
- FileUpload
- Link
- Breadcrumbs
- Divider
- PageHeader
- Menu
- Modal
- ConfirmDialog
- Drawer
- Dropdown
- SplitButton
- ContextMenu
- CommandPalette
- NotificationCenter
- AppShell
- KanbanBoard
- Tour
- Popover
- Select
- Autocomplete
- Combobox
- MultiSelect
- TagInput
- DatePicker
- Calendar
- DateRangePicker
- TimePicker
- DateTimePicker
- Pagination
- DataTable
- Switch
- Tooltip
- Skeleton
- Progress
- Spinner
- Badge
- Chip
- FilterChips
- Avatar
- Slider
- Splitter
- SplitterPanel
- Stepper
- Wizard
- WizardStep
- Timeline
- Rating
- Tree
- TreeSelect
- VirtualScroller
Input / InputGroup / Search / Password / Textarea (quick API):
Input: single-line control, supportsv-model,size,variant,disabled,readonly.ButtonGroup: grouped button actions with shared size/variant/severity and attached/stacked layouts.InputGroup: horizontal control combiner for field/addon/button layouts with unified corners and borders.EmptyState: reusable empty-data block with icon/title/description/actions for table/list/search blank states.InlineEdit: inline value editing with view/edit states, save/cancel actions, and text/number modes.SearchInput: search-focused control withdebounce,clearable,loading,size, andvariant.MentionInput: text input with@/#triggers, suggestions panel, keyboard selection, and mention insertion events.PasswordInput: password control, supports visibility toggle, strength meter, CapsLock hint,size, andvariant.OtpInput: one-time code control, supports fixed length, paste handling, numeric/alphanumeric modes,size, andvariant.ColorPicker: color control with presets, optional alpha channel, and output formats (hex/rgb/hsl).MaskedInput: formatted input control with string/function masks and optional raw output (unmask).NumberInput: numeric control, supportsv-model,min,max,step,precision,controls,size,variant.Splitter: resizable multi-panel container with draggable separators andv-modelpercentage sizes.Tour: guided step-by-step onboarding overlay anchored to target elements.NotificationCenter: persistent notifications inbox with read/unread state and bulk actions.AppShell: application layout shell with sidebar/header/main/footer regions, collapse toggle, and mobile drawer behavior.KanbanBoard: task board with draggable cards, customizable column/card slots, and move events.RichTextEditor: formatting editor with toolbar actions and Markdown/HTML output.Divider: horizontal/vertical visual separator with optional label and style variants.Spinner: lightweight loading indicator with inline/overlay variants and severity colors.PageHeader: page-level heading block with breadcrumbs/meta/actions slots for dashboard screens.Wizard: multi-step flow container with linear navigation, per-step validation, and completion events.Textarea: multi-line control, same as Input plusrows.TagInput: token/tag control, supportsv-model(array), suggestions, custom tags,maxTags,clearable,size,variant.FilterChips: compact chip-based filter toggles with single/multiple selection modes and optional clear action.SearchInput,MentionInput,InlineEdit,OtpInput,ColorPicker,MaskedInput,RichTextEditor,Checkbox,Select,Autocomplete,MultiSelect,TagInput,DatePicker,Calendar,DateRangePicker,DateTimePicker,Pagination,DataTable,SegmentedControl, andTreeSelectalso supportvariant: 'filled' | 'outlined'.
Form
Props:
modelValue?: Record<string, unknown>(v-model)initialValues?: Record<string, unknown>validate?: (values) => Record<string, string> | string | boolean | null | Promise<...>validateOn?: 'submit' | 'input' | 'change' | 'blur' | Array<'submit' | 'input' | 'change' | 'blur'>(defaultsubmit)disabled?: booleannovalidate?: boolean(defaulttrue)id?: stringariaLabel?: stringariaLabelledby?: string
Events:
update:modelValuechangeblurvalidatesubmitinvalidSubmitreset
Slots:
default- form helpers:{ values, errors, touched, isValid, isDirty, isSubmitting, setFieldValue, setFieldTouched, setFieldError, validate, submit, reset }
Example:
<Form v-model="values" :validate="validateForm" validate-on="blur" @submit="send">
<template #default="{ values, errors, touched, setFieldValue, setFieldTouched }">
<FormField label="Email" :error="touched.email ? errors.email : ''">
<template #default>
<Input
:model-value="String(values.email ?? '')"
@update:model-value="value => setFieldValue('email', value)"
@blur="() => setFieldTouched('email', true)"
/>
</template>
</FormField>
<Button type="submit" label="Send" />
</template>
</Form>Form tokens
Component tokens (override via theme.overrides.components.form):
gap,textColor,disabledOpacity
FormField
Props:
id?: string(used inlabel forand slot props)label?: stringhint?: stringerror?: stringrequired?: booleandisabled?: booleansize?: 'small' | 'normal' | 'large'(defaultnormal)
Slots:
default- form control wrapper slot props:{ id, describedBy, invalid, required }label(optional)hint(optional)error(optional)
Example:
<FormField label="Email" hint="We never share it" :error="emailError">
<template #default="{ id, describedBy }">
<Input :id="id" v-model="email" :aria-describedby="describedBy" placeholder="[email protected]" />
</template>
</FormField>When error is set, FormField applies invalid-state border highlighting to nested form controls.
Customize these colors via theme.overrides.components.formField.errorBorderColor and errorFocusBorderColor.
InputGroup / InputAddon
Props (InputGroup):
size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)disabled?: boolean(defaultfalse)
Props (InputAddon):
as?: string(defaultspan)
Slots:
default- group controls/addons content
Example:
<InputGroup>
<InputAddon>$</InputAddon>
<NumberInput v-model="price" :min="0" :step="0.5" />
<Button label="Apply" />
</InputGroup>InputGroup tokens
Component tokens (override via theme.overrides.components.inputGroup):
gap,borderRadiusaddonPadding,addonFontSizeaddonBackgroundColor,addonOutlinedBackgroundColoraddonTextColor,addonBorderColor,disabledOpacitysmall.addonPadding,small.addonFontSizelarge.addonPadding,large.addonFontSize
InlineEdit
Props:
modelValue?: string | number | null(v-model)type?: 'text' | 'number'(defaulttext)placeholder?: stringdisabled?: booleanreadonly?: booleansize?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)editLabel?: string(defaultEdit)saveLabel?: string(defaultSave)cancelLabel?: string(defaultCancel)
Events:
update:modelValuesavecancelstartendfocusblur
Example:
<InlineEdit v-model="projectName" placeholder="No project name" />
<InlineEdit v-model="budget" type="number" variant="outlined" />InlineEdit tokens
Component tokens (override via theme.overrides.components.inlineEdit):
gap,fontSize,paddingborderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColor,disabledOpacityactionsGapbuttonPadding,buttonRadius,buttonBorderColorbuttonBackgroundColor,buttonTextColor,buttonHoverBackgroundColorcancelButtonBackgroundColor,cancelButtonTextColor,cancelButtonBorderColorsmall.fontSize,small.padding,small.buttonPaddinglarge.fontSize,large.padding,large.buttonPadding
MentionInput
Props:
modelValue?: string(v-model)suggestions?: Array<{ label: string; value?: string | number; trigger?: string; disabled?: boolean }>(default[])triggers?: Array<string>(default['@', '#'])placeholder?: stringdisabled?: booleanreadonly?: booleanloading?: boolean(defaultfalse)loadingText?: string(defaultLoading...)emptyText?: string(defaultNo matches)minQueryLength?: number(default1)maxSuggestions?: number(default8)appendSpace?: boolean(defaulttrue)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)ariaLabel?: string
Events:
update:modelValueinputchangesearch(payload:{ trigger: string; query: string })selectinsert(payload:{ trigger, query, option, text, range })focusblur
Example:
<MentionInput
v-model="message"
:suggestions="[
{ label: 'alice', value: 'alice', trigger: '@' },
{ label: 'frontend', value: 'frontend', trigger: '#' },
]"
placeholder="Type @name or #topic"
/>MentionInput tokens
Component tokens (override via theme.overrides.components.mentionInput):
minWidth,fontSize,paddingborderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColor,disabledOpacitypanelBackgroundColor,panelBorderColor,panelPadding,panelMaxHeight,panelRadiusOffset,panelShadowoptionPadding,optionGap,optionBorderRadius,optionFontSizeoptionHoverBackgroundColor,optionTriggerColoremptyPadding,emptyColorsmall.fontSize,small.paddinglarge.fontSize,large.padding
Note: default filled backgrounds for Input/Select/Textarea use controls.backgroundColor (defaults to bgSoftColor). Set it to bgColor to disable soft backgrounds.
Autocomplete
Props:
modelValue?: string | number(v-model)options?: Array<{ label: string; value: string | number; disabled?: boolean }>optionLabel?: string(defaultlabel)optionValue?: string(defaultvalue)placeholder?: stringdisabled?: booleanreadonly?: booleanloading?: booleanloadingText?: string(defaultLoading...)emptyText?: string(defaultNo results)filter?: boolean(defaulttrue)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValuechangesearchfocusblur
Example:
<Autocomplete v-model="country" :options="countries" placeholder="Find country" />Combobox
Props:
modelValue?: string | number(v-model selected value)inputValue?: string(v-model:inputValue typed query)options?: Array<{ label: string; value: string | number; disabled?: boolean }>optionLabel?: string(defaultlabel)optionValue?: string(defaultvalue)placeholder?: stringdisabled?: booleanreadonly?: booleanloading?: booleanloadingText?: string(defaultLoading...)emptyText?: string(defaultNo results)filter?: boolean(defaulttrue)strict?: boolean(defaulttrue)allowCreate?: boolean(defaultfalse)clearable?: boolean(defaultfalse)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValueupdate:inputValuechangesearchcreatefocusblur
Example:
<Combobox v-model="countryId" v-model:inputValue="countryQuery" :options="countries" placeholder="Pick country" />Combobox tokens
Component tokens (override via theme.overrides.components.combobox):
minWidth,fontSize,controlGap,chevronSizepadding,borderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacitypanelBackgroundColor,panelBorderColor,panelPadding,panelMaxHeight,panelRadiusOffset,panelShadowoptionPadding,optionBorderRadiusoptionHoverBackgroundColor,optionActiveBackgroundColor,optionActiveTextColor,optionHighlightedBackgroundColoremptyPadding,emptyColorloadingPadding,loadingColorclearSize,clearRadius,clearHoverBackgroundColorsmall.fontSize,small.paddinglarge.fontSize,large.padding
MultiSelect
Props:
modelValue?: Array<string | number>(v-model)options?: Array<{ label: string; value: string | number; disabled?: boolean }>optionLabel?: string(defaultlabel)optionValue?: string(defaultvalue)placeholder?: stringsearchPlaceholder?: string(defaultSearch...)disabled?: booleanreadonly?: booleanloading?: booleanloadingText?: string(defaultLoading...)emptyText?: string(defaultNo results)filter?: boolean(defaulttrue)clearable?: boolean(defaultfalse)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValuechangesearchfocusblur
Example:
<MultiSelect v-model="countries" :options="countryOptions" placeholder="Select countries" clearable />TagInput
Props:
modelValue?: Array<string | number>(v-model)options?: Array<{ label: string; value: string | number; disabled?: boolean }>optionLabel?: string(defaultlabel)optionValue?: string(defaultvalue)placeholder?: stringdisabled?: booleanreadonly?: booleanloading?: booleanloadingText?: string(defaultLoading...)emptyText?: string(defaultNo results)filter?: boolean(defaulttrue)allowCustom?: boolean(defaulttrue)maxTags?: numberclearable?: boolean(defaultfalse)validateTag?: (value: string) => booleansize?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValuechangesearchadd(payload:{ value: string | number; source: 'option' | 'custom' })removereject(payload:{ reason: 'duplicate' | 'maxTags' | 'invalid' | 'readonly'; value: string })focusblur
Example:
<TagInput v-model="skills" :options="skillOptions" placeholder="Add skills" clearable />TagInput tokens
Component tokens (override via theme.overrides.components.taginput):
minWidth,minHeight,fontSize,controlGap,chevronSizepadding,borderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacitypanelBackgroundColor,panelBorderColor,panelPadding,panelMaxHeight,panelRadiusOffset,panelShadowoptionPadding,optionBorderRadiusoptionHoverBackgroundColor,optionHighlightedBackgroundColoremptyPadding,emptyColorloadingPadding,loadingColorinputMinWidthchipGap,chipPadding,chipRadius,chipBackgroundColor,chipTextColor,chipFontSizechipRemoveSize,chipRemoveRadius,chipRemoveHoverBackgroundColorclearSize,clearRadius,clearHoverBackgroundColorsmall.fontSize,small.padding,small.chipPadding,small.chipFontSizelarge.fontSize,large.padding,large.chipPadding,large.chipFontSize
MultiSelect tokens
Component tokens (override via theme.overrides.components.multiselect):
minWidth,fontSize,controlGap,chevronSizepadding,borderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacitypanelBackgroundColor,panelBorderColor,panelPadding,panelMaxHeight,panelRadiusOffset,panelShadowsearchPadding,searchBorderColor,searchBorderRadiusoptionPadding,optionBorderRadiusoptionHoverBackgroundColor,optionActiveBackgroundColor,optionActiveTextColor,optionHighlightedBackgroundColoremptyPadding,emptyColorloadingPadding,loadingColorclearSize,clearRadius,clearHoverBackgroundColorsmall.fontSize,small.paddinglarge.fontSize,large.padding
DatePicker
Props:
modelValue?: string(v-model, ISO dateYYYY-MM-DD)placeholder?: stringdisabled?: booleanreadonly?: booleanmin?: string(ISO dateYYYY-MM-DD)max?: string(ISO dateYYYY-MM-DD)locale?: string(defaulten-US)firstDayOfWeek?: number(default0, Sunday)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValuechangefocusblur
Example:
<DatePicker v-model="startDate" placeholder="Pick date" min="2026-01-01" max="2026-12-31" />Calendar
Props:
modelValue?: string(v-model, ISO dateYYYY-MM-DD)disabled?: booleanreadonly?: booleanmin?: string(ISO dateYYYY-MM-DD)max?: string(ISO dateYYYY-MM-DD)locale?: string(defaulten-US)firstDayOfWeek?: number(default0, Sunday)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValuechange
Example:
<Calendar v-model="selectedDate" min="2026-01-01" max="2026-12-31" />
<Calendar v-model="selectedDateAlt" variant="outlined" :first-day-of-week="1" />Calendar tokens
Component tokens (override via theme.overrides.components.calendar):
width,fontSize,paddingborderRadius,borderColorbackgroundColor,textColordisabledOpacityheaderGap,headerPadding,monthLabelFontSize,monthLabelFontWeightnavButtonSize,navButtonRadius,navButtonFontSizeweekdayColor,weekdayFontSize,weekdaysMarginBottomdaysGap,daySize,dayFontSize,dayBorderRadiusdayHoverBackgroundColor,daySelectedBackgroundColor,daySelectedTextColor,dayMutedColor,dayTodayBorderColorsmall.fontSize,small.padding,small.daySizelarge.fontSize,large.padding,large.daySize
DateRangePicker
Props:
modelValue?: [string | null, string | null] | null(v-model, ISO dateYYYY-MM-DD)placeholder?: stringstartPlaceholder?: string(defaultStart)endPlaceholder?: string(defaultEnd)separator?: string(default-)disabled?: booleanreadonly?: booleanmin?: string(ISO dateYYYY-MM-DD)max?: string(ISO dateYYYY-MM-DD)locale?: string(defaulten-US)firstDayOfWeek?: number(default0, Sunday)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValuechangefocusblur
Example:
<DateRangePicker v-model="dateRange" placeholder="Pick date range" min="2026-01-01" max="2026-12-31" />TimePicker
Props:
modelValue?: string(v-model, timeHH:mm)placeholder?: stringdisabled?: booleanreadonly?: booleanmin?: string(timeHH:mm)max?: string(timeHH:mm)step?: number(minutes, default30)format?: '24h' | '12h'(default24h)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValuechangefocusblur
Example:
<TimePicker v-model="meetingTime" placeholder="Pick time" min="09:00" max="18:00" :step="15" />TimePicker tokens
Component tokens (override via theme.overrides.components.timepicker):
minWidth,fontSize,controlGap,chevronSizepadding,borderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacitypanelBackgroundColor,panelBorderColor,panelPadding,panelMaxHeight,panelRadiusOffset,panelShadowoptionPadding,optionBorderRadiusoptionHoverBackgroundColor,optionActiveBackgroundColor,optionActiveTextColorsmall.fontSize,small.paddinglarge.fontSize,large.padding
DateTimePicker
Props:
modelValue?: string(v-model, ISO datetimeYYYY-MM-DDTHH:mm)placeholder?: stringdisabled?: booleanreadonly?: booleanmin?: string(ISO datetimeYYYY-MM-DDTHH:mm)max?: string(ISO datetimeYYYY-MM-DDTHH:mm)locale?: string(defaulten-US)firstDayOfWeek?: number(default0, Sunday)minuteStep?: number(default30)format?: '24h' | '12h'(default24h)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValuechangefocusblur
Example:
<DateTimePicker v-model="meetingAt" placeholder="Pick date and time" />
<DateTimePicker
v-model="meetingAtAlt"
variant="outlined"
min="2026-01-10T09:00"
max="2026-12-31T18:00"
:minute-step="15"
format="12h"
/>DateTimePicker tokens
Component tokens (override via theme.overrides.components.datetimepicker):
minWidth,fontSize,controlGap,chevronSizepadding,borderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacitypanelWidth,panelBackgroundColor,panelBorderColor,panelPadding,panelRadiusOffset,panelShadow,panelGapheaderGap,headerPadding,monthLabelFontSize,monthLabelFontWeightnavButtonSize,navButtonRadius,navButtonFontSizeweekdayColor,weekdayFontSize,weekdaysMarginBottomdaysGap,daySize,dayFontSize,dayBorderRadiusdayHoverBackgroundColor,daySelectedBackgroundColor,daySelectedTextColor,dayMutedColor,dayTodayBorderColortimesWidth,timesMaxHeight,timesPaddingLeft,timesBorderColortimeOptionPadding,timeOptionBorderRadius,timeOptionFontSizetimeOptionHoverBackgroundColor,timeOptionActiveBackgroundColor,timeOptionActiveTextColorsmall.fontSize,small.padding,small.daySizelarge.fontSize,large.padding,large.daySize
Pagination
Props:
modelValue?: number(v-model, default1)totalItems?: number(default0)pageSize?: number(default10)totalPages?: number(optional override instead oftotalItems/pageSize)siblingCount?: number(default1)boundaryCount?: number(default1)disabled?: booleansize?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)prevLabel?: string(defaultPrev)nextLabel?: string(defaultNext)ellipsisLabel?: string(default...)
Events:
update:modelValuechange
Slots:
indicator- slot props:{ step, index, status, active, completed, upcoming, error }step- slot props:{ step, index, status, active, completed, upcoming, error }
Example:
<Pagination v-model="page" :total-items="240" :page-size="20" />Pagination tokens
Component tokens (override via theme.overrides.components.pagination):
gap,itemMinWidth,fontSize,paddingborderRadius,borderColorbackgroundColor,textColorhoverBackgroundColoractiveBorderColor,activeBackgroundColor,activeTextColorfocusBorderColor,focusRingShadowdisabledOpacity,ellipsisPaddingsmall.fontSize,small.paddinglarge.fontSize,large.padding
DataTable
Props:
rows?: Array<Record<string, unknown>>columns?: Array<{ field: string; header?: string; sortable?: boolean; align?: 'left' | 'center' | 'right'; width?: string; minWidth?: string; formatter?: (row, value, column) => string | number }>rowKey?: string | ((row, index) => string | number)sortable?: booleansortField?: string | nullsortOrder?: 'asc' | 'desc' | nullloading?: booleanloadingText?: string(defaultLoading...)emptyText?: string(defaultNo data)striped?: boolean(defaultfalse)hover?: boolean(defaulttrue)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)showHeader?: boolean(defaulttrue)ariaLabel?: string(defaultData table)
Events:
update:sortFieldupdate:sortOrdersortrowClick
Slots:
header-{field}cell-{field}emptyloading
Example:
<DataTable
:columns="[
{ field: 'name', header: 'Name', sortable: true },
{ field: 'role', header: 'Role' },
{ field: 'age', header: 'Age', align: 'right', sortable: true },
]"
:rows="[
{ id: 1, name: 'Alice', role: 'Developer', age: 29 },
{ id: 2, name: 'Bob', role: 'Designer', age: 34 },
]"
row-key="id"
sortable
striped
/>DataTable tokens
Component tokens (override via theme.overrides.components.datatable):
borderColor,borderRadius,backgroundColorfontSize,textColorheaderBackgroundColor,headerTextColor,headerFontSize,headerFontWeight,headerBorderColor,headerGaprowBackgroundColor,rowTextColor,rowBorderColorcellPaddingstripedBackgroundColor,hoverBackgroundColorsortIconColor,sortIconActiveColor,sortIconSizestatePadding,stateTextColorsmall.fontSize,small.cellPaddinglarge.fontSize,large.cellPadding
Textarea
Props:
modelValue?: string(v-model)placeholder?: stringdisabled?: booleanreadonly?: booleansize?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)rows?: number(default3)
Events:
update:modelValueinputchangefocusblur
Example:
<Textarea v-model="bio" placeholder="Tell us about yourself" rows="4" />RichTextEditor
Props:
modelValue?: string(v-model)placeholder?: stringdisabled?: booleanreadonly?: booleansize?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)format?: 'markdown' | 'html'(defaultmarkdown)rows?: number(default6)maxLength?: number(default0, disabled when0)showToolbar?: boolean(defaulttrue)toolbar?: Array<'bold' | 'italic' | 'underline' | 'link' | 'bulletList' | 'orderedList' | 'code'>toolbarLabel?: string(defaultText formatting toolbar)ariaLabel?: string(defaultRich text editor)
Events:
update:modelValueinputchangefocusbluraction(payload:action,nextValue)
Example:
<RichTextEditor
v-model="article"
format="markdown"
:rows="8"
:max-length="2000"
:toolbar="['bold', 'italic', 'link', 'bulletList', 'code']"
/>FileUpload
Props:
modelValue?: File | File[] | null(v-model)multiple?: booleanaccept?: stringdisabled?: booleanreadonly?: booleanmaxSize?: number(bytes)maxFiles?: numberplaceholder?: stringbuttonLabel?: string(defaultBrowse)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValuechangereject(payload:Array<{ file: File; reason: 'maxSize' | 'maxFiles'; maxSize?: number; maxFiles?: number }>)focusblur
Example:
<FileUpload v-model="attachments" multiple :max-files="5" :max-size="10_000_000" />FileUpload tokens
Component tokens (override via theme.overrides.components.fileUpload):
minHeight,fontSize,gap,paddingborderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacity,dragBackgroundColorlistGap,itemPadding,itemBorderColor,itemBackgroundColor,itemRadius,itemTextColor,sizeTextColorbuttonPadding,buttonRadius,buttonBorderColor,buttonBackgroundColor,buttonTextColor,buttonHoverBackgroundColorremoveSize,removeRadius,removeHoverBackgroundColorsmall.fontSize,small.padding,small.buttonPaddinglarge.fontSize,large.padding,large.buttonPadding
SearchInput
Props:
modelValue?: string(v-model)placeholder?: stringdisabled?: booleanreadonly?: booleandebounce?: number(default300)loading?: boolean(defaultfalse)clearable?: boolean(defaultfalse)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)ariaLabel?: string(defaultSearch input)
Events:
update:modelValueinputchangesearchclearfocusblur
Example:
<SearchInput v-model="query" placeholder="Search..." clearable />
<SearchInput v-model="query" placeholder="Search..." :debounce="500" loading variant="outlined" />SearchInput tokens
Component tokens (override via theme.overrides.components.searchInput):
gap,fontSize,paddingborderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacityiconSize,iconColorclearSize,clearRadius,clearHoverBackgroundColorloadingSize,loadingBorderColor,loadingTopBorderColorsmall.fontSize,small.padding,small.iconSize,small.clearSizelarge.fontSize,large.padding,large.iconSize,large.clearSize
NumberInput
Props:
modelValue?: number | null(v-model)min?: numbermax?: numberstep?: number(default1)precision?: numberplaceholder?: stringdisabled?: booleanreadonly?: booleancontrols?: boolean(defaulttrue)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)ariaLabel?: string(defaultNumber input)
Events:
update:modelValueinputchangefocusblur
Example:
<NumberInput v-model="quantity" :min="0" :max="10" :step="1" />PasswordInput
Props:
modelValue?: string(v-model)placeholder?: stringdisabled?: booleanreadonly?: booleanautocomplete?: string(defaultcurrent-password)showToggle?: boolean(defaulttrue)showStrength?: boolean(defaultfalse)showCapsLockHint?: boolean(defaulttrue)revealLabel?: string(defaultShow password)hideLabel?: string(defaultHide password)revealText?: string(defaultShow)hideText?: string(defaultHide)capsLockHint?: string(defaultCaps Lock is on)weakLabel?: string(defaultWeak password)mediumLabel?: string(defaultMedium password)strongLabel?: string(defaultStrong password)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)ariaLabel?: string(defaultPassword input)
Events:
update:modelValueinputchangefocusblurtoggleVisibility(payload:boolean)
Example:
<PasswordInput v-model="password" show-strength />PasswordInput tokens
Component tokens (override via theme.overrides.components.passwordInput):
gap,fontSize,paddingborderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacitytoggleSize,toggleRadius,toggleColor,toggleHoverBackgroundColorstrengthGap,strengthTrackHeight,strengthTrackRadius,strengthTrackBackgroundColorstrengthWeakColor,strengthMediumColor,strengthStrongColormetaFontSize,hintColorsmall.fontSize,small.paddinglarge.fontSize,large.padding
OtpInput
Props:
modelValue?: string(v-model)length?: number(default6)placeholder?: stringdisabled?: booleanreadonly?: booleanmask?: boolean(defaultfalse)alphanumeric?: boolean(defaultfalse)autocomplete?: string(defaultone-time-code)autoFocus?: boolean(defaultfalse)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)ariaLabel?: string(defaultOTP input)
Events:
update:modelValuechangecomplete(payload:string)focusblurpaste(payload:string)
Example:
<OtpInput v-model="otp" :length="6" />
<OtpInput v-model="backupCode" :length="8" alphanumeric variant="outlined" />OtpInput tokens
Component tokens (override via theme.overrides.components.otpInput):
gap,fontSize,cellSize,paddingborderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacitysmall.cellSize,small.fontSize,small.paddinglarge.cellSize,large.fontSize,large.padding
ColorPicker
Props:
modelValue?: string(v-model)format?: 'hex' | 'rgb' | 'hsl'(defaulthex)alpha?: boolean(defaultfalse)presets?: string[](default[])placeholder?: stringdisabled?: booleanreadonly?: booleansize?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)ariaLabel?: string(defaultColor picker)
Events:
update:modelValuechangeopenclose
Example:
<ColorPicker v-model="brandColor" />
<ColorPicker v-model="brandColorRgba" format="rgb" alpha variant="outlined" />ColorPicker tokens
Component tokens (override via theme.overrides.components.colorPicker):
minWidth,gap,fontSize,paddingborderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacityswatchSize,swatchRadiuspanelPadding,panelBorderColor,panelBackgroundColor,panelShadow,panelGaprangeAccentColorpresetSize,presetRadius,presetBorderColor,presetHoverBorderColorsmall.padding,small.fontSize,small.swatchSize,small.presetSizelarge.padding,large.fontSize,large.swatchSize,large.presetSize
MaskedInput
Props:
modelValue?: string(v-model)mask?: string | ((value: string) => string)(default'')placeholder?: stringplaceholderChar?: string(default_)disabled?: booleanreadonly?: booleanunmask?: boolean(defaultfalse)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Events:
update:modelValueinputchangefocusblurcomplete
Example:
<MaskedInput v-model="phone" mask="+7 (###) ###-##-##" />
<MaskedInput v-model="licenseRaw" mask="AA-####" unmask variant="outlined" />MaskedInput tokens
Component tokens (override via theme.overrides.components.maskedInput):
gap,fontSize,paddingborderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacitysmall.fontSize,small.paddinglarge.fontSize,large.padding
RadioGroup / RadioButton
Props (RadioGroup):
modelValue?: string | number | boolean(v-model)name?: stringdisabled?: booleanvariant?: 'filled' | 'outlined'(defaultfilled)direction?: 'vertical' | 'horizontal'(defaultvertical)
Props (RadioButton):
value?: string | number | booleanlabel?: stringdisabled?: booleanname?: stringvariant?: 'filled' | 'outlined'(defaultfilled)
Example:
<RadioGroup v-model="plan" direction="horizontal">
<RadioButton value="basic">Basic</RadioButton>
<RadioButton value="pro">Pro</RadioButton>
</RadioGroup>ButtonGroup
Props:
size?: 'small' | 'normal' | 'large'(inherits to nestedButton/SplitButtonwhen child props are not set)variant?: 'filled' | 'outlined' | 'text'(inherits to nestedButton/SplitButton)severity?: 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'danger'(inherits to nestedButton/SplitButton)disabled?: boolean(defaultfalse)orientation?: 'horizontal' | 'vertical'(defaulthorizontal)attached?: boolean(defaultfalse)
Slots:
default- placeButton/SplitButtonitems
Example:
<ButtonGroup attached size="small" variant="outlined" severity="primary">
<Button label="Day" />
<Button label="Week" />
<Button label="Month" />
</ButtonGroup>ButtonGroup tokens
Component tokens (override via theme.overrides.components.buttonGroup):
gap,borderRadius,disabledOpacity
Breadcrumbs
Props:
items?: Array<{ label?: string; to?: string; href?: string; url?: string; active?: boolean; disabled?: boolean }>separator?: string(default/)ariaLabel?: string(defaultBreadcrumbs)
Slots:
item- slot props:{ item, index, isLast, active }separator(optional) - slot props:{ separator }
Example:
<Breadcrumbs
:items="[
{ label: 'Home', to: '/' },
{ label: 'Settings', to: '/settings' },
{ label: 'Profile', active: true },
]"
/>Breadcrumbs tokens
Component tokens (override via theme.overrides.components.breadcrumbs):
gap,fontSize,textColor,hoverColor,activeColorseparatorColor,disabledOpacity
Divider
Props:
orientation?: 'horizontal' | 'vertical'(defaulthorizontal)variant?: 'solid' | 'dashed' | 'dotted'(defaultsolid)inset?: boolean(defaultfalse)label?: stringariaLabel?: string(defaultDivider)
Slots:
default(optional) - custom label content (horizontal mode only)
Example:
<Divider />
<Divider label="OR" />
<div style="height: 32px; display: flex; align-items: center; gap: 8px">
<span>Left</span>
<Divider orientation="vertical" />
<span>Right</span>
</div>Divider tokens
Component tokens (override via theme.overrides.components.divider):
color,textColor,thickness,minLengthgap,insetlabelPadding,labelFontSize
PageHeader
Props:
title?: stringsubtitle?: stringsize?: 'small' | 'normal' | 'large'(defaultnormal)divider?: boolean(defaultfalse)
Slots:
breadcrumbs(optional)title(optional) - replacestitleprop renderingsubtitle(optional) - replacessubtitleprop renderingmeta(optional)actions(optional)default(optional) - additional body content
Example:
<PageHeader title="Projects" subtitle="Manage active projects and team workload.">
<template #breadcrumbs>
<Breadcrumbs :items="breadcrumbItems" />
</template>
<template #meta>
<Badge severity="info" variant="soft">24 active</Badge>
<Chip label="Last sync: 2m ago" />
</template>
<template #actions>
<Button label="Import" variant="outlined" severity="secondary" />
<Button label="New project" icon="plus" />
</template>
</PageHeader>PageHeader tokens
Component tokens (override via theme.overrides.components.pageHeader):
gap,contentGap,breadcrumbGap,actionsGap,metaGappadding,borderRadius,borderColor,backgroundColor,textColor,dividerColortitleFontSize,titleLineHeight,titleFontWeightsubtitleFontSize,subtitleColorsmall.padding,small.titleFontSize,small.subtitleFontSizelarge.padding,large.titleFontSize,large.subtitleFontSize
SegmentedControl
Props:
modelValue?: string | number(v-model)options?: Array<{ label: string; value: string | number; disabled?: boolean }>(default[])disabled?: booleanfullWidth?: boolean(defaultfalse)size?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)ariaLabel?: stringariaLabelledby?: string
Events:
update:modelValuechangefocusblur
Example:
<SegmentedControl
v-model="view"
:options="[
{ label: 'List', value: 'list' },
{ label: 'Grid', value: 'grid' },
{ label: 'Board', value: 'board' },
]"
/>SegmentedControl tokens
Component tokens (override via theme.overrides.components.segmentedControl):
fontSize,padding,gapborderRadius,borderColor,backgroundColor,textColorhoverBackgroundColor,activeBackgroundColor,activeTextColorfocusRingShadow,disabledOpacitysegmentPadding,segmentRadius,segmentFontWeightsmall.fontSize,small.padding,small.segmentPaddinglarge.fontSize,large.padding,large.segmentPadding
Tabs / Tab / TabPanel
Props (Tabs):
modelValue?: string | number(v-model)disabled?: booleanorientation?: 'horizontal' | 'vertical'(defaulthorizontal)
Props (Tab):
value: string | numberlabel?: stringdisabled?: boolean
Props (TabPanel):
value: string | number
Example:
<Tabs v-model="tab">
<template #tabs>
<Tab value="overview">Overview</Tab>
<Tab value="settings">Settings</Tab>
</template>
<template #panels>
<TabPanel value="overview">Overview content</TabPanel>
<TabPanel value="settings">Settings content</TabPanel>
</template>
</Tabs>Tabs tokens
Component tokens (override via theme.overrides.components.tabs):
gap,listGap,listBorderWidth,listBorderColor,listVerticalPaddingtabPadding,tabFontSize,tabBorderRadiustabTextColor,tabBackgroundColor,tabHoverBackgroundColortabActiveTextColor,tabActiveBackgroundColor,tabActiveBorderColor,tabActiveBorderWidthpanelPadding,panelBorderRadius,panelBackgroundColor,panelTextColordisabledOpacity
Accordion / AccordionItem
Props (Accordion):
modelValue?: string | number | Array<string | number>(v-model)multiple?: boolean(defaultfalse)disabled?: booleanvariant?: 'filled' | 'outlined'(defaultfilled)size?: 'small' | 'normal' | 'large'(defaultnormal)ariaLabel?: stringariaLabelledby?: string
Props (AccordionItem):
value: string | numbertitle?: stringdisabled?: booleanunmount?: boolean(defaultfalse)
Events:
update:modelValuechange
Example:
<Accordion v-model="faq">
<AccordionItem value="shipping" title="Shipping">
Shipping details
</AccordionItem>
<AccordionItem value="returns" title="Returns">
Returns policy
</AccordionItem>
</Accordion>Accordion tokens
Component tokens (override via theme.overrides.components.accordion):
gap,borderRadius,borderColor,backgroundColorheaderGap,headerPadding,headerFontSize,headerFontWeightheaderTextColor,headerBackgroundColor,headerHoverBackgroundColor,headerActiveBackgroundColorcontentPadding,contentTextColor,contentBackgroundColoriconSize,iconColor,dividerColorfocusRingShadow,disabledOpacitysmall.headerPadding,small.headerFontSize,small.contentPaddinglarge.headerPadding,large.headerFontSize,large.contentPadding
Toast / ToastContainer
Props (Toast):
modelValue?: boolean(v-model)title?: stringmessage?: stringseverity?: 'neutral' | 'info' | 'success' | 'warn' | 'danger'(defaultneutral)closable?: boolean(defaulttrue)duration?: number(ms, default0, no auto-close)
Props (ToastContainer):
position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'(defaulttop-right)
Example:
<ToastContainer position="top-right">
<Toast v-model="toastOpen" title="Saved" message="Changes are saved." severity="success" :duration="2500" />
</ToastContainer>Toast tokens
Component tokens (override via theme.overrides.components.toast):
gap,padding,borderRadius,borderColorbackgroundColor,textColor,shadow,minWidthfontSize,lineHeight,bodyGaptitleFontSize,titleFontWeight,closeSizecontainerGap,containerPadding,containerMaxWidth,zIndexinfo.*,success.*,warn.*,danger.*(backgroundColor/borderColor/textColor)
Alert
Props:
modelValue?: boolean(optional v-model)title?: stringmessage?: stringseverity?: 'neutral' | 'info' | 'success' | 'warn' | 'danger'(defaultneutral)closable?: boolean(defaultfalse)icon?: string
Slots:
default- message content (fallbacks tomessage)title(optional)icon(optional)actions(optional)close(optional)
Events:
update:modelValueclose
Example:
<Alert v-model="alertOpen" severity="warn" title="Unsaved changes" closable>
You have unsaved form changes.
<template #actions>
<Button label="Save" size="small" />
</template>
</Alert>Alert tokens
Component tokens (override via theme.overrides.components.alert):
gap,padding,borderRadius,borderColorbackgroundColor,textColor,iconColorfontSize,lineHeight,bodyGaptitleFontSize,titleFontWeightactionsGap,closeSize,closeRadius,closeFontSize,closeHoverBackgroundColorinfo.*,success.*,warn.*,danger.*(backgroundColor/borderColor/textColor)
EmptyState
Props:
title?: stringdescription?: stringicon?: stringsize?: 'small' | 'normal' | 'large'(defaultnormal)variant?: 'filled' | 'outlined'(defaultfilled)
Slots:
default- description content (fallbacks todescription)title(optional)icon(optional)actions(optional)
Example:
<EmptyState title="No projects yet" description="Create your first project to get started." icon="📂">
<template #actions>
<Button label="Create project" size="small" />
<Button label="Import" size="small" severity="secondary" />
</template>
</EmptyState>EmptyState tokens
Component tokens (override via theme.overrides.components.emptyState):
gap,bodyGap,padding,borderRadiusborderColor,backgroundColor,textColor,maxWidthiconSize,iconColortitleFontSize,titleLineHeight,titleFontWeight,titleColordescriptionFontSize,descriptionLineHeight,descriptionColoractionsGapsmall.padding,small.iconSize,small.titleFontSize,small.descriptionFontSizelarge.padding,large.iconSize,large.titleFontSize,large.descriptionFontSize
Textarea tokens
Component tokens (override via theme.overrides.components.textarea):
gap,fontSize,paddingborderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacityminHeight,resizesmall.fontSize,small.paddinglarge.fontSize,large.padding
RichTextEditor tokens
Component tokens (override via theme.overrides.components.richTextEditor):
gap,fontSize,paddingborderRadius,borderColorbackgroundColor,textColor,placeholderColorfocusBorderColor,focusRingShadow,hoverBorderColordisabledOpacityminHeight,resizetoolbarGap,toolbarPadding,toolbarBorderColor,toolbarBackgroundColortoolbarButtonMinWidth,toolbarButtonPadding,toolbarButtonRadiustoolbarButtonBorderColor,toolbarButtonBackgroundColor,toolbarButtonTextColortoolbarButtonHoverBackgroundColor,toolbarButtonActiveBackgroundColorcounterFontSize,counterColor,counterDangerColorsmall.fontSize,small.padding,small.toolbarButtonPaddinglarge.fontSize,large.padding,large.toolbarButtonPadding
Modal
Props:
modelValue?: boolean(v-model)title?: stringsize?: 'sm' | 'md' | 'lg'closeOnOverlay?: boolean(default true)closeOnEsc?: boolean(default true)showClose?: boolean(default true)lockScroll?: boolean(default true)
Slots:
header(optional) - replaces the title areabody(optional) - modal content (defaults to default slot if not provided)default(optional) - modal content ifbodyslot is not usedfooter(optional)close(optional) - custom close button; slot props:{ close }
Events:
update:modelValueopenclose
Example:
<Modal v-model="open" title="Confirm action" size="sm">
<template #body>
<p>Are you sure?</p>
</template>
<template #footer>
<Button label="Cancel" severity="secondary" @click="open = false" />
<Button label="Confirm" @click="open = false" />
</template>
</Modal>Modal tokens
Component tokens (override via theme.overrides.components.modal):
width,maxWidth,maxHeightwidthSm,maxWidthSmwidthLg,maxWidthLgpadding,borderRadiusbackgroundColor,textColoroverlayBackgroundColorshadowzIndexheaderGap,bodyGap,footerGaptitleFontSize,titleLineHeight,titleFontWeightcloseSize,closeRadius,closeOffsetcloseColor,closeFontSize,closeHoverBackgroundColor
ConfirmDialog
Props:
modelValue?: boolean(v-model)title?: string(defaultConfirm action)message?: stringconfirmLabel?: string(defaultConfirm)cancelLabel?: string(defaultCancel)confirmSeverity?: 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'danger'(defaultdanger)loading?: boolean(defaultfalse)closeOnConfirm?: boolean(defaulttrue)size?: 'sm' | 'md' | 'lg'(defaultsm)closeOnOverlay?: boolean(defaulttrue)closeOnEsc?: boolean(defaulttrue)showClose?: boolean(defaulttrue)lockScroll?: boolean(defaulttrue)
Slots:
default(optional) - dialog message/body content (fallbacks tomessage)actions(optional) - custom action buttons; slot props:{ confirm, cancel }
Events:
update:modelValueconfirmcancelopenclose
Example:
<ConfirmDialog
v-model="open"
title="Delete item?"
message="This action cannot be undone."
confirm-label="Delete"
@confirm="removeItem"
/>ConfirmDialog tokens
Component tokens (override via theme.overrides.components.confirmDialog):
maxWidthmessageColor,messageFontSize,messageLineHeightactionsGap
Drawer
Props:
modelValue?: boolean(v-model)title?: stringposition?: 'left' | 'right' | 'top' | 'bottom'(defaultright)size?: 'sm' | 'md' | 'lg'overlay?: boolean(defaulttrue)closeOnOverlay?: boolean(defaulttrue)closeOnEsc?: boolean(defaulttrue)showClose?: boolean(defaulttrue)lockScroll?: boolean(defaulttrue)
Slots:
header(optional) - replaces the title areabody(optional) - drawer content (defaults to default slot if not provided)default(optional) - drawer content ifbodyslot is not usedfooter(optional)close(optional) - custom close button; slot props:{ close }
Events:
update:modelValueopenclose
Example:
<Drawer v-model="open" title="Filters" position="right">
<template #body>
<p>Drawer content</p>
</template>
<template #footer>
<Button label="Reset" severity="secondary" size="small" />
<Button label="Apply" size="small" @click="open = false" />
</template>
</Drawer>Drawer tokens
Component tokens (override via theme.overrides.components.drawer):
width,widthSm,widthLgheight,heightSm,heightLgpadding,borderRadiusbackgroundColor,textColoroverlayBackgroundColorshadowzIndexheaderGap,bodyGap,footerGaptitleFontSize,titleLineHeight,titleFontWeightcloseSize,closeRadius,closeOffsetcloseColor,closeFontSize,closeHoverBackgroundColor
Dropdown
Props:
modelValue?: boolean(v-model)items?: Array<{ label?: string; to?: string; href?: string; url?: string; icon?: string; disabled?: boolean; separator?: boolean; command?: () => void }>placement?: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end' | 'bottom' | 'top'(defaultbottom-start)offset?: number(default6)disabled?: booleancloseOnSelect?: boolean(defaulttrue)closeOnEsc?: boolean(defaulttrue)matchTriggerWidth?: boolean(defaulttrue)
Slots:
triggerdefault(optional) - dropdown content (defaults toitemslist if provided)
Note: For custom dropdown content, add data-dropdown-close to clickable elements to auto-close on click.
Events:
update:modelValueopencloseselect
Example:
<Dropdown :items="menuItems">
<template #trigger>
<Button label="Actions" />
</template>
</Dropdown>Dropdown tokens
Component tokens (override via theme.overrides.components.dropdown):
panelPadding,panelBorderRadius,panelBorderColorpanelBackgroundColor,panelShadow,zIndexdisabledOpacity,itemPadding
ContextMenu
Props:
modelValue?: boolean(v-model)items?: Array<{ label?: string; to?: string; href?: string; url?: string; icon?: string; disabled?: boolean; separator?: boolean; command?: () => void }>disabled?: booleancloseOnSelect?: boolean(defaulttrue)closeOnEsc?: boolean(defaulttrue)offset?: number(default2)
Slots:
default- context area/targetmenu(optional) - menu content (defaults toitemslist if provided)
Note: For custom menu content, add data-context-menu-close to clickable elements to auto-close on click.
Events:
update:modelValueopencloseselectcontextmenu
Example:
<ContextMenu :items="menuItems">
<div class="surface">Right-click here</div>
</ContextMenu>ContextMenu tokens
Component tokens (override via theme.overrides.components.contextMenu):
minWidthpanelPadding,panelBorderRadius,panelBorderColorpanelBackgroundColor,panelShadow,zIndexdisabledOpacity,itemPadding
CommandPalette
Props:
modelValue?: boolean(v-model)items?: Array<{ label: string; value?: string | number; description?: string; shortcut?: string; group?: string; disabled?: boolean; keywords?: Array<string>; command?: () => void }>placeholder?: string(defaultType a command or search...)emptyText?: string(defaultNo commands found)ariaLabel?: string(defaultCommand palette)closeOnOverlay?: boolean(defaulttrue)closeOnEsc?: boolean(defaulttrue)closeOnSelect?: boolean(defaulttrue)filter?: boolean(defaulttrue)enableShortcut?: boolean(defaulttrue)shortcutKey?: string(defaultk)
Events:
update:modelValueopencloseselectsearch
Example:
<CommandPalette
v-model="open"
:items="[
{ label: 'Open docs', value: 'docs', group: 'Navigation' },
{ label: 'Save and publish', value: 'publish', group: 'Actions', shortcut: 'Ctrl+Enter' },
]"
@select="onCommand"
/>CommandPalette tokens
Component tokens (override via theme.overrides.components.commandPalette):
width,maxWidth,maxHeightpadding,borderRadius,borderColorbackgroundColor,textColor,overlayBackgroundColorshadow,zIndex,headerGapinputPadding,inputBorderRadius,inputBorderColorinputBackgroundColor,inputTextColor,inputPlaceholderColorinputFocusBorderColor,inputFocusRingShadowlistGap,groupGapgroupLabelPadding,groupLabelColor,groupLabelFontSizeitemPadding,itemBorderRadius,itemGapitemTextColor,itemDescriptionColor,itemDescriptionFontSizeitemActiveBackgroundColor,itemActiveTextColor,itemDisabledOpacityshortcutPadding,shortcutBorderRadius,shortcutBorderColorshortcutBackgroundColor,shortcutTextColor,shortcutFontSizeemptyPadding,emptyColor
NotificationCenter
Props:
modelValue?: boolean(v-model)items?: Array<{ id: string | number; title: string; message?: string; date?: string; read?: boolean; severity?: 'neutral' | 'info' | 'success' | 'warn' | 'danger'; avatar?: string }>title?: string(defaultNotifications)emptyText?: string(defaultNo notifications)closeOnOverlay?: boolean(defaulttrue)- `closeOnEsc?:
