Files
deepseek-harness/packages/client/ui-theme/src/boot-theme.ts
T
ihsiang 6d6f8f044c feat(ui): adaptive content width and font-size control
Add conversation adaptive content width and a Settings font-size control,
with theme presenter, font-size row, snapshots, tests, and agent notes.
2026-08-25 20:42:03 +08:00

38 lines
1.7 KiB
TypeScript

/**
* Theme bootstrap row for the browser's pre-plugin interval. Each index
* render embeds the current durable built-in preference and content font size;
* the browser resolves only `system`, then writes the same DOM fields
* ui-layout's ThemePresenter owns after the client plugin tree activates.
*/
import type { IndexInjection } from '@deepseek-ai/dsh-host-webserver'
import { DEFAULT_FONT_SIZE, DEFAULT_PREFERENCE, type ThemePreference } from './theme-settings.ts'
/** Build the inline script body for one schema-validated durable theme section. */
function bootThemeScript(preference: ThemePreference, fontSize: number): string {
return `(() => {
const preference = ${JSON.stringify(preference)}
const systemDark = preference === 'system'
&& typeof matchMedia !== 'undefined'
&& matchMedia('(prefers-color-scheme: dark)').matches
const dark = preference === 'dark' || systemDark
document.documentElement.style.colorScheme = dark ? 'dark' : 'light'
document.body.toggleAttribute('data-ds-dark-theme', dark)
document.body.style.setProperty('--dsh-content-font-size', ${JSON.stringify(`${fontSize}px`)})
})()`
}
/**
* The theme bootstrap as an injection row: an inline script immediately after
* the opening body tag, before the shell mount and module script.
* @param preference - Current Host-backed built-in preference.
* @param fontSize - Current Host-backed content font size in px.
* @returns the body script row.
*/
export function bootThemeInjection(
preference: ThemePreference = DEFAULT_PREFERENCE,
fontSize: number = DEFAULT_FONT_SIZE,
): IndexInjection {
return { kind: 'script', placement: 'body', text: bootThemeScript(preference, fontSize) }
}