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,669 @@
1
+ /*
2
+ * rshow theme "default": the adwaita skin, layer 3.
3
+ *
4
+ * A GNOME look-alike. libadwaita is the toolbox a modern GTK 4 app is built
5
+ * from, and what it draws is: a header bar with the window title in the middle
6
+ * and the window controls on the right, 6px corners on a control and 12px on a
7
+ * boxed list, one blue for a suggested action, pill shaped buttons for that
8
+ * action, and rows that are boxes rather than tables.
9
+ *
10
+ * Not GNOME's artwork: no Adwaita icon theme, no Cantarell file. Cantarell is
11
+ * the first name in the stack because a Linux reader has it installed, and the
12
+ * stack falls through to system-ui so a Mac reader still sees a header bar.
13
+ *
14
+ * Knobs: the custom.css set plus --mk-surface, --mk-surface-2, --mk-header,
15
+ * --mk-on-accent, --mk-accent-soft, --mk-radius-lg, --mk-radius-pill,
16
+ * --mk-ctl-h, --mk-line-h, --mk-shadow-1, --mk-shadow-6.
17
+ */
18
+
19
+ /* --------------------------------------------------- the screen, light -- */
20
+
21
+ [data-skin="adwaita"] {
22
+ --mk-bg: #fafafa;
23
+
24
+ /* the window chrome the frame draws, in the same two modes */
25
+ --mk-chrome-bg: #ebebeb;
26
+ --mk-chrome-bg-2: #deddda;
27
+ --mk-chrome-line: #d4d3d0;
28
+ --mk-chrome-fg: #2e3436;
29
+ --mk-surface: #ffffff;
30
+ --mk-surface-2: #f2f2f2;
31
+ --mk-header: #ebebeb;
32
+ --mk-fg: #2e3436;
33
+ --mk-muted: #5e5c64;
34
+ --mk-line: #deddda;
35
+ --mk-line-strong: #c0bfbc;
36
+ --mk-fill: #e8e8e8;
37
+
38
+ --mk-accent: #3584e4;
39
+ --mk-accent-hover: #1c71d8;
40
+ --mk-accent-soft: #e3f1fd;
41
+ --mk-on-accent: #ffffff;
42
+ --mk-focus: #3584e4;
43
+
44
+ /* a control is 6px, a boxed list is 12px, a suggested action is a pill */
45
+ --mk-radius: 6px;
46
+ --mk-radius-lg: 12px;
47
+ --mk-radius-pill: 100px;
48
+
49
+ --mk-font: Cantarell, "Cantarell Regular", -apple-system, "Segoe UI",
50
+ system-ui, sans-serif;
51
+ --mk-size: 14px;
52
+ --mk-line-h: 20px;
53
+ --mk-ctl-h: 34px;
54
+ --mk-gap: 14px;
55
+ --mk-pad: 20px;
56
+
57
+ --mk-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.08);
58
+ --mk-shadow-6: 0 3px 6px rgba(0, 0, 0, 0.14);
59
+ }
60
+
61
+ /* ---------------------------------------------------- the screen, dark -- */
62
+
63
+ @media (prefers-color-scheme: dark) {
64
+ :root:not([data-mode="light"]) [data-skin="adwaita"] {
65
+ --mk-bg: #242424;
66
+
67
+ /* the window chrome the frame draws, in the same two modes */
68
+ --mk-chrome-bg: #303030;
69
+ --mk-chrome-bg-2: #292929;
70
+ --mk-chrome-line: #3d3d3d;
71
+ --mk-chrome-fg: #ffffff;
72
+ --mk-surface: #303030;
73
+ --mk-surface-2: #292929;
74
+ --mk-header: #303030;
75
+ --mk-fg: #ffffff;
76
+ --mk-muted: #b5b5b5;
77
+ --mk-line: #3d3d3d;
78
+ --mk-line-strong: #565656;
79
+ --mk-fill: #3b3b3b;
80
+ --mk-accent: #78aeed;
81
+ --mk-accent-hover: #8fbcf0;
82
+ --mk-accent-soft: #1b3a5c;
83
+ --mk-on-accent: #00264d;
84
+ --mk-focus: #78aeed;
85
+ --mk-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.35);
86
+ --mk-shadow-6: 0 3px 6px rgba(0, 0, 0, 0.45);
87
+ }
88
+ }
89
+
90
+ :root[data-mode="dark"] [data-skin="adwaita"] {
91
+ --mk-bg: #242424;
92
+
93
+ /* the window chrome the frame draws, in the same two modes */
94
+ --mk-chrome-bg: #303030;
95
+ --mk-chrome-bg-2: #292929;
96
+ --mk-chrome-line: #3d3d3d;
97
+ --mk-chrome-fg: #ffffff;
98
+ --mk-surface: #303030;
99
+ --mk-surface-2: #292929;
100
+ --mk-header: #303030;
101
+ --mk-fg: #ffffff;
102
+ --mk-muted: #b5b5b5;
103
+ --mk-line: #3d3d3d;
104
+ --mk-line-strong: #565656;
105
+ --mk-fill: #3b3b3b;
106
+ --mk-accent: #78aeed;
107
+ --mk-accent-hover: #8fbcf0;
108
+ --mk-accent-soft: #1b3a5c;
109
+ --mk-on-accent: #00264d;
110
+ --mk-focus: #78aeed;
111
+ --mk-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.35);
112
+ --mk-shadow-6: 0 3px 6px rgba(0, 0, 0, 0.45);
113
+ }
114
+
115
+ /* --------------------------------------------------------------- screen -- */
116
+
117
+ [data-skin="adwaita"] .mk-screen {
118
+ color: var(--mk-fg);
119
+ background: var(--mk-bg);
120
+ color-scheme: light;
121
+ }
122
+
123
+ @media (prefers-color-scheme: dark) {
124
+ :root:not([data-mode="light"]) [data-skin="adwaita"] .mk-screen {
125
+ color-scheme: dark;
126
+ }
127
+ }
128
+
129
+ :root[data-mode="dark"] [data-skin="adwaita"] .mk-screen {
130
+ color-scheme: dark;
131
+ }
132
+
133
+ [data-skin="adwaita"] .mk-screen a {
134
+ color: var(--mk-accent);
135
+ }
136
+
137
+ /* --------------------------------------------------------------- layout -- */
138
+
139
+ [data-skin="adwaita"] .wf-row {
140
+ display: flex;
141
+ align-items: center;
142
+ gap: var(--mk-gap);
143
+ }
144
+
145
+ [data-skin="adwaita"] .wf-col {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: var(--mk-gap);
149
+ }
150
+
151
+ [data-skin="adwaita"] .wf-row.wf-shell {
152
+ align-items: stretch;
153
+ gap: 0;
154
+ }
155
+
156
+ [data-skin="adwaita"] .wf-row.wf-top {
157
+ align-items: flex-start;
158
+ }
159
+
160
+ [data-skin="adwaita"] .wf-spacer,
161
+ [data-skin="adwaita"] .wf-grow {
162
+ flex: 1 1 auto;
163
+ min-width: 0;
164
+ }
165
+
166
+ /* ----------------------------------------------------------------- type -- */
167
+
168
+ [data-skin="adwaita"] .wf-heading {
169
+ display: block;
170
+ width: 40%;
171
+ max-width: 20em;
172
+ height: 0.9em;
173
+ background: var(--mk-fg);
174
+ border-radius: 4px;
175
+ opacity: 0.85;
176
+ }
177
+
178
+ /* A GNOME title is bold and large: libadwaita has a title-1 through title-4. */
179
+ [data-skin="adwaita"] .wf-heading:not(:empty) {
180
+ width: auto;
181
+ max-width: none;
182
+ height: auto;
183
+ font-size: 20px;
184
+ font-weight: 800;
185
+ line-height: 26px;
186
+ background: none;
187
+ opacity: 1;
188
+ }
189
+
190
+ [data-skin="adwaita"] .wf-text {
191
+ --mk-lines: 2;
192
+ display: block;
193
+ height: calc(var(--mk-lines) * var(--mk-line-h));
194
+ background-image: repeating-linear-gradient(
195
+ to bottom,
196
+ var(--mk-line-strong) 0 7px,
197
+ transparent 7px var(--mk-line-h)
198
+ );
199
+ border-radius: 4px;
200
+ opacity: 0.65;
201
+ }
202
+
203
+ [data-skin="adwaita"] .wf-text[data-lines="1"] { --mk-lines: 1; }
204
+ [data-skin="adwaita"] .wf-text[data-lines="2"] { --mk-lines: 2; }
205
+ [data-skin="adwaita"] .wf-text[data-lines="3"] { --mk-lines: 3; }
206
+ [data-skin="adwaita"] .wf-text[data-lines="4"] { --mk-lines: 4; }
207
+ [data-skin="adwaita"] .wf-text[data-lines="5"] { --mk-lines: 5; }
208
+ [data-skin="adwaita"] .wf-text[data-lines="6"] { --mk-lines: 6; }
209
+ [data-skin="adwaita"] .wf-text[data-lines="7"] { --mk-lines: 7; }
210
+ [data-skin="adwaita"] .wf-text[data-lines="8"] { --mk-lines: 8; }
211
+
212
+ [data-skin="adwaita"] .wf-text:not(:empty) {
213
+ height: auto;
214
+ font-size: 14px;
215
+ line-height: var(--mk-line-h);
216
+ color: var(--mk-muted);
217
+ background: none;
218
+ opacity: 1;
219
+ }
220
+
221
+ /* --------------------------------------------------------------- blocks -- */
222
+
223
+ /* A boxed list in libadwaita is one rounded box with a hairline between the
224
+ rows and no line on the outside, so a card has a border and a box does not. */
225
+ [data-skin="adwaita"] .wf-box {
226
+ min-height: 48px;
227
+ padding: 12px;
228
+ background: var(--mk-surface);
229
+ border-radius: var(--mk-radius-lg);
230
+ box-shadow: var(--mk-shadow-1);
231
+ }
232
+
233
+ /* A selected row in libadwaita is a filled row with the accent at 15 per cent,
234
+ and the row keeps its corners because it is a box in a boxed list. */
235
+ [data-skin="adwaita"] .wf-box.is-active {
236
+ background: var(--mk-accent-soft);
237
+ box-shadow: inset 0 0 0 1px var(--mk-accent);
238
+ }
239
+
240
+ [data-skin="adwaita"] .wf-card {
241
+ display: flex;
242
+ flex-direction: column;
243
+ gap: var(--mk-gap);
244
+ padding: 16px;
245
+ background: var(--mk-surface);
246
+ border: 1px solid var(--mk-line);
247
+ border-radius: var(--mk-radius-lg);
248
+ }
249
+
250
+ [data-skin="adwaita"] .wf-image {
251
+ min-height: 120px;
252
+ background-color: var(--mk-fill);
253
+ background-image: linear-gradient(
254
+ to top right,
255
+ transparent calc(50% - 0.5px),
256
+ var(--mk-line-strong) calc(50% - 0.5px),
257
+ var(--mk-line-strong) calc(50% + 0.5px),
258
+ transparent calc(50% + 0.5px)
259
+ ),
260
+ linear-gradient(
261
+ to bottom right,
262
+ transparent calc(50% - 0.5px),
263
+ var(--mk-line-strong) calc(50% - 0.5px),
264
+ var(--mk-line-strong) calc(50% + 0.5px),
265
+ transparent calc(50% + 0.5px)
266
+ );
267
+ border-radius: var(--mk-radius-lg);
268
+ }
269
+
270
+ [data-skin="adwaita"] .wf-avatar {
271
+ flex: 0 0 auto;
272
+ width: 32px;
273
+ height: 32px;
274
+ background: var(--mk-fill);
275
+ border-radius: 50%;
276
+ }
277
+
278
+ [data-skin="adwaita"] .wf-avatar[data-size="sm"] {
279
+ width: 24px;
280
+ height: 24px;
281
+ }
282
+
283
+ [data-skin="adwaita"] .wf-avatar[data-size="lg"] {
284
+ width: 48px;
285
+ height: 48px;
286
+ }
287
+
288
+ [data-skin="adwaita"] .wf-icon {
289
+ display: inline-block;
290
+ flex: 0 0 auto;
291
+ width: 16px;
292
+ height: 16px;
293
+ background: var(--mk-fill);
294
+ border-radius: 4px;
295
+ }
296
+
297
+ [data-skin="adwaita"] .wf-icon[data-size="lg"] {
298
+ width: 22px;
299
+ height: 22px;
300
+ }
301
+
302
+ /* ------------------------------------------------------------- controls -- */
303
+
304
+ [data-skin="adwaita"] .wf-button {
305
+ display: inline-flex;
306
+ align-items: center;
307
+ justify-content: center;
308
+ gap: 6px;
309
+ height: var(--mk-ctl-h);
310
+ padding: 0 14px;
311
+ font: inherit;
312
+ font-size: 14px;
313
+ font-weight: 600;
314
+ color: var(--mk-fg);
315
+ text-align: center;
316
+ text-decoration: none;
317
+ white-space: nowrap;
318
+ background: var(--mk-surface-2);
319
+ border: 1px solid var(--mk-line);
320
+ border-radius: var(--mk-radius);
321
+ box-shadow: var(--mk-shadow-1);
322
+ }
323
+
324
+ /* The suggested action is the one pill in the window, and the accent is a
325
+ token so a product with its own blue is one line of CSS. */
326
+ [data-skin="adwaita"] .wf-button.primary {
327
+ color: var(--mk-on-accent);
328
+ background: var(--mk-accent);
329
+ border-color: transparent;
330
+ border-radius: var(--mk-radius-pill);
331
+ }
332
+
333
+ [data-skin="adwaita"] .wf-button.ghost {
334
+ color: var(--mk-fg);
335
+ background: transparent;
336
+ border-color: transparent;
337
+ box-shadow: none;
338
+ }
339
+
340
+ [data-skin="adwaita"] .wf-button[disabled] {
341
+ color: var(--mk-muted);
342
+ opacity: 0.55;
343
+ box-shadow: none;
344
+ }
345
+
346
+ [data-skin="adwaita"] .wf-button:focus-visible,
347
+ [data-skin="adwaita"] .wf-button[data-focus] {
348
+ outline: 2px solid var(--mk-focus);
349
+ outline-offset: 1px;
350
+ }
351
+
352
+ [data-skin="adwaita"] .wf-input {
353
+ position: relative;
354
+ display: flex;
355
+ align-items: center;
356
+ min-height: var(--mk-ctl-h);
357
+ padding: 0 10px;
358
+ font-size: 14px;
359
+ color: var(--mk-fg);
360
+ background: var(--mk-surface);
361
+ border: 1px solid var(--mk-line-strong);
362
+ border-radius: var(--mk-radius);
363
+ }
364
+
365
+ [data-skin="adwaita"] .wf-input[data-label]::before,
366
+ [data-skin="adwaita"] .wf-select[data-label]::before,
367
+ [data-skin="adwaita"] .wf-label {
368
+ position: absolute;
369
+ top: -17px;
370
+ left: 2px;
371
+ font-size: 12px;
372
+ font-weight: 600;
373
+ line-height: 1.4;
374
+ color: var(--mk-muted);
375
+ }
376
+
377
+ [data-skin="adwaita"] .wf-input[data-label]::before,
378
+ [data-skin="adwaita"] .wf-select[data-label]::before {
379
+ content: attr(data-label);
380
+ }
381
+
382
+ [data-skin="adwaita"] .wf-input:focus-within {
383
+ border-color: var(--mk-accent);
384
+ box-shadow: 0 0 0 2px var(--mk-accent-soft);
385
+ }
386
+
387
+ /* An empty field still says what it is: the drawing's placeholder is read out
388
+ of the attribute, so a search box in a title bar is not a blank rectangle. */
389
+ [data-skin="adwaita"] .wf-input[data-placeholder]:empty::after {
390
+ content: attr(data-placeholder);
391
+ color: var(--mk-muted);
392
+ }
393
+
394
+ [data-skin="adwaita"] .wf-select {
395
+ position: relative;
396
+ display: flex;
397
+ align-items: center;
398
+ min-height: var(--mk-ctl-h);
399
+ padding: 0 30px 0 10px;
400
+ font-size: 14px;
401
+ color: var(--mk-fg);
402
+ background: var(--mk-surface-2);
403
+ border: 1px solid var(--mk-line);
404
+ border-radius: var(--mk-radius);
405
+ }
406
+
407
+ [data-skin="adwaita"] .wf-select::after {
408
+ content: "";
409
+ position: absolute;
410
+ top: 50%;
411
+ right: 11px;
412
+ width: 0;
413
+ height: 0;
414
+ margin-top: -2px;
415
+ border-top: 4px solid var(--mk-muted);
416
+ border-right: 4px solid transparent;
417
+ border-left: 4px solid transparent;
418
+ }
419
+
420
+ [data-skin="adwaita"] .wf-checkbox {
421
+ position: relative;
422
+ display: inline-block;
423
+ flex: 0 0 auto;
424
+ width: 18px;
425
+ height: 18px;
426
+ background: var(--mk-surface);
427
+ border: 1px solid var(--mk-line-strong);
428
+ border-radius: 4px;
429
+ }
430
+
431
+ [data-skin="adwaita"] .wf-checkbox[data-checked="true"] {
432
+ background: var(--mk-accent);
433
+ border-color: var(--mk-accent);
434
+ }
435
+
436
+ [data-skin="adwaita"] .wf-checkbox[data-checked="true"]::after {
437
+ content: "";
438
+ position: absolute;
439
+ top: 1px;
440
+ left: 5px;
441
+ width: 4px;
442
+ height: 9px;
443
+ border: solid var(--mk-on-accent);
444
+ border-width: 0 2px 2px 0;
445
+ transform: rotate(45deg);
446
+ }
447
+
448
+ [data-skin="adwaita"] .wf-toggle {
449
+ position: relative;
450
+ display: inline-block;
451
+ flex: 0 0 auto;
452
+ width: 46px;
453
+ height: 24px;
454
+ background: var(--mk-fill);
455
+ border: 1px solid var(--mk-line-strong);
456
+ border-radius: var(--mk-radius-pill);
457
+ }
458
+
459
+ [data-skin="adwaita"] .wf-toggle::after {
460
+ content: "";
461
+ position: absolute;
462
+ top: 2px;
463
+ left: 2px;
464
+ width: 18px;
465
+ height: 18px;
466
+ background: var(--mk-surface);
467
+ border-radius: 50%;
468
+ box-shadow: var(--mk-shadow-1);
469
+ }
470
+
471
+ [data-skin="adwaita"] .wf-toggle.on {
472
+ background: var(--mk-accent);
473
+ border-color: var(--mk-accent);
474
+ }
475
+
476
+ [data-skin="adwaita"] .wf-toggle.on::after {
477
+ left: 24px;
478
+ }
479
+
480
+ /* libadwaita calls this a view switcher: one pill around the row, a raised pill
481
+ under the active view. */
482
+ [data-skin="adwaita"] .wf-tabs {
483
+ display: inline-flex;
484
+ align-self: flex-start;
485
+ align-items: center;
486
+ gap: 2px;
487
+ padding: 3px;
488
+ background: var(--mk-surface-2);
489
+ border: 1px solid var(--mk-line);
490
+ border-radius: var(--mk-radius-pill);
491
+ }
492
+
493
+ [data-skin="adwaita"] .wf-tabs > * {
494
+ padding: 4px 14px;
495
+ font-size: 13px;
496
+ font-weight: 600;
497
+ line-height: 18px;
498
+ color: var(--mk-muted);
499
+ white-space: nowrap;
500
+ border-radius: var(--mk-radius-pill);
501
+ }
502
+
503
+ [data-skin="adwaita"] .wf-tabs > .is-active,
504
+ [data-skin="adwaita"] .wf-tabs > [aria-selected="true"] {
505
+ color: var(--mk-fg);
506
+ background: var(--mk-surface);
507
+ box-shadow: var(--mk-shadow-1);
508
+ }
509
+
510
+ /* ---------------------------------------------------------------- shell -- */
511
+
512
+ /* The header bar: the window title in the middle, the controls on the right,
513
+ one hairline under the whole band. It is the one thing that makes a drawing
514
+ read as a GNOME window and not as a web page. */
515
+ [data-skin="adwaita"] .wf-nav {
516
+ display: flex;
517
+ align-items: center;
518
+ gap: 10px;
519
+ min-height: 46px;
520
+ padding: 0 12px;
521
+ font-weight: 600;
522
+ background: var(--mk-header);
523
+ border-bottom: 1px solid var(--mk-line);
524
+ border-radius: var(--mk-radius-lg) var(--mk-radius-lg) 0 0;
525
+ }
526
+
527
+ [data-skin="adwaita"] .wf-nav.wf-centered > strong,
528
+ [data-skin="adwaita"] .wf-nav.wf-centered > .wf-heading {
529
+ margin: 0 auto;
530
+ }
531
+
532
+ [data-skin="adwaita"] .wf-sidebar {
533
+ display: flex;
534
+ flex: 0 0 auto;
535
+ flex-direction: column;
536
+ gap: 2px;
537
+ width: 220px;
538
+ padding: 10px 8px;
539
+ background: var(--mk-surface-2);
540
+ border-right: 1px solid var(--mk-line);
541
+ }
542
+
543
+ [data-skin="adwaita"] .wf-sidebar > .wf-row {
544
+ gap: 10px;
545
+ min-height: 34px;
546
+ padding: 0 10px;
547
+ border-radius: var(--mk-radius);
548
+ }
549
+
550
+ [data-skin="adwaita"] .wf-sidebar > .wf-row.is-active,
551
+ [data-skin="adwaita"] .wf-sidebar > .is-active {
552
+ background: var(--mk-fill);
553
+ }
554
+
555
+ /* ----------------------------------------------------------------- data -- */
556
+
557
+ /* libadwaita puts data in a boxed list: rows, a hairline between them, and no
558
+ vertical rules, because a GTK list is a list and not a spreadsheet. */
559
+ [data-skin="adwaita"] .wf-table {
560
+ --mk-rows: 4;
561
+ --mk-cols: 3;
562
+ height: calc(var(--mk-rows) * 36px);
563
+ background-color: var(--mk-surface);
564
+ background-image: repeating-linear-gradient(
565
+ to bottom,
566
+ transparent 0 35px,
567
+ var(--mk-line) 35px 36px
568
+ );
569
+ border-radius: var(--mk-radius-lg);
570
+ box-shadow: var(--mk-shadow-1);
571
+ }
572
+
573
+ [data-skin="adwaita"] .wf-table[data-rows="1"] { --mk-rows: 1; }
574
+ [data-skin="adwaita"] .wf-table[data-rows="2"] { --mk-rows: 2; }
575
+ [data-skin="adwaita"] .wf-table[data-rows="3"] { --mk-rows: 3; }
576
+ [data-skin="adwaita"] .wf-table[data-rows="4"] { --mk-rows: 4; }
577
+ [data-skin="adwaita"] .wf-table[data-rows="5"] { --mk-rows: 5; }
578
+ [data-skin="adwaita"] .wf-table[data-rows="6"] { --mk-rows: 6; }
579
+ [data-skin="adwaita"] .wf-table[data-rows="8"] { --mk-rows: 8; }
580
+ [data-skin="adwaita"] .wf-table[data-rows="10"] { --mk-rows: 10; }
581
+
582
+ /* A grid, when the mockup asks for one, keeps its columns. */
583
+ [data-skin="adwaita"] .wf-table[data-cols] {
584
+ background-image: repeating-linear-gradient(
585
+ to bottom,
586
+ transparent 0 35px,
587
+ var(--mk-line) 35px 36px
588
+ ),
589
+ repeating-linear-gradient(
590
+ to right,
591
+ transparent 0 calc(100% / var(--mk-cols) - 1px),
592
+ var(--mk-line) calc(100% / var(--mk-cols) - 1px) calc(100% / var(--mk-cols))
593
+ );
594
+ }
595
+
596
+ [data-skin="adwaita"] .wf-table[data-cols="1"] { --mk-cols: 1; }
597
+ [data-skin="adwaita"] .wf-table[data-cols="2"] { --mk-cols: 2; }
598
+ [data-skin="adwaita"] .wf-table[data-cols="3"] { --mk-cols: 3; }
599
+ [data-skin="adwaita"] .wf-table[data-cols="4"] { --mk-cols: 4; }
600
+ [data-skin="adwaita"] .wf-table[data-cols="5"] { --mk-cols: 5; }
601
+ [data-skin="adwaita"] .wf-table[data-cols="6"] { --mk-cols: 6; }
602
+
603
+ [data-skin="adwaita"] .wf-chart {
604
+ display: flex;
605
+ align-items: flex-end;
606
+ gap: 8px;
607
+ height: 160px;
608
+ padding: 0 0 0 1px;
609
+ border-bottom: 1px solid var(--mk-line);
610
+ border-left: 1px solid var(--mk-line);
611
+ }
612
+
613
+ [data-skin="adwaita"] .wf-chart > * {
614
+ flex: 1 1 0;
615
+ min-height: 4px;
616
+ background: var(--mk-accent-soft);
617
+ border-radius: 4px 4px 0 0;
618
+ }
619
+
620
+ [data-skin="adwaita"] .wf-chart > .is-accent {
621
+ background: var(--mk-accent);
622
+ }
623
+
624
+ /* -------------------------------------------------------------- overlay -- */
625
+
626
+ [data-skin="adwaita"] .wf-scrim {
627
+ position: absolute;
628
+ inset: 0;
629
+ z-index: 2;
630
+ background: rgba(0, 0, 0, 0.32);
631
+ }
632
+
633
+ /* A libadwaita dialog is a rounded surface with a header bar of its own. */
634
+ [data-skin="adwaita"] .wf-modal {
635
+ position: absolute;
636
+ top: 50%;
637
+ left: 50%;
638
+ z-index: 3;
639
+ display: flex;
640
+ flex-direction: column;
641
+ gap: 16px;
642
+ width: min(440px, 84%);
643
+ max-height: 84%;
644
+ padding: 20px;
645
+ overflow: auto;
646
+ background: var(--mk-surface);
647
+ border: 1px solid var(--mk-line);
648
+ border-radius: var(--mk-radius-lg);
649
+ box-shadow: var(--mk-shadow-6);
650
+ transform: translate(-50%, -50%);
651
+ }
652
+
653
+ [data-skin="adwaita"] .wf-toast {
654
+ position: absolute;
655
+ bottom: 24px;
656
+ left: 50%;
657
+ z-index: 4;
658
+ display: flex;
659
+ align-items: center;
660
+ gap: 10px;
661
+ max-width: 84%;
662
+ padding: 12px 16px;
663
+ font-size: 14px;
664
+ color: var(--mk-on-accent);
665
+ background: var(--mk-fg);
666
+ border-radius: var(--mk-radius-pill);
667
+ box-shadow: var(--mk-shadow-6);
668
+ transform: translateX(-50%);
669
+ }