Foundation Themes Color palettes, font families, and type scales, each combinable with light or dark appearance.
useTheme() Props Name Type Default Description 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. fontThemeFont— Readonly 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 Name Payload Description 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 Name Description —Header dropdowns for appearance, palette, font, size, spacing, and line spacing; no props required.
Palettes
Default Balanced blue accent for general SaaS dashboards.
Ocean Cool teal tones inspired by coastal interfaces.
Forest Earthy greens suited to analytics and ops tools.
Sunset Warm amber palette for energetic product surfaces.
Violet Purple accent for creative and admin experiences.
Rose Rose and pink highlights for softer brand moments.
Fonts Dashboard overview
System Native OS fonts with no network request.
Dashboard overview
Inter Neutral grotesk tuned for UI and data density.
Dashboard overview
Lexend Highly legible sans designed to improve reading fluency.
Dashboard overview
DM Sans Geometric sans with a clean, modern rhythm.
Dashboard overview
Manrope Rounded sans suited to friendly product surfaces.
Dashboard overview
IBM Plex Technical sans for enterprise and ops tools.
Dashboard overview
Nunito Soft, approachable type for customer-facing apps.
Dashboard overview
Plus Jakarta Contemporary sans with subtle character.
Dashboard overview
Outfit Geometric sans with a crisp, product-led feel.
Dashboard overview
Work Sans Versatile grotesk suited to dashboards and forms.
Dashboard overview
Roboto Familiar Material-style sans for broad compatibility.
Dashboard overview
Fira Sans Humanist sans with excellent screen readability.
Dashboard overview
Space Grotesk Tech-inspired proportional sans with retro-future character.
Dashboard overview
Space Mono Monospaced display face with a sci-fi, terminal aesthetic.
Dashboard overview
JetBrains Mono Developer-focused monospace for code-heavy interfaces.
Font sizes Aa
Extra small Tightest scale for highly dense dashboards and tables.
Aa
Small Default compact scale for dense dashboards and data tables.
Aa
Medium Balanced scale for general SaaS UI.
Aa
Large Comfortable reading size for accessibility and long-form.
Aa
Extra large Largest scale for maximum readability and accessibility.
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 Form Widgets Textarea Multi-line text input.
DsTextarea Props Name Type Default Description modelValuestring''Bound textarea value (use with v-model). labelstring— Visible field label. hintstring— Helper text shown below the textarea. errorstring— Error message; sets invalid state when present. placeholderstring— Placeholder text. disabledbooleanfalseDisables the textarea. rowsnumber4Visible row count. idstring— Custom element id; auto-generated if omitted.
Events Name Payload Description 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 Name Type Default Description modelValuestring''Bound selected value (use with v-model). labelstring— Visible field label. hintstring— Helper text shown below the select. errorstring— Error message; sets invalid state when present. placeholderstring— Disabled placeholder option text. optionsrequired SelectOption[]— Array of { label, value } objects. disabledbooleanfalseDisables the select. idstring— Custom element id; auto-generated if omitted.
Events Name Payload Description update:modelValuestringEmitted when the selected value changes.
Slots Name Description valueRich trigger content. Slot props: { option: SelectOption | undefined }. Uses native <select> when omitted. optionRich list row content. Slot props: { option: SelectOption, selected: boolean }. Uses native <select> when omitted.
Plan Choose a plan Starter Pro Enterprise
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 Name Type Default Description modelValuebooleanfalseChecked state (use with v-model). labelstring— Label text beside the checkbox. disabledbooleanfalseDisables the checkbox.
Events Name Payload Description update:modelValuebooleanEmitted when checked state changes.
Slots Name Description defaultAlternative to label prop for custom label content.
DsSwitch Props Name Type Default Description modelValuebooleanfalseOn/off state (use with v-model). labelstring— Label text beside the switch. disabledbooleanfalseDisables the switch.
Events Name Payload Description update:modelValuebooleanEmitted when toggle state changes.
Slots Name Description 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 Name Type Default Description modelValuestring | nullnullBound value (use with v-model). Format depends on showDate/showTime: YYYY-MM-DD, HH:mm, or YYYY-MM-DDTHH:mm. labelstring— Visible field label. hintstring— Helper text shown below the field. errorstring— Error message; sets invalid state when present. placeholderstring— Placeholder text when no value is set. disabledbooleanfalseDisables the picker. idstring— Custom element id; auto-generated if omitted. showDatebooleantrueShow the calendar month grid in the panel. showTimebooleantrueShow hour/minute (and optional seconds) controls in the panel. minDatestring— Exclusive minimum date bound as YYYY-MM-DD. Days on or before this date are disabled. maxDatestring— Exclusive 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 Name Payload Description update:modelValuestring | nullEmitted when the date and/or time value changes.
Date & time Appointment 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"
)Image Field Image upload with a preview of the pending file.
DsImageField Props Name Type Default Description modelValueFile | nullnullPending file selection, not yet uploaded (use with v-model). srcstring''URL of the stored image, previewed until a file is picked. labelstring— Visible field label. hintstring— Helper text shown below the field. errorstring— Error 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 Name Payload Description update:modelValueFile | nullEmitted when a file is picked, or null when a pending pick is undone. remove—Emitted when Remove is pressed with no pending file, meaning the stored image should be dropped.
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 = ''"
)Repeater Add, remove, and reorder list items.
DsRepeater Props Name Type Default Description modelValuerequired unknown[]— Bound list of items (use with v-model). labelstring— Section label. itemLabelstring'Item'Prefix for each item heading. addLabelstring'Add item'Add button label. minItemsnumber0Minimum items; remove disabled below this count. factory() => unknown— Function returning a new item when Add is clicked. disabledbooleanfalseDisables add/remove/reorder.
Events Name Payload Description update:modelValueunknown[]Emitted when items are added, removed, or reordered.
Slots Name Description defaultItem editor content. Props: item, index. headerCustom header instead of label prop.
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 Name Type Default Description columnsTableColumn[][]Column definitions with key and label. rowsRecord<string, unknown>[][]Row data objects keyed by column key. rowKeystring— Property 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). totalItemsnumber— Total 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 Name Payload Description update:pagenumberEmitted when the user selects a different page.
Slots Name Description 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 Name Role Status Alex Kim Admin Active Sam Lee Editor Active Jordan Park Viewer Invited
With actions Name Role Status Actions Alex Kim Admin Active Edit Alex Kim Sam Lee Editor Active Edit Sam Lee Jordan Park Viewer Invited Edit Jordan Park
Client-side pagination Name Role Status Alex Kim Admin Active Sam Lee Editor Active Jordan Park Viewer Invited Riley Chen Editor Active Casey Morgan Admin Active
Server-side pagination Uses usePaginatedList with a mock PaginatedResponse fetcher. API fields map to DsTable as items→rows, total→totalItems, page_size→pageSize.
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 → pageSizeData Display Calendar Month view for displaying bookings and appointments.
DsCalendar Props Name Type Default Description eventsCalendarEvent[][]Appointments or bookings to display. Each event needs id, start, end, and optional title and status. modelValuestring— Visible month as YYYY-MM (use with v-model). Defaults to the current month.
Events Name Payload Description 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.
28
29
30
1
2
4
5
6
7
8
9
11
12
13
14
16
17
18
19
20
21
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
Go to Today
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 Name Type Default Description variant'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info''default'Color tone for the badge.
Slots Name Description defaultBadge label text.
Default Primary Success Warning Danger Info
Example DsBadge Default
DsBadge(variant="success") Success
DsBadge(variant="danger") DangerCard Content container with header, body, and footer slots.
DsCard Props Name Type Default Description titlestring— Card header title when header slot is not used.
Slots Name Description defaultMain card body content. headerCustom header content; overrides title prop. footerFooter area, typically for actions.
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 planAvatar User representation with image or initials.
DsAvatar Props Name Type Default Description srcstring— Image URL; shows initials when omitted. altstring''Alt text for the image. namestring— Full name used to derive initials. size'sm' | 'md' | 'lg''md'Avatar dimensions.
Example DsAvatar(name="Jane Doe" size="md")Charts & metrics Stat Metric summary card for dashboards.
DsStat Props Name Type Default Description labelrequired string— Metric label. valuerequired string— Primary metric value. deltastring— Optional change indicator.
Revenue
$4,250
+12% this month
Chart line SVG line chart for time series.
DsChartLine Props Name Type Default Description pointsrequired ChartPoint[]— Series data with label and value. titlestring— Accessible chart title. emptyLabelstring— Message when there is no data.
Chart bar SVG bar chart for counts.
DsChartBar Props Name Type Default Description itemsrequired ChartBarItem[]— Bar series with label and value. titlestring— Accessible chart title.
Chart donut SVG donut for status breakdowns.
DsChartDonut Props Name Type Default Description segmentsrequired ChartDonutSegment[]— Donut segments with label and value. titlestring— Accessible chart title.
Confirmed (12) Pending (4) Cancelled (2) Chart funnel Narrowing stages for conversion funnels.
DsChartFunnel Props Name Type Default Description stagesrequired ChartFunnelStage[]— Ordered stages, widest first, with label and value. titlestring— Accessible chart title. emptyLabelstring— Message shown when there are no stages.
−78.4% from views
21.6% of views
−88.4% from clicks
2.5% of views
Chart ranked Horizontal bars for named top-N breakdowns.
DsChartRanked Props Name Type Default Description itemsrequired ChartRankedItem[]— Rows with label, value, and optional tag and tone. titlestring— Accessible chart title. emptyLabelstring— Message shown when there are no items.
Google Human 238
LinkedIn Human 162
ChatGPT AI agent 82
Gemini AI agent 44
Stepper Multi-step flow header.
DsStepper Props Name Type Default Description stepsrequired StepperStep[]— Ordered steps with id and label. activeIndexrequired number— Zero-based active step index.
Slot picker Month grid with open booking slots.
DsSlotPicker Props Name Type Default Description modelValuestring | null— Selected slot ISO datetime (v-model). slotsByDayRecord<string, string[]>— Open slots keyed by YYYY-MM-DD.
Events Name Payload Description update:modelValuestring | nullEmitted when a slot is selected.
Sun Mon Tue Wed Thu Fri Sat
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 1 2 3 4 5 6 7 8 9 10 11 12
Navigation Breadcrumb Hierarchical navigation trail.
DsBreadcrumb Props Name Type Default Description itemsrequired BreadcrumbItem[]— Trail of { label, to? } crumbs; last item is current page.
Example DsBreadcrumb(:items="[
{ label: 'Home', to: '/' },
{ label: 'Dashboard', to: '/dashboard' },
{ label: 'Settings' },
]")Tabs Section navigation within a view.
DsTabs Props Name Type Default Description modelValuerequired string— Active tab id (use with v-model). tabsrequired TabItem[]— Array of { id, label } tab definitions.
Events Name Payload Description update:modelValuestringEmitted when a different tab is selected.
Slots Name Description <tab-id>Named slot per tab id for panel content.
Overview Members Billing
Overview content for the selected workspace.
Billing history and invoices.
Example DsTabs(v-model="activeTab" :tabs="tabs")
template(#overview) Overview content
template(#members) Team membersFeedback & Overlays Alert Contextual feedback messages.
DsAlert Props Name Type Default Description variant'info' | 'success' | 'warning' | 'danger''info'Semantic color and icon for the alert. titlestring— Optional bold heading above the message.
Slots Name Description defaultAlert message body.
Info
Your trial ends in 7 days.
Success
Payment processed successfully.
Warning
API rate limit approaching.
Error
Failed to save changes.
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 Name Type Default Description variant'info' | 'success' | 'warning' | 'danger''info'Semantic color and icon for the toast. titlestring— Optional bold heading above the message. messagerequired string— Toast message body. durationnumber5000Auto-dismiss delay in ms; 0 keeps the toast until dismissed.
Events Name Payload Description dismiss— Emitted 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.' })Modal Overlay dialog for focused tasks.
DsModal Props Name Type Default Description openrequired boolean— Controls visibility (use with v-model:open). titlestring— Dialog title when header slot is not used. size'default' | 'wide''default'Dialog width; wide expands to 40rem when the viewport allows.
Events Name Payload Description update:openbooleanEmitted when the modal should close (backdrop click or close button).
Slots Name Description defaultModal body content. headerCustom header; overrides title prop. footer-startOptional left-aligned footer actions, separated from the main footer cluster. footerRight-aligned footer actions, typically for primary and cancel buttons.
Open modal
Example DsButton(@click="open = true") Open modal
DsModal(v-model:open="open" title="Confirm action")
p Are you sure?
template(#footer-start)
DsButton(variant="danger" @click="open = false") Delete
template(#footer)
DsButton(variant="ghost" @click="open = false") CancelSpinner & Skeleton Loading placeholders.
DsSpinner Props Name Type Default Description size'sm' | 'md' | 'lg''md'Spinner dimensions.
DsSkeleton Props Name Type Default Description variant'text' | 'rect' | 'circle''text'Shape of the placeholder. widthstring'100%'CSS width value. heightstring— CSS height value; variant provides defaults for text.
Example DsSpinner
DsSkeleton(variant="text" width="60%")
DsSkeleton(variant="rect" height="4rem")