Foundation

Themes

Color palettes, font families, and type scales, each combinable with light or dark appearance.

useTheme()

Props

NameTypeDefaultDescription
mode'system' | 'light' | 'dark'Readonly ref for the selected appearance mode.
palette'default' | 'ocean' | 'forest' | 'sunset' | 'violet' | 'rose'Readonly ref for the active color palette.
fontThemeFontReadonly ref for the active font family (system, inter, lexend, space-mono, jetbrains-mono, etc.).
fontSize'xs' | 'sm' | 'md' | 'lg' | 'xl'Readonly ref for the active type scale.
spacing'xs' | 'sm' | 'md' | 'lg' | 'xl'Readonly ref for the active spacing scale.
lineSpacing'xs' | 'sm' | 'md' | 'lg' | 'xl'Readonly ref for the active line spacing scale.
resolved'light' | 'dark'Readonly ref for the applied appearance after resolving system preference.

Events

NamePayloadDescription
setMode(mode)ThemeAppearanceSets appearance and persists to localStorage.
setPalette(palette)ThemePaletteSets color palette and persists to localStorage.
setFont(font)ThemeFontSets font family, loads Google Fonts when needed, and persists to localStorage.
setFontSize(fontSize)ThemeFontSizeSets type scale (xs, sm, md, lg, xl) and persists to localStorage.
setSpacing(spacing)ThemeSpacingSets spacing scale (xs, sm, md, lg, xl) and persists to localStorage.
setLineSpacing(lineSpacing)ThemeLineSpacingSets line spacing scale (xs, sm, md, lg, xl) and persists to localStorage.

DsThemeSelect

Slots

NameDescription
Header dropdowns for appearance, palette, font, size, spacing, and line spacing; no props required.

Palettes

Fonts

Font sizes

Current: light appearance · sunset palette · lexend font · sm size

Example

// Appearance: system | light | dark
const { mode, setMode } = useTheme()
setMode('dark')

// Palette: default | ocean | forest | sunset | violet | rose
const { palette, setPalette } = useTheme()
setPalette('ocean')

// Font: system | inter | lexend | dm-sans | space-mono | jetbrains-mono | ...
const { font, setFont } = useTheme()
setFont('lexend')

// Font size: xs | sm | md | lg | xl
const { fontSize, setFontSize } = useTheme()
setFontSize('lg')

Actions

Button

Primary actions, secondary actions, and destructive flows.

DsButton

Props

NameTypeDefaultDescription
variant'primary' | 'secondary' | 'ghost' | 'danger''primary'Visual style of the button.
size'sm' | 'md' | 'lg''md'Padding and font size.
type'button' | 'submit' | 'reset''button'Native button type attribute.
disabledbooleanfalseDisables interaction.
loadingbooleanfalseShows a spinner and disables the button.

Events

NamePayloadDescription
clickMouseEventEmitted when the button is clicked.

Slots

NameDescription
defaultButton label content.

Example

DsButton Primary
DsButton(variant="secondary") Secondary
DsButton(variant="ghost") Ghost
DsButton(variant="danger") Danger
DsButton(loading) Loading

Form Widgets

Input

Text fields with label, hint, and error states.

DsInput

Props

NameTypeDefaultDescription
modelValuestring''Bound input value (use with v-model).
labelstringVisible field label.
hintstringHelper text shown below the input.
errorstringError message; sets invalid state when present.
typestring'text'Native input type (text, email, password, etc.).
placeholderstringPlaceholder text.
disabledbooleanfalseDisables the input.
idstringCustom element id; auto-generated if omitted.

Events

NamePayloadDescription
update:modelValuestringEmitted when the input value changes.

We'll never share your email.

Username is already taken.

Example

DsInput(
  v-model="email"
  label="Email"
  placeholder="you@example.com"
  hint="We'll never share your email."
)
DsInput(
  v-model="username"
  label="Username"
  error="Username is already taken."
)

Textarea

Multi-line text input.

DsTextarea

Props

NameTypeDefaultDescription
modelValuestring''Bound textarea value (use with v-model).
labelstringVisible field label.
hintstringHelper text shown below the textarea.
errorstringError message; sets invalid state when present.
placeholderstringPlaceholder text.
disabledbooleanfalseDisables the textarea.
rowsnumber4Visible row count.
idstringCustom element id; auto-generated if omitted.

Events

NamePayloadDescription
update:modelValuestringEmitted when the textarea value changes.

Example

DsTextarea(
  v-model="notes"
  label="Notes"
  placeholder="Add a note…"
)

Select

Native select with styled options.

DsSelect

Props

NameTypeDefaultDescription
modelValuestring''Bound selected value (use with v-model).
labelstringVisible field label.
hintstringHelper text shown below the select.
errorstringError message; sets invalid state when present.
placeholderstringDisabled placeholder option text.
optionsrequiredSelectOption[]Array of { label, value } objects.
disabledbooleanfalseDisables the select.
idstringCustom element id; auto-generated if omitted.

Events

NamePayloadDescription
update:modelValuestringEmitted when the selected value changes.

Example

DsSelect(
  v-model="plan"
  label="Plan"
  placeholder="Choose a plan"
  :options="[
    { label: 'Starter', value: 'starter' },
    { label: 'Pro', value: 'pro' },
  ]"
)

Checkbox & Switch

Boolean form controls.

DsCheckbox

Props

NameTypeDefaultDescription
modelValuebooleanfalseChecked state (use with v-model).
labelstringLabel text beside the checkbox.
disabledbooleanfalseDisables the checkbox.

Events

NamePayloadDescription
update:modelValuebooleanEmitted when checked state changes.

Slots

NameDescription
defaultAlternative to label prop for custom label content.

DsSwitch

Props

NameTypeDefaultDescription
modelValuebooleanfalseOn/off state (use with v-model).
labelstringLabel text beside the switch.
disabledbooleanfalseDisables the switch.

Events

NamePayloadDescription
update:modelValuebooleanEmitted when toggle state changes.

Slots

NameDescription
defaultAlternative to label prop for custom label content.

Example

DsCheckbox(v-model="agree" label="I agree to the terms")
DsSwitch(v-model="notifications" label="Email notifications")

DateTime Picker

Configurable date and/or time selection for forms.

DsDateTimePicker

Props

NameTypeDefaultDescription
modelValuestring | nullnullBound value (use with v-model). Format depends on showDate/showTime: YYYY-MM-DD, HH:mm, or YYYY-MM-DDTHH:mm.
labelstringVisible field label.
hintstringHelper text shown below the field.
errorstringError message; sets invalid state when present.
placeholderstringPlaceholder text when no value is set.
disabledbooleanfalseDisables the picker.
idstringCustom element id; auto-generated if omitted.
showDatebooleantrueShow the calendar month grid in the panel.
showTimebooleantrueShow hour/minute (and optional seconds) controls in the panel.
minDatestringExclusive minimum date bound as YYYY-MM-DD. Days on or before this date are disabled.
maxDatestringExclusive maximum date bound as YYYY-MM-DD. Days on or after this date are disabled.
minuteStepnumber5Step interval for the minute selector.
showSecondsbooleanfalseInclude seconds in time value and selector (only when showTime is true).

Events

NamePayloadDescription
update:modelValuestring | nullEmitted when the date and/or time value changes.

Date & time

Select a date and time for your booking.

Date only

Time only

Example

// Date & time (default)
DsDateTimePicker(
  v-model="appointment"
  label="Appointment"
)

// Date only
DsDateTimePicker(
  v-model="bookingDate"
  label="Booking date"
  :show-time="false"
  min-date="2026-07-01"
  max-date="2026-12-31"
)

// Time only
DsDateTimePicker(
  v-model="reminderTime"
  label="Reminder time"
  :show-date="false"
)

Tag Input

Enter tags as chips for skills, industries, and categories.

DsTagInput

Props

NameTypeDefaultDescription
modelValuestring[][]Bound list of tags (use with v-model).
labelstringVisible field label.
hintstringHelper text shown below the field.
errorstringError message; sets invalid state when present.
placeholderstring'Type and press Enter'Input placeholder.
disabledbooleanfalseDisables the field.

Events

NamePayloadDescription
update:modelValuestring[]Emitted when tags change.
PR StrategyMessaging

Press Enter to add a tag.

Example

DsTagInput(
  v-model="tags"
  label="Skills"
  hint="Press Enter to add a tag."
)

Image Field

Image upload with a preview of the pending file.

DsImageField

Props

NameTypeDefaultDescription
modelValueFile | nullnullPending file selection, not yet uploaded (use with v-model).
srcstring''URL of the stored image, previewed until a file is picked.
labelstringVisible field label.
hintstringHelper text shown below the field.
errorstringError message; sets invalid state when present.
previewAltstring'Preview'Alt text / initials fallback name.
nounstring'photo'Names the subject in the button labels, e.g. 'Upload cover'.
acceptstringIMAGE_ACCEPTAccepted MIME types for the file picker.
disabledbooleanfalseDisables the field.

Events

NamePayloadDescription
update:modelValueFile | nullEmitted when a file is picked, or null when a pending pick is undone.
removeEmitted when Remove is pressed with no pending file, meaning the stored image should be dropped.
Photo
Profile photo

JPEG, PNG, WebP or GIF, up to 5 MB.

Example

DsImageField(
  v-model="photo"
  :src="photoUrl"
  label="Photo"
  hint="JPEG, PNG, WebP or GIF, up to 5 MB."
  preview-alt="Profile photo"
  @remove="photoUrl = ''"
)

Inline Edit

Edit-in-place field that inherits the surrounding typography, for editable public pages.

DsInlineEdit

Props

NameTypeDefaultDescription
modelValuestring''Bound text value (use with v-model).
multilinebooleanfalseRenders an auto-growing textarea instead of a single-line input.
typestring'text'Native input type; ignored when multiline.
placeholderstringPlaceholder shown when the value is empty.
ariaLabelstringAccessible name, since edit-in-place fields have no visible label.
variant'outline' | 'underline''outline'Dashed box or a lighter underline treatment.
errorstringSets the invalid state when present.
disabledbooleanfalseDisables the field.

Events

NamePayloadDescription
update:modelValuestringEmitted on every keystroke.

Example

h2
  DsInlineEdit(v-model="headline" aria-label="Headline")

DsInlineEdit(
  v-model="bio"
  multiline
  aria-label="Bio"
  placeholder="Say something about yourself"
)

Repeater

Add, remove, and reorder list items.

DsRepeater

Props

NameTypeDefaultDescription
modelValuerequiredunknown[]Bound list of items (use with v-model).
labelstringSection label.
itemLabelstring'Item'Prefix for each item heading.
addLabelstring'Add item'Add button label.
minItemsnumber0Minimum items; remove disabled below this count.
factory() => unknownFunction returning a new item when Add is clicked.
disabledbooleanfalseDisables add/remove/reorder.

Events

NamePayloadDescription
update:modelValueunknown[]Emitted when items are added, removed, or reordered.

Slots

NameDescription
defaultItem editor content. Props: item, index.
headerCustom header instead of label prop.

About paragraphs

Paragraph 1

Paragraph 2

Example

DsRepeater(
  v-model="paragraphs"
  label="About paragraphs"
  item-label="Paragraph"
  add-label="Add paragraph"
  :min-items="1"
  :factory="() => ''"
)
  template(#default="{ item, index }")
    DsTextarea(
      :model-value="String(item)"
      label="Paragraph"
      @update:model-value="paragraphs[index] = $event"
    )

Table

Tabular data display with optional client- or server-side pagination.

DsTable

Props

NameTypeDefaultDescription
columnsTableColumn[][]Column definitions with key and label.
rowsRecord<string, unknown>[][]Row data objects keyed by column key.
rowKeystringProperty name used as Vue :key for each row.
paginatedbooleanfalseShows pagination controls and pages through rows.
pageSizenumber10Number of rows shown per page.
pagenumber1Current 1-based page (use with v-model:page).
totalItemsnumberTotal item count for server-side pagination. When set, rows are treated as the current page and are not sliced client-side.
maxVisiblePagesnumber5Maximum page buttons shown in the pagination control.

Events

NamePayloadDescription
update:pagenumberEmitted when the user selects a different page.

Slots

NameDescription
defaultOptional custom tbody rows instead of rows prop.
actionsPer-row action buttons; adds an Actions column.
cell-<key>Custom cell content for a column key. Props: row, value.
  • For server-side pagination, bind rows from usePaginatedList and set total-items from the API PaginatedResponse.total.
  • API field mapping: items → rows, total → totalItems, page_size → pageSize. Query params: page, page_size.

Basic

NameRoleStatus
Alex KimAdminActive
Sam LeeEditorActive
Jordan ParkViewerInvited

With actions

NameRoleStatusActions
Alex KimAdminActive
Sam LeeEditorActive
Jordan ParkViewerInvited

Client-side pagination

NameRoleStatus
Alex KimAdminActive
Sam LeeEditorActive
Jordan ParkViewerInvited
Riley ChenEditorActive
Casey MorganAdminActive

Server-side pagination

Uses usePaginatedList with a mock PaginatedResponse fetcher. API fields map to DsTable as itemsrows, totaltotalItems, page_sizepageSize.

NameRoleStatus

Example

// Basic
DsTable(:columns="columns" :rows="rows" row-key="id")

// Client-side pagination
DsTable(
  v-model:page="page"
  :columns="columns"
  :rows="rows"
  row-key="id"
  paginated
  :page-size="5"
)

// Server-side pagination with usePaginatedList
const { page, pageSize, rows, totalItems } = usePaginatedList({
  pageSize: 10,
  fetcher: (query) => api.get('things', { query }),
})

DsTable(
  v-model:page="page"
  :columns="columns"
  :rows="rows"
  :total-items="totalItems"
  :page-size="pageSize"
  row-key="id"
  paginated
)

// PaginatedResponse → DsTable mapping:
// items → rows, total → totalItems, page_size → pageSize

Data Display

Calendar

Month view for displaying bookings and appointments.

DsCalendar

Props

NameTypeDefaultDescription
eventsCalendarEvent[][]Appointments or bookings to display. Each event needs id, start, end, and optional title and status.
modelValuestringVisible month as YYYY-MM (use with v-model). Defaults to the current month.

Events

NamePayloadDescription
update:modelValuestringEmitted when the user navigates to a different month.
day-clickstringEmitted with YYYY-MM-DD when a day cell is clicked.
event-clickCalendarEventEmitted when an event chip is clicked.

July 2026

Sun
Mon
Tue
Wed
Thu
Fri
Sat
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8

Example

DsCalendar(
  v-model="month"
  :events="events"
  @day-click="onDayClick"
  @event-click="onEventClick"
)

// CalendarEvent: { id, start, end, title?, status? }

Badge

Status and category labels.

DsBadge

Props

NameTypeDefaultDescription
variant'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info''default'Color tone for the badge.

Slots

NameDescription
defaultBadge label text.
DefaultPrimarySuccessWarningDangerInfo

Example

DsBadge Default
DsBadge(variant="success") Success
DsBadge(variant="danger") Danger

Card

Content container with header, body, and footer slots.

DsCard

Props

NameTypeDefaultDescription
titlestringCard header title when header slot is not used.

Slots

NameDescription
defaultMain card body content.
headerCustom header content; overrides title prop.
footerFooter area, typically for actions.

Account overview

Your plan renews on April 1, 2026.

Example

DsCard(title="Account overview")
  p Your plan renews on April 1, 2026.
  template(#footer)
    DsButton(size="sm") Manage plan

Avatar

User representation with image or initials.

DsAvatar

Props

NameTypeDefaultDescription
srcstringImage URL; shows initials when omitted.
altstring''Alt text for the image.
namestringFull name used to derive initials.
size'sm' | 'md' | 'lg''md'Avatar dimensions.
JD
JD
JD

Example

DsAvatar(name="Jane Doe" size="md")

Charts & metrics

Stat

Metric summary card for dashboards.

DsStat

Props

NameTypeDefaultDescription
labelrequiredstringMetric label.
valuerequiredstringPrimary metric value.
deltastringOptional change indicator.

Revenue

$4,250

+12% this month

Chart line

SVG line chart for time series.

DsChartLine

Props

NameTypeDefaultDescription
pointsrequiredChartPoint[]Series data with label and value.
titlestringAccessible chart title.
emptyLabelstringMessage when there is no data.

Chart bar

SVG bar chart for counts.

DsChartBar

Props

NameTypeDefaultDescription
itemsrequiredChartBarItem[]Bar series with label and value.
titlestringAccessible chart title.

Chart donut

SVG donut for status breakdowns.

DsChartDonut

Props

NameTypeDefaultDescription
segmentsrequiredChartDonutSegment[]Donut segments with label and value.
titlestringAccessible chart title.

Stepper

Multi-step flow header.

DsStepper

Props

NameTypeDefaultDescription
stepsrequiredStepperStep[]Ordered steps with id and label.
activeIndexrequirednumberZero-based active step index.
  1. 1Pick a time
  2. 2Confirm

Slot picker

Month grid with open booking slots.

DsSlotPicker

Props

NameTypeDefaultDescription
modelValuestring | nullSelected slot ISO datetime (v-model).
slotsByDayRecord<string, string[]>Open slots keyed by YYYY-MM-DD.

Events

NamePayloadDescription
update:modelValuestring | nullEmitted when a slot is selected.

August 2026

SunMonTueWedThuFriSat

Navigation

Tabs

Section navigation within a view.

DsTabs

Props

NameTypeDefaultDescription
modelValuerequiredstringActive tab id (use with v-model).
tabsrequiredTabItem[]Array of { id, label } tab definitions.

Events

NamePayloadDescription
update:modelValuestringEmitted when a different tab is selected.

Slots

NameDescription
<tab-id>Named slot per tab id for panel content.

Overview content for the selected workspace.

Example

DsTabs(v-model="activeTab" :tabs="tabs")
  template(#overview) Overview content
  template(#members) Team members

Pagination

Navigate paged data sets.

DsPagination

Props

NameTypeDefaultDescription
modelValuerequirednumberCurrent page number (use with v-model).
totalPagesrequirednumberTotal number of pages.
maxVisiblenumber5Maximum page buttons shown at once.

Events

NamePayloadDescription
update:modelValuenumberEmitted when the user selects a different page.

Example

DsPagination(v-model="page" :total-pages="8")

Feedback & Overlays

Alert

Contextual feedback messages.

DsAlert

Props

NameTypeDefaultDescription
variant'info' | 'success' | 'warning' | 'danger''info'Semantic color and icon for the alert.
titlestringOptional bold heading above the message.

Slots

NameDescription
defaultAlert message body.

Example

DsAlert(variant="info" title="Info")
  | Your trial ends in 7 days.
DsAlert(variant="success" title="Success")
  | Payment processed successfully.

Toast

Floating notifications for transient feedback.

DsToast

Props

NameTypeDefaultDescription
variant'info' | 'success' | 'warning' | 'danger''info'Semantic color and icon for the toast.
titlestringOptional bold heading above the message.
messagerequiredstringToast message body.
durationnumber5000Auto-dismiss delay in ms; 0 keeps the toast until dismissed.

Events

NamePayloadDescription
dismissEmitted when the toast is dismissed (close button or auto-dismiss).
  • Mount DsToastHost once in app.vue for global toasts.
  • Use the useToast() composable: show({ message, title?, variant?, duration? }), success(message, title?), error(message, title?).

Example

// Mount DsToastHost once in app.vue, then:
const toast = useToast()

toast.success('Payment processed successfully.')
toast.error('Failed to save changes.')
toast.show({ variant: 'info', title: 'Info', message: 'Your trial ends in 7 days.' })

Tooltip

Supplementary text on hover or focus.

DsTooltip

Props

NameTypeDefaultDescription
textrequiredstringTooltip content shown on hover or focus.

Slots

NameDescription
defaultTrigger element that activates the tooltip.

Example

DsTooltip(text="Export as CSV")
  DsButton(variant="secondary") Export

Spinner & Skeleton

Loading placeholders.

DsSpinner

Props

NameTypeDefaultDescription
size'sm' | 'md' | 'lg''md'Spinner dimensions.

DsSkeleton

Props

NameTypeDefaultDescription
variant'text' | 'rect' | 'circle''text'Shape of the placeholder.
widthstring'100%'CSS width value.
heightstringCSS height value; variant provides defaults for text.

Example

DsSpinner
DsSkeleton(variant="text" width="60%")
DsSkeleton(variant="rect" height="4rem")