feat(settings): editor font size for chat input and code editor (#1325) (#2065)

* feat(settings): add editor font size setting for chat input and code editor

Adds an 'Editor font size' control in Settings > Appearance that sets an
absolute px font size for the chat input textarea and the in-app
CodeMirror editor. Mirrors the existing terminalFontSize lifecycle.

- New store field editorFontSize (default 13, clamp 9-32, step 1) in
  useUIStore with narrow selectors at each consumer.
- Persistence wired through appearanceAutoSave, desktop + runtime API
  types, and persistence.ts read/normalize.
- Settings UI row (NumberInput) with reset to 13, VisibleSetting union
  entry, OpenChamberPage registration, and search index entry
  appearance.editor-font-size.
- Applied as a post-zoom absolute override on the chat input textarea
  and on the CodeMirror theme's content rule, leaving gutter/line-number
  chrome at its existing hardcoded sizes (matches terminal scope).
- All 10 locales translated (en, es, fr, ja, ko, pl, pt-BR, uk, zh-CN,
  zh-TW); no English placeholders in non-English dictionaries.

Refs #1325

* fix(codemirror): use unitless lineHeight so it scales with editor font size

The & rule in the CodeMirror theme set lineHeight to 1.5rem (~24px),
which does not scale when editorFontSize is increased (e.g., 28-32px).
This causes overlapping lines at larger font sizes.

Change to unitless 1.5, which scales proportionally with whatever fontSize
resolves to (dynamic prop or --text-code fallback). Matches browser best
practice for proportional leading.

Review comment: https://github.com/openchamber/openchamber/pull/2065

---------

Co-authored-by: bashrusakh <bashrusakh@users.noreply.github.com>
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
Leonid
2026-07-11 14:45:27 +03:00
committed by GitHub
co-authored by bashrusakh Bohdan Triapitsyn
parent bfaf62e222
commit e0229917f8
23 changed files with 108 additions and 15 deletions
@@ -11,7 +11,7 @@ export function createFlexokiCodeMirrorTheme(
// When syntax colors are provided elsewhere (e.g. the Shiki decoration
// extension), pass `{ syntaxColors: false }` to keep only the editor UI theme
// (gutters, selection, cursor) and avoid a competing token color source.
options?: { syntaxColors?: boolean },
options?: { syntaxColors?: boolean; fontSize?: number },
): Extension {
const isDark = theme.metadata.variant === 'dark';
@@ -19,12 +19,14 @@ export function createFlexokiCodeMirrorTheme(
const highlights = theme.colors.syntax.highlights || {};
const tokens = theme.colors.syntax.tokens || {};
const contentFontSize = options?.fontSize ? `${options.fontSize}px` : 'var(--text-code)';
const ui = EditorView.theme({
'&': {
backgroundColor: 'var(--background)',
color: theme.colors.syntax.base.foreground,
fontSize: 'var(--text-code)',
lineHeight: '1.5rem',
fontSize: contentFontSize,
lineHeight: '1.5',
position: 'relative' as const,
},
'.cm-scroller': {