@vibecook/ghosttea-react 0.8.0 → 0.9.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 (65) hide show
  1. package/README.md +10 -0
  2. package/THIRD_PARTY_NOTICES.md +62 -0
  3. package/dist/appearance/AdvancedConfigSettings.d.ts +12 -0
  4. package/dist/appearance/AdvancedConfigSettings.d.ts.map +1 -0
  5. package/dist/appearance/AdvancedConfigSettings.js +362 -0
  6. package/dist/appearance/AdvancedConfigSettings.js.map +1 -0
  7. package/dist/appearance/AppearanceSettings.d.ts +21 -0
  8. package/dist/appearance/AppearanceSettings.d.ts.map +1 -0
  9. package/dist/appearance/AppearanceSettings.js +175 -0
  10. package/dist/appearance/AppearanceSettings.js.map +1 -0
  11. package/dist/appearance/catalog.d.ts +39 -0
  12. package/dist/appearance/catalog.d.ts.map +1 -0
  13. package/dist/appearance/catalog.js +56 -0
  14. package/dist/appearance/catalog.js.map +1 -0
  15. package/dist/appearance/config-draft.d.ts +35 -0
  16. package/dist/appearance/config-draft.d.ts.map +1 -0
  17. package/dist/appearance/config-draft.js +289 -0
  18. package/dist/appearance/config-draft.js.map +1 -0
  19. package/dist/appearance/shaders.d.ts +14 -0
  20. package/dist/appearance/shaders.d.ts.map +1 -0
  21. package/dist/appearance/shaders.js +71 -0
  22. package/dist/appearance/shaders.js.map +1 -0
  23. package/dist/appearance/theme-catalog.generated.json +16260 -0
  24. package/dist/appearance/types.d.ts +61 -0
  25. package/dist/appearance/types.d.ts.map +1 -0
  26. package/dist/appearance/types.js +2 -0
  27. package/dist/appearance/types.js.map +1 -0
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +23 -4
  30. package/dist/config.js.map +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/renderers/canvas-renderer.d.ts.map +1 -1
  36. package/dist/renderers/canvas-renderer.js +9 -1
  37. package/dist/renderers/canvas-renderer.js.map +1 -1
  38. package/dist/renderers/shader-effects.d.ts +2 -0
  39. package/dist/renderers/shader-effects.d.ts.map +1 -0
  40. package/dist/renderers/shader-effects.js +206 -0
  41. package/dist/renderers/shader-effects.js.map +1 -0
  42. package/dist/renderers/types.d.ts +7 -0
  43. package/dist/renderers/types.d.ts.map +1 -1
  44. package/dist/renderers/types.js +11 -0
  45. package/dist/renderers/types.js.map +1 -1
  46. package/dist/renderers/webgpu-renderer.d.ts +2 -1
  47. package/dist/renderers/webgpu-renderer.d.ts.map +1 -1
  48. package/dist/renderers/webgpu-renderer.js +250 -159
  49. package/dist/renderers/webgpu-renderer.js.map +1 -1
  50. package/dist/terminal-render.worker.js +479 -165
  51. package/dist/terminal-render.worker.js.map +3 -3
  52. package/dist/workspace/Workspace.d.ts +7 -2
  53. package/dist/workspace/Workspace.d.ts.map +1 -1
  54. package/dist/workspace/Workspace.js +15 -7
  55. package/dist/workspace/Workspace.js.map +1 -1
  56. package/dist/workspace/index.d.ts +3 -0
  57. package/dist/workspace/index.d.ts.map +1 -1
  58. package/dist/workspace/index.js +2 -0
  59. package/dist/workspace/index.js.map +1 -1
  60. package/dist/workspace/themes.d.ts +4 -0
  61. package/dist/workspace/themes.d.ts.map +1 -1
  62. package/dist/workspace/themes.js +4 -0
  63. package/dist/workspace/themes.js.map +1 -1
  64. package/dist/workspace.css +1122 -5
  65. package/package.json +6 -5
@@ -0,0 +1,175 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from "react";
3
+ import { GHOSTTY_COLOR_THEMES, colorThemeFromRenderer, findMatchingColorTheme } from "./catalog.js";
4
+ import { GHOSTTEA_SHADER_OPTIONS, UNAVAILABLE_UPSTREAM_SHADERS, isGhostteaShaderEffect } from "./shaders.js";
5
+ import { AdvancedConfigSettings } from "./AdvancedConfigSettings.js";
6
+ export function appearanceDraftFromConfig(config) {
7
+ return {
8
+ themeName: findMatchingColorTheme(config.renderer)?.name ?? null,
9
+ opacity: config.renderer.backgroundOpacity ?? 1,
10
+ opacityCells: config.renderer.backgroundOpacityCells ?? false,
11
+ effects: config.renderer.shaderEffects?.filter(isGhostteaShaderEffect) ??
12
+ (config.renderer.postProcess === "better-crt" ? ["ghosttea:better-crt"] : []),
13
+ animation: config.renderer.customShaderAnimation ?? false,
14
+ };
15
+ }
16
+ export function sameAppearanceDraft(left, right) {
17
+ return (left.themeName === right.themeName &&
18
+ left.opacity === right.opacity &&
19
+ left.opacityCells === right.opacityCells &&
20
+ left.animation === right.animation &&
21
+ left.effects.length === right.effects.length &&
22
+ left.effects.every((effect, index) => effect === right.effects[index]));
23
+ }
24
+ export function AppearanceSettings({ config, onClose, onSave, configEditor, onPreview }) {
25
+ const [section, setSection] = useState(onSave ? "appearance" : "advanced");
26
+ const [advancedOpened, setAdvancedOpened] = useState(!onSave);
27
+ const [advancedDirty, setAdvancedDirty] = useState(false);
28
+ const [confirmDiscard, setConfirmDiscard] = useState(false);
29
+ const [observedConfig, setObservedConfig] = useState(config);
30
+ const [observedPropRevision, setObservedPropRevision] = useState(config.revision);
31
+ const initialAppearance = appearanceDraftFromConfig(config);
32
+ const [appearanceBaseline, setAppearanceBaseline] = useState(initialAppearance);
33
+ const [appearanceBaselineRevision, setAppearanceBaselineRevision] = useState(config.revision);
34
+ const matchedTheme = findMatchingColorTheme(observedConfig.renderer);
35
+ const currentTheme = colorThemeFromRenderer(observedConfig.renderer);
36
+ const [themeName, setThemeName] = useState(initialAppearance.themeName);
37
+ const [query, setQuery] = useState("");
38
+ const [opacity, setOpacity] = useState(initialAppearance.opacity);
39
+ const [opacityCells, setOpacityCells] = useState(initialAppearance.opacityCells);
40
+ const [effects, setEffects] = useState(initialAppearance.effects);
41
+ const [animation, setAnimation] = useState(initialAppearance.animation);
42
+ const [saving, setSaving] = useState(false);
43
+ const [error, setError] = useState();
44
+ const appearanceDraft = useMemo(() => ({ themeName, opacity, opacityCells, effects, animation }), [animation, effects, opacity, opacityCells, themeName]);
45
+ const appearanceDirty = !sameAppearanceDraft(appearanceDraft, appearanceBaseline);
46
+ const appearanceStale = appearanceDirty && observedConfig.revision !== appearanceBaselineRevision;
47
+ const selectedTheme = themeName ? GHOSTTY_COLOR_THEMES.find((theme) => theme.name === themeName) : undefined;
48
+ const previewTheme = selectedTheme ?? currentTheme;
49
+ const filteredThemes = useMemo(() => {
50
+ const normalized = query.trim().toLocaleLowerCase();
51
+ if (!normalized)
52
+ return GHOSTTY_COLOR_THEMES.slice(0, 80);
53
+ return GHOSTTY_COLOR_THEMES.filter((theme) => theme.name.toLocaleLowerCase().includes(normalized)).slice(0, 120);
54
+ }, [query]);
55
+ const resetAppearanceToConfig = useCallback((nextConfig) => {
56
+ const next = appearanceDraftFromConfig(nextConfig);
57
+ setThemeName(next.themeName);
58
+ setOpacity(next.opacity);
59
+ setOpacityCells(next.opacityCells);
60
+ setEffects(next.effects);
61
+ setAnimation(next.animation);
62
+ setAppearanceBaseline(next);
63
+ setAppearanceBaselineRevision(nextConfig.revision);
64
+ }, []);
65
+ const acknowledgeLatestAppearanceBase = () => {
66
+ setAppearanceBaseline(appearanceDraftFromConfig(observedConfig));
67
+ setAppearanceBaselineRevision(observedConfig.revision);
68
+ };
69
+ const selectSection = (next) => {
70
+ if ((next === "advanced" && appearanceDirty) || (next === "appearance" && advancedDirty))
71
+ return;
72
+ if (next === "advanced")
73
+ setAdvancedOpened(true);
74
+ setSection(next);
75
+ };
76
+ const requestClose = useCallback(() => {
77
+ if (advancedDirty) {
78
+ setConfirmDiscard(true);
79
+ return;
80
+ }
81
+ onClose();
82
+ }, [advancedDirty, onClose]);
83
+ // React preserves this dialog across daemon config notifications. Reconcile
84
+ // a clean appearance draft during render (the guarded previous-prop pattern)
85
+ // so a newer snapshot cannot be overwritten by stale form state. A dirty
86
+ // draft keeps its old baseline and therefore becomes an explicit conflict.
87
+ if (config.revision !== observedPropRevision) {
88
+ setObservedPropRevision(config.revision);
89
+ setObservedConfig(config);
90
+ }
91
+ else if (observedConfig.revision !== appearanceBaselineRevision && !appearanceDirty) {
92
+ resetAppearanceToConfig(observedConfig);
93
+ }
94
+ useEffect(() => {
95
+ configEditor?.setDirty?.(advancedDirty);
96
+ }, [advancedDirty, configEditor]);
97
+ useEffect(() => () => {
98
+ configEditor?.setDirty?.(false);
99
+ }, [configEditor]);
100
+ useEffect(() => {
101
+ const closeOnEscape = (event) => {
102
+ if (event.key !== "Escape")
103
+ return;
104
+ event.preventDefault();
105
+ event.stopPropagation();
106
+ if (confirmDiscard) {
107
+ setConfirmDiscard(false);
108
+ return;
109
+ }
110
+ requestClose();
111
+ };
112
+ window.addEventListener("keydown", closeOnEscape, true);
113
+ return () => window.removeEventListener("keydown", closeOnEscape, true);
114
+ }, [confirmDiscard, requestClose]);
115
+ const toggleEffect = (id) => {
116
+ setEffects((current) => (current.includes(id) ? current.filter((effect) => effect !== id) : [...current, id]));
117
+ };
118
+ const moveEffect = (id, offset) => {
119
+ setEffects((current) => {
120
+ const index = current.indexOf(id);
121
+ const target = index + offset;
122
+ if (index < 0 || target < 0 || target >= current.length)
123
+ return current;
124
+ const next = [...current];
125
+ [next[index], next[target]] = [next[target], next[index]];
126
+ return next;
127
+ });
128
+ };
129
+ const save = async () => {
130
+ if (!onSave || appearanceStale)
131
+ return;
132
+ setSaving(true);
133
+ setError(undefined);
134
+ try {
135
+ await onSave({
136
+ ...(selectedTheme ? { theme: selectedTheme } : {}),
137
+ backgroundOpacity: opacity,
138
+ backgroundOpacityCells: opacityCells,
139
+ shaderEffects: effects,
140
+ shaderAnimation: animation,
141
+ });
142
+ requestClose();
143
+ }
144
+ catch (cause) {
145
+ setError(cause instanceof Error ? cause.message : String(cause));
146
+ }
147
+ finally {
148
+ setSaving(false);
149
+ }
150
+ };
151
+ return (_jsx("div", { className: "appearance-settings-backdrop", role: "presentation", onMouseDown: (event) => event.target === event.currentTarget && requestClose(), children: _jsxs("section", { className: "appearance-settings", role: "dialog", "aria-modal": "true", "aria-labelledby": "settings-title", children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsx("h1", { id: "settings-title", children: "Settings" }), _jsx("p", { children: "Profile-wide terminal appearance and Ghostty-compatible configuration." })] }), _jsx("button", { type: "button", className: "appearance-close", onClick: requestClose, "aria-label": "Close settings", children: "\u00D7" })] }), _jsxs("div", { className: "settings-layout", children: [_jsxs("nav", { className: "settings-sidebar", "aria-label": "Settings sections", children: [onSave ? (_jsxs("button", { type: "button", className: section === "appearance" ? "is-selected" : "", "aria-current": section === "appearance" ? "page" : undefined, disabled: advancedDirty, title: advancedDirty ? "Save or revert the Advanced draft before switching sections" : undefined, onClick: () => selectSection("appearance"), children: [_jsx("span", { children: "Appearance" }), _jsx("small", { children: "Themes & shaders" })] })) : null, configEditor ? (_jsxs("button", { type: "button", className: section === "advanced" ? "is-selected" : "", "aria-current": section === "advanced" ? "page" : undefined, disabled: appearanceDirty, title: appearanceDirty ? "Apply or cancel Appearance changes before switching sections" : undefined, onClick: () => selectSection("advanced"), children: [_jsx("span", { children: "Advanced" }), _jsx("small", { children: "Ghostty config" })] })) : null, appearanceDirty ? (_jsx("p", { className: "settings-sidebar-note", children: "Apply or cancel Appearance edits to switch." })) : null, advancedDirty ? (_jsx("p", { className: "settings-sidebar-note", children: "Save or revert the Advanced draft to switch." })) : null] }), _jsxs("div", { className: "settings-content", children: [_jsxs("div", { className: `settings-page appearance-settings-page${section === "appearance" ? " is-active" : ""}`, children: [appearanceStale ? (_jsxs("div", { className: "config-conflict appearance-config-stale", role: "alert", children: [_jsxs("div", { children: [_jsx("strong", { children: "The configuration changed while Appearance had pending edits." }), _jsx("p", { children: "Choose whether to reload the current values or explicitly rebase your pending appearance." })] }), _jsxs("span", { children: [_jsx("button", { type: "button", onClick: () => resetAppearanceToConfig(observedConfig), children: "Reload current values" }), _jsx("button", { type: "button", onClick: acknowledgeLatestAppearanceBase, children: "Keep my pending edits" })] })] })) : null, _jsxs("div", { className: "appearance-settings-grid", children: [_jsxs("section", { className: "appearance-panel", children: [_jsxs("h2", { children: ["Color theme ", _jsx("span", { children: GHOSTTY_COLOR_THEMES.length })] }), _jsx("input", { className: "appearance-search", value: query, onChange: (event) => setQuery(event.currentTarget.value), placeholder: "Search Ghostty themes", "aria-label": "Search Ghostty themes", autoFocus: section === "appearance" }), _jsxs("div", { className: "appearance-theme-list", role: "listbox", "aria-label": "Color themes", children: [!matchedTheme ? (_jsx(ThemeChoice, { theme: currentTheme, selected: themeName === null, onSelect: () => setThemeName(null) })) : null, selectedTheme && !filteredThemes.some((theme) => theme.name === selectedTheme.name) ? (_jsx(ThemeChoice, { theme: selectedTheme, selected: true, onSelect: () => setThemeName(selectedTheme.name) })) : null, filteredThemes.map((theme) => (_jsx(ThemeChoice, { theme: theme, selected: theme.name === selectedTheme?.name, onSelect: () => setThemeName(theme.name) }, theme.name)))] })] }), _jsxs("section", { className: "appearance-panel appearance-details", children: [_jsx("h2", { children: "Preview" }), _jsxs("div", { className: "appearance-preview", style: { color: previewTheme.foreground, background: previewTheme.background }, children: [_jsx("div", { className: "appearance-preview-dots", children: previewTheme.palette.slice(1, 7).map((color, index) => (_jsx("i", { style: { background: color } }, `${color}-${index}`))) }), _jsxs("code", { children: [_jsx("span", { style: { color: previewTheme.palette[2] }, children: "ghosttea" }), " ", _jsx("span", { style: { color: previewTheme.palette[4] }, children: "~/projects" }), " $ cargo test", _jsx("br", {}), "All systems steeping."] }), _jsx("i", { className: "appearance-preview-cursor", style: { color: previewTheme.cursorText, background: previewTheme.cursor }, children: "_" })] }), _jsxs("label", { className: "appearance-range", children: [_jsxs("span", { children: ["Background opacity ", _jsxs("output", { children: [Math.round(opacity * 100), "%"] })] }), _jsx("input", { type: "range", min: "0", max: "1", step: "0.01", value: opacity, onChange: (event) => setOpacity(event.currentTarget.valueAsNumber) })] }), _jsxs("label", { className: "appearance-check", children: [_jsx("input", { type: "checkbox", checked: opacityCells, onChange: (event) => setOpacityCells(event.currentTarget.checked) }), _jsx("span", { children: "Apply opacity to explicit cell backgrounds" })] }), _jsx("p", { className: "appearance-help", children: "Desktop-through transparency is enabled by the macOS host; framed Windows and Linux hosts preserve alpha inside the renderer but remain OS-opaque." }), _jsx("h2", { children: "Shader stack" }), _jsx("p", { className: "appearance-help", children: "Effects run top-to-bottom. Animated effects repaint while this window is focused." }), _jsx("div", { className: "appearance-shader-list", children: [...GHOSTTEA_SHADER_OPTIONS]
152
+ .sort((left, right) => {
153
+ const leftIndex = effects.indexOf(left.id);
154
+ const rightIndex = effects.indexOf(right.id);
155
+ if (leftIndex >= 0 && rightIndex >= 0)
156
+ return leftIndex - rightIndex;
157
+ if (leftIndex >= 0)
158
+ return -1;
159
+ if (rightIndex >= 0)
160
+ return 1;
161
+ return 0;
162
+ })
163
+ .map((shader) => {
164
+ const stackIndex = effects.indexOf(shader.id);
165
+ return (_jsxs("div", { className: "appearance-shader", children: [_jsxs("label", { children: [_jsx("input", { type: "checkbox", checked: stackIndex >= 0, onChange: () => toggleEffect(shader.id) }), _jsxs("span", { children: [_jsxs("strong", { children: [stackIndex >= 0 ? `${stackIndex + 1}. ` : "", shader.name] }), _jsx("small", { children: shader.description }), _jsx("em", { children: shader.license })] })] }), stackIndex >= 0 ? (_jsxs("span", { className: "appearance-shader-order", "aria-label": `Reorder ${shader.name}`, children: [_jsx("button", { type: "button", disabled: stackIndex === 0, onClick: () => moveEffect(shader.id, -1), "aria-label": `Move ${shader.name} up`, children: "\u2191" }), _jsx("button", { type: "button", disabled: stackIndex === effects.length - 1, onClick: () => moveEffect(shader.id, 1), "aria-label": `Move ${shader.name} down`, children: "\u2193" })] })) : null] }, shader.id));
166
+ }) }), _jsxs("label", { className: "appearance-check", children: [_jsx("input", { type: "checkbox", checked: animation, onChange: (event) => setAnimation(event.currentTarget.checked) }), _jsx("span", { children: "Animate shader stack" })] }), _jsxs("details", { className: "appearance-unavailable", children: [_jsxs("summary", { children: [UNAVAILABLE_UPSTREAM_SHADERS.length, " upstream shaders awaiting redistribution clearance"] }), _jsx("p", { children: UNAVAILABLE_UPSTREAM_SHADERS.join(", ") })] })] })] }), error ? (_jsx("p", { className: "appearance-error", role: "alert", children: error })) : null, _jsxs("footer", { children: [_jsx("button", { type: "button", onClick: requestClose, children: "Cancel" }), _jsx("button", { type: "button", className: "appearance-save", disabled: saving || appearanceStale, onClick: () => void save(), children: saving ? "Applying…" : "Apply" })] })] }), configEditor && advancedOpened ? (_jsx("div", { className: `settings-page advanced-settings-page${section === "advanced" ? " is-active" : ""}`, children: _jsx(AdvancedConfigSettings, { config: observedConfig, editor: configEditor, onClose: requestClose, onDirtyChange: setAdvancedDirty, onPreview: onPreview, onSaved: setObservedConfig }) })) : null] })] }), confirmDiscard ? (_jsx("div", { className: "config-discard-backdrop", role: "presentation", children: _jsxs("section", { role: "alertdialog", "aria-modal": "true", "aria-labelledby": "config-discard-title", children: [_jsx("h2", { id: "config-discard-title", children: "Discard the unsaved config draft?" }), _jsx("p", { children: "Your live preview will be reverted. Changes not already being saved have not been written to disk." }), _jsxs("footer", { children: [_jsx("button", { type: "button", onClick: () => setConfirmDiscard(false), autoFocus: true, children: "Keep editing" }), _jsx("button", { type: "button", className: "config-discard-action", onClick: () => {
167
+ setAdvancedDirty(false);
168
+ onPreview(undefined);
169
+ onClose();
170
+ }, children: "Discard draft" })] })] }) })) : null] }) }));
171
+ }
172
+ function ThemeChoice({ theme, selected, onSelect, }) {
173
+ return (_jsxs("button", { type: "button", role: "option", "aria-selected": selected, className: selected ? "is-selected" : "", onClick: onSelect, children: [_jsx("span", { className: "appearance-swatches", style: { background: theme.background }, children: theme.palette.slice(1, 5).map((color, index) => (_jsx("i", { style: { background: color } }, `${color}-${index}`))) }), _jsx("span", { children: theme.name })] }));
174
+ }
175
+ //# sourceMappingURL=AppearanceSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppearanceSettings.js","sourceRoot":"","sources":["../../src/appearance/AppearanceSettings.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface GhostteaColorTheme {
2
+ name: string;
3
+ background: string;
4
+ foreground: string;
5
+ cursor: string;
6
+ cursorText: string;
7
+ selection: string;
8
+ selectionForeground: string;
9
+ palette: string[];
10
+ }
11
+ export declare const GHOSTTY_THEME_CATALOG_SOURCE: string;
12
+ export declare const GHOSTTY_THEME_CATALOG_REVISION: string;
13
+ export declare const GHOSTTY_COLOR_THEMES: GhostteaColorTheme[];
14
+ /** Build a preview-only theme without inventing missing sparse palette entries. */
15
+ export declare function colorThemeFromRenderer(colors: {
16
+ background: readonly number[];
17
+ foreground: readonly number[];
18
+ cursor: readonly number[];
19
+ cursorText?: readonly number[];
20
+ selectionBackground: readonly number[];
21
+ selectionForeground: readonly number[];
22
+ palette?: readonly {
23
+ index: number;
24
+ color: readonly number[];
25
+ }[];
26
+ }, name?: string): GhostteaColorTheme;
27
+ export declare function findMatchingColorTheme(colors: {
28
+ background: readonly number[];
29
+ foreground: readonly number[];
30
+ cursor: readonly number[];
31
+ cursorText?: readonly number[];
32
+ selectionBackground: readonly number[];
33
+ selectionForeground: readonly number[];
34
+ palette?: readonly {
35
+ index: number;
36
+ color: readonly number[];
37
+ }[];
38
+ }): GhostteaColorTheme | undefined;
39
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/appearance/catalog.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,4BAA4B,QAAiB,CAAC;AAC3D,eAAO,MAAM,8BAA8B,QAAmB,CAAC;AAC/D,eAAO,MAAM,oBAAoB,EAAqB,kBAAkB,EAAE,CAAC;AAM3E,mFAAmF;AACnF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE;IACN,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,OAAO,CAAC,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;CAClE,EACD,IAAI,SAA0B,GAC7B,kBAAkB,CAkBpB;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,OAAO,CAAC,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;CAClE,GAAG,kBAAkB,GAAG,SAAS,CA6BjC"}
@@ -0,0 +1,56 @@
1
+ import catalog from "./theme-catalog.generated.json";
2
+ export const GHOSTTY_THEME_CATALOG_SOURCE = catalog.source;
3
+ export const GHOSTTY_THEME_CATALOG_REVISION = catalog.revision;
4
+ export const GHOSTTY_COLOR_THEMES = catalog.themes;
5
+ function hex(value) {
6
+ return `#${value.map((component) => Math.round(component).toString(16).padStart(2, "0")).join("")}`;
7
+ }
8
+ /** Build a preview-only theme without inventing missing sparse palette entries. */
9
+ export function colorThemeFromRenderer(colors, name = "Current custom colors") {
10
+ const background = hex(colors.background);
11
+ const foreground = hex(colors.foreground);
12
+ const palette = Array(16).fill(foreground);
13
+ palette[0] = background;
14
+ for (const entry of colors.palette ?? []) {
15
+ if (entry.index >= 0 && entry.index < palette.length)
16
+ palette[entry.index] = hex(entry.color);
17
+ }
18
+ return {
19
+ name,
20
+ background,
21
+ foreground,
22
+ cursor: hex(colors.cursor),
23
+ cursorText: hex(colors.cursorText ?? colors.background),
24
+ selection: hex(colors.selectionBackground),
25
+ selectionForeground: hex(colors.selectionForeground),
26
+ palette,
27
+ };
28
+ }
29
+ export function findMatchingColorTheme(colors) {
30
+ const expected = [
31
+ hex(colors.background),
32
+ hex(colors.foreground),
33
+ hex(colors.cursor),
34
+ hex(colors.cursorText ?? colors.background),
35
+ hex(colors.selectionBackground),
36
+ hex(colors.selectionForeground),
37
+ ].join(":");
38
+ return GHOSTTY_COLOR_THEMES.find((theme) => {
39
+ const fixedColors = [
40
+ theme.background,
41
+ theme.foreground,
42
+ theme.cursor,
43
+ theme.cursorText,
44
+ theme.selection,
45
+ theme.selectionForeground,
46
+ ].join(":");
47
+ if (fixedColors !== expected)
48
+ return false;
49
+ const palette = new Map((colors.palette ?? []).filter(({ index }) => index >= 0 && index <= 15).map(({ index, color }) => [index, color]));
50
+ // Fixed colors alone are not enough evidence: several catalog themes
51
+ // share them, and writing a guessed theme would add a different ANSI
52
+ // palette. Keep the current colors custom unless all 16 entries match.
53
+ return (palette.size === 16 && theme.palette.every((color, index) => color.toLowerCase() === hex(palette.get(index))));
54
+ });
55
+ }
56
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/appearance/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { ConfigSnapshot } from "@vibecook/ghosttea-protocol";
2
+ export declare const FRIENDLY_BLOCK_START = "# >>> Ghosttea common settings (managed; edit through Settings)";
3
+ export declare const FRIENDLY_BLOCK_END = "# <<< Ghosttea common settings";
4
+ export interface FriendlyConfigValues {
5
+ foreground: string;
6
+ background: string;
7
+ cursor: string;
8
+ cursorText: string;
9
+ selectionBackground: string;
10
+ selectionForeground: string;
11
+ backgroundOpacity: number;
12
+ backgroundOpacityCells: boolean;
13
+ scrollbackLimit: number;
14
+ fontFamilies: string[];
15
+ fontSize: number;
16
+ paddingX: [number, number];
17
+ paddingY: [number, number];
18
+ clearKeybindings: boolean;
19
+ keybindings: string[];
20
+ }
21
+ export type FriendlyConfigSection = "colors" | "opacity" | "scrollback" | "typography" | "padding" | "keybindings";
22
+ export type ConfigNewline = "\n" | "\r\n";
23
+ export declare function preferredConfigNewline(contents: string, fallback?: ConfigNewline): ConfigNewline;
24
+ /** Preserve every untouched newline token while applying one textarea edit. */
25
+ export declare function applyConfigTextareaEdit(previous: string, textareaValue: string, insertedNewline?: ConfigNewline): string;
26
+ export declare function appendConfigDocument(left: string, right: string, newline?: ConfigNewline): string;
27
+ export declare function friendlyValuesFromConfig(config: ConfigSnapshot): FriendlyConfigValues;
28
+ /** Fields whose generated override was shadowed by a later included layer. */
29
+ export declare function friendlyConfigMismatches(config: ConfigSnapshot, values: FriendlyConfigValues, sections?: ReadonlySet<FriendlyConfigSection>): string[];
30
+ export declare function friendlyConfigBlock(values: FriendlyConfigValues, sections?: ReadonlySet<FriendlyConfigSection>): string;
31
+ export declare function friendlyConfigSections(contents: string): Set<FriendlyConfigSection>;
32
+ export declare function patchFriendlyConfigBlock(contents: string, values: FriendlyConfigValues, sections?: ReadonlySet<FriendlyConfigSection>): string;
33
+ export declare function removeFriendlyConfigBlock(contents: string): string;
34
+ export declare function hasFriendlyConfigBlock(contents: string): boolean;
35
+ //# sourceMappingURL=config-draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-draft.d.ts","sourceRoot":"","sources":["../../src/appearance/config-draft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,eAAO,MAAM,oBAAoB,oEAAoE,CAAC;AACtG,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE,OAAO,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,aAAa,CAAC;AACnH,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,MAAM,CAAC;AAW1C,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAoB,GAAG,aAAa,CAGtG;AAiBD,+EAA+E;AAC/E,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,eAAe,GAAE,aAAgD,GAChE,MAAM,CAoBR;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,gBAA+B,GAAG,MAAM,CAYhH;AAUD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,oBAAoB,CAmBrF;AAWD,8EAA8E;AAC9E,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,GAAE,WAAW,CAAC,qBAAqB,CAAgC,GAC1E,MAAM,EAAE,CA6CV;AA2BD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,GAAE,WAAW,CAAC,qBAAqB,CAAgC,GAC1E,MAAM,CA6CR;AAkBD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAmCnF;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,GAAE,WAAW,CAAC,qBAAqB,CAAgC,GAC1E,MAAM,CAOR;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIlE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMhE"}