Skip to content

FAB

Floating Action Button — a prominent circular button for the primary action on a screen.

As seen in the Verkview app, the bottom-right corner uses two stacked FABs: a large blue + for creating tasks, and a smaller gray mic for voice notes.

Production Pair

Import

typescript
import { DsFab } from '@verkview/design-system'
import { Plus, Mic } from 'lucide-vue-next'

Usage

vue
<script setup>
import { Plus, Mic } from 'lucide-vue-next'
</script>

<template>
  <div class="fixed bottom-6 right-6 flex flex-col items-center gap-3">
    <DsFab :icon="Mic" variant="surface" size="sm" aria-label="Add voice note" @click="startVoice" />
    <DsFab :icon="Plus" variant="primary" size="lg" aria-label="Add task" @click="openCreate" />
  </div>
</template>

Props

PropTypeDefaultDescription
variant'primary' | 'surface''primary'Visual style (blue vs zinc)
size'sm' | 'md' | 'lg''md'Button diameter
iconComponentundefinedLucide icon component
ariaLabelstringundefinedAccessible label — always required for icon-only buttons
disabledbooleanfalseDisabled state

Events

EventPayloadDescription
clickMouseEventEmitted on click

Color Variants

Primary — Info Blue #3B82F6

The main action trigger. Always blue, always the most visually prominent element on the screen.

vue
<DsFab :icon="Plus" variant="primary" size="lg" aria-label="Add task" />

Surface — Zinc #f4f4f5

Secondary action trigger. Uses zinc-100 (#f4f4f5) so it floats above the page without competing with the primary FAB.

vue
<DsFab :icon="Mic" variant="surface" size="sm" aria-label="Add voice note" />

Icon Variants

Plus — Add Task

Plus / Add Task

vue
<script setup>
import { Plus } from 'lucide-vue-next'
</script>
<DsFab :icon="Plus" variant="primary" size="lg" aria-label="Add task" />

Mic — Voice Note

Mic / Voice Note

vue
<script setup>
import { Mic } from 'lucide-vue-next'
</script>
<DsFab :icon="Mic" variant="surface" size="sm" aria-label="Add voice note" />

Sizes

All Sizes

sm
md
lg
SizeDiameterIconUse case
sm44px16pxSecondary action (e.g. Mic FAB above primary)
md56px20pxStandard single FAB
lg64px24pxPrimary action when paired with a secondary FAB

Placement

FABs stack vertically — secondary on top, primary on bottom:

vue
<template>
  <div class="fixed bottom-6 right-6 z-20 flex flex-col items-center gap-3">
    <DsFab :icon="Mic"  variant="surface" size="sm" aria-label="Add voice note" @click="startVoice" />
    <DsFab :icon="Plus" variant="primary" size="lg" aria-label="Add task"       @click="openCreate" />
  </div>
</template>

Accessibility

  • Always provide aria-label — FABs contain only an icon with no visible text.
  • Both play/pause and keyboard activation (Enter/Space) are supported.
  • Limit to one primary FAB per screen. Secondary FABs should be visually smaller.