@vibecook/ghosttea-react 0.11.1 → 0.13.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 +86 -4
- package/dist/TerminalSurface.d.ts +53 -0
- package/dist/TerminalSurface.d.ts.map +1 -1
- package/dist/TerminalSurface.js +106 -12
- package/dist/TerminalSurface.js.map +1 -1
- package/dist/appearance/AppearanceSettings.d.ts +5 -2
- package/dist/appearance/AppearanceSettings.d.ts.map +1 -1
- package/dist/appearance/AppearanceSettings.js +14 -3
- package/dist/appearance/AppearanceSettings.js.map +1 -1
- package/dist/appearance/BackdropBlurControl.d.ts +5 -0
- package/dist/appearance/BackdropBlurControl.d.ts.map +1 -0
- package/dist/appearance/BackdropBlurControl.js +42 -0
- package/dist/appearance/BackdropBlurControl.js.map +1 -0
- package/dist/appearance/types.d.ts +10 -0
- package/dist/appearance/types.d.ts.map +1 -1
- package/dist/catalog-budget.d.ts +2 -2
- package/dist/catalog-budget.d.ts.map +1 -1
- package/dist/catalog-budget.js +2 -2
- package/dist/catalog-budget.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/link-input.d.ts +18 -0
- package/dist/link-input.d.ts.map +1 -0
- package/dist/link-input.js +27 -0
- package/dist/link-input.js.map +1 -0
- package/dist/renderers/background-geometry.d.ts +16 -0
- package/dist/renderers/background-geometry.d.ts.map +1 -0
- package/dist/renderers/background-geometry.js +20 -0
- package/dist/renderers/background-geometry.js.map +1 -0
- package/dist/renderers/glyph-atlas.d.ts +43 -0
- package/dist/renderers/glyph-atlas.d.ts.map +1 -0
- package/dist/renderers/glyph-atlas.js +175 -0
- package/dist/renderers/glyph-atlas.js.map +1 -0
- package/dist/renderers/light-adaptation.d.ts +36 -0
- package/dist/renderers/light-adaptation.d.ts.map +1 -0
- package/dist/renderers/light-adaptation.js +332 -0
- package/dist/renderers/light-adaptation.js.map +1 -0
- package/dist/renderers/types.d.ts +23 -0
- package/dist/renderers/types.d.ts.map +1 -1
- package/dist/renderers/types.js.map +1 -1
- package/dist/renderers/webgpu-renderer.d.ts +4 -0
- package/dist/renderers/webgpu-renderer.d.ts.map +1 -1
- package/dist/renderers/webgpu-renderer.js +331 -239
- package/dist/renderers/webgpu-renderer.js.map +1 -1
- package/dist/routed-control.d.ts +26 -2
- package/dist/routed-control.d.ts.map +1 -1
- package/dist/routed-control.js +145 -27
- package/dist/routed-control.js.map +1 -1
- package/dist/routed-frames.d.ts +1 -1
- package/dist/routed-frames.d.ts.map +1 -1
- package/dist/routed-frames.js +3 -7
- package/dist/routed-frames.js.map +1 -1
- package/dist/row-damage.d.ts +21 -0
- package/dist/row-damage.d.ts.map +1 -0
- package/dist/row-damage.js +76 -0
- package/dist/row-damage.js.map +1 -0
- package/dist/runtime.d.ts +97 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +489 -49
- package/dist/runtime.js.map +1 -1
- package/dist/styles.css +24 -0
- package/dist/terminal-render.worker.js +979 -297
- package/dist/terminal-render.worker.js.map +4 -4
- package/dist/use-terminal-links.d.ts +17 -0
- package/dist/use-terminal-links.d.ts.map +1 -0
- package/dist/use-terminal-links.js +101 -0
- package/dist/use-terminal-links.js.map +1 -0
- package/dist/worker-messages.d.ts +27 -1
- package/dist/worker-messages.d.ts.map +1 -1
- package/dist/workspace/Workspace.d.ts +19 -3
- package/dist/workspace/Workspace.d.ts.map +1 -1
- package/dist/workspace/Workspace.js +53 -20
- package/dist/workspace/Workspace.js.map +1 -1
- package/dist/workspace/index.d.ts +2 -2
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/pane-focus.d.ts +8 -0
- package/dist/workspace/pane-focus.d.ts.map +1 -0
- package/dist/workspace/pane-focus.js +24 -0
- package/dist/workspace/pane-focus.js.map +1 -0
- package/dist/workspace/pane-layout.d.ts +5 -2
- package/dist/workspace/pane-layout.d.ts.map +1 -1
- package/dist/workspace/pane-layout.js +45 -6
- package/dist/workspace/pane-layout.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
export class AtlasCapacityError extends Error {
|
|
2
|
+
}
|
|
3
|
+
/** The current batch must submit before an atlas page can be recycled. */
|
|
4
|
+
export class AtlasBatchFullError extends Error {
|
|
5
|
+
}
|
|
6
|
+
/** Lazy, bounded atlas pages. A page used by an unsubmitted draw cannot be
|
|
7
|
+
* recycled. Appending into its unused space is safe. Each pane uses one page
|
|
8
|
+
* per glyph format, preserving instanced draws without per-glyph bind changes. */
|
|
9
|
+
export class GlyphAtlasPages {
|
|
10
|
+
device;
|
|
11
|
+
layout;
|
|
12
|
+
label;
|
|
13
|
+
format;
|
|
14
|
+
maxPages;
|
|
15
|
+
size;
|
|
16
|
+
#pages = [];
|
|
17
|
+
#sampler;
|
|
18
|
+
#current;
|
|
19
|
+
#generation = 0;
|
|
20
|
+
#clock = 0;
|
|
21
|
+
constructor(device, layout, label, format, maxPages, size = 2048) {
|
|
22
|
+
this.device = device;
|
|
23
|
+
this.layout = layout;
|
|
24
|
+
this.label = label;
|
|
25
|
+
this.format = format;
|
|
26
|
+
this.maxPages = maxPages;
|
|
27
|
+
this.size = size;
|
|
28
|
+
this.#sampler = device.createSampler({ minFilter: "linear", magFilter: "linear" });
|
|
29
|
+
}
|
|
30
|
+
get generation() {
|
|
31
|
+
return this.#current?.generation ?? 0;
|
|
32
|
+
}
|
|
33
|
+
get bindGroup() {
|
|
34
|
+
if (!this.#current)
|
|
35
|
+
throw new Error(`${this.label} has not been prepared`);
|
|
36
|
+
return this.#current.bindGroup;
|
|
37
|
+
}
|
|
38
|
+
prepare(input) {
|
|
39
|
+
const glyphs = new Map();
|
|
40
|
+
for (const glyph of input)
|
|
41
|
+
glyphs.set(glyph.key, glyph);
|
|
42
|
+
if (glyphs.size === 0)
|
|
43
|
+
return;
|
|
44
|
+
let selected;
|
|
45
|
+
let selectedPlan;
|
|
46
|
+
let bestHits = -1;
|
|
47
|
+
for (const page of this.#pages) {
|
|
48
|
+
const plan = this.#plan(glyphs.values(), page);
|
|
49
|
+
if (!plan)
|
|
50
|
+
continue;
|
|
51
|
+
let hits = 0;
|
|
52
|
+
for (const key of glyphs.keys())
|
|
53
|
+
if (page.cache.has(key))
|
|
54
|
+
hits += 1;
|
|
55
|
+
if (hits > bestHits || (hits === bestHits && page.used > (selected?.used ?? -1))) {
|
|
56
|
+
selected = page;
|
|
57
|
+
selectedPlan = plan;
|
|
58
|
+
bestHits = hits;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (!selected) {
|
|
62
|
+
selectedPlan = this.#plan(glyphs.values());
|
|
63
|
+
if (!selectedPlan) {
|
|
64
|
+
throw new AtlasCapacityError(`${this.label} cannot fit the glyphs visible in one frame`);
|
|
65
|
+
}
|
|
66
|
+
if (this.#pages.length === this.maxPages) {
|
|
67
|
+
const recyclable = this.#pages.filter((page) => !page.pinned).sort((a, b) => a.used - b.used)[0];
|
|
68
|
+
if (!recyclable)
|
|
69
|
+
throw new AtlasBatchFullError(this.label);
|
|
70
|
+
// A new texture also restores zero gutters; old texels must not bleed
|
|
71
|
+
// around smaller replacement glyphs under linear filtering.
|
|
72
|
+
recyclable.texture.destroy();
|
|
73
|
+
this.#pages.splice(this.#pages.indexOf(recyclable), 1);
|
|
74
|
+
}
|
|
75
|
+
const texture = this.device.createTexture({
|
|
76
|
+
label: this.label,
|
|
77
|
+
size: [this.size, this.size],
|
|
78
|
+
format: this.format,
|
|
79
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
|
|
80
|
+
});
|
|
81
|
+
selected = {
|
|
82
|
+
texture,
|
|
83
|
+
bindGroup: this.device.createBindGroup({
|
|
84
|
+
label: `${this.label} bindings`,
|
|
85
|
+
layout: this.layout,
|
|
86
|
+
entries: [
|
|
87
|
+
{ binding: 0, resource: texture.createView() },
|
|
88
|
+
{ binding: 1, resource: this.#sampler },
|
|
89
|
+
],
|
|
90
|
+
}),
|
|
91
|
+
cache: new Map(),
|
|
92
|
+
slots: new Map(),
|
|
93
|
+
generation: ++this.#generation,
|
|
94
|
+
used: 0,
|
|
95
|
+
pinned: false,
|
|
96
|
+
x: 1,
|
|
97
|
+
y: 1,
|
|
98
|
+
rowHeight: 0,
|
|
99
|
+
};
|
|
100
|
+
this.#pages.push(selected);
|
|
101
|
+
}
|
|
102
|
+
// Commit preflight's exact positions, including glyphs geometry may skip.
|
|
103
|
+
// Removing/reordering shelf-packed rectangles can change row breaks and
|
|
104
|
+
// overflow even when the original sequence fit. Upload remains lazy.
|
|
105
|
+
const plan = selectedPlan;
|
|
106
|
+
for (const [key, slot] of plan.slots)
|
|
107
|
+
selected.slots.set(key, slot);
|
|
108
|
+
selected.x = plan.x;
|
|
109
|
+
selected.y = plan.y;
|
|
110
|
+
selected.rowHeight = plan.rowHeight;
|
|
111
|
+
selected.used = ++this.#clock;
|
|
112
|
+
this.#current = selected;
|
|
113
|
+
}
|
|
114
|
+
pin() {
|
|
115
|
+
if (this.#current)
|
|
116
|
+
this.#current.pinned = true;
|
|
117
|
+
}
|
|
118
|
+
#plan(glyphs, page) {
|
|
119
|
+
const slots = new Map();
|
|
120
|
+
let x = page?.x ?? 1;
|
|
121
|
+
let y = page?.y ?? 1;
|
|
122
|
+
let rowHeight = page?.rowHeight ?? 0;
|
|
123
|
+
for (const { key, width, height } of glyphs) {
|
|
124
|
+
if (page?.slots.has(key))
|
|
125
|
+
continue;
|
|
126
|
+
if (width + 2 > this.size || height + 2 > this.size)
|
|
127
|
+
return undefined;
|
|
128
|
+
if (x + width + 1 > this.size) {
|
|
129
|
+
x = 1;
|
|
130
|
+
y += rowHeight + 1;
|
|
131
|
+
rowHeight = 0;
|
|
132
|
+
}
|
|
133
|
+
if (y + height + 1 > this.size)
|
|
134
|
+
return undefined;
|
|
135
|
+
slots.set(key, { origin: [x, y], width, height });
|
|
136
|
+
x += width + 1;
|
|
137
|
+
rowHeight = Math.max(rowHeight, height);
|
|
138
|
+
}
|
|
139
|
+
return { slots, x, y, rowHeight };
|
|
140
|
+
}
|
|
141
|
+
get(key) {
|
|
142
|
+
return this.#current?.cache.get(key);
|
|
143
|
+
}
|
|
144
|
+
insert(key, width, height, cells) {
|
|
145
|
+
const page = this.#current;
|
|
146
|
+
if (!page)
|
|
147
|
+
throw new Error(`${this.label} has not been prepared`);
|
|
148
|
+
const slot = page.slots.get(key);
|
|
149
|
+
if (!slot || slot.width !== width || slot.height !== height) {
|
|
150
|
+
throw new Error(`${this.label} glyph does not match its prepared reservation`);
|
|
151
|
+
}
|
|
152
|
+
const origin = slot.origin;
|
|
153
|
+
const [x, y] = origin;
|
|
154
|
+
const location = {
|
|
155
|
+
u0: x / this.size,
|
|
156
|
+
v0: y / this.size,
|
|
157
|
+
u1: (x + width) / this.size,
|
|
158
|
+
v1: (y + height) / this.size,
|
|
159
|
+
cells,
|
|
160
|
+
};
|
|
161
|
+
page.cache.set(key, location);
|
|
162
|
+
return { location, texture: page.texture, origin };
|
|
163
|
+
}
|
|
164
|
+
releaseBatch() {
|
|
165
|
+
for (const page of this.#pages)
|
|
166
|
+
page.pinned = false;
|
|
167
|
+
}
|
|
168
|
+
destroy() {
|
|
169
|
+
for (const page of this.#pages)
|
|
170
|
+
page.texture.destroy();
|
|
171
|
+
this.#pages.length = 0;
|
|
172
|
+
this.#current = undefined;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=glyph-atlas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glyph-atlas.js","sourceRoot":"","sources":["../../src/renderers/glyph-atlas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { RenderView, Rgba } from "./types.js";
|
|
2
|
+
export type Rgb = readonly [number, number, number];
|
|
3
|
+
/** Light when dark text out-contrasts light text: WCAG luminance above ~0.179. Matches the VT shim. */
|
|
4
|
+
export declare function isLightBackground(color: Rgb): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Ghostty's `minimum-contrast`: text below the WCAG ratio against its
|
|
7
|
+
* background moves toward whichever of black or white contrasts more. Ghostty
|
|
8
|
+
* snaps straight to that extreme; this keeps hue and chroma and moves OKLab
|
|
9
|
+
* lightness only as far as the ratio needs, reaching black or white only when
|
|
10
|
+
* nothing less suffices.
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureContrast(text: Rgba, background: Rgba, ratio: number): Rgba;
|
|
13
|
+
export interface LightAdaptation {
|
|
14
|
+
/** Stable identity for cache keys: base, paper, and ink. */
|
|
15
|
+
readonly key: string;
|
|
16
|
+
readonly base: Rgb;
|
|
17
|
+
/** A color painted as an area: cell backgrounds and block-element art. */
|
|
18
|
+
surface(color: Rgb): Rgba;
|
|
19
|
+
/**
|
|
20
|
+
* A glyph color, judged against the background it was designed on.
|
|
21
|
+
* `paletteIndex` is the ANSI entry the color came from, when known.
|
|
22
|
+
*/
|
|
23
|
+
ink(color: Rgb, sourceBackground: Rgb, paletteIndex?: number): Rgba;
|
|
24
|
+
}
|
|
25
|
+
export declare function createLightAdaptation(base: Rgb, paperColor: Rgba, inkColor: Rgba): LightAdaptation;
|
|
26
|
+
/** Engage when this share of cells carries an explicit dark background… */
|
|
27
|
+
export declare const ENGAGE_SHARE = 0.6;
|
|
28
|
+
/** …and stay engaged until it drops below this, so scrolling content does not flicker. */
|
|
29
|
+
export declare const RELEASE_SHARE = 0.35;
|
|
30
|
+
/**
|
|
31
|
+
* The surface a dark-painted application uses as its base, or null when the
|
|
32
|
+
* pane should render as-is: adaptation is off, the theme is dark, or too few
|
|
33
|
+
* cells carry an explicit dark background (the app follows the theme).
|
|
34
|
+
*/
|
|
35
|
+
export declare function darkPaintedBase(view: RenderView, engaged: boolean): Rgb | null;
|
|
36
|
+
//# sourceMappingURL=light-adaptation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"light-adaptation.d.ts","sourceRoot":"","sources":["../../src/renderers/light-adaptation.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAyGpD,uGAAuG;AACvG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAGrD;AAKD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAiChF;AAED,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IACnB,0EAA0E;IAC1E,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,eAAe,CAuGlG;AAID,2EAA2E;AAC3E,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,0FAA0F;AAC1F,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,GAAG,GAAG,IAAI,CAmC9E"}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
// Light adaptation: render a dark-painted application (one that fills the
|
|
2
|
+
// screen with its own truecolor backgrounds) as a light design under a light
|
|
3
|
+
// theme. Colors are remapped per style before blending, so glyph coverage,
|
|
4
|
+
// color emoji, and the shader stack are untouched.
|
|
5
|
+
//
|
|
6
|
+
// The rules come from comparing candidate remaps with three applications' own
|
|
7
|
+
// light designs (GrokDay, Codex, OpenCode):
|
|
8
|
+
//
|
|
9
|
+
// surfaces mirror around the paper in Lr (OKLab lightness with Ottosson's
|
|
10
|
+
// toe, which tracks CIE L*): a panel 0.05 above the app's base
|
|
11
|
+
// lands 0.05 below the theme background; the base's tint becomes
|
|
12
|
+
// the paper's. Tinted rows step down until a visible tint fits.
|
|
13
|
+
// neutral ink keeps its Lr distance from its own cell background, mirrored,
|
|
14
|
+
// so primary/secondary/border grays keep their order.
|
|
15
|
+
// accents land in a mid-tone band: APCA Lc = clamp(0.5·|Lc| + 28, 45, 70)
|
|
16
|
+
// against the new background, chroma raised toward 0.12.
|
|
17
|
+
//
|
|
18
|
+
// Theme-owned colors (default fg/bg) are left to the theme, and so are
|
|
19
|
+
// chromatic ANSI colors (palette 1–6, 9–14): the light theme designed them for
|
|
20
|
+
// light paper, so they pass through unless the remapped surface beneath makes
|
|
21
|
+
// them less legible than on the theme background. Neutral ANSI colors (0, 7,
|
|
22
|
+
// 8, 15) carry a role — "bright text", "dim panel" — rather than a hue, so
|
|
23
|
+
// they remap like truecolor.
|
|
24
|
+
const clamp = (value, lo = 0, hi = 1) => Math.min(hi, Math.max(lo, value));
|
|
25
|
+
const toLinear = (v) => (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4);
|
|
26
|
+
const toGamma = (v) => (v <= 0.0031308 ? v * 12.92 : 1.055 * v ** (1 / 2.4) - 0.055);
|
|
27
|
+
function oklab([r8, g8, b8]) {
|
|
28
|
+
const r = toLinear(r8 / 255);
|
|
29
|
+
const g = toLinear(g8 / 255);
|
|
30
|
+
const b = toLinear(b8 / 255);
|
|
31
|
+
const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
|
|
32
|
+
const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
|
|
33
|
+
const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
|
|
34
|
+
return [
|
|
35
|
+
0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,
|
|
36
|
+
1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,
|
|
37
|
+
0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
function oklabToLinear([L, a, b]) {
|
|
41
|
+
const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;
|
|
42
|
+
const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;
|
|
43
|
+
const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;
|
|
44
|
+
return [
|
|
45
|
+
4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
|
|
46
|
+
-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
|
|
47
|
+
-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
const inGamut = (linear) => linear.every((v) => v >= -1e-4 && v <= 1 + 1e-4);
|
|
51
|
+
const fromLch = (L, C, h) => [L, C * Math.cos(h), C * Math.sin(h)];
|
|
52
|
+
const toRgb = (lab) => oklabToLinear(lab).map((v) => Math.round(clamp(toGamma(clamp(v))) * 255));
|
|
53
|
+
/** Keep L and hue; reduce chroma until the color fits sRGB. */
|
|
54
|
+
function gamutMap(L, C, h) {
|
|
55
|
+
L = clamp(L);
|
|
56
|
+
if (inGamut(oklabToLinear(fromLch(L, C, h))))
|
|
57
|
+
return toRgb(fromLch(L, C, h));
|
|
58
|
+
let lo = 0;
|
|
59
|
+
let hi = C;
|
|
60
|
+
for (let i = 0; i < 20; i += 1) {
|
|
61
|
+
const mid = (lo + hi) / 2;
|
|
62
|
+
if (inGamut(oklabToLinear(fromLch(L, mid, h))))
|
|
63
|
+
lo = mid;
|
|
64
|
+
else
|
|
65
|
+
hi = mid;
|
|
66
|
+
}
|
|
67
|
+
return toRgb(fromLch(L, lo, h));
|
|
68
|
+
}
|
|
69
|
+
function maxChroma(L, h) {
|
|
70
|
+
let lo = 0;
|
|
71
|
+
let hi = 0.4;
|
|
72
|
+
for (let i = 0; i < 16; i += 1) {
|
|
73
|
+
const mid = (lo + hi) / 2;
|
|
74
|
+
if (inGamut(oklabToLinear(fromLch(L, mid, h))))
|
|
75
|
+
lo = mid;
|
|
76
|
+
else
|
|
77
|
+
hi = mid;
|
|
78
|
+
}
|
|
79
|
+
return lo;
|
|
80
|
+
}
|
|
81
|
+
const K1 = 0.206;
|
|
82
|
+
const K2 = 0.03;
|
|
83
|
+
const K3 = (1 + K1) / (1 + K2);
|
|
84
|
+
const toe = (L) => 0.5 * (K3 * L - K1 + Math.sqrt((K3 * L - K1) ** 2 + 4 * K2 * K3 * L));
|
|
85
|
+
const toeInv = (Lr) => (Lr * Lr + K1 * Lr) / (K3 * (Lr + K2));
|
|
86
|
+
// APCA 0.0.98G-4g. Positive Lc = dark text on a light background.
|
|
87
|
+
function apcaY([r, g, b]) {
|
|
88
|
+
const y = 0.2126729 * (r / 255) ** 2.4 + 0.7151522 * (g / 255) ** 2.4 + 0.072175 * (b / 255) ** 2.4;
|
|
89
|
+
return y < 0.022 ? y + (0.022 - y) ** 1.414 : y;
|
|
90
|
+
}
|
|
91
|
+
function apca(text, background) {
|
|
92
|
+
const yt = apcaY(text);
|
|
93
|
+
const yb = apcaY(background);
|
|
94
|
+
if (Math.abs(yb - yt) < 0.0005)
|
|
95
|
+
return 0;
|
|
96
|
+
if (yb > yt) {
|
|
97
|
+
const sapc = (yb ** 0.56 - yt ** 0.57) * 1.14;
|
|
98
|
+
return sapc < 0.1 ? 0 : (sapc - 0.027) * 100;
|
|
99
|
+
}
|
|
100
|
+
const sapc = (yb ** 0.65 - yt ** 0.62) * 1.14;
|
|
101
|
+
return sapc > -0.1 ? 0 : (sapc + 0.027) * 100;
|
|
102
|
+
}
|
|
103
|
+
const smoothstep = (e0, e1, x) => {
|
|
104
|
+
const t = clamp((x - e0) / (e1 - e0));
|
|
105
|
+
return t * t * (3 - 2 * t);
|
|
106
|
+
};
|
|
107
|
+
const toRgba = ([r, g, b]) => [r / 255, g / 255, b / 255, 1];
|
|
108
|
+
const fromRgba = (color) => [
|
|
109
|
+
Math.round(clamp(color[0]) * 255),
|
|
110
|
+
Math.round(clamp(color[1]) * 255),
|
|
111
|
+
Math.round(clamp(color[2]) * 255),
|
|
112
|
+
];
|
|
113
|
+
const keyOf = ([r, g, b]) => (r << 16) | (g << 8) | b;
|
|
114
|
+
const luminance = ([r, g, b]) => 0.2126 * toLinear(r / 255) + 0.7152 * toLinear(g / 255) + 0.0722 * toLinear(b / 255);
|
|
115
|
+
const contrastRatio = (a, b) => {
|
|
116
|
+
const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x);
|
|
117
|
+
return (hi + 0.05) / (lo + 0.05);
|
|
118
|
+
};
|
|
119
|
+
/** Light when dark text out-contrasts light text: WCAG luminance above ~0.179. Matches the VT shim. */
|
|
120
|
+
export function isLightBackground(color) {
|
|
121
|
+
const y = luminance(color);
|
|
122
|
+
return (y + 0.05) / 0.05 > 1.05 / (y + 0.05);
|
|
123
|
+
}
|
|
124
|
+
/** null: the text already meets the ratio. */
|
|
125
|
+
const contrasted = new Map();
|
|
126
|
+
/**
|
|
127
|
+
* Ghostty's `minimum-contrast`: text below the WCAG ratio against its
|
|
128
|
+
* background moves toward whichever of black or white contrasts more. Ghostty
|
|
129
|
+
* snaps straight to that extreme; this keeps hue and chroma and moves OKLab
|
|
130
|
+
* lightness only as far as the ratio needs, reaching black or white only when
|
|
131
|
+
* nothing less suffices.
|
|
132
|
+
*/
|
|
133
|
+
export function ensureContrast(text, background, ratio) {
|
|
134
|
+
if (!(ratio > 1))
|
|
135
|
+
return text;
|
|
136
|
+
const fg = fromRgba(text);
|
|
137
|
+
const bg = fromRgba(background);
|
|
138
|
+
const cacheKey = `${keyOf(fg)}/${keyOf(bg)}/${ratio}`;
|
|
139
|
+
let result = contrasted.get(cacheKey);
|
|
140
|
+
if (result === undefined) {
|
|
141
|
+
if (contrastRatio(fg, bg) >= ratio)
|
|
142
|
+
result = null;
|
|
143
|
+
else {
|
|
144
|
+
const towardWhite = contrastRatio([255, 255, 255], bg) > contrastRatio([0, 0, 0], bg);
|
|
145
|
+
const [L, a, b] = oklab(fg);
|
|
146
|
+
const C = Math.hypot(a, b);
|
|
147
|
+
const h = Math.atan2(b, a);
|
|
148
|
+
let near = L;
|
|
149
|
+
let far = towardWhite ? 1 : 0;
|
|
150
|
+
let best = towardWhite ? [255, 255, 255] : [0, 0, 0];
|
|
151
|
+
if (contrastRatio(best, bg) >= ratio) {
|
|
152
|
+
for (let i = 0; i < 20; i += 1) {
|
|
153
|
+
const mid = (near + far) / 2;
|
|
154
|
+
const candidate = gamutMap(mid, C, h);
|
|
155
|
+
if (contrastRatio(candidate, bg) >= ratio) {
|
|
156
|
+
far = mid;
|
|
157
|
+
best = candidate;
|
|
158
|
+
}
|
|
159
|
+
else
|
|
160
|
+
near = mid;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
result = best;
|
|
164
|
+
}
|
|
165
|
+
if (contrasted.size > 4096)
|
|
166
|
+
contrasted.clear();
|
|
167
|
+
contrasted.set(cacheKey, result);
|
|
168
|
+
}
|
|
169
|
+
if (result === null)
|
|
170
|
+
return text;
|
|
171
|
+
return [result[0] / 255, result[1] / 255, result[2] / 255, text[3]];
|
|
172
|
+
}
|
|
173
|
+
export function createLightAdaptation(base, paperColor, inkColor) {
|
|
174
|
+
const paper = fromRgba(paperColor);
|
|
175
|
+
const inkRgb = fromRgba(inkColor);
|
|
176
|
+
const baseLab = oklab(base);
|
|
177
|
+
const paperLab = oklab(paper);
|
|
178
|
+
const inkLab = oklab(inkRgb);
|
|
179
|
+
const baseLr = toe(baseLab[0]);
|
|
180
|
+
const paperLr = toe(paperLab[0]);
|
|
181
|
+
const surfaces = new Map();
|
|
182
|
+
const surfaceRgb = (color) => {
|
|
183
|
+
const cached = surfaces.get(keyOf(color));
|
|
184
|
+
if (cached)
|
|
185
|
+
return cached;
|
|
186
|
+
const [L, a, b] = oklab(color);
|
|
187
|
+
let Lr = clamp(paperLr - (toe(L) - baseLr));
|
|
188
|
+
const ap = a - baseLab[1] + paperLab[1];
|
|
189
|
+
const bp = b - baseLab[2] + paperLab[2];
|
|
190
|
+
const C = Math.hypot(ap, bp);
|
|
191
|
+
const h = Math.atan2(bp, ap);
|
|
192
|
+
if (C > 0.015) {
|
|
193
|
+
const want = Math.min(C, 0.045);
|
|
194
|
+
const stop = Lr - 0.15;
|
|
195
|
+
while (Lr > stop && maxChroma(toeInv(Lr), h) < want)
|
|
196
|
+
Lr -= 0.005;
|
|
197
|
+
}
|
|
198
|
+
const result = gamutMap(toeInv(Lr), C, h);
|
|
199
|
+
surfaces.set(keyOf(color), result);
|
|
200
|
+
return result;
|
|
201
|
+
};
|
|
202
|
+
const solveLc = (want, C, h, background) => {
|
|
203
|
+
const backgroundL = oklab(background)[0];
|
|
204
|
+
let lo = want > 0 ? 0 : backgroundL;
|
|
205
|
+
let hi = want > 0 ? backgroundL : 1;
|
|
206
|
+
let best = gamutMap(want > 0 ? 0 : 1, C, h);
|
|
207
|
+
for (let i = 0; i < 18; i += 1) {
|
|
208
|
+
const mid = (lo + hi) / 2;
|
|
209
|
+
const candidate = gamutMap(mid, C, h);
|
|
210
|
+
const lc = apca(candidate, background);
|
|
211
|
+
const enough = want > 0 ? lc >= want : lc <= want;
|
|
212
|
+
if (enough)
|
|
213
|
+
best = candidate;
|
|
214
|
+
if (want > 0 === enough)
|
|
215
|
+
lo = mid;
|
|
216
|
+
else
|
|
217
|
+
hi = mid;
|
|
218
|
+
}
|
|
219
|
+
return best;
|
|
220
|
+
};
|
|
221
|
+
const inks = new Map();
|
|
222
|
+
const ink = (color, sourceBackground, paletteIndex) => {
|
|
223
|
+
const themeColor = paletteIndex !== undefined && CHROMATIC_ANSI.has(paletteIndex);
|
|
224
|
+
const cacheKey = `${keyOf(color)}/${keyOf(sourceBackground)}${themeColor ? "/p" : ""}`;
|
|
225
|
+
const cached = inks.get(cacheKey);
|
|
226
|
+
if (cached)
|
|
227
|
+
return cached;
|
|
228
|
+
const mapped = surfaceRgb(sourceBackground);
|
|
229
|
+
if (themeColor) {
|
|
230
|
+
const legibility = Math.min(45, Math.abs(apca(color, paper)));
|
|
231
|
+
if (Math.abs(apca(color, mapped)) >= legibility) {
|
|
232
|
+
const rgba = toRgba(color);
|
|
233
|
+
inks.set(cacheKey, rgba);
|
|
234
|
+
return rgba;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const [L, a0, b0] = oklab(color);
|
|
238
|
+
const C0 = Math.hypot(a0, b0);
|
|
239
|
+
// Neutral ink: mirror its Lr distance from the background, and lean
|
|
240
|
+
// toward the theme ink's tint so app grays sit in the chosen theme.
|
|
241
|
+
let a = a0;
|
|
242
|
+
let b = b0;
|
|
243
|
+
if (C0 < 0.03) {
|
|
244
|
+
const w = (1 - C0 / 0.03) * 0.7;
|
|
245
|
+
a = a0 * (1 - w) + inkLab[1] * w;
|
|
246
|
+
b = b0 * (1 - w) + inkLab[2] * w;
|
|
247
|
+
}
|
|
248
|
+
const C = Math.hypot(a, b);
|
|
249
|
+
const h = Math.atan2(b, a);
|
|
250
|
+
const delta = toe(L) - toe(oklab(sourceBackground)[0]);
|
|
251
|
+
const sign = delta >= 0 ? -1 : 1;
|
|
252
|
+
const Lr = clamp(toe(oklab(mapped)[0]) + sign * Math.max(Math.abs(delta), 0.06));
|
|
253
|
+
let result = gamutMap(toeInv(Lr), C, h);
|
|
254
|
+
const w = smoothstep(0.03, 0.08, C0);
|
|
255
|
+
if (w > 0) {
|
|
256
|
+
const source = apca(color, sourceBackground);
|
|
257
|
+
const lightOnDark = source < 0 || (source === 0 && delta >= 0);
|
|
258
|
+
const magnitude = clamp(Math.abs(source) * 0.5 + 28, 45, 70);
|
|
259
|
+
const boosted = C0 + w * clamp(0.12 - C0, 0, C0 * 0.8);
|
|
260
|
+
const accent = solveLc(lightOnDark ? magnitude : -magnitude, boosted, Math.atan2(b0, a0), mapped);
|
|
261
|
+
if (w >= 1)
|
|
262
|
+
result = accent;
|
|
263
|
+
else {
|
|
264
|
+
const p = oklab(result);
|
|
265
|
+
const q = oklab(accent);
|
|
266
|
+
result = toRgb([p[0] * (1 - w) + q[0] * w, p[1] * (1 - w) + q[1] * w, p[2] * (1 - w) + q[2] * w]);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const rgba = toRgba(result);
|
|
270
|
+
inks.set(cacheKey, rgba);
|
|
271
|
+
return rgba;
|
|
272
|
+
};
|
|
273
|
+
return {
|
|
274
|
+
key: [base, paper, inkRgb].map((color) => keyOf(color).toString(16)).join("/"),
|
|
275
|
+
base,
|
|
276
|
+
surface: (color) => toRgba(surfaceRgb(color)),
|
|
277
|
+
ink,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
const CHROMATIC_ANSI = new Set([1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14]);
|
|
281
|
+
/** Engage when this share of cells carries an explicit dark background… */
|
|
282
|
+
export const ENGAGE_SHARE = 0.6;
|
|
283
|
+
/** …and stay engaged until it drops below this, so scrolling content does not flicker. */
|
|
284
|
+
export const RELEASE_SHARE = 0.35;
|
|
285
|
+
/**
|
|
286
|
+
* The surface a dark-painted application uses as its base, or null when the
|
|
287
|
+
* pane should render as-is: adaptation is off, the theme is dark, or too few
|
|
288
|
+
* cells carry an explicit dark background (the app follows the theme).
|
|
289
|
+
*/
|
|
290
|
+
export function darkPaintedBase(view, engaged) {
|
|
291
|
+
if ((view.theme.lightAdaptation ?? "off") === "off")
|
|
292
|
+
return null;
|
|
293
|
+
if (!isLightBackground(fromRgba(view.theme.background)))
|
|
294
|
+
return null;
|
|
295
|
+
const rows = Math.max(view.rows.length, view.nativeStyleRows.length);
|
|
296
|
+
const total = rows * view.cols;
|
|
297
|
+
if (total === 0)
|
|
298
|
+
return null;
|
|
299
|
+
const areas = new Map();
|
|
300
|
+
let dark = 0;
|
|
301
|
+
const darkness = new Map();
|
|
302
|
+
for (const runs of view.nativeStyleRows) {
|
|
303
|
+
for (const run of runs) {
|
|
304
|
+
const style = view.styleDefinitions.get(run.styleId);
|
|
305
|
+
const background = style?.inverse ? style.foreground : style?.background;
|
|
306
|
+
if (!background)
|
|
307
|
+
continue;
|
|
308
|
+
const key = keyOf(background);
|
|
309
|
+
let isDark = darkness.get(key);
|
|
310
|
+
if (isDark === undefined) {
|
|
311
|
+
isDark = !isLightBackground(background);
|
|
312
|
+
darkness.set(key, isDark);
|
|
313
|
+
}
|
|
314
|
+
if (!isDark)
|
|
315
|
+
continue;
|
|
316
|
+
dark += run.cellSpan;
|
|
317
|
+
areas.set(key, (areas.get(key) ?? 0) + run.cellSpan);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (dark / total < (engaged ? RELEASE_SHARE : ENGAGE_SHARE))
|
|
321
|
+
return null;
|
|
322
|
+
let bestKey = 0;
|
|
323
|
+
let bestArea = -1;
|
|
324
|
+
for (const [key, area] of areas) {
|
|
325
|
+
if (area > bestArea) {
|
|
326
|
+
bestKey = key;
|
|
327
|
+
bestArea = area;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return [(bestKey >> 16) & 0xff, (bestKey >> 8) & 0xff, bestKey & 0xff];
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=light-adaptation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"light-adaptation.js","sourceRoot":"","sources":["../../src/renderers/light-adaptation.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,18 @@ export interface TerminalTheme {
|
|
|
10
10
|
selectionForeground: Rgba;
|
|
11
11
|
/** Apply the window background alpha to explicit cell backgrounds too. */
|
|
12
12
|
backgroundOpacityCells?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Under a light theme, remap panes that an application paints dark with its
|
|
15
|
+
* own backgrounds (Grok, fixed-theme TUIs) into a light design. "auto"
|
|
16
|
+
* engages per pane only when most cells carry an explicit dark background.
|
|
17
|
+
*/
|
|
18
|
+
lightAdaptation?: "auto" | "off";
|
|
19
|
+
/**
|
|
20
|
+
* Ghostty `minimum-contrast`: the WCAG ratio text keeps against its cell
|
|
21
|
+
* background (1–21; 1 is off). Box drawing, block elements, and color
|
|
22
|
+
* glyphs are exempt.
|
|
23
|
+
*/
|
|
24
|
+
minimumContrast?: number;
|
|
13
25
|
}
|
|
14
26
|
export type TerminalPostProcess = "none" | "better-crt";
|
|
15
27
|
export type TerminalShaderEffect = "ghosttea:better-crt" | "ghosttea:crt" | "ghosttea:vhs" | "ghosttea:sparks-from-fire";
|
|
@@ -28,6 +40,8 @@ export interface CellSelection {
|
|
|
28
40
|
focus: CellPoint;
|
|
29
41
|
}
|
|
30
42
|
export interface RenderView {
|
|
43
|
+
/** Columns in the committed terminal frame, independent of the canvas size. */
|
|
44
|
+
cols: number;
|
|
31
45
|
rows: string[];
|
|
32
46
|
nativeRows: GlyphInstance[][];
|
|
33
47
|
nativeStyleRows: StyleRun[][];
|
|
@@ -48,6 +62,8 @@ export interface RenderDamage {
|
|
|
48
62
|
full: boolean;
|
|
49
63
|
rows: ReadonlySet<number>;
|
|
50
64
|
geometryChanged: boolean;
|
|
65
|
+
/** Positive moves old rows upward. Accumulated since the last submitted scene. */
|
|
66
|
+
scrollRows?: number;
|
|
51
67
|
}
|
|
52
68
|
export declare function effectiveCursorStyle(view: RenderView): CursorStyle | null;
|
|
53
69
|
export interface PixelSize {
|
|
@@ -56,6 +72,11 @@ export interface PixelSize {
|
|
|
56
72
|
dpr: number;
|
|
57
73
|
}
|
|
58
74
|
export declare function renderedSizeChanged(current: PixelSize, next: PixelSize): boolean;
|
|
75
|
+
export interface RenderSubmission {
|
|
76
|
+
queueSubmits: number;
|
|
77
|
+
/** Submitted surfaces, including effects-only presentations. Not display timestamps. */
|
|
78
|
+
surfaceIds: readonly string[];
|
|
79
|
+
}
|
|
59
80
|
export interface TerminalRenderer {
|
|
60
81
|
readonly kind: "webgpu" | "canvas2d";
|
|
61
82
|
mount(id: string, canvas: OffscreenCanvas): void;
|
|
@@ -67,6 +88,8 @@ export interface TerminalRenderer {
|
|
|
67
88
|
view: RenderView;
|
|
68
89
|
}>): Array<TerminalRenderMetrics | undefined>;
|
|
69
90
|
setPerformanceMeasurementEnabled?(enabled: boolean): void;
|
|
91
|
+
/** Cheap accounting for the most recent render/renderBatch, independent of profiling. */
|
|
92
|
+
submission?(): RenderSubmission;
|
|
70
93
|
settle?(): Promise<void>;
|
|
71
94
|
}
|
|
72
95
|
export declare const DEFAULT_THEME: TerminalTheme;
|