rshow 0.0.0-stage → 0.0.2

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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -2
  3. package/dist/main.js +8500 -0
  4. package/package.json +48 -4
  5. package/skills/rshow/SKILL.md +144 -0
  6. package/skills/rshow/reference/cli.md +263 -0
  7. package/skills/rshow/reference/dashboard.md +122 -0
  8. package/skills/rshow/reference/mockups.md +113 -0
  9. package/skills/rshow/reference/page-contract.md +83 -0
  10. package/skills/rshow/reference/pages.md +174 -0
  11. package/skills/rshow/reference/poster.md +137 -0
  12. package/skills/rshow/reference/project-page.md +132 -0
  13. package/skills/rshow/reference/reports.md +158 -0
  14. package/skills/rshow/reference/sketch.md +78 -0
  15. package/skills/rshow/reference/terminal.md +148 -0
  16. package/skills/rshow/reference/themes.md +139 -0
  17. package/skills/rshow-implement/SKILL.md +112 -0
  18. package/skills/rshow-implement/reference/compare.md +156 -0
  19. package/skills/rshow-implement/reference/handoff.md +125 -0
  20. package/skills/rshow-implement/reference/map.md +151 -0
  21. package/skills/rshow-slides/SKILL.md +136 -0
  22. package/skills/rshow-slides/reference/layouts.md +251 -0
  23. package/themes/default/dashboard.css +521 -0
  24. package/themes/default/dashboard.js +1390 -0
  25. package/themes/default/deck.css +586 -0
  26. package/themes/default/deck.js +741 -0
  27. package/themes/default/example/capture.ans +1 -0
  28. package/themes/default/example/dashboard.html +106 -0
  29. package/themes/default/example/demo.cast +14 -0
  30. package/themes/default/example/drawing.excalidraw +377 -0
  31. package/themes/default/example/index.html +311 -0
  32. package/themes/default/example/mockup-desktop.html +331 -0
  33. package/themes/default/example/mockup-platforms.html +742 -0
  34. package/themes/default/example/mockup.html +416 -0
  35. package/themes/default/example/page.html +153 -0
  36. package/themes/default/example/poster-figure.svg +58 -0
  37. package/themes/default/example/poster.html +181 -0
  38. package/themes/default/example/project.html +229 -0
  39. package/themes/default/example/report.html +404 -0
  40. package/themes/default/example/results.csv +61 -0
  41. package/themes/default/example/sketch.html +178 -0
  42. package/themes/default/example/teaser.svg +66 -0
  43. package/themes/default/example/terminal.html +231 -0
  44. package/themes/default/example/tui.html +223 -0
  45. package/themes/default/fonts/IBMPlexMono-Regular-Latin1.woff2 +0 -0
  46. package/themes/default/fonts/IBMPlexSans-Light-Latin1.woff2 +0 -0
  47. package/themes/default/fonts/IBMPlexSans-Regular-Latin1.woff2 +0 -0
  48. package/themes/default/fonts/IBMPlexSans-SemiBold-Latin1.woff2 +0 -0
  49. package/themes/default/fonts/OFL.txt +93 -0
  50. package/themes/default/fonts.css +63 -0
  51. package/themes/default/index.html +573 -0
  52. package/themes/default/mockup.css +1078 -0
  53. package/themes/default/mockup.js +1433 -0
  54. package/themes/default/mode.js +242 -0
  55. package/themes/default/page.css +320 -0
  56. package/themes/default/poster.css +480 -0
  57. package/themes/default/poster.js +223 -0
  58. package/themes/default/project.css +482 -0
  59. package/themes/default/project.js +116 -0
  60. package/themes/default/report.css +776 -0
  61. package/themes/default/report.js +427 -0
  62. package/themes/default/sketch.css +166 -0
  63. package/themes/default/sketch.js +681 -0
  64. package/themes/default/skins/adwaita.css +669 -0
  65. package/themes/default/skins/custom.css +596 -0
  66. package/themes/default/skins/egui.css +639 -0
  67. package/themes/default/skins/fluent.css +1093 -0
  68. package/themes/default/skins/fluent.js +458 -0
  69. package/themes/default/skins/mac.css +647 -0
  70. package/themes/default/skins/material.css +692 -0
  71. package/themes/default/skins/sketch.css +436 -0
  72. package/themes/default/skins/sketch.js +494 -0
  73. package/themes/default/skins/wire.css +561 -0
  74. package/themes/default/terminal.css +292 -0
  75. package/themes/default/terminal.js +433 -0
  76. package/themes/default/theme.json +149 -0
  77. package/themes/default/tokens.css +255 -0
  78. package/themes/default/tui.css +703 -0
  79. package/themes/default/tui.js +472 -0
  80. package/worker/index.js +6918 -0
  81. package/worker/migrations/0001_init.sql +52 -0
  82. package/worker/migrations/0002_blobs.sql +5 -0
  83. package/worker/migrations/0003_projects.sql +31 -0
  84. package/worker/migrations/0004_page_data_blob.sql +19 -0
@@ -0,0 +1,639 @@
1
+ /*
2
+ * rshow theme "default": the egui skin, layer 3.
3
+ *
4
+ * egui is an immediate mode toolkit that paints every pixel itself, so its
5
+ * default look is the opposite of a platform skin: no chrome, no shadow, one
6
+ * flat gray ground, widgets that are rectangles a shade off it, a 2px corner, a
7
+ * thin stroke, small text and tight spacing. This skin draws the wf-* kit that
8
+ * way, and a mockup in a bare frame with it reads as a tool someone built, not
9
+ * as a window someone shipped.
10
+ *
11
+ * Two visual languages, both egui's: dark (its default, gray 27 ground with
12
+ * gray 60 widgets) and light (its light visuals, gray 248 ground). The dark
13
+ * values are the default and the light values sit behind the light mode, which
14
+ * is the reverse of the other skins and is what the toolkit does.
15
+ *
16
+ * The one colour is the selection blue, #005c80, because egui has exactly one
17
+ * accent and it uses it for a selection and for a hyperlink.
18
+ *
19
+ * Knobs: the custom.css set plus --mk-surface, --mk-surface-2, --mk-on-accent,
20
+ * --mk-accent-soft, --mk-radius-lg, --mk-ctl-h, --mk-line-h, --mk-select.
21
+ */
22
+
23
+ /* ---------------------------------------------------- the screen, dark -- */
24
+
25
+ /* egui's dark visuals are the default, so they are also what a page with no
26
+ mode preference gets: this skin is dark unless the reader chose light. */
27
+
28
+ [data-skin="egui"] {
29
+ --mk-bg: #1b1b1b;
30
+
31
+ /* the window chrome the frame draws, in the same two modes */
32
+ --mk-chrome-bg: #1b1b1b;
33
+ --mk-chrome-bg-2: #232323;
34
+ --mk-chrome-line: #3c3c3c;
35
+ --mk-chrome-fg: #c8c8c8;
36
+ --mk-surface: #232323;
37
+ --mk-surface-2: #1b1b1b;
38
+ --mk-fg: #c8c8c8;
39
+ --mk-muted: #8c8c8c;
40
+ --mk-line: #3c3c3c;
41
+ --mk-line-strong: #4a4a4a;
42
+ --mk-fill: #2a2a2a;
43
+
44
+ --mk-accent: #005c80;
45
+ --mk-accent-hover: #0072a0;
46
+ --mk-accent-soft: #16323c;
47
+ --mk-on-accent: #ffffff;
48
+ --mk-focus: #5caaff;
49
+ --mk-select: #5caaff;
50
+
51
+ /* egui has no pills and no cards: two pixels on a widget, three on a window */
52
+ --mk-radius: 2px;
53
+ --mk-radius-lg: 3px;
54
+
55
+ --mk-font: system-ui, -apple-system, "Segoe UI", sans-serif;
56
+ --mk-size: 12px;
57
+ --mk-line-h: 16px;
58
+ --mk-ctl-h: 22px;
59
+ --mk-gap: 6px;
60
+ --mk-pad: 8px;
61
+ }
62
+
63
+ /* --------------------------------------------------- the screen, light -- */
64
+
65
+ @media (prefers-color-scheme: light) {
66
+ :root:not([data-mode="dark"]) [data-skin="egui"] {
67
+ --mk-bg: #f8f8f8;
68
+
69
+ /* the window chrome the frame draws, in the same two modes */
70
+ --mk-chrome-bg: #f0f0f0;
71
+ --mk-chrome-bg-2: #e6e6e6;
72
+ --mk-chrome-line: #bdbdbd;
73
+ --mk-chrome-fg: #1b1b1b;
74
+ --mk-surface: #ffffff;
75
+ --mk-surface-2: #f0f0f0;
76
+ --mk-fg: #1b1b1b;
77
+ --mk-muted: #5a5a5a;
78
+ --mk-line: #bdbdbd;
79
+ --mk-line-strong: #a8a8a8;
80
+ --mk-fill: #e6e6e6;
81
+ --mk-accent: #005c80;
82
+ --mk-accent-hover: #0072a0;
83
+ --mk-accent-soft: #d8ebf2;
84
+ --mk-on-accent: #ffffff;
85
+ --mk-focus: #005c80;
86
+ --mk-select: #002b3d;
87
+ }
88
+ }
89
+
90
+ :root[data-mode="light"] [data-skin="egui"] {
91
+ --mk-bg: #f8f8f8;
92
+
93
+ /* the window chrome the frame draws, in the same two modes */
94
+ --mk-chrome-bg: #f0f0f0;
95
+ --mk-chrome-bg-2: #e6e6e6;
96
+ --mk-chrome-line: #bdbdbd;
97
+ --mk-chrome-fg: #1b1b1b;
98
+ --mk-surface: #ffffff;
99
+ --mk-surface-2: #f0f0f0;
100
+ --mk-fg: #1b1b1b;
101
+ --mk-muted: #5a5a5a;
102
+ --mk-line: #bdbdbd;
103
+ --mk-line-strong: #a8a8a8;
104
+ --mk-fill: #e6e6e6;
105
+ --mk-accent: #005c80;
106
+ --mk-accent-hover: #0072a0;
107
+ --mk-accent-soft: #d8ebf2;
108
+ --mk-on-accent: #ffffff;
109
+ --mk-focus: #005c80;
110
+ --mk-select: #002b3d;
111
+ }
112
+
113
+ /* --------------------------------------------------------------- screen -- */
114
+
115
+ [data-skin="egui"] .mk-screen {
116
+ color: var(--mk-fg);
117
+ background: var(--mk-bg);
118
+ color-scheme: dark;
119
+ }
120
+
121
+ @media (prefers-color-scheme: light) {
122
+ :root:not([data-mode="dark"]) [data-skin="egui"] .mk-screen {
123
+ color-scheme: light;
124
+ }
125
+ }
126
+
127
+ :root[data-mode="light"] [data-skin="egui"] .mk-screen {
128
+ color-scheme: light;
129
+ }
130
+
131
+ [data-skin="egui"] .mk-screen a {
132
+ color: var(--mk-select);
133
+ text-decoration: underline;
134
+ }
135
+
136
+ /* --------------------------------------------------------------- layout -- */
137
+
138
+ [data-skin="egui"] .wf-row {
139
+ display: flex;
140
+ align-items: center;
141
+ gap: var(--mk-gap);
142
+ }
143
+
144
+ [data-skin="egui"] .wf-col {
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: var(--mk-gap);
148
+ }
149
+
150
+ [data-skin="egui"] .wf-row.wf-shell {
151
+ align-items: stretch;
152
+ gap: 0;
153
+ }
154
+
155
+ [data-skin="egui"] .wf-row.wf-top {
156
+ align-items: flex-start;
157
+ }
158
+
159
+ [data-skin="egui"] .wf-spacer,
160
+ [data-skin="egui"] .wf-grow {
161
+ flex: 1 1 auto;
162
+ min-width: 0;
163
+ }
164
+
165
+ /* ----------------------------------------------------------------- type -- */
166
+
167
+ [data-skin="egui"] .wf-heading {
168
+ display: block;
169
+ width: 34%;
170
+ max-width: 16em;
171
+ height: 0.75em;
172
+ background: var(--mk-fg);
173
+ border-radius: 1px;
174
+ opacity: 0.8;
175
+ }
176
+
177
+ [data-skin="egui"] .wf-heading:not(:empty) {
178
+ width: auto;
179
+ max-width: none;
180
+ height: auto;
181
+ font-size: 14px;
182
+ font-weight: 600;
183
+ line-height: 18px;
184
+ background: none;
185
+ opacity: 1;
186
+ }
187
+
188
+ [data-skin="egui"] .wf-text {
189
+ --mk-lines: 2;
190
+ display: block;
191
+ height: calc(var(--mk-lines) * var(--mk-line-h));
192
+ background-image: repeating-linear-gradient(
193
+ to bottom,
194
+ var(--mk-line-strong) 0 5px,
195
+ transparent 5px var(--mk-line-h)
196
+ );
197
+ opacity: 0.8;
198
+ }
199
+
200
+ [data-skin="egui"] .wf-text[data-lines="1"] { --mk-lines: 1; }
201
+ [data-skin="egui"] .wf-text[data-lines="2"] { --mk-lines: 2; }
202
+ [data-skin="egui"] .wf-text[data-lines="3"] { --mk-lines: 3; }
203
+ [data-skin="egui"] .wf-text[data-lines="4"] { --mk-lines: 4; }
204
+ [data-skin="egui"] .wf-text[data-lines="5"] { --mk-lines: 5; }
205
+ [data-skin="egui"] .wf-text[data-lines="6"] { --mk-lines: 6; }
206
+ [data-skin="egui"] .wf-text[data-lines="7"] { --mk-lines: 7; }
207
+ [data-skin="egui"] .wf-text[data-lines="8"] { --mk-lines: 8; }
208
+
209
+ [data-skin="egui"] .wf-text:not(:empty) {
210
+ height: auto;
211
+ font-size: 12px;
212
+ line-height: var(--mk-line-h);
213
+ color: var(--mk-muted);
214
+ background: none;
215
+ opacity: 1;
216
+ }
217
+
218
+ /* --------------------------------------------------------------- blocks -- */
219
+
220
+ /* An egui group is a rectangle with a 1px stroke and nothing else: no shadow,
221
+ no translucency, no second layer. */
222
+ [data-skin="egui"] .wf-box {
223
+ min-height: 32px;
224
+ padding: 6px;
225
+ background: var(--mk-fill);
226
+ border: 1px solid var(--mk-line);
227
+ border-radius: var(--mk-radius);
228
+ }
229
+
230
+ /* egui paints a selected item with the selection colour and a 1px stroke in the
231
+ selection stroke, which is inline in the same frame and not an overlay. */
232
+ [data-skin="egui"] .wf-box.is-active {
233
+ background: var(--mk-accent-soft);
234
+ box-shadow: inset 0 0 0 1px var(--mk-accent);
235
+ }
236
+
237
+ [data-skin="egui"] .wf-card {
238
+ display: flex;
239
+ flex-direction: column;
240
+ gap: var(--mk-gap);
241
+ padding: 8px;
242
+ background: var(--mk-surface);
243
+ border: 1px solid var(--mk-line);
244
+ border-radius: var(--mk-radius-lg);
245
+ }
246
+
247
+ [data-skin="egui"] .wf-image {
248
+ min-height: 120px;
249
+ background-color: var(--mk-fill);
250
+ background-image: linear-gradient(
251
+ to top right,
252
+ transparent calc(50% - 0.5px),
253
+ var(--mk-line-strong) calc(50% - 0.5px),
254
+ var(--mk-line-strong) calc(50% + 0.5px),
255
+ transparent calc(50% + 0.5px)
256
+ ),
257
+ linear-gradient(
258
+ to bottom right,
259
+ transparent calc(50% - 0.5px),
260
+ var(--mk-line-strong) calc(50% - 0.5px),
261
+ var(--mk-line-strong) calc(50% + 0.5px),
262
+ transparent calc(50% + 0.5px)
263
+ );
264
+ border: 1px solid var(--mk-line);
265
+ border-radius: var(--mk-radius);
266
+ }
267
+
268
+ [data-skin="egui"] .wf-avatar {
269
+ flex: 0 0 auto;
270
+ width: 24px;
271
+ height: 24px;
272
+ background: var(--mk-fill);
273
+ border: 1px solid var(--mk-line);
274
+ border-radius: 50%;
275
+ }
276
+
277
+ [data-skin="egui"] .wf-avatar[data-size="sm"] {
278
+ width: 18px;
279
+ height: 18px;
280
+ }
281
+
282
+ [data-skin="egui"] .wf-avatar[data-size="lg"] {
283
+ width: 32px;
284
+ height: 32px;
285
+ }
286
+
287
+ [data-skin="egui"] .wf-icon {
288
+ display: inline-block;
289
+ flex: 0 0 auto;
290
+ width: 12px;
291
+ height: 12px;
292
+ background: var(--mk-fill);
293
+ border: 1px solid var(--mk-line);
294
+ border-radius: 1px;
295
+ }
296
+
297
+ [data-skin="egui"] .wf-icon[data-size="lg"] {
298
+ width: 16px;
299
+ height: 16px;
300
+ }
301
+
302
+ /* ------------------------------------------------------------- controls -- */
303
+
304
+ /* egui's inactive widget is a fill one step off the panel with a 1px stroke in
305
+ the widget stroke grey, and the hovered state is a brighter fill, not a
306
+ colour change. Nothing is a pill and nothing is round. */
307
+ [data-skin="egui"] .wf-button {
308
+ display: inline-flex;
309
+ align-items: center;
310
+ justify-content: center;
311
+ gap: 4px;
312
+ height: var(--mk-ctl-h);
313
+ padding: 0 8px;
314
+ font: inherit;
315
+ font-size: 12px;
316
+ color: var(--mk-fg);
317
+ text-align: center;
318
+ text-decoration: none;
319
+ white-space: nowrap;
320
+ background: var(--mk-fill);
321
+ border: 1px solid var(--mk-line-strong);
322
+ border-radius: var(--mk-radius);
323
+ }
324
+
325
+ [data-skin="egui"] .wf-button.primary {
326
+ color: var(--mk-on-accent);
327
+ background: var(--mk-accent);
328
+ border-color: var(--mk-accent-hover);
329
+ }
330
+
331
+ [data-skin="egui"] .wf-button.ghost {
332
+ color: var(--mk-muted);
333
+ background: transparent;
334
+ border-color: var(--mk-line);
335
+ }
336
+
337
+ [data-skin="egui"] .wf-button[disabled] {
338
+ color: var(--mk-muted);
339
+ opacity: 0.5;
340
+ }
341
+
342
+ [data-skin="egui"] .wf-button:focus-visible,
343
+ [data-skin="egui"] .wf-button[data-focus] {
344
+ outline: 1px solid var(--mk-focus);
345
+ outline-offset: 1px;
346
+ }
347
+
348
+ [data-skin="egui"] .wf-input {
349
+ position: relative;
350
+ display: flex;
351
+ align-items: center;
352
+ min-height: var(--mk-ctl-h);
353
+ padding: 0 6px;
354
+ font-size: 12px;
355
+ color: var(--mk-fg);
356
+ background: var(--mk-surface);
357
+ border: 1px solid var(--mk-line-strong);
358
+ border-radius: var(--mk-radius);
359
+ }
360
+
361
+ /* egui labels a widget above it, in the muted grey, at the same small size. */
362
+ [data-skin="egui"] .wf-input[data-label]::before,
363
+ [data-skin="egui"] .wf-select[data-label]::before,
364
+ [data-skin="egui"] .wf-label {
365
+ position: absolute;
366
+ top: -13px;
367
+ left: 1px;
368
+ z-index: 1;
369
+ padding: 0 2px;
370
+ font-size: 10px;
371
+ line-height: 1.2;
372
+ color: var(--mk-muted);
373
+ background: var(--mk-bg);
374
+ }
375
+
376
+ [data-skin="egui"] .wf-input[data-label]::before,
377
+ [data-skin="egui"] .wf-select[data-label]::before {
378
+ content: attr(data-label);
379
+ }
380
+
381
+ [data-skin="egui"] .wf-input:focus-within {
382
+ border-color: var(--mk-focus);
383
+ }
384
+
385
+ /* An empty field still says what it is: the drawing's placeholder is read out
386
+ of the attribute, so a search box in a title bar is not a blank rectangle. */
387
+ [data-skin="egui"] .wf-input[data-placeholder]:empty::after {
388
+ content: attr(data-placeholder);
389
+ color: var(--mk-muted);
390
+ }
391
+
392
+ [data-skin="egui"] .wf-select {
393
+ position: relative;
394
+ display: flex;
395
+ align-items: center;
396
+ min-height: var(--mk-ctl-h);
397
+ padding: 0 22px 0 6px;
398
+ font-size: 12px;
399
+ color: var(--mk-fg);
400
+ background: var(--mk-fill);
401
+ border: 1px solid var(--mk-line-strong);
402
+ border-radius: var(--mk-radius);
403
+ }
404
+
405
+ [data-skin="egui"] .wf-select::after {
406
+ content: "";
407
+ position: absolute;
408
+ top: 50%;
409
+ right: 7px;
410
+ width: 0;
411
+ height: 0;
412
+ margin-top: -2px;
413
+ border-top: 4px solid var(--mk-muted);
414
+ border-right: 3px solid transparent;
415
+ border-left: 3px solid transparent;
416
+ }
417
+
418
+ [data-skin="egui"] .wf-checkbox {
419
+ position: relative;
420
+ display: inline-block;
421
+ flex: 0 0 auto;
422
+ width: 14px;
423
+ height: 14px;
424
+ background: var(--mk-surface);
425
+ border: 1px solid var(--mk-line-strong);
426
+ border-radius: 2px;
427
+ }
428
+
429
+ [data-skin="egui"] .wf-checkbox[data-checked="true"] {
430
+ background: var(--mk-accent);
431
+ border-color: var(--mk-accent);
432
+ }
433
+
434
+ [data-skin="egui"] .wf-checkbox[data-checked="true"]::after {
435
+ content: "";
436
+ position: absolute;
437
+ top: 1px;
438
+ left: 3.5px;
439
+ width: 3px;
440
+ height: 7px;
441
+ border: solid var(--mk-on-accent);
442
+ border-width: 0 1.5px 1.5px 0;
443
+ transform: rotate(45deg);
444
+ }
445
+
446
+ [data-skin="egui"] .wf-toggle {
447
+ position: relative;
448
+ display: inline-block;
449
+ flex: 0 0 auto;
450
+ width: 26px;
451
+ height: 14px;
452
+ background: var(--mk-fill);
453
+ border: 1px solid var(--mk-line-strong);
454
+ border-radius: 2px;
455
+ }
456
+
457
+ [data-skin="egui"] .wf-toggle::after {
458
+ content: "";
459
+ position: absolute;
460
+ top: 1px;
461
+ left: 1px;
462
+ width: 10px;
463
+ height: 10px;
464
+ background: var(--mk-muted);
465
+ border-radius: 1px;
466
+ }
467
+
468
+ [data-skin="egui"] .wf-toggle.on {
469
+ background: var(--mk-accent);
470
+ border-color: var(--mk-accent);
471
+ }
472
+
473
+ [data-skin="egui"] .wf-toggle.on::after {
474
+ left: 13px;
475
+ background: var(--mk-on-accent);
476
+ }
477
+
478
+ /* A selected tab in egui is a selectable label painted with the selection
479
+ colour, which is the one place the blue shows up in a settled window. */
480
+ [data-skin="egui"] .wf-tabs {
481
+ display: flex;
482
+ align-items: stretch;
483
+ gap: 2px;
484
+ border-bottom: 1px solid var(--mk-line);
485
+ }
486
+
487
+ [data-skin="egui"] .wf-tabs > * {
488
+ padding: 4px 8px;
489
+ font-size: 12px;
490
+ line-height: 14px;
491
+ color: var(--mk-fg);
492
+ white-space: nowrap;
493
+ border-radius: var(--mk-radius) var(--mk-radius) 0 0;
494
+ }
495
+
496
+ [data-skin="egui"] .wf-tabs > .is-active,
497
+ [data-skin="egui"] .wf-tabs > [aria-selected="true"] {
498
+ color: var(--mk-select);
499
+ background: var(--mk-accent-soft);
500
+ box-shadow: inset 0 -2px 0 0 var(--mk-accent);
501
+ }
502
+
503
+ /* ---------------------------------------------------------------- shell -- */
504
+
505
+ /* A menu bar is one row of words with no borders and no background, and a side
506
+ * panel is a plain column split by a 1px line. */
507
+ [data-skin="egui"] .wf-nav {
508
+ display: flex;
509
+ align-items: center;
510
+ gap: 10px;
511
+ min-height: 24px;
512
+ padding: 0 6px;
513
+ font-size: 12px;
514
+ border-bottom: 1px solid var(--mk-line);
515
+ }
516
+
517
+ [data-skin="egui"] .wf-sidebar {
518
+ display: flex;
519
+ flex: 0 0 auto;
520
+ flex-direction: column;
521
+ gap: 1px;
522
+ width: 150px;
523
+ padding: 4px;
524
+ border-right: 1px solid var(--mk-line);
525
+ }
526
+
527
+ [data-skin="egui"] .wf-sidebar > .wf-row {
528
+ gap: 6px;
529
+ min-height: 20px;
530
+ padding: 0 6px;
531
+ border-radius: var(--mk-radius);
532
+ }
533
+
534
+ [data-skin="egui"] .wf-sidebar > .wf-row.is-active,
535
+ [data-skin="egui"] .wf-sidebar > .is-active {
536
+ background: var(--mk-accent-soft);
537
+ box-shadow: inset 0 0 0 1px var(--mk-accent);
538
+ }
539
+
540
+ /* ----------------------------------------------------------------- data -- */
541
+
542
+ [data-skin="egui"] .wf-table {
543
+ --mk-rows: 4;
544
+ --mk-cols: 3;
545
+ height: calc(var(--mk-rows) * 20px);
546
+ background-image: repeating-linear-gradient(
547
+ to bottom,
548
+ transparent 0 19px,
549
+ var(--mk-line) 19px 20px
550
+ ),
551
+ repeating-linear-gradient(
552
+ to right,
553
+ transparent 0 calc(100% / var(--mk-cols) - 1px),
554
+ var(--mk-line) calc(100% / var(--mk-cols) - 1px) calc(100% / var(--mk-cols))
555
+ );
556
+ border: 1px solid var(--mk-line);
557
+ border-radius: var(--mk-radius);
558
+ }
559
+
560
+ [data-skin="egui"] .wf-table[data-rows="1"] { --mk-rows: 1; }
561
+ [data-skin="egui"] .wf-table[data-rows="2"] { --mk-rows: 2; }
562
+ [data-skin="egui"] .wf-table[data-rows="3"] { --mk-rows: 3; }
563
+ [data-skin="egui"] .wf-table[data-rows="4"] { --mk-rows: 4; }
564
+ [data-skin="egui"] .wf-table[data-rows="5"] { --mk-rows: 5; }
565
+ [data-skin="egui"] .wf-table[data-rows="6"] { --mk-rows: 6; }
566
+ [data-skin="egui"] .wf-table[data-rows="8"] { --mk-rows: 8; }
567
+ [data-skin="egui"] .wf-table[data-rows="10"] { --mk-rows: 10; }
568
+ [data-skin="egui"] .wf-table[data-cols="1"] { --mk-cols: 1; }
569
+ [data-skin="egui"] .wf-table[data-cols="2"] { --mk-cols: 2; }
570
+ [data-skin="egui"] .wf-table[data-cols="3"] { --mk-cols: 3; }
571
+ [data-skin="egui"] .wf-table[data-cols="4"] { --mk-cols: 4; }
572
+ [data-skin="egui"] .wf-table[data-cols="5"] { --mk-cols: 5; }
573
+ [data-skin="egui"] .wf-table[data-cols="6"] { --mk-cols: 6; }
574
+
575
+ /* An egui plot fills columns edge to edge with the plot widget grey. */
576
+ [data-skin="egui"] .wf-chart {
577
+ display: flex;
578
+ align-items: flex-end;
579
+ gap: 2px;
580
+ height: 120px;
581
+ padding: 0 0 0 1px;
582
+ border-bottom: 1px solid var(--mk-line);
583
+ border-left: 1px solid var(--mk-line);
584
+ }
585
+
586
+ [data-skin="egui"] .wf-chart > * {
587
+ flex: 1 1 0;
588
+ min-height: 2px;
589
+ background: var(--mk-line-strong);
590
+ }
591
+
592
+ [data-skin="egui"] .wf-chart > .is-accent {
593
+ background: var(--mk-select);
594
+ }
595
+
596
+ /* -------------------------------------------------------------- overlay -- */
597
+
598
+ [data-skin="egui"] .wf-scrim {
599
+ position: absolute;
600
+ inset: 0;
601
+ z-index: 2;
602
+ background: rgba(0, 0, 0, 0.5);
603
+ }
604
+
605
+ [data-skin="egui"] .wf-modal {
606
+ position: absolute;
607
+ top: 50%;
608
+ left: 50%;
609
+ z-index: 3;
610
+ display: flex;
611
+ flex-direction: column;
612
+ gap: 8px;
613
+ width: min(360px, 84%);
614
+ max-height: 84%;
615
+ padding: 8px;
616
+ overflow: auto;
617
+ background: var(--mk-surface);
618
+ border: 1px solid var(--mk-line-strong);
619
+ border-radius: var(--mk-radius-lg);
620
+ transform: translate(-50%, -50%);
621
+ }
622
+
623
+ [data-skin="egui"] .wf-toast {
624
+ position: absolute;
625
+ bottom: 16px;
626
+ left: 50%;
627
+ z-index: 4;
628
+ display: flex;
629
+ align-items: center;
630
+ gap: 6px;
631
+ max-width: 84%;
632
+ padding: 6px 10px;
633
+ font-size: 12px;
634
+ color: var(--mk-fg);
635
+ background: var(--mk-fill);
636
+ border: 1px solid var(--mk-line-strong);
637
+ border-radius: var(--mk-radius);
638
+ transform: translateX(-50%);
639
+ }