From c28634e721674fac2ad279814bfc8020981d81e8 Mon Sep 17 00:00:00 2001 From: Laurin-Notemann <47634664+Laurin-Notemann@users.noreply.github.com> Date: Fri, 16 Oct 2026 18:31:06 +0000 Subject: [PATCH] fix(otterware): module settings use one frame, Mail/Calendar/Drive pages match Otter Mail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Module settings pages were wrapped twice (a titled card from the host, then the module's own section), sidebars repeated the module name (Mail › Reading under the Mail header), Mail rows carried "Account" on every row, and Calendar and Drive pages mixed raw headings, checkboxes and loose rows. Standalone apps showed Code-only rows on General. - Host no longer wraps module pages (own route and merged placements); each page draws its own sections. Sidebar shows the page name; the breadcrumb keeps "Mail › …". The Code scope sentence hides on module pages unless a scope is picked. - Mail: General (Startup & Dock, Mail, Translation, System, Getting started, Support), Appearance (layout and list-style tiles, seconds slider) and Mailboxes (list and per-mailbox details). OpenRouter row dropped (Agents owns it). Dropdowns show labels, not raw values. Only non-account scopes are labelled. - Calendar: General in Week / Working hours / Events / Reminders cards with switches, day toggles and a time-zone select; Calendars with switches, colour swatches and a Sync card. - Drive: Drives and Sharing pages with an intro line and a folder picker card; merged rows get their own sections. - Standalone profiles hide Code-only General rows and their search results (projects, worktrees, diffs, pull requests, commit text, legacy). - New Otter-owned SettingsTilePicker and SettingsSlider in the host style. SettingsPanels.tsx and ProjectDefaultsSettings.tsx become upstream seams for the `hidden` attributes. Co-Authored-By: Claude Opus 5.5 --- .../settings/ProjectDefaultsSettings.tsx | 3 + .../components/settings/SettingsPanels.tsx | 31 +- .../settings/SettingsSidebarNav.tsx | 3 +- .../components/settings/settingsLayout.tsx | 8 +- .../src/components/settings/settingsSearch.ts | 2 + .../src/otterware/ModuleSettingsMerges.tsx | 16 +- .../otterware/calendar/CalendarWebModule.tsx | 22 +- .../calendar/ui/CalendarSettings.tsx | 559 ++++++++++-------- .../src/otterware/drive/DriveWebModule.tsx | 4 +- .../src/otterware/drive/ui/DriveSettings.tsx | 73 +-- .../drive/ui/main/settings/folder-pane.tsx | 7 +- .../drive/ui/main/settings/folder-picker.tsx | 43 ++ .../drive/ui/main/settings/members-pane.tsx | 3 +- .../drive/ui/main/settings/settings-ui.tsx | 15 +- apps/web/src/otterware/mail/MailSettings.tsx | 20 +- apps/web/src/otterware/mail/MailWebModule.ts | 53 +- .../otterware/mail/content/main/home-view.tsx | 3 +- .../mail/content/main/reading-preferences.ts | 6 +- .../content/main/settings/accounts-pane.tsx | 32 +- .../content/main/settings/appearance-rows.tsx | 280 +++++++++ .../content/main/settings/general-rows.tsx | 256 ++++---- .../content/main/settings/reading-rows.tsx | 123 ---- .../content/main/settings/settings-ui.tsx | 19 +- .../main/settings/translation-section.tsx | 9 - apps/web/src/otterware/mail/rpc/host.ts | 12 +- apps/web/src/otterware/mail/settingsPaths.ts | 22 + apps/web/src/otterware/mail/settingsRows.ts | 31 +- .../src/otterware/settings/SettingsSlider.tsx | 59 ++ .../otterware/settings/SettingsTilePicker.tsx | 91 +++ apps/web/src/otterware/settingsRegistry.ts | 77 ++- .../src/routes/settings.$moduleId.$pageId.tsx | 12 +- scripts/otterware/upstream-seams.txt | 3 + 32 files changed, 1202 insertions(+), 695 deletions(-) create mode 100644 apps/web/src/otterware/drive/ui/main/settings/folder-picker.tsx create mode 100644 apps/web/src/otterware/mail/content/main/settings/appearance-rows.tsx delete mode 100644 apps/web/src/otterware/mail/content/main/settings/reading-rows.tsx create mode 100644 apps/web/src/otterware/mail/settingsPaths.ts create mode 100644 apps/web/src/otterware/settings/SettingsSlider.tsx create mode 100644 apps/web/src/otterware/settings/SettingsTilePicker.tsx diff --git a/apps/web/src/components/settings/ProjectDefaultsSettings.tsx b/apps/web/src/components/settings/ProjectDefaultsSettings.tsx index 58f4d10b3f..18fbf41c34 100644 --- a/apps/web/src/components/settings/ProjectDefaultsSettings.tsx +++ b/apps/web/src/components/settings/ProjectDefaultsSettings.tsx @@ -9,6 +9,7 @@ import { resolveProjectSettings } from "@t3tools/shared/projectSettings"; import { useNavigate } from "@tanstack/react-router"; import { mergeEnvironmentSettings } from "../../hooks/useSettings"; +import { isProfileSettingVisible } from "../../otterware/settingsRegistry"; import { getCustomModelOptionsByInstance } from "../../modelSelection"; import { applyProviderInstanceSettings, @@ -213,6 +214,7 @@ export function ProjectDefaultsSettings({ category }: { category: ProjectSetting settingKeys={["defaultThreadEnvMode"]} mixed={mixedWorkspace} id={searchableSetting("new-threads").id} + hidden={!isProfileSettingVisible("new-threads")} title="Workspace" description={ isProjectScope @@ -347,6 +349,7 @@ export function ProjectDefaultsSettings({ category }: { category: ProjectSetting settingKeys={["worktreeSubmodules"]} mixed={mixedSubmodules} {...searchableSetting("worktree-submodules")} + hidden={!isProfileSettingVisible("worktree-submodules")} description={ isProjectScope ? "How new worktrees in this project populate git submodules." diff --git a/apps/web/src/components/settings/SettingsPanels.tsx b/apps/web/src/components/settings/SettingsPanels.tsx index 89d372ca92..78928b2b67 100644 --- a/apps/web/src/components/settings/SettingsPanels.tsx +++ b/apps/web/src/components/settings/SettingsPanels.tsx @@ -1,4 +1,5 @@ import { ProfileWordmark } from "../../otterware/ProfileLogo"; +import { isProfileSettingVisible } from "../../otterware/settingsRegistry"; import { SettingsGroup } from "./SettingsGroup"; import { useScopedSettingsWriteAllowed } from "./useScopedSettings"; import { Spinner } from "~/components/ui/spinner"; @@ -2124,7 +2125,13 @@ function LegacyFeaturesSection() { }, [searchTargetId]); return ( -
+