@classcad/mcp 0.1.5 → 0.2.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.
Files changed (41) hide show
  1. package/README.md +21 -3
  2. package/dist/auth.d.ts +7 -0
  3. package/dist/auth.js +2 -2
  4. package/dist/auth.js.map +1 -1
  5. package/dist/client.d.ts +2 -12
  6. package/dist/client.js +1 -23
  7. package/dist/client.js.map +1 -1
  8. package/dist/mcp-server.d.ts +1 -1
  9. package/dist/mcp-server.js +9 -3
  10. package/dist/mcp-server.js.map +1 -1
  11. package/dist/queue.d.ts +7 -0
  12. package/dist/queue.js +22 -9
  13. package/dist/queue.js.map +1 -1
  14. package/dist/tools/auth.js +1 -1
  15. package/dist/tools/auth.js.map +1 -1
  16. package/dist/tools/lifecycle.js +42 -20
  17. package/dist/tools/lifecycle.js.map +1 -1
  18. package/dist/tools/viewer.d.ts +6 -0
  19. package/dist/tools/viewer.js +110 -0
  20. package/dist/tools/viewer.js.map +1 -0
  21. package/dist/viewer/scene.d.ts +60 -0
  22. package/dist/viewer/scene.js +271 -0
  23. package/dist/viewer/scene.js.map +1 -0
  24. package/dist/viewer/server.d.ts +27 -0
  25. package/dist/viewer/server.js +229 -0
  26. package/dist/viewer/server.js.map +1 -0
  27. package/dist/viewer-page/cube.svg +15 -0
  28. package/dist/viewer-page/fonts/LICENSE.txt +3 -0
  29. package/dist/viewer-page/fonts/jetbrains-mono-latin.woff2 +0 -0
  30. package/dist/viewer-page/index.html +135 -0
  31. package/dist/viewer-page/vendor/LICENSE.txt +21 -0
  32. package/dist/viewer-page/vendor/VERSION.txt +1 -0
  33. package/dist/viewer-page/vendor/addons/controls/OrbitControls.js +1963 -0
  34. package/dist/viewer-page/vendor/addons/lines/LineMaterial.js +726 -0
  35. package/dist/viewer-page/vendor/addons/lines/LineSegments2.js +434 -0
  36. package/dist/viewer-page/vendor/addons/lines/LineSegmentsGeometry.js +298 -0
  37. package/dist/viewer-page/vendor/three.core.min.js +6 -0
  38. package/dist/viewer-page/vendor/three.module.min.js +6 -0
  39. package/dist/viewer-page/viewer.css +717 -0
  40. package/dist/viewer-page/viewer.js +530 -0
  41. package/package.json +4 -3
@@ -0,0 +1,717 @@
1
+ /* The ClassCAD viewer, set in the family's language for apps (BRANDING.md, "The app"):
2
+ an instrument around the part. One face (JetBrains Mono), chrome that is flat and ruled,
3
+ and red only for the thing in hand. */
4
+
5
+ @font-face {
6
+ font-family: 'JetBrains Mono';
7
+ font-style: normal;
8
+ font-weight: 100 800;
9
+ font-display: block;
10
+ src: url(/assets/fonts/jetbrains-mono-latin.woff2) format('woff2');
11
+ }
12
+
13
+ :root {
14
+ --rcad-font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
15
+ --rcad-bar-h: 48px;
16
+ --rcad-status-h: 26px;
17
+ --rcad-side-w: 288px;
18
+ --rcad-row-h: 30px;
19
+ --rcad-ctl-h: 28px;
20
+ --rcad-tool: 32px;
21
+ --rcad-r-ctl: 7px;
22
+ --snap: cubic-bezier(0.2, 0.9, 0.2, 1);
23
+
24
+ --rcad-ink: #0f1320;
25
+ --rcad-ink-2: #2a2f3a;
26
+ --rcad-mute: #5d6474;
27
+ --rcad-dim: #8a90a0;
28
+ --rcad-line: rgba(15, 19, 32, 0.1);
29
+ --rcad-line-2: rgba(15, 19, 32, 0.16);
30
+ --rcad-chrome: #ffffff;
31
+ --rcad-chrome-line: #e3e5ea;
32
+ --rcad-panel: #ffffff;
33
+ --rcad-panel-2: #f5f6f8;
34
+ --rcad-viewport: #f3f4f7;
35
+ --rcad-hover: rgba(15, 19, 32, 0.045);
36
+ --rcad-active: rgba(15, 19, 32, 0.08);
37
+ --rcad-accent: #e7000b;
38
+ --rcad-accent-line: rgba(231, 0, 11, 0.45);
39
+ --rcad-accent-wash: rgba(231, 0, 11, 0.07);
40
+ --rcad-green: #2fbf71;
41
+ --rcad-orange: #e8650a;
42
+ --rcad-toast-bg: #121620;
43
+ --rcad-toast-text: #9aa6bd;
44
+ --rcad-toast-strong: #ffffff;
45
+ --cube-a: #e8232a;
46
+ --cube-b: #8f0d10;
47
+ --axis-x: #e7000b;
48
+ --axis-y: #2fbf71;
49
+ --axis-z: #0060cc;
50
+ --shadow: 0 1px 2px rgba(15, 19, 32, 0.05), 0 12px 32px -14px rgba(15, 19, 32, 0.18);
51
+ --ring: 0 0 0 1px rgba(15, 19, 32, 0.08);
52
+ }
53
+
54
+ :root[data-theme='dark'] {
55
+ --rcad-ink: #dcdee3;
56
+ --rcad-ink-2: #b9bdc5;
57
+ --rcad-mute: #9197a2;
58
+ --rcad-dim: #6c717c;
59
+ --rcad-line: rgba(220, 222, 227, 0.08);
60
+ --rcad-line-2: rgba(220, 222, 227, 0.14);
61
+ --rcad-chrome: #1f2227;
62
+ --rcad-chrome-line: #2b2f36;
63
+ --rcad-panel: #1c1f24;
64
+ --rcad-panel-2: #23262c;
65
+ --rcad-viewport: #1b1e23;
66
+ --rcad-hover: rgba(220, 222, 227, 0.055);
67
+ --rcad-active: rgba(220, 222, 227, 0.1);
68
+ --rcad-accent: #ea6a64;
69
+ --rcad-accent-line: rgba(234, 106, 100, 0.5);
70
+ --rcad-accent-wash: rgba(234, 106, 100, 0.1);
71
+ --rcad-green: #60bb83;
72
+ --rcad-orange: #d98a50;
73
+ --rcad-toast-bg: #25282e;
74
+ --rcad-toast-text: #a4aab5;
75
+ --rcad-toast-strong: #eef0f3;
76
+ --cube-a: #e8413f;
77
+ --cube-b: #9a1a1a;
78
+ --axis-x: #ea6a64;
79
+ --axis-y: #60bb83;
80
+ --axis-z: #93b8e8;
81
+ --shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 12px 32px -14px rgba(0, 0, 0, 0.6);
82
+ --ring: 0 0 0 1px rgba(220, 222, 227, 0.08);
83
+ }
84
+
85
+ * {
86
+ box-sizing: border-box;
87
+ }
88
+ html,
89
+ body {
90
+ height: 100%;
91
+ margin: 0;
92
+ }
93
+ body {
94
+ background: var(--rcad-viewport);
95
+ color: var(--rcad-ink-2);
96
+ font: 500 12px/1.45 var(--rcad-font-mono);
97
+ font-variant-ligatures: none;
98
+ font-variant-numeric: tabular-nums;
99
+ -webkit-font-smoothing: antialiased;
100
+ overflow: hidden;
101
+ }
102
+ button {
103
+ font: inherit;
104
+ color: inherit;
105
+ }
106
+ :focus-visible {
107
+ outline: 2px solid var(--rcad-accent-line);
108
+ outline-offset: 1px;
109
+ }
110
+
111
+ /* ── the frame: bar, sidebar and stage, title block ───────────────────────── */
112
+ .app {
113
+ display: grid;
114
+ grid-template: var(--rcad-bar-h) 1fr var(--rcad-status-h) / var(--rcad-side-w) 1fr;
115
+ grid-template-areas: 'bar bar' 'side stage' 'title title';
116
+ height: 100%;
117
+ }
118
+
119
+ .bar {
120
+ grid-area: bar;
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: space-between;
124
+ padding: 0 10px 0 14px;
125
+ background: var(--rcad-chrome);
126
+ border-bottom: 1px solid var(--rcad-chrome-line);
127
+ }
128
+ .bar__lead,
129
+ .bar__trail {
130
+ display: flex;
131
+ align-items: center;
132
+ gap: 2px;
133
+ }
134
+ .mark {
135
+ flex: none;
136
+ }
137
+ .mark__a {
138
+ fill: var(--cube-a);
139
+ }
140
+ .mark__b {
141
+ fill: var(--cube-b);
142
+ }
143
+ .bar__name {
144
+ margin-left: 9px;
145
+ font-weight: 600;
146
+ font-size: 13px;
147
+ letter-spacing: -0.01em;
148
+ color: var(--rcad-ink);
149
+ }
150
+ .bar__rule {
151
+ width: 1px;
152
+ height: 18px;
153
+ margin: 0 7px 0 12px;
154
+ background: var(--rcad-chrome-line);
155
+ }
156
+
157
+ /* a tool: 32px, its drawing 20px */
158
+ .tool {
159
+ display: inline-flex;
160
+ align-items: center;
161
+ justify-content: center;
162
+ gap: 7px;
163
+ width: var(--rcad-tool);
164
+ height: var(--rcad-tool);
165
+ padding: 0;
166
+ border: 0;
167
+ border-radius: var(--rcad-r-ctl);
168
+ background: transparent;
169
+ color: var(--rcad-ink-2);
170
+ cursor: pointer;
171
+ transition: background-color 0.15s, color 0.15s;
172
+ position: relative;
173
+ }
174
+ .tool:hover {
175
+ background: var(--rcad-hover);
176
+ color: var(--rcad-ink);
177
+ }
178
+ .tool:active,
179
+ .tool[aria-expanded='true'] {
180
+ background: var(--rcad-active);
181
+ color: var(--rcad-ink);
182
+ }
183
+ .tool[aria-pressed='true'] {
184
+ background: var(--rcad-active);
185
+ color: var(--rcad-ink);
186
+ }
187
+ .tool[aria-pressed='true']::after {
188
+ content: '';
189
+ position: absolute;
190
+ left: 8px;
191
+ right: 8px;
192
+ bottom: 3px;
193
+ height: 2px;
194
+ border-radius: 1px;
195
+ background: var(--rcad-ink);
196
+ }
197
+ .tool:disabled {
198
+ color: var(--rcad-dim);
199
+ background: transparent;
200
+ cursor: default;
201
+ }
202
+ .tool--word {
203
+ width: auto;
204
+ padding: 0 10px 0 7px;
205
+ font-size: 11.5px;
206
+ line-height: 1;
207
+ }
208
+ /* the drawings' pens */
209
+ .pen {
210
+ fill: none;
211
+ stroke: currentColor;
212
+ stroke-width: 1.5;
213
+ stroke-linecap: round;
214
+ stroke-linejoin: round;
215
+ }
216
+ .pen--pale {
217
+ opacity: 0.4;
218
+ }
219
+ .pen--face {
220
+ fill: color-mix(in srgb, currentColor 14%, transparent);
221
+ }
222
+
223
+ /* menus */
224
+ .menu {
225
+ position: relative;
226
+ }
227
+ .menu__list {
228
+ position: absolute;
229
+ top: calc(100% + 6px);
230
+ left: 0;
231
+ z-index: 20;
232
+ min-width: 248px;
233
+ padding: 4px;
234
+ border-radius: 10px;
235
+ background: var(--rcad-chrome);
236
+ box-shadow: var(--shadow), var(--ring);
237
+ }
238
+ .menu__title {
239
+ margin: 0;
240
+ padding: 7px 9px 6px;
241
+ font-size: 10.5px;
242
+ line-height: 1;
243
+ letter-spacing: 0.13em;
244
+ text-transform: uppercase;
245
+ color: var(--rcad-dim);
246
+ }
247
+ .menu__row {
248
+ display: flex;
249
+ align-items: center;
250
+ justify-content: space-between;
251
+ gap: 16px;
252
+ height: 28px;
253
+ padding: 0 9px;
254
+ border-radius: 6px;
255
+ color: var(--rcad-ink-2);
256
+ text-decoration: none;
257
+ }
258
+ .menu__row:hover {
259
+ background: var(--rcad-hover);
260
+ color: var(--rcad-ink);
261
+ }
262
+ .call {
263
+ font-size: 10.5px;
264
+ line-height: 1;
265
+ color: var(--rcad-dim);
266
+ }
267
+
268
+ /* the theme switch: a 34px square, a half-filled disc */
269
+ .theme {
270
+ width: 34px;
271
+ height: 34px;
272
+ padding: 0;
273
+ border: 1px solid var(--rcad-line);
274
+ border-radius: 8px;
275
+ background: transparent;
276
+ cursor: pointer;
277
+ display: grid;
278
+ place-items: center;
279
+ }
280
+ .theme__disc {
281
+ width: 16px;
282
+ height: 16px;
283
+ border-radius: 50%;
284
+ border: 1.5px solid var(--rcad-mute);
285
+ background: linear-gradient(90deg, var(--rcad-mute) 50%, transparent 50%);
286
+ transition: transform 0.5s var(--snap), border-color 0.15s;
287
+ }
288
+ .theme:hover .theme__disc {
289
+ border-color: var(--rcad-ink);
290
+ background: linear-gradient(90deg, var(--rcad-ink) 50%, transparent 50%);
291
+ }
292
+ :root[data-theme='dark'] .theme__disc {
293
+ transform: rotate(180deg);
294
+ }
295
+
296
+ /* ── the sidebar ──────────────────────────────────────────────────────────── */
297
+ .side {
298
+ grid-area: side;
299
+ display: flex;
300
+ flex-direction: column;
301
+ min-height: 0;
302
+ background: var(--rcad-chrome);
303
+ border-right: 1px solid var(--rcad-chrome-line);
304
+ }
305
+ .head {
306
+ padding: 14px 14px 12px;
307
+ border-bottom: 1px solid var(--rcad-chrome-line);
308
+ }
309
+ .kicker {
310
+ margin: 0 0 5px;
311
+ font-size: 10px;
312
+ line-height: 1;
313
+ letter-spacing: 0.16em;
314
+ text-transform: uppercase;
315
+ color: var(--rcad-accent);
316
+ }
317
+ .docname {
318
+ margin: 0;
319
+ font-size: 14px;
320
+ font-weight: 600;
321
+ line-height: 1.25;
322
+ letter-spacing: -0.01em;
323
+ color: var(--rcad-ink);
324
+ overflow: hidden;
325
+ text-overflow: ellipsis;
326
+ white-space: nowrap;
327
+ }
328
+ .pane {
329
+ display: flex;
330
+ flex-direction: column;
331
+ min-height: 0;
332
+ flex: 1 1 0;
333
+ border-bottom: 1px solid var(--rcad-chrome-line);
334
+ }
335
+ .pane:last-child {
336
+ flex: 0 1 auto;
337
+ max-height: 38%;
338
+ border-bottom: 0;
339
+ }
340
+ .pane__label {
341
+ display: flex;
342
+ justify-content: space-between;
343
+ padding: 12px 14px 8px;
344
+ font-size: 10.5px;
345
+ line-height: 1;
346
+ letter-spacing: 0.13em;
347
+ text-transform: uppercase;
348
+ color: var(--rcad-dim);
349
+ }
350
+ .rows {
351
+ margin: 0;
352
+ padding: 0 6px 8px;
353
+ list-style: none;
354
+ overflow-y: auto;
355
+ min-height: 0;
356
+ }
357
+ .row {
358
+ display: flex;
359
+ align-items: center;
360
+ gap: 9px;
361
+ height: var(--rcad-row-h);
362
+ padding: 0 8px;
363
+ border-radius: 6px;
364
+ color: var(--rcad-ink-2);
365
+ transition: background-color 0.15s, color 0.15s;
366
+ }
367
+ .row:hover {
368
+ background: var(--rcad-hover);
369
+ color: var(--rcad-ink);
370
+ }
371
+ .row__no {
372
+ flex: none;
373
+ width: 18px;
374
+ font-size: 9.5px;
375
+ color: var(--rcad-dim);
376
+ }
377
+ .row__name {
378
+ flex: 1;
379
+ min-width: 0;
380
+ overflow: hidden;
381
+ text-overflow: ellipsis;
382
+ white-space: nowrap;
383
+ }
384
+ .row__swatch {
385
+ flex: none;
386
+ width: 12px;
387
+ height: 12px;
388
+ border-radius: 3px;
389
+ box-shadow: inset 0 0 0 1px var(--rcad-line-2);
390
+ }
391
+ .empty {
392
+ margin: 0;
393
+ padding: 2px 8px 6px;
394
+ font-size: 11.5px;
395
+ line-height: 1.5;
396
+ color: var(--rcad-dim);
397
+ }
398
+
399
+ /* ── the stage ────────────────────────────────────────────────────────────── */
400
+ .stage {
401
+ grid-area: stage;
402
+ position: relative;
403
+ min-width: 0;
404
+ min-height: 0;
405
+ background: var(--rcad-viewport);
406
+ transition: background-color 0.15s;
407
+ overflow: hidden;
408
+ }
409
+ #canvas {
410
+ position: absolute;
411
+ inset: 0;
412
+ width: 100%;
413
+ height: 100%;
414
+ display: block;
415
+ outline: none;
416
+ cursor: grab;
417
+ touch-action: none;
418
+ }
419
+ #canvas:active {
420
+ cursor: grabbing;
421
+ }
422
+ .corner {
423
+ position: absolute;
424
+ width: 12px;
425
+ height: 12px;
426
+ border: 0 solid var(--rcad-line-2);
427
+ pointer-events: none;
428
+ }
429
+ .corner--tl {
430
+ top: 8px;
431
+ left: 8px;
432
+ border-width: 1px 0 0 1px;
433
+ }
434
+ .corner--tr {
435
+ top: 8px;
436
+ right: 8px;
437
+ border-width: 1px 1px 0 0;
438
+ }
439
+ .corner--bl {
440
+ bottom: 8px;
441
+ left: 8px;
442
+ border-width: 0 0 1px 1px;
443
+ }
444
+ .corner--br {
445
+ bottom: 8px;
446
+ right: 8px;
447
+ border-width: 0 1px 1px 0;
448
+ }
449
+ .hud {
450
+ position: absolute;
451
+ top: 16px;
452
+ left: 28px;
453
+ right: 64px;
454
+ margin: 0;
455
+ font-size: 10.5px;
456
+ line-height: 1;
457
+ letter-spacing: 0.14em;
458
+ text-transform: uppercase;
459
+ color: var(--rcad-ink);
460
+ opacity: 0.6;
461
+ overflow: hidden;
462
+ text-overflow: ellipsis;
463
+ white-space: nowrap;
464
+ pointer-events: none;
465
+ }
466
+
467
+ /* the view's dock: upright, at the right */
468
+ .dock {
469
+ position: absolute;
470
+ top: 12px;
471
+ right: 12px;
472
+ display: flex;
473
+ flex-direction: column;
474
+ gap: 2px;
475
+ padding: 3px;
476
+ border-radius: 10px;
477
+ background: var(--rcad-chrome);
478
+ box-shadow: var(--shadow), var(--ring);
479
+ }
480
+ .dock .tool {
481
+ width: 28px;
482
+ height: 28px;
483
+ }
484
+ .dock__rule {
485
+ height: 1px;
486
+ margin: 3px 5px;
487
+ background: var(--rcad-chrome-line);
488
+ }
489
+
490
+ .triad {
491
+ position: absolute;
492
+ left: 18px;
493
+ bottom: 16px;
494
+ overflow: visible;
495
+ pointer-events: none;
496
+ }
497
+ .triad line {
498
+ stroke-width: 1.5;
499
+ stroke-linecap: round;
500
+ }
501
+ .triad text {
502
+ font: 600 9.5px/1 var(--rcad-font-mono);
503
+ text-anchor: middle;
504
+ dominant-baseline: central;
505
+ stroke: none;
506
+ }
507
+ .triad__x {
508
+ stroke: var(--axis-x);
509
+ fill: var(--axis-x);
510
+ }
511
+ .triad__y {
512
+ stroke: var(--axis-y);
513
+ fill: var(--axis-y);
514
+ }
515
+ .triad__z {
516
+ stroke: var(--axis-z);
517
+ fill: var(--axis-z);
518
+ }
519
+
520
+ /* empty and waiting: the bare ground and one line */
521
+ .waiting {
522
+ position: absolute;
523
+ inset: 0;
524
+ display: none;
525
+ flex-direction: column;
526
+ align-items: center;
527
+ justify-content: center;
528
+ gap: 10px;
529
+ pointer-events: none;
530
+ }
531
+ .app[data-state='loading'] .waiting,
532
+ .app[data-state='empty'] .waiting {
533
+ display: flex;
534
+ }
535
+ .app[data-state='loading'] .waiting__note {
536
+ visibility: hidden;
537
+ }
538
+ .app[data-state='loading'] .triad,
539
+ .app[data-state='empty'] .triad {
540
+ display: none;
541
+ }
542
+ .waiting__line {
543
+ display: flex;
544
+ align-items: center;
545
+ gap: 10px;
546
+ margin: 0;
547
+ font-size: 10.5px;
548
+ line-height: 1;
549
+ letter-spacing: 0.14em;
550
+ text-transform: uppercase;
551
+ color: var(--rcad-mute);
552
+ }
553
+ .waiting__note {
554
+ margin: 0;
555
+ font-size: 11.5px;
556
+ color: var(--rcad-dim);
557
+ }
558
+ .arc {
559
+ width: 12px;
560
+ height: 12px;
561
+ border-radius: 50%;
562
+ border: 1.5px solid var(--rcad-orange);
563
+ border-right-color: transparent;
564
+ animation: turn 0.9s linear infinite;
565
+ }
566
+ @keyframes turn {
567
+ to {
568
+ transform: rotate(360deg);
569
+ }
570
+ }
571
+
572
+ /* the engine cannot be reached: a scrim of the ground's own colour, one dark card */
573
+ .scrim {
574
+ position: absolute;
575
+ inset: 0;
576
+ display: grid;
577
+ place-items: center;
578
+ background: color-mix(in srgb, var(--rcad-viewport) 62%, transparent);
579
+ }
580
+ .scrim[hidden] {
581
+ display: none;
582
+ }
583
+ .card {
584
+ max-width: 340px;
585
+ padding: 14px 16px 15px;
586
+ border-radius: 10px;
587
+ background: var(--rcad-toast-bg);
588
+ box-shadow: var(--shadow);
589
+ }
590
+ .card__label {
591
+ margin: 0 0 7px;
592
+ font-size: 10.5px;
593
+ line-height: 1;
594
+ letter-spacing: 0.14em;
595
+ text-transform: uppercase;
596
+ color: var(--rcad-toast-strong);
597
+ }
598
+ .card__text {
599
+ margin: 0;
600
+ font-size: 11.5px;
601
+ line-height: 1.5;
602
+ color: var(--rcad-toast-text);
603
+ }
604
+
605
+ /* tooltips: dark chrome in either theme */
606
+ .tip {
607
+ position: fixed;
608
+ z-index: 30;
609
+ padding: 6px 9px;
610
+ border-radius: 7px;
611
+ background: var(--rcad-toast-bg);
612
+ color: var(--rcad-toast-strong);
613
+ font-size: 11.5px;
614
+ line-height: 1;
615
+ white-space: nowrap;
616
+ pointer-events: none;
617
+ }
618
+ .tip[hidden] {
619
+ display: none;
620
+ }
621
+
622
+ /* ── the title block ──────────────────────────────────────────────────────── */
623
+ .title {
624
+ grid-area: title;
625
+ display: flex;
626
+ align-items: stretch;
627
+ background: var(--rcad-chrome);
628
+ border-top: 1px solid var(--rcad-chrome-line);
629
+ font-size: 10.5px;
630
+ line-height: 1;
631
+ color: var(--rcad-mute);
632
+ white-space: nowrap;
633
+ overflow: hidden;
634
+ }
635
+ .cell {
636
+ display: flex;
637
+ align-items: center;
638
+ gap: 7px;
639
+ padding: 0 12px;
640
+ border-right: 1px solid var(--rcad-chrome-line);
641
+ }
642
+ .cell:last-child {
643
+ border-right: 0;
644
+ }
645
+ .cell--fill {
646
+ flex: 1;
647
+ min-width: 0;
648
+ overflow: hidden;
649
+ text-overflow: ellipsis;
650
+ }
651
+ .cell__k {
652
+ font-size: 9px;
653
+ letter-spacing: 0.14em;
654
+ text-transform: uppercase;
655
+ color: var(--rcad-dim);
656
+ }
657
+ .cell b {
658
+ font-weight: 600;
659
+ color: var(--rcad-ink);
660
+ }
661
+ .cell b .unit {
662
+ font-weight: 500;
663
+ color: var(--rcad-dim);
664
+ }
665
+ .dot {
666
+ width: 6px;
667
+ height: 6px;
668
+ border-radius: 50%;
669
+ background: var(--rcad-green);
670
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--rcad-green) 22%, transparent);
671
+ animation: live 2.4s ease-in-out infinite;
672
+ }
673
+ .dot[data-state='working'] {
674
+ background: var(--rcad-orange);
675
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--rcad-orange) 22%, transparent);
676
+ }
677
+ .dot[data-state='off'] {
678
+ background: var(--rcad-dim);
679
+ box-shadow: none;
680
+ animation: none;
681
+ }
682
+ @keyframes live {
683
+ 50% {
684
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--rcad-green) 0%, transparent);
685
+ }
686
+ }
687
+
688
+ /* the title block gives up its least cells first */
689
+ @media (max-width: 1120px) {
690
+ .cell--wider {
691
+ display: none;
692
+ }
693
+ }
694
+ /* narrow: the stage alone, the sidebar gone */
695
+ @media (max-width: 760px) {
696
+ .app {
697
+ grid-template-columns: 0 1fr;
698
+ }
699
+ .side {
700
+ display: none;
701
+ }
702
+ .cell--wide {
703
+ display: none;
704
+ }
705
+ }
706
+ @media (prefers-reduced-motion: reduce) {
707
+ .dot,
708
+ .arc {
709
+ animation: none;
710
+ }
711
+ .theme__disc,
712
+ .tool,
713
+ .row,
714
+ .stage {
715
+ transition: none;
716
+ }
717
+ }