react-os-shell 4.14.0 → 4.20.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.
Files changed (95) hide show
  1. package/README.md +46 -0
  2. package/dist/{Browser-SFNEZ6KW.js → Browser-2TRNQ4MK.js} +9 -6
  3. package/dist/Browser-2TRNQ4MK.js.map +1 -0
  4. package/dist/{Calculator-SJBZNZWR.js → Calculator-QCAJ6ITI.js} +8 -5
  5. package/dist/Calculator-QCAJ6ITI.js.map +1 -0
  6. package/dist/ConfirmDialog-WAM5OKAV.js +3 -0
  7. package/dist/{ConfirmDialog-LZ2JQBHA.js.map → ConfirmDialog-WAM5OKAV.js.map} +1 -1
  8. package/dist/{CurrencyConverter-5OUQSITK.js → CurrencyConverter-PCYC6RL5.js} +8 -5
  9. package/dist/CurrencyConverter-PCYC6RL5.js.map +1 -0
  10. package/dist/{Documents-IUV2A2R6.js → Documents-O5TEGSYH.js} +10 -7
  11. package/dist/Documents-O5TEGSYH.js.map +1 -0
  12. package/dist/{Files-RZSUSCOS.js → Files-CD3FTPLK.js} +16 -12
  13. package/dist/Files-CD3FTPLK.js.map +1 -0
  14. package/dist/{Notepad-DFPJKEBG.js → Notepad-5KZS7PUJ.js} +10 -7
  15. package/dist/Notepad-5KZS7PUJ.js.map +1 -0
  16. package/dist/{PomodoroTimer-5H3Q5SNS.js → PomodoroTimer-YABFEPEV.js} +10 -7
  17. package/dist/PomodoroTimer-YABFEPEV.js.map +1 -0
  18. package/dist/{Preview-JTMOV35N.js → Preview-UUNXWQME.js} +11 -8
  19. package/dist/Preview-UUNXWQME.js.map +1 -0
  20. package/dist/{Sidebar-IMACKSHS.js → Sidebar-B3LY5T2U.js} +5 -4
  21. package/dist/Sidebar-B3LY5T2U.js.map +1 -0
  22. package/dist/{Spreadsheet-2R43CIYR.js → Spreadsheet-DB5GMW2X.js} +10 -7
  23. package/dist/Spreadsheet-DB5GMW2X.js.map +1 -0
  24. package/dist/{Stock-FLWCMQZR.js → Stock-IPLLRUOC.js} +8 -5
  25. package/dist/Stock-IPLLRUOC.js.map +1 -0
  26. package/dist/{Weather-DKWGAHWC.js → Weather-SI5QN7X2.js} +8 -5
  27. package/dist/Weather-SI5QN7X2.js.map +1 -0
  28. package/dist/{WorldClock-5UXXPCBB.js → WorldClock-WYDSMUWX.js} +8 -5
  29. package/dist/WorldClock-WYDSMUWX.js.map +1 -0
  30. package/dist/apps/index.js +22 -19
  31. package/dist/apps/index.js.map +1 -1
  32. package/dist/chunk-22BNPLM4.js +46 -0
  33. package/dist/chunk-22BNPLM4.js.map +1 -0
  34. package/dist/{chunk-IVLDAUYM.js → chunk-3CUSBZWG.js} +3 -56
  35. package/dist/chunk-3CUSBZWG.js.map +1 -0
  36. package/dist/{chunk-VENYVK3L.js → chunk-4AKVHY4B.js} +48 -12
  37. package/dist/chunk-4AKVHY4B.js.map +1 -0
  38. package/dist/chunk-C22EFSND.js +188 -0
  39. package/dist/chunk-C22EFSND.js.map +1 -0
  40. package/dist/{chunk-AFOTTLRS.js → chunk-CZH7CN3S.js} +5 -5
  41. package/dist/{chunk-AFOTTLRS.js.map → chunk-CZH7CN3S.js.map} +1 -1
  42. package/dist/chunk-EGM44WML.js +5008 -0
  43. package/dist/chunk-EGM44WML.js.map +1 -0
  44. package/dist/{chunk-H4IEH6FK.js → chunk-EWDYCO65.js} +3 -3
  45. package/dist/{chunk-H4IEH6FK.js.map → chunk-EWDYCO65.js.map} +1 -1
  46. package/dist/{chunk-DINNWYVB.js → chunk-HYAW6KIL.js} +4 -45
  47. package/dist/chunk-HYAW6KIL.js.map +1 -0
  48. package/dist/{chunk-CVVS2OJO.js → chunk-IGPSRRL7.js} +266 -715
  49. package/dist/chunk-IGPSRRL7.js.map +1 -0
  50. package/dist/chunk-L2O6B5KT.js +394 -0
  51. package/dist/chunk-L2O6B5KT.js.map +1 -0
  52. package/dist/{chunk-UI43AZAK.js → chunk-OI253GOA.js} +4 -4
  53. package/dist/{chunk-UI43AZAK.js.map → chunk-OI253GOA.js.map} +1 -1
  54. package/dist/{chunk-ZPCGIR62.js → chunk-OQ7GRU7G.js} +3 -3
  55. package/dist/{chunk-ZPCGIR62.js.map → chunk-OQ7GRU7G.js.map} +1 -1
  56. package/dist/{chunk-XJCAUC2Y.js → chunk-Q3AOIJ7B.js} +3 -3
  57. package/dist/{chunk-XJCAUC2Y.js.map → chunk-Q3AOIJ7B.js.map} +1 -1
  58. package/dist/{chunk-N2UW3CAS.js → chunk-QJS6RBH4.js} +3 -3
  59. package/dist/{chunk-N2UW3CAS.js.map → chunk-QJS6RBH4.js.map} +1 -1
  60. package/dist/chunk-WNLPTLT6.js +56 -0
  61. package/dist/chunk-WNLPTLT6.js.map +1 -0
  62. package/dist/{chunk-QU5L5ZYM.js → chunk-X5PZYTAK.js} +3 -3
  63. package/dist/{chunk-QU5L5ZYM.js.map → chunk-X5PZYTAK.js.map} +1 -1
  64. package/dist/chunk-ZKQHO2Z7.js +7 -0
  65. package/dist/{chunk-WDXP2Y4T.js.map → chunk-ZKQHO2Z7.js.map} +1 -1
  66. package/dist/index-C5c6FA0c.d.ts +1931 -0
  67. package/dist/index.d.ts +7 -1375
  68. package/dist/index.js +159 -4082
  69. package/dist/index.js.map +1 -1
  70. package/dist/shell.css +105 -0
  71. package/dist/styles.css +12 -501
  72. package/dist/ui/index.d.ts +3 -0
  73. package/dist/ui/index.js +11 -0
  74. package/dist/ui/index.js.map +1 -0
  75. package/dist/ui.css +425 -0
  76. package/package.json +7 -2
  77. package/dist/Browser-SFNEZ6KW.js.map +0 -1
  78. package/dist/Calculator-SJBZNZWR.js.map +0 -1
  79. package/dist/ConfirmDialog-LZ2JQBHA.js +0 -4
  80. package/dist/CurrencyConverter-5OUQSITK.js.map +0 -1
  81. package/dist/Documents-IUV2A2R6.js.map +0 -1
  82. package/dist/Files-RZSUSCOS.js.map +0 -1
  83. package/dist/Notepad-DFPJKEBG.js.map +0 -1
  84. package/dist/PomodoroTimer-5H3Q5SNS.js.map +0 -1
  85. package/dist/Preview-JTMOV35N.js.map +0 -1
  86. package/dist/Sidebar-IMACKSHS.js.map +0 -1
  87. package/dist/Spreadsheet-2R43CIYR.js.map +0 -1
  88. package/dist/Stock-FLWCMQZR.js.map +0 -1
  89. package/dist/Weather-DKWGAHWC.js.map +0 -1
  90. package/dist/WorldClock-5UXXPCBB.js.map +0 -1
  91. package/dist/chunk-CVVS2OJO.js.map +0 -1
  92. package/dist/chunk-DINNWYVB.js.map +0 -1
  93. package/dist/chunk-IVLDAUYM.js.map +0 -1
  94. package/dist/chunk-VENYVK3L.js.map +0 -1
  95. package/dist/chunk-WDXP2Y4T.js +0 -7
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 — Tailwind v4 @theme + dark-mode tone-down rules.
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 'react-os-shell/styles.css';
6
+ * import "react-os-shell/styles.css";
7
7
  *
8
- * The CSS custom properties are namespaced `--window-*` / `--taskbar-*` /
9
- * `--menu-*` so they don't collide with consumer styles. Dark mode is
10
- * activated by setting `data-theme="dark"` on the document element; the
11
- * package's `useTheme()` hook handles this.
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
- * Scope:
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
- * Per-theme accent variants (pink / green / grey / blue + custom accent)
22
- * live in themes.css, imported below so every consumer gets the full set —
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 "./themes.css";
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-C5c6FA0c.js';
2
+ import 'react';
3
+ import 'react/jsx-runtime';