Repository navigation
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ge area) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
✅ Patchwork glance readyhttps://patchwork-preview-100--patchwork-base.netlify.appPatchwork from |
The stage's area reached CallFloating and CallStage as the box itself, so calling it threw once there was one. And choosing "in the sidebar" ran as a getter, never reaching setFaces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lattice's settings (lattice-wm:call) can share the origin: faces put away or "in the sidebar" there carried over. And tabs go by name, with the first shown when nothing's chosen: "Call" came before Chat and Comments. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
🟡 Changes recommended
The camera fallback loads unverified CDN code with repository and account access, while incorrectly passed area accessors cause runtime exceptions that break floating faces and the stage.
11 open issues
Avoid loading an unverified face detector from a CDN · New Pass the stage area accessor through to both components · New Prevent the chevron click from reopening the menu · New Give the faces callback an event parameter · New Stop progress callbacks after a download fails · New Read computed titles from the loaded plugin module · New Reconcile room holds for late-mounted views · New Make avatar converter availability reactive · New Make the floating-face control keyboard accessible · New Hide the stage popover before requesting fullscreen · New Keep call surfaces host-side in isolation mode · New
1 file not reviewed
call/pnpm-lock.yaml: Generated file
What changed in this PR
Ports Lattice’s calling functionality into a standalone Patchwork package and connects it to threepane through runtime plugin IDs, without linking the tools at build time.
Changes:
- Adds call controls, video views, floating faces, and supporting media and session utilities.
- Integrates an optional call provider, sidebar controls, automatic video tab, and stage area into threepane.
- Adds standalone build configuration and tests for call behavior and frame integration.
| File | Description |
|---|---|
threepane/src/styles.css |
Supports fitted and hidden sidebar widgets. |
threepane/src/PatchworkFrame.tsx |
Wraps the frame in the optional call provider. |
threepane/src/datatypes.ts |
Defines runtime call component IDs. |
threepane/src/components/SidebarWidgets.tsx |
Adds the call control panel to the sidebar. |
threepane/src/components/SidebarWidgets.test.tsx |
Tests panel placement, visibility, and deduplication. |
threepane/src/components/DocumentAreaRoot.tsx |
Integrates video-tab opening and marks the stage area. |
threepane/src/components/CallVideoOpener.tsx |
Coordinates video demand with sidebar selection. |
threepane/src/components/CallVideoOpener.test.tsx |
Tests video-tab selection and subscriptions. |
call/vitest.config.js |
Configures browser-like call tests. |
call/vite.config.js |
Configures standalone bundling and CSS injection. |
call/test/wiggle.test.js |
Tests waveform and border geometry. |
call/test/video.test.js |
Tests call video rendering. |
call/test/sizes.test.js |
Tests layouts, encoding limits, and speaking thresholds. |
call/test/room.test.js |
Tests room normalization and title lookup. |
call/test/provider.test.js |
Tests provider lifecycle and subscription behavior. |
call/test/layer.test.js |
Tests questions, floating faces, and stage areas. |
call/test/lasting.test.js |
Tests state shared across module reloads. |
call/test/kept.test.js |
Tests stored settings and rejoin timing. |
call/test/fake.js |
Provides fake repository and media fixtures. |
call/test/faces.test.js |
Tests participant face lookup and rendering. |
call/test/control-panel.test.js |
Tests sidebar controls and sizing. |
call/test/channel.test.js |
Tests document signaling channels. |
call/test/call.test.js |
Tests call sessions, presence, and rejoining. |
call/test/button.test.js |
Tests titlebar call actions and subscriptions. |
call/src/video.js |
Renders call participants in a sidebar view. |
call/src/vendor/deepfilternet/LICENSE |
Includes the vendored denoiser’s MIT license. |
call/src/vendor/deepfilternet/deepfilternet.js |
Provides DeepFilterNet worklet setup. |
call/src/vendor/deepfilternet/deepfilternet-worklet-processor.js |
Runs vendored audio denoising in a worklet. |
call/src/ui/ui.js |
Implements faces, call prompts, floating views, and stage. |
call/src/ui/styles.css |
Styles call controls and video surfaces. |
call/src/ui/icons.js |
Provides call-specific SVG icons. |
call/src/ui/colour.js |
Assigns fallback participant colors. |
call/src/ui/avatar.js |
Converts avatar URLs for display. |
call/src/ui/arriving.js |
Tracks newly arriving participants for animation. |
call/src/ui/area.js |
Observes the frame’s designated stage bounds. |
call/src/ui/along.js |
Supports scrolling participant rows. |
call/src/provider.js |
Tracks visible rooms and serves call subscriptions. |
call/src/protocol.js |
Defines call state and subscription contracts. |
call/src/protocol-names.js |
Exports shared call event names. |
call/src/index.js |
Registers call components and the titlebar tool. |
call/src/engine/wiggle.js |
Calculates waveform-driven face borders. |
call/src/engine/speaking.js |
Detects speaking activity from audio streams. |
call/src/engine/sizes.js |
Selects layouts, video limits, and speaking thresholds. |
call/src/engine/room.js |
Normalizes room IDs and resolves document titles. |
call/src/engine/rejoin.js |
Records recent calls for reload recovery. |
call/src/engine/noise.js |
Downloads, caches, and applies optional noise suppression. |
call/src/engine/lasting.js |
Preserves live state across module replacements. |
call/src/engine/kept.js |
Safely reads and writes session storage. |
call/src/engine/face.js |
Detects faces and centers camera previews. |
call/src/engine/channel.js |
Uses document messages for call signaling. |
call/src/control-panel.js |
Implements sidebar call controls and settings. |
call/src/call-face.js |
Exposes participant faces as a reusable component. |
call/src/button.js |
Implements provider-backed titlebar call actions. |
call/pnpm-workspace.yaml |
Supplies package-local pnpm settings. |
call/package.json |
Declares dependencies and standalone tool scripts. |
call/.gitignore |
Excludes generated build and deployment files. |
Review effort: Max
Comment on lines
+38
to
+39
| const vision = await import(`${MEDIAPIPE}/vision_bundle.mjs`); | ||
| const files = await vision.FilesetResolver.forVisionTasks(`${MEDIAPIPE}/wasm`); |
| element.addEventListener(CALL_EVENT, onCall); | ||
| // what was mounted before this was (it was loaded late, or swapped in | ||
| // anew): on screen already, and unmounted like the rest later | ||
| for (const view of element.querySelectorAll("patchwork-view[doc-url]")) hold(view.getAttribute("doc-url")); |
Comment on lines
+765
to
+766
| if (full && document.fullscreenElement !== stage) { | ||
| stage.requestFullscreen?.().catch(() => setFull(false)); |
| sidebars, and carries on as docs change. Not waited on: it's | ||
| late-bound, and renders nothing without the package. | ||
| */} | ||
| <patchwork-view component={CALL_PROVIDER}> |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Refactor event handling for menu button interactions. Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Add active flag to control download state updates. Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Found in two headless browsers: the control panel read call.get().… as the call went, and choosing floating again left the video tab showing when no tab had been chosen before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hearing a room threw, and lost the room's listener, when someone said bye there before they'd been heard (a join that hadn't finished, hung up). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


No description provided.