This is the human-facing component reference for DareDash. It is written for application developers using the library in Nuxt projects and focuses on real usage, supported props, meaningful attrs, and composition patterns without repeating the full internal reference style used for AI.
All examples assume the default dd prefix and use kebab-case tags.
Use this file in three ways:
- scan the category sections when choosing the right component
- read the component tables when checking props, emits, and slots
- cross-reference Layout Primitives when the question is structural rather than interactive
For deeper theming and token behavior, continue to Features, Tokens, and Theming.
Use dd-button for actions, links, and compact call-to-action patterns.
<template>
<dd-cluster>
<dd-button primary icon="heroicons:plus">New</dd-button>
<dd-button outline href="/docs">Docs</dd-button>
</dd-cluster>
</template>| Prop | Type | Description |
|---|---|---|
color |
string |
Direct custom color override. |
textColor |
string |
Direct custom foreground override for this instance. |
icon |
string |
Left-side icon name. |
to |
string | object |
Renders the button as a Nuxt link. |
href |
string |
Renders the button as an href-driven link. |
- semantic attrs such as
primary,success,warning,danger,info - visual attrs such as
ghost,outline,full,icon-right,icon-only - size attrs such as
tiny,small,large,xlarge
Use semantic attrs for status and intent first. Reserve color for arbitrary one-off overrides.
When color is used on its own, the button still follows the themed foreground token, which can default to contrast-color({button.base-color}). Add textColor only when a specific instance needs an explicit foreground instead of the theme decision.
Use dd-card to group related content with optional header and footer regions.
<template>
<dd-card>
<template #header>Account</template>
<p>Detailed content goes here.</p>
<template #footer>
<dd-button primary>Save</dd-button>
</template>
</dd-card>
</template>headerdefaultfooter
flatnoborder
Use dd-badge for short status labels, counts, or metadata.
<template>
<dd-cluster>
<dd-badge>New</dd-badge>
<dd-badge success>Done</dd-badge>
<dd-badge danger icon="heroicons:x-mark">Failed</dd-badge>
</dd-cluster>
</template>| Prop | Type | Description |
|---|---|---|
icon |
string |
Optional icon. |
color |
string |
Direct custom color override. |
- semantic attrs such as
primary,success,warning,danger,info
Displays profile images or initials.
<template>
<dd-avatar-group :limit="3">
<dd-avatar src="https://example.com/photo1.jpg" alt="Maria Souza" />
<dd-avatar alt="Joao Dias" />
<dd-avatar alt="Ana Lima" random />
<dd-avatar alt="Extra User" />
</dd-avatar-group>
</template>| Prop | Type | Description |
|---|---|---|
src |
string |
Avatar image URL. |
alt |
string |
Accessible label and initials source. |
squarecircleonlineofflinebusyawayrandom- size attrs such as
xxs,small,medium,large
| Prop | Type | Default | Description |
|---|---|---|---|
limit |
number |
5 |
Maximum number of rendered avatar children. |
Use dd-alert for inline contextual messages.
<template>
<dd-alert title="Attention" warning closable>
Your session will expire in 5 minutes.
</dd-alert>
</template>| Prop | Type | Default | Description |
|---|---|---|---|
modelValue |
boolean |
true |
Controls visibility. |
color |
string |
undefined |
Direct custom alert color. |
title |
string |
undefined |
Alert title. |
closable |
boolean |
true |
Enables close button. |
icon |
boolean | string |
false |
Shows a default or custom icon. |
update:modelValueclose
titledefault
Linear progress bar with optional label and tooltip slot.
<template>
<dd-progress :value="50" :max="100" label="Upload" />
</template>| Prop | Type | Default |
|---|---|---|
value |
number |
undefined |
min |
number |
0 |
max |
number |
100 |
color |
string |
undefined |
ranges |
ProgressRange[] |
undefined |
label |
string |
undefined |
indeterminate |
boolean |
false |
labeltooltipwith{ percentage }
Loading indicator for explicit waiting states.
<template>
<dd-loading label="Loading data" />
</template>| Prop | Type | Default |
|---|---|---|
label |
string |
'Loading...' |
icon |
string |
'svg-spinners:gooey-balls-2' |
default
Breadcrumb navigation trail for contextual hierarchy.
<template>
<dd-breadcrumb
:config="{
routes: [
{ label: 'Home', to: '/' },
{ label: 'Docs', to: '/docs' },
{ label: 'Components' }
]
}"
/>
</template>| Prop | Type | Description |
|---|---|---|
config |
BreadcrumbConfig |
Contains routes and optional separator. |
separator is an optional icon name override for the separator glyph. If omitted, DareDash uses appConfig.daredash.icons.breadcrumbSeparator, which falls back to the same icon used by menuExpand.
These components are best when you want direct control over state without vee-validate wrappers.
Styled text input for short values.
<template>
<dd-input
v-model="email"
name="email"
type="email"
label="Email"
icon="heroicons:envelope"
/>
</template>namelabeltypeidplaceholdericonicon-rightmodel-valueis-invaliderror-message
errorwarningsuccesssmalllarge- standard native attrs such as
requiredanddisabled
Multiline field for longer text.
<template>
<dd-textarea
v-model="bio"
name="bio"
label="Bio"
:rows="4"
:max-length="280"
/>
</template>namelabelidplaceholdermodel-valuemax-lengthrowsis-invaliderror-messageuse-validation
errorwarningsuccess
Styled native select for a single choice from a closed list.
<template>
<dd-select
v-model="status"
label="Status"
:options="statusOptions"
/>
</template>namelabelidoptionsplaceholdermodel-valueis-invaliderror-message
errorwarningsuccesssmalllarge
Use these for boolean or mutually exclusive choices.
<template>
<dd-stack compact>
<dd-checkbox v-model="accepted">I accept the terms</dd-checkbox>
<dd-radio v-model="plan" name="plan" value="pro">Pro</dd-radio>
<dd-toggle v-model="enabled" label="Enable notifications" />
</dd-stack>
</template>Common supported behavior across these controls includes:
- labels or default slot content
disabledhandlingerrorandwarning-style messaging where relevant- standard
v-model-driven usage
- props:
name,value,id,label,warning,disabled,model-value,is-invalid,error-message - emits:
update:modelValue - supports default slot content instead of
label
- props:
name,value,id,label,warning,disabled,model-value,is-invalid,error-message - emits:
update:modelValue valueis required
- props:
name,value,id,label,disabled,loading,model-value - emits:
update:modelValue - slots:
default,checked,unchecked - supports semantic and size attrs where implemented by the toggle CSS
Search input with an embedded button.
<template>
<dd-input-search v-model="query" @search="runSearch" />
</template>nameidplaceholdermodel-valuebutton-labelbutton-iconloading
update:modelValuesearch
Semantic button intent is driven by attrs on the component, not by a generic variant prop.
Use dd-input-group when multiple fields or controls should read as a single grouped input surface.
<template>
<dd-input-group label="Website" pre="https://" post=".com">
<dd-input />
</dd-input-group>
</template>labelidpreposterror-messagewarning-message
defaultprepost
errorwarningsuccess
Use dd-form-label when you need a standalone label primitive outside the integrated field components.
It renders a native <label> and is most useful in custom form compositions where dd-input or dd-select labels are not enough on their own.
Use the Form* surface when the page already relies on vee-validate and you want DareDash to stay aligned with that validation flow.
Main wrappers:
dd-form-inputdd-form-textareadd-form-selectdd-form-checkboxdd-form-radiodd-form-toggle
These wrappers are intentionally thin. Their role is to connect the corresponding primitive to vee-validate, not to invent a second visual system.
Use accordions for reveal/hide patterns that stay in the same scroll flow.
<template>
<dd-accordion-group>
<dd-accordion title="Details">
Content
</dd-accordion>
</dd-accordion-group>
</template>dd-accordion props:
titleiconaccent-colorname
dd-accordion-group props:
multipleaccent-color
Use dd-modal for focused, blocking tasks.
<template>
<dd-modal :open="open" title="Confirm" @update:open="open = $event">
<p>Are you sure?</p>
<template #footer>
<dd-cluster end>
<dd-button ghost @click="open = false">Cancel</dd-button>
<dd-button danger>Delete</dd-button>
</dd-cluster>
</template>
</dd-modal>
</template>opentitleclose-on-backdrop
closeupdate:open
defaultfooter
There is no header slot on dd-modal.
Use dd-drawer for side details, filters, and secondary flows.
<template>
<dd-drawer :open="open" position="left">
<template #header>Filters</template>
<p>Drawer content.</p>
</dd-drawer>
</template>opentitleclose-on-backdropposition
closeupdate:open
headerdefaultfooter
Use tabs when the page needs peer views in the same context.
<template>
<dd-tabs v-model="tab">
<dd-tab-list>
<dd-tab value="account">Account</dd-tab>
<dd-tab value="security">Security</dd-tab>
</dd-tab-list>
<dd-tab-panels>
<dd-tab-panel value="account">Account content</dd-tab-panel>
<dd-tab-panel value="security">Security content</dd-tab-panel>
</dd-tab-panels>
</dd-tabs>
</template>Important pieces:
dd-tabs- props:
model-value,vertical,manual-activation,indicator - emits:
update:modelValue,close
- props:
dd-tab-list- slots:
default,prefix,suffix
- slots:
dd-tab- props:
value,disabled,loading,closable,icon,to,href
- props:
dd-tab-panel- prop:
value
- prop:
Use dd-table for straightforward tabular data with built-in loading, empty, and error states.
<template>
<dd-table :columns="columns" :data="rows">
<template #cell-status="{ row }">
<dd-badge :success="row.status === 'active'" :warning="row.status !== 'active'">
{{ row.status }}
</dd-badge>
</template>
</dd-table>
</template>columnsdatarow-keyloadingis-invaliderror-message
emptyheader-${column.key}cell-${column.key}
stripedstriped-odd
Use dd-pagination for paginated lists and tables.
<template>
<dd-pagination v-model="page" :total="120" :page-size="10" />
</template>disabledtotalmodel-valuepage-sizesibling-count
update:modelValue
smallcompactsimple
Use dd-popover for compact contextual content.
<template>
<dd-popover trigger="click">
<dd-button>More</dd-button>
<template #content>
Actions
</template>
</dd-popover>
</template>titletriggerplacementoffseton-close
defaultheadercontent
Use dd-menu for hierarchical, persistent navigation.
<template>
<dd-menu :items="menuItems" collapsible />
</template>itemsorientationcollapsiblecollapsedtoggle-buttonactive-keymax-heightmax-width
update:collapsedselect
Nested indentation is controlled through theming, not through a prop-level API.
Use dd-anchor for long-document section navigation.
<template>
<dd-anchor
:items="[
{ key: 'intro', href: '#intro', title: 'Introduction' },
{ key: 'api', href: '#api', title: 'API' }
]"
/>
</template>itemshorizontaloffsetaffixcontainer
clickchange
Use one global dd-toaster in the application tree and call useToaster() where transient feedback is needed.
<template>
<dd-toaster />
</template>
<script setup lang="ts">
const { showToast } = useToaster()
function save() {
showToast('Record saved.', { type: 'success', title: 'Success' })
}
</script>type: 'info'position: 'top-right'duration: 5000