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.
- package/LICENSE +21 -0
- package/README.md +50 -2
- package/dist/main.js +8500 -0
- package/package.json +48 -4
- package/skills/rshow/SKILL.md +144 -0
- package/skills/rshow/reference/cli.md +263 -0
- package/skills/rshow/reference/dashboard.md +122 -0
- package/skills/rshow/reference/mockups.md +113 -0
- package/skills/rshow/reference/page-contract.md +83 -0
- package/skills/rshow/reference/pages.md +174 -0
- package/skills/rshow/reference/poster.md +137 -0
- package/skills/rshow/reference/project-page.md +132 -0
- package/skills/rshow/reference/reports.md +158 -0
- package/skills/rshow/reference/sketch.md +78 -0
- package/skills/rshow/reference/terminal.md +148 -0
- package/skills/rshow/reference/themes.md +139 -0
- package/skills/rshow-implement/SKILL.md +112 -0
- package/skills/rshow-implement/reference/compare.md +156 -0
- package/skills/rshow-implement/reference/handoff.md +125 -0
- package/skills/rshow-implement/reference/map.md +151 -0
- package/skills/rshow-slides/SKILL.md +136 -0
- package/skills/rshow-slides/reference/layouts.md +251 -0
- package/themes/default/dashboard.css +521 -0
- package/themes/default/dashboard.js +1390 -0
- package/themes/default/deck.css +586 -0
- package/themes/default/deck.js +741 -0
- package/themes/default/example/capture.ans +1 -0
- package/themes/default/example/dashboard.html +106 -0
- package/themes/default/example/demo.cast +14 -0
- package/themes/default/example/drawing.excalidraw +377 -0
- package/themes/default/example/index.html +311 -0
- package/themes/default/example/mockup-desktop.html +331 -0
- package/themes/default/example/mockup-platforms.html +742 -0
- package/themes/default/example/mockup.html +416 -0
- package/themes/default/example/page.html +153 -0
- package/themes/default/example/poster-figure.svg +58 -0
- package/themes/default/example/poster.html +181 -0
- package/themes/default/example/project.html +229 -0
- package/themes/default/example/report.html +404 -0
- package/themes/default/example/results.csv +61 -0
- package/themes/default/example/sketch.html +178 -0
- package/themes/default/example/teaser.svg +66 -0
- package/themes/default/example/terminal.html +231 -0
- package/themes/default/example/tui.html +223 -0
- package/themes/default/fonts/IBMPlexMono-Regular-Latin1.woff2 +0 -0
- package/themes/default/fonts/IBMPlexSans-Light-Latin1.woff2 +0 -0
- package/themes/default/fonts/IBMPlexSans-Regular-Latin1.woff2 +0 -0
- package/themes/default/fonts/IBMPlexSans-SemiBold-Latin1.woff2 +0 -0
- package/themes/default/fonts/OFL.txt +93 -0
- package/themes/default/fonts.css +63 -0
- package/themes/default/index.html +573 -0
- package/themes/default/mockup.css +1078 -0
- package/themes/default/mockup.js +1433 -0
- package/themes/default/mode.js +242 -0
- package/themes/default/page.css +320 -0
- package/themes/default/poster.css +480 -0
- package/themes/default/poster.js +223 -0
- package/themes/default/project.css +482 -0
- package/themes/default/project.js +116 -0
- package/themes/default/report.css +776 -0
- package/themes/default/report.js +427 -0
- package/themes/default/sketch.css +166 -0
- package/themes/default/sketch.js +681 -0
- package/themes/default/skins/adwaita.css +669 -0
- package/themes/default/skins/custom.css +596 -0
- package/themes/default/skins/egui.css +639 -0
- package/themes/default/skins/fluent.css +1093 -0
- package/themes/default/skins/fluent.js +458 -0
- package/themes/default/skins/mac.css +647 -0
- package/themes/default/skins/material.css +692 -0
- package/themes/default/skins/sketch.css +436 -0
- package/themes/default/skins/sketch.js +494 -0
- package/themes/default/skins/wire.css +561 -0
- package/themes/default/terminal.css +292 -0
- package/themes/default/terminal.js +433 -0
- package/themes/default/theme.json +149 -0
- package/themes/default/tokens.css +255 -0
- package/themes/default/tui.css +703 -0
- package/themes/default/tui.js +472 -0
- package/worker/index.js +6918 -0
- package/worker/migrations/0001_init.sql +52 -0
- package/worker/migrations/0002_blobs.sql +5 -0
- package/worker/migrations/0003_projects.sql +31 -0
- package/worker/migrations/0004_page_data_blob.sql +19 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* rshow theme "default": results dashboard
|
|
3
|
+
*
|
|
4
|
+
* For an experiment explorer a reader works in rather than reads: a filter bar,
|
|
5
|
+
* a summary of the metric, small multiples and a sortable table of the rows
|
|
6
|
+
* behind them. Link order: fonts.css, tokens.css, dashboard.css, then mode.js in
|
|
7
|
+
* <head> and dashboard.js (defer).
|
|
8
|
+
*
|
|
9
|
+
* The page is the Carbon system and it follows the modes in tokens.css. It is
|
|
10
|
+
* wider than a prose page because a table and a row of small multiples need the
|
|
11
|
+
* room, but the prose inside it still stops at about 62 characters, and the
|
|
12
|
+
* table, the number columns and the axis labels follow the same rules as a
|
|
13
|
+
* slide: numbers right aligned in tabular figures, one thin line per row, the
|
|
14
|
+
* lightest line for a gridline and the strong one for a baseline.
|
|
15
|
+
*
|
|
16
|
+
* The charts read their colours from --accent and --chart-1..8 at draw time,
|
|
17
|
+
* which is why dashboard.js redraws them when the mode changes.
|
|
18
|
+
*
|
|
19
|
+
* No eyebrow label, no card grid, no numbered tiles, no shadow, no rounded
|
|
20
|
+
* corner. A section heading says what the block holds and the type does the
|
|
21
|
+
* rest.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
*,
|
|
25
|
+
*::before,
|
|
26
|
+
*::after {
|
|
27
|
+
box-sizing: border-box;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
html {
|
|
31
|
+
color-scheme: var(--color-scheme);
|
|
32
|
+
-webkit-text-size-adjust: 100%;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
body {
|
|
36
|
+
margin: 0;
|
|
37
|
+
background: var(--bg);
|
|
38
|
+
color: var(--fg);
|
|
39
|
+
font-family: var(--font-sans);
|
|
40
|
+
font-size: var(--text-sm);
|
|
41
|
+
line-height: var(--lh-read);
|
|
42
|
+
-webkit-font-smoothing: antialiased;
|
|
43
|
+
text-rendering: optimizeLegibility;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
:focus-visible {
|
|
47
|
+
outline: 2px solid var(--accent);
|
|
48
|
+
outline-offset: 2px;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
a {
|
|
52
|
+
color: var(--accent);
|
|
53
|
+
text-decoration: underline;
|
|
54
|
+
text-decoration-thickness: 1px;
|
|
55
|
+
text-underline-offset: 2px;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
code {
|
|
59
|
+
font-family: var(--font-mono);
|
|
60
|
+
font-size: 0.92em;
|
|
61
|
+
padding: 0.1em 0.32em;
|
|
62
|
+
background: var(--layer-01);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* ---------------------------------------------------------------- shell ---
|
|
66
|
+
* 1180px holds three panels of small multiples and the eight column table on
|
|
67
|
+
* one screen at 1280px wide, and it stays inside a laptop viewport.
|
|
68
|
+
*/
|
|
69
|
+
.dashboard {
|
|
70
|
+
max-width: 1180px;
|
|
71
|
+
margin: 0 auto;
|
|
72
|
+
padding: var(--space-10) var(--space-06) var(--space-13);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* ----------------------------------------------------------------- head --- */
|
|
76
|
+
|
|
77
|
+
.dash-head {
|
|
78
|
+
margin: 0 0 var(--space-08);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.dash-head h1 {
|
|
82
|
+
max-width: 26ch;
|
|
83
|
+
margin: 0;
|
|
84
|
+
font-size: var(--text-2xl);
|
|
85
|
+
font-weight: 400;
|
|
86
|
+
line-height: 1.15;
|
|
87
|
+
letter-spacing: -0.01em;
|
|
88
|
+
text-wrap: balance;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.dash-lede {
|
|
92
|
+
max-width: 62ch;
|
|
93
|
+
margin: var(--space-04) 0 0;
|
|
94
|
+
font-size: var(--text-base);
|
|
95
|
+
line-height: 1.5;
|
|
96
|
+
color: var(--muted);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.dash-meta {
|
|
100
|
+
max-width: 62ch;
|
|
101
|
+
margin: var(--space-05) 0 0;
|
|
102
|
+
font-size: var(--text-2xs);
|
|
103
|
+
line-height: 1.5;
|
|
104
|
+
color: var(--muted);
|
|
105
|
+
font-variant-numeric: tabular-nums;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.dash-meta strong {
|
|
109
|
+
font-weight: 600;
|
|
110
|
+
color: var(--fg);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* --------------------------------------------------------------- sections -- */
|
|
114
|
+
|
|
115
|
+
.dash-section {
|
|
116
|
+
margin: 0 0 var(--space-09);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.dash-section h2 {
|
|
120
|
+
margin: 0 0 var(--space-05);
|
|
121
|
+
font-size: var(--text-md);
|
|
122
|
+
font-weight: 600;
|
|
123
|
+
line-height: 1.3;
|
|
124
|
+
letter-spacing: 0;
|
|
125
|
+
text-wrap: balance;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.dash-note {
|
|
129
|
+
margin: var(--space-04) 0 0;
|
|
130
|
+
max-width: 62ch;
|
|
131
|
+
font-size: var(--text-2xs);
|
|
132
|
+
line-height: 1.5;
|
|
133
|
+
color: var(--muted);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.dash-status {
|
|
137
|
+
margin: var(--space-04) 0 0;
|
|
138
|
+
font-size: var(--text-2xs);
|
|
139
|
+
line-height: 1.5;
|
|
140
|
+
color: var(--muted);
|
|
141
|
+
font-variant-numeric: tabular-nums;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.dash-status:empty {
|
|
145
|
+
display: none;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.dash-empty {
|
|
149
|
+
margin: 0;
|
|
150
|
+
padding: var(--space-06) 0;
|
|
151
|
+
font-size: var(--text-xs);
|
|
152
|
+
color: var(--muted);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* --------------------------------------------------------------- controls --
|
|
156
|
+
* One field per control, the label above it, the sheet's own type size. An
|
|
157
|
+
* input is a filled block with a strong underline, so it reads as a control on
|
|
158
|
+
* either ground without a box that would turn the bar into a row of cards.
|
|
159
|
+
*/
|
|
160
|
+
.dash-filters {
|
|
161
|
+
display: grid;
|
|
162
|
+
grid-template-columns: repeat(auto-fit, minmax(148px, 1fr));
|
|
163
|
+
align-items: end;
|
|
164
|
+
gap: var(--space-05) var(--space-05);
|
|
165
|
+
margin: 0 0 var(--space-06);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.dash-field {
|
|
169
|
+
display: flex;
|
|
170
|
+
flex-direction: column;
|
|
171
|
+
gap: var(--space-02);
|
|
172
|
+
min-width: 0;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.dash-field label {
|
|
176
|
+
font-size: var(--text-2xs);
|
|
177
|
+
line-height: 1.35;
|
|
178
|
+
color: var(--muted);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.dash-field select,
|
|
182
|
+
.dash-field input[type="number"] {
|
|
183
|
+
width: 100%;
|
|
184
|
+
height: 40px;
|
|
185
|
+
padding: 0 var(--space-04);
|
|
186
|
+
font-family: inherit;
|
|
187
|
+
font-size: var(--text-xs);
|
|
188
|
+
line-height: 1;
|
|
189
|
+
color: var(--fg);
|
|
190
|
+
background: var(--layer-01);
|
|
191
|
+
border: 0;
|
|
192
|
+
border-bottom: 1px solid var(--border-strong);
|
|
193
|
+
border-radius: 0;
|
|
194
|
+
-webkit-appearance: none;
|
|
195
|
+
appearance: none;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.dash-field input[type="number"] {
|
|
199
|
+
text-align: right;
|
|
200
|
+
font-variant-numeric: tabular-nums;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.dash-field select:focus-visible,
|
|
204
|
+
.dash-field input[type="number"]:focus-visible {
|
|
205
|
+
outline: 2px solid var(--accent);
|
|
206
|
+
outline-offset: -2px;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.dash-select {
|
|
210
|
+
position: relative;
|
|
211
|
+
display: block;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.dash-select select {
|
|
215
|
+
padding-right: var(--space-08);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* The caret is drawn rather than native, because a native select would bring
|
|
219
|
+
its own rounded shape into a square system. */
|
|
220
|
+
.dash-select::after {
|
|
221
|
+
content: "";
|
|
222
|
+
position: absolute;
|
|
223
|
+
top: 50%;
|
|
224
|
+
right: var(--space-04);
|
|
225
|
+
margin-top: -2px;
|
|
226
|
+
border-left: 4px solid transparent;
|
|
227
|
+
border-right: 4px solid transparent;
|
|
228
|
+
border-top: 5px solid var(--muted);
|
|
229
|
+
pointer-events: none;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.dash-actions {
|
|
233
|
+
display: flex;
|
|
234
|
+
align-items: end;
|
|
235
|
+
gap: var(--space-03);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.dash-btn {
|
|
239
|
+
min-height: 40px;
|
|
240
|
+
padding: 0 var(--space-05);
|
|
241
|
+
font-family: inherit;
|
|
242
|
+
font-size: var(--text-xs);
|
|
243
|
+
line-height: 1;
|
|
244
|
+
color: var(--bg);
|
|
245
|
+
background: var(--accent);
|
|
246
|
+
border: 1px solid var(--accent);
|
|
247
|
+
border-radius: 0;
|
|
248
|
+
cursor: pointer;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.dash-btn:hover {
|
|
252
|
+
color: var(--bg);
|
|
253
|
+
background: var(--fg);
|
|
254
|
+
border-color: var(--fg);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.dash-btn:active {
|
|
258
|
+
color: var(--bg);
|
|
259
|
+
background: var(--fg);
|
|
260
|
+
border-color: var(--fg);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.dash-btn--ghost {
|
|
264
|
+
color: var(--accent);
|
|
265
|
+
background: transparent;
|
|
266
|
+
border-color: var(--border-strong);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.dash-btn--ghost:hover,
|
|
270
|
+
.dash-btn--ghost:active {
|
|
271
|
+
color: var(--fg);
|
|
272
|
+
background: transparent;
|
|
273
|
+
border-color: var(--fg);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* ----------------------------------------------------------------- table ---
|
|
277
|
+
* The box scrolls, the page does not: a phone gets two scroll axes inside the
|
|
278
|
+
* frame, and the head stays put while the rows move under it.
|
|
279
|
+
*/
|
|
280
|
+
.dash-box {
|
|
281
|
+
max-height: 60vh;
|
|
282
|
+
overflow: auto;
|
|
283
|
+
border-bottom: 1px solid var(--border-subtle);
|
|
284
|
+
overscroll-behavior: contain;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.dash-box table {
|
|
288
|
+
width: 100%;
|
|
289
|
+
border-collapse: separate;
|
|
290
|
+
border-spacing: 0;
|
|
291
|
+
font-size: var(--text-xs);
|
|
292
|
+
line-height: 1.45;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.dash-box caption {
|
|
296
|
+
padding: 0 0 var(--space-03);
|
|
297
|
+
text-align: left;
|
|
298
|
+
font-size: var(--text-2xs);
|
|
299
|
+
color: var(--muted);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.dash-box th,
|
|
303
|
+
.dash-box td {
|
|
304
|
+
padding: var(--space-03) var(--space-05) var(--space-03) 0;
|
|
305
|
+
text-align: left;
|
|
306
|
+
vertical-align: baseline;
|
|
307
|
+
border-bottom: 1px solid var(--border-subtle);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.dash-box th:last-child,
|
|
311
|
+
.dash-box td:last-child {
|
|
312
|
+
padding-right: 0;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.dash-box thead th {
|
|
316
|
+
position: sticky;
|
|
317
|
+
top: 0;
|
|
318
|
+
z-index: 1;
|
|
319
|
+
padding-top: var(--space-03);
|
|
320
|
+
padding-bottom: var(--space-03);
|
|
321
|
+
background: var(--bg);
|
|
322
|
+
border-bottom: 1px solid var(--border-strong);
|
|
323
|
+
font-size: var(--text-2xs);
|
|
324
|
+
font-weight: 600;
|
|
325
|
+
color: var(--muted);
|
|
326
|
+
white-space: nowrap;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.dash-box tbody th {
|
|
330
|
+
font-weight: 400;
|
|
331
|
+
color: var(--fg);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.dash-sort {
|
|
335
|
+
display: inline-flex;
|
|
336
|
+
align-items: center;
|
|
337
|
+
gap: var(--space-03);
|
|
338
|
+
min-height: 28px;
|
|
339
|
+
margin: 0;
|
|
340
|
+
padding: 0;
|
|
341
|
+
font: inherit;
|
|
342
|
+
font-weight: 600;
|
|
343
|
+
color: var(--muted);
|
|
344
|
+
background: none;
|
|
345
|
+
border: 0;
|
|
346
|
+
border-radius: 0;
|
|
347
|
+
cursor: pointer;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
.dash-sort:hover {
|
|
351
|
+
color: var(--fg);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.dash-sort[data-dir="asc"]::after,
|
|
355
|
+
.dash-sort[data-dir="desc"]::after {
|
|
356
|
+
content: "";
|
|
357
|
+
border-left: 4px solid transparent;
|
|
358
|
+
border-right: 4px solid transparent;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.dash-sort[data-dir="asc"]::after {
|
|
362
|
+
border-bottom: 5px solid var(--accent);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.dash-sort[data-dir="desc"]::after {
|
|
366
|
+
border-top: 5px solid var(--accent);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.dash-box th[aria-sort] .dash-sort[data-dir] {
|
|
370
|
+
color: var(--fg);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.dash-num {
|
|
374
|
+
text-align: right;
|
|
375
|
+
font-variant-numeric: tabular-nums;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.dash-box tbody tr:last-child th,
|
|
379
|
+
.dash-box tbody tr:last-child td {
|
|
380
|
+
border-bottom: 0;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.dash-toolbar {
|
|
384
|
+
display: flex;
|
|
385
|
+
flex-wrap: wrap;
|
|
386
|
+
align-items: center;
|
|
387
|
+
justify-content: space-between;
|
|
388
|
+
gap: var(--space-04);
|
|
389
|
+
margin: 0 0 var(--space-05);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.dash-toolbar .dash-note {
|
|
393
|
+
margin: 0;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/* ---------------------------------------------------------------- charts ---
|
|
397
|
+
* Each panel is drawn at the measured width of its box, so the axis labels stay
|
|
398
|
+
* at their real size instead of scaling with a viewBox.
|
|
399
|
+
*/
|
|
400
|
+
.dash-figure {
|
|
401
|
+
margin: 0;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
.dash-facets svg {
|
|
405
|
+
display: block;
|
|
406
|
+
width: 100%;
|
|
407
|
+
height: auto;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.dash-caption {
|
|
411
|
+
margin: var(--space-05) 0 0;
|
|
412
|
+
max-width: 70ch;
|
|
413
|
+
font-size: var(--text-2xs);
|
|
414
|
+
line-height: 1.5;
|
|
415
|
+
color: var(--muted);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/* ---------------------------------------------------------------- footer --- */
|
|
419
|
+
|
|
420
|
+
.dash-foot {
|
|
421
|
+
max-width: 62ch;
|
|
422
|
+
margin: var(--space-07) 0 0;
|
|
423
|
+
padding-top: var(--space-05);
|
|
424
|
+
border-top: 1px solid var(--border-subtle);
|
|
425
|
+
font-size: var(--text-2xs);
|
|
426
|
+
line-height: 1.6;
|
|
427
|
+
color: var(--muted);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.dash-foot p {
|
|
431
|
+
margin: 0 0 var(--space-04);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.dash-foot a {
|
|
435
|
+
color: var(--muted);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/* --------------------------------------------------------- small screens --- */
|
|
439
|
+
|
|
440
|
+
@media (max-width: 671px) {
|
|
441
|
+
.dashboard {
|
|
442
|
+
padding: var(--space-08) var(--space-05) var(--space-11);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.dash-head h1 {
|
|
446
|
+
font-size: var(--text-xl);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
.dash-lede {
|
|
450
|
+
font-size: var(--text-sm);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.dash-section h2 {
|
|
454
|
+
font-size: var(--text-base);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.dash-filters {
|
|
458
|
+
grid-template-columns: repeat(auto-fit, minmax(132px, 1fr));
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/* A table of eight columns scrolls inside its box rather than crushing; the
|
|
462
|
+
four-column summary above it fits a phone as it is. */
|
|
463
|
+
.dash-table--runs {
|
|
464
|
+
min-width: 640px;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
.dash-box {
|
|
468
|
+
max-height: 70vh;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.dash-toolbar {
|
|
472
|
+
justify-content: flex-start;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
@media (prefers-reduced-motion: reduce) {
|
|
477
|
+
* {
|
|
478
|
+
animation-duration: 0.01ms !important;
|
|
479
|
+
transition-duration: 0.01ms !important;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/* ----------------------------------------------------------------- print ---
|
|
484
|
+
* Paper keeps the tables whole and drops the controls: a printed sheet is a
|
|
485
|
+
* record of one view, and the filter bar means nothing without a browser.
|
|
486
|
+
*/
|
|
487
|
+
@media print {
|
|
488
|
+
body {
|
|
489
|
+
background: #fff;
|
|
490
|
+
color: #000;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
.dashboard {
|
|
494
|
+
max-width: none;
|
|
495
|
+
padding: 0;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
.dash-filters,
|
|
499
|
+
.dash-toolbar,
|
|
500
|
+
.rshow-mode-toggle {
|
|
501
|
+
display: none;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
.dash-box {
|
|
505
|
+
max-height: none;
|
|
506
|
+
overflow: visible;
|
|
507
|
+
border-bottom: 0;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
.dash-table--runs {
|
|
511
|
+
min-width: 0;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
.dash-box thead th {
|
|
515
|
+
position: static;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
.dash-section {
|
|
519
|
+
break-inside: avoid;
|
|
520
|
+
}
|
|
521
|
+
}
|