@pudge-ui/mcp-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -0
- package/dist/__tests__/catalog.test.d.ts +1 -0
- package/dist/__tests__/catalog.test.js +50 -0
- package/dist/__tests__/search.test.d.ts +1 -0
- package/dist/__tests__/search.test.js +44 -0
- package/dist/__tests__/validation.test.d.ts +1 -0
- package/dist/__tests__/validation.test.js +34 -0
- package/dist/assembler.d.ts +6 -0
- package/dist/assembler.js +95 -0
- package/dist/catalog.d.ts +22 -0
- package/dist/catalog.js +10 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +33 -0
- package/dist/search.d.ts +5 -0
- package/dist/search.js +21 -0
- package/dist/tools.d.ts +105 -0
- package/dist/tools.js +129 -0
- package/package.json +55 -0
- package/spec/components/_index.yaml +822 -0
- package/spec/components/buttons/clear-button.md +89 -0
- package/spec/components/buttons/fn-grid.md +104 -0
- package/spec/components/buttons/gel-button.md +125 -0
- package/spec/components/buttons/icon-button.md +108 -0
- package/spec/components/buttons/keypad-button.md +123 -0
- package/spec/components/buttons/push-button.md +139 -0
- package/spec/components/buttons/rec-button.md +105 -0
- package/spec/components/buttons/rubber-button.md +100 -0
- package/spec/components/buttons/segmented-control.md +95 -0
- package/spec/components/data/assembled-panel.md +135 -0
- package/spec/components/data/data-table.md +116 -0
- package/spec/components/data/film-strip.md +110 -0
- package/spec/components/data/media-grid.md +98 -0
- package/spec/components/dials/click-wheel.md +115 -0
- package/spec/components/dials/cylindrical-horizontal.md +130 -0
- package/spec/components/dials/cylindrical-scroll.md +141 -0
- package/spec/components/dials/cylindrical-vertical.md +100 -0
- package/spec/components/dials/mode-dial.md +123 -0
- package/spec/components/dials/radial-knob.md +150 -0
- package/spec/components/dials/rotary-encoder.md +118 -0
- package/spec/components/forms/color-picker.md +99 -0
- package/spec/components/forms/file-input.md +105 -0
- package/spec/components/forms/search-bar.md +96 -0
- package/spec/components/forms/select.md +143 -0
- package/spec/components/forms/text-input.md +114 -0
- package/spec/components/forms/textarea.md +85 -0
- package/spec/components/indicators/accordion.md +137 -0
- package/spec/components/indicators/badges.md +87 -0
- package/spec/components/indicators/chips.md +93 -0
- package/spec/components/indicators/led-dots.md +103 -0
- package/spec/components/indicators/mode-badge.md +97 -0
- package/spec/components/indicators/profile-badge.md +99 -0
- package/spec/components/indicators/skeleton.md +94 -0
- package/spec/components/indicators/spinners.md +95 -0
- package/spec/components/indicators/status-chips.md +85 -0
- package/spec/components/indicators/transport-controls.md +114 -0
- package/spec/components/meters/battery-icon.md +104 -0
- package/spec/components/meters/eq-bars.md +93 -0
- package/spec/components/meters/ev-meter.md +96 -0
- package/spec/components/meters/exposure-scale.md +110 -0
- package/spec/components/meters/gauge-full.md +102 -0
- package/spec/components/meters/gauge-semi.md +113 -0
- package/spec/components/meters/histogram.md +70 -0
- package/spec/components/meters/level-indicator.md +95 -0
- package/spec/components/meters/oscilloscope.md +83 -0
- package/spec/components/meters/progress-bar.md +84 -0
- package/spec/components/meters/signal-bars.md +80 -0
- package/spec/components/meters/signal-meter.md +84 -0
- package/spec/components/meters/vu-meter.md +88 -0
- package/spec/components/meters/waveform.md +70 -0
- package/spec/components/navigation/breadcrumbs.md +94 -0
- package/spec/components/navigation/context-menu.md +94 -0
- package/spec/components/navigation/d-pad.md +121 -0
- package/spec/components/navigation/drawer.md +103 -0
- package/spec/components/navigation/menu-grid.md +113 -0
- package/spec/components/navigation/menu-list.md +134 -0
- package/spec/components/navigation/pagination.md +100 -0
- package/spec/components/navigation/rack-panel.md +124 -0
- package/spec/components/navigation/scrollbar.md +97 -0
- package/spec/components/navigation/status-bar.md +117 -0
- package/spec/components/navigation/tab-bar.md +104 -0
- package/spec/components/overlays/chassis-panel.md +94 -0
- package/spec/components/overlays/device-bezel.md +83 -0
- package/spec/components/overlays/dialog.md +100 -0
- package/spec/components/overlays/focus-brackets.md +124 -0
- package/spec/components/overlays/grid-overlay.md +93 -0
- package/spec/components/overlays/modal.md +89 -0
- package/spec/components/overlays/panel.md +114 -0
- package/spec/components/overlays/plastic-card.md +92 -0
- package/spec/components/overlays/popover.md +75 -0
- package/spec/components/overlays/toast.md +93 -0
- package/spec/components/overlays/tooltip.md +85 -0
- package/spec/components/readouts/camera-readout.md +123 -0
- package/spec/components/readouts/dot-matrix.md +88 -0
- package/spec/components/readouts/lcd-readout.md +116 -0
- package/spec/components/readouts/resource-monitor.md +98 -0
- package/spec/components/readouts/seven-segment.md +110 -0
- package/spec/components/readouts/signal-display.md +93 -0
- package/spec/components/readouts/timecode-display.md +94 -0
- package/spec/components/sliders/crossfader.md +102 -0
- package/spec/components/sliders/dual-range.md +97 -0
- package/spec/components/sliders/range-fader.md +100 -0
- package/spec/components/sliders/scrubber.md +104 -0
- package/spec/components/sliders/stepper.md +106 -0
- package/spec/components/sliders/vertical-fader.md +116 -0
- package/spec/components/sliders/volume-slider.md +107 -0
- package/spec/components/toggles/dip-switch.md +100 -0
- package/spec/components/toggles/led-checkbox.md +108 -0
- package/spec/components/toggles/power-toggle.md +93 -0
- package/spec/components/toggles/radio-button.md +106 -0
- package/spec/components/toggles/rocker-switch.md +92 -0
- package/spec/components/toggles/slide-switch.md +121 -0
- package/spec/components/toggles/toggle-switch.md +135 -0
- package/spec/compositions/audio-mixer-strip.md +62 -0
- package/spec/compositions/camera-viewfinder.md +66 -0
- package/spec/compositions/phone-interface.md +66 -0
- package/spec/foundation/accessibility.md +33 -0
- package/spec/foundation/canvas.md +20 -0
- package/spec/foundation/depth-model.md +82 -0
- package/spec/foundation/layout.md +33 -0
- package/spec/foundation/materials.md +68 -0
- package/spec/foundation/naming.md +33 -0
- package/spec/foundation/philosophy.md +27 -0
- package/spec/foundation/theme.md +39 -0
- package/spec/foundation/tokens.md +148 -0
- package/spec/guides/extension.md +189 -0
- package/spec/guides/for-llms.md +129 -0
- package/spec/guides/prompt-templates.md +143 -0
- package/spec/spec/components/_index.yaml +822 -0
- package/spec/spec/components/buttons/clear-button.md +89 -0
- package/spec/spec/components/buttons/fn-grid.md +104 -0
- package/spec/spec/components/buttons/gel-button.md +125 -0
- package/spec/spec/components/buttons/icon-button.md +108 -0
- package/spec/spec/components/buttons/keypad-button.md +123 -0
- package/spec/spec/components/buttons/push-button.md +139 -0
- package/spec/spec/components/buttons/rec-button.md +105 -0
- package/spec/spec/components/buttons/rubber-button.md +100 -0
- package/spec/spec/components/buttons/segmented-control.md +95 -0
- package/spec/spec/components/data/assembled-panel.md +135 -0
- package/spec/spec/components/data/data-table.md +116 -0
- package/spec/spec/components/data/film-strip.md +110 -0
- package/spec/spec/components/data/media-grid.md +98 -0
- package/spec/spec/components/dials/click-wheel.md +115 -0
- package/spec/spec/components/dials/cylindrical-horizontal.md +130 -0
- package/spec/spec/components/dials/cylindrical-scroll.md +141 -0
- package/spec/spec/components/dials/cylindrical-vertical.md +100 -0
- package/spec/spec/components/dials/mode-dial.md +123 -0
- package/spec/spec/components/dials/radial-knob.md +150 -0
- package/spec/spec/components/dials/rotary-encoder.md +118 -0
- package/spec/spec/components/forms/color-picker.md +99 -0
- package/spec/spec/components/forms/file-input.md +105 -0
- package/spec/spec/components/forms/search-bar.md +96 -0
- package/spec/spec/components/forms/select.md +143 -0
- package/spec/spec/components/forms/text-input.md +114 -0
- package/spec/spec/components/forms/textarea.md +85 -0
- package/spec/spec/components/indicators/accordion.md +137 -0
- package/spec/spec/components/indicators/badges.md +87 -0
- package/spec/spec/components/indicators/chips.md +93 -0
- package/spec/spec/components/indicators/led-dots.md +103 -0
- package/spec/spec/components/indicators/mode-badge.md +97 -0
- package/spec/spec/components/indicators/profile-badge.md +99 -0
- package/spec/spec/components/indicators/skeleton.md +94 -0
- package/spec/spec/components/indicators/spinners.md +95 -0
- package/spec/spec/components/indicators/status-chips.md +85 -0
- package/spec/spec/components/indicators/transport-controls.md +114 -0
- package/spec/spec/components/meters/battery-icon.md +104 -0
- package/spec/spec/components/meters/eq-bars.md +93 -0
- package/spec/spec/components/meters/ev-meter.md +96 -0
- package/spec/spec/components/meters/exposure-scale.md +110 -0
- package/spec/spec/components/meters/gauge-full.md +102 -0
- package/spec/spec/components/meters/gauge-semi.md +113 -0
- package/spec/spec/components/meters/histogram.md +70 -0
- package/spec/spec/components/meters/level-indicator.md +95 -0
- package/spec/spec/components/meters/oscilloscope.md +83 -0
- package/spec/spec/components/meters/progress-bar.md +84 -0
- package/spec/spec/components/meters/signal-bars.md +80 -0
- package/spec/spec/components/meters/signal-meter.md +84 -0
- package/spec/spec/components/meters/vu-meter.md +88 -0
- package/spec/spec/components/meters/waveform.md +70 -0
- package/spec/spec/components/navigation/breadcrumbs.md +94 -0
- package/spec/spec/components/navigation/context-menu.md +94 -0
- package/spec/spec/components/navigation/d-pad.md +121 -0
- package/spec/spec/components/navigation/drawer.md +103 -0
- package/spec/spec/components/navigation/menu-grid.md +113 -0
- package/spec/spec/components/navigation/menu-list.md +134 -0
- package/spec/spec/components/navigation/pagination.md +100 -0
- package/spec/spec/components/navigation/rack-panel.md +124 -0
- package/spec/spec/components/navigation/scrollbar.md +97 -0
- package/spec/spec/components/navigation/status-bar.md +117 -0
- package/spec/spec/components/navigation/tab-bar.md +104 -0
- package/spec/spec/components/overlays/chassis-panel.md +94 -0
- package/spec/spec/components/overlays/device-bezel.md +83 -0
- package/spec/spec/components/overlays/dialog.md +100 -0
- package/spec/spec/components/overlays/focus-brackets.md +124 -0
- package/spec/spec/components/overlays/grid-overlay.md +93 -0
- package/spec/spec/components/overlays/modal.md +89 -0
- package/spec/spec/components/overlays/panel.md +114 -0
- package/spec/spec/components/overlays/plastic-card.md +92 -0
- package/spec/spec/components/overlays/popover.md +75 -0
- package/spec/spec/components/overlays/toast.md +93 -0
- package/spec/spec/components/overlays/tooltip.md +85 -0
- package/spec/spec/components/readouts/camera-readout.md +123 -0
- package/spec/spec/components/readouts/dot-matrix.md +88 -0
- package/spec/spec/components/readouts/lcd-readout.md +116 -0
- package/spec/spec/components/readouts/resource-monitor.md +98 -0
- package/spec/spec/components/readouts/seven-segment.md +110 -0
- package/spec/spec/components/readouts/signal-display.md +93 -0
- package/spec/spec/components/readouts/timecode-display.md +94 -0
- package/spec/spec/components/sliders/crossfader.md +102 -0
- package/spec/spec/components/sliders/dual-range.md +97 -0
- package/spec/spec/components/sliders/range-fader.md +100 -0
- package/spec/spec/components/sliders/scrubber.md +104 -0
- package/spec/spec/components/sliders/stepper.md +106 -0
- package/spec/spec/components/sliders/vertical-fader.md +116 -0
- package/spec/spec/components/sliders/volume-slider.md +107 -0
- package/spec/spec/components/toggles/dip-switch.md +100 -0
- package/spec/spec/components/toggles/led-checkbox.md +108 -0
- package/spec/spec/components/toggles/power-toggle.md +93 -0
- package/spec/spec/components/toggles/radio-button.md +106 -0
- package/spec/spec/components/toggles/rocker-switch.md +92 -0
- package/spec/spec/components/toggles/slide-switch.md +121 -0
- package/spec/spec/components/toggles/toggle-switch.md +135 -0
- package/spec/spec/compositions/audio-mixer-strip.md +62 -0
- package/spec/spec/compositions/camera-viewfinder.md +66 -0
- package/spec/spec/compositions/phone-interface.md +66 -0
- package/spec/spec/foundation/accessibility.md +33 -0
- package/spec/spec/foundation/canvas.md +20 -0
- package/spec/spec/foundation/depth-model.md +82 -0
- package/spec/spec/foundation/layout.md +33 -0
- package/spec/spec/foundation/materials.md +68 -0
- package/spec/spec/foundation/naming.md +33 -0
- package/spec/spec/foundation/philosophy.md +27 -0
- package/spec/spec/foundation/theme.md +39 -0
- package/spec/spec/foundation/tokens.md +148 -0
- package/spec/spec/guides/extension.md +189 -0
- package/spec/spec/guides/for-llms.md +129 -0
- package/spec/spec/guides/prompt-templates.md +143 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Seven-Segment Display
|
|
3
|
+
id: seven-seg
|
|
4
|
+
class: .seven-seg
|
|
5
|
+
category: readouts
|
|
6
|
+
index: 6
|
|
7
|
+
materials: [phosphor-screen]
|
|
8
|
+
sizes: [md]
|
|
9
|
+
interactive: false
|
|
10
|
+
requires_js: false
|
|
11
|
+
canvas: false
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Seven-Segment Display
|
|
15
|
+
|
|
16
|
+
## Physical Analog
|
|
17
|
+
**Reference devices**: Alarm clock displays (Sony Dream Machine), microwave oven timers, synthesizer BPM displays (Roland TR-909), digital scales.
|
|
18
|
+
**Mechanism**: Seven LED segment bars in figure-8 pattern. Each segment is independent LED (red, green, or amber). LEDs behind tinted diffuser window. Glow/bleed from LED light scattering through diffuser. Ghost of unlit segments faintly visible.
|
|
19
|
+
|
|
20
|
+
## Geometry
|
|
21
|
+
|
|
22
|
+
| Property | Value |
|
|
23
|
+
|----------|-------|
|
|
24
|
+
| Digit font | 42px VT323 |
|
|
25
|
+
| Digit min-width | 24px |
|
|
26
|
+
| Gap between digits | 4px |
|
|
27
|
+
| Padding | 10px 16px |
|
|
28
|
+
|
|
29
|
+
## CSS Recipe
|
|
30
|
+
|
|
31
|
+
### Container
|
|
32
|
+
```css
|
|
33
|
+
.seven-seg {
|
|
34
|
+
display: inline-flex; gap: 4px; padding: 10px 16px;
|
|
35
|
+
background: var(--bg-inset); border: 1px solid #1e1e1e;
|
|
36
|
+
border-radius: var(--radius-md);
|
|
37
|
+
box-shadow: inset 0 1px 4px rgba(0,0,0,0.7);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Digit (Default: Red)
|
|
42
|
+
```css
|
|
43
|
+
.seven-seg-digit {
|
|
44
|
+
font-family: var(--font-lcd); font-size: 42px; line-height: 1;
|
|
45
|
+
color: var(--red-alert); text-shadow: 0 0 12px var(--red-glow);
|
|
46
|
+
min-width: 24px; text-align: center;
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Colon
|
|
51
|
+
```css
|
|
52
|
+
.seven-seg-colon { font-family: var(--font-lcd); font-size: 42px; color: var(--red-alert); opacity: 0.7; line-height: 1; }
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Green Variant
|
|
56
|
+
```css
|
|
57
|
+
.seven-seg.green .seven-seg-digit { color: var(--green-hi); text-shadow: 0 0 12px var(--green-glow); }
|
|
58
|
+
.seven-seg.green .seven-seg-colon { color: var(--green-hi); }
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Amber Variant
|
|
62
|
+
```css
|
|
63
|
+
.seven-seg.amber .seven-seg-digit { color: var(--amber); text-shadow: 0 0 12px var(--amber-glow); }
|
|
64
|
+
.seven-seg.amber .seven-seg-colon { color: var(--amber); }
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## HTML Structure
|
|
68
|
+
```html
|
|
69
|
+
<!-- Red (default) -->
|
|
70
|
+
<div class="seven-seg">
|
|
71
|
+
<span class="seven-seg-digit">1</span><span class="seven-seg-digit">2</span>
|
|
72
|
+
<span class="seven-seg-colon">:</span>
|
|
73
|
+
<span class="seven-seg-digit">4</span><span class="seven-seg-digit">5</span>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<!-- Green variant -->
|
|
77
|
+
<div class="seven-seg green">
|
|
78
|
+
<span class="seven-seg-digit">0</span><span class="seven-seg-digit">3</span>
|
|
79
|
+
<span class="seven-seg-colon">:</span>
|
|
80
|
+
<span class="seven-seg-digit">2</span><span class="seven-seg-digit">1</span>
|
|
81
|
+
</div>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Size Variants
|
|
85
|
+
No explicit size variants. Fixed at 42px digit size.
|
|
86
|
+
|
|
87
|
+
## Material Variants
|
|
88
|
+
|
|
89
|
+
| Color Variant | LED Color |
|
|
90
|
+
|---------------|-----------|
|
|
91
|
+
| default (red) | Red GaAsP LED |
|
|
92
|
+
| `.green` | Green GaP LED |
|
|
93
|
+
| `.amber` | Amber AlGaInP LED |
|
|
94
|
+
|
|
95
|
+
## Theme Behavior
|
|
96
|
+
- Container background adapts via `--bg-inset`
|
|
97
|
+
- LED colors and glow are fixed (LEDs are LEDs regardless of ambient light)
|
|
98
|
+
- Inset shadow at 0.7 opacity (deep recess)
|
|
99
|
+
|
|
100
|
+
## Constraints
|
|
101
|
+
1. Font MUST be `--font-lcd` (VT323) for segmented character shapes.
|
|
102
|
+
2. `text-shadow` with accent glow is REQUIRED -- simulates LED light scattering through diffuser.
|
|
103
|
+
3. Colon opacity is 0.7 (slightly dimmer than digits).
|
|
104
|
+
4. Each digit MUST have `min-width: 24px` and `text-align: center` for stable layout.
|
|
105
|
+
5. Inset shadow at 0.7 opacity represents deep diffuser window recess.
|
|
106
|
+
|
|
107
|
+
## Accessibility
|
|
108
|
+
- Read-only display
|
|
109
|
+
- Use `aria-label` to describe the displayed value (e.g., "Time: 12:45")
|
|
110
|
+
- `aria-live="polite"` for updating displays
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Signal Display
|
|
3
|
+
id: signal-display
|
|
4
|
+
class: .signal-display
|
|
5
|
+
category: readouts
|
|
6
|
+
index: 1
|
|
7
|
+
materials: [phosphor-screen]
|
|
8
|
+
sizes: [md]
|
|
9
|
+
interactive: false
|
|
10
|
+
requires_js: false
|
|
11
|
+
canvas: false
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Signal Display
|
|
15
|
+
|
|
16
|
+
## Physical Analog
|
|
17
|
+
**Reference devices**: Industrial OLED status panels, Akai MPC Live main display, synthesizer patch displays, broadcast router status panels.
|
|
18
|
+
**Mechanism**: Recessed OLED or VFD (Vacuum Fluorescent Display) module behind protective window. Display sits 3-5mm below panel surface in milled rectangular cavity. OLED pixels emit own light (no backlight), creating high contrast against black background.
|
|
19
|
+
|
|
20
|
+
## Geometry
|
|
21
|
+
|
|
22
|
+
| Property | Value |
|
|
23
|
+
|----------|-------|
|
|
24
|
+
| Recess depth | 0.9 opacity inset shadow (deepest in system) |
|
|
25
|
+
| Value font | 34px Michroma display font |
|
|
26
|
+
| Label font | 9px Rajdhani UI font |
|
|
27
|
+
| Inner ring | 1px `#181818` additional depth layer |
|
|
28
|
+
|
|
29
|
+
## CSS Recipe
|
|
30
|
+
|
|
31
|
+
### Default (Dark Theme)
|
|
32
|
+
```css
|
|
33
|
+
.signal-display {
|
|
34
|
+
background: linear-gradient(180deg, #080808, #111);
|
|
35
|
+
border: 1px solid #1f1f1f; border-radius: var(--radius-md);
|
|
36
|
+
padding: 16px;
|
|
37
|
+
box-shadow: inset 0 1px 8px rgba(0,0,0,0.9), inset 0 0 0 1px #181818;
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Light Theme
|
|
42
|
+
```css
|
|
43
|
+
[data-theme="light"] .signal-display {
|
|
44
|
+
background: linear-gradient(180deg, var(--bg-inset), #ddd);
|
|
45
|
+
border-color: var(--border-mid);
|
|
46
|
+
box-shadow: inset 0 1px 4px rgba(0,0,0,0.1);
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Label
|
|
51
|
+
```css
|
|
52
|
+
.signal-display-label { font-size: 9px; color: var(--text-muted); letter-spacing: 3px; font-family: var(--font-ui); font-weight: 500; margin-bottom: 8px; }
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Value
|
|
56
|
+
```css
|
|
57
|
+
.signal-display-value {
|
|
58
|
+
font-family: var(--font-display); font-size: 34px; color: var(--amber);
|
|
59
|
+
text-shadow: 0 0 14px var(--amber-glow);
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## HTML Structure
|
|
64
|
+
```html
|
|
65
|
+
<div class="signal-display">
|
|
66
|
+
<div class="signal-display-label">PRIMARY OUTPUT</div>
|
|
67
|
+
<div class="signal-display-value">87.4%</div>
|
|
68
|
+
</div>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Size Variants
|
|
72
|
+
No explicit size variants.
|
|
73
|
+
|
|
74
|
+
## Material Variants
|
|
75
|
+
Single material: Phosphor Screen (LCD/OLED Display Cavity). Nearly black background with heavy inset shadow.
|
|
76
|
+
|
|
77
|
+
## Theme Behavior
|
|
78
|
+
- Dark: Deep black gradient (`#080808` to `#111`) with 0.9 opacity inset shadow
|
|
79
|
+
- Light: Light inset background with much softer shadow (0.1 opacity)
|
|
80
|
+
- Value amber color and glow remain fixed
|
|
81
|
+
- Inner ring (`inset 0 0 0 1px #181818`) removed in light theme
|
|
82
|
+
|
|
83
|
+
## Constraints
|
|
84
|
+
1. Inset shadow MUST be 0.9 opacity -- the strongest in the system (deep recess).
|
|
85
|
+
2. Double inset (shadow + ring) creates the "sunken screen" look.
|
|
86
|
+
3. Value text MUST have `text-shadow` with accent glow = phosphor bleed simulation.
|
|
87
|
+
4. Background MUST be nearly black gradient (not flat) to simulate cavity depth.
|
|
88
|
+
5. Label uses wide letter-spacing (3px) for equipment label aesthetic.
|
|
89
|
+
|
|
90
|
+
## Accessibility
|
|
91
|
+
- Read-only display, no interaction needed
|
|
92
|
+
- Values should use `aria-live="polite"` if they update dynamically
|
|
93
|
+
- Color contrast: amber on near-black exceeds WCAG AA (6.3:1)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Timecode Display
|
|
3
|
+
id: timecode-display
|
|
4
|
+
class: .timecode-display
|
|
5
|
+
category: readouts
|
|
6
|
+
index: 4
|
|
7
|
+
materials: [phosphor-screen]
|
|
8
|
+
sizes: [md]
|
|
9
|
+
interactive: false
|
|
10
|
+
requires_js: false
|
|
11
|
+
canvas: false
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Timecode Display
|
|
15
|
+
|
|
16
|
+
## Physical Analog
|
|
17
|
+
**Reference devices**: Sony BVM broadcast monitors, SMPTE timecode generators, Tascam DA-88 tape machines, video editing decks.
|
|
18
|
+
**Mechanism**: Dedicated timecode readout in SMPTE format (HH:MM:SS:FF). VFD or custom LED segment display. Colons blink at 1Hz during recording/playback as visual "heartbeat" confirming timecode is running.
|
|
19
|
+
|
|
20
|
+
## Geometry
|
|
21
|
+
|
|
22
|
+
| Property | Value |
|
|
23
|
+
|----------|-------|
|
|
24
|
+
| Segment font | 22px Michroma display |
|
|
25
|
+
| Colon font | 18px Michroma |
|
|
26
|
+
| Layout | Inline-flex, baseline-aligned |
|
|
27
|
+
| Padding | 6px 16px |
|
|
28
|
+
|
|
29
|
+
## CSS Recipe
|
|
30
|
+
|
|
31
|
+
### Container
|
|
32
|
+
```css
|
|
33
|
+
.timecode-display {
|
|
34
|
+
background: var(--bg-inset); border: 1px solid #1e1e1e;
|
|
35
|
+
border-radius: var(--radius-md); padding: 6px 16px;
|
|
36
|
+
display: inline-flex; align-items: baseline;
|
|
37
|
+
box-shadow: inset 0 1px 4px rgba(0,0,0,0.6);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Segments
|
|
42
|
+
```css
|
|
43
|
+
.tc-segment {
|
|
44
|
+
font-family: var(--font-display); font-size: 22px;
|
|
45
|
+
color: var(--amber); letter-spacing: 2px;
|
|
46
|
+
text-shadow: 0 0 12px var(--amber-glow);
|
|
47
|
+
font-variant-numeric: tabular-nums;
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Colons
|
|
52
|
+
```css
|
|
53
|
+
.tc-colon { font-family: var(--font-display); font-size: 18px; color: var(--amber-dim); padding: 0 1px; position: relative; top: -1px; }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Blink Animation
|
|
57
|
+
```css
|
|
58
|
+
@keyframes tcBlink { 0%,49%{opacity:1} 50%,100%{opacity:0.15} }
|
|
59
|
+
.tc-blink { animation: tcBlink 1s step-end infinite; }
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## HTML Structure
|
|
63
|
+
```html
|
|
64
|
+
<div class="timecode-display">
|
|
65
|
+
<span class="tc-segment">01</span><span class="tc-colon tc-blink">:</span>
|
|
66
|
+
<span class="tc-segment">23</span><span class="tc-colon">:</span>
|
|
67
|
+
<span class="tc-segment">45</span><span class="tc-colon">:</span>
|
|
68
|
+
<span class="tc-segment">12</span>
|
|
69
|
+
</div>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Size Variants
|
|
73
|
+
No explicit size variants.
|
|
74
|
+
|
|
75
|
+
## Material Variants
|
|
76
|
+
Single material: Phosphor screen display cavity.
|
|
77
|
+
|
|
78
|
+
## Theme Behavior
|
|
79
|
+
- Background and shadow adapt via tokens
|
|
80
|
+
- Amber segment color and glow are fixed
|
|
81
|
+
- Colon uses `--amber-dim` for secondary emphasis
|
|
82
|
+
|
|
83
|
+
## Constraints
|
|
84
|
+
1. Blink animation MUST use `step-end` timing -- instant on/off, not gradual fade. Matches discrete LED behavior.
|
|
85
|
+
2. Blink rate MUST be 1Hz (1s cycle) -- standard broadcast heartbeat.
|
|
86
|
+
3. Only the FIRST colon blinks (`.tc-blink`) -- others are static.
|
|
87
|
+
4. `font-variant-numeric: tabular-nums` is REQUIRED for stable digit widths.
|
|
88
|
+
5. Segments use `--font-display` (Michroma), NOT `--font-lcd` (VT323).
|
|
89
|
+
|
|
90
|
+
## Accessibility
|
|
91
|
+
- Read-only display
|
|
92
|
+
- Use `aria-label` on container describing the timecode value
|
|
93
|
+
- `aria-live="polite"` if timecode updates in real-time
|
|
94
|
+
- Blink animation respects `prefers-reduced-motion` (should be paused)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Crossfader
|
|
3
|
+
id: crossfader-track
|
|
4
|
+
class: .crossfader-track
|
|
5
|
+
category: sliders
|
|
6
|
+
index: 5
|
|
7
|
+
materials: [chrome, panel]
|
|
8
|
+
sizes: [md]
|
|
9
|
+
interactive: true
|
|
10
|
+
requires_js: true
|
|
11
|
+
canvas: false
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Crossfader
|
|
15
|
+
|
|
16
|
+
## Physical Analog
|
|
17
|
+
**Reference devices**: Technics SH-DJ1200 crossfader, Pioneer DJM-800/900 crossfader, Numark DM1050.
|
|
18
|
+
**Mechanism**: Specialized linear potentiometer for DJ mixers. Blends between two audio sources (Deck A left, Deck B right). Extremely low-friction tracks (Teflon-coated or magnetic non-contact) for rapid "scratch" movements.
|
|
19
|
+
|
|
20
|
+
## Geometry
|
|
21
|
+
|
|
22
|
+
| Property | Value |
|
|
23
|
+
|----------|-------|
|
|
24
|
+
| Track | 100% width x 10px height (wider than standard fader) |
|
|
25
|
+
| Thumb | 28x16px rectangular (wider than standard fader's 22x14px) |
|
|
26
|
+
| Center line | 1px vertical line at midpoint |
|
|
27
|
+
| Labels | "DECK A" / "DECK B" at ends |
|
|
28
|
+
| Container width | 200px |
|
|
29
|
+
|
|
30
|
+
## CSS Recipe
|
|
31
|
+
|
|
32
|
+
### Wrapper & Labels
|
|
33
|
+
```css
|
|
34
|
+
.crossfader-wrap { display: flex; flex-direction: column; align-items: center; gap: 6px; width: 200px; }
|
|
35
|
+
.crossfader-labels { display: flex; justify-content: space-between; width: 100%; font-family: var(--font-ui); font-size: 8px; font-weight: 600; color: var(--text-muted); letter-spacing: 1px; }
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Track
|
|
39
|
+
```css
|
|
40
|
+
.crossfader-track {
|
|
41
|
+
width: 100%; height: 10px; border-radius: 5px;
|
|
42
|
+
background: var(--bg-inset); border: 1px solid var(--border-subtle);
|
|
43
|
+
position: relative; box-shadow: var(--shadow-inset);
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Center Line
|
|
48
|
+
```css
|
|
49
|
+
.crossfader-center { position: absolute; left: 50%; top: 0; bottom: 0; width: 1px; background: var(--border-mid); }
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Thumb (Wide Fader Cap)
|
|
53
|
+
```css
|
|
54
|
+
.crossfader-thumb {
|
|
55
|
+
position: absolute; top: 50%; width: 28px; height: 16px;
|
|
56
|
+
border-radius: 4px; transform: translate(-50%,-50%);
|
|
57
|
+
background: linear-gradient(180deg, #777, #444);
|
|
58
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.4), inset 0 1px 0 #999;
|
|
59
|
+
cursor: grab; z-index: 2;
|
|
60
|
+
}
|
|
61
|
+
.crossfader-thumb::before, .crossfader-thumb::after {
|
|
62
|
+
content: ''; position: absolute; top: 4px; bottom: 4px; width: 1px; background: #999;
|
|
63
|
+
}
|
|
64
|
+
.crossfader-thumb::before { left: 8px; }
|
|
65
|
+
.crossfader-thumb::after { right: 8px; }
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## HTML Structure
|
|
69
|
+
```html
|
|
70
|
+
<div class="crossfader-wrap">
|
|
71
|
+
<div class="crossfader-labels"><span>DECK A</span><span>DECK B</span></div>
|
|
72
|
+
<div class="crossfader-track">
|
|
73
|
+
<div class="crossfader-center"></div>
|
|
74
|
+
<div class="crossfader-thumb" style="left:50%"></div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Size Variants
|
|
80
|
+
No explicit size variants.
|
|
81
|
+
|
|
82
|
+
## Material Variants
|
|
83
|
+
- Track: Recessed panel
|
|
84
|
+
- Thumb: Chrome/metallic gradient with two grip lines
|
|
85
|
+
|
|
86
|
+
## Theme Behavior
|
|
87
|
+
- Track adapts via tokens
|
|
88
|
+
- Thumb metallic gradient is fixed
|
|
89
|
+
- Center line uses `--border-mid`
|
|
90
|
+
|
|
91
|
+
## Constraints
|
|
92
|
+
1. Deck labels ("DECK A" / "DECK B") at each end are ESSENTIAL for crossfader concept.
|
|
93
|
+
2. Center line on track marks the visual balance point.
|
|
94
|
+
3. Thumb is WIDER than standard fader (28x16px vs 22x14px) with TWO grip lines (via `::before` and `::after`).
|
|
95
|
+
4. Track is 10px (wider than standard fader's 8px).
|
|
96
|
+
5. No fill element -- crossfader shows position only, not a level.
|
|
97
|
+
|
|
98
|
+
## Accessibility
|
|
99
|
+
- Add `role="slider"` with `aria-valuenow` (0=Deck A, 50=center, 100=Deck B)
|
|
100
|
+
- `aria-label="Crossfader"`
|
|
101
|
+
- Keyboard: Arrow Left/Right to slide
|
|
102
|
+
- Requires JS for drag interaction
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Dual Range Slider
|
|
3
|
+
id: dual-range-track
|
|
4
|
+
class: .dual-range-track
|
|
5
|
+
category: sliders
|
|
6
|
+
index: 4
|
|
7
|
+
materials: [panel, glossy]
|
|
8
|
+
sizes: [md]
|
|
9
|
+
interactive: true
|
|
10
|
+
requires_js: true
|
|
11
|
+
canvas: false
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Dual Range Slider
|
|
15
|
+
|
|
16
|
+
## Physical Analog
|
|
17
|
+
**Reference devices**: Parametric EQ frequency range selectors, audio compressor attack/release range, frequency crossover points.
|
|
18
|
+
**Mechanism**: Two independent fader wiper contacts on a single resistive track, defining a range (low/high bound). Fill between thumbs represents selected range. Rare in physical hardware -- UI innovation compressing two controls into one.
|
|
19
|
+
|
|
20
|
+
## Geometry
|
|
21
|
+
|
|
22
|
+
| Property | Value |
|
|
23
|
+
|----------|-------|
|
|
24
|
+
| Track | 100% width x 6px height |
|
|
25
|
+
| Thumbs | 14px diameter circles (two of them) |
|
|
26
|
+
| Fill | Blue, positioned between thumbs |
|
|
27
|
+
| Container width | 180px |
|
|
28
|
+
|
|
29
|
+
## CSS Recipe
|
|
30
|
+
|
|
31
|
+
### Wrapper
|
|
32
|
+
```css
|
|
33
|
+
.dual-range-wrap { display: flex; flex-direction: column; align-items: center; gap: 6px; width: 180px; }
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Track
|
|
37
|
+
```css
|
|
38
|
+
.dual-range-track {
|
|
39
|
+
width: 100%; height: 6px; border-radius: 3px;
|
|
40
|
+
background: var(--bg-inset); border: 1px solid var(--border-subtle);
|
|
41
|
+
position: relative; box-shadow: var(--shadow-inset);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Fill (Range Between Thumbs)
|
|
46
|
+
```css
|
|
47
|
+
.dual-range-fill {
|
|
48
|
+
position: absolute; top: 0; height: 100%; border-radius: 2px;
|
|
49
|
+
background: var(--blue-info);
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Thumbs
|
|
54
|
+
```css
|
|
55
|
+
.dual-range-thumb {
|
|
56
|
+
position: absolute; top: 50%; width: 14px; height: 14px;
|
|
57
|
+
border-radius: 50%; transform: translate(-50%,-50%);
|
|
58
|
+
background: linear-gradient(155deg, var(--bg-surface), var(--bg-panel));
|
|
59
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.3), inset 0 1px 0 var(--glossy-hi);
|
|
60
|
+
cursor: grab; z-index: 2;
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## HTML Structure
|
|
65
|
+
```html
|
|
66
|
+
<div class="dual-range-wrap">
|
|
67
|
+
<div class="dual-range-track">
|
|
68
|
+
<div class="dual-range-fill" style="left:25%;width:40%"></div>
|
|
69
|
+
<div class="dual-range-thumb" style="left:25%"></div>
|
|
70
|
+
<div class="dual-range-thumb" style="left:65%"></div>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Size Variants
|
|
76
|
+
No explicit size variants.
|
|
77
|
+
|
|
78
|
+
## Material Variants
|
|
79
|
+
- Track: Recessed panel
|
|
80
|
+
- Thumbs: Glossy panel surface
|
|
81
|
+
- Fill: Solid blue
|
|
82
|
+
|
|
83
|
+
## Theme Behavior
|
|
84
|
+
- Track and thumbs adapt via tokens
|
|
85
|
+
- Blue fill is fixed
|
|
86
|
+
|
|
87
|
+
## Constraints
|
|
88
|
+
1. Two thumbs MUST be independently draggable.
|
|
89
|
+
2. Fill MUST span between the two thumbs (set via `left` and `width`).
|
|
90
|
+
3. Thumbs MUST NOT cross each other (low bound cannot exceed high bound).
|
|
91
|
+
4. Both thumbs use identical styling.
|
|
92
|
+
|
|
93
|
+
## Accessibility
|
|
94
|
+
- Each thumb should have `role="slider"` with separate `aria-valuenow`
|
|
95
|
+
- `aria-label` should distinguish "Range minimum" and "Range maximum"
|
|
96
|
+
- Keyboard: Arrow keys to adjust focused thumb
|
|
97
|
+
- Requires JS for dual drag interaction
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Range Fader
|
|
3
|
+
id: fader-h-track
|
|
4
|
+
class: .fader-h-track
|
|
5
|
+
category: sliders
|
|
6
|
+
index: 3
|
|
7
|
+
materials: [chrome, panel]
|
|
8
|
+
sizes: [md]
|
|
9
|
+
interactive: true
|
|
10
|
+
requires_js: true
|
|
11
|
+
canvas: false
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Range Fader
|
|
15
|
+
|
|
16
|
+
## Physical Analog
|
|
17
|
+
**Reference devices**: Mackie mixer channel faders, Behringer mixer faders, SSL console faders.
|
|
18
|
+
**Mechanism**: Linear slide potentiometer. Wiper moves in straight line along conductive plastic track. Rectangular thumb grip with horizontal groove for tactile feedback. Fader body has 8-12mm x 4-6mm cross-section.
|
|
19
|
+
|
|
20
|
+
## Geometry
|
|
21
|
+
|
|
22
|
+
| Property | Value |
|
|
23
|
+
|----------|-------|
|
|
24
|
+
| Track | 100% width x 8px height (thicker than volume slider) |
|
|
25
|
+
| Thumb | 22x14px rectangular (NOT circular) |
|
|
26
|
+
| Thumb radius | 3px (rounded rectangle) |
|
|
27
|
+
| Fill | Amber (solid, not gradient) |
|
|
28
|
+
| Container width | 180px |
|
|
29
|
+
|
|
30
|
+
## CSS Recipe
|
|
31
|
+
|
|
32
|
+
### Wrapper
|
|
33
|
+
```css
|
|
34
|
+
.fader-h-wrap { display: flex; flex-direction: column; align-items: center; gap: 6px; width: 180px; }
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Track
|
|
38
|
+
```css
|
|
39
|
+
.fader-h-track {
|
|
40
|
+
width: 100%; height: 8px; border-radius: 4px;
|
|
41
|
+
background: var(--bg-inset); border: 1px solid var(--border-subtle);
|
|
42
|
+
position: relative; box-shadow: var(--shadow-inset);
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Fill
|
|
47
|
+
```css
|
|
48
|
+
.fader-h-fill {
|
|
49
|
+
position: absolute; top: 0; left: 0; height: 100%; border-radius: 3px;
|
|
50
|
+
background: var(--amber); transition: width 0.1s;
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Thumb (Fader Cap)
|
|
55
|
+
```css
|
|
56
|
+
.fader-h-thumb {
|
|
57
|
+
position: absolute; top: 50%; width: 22px; height: 14px;
|
|
58
|
+
border-radius: 3px; transform: translate(-50%,-50%);
|
|
59
|
+
background: linear-gradient(180deg, #666, #333);
|
|
60
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.4), inset 0 1px 0 #888;
|
|
61
|
+
cursor: grab; z-index: 2;
|
|
62
|
+
}
|
|
63
|
+
.fader-h-thumb::after {
|
|
64
|
+
content: ''; position: absolute; top: 50%; left: 4px; right: 4px;
|
|
65
|
+
height: 1px; background: #999; transform: translateY(-50%);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## HTML Structure
|
|
70
|
+
```html
|
|
71
|
+
<div class="fader-h-wrap">
|
|
72
|
+
<div class="fader-h-track">
|
|
73
|
+
<div class="fader-h-fill" style="width:45%"></div>
|
|
74
|
+
<div class="fader-h-thumb" style="left:45%"></div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Size Variants
|
|
80
|
+
No explicit size variants.
|
|
81
|
+
|
|
82
|
+
## Material Variants
|
|
83
|
+
- Track: Recessed panel
|
|
84
|
+
- Thumb: Chrome/metallic gradient with center groove line (`::after`)
|
|
85
|
+
|
|
86
|
+
## Theme Behavior
|
|
87
|
+
- Track adapts via tokens
|
|
88
|
+
- Thumb metallic gradient is fixed (metal fader cap)
|
|
89
|
+
- Amber fill is fixed
|
|
90
|
+
|
|
91
|
+
## Constraints
|
|
92
|
+
1. Thumb MUST be rectangular (22x14px, border-radius: 3px), NOT circular. This is a console fader, not a touch slider.
|
|
93
|
+
2. Center groove line (`::after`) on thumb is REQUIRED for finger positioning reference.
|
|
94
|
+
3. Fill MUST be solid amber (not gradient) -- represents the active signal level.
|
|
95
|
+
4. Track is 8px (thicker than volume slider's 6px) -- fader tracks are wider.
|
|
96
|
+
|
|
97
|
+
## Accessibility
|
|
98
|
+
- Add `role="slider"` with `aria-valuenow`, `aria-valuemin`, `aria-valuemax`
|
|
99
|
+
- Keyboard: Arrow Left/Right to adjust
|
|
100
|
+
- Requires JS for drag interaction
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Scrubber
|
|
3
|
+
id: scrubber-track
|
|
4
|
+
class: .scrubber-track
|
|
5
|
+
category: sliders
|
|
6
|
+
index: 2
|
|
7
|
+
materials: [panel, glossy]
|
|
8
|
+
sizes: [md]
|
|
9
|
+
interactive: true
|
|
10
|
+
requires_js: true
|
|
11
|
+
canvas: false
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Scrubber
|
|
15
|
+
|
|
16
|
+
## Physical Analog
|
|
17
|
+
**Reference devices**: iPod Classic now-playing timeline, Winamp playback bar, Creative NOMAD player.
|
|
18
|
+
**Mechanism**: Time-position indicator derived from mechanical tape counter on cassette decks/reel-to-reel. Position = time, elapsed on left, total/remaining on right.
|
|
19
|
+
|
|
20
|
+
## Geometry
|
|
21
|
+
|
|
22
|
+
| Property | Value |
|
|
23
|
+
|----------|-------|
|
|
24
|
+
| Track | 100% width x 6px height, recessed |
|
|
25
|
+
| Thumb | 14px diameter (slightly smaller than volume slider) |
|
|
26
|
+
| Fill | Blue-to-pink gradient (distinguishes time from level) |
|
|
27
|
+
| Container width | 200px |
|
|
28
|
+
|
|
29
|
+
## CSS Recipe
|
|
30
|
+
|
|
31
|
+
### Wrapper
|
|
32
|
+
```css
|
|
33
|
+
.scrubber-wrap { display: flex; flex-direction: column; gap: 4px; width: 200px; }
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Track
|
|
37
|
+
```css
|
|
38
|
+
.scrubber-track {
|
|
39
|
+
width: 100%; height: 6px; border-radius: 3px;
|
|
40
|
+
background: var(--bg-inset); border: 1px solid var(--border-subtle);
|
|
41
|
+
position: relative; cursor: pointer; box-shadow: var(--shadow-inset);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Fill
|
|
46
|
+
```css
|
|
47
|
+
.scrubber-fill {
|
|
48
|
+
position: absolute; top: 0; left: 0; height: 100%; border-radius: 2px;
|
|
49
|
+
background: linear-gradient(90deg, var(--blue-info), var(--pink-action));
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Thumb
|
|
54
|
+
```css
|
|
55
|
+
.scrubber-thumb {
|
|
56
|
+
position: absolute; top: 50%; width: 14px; height: 14px;
|
|
57
|
+
border-radius: 50%; transform: translate(-50%,-50%);
|
|
58
|
+
background: linear-gradient(155deg, var(--bg-surface), var(--bg-panel));
|
|
59
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.3), inset 0 1px 0 var(--glossy-hi);
|
|
60
|
+
z-index: 2; cursor: pointer;
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Time Labels
|
|
65
|
+
```css
|
|
66
|
+
.scrubber-time {
|
|
67
|
+
display: flex; justify-content: space-between;
|
|
68
|
+
font-family: var(--font-mono); font-size: 10px; color: var(--text-muted);
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## HTML Structure
|
|
73
|
+
```html
|
|
74
|
+
<div class="scrubber-wrap">
|
|
75
|
+
<div class="scrubber-track">
|
|
76
|
+
<div class="scrubber-fill" style="width:35%"></div>
|
|
77
|
+
<div class="scrubber-thumb" style="left:35%"></div>
|
|
78
|
+
</div>
|
|
79
|
+
<div class="scrubber-time"><span>1:24</span><span>4:02</span></div>
|
|
80
|
+
</div>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Size Variants
|
|
84
|
+
No explicit size variants.
|
|
85
|
+
|
|
86
|
+
## Material Variants
|
|
87
|
+
- Track: Recessed panel
|
|
88
|
+
- Thumb: Glossy panel surface
|
|
89
|
+
- Fill: Blue-to-pink gradient (different from volume's blue-to-green)
|
|
90
|
+
|
|
91
|
+
## Theme Behavior
|
|
92
|
+
- Track and thumb adapt via tokens
|
|
93
|
+
- Fill gradient colors are fixed accent colors
|
|
94
|
+
|
|
95
|
+
## Constraints
|
|
96
|
+
1. Fill gradient MUST be blue-to-pink (NOT blue-to-green like volume slider) to distinguish time from level.
|
|
97
|
+
2. Timestamp labels MUST use `--font-mono` for aligned numeric display.
|
|
98
|
+
3. Thumb is 14px (slightly smaller than volume slider's 16px).
|
|
99
|
+
|
|
100
|
+
## Accessibility
|
|
101
|
+
- Add `role="slider"` with `aria-valuenow`, `aria-valuemin`, `aria-valuemax`
|
|
102
|
+
- `aria-label="Playback position"`
|
|
103
|
+
- Keyboard: Arrow Left/Right to scrub
|
|
104
|
+
- Requires JS for drag and time update
|