Repository navigation
fix(plugin-detail): reveal the read-only field copy button on keyboard focus - #26487
Merged
objectstack-fleet[bot] merged 2 commits intoOct 27, 2026
Merged
Conversation
Claude-Session: https://claude.ai/code/session_01SMps7wq7rBTk53e8KTSEup Co-authored-by: Claude <noreply@anthropic.com>
…ard focus Claude-Session: https://claude.ai/code/session_01SMps7wq7rBTk53e8KTSEup Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
维护者速读改了什么:记录详情页(桌面阅读模式)只读字段旁的「复制」按钮,除了鼠标悬停,现在键盘 Tab 聚焦到它或它所在的字段时也会显示。 席位核对seat 2 · 2026-10-27T05:23Z · head
|
objectstack-fleet
Bot
deleted the
claude/issue-26329-copy-focus-reveal
branch
October 27, 2026 05:36
This was referenced Oct 27, 2026
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 #26329
Clause-②: no
Metadata-protocol: none
维护者速读
ui/packages/plugin-detail/src/DetailSection.tsx复制按钮的 className(与上方铅笔按钮写法一致)。What changed
ui/packages/plugin-detail/src/DetailSection.tsx: the copy-to-clipboard button drawn beside a read-only, copyable field in desktop read mode wasopacity-0 group-hover:opacity-100. It is a real button, so a keyboard Tab stop landed on a control the user could not see, and the sharedButtonfocus ring was painted at opacity 0. It now also carriesgroup-focus-within:opacity-100 focus-visible:opacity-100, the spelling the inline-edit pencil a few lines above already uses (PR fix(plugin-detail): reveal the inline-edit pencil on keyboard focus #26325), as doRowActionMenu(plugin-grid) anddata-table(components).focus-visiblereveals the button while it has keyboard focus.group-focus-withinreveals it while anything in its own field has focus, which includes the field's own click-to-copy row (itself a Tab stop withrole="button").detail.copyToClipboard), the copied-state icon, the mobile grouped-inset row, and every locale pack..changeset/26329-copy-button-focus-reveal.md:@object-ui/plugin-detailpatch.node scripts/check-sdui-manifest.mjsexits 0 and no registry component contract changed.Tests
New:
ui/packages/plugin-detail/src/__tests__/copyButton.focusReveal-26329.test.tsx, 4 tests, modelled on the pencil's pininlineEditPencil.focusReveal-25883.test.tsx.jsdom has no layout and no CSS engine, so it cannot measure "visible on focus". The tests pin the contract a browser turns into visibility:
buttonand takes focus;focus-visible:opacity-100andgroup-focus-within:opacity-100next to the unchangedopacity-0 group-hover:opacity-100;focus-visible:ring-2survives the className merge;.groupancestor is the button's own field, so focus in one field reveals only that field's button;Activating the focused button copies its own field's value (
navigator.clipboard.writeTextreceivesParis), an empty field offers no copy button, and an editable field draws the pencil instead. The button is found by its icon, not by its localized label.df130cf0(the pin committed, the fix absent):Tests 1 failed | 3 passed (4). The failure is at thefocus-visible:opacity-100assertion; focusability and the hover reveal were already green there, which is the defect: a focusable but invisible control.2f49b3e0, from cwdui/underscripts/pm/os-verify-lock.sh:pnpm exec vitest run packages/plugin-detail --maxWorkers=2:Test Files 307 passed | 1 skipped (308),Tests 2857 passed | 18 skipped (2875). The new file alone:Tests 4 passed (4).pnpm --filter @object-ui/plugin-detail run type-check(bothtsc --noEmitandtsc -p tsconfig.test.json, so the new test is compiled): exit 0.pnpm --filter '@object-ui/plugin-detail^...' build, VERDICT command-exit 0.Gates
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat head2f49b3e0: 34 commands, each run locally, each exit 0. They includenode scripts/check-sdui-manifest.mjs(and its--self-test),pnpm check:nul-bytes,pnpm check:cross-package-test-inputs,pnpm check:test-source-alias,pnpm check:type-check-coverage,pnpm check:type-check-debt(re-measure under the lock: 0 raw tsc errors),pnpm --dir ui exec vitest run scripts/(Tests 5097 passed | 2 skipped) and the changeset gates.--ranreconciliation with exit codes recorded:34 derived famil(ies) accounted for — 34 run, 0 NOT-MEASURED (a DERIVED zero), exit 0.CI runs every other family (lint, the type-check lanes, Build and E2E UI); this PR cites CI rather than re-running them locally.
Acceptance notes
RowActionMenuaddspointer-coarse:opacity-100). That belongs with the mobile read row's edit path and is out of this claim's file surface.Generated by Claude Code