Transport Controls
Media player transport bar — play/pause/skip/rewind buttons
Size
Material
<div class="transport-wrap">
<div class="transport">
<button class="transport-btn">⏮</button>
<button class="transport-btn">◀◀</button>
<button class="transport-btn play">▶</button>
<button class="transport-btn">▶▶</button>
<button class="transport-btn">⏭</button>
</div>
<span style="font-family:var(--font-ui);font-size:9px;font-weight:500;color:var(--text-muted);letter-spacing:1px">NOW PLAYING</span>
</div> .transport-wrap { display: flex; flex-direction: column; align-items: center; gap: 8px; }
.transport {
display: flex; align-items: center; gap: 6px;
background: var(--bg-raised); border: 1px solid var(--border-subtle);
border-radius: var(--radius-pill); padding: 4px;
box-shadow: 0 2px 0 var(--border-deep);
}
.transport-btn {
width: 32px; height: 32px; border-radius: 50%;
border: none; cursor: pointer; display: flex; align-items: center; justify-content: center;
background: linear-gradient(155deg, var(--bg-surface), var(--bg-panel));
box-shadow: 0 1px 2px rgba(0,0,0,0.2), inset 0 1px 0 var(--glossy-hi);
color: var(--text-primary); font-size: 12px;
transition: transform 0.07s var(--snap-fast);
}
.transport-btn:active { transform: scale(0.92); box-shadow: 0 1px 0 rgba(0,0,0,0.2); }
.transport-btn.play {
width: 36px; height: 36px;
background: linear-gradient(155deg, var(--blue-info), #335599);
color: #fff; font-size: 14px;
} API
| Class | Type | Description |
|---|---|---|
.transport | Base | Primary component class |
.default | Size | Extra large variant |
Design Notes
Physical Analog
Reference devices: iPod transport bar, Sony Walkman controls, MiniDisc player controls, CD player front panel. Mechanism: The tape/disc transport mechanism controls -- the most standardized icon set in consumer electronics. Skip backward, rewind, play, fast forward, skip forward. The play button is visually distinct (larger, blue background) because it is the primary transport action. On real devices, the play button often had a different color cap or a larger physical button.
Geometry
| Property | Value |
|---|---|
| Button size | 32x32px (standard), 36x36px (play) |
| Button gap | 6px |
| Container padding | 4px |
| Container border-radius | --radius-pill (100px) |
| Bottom shadow | 2px |
| Icon font size | 12px (standard), 14px (play) |
CSS Recipe
Wrapper (.transport-wrap)
.transport-wrap { display: flex; flex-direction: column; align-items: center; gap: 8px; }
Container (.transport)
.transport {
display: flex; align-items: center; gap: 6px;
background: var(--bg-raised); border: 1px solid var(--border-subtle);
border-radius: var(--radius-pill); padding: 4px;
box-shadow: 0 2px 0 var(--border-deep);
}
Standard button (.transport-btn)
.transport-btn {
width: 32px; height: 32px; border-radius: 50%;
border: none; cursor: pointer; display: flex; align-items: center; justify-content: center;
background: linear-gradient(155deg, var(--bg-surface), var(--bg-panel));
box-shadow: 0 1px 2px rgba(0,0,0,0.2), inset 0 1px 0 var(--glossy-hi);
color: var(--text-primary); font-size: 12px;
transition: transform 0.07s var(--snap-fast);
}
Button press
.transport-btn:active { transform: scale(0.92); box-shadow: 0 1px 0 rgba(0,0,0,0.2); }
Play button (.transport-btn.play)
.transport-btn.play {
width: 36px; height: 36px;
background: linear-gradient(155deg, var(--blue-info), #335599);
color: #fff; font-size: 14px;
}
HTML Structure
<div class="transport-wrap">
<div class="transport">
<button class="transport-btn">⏮</button>
<button class="transport-btn">◀◀</button>
<button class="transport-btn play">▶</button>
<button class="transport-btn">▶▶</button>
<button class="transport-btn">⏭</button>
</div>
<span style="font-family:var(--font-ui);font-size:9px;font-weight:500;color:var(--text-muted);letter-spacing:1px">NOW PLAYING</span>
</div>
Size Variants
No size variants defined.
Material Variants
- Standard buttons: glossy polycarbonate (surface-to-panel gradient with glossy highlight)
- Play button: blue polycarbonate (blue gradient)
Theme Behavior
- Container background swaps via
--bg-raised - Button gradients swap via surface/panel tokens
- Play button always uses blue gradient (constant)
- Shadow depths adapt via tokens
Constraints
- Play button MUST be visually distinct: larger (36px vs 32px), blue background, white icon
- All buttons MUST be circular (border-radius: 50%)
- Press interaction MUST use
scale(0.92)not translateY (round buttons scale, don't translate) - Container MUST use pill border-radius (capsule shape, like a Walkman transport bar)
- Standard button order: skip-back, rewind, play, fast-forward, skip-forward
- Icon set: ⏮ ◀◀ ▶ ▶▶ ⏭
- MUST use
--snap-fasteasing for press animation (mechanical feel)
Accessibility
- Each button should have
aria-labeldescribing the action ("Play", "Pause", "Skip forward", etc.) - Play/Pause should toggle between states with updated label
- Support keyboard operation (Space/Enter to activate)
- Consider grouping with
role="toolbar"andaria-label="Media controls"
♿
Accessibility
- Element
- Use semantic HTML with appropriate ARIA roles
- Keyboard
- Follow WAI-ARIA patterns for this control type
- Focus
-
Visible focus indicator required. Use native browser focus ring or custom
:focus-visiblestyles.