Skip to content

Polish media viewers, playback controls, and galleries - #341

Merged
klopez4212 merged 13 commits into
mainfrom
kennylopez-video-theater
Sep 28, 2026
Merged

klopez4212 merged 13 commits into
mainfrom
kennylopez-video-theater

Conversation

@klopez4212

@klopez4212 klopez4212 commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Photo and video previews now expand smoothly into a shared dark viewer with fading controls and an animated comments sidebar. Adds photo gallery navigation, trackpad zoom/pan, animated GIF playback, and custom video controls with saved speed. No new dependencies.

Video gestures support click-to-play/pause, double-click ±10-second seeking, and temporary 2× while holding, with brief visual feedback. Closing stops playback immediately and fades the reaction tray with the other controls. Space toggles play/pause and Left/Right arrow keys seek 10 seconds without gesture overlays; editing and slider keys keep their normal behavior. Timestamp comments seek the selected video and appear on its timeline; opening from a reply preserves the same conversation. Chat preview glass matches the existing media treatment and keeps white controls in either app theme.

Validation: independent review, all 1,675 related tests, and local type/design checks pass at 6ca24b74. All 49 focused video/motion/gesture tests pass, including dismissal, delayed playback, and StrictMode autoplay coverage. Browser checks verified gallery focus, keyboard playback/seeking, comment-editing isolation, and paused playback with the tray faded during exit. Earlier native flows were human-tested; the latest gallery, keyboard, emoji, and dismissal follow-ups await human confirmation. DCO passes; hosted CI is pending.

Snapshots (sample content)

Chat preview

Chat preview controls

Video viewer

Video viewer with timestamp comments and timeline markers

Photo gallery

Photo gallery with dark comments sidebar

Gesture feedback

Directional ten-second seek feedback

Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
…fades

Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
@klopez4212
klopez4212 marked this pull request as ready for review September 28, 2026 13:07
@klopez4212
klopez4212 requested review from a team, comp615 and wesbillman as code owners September 28, 2026 13:07
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-28T16:29:02.091536Z 57561a1 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fda59b978c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +59 to +60
const outsideTabStops =
!container.contains(active) ||

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep portalled popovers in the modal focus scope

When a user opens the emoji picker from a media-review reaction control, Popover.Portal places the focused picker/search outside this backdrop. This condition therefore treats every Tab press inside the picker as escaped focus, prevents the event, and moves focus to the first or last control in the underlying dialog, so the picker cannot be navigated by keyboard. Include modal-owned portal content in the focus scope, or defer to the nested popover's focus management while it is open.

AGENTS.md reference: src/shared/design-system/AGENTS.md:L8-L8

Useful? React with 👍 / 👎.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Star Lord’s automated source review via Wes’s account.

Reviewed head fda59b978c74848bdc89308f92a28d6bbc233938 against base 85d6bf82c54d1c8d930d58444597a1fe31cc8975.

One actionable keyboard-focus regression is detailed inline. The gallery navigation should preserve focus on a still-enabled Next/Previous button so consecutive keyboard activations continue working. No additional actionable findings from the playback, comment routing, media styling, or motion-lifecycle source review.

Validation limits: source-only review of the pinned snapshot and changed tests, with independent playback and image/motion review lanes. No PR code, tests, builds, or app workflows executed. A single hosted-check snapshot showed JavaScript, Rust/tool integration, DCO, and some browser jobs successful, with other browser jobs still running and Windows native validation skipped; this is not an all-green or runtime-validation claim. The author reports native/human testing, but this review did not independently observe it. Native geometry, gesture timing, and browser rendering remain unverified here.

This is a non-blocking COMMENT review, not approval or merge authorization.

Comment thread src/features/messages/ImageReviewStage.tsx Outdated
@klopez4212
klopez4212 marked this pull request as draft September 28, 2026 13:20
Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
@klopez4212
klopez4212 marked this pull request as ready for review September 28, 2026 13:39
Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>
Signed-off-by: klopez4212 <klopez4212@gmail.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6ca24b74d6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

replies={replies}
limited={snapshot.limited}
timecodesSeekable={videoUrls.size === 1}
timecodesSeekable={props.attachment.kind === "video"}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve the multi-video timecode ambiguity guard

When a thread contains more than one video, this now marks every parsed timecode as seekable merely because the currently open attachment is a video. Since timecode replies do not identify an attachment, all of those replies become timeline markers for—and seek—the currently selected clip, potentially sending users to the wrong frame. Retain the previous unique-video check or encode which attachment each timecode targets.

Useful? React with 👍 / 👎.

}
/* Shared dark media review and compact video surfaces. */
.mediaPreview[data-video-preview] {
width: min(384px, 100%, calc(var(--media-ratio, 16 / 9) * 180px));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep inline controls usable for portrait videos

For a portrait attachment such as 9:16, this formula makes the preview only about 101px wide. The new control row contains non-shrinking time labels, speed and volume groups, 28px buttons, and a timeline with a 20px minimum, while .mediaPreview clips overflow; consequently most playback controls are visually clipped and cannot be clicked. Add a compact responsive control layout or keep the preview wide enough for the controls.

Useful? React with 👍 / 👎.

Comment on lines +57 to +60
.controls :focus-visible,
.center:focus-visible {
outline: 2px solid var(--text-standard);
outline-offset: 3px;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Gate media focus rings on keyboard modality

These unlayered CSS-module rules override the host's layered pointer-focus suppression. In browsers that retain :focus-visible after clicking or programmatically focusing a media slider/control, a pointer interaction therefore shows the keyboard outline. Prefix these authored rings with the app's html[data-keyboard-navigation] modality owner so pointer and keyboard focus remain distinct.

Useful? React with 👍 / 👎.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Star Lord’s automated source follow-up review via Wes’s account.

Head: 6ca24b74d68c23434e956039167ab964e5dd6a40
Base: 85d6bf82c54d1c8d930d58444597a1fe31cc8975
Incremental scope: the 12-file delta since reviewed head fda59b978c74848bdc89308f92a28d6bbc233938, the prior gallery-focus finding, and the changed behavior’s callers/lifecycle.

No actionable source findings in this follow-up.

  • The prior P2 gallery-focus regression is addressed in source: ImageReviewStage retains focus on an enabled Next/Previous button and falls back to the gallery at the endpoint. Added Enter/Space tests cover repeated navigation in both directions and endpoint focus.
  • Reviewed the new Space/arrow shortcuts, editor/slider/menu exclusions, initial modal focus, and shared relative-seek helper. Also traced immediate dismissal pause, pending gesture guards, late-play handling during exit, detached-video cleanup, and reaction/feedback fading. The emoji changes leave button geometry unchanged.
  • The new regression tests were read, not run. No browser cases were added or removed in this incremental delta.

Validation limits: source-only; no PR code, tests, builds, or app workflows executed. One hosted-check snapshot showed JavaScript and DCO successful, Rust/tool integration and browser journeys still running, and Windows native validation skipped. It is not an all-green result. Author-reported browser/native testing was not independently observed. The PR description explicitly leaves the latest human confirmation pending; the repository’s ready-for-review checklist therefore remains incomplete, and this source result does not clear that gate. Native rendering, real playback timing, and current human acceptance remain unverified here.

Non-blocking COMMENT review only—not approval or merge authorization.

Signed-off-by: Codex <codex@openai.com>

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Star Lord’s automated source follow-up review via Wes’s account (wesbillman).

Head: 57561a14e25a57cf8c2c18c1530598dcb495f21f
Base: a2927b44b1ef426c2bc7b98369139a6479b45d40
Previous reviewed head: 6ca24b74d68c23434e956039167ab964e5dd6a40

No new actionable findings in this bounded merge/integration follow-up.

  • Of the 52 files in the current PR delta, 48 have identical Git blobs to the previous reviewed revision. The four overlaps are shared button CSS, IconButton, component metadata, and its design specimen. All other head-to-head file changes exactly match the new base.
  • The merge preserves both the base’s avatar and this PR’s media variant. Both continue through the existing Button behavior; hover/pressed exclusions retain both treatments, and the media-glass recipe and media caller remain intact. The registry and specimens keep both variants.
  • The previous gallery-focus fix and its Enter/Space regression tests are unchanged. No tests or browser journeys were added or removed by the media-side integration changes.

This does not reopen or independently revalidate the unchanged feature. Source assessment of this integration meets the 9/10 minimalness/elegance/correctness bar; no new owner or abstraction was introduced.

Validation limits: immutable, Git-blob-verified source only; no dirty checkout inputs, PR code execution, tests, builds, app/native workflows, or CI checks. The description’s test evidence is for the older 6ca24b74 revision, and its latest human confirmation remains pending. Rendering, playback, merged-state test results, and human acceptance are not established here. This COMMENT is not approval, checklist clearance, or merge authorization.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 57561a14e2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

type="button"
aria-label={`Playback speed: ${rate}x`}
aria-expanded={menu}
onClick={() => setMenu(!menu)}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Handle Escape from the playback-speed trigger

When the speed menu opens, focus remains on this button, but the Escape handler is attached only to the sibling fieldset. Pressing Escape immediately therefore leaves the menu open in an inline preview; inside the review modal it bubbles to useModalBoundary and closes the entire viewer. Handle Escape from the shared speed wrapper/trigger or move focus into the menu when it opens.

AGENTS.md reference: src/shared/design-system/AGENTS.md:L8-L8

Useful? React with 👍 / 👎.

@klopez4212
klopez4212 merged commit 6e37bbd into main Sep 28, 2026
14 checks passed
@klopez4212
klopez4212 deleted the kennylopez-video-theater branch September 28, 2026 16:50
johnmatthewtennant pushed a commit that referenced this pull request Sep 28, 2026
* origin/main:
  Refine presence labels and status colors (#323)
  Polish media viewers, playback controls, and galleries (#341)
  perf(mentions): name each choice set once and skip closed choosers (#310)
  Fix clipped emoji in reaction pills (#339)
johnmatthewtennant pushed a commit that referenced this pull request Sep 28, 2026
* origin/main:
  Refine presence labels and status colors (#323)
  Polish media viewers, playback controls, and galleries (#341)
  perf(mentions): name each choice set once and skip closed choosers (#310)
  Fix clipped emoji in reaction pills (#339)
  Delay message timestamp tooltips by 500 ms (#321)

Signed-off-by: Sol <49aa1f65411fd096d2e2ec144f1e7aa36fdc76d1b907cfdf7be000c66f9d3b8e@buzz.block.builderlab.xyz>
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.

3 participants