Prisma
Live Preview
Mobile Quick Actions Grid

--- description: Quick Actions — grid of circular icon buttons with labels. Mobile-only pattern for home screen shortcuts.

Quick Actions Component

Grid of icon shortcut buttons — pattern mobile chính (Grab, MoMo, banking apps). Dùng trên home screen để truy cập nhanh các tính năng.

1. Khi nào dùng

Tình huống Component
Home screen shortcuts Quick Actions ✅
Transfer/pay/scan actions Quick Actions ✅
Navigation menu Bottom Nav / Sidebar
Single action button Button

2. Platform: 📱 App only

3. Token Mapping

📦 Atomic Mapping: See ATOMIC-MAPPING.md for complete token spec.

📦 UI Layer: Card (in-flow), Density Tier: comp

Property Token
Grid gap var(--group-inline-gap-default)
Grid columns repeat(4, 1fr)
Item text-align center
Icon container size 48×48px
Icon container bg var(--primary-muted)
Icon container radius var(--comp-radius-capsule)
Icon size var(--icon-lg)
Icon color var(--primary-muted-foreground)
Label font var(--text-style-caption-font-size)
Label color var(--muted-foreground)
Label margin-top var(--comp-stack-gap-small)
Hover var(--state-layer-hover) on icon container
Focus ring 2px solid var(--ring)
Touch target Min 48×48 icon + label area

4. Variants

Variant Mô tả
default Primary muted circle icons
colorful Each icon has its own semantic color
outlined Border instead of fill

5. CSS Skeleton

css
.card-speed-dial {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--group-inline-gap-default);
    padding: var(--comp-padding-default) 0;
}

.card-quick-action {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--comp-stack-gap-small);
    cursor: pointer;
    background: none;
    border: none;
    font-family: inherit;
    color: inherit;
}

.card-quick-action__icon {
    width: 48px;
    height: 48px;
    border-radius: var(--comp-radius-capsule);
    background: var(--primary-muted);
    color: var(--primary-muted-foreground);
    display: flex;
    align-items: center;
    justify-content: center;
    transition: background var(--motion-preset-hover);
}

.card-quick-action__icon svg {
    width: var(--icon-lg);
    height: var(--icon-lg);
}

.card-quick-action:hover .card-quick-action__icon {
    background: var(--state-layer-hover);
}

.card-quick-action:focus-visible {
    outline: 2px solid var(--ring);
    outline-offset: 2px;
    border-radius: var(--comp-radius);
}

.card-quick-action__label {
    font-size: var(--text-style-caption-font-size);
    color: var(--muted-foreground);
}

/* Color variants */
.card-quick-action__icon--success { background: var(--success-muted); color: var(--success-muted-foreground); }
.card-quick-action__icon--warning { background: var(--warning-muted); color: var(--warning-muted-foreground); }
.card-quick-action__icon--info { background: var(--info-muted); color: var(--info-muted-foreground); }
.card-quick-action__icon--destructive { background: var(--destructive-muted); color: var(--destructive-muted-foreground); }

/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
    .card-quick-action__icon { transition: none; }
}

6. HTML Example

html
<div class="card-speed-dial">
    <button class="card-quick-action">
        <div class="card-quick-action__icon">
            <svg><!-- send icon --></svg>
        </div>
        <span class="card-quick-action__label">Transfer</span>
    </button>
    <button class="card-quick-action">
        <div class="card-quick-action__icon card-quick-action__icon--success">
            <svg><!-- wallet icon --></svg>
        </div>
        <span class="card-quick-action__label">Top Up</span>
    </button>
    <!-- ... more actions -->
</div>