From 5ec26f0c093c801e777f51cb46b97b297591a4b4 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Mon, 17 Aug 2026 22:34:54 +0200 Subject: [PATCH] feat(app): align interface typography to base size Treat the appearance setting as the rendered base size so the type ramp scales predictably. Native starts one pixel larger while web and desktop preserve the authored 14px base, with legacy values migrated on load. --- docs/design.md | 8 ++- .../settings/agent-profile-edit-modal.tsx | 6 +- .../settings/agent-profile-row.tsx | 4 +- .../settings/agent-profiles-section.tsx | 2 +- .../agent-stream/chat-outline/rail.web.tsx | 2 +- packages/app/src/app/_layout.tsx | 4 +- packages/app/src/app/pair-scan.tsx | 2 +- .../app/src/assistant-file-links/link.tsx | 2 +- .../app/src/command-center/command-center.tsx | 16 ++--- .../src/components/adaptive-modal-sheet.tsx | 6 +- .../src/components/add-host-method-modal.tsx | 2 +- .../app/src/components/add-host-modal.tsx | 8 +-- .../app/src/components/add-project-flow.tsx | 16 ++--- packages/app/src/components/agent-list.tsx | 22 +++---- .../src/components/app-diagnostic-sheet.tsx | 2 +- .../components/appearance-style-boundary.tsx | 1 - .../src/components/archived-agent-callout.tsx | 2 +- .../src/components/assistant-fork-menu.tsx | 2 +- .../src/components/attachment-lightbox.tsx | 2 +- .../app/src/components/attachment-pill.tsx | 4 +- .../app/src/components/branch-switcher.tsx | 4 +- .../components/combined-model-selector.tsx | 4 +- .../src/components/context-window-meter.tsx | 14 ++--- .../app/src/components/dictation-controls.tsx | 8 +-- packages/app/src/components/diff-stat.tsx | 4 +- packages/app/src/components/diff-viewer.tsx | 2 +- .../app/src/components/download-toast.tsx | 4 +- .../app/src/components/explorer-sidebar.tsx | 2 +- .../app/src/components/file-explorer-pane.tsx | 20 +++---- .../headers/header-toggle-button.tsx | 2 +- .../app/src/components/hosts/host-filter.tsx | 2 +- .../src/components/import-session-sheet.tsx | 10 ++-- .../components/keyboard-shortcuts-dialog.tsx | 10 ++-- packages/app/src/components/left-sidebar.tsx | 8 +-- .../app/src/components/markdown/renderer.tsx | 2 +- packages/app/src/components/message.tsx | 26 ++++----- packages/app/src/components/model-browser.tsx | 14 ++--- .../app/src/components/pair-link-modal.tsx | 6 +- packages/app/src/components/plan-card.tsx | 2 +- .../src/components/provider-catalog-list.tsx | 12 ++-- .../components/provider-diagnostic-sheet.tsx | 14 ++--- .../app/src/components/question-form-card.tsx | 8 +-- .../app/src/components/quitting-overlay.tsx | 2 +- packages/app/src/components/rename-modal.tsx | 2 +- .../app/src/components/rewind/rewind-menu.tsx | 4 +- .../src/components/root-error-boundary.tsx | 6 +- .../components/schedules/cadence-editor.tsx | 4 +- .../schedules/schedule-form-sheet.tsx | 4 +- .../src/components/schedules/schedule-row.tsx | 2 +- .../app/src/components/settings-textarea.tsx | 2 +- .../app/src/components/sidebar-callout.tsx | 6 +- .../src/components/sidebar-workspace-list.tsx | 22 +++---- .../sidebar/pinned-section-header.tsx | 2 +- .../sidebar/sidebar-group-toggle-row.tsx | 4 +- .../components/sidebar/sidebar-header-row.tsx | 2 +- .../components/sidebar/sidebar-help-menu.tsx | 2 +- .../sidebar/sidebar-status-list.tsx | 2 +- .../sidebar/sidebar-workspace-row-content.tsx | 4 +- .../sidebar/sidebar-workspace-row.tsx | 2 +- .../sidebar/workspace-meta-row/index.tsx | 18 +++--- .../sidebar/workspace-trailing/index.tsx | 2 +- .../app/src/components/split-container.tsx | 2 +- packages/app/src/components/task-list-row.tsx | 2 +- .../terminal-copy-paste-actions.tsx | 4 +- packages/app/src/components/terminal-pane.tsx | 6 +- packages/app/src/components/toast-host.tsx | 2 +- .../app/src/components/tool-call-details.tsx | 8 +-- .../app/src/components/tool-call-sheet.tsx | 2 +- packages/app/src/components/ui/alert.tsx | 4 +- .../app/src/components/ui/autocomplete.tsx | 16 ++--- packages/app/src/components/ui/combobox.tsx | 10 ++-- .../components/ui/control-geometry.test.ts | 18 +++--- .../app/src/components/ui/control-geometry.ts | 14 ++--- .../app/src/components/ui/external-link.tsx | 6 +- packages/app/src/components/ui/form-field.tsx | 10 ++-- .../app/src/components/ui/menu/menu-item.tsx | 10 ++-- .../app/src/components/ui/menu/menu-sub.tsx | 2 +- .../app/src/components/ui/search-field.tsx | 2 +- packages/app/src/components/ui/shortcut.tsx | 2 +- .../app/src/components/ui/status-badge.tsx | 2 +- .../app/src/components/welcome-screen.tsx | 8 +-- .../src/components/workspace-hover-card.tsx | 12 ++-- .../src/components/workspace-setup-dialog.tsx | 4 +- .../src/composer/agent-controls/control.tsx | 6 +- .../app/src/composer/agent-controls/index.tsx | 6 +- .../composer/agent-controls/mode-control.tsx | 4 +- .../composer/agent-controls/model-sheet.tsx | 4 +- packages/app/src/composer/index.tsx | 6 +- packages/app/src/composer/input/input.tsx | 10 ++-- .../desktop/browser/pane/index.electron.tsx | 16 ++--- .../app/src/desktop/browser/pane/index.tsx | 6 +- .../src/desktop/browser/pane/index.web.tsx | 6 +- .../components/desktop-permission-row.tsx | 4 +- .../components/desktop-updates-section.tsx | 8 +-- .../components/integrations-section.tsx | 2 +- .../components/pair-device-section.tsx | 16 ++--- packages/app/src/file-pane/bar.tsx | 8 +-- packages/app/src/file-pane/conflict-alert.tsx | 4 +- packages/app/src/file-pane/editor/view.tsx | 2 +- .../src/file-pane/markdown-preview/index.tsx | 4 +- packages/app/src/file-pane/pane.tsx | 8 +-- packages/app/src/git/actions-split-button.tsx | 4 +- .../src/git/commits-section/commit-row.tsx | 6 +- .../git/commits-section/commits-section.tsx | 8 +-- packages/app/src/git/diff-folder-row.tsx | 2 +- packages/app/src/git/diff-pane.tsx | 12 ++-- packages/app/src/git/diff-too-large-state.tsx | 2 +- packages/app/src/git/file-header.tsx | 6 +- packages/app/src/git/forges/gitlab.view.tsx | 4 +- .../git/pull-request-panel/checks-section.tsx | 6 +- .../src/git/pull-request-panel/pane-error.tsx | 2 +- .../git/pull-request-panel/pane-skeleton.tsx | 2 +- .../app/src/git/pull-request-panel/pane.tsx | 24 ++++---- .../git/pull-request-panel/section-kit.tsx | 18 +++--- packages/app/src/hooks/use-settings/index.ts | 12 ++-- .../src/hooks/use-settings/storage.test.ts | 58 ++++++++++++++++--- .../app/src/hooks/use-settings/storage.ts | 43 ++++++++++---- packages/app/src/hosts/host-badge.tsx | 2 +- packages/app/src/hosts/host-chooser.tsx | 6 +- packages/app/src/i18n/resources/ar.ts | 4 +- packages/app/src/i18n/resources/en.ts | 4 +- packages/app/src/i18n/resources/es.ts | 4 +- packages/app/src/i18n/resources/fr.ts | 4 +- packages/app/src/i18n/resources/ja.ts | 4 +- packages/app/src/i18n/resources/ko.ts | 4 +- packages/app/src/i18n/resources/pt-BR.ts | 4 +- packages/app/src/i18n/resources/ru.ts | 4 +- packages/app/src/i18n/resources/zh-CN.ts | 4 +- .../agent-route-resolution-view.tsx | 6 +- .../new-workspace-launch/launch-control.tsx | 8 +-- .../src/panels/provider-subagent-panel.tsx | 2 +- packages/app/src/panels/setup-panel.tsx | 12 ++-- packages/app/src/plugins/surface-screen.tsx | 2 +- .../app/src/provider-usage/balance-bar.tsx | 4 +- packages/app/src/provider-usage/card.tsx | 14 ++--- .../src/provider-usage/settings-section.tsx | 2 +- .../src/provider-usage/tooltip-section.tsx | 8 +-- .../app/src/provider-usage/window-bar.tsx | 4 +- packages/app/src/review/surface.tsx | 8 +-- .../app/src/screens/new-workspace-screen.tsx | 10 ++-- .../app/src/screens/open-project-screen.tsx | 2 +- .../src/screens/project-settings-screen.tsx | 20 +++---- packages/app/src/screens/projects-screen.tsx | 6 +- packages/app/src/screens/schedules-screen.tsx | 6 +- packages/app/src/screens/sessions-screen.tsx | 6 +- packages/app/src/screens/settings-screen.tsx | 14 ++--- .../appearance/appearance-section.tsx | 50 ++++++++-------- .../appearance/apply-appearance.test.ts | 48 ++++++++------- .../settings/appearance/apply-appearance.ts | 16 ++--- .../settings/host-appearance-section.tsx | 6 +- .../app/src/screens/settings/host-page.tsx | 12 ++-- .../settings/keyboard-shortcuts-section.tsx | 8 +-- .../settings/metadata-generation-page.tsx | 4 +- .../app/src/screens/settings/plugins-page.tsx | 10 ++-- .../screens/settings/providers-section.tsx | 8 +-- .../src/screens/settings/settings-group.tsx | 4 +- .../settings/terminal-profile-edit-modal.tsx | 2 +- .../app/src/screens/startup-splash-screen.tsx | 4 +- .../workspace/workspace-desktop-tabs-row.tsx | 8 +-- .../workspace-open-in-editor-button.tsx | 6 +- .../workspace/workspace-route-state-views.tsx | 8 +-- .../screens/workspace/workspace-screen.tsx | 19 +++--- .../workspace/workspace-scripts-button.tsx | 12 ++-- .../workspace/workspace-tab-presentation.tsx | 2 +- .../workspace-tab-trailing-accessory.tsx | 2 +- .../app/src/styles/markdown-styles.test.ts | 8 +-- packages/app/src/styles/markdown-styles.ts | 36 ++++++------ packages/app/src/styles/settings.ts | 8 +-- packages/app/src/styles/theme.test.ts | 16 +++++ packages/app/src/styles/theme.ts | 15 +++-- packages/app/src/subagents/track.tsx | 6 +- 171 files changed, 709 insertions(+), 645 deletions(-) diff --git a/docs/design.md b/docs/design.md index af1bdfb93..99954a1c8 100644 --- a/docs/design.md +++ b/docs/design.md @@ -28,11 +28,13 @@ Before adding a new component, read `components/ui/`. The primitive usually exis ## 3. Hierarchy -Hierarchy is conveyed through weight and color, not size. Most interface text is `fontSize.sm`; compact metadata and hints use `fontSize.xs`. The distinction between a row's primary line and its secondary line is `foreground` versus `foregroundMuted`. +Hierarchy is conveyed through weight and color, not size. Most interface text is `fontSize.base`; compact metadata and hints use `fontSize.sm`. The distinction between a row's primary line and its secondary line is `foreground` versus `foregroundMuted`. + +The authored ramp uses a 14px base. New native installs default to 15px; web and desktop default to 14px. The Appearance **Base size** setting is the rendered `fontSize.base` value and scales the rest of the UI ramp proportionally. Code size remains independent. Weight has three tiers, applied by role: -- **Screen titles** — the title at the top of a screen — use `` (`packages/app/src/components/headers/screen-title.tsx`), which renders `fontSize.base` at weight `400` on compact and `300` on desktop. Top-of-screen titles are lighter on desktop, not heavier. The workspace header overrides the size to `fontSize.sm` so its title, project name, tabs, pane chrome, conversation text, and composer share the desktop working-surface scale (`packages/app/src/screens/workspace/workspace-screen.tsx`). +- **Screen titles** — the title in app chrome — use `` (`packages/app/src/components/headers/screen-title.tsx`), which renders `fontSize.base` at weight `400` on compact and `300` on desktop. The New workspace hero is the only larger product title; it uses `fontSize["2xl"]` (`packages/app/src/screens/new-workspace-screen.tsx`). - **Structural labels** use `fontWeight.medium`. This applies to section labels above a stack of rows (`packages/app/src/components/agent-list.tsx:519-523`, `packages/app/src/components/keyboard-shortcuts-dialog.tsx:63-67`), form field labels above an input inside a modal (`packages/app/src/components/add-host-modal.tsx:19-23`, `packages/app/src/components/pair-link-modal.tsx:24-28`), the title at the top of a modal/sheet/dialog (`packages/app/src/components/adaptive-modal-sheet.tsx:90-94`, `packages/app/src/components/ui/combobox.tsx:1607-1611`, `packages/app/src/components/welcome-screen.tsx:48-53`), action button labels in tight components such as the sidebar callout actions (`packages/app/src/components/sidebar-callout.tsx:218-221`), and inline data emphasis on dense metadata rows (`packages/app/src/components/git-diff-pane.tsx:2322-2327`, `packages/app/src/components/file-explorer-pane.tsx:1115-1122`). - **Content** uses `fontWeight.normal`. This applies to settings rows (`packages/app/src/styles/settings.ts`), sidebar primary list-item titles (`packages/app/src/components/sidebar-workspace-list.tsx:2680-2686`, `packages/app/src/components/agent-list.tsx:572-578`), `