Skip to content

fix(dialog): limit footer click-through to the gradient gutter - #2545

Merged
wesbillman merged 2 commits into
mainfrom
tho/dialog-footer-pointer-events
Nov 5, 2026
Merged

wesbillman merged 2 commits into
mainfrom
tho/dialog-footer-pointer-events

Conversation

@tellaho

@tellaho tellaho commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Category: fix

User Impact: Visible form fields beneath dialog footer gradients stay clickable, while footer text, controls, and scrolling remain usable.

Problem: The gradient gutter blocked visible form fields. Making the entire footer pass input through also exposed hidden controls beneath its opaque action area and interrupted scrolling over footer gaps.

Solution: Give the footer one pointer-active content row that includes text, controls, blank space, and the bottom inset, and let only the gradient gutter pass input through. Fully opaque reduced-transparency and forced-colors modes also block input in the gutter.

File changes

src/shared/design-system/ui/Dialog.tsx
Group footer contents in one row so arbitrary nested controls, text, and portaled actions share the same interactive region.

src/shared/design-system/styles/overlays.css
Keep the gradient separate from the opaque, horizontally scrollable row. Preserve existing non-sticky layouts and responsive button sizing.

src/shared/design-system/DESIGN.md
Document the gradient-only input boundary and opaque accessibility modes.

tests/browser/dialog-actions.spec.mjs
Retain the real community dialog's oversized-action, keyboard, and geometry checks on the row that now owns scrolling; add gap-wheel and scrollbar-strip hit testing.

tests/browser/dialog-footer.spec.mjs
Exercise pointer targeting, text selection, nested/portaled actions, disabled controls, keyboard access, and scrolling across shared dialog layouts and responsive conditions.

tests/fixtures/dialog-footer.html and tests/fixtures/dialog-footer.tsx
Render production shared modal components in an isolated geometry fixture; no live writes or native host are required.

Reproduction steps

  1. Open Create agent in a short desktop window and scroll a field beneath the footer gradient. Click that visible field: it should focus and accept typing.
  2. Click beside or below the footer buttons: hidden body controls must not receive the click. Verify footer buttons, switches, dropdowns, links, and text selection remain usable.
  3. At a narrow width with enlarged text, horizontally scroll overflowing actions using the gaps/scrollbar area, then Tab to and activate the action.

Validation

Checkpoint: 6299382af3aee05f2d1fa11f03211b731bf0de64.

  • Browser regression coverage tests 14 shared modal layouts, both themes, 1280/800/390px widths, 200% text, and 320px overflow. Three additional content cases cover wrapped, portaled, and leading-only actions. Chromium also exercises forced colors and reduced transparency; WebKit cannot emulate those two media features.
  • Full community dialog-actions, agent-creation-review, and plugin-import browser files exercise application integration alongside the shared-component fixture.
  • The new opaque-region regression test fails against the original d7ddd603f implementation in both engines and passes with this revision.
  • Source inventory: 58 production Dialog render sites, 29 AlertDialog sites, and nine ConfirmAction callers. This is a source audit plus shared-layout/content coverage, not a claim that every runtime screen was manually opened.
  • Browser command: pnpm test:browser dialog-footer.spec.mjs dialog-actions.spec.mjs agent-creation-review.spec.mjs plugin-import.spec.mjs --project chromium --project webkit --no-deps --workers=2 --max-failures=2 — 80 passed, 2 explicitly skipped in 2.3 minutes, at the checkpoint above with a clean working tree.
  • Added 24 browser cases per engine (48 project cases, with the two unsupported WebKit media emulations skipped); no cases removed. Browser-only justification: actual CSS hit testing, text selection, overflow/wheel handling, and keyboard focus reveal. Source/DOM emulators cannot establish those behaviors.
  • pnpm exec vitest run --maxWorkers=2 at the checkpoint above with a clean working tree: 17,609 passed, 22 skipped; 947 test files passed and eight were skipped (902.25 seconds).
  • Mandatory pre-commit and pre-push TypeScript/related-unit, design-system, and repository policy gates passed. git diff --check passed.
  • Limits: isolated browser host/IPC fixtures do not establish native OS behavior. Native scrollbar-thumb dragging and a fresh human test/review of this revision remain pending. The prior human test and independent review covered the earlier revision. Marked ready at the author’s request. No product screenshot is substituted with a fixture capture.

Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz>
Signed-off-by: Taylor Ho <[email protected]>
@tellaho
tellaho marked this pull request as ready for review November 5, 2026 01:06
@tellaho
tellaho requested a review from a team as a code owner November 5, 2026 01:06

@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.

🤖 Carl, an automated reviewer, commenting via Wes's GitHub account.

Changes requested. The fix makes the translucent gutter clickable as intended, but it also makes the footer's opaque part click-through, so near-misses on the actions now land on form controls the user can't see. Details and a suggested fix are in the inline thread.

Validation: I reproduced the sticky footer structure in Playwright Chromium and WebKit using elementFromPoint hit tests. I did not run the Tauri app, and I couldn't confirm overlay-scrollbar behavior on the overflow-x: auto footer headlessly.

Merge criteria: only the gutter above the action row passes pointer input through. The action row and the band below it still block pointer input.

@kalvinnchau kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 One additional overflow interaction issue; the existing opaque-footer finding is not duplicated.

@tellaho
tellaho marked this pull request as draft November 5, 2026 01:31
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz>
Signed-off-by: Taylor Ho <[email protected]>
@tellaho tellaho changed the title fix(dialog): let footer gradients pass pointer events through fix(dialog): limit footer click-through to the gradient gutter Nov 5, 2026
@tellaho
tellaho marked this pull request as ready for review November 5, 2026 02:11

@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.

🤖 Carl, an automated reviewer, commenting via Wes's GitHub account.

No blockers at 6299382af. My earlier changes-requested finding is resolved: only the gradient gutter passes pointer input through, while the action row, blank space beside the actions, and the bottom inset block it again. Kalvin's overflow-scrolling concern is also addressed, since the row now owns overflow-x and gap/scrollbar hit testing. Non-sticky layouts keep the footer as their flex owner through display: contents, and AlertDialog is untouched.

Validation: source review of the production diff and its consumers (no other production code depends on the footer's direct children or scroller). Independent Playwright probe in Chromium and WebKit, at 1280px and 360px, with default and padded chrome: gutter hits the form, while the row gap, the area below the buttons, and the ring band hit the footer. Real pointerdown matches. Footer button boxes were identical between main and head across 56 non-sticky layout/engine/width/spacing configurations. CI is green.

Not verified: native Tauri behavior, scrollbar-thumb dragging, and reduced-transparency/forced-colors on WebKit. The repository checklist's fresh human test of this revision is still pending.

@wesbillman
wesbillman merged commit fbcc926 into main Nov 5, 2026
49 checks passed
@wesbillman
wesbillman deleted the tho/dialog-footer-pointer-events branch November 5, 2026 21:22
wpfleger96 added a commit that referenced this pull request Nov 5, 2026
…leanup

* origin/main:
  fix(dialog): limit footer click-through to the gradient gutter (#2545)
  fix(channels): put the huddle launcher after the other header tools (#2660)
  feat(drafts-sent): bundle Drafts & sent for everyone (#2644)
  feat(identity): one Builderlab sign-in, the native NIP-FI session (#2576)
  fix(agents): let people dismiss connection setup cards (#2631)

Co-authored-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
Signed-off-by: Will Pfleger <[email protected]>

# Conflicts:
#	.github/workflows/release.yml
#	crates/plugin-manager/src/lib.rs
#	docs/configuration.md
#	src/bundled/builderlab/apps/client.test.ts
#	src/bundled/builderlab/apps/environment.ts
#	src/features/identity/builderlab-hosted.test.ts
#	src/features/identity/identity.test.tsx
#	vite.config.ts
wpfleger96 added a commit that referenced this pull request Nov 5, 2026
…-service

* origin/main:
  fix(sidebar): highlight collapsed sections with unread channels (#2539)
  perf(threads): isolate thread rows inside the scroller (#2462)
  perf(messages): skip the glass on closed message action bars (#2461)
  perf(threads): measure long-thread scrolling in browsers and the macOS app (#2460)
  docs(threads): set scrolling requirements and targets for long threads (#2459)
  fix(composer): seed required recipients in saved briefs (#2667)
  fix: preserve agent activity ownership and remove Solo composer gap (#2613)
  feat(agents): open agent card links in Create agent (#2662)
  Align Bestie messaging with the shared conversation workspace (#2614)
  feat(messages): add a compact message density (#2547)
  fix(dialog): limit footer click-through to the gradient gutter (#2545)
  fix(channels): put the huddle launcher after the other header tools (#2660)
  feat(drafts-sent): bundle Drafts & sent for everyone (#2644)
  feat(identity): one Builderlab sign-in, the native NIP-FI session (#2576)
  fix(agents): let people dismiss connection setup cards (#2631)
  AIDA-2425: Preserve links beside pasted images (#2520)
  feat(activity): show reactions to your messages in Activity (#2638)

# Conflicts:
#	docs/identity.md
#	src-tauri/src/federated_identity/agent/mod.rs
#	src-tauri/src/federated_identity/mod.rs
#	src-tauri/src/federated_identity/tests.rs
#	src/bundled/codex/runtime.ts
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