@vibecook/ghosttea-react 0.7.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 (73) 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 +32 -4
  53. package/dist/workspace/Workspace.d.ts.map +1 -1
  54. package/dist/workspace/Workspace.js +45 -17
  55. package/dist/workspace/Workspace.js.map +1 -1
  56. package/dist/workspace/index.d.ts +5 -2
  57. package/dist/workspace/index.d.ts.map +1 -1
  58. package/dist/workspace/index.js +3 -1
  59. package/dist/workspace/index.js.map +1 -1
  60. package/dist/workspace/pane-layout.d.ts +9 -2
  61. package/dist/workspace/pane-layout.d.ts.map +1 -1
  62. package/dist/workspace/pane-layout.js +37 -11
  63. package/dist/workspace/pane-layout.js.map +1 -1
  64. package/dist/workspace/themes.d.ts +4 -0
  65. package/dist/workspace/themes.d.ts.map +1 -1
  66. package/dist/workspace/themes.js +4 -0
  67. package/dist/workspace/themes.js.map +1 -1
  68. package/dist/workspace/workspace-model.d.ts +2 -0
  69. package/dist/workspace/workspace-model.d.ts.map +1 -1
  70. package/dist/workspace/workspace-model.js +6 -1
  71. package/dist/workspace/workspace-model.js.map +1 -1
  72. package/dist/workspace.css +1122 -5
  73. package/package.json +6 -5
package/README.md CHANGED
@@ -39,6 +39,16 @@ post-process effect automatically. Lower-level hosts can use
39
39
  [`Ghostty configuration compatibility`](../../docs/ghostty-config-compatibility.md)
40
40
  matrix for deliberate gaps.
41
41
 
42
+ Desktop hosts may provide the exported `GhostteaConfigEditorBridge` through
43
+ `GhostteaWorkspacePlatform.configEditor`. The workspace then adds an Advanced
44
+ Settings section with a lossless raw overlay editor and a friendly managed
45
+ form. The bridge is intentionally capability-shaped: the host owns document
46
+ scope, validation, compare-and-swap persistence, and native import/export
47
+ dialogs; the React package owns only draft state and presentation. The raw
48
+ editor preserves untouched mixed line endings and source bytes, reports
49
+ inherited versus draft-blocking diagnostics separately, and can notify native
50
+ hosts while an unsaved draft needs close/quit protection.
51
+
42
52
  Architecture:
43
53
 
44
54
  1. **Match** — `matchGhostteaBinding` (Ghostty defaults + extensions)
@@ -0,0 +1,62 @@
1
+ # Third-party appearance assets
2
+
3
+ The generated Ghostty color-theme catalog comes from
4
+ [`mbadolato/iTerm2-Color-Schemes`](https://github.com/mbadolato/iTerm2-Color-Schemes)
5
+ revision `875a82f0fdc773ae45099ce683a11c56bb0f8b3d`. The collection is MIT
6
+ licensed, copyright 2011 to present Mark Badolato; individual themes retain
7
+ their authors' copyright and licensing terms.
8
+
9
+ ## Theme catalog MIT license
10
+
11
+ Copyright (c) 2011 to Present Mark Badolato
12
+
13
+ Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ of this software and associated documentation files (the "Software"), to deal
15
+ in the Software without restriction, including without limitation the rights
16
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
+ copies of the Software, and to permit persons to whom the Software is
18
+ furnished to do so, subject to the following conditions:
19
+
20
+ The above copyright notice and this permission notice shall be included in all
21
+ copies or substantial portions of the Software.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ SOFTWARE.
30
+
31
+ The WGSL effects were reviewed against
32
+ [`0xhckr/ghostty-shaders`](https://github.com/0xhckr/ghostty-shaders)
33
+ revision `85898f08fcf4a9274e418912098e99e00a5f8350`:
34
+
35
+ - `crt`: Timothy Lottes / Qwerasd, Unlicense / public domain.
36
+ - `sparks-from-fire`: Jan Mróz / Alex Sherwin, CC BY 3.0.
37
+ - `vhs`: copyright (c) 2026 Alex Brinsmead, MIT.
38
+ - `better-crt`: legacy compatibility effect, derived from a Shadertoy work
39
+ under CC BY-NC-SA 3.0 and modifications by April Hall.
40
+
41
+ The remaining upstream shader files are not bundled because their per-file
42
+ terms are absent or incompatible with general redistribution.
43
+
44
+ ## VHS MIT license
45
+
46
+ Permission is hereby granted, free of charge, to any person obtaining a copy
47
+ of this software and associated documentation files (the "Software"), to deal
48
+ in the Software without restriction, including without limitation the rights
49
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
50
+ copies of the Software, and to permit persons to whom the Software is
51
+ furnished to do so, subject to the following conditions:
52
+
53
+ The above copyright notice and this permission notice shall be included in all
54
+ copies or substantial portions of the Software.
55
+
56
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
57
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
58
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
59
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
60
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
61
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
62
+ SOFTWARE.
@@ -0,0 +1,12 @@
1
+ import type { ConfigSnapshot } from "@vibecook/ghosttea-protocol";
2
+ import type { GhostteaConfigEditorBridge } from "./types.js";
3
+ export interface AdvancedConfigSettingsProps {
4
+ config: ConfigSnapshot;
5
+ editor: GhostteaConfigEditorBridge;
6
+ onClose: () => void;
7
+ onDirtyChange: (dirty: boolean) => void;
8
+ onPreview: (config: ConfigSnapshot | undefined) => void;
9
+ onSaved?: (config: ConfigSnapshot) => void;
10
+ }
11
+ export declare function AdvancedConfigSettings({ config, editor, onClose, onDirtyChange, onPreview, onSaved, }: AdvancedConfigSettingsProps): import("react").JSX.Element;
12
+ //# sourceMappingURL=AdvancedConfigSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdvancedConfigSettings.d.ts","sourceRoot":"","sources":["../../src/appearance/AdvancedConfigSettings.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoC,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAapG,OAAO,KAAK,EACV,0BAA0B,EAG3B,MAAM,YAAY,CAAC;AASpB,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,0BAA0B,CAAC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,KAAK,IAAI,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;CAC5C;AAED,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EACN,MAAM,EACN,OAAO,EACP,aAAa,EACb,SAAS,EACT,OAAO,GACR,EAAE,2BAA2B,+BAigB7B"}
@@ -0,0 +1,362 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useState } from "react";
3
+ import { appendConfigDocument, applyConfigTextareaEdit, friendlyConfigMismatches, friendlyConfigSections, friendlyValuesFromConfig, patchFriendlyConfigBlock, preferredConfigNewline, removeFriendlyConfigBlock, } from "./config-draft.js";
4
+ const VALIDATION_DEBOUNCE_MS = 320;
5
+ const MAX_CONFIG_BYTES = 64 * 1024;
6
+ export function AdvancedConfigSettings({ config, editor, onClose, onDirtyChange, onPreview, onSaved, }) {
7
+ const [mode, setMode] = useState("raw");
8
+ const [document, setDocument] = useState();
9
+ const [baseContents, setBaseContents] = useState("");
10
+ const [baseConfig, setBaseConfig] = useState(config);
11
+ const [draft, setDraft] = useState("");
12
+ const [validation, setValidation] = useState();
13
+ const [validatedDraft, setValidatedDraft] = useState();
14
+ const [validationState, setValidationState] = useState("idle");
15
+ const [friendly, setFriendly] = useState(() => friendlyValuesFromConfig(config));
16
+ const [friendlySections, setFriendlySections] = useState(() => new Set());
17
+ const [friendlyDraftContents, setFriendlyDraftContents] = useState();
18
+ const [loading, setLoading] = useState(true);
19
+ const [saving, setSaving] = useState(false);
20
+ const [error, setError] = useState();
21
+ const [message, setMessage] = useState();
22
+ const [conflict, setConflict] = useState();
23
+ const [pendingImport, setPendingImport] = useState();
24
+ const validationSequence = useRef(0);
25
+ const mounted = useRef(true);
26
+ const textAreaRef = useRef(null);
27
+ const gutterRef = useRef(null);
28
+ const diagnostics = validation?.config.diagnostics ?? [];
29
+ const errors = diagnostics.filter((diagnostic) => diagnostic.severity === "error");
30
+ const blockingErrors = validation?.blockingErrors ?? errors;
31
+ const errorCount = errors.length;
32
+ const blockingErrorCount = blockingErrors.length;
33
+ const inheritedErrorCount = Math.max(0, errorCount - blockingErrorCount);
34
+ const warningCount = diagnostics.filter((diagnostic) => diagnostic.severity === "warning").length;
35
+ const dirty = document !== undefined && draft !== baseContents;
36
+ const byteCount = useMemo(() => new TextEncoder().encode(draft).byteLength, [draft]);
37
+ const lineNumbers = useMemo(() => Array.from({ length: Math.max(1, draft.split(/\r\n|\r|\n/u).length) }, (_, index) => index + 1).join("\n"), [draft]);
38
+ const previewConfig = validation?.config ?? baseConfig;
39
+ const editorDisabled = loading || saving || !document;
40
+ const friendlyMismatches = useMemo(() => friendlyDraftContents === draft && validationState === "valid"
41
+ ? friendlyConfigMismatches(previewConfig, friendly, friendlySections)
42
+ : [], [draft, friendly, friendlyDraftContents, friendlySections, previewConfig, validationState]);
43
+ useEffect(() => {
44
+ let cancelled = false;
45
+ void editor
46
+ .load()
47
+ .then((state) => {
48
+ if (cancelled)
49
+ return;
50
+ const contents = state.document.contents;
51
+ setDocument(state.document);
52
+ setBaseContents(contents);
53
+ setBaseConfig(state.config);
54
+ setDraft(contents);
55
+ setValidation({ documentRevision: state.document.revision, config: state.config });
56
+ setFriendly(friendlyValuesFromConfig(state.config));
57
+ setFriendlySections(friendlyConfigSections(contents));
58
+ setValidatedDraft(undefined);
59
+ setValidationState("validating");
60
+ })
61
+ .catch((cause) => {
62
+ if (!cancelled)
63
+ setError(errorMessage(cause));
64
+ })
65
+ .finally(() => {
66
+ if (!cancelled)
67
+ setLoading(false);
68
+ });
69
+ return () => {
70
+ cancelled = true;
71
+ };
72
+ }, [editor]);
73
+ useEffect(() => {
74
+ mounted.current = true;
75
+ return () => {
76
+ mounted.current = false;
77
+ onPreview(undefined);
78
+ };
79
+ }, [onPreview]);
80
+ useEffect(() => {
81
+ onDirtyChange(dirty);
82
+ }, [dirty, onDirtyChange]);
83
+ useEffect(() => () => {
84
+ onDirtyChange(false);
85
+ }, [onDirtyChange]);
86
+ useEffect(() => {
87
+ if (!document || draft === validatedDraft)
88
+ return;
89
+ const sequence = ++validationSequence.current;
90
+ let cancelled = false;
91
+ const timeout = window.setTimeout(() => {
92
+ void editor
93
+ .validate(draft)
94
+ .then((result) => {
95
+ if (cancelled || sequence !== validationSequence.current)
96
+ return;
97
+ const nextErrors = result.blockingErrors ?? result.config.diagnostics.filter((diagnostic) => diagnostic.severity === "error");
98
+ setValidation(result);
99
+ setValidatedDraft(draft);
100
+ if (draft === baseContents)
101
+ setBaseConfig(result.config);
102
+ if (friendlyDraftContents !== draft) {
103
+ setFriendly(friendlyValuesFromConfig(result.config));
104
+ setFriendlySections(friendlyConfigSections(draft));
105
+ }
106
+ setValidationState(nextErrors.length > 0 ? "invalid" : "valid");
107
+ setError(undefined);
108
+ if (nextErrors.length === 0)
109
+ onPreview(result.config);
110
+ })
111
+ .catch((cause) => {
112
+ if (cancelled || sequence !== validationSequence.current)
113
+ return;
114
+ setValidatedDraft(draft);
115
+ setValidationState("invalid");
116
+ setError(errorMessage(cause));
117
+ });
118
+ }, VALIDATION_DEBOUNCE_MS);
119
+ return () => {
120
+ cancelled = true;
121
+ window.clearTimeout(timeout);
122
+ };
123
+ }, [baseContents, document, draft, editor, friendlyDraftContents, onPreview, validatedDraft]);
124
+ const changeDraft = (contents, preserveFriendly = false) => {
125
+ if (!preserveFriendly) {
126
+ setFriendlyDraftContents(undefined);
127
+ setFriendlySections(friendlyConfigSections(contents));
128
+ }
129
+ setDraft(contents);
130
+ setValidationState("validating");
131
+ setConflict(undefined);
132
+ setError(undefined);
133
+ setMessage(undefined);
134
+ };
135
+ const updateFriendly = (update, section) => {
136
+ const next = { ...friendly, ...update };
137
+ const nextSections = new Set(friendlySections).add(section);
138
+ try {
139
+ const contents = patchFriendlyConfigBlock(draft, next, nextSections);
140
+ setFriendlyDraftContents(contents);
141
+ setFriendly(next);
142
+ setFriendlySections(nextSections);
143
+ changeDraft(contents, true);
144
+ }
145
+ catch (cause) {
146
+ setError(errorMessage(cause));
147
+ }
148
+ };
149
+ const updatePadding = (axis, index, value) => {
150
+ if (!Number.isFinite(value) || value < 0)
151
+ return;
152
+ const next = [...friendly[axis]];
153
+ next[index] = value;
154
+ updateFriendly({ [axis]: next }, "padding");
155
+ };
156
+ const resetFriendly = () => {
157
+ try {
158
+ changeDraft(removeFriendlyConfigBlock(draft));
159
+ }
160
+ catch (cause) {
161
+ setError(errorMessage(cause));
162
+ }
163
+ };
164
+ const stageImport = async (operation) => {
165
+ setError(undefined);
166
+ setMessage(undefined);
167
+ try {
168
+ const result = await operation();
169
+ if (result.status === "selected")
170
+ setPendingImport(result);
171
+ else if (result.status === "unavailable")
172
+ setMessage(result.message);
173
+ }
174
+ catch (cause) {
175
+ setError(errorMessage(cause));
176
+ }
177
+ };
178
+ const applyImport = (strategy) => {
179
+ if (!pendingImport)
180
+ return;
181
+ let contents = pendingImport.contents;
182
+ if (strategy === "append" && draft) {
183
+ contents = appendConfigDocument(draft, pendingImport.contents, preferredConfigNewline(draft));
184
+ }
185
+ if (new TextEncoder().encode(contents).byteLength > MAX_CONFIG_BYTES) {
186
+ setError(`The resulting draft exceeds the ${MAX_CONFIG_BYTES}-byte configuration limit.`);
187
+ return;
188
+ }
189
+ changeDraft(contents);
190
+ setPendingImport(undefined);
191
+ };
192
+ const exportDraft = async () => {
193
+ setError(undefined);
194
+ try {
195
+ const result = await editor.exportFile(draft);
196
+ if (result.status === "saved")
197
+ setMessage(`Exported to ${result.path}`);
198
+ }
199
+ catch (cause) {
200
+ setError(errorMessage(cause));
201
+ }
202
+ };
203
+ const save = async () => {
204
+ if (!document)
205
+ return;
206
+ if (validatedDraft !== draft || validationState === "validating") {
207
+ setError("Wait for the current draft to finish validating before saving.");
208
+ return;
209
+ }
210
+ if (validationState !== "valid" || blockingErrorCount > 0) {
211
+ setError("Fix errors introduced by this profile draft before saving.");
212
+ return;
213
+ }
214
+ if (mode === "friendly" && friendlyMismatches.length > 0) {
215
+ setError("An included configuration layer overrides the friendly fields listed above. Resolve it in Raw config.");
216
+ return;
217
+ }
218
+ setSaving(true);
219
+ setError(undefined);
220
+ setMessage(undefined);
221
+ try {
222
+ const latestValidation = await editor.validate(draft);
223
+ if (!mounted.current)
224
+ return;
225
+ const latestErrors = latestValidation.blockingErrors ??
226
+ latestValidation.config.diagnostics.filter((diagnostic) => diagnostic.severity === "error");
227
+ setValidation(latestValidation);
228
+ setValidatedDraft(draft);
229
+ setValidationState(latestErrors.length > 0 ? "invalid" : "valid");
230
+ if (latestErrors.length > 0) {
231
+ setError("The profile draft now introduces configuration errors. Review validation before saving.");
232
+ return;
233
+ }
234
+ const latestMismatches = mode === "friendly" ? friendlyConfigMismatches(latestValidation.config, friendly, friendlySections) : [];
235
+ if (latestMismatches.length > 0) {
236
+ setError(`An included configuration layer overrides: ${latestMismatches.join(", ")}. Resolve it in Raw config.`);
237
+ return;
238
+ }
239
+ onPreview(latestValidation.config);
240
+ const result = await editor.save(document.revision, draft);
241
+ if (!mounted.current)
242
+ return;
243
+ if (result.status === "conflict") {
244
+ setConflict(result.document);
245
+ return;
246
+ }
247
+ setDocument(result.document);
248
+ setBaseContents(result.document.contents);
249
+ setBaseConfig(result.config);
250
+ setDraft(result.document.contents);
251
+ setValidation({ documentRevision: result.document.revision, config: result.config, blockingErrors: [] });
252
+ setValidatedDraft(result.document.contents);
253
+ setValidationState("valid");
254
+ setFriendly(friendlyValuesFromConfig(result.config));
255
+ setFriendlySections(friendlyConfigSections(result.document.contents));
256
+ setConflict(undefined);
257
+ setMessage("Saved and loaded. Existing sessions received live settings; startup-only and parsed-only settings remain deferred as indicated.");
258
+ onPreview(result.config);
259
+ onSaved?.(result.config);
260
+ }
261
+ catch (cause) {
262
+ if (mounted.current)
263
+ setError(errorMessage(cause));
264
+ }
265
+ finally {
266
+ if (mounted.current)
267
+ setSaving(false);
268
+ }
269
+ };
270
+ const adoptConflictDocument = (keepDraft) => {
271
+ if (!conflict)
272
+ return;
273
+ setDocument(conflict);
274
+ setBaseContents(conflict.contents);
275
+ setValidatedDraft(undefined);
276
+ setValidationState("validating");
277
+ if (!keepDraft) {
278
+ setFriendlyDraftContents(undefined);
279
+ setFriendlySections(friendlyConfigSections(conflict.contents));
280
+ setDraft(conflict.contents);
281
+ }
282
+ setConflict(undefined);
283
+ setMessage(keepDraft ? "Using the latest disk revision; review before saving your draft over it." : "Reloaded from disk.");
284
+ };
285
+ const revert = () => {
286
+ changeDraft(baseContents);
287
+ setFriendly(friendlyValuesFromConfig(baseConfig));
288
+ };
289
+ const jumpToDiagnostic = (diagnostic) => {
290
+ if (!diagnostic.line || (diagnostic.source && diagnostic.source !== document?.path))
291
+ return;
292
+ const textarea = textAreaRef.current;
293
+ if (!textarea)
294
+ return;
295
+ const lines = draft.replaceAll("\r\n", "\n").split(/(?<=\n)/u);
296
+ const start = lines.slice(0, diagnostic.line - 1).join("").length;
297
+ const end = start + (lines[diagnostic.line - 1]?.replace(/[\r\n]+$/u, "").length ?? 0);
298
+ textarea.focus();
299
+ textarea.setSelectionRange(start, end);
300
+ };
301
+ return (_jsxs("div", { className: "advanced-config", children: [_jsxs("div", { className: "advanced-config-toolbar", children: [_jsxs("div", { className: "settings-segmented", role: "tablist", "aria-label": "Advanced editor mode", children: [_jsx("button", { type: "button", role: "tab", "aria-selected": mode === "raw", onClick: () => setMode("raw"), children: "Raw config" }), _jsx("button", { type: "button", role: "tab", "aria-selected": mode === "friendly", onClick: () => setMode("friendly"), children: "Friendly editor" })] }), _jsx("span", { className: `config-validation-status is-${validationState}`, children: loading
302
+ ? "Loading…"
303
+ : validationState === "validating"
304
+ ? "Validating…"
305
+ : validationState === "valid"
306
+ ? inheritedErrorCount > 0
307
+ ? `Valid · ${inheritedErrorCount} inherited errors`
308
+ : "Valid · visual preview"
309
+ : validationState === "invalid"
310
+ ? "Needs attention"
311
+ : "Not validated" })] }), pendingImport ? (_jsxs("div", { className: "config-import-stage", role: "status", children: [_jsxs("div", { children: [_jsxs("strong", { children: ["Import ", pendingImport.name, "?"] }), _jsx("p", { children: pendingImport.notice ?? "The selected text will be staged in the editor." })] }), _jsxs("span", { children: [_jsx("button", { type: "button", onClick: () => applyImport("replace"), children: "Replace draft" }), _jsx("button", { type: "button", onClick: () => applyImport("append"), children: "Append" }), _jsx("button", { type: "button", onClick: () => setPendingImport(undefined), children: "Cancel" })] })] })) : null, conflict ? (_jsxs("div", { className: "config-conflict", role: "alert", children: [_jsxs("div", { children: [_jsx("strong", { children: "The config changed on disk." }), _jsx("p", { children: "Nothing was overwritten. Compare the current disk version before choosing which base to use." }), _jsxs("details", { children: [_jsx("summary", { children: "Show current disk version" }), _jsx("pre", { children: conflict.contents || "(empty file)" })] })] }), _jsxs("span", { children: [_jsx("button", { type: "button", onClick: () => adoptConflictDocument(false), children: "Use disk version" }), _jsx("button", { type: "button", onClick: () => adoptConflictDocument(true), children: "Keep draft on latest revision" })] })] })) : null, _jsxs("div", { className: "advanced-config-body", children: [mode === "raw" ? (_jsx(RawEditor, { draft: draft, document: document, documentStatus: loading ? "Loading…" : "Unavailable", lineNumbers: lineNumbers, textAreaRef: textAreaRef, gutterRef: gutterRef, onChange: changeDraft, onImportGhostty: () => void stageImport(editor.importGhostty), onImportFile: () => void stageImport(editor.importFile), onExport: () => void exportDraft(), onOpenExternal: editor.openExternal, byteCount: byteCount, dirty: dirty, disabled: editorDisabled, lineEnding: preferredConfigNewline(draft, preferredConfigNewline(baseContents)) })) : (_jsx(FriendlyEditor, { values: friendly, hasOverrides: friendlySections.size > 0, onChange: updateFriendly, onPaddingChange: updatePadding, onReset: resetFriendly, mismatches: friendlyMismatches, disabled: editorDisabled })), _jsxs("aside", { className: "config-inspector", "aria-label": "Configuration validation", children: [_jsxs("section", { children: [_jsx("h2", { children: "Validation" }), _jsxs("p", { className: "appearance-help", children: [errorCount, " errors (", blockingErrorCount, " in this draft) \u00B7 ", warningCount, " warnings \u00B7 ", diagnostics.length, " ", "diagnostics"] }), _jsx("div", { className: "config-diagnostics", children: diagnostics.length === 0 ? (_jsx("p", { className: "config-empty-state", children: "No diagnostics." })) : (diagnostics.map((diagnostic, index) => {
312
+ const local = !diagnostic.source || diagnostic.source === document?.path;
313
+ return (_jsxs("button", { type: "button", className: `is-${diagnostic.severity}`, disabled: !local || !diagnostic.line, onClick: () => jumpToDiagnostic(diagnostic), children: [_jsx("strong", { children: diagnostic.severity }), _jsx("span", { children: diagnostic.message }), _jsxs("small", { children: [sourceName(diagnostic.source), diagnostic.line ? `:${diagnostic.line}` : ""] })] }, `${diagnostic.code}-${diagnostic.source ?? "global"}-${diagnostic.line ?? index}`));
314
+ })) })] }), _jsxs("section", { children: [_jsx("h2", { children: "Effective settings" }), _jsxs("dl", { className: "config-effective", children: [_jsxs("div", { children: [_jsx("dt", { children: "Font" }), _jsxs("dd", { children: [previewConfig.renderer.fontSize, "px"] })] }), _jsxs("div", { children: [_jsx("dt", { children: "Scrollback" }), _jsx("dd", { children: formatBytes(previewConfig.terminal.scrollbackBytes) })] }), _jsxs("div", { children: [_jsx("dt", { children: "Sources" }), _jsx("dd", { children: previewConfig.sources.length })] }), _jsxs("div", { children: [_jsx("dt", { children: "Supported keys" }), _jsx("dd", { children: previewConfig.configuredKeys.filter((key) => key.support !== "unsupported").length })] })] }), _jsxs("details", { className: "config-sources", children: [_jsx("summary", { children: "Loaded sources" }), _jsx("ul", { children: previewConfig.sources.map((source) => (_jsxs("li", { children: [_jsx("span", { children: source.kind }), _jsx("code", { title: source.path, children: sourceName(source.path) })] }, `${source.kind}-${source.path}`))) })] })] })] })] }), error ? (_jsx("p", { className: "appearance-error", role: "alert", children: error })) : null, message ? (_jsx("p", { className: "config-message", role: "status", children: message })) : null, _jsxs("footer", { children: [_jsxs("span", { className: "config-footer-status", children: [dirty ? "Unsaved draft" : "Saved", " \u00B7 ", byteCount.toLocaleString(), " / ", MAX_CONFIG_BYTES.toLocaleString(), " bytes"] }), _jsx("button", { type: "button", disabled: !dirty || saving, onClick: revert, children: "Revert" }), _jsx("button", { type: "button", onClick: onClose, children: "Close" }), _jsx("button", { type: "button", className: "appearance-save", disabled: !dirty ||
315
+ saving ||
316
+ loading ||
317
+ validationState !== "valid" ||
318
+ validatedDraft !== draft ||
319
+ blockingErrorCount > 0 ||
320
+ Boolean(conflict) ||
321
+ Boolean(pendingImport) ||
322
+ (mode === "friendly" && friendlyMismatches.length > 0), onClick: () => void save(), children: saving ? "Saving…" : "Save & load" })] })] }));
323
+ }
324
+ function RawEditor({ draft, document, documentStatus, lineNumbers, textAreaRef, gutterRef, onChange, onImportGhostty, onImportFile, onExport, onOpenExternal, byteCount, dirty, disabled, lineEnding, }) {
325
+ return (_jsxs("section", { className: "raw-config-editor", children: [_jsxs("div", { className: "config-editor-actions", children: [_jsx("button", { type: "button", disabled: disabled, onClick: onImportGhostty, children: "Import from Ghostty" }), _jsx("button", { type: "button", disabled: disabled, onClick: onImportFile, children: "Import file\u2026" }), _jsx("button", { type: "button", disabled: disabled, onClick: onExport, children: "Export\u2026" }), onOpenExternal ? (_jsx("button", { type: "button", onClick: onOpenExternal, children: "Open externally\u2026" })) : null] }), _jsxs("div", { className: "config-document-meta", children: [_jsx("strong", { children: "Profile override" }), _jsx("code", { title: document?.path, children: document?.path ? sourceName(document.path) : documentStatus }), _jsx("span", { children: document?.exists ? "On disk" : "New file" })] }), _jsxs("div", { className: "config-code-editor", children: [_jsx("pre", { ref: gutterRef, "aria-hidden": "true", children: lineNumbers }), _jsx("textarea", { ref: textAreaRef, value: draft, onChange: (event) => onChange(applyConfigTextareaEdit(draft, event.currentTarget.value, lineEnding)), onScroll: (event) => {
326
+ if (gutterRef.current)
327
+ gutterRef.current.scrollTop = event.currentTarget.scrollTop;
328
+ }, "aria-label": "Ghostty profile configuration", autoCapitalize: "off", autoCorrect: "off", spellCheck: false, readOnly: disabled })] }), _jsxs("p", { className: "appearance-help config-editor-help", children: ["Validation runs after each edit. View-owned colors, opacity, and bundled shaders preview immediately; palette, model, and startup settings wait for Save & load.", " ", dirty ? "This draft differs from disk." : "This draft matches disk.", " (", byteCount.toLocaleString(), " bytes)"] })] }));
329
+ }
330
+ function FriendlyEditor({ values, hasOverrides, onChange, onPaddingChange, onReset, mismatches, disabled, }) {
331
+ const changeColors = (update) => onChange(update, "colors");
332
+ return (_jsxs("section", { className: "friendly-config-editor", children: [_jsxs("div", { className: "friendly-heading", children: [_jsxs("div", { children: [_jsx("h2", { children: "Common settings" }), _jsx("p", { className: "appearance-help", children: "Changes generate a visible managed block in the same raw draft. Reset removes that block and restores inherited values." })] }), _jsx("button", { type: "button", disabled: disabled || !hasOverrides, onClick: onReset, children: "Reset overrides" })] }), mismatches.length > 0 ? (_jsxs("div", { className: "friendly-shadow-warning", role: "alert", children: ["An included configuration layer overrides: ", mismatches.join(", "), ". Use Raw config to review the include."] })) : null, _jsxs("fieldset", { disabled: disabled, children: [_jsxs("legend", { children: ["Colors ", _jsx("span", { children: "Live preview" })] }), _jsxs("div", { className: "friendly-color-grid", children: [_jsx(ColorField, { label: "Foreground", field: "foreground", value: values.foreground, onChange: changeColors }), _jsx(ColorField, { label: "Background", field: "background", value: values.background, onChange: changeColors }), _jsx(ColorField, { label: "Cursor", field: "cursor", value: values.cursor, onChange: changeColors }), _jsx(ColorField, { label: "Cursor text", field: "cursorText", value: values.cursorText, onChange: changeColors }), _jsx(ColorField, { label: "Selection", field: "selectionBackground", value: values.selectionBackground, onChange: changeColors }), _jsx(ColorField, { label: "Selection text", field: "selectionForeground", value: values.selectionForeground, onChange: changeColors })] }), _jsxs("label", { className: "appearance-range", children: [_jsxs("span", { children: ["Background opacity ", _jsxs("output", { children: [Math.round(values.backgroundOpacity * 100), "%"] })] }), _jsx("input", { type: "range", min: "0", max: "1", step: "0.01", value: values.backgroundOpacity, onChange: (event) => onChange({ backgroundOpacity: event.currentTarget.valueAsNumber }, "opacity") })] }), _jsxs("label", { className: "appearance-check", children: [_jsx("input", { type: "checkbox", checked: values.backgroundOpacityCells, onChange: (event) => onChange({ backgroundOpacityCells: event.currentTarget.checked }, "opacity") }), _jsx("span", { children: "Apply opacity to explicit cell backgrounds" })] })] }), _jsxs("fieldset", { disabled: disabled, children: [_jsxs("legend", { children: ["Typography & layout ", _jsx("span", { children: "Startup / parsed only" })] }), _jsxs("div", { className: "friendly-field-grid", children: [_jsxs("label", { children: [_jsx("span", { children: "Font size" }), _jsx("input", { type: "number", min: "1", step: "0.5", value: values.fontSize, onChange: (event) => {
333
+ const value = event.currentTarget.valueAsNumber;
334
+ if (Number.isFinite(value) && value > 0)
335
+ onChange({ fontSize: value }, "typography");
336
+ } })] }), _jsx(NumberField, { label: "Padding left", value: values.paddingX[0], onChange: (value) => onPaddingChange("paddingX", 0, value) }), _jsx(NumberField, { label: "Padding right", value: values.paddingX[1], onChange: (value) => onPaddingChange("paddingX", 1, value) }), _jsx(NumberField, { label: "Padding top", value: values.paddingY[0], onChange: (value) => onPaddingChange("paddingY", 0, value) }), _jsx(NumberField, { label: "Padding bottom", value: values.paddingY[1], onChange: (value) => onPaddingChange("paddingY", 1, value) })] }), _jsxs("label", { className: "friendly-textarea-field", children: [_jsxs("span", { children: ["Font families ", _jsx("small", { children: "one fallback per line" })] }), _jsx("textarea", { rows: 3, value: values.fontFamilies.join("\n"), onChange: (event) => onChange({ fontFamilies: event.currentTarget.value.split(/\r?\n/u) }, "typography"), spellCheck: false })] }), _jsx("p", { className: "appearance-help", children: "Desktop font metrics are selected at startup. Padding is preserved in the effective config but is not applied by the current fixed desktop grid." })] }), _jsxs("fieldset", { disabled: disabled, children: [_jsx("legend", { children: "Sessions & keyboard" }), _jsxs("label", { className: "friendly-number-wide", children: [_jsxs("span", { children: ["Scrollback limit ", _jsx("small", { children: "bytes \u00B7 new sessions" })] }), _jsx("input", { type: "number", min: "0", step: "100000", value: values.scrollbackLimit, onChange: (event) => {
337
+ const value = event.currentTarget.valueAsNumber;
338
+ if (Number.isFinite(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER) {
339
+ onChange({ scrollbackLimit: value }, "scrollback");
340
+ }
341
+ } })] }), _jsxs("label", { className: "appearance-check", children: [_jsx("input", { type: "checkbox", checked: values.clearKeybindings, onChange: (event) => onChange({ clearKeybindings: event.currentTarget.checked }, "keybindings") }), _jsx("span", { children: "Clear Ghostty default keybindings before applying these entries" })] }), _jsxs("label", { className: "friendly-textarea-field", children: [_jsxs("span", { children: ["Keybindings ", _jsx("small", { children: "one trigger=action per line \u00B7 supported entries live" })] }), _jsx("textarea", { rows: 5, value: values.keybindings.join("\n"), onChange: (event) => onChange({ keybindings: event.currentTarget.value.split(/\r?\n/u) }, "keybindings"), spellCheck: false })] })] })] }));
342
+ }
343
+ function ColorField({ label, field, value, onChange, }) {
344
+ return (_jsxs("label", { className: "friendly-color", children: [_jsx("input", { type: "color", value: value, onChange: (event) => onChange({ [field]: event.currentTarget.value }) }), _jsxs("span", { children: [_jsx("strong", { children: label }), _jsx("code", { children: value })] })] }));
345
+ }
346
+ function NumberField({ label, value, onChange }) {
347
+ return (_jsxs("label", { children: [_jsx("span", { children: label }), _jsx("input", { type: "number", min: "0", step: "1", value: value, onChange: (event) => onChange(event.currentTarget.valueAsNumber) })] }));
348
+ }
349
+ function sourceName(path) {
350
+ if (!path)
351
+ return "global";
352
+ return path.split(/[\\/]/u).filter(Boolean).at(-1) ?? path;
353
+ }
354
+ function formatBytes(bytes) {
355
+ if (bytes < 1_000_000)
356
+ return `${Math.round(bytes / 1_000)} KB`;
357
+ return `${(bytes / 1_000_000).toFixed(1)} MB`;
358
+ }
359
+ function errorMessage(cause) {
360
+ return cause instanceof Error ? cause.message : String(cause);
361
+ }
362
+ //# sourceMappingURL=AdvancedConfigSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdvancedConfigSettings.js","sourceRoot":"","sources":["../../src/appearance/AdvancedConfigSettings.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ConfigSnapshot } from "@vibecook/ghosttea-protocol";
2
+ import type { GhostteaAppearanceUpdate, GhostteaConfigEditorBridge } from "./types.js";
3
+ import type { TerminalShaderEffect } from "../renderers/types.js";
4
+ export interface AppearanceDraftState {
5
+ themeName: string | null;
6
+ opacity: number;
7
+ opacityCells: boolean;
8
+ effects: TerminalShaderEffect[];
9
+ animation: boolean;
10
+ }
11
+ export declare function appearanceDraftFromConfig(config: ConfigSnapshot): AppearanceDraftState;
12
+ export declare function sameAppearanceDraft(left: AppearanceDraftState, right: AppearanceDraftState): boolean;
13
+ export interface AppearanceSettingsProps {
14
+ config: ConfigSnapshot;
15
+ onClose: () => void;
16
+ onSave?: (update: GhostteaAppearanceUpdate) => Promise<void>;
17
+ configEditor?: GhostteaConfigEditorBridge;
18
+ onPreview: (config: ConfigSnapshot | undefined) => void;
19
+ }
20
+ export declare function AppearanceSettings({ config, onClose, onSave, configEditor, onPreview }: AppearanceSettingsProps): import("react").JSX.Element;
21
+ //# sourceMappingURL=AppearanceSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppearanceSettings.d.ts","sourceRoot":"","sources":["../../src/appearance/AppearanceSettings.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAIlE,OAAO,KAAK,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,oBAAoB,CAUtF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CASpG;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,YAAY,CAAC,EAAE,0BAA0B,CAAC;IAC1C,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,KAAK,IAAI,CAAC;CACzD;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,uBAAuB,+BAsa/G"}