@columenlabs/lumen-ui 0.0.0-stage → 0.2.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/LICENSE +21 -0
- package/NOTICE +12 -0
- package/README.md +4 -2
- package/dist/add-column.d.ts +23 -0
- package/dist/add-column.js +62 -0
- package/dist/api-fetch.d.ts +9 -0
- package/dist/api-fetch.js +60 -0
- package/dist/app-switcher.d.ts +21 -0
- package/dist/app-switcher.js +12 -0
- package/dist/app-views.d.ts +18 -0
- package/dist/app-views.js +41 -0
- package/dist/assistant-context.d.ts +72 -0
- package/dist/assistant-context.js +30 -0
- package/dist/assistant-panel.d.ts +58 -0
- package/dist/assistant-panel.js +244 -0
- package/dist/assistant-screen.d.ts +124 -0
- package/dist/assistant-screen.js +252 -0
- package/dist/card-switch.d.ts +16 -0
- package/dist/card-switch.js +16 -0
- package/dist/color-dot.d.ts +14 -0
- package/dist/color-dot.js +19 -0
- package/dist/confirm.d.ts +18 -0
- package/dist/confirm.js +5 -0
- package/dist/connections.d.ts +45 -0
- package/dist/connections.js +275 -0
- package/dist/coverage-calendar-map.d.ts +27 -0
- package/dist/coverage-calendar-map.js +84 -0
- package/dist/coverage-cells.d.ts +55 -0
- package/dist/coverage-cells.js +85 -0
- package/dist/coverage-map.d.ts +112 -0
- package/dist/coverage-map.js +428 -0
- package/dist/details-table.d.ts +20 -0
- package/dist/details-table.js +13 -0
- package/dist/drawer-section.d.ts +27 -0
- package/dist/drawer-section.js +23 -0
- package/dist/floating-head.d.ts +2 -0
- package/dist/floating-head.js +57 -0
- package/dist/fold.d.ts +16 -0
- package/dist/fold.js +70 -0
- package/dist/form-issues.d.ts +32 -0
- package/dist/form-issues.js +60 -0
- package/dist/formula-input.d.ts +17 -0
- package/dist/formula-input.js +104 -0
- package/dist/frame-script.d.ts +7 -0
- package/dist/frame-script.js +103 -0
- package/dist/freshness.d.ts +24 -0
- package/dist/freshness.js +99 -0
- package/dist/group-button.d.ts +33 -0
- package/dist/group-button.js +67 -0
- package/dist/growth-chart.d.ts +77 -0
- package/dist/growth-chart.js +195 -0
- package/dist/hooks/use-keyboard-fit.d.ts +15 -0
- package/dist/hooks/use-keyboard-fit.js +29 -0
- package/dist/hooks/use-mobile.d.ts +1 -0
- package/dist/hooks/use-mobile.js +15 -0
- package/dist/icon-button.d.ts +21 -0
- package/dist/icon-button.js +22 -0
- package/dist/icon-picker.d.ts +14 -0
- package/dist/icon-picker.js +36 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.js +90 -0
- package/dist/integrations.d.ts +57 -0
- package/dist/integrations.js +73 -0
- package/dist/joins.d.ts +128 -0
- package/dist/joins.js +767 -0
- package/dist/kit-config.d.ts +13 -0
- package/dist/kit-config.js +15 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.js +5 -0
- package/dist/lumen-boundary.d.ts +7 -0
- package/dist/lumen-boundary.js +10 -0
- package/dist/lumen-code-editor-impl.d.ts +2 -0
- package/dist/lumen-code-editor-impl.js +16 -0
- package/dist/lumen-code-editor.d.ts +11 -0
- package/dist/lumen-code-editor.js +11 -0
- package/dist/lumen-code.d.ts +22 -0
- package/dist/lumen-code.js +75 -0
- package/dist/lumen-drawer.d.ts +30 -0
- package/dist/lumen-drawer.js +27 -0
- package/dist/lumen-echart.d.ts +58 -0
- package/dist/lumen-echart.js +129 -0
- package/dist/lumen-filter.d.ts +75 -0
- package/dist/lumen-filter.js +546 -0
- package/dist/lumen-finder.d.ts +62 -0
- package/dist/lumen-finder.js +275 -0
- package/dist/lumen-form.d.ts +34 -0
- package/dist/lumen-form.js +81 -0
- package/dist/lumen-geo-map.d.ts +9 -0
- package/dist/lumen-geo-map.js +135 -0
- package/dist/lumen-grid.d.ts +49 -0
- package/dist/lumen-grid.js +203 -0
- package/dist/lumen-layout.d.ts +150 -0
- package/dist/lumen-layout.js +658 -0
- package/dist/lumen-links.d.ts +96 -0
- package/dist/lumen-links.js +213 -0
- package/dist/lumen-page-state.d.ts +20 -0
- package/dist/lumen-page-state.js +15 -0
- package/dist/lumen-selector.d.ts +139 -0
- package/dist/lumen-selector.js +308 -0
- package/dist/lumen-source.d.ts +137 -0
- package/dist/lumen-source.js +327 -0
- package/dist/lumen-tab-drawer.d.ts +27 -0
- package/dist/lumen-tab-drawer.js +26 -0
- package/dist/lumen-tabs.d.ts +21 -0
- package/dist/lumen-tabs.js +6 -0
- package/dist/lumen-toast.d.ts +11 -0
- package/dist/lumen-toast.js +16 -0
- package/dist/lumen-trend.d.ts +18 -0
- package/dist/lumen-trend.js +157 -0
- package/dist/lumen-view-card.d.ts +35 -0
- package/dist/lumen-view-card.js +50 -0
- package/dist/lumen-view.d.ts +172 -0
- package/dist/lumen-view.js +645 -0
- package/dist/lumen-widget-charts.d.ts +57 -0
- package/dist/lumen-widget-charts.js +69 -0
- package/dist/lumen-widget.d.ts +614 -0
- package/dist/lumen-widget.js +594 -0
- package/dist/market/compare-chart.d.ts +34 -0
- package/dist/market/compare-chart.js +292 -0
- package/dist/market/indicator-picker.d.ts +29 -0
- package/dist/market/indicator-picker.js +125 -0
- package/dist/market/indicators.d.ts +63 -0
- package/dist/market/indicators.js +314 -0
- package/dist/market/live.d.ts +120 -0
- package/dist/market/live.js +444 -0
- package/dist/market/lumen-chart.d.ts +88 -0
- package/dist/market/lumen-chart.js +645 -0
- package/dist/market/market-widget.d.ts +45 -0
- package/dist/market/market-widget.js +346 -0
- package/dist/market/option-chain.d.ts +19 -0
- package/dist/market/option-chain.js +53 -0
- package/dist/market/price-chart.d.ts +128 -0
- package/dist/market/price-chart.js +619 -0
- package/dist/mcp-settings.d.ts +20 -0
- package/dist/mcp-settings.js +65 -0
- package/dist/nav.d.ts +77 -0
- package/dist/nav.js +73 -0
- package/dist/note-line.d.ts +13 -0
- package/dist/note-line.js +5 -0
- package/dist/notifications.d.ts +9 -0
- package/dist/notifications.js +166 -0
- package/dist/origin-legend.d.ts +14 -0
- package/dist/origin-legend.js +38 -0
- package/dist/overview.d.ts +84 -0
- package/dist/overview.js +105 -0
- package/dist/page-inputs.d.ts +14 -0
- package/dist/page-inputs.js +16 -0
- package/dist/page.d.ts +32 -0
- package/dist/page.js +45 -0
- package/dist/pager.d.ts +10 -0
- package/dist/pager.js +14 -0
- package/dist/prefs.d.ts +71 -0
- package/dist/prefs.js +126 -0
- package/dist/query-client.d.ts +7 -0
- package/dist/query-client.js +19 -0
- package/dist/refresh.d.ts +4 -0
- package/dist/refresh.js +19 -0
- package/dist/rename-field.d.ts +11 -0
- package/dist/rename-field.js +26 -0
- package/dist/reset-button.d.ts +9 -0
- package/dist/reset-button.js +10 -0
- package/dist/route-error.d.ts +42 -0
- package/dist/route-error.js +229 -0
- package/dist/schedules.d.ts +88 -0
- package/dist/schedules.js +221 -0
- package/dist/settings.d.ts +51 -0
- package/dist/settings.js +181 -0
- package/dist/shell.d.ts +99 -0
- package/dist/shell.js +137 -0
- package/dist/source-health.d.ts +12 -0
- package/dist/source-health.js +58 -0
- package/dist/spotlight.d.ts +23 -0
- package/dist/spotlight.js +138 -0
- package/dist/status-health.d.ts +16 -0
- package/dist/status-health.js +41 -0
- package/dist/status.d.ts +9 -0
- package/dist/status.js +12 -0
- package/dist/summary-cards.d.ts +56 -0
- package/dist/summary-cards.js +270 -0
- package/dist/symbol-sheet-context.d.ts +4 -0
- package/dist/symbol-sheet-context.js +5 -0
- package/dist/symbol-sheet.d.ts +9 -0
- package/dist/symbol-sheet.js +24 -0
- package/dist/tasks.d.ts +29 -0
- package/dist/tasks.js +278 -0
- package/dist/theme.css +606 -0
- package/dist/tile.d.ts +37 -0
- package/dist/tile.js +23 -0
- package/dist/ui/alert-dialog.d.ts +18 -0
- package/dist/ui/alert-dialog.js +41 -0
- package/dist/ui/alert.d.ts +10 -0
- package/dist/ui/alert.js +27 -0
- package/dist/ui/avatar.d.ts +11 -0
- package/dist/ui/avatar.js +22 -0
- package/dist/ui/badge.d.ts +9 -0
- package/dist/ui/badge.js +27 -0
- package/dist/ui/breadcrumb.d.ts +11 -0
- package/dist/ui/breadcrumb.js +27 -0
- package/dist/ui/button-group.d.ts +11 -0
- package/dist/ui/button-group.js +27 -0
- package/dist/ui/button.d.ts +10 -0
- package/dist/ui/button.js +38 -0
- package/dist/ui/card.d.ts +11 -0
- package/dist/ui/card.js +24 -0
- package/dist/ui/chart.d.ts +44 -0
- package/dist/ui/chart.js +117 -0
- package/dist/ui/checkbox.d.ts +4 -0
- package/dist/ui/checkbox.js +8 -0
- package/dist/ui/collapsible.d.ts +5 -0
- package/dist/ui/collapsible.js +12 -0
- package/dist/ui/combobox.d.ts +24 -0
- package/dist/ui/combobox.js +60 -0
- package/dist/ui/command.d.ts +18 -0
- package/dist/ui/command.js +34 -0
- package/dist/ui/dialog.d.ts +23 -0
- package/dist/ui/dialog.js +50 -0
- package/dist/ui/dropdown-menu.d.ts +29 -0
- package/dist/ui/dropdown-menu.js +50 -0
- package/dist/ui/emoji-picker.d.ts +6 -0
- package/dist/ui/emoji-picker.js +28 -0
- package/dist/ui/empty.d.ts +11 -0
- package/dist/ui/empty.js +33 -0
- package/dist/ui/field.d.ts +24 -0
- package/dist/ui/field.js +65 -0
- package/dist/ui/hover-card.d.ts +6 -0
- package/dist/ui/hover-card.js +13 -0
- package/dist/ui/input-group.d.ts +16 -0
- package/dist/ui/input-group.js +56 -0
- package/dist/ui/input.d.ts +3 -0
- package/dist/ui/input.js +6 -0
- package/dist/ui/item.d.ts +23 -0
- package/dist/ui/item.js +67 -0
- package/dist/ui/kbd.d.ts +3 -0
- package/dist/ui/kbd.js +9 -0
- package/dist/ui/label.d.ts +4 -0
- package/dist/ui/label.js +7 -0
- package/dist/ui/popover.d.ts +10 -0
- package/dist/ui/popover.js +25 -0
- package/dist/ui/progress.d.ts +4 -0
- package/dist/ui/progress.js +9 -0
- package/dist/ui/resizable.d.ts +7 -0
- package/dist/ui/resizable.js +13 -0
- package/dist/ui/scroll-area.d.ts +5 -0
- package/dist/ui/scroll-area.js +10 -0
- package/dist/ui/select.d.ts +15 -0
- package/dist/ui/select.js +36 -0
- package/dist/ui/separator.d.ts +4 -0
- package/dist/ui/separator.js +7 -0
- package/dist/ui/sheet.d.ts +14 -0
- package/dist/ui/sheet.js +54 -0
- package/dist/ui/sidebar.d.ts +69 -0
- package/dist/ui/sidebar.js +206 -0
- package/dist/ui/skeleton.d.ts +2 -0
- package/dist/ui/skeleton.js +6 -0
- package/dist/ui/slider.d.ts +4 -0
- package/dist/ui/slider.js +9 -0
- package/dist/ui/sonner.d.ts +3 -0
- package/dist/ui/sonner.js +24 -0
- package/dist/ui/spinner.d.ts +2 -0
- package/dist/ui/spinner.js +7 -0
- package/dist/ui/switch.d.ts +6 -0
- package/dist/ui/switch.js +7 -0
- package/dist/ui/table.d.ts +10 -0
- package/dist/ui/table.js +31 -0
- package/dist/ui/tabs.d.ts +7 -0
- package/dist/ui/tabs.js +22 -0
- package/dist/ui/textarea.d.ts +3 -0
- package/dist/ui/textarea.js +6 -0
- package/dist/ui/toggle-group.d.ts +10 -0
- package/dist/ui/toggle-group.js +22 -0
- package/dist/ui/toggle.d.ts +9 -0
- package/dist/ui/toggle.js +25 -0
- package/dist/ui/tooltip.d.ts +7 -0
- package/dist/ui/tooltip.js +16 -0
- package/dist/view-edit-cell.d.ts +49 -0
- package/dist/view-edit-cell.js +198 -0
- package/dist/view-editor.d.ts +52 -0
- package/dist/view-editor.js +940 -0
- package/dist/view-formulas.d.ts +61 -0
- package/dist/view-formulas.js +247 -0
- package/dist/view-icons.d.ts +20 -0
- package/dist/view-icons.js +70 -0
- package/dist/view-model.d.ts +390 -0
- package/dist/view-model.js +316 -0
- package/dist/whats-new.d.ts +3 -0
- package/dist/whats-new.js +53 -0
- package/dist/widget-controls.d.ts +9 -0
- package/dist/widget-controls.js +26 -0
- package/dist/widget-settings.d.ts +436 -0
- package/dist/widget-settings.js +290 -0
- package/dist/widget-thumbs.d.ts +3 -0
- package/dist/widget-thumbs.js +29 -0
- package/dist/workspace-keys.d.ts +12 -0
- package/dist/workspace-keys.js +13 -0
- package/dist/workspaces.d.ts +57 -0
- package/dist/workspaces.js +473 -0
- package/package.json +82 -4
package/dist/theme.css
ADDED
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
/* One theme for every app: Manrope + JetBrains Mono, the Authority palette,
|
|
2
|
+
compact density and the shell's frame spacing. Only the accent changes by app (`data-app` on
|
|
3
|
+
<html>, set by LumenShell): a product sets `--primary` per app in its own CSS (the product's
|
|
4
|
+
desks.css). Gain and loss never change by app.
|
|
5
|
+
An app imports this right after tailwindcss, then adds `@source` for this package and any
|
|
6
|
+
app-local tokens of its own. */
|
|
7
|
+
@import "@fontsource-variable/manrope";
|
|
8
|
+
@import "@fontsource-variable/jetbrains-mono";
|
|
9
|
+
/* Settings ▸ Appearance ▸ Font; each face downloads only when it is picked. */
|
|
10
|
+
@import "@fontsource-variable/inter";
|
|
11
|
+
@import "@fontsource-variable/ibm-plex-sans";
|
|
12
|
+
|
|
13
|
+
@custom-variant dark (&:is(.dark *));
|
|
14
|
+
|
|
15
|
+
@theme inline {
|
|
16
|
+
--font-heading: var(--font-sans);
|
|
17
|
+
--font-sans: var(--app-font);
|
|
18
|
+
--font-mono: "JetBrains Mono Variable", "JetBrains Mono", ui-monospace, SFMono-Regular, monospace;
|
|
19
|
+
--color-gain: var(--gain);
|
|
20
|
+
--color-kind-declarative: var(--kind-declarative);
|
|
21
|
+
--color-kind-script: var(--kind-script);
|
|
22
|
+
--color-edge: var(--edge);
|
|
23
|
+
--color-loss: var(--loss);
|
|
24
|
+
--color-success: var(--success);
|
|
25
|
+
--color-info: var(--info);
|
|
26
|
+
--color-proxy: var(--proxy);
|
|
27
|
+
--color-warning: var(--warning);
|
|
28
|
+
--color-rule-yes: var(--rule-yes);
|
|
29
|
+
--color-rule-no: var(--rule-no);
|
|
30
|
+
--color-gap: var(--gap);
|
|
31
|
+
--color-cov-full: var(--cov-full);
|
|
32
|
+
--color-cov-high: var(--cov-high);
|
|
33
|
+
--color-cov-low: var(--cov-low);
|
|
34
|
+
--color-ring: var(--ring);
|
|
35
|
+
--color-input: var(--input);
|
|
36
|
+
--color-border: var(--border);
|
|
37
|
+
--color-destructive: var(--destructive);
|
|
38
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
39
|
+
--color-accent: var(--accent);
|
|
40
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
41
|
+
--color-muted: var(--muted);
|
|
42
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
43
|
+
--color-secondary: var(--secondary);
|
|
44
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
45
|
+
--color-primary: var(--primary);
|
|
46
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
47
|
+
--color-popover: var(--popover);
|
|
48
|
+
--color-card-foreground: var(--card-foreground);
|
|
49
|
+
--color-card: var(--card);
|
|
50
|
+
--color-foreground: var(--foreground);
|
|
51
|
+
--color-background: var(--background);
|
|
52
|
+
--color-chart-1: var(--chart-1);
|
|
53
|
+
--color-chart-2: var(--chart-2);
|
|
54
|
+
--color-chart-3: var(--chart-3);
|
|
55
|
+
--color-chart-4: var(--chart-4);
|
|
56
|
+
--color-chart-5: var(--chart-5);
|
|
57
|
+
--color-chart-6: var(--chart-6);
|
|
58
|
+
--color-chart-7: var(--chart-7);
|
|
59
|
+
--color-chart-8: var(--chart-8);
|
|
60
|
+
--color-chart-9: var(--chart-9);
|
|
61
|
+
--color-chart-10: var(--chart-10);
|
|
62
|
+
--color-sidebar: var(--sidebar);
|
|
63
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
64
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
65
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
66
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
67
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
68
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
69
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
70
|
+
--radius-sm: calc(var(--radius) * 0.6);
|
|
71
|
+
--radius-md: calc(var(--radius) * 0.8);
|
|
72
|
+
--radius-lg: var(--radius);
|
|
73
|
+
--radius-xl: calc(var(--radius) * 1.4);
|
|
74
|
+
--radius-2xl: calc(var(--radius) * 1.8);
|
|
75
|
+
--radius-3xl: calc(var(--radius) * 2.2);
|
|
76
|
+
--radius-4xl: calc(var(--radius) * 2.6);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
:root {
|
|
80
|
+
/* "Edge" in every app name (an app, an app, an app): one gold across the suite. */
|
|
81
|
+
--edge: #b8862e;
|
|
82
|
+
/* Frame: the shell owns these; pages never set their own outer padding or header. */
|
|
83
|
+
--shell-sidebar-width: 16rem;
|
|
84
|
+
--shell-assistant-width: 26rem;
|
|
85
|
+
--shell-header-height: 48px;
|
|
86
|
+
--shell-status-height: 32px;
|
|
87
|
+
--tile-width: 8.5rem;
|
|
88
|
+
--shell-gutter: 12px;
|
|
89
|
+
--shell-section-gap: 12px;
|
|
90
|
+
--shell-max-width: 1400px;
|
|
91
|
+
/* The text font, picked in Settings ▸ Appearance (`data-font` on <html>, prefs.ts). */
|
|
92
|
+
--app-font: "Manrope Variable", Manrope, ui-sans-serif, system-ui, sans-serif;
|
|
93
|
+
/* Compact density, the only density. */
|
|
94
|
+
--card-pad: 12px;
|
|
95
|
+
--row-h: 28px;
|
|
96
|
+
--cell-x: 8px;
|
|
97
|
+
--cell-y: 4px;
|
|
98
|
+
|
|
99
|
+
--background: #f4f6fa;
|
|
100
|
+
--foreground: #121826;
|
|
101
|
+
--card: #fbfcfe;
|
|
102
|
+
--card-foreground: #121826;
|
|
103
|
+
--popover: #fbfcfe;
|
|
104
|
+
--popover-foreground: #121826;
|
|
105
|
+
--primary: #2563eb;
|
|
106
|
+
--primary-foreground: #f5f8ff;
|
|
107
|
+
--secondary: #e9edf5;
|
|
108
|
+
--secondary-foreground: #121826;
|
|
109
|
+
--muted: #e9edf5;
|
|
110
|
+
--muted-foreground: #4f5970;
|
|
111
|
+
--accent: #e9edf5;
|
|
112
|
+
--accent-foreground: #121826;
|
|
113
|
+
--destructive: #c2183f;
|
|
114
|
+
--border: #d8deea;
|
|
115
|
+
--input: #c9d1e0;
|
|
116
|
+
/* Focus is quiet: a neutral ring for keyboard focus, never the brand colour. */
|
|
117
|
+
--ring: var(--muted-foreground);
|
|
118
|
+
--radius: 0.5rem;
|
|
119
|
+
--chart-1: var(--primary);
|
|
120
|
+
--chart-2: #0e9f6e;
|
|
121
|
+
--chart-3: #d97706;
|
|
122
|
+
--chart-4: #ea580c;
|
|
123
|
+
--chart-5: #db2777;
|
|
124
|
+
--chart-6: #0891b2;
|
|
125
|
+
--chart-7: #a16207;
|
|
126
|
+
--chart-8: #64748b;
|
|
127
|
+
--chart-9: #65a30d;
|
|
128
|
+
--chart-10: #dc2626;
|
|
129
|
+
/* Tags (an app categories and labels): 16 distinct hues, apart from the charts'. */
|
|
130
|
+
--tag-red: #dc2626;
|
|
131
|
+
--tag-orange: #ea580c;
|
|
132
|
+
--tag-amber: #d97706;
|
|
133
|
+
--tag-yellow: #ca8a04;
|
|
134
|
+
--tag-lime: #65a30d;
|
|
135
|
+
--tag-green: #16a34a;
|
|
136
|
+
--tag-teal: #0d9488;
|
|
137
|
+
--tag-cyan: #0891b2;
|
|
138
|
+
--tag-sky: #0284c7;
|
|
139
|
+
--tag-blue: #2563eb;
|
|
140
|
+
--tag-indigo: #4f46e5;
|
|
141
|
+
--tag-violet: #7c3aed;
|
|
142
|
+
--tag-purple: #9333ea;
|
|
143
|
+
--tag-pink: #db2777;
|
|
144
|
+
--tag-rose: #e11d48;
|
|
145
|
+
--tag-slate: #64748b;
|
|
146
|
+
/* Your data: the person's own columns (Edits in place). */
|
|
147
|
+
--origin-yours: #7c3aed;
|
|
148
|
+
/* The assistant frames (live domains): apart from the Symbol join's amber. */
|
|
149
|
+
--origin-assistant: #e11d48;
|
|
150
|
+
--sidebar: #eef1f7;
|
|
151
|
+
--sidebar-foreground: #121826;
|
|
152
|
+
--sidebar-primary: var(--primary);
|
|
153
|
+
--sidebar-primary-foreground: var(--primary-foreground);
|
|
154
|
+
--sidebar-accent: #dfe6f3;
|
|
155
|
+
--sidebar-accent-foreground: #121826;
|
|
156
|
+
--sidebar-border: #d8deea;
|
|
157
|
+
--sidebar-ring: var(--muted-foreground);
|
|
158
|
+
--gain: #00703c;
|
|
159
|
+
--loss: #c2183f;
|
|
160
|
+
/* A check that passed and one that needs a look (badges, the Overview's amber). */
|
|
161
|
+
--success: #12804a;
|
|
162
|
+
/* The assistant @ tokens: a blue that is neither the app accent nor a gain. */
|
|
163
|
+
--info: #2563eb;
|
|
164
|
+
/* A price taken from a stand-in ETF (≈ SPY). */
|
|
165
|
+
--proxy: #7c3aed;
|
|
166
|
+
--warning: #9a5b06;
|
|
167
|
+
/* Playbook rules: yes (fired, the path and the decision) green, no amber. */
|
|
168
|
+
--rule-yes: #15803d;
|
|
169
|
+
--rule-no: #b45309;
|
|
170
|
+
/* Coverage cells (LumenCoverageMap): a blue ramp for present, hatched orange for missing, so
|
|
171
|
+
they differ in hue and lightness (CVD-safe). */
|
|
172
|
+
--gap: #e2711d;
|
|
173
|
+
--gap-soft: #f8cfae;
|
|
174
|
+
--cov-full: #2563eb;
|
|
175
|
+
--cov-high: #7ea2f2;
|
|
176
|
+
--cov-low: #c3d3f8;
|
|
177
|
+
/* Filter links: a card's link colour, its square and what it follows. */
|
|
178
|
+
--link-teal: var(--chart-6);
|
|
179
|
+
--link-amber: var(--chart-3);
|
|
180
|
+
--link-pink: var(--chart-5);
|
|
181
|
+
--link-lime: var(--chart-9);
|
|
182
|
+
--link-blue: var(--chart-1);
|
|
183
|
+
/* Key-date markers on charts (FOMC, CPI, Jobs), one hue each, drawn faint. */
|
|
184
|
+
--key-date-fomc: var(--chart-10);
|
|
185
|
+
--key-date-cpi: var(--chart-3);
|
|
186
|
+
--key-date-jobs: var(--chart-6);
|
|
187
|
+
/* The assistant's models by weight: Haiku cyan, Sonnet blue, Opus orange. */
|
|
188
|
+
/* Playbook kinds: Declarative teal, Script orange. */
|
|
189
|
+
--kind-declarative: #0d9488;
|
|
190
|
+
--kind-script: #ea580c;
|
|
191
|
+
--tier-spark: #0891b2;
|
|
192
|
+
--tier-bolt: #2563eb;
|
|
193
|
+
--tier-dynamo: #ea580c;
|
|
194
|
+
color-scheme: light;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
@media (min-width: 768px) {
|
|
198
|
+
:root {
|
|
199
|
+
--shell-gutter: 16px;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.dark {
|
|
204
|
+
--edge: #d4a24c;
|
|
205
|
+
--background: #0b0f17;
|
|
206
|
+
--foreground: #e6eaf2;
|
|
207
|
+
--card: #121826;
|
|
208
|
+
--card-foreground: #e6eaf2;
|
|
209
|
+
--popover: #121826;
|
|
210
|
+
--popover-foreground: #e6eaf2;
|
|
211
|
+
--primary: #5b8cff;
|
|
212
|
+
--primary-foreground: #0b0f17;
|
|
213
|
+
--secondary: #1c2435;
|
|
214
|
+
--secondary-foreground: #e6eaf2;
|
|
215
|
+
--muted: #1c2435;
|
|
216
|
+
--muted-foreground: #9aa4b8;
|
|
217
|
+
--accent: #1c2435;
|
|
218
|
+
--accent-foreground: #e6eaf2;
|
|
219
|
+
--destructive: #ff5c7a;
|
|
220
|
+
--border: #263046;
|
|
221
|
+
--input: #2f3a52;
|
|
222
|
+
--chart-2: #34d399;
|
|
223
|
+
--chart-3: #fbbf24;
|
|
224
|
+
--chart-4: #fb923c;
|
|
225
|
+
--chart-5: #f472b6;
|
|
226
|
+
--chart-6: #22d3ee;
|
|
227
|
+
--chart-7: #f59e0b;
|
|
228
|
+
--chart-8: #94a3b8;
|
|
229
|
+
--chart-9: #a3e635;
|
|
230
|
+
--chart-10: #f87171;
|
|
231
|
+
--tag-red: #f87171;
|
|
232
|
+
--tag-orange: #fb923c;
|
|
233
|
+
--tag-amber: #fbbf24;
|
|
234
|
+
--tag-yellow: #facc15;
|
|
235
|
+
--tag-lime: #a3e635;
|
|
236
|
+
--tag-green: #4ade80;
|
|
237
|
+
--tag-teal: #2dd4bf;
|
|
238
|
+
--tag-cyan: #22d3ee;
|
|
239
|
+
--tag-sky: #38bdf8;
|
|
240
|
+
--tag-blue: #60a5fa;
|
|
241
|
+
--tag-indigo: #818cf8;
|
|
242
|
+
--tag-violet: #a78bfa;
|
|
243
|
+
--tag-purple: #c084fc;
|
|
244
|
+
--tag-pink: #f472b6;
|
|
245
|
+
--tag-rose: #fb7185;
|
|
246
|
+
--tag-slate: #94a3b8;
|
|
247
|
+
--origin-yours: #a78bfa;
|
|
248
|
+
--origin-assistant: #fb7185;
|
|
249
|
+
--sidebar: #0f1420;
|
|
250
|
+
--sidebar-foreground: #e6eaf2;
|
|
251
|
+
--sidebar-accent: #1c2435;
|
|
252
|
+
--sidebar-accent-foreground: #e6eaf2;
|
|
253
|
+
--sidebar-border: #263046;
|
|
254
|
+
--gain: #34d399;
|
|
255
|
+
--loss: #ff5c7a;
|
|
256
|
+
--success: #2fd081;
|
|
257
|
+
--info: #6aa9ff;
|
|
258
|
+
--proxy: #b69cff;
|
|
259
|
+
--warning: #e5a73a;
|
|
260
|
+
--rule-yes: #4ade80;
|
|
261
|
+
--rule-no: #fbbf24;
|
|
262
|
+
--gap: #f0883e;
|
|
263
|
+
--gap-soft: #5a3417;
|
|
264
|
+
--cov-full: #4c8dff;
|
|
265
|
+
--cov-high: #2f5fb8;
|
|
266
|
+
--cov-low: #1d3360;
|
|
267
|
+
--tier-spark: #22d3ee;
|
|
268
|
+
--kind-declarative: #2dd4bf;
|
|
269
|
+
--kind-script: #fb923c;
|
|
270
|
+
--tier-bolt: #5b8cff;
|
|
271
|
+
--tier-dynamo: #fb923c;
|
|
272
|
+
color-scheme: dark;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/* Glass surfaces, a user preference (Settings, All apps), off by default. */
|
|
276
|
+
/* Frost needs something behind it ("I don't see much of a difference"): a flat
|
|
277
|
+
page under a blur looks the same, so glass also lays two soft washes of the desk's accent on the
|
|
278
|
+
page, fixed while it scrolls, and lets the frame show them through. The wash sits on one fixed
|
|
279
|
+
layer the size of the viewport, so a sticky tab row can paint the same wash exactly in line. */
|
|
280
|
+
:root[data-glass="on"] {
|
|
281
|
+
--glass-wash: radial-gradient(
|
|
282
|
+
60rem 40rem at 85% -10%,
|
|
283
|
+
color-mix(in oklab, var(--primary) 22%, transparent),
|
|
284
|
+
transparent 70%
|
|
285
|
+
),
|
|
286
|
+
radial-gradient(
|
|
287
|
+
50rem 36rem at -5% 105%,
|
|
288
|
+
color-mix(in oklab, var(--chart-6) 16%, transparent),
|
|
289
|
+
transparent 70%
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
:root[data-glass="on"] body::before {
|
|
293
|
+
content: "";
|
|
294
|
+
position: fixed;
|
|
295
|
+
inset: 0;
|
|
296
|
+
z-index: -1;
|
|
297
|
+
pointer-events: none;
|
|
298
|
+
background-image: var(--glass-wash);
|
|
299
|
+
}
|
|
300
|
+
:root[data-glass="on"] [data-slot="sidebar-inset"],
|
|
301
|
+
:root[data-glass="on"] [data-slot="sidebar-wrapper"] {
|
|
302
|
+
background-color: transparent;
|
|
303
|
+
}
|
|
304
|
+
:root[data-glass="on"] [data-slot="sidebar-inner"] {
|
|
305
|
+
background-color: color-mix(in oklab, var(--sidebar) 70%, transparent);
|
|
306
|
+
backdrop-filter: blur(16px) saturate(140%);
|
|
307
|
+
}
|
|
308
|
+
/* A sticky tab row looks clear, with no band (option B), yet nothing ever shows
|
|
309
|
+
through it: behind its tabs it paints the page itself (the page colour and the wash, lined up with
|
|
310
|
+
the fixed wash layer by --wash-x/-y/-w/-h, which the page's scroller sets once per resize), over
|
|
311
|
+
both gutters and --intro-fade below, fading out at the bottom. Being part of the sticky row, it
|
|
312
|
+
moves with the scroll in the same frame however fast the page is flicked; it shows from the first
|
|
313
|
+
pixel of scroll, before any card reaches the row. */
|
|
314
|
+
:root[data-glass="on"] {
|
|
315
|
+
--intro-fade: var(--shell-section-gap);
|
|
316
|
+
}
|
|
317
|
+
:root[data-glass="on"] [data-slot="page-intro"]:has([data-slot="tabs-list"]) {
|
|
318
|
+
background-color: transparent;
|
|
319
|
+
box-shadow: none;
|
|
320
|
+
}
|
|
321
|
+
:root[data-glass="on"] [data-slot="page-intro"]:has([data-slot="tabs-list"])::before {
|
|
322
|
+
content: "";
|
|
323
|
+
position: absolute;
|
|
324
|
+
z-index: -1;
|
|
325
|
+
inset: 0 calc(-1 * var(--shell-gutter)) calc(-1 * var(--intro-fade));
|
|
326
|
+
pointer-events: none;
|
|
327
|
+
background-color: var(--background);
|
|
328
|
+
background-image: var(--glass-wash);
|
|
329
|
+
background-repeat: no-repeat;
|
|
330
|
+
background-size: var(--wash-w, 100vw) var(--wash-h, 100vh);
|
|
331
|
+
background-position: calc(-1 * var(--wash-x, 0px)) calc(-1 * var(--wash-y, 0px));
|
|
332
|
+
mask-image: linear-gradient(to bottom, #000 calc(100% - var(--intro-fade)), transparent);
|
|
333
|
+
}
|
|
334
|
+
@keyframes intro-page-in {
|
|
335
|
+
from {
|
|
336
|
+
opacity: 0;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
@supports (animation-timeline: scroll()) {
|
|
340
|
+
:root[data-glass="on"] [data-slot="page-intro"]:has([data-slot="tabs-list"])::before {
|
|
341
|
+
animation: intro-page-in linear both;
|
|
342
|
+
animation-timeline: scroll(nearest);
|
|
343
|
+
animation-range: 0 1px;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
:root[data-glass="on"] [data-slot="card"],
|
|
347
|
+
:root[data-glass="on"] [data-slot="lumen-card"],
|
|
348
|
+
:root[data-glass="on"] [data-slot="shell-header"],
|
|
349
|
+
:root[data-glass="on"] [data-slot="shell-status"] {
|
|
350
|
+
background-color: color-mix(in oklab, var(--card) 55%, transparent);
|
|
351
|
+
backdrop-filter: blur(16px) saturate(140%);
|
|
352
|
+
}
|
|
353
|
+
/* Popups float over the page: a little more opaque so their text stays crisp. */
|
|
354
|
+
:root[data-glass="on"] [data-slot="popover-content"],
|
|
355
|
+
:root[data-glass="on"] [data-slot="dropdown-menu-content"],
|
|
356
|
+
:root[data-glass="on"] [data-slot="dialog-content"],
|
|
357
|
+
:root[data-glass="on"] [data-slot="sheet-content"][data-side="bottom"],
|
|
358
|
+
:root[data-glass="on"] [data-slot="lumen-drawer"] {
|
|
359
|
+
background-color: color-mix(in oklab, var(--popover) 80%, transparent);
|
|
360
|
+
backdrop-filter: blur(20px) saturate(150%);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/* The loading bar's sliding segment (Progress with no value). */
|
|
364
|
+
@keyframes lumen-progress {
|
|
365
|
+
from {
|
|
366
|
+
transform: translateX(-100%);
|
|
367
|
+
}
|
|
368
|
+
to {
|
|
369
|
+
transform: translateX(250%);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/* Coverage cell states (LumenCoverageMap, LumenCoverageCalendarMap). */
|
|
374
|
+
@keyframes lumen-cov-run {
|
|
375
|
+
to {
|
|
376
|
+
background-position: 11.3px 0;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
@layer utilities {
|
|
381
|
+
.bg-gap-hatch {
|
|
382
|
+
background: repeating-linear-gradient(135deg, var(--gap) 0 3px, var(--gap-soft) 3px 6px);
|
|
383
|
+
}
|
|
384
|
+
.bg-cov-running {
|
|
385
|
+
background: repeating-linear-gradient(135deg, var(--cov-full) 0 4px, var(--cov-low) 4px 8px);
|
|
386
|
+
background-size: 11.3px 11.3px;
|
|
387
|
+
animation: lumen-cov-run 1s linear infinite;
|
|
388
|
+
}
|
|
389
|
+
.bg-cov-canceled {
|
|
390
|
+
background: linear-gradient(
|
|
391
|
+
135deg,
|
|
392
|
+
transparent 45%,
|
|
393
|
+
var(--muted-foreground) 45% 55%,
|
|
394
|
+
transparent 55%
|
|
395
|
+
), var(--muted);
|
|
396
|
+
}
|
|
397
|
+
@media (prefers-reduced-motion: reduce) {
|
|
398
|
+
.bg-cov-running {
|
|
399
|
+
animation: none;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
@layer base {
|
|
405
|
+
* {
|
|
406
|
+
@apply border-border outline-ring/50;
|
|
407
|
+
}
|
|
408
|
+
body {
|
|
409
|
+
@apply bg-background text-foreground antialiased;
|
|
410
|
+
}
|
|
411
|
+
html {
|
|
412
|
+
@apply font-sans;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.num {
|
|
416
|
+
font-family: var(--font-mono);
|
|
417
|
+
font-variant-numeric: tabular-nums;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/* Font and size: the size is the root every rem scales from. Unlayered, so
|
|
422
|
+
they beat :root above. */
|
|
423
|
+
:root[data-font="inter"] {
|
|
424
|
+
--app-font: "Inter Variable", Inter, ui-sans-serif, system-ui, sans-serif;
|
|
425
|
+
}
|
|
426
|
+
:root[data-font="plex"] {
|
|
427
|
+
--app-font: "IBM Plex Sans Variable", "IBM Plex Sans", ui-sans-serif, system-ui, sans-serif;
|
|
428
|
+
}
|
|
429
|
+
:root[data-font="system"] {
|
|
430
|
+
--app-font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
431
|
+
}
|
|
432
|
+
:root[data-font-size="small"] {
|
|
433
|
+
font-size: 15px;
|
|
434
|
+
}
|
|
435
|
+
:root[data-font-size="large"] {
|
|
436
|
+
font-size: 17px;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/* The assistant points at a card or a Settings row: two soft pulses of the edge colour. */
|
|
440
|
+
@keyframes assistant-point {
|
|
441
|
+
0%,
|
|
442
|
+
100% {
|
|
443
|
+
box-shadow: 0 0 0 0 transparent;
|
|
444
|
+
}
|
|
445
|
+
50% {
|
|
446
|
+
box-shadow: 0 0 0 3px var(--edge);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
[data-assistant-point] {
|
|
450
|
+
animation: assistant-point 1s ease-in-out 2;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/* Save with issues: the field Save took the person to flashes red once. */
|
|
454
|
+
@keyframes issue-flash {
|
|
455
|
+
0%,
|
|
456
|
+
100% {
|
|
457
|
+
box-shadow: 0 0 0 0 transparent;
|
|
458
|
+
}
|
|
459
|
+
30% {
|
|
460
|
+
box-shadow: 0 0 0 3px color-mix(in oklab, var(--destructive) 55%, transparent);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
[data-issue-flash] {
|
|
464
|
+
animation: issue-flash 1.2s ease-out 1;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/* LumenSelector spotlight: hovering an option that stands for a card dims the
|
|
468
|
+
page's other cards and tags the card by name; pointing does the same under the cursor. A sidebar
|
|
469
|
+
page gets the sidebar's muted fill. No border and no glow. */
|
|
470
|
+
body[data-spotlight="card"] [data-slot="lumen-card"]:not([data-spotlit]),
|
|
471
|
+
body[data-pointing] [data-slot="lumen-card"]:not([data-spotlit]) {
|
|
472
|
+
opacity: 0.3;
|
|
473
|
+
transition: opacity 120ms ease-out;
|
|
474
|
+
}
|
|
475
|
+
body[data-pointing],
|
|
476
|
+
body[data-pointing] [data-slot="lumen-card"] * {
|
|
477
|
+
cursor: crosshair;
|
|
478
|
+
}
|
|
479
|
+
body[data-spotlight="nav"] [data-spotlit] {
|
|
480
|
+
background: var(--sidebar-accent);
|
|
481
|
+
color: var(--sidebar-accent-foreground);
|
|
482
|
+
}
|
|
483
|
+
[data-slot="spotlight-tag"] {
|
|
484
|
+
position: fixed;
|
|
485
|
+
z-index: 80;
|
|
486
|
+
pointer-events: none;
|
|
487
|
+
display: flex;
|
|
488
|
+
align-items: center;
|
|
489
|
+
height: 1.5rem;
|
|
490
|
+
padding: 0 0.5rem;
|
|
491
|
+
border-radius: calc(var(--radius) * 0.6);
|
|
492
|
+
background: var(--foreground);
|
|
493
|
+
color: var(--background);
|
|
494
|
+
font-size: 0.75rem;
|
|
495
|
+
font-weight: 500;
|
|
496
|
+
white-space: nowrap;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/* LumenGrid: react-grid-layout's own rules, in the shell's tokens. */
|
|
500
|
+
.lumen-grid {
|
|
501
|
+
position: relative;
|
|
502
|
+
transition: height 200ms ease;
|
|
503
|
+
}
|
|
504
|
+
.lumen-grid > .react-grid-item {
|
|
505
|
+
transition: transform 200ms ease, width 200ms ease, height 200ms ease;
|
|
506
|
+
}
|
|
507
|
+
.lumen-grid > .react-grid-item.resizing,
|
|
508
|
+
.lumen-grid > .react-grid-item.react-draggable-dragging {
|
|
509
|
+
transition: none;
|
|
510
|
+
z-index: 40;
|
|
511
|
+
will-change: transform, width, height;
|
|
512
|
+
}
|
|
513
|
+
.lumen-grid > .react-grid-item.react-grid-placeholder {
|
|
514
|
+
z-index: 2;
|
|
515
|
+
border: 2px dashed color-mix(in oklab, var(--primary) 50%, transparent);
|
|
516
|
+
border-radius: var(--radius-xl);
|
|
517
|
+
background: color-mix(in oklab, var(--primary) 8%, transparent);
|
|
518
|
+
/* The cell's bottom gap is the gap between cards, not part of the card. */
|
|
519
|
+
clip-path: inset(0 0 12px 0 round var(--radius-xl));
|
|
520
|
+
transition-duration: 100ms;
|
|
521
|
+
user-select: none;
|
|
522
|
+
}
|
|
523
|
+
.lumen-grid > .react-grid-item > .react-resizable-handle {
|
|
524
|
+
display: none;
|
|
525
|
+
}
|
|
526
|
+
.lumen-grid-edit > .react-grid-item:not([data-locked]) > .react-resizable-handle {
|
|
527
|
+
display: block;
|
|
528
|
+
position: absolute;
|
|
529
|
+
right: 0;
|
|
530
|
+
bottom: 12px;
|
|
531
|
+
z-index: 35;
|
|
532
|
+
width: 20px;
|
|
533
|
+
height: 20px;
|
|
534
|
+
cursor: se-resize;
|
|
535
|
+
touch-action: none;
|
|
536
|
+
}
|
|
537
|
+
.lumen-grid > .react-grid-item > .react-resizable-handle::after {
|
|
538
|
+
content: "";
|
|
539
|
+
position: absolute;
|
|
540
|
+
right: 5px;
|
|
541
|
+
bottom: 5px;
|
|
542
|
+
width: 8px;
|
|
543
|
+
height: 8px;
|
|
544
|
+
border-right: 2px solid var(--muted-foreground);
|
|
545
|
+
border-bottom: 2px solid var(--muted-foreground);
|
|
546
|
+
border-bottom-right-radius: 2px;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
/* LumenCode: shiki's light and dark tokens; lines scroll sideways inside the block, numbered by a
|
|
550
|
+
CSS counter where asked (no hand-rolled viewer). */
|
|
551
|
+
@layer components {
|
|
552
|
+
.lumen-code pre {
|
|
553
|
+
margin: 0;
|
|
554
|
+
padding: 0.5rem 0.75rem;
|
|
555
|
+
background: transparent !important;
|
|
556
|
+
font-family: var(--font-mono);
|
|
557
|
+
counter-reset: line;
|
|
558
|
+
}
|
|
559
|
+
.lumen-code.lumen-code-numbers pre {
|
|
560
|
+
padding: 0.625rem 0;
|
|
561
|
+
}
|
|
562
|
+
.lumen-code .line {
|
|
563
|
+
white-space: pre;
|
|
564
|
+
}
|
|
565
|
+
.lumen-code.lumen-code-wrap .line {
|
|
566
|
+
white-space: pre-wrap;
|
|
567
|
+
word-break: break-word;
|
|
568
|
+
}
|
|
569
|
+
.lumen-code.lumen-code-numbers .line::before {
|
|
570
|
+
counter-increment: line;
|
|
571
|
+
content: counter(line);
|
|
572
|
+
display: inline-block;
|
|
573
|
+
width: 2.75rem;
|
|
574
|
+
padding-right: 0.875rem;
|
|
575
|
+
text-align: right;
|
|
576
|
+
color: var(--muted-foreground);
|
|
577
|
+
user-select: none;
|
|
578
|
+
}
|
|
579
|
+
.lumen-code .line span {
|
|
580
|
+
color: var(--shiki-light);
|
|
581
|
+
}
|
|
582
|
+
.dark .lumen-code .line span {
|
|
583
|
+
color: var(--shiki-dark);
|
|
584
|
+
}
|
|
585
|
+
.lumen-code-editor .cm-editor {
|
|
586
|
+
height: 100%;
|
|
587
|
+
font-family: var(--font-mono);
|
|
588
|
+
}
|
|
589
|
+
.lumen-code-editor .cm-editor.cm-focused {
|
|
590
|
+
outline: none;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/* An emoji picked as a tab or view icon: grey and dimmed like the line icons
|
|
595
|
+
beside it, full colour on the active tab or nav item and on hover. */
|
|
596
|
+
[data-slot="view-emoji"] {
|
|
597
|
+
filter: grayscale(1);
|
|
598
|
+
opacity: 0.6;
|
|
599
|
+
transition: filter 150ms, opacity 150ms;
|
|
600
|
+
}
|
|
601
|
+
[data-state="active"] [data-slot="view-emoji"],
|
|
602
|
+
[data-active="true"] [data-slot="view-emoji"],
|
|
603
|
+
:is(a, button):hover [data-slot="view-emoji"] {
|
|
604
|
+
filter: none;
|
|
605
|
+
opacity: 1;
|
|
606
|
+
}
|
package/dist/tile.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export declare function Tile({ label, value, caption, lines, className, valueClassName, }: {
|
|
3
|
+
label: ReactNode;
|
|
4
|
+
value: ReactNode;
|
|
5
|
+
caption?: ReactNode;
|
|
6
|
+
/** Secondary lines under the value, one each (a Summary card's). */
|
|
7
|
+
lines?: ReactNode[];
|
|
8
|
+
className?: string;
|
|
9
|
+
valueClassName?: string;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
/** Width of every header tile on desktop, toggle tiles and plain Tiles alike; shrinks to fit the row. */
|
|
12
|
+
export declare const TILE_WIDTH = "lg:w-(--tile-width) lg:flex-initial";
|
|
13
|
+
/** A page's header row of tiles: wraps on phones, one line on desktop. */
|
|
14
|
+
export declare function TileRow({ children, className, ...props }: {
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
className?: string;
|
|
17
|
+
'aria-label'?: string;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
export interface TileOption {
|
|
20
|
+
id: string;
|
|
21
|
+
label: string;
|
|
22
|
+
value: ReactNode;
|
|
23
|
+
caption?: ReactNode;
|
|
24
|
+
}
|
|
25
|
+
export declare function TileToggleGroup({ options, selected, onSelect, label, className, }: {
|
|
26
|
+
options: TileOption[];
|
|
27
|
+
selected: string;
|
|
28
|
+
onSelect: (id: string) => void;
|
|
29
|
+
/** Accessible name of the group. */
|
|
30
|
+
label: string;
|
|
31
|
+
className?: string;
|
|
32
|
+
}): import("react").JSX.Element;
|
|
33
|
+
/** A compact tile: a small caps label over one short value (a quote strip's IV, expiry and move). */
|
|
34
|
+
export declare function TileChip({ label, value }: {
|
|
35
|
+
label: ReactNode;
|
|
36
|
+
value: ReactNode;
|
|
37
|
+
}): import("react").JSX.Element;
|
package/dist/tile.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from './lib/utils.js';
|
|
3
|
+
import { Card } from './ui/card.js';
|
|
4
|
+
import { ToggleGroup, ToggleGroupItem } from './ui/toggle-group.js';
|
|
5
|
+
function TileBody({ label, value, caption, lines, valueClassName, }) {
|
|
6
|
+
return (_jsxs(_Fragment, { children: [_jsx("span", { className: "w-full truncate text-xs text-muted-foreground", children: label }), _jsx("span", { className: cn('num truncate text-xl leading-7 font-semibold', valueClassName), children: value }), caption ? (_jsx("span", { className: "num line-clamp-2 text-xs text-muted-foreground", children: caption })) : null, lines?.map((l, i) => (_jsx("span", { className: "num line-clamp-2 text-xs text-muted-foreground", children: l }, i)))] }));
|
|
7
|
+
}
|
|
8
|
+
export function Tile({ label, value, caption, lines, className, valueClassName, }) {
|
|
9
|
+
return (_jsx(Card, { size: "sm", className: cn('min-w-0 gap-0.5 px-3', className), children: _jsx(TileBody, { label: label, value: value, caption: caption, lines: lines, valueClassName: valueClassName }) }));
|
|
10
|
+
}
|
|
11
|
+
/** Width of every header tile on desktop, toggle tiles and plain Tiles alike; shrinks to fit the row. */
|
|
12
|
+
export const TILE_WIDTH = 'lg:w-(--tile-width) lg:flex-initial';
|
|
13
|
+
/** A page's header row of tiles: wraps on phones, one line on desktop. */
|
|
14
|
+
export function TileRow({ children, className, ...props }) {
|
|
15
|
+
return (_jsx("div", { className: cn('flex flex-wrap gap-2.5 lg:flex-nowrap', className), ...props, children: children }));
|
|
16
|
+
}
|
|
17
|
+
export function TileToggleGroup({ options, selected, onSelect, label, className, }) {
|
|
18
|
+
return (_jsx(Card, { size: "sm", className: cn('min-w-0 gap-0 bg-border py-0 lg:w-fit lg:flex-initial', className), children: _jsx(ToggleGroup, { type: "single", spacing: 0, value: selected, onValueChange: (v) => v && onSelect(v), "aria-label": label, className: "grid w-full grid-cols-[repeat(auto-fit,minmax(6.5rem,1fr))] gap-px lg:flex lg:w-fit", children: options.map((o) => (_jsx(ToggleGroupItem, { value: o.id, "aria-label": o.label, className: "h-auto min-w-0 flex-col lg:w-(--tile-width) lg:shrink items-start justify-start gap-0.5 rounded-none! bg-card px-3 py-3 text-left font-normal data-[state=on]:bg-primary/5 data-[state=on]:shadow-[inset_0_-2px_0_var(--primary)]", children: _jsx(TileBody, { label: o.label, value: o.value, caption: o.caption }) }, o.id))) }) }));
|
|
19
|
+
}
|
|
20
|
+
/** A compact tile: a small caps label over one short value (a quote strip's IV, expiry and move). */
|
|
21
|
+
export function TileChip({ label, value }) {
|
|
22
|
+
return (_jsxs(Card, { size: "sm", className: "min-w-0 gap-0 px-2.5 py-1.5", children: [_jsx("span", { className: "text-[10px] font-medium tracking-wide text-muted-foreground uppercase", children: label }), _jsx("span", { className: "num text-sm font-medium whitespace-nowrap", children: value })] }));
|
|
23
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AlertDialog as AlertDialogPrimitive } from 'radix-ui';
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
import { Button } from './button.js';
|
|
4
|
+
declare function AlertDialog({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Root>): React.JSX.Element;
|
|
5
|
+
declare function AlertDialogTrigger({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>): React.JSX.Element;
|
|
6
|
+
declare function AlertDialogPortal({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>): React.JSX.Element;
|
|
7
|
+
declare function AlertDialogOverlay({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>): React.JSX.Element;
|
|
8
|
+
declare function AlertDialogContent({ className, size, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {
|
|
9
|
+
size?: 'default' | 'sm';
|
|
10
|
+
}): React.JSX.Element;
|
|
11
|
+
declare function AlertDialogHeader({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
12
|
+
declare function AlertDialogFooter({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
13
|
+
declare function AlertDialogMedia({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
14
|
+
declare function AlertDialogTitle({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Title>): React.JSX.Element;
|
|
15
|
+
declare function AlertDialogDescription({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Description>): React.JSX.Element;
|
|
16
|
+
declare function AlertDialogAction({ className, variant, size, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Action> & Pick<React.ComponentProps<typeof Button>, 'variant' | 'size'>): React.JSX.Element;
|
|
17
|
+
declare function AlertDialogCancel({ className, variant, size, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> & Pick<React.ComponentProps<typeof Button>, 'variant' | 'size'>): React.JSX.Element;
|
|
18
|
+
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, };
|