@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.
- package/README.md +10 -0
- package/THIRD_PARTY_NOTICES.md +62 -0
- package/dist/appearance/AdvancedConfigSettings.d.ts +12 -0
- package/dist/appearance/AdvancedConfigSettings.d.ts.map +1 -0
- package/dist/appearance/AdvancedConfigSettings.js +362 -0
- package/dist/appearance/AdvancedConfigSettings.js.map +1 -0
- package/dist/appearance/AppearanceSettings.d.ts +21 -0
- package/dist/appearance/AppearanceSettings.d.ts.map +1 -0
- package/dist/appearance/AppearanceSettings.js +175 -0
- package/dist/appearance/AppearanceSettings.js.map +1 -0
- package/dist/appearance/catalog.d.ts +39 -0
- package/dist/appearance/catalog.d.ts.map +1 -0
- package/dist/appearance/catalog.js +56 -0
- package/dist/appearance/catalog.js.map +1 -0
- package/dist/appearance/config-draft.d.ts +35 -0
- package/dist/appearance/config-draft.d.ts.map +1 -0
- package/dist/appearance/config-draft.js +289 -0
- package/dist/appearance/config-draft.js.map +1 -0
- package/dist/appearance/shaders.d.ts +14 -0
- package/dist/appearance/shaders.d.ts.map +1 -0
- package/dist/appearance/shaders.js +71 -0
- package/dist/appearance/shaders.js.map +1 -0
- package/dist/appearance/theme-catalog.generated.json +16260 -0
- package/dist/appearance/types.d.ts +61 -0
- package/dist/appearance/types.d.ts.map +1 -0
- package/dist/appearance/types.js +2 -0
- package/dist/appearance/types.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -4
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/renderers/canvas-renderer.d.ts.map +1 -1
- package/dist/renderers/canvas-renderer.js +9 -1
- package/dist/renderers/canvas-renderer.js.map +1 -1
- package/dist/renderers/shader-effects.d.ts +2 -0
- package/dist/renderers/shader-effects.d.ts.map +1 -0
- package/dist/renderers/shader-effects.js +206 -0
- package/dist/renderers/shader-effects.js.map +1 -0
- package/dist/renderers/types.d.ts +7 -0
- package/dist/renderers/types.d.ts.map +1 -1
- package/dist/renderers/types.js +11 -0
- package/dist/renderers/types.js.map +1 -1
- package/dist/renderers/webgpu-renderer.d.ts +2 -1
- package/dist/renderers/webgpu-renderer.d.ts.map +1 -1
- package/dist/renderers/webgpu-renderer.js +250 -159
- package/dist/renderers/webgpu-renderer.js.map +1 -1
- package/dist/terminal-render.worker.js +479 -165
- package/dist/terminal-render.worker.js.map +3 -3
- package/dist/workspace/Workspace.d.ts +32 -4
- package/dist/workspace/Workspace.d.ts.map +1 -1
- package/dist/workspace/Workspace.js +45 -17
- package/dist/workspace/Workspace.js.map +1 -1
- package/dist/workspace/index.d.ts +5 -2
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +3 -1
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/pane-layout.d.ts +9 -2
- package/dist/workspace/pane-layout.d.ts.map +1 -1
- package/dist/workspace/pane-layout.js +37 -11
- package/dist/workspace/pane-layout.js.map +1 -1
- package/dist/workspace/themes.d.ts +4 -0
- package/dist/workspace/themes.d.ts.map +1 -1
- package/dist/workspace/themes.js +4 -0
- package/dist/workspace/themes.js.map +1 -1
- package/dist/workspace/workspace-model.d.ts +2 -0
- package/dist/workspace/workspace-model.d.ts.map +1 -1
- package/dist/workspace/workspace-model.js +6 -1
- package/dist/workspace/workspace-model.js.map +1 -1
- package/dist/workspace.css +1122 -5
- 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"}
|