ArtisanPack UI
DocsVueComponents

Components

Vue v2.0.0

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...

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
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:

  • Sidebar has no mobile drawer or end-side sidebar: it sits at the start edge and stacks above the content on narrow screens.
  • ToastProvider has its own toaster, so useToast() below it never reaches the page's toast. Toasts past max now queue instead of evicting the oldest.
  • FileUpload takes File's API, not its 1.x one: the filesSelected event and the withDragDrop, dragDropText, dragDropClass, progress and hideProgress props are gone. Keeping the import isn't enough. Bind v-model to receive the selected files, and pass progress per file in the entries.

The codemod rewrites most of them for you.