@repo-prism/dispatch-hub 1.1.11

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 (67) hide show
  1. package/README.md +18 -0
  2. package/dist/auth.d.ts +5 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +37 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/bin.d.ts +3 -0
  7. package/dist/bin.d.ts.map +1 -0
  8. package/dist/bin.js +14 -0
  9. package/dist/bin.js.map +1 -0
  10. package/dist/dashboard/app.css +1 -0
  11. package/dist/dashboard/app.js +237 -0
  12. package/dist/dashboard/app.js.map +18 -0
  13. package/dist/dashboard/hub.css +707 -0
  14. package/dist/dashboard/index.html +13 -0
  15. package/dist/ensure.d.ts +27 -0
  16. package/dist/ensure.d.ts.map +1 -0
  17. package/dist/ensure.js +117 -0
  18. package/dist/ensure.js.map +1 -0
  19. package/dist/hub-record.d.ts +8 -0
  20. package/dist/hub-record.d.ts.map +1 -0
  21. package/dist/hub-record.js +25 -0
  22. package/dist/hub-record.js.map +1 -0
  23. package/dist/idle.d.ts +16 -0
  24. package/dist/idle.d.ts.map +1 -0
  25. package/dist/idle.js +33 -0
  26. package/dist/idle.js.map +1 -0
  27. package/dist/index.d.ts +12 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +11 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/json-file.d.ts +3 -0
  32. package/dist/json-file.d.ts.map +1 -0
  33. package/dist/json-file.js +19 -0
  34. package/dist/json-file.js.map +1 -0
  35. package/dist/notice.d.ts +11 -0
  36. package/dist/notice.d.ts.map +1 -0
  37. package/dist/notice.js +36 -0
  38. package/dist/notice.js.map +1 -0
  39. package/dist/notify.d.ts +7 -0
  40. package/dist/notify.d.ts.map +1 -0
  41. package/dist/notify.js +59 -0
  42. package/dist/notify.js.map +1 -0
  43. package/dist/paths.d.ts +17 -0
  44. package/dist/paths.d.ts.map +1 -0
  45. package/dist/paths.js +38 -0
  46. package/dist/paths.js.map +1 -0
  47. package/dist/registry.d.ts +8 -0
  48. package/dist/registry.d.ts.map +1 -0
  49. package/dist/registry.js +42 -0
  50. package/dist/registry.js.map +1 -0
  51. package/dist/server.d.ts +22 -0
  52. package/dist/server.d.ts.map +1 -0
  53. package/dist/server.js +264 -0
  54. package/dist/server.js.map +1 -0
  55. package/dist/snapshot.d.ts +7 -0
  56. package/dist/snapshot.d.ts.map +1 -0
  57. package/dist/snapshot.js +43 -0
  58. package/dist/snapshot.js.map +1 -0
  59. package/dist/types.d.ts +48 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +13 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/watch.d.ts +22 -0
  64. package/dist/watch.d.ts.map +1 -0
  65. package/dist/watch.js +164 -0
  66. package/dist/watch.js.map +1 -0
  67. package/package.json +45 -0
@@ -0,0 +1,707 @@
1
+ /**
2
+ * Prism UI tokens — UXPilot dark product system.
3
+ * Source of truth: plans/mockups/screens/html/*.html + plans/mockups/DESIGN.md.
4
+ * ADR-0014 relocked the product UI from light Signal Chart to this dark theme.
5
+ * Surfaces must consume these tokens; do not invent alternate palettes.
6
+ *
7
+ * Theme contract (consumers):
8
+ * document.documentElement.dataset.theme = 'light' | 'dark' | 'system'
9
+ * The overrides below apply whether `data-theme` is set on :root/<html> OR on
10
+ * any `.prism-theme` ancestor, so the toggle takes effect app-wide regardless
11
+ * of where the attribute lands. Default (no attribute) = dark.
12
+ *
13
+ * Density: document.documentElement.dataset.prismDensity = 'comfortable' | 'compact'
14
+ * (or data-density on a .prism-theme ancestor)
15
+ * Mono font: document.documentElement.dataset.prismMonoFont = 'jetbrains' | 'ibm-plex' | 'fira' | 'system'
16
+ * Sans font: document.documentElement.dataset.prismSansFont = 'inter' | 'ibm-plex' | 'system'
17
+ */
18
+ :root,
19
+ .prism-theme {
20
+ /* Brand + accents (UXPilot) */
21
+ --prism-brand: #00c2c2;
22
+ --prism-brand-strong: #00dcd4;
23
+ /* Primary button label — always white for contrast on teal (Design.md on-primary). */
24
+ --prism-on-brand: #ffffff;
25
+ --prism-violet: #6c63ff;
26
+
27
+ /* Text */
28
+ --prism-ink: #ffffff;
29
+ --prism-ink-muted: #94a3b8;
30
+ --prism-text: #e6f0f2;
31
+ --prism-text-faint: #94a3b8;
32
+ --prism-surface: #131926;
33
+ --prism-border: #2a334a;
34
+
35
+ /* Structure */
36
+ --prism-line: #2a334a;
37
+ --prism-panel: #131926;
38
+ --prism-panel-2: #0f1420;
39
+ --prism-canvas: #0a0e1a;
40
+ --prism-canvas-alt: #0f1420;
41
+ --prism-tile: #1e2433;
42
+ --prism-elev: #1e2433;
43
+
44
+ /* Map graph */
45
+ --prism-route: #00c2c2;
46
+ --prism-edge: color-mix(in srgb, #00c2c2 45%, #2a334a);
47
+ --prism-edge-strong: color-mix(in srgb, #00c2c2 78%, #94a3b8);
48
+ --prism-node-fill: #1e2433;
49
+ --prism-node-fill-selected: color-mix(in srgb, #00c2c2 16%, #131926);
50
+
51
+ /* Signal colors */
52
+ --prism-risk: #f59e0b;
53
+ --prism-risk-extreme: #f43f5e;
54
+ --prism-safe: #10b981;
55
+ --prism-amber: #f59e0b;
56
+ --prism-rose: #f43f5e;
57
+ --prism-emerald: #10b981;
58
+
59
+ /* Tooltip / instrument chrome */
60
+ --prism-dark-chrome: #1e2433;
61
+ --prism-dark-ink: #e8eef2;
62
+
63
+ /* Aliases */
64
+ --bg-canvas: var(--prism-canvas);
65
+ --bg-panel: var(--prism-panel);
66
+ --ink: var(--prism-ink);
67
+ --ink-muted: var(--prism-ink-muted);
68
+ --line: var(--prism-line);
69
+ --brand: var(--prism-brand);
70
+ /* Shell aliases used by overview/settings (keep in sync with light block). */
71
+ --prism-text-dim: var(--prism-ink-muted);
72
+ --prism-surface-raised: var(--prism-elev);
73
+ --prism-surface-container: var(--prism-tile);
74
+
75
+ /* Typography (UXPilot: Inter + JetBrains Mono) */
76
+ --prism-font: "Inter", "Segoe UI", system-ui, sans-serif;
77
+ --prism-mono: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;
78
+ --prism-type-brand-size: 1.125rem;
79
+ --prism-type-brand-weight: 650;
80
+ --prism-type-brand-tracking: -0.02em;
81
+ --prism-type-h2-size: 1.15rem;
82
+ --prism-type-h2-weight: 600;
83
+ --prism-type-body: 0.9375rem;
84
+ --prism-type-body-sm: 0.8125rem;
85
+ --prism-type-label: 0.75rem;
86
+ --prism-type-label-tracking: 0.04em;
87
+ --prism-type-mono: 0.75rem;
88
+ --prism-leading-body: 1.45;
89
+
90
+ /* Shape + space */
91
+ --prism-radius-sm: 6px;
92
+ --prism-radius-md: 8px;
93
+ --prism-radius-lg: 12px;
94
+ --prism-radius-pill: 999px;
95
+ --prism-space-xs: 4px;
96
+ --prism-space-sm: 8px;
97
+ --prism-space-md: 16px;
98
+ --prism-space-lg: 24px;
99
+ --prism-space-xl: 32px;
100
+ --prism-topbar-h: 48px;
101
+ --prism-sidebar-w: 224px;
102
+ --prism-inspector-w: 288px;
103
+ --prism-shadow-inspector: 0 8px 24px rgba(0, 0, 0, 0.45);
104
+
105
+ /* Elevation ladder (dark) */
106
+ --prism-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.4), 0 1px 1px rgba(0, 0, 0, 0.3);
107
+ --prism-shadow-2: 0 4px 12px rgba(0, 0, 0, 0.45), 0 1px 3px rgba(0, 0, 0, 0.35);
108
+ --prism-shadow-3: 0 14px 34px rgba(0, 0, 0, 0.55), 0 4px 10px rgba(0, 0, 0, 0.4);
109
+ --prism-shadow-float: 0 22px 52px rgba(0, 0, 0, 0.6), 0 6px 16px rgba(0, 0, 0, 0.45);
110
+
111
+ /* Selection focus ring (teal) */
112
+ --prism-ring: 0 0 0 3px color-mix(in srgb, var(--prism-brand) 26%, transparent);
113
+ --prism-ring-strong: 0 0 0 2px color-mix(in srgb, var(--prism-brand) 60%, transparent);
114
+
115
+ /* Signal glass — thin instrument surfaces floating over the map */
116
+ --prism-glass: color-mix(in srgb, var(--prism-tile) 86%, transparent);
117
+ --prism-glass-line: color-mix(in srgb, var(--prism-line) 90%, transparent);
118
+ --prism-glass-blur: 14px;
119
+
120
+ /* Motion */
121
+ --prism-dur-1: 120ms;
122
+ --prism-dur-2: 200ms;
123
+ --prism-dur-3: 320ms;
124
+ --prism-dur-4: 480ms;
125
+ --prism-ease: cubic-bezier(0.4, 0, 0.2, 1);
126
+ --prism-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
127
+ --prism-ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
128
+
129
+ /* Map atmosphere — dot grid over deep navy */
130
+ --prism-grid-line: rgba(42, 51, 74, 0.7);
131
+ --prism-grid-fine: rgba(42, 51, 74, 0.4);
132
+ --prism-vignette: rgba(0, 0, 0, 0.4);
133
+ }
134
+
135
+ /* Density overrides */
136
+ .prism-theme[data-density="comfortable"],
137
+ :root[data-prism-density="comfortable"],
138
+ html[data-prism-density="comfortable"] body,
139
+ :root[data-prism-density="comfortable"] .prism-theme {
140
+ --prism-space-xs: 6px;
141
+ --prism-space-sm: 10px;
142
+ --prism-space-md: 18px;
143
+ --prism-space-lg: 28px;
144
+ }
145
+
146
+ .prism-theme[data-density="compact"],
147
+ :root[data-prism-density="compact"],
148
+ html[data-prism-density="compact"] body,
149
+ :root[data-prism-density="compact"] .prism-theme {
150
+ --prism-space-xs: 2px;
151
+ --prism-space-sm: 6px;
152
+ --prism-space-md: 12px;
153
+ --prism-space-lg: 18px;
154
+ }
155
+
156
+ /* Mono font family — set data-prism-mono-font on :root/<html> or .prism-theme */
157
+ :root[data-prism-mono-font="jetbrains"],
158
+ .prism-theme[data-prism-mono-font="jetbrains"] {
159
+ --prism-mono: "JetBrains Mono", ui-monospace, monospace;
160
+ }
161
+
162
+ :root[data-prism-mono-font="ibm-plex"],
163
+ .prism-theme[data-prism-mono-font="ibm-plex"] {
164
+ --prism-mono: "IBM Plex Mono", ui-monospace, monospace;
165
+ }
166
+
167
+ :root[data-prism-mono-font="fira"],
168
+ .prism-theme[data-prism-mono-font="fira"] {
169
+ --prism-mono: "Fira Code", "Fira Mono", ui-monospace, monospace;
170
+ }
171
+
172
+ :root[data-prism-mono-font="system"],
173
+ .prism-theme[data-prism-mono-font="system"] {
174
+ --prism-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
175
+ }
176
+
177
+ /* Sans font family — set data-prism-sans-font on :root/<html> or .prism-theme */
178
+ :root[data-prism-sans-font="inter"],
179
+ .prism-theme[data-prism-sans-font="inter"] {
180
+ --prism-font: "Inter", "Segoe UI", system-ui, sans-serif;
181
+ }
182
+
183
+ :root[data-prism-sans-font="ibm-plex"],
184
+ .prism-theme[data-prism-sans-font="ibm-plex"] {
185
+ --prism-font: "IBM Plex Sans", "Segoe UI", system-ui, sans-serif;
186
+ }
187
+
188
+ :root[data-prism-sans-font="system"],
189
+ .prism-theme[data-prism-sans-font="system"] {
190
+ --prism-font: system-ui, -apple-system, "Segoe UI", sans-serif;
191
+ }
192
+
193
+ /* Light theme — keep brand teal; flip structure + chrome.
194
+ Applies when data-theme="light" is on :root/<html>, on a .prism-theme
195
+ ancestor, or on :root with a nested .prism-theme container. */
196
+ .prism-theme[data-theme="light"],
197
+ :root[data-theme="light"],
198
+ html[data-theme="light"],
199
+ html[data-theme="light"] body,
200
+ :root[data-theme="light"] .prism-theme,
201
+ html[data-theme="light"] .prism-theme {
202
+ /* Signal Chart / Design.md light atmospheric palette */
203
+ --prism-ink: #191c1d;
204
+ --prism-ink-muted: #5a6b76;
205
+ --prism-line: #c5d0d8;
206
+ --prism-panel: #ffffff;
207
+ --prism-panel-2: #f3f4f5;
208
+ --prism-canvas: #e8eef2;
209
+ --prism-canvas-alt: #f4f7f9;
210
+ --prism-tile: #edeeef;
211
+ --prism-elev: #ffffff;
212
+ --prism-brand: #005c55;
213
+ --prism-brand-strong: #0f766e;
214
+ --prism-on-brand: #ffffff;
215
+ --prism-node-fill: #ffffff;
216
+ --prism-node-fill-selected: color-mix(in srgb, #005c55 12%, #ffffff);
217
+ --prism-edge: color-mix(in srgb, #005c55 40%, #c5d0d8);
218
+ --prism-dark-chrome: #ffffff;
219
+ --prism-dark-ink: #191c1d;
220
+ --prism-text: #191c1d;
221
+ --prism-text-faint: #5a6b76;
222
+ --prism-surface: #f8f9fa;
223
+ --prism-border: #c5d0d8;
224
+ --prism-grid-line: rgba(90, 107, 118, 0.35);
225
+ --prism-grid-fine: rgba(90, 107, 118, 0.2);
226
+ --prism-vignette: rgba(25, 28, 29, 0.06);
227
+ --prism-shadow-inspector: 0 8px 24px rgba(25, 28, 29, 0.1);
228
+ --prism-shadow-1: 0 1px 2px rgba(25, 28, 29, 0.06),
229
+ 0 1px 1px rgba(25, 28, 29, 0.04);
230
+ --prism-shadow-2: 0 4px 12px rgba(25, 28, 29, 0.08),
231
+ 0 1px 3px rgba(25, 28, 29, 0.06);
232
+ --prism-shadow-3: 0 14px 34px rgba(25, 28, 29, 0.12),
233
+ 0 4px 10px rgba(25, 28, 29, 0.08);
234
+ --prism-shadow-float: 0 22px 52px rgba(25, 28, 29, 0.14),
235
+ 0 6px 16px rgba(25, 28, 29, 0.08);
236
+ --prism-text-dim: var(--prism-ink-muted);
237
+ --prism-surface-raised: var(--prism-elev);
238
+ --prism-surface-container: var(--prism-tile);
239
+ }
240
+
241
+ @media (prefers-color-scheme: light) {
242
+ .prism-theme[data-theme="system"],
243
+ :root[data-theme="system"],
244
+ html[data-theme="system"],
245
+ html[data-theme="system"] body,
246
+ :root[data-theme="system"] .prism-theme,
247
+ html[data-theme="system"] .prism-theme {
248
+ --prism-ink: #191c1d;
249
+ --prism-ink-muted: #5a6b76;
250
+ --prism-line: #c5d0d8;
251
+ --prism-panel: #ffffff;
252
+ --prism-panel-2: #f3f4f5;
253
+ --prism-canvas: #e8eef2;
254
+ --prism-canvas-alt: #f4f7f9;
255
+ --prism-tile: #edeeef;
256
+ --prism-elev: #ffffff;
257
+ --prism-brand: #005c55;
258
+ --prism-brand-strong: #0f766e;
259
+ --prism-on-brand: #ffffff;
260
+ --prism-node-fill: #ffffff;
261
+ --prism-node-fill-selected: color-mix(in srgb, #005c55 12%, #ffffff);
262
+ --prism-edge: color-mix(in srgb, #005c55 40%, #c5d0d8);
263
+ --prism-dark-chrome: #ffffff;
264
+ --prism-dark-ink: #191c1d;
265
+ --prism-text: #191c1d;
266
+ --prism-text-faint: #5a6b76;
267
+ --prism-surface: #f8f9fa;
268
+ --prism-border: #c5d0d8;
269
+ --prism-grid-line: rgba(90, 107, 118, 0.35);
270
+ --prism-grid-fine: rgba(90, 107, 118, 0.2);
271
+ --prism-vignette: rgba(25, 28, 29, 0.06);
272
+ --prism-shadow-inspector: 0 8px 24px rgba(25, 28, 29, 0.1);
273
+ --prism-shadow-1: 0 1px 2px rgba(25, 28, 29, 0.06),
274
+ 0 1px 1px rgba(25, 28, 29, 0.04);
275
+ --prism-shadow-2: 0 4px 12px rgba(25, 28, 29, 0.08),
276
+ 0 1px 3px rgba(25, 28, 29, 0.06);
277
+ --prism-shadow-3: 0 14px 34px rgba(25, 28, 29, 0.12),
278
+ 0 4px 10px rgba(25, 28, 29, 0.08);
279
+ --prism-shadow-float: 0 22px 52px rgba(25, 28, 29, 0.14),
280
+ 0 6px 16px rgba(25, 28, 29, 0.08);
281
+ --prism-text-dim: var(--prism-ink-muted);
282
+ --prism-surface-raised: var(--prism-elev);
283
+ --prism-surface-container: var(--prism-tile);
284
+ }
285
+ }
286
+
287
+ @media (prefers-reduced-motion: reduce) {
288
+ :root,
289
+ .prism-theme {
290
+ --prism-dur-1: 0ms;
291
+ --prism-dur-2: 0ms;
292
+ --prism-dur-3: 0ms;
293
+ --prism-dur-4: 0ms;
294
+ }
295
+ }
296
+
297
+ /**
298
+ * Prism UI form / chrome primitives.
299
+ * Consumes tokens from tokens.css — do not invent alternate palettes.
300
+ */
301
+
302
+ /* —— Shared field chrome —— */
303
+ .prism-input,
304
+ .prism-textarea,
305
+ .prism-select {
306
+ display: block;
307
+ width: 100%;
308
+ box-sizing: border-box;
309
+ margin: 0;
310
+ padding: var(--prism-space-sm) var(--prism-space-md);
311
+ border: 1px solid var(--prism-line);
312
+ border-radius: var(--prism-radius-md);
313
+ background: var(--prism-panel);
314
+ color: var(--prism-ink);
315
+ font-family: var(--prism-font);
316
+ font-size: var(--prism-type-body-sm);
317
+ line-height: var(--prism-leading-body);
318
+ outline: none;
319
+ transition:
320
+ border-color var(--prism-dur-1) var(--prism-ease),
321
+ box-shadow var(--prism-dur-1) var(--prism-ease);
322
+ }
323
+
324
+ .prism-input::placeholder,
325
+ .prism-textarea::placeholder {
326
+ color: var(--prism-ink-muted);
327
+ }
328
+
329
+ .prism-input:hover:not(:disabled),
330
+ .prism-textarea:hover:not(:disabled),
331
+ .prism-select:hover:not(:disabled) {
332
+ border-color: color-mix(in srgb, var(--prism-brand) 40%, var(--prism-line));
333
+ }
334
+
335
+ .prism-input:focus,
336
+ .prism-textarea:focus,
337
+ .prism-select:focus,
338
+ .prism-input:focus-visible,
339
+ .prism-textarea:focus-visible,
340
+ .prism-select:focus-visible {
341
+ outline: none;
342
+ outline-color: var(--prism-brand);
343
+ border-color: var(--prism-brand);
344
+ box-shadow: var(--prism-ring);
345
+ }
346
+
347
+ .prism-input:disabled,
348
+ .prism-textarea:disabled,
349
+ .prism-select:disabled {
350
+ opacity: 0.55;
351
+ cursor: not-allowed;
352
+ }
353
+
354
+ .prism-textarea {
355
+ min-height: 88px;
356
+ resize: vertical;
357
+ }
358
+
359
+ .prism-select {
360
+ appearance: none;
361
+ background-image: linear-gradient(
362
+ 45deg,
363
+ transparent 50%,
364
+ var(--prism-ink-muted) 50%
365
+ ),
366
+ linear-gradient(135deg, var(--prism-ink-muted) 50%, transparent 50%);
367
+ background-position:
368
+ calc(100% - 16px) calc(50% - 3px),
369
+ calc(100% - 11px) calc(50% - 3px);
370
+ background-size:
371
+ 5px 5px,
372
+ 5px 5px;
373
+ background-repeat: no-repeat;
374
+ padding-right: calc(var(--prism-space-md) + 16px);
375
+ cursor: pointer;
376
+ }
377
+
378
+ .prism-field {
379
+ display: flex;
380
+ flex-direction: column;
381
+ gap: var(--prism-space-xs);
382
+ }
383
+
384
+ .prism-field__label {
385
+ font-family: var(--prism-font);
386
+ font-size: var(--prism-type-label);
387
+ font-weight: 500;
388
+ letter-spacing: var(--prism-type-label-tracking);
389
+ color: var(--prism-ink-muted);
390
+ text-transform: uppercase;
391
+ }
392
+
393
+ /* —— Search —— */
394
+ .prism-search {
395
+ position: relative;
396
+ display: flex;
397
+ align-items: center;
398
+ gap: var(--prism-space-sm);
399
+ width: 100%;
400
+ box-sizing: border-box;
401
+ padding: 0 var(--prism-space-md);
402
+ border: 1px solid var(--prism-line);
403
+ border-radius: var(--prism-radius-md);
404
+ background: var(--prism-panel);
405
+ color: var(--prism-ink-muted);
406
+ transition:
407
+ border-color var(--prism-dur-1) var(--prism-ease),
408
+ box-shadow var(--prism-dur-1) var(--prism-ease),
409
+ color var(--prism-dur-1) var(--prism-ease);
410
+ }
411
+
412
+ .prism-search:focus-within {
413
+ outline: none;
414
+ border-color: var(--prism-brand);
415
+ color: var(--prism-brand);
416
+ box-shadow: var(--prism-ring);
417
+ }
418
+
419
+ .prism-search__input:focus,
420
+ .prism-search__input:focus-visible {
421
+ outline: none;
422
+ }
423
+
424
+ .prism-search__icon {
425
+ flex-shrink: 0;
426
+ display: inline-flex;
427
+ align-items: center;
428
+ justify-content: center;
429
+ }
430
+
431
+ .prism-search__input {
432
+ flex: 1;
433
+ min-width: 0;
434
+ margin: 0;
435
+ padding: var(--prism-space-sm) 0;
436
+ border: 0;
437
+ outline: 0;
438
+ background: transparent;
439
+ color: var(--prism-ink);
440
+ font-family: var(--prism-font);
441
+ font-size: var(--prism-type-body-sm);
442
+ line-height: var(--prism-leading-body);
443
+ }
444
+
445
+ .prism-search__input::placeholder {
446
+ color: var(--prism-ink-muted);
447
+ }
448
+
449
+ .prism-search__input:disabled {
450
+ opacity: 0.55;
451
+ cursor: not-allowed;
452
+ }
453
+
454
+ /* —— Toggle group (segmented control) —— */
455
+ .prism-toggle-group {
456
+ display: inline-flex;
457
+ align-items: stretch;
458
+ gap: 2px;
459
+ padding: 2px;
460
+ border: 1px solid var(--prism-line);
461
+ border-radius: var(--prism-radius-md);
462
+ background: var(--prism-panel);
463
+ }
464
+
465
+ .prism-toggle-group__btn {
466
+ display: inline-flex;
467
+ align-items: center;
468
+ justify-content: center;
469
+ margin: 0;
470
+ padding: var(--prism-space-xs) var(--prism-space-sm);
471
+ border: 0;
472
+ border-radius: calc(var(--prism-radius-md) - 2px);
473
+ background: transparent;
474
+ color: var(--prism-ink-muted);
475
+ font-family: var(--prism-font);
476
+ font-size: var(--prism-type-body-sm);
477
+ font-weight: 500;
478
+ line-height: 1.2;
479
+ cursor: pointer;
480
+ transition:
481
+ background var(--prism-dur-1) var(--prism-ease),
482
+ color var(--prism-dur-1) var(--prism-ease);
483
+ }
484
+
485
+ .prism-toggle-group__btn:hover:not(:disabled):not([data-active="true"]) {
486
+ color: var(--prism-ink);
487
+ background: color-mix(in srgb, var(--prism-ink) 6%, transparent);
488
+ }
489
+
490
+ .prism-toggle-group__btn[data-active="true"] {
491
+ color: var(--prism-ink);
492
+ background: color-mix(in srgb, var(--prism-brand) 18%, var(--prism-panel));
493
+ box-shadow: inset 0 0 0 1px
494
+ color-mix(in srgb, var(--prism-brand) 35%, transparent);
495
+ }
496
+
497
+ .prism-toggle-group__btn:focus-visible {
498
+ outline: none;
499
+ border-color: var(--prism-brand);
500
+ box-shadow: var(--prism-ring);
501
+ }
502
+
503
+ .prism-toggle-group__btn:disabled {
504
+ opacity: 0.45;
505
+ cursor: not-allowed;
506
+ }
507
+
508
+ /* —— Tabs —— */
509
+ .prism-tabs {
510
+ display: flex;
511
+ align-items: stretch;
512
+ gap: var(--prism-space-xs);
513
+ border-bottom: 1px solid var(--prism-line);
514
+ }
515
+
516
+ .prism-tabs__btn {
517
+ position: relative;
518
+ display: inline-flex;
519
+ align-items: center;
520
+ justify-content: center;
521
+ margin: 0;
522
+ padding: var(--prism-space-sm) var(--prism-space-md);
523
+ border: 0;
524
+ border-radius: 0;
525
+ background: transparent;
526
+ color: var(--prism-ink-muted);
527
+ font-family: var(--prism-font);
528
+ font-size: var(--prism-type-body-sm);
529
+ font-weight: 500;
530
+ line-height: 1.2;
531
+ cursor: pointer;
532
+ transition: color var(--prism-dur-1) var(--prism-ease);
533
+ }
534
+
535
+ .prism-tabs__btn::after {
536
+ content: "";
537
+ position: absolute;
538
+ left: var(--prism-space-sm);
539
+ right: var(--prism-space-sm);
540
+ bottom: -1px;
541
+ height: 2px;
542
+ border-radius: 1px;
543
+ background: transparent;
544
+ transition: background var(--prism-dur-1) var(--prism-ease);
545
+ }
546
+
547
+ .prism-tabs__btn:hover:not(:disabled):not([data-active="true"]) {
548
+ color: var(--prism-ink);
549
+ }
550
+
551
+ .prism-tabs__btn[data-active="true"] {
552
+ color: var(--prism-brand);
553
+ }
554
+
555
+ .prism-tabs__btn[data-active="true"]::after {
556
+ background: var(--prism-brand);
557
+ }
558
+
559
+ .prism-tabs__btn:focus-visible {
560
+ outline: none;
561
+ border-color: var(--prism-brand);
562
+ box-shadow: var(--prism-ring);
563
+ border-radius: var(--prism-radius-sm);
564
+ }
565
+
566
+ .prism-tabs__btn:disabled {
567
+ opacity: 0.45;
568
+ cursor: not-allowed;
569
+ }
570
+
571
+ /* —— Card-title icon (tone-colored) —— */
572
+ .prism-card-icon {
573
+ display: inline-flex;
574
+ align-items: center;
575
+ justify-content: center;
576
+ flex-shrink: 0;
577
+ line-height: 0;
578
+ }
579
+
580
+ /* —— Tooltip (InfoTip affordance) —— */
581
+ .prism-tooltip {
582
+ position: relative;
583
+ display: inline-flex;
584
+ align-items: center;
585
+ }
586
+
587
+ .prism-tooltip__trigger {
588
+ display: inline-flex;
589
+ align-items: center;
590
+ justify-content: center;
591
+ width: 16px;
592
+ height: 16px;
593
+ padding: 0;
594
+ border: none;
595
+ border-radius: var(--prism-radius-pill);
596
+ color: var(--prism-ink-muted);
597
+ background: transparent;
598
+ cursor: help;
599
+ transition:
600
+ color var(--prism-dur-1) var(--prism-ease),
601
+ background var(--prism-dur-1) var(--prism-ease);
602
+ }
603
+
604
+ .prism-tooltip__trigger:hover,
605
+ .prism-tooltip__trigger:focus-visible {
606
+ color: var(--prism-brand);
607
+ background: color-mix(in srgb, var(--prism-brand) 16%, transparent);
608
+ outline: none;
609
+ }
610
+
611
+ /* Rendered into a document.body portal with position:fixed; top/left are
612
+ computed in Tooltip.tsx to stay within the viewport (flip + clamp). */
613
+ .prism-tooltip__pop {
614
+ position: fixed;
615
+ z-index: 9999;
616
+ width: 240px;
617
+ max-width: calc(100vw - 16px);
618
+ display: flex;
619
+ flex-direction: column;
620
+ gap: var(--prism-space-xs);
621
+ padding: var(--prism-space-sm) var(--prism-space-md);
622
+ border-radius: var(--prism-radius-md);
623
+ border: 1px solid var(--prism-line);
624
+ background: var(--prism-elev);
625
+ box-shadow: var(--prism-shadow-3);
626
+ color: var(--prism-ink);
627
+ font-family: var(--prism-font);
628
+ font-size: var(--prism-type-body-sm);
629
+ opacity: 0;
630
+ transform: translateY(-2px);
631
+ pointer-events: none;
632
+ transition:
633
+ opacity var(--prism-dur-2) var(--prism-ease),
634
+ transform var(--prism-dur-2) var(--prism-ease);
635
+ text-transform: none;
636
+ letter-spacing: normal;
637
+ }
638
+
639
+ .prism-tooltip__pop[data-open="true"] {
640
+ opacity: 1;
641
+ transform: translateY(0);
642
+ pointer-events: auto;
643
+ }
644
+
645
+ .prism-tooltip__title {
646
+ font-size: var(--prism-type-label);
647
+ font-weight: 600;
648
+ color: var(--prism-ink);
649
+ }
650
+
651
+ .prism-tooltip__body {
652
+ font-size: var(--prism-type-label);
653
+ line-height: var(--prism-leading-body);
654
+ color: var(--prism-ink-muted);
655
+ }
656
+
657
+ .prism-tooltip__actions {
658
+ display: flex;
659
+ flex-wrap: wrap;
660
+ gap: 8px;
661
+ margin-top: 10px;
662
+ padding-top: 8px;
663
+ border-top: 1px solid var(--prism-line, #2a334a);
664
+ }
665
+
666
+ .prism-tooltip__action {
667
+ display: inline-flex;
668
+ align-items: center;
669
+ gap: 6px;
670
+ padding: 5px 10px;
671
+ border-radius: 6px;
672
+ border: 1px solid color-mix(in srgb, #00c2c2 45%, #2a334a);
673
+ background: color-mix(in srgb, #00c2c2 14%, transparent);
674
+ color: var(--prism-ink, #e2e8f0);
675
+ font: inherit;
676
+ font-size: 0.6875rem;
677
+ font-weight: 650;
678
+ cursor: pointer;
679
+ }
680
+
681
+ .prism-tooltip__action:hover:not(:disabled) {
682
+ background: color-mix(in srgb, #00c2c2 22%, transparent);
683
+ }
684
+
685
+ .prism-tooltip__action:disabled {
686
+ opacity: 0.55;
687
+ cursor: default;
688
+ }
689
+
690
+ .prism-tooltip__pop[data-interactive="true"] {
691
+ pointer-events: auto;
692
+ }
693
+
694
+ @media (prefers-reduced-motion: reduce) {
695
+ .prism-input,
696
+ .prism-textarea,
697
+ .prism-select,
698
+ .prism-search,
699
+ .prism-toggle-group__btn,
700
+ .prism-tabs__btn,
701
+ .prism-tooltip__trigger,
702
+ .prism-tooltip__pop {
703
+ transition: none;
704
+ }
705
+ }
706
+
707
+ html,body{background:var(--prism-canvas);color:var(--prism-ink);font-family:var(--prism-font,Inter,system-ui,sans-serif);min-height:100%;margin:0}#root{min-height:100vh}.hub{max-width:960px;margin:0 auto;padding:32px 24px 64px}.hub-header{display:flex;justify-content:space-between;align-items: flex-end;gap:16px;margin-bottom:28px}.hub-kicker{color:var(--prism-brand);letter-spacing:.08em;text-transform:uppercase;margin:0 0 4px;font-size:12px}.hub h1{margin:0;font-size:28px;font-weight:600}.hub-meta,.hub-error,.ov-empty{color:var(--prism-ink-muted)}.hub-error{color:var(--prism-rose)}.hub-repo{margin-top:28px}.hub-repo h2{color:var(--prism-ink-muted);margin:0 0 12px;font-size:14px;font-weight:600}.hub-list{list-style:none;display:grid;gap:12px;margin:0;padding:0}.hub-card{background:var(--prism-panel);border:1px solid var(--prism-line);border-radius:12px;padding:16px 18px}.hub-card-top{display:flex;justify-content:space-between;align-items: center;gap:12px}.hub-activity{color:var(--prism-ink-muted);margin:8px 0 0;font-size:14px}.hub-facts{display:flex;flex-wrap:wrap;gap:16px;margin:12px 0 0}.hub-facts dt{text-transform:uppercase;letter-spacing:.06em;color:var(--prism-ink-muted);font-size:11px}.hub-facts dd{margin:2px 0 0;font-size:13px}.hub-facts code{font-family:var(--prism-mono,ui-monospace,monospace);font-size:12px}.hub-pill{text-transform:capitalize;border-radius:999px;padding:2px 10px;font-size:12px}.hub-pill-brand{background:color-mix(in srgb,var(--prism-brand)18%,transparent);color:var(--prism-brand-strong)}.hub-pill-emerald{background:color-mix(in srgb,var(--prism-emerald)18%,transparent);color:var(--prism-emerald)}.hub-pill-rose{background:color-mix(in srgb,var(--prism-rose)18%,transparent);color:var(--prism-rose)}.hub-pill-amber{background:color-mix(in srgb,var(--prism-amber)18%,transparent);color:var(--prism-amber)}.hub-pill-muted{background:var(--prism-tile);color:var(--prism-ink-muted)}.hub-actions{display:flex;gap:8px;margin-top:12px}.hub-actions button{appearance:none;border:1px solid var(--prism-line);background:var(--prism-tile);color:var(--prism-ink);cursor:pointer;font:inherit;border-radius:8px;padding:6px 12px;font-size:13px}.hub-actions button:hover{border-color:var(--prism-brand)}
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Prism Jobs</title>
7
+ <link rel="stylesheet" href="/assets/hub.css" />
8
+ </head>
9
+ <body class="prism-theme">
10
+ <div id="root"></div>
11
+ <script type="module" src="/assets/app.js"></script>
12
+ </body>
13
+ </html>