@orz/ui 0.0.0-stage → 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +29 -0
- package/README.md +541 -2
- package/dist/components/avatar.d.ts +14 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +23 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +10 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +26 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.d.ts +11 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +40 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/card.d.ts +12 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +25 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/color-picker.d.ts +58 -0
- package/dist/components/color-picker.d.ts.map +1 -0
- package/dist/components/color-picker.js +950 -0
- package/dist/components/color-picker.js.map +1 -0
- package/dist/components/confirm-dialog.d.ts +26 -0
- package/dist/components/confirm-dialog.d.ts.map +1 -0
- package/dist/components/confirm-dialog.js +18 -0
- package/dist/components/confirm-dialog.js.map +1 -0
- package/dist/components/dialog.d.ts +26 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +149 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +30 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu.js +100 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/filter-menu.d.ts +98 -0
- package/dist/components/filter-menu.d.ts.map +1 -0
- package/dist/components/filter-menu.js +745 -0
- package/dist/components/filter-menu.js.map +1 -0
- package/dist/components/highlighted-input.d.ts +40 -0
- package/dist/components/highlighted-input.d.ts.map +1 -0
- package/dist/components/highlighted-input.js +95 -0
- package/dist/components/highlighted-input.js.map +1 -0
- package/dist/components/hover-card.d.ts +7 -0
- package/dist/components/hover-card.d.ts.map +1 -0
- package/dist/components/hover-card.js +22 -0
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/input.d.ts +4 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +7 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/label.d.ts +5 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.js +8 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/link-chip.d.ts +67 -0
- package/dist/components/link-chip.d.ts.map +1 -0
- package/dist/components/link-chip.js +71 -0
- package/dist/components/link-chip.js.map +1 -0
- package/dist/components/load-failure.d.ts +24 -0
- package/dist/components/load-failure.d.ts.map +1 -0
- package/dist/components/load-failure.js +27 -0
- package/dist/components/load-failure.js.map +1 -0
- package/dist/components/load-more.d.ts +15 -0
- package/dist/components/load-more.d.ts.map +1 -0
- package/dist/components/load-more.js +25 -0
- package/dist/components/load-more.js.map +1 -0
- package/dist/components/media-controls.d.ts +50 -0
- package/dist/components/media-controls.d.ts.map +1 -0
- package/dist/components/media-controls.js +71 -0
- package/dist/components/media-controls.js.map +1 -0
- package/dist/components/popover.d.ts +9 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +82 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/query-box.d.ts +78 -0
- package/dist/components/query-box.d.ts.map +1 -0
- package/dist/components/query-box.js +332 -0
- package/dist/components/query-box.js.map +1 -0
- package/dist/components/query-highlight.d.ts +14 -0
- package/dist/components/query-highlight.d.ts.map +1 -0
- package/dist/components/query-highlight.js +132 -0
- package/dist/components/query-highlight.js.map +1 -0
- package/dist/components/select.d.ts +19 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +38 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +5 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +9 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +16 -0
- package/dist/components/sheet.d.ts.map +1 -0
- package/dist/components/sheet.js +41 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/skeleton.d.ts +3 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +7 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.d.ts +8 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +14 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/sonner.d.ts +4 -0
- package/dist/components/sonner.d.ts.map +1 -0
- package/dist/components/sonner.js +26 -0
- package/dist/components/sonner.js.map +1 -0
- package/dist/components/switch.d.ts +5 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +8 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +11 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +28 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +8 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +18 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +4 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +7 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/theme-editor/draft.d.ts +235 -0
- package/dist/components/theme-editor/draft.d.ts.map +1 -0
- package/dist/components/theme-editor/draft.js +638 -0
- package/dist/components/theme-editor/draft.js.map +1 -0
- package/dist/components/theme-editor/export-panel.d.ts +14 -0
- package/dist/components/theme-editor/export-panel.d.ts.map +1 -0
- package/dist/components/theme-editor/export-panel.js +39 -0
- package/dist/components/theme-editor/export-panel.js.map +1 -0
- package/dist/components/theme-editor/form.d.ts +69 -0
- package/dist/components/theme-editor/form.d.ts.map +1 -0
- package/dist/components/theme-editor/form.js +350 -0
- package/dist/components/theme-editor/form.js.map +1 -0
- package/dist/components/theme-editor/import-panel.d.ts +21 -0
- package/dist/components/theme-editor/import-panel.d.ts.map +1 -0
- package/dist/components/theme-editor/import-panel.js +117 -0
- package/dist/components/theme-editor/import-panel.js.map +1 -0
- package/dist/components/theme-editor/theme-list.d.ts +23 -0
- package/dist/components/theme-editor/theme-list.d.ts.map +1 -0
- package/dist/components/theme-editor/theme-list.js +42 -0
- package/dist/components/theme-editor/theme-list.js.map +1 -0
- package/dist/components/theme-editor/token-list.d.ts +30 -0
- package/dist/components/theme-editor/token-list.d.ts.map +1 -0
- package/dist/components/theme-editor/token-list.js +124 -0
- package/dist/components/theme-editor/token-list.js.map +1 -0
- package/dist/components/theme-editor/tokens.d.ts +37 -0
- package/dist/components/theme-editor/tokens.d.ts.map +1 -0
- package/dist/components/theme-editor/tokens.js +155 -0
- package/dist/components/theme-editor/tokens.js.map +1 -0
- package/dist/components/theme-editor.d.ts +26 -0
- package/dist/components/theme-editor.d.ts.map +1 -0
- package/dist/components/theme-editor.js +467 -0
- package/dist/components/theme-editor.js.map +1 -0
- package/dist/components/theme-menu.d.ts +28 -0
- package/dist/components/theme-menu.d.ts.map +1 -0
- package/dist/components/theme-menu.js +308 -0
- package/dist/components/theme-menu.js.map +1 -0
- package/dist/components/tooltip.d.ts +11 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +18 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/unsaved-changes-dialog.d.ts +39 -0
- package/dist/components/unsaved-changes-dialog.d.ts.map +1 -0
- package/dist/components/unsaved-changes-dialog.js +46 -0
- package/dist/components/unsaved-changes-dialog.js.map +1 -0
- package/dist/hooks/scroll-insets.d.ts +89 -0
- package/dist/hooks/scroll-insets.d.ts.map +1 -0
- package/dist/hooks/scroll-insets.js +265 -0
- package/dist/hooks/scroll-insets.js.map +1 -0
- package/dist/hooks/use-element-height.d.ts +11 -0
- package/dist/hooks/use-element-height.d.ts.map +1 -0
- package/dist/hooks/use-element-height.js +33 -0
- package/dist/hooks/use-element-height.js.map +1 -0
- package/dist/hooks/use-media-query.d.ts +22 -0
- package/dist/hooks/use-media-query.d.ts.map +1 -0
- package/dist/hooks/use-media-query.js +38 -0
- package/dist/hooks/use-media-query.js.map +1 -0
- package/dist/hooks/use-overlay-scrollbars.d.ts +31 -0
- package/dist/hooks/use-overlay-scrollbars.d.ts.map +1 -0
- package/dist/hooks/use-overlay-scrollbars.js +80 -0
- package/dist/hooks/use-overlay-scrollbars.js.map +1 -0
- package/dist/hooks/use-paged-append.d.ts +7 -0
- package/dist/hooks/use-paged-append.d.ts.map +1 -0
- package/dist/hooks/use-paged-append.js +53 -0
- package/dist/hooks/use-paged-append.js.map +1 -0
- package/dist/hooks/use-query-completion.d.ts +27 -0
- package/dist/hooks/use-query-completion.d.ts.map +1 -0
- package/dist/hooks/use-query-completion.js +100 -0
- package/dist/hooks/use-query-completion.js.map +1 -0
- package/dist/hooks/use-slash-shortcut.d.ts +9 -0
- package/dist/hooks/use-slash-shortcut.d.ts.map +1 -0
- package/dist/hooks/use-slash-shortcut.js +38 -0
- package/dist/hooks/use-slash-shortcut.js.map +1 -0
- package/dist/hooks/viewport-chrome.d.ts +50 -0
- package/dist/hooks/viewport-chrome.d.ts.map +1 -0
- package/dist/hooks/viewport-chrome.js +170 -0
- package/dist/hooks/viewport-chrome.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cell-width-table.d.ts +3 -0
- package/dist/lib/cell-width-table.d.ts.map +1 -0
- package/dist/lib/cell-width-table.js +6 -0
- package/dist/lib/cell-width-table.js.map +1 -0
- package/dist/lib/cell-width.d.ts +7 -0
- package/dist/lib/cell-width.d.ts.map +1 -0
- package/dist/lib/cell-width.js +50 -0
- package/dist/lib/cell-width.js.map +1 -0
- package/dist/lib/clipboard.d.ts +8 -0
- package/dist/lib/clipboard.d.ts.map +1 -0
- package/dist/lib/clipboard.js +19 -0
- package/dist/lib/clipboard.js.map +1 -0
- package/dist/lib/color.d.ts +40 -0
- package/dist/lib/color.d.ts.map +1 -0
- package/dist/lib/color.js +177 -0
- package/dist/lib/color.js.map +1 -0
- package/dist/lib/scroll-map.d.ts +20 -0
- package/dist/lib/scroll-map.d.ts.map +1 -0
- package/dist/lib/scroll-map.js +46 -0
- package/dist/lib/scroll-map.js.map +1 -0
- package/dist/lib/text-metrics.d.ts +33 -0
- package/dist/lib/text-metrics.d.ts.map +1 -0
- package/dist/lib/text-metrics.js +89 -0
- package/dist/lib/text-metrics.js.map +1 -0
- package/dist/lib/theme-file.d.ts +51 -0
- package/dist/lib/theme-file.d.ts.map +1 -0
- package/dist/lib/theme-file.js +511 -0
- package/dist/lib/theme-file.js.map +1 -0
- package/dist/lib/unsaved-guard.d.ts +33 -0
- package/dist/lib/unsaved-guard.d.ts.map +1 -0
- package/dist/lib/unsaved-guard.js +37 -0
- package/dist/lib/unsaved-guard.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/theme/custom.d.ts +8 -0
- package/dist/theme/custom.d.ts.map +1 -0
- package/dist/theme/custom.js +56 -0
- package/dist/theme/custom.js.map +1 -0
- package/dist/theme/index.d.ts +6 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +5 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/paint-guard.d.ts +20 -0
- package/dist/theme/paint-guard.d.ts.map +1 -0
- package/dist/theme/paint-guard.js +120 -0
- package/dist/theme/paint-guard.js.map +1 -0
- package/dist/theme/picks.d.ts +22 -0
- package/dist/theme/picks.d.ts.map +1 -0
- package/dist/theme/picks.js +43 -0
- package/dist/theme/picks.js.map +1 -0
- package/dist/theme/pref.d.ts +39 -0
- package/dist/theme/pref.d.ts.map +1 -0
- package/dist/theme/pref.js +129 -0
- package/dist/theme/pref.js.map +1 -0
- package/dist/theme/provider.d.ts +41 -0
- package/dist/theme/provider.d.ts.map +1 -0
- package/dist/theme/provider.js +103 -0
- package/dist/theme/provider.js.map +1 -0
- package/dist/theme/store.d.ts +104 -0
- package/dist/theme/store.d.ts.map +1 -0
- package/dist/theme/store.js +509 -0
- package/dist/theme/store.js.map +1 -0
- package/package.json +94 -3
- package/styles.css +79 -0
- package/theme.css +186 -0
- 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"}
|