Every component's full reference lives in the design-system documentation: one page per component with a Vue tab, live examples, and tables of its props, parts, slots and events. This page lists them with the subpath each one is exported from, and covers what is specific to Vue.
Importing
Every component is a named export of the package root and of one category subpath:
import { Button, Dialog } from '@artisanpack-ui/vue';
// or
import { Button } from '@artisanpack-ui/vue/form';
import { Dialog } from '@artisanpack-ui/vue/layout';
The subpaths are /form, /layout, /navigation, /display, /data, /feedback, /utility, /composables and /ai. The AI components are only exported from /ai. Each subpath ships its own type declarations.
v-model
Form components bind their value with v-model. Checkbox and Toggle bind checked, and components with an open state bind open:
<script setup lang="ts">
import { ref } from 'vue';
import { Button, Dialog, Input, Toggle } from '@artisanpack-ui/vue';
const name = ref('');
const notify = ref(true);
const editing = ref(false);
</script>
<template>
<Button @click="editing = true">Edit profile</Button>
<Dialog v-model:open="editing" title="Edit profile">
<Input v-model="name" label="Name" name="name" />
<Toggle v-model:checked="notify" label="Email me about replies" />
</Dialog>
</template>
| Binding | Components |
|---|---|
v-model |
Input, Password, Pin, Textarea, Select, Combobox, CheckboxGroup, RadioGroup, Range, Rating, ColorPicker, DatePicker, File, Signature, RichTextEditor, CodeEditor, Tabs, Accordion, Steps, Table (the selected rows), Calendar, ThemeToggle |
v-model:checked |
Checkbox, Toggle, Swap |
v-model:open |
Dialog, Drawer, Popover, Tooltip, DropdownMenu, UserMenu, Spotlight, Collapse, ImageGallery, Combobox, DatePicker, ColorPicker, MenuSub |
v-model:page |
Pagination |
| Others | Markdown v-model:source; Calendar v-model:date and v-model:view; Table v-model:sortBy and v-model:expanded |
A component bound with v-model:open follows the value you pass. It reports a change through update:open and waits for the value to change, so a parent that ignores the event keeps it where it is. Without the binding, it keeps its own state. The component pages list each component's events under the Vue tab.
class and classes
class, style and other attributes fall through to the component. class lands on its root part (for overlays, the panel). On form fields, attributes such as name, required and autocomplete go to the native control. Combobox is the exception: its attributes land on its root, so an aria-label or autocomplete doesn't reach the input. Give it an accessible name with the label prop, and use its name prop to name the hidden inputs it submits.
To style any other part, pass classes, keyed by part name:
<Button
color="primary"
:classes="{ label: 'tracking-wide', icon: 'opacity-75' }"
leading-icon="plus"
>
New listing
</Button>
The part names are listed on each component's page and exported as types (ButtonPart, DialogPart, …). See Component Markup.
Slots
Text props such as title, description and footer have a slot of the same name for richer content, and icon props have an icon slot (iconEnd for a trailing icon):
<Card title="Revenue">
<template #actions>
<Button size="sm" variant="ghost">Export</Button>
</template>
…
</Card>
Each component page lists its slots.
Icons
Icon props (leadingIcon, icon, …) take names from the shared icon registry. registerIcons, registerDirectionalIcons, isSafeIconBody and UnsafeIconError are re-exported from the package root, so you can add your own:
import { registerIcons } from '@artisanpack-ui/vue';
registerIcons({
'brand-logo': '<path d="M4 4h16v16H4z"/><circle cx="12" cy="12" r="4"/>',
});
Toasts
Put one Toaster on the page, then call toast.create() from anywhere:
<script setup lang="ts">
import { Button, Toaster, toast } from '@artisanpack-ui/vue';
</script>
<template>
<Button @click="toast.create({ title: 'Listing saved', color: 'success' })">Save</Button>
<Toaster />
</template>
Global registration
Components can be registered globally with the Vue plugin, under a prefix (<ApButton>). Only the components you pass are registered.
All components
Actions
| Component | Subpath | Also exported |
|---|---|---|
| Button | /form |
|
| Link | /navigation |
|
| Clipboard | /utility |
|
| Swap | /utility |
Forms
| Component | Subpath | Also exported |
|---|---|---|
| Form | /form |
|
| Fieldset | /form |
|
| Input | /form |
|
| Password | /form |
|
| Pin | /form |
|
| Textarea | /form |
|
| Select | /form |
|
| Combobox | /form |
|
| Checkbox | /form |
|
| CheckboxGroup | /form |
|
| RadioGroup | /form |
|
| Toggle | /form |
|
| Range | /form |
|
| Rating | /form |
|
| ColorPicker | /form |
|
| DatePicker | /form |
|
| File | /form |
|
| Signature | /form |
|
| ValidationSummary | /form |
Editors and content
| Component | Subpath | Also exported |
|---|---|---|
| RichTextEditor | /form |
|
| CodeEditor | /form |
|
| Markdown | /utility |
|
| Code | /display |
|
| Kbd | /utility |
|
| Diff | /display |
|
| Heading | /layout |
|
| Text | /layout |
|
| Divider | /layout |
|
| Icon | /utility |
Data display
| Component | Subpath | Also exported |
|---|---|---|
| Badge | /display |
|
| Avatar | /display |
AvatarGroup |
| Stat | /display |
|
| KpiCard | /display |
|
| Sparkline | /display |
|
| Table | /data |
|
| Chart | /data |
|
| Timeline | /display |
TimelineItem |
| ListItem | /layout |
List |
| Calendar | /data |
Feedback
| Component | Subpath | Also exported |
|---|---|---|
| Alert | /feedback |
|
| Toast | /feedback |
Toaster, toast, createToaster |
| Loading | /feedback |
|
| Progress | /display |
|
| ProgressRadial | /display |
|
| Skeleton | /feedback |
|
| EmptyState | /feedback |
|
| ErrorState | /feedback |
Overlays
| Component | Subpath | Also exported |
|---|---|---|
| Dialog | /layout |
|
| Drawer | /layout |
|
| Popover | /layout |
|
| Tooltip | /utility |
|
| DropdownMenu | /layout |
DropdownMenuItem, DropdownMenuGroup, DropdownMenuSeparator |
| Spotlight | /navigation |
Navigation
| Component | Subpath | Also exported |
|---|---|---|
| Navbar | /navigation |
NavbarItem |
| Menu | /navigation |
MenuItem, MenuSub, MenuTitle, MenuSeparator |
| UserMenu | /layout |
|
| Tabs | /layout |
Tab |
| Steps | /navigation |
Step |
| Pagination | /navigation |
|
| Breadcrumbs | /navigation |
BreadcrumbsItem |
Disclosure
| Component | Subpath | Also exported |
|---|---|---|
| Accordion | /layout |
AccordionItem |
| Collapse | /layout |
Layout
| Component | Subpath | Also exported |
|---|---|---|
| AppShell | /layout |
|
| PageHeader | /layout |
|
| Card | /layout |
|
| Grid | /layout |
|
| Stack | /layout |
Media
| Component | Subpath | Also exported |
|---|---|---|
| ImageGallery | /display |
|
| Carousel | /display |
|
| ImageSlider | /display |
Theme
| Component | Subpath | Also exported |
|---|---|---|
| ThemeToggle | /utility |
ThemeScript |
Livewire-only components
StreamableContent, ImageLibrary and ThemePreview are Livewire-only: the design system ships them in Livewire UI Components, not in React or Vue.
Deprecated exports
These 1.x names still work in 2.0 so an app keeps building while you migrate. Each is a thin alias: it renders its replacement, maps the 1.x props it can, and warns once in development. They're marked @deprecated and will be removed in the next major. Every attribute an alias doesn't map, including the replacement's own props, passes through to the replacement.
| Deprecated | Renders | Mapped | Ignored |
|---|---|---|---|
Modal |
Dialog |
subtitle → description, glass → surface="glass", ariaLabel → aria-label, the actions slot → footer. persistent gives an alertdialog with no close button that ignores Escape and backdrop closes |
bottom (use a Drawer) |
Dropdown, DropdownItem |
DropdownMenu, DropdownMenuItem |
label and the trigger slot → the trigger's label, end → align="end". DropdownItem keeps its click event (also fired from the keyboard) and takes an optional value |
top, hover |
Sidebar |
AppShell |
The sidebar slot, the default slot as the content, ariaLabel → label |
open, side, responsive |
SpotlightSearch |
Spotlight |
items grouped by group (each id becomes the value), ariaLabel → label. select still sends the 1.x item. The item slot is gone |
|
Radio |
RadioGroup |
The optionValue, optionLabel and optionHint keys, inline → horizontal, card → variant="cards", cardClass → classes.item |
color |
Editor |
CodeEditor |
All its props carry over | |
FileUpload |
File |
See below | |
ErrorDisplay |
ErrorState |
||
ToastProvider, useToast |
Toaster and toast |
defaultDuration → duration, max, and the 1.x position classes → a placement. Its default slot also gets toast |
toast-middle |
ToastMessage |
Toast |
message → title, color; the close button emits dismiss with the item's id |
A few behaviours change:
Sidebarhas no mobile drawer or end-side sidebar: it sits at the start edge and stacks above the content on narrow screens.ToastProviderhas its own toaster, souseToast()below it never reaches the page'stoast. Toasts pastmaxnow queue instead of evicting the oldest.FileUploadtakesFile's API, not its 1.x one: thefilesSelectedevent and thewithDragDrop,dragDropText,dragDropClass,progressandhideProgressprops are gone. Keeping the import isn't enough. Bindv-modelto receive the selected files, and pass progress per file in the entries.
The codemod rewrites most of them for you.

