@oharness/server 0.10.0 → 0.11.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/dist/analytics.d.ts +32 -29
- package/dist/analytics.js +225 -278
- package/dist/analytics.js.map +1 -1
- package/dist/i18n.js +152 -8
- package/dist/i18n.js.map +1 -1
- package/dist/icons.js +1 -0
- package/dist/icons.js.map +1 -1
- package/dist/model-order.js +1 -0
- package/dist/model-order.js.map +1 -1
- package/dist/page/client/account.js +140 -4
- package/dist/page/client/account.js.map +1 -1
- package/dist/page/client/base.js +40 -16
- package/dist/page/client/base.js.map +1 -1
- package/dist/page/client/browser.js +1 -1
- package/dist/page/client/composer.js +111 -7
- package/dist/page/client/composer.js.map +1 -1
- package/dist/page/client/dialogs.js +75 -0
- package/dist/page/client/dialogs.js.map +1 -1
- package/dist/page/client/events.js +25 -2
- package/dist/page/client/events.js.map +1 -1
- package/dist/page/client/index.js +4 -0
- package/dist/page/client/index.js.map +1 -1
- package/dist/page/client/panels.js +4 -4
- package/dist/page/client/ripple.d.ts +13 -0
- package/dist/page/client/ripple.js +247 -0
- package/dist/page/client/ripple.js.map +1 -0
- package/dist/page/client/routines.js +173 -41
- package/dist/page/client/routines.js.map +1 -1
- package/dist/page/client/shell.js +200 -54
- package/dist/page/client/shell.js.map +1 -1
- package/dist/page/client/state.js +7 -2
- package/dist/page/client/state.js.map +1 -1
- package/dist/page/client/terminal.js +34 -7
- package/dist/page/client/terminal.js.map +1 -1
- package/dist/page/client/theme.d.ts +17 -0
- package/dist/page/client/theme.js +365 -0
- package/dist/page/client/theme.js.map +1 -0
- package/dist/page/client/transcript.js +63 -7
- package/dist/page/client/transcript.js.map +1 -1
- package/dist/page/style.js +183 -22
- package/dist/page/style.js.map +1 -1
- package/dist/page.js +4 -5
- package/dist/page.js.map +1 -1
- package/dist/prefs.d.ts +17 -0
- package/dist/prefs.js +5 -0
- package/dist/prefs.js.map +1 -1
- package/dist/server.js +465 -42
- package/dist/server.js.map +1 -1
- package/dist/suggest.d.ts +42 -0
- package/dist/suggest.js +215 -0
- package/dist/suggest.js.map +1 -0
- package/dist/terminal.d.ts +28 -2
- package/dist/terminal.js +45 -3
- package/dist/terminal.js.map +1 -1
- package/dist/theme-assets.d.ts +39 -0
- package/dist/theme-assets.js +109 -0
- package/dist/theme-assets.js.map +1 -0
- package/dist/theme-store.d.ts +50 -0
- package/dist/theme-store.js +124 -0
- package/dist/theme-store.js.map +1 -0
- package/dist/theme-tools.d.ts +25 -0
- package/dist/theme-tools.js +243 -0
- package/dist/theme-tools.js.map +1 -0
- package/dist/turn-shots.d.ts +18 -2
- package/dist/turn-shots.js +10 -1
- package/dist/turn-shots.js.map +1 -1
- package/dist/user-theme.d.ts +143 -0
- package/dist/user-theme.js +510 -0
- package/dist/user-theme.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { DARK, LIGHT } from "./theme.js";
|
|
2
|
+
/** A stored image: the sha-256 of its bytes and its type. See theme-assets.ts. */
|
|
3
|
+
export const ASSET_ID = /^[0-9a-f]{64}\.(png|jpg|webp)$/;
|
|
4
|
+
export const FITS = ["cover", "contain", "tile"];
|
|
5
|
+
export const ANCHORS = [
|
|
6
|
+
"top-left", "top", "top-right", "left", "center", "right", "bottom-left", "bottom", "bottom-right",
|
|
7
|
+
];
|
|
8
|
+
export const BLENDS = ["normal", "multiply", "screen", "luminosity", "soft-light"];
|
|
9
|
+
/** The slots, as the model is told about them in `get_theme_schema`. */
|
|
10
|
+
export const IMAGE_SLOTS = {
|
|
11
|
+
conversation: "Background of the conversation area, behind the messages. Options: fit (cover | contain | tile, default cover), anchor (top-left … center … bottom-right, default center), scrim (0.5–0.95, default 0.8: how much of the page colour covers the image; raised automatically if text would be hard to read), blend (normal | multiply | screen | luminosity | soft-light), dark ({ image?, scrim? } for the dark side). Best: a calm, low-detail landscape image around 2560×1600.",
|
|
12
|
+
empty: "Art above the title of a new, empty session. Options: size (small | medium | large), align (left | center). Best: a transparent PNG, square or a little wider than tall.",
|
|
13
|
+
avatar: "The assistant's avatar beside each reply, shown at 20px. Options: shape (circle | rounded | square). Best: a square image with a simple, bold subject.",
|
|
14
|
+
};
|
|
15
|
+
/** The four colours the rest of a palette is derived from. */
|
|
16
|
+
export const SEEDS = ["bg", "fg", "accent", "brand"];
|
|
17
|
+
/**
|
|
18
|
+
* Every token a theme may set, with what it is for. The meanings are what the
|
|
19
|
+
* model reads in `get_theme_schema`, so they say where the colour shows rather
|
|
20
|
+
* than restating its name.
|
|
21
|
+
*/
|
|
22
|
+
export const TOKENS = {
|
|
23
|
+
bg: "Page background behind the conversation. Seed.",
|
|
24
|
+
fg: "Body text. Seed.",
|
|
25
|
+
accent: "Primary buttons and committing actions; their text is drawn in bg. Seed.",
|
|
26
|
+
brand: "The harness being alive: thinking sweep, a call in flight, the caret, a switch that is on. Marks, not words. Seed.",
|
|
27
|
+
panel: "Raised surfaces: cards, menus, code blocks.",
|
|
28
|
+
frame: "The window frame: top bar and rail, set back behind both page and panel.",
|
|
29
|
+
dim: "Secondary text: labels, timestamps, hints.",
|
|
30
|
+
line: "Hairline borders. Usually fg at low alpha.",
|
|
31
|
+
"brand-tint": "Soft fill behind brand-coloured marks. Usually brand at low alpha.",
|
|
32
|
+
"brand-ink": "Brand-coloured words, such as the thinking label.",
|
|
33
|
+
"brand-shine": "The band that sweeps across the thinking label.",
|
|
34
|
+
ok: "Success text and marks.",
|
|
35
|
+
warn: "Warning text and marks.",
|
|
36
|
+
err: "Error text and marks.",
|
|
37
|
+
add: "Added lines in a diff.",
|
|
38
|
+
"add-bg": "Background of added lines.",
|
|
39
|
+
del: "Removed lines in a diff.",
|
|
40
|
+
"del-bg": "Background of removed lines.",
|
|
41
|
+
hover: "Row and button hover wash. Usually fg at very low alpha.",
|
|
42
|
+
sel: "Selected row wash. Usually fg at low alpha.",
|
|
43
|
+
focus: "Focus outline.",
|
|
44
|
+
ring: "Soft focus ring around fields.",
|
|
45
|
+
field: "Input field fill.",
|
|
46
|
+
"field-focus": "Input field fill while focused.",
|
|
47
|
+
track: "Scrollbar and slider tracks.",
|
|
48
|
+
kw: "Syntax: keywords.",
|
|
49
|
+
str: "Syntax: strings.",
|
|
50
|
+
com: "Syntax: comments.",
|
|
51
|
+
num: "Syntax: numbers.",
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Pairs that carry text or marks, and the ratio each needs. The first token is
|
|
55
|
+
* the one moved when a pair fails: the colour drawn on top, never the surface
|
|
56
|
+
* under it, because a surface is shared by many pairs and text is not.
|
|
57
|
+
*/
|
|
58
|
+
const PAIRS = [
|
|
59
|
+
["fg", "bg", 4.5],
|
|
60
|
+
["fg", "panel", 4.5],
|
|
61
|
+
["fg", "frame", 4.5],
|
|
62
|
+
["dim", "bg", 4.5],
|
|
63
|
+
["dim", "panel", 4.5],
|
|
64
|
+
["dim", "frame", 4.5],
|
|
65
|
+
["accent", "bg", 4.5],
|
|
66
|
+
["brand-ink", "bg", 4.5],
|
|
67
|
+
["brand", "bg", 3],
|
|
68
|
+
["focus", "bg", 3],
|
|
69
|
+
["ok", "bg", 4.5],
|
|
70
|
+
["warn", "bg", 4.5],
|
|
71
|
+
["err", "bg", 4.5],
|
|
72
|
+
["add", "add-bg", 4.5],
|
|
73
|
+
["del", "del-bg", 4.5],
|
|
74
|
+
["kw", "panel", 4.5],
|
|
75
|
+
["str", "panel", 4.5],
|
|
76
|
+
["num", "panel", 4.5],
|
|
77
|
+
["com", "panel", 3],
|
|
78
|
+
];
|
|
79
|
+
const MAX_NAME = 60;
|
|
80
|
+
/** `#rgb`, `#rgba`, `#rrggbb` or `#rrggbbaa`; anything else is not a colour here. */
|
|
81
|
+
export function parseHex(value) {
|
|
82
|
+
const match = /^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(value.trim());
|
|
83
|
+
if (!match)
|
|
84
|
+
return undefined;
|
|
85
|
+
let hex = match[1];
|
|
86
|
+
if (hex.length <= 4)
|
|
87
|
+
hex = [...hex].map((c) => c + c).join("");
|
|
88
|
+
const n = (i) => parseInt(hex.slice(i, i + 2), 16);
|
|
89
|
+
return { r: n(0), g: n(2), b: n(4), a: hex.length === 8 ? n(6) / 255 : 1 };
|
|
90
|
+
}
|
|
91
|
+
const byte = (v) => Math.round(Math.min(255, Math.max(0, v))).toString(16).padStart(2, "0");
|
|
92
|
+
export function toHex(c) {
|
|
93
|
+
const base = `#${byte(c.r)}${byte(c.g)}${byte(c.b)}`;
|
|
94
|
+
return c.a >= 1 ? base : base + byte(c.a * 255);
|
|
95
|
+
}
|
|
96
|
+
/** A colour drawn over an opaque one, as the eye sees it. */
|
|
97
|
+
function over(top, under) {
|
|
98
|
+
const a = top.a;
|
|
99
|
+
return { r: top.r * a + under.r * (1 - a), g: top.g * a + under.g * (1 - a), b: top.b * a + under.b * (1 - a), a: 1 };
|
|
100
|
+
}
|
|
101
|
+
const linear = (v) => {
|
|
102
|
+
const s = v / 255;
|
|
103
|
+
return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
|
|
104
|
+
};
|
|
105
|
+
const gamma = (v) => 255 * (v <= 0.0031308 ? v * 12.92 : 1.055 * v ** (1 / 2.4) - 0.055);
|
|
106
|
+
function luminance(c) {
|
|
107
|
+
return 0.2126 * linear(c.r) + 0.7152 * linear(c.g) + 0.0722 * linear(c.b);
|
|
108
|
+
}
|
|
109
|
+
/** WCAG contrast ratio, with a translucent colour composited first. */
|
|
110
|
+
export function contrast(top, under) {
|
|
111
|
+
const a = luminance(over(top, under));
|
|
112
|
+
const b = luminance(under);
|
|
113
|
+
return (Math.max(a, b) + 0.05) / (Math.min(a, b) + 0.05);
|
|
114
|
+
}
|
|
115
|
+
function toOklch(c) {
|
|
116
|
+
const r = linear(c.r), g = linear(c.g), b = linear(c.b);
|
|
117
|
+
const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
|
|
118
|
+
const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
|
|
119
|
+
const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
|
|
120
|
+
const L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;
|
|
121
|
+
const A = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;
|
|
122
|
+
const B = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;
|
|
123
|
+
return { l: L, c: Math.hypot(A, B), h: Math.atan2(B, A) };
|
|
124
|
+
}
|
|
125
|
+
function fromOklch(o, alpha = 1) {
|
|
126
|
+
const A = o.c * Math.cos(o.h), B = o.c * Math.sin(o.h);
|
|
127
|
+
const l = (o.l + 0.3963377774 * A + 0.2158037573 * B) ** 3;
|
|
128
|
+
const m = (o.l - 0.1055613458 * A - 0.0638541728 * B) ** 3;
|
|
129
|
+
const s = (o.l - 0.0894841775 * A - 1.291485548 * B) ** 3;
|
|
130
|
+
return {
|
|
131
|
+
r: gamma(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),
|
|
132
|
+
g: gamma(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),
|
|
133
|
+
b: gamma(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),
|
|
134
|
+
a: alpha,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function mix(a, b, t) {
|
|
138
|
+
return { r: a.r + (b.r - a.r) * t, g: a.g + (b.g - a.g) * t, b: a.b + (b.b - a.b) * t, a: 1 };
|
|
139
|
+
}
|
|
140
|
+
function withAlpha(c, alpha) {
|
|
141
|
+
return { ...c, a: alpha };
|
|
142
|
+
}
|
|
143
|
+
function shiftLightness(c, delta) {
|
|
144
|
+
const o = toOklch(c);
|
|
145
|
+
return fromOklch({ ...o, l: Math.min(1, Math.max(0, o.l + delta)) }, c.a);
|
|
146
|
+
}
|
|
147
|
+
const isDark = (c) => luminance(c) < 0.18;
|
|
148
|
+
/**
|
|
149
|
+
* The smallest move in OKLCH lightness that lifts `top` to `min` against
|
|
150
|
+
* `under`, keeping its hue and chroma. Lighter over a dark surface, darker over
|
|
151
|
+
* a light one. Returns undefined when even black or white would not do.
|
|
152
|
+
*/
|
|
153
|
+
function nudge(top, under, ratio) {
|
|
154
|
+
// Aimed a little past the ratio: the result is rounded to whole bytes when
|
|
155
|
+
// printed as hex, and that rounding alone can land it just short.
|
|
156
|
+
const min = ratio + 0.05;
|
|
157
|
+
const start = toOklch(over(top, under));
|
|
158
|
+
const up = isDark(under);
|
|
159
|
+
const at = (l) => fromOklch({ ...start, l });
|
|
160
|
+
const end = up ? 1 : 0;
|
|
161
|
+
if (contrast(at(end), under) < min)
|
|
162
|
+
return undefined;
|
|
163
|
+
let near = start.l, far = end;
|
|
164
|
+
for (let i = 0; i < 24; i++) {
|
|
165
|
+
const mid = (near + far) / 2;
|
|
166
|
+
if (contrast(at(mid), under) >= min)
|
|
167
|
+
far = mid;
|
|
168
|
+
else
|
|
169
|
+
near = mid;
|
|
170
|
+
}
|
|
171
|
+
return at(far);
|
|
172
|
+
}
|
|
173
|
+
// --- validation ------------------------------------------------------------
|
|
174
|
+
/**
|
|
175
|
+
* Check what the model sent and turn it into a theme.
|
|
176
|
+
*
|
|
177
|
+
* Lenient where leniency cannot hurt: an unknown key or a bad value is dropped
|
|
178
|
+
* and reported, so one typo does not cost the whole proposal. Strict where it
|
|
179
|
+
* can: nothing that is not a known token with a hex colour reaches the CSS.
|
|
180
|
+
*/
|
|
181
|
+
export function readThemeInput(raw) {
|
|
182
|
+
if (typeof raw !== "object" || raw === null)
|
|
183
|
+
return { ok: false, error: "the theme must be an object" };
|
|
184
|
+
const body = raw;
|
|
185
|
+
const dropped = [];
|
|
186
|
+
const name = typeof body["name"] === "string" ? body["name"].trim().slice(0, MAX_NAME) : "";
|
|
187
|
+
const mode = body["mode"] === "light" || body["mode"] === "dark" ? body["mode"] : "both";
|
|
188
|
+
const readPalette = (key) => {
|
|
189
|
+
const value = body[key];
|
|
190
|
+
if (value === undefined || value === null)
|
|
191
|
+
return undefined;
|
|
192
|
+
if (typeof value !== "object" || Array.isArray(value)) {
|
|
193
|
+
dropped.push(`${key}: not an object of token → colour`);
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
const out = {};
|
|
197
|
+
for (const [token, colour] of Object.entries(value)) {
|
|
198
|
+
if (!(token in TOKENS)) {
|
|
199
|
+
dropped.push(`${key}.${token}: not a theme token`);
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const parsed = typeof colour === "string" ? parseHex(colour) : undefined;
|
|
203
|
+
if (!parsed) {
|
|
204
|
+
dropped.push(`${key}.${token}: ${JSON.stringify(colour)} is not a hex colour`);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (SEEDS.includes(token) && parsed.a < 1) {
|
|
208
|
+
dropped.push(`${key}.${token}: seeds must be opaque`);
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
out[token] = toHex(parsed);
|
|
212
|
+
}
|
|
213
|
+
return Object.keys(out).length ? out : undefined;
|
|
214
|
+
};
|
|
215
|
+
const light = mode === "dark" ? undefined : readPalette("light");
|
|
216
|
+
const dark = mode === "light" ? undefined : readPalette("dark");
|
|
217
|
+
if (mode === "dark" && body["light"])
|
|
218
|
+
dropped.push("light: ignored, the theme is dark-only");
|
|
219
|
+
if (mode === "light" && body["dark"])
|
|
220
|
+
dropped.push("dark: ignored, the theme is light-only");
|
|
221
|
+
const images = readImages(body["images"], dropped);
|
|
222
|
+
if (mode === "light" && !light)
|
|
223
|
+
return { ok: false, error: "a light-only theme needs a light palette" };
|
|
224
|
+
if (mode === "dark" && !dark)
|
|
225
|
+
return { ok: false, error: "a dark-only theme needs a dark palette" };
|
|
226
|
+
if (!light && !dark && !images) {
|
|
227
|
+
return { ok: false, error: "the theme sets nothing: give at least bg and fg in light or dark, or an image" };
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
ok: true,
|
|
231
|
+
input: {
|
|
232
|
+
version: 1, name: name || "Custom", mode,
|
|
233
|
+
...(light ? { light } : {}), ...(dark ? { dark } : {}), ...(images ? { images } : {}),
|
|
234
|
+
},
|
|
235
|
+
dropped,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
const oneOf = (options, value, fallback) => typeof value === "string" && options.includes(value) ? value : fallback;
|
|
239
|
+
const clampNumber = (value, min, max, fallback) => typeof value === "number" && Number.isFinite(value) ? Math.min(max, Math.max(min, value)) : fallback;
|
|
240
|
+
/**
|
|
241
|
+
* Image slots, by asset id only. Turning a file the model names into an asset
|
|
242
|
+
* is the tool's job (theme-tools.ts), done before this runs, so a stored theme
|
|
243
|
+
* can be re-validated later without the file it came from.
|
|
244
|
+
*/
|
|
245
|
+
function readImages(raw, dropped) {
|
|
246
|
+
if (raw === undefined || raw === null)
|
|
247
|
+
return undefined;
|
|
248
|
+
if (typeof raw !== "object" || Array.isArray(raw)) {
|
|
249
|
+
dropped.push("images: not an object of slot → options");
|
|
250
|
+
return undefined;
|
|
251
|
+
}
|
|
252
|
+
const body = raw;
|
|
253
|
+
const out = {};
|
|
254
|
+
const asset = (slot, value) => {
|
|
255
|
+
if (typeof value === "string" && ASSET_ID.test(value))
|
|
256
|
+
return value;
|
|
257
|
+
dropped.push(`images.${slot}: no usable image`);
|
|
258
|
+
return undefined;
|
|
259
|
+
};
|
|
260
|
+
for (const key of Object.keys(body)) {
|
|
261
|
+
if (!(key in IMAGE_SLOTS))
|
|
262
|
+
dropped.push(`images.${key}: not an image slot`);
|
|
263
|
+
}
|
|
264
|
+
const wall = body["conversation"];
|
|
265
|
+
if (wall && typeof wall === "object") {
|
|
266
|
+
const w = wall;
|
|
267
|
+
const id = asset("conversation", w["asset"]);
|
|
268
|
+
if (id) {
|
|
269
|
+
const slot = {
|
|
270
|
+
asset: id,
|
|
271
|
+
fit: oneOf(FITS, w["fit"], "cover"),
|
|
272
|
+
anchor: oneOf(ANCHORS, w["anchor"], "center"),
|
|
273
|
+
scrim: clampNumber(w["scrim"], 0.5, 0.95, 0.8),
|
|
274
|
+
blend: oneOf(BLENDS, w["blend"], "normal"),
|
|
275
|
+
};
|
|
276
|
+
const d = w["dark"];
|
|
277
|
+
if (d && typeof d === "object") {
|
|
278
|
+
const dd = d;
|
|
279
|
+
const darkAsset = dd["asset"] === undefined ? undefined : asset("conversation.dark", dd["asset"]);
|
|
280
|
+
const darkScrim = dd["scrim"] === undefined ? undefined : clampNumber(dd["scrim"], 0.5, 0.95, slot.scrim);
|
|
281
|
+
if (darkAsset || darkScrim !== undefined) {
|
|
282
|
+
slot.dark = { ...(darkAsset ? { asset: darkAsset } : {}), ...(darkScrim !== undefined ? { scrim: darkScrim } : {}) };
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
out.conversation = slot;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const empty = body["empty"];
|
|
289
|
+
if (empty && typeof empty === "object") {
|
|
290
|
+
const e = empty;
|
|
291
|
+
const id = asset("empty", e["asset"]);
|
|
292
|
+
if (id) {
|
|
293
|
+
out.empty = {
|
|
294
|
+
asset: id,
|
|
295
|
+
size: oneOf(["small", "medium", "large"], e["size"], "medium"),
|
|
296
|
+
align: oneOf(["left", "center"], e["align"], "left"),
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const avatar = body["avatar"];
|
|
301
|
+
if (avatar && typeof avatar === "object") {
|
|
302
|
+
const a = avatar;
|
|
303
|
+
const id = asset("avatar", a["asset"]);
|
|
304
|
+
if (id)
|
|
305
|
+
out.avatar = { asset: id, shape: oneOf(["circle", "rounded", "square"], a["shape"], "circle") };
|
|
306
|
+
}
|
|
307
|
+
return Object.keys(out).length ? out : undefined;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* A whole palette from what the theme set. Seeds the theme left out come from
|
|
311
|
+
* the built-in palette of the same lightness, so a theme that only gives bg
|
|
312
|
+
* and fg still has a sensible accent.
|
|
313
|
+
*/
|
|
314
|
+
function derive(given, side, report) {
|
|
315
|
+
const builtin = side === "light" ? LIGHT : DARK;
|
|
316
|
+
const pick = (token) => parseHex(given[token] ?? builtin[token]);
|
|
317
|
+
const bg = pick("bg");
|
|
318
|
+
// The base for the tokens nobody derives: whichever built-in palette this
|
|
319
|
+
// background resembles, not the side it was filed under.
|
|
320
|
+
const base = isDark(bg) ? DARK : LIGHT;
|
|
321
|
+
const dark = isDark(bg);
|
|
322
|
+
if (dark !== (side === "dark")) {
|
|
323
|
+
report.notes.push(`${side}.bg is a ${dark ? "dark" : "light"} colour; the palette was derived as ${dark ? "dark" : "light"}`);
|
|
324
|
+
}
|
|
325
|
+
let fg = pick("fg");
|
|
326
|
+
const fgFixed = nudge(fg, bg, 7);
|
|
327
|
+
if (contrast(fg, bg) < 4.5 && fgFixed) {
|
|
328
|
+
report.fixed.push(`${side}.fg ${toHex(fg)} → ${toHex(fgFixed)} (was ${contrast(fg, bg).toFixed(1)}:1 on bg)`);
|
|
329
|
+
fg = fgFixed;
|
|
330
|
+
}
|
|
331
|
+
const accent = given["accent"] ? pick("accent") : parseHex(base["accent"]);
|
|
332
|
+
const brand = given["brand"] ? pick("brand") : parseHex(base["brand"]);
|
|
333
|
+
const fgA = (alpha) => toHex(withAlpha(fg, alpha / 255));
|
|
334
|
+
const dim = mix(fg, bg, 0.42);
|
|
335
|
+
const palette = {
|
|
336
|
+
...base,
|
|
337
|
+
bg: toHex(bg),
|
|
338
|
+
fg: toHex(fg),
|
|
339
|
+
accent: toHex(accent),
|
|
340
|
+
brand: toHex(brand),
|
|
341
|
+
panel: toHex(mix(bg, fg, dark ? 0.045 : 0.03)),
|
|
342
|
+
frame: toHex(shiftLightness(bg, dark ? -0.035 : -0.055)),
|
|
343
|
+
dim: toHex(dim),
|
|
344
|
+
line: fgA(dark ? 0x14 : 0x10),
|
|
345
|
+
hover: fgA(dark ? 0x0a : 0x08),
|
|
346
|
+
sel: fgA(dark ? 0x1a : 0x12),
|
|
347
|
+
field: fgA(dark ? 0x08 : 0x06),
|
|
348
|
+
"field-focus": fgA(dark ? 0x12 : 0x0d),
|
|
349
|
+
track: fgA(dark ? 0x2e : 0x1f),
|
|
350
|
+
focus: toHex(dark ? dim : accent),
|
|
351
|
+
ring: toHex(withAlpha(dark ? fg : accent, dark ? 0x14 / 255 : 0x1a / 255)),
|
|
352
|
+
"brand-tint": toHex(withAlpha(brand, (dark ? 0x33 : 0x24) / 255)),
|
|
353
|
+
"brand-ink": toHex(brand),
|
|
354
|
+
};
|
|
355
|
+
// Explicit values win over derivation; seeds were already taken above.
|
|
356
|
+
for (const [token, value] of Object.entries(given)) {
|
|
357
|
+
if (!SEEDS.includes(token))
|
|
358
|
+
palette[token] = value;
|
|
359
|
+
}
|
|
360
|
+
return palette;
|
|
361
|
+
}
|
|
362
|
+
/** Hold every text pair to its ratio, moving the colour on top when it fails. */
|
|
363
|
+
function enforce(palette, side, given, report) {
|
|
364
|
+
// One line per colour the model picked, however many pairs moved it: from
|
|
365
|
+
// what it asked for to where it ended up, and the pair that decided it.
|
|
366
|
+
const moves = new Map();
|
|
367
|
+
for (const [top, under, min] of PAIRS) {
|
|
368
|
+
const surface = parseHex(palette[under]);
|
|
369
|
+
// A translucent surface is judged as it is seen: over the page.
|
|
370
|
+
const seen = surface.a < 1 ? over(surface, parseHex(palette["bg"])) : surface;
|
|
371
|
+
const colour = parseHex(palette[top]);
|
|
372
|
+
const ratio = contrast(colour, seen);
|
|
373
|
+
if (ratio >= min)
|
|
374
|
+
continue;
|
|
375
|
+
const moved = nudge(colour, seen, min);
|
|
376
|
+
if (!moved) {
|
|
377
|
+
report.notes.push(`${side}.${top} cannot reach ${min}:1 on ${under}; left at ${ratio.toFixed(1)}:1`);
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
palette[top] = toHex(moved);
|
|
381
|
+
// Derived tokens are adjusted quietly unless the theme chose them; the
|
|
382
|
+
// report is for the colours the model picked.
|
|
383
|
+
if (top in given) {
|
|
384
|
+
const first = moves.get(top);
|
|
385
|
+
moves.set(top, { from: first?.from ?? toHex(colour), why: `${ratio.toFixed(1)}:1 on ${under}, needs ${min}:1` });
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
for (const [token, move] of moves) {
|
|
389
|
+
report.fixed.push(`${side}.${token} ${move.from} → ${palette[token]} (${move.why})`);
|
|
390
|
+
}
|
|
391
|
+
const bg = toOklch(parseHex(palette["bg"])), panel = toOklch(parseHex(palette["panel"]));
|
|
392
|
+
if (Math.abs(bg.l - panel.l) < 0.012)
|
|
393
|
+
report.notes.push(`${side}.panel is barely distinguishable from bg`);
|
|
394
|
+
}
|
|
395
|
+
/** Validate, derive and check: everything between the model's JSON and the CSS. */
|
|
396
|
+
export function resolveTheme(raw) {
|
|
397
|
+
const read = readThemeInput(raw);
|
|
398
|
+
if (!read.ok)
|
|
399
|
+
return read;
|
|
400
|
+
const report = { dropped: read.dropped, fixed: [], notes: [] };
|
|
401
|
+
const { input } = read;
|
|
402
|
+
const theme = { input, report };
|
|
403
|
+
for (const side of ["light", "dark"]) {
|
|
404
|
+
const given = input[side];
|
|
405
|
+
if (!given)
|
|
406
|
+
continue;
|
|
407
|
+
if (!given["bg"] || !given["fg"])
|
|
408
|
+
report.notes.push(`${side}: no ${!given["bg"] ? "bg" : "fg"} given, the built-in one was used`);
|
|
409
|
+
const palette = derive(given, side, report);
|
|
410
|
+
enforce(palette, side, given, report);
|
|
411
|
+
theme[side] = palette;
|
|
412
|
+
}
|
|
413
|
+
if (input.mode === "both" && (theme.light ? !theme.dark : theme.dark)) {
|
|
414
|
+
report.notes.push(`only the ${theme.light ? "light" : "dark"} side was set; the other keeps the built-in palette`);
|
|
415
|
+
}
|
|
416
|
+
return { ok: true, theme };
|
|
417
|
+
}
|
|
418
|
+
// --- css -------------------------------------------------------------------
|
|
419
|
+
const vars = (palette) => Object.keys(TOKENS)
|
|
420
|
+
.filter((token) => palette[token] !== undefined)
|
|
421
|
+
.map((token) => `--${token}:${palette[token]};`)
|
|
422
|
+
.join(" ");
|
|
423
|
+
/**
|
|
424
|
+
* The stylesheet, printed after the built-in one with the same selectors so it
|
|
425
|
+
* wins on order alone. A one-sided theme pins `color-scheme` and prints its
|
|
426
|
+
* palette under every selector, so the system setting and the light/dark
|
|
427
|
+
* switch cannot bring the other side back.
|
|
428
|
+
*/
|
|
429
|
+
export function themeCss(theme) {
|
|
430
|
+
const light = theme.light, dark = theme.dark, images = theme.input.images;
|
|
431
|
+
if (theme.input.mode !== "both") {
|
|
432
|
+
const side = theme.input.mode;
|
|
433
|
+
const palette = (side === "light" ? light : dark);
|
|
434
|
+
const body = `color-scheme:${side}; ${vars(palette)} ${imageVars(images, side)}`;
|
|
435
|
+
return (`:root{${body}}\n` +
|
|
436
|
+
`@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){${body}}}\n` +
|
|
437
|
+
`:root[data-theme="dark"],:root[data-theme="light"]{${body}}\n`);
|
|
438
|
+
}
|
|
439
|
+
const lightBody = `${light ? vars(light) : ""} ${imageVars(images, "light")}`.trim();
|
|
440
|
+
const darkBody = `${dark ? vars(dark) : ""} ${imageVars(images, "dark")}`.trim();
|
|
441
|
+
let css = "";
|
|
442
|
+
if (lightBody)
|
|
443
|
+
css += `:root{${lightBody}}\n:root[data-theme="light"]{${lightBody}}\n`;
|
|
444
|
+
if (darkBody) {
|
|
445
|
+
css += `@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){${darkBody}}}\n`;
|
|
446
|
+
css += `:root[data-theme="dark"]{${darkBody}}\n`;
|
|
447
|
+
}
|
|
448
|
+
return css;
|
|
449
|
+
}
|
|
450
|
+
/** Where a stored image is served; see `GET /theme-asset/` in server.ts. */
|
|
451
|
+
export const assetUrl = (asset) => `/theme-asset/${asset}`;
|
|
452
|
+
const POSITIONS = {
|
|
453
|
+
"top-left": "left top", top: "center top", "top-right": "right top",
|
|
454
|
+
left: "left center", center: "center center", right: "right center",
|
|
455
|
+
"bottom-left": "left bottom", bottom: "center bottom", "bottom-right": "right bottom",
|
|
456
|
+
};
|
|
457
|
+
/**
|
|
458
|
+
* The image slots as custom properties, read by the rules in style.ts that
|
|
459
|
+
* own them. Every value is printed from an enumerated option, a clamped
|
|
460
|
+
* number or an asset id that matched ASSET_ID — nothing here is passed through
|
|
461
|
+
* from the model.
|
|
462
|
+
*/
|
|
463
|
+
function imageVars(images, side) {
|
|
464
|
+
if (!images)
|
|
465
|
+
return "";
|
|
466
|
+
const out = [];
|
|
467
|
+
const wall = images.conversation;
|
|
468
|
+
if (wall) {
|
|
469
|
+
const asset = side === "dark" && wall.dark?.asset ? wall.dark.asset : wall.asset;
|
|
470
|
+
const scrim = side === "dark" && wall.dark?.scrim !== undefined ? wall.dark.scrim : wall.scrim;
|
|
471
|
+
out.push(`--wall-image:url("${assetUrl(asset)}");`,
|
|
472
|
+
// The colour the blend mixes the image with: the page's own.
|
|
473
|
+
`--wall-base:var(--bg);`, `--wall-size:${wall.fit === "tile" ? "auto" : wall.fit};`, `--wall-repeat:${wall.fit === "tile" ? "repeat" : "no-repeat"};`, `--wall-position:${POSITIONS[wall.anchor]};`, `--wall-scrim:${Math.round(scrim * 100)}%;`, `--wall-blend:normal, ${wall.blend};`);
|
|
474
|
+
}
|
|
475
|
+
const empty = images.empty;
|
|
476
|
+
if (empty) {
|
|
477
|
+
out.push(`--empty-art:url("${assetUrl(empty.asset)}");`, `--empty-art-display:block;`, `--empty-art-height:${{ small: 120, medium: 180, large: 240 }[empty.size]}px;`, `--empty-art-position:${empty.align === "center" ? "center" : "left"} center;`);
|
|
478
|
+
}
|
|
479
|
+
const avatar = images.avatar;
|
|
480
|
+
if (avatar) {
|
|
481
|
+
out.push(`--avatar:url("${assetUrl(avatar.asset)}");`, `--avatar-display:inline-block;`, `--avatar-radius:${{ circle: "999px", rounded: "6px", square: "2px" }[avatar.shape]};`);
|
|
482
|
+
}
|
|
483
|
+
return out.join(" ");
|
|
484
|
+
}
|
|
485
|
+
/** Every asset a theme refers to, for keeping and for cleaning up. */
|
|
486
|
+
export function themeAssets(input) {
|
|
487
|
+
const images = input.images;
|
|
488
|
+
if (!images)
|
|
489
|
+
return [];
|
|
490
|
+
const ids = [images.conversation?.asset, images.conversation?.dark?.asset, images.empty?.asset, images.avatar?.asset];
|
|
491
|
+
return [...new Set(ids.filter((id) => !!id))];
|
|
492
|
+
}
|
|
493
|
+
/** A few colours per side for a card to show before anything is applied. */
|
|
494
|
+
export function swatches(theme) {
|
|
495
|
+
const pick = (p) => (p ? ["bg", "panel", "fg", "dim", "accent", "brand"].map((t) => p[t]) : undefined);
|
|
496
|
+
const light = pick(theme.light), dark = pick(theme.dark);
|
|
497
|
+
return { ...(light ? { light } : {}), ...(dark ? { dark } : {}) };
|
|
498
|
+
}
|
|
499
|
+
/** What the model reads back after `set_theme`. */
|
|
500
|
+
export function describeReport(report) {
|
|
501
|
+
const lines = [];
|
|
502
|
+
if (report.fixed.length)
|
|
503
|
+
lines.push("Adjusted for contrast:", ...report.fixed.map((l) => `- ${l}`));
|
|
504
|
+
if (report.dropped.length)
|
|
505
|
+
lines.push("Dropped:", ...report.dropped.map((l) => `- ${l}`));
|
|
506
|
+
if (report.notes.length)
|
|
507
|
+
lines.push("Notes:", ...report.notes.map((l) => `- ${l}`));
|
|
508
|
+
return lines.length ? lines.join("\n") : "Every value passed as given.";
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=user-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-theme.js","sourceRoot":"","sources":["../src/user-theme.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oharness/server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "The browser frontend's server. Deployable on its own, without a terminal attached.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"build": "rm -rf dist && tsc -p tsconfig.build.json"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@oharness/engine": "0.
|
|
48
|
+
"@oharness/engine": "0.11.0",
|
|
49
49
|
"@xterm/addon-fit": "^0.11.0",
|
|
50
50
|
"@xterm/xterm": "^6.0.0"
|
|
51
51
|
},
|