@runwisp/ui 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +40 -45
- package/src/astro/CTABand.astro +19 -12
- package/src/astro/Hero.astro +3 -3
- package/src/astro/SiteFooter.astro +4 -4
- package/src/astro/SiteHeader.astro +4 -4
- package/src/lib/assets/runwisp-logo.svg +1 -8
- package/src/lib/components/AccordionItem.svelte +4 -10
- package/src/lib/components/Alert.svelte +11 -11
- package/src/lib/components/Avatar.svelte +1 -1
- package/src/lib/components/Badge.svelte +13 -13
- package/src/lib/components/Breadcrumb.svelte +3 -3
- package/src/lib/components/Button.svelte +2 -2
- package/src/lib/components/Card.svelte +4 -4
- package/src/lib/components/Checkbox.svelte +12 -10
- package/src/lib/components/CodeBlock.svelte +7 -13
- package/src/lib/components/CronInput.svelte +12 -11
- package/src/lib/components/DataGrid.svelte +14 -11
- package/src/lib/components/Drawer.svelte +9 -6
- package/src/lib/components/Dropdown.svelte +10 -14
- package/src/lib/components/DurationInput.svelte +10 -14
- package/src/lib/components/EmptyState.svelte +1 -1
- package/src/lib/components/ErrorState.svelte +4 -4
- package/src/lib/components/FeatureCard.svelte +4 -4
- package/src/lib/components/FormField.svelte +4 -6
- package/src/lib/components/Heading.svelte +4 -1
- package/src/lib/components/Input.svelte +10 -12
- package/src/lib/components/Kbd.svelte +1 -1
- package/src/lib/components/Link.svelte +2 -3
- package/src/lib/components/LinkButton.svelte +2 -2
- package/src/lib/components/LogConsole.svelte +22 -21
- package/src/lib/components/Logo.svelte +3 -1
- package/src/lib/components/Modal.svelte +9 -8
- package/src/lib/components/PageContainer.svelte +1 -1
- package/src/lib/components/PageHeader.svelte +1 -1
- package/src/lib/components/Pagination.svelte +4 -4
- package/src/lib/components/Popover.svelte +5 -7
- package/src/lib/components/Progress.svelte +6 -4
- package/src/lib/components/Prose.svelte +4 -4
- package/src/lib/components/Radio.svelte +11 -10
- package/src/lib/components/RadioGroup.svelte +3 -5
- package/src/lib/components/Select.svelte +21 -31
- package/src/lib/components/Separator.svelte +4 -1
- package/src/lib/components/Skeleton.svelte +6 -6
- package/src/lib/components/StatusIndicator.svelte +7 -15
- package/src/lib/components/Table.svelte +1 -1
- package/src/lib/components/TableCell.svelte +1 -1
- package/src/lib/components/TableRow.svelte +1 -5
- package/src/lib/components/Tabs.svelte +10 -11
- package/src/lib/components/TaskCard.svelte +7 -4
- package/src/lib/components/Textarea.svelte +10 -11
- package/src/lib/components/ThemeToggle.svelte +1 -1
- package/src/lib/components/ToastContainer.svelte +3 -3
- package/src/lib/components/Toggle.svelte +2 -3
- package/src/lib/components/Tooltip.svelte +8 -9
- package/src/lib/components/button-styles.ts +17 -18
- package/src/lib/components/dashboard/RunDetailPanel.svelte +47 -43
- package/src/lib/components/dashboard/RunFilterPopover.svelte +17 -11
- package/src/lib/components/dashboard/RunsList.svelte +26 -21
- package/src/lib/theme-tokens.css +179 -114
- package/src/lib/theme.css +49 -35
|
@@ -382,7 +382,7 @@
|
|
|
382
382
|
<div
|
|
383
383
|
class={flush
|
|
384
384
|
? "flex h-full w-full flex-col overflow-hidden border-b border-outline bg-surface md:w-[300px] md:shrink-0 md:border-r md:border-b-0"
|
|
385
|
-
: "flex flex-col overflow-hidden rounded-
|
|
385
|
+
: "flex flex-col overflow-hidden rounded-[4px] border border-outline bg-surface-raised shadow-sm md:col-span-4 lg:col-span-3"}
|
|
386
386
|
>
|
|
387
387
|
<div
|
|
388
388
|
class="flex shrink-0 items-center gap-2 border-b px-3 py-2 {hasSelection
|
|
@@ -408,7 +408,7 @@
|
|
|
408
408
|
{/if}
|
|
409
409
|
|
|
410
410
|
{#if hasSelection}
|
|
411
|
-
<span class="text-xs font-medium text-on-surface">
|
|
411
|
+
<span class="font-mono text-xs font-medium text-on-surface tabular-nums">
|
|
412
412
|
{selectionCount} selected
|
|
413
413
|
</span>
|
|
414
414
|
<div class="ml-auto flex items-center gap-1">
|
|
@@ -451,10 +451,14 @@
|
|
|
451
451
|
{/if}
|
|
452
452
|
</div>
|
|
453
453
|
{:else}
|
|
454
|
-
<span
|
|
454
|
+
<span
|
|
455
|
+
class="shrink-0 font-mono text-xs font-semibold tracking-[0.14em] whitespace-nowrap text-on-surface-muted uppercase"
|
|
456
|
+
>
|
|
455
457
|
{headerLabel}
|
|
456
458
|
</span>
|
|
457
|
-
<span
|
|
459
|
+
<span
|
|
460
|
+
class="shrink-0 font-mono text-xs whitespace-nowrap text-on-surface-faint tabular-nums"
|
|
461
|
+
>
|
|
458
462
|
{#if outputSearchActive}
|
|
459
463
|
{matchedRuns.length} of {items.length}
|
|
460
464
|
{:else}
|
|
@@ -464,7 +468,7 @@
|
|
|
464
468
|
</span>
|
|
465
469
|
<div class="ml-auto flex items-center gap-1">
|
|
466
470
|
{#if showFilters}
|
|
467
|
-
<RunFilterPopover bind:filters {showTask} {tasks} />
|
|
471
|
+
<RunFilterPopover bind:filters {showTask} {tasks} compact={flush} />
|
|
468
472
|
{/if}
|
|
469
473
|
<Button
|
|
470
474
|
variant="ghost"
|
|
@@ -495,13 +499,13 @@
|
|
|
495
499
|
>
|
|
496
500
|
{#each filterChips as chip (chip.dimension)}
|
|
497
501
|
<span
|
|
498
|
-
class="inline-flex items-center gap-1 rounded-
|
|
502
|
+
class="inline-flex items-center gap-1 rounded-[3px] border border-primary-soft-border bg-primary-soft py-0.5 pr-1 pl-2 font-mono text-2xs font-medium text-primary-soft-text"
|
|
499
503
|
>
|
|
500
504
|
{chip.label}
|
|
501
505
|
<button
|
|
502
506
|
type="button"
|
|
503
507
|
onclick={() => removeChip(chip.dimension)}
|
|
504
|
-
class="flex size-3.5 items-center justify-center rounded-
|
|
508
|
+
class="flex size-3.5 items-center justify-center rounded-[3px] text-primary-soft-text/70 hover:bg-primary/15 hover:text-primary-soft-text"
|
|
505
509
|
aria-label="Remove {chip.label} filter"
|
|
506
510
|
>
|
|
507
511
|
<X size={11} />
|
|
@@ -519,7 +523,7 @@
|
|
|
519
523
|
<!-- Searching: shimmer placeholders shaped like result rows. -->
|
|
520
524
|
<div class="flex flex-col gap-0.5" aria-busy="true" aria-label="Searching output">
|
|
521
525
|
{#each [0, 1, 2, 3, 4] as i (i)}
|
|
522
|
-
<div class="flex items-center gap-2.5 rounded-[
|
|
526
|
+
<div class="flex items-center gap-2.5 rounded-[3px] px-3 py-2.5">
|
|
523
527
|
<span
|
|
524
528
|
class="size-[9px] shrink-0 animate-pulse rounded-full bg-surface-sunken"
|
|
525
529
|
></span>
|
|
@@ -535,7 +539,7 @@
|
|
|
535
539
|
{:else if matchedRuns.length === 0}
|
|
536
540
|
<div class="px-4 py-8 text-center text-xs leading-relaxed text-on-surface-muted">
|
|
537
541
|
No output matches
|
|
538
|
-
<b class="text-on-surface">“{outputQuery.trim()}”</b>.<br />
|
|
542
|
+
<b class="font-mono text-on-surface">“{outputQuery.trim()}”</b>.<br />
|
|
539
543
|
Try a different term.
|
|
540
544
|
</div>
|
|
541
545
|
{:else}
|
|
@@ -601,7 +605,7 @@
|
|
|
601
605
|
: ''} {bulkActions
|
|
602
606
|
? selectionActive
|
|
603
607
|
? 'opacity-0'
|
|
604
|
-
: '
|
|
608
|
+
: 'group-hover/row:opacity-0'
|
|
605
609
|
: ''}"
|
|
606
610
|
aria-hidden="true"
|
|
607
611
|
></span>
|
|
@@ -623,7 +627,7 @@
|
|
|
623
627
|
onchange={() => toggleRow(run.id)}
|
|
624
628
|
onclick={(e) => e.stopPropagation()}
|
|
625
629
|
aria-label={`Select run from ${formatDateTime(run.start_at ?? run.created_at)}`}
|
|
626
|
-
class="size-3.5 cursor-pointer rounded border-outline accent-primary opacity-0
|
|
630
|
+
class="size-3.5 cursor-pointer rounded border-outline accent-primary opacity-0 {selectionActive
|
|
627
631
|
? 'opacity-100'
|
|
628
632
|
: 'group-hover/row:opacity-100'}"
|
|
629
633
|
/>
|
|
@@ -639,11 +643,11 @@
|
|
|
639
643
|
{@const retry = runRetryLabel(run)}
|
|
640
644
|
{@const suffix = instanceSuffix(run.instance_index, getInstanceCount(run.task_name))}
|
|
641
645
|
<button
|
|
642
|
-
class="btn-scale group relative w-full rounded-[
|
|
646
|
+
class="btn-scale group relative w-full rounded-[3px] border text-left select-none {showTaskName
|
|
643
647
|
? 'p-3'
|
|
644
648
|
: 'px-3 py-[11px]'} {isActive
|
|
645
649
|
? 'border-outline bg-surface-raised shadow-sm'
|
|
646
|
-
: 'border-transparent hover:bg-surface-sunken'}"
|
|
650
|
+
: 'border-transparent hover:border-outline-hover hover:bg-surface-sunken'}"
|
|
647
651
|
onclick={() => selectRun(run.id)}
|
|
648
652
|
onkeydown={(e) => e.key === "Enter" && selectRun(run.id)}
|
|
649
653
|
>
|
|
@@ -655,18 +659,19 @@
|
|
|
655
659
|
{@render statusDot(config.color, running)}
|
|
656
660
|
<span class="flex min-w-0 flex-1 flex-col gap-0.5">
|
|
657
661
|
<span class="flex items-center gap-1.5">
|
|
658
|
-
<span class="truncate text-[13px] font-semibold text-on-surface">
|
|
662
|
+
<span class="truncate font-mono text-[13px] font-semibold text-on-surface">
|
|
659
663
|
{run.task_name}{#if suffix}<span class="text-on-surface-muted"
|
|
660
664
|
>{suffix}</span
|
|
661
665
|
>{/if}
|
|
662
666
|
</span>
|
|
663
667
|
<span class="shrink-0 text-on-surface-faint">·</span>
|
|
664
|
-
<span
|
|
668
|
+
<span
|
|
669
|
+
class="shrink-0 font-mono text-[12px] font-semibold capitalize {config.color}"
|
|
665
670
|
>{dstatus}</span
|
|
666
671
|
>
|
|
667
672
|
</span>
|
|
668
673
|
<span
|
|
669
|
-
class="flex min-w-0 items-center gap-1.5 text-2xs text-on-surface-faint"
|
|
674
|
+
class="flex min-w-0 items-center gap-1.5 font-mono text-2xs text-on-surface-faint"
|
|
670
675
|
title={formatFullDateTime(startedAt)}
|
|
671
676
|
>
|
|
672
677
|
<span class="truncate">{formatDateTime(startedAt)}</span>
|
|
@@ -695,13 +700,13 @@
|
|
|
695
700
|
{@render statusDot(config.color, running)}
|
|
696
701
|
<span class="flex min-w-0 flex-1 items-center gap-1.5 truncate">
|
|
697
702
|
<span
|
|
698
|
-
class="text-[12.5px] font-semibold tracking-tight text-on-surface"
|
|
703
|
+
class="font-mono text-[12.5px] font-semibold tracking-tight text-on-surface tabular-nums"
|
|
699
704
|
title={formatFullDateTime(startedAt)}
|
|
700
705
|
>
|
|
701
706
|
{formatTimeHM(startedAt)} · {formatDayMonth(startedAt)}
|
|
702
707
|
</span>
|
|
703
708
|
<span class="text-on-surface-faint">·</span>
|
|
704
|
-
<span class="text-[12.5px] font-semibold capitalize {config.color}"
|
|
709
|
+
<span class="font-mono text-[12.5px] font-semibold capitalize {config.color}"
|
|
705
710
|
>{dstatus}</span
|
|
706
711
|
>
|
|
707
712
|
{#if suffix}
|
|
@@ -718,10 +723,10 @@
|
|
|
718
723
|
{#if match}
|
|
719
724
|
{@const hl = highlightParts(match.text, outputQuery)}
|
|
720
725
|
<div
|
|
721
|
-
class="mt-1.5 truncate rounded-
|
|
726
|
+
class="mt-1.5 truncate rounded-[3px] border border-outline-faint bg-surface-sunken px-2 py-1 font-mono text-2xs text-on-surface-muted"
|
|
722
727
|
>
|
|
723
728
|
{hl.before}<mark
|
|
724
|
-
class="rounded-
|
|
729
|
+
class="rounded-[3px] bg-primary-soft px-0.5 text-primary-soft-text"
|
|
725
730
|
>{hl.match}</mark
|
|
726
731
|
>{hl.after}
|
|
727
732
|
</div>
|
|
@@ -729,7 +734,7 @@
|
|
|
729
734
|
{/if}
|
|
730
735
|
|
|
731
736
|
<div
|
|
732
|
-
class="
|
|
737
|
+
class="absolute inset-y-2 left-[-6px] w-[3px] rounded-[3px] {spine} {isActive
|
|
733
738
|
? 'opacity-100'
|
|
734
739
|
: 'opacity-0'}"
|
|
735
740
|
aria-hidden="true"
|
package/src/lib/theme-tokens.css
CHANGED
|
@@ -17,8 +17,26 @@
|
|
|
17
17
|
* - apps/ui toggles the `.dark` class on <html>.
|
|
18
18
|
* - Starlight (apps/docs) writes data-theme="dark" on the documentElement.
|
|
19
19
|
* The union selector covers both. Light mode is the default.
|
|
20
|
+
*
|
|
21
|
+
* Webfonts are @imported here (not in theme.css) so every consumer that reads
|
|
22
|
+
* these tokens also gets the faces they name — apps/docs imports this file
|
|
23
|
+
* alone. Both families ship in the binary; nothing is fetched from a CDN.
|
|
20
24
|
*/
|
|
21
25
|
|
|
26
|
+
@import "@fontsource/tasa-orbiter/400.css";
|
|
27
|
+
@import "@fontsource/tasa-orbiter/500.css";
|
|
28
|
+
@import "@fontsource/tasa-orbiter/600.css";
|
|
29
|
+
@import "@fontsource/tasa-orbiter/700.css";
|
|
30
|
+
@import "@fontsource-variable/geist-mono/index.css";
|
|
31
|
+
|
|
32
|
+
:root {
|
|
33
|
+
/* Typography — body sans for prose, mono for all chrome and identifiers.
|
|
34
|
+
* Geist Mono is variable (100–900), so heading weight 800 is a real cut. */
|
|
35
|
+
--rw-font-sans: "TASA Orbiter", system-ui, -apple-system, sans-serif;
|
|
36
|
+
--rw-font-mono:
|
|
37
|
+
"Geist Mono Variable", "Geist Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
38
|
+
}
|
|
39
|
+
|
|
22
40
|
:root {
|
|
23
41
|
/* Primary — Wisp Teal (brand = #0E7C86, the artifact's deep teal). Deeper
|
|
24
42
|
* and less cyan than Aurora (running/info) so the two stay distinct. */
|
|
@@ -46,20 +64,21 @@
|
|
|
46
64
|
--rw-color-aurora-800: oklch(0.35 0.07 192);
|
|
47
65
|
--rw-color-aurora-900: oklch(0.28 0.055 192);
|
|
48
66
|
|
|
49
|
-
/* Mist —
|
|
50
|
-
* #
|
|
51
|
-
*
|
|
52
|
-
|
|
53
|
-
--rw-color-mist-
|
|
54
|
-
--rw-color-mist-
|
|
55
|
-
--rw-color-mist-
|
|
56
|
-
--rw-color-mist-
|
|
57
|
-
--rw-color-mist-
|
|
58
|
-
--rw-color-mist-
|
|
59
|
-
--rw-color-mist-
|
|
60
|
-
--rw-color-mist-
|
|
61
|
-
--rw-color-mist-
|
|
62
|
-
--rw-color-mist-
|
|
67
|
+
/* Mist — teal-gray neutrals (the runbook's #F3F6F6 / #E0E7E7 /
|
|
68
|
+
* #14262A / #0C1719 family). No purple tint; hue ~195-205, low chroma,
|
|
69
|
+
* so bg-mist-* utilities agree with the new teal-black surfaces. The light
|
|
70
|
+
* end stays near-neutral to match the desaturated canvas. */
|
|
71
|
+
--rw-color-mist-50: oklch(0.972 0.003 200); /* ≈ #F3F6F6 */
|
|
72
|
+
--rw-color-mist-100: oklch(0.945 0.004 200); /* ≈ #E9EEEE */
|
|
73
|
+
--rw-color-mist-200: oklch(0.925 0.005 200); /* ≈ #E0E7E7 */
|
|
74
|
+
--rw-color-mist-300: oklch(0.83 0.016 198);
|
|
75
|
+
--rw-color-mist-400: oklch(0.676 0.02 200);
|
|
76
|
+
--rw-color-mist-500: oklch(0.6 0.022 200);
|
|
77
|
+
--rw-color-mist-600: oklch(0.531 0.024 202);
|
|
78
|
+
--rw-color-mist-700: oklch(0.42 0.024 203);
|
|
79
|
+
--rw-color-mist-800: oklch(0.32 0.024 204);
|
|
80
|
+
--rw-color-mist-900: oklch(0.266 0.025 204); /* ≈ #16292B */
|
|
81
|
+
--rw-color-mist-950: oklch(0.195 0.016 208); /* ≈ #0C1719 */
|
|
63
82
|
|
|
64
83
|
/* Success — Field Green (success status = #1F9D57, a true grass green) */
|
|
65
84
|
--rw-color-success-50: oklch(0.97 0.02 150);
|
|
@@ -112,8 +131,11 @@
|
|
|
112
131
|
--rw-ansi-bright-cyan: var(--rw-color-aurora-300);
|
|
113
132
|
--rw-ansi-bright-white: var(--rw-color-mist-50);
|
|
114
133
|
|
|
115
|
-
/*
|
|
116
|
-
*
|
|
134
|
+
/* Fixed-dark sibling palettes — the `--rw-con-*` log console (a "black box"
|
|
135
|
+
* device) and the `--rw-term-*`/`--rw-syn-*` website terminal surfaces both
|
|
136
|
+
* keep their own dark palette in BOTH themes; they never flip light/dark. */
|
|
137
|
+
|
|
138
|
+
/* Console device surface — the log console instrument.
|
|
117
139
|
* Exact values from the approved execution-detail design. */
|
|
118
140
|
--rw-con-bg: #0e141b; /* body / gutter backing */
|
|
119
141
|
--rw-con-panel: #11181f; /* toolbar + footer chrome */
|
|
@@ -121,62 +143,97 @@
|
|
|
121
143
|
--rw-con-dim: #6c7d8c; /* footer + muted readouts */
|
|
122
144
|
--rw-con-gutter: #3c4a58; /* line numbers + sentinel rule */
|
|
123
145
|
|
|
124
|
-
/*
|
|
146
|
+
/* Terminal surface — always dark in both themes (website --term-* set) */
|
|
147
|
+
--rw-term: #0a1116;
|
|
148
|
+
--rw-term-2: #0d151b;
|
|
149
|
+
--rw-term-line: #1d2932;
|
|
150
|
+
--rw-term-line-2: #2a3a45;
|
|
151
|
+
--rw-term-text: #dbe6ec;
|
|
152
|
+
--rw-term-muted: #7d919c;
|
|
153
|
+
--rw-term-faint: #566873;
|
|
154
|
+
--rw-term-teal: #2fd4dd;
|
|
155
|
+
--rw-term-ok: #3fc26b;
|
|
156
|
+
--rw-term-warn: #e0a52e;
|
|
157
|
+
--rw-term-bad: #f15a4d;
|
|
158
|
+
/* Syntax highlighting */
|
|
159
|
+
--rw-syn-comment: #5b6b75;
|
|
160
|
+
--rw-syn-kw: #79c7ff;
|
|
161
|
+
--rw-syn-str: #7fd6a0;
|
|
162
|
+
--rw-syn-num: #e0a52e;
|
|
163
|
+
--rw-syn-punc: #9aa7b0;
|
|
164
|
+
--rw-syn-fn: #2fd4dd;
|
|
165
|
+
|
|
166
|
+
/* Elevation — light-mode drop shadows; flipped to `none` in dark so the
|
|
167
|
+
* UI reads as borders-only there. */
|
|
168
|
+
--rw-shadow-xs: 0 1px 2px rgba(16, 41, 43, 0.04);
|
|
169
|
+
--rw-shadow-sm: 0 1px 2px rgba(16, 41, 43, 0.04), 0 12px 28px -20px rgba(16, 41, 43, 0.22);
|
|
170
|
+
--rw-shadow-md: 0 1px 2px rgba(16, 41, 43, 0.06), 0 22px 44px -26px rgba(16, 41, 43, 0.4);
|
|
171
|
+
--rw-shadow-lg: 0 1px 2px rgba(16, 41, 43, 0.06), 0 30px 60px -28px rgba(16, 41, 43, 0.45);
|
|
172
|
+
--rw-shadow-xl: 0 1px 2px rgba(16, 41, 43, 0.06), 0 40px 80px -30px rgba(16, 41, 43, 0.5);
|
|
173
|
+
|
|
174
|
+
/* Light-mode semantic tokens (default) — runbook palette (exact hex).
|
|
175
|
+
*
|
|
176
|
+
* The canvas carries only a whisper of the brand teal. The website can
|
|
177
|
+
* afford a minty `--ground` because dark panes and terminals cover most
|
|
178
|
+
* of it; in a dashboard the canvas is most of the pixels, and a saturated
|
|
179
|
+
* mint under white panels reads washed-out. Structure comes from the
|
|
180
|
+
* hairline outlines, not from tinting the page. */
|
|
125
181
|
/* Surfaces */
|
|
126
|
-
--rw-surface:
|
|
127
|
-
--rw-surface-raised:
|
|
128
|
-
--rw-surface-
|
|
129
|
-
--rw-surface-
|
|
182
|
+
--rw-surface: #f3f6f6;
|
|
183
|
+
--rw-surface-raised: #ffffff;
|
|
184
|
+
--rw-surface-sunken: #e9eeee;
|
|
185
|
+
--rw-surface-overlay: #ffffff;
|
|
130
186
|
/* On-surface text */
|
|
131
|
-
--rw-on-surface:
|
|
132
|
-
--rw-on-surface-muted:
|
|
133
|
-
--rw-on-surface-faint:
|
|
187
|
+
--rw-on-surface: #14262a;
|
|
188
|
+
--rw-on-surface-muted: #5a6d70;
|
|
189
|
+
--rw-on-surface-faint: #869798;
|
|
134
190
|
/* Borders / outlines */
|
|
135
|
-
--rw-outline:
|
|
136
|
-
--rw-outline-hover:
|
|
137
|
-
--rw-outline-faint:
|
|
138
|
-
--rw-ring:
|
|
139
|
-
--rw-backdrop:
|
|
191
|
+
--rw-outline: #e0e7e7;
|
|
192
|
+
--rw-outline-hover: #c8d2d2;
|
|
193
|
+
--rw-outline-faint: #edf1f1;
|
|
194
|
+
--rw-ring: #15a0a8;
|
|
195
|
+
--rw-backdrop: rgba(243, 246, 246, 0.78);
|
|
140
196
|
/* Primary */
|
|
141
|
-
--rw-primary:
|
|
142
|
-
--rw-primary-hover:
|
|
143
|
-
--rw-primary-active:
|
|
144
|
-
--rw-on-primary:
|
|
145
|
-
--rw-primary-soft:
|
|
146
|
-
--rw-primary-soft-text:
|
|
147
|
-
|
|
148
|
-
--rw-danger: var(--rw-color-danger-600);
|
|
149
|
-
--rw-danger-hover: var(--rw-color-danger-700);
|
|
150
|
-
--rw-danger-active: var(--rw-color-danger-800);
|
|
151
|
-
--rw-on-danger: white;
|
|
152
|
-
--rw-danger-soft: var(--rw-color-danger-50);
|
|
153
|
-
--rw-danger-soft-text: var(--rw-color-danger-700);
|
|
197
|
+
--rw-primary: #15a0a8;
|
|
198
|
+
--rw-primary-hover: #0e7c86;
|
|
199
|
+
--rw-primary-active: #0a6068;
|
|
200
|
+
--rw-on-primary: #ffffff;
|
|
201
|
+
--rw-primary-soft: rgba(21, 160, 168, 0.1);
|
|
202
|
+
--rw-primary-soft-text: #15a0a8;
|
|
203
|
+
--rw-primary-soft-border: rgba(21, 160, 168, 0.25);
|
|
154
204
|
/* Success */
|
|
155
|
-
--rw-success:
|
|
156
|
-
--rw-success-hover:
|
|
157
|
-
--rw-
|
|
158
|
-
--rw-success
|
|
159
|
-
--rw-success-soft
|
|
205
|
+
--rw-success: #1e8a4a;
|
|
206
|
+
--rw-success-hover: #1a753e;
|
|
207
|
+
--rw-success-active: #156033;
|
|
208
|
+
--rw-on-success: #ffffff;
|
|
209
|
+
--rw-success-soft: rgba(30, 138, 74, 0.1);
|
|
210
|
+
--rw-success-soft-text: #1e8a4a;
|
|
211
|
+
--rw-success-soft-border: rgba(30, 138, 74, 0.25);
|
|
212
|
+
/* Danger */
|
|
213
|
+
--rw-danger: #d6453d;
|
|
214
|
+
--rw-danger-hover: #b8352b;
|
|
215
|
+
--rw-danger-active: #9a2a22;
|
|
216
|
+
--rw-on-danger: #ffffff;
|
|
217
|
+
--rw-danger-soft: rgba(214, 69, 61, 0.1);
|
|
218
|
+
--rw-danger-soft-text: #d6453d;
|
|
219
|
+
--rw-danger-soft-border: rgba(214, 69, 61, 0.25);
|
|
160
220
|
/* Warning */
|
|
161
|
-
--rw-warning:
|
|
162
|
-
--rw-warning-hover:
|
|
163
|
-
--rw-
|
|
164
|
-
--rw-warning
|
|
165
|
-
--rw-warning-soft
|
|
166
|
-
|
|
167
|
-
--rw-
|
|
168
|
-
|
|
169
|
-
--rw-
|
|
170
|
-
--rw-info-
|
|
171
|
-
--rw-info
|
|
172
|
-
|
|
173
|
-
--rw-
|
|
174
|
-
--rw-
|
|
175
|
-
--rw-success-soft-border: var(--rw-color-success-200);
|
|
176
|
-
--rw-warning-soft-border: var(--rw-color-warning-200);
|
|
177
|
-
--rw-info-soft-border: var(--rw-color-aurora-200);
|
|
221
|
+
--rw-warning: #c4781a;
|
|
222
|
+
--rw-warning-hover: #a36414;
|
|
223
|
+
--rw-warning-active: #82500f;
|
|
224
|
+
--rw-on-warning: #ffffff;
|
|
225
|
+
--rw-warning-soft: rgba(196, 120, 26, 0.1);
|
|
226
|
+
--rw-warning-soft-text: #c4781a;
|
|
227
|
+
--rw-warning-soft-border: rgba(196, 120, 26, 0.25);
|
|
228
|
+
/* Info — matches primary teal */
|
|
229
|
+
--rw-info: #15a0a8;
|
|
230
|
+
--rw-info-hover: #0e7c86;
|
|
231
|
+
--rw-on-info: #ffffff;
|
|
232
|
+
--rw-info-soft: rgba(21, 160, 168, 0.1);
|
|
233
|
+
--rw-info-soft-text: #15a0a8;
|
|
234
|
+
--rw-info-soft-border: rgba(21, 160, 168, 0.25);
|
|
178
235
|
/* Glass */
|
|
179
|
-
--rw-glass:
|
|
236
|
+
--rw-glass: rgba(255, 255, 255, 0.78);
|
|
180
237
|
--rw-glass-blur: blur(12px);
|
|
181
238
|
}
|
|
182
239
|
|
|
@@ -184,58 +241,66 @@
|
|
|
184
241
|
* attribute for Starlight. Both selectors apply the same token set. */
|
|
185
242
|
:root.dark,
|
|
186
243
|
:root[data-theme="dark"] {
|
|
187
|
-
|
|
188
|
-
--rw-surface
|
|
189
|
-
--rw-surface-
|
|
190
|
-
--rw-surface-sunken:
|
|
191
|
-
--rw-
|
|
192
|
-
|
|
193
|
-
--rw-on-surface
|
|
194
|
-
--rw-
|
|
195
|
-
--rw-
|
|
196
|
-
|
|
197
|
-
--rw-
|
|
198
|
-
--rw-
|
|
199
|
-
|
|
200
|
-
--rw-
|
|
201
|
-
--rw-
|
|
202
|
-
|
|
203
|
-
--rw-
|
|
204
|
-
--rw-primary-
|
|
205
|
-
--rw-primary-
|
|
206
|
-
|
|
207
|
-
--rw-
|
|
208
|
-
--rw-
|
|
209
|
-
--rw-
|
|
210
|
-
--rw-on-danger: white;
|
|
211
|
-
--rw-danger-soft: oklch(0.2 0.04 355);
|
|
212
|
-
--rw-danger-soft-text: var(--rw-color-danger-300);
|
|
244
|
+
/* Surfaces */
|
|
245
|
+
--rw-surface: #0c1719;
|
|
246
|
+
--rw-surface-raised: #122226;
|
|
247
|
+
--rw-surface-sunken: #080f11;
|
|
248
|
+
--rw-surface-overlay: rgba(8, 15, 17, 0.86);
|
|
249
|
+
/* On-surface text */
|
|
250
|
+
--rw-on-surface: #e8eff4;
|
|
251
|
+
--rw-on-surface-muted: #94a6b1;
|
|
252
|
+
--rw-on-surface-faint: #5f7079;
|
|
253
|
+
/* Borders / outlines */
|
|
254
|
+
--rw-outline: #1d2932;
|
|
255
|
+
--rw-outline-hover: #2a3a45;
|
|
256
|
+
--rw-outline-faint: #1d2932;
|
|
257
|
+
--rw-ring: #2fd4dd;
|
|
258
|
+
--rw-backdrop: rgba(4, 10, 12, 0.7);
|
|
259
|
+
/* Primary — bright teal in dark, matches info */
|
|
260
|
+
--rw-primary: #2fd4dd;
|
|
261
|
+
--rw-primary-hover: #5fe3ea;
|
|
262
|
+
--rw-primary-active: #5fe3ea;
|
|
263
|
+
--rw-on-primary: #04181a;
|
|
264
|
+
--rw-primary-soft: rgba(21, 160, 168, 0.14);
|
|
265
|
+
--rw-primary-soft-text: #2fd4dd;
|
|
266
|
+
--rw-primary-soft-border: rgba(47, 212, 221, 0.28);
|
|
213
267
|
/* Success */
|
|
214
|
-
--rw-success:
|
|
215
|
-
--rw-success-hover:
|
|
216
|
-
--rw-on-success:
|
|
217
|
-
--rw-success-soft:
|
|
218
|
-
--rw-success-soft-text:
|
|
268
|
+
--rw-success: #3fc26b;
|
|
269
|
+
--rw-success-hover: #5fd487;
|
|
270
|
+
--rw-on-success: #04181a;
|
|
271
|
+
--rw-success-soft: rgba(63, 194, 107, 0.14);
|
|
272
|
+
--rw-success-soft-text: #3fc26b;
|
|
273
|
+
--rw-success-soft-border: rgba(63, 194, 107, 0.28);
|
|
274
|
+
/* Danger */
|
|
275
|
+
--rw-danger: #f15a4d;
|
|
276
|
+
--rw-danger-hover: #ff7568;
|
|
277
|
+
--rw-danger-active: #ff8a7e;
|
|
278
|
+
--rw-on-danger: #04181a;
|
|
279
|
+
--rw-danger-soft: rgba(241, 90, 77, 0.14);
|
|
280
|
+
--rw-danger-soft-text: #f15a4d;
|
|
281
|
+
--rw-danger-soft-border: rgba(241, 90, 77, 0.28);
|
|
219
282
|
/* Warning */
|
|
220
|
-
--rw-warning:
|
|
221
|
-
--rw-warning-hover:
|
|
222
|
-
--rw-on-warning:
|
|
223
|
-
--rw-warning-soft:
|
|
224
|
-
--rw-warning-soft-text:
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
--rw-info
|
|
228
|
-
--rw-
|
|
229
|
-
--rw-info
|
|
230
|
-
--rw-info-soft
|
|
231
|
-
|
|
232
|
-
--rw-
|
|
233
|
-
--rw-danger-soft-border: oklch(0.32 0.06 355);
|
|
234
|
-
--rw-success-soft-border: oklch(0.32 0.06 165);
|
|
235
|
-
--rw-warning-soft-border: oklch(0.32 0.06 85);
|
|
236
|
-
--rw-info-soft-border: oklch(0.32 0.06 180);
|
|
283
|
+
--rw-warning: #e0a52e;
|
|
284
|
+
--rw-warning-hover: #ecb845;
|
|
285
|
+
--rw-on-warning: #04181a;
|
|
286
|
+
--rw-warning-soft: rgba(224, 165, 46, 0.14);
|
|
287
|
+
--rw-warning-soft-text: #e0a52e;
|
|
288
|
+
--rw-warning-soft-border: rgba(224, 165, 46, 0.28);
|
|
289
|
+
/* Info — bright teal in dark */
|
|
290
|
+
--rw-info: #2fd4dd;
|
|
291
|
+
--rw-info-hover: #5fe3ea;
|
|
292
|
+
--rw-on-info: #04181a;
|
|
293
|
+
--rw-info-soft: rgba(47, 212, 221, 0.14);
|
|
294
|
+
--rw-info-soft-text: #2fd4dd;
|
|
295
|
+
--rw-info-soft-border: rgba(47, 212, 221, 0.28);
|
|
237
296
|
/* Glass */
|
|
238
|
-
--rw-glass:
|
|
297
|
+
--rw-glass: rgba(8, 15, 17, 0.9);
|
|
298
|
+
/* Elevation — borders-only in dark, no drop shadow */
|
|
299
|
+
--rw-shadow-xs: none;
|
|
300
|
+
--rw-shadow-sm: none;
|
|
301
|
+
--rw-shadow-md: none;
|
|
302
|
+
--rw-shadow-lg: none;
|
|
303
|
+
--rw-shadow-xl: none;
|
|
239
304
|
}
|
|
240
305
|
|
|
241
306
|
/* Platform polish — focus ring, text selection, scrollbar. Lifted from
|
package/src/lib/theme.css
CHANGED
|
@@ -14,10 +14,6 @@
|
|
|
14
14
|
|
|
15
15
|
@import "tailwindcss";
|
|
16
16
|
@import "./theme-tokens.css";
|
|
17
|
-
@import "@fontsource/tasa-orbiter/400.css";
|
|
18
|
-
@import "@fontsource/tasa-orbiter/500.css";
|
|
19
|
-
@import "@fontsource/tasa-orbiter/600.css";
|
|
20
|
-
@import "@fontsource/tasa-orbiter/700.css";
|
|
21
17
|
|
|
22
18
|
@plugin "@tailwindcss/forms";
|
|
23
19
|
@plugin "@tailwindcss/typography";
|
|
@@ -87,9 +83,10 @@
|
|
|
87
83
|
--color-warning-600: var(--rw-color-warning-600);
|
|
88
84
|
--color-warning-700: var(--rw-color-warning-700);
|
|
89
85
|
|
|
90
|
-
/* Typography
|
|
91
|
-
|
|
92
|
-
--font-
|
|
86
|
+
/* Typography — stacks and @font-face live in theme-tokens.css so the
|
|
87
|
+
* non-Tailwind consumers (apps/docs) share one definition. */
|
|
88
|
+
--font-sans: var(--rw-font-sans);
|
|
89
|
+
--font-mono: var(--rw-font-mono);
|
|
93
90
|
|
|
94
91
|
/* Font sizes */
|
|
95
92
|
--text-2xs: 0.625rem;
|
|
@@ -125,31 +122,24 @@
|
|
|
125
122
|
--spacing-20: 5rem;
|
|
126
123
|
--spacing-24: 6rem;
|
|
127
124
|
|
|
128
|
-
/* Border radius
|
|
125
|
+
/* Border radius — runbook scale (small radii are signature). lg/xl/2xl/3xl
|
|
126
|
+
* remain for legacy call sites but should not be used going forward. */
|
|
129
127
|
--radius-none: 0;
|
|
130
|
-
--radius-sm: 0.
|
|
131
|
-
--radius-md: 0.
|
|
128
|
+
--radius-sm: 0.1875rem; /* 3px — controls */
|
|
129
|
+
--radius-md: 0.25rem; /* 4px — panels / cards */
|
|
132
130
|
--radius-lg: 0.5rem;
|
|
133
131
|
--radius-xl: 0.75rem;
|
|
134
132
|
--radius-2xl: 1rem;
|
|
135
133
|
--radius-3xl: 1.5rem;
|
|
136
134
|
--radius-full: 9999px;
|
|
137
135
|
|
|
138
|
-
/* Shadows —
|
|
139
|
-
|
|
140
|
-
--shadow-
|
|
141
|
-
|
|
142
|
-
--shadow-md:
|
|
143
|
-
|
|
144
|
-
--shadow-
|
|
145
|
-
0 10px 15px -3px oklch(0.18 0.02 280 / 0.08), 0 4px 6px -4px oklch(0.18 0.02 280 / 0.08);
|
|
146
|
-
--shadow-xl:
|
|
147
|
-
0 20px 25px -5px oklch(0.18 0.02 280 / 0.1), 0 8px 10px -6px oklch(0.18 0.02 280 / 0.1);
|
|
148
|
-
|
|
149
|
-
/* Glow effects for wisp theme */
|
|
150
|
-
--shadow-glow-sm: 0 0 10px oklch(0.58 0.18 270 / 0.15);
|
|
151
|
-
--shadow-glow-md: 0 0 20px oklch(0.58 0.18 270 / 0.2);
|
|
152
|
-
--shadow-glow-lg: 0 0 30px oklch(0.58 0.18 270 / 0.25);
|
|
136
|
+
/* Shadows — mapped to the flip tokens in theme-tokens.css so every
|
|
137
|
+
* shadow-* utility resolves to `none` in dark (borders-only look). */
|
|
138
|
+
--shadow-xs: var(--rw-shadow-xs);
|
|
139
|
+
--shadow-sm: var(--rw-shadow-sm);
|
|
140
|
+
--shadow-md: var(--rw-shadow-md);
|
|
141
|
+
--shadow-lg: var(--rw-shadow-lg);
|
|
142
|
+
--shadow-xl: var(--rw-shadow-xl);
|
|
153
143
|
}
|
|
154
144
|
|
|
155
145
|
/* Semantic Design Tokens — Tailwind utility aliases.
|
|
@@ -212,14 +202,30 @@
|
|
|
212
202
|
--color-warning-soft-border: var(--rw-warning-soft-border);
|
|
213
203
|
--color-info-soft-border: var(--rw-info-soft-border);
|
|
214
204
|
|
|
215
|
-
/*
|
|
216
|
-
--
|
|
217
|
-
--
|
|
218
|
-
--
|
|
205
|
+
/* Terminal surface — fixed dark in both themes */
|
|
206
|
+
--color-term: var(--rw-term);
|
|
207
|
+
--color-term-2: var(--rw-term-2);
|
|
208
|
+
--color-term-line: var(--rw-term-line);
|
|
209
|
+
--color-term-line-2: var(--rw-term-line-2);
|
|
210
|
+
--color-term-text: var(--rw-term-text);
|
|
211
|
+
--color-term-muted: var(--rw-term-muted);
|
|
212
|
+
--color-term-faint: var(--rw-term-faint);
|
|
213
|
+
--color-term-teal: var(--rw-term-teal);
|
|
214
|
+
--color-term-ok: var(--rw-term-ok);
|
|
215
|
+
--color-term-warn: var(--rw-term-warn);
|
|
216
|
+
--color-term-bad: var(--rw-term-bad);
|
|
217
|
+
/* Syntax highlighting */
|
|
218
|
+
--color-syn-comment: var(--rw-syn-comment);
|
|
219
|
+
--color-syn-kw: var(--rw-syn-kw);
|
|
220
|
+
--color-syn-str: var(--rw-syn-str);
|
|
221
|
+
--color-syn-num: var(--rw-syn-num);
|
|
222
|
+
--color-syn-punc: var(--rw-syn-punc);
|
|
223
|
+
--color-syn-fn: var(--rw-syn-fn);
|
|
219
224
|
|
|
220
|
-
/*
|
|
221
|
-
|
|
222
|
-
|
|
225
|
+
/* Motion. Deliberately minimal: hover, focus and state changes are
|
|
226
|
+
* instant, so there is no scale of durations to pick from. The few things
|
|
227
|
+
* that still move — a drawer sliding, a toggle knob, an accordion's
|
|
228
|
+
* height, a progress bar's width — set their own timing inline. */
|
|
223
229
|
--ease-out: cubic-bezier(0, 0, 0.2, 1);
|
|
224
230
|
}
|
|
225
231
|
|
|
@@ -245,6 +251,17 @@ body {
|
|
|
245
251
|
color: var(--rw-on-surface);
|
|
246
252
|
}
|
|
247
253
|
|
|
254
|
+
/* Headings are mono chrome — the runbook voice. Components should not fight this. */
|
|
255
|
+
h1,
|
|
256
|
+
h2,
|
|
257
|
+
h3 {
|
|
258
|
+
font-family: var(--font-mono);
|
|
259
|
+
font-weight: 800;
|
|
260
|
+
line-height: 1.1;
|
|
261
|
+
letter-spacing: -0.02em;
|
|
262
|
+
text-wrap: balance;
|
|
263
|
+
}
|
|
264
|
+
|
|
248
265
|
/* Utility classes for the design system */
|
|
249
266
|
.rw-text-gradient {
|
|
250
267
|
background: linear-gradient(135deg, var(--rw-color-wisp-600), var(--rw-color-aurora-500));
|
|
@@ -278,9 +295,6 @@ body {
|
|
|
278
295
|
}
|
|
279
296
|
}
|
|
280
297
|
|
|
281
|
-
.btn-scale {
|
|
282
|
-
transition: all 0.15s ease-in-out;
|
|
283
|
-
}
|
|
284
298
|
.btn-scale:active {
|
|
285
299
|
transform: scale(0.97);
|
|
286
300
|
}
|