@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.
- package/README.md +10 -0
- package/dist/tools.d.ts +25 -0
- package/dist/tools.js +23 -13
- package/package.json +5 -4
- package/spec/components/.gstack/browse.json.lock +1 -0
- package/spec/spec/components/_index.yaml +0 -822
- package/spec/spec/components/buttons/clear-button.md +0 -89
- package/spec/spec/components/buttons/fn-grid.md +0 -104
- package/spec/spec/components/buttons/gel-button.md +0 -125
- package/spec/spec/components/buttons/icon-button.md +0 -108
- package/spec/spec/components/buttons/keypad-button.md +0 -123
- package/spec/spec/components/buttons/push-button.md +0 -139
- package/spec/spec/components/buttons/rec-button.md +0 -105
- package/spec/spec/components/buttons/rubber-button.md +0 -100
- package/spec/spec/components/buttons/segmented-control.md +0 -95
- package/spec/spec/components/data/assembled-panel.md +0 -135
- package/spec/spec/components/data/data-table.md +0 -116
- package/spec/spec/components/data/film-strip.md +0 -110
- package/spec/spec/components/data/media-grid.md +0 -98
- package/spec/spec/components/dials/click-wheel.md +0 -115
- package/spec/spec/components/dials/cylindrical-horizontal.md +0 -130
- package/spec/spec/components/dials/cylindrical-scroll.md +0 -141
- package/spec/spec/components/dials/cylindrical-vertical.md +0 -100
- package/spec/spec/components/dials/mode-dial.md +0 -123
- package/spec/spec/components/dials/radial-knob.md +0 -150
- package/spec/spec/components/dials/rotary-encoder.md +0 -118
- package/spec/spec/components/forms/color-picker.md +0 -99
- package/spec/spec/components/forms/file-input.md +0 -105
- package/spec/spec/components/forms/search-bar.md +0 -96
- package/spec/spec/components/forms/select.md +0 -143
- package/spec/spec/components/forms/text-input.md +0 -114
- package/spec/spec/components/forms/textarea.md +0 -85
- package/spec/spec/components/indicators/accordion.md +0 -137
- package/spec/spec/components/indicators/badges.md +0 -87
- package/spec/spec/components/indicators/chips.md +0 -93
- package/spec/spec/components/indicators/led-dots.md +0 -103
- package/spec/spec/components/indicators/mode-badge.md +0 -97
- package/spec/spec/components/indicators/profile-badge.md +0 -99
- package/spec/spec/components/indicators/skeleton.md +0 -94
- package/spec/spec/components/indicators/spinners.md +0 -95
- package/spec/spec/components/indicators/status-chips.md +0 -85
- package/spec/spec/components/indicators/transport-controls.md +0 -114
- package/spec/spec/components/meters/battery-icon.md +0 -104
- package/spec/spec/components/meters/eq-bars.md +0 -93
- package/spec/spec/components/meters/ev-meter.md +0 -96
- package/spec/spec/components/meters/exposure-scale.md +0 -110
- package/spec/spec/components/meters/gauge-full.md +0 -102
- package/spec/spec/components/meters/gauge-semi.md +0 -113
- package/spec/spec/components/meters/histogram.md +0 -70
- package/spec/spec/components/meters/level-indicator.md +0 -95
- package/spec/spec/components/meters/oscilloscope.md +0 -83
- package/spec/spec/components/meters/progress-bar.md +0 -84
- package/spec/spec/components/meters/signal-bars.md +0 -80
- package/spec/spec/components/meters/signal-meter.md +0 -84
- package/spec/spec/components/meters/vu-meter.md +0 -88
- package/spec/spec/components/meters/waveform.md +0 -70
- package/spec/spec/components/navigation/breadcrumbs.md +0 -94
- package/spec/spec/components/navigation/context-menu.md +0 -94
- package/spec/spec/components/navigation/d-pad.md +0 -121
- package/spec/spec/components/navigation/drawer.md +0 -103
- package/spec/spec/components/navigation/menu-grid.md +0 -113
- package/spec/spec/components/navigation/menu-list.md +0 -134
- package/spec/spec/components/navigation/pagination.md +0 -100
- package/spec/spec/components/navigation/rack-panel.md +0 -124
- package/spec/spec/components/navigation/scrollbar.md +0 -97
- package/spec/spec/components/navigation/status-bar.md +0 -117
- package/spec/spec/components/navigation/tab-bar.md +0 -104
- package/spec/spec/components/overlays/chassis-panel.md +0 -94
- package/spec/spec/components/overlays/device-bezel.md +0 -83
- package/spec/spec/components/overlays/dialog.md +0 -100
- package/spec/spec/components/overlays/focus-brackets.md +0 -124
- package/spec/spec/components/overlays/grid-overlay.md +0 -93
- package/spec/spec/components/overlays/modal.md +0 -89
- package/spec/spec/components/overlays/panel.md +0 -114
- package/spec/spec/components/overlays/plastic-card.md +0 -92
- package/spec/spec/components/overlays/popover.md +0 -75
- package/spec/spec/components/overlays/toast.md +0 -93
- package/spec/spec/components/overlays/tooltip.md +0 -85
- package/spec/spec/components/readouts/camera-readout.md +0 -123
- package/spec/spec/components/readouts/dot-matrix.md +0 -88
- package/spec/spec/components/readouts/lcd-readout.md +0 -116
- package/spec/spec/components/readouts/resource-monitor.md +0 -98
- package/spec/spec/components/readouts/seven-segment.md +0 -110
- package/spec/spec/components/readouts/signal-display.md +0 -93
- package/spec/spec/components/readouts/timecode-display.md +0 -94
- package/spec/spec/components/sliders/crossfader.md +0 -102
- package/spec/spec/components/sliders/dual-range.md +0 -97
- package/spec/spec/components/sliders/range-fader.md +0 -100
- package/spec/spec/components/sliders/scrubber.md +0 -104
- package/spec/spec/components/sliders/stepper.md +0 -106
- package/spec/spec/components/sliders/vertical-fader.md +0 -116
- package/spec/spec/components/sliders/volume-slider.md +0 -107
- package/spec/spec/components/toggles/dip-switch.md +0 -100
- package/spec/spec/components/toggles/led-checkbox.md +0 -108
- package/spec/spec/components/toggles/power-toggle.md +0 -93
- package/spec/spec/components/toggles/radio-button.md +0 -106
- package/spec/spec/components/toggles/rocker-switch.md +0 -92
- package/spec/spec/components/toggles/slide-switch.md +0 -121
- package/spec/spec/components/toggles/toggle-switch.md +0 -135
- package/spec/spec/compositions/audio-mixer-strip.md +0 -62
- package/spec/spec/compositions/camera-viewfinder.md +0 -66
- package/spec/spec/compositions/phone-interface.md +0 -66
- package/spec/spec/foundation/accessibility.md +0 -33
- package/spec/spec/foundation/canvas.md +0 -20
- package/spec/spec/foundation/depth-model.md +0 -82
- package/spec/spec/foundation/layout.md +0 -33
- package/spec/spec/foundation/materials.md +0 -68
- package/spec/spec/foundation/naming.md +0 -33
- package/spec/spec/foundation/philosophy.md +0 -27
- package/spec/spec/foundation/theme.md +0 -39
- package/spec/spec/foundation/tokens.md +0 -148
- package/spec/spec/guides/extension.md +0 -189
- package/spec/spec/guides/for-llms.md +0 -129
- 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°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
|