@lcars-gui/romulus 0.0.0-stage → 0.1.1

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/dist/ui.css ADDED
@@ -0,0 +1,1024 @@
1
+ /* AUTO-GENERATED FROM tokens/ + css/*.css — DO NOT EDIT */
2
+
3
+ :root {
4
+ --rom-colors-text1: #02170F;
5
+ --rom-colors-text2: #BFF5DC;
6
+ --rom-colors-background: #010805;
7
+ --rom-colors-surface: #04120C;
8
+ --rom-font-family: "Michroma", "Eurostile", "Bahnschrift", "Arial Narrow", sans-serif;
9
+ --rom-fontSize-xs: 0.65rem;
10
+ --rom-fontSize-s: 0.8rem;
11
+ --rom-fontSize-m: 0.95rem;
12
+ --rom-fontSize-l: 1.2rem;
13
+ --rom-fontSize-xl: 1.55rem;
14
+ --rom-width-xs: 2.5em;
15
+ --rom-width-s: 4em;
16
+ --rom-width-m: 7em;
17
+ --rom-width-l: 10em;
18
+ --rom-width-xl: 13em;
19
+ --rom-height-btn: 2.4em;
20
+ --rom-chamfer-s: 0.35rem;
21
+ --rom-chamfer-m: 0.7rem;
22
+ --rom-chamfer-l: 1.4rem;
23
+ --rom-line-thin: 1px;
24
+ --rom-line-std: 2px;
25
+ --rom-line-thick: 0.3rem;
26
+ --rom-panel-gap: 0.4rem;
27
+ --rom-panel-padding: 1.25rem;
28
+ --rom-panel-sidebar-width: 9rem;
29
+ --rom-panel-header-height: 2.4rem;
30
+ --rom-panel-segment-height: 2.6rem;
31
+ --rom-panel-label-size: 0.75rem;
32
+ --rom-panel-title-size: 1.4rem;
33
+ --rom-panel-talon-size: 2.6rem;
34
+ --rom-status-ok: #4BF2A0;
35
+ --rom-status-warn: #E8D55A;
36
+ --rom-status-error: #FF5A4E;
37
+ --rom-status-off: #2E4A3E;
38
+ --rom-alert-red: #FF4A3D;
39
+ --rom-alert-yellow: #F2D24B;
40
+ --rom-colors-color1: #3FCF8E;
41
+ --rom-colors-color1hover: color-mix(in srgb, #3FCF8E 65%, white);
42
+ --rom-colors-color2: #1F8A5F;
43
+ --rom-colors-color2hover: color-mix(in srgb, #1F8A5F 65%, white);
44
+ --rom-colors-color3: #9BE3A8;
45
+ --rom-colors-color3hover: color-mix(in srgb, #9BE3A8 65%, white);
46
+ --rom-colors-color4: #C9E86A;
47
+ --rom-colors-color4hover: color-mix(in srgb, #C9E86A 65%, white);
48
+ --rom-colors-color5: #DDFFF0;
49
+ --rom-colors-color5hover: color-mix(in srgb, #DDFFF0 65%, white);
50
+ --rom-colors-color6: #4FB8A8;
51
+ --rom-colors-color6hover: color-mix(in srgb, #4FB8A8 65%, white);
52
+ }
53
+
54
+ /* Colors */
55
+ [data-color="1"] { --rom-bg: var(--rom-colors-color1); --rom-bg-hover: var(--rom-colors-color1hover); }
56
+ [data-color="2"] { --rom-bg: var(--rom-colors-color2); --rom-bg-hover: var(--rom-colors-color2hover); }
57
+ [data-color="3"] { --rom-bg: var(--rom-colors-color3); --rom-bg-hover: var(--rom-colors-color3hover); }
58
+ [data-color="4"] { --rom-bg: var(--rom-colors-color4); --rom-bg-hover: var(--rom-colors-color4hover); }
59
+ [data-color="5"] { --rom-bg: var(--rom-colors-color5); --rom-bg-hover: var(--rom-colors-color5hover); }
60
+ [data-color="6"] { --rom-bg: var(--rom-colors-color6); --rom-bg-hover: var(--rom-colors-color6hover); }
61
+
62
+ /* Themes */
63
+ [data-theme="free-state"] {
64
+ --rom-colors-color1: #4CC9A4;
65
+ --rom-colors-color1hover: color-mix(in srgb, #4CC9A4 65%, white);
66
+ --rom-colors-color2: #2B7D6B;
67
+ --rom-colors-color2hover: color-mix(in srgb, #2B7D6B 65%, white);
68
+ --rom-colors-color3: #A9E6C7;
69
+ --rom-colors-color3hover: color-mix(in srgb, #A9E6C7 65%, white);
70
+ --rom-colors-color4: #E8C35A;
71
+ --rom-colors-color4hover: color-mix(in srgb, #E8C35A 65%, white);
72
+ --rom-colors-color5: #F2FFF8;
73
+ --rom-colors-color5hover: color-mix(in srgb, #F2FFF8 65%, white);
74
+ --rom-colors-color6: #6EA8D9;
75
+ --rom-colors-color6hover: color-mix(in srgb, #6EA8D9 65%, white);
76
+ }
77
+ [data-theme="tal-shiar"] {
78
+ --rom-colors-color1: #36A9A0;
79
+ --rom-colors-color1hover: color-mix(in srgb, #36A9A0 65%, white);
80
+ --rom-colors-color2: #1E6177;
81
+ --rom-colors-color2hover: color-mix(in srgb, #1E6177 65%, white);
82
+ --rom-colors-color3: #77C9BE;
83
+ --rom-colors-color3hover: color-mix(in srgb, #77C9BE 65%, white);
84
+ --rom-colors-color4: #9FB7E0;
85
+ --rom-colors-color4hover: color-mix(in srgb, #9FB7E0 65%, white);
86
+ --rom-colors-color5: #E2F7F4;
87
+ --rom-colors-color5hover: color-mix(in srgb, #E2F7F4 65%, white);
88
+ --rom-colors-color6: #5C7FC4;
89
+ --rom-colors-color6hover: color-mix(in srgb, #5C7FC4 65%, white);
90
+ }
91
+ [data-theme="warbird"] {
92
+ --rom-colors-color1: #3FCF8E;
93
+ --rom-colors-color1hover: color-mix(in srgb, #3FCF8E 65%, white);
94
+ --rom-colors-color2: #1F8A5F;
95
+ --rom-colors-color2hover: color-mix(in srgb, #1F8A5F 65%, white);
96
+ --rom-colors-color3: #9BE3A8;
97
+ --rom-colors-color3hover: color-mix(in srgb, #9BE3A8 65%, white);
98
+ --rom-colors-color4: #C9E86A;
99
+ --rom-colors-color4hover: color-mix(in srgb, #C9E86A 65%, white);
100
+ --rom-colors-color5: #DDFFF0;
101
+ --rom-colors-color5hover: color-mix(in srgb, #DDFFF0 65%, white);
102
+ --rom-colors-color6: #4FB8A8;
103
+ --rom-colors-color6hover: color-mix(in srgb, #4FB8A8 65%, white);
104
+ }
105
+
106
+ /* Alert palettes */
107
+ [data-alert="red"] {
108
+ --rom-colors-color1: #FF4A3D;
109
+ --rom-colors-color1hover: color-mix(in srgb, #FF4A3D 65%, white);
110
+ --rom-colors-color2: #B3261C;
111
+ --rom-colors-color2hover: color-mix(in srgb, #B3261C 65%, white);
112
+ --rom-colors-color3: #FF8A7A;
113
+ --rom-colors-color3hover: color-mix(in srgb, #FF8A7A 65%, white);
114
+ --rom-colors-color4: #FFB199;
115
+ --rom-colors-color4hover: color-mix(in srgb, #FFB199 65%, white);
116
+ --rom-colors-color5: #FFE3DC;
117
+ --rom-colors-color5hover: color-mix(in srgb, #FFE3DC 65%, white);
118
+ --rom-colors-color6: #E0603A;
119
+ --rom-colors-color6hover: color-mix(in srgb, #E0603A 65%, white);
120
+ }
121
+ [data-alert="yellow"] {
122
+ --rom-colors-color1: #F2D24B;
123
+ --rom-colors-color1hover: color-mix(in srgb, #F2D24B 65%, white);
124
+ --rom-colors-color2: #A88A1E;
125
+ --rom-colors-color2hover: color-mix(in srgb, #A88A1E 65%, white);
126
+ --rom-colors-color3: #F5E08A;
127
+ --rom-colors-color3hover: color-mix(in srgb, #F5E08A 65%, white);
128
+ --rom-colors-color4: #FFF0A8;
129
+ --rom-colors-color4hover: color-mix(in srgb, #FFF0A8 65%, white);
130
+ --rom-colors-color5: #FFFBE0;
131
+ --rom-colors-color5hover: color-mix(in srgb, #FFFBE0 65%, white);
132
+ --rom-colors-color6: #D9A93A;
133
+ --rom-colors-color6hover: color-mix(in srgb, #D9A93A 65%, white);
134
+ }
135
+
136
+ /* ==================== 00-base.css ==================== */
137
+
138
+ /* Romulan design: glowing lines on a dark background, chamfered corners,
139
+ diamonds instead of circles. No bundled font – "Michroma" (Google Fonts)
140
+ fits well, otherwise Eurostile/Bahnschrift/Arial Narrow are used. */
141
+
142
+ [class*="rom-"] {
143
+ box-sizing: border-box;
144
+ }
145
+
146
+ .rom-btn, .rom-panel, .rom-bar, .rom-block, .rom-title, .rom-number,
147
+ .rom-tab, .rom-field, .rom-input, .rom-keypad-display, .rom-cascade,
148
+ .rom-readout, .rom-gauge, .rom-status, .rom-alert {
149
+ font-family: var(--rom-font-family);
150
+ text-transform: uppercase;
151
+ letter-spacing: 0.12em;
152
+ line-height: 1;
153
+ }
154
+
155
+ /* Chamfer top left + bottom right: --rom-c = size of the chamfer.
156
+ Two gradients trace the slanted edges (an inset shadow draws the straight ones). */
157
+ .rom-btn, .rom-block, .rom-panel, .rom-panel::before, .rom-sensor, .rom-sensor::before,
158
+ .rom-keypad-display {
159
+ clip-path: polygon(
160
+ var(--rom-c) 0, 100% 0,
161
+ 100% calc(100% - var(--rom-c)), calc(100% - var(--rom-c)) 100%,
162
+ 0 100%, 0 var(--rom-c)
163
+ );
164
+ }
165
+
166
+ @keyframes rom-pulse {
167
+ from { opacity: 1; }
168
+ to { opacity: 0.45; }
169
+ }
170
+
171
+ @keyframes rom-blink {
172
+ 0%, 49% { opacity: 1; }
173
+ 50%, 100% { opacity: 0.2; }
174
+ }
175
+
176
+ @keyframes rom-flicker {
177
+ 0%, 100% { opacity: 1; }
178
+ 3% { opacity: 0.35; }
179
+ 6% { opacity: 1; }
180
+ 52% { opacity: 0.8; }
181
+ 54% { opacity: 1; }
182
+ }
183
+
184
+ @media (prefers-reduced-motion: reduce) {
185
+ [class*="rom-"], [class*="rom-"]::before, [class*="rom-"]::after {
186
+ animation: none !important;
187
+ }
188
+ }
189
+
190
+ /* ==================== 10-button.css ==================== */
191
+
192
+ /* #################### BUTTON #################### */
193
+
194
+ /* Base style: dark fill with a glowing outline (variant "outline") */
195
+ .rom-btn {
196
+ --rom-c: var(--rom-chamfer-m);
197
+ --rom-line: var(--rom-bg, var(--rom-colors-color1));
198
+ display: inline-flex;
199
+ align-items: center;
200
+ justify-content: center;
201
+ height: var(--rom-height-btn);
202
+ padding: 0 1.3em;
203
+ border: none;
204
+ cursor: pointer;
205
+ overflow: hidden;
206
+ white-space: nowrap;
207
+ text-overflow: ellipsis;
208
+ text-decoration: none;
209
+ font-size: var(--rom-fontSize-m);
210
+ color: var(--rom-line);
211
+ background:
212
+ linear-gradient(135deg, var(--rom-line) calc(var(--rom-c) * 0.7071 + var(--rom-line-std)), transparent 0),
213
+ linear-gradient(315deg, var(--rom-line) calc(var(--rom-c) * 0.7071 + var(--rom-line-std)), transparent 0),
214
+ color-mix(in srgb, var(--rom-line) 14%, var(--rom-colors-background));
215
+ box-shadow: inset 0 0 0 var(--rom-line-std) var(--rom-line);
216
+ transition: background-color 0.15s ease, color 0.15s ease;
217
+ }
218
+
219
+ .rom-btn:hover {
220
+ --rom-line: var(--rom-bg-hover, var(--rom-colors-color1hover));
221
+ background-color: color-mix(in srgb, var(--rom-line) 28%, var(--rom-colors-background));
222
+ }
223
+
224
+ .rom-btn:focus-visible {
225
+ outline: none;
226
+ background-color: color-mix(in srgb, var(--rom-line) 40%, var(--rom-colors-background));
227
+ text-decoration: underline;
228
+ text-underline-offset: 0.3em;
229
+ }
230
+
231
+ .rom-btn:disabled {
232
+ cursor: default;
233
+ opacity: 0.35;
234
+ }
235
+
236
+ /* Variant: filled, with dark text */
237
+ .rom-btn[data-variant="solid"] {
238
+ background: var(--rom-line);
239
+ box-shadow: none;
240
+ color: var(--rom-colors-text1);
241
+ }
242
+
243
+ /* Size Variants */
244
+ .rom-btn[data-size="xs"] { font-size: var(--rom-fontSize-xs); }
245
+ .rom-btn[data-size="s"] { font-size: var(--rom-fontSize-s); }
246
+ .rom-btn[data-size="m"] { font-size: var(--rom-fontSize-m); }
247
+ .rom-btn[data-size="l"] { font-size: var(--rom-fontSize-l); }
248
+ .rom-btn[data-size="xl"] { font-size: var(--rom-fontSize-xl); }
249
+
250
+ /* Length Variants */
251
+ .rom-btn[data-length="xs"] { width: var(--rom-width-xs); }
252
+ .rom-btn[data-length="s"] { width: var(--rom-width-s); }
253
+ .rom-btn[data-length="m"] { width: var(--rom-width-m); }
254
+ .rom-btn[data-length="l"] { width: var(--rom-width-l); }
255
+ .rom-btn[data-length="xl"] { width: var(--rom-width-xl); }
256
+
257
+ /* Shape Variants (default: chamfer) */
258
+ .rom-btn[data-shape="rect"] { --rom-c: 0px; }
259
+
260
+ /* Arrow points: always filled, the slanted edges would otherwise have no outline */
261
+ .rom-btn[data-shape="point-left"],
262
+ .rom-btn[data-shape="point-right"] {
263
+ background: var(--rom-line);
264
+ box-shadow: none;
265
+ color: var(--rom-colors-text1);
266
+ }
267
+ .rom-btn[data-shape="point-left"] {
268
+ clip-path: polygon(0.9em 0, 100% 0, 100% 100%, 0.9em 100%, 0 50%);
269
+ padding-left: 1.8em;
270
+ }
271
+ .rom-btn[data-shape="point-right"] {
272
+ clip-path: polygon(0 0, calc(100% - 0.9em) 0, 100% 50%, calc(100% - 0.9em) 100%, 0 100%);
273
+ padding-right: 1.8em;
274
+ }
275
+
276
+ /* Label on the left */
277
+ .rom-btn[data-align="start"] { justify-content: flex-start; }
278
+
279
+ /* Toggle: aria-pressed */
280
+ .rom-btn[aria-pressed="false"] { opacity: 0.7; }
281
+ .rom-btn[aria-pressed="true"] {
282
+ background: var(--rom-line);
283
+ box-shadow: none;
284
+ color: var(--rom-colors-text1);
285
+ }
286
+
287
+ /* ==================== 20-panel.css ==================== */
288
+
289
+ /* #################### PANEL #################### */
290
+
291
+ /* Console with chamfered corners (top left / bottom right)
292
+ and talon corners (top right / bottom left).
293
+ Order: header, sidebar (optional), content, footer (optional) */
294
+ .rom-panel {
295
+ --rom-c: var(--rom-chamfer-l);
296
+ --rom-line: var(--rom-bg, var(--rom-colors-color1));
297
+ position: relative;
298
+ display: grid;
299
+ grid-template-columns: var(--rom-panel-sidebar-width) minmax(0, 1fr);
300
+ grid-template-rows: auto 1fr auto;
301
+ gap: var(--rom-panel-gap) calc(var(--rom-panel-gap) * 3);
302
+ padding: var(--rom-panel-padding);
303
+ color: var(--rom-colors-text2);
304
+ background: linear-gradient(180deg,
305
+ color-mix(in srgb, var(--rom-line) 9%, var(--rom-colors-surface)),
306
+ var(--rom-colors-surface) 40%);
307
+ }
308
+
309
+ /* Outline including the slanted edges */
310
+ .rom-panel::before {
311
+ content: "";
312
+ position: absolute;
313
+ inset: 0;
314
+ pointer-events: none;
315
+ background:
316
+ linear-gradient(135deg, var(--rom-line) calc(var(--rom-c) * 0.7071 + var(--rom-line-std)), transparent 0),
317
+ linear-gradient(315deg, var(--rom-line) calc(var(--rom-c) * 0.7071 + var(--rom-line-std)), transparent 0);
318
+ box-shadow: inset 0 0 0 var(--rom-line-std) var(--rom-line);
319
+ }
320
+
321
+ /* Talon corners */
322
+ .rom-panel::after {
323
+ content: "";
324
+ position: absolute;
325
+ inset: 0;
326
+ pointer-events: none;
327
+ background:
328
+ linear-gradient(225deg, var(--rom-line) calc(var(--rom-panel-talon-size) * 0.4), transparent 0)
329
+ top right / var(--rom-panel-talon-size) var(--rom-panel-talon-size) no-repeat,
330
+ linear-gradient(45deg, var(--rom-line) calc(var(--rom-panel-talon-size) * 0.4), transparent 0)
331
+ bottom left / var(--rom-panel-talon-size) var(--rom-panel-talon-size) no-repeat;
332
+ }
333
+
334
+ .rom-panel > * { position: relative; z-index: 1; }
335
+
336
+ /* Without a sidebar: content spans the full width */
337
+ .rom-panel:not(:has(> .rom-panel-sidebar)) {
338
+ grid-template-columns: minmax(0, 1fr);
339
+ }
340
+
341
+ .rom-panel-header,
342
+ .rom-panel-footer {
343
+ grid-column: 1 / -1;
344
+ display: flex;
345
+ align-items: center;
346
+ gap: var(--rom-panel-gap);
347
+ }
348
+
349
+ .rom-panel-header { min-height: var(--rom-panel-header-height); }
350
+ .rom-panel-header > .rom-bar { margin-right: var(--rom-panel-talon-size); }
351
+ .rom-panel-footer > .rom-bar:first-child { margin-left: var(--rom-panel-talon-size); }
352
+
353
+ /* ID code as a filled trapezoid at the start of the header */
354
+ .rom-panel-code {
355
+ flex: none;
356
+ display: flex;
357
+ align-items: center;
358
+ height: var(--rom-panel-header-height);
359
+ padding: 0 1.6em 0 0.9em;
360
+ margin-left: calc(var(--rom-c) * 0.5);
361
+ background: var(--rom-line);
362
+ color: var(--rom-colors-text1);
363
+ font-size: var(--rom-panel-label-size);
364
+ clip-path: polygon(0 0, 100% 0, calc(100% - 0.9em) 100%, 0 100%);
365
+ }
366
+
367
+ .rom-panel-content {
368
+ min-width: 0;
369
+ padding: 0.25rem 0;
370
+ }
371
+
372
+ /* #################### BAR #################### */
373
+
374
+ .rom-bar {
375
+ --rom-line: var(--rom-bg, var(--rom-colors-color1));
376
+ flex: 1 1 0;
377
+ height: var(--rom-line-thick);
378
+ background: var(--rom-line);
379
+ }
380
+
381
+ .rom-bar[data-length="xs"] { flex: none; width: var(--rom-width-xs); }
382
+ .rom-bar[data-length="s"] { flex: none; width: var(--rom-width-s); }
383
+ .rom-bar[data-length="m"] { flex: none; width: var(--rom-width-m); }
384
+ .rom-bar[data-length="l"] { flex: none; width: var(--rom-width-l); }
385
+ .rom-bar[data-length="xl"] { flex: none; width: var(--rom-width-xl); }
386
+
387
+ /* Pointed ends */
388
+ .rom-bar[data-cap="left"] { clip-path: polygon(1.2rem 0, 100% 0, 100% 100%, 0 100%); }
389
+ .rom-bar[data-cap="right"] { clip-path: polygon(0 0, calc(100% - 1.2rem) 0, 100% 100%, 0 100%); }
390
+ .rom-bar[data-cap="both"] { clip-path: polygon(1.2rem 0, calc(100% - 1.2rem) 0, 100% 100%, 0 100%); }
391
+
392
+ /* Dashed */
393
+ .rom-bar[data-segmented] {
394
+ background: repeating-linear-gradient(90deg, var(--rom-line) 0 1.4rem, transparent 0 1.8rem);
395
+ }
396
+
397
+ /* #################### TITLE / NUMBER #################### */
398
+
399
+ .rom-title {
400
+ flex: none;
401
+ margin: 0;
402
+ color: var(--rom-bg, var(--rom-colors-color1));
403
+ font-size: var(--rom-panel-title-size);
404
+ font-weight: normal;
405
+ letter-spacing: 0.25em;
406
+ white-space: nowrap;
407
+ }
408
+
409
+ .rom-number {
410
+ padding-left: 0.5em;
411
+ border-left: var(--rom-line-std) solid currentColor;
412
+ color: var(--rom-bg, var(--rom-colors-color4));
413
+ font-size: var(--rom-panel-label-size);
414
+ white-space: nowrap;
415
+ font-variant-numeric: tabular-nums;
416
+ }
417
+
418
+ /* #################### DIVIDER #################### */
419
+
420
+ /* Line with tick marks and a diamond in the middle */
421
+ .rom-divider {
422
+ --rom-line: var(--rom-bg, var(--rom-colors-color2));
423
+ position: relative;
424
+ height: 0.9rem;
425
+ margin: 1rem 0;
426
+ background:
427
+ linear-gradient(var(--rom-line), var(--rom-line)) center / 100% var(--rom-line-thin) no-repeat,
428
+ repeating-linear-gradient(90deg, var(--rom-line) 0 var(--rom-line-std), transparent 0 1.5rem) center / 100% 0.5rem no-repeat;
429
+ }
430
+
431
+ .rom-divider::after {
432
+ content: "";
433
+ position: absolute;
434
+ left: 50%;
435
+ top: 50%;
436
+ width: 0.75rem;
437
+ height: 0.75rem;
438
+ translate: -50% -50%;
439
+ rotate: 45deg;
440
+ background: var(--rom-line);
441
+ box-shadow: 0 0 0 0.3rem var(--rom-colors-surface);
442
+ }
443
+
444
+ /* #################### BLOCK / STACK / GRID #################### */
445
+
446
+ .rom-block {
447
+ --rom-c: var(--rom-chamfer-s);
448
+ display: flex;
449
+ align-items: flex-end;
450
+ justify-content: flex-start;
451
+ min-height: var(--rom-panel-segment-height);
452
+ padding: 0 0.6em 0.4em;
453
+ background: var(--rom-bg, var(--rom-colors-color2));
454
+ color: var(--rom-colors-text1);
455
+ font-size: var(--rom-panel-label-size);
456
+ }
457
+
458
+ /* Filler segment: muted so it doesn't compete with the buttons */
459
+ .rom-block[data-fill] {
460
+ flex: 1 1 auto;
461
+ background: color-mix(in srgb, var(--rom-bg, var(--rom-colors-color2)) 22%, var(--rom-colors-surface));
462
+ color: var(--rom-bg, var(--rom-colors-color2));
463
+ }
464
+
465
+ .rom-stack {
466
+ display: flex;
467
+ flex-direction: column;
468
+ gap: var(--rom-panel-gap);
469
+ width: var(--rom-panel-sidebar-width);
470
+ }
471
+
472
+ .rom-stack > * { width: 100%; }
473
+
474
+ .rom-stack > .rom-btn {
475
+ height: var(--rom-panel-segment-height);
476
+ font-size: var(--rom-panel-label-size);
477
+ }
478
+
479
+ .rom-grid {
480
+ display: grid;
481
+ grid-template-columns: repeat(var(--cols, 4), minmax(0, 1fr));
482
+ gap: var(--rom-panel-gap);
483
+ }
484
+
485
+ .rom-grid > .rom-btn {
486
+ width: 100%;
487
+ height: var(--rom-panel-segment-height);
488
+ font-size: var(--rom-panel-label-size);
489
+ }
490
+
491
+ /* ==================== 30-controls.css ==================== */
492
+
493
+ /* #################### TABS #################### */
494
+
495
+ .rom-tabs {
496
+ --rom-line: var(--rom-bg, var(--rom-colors-color1));
497
+ display: flex;
498
+ flex-direction: column;
499
+ }
500
+
501
+ .rom-tabs > .rom-bar {
502
+ flex: none;
503
+ width: 100%;
504
+ }
505
+
506
+ .rom-tablist {
507
+ display: flex;
508
+ gap: 0.2rem;
509
+ }
510
+
511
+ /* Tabs as parallelograms */
512
+ .rom-tab {
513
+ --rom-line: var(--rom-bg, var(--rom-colors-color1));
514
+ min-width: 7rem;
515
+ height: 2.1rem;
516
+ margin-bottom: var(--rom-panel-gap);
517
+ padding: 0 1.6em;
518
+ border: none;
519
+ cursor: pointer;
520
+ font-size: var(--rom-panel-label-size);
521
+ color: var(--rom-line);
522
+ background: color-mix(in srgb, var(--rom-line) 16%, var(--rom-colors-background));
523
+ clip-path: polygon(0.8em 0, 100% 0, calc(100% - 0.8em) 100%, 0 100%);
524
+ }
525
+
526
+ .rom-tab:hover {
527
+ background: color-mix(in srgb, var(--rom-line) 32%, var(--rom-colors-background));
528
+ }
529
+
530
+ .rom-tab[aria-selected="true"] {
531
+ background: var(--rom-line);
532
+ color: var(--rom-colors-text1);
533
+ }
534
+
535
+ .rom-tab:focus-visible {
536
+ outline: none;
537
+ text-decoration: underline;
538
+ text-underline-offset: 0.3em;
539
+ }
540
+
541
+ .rom-tabpanel {
542
+ padding: 1rem 0;
543
+ color: var(--rom-colors-text2);
544
+ }
545
+
546
+ /* #################### INPUT #################### */
547
+
548
+ .rom-field {
549
+ --rom-line: var(--rom-bg, var(--rom-colors-color1));
550
+ display: flex;
551
+ align-items: stretch;
552
+ height: 2.3rem;
553
+ font-size: var(--rom-panel-label-size);
554
+ }
555
+
556
+ .rom-field-label {
557
+ display: flex;
558
+ align-items: center;
559
+ padding: 0 1.6em 0 0.8em;
560
+ background: var(--rom-line);
561
+ color: var(--rom-colors-text1);
562
+ clip-path: polygon(0 0, 100% 0, calc(100% - 0.8em) 100%, 0 100%);
563
+ }
564
+
565
+ .rom-input {
566
+ flex: 1 1 auto;
567
+ min-width: 0;
568
+ padding: 0 0.8em;
569
+ border: none;
570
+ border-bottom: var(--rom-line-std) solid var(--rom-line);
571
+ background: linear-gradient(0deg, color-mix(in srgb, var(--rom-line) 14%, transparent), transparent 70%);
572
+ color: var(--rom-colors-text2);
573
+ font-size: 1.25em;
574
+ outline: none;
575
+ }
576
+
577
+ .rom-input::placeholder {
578
+ color: color-mix(in srgb, var(--rom-line) 45%, black);
579
+ }
580
+
581
+ .rom-input:focus {
582
+ border-bottom-color: var(--rom-bg-hover, var(--rom-colors-color1hover));
583
+ background: linear-gradient(0deg, color-mix(in srgb, var(--rom-line) 28%, transparent), transparent 80%);
584
+ }
585
+
586
+ /* #################### SLIDER (native range) #################### */
587
+
588
+ /* Thin scale, diamond thumb */
589
+ .rom-range {
590
+ --rom-line: var(--rom-bg, var(--rom-colors-color1));
591
+ -webkit-appearance: none;
592
+ appearance: none;
593
+ width: 100%;
594
+ height: 1.6rem;
595
+ margin: 0;
596
+ background: transparent;
597
+ cursor: pointer;
598
+ }
599
+
600
+ .rom-range::-webkit-slider-runnable-track {
601
+ height: 0.6rem;
602
+ background:
603
+ linear-gradient(var(--rom-line), var(--rom-line)) center / 100% var(--rom-line-std) no-repeat,
604
+ repeating-linear-gradient(90deg, color-mix(in srgb, var(--rom-line) 60%, transparent) 0 1px, transparent 1px 10%);
605
+ }
606
+ .rom-range::-moz-range-track {
607
+ height: 0.6rem;
608
+ background:
609
+ linear-gradient(var(--rom-line), var(--rom-line)) center / 100% var(--rom-line-std) no-repeat,
610
+ repeating-linear-gradient(90deg, color-mix(in srgb, var(--rom-line) 60%, transparent) 0 1px, transparent 1px 10%);
611
+ }
612
+
613
+ .rom-range::-webkit-slider-thumb {
614
+ -webkit-appearance: none;
615
+ width: 1.4rem;
616
+ height: 1.4rem;
617
+ margin-top: -0.4rem;
618
+ border: none;
619
+ background: var(--rom-bg-hover, var(--rom-colors-color1hover));
620
+ clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
621
+ }
622
+ .rom-range::-moz-range-thumb {
623
+ width: 1.4rem;
624
+ height: 1.4rem;
625
+ border: none;
626
+ border-radius: 0;
627
+ background: var(--rom-bg-hover, var(--rom-colors-color1hover));
628
+ clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
629
+ }
630
+
631
+ .rom-range:focus-visible::-webkit-slider-thumb { background: var(--rom-colors-color5); }
632
+ .rom-range:focus-visible::-moz-range-thumb { background: var(--rom-colors-color5); }
633
+ .rom-range:focus-visible { outline: none; }
634
+
635
+ /* #################### KEYPAD #################### */
636
+
637
+ .rom-keypad {
638
+ display: grid;
639
+ grid-template-columns: repeat(3, minmax(0, 1fr));
640
+ gap: var(--rom-panel-gap);
641
+ width: 15rem;
642
+ }
643
+
644
+ .rom-keypad > .rom-btn {
645
+ --rom-c: var(--rom-chamfer-s);
646
+ width: 100%;
647
+ height: 2.8rem;
648
+ font-size: var(--rom-fontSize-l);
649
+ }
650
+
651
+ .rom-keypad-display {
652
+ --rom-c: var(--rom-chamfer-m);
653
+ --rom-line: var(--rom-bg, var(--rom-colors-color1));
654
+ grid-column: 1 / -1;
655
+ display: flex;
656
+ align-items: center;
657
+ justify-content: flex-end;
658
+ height: 3rem;
659
+ margin-bottom: var(--rom-panel-gap);
660
+ padding: 0 1rem;
661
+ background:
662
+ linear-gradient(135deg, var(--rom-line) calc(var(--rom-c) * 0.7071 + var(--rom-line-std)), transparent 0),
663
+ linear-gradient(315deg, var(--rom-line) calc(var(--rom-c) * 0.7071 + var(--rom-line-std)), transparent 0),
664
+ var(--rom-colors-background);
665
+ box-shadow: inset 0 0 0 var(--rom-line-std) var(--rom-line);
666
+ color: var(--rom-colors-color5);
667
+ font-size: 1.5rem;
668
+ letter-spacing: 0.3em;
669
+ }
670
+
671
+ .rom-keypad-display[data-state="ok"] { --rom-line: var(--rom-status-ok); color: var(--rom-status-ok); }
672
+ .rom-keypad-display[data-state="error"] { --rom-line: var(--rom-status-error); color: var(--rom-status-error); }
673
+
674
+ /* ==================== 40-display.css ==================== */
675
+
676
+ /* #################### DATA CASCADE #################### */
677
+
678
+ /* Hex groups that flicker one by one */
679
+ .rom-cascade {
680
+ display: flex;
681
+ max-width: 100%;
682
+ overflow: hidden;
683
+ gap: 1.4em;
684
+ font-size: var(--rom-panel-label-size);
685
+ font-variant-numeric: tabular-nums;
686
+ color: var(--rom-colors-color2);
687
+ }
688
+
689
+ .rom-cascade-col {
690
+ display: flex;
691
+ flex-direction: column;
692
+ gap: 0.45em;
693
+ }
694
+
695
+ .rom-cascade-col:nth-child(3n + 2) { color: var(--rom-colors-color6); }
696
+ .rom-cascade-col:nth-child(3n + 3) { color: var(--rom-colors-color3); }
697
+
698
+ /* each cell sets --i (stagger index) */
699
+ .rom-cascade-col > span {
700
+ animation: rom-cascade 5s steps(1) infinite;
701
+ animation-delay: calc(var(--i, 0) * 170ms);
702
+ }
703
+
704
+ @keyframes rom-cascade {
705
+ 0% { color: var(--rom-colors-color5); text-shadow: 0 0 0.5em currentColor; }
706
+ 5% { color: inherit; text-shadow: none; }
707
+ }
708
+
709
+ /* #################### READOUT #################### */
710
+
711
+ /* Label, dotted leader line, value */
712
+ .rom-readout {
713
+ display: grid;
714
+ grid-template-columns: minmax(0, 1fr) auto;
715
+ align-items: baseline;
716
+ gap: 0.5em 0.6em;
717
+ margin: 0;
718
+ font-size: var(--rom-panel-label-size);
719
+ }
720
+
721
+ .rom-readout > div { display: contents; }
722
+
723
+ .rom-readout dt {
724
+ display: flex;
725
+ align-items: baseline;
726
+ gap: 0.6em;
727
+ color: var(--rom-bg, var(--rom-colors-color3));
728
+ }
729
+
730
+ .rom-readout dt::after {
731
+ content: "";
732
+ flex: 1 1 2rem;
733
+ border-bottom: var(--rom-line-thin) dotted color-mix(in srgb, currentColor 60%, transparent);
734
+ }
735
+
736
+ .rom-readout dd {
737
+ margin: 0;
738
+ text-align: right;
739
+ color: var(--rom-colors-color5);
740
+ font-variant-numeric: tabular-nums;
741
+ }
742
+
743
+ /* #################### LEVEL BAR #################### */
744
+
745
+ /* Slanted segments */
746
+ .rom-level {
747
+ --rom-line: var(--rom-bg, var(--rom-colors-color1));
748
+ display: flex;
749
+ gap: 0.25rem;
750
+ height: 1.1rem;
751
+ padding: 0 0.3rem;
752
+ }
753
+
754
+ .rom-level > span {
755
+ flex: 1 1 0;
756
+ transform: skewX(-25deg);
757
+ background: color-mix(in srgb, var(--rom-line) 18%, var(--rom-colors-background));
758
+ }
759
+
760
+ .rom-level > span[data-on] {
761
+ background: var(--rom-line);
762
+ box-shadow: 0 0 0.4rem color-mix(in srgb, var(--rom-line) 60%, transparent);
763
+ }
764
+
765
+ /* Vertical: stacked chevrons */
766
+ .rom-level[data-orientation="vertical"] {
767
+ flex-direction: column-reverse;
768
+ width: 1.8rem;
769
+ height: 9rem;
770
+ padding: 0;
771
+ }
772
+ .rom-level[data-orientation="vertical"] > span {
773
+ transform: none;
774
+ clip-path: polygon(0 40%, 50% 0, 100% 40%, 100% 100%, 50% 60%, 0 100%);
775
+ }
776
+
777
+ /* #################### GAUGE (set --value 0–100) #################### */
778
+
779
+ /* Full ring of segments, value in the center */
780
+ .rom-gauge {
781
+ --value: 0;
782
+ --segments: 24;
783
+ --rom-line: var(--rom-bg, var(--rom-colors-color1));
784
+ position: relative;
785
+ display: inline-flex;
786
+ flex-direction: column;
787
+ align-items: center;
788
+ justify-content: center;
789
+ gap: 0.4em;
790
+ width: 9rem;
791
+ aspect-ratio: 1;
792
+ font-size: 1.8rem;
793
+ color: var(--rom-colors-color5);
794
+ }
795
+
796
+ .rom-gauge::before {
797
+ content: "";
798
+ position: absolute;
799
+ inset: 0;
800
+ background: conic-gradient(
801
+ var(--rom-line) calc(var(--value) * 3.6deg),
802
+ color-mix(in srgb, var(--rom-line) 18%, var(--rom-colors-background)) 0);
803
+ -webkit-mask:
804
+ radial-gradient(farthest-side, transparent 72%, #000 calc(72% + 1px) 100%, transparent 0),
805
+ repeating-conic-gradient(#000 0 calc(360deg / var(--segments) - 3deg), transparent 0 calc(360deg / var(--segments)));
806
+ -webkit-mask-composite: source-in;
807
+ mask:
808
+ radial-gradient(farthest-side, transparent 72%, #000 calc(72% + 1px) 100%, transparent 0),
809
+ repeating-conic-gradient(#000 0 calc(360deg / var(--segments) - 3deg), transparent 0 calc(360deg / var(--segments)));
810
+ mask-composite: intersect;
811
+ }
812
+
813
+ /* Inner ring */
814
+ .rom-gauge::after {
815
+ content: "";
816
+ position: absolute;
817
+ inset: 22%;
818
+ border: var(--rom-line-thin) solid color-mix(in srgb, var(--rom-line) 50%, transparent);
819
+ border-radius: 50%;
820
+ }
821
+
822
+ .rom-gauge > * { position: relative; }
823
+
824
+ .rom-gauge > small {
825
+ font-size: 0.32em;
826
+ color: var(--rom-line);
827
+ }
828
+
829
+ /* #################### SENSOR / BLIP / SCAN #################### */
830
+
831
+ /* Triangular grid with crosshair */
832
+ .rom-sensor {
833
+ --rom-c: var(--rom-chamfer-l);
834
+ --rom-line: var(--rom-bg, var(--rom-colors-color6));
835
+ --rom-grid: color-mix(in srgb, var(--rom-line) 22%, transparent);
836
+ position: relative;
837
+ overflow: hidden;
838
+ aspect-ratio: 16 / 9;
839
+ background:
840
+ linear-gradient(var(--rom-line), var(--rom-line)) center / 1px 100% no-repeat,
841
+ linear-gradient(var(--rom-line), var(--rom-line)) center / 100% 1px no-repeat,
842
+ repeating-linear-gradient(0deg, var(--rom-grid) 0 1px, transparent 1px 1.75rem),
843
+ repeating-linear-gradient(60deg, var(--rom-grid) 0 1px, transparent 1px 1.75rem),
844
+ repeating-linear-gradient(120deg, var(--rom-grid) 0 1px, transparent 1px 1.75rem),
845
+ var(--rom-colors-background);
846
+ }
847
+
848
+ .rom-sensor::before {
849
+ content: "";
850
+ position: absolute;
851
+ inset: 0;
852
+ z-index: 1;
853
+ pointer-events: none;
854
+ background:
855
+ linear-gradient(135deg, var(--rom-line) calc(var(--rom-c) * 0.7071 + var(--rom-line-std)), transparent 0),
856
+ linear-gradient(315deg, var(--rom-line) calc(var(--rom-c) * 0.7071 + var(--rom-line-std)), transparent 0);
857
+ box-shadow: inset 0 0 0 var(--rom-line-std) var(--rom-line);
858
+ }
859
+
860
+ /* --x / --y: position in percent (0–100) – contacts as diamonds */
861
+ .rom-blip {
862
+ position: absolute;
863
+ left: calc(var(--x, 50) * 1%);
864
+ top: calc(var(--y, 50) * 1%);
865
+ width: 0.8rem;
866
+ height: 0.8rem;
867
+ translate: -50% -50%;
868
+ rotate: 45deg;
869
+ background: var(--rom-bg);
870
+ box-shadow: 0 0 0.6rem var(--rom-bg);
871
+ animation: rom-pulse 1.1s ease-in-out infinite alternate;
872
+ }
873
+
874
+ .rom-blip:not([data-color]) { --rom-bg: var(--rom-colors-color5); }
875
+
876
+ /* Radar sweep around the center */
877
+ .rom-scan::after {
878
+ content: "";
879
+ position: absolute;
880
+ left: 50%;
881
+ top: 50%;
882
+ width: 250%;
883
+ aspect-ratio: 1;
884
+ translate: -50% -50%;
885
+ background: conic-gradient(transparent 0 300deg, color-mix(in srgb, var(--rom-colors-color5) 35%, transparent) 360deg);
886
+ animation: rom-sweep 4s linear infinite;
887
+ pointer-events: none;
888
+ }
889
+
890
+ @keyframes rom-sweep {
891
+ to { rotate: 360deg; }
892
+ }
893
+
894
+ /* #################### STATUS INDICATOR #################### */
895
+
896
+ .rom-status {
897
+ --rom-status: var(--rom-status-off);
898
+ display: inline-flex;
899
+ align-items: center;
900
+ gap: 0.7em;
901
+ font-size: var(--rom-panel-label-size);
902
+ color: var(--rom-colors-color5);
903
+ }
904
+
905
+ /* Diamond lamp */
906
+ .rom-status::before {
907
+ content: "";
908
+ width: 0.65em;
909
+ height: 0.65em;
910
+ rotate: 45deg;
911
+ background: var(--rom-status);
912
+ box-shadow: 0 0 0.5em var(--rom-status);
913
+ }
914
+
915
+ .rom-status[data-status="ok"] { --rom-status: var(--rom-status-ok); }
916
+ .rom-status[data-status="warn"] { --rom-status: var(--rom-status-warn); }
917
+ .rom-status[data-status="error"] { --rom-status: var(--rom-status-error); }
918
+ .rom-status[data-status="off"] { --rom-status: var(--rom-status-off); }
919
+ .rom-status[data-status="off"]::before { box-shadow: none; }
920
+
921
+ .rom-status[data-blink]::before {
922
+ animation: rom-blink 1s infinite;
923
+ }
924
+
925
+ /* #################### ALERT #################### */
926
+
927
+ /* Hexagonal banner with chevrons on both sides */
928
+ .rom-alert {
929
+ --rom-bg: var(--rom-alert-red);
930
+ display: inline-flex;
931
+ align-items: center;
932
+ gap: 1.5rem;
933
+ padding: 0.9rem 3.2rem;
934
+ background: var(--rom-bg);
935
+ color: var(--rom-colors-text1);
936
+ clip-path: polygon(1.6rem 0, calc(100% - 1.6rem) 0, 100% 50%, calc(100% - 1.6rem) 100%, 1.6rem 100%, 0 50%);
937
+ animation: rom-blink 1.2s infinite;
938
+ }
939
+
940
+ .rom-alert[data-level="yellow"] { --rom-bg: var(--rom-alert-yellow); }
941
+
942
+ .rom-alert::before,
943
+ .rom-alert::after {
944
+ content: "";
945
+ width: 1.6rem;
946
+ height: 1.6rem;
947
+ background: var(--rom-colors-text1);
948
+ clip-path: polygon(0 0, 45% 0, 100% 50%, 45% 100%, 0 100%, 55% 50%);
949
+ }
950
+ .rom-alert::before { rotate: 180deg; }
951
+
952
+ .rom-alert-title {
953
+ font-size: 2.6rem;
954
+ letter-spacing: 0.25em;
955
+ }
956
+
957
+ .rom-alert-text {
958
+ font-size: 0.95rem;
959
+ letter-spacing: 0.15em;
960
+ }
961
+
962
+ /* Alert mode on any container: palette comes from the alert section,
963
+ panel lines and bars pulse */
964
+ [data-alert] .rom-panel::before,
965
+ [data-alert] .rom-panel::after,
966
+ [data-alert] :is(.rom-bar, .rom-block) {
967
+ animation: rom-pulse 1.4s ease-in-out infinite alternate;
968
+ }
969
+
970
+ [data-alert="red"] .rom-panel::before,
971
+ [data-alert="red"] .rom-panel::after,
972
+ [data-alert="red"] :is(.rom-bar, .rom-block) {
973
+ animation-duration: 0.7s;
974
+ }
975
+
976
+ /* ==================== 90-responsive.css ==================== */
977
+
978
+ /* #################### RESPONSIVE #################### */
979
+
980
+ /* Narrow screens: sidebar becomes a row of buttons above the content */
981
+ @media (max-width: 720px) {
982
+ .rom-panel {
983
+ grid-template-columns: minmax(0, 1fr);
984
+ padding: calc(var(--rom-panel-padding) * 0.6);
985
+ }
986
+
987
+ .rom-stack {
988
+ flex-direction: row;
989
+ flex-wrap: wrap;
990
+ width: auto;
991
+ }
992
+
993
+ .rom-stack > * {
994
+ width: auto;
995
+ flex: 1 1 5rem;
996
+ }
997
+
998
+ .rom-stack > .rom-btn,
999
+ .rom-stack > .rom-block {
1000
+ height: calc(var(--rom-panel-segment-height) * 0.8);
1001
+ min-height: 0;
1002
+ }
1003
+
1004
+ .rom-stack > .rom-block[data-fill] {
1005
+ display: none;
1006
+ }
1007
+
1008
+ .rom-title {
1009
+ font-size: calc(var(--rom-panel-title-size) * 0.75);
1010
+ letter-spacing: 0.15em;
1011
+ }
1012
+
1013
+ .rom-grid {
1014
+ grid-template-columns: repeat(auto-fill, minmax(6rem, 1fr));
1015
+ }
1016
+
1017
+ .rom-alert {
1018
+ padding: 0.7rem 2.4rem;
1019
+ }
1020
+
1021
+ .rom-alert-title {
1022
+ font-size: 1.8rem;
1023
+ }
1024
+ }