@pudge-ui/mcp-server 0.1.0 → 0.2.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 (114) hide show
  1. package/README.md +10 -0
  2. package/dist/tools.d.ts +25 -0
  3. package/dist/tools.js +23 -13
  4. package/package.json +5 -4
  5. package/spec/components/.gstack/browse.json.lock +1 -0
  6. package/spec/spec/components/_index.yaml +0 -822
  7. package/spec/spec/components/buttons/clear-button.md +0 -89
  8. package/spec/spec/components/buttons/fn-grid.md +0 -104
  9. package/spec/spec/components/buttons/gel-button.md +0 -125
  10. package/spec/spec/components/buttons/icon-button.md +0 -108
  11. package/spec/spec/components/buttons/keypad-button.md +0 -123
  12. package/spec/spec/components/buttons/push-button.md +0 -139
  13. package/spec/spec/components/buttons/rec-button.md +0 -105
  14. package/spec/spec/components/buttons/rubber-button.md +0 -100
  15. package/spec/spec/components/buttons/segmented-control.md +0 -95
  16. package/spec/spec/components/data/assembled-panel.md +0 -135
  17. package/spec/spec/components/data/data-table.md +0 -116
  18. package/spec/spec/components/data/film-strip.md +0 -110
  19. package/spec/spec/components/data/media-grid.md +0 -98
  20. package/spec/spec/components/dials/click-wheel.md +0 -115
  21. package/spec/spec/components/dials/cylindrical-horizontal.md +0 -130
  22. package/spec/spec/components/dials/cylindrical-scroll.md +0 -141
  23. package/spec/spec/components/dials/cylindrical-vertical.md +0 -100
  24. package/spec/spec/components/dials/mode-dial.md +0 -123
  25. package/spec/spec/components/dials/radial-knob.md +0 -150
  26. package/spec/spec/components/dials/rotary-encoder.md +0 -118
  27. package/spec/spec/components/forms/color-picker.md +0 -99
  28. package/spec/spec/components/forms/file-input.md +0 -105
  29. package/spec/spec/components/forms/search-bar.md +0 -96
  30. package/spec/spec/components/forms/select.md +0 -143
  31. package/spec/spec/components/forms/text-input.md +0 -114
  32. package/spec/spec/components/forms/textarea.md +0 -85
  33. package/spec/spec/components/indicators/accordion.md +0 -137
  34. package/spec/spec/components/indicators/badges.md +0 -87
  35. package/spec/spec/components/indicators/chips.md +0 -93
  36. package/spec/spec/components/indicators/led-dots.md +0 -103
  37. package/spec/spec/components/indicators/mode-badge.md +0 -97
  38. package/spec/spec/components/indicators/profile-badge.md +0 -99
  39. package/spec/spec/components/indicators/skeleton.md +0 -94
  40. package/spec/spec/components/indicators/spinners.md +0 -95
  41. package/spec/spec/components/indicators/status-chips.md +0 -85
  42. package/spec/spec/components/indicators/transport-controls.md +0 -114
  43. package/spec/spec/components/meters/battery-icon.md +0 -104
  44. package/spec/spec/components/meters/eq-bars.md +0 -93
  45. package/spec/spec/components/meters/ev-meter.md +0 -96
  46. package/spec/spec/components/meters/exposure-scale.md +0 -110
  47. package/spec/spec/components/meters/gauge-full.md +0 -102
  48. package/spec/spec/components/meters/gauge-semi.md +0 -113
  49. package/spec/spec/components/meters/histogram.md +0 -70
  50. package/spec/spec/components/meters/level-indicator.md +0 -95
  51. package/spec/spec/components/meters/oscilloscope.md +0 -83
  52. package/spec/spec/components/meters/progress-bar.md +0 -84
  53. package/spec/spec/components/meters/signal-bars.md +0 -80
  54. package/spec/spec/components/meters/signal-meter.md +0 -84
  55. package/spec/spec/components/meters/vu-meter.md +0 -88
  56. package/spec/spec/components/meters/waveform.md +0 -70
  57. package/spec/spec/components/navigation/breadcrumbs.md +0 -94
  58. package/spec/spec/components/navigation/context-menu.md +0 -94
  59. package/spec/spec/components/navigation/d-pad.md +0 -121
  60. package/spec/spec/components/navigation/drawer.md +0 -103
  61. package/spec/spec/components/navigation/menu-grid.md +0 -113
  62. package/spec/spec/components/navigation/menu-list.md +0 -134
  63. package/spec/spec/components/navigation/pagination.md +0 -100
  64. package/spec/spec/components/navigation/rack-panel.md +0 -124
  65. package/spec/spec/components/navigation/scrollbar.md +0 -97
  66. package/spec/spec/components/navigation/status-bar.md +0 -117
  67. package/spec/spec/components/navigation/tab-bar.md +0 -104
  68. package/spec/spec/components/overlays/chassis-panel.md +0 -94
  69. package/spec/spec/components/overlays/device-bezel.md +0 -83
  70. package/spec/spec/components/overlays/dialog.md +0 -100
  71. package/spec/spec/components/overlays/focus-brackets.md +0 -124
  72. package/spec/spec/components/overlays/grid-overlay.md +0 -93
  73. package/spec/spec/components/overlays/modal.md +0 -89
  74. package/spec/spec/components/overlays/panel.md +0 -114
  75. package/spec/spec/components/overlays/plastic-card.md +0 -92
  76. package/spec/spec/components/overlays/popover.md +0 -75
  77. package/spec/spec/components/overlays/toast.md +0 -93
  78. package/spec/spec/components/overlays/tooltip.md +0 -85
  79. package/spec/spec/components/readouts/camera-readout.md +0 -123
  80. package/spec/spec/components/readouts/dot-matrix.md +0 -88
  81. package/spec/spec/components/readouts/lcd-readout.md +0 -116
  82. package/spec/spec/components/readouts/resource-monitor.md +0 -98
  83. package/spec/spec/components/readouts/seven-segment.md +0 -110
  84. package/spec/spec/components/readouts/signal-display.md +0 -93
  85. package/spec/spec/components/readouts/timecode-display.md +0 -94
  86. package/spec/spec/components/sliders/crossfader.md +0 -102
  87. package/spec/spec/components/sliders/dual-range.md +0 -97
  88. package/spec/spec/components/sliders/range-fader.md +0 -100
  89. package/spec/spec/components/sliders/scrubber.md +0 -104
  90. package/spec/spec/components/sliders/stepper.md +0 -106
  91. package/spec/spec/components/sliders/vertical-fader.md +0 -116
  92. package/spec/spec/components/sliders/volume-slider.md +0 -107
  93. package/spec/spec/components/toggles/dip-switch.md +0 -100
  94. package/spec/spec/components/toggles/led-checkbox.md +0 -108
  95. package/spec/spec/components/toggles/power-toggle.md +0 -93
  96. package/spec/spec/components/toggles/radio-button.md +0 -106
  97. package/spec/spec/components/toggles/rocker-switch.md +0 -92
  98. package/spec/spec/components/toggles/slide-switch.md +0 -121
  99. package/spec/spec/components/toggles/toggle-switch.md +0 -135
  100. package/spec/spec/compositions/audio-mixer-strip.md +0 -62
  101. package/spec/spec/compositions/camera-viewfinder.md +0 -66
  102. package/spec/spec/compositions/phone-interface.md +0 -66
  103. package/spec/spec/foundation/accessibility.md +0 -33
  104. package/spec/spec/foundation/canvas.md +0 -20
  105. package/spec/spec/foundation/depth-model.md +0 -82
  106. package/spec/spec/foundation/layout.md +0 -33
  107. package/spec/spec/foundation/materials.md +0 -68
  108. package/spec/spec/foundation/naming.md +0 -33
  109. package/spec/spec/foundation/philosophy.md +0 -27
  110. package/spec/spec/foundation/theme.md +0 -39
  111. package/spec/spec/foundation/tokens.md +0 -148
  112. package/spec/spec/guides/extension.md +0 -189
  113. package/spec/spec/guides/for-llms.md +0 -129
  114. package/spec/spec/guides/prompt-templates.md +0 -143
@@ -1,105 +0,0 @@
1
- ---
2
- name: REC Button
3
- id: rec-btn
4
- class: .rec-btn
5
- category: buttons
6
- index: 6
7
- materials: [polycarbonate-red]
8
- sizes: [md]
9
- interactive: true
10
- requires_js: true
11
- canvas: false
12
- ---
13
-
14
- # REC Button
15
-
16
- ## Physical Analog
17
- **Reference devices**: Sony FX6/FX9 record button, Canon C300 REC, Panasonic GH5 video record.
18
- **Mechanism**: Momentary push switch (not a toggle -- each press toggles recording state in firmware). Physically distinct: concave surface (dished inward), red-dyed polycarbonate, guard ring prevents accidental activation.
19
-
20
- ## Geometry
21
-
22
- | Property | Value |
23
- |----------|-------|
24
- | Diameter | 12-16mm real / 52px UI |
25
- | Surface | Concave (center 1-2mm lower than rim) |
26
- | Guard ring | Two concentric rings separated by dark gap |
27
- | Radial gradient offset | 38% 32% (upper-left, not centered) |
28
- | Stop square (recording) | 18x18px white square inside |
29
-
30
- ## CSS Recipe
31
-
32
- ### Default State
33
- ```css
34
- .rec-btn {
35
- width: 52px; height: 52px; border-radius: 50%;
36
- background: radial-gradient(circle at 38% 32%, #e83300, #7a0000 75%);
37
- border: none; outline: none; cursor: pointer; position: relative;
38
- box-shadow: 0 0 0 3px var(--bg-raised), 0 0 0 5px #333,
39
- 0 3px 0 var(--border-deep), inset 0 1px 0 #ff4422;
40
- transition: transform 0.07s, box-shadow 0.07s;
41
- }
42
- ```
43
-
44
- ### Active (Pressed) State
45
- ```css
46
- .rec-btn:active {
47
- transform: scale(0.94);
48
- box-shadow: 0 0 0 3px var(--bg-raised), 0 0 0 5px #333,
49
- 0 1px 0 var(--border-deep), inset 0 1px 0 #881100;
50
- }
51
- ```
52
-
53
- ### Recording State
54
- ```css
55
- .rec-btn.recording {
56
- box-shadow: 0 0 0 3px var(--bg-raised), 0 0 0 5px rgba(204,34,0,0.4),
57
- 0 3px 0 var(--border-deep), inset 0 1px 0 #ff4422, 0 0 18px rgba(204,34,0,0.4);
58
- }
59
- ```
60
-
61
- ### Inner Stop Square
62
- ```css
63
- .rec-btn .rec-inner {
64
- position: absolute; top: 50%; left: 50%;
65
- transform: translate(-50%,-50%) scale(0);
66
- width: 18px; height: 18px; background: #fff;
67
- border-radius: 3px; transition: transform 0.15s ease; opacity: 0.9;
68
- }
69
- .rec-btn.recording .rec-inner {
70
- transform: translate(-50%,-50%) scale(1);
71
- border-radius: 4px; background: #ffdddd;
72
- }
73
- ```
74
-
75
- ## HTML Structure
76
- ```html
77
- <button class="rec-btn" id="recBtn">
78
- <div class="rec-inner"></div>
79
- </button>
80
- <span>STANDBY</span>
81
- ```
82
-
83
- ## Size Variants
84
- No size variants. Fixed at 52x52px.
85
-
86
- ## Material Variants
87
- Single material: red-dyed polycarbonate with concave radial gradient.
88
-
89
- ## Theme Behavior
90
- - Guard ring uses `var(--bg-raised)` for the dark gap, adapting to theme
91
- - Red gradient and glow colors are fixed regardless of theme
92
- - `--border-deep` adapts the bottom edge shadow per theme
93
-
94
- ## Constraints
95
- 1. Surface MUST be concave (radial-gradient at 38% 32%, not centered). Concave surfaces reflect light from off-axis.
96
- 2. Guard ring MUST use two concentric `box-shadow` rings: `0 0 0 3px bg-raised` (dark gap) then `0 0 0 5px #333` (chrome ring).
97
- 3. Press feedback is `scale(0.94)`, NOT `translateY`. Round buttons depress, not shift.
98
- 4. Recording glow MUST be 18px radius red glow on the guard ring.
99
- 5. Stop square appears via `transform: scale(0 -> 1)` transition, not opacity.
100
-
101
- ## Accessibility
102
- - Uses native `<button>` element
103
- - Keyboard: Enter/Space to toggle recording state
104
- - ARIA: Should include `aria-pressed` to indicate recording state
105
- - Requires JS to toggle `.recording` class
@@ -1,100 +0,0 @@
1
- ---
2
- name: Rubber Button
3
- id: rubber-btn
4
- class: .rubber-btn
5
- category: buttons
6
- index: 3
7
- materials: [rubber]
8
- sizes: [xs, sm, md]
9
- interactive: true
10
- requires_js: false
11
- canvas: false
12
- ---
13
-
14
- # Rubber Button
15
-
16
- ## Physical Analog
17
- **Reference devices**: Game Boy Advance Start/Select, Nokia 3310 side buttons, Sony Walkman transport controls.
18
- **Mechanism**: Conductive rubber dome (vulcanized silicone). Single piece with conductive carbon pill inside. Silicone deforms progressively, pushing carbon pill onto PCB traces. No sharp click -- soft, damped tactile feel. Silicone elasticity provides return force.
19
-
20
- ## Geometry
21
-
22
- | Property | Value |
23
- |----------|-------|
24
- | Surface finish | Matte (naturally low specular reflection) |
25
- | Shape | Pill-shaped (oblong with fully rounded ends) |
26
- | Travel | 0.5-1.0mm (more than metal dome switches) |
27
- | Highlight opacity | 0.06 (vs 0.14 for glossy) |
28
-
29
- ## CSS Recipe
30
-
31
- ### Default State
32
- ```css
33
- .rubber-btn {
34
- display: inline-flex; align-items: center; justify-content: center;
35
- font-family: var(--font-ui); font-size: 10px; font-weight: 600;
36
- letter-spacing: 1px; color: var(--text-secondary);
37
- background: linear-gradient(180deg, var(--rubber-hi), var(--rubber-bg));
38
- border: none; border-radius: var(--radius-pill); cursor: pointer;
39
- height: 34px; min-width: 56px; padding: 0 14px;
40
- box-shadow: 0 2px 0 var(--border-deep), inset 0 1px 0 rgba(255,255,255,0.08);
41
- transition: transform 0.07s var(--snap-fast), box-shadow 0.07s var(--snap-fast);
42
- }
43
- ```
44
-
45
- ### Active (Pressed) State
46
- ```css
47
- .rubber-btn:active {
48
- transform: translateY(1px);
49
- box-shadow: 0 1px 0 var(--border-deep);
50
- }
51
- ```
52
-
53
- ### Active (Selected) State
54
- ```css
55
- .rubber-btn.active { color: var(--green-on); background: linear-gradient(180deg,#2a3a2a,#1a2a1a); }
56
- ```
57
-
58
- ### Light Theme Overrides
59
- ```css
60
- [data-theme="light"] .rubber-btn.active { background: linear-gradient(180deg,#c0dcc0,#a0cca0); }
61
- ```
62
-
63
- ## HTML Structure
64
- ```html
65
- <!-- Basic -->
66
- <button class="rubber-btn">RUBBER</button>
67
-
68
- <!-- Active -->
69
- <button class="rubber-btn active">ACTIVE</button>
70
-
71
- <!-- Small -->
72
- <button class="rubber-btn xs">XS</button>
73
- ```
74
-
75
- ## Size Variants
76
-
77
- | Size | Height | Min-Width | Font-Size | Padding |
78
- |------|--------|-----------|-----------|---------|
79
- | `.xs` | 24px | 40px | 8px | 0 8px |
80
- | `.sm` | 28px | 48px | 9px | 0 10px |
81
- | default | 34px | 56px | 10px | 0 14px |
82
-
83
- ## Material Variants
84
- Single material: rubber (soft-touch matte). Uses `--rubber-hi` and `--rubber-bg` tokens.
85
-
86
- ## Theme Behavior
87
- - Dark: `--rubber-bg: #2a2826`, `--rubber-hi: #3a3835`
88
- - Light: `--rubber-bg: #c8c4bc`, `--rubber-hi: #d8d4cc`
89
- - Active state uses different green gradients per theme
90
-
91
- ## Constraints
92
- 1. Highlight opacity MUST be `0.06-0.08`, not `0.14`. Matte surface = minimal specular reflection.
93
- 2. Gradient delta between stops MUST be very small (nearly flat). Rubber has no dome catch-light.
94
- 3. Border-radius MUST be `100px` (pill shape). Rectangular rubber buttons look wrong.
95
- 4. Press uses `--snap-fast` easing with slight overshoot to simulate silicone squish.
96
-
97
- ## Accessibility
98
- - Uses native `<button>` element
99
- - Keyboard: Enter/Space to activate
100
- - Focus: Browser default focus ring preserved
@@ -1,95 +0,0 @@
1
- ---
2
- name: Segmented Control
3
- id: segmented
4
- class: .segmented
5
- category: buttons
6
- index: 9
7
- materials: [panel, glossy]
8
- sizes: [md]
9
- interactive: true
10
- requires_js: true
11
- canvas: false
12
- ---
13
-
14
- # Segmented Control
15
-
16
- ## Physical Analog
17
- **Reference devices**: Camera mode selector (Photo/Video/Slow), audio input selector (Mic/Line/Phono), Sony MiniDisc player play-mode switch.
18
- **Mechanism**: DIP switch bank or slide-selector switch. Row of mechanically interlocked buttons where pressing one releases the previously pressed button (mutually exclusive). Each button pushes a metal leaf contact onto a bus bar. Interlock mechanism ensures only one circuit is closed at a time.
19
-
20
- ## Geometry
21
-
22
- | Property | Value |
23
- |----------|-------|
24
- | Track | Recessed (bg-inset with inset shadow) |
25
- | Segment padding | 6px 14px |
26
- | Border-radius | var(--radius-md) outer, -2px inner |
27
- | Active segment | Raised with shadow and glossy highlight |
28
-
29
- ## CSS Recipe
30
-
31
- ### Container (Track)
32
- ```css
33
- .segmented {
34
- display: inline-flex; background: var(--bg-inset);
35
- border: 1px solid var(--border-subtle); border-radius: var(--radius-md);
36
- padding: 3px; box-shadow: var(--shadow-inset);
37
- }
38
- ```
39
-
40
- ### Segment Item
41
- ```css
42
- .segmented-item {
43
- padding: 6px 14px; border: none; background: transparent;
44
- font-family: var(--font-ui); font-size: 10px; font-weight: 500;
45
- letter-spacing: 1px; color: var(--text-muted); cursor: pointer;
46
- border-radius: calc(var(--radius-md) - 2px);
47
- transition: all 0.15s var(--snap-fast);
48
- }
49
- ```
50
-
51
- ### Hover State
52
- ```css
53
- .segmented-item:hover { color: var(--text-primary); }
54
- ```
55
-
56
- ### Active (Selected) State
57
- ```css
58
- .segmented-item.active {
59
- background: var(--bg-surface); color: var(--amber);
60
- box-shadow: 0 1px 3px rgba(0,0,0,0.2), inset 0 1px 0 var(--glossy-hi);
61
- }
62
- ```
63
-
64
- ## HTML Structure
65
- ```html
66
- <div class="segmented">
67
- <button class="segmented-item active">PHOTO</button>
68
- <button class="segmented-item">VIDEO</button>
69
- <button class="segmented-item">SLOW</button>
70
- </div>
71
- ```
72
-
73
- ## Size Variants
74
- No explicit size variants defined.
75
-
76
- ## Material Variants
77
- - Track: Recessed panel (phosphor screen cavity)
78
- - Active segment: Raised glossy surface with specular highlight
79
-
80
- ## Theme Behavior
81
- - `--bg-inset` provides the recessed track color per theme
82
- - `--shadow-inset` adapts shadow intensity per theme
83
- - Active segment surface and shadow adapt via tokens
84
-
85
- ## Constraints
86
- 1. Only ONE item can be `.active` at a time (radio behavior, NOT multi-select).
87
- 2. Active item MUST look physically raised relative to the track -- use shadow and highlight to create depth differential.
88
- 3. Track padding (3px) creates the visible gap between segment buttons and track walls.
89
- 4. Inner border-radius MUST be `calc(var(--radius-md) - 2px)` to nest correctly inside outer radius.
90
-
91
- ## Accessibility
92
- - Uses native `<button>` elements
93
- - Keyboard: Arrow keys to navigate between segments, Enter to select
94
- - ARIA: Container should use `role="radiogroup"`, items should use `role="radio"` with `aria-checked`
95
- - Requires JS to toggle `.active` class between items (mutual exclusion)
@@ -1,135 +0,0 @@
1
- ---
2
- name: Assembled Panel
3
- id: assembled-panel
4
- class: .panel
5
- category: data
6
- index: 4
7
- materials: [brushed-metal, rubber, glossy-polycarbonate, phosphor-screen]
8
- sizes: [default]
9
- interactive: true
10
- requires_js: true
11
- canvas: true
12
- ---
13
-
14
- # Assembled Panel
15
-
16
- ## Physical Analog
17
- **Reference devices**: Camera Viewfinder HUD, Audio Mixer Strip, complete equipment front panels.
18
- **Mechanism**: An assembled panel is not a single component but a composition of multiple pudge-ui components within a Panel container (I1). This document describes the composition rules and patterns for building complex, multi-component panels that maintain physical plausibility.
19
-
20
- ## Geometry
21
-
22
- | Property | Value |
23
- |----------|-------|
24
- | Container | `.panel` (I1) with `--radius-lg` |
25
- | Padding | 22px (panel standard) |
26
- | Intra-group gap | `--space-md` (14px) |
27
- | Inter-group gap | `--space-lg` (22px) |
28
- | Grid layout | `repeat(auto-fit, minmax(340px, 1fr))` |
29
-
30
- ## CSS Recipe
31
-
32
- Assembled panels use the base `.panel` CSS from I1, combined with layout utilities:
33
-
34
- ### Panel container
35
- ```css
36
- .panel {
37
- position: relative;
38
- background: linear-gradient(180deg, var(--bg-surface), var(--bg-panel));
39
- border: 1px solid var(--border-mid); border-radius: var(--radius-lg);
40
- padding: 22px;
41
- box-shadow: 0 2px 0 var(--border-deep), 0 10px 28px rgba(0,0,0,0.3), inset 0 1px 0 var(--border-hi);
42
- overflow: hidden;
43
- }
44
- ```
45
-
46
- ### Layout helpers
47
- ```css
48
- .flex-row { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; }
49
- .flex-col { display: flex; flex-direction: column; gap: 8px; }
50
- ```
51
-
52
- ### Serial / fabrication block
53
- ```css
54
- .serial { margin-top: 16px; color: var(--text-muted); font-size: 9px; letter-spacing: 2px; display: flex; justify-content: space-between; font-family: var(--font-ui); }
55
- ```
56
-
57
- ## HTML Structure
58
-
59
- ### Example: Diagnostic Panel
60
- ```html
61
- <div class="panel" style="width:360px">
62
- <div class="panel-title">SYSTEM DIAGNOSTICS</div>
63
-
64
- <!-- Status bar at top -->
65
- <div class="status-bar" style="margin-bottom:14px">
66
- <span class="sb-time">14:32</span>
67
- <div class="sb-icons">
68
- <div class="led-dot green"></div>
69
- </div>
70
- </div>
71
-
72
- <!-- Mode indicator -->
73
- <div class="flex-row" style="gap:8px;margin-bottom:14px">
74
- <div class="mode-badge">
75
- <span class="mode-letter">M</span>
76
- <div class="mode-detail"><span class="mode-key">MODE</span><span class="mode-sub">Manual</span></div>
77
- </div>
78
- <div class="chip-row">
79
- <div class="status-chip active">ONLINE</div>
80
- <div class="status-chip">REMOTE</div>
81
- </div>
82
- </div>
83
-
84
- <!-- Data readout -->
85
- <table class="data-table" style="margin-bottom:14px">
86
- <thead><tr><th>PARAM</th><th>VALUE</th><th>STATUS</th></tr></thead>
87
- <tbody>
88
- <tr><td>CPU</td><td class="val">72C</td><td><div class="led-dot green"></div></td></tr>
89
- <tr><td>MEM</td><td class="val">8.2G</td><td><div class="led-dot green"></div></td></tr>
90
- </tbody>
91
- </table>
92
-
93
- <!-- Controls -->
94
- <div class="flex-row" style="gap:8px">
95
- <button class="push-btn xs active">MODE</button>
96
- <button class="push-btn xs">RESET</button>
97
- <button class="push-btn xs">CONFIG</button>
98
- </div>
99
-
100
- <div class="serial"><span>REV-C</span><span>UNIT-07</span></div>
101
- </div>
102
- ```
103
-
104
- ## Size Variants
105
- No size variants defined. Assembled panels scale to content and container.
106
-
107
- ## Material Variants
108
- Assembled panels can combine multiple materials following the 2-material rule:
109
- - Panel body: brushed metal or glossy polycarbonate
110
- - Controls within: rubber buttons, glossy buttons, phosphor displays
111
- - Maximum 2 materials per panel for physical plausibility
112
-
113
- ## Theme Behavior
114
- - All sub-components follow their individual theme rules
115
- - Panel container follows I1 Panel theme behavior
116
- - Consistent lighting direction must be maintained (all gradients top-to-bottom)
117
-
118
- ## Constraints
119
-
120
- ### Composition Rules (from design.md)
121
- 1. **Hierarchy**: The panel container (I1) provides the outer frame. Content is organized in rows/columns within.
122
- 2. **Spacing**: Use `--space-md` (14px) for gaps between related components, `--space-lg` (22px) for gaps between groups.
123
- 3. **Consistent lighting**: All components in a panel share the same light direction (top-left). MUST NOT mix components with different gradient directions.
124
- 4. **Status bar placement**: Status information (status bar, mode badges, battery) goes at the TOP edge. Controls go in the MIDDLE. Metadata (serial numbers, timecodes) goes at the BOTTOM.
125
- 5. **Material consistency**: Within a single panel, use at most 2 materials (e.g., brushed metal knobs on a rubber panel surface). Too many materials in one panel breaks physical plausibility.
126
- 6. MUST include serial/revision block at the bottom (manufacturing authenticity detail).
127
- 7. MUST use `.panel-title` with `--font-display` for the panel name.
128
- 8. MUST use `.panel-label` for section dividers within the panel.
129
-
130
- ## Accessibility
131
- - Assembled panel should use `role="region"` with `aria-label` describing the panel purpose
132
- - Internal sections should use appropriate heading levels
133
- - Tab order within the panel should follow visual top-to-bottom, left-to-right order
134
- - All sub-component accessibility rules apply individually
135
- - Complex panels may benefit from `aria-describedby` pointing to a usage description
@@ -1,116 +0,0 @@
1
- ---
2
- name: Data Table
3
- id: data-table
4
- class: .data-table
5
- category: data
6
- index: 1
7
- materials: [phosphor-screen]
8
- sizes: [default]
9
- interactive: true
10
- requires_js: false
11
- canvas: false
12
- ---
13
-
14
- # Data Table
15
-
16
- ## Physical Analog
17
- **Reference devices**: Diagnostic readout grids on server equipment, oscilloscope measurement tables, BIOS setup tables.
18
- **Mechanism**: Tabular data arranged in a monospace font within a recessed display area. The header row uses a separate background (equipment panels often had a silk-screened label strip above the data area). Hover highlighting simulates the movable cursor/indicator on hardware diagnostic screens.
19
-
20
- ## Geometry
21
-
22
- | Property | Value |
23
- |----------|-------|
24
- | Width | 100% |
25
- | Header padding | 8px 12px |
26
- | Cell padding | 6px 12px |
27
- | Header font size | 9px |
28
- | Cell font size | 11px |
29
- | Value font size | 12px (`.val` cells) |
30
- | Border radius | `--radius-md` (8px) |
31
-
32
- ## CSS Recipe
33
-
34
- ### Table (`.data-table`)
35
- ```css
36
- .data-table {
37
- width: 100%; border-collapse: collapse;
38
- font-family: var(--font-mono); font-size: 11px;
39
- background: var(--bg-inset); border: 1px solid var(--border-subtle);
40
- border-radius: var(--radius-md); overflow: hidden;
41
- }
42
- ```
43
-
44
- ### Header cells
45
- ```css
46
- .data-table th {
47
- padding: 8px 12px; text-align: left;
48
- font-family: var(--font-ui); font-size: 9px; font-weight: 600;
49
- letter-spacing: 2px; color: var(--text-muted); text-transform: uppercase;
50
- background: var(--bg-surface); border-bottom: 1px solid var(--border-subtle);
51
- }
52
- ```
53
-
54
- ### Data cells
55
- ```css
56
- .data-table td {
57
- padding: 6px 12px; color: var(--text-primary);
58
- border-bottom: 1px solid rgba(128,128,128,0.06);
59
- }
60
- .data-table tr:last-child td { border-bottom: none; }
61
- ```
62
-
63
- ### Row hover
64
- ```css
65
- .data-table tr:hover td { background: var(--glow-color); }
66
- ```
67
-
68
- ### Value cells (`.val`)
69
- ```css
70
- .data-table td.val { color: var(--amber); font-family: var(--font-display); font-size: 12px; }
71
- ```
72
-
73
- ## HTML Structure
74
- ```html
75
- <table class="data-table" style="width:360px">
76
- <thead>
77
- <tr><th>PARAMETER</th><th>VALUE</th><th>STATUS</th></tr>
78
- </thead>
79
- <tbody>
80
- <tr><td>CPU Temp</td><td class="val">72&deg;C</td><td><div class="led-dot green"></div></td></tr>
81
- <tr><td>Fan Speed</td><td class="val">2400</td><td><div class="led-dot green"></div></td></tr>
82
- <tr><td>Voltage</td><td class="val">12.1V</td><td><div class="led-dot amber"></div></td></tr>
83
- <tr><td>Clock</td><td class="val">3.6GHz</td><td><div class="led-dot green"></div></td></tr>
84
- </tbody>
85
- </table>
86
- ```
87
-
88
- ## Size Variants
89
- No size variants defined. Width is 100% of parent container.
90
-
91
- ## Material Variants
92
- No material variants. Uses phosphor screen (recessed) background with surface-colored header.
93
-
94
- ## Theme Behavior
95
- - Table background uses `--bg-inset` (recessed data display area)
96
- - Header uses `--bg-surface` (raised label strip above data)
97
- - Row separators are very subtle (`rgba(128,128,128,0.06)`)
98
- - Hover highlight uses `--glow-color`
99
- - Value cells use `--amber` (constant across themes)
100
-
101
- ## Constraints
102
- 1. MUST use monospace font (`--font-mono`) for data cells
103
- 2. Header MUST use UI font (`--font-ui`) with uppercase, 2px letter-spacing
104
- 3. Header MUST have distinct background (`--bg-surface`) from data area
105
- 4. Value cells (`.val`) MUST use amber color and display font
106
- 5. MUST use `border-collapse: collapse` for clean grid lines
107
- 6. MUST use `overflow: hidden` to clip border-radius
108
- 7. Row separators MUST be very subtle (6% opacity)
109
- 8. Hover MUST highlight entire row
110
-
111
- ## Accessibility
112
- - Use semantic `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` elements
113
- - Include `<caption>` or `aria-label` on table for screen readers
114
- - `<th>` elements should have `scope="col"` attribute
115
- - Ensure sufficient color contrast for all text
116
- - LED dots in cells should have `aria-label` describing status
@@ -1,110 +0,0 @@
1
- ---
2
- name: Film Strip
3
- id: film-strip
4
- class: .film-strip
5
- category: data
6
- index: 3
7
- materials: []
8
- sizes: [default]
9
- interactive: true
10
- requires_js: true
11
- canvas: false
12
- ---
13
-
14
- # Film Strip
15
-
16
- ## Physical Analog
17
- **Reference devices**: Camera filmstrip playback view, video editing timeline, 35mm film strip.
18
- **Mechanism**: A horizontal row of image thumbnails with sprocket hole borders -- the perforations along the edges of 35mm motion picture film. In real film, these holes engage with the camera/projector's claw mechanism to advance the film one frame at a time. The `::before` and `::after` pseudo-elements with `repeating-linear-gradient` create the sprocket hole pattern along the top and bottom edges of the strip.
19
-
20
- ## Geometry
21
-
22
- | Property | Value |
23
- |----------|-------|
24
- | Frame size | 60x40px |
25
- | Frame gap | 4px |
26
- | Strip padding | 8px |
27
- | Sprocket strip width | 8px |
28
- | Frame border radius | 2px |
29
- | Background | #0a0a0a (film base color) |
30
-
31
- ## CSS Recipe
32
-
33
- ### Strip container (`.film-strip`)
34
- ```css
35
- .film-strip {
36
- display: flex; gap: 4px; padding: 8px;
37
- background: #0a0a0a; border: 1px solid #1e1e1e;
38
- border-radius: var(--radius-sm); overflow-x: auto;
39
- }
40
- ```
41
-
42
- ### Sprocket holes
43
- ```css
44
- .film-strip::before, .film-strip::after {
45
- content: ''; flex-shrink: 0; width: 8px;
46
- background: repeating-linear-gradient(0deg, transparent 0px, transparent 6px, #333 6px, #333 8px);
47
- }
48
- ```
49
-
50
- ### Frame (`.film-frame`)
51
- ```css
52
- .film-frame {
53
- flex-shrink: 0; width: 60px; height: 40px;
54
- background: var(--bg-surface); border: 1px solid #333;
55
- border-radius: 2px; display: flex; align-items: center; justify-content: center;
56
- font-size: 9px; color: var(--text-muted); cursor: pointer;
57
- transition: border-color 0.12s;
58
- }
59
- ```
60
-
61
- ### Frame hover
62
- ```css
63
- .film-frame:hover { border-color: var(--amber); }
64
- ```
65
-
66
- ### Frame selected
67
- ```css
68
- .film-frame.selected { border-color: var(--amber); box-shadow: 0 0 6px var(--amber-glow); }
69
- ```
70
-
71
- ## HTML Structure
72
- ```html
73
- <div class="film-strip" style="width:320px">
74
- <div class="film-frame">F01</div>
75
- <div class="film-frame selected">F02</div>
76
- <div class="film-frame">F03</div>
77
- <div class="film-frame">F04</div>
78
- <div class="film-frame">F05</div>
79
- </div>
80
- ```
81
-
82
- ## Size Variants
83
- No size variants defined.
84
-
85
- ## Material Variants
86
- No material variants. Uses fixed film-base colors (dark, non-themed).
87
-
88
- ## Theme Behavior
89
- - Film strip background is FIXED (#0a0a0a) -- does not change with theme
90
- - Film base border is FIXED (#1e1e1e)
91
- - Frame borders are FIXED (#333)
92
- - Frame content area uses `--bg-surface` for placeholder backgrounds
93
- - Selected glow always uses amber
94
-
95
- ## Constraints
96
- 1. MUST include sprocket hole strips via `::before` and `::after` pseudo-elements
97
- 2. Sprocket pattern MUST use `repeating-linear-gradient` with 6px transparent + 2px colored
98
- 3. Film base MUST be near-black (#0a0a0a) regardless of theme
99
- 4. Frames MUST use fixed-width (`flex-shrink: 0`) to prevent squishing
100
- 5. MUST support horizontal scrolling (`overflow-x: auto`) for many frames
101
- 6. Frame border-radius MUST be minimal (2px) to match film frame corners
102
- 7. Selected frame MUST use amber border with amber glow (6px radius)
103
- 8. Hover MUST highlight frame border in amber
104
-
105
- ## Accessibility
106
- - Container should have `role="listbox"` or similar with `aria-label="Film strip"`
107
- - Frames should have `role="option"` with `aria-selected`
108
- - Support Left/Right arrow key navigation
109
- - Support keyboard scrolling
110
- - Include descriptive `aria-label` on each frame