Skip to content

[feature] after a meeting: tabs, who-does-what, find & replace; org pages; ask to record when a call starts; start/stop cues - #659

Open
pathorsdesign wants to merge 121 commits into
pathorsAI:mainfrom
pathorsdesign:claude/post-meeting-v2
Open

pathorsdesign wants to merge 121 commits into
pathorsAI:mainfrom
pathorsdesign:claude/post-meeting-v2

Conversation

@pathorsdesign

@pathorsdesign pathorsdesign commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

Reworks what you see after a meeting (from the v2 design canvas and the team's review meeting), gives org pages their folders and drafts, and adds the two desktop cues from #606 and #607 — plus a round of library and polish fixes.

The recording page

  • Header + tabs. One header (name, where it's filed, 連接 AI, 複製) over tabs: 總結 / 後續行動 / 筆記 (only with notes) / 會議背景 (only with a prepared background) / 評分 / 回放. Replaces the single long report and its TOC; the titlebar keeps only a back button (‹ folder) and the analysis chip.
  • Title is named automatically by the filing pass (tagged 自動命名; click or the pencil to rename). Folders stay a suggestion (chips, 選其他資料夾…, 先不歸檔). Org recordings show org › folder instead of "not filed".
  • 總結 reads a section at a time behind small tabs (重點/決議/待解問題…), cut from the saved brief — no extra model call. Headings a model returns bolded (**## Highlights**) are unwrapped first.
  • 後續行動 say which side does each (我們 / 對方) and who, grouped, with copy per side (「複製給對方」 pastes into LINE). The brief's next-agenda section moves here. Items made before sides existed say so and offer a regenerate. shared/prompts/study.json changes accordingly (Android regenerated; its parser ignores the new fields for now).
  • 評分 is unchanged in the end: a trimmed five-facts version was tried and reverted pending a redesign (a separate "Speech Intelligence" proposal is out for review).
  • Saved / regenerate footer under summary and actions: generated once, kept, regenerated only on request.
  • 連接 AI popover (MCP command, Claude Desktop config, live status, questions naming this recording); 複製 names the tab it copies (複製總結…). Prompt copy works on org recordings too.
  • Removed: meeting-kind select/tag and the timeline's 模板 chip, the 交給你的 AI section, the ⋯ menu, several one-time hints.

Find & replace in the transcript

VS Code-style find widget: a side toggle opens a replace row, ↑↓ step through hits, Replace / Replace all as icon buttons (count + shortcut in tooltips, ⌘⌥F). Select text → 「取代…」. Edits persist to the entry (text only, by segment id) and sync; a toast offers 「加入常用詞」 (the fix plus the misheard word as a variant); a notice offers to regenerate the stale analysis. Read-only org recordings have no replace UI (no API to write them).

Ask to record when a call starts (#606)

  • New meeting_detect module polls (1 s) which app is using the mic: CoreAudio process objects on macOS 14.2+ (device-running fallback below), the microphone consent store on Windows. No permission prompts.
  • An app holding the mic for 2 s → a Notion-style pill at the top-right (unfocused, always on top): 開始記錄這場會議, 開始錄音 (or 開始錄音:{draft} when a draft is due within ±15 min) with a ⌄ menu (不用 / 不要再對 X 詢問), an × to close, a 20 s countdown line.
  • Every join asks again (any mic release ends the call); never while Parley records or dictates; dictation tools (Typeless, Wispr, Superwhisper, macOS dictation…) are ignored by id and by name.
  • Setting: 偵測到通話時提醒我開始錄音 (default on) with muted apps as chips.

Onboarding

  • The intro's four steps are buttons: clicking one plays the demo from that step, with the earlier steps shown done.
  • The speaker background's fill-in from memory files is a one-line status at the right of its heading, stepping read → sort → write and ending on the outcome (with refresh). It names no tool or file.

Floating window, reminders, colour

  • Floating window: − minimizes (Dock / taskbar) and the Dock tile is the Parley logo on macOS; a separate Minimize2 button shrinks to the draggable mini window. The mini window keeps notes / transcript / coach order, shows the drag grip (grab cursor), and its transcript is selectable. The title bar no longer pushes close off when narrow.
  • Meeting-draft reminders are a system notification only (the in-app card is gone).
  • Warning tokens (pause state, callouts) move from mustard to a soft apricot.
  • Onboarding's last step: the transcribing bar sits under the buttons instead of replacing one.

Voice-typing cues (#607)

macOS system sounds via NSSound (Ping to start, Bottle to stop); Windows system aliases via PlaySoundW. Voice typing plays the start cue on press and the stop cue after the capture is cut, always. Meeting recordings play no cue at either end, so there is no setting.

Library, org pages and shell

  • Org pages: folder cards from the UX file (hover opens the folder), a 新增資料夾 card that drafts a grey folder to name in place, one sideways-scrolling row; below, two columns: 會議草稿 for this org (add one preset to the org; same store as 總覽, so both stay in sync) and 未放進資料夾. The org crumb goes back to the org.
  • Opening recordings: the whole row is clickable and spins while opening; org recordings open at once with audio downloading in the background; their analysis is cached under the right id, so it runs once instead of on every open (it used to regenerate a different summary each time).
  • 總覽 backdrop from the UX file, sidebar #f5f7f9 with one 1px divider that darkens on hover, empty states, the missing-audio note in its icon's tooltip.

Checks

  • bunx tsc --noEmit ✓
  • bunx vitest run ✓ (1798 tests)
  • cargo clippy --all-targets -D warnings (macOS) ✓; the Windows-only code was clippy-checked in isolation — the Windows CI job is the real check.
  • Clicked through in the local dev app by the designer during the session; not yet on a built app or on Windows.

Notes for review

  • Org recordings can't be renamed or have their transcript edited — the cloud API has no endpoint for it.
  • Design deviations on purpose: the 新增資料夾 hover frame (#eef8ff) and opened-folder blue (#cfebff) differ from the UX file.
  • The dictionary action adds the misheard word as an auto-correcting variant; very short replacements could over-correct.
  • Dev builds attribute notifications to Terminal (tauri-plugin-notification does this when is_dev()); a bundled app uses Parley's icon.

🤖 Generated with Claude Code

https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp

Refs #676 (mobile follow-up)

fontech and others added 30 commits November 1, 2026 22:13
…t an AI critique

The post-meeting delivery report read as a pile of text: a tone verdict with
an advisory, an "AI read" narrative, and a talk-volume strip on top of the
numbers. The team wants it to read like a small dashboard of objective facts.

The full/replay scorecard is now five tiles - pace, talk share, filler-word
count, long pauses, interruptions - plus a row of the most frequent filler
words as chips ("然後 ×6", "對對對 ×3"). Everything is computed locally from
the saved transcript and respects the replay trim window.

- fillerWords: countFillersByWord tallies lexical crutch words (shared
  vocabulary, longest entry first), hesitation sounds folded per shape, and
  runs of three or more 對; topFillers ranks them.
- turnTiming: countLongPauses (a >= 3 s gap between the user's own segments
  that nobody else spoke in) and countInterruptions (the user starting before
  the other side's segment ended, or within 300 ms of an unfinished sentence;
  once per other-side segment). Both are null when the session is not split
  by source, like talkTimeRatio.

The LLM delivery pass still runs and is saved; this view just stops
rendering its tone and narrative. The live meters are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…ck copy per side

The post-meeting action list went unused because it never said who does
what. After a sales call the user wants to paste "here's what we do" to
their team and "here's what you do" to the customer, so each item now
carries an optional side ("us" / "them") and owner (a name as said in the
meeting).

- The action-items prompt (shared/prompts/study.json) now asks for
  follow-ups on BOTH sides and for side + owner; the strict schema gains
  both as nullable fields. Android's generated prompt copy, the golden
  fixture and the phone's word-schema are regenerated from the same JSON;
  the phone parser ignores the new fields, so phone-made items stay
  side-less.
- The panel groups sided items under "us" then "them" headers (side
  name from the user's company / the recording's folder, owners, count)
  with a copy button that puts a numbered, LINE-ready list on the
  clipboard. Items with no side (older recordings) render as before.
- Both fields are optional on ActionItem, so existing entries and the
  cloud copy shared with iOS/Android keep working; MCP writes keep them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… actions, notes, delivery, replay

The report was one long scroll (brief, action items, delivery, a hand-off
section) behind two titlebar tabs, with a filing suggestion card and a
folder bar stacked on top of it. Finding one thing meant scrolling past the
others, and the card asked the user to accept a title nobody wanted to
think about.

Now the page has one header: the recording's name (click to rename, Esc
cancels), a Copy menu (this page / transcript / transcript with the
analysis prompt), a filing row, and an underline tablist - 總結, 後續行動
(with a count), 筆記 (only when notes were taken in the floating window),
評分 and 回放. The titlebar keeps only the analysis chip.

The title is no longer a suggestion (meeting decision: just name it, let
them edit). When the filing pass lands with a title and the recording still
carries the name it had when the pass started, filingRun renames it through
renameHistoryEntry - the same path as a user rename, which also clears the
suggestion's title - and sets a session-only titleAutoApplied flag that
drives an "auto-named" tag. Any rename clears the flag. Off screen, the
saved entry's title is checked instead. Only the folder half stays a
suggestion, as chips in the filing row (first one emphasized, a new folder
dashed), with "choose another folder" and "not now".

studyTab becomes summary | actions | notes | delivery | replay; setStudyTab
normalizes the old "report" to "summary". The notes tab reads the notes back
out of the saved meeting context (meetingNotesOf, the inverse of
contextWithNotes). The summary and actions tabs end with a "saved, won't
regenerate" line and a Regenerate button (regenerateArtifact).

FilingSuggestionCard, HandoffSection, the report's TOC rail and its
sections are gone; their filing logic (spent-suggestion resolution, folder
creation, fly-to-folder, the "filed" tick via useRefile) moved into
FilingRow, and the hand-off's working parts already live in the guide bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…moves under the action items

The brief's four sections on one page made 總結 too long to read. The saved
text is now cut at its headings: 總結 shows one section at a time behind small
tabs (重點/決議/待解問題…), and the forward-looking section (Suggested next
agenda / Next steps) reads under 後續行動, next to who does what. Cutting the
saved text costs no model call and works on every recording already saved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…itle

The row highlights on hover like one big target, but only the title was a
button, so clicks on the date, the source icon or the stats did nothing and it
took several tries to get in. The row now opens on any click that isn't on one
of its own controls.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…ground

Opening a shared org recording waited for its whole audio file to download
before the page changed — twenty-odd seconds with nothing on screen, so the
click looked dead and people clicked again (each click starting another
download). The page now opens on the transcript and analysis; the audio
attaches to the player when it lands, and is kept for the rest of the run so a
reopen plays at once. The row spins while a recording opens, further clicks wait
for it, and a failed open says so instead of only logging.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… yet"

An org recording is read-only and has no personal folder, so the page's filing
row fell through to 還沒歸檔 even when it sat in an org folder such as 內部會議.
The library now hands the org and folder over when it opens one, and the row
shows them as the destination picker does (org tag › folder), without actions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…ft open

It dated from when 離開 was the only way out of a recording. The library now
opens a recording in one click, and the chip, showing only a name, read as
where you are rather than a way back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…ive in the page header

The titlebar showed 'folder › recording name' (renameable) right above a page
header showing the same name (renameable) and the same folder (changeable): two
breadcrumbs and two places to rename. The titlebar now holds one back button to
the recording's folder; the header owns what the recording is and where it is
filed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The analysis detects the kind and it is rarely changed, yet it sat at the end
of the filing row as a 132px form select. It is now a quiet pill next to the
title, as the design canvas has it: it says what the meeting is, and still
opens the same menu on a click to correct it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…tton, the kind tag goes

- The meeting-kind tag beside the title is gone: nobody used it to read or
  change anything. The kind is still detected and still shapes the analysis.
- 會議背景 left the filing row's ⋯ menu (its only item, so the menu went too)
  and became a tab, shown only when the meeting had a prepared background; it
  shows that background without the in-meeting notes, with an edit button for
  the same sheet.
- 連接 AI sits beside 複製: the MCP hand-off the old report's last section
  carried (Claude Code command, Claude Desktop config, connection status,
  questions naming this recording), which the tabbed page had dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The prompt copy was disabled on read-only org recordings while the plain
transcript copy next to it worked — the same text minus the prompt, so the
restriction protected nothing and only looked broken.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Two one-time lines above the speakers and the replay transcript (哪一位是你?…,
點任一句就跳到那個時間…) said what the controls already make plain. Typing a
name into your own column still saves it as your name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
複製這一頁 next to 複製逐字稿 left people guessing which page and how the two
differed. The item now reads the open tab's name, and on 回放 — whose page is
the transcript — it is left out rather than offering the same text twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The last place the kind could be changed from the recording page, sitting by
the 時間軸分析 title where it read like a filter for the timeline. The analysis
still detects the kind, and the upload wizard still lets you pick one; with no
callers left, MeetingKindPicker goes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…-to line

The backdrop is the UX file's 'Integrations — Main Content' (3105:4659): a pale
blue wash over thirteen vertical light bars that rise in one after another as
the page opens. The bars fade to transparent rather than #eef9ff so they also
sit on the dark theme; reduced motion shows them still.

The line under the start buttons (趕時間就直接錄;要先準備背景的會議先建草稿…)
repeated what the two buttons already say.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The light sidebar takes the design's #f5f7f9 on every platform (on macOS it was
a 55%-translucent tint over the window's vibrancy, which shifted with the
desktop behind it). The home backdrop's wash drops to 60% and its bars to 20%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The sidebar drew its own right border right beside the resize handle's 1px
line, so the divider read as 2px. The handle's line is the divider now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
It can be dragged to resize the sidebar but looked like any other hairline.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Opening an org (e.g. Pathors Technology) from the sidebar showed only the
recordings at its root — usually none, so a blank page. It now lays out the
org's folders as cards from the UX file (3541:9358 default, 3541:9359 hover):
a back panel, two papers and the folder's front, with the name and how many
recordings it holds; on hover the back turns blue, the papers rise and the
name turns blue. A click opens the folder. Recordings at the org's root still
list below, and the page sits on 總覽's wash.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The first card, from the UX file (3541:9360 default, 3541:9412 hover): a dashed
pale-blue frame with a folder front and a blue button; on hover the front
widens and the button turns solid. A click turns the button into a name field;
Enter (or clicking away) creates the folder in the org, Esc or an empty name
cancels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The UX file's new-folder card changed (3541:9360 / 3541:9412): a solid #f6fcff
frame instead of the dashed one, and a slimmer button. A click no longer turns
the button into a white field; it adds a grey folder card right after it, the
name typed straight into the card's name slot on a transparent, borderless
field. Enter or clicking away creates it; Esc or an empty name drops the card.
The folder card's drawing is now shared between real folders and the draft.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Per the updated UX file (3541:9360 / 3541:9412): the labelled button gives way
to a dashed + in a circle; on hover the frame deepens to #e0edf4, the front
widens and the + fills. The whole card is now the button, named by a tooltip
(and its aria-label). The + is lucide's Plus, the same 16px icon the design
uses, so its exported SVG isn't shipped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The new-folder card's hover front is its default front sheared (same bottom,
top 11px to the left), but the two were crossfaded in place, so the shape
jumped. Both layers now shear together about the bottom edge while they
crossfade, so the folder tips open; the + grows a touch. Folder cards move on
one longer curve, their papers lifting on a slight overshoot, the front sheet a
beat after the back. Reduced motion skips it all.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
fontech and others added 22 commits November 4, 2026 16:20
It changes the same setting as Settings › Basic › Theme, so it no longer
takes opening the settings window to switch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… the same thing

Following the speech-analysis proposal, the tab now reads as four groups
built only from data Parley already has, instead of four tiles, a strip
and a separate AI box:

- 01 語速: the measured pace, or the AI's pace read when nothing was
  measured. These were a tile and an AI note saying the same thing.
- 02 語言習慣: one row for 口頭禪與贅字, with the counted 痾/嗯, the AI's
  density read and the words it saw. These were a tile plus an AI row.
- 03 對話互動: talk share with a bar, and the per-minute talk strip.
  The group is left out when the session can't separate the user from the
  others.
- 04 語氣與整體表達: the tone verdict, its quote, the AI summary and the
  advisory together, since they are one judgement.

Nothing shows as a dash. A row with no data is left out instead, which is
what made the 11/01 trim read as broken. The tone read and the AI
narrative stay.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…acts

The grouped tab still showed only a handful of numbers. It now opens with
four headline numbers (pace, fillers per minute, talk share, pauses) and
draws each group as charts, all computed locally from the saved transcript
and respecting the replay trim window:

- 01 語速與停頓: a pace-over-time line with the average dashed across and
  the fastest and slowest stretches stamped, and a pause timeline where a
  taller mark means a longer pause, with the longest one stamped.
- 02 語言習慣: ranked bars of the fillers used most (count and share), with
  the AI's density read under them, and back-to-back repeated words with
  where they happened.
- 03 對話互動: a talk-share ring, stacked talk-over-time columns (you vs.
  others), and turns, average and longest turn, median reply time,
  interruptions and backchannels.
- 04 語氣與整體表達: unchanged (tone, quote, AI summary).

speechStats.ts holds the maths and has its own tests. countFillersByWord
and turnTiming come back from 179ebfb, which had been reverted together
with its UI. Facts a recording can't answer, such as interaction in a
diarized mix, are left out rather than shown as dashes. Pauses are
measured between segments, so they are a lower bound.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…tered column

The non-replay tabs were capped at max-w-2xl and centered, so their left
edge moved away from the header's and the replay tab's whenever the window
was wider than about 700px. They now use the header's px-6 edges at full
width.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The brief's markdown kept prose's rules: table row lines, horizontal rules,
quote borders and underlined links. ReportContent takes a plain flag that
drops them all, and the 總結 tab uses it. Other places keep the rules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Laid out like the speech-analysis proposal's option A. The report reads
down the left column and opens with 這場你的說話特徵 as large plain
numbers. Each module heading carries its English name. A nav on the right
(特徵 / 01 語速 / 02 習慣 / 03 互動 / 04 語氣) stays in place while the page
scrolls, highlights the section being read and scrolls to a section when
clicked. On a pane narrower than 680px it becomes a row above the report.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…cky nav on the right

The brief showed one section at a time behind a row of chips. It now lists
every section in the left column under a numbered heading (01 重點,
02 決議 …), divided like 評分's modules. A nav on the right tracks the
section being read and jumps to a section when clicked. ReportNav moves to
study/ so both tabs share it. A brief with a single section still reads
whole, without a nav.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…g on every click

Each reading tab (總結, 後續行動, 筆記, 會議背景, 評分) was unmounted on
every switch (key={tab}) and rebuilt when opened again, so it came back at
the top, on its first section, with charts and placeholders drawn afresh.
Now a tab renders the first time it is opened and is only hidden after
that. Coming back shows the same view, scroll position and section. The
kept set belongs to the recording, so opening another recording starts
clean. 回放 still mounts only while shown, because it owns the audio
player and its shortcuts.

The AI outputs themselves were already generated once and saved with the
recording. Switching tabs never re-ran them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… shows

The sample ships prewritten and is never sent to the model, so it fell
behind the current format:
- Its brief used bold labels instead of the sales lens's ## headings, so
  總結 could not cut it into sections and showed one block with no nav.
  It now has the same four sections a generated sales brief has (Where
  this landed / Their pain and objections / What we still don't know /
  Next steps). Next steps moves to 後續行動 like any other brief.
- It had no 評分 read, so 04 語氣與整體表達 sat empty. The script now
  carries a prewritten tone, filler and pace read and a summary, which go
  into the manifest and onto the entry.

A sample imported earlier is brought up to date when it opens
(refreshSampleOutputs): only an unsectioned brief or a missing read is
replaced, so a brief the user regenerated stays. render.ts copies the new
delivery field, and the manifests were updated in place, without
re-rendering the audio.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Two things made the speaker count, duration and sync icon wander:
- The trailing controls changed width per row. A cloud-only recording
  has no rename or 移動, so its stats sat further right than a synced
  one's. Rename, delete and 移動 now share one fixed, right-aligned slot
  as wide as all three.
- Each stat was only as wide as its digits (1 vs 8 people, 0:05 vs
  4:53:29). They now get fixed-width columns, so the icons line up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…inks to an icon toggle

Choosing Dark also pinned the native window to dark. WKWebView reports a
pinned window theme as prefers-color-scheme, so after that the media query
kept answering dark and System resolved to dark on a light OS. System now
releases the window theme (setTheme(null)), so the query reads the OS
again and its change event re-applies the real answer.

The sidebar switch is now a small pill of three icons (sun, moon,
monitor), with their names on hover, at the bottom left. It no longer has
labels or a divider.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…trip

The sidebar colour is translucent, and the new wrapper painted it under
the tree, which paints it again. The tree came out darker than the footer,
so the switch looked like it sat in its own block. The wrapper no longer
paints, and the footer paints the colour once like the tree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…er the same

The previous fix lightened the whole sidebar to match the footer. That
was backwards. The column paints the translucent sidebar colour again, and
the footer paints it on top as the tree does, so the footer now matches
the tree instead of the other way round.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
On macOS dark the sidebar colour is a translucent navy over the window's
vibrancy, so every extra layer changes the tone. The theme-switch footer
had painted it two or three times over (column, tree and footer). The
column now paints it exactly once. The tree and the footer are
transparent, which is the single layer the sidebar had before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
… the page's theme

For 系統, 9e14ee9 released the native window theme (setTheme(null))
instead of pinning it. On macOS the translucent dark sidebar sits on the
window's vibrancy, which follows the window's appearance. With the window
not pinned to dark, the rail came out grey instead of navy.

The window is pinned to the shown theme again in every mode. 系統 still
needs the OS's real answer, and a pinned window hides it from
prefers-color-scheme (the original 深色 → 系統 bug). So 系統 briefly
releases the window, lets WebKit re-read the OS over two frames, then
paints and pins that result. It re-checks when the window regains focus
or visibility, since a pinned window can't see the OS switch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
On macOS the dark rail was translucent over the window's sidebar
vibrancy, and it read as muddy grey, especially when the window's
appearance and the page's theme drifted apart. It is now solid
oklch(0.22 0.026 250) on every platform: lighter than the page (#0c1620)
and just under the cards, so it still reads as its own surface. The light
rail was already solid and is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…track stands apart from the sidebar

The toggle's track used the muted token, which in the dark theme is
almost the solid sidebar's navy, so the group melted into the rail. It is
now a faint foreground tint with a hairline ring, so it lifts off the
sidebar in both themes. The selected icon keeps the page colour.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
…a grey slab

The dashed empty notes (即將開始的會議, 會議草稿, an org's drafts) used
white at 20%, which reads as a light grey bar on the dark page. In dark
mode they are black at 20% instead. Light mode is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The big bold headline numbers (pace 偏快, a high talk share) used the
pause button's warning foreground. With no pale wash behind them they read
as a heavy orange. A new --warning-text token sits between the wash and
that foreground (light oklch(0.69 0.105 63), dark oklch(0.76 0.08 66)).
Only the large numbers use it. Small warning text keeps the darker
foreground, since the lighter tone is too faint to read at that size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
fontech and others added 7 commits November 6, 2026 03:01
… tab switching

The command table covered navigation, meetings and replay, but not the
chords people press without looking anything up:

- ⌘N opens a new meeting draft (from the study page it goes home first,
  since that page's prep fields are the open recording's; never during a
  meeting). Never starts recording: that stays ⌘R.
- ⇧⌘N opens the sidebar's new-folder field, revealing a collapsed tree.
- ⌘F focuses the library's search box.
- ⌘G / ⇧⌘G step to the next / previous match in the transcript's find bar.
- ⇧⌘[ / ⇧⌘] switch the study page's tabs, as Safari and Chrome do.
- ⌘M, ⌃⌘F, ⌘H and ⌘Q are listed in the cheat sheet on macOS (AppKit
  owns them, so they are listed, not bound).

⌘N and ⇧⌘N are also File menu items on macOS.

Library and study are now scopes of their own. They are siblings, so ⌘F
can mean the library's search on one and the transcript's find on the
other; findConflicts now checks only scopes that can be live at once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
On a recording's study page the number keys now pick a tab and ⌘← / ⌘→
step through them, as in a browser. Elsewhere they keep going Home /
Library / Back / Forward; on the study page Back and Forward are still
⌘[ / ⌘] and the mouse's side buttons.

A row may now `shadow` an enclosing scope's command: while its scope is
live it takes over the chords the two share. The webview binding of the
outer command skips a taken-over chord, the macOS menu bar (which matches
⌘1 before the webview sees it) hands the click to the inner command, and
the cheat sheet prints the chord on the inner row only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
⌘1–⌘9 pick the Nth tab and ⌘← / ⌘→ (or ⇧⌘[ / ⇧⌘]) step through them
wherever there are tabs: the study page, 語境庫, the meeting window (both
layouts) and the Settings window's categories (in the order the nav shows
them, so a search narrows what they walk). ⌘F also reaches the search
box on 語音輸入記錄 and in Settings.

The study page's own tab commands become one shared set (tabs.select /
prev / next) that any strip claims through useTabShortcuts. The `tabs`
scope can sit on any screen of any window, so it overlaps every scope
for conflict checking.

On macOS the menu bar owns ⌘1–⌘3, and used to route them straight to the
main window, so Settings could never see them. Menu clicks now go to the
window in front; a main-window command that window doesn't take over is
forwarded to the main window, which comes forward as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The feed's header carried a manual "analyze now" button and, beside it,
the auto-analysis cadence menu. The feed refreshes itself, so the header
is now just the title and count. The auto-analysis setting stays in the
findings panel; the strings only the removed menu used are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Recording starts from the sidebar's record button and the titlebar, and a
draft from ⌘N, the File menu and the drafts section, so the pair beside the
greeting was a second copy of each.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
Nothing has been recorded for a draft, so "started" was untrue. Inside its
slot the row now says 已過開始時間 (Past start time), highlighted because
開始 is still the thing to press; once the slot is over it says 已過期 (Missed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp
The two sheets of paper say the folder holds something; a folder with no
recordings (and the one being named) is now drawn without them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F59jF8jiKE8cjVRzEAypNp

This branch has not been deployed

No deployments
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