Skip to content

Action Tile

Large tappable choice card with an icon, title, and supporting description. Built for decision moments — onboarding flows, empty states, "pick one to continue" screens — where each option needs more explanation than a button label allows.

Action Tiles

Import

typescript
import { DsActionTile } from '@verkview/design-system'

Usage

vue
<template>
  <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
    <DsActionTile
      emoji="📁"
      title="Create a project"
      description="Group jobs by site or client"
      @click="openProjectModal"
    />
  </div>
</template>

Props

PropTypeDefaultDescription
titlestringrequiredTile heading
descriptionstringundefinedSupporting copy under the title
emojistringundefinedEmoji rendered as the icon (takes precedence over icon)
iconComponentundefinedLucide icon component rendered as the icon
loadingbooleanfalseReplaces the icon with a spinner (after a 100ms delay) and dims the tile
disabledbooleanfalseDisables interaction
ariaLabelstringautoDefaults to "{title} — {description}"

Events

EventPayloadDescription
clickMouseEventEmitted when the tile is activated

Loading State

The spinner only appears after 100ms, so instantaneous actions never flash it. While loading, the tile drops to 70% opacity and ignores pointer events — set loading on all sibling tiles at once to prevent double-taps during navigation.

Loading

Accessibility

  • Renders as a native <button> — Enter/Space activation and Tab focus for free.
  • aria-label combines title and description so screen readers announce the full meaning.
  • Focus ring uses focus-visible — visible for keyboard users, silent on tap.
  • min-h-[120px] with full-width layout comfortably exceeds the 44px touch-target minimum.
  • Hover/press transitions respect prefers-reduced-motion.

Used By

  • OnboardingModal.vue — the three welcome-modal choices shown on first login.