@runwisp/ui 0.12.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 +11 -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 +61 -49
- 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
|
@@ -47,10 +47,13 @@
|
|
|
47
47
|
filters = $bindable(),
|
|
48
48
|
showTask = false,
|
|
49
49
|
tasks = [],
|
|
50
|
+
compact = false,
|
|
50
51
|
}: {
|
|
51
52
|
filters: RunsListFilters;
|
|
52
53
|
showTask?: boolean;
|
|
53
54
|
tasks?: { name: string }[];
|
|
55
|
+
// Icon-only trigger for narrow rails where a "Filter" label wouldn't fit.
|
|
56
|
+
compact?: boolean;
|
|
54
57
|
} = $props();
|
|
55
58
|
|
|
56
59
|
// The individual statuses behind the "Advanced" expander, grouped the way
|
|
@@ -64,10 +67,11 @@
|
|
|
64
67
|
|
|
65
68
|
const count = $derived(activeFilterCount(filters) + (showTask && filters.task_name ? 1 : 0));
|
|
66
69
|
|
|
67
|
-
const headerClass =
|
|
68
|
-
|
|
70
|
+
const headerClass =
|
|
71
|
+
"font-mono text-xs font-semibold tracking-[0.14em] text-on-surface-muted uppercase";
|
|
72
|
+
const labelClass = "font-mono text-2xs tracking-[0.12em] text-on-surface-faint uppercase";
|
|
69
73
|
const selectClass =
|
|
70
|
-
"h-9 w-full appearance-none rounded-
|
|
74
|
+
"h-9 w-full appearance-none rounded-[3px] border border-outline bg-surface-raised px-2.5 font-mono text-sm text-on-surface focus:border-ring focus:outline-none";
|
|
71
75
|
|
|
72
76
|
function statusDot(status: RunStatus): string {
|
|
73
77
|
return RUN_STATUS_CONFIG[status].dot.replace(" animate-pulse", "");
|
|
@@ -136,14 +140,16 @@
|
|
|
136
140
|
<Popover placement="right-start" mobileSheet>
|
|
137
141
|
{#snippet trigger()}
|
|
138
142
|
<span
|
|
139
|
-
class="inline-flex h-7 cursor-pointer items-center gap-1.5 rounded-
|
|
140
|
-
0
|
|
141
|
-
? '
|
|
142
|
-
: '
|
|
143
|
+
class="inline-flex h-7 cursor-pointer items-center gap-1.5 rounded-[3px] border font-mono text-xs font-medium {compact &&
|
|
144
|
+
count === 0
|
|
145
|
+
? 'w-7 justify-center px-0'
|
|
146
|
+
: 'px-2'} {count > 0
|
|
147
|
+
? 'border-primary-soft-border bg-primary-soft text-primary-soft-text'
|
|
148
|
+
: 'border-transparent text-on-surface-muted hover:border-outline-hover hover:bg-surface-sunken hover:text-primary'}"
|
|
143
149
|
title="Filter runs"
|
|
144
150
|
>
|
|
145
151
|
<Funnel size={13} />
|
|
146
|
-
Filter
|
|
152
|
+
{#if !compact}Filter{/if}
|
|
147
153
|
{#if count > 0}
|
|
148
154
|
<Badge variant="primary" size="sm" class="px-1.5 py-0">{count}</Badge>
|
|
149
155
|
{/if}
|
|
@@ -167,14 +173,14 @@
|
|
|
167
173
|
class="size-4 shrink-0 cursor-pointer rounded border-outline accent-primary"
|
|
168
174
|
/>
|
|
169
175
|
<span class="size-2.5 shrink-0 rounded-full {bucket.dot}"></span>
|
|
170
|
-
<span class="text-sm text-on-surface">{bucket.label}</span>
|
|
176
|
+
<span class="font-mono text-sm text-on-surface">{bucket.label}</span>
|
|
171
177
|
</label>
|
|
172
178
|
{/each}
|
|
173
179
|
</div>
|
|
174
180
|
|
|
175
181
|
<details class="mt-0.5" bind:open={advancedOpen}>
|
|
176
182
|
<summary
|
|
177
|
-
class="flex cursor-pointer items-center gap-1 text-2xs font-medium text-on-surface-muted
|
|
183
|
+
class="flex cursor-pointer items-center gap-1 font-mono text-2xs font-medium text-on-surface-muted select-none marker:content-none hover:text-on-surface [&::-webkit-details-marker]:hidden"
|
|
178
184
|
>
|
|
179
185
|
<ChevronRight size={12} class={advancedOpen ? "rotate-90" : ""} />
|
|
180
186
|
Advanced — pick exact statuses
|
|
@@ -185,7 +191,7 @@
|
|
|
185
191
|
<div class="grid grid-cols-2 gap-x-2 gap-y-1">
|
|
186
192
|
{#each group.values as status (status)}
|
|
187
193
|
<label
|
|
188
|
-
class="flex cursor-pointer items-center gap-1.5 truncate text-xs"
|
|
194
|
+
class="flex cursor-pointer items-center gap-1.5 truncate font-mono text-xs"
|
|
189
195
|
>
|
|
190
196
|
<input
|
|
191
197
|
type="checkbox"
|
|
@@ -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
|