Repository navigation
fix(plugin-detail): a collapsible record section's header is a named button; the copy-value button is named (objectui#12625) - #12661
Merged
objectstack-fleet[bot] merged 4 commits intoOct 16, 2026
Conversation
…button; the copy-value button is named (objectui#12625) The collapsible header was CollapsibleTrigger asChild on the CardHeader div: aria-expanded and a click handler, but no role and no tabindex. The trigger is now a native button inside the header, named by the section title; an after: overlay keeps the whole header clickable. The copy-value icon button takes aria-label from detail.copyToClipboard. Pins by role and name on DetailSection and on the real RecordDetailView mount (tabs, header actions, section header), and on the app pill. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
…#12625) Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
… census backlog (objectui#12625) The copy-value button is now named by detail.copyToClipboard. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contributor
Author
|
Live E2E (informational) is red at head
Generated by Claude Code |
Contributor
Author
Review: ACCEPT — objectui PR #12661 ·
|
objectstack-fleet
Bot
deleted the
claude/issue-12625-record-page-names
branch
October 16, 2026 12:58
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.
Fixes #12625
Clause-②: no
What the tree said on main
Measured on
a5bb7ac2f(after #12651) before any edit: the real consoleRecordDetailViewmounted with a lead object (threerecord_headeractions, a child lookup for the Related tab, a collapsible field group 'Lead Information'), names read by role with RTL, and the same rendered DOM loaded into real Chromium and read with CDPAccessibility.getFullAXTree.page:tabsrenders the label in a plain span, Activity and History use the same trigger), the header actions (Log a Call, Log a Meeting, Schedule a Meeting, Edit, More actions, Refresh), and the app pill (name HotCRM, title HotCRM;AppMarkis aria-hidden). As in objectui#12510, the card's readings of these came from the tool, not the tree.DetailSection.tsx:CollapsibleTrigger asChildon theCardHeaderdiv:aria-expandedand a click handler, but no role and no tabindex. No button by the section title existed and a keyboard user could not reach or toggle the section.buttonwith an empty name.What changed
DetailSection.tsx, collapsible branch: the trigger is now a nativebutton type="button"inside the header (full-width, text-left), named by the section title, carryingaria-expanded; Enter and Space toggle it natively, Tab reaches it. The header keeps its classes (padding, hover,headerColor) and becomesrelative; the button'safter:overlay spans it, so a click anywhere on the header still toggles, as before. Chevrons are aria-hidden. The non-collapsible header is unchanged (a plain title, no button).aria-labelfrom the existingdetail.copyToClipboardkey (no new string). Every copy button on a record reads the same name, "Copy to clipboard"; a per-field name would need a new interpolated key, left out on purpose (see Acceptance notes).@object-ui/plugin-detailpatch.Pins
DetailSection.accessibleNames-12625.test.tsx(plugin-detail):getByRole('button', { name: 'Lead Information' })is a native button witharia-expanded, toggled by click, by Enter and by Space after Tab;defaultCollapsedreads collapsed; copy buttons by name. CONTROL: a non-collapsible titled section shows its title and no header button, noaria-expandedanywhere.RecordDetailView.accessibleNames-12625.test.tsx(app-shell, the real record page mount):getByRole('tab', { name: 'Details' }),getByRole('tab', { name: 'Related' }),getByRole('button', { name: 'Log a Call' })and the other two actions, the 'Lead Information' header button toggling; CONTROL: the non-collapsible 'Address' group is no button.AppSwitcher.accessibleName-12625.test.tsx(app-shell): with the real dropdown trigger,getByRole('button', { name: /HotCRM/ })resolves and its title is HotCRM.Ablation (one-off, both legs recorded)
With the fix committed (
294ef9835), the collapsible header block was put back to the base div shape on disk (marker count for the new block 1 to 0,CollapsibleTrigger asChilddirectly onCardHeader0 to 1) under an EXIT trap; the plugin-detail pin file read3 failed | 2 passed: the three header-button rows red, the CONTROL and the copy-button row green. Restored withgit checkout HEAD --, HEAD blob hash matched,git diff HEADempty. Tests importsrcthrough the root vitest alias, so no build sat between the mutation and the run.Verification (final head
94c0d6a1a)pnpm exec vitest run packages/plugin-detail/: Test Files 274 passed, 1 skipped; Tests 2660 passed, 14 skipped.packages/app-shell/dir is not run locally (too long for the container's foreground cap; CI runs it). Run instead: everyRecordDetailView*view test and everyAppSwitcher*test, 65 files, 413 tests passed, the new pins included.@object-ui/plugin-detailtype-checkexit 0;@object-ui/app-shelltype-checkexit 0 (both include tests throughtsconfig.test.json), after building each closure.--no-inline-configon the four changed files (--format json): 4 files, 0 errors;DetailSection.tsxhas the same 12 warnings as on base, the three test files none. Narrowed lint, not the repo-wide run (CI owns that).check-hand-rolled-comment-mask.mjs,check-changeset-fixed.mjs,check-changeset-presence.mjs.Acceptance notes
Acceptance 2 (a pasted accessibility tree of the live lead record) is answered by the Chromium AX-tree reading of the rendered record page described above, not by a live HotCRM session; no live stack was started.
The copy-value buttons all share one name. A field-specific name ("Copy Company") would need a new interpolated i18n key in all ten packs; not added here per the dispatch order.
Adds no product-specific widget, dialog, hook or string (see AGENTS.md › Product-neutral renderer)
Generated by Claude Code