@qilin-agent/client-ui-theme 0.0.0-stage → 3.1.3

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/lib/client.js ADDED
@@ -0,0 +1,1760 @@
1
+ window.__ModuleLoader__.load({
2
+ id: "@qilin-agent/client-ui-theme",
3
+ factory: (require) => {
4
+ var module = { exports: {} };
5
+ var exports = module.exports;
6
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+ let _qilin_agent_client_ui_primitives = require("@qilin-agent/client-ui-primitives");
9
+ let _qilin_agent_client_store = require("@qilin-agent/client-store");
10
+ //#region ../../../vendor/cosmokit/src/misc.ts
11
+ /** Return true when a value is `null` or `undefined`. */
12
+ function isNullable(value) {
13
+ return value === null || value === void 0;
14
+ }
15
+ /** Return true for non-array object values. */
16
+ function isPlainObject(data) {
17
+ return data && typeof data === "object" && !Array.isArray(data);
18
+ }
19
+ /** Filter object entries and return a new object. */
20
+ function filterKeys(object, filter) {
21
+ return Object.fromEntries(Object.entries(object).filter(([key, value]) => filter(key, value)));
22
+ }
23
+ /** Map object values while preserving the original key set. */
24
+ function mapValues(object, transform) {
25
+ return Object.fromEntries(Object.entries(object).map(([key, value]) => [key, transform(value, key)]));
26
+ }
27
+ /** Pick selected keys from an object, optionally including `undefined` values. */
28
+ function pick(source, keys, forced) {
29
+ if (!keys) return { ...source };
30
+ const result = {};
31
+ for (const key of keys) if (forced || source[key] !== void 0) result[key] = source[key];
32
+ return result;
33
+ }
34
+ //#endregion
35
+ //#region ../../../vendor/cosmokit/src/volatile.ts
36
+ /** Shared config references used by schema validators and plugin runtimes. */
37
+ const write = Symbol.for("cosmokit.volatile.write");
38
+ function snapshot(value, ancestors = /* @__PURE__ */ new Set()) {
39
+ if (typeof value === "function") throw new TypeError("volatile config cannot contain functions");
40
+ if (value === null || typeof value !== "object") return value;
41
+ if (ancestors.has(value)) throw new TypeError("volatile config cannot contain cycles");
42
+ ancestors.add(value);
43
+ try {
44
+ if (Array.isArray(value)) return Object.freeze(value.map((item) => snapshot(item, ancestors)));
45
+ if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) throw new TypeError("volatile config objects must be plain objects or arrays");
46
+ return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, item]) => [key, snapshot(item, ancestors)])));
47
+ } finally {
48
+ ancestors.delete(value);
49
+ }
50
+ }
51
+ /**
52
+ * Create a detached reference containing an immutable copy of the supplied data.
53
+ * @param value - validated config data; class instances and functions are unsupported.
54
+ * @returns a reference whose value is updated only by its owning runtime.
55
+ */
56
+ function createVolatile(value) {
57
+ let current = snapshot(value);
58
+ return Object.freeze({
59
+ get: () => current,
60
+ [write]: (value) => {
61
+ current = value;
62
+ }
63
+ });
64
+ }
65
+ /**
66
+ * Identify references across ESM/CJS copies of the shared library.
67
+ * @param value - a parsed config value.
68
+ * @returns whether the value implements the shared reference protocol.
69
+ */
70
+ function isVolatile(value) {
71
+ return typeof value === "object" && value !== null && write in value;
72
+ }
73
+ //#endregion
74
+ //#region ../../../vendor/cosmokit/src/types.ts
75
+ /** Test values using `instanceof` with a `toStringTag` fallback. */
76
+ function is(type, value) {
77
+ if (arguments.length === 1) return (value) => is(type, value);
78
+ return type in globalThis && value instanceof globalThis[type] || Object.prototype.toString.call(value).slice(8, -1) === type;
79
+ }
80
+ function isArrayBufferLike(value) {
81
+ return is("ArrayBuffer", value) || is("SharedArrayBuffer", value);
82
+ }
83
+ function isArrayBufferSource(value) {
84
+ return isArrayBufferLike(value) || ArrayBuffer.isView(value);
85
+ }
86
+ let Binary;
87
+ (function(_Binary) {
88
+ _Binary.is = isArrayBufferLike;
89
+ _Binary.isSource = isArrayBufferSource;
90
+ function fromSource(source) {
91
+ if (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength);
92
+ else return source;
93
+ }
94
+ _Binary.fromSource = fromSource;
95
+ function toBase64(source) {
96
+ source = fromSource(source);
97
+ if (typeof Buffer !== "undefined") return Buffer.from(source).toString("base64");
98
+ let binary = "";
99
+ const bytes = new Uint8Array(source);
100
+ for (let i = 0; i < bytes.byteLength; i++) binary += String.fromCharCode(bytes[i]);
101
+ return btoa(binary);
102
+ }
103
+ _Binary.toBase64 = toBase64;
104
+ function fromBase64(source) {
105
+ if (typeof Buffer !== "undefined") return fromSource(Buffer.from(source, "base64"));
106
+ return Uint8Array.from(atob(source), (c) => c.charCodeAt(0));
107
+ }
108
+ _Binary.fromBase64 = fromBase64;
109
+ function toHex(source) {
110
+ source = fromSource(source);
111
+ if (typeof Buffer !== "undefined") return Buffer.from(source).toString("hex");
112
+ return Array.from(new Uint8Array(source), (byte) => byte.toString(16).padStart(2, "0")).join("");
113
+ }
114
+ _Binary.toHex = toHex;
115
+ function fromHex(source) {
116
+ if (typeof Buffer !== "undefined") return fromSource(Buffer.from(source, "hex"));
117
+ const hex = source.length % 2 === 0 ? source : source.slice(0, source.length - 1);
118
+ const buffer = [];
119
+ for (let i = 0; i < hex.length; i += 2) buffer.push(parseInt(`${hex[i]}${hex[i + 1]}`, 16));
120
+ return Uint8Array.from(buffer).buffer;
121
+ }
122
+ _Binary.fromHex = fromHex;
123
+ })(Binary || (Binary = {}));
124
+ Binary.fromBase64;
125
+ Binary.toBase64;
126
+ Binary.fromHex;
127
+ Binary.toHex;
128
+ /** Deep-clone common JavaScript values while preserving prototypes and cycles. */
129
+ function clone(source, refs = /* @__PURE__ */ new Map()) {
130
+ if (!source || typeof source !== "object") return source;
131
+ if (is("Date", source)) return new Date(source.valueOf());
132
+ if (is("RegExp", source)) return new RegExp(source.source, source.flags);
133
+ if (isArrayBufferLike(source)) return source.slice(0);
134
+ if (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength);
135
+ const cached = refs.get(source);
136
+ if (cached) return cached;
137
+ if (Array.isArray(source)) {
138
+ const result = [];
139
+ refs.set(source, result);
140
+ source.forEach((value, index) => {
141
+ result[index] = Reflect.apply(clone, null, [value, refs]);
142
+ });
143
+ return result;
144
+ }
145
+ const result = Object.create(Object.getPrototypeOf(source));
146
+ refs.set(source, result);
147
+ for (const key of Reflect.ownKeys(source)) {
148
+ const descriptor = { ...Reflect.getOwnPropertyDescriptor(source, key) };
149
+ if ("value" in descriptor) descriptor.value = Reflect.apply(clone, null, [descriptor.value, refs]);
150
+ Reflect.defineProperty(result, key, descriptor);
151
+ }
152
+ return result;
153
+ }
154
+ /**
155
+ * Compare values recursively, treating two volatile references as equal regardless of value.
156
+ * Strict comparison distinguishes null/undefined, treats opaque objects by identity,
157
+ * compares URLs by normalized href, treats array holes as undefined, and considers distinct cyclic structures unequal.
158
+ * @param a - first value.
159
+ * @param b - second value.
160
+ * @param strict - whether to require strict data equality outside volatile references.
161
+ * @returns whether the values compare equal.
162
+ */
163
+ function deepEqual(a, b, strict) {
164
+ const ancestors = /* @__PURE__ */ new Set();
165
+ function compare(a, b) {
166
+ if (a === b) return true;
167
+ if (isVolatile(a) || isVolatile(b)) return isVolatile(a) && isVolatile(b);
168
+ if (!strict && isNullable(a) && isNullable(b)) return true;
169
+ if (typeof a !== typeof b || typeof a !== "object" || !a || !b) return false;
170
+ if (ancestors.has(a)) return false;
171
+ function check(test, then) {
172
+ return test(a) ? test(b) ? then(a, b) : false : test(b) ? false : void 0;
173
+ }
174
+ ancestors.add(a);
175
+ try {
176
+ return check(Array.isArray, (a, b) => {
177
+ if (a.length !== b.length) return false;
178
+ for (let index = 0; index < a.length; index++) if (!compare(a[index], b[index])) return false;
179
+ return true;
180
+ }) ?? check(is("Date"), (a, b) => a.valueOf() === b.valueOf()) ?? check(is("URL"), (a, b) => a.href === b.href) ?? check(is("RegExp"), (a, b) => a.source === b.source && a.flags === b.flags) ?? check(isArrayBufferLike, (a, b) => {
181
+ if (a.byteLength !== b.byteLength) return false;
182
+ const viewA = new Uint8Array(a);
183
+ const viewB = new Uint8Array(b);
184
+ for (let i = 0; i < viewA.length; i++) if (viewA[i] !== viewB[i]) return false;
185
+ return true;
186
+ }) ?? ((!strict || [a, b].every((value) => Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)) && Object.keys({
187
+ ...a,
188
+ ...b
189
+ }).every((key) => compare(a[key], b[key])));
190
+ } finally {
191
+ ancestors.delete(a);
192
+ }
193
+ }
194
+ return compare(a, b);
195
+ }
196
+ //#endregion
197
+ //#region ../../../vendor/cosmokit/src/time.ts
198
+ let Time;
199
+ (function(_Time) {
200
+ _Time.millisecond = 1;
201
+ const second = _Time.second = 1e3;
202
+ const minute = _Time.minute = second * 60;
203
+ const hour = _Time.hour = minute * 60;
204
+ const day = _Time.day = hour * 24;
205
+ const week = _Time.week = day * 7;
206
+ let timezoneOffset = (/* @__PURE__ */ new Date()).getTimezoneOffset();
207
+ function setTimezoneOffset(offset) {
208
+ timezoneOffset = offset;
209
+ }
210
+ _Time.setTimezoneOffset = setTimezoneOffset;
211
+ function getTimezoneOffset() {
212
+ return timezoneOffset;
213
+ }
214
+ _Time.getTimezoneOffset = getTimezoneOffset;
215
+ function getDateNumber(date = /* @__PURE__ */ new Date(), offset) {
216
+ if (typeof date === "number") date = new Date(date);
217
+ if (offset === void 0) offset = timezoneOffset;
218
+ return Math.floor((date.valueOf() / minute - offset) / 1440);
219
+ }
220
+ _Time.getDateNumber = getDateNumber;
221
+ function fromDateNumber(value, offset) {
222
+ const date = new Date(value * day);
223
+ if (offset === void 0) offset = timezoneOffset;
224
+ return new Date(+date + offset * minute);
225
+ }
226
+ _Time.fromDateNumber = fromDateNumber;
227
+ const numeric = /\d+(?:\.\d+)?/.source;
228
+ const timeRegExp = new RegExp(`^${[
229
+ "w(?:eek(?:s)?)?",
230
+ "d(?:ay(?:s)?)?",
231
+ "h(?:our(?:s)?)?",
232
+ "m(?:in(?:ute)?(?:s)?)?",
233
+ "s(?:ec(?:ond)?(?:s)?)?"
234
+ ].map((unit) => `(${numeric}${unit})?`).join("")}$`);
235
+ function parseTime(source) {
236
+ const capture = timeRegExp.exec(source);
237
+ if (!capture) return 0;
238
+ return (parseFloat(capture[1]) * week || 0) + (parseFloat(capture[2]) * day || 0) + (parseFloat(capture[3]) * hour || 0) + (parseFloat(capture[4]) * minute || 0) + (parseFloat(capture[5]) * second || 0);
239
+ }
240
+ _Time.parseTime = parseTime;
241
+ function parseDate(date) {
242
+ const parsed = parseTime(date);
243
+ if (parsed) date = Date.now() + parsed;
244
+ else if (/^\d{1,2}(:\d{1,2}){1,2}$/.test(date)) date = `${(/* @__PURE__ */ new Date()).toLocaleDateString()}-${date}`;
245
+ else if (/^\d{1,2}-\d{1,2}-\d{1,2}(:\d{1,2}){1,2}$/.test(date)) date = `${(/* @__PURE__ */ new Date()).getFullYear()}-${date}`;
246
+ return date ? new Date(date) : /* @__PURE__ */ new Date();
247
+ }
248
+ _Time.parseDate = parseDate;
249
+ function format(ms) {
250
+ const abs = Math.abs(ms);
251
+ if (abs >= day - hour / 2) return Math.round(ms / day) + "d";
252
+ else if (abs >= hour - minute / 2) return Math.round(ms / hour) + "h";
253
+ else if (abs >= minute - second / 2) return Math.round(ms / minute) + "m";
254
+ else if (abs >= second) return Math.round(ms / second) + "s";
255
+ return ms + "ms";
256
+ }
257
+ _Time.format = format;
258
+ function toDigits(source, length = 2) {
259
+ return source.toString().padStart(length, "0");
260
+ }
261
+ _Time.toDigits = toDigits;
262
+ function template(template, time = /* @__PURE__ */ new Date()) {
263
+ return template.replace("yyyy", time.getFullYear().toString()).replace("yy", time.getFullYear().toString().slice(2)).replace("MM", toDigits(time.getMonth() + 1)).replace("dd", toDigits(time.getDate())).replace("hh", toDigits(time.getHours())).replace("mm", toDigits(time.getMinutes())).replace("ss", toDigits(time.getSeconds())).replace("SSS", toDigits(time.getMilliseconds(), 3));
264
+ }
265
+ _Time.template = template;
266
+ })(Time || (Time = {}));
267
+ //#endregion
268
+ //#region ../../../vendor/schemastery/src/index.ts
269
+ const kSchema = Symbol.for("schemastery");
270
+ const kValidationError = Symbol.for("ValidationError");
271
+ globalThis.__schemastery_index__ ??= 0;
272
+ globalThis.__schemastery_refs__ = void 0;
273
+ var ValidationError = class extends TypeError {
274
+ options;
275
+ name = "ValidationError";
276
+ constructor(message, options) {
277
+ let prefix = "$";
278
+ for (const segment of options.path || []) if (typeof segment === "string") prefix += "." + segment;
279
+ else if (typeof segment === "number") prefix += "[" + segment + "]";
280
+ else if (typeof segment === "symbol") prefix += `[Symbol(${segment.toString()})]`;
281
+ if (prefix.startsWith(".")) prefix = prefix.slice(1);
282
+ super((prefix === "$" ? "" : `${prefix} `) + message);
283
+ this.options = options;
284
+ }
285
+ static is(error) {
286
+ return !!error?.[kValidationError];
287
+ }
288
+ };
289
+ Object.defineProperty(ValidationError.prototype, kValidationError, { value: true });
290
+ const Schema = function(options) {
291
+ const schema = function(data, options = {}) {
292
+ return Schema.resolve(data, schema, options)[0];
293
+ };
294
+ if (options.refs) {
295
+ const refs = mapValues(options.refs, (options) => new Schema(options));
296
+ const getRef = (uid) => refs[uid];
297
+ for (const key in refs) {
298
+ const options = refs[key];
299
+ options.sKey = getRef(options.sKey);
300
+ options.inner = getRef(options.inner);
301
+ options.list = options.list && options.list.map(getRef);
302
+ options.dict = options.dict && mapValues(options.dict, getRef);
303
+ }
304
+ return refs[options.uid];
305
+ }
306
+ Object.assign(schema, options);
307
+ if (typeof schema.callback === "string") try {
308
+ schema.callback = new Function("return " + schema.callback)();
309
+ } catch {}
310
+ Object.defineProperty(schema, "uid", { value: globalThis.__schemastery_index__++ });
311
+ Object.setPrototypeOf(schema, Schema.prototype);
312
+ schema.meta ||= {};
313
+ schema.toString = schema.toString.bind(schema);
314
+ return schema;
315
+ };
316
+ Schema.prototype = Object.create(Function.prototype);
317
+ Schema.prototype[kSchema] = true;
318
+ Object.defineProperty(Schema.prototype, "~standard", { get() {
319
+ return {
320
+ version: 1,
321
+ vendor: "schemastery",
322
+ validate: (value) => {
323
+ try {
324
+ return { value: Schema.resolve(value, this, {})[0] };
325
+ } catch (error) {
326
+ if (ValidationError.is(error)) return { issues: [{
327
+ message: error.message,
328
+ path: error.options.path
329
+ }] };
330
+ throw error;
331
+ }
332
+ }
333
+ };
334
+ } });
335
+ Schema.ValidationError = ValidationError;
336
+ Schema.prototype.toJSON = function toJSON() {
337
+ if (globalThis.__schemastery_refs__) {
338
+ globalThis.__schemastery_refs__[this.uid] ??= JSON.parse(JSON.stringify({ ...this }));
339
+ return this.uid;
340
+ }
341
+ globalThis.__schemastery_refs__ = { [this.uid]: { ...this } };
342
+ globalThis.__schemastery_refs__[this.uid] = JSON.parse(JSON.stringify({ ...this }));
343
+ const result = {
344
+ uid: this.uid,
345
+ refs: globalThis.__schemastery_refs__
346
+ };
347
+ globalThis.__schemastery_refs__ = void 0;
348
+ return result;
349
+ };
350
+ Schema.prototype.set = function set(key, value) {
351
+ this.dict[key] = value;
352
+ return this;
353
+ };
354
+ Schema.prototype.push = function push(value) {
355
+ this.list.push(value);
356
+ return this;
357
+ };
358
+ function mergeDesc(original, messages) {
359
+ const result = typeof original === "string" ? { "": original } : { ...original };
360
+ for (const locale in messages) {
361
+ const value = messages[locale];
362
+ if (value?.$description || value?.$desc) result[locale] = value.$description || value.$desc;
363
+ else if (typeof value === "string") result[locale] = value;
364
+ }
365
+ return result;
366
+ }
367
+ function getInner(value) {
368
+ return value?.$value ?? value?.$inner;
369
+ }
370
+ function extractKeys(data) {
371
+ return filterKeys(data ?? {}, (key) => !key.startsWith("$"));
372
+ }
373
+ Schema.prototype.i18n = function i18n(messages) {
374
+ const schema = Schema(this);
375
+ const desc = mergeDesc(schema.meta.description, messages);
376
+ if (Object.keys(desc).length) schema.meta.description = desc;
377
+ if (schema.dict) schema.dict = mapValues(schema.dict, (inner, key) => {
378
+ return inner.i18n(mapValues(messages, (data) => getInner(data)?.[key] ?? data?.[key]));
379
+ });
380
+ if (schema.list) schema.list = schema.list.map((inner, index) => {
381
+ return inner.i18n(mapValues(messages, (data = {}) => {
382
+ if (Array.isArray(getInner(data))) return getInner(data)[index];
383
+ if (Array.isArray(data)) return data[index];
384
+ return extractKeys(data);
385
+ }));
386
+ });
387
+ if (schema.inner) schema.inner = schema.inner.i18n(mapValues(messages, (data) => {
388
+ if (getInner(data)) return getInner(data);
389
+ return extractKeys(data);
390
+ }));
391
+ if (schema.sKey) schema.sKey = schema.sKey.i18n(mapValues(messages, (data) => data?.$key));
392
+ return schema;
393
+ };
394
+ Schema.prototype.extra = function extra(key, value) {
395
+ const schema = Schema(this);
396
+ schema.meta = {
397
+ ...schema.meta,
398
+ [key]: value
399
+ };
400
+ return schema;
401
+ };
402
+ for (const key of [
403
+ "required",
404
+ "disabled",
405
+ "collapse",
406
+ "hidden",
407
+ "loose"
408
+ ]) Object.assign(Schema.prototype, { [key](value = true) {
409
+ const schema = Schema(this);
410
+ schema.meta = {
411
+ ...schema.meta,
412
+ [key]: value
413
+ };
414
+ return schema;
415
+ } });
416
+ Schema.prototype.deprecated = function deprecated() {
417
+ const schema = Schema(this);
418
+ schema.meta.badges ||= [];
419
+ schema.meta.badges.push({
420
+ text: "deprecated",
421
+ type: "danger"
422
+ });
423
+ return schema;
424
+ };
425
+ Schema.prototype.experimental = function experimental() {
426
+ const schema = Schema(this);
427
+ schema.meta.badges ||= [];
428
+ schema.meta.badges.push({
429
+ text: "experimental",
430
+ type: "warning"
431
+ });
432
+ return schema;
433
+ };
434
+ Schema.prototype.pattern = function pattern(regexp) {
435
+ const schema = Schema(this);
436
+ const pattern = pick(regexp, ["source", "flags"]);
437
+ schema.meta = {
438
+ ...schema.meta,
439
+ pattern
440
+ };
441
+ return schema;
442
+ };
443
+ Schema.prototype.simplify = function simplify(value) {
444
+ if (isVolatile(value)) value = value.get();
445
+ if (deepEqual(value, this.meta.default, this.type === "dict")) return null;
446
+ if (isNullable(value)) return value;
447
+ if (this.type === "object" || this.type === "dict") {
448
+ const result = {};
449
+ for (const key in value) {
450
+ const item = (this.type === "object" ? this.dict[key] : this.inner)?.simplify(value[key]);
451
+ if (this.type === "dict" || !isNullable(item)) result[key] = item;
452
+ }
453
+ if (deepEqual(result, this.meta.default, this.type === "dict")) return null;
454
+ return result;
455
+ } else if (this.type === "array" || this.type === "tuple") {
456
+ const result = [];
457
+ value.forEach((value, index) => {
458
+ const schema = this.type === "array" ? this.inner : this.list[index];
459
+ const item = schema ? schema.simplify(value) : value;
460
+ result.push(item);
461
+ });
462
+ return result;
463
+ } else if (this.type === "intersect") {
464
+ const result = {};
465
+ for (const item of this.list) Object.assign(result, item.simplify(value));
466
+ return result;
467
+ } else if (this.type === "union") for (const schema of this.list) try {
468
+ Schema.resolve(value, schema, {});
469
+ return schema.simplify(value);
470
+ } catch {}
471
+ return value;
472
+ };
473
+ Schema.prototype.toString = function toString(inline) {
474
+ return formatters[this.type]?.(this, inline) ?? `Schema<${this.type}>`;
475
+ };
476
+ Schema.prototype.role = function role(role, extra) {
477
+ const schema = Schema(this);
478
+ schema.meta = {
479
+ ...schema.meta,
480
+ role,
481
+ extra
482
+ };
483
+ return schema;
484
+ };
485
+ for (const key of [
486
+ "default",
487
+ "link",
488
+ "comment",
489
+ "description",
490
+ "max",
491
+ "min",
492
+ "step"
493
+ ]) Object.assign(Schema.prototype, { [key](value) {
494
+ const schema = Schema(this);
495
+ schema.meta = {
496
+ ...schema.meta,
497
+ [key]: value
498
+ };
499
+ return schema;
500
+ } });
501
+ Schema.prototype.volatile = function volatile() {
502
+ if (this.meta.volatile) throw new TypeError("volatile schema is already wrapped");
503
+ return this.extra("volatile", true);
504
+ };
505
+ const resolvers = {};
506
+ const checkedVolatile = Symbol("checked-volatile-schema");
507
+ function validateVolatileSchema(schema, path = [], blocked = false, seen = /* @__PURE__ */ new Map()) {
508
+ const states = seen.get(schema) ?? /* @__PURE__ */ new Set();
509
+ if (states.has(blocked)) return;
510
+ states.add(blocked);
511
+ seen.set(schema, states);
512
+ if (schema.meta?.volatile && blocked) throw new ValidationError("volatile fields require a fixed object path without an enclosing volatile field", { path });
513
+ const nested = blocked || !!schema.meta?.volatile;
514
+ if (schema.dict) for (const [key, child] of Object.entries(schema.dict)) validateVolatileSchema(child, [...path, key], nested, seen);
515
+ if (schema.sKey) validateVolatileSchema(schema.sKey, [...path, "<key>"], true, seen);
516
+ if (schema.inner && (schema.type !== "lazy" || schema.inner[kSchema])) validateVolatileSchema(schema.inner, [...path, "*"], true, seen);
517
+ if (schema.list) for (let index = 0; index < schema.list.length; index++) validateVolatileSchema(schema.list[index], [...path, String(index)], true, seen);
518
+ }
519
+ Schema.extend = function extend(type, resolve) {
520
+ resolvers[type] = resolve;
521
+ };
522
+ Schema.resolve = function resolve(data, schema, options = {}, strict = false) {
523
+ if (!schema) return [data];
524
+ if (!options[checkedVolatile]) {
525
+ validateVolatileSchema(schema, options.path);
526
+ options = {
527
+ ...options,
528
+ [checkedVolatile]: true
529
+ };
530
+ }
531
+ if (schema.meta?.volatile) {
532
+ const inner = Schema(schema);
533
+ inner.meta = {
534
+ ...schema.meta,
535
+ volatile: false
536
+ };
537
+ const [value, adapted] = Schema.resolve(data, inner, options, strict);
538
+ try {
539
+ return [createVolatile(value), adapted];
540
+ } catch (error) {
541
+ throw new ValidationError(error instanceof Error ? error.message : String(error), options);
542
+ }
543
+ }
544
+ if (options.ignore?.(data, schema)) return [data];
545
+ if (isNullable(data) && schema.type !== "lazy") {
546
+ if (schema.meta.required) throw new ValidationError(`missing required value`, options);
547
+ let current = schema;
548
+ let fallback = schema.meta.default;
549
+ while (current?.type === "intersect" && isNullable(fallback)) {
550
+ current = current.list[0];
551
+ fallback = current?.meta.default;
552
+ }
553
+ if (isNullable(fallback)) return [data];
554
+ data = clone(fallback);
555
+ }
556
+ const callback = resolvers[schema.type];
557
+ if (!callback) throw new ValidationError(`unsupported type "${schema.type}"`, options);
558
+ try {
559
+ return callback(data, schema, options, strict);
560
+ } catch (error) {
561
+ if (!schema.meta.loose) throw error;
562
+ return [schema.meta.default];
563
+ }
564
+ };
565
+ Schema.from = function from(source) {
566
+ if (isNullable(source)) return Schema.any();
567
+ else if ([
568
+ "string",
569
+ "number",
570
+ "boolean"
571
+ ].includes(typeof source)) return Schema.const(source).required();
572
+ else if (source[kSchema]) return source;
573
+ else if (typeof source === "function") switch (source) {
574
+ case String: return Schema.string().required();
575
+ case Number: return Schema.number().required();
576
+ case Boolean: return Schema.boolean().required();
577
+ case Function: return Schema.function().required();
578
+ default: return Schema.is(source).required();
579
+ }
580
+ else throw new TypeError(`cannot infer schema from ${source}`);
581
+ };
582
+ Schema.lazy = function lazy(builder) {
583
+ const toJSON = () => {
584
+ if (!schema.inner[kSchema]) {
585
+ schema.inner = schema.builder();
586
+ schema.inner.meta = {
587
+ ...schema.meta,
588
+ ...schema.inner.meta
589
+ };
590
+ }
591
+ return schema.inner.toJSON();
592
+ };
593
+ const schema = new Schema({
594
+ type: "lazy",
595
+ builder,
596
+ inner: { toJSON }
597
+ });
598
+ return schema;
599
+ };
600
+ Schema.natural = function natural() {
601
+ return Schema.number().step(1).min(0);
602
+ };
603
+ Schema.percent = function percent() {
604
+ return Schema.number().step(.01).min(0).max(1).role("slider");
605
+ };
606
+ Schema.date = function date() {
607
+ return Schema.union([Schema.is(Date), Schema.transform(Schema.string().role("datetime"), (value, options) => {
608
+ const date = new Date(value);
609
+ if (isNaN(+date)) throw new ValidationError(`invalid date "${value}"`, options);
610
+ return date;
611
+ }, true)]);
612
+ };
613
+ Schema.regExp = function regExp(flag = "") {
614
+ return Schema.union([Schema.is(RegExp), Schema.transform(Schema.string().role("regexp", { flag }), (value, options) => {
615
+ try {
616
+ return new RegExp(value, flag);
617
+ } catch (e) {
618
+ throw new ValidationError(e.message, options);
619
+ }
620
+ }, true)]);
621
+ };
622
+ Schema.arrayBuffer = function arrayBuffer(encoding) {
623
+ return Schema.union([
624
+ Schema.is(ArrayBuffer),
625
+ Schema.is(SharedArrayBuffer),
626
+ Schema.transform(Schema.any(), (value, options) => {
627
+ if (Binary.isSource(value)) return Binary.fromSource(value);
628
+ throw new ValidationError(`expected ArrayBufferSource but got ${value}`, options);
629
+ }, true),
630
+ ...encoding ? [Schema.transform(Schema.string(), (value, options) => {
631
+ try {
632
+ return encoding === "base64" ? Binary.fromBase64(value) : Binary.fromHex(value);
633
+ } catch (e) {
634
+ throw new ValidationError(e.message, options);
635
+ }
636
+ }, true)] : []
637
+ ]);
638
+ };
639
+ Schema.extend("lazy", (data, schema, options, strict) => {
640
+ if (!schema.inner[kSchema]) {
641
+ schema.inner = schema.builder();
642
+ schema.inner.meta = {
643
+ ...schema.meta,
644
+ ...schema.inner.meta
645
+ };
646
+ validateVolatileSchema(schema.inner, options.path, true);
647
+ }
648
+ return Schema.resolve(data, schema.inner, options, strict);
649
+ });
650
+ Schema.extend("any", (data) => {
651
+ return [data];
652
+ });
653
+ Schema.extend("never", (data, _, options) => {
654
+ throw new ValidationError(`expected nullable but got ${data}`, options);
655
+ });
656
+ Schema.extend("const", (data, { value }, options) => {
657
+ if (deepEqual(data, value)) return [value];
658
+ throw new ValidationError(`expected ${value} but got ${data}`, options);
659
+ });
660
+ function checkWithinRange(data, meta, description, options, skipMin = false) {
661
+ const { max = Infinity, min = -Infinity } = meta;
662
+ if (data > max) throw new ValidationError(`expected ${description} <= ${max} but got ${data}`, options);
663
+ if (data < min && !skipMin) throw new ValidationError(`expected ${description} >= ${min} but got ${data}`, options);
664
+ }
665
+ Schema.extend("string", (data, { meta }, options) => {
666
+ if (typeof data !== "string") throw new ValidationError(`expected string but got ${data}`, options);
667
+ if (meta.pattern) {
668
+ const regexp = new RegExp(meta.pattern.source, meta.pattern.flags);
669
+ if (!regexp.test(data)) throw new ValidationError(`expect string to match regexp ${regexp}`, options);
670
+ }
671
+ checkWithinRange(data.length, meta, "string length", options);
672
+ return [data];
673
+ });
674
+ function decimalShift(data, digits) {
675
+ const str = data.toString();
676
+ if (str.includes("e")) return data * Math.pow(10, digits);
677
+ const index = str.indexOf(".");
678
+ if (index === -1) return data * Math.pow(10, digits);
679
+ const frac = str.slice(index + 1);
680
+ const integer = str.slice(0, index);
681
+ if (frac.length <= digits) return +(integer + frac.padEnd(digits, "0"));
682
+ return +(integer + frac.slice(0, digits) + "." + frac.slice(digits));
683
+ }
684
+ function isMultipleOf(data, min, step) {
685
+ step = Math.abs(step);
686
+ if (!/^\d+\.\d+$/.test(step.toString())) return (data - min) % step === 0;
687
+ const index = step.toString().indexOf(".");
688
+ const digits = step.toString().slice(index + 1).length;
689
+ return Math.abs(decimalShift(data, digits) - decimalShift(min, digits)) % decimalShift(step, digits) === 0;
690
+ }
691
+ Schema.extend("number", (data, { meta }, options) => {
692
+ if (typeof data !== "number") throw new ValidationError(`expected number but got ${data}`, options);
693
+ checkWithinRange(data, meta, "number", options);
694
+ const { step } = meta;
695
+ if (step && !isMultipleOf(data, meta.min ?? 0, step)) throw new ValidationError(`expected number multiple of ${step} but got ${data}`, options);
696
+ return [data];
697
+ });
698
+ Schema.extend("boolean", (data, _, options) => {
699
+ if (typeof data === "boolean") return [data];
700
+ throw new ValidationError(`expected boolean but got ${data}`, options);
701
+ });
702
+ Schema.extend("bitset", (data, { bits, meta }, options) => {
703
+ let value = 0, keys = [];
704
+ if (typeof data === "number") {
705
+ value = data;
706
+ for (const key in bits) if (data & bits[key]) keys.push(key);
707
+ } else if (Array.isArray(data)) {
708
+ keys = data;
709
+ for (const key of keys) {
710
+ if (typeof key !== "string") throw new ValidationError(`expected string but got ${key}`, options);
711
+ if (key in bits) value |= bits[key];
712
+ }
713
+ } else throw new ValidationError(`expected number or array but got ${data}`, options);
714
+ if (value === meta.default) return [value];
715
+ return [value, keys];
716
+ });
717
+ Schema.extend("function", (data, _, options) => {
718
+ if (typeof data === "function") return [data];
719
+ throw new ValidationError(`expected function but got ${data}`, options);
720
+ });
721
+ Schema.extend("is", (data, { constructor }, options) => {
722
+ if (typeof constructor === "function") {
723
+ if (data instanceof constructor) return [data];
724
+ throw new ValidationError(`expected ${constructor.name} but got ${data}`, options);
725
+ } else {
726
+ if (isNullable(data)) throw new ValidationError(`expected ${constructor} but got ${data}`, options);
727
+ let prototype = Object.getPrototypeOf(data);
728
+ while (prototype) {
729
+ if (prototype.constructor?.name === constructor) return [data];
730
+ prototype = Object.getPrototypeOf(prototype);
731
+ }
732
+ throw new ValidationError(`expected ${constructor} but got ${data}`, options);
733
+ }
734
+ });
735
+ function property(data, key, schema, options) {
736
+ try {
737
+ const [value, adapted] = Schema.resolve(data[key], schema, {
738
+ ...options,
739
+ path: [...options.path || [], key]
740
+ });
741
+ if (adapted !== void 0) data[key] = adapted;
742
+ return value;
743
+ } catch (e) {
744
+ if (!options?.autofix) throw e;
745
+ delete data[key];
746
+ return schema.meta.volatile ? createVolatile(schema.meta.default) : schema.meta.default;
747
+ }
748
+ }
749
+ Schema.extend("array", (data, { inner, meta }, options) => {
750
+ if (!Array.isArray(data)) throw new ValidationError(`expected array but got ${data}`, options);
751
+ checkWithinRange(data.length, meta, "array length", options, !isNullable(inner.meta.default));
752
+ return [data.map((_, index) => property(data, index, inner, options))];
753
+ });
754
+ Schema.extend("dict", (data, { inner, sKey }, options, strict) => {
755
+ if (!isPlainObject(data)) throw new ValidationError(`expected object but got ${data}`, options);
756
+ const result = {};
757
+ for (const key in data) {
758
+ let rKey;
759
+ try {
760
+ rKey = Schema.resolve(key, sKey, options)[0];
761
+ } catch (error) {
762
+ if (strict) continue;
763
+ throw error;
764
+ }
765
+ result[rKey] = property(data, key, inner, options);
766
+ data[rKey] = data[key];
767
+ if (key !== rKey) delete data[key];
768
+ }
769
+ return [result];
770
+ });
771
+ Schema.extend("tuple", (data, { list }, options, strict) => {
772
+ if (!Array.isArray(data)) throw new ValidationError(`expected array but got ${data}`, options);
773
+ const result = list.map((inner, index) => property(data, index, inner, options));
774
+ if (strict) return [result];
775
+ result.push(...data.slice(list.length));
776
+ return [result];
777
+ });
778
+ function merge(result, data) {
779
+ for (const key in data) {
780
+ if (key in result) continue;
781
+ result[key] = data[key];
782
+ }
783
+ }
784
+ Schema.extend("object", (data, { dict }, options, strict) => {
785
+ if (!isPlainObject(data)) throw new ValidationError(`expected object but got ${data}`, options);
786
+ const result = {};
787
+ for (const key in dict) {
788
+ const value = property(data, key, dict[key], options);
789
+ if (!isNullable(value) || key in data) result[key] = value;
790
+ }
791
+ if (!strict) merge(result, data);
792
+ return [result];
793
+ });
794
+ Schema.extend("union", (data, { list, toString }, options, strict) => {
795
+ const messages = [];
796
+ for (const inner of list) try {
797
+ return Schema.resolve(data, inner, options, strict);
798
+ } catch (error) {
799
+ messages.push(error);
800
+ }
801
+ throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);
802
+ });
803
+ Schema.extend("intersect", (data, { list, toString }, options, strict) => {
804
+ if (!list.length) return [data];
805
+ let result;
806
+ for (const inner of list) {
807
+ const value = Schema.resolve(data, inner, options, true)[0];
808
+ if (isNullable(value)) continue;
809
+ if (isNullable(result)) result = value;
810
+ else if (typeof result !== typeof value) throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);
811
+ else if (typeof value === "object") merge(result ??= {}, value);
812
+ else if (result !== value) throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);
813
+ }
814
+ if (!strict && isPlainObject(data)) merge(result, data);
815
+ return [result];
816
+ });
817
+ Schema.extend("transform", (data, { inner, callback, preserve }, options) => {
818
+ const [result, adapted = data] = Schema.resolve(data, inner, options, true);
819
+ if (preserve) return [callback(result)];
820
+ else return [callback(result), callback(adapted)];
821
+ });
822
+ const formatters = {};
823
+ function defineMethod(name, keys, format) {
824
+ formatters[name] = format;
825
+ Object.assign(Schema, { [name](...args) {
826
+ const schema = new Schema({ type: name });
827
+ keys.forEach((key, index) => {
828
+ switch (key) {
829
+ case "sKey":
830
+ schema.sKey = args[index] ?? Schema.string();
831
+ break;
832
+ case "inner":
833
+ schema.inner = Schema.from(args[index]);
834
+ break;
835
+ case "list":
836
+ schema.list = args[index].map(Schema.from);
837
+ break;
838
+ case "dict":
839
+ schema.dict = mapValues(args[index], Schema.from);
840
+ break;
841
+ case "bits":
842
+ schema.bits = {};
843
+ for (const key in args[index]) {
844
+ if (typeof args[index][key] !== "number") continue;
845
+ schema.bits[key] = args[index][key];
846
+ }
847
+ break;
848
+ case "callback": {
849
+ const callback = schema.callback = args[index];
850
+ callback["toJSON"] ||= () => callback.toString();
851
+ break;
852
+ }
853
+ case "constructor": {
854
+ const constructor = schema.constructor = args[index];
855
+ if (typeof constructor === "function") constructor["toJSON"] ||= () => constructor["name"];
856
+ break;
857
+ }
858
+ default: schema[key] = args[index];
859
+ }
860
+ });
861
+ if (name === "object" || name === "dict") schema.meta.default = {};
862
+ else if (name === "array" || name === "tuple") schema.meta.default = [];
863
+ else if (name === "bitset") schema.meta.default = 0;
864
+ return schema;
865
+ } });
866
+ }
867
+ defineMethod("is", ["constructor"], ({ constructor }) => {
868
+ if (typeof constructor === "function") return constructor.name;
869
+ else return constructor;
870
+ });
871
+ defineMethod("any", [], () => "any");
872
+ defineMethod("never", [], () => "never");
873
+ defineMethod("const", ["value"], ({ value }) => typeof value === "string" ? JSON.stringify(value) : value);
874
+ defineMethod("string", [], () => "string");
875
+ defineMethod("number", [], () => "number");
876
+ defineMethod("boolean", [], () => "boolean");
877
+ defineMethod("bitset", ["bits"], () => "bitset");
878
+ defineMethod("function", [], () => "function");
879
+ defineMethod("array", ["inner"], ({ inner }) => `${inner.toString(true)}[]`);
880
+ defineMethod("dict", ["inner", "sKey"], ({ inner, sKey }) => `{ [key: ${sKey.toString()}]: ${inner.toString()} }`);
881
+ defineMethod("tuple", ["list"], ({ list }) => `[${list.map((inner) => inner.toString()).join(", ")}]`);
882
+ defineMethod("object", ["dict"], ({ dict }) => {
883
+ if (Object.keys(dict).length === 0) return "{}";
884
+ return `{ ${Object.entries(dict).map(([key, inner]) => {
885
+ return `${key}${inner.meta.required ? "" : "?"}: ${inner.toString()}`;
886
+ }).join(", ")} }`;
887
+ });
888
+ defineMethod("union", ["list"], ({ list }, inline) => {
889
+ const result = list.map(({ toString: format }) => format()).join(" | ");
890
+ return inline ? `(${result})` : result;
891
+ });
892
+ defineMethod("intersect", ["list"], ({ list }) => {
893
+ return `${list.map((inner) => inner.toString(true)).join(" & ")}`;
894
+ });
895
+ defineMethod("transform", [
896
+ "inner",
897
+ "callback",
898
+ "preserve"
899
+ ], ({ inner }, isInner) => inner.toString(isInner));
900
+ //#endregion
901
+ //#region lib/types/theme-settings.js
902
+ /** Theme preferences stored in the Host user-settings document. */
903
+ /** Built-in preferences accepted at the registry and settings boundaries. */
904
+ const THEME_PREFERENCES = [
905
+ "light",
906
+ "dark",
907
+ "system"
908
+ ];
909
+ /** Settings namespace owned by the theme plugin. */
910
+ const THEME_SETTINGS_NAMESPACE = "ui-theme";
911
+ /** Field carrying the selected built-in theme preference. */
912
+ const THEME_PREFERENCE_FIELD = "preference";
913
+ /** Field carrying the conversation content font size. */
914
+ const FONT_SIZE_FIELD = "fontSize";
915
+ /** Field carrying the conversation content leading adjustment. */
916
+ const LEADING_FIELD = "leading";
917
+ /** Default preference when the user-settings document has no override. */
918
+ const DEFAULT_PREFERENCE = "system";
919
+ Schema.object({
920
+ [THEME_PREFERENCE_FIELD]: Schema.union([...THEME_PREFERENCES]).default(DEFAULT_PREFERENCE),
921
+ [FONT_SIZE_FIELD]: Schema.number().step(1).min(10).max(22).default(14),
922
+ [LEADING_FIELD]: Schema.number().step(1).min(-2).max(8).default(0)
923
+ });
924
+ /**
925
+ * Narrow one wire or registry value to a persistable preference.
926
+ * @param value - value crossing the settings or registry boundary.
927
+ * @returns whether the value is a built-in preference.
928
+ */
929
+ function isThemePreference(value) {
930
+ return THEME_PREFERENCES.some((preference) => preference === value);
931
+ }
932
+ //#endregion
933
+ //#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-theme/src/client/settings-row.module.css.mjs
934
+ const css$1 = "._6SOBEq_row{border-bottom:.5px solid var(--qilin-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}._6SOBEq_rowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}._6SOBEq_title{color:var(--qilin-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}._6SOBEq_desc{color:var(--qilin-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}._6SOBEq_control{align-items:center;gap:8px;display:inline-flex}._6SOBEq_stepper{border-radius:var(--qilin-radius-md);background:var(--qilin-alias-bg-module-platform);justify-content:center;align-items:center;min-width:72px;height:36px;display:inline-flex;position:relative}._6SOBEq_value{text-align:center;font-variant-numeric:tabular-nums;min-width:18px;color:var(--qilin-alias-label-primary);font-size:14px;line-height:22px}._6SOBEq_unit{color:var(--qilin-alias-label-secondary);font-size:14px;line-height:22px}._6SOBEq_arrows{opacity:0;flex-direction:column;gap:2px;display:flex;position:absolute;right:8px}._6SOBEq_stepper:hover ._6SOBEq_arrows,._6SOBEq_stepper:focus-within ._6SOBEq_arrows{opacity:1}._6SOBEq_arrow{background:color-mix(in srgb, var(--qilin-alias-bg-layer-1) 75%, transparent);width:17px;height:12px;color:var(--qilin-alias-label-primary);cursor:pointer;border:none;border-radius:3px;justify-content:center;align-items:center;padding:0;display:inline-flex}._6SOBEq_arrow:hover:not(:disabled){background:var(--qilin-alias-bg-layer-1)}._6SOBEq_arrow:disabled{color:var(--qilin-alias-label-caption);cursor:default}";
935
+ const tagId$1 = "@qilin-agent/client-ui-theme/settings-row.module.css";
936
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
937
+ const tag = document.createElement("style");
938
+ tag.dataset.plugin = "@qilin-agent/client-ui-theme";
939
+ tag.dataset.pluginCss = tagId$1;
940
+ tag.textContent = css$1;
941
+ document.head.appendChild(tag);
942
+ }
943
+ var settings_row_module_css_default = {
944
+ "arrow": "_6SOBEq_arrow",
945
+ "arrows": "_6SOBEq_arrows",
946
+ "control": "_6SOBEq_control",
947
+ "desc": "_6SOBEq_desc",
948
+ "row": "_6SOBEq_row",
949
+ "rowText": "_6SOBEq_rowText",
950
+ "stepper": "_6SOBEq_stepper",
951
+ "title": "_6SOBEq_title",
952
+ "unit": "_6SOBEq_unit",
953
+ "value": "_6SOBEq_value"
954
+ };
955
+ //#endregion
956
+ //#region lib/types/client/FontSizeRow.js
957
+ /**
958
+ * Font-size preference row registered into the General section item slot:
959
+ * title + body-text-only description + stepper pill (centered value; hover
960
+ * reveals the up/down arrow column anchored to the pill's right edge) + a px
961
+ * unit label after the pill. Registered by this package — the theme feature
962
+ * owns the content font-size setting the same way it owns the appearance
963
+ * preference. The displayed value follows the persisted setting, never the
964
+ * click echo.
965
+ */
966
+ /**
967
+ * Render the font-size row.
968
+ * @param props - composed slot props.
969
+ * @returns the row element tree.
970
+ */
971
+ function FontSizeRow({ t, setFontSize, useStore }) {
972
+ const fontSize = useStore((s) => s.fontSize);
973
+ return (0, react_jsx_runtime.jsxs)("div", {
974
+ className: settings_row_module_css_default.row,
975
+ children: [(0, react_jsx_runtime.jsxs)("div", {
976
+ className: settings_row_module_css_default.rowText,
977
+ children: [(0, react_jsx_runtime.jsx)("div", {
978
+ className: settings_row_module_css_default.title,
979
+ children: t("fontSize.title")
980
+ }), (0, react_jsx_runtime.jsx)("div", {
981
+ className: settings_row_module_css_default.desc,
982
+ children: t("fontSize.description")
983
+ })]
984
+ }), (0, react_jsx_runtime.jsxs)("div", {
985
+ className: settings_row_module_css_default.control,
986
+ children: [(0, react_jsx_runtime.jsxs)("div", {
987
+ className: settings_row_module_css_default.stepper,
988
+ children: [(0, react_jsx_runtime.jsx)("span", {
989
+ className: settings_row_module_css_default.value,
990
+ children: fontSize
991
+ }), (0, react_jsx_runtime.jsxs)("span", {
992
+ className: settings_row_module_css_default.arrows,
993
+ children: [(0, react_jsx_runtime.jsx)("button", {
994
+ type: "button",
995
+ className: settings_row_module_css_default.arrow,
996
+ "aria-label": t("fontSize.increase"),
997
+ disabled: fontSize >= 22,
998
+ onClick: () => {
999
+ setFontSize(fontSize + 1);
1000
+ },
1001
+ children: (0, react_jsx_runtime.jsx)(_qilin_agent_client_ui_primitives.IconChevronUpOutline14, { size: 9 })
1002
+ }), (0, react_jsx_runtime.jsx)("button", {
1003
+ type: "button",
1004
+ className: settings_row_module_css_default.arrow,
1005
+ "aria-label": t("fontSize.decrease"),
1006
+ disabled: fontSize <= 10,
1007
+ onClick: () => {
1008
+ setFontSize(fontSize - 1);
1009
+ },
1010
+ children: (0, react_jsx_runtime.jsx)(_qilin_agent_client_ui_primitives.IconChevronDownOutline14, { size: 9 })
1011
+ })]
1012
+ })]
1013
+ }), (0, react_jsx_runtime.jsx)("span", {
1014
+ className: settings_row_module_css_default.unit,
1015
+ children: t("fontSize.unit")
1016
+ })]
1017
+ })]
1018
+ });
1019
+ }
1020
+ //#endregion
1021
+ //#region lib/types/client/LineSpacingRow.js
1022
+ /**
1023
+ * Line-spacing preference row registered into the General section item slot:
1024
+ * the same cell rhythm as the font-size row, with a stepper pill carrying the
1025
+ * leading adjustment instead of an absolute size. The value is a signed px
1026
+ * delta over each tier's shipped line height, so 0 renders the typography the
1027
+ * theme ships. The displayed value follows the persisted setting, never the
1028
+ * click echo.
1029
+ */
1030
+ /**
1031
+ * Render the line-spacing row.
1032
+ * @param props - composed slot props.
1033
+ * @returns the row element tree.
1034
+ */
1035
+ function LineSpacingRow({ t, setLeading, useStore }) {
1036
+ const leading = useStore((s) => s.leading);
1037
+ return (0, react_jsx_runtime.jsxs)("div", {
1038
+ className: settings_row_module_css_default.row,
1039
+ children: [(0, react_jsx_runtime.jsxs)("div", {
1040
+ className: settings_row_module_css_default.rowText,
1041
+ children: [(0, react_jsx_runtime.jsx)("div", {
1042
+ className: settings_row_module_css_default.title,
1043
+ children: t("leading.title")
1044
+ }), (0, react_jsx_runtime.jsx)("div", {
1045
+ className: settings_row_module_css_default.desc,
1046
+ children: t("leading.description")
1047
+ })]
1048
+ }), (0, react_jsx_runtime.jsxs)("div", {
1049
+ className: settings_row_module_css_default.control,
1050
+ children: [(0, react_jsx_runtime.jsxs)("div", {
1051
+ className: settings_row_module_css_default.stepper,
1052
+ children: [(0, react_jsx_runtime.jsx)("span", {
1053
+ className: settings_row_module_css_default.value,
1054
+ children: leading > 0 ? `+${leading}` : `${leading}`
1055
+ }), (0, react_jsx_runtime.jsxs)("span", {
1056
+ className: settings_row_module_css_default.arrows,
1057
+ children: [(0, react_jsx_runtime.jsx)("button", {
1058
+ type: "button",
1059
+ className: settings_row_module_css_default.arrow,
1060
+ "aria-label": t("leading.increase"),
1061
+ disabled: leading >= 8,
1062
+ onClick: () => {
1063
+ setLeading(leading + 1);
1064
+ },
1065
+ children: (0, react_jsx_runtime.jsx)(_qilin_agent_client_ui_primitives.IconChevronUpOutline14, { size: 9 })
1066
+ }), (0, react_jsx_runtime.jsx)("button", {
1067
+ type: "button",
1068
+ className: settings_row_module_css_default.arrow,
1069
+ "aria-label": t("leading.decrease"),
1070
+ disabled: leading <= -2,
1071
+ onClick: () => {
1072
+ setLeading(leading - 1);
1073
+ },
1074
+ children: (0, react_jsx_runtime.jsx)(_qilin_agent_client_ui_primitives.IconChevronDownOutline14, { size: 9 })
1075
+ })]
1076
+ })]
1077
+ }), (0, react_jsx_runtime.jsx)("span", {
1078
+ className: settings_row_module_css_default.unit,
1079
+ children: t("leading.unit")
1080
+ })]
1081
+ })]
1082
+ });
1083
+ }
1084
+ //#endregion
1085
+ //#region ../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
1086
+ function r(e) {
1087
+ var t, f, n = "";
1088
+ if ("string" == typeof e || "number" == typeof e) n += e;
1089
+ else if ("object" == typeof e) if (Array.isArray(e)) {
1090
+ var o = e.length;
1091
+ for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
1092
+ } else for (f in e) e[f] && (n && (n += " "), n += f);
1093
+ return n;
1094
+ }
1095
+ function clsx() {
1096
+ for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
1097
+ return n;
1098
+ }
1099
+ //#endregion
1100
+ //#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-theme/src/client/AppearanceRow.module.css.mjs
1101
+ const css = ".BphuTq_group{border-bottom:.5px solid var(--qilin-alias-border-l2);flex-direction:column;gap:8px;padding:16px 0;display:flex}.BphuTq_title{color:var(--qilin-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.BphuTq_cubeRow{flex-wrap:wrap;align-items:stretch;gap:8px;display:flex}.BphuTq_themeCube{box-sizing:border-box;border:.5px solid var(--qilin-alias-border-l4);border-radius:var(--qilin-radius-xl);font:inherit;color:var(--qilin-alias-label-primary);cursor:pointer;background:0 0;flex-direction:column;flex:180px;justify-content:center;align-items:center;gap:4px;padding:20px 32px;font-size:14px;line-height:22px;display:flex}.BphuTq_themeCube:hover:not(.BphuTq_selected){background:var(--qilin-alias-interactive-bg-hover)}.BphuTq_selected{background:var(--qilin-alias-bg-module-platform);border-color:var(--qilin-static-neutral-bluish-400)}";
1102
+ const tagId = "@qilin-agent/client-ui-theme/AppearanceRow.module.css";
1103
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
1104
+ const tag = document.createElement("style");
1105
+ tag.dataset.plugin = "@qilin-agent/client-ui-theme";
1106
+ tag.dataset.pluginCss = tagId;
1107
+ tag.textContent = css;
1108
+ document.head.appendChild(tag);
1109
+ }
1110
+ var AppearanceRow_module_css_default = {
1111
+ "cubeRow": "BphuTq_cubeRow",
1112
+ "group": "BphuTq_group",
1113
+ "selected": "BphuTq_selected",
1114
+ "themeCube": "BphuTq_themeCube",
1115
+ "title": "BphuTq_title"
1116
+ };
1117
+ //#endregion
1118
+ //#region lib/types/client/AppearanceRow.js
1119
+ /**
1120
+ * Appearance preference row registered into the General section item slot
1121
+ * (figma 501:30012 'Frame 2117131228'): title + three preference cubes.
1122
+ * Registered by this package — the theme feature owns its own settings
1123
+ * surface. Selection follows the persisted preference, never the resolved
1124
+ * active theme.
1125
+ */
1126
+ /** Cube order and icons (figma 501:30015-30017: Light, Dark, System). */
1127
+ const CUBES = [
1128
+ {
1129
+ id: "light",
1130
+ labelKey: "appearance.light",
1131
+ Icon: _qilin_agent_client_ui_primitives.IconLightOutline16
1132
+ },
1133
+ {
1134
+ id: "dark",
1135
+ labelKey: "appearance.dark",
1136
+ Icon: _qilin_agent_client_ui_primitives.IconDarkOutline16
1137
+ },
1138
+ {
1139
+ id: "system",
1140
+ labelKey: "appearance.system",
1141
+ Icon: _qilin_agent_client_ui_primitives.IconFollowsystemOutline16
1142
+ }
1143
+ ];
1144
+ /**
1145
+ * Render the Appearance row.
1146
+ * @param props - composed slot props.
1147
+ * @returns the row element tree.
1148
+ */
1149
+ function AppearanceRow({ t, setTheme, useStore }) {
1150
+ const preference = useStore((s) => s.preference);
1151
+ return (0, react_jsx_runtime.jsxs)("div", {
1152
+ className: AppearanceRow_module_css_default.group,
1153
+ children: [(0, react_jsx_runtime.jsx)("div", {
1154
+ className: AppearanceRow_module_css_default.title,
1155
+ children: t("appearance.title")
1156
+ }), (0, react_jsx_runtime.jsx)("div", {
1157
+ className: AppearanceRow_module_css_default.cubeRow,
1158
+ children: CUBES.map(({ id, labelKey, Icon }) => (0, react_jsx_runtime.jsxs)("button", {
1159
+ type: "button",
1160
+ className: clsx(AppearanceRow_module_css_default.themeCube, preference === id && AppearanceRow_module_css_default.selected),
1161
+ "aria-pressed": preference === id,
1162
+ onClick: () => {
1163
+ setTheme(id);
1164
+ },
1165
+ children: [(0, react_jsx_runtime.jsx)(Icon, {}), t(labelKey)]
1166
+ }, id))
1167
+ })]
1168
+ });
1169
+ }
1170
+ //#endregion
1171
+ //#region lib/types/client/settings-store.js
1172
+ /**
1173
+ * Appearance and typography settings-row slot stores: mirrors of the theme
1174
+ * service snapshot. The plugin's apply-world change listener is the only
1175
+ * writer; the rows read their fields via props.useStore.
1176
+ */
1177
+ /**
1178
+ * Declares the Appearance row state and write surface.
1179
+ * @returns the store handle.
1180
+ */
1181
+ function createAppearanceRowStore() {
1182
+ return (0, _qilin_agent_client_store.defineStore)({
1183
+ init: () => ({
1184
+ preference: DEFAULT_PREFERENCE,
1185
+ revision: -1
1186
+ }),
1187
+ actions: { sync: (d, preference, revision) => {
1188
+ if (revision <= d.revision) return;
1189
+ d.preference = preference;
1190
+ d.revision = revision;
1191
+ } }
1192
+ });
1193
+ }
1194
+ /**
1195
+ * Declares the shared typography-row state and write surface.
1196
+ * @returns the store handle.
1197
+ */
1198
+ function createTypographyRowStore() {
1199
+ return (0, _qilin_agent_client_store.defineStore)({
1200
+ init: () => ({
1201
+ fontSize: 14,
1202
+ leading: 0,
1203
+ revision: -1
1204
+ }),
1205
+ actions: { sync: (d, fontSize, leading, revision) => {
1206
+ if (revision <= d.revision) return;
1207
+ d.fontSize = fontSize;
1208
+ d.leading = leading;
1209
+ d.revision = revision;
1210
+ } }
1211
+ });
1212
+ }
1213
+ //#endregion
1214
+ //#region \0qilin-inline-css:/home/runner/work/QiLin/QiLin/packages/client/ui-theme/src/styles/base.css.mjs
1215
+ var base_css_default = ":root{--qilin-font-family:-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;--ds-font-family-code:\"SF Mono\", \"JetBrains Mono\", \"Fira Code\", Consolas, \"Liberation Mono\", Menlo, Courier, \"PingFang SC\", \"Microsoft YaHei\";--ds-ease-in-out:cubic-bezier(.4, 0, .2, 1);--ds-transition-duration:.2s;--ds-transition-duration-fast:.1s;--ds-transition-duration-slow:.3s;--qilin-radius-xs:4px;--qilin-radius-sm:8px;--qilin-radius-md:12px;--qilin-radius-lg:16px;--qilin-radius-xl:20px;--qilin-radius-panel:28px}[data-dsh-automatic-focus]:focus,[data-dsh-automatic-focus]:focus:focus-visible{outline:none}";
1216
+ //#endregion
1217
+ //#region \0qilin-inline-css:/home/runner/work/QiLin/QiLin/packages/client/ui-theme/src/styles/corner-shape.css.mjs
1218
+ var corner_shape_css_default = "@supports (corner-shape:superellipse(1.5)){:root{--qilin-corner-shape:superellipse(1.5)}*,:before,:after{corner-shape:var(--qilin-corner-shape)}}";
1219
+ //#endregion
1220
+ //#region \0qilin-inline-css:/home/runner/work/QiLin/QiLin/packages/client/ui-theme/src/styles/design-platform.css.mjs
1221
+ var design_platform_css_default = "body{--qilin-static-amber-100:#fef5e7;--qilin-static-amber-400:#f7ad31;--qilin-static-amber-500:#f59e0b;--qilin-static-amber-600:#dd8629;--qilin-static-amber-900:#27241f;--qilin-static-blue-100:#dbeafe;--qilin-static-blue-300:#93c5fd;--qilin-static-blue-400:#60a5fa;--qilin-static-blue-450:#4d93f8;--qilin-static-blue-500:#3b82f6;--qilin-static-blue-50:#eff6ff;--qilin-static-blue-50p:#eaf3ff;--qilin-static-blue-600:#2563eb;--qilin-static-blue-75:#e5f0ff;--qilin-static-blue-800:#1e40af;--qilin-static-blue-900:#0e3074;--qilin-static-blue-950:#172554;--qilin-static-deepseek-100:#e4edfd;--qilin-static-deepseek-200:#d3e2ff;--qilin-static-deepseek-300:#b7c8fe;--qilin-static-deepseek-400:#679efe;--qilin-static-deepseek-450:#5686fe;--qilin-static-deepseek-500:#4176e6;--qilin-static-deepseek-50:#edf3fe;--qilin-static-deepseek-600:#4868b2;--qilin-static-deepseek-700-delete:#2f4c8f;--qilin-static-deepseek-800:#34415b;--qilin-static-deepseek-900:#283142;--qilin-static-green-100:#e6faed;--qilin-static-green-400:#4ed17e;--qilin-static-green-500:#22c55e;--qilin-static-green-900:#233c2c;--qilin-static-neutral-00:#fff;--qilin-static-neutral-1000:#000;--qilin-static-neutral-100:#f5f5f5;--qilin-static-neutral-150:#ededed;--qilin-static-neutral-200:#e5e5e5;--qilin-static-neutral-250:#dcdcdc;--qilin-static-neutral-300:#d4d4d4;--qilin-static-neutral-400:#a2a4a6;--qilin-static-neutral-500:#7f8287;--qilin-static-neutral-50:#fafafa;--qilin-static-neutral-550:#65676b;--qilin-static-neutral-600:#545557;--qilin-static-neutral-700:#3c3c3d;--qilin-static-neutral-800:#292929;--qilin-static-neutral-850:#212123;--qilin-static-neutral-900:#0f0f0f;--qilin-static-neutral-bluish-00:#fff;--qilin-static-neutral-bluish-1000:#0f1115;--qilin-static-neutral-bluish-100:#ebeef2;--qilin-static-neutral-bluish-150:#e9ecf2;--qilin-static-neutral-bluish-200:#e1e5ee;--qilin-static-neutral-bluish-300:#cfd3d6;--qilin-static-neutral-bluish-400:#adb2b8;--qilin-static-neutral-bluish-500:#979da6;--qilin-static-neutral-bluish-50:#f9fafb;--qilin-static-neutral-bluish-600:#81858c;--qilin-static-neutral-bluish-60:#f5f6f7;--qilin-static-neutral-bluish-700:#61666b;--qilin-static-neutral-bluish-750:#43454a;--qilin-static-neutral-bluish-75:#f1f3f5;--qilin-static-neutral-bluish-800:#353638;--qilin-static-neutral-bluish-850:#2c2c2e;--qilin-static-neutral-bluish-875:#232324;--qilin-static-neutral-bluish-900:#1b1b1c;--qilin-static-neutral-bluish-950:#151517;--qilin-static-red-100:#fee2e2;--qilin-static-red-400:#f25a5a;--qilin-static-red-500:#ef4444;--qilin-static-red-50:#fef2f2;--qilin-static-red-600:#ec1313;--qilin-static-red-900:#570c0c}body[data-ds-dark-theme]{--qilin-static-amber-100:#fef5e7;--qilin-static-amber-400:#f7ad31;--qilin-static-amber-500:#f59e0b;--qilin-static-amber-600:#dd8629;--qilin-static-amber-900:#27241f;--qilin-static-blue-100:#dbeafe;--qilin-static-blue-300:#93c5fd;--qilin-static-blue-400:#60a5fa;--qilin-static-blue-450:#4d93f8;--qilin-static-blue-500:#3b82f6;--qilin-static-blue-50:#eff6ff;--qilin-static-blue-50p:#eaf3ff;--qilin-static-blue-600:#2563eb;--qilin-static-blue-75:#e5f0ff;--qilin-static-blue-800:#1e40af;--qilin-static-blue-900:#0e3074;--qilin-static-blue-950:#172554;--qilin-static-deepseek-100:#e4edfd;--qilin-static-deepseek-200:#d3e2ff;--qilin-static-deepseek-300:#b7c8fe;--qilin-static-deepseek-400:#679efe;--qilin-static-deepseek-450:#5686fe;--qilin-static-deepseek-500:#4176e6;--qilin-static-deepseek-50:#edf3fe;--qilin-static-deepseek-600:#4868b2;--qilin-static-deepseek-700-delete:#2f4c8f;--qilin-static-deepseek-800:#34415b;--qilin-static-deepseek-900:#283142;--qilin-static-green-100:#e6faed;--qilin-static-green-400:#4ed17e;--qilin-static-green-500:#22c55e;--qilin-static-green-900:#233c2c;--qilin-static-neutral-00:#fff;--qilin-static-neutral-1000:#000;--qilin-static-neutral-100:#f5f5f5;--qilin-static-neutral-150:#ededed;--qilin-static-neutral-200:#e5e5e5;--qilin-static-neutral-250:#dcdcdc;--qilin-static-neutral-300:#d4d4d4;--qilin-static-neutral-400:#a2a4a6;--qilin-static-neutral-500:#7f8287;--qilin-static-neutral-50:#fafafa;--qilin-static-neutral-550:#65676b;--qilin-static-neutral-600:#545557;--qilin-static-neutral-700:#3c3c3d;--qilin-static-neutral-800:#292929;--qilin-static-neutral-850:#212123;--qilin-static-neutral-900:#0f0f0f;--qilin-static-neutral-bluish-00:#fff;--qilin-static-neutral-bluish-1000:#0f1115;--qilin-static-neutral-bluish-100:#ebeef2;--qilin-static-neutral-bluish-150:#e9ecf2;--qilin-static-neutral-bluish-200:#e1e5ee;--qilin-static-neutral-bluish-300:#cfd3d6;--qilin-static-neutral-bluish-400:#adb2b8;--qilin-static-neutral-bluish-500:#979da6;--qilin-static-neutral-bluish-50:#f9fafb;--qilin-static-neutral-bluish-600:#81858c;--qilin-static-neutral-bluish-60:#f9fafb;--qilin-static-neutral-bluish-700:#61666b;--qilin-static-neutral-bluish-750:#43454a;--qilin-static-neutral-bluish-75:#f1f3f5;--qilin-static-neutral-bluish-800:#353638;--qilin-static-neutral-bluish-850:#2c2c2e;--qilin-static-neutral-bluish-875:#232324;--qilin-static-neutral-bluish-900:#1b1b1c;--qilin-static-neutral-bluish-950:#151517;--qilin-static-red-100:#fee2e2;--qilin-static-red-400:#f25a5a;--qilin-static-red-500:#ef4444;--qilin-static-red-50:#fef2f2;--qilin-static-red-600:#ec1313;--qilin-static-red-900:#570c0c}body{--qilin-alias-bg-base:var(--qilin-static-neutral-bluish-00);--qilin-alias-bg-document-preview:var(--qilin-static-neutral-bluish-750);--qilin-alias-label-document-preview:var(--qilin-static-neutral-bluish-200);--qilin-alias-bg-layer-1:var(--qilin-static-neutral-bluish-00);--qilin-alias-bg-layer-2:var(--qilin-static-neutral-bluish-00);--qilin-alias-bg-layer-3:var(--qilin-static-neutral-bluish-00);--qilin-alias-bg-mask-1:#0000003d;--qilin-alias-bg-mask-2:#0000001f;--qilin-alias-bg-mask-3:#0000007a;--qilin-alias-bg-mask-photo:#000000e0;--qilin-alias-bg-mask-drop:#ffffffb3;--qilin-alias-bg-module-platform:var(--qilin-static-neutral-bluish-60);--qilin-alias-bg-multi-select:var(--qilin-static-neutral-bluish-60);--qilin-alias-bg-overlay:var(--qilin-static-neutral-bluish-150);--qilin-alias-bg-skeleton:#0000000a;--qilin-alias-border-inverted2:#0000;--qilin-alias-border-inverted:#0000;--qilin-alias-border-l1:#0000000a;--qilin-alias-border-l2-darkmode-thin:#0000001a;--qilin-alias-border-l2:#0000001a;--qilin-alias-border-l3:#0000001f;--qilin-alias-border-l4:#00000029;--qilin-alias-brand-primary-invert:var(--qilin-static-neutral-bluish-1000);--qilin-alias-brand-primary-new-colorprimary-new-color:#4176e6;--qilin-alias-brand-primary:var(--qilin-static-neutral-bluish-1000);--qilin-alias-brand-text:var(--qilin-static-neutral-bluish-1000);--qilin-alias-button-contrast-fill:var(--qilin-static-neutral-bluish-700);--qilin-alias-button-elevated-fill:var(--qilin-static-neutral-bluish-00);--qilin-alias-button-floating-fill:var(--qilin-static-neutral-bluish-00);--qilin-alias-button-floating-hover:var(--qilin-static-neutral-bluish-75);--qilin-alias-button-ghost-active-border:var(--qilin-static-neutral-bluish-500);--qilin-alias-button-ghost-active-fill:var(--qilin-static-neutral-bluish-100);--qilin-alias-button-ghost-active-hover:var(--qilin-static-neutral-bluish-150);--qilin-alias-button-info-fill:var(--qilin-static-deepseek-500);--qilin-alias-button-info-hover:var(--qilin-static-deepseek-400);--qilin-alias-button-primary-dimmed:var(--qilin-static-neutral-bluish-100);--qilin-alias-button-primary-fill:var(--qilin-alias-brand-primary);--qilin-alias-button-primary-hover:var(--qilin-static-neutral-bluish-750);--qilin-alias-button-tool-bar-fill-invisible:#1f1f1f5c;--qilin-alias-button-tool-bar-fill:#54555780;--qilin-alias-button-tool-bar-hover:#54555799;--qilin-alias-interactive-bg-active:#2631481a;--qilin-alias-interactive-bg-hover-accent:#26314824;--qilin-alias-interactive-bg-hover-danger:#ec13130d;--qilin-alias-interactive-bg-hover-solid:var(--qilin-static-neutral-bluish-75);--qilin-alias-interactive-bg-hover:#2631480f;--qilin-alias-turn-trigger-bg:var(--qilin-alias-markdown-code-block);--qilin-alias-turn-trigger-bg-hover:var(--qilin-alias-interactive-bg-hover);--qilin-alias-menu-group-header-fill:#f8f9faf0;--qilin-alias-label-caption:var(--qilin-static-neutral-bluish-400);--qilin-alias-label-running:color-mix(in srgb, var(--qilin-static-deepseek-500) 70%, var(--qilin-static-blue-950));--qilin-alias-label-running-shimmer:color-mix(in srgb, var(--qilin-static-deepseek-500) 30%, var(--qilin-static-blue-950));--qilin-alias-label-dimmed:var(--qilin-static-neutral-bluish-200);--qilin-alias-label-primary-bluish:var(--qilin-static-blue-900);--qilin-alias-label-primary-dimmed:var(--qilin-static-neutral-bluish-950);--qilin-alias-label-primary-foreground:var(--qilin-static-neutral-bluish-00);--qilin-alias-label-primary-inverted:var(--qilin-static-neutral-bluish-00);--qilin-alias-label-primary:var(--qilin-static-neutral-bluish-1000);--qilin-alias-label-secondary:var(--qilin-static-neutral-bluish-700);--qilin-alias-label-shimmer:color-mix(in srgb, var(--qilin-static-neutral-1000) 30%, transparent);--qilin-alias-label-tertiary:var(--qilin-static-neutral-bluish-600);--qilin-alias-link:var(--qilin-static-deepseek-500);--qilin-alias-markdown-citation:var(--qilin-static-neutral-bluish-100);--qilin-alias-markdown-code-block-banner:var(--qilin-static-neutral-bluish-50);--qilin-alias-markdown-code-block:var(--qilin-static-neutral-bluish-50);--qilin-alias-markdown-code-segment-selected:var(--qilin-static-neutral-bluish-00);--qilin-alias-markdown-code-segment-unselected:var(--qilin-static-neutral-bluish-75);--qilin-alias-markdown-inline-code:var(--qilin-static-neutral-50);--qilin-alias-markdown-placeholder:var(--qilin-static-neutral-bluish-60);--qilin-alias-markdown-tag:var(--qilin-static-neutral-bluish-75);--qilin-alias-scrollbar-bg-l1:var(--qilin-static-neutral-200);--qilin-alias-scrollbar-bg-l2:var(--qilin-static-neutral-200);--qilin-alias-scrollbar-hover-l1:var(--qilin-static-neutral-300);--qilin-alias-scrollbar-hover-l2:var(--qilin-static-neutral-300);--qilin-alias-state-business-primary:var(--qilin-static-deepseek-500);--qilin-alias-state-business-tertiary:var(--qilin-static-deepseek-100);--qilin-alias-state-error-primary:var(--qilin-static-red-600);--qilin-alias-state-error-secondary:var(--qilin-static-red-400);--qilin-alias-state-success-primary:var(--qilin-static-green-500);--qilin-alias-state-success-secondary:var(--qilin-static-green-400);--qilin-alias-state-success-tertiary:var(--qilin-static-green-100);--qilin-alias-state-warn-label:var(--qilin-static-amber-600);--qilin-alias-state-warn-primary:var(--qilin-static-amber-500);--qilin-alias-state-warn-secondary:var(--qilin-static-amber-400);--qilin-alias-state-warn-tertiary:var(--qilin-static-amber-100);--qilin-alias-toast-bg:var(--qilin-static-neutral-bluish-800);--qilin-alias-tooltip-bg:var(--qilin-static-neutral-bluish-850);--qilin-alias-tooltip-key-bg:color-mix(in srgb, var(--qilin-alias-tooltip-bg), white 18%);--qilin-specific-bubble-highlight:var(--qilin-static-deepseek-200);--qilin-specific-bubble:var(--qilin-static-deepseek-50);--qilin-specific-input-major:var(--qilin-static-neutral-bluish-00);--qilin-specific-login-input:var(--qilin-static-neutral-bluish-50);--qilin-specific-menu:var(--qilin-alias-bg-layer-3);--qilin-specific-selector:var(--qilin-static-neutral-bluish-60);--qilin-specific-sidebar-fill:var(--qilin-static-neutral-bluish-50);--qilin-specific-sidebar-nav-item-active-accent:var(--qilin-static-deepseek-100);--qilin-specific-sidebar-nav-item-active:var(--qilin-static-neutral-bluish-100);--qilin-specific-sidebar-nav-item-hover:var(--qilin-static-neutral-bluish-75);--qilin-specific-tip:var(--qilin-static-neutral-bluish-60);background-color:var(--qilin-alias-bg-base)}body[data-ds-dark-theme]{--qilin-alias-bg-base:var(--qilin-static-neutral-bluish-950);--qilin-alias-bg-document-preview:var(--qilin-static-neutral-bluish-950);--qilin-alias-label-document-preview:var(--qilin-static-neutral-bluish-300);--qilin-alias-bg-layer-1:var(--qilin-static-neutral-bluish-875);--qilin-alias-bg-layer-2:var(--qilin-static-neutral-bluish-850);--qilin-alias-bg-layer-3:var(--qilin-static-neutral-bluish-800);--qilin-alias-bg-mask-1:#00000080;--qilin-alias-bg-mask-2:#0003;--qilin-alias-bg-mask-3:#0000007a;--qilin-alias-bg-mask-photo:#000000e0;--qilin-alias-bg-mask-drop:#272730b3;--qilin-alias-bg-module-platform:var(--qilin-static-neutral-bluish-800);--qilin-alias-bg-multi-select:var(--qilin-static-neutral-850);--qilin-alias-bg-overlay:var(--qilin-static-neutral-bluish-700);--qilin-alias-bg-skeleton:#ffffff14;--qilin-alias-border-inverted2:#ffffff14;--qilin-alias-border-inverted:#ffffff0f;--qilin-alias-border-l1:#ffffff0f;--qilin-alias-border-l2-darkmode-thin:#ffffff0f;--qilin-alias-border-l2:#ffffff1f;--qilin-alias-border-l3:#ffffff29;--qilin-alias-border-l4:#fff3;--qilin-alias-brand-primary-invert:var(--qilin-static-neutral-bluish-50);--qilin-alias-brand-primary-new-colorprimary-new-color:var(--qilin-static-deepseek-450);--qilin-alias-brand-primary:var(--qilin-static-neutral-bluish-50);--qilin-alias-brand-text:var(--qilin-static-neutral-bluish-50);--qilin-alias-button-contrast-fill:var(--qilin-static-neutral-bluish-50);--qilin-alias-button-elevated-fill:var(--qilin-static-neutral-bluish-750);--qilin-alias-button-floating-fill:var(--qilin-static-neutral-bluish-850);--qilin-alias-button-floating-hover:var(--qilin-static-neutral-bluish-800);--qilin-alias-button-ghost-active-border:var(--qilin-static-neutral-bluish-600);--qilin-alias-button-ghost-active-fill:var(--qilin-static-neutral-bluish-750);--qilin-alias-button-ghost-active-hover:var(--qilin-static-neutral-bluish-700);--qilin-alias-button-info-fill:var(--qilin-static-deepseek-400);--qilin-alias-button-info-hover:var(--qilin-static-deepseek-500);--qilin-alias-button-primary-dimmed:var(--qilin-static-neutral-bluish-750);--qilin-alias-button-primary-fill:var(--qilin-alias-brand-primary);--qilin-alias-button-primary-hover:var(--qilin-static-neutral-bluish-100);--qilin-alias-button-tool-bar-fill-invisible:#1f1f1f5c;--qilin-alias-button-tool-bar-fill:#54555780;--qilin-alias-button-tool-bar-hover:#54555799;--qilin-alias-interactive-bg-active:#ffffff24;--qilin-alias-interactive-bg-hover-accent:#ffffff3d;--qilin-alias-interactive-bg-hover-danger:#f25a5a26;--qilin-alias-interactive-bg-hover-solid:var(--qilin-static-neutral-bluish-800);--qilin-alias-interactive-bg-hover:#ffffff14;--qilin-alias-turn-trigger-bg:var(--qilin-alias-interactive-bg-hover);--qilin-alias-turn-trigger-bg-hover:var(--qilin-alias-interactive-bg-active);--qilin-alias-menu-group-header-fill:#303136f0;--qilin-alias-label-caption:var(--qilin-static-neutral-bluish-600);--qilin-alias-label-running:color-mix(in srgb, var(--qilin-static-deepseek-450) 55%, var(--qilin-static-neutral-bluish-400));--qilin-alias-label-running-shimmer:color-mix(in srgb, var(--qilin-static-blue-300) 65%, var(--qilin-static-deepseek-400));--qilin-alias-label-dimmed:var(--qilin-static-neutral-bluish-750);--qilin-alias-label-primary-bluish:var(--qilin-static-neutral-bluish-50);--qilin-alias-label-primary-dimmed:var(--qilin-static-neutral-bluish-100);--qilin-alias-label-primary-foreground:var(--qilin-static-neutral-bluish-1000);--qilin-alias-label-primary-inverted:var(--qilin-static-neutral-bluish-800);--qilin-alias-label-primary:var(--qilin-static-neutral-bluish-50);--qilin-alias-label-secondary:var(--qilin-static-neutral-bluish-300);--qilin-alias-label-shimmer:color-mix(in srgb, var(--qilin-static-neutral-00) 45%, transparent);--qilin-alias-label-tertiary:var(--qilin-static-neutral-bluish-400);--qilin-alias-link:var(--qilin-static-deepseek-400);--qilin-alias-markdown-citation:var(--qilin-static-neutral-bluish-800);--qilin-alias-markdown-code-block-banner:var(--qilin-static-neutral-bluish-850);--qilin-alias-markdown-code-block:var(--qilin-static-neutral-bluish-900);--qilin-alias-markdown-code-segment-selected:var(--qilin-static-neutral-bluish-800);--qilin-alias-markdown-code-segment-unselected:var(--qilin-static-neutral-bluish-900);--qilin-alias-markdown-inline-code:var(--qilin-static-neutral-800);--qilin-alias-markdown-placeholder:var(--qilin-static-neutral-bluish-850);--qilin-alias-markdown-tag:var(--qilin-static-neutral-bluish-850);--qilin-alias-scrollbar-bg-l1:var(--qilin-static-neutral-700);--qilin-alias-scrollbar-bg-l2:var(--qilin-static-neutral-600);--qilin-alias-scrollbar-hover-l1:var(--qilin-static-neutral-600);--qilin-alias-scrollbar-hover-l2:var(--qilin-static-neutral-550);--qilin-alias-state-business-primary:var(--qilin-static-deepseek-400);--qilin-alias-state-business-tertiary:var(--qilin-static-deepseek-800);--qilin-alias-state-error-primary:var(--qilin-static-red-400);--qilin-alias-state-error-secondary:var(--qilin-static-red-400);--qilin-alias-state-success-primary:var(--qilin-static-green-500);--qilin-alias-state-success-secondary:var(--qilin-static-green-400);--qilin-alias-state-success-tertiary:var(--qilin-static-green-900);--qilin-alias-state-warn-label:var(--qilin-static-amber-600);--qilin-alias-state-warn-primary:var(--qilin-static-amber-500);--qilin-alias-state-warn-secondary:var(--qilin-static-amber-400);--qilin-alias-state-warn-tertiary:var(--qilin-static-amber-900);--qilin-alias-toast-bg:var(--qilin-static-neutral-bluish-750);--qilin-alias-tooltip-bg:var(--qilin-static-neutral-bluish-750);--qilin-alias-tooltip-key-bg:color-mix(in srgb, var(--qilin-alias-tooltip-bg), white 18%);--qilin-specific-bubble-highlight:var(--qilin-static-neutral-bluish-750);--qilin-specific-bubble:var(--qilin-static-neutral-bluish-850);--qilin-specific-input-major:var(--qilin-static-neutral-bluish-850);--qilin-specific-login-input:var(--qilin-static-neutral-bluish-900);--qilin-specific-menu:var(--qilin-alias-bg-layer-3);--qilin-specific-selector:var(--qilin-static-neutral-bluish-800);--qilin-specific-sidebar-fill:var(--qilin-static-neutral-bluish-900);--qilin-specific-sidebar-nav-item-active-accent:var(--qilin-static-neutral-bluish-800);--qilin-specific-sidebar-nav-item-active:var(--qilin-static-neutral-bluish-750);--qilin-specific-sidebar-nav-item-hover:var(--qilin-static-neutral-bluish-850);--qilin-specific-tip:var(--qilin-static-neutral-bluish-800)}[data-theme=light]{--qilin-alias-switch-thumb:white}[data-theme=dark]{--qilin-alias-switch-thumb:var(--qilin-static-neutral-bluish-400)}[data-theme=light]{--qilin-alias-bg-document-selection:#658eff52}[data-theme=dark]{--qilin-alias-bg-document-selection:#658eff73}";
1222
+ //#endregion
1223
+ //#region \0qilin-inline-css:/home/runner/work/QiLin/QiLin/packages/client/ui-theme/src/styles/dsw-compat.css.mjs
1224
+ var dsw_compat_css_default = "body{--dsw-alias-bg:var(--qilin-alias-bg);--dsw-alias-bg-base:var(--qilin-alias-bg-base);--dsw-alias-bg-document-preview:var(--qilin-alias-bg-document-preview);--dsw-alias-bg-document-selection:var(--qilin-alias-bg-document-selection);--dsw-alias-bg-l1:var(--qilin-alias-bg-l1);--dsw-alias-bg-l2:var(--qilin-alias-bg-l2);--dsw-alias-bg-layer-0:var(--qilin-alias-bg-layer-0);--dsw-alias-bg-layer-1:var(--qilin-alias-bg-layer-1);--dsw-alias-bg-layer-2:var(--qilin-alias-bg-layer-2);--dsw-alias-bg-layer-3:var(--qilin-alias-bg-layer-3);--dsw-alias-bg-layer-4:var(--qilin-alias-bg-layer-4);--dsw-alias-bg-mask-1:var(--qilin-alias-bg-mask-1);--dsw-alias-bg-mask-2:var(--qilin-alias-bg-mask-2);--dsw-alias-bg-mask-3:var(--qilin-alias-bg-mask-3);--dsw-alias-bg-mask-drop:var(--qilin-alias-bg-mask-drop);--dsw-alias-bg-mask-photo:var(--qilin-alias-bg-mask-photo);--dsw-alias-bg-module-platform:var(--qilin-alias-bg-module-platform);--dsw-alias-bg-multi-select:var(--qilin-alias-bg-multi-select);--dsw-alias-bg-overlay:var(--qilin-alias-bg-overlay);--dsw-alias-bg-skeleton:var(--qilin-alias-bg-skeleton);--dsw-alias-border-inverted:var(--qilin-alias-border-inverted);--dsw-alias-border-inverted2:var(--qilin-alias-border-inverted2);--dsw-alias-border-l:var(--qilin-alias-border-l);--dsw-alias-border-l1:var(--qilin-alias-border-l1);--dsw-alias-border-l2:var(--qilin-alias-border-l2);--dsw-alias-border-l2-darkmode-thin:var(--qilin-alias-border-l2-darkmode-thin);--dsw-alias-border-l3:var(--qilin-alias-border-l3);--dsw-alias-border-l4:var(--qilin-alias-border-l4);--dsw-alias-brand-primary:var(--qilin-alias-brand-primary);--dsw-alias-brand-primary-invert:var(--qilin-alias-brand-primary-invert);--dsw-alias-brand-primary-new-colorprimary-new-color:var(--qilin-alias-brand-primary-new-colorprimary-new-color);--dsw-alias-brand-text:var(--qilin-alias-brand-text);--dsw-alias-button-contrast-fill:var(--qilin-alias-button-contrast-fill);--dsw-alias-button-elevated-fill:var(--qilin-alias-button-elevated-fill);--dsw-alias-button-floating-fill:var(--qilin-alias-button-floating-fill);--dsw-alias-button-floating-hover:var(--qilin-alias-button-floating-hover);--dsw-alias-button-ghost-active-border:var(--qilin-alias-button-ghost-active-border);--dsw-alias-button-ghost-active-fill:var(--qilin-alias-button-ghost-active-fill);--dsw-alias-button-ghost-active-hover:var(--qilin-alias-button-ghost-active-hover);--dsw-alias-button-info-fill:var(--qilin-alias-button-info-fill);--dsw-alias-button-info-hover:var(--qilin-alias-button-info-hover);--dsw-alias-button-primary-dimmed:var(--qilin-alias-button-primary-dimmed);--dsw-alias-button-primary-fill:var(--qilin-alias-button-primary-fill);--dsw-alias-button-primary-hover:var(--qilin-alias-button-primary-hover);--dsw-alias-button-tool-bar-fill:var(--qilin-alias-button-tool-bar-fill);--dsw-alias-button-tool-bar-fill-invisible:var(--qilin-alias-button-tool-bar-fill-invisible);--dsw-alias-button-tool-bar-hover:var(--qilin-alias-button-tool-bar-hover);--dsw-alias-fg:var(--qilin-alias-fg);--dsw-alias-fill-l1:var(--qilin-alias-fill-l1);--dsw-alias-fill-l2:var(--qilin-alias-fill-l2);--dsw-alias-fill-tertiary:var(--qilin-alias-fill-tertiary);--dsw-alias-fill-tsp-secondary:var(--qilin-alias-fill-tsp-secondary);--dsw-alias-interactive-bg-active:var(--qilin-alias-interactive-bg-active);--dsw-alias-interactive-bg-default:var(--qilin-alias-interactive-bg-default);--dsw-alias-interactive-bg-hover:var(--qilin-alias-interactive-bg-hover);--dsw-alias-interactive-bg-hover-accent:var(--qilin-alias-interactive-bg-hover-accent);--dsw-alias-interactive-bg-hover-danger:var(--qilin-alias-interactive-bg-hover-danger);--dsw-alias-interactive-bg-hover-solid:var(--qilin-alias-interactive-bg-hover-solid);--dsw-alias-label-caption:var(--qilin-alias-label-caption);--dsw-alias-label-deep-diving:var(--qilin-alias-label-running);--dsw-alias-label-deep-diving-shimmer:var(--qilin-alias-label-running-shimmer);--dsw-alias-label-dimmed:var(--qilin-alias-label-dimmed);--dsw-alias-label-document-preview:var(--qilin-alias-label-document-preview);--dsw-alias-label-error:var(--qilin-alias-label-error);--dsw-alias-label-primary:var(--qilin-alias-label-primary);--dsw-alias-label-primary-bluish:var(--qilin-alias-label-primary-bluish);--dsw-alias-label-primary-dimmed:var(--qilin-alias-label-primary-dimmed);--dsw-alias-label-primary-foreground:var(--qilin-alias-label-primary-foreground);--dsw-alias-label-primary-inverted:var(--qilin-alias-label-primary-inverted);--dsw-alias-label-quaternary:var(--qilin-alias-label-quaternary);--dsw-alias-label-secondary:var(--qilin-alias-label-secondary);--dsw-alias-label-shimmer:var(--qilin-alias-label-shimmer);--dsw-alias-label-tertiary:var(--qilin-alias-label-tertiary);--dsw-alias-link:var(--qilin-alias-link);--dsw-alias-markdown-citation:var(--qilin-alias-markdown-citation);--dsw-alias-markdown-code-block:var(--qilin-alias-markdown-code-block);--dsw-alias-markdown-code-block-banner:var(--qilin-alias-markdown-code-block-banner);--dsw-alias-markdown-code-segment-selected:var(--qilin-alias-markdown-code-segment-selected);--dsw-alias-markdown-code-segment-unselected:var(--qilin-alias-markdown-code-segment-unselected);--dsw-alias-markdown-inline-code:var(--qilin-alias-markdown-inline-code);--dsw-alias-markdown-placeholder:var(--qilin-alias-markdown-placeholder);--dsw-alias-markdown-tag:var(--qilin-alias-markdown-tag);--dsw-alias-menu-group-header-fill:var(--qilin-alias-menu-group-header-fill);--dsw-alias-menu-icon:var(--qilin-alias-menu-icon);--dsw-alias-scrim:var(--qilin-alias-scrim);--dsw-alias-scrollbar-bg-l1:var(--qilin-alias-scrollbar-bg-l1);--dsw-alias-scrollbar-bg-l2:var(--qilin-alias-scrollbar-bg-l2);--dsw-alias-scrollbar-hover-l1:var(--qilin-alias-scrollbar-hover-l1);--dsw-alias-scrollbar-hover-l2:var(--qilin-alias-scrollbar-hover-l2);--dsw-alias-separator-primary:var(--qilin-alias-separator-primary);--dsw-alias-state-business-primary:var(--qilin-alias-state-business-primary);--dsw-alias-state-business-primary-weak:var(--qilin-alias-state-business-primary-weak);--dsw-alias-state-business-tertiary:var(--qilin-alias-state-business-tertiary);--dsw-alias-state-error-primary:var(--qilin-alias-state-error-primary);--dsw-alias-state-error-secondary:var(--qilin-alias-state-error-secondary);--dsw-alias-state-success-primary:var(--qilin-alias-state-success-primary);--dsw-alias-state-success-secondary:var(--qilin-alias-state-success-secondary);--dsw-alias-state-success-tertiary:var(--qilin-alias-state-success-tertiary);--dsw-alias-state-warn-label:var(--qilin-alias-state-warn-label);--dsw-alias-state-warn-primary:var(--qilin-alias-state-warn-primary);--dsw-alias-state-warn-secondary:var(--qilin-alias-state-warn-secondary);--dsw-alias-state-warn-tertiary:var(--qilin-alias-state-warn-tertiary);--dsw-alias-state-warning-primary:var(--qilin-alias-state-warning-primary);--dsw-alias-surface-raised:var(--qilin-alias-surface-raised);--dsw-alias-switch-thumb:var(--qilin-alias-switch-thumb);--dsw-alias-text-1:var(--qilin-alias-text-1);--dsw-alias-text-2:var(--qilin-alias-text-2);--dsw-alias-text-3:var(--qilin-alias-text-3);--dsw-alias-text-link:var(--qilin-alias-text-link);--dsw-alias-text-primary:var(--qilin-alias-text-primary);--dsw-alias-toast-bg:var(--qilin-alias-toast-bg);--dsw-alias-tooltip-bg:var(--qilin-alias-tooltip-bg);--dsw-alias-tooltip-key-bg:var(--qilin-alias-tooltip-key-bg);--dsw-alias-turn-trigger-bg:var(--qilin-alias-turn-trigger-bg);--dsw-alias-turn-trigger-bg-hover:var(--qilin-alias-turn-trigger-bg-hover);--dsw-color-bg-accent:var(--qilin-color-bg-accent);--dsw-color-bg-accent-subtle:var(--qilin-color-bg-accent-subtle);--dsw-color-bg-primary:var(--qilin-color-bg-primary);--dsw-color-bg-subtle:var(--qilin-color-bg-subtle);--dsw-color-border-accent:var(--qilin-color-border-accent);--dsw-color-border-primary:var(--qilin-color-border-primary);--dsw-color-text-accent:var(--qilin-color-text-accent);--dsw-color-text-accent-contrast:var(--qilin-color-text-accent-contrast);--dsw-color-text-primary:var(--qilin-color-text-primary);--dsw-color-text-secondary:var(--qilin-color-text-secondary);--dsw-corner-shape:var(--qilin-corner-shape);--dsw-elevation-panel:var(--qilin-elevation-panel);--dsw-elevation-prominent:var(--qilin-elevation-prominent);--dsw-elevation-soft:var(--qilin-elevation-soft);--dsw-elevation-stroke:var(--qilin-elevation-stroke);--dsw-elevation-stroke-color:var(--qilin-elevation-stroke-color);--dsw-focus-ring-color:var(--qilin-focus-ring-color);--dsw-focus-ring-width:var(--qilin-focus-ring-width);--dsw-font:var(--qilin-font);--dsw-font-base-16:var(--qilin-font-base-16);--dsw-font-base-16-font-family:var(--qilin-font-base-16-font-family);--dsw-font-base-16-font-size:var(--qilin-font-base-16-font-size);--dsw-font-base-16-font-style:var(--qilin-font-base-16-font-style);--dsw-font-base-16-font-weight:var(--qilin-font-base-16-font-weight);--dsw-font-base-16-line-height:var(--qilin-font-base-16-line-height);--dsw-font-base-strong-16:var(--qilin-font-base-strong-16);--dsw-font-base-strong-16-font-family:var(--qilin-font-base-strong-16-font-family);--dsw-font-base-strong-16-font-size:var(--qilin-font-base-strong-16-font-size);--dsw-font-base-strong-16-font-style:var(--qilin-font-base-strong-16-font-style);--dsw-font-base-strong-16-font-weight:var(--qilin-font-base-strong-16-font-weight);--dsw-font-base-strong-16-line-height:var(--qilin-font-base-strong-16-line-height);--dsw-font-family:var(--qilin-font-family);--dsw-font-l-20:var(--qilin-font-l-20);--dsw-font-l-20-font-family:var(--qilin-font-l-20-font-family);--dsw-font-l-20-font-size:var(--qilin-font-l-20-font-size);--dsw-font-l-20-font-style:var(--qilin-font-l-20-font-style);--dsw-font-l-20-font-weight:var(--qilin-font-l-20-font-weight);--dsw-font-l-20-line-height:var(--qilin-font-l-20-line-height);--dsw-font-m-18:var(--qilin-font-m-18);--dsw-font-m-18-font-family:var(--qilin-font-m-18-font-family);--dsw-font-m-18-font-size:var(--qilin-font-m-18-font-size);--dsw-font-m-18-font-style:var(--qilin-font-m-18-font-style);--dsw-font-m-18-font-weight:var(--qilin-font-m-18-font-weight);--dsw-font-m-18-line-height:var(--qilin-font-m-18-line-height);--dsw-font-markdown-base:var(--qilin-font-markdown-base);--dsw-font-markdown-base-font-family:var(--qilin-font-markdown-base-font-family);--dsw-font-markdown-base-font-size:var(--qilin-font-markdown-base-font-size);--dsw-font-markdown-base-font-style:var(--qilin-font-markdown-base-font-style);--dsw-font-markdown-base-font-weight:var(--qilin-font-markdown-base-font-weight);--dsw-font-markdown-base-italic:var(--qilin-font-markdown-base-italic);--dsw-font-markdown-base-italic-font-family:var(--qilin-font-markdown-base-italic-font-family);--dsw-font-markdown-base-italic-font-size:var(--qilin-font-markdown-base-italic-font-size);--dsw-font-markdown-base-italic-font-style:var(--qilin-font-markdown-base-italic-font-style);--dsw-font-markdown-base-italic-font-weight:var(--qilin-font-markdown-base-italic-font-weight);--dsw-font-markdown-base-italic-line-height:var(--qilin-font-markdown-base-italic-line-height);--dsw-font-markdown-base-line-height:var(--qilin-font-markdown-base-line-height);--dsw-font-markdown-base-strong:var(--qilin-font-markdown-base-strong);--dsw-font-markdown-base-strong-font-family:var(--qilin-font-markdown-base-strong-font-family);--dsw-font-markdown-base-strong-font-size:var(--qilin-font-markdown-base-strong-font-size);--dsw-font-markdown-base-strong-font-style:var(--qilin-font-markdown-base-strong-font-style);--dsw-font-markdown-base-strong-font-weight:var(--qilin-font-markdown-base-strong-font-weight);--dsw-font-markdown-base-strong-italic:var(--qilin-font-markdown-base-strong-italic);--dsw-font-markdown-base-strong-italic-font-family:var(--qilin-font-markdown-base-strong-italic-font-family);--dsw-font-markdown-base-strong-italic-font-size:var(--qilin-font-markdown-base-strong-italic-font-size);--dsw-font-markdown-base-strong-italic-font-style:var(--qilin-font-markdown-base-strong-italic-font-style);--dsw-font-markdown-base-strong-italic-font-weight:var(--qilin-font-markdown-base-strong-italic-font-weight);--dsw-font-markdown-base-strong-italic-line-height:var(--qilin-font-markdown-base-strong-italic-line-height);--dsw-font-markdown-base-strong-line-height:var(--qilin-font-markdown-base-strong-line-height);--dsw-font-markdown-code:var(--qilin-font-markdown-code);--dsw-font-markdown-code-block:var(--qilin-font-markdown-code-block);--dsw-font-markdown-code-block-font-family:var(--qilin-font-markdown-code-block-font-family);--dsw-font-markdown-code-block-font-size:var(--qilin-font-markdown-code-block-font-size);--dsw-font-markdown-code-block-font-style:var(--qilin-font-markdown-code-block-font-style);--dsw-font-markdown-code-block-font-weight:var(--qilin-font-markdown-code-block-font-weight);--dsw-font-markdown-code-block-line-height:var(--qilin-font-markdown-code-block-line-height);--dsw-font-markdown-code-block-small:var(--qilin-font-markdown-code-block-small);--dsw-font-markdown-code-block-small-font-family:var(--qilin-font-markdown-code-block-small-font-family);--dsw-font-markdown-code-block-small-font-size:var(--qilin-font-markdown-code-block-small-font-size);--dsw-font-markdown-code-block-small-font-style:var(--qilin-font-markdown-code-block-small-font-style);--dsw-font-markdown-code-block-small-font-weight:var(--qilin-font-markdown-code-block-small-font-weight);--dsw-font-markdown-code-block-small-line-height:var(--qilin-font-markdown-code-block-small-line-height);--dsw-font-markdown-code-font-family:var(--qilin-font-markdown-code-font-family);--dsw-font-markdown-code-font-size:var(--qilin-font-markdown-code-font-size);--dsw-font-markdown-code-font-style:var(--qilin-font-markdown-code-font-style);--dsw-font-markdown-code-font-weight:var(--qilin-font-markdown-code-font-weight);--dsw-font-markdown-code-line-height:var(--qilin-font-markdown-code-line-height);--dsw-font-markdown-h1:var(--qilin-font-markdown-h1);--dsw-font-markdown-h1-font-family:var(--qilin-font-markdown-h1-font-family);--dsw-font-markdown-h1-font-size:var(--qilin-font-markdown-h1-font-size);--dsw-font-markdown-h1-font-style:var(--qilin-font-markdown-h1-font-style);--dsw-font-markdown-h1-font-weight:var(--qilin-font-markdown-h1-font-weight);--dsw-font-markdown-h1-line-height:var(--qilin-font-markdown-h1-line-height);--dsw-font-markdown-h2:var(--qilin-font-markdown-h2);--dsw-font-markdown-h2-font-family:var(--qilin-font-markdown-h2-font-family);--dsw-font-markdown-h2-font-size:var(--qilin-font-markdown-h2-font-size);--dsw-font-markdown-h2-font-style:var(--qilin-font-markdown-h2-font-style);--dsw-font-markdown-h2-font-weight:var(--qilin-font-markdown-h2-font-weight);--dsw-font-markdown-h2-line-height:var(--qilin-font-markdown-h2-line-height);--dsw-font-markdown-h3:var(--qilin-font-markdown-h3);--dsw-font-markdown-h3-font-family:var(--qilin-font-markdown-h3-font-family);--dsw-font-markdown-h3-font-size:var(--qilin-font-markdown-h3-font-size);--dsw-font-markdown-h3-font-style:var(--qilin-font-markdown-h3-font-style);--dsw-font-markdown-h3-font-weight:var(--qilin-font-markdown-h3-font-weight);--dsw-font-markdown-h3-line-height:var(--qilin-font-markdown-h3-line-height);--dsw-font-markdown-h4:var(--qilin-font-markdown-h4);--dsw-font-markdown-h4-font-family:var(--qilin-font-markdown-h4-font-family);--dsw-font-markdown-h4-font-size:var(--qilin-font-markdown-h4-font-size);--dsw-font-markdown-h4-font-style:var(--qilin-font-markdown-h4-font-style);--dsw-font-markdown-h4-font-weight:var(--qilin-font-markdown-h4-font-weight);--dsw-font-markdown-h4-line-height:var(--qilin-font-markdown-h4-line-height);--dsw-font-markdown-small:var(--qilin-font-markdown-small);--dsw-font-markdown-small-font-family:var(--qilin-font-markdown-small-font-family);--dsw-font-markdown-small-font-size:var(--qilin-font-markdown-small-font-size);--dsw-font-markdown-small-font-style:var(--qilin-font-markdown-small-font-style);--dsw-font-markdown-small-font-weight:var(--qilin-font-markdown-small-font-weight);--dsw-font-markdown-small-italic:var(--qilin-font-markdown-small-italic);--dsw-font-markdown-small-italic-font-family:var(--qilin-font-markdown-small-italic-font-family);--dsw-font-markdown-small-italic-font-size:var(--qilin-font-markdown-small-italic-font-size);--dsw-font-markdown-small-italic-font-style:var(--qilin-font-markdown-small-italic-font-style);--dsw-font-markdown-small-italic-font-weight:var(--qilin-font-markdown-small-italic-font-weight);--dsw-font-markdown-small-italic-line-height:var(--qilin-font-markdown-small-italic-line-height);--dsw-font-markdown-small-line-height:var(--qilin-font-markdown-small-line-height);--dsw-font-markdown-small-strong:var(--qilin-font-markdown-small-strong);--dsw-font-markdown-small-strong-font-family:var(--qilin-font-markdown-small-strong-font-family);--dsw-font-markdown-small-strong-font-size:var(--qilin-font-markdown-small-strong-font-size);--dsw-font-markdown-small-strong-font-style:var(--qilin-font-markdown-small-strong-font-style);--dsw-font-markdown-small-strong-font-weight:var(--qilin-font-markdown-small-strong-font-weight);--dsw-font-markdown-small-strong-italic:var(--qilin-font-markdown-small-strong-italic);--dsw-font-markdown-small-strong-italic-font-family:var(--qilin-font-markdown-small-strong-italic-font-family);--dsw-font-markdown-small-strong-italic-font-size:var(--qilin-font-markdown-small-strong-italic-font-size);--dsw-font-markdown-small-strong-italic-font-style:var(--qilin-font-markdown-small-strong-italic-font-style);--dsw-font-markdown-small-strong-italic-font-weight:var(--qilin-font-markdown-small-strong-italic-font-weight);--dsw-font-markdown-small-strong-italic-line-height:var(--qilin-font-markdown-small-strong-italic-line-height);--dsw-font-markdown-small-strong-line-height:var(--qilin-font-markdown-small-strong-line-height);--dsw-font-markdown-table:var(--qilin-font-markdown-table);--dsw-font-markdown-table-font-family:var(--qilin-font-markdown-table-font-family);--dsw-font-markdown-table-font-size:var(--qilin-font-markdown-table-font-size);--dsw-font-markdown-table-font-style:var(--qilin-font-markdown-table-font-style);--dsw-font-markdown-table-font-weight:var(--qilin-font-markdown-table-font-weight);--dsw-font-markdown-table-head:var(--qilin-font-markdown-table-head);--dsw-font-markdown-table-head-font-family:var(--qilin-font-markdown-table-head-font-family);--dsw-font-markdown-table-head-font-size:var(--qilin-font-markdown-table-head-font-size);--dsw-font-markdown-table-head-font-style:var(--qilin-font-markdown-table-head-font-style);--dsw-font-markdown-table-head-font-weight:var(--qilin-font-markdown-table-head-font-weight);--dsw-font-markdown-table-head-line-height:var(--qilin-font-markdown-table-head-line-height);--dsw-font-markdown-table-line-height:var(--qilin-font-markdown-table-line-height);--dsw-font-mono:var(--qilin-font-mono);--dsw-font-s-14:var(--qilin-font-s-14);--dsw-font-s-14-font-family:var(--qilin-font-s-14-font-family);--dsw-font-s-14-font-size:var(--qilin-font-s-14-font-size);--dsw-font-s-14-font-style:var(--qilin-font-s-14-font-style);--dsw-font-s-14-font-weight:var(--qilin-font-s-14-font-weight);--dsw-font-s-14-line-height:var(--qilin-font-s-14-line-height);--dsw-font-s-strong-14:var(--qilin-font-s-strong-14);--dsw-font-s-strong-14-font-family:var(--qilin-font-s-strong-14-font-family);--dsw-font-s-strong-14-font-size:var(--qilin-font-s-strong-14-font-size);--dsw-font-s-strong-14-font-style:var(--qilin-font-s-strong-14-font-style);--dsw-font-s-strong-14-font-weight:var(--qilin-font-s-strong-14-font-weight);--dsw-font-s-strong-14-line-height:var(--qilin-font-s-strong-14-line-height);--dsw-font-size-sm:var(--qilin-font-size-sm);--dsw-font-size-xs:var(--qilin-font-size-xs);--dsw-font-sm-13:var(--qilin-font-sm-13);--dsw-font-xl-24:var(--qilin-font-xl-24);--dsw-font-xl-24-font-family:var(--qilin-font-xl-24-font-family);--dsw-font-xl-24-font-size:var(--qilin-font-xl-24-font-size);--dsw-font-xl-24-font-style:var(--qilin-font-xl-24-font-style);--dsw-font-xl-24-font-weight:var(--qilin-font-xl-24-font-weight);--dsw-font-xl-24-line-height:var(--qilin-font-xl-24-line-height);--dsw-font-xs-12:var(--qilin-font-xs-12);--dsw-font-xs-13:var(--qilin-font-xs-13);--dsw-font-xs-13-font-family:var(--qilin-font-xs-13-font-family);--dsw-font-xs-13-font-size:var(--qilin-font-xs-13-font-size);--dsw-font-xs-13-font-style:var(--qilin-font-xs-13-font-style);--dsw-font-xs-13-font-weight:var(--qilin-font-xs-13-font-weight);--dsw-font-xs-13-line-height:var(--qilin-font-xs-13-line-height);--dsw-font-xs-strong-12:var(--qilin-font-xs-strong-12);--dsw-font-xs-strong-13:var(--qilin-font-xs-strong-13);--dsw-font-xs-strong-13-font-family:var(--qilin-font-xs-strong-13-font-family);--dsw-font-xs-strong-13-font-size:var(--qilin-font-xs-strong-13-font-size);--dsw-font-xs-strong-13-font-style:var(--qilin-font-xs-strong-13-font-style);--dsw-font-xs-strong-13-font-weight:var(--qilin-font-xs-strong-13-font-weight);--dsw-font-xs-strong-13-line-height:var(--qilin-font-xs-strong-13-line-height);--dsw-font-xxs-12:var(--qilin-font-xxs-12);--dsw-font-xxs-12-font-family:var(--qilin-font-xxs-12-font-family);--dsw-font-xxs-12-font-size:var(--qilin-font-xxs-12-font-size);--dsw-font-xxs-12-font-style:var(--qilin-font-xxs-12-font-style);--dsw-font-xxs-12-font-weight:var(--qilin-font-xxs-12-font-weight);--dsw-font-xxs-12-line-height:var(--qilin-font-xxs-12-line-height);--dsw-font-xxs-strong-12:var(--qilin-font-xxs-strong-12);--dsw-font-xxs-strong-12-font-family:var(--qilin-font-xxs-strong-12-font-family);--dsw-font-xxs-strong-12-font-size:var(--qilin-font-xxs-strong-12-font-size);--dsw-font-xxs-strong-12-font-style:var(--qilin-font-xxs-strong-12-font-style);--dsw-font-xxs-strong-12-font-weight:var(--qilin-font-xxs-strong-12-font-weight);--dsw-font-xxs-strong-12-line-height:var(--qilin-font-xxs-strong-12-line-height);--dsw-font-xxxs-11:var(--qilin-font-xxxs-11);--dsw-font-xxxs-11-font-family:var(--qilin-font-xxxs-11-font-family);--dsw-font-xxxs-11-font-size:var(--qilin-font-xxxs-11-font-size);--dsw-font-xxxs-11-font-style:var(--qilin-font-xxxs-11-font-style);--dsw-font-xxxs-11-font-weight:var(--qilin-font-xxxs-11-font-weight);--dsw-font-xxxs-11-line-height:var(--qilin-font-xxxs-11-line-height);--dsw-font-xxxs-strong-11:var(--qilin-font-xxxs-strong-11);--dsw-font-xxxs-strong-11-font-family:var(--qilin-font-xxxs-strong-11-font-family);--dsw-font-xxxs-strong-11-font-size:var(--qilin-font-xxxs-strong-11-font-size);--dsw-font-xxxs-strong-11-font-style:var(--qilin-font-xxxs-strong-11-font-style);--dsw-font-xxxs-strong-11-font-weight:var(--qilin-font-xxxs-strong-11-font-weight);--dsw-font-xxxs-strong-11-line-height:var(--qilin-font-xxxs-strong-11-line-height);--dsw-hovercard-bg:var(--qilin-hovercard-bg);--dsw-linear-gradient-think:var(--qilin-linear-gradient-think);--dsw-linear-think-select:var(--qilin-linear-think-select);--dsw-mask-blur:var(--qilin-mask-blur);--dsw-menu-backdrop-filter:var(--qilin-menu-backdrop-filter);--dsw-menu-surface-fill:var(--qilin-menu-surface-fill);--dsw-radius-lg:var(--qilin-radius-lg);--dsw-radius-md:var(--qilin-radius-md);--dsw-radius-panel:var(--qilin-radius-panel);--dsw-radius-sm:var(--qilin-radius-sm);--dsw-radius-xl:var(--qilin-radius-xl);--dsw-radius-xs:var(--qilin-radius-xs);--dsw-shadow-lv1:var(--qilin-shadow-lv1);--dsw-shadow-lv1-blur:var(--qilin-shadow-lv1-blur);--dsw-shadow-lv2:var(--qilin-shadow-lv2);--dsw-shadow-lv3:var(--qilin-shadow-lv3);--dsw-space-1:var(--qilin-space-1);--dsw-space-2:var(--qilin-space-2);--dsw-space-3:var(--qilin-space-3);--dsw-specific-brand-seal-fill:var(--qilin-specific-brand-seal-fill);--dsw-specific-bubble:var(--qilin-specific-bubble);--dsw-specific-bubble-highlight:var(--qilin-specific-bubble-highlight);--dsw-specific-input-major:var(--qilin-specific-input-major);--dsw-specific-login-input:var(--qilin-specific-login-input);--dsw-specific-menu:var(--qilin-specific-menu);--dsw-specific-selector:var(--qilin-specific-selector);--dsw-specific-sidebar-fill:var(--qilin-specific-sidebar-fill);--dsw-specific-sidebar-nav-item-active:var(--qilin-specific-sidebar-nav-item-active);--dsw-specific-sidebar-nav-item-active-accent:var(--qilin-specific-sidebar-nav-item-active-accent);--dsw-specific-sidebar-nav-item-hover:var(--qilin-specific-sidebar-nav-item-hover);--dsw-specific-tip:var(--qilin-specific-tip);--dsw-static-amber-100:var(--qilin-static-amber-100);--dsw-static-amber-400:var(--qilin-static-amber-400);--dsw-static-amber-500:var(--qilin-static-amber-500);--dsw-static-amber-600:var(--qilin-static-amber-600);--dsw-static-amber-900:var(--qilin-static-amber-900);--dsw-static-blue-100:var(--qilin-static-blue-100);--dsw-static-blue-300:var(--qilin-static-blue-300);--dsw-static-blue-400:var(--qilin-static-blue-400);--dsw-static-blue-450:var(--qilin-static-blue-450);--dsw-static-blue-50:var(--qilin-static-blue-50);--dsw-static-blue-500:var(--qilin-static-blue-500);--dsw-static-blue-50p:var(--qilin-static-blue-50p);--dsw-static-blue-600:var(--qilin-static-blue-600);--dsw-static-blue-75:var(--qilin-static-blue-75);--dsw-static-blue-800:var(--qilin-static-blue-800);--dsw-static-blue-900:var(--qilin-static-blue-900);--dsw-static-blue-950:var(--qilin-static-blue-950);--dsw-static-deepseek-100:var(--qilin-static-deepseek-100);--dsw-static-deepseek-200:var(--qilin-static-deepseek-200);--dsw-static-deepseek-300:var(--qilin-static-deepseek-300);--dsw-static-deepseek-400:var(--qilin-static-deepseek-400);--dsw-static-deepseek-450:var(--qilin-static-deepseek-450);--dsw-static-deepseek-50:var(--qilin-static-deepseek-50);--dsw-static-deepseek-500:var(--qilin-static-deepseek-500);--dsw-static-deepseek-600:var(--qilin-static-deepseek-600);--dsw-static-deepseek-700-delete:var(--qilin-static-deepseek-700-delete);--dsw-static-deepseek-800:var(--qilin-static-deepseek-800);--dsw-static-deepseek-900:var(--qilin-static-deepseek-900);--dsw-static-green-100:var(--qilin-static-green-100);--dsw-static-green-400:var(--qilin-static-green-400);--dsw-static-green-500:var(--qilin-static-green-500);--dsw-static-green-900:var(--qilin-static-green-900);--dsw-static-neutral-00:var(--qilin-static-neutral-00);--dsw-static-neutral-100:var(--qilin-static-neutral-100);--dsw-static-neutral-1000:var(--qilin-static-neutral-1000);--dsw-static-neutral-150:var(--qilin-static-neutral-150);--dsw-static-neutral-200:var(--qilin-static-neutral-200);--dsw-static-neutral-250:var(--qilin-static-neutral-250);--dsw-static-neutral-300:var(--qilin-static-neutral-300);--dsw-static-neutral-400:var(--qilin-static-neutral-400);--dsw-static-neutral-50:var(--qilin-static-neutral-50);--dsw-static-neutral-500:var(--qilin-static-neutral-500);--dsw-static-neutral-550:var(--qilin-static-neutral-550);--dsw-static-neutral-600:var(--qilin-static-neutral-600);--dsw-static-neutral-700:var(--qilin-static-neutral-700);--dsw-static-neutral-800:var(--qilin-static-neutral-800);--dsw-static-neutral-850:var(--qilin-static-neutral-850);--dsw-static-neutral-900:var(--qilin-static-neutral-900);--dsw-static-neutral-bluish-00:var(--qilin-static-neutral-bluish-00);--dsw-static-neutral-bluish-100:var(--qilin-static-neutral-bluish-100);--dsw-static-neutral-bluish-1000:var(--qilin-static-neutral-bluish-1000);--dsw-static-neutral-bluish-150:var(--qilin-static-neutral-bluish-150);--dsw-static-neutral-bluish-200:var(--qilin-static-neutral-bluish-200);--dsw-static-neutral-bluish-300:var(--qilin-static-neutral-bluish-300);--dsw-static-neutral-bluish-400:var(--qilin-static-neutral-bluish-400);--dsw-static-neutral-bluish-50:var(--qilin-static-neutral-bluish-50);--dsw-static-neutral-bluish-500:var(--qilin-static-neutral-bluish-500);--dsw-static-neutral-bluish-60:var(--qilin-static-neutral-bluish-60);--dsw-static-neutral-bluish-600:var(--qilin-static-neutral-bluish-600);--dsw-static-neutral-bluish-700:var(--qilin-static-neutral-bluish-700);--dsw-static-neutral-bluish-75:var(--qilin-static-neutral-bluish-75);--dsw-static-neutral-bluish-750:var(--qilin-static-neutral-bluish-750);--dsw-static-neutral-bluish-800:var(--qilin-static-neutral-bluish-800);--dsw-static-neutral-bluish-850:var(--qilin-static-neutral-bluish-850);--dsw-static-neutral-bluish-875:var(--qilin-static-neutral-bluish-875);--dsw-static-neutral-bluish-900:var(--qilin-static-neutral-bluish-900);--dsw-static-neutral-bluish-950:var(--qilin-static-neutral-bluish-950);--dsw-static-red-100:var(--qilin-static-red-100);--dsw-static-red-400:var(--qilin-static-red-400);--dsw-static-red-50:var(--qilin-static-red-50);--dsw-static-red-500:var(--qilin-static-red-500);--dsw-static-red-600:var(--qilin-static-red-600);--dsw-static-red-900:var(--qilin-static-red-900)}";
1225
+ //#endregion
1226
+ //#region \0qilin-inline-css:/home/runner/work/QiLin/QiLin/packages/client/ui-theme/src/styles/focus.css.mjs
1227
+ var focus_css_default = ":root{--qilin-focus-ring-width:2px}:focus-visible{outline-color:var(--qilin-focus-ring-color,var(--qilin-alias-state-business-primary));outline-width:var(--qilin-focus-ring-width)}html[data-input-modality=pointer] body :focus-visible:not(:read-write){--qilin-focus-ring-color:transparent;outline-color:#0000}";
1228
+ //#endregion
1229
+ //#region \0qilin-inline-css:/home/runner/work/QiLin/QiLin/packages/client/ui-theme/src/styles/scrollbar.css.mjs
1230
+ var scrollbar_css_default = "body{--qilin-scrollbar-thumb:var(--qilin-alias-scrollbar-bg-l1);--qilin-scrollbar-thumb-hover:var(--qilin-alias-scrollbar-hover-l1);--qilin-scrollbar-thumb-border:0px;--qilin-scrollbar-track-margin:0px;--qilin-scrollbar-width:8px}@supports not selector(::-webkit-scrollbar){body,body *{scrollbar-width:thin;scrollbar-color:var(--qilin-scrollbar-thumb) transparent}}::-webkit-scrollbar{width:var(--qilin-scrollbar-width);height:var(--qilin-scrollbar-width)}::-webkit-scrollbar-track{margin-block:var(--qilin-scrollbar-track-margin);background:0 0}::-webkit-scrollbar-thumb{border:var(--qilin-scrollbar-thumb-border) solid transparent;corner-shape:round;background:var(--qilin-scrollbar-thumb);background-clip:content-box;border-radius:999px}::-webkit-scrollbar-thumb:hover{background-color:var(--qilin-scrollbar-thumb-hover)}::-webkit-scrollbar-corner{background:0 0}";
1231
+ //#endregion
1232
+ //#region \0qilin-inline-css:/home/runner/work/QiLin/QiLin/packages/client/ui-theme/src/styles/gradient-shadow-text.css.mjs
1233
+ var gradient_shadow_text_css_default = "body{--qilin-linear-gradient-think:linear-gradient(180deg, #fff 20.19%, #fff0 100%);--qilin-linear-think-select:linear-gradient(180deg, #f5f6f7 20.19%, #f5f6f700 100%);--qilin-shadow-lv1:0 2px 4px 0 #0000000d;--qilin-shadow-lv1-blur:0 4px 12px 0 #00000005;--qilin-shadow-lv2:0 4px 12px 0 #00000005, 0 2px 8px 0 #0000000a;--qilin-shadow-lv3:0 0 1px 0 #0003, 0 0 4px 0 #00000005, 0 12px 32px 0 #00000014;--qilin-elevation-stroke-color:var(--qilin-alias-border-l4);--qilin-mask-blur:blur(2px)}body,body *{--qilin-elevation-stroke:0 0 0 .5px var(--qilin-elevation-stroke-color);--qilin-elevation-panel:var(--qilin-elevation-stroke), 0 3px 8px 0 #00000008, 0 0 16px 0 #00000005;--qilin-elevation-prominent:var(--qilin-elevation-stroke), 0 3px 8px 0 #0000000a, 0 0 20px 0 #0000000d;--qilin-elevation-soft:var(--qilin-elevation-stroke), 0 4px 16px 0 #00000008, 0 0 24px 0 #00000008}body[data-ds-dark-theme]{--qilin-linear-gradient-think:linear-gradient(180deg, #151517 20.19%, #15151700 100%);--qilin-linear-think-select:linear-gradient(180deg, #232325 20.19%, #23232500 100%)}body{--qilin-content-font-delta:calc(var(--qilin-content-font-size,14px) - 14px);--qilin-content-font-size-secondary:min(calc(var(--qilin-content-font-size,14px) - 1px), max(13px, calc(var(--qilin-content-font-size,14px) - 2px)));--qilin-content-font-delta-secondary:calc(var(--qilin-content-font-size-secondary) - 13px);--qilin-content-leading:0px;--qilin-font-markdown-h1:700 calc(21px + var(--qilin-content-font-delta)) / calc(30px + var(--qilin-content-font-delta) + var(--qilin-content-leading)) var(--qilin-font-family);--qilin-font-markdown-h1-font-family:var(--qilin-font-family);--qilin-font-markdown-h1-font-weight:700;--qilin-font-markdown-h1-line-height:calc(30px + var(--qilin-content-font-delta) + var(--qilin-content-leading));--qilin-font-markdown-h1-font-size:calc(21px + var(--qilin-content-font-delta));--qilin-font-markdown-h1-font-style:normal;--qilin-font-markdown-h2:700 calc(19px + var(--qilin-content-font-delta)) / calc(28px + var(--qilin-content-font-delta) + var(--qilin-content-leading)) var(--qilin-font-family);--qilin-font-markdown-h2-font-family:var(--qilin-font-family);--qilin-font-markdown-h2-font-weight:700;--qilin-font-markdown-h2-line-height:calc(28px + var(--qilin-content-font-delta) + var(--qilin-content-leading));--qilin-font-markdown-h2-font-size:calc(19px + var(--qilin-content-font-delta));--qilin-font-markdown-h2-font-style:normal;--qilin-font-markdown-h3:700 calc(18px + var(--qilin-content-font-delta)) / calc(26px + var(--qilin-content-font-delta) + var(--qilin-content-leading)) var(--qilin-font-family);--qilin-font-markdown-h3-font-family:var(--qilin-font-family);--qilin-font-markdown-h3-font-weight:700;--qilin-font-markdown-h3-line-height:calc(26px + var(--qilin-content-font-delta) + var(--qilin-content-leading));--qilin-font-markdown-h3-font-size:calc(18px + var(--qilin-content-font-delta));--qilin-font-markdown-h3-font-style:normal;--qilin-font-markdown-h4:600 var(--qilin-content-font-size,14px) / calc(24px + var(--qilin-content-font-delta) + var(--qilin-content-leading)) var(--qilin-font-family);--qilin-font-markdown-h4-font-family:var(--qilin-font-family);--qilin-font-markdown-h4-font-weight:600;--qilin-font-markdown-h4-line-height:calc(24px + var(--qilin-content-font-delta) + var(--qilin-content-leading));--qilin-font-markdown-h4-font-size:var(--qilin-content-font-size,14px);--qilin-font-markdown-h4-font-style:normal;--qilin-font-markdown-base:var(--qilin-content-font-size,14px) / calc(24px + var(--qilin-content-font-delta) + var(--qilin-content-leading)) var(--qilin-font-family);--qilin-font-markdown-base-font-family:var(--qilin-font-family);--qilin-font-markdown-base-font-weight:400;--qilin-font-markdown-base-line-height:calc(24px + var(--qilin-content-font-delta) + var(--qilin-content-leading));--qilin-font-markdown-base-font-size:var(--qilin-content-font-size,14px);--qilin-font-markdown-base-font-style:normal;--qilin-font-markdown-base-strong:600 var(--qilin-content-font-size,14px) / calc(24px + var(--qilin-content-font-delta) + var(--qilin-content-leading)) var(--qilin-font-family);--qilin-font-markdown-base-strong-font-family:var(--qilin-font-family);--qilin-font-markdown-base-strong-font-weight:600;--qilin-font-markdown-base-strong-line-height:calc(24px + var(--qilin-content-font-delta) + var(--qilin-content-leading));--qilin-font-markdown-base-strong-font-size:var(--qilin-content-font-size,14px);--qilin-font-markdown-base-strong-font-style:normal;--qilin-font-markdown-base-italic:italic var(--qilin-content-font-size,14px) / calc(24px + var(--qilin-content-font-delta) + var(--qilin-content-leading)) var(--qilin-font-family);--qilin-font-markdown-base-italic-font-family:var(--qilin-font-family);--qilin-font-markdown-base-italic-font-weight:400;--qilin-font-markdown-base-italic-line-height:calc(24px + var(--qilin-content-font-delta) + var(--qilin-content-leading));--qilin-font-markdown-base-italic-font-size:var(--qilin-content-font-size,14px);--qilin-font-markdown-base-italic-font-style:italic;--qilin-font-markdown-base-strong-italic:italic 600 var(--qilin-content-font-size,14px) / calc(24px + var(--qilin-content-font-delta) + var(--qilin-content-leading)) var(--qilin-font-family);--qilin-font-markdown-base-strong-italic-font-family:var(--qilin-font-family);--qilin-font-markdown-base-strong-italic-font-weight:600;--qilin-font-markdown-base-strong-italic-line-height:calc(24px + var(--qilin-content-font-delta) + var(--qilin-content-leading));--qilin-font-markdown-base-strong-italic-font-size:var(--qilin-content-font-size,14px);--qilin-font-markdown-base-strong-italic-font-style:italic;--qilin-font-markdown-table:var(--qilin-content-font-size-secondary,13px)/calc(22px + var(--qilin-content-font-delta-secondary,0px) + var(--qilin-content-leading)) var(--qilin-font-family);--qilin-font-markdown-table-font-family:var(--qilin-font-family);--qilin-font-markdown-table-font-weight:400;--qilin-font-markdown-table-line-height:calc(22px + var(--qilin-content-font-delta-secondary,0px) + var(--qilin-content-leading));--qilin-font-markdown-table-font-size:var(--qilin-content-font-size-secondary,13px);--qilin-font-markdown-table-font-style:normal;--qilin-font-markdown-table-head:500 var(--qilin-content-font-size-secondary,13px)/calc(22px + var(--qilin-content-font-delta-secondary,0px) + var(--qilin-content-leading)) var(--qilin-font-family);--qilin-font-markdown-table-head-font-family:var(--qilin-font-family);--qilin-font-markdown-table-head-font-weight:500;--qilin-font-markdown-table-head-line-height:calc(22px + var(--qilin-content-font-delta-secondary,0px) + var(--qilin-content-leading));--qilin-font-markdown-table-head-font-size:var(--qilin-content-font-size-secondary,13px);--qilin-font-markdown-table-head-font-style:normal;--qilin-font-markdown-small:12px/20px var(--qilin-font-family);--qilin-font-markdown-small-font-family:var(--qilin-font-family);--qilin-font-markdown-small-font-weight:400;--qilin-font-markdown-small-line-height:20px;--qilin-font-markdown-small-font-size:12px;--qilin-font-markdown-small-font-style:normal;--qilin-font-markdown-small-strong:600 12px/20px var(--qilin-font-family);--qilin-font-markdown-small-strong-font-family:var(--qilin-font-family);--qilin-font-markdown-small-strong-font-weight:600;--qilin-font-markdown-small-strong-line-height:20px;--qilin-font-markdown-small-strong-font-size:12px;--qilin-font-markdown-small-strong-font-style:normal;--qilin-font-markdown-small-italic:italic 12px/20px var(--qilin-font-family);--qilin-font-markdown-small-italic-font-family:var(--qilin-font-family);--qilin-font-markdown-small-italic-font-weight:400;--qilin-font-markdown-small-italic-line-height:20px;--qilin-font-markdown-small-italic-font-size:12px;--qilin-font-markdown-small-italic-font-style:italic;--qilin-font-markdown-small-strong-italic:italic 600 12px/20px var(--qilin-font-family);--qilin-font-markdown-small-strong-italic-font-family:var(--qilin-font-family);--qilin-font-markdown-small-strong-italic-font-weight:600;--qilin-font-markdown-small-strong-italic-line-height:20px;--qilin-font-markdown-small-strong-italic-font-size:12px;--qilin-font-markdown-small-strong-italic-font-style:italic;--qilin-font-markdown-code:12px/19px var(--ds-font-family-code);--qilin-font-markdown-code-font-family:var(--ds-font-family-code);--qilin-font-markdown-code-font-weight:400;--qilin-font-markdown-code-line-height:19px;--qilin-font-markdown-code-font-size:12px;--qilin-font-markdown-code-font-style:normal;--qilin-font-markdown-code-block:11px/19px var(--ds-font-family-code);--qilin-font-markdown-code-block-font-family:var(--ds-font-family-code);--qilin-font-markdown-code-block-font-weight:400;--qilin-font-markdown-code-block-line-height:19px;--qilin-font-markdown-code-block-font-size:11px;--qilin-font-markdown-code-block-font-style:normal;--qilin-font-markdown-code-block-small:11px/16px var(--ds-font-family-code);--qilin-font-markdown-code-block-small-font-family:var(--ds-font-family-code);--qilin-font-markdown-code-block-small-font-weight:400;--qilin-font-markdown-code-block-small-line-height:16px;--qilin-font-markdown-code-block-small-font-size:11px;--qilin-font-markdown-code-block-small-font-style:normal;--qilin-font-xl-24:600 24px/32px var(--qilin-font-family);--qilin-font-xl-24-font-family:var(--qilin-font-family);--qilin-font-xl-24-font-weight:600;--qilin-font-xl-24-line-height:32px;--qilin-font-xl-24-font-size:24px;--qilin-font-xl-24-font-style:normal;--qilin-font-l-20:500 20px/28px var(--qilin-font-family);--qilin-font-l-20-font-family:var(--qilin-font-family);--qilin-font-l-20-font-weight:500;--qilin-font-l-20-line-height:28px;--qilin-font-l-20-font-size:20px;--qilin-font-l-20-font-style:normal;--qilin-font-m-18:500 16px/28px var(--qilin-font-family);--qilin-font-m-18-font-family:var(--qilin-font-family);--qilin-font-m-18-font-weight:500;--qilin-font-m-18-line-height:28px;--qilin-font-m-18-font-size:16px;--qilin-font-m-18-font-style:normal;--qilin-font-base-16:16px/24px var(--qilin-font-family);--qilin-font-base-16-font-family:var(--qilin-font-family);--qilin-font-base-16-font-weight:400;--qilin-font-base-16-line-height:24px;--qilin-font-base-16-font-size:16px;--qilin-font-base-16-font-style:normal;--qilin-font-base-strong-16:500 16px/24px var(--qilin-font-family);--qilin-font-base-strong-16-font-family:var(--qilin-font-family);--qilin-font-base-strong-16-font-weight:500;--qilin-font-base-strong-16-line-height:24px;--qilin-font-base-strong-16-font-size:16px;--qilin-font-base-strong-16-font-style:normal;--qilin-font-s-14:14px/22px var(--qilin-font-family);--qilin-font-s-14-font-family:var(--qilin-font-family);--qilin-font-s-14-font-weight:400;--qilin-font-s-14-line-height:22px;--qilin-font-s-14-font-size:14px;--qilin-font-s-14-font-style:normal;--qilin-font-s-strong-14:500 14px/22px var(--qilin-font-family);--qilin-font-s-strong-14-font-family:var(--qilin-font-family);--qilin-font-s-strong-14-font-weight:500;--qilin-font-s-strong-14-line-height:22px;--qilin-font-s-strong-14-font-size:14px;--qilin-font-s-strong-14-font-style:normal;--qilin-font-xs-13:13px/20px var(--qilin-font-family);--qilin-font-xs-13-font-family:var(--qilin-font-family);--qilin-font-xs-13-font-weight:400;--qilin-font-xs-13-line-height:20px;--qilin-font-xs-13-font-size:13px;--qilin-font-xs-13-font-style:normal;--qilin-font-xs-strong-13:500 13px/20px var(--qilin-font-family);--qilin-font-xs-strong-13-font-family:var(--qilin-font-family);--qilin-font-xs-strong-13-font-weight:500;--qilin-font-xs-strong-13-line-height:20px;--qilin-font-xs-strong-13-font-size:13px;--qilin-font-xs-strong-13-font-style:normal;--qilin-font-xxs-12:12px/18px var(--qilin-font-family);--qilin-font-xxs-12-font-family:var(--qilin-font-family);--qilin-font-xxs-12-font-weight:400;--qilin-font-xxs-12-line-height:18px;--qilin-font-xxs-12-font-size:12px;--qilin-font-xxs-12-font-style:normal;--qilin-font-xxs-strong-12:500 12px/18px var(--qilin-font-family);--qilin-font-xxs-strong-12-font-family:var(--qilin-font-family);--qilin-font-xxs-strong-12-font-weight:500;--qilin-font-xxs-strong-12-line-height:18px;--qilin-font-xxs-strong-12-font-size:12px;--qilin-font-xxs-strong-12-font-style:normal;--qilin-font-xxxs-11:11px/14px var(--qilin-font-family);--qilin-font-xxxs-11-font-family:var(--qilin-font-family);--qilin-font-xxxs-11-font-weight:400;--qilin-font-xxxs-11-line-height:14px;--qilin-font-xxxs-11-font-size:11px;--qilin-font-xxxs-11-font-style:normal;--qilin-font-xxxs-strong-11:500 11px/14px var(--qilin-font-family);--qilin-font-xxxs-strong-11-font-family:var(--qilin-font-family);--qilin-font-xxxs-strong-11-font-weight:500;--qilin-font-xxxs-strong-11-line-height:14px;--qilin-font-xxxs-strong-11-font-size:11px;--qilin-font-xxxs-strong-11-font-style:normal}";
1234
+ //#endregion
1235
+ //#region \0qilin-inline-css:/home/runner/work/QiLin/QiLin/packages/client/ui-theme/src/styles/shiki.css.mjs
1236
+ var shiki_css_default = ":root{--shiki-foreground:var(--qilin-alias-label-primary);--shiki-background:var(--qilin-alias-markdown-code-block);--shiki-token-constant:#1c7ed6;--shiki-token-string:#2f9e44;--shiki-token-comment:#868e96;--shiki-token-keyword:#d6336c;--shiki-token-parameter:#e8590c;--shiki-token-function:#6741d9;--shiki-token-string-expression:#2b8a3e;--shiki-token-punctuation:#495057;--shiki-token-link:#1971c2}body[data-ds-dark-theme]{--shiki-token-constant:#4dabf7;--shiki-token-string:#69db7c;--shiki-token-comment:#adb5bd;--shiki-token-keyword:#faa2c1;--shiki-token-parameter:#ffa94d;--shiki-token-function:#b197fc;--shiki-token-string-expression:#8ce99a;--shiki-token-punctuation:#ced4da;--shiki-token-link:#74c0fc}";
1237
+ //#endregion
1238
+ //#region lib/types/client/styles.js
1239
+ const PLUGIN_ID = "@qilin-agent/client-ui-theme";
1240
+ const STYLES = [
1241
+ ["base.css", base_css_default],
1242
+ ["corner-shape.css", corner_shape_css_default],
1243
+ ["design-platform.css", design_platform_css_default],
1244
+ ["dsw-compat.css", dsw_compat_css_default],
1245
+ ["focus.css", focus_css_default],
1246
+ ["scrollbar.css", scrollbar_css_default],
1247
+ ["gradient-shadow-text.css", gradient_shadow_text_css_default],
1248
+ ["shiki.css", shiki_css_default]
1249
+ ];
1250
+ /**
1251
+ * Mount the global theme sheets for exactly the owning plugin lifetime.
1252
+ * @param ctx - Owning plugin context.
1253
+ */
1254
+ function installThemeStyles(ctx) {
1255
+ if (typeof document === "undefined") return;
1256
+ for (const [name, css] of STYLES) ctx.effect(() => {
1257
+ const tag = document.createElement("style");
1258
+ tag.dataset.plugin = PLUGIN_ID;
1259
+ tag.dataset.pluginCss = `${PLUGIN_ID}/${name}`;
1260
+ tag.textContent = css;
1261
+ document.head.appendChild(tag);
1262
+ return () => {
1263
+ tag.remove();
1264
+ };
1265
+ }, `ui-theme: ${name} stylesheet`);
1266
+ }
1267
+ //#endregion
1268
+ //#region lib/types/client/locales.js
1269
+ /** `settings.theme` namespace dictionaries (the Appearance, font-size, and line-spacing rows' copy). */
1270
+ /** Simplified Chinese dictionary (the key-set source of truth). */
1271
+ const zh = {
1272
+ "appearance.title": "外观",
1273
+ "appearance.light": "浅色",
1274
+ "appearance.dark": "深色",
1275
+ "appearance.system": "跟随系统",
1276
+ "fontSize.title": "字号大小",
1277
+ "fontSize.description": "仅影响会话内容的字号",
1278
+ "fontSize.unit": "px",
1279
+ "fontSize.increase": "增大字号",
1280
+ "fontSize.decrease": "减小字号",
1281
+ "leading.title": "行间距",
1282
+ "leading.description": "在默认行高上增减会话正文的行间距,0 为默认",
1283
+ "leading.unit": "px",
1284
+ "leading.increase": "增大行间距",
1285
+ "leading.decrease": "减小行间距"
1286
+ };
1287
+ /** English dictionary, checked complete against the zh key set. */
1288
+ const en = {
1289
+ "appearance.title": "Appearance",
1290
+ "appearance.light": "Light",
1291
+ "appearance.dark": "Dark",
1292
+ "appearance.system": "System",
1293
+ "fontSize.title": "Font size",
1294
+ "fontSize.description": "Only affects conversation content",
1295
+ "fontSize.unit": "px",
1296
+ "fontSize.increase": "Increase font size",
1297
+ "fontSize.decrease": "Decrease font size",
1298
+ "leading.title": "Line spacing",
1299
+ "leading.description": "Adds or removes pixels from the default line height of message text; 0 is the default",
1300
+ "leading.unit": "px",
1301
+ "leading.increase": "Increase line spacing",
1302
+ "leading.decrease": "Decrease line spacing"
1303
+ };
1304
+ //#endregion
1305
+ //#region lib/types/client/index.js
1306
+ /** Namespace owning this feature's settings-row copy. */
1307
+ const SETTINGS_NS = "settings.theme";
1308
+ const BUILTIN_THEMES = Object.freeze([Object.freeze({
1309
+ id: "light",
1310
+ colorScheme: "light",
1311
+ tokens: Object.freeze({})
1312
+ }), Object.freeze({
1313
+ id: "dark",
1314
+ colorScheme: "dark",
1315
+ tokens: Object.freeze({})
1316
+ })]);
1317
+ const BUILTIN_INSPECT_TOKENS = Object.freeze([
1318
+ {
1319
+ name: "--qilin-alias-bg-base",
1320
+ description: "Application base background.",
1321
+ valueType: "CSS color",
1322
+ requiresLightAndDark: true,
1323
+ cssVariable: "--qilin-alias-bg-base"
1324
+ },
1325
+ {
1326
+ name: "--qilin-alias-bg-layer-1",
1327
+ description: "Primary raised surface background.",
1328
+ valueType: "CSS color",
1329
+ requiresLightAndDark: true,
1330
+ cssVariable: "--qilin-alias-bg-layer-1"
1331
+ },
1332
+ {
1333
+ name: "--qilin-alias-bg-layer-2",
1334
+ description: "Secondary nested surface background.",
1335
+ valueType: "CSS color",
1336
+ requiresLightAndDark: true,
1337
+ cssVariable: "--qilin-alias-bg-layer-2"
1338
+ },
1339
+ {
1340
+ name: "--qilin-alias-bg-overlay",
1341
+ description: "Overlay and popover background.",
1342
+ valueType: "CSS color",
1343
+ requiresLightAndDark: true,
1344
+ cssVariable: "--qilin-alias-bg-overlay"
1345
+ },
1346
+ {
1347
+ name: "--qilin-alias-border-l1",
1348
+ description: "Primary subtle border.",
1349
+ valueType: "CSS color",
1350
+ requiresLightAndDark: true,
1351
+ cssVariable: "--qilin-alias-border-l1"
1352
+ },
1353
+ {
1354
+ name: "--qilin-alias-border-l2",
1355
+ description: "Secondary stronger border.",
1356
+ valueType: "CSS color",
1357
+ requiresLightAndDark: true,
1358
+ cssVariable: "--qilin-alias-border-l2"
1359
+ },
1360
+ {
1361
+ name: "--qilin-alias-brand-primary",
1362
+ description: "Primary brand accent.",
1363
+ valueType: "CSS color",
1364
+ requiresLightAndDark: true,
1365
+ cssVariable: "--qilin-alias-brand-primary"
1366
+ },
1367
+ {
1368
+ name: "--qilin-alias-label-primary",
1369
+ description: "Primary text color.",
1370
+ valueType: "CSS color",
1371
+ requiresLightAndDark: true,
1372
+ cssVariable: "--qilin-alias-label-primary"
1373
+ },
1374
+ {
1375
+ name: "--qilin-alias-label-secondary",
1376
+ description: "Secondary text color.",
1377
+ valueType: "CSS color",
1378
+ requiresLightAndDark: true,
1379
+ cssVariable: "--qilin-alias-label-secondary"
1380
+ },
1381
+ {
1382
+ name: "--qilin-alias-state-error-primary",
1383
+ description: "Primary error state color.",
1384
+ valueType: "CSS color",
1385
+ requiresLightAndDark: true,
1386
+ cssVariable: "--qilin-alias-state-error-primary"
1387
+ },
1388
+ {
1389
+ name: "--qilin-alias-state-success-primary",
1390
+ description: "Primary success state color.",
1391
+ valueType: "CSS color",
1392
+ requiresLightAndDark: true,
1393
+ cssVariable: "--qilin-alias-state-success-primary"
1394
+ },
1395
+ {
1396
+ name: "--qilin-alias-state-warn-primary",
1397
+ description: "Primary warning state color.",
1398
+ valueType: "CSS color",
1399
+ requiresLightAndDark: true,
1400
+ cssVariable: "--qilin-alias-state-warn-primary"
1401
+ },
1402
+ {
1403
+ name: "--qilin-specific-sidebar-fill",
1404
+ description: "Sidebar column and title-row background.",
1405
+ valueType: "CSS color",
1406
+ requiresLightAndDark: true,
1407
+ cssVariable: "--qilin-specific-sidebar-fill"
1408
+ }
1409
+ ]);
1410
+ /**
1411
+ * Theme registry and preference owner. `light`/`dark` are built in (the base
1412
+ * stylesheets carry both palettes); third-party themes register alias-layer
1413
+ * overrides. Reads go through {@link getTheme}; preference writes only
1414
+ * through {@link setTheme}; continuous sync only through the `theme/change`
1415
+ * event. {@link overrideTokens} stacks partial token layers over the active
1416
+ * theme without touching the registry.
1417
+ * The service holds the `prefers-color-scheme` media query (environment
1418
+ * sensing, not presentation) and re-emits when the OS scheme flips while the
1419
+ * preference is `system`.
1420
+ */
1421
+ var ThemeRuntime = class {
1422
+ ctx;
1423
+ host;
1424
+ themes = [...BUILTIN_THEMES];
1425
+ preference;
1426
+ fontSize = bootstrapFontSize();
1427
+ leading = bootstrapLeading();
1428
+ revision = 0;
1429
+ snapshot;
1430
+ media;
1431
+ /** Override layers by source; seq (monotonic) is the stacking order. */
1432
+ overrides = /* @__PURE__ */ new Map();
1433
+ overrideSeq = 0;
1434
+ /**
1435
+ * @param ctx - owning context (change events are emitted on it; the
1436
+ * media-query and scope listeners are released through ctx.effect on dispose).
1437
+ * @param host - durable preference scope owned by the same plugin.
1438
+ */
1439
+ constructor(ctx, host) {
1440
+ this.ctx = ctx;
1441
+ this.host = host;
1442
+ this.preference = DEFAULT_PREFERENCE;
1443
+ this.media = typeof matchMedia === "undefined" ? void 0 : matchMedia("(prefers-color-scheme: dark)");
1444
+ this.snapshot = this.buildSnapshot();
1445
+ if (this.media !== void 0) {
1446
+ const media = this.media;
1447
+ const onChange = () => {
1448
+ if (this.preference !== "system") return;
1449
+ this.publish();
1450
+ };
1451
+ ctx.effect(() => {
1452
+ media.addEventListener("change", onChange);
1453
+ return () => {
1454
+ media.removeEventListener("change", onChange);
1455
+ };
1456
+ }, "ui-theme: prefers-color-scheme listener");
1457
+ }
1458
+ ctx.effect(() => host.subscribe(() => {
1459
+ this.adopt();
1460
+ }), "ui-theme: settings scope adoption");
1461
+ this.adopt();
1462
+ }
1463
+ /**
1464
+ * Read the current immutable theme snapshot.
1465
+ * @returns the current snapshot (stable reference until the next change).
1466
+ */
1467
+ getTheme() {
1468
+ return this.snapshot;
1469
+ }
1470
+ /**
1471
+ * Export the current token directory without reading DOM or computed styles.
1472
+ * @returns stable JSON-safe token descriptions, including registered and override-only names.
1473
+ */
1474
+ exportInspectTokens() {
1475
+ const tokens = new Map(BUILTIN_INSPECT_TOKENS.map((token) => [token.name, token]));
1476
+ for (const theme of this.themes) for (const name of Object.keys(theme.tokens)) if (!tokens.has(name)) tokens.set(name, dynamicToken(name));
1477
+ for (const layer of this.overrides.values()) for (const name of Object.keys(layer.tokens)) if (!tokens.has(name)) tokens.set(name, dynamicToken(name));
1478
+ return [...tokens.values()].map((token) => ({ ...token })).sort((left, right) => left.name.localeCompare(right.name));
1479
+ }
1480
+ /**
1481
+ * Switch the theme preference — the only user preference write entry.
1482
+ * Built-in preferences are written through the settings scope and every
1483
+ * accepted value emits `theme/change`.
1484
+ * @param id - a registered theme id or `system`; unknown ids throw.
1485
+ */
1486
+ setTheme(id) {
1487
+ if (id !== "system" && !this.themes.some((t) => t.id === id)) throw new Error(`theme "${id}" is not registered`);
1488
+ if (this.preference === id) return;
1489
+ this.preference = id;
1490
+ if (isThemePreference(id)) this.host.set(THEME_PREFERENCE_FIELD, id);
1491
+ this.publish();
1492
+ }
1493
+ /**
1494
+ * Change the conversation content font size — the only font-size write
1495
+ * entry. Accepted values are written through the settings scope and emit
1496
+ * `theme/change`.
1497
+ * @param px - integer px within FONT_SIZE_MIN..FONT_SIZE_MAX; out-of-range or fractional values throw.
1498
+ */
1499
+ setFontSize(px) {
1500
+ if (!Number.isInteger(px) || px < 10 || px > 22) throw new Error(`font size ${px} is outside 10..22`);
1501
+ if (this.fontSize === px) return;
1502
+ this.fontSize = px;
1503
+ this.host.set(FONT_SIZE_FIELD, px);
1504
+ this.publish();
1505
+ }
1506
+ /**
1507
+ * Change the conversation content leading adjustment — the only leading
1508
+ * write entry. Accepted values are written through the settings scope and
1509
+ * emit `theme/change`.
1510
+ * @param px - integer px within LEADING_MIN..LEADING_MAX; out-of-range or fractional values throw.
1511
+ */
1512
+ setLeading(px) {
1513
+ if (!Number.isInteger(px) || px < -2 || px > 8) throw new Error(`leading ${px} is outside -2..8`);
1514
+ if (this.leading === px) return;
1515
+ this.leading = px;
1516
+ this.host.set(LEADING_FIELD, px);
1517
+ this.publish();
1518
+ }
1519
+ /** Adopt the scope's accepted durable preference without writing it back. */
1520
+ adopt() {
1521
+ const section = this.host.getSnapshot().value;
1522
+ if (section === void 0) return;
1523
+ if (this.preference === section.preference && this.fontSize === section.fontSize && this.leading === section.leading) return;
1524
+ this.preference = section.preference;
1525
+ this.fontSize = section.fontSize;
1526
+ this.leading = section.leading;
1527
+ this.publish();
1528
+ }
1529
+ /**
1530
+ * Register a theme. Duplicate id throws (single occupant per id; the
1531
+ * built-in pair counts; `system` is a preference, not a registrable id).
1532
+ * @param definition - theme id, colorScheme, and alias-token overrides.
1533
+ * @returns disposer. Disposing the theme backing the active preference
1534
+ * resets the preference to the default so the UI never keeps tokens of an
1535
+ * unregistered theme.
1536
+ */
1537
+ register(definition) {
1538
+ if (definition.id === "system") throw new Error("\"system\" is a preference, not a registrable theme id");
1539
+ if (this.themes.some((t) => t.id === definition.id)) throw new Error(`theme "${definition.id}" is already registered`);
1540
+ this.themes = [...this.themes, definition];
1541
+ this.publish();
1542
+ return () => {
1543
+ if (!this.themes.some((t) => t.id === definition.id)) return;
1544
+ this.themes = this.themes.filter((t) => t.id !== definition.id);
1545
+ if (this.preference === definition.id) this.preference = DEFAULT_PREFERENCE;
1546
+ this.publish();
1547
+ };
1548
+ }
1549
+ /**
1550
+ * Stack a token override layer on top of the active theme — the token-level
1551
+ * analogue of slot shading: the base theme stays untouched, layers compose
1552
+ * in seq order with later layers winning per-token, and removing a layer
1553
+ * restores whatever it covered. Calling again with the same source replaces
1554
+ * that source's whole layer and restacks it on top (effect re-registration
1555
+ * semantics). Emits `theme/change` with the recomposed snapshot.
1556
+ * @param source - layer identity; one layer per source (dynamic packages
1557
+ * pass their package id — the façade pins it, so it also names the layer's
1558
+ * origin for inspection).
1559
+ * @param tokens - token-name → `{ light, dark }` value pairs. Validated at
1560
+ * runtime (model-authored callers reach this boundary with untyped JS);
1561
+ * a bare string value throws a teaching error.
1562
+ * @returns disposer removing exactly the layer this call created; a no-op
1563
+ * once the source has re-overridden (the newer layer is not torn down).
1564
+ */
1565
+ overrideTokens(source, tokens) {
1566
+ const layer = {
1567
+ seq: this.overrideSeq++,
1568
+ tokens: validateOverrides(source, tokens)
1569
+ };
1570
+ this.overrides.set(source, layer);
1571
+ this.publish();
1572
+ return () => {
1573
+ if (this.overrides.get(source) !== layer) return;
1574
+ this.overrides.delete(source);
1575
+ this.publish();
1576
+ };
1577
+ }
1578
+ buildSnapshot() {
1579
+ const resolvedId = this.preference === "system" ? this.media?.matches === true ? "dark" : "light" : this.preference;
1580
+ const active = this.themes.find((t) => t.id === resolvedId);
1581
+ /* v8 ignore next 2 -- needs a registry without light/dark, which register()/dispose() cannot produce */
1582
+ if (active === void 0) throw new Error(`theme registry lost "${resolvedId}"`);
1583
+ return Object.freeze({
1584
+ preference: this.preference,
1585
+ fontSize: this.fontSize,
1586
+ leading: this.leading,
1587
+ active: this.composeActive(active),
1588
+ themes: Object.freeze([...this.themes]),
1589
+ revision: this.revision
1590
+ });
1591
+ }
1592
+ /**
1593
+ * Fold the override layers into the active definition: seq order, later
1594
+ * layers win per-token, each value picked for the active color scheme (the
1595
+ * presenter consumes the composed snapshot and needs no override awareness).
1596
+ * Without layers the registered definition passes through by identity.
1597
+ */
1598
+ composeActive(active) {
1599
+ if (this.overrides.size === 0) return active;
1600
+ const tokens = { ...active.tokens };
1601
+ for (const layer of [...this.overrides.values()].sort((a, b) => a.seq - b.seq)) for (const [name, modes] of Object.entries(layer.tokens)) tokens[name] = modes[active.colorScheme];
1602
+ return Object.freeze({
1603
+ ...active,
1604
+ tokens: Object.freeze(tokens)
1605
+ });
1606
+ }
1607
+ publish() {
1608
+ this.revision += 1;
1609
+ this.snapshot = this.buildSnapshot();
1610
+ this.ctx.emit("theme/change", this.snapshot);
1611
+ }
1612
+ };
1613
+ /**
1614
+ * Read the font size the Host boot script wrote on `body` before any plugin
1615
+ * ran, so the initial snapshot matches first paint and ui-layout's presenter
1616
+ * does not flash the schema default while the settings read is in flight.
1617
+ * Non-browser runs and mounts without the boot script fall back to the
1618
+ * schema default; the durable settings adoption still lands afterwards.
1619
+ */
1620
+ function bootstrapFontSize() {
1621
+ /* v8 ignore next -- needs a documentless run (node e2e booting the client tree), not constructible under jsdom */
1622
+ if (typeof document === "undefined") return 14;
1623
+ const raw = document.body.style.getPropertyValue("--qilin-content-font-size");
1624
+ const parsed = Number.parseInt(raw, 10);
1625
+ return Number.isInteger(parsed) && parsed >= 10 && parsed <= 22 ? parsed : 14;
1626
+ }
1627
+ /**
1628
+ * Read the leading adjustment the Host boot script wrote on `body` before any
1629
+ * plugin ran, so the initial snapshot matches first paint and ui-layout's
1630
+ * presenter does not flash the schema default while the settings read is in
1631
+ * flight. Non-browser runs and mounts without the boot script fall back to the
1632
+ * schema default; the durable settings adoption still lands afterwards.
1633
+ */
1634
+ function bootstrapLeading() {
1635
+ /* v8 ignore next -- needs a documentless run (node e2e booting the client tree), not constructible under jsdom */
1636
+ if (typeof document === "undefined") return 0;
1637
+ const raw = document.body.style.getPropertyValue("--qilin-content-leading");
1638
+ const parsed = Number.parseInt(raw, 10);
1639
+ return Number.isInteger(parsed) && parsed >= -2 && parsed <= 8 ? parsed : 0;
1640
+ }
1641
+ /**
1642
+ * Runtime shape check for one override layer (model-authored callers pass
1643
+ * untyped JS through the dynamic-package façade, so the static type cannot
1644
+ * enforce the pair shape there). Returns a defensive per-token copy so later
1645
+ * caller mutation cannot reach the stored layer.
1646
+ */ function validateOverrides(source, tokens) {
1647
+ const validated = {};
1648
+ for (const [name, value] of Object.entries(tokens)) {
1649
+ if (typeof value === "string") throw new TypeError(`theme override "${name}" from "${source}" is a bare string — pass { light: ${JSON.stringify(value)}, dark: ${JSON.stringify(value)} } (repeat the value when it is the same in both palettes); a single value goes illegible when the user switches color scheme`);
1650
+ if (typeof value !== "object" || value === null || typeof value.light !== "string" || typeof value.dark !== "string") throw new TypeError(`theme override "${name}" from "${source}" must map to a { light, dark } pair of strings — one value per color scheme`);
1651
+ const modes = value;
1652
+ validated[name] = {
1653
+ light: modes.light,
1654
+ dark: modes.dark
1655
+ };
1656
+ }
1657
+ return validated;
1658
+ }
1659
+ function dynamicToken(name) {
1660
+ return {
1661
+ name,
1662
+ description: "Theme token registered by the current Client composition.",
1663
+ valueType: "CSS value",
1664
+ requiresLightAndDark: true,
1665
+ ...name.startsWith("--") ? { cssVariable: name } : {}
1666
+ };
1667
+ }
1668
+ /**
1669
+ * Required services: settings transport plus slots/locale for the Appearance
1670
+ * row. `remote` carries the forwarded settings invalidation that
1671
+ * `ctx.configForms.get(entryId)` subscribes to on this context.
1672
+ */
1673
+ const inject = [
1674
+ "slots",
1675
+ "locale",
1676
+ "remote",
1677
+ "configForms"
1678
+ ];
1679
+ /**
1680
+ * Client plugin body: provide the theme service and register the
1681
+ * feature-owned Appearance, font-size, and line-spacing preference rows into
1682
+ * the General section's item slot (a feature owns its settings surface).
1683
+ * @param ctx - client cordis context.
1684
+ */
1685
+ function apply(ctx) {
1686
+ installThemeStyles(ctx);
1687
+ const theme = new ThemeRuntime(ctx, ctx.configForms.get(THEME_SETTINGS_NAMESPACE));
1688
+ ctx.provide("theme", theme);
1689
+ ctx.effect(() => ctx.locale.register(SETTINGS_NS, {
1690
+ zh,
1691
+ en
1692
+ }), "ui-theme: settings row dictionaries");
1693
+ const typographyStore = createTypographyRowStore();
1694
+ const appearanceStore = createAppearanceRowStore();
1695
+ let appearanceBound;
1696
+ let fontSizeBound;
1697
+ let leadingBound;
1698
+ const sync = (snapshot) => {
1699
+ const { preference, fontSize, leading, revision } = snapshot;
1700
+ appearanceBound?.sync(preference, revision);
1701
+ fontSizeBound?.sync(fontSize, leading, revision);
1702
+ leadingBound?.sync(fontSize, leading, revision);
1703
+ };
1704
+ ctx.on("theme/change", sync);
1705
+ const appearanceInjected = (actions) => {
1706
+ appearanceBound = actions;
1707
+ sync(theme.getTheme());
1708
+ return { setTheme: (id) => {
1709
+ theme.setTheme(id);
1710
+ } };
1711
+ };
1712
+ ctx.slots.inject("settings.general.item", () => ctx.slots.register({
1713
+ name: "settings.general.item",
1714
+ id: "appearance",
1715
+ order: 10,
1716
+ store: appearanceStore,
1717
+ locale: SETTINGS_NS,
1718
+ inject: appearanceInjected
1719
+ }, AppearanceRow));
1720
+ const fontSizeInjected = (actions) => {
1721
+ fontSizeBound = actions;
1722
+ sync(theme.getTheme());
1723
+ return { setFontSize: (px) => {
1724
+ theme.setFontSize(px);
1725
+ } };
1726
+ };
1727
+ ctx.slots.inject("settings.general.item", () => ctx.slots.register({
1728
+ name: "settings.general.item",
1729
+ id: "font-size",
1730
+ order: 11,
1731
+ store: typographyStore,
1732
+ locale: SETTINGS_NS,
1733
+ inject: fontSizeInjected
1734
+ }, FontSizeRow));
1735
+ const leadingInjected = (actions) => {
1736
+ leadingBound = actions;
1737
+ sync(theme.getTheme());
1738
+ return { setLeading: (px) => {
1739
+ theme.setLeading(px);
1740
+ } };
1741
+ };
1742
+ ctx.slots.inject("settings.general.item", () => ctx.slots.register({
1743
+ name: "settings.general.item",
1744
+ id: "line-spacing",
1745
+ order: 13,
1746
+ store: typographyStore,
1747
+ locale: SETTINGS_NS,
1748
+ inject: leadingInjected
1749
+ }, LineSpacingRow));
1750
+ }
1751
+ //#endregion
1752
+ exports.SETTINGS_NS = SETTINGS_NS;
1753
+ exports.ThemeRuntime = ThemeRuntime;
1754
+ exports.apply = apply;
1755
+ exports.inject = inject;
1756
+ return module.exports;
1757
+ }
1758
+ });
1759
+
1760
+ //# sourceMappingURL=client.js.map