chore(docs): reconcile to WPF-only after WinUI 3 was abandoned

- Fix TeamsISO.Windows.slnf — drop the dangling
  src/TeamsISO.App.WinUI/TeamsISO.App.WinUI.csproj entry whose project
  doesn't exist in the .sln (broke the build on main).
- Archive the abandoned WinUI 3 artifacts under docs/archive/:
  * 2026-05-12-winui3-migration.md (the nine-phase migration plan)
  * TeamsISO.App.WinUI.Probe/ (the bootstrap diagnostic console)
  * work-log-2026-05-12-winui3.md (the overnight session log)
- README — drop the "in-flight WinUI 3 replatform" status block;
  state that the v2 redesign landed in WPF and link the shape brief.
  Keyboard shortcuts table picks up Ctrl+K, Ctrl+T, and the digit
  hotkeys that already shipped.
- CHANGELOG — replace the WinUI-3-flavoured "Ground-up GUI redesign"
  block with a v2 Studio Terminal entry that names Task 39 + Task 40
  as landed. De-dupe the May 2026 batch: the second "Quick-join Teams
  meeting from URL", "IN-CALL bar surfaces Teams meeting state", and
  "Auto-launch Teams + auto-hide windows" bullets were verbatim repeats
  of earlier entries; kept the first occurrence.
- NEXT_STEPS.md — rewrite to reflect that Task 39 (participants table
  v2) and Task 40 (Ctrl+K palette) both shipped; v1.0 cut is now
  gated only on MSI signing + real-meeting smoke pass.
- DESIGN.md — small WPF-isms: WinUI 3 composition layer →
  WPF's; Segoe Fluent Icons phrased without the "WinUI 3's
  bundled" qualifier; migration boundary rephrased to "rewrites
  MainWindow.xaml + Themes/*" instead of "everything in Views/".
- .gitignore — ignore the .claude/ session metadata dir so it doesn't
  show up as untracked on every dev checkout.

Build + tests verified before commit: 0 errors, 0 warnings; 160 tests
pass (56 App + 104 Engine, filter Category!=ndi&requires!=ndi).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Zac Gaetano 2026-05-15 19:16:20 -04:00
parent 5a43c9cb6a
commit 37390026b3
10 changed files with 126 additions and 149 deletions

3
.gitignore vendored
View file

@ -28,3 +28,6 @@ publish/
# OS # OS
.DS_Store .DS_Store
Thumbs.db Thumbs.db
# Local Claude session metadata
.claude/

View file

@ -6,55 +6,46 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased] ## [Unreleased]
### Added — Ground-up GUI redesign (started 2026-05-12) ### Added — v2 "Studio Terminal" GUI (2026-05-13)
After greenlighting a from-the-scratch redesign and an explicit WinUI 3 The May 2026 ground-up redesign — explicit anti-reference to "the v1
replatform target, the May 2026 batch is followed by a major GUI screamed AI made it" — landed on the WPF host
restructuring of the host UI. Highlights: (`src/TeamsISO.App/`). The shape brief lives at
`docs/shapes/2026-05-13-teamsiso-v2-studio-terminal.md`. An earlier WinUI
3 replatform was scoped on 2026-05-12 and abandoned in favour of doing
the redesign in WPF (activation blockers + redundant work given the
shared view-model surface). The abandoned migration plan + bootstrap
probe are archived under `docs/archive/`.
- **PRODUCT.md** + **DESIGN.md**: impeccable context for the redesign. - **PRODUCT.md** + **DESIGN.md**: impeccable context for the redesign.
Solo broadcast operator at 1:50am is the canonical persona; "vibe-coded Solo broadcast operator at 1:50am is the canonical persona; "vibe-coded
GUI" is the explicit anti-reference. Tokens cover dark + light palettes GUI" is the explicit anti-reference. Tokens cover dark + light palettes
with context-aware accent split (cyan surface fill stays bright in with context-aware accent split (cyan surface fill stays bright in
both modes; cyan-as-text darkens to #0E7C82 on light for AA contrast). both modes; cyan-as-text darkens to `#0E7C82` on light for AA contrast).
- **WinUI 3 host scaffold** as `src/TeamsISO.App.WinUI/` coexisting with - **Theme system** (`Themes/Theme.Dark.xaml`, `Theme.Light.xaml`,
the existing WPF host. WindowsAppSDK 1.6 LTS, unpackaged mode, win-x64 `WildDragonTheme.xaml`) + `Services/ThemeManager.cs` singleton that
pinned RID, custom Bootstrap-aware `Program.Main`, post-build runtimeconfig swaps the merged dictionary at runtime, reads
patch to drop the .NET-SDK-implicit `Microsoft.WindowsDesktop.App` `HKCU\…\AppsUseLightTheme` for System mode, subscribes to
framework reference (WinUI 3 doesn't use it). `SystemEvents.UserPreferenceChanged`, persists via
- **Redesigned MainWindow**: 64px rail with brand mark + nav + `UIPreferences.Theme`. `Ctrl+T` toggles dark ↔ light.
engine-status puck; 44px custom title bar absorbing live pills - **v2 main window shell**: default system title bar; 32px header (Wild
(session timer · REC count · disk free) + theme toggle; section header Dragon mark + wordmark left, ⌘K / theme / settings icons right); 40px
with single Primary CTA + Secondary actions; participants list transport strip (`● 02:14:32 PART 4 · LIVE 2 CTRL :9755`); body with
(ItemsRepeater stub pending DataGrid migration) at 64px row height alert banner + update banner + action toolbar + participants
with cyan-left-border active-speaker treatment; conditional slim DataGrid; conditional `IN CALL` meeting bar at bottom; slide-over
in-call control bar; 32px status bar. settings drawer (420px from right) with OUTPUT / NETWORK / APP tabs.
- **ThemeManager service** holds the user theme preference The v1 72px rail, the 380px permanent settings panel, and the
(System / Dark / Light), resolves via UISettings.GetColorValue when six-column footer are gone.
System, broadcasts changes so the AppWindow title-bar buttons stay - **Task 39 — participants table v2**: five columns (24px state LED,
in sync with the visual tree. name + codec caption, 110px audio meter, 130px mono output name, 100px
- **Settings drawer** that slides in from the right (220ms ease-out-quart) ISO pill), 52px rows, full-row active-speaker tint (replaces the v1
with five tabs (Appearance / Routing / Display / Control / Advanced). left-edge stripe).
Appearance tab includes the theme tri-state picker + an accent palette - **Task 40 — Ctrl+K command palette**: `Views/CommandPaletteWindow.xaml`
peek. Replaces the WPF host's 380px permanent settings panel. + `ViewModels/CommandPaletteViewModel.cs`. Centered 560×360 floating
- **Help / About / Onboarding** as ContentDialog-based surfaces. Help window with fuzzy search across Quick / Teams / Presets / Output /
is the keyboard shortcut cheat sheet; About has Wild Dragon mark + Network / App categories. ↑/↓ navigates, Enter invokes, Esc closes.
version + quick-access folder shortcuts; Onboarding is three numbered - **Interactive HTML preview** at `docs/preview/redesigned-mainwindow.html`
steps for first launch (Install NDI Runtime / Enable Teams NDI / Pick for stakeholders to see the v2 shell.
transcoder topology) with "Don't show again" defaulted on.
- **Interactive HTML preview** at `docs/preview/redesigned-mainwindow.html`
faithful single-file render of the WinUI 3 XAML with theme toggle and
drawer interaction, so stakeholders can see the redesign before the
WinUI 3 build is feature-complete.
- **Migration plan** at `docs/superpowers/plans/2026-05-12-winui3-migration.md`
with nine phases (scaffold / shell / activation / VM wiring / DataGrid
/ secondary windows / hardening / tests / retire-WPF) and a risk
register flagging fallback paths.
The WPF host (`src/TeamsISO.App/`) is unchanged and remains the shipping
build until the WinUI 3 build passes a real-meeting smoke test. The
view-model layer is unchanged so the WinUI 3 host will reuse it via
ProjectReference once view-model wiring lands (Phase 4 of the plan).
### Added — May 2026 feature batch ### Added — May 2026 feature batch
@ -252,14 +243,6 @@ For operators who want to launch TeamsISO and never look at the Teams UI:
- **Recording badge in footer shows elapsed duration** alongside the count - **Recording badge in footer shows elapsed duration** alongside the count
(`REC 3 · 12:45`). Separate timer from the session timer because (`REC 3 · 12:45`). Separate timer from the session timer because
recording can start AFTER the meeting begins. recording can start AFTER the meeting begins.
- **Quick-join Teams meeting from URL** in the IN-CALL bar — paste a
`teams.microsoft.com/l/meetup-join/...` or `msteams:/l/meetup-join/...`
link, click Join, Teams launches into the meeting in one shot.
- **IN-CALL bar surfaces Teams meeting state**`IN CALL · <meeting title>`
/ `READY` / empty. UIA probe at 1Hz for the Leave button, meeting title
extracted from Teams' window title with brand suffix stripped.
- **Auto-launch Teams + auto-hide windows** preferences for the headless
"I only see TeamsISO" workflow.
- **MUTED / CAM OFF pills** in the IN-CALL bar — UIA detects whether the - **MUTED / CAM OFF pills** in the IN-CALL bar — UIA detects whether the
local user is muted or has their camera off, surfaces as coral pills. local user is muted or has their camera off, surfaces as coral pills.
Operator with auto-hide knows the local state without restoring Teams. Operator with auto-hide knows the local state without restoring Teams.

View file

@ -219,9 +219,10 @@ the same job with less visual noise.
**Single icon system, one stroke width, one optical size.** The previous GUI **Single icon system, one stroke width, one optical size.** The previous GUI
inlined ~12 bespoke `<Path Data="...">` icons with stroke widths varying inlined ~12 bespoke `<Path Data="...">` icons with stroke widths varying
between 1.2 and 1.6. The redesign uses **WinUI 3's bundled Segoe Fluent Icons between 1.2 and 1.6. The redesign uses **Segoe Fluent Icons font** (shipped
font** as the baseline, with a custom subset added only where a broadcast with Windows 11; falls back to Segoe MDL2 Assets on Windows 10) as the
concept isn't covered (e.g. NDI signal lock, ISO routing state). baseline, with a custom subset added only where a broadcast concept isn't
covered (e.g. NDI signal lock, ISO routing state).
Sizes: 16 (inline), 20 (button), 24 (rail / hero). Sizes: 16 (inline), 20 (button), 24 (rail / hero).
Stroke: inherited from font; no hand-stroked paths. Stroke: inherited from font; no hand-stroked paths.
@ -233,8 +234,8 @@ Stroke: inherited from font; no hand-stroked paths.
- Durations: 120ms for affordance feedback, 200ms for panel transitions, - Durations: 120ms for affordance feedback, 200ms for panel transitions,
280ms hero (rarely used). 280ms hero (rarely used).
- No bounce. No elastic. No spring overshoots. - No bounce. No elastic. No spring overshoots.
- **Never animate** layout properties. Animate `Translation` and `Opacity` - **Never animate** layout properties. Animate `RenderTransform` and
(WinUI 3's composition layer handles these GPU-cheaply). `Opacity` (WPF's composition layer handles these GPU-cheaply).
## Component decisions ## Component decisions
@ -329,7 +330,7 @@ no side-stripe borders, no glassmorphism). It does have:
## Migration boundary ## Migration boundary
The view-model surface in `src/TeamsISO.App/ViewModels/` is the contract. The view-model surface in `src/TeamsISO.App/ViewModels/` is the contract.
The redesign rewrites everything in `Views/` (WinUI 3) but leaves view-model The redesign rewrites `MainWindow.xaml` and `Themes/*` but leaves view-model
properties and commands untouched. Any place where the redesign needs a new properties and commands untouched. Any place where the redesign needs a new
piece of view-model state, the contract widens via additive properties — piece of view-model state, the contract widens via additive properties —
existing bindings keep working until the new view stops needing the old shape. existing bindings keep working until the new view stops needing the old shape.

View file

@ -1,89 +1,81 @@
# Where we left off — v2 "Studio Terminal" shell landed (2026-05-13 night) # Where we left off — v2 "Studio Terminal" shell complete (2026-05-15)
## What's done (uncommitted on local main) ## What's done on main
**v2 redesign shape:** Approved brief at `docs/shapes/2026-05-13-teamsiso-v2-studio-terminal.md`. Aesthetic register is "broadcast-engineering instrument" — Linear's keyboard-first density × Avid console legibility. Goes hard against the "screams AI" failure mode. **v2 shape locked.** Approved brief at
`docs/shapes/2026-05-13-teamsiso-v2-studio-terminal.md`. Aesthetic
register: "broadcast-engineering instrument" — Linear's keyboard-first
density × Avid console legibility. Goes hard against the "screams AI"
failure mode.
**PRODUCT.md + DESIGN.md** updated to reflect WPF as the host (WinUI 3 lines removed), v2 IA decisions absorbed, recording references softened, theme implementation rewritten for WPF DynamicResource swap. **WinUI 3 replatform: abandoned.** The early-May scoping concluded that
the redesign is purely view-layer (XAML + theme tokens + view-models);
doing it in WPF is strictly less work than fighting WinUI 3 activation +
DataGrid replacement. The migration plan + bootstrap probe are archived
under `docs/archive/` for the record.
**Theme system split:** **Shell:**
- `src/TeamsISO.App/Themes/Theme.Dark.xaml` — color brushes only, dark variant - Default Windows title bar (no custom chromeless caption buttons).
- `src/TeamsISO.App/Themes/Theme.Light.xaml` — color brushes only, light variant - 32px header — Wild Dragon mark + "TeamsISO" wordmark left; three icon
- `src/TeamsISO.App/Themes/WildDragonTheme.xaml` — styles + control templates (no color brushes anymore; uses `DynamicResource` for every brush ref) buttons right (⌘K command palette, theme toggle, settings gear).
- `src/TeamsISO.App/Services/ThemeManager.cs` — singleton that swaps the merged dictionary at runtime, reads `HKCU\...\AppsUseLightTheme` for System mode, subscribes to `SystemEvents.UserPreferenceChanged`, persists via `UIPreferences.Theme`. - 40px transport strip — single mono line:
- `App.xaml` merges Theme.Dark.xaml + WildDragonTheme.xaml by default; `App.xaml.cs.OnStartup` calls `ThemeManager.Current.Apply()` before MainWindow shows. `● 02:14:32 PART 4 · LIVE 2 CTRL :9755`. Cyan dot + timer only when
- `UIPreferences.Prefs` record gets a new `Theme = "System"` field (forward-compatible — old json files still load). at least one ISO live.
- New brush key: `Wd.Accent.CyanText` (Dark `#97EDF0` / Light `#0E7C82`) for cyan-as-text contrast on light canvas. The existing `Wd.Accent.Cyan` stays bright in both modes for fill use. - Body — alert banner + update banner + action toolbar + participants
DataGrid + (conditional) meeting bar at the bottom.
- Settings — slide-over drawer (420px from right) with OUTPUT / NETWORK /
APP tabs. Scrim click or Esc dismisses.
- v1 leftovers (72px rail, 380px permanent settings panel, six-column
footer) are gone.
**v2 main window shell:** **Theme system:**
- Default Windows title bar (no more custom chromeless caption buttons — they looked generic and broke on DPI scaling). - `Themes/Theme.Dark.xaml` + `Themes/Theme.Light.xaml` — color brushes
- 32px header: Wild Dragon mark + "TeamsISO" wordmark left; three icon buttons right (⌘K command palette, theme toggle, settings gear). The mark is small (20px) as a quality cue — click opens About. only.
- 40px transport strip: mono-typed single line. `● 02:14:32 PART 4 · LIVE 2 CTRL :9755`. Cyan dot + timer only when at least one ISO live. CTRL cluster right-aligned in a Grid column. - `Themes/WildDragonTheme.xaml` — styles + control templates (no color
- Body: alert banner + update banner + action toolbar (Enable / Refresh / Presets / Stop all + Teams launch/hide icons) + participants DataGrid. brushes; every brush ref is `DynamicResource`).
- Conditional meeting bar at bottom — appears only when `IsTeamsInCall == true`, with Mute / Cam / Leave. - `Services/ThemeManager.cs` — swaps the merged dictionary at runtime;
- 72px left rail: **gone**. reads `HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme`
- 380px permanent settings panel: **gone**. for System mode; subscribes to `SystemEvents.UserPreferenceChanged`;
- Six-column footer: **gone**. persists via `UIPreferences.Theme`.
- Settings: slide-over drawer overlay (420px from right) triggered by the header gear; OUTPUT / NETWORK / APP tabs (DISPLAY renamed to APP); same bindings as v1. Scrim click dismisses; Esc dismisses.
**Hotkeys preserved + new:** **Task 39 — participants table v2 (LANDED).**
- F1 help, Ctrl+R refresh, Ctrl+Shift+S panic stop, 19 / NumPad 19 toggle Nth participant — all preserved. Five columns: 24px state LED, name + codec caption, 110px audio meter,
- **Ctrl+T toggle theme (NEW)** — cycles dark ↔ light. Hooked through `MainViewModel.ToggleThemeCommand``ThemeManager.Toggle()`. 130px mono output name, 100px ISO pill. 52px rows. Full-row
- **Ctrl+K command palette (placeholder)** — currently opens the help dialog. Task 40 replaces this with a real fuzzy-search palette window. active-speaker tint (replaces the v1 left-stripe).
**View-model additions (MainViewModel):** **Task 40 — Ctrl+K command palette (LANDED).**
- `ParticipantCount` and `LiveCount` — feed the transport strip's "PART N · LIVE N" readout. Updated on the 1Hz stats tick. `Views/CommandPaletteWindow.xaml` + `ViewModels/CommandPaletteViewModel.cs`
- `ToggleThemeCommand` — wraps `ThemeManager.Current.Toggle()`. ship a centered 560×360 floating window with fuzzy search across Quick /
Teams / Presets / Output / Network / App categories. ↑/↓ navigates,
Enter invokes, Esc closes. The header ⌘K button and Ctrl+K (also Ctrl+P)
keyboard binding both open it.
**MainWindow code-behind cleanup:** **Hotkeys:**
- Removed `OnMinimize`, `OnMaximizeRestore`, `OnClose`, `OnWindowStateChanged`, the maximize-icon swap logic (no more custom title bar). - `F1` — help / cheat sheet
- Added `OnCommandPaletteClick`, `OnSettingsScrimClick`, `OnPreviewKeyDown` (Esc to close drawer). - `Ctrl+K` (also `Ctrl+P`) — command palette
- `OnSettingsToggleClick` now toggles `SettingsDrawerOverlay.Visibility` (the slide-over) instead of toggling the v1 right-column width. - `Ctrl+T` — toggle theme (dark ↔ light)
- `Ctrl+M` — drop marker into every active recording
- `Ctrl+R` — refresh NDI discovery
- `Ctrl+Shift+S` — panic-stop every ISO
- `1``9` / `NumPad 1``9` — toggle the Nth visible participant's ISO
## To build, push, and demo ## What's queued
Pre-1.0 cut is gated on:
1. Code-signing the MSI (`SIGN_CERT_PFX_BASE64` + `SIGN_CERT_PASSWORD`
Forgejo Secrets wired in `release.yml`).
2. A real-meeting smoke pass on a host with a live NDI runtime.
## Build + run
```powershell ```powershell
cd "C:\Users\zacga\Documents\Claude\Projects\Teams ISO" dotnet build TeamsISO.Windows.slnf -c Release
# Clear the corrupt local index from the earlier session
Remove-Item .git\index -Force -ErrorAction SilentlyContinue
git reset
# Build the WPF host
dotnet build src\TeamsISO.App\TeamsISO.App.csproj -c Release
# If the build is clean:
.\src\TeamsISO.App\bin\Release\net8.0-windows\TeamsISO.exe .\src\TeamsISO.App\bin\Release\net8.0-windows\TeamsISO.exe
``` ```
In the running app, test: The shipped helpers `build-and-test.ps1` and `commit-and-push.ps1`
1. **Theme toggle** — press `Ctrl+T`. Should swap dark ↔ light without restart. Header colors, surfaces, and text foregrounds all repaint. wrap the build + test + push flow.
2. **System theme follow** — open Windows Settings → Personalization → Colors → "Choose your mode" → flip between Dark and Light. TeamsISO should track the OS automatically (default preference is `System`).
3. **Settings drawer** — click the header gear icon. 420px drawer slides in from the right with OUTPUT / NETWORK / APP tabs. Esc or click-scrim dismisses.
4. **Transport strip** — should show the session timer when at least one ISO goes live, and the PART/LIVE counts always.
5. **Conditional meeting bar** — only appears when Teams is in a call.
If anything regresses, the v1 shell is preserved in git history at `1d1ce6a` — easy rollback with `git reset --hard 1d1ce6a` then publish. If something regresses, `1d1ce6a` is the rollback point for the WPF v1
shell (recording was axed at that commit), and `c271303` is the v2
## Commit + push when ready shell-without-table-redesign rollback point.
```powershell
git add -A src/TeamsISO.App/ docs/ PRODUCT.md DESIGN.md
git commit -m "feat(wpf): v2 'Studio Terminal' shell — theme system, header, transport strip, drawer
- Theme split: Theme.Dark.xaml + Theme.Light.xaml + ThemeManager
- New shell: 32px header (mark + wordmark + 3 icons), 40px transport strip,
conditional meeting bar, slide-over settings drawer
- Removed: 72px rail, 380px permanent settings panel, 6-column footer,
custom chromeless title bar buttons
- Ctrl+T toggles theme; follows Windows app-mode by default
- Shape doc at docs/shapes/2026-05-13-teamsiso-v2-studio-terminal.md"
git push origin HEAD
```
## What's still queued (tasks 39 + 40)
- **Task 39** — Participants table redesign. The DataGrid columns in the v2 shell are still v1-style (Name / Source / ISO toggle). v2 wants: 5 columns (state LED, name+codec, audio meter, output name mono, ISO pill), 52px rows, full-row active-speaker tint instead of left stripe, hard-edged 8px state LED.
- **Task 40** — Real Ctrl+K command palette window. Floating 560×360 dialog, fuzzy search across categories (Quick / Teams / Presets / Output / Network / App). Replaces the current placeholder that opens the help dialog.
Both are scoped commits and depend on the v2 shell being confirmed working first. After this lands and you've verified the theme swap + drawer + transport strip render correctly, ping me and we'll knock those out.

View file

@ -44,22 +44,21 @@ Pre-1.0. The May 2026 batch is feature-complete; v1.0 cut is gated on
code-signing the MSI and a smoke pass against a real Teams meeting. code-signing the MSI and a smoke pass against a real Teams meeting.
See `CHANGELOG.md` for the [Unreleased] entry. See `CHANGELOG.md` for the [Unreleased] entry.
A ground-up GUI redesign is in flight on `main` (see The May 2026 ground-up redesign — the v2 "Studio Terminal" shell — has
`docs/superpowers/plans/2026-05-12-winui3-migration.md`). The WPF host landed on the WPF host (`src/TeamsISO.App/`). A WinUI 3 replatform was
(`src/TeamsISO.App/`) remains the shipping build; a parallel WinUI 3 host explored in early May 2026 and abandoned (activation blockers + redundant
(`src/TeamsISO.App.WinUI/`) is scaffolded with the redesigned MainWindow, work given the redesign is purely XAML / view-layer); the brief lives at
theme system (dark + light), and secondary surfaces. Activation of the `docs/shapes/2026-05-13-teamsiso-v2-studio-terminal.md`, and the
unpackaged WinUI 3 .exe is the current blocker — diagnostics in the abandoned migration plan + bootstrap probe are archived under
migration plan's Phase 3. `docs/archive/`.
## Build ## Build
Requires .NET 8 SDK on Windows. The repo has two hosts: Requires .NET 8 SDK on Windows. WPF is the only host:
- `src/TeamsISO.App` — WPF, `net8.0-windows`, current shipping build - `src/TeamsISO.App` — WPF, `net8.0-windows`, the shipping build
- `src/TeamsISO.App.WinUI` — WinUI 3, `net8.0-windows10.0.19041.0`, in-flight
Both build together from the solution filter: Build from the solution filter:
dotnet restore TeamsISO.Windows.slnf dotnet restore TeamsISO.Windows.slnf
dotnet build TeamsISO.Windows.slnf -c Release dotnet build TeamsISO.Windows.slnf -c Release
@ -80,21 +79,21 @@ The shipped helper scripts in the repo root automate this:
- [Embedded Teams orchestration spec](docs/superpowers/specs/2026-05-08-embedded-teams-orchestration.md) - [Embedded Teams orchestration spec](docs/superpowers/specs/2026-05-08-embedded-teams-orchestration.md)
— Phase E roadmap. — Phase E roadmap.
- [Redesign brief](PRODUCT.md) + [design system](DESIGN.md) — token-level - [Redesign brief](PRODUCT.md) + [design system](DESIGN.md) — token-level
spec for the in-flight WinUI 3 redesign. spec for the v2 "Studio Terminal" redesign.
- [WinUI 3 migration plan](docs/superpowers/plans/2026-05-12-winui3-migration.md) - [v2 shape brief](docs/shapes/2026-05-13-teamsiso-v2-studio-terminal.md) —
— nine-phase plan covering scaffold through retiring the WPF host. approved aesthetic + IA for the May 2026 WPF rebuild.
- [Interactive redesign preview](docs/preview/redesigned-mainwindow.html) —
open in any browser to see and toggle the redesigned MainWindow before
the WinUI 3 binary lands.
## Keyboard shortcuts ## Keyboard shortcuts
| Key | Action | | Key | Action |
| --- | --- | | --- | --- |
| `F1` | Open help / cheat sheet | | `F1` | Open help / cheat sheet |
| `Ctrl + K` | Open the command palette (also `Ctrl + P`) |
| `Ctrl + T` | Toggle theme (dark ↔ light) |
| `Ctrl + M` | Drop a timestamped marker into every active recording | | `Ctrl + M` | Drop a timestamped marker into every active recording |
| `Ctrl + Shift + S` | Stop every running ISO (emergency) | | `Ctrl + Shift + S` | Stop every running ISO (emergency) |
| `Ctrl + R` | Refresh NDI discovery (rebuild finder) | | `Ctrl + R` | Refresh NDI discovery (rebuild finder) |
| `1``9` / `NumPad 1``9` | Toggle the Nth visible participant's ISO |
## File locations ## File locations

View file

@ -6,7 +6,6 @@
"src\\TeamsISO.Engine.NdiInterop\\TeamsISO.Engine.NdiInterop.csproj", "src\\TeamsISO.Engine.NdiInterop\\TeamsISO.Engine.NdiInterop.csproj",
"src\\TeamsISO.Console\\TeamsISO.Console.csproj", "src\\TeamsISO.Console\\TeamsISO.Console.csproj",
"src\\TeamsISO.App\\TeamsISO.App.csproj", "src\\TeamsISO.App\\TeamsISO.App.csproj",
"src\\TeamsISO.App.WinUI\\TeamsISO.App.WinUI.csproj",
"src\\tests\\TeamsISO.Engine.Tests\\TeamsISO.Engine.Tests.csproj", "src\\tests\\TeamsISO.Engine.Tests\\TeamsISO.Engine.Tests.csproj",
"src\\tests\\TeamsISO.Engine.IntegrationTests\\TeamsISO.Engine.IntegrationTests.csproj", "src\\tests\\TeamsISO.Engine.IntegrationTests\\TeamsISO.Engine.IntegrationTests.csproj",
"src\\tests\\TeamsISO.App.Tests\\TeamsISO.App.Tests.csproj" "src\\tests\\TeamsISO.App.Tests\\TeamsISO.App.Tests.csproj"