@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.
Files changed (236) hide show
  1. package/README.md +63 -0
  2. package/dist/__tests__/catalog.test.d.ts +1 -0
  3. package/dist/__tests__/catalog.test.js +50 -0
  4. package/dist/__tests__/search.test.d.ts +1 -0
  5. package/dist/__tests__/search.test.js +44 -0
  6. package/dist/__tests__/validation.test.d.ts +1 -0
  7. package/dist/__tests__/validation.test.js +34 -0
  8. package/dist/assembler.d.ts +6 -0
  9. package/dist/assembler.js +95 -0
  10. package/dist/catalog.d.ts +22 -0
  11. package/dist/catalog.js +10 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +33 -0
  14. package/dist/search.d.ts +5 -0
  15. package/dist/search.js +21 -0
  16. package/dist/tools.d.ts +105 -0
  17. package/dist/tools.js +129 -0
  18. package/package.json +55 -0
  19. package/spec/components/_index.yaml +822 -0
  20. package/spec/components/buttons/clear-button.md +89 -0
  21. package/spec/components/buttons/fn-grid.md +104 -0
  22. package/spec/components/buttons/gel-button.md +125 -0
  23. package/spec/components/buttons/icon-button.md +108 -0
  24. package/spec/components/buttons/keypad-button.md +123 -0
  25. package/spec/components/buttons/push-button.md +139 -0
  26. package/spec/components/buttons/rec-button.md +105 -0
  27. package/spec/components/buttons/rubber-button.md +100 -0
  28. package/spec/components/buttons/segmented-control.md +95 -0
  29. package/spec/components/data/assembled-panel.md +135 -0
  30. package/spec/components/data/data-table.md +116 -0
  31. package/spec/components/data/film-strip.md +110 -0
  32. package/spec/components/data/media-grid.md +98 -0
  33. package/spec/components/dials/click-wheel.md +115 -0
  34. package/spec/components/dials/cylindrical-horizontal.md +130 -0
  35. package/spec/components/dials/cylindrical-scroll.md +141 -0
  36. package/spec/components/dials/cylindrical-vertical.md +100 -0
  37. package/spec/components/dials/mode-dial.md +123 -0
  38. package/spec/components/dials/radial-knob.md +150 -0
  39. package/spec/components/dials/rotary-encoder.md +118 -0
  40. package/spec/components/forms/color-picker.md +99 -0
  41. package/spec/components/forms/file-input.md +105 -0
  42. package/spec/components/forms/search-bar.md +96 -0
  43. package/spec/components/forms/select.md +143 -0
  44. package/spec/components/forms/text-input.md +114 -0
  45. package/spec/components/forms/textarea.md +85 -0
  46. package/spec/components/indicators/accordion.md +137 -0
  47. package/spec/components/indicators/badges.md +87 -0
  48. package/spec/components/indicators/chips.md +93 -0
  49. package/spec/components/indicators/led-dots.md +103 -0
  50. package/spec/components/indicators/mode-badge.md +97 -0
  51. package/spec/components/indicators/profile-badge.md +99 -0
  52. package/spec/components/indicators/skeleton.md +94 -0
  53. package/spec/components/indicators/spinners.md +95 -0
  54. package/spec/components/indicators/status-chips.md +85 -0
  55. package/spec/components/indicators/transport-controls.md +114 -0
  56. package/spec/components/meters/battery-icon.md +104 -0
  57. package/spec/components/meters/eq-bars.md +93 -0
  58. package/spec/components/meters/ev-meter.md +96 -0
  59. package/spec/components/meters/exposure-scale.md +110 -0
  60. package/spec/components/meters/gauge-full.md +102 -0
  61. package/spec/components/meters/gauge-semi.md +113 -0
  62. package/spec/components/meters/histogram.md +70 -0
  63. package/spec/components/meters/level-indicator.md +95 -0
  64. package/spec/components/meters/oscilloscope.md +83 -0
  65. package/spec/components/meters/progress-bar.md +84 -0
  66. package/spec/components/meters/signal-bars.md +80 -0
  67. package/spec/components/meters/signal-meter.md +84 -0
  68. package/spec/components/meters/vu-meter.md +88 -0
  69. package/spec/components/meters/waveform.md +70 -0
  70. package/spec/components/navigation/breadcrumbs.md +94 -0
  71. package/spec/components/navigation/context-menu.md +94 -0
  72. package/spec/components/navigation/d-pad.md +121 -0
  73. package/spec/components/navigation/drawer.md +103 -0
  74. package/spec/components/navigation/menu-grid.md +113 -0
  75. package/spec/components/navigation/menu-list.md +134 -0
  76. package/spec/components/navigation/pagination.md +100 -0
  77. package/spec/components/navigation/rack-panel.md +124 -0
  78. package/spec/components/navigation/scrollbar.md +97 -0
  79. package/spec/components/navigation/status-bar.md +117 -0
  80. package/spec/components/navigation/tab-bar.md +104 -0
  81. package/spec/components/overlays/chassis-panel.md +94 -0
  82. package/spec/components/overlays/device-bezel.md +83 -0
  83. package/spec/components/overlays/dialog.md +100 -0
  84. package/spec/components/overlays/focus-brackets.md +124 -0
  85. package/spec/components/overlays/grid-overlay.md +93 -0
  86. package/spec/components/overlays/modal.md +89 -0
  87. package/spec/components/overlays/panel.md +114 -0
  88. package/spec/components/overlays/plastic-card.md +92 -0
  89. package/spec/components/overlays/popover.md +75 -0
  90. package/spec/components/overlays/toast.md +93 -0
  91. package/spec/components/overlays/tooltip.md +85 -0
  92. package/spec/components/readouts/camera-readout.md +123 -0
  93. package/spec/components/readouts/dot-matrix.md +88 -0
  94. package/spec/components/readouts/lcd-readout.md +116 -0
  95. package/spec/components/readouts/resource-monitor.md +98 -0
  96. package/spec/components/readouts/seven-segment.md +110 -0
  97. package/spec/components/readouts/signal-display.md +93 -0
  98. package/spec/components/readouts/timecode-display.md +94 -0
  99. package/spec/components/sliders/crossfader.md +102 -0
  100. package/spec/components/sliders/dual-range.md +97 -0
  101. package/spec/components/sliders/range-fader.md +100 -0
  102. package/spec/components/sliders/scrubber.md +104 -0
  103. package/spec/components/sliders/stepper.md +106 -0
  104. package/spec/components/sliders/vertical-fader.md +116 -0
  105. package/spec/components/sliders/volume-slider.md +107 -0
  106. package/spec/components/toggles/dip-switch.md +100 -0
  107. package/spec/components/toggles/led-checkbox.md +108 -0
  108. package/spec/components/toggles/power-toggle.md +93 -0
  109. package/spec/components/toggles/radio-button.md +106 -0
  110. package/spec/components/toggles/rocker-switch.md +92 -0
  111. package/spec/components/toggles/slide-switch.md +121 -0
  112. package/spec/components/toggles/toggle-switch.md +135 -0
  113. package/spec/compositions/audio-mixer-strip.md +62 -0
  114. package/spec/compositions/camera-viewfinder.md +66 -0
  115. package/spec/compositions/phone-interface.md +66 -0
  116. package/spec/foundation/accessibility.md +33 -0
  117. package/spec/foundation/canvas.md +20 -0
  118. package/spec/foundation/depth-model.md +82 -0
  119. package/spec/foundation/layout.md +33 -0
  120. package/spec/foundation/materials.md +68 -0
  121. package/spec/foundation/naming.md +33 -0
  122. package/spec/foundation/philosophy.md +27 -0
  123. package/spec/foundation/theme.md +39 -0
  124. package/spec/foundation/tokens.md +148 -0
  125. package/spec/guides/extension.md +189 -0
  126. package/spec/guides/for-llms.md +129 -0
  127. package/spec/guides/prompt-templates.md +143 -0
  128. package/spec/spec/components/_index.yaml +822 -0
  129. package/spec/spec/components/buttons/clear-button.md +89 -0
  130. package/spec/spec/components/buttons/fn-grid.md +104 -0
  131. package/spec/spec/components/buttons/gel-button.md +125 -0
  132. package/spec/spec/components/buttons/icon-button.md +108 -0
  133. package/spec/spec/components/buttons/keypad-button.md +123 -0
  134. package/spec/spec/components/buttons/push-button.md +139 -0
  135. package/spec/spec/components/buttons/rec-button.md +105 -0
  136. package/spec/spec/components/buttons/rubber-button.md +100 -0
  137. package/spec/spec/components/buttons/segmented-control.md +95 -0
  138. package/spec/spec/components/data/assembled-panel.md +135 -0
  139. package/spec/spec/components/data/data-table.md +116 -0
  140. package/spec/spec/components/data/film-strip.md +110 -0
  141. package/spec/spec/components/data/media-grid.md +98 -0
  142. package/spec/spec/components/dials/click-wheel.md +115 -0
  143. package/spec/spec/components/dials/cylindrical-horizontal.md +130 -0
  144. package/spec/spec/components/dials/cylindrical-scroll.md +141 -0
  145. package/spec/spec/components/dials/cylindrical-vertical.md +100 -0
  146. package/spec/spec/components/dials/mode-dial.md +123 -0
  147. package/spec/spec/components/dials/radial-knob.md +150 -0
  148. package/spec/spec/components/dials/rotary-encoder.md +118 -0
  149. package/spec/spec/components/forms/color-picker.md +99 -0
  150. package/spec/spec/components/forms/file-input.md +105 -0
  151. package/spec/spec/components/forms/search-bar.md +96 -0
  152. package/spec/spec/components/forms/select.md +143 -0
  153. package/spec/spec/components/forms/text-input.md +114 -0
  154. package/spec/spec/components/forms/textarea.md +85 -0
  155. package/spec/spec/components/indicators/accordion.md +137 -0
  156. package/spec/spec/components/indicators/badges.md +87 -0
  157. package/spec/spec/components/indicators/chips.md +93 -0
  158. package/spec/spec/components/indicators/led-dots.md +103 -0
  159. package/spec/spec/components/indicators/mode-badge.md +97 -0
  160. package/spec/spec/components/indicators/profile-badge.md +99 -0
  161. package/spec/spec/components/indicators/skeleton.md +94 -0
  162. package/spec/spec/components/indicators/spinners.md +95 -0
  163. package/spec/spec/components/indicators/status-chips.md +85 -0
  164. package/spec/spec/components/indicators/transport-controls.md +114 -0
  165. package/spec/spec/components/meters/battery-icon.md +104 -0
  166. package/spec/spec/components/meters/eq-bars.md +93 -0
  167. package/spec/spec/components/meters/ev-meter.md +96 -0
  168. package/spec/spec/components/meters/exposure-scale.md +110 -0
  169. package/spec/spec/components/meters/gauge-full.md +102 -0
  170. package/spec/spec/components/meters/gauge-semi.md +113 -0
  171. package/spec/spec/components/meters/histogram.md +70 -0
  172. package/spec/spec/components/meters/level-indicator.md +95 -0
  173. package/spec/spec/components/meters/oscilloscope.md +83 -0
  174. package/spec/spec/components/meters/progress-bar.md +84 -0
  175. package/spec/spec/components/meters/signal-bars.md +80 -0
  176. package/spec/spec/components/meters/signal-meter.md +84 -0
  177. package/spec/spec/components/meters/vu-meter.md +88 -0
  178. package/spec/spec/components/meters/waveform.md +70 -0
  179. package/spec/spec/components/navigation/breadcrumbs.md +94 -0
  180. package/spec/spec/components/navigation/context-menu.md +94 -0
  181. package/spec/spec/components/navigation/d-pad.md +121 -0
  182. package/spec/spec/components/navigation/drawer.md +103 -0
  183. package/spec/spec/components/navigation/menu-grid.md +113 -0
  184. package/spec/spec/components/navigation/menu-list.md +134 -0
  185. package/spec/spec/components/navigation/pagination.md +100 -0
  186. package/spec/spec/components/navigation/rack-panel.md +124 -0
  187. package/spec/spec/components/navigation/scrollbar.md +97 -0
  188. package/spec/spec/components/navigation/status-bar.md +117 -0
  189. package/spec/spec/components/navigation/tab-bar.md +104 -0
  190. package/spec/spec/components/overlays/chassis-panel.md +94 -0
  191. package/spec/spec/components/overlays/device-bezel.md +83 -0
  192. package/spec/spec/components/overlays/dialog.md +100 -0
  193. package/spec/spec/components/overlays/focus-brackets.md +124 -0
  194. package/spec/spec/components/overlays/grid-overlay.md +93 -0
  195. package/spec/spec/components/overlays/modal.md +89 -0
  196. package/spec/spec/components/overlays/panel.md +114 -0
  197. package/spec/spec/components/overlays/plastic-card.md +92 -0
  198. package/spec/spec/components/overlays/popover.md +75 -0
  199. package/spec/spec/components/overlays/toast.md +93 -0
  200. package/spec/spec/components/overlays/tooltip.md +85 -0
  201. package/spec/spec/components/readouts/camera-readout.md +123 -0
  202. package/spec/spec/components/readouts/dot-matrix.md +88 -0
  203. package/spec/spec/components/readouts/lcd-readout.md +116 -0
  204. package/spec/spec/components/readouts/resource-monitor.md +98 -0
  205. package/spec/spec/components/readouts/seven-segment.md +110 -0
  206. package/spec/spec/components/readouts/signal-display.md +93 -0
  207. package/spec/spec/components/readouts/timecode-display.md +94 -0
  208. package/spec/spec/components/sliders/crossfader.md +102 -0
  209. package/spec/spec/components/sliders/dual-range.md +97 -0
  210. package/spec/spec/components/sliders/range-fader.md +100 -0
  211. package/spec/spec/components/sliders/scrubber.md +104 -0
  212. package/spec/spec/components/sliders/stepper.md +106 -0
  213. package/spec/spec/components/sliders/vertical-fader.md +116 -0
  214. package/spec/spec/components/sliders/volume-slider.md +107 -0
  215. package/spec/spec/components/toggles/dip-switch.md +100 -0
  216. package/spec/spec/components/toggles/led-checkbox.md +108 -0
  217. package/spec/spec/components/toggles/power-toggle.md +93 -0
  218. package/spec/spec/components/toggles/radio-button.md +106 -0
  219. package/spec/spec/components/toggles/rocker-switch.md +92 -0
  220. package/spec/spec/components/toggles/slide-switch.md +121 -0
  221. package/spec/spec/components/toggles/toggle-switch.md +135 -0
  222. package/spec/spec/compositions/audio-mixer-strip.md +62 -0
  223. package/spec/spec/compositions/camera-viewfinder.md +66 -0
  224. package/spec/spec/compositions/phone-interface.md +66 -0
  225. package/spec/spec/foundation/accessibility.md +33 -0
  226. package/spec/spec/foundation/canvas.md +20 -0
  227. package/spec/spec/foundation/depth-model.md +82 -0
  228. package/spec/spec/foundation/layout.md +33 -0
  229. package/spec/spec/foundation/materials.md +68 -0
  230. package/spec/spec/foundation/naming.md +33 -0
  231. package/spec/spec/foundation/philosophy.md +27 -0
  232. package/spec/spec/foundation/theme.md +39 -0
  233. package/spec/spec/foundation/tokens.md +148 -0
  234. package/spec/spec/guides/extension.md +189 -0
  235. package/spec/spec/guides/for-llms.md +129 -0
  236. 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