Select / Dropdown
Mechanical selector switch — trigger button with dropdown list
Size
Material
JPEG Fine
▼
JPEG Fine
JPEG Normal
RAW
RAW + JPEG
<div class="select-wrap" id="selectDemo">
<div class="select-trigger" onclick="document.getElementById('selectDemo').classList.toggle('open')">
<span>JPEG Fine</span>
<span class="select-arrow">▼</span>
</div>
<div class="select-dropdown">
<div class="select-option selected">JPEG Fine</div>
<div class="select-option">JPEG Normal</div>
<div class="select-option">RAW</div>
<div class="select-option">RAW + JPEG</div>
</div>
</div> .select-wrap { position: relative; width: 180px; }
.select-trigger {
width: 100%; height: 36px; padding: 0 12px; display: flex;
align-items: center; justify-content: space-between;
background: var(--bg-surface); border: 1px solid var(--border-mid);
border-radius: var(--radius-md); cursor: pointer;
font-family: var(--font-ui); font-size: 11px; font-weight: 500;
color: var(--text-primary); letter-spacing: 0.5px;
box-shadow: 0 2px 0 var(--border-deep), inset 0 1px 0 var(--glossy-hi);
transition: border-color 0.15s;
}
.select-trigger:hover { border-color: var(--border-hi); }
.select-arrow { font-size: 8px; color: var(--text-muted); transition: transform 0.2s; }
.select-dropdown {
position: absolute; top: 100%; left: 0; right: 0; margin-top: 4px;
background: var(--bg-raised); border: 1px solid var(--border-mid);
border-radius: var(--radius-md); overflow: hidden;
box-shadow: 0 4px 16px rgba(0,0,0,0.3); z-index: 10;
display: none;
}
.select-wrap.open .select-dropdown { display: block; }
.select-wrap.open .select-arrow { transform: rotate(180deg); }
.select-option {
padding: 8px 12px; cursor: pointer;
font-family: var(--font-ui); font-size: 11px; font-weight: 500;
color: var(--text-secondary); transition: background 0.1s;
}
.select-option:hover { background: var(--glow-color); color: var(--text-primary); }
.select-option.selected { color: var(--amber); background: rgba(245,166,35,0.06); } API
| Class | Type | Description |
|---|---|---|
.select-wrap | Base | Primary component class |
.default | Size | Extra large variant |
Design Notes
Physical Analog
Reference devices: Camera menu item selectors, audio equipment preset browsers. Mechanism: A mechanical selector switch adapted to digital form. In hardware, this was a rotary switch with labeled positions or a push-button that cycled through options. The UI version shows the currently selected value in a raised trigger element (resembling a button), and reveals all options in a dropdown panel (resembling the iPod menu list G2) when activated. The arrow indicator rotates 180 degrees on open, mimicking the flip direction of a mechanical indicator flag.
Geometry
| Property | Value |
|---|---|
| Width | 180px |
| Trigger height | 36px |
| Trigger padding | 0 12px |
| Dropdown margin-top | 4px |
| Font size | 11px |
| Option padding | 8px 12px |
| Arrow font size | 8px |
CSS Recipe
Wrapper (.select-wrap)
.select-wrap { position: relative; width: 180px; }
Trigger (.select-trigger)
.select-trigger {
width: 100%; height: 36px; padding: 0 12px; display: flex;
align-items: center; justify-content: space-between;
background: var(--bg-surface); border: 1px solid var(--border-mid);
border-radius: var(--radius-md); cursor: pointer;
font-family: var(--font-ui); font-size: 11px; font-weight: 500;
color: var(--text-primary); letter-spacing: 0.5px;
box-shadow: 0 2px 0 var(--border-deep), inset 0 1px 0 var(--glossy-hi);
transition: border-color 0.15s;
}
Trigger hover
.select-trigger:hover { border-color: var(--border-hi); }
Arrow (.select-arrow)
.select-arrow { font-size: 8px; color: var(--text-muted); transition: transform 0.2s; }
Dropdown (.select-dropdown)
.select-dropdown {
position: absolute; top: 100%; left: 0; right: 0; margin-top: 4px;
background: var(--bg-raised); border: 1px solid var(--border-mid);
border-radius: var(--radius-md); overflow: hidden;
box-shadow: 0 4px 16px rgba(0,0,0,0.3); z-index: 10;
display: none;
}
Open state
.select-wrap.open .select-dropdown { display: block; }
.select-wrap.open .select-arrow { transform: rotate(180deg); }
Option (.select-option)
.select-option {
padding: 8px 12px; cursor: pointer;
font-family: var(--font-ui); font-size: 11px; font-weight: 500;
color: var(--text-secondary); transition: background 0.1s;
}
Option hover
.select-option:hover { background: var(--glow-color); color: var(--text-primary); }
Option selected
.select-option.selected { color: var(--amber); background: rgba(245,166,35,0.06); }
HTML Structure
<div class="select-wrap" id="selectDemo">
<div class="select-trigger" onclick="document.getElementById('selectDemo').classList.toggle('open')">
<span>JPEG Fine</span>
<span class="select-arrow">▼</span>
</div>
<div class="select-dropdown">
<div class="select-option selected">JPEG Fine</div>
<div class="select-option">JPEG Normal</div>
<div class="select-option">RAW</div>
<div class="select-option">RAW + JPEG</div>
</div>
</div>
Size Variants
No size variants defined.
Material Variants
- Trigger uses raised surface (Tier 2 depth: 2px bottom shadow + glossy highlight)
- Dropdown uses elevated surface (
--bg-raised+ floating shadow)
Theme Behavior
- Trigger background swaps via
--bg-surface - Dropdown background swaps via
--bg-raised - Selected option uses amber with amber-tinted background
- Shadow depth reduces in light mode
Constraints
- Trigger MUST look like a button (raised shadow, glossy highlight)
- Arrow MUST rotate 180 degrees when dropdown opens
- Dropdown MUST appear below trigger with 4px gap
- Dropdown MUST use z-index: 10 to overlay other content
- Selected option MUST be amber with subtle amber background
- MUST toggle via
.openclass on.select-wrap - Only ONE option can be
.selectedat a time
Accessibility
- Trigger should have
role="combobox"orrole="button"witharia-haspopup="listbox" - Trigger should have
aria-expanded="true/false" - Dropdown should have
role="listbox" - Options should have
role="option"witharia-selected - Support Up/Down arrow keys, Enter to select, Escape to close
- Home/End keys should jump to first/last option
♿
Accessibility
- Element
- Use appropriate <input> or <select> element
- Keyboard
- Follow WAI-ARIA patterns for this control type
- Focus
-
Visible focus indicator required. Use native browser focus ring or custom
:focus-visiblestyles.