@orz/ui 0.0.0-stage → 0.1.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 (270) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +541 -2
  3. package/dist/components/avatar.d.ts +14 -0
  4. package/dist/components/avatar.d.ts.map +1 -0
  5. package/dist/components/avatar.js +23 -0
  6. package/dist/components/avatar.js.map +1 -0
  7. package/dist/components/badge.d.ts +10 -0
  8. package/dist/components/badge.d.ts.map +1 -0
  9. package/dist/components/badge.js +26 -0
  10. package/dist/components/badge.js.map +1 -0
  11. package/dist/components/button.d.ts +11 -0
  12. package/dist/components/button.d.ts.map +1 -0
  13. package/dist/components/button.js +40 -0
  14. package/dist/components/button.js.map +1 -0
  15. package/dist/components/card.d.ts +12 -0
  16. package/dist/components/card.d.ts.map +1 -0
  17. package/dist/components/card.js +25 -0
  18. package/dist/components/card.js.map +1 -0
  19. package/dist/components/color-picker.d.ts +58 -0
  20. package/dist/components/color-picker.d.ts.map +1 -0
  21. package/dist/components/color-picker.js +950 -0
  22. package/dist/components/color-picker.js.map +1 -0
  23. package/dist/components/confirm-dialog.d.ts +26 -0
  24. package/dist/components/confirm-dialog.d.ts.map +1 -0
  25. package/dist/components/confirm-dialog.js +18 -0
  26. package/dist/components/confirm-dialog.js.map +1 -0
  27. package/dist/components/dialog.d.ts +26 -0
  28. package/dist/components/dialog.d.ts.map +1 -0
  29. package/dist/components/dialog.js +149 -0
  30. package/dist/components/dialog.js.map +1 -0
  31. package/dist/components/dropdown-menu.d.ts +30 -0
  32. package/dist/components/dropdown-menu.d.ts.map +1 -0
  33. package/dist/components/dropdown-menu.js +100 -0
  34. package/dist/components/dropdown-menu.js.map +1 -0
  35. package/dist/components/filter-menu.d.ts +98 -0
  36. package/dist/components/filter-menu.d.ts.map +1 -0
  37. package/dist/components/filter-menu.js +745 -0
  38. package/dist/components/filter-menu.js.map +1 -0
  39. package/dist/components/highlighted-input.d.ts +40 -0
  40. package/dist/components/highlighted-input.d.ts.map +1 -0
  41. package/dist/components/highlighted-input.js +95 -0
  42. package/dist/components/highlighted-input.js.map +1 -0
  43. package/dist/components/hover-card.d.ts +7 -0
  44. package/dist/components/hover-card.d.ts.map +1 -0
  45. package/dist/components/hover-card.js +22 -0
  46. package/dist/components/hover-card.js.map +1 -0
  47. package/dist/components/input.d.ts +4 -0
  48. package/dist/components/input.d.ts.map +1 -0
  49. package/dist/components/input.js +7 -0
  50. package/dist/components/input.js.map +1 -0
  51. package/dist/components/label.d.ts +5 -0
  52. package/dist/components/label.d.ts.map +1 -0
  53. package/dist/components/label.js +8 -0
  54. package/dist/components/label.js.map +1 -0
  55. package/dist/components/link-chip.d.ts +67 -0
  56. package/dist/components/link-chip.d.ts.map +1 -0
  57. package/dist/components/link-chip.js +71 -0
  58. package/dist/components/link-chip.js.map +1 -0
  59. package/dist/components/load-failure.d.ts +24 -0
  60. package/dist/components/load-failure.d.ts.map +1 -0
  61. package/dist/components/load-failure.js +27 -0
  62. package/dist/components/load-failure.js.map +1 -0
  63. package/dist/components/load-more.d.ts +15 -0
  64. package/dist/components/load-more.d.ts.map +1 -0
  65. package/dist/components/load-more.js +25 -0
  66. package/dist/components/load-more.js.map +1 -0
  67. package/dist/components/media-controls.d.ts +50 -0
  68. package/dist/components/media-controls.d.ts.map +1 -0
  69. package/dist/components/media-controls.js +71 -0
  70. package/dist/components/media-controls.js.map +1 -0
  71. package/dist/components/popover.d.ts +9 -0
  72. package/dist/components/popover.d.ts.map +1 -0
  73. package/dist/components/popover.js +82 -0
  74. package/dist/components/popover.js.map +1 -0
  75. package/dist/components/query-box.d.ts +78 -0
  76. package/dist/components/query-box.d.ts.map +1 -0
  77. package/dist/components/query-box.js +332 -0
  78. package/dist/components/query-box.js.map +1 -0
  79. package/dist/components/query-highlight.d.ts +14 -0
  80. package/dist/components/query-highlight.d.ts.map +1 -0
  81. package/dist/components/query-highlight.js +132 -0
  82. package/dist/components/query-highlight.js.map +1 -0
  83. package/dist/components/select.d.ts +19 -0
  84. package/dist/components/select.d.ts.map +1 -0
  85. package/dist/components/select.js +38 -0
  86. package/dist/components/select.js.map +1 -0
  87. package/dist/components/separator.d.ts +5 -0
  88. package/dist/components/separator.d.ts.map +1 -0
  89. package/dist/components/separator.js +9 -0
  90. package/dist/components/separator.js.map +1 -0
  91. package/dist/components/sheet.d.ts +16 -0
  92. package/dist/components/sheet.d.ts.map +1 -0
  93. package/dist/components/sheet.js +41 -0
  94. package/dist/components/sheet.js.map +1 -0
  95. package/dist/components/skeleton.d.ts +3 -0
  96. package/dist/components/skeleton.d.ts.map +1 -0
  97. package/dist/components/skeleton.js +7 -0
  98. package/dist/components/skeleton.js.map +1 -0
  99. package/dist/components/slider.d.ts +8 -0
  100. package/dist/components/slider.d.ts.map +1 -0
  101. package/dist/components/slider.js +14 -0
  102. package/dist/components/slider.js.map +1 -0
  103. package/dist/components/sonner.d.ts +4 -0
  104. package/dist/components/sonner.d.ts.map +1 -0
  105. package/dist/components/sonner.js +26 -0
  106. package/dist/components/sonner.js.map +1 -0
  107. package/dist/components/switch.d.ts +5 -0
  108. package/dist/components/switch.d.ts.map +1 -0
  109. package/dist/components/switch.js +8 -0
  110. package/dist/components/switch.js.map +1 -0
  111. package/dist/components/table.d.ts +11 -0
  112. package/dist/components/table.d.ts.map +1 -0
  113. package/dist/components/table.js +28 -0
  114. package/dist/components/table.js.map +1 -0
  115. package/dist/components/tabs.d.ts +8 -0
  116. package/dist/components/tabs.d.ts.map +1 -0
  117. package/dist/components/tabs.js +18 -0
  118. package/dist/components/tabs.js.map +1 -0
  119. package/dist/components/textarea.d.ts +4 -0
  120. package/dist/components/textarea.d.ts.map +1 -0
  121. package/dist/components/textarea.js +7 -0
  122. package/dist/components/textarea.js.map +1 -0
  123. package/dist/components/theme-editor/draft.d.ts +235 -0
  124. package/dist/components/theme-editor/draft.d.ts.map +1 -0
  125. package/dist/components/theme-editor/draft.js +638 -0
  126. package/dist/components/theme-editor/draft.js.map +1 -0
  127. package/dist/components/theme-editor/export-panel.d.ts +14 -0
  128. package/dist/components/theme-editor/export-panel.d.ts.map +1 -0
  129. package/dist/components/theme-editor/export-panel.js +39 -0
  130. package/dist/components/theme-editor/export-panel.js.map +1 -0
  131. package/dist/components/theme-editor/form.d.ts +69 -0
  132. package/dist/components/theme-editor/form.d.ts.map +1 -0
  133. package/dist/components/theme-editor/form.js +350 -0
  134. package/dist/components/theme-editor/form.js.map +1 -0
  135. package/dist/components/theme-editor/import-panel.d.ts +21 -0
  136. package/dist/components/theme-editor/import-panel.d.ts.map +1 -0
  137. package/dist/components/theme-editor/import-panel.js +117 -0
  138. package/dist/components/theme-editor/import-panel.js.map +1 -0
  139. package/dist/components/theme-editor/theme-list.d.ts +23 -0
  140. package/dist/components/theme-editor/theme-list.d.ts.map +1 -0
  141. package/dist/components/theme-editor/theme-list.js +42 -0
  142. package/dist/components/theme-editor/theme-list.js.map +1 -0
  143. package/dist/components/theme-editor/token-list.d.ts +30 -0
  144. package/dist/components/theme-editor/token-list.d.ts.map +1 -0
  145. package/dist/components/theme-editor/token-list.js +124 -0
  146. package/dist/components/theme-editor/token-list.js.map +1 -0
  147. package/dist/components/theme-editor/tokens.d.ts +37 -0
  148. package/dist/components/theme-editor/tokens.d.ts.map +1 -0
  149. package/dist/components/theme-editor/tokens.js +155 -0
  150. package/dist/components/theme-editor/tokens.js.map +1 -0
  151. package/dist/components/theme-editor.d.ts +26 -0
  152. package/dist/components/theme-editor.d.ts.map +1 -0
  153. package/dist/components/theme-editor.js +467 -0
  154. package/dist/components/theme-editor.js.map +1 -0
  155. package/dist/components/theme-menu.d.ts +28 -0
  156. package/dist/components/theme-menu.d.ts.map +1 -0
  157. package/dist/components/theme-menu.js +308 -0
  158. package/dist/components/theme-menu.js.map +1 -0
  159. package/dist/components/tooltip.d.ts +11 -0
  160. package/dist/components/tooltip.d.ts.map +1 -0
  161. package/dist/components/tooltip.js +18 -0
  162. package/dist/components/tooltip.js.map +1 -0
  163. package/dist/components/unsaved-changes-dialog.d.ts +39 -0
  164. package/dist/components/unsaved-changes-dialog.d.ts.map +1 -0
  165. package/dist/components/unsaved-changes-dialog.js +46 -0
  166. package/dist/components/unsaved-changes-dialog.js.map +1 -0
  167. package/dist/hooks/scroll-insets.d.ts +89 -0
  168. package/dist/hooks/scroll-insets.d.ts.map +1 -0
  169. package/dist/hooks/scroll-insets.js +265 -0
  170. package/dist/hooks/scroll-insets.js.map +1 -0
  171. package/dist/hooks/use-element-height.d.ts +11 -0
  172. package/dist/hooks/use-element-height.d.ts.map +1 -0
  173. package/dist/hooks/use-element-height.js +33 -0
  174. package/dist/hooks/use-element-height.js.map +1 -0
  175. package/dist/hooks/use-media-query.d.ts +22 -0
  176. package/dist/hooks/use-media-query.d.ts.map +1 -0
  177. package/dist/hooks/use-media-query.js +38 -0
  178. package/dist/hooks/use-media-query.js.map +1 -0
  179. package/dist/hooks/use-overlay-scrollbars.d.ts +31 -0
  180. package/dist/hooks/use-overlay-scrollbars.d.ts.map +1 -0
  181. package/dist/hooks/use-overlay-scrollbars.js +80 -0
  182. package/dist/hooks/use-overlay-scrollbars.js.map +1 -0
  183. package/dist/hooks/use-paged-append.d.ts +7 -0
  184. package/dist/hooks/use-paged-append.d.ts.map +1 -0
  185. package/dist/hooks/use-paged-append.js +53 -0
  186. package/dist/hooks/use-paged-append.js.map +1 -0
  187. package/dist/hooks/use-query-completion.d.ts +27 -0
  188. package/dist/hooks/use-query-completion.d.ts.map +1 -0
  189. package/dist/hooks/use-query-completion.js +100 -0
  190. package/dist/hooks/use-query-completion.js.map +1 -0
  191. package/dist/hooks/use-slash-shortcut.d.ts +9 -0
  192. package/dist/hooks/use-slash-shortcut.d.ts.map +1 -0
  193. package/dist/hooks/use-slash-shortcut.js +38 -0
  194. package/dist/hooks/use-slash-shortcut.js.map +1 -0
  195. package/dist/hooks/viewport-chrome.d.ts +50 -0
  196. package/dist/hooks/viewport-chrome.d.ts.map +1 -0
  197. package/dist/hooks/viewport-chrome.js +170 -0
  198. package/dist/hooks/viewport-chrome.js.map +1 -0
  199. package/dist/index.d.ts +2 -0
  200. package/dist/index.d.ts.map +1 -0
  201. package/dist/index.js +2 -0
  202. package/dist/index.js.map +1 -0
  203. package/dist/lib/cell-width-table.d.ts +3 -0
  204. package/dist/lib/cell-width-table.d.ts.map +1 -0
  205. package/dist/lib/cell-width-table.js +6 -0
  206. package/dist/lib/cell-width-table.js.map +1 -0
  207. package/dist/lib/cell-width.d.ts +7 -0
  208. package/dist/lib/cell-width.d.ts.map +1 -0
  209. package/dist/lib/cell-width.js +50 -0
  210. package/dist/lib/cell-width.js.map +1 -0
  211. package/dist/lib/clipboard.d.ts +8 -0
  212. package/dist/lib/clipboard.d.ts.map +1 -0
  213. package/dist/lib/clipboard.js +19 -0
  214. package/dist/lib/clipboard.js.map +1 -0
  215. package/dist/lib/color.d.ts +40 -0
  216. package/dist/lib/color.d.ts.map +1 -0
  217. package/dist/lib/color.js +177 -0
  218. package/dist/lib/color.js.map +1 -0
  219. package/dist/lib/scroll-map.d.ts +20 -0
  220. package/dist/lib/scroll-map.d.ts.map +1 -0
  221. package/dist/lib/scroll-map.js +46 -0
  222. package/dist/lib/scroll-map.js.map +1 -0
  223. package/dist/lib/text-metrics.d.ts +33 -0
  224. package/dist/lib/text-metrics.d.ts.map +1 -0
  225. package/dist/lib/text-metrics.js +89 -0
  226. package/dist/lib/text-metrics.js.map +1 -0
  227. package/dist/lib/theme-file.d.ts +51 -0
  228. package/dist/lib/theme-file.d.ts.map +1 -0
  229. package/dist/lib/theme-file.js +511 -0
  230. package/dist/lib/theme-file.js.map +1 -0
  231. package/dist/lib/unsaved-guard.d.ts +33 -0
  232. package/dist/lib/unsaved-guard.d.ts.map +1 -0
  233. package/dist/lib/unsaved-guard.js +37 -0
  234. package/dist/lib/unsaved-guard.js.map +1 -0
  235. package/dist/lib/utils.d.ts +3 -0
  236. package/dist/lib/utils.d.ts.map +1 -0
  237. package/dist/lib/utils.js +6 -0
  238. package/dist/lib/utils.js.map +1 -0
  239. package/dist/theme/custom.d.ts +8 -0
  240. package/dist/theme/custom.d.ts.map +1 -0
  241. package/dist/theme/custom.js +56 -0
  242. package/dist/theme/custom.js.map +1 -0
  243. package/dist/theme/index.d.ts +6 -0
  244. package/dist/theme/index.d.ts.map +1 -0
  245. package/dist/theme/index.js +5 -0
  246. package/dist/theme/index.js.map +1 -0
  247. package/dist/theme/paint-guard.d.ts +20 -0
  248. package/dist/theme/paint-guard.d.ts.map +1 -0
  249. package/dist/theme/paint-guard.js +120 -0
  250. package/dist/theme/paint-guard.js.map +1 -0
  251. package/dist/theme/picks.d.ts +22 -0
  252. package/dist/theme/picks.d.ts.map +1 -0
  253. package/dist/theme/picks.js +43 -0
  254. package/dist/theme/picks.js.map +1 -0
  255. package/dist/theme/pref.d.ts +39 -0
  256. package/dist/theme/pref.d.ts.map +1 -0
  257. package/dist/theme/pref.js +129 -0
  258. package/dist/theme/pref.js.map +1 -0
  259. package/dist/theme/provider.d.ts +41 -0
  260. package/dist/theme/provider.d.ts.map +1 -0
  261. package/dist/theme/provider.js +103 -0
  262. package/dist/theme/provider.js.map +1 -0
  263. package/dist/theme/store.d.ts +104 -0
  264. package/dist/theme/store.d.ts.map +1 -0
  265. package/dist/theme/store.js +509 -0
  266. package/dist/theme/store.js.map +1 -0
  267. package/package.json +94 -3
  268. package/styles.css +79 -0
  269. package/theme.css +186 -0
  270. package/vendor/shadcn-tailwind.css +664 -0
@@ -0,0 +1,511 @@
1
+ import { composeTheme, DEFAULT_VARIANT, isCustomTerminalTheme, isUiTheme, resolveTerminal, TERMINAL_TOKEN_NAMES, TOKEN_NAMES, } from "@orz/themes";
2
+ import { parseColor } from "./color.js";
3
+ export const THEME_FILE_FORMAT = "orz-themes";
4
+ export const THEME_FILE_VERSION = 1;
5
+ /** Text longer than this many characters is refused before parsing; the import panel also checks `File.size` against it before reading a file. */
6
+ export const THEME_FILE_MAX_LENGTH = 1_000_000;
7
+ const SCHEMES = ["light", "dark"];
8
+ const HEX = /^#[0-9a-f]{6}([0-9a-f]{2})?$/i;
9
+ // The scheme composeTheme reads a terminal base at: a one-palette base serves either side.
10
+ function terminalScheme(base, explicit, side) {
11
+ return explicit ?? (base.light ? (base.dark ? side : "light") : "dark");
12
+ }
13
+ /**
14
+ * The file for `customs` of both kinds, each in its kind's array, pretty-printed with two-space
15
+ * indent and a trailing newline. Ids and kinds are left out; every based side and based terminal
16
+ * carries `resolved`, computed against `themes` (UI and terminal-only lists together). A custom
17
+ * theme that composes to `null` is written without snapshots for the sides that cannot resolve.
18
+ */
19
+ export function serializeThemeFile(customs, themes) {
20
+ const file = {
21
+ format: THEME_FILE_FORMAT,
22
+ version: THEME_FILE_VERSION,
23
+ themes: [],
24
+ };
25
+ const terminalThemes = [];
26
+ for (const custom of customs) {
27
+ if (isCustomTerminalTheme(custom)) {
28
+ const out = { label: custom.label };
29
+ for (const scheme of SCHEMES) {
30
+ const side = custom[scheme];
31
+ if (side)
32
+ out[scheme] = serializeTerminal(side, scheme, themes);
33
+ }
34
+ terminalThemes.push(out);
35
+ continue;
36
+ }
37
+ const out = { label: custom.label };
38
+ for (const scheme of SCHEMES) {
39
+ const side = custom[scheme];
40
+ if (side)
41
+ out[scheme] = serializeSide(custom, scheme, side, themes);
42
+ }
43
+ file.themes.push(out);
44
+ }
45
+ if (terminalThemes.length > 0)
46
+ file.terminalThemes = terminalThemes;
47
+ return `${JSON.stringify(file, null, 2)}\n`;
48
+ }
49
+ function serializeSide(custom, scheme, side, themes) {
50
+ if (!("base" in side)) {
51
+ return {
52
+ ...side,
53
+ terminal: serializeTerminal(side.terminal, scheme, themes),
54
+ };
55
+ }
56
+ const out = { ...side };
57
+ if (side.terminal) {
58
+ out.terminal = serializeTerminal(side.terminal, scheme, themes);
59
+ }
60
+ // Composing this side alone applies overrides and the terminal source exactly as the store does.
61
+ const { id, label } = custom;
62
+ const composed = composeTheme(scheme === "light" ? { id, label, light: side } : { id, label, dark: side }, themes);
63
+ const palette = composed?.[scheme];
64
+ if (palette) {
65
+ out.resolved = { tokens: palette.tokens, terminal: palette.terminal };
66
+ }
67
+ return out;
68
+ }
69
+ function serializeTerminal(terminal, scheme, themes) {
70
+ if (!("base" in terminal))
71
+ return terminal;
72
+ const base = themes.find((t) => t.id === terminal.base.theme);
73
+ const resolved = base &&
74
+ resolveTerminal(base, terminalScheme(base, terminal.base.scheme, scheme), terminal.base.variant);
75
+ if (!resolved)
76
+ return terminal;
77
+ return {
78
+ ...terminal,
79
+ resolved: { ...resolved.terminal, ...terminal.tokens },
80
+ };
81
+ }
82
+ const NOT_JSON = "This isn't a theme file: it is not valid JSON.";
83
+ const NOT_ORZ = "This isn't an orz-themes file.";
84
+ const NEWER = "This file was written by a newer version and can't be read here.";
85
+ const TOO_LARGE = "This file is too large to be a theme file.";
86
+ const NO_THEMES = "This file contains no themes.";
87
+ const NO_SIDE = "It has neither a light nor a dark side.";
88
+ const BAD_SHAPE = "It isn't a valid theme entry.";
89
+ const NO_TERMINAL_SLOT = "It is a terminal theme, and this app has no terminal.";
90
+ const CONVERTED = "This app has no UI themes; imported as a terminal theme from its terminal colours.";
91
+ const renamed = (from) => `Renamed from "${from}": a theme with that name already exists.`;
92
+ const sideDetached = (name, scheme) => `${name} isn't available here; the ${scheme} side is imported as Fully custom from the colours saved in the file.`;
93
+ const terminalDetached = (name, scheme) => `${name} isn't available here; the ${scheme} side's terminal is imported as Fully custom from the colours saved in the file.`;
94
+ const variantFallback = (name, variant, scheme) => `${name} has no variant "${variant}" here; the ${scheme} side uses Default.`;
95
+ const unknownTokens = (names) => `Ignored unknown colours: ${names.join(", ")}.`;
96
+ const noSnapshot = (name, scheme) => `${name} isn't available here and the file has no saved colours for the ${scheme} side.`;
97
+ // Not in the spec's table: a based terminal with a missing base and no snapshot.
98
+ const noTerminalSnapshot = (name, scheme) => `${name} isn't available here and the file has no saved colours for the ${scheme} side's terminal.`;
99
+ const terminalFollows = (name, scheme) => `${name} isn't available here and the file has no saved colours for the ${scheme} side's terminal; it follows the side's base instead.`;
100
+ const incomplete = (scheme, names) => `Its ${scheme} side is missing colours: ${names.join(", ")}.`;
101
+ const notColour = (value, name) => `"${show(value)}" for ${name} isn't a colour.`;
102
+ const notHex = (value, name) => `"${show(value)}" for ${name} isn't a hex colour.`;
103
+ function show(value) {
104
+ return typeof value === "string" ? value : JSON.stringify(value);
105
+ }
106
+ function isObject(value) {
107
+ return typeof value === "object" && value !== null && !Array.isArray(value);
108
+ }
109
+ const isColour = (value) => typeof value === "string" && parseColor(value) !== null;
110
+ const isHex = (value) => typeof value === "string" && HEX.test(value);
111
+ const optional = (value, check) => value === undefined || check(value);
112
+ const isString = (value) => typeof value === "string";
113
+ const isScheme = (value) => value === "light" || value === "dark";
114
+ function readTerminal(value) {
115
+ if (!isObject(value))
116
+ return null;
117
+ if (value.base === undefined) {
118
+ return isObject(value.tokens) ? { tokens: value.tokens } : null;
119
+ }
120
+ const { base, tokens } = value;
121
+ if (!isObject(base) ||
122
+ !isString(base.theme) ||
123
+ !optional(base.scheme, isScheme) ||
124
+ !optional(base.variant, isString) ||
125
+ !optional(tokens, isObject)) {
126
+ return null;
127
+ }
128
+ const out = {
129
+ base: {
130
+ theme: base.theme,
131
+ scheme: base.scheme,
132
+ variant: base.variant,
133
+ },
134
+ resolved: value.resolved,
135
+ };
136
+ if (tokens !== undefined)
137
+ out.tokens = tokens;
138
+ return out;
139
+ }
140
+ function readSide(value) {
141
+ if (!isObject(value))
142
+ return null;
143
+ if (value.base === undefined) {
144
+ const terminal = readTerminal(value.terminal);
145
+ if (!isObject(value.tokens) || terminal === null)
146
+ return null;
147
+ return { tokens: value.tokens, terminal };
148
+ }
149
+ const { base, tokens } = value;
150
+ if (!isObject(base) ||
151
+ !isString(base.theme) ||
152
+ !optional(base.variant, isString) ||
153
+ !optional(tokens, isObject)) {
154
+ return null;
155
+ }
156
+ const out = {
157
+ base: {
158
+ theme: base.theme,
159
+ variant: base.variant,
160
+ },
161
+ resolved: value.resolved,
162
+ };
163
+ if (tokens !== undefined)
164
+ out.tokens = tokens;
165
+ if (value.terminal !== undefined) {
166
+ const terminal = readTerminal(value.terminal);
167
+ if (terminal === null)
168
+ return null;
169
+ out.terminal = terminal;
170
+ }
171
+ return out;
172
+ }
173
+ /** The known names of `source`, in `names` order; unknown names are ignored. */
174
+ function pick(source, names) {
175
+ const out = {};
176
+ for (const name of names) {
177
+ if (Object.hasOwn(source, name))
178
+ out[name] = source[name];
179
+ }
180
+ return out;
181
+ }
182
+ function unknownNames(source, names) {
183
+ return source === undefined
184
+ ? []
185
+ : Object.keys(source).filter((key) => !names.includes(key));
186
+ }
187
+ function missingNames(source, names) {
188
+ return names.filter((name) => !Object.hasOwn(source, name));
189
+ }
190
+ /** All of `names`, each valid, or null. */
191
+ function complete(source, names, valid) {
192
+ if (!isObject(source))
193
+ return null;
194
+ const out = pick(source, names);
195
+ if (missingNames(out, names).length > 0)
196
+ return null;
197
+ if (!Object.values(out).every(valid))
198
+ return null;
199
+ return out;
200
+ }
201
+ /** The first value that fails `valid`, as a message; null when all pass. */
202
+ function badValue(source, valid, message) {
203
+ for (const [name, value] of Object.entries(source)) {
204
+ if (!valid(value))
205
+ return message(value, name);
206
+ }
207
+ return null;
208
+ }
209
+ /** The side's known colours, or null when a value check drops it; its reason is in `messages`. */
210
+ function checkSide(raw, scheme, messages) {
211
+ const unknown = [
212
+ ...unknownNames(raw.tokens, TOKEN_NAMES),
213
+ ...unknownNames(raw.terminal?.tokens, TERMINAL_TOKEN_NAMES),
214
+ ];
215
+ if (unknown.length > 0)
216
+ messages.push(unknownTokens(unknown));
217
+ const tokens = raw.tokens && pick(raw.tokens, TOKEN_NAMES);
218
+ const terminalTokens = raw.terminal?.tokens && pick(raw.terminal.tokens, TERMINAL_TOKEN_NAMES);
219
+ const bad = (tokens && badValue(tokens, isColour, notColour)) ??
220
+ (terminalTokens && badValue(terminalTokens, isHex, notHex));
221
+ if (bad) {
222
+ messages.push(bad);
223
+ return null;
224
+ }
225
+ const missing = [
226
+ ...(raw.base === undefined && tokens
227
+ ? missingNames(tokens, TOKEN_NAMES)
228
+ : []),
229
+ ...(raw.terminal && raw.terminal.base === undefined && terminalTokens
230
+ ? missingNames(terminalTokens, TERMINAL_TOKEN_NAMES)
231
+ : []),
232
+ ];
233
+ if (missing.length > 0) {
234
+ messages.push(incomplete(scheme, missing));
235
+ return null;
236
+ }
237
+ return { tokens, terminalTokens };
238
+ }
239
+ /** null when the side is dropped; its reason is in `messages`. */
240
+ function importSide(raw, scheme, themes, messages) {
241
+ const checked = checkSide(raw, scheme, messages);
242
+ if (checked === null)
243
+ return null;
244
+ const { tokens, terminalTokens } = checked;
245
+ let side;
246
+ // The side's own snapshot terminal, when the side was detached from its snapshot.
247
+ let snapshotTerminal;
248
+ if (raw.base === undefined) {
249
+ side = {
250
+ tokens: tokens,
251
+ terminal: { tokens: terminalTokens },
252
+ };
253
+ }
254
+ else {
255
+ const base = themes.find((t) => t.id === raw.base?.theme);
256
+ const palette = base && isUiTheme(base) ? base[scheme] : undefined;
257
+ if (base && palette) {
258
+ const ref = { theme: base.id };
259
+ const variant = raw.base.variant;
260
+ if (variant !== undefined) {
261
+ if (variant === DEFAULT_VARIANT ||
262
+ Object.hasOwn(palette.variants ?? {}, variant)) {
263
+ ref.variant = variant;
264
+ }
265
+ else {
266
+ messages.push(variantFallback(base.label, variant, scheme));
267
+ }
268
+ }
269
+ side = { base: ref };
270
+ if (tokens)
271
+ side.tokens = tokens;
272
+ }
273
+ else {
274
+ const name = base?.label ?? raw.base.theme;
275
+ const resolved = isObject(raw.resolved) ? raw.resolved : {};
276
+ const snapshotTokens = complete(resolved.tokens, TOKEN_NAMES, isColour);
277
+ snapshotTerminal =
278
+ complete(resolved.terminal, TERMINAL_TOKEN_NAMES, isHex) ?? undefined;
279
+ if (snapshotTokens === null || snapshotTerminal === undefined) {
280
+ messages.push(noSnapshot(name, scheme));
281
+ return null;
282
+ }
283
+ messages.push(sideDetached(name, scheme));
284
+ side = {
285
+ tokens: snapshotTokens,
286
+ terminal: { tokens: snapshotTerminal },
287
+ };
288
+ }
289
+ }
290
+ if (raw.terminal === undefined)
291
+ return side;
292
+ if (raw.terminal.base === undefined) {
293
+ side.terminal = { tokens: terminalTokens };
294
+ return side;
295
+ }
296
+ const terminal = importBasedTerminal(raw.terminal.base, raw.terminal.resolved, terminalTokens, scheme, themes, messages, terminalDetached);
297
+ if (terminal) {
298
+ side.terminal = terminal;
299
+ return side;
300
+ }
301
+ const name = themes.find((t) => t.id === raw.terminal?.base?.theme)?.label ??
302
+ raw.terminal.base.theme;
303
+ if ("base" in side) {
304
+ messages.push(terminalFollows(name, scheme));
305
+ return side;
306
+ }
307
+ // The side's snapshot already holds the terminal it showed, source included.
308
+ if (snapshotTerminal) {
309
+ messages.push(terminalDetached(name, scheme));
310
+ return side;
311
+ }
312
+ messages.push(noTerminalSnapshot(name, scheme));
313
+ return null;
314
+ }
315
+ /**
316
+ * null when the base is missing here and the terminal has no usable snapshot. `detached` words the
317
+ * message for a terminal made fully custom from its snapshot.
318
+ */
319
+ function importBasedTerminal(ref, resolved, tokens, scheme, themes, messages, detached) {
320
+ const base = themes.find((t) => t.id === ref.theme);
321
+ const palette = base
322
+ ? base[terminalScheme(base, ref.scheme, scheme)]
323
+ : undefined;
324
+ if (base && palette) {
325
+ const kept = {
326
+ theme: base.id,
327
+ };
328
+ if (ref.scheme !== undefined)
329
+ kept.scheme = ref.scheme;
330
+ const variant = ref.variant;
331
+ if (variant !== undefined) {
332
+ if (variant === DEFAULT_VARIANT ||
333
+ Object.hasOwn(palette.variants ?? {}, variant)) {
334
+ kept.variant = variant;
335
+ }
336
+ else {
337
+ messages.push(variantFallback(base.label, variant, scheme));
338
+ }
339
+ }
340
+ const terminal = { base: kept };
341
+ if (tokens)
342
+ terminal.tokens = tokens;
343
+ return terminal;
344
+ }
345
+ const snapshot = complete(resolved, TERMINAL_TOKEN_NAMES, isHex);
346
+ if (snapshot === null)
347
+ return null;
348
+ messages.push(detached(base?.label ?? ref.theme, scheme));
349
+ return { tokens: snapshot };
350
+ }
351
+ /** A terminal theme's side; null when it is dropped, its reason in `messages`. */
352
+ function importTerminalSide(raw, scheme, themes, messages) {
353
+ const unknown = unknownNames(raw.tokens, TERMINAL_TOKEN_NAMES);
354
+ if (unknown.length > 0)
355
+ messages.push(unknownTokens(unknown));
356
+ const tokens = raw.tokens && pick(raw.tokens, TERMINAL_TOKEN_NAMES);
357
+ const bad = tokens && badValue(tokens, isHex, notHex);
358
+ if (bad) {
359
+ messages.push(bad);
360
+ return null;
361
+ }
362
+ if (raw.base === undefined) {
363
+ const missing = tokens ? missingNames(tokens, TERMINAL_TOKEN_NAMES) : [];
364
+ if (missing.length > 0) {
365
+ messages.push(incomplete(scheme, missing));
366
+ return null;
367
+ }
368
+ }
369
+ return resolveTerminalSide(raw, tokens, scheme, themes, messages);
370
+ }
371
+ /** A checked terminal side with its base reference resolved against `themes`. */
372
+ function resolveTerminalSide(raw, tokens, scheme, themes, messages) {
373
+ if (raw.base === undefined)
374
+ return { tokens: tokens };
375
+ const terminal = importBasedTerminal(raw.base, raw.resolved, tokens, scheme, themes, messages, sideDetached);
376
+ if (terminal)
377
+ return terminal;
378
+ const name = themes.find((t) => t.id === raw.base?.theme)?.label ?? raw.base.theme;
379
+ messages.push(noSnapshot(name, scheme));
380
+ return null;
381
+ }
382
+ /** A UI side turned into the terminal it shows, for a store with no UI slot. */
383
+ function convertSide(raw, scheme, themes, messages) {
384
+ const checked = checkSide(raw, scheme, messages);
385
+ if (checked === null)
386
+ return null;
387
+ if (raw.terminal) {
388
+ return resolveTerminalSide(raw.terminal, checked.terminalTokens, scheme, themes, messages);
389
+ }
390
+ // A based side following its base: the base's own terminal, with the
391
+ // terminal the side showed as its snapshot.
392
+ const base = raw.base;
393
+ const resolved = isObject(raw.resolved) ? raw.resolved.terminal : undefined;
394
+ return resolveTerminalSide({ base: { theme: base.theme, variant: base.variant }, resolved }, undefined, scheme, themes, messages);
395
+ }
396
+ function importEntry(raw, fileKind, themes, taken, slots) {
397
+ const sourceLabel = isObject(raw) && typeof raw.label === "string" ? raw.label : "";
398
+ const converted = fileKind === "ui" && !slots.ui;
399
+ const kind = converted ? "terminal" : fileKind;
400
+ const rejected = (messages) => ({
401
+ sourceLabel,
402
+ kind,
403
+ status: "rejected",
404
+ messages,
405
+ });
406
+ if (!isObject(raw) || sourceLabel.trim() === "") {
407
+ return rejected([BAD_SHAPE]);
408
+ }
409
+ const read = fileKind === "ui" ? readSide : readTerminal;
410
+ const sides = {};
411
+ for (const scheme of SCHEMES) {
412
+ if (raw[scheme] === undefined)
413
+ continue;
414
+ const side = read(raw[scheme]);
415
+ if (side === null)
416
+ return rejected([BAD_SHAPE]);
417
+ sides[scheme] = side;
418
+ }
419
+ if (!sides.light && !sides.dark)
420
+ return rejected([NO_SIDE]);
421
+ if (fileKind === "terminal" && !slots.terminal) {
422
+ return rejected([NO_TERMINAL_SLOT]);
423
+ }
424
+ const messages = converted ? [CONVERTED] : [];
425
+ const label = sourceLabel.trim();
426
+ const theme = kind === "terminal" ? { kind: "terminal", label } : { label };
427
+ for (const scheme of SCHEMES) {
428
+ const raw = sides[scheme];
429
+ if (raw === undefined)
430
+ continue;
431
+ const side = fileKind === "terminal"
432
+ ? importTerminalSide(raw, scheme, themes, messages)
433
+ : converted
434
+ ? convertSide(raw, scheme, themes, messages)
435
+ : importSide(raw, scheme, themes, messages);
436
+ // The kind decides the side type; the union cannot follow it.
437
+ if (side)
438
+ theme[scheme] = side;
439
+ }
440
+ if (!theme.light && !theme.dark)
441
+ return rejected(messages);
442
+ theme.label = uniqueLabel(label, taken);
443
+ const repaired = messages.length > 0;
444
+ if (theme.label !== label)
445
+ messages.splice(converted ? 1 : 0, 0, renamed(label));
446
+ const status = repaired
447
+ ? "adjusted"
448
+ : messages.length > 0
449
+ ? "renamed"
450
+ : "ok";
451
+ return { sourceLabel, kind, status, theme, messages };
452
+ }
453
+ /**
454
+ * Parses and validates a theme file against this app's lists. `existingLabels` are the labels the
455
+ * new themes must not take (custom themes of both kinds, and the base themes of both slots);
456
+ * de-duplication also covers labels taken by earlier entries of the same file. Entries come out
457
+ * in file order, `themes` first, then `terminalThemes`. Never throws.
458
+ */
459
+ export function parseThemeFile(text, themes, existingLabels, { slots = { ui: true, terminal: true } } = {}) {
460
+ if (typeof text !== "string")
461
+ return { ok: false, error: NOT_JSON };
462
+ if (text.length > THEME_FILE_MAX_LENGTH) {
463
+ return { ok: false, error: TOO_LARGE };
464
+ }
465
+ let data;
466
+ try {
467
+ data = JSON.parse(text);
468
+ }
469
+ catch {
470
+ return { ok: false, error: NOT_JSON };
471
+ }
472
+ if (!isObject(data) || data.format !== THEME_FILE_FORMAT) {
473
+ return { ok: false, error: NOT_ORZ };
474
+ }
475
+ if (typeof data.version === "number" && data.version > THEME_FILE_VERSION) {
476
+ return { ok: false, error: NEWER };
477
+ }
478
+ if (data.version !== THEME_FILE_VERSION)
479
+ return { ok: false, error: NOT_ORZ };
480
+ const { themes: ui = [], terminalThemes: terminal = [] } = data;
481
+ if (!Array.isArray(ui) || !Array.isArray(terminal)) {
482
+ return { ok: false, error: NOT_ORZ };
483
+ }
484
+ if (ui.length === 0 && terminal.length === 0) {
485
+ return { ok: false, error: NO_THEMES };
486
+ }
487
+ const taken = [...existingLabels];
488
+ const entries = [
489
+ ...ui.map((raw) => ["ui", raw]),
490
+ ...terminal.map((raw) => ["terminal", raw]),
491
+ ].map(([kind, raw]) => {
492
+ const entry = importEntry(raw, kind, themes, taken, slots);
493
+ if (entry.theme)
494
+ taken.push(entry.theme.label);
495
+ return entry;
496
+ });
497
+ return { ok: true, entries };
498
+ }
499
+ /** "X", or "X (n)" with the lowest n ≥ 2 that is free, compared case-insensitively. */
500
+ export function uniqueLabel(label, taken) {
501
+ const trimmed = label.trim();
502
+ const used = new Set(taken.map((t) => t.trim().toLowerCase()));
503
+ if (!used.has(trimmed.toLowerCase()))
504
+ return trimmed;
505
+ for (let n = 2;; n++) {
506
+ const candidate = `${trimmed} (${n})`;
507
+ if (!used.has(candidate.toLowerCase()))
508
+ return candidate;
509
+ }
510
+ }
511
+ //# sourceMappingURL=theme-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-file.js","sourceRoot":"","sources":["../../src/lib/theme-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export type NavigationLocation = {
2
+ routeId: string;
3
+ params: Record<string, unknown>;
4
+ };
5
+ export type NavigationContext = {
6
+ current: NavigationLocation;
7
+ next: NavigationLocation;
8
+ };
9
+ /** Answers "does this surface hold work that leaving would destroy?" */
10
+ export type DirtySource = () => boolean;
11
+ /**
12
+ * True when this source remains available after the proposed in-app
13
+ * navigation. Document unloads intentionally have no context and therefore
14
+ * never use this escape hatch.
15
+ */
16
+ export type DirtySourceSurvival = (navigation: NavigationContext) => boolean;
17
+ /**
18
+ * Registers a predicate, not a flag: the only reader is the guard, and it
19
+ * reads once — at `beforeunload`, and again before a navigation commits — so
20
+ * nothing has to re-render on the way from clean to dirty. Returns the
21
+ * unregister.
22
+ */
23
+ export declare function registerDirtySource(source: DirtySource, survives?: DirtySourceSurvival): () => void;
24
+ /** True when any registered surface would lose unsaved work. */
25
+ export declare function hasUnsavedWork(navigation?: NavigationContext): boolean;
26
+ /**
27
+ * Registers `isDirty` for the calling component's lifetime. The predicate
28
+ * rides in a ref so the effect below keeps an empty dependency list: a
29
+ * subscription that changed identity every render would tear itself down and
30
+ * rebuild on each keystroke.
31
+ */
32
+ export declare function useDirtySource(isDirty: () => boolean, survives?: DirtySourceSurvival): void;
33
+ //# sourceMappingURL=unsaved-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unsaved-guard.d.ts","sourceRoot":"","sources":["../../src/lib/unsaved-guard.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,EAAE,kBAAkB,CAAC;CAC1B,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,iBAAiB,KAAK,OAAO,CAAC;AAS7E;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,MAAM,IAAI,CAMZ;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAUtE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,OAAO,EACtB,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,IAAI,CAWN"}
@@ -0,0 +1,37 @@
1
+ import { useEffect, useRef } from "react";
2
+ const sources = new Set();
3
+ /**
4
+ * Registers a predicate, not a flag: the only reader is the guard, and it
5
+ * reads once — at `beforeunload`, and again before a navigation commits — so
6
+ * nothing has to re-render on the way from clean to dirty. Returns the
7
+ * unregister.
8
+ */
9
+ export function registerDirtySource(source, survives) {
10
+ const registered = { isDirty: source, survives };
11
+ sources.add(registered);
12
+ return () => {
13
+ sources.delete(registered);
14
+ };
15
+ }
16
+ /** True when any registered surface would lose unsaved work. */
17
+ export function hasUnsavedWork(navigation) {
18
+ for (const source of sources) {
19
+ if (source.isDirty() &&
20
+ (navigation === undefined || source.survives?.(navigation) !== true)) {
21
+ return true;
22
+ }
23
+ }
24
+ return false;
25
+ }
26
+ /**
27
+ * Registers `isDirty` for the calling component's lifetime. The predicate
28
+ * rides in a ref so the effect below keeps an empty dependency list: a
29
+ * subscription that changed identity every render would tear itself down and
30
+ * rebuild on each keystroke.
31
+ */
32
+ export function useDirtySource(isDirty, survives) {
33
+ const current = useRef({ isDirty, survives });
34
+ current.current = { isDirty, survives };
35
+ useEffect(() => registerDirtySource(() => current.current.isDirty(), (navigation) => current.current.survives?.(navigation) === true), []);
36
+ }
37
+ //# sourceMappingURL=unsaved-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unsaved-guard.js","sourceRoot":"","sources":["../../src/lib/unsaved-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AA2B1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAmB,EACnB,QAA8B;IAE9B,MAAM,UAAU,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAAC,UAA8B;IAC3D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IACE,MAAM,CAAC,OAAO,EAAE;YAChB,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,EACpE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAsB,EACtB,QAA8B;IAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACxC,SAAS,CACP,GAAG,EAAE,CACH,mBAAmB,CACjB,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAC/B,CAAC,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,CAChE,EACH,EAAE,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ClassValue } from "clsx";
2
+ export declare function cn(...inputs: ClassValue[]): string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAC;AAG7C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
@@ -0,0 +1,6 @@
1
+ import { clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+ export function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
6
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,IAAI,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AnyCustomTheme } from "@orz/themes";
2
+ /**
3
+ * The custom themes stored as JSON, keeping each entry whose shape
4
+ * `composeTheme` or `composeTerminalTheme` can read and dropping the rest;
5
+ * `[]` for anything that is not a JSON array.
6
+ */
7
+ export declare function parseCustomThemes(raw: string | null): AnyCustomTheme[];
8
+ //# sourceMappingURL=custom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/theme/custom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAuClD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,EAAE,CAStE"}