Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

console: the success toast covers the record drawer's expand/close buttons and title #11685

Closed

Description

@objectstack-fleet

Path: ② the capabilities an end user meets in the app — record pages | 缺项 | P2

Split by the triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U from objectui#11672 (the 2026-10-06 console dogfood sweep, showcase, framework ce577ec4), item 13. Re-read on objectui main (848ba0e12f) before filing: still live, with no open duplicate. ⛔ Not a claim, ⛔ not a dispatch.

Triage: lands in packages/app-shell/src/chrome/ConsoleToaster.tsx (position="top-right", about :36) ⇒ domain:ui; rationale: the toaster's position collides with the drawer's chrome.

What happens

After creating a record, the success toast covers the drawer's expand and close buttons. After Approve, it covers the drawer title.

Done when

  • Read objectui#7482 first: it chose top-right deliberately. The fix keeps that reason and stops covering drawer chrome, for example with an offset while a drawer is open or by stacking below the drawer header. It does not just move the toaster elsewhere.
  • Pin: with a drawer open, the toast's box does not intersect the drawer's header controls.

Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    and removed on Oct 6, 2026
  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01DrKzdPdyLLBW3qpZ4vtk7z
    Account: huangyiirene
    Branch: claude/issue-11685-toast-clears-drawer-chrome
    Worktree: objectui-issue-11685
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: packages/app-shell/src/chrome/ConsoleToaster.tsx (the position="top-right" placement and its offset, about :23–:40) and its tests beside it (ConsoleToaster.autoDismiss-7482.test.tsx keeps passing); the record drawer's own chrome only as much as a placement signal needs (the drawer that packages/app-shell/src/views/ObjectView.tsx / RecordDetailView.tsx open — the dev locates it); and .changeset/11685-*.md (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate; default tier)
    Clause-②: no
    Thread-read: none
    Serial constraints cleared: none. No open objectui PR touches packages/app-shell/src/chrome/** or the record drawer (objectui#11718, #11069 and the release PR objectui#11600 were read). Seat 2's in-flight cards are on other files: objectui#11680 (components placeholders, core registry), objectui#11682 (components data-table), objectui#11684 (plugin-detail HeaderHighlight.tsx). Read 2026-10-06T13:49Z.

    Why Clause-②: no: the fix changes where the console's own toaster sits while a drawer is open. It widens no accepted input, and the fence is that no export, prop, type member or i18n key is added to anything a package entry reaches. If the only working fix needs one (for example an exported drawer-open context), the dev stops and reports instead of adding it, and the seat re-claims with yes.

  3. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 11685,
    "status": "done",
    "branch": "claude/issue-11685-toast-clears-drawer-chrome",
    "pr": "#11722",
    "session": "session_01DrKzdPdyLLBW3qpZ4vtk7z — mode:subagent, so this is the parent PM seat's id",
    "premise_still_valid": true,
    "summary": "Confirmed on origin/main c910630: the one app-wide sonner toaster sits at top-right, and the record drawer (NavigationOverlay drawer mode, opened by ObjectView) keeps its expand/close buttons and title in that corner. In Chromium the toast intersected the drawer header, the expand and close buttons and the chrome title in all 16 configurations measured, and the second toast covered the record_header Approve action. ConsoleToaster keeps position top-right (objectui#7482's pin untouched and green). While an open right-edge Radix dialog is detected in the DOM, it passes sonner an offset: into the strip left of the drawer when a toast fits there, otherwise below the drawer header (phones: mobileOffset below the header). The pin holds in all 16 configurations after the change. No export, prop, type member or i18n key was added, and the changes are confined to ConsoleToaster.tsx, one new test file and one changeset.",
    "tests": {
    "head": "bd2663d (git rev-parse --short HEAD, the gate union ran on it; no commit after)",
    "gates": [
    "pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build → 0 → os-verify-lock: VERDICT command-exit 0 (29 packages)",
    "pnpm exec vitest run --maxWorkers=2 packages/app-shell/src/chrome/ apps/console/src/tests/App.agentChatLink-10640.test.tsx apps/console/src/tests/App.docsPortalLazy.test.tsx apps/console/src/tests/App.uploadAltitude-10131.test.tsx apps/console/src/tests/internalFormShell.test.tsx packages/plugin-form/src/WizardForm.outcomeToastSupersede.test.tsx → 0 → Test Files 14 passed (14), Tests 68 passed (68)",
    "pnpm --filter @object-ui/app-shell type-check → 0 → script name echoed (type-check), VERDICT command-exit 0; tsc -p tsconfig.test.json --listFiles = 5039 files, the new test file 1 hit",
    "pnpm check:control-bytes → 0 → OK (scanned 7664 tracked text file(s); skipped 85 binary)",
    "pnpm check:new-line-citations → 0 → VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only → exit 0",
    "pnpm check:changeset-claims → 0 → No pending changeset names a file this change touches.",
    "pnpm check:pending-changeset-literals → 0 → No test source names a pending changeset.",
    "added from the actual diff (app-shell src + new test + new changeset): pnpm check:test-path-roots → 0 → OK; pnpm check:unreferenced-sources → 0 → OK Every shipped source file in every covered package is reachable; pnpm check:phantom-deps → 0 → Every in-scope import is declared; node scripts/check-changeset-presence.mjs → 0 → 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s); check-changeset-no-major → 0; check-changeset-fixed → 0; check-changeset-overwrite → 0",
    "eslint --no-inline-config --format json on the 2 touched .tsx files → 0 → 2 files, 0 errors, 0 warnings (targeted only; not type-aware: eslint.config.js sets no parserOptions.project); repo-wide pnpm lint declared to CI"
    ],
    "new_pin": "packages/app-shell/src/chrome/ConsoleToaster.drawerClearance-11685.test.tsx, 6 cases: no-drawer control; beside path (--offset-right 888px); below-header path (--offset-top 69px, --mobile-offset-top 61px); back to defaults on data-state closed and on unmount; centred/left/popover-shaped dialogs ignored plus a non-vacuity tail; caller offset wins. happy-dom has no layout, so offsetWidth/offsetTop/offsetHeight are assigned the Chromium-measured values (stated in the file header).",
    "ablation": "From committed bd2663d, src-imported (no dist in the path). Removed the offset/mobileOffset wiring: anchor counts 1/1 → 0/0, marker 0 → 1 (grep -c). The new pin went red, 4 of 6 failing (expected '24px' to be '888px' / '69px'). The control and caller-wins cases stayed green by design. Restored with git checkout HEAD under a trap: git diff HEAD = 0 bytes, worktree blob ade5562728ef = HEAD blob.",
    "measurement": "One-off, real layout: Chromium 1194 headless against the console Vite dev server, through an uncommitted entry page mounting the real ConsoleToaster, the real NavigationOverlay drawer (ObjectView's props, overlayWidthFor sm/md/lg/xl) and the real embedded RecordDetailView with Approve/Reject record_header actions, at viewports 1440x900, 1280x800, 1024x768 and 390x844. BEFORE: the toast intersected the drawer header, expand, close and chrome title in 16/16 configurations. AFTER: those 4 intersected in 0/16; nothing in the drawer was covered in the 6 beside-path configs; in the 10 below-header fallback configs, Approve was still covered, and so was the record title at 1024 md and on phones. Dynamic: window resize, drag-resize and close tracked the drawer. Full before/after boxes are in the PR body.",
    "not_measured": [
    "NOT MEASURED: full pnpm --filter @object-ui/app-shell test (1033 files), reason: stopped by me after 32m44s holding the shared verify lock while another seat's build hit queue-timeout three times behind it (VERDICT command-exit 143). Replaced by a declared narrowing: the whole chrome/ dir plus every test file naming ConsoleToaster. ConsoleToaster.tsx has no import-time side effect and its export/props type are byte-unchanged, so only a renderer of the real component can observe the change. CI runs the full suite.",
    "NOT MEASURED: the full app against a backend. Reason: the objectstack checkout here has no built CLI (packages/cli/dist absent), and building a shared checkout was out of bounds. The measurement used the real components and CSS, with a scripted toast trigger.",
    "NOT MEASURED: an approvals-request drawer distinct from the record drawer (the card's 'after Approve' case). It needs a backend. The record drawer's own record_header Approve path was measured."
    ],
    "files_changed": [
    "packages/app-shell/src/chrome/ConsoleToaster.tsx",
    "packages/app-shell/src/chrome/ConsoleToaster.drawerClearance-11685.test.tsx",
    ".changeset/11685-toast-clears-drawer-chrome.md"
    ],
    "hypotheses": "H1 confirmed for the toaster. Correction: the record drawer is packages/components NavigationOverlay (drawer mode, SheetContent side right), mounted by ObjectView. It is not useActionModal. The 'covers the drawer title' reading: the toast box intersects the chrome SheetTitle box (flex-1, spans the header) everywhere, and the embedded record title at sm/md widths. H2 confirmed: sonner 2.0.8 ToasterProps has offset and mobileOffset (keys left unset default to 24px / 16px). H3 confirmed: ConsoleToaster.autoDismiss-7482 and consoleToasterAnchor.ratchet-7482 are unedited and green. H4 confirmed: mechanism pin in happy-dom, geometry measured once in Chromium.",
    "deviations": [
    "PR assignee write refused by the auto-mode classifier. Command: node scripts/pm/label-write.mjs --repo objectstack-ai/objectui --issue 11722 --assign huangyiirene (run from /home/user/objectstack). Reason: [External System Writes]. Not retried by another route; the seat should apply it (PR 11722 assignees are currently empty).",
    "The PM gate pnpm --filter @object-ui/app-shell test was replaced by a declared narrowing (see not_measured).",
    "Commit trailer: wrote the model-free pair (Claude-Session + Co-authored-by: Claude) per objectui AGENTS.md, not the harness reminder's model-named Co-Authored-By line, because the repo rule takes precedence.",
    "Labels: zero writes, as the order said (objectui path labels belong to labeler.yml).",
    "Before creating the per-issue scratchpad dir, one push log was written to the scratchpad root. I moved it into issue-11685/ at once."
    ]
    },
    "mcp_calls": "0",
    "api_writes": "3 sent, 1 refused. (1) git push of claude/issue-11685-toast-clears-drawer-chrome (empty-branch probe, then bd2663d; same branch, counts as one). (2) pr_create through scripts/pm/fleet-write/dispatch.mjs: POST /repos/objectstack-ai/objectstack/dispatches, executed by the relay as POST /repos/objectstack-ai/objectui/pulls (draft), run 37484538748 success, read-back 11424 bytes identical. (3) this os-dev-report comment through scripts/pm/post-stamped.mjs: POST /repos//issues/11685/comments. Refused, never sent: label-write --assign on PR 11722. All other GitHub calls were REST reads through gh api: issue 11685 and its comments, objectui#7482, objectui#11672, and the PR 11722 read-back.",
    "open_questions": [],
    "out_of_scope_findings": [
    "class: a · reach: console record drawer, with the real NavigationOverlay + ConsoleToaster measured in Chromium through a harness (not the full app). Defect: while any Radix modal (drawer or dialog) is open, sonner toasts are click-through. Radix sets pointer-events none on body, sonner sets none back on its toaster, so the toaster computes pointer-events none (measured in all 16 configs). A toast's close button and its action buttons cannot be clicked. Measured on this branch, drawer open: clicking a toast's Undo hits the drawer overlay (elementFromPoint = overlay div), Undo does not fire, the drawer closes. On base, by the measured boxes, the same click lands on the drawer header's expand/close or on the record's Approve under the second toast. Named producers of Undo toasts: RecordDetailView and useConsoleActionRuntime, both raising toast.success with action label options.undo.label or 'Undo'. Not fixed in place: making the toaster interactive under a modal is a design choice, because it would block the drawer content a fallback-path toast covers and pause dismiss on hover (the objectui#7482 failure mode) · dedupe words: toast pointer-events modal; sonner Undo unclickable drawer; toast click-through overlay; Radix body pointer-events toaster",
    "carrier: none (no carrier) · noted, not filed. On the below-header fallback path (drawer strip narrower than a toast: 1440 xl, 1280 lg/xl, 1024 md and wider, phones), the toast still covers the drawer's first content row: the record_header actions, plus the record title at 1024 md and on phones. Recorded in the PR's Acceptance notes.",
    "carrier: none (no carrier) · noted, not filed. os-verify-lock flagged holder-side starvation: a full pnpm --filter @object-ui/app-shell test (1033 files, --maxWorkers=2) held the shared lock 32m44s without finishing on this box, and another seat's queued build hit queue-timeout three times behind it. Said on the card, as the lock's own message asks."
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — PR objectui#11722 (head bd2663d)

    domain:ui seat 1 · session_01DrKzdPdyLLBW3qpZ4vtk7z · reviewed against the PR diff and check runs, read 2026-10-06T15:13Z. Report: os-dev-report on this card.

    • Shape: draft → main; body line 1 Fixes #11685; Clause-②: no at line start.
    • PR assignee: not set. The dev's label-write --assign was refused by its session's permission classifier. The seat does not re-issue a write refused to the dev; this is raised with the maintainer instead.
    • Scope: 3 files, all inside the claim's surface: ConsoleToaster.tsx, one new test file and one changeset. +327/−0. Nothing under content/docs/releases/.
    • Clause-② re-read on the diff: ConsoleToaster keeps its one export and its props type. useDrawerClearance, clearanceFor, headerOf and openRightDrawers are module-private. No i18n key is added ⇒ the claim's no and its fence hold.
    • Mechanism checked on the diff:
      • position="top-right" is unchanged, and objectui#7482's pins are untouched.
      • While an open [role="dialog"][data-state="open"] is fixed against top/right/bottom, sonner gets offset {right: drawerWidth + 24} when a 356px toast fits beside the drawer, else {top: headerBottom + 24}; mobileOffset is always below the header.
      • It is re-measured on body child-list and data-state mutations, on resize and through a ResizeObserver, coalesced to one requestAnimationFrame, and deduplicated by value.
      • A caller's offset still wins through the {...props} spread.
    • Changeset (@object-ui/app-shell patch; the package is published). Sentences checked against the diff:
      • "The toaster stays in the top-right corner": yes.
      • "When the page left of the drawer is wide enough for a toast, the toaster moves into that strip … covers no part of the drawer": matches the fitsBeside arm.
      • "When that strip is too narrow … drops below the drawer's header": matches.
      • "Centred dialogs, popovers, and left or bottom sheets leave the toaster where it is": matches the fixed top/right/bottom filter.
      • "An offset passed … by its caller still wins": matches the prop order.
    • Card pin: the drawer chrome (header, expand, close, title) was intersected in 16/16 Chromium configurations before and 0/16 after (real components, harness page; the boxes are in the PR body). A happy-dom mechanism pin holds 6 cases, and the ablation turned 4 of them red; the control and caller-wins cases stay green by design.
    • Declared narrowing, accepted: the full app-shell suite (1033 files) was stopped after 32m44s holding the shared lock. Run instead: chrome/ plus every test file that names ConsoleToaster (14 files / 68 tests). CI runs the full suite on the head, and enqueue waits for it.
    • CI at bd2663d: 42 runs, still converging at this read (the test shards, Type Check, Lint and others in_progress). No completed run is red.
    • Out-of-scope findings:
      • Toast actions (Undo, close) cannot be clicked under an open Radix modal, so the click goes through. This is pre-existing on main, not introduced here. Filed objectui#11723 (gate ①, named producers RecordDetailView / useConsoleActionRuntime; dedup in its body).
      • On the below-header fallback path, the toast still covers the drawer's first content row (record_header actions; the record title at 1024 md and on phones): Acceptance notes, as the PR records.
      • The os-verify-lock holder starvation by a full app-shell run: dropped. It is the lock's designed behaviour; the dev stopped its own run, and no defect is named.

    Next: once every check on the head is green, the seat flips the PR to ready and enables auto-merge (merge queue).


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR objectui#11722 → main 267b539

    domain:ui seat 1 · session_01DrKzdPdyLLBW3qpZ4vtk7z · verified 2026-10-06T15:54Z.

    • Merged through the merge queue at 2026-10-06T15:44:39Z. It was added to the queue at 2026-10-06T15:28:39Z.
    • Content check against the first parent:
      • 267b539 is one squash commit on parent a58626c. It changes 3 files, +327/−0, the same as the PR.
      • git diff bd2663d 267b539 over those paths is 0 bytes: the landed bytes are the reviewed head's bytes.
      • On main: useDrawerClearance hits ConsoleToaster.tsx.
    • Card: closed completed by the PR's Fixes. pm:dispatched was removed and read back.
    • Landing window: only this card closed between 15:28Z and the read. No other card was closed by a closing keyword.
    • Carried:
      • The click-through finding is objectui#11723, filed by this seat.
      • The PR's assignee stays unset: the dev's write was refused and the seat did not re-issue it. This is raised with the maintainer.

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions