@skillcdn/console 0.1.6 → 0.1.8

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 (97) hide show
  1. package/README.md +50 -2
  2. package/SKILLCDN.md +35 -0
  3. package/dist/cli/cli.d.ts +3 -0
  4. package/dist/cli/cli.d.ts.map +1 -1
  5. package/dist/cli/cli.js +61 -0
  6. package/dist/cli/cli.js.map +1 -1
  7. package/dist/cli/help.d.ts.map +1 -1
  8. package/dist/cli/help.js +5 -0
  9. package/dist/cli/help.js.map +1 -1
  10. package/dist/cli/main.js +2 -0
  11. package/dist/cli/main.js.map +1 -1
  12. package/dist/cli/serve.d.ts +37 -0
  13. package/dist/cli/serve.d.ts.map +1 -0
  14. package/dist/cli/serve.js +218 -0
  15. package/dist/cli/serve.js.map +1 -0
  16. package/dist/console.d.ts +6 -0
  17. package/dist/console.d.ts.map +1 -1
  18. package/dist/console.js +78 -13
  19. package/dist/console.js.map +1 -1
  20. package/dist/data.d.ts.map +1 -1
  21. package/dist/data.js +5 -1
  22. package/dist/data.js.map +1 -1
  23. package/dist/i18n/en.d.ts +4 -0
  24. package/dist/i18n/en.d.ts.map +1 -1
  25. package/dist/i18n/en.js +4 -0
  26. package/dist/i18n/en.js.map +1 -1
  27. package/dist/i18n/ko.d.ts.map +1 -1
  28. package/dist/i18n/ko.js +4 -0
  29. package/dist/i18n/ko.js.map +1 -1
  30. package/dist/schemas.d.ts +1 -0
  31. package/dist/schemas.d.ts.map +1 -1
  32. package/dist/schemas.js +5 -0
  33. package/dist/schemas.js.map +1 -1
  34. package/dist/web.d.ts +16 -0
  35. package/dist/web.d.ts.map +1 -0
  36. package/dist/web.js +149 -0
  37. package/dist/web.js.map +1 -0
  38. package/docs/specs/cli.md +92 -0
  39. package/docs/specs/rest.md +221 -0
  40. package/package.json +14 -3
  41. package/skills/building-a-console/SKILL.md +102 -0
  42. package/skills/building-a-console/references/the-default-console.md +140 -0
  43. package/skills/deploying-a-console/SKILL.md +130 -0
  44. package/skills/deploying-a-console/assets/deployer-policy.json +118 -0
  45. package/skills/deploying-a-console/assets/secrets.example.json +11 -0
  46. package/skills/deploying-a-console/references/access.md +78 -0
  47. package/skills/deploying-a-console/references/resources.md +516 -0
  48. package/skills/deploying-a-console/references/sizing.md +90 -0
  49. package/skills/deploying-a-console/scripts/import-aws-key.mjs +35 -0
  50. package/skills/deploying-a-console/scripts/store-secrets.mjs +114 -0
  51. package/skills/working-the-board/SKILL.md +86 -0
  52. package/src/api.ts +235 -0
  53. package/src/cli/cli.ts +1114 -0
  54. package/src/cli/credentials.ts +68 -0
  55. package/src/cli/directory.ts +59 -0
  56. package/src/cli/format.ts +284 -0
  57. package/src/cli/help.ts +326 -0
  58. package/src/cli/main.ts +39 -0
  59. package/src/cli/serve.ts +276 -0
  60. package/src/cli/terminal.ts +28 -0
  61. package/src/client.ts +533 -0
  62. package/src/components/board.tsx +112 -0
  63. package/src/components/connect.tsx +126 -0
  64. package/src/components/decision-form.tsx +136 -0
  65. package/src/components/decision-list.tsx +278 -0
  66. package/src/components/documents.tsx +569 -0
  67. package/src/components/event-feed.tsx +129 -0
  68. package/src/components/markdown.tsx +72 -0
  69. package/src/components/people.tsx +59 -0
  70. package/src/components/projects.tsx +364 -0
  71. package/src/components/runs.tsx +175 -0
  72. package/src/components/shell.tsx +284 -0
  73. package/src/components/sign-in.tsx +61 -0
  74. package/src/components/skills.tsx +78 -0
  75. package/src/components/task-form.tsx +229 -0
  76. package/src/components/task-view.tsx +272 -0
  77. package/src/components/tokens.tsx +223 -0
  78. package/src/components/ui.tsx +219 -0
  79. package/src/connect-page.tsx +148 -0
  80. package/src/connect.ts +27 -0
  81. package/src/console.tsx +1166 -0
  82. package/src/data.ts +493 -0
  83. package/src/docs-page.tsx +334 -0
  84. package/src/documents.ts +76 -0
  85. package/src/i18n/en.ts +537 -0
  86. package/src/i18n/index.ts +76 -0
  87. package/src/i18n/ko.ts +511 -0
  88. package/src/index.ts +142 -0
  89. package/src/limits.ts +61 -0
  90. package/src/router.ts +295 -0
  91. package/src/routes.ts +106 -0
  92. package/src/schemas.ts +776 -0
  93. package/src/styles/console.css +2432 -0
  94. package/src/text.ts +33 -0
  95. package/src/use-action.ts +37 -0
  96. package/src/vocabulary.ts +109 -0
  97. package/src/web.ts +170 -0
@@ -0,0 +1,2432 @@
1
+ /*
2
+ * The styles of the default console: the design tokens, the reset the pages need, and one class
3
+ * per building block, all prefixed `sc-` so that a custom console's own styles never collide
4
+ * with them. Re-skinning starts and mostly ends with the tokens.
5
+ *
6
+ * The look is SkillCDN's own: dark only, one blue accent and one warm point colour, the page a
7
+ * dark field with a soft light high in it, and the surfaces panes of glass over that field, so
8
+ * that the console reads as part of the same product as the site it is built for.
9
+ */
10
+
11
+ :root {
12
+ color-scheme: dark;
13
+
14
+ /* Surfaces: the page's own dark, and the steps above it. */
15
+ --sc-color-bg: #0b1019;
16
+ --sc-color-bg-subtle: #0f1520;
17
+ --sc-color-bg-inset: #151d2b;
18
+ --sc-color-bg-raised: #192232;
19
+ --sc-color-border: #263042;
20
+ --sc-color-border-strong: #3b4960;
21
+
22
+ /* Text. */
23
+ --sc-color-text: #e8ebf0;
24
+ --sc-color-text-muted: #9aa4b2;
25
+ --sc-color-text-faint: #8b97a9;
26
+
27
+ /* The one accent: the blue that text and lines are drawn in, and the deeper blue a surface
28
+ is filled with so that a white label reads on it. */
29
+ --sc-color-accent: #6ea1ff;
30
+ --sc-color-accent-hover: #8fb6ff;
31
+ --sc-color-accent-solid: #3b6fd4;
32
+ --sc-color-accent-solid-hover: #4171d8;
33
+ --sc-color-accent-contrast: #ffffff;
34
+ --sc-color-accent-subtle: #111a2b;
35
+ /* The point: the only warm colour, for what should be looked at first, never for a control. */
36
+ --sc-color-point: #ffb13a;
37
+ --sc-color-point-subtle: #2a1a0e;
38
+ --sc-color-selection: color-mix(in srgb, var(--sc-color-accent-solid) 60%, transparent);
39
+
40
+ /* Status. */
41
+ --sc-color-success: #4cc38a;
42
+ --sc-color-success-subtle: #0d1a13;
43
+ --sc-color-warning: #e3b341;
44
+ --sc-color-warning-subtle: #201a0c;
45
+ --sc-color-danger: #ff7b85;
46
+ --sc-color-danger-subtle: #230f12;
47
+
48
+ /* The ground: a dark field with two lights in it, a far one low and wide and a near one high
49
+ and soft, and the corners taken down, so the field has distance in it. The default UI
50
+ provides the field's face (the shell); a custom console may paint its own. */
51
+ --sc-color-sky: #0d1730;
52
+ --sc-color-far: #2b4d9455;
53
+ --sc-color-far-turn: #3c3f8e3d;
54
+ --sc-color-vignette: #04071199;
55
+ --sc-color-light-core: #dbe7ff;
56
+ --sc-color-light-body: #93b4f2;
57
+ --sc-color-light-mid: #7f7ae8b8;
58
+ --sc-color-light-halo: #3a5fd488;
59
+ --sc-light-strength: 0.3;
60
+ --sc-light-top: -18rem;
61
+ --sc-light-height: 34rem;
62
+ --sc-light-inset: 8%;
63
+ --sc-light-blur: 4rem;
64
+
65
+ /* Glass: what a pane over the field is made of. A wide blur with the colour behind pushed, an
66
+ even veil of the page's own dark, a thin lit edge, and a soft stand-off from the field. */
67
+ --sc-glass-backdrop: blur(24px) saturate(1.8);
68
+ --sc-color-glass: #111a2e66;
69
+ --sc-color-glass-hover: #18243f73;
70
+ --sc-color-glass-edge: #ffffff1c;
71
+ --sc-glass-surface: linear-gradient(var(--sc-color-glass), var(--sc-color-glass)) padding-box;
72
+ --sc-glass-surface-hover: linear-gradient(
73
+ var(--sc-color-glass-hover),
74
+ var(--sc-color-glass-hover)
75
+ )
76
+ padding-box;
77
+ --sc-glass-sheen: inset 0 1px 0 #ffffff4d, inset 0 0 0 1px #ffffff10, inset 0 3px 6px #ffffff12;
78
+ --sc-glass-lift: 0 0.75rem 2rem -0.75rem #00000059;
79
+ --sc-glass-lens: blur(4px) brightness(1.4) saturate(1.5) hue-rotate(-6deg);
80
+ --sc-glass-lens-width: 2px;
81
+ --sc-glass-lens-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
82
+ /* A surface inside a pane: no blur of its own, a little of the page's dark let through. */
83
+ --sc-color-sheet: color-mix(in srgb, var(--sc-color-bg) 72%, transparent);
84
+ --sc-color-sheet-hover: color-mix(in srgb, var(--sc-color-bg-raised) 80%, transparent);
85
+ --sc-color-field: color-mix(in srgb, var(--sc-color-bg) 78%, transparent);
86
+
87
+ /* Light falls from above: a lit thing spills downward, in the accent's own colour, in layers
88
+ that fall off the way brightness does. */
89
+ --sc-glow:
90
+ 0 0.125rem 0.5rem -0.25rem color-mix(in srgb, var(--sc-color-accent-hover) 38%, transparent),
91
+ 0 0.5rem 1.25rem -0.5rem color-mix(in srgb, var(--sc-color-accent) 22%, transparent),
92
+ 0 1.25rem 3rem -1rem color-mix(in srgb, var(--sc-color-accent) 11%, transparent);
93
+ --sc-glow-bright:
94
+ 0 0.125rem 0.5rem -0.25rem color-mix(in srgb, var(--sc-color-accent-hover) 70%, transparent),
95
+ 0 0.5rem 1.25rem -0.5rem color-mix(in srgb, var(--sc-color-accent) 45%, transparent),
96
+ 0 1.25rem 3rem -1rem color-mix(in srgb, var(--sc-color-accent) 24%, transparent);
97
+ --sc-shadow-stage: 0 1.5rem 5rem #00000033;
98
+
99
+ /* Type. The Korean face comes first where the page provides it; the Latin stays with the
100
+ system's faces. */
101
+ --sc-font-sans:
102
+ "Pretendard Variable", system-ui, -apple-system, "Segoe UI", Roboto, "Apple SD Gothic Neo",
103
+ "Malgun Gothic", "Noto Sans KR", "Helvetica Neue", Arial, sans-serif;
104
+ --sc-font-mono:
105
+ ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Liberation Mono", "D2Coding",
106
+ monospace;
107
+
108
+ --sc-text-xs: 0.75rem;
109
+ --sc-text-sm: 0.875rem;
110
+ --sc-text-md: 1rem;
111
+ --sc-text-lg: 1.125rem;
112
+ --sc-text-xl: 1.375rem;
113
+ --sc-text-2xl: 1.75rem;
114
+ --sc-leading-tight: 1.2;
115
+ --sc-leading-normal: 1.6;
116
+ --sc-leading-code: 1.7;
117
+ --sc-weight-normal: 400;
118
+ --sc-weight-medium: 500;
119
+ --sc-weight-bold: 650;
120
+ /* Every face leaves more room above a line than below it, so a one-line label centred in a
121
+ box lands low; a box that centres a label takes this off the top and gives it to the
122
+ bottom. Not for anything that can wrap. */
123
+ --sc-label-lift: 0.067em;
124
+
125
+ /* Space: a 4px grid. */
126
+ --sc-space-1: 0.25rem;
127
+ --sc-space-2: 0.5rem;
128
+ --sc-space-3: 0.75rem;
129
+ --sc-space-4: 1rem;
130
+ --sc-space-5: 1.5rem;
131
+ --sc-space-6: 2rem;
132
+ --sc-space-7: 3rem;
133
+ --sc-space-8: 4.5rem;
134
+
135
+ /* Shape. */
136
+ --sc-radius-sm: 4px;
137
+ --sc-radius-md: 8px;
138
+ --sc-radius-lg: 12px;
139
+ --sc-radius-xl: 20px;
140
+ --sc-radius-full: 999px;
141
+ --sc-border: 1px solid var(--sc-color-border);
142
+
143
+ /* Layout. */
144
+ --sc-width-page: 84rem;
145
+ --sc-width-prose: 46rem;
146
+ --sc-width-aside: 18rem;
147
+ --sc-column-width: 13.5rem;
148
+ --sc-header-height: 3.75rem;
149
+ --sc-brand-size: 1rem;
150
+ --sc-brand-size-compact: 0.875rem;
151
+ --sc-control-size: 2.5rem;
152
+ --sc-focus-ring: 2px solid var(--sc-color-accent);
153
+ --sc-transition: 120ms ease-out;
154
+ }
155
+
156
+ /* Reset: only what the pages need. */
157
+
158
+ *,
159
+ *::before,
160
+ *::after {
161
+ box-sizing: border-box;
162
+ }
163
+
164
+ html {
165
+ -webkit-text-size-adjust: 100%;
166
+ text-size-adjust: 100%;
167
+ scroll-padding-top: calc(var(--sc-header-height) + var(--sc-space-6));
168
+ }
169
+
170
+ body {
171
+ margin: 0;
172
+ min-height: 100dvh;
173
+ background: var(--sc-color-bg);
174
+ color: var(--sc-color-text);
175
+ font-family: var(--sc-font-sans);
176
+ font-size: var(--sc-text-md);
177
+ line-height: var(--sc-leading-normal);
178
+ -webkit-font-smoothing: antialiased;
179
+ text-rendering: optimizeLegibility;
180
+ }
181
+
182
+ /* Korean breaks between any two syllables by default; keeping words whole reads much better. */
183
+ :lang(ko) {
184
+ word-break: keep-all;
185
+ overflow-wrap: anywhere;
186
+ }
187
+
188
+ h1,
189
+ h2,
190
+ h3,
191
+ h4,
192
+ p,
193
+ ul,
194
+ ol,
195
+ dl,
196
+ dd,
197
+ figure,
198
+ pre {
199
+ margin: 0;
200
+ }
201
+
202
+ h1,
203
+ h2,
204
+ h3,
205
+ h4 {
206
+ line-height: var(--sc-leading-tight);
207
+ font-weight: var(--sc-weight-bold);
208
+ letter-spacing: -0.01em;
209
+ text-wrap: balance;
210
+ }
211
+
212
+ ul,
213
+ ol {
214
+ padding: 0;
215
+ list-style: none;
216
+ }
217
+
218
+ a {
219
+ color: var(--sc-color-accent);
220
+ text-decoration-thickness: 1px;
221
+ text-underline-offset: 0.18em;
222
+ }
223
+
224
+ a:hover {
225
+ color: var(--sc-color-accent-hover);
226
+ }
227
+
228
+ code,
229
+ kbd,
230
+ pre,
231
+ samp {
232
+ font-family: var(--sc-font-mono);
233
+ font-size: 0.92em;
234
+ }
235
+
236
+ button,
237
+ input,
238
+ select,
239
+ textarea {
240
+ font: inherit;
241
+ color: inherit;
242
+ }
243
+
244
+ button {
245
+ cursor: pointer;
246
+ }
247
+
248
+ :focus-visible {
249
+ outline: var(--sc-focus-ring);
250
+ outline-offset: 2px;
251
+ border-radius: var(--sc-radius-sm);
252
+ }
253
+
254
+ img,
255
+ svg {
256
+ display: block;
257
+ max-width: 100%;
258
+ }
259
+
260
+ table {
261
+ border-collapse: collapse;
262
+ }
263
+
264
+ ::selection {
265
+ background: var(--sc-color-selection);
266
+ color: var(--sc-color-accent-contrast);
267
+ }
268
+
269
+ .sc-visually-hidden {
270
+ position: absolute;
271
+ width: 1px;
272
+ height: 1px;
273
+ margin: -1px;
274
+ padding: 0;
275
+ overflow: hidden;
276
+ clip-path: inset(50%);
277
+ white-space: nowrap;
278
+ border: 0;
279
+ }
280
+
281
+ .sc-muted {
282
+ color: var(--sc-color-text-muted);
283
+ }
284
+
285
+ /* A block that lays its children out as a grid lets each of them shrink to the room there is,
286
+ so that what is wider than the window, a table or a long address, scrolls within its own box
287
+ instead of widening the page. */
288
+ .sc-task-main > *,
289
+ .sc-task-aside > *,
290
+ .sc-task-section > *,
291
+ .sc-decisions > *,
292
+ .sc-decision > *,
293
+ .sc-decision-section > *,
294
+ .sc-answer > *,
295
+ .sc-answer-form > *,
296
+ .sc-run > *,
297
+ .sc-report > *,
298
+ .sc-feed > *,
299
+ .sc-card > *,
300
+ .sc-form > *,
301
+ .sc-field > *,
302
+ .sc-folder > *,
303
+ .sc-docs > *,
304
+ .sc-column-body > * {
305
+ min-width: 0;
306
+ }
307
+
308
+ /*
309
+ * The shell (ADR-0010): the field the pages lie on, a header that names the product, the
310
+ * workspace and the project with the person's menu at its end, the tabs of the level the
311
+ * person is on, and the page below.
312
+ */
313
+
314
+ .sc-shell {
315
+ position: relative;
316
+ isolation: isolate;
317
+ display: flex;
318
+ flex-direction: column;
319
+ min-height: 100dvh;
320
+ overflow-x: clip;
321
+ background-color: var(--sc-color-sky);
322
+ /* The far light: low, wide and vague, which is what distance does to a light. */
323
+ background-image: radial-gradient(
324
+ ellipse 120% 64% at 50% 92%,
325
+ var(--sc-color-far),
326
+ var(--sc-color-far-turn) 48%,
327
+ transparent 72%
328
+ );
329
+ background-attachment: fixed;
330
+ }
331
+
332
+ /* The near light, high behind the header: an ellipse that is blurred rather than a gradient,
333
+ because a blur falls off the way light does. Fixed to the window, so that the page travels
334
+ through the light and the light stays where it is. */
335
+ .sc-shell::before {
336
+ content: "";
337
+ position: fixed;
338
+ z-index: -1;
339
+ top: var(--sc-light-top);
340
+ left: var(--sc-light-inset);
341
+ right: var(--sc-light-inset);
342
+ height: var(--sc-light-height);
343
+ background: radial-gradient(
344
+ ellipse closest-side,
345
+ var(--sc-color-light-core) 0%,
346
+ var(--sc-color-light-body) 14%,
347
+ var(--sc-color-light-mid) 42%,
348
+ var(--sc-color-light-halo) 70%,
349
+ transparent 100%
350
+ );
351
+ filter: blur(var(--sc-light-blur));
352
+ opacity: var(--sc-light-strength);
353
+ pointer-events: none;
354
+ }
355
+
356
+ /* The air over both lights: the corners and the foot of the window taken down. */
357
+ .sc-shell::after {
358
+ content: "";
359
+ position: fixed;
360
+ z-index: -1;
361
+ inset: 0;
362
+ background-image:
363
+ linear-gradient(to bottom, transparent 60%, var(--sc-color-vignette)),
364
+ radial-gradient(ellipse 130% 110% at 50% 30%, transparent 36%, var(--sc-color-vignette) 100%);
365
+ pointer-events: none;
366
+ }
367
+
368
+ .sc-skip {
369
+ position: absolute;
370
+ top: var(--sc-space-2);
371
+ left: var(--sc-space-2);
372
+ z-index: 20;
373
+ padding: var(--sc-space-2) var(--sc-space-3);
374
+ border-radius: var(--sc-radius-md);
375
+ background: var(--sc-color-accent-solid);
376
+ color: var(--sc-color-accent-contrast);
377
+ transform: translateY(-200%);
378
+ }
379
+
380
+ .sc-skip:focus {
381
+ transform: none;
382
+ color: var(--sc-color-accent-contrast);
383
+ }
384
+
385
+ .sc-header {
386
+ position: sticky;
387
+ top: 0;
388
+ z-index: 10;
389
+ border-bottom: var(--sc-border);
390
+ background: color-mix(in srgb, var(--sc-color-bg) 82%, transparent);
391
+ backdrop-filter: blur(12px) saturate(1.4);
392
+ }
393
+
394
+ .sc-header-inner {
395
+ display: flex;
396
+ align-items: center;
397
+ gap: var(--sc-space-4);
398
+ width: 100%;
399
+ max-width: var(--sc-width-page);
400
+ height: var(--sc-header-height);
401
+ margin-inline: auto;
402
+ padding-inline: var(--sc-space-5);
403
+ }
404
+
405
+ /* The brand: the lockup of the symbol and the wordmark where the console has marks, the name
406
+ of the workspace where it has none. The lockup stands as tall as the words beside it. */
407
+ .sc-brand {
408
+ display: inline-flex;
409
+ flex: none;
410
+ align-items: center;
411
+ gap: var(--sc-space-2);
412
+ color: var(--sc-color-text);
413
+ font-weight: var(--sc-weight-bold);
414
+ letter-spacing: -0.01em;
415
+ text-decoration: none;
416
+ white-space: nowrap;
417
+ }
418
+
419
+ .sc-brand:hover {
420
+ color: var(--sc-color-text);
421
+ }
422
+
423
+ .sc-brand-symbol {
424
+ width: var(--sc-brand-size);
425
+ height: var(--sc-brand-size);
426
+ }
427
+
428
+ .sc-brand-wordmark {
429
+ width: auto;
430
+ height: var(--sc-brand-size);
431
+ }
432
+
433
+ .sc-brand-name {
434
+ font-size: var(--sc-text-md);
435
+ }
436
+
437
+ .sc-crumb {
438
+ display: inline-flex;
439
+ align-items: center;
440
+ gap: var(--sc-space-2);
441
+ min-width: 0;
442
+ font-size: var(--sc-text-sm);
443
+ white-space: nowrap;
444
+ }
445
+
446
+ .sc-crumb-separator {
447
+ color: var(--sc-color-border-strong);
448
+ }
449
+
450
+ .sc-crumb-link {
451
+ overflow: hidden;
452
+ max-width: 14rem;
453
+ color: var(--sc-color-text-muted);
454
+ font-weight: var(--sc-weight-medium);
455
+ text-decoration: none;
456
+ text-overflow: ellipsis;
457
+ transition: color var(--sc-transition);
458
+ }
459
+
460
+ .sc-crumb-link:hover {
461
+ color: var(--sc-color-text);
462
+ }
463
+
464
+ /* The last crumb is where the page is. */
465
+ .sc-crumb:last-of-type .sc-crumb-link {
466
+ color: var(--sc-color-text);
467
+ }
468
+
469
+ /* The tabs: the pages of the level the person is on, under the header's first row. */
470
+
471
+ .sc-tabs {
472
+ width: 100%;
473
+ max-width: var(--sc-width-page);
474
+ margin-inline: auto;
475
+ padding-inline: var(--sc-space-5);
476
+ overflow-x: auto;
477
+ scrollbar-width: none;
478
+ }
479
+
480
+ .sc-tabs-inner {
481
+ display: flex;
482
+ gap: var(--sc-space-5);
483
+ }
484
+
485
+ .sc-tab {
486
+ display: inline-flex;
487
+ align-items: center;
488
+ gap: var(--sc-space-2);
489
+ padding: var(--sc-space-2) 0 var(--sc-space-3);
490
+ margin-bottom: -1px;
491
+ border-bottom: 2px solid transparent;
492
+ color: var(--sc-color-text-muted);
493
+ font-size: var(--sc-text-sm);
494
+ font-weight: var(--sc-weight-medium);
495
+ text-decoration: none;
496
+ white-space: nowrap;
497
+ transition:
498
+ border-color var(--sc-transition),
499
+ color var(--sc-transition);
500
+ }
501
+
502
+ .sc-tab:hover {
503
+ color: var(--sc-color-text);
504
+ }
505
+
506
+ .sc-tab-current {
507
+ border-bottom-color: var(--sc-color-accent);
508
+ color: var(--sc-color-text);
509
+ }
510
+
511
+ /* What waits, beside a tab's name: a count in the point colour, so it reads before the words. */
512
+ .sc-nav-count {
513
+ display: inline-flex;
514
+ align-items: center;
515
+ justify-content: center;
516
+ min-width: 1.25rem;
517
+ padding-inline: var(--sc-space-1);
518
+ border-radius: var(--sc-radius-full);
519
+ background: var(--sc-color-point-subtle);
520
+ color: var(--sc-color-point);
521
+ font-size: var(--sc-text-xs);
522
+ line-height: 1.25rem;
523
+ }
524
+
525
+ /* The person's menu: a quiet label at the end of the header that opens a short list. */
526
+
527
+ .sc-header-end {
528
+ display: flex;
529
+ flex: none;
530
+ align-items: center;
531
+ gap: var(--sc-space-3);
532
+ margin-left: auto;
533
+ }
534
+
535
+ .sc-menu {
536
+ position: relative;
537
+ font-size: var(--sc-text-sm);
538
+ }
539
+
540
+ .sc-menu-summary {
541
+ display: flex;
542
+ align-items: center;
543
+ gap: var(--sc-space-2);
544
+ min-height: var(--sc-control-size);
545
+ padding-inline: var(--sc-space-2);
546
+ border-radius: var(--sc-radius-md);
547
+ color: var(--sc-color-text-muted);
548
+ list-style: none;
549
+ white-space: nowrap;
550
+ cursor: pointer;
551
+ transition:
552
+ background var(--sc-transition),
553
+ color var(--sc-transition);
554
+ }
555
+
556
+ .sc-menu-summary::-webkit-details-marker {
557
+ display: none;
558
+ }
559
+
560
+ .sc-menu-summary:hover,
561
+ .sc-menu[open] > .sc-menu-summary {
562
+ background: var(--sc-color-bg-raised);
563
+ color: var(--sc-color-text);
564
+ }
565
+
566
+ .sc-menu-caret {
567
+ flex: none;
568
+ width: 0.75rem;
569
+ height: 0.75rem;
570
+ }
571
+
572
+ .sc-menu-panel {
573
+ position: absolute;
574
+ top: calc(100% + var(--sc-space-2));
575
+ right: 0;
576
+ z-index: 20;
577
+ width: max-content;
578
+ min-width: 13rem;
579
+ padding: var(--sc-space-1);
580
+ border: var(--sc-border);
581
+ border-radius: var(--sc-radius-lg);
582
+ background: var(--sc-color-bg-inset);
583
+ box-shadow: var(--sc-shadow-stage);
584
+ }
585
+
586
+ .sc-menu-who {
587
+ display: flex;
588
+ flex-direction: column;
589
+ padding: var(--sc-space-2) var(--sc-space-3) var(--sc-space-3);
590
+ margin-bottom: var(--sc-space-1);
591
+ border-bottom: var(--sc-border);
592
+ font-weight: var(--sc-weight-medium);
593
+ }
594
+
595
+ .sc-menu-who .sc-muted {
596
+ font-weight: var(--sc-weight-normal);
597
+ font-size: var(--sc-text-xs);
598
+ }
599
+
600
+ .sc-menu-list {
601
+ display: flex;
602
+ flex-direction: column;
603
+ }
604
+
605
+ .sc-menu-link {
606
+ display: block;
607
+ width: 100%;
608
+ padding-inline: var(--sc-space-3);
609
+ padding-block: calc(var(--sc-space-2) - var(--sc-label-lift))
610
+ calc(var(--sc-space-2) + var(--sc-label-lift));
611
+ border: 0;
612
+ border-radius: var(--sc-radius-md);
613
+ background: none;
614
+ color: var(--sc-color-text-muted);
615
+ font: inherit;
616
+ text-align: left;
617
+ text-decoration: none;
618
+ cursor: pointer;
619
+ transition:
620
+ background var(--sc-transition),
621
+ color var(--sc-transition);
622
+ }
623
+
624
+ .sc-menu-link:hover {
625
+ background: var(--sc-color-bg-raised);
626
+ color: var(--sc-color-text);
627
+ }
628
+
629
+ .sc-menu-link[aria-current="page"] {
630
+ color: var(--sc-color-text);
631
+ font-weight: var(--sc-weight-medium);
632
+ }
633
+
634
+ .sc-menu-languages {
635
+ margin: var(--sc-space-1) 0 0;
636
+ padding: var(--sc-space-1) 0 0;
637
+ border: 0;
638
+ border-top: var(--sc-border);
639
+ }
640
+
641
+ .sc-menu-heading {
642
+ display: block;
643
+ padding: var(--sc-space-1) var(--sc-space-3);
644
+ color: var(--sc-color-text-faint);
645
+ font-size: var(--sc-text-xs);
646
+ font-weight: var(--sc-weight-medium);
647
+ letter-spacing: 0.04em;
648
+ text-transform: uppercase;
649
+ }
650
+
651
+ .sc-menu-chosen {
652
+ color: var(--sc-color-accent);
653
+ font-weight: var(--sc-weight-medium);
654
+ }
655
+
656
+ /* Leaving is apart from the pages one goes to. */
657
+ .sc-menu-out {
658
+ margin-top: var(--sc-space-1);
659
+ padding-top: calc(var(--sc-space-2) + var(--sc-space-1) - var(--sc-label-lift));
660
+ border-top: var(--sc-border);
661
+ border-radius: 0 0 var(--sc-radius-md) var(--sc-radius-md);
662
+ }
663
+
664
+ .sc-live {
665
+ width: 0.5rem;
666
+ height: 0.5rem;
667
+ border-radius: 50%;
668
+ background: var(--sc-color-text-faint);
669
+ }
670
+
671
+ .sc-live-on {
672
+ background: var(--sc-color-success);
673
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--sc-color-success) 25%, transparent);
674
+ }
675
+
676
+ /* The page. */
677
+
678
+ /* The page is a column of blocks that fills the window below the header, so that a block which
679
+ wants the rest of the height, the board, can take it. */
680
+ .sc-main {
681
+ display: flex;
682
+ flex: 1;
683
+ flex-direction: column;
684
+ width: 100%;
685
+ max-width: var(--sc-width-page);
686
+ margin-inline: auto;
687
+ padding: var(--sc-space-6) var(--sc-space-5) var(--sc-space-8);
688
+ }
689
+
690
+ /* A page as wide as the window: the board, whose columns want every bit of it. */
691
+ .sc-main-wide {
692
+ max-width: none;
693
+ padding: var(--sc-space-5) var(--sc-space-4) var(--sc-space-4);
694
+ }
695
+
696
+ .sc-page-head {
697
+ display: flex;
698
+ flex-wrap: wrap;
699
+ align-items: center;
700
+ justify-content: space-between;
701
+ gap: var(--sc-space-3);
702
+ margin-bottom: var(--sc-space-4);
703
+ }
704
+
705
+ .sc-page-title {
706
+ font-size: var(--sc-text-2xl);
707
+ letter-spacing: -0.02em;
708
+ }
709
+
710
+ .sc-lead {
711
+ max-width: var(--sc-width-prose);
712
+ margin-bottom: var(--sc-space-5);
713
+ color: var(--sc-color-text-muted);
714
+ }
715
+
716
+ /* On the wide page the head and the lead keep out of the board's way. */
717
+ .sc-main-wide .sc-page-head {
718
+ margin-bottom: var(--sc-space-3);
719
+ }
720
+
721
+ .sc-main-wide .sc-lead {
722
+ margin-bottom: var(--sc-space-4);
723
+ font-size: var(--sc-text-sm);
724
+ }
725
+
726
+ .sc-section-title {
727
+ display: flex;
728
+ align-items: center;
729
+ gap: var(--sc-space-2);
730
+ margin-bottom: var(--sc-space-3);
731
+ font-size: var(--sc-text-lg);
732
+ }
733
+
734
+ /*
735
+ * Panes: the surfaces of the page are glass over the field. A pane is a veil of the page's own
736
+ * dark over a blur of what is behind it, with a thin lit edge; two panes differ only in what
737
+ * each has behind it. The rim is a ring with a filter of its own, under the content, so that
738
+ * what draws the edge of a pane is the field behind that edge, bent.
739
+ */
740
+
741
+ .sc-panel,
742
+ .sc-column,
743
+ .sc-project,
744
+ .sc-decision,
745
+ .sc-run,
746
+ .sc-sign-in,
747
+ .sc-facts {
748
+ position: relative;
749
+ isolation: isolate;
750
+ border: 1px solid transparent;
751
+ background: var(--sc-glass-surface);
752
+ backdrop-filter: var(--sc-glass-backdrop);
753
+ box-shadow: var(--sc-glass-sheen), var(--sc-glass-lift);
754
+ }
755
+
756
+ .sc-panel::before,
757
+ .sc-column::before,
758
+ .sc-project::before,
759
+ .sc-decision::before,
760
+ .sc-run::before,
761
+ .sc-sign-in::before,
762
+ .sc-facts::before {
763
+ content: "";
764
+ position: absolute;
765
+ inset: 0;
766
+ z-index: -1;
767
+ padding: var(--sc-glass-lens-width);
768
+ border-radius: inherit;
769
+ background: var(--sc-color-glass-edge);
770
+ backdrop-filter: var(--sc-glass-lens);
771
+ mask: var(--sc-glass-lens-mask);
772
+ mask-composite: exclude;
773
+ pointer-events: none;
774
+ }
775
+
776
+ .sc-panel {
777
+ margin-bottom: var(--sc-space-5);
778
+ padding: var(--sc-space-5);
779
+ border-radius: var(--sc-radius-xl);
780
+ }
781
+
782
+ /* A panel that holds a form: as wide as a form is comfortable to fill in, and no wider. */
783
+ .sc-panel-form {
784
+ max-width: 56rem;
785
+ }
786
+
787
+ /* A sheet: a surface inside a pane, or a row of a list, with no blur of its own. */
788
+ .sc-token,
789
+ .sc-person-row,
790
+ .sc-skill,
791
+ .sc-doc-row,
792
+ .sc-feed-item,
793
+ .sc-card,
794
+ .sc-option,
795
+ .sc-answer,
796
+ .sc-report-list {
797
+ border: var(--sc-border);
798
+ background: var(--sc-color-sheet);
799
+ }
800
+
801
+ .sc-loading {
802
+ display: grid;
803
+ place-items: center;
804
+ min-height: 50dvh;
805
+ padding: var(--sc-space-5);
806
+ }
807
+
808
+ /* Buttons */
809
+
810
+ .sc-button {
811
+ display: inline-flex;
812
+ align-items: center;
813
+ justify-content: center;
814
+ gap: var(--sc-space-2);
815
+ min-height: var(--sc-control-size);
816
+ padding: 0 var(--sc-space-4);
817
+ border: 1px solid transparent;
818
+ border-radius: var(--sc-radius-md);
819
+ font-size: var(--sc-text-sm);
820
+ font-weight: var(--sc-weight-medium);
821
+ line-height: 1;
822
+ white-space: nowrap;
823
+ text-decoration: none;
824
+ transition:
825
+ background var(--sc-transition),
826
+ border-color var(--sc-transition),
827
+ box-shadow var(--sc-transition),
828
+ color var(--sc-transition);
829
+ }
830
+
831
+ .sc-button:disabled {
832
+ opacity: 0.55;
833
+ cursor: not-allowed;
834
+ }
835
+
836
+ .sc-button-sm {
837
+ min-height: 2rem;
838
+ padding: 0 var(--sc-space-3);
839
+ font-size: var(--sc-text-xs);
840
+ }
841
+
842
+ .sc-button-primary {
843
+ background: var(--sc-color-accent-solid);
844
+ color: var(--sc-color-accent-contrast);
845
+ box-shadow: var(--sc-glow);
846
+ }
847
+
848
+ .sc-button-primary:hover:not(:disabled) {
849
+ background: var(--sc-color-accent-solid-hover);
850
+ color: var(--sc-color-accent-contrast);
851
+ box-shadow: var(--sc-glow-bright);
852
+ }
853
+
854
+ .sc-button-secondary {
855
+ background: var(--sc-color-field);
856
+ border-color: var(--sc-color-border-strong);
857
+ color: var(--sc-color-text);
858
+ }
859
+
860
+ .sc-button-secondary:hover:not(:disabled) {
861
+ background: var(--sc-color-bg-raised);
862
+ color: var(--sc-color-text);
863
+ }
864
+
865
+ .sc-button-ghost {
866
+ background: transparent;
867
+ color: var(--sc-color-text-muted);
868
+ }
869
+
870
+ .sc-button-ghost:hover:not(:disabled) {
871
+ background: var(--sc-color-bg-inset);
872
+ color: var(--sc-color-text);
873
+ }
874
+
875
+ .sc-button-danger {
876
+ background: transparent;
877
+ border-color: var(--sc-color-border-strong);
878
+ color: var(--sc-color-danger);
879
+ }
880
+
881
+ .sc-button-danger:hover:not(:disabled) {
882
+ background: var(--sc-color-danger-subtle);
883
+ border-color: var(--sc-color-danger);
884
+ }
885
+
886
+ /* Badges: a pill on the grid, its label lifted to the middle of it. */
887
+
888
+ .sc-badge {
889
+ display: inline-flex;
890
+ align-items: center;
891
+ gap: var(--sc-space-1);
892
+ padding-inline: var(--sc-space-2);
893
+ padding-block: calc(var(--sc-space-1) - var(--sc-label-lift))
894
+ calc(var(--sc-space-1) + var(--sc-label-lift));
895
+ border: 1px solid var(--sc-color-border);
896
+ border-radius: var(--sc-radius-full);
897
+ font-size: var(--sc-text-xs);
898
+ font-weight: var(--sc-weight-medium);
899
+ line-height: 1.25;
900
+ white-space: nowrap;
901
+ }
902
+
903
+ .sc-badge-neutral {
904
+ background: var(--sc-color-bg-subtle);
905
+ color: var(--sc-color-text-muted);
906
+ }
907
+
908
+ .sc-badge-accent {
909
+ background: var(--sc-color-accent-subtle);
910
+ border-color: transparent;
911
+ color: var(--sc-color-accent);
912
+ }
913
+
914
+ /* The point: a count, or that a thing is someone's; the one filled warm pill on a page. */
915
+ .sc-badge-point {
916
+ background: var(--sc-color-point-subtle);
917
+ border-color: transparent;
918
+ color: var(--sc-color-point);
919
+ }
920
+
921
+ .sc-badge-success {
922
+ background: var(--sc-color-success-subtle);
923
+ border-color: transparent;
924
+ color: var(--sc-color-success);
925
+ }
926
+
927
+ /* A state and not a fill: the warm colour is on the words and the line stays a line. */
928
+ .sc-badge-warning {
929
+ background: var(--sc-color-bg-subtle);
930
+ border-color: var(--sc-color-border-strong);
931
+ color: var(--sc-color-warning);
932
+ }
933
+
934
+ .sc-badge-danger {
935
+ background: var(--sc-color-danger-subtle);
936
+ border-color: transparent;
937
+ color: var(--sc-color-danger);
938
+ }
939
+
940
+ /* People */
941
+
942
+ .sc-avatar {
943
+ flex: none;
944
+ aspect-ratio: 1;
945
+ object-fit: cover;
946
+ border: var(--sc-border);
947
+ border-radius: 22%;
948
+ background: var(--sc-color-bg-inset);
949
+ }
950
+
951
+ .sc-avatar-initial {
952
+ display: inline-grid;
953
+ place-items: center;
954
+ color: var(--sc-color-text-muted);
955
+ font-size: 0.6em;
956
+ font-weight: var(--sc-weight-bold);
957
+ line-height: 1;
958
+ }
959
+
960
+ .sc-avatar-sm {
961
+ width: 1.5rem;
962
+ height: 1.5rem;
963
+ }
964
+
965
+ .sc-avatar-md {
966
+ width: 2.25rem;
967
+ height: 2.25rem;
968
+ }
969
+
970
+ .sc-avatar-lg {
971
+ width: 4rem;
972
+ height: 4rem;
973
+ }
974
+
975
+ .sc-person {
976
+ display: inline-flex;
977
+ align-items: center;
978
+ gap: var(--sc-space-2);
979
+ vertical-align: middle;
980
+ }
981
+
982
+ .sc-person-login {
983
+ font-weight: var(--sc-weight-medium);
984
+ }
985
+
986
+ /* In the menu's label a long name gives way before the header runs out of room. */
987
+ .sc-menu-summary .sc-person-login {
988
+ max-width: 11rem;
989
+ overflow: hidden;
990
+ text-overflow: ellipsis;
991
+ }
992
+
993
+ /* Callouts, empty states, spinner */
994
+
995
+ .sc-callout {
996
+ display: flex;
997
+ align-items: flex-start;
998
+ justify-content: space-between;
999
+ gap: var(--sc-space-4);
1000
+ margin-bottom: var(--sc-space-4);
1001
+ padding: var(--sc-space-4);
1002
+ border: 1px solid var(--sc-color-border-strong);
1003
+ border-radius: var(--sc-radius-md);
1004
+ background: var(--sc-color-sheet);
1005
+ font-size: var(--sc-text-sm);
1006
+ }
1007
+
1008
+ .sc-callout-warning {
1009
+ border-color: var(--sc-color-warning);
1010
+ background: var(--sc-color-warning-subtle);
1011
+ }
1012
+
1013
+ .sc-callout-danger {
1014
+ border-color: var(--sc-color-danger);
1015
+ background: var(--sc-color-danger-subtle);
1016
+ }
1017
+
1018
+ .sc-callout-title {
1019
+ font-weight: var(--sc-weight-bold);
1020
+ }
1021
+
1022
+ .sc-callout-body {
1023
+ color: var(--sc-color-text-muted);
1024
+ }
1025
+
1026
+ .sc-callout-title + .sc-callout-body {
1027
+ margin-top: var(--sc-space-1);
1028
+ }
1029
+
1030
+ .sc-callout-body p + p {
1031
+ margin-top: var(--sc-space-2);
1032
+ }
1033
+
1034
+ .sc-empty {
1035
+ padding: var(--sc-space-7) var(--sc-space-5);
1036
+ border: 1px dashed var(--sc-color-border-strong);
1037
+ border-radius: var(--sc-radius-lg);
1038
+ text-align: center;
1039
+ }
1040
+
1041
+ .sc-empty-title {
1042
+ font-weight: var(--sc-weight-bold);
1043
+ }
1044
+
1045
+ .sc-empty-body {
1046
+ max-width: 34rem;
1047
+ margin: var(--sc-space-2) auto 0;
1048
+ color: var(--sc-color-text-muted);
1049
+ font-size: var(--sc-text-sm);
1050
+ }
1051
+
1052
+ .sc-empty-action {
1053
+ margin-top: var(--sc-space-4);
1054
+ }
1055
+
1056
+ .sc-spinner {
1057
+ display: inline-flex;
1058
+ }
1059
+
1060
+ .sc-spinner-ring {
1061
+ width: 1.25rem;
1062
+ height: 1.25rem;
1063
+ border: 2px solid var(--sc-color-border-strong);
1064
+ border-top-color: var(--sc-color-accent);
1065
+ border-radius: 50%;
1066
+ }
1067
+
1068
+ @media (prefers-reduced-motion: no-preference) {
1069
+ .sc-spinner-ring {
1070
+ animation: sc-spin 700ms linear infinite;
1071
+ }
1072
+ }
1073
+
1074
+ @keyframes sc-spin {
1075
+ to {
1076
+ transform: rotate(360deg);
1077
+ }
1078
+ }
1079
+
1080
+ .sc-time {
1081
+ color: var(--sc-color-text-faint);
1082
+ font-size: var(--sc-text-xs);
1083
+ white-space: nowrap;
1084
+ }
1085
+
1086
+ /* Forms */
1087
+
1088
+ .sc-form {
1089
+ display: grid;
1090
+ gap: var(--sc-space-4);
1091
+ }
1092
+
1093
+ .sc-field {
1094
+ display: grid;
1095
+ gap: var(--sc-space-1);
1096
+ min-width: 0;
1097
+ margin: 0;
1098
+ padding: 0;
1099
+ border: 0;
1100
+ }
1101
+
1102
+ .sc-field-inline {
1103
+ grid-auto-flow: column;
1104
+ align-items: center;
1105
+ gap: var(--sc-space-2);
1106
+ }
1107
+
1108
+ .sc-field-label {
1109
+ color: var(--sc-color-text-muted);
1110
+ font-size: var(--sc-text-xs);
1111
+ font-weight: var(--sc-weight-medium);
1112
+ letter-spacing: 0.04em;
1113
+ text-transform: uppercase;
1114
+ }
1115
+
1116
+ .sc-field-row {
1117
+ display: grid;
1118
+ grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
1119
+ gap: var(--sc-space-4);
1120
+ }
1121
+
1122
+ .sc-input {
1123
+ width: 100%;
1124
+ min-height: var(--sc-control-size);
1125
+ padding: var(--sc-space-2) var(--sc-space-3);
1126
+ border: 1px solid var(--sc-color-border-strong);
1127
+ border-radius: var(--sc-radius-md);
1128
+ background: var(--sc-color-field);
1129
+ color: var(--sc-color-text);
1130
+ font-size: var(--sc-text-sm);
1131
+ transition:
1132
+ border-color var(--sc-transition),
1133
+ background var(--sc-transition);
1134
+ }
1135
+
1136
+ .sc-input::placeholder {
1137
+ color: var(--sc-color-text-faint);
1138
+ }
1139
+
1140
+ .sc-input:hover:not(:disabled) {
1141
+ border-color: color-mix(in srgb, var(--sc-color-border-strong) 60%, var(--sc-color-accent));
1142
+ }
1143
+
1144
+ .sc-input:focus {
1145
+ outline: var(--sc-focus-ring);
1146
+ outline-offset: 0;
1147
+ border-color: var(--sc-color-accent);
1148
+ }
1149
+
1150
+ .sc-input:disabled {
1151
+ opacity: 0.6;
1152
+ cursor: not-allowed;
1153
+ }
1154
+
1155
+ /* What people write is prose first, so the box they write in is set in the page's own face. */
1156
+ .sc-textarea {
1157
+ min-height: 6rem;
1158
+ resize: vertical;
1159
+ line-height: var(--sc-leading-normal);
1160
+ }
1161
+
1162
+ .sc-link-row {
1163
+ display: grid;
1164
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1fr) auto;
1165
+ gap: var(--sc-space-2);
1166
+ align-items: center;
1167
+ }
1168
+
1169
+ .sc-links,
1170
+ .sc-options {
1171
+ gap: var(--sc-space-2);
1172
+ }
1173
+
1174
+ /* The way to add one more line stands at the start, as wide as its words. */
1175
+ .sc-links > .sc-button,
1176
+ .sc-options > .sc-button {
1177
+ justify-self: start;
1178
+ }
1179
+
1180
+ .sc-form-actions {
1181
+ display: flex;
1182
+ flex-wrap: wrap;
1183
+ gap: var(--sc-space-2);
1184
+ }
1185
+
1186
+ .sc-form-error {
1187
+ color: var(--sc-color-danger);
1188
+ font-size: var(--sc-text-sm);
1189
+ }
1190
+
1191
+ /* The board: one pane per state, the tasks in it as cards. It takes the height the page has left
1192
+ and the width the window has, the columns share the width while it is enough for them and
1193
+ scroll sideways when it is not, and each column scrolls within itself. */
1194
+
1195
+ .sc-board {
1196
+ display: grid;
1197
+ flex: 1 1 0;
1198
+ grid-auto-flow: column;
1199
+ grid-auto-columns: minmax(var(--sc-column-width), 1fr);
1200
+ gap: var(--sc-space-3);
1201
+ min-height: 24rem;
1202
+ overflow-x: auto;
1203
+ scroll-snap-type: x proximity;
1204
+ scrollbar-width: thin;
1205
+ scrollbar-color: var(--sc-color-border-strong) transparent;
1206
+ }
1207
+
1208
+ .sc-column {
1209
+ display: flex;
1210
+ flex-direction: column;
1211
+ min-height: 0;
1212
+ border-radius: var(--sc-radius-xl);
1213
+ scroll-snap-align: start;
1214
+ }
1215
+
1216
+ .sc-column-header {
1217
+ display: flex;
1218
+ align-items: center;
1219
+ justify-content: space-between;
1220
+ gap: var(--sc-space-2);
1221
+ padding: var(--sc-space-3) var(--sc-space-4);
1222
+ border-bottom: var(--sc-border);
1223
+ }
1224
+
1225
+ .sc-column-header h2 {
1226
+ font-size: var(--sc-text-xs);
1227
+ font-weight: var(--sc-weight-bold);
1228
+ letter-spacing: 0.06em;
1229
+ text-transform: uppercase;
1230
+ }
1231
+
1232
+ .sc-column-count {
1233
+ display: inline-flex;
1234
+ align-items: center;
1235
+ justify-content: center;
1236
+ min-width: 1.5rem;
1237
+ padding-inline: var(--sc-space-2);
1238
+ border-radius: var(--sc-radius-full);
1239
+ background: var(--sc-color-bg-inset);
1240
+ color: var(--sc-color-text-muted);
1241
+ font-size: var(--sc-text-xs);
1242
+ font-weight: var(--sc-weight-medium);
1243
+ line-height: 1.5rem;
1244
+ }
1245
+
1246
+ .sc-column-in_progress .sc-column-title,
1247
+ .sc-column-in_review .sc-column-title {
1248
+ color: var(--sc-color-accent);
1249
+ }
1250
+
1251
+ .sc-column-done .sc-column-title {
1252
+ color: var(--sc-color-success);
1253
+ }
1254
+
1255
+ .sc-column-dropped .sc-column-title {
1256
+ color: var(--sc-color-text-faint);
1257
+ }
1258
+
1259
+ .sc-column-body {
1260
+ display: grid;
1261
+ flex: 1;
1262
+ align-content: start;
1263
+ gap: var(--sc-space-2);
1264
+ min-height: 0;
1265
+ padding: var(--sc-space-2);
1266
+ overflow-y: auto;
1267
+ scrollbar-width: thin;
1268
+ scrollbar-color: var(--sc-color-border-strong) transparent;
1269
+ }
1270
+
1271
+ .sc-card {
1272
+ display: grid;
1273
+ gap: var(--sc-space-1);
1274
+ padding: var(--sc-space-3);
1275
+ border-radius: var(--sc-radius-lg);
1276
+ transition:
1277
+ border-color var(--sc-transition),
1278
+ background var(--sc-transition),
1279
+ box-shadow var(--sc-transition);
1280
+ }
1281
+
1282
+ .sc-card:hover,
1283
+ .sc-card:focus-within {
1284
+ border-color: var(--sc-color-accent);
1285
+ background: var(--sc-color-sheet-hover);
1286
+ box-shadow: var(--sc-glow);
1287
+ }
1288
+
1289
+ .sc-card-title {
1290
+ color: var(--sc-color-text);
1291
+ font-size: var(--sc-text-sm);
1292
+ font-weight: var(--sc-weight-medium);
1293
+ line-height: 1.4;
1294
+ text-decoration: none;
1295
+ overflow-wrap: anywhere;
1296
+ }
1297
+
1298
+ .sc-card-title:hover {
1299
+ color: var(--sc-color-text);
1300
+ }
1301
+
1302
+ .sc-card-number {
1303
+ color: var(--sc-color-text-faint);
1304
+ font-family: var(--sc-font-mono);
1305
+ font-size: 0.9em;
1306
+ font-weight: var(--sc-weight-normal);
1307
+ }
1308
+
1309
+ .sc-card-meta {
1310
+ display: flex;
1311
+ flex-wrap: wrap;
1312
+ align-items: center;
1313
+ gap: var(--sc-space-1);
1314
+ margin-top: var(--sc-space-1);
1315
+ }
1316
+
1317
+ .sc-card-meta:empty {
1318
+ display: none;
1319
+ }
1320
+
1321
+ .sc-card-spacer {
1322
+ flex: 1;
1323
+ }
1324
+
1325
+ /* Moving a task from its card: a quiet control, as wide as the card. */
1326
+ .sc-card-move select {
1327
+ width: 100%;
1328
+ min-height: 1.75rem;
1329
+ padding: 0 var(--sc-space-2);
1330
+ border: 1px solid transparent;
1331
+ border-radius: var(--sc-radius-sm);
1332
+ background: transparent;
1333
+ color: var(--sc-color-text-faint);
1334
+ font-size: var(--sc-text-xs);
1335
+ transition:
1336
+ border-color var(--sc-transition),
1337
+ color var(--sc-transition);
1338
+ }
1339
+
1340
+ .sc-card-move select:hover,
1341
+ .sc-card-move select:focus {
1342
+ border-color: var(--sc-color-border-strong);
1343
+ background: var(--sc-color-field);
1344
+ color: var(--sc-color-text);
1345
+ }
1346
+
1347
+ /* One task, and a page of the documents: the text in a column for reading, the facts beside it
1348
+ where the window is wide enough, under it where it is not. */
1349
+
1350
+ .sc-task {
1351
+ display: grid;
1352
+ gap: var(--sc-space-5);
1353
+ }
1354
+
1355
+ .sc-task-editing {
1356
+ max-width: var(--sc-width-prose);
1357
+ }
1358
+
1359
+ .sc-task-body {
1360
+ display: grid;
1361
+ grid-template-columns: minmax(0, 1fr);
1362
+ gap: var(--sc-space-5);
1363
+ align-items: start;
1364
+ }
1365
+
1366
+ .sc-task-main {
1367
+ display: grid;
1368
+ gap: var(--sc-space-5);
1369
+ min-width: 0;
1370
+ max-width: var(--sc-width-prose);
1371
+ }
1372
+
1373
+ .sc-task-aside {
1374
+ display: grid;
1375
+ gap: var(--sc-space-4);
1376
+ min-width: 0;
1377
+ font-size: var(--sc-text-sm);
1378
+ }
1379
+
1380
+ @media (min-width: 64rem) {
1381
+ .sc-task-body {
1382
+ grid-template-columns: minmax(0, 1fr) var(--sc-width-aside);
1383
+ gap: var(--sc-space-7);
1384
+ }
1385
+
1386
+ .sc-task-aside {
1387
+ position: sticky;
1388
+ top: calc(var(--sc-header-height) + 2.75rem + var(--sc-space-5));
1389
+ }
1390
+ }
1391
+
1392
+ .sc-task-header {
1393
+ display: grid;
1394
+ gap: var(--sc-space-2);
1395
+ }
1396
+
1397
+ .sc-task-parent {
1398
+ color: var(--sc-color-text-muted);
1399
+ font-size: var(--sc-text-sm);
1400
+ }
1401
+
1402
+ .sc-task-title {
1403
+ font-size: var(--sc-text-2xl);
1404
+ letter-spacing: -0.02em;
1405
+ overflow-wrap: anywhere;
1406
+ }
1407
+
1408
+ .sc-task-title .sc-card-number {
1409
+ font-size: 0.8em;
1410
+ }
1411
+
1412
+ .sc-task-badges {
1413
+ display: flex;
1414
+ flex-wrap: wrap;
1415
+ gap: var(--sc-space-1);
1416
+ }
1417
+
1418
+ /* The facts of a thing, each under its name. */
1419
+ .sc-facts {
1420
+ display: grid;
1421
+ grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
1422
+ gap: var(--sc-space-3);
1423
+ padding: var(--sc-space-4);
1424
+ border-radius: var(--sc-radius-lg);
1425
+ font-size: var(--sc-text-sm);
1426
+ }
1427
+
1428
+ .sc-facts dt {
1429
+ color: var(--sc-color-text-faint);
1430
+ font-size: var(--sc-text-xs);
1431
+ font-weight: var(--sc-weight-medium);
1432
+ letter-spacing: 0.04em;
1433
+ text-transform: uppercase;
1434
+ }
1435
+
1436
+ .sc-facts dd {
1437
+ margin-top: var(--sc-space-1);
1438
+ }
1439
+
1440
+ .sc-task-actions {
1441
+ display: flex;
1442
+ flex-wrap: wrap;
1443
+ align-items: end;
1444
+ gap: var(--sc-space-2);
1445
+ }
1446
+
1447
+ .sc-task-section {
1448
+ display: grid;
1449
+ gap: var(--sc-space-3);
1450
+ }
1451
+
1452
+ .sc-link-list li + li,
1453
+ .sc-subtasks li + li {
1454
+ margin-top: var(--sc-space-2);
1455
+ }
1456
+
1457
+ .sc-subtasks a {
1458
+ color: var(--sc-color-text);
1459
+ text-decoration: none;
1460
+ }
1461
+
1462
+ .sc-subtasks a:hover {
1463
+ color: var(--sc-color-accent);
1464
+ }
1465
+
1466
+ /* Decisions: each a pane, the ones that wait marked in the point colour. */
1467
+
1468
+ .sc-decisions {
1469
+ display: grid;
1470
+ gap: var(--sc-space-6);
1471
+ max-width: var(--sc-width-prose);
1472
+ }
1473
+
1474
+ .sc-decision {
1475
+ display: grid;
1476
+ gap: var(--sc-space-3);
1477
+ padding: var(--sc-space-5);
1478
+ border-radius: var(--sc-radius-xl);
1479
+ }
1480
+
1481
+ .sc-decision + .sc-decision {
1482
+ margin-top: var(--sc-space-3);
1483
+ }
1484
+
1485
+ .sc-decision-question {
1486
+ font-size: var(--sc-text-lg);
1487
+ overflow-wrap: anywhere;
1488
+ }
1489
+
1490
+ .sc-decision-question a {
1491
+ color: var(--sc-color-text);
1492
+ text-decoration: none;
1493
+ }
1494
+
1495
+ .sc-decision-question a:hover {
1496
+ color: var(--sc-color-accent);
1497
+ }
1498
+
1499
+ /* A waiting decision has a warm mark before its question: the one thing on the page to look at. */
1500
+ .sc-decision:not(.sc-decision-answered) .sc-decision-question::before {
1501
+ content: "";
1502
+ display: inline-block;
1503
+ width: 0.5rem;
1504
+ height: 0.5rem;
1505
+ margin-right: var(--sc-space-2);
1506
+ border-radius: 50%;
1507
+ background: var(--sc-color-point);
1508
+ box-shadow: 0 0 0.75rem color-mix(in srgb, var(--sc-color-point) 60%, transparent);
1509
+ vertical-align: 0.1em;
1510
+ }
1511
+
1512
+ .sc-decision-meta {
1513
+ display: flex;
1514
+ flex-wrap: wrap;
1515
+ align-items: center;
1516
+ gap: var(--sc-space-1) var(--sc-space-2);
1517
+ margin-top: var(--sc-space-1);
1518
+ color: var(--sc-color-text-muted);
1519
+ font-size: var(--sc-text-sm);
1520
+ }
1521
+
1522
+ .sc-decision-waiting {
1523
+ color: var(--sc-color-warning);
1524
+ font-size: var(--sc-text-sm);
1525
+ }
1526
+
1527
+ .sc-answer {
1528
+ display: grid;
1529
+ gap: var(--sc-space-1);
1530
+ padding: var(--sc-space-3) var(--sc-space-4);
1531
+ border-left: 3px solid var(--sc-color-success);
1532
+ border-radius: 0 var(--sc-radius-md) var(--sc-radius-md) 0;
1533
+ }
1534
+
1535
+ .sc-answer-option {
1536
+ font-weight: var(--sc-weight-bold);
1537
+ }
1538
+
1539
+ .sc-answer-note {
1540
+ color: var(--sc-color-text-muted);
1541
+ font-size: var(--sc-text-sm);
1542
+ white-space: pre-wrap;
1543
+ }
1544
+
1545
+ .sc-answer-form {
1546
+ display: grid;
1547
+ gap: var(--sc-space-3);
1548
+ }
1549
+
1550
+ .sc-options-list {
1551
+ display: grid;
1552
+ gap: var(--sc-space-2);
1553
+ }
1554
+
1555
+ .sc-option {
1556
+ display: flex;
1557
+ align-items: center;
1558
+ gap: var(--sc-space-3);
1559
+ padding: var(--sc-space-2) var(--sc-space-3);
1560
+ border-color: var(--sc-color-border-strong);
1561
+ border-radius: var(--sc-radius-md);
1562
+ cursor: pointer;
1563
+ transition:
1564
+ border-color var(--sc-transition),
1565
+ background var(--sc-transition);
1566
+ }
1567
+
1568
+ .sc-option:hover {
1569
+ background: var(--sc-color-sheet-hover);
1570
+ }
1571
+
1572
+ .sc-option-chosen {
1573
+ border-color: var(--sc-color-accent);
1574
+ background: var(--sc-color-accent-subtle);
1575
+ }
1576
+
1577
+ .sc-option input {
1578
+ margin: 0;
1579
+ accent-color: var(--sc-color-accent);
1580
+ }
1581
+
1582
+ /* The feed: a line per event, newest first. */
1583
+
1584
+ .sc-feed {
1585
+ display: grid;
1586
+ gap: var(--sc-space-2);
1587
+ max-width: var(--sc-width-prose);
1588
+ }
1589
+
1590
+ .sc-feed-item {
1591
+ display: grid;
1592
+ grid-template-columns: auto minmax(0, 1fr) auto;
1593
+ align-items: center;
1594
+ gap: var(--sc-space-3);
1595
+ padding: var(--sc-space-2) var(--sc-space-3);
1596
+ border-radius: var(--sc-radius-md);
1597
+ font-size: var(--sc-text-sm);
1598
+ }
1599
+
1600
+ .sc-feed-words {
1601
+ overflow-wrap: anywhere;
1602
+ }
1603
+
1604
+ .sc-feed-words a {
1605
+ color: var(--sc-color-text);
1606
+ }
1607
+
1608
+ .sc-feed-words a:hover {
1609
+ color: var(--sc-color-accent);
1610
+ }
1611
+
1612
+ .sc-feed-agent {
1613
+ margin-left: var(--sc-space-2);
1614
+ color: var(--sc-color-text-muted);
1615
+ font-size: var(--sc-text-sm);
1616
+ }
1617
+
1618
+ /* Signing in: one pane in the light, with the mark on a small stage of its own. */
1619
+
1620
+ .sc-sign-in {
1621
+ display: grid;
1622
+ gap: var(--sc-space-4);
1623
+ max-width: 26rem;
1624
+ margin: 10dvh auto 0;
1625
+ padding: var(--sc-space-7) var(--sc-space-6) var(--sc-space-6);
1626
+ border-radius: var(--sc-radius-xl);
1627
+ text-align: center;
1628
+ }
1629
+
1630
+ .sc-sign-in-stage {
1631
+ position: relative;
1632
+ display: grid;
1633
+ place-items: center;
1634
+ height: 6.5rem;
1635
+ }
1636
+
1637
+ /* The light behind the mark, and the rings that leave it. */
1638
+ .sc-sign-in-stage::before {
1639
+ content: "";
1640
+ position: absolute;
1641
+ width: 14rem;
1642
+ height: 14rem;
1643
+ border-radius: 50%;
1644
+ background: radial-gradient(
1645
+ circle,
1646
+ color-mix(in srgb, var(--sc-color-accent) 35%, transparent),
1647
+ transparent 70%
1648
+ );
1649
+ pointer-events: none;
1650
+ }
1651
+
1652
+ .sc-sign-in-badge {
1653
+ position: relative;
1654
+ display: grid;
1655
+ place-items: center;
1656
+ width: 3.5rem;
1657
+ height: 3.5rem;
1658
+ border: 1px solid var(--sc-color-border-strong);
1659
+ border-radius: 28%;
1660
+ background: var(--sc-color-bg);
1661
+ box-shadow: 0 0.5rem 2rem -0.25rem color-mix(in srgb, var(--sc-color-accent) 55%, transparent);
1662
+ }
1663
+
1664
+ .sc-sign-in-badge::after {
1665
+ content: "";
1666
+ position: absolute;
1667
+ inset: 0;
1668
+ border: 1px solid var(--sc-color-accent);
1669
+ border-radius: inherit;
1670
+ opacity: 0;
1671
+ pointer-events: none;
1672
+ }
1673
+
1674
+ @media (prefers-reduced-motion: no-preference) {
1675
+ .sc-sign-in-badge::after {
1676
+ animation: sc-ring 3.6s ease-out infinite;
1677
+ }
1678
+ }
1679
+
1680
+ @keyframes sc-ring {
1681
+ 0% {
1682
+ transform: scale(1);
1683
+ opacity: 0.6;
1684
+ }
1685
+ 100% {
1686
+ transform: scale(2.6);
1687
+ opacity: 0;
1688
+ }
1689
+ }
1690
+
1691
+ .sc-sign-in-symbol {
1692
+ width: 2rem;
1693
+ height: 2rem;
1694
+ }
1695
+
1696
+ .sc-sign-in-wordmark {
1697
+ display: block;
1698
+ max-width: 12rem;
1699
+ height: 1.25rem;
1700
+ margin-inline: auto;
1701
+ }
1702
+
1703
+ .sc-sign-in-title {
1704
+ font-size: var(--sc-text-xl);
1705
+ }
1706
+
1707
+ .sc-sign-in-lead {
1708
+ color: var(--sc-color-text-muted);
1709
+ }
1710
+
1711
+ .sc-sign-in .sc-callout {
1712
+ margin-bottom: 0;
1713
+ text-align: left;
1714
+ }
1715
+
1716
+ .sc-sign-in-ways {
1717
+ display: flex;
1718
+ flex-wrap: wrap;
1719
+ justify-content: center;
1720
+ gap: var(--sc-space-3);
1721
+ }
1722
+
1723
+ .sc-sign-in-button {
1724
+ justify-self: center;
1725
+ }
1726
+
1727
+ /* Prose: what people and agents write, rendered from Markdown. Element selectors on purpose. */
1728
+
1729
+ .sc-prose {
1730
+ max-width: var(--sc-width-prose);
1731
+ overflow-wrap: anywhere;
1732
+ }
1733
+
1734
+ .sc-prose > * + * {
1735
+ margin-top: var(--sc-space-4);
1736
+ }
1737
+
1738
+ .sc-prose h1,
1739
+ .sc-prose h2,
1740
+ .sc-prose h3,
1741
+ .sc-prose h4 {
1742
+ margin-top: var(--sc-space-6);
1743
+ }
1744
+
1745
+ .sc-prose > :first-child {
1746
+ margin-top: 0;
1747
+ }
1748
+
1749
+ .sc-prose h1 {
1750
+ font-size: var(--sc-text-xl);
1751
+ }
1752
+
1753
+ .sc-prose h2 {
1754
+ padding-bottom: var(--sc-space-2);
1755
+ border-bottom: var(--sc-border);
1756
+ font-size: var(--sc-text-lg);
1757
+ }
1758
+
1759
+ .sc-prose h3,
1760
+ .sc-prose h4 {
1761
+ font-size: var(--sc-text-md);
1762
+ }
1763
+
1764
+ .sc-prose ul,
1765
+ .sc-prose ol {
1766
+ padding-left: var(--sc-space-5);
1767
+ }
1768
+
1769
+ .sc-prose ul {
1770
+ list-style: disc;
1771
+ }
1772
+
1773
+ .sc-prose ol {
1774
+ list-style: decimal;
1775
+ }
1776
+
1777
+ .sc-prose li + li {
1778
+ margin-top: var(--sc-space-1);
1779
+ }
1780
+
1781
+ .sc-prose blockquote {
1782
+ padding-left: var(--sc-space-4);
1783
+ border-left: 2px solid var(--sc-color-accent);
1784
+ color: var(--sc-color-text-muted);
1785
+ }
1786
+
1787
+ .sc-prose code {
1788
+ padding: 0.1em 0.35em;
1789
+ border-radius: var(--sc-radius-sm);
1790
+ background: var(--sc-color-bg-inset);
1791
+ }
1792
+
1793
+ .sc-prose pre {
1794
+ padding: var(--sc-space-4);
1795
+ border: var(--sc-border);
1796
+ border-radius: var(--sc-radius-md);
1797
+ background: var(--sc-color-sheet);
1798
+ font-size: var(--sc-text-sm);
1799
+ line-height: var(--sc-leading-code);
1800
+ white-space: pre-wrap;
1801
+ }
1802
+
1803
+ .sc-prose pre code {
1804
+ padding: 0;
1805
+ background: none;
1806
+ }
1807
+
1808
+ .sc-prose table {
1809
+ display: block;
1810
+ width: max-content;
1811
+ max-width: 100%;
1812
+ overflow-x: auto;
1813
+ border-collapse: collapse;
1814
+ font-size: var(--sc-text-sm);
1815
+ }
1816
+
1817
+ .sc-prose th,
1818
+ .sc-prose td {
1819
+ padding: var(--sc-space-2) var(--sc-space-3);
1820
+ border: var(--sc-border);
1821
+ text-align: left;
1822
+ vertical-align: top;
1823
+ }
1824
+
1825
+ .sc-prose th {
1826
+ background: var(--sc-color-sheet);
1827
+ }
1828
+
1829
+ .sc-prose img {
1830
+ display: inline-block;
1831
+ max-width: 100%;
1832
+ height: auto;
1833
+ border-radius: var(--sc-radius-md);
1834
+ }
1835
+
1836
+ .sc-prose-image-text {
1837
+ color: var(--sc-color-text-faint);
1838
+ font-style: italic;
1839
+ }
1840
+
1841
+ .sc-prose input[type="checkbox"] {
1842
+ margin-right: var(--sc-space-2);
1843
+ }
1844
+
1845
+ /* Agents: the tokens a person holds, and the one just made, shown once. */
1846
+
1847
+ .sc-token-list {
1848
+ display: grid;
1849
+ gap: var(--sc-space-3);
1850
+ }
1851
+
1852
+ .sc-token {
1853
+ display: flex;
1854
+ flex-wrap: wrap;
1855
+ align-items: center;
1856
+ justify-content: space-between;
1857
+ gap: var(--sc-space-3);
1858
+ padding: var(--sc-space-4);
1859
+ border-radius: var(--sc-radius-lg);
1860
+ }
1861
+
1862
+ .sc-token-name {
1863
+ font-weight: var(--sc-weight-medium);
1864
+ }
1865
+
1866
+ .sc-token-meta {
1867
+ display: flex;
1868
+ flex-wrap: wrap;
1869
+ gap: var(--sc-space-3);
1870
+ margin-top: var(--sc-space-1);
1871
+ color: var(--sc-color-text-muted);
1872
+ font-size: var(--sc-text-sm);
1873
+ }
1874
+
1875
+ .sc-secret {
1876
+ display: flex;
1877
+ flex-wrap: wrap;
1878
+ align-items: center;
1879
+ gap: var(--sc-space-2);
1880
+ margin: var(--sc-space-3) 0;
1881
+ }
1882
+
1883
+ .sc-secret-value {
1884
+ padding: var(--sc-space-2) var(--sc-space-3);
1885
+ border: var(--sc-border);
1886
+ border-radius: var(--sc-radius-sm);
1887
+ background: var(--sc-color-bg-inset);
1888
+ font-size: var(--sc-text-sm);
1889
+ word-break: break-all;
1890
+ user-select: all;
1891
+ }
1892
+
1893
+ /* People: everyone of the board, with what each may do. */
1894
+
1895
+ .sc-people {
1896
+ display: grid;
1897
+ gap: var(--sc-space-2);
1898
+ }
1899
+
1900
+ .sc-person-row {
1901
+ display: flex;
1902
+ flex-wrap: wrap;
1903
+ align-items: center;
1904
+ gap: var(--sc-space-3);
1905
+ padding: var(--sc-space-3) var(--sc-space-4);
1906
+ border-radius: var(--sc-radius-lg);
1907
+ }
1908
+
1909
+ .sc-person-name {
1910
+ flex: 1;
1911
+ color: var(--sc-color-text-muted);
1912
+ font-size: var(--sc-text-sm);
1913
+ }
1914
+
1915
+ /* Projects: what a person may see, each with what they are in it and what waits in it. */
1916
+
1917
+ .sc-projects {
1918
+ display: grid;
1919
+ grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
1920
+ gap: var(--sc-space-4);
1921
+ }
1922
+
1923
+ .sc-project {
1924
+ display: flex;
1925
+ flex-direction: column;
1926
+ gap: var(--sc-space-2);
1927
+ padding: var(--sc-space-5);
1928
+ border-radius: var(--sc-radius-xl);
1929
+ transition:
1930
+ border-color var(--sc-transition),
1931
+ background var(--sc-transition),
1932
+ box-shadow var(--sc-transition);
1933
+ }
1934
+
1935
+ .sc-project:hover,
1936
+ .sc-project:focus-within {
1937
+ border-color: var(--sc-color-accent);
1938
+ background: var(--sc-glass-surface-hover);
1939
+ box-shadow: var(--sc-glass-sheen), var(--sc-glass-lift), var(--sc-glow);
1940
+ }
1941
+
1942
+ .sc-project-head {
1943
+ display: flex;
1944
+ flex-wrap: wrap;
1945
+ align-items: center;
1946
+ gap: var(--sc-space-2) var(--sc-space-3);
1947
+ }
1948
+
1949
+ /* The whole pane is the way in: the name's link stretches over it. */
1950
+ .sc-project-name {
1951
+ color: var(--sc-color-text);
1952
+ font-size: var(--sc-text-lg);
1953
+ font-weight: var(--sc-weight-bold);
1954
+ text-decoration: none;
1955
+ }
1956
+
1957
+ .sc-project-name::after {
1958
+ content: "";
1959
+ position: absolute;
1960
+ inset: 0;
1961
+ }
1962
+
1963
+ .sc-project-name:hover {
1964
+ color: var(--sc-color-text);
1965
+ }
1966
+
1967
+ .sc-project-name:focus-visible {
1968
+ outline: none;
1969
+ }
1970
+
1971
+ .sc-project-key {
1972
+ color: var(--sc-color-text-faint);
1973
+ font-size: var(--sc-text-xs);
1974
+ }
1975
+
1976
+ .sc-project-description {
1977
+ color: var(--sc-color-text-muted);
1978
+ font-size: var(--sc-text-sm);
1979
+ }
1980
+
1981
+ .sc-project-meta {
1982
+ display: flex;
1983
+ flex-wrap: wrap;
1984
+ gap: var(--sc-space-2);
1985
+ margin-top: auto;
1986
+ padding-top: var(--sc-space-2);
1987
+ }
1988
+
1989
+ .sc-project-meta:empty {
1990
+ display: none;
1991
+ }
1992
+
1993
+ .sc-members {
1994
+ display: grid;
1995
+ gap: var(--sc-space-4);
1996
+ }
1997
+
1998
+ .sc-member-form .sc-field-row {
1999
+ align-items: end;
2000
+ }
2001
+
2002
+ /* Skills: the project's, or the organization's, as SkillCDN serves them at the address. */
2003
+
2004
+ .sc-skills {
2005
+ display: grid;
2006
+ gap: var(--sc-space-2);
2007
+ }
2008
+
2009
+ .sc-skill {
2010
+ padding: var(--sc-space-3) var(--sc-space-4);
2011
+ border-radius: var(--sc-radius-lg);
2012
+ }
2013
+
2014
+ .sc-skill-head {
2015
+ display: flex;
2016
+ flex-wrap: wrap;
2017
+ align-items: baseline;
2018
+ gap: var(--sc-space-3);
2019
+ margin: 0;
2020
+ }
2021
+
2022
+ .sc-skill-name {
2023
+ font-weight: var(--sc-weight-medium);
2024
+ }
2025
+
2026
+ .sc-skill-description {
2027
+ margin: var(--sc-space-2) 0 0;
2028
+ color: var(--sc-color-text-muted);
2029
+ font-size: var(--sc-text-sm);
2030
+ }
2031
+
2032
+ .sc-skill-uri {
2033
+ display: block;
2034
+ margin-top: var(--sc-space-2);
2035
+ color: var(--sc-color-text-faint);
2036
+ font-size: var(--sc-text-xs);
2037
+ word-break: break-all;
2038
+ }
2039
+
2040
+ /* Runs: an agent at work on a task, what it reported and handed in. */
2041
+
2042
+ .sc-runs {
2043
+ display: grid;
2044
+ gap: var(--sc-space-3);
2045
+ }
2046
+
2047
+ .sc-run {
2048
+ display: grid;
2049
+ gap: var(--sc-space-3);
2050
+ padding: var(--sc-space-4) var(--sc-space-5);
2051
+ border-radius: var(--sc-radius-lg);
2052
+ }
2053
+
2054
+ .sc-run-header {
2055
+ display: flex;
2056
+ flex-wrap: wrap;
2057
+ align-items: center;
2058
+ gap: var(--sc-space-2);
2059
+ }
2060
+
2061
+ .sc-run-agent {
2062
+ font-weight: var(--sc-weight-medium);
2063
+ }
2064
+
2065
+ .sc-run-meta {
2066
+ display: inline-flex;
2067
+ flex-wrap: wrap;
2068
+ align-items: center;
2069
+ gap: var(--sc-space-1);
2070
+ color: var(--sc-color-text-muted);
2071
+ font-size: var(--sc-text-sm);
2072
+ }
2073
+
2074
+ .sc-run-waiting {
2075
+ color: var(--sc-color-warning);
2076
+ font-size: var(--sc-text-sm);
2077
+ }
2078
+
2079
+ .sc-run-reports {
2080
+ display: grid;
2081
+ gap: var(--sc-space-3);
2082
+ padding-left: 0;
2083
+ list-style: none;
2084
+ }
2085
+
2086
+ .sc-report {
2087
+ display: grid;
2088
+ gap: var(--sc-space-1);
2089
+ padding-left: var(--sc-space-3);
2090
+ border-left: 2px solid var(--sc-color-border-strong);
2091
+ font-size: var(--sc-text-sm);
2092
+ }
2093
+
2094
+ .sc-run-summary {
2095
+ padding-top: var(--sc-space-3);
2096
+ border-top: var(--sc-border);
2097
+ }
2098
+
2099
+ .sc-connect {
2100
+ display: grid;
2101
+ gap: var(--sc-space-3);
2102
+ margin-top: var(--sc-space-5);
2103
+ }
2104
+
2105
+ .sc-code {
2106
+ overflow-x: auto;
2107
+ padding: var(--sc-space-3) var(--sc-space-4);
2108
+ border: var(--sc-border);
2109
+ border-radius: var(--sc-radius-md);
2110
+ background: var(--sc-color-field);
2111
+ font-family: var(--sc-font-mono);
2112
+ font-size: var(--sc-text-sm);
2113
+ line-height: var(--sc-leading-code);
2114
+ white-space: pre-wrap;
2115
+ word-break: break-all;
2116
+ }
2117
+
2118
+ .sc-code-input {
2119
+ max-width: 12rem;
2120
+ font-family: var(--sc-font-mono);
2121
+ font-size: var(--sc-text-lg);
2122
+ letter-spacing: 0.12em;
2123
+ text-transform: uppercase;
2124
+ }
2125
+
2126
+ .sc-code-shown {
2127
+ font-size: var(--sc-text-md);
2128
+ letter-spacing: 0.1em;
2129
+ }
2130
+
2131
+ /* Documents: a folder's pages, one page with its versions, its links both ways and its files. */
2132
+
2133
+ .sc-doc {
2134
+ display: grid;
2135
+ gap: var(--sc-space-5);
2136
+ }
2137
+
2138
+ .sc-doc-crumbs {
2139
+ margin-bottom: var(--sc-space-3);
2140
+ color: var(--sc-color-text-muted);
2141
+ font-size: var(--sc-text-sm);
2142
+ }
2143
+
2144
+ /* On a page the crumbs sit close to the title. */
2145
+ .sc-doc > .sc-doc-crumbs {
2146
+ margin-bottom: calc(-1 * var(--sc-space-3));
2147
+ }
2148
+
2149
+ .sc-doc-crumbs a {
2150
+ color: var(--sc-color-text-muted);
2151
+ text-decoration: none;
2152
+ }
2153
+
2154
+ .sc-doc-crumbs a:hover {
2155
+ color: var(--sc-color-accent);
2156
+ }
2157
+
2158
+ .sc-doc-crumbs .sc-crumb-separator {
2159
+ margin-inline: var(--sc-space-2);
2160
+ }
2161
+
2162
+ .sc-doc-search {
2163
+ display: flex;
2164
+ gap: var(--sc-space-2);
2165
+ margin-bottom: var(--sc-space-4);
2166
+ }
2167
+
2168
+ .sc-doc-search .sc-input {
2169
+ flex: 1;
2170
+ max-width: 32rem;
2171
+ }
2172
+
2173
+ .sc-folder {
2174
+ display: grid;
2175
+ gap: var(--sc-space-3);
2176
+ }
2177
+
2178
+ .sc-folders {
2179
+ display: flex;
2180
+ flex-wrap: wrap;
2181
+ gap: var(--sc-space-2);
2182
+ margin: 0;
2183
+ padding: 0;
2184
+ list-style: none;
2185
+ }
2186
+
2187
+ .sc-folder-link {
2188
+ display: inline-block;
2189
+ padding: var(--sc-space-1) var(--sc-space-3);
2190
+ border: var(--sc-border);
2191
+ border-radius: var(--sc-radius-full);
2192
+ background: var(--sc-color-sheet);
2193
+ color: var(--sc-color-text);
2194
+ font-family: var(--sc-font-mono);
2195
+ font-size: var(--sc-text-sm);
2196
+ text-decoration: none;
2197
+ transition:
2198
+ border-color var(--sc-transition),
2199
+ color var(--sc-transition);
2200
+ }
2201
+
2202
+ .sc-folder-link:hover {
2203
+ border-color: var(--sc-color-accent);
2204
+ color: var(--sc-color-accent);
2205
+ }
2206
+
2207
+ .sc-docs {
2208
+ display: grid;
2209
+ gap: var(--sc-space-2);
2210
+ margin: 0;
2211
+ padding: 0;
2212
+ list-style: none;
2213
+ }
2214
+
2215
+ .sc-doc-row {
2216
+ display: flex;
2217
+ flex-wrap: wrap;
2218
+ align-items: baseline;
2219
+ gap: var(--sc-space-2) var(--sc-space-3);
2220
+ padding: var(--sc-space-3) var(--sc-space-4);
2221
+ border-radius: var(--sc-radius-lg);
2222
+ transition: border-color var(--sc-transition);
2223
+ }
2224
+
2225
+ .sc-doc-row:hover {
2226
+ border-color: var(--sc-color-border-strong);
2227
+ }
2228
+
2229
+ .sc-doc-title {
2230
+ color: var(--sc-color-text);
2231
+ font-weight: var(--sc-weight-medium);
2232
+ text-decoration: none;
2233
+ }
2234
+
2235
+ .sc-doc-title:hover {
2236
+ color: var(--sc-color-accent);
2237
+ }
2238
+
2239
+ .sc-doc-meta {
2240
+ color: var(--sc-color-text-muted);
2241
+ font-size: var(--sc-text-sm);
2242
+ }
2243
+
2244
+ .sc-doc-path {
2245
+ font-family: var(--sc-font-mono);
2246
+ font-size: var(--sc-text-xs);
2247
+ color: var(--sc-color-text-faint);
2248
+ }
2249
+
2250
+ .sc-doc-editor {
2251
+ min-height: 24rem;
2252
+ }
2253
+
2254
+ .sc-doc-notice {
2255
+ margin-bottom: var(--sc-space-4);
2256
+ padding: var(--sc-space-3) var(--sc-space-4);
2257
+ border: var(--sc-border);
2258
+ border-radius: var(--sc-radius-md);
2259
+ background: var(--sc-color-sheet);
2260
+ color: var(--sc-color-text-muted);
2261
+ }
2262
+
2263
+ .sc-doc-archived .sc-prose {
2264
+ opacity: 0.85;
2265
+ }
2266
+
2267
+ .sc-doc-attach {
2268
+ display: flex;
2269
+ flex-wrap: wrap;
2270
+ gap: var(--sc-space-2);
2271
+ margin-top: var(--sc-space-3);
2272
+ }
2273
+
2274
+ .sc-versions {
2275
+ margin: 0;
2276
+ padding: 0;
2277
+ list-style: none;
2278
+ }
2279
+
2280
+ .sc-version + .sc-version {
2281
+ margin-top: var(--sc-space-2);
2282
+ }
2283
+
2284
+ .sc-version-number {
2285
+ display: inline-block;
2286
+ min-width: 2.5rem;
2287
+ font-family: var(--sc-font-mono);
2288
+ font-size: var(--sc-text-sm);
2289
+ }
2290
+
2291
+ /* In the aside of a task or a page, the facts stack and the sections are small. */
2292
+
2293
+ .sc-task-aside .sc-facts {
2294
+ grid-template-columns: 1fr;
2295
+ }
2296
+
2297
+ .sc-task-aside .sc-section-title {
2298
+ margin-bottom: var(--sc-space-1);
2299
+ color: var(--sc-color-text-faint);
2300
+ font-size: var(--sc-text-xs);
2301
+ font-weight: var(--sc-weight-medium);
2302
+ letter-spacing: 0.04em;
2303
+ text-transform: uppercase;
2304
+ }
2305
+
2306
+ .sc-task-aside .sc-task-section {
2307
+ gap: var(--sc-space-1);
2308
+ }
2309
+
2310
+ .sc-task-aside .sc-link-list li + li,
2311
+ .sc-task-aside .sc-version + .sc-version {
2312
+ margin-top: var(--sc-space-1);
2313
+ }
2314
+
2315
+ /* A decision as a record: its context, its answer, and what followed. */
2316
+
2317
+ .sc-decision-section {
2318
+ margin-top: var(--sc-space-3);
2319
+ }
2320
+
2321
+ .sc-decision-label {
2322
+ margin: 0 0 var(--sc-space-1);
2323
+ color: var(--sc-color-text-faint);
2324
+ font-size: var(--sc-text-xs);
2325
+ font-weight: var(--sc-weight-medium);
2326
+ letter-spacing: 0.04em;
2327
+ text-transform: uppercase;
2328
+ }
2329
+
2330
+ .sc-outcome-form {
2331
+ display: grid;
2332
+ gap: var(--sc-space-2);
2333
+ }
2334
+
2335
+ /* Under the wide layout a task's facts come first: changing its state and reaching its forms is
2336
+ what a phone is opened for, and two to a row they stay short. A document keeps its text first. */
2337
+ @media (max-width: 63.99rem) {
2338
+ .sc-task .sc-task-aside {
2339
+ order: -1;
2340
+ }
2341
+
2342
+ .sc-task .sc-task-aside .sc-facts {
2343
+ grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
2344
+ }
2345
+ }
2346
+
2347
+ /* Where there is no pointer to hover with, the control on a card is as tall as a finger needs. */
2348
+ @media (hover: none) {
2349
+ .sc-card-move select {
2350
+ min-height: 2rem;
2351
+ }
2352
+ }
2353
+
2354
+ /* Small screens. */
2355
+
2356
+ @media (max-width: 40rem) {
2357
+ .sc-header-inner {
2358
+ gap: var(--sc-space-3);
2359
+ padding-inline: var(--sc-space-4);
2360
+ }
2361
+
2362
+ .sc-brand-symbol,
2363
+ .sc-brand-wordmark {
2364
+ height: var(--sc-brand-size-compact);
2365
+ }
2366
+
2367
+ .sc-brand-symbol {
2368
+ width: var(--sc-brand-size-compact);
2369
+ }
2370
+
2371
+ .sc-crumb-link {
2372
+ max-width: 8rem;
2373
+ }
2374
+
2375
+ /* A narrow bar holds the lockup and where the page is; the crumbs above that give way. */
2376
+ .sc-crumb:not(:last-of-type) {
2377
+ display: none;
2378
+ }
2379
+
2380
+ /* Tabs that do not fit wrap, so that none is hidden off the edge. */
2381
+ .sc-tabs {
2382
+ padding-inline: var(--sc-space-4);
2383
+ overflow: visible;
2384
+ }
2385
+
2386
+ .sc-tabs-inner {
2387
+ flex-wrap: wrap;
2388
+ gap: 0 var(--sc-space-4);
2389
+ }
2390
+
2391
+ .sc-menu-summary .sc-person-login {
2392
+ display: none;
2393
+ }
2394
+
2395
+ .sc-main {
2396
+ padding: var(--sc-space-5) var(--sc-space-4) var(--sc-space-7);
2397
+ }
2398
+
2399
+ .sc-page-title,
2400
+ .sc-task-title {
2401
+ font-size: var(--sc-text-xl);
2402
+ }
2403
+
2404
+ .sc-panel {
2405
+ padding: var(--sc-space-4);
2406
+ border-radius: var(--sc-radius-lg);
2407
+ }
2408
+
2409
+ .sc-board {
2410
+ grid-auto-columns: min(var(--sc-column-width), 85vw);
2411
+ }
2412
+
2413
+ .sc-feed-item {
2414
+ grid-template-columns: 1fr;
2415
+ gap: var(--sc-space-1);
2416
+ }
2417
+
2418
+ .sc-sign-in {
2419
+ margin-top: var(--sc-space-6);
2420
+ padding: var(--sc-space-6) var(--sc-space-5) var(--sc-space-5);
2421
+ }
2422
+
2423
+ .sc-link-row {
2424
+ grid-template-columns: 1fr;
2425
+ }
2426
+
2427
+ .sc-decision,
2428
+ .sc-project {
2429
+ padding: var(--sc-space-4);
2430
+ border-radius: var(--sc-radius-lg);
2431
+ }
2432
+ }