react-os-shell 4.15.0 → 4.21.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/README.md +46 -0
- package/dist/{Browser-XV34CJFP.js → Browser-6ACRB3XK.js} +9 -6
- package/dist/Browser-6ACRB3XK.js.map +1 -0
- package/dist/{Calculator-FFCYNYU3.js → Calculator-QCAJ6ITI.js} +8 -5
- package/dist/Calculator-QCAJ6ITI.js.map +1 -0
- package/dist/ConfirmDialog-WAM5OKAV.js +3 -0
- package/dist/{ConfirmDialog-CXHJCDUL.js.map → ConfirmDialog-WAM5OKAV.js.map} +1 -1
- package/dist/{CurrencyConverter-3NCK7WY6.js → CurrencyConverter-PCYC6RL5.js} +8 -5
- package/dist/CurrencyConverter-PCYC6RL5.js.map +1 -0
- package/dist/{Documents-S6EQOLUF.js → Documents-XME7555L.js} +10 -7
- package/dist/Documents-XME7555L.js.map +1 -0
- package/dist/{Files-TFZNYXAH.js → Files-6Q4HZKZD.js} +16 -12
- package/dist/Files-6Q4HZKZD.js.map +1 -0
- package/dist/{Notepad-EAA6CXZX.js → Notepad-W6LXMKWD.js} +10 -7
- package/dist/Notepad-W6LXMKWD.js.map +1 -0
- package/dist/{PomodoroTimer-BXI752XM.js → PomodoroTimer-YABFEPEV.js} +10 -7
- package/dist/PomodoroTimer-YABFEPEV.js.map +1 -0
- package/dist/{Preview-ZKYM7A5X.js → Preview-TYJQ6ASR.js} +11 -8
- package/dist/Preview-TYJQ6ASR.js.map +1 -0
- package/dist/{Sidebar-IMACKSHS.js → Sidebar-B3LY5T2U.js} +5 -4
- package/dist/Sidebar-B3LY5T2U.js.map +1 -0
- package/dist/{Spreadsheet-BXOPROMB.js → Spreadsheet-TAO2PWRL.js} +10 -7
- package/dist/Spreadsheet-TAO2PWRL.js.map +1 -0
- package/dist/{Stock-BEQCSYNT.js → Stock-IPLLRUOC.js} +8 -5
- package/dist/Stock-IPLLRUOC.js.map +1 -0
- package/dist/{Weather-QPV6G7UN.js → Weather-SI5QN7X2.js} +8 -5
- package/dist/Weather-SI5QN7X2.js.map +1 -0
- package/dist/{WorldClock-I3ZE57V4.js → WorldClock-WYDSMUWX.js} +8 -5
- package/dist/WorldClock-WYDSMUWX.js.map +1 -0
- package/dist/apps/index.js +22 -19
- package/dist/apps/index.js.map +1 -1
- package/dist/chunk-22BNPLM4.js +46 -0
- package/dist/chunk-22BNPLM4.js.map +1 -0
- package/dist/{chunk-IVLDAUYM.js → chunk-3CUSBZWG.js} +3 -56
- package/dist/chunk-3CUSBZWG.js.map +1 -0
- package/dist/{chunk-VENYVK3L.js → chunk-4AKVHY4B.js} +48 -12
- package/dist/chunk-4AKVHY4B.js.map +1 -0
- package/dist/chunk-4OPGKWMT.js +7 -0
- package/dist/{chunk-F562QDVS.js.map → chunk-4OPGKWMT.js.map} +1 -1
- package/dist/chunk-C22EFSND.js +188 -0
- package/dist/chunk-C22EFSND.js.map +1 -0
- package/dist/{chunk-H4IEH6FK.js → chunk-EWDYCO65.js} +3 -3
- package/dist/{chunk-H4IEH6FK.js.map → chunk-EWDYCO65.js.map} +1 -1
- package/dist/{chunk-DINNWYVB.js → chunk-HYAW6KIL.js} +4 -45
- package/dist/chunk-HYAW6KIL.js.map +1 -0
- package/dist/{chunk-H3HFM4JQ.js → chunk-IGPSRRL7.js} +262 -712
- package/dist/chunk-IGPSRRL7.js.map +1 -0
- package/dist/chunk-L2O6B5KT.js +394 -0
- package/dist/chunk-L2O6B5KT.js.map +1 -0
- package/dist/{chunk-YS4ZW2P7.js → chunk-OI253GOA.js} +4 -4
- package/dist/{chunk-YS4ZW2P7.js.map → chunk-OI253GOA.js.map} +1 -1
- package/dist/{chunk-ZPCGIR62.js → chunk-OQ7GRU7G.js} +3 -3
- package/dist/{chunk-ZPCGIR62.js.map → chunk-OQ7GRU7G.js.map} +1 -1
- package/dist/{chunk-7J3HTJJ3.js → chunk-Q3AOIJ7B.js} +3 -3
- package/dist/{chunk-7J3HTJJ3.js.map → chunk-Q3AOIJ7B.js.map} +1 -1
- package/dist/{chunk-N2UW3CAS.js → chunk-QJS6RBH4.js} +3 -3
- package/dist/{chunk-N2UW3CAS.js.map → chunk-QJS6RBH4.js.map} +1 -1
- package/dist/chunk-UPGCISED.js +5015 -0
- package/dist/chunk-UPGCISED.js.map +1 -0
- package/dist/{chunk-LFTHOYKW.js → chunk-VX634UB2.js} +5 -5
- package/dist/{chunk-LFTHOYKW.js.map → chunk-VX634UB2.js.map} +1 -1
- package/dist/chunk-WNLPTLT6.js +56 -0
- package/dist/chunk-WNLPTLT6.js.map +1 -0
- package/dist/{chunk-QU5L5ZYM.js → chunk-X5PZYTAK.js} +3 -3
- package/dist/{chunk-QU5L5ZYM.js.map → chunk-X5PZYTAK.js.map} +1 -1
- package/dist/index-Czn1re5M.d.ts +1939 -0
- package/dist/index.d.ts +7 -1375
- package/dist/index.js +159 -4082
- package/dist/index.js.map +1 -1
- package/dist/shell.css +105 -0
- package/dist/styles.css +12 -501
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.js +11 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui.css +425 -0
- package/package.json +7 -2
- package/dist/Browser-XV34CJFP.js.map +0 -1
- package/dist/Calculator-FFCYNYU3.js.map +0 -1
- package/dist/ConfirmDialog-CXHJCDUL.js +0 -4
- package/dist/CurrencyConverter-3NCK7WY6.js.map +0 -1
- package/dist/Documents-S6EQOLUF.js.map +0 -1
- package/dist/Files-TFZNYXAH.js.map +0 -1
- package/dist/Notepad-EAA6CXZX.js.map +0 -1
- package/dist/PomodoroTimer-BXI752XM.js.map +0 -1
- package/dist/Preview-ZKYM7A5X.js.map +0 -1
- package/dist/Sidebar-IMACKSHS.js.map +0 -1
- package/dist/Spreadsheet-BXOPROMB.js.map +0 -1
- package/dist/Stock-BEQCSYNT.js.map +0 -1
- package/dist/Weather-QPV6G7UN.js.map +0 -1
- package/dist/WorldClock-I3ZE57V4.js.map +0 -1
- package/dist/chunk-DINNWYVB.js.map +0 -1
- package/dist/chunk-F562QDVS.js +0 -7
- package/dist/chunk-H3HFM4JQ.js.map +0 -1
- package/dist/chunk-IVLDAUYM.js.map +0 -1
- package/dist/chunk-VENYVK3L.js.map +0 -1
package/dist/shell.css
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* react-os-shell/shell.css — the window chrome half of the stylesheet.
|
|
3
|
+
*
|
|
4
|
+
* NOT a public subpath: it is reached only through `styles.css`, which imports
|
|
5
|
+
* it by relative path. Consumers take `styles.css` (shell + kit) or
|
|
6
|
+
* `ui.css` (kit alone).
|
|
7
|
+
*
|
|
8
|
+
* A rule lives here only if its selector is scoped to DOM the shell alone
|
|
9
|
+
* produces — [data-sticky-id], .glass-input-bg, .docs-editor — or if it
|
|
10
|
+
* declares a --window-* / --taskbar-* custom property. Everything whose
|
|
11
|
+
* selector is a bare utility class stays in ui.css, even where a comment
|
|
12
|
+
* mentions the taskbar: the cascade does not read comments, and a rule that
|
|
13
|
+
* names .text-gray-600 applies to every button in every app.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/* Glass input field — used by the start-menu search and any consumer that
|
|
17
|
+
* imports GLASS_INPUT_BG. Adapts to dark mode so the tile blends with the
|
|
18
|
+
* dark glass gradient instead of reading as a bright white panel that
|
|
19
|
+
* mismatches its frame. */
|
|
20
|
+
.glass-input-bg {
|
|
21
|
+
background-color: rgba(255, 255, 255, 0.15);
|
|
22
|
+
}
|
|
23
|
+
[data-theme="dark"] .glass-input-bg {
|
|
24
|
+
background-color: rgba(255, 255, 255, 0.06);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* Base theme colors for transparent windows.
|
|
28
|
+
*
|
|
29
|
+
* --window-accent-rgb (SG#00372) is deliberately NOT defined here: it is a
|
|
30
|
+
* per-window property, set inline on the panel element by Modal when the
|
|
31
|
+
* consumer passes `accentRgb` (see WindowManagerProvider's
|
|
32
|
+
* `windowAccentForRoute`). It paints only the thin accent stripe between the
|
|
33
|
+
* title bar and the body, and only when the user has switched that stripe on
|
|
34
|
+
* (the `window_accent_stripe` preference) — the header colours below and the
|
|
35
|
+
* user's custom header colour are never overridden by it. */
|
|
36
|
+
:root {
|
|
37
|
+
--window-header-rgb: 243 244 246;
|
|
38
|
+
--window-footer-rgb: 249 250 251;
|
|
39
|
+
--window-content-rgb: 255 255 255;
|
|
40
|
+
}
|
|
41
|
+
[data-theme="pink"] {
|
|
42
|
+
--window-header-rgb: 252 231 243;
|
|
43
|
+
--window-footer-rgb: 253 242 248;
|
|
44
|
+
--window-content-rgb: 255 245 249;
|
|
45
|
+
}
|
|
46
|
+
[data-theme="green"] {
|
|
47
|
+
--window-header-rgb: 220 252 231;
|
|
48
|
+
--window-footer-rgb: 236 253 245;
|
|
49
|
+
--window-content-rgb: 245 254 247;
|
|
50
|
+
}
|
|
51
|
+
[data-theme="grey"] {
|
|
52
|
+
--window-header-rgb: 229 231 235;
|
|
53
|
+
--window-footer-rgb: 243 244 246;
|
|
54
|
+
--window-content-rgb: 249 250 251;
|
|
55
|
+
}
|
|
56
|
+
[data-theme="blue"] {
|
|
57
|
+
--window-header-rgb: 219 234 254;
|
|
58
|
+
--window-footer-rgb: 239 246 255;
|
|
59
|
+
--window-content-rgb: 245 249 255;
|
|
60
|
+
}
|
|
61
|
+
[data-theme="dark"] {
|
|
62
|
+
--window-header-rgb: 49 50 68;
|
|
63
|
+
--window-footer-rgb: 24 24 37;
|
|
64
|
+
--window-content-rgb: 30 30 46;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Sticky notes — keep a solid coloured "paper" in dark mode. The bare .bg-*-100
|
|
68
|
+
overrides above mute these to a faint 18% status-pill tint (washed out) and
|
|
69
|
+
the note's black ink then can't be read. The [data-sticky-id] selector wins
|
|
70
|
+
on specificity: give each colour a muted dark paper and flip the ink to a
|
|
71
|
+
light tone. */
|
|
72
|
+
[data-theme="dark"] [data-sticky-id].bg-yellow-100 { background-color: #514a1f !important; border-color: #6e6330 !important; }
|
|
73
|
+
[data-theme="dark"] [data-sticky-id].bg-blue-100 { background-color: #1e3553 !important; border-color: #2f4d72 !important; }
|
|
74
|
+
[data-theme="dark"] [data-sticky-id].bg-green-100 { background-color: #1f4030 !important; border-color: #2f5c45 !important; }
|
|
75
|
+
[data-theme="dark"] [data-sticky-id].bg-pink-100 { background-color: #4d2339 !important; border-color: #6e3654 !important; }
|
|
76
|
+
[data-theme="dark"] [data-sticky-id].bg-purple-100 { background-color: #392555 !important; border-color: #4f3873 !important; }
|
|
77
|
+
[data-theme="dark"] [data-sticky-id].bg-orange-100 { background-color: #533619 !important; border-color: #6e4b27 !important; }
|
|
78
|
+
[data-theme="dark"] [data-sticky-id] .text-black\/70 { color: rgba(230, 233, 245, 0.92) !important; }
|
|
79
|
+
[data-theme="dark"] [data-sticky-id] .text-black\/30 { color: rgba(230, 233, 245, 0.45) !important; }
|
|
80
|
+
[data-theme="dark"] [data-sticky-id] .text-black\/20 { color: rgba(230, 233, 245, 0.42) !important; }
|
|
81
|
+
[data-theme="dark"] [data-sticky-id] .text-black\/15 { color: rgba(230, 233, 245, 0.35) !important; }
|
|
82
|
+
[data-theme="dark"] [data-sticky-id] .hover\:text-black\/50:hover { color: rgba(230, 233, 245, 0.70) !important; }
|
|
83
|
+
[data-theme="dark"] [data-sticky-id] .placeholder\:text-black\/30::placeholder { color: rgba(230, 233, 245, 0.45) !important; }
|
|
84
|
+
[data-theme="dark"] [data-sticky-id] .bg-black\/10 { background-color: rgba(230, 233, 245, 0.16) !important; }
|
|
85
|
+
[data-theme="dark"] [data-sticky-id] .hover\:bg-black\/20:hover { background-color: rgba(230, 233, 245, 0.26) !important; }
|
|
86
|
+
|
|
87
|
+
/* Window title colors — read by Modal.tsx */
|
|
88
|
+
[data-theme="dark"] {
|
|
89
|
+
--window-title-active: #cdd6f4;
|
|
90
|
+
--window-title-inactive: #6c7086;
|
|
91
|
+
--taskbar-bg-rgb: 24 24 37; /* Catppuccin mantle */
|
|
92
|
+
--taskbar-border-color: #313244;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Documents app — page content styling. The editor is a bare contenteditable
|
|
96
|
+
and Tailwind's preflight strips list markers and element margins, so
|
|
97
|
+
restore them for anything typed into or imported from a document; images
|
|
98
|
+
are click-to-resize (menu) and never overflow the page. */
|
|
99
|
+
.docs-editor ul { list-style: disc; padding-left: 1.5rem; margin: 0.25rem 0; }
|
|
100
|
+
.docs-editor ul ul { list-style: circle; }
|
|
101
|
+
.docs-editor ol { list-style: decimal; padding-left: 1.5rem; margin: 0.25rem 0; }
|
|
102
|
+
.docs-editor li { margin: 0.125rem 0; }
|
|
103
|
+
.docs-editor p { margin: 0 0 0.5rem; }
|
|
104
|
+
.docs-editor img { max-width: 100%; height: auto; cursor: pointer; }
|
|
105
|
+
.docs-editor img:hover { outline: 2px solid rgba(59, 130, 246, 0.45); outline-offset: 1px; }
|
package/dist/styles.css
CHANGED
|
@@ -1,511 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* react-os-shell base styles —
|
|
2
|
+
* react-os-shell base styles — the full stylesheet: UI kit + window chrome.
|
|
3
3
|
*
|
|
4
4
|
* Consumers import this once near their app entry:
|
|
5
5
|
*
|
|
6
|
-
* import
|
|
6
|
+
* import "react-os-shell/styles.css";
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* Since 4.16.0 this is an umbrella over two halves, so a consumer taking
|
|
9
|
+
* `react-os-shell/ui` can load `ui.css` alone and skip the window, taskbar,
|
|
10
|
+
* desktop and sticky-note rules it will never render. The rules, their order,
|
|
11
|
+
* and the resulting cascade are unchanged — no selector appears in both halves,
|
|
12
|
+
* so the split is order-independent (asserted by tests/cssSplit.test.ts).
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
* - :root variables for window header/footer/content tints
|
|
15
|
-
* - [data-theme="dark"] overrides for bg-/text-/border-/shadow-/divide-
|
|
16
|
-
* Tailwind utility classes so the desktop, modals, and start menu
|
|
17
|
-
* all stay readable on dark glass
|
|
18
|
-
* - Status-badge tone-downs (matches the 8 semantic groups in StatusBadge)
|
|
19
|
-
* - Scrollbar styling for editable grids and dark-mode containers
|
|
14
|
+
* Import EXACTLY ONE of this and ui.css. Taking both doubles every rule.
|
|
20
15
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* useTheme() offers all of them in every portal, so the remaps must exist
|
|
24
|
-
* wherever styles.css is loaded. themes.css is also exported standalone
|
|
25
|
-
* ("react-os-shell/themes.css") for consumers that import granularly.
|
|
16
|
+
* themes.css is imported by ui.css, and is also exported standalone
|
|
17
|
+
* ("react-os-shell/themes.css") for consumers that build their CSS granularly.
|
|
26
18
|
*/
|
|
27
19
|
|
|
28
20
|
@import "tailwindcss";
|
|
29
|
-
@import "./
|
|
30
|
-
|
|
31
|
-
/* Tailwind v4 doesn't scan node_modules by default — tell it to scan this
|
|
32
|
-
package's compiled JS so utility classes used in shell components get
|
|
33
|
-
generated when consumers import react-os-shell/styles.css. */
|
|
34
|
-
@source "./**/*.js";
|
|
35
|
-
|
|
36
|
-
/* Glass input field — used by the start-menu search and any consumer that
|
|
37
|
-
* imports GLASS_INPUT_BG. Adapts to dark mode so the tile blends with the
|
|
38
|
-
* dark glass gradient instead of reading as a bright white panel that
|
|
39
|
-
* mismatches its frame. */
|
|
40
|
-
.glass-input-bg {
|
|
41
|
-
background-color: rgba(255, 255, 255, 0.15);
|
|
42
|
-
}
|
|
43
|
-
[data-theme="dark"] .glass-input-bg {
|
|
44
|
-
background-color: rgba(255, 255, 255, 0.06);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/* ── Reduce transparency (Preferences → Customization) ──────────────────────
|
|
48
|
-
* When the user turns on "Reduce transparency", Layout adds this class to
|
|
49
|
-
* <html>. Two effects, applied globally so every present-and-future glass
|
|
50
|
-
* surface is covered without per-component edits:
|
|
51
|
-
* 1. Force every window/taskbar/menu opacity variable fully opaque, so the
|
|
52
|
-
* surfaces that tint via `rgb(... / var(--*-opacity))` become solid. The
|
|
53
|
-
* `!important` beats Layout's inline (non-important) custom-property writes.
|
|
54
|
-
* 2. Strip backdrop-filter everywhere — the blur is the GPU-expensive part on
|
|
55
|
-
* older machines. `!important` overrides both Tailwind `backdrop-blur-*`
|
|
56
|
-
* utilities and inline `backdropFilter` from glassStyle(). glassStyle()
|
|
57
|
-
* also returns a solid background under this class so menus/popups don't
|
|
58
|
-
* read as washed-out translucent panels once the blur is gone. */
|
|
59
|
-
html.rosh-reduce-transparency {
|
|
60
|
-
--active-header-opacity: 1 !important;
|
|
61
|
-
--active-content-opacity: 1 !important;
|
|
62
|
-
--inactive-header-opacity: 1 !important;
|
|
63
|
-
--inactive-content-opacity: 1 !important;
|
|
64
|
-
--menu-opacity: 1 !important;
|
|
65
|
-
--taskbar-opacity: 1 !important;
|
|
66
|
-
}
|
|
67
|
-
html.rosh-reduce-transparency *,
|
|
68
|
-
html.rosh-reduce-transparency *::before,
|
|
69
|
-
html.rosh-reduce-transparency *::after {
|
|
70
|
-
backdrop-filter: none !important;
|
|
71
|
-
-webkit-backdrop-filter: none !important;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/* Base theme colors for transparent windows.
|
|
75
|
-
*
|
|
76
|
-
* --window-accent-rgb (SG#00372) is deliberately NOT defined here: it is a
|
|
77
|
-
* per-window property, set inline on the panel element by Modal when the
|
|
78
|
-
* consumer passes `accentRgb` (see WindowManagerProvider's
|
|
79
|
-
* `windowAccentForRoute`). It paints only the thin accent stripe between the
|
|
80
|
-
* title bar and the body, and only when the user has switched that stripe on
|
|
81
|
-
* (the `window_accent_stripe` preference) — the header colours below and the
|
|
82
|
-
* user's custom header colour are never overridden by it. */
|
|
83
|
-
:root {
|
|
84
|
-
--window-header-rgb: 243 244 246;
|
|
85
|
-
--window-footer-rgb: 249 250 251;
|
|
86
|
-
--window-content-rgb: 255 255 255;
|
|
87
|
-
}
|
|
88
|
-
[data-theme="pink"] {
|
|
89
|
-
--window-header-rgb: 252 231 243;
|
|
90
|
-
--window-footer-rgb: 253 242 248;
|
|
91
|
-
--window-content-rgb: 255 245 249;
|
|
92
|
-
}
|
|
93
|
-
[data-theme="green"] {
|
|
94
|
-
--window-header-rgb: 220 252 231;
|
|
95
|
-
--window-footer-rgb: 236 253 245;
|
|
96
|
-
--window-content-rgb: 245 254 247;
|
|
97
|
-
}
|
|
98
|
-
[data-theme="grey"] {
|
|
99
|
-
--window-header-rgb: 229 231 235;
|
|
100
|
-
--window-footer-rgb: 243 244 246;
|
|
101
|
-
--window-content-rgb: 249 250 251;
|
|
102
|
-
}
|
|
103
|
-
[data-theme="blue"] {
|
|
104
|
-
--window-header-rgb: 219 234 254;
|
|
105
|
-
--window-footer-rgb: 239 246 255;
|
|
106
|
-
--window-content-rgb: 245 249 255;
|
|
107
|
-
}
|
|
108
|
-
[data-theme="dark"] {
|
|
109
|
-
--window-header-rgb: 49 50 68;
|
|
110
|
-
--window-footer-rgb: 24 24 37;
|
|
111
|
-
--window-content-rgb: 30 30 46;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/* ═══════════════════════════════════════════════════
|
|
115
|
-
Theme: Dark
|
|
116
|
-
═══════════════════════════════════════════════════ */
|
|
117
|
-
[data-theme="dark"] {
|
|
118
|
-
color-scheme: dark;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/* Backgrounds */
|
|
122
|
-
[data-theme="dark"] .bg-white { background-color: #1e1e2e !important; }
|
|
123
|
-
[data-theme="dark"] .bg-gray-50 { background-color: #181825 !important; }
|
|
124
|
-
[data-theme="dark"] .bg-gray-100 { background-color: #1e1e2e !important; }
|
|
125
|
-
[data-theme="dark"] .bg-gray-200 { background-color: #313244 !important; }
|
|
126
|
-
|
|
127
|
-
/* Text */
|
|
128
|
-
[data-theme="dark"] .text-gray-900 { color: #cdd6f4 !important; }
|
|
129
|
-
[data-theme="dark"] .text-gray-800 { color: #bac2de !important; }
|
|
130
|
-
[data-theme="dark"] .text-gray-700 { color: #a6adc8 !important; }
|
|
131
|
-
[data-theme="dark"] .text-gray-600 { color: #9399b2 !important; }
|
|
132
|
-
[data-theme="dark"] .text-gray-500 { color: #7f849c !important; }
|
|
133
|
-
[data-theme="dark"] .text-gray-400 { color: #6c7086 !important; }
|
|
134
|
-
|
|
135
|
-
/* Borders */
|
|
136
|
-
[data-theme="dark"] .border-gray-200 { border-color: #313244 !important; }
|
|
137
|
-
[data-theme="dark"] .border-gray-300 { border-color: #45475a !important; }
|
|
138
|
-
[data-theme="dark"] .border-gray-100 { border-color: #2a2a3c !important; }
|
|
139
|
-
|
|
140
|
-
/* Cards, shadows, tables */
|
|
141
|
-
[data-theme="dark"] .shadow { --tw-shadow-color: rgba(0,0,0,0.4) !important; }
|
|
142
|
-
[data-theme="dark"] .shadow-lg { --tw-shadow-color: rgba(0,0,0,0.5) !important; }
|
|
143
|
-
[data-theme="dark"] .shadow-xl { --tw-shadow-color: rgba(0,0,0,0.5) !important; }
|
|
144
|
-
[data-theme="dark"] .shadow-2xl { --tw-shadow-color: rgba(0,0,0,0.6) !important; }
|
|
145
|
-
[data-theme="dark"] .divide-gray-200 > :not(:last-child) { border-color: #313244 !important; }
|
|
146
|
-
[data-theme="dark"] .divide-gray-100 > :not(:last-child) { border-color: #2a2a3c !important; }
|
|
147
|
-
|
|
148
|
-
/* Hover states */
|
|
149
|
-
[data-theme="dark"] .hover\:bg-gray-50:hover { background-color: #2a2a3c !important; }
|
|
150
|
-
[data-theme="dark"] .hover\:bg-gray-100:hover { background-color: #313244 !important; }
|
|
151
|
-
[data-theme="dark"] .hover\:bg-gray-200:hover { background-color: #45475a !important; }
|
|
152
|
-
|
|
153
|
-
/* Blue hover states — used by menu items, profile row, etc.
|
|
154
|
-
In dark mode swap the near-white bg for a dark blue tint and the dark
|
|
155
|
-
blue text for a light shade so highlighted items stay readable. */
|
|
156
|
-
[data-theme="dark"] .bg-blue-50,
|
|
157
|
-
[data-theme="dark"] .hover\:bg-blue-50:hover { background-color: rgba(59, 130, 246, 0.26) !important; }
|
|
158
|
-
[data-theme="dark"] .text-blue-700,
|
|
159
|
-
[data-theme="dark"] .hover\:text-blue-700:hover { color: #bfdbfe !important; }
|
|
160
|
-
[data-theme="dark"] .text-blue-600 { color: #93c5fd !important; }
|
|
161
|
-
[data-theme="dark"] .text-blue-800 { color: #bfdbfe !important; }
|
|
162
|
-
|
|
163
|
-
/* Bare *-100 highlight backgrounds + *-700 text (status pills, badges, avatars,
|
|
164
|
-
dialog icons) have no dark override otherwise, so they keep their bright
|
|
165
|
-
light-mode value and wash out the text on top. Mute the background to a low
|
|
166
|
-
tint and lighten the text so highlighted content stays readable in dark mode. */
|
|
167
|
-
[data-theme="dark"] .bg-blue-100 { background-color: rgba(59, 130, 246, 0.22) !important; }
|
|
168
|
-
|
|
169
|
-
/* Tailwind's `!` important modifier compiles to distinct class names
|
|
170
|
-
(`.\!bg-blue-100` etc.), so the EditableGrid selection utilities escape the
|
|
171
|
-
remaps above: the selection keeps its light-mode background while the cell
|
|
172
|
-
text goes light, making selected cells unreadable in dark mode. The
|
|
173
|
-
attribute selector outranks the utility's own !important. */
|
|
174
|
-
[data-theme="dark"] .\!bg-blue-50 { background-color: rgba(59, 130, 246, 0.26) !important; }
|
|
175
|
-
[data-theme="dark"] .\!bg-blue-100 { background-color: rgba(59, 130, 246, 0.22) !important; }
|
|
176
|
-
[data-theme="dark"] .\!bg-blue-200 { background-color: rgba(59, 130, 246, 0.35) !important; }
|
|
177
|
-
[data-theme="dark"] .\!text-gray-700 { color: #a6adc8 !important; }
|
|
178
|
-
[data-theme="dark"] .bg-green-100 { background-color: rgba(34, 197, 94, 0.18) !important; }
|
|
179
|
-
[data-theme="dark"] .bg-emerald-100 { background-color: rgba(16, 185, 129, 0.18) !important; }
|
|
180
|
-
[data-theme="dark"] .bg-sky-100 { background-color: rgba(14, 165, 233, 0.18) !important; }
|
|
181
|
-
[data-theme="dark"] .bg-amber-100 { background-color: rgba(245, 158, 11, 0.18) !important; }
|
|
182
|
-
[data-theme="dark"] .bg-yellow-100 { background-color: rgba(234, 179, 8, 0.18) !important; }
|
|
183
|
-
[data-theme="dark"] .bg-orange-100 { background-color: rgba(249, 115, 22, 0.18) !important; }
|
|
184
|
-
[data-theme="dark"] .bg-red-100 { background-color: rgba(239, 68, 68, 0.18) !important; }
|
|
185
|
-
[data-theme="dark"] .bg-indigo-100 { background-color: rgba(99, 102, 241, 0.18) !important; }
|
|
186
|
-
[data-theme="dark"] .bg-purple-100 { background-color: rgba(168, 85, 247, 0.18) !important; }
|
|
187
|
-
[data-theme="dark"] .text-green-700 { color: #86efac !important; }
|
|
188
|
-
[data-theme="dark"] .text-emerald-700 { color: #6ee7b7 !important; }
|
|
189
|
-
[data-theme="dark"] .text-sky-700 { color: #7dd3fc !important; }
|
|
190
|
-
[data-theme="dark"] .text-amber-700 { color: #fcd34d !important; }
|
|
191
|
-
[data-theme="dark"] .text-yellow-700 { color: #fde047 !important; }
|
|
192
|
-
[data-theme="dark"] .text-orange-700 { color: #fdba74 !important; }
|
|
193
|
-
[data-theme="dark"] .text-red-700 { color: #fca5a5 !important; }
|
|
194
|
-
[data-theme="dark"] .text-indigo-700 { color: #a5b4fc !important; }
|
|
195
|
-
[data-theme="dark"] .text-purple-700 { color: #d8b4fe !important; }
|
|
196
|
-
|
|
197
|
-
/* Brighten taskbar button text so it stays readable on dark glass.
|
|
198
|
-
The default override (#9399b2) is too dim for short button labels. */
|
|
199
|
-
[data-theme="dark"] .text-gray-600 { color: #a6adc8 !important; }
|
|
200
|
-
|
|
201
|
-
/* Translucent button backgrounds — Tailwind generates separate classes for the
|
|
202
|
-
/40 /60 alpha variants (bg-gray-50\/40 etc.) so the bare .bg-gray-50 override
|
|
203
|
-
doesn't match. Override them explicitly with dark equivalents so taskbar
|
|
204
|
-
tabs and the start-menu button don't look too bright in Dark mode. */
|
|
205
|
-
[data-theme="dark"] .bg-gray-50\/40 { background-color: rgba(24, 24, 37, 0.4) !important; }
|
|
206
|
-
/* /50 and /60 are used as in-window PANEL surfaces (sidebars, form sections,
|
|
207
|
-
popup cards) — keep them solid in dark so a bright wallpaper can't bleed
|
|
208
|
-
through the window glass and wash them out. */
|
|
209
|
-
[data-theme="dark"] .bg-gray-50\/50 { background-color: #181825 !important; }
|
|
210
|
-
[data-theme="dark"] .bg-gray-50\/60 { background-color: #181825 !important; }
|
|
211
|
-
[data-theme="dark"] .hover\:bg-gray-50\/50:hover { background-color: #181825 !important; }
|
|
212
|
-
[data-theme="dark"] .bg-gray-100\/40 { background-color: rgba(30, 30, 46, 0.4) !important; }
|
|
213
|
-
[data-theme="dark"] .bg-gray-100\/60 { background-color: rgba(30, 30, 46, 0.6) !important; }
|
|
214
|
-
[data-theme="dark"] .bg-gray-200\/40 { background-color: rgba(49, 50, 68, 0.4) !important; }
|
|
215
|
-
[data-theme="dark"] .bg-gray-200\/50 { background-color: rgba(49, 50, 68, 0.5) !important; }
|
|
216
|
-
[data-theme="dark"] .bg-blue-100\/60 { background-color: rgba(59, 130, 246, 0.22) !important; }
|
|
217
|
-
/* Pale-blue tinted panels (selected rows, inline-reply box) — scale the
|
|
218
|
-
.bg-blue-50 dark tint (0.26) down through the alpha steps. */
|
|
219
|
-
[data-theme="dark"] .bg-blue-50\/30 { background-color: rgba(59, 130, 246, 0.10) !important; }
|
|
220
|
-
[data-theme="dark"] .bg-blue-50\/40 { background-color: rgba(59, 130, 246, 0.12) !important; }
|
|
221
|
-
[data-theme="dark"] .bg-blue-50\/50 { background-color: rgba(59, 130, 246, 0.15) !important; }
|
|
222
|
-
[data-theme="dark"] .bg-blue-50\/60 { background-color: rgba(59, 130, 246, 0.18) !important; }
|
|
223
|
-
[data-theme="dark"] .border-gray-200\/40 { border-color: rgba(69, 71, 90, 0.4) !important; }
|
|
224
|
-
[data-theme="dark"] .border-gray-300\/40 { border-color: rgba(88, 91, 112, 0.4) !important; }
|
|
225
|
-
[data-theme="dark"] .border-blue-400\/60 { border-color: rgba(96, 165, 250, 0.45) !important; }
|
|
226
|
-
[data-theme="dark"] .hover\:bg-gray-200\/40:hover { background-color: rgba(49, 50, 68, 0.4) !important; }
|
|
227
|
-
|
|
228
|
-
/* White alpha variants — the bare .bg-white override doesn't match the /50../95
|
|
229
|
-
alpha classes, so cards (the Widget gallery), the Exposé snapshot title pill
|
|
230
|
-
and desktop overlays stayed bright white in dark mode while their (remapped,
|
|
231
|
-
light) text washed out. Map them to the dark window tint. */
|
|
232
|
-
[data-theme="dark"] .bg-white\/50 { background-color: rgba(30, 30, 46, 0.5) !important; }
|
|
233
|
-
[data-theme="dark"] .bg-white\/60 { background-color: rgba(30, 30, 46, 0.6) !important; }
|
|
234
|
-
[data-theme="dark"] .bg-white\/70 { background-color: rgba(30, 30, 46, 0.7) !important; }
|
|
235
|
-
[data-theme="dark"] .bg-white\/80 { background-color: rgba(30, 30, 46, 0.85) !important; }
|
|
236
|
-
[data-theme="dark"] .bg-white\/90 { background-color: rgba(30, 30, 46, 0.92) !important; }
|
|
237
|
-
[data-theme="dark"] .bg-white\/95 { background-color: rgba(30, 30, 46, 0.95) !important; }
|
|
238
|
-
[data-theme="dark"] .bg-blue-50\/70 { background-color: rgba(59, 130, 246, 0.22) !important; }
|
|
239
|
-
|
|
240
|
-
/* Sticky notes — keep a solid coloured "paper" in dark mode. The bare .bg-*-100
|
|
241
|
-
overrides above mute these to a faint 18% status-pill tint (washed out) and
|
|
242
|
-
the note's black ink then can't be read. The [data-sticky-id] selector wins
|
|
243
|
-
on specificity: give each colour a muted dark paper and flip the ink to a
|
|
244
|
-
light tone. */
|
|
245
|
-
[data-theme="dark"] [data-sticky-id].bg-yellow-100 { background-color: #514a1f !important; border-color: #6e6330 !important; }
|
|
246
|
-
[data-theme="dark"] [data-sticky-id].bg-blue-100 { background-color: #1e3553 !important; border-color: #2f4d72 !important; }
|
|
247
|
-
[data-theme="dark"] [data-sticky-id].bg-green-100 { background-color: #1f4030 !important; border-color: #2f5c45 !important; }
|
|
248
|
-
[data-theme="dark"] [data-sticky-id].bg-pink-100 { background-color: #4d2339 !important; border-color: #6e3654 !important; }
|
|
249
|
-
[data-theme="dark"] [data-sticky-id].bg-purple-100 { background-color: #392555 !important; border-color: #4f3873 !important; }
|
|
250
|
-
[data-theme="dark"] [data-sticky-id].bg-orange-100 { background-color: #533619 !important; border-color: #6e4b27 !important; }
|
|
251
|
-
[data-theme="dark"] [data-sticky-id] .text-black\/70 { color: rgba(230, 233, 245, 0.92) !important; }
|
|
252
|
-
[data-theme="dark"] [data-sticky-id] .text-black\/30 { color: rgba(230, 233, 245, 0.45) !important; }
|
|
253
|
-
[data-theme="dark"] [data-sticky-id] .text-black\/20 { color: rgba(230, 233, 245, 0.42) !important; }
|
|
254
|
-
[data-theme="dark"] [data-sticky-id] .text-black\/15 { color: rgba(230, 233, 245, 0.35) !important; }
|
|
255
|
-
[data-theme="dark"] [data-sticky-id] .hover\:text-black\/50:hover { color: rgba(230, 233, 245, 0.70) !important; }
|
|
256
|
-
[data-theme="dark"] [data-sticky-id] .placeholder\:text-black\/30::placeholder { color: rgba(230, 233, 245, 0.45) !important; }
|
|
257
|
-
[data-theme="dark"] [data-sticky-id] .bg-black\/10 { background-color: rgba(230, 233, 245, 0.16) !important; }
|
|
258
|
-
[data-theme="dark"] [data-sticky-id] .hover\:bg-black\/20:hover { background-color: rgba(230, 233, 245, 0.26) !important; }
|
|
259
|
-
|
|
260
|
-
/* Inputs — apply the form-input dark styling, but skip elements that
|
|
261
|
-
explicitly opt into a transparent background (e.g. the start-menu
|
|
262
|
-
search) so they keep their parent's frosted-glass tile. */
|
|
263
|
-
[data-theme="dark"] input:not(.bg-transparent):not([type="checkbox"]):not([type="radio"]):not([type="color"]):not([type="file"]),
|
|
264
|
-
[data-theme="dark"] select:not(.bg-transparent),
|
|
265
|
-
[data-theme="dark"] textarea:not(.bg-transparent) {
|
|
266
|
-
background-color: #181825 !important;
|
|
267
|
-
border-color: #45475a !important;
|
|
268
|
-
color: #cdd6f4 !important;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
/* iOS auto-zooms the viewport when a focused form control's computed
|
|
272
|
-
font-size is below 16px. On phones/tablets (same breakpoint as
|
|
273
|
-
useIsMobile) pin text-bearing controls to 16px so focusing them never
|
|
274
|
-
triggers the zoom. This keeps pinch-zoom working, unlike a
|
|
275
|
-
`maximum-scale=1` viewport lock. !important beats Tailwind text-*
|
|
276
|
-
utilities; the :not() list mirrors the dark-input rule above and skips
|
|
277
|
-
controls that don't take a text caret. */
|
|
278
|
-
@media (max-width: 767px), (pointer: coarse) {
|
|
279
|
-
input:not([type="checkbox"]):not([type="radio"]):not([type="color"]):not([type="file"]),
|
|
280
|
-
select,
|
|
281
|
-
textarea {
|
|
282
|
-
font-size: 16px !important;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/* Window title colors — read by Modal.tsx */
|
|
287
|
-
[data-theme="dark"] {
|
|
288
|
-
--window-title-active: #cdd6f4;
|
|
289
|
-
--window-title-inactive: #6c7086;
|
|
290
|
-
--taskbar-bg-rgb: 24 24 37; /* Catppuccin mantle */
|
|
291
|
-
--taskbar-border-color: #313244;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/* Status badges — tone down brightness in dark mode (matches StatusBadge.tsx semantic groups) */
|
|
295
|
-
[data-theme="dark"] .bg-gray-100.text-gray-800 { background-color: #313244 !important; color: #a6adc8 !important; }
|
|
296
|
-
[data-theme="dark"] .bg-gray-300.text-gray-800 { background-color: #45475a !important; color: #cdd6f4 !important; }
|
|
297
|
-
[data-theme="dark"] .bg-green-100.text-green-800 { background-color: rgba(34, 197, 94, 0.18) !important; color: #86efac !important; }
|
|
298
|
-
[data-theme="dark"] .bg-blue-100.text-blue-800 { background-color: rgba(59, 130, 246, 0.18) !important; color: #93c5fd !important; }
|
|
299
|
-
[data-theme="dark"] .bg-indigo-100.text-indigo-800 { background-color: rgba(99, 102, 241, 0.18) !important; color: #a5b4fc !important; }
|
|
300
|
-
[data-theme="dark"] .bg-sky-100.text-sky-800 { background-color: rgba(14, 165, 233, 0.18) !important; color: #7dd3fc !important; }
|
|
301
|
-
[data-theme="dark"] .bg-yellow-100.text-yellow-800 { background-color: rgba(234, 179, 8, 0.18) !important; color: #fde68a !important; }
|
|
302
|
-
[data-theme="dark"] .bg-orange-100.text-orange-800 { background-color: rgba(249, 115, 22, 0.18) !important; color: #fdba74 !important; }
|
|
303
|
-
[data-theme="dark"] .bg-red-100.text-red-800 { background-color: rgba(239, 68, 68, 0.18) !important; color: #fca5a5 !important; }
|
|
304
|
-
|
|
305
|
-
/* ── Extended dark-mode tint families ────────────────────────────────
|
|
306
|
-
Upstreamed 2026-06-13 from the admin portal's 2026-06-10 audit so all
|
|
307
|
-
consumers share one source of truth. Every hue used by chips/badges
|
|
308
|
-
(tag colors, group colors, status accents, deal stages), notice
|
|
309
|
-
banners, verdict panels, row tints and danger buttons gets the same
|
|
310
|
-
scale as the families above: -50 → 10% tint, -100 → 18%, -200 → ~30%,
|
|
311
|
-
borders -200 → 32% / -300 → 45%, and dark inks flip to the
|
|
312
|
-
-400/-300/-200 light end of their scale.
|
|
313
|
-
Deliberately NOT remapped: game surfaces that read as intentionally
|
|
314
|
-
light (Calculator LCD bg-slate-200/text-slate-600/800, 2048/Chess
|
|
315
|
-
tiles, weather gradients), the Customization theme-preview swatches
|
|
316
|
-
(bg-pink-50/90, bg-green-50/90, bg-blue-50/90, bg-gray-200/90,
|
|
317
|
-
bg-pink-200, bg-green-200 — they must show each theme's real colors),
|
|
318
|
-
and low white/black alphas used as glass highlights on wallpaper. */
|
|
319
|
-
|
|
320
|
-
/* Red */
|
|
321
|
-
[data-theme="dark"] .bg-red-50 { background-color: rgba(239, 68, 68, 0.10) !important; }
|
|
322
|
-
[data-theme="dark"] .hover\:bg-red-50:hover { background-color: rgba(239, 68, 68, 0.16) !important; }
|
|
323
|
-
[data-theme="dark"] .active\:bg-red-50:active { background-color: rgba(239, 68, 68, 0.16) !important; }
|
|
324
|
-
[data-theme="dark"] .bg-red-50\/30 { background-color: rgba(239, 68, 68, 0.06) !important; }
|
|
325
|
-
[data-theme="dark"] .bg-red-50\/50 { background-color: rgba(239, 68, 68, 0.08) !important; }
|
|
326
|
-
[data-theme="dark"] .hover\:bg-red-100:hover { background-color: rgba(239, 68, 68, 0.22) !important; }
|
|
327
|
-
[data-theme="dark"] .border-red-200 { border-color: rgba(239, 68, 68, 0.35) !important; }
|
|
328
|
-
[data-theme="dark"] .border-red-300,
|
|
329
|
-
[data-theme="dark"] .hover\:border-red-300:hover { border-color: rgba(239, 68, 68, 0.45) !important; }
|
|
330
|
-
[data-theme="dark"] .text-red-600,
|
|
331
|
-
[data-theme="dark"] .hover\:text-red-600:hover { color: #f87171 !important; }
|
|
332
|
-
[data-theme="dark"] .hover\:text-red-700:hover { color: #fca5a5 !important; }
|
|
333
|
-
[data-theme="dark"] .text-red-800,
|
|
334
|
-
[data-theme="dark"] .hover\:text-red-800:hover { color: #fecaca !important; }
|
|
335
|
-
[data-theme="dark"] .text-red-900 { color: #fecaca !important; }
|
|
336
|
-
|
|
337
|
-
/* Amber */
|
|
338
|
-
[data-theme="dark"] .bg-amber-50 { background-color: rgba(245, 158, 11, 0.10) !important; }
|
|
339
|
-
[data-theme="dark"] .hover\:bg-amber-50:hover { background-color: rgba(245, 158, 11, 0.14) !important; }
|
|
340
|
-
[data-theme="dark"] .bg-amber-50\/30 { background-color: rgba(245, 158, 11, 0.06) !important; }
|
|
341
|
-
[data-theme="dark"] .bg-amber-50\/40 { background-color: rgba(245, 158, 11, 0.07) !important; }
|
|
342
|
-
[data-theme="dark"] .bg-amber-50\/50 { background-color: rgba(245, 158, 11, 0.08) !important; }
|
|
343
|
-
[data-theme="dark"] .hover\:bg-amber-100:hover { background-color: rgba(245, 158, 11, 0.24) !important; }
|
|
344
|
-
[data-theme="dark"] .bg-amber-200 { background-color: rgba(245, 158, 11, 0.28) !important; }
|
|
345
|
-
[data-theme="dark"] .border-amber-200 { border-color: rgba(245, 158, 11, 0.35) !important; }
|
|
346
|
-
[data-theme="dark"] .border-amber-300,
|
|
347
|
-
[data-theme="dark"] .hover\:border-amber-300:hover { border-color: rgba(245, 158, 11, 0.45) !important; }
|
|
348
|
-
[data-theme="dark"] .text-amber-600,
|
|
349
|
-
[data-theme="dark"] .hover\:text-amber-600:hover { color: #fbbf24 !important; }
|
|
350
|
-
[data-theme="dark"] .text-amber-800 { color: #fde68a !important; }
|
|
351
|
-
[data-theme="dark"] .text-amber-900 { color: #fde68a !important; }
|
|
352
|
-
|
|
353
|
-
/* Yellow */
|
|
354
|
-
[data-theme="dark"] .bg-yellow-50 { background-color: rgba(234, 179, 8, 0.10) !important; }
|
|
355
|
-
[data-theme="dark"] .bg-yellow-50\/50 { background-color: rgba(234, 179, 8, 0.08) !important; }
|
|
356
|
-
[data-theme="dark"] .border-yellow-200 { border-color: rgba(234, 179, 8, 0.35) !important; }
|
|
357
|
-
[data-theme="dark"] .border-yellow-300 { border-color: rgba(234, 179, 8, 0.45) !important; }
|
|
358
|
-
[data-theme="dark"] .text-yellow-600,
|
|
359
|
-
[data-theme="dark"] .hover\:text-yellow-600:hover { color: #facc15 !important; }
|
|
360
|
-
[data-theme="dark"] .text-yellow-900 { color: #fef08a !important; }
|
|
361
|
-
|
|
362
|
-
/* Green / emerald */
|
|
363
|
-
[data-theme="dark"] .bg-green-50 { background-color: rgba(34, 197, 94, 0.10) !important; }
|
|
364
|
-
[data-theme="dark"] .hover\:bg-green-50:hover { background-color: rgba(34, 197, 94, 0.14) !important; }
|
|
365
|
-
[data-theme="dark"] .bg-green-50\/40 { background-color: rgba(34, 197, 94, 0.06) !important; }
|
|
366
|
-
[data-theme="dark"] .border-green-200 { border-color: rgba(34, 197, 94, 0.32) !important; }
|
|
367
|
-
[data-theme="dark"] .border-green-300,
|
|
368
|
-
[data-theme="dark"] .hover\:border-green-300:hover { border-color: rgba(34, 197, 94, 0.45) !important; }
|
|
369
|
-
[data-theme="dark"] .text-green-600,
|
|
370
|
-
[data-theme="dark"] .hover\:text-green-600:hover { color: #4ade80 !important; }
|
|
371
|
-
[data-theme="dark"] .text-green-900,
|
|
372
|
-
[data-theme="dark"] .hover\:text-green-800:hover { color: #bbf7d0 !important; }
|
|
373
|
-
[data-theme="dark"] .bg-emerald-50 { background-color: rgba(16, 185, 129, 0.10) !important; }
|
|
374
|
-
[data-theme="dark"] .hover\:bg-emerald-100:hover { background-color: rgba(16, 185, 129, 0.24) !important; }
|
|
375
|
-
[data-theme="dark"] .border-emerald-200 { border-color: rgba(16, 185, 129, 0.32) !important; }
|
|
376
|
-
[data-theme="dark"] .border-emerald-300 { border-color: rgba(16, 185, 129, 0.45) !important; }
|
|
377
|
-
[data-theme="dark"] .text-emerald-600 { color: #34d399 !important; }
|
|
378
|
-
[data-theme="dark"] .text-emerald-800 { color: #a7f3d0 !important; }
|
|
379
|
-
|
|
380
|
-
/* Orange */
|
|
381
|
-
[data-theme="dark"] .bg-orange-50 { background-color: rgba(249, 115, 22, 0.10) !important; }
|
|
382
|
-
[data-theme="dark"] .hover\:bg-orange-50:hover { background-color: rgba(249, 115, 22, 0.14) !important; }
|
|
383
|
-
[data-theme="dark"] .hover\:bg-orange-200:hover { background-color: rgba(249, 115, 22, 0.30) !important; }
|
|
384
|
-
[data-theme="dark"] .border-orange-200 { border-color: rgba(249, 115, 22, 0.32) !important; }
|
|
385
|
-
[data-theme="dark"] .border-orange-300,
|
|
386
|
-
[data-theme="dark"] .hover\:border-orange-300:hover { border-color: rgba(249, 115, 22, 0.45) !important; }
|
|
387
|
-
[data-theme="dark"] .text-orange-600 { color: #fb923c !important; }
|
|
388
|
-
[data-theme="dark"] .text-orange-900 { color: #fed7aa !important; }
|
|
389
|
-
|
|
390
|
-
/* Sky / teal / cyan */
|
|
391
|
-
[data-theme="dark"] .bg-sky-50 { background-color: rgba(14, 165, 233, 0.10) !important; }
|
|
392
|
-
[data-theme="dark"] .border-sky-300 { border-color: rgba(14, 165, 233, 0.45) !important; }
|
|
393
|
-
[data-theme="dark"] .bg-teal-50 { background-color: rgba(20, 184, 166, 0.10) !important; }
|
|
394
|
-
[data-theme="dark"] .bg-teal-100 { background-color: rgba(20, 184, 166, 0.18) !important; }
|
|
395
|
-
[data-theme="dark"] .text-teal-600 { color: #2dd4bf !important; }
|
|
396
|
-
[data-theme="dark"] .text-teal-700 { color: #5eead4 !important; }
|
|
397
|
-
[data-theme="dark"] .text-teal-800 { color: #99f6e4 !important; }
|
|
398
|
-
[data-theme="dark"] .text-cyan-600 { color: #22d3ee !important; }
|
|
399
|
-
|
|
400
|
-
/* Purple / violet */
|
|
401
|
-
[data-theme="dark"] .bg-purple-50 { background-color: rgba(168, 85, 247, 0.10) !important; }
|
|
402
|
-
[data-theme="dark"] .hover\:bg-purple-50:hover { background-color: rgba(168, 85, 247, 0.14) !important; }
|
|
403
|
-
[data-theme="dark"] .border-purple-200 { border-color: rgba(168, 85, 247, 0.32) !important; }
|
|
404
|
-
[data-theme="dark"] .border-purple-300,
|
|
405
|
-
[data-theme="dark"] .hover\:border-purple-300:hover { border-color: rgba(168, 85, 247, 0.45) !important; }
|
|
406
|
-
[data-theme="dark"] .text-purple-600 { color: #c084fc !important; }
|
|
407
|
-
[data-theme="dark"] .text-purple-800,
|
|
408
|
-
[data-theme="dark"] .text-purple-900 { color: #e9d5ff !important; }
|
|
409
|
-
[data-theme="dark"] .bg-violet-100 { background-color: rgba(139, 92, 246, 0.18) !important; }
|
|
410
|
-
[data-theme="dark"] .border-violet-300 { border-color: rgba(139, 92, 246, 0.45) !important; }
|
|
411
|
-
[data-theme="dark"] .text-violet-800 { color: #ddd6fe !important; }
|
|
412
|
-
|
|
413
|
-
/* Pink / rose */
|
|
414
|
-
[data-theme="dark"] .bg-pink-100 { background-color: rgba(236, 72, 153, 0.18) !important; }
|
|
415
|
-
[data-theme="dark"] .border-pink-200 { border-color: rgba(236, 72, 153, 0.32) !important; }
|
|
416
|
-
[data-theme="dark"] .border-pink-300 { border-color: rgba(236, 72, 153, 0.45) !important; }
|
|
417
|
-
[data-theme="dark"] .text-pink-600 { color: #f472b6 !important; }
|
|
418
|
-
[data-theme="dark"] .text-pink-800,
|
|
419
|
-
[data-theme="dark"] .text-pink-900 { color: #fbcfe8 !important; }
|
|
420
|
-
[data-theme="dark"] .bg-rose-100 { background-color: rgba(244, 63, 94, 0.18) !important; }
|
|
421
|
-
[data-theme="dark"] .text-rose-700 { color: #fda4af !important; }
|
|
422
|
-
[data-theme="dark"] .text-rose-800 { color: #fecdd3 !important; }
|
|
423
|
-
|
|
424
|
-
/* Indigo / slate */
|
|
425
|
-
[data-theme="dark"] .bg-indigo-50 { background-color: rgba(99, 102, 241, 0.15) !important; }
|
|
426
|
-
[data-theme="dark"] .hover\:bg-indigo-100:hover { background-color: rgba(99, 102, 241, 0.25) !important; }
|
|
427
|
-
[data-theme="dark"] .text-indigo-600 { color: #a5b4fc !important; }
|
|
428
|
-
[data-theme="dark"] .border-indigo-300 { border-color: rgba(99, 102, 241, 0.45) !important; }
|
|
429
|
-
[data-theme="dark"] .text-slate-700 { color: #cbd5e1 !important; } /* slate-600/800 left for the Calculator LCD */
|
|
430
|
-
[data-theme="dark"] .border-slate-300 { border-color: rgba(148, 163, 184, 0.35) !important; }
|
|
431
|
-
|
|
432
|
-
/* Blue — gaps beyond the accent remaps above. Hover/active steps sit one
|
|
433
|
-
ladder step above their resting tint (base .26 → active .30; the /30../50
|
|
434
|
-
alpha ladder steps 0.10/0.12/0.15 → hovers 0.12/0.15/0.18). */
|
|
435
|
-
[data-theme="dark"] .bg-blue-200 { background-color: rgba(59, 130, 246, 0.35) !important; }
|
|
436
|
-
[data-theme="dark"] .active\:bg-blue-200:active { background-color: rgba(59, 130, 246, 0.40) !important; }
|
|
437
|
-
[data-theme="dark"] .bg-blue-200\/60 { background-color: rgba(59, 130, 246, 0.20) !important; }
|
|
438
|
-
[data-theme="dark"] .hover\:bg-blue-100:hover { background-color: rgba(59, 130, 246, 0.26) !important; }
|
|
439
|
-
[data-theme="dark"] .active\:bg-blue-50:active { background-color: rgba(59, 130, 246, 0.30) !important; }
|
|
440
|
-
[data-theme="dark"] .hover\:bg-blue-50\/30:hover { background-color: rgba(59, 130, 246, 0.12) !important; }
|
|
441
|
-
[data-theme="dark"] .hover\:bg-blue-50\/40:hover { background-color: rgba(59, 130, 246, 0.15) !important; }
|
|
442
|
-
[data-theme="dark"] .hover\:bg-blue-50\/50:hover { background-color: rgba(59, 130, 246, 0.18) !important; }
|
|
443
|
-
[data-theme="dark"] .border-blue-100 { border-color: rgba(59, 130, 246, 0.22) !important; }
|
|
444
|
-
[data-theme="dark"] .border-blue-200,
|
|
445
|
-
[data-theme="dark"] .hover\:border-blue-200:hover { border-color: rgba(59, 130, 246, 0.32) !important; }
|
|
446
|
-
[data-theme="dark"] .border-blue-300,
|
|
447
|
-
[data-theme="dark"] .hover\:border-blue-300:hover { border-color: rgba(59, 130, 246, 0.45) !important; }
|
|
448
|
-
[data-theme="dark"] .border-blue-300\/50 { border-color: rgba(59, 130, 246, 0.25) !important; }
|
|
449
|
-
[data-theme="dark"] .text-blue-900 { color: #bfdbfe !important; }
|
|
450
|
-
[data-theme="dark"] .hover\:text-blue-600:hover { color: #93c5fd !important; }
|
|
451
|
-
[data-theme="dark"] .hover\:text-blue-800:hover { color: #bfdbfe !important; }
|
|
452
|
-
/* File-input buttons (file: compiles to ::file-selector-button) */
|
|
453
|
-
[data-theme="dark"] .file\:bg-blue-50::file-selector-button { background-color: rgba(59, 130, 246, 0.26) !important; }
|
|
454
|
-
[data-theme="dark"] .file\:text-blue-700::file-selector-button { color: #bfdbfe !important; }
|
|
455
|
-
[data-theme="dark"] .hover\:file\:bg-blue-100:hover::file-selector-button { background-color: rgba(59, 130, 246, 0.26) !important; }
|
|
456
|
-
|
|
457
|
-
/* Gray interaction-state variants (separate class names from the bare remaps) */
|
|
458
|
-
[data-theme="dark"] .hover\:text-gray-600:hover,
|
|
459
|
-
[data-theme="dark"] .hover\:text-gray-700:hover { color: #a6adc8 !important; }
|
|
460
|
-
[data-theme="dark"] .hover\:text-gray-800:hover { color: #bac2de !important; }
|
|
461
|
-
[data-theme="dark"] .hover\:text-gray-900:hover,
|
|
462
|
-
[data-theme="dark"] .active\:text-gray-900:active { color: #cdd6f4 !important; }
|
|
463
|
-
[data-theme="dark"] .active\:bg-gray-100:active { background-color: #313244 !important; }
|
|
464
|
-
[data-theme="dark"] .active\:bg-gray-200:active { background-color: #45475a !important; }
|
|
465
|
-
[data-theme="dark"] .active\:bg-gray-300:active,
|
|
466
|
-
[data-theme="dark"] .hover\:bg-gray-300:hover { background-color: #585b70 !important; }
|
|
467
|
-
[data-theme="dark"] .disabled\:bg-gray-100:disabled { background-color: #1e1e2e !important; }
|
|
468
|
-
[data-theme="dark"] .disabled\:bg-gray-200:disabled { background-color: #313244 !important; }
|
|
469
|
-
[data-theme="dark"] .hover\:bg-gray-200\/50:hover { background-color: rgba(69, 71, 90, 0.5) !important; }
|
|
470
|
-
[data-theme="dark"] .even\:bg-gray-50\/50:nth-child(even) { background-color: rgba(24, 24, 37, 0.5) !important; }
|
|
471
|
-
[data-theme="dark"] .border-gray-50,
|
|
472
|
-
[data-theme="dark"] .divide-gray-50 > :not(:last-child) { border-color: #2a2a3c !important; }
|
|
473
|
-
[data-theme="dark"] .border-gray-200\/50 { border-color: rgba(49, 50, 68, 0.6) !important; }
|
|
474
|
-
[data-theme="dark"] .hover\:border-gray-200:hover { border-color: #313244 !important; }
|
|
475
|
-
[data-theme="dark"] .hover\:border-gray-300:hover { border-color: #45475a !important; }
|
|
476
|
-
|
|
477
|
-
/* White panel surfaces / solid black ink. hover-to-white means "emphasize",
|
|
478
|
-
which on dark glass means a solid panel tint; hover-to-black ink flips to
|
|
479
|
-
brighter, not darker (e.g. the taskbar bell). */
|
|
480
|
-
[data-theme="dark"] .bg-white\/85 { background-color: rgba(30, 30, 46, 0.85) !important; }
|
|
481
|
-
[data-theme="dark"] .hover\:bg-white:hover { background-color: #1e1e2e !important; }
|
|
482
|
-
[data-theme="dark"] .text-black { color: #cdd6f4 !important; }
|
|
483
|
-
[data-theme="dark"] .hover\:text-black:hover { color: #ffffff !important; }
|
|
484
|
-
|
|
485
|
-
/* Scrollbar */
|
|
486
|
-
/* Force visible scrollbars on editable grids (macOS hides them by default) */
|
|
487
|
-
.grid-scroll::-webkit-scrollbar { width: 10px; height: 10px; }
|
|
488
|
-
.grid-scroll::-webkit-scrollbar-track { background: #f1f5f9; }
|
|
489
|
-
.grid-scroll::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 5px; border: 2px solid #f1f5f9; }
|
|
490
|
-
.grid-scroll::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
|
|
491
|
-
.grid-scroll::-webkit-scrollbar-corner { background: #f1f5f9; }
|
|
492
|
-
|
|
493
|
-
[data-theme="dark"] ::-webkit-scrollbar { width: 8px; height: 8px; }
|
|
494
|
-
[data-theme="dark"] ::-webkit-scrollbar-track { background: #181825; }
|
|
495
|
-
[data-theme="dark"] ::-webkit-scrollbar-thumb { background: #45475a; border-radius: 4px; }
|
|
496
|
-
[data-theme="dark"] ::-webkit-scrollbar-thumb:hover { background: #585b70; }
|
|
497
|
-
|
|
498
|
-
/* Documents app — page content styling. The editor is a bare contenteditable
|
|
499
|
-
and Tailwind's preflight strips list markers and element margins, so
|
|
500
|
-
restore them for anything typed into or imported from a document; images
|
|
501
|
-
are click-to-resize (menu) and never overflow the page. */
|
|
502
|
-
.docs-editor ul { list-style: disc; padding-left: 1.5rem; margin: 0.25rem 0; }
|
|
503
|
-
.docs-editor ul ul { list-style: circle; }
|
|
504
|
-
.docs-editor ol { list-style: decimal; padding-left: 1.5rem; margin: 0.25rem 0; }
|
|
505
|
-
.docs-editor li { margin: 0.125rem 0; }
|
|
506
|
-
.docs-editor p { margin: 0 0 0.5rem; }
|
|
507
|
-
.docs-editor img { max-width: 100%; height: auto; cursor: pointer; }
|
|
508
|
-
.docs-editor img:hover { outline: 2px solid rgba(59, 130, 246, 0.45); outline-offset: 1px; }
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
/* ═══════════════════════════════════════════════════
|
|
21
|
+
@import "./ui.css";
|
|
22
|
+
@import "./shell.css";
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { A as ALT, a as ALT_SHIFT_D, b as ALT_SHIFT_E, c as ALT_SHIFT_N, d as Accordion, e as AccordionItem, f as AccordionProps, g as Align, h as AuthScreen, i as AuthScreenProps, j as Avatar, k as AvatarGroup, l as AvatarGroupProps, m as AvatarProps, n as AvatarSize, o as AvatarStatus, B as Banner, p as BannerEmphasis, q as BannerProps, r as BannerTone, s as BarChart, t as BarChartProps, u as BreadcrumbItem, v as Breadcrumbs, w as BreadcrumbsProps, x as Button, y as ButtonProps, z as ButtonSize, D as ButtonVariant, E as CMD_A, F as CMD_DOT, G as CMD_ENTER, H as CMD_K, I as CMD_S, J as Card, K as CardPadding, L as CardProps, M as CellStyle, N as ChatTemplate, O as Checkbox, Q as CheckboxProps, R as CheckoutTemplate, T as ColoredBadge, U as ColoredBadgeProps, C as ColumnDef, V as ConfirmProvider, W as ContainerFillChart, X as ContainerFillChartProps, Y as ContainerFillItem, Z as CountBadge, _ as CountBadgeProps, $ as CountBadgeTone, a0 as DashboardTemplate, a1 as DataTable, a2 as DataTableColumn, a3 as DataTablePage, a4 as DataTableProps, a5 as DateRangePicker, a6 as DateRangePickerProps, a7 as DescriptionColumns, a8 as DescriptionItem, a9 as DescriptionList, aa as DescriptionListProps, ab as Dialog, ac as DialogProps, ad as DialogSize, ae as Divider, af as DividerProps, ag as DividerSpacing, ah as DonutChart, ai as DonutChartProps, aj as DonutSegment, ak as Drawer, al as DrawerProps, am as DrawerSide, an as DrawerSize, ao as ENTER, ap as EditableGrid, aq as EditableGridProps, ar as EmailTemplate, as as EmptyState, at as EmptyStateProps, au as ErrorPage, av as ErrorPageProps, aw as FilePicker, ax as FilePickerProps, ay as FormField, az as FormFieldProps, aA as FormLayoutPage, aB as GLASS_DIVIDER, aD as GalleryTemplate, aE as Gap, aF as Grid, aG as GridCols, aH as GridColumn, aI as GridProps, aJ as HelpCenter, aK as HelpCenterDoc, aL as HelpCenterProps, aM as INPUT_BASE, aN as INPUT_SIZES, aO as Inline, aP as InlineProps, aQ as Input, aR as InputNumber, aS as InputNumberProps, aT as InputProps, aU as InputSize, aV as Justify, aW as Kanban, aX as KanbanColumn, aY as KanbanProps, aZ as Label, a_ as LabelProps, a$ as ListFooter, b0 as ListLoadError, b1 as ListLoadErrorProps, b2 as LoadingSpinner, b3 as LoadingSpinnerProps, b4 as MAX_FRACTION_DIGITS, b5 as MOD, b6 as Markdown, b7 as MarkdownProps, b8 as MediaUploadField, b9 as MediaUploadFieldProps, ba as MediaUploadGrid, bb as MediaUploadGridItem, bc as MediaUploadGridProps, bd as MetricBar, be as MetricBarProps, bf as Milestone, bg as MilestoneKind, bh as MilestoneTimeline, bi as MilestoneTimelineProps, bj as NativeSelect, bk as NumericKeypad, bl as NumericKeypadProps, bm as PageHeader, bn as PageHeaderProps, P as PaginatedResponse, bo as Pagination, bp as PaginationProps, bq as Paragraph, br as ParagraphProps, bs as PopupMenu, bt as PopupMenuDivider, bu as PopupMenuItem, bv as PopupMenuLabel, bw as Radio, bx as RadioProps, by as Result, bz as ResultProps, bA as ResultStatus, bB as SHIFT, bC as SearchableOption, bD as SearchableSelect, bE as SearchableSelectProps, bF as Segmented, bG as SegmentedOption, bH as SegmentedProps, bI as SegmentedSize, bJ as Select, bK as SelectOption, bL as SelectProps, bM as SemanticGroup, bN as SeverityTone, bO as ShellPrefsAdapter, bP as ShellPrefsProvider, bQ as SidebarActionButton, bR as SidebarActionButtonProps, bS as SidebarGroupLabel, bT as SidebarLayout, bU as SidebarLayoutProps, bV as SidebarNavItem, bW as Skeleton, bX as SkeletonProps, bY as SkeletonVariant, S as SortState, bZ as Sparkline, b_ as SparklineProps, b$ as Stack, c0 as StackProps, c1 as StatCard, c2 as StatCardProps, c3 as Statistic, c4 as StatisticProps, c5 as StatisticSize, c6 as StatisticTone, c7 as StatusBadge, c8 as StatusBadgeProvider, c9 as Switch, ca as SwitchProps, cb as SwitchSize, cc as TabItem, cd as Tabs, ce as TabsProps, cf as Text, cg as TextProps, ch as TextSize, ci as TextTone, cj as TextWeight, ck as Textarea, cl as TextareaProps, cm as Theme, cn as TileButton, co as TileButtonProps, cp as TileSize, cq as Title, cr as TitleLevel, cs as TitleProps, ct as ToastOptions, cu as ToastPlacement, cv as Tooltip, cw as TooltipProps, cx as TopNav, cy as TopNavItem, cz as TopNavProps, cA as VERSION, cB as appendKey, cC as applyThemePrefs, cD as backspace, cE as confirm, cF as confirmDestructive, cG as formatDate, cH as glassStyle, cI as inputClasses, cJ as isMac, cK as isSeverityTone, cL as mediaFileName, cM as prompt, cN as resolveTheme, cO as severityOf, cP as toISODate, cQ as toast, cR as useClickOutside, cS as useConfirm, cT as useFocusTrap, cU as useIsMobile, cV as useLocalStoragePrefs, cW as useScrollLock, cX as useShellPrefs, cY as useTheme } from '../index-Czn1re5M.js';
|
|
2
|
+
import 'react';
|
|
3
|
+
import 'react/jsx-runtime';
|