@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,124 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Rack Panel
|
|
3
|
-
id: rack-panel
|
|
4
|
-
class: .rack-panel
|
|
5
|
-
category: navigation
|
|
6
|
-
index: 6
|
|
7
|
-
materials: [brushed-metal]
|
|
8
|
-
sizes: [default]
|
|
9
|
-
interactive: true
|
|
10
|
-
requires_js: false
|
|
11
|
-
canvas: false
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Rack Panel
|
|
15
|
-
|
|
16
|
-
## Physical Analog
|
|
17
|
-
**Reference devices**: 19-inch rack-mount audio equipment front panels (Mackie, PreSonus, Behringer), modular synthesizer panels.
|
|
18
|
-
**Mechanism**: Derived from the 19-inch equipment rack standard (EIA-310). Audio, broadcast, and server equipment is mounted in standardized racks where each device occupies 1-4 "rack units" (1U = 1.75 inches / 44.45mm). The front panel of each device has controls and indicators arranged in a vertical strip. When multiple devices are stacked, they form a vertical sidebar of labeled modules.
|
|
19
|
-
|
|
20
|
-
## Geometry
|
|
21
|
-
|
|
22
|
-
| Property | Value |
|
|
23
|
-
|----------|-------|
|
|
24
|
-
| Width | 200px |
|
|
25
|
-
| Border radius | `--radius-lg` (14px) |
|
|
26
|
-
| Slot padding | 10px 14px |
|
|
27
|
-
| Indicator width | 4px |
|
|
28
|
-
| Indicator height | 20px |
|
|
29
|
-
| Font size | 10px |
|
|
30
|
-
|
|
31
|
-
## CSS Recipe
|
|
32
|
-
|
|
33
|
-
### Container (`.rack-panel`)
|
|
34
|
-
```css
|
|
35
|
-
.rack-panel {
|
|
36
|
-
width: 200px; background: var(--bg-raised);
|
|
37
|
-
border: 1px solid var(--border-subtle); border-radius: var(--radius-lg);
|
|
38
|
-
box-shadow: var(--shadow-deep); overflow: hidden;
|
|
39
|
-
}
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Slot (`.rack-slot`)
|
|
43
|
-
```css
|
|
44
|
-
.rack-slot {
|
|
45
|
-
padding: 10px 14px; border-bottom: 1px solid var(--border-subtle);
|
|
46
|
-
cursor: pointer; transition: background 0.12s;
|
|
47
|
-
display: flex; align-items: center; gap: 8px;
|
|
48
|
-
}
|
|
49
|
-
.rack-slot:last-child { border-bottom: none; }
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Hover
|
|
53
|
-
```css
|
|
54
|
-
.rack-slot:hover { background: var(--glow-color); }
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### Active
|
|
58
|
-
```css
|
|
59
|
-
.rack-slot.active { background: var(--glow-color); }
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### Indicator (`.rack-slot-indicator`)
|
|
63
|
-
```css
|
|
64
|
-
.rack-slot-indicator { width: 4px; height: 20px; border-radius: 2px; background: var(--border-mid); flex-shrink: 0; }
|
|
65
|
-
.rack-slot.active .rack-slot-indicator { background: var(--amber); box-shadow: 0 0 6px var(--amber-glow); }
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Label (`.rack-slot-label`)
|
|
69
|
-
```css
|
|
70
|
-
.rack-slot-label { font-family: var(--font-ui); font-size: 10px; font-weight: 500; color: var(--text-secondary); letter-spacing: 1px; }
|
|
71
|
-
.rack-slot.active .rack-slot-label { color: var(--amber); }
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## HTML Structure
|
|
75
|
-
```html
|
|
76
|
-
<div class="rack-panel">
|
|
77
|
-
<div class="rack-slot active">
|
|
78
|
-
<div class="rack-slot-indicator"></div>
|
|
79
|
-
<span class="rack-slot-label">CHANNEL 1</span>
|
|
80
|
-
</div>
|
|
81
|
-
<div class="rack-slot">
|
|
82
|
-
<div class="rack-slot-indicator"></div>
|
|
83
|
-
<span class="rack-slot-label">CHANNEL 2</span>
|
|
84
|
-
</div>
|
|
85
|
-
<div class="rack-slot">
|
|
86
|
-
<div class="rack-slot-indicator"></div>
|
|
87
|
-
<span class="rack-slot-label">CHANNEL 3</span>
|
|
88
|
-
</div>
|
|
89
|
-
<div class="rack-slot">
|
|
90
|
-
<div class="rack-slot-indicator"></div>
|
|
91
|
-
<span class="rack-slot-label">AUX SEND</span>
|
|
92
|
-
</div>
|
|
93
|
-
<div class="rack-slot">
|
|
94
|
-
<div class="rack-slot-indicator"></div>
|
|
95
|
-
<span class="rack-slot-label">MASTER</span>
|
|
96
|
-
</div>
|
|
97
|
-
</div>
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## Size Variants
|
|
101
|
-
No size variants defined.
|
|
102
|
-
|
|
103
|
-
## Material Variants
|
|
104
|
-
No material variants. Uses standard raised surface with deep shadow.
|
|
105
|
-
|
|
106
|
-
## Theme Behavior
|
|
107
|
-
- Background swaps via `--bg-raised` token
|
|
108
|
-
- Active indicator always uses `--amber` with amber glow
|
|
109
|
-
- Inactive indicator uses `--border-mid` (adapts to theme)
|
|
110
|
-
- Label color swaps between `--text-secondary` (inactive) and `--amber` (active)
|
|
111
|
-
|
|
112
|
-
## Constraints
|
|
113
|
-
1. MUST include 4px vertical LED indicator on left edge of each slot
|
|
114
|
-
2. Active channel indicator MUST glow amber (`0 0 6px var(--amber-glow)`)
|
|
115
|
-
3. Inactive indicators MUST show as dim lines (`--border-mid`), not hidden
|
|
116
|
-
4. Slots MUST be separated by `--border-subtle` bottom borders
|
|
117
|
-
5. MUST use fixed 200px width (rack module standard proportion)
|
|
118
|
-
6. MUST NOT use horizontal scroll -- content is vertical-only
|
|
119
|
-
|
|
120
|
-
## Accessibility
|
|
121
|
-
- Container should have `role="navigation"` or `role="tablist"` with `aria-orientation="vertical"`
|
|
122
|
-
- Slots should have `role="tab"` or be `<button>` elements
|
|
123
|
-
- Active slot: `aria-selected="true"` or `aria-current="true"`
|
|
124
|
-
- Support Up/Down arrow key navigation
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Custom Scrollbar
|
|
3
|
-
id: scrollbar
|
|
4
|
-
class: .custom-scrollbar-demo
|
|
5
|
-
category: navigation
|
|
6
|
-
index: 10
|
|
7
|
-
materials: []
|
|
8
|
-
sizes: [default]
|
|
9
|
-
interactive: true
|
|
10
|
-
requires_js: false
|
|
11
|
-
canvas: false
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Custom Scrollbar
|
|
15
|
-
|
|
16
|
-
## Physical Analog
|
|
17
|
-
**Reference devices**: Any scrollable display on equipment with limited real estate -- function lists on synthesizers, parameter pages on digital mixing consoles.
|
|
18
|
-
**Mechanism**: The scrollbar thumb represents the viewport's position within the total content, proportional to the ratio of visible content to total content. Derived from mechanical scroll mechanisms on typewriters and early plotters.
|
|
19
|
-
|
|
20
|
-
## Geometry
|
|
21
|
-
|
|
22
|
-
| Property | Value |
|
|
23
|
-
|----------|-------|
|
|
24
|
-
| Container width | 180px |
|
|
25
|
-
| Container height | 120px |
|
|
26
|
-
| Scrollbar width | 8px |
|
|
27
|
-
| Thumb border-radius | 4px |
|
|
28
|
-
| Track border-radius | 4px |
|
|
29
|
-
| Thumb border | 1px solid `--bg-inset` |
|
|
30
|
-
|
|
31
|
-
## CSS Recipe
|
|
32
|
-
|
|
33
|
-
### Container (`.custom-scrollbar-demo`)
|
|
34
|
-
```css
|
|
35
|
-
.custom-scrollbar-demo {
|
|
36
|
-
width: 180px; height: 120px; overflow-y: auto;
|
|
37
|
-
background: var(--bg-inset); border: 1px solid var(--border-subtle);
|
|
38
|
-
border-radius: var(--radius-md); padding: 10px;
|
|
39
|
-
font-family: var(--font-ui); font-size: 10px; color: var(--text-secondary);
|
|
40
|
-
line-height: 1.8;
|
|
41
|
-
}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Scrollbar track
|
|
45
|
-
```css
|
|
46
|
-
.custom-scrollbar-demo::-webkit-scrollbar { width: 8px; }
|
|
47
|
-
.custom-scrollbar-demo::-webkit-scrollbar-track { background: var(--bg-inset); border-radius: 4px; }
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### Scrollbar thumb
|
|
51
|
-
```css
|
|
52
|
-
.custom-scrollbar-demo::-webkit-scrollbar-thumb {
|
|
53
|
-
background: var(--border-mid); border-radius: 4px;
|
|
54
|
-
border: 1px solid var(--bg-inset);
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Thumb hover
|
|
59
|
-
```css
|
|
60
|
-
.custom-scrollbar-demo::-webkit-scrollbar-thumb:hover { background: var(--border-hi); }
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## HTML Structure
|
|
64
|
-
```html
|
|
65
|
-
<div class="custom-scrollbar-demo">
|
|
66
|
-
System log entries from diagnostic output. Channel 1 calibrated.
|
|
67
|
-
Channel 2 calibrated. Channel 3 online. Master bus active.
|
|
68
|
-
Signal routing complete. Buffer latency: 12ms. Sample rate: 48kHz.
|
|
69
|
-
Bit depth: 24-bit. Monitoring enabled. Output routed to main speakers.
|
|
70
|
-
</div>
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Size Variants
|
|
74
|
-
No size variants defined.
|
|
75
|
-
|
|
76
|
-
## Material Variants
|
|
77
|
-
No material variants. Uses recessed inset styling.
|
|
78
|
-
|
|
79
|
-
## Theme Behavior
|
|
80
|
-
- Container background uses `--bg-inset` (recessed area)
|
|
81
|
-
- Scrollbar thumb uses `--border-mid` (adapts to theme)
|
|
82
|
-
- Thumb hover uses `--border-hi` (brighter in both themes)
|
|
83
|
-
- Text color adapts via `--text-secondary`
|
|
84
|
-
|
|
85
|
-
## Constraints
|
|
86
|
-
1. MUST use 8px scrollbar width (narrow but usable)
|
|
87
|
-
2. Thumb MUST have 1px border matching track background for inset effect
|
|
88
|
-
3. Track MUST use recessed background (`--bg-inset`)
|
|
89
|
-
4. MUST use WebKit scrollbar pseudo-elements (CSS-only, no JS needed)
|
|
90
|
-
5. Thumb MUST brighten on hover via `--border-hi`
|
|
91
|
-
6. MUST use 4px border-radius on both track and thumb
|
|
92
|
-
|
|
93
|
-
## Accessibility
|
|
94
|
-
- Scrollable content should have `tabindex="0"` for keyboard access
|
|
95
|
-
- Use `role="region"` with `aria-label` describing content area
|
|
96
|
-
- Ensure content is reachable via keyboard (Tab, then arrow keys)
|
|
97
|
-
- Consider `scrollbar-width: thin` for Firefox compatibility
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Status Bar
|
|
3
|
-
id: status-bar
|
|
4
|
-
class: .status-bar
|
|
5
|
-
category: navigation
|
|
6
|
-
index: 5
|
|
7
|
-
materials: [glossy-polycarbonate]
|
|
8
|
-
sizes: [default]
|
|
9
|
-
interactive: false
|
|
10
|
-
requires_js: false
|
|
11
|
-
canvas: false
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Status Bar
|
|
15
|
-
|
|
16
|
-
## Physical Analog
|
|
17
|
-
**Reference devices**: Nokia phone top status bar, iPod top bar, camera viewfinder top information strip.
|
|
18
|
-
**Mechanism**: The top status strip on every feature phone and camera viewfinder. Displays persistent system information: time, signal strength, battery level, recording status, GPS lock, etc. This bar is always visible regardless of the current app or screen. On physical devices, this data is often rendered by a dedicated display controller, separate from the main application processor.
|
|
19
|
-
|
|
20
|
-
## Geometry
|
|
21
|
-
|
|
22
|
-
| Property | Value |
|
|
23
|
-
|----------|-------|
|
|
24
|
-
| Padding | 4px 10px |
|
|
25
|
-
| Min width | 200px |
|
|
26
|
-
| Border radius | `--radius-md` (8px) |
|
|
27
|
-
| Time font size | 13px |
|
|
28
|
-
| Status text font size | 9px |
|
|
29
|
-
| Icon gap | 6px |
|
|
30
|
-
|
|
31
|
-
## CSS Recipe
|
|
32
|
-
|
|
33
|
-
### Container (`.status-bar`)
|
|
34
|
-
```css
|
|
35
|
-
.status-bar {
|
|
36
|
-
display: flex; align-items: center; gap: 8px;
|
|
37
|
-
padding: 4px 10px; background: var(--bg-raised);
|
|
38
|
-
border: 1px solid var(--border-subtle); border-radius: var(--radius-md);
|
|
39
|
-
min-width: 200px;
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### Sub-elements
|
|
44
|
-
```css
|
|
45
|
-
.sb-time { font-family: var(--font-mono); font-size: 13px; color: var(--text-primary); letter-spacing: 1px; }
|
|
46
|
-
.sb-icons { display: flex; align-items: center; gap: 6px; margin-left: auto; }
|
|
47
|
-
.sb-text { font-family: var(--font-ui); font-size: 9px; font-weight: 500; color: var(--text-muted); }
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### Signal bars (used within status bar)
|
|
51
|
-
```css
|
|
52
|
-
.signal-bars { display: flex; align-items: flex-end; gap: 3px; height: 24px; }
|
|
53
|
-
.signal-strength-bar { width: 4px; border-radius: 1px; background: var(--green-on); transition: opacity 0.2s; }
|
|
54
|
-
.signal-strength-bar.off { opacity: 0.15; background: var(--text-muted); }
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### Battery icon (used within status bar)
|
|
58
|
-
```css
|
|
59
|
-
.battery-icon { display: inline-flex; align-items: center; gap: 2px; }
|
|
60
|
-
.battery-body {
|
|
61
|
-
width: 28px; height: 14px; border: 2px solid var(--border-mid);
|
|
62
|
-
border-radius: 3px; padding: 2px; position: relative;
|
|
63
|
-
}
|
|
64
|
-
.battery-body::after {
|
|
65
|
-
content: ''; position: absolute; right: -5px; top: 50%; transform: translateY(-50%);
|
|
66
|
-
width: 3px; height: 6px; background: var(--border-mid); border-radius: 0 1px 1px 0;
|
|
67
|
-
}
|
|
68
|
-
.battery-fill { height: 100%; border-radius: 1px; background: var(--green-on); transition: width 0.3s, background 0.3s; }
|
|
69
|
-
.battery-fill.medium { background: var(--amber); }
|
|
70
|
-
.battery-fill.low { background: var(--red-alert); }
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## HTML Structure
|
|
74
|
-
```html
|
|
75
|
-
<div class="status-bar">
|
|
76
|
-
<span class="sb-time">12:45</span>
|
|
77
|
-
<span class="sb-text">3G</span>
|
|
78
|
-
<div class="sb-icons">
|
|
79
|
-
<div class="signal-bars" style="height:14px">
|
|
80
|
-
<div class="signal-strength-bar" style="height:4px"></div>
|
|
81
|
-
<div class="signal-strength-bar" style="height:7px"></div>
|
|
82
|
-
<div class="signal-strength-bar" style="height:10px"></div>
|
|
83
|
-
<div class="signal-strength-bar off" style="height:13px"></div>
|
|
84
|
-
</div>
|
|
85
|
-
<div class="battery-icon">
|
|
86
|
-
<div class="battery-body" style="width:20px;height:10px">
|
|
87
|
-
<div class="battery-fill" style="width:70%"></div>
|
|
88
|
-
</div>
|
|
89
|
-
</div>
|
|
90
|
-
</div>
|
|
91
|
-
</div>
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Size Variants
|
|
95
|
-
No size variants defined.
|
|
96
|
-
|
|
97
|
-
## Material Variants
|
|
98
|
-
No material variants. Uses standard raised surface.
|
|
99
|
-
|
|
100
|
-
## Theme Behavior
|
|
101
|
-
- Background swaps via `--bg-raised` token
|
|
102
|
-
- Text colors swap via theme tokens
|
|
103
|
-
- Signal bars and battery use accent colors that remain constant across themes
|
|
104
|
-
- Border colors swap via `--border-subtle` and `--border-mid`
|
|
105
|
-
|
|
106
|
-
## Constraints
|
|
107
|
-
1. MUST use monospace font for time display (data readout convention)
|
|
108
|
-
2. MUST use `margin-left: auto` on icons container to push icons to the right
|
|
109
|
-
3. Signal bars MUST use `.off` class for inactive bars (not hidden)
|
|
110
|
-
4. Battery fill color MUST change based on level: green (>50%), amber/`.medium` (20-50%), red/`.low` (<20%)
|
|
111
|
-
5. MUST maintain minimum 200px width for readability
|
|
112
|
-
|
|
113
|
-
## Accessibility
|
|
114
|
-
- Use `role="status"` or `aria-live="polite"` for dynamic values
|
|
115
|
-
- Signal strength should have `aria-label` describing level (e.g., "3 of 5 bars")
|
|
116
|
-
- Battery should have `aria-label` describing percentage
|
|
117
|
-
- Time should use `<time>` element when possible
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Tab Bar
|
|
3
|
-
id: tab-bar
|
|
4
|
-
class: .tab-bar
|
|
5
|
-
category: navigation
|
|
6
|
-
index: 3
|
|
7
|
-
materials: [glossy-polycarbonate]
|
|
8
|
-
sizes: [default]
|
|
9
|
-
interactive: true
|
|
10
|
-
requires_js: false
|
|
11
|
-
canvas: false
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Tab Bar
|
|
15
|
-
|
|
16
|
-
## Physical Analog
|
|
17
|
-
**Reference devices**: Nokia Symbian UI tabs, Sony Ericsson media player mode tabs, camera menu section tabs.
|
|
18
|
-
**Mechanism**: Derived from physical tabbed dividers in filing cabinets and ring binders. Each tab represents a category. The active tab appears "in front of" the others (connected to the content below), while inactive tabs appear recessed or separated. In hardware devices, this was often a row of physical buttons with a mode indicator LED above each.
|
|
19
|
-
|
|
20
|
-
## Geometry
|
|
21
|
-
|
|
22
|
-
| Property | Value |
|
|
23
|
-
|----------|-------|
|
|
24
|
-
| Layout | Flex row, equal-width items (`flex: 1`) |
|
|
25
|
-
| Border radius | `--radius-md` (8px) |
|
|
26
|
-
| Item padding | 8px 14px |
|
|
27
|
-
| Font size | 10px |
|
|
28
|
-
| Active indicator height | 2px |
|
|
29
|
-
| Bottom shadow | 2px |
|
|
30
|
-
|
|
31
|
-
## CSS Recipe
|
|
32
|
-
|
|
33
|
-
### Container (`.tab-bar`)
|
|
34
|
-
```css
|
|
35
|
-
.tab-bar {
|
|
36
|
-
display: flex; background: var(--bg-raised);
|
|
37
|
-
border: 1px solid var(--border-subtle); border-radius: var(--radius-md);
|
|
38
|
-
overflow: hidden; box-shadow: 0 2px 0 var(--border-deep);
|
|
39
|
-
}
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Tab Item (`.tab-item`)
|
|
43
|
-
```css
|
|
44
|
-
.tab-item {
|
|
45
|
-
flex: 1; padding: 8px 14px; text-align: center;
|
|
46
|
-
font-family: var(--font-ui); font-size: 10px; font-weight: 500;
|
|
47
|
-
color: var(--text-muted); letter-spacing: 1px; cursor: pointer;
|
|
48
|
-
transition: all 0.15s; position: relative; user-select: none;
|
|
49
|
-
border-right: 1px solid var(--border-subtle); background: transparent;
|
|
50
|
-
border-top: none; border-bottom: none;
|
|
51
|
-
}
|
|
52
|
-
.tab-item:last-child { border-right: none; }
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Hover
|
|
56
|
-
```css
|
|
57
|
-
.tab-item:hover { color: var(--text-primary); }
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Active
|
|
61
|
-
```css
|
|
62
|
-
.tab-item.active { color: var(--blue-info); background: linear-gradient(180deg, var(--glow-color), transparent); }
|
|
63
|
-
.tab-item.active::after {
|
|
64
|
-
content: ''; position: absolute; bottom: 0; left: 4px; right: 4px;
|
|
65
|
-
height: 2px; background: var(--blue-info); border-radius: 1px;
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## HTML Structure
|
|
70
|
-
```html
|
|
71
|
-
<div class="tab-bar">
|
|
72
|
-
<button class="tab-item active">PHOTO</button>
|
|
73
|
-
<button class="tab-item">VIDEO</button>
|
|
74
|
-
<button class="tab-item">AUDIO</button>
|
|
75
|
-
<button class="tab-item">FILES</button>
|
|
76
|
-
</div>
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## Size Variants
|
|
80
|
-
No size variants defined. Width is typically set by parent container.
|
|
81
|
-
|
|
82
|
-
## Material Variants
|
|
83
|
-
No material variants. Uses standard raised surface.
|
|
84
|
-
|
|
85
|
-
## Theme Behavior
|
|
86
|
-
- Background swaps via `--bg-raised` token
|
|
87
|
-
- Active indicator always uses `--blue-info`
|
|
88
|
-
- Separator borders swap via `--border-subtle`
|
|
89
|
-
- Bottom shadow adjusts via `--border-deep`
|
|
90
|
-
|
|
91
|
-
## Constraints
|
|
92
|
-
1. MUST use `flex: 1` on items so all tabs are equal width
|
|
93
|
-
2. MUST include 2px blue indicator bar on active tab via `::after`
|
|
94
|
-
3. MUST include vertical separators between tabs (`border-right`)
|
|
95
|
-
4. Only ONE tab can be `.active` at a time (radio behavior)
|
|
96
|
-
5. MUST use `overflow: hidden` on container to clip radius corners
|
|
97
|
-
6. MUST NOT use more than 5-6 tabs (becomes unreadable)
|
|
98
|
-
|
|
99
|
-
## Accessibility
|
|
100
|
-
- Container should have `role="tablist"`
|
|
101
|
-
- Each tab should be a `<button>` with `role="tab"`
|
|
102
|
-
- Active tab: `aria-selected="true"`
|
|
103
|
-
- Associated panel: `aria-controls="panel-id"` and `role="tabpanel"` on content
|
|
104
|
-
- Support Left/Right arrow key navigation
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Chassis Panel
|
|
3
|
-
id: chassis-panel
|
|
4
|
-
class: .chassis-panel
|
|
5
|
-
category: overlays
|
|
6
|
-
index: 2
|
|
7
|
-
materials: [brushed-metal]
|
|
8
|
-
sizes: [default]
|
|
9
|
-
interactive: false
|
|
10
|
-
requires_js: false
|
|
11
|
-
canvas: true
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Chassis Panel
|
|
15
|
-
|
|
16
|
-
## Physical Analog
|
|
17
|
-
**Reference devices**: Removable/swappable sections of device enclosures -- like a side panel on a PC case or a battery door on a camera.
|
|
18
|
-
**Mechanism**: The removable section of a device chassis. Lighter shadow than Panel (I1) because chassis panels are attached, not freestanding. Used for secondary grouping of controls and indicators.
|
|
19
|
-
|
|
20
|
-
## Geometry
|
|
21
|
-
|
|
22
|
-
| Property | Value |
|
|
23
|
-
|----------|-------|
|
|
24
|
-
| Padding | 16px |
|
|
25
|
-
| Border radius | `--radius-lg` (14px) |
|
|
26
|
-
| Header padding-bottom | 8px |
|
|
27
|
-
| Title font size | 10px |
|
|
28
|
-
|
|
29
|
-
## CSS Recipe
|
|
30
|
-
|
|
31
|
-
### Container (`.chassis-panel`)
|
|
32
|
-
```css
|
|
33
|
-
.chassis-panel {
|
|
34
|
-
background: linear-gradient(180deg, var(--bg-raised), var(--bg-surface));
|
|
35
|
-
border: 1px solid var(--border-subtle); border-radius: var(--radius-lg);
|
|
36
|
-
padding: 16px; box-shadow: var(--shadow-deep);
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Header (`.cpanel-header`)
|
|
41
|
-
```css
|
|
42
|
-
.chassis-panel .cpanel-header {
|
|
43
|
-
display: flex; justify-content: space-between; align-items: center;
|
|
44
|
-
margin-bottom: 12px; padding-bottom: 8px;
|
|
45
|
-
border-bottom: 1px solid var(--border-subtle);
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### Title (`.cpanel-title`)
|
|
50
|
-
```css
|
|
51
|
-
.chassis-panel .cpanel-title {
|
|
52
|
-
font-family: var(--font-ui); font-size: 10px; font-weight: 600;
|
|
53
|
-
letter-spacing: 2px; color: var(--text-muted); text-transform: uppercase;
|
|
54
|
-
}
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## HTML Structure
|
|
58
|
-
```html
|
|
59
|
-
<div class="chassis-panel" style="width:200px">
|
|
60
|
-
<div class="cpanel-header">
|
|
61
|
-
<span class="cpanel-title">AUDIO OUT</span>
|
|
62
|
-
<span style="font-size:8px;color:var(--text-muted);font-family:var(--font-ui)">v2.1</span>
|
|
63
|
-
</div>
|
|
64
|
-
<div class="led-cluster">
|
|
65
|
-
<div class="led-dot green"></div>
|
|
66
|
-
<div class="led-dot green"></div>
|
|
67
|
-
<div class="led-dot off"></div>
|
|
68
|
-
<div class="led-dot red"></div>
|
|
69
|
-
</div>
|
|
70
|
-
</div>
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Size Variants
|
|
74
|
-
No size variants defined.
|
|
75
|
-
|
|
76
|
-
## Material Variants
|
|
77
|
-
No material variants. Uses raised-to-surface gradient (lighter than I1 Panel).
|
|
78
|
-
|
|
79
|
-
## Theme Behavior
|
|
80
|
-
- Background gradient: `--bg-raised` to `--bg-surface` (adapts to theme)
|
|
81
|
-
- Shadow adapts via `--shadow-deep` token
|
|
82
|
-
- Border and header separator adapt via `--border-subtle`
|
|
83
|
-
|
|
84
|
-
## Constraints
|
|
85
|
-
1. MUST use lighter gradient than Panel (I1) -- `--bg-raised` to `--bg-surface` instead of `--bg-surface` to `--bg-panel`
|
|
86
|
-
2. MUST use `--shadow-deep` (standard deep shadow, not custom Tier 3)
|
|
87
|
-
3. Header MUST have bottom border separator
|
|
88
|
-
4. Header MUST use flex with `justify-content: space-between` for title + version
|
|
89
|
-
5. Title MUST be uppercase with 2px letter-spacing
|
|
90
|
-
|
|
91
|
-
## Accessibility
|
|
92
|
-
- Use `role="region"` or `<section>` with `aria-label`
|
|
93
|
-
- Header should describe the panel's function
|
|
94
|
-
- Version info is supplementary (can use `aria-label` on the version span)
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Device Bezel
|
|
3
|
-
id: device-bezel
|
|
4
|
-
class: .device-bezel
|
|
5
|
-
category: overlays
|
|
6
|
-
index: 4
|
|
7
|
-
materials: [brushed-metal, glass]
|
|
8
|
-
sizes: [default]
|
|
9
|
-
interactive: false
|
|
10
|
-
requires_js: false
|
|
11
|
-
canvas: true
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Device Bezel
|
|
15
|
-
|
|
16
|
-
## Physical Analog
|
|
17
|
-
**Reference devices**: iPod face bezel, Game Boy front frame, Nokia phone screen bezel.
|
|
18
|
-
**Mechanism**: The frame surrounding a display or touch surface. The bezel is typically a plastic or metal frame that covers the gap between the display glass and the device chassis. The bezel protects the display edges and provides structural support. The double-border styling (outer solid border + inner glossy ring via `inset 0 0 0 1px glossy-hi`) represents the stepped profile of a real bezel: outer wall -> step down -> inner wall -> display surface.
|
|
19
|
-
|
|
20
|
-
## Geometry
|
|
21
|
-
|
|
22
|
-
| Property | Value |
|
|
23
|
-
|----------|-------|
|
|
24
|
-
| Padding | 16px |
|
|
25
|
-
| Border | 2px solid |
|
|
26
|
-
| Border radius | `--radius-lg` (14px) |
|
|
27
|
-
|
|
28
|
-
## CSS Recipe
|
|
29
|
-
|
|
30
|
-
### Default (`.device-bezel`)
|
|
31
|
-
```css
|
|
32
|
-
.device-bezel {
|
|
33
|
-
padding: 16px; border-radius: var(--radius-lg);
|
|
34
|
-
background: linear-gradient(180deg, var(--bg-raised), var(--bg-surface));
|
|
35
|
-
border: 2px solid var(--border-mid);
|
|
36
|
-
box-shadow: var(--shadow-deep), inset 0 0 0 1px var(--glossy-hi);
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Translucent variant (`.device-bezel.translucent`)
|
|
41
|
-
```css
|
|
42
|
-
.device-bezel.translucent {
|
|
43
|
-
background: rgba(255,255,255,0.04); backdrop-filter: blur(8px);
|
|
44
|
-
border: 1px solid var(--border-subtle);
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## HTML Structure
|
|
49
|
-
```html
|
|
50
|
-
<div class="device-bezel" style="width:160px;height:100px;display:flex;align-items:center;justify-content:center">
|
|
51
|
-
<span style="font-family:var(--font-display);font-size:9px;color:var(--text-muted);letter-spacing:2px">DISPLAY AREA</span>
|
|
52
|
-
</div>
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Size Variants
|
|
56
|
-
No size variants defined. Dimensions set by content or parent.
|
|
57
|
-
|
|
58
|
-
## Material Variants
|
|
59
|
-
|
|
60
|
-
| Variant | Class | Description |
|
|
61
|
-
|---------|-------|-------------|
|
|
62
|
-
| Default | `.device-bezel` | Opaque metal/plastic bezel with gradient |
|
|
63
|
-
| Translucent | `.device-bezel.translucent` | Frosted glass bezel with backdrop-filter |
|
|
64
|
-
|
|
65
|
-
## Theme Behavior
|
|
66
|
-
- Background gradient adapts via theme tokens
|
|
67
|
-
- Border adapts via `--border-mid`
|
|
68
|
-
- Inner glossy ring adapts via `--glossy-hi`
|
|
69
|
-
- Shadow adapts via `--shadow-deep`
|
|
70
|
-
- Translucent variant uses fixed rgba values
|
|
71
|
-
|
|
72
|
-
## Constraints
|
|
73
|
-
1. MUST use 2px border (thicker than standard 1px to represent the physical bezel lip)
|
|
74
|
-
2. MUST include inner glossy ring (`inset 0 0 0 1px glossy-hi`) for the stepped profile
|
|
75
|
-
3. MUST use `--shadow-deep` for elevation
|
|
76
|
-
4. MUST use `--radius-lg` for device-proportioned corner radius
|
|
77
|
-
5. Translucent variant MUST use `backdrop-filter: blur(8px)` and semi-transparent background
|
|
78
|
-
6. Translucent variant MUST reduce border to 1px and change to `--border-subtle`
|
|
79
|
-
|
|
80
|
-
## Accessibility
|
|
81
|
-
- Use as a container element with `role="region"` or `<section>`
|
|
82
|
-
- Add `aria-label` describing the display area
|
|
83
|
-
- Content within the bezel should be independently accessible
|