Skip to content

fix(otterware): module settings use one frame, Mail/Calendar/Drive pages match Otter Mail - #97

Merged
Laurin-Notemann merged 1 commit into
mainfrom
fix/module-settings-layout
Oct 16, 2026
Merged

Laurin-Notemann merged 1 commit into
mainfrom
fix/module-settings-layout

Conversation

@Laurin-Notemann

Copy link
Copy Markdown
Contributor

Problem

Module settings looked bolted on:

  • Every module page was wrapped twice: the host drew a titled card, then the module drew its own section inside it ("Reading" › "Reading").
  • The sidebar repeated the module name under its own header ("Mail › Reading" under MAIL).
  • Mail labelled every row "Account", and its dropdowns showed raw values ("30", "inbox").
  • The OpenRouter key sat under Translation.
  • Calendar and Drive mixed raw <h2>s, checkboxes, unlabeled inputs and loose rows outside any card.
  • Standalone apps (Otter Mail) showed Code-only rows on General: projects, worktrees, diffs, pull requests and commit text.

Fix

  • Settings frame:
    • The host no longer wraps module pages, either on their own route or where they merge into host pages. Each page draws its own sections.
    • The sidebar shows only the page name; the breadcrumb and search keep "Mail › …".
    • The Code scope sentence ("Applying settings for … across …") hides on module pages unless a project or environment is already picked.
  • Mail:
    • Pages follow Otter Mail: General (Startup & Dock, Mail, Translation, System, Getting started, Support), Appearance (formerly Reading) and Mailboxes (the list plus each mailbox's details).
    • Appearance uses picture tiles for layout and list style, and a slider in seconds for the mark-as-read delay. Otter Mail's original row titles and descriptions are back.
    • The OpenRouter row is dropped; Agents owns that key.
    • Rows name their scope only when it isn't the default Account scope ("This device", "Environment").
    • Mail's "open settings" bridge and in-app links resolve through the registry, so they land on the right page in both the combined and standalone apps.
  • Calendar:
    • General has Week / Working hours / Events / Reminders cards, with switches, day toggles, duration selects and a time-zone select defaulting to "This device".
    • Calendars has colour swatches, Watch only / Show switches, and a Sync card with units.
    • The healthy-account "ok" label is hidden.
  • Drive: Drives and Sharing have an intro line, a folder-picker card and no extra heading. Rows merged into Appearance and Account get their own sections.
  • Standalone profiles: hide Code-only General rows and their search results (Organization, Projects & threads, Text generation, Legacy features, Workspace, Submodules, Proactive panels, diff rows). The model, permissions and composer rows stay, because the app's assistant chat uses them.
  • New Otter-owned controls in apps/web/src/otterware/settings/: SettingsTilePicker (the look of Appearance's mode tiles) and SettingsSlider (the Motion slider). No upstream component was edited for these.

Upstream seams: this PR adds SettingsPanels.tsx and ProjectDefaultsSettings.tsx to upstream-seams.txt. Each change in them is a one-line hidden={!isProfileSettingVisible(id)} registry call, chosen so the upstream sync stays cheap: no re-indentation. settingsLayout.tsx, SettingsSidebarNav.tsx and settingsSearch.ts were already seams; each gets one more registry call.

Coordination with the shared-account PR: the account-facing behaviour stays with it — Add mailbox / Connect buttons, the empty state, the Calendar developer panel, and the Drive CLI login. That PR's edits in the files we both touch change behaviour only, so whichever lands second rebases with small conflicts.

Validation

  • vp run check:changed: format, lint (no errors), @t3tools/web typecheck and 70 affected tests, all passing.
  • node scripts/otterware/check-upstream-seams.ts: clean.
  • Manual check against a dev server on disposable worktree state, in the combined profile and the standalone mail profile, dark mode:
    • Mail General, Appearance (tile selection and reset), Mailboxes (empty state).
    • Calendar General (adding and removing a reminder) and Calendars (demo calendars).
    • Drive Drives and Sharing.
    • App General, Appearance and Account with merged module sections.
    • Standalone General and Appearance.
    • The combined General page still shows every Code section.
    • Screenshots were reviewed by Laurin in the T3 thread.
  • Not covered: a populated Mailboxes list (no mail accounts in dev state) and Drive folders (dev state not signed in to Otter Cloud).
  • Known pre-existing issue, handed to the shared-account work: mail.preferences.setUi fails to encode its undefined response, so Mail UI preferences don't sync.

Model: Claude Opus 5.5 · Harness: Claude Code in T3 Code

🤖 Generated with Claude Code

…ges match Otter Mail

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 <noreply@anthropic.com>
@Laurin-Notemann
Laurin-Notemann enabled auto-merge (squash) October 16, 2026 18:32
@Laurin-Notemann
Laurin-Notemann merged commit df65c59 into main Oct 16, 2026
19 checks passed
@Laurin-Notemann
Laurin-Notemann deleted the fix/module-settings-layout branch October 16, 2026 18:41
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.

1 participant