@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,21 @@
1
+ import type { TerminalTheme } from "@orz/themes";
2
+ import { type ImportEntry } from "../../lib/theme-file.ts";
3
+ export interface ImportPanelProps {
4
+ /** The lists the file's references resolve against (UI and terminal-only together). */
5
+ themes: readonly TerminalTheme[];
6
+ /** Labels imported themes must not take: custom themes of both kinds, and both slots' base themes. */
7
+ labels: readonly string[];
8
+ /** The store's slots: a terminal theme needs a terminal, and a UI theme without a UI slot comes in as a terminal theme. */
9
+ slots: {
10
+ ui: boolean;
11
+ terminal: boolean;
12
+ };
13
+ /** Writes the checked themes; ids are the caller's. */
14
+ onImport: (themes: NonNullable<ImportEntry["theme"]>[]) => void;
15
+ /** Why the last import could not be written, if it failed. */
16
+ error: string | null;
17
+ onBack: () => void;
18
+ }
19
+ /** Takes a theme file (pasted, chosen or dropped) and lists what it would add before writing anything. */
20
+ export declare function ImportPanel({ themes, labels, slots, onImport, error, onBack, }: ImportPanelProps): import("react").JSX.Element;
21
+ //# sourceMappingURL=import-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-panel.d.ts","sourceRoot":"","sources":["../../../src/components/theme-editor/import-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EACL,KAAK,WAAW,EAKjB,MAAM,yBAAyB,CAAC;AAKjC,MAAM,WAAW,gBAAgB;IAC/B,uFAAuF;IACvF,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IACjC,sGAAsG;IACtG,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,2HAA2H;IAC3H,KAAK,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,uDAAuD;IACvD,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;IAChE,8DAA8D;IAC9D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAyBD,0GAA0G;AAC1G,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,MAAM,EACN,KAAK,EACL,QAAQ,EACR,KAAK,EACL,MAAM,GACP,EAAE,gBAAgB,+BAgLlB"}
@@ -0,0 +1,117 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useId, useRef, useState } from "react";
3
+ import { parseThemeFile, THEME_FILE_MAX_LENGTH, } from "../../lib/theme-file.js";
4
+ import { cn } from "../../lib/utils.js";
5
+ import { Button } from "../button.js";
6
+ import { Textarea } from "../textarea.js";
7
+ const PARSE_DELAY = 200;
8
+ const TOO_LARGE = "This file is too large to be a theme file.";
9
+ const STATUS = {
10
+ ok: {
11
+ label: "OK",
12
+ className: "bg-emerald-500/15 text-emerald-800 dark:text-emerald-200",
13
+ },
14
+ renamed: {
15
+ label: "Renamed",
16
+ className: "bg-sky-500/15 text-sky-800 dark:text-sky-200",
17
+ },
18
+ adjusted: {
19
+ label: "Adjusted",
20
+ className: "bg-amber-500/15 text-amber-800 dark:text-amber-200",
21
+ },
22
+ rejected: {
23
+ label: "Rejected",
24
+ className: "bg-destructive/10 text-[color-mix(in_oklab,var(--destructive),var(--foreground)_65%)]",
25
+ },
26
+ };
27
+ /** Takes a theme file (pasted, chosen or dropped) and lists what it would add before writing anything. */
28
+ export function ImportPanel({ themes, labels, slots, onImport, error, onBack, }) {
29
+ const [text, setText] = useState("");
30
+ const [result, setResult] = useState(null);
31
+ // Rows the user unchecked, by index; a fresh parse checks every row again.
32
+ const [excluded, setExcluded] = useState(new Set());
33
+ const [fileError, setFileError] = useState(null);
34
+ const [dragging, setDragging] = useState(false);
35
+ const fileInput = useRef(null);
36
+ const reading = useRef(0);
37
+ const statusId = useId();
38
+ useEffect(() => {
39
+ if (text.trim() === "") {
40
+ setResult(null);
41
+ return;
42
+ }
43
+ const timer = setTimeout(() => {
44
+ setResult(parseThemeFile(text, themes, labels, { slots }));
45
+ setExcluded(new Set());
46
+ }, PARSE_DELAY);
47
+ return () => clearTimeout(timer);
48
+ }, [text, themes, labels, slots]);
49
+ const edit = (next) => {
50
+ reading.current++;
51
+ setFileError(null);
52
+ setText(next);
53
+ };
54
+ const readFile = async (file) => {
55
+ if (file === undefined)
56
+ return;
57
+ const token = ++reading.current;
58
+ // Checked before reading, so a huge file is never loaded into memory.
59
+ if (file.size > THEME_FILE_MAX_LENGTH) {
60
+ setFileError(TOO_LARGE);
61
+ return;
62
+ }
63
+ let content;
64
+ try {
65
+ content = await file.text();
66
+ }
67
+ catch {
68
+ if (token === reading.current) {
69
+ setFileError(`"${file.name}" could not be read.`);
70
+ }
71
+ return;
72
+ }
73
+ if (token !== reading.current)
74
+ return;
75
+ setFileError(null);
76
+ setText(content);
77
+ };
78
+ const drop = (event) => {
79
+ event.preventDefault();
80
+ setDragging(false);
81
+ void readFile(event.dataTransfer.files[0]);
82
+ };
83
+ const entries = result?.ok ? result.entries : [];
84
+ const picked = entries.flatMap((entry, i) => entry.theme && !excluded.has(i) ? [entry.theme] : []);
85
+ const problem = fileError ?? (result?.ok === false ? result.error : null);
86
+ const toggle = (index, on) => setExcluded((prev) => {
87
+ const next = new Set(prev);
88
+ if (on)
89
+ next.delete(index);
90
+ else
91
+ next.add(index);
92
+ return next;
93
+ });
94
+ return (_jsxs("div", { className: cn("-m-2 flex flex-col gap-3 rounded-lg p-2", dragging && "bg-primary/5 ring-2 ring-primary/40"), onDragOver: (event) => {
95
+ if (!event.dataTransfer.types.includes("Files"))
96
+ return;
97
+ event.preventDefault();
98
+ setDragging(true);
99
+ }, onDragLeave: (event) => {
100
+ if (!event.currentTarget.contains(event.relatedTarget)) {
101
+ setDragging(false);
102
+ }
103
+ }, onDrop: drop, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("h3", { className: "flex-1 text-sm font-medium", children: "Import themes" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: onBack, children: "Back to the theme" })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Paste a theme file, choose one, or drop it on this panel. Nothing is added until you import." }), _jsx(Textarea, { "aria-label": "Theme file", "aria-describedby": problem ? statusId : undefined, "aria-invalid": problem ? true : undefined, spellCheck: false, placeholder: '{ "format": "orz-themes", \u2026 }', className: "field-sizing-fixed h-40 resize-y font-mono text-xs md:text-xs", value: text, onChange: (event) => edit(event.target.value) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => fileInput.current?.click(), children: "Choose file\u2026" }), _jsx("input", { ref: fileInput, type: "file", accept: ".json,application/json", hidden: true, "data-testid": "theme-file-input", onChange: (event) => {
104
+ void readFile(event.target.files?.[0]);
105
+ // The same file chosen again still fires a change.
106
+ event.target.value = "";
107
+ } })] }), problem && (_jsx("p", { id: statusId, role: "alert", className: "text-xs text-[color-mix(in_oklab,var(--destructive),var(--foreground)_65%)]", children: problem })), entries.length > 0 && (_jsx("ul", { "aria-label": "Themes in the file", className: "flex flex-col gap-1.5", children: entries.map((entry, i) => (_jsx(ImportRow
108
+ // biome-ignore lint/suspicious/noArrayIndexKey: entries are positional; labels may repeat within a file.
109
+ , { entry: entry, checked: entry.theme !== undefined && !excluded.has(i), onCheckedChange: (on) => toggle(i, on) }, i))) })), error && (_jsx("p", { role: "alert", className: "text-xs text-[color-mix(in_oklab,var(--destructive),var(--foreground)_65%)]", children: error })), entries.length > 0 && (_jsx("div", { className: "flex justify-end", children: _jsxs(Button, { type: "button", size: "sm", disabled: picked.length === 0, onClick: () => onImport(picked), children: ["Import ", picked.length] }) }))] }));
110
+ }
111
+ function ImportRow({ entry, checked, onCheckedChange, }) {
112
+ const id = useId();
113
+ const status = STATUS[entry.status];
114
+ const label = entry.theme?.label ?? (entry.sourceLabel || "Untitled theme");
115
+ return (_jsxs("li", { "data-status": entry.status, className: "flex items-start gap-2.5 rounded-lg border p-2.5", children: [_jsx("input", { id: id, type: "checkbox", className: "mt-0.5 size-4 shrink-0 accent-primary disabled:opacity-50", checked: checked, disabled: entry.theme === undefined, onChange: (event) => onCheckedChange(event.target.checked) }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("label", { htmlFor: id, className: "min-w-0 flex-1 truncate text-sm", children: label }), entry.kind === "terminal" && (_jsx("span", { className: "shrink-0 rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground", children: "Terminal" })), _jsx("span", { className: cn("shrink-0 rounded-full px-2 py-0.5 text-xs font-medium", status.className), children: status.label })] }), entry.messages.map((message) => (_jsx("p", { className: "text-xs text-muted-foreground", children: message }, message)))] })] }));
116
+ }
117
+ //# sourceMappingURL=import-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-panel.js","sourceRoot":"","sources":["../../../src/components/theme-editor/import-panel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type AnyCustomTheme, type TerminalTheme } from "@orz/themes";
2
+ type Kind = "ui" | "terminal";
3
+ export interface ThemeListProps {
4
+ /** The store's custom themes of the kinds this editor offers, in its order. */
5
+ customs: readonly AnyCustomTheme[];
6
+ /** The kinds this store offers, UI first; with both, the list groups them and New asks which. */
7
+ kinds: readonly Kind[];
8
+ /** The draft in the form; listed last in its group when the store does not hold it (new, or deleted elsewhere). */
9
+ draft: AnyCustomTheme;
10
+ dirty: boolean;
11
+ /** The base lists, to flag themes that no longer compose. */
12
+ themes: readonly TerminalTheme[];
13
+ onSelect: (id: string) => void;
14
+ onNew: (kind: Kind) => void;
15
+ onImport: () => void;
16
+ exportAllDisabled: boolean;
17
+ onExportAll: () => void;
18
+ }
19
+ export declare const displayLabel: (label: string) => string;
20
+ /** The header: which custom theme the form edits, and the list-wide actions. */
21
+ export declare function ThemeList({ customs, kinds, draft, dirty, themes, onSelect, onNew, onImport, exportAllDisabled, onExportAll, }: ThemeListProps): import("react").JSX.Element;
22
+ export {};
23
+ //# sourceMappingURL=theme-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-list.d.ts","sourceRoot":"","sources":["../../../src/components/theme-editor/theme-list.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAoBrB,KAAK,IAAI,GAAG,IAAI,GAAG,UAAU,CAAC;AAE9B,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IACnC,iGAAiG;IACjG,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,mHAAmH;IACnH,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,6DAA6D;IAC7D,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IACjC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,UAAW,MAAM,WAAqC,CAAC;AAahF,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,WAAW,GACZ,EAAE,cAAc,+BA+GhB"}
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { isCustomTerminalTheme, } from "@orz/themes";
3
+ import { ChevronDownIcon, PlusIcon, TriangleAlertIcon } from "lucide-react";
4
+ import { Button } from "../button.js";
5
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "../dropdown-menu.js";
6
+ import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from "../select.js";
7
+ import { composeDraft } from "./draft.js";
8
+ export const displayLabel = (label) => label.trim() || "Untitled theme";
9
+ const GROUP_LABEL = {
10
+ ui: "Themes",
11
+ terminal: "Terminal themes",
12
+ };
13
+ const NEW_LABEL = {
14
+ ui: "Theme",
15
+ terminal: "Terminal theme",
16
+ };
17
+ const kindOf = (custom) => isCustomTerminalTheme(custom) ? "terminal" : "ui";
18
+ /** The header: which custom theme the form edits, and the list-wide actions. */
19
+ export function ThemeList({ customs, kinds, draft, dirty, themes, onSelect, onNew, onImport, exportAllDisabled, onExportAll, }) {
20
+ const entries = customs.some((c) => c.id === draft.id)
21
+ ? customs
22
+ : [...customs, draft];
23
+ const groups = kinds.map((kind) => ({
24
+ kind,
25
+ entries: entries.filter((c) => kindOf(c) === kind),
26
+ }));
27
+ const grouped = kinds.length > 1;
28
+ const item = (custom) => {
29
+ const current = custom.id === draft.id;
30
+ const unavailable = composeDraft(custom, themes) === null;
31
+ return (_jsxs(SelectItem, { value: custom.id, children: [_jsx("span", { className: "truncate", children: displayLabel(current ? draft.label : custom.label) }), current && dirty && (_jsx("span", { "data-unsaved": true, title: "Unsaved changes", className: "size-1.5 shrink-0 rounded-full bg-primary", children: _jsx("span", { className: "sr-only", children: "(unsaved)" }) })), unavailable && (_jsxs("span", { "data-unavailable": true, title: "Its base themes are missing, so the theme menu does not show it.", className: "text-amber-700 dark:text-amber-300", children: [_jsx(TriangleAlertIcon, { "aria-hidden": true, className: "size-3.5" }), _jsx("span", { className: "sr-only", children: "(base missing)" })] }))] }, custom.id));
32
+ };
33
+ return (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsxs(Select, { value: draft.id, onValueChange: (id) => {
34
+ if (id !== draft.id)
35
+ onSelect(id);
36
+ }, children: [_jsx(SelectTrigger, { "aria-label": "Custom theme", size: "sm", className: "min-w-0 flex-1", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { position: "popper", children: grouped
37
+ ? groups
38
+ .filter((g) => g.entries.length > 0)
39
+ .map((g) => (_jsxs(SelectGroup, { children: [_jsx(SelectLabel, { children: GROUP_LABEL[g.kind] }), g.entries.map(item)] }, g.kind)))
40
+ : entries.map(item) })] }), grouped ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "outline", size: "sm", children: [_jsx(PlusIcon, { "aria-hidden": true }), "New", _jsx(ChevronDownIcon, { "aria-hidden": true })] }) }), _jsx(DropdownMenuContent, { align: "end", children: kinds.map((kind) => (_jsx(DropdownMenuItem, { onSelect: () => onNew(kind), children: NEW_LABEL[kind] }, kind))) })] })) : (_jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onNew(kinds[0] ?? "ui"), children: [_jsx(PlusIcon, { "aria-hidden": true }), "New"] })), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: onImport, children: "Import\u2026" }), _jsx(Button, { type: "button", variant: "outline", size: "sm", disabled: exportAllDisabled, onClick: onExportAll, children: "Export all" })] }));
41
+ }
42
+ //# sourceMappingURL=theme-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-list.js","sourceRoot":"","sources":["../../../src/components/theme-editor/theme-list.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { AnyCustomTheme, ColorScheme, TerminalTokenName, TerminalTokens, TokenName, Tokens } from "@orz/themes";
2
+ import { type Dispatch } from "react";
3
+ import { type DraftAction, type TerminalTarget } from "./draft.ts";
4
+ interface TokenListCommon {
5
+ draft: AnyCustomTheme;
6
+ dispatch: Dispatch<DraftAction>;
7
+ /**
8
+ * The groups the user opened or closed, by group id. Pass it with
9
+ * `onOpenGroupsChange` to keep them per tab while the list unmounts;
10
+ * absent, the list keeps its own.
11
+ */
12
+ openGroups?: Readonly<Record<string, boolean>>;
13
+ onOpenGroupsChange?: (openGroups: Record<string, boolean>) => void;
14
+ }
15
+ export type TokenListProps = TokenListCommon & ({
16
+ kind: "ui";
17
+ scheme: ColorScheme;
18
+ /** The colours the side shows now. */
19
+ values: Tokens;
20
+ /** A drag in a picker; `null` when its popover closes. */
21
+ onPreview?: (name: TokenName, value: string | null) => void;
22
+ } | {
23
+ kind: "terminal";
24
+ target: TerminalTarget;
25
+ values: TerminalTokens;
26
+ onPreview?: (name: TerminalTokenName, value: string | null) => void;
27
+ });
28
+ export declare function TokenList(props: TokenListProps): import("react").JSX.Element;
29
+ export {};
30
+ //# sourceMappingURL=token-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-list.d.ts","sourceRoot":"","sources":["../../../src/components/theme-editor/token-list.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EAEX,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,MAAM,EACP,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,QAAQ,EAAmB,MAAM,OAAO,CAAC;AAQvD,OAAO,EACL,KAAK,WAAW,EAIhB,KAAK,cAAc,EAEpB,MAAM,YAAY,CAAC;AAYpB,UAAU,eAAe;IACvB,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChC;;;;OAIG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACpE;AAED,MAAM,MAAM,cAAc,GAAG,eAAe,GAC1C,CACI;IACE,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7D,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACrE,CACJ,CAAC;AAEJ,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BA6C9C"}
@@ -0,0 +1,124 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ChevronRightIcon, RotateCcwIcon } from "lucide-react";
3
+ import { useId, useState } from "react";
4
+ import { contrastRatio, parseColor } from "../../lib/color.js";
5
+ import { cn } from "../../lib/utils.js";
6
+ import { ColorPickerPopover } from "../color-picker.js";
7
+ import { MatchedText, matchText } from "../filter-menu.js";
8
+ import { Input } from "../input.js";
9
+ import { Label } from "../label.js";
10
+ import { Switch } from "../switch.js";
11
+ import { isOverridden, isTerminalOverridden, sideMode, terminalMode, } from "./draft.js";
12
+ import { rowTokens, TERMINAL_CONTRAST_WITH, TERMINAL_TOKEN_GROUPS, UI_CONTRAST_WITH, UI_TOKEN_GROUPS, } from "./tokens.js";
13
+ export function TokenList(props) {
14
+ const { draft, dispatch, openGroups, onOpenGroupsChange } = props;
15
+ if (props.kind === "ui") {
16
+ const { scheme } = props;
17
+ return (_jsx(TokenListView, { groups: UI_TOKEN_GROUPS, values: props.values, contrastWith: UI_CONTRAST_WITH, format: "oklch", showState: sideMode(draft, scheme) === "based",
18
+ // The UI list only ever shows a UI theme.
19
+ overridden: (name) => isOverridden(draft, scheme, name), onPreview: props.onPreview, onCommit: (name, value) => dispatch({ type: "setToken", scheme, name, value }), onReset: (name) => dispatch({ type: "resetToken", scheme, name }), openGroups: openGroups, onOpenGroupsChange: onOpenGroupsChange }));
20
+ }
21
+ const { target } = props;
22
+ // A shared terminal is equal on both sides, so either one answers.
23
+ const scheme = target === "both" ? (draft.light ? "light" : "dark") : target;
24
+ const mode = terminalMode(draft, scheme);
25
+ return (_jsx(TokenListView, { groups: TERMINAL_TOKEN_GROUPS, values: props.values, contrastWith: TERMINAL_CONTRAST_WITH, format: "hex", showState: mode === "based" || mode === "follow", overridden: (name) => isTerminalOverridden(draft, scheme, name), onPreview: props.onPreview, onCommit: (name, value) => dispatch({ type: "setTerminalToken", target, name, value }), onReset: (name) => dispatch({ type: "resetTerminalToken", target, name }), openGroups: openGroups, onOpenGroupsChange: onOpenGroupsChange }));
26
+ }
27
+ // The default trigger's checkerboard, so a translucent colour reads as one.
28
+ const CHECKERBOARD = {
29
+ backgroundImage: "conic-gradient(#ccc 25%, #fff 0 50%, #ccc 0 75%, #fff 0)",
30
+ backgroundSize: "8px 8px",
31
+ };
32
+ function TokenListView({ groups, values, contrastWith, format, showState, overridden, onPreview, onCommit, onReset, openGroups: controlledOpen, onOpenGroupsChange, }) {
33
+ const id = useId();
34
+ const [query, setQuery] = useState("");
35
+ const [onlyOverridden, setOnlyOverridden] = useState(false);
36
+ const [ownOpen, setOwnOpen] = useState({});
37
+ const opened = controlledOpen ?? ownOpen;
38
+ const q = query.trim();
39
+ const only = showState && onlyOverridden;
40
+ const filtering = q !== "" || only;
41
+ // Toggles made while filtering last until the filter changes, so clearing
42
+ // it brings back the groups the user had open.
43
+ const filterKey = `${q}\0${only}`;
44
+ const [filterOpen, setFilterOpen] = useState({ key: filterKey, open: {} });
45
+ const transient = filterOpen.key === filterKey ? filterOpen.open : {};
46
+ const passes = (entry) => (q === "" ||
47
+ matchText(entry.label, q) !== null ||
48
+ matchText(entry.name, q) !== null) &&
49
+ (!only || overridden(entry.name));
50
+ const shown = groups
51
+ .map((group, index) => {
52
+ const names = group.rows.flatMap((row) => rowTokens(row).map((t) => t.name));
53
+ const count = showState ? names.filter(overridden).length : 0;
54
+ const rows = group.rows.filter((row) => rowTokens(row).some(passes));
55
+ const open = filtering
56
+ ? (transient[group.id] ?? true)
57
+ : (opened[group.id] ?? (index === 0 || count > 0));
58
+ return { group, count, rows, open };
59
+ })
60
+ .filter(({ rows }) => rows.length > 0);
61
+ const toggle = (groupId, open) => {
62
+ if (filtering) {
63
+ setFilterOpen({
64
+ key: filterKey,
65
+ open: { ...transient, [groupId]: open },
66
+ });
67
+ return;
68
+ }
69
+ const next = { ...opened, [groupId]: open };
70
+ if (onOpenGroupsChange)
71
+ onOpenGroupsChange(next);
72
+ if (controlledOpen === undefined)
73
+ setOwnOpen(next);
74
+ };
75
+ const swatchFor = (entry, className) => {
76
+ const others = new Set();
77
+ for (const [name, value] of Object.entries(values)) {
78
+ if (name !== entry.name)
79
+ others.add(value);
80
+ }
81
+ const against = contrastWith[entry.name];
82
+ return (_jsx(ColorPickerPopover, { value: values[entry.name], format: format, alpha: true, swatches: [{ label: "This theme", colors: [...others] }], contrastWith: against === undefined ? undefined : values[against], contrastLabel: against, onValueChange: (value) => onPreview?.(entry.name, value), onValueCommit: (value) => onCommit(entry.name, value), onOpenChange: (open) => {
83
+ if (!open)
84
+ onPreview?.(entry.name, null);
85
+ }, align: "end", "aria-label": `${entry.label} (${entry.name})`, children: _jsx("button", { type: "button", title: values[entry.name], className: cn("size-7 shrink-0 overflow-hidden rounded-md border border-black/15 shadow-xs outline-none focus-visible:ring-3 focus-visible:ring-ring/50 dark:border-white/15", className), style: CHECKERBOARD, children: _jsx("span", { className: "block size-full", style: { background: values[entry.name] } }) }) }));
86
+ };
87
+ const resetButton = (entry) => (_jsx("button", { type: "button", "aria-label": `Reset ${entry.name}`, title: "Remove the override", onClick: () => onReset(entry.name), className: "inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(RotateCcwIcon, { className: "size-3" }) }));
88
+ const state = (entry) => {
89
+ if (!showState)
90
+ return null;
91
+ return overridden(entry.name) ? (_jsxs("span", { className: "flex shrink-0 items-center gap-0.5 text-xs", children: ["overridden", resetButton(entry)] })) : (_jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: "inherited" }));
92
+ };
93
+ const entryRow = (entry) => (_jsxs("div", { className: "flex min-h-8 items-center gap-2", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate text-sm", children: _jsx(MatchedText, { text: entry.label, query: q }) }), _jsx("div", { className: "truncate font-mono text-[11px] text-muted-foreground", children: _jsx(MatchedText, { text: entry.name, query: q }) })] }), state(entry), swatchFor(entry)] }, entry.name));
94
+ const renderRow = (row, key) => {
95
+ if (row.kind === "single") {
96
+ return _jsx("li", { children: entryRow(row.token) }, key);
97
+ }
98
+ if (row.kind === "pair") {
99
+ return (_jsxs("li", { className: "flex gap-3", children: [_jsx(PairSample, { surface: values[row.surface.name], text: values[row.text.name], label: `${row.text.label} on ${row.surface.label}` }), _jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [entryRow(row.surface), entryRow(row.text)] })] }, key));
100
+ }
101
+ return (_jsx("li", { className: "grid gap-1", style: {
102
+ gridTemplateColumns: `repeat(${row.tokens.length}, minmax(0, 1fr))`,
103
+ }, children: row.tokens.map((entry) => passes(entry) ? (_jsxs("div", { className: "flex min-w-0 flex-col items-center gap-0.5", children: [swatchFor(entry, "h-7 w-full"), _jsx("span", { title: entry.name, className: cn("max-w-full truncate text-[10px]", showState && !overridden(entry.name)
104
+ ? "text-muted-foreground"
105
+ : undefined), children: _jsx(MatchedText, { text: entry.label, query: q }) }), showState && overridden(entry.name) && resetButton(entry)] }, entry.name)) : (_jsx("div", { "aria-hidden": true }, entry.name))) }, key));
106
+ };
107
+ return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Input, { type: "search", value: query, onChange: (event) => setQuery(event.target.value), onKeyDown: (event) => {
108
+ if (event.key === "Escape" && query !== "")
109
+ setQuery("");
110
+ }, "data-keeps-escape": query !== "" ? "" : undefined, placeholder: "Find a colour\u2026", "aria-label": "Find a colour", className: "h-7 flex-1" }), showState && (_jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [_jsx(Switch, { id: `${id}-only`, checked: onlyOverridden, onCheckedChange: setOnlyOverridden }), _jsx(Label, { htmlFor: `${id}-only`, className: "text-xs font-normal", children: "Only overridden" })] }))] }), shown.length === 0 ? (_jsx("p", { className: "py-4 text-center text-sm text-muted-foreground", children: only && q === ""
111
+ ? "No colours are overridden."
112
+ : "No colours match." })) : (shown.map(({ group, count, rows, open }) => (_jsxs("section", { className: "border-t pt-1", children: [_jsxs("button", { type: "button", "aria-expanded": open, "aria-controls": `${id}-${group.id}`, onClick: () => toggle(group.id, !open), className: "flex w-full items-center gap-1.5 rounded py-1 text-left text-sm font-medium hover:bg-accent/50", children: [_jsx(ChevronRightIcon, { "aria-hidden": true, className: cn("size-3.5 text-muted-foreground transition-transform", open && "rotate-90") }), group.label, count > 0 && (_jsxs("span", { className: "ml-auto text-xs font-normal text-muted-foreground", children: [count, " overridden"] }))] }), open && (_jsx("ul", { id: `${id}-${group.id}`, className: "space-y-2 pt-1 pb-2", children: rows.map((r) => renderRow(r, group.rows.indexOf(r))) }))] }, group.id))))] }));
113
+ }
114
+ /** "Aa" in the pair's colours, with their WCAG 2 ratio; amber below 4.5:1. */
115
+ function PairSample({ surface, text, label, }) {
116
+ const bg = parseColor(surface);
117
+ const fg = parseColor(text);
118
+ const ratio = bg && fg ? contrastRatio(fg.color, bg.color) : null;
119
+ const low = ratio !== null && ratio < 4.5;
120
+ return (_jsxs("div", { className: "flex w-14 shrink-0 flex-col items-center gap-1 pt-0.5", children: [_jsx("div", { "aria-hidden": true, className: "flex h-9 w-full items-center justify-center rounded-md border text-base font-semibold", style: { background: surface, color: text }, children: "Aa" }), ratio !== null && (_jsx("span", { "data-contrast": true, "data-low": low || undefined, title: `WCAG 2 contrast of ${label}`, className: cn("font-mono text-[11px] tabular-nums", low
121
+ ? "text-amber-700 dark:text-amber-300"
122
+ : "text-muted-foreground"), children: `${(Math.floor(ratio * 100 + 1e-6) / 100).toFixed(2)}:1` }))] }));
123
+ }
124
+ //# sourceMappingURL=token-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-list.js","sourceRoot":"","sources":["../../../src/components/theme-editor/token-list.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { TerminalTokenName, TokenName } from "@orz/themes";
2
+ export interface TokenEntry<N extends string> {
3
+ name: N;
4
+ label: string;
5
+ }
6
+ /**
7
+ * `pair`: a surface and the text drawn on it, sharing a row with an "Aa"
8
+ * sample. `strip`: swatches side by side (the five charts, one ANSI row).
9
+ */
10
+ export type TokenRow<N extends string> = {
11
+ kind: "pair";
12
+ surface: TokenEntry<N>;
13
+ text: TokenEntry<N>;
14
+ } | {
15
+ kind: "single";
16
+ token: TokenEntry<N>;
17
+ } | {
18
+ kind: "strip";
19
+ tokens: TokenEntry<N>[];
20
+ };
21
+ export interface TokenGroup<N extends string> {
22
+ id: string;
23
+ label: string;
24
+ rows: TokenRow<N>[];
25
+ }
26
+ export declare const UI_TOKEN_GROUPS: readonly TokenGroup<TokenName>[];
27
+ export declare const TERMINAL_TOKEN_GROUPS: readonly TokenGroup<TerminalTokenName>[];
28
+ /** The token names a row or group holds, in display order. */
29
+ export declare function rowTokens<N extends string>(row: TokenRow<N>): TokenEntry<N>[];
30
+ export declare function groupTokens<N extends string>(group: TokenGroup<N>): N[];
31
+ /**
32
+ * The surface a single token is drawn on, for its popover's contrast ratio.
33
+ * Pair members are absent: their row shows the pair's ratio.
34
+ */
35
+ export declare const UI_CONTRAST_WITH: Readonly<Partial<Record<TokenName, TokenName>>>;
36
+ export declare const TERMINAL_CONTRAST_WITH: Readonly<Partial<Record<TerminalTokenName, TerminalTokenName>>>;
37
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../src/components/theme-editor/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM;IAC1C,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,IACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;CAAE,CAAC;AAE/C,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;CACrB;AA6BD,eAAO,MAAM,eAAe,EAAE,SAAS,UAAU,CAAC,SAAS,CAAC,EAwE3D,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,SAAS,UAAU,CAAC,iBAAiB,CAAC,EAoCzE,CAAC;AAEF,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAI7E;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAEvE;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAe1E,CAAC;AAEJ,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAOtD,CAAC"}