Skip to content

feat(desktop): custom font settings for terminal and editor#1336

Closed
glitch418x wants to merge 8 commits into
superset-sh:mainfrom
zebroid-skate:feat/custom-font-settings
Closed

feat(desktop): custom font settings for terminal and editor#1336
glitch418x wants to merge 8 commits into
superset-sh:mainfrom
zebroid-skate:feat/custom-font-settings

Conversation

@glitch418x
Copy link
Copy Markdown
Contributor

@glitch418x glitch418x commented Feb 9, 2026

Custom Font Settings for Terminal and Editor

Adds user-configurable font settings in Settings > Appearance:

  • Editor Font — custom font family + size for diff views and file editors (Monaco)
  • Terminal Font — custom font family + size for terminal panels (xterm.js)
  • Live preview of selected font
  • Side-by-side inputs with reset to defaults
  • Settings persisted in local SQLite DB
  • Null = use existing hardcoded defaults (backwards compatible)

Screenshot

CleanShot 2026-02-12 at 13 58 03@2x

Implementation

  • DB: 4 nullable columns (terminal_font_family, terminal_font_size, editor_font_family, editor_font_size) + Drizzle migration
  • Router: getFontSettings / setFontSettings with validation (size clamped 10-24)
  • UI: New sections in Appearance settings with side-by-side inputs and live font preview
  • Terminal consumer: Fetches settings and applies live to xterm with fitAddon.fit()
  • Monaco consumer: useMonacoEditorOptions hook merging custom fonts into defaults
  • Settings search: New entries with relevant keywords

Closes #751

Summary by CodeRabbit

New Features

  • Added customizable font settings for code editors, diff viewers, and terminal panels with live preview
  • Users can now adjust font family and size (10-24pt) individually for editors and terminals in Appearance settings
  • Font settings are fully searchable within the settings menu with reset functionality to restore defaults

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 9, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR implements custom font settings by adding TRPC procedures to manage editor and terminal fonts, extending the database schema with four new columns, creating a settings UI with font preview and configuration, and integrating dynamic font options throughout the editor and terminal components.

Changes

Cohort / File(s) Summary
Database Schema & Migration
packages/local-db/src/schema/schema.ts, packages/local-db/drizzle/0021_add_font_settings.sql, packages/local-db/drizzle/meta/...
Added four new columns to settings table (terminalFontFamily, terminalFontSize, editorFontFamily, editorFontSize) and created migration 0021 with schema snapshot.
Backend Font Settings
apps/desktop/src/lib/trpc/routers/settings/index.ts, apps/desktop/src/lib/trpc/routers/settings/font-settings.utils.ts
Implemented getFontSettings and setFontSettings TRPC procedures; added setFontSettingsSchema validation and transformFontSettings utility for font input transformation and normalization.
Monaco Provider Hook
apps/desktop/src/renderer/providers/MonacoProvider/MonacoProvider.tsx, apps/desktop/src/renderer/providers/MonacoProvider/index.ts
Created useMonacoEditorOptions hook that fetches font settings and memoizes merged editor options; exported hook from barrel file.
Editor/Viewer Components
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ChangesContent/components/DiffViewer/DiffViewer.tsx, apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/FileViewerPane/components/FileViewerContent/FileViewerContent.tsx
Replaced static MONACO_EDITOR_OPTIONS with dynamic useMonacoEditorOptions hook to apply user font settings.
Terminal Configuration & Component
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/config.ts, apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/Terminal.tsx
Extracted DEFAULT_TERMINAL_FONT_FAMILY and DEFAULT_TERMINAL_FONT_SIZE as exported constants; added font settings fetch and effect to apply terminal fonts dynamically.
Settings UI
apps/desktop/src/renderer/routes/_authenticated/settings/appearance/components/AppearanceSettings/AppearanceSettings.tsx
Added Editor Font and Terminal Font sections with FontPreview component, input handlers with validation (10–24 range), draft state management, and reset functionality with optimistic updates.
Settings Search Integration
apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts
Introduced APPEARANCE_EDITOR_FONT and APPEARANCE_TERMINAL_FONT setting item IDs with searchable metadata including keywords for appearance section.
Test Coverage
apps/desktop/src/lib/trpc/routers/settings/font-settings.test.ts, apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.test.ts
Added comprehensive tests for font validation/transformation logic and settings search functionality.

Sequence Diagram

sequenceDiagram
    actor User
    participant UI as Settings UI
    participant Hook as useMonacoEditorOptions<br/>(Editor/Terminal)
    participant TRPC as TRPC Router
    participant DB as Database

    User->>UI: Configure font settings
    UI->>TRPC: setFontSettings(fontData)
    TRPC->>DB: Upsert font columns
    DB-->>TRPC: Success
    TRPC-->>UI: Return result
    UI->>UI: Optimistic update + invalidate

    Hook->>TRPC: getFontSettings.useQuery()
    TRPC->>DB: SELECT font columns
    DB-->>TRPC: Return font settings
    TRPC-->>Hook: fontSettings data
    Hook->>Hook: Memoize merged options<br/>(fallback to defaults)
    Hook-->>User: Applied fonts in editor/terminal
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 A hop through custom fonts so fine,
Monaco's editor, terminal align,
Settings dance with Berkeley Mono's grace,
Each glyph finds its perfect place!

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'feat(desktop): custom font settings for terminal and editor' clearly and concisely summarizes the main change—adding customizable font settings for both terminal and editor components.
Description check ✅ Passed The PR description is comprehensive, covering implementation details, database changes, UI additions, and includes a screenshot demonstrating the feature.
Linked Issues check ✅ Passed The PR fully implements the feature requested in #751: custom font options for both editor (Monaco) and terminal, allowing users to select their preferred monospace fonts with customizable sizes.
Out of Scope Changes check ✅ Passed All changes are directly related to implementing custom font settings; modifications include database schema, router procedures, UI components, settings search entries, and terminal/editor consumers, all within scope of the stated objective.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In @.claude-task-prompt.md:
- Around line 1-78: Remove the accidental .claude-task-prompt.md commit: delete
the file from the branch (git rm .claude-task-prompt.md), commit with a
conventional message (e.g., chore: remove AI task prompt file), and push to the
fork; if the file was included in an earlier commit that must be removed,
interactively rebase/amend to eliminate it or use git revert to undo that
addition before pushing. Also ensure the Appearance/Font implementation changes
are kept separate from this cleanup and add an entry to .gitignore if needed to
prevent future accidental commits of agent prompt files.

In
`@apps/desktop/src/renderer/routes/_authenticated/settings/appearance/components/AppearanceSettings/AppearanceSettings.tsx`:
- Around line 254-264: The Input uses defaultValue (uncontrolled) so it doesn't
update when fontSettings loads; change it to a controlled input by setting its
value to the draft or the loaded setting (e.g., value={editorFontDraft ??
fontSettings?.editorFontFamily ?? ""}), keep onChange={(e) =>
setEditorFontDraft(e.target.value)} and keep the onBlur handler
(handleEditorFontFamilyBlur and setEditorFontDraft(null)) as-is; make the
identical change for the terminal font family Input (the other Input handling
terminal font family) so both inputs reflect server-loaded fontSettings after
mount.
- Around line 30-35: The file defines duplicated DEFAULT_EDITOR_FONT_FAMILY,
DEFAULT_EDITOR_FONT_SIZE, DEFAULT_TERMINAL_FONT_FAMILY, and
DEFAULT_TERMINAL_FONT_SIZE which drift from the canonical values; update the
code to import the editor and terminal defaults from the single source of truth
instead of hardcoding them—specifically replace local
DEFAULT_EDITOR_FONT_FAMILY/DEFAULT_EDITOR_FONT_SIZE with the values exported by
MONACO_EDITOR_OPTIONS (from MonacoProvider.tsx) and replace
DEFAULT_TERMINAL_FONT_FAMILY/DEFAULT_TERMINAL_FONT_SIZE with the exports from
Terminal/config.ts so the component reads the shared constants rather than
duplicating them.
🧹 Nitpick comments (2)
apps/desktop/src/renderer/providers/MonacoProvider/MonacoProvider.tsx (1)

131-151: Clean hook implementation with proper memoization.

One subtlety: when a custom fontSize is applied (e.g., 20+), the lineHeight: 20 from MONACO_EDITOR_OPTIONS (Line 113) remains unchanged, which may cause cramped rendering at larger sizes. Consider also overriding lineHeight proportionally, or omitting it from the base options so Monaco can auto-calculate it.

apps/desktop/src/lib/trpc/routers/settings/index.ts (1)

486-533: Consider guarding against no-op mutations and adding a max length to font family strings.

Two minor points:

  1. If all input fields are undefined, the mutation still executes an upsert with an empty set object — a harmless but unnecessary DB write. A short-circuit (if (Object.keys(set).length === 0) return { success: true }) would avoid this.

  2. z.string().nullable().optional() for font families has no max length, so a caller could persist an arbitrarily long string. Consider adding .max(500) or similar as a safety bound.

Proposed changes
 			.input(
 				z.object({
-					terminalFontFamily: z.string().nullable().optional(),
+					terminalFontFamily: z.string().max(500).nullable().optional(),
 					terminalFontSize: z
 						.number()
 						.int()
 						.min(10)
 						.max(24)
 						.nullable()
 						.optional(),
-					editorFontFamily: z.string().nullable().optional(),
+					editorFontFamily: z.string().max(500).nullable().optional(),
 					editorFontSize: z
 						.number()
 						.int()
 						.min(10)
 						.max(24)
 						.nullable()
 						.optional(),
 				}),
 			)
 			.mutation(({ input }) => {
 				const set: Record<string, string | number | null> = {};
 
 				if (input.terminalFontFamily !== undefined) {
 					set.terminalFontFamily = input.terminalFontFamily?.trim() || null;
 				}
 				if (input.terminalFontSize !== undefined) {
 					set.terminalFontSize = input.terminalFontSize;
 				}
 				if (input.editorFontFamily !== undefined) {
 					set.editorFontFamily = input.editorFontFamily?.trim() || null;
 				}
 				if (input.editorFontSize !== undefined) {
 					set.editorFontSize = input.editorFontSize;
 				}
 
+				if (Object.keys(set).length === 0) {
+					return { success: true };
+				}
+
 				localDb

Comment thread .claude-task-prompt.md Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@apps/desktop/src/lib/trpc/routers/settings/font-settings.test.ts`:
- Around line 12-40: Tests duplicate the Zod schema and transform logic
(setFontSettingsSchema and transformFontSettings) from the router which can
drift; fix this by extracting/exporting the canonical definitions from the
router (or a new shared module like font-settings.utils) and update the test to
import setFontSettingsSchema and transformFontSettings from that module so the
tests exercise the real code rather than a copy.
🧹 Nitpick comments (1)
apps/desktop/src/lib/trpc/routers/settings/font-settings.test.ts (1)

43-57: Defaults test asserts a hardcoded literal, not production code.

This test constructs an object inline and asserts its own literal values are null — it doesn't exercise any application code path. It will always pass regardless of what getFontSettings actually returns.

Either import and call the real getFontSettings (with a mocked/empty DB) or remove this test to avoid false confidence.

Comment thread apps/desktop/src/lib/trpc/routers/settings/font-settings.test.ts Outdated
@glitch418x
Copy link
Copy Markdown
Contributor Author

hello @Kitenite would you mind having a look at this?

@Kitenite
Copy link
Copy Markdown
Collaborator

Very cool will look!

@glitch418x glitch418x force-pushed the feat/custom-font-settings branch from e47d3a4 to 5307d10 Compare February 10, 2026 21:47
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In
`@apps/desktop/src/renderer/routes/_authenticated/settings/appearance/components/AppearanceSettings/AppearanceSettings.tsx`:
- Around line 266-274: The font-size Input is fully controlled from fontSettings
so intermediate keystrokes are rejected by handleEditorFontSizeChange; add a
local draft state (e.g., editorFontSizeDraft) initialized from
fontSettings?.editorFontSize ?? DEFAULT_EDITOR_FONT_SIZE, bind Input value to
that draft, update the draft on every onChange without immediate validation, and
only validate and call the existing mutate inside onBlur or onSubmit (or on
Enter) using the same 10–24 range; also sync the draft when fontSettings
changes. Repeat the same pattern for the terminal font size
(terminalFontSizeDraft and its onChange/onBlur handler) so typing “2” won’t snap
back until the value is committed.

In `@packages/local-db/drizzle/meta/0021_snapshot.json`:
- Line 4: The snapshot ID "a1b2c3d4-font-sett-ings-snapshot000021" is manually
edited and not a valid UUID v4; revert the manual change and regenerate this
snapshot using the drizzle CLI (run drizzle-kit generate) so Drizzle produces a
proper UUID v4 ID and valid contents for the snapshot file, then commit the
regenerated file and avoid manual edits to auto-generated Drizzle snapshots in
the future.
🧹 Nitpick comments (2)
apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.test.ts (1)

53-64: Consider adding explicit existence assertions before checking properties.

If find() returns undefined, the test still fails but with a confusing message like expected undefined to be "appearance". Adding expect(editorFont).toBeDefined() before the section check would produce a clearer failure.

Suggested improvement
 		expect(editorFont?.section).toBe("appearance");
+		// or, for clearer failure messages:
+		// expect(editorFont).toBeDefined();
+		// expect(editorFont!.section).toBe("appearance");
 		expect(terminalFont?.section).toBe("appearance");
apps/desktop/src/renderer/routes/_authenticated/settings/appearance/components/AppearanceSettings/AppearanceSettings.tsx (1)

41-66: Hardcoded terminal preview colors won't follow the active theme.

bg-[#1e1e1e] text-[#cccccc] border-[#333] will look out of place on light or non-dark themes. Consider using semantic Tailwind classes (e.g., bg-background text-foreground border-border) or reading the active terminal theme colors so the preview stays consistent.

Comment on lines +266 to +274
<Input
type="number"
min={10}
max={24}
value={fontSettings?.editorFontSize ?? DEFAULT_EDITOR_FONT_SIZE}
onChange={handleEditorFontSizeChange}
disabled={isFontLoading}
className="w-20"
/>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Font size input lacks draft state — typing a new value snaps back immediately.

The font size <Input> is controlled via value={fontSettings?.editorFontSize ?? DEFAULT_EDITOR_FONT_SIZE}, but handleEditorFontSizeChange only calls mutate when the parsed value falls within 10–24. If a user selects all and types "2" (intending to continue typing "20"), the value is rejected and React immediately resets the display to the old value, making it feel unresponsive.

Consider adding a local draft state for font size (like you do for font family) and committing on blur, or at least debouncing the mutation so intermediate keystrokes aren't lost.

The same applies to the terminal font size input (Lines 336-346).

🤖 Prompt for AI Agents
In
`@apps/desktop/src/renderer/routes/_authenticated/settings/appearance/components/AppearanceSettings/AppearanceSettings.tsx`
around lines 266 - 274, The font-size Input is fully controlled from
fontSettings so intermediate keystrokes are rejected by
handleEditorFontSizeChange; add a local draft state (e.g., editorFontSizeDraft)
initialized from fontSettings?.editorFontSize ?? DEFAULT_EDITOR_FONT_SIZE, bind
Input value to that draft, update the draft on every onChange without immediate
validation, and only validate and call the existing mutate inside onBlur or
onSubmit (or on Enter) using the same 10–24 range; also sync the draft when
fontSettings changes. Repeat the same pattern for the terminal font size
(terminalFontSizeDraft and its onChange/onBlur handler) so typing “2” won’t snap
back until the value is committed.

{
"version": "6",
"dialect": "sqlite",
"id": "a1b2c3d4-font-sett-ings-snapshot000021",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check all snapshot IDs in the local-db drizzle directory
echo "=== All snapshot IDs in packages/local-db/drizzle/meta/ ==="
fd 'snapshot.json' packages/local-db/drizzle/meta/ --exec grep '"id"' {} + 2>/dev/null | head -20

echo ""
echo "=== Listing all snapshot files ==="
fd 'snapshot.json' packages/local-db/drizzle/meta/ -x ls -1 2>/dev/null

Repository: superset-sh/superset

Length of output: 2672


🏁 Script executed:

#!/bin/bash
# Extract just the top-level snapshot ID from each file (first "id" field)
echo "=== Top-level snapshot IDs ==="
for file in packages/local-db/drizzle/meta/*_snapshot.json; do
  filename=$(basename "$file")
  id=$(head -10 "$file" | grep -m1 '"id"' | sed 's/.*"id": "\([^"]*\)".*/\1/')
  echo "$filename: $id"
done | sort

Repository: superset-sh/superset

Length of output: 1350


Regenerate this snapshot—it was manually edited.

The snapshot ID "a1b2c3d4-font-sett-ings-snapshot000021" is not a Drizzle-generated UUID. All legitimate snapshots in this directory use proper UUID v4 format (e.g., 2c6f4b00-72ca-4cc3-bc0a-f25a40163119). This ID explicitly spells out readable text (font-sett-ings-snapshot), indicating manual editing.

Do not manually edit auto-generated Drizzle files. Regenerate this snapshot using drizzle-kit generate to ensure drizzle-kit operations (push, migrate, etc.) function correctly.

🤖 Prompt for AI Agents
In `@packages/local-db/drizzle/meta/0021_snapshot.json` at line 4, The snapshot ID
"a1b2c3d4-font-sett-ings-snapshot000021" is manually edited and not a valid UUID
v4; revert the manual change and regenerate this snapshot using the drizzle CLI
(run drizzle-kit generate) so Drizzle produces a proper UUID v4 ID and valid
contents for the snapshot file, then commit the regenerated file and avoid
manual edits to auto-generated Drizzle snapshots in the future.

glitch418x and others added 8 commits February 11, 2026 22:48
Add configurable font family and font size settings for both terminal
panels and editor/diff views in the Appearance settings page.

- Add terminal_font_family, terminal_font_size, editor_font_family,
  editor_font_size columns to local-db settings table
- Add getFontSettings/setFontSettings tRPC procedures
- Add Editor Font and Terminal Font sections to Appearance settings
  with text input for font family, number input for size (10-24),
  and reset to default button
- Wire up Terminal to apply custom fonts via xterm options with live
  updates
- Wire up Monaco editor/diff views via useMonacoEditorOptions hook
- Add settings search entries for font customization
- Move Zod schema and transform logic to font-settings.utils.ts (single
  source of truth) and import in both the router and test file
- Add .max(500) length limit on font family strings for safety
- Add no-op guard to skip DB write when no fields are provided
- Remove ineffective defaults test that only asserted its own literals

Addresses remaining CodeRabbit review feedback on PR #1336.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add draft state for font size inputs (editor & terminal) so mutations
  only fire on blur instead of every keystroke, matching the existing
  font family draft pattern
- Replace fake snapshot UUID in migration 0021 with a real UUID v4
@Kitenite
Copy link
Copy Markdown
Collaborator

Hey @uinafdev! I've built on top of your work here with a refactor of the AppearanceSettings component in #1431.

The main changes:

  • Extracted each section (theme, markdown, editor font, terminal font, custom themes) into its own component
  • Deduplicated the editor/terminal font sections into a single reusable FontSettingSection parameterized by variant
  • Added SectionList for automatic border separators (matching the TerminalSettings pattern)

This brings AppearanceSettings.tsx from 432 lines down to ~80 lines. Let me know if you have any thoughts!

@Kitenite
Copy link
Copy Markdown
Collaborator

This is sick and sorry I missed merging this in! @glitch418x

@Kitenite
Copy link
Copy Markdown
Collaborator

I couldn't push to your PR so I created a new one and will attribute to you. If you'd prefer I update your PR next time could you allow contributor edit like the example below?

image

@Kitenite
Copy link
Copy Markdown
Collaborator

Either way this is awesome. Thanks so much!

Kitenite added a commit that referenced this pull request Feb 12, 2026
…#1431)

* feat(desktop): add custom font settings for terminal and editor

Add configurable font family and font size settings for both terminal
panels and editor/diff views in the Appearance settings page.

- Add terminal_font_family, terminal_font_size, editor_font_family,
  editor_font_size columns to local-db settings table
- Add getFontSettings/setFontSettings tRPC procedures
- Add Editor Font and Terminal Font sections to Appearance settings
  with text input for font family, number input for size (10-24),
  and reset to default button
- Wire up Terminal to apply custom fonts via xterm options with live
  updates
- Wire up Monaco editor/diff views via useMonacoEditorOptions hook
- Add settings search entries for font customization

* feat(appearance): improve font settings layout with side-by-side inputs and live preview

* feat(appearance): make Nerd Fonts a hyperlink in terminal font description

* chore: remove claude task prompt

* test(desktop): add tests for custom font settings

* fix(appearance): address CodeRabbit review feedback on font settings

* refactor(settings): extract font settings schema into shared module

- Move Zod schema and transform logic to font-settings.utils.ts (single
  source of truth) and import in both the router and test file
- Add .max(500) length limit on font family strings for safety
- Add no-op guard to skip DB write when no fields are provided
- Remove ineffective defaults test that only asserted its own literals

Addresses remaining CodeRabbit review feedback on PR #1336.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address CodeRabbit review feedback on font settings

- Add draft state for font size inputs (editor & terminal) so mutations
  only fire on blur instead of every keystroke, matching the existing
  font family draft pattern
- Replace fake snapshot UUID in migration 0021 with a real UUID v4

* fix: regenerate font settings migration after merge with main

* chore: remove font settings migration for regeneration

* refactor(desktop): extract AppearanceSettings into section components

Break the monolithic 432-line AppearanceSettings into focused section
components following the established TerminalSettings pattern:

- FontPreview: extracted inline preview component
- FontSettingSection: reusable editor/terminal font section (deduplicates ~120 lines)
- ThemeSection: owns theme store hooks and grid rendering
- MarkdownStyleSection: owns markdown store hooks and select dropdown
- CustomThemesSection: placeholder for upcoming feature

Use SectionList for automatic border separators, replacing fragile
conditional className logic.

---------

Co-authored-by: glitch418x <glitch@uinaf.dev>
@glitch418x glitch418x closed this Feb 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] custom fonts

2 participants