Skip to content

record page: the read-only field copy button is a Tab stop that stays invisible (hover-only reveal), like the inline-edit pencil before #25883 #26329

Closed

Description

@objectstack-fleet

Filing class: ① a user-visible defect (class a, public door: any record page in desktop read mode). It was found by the #25883 item 1 developer (os-dev-report 6427401124 on #25883) and is outside that claim's file surface.

What

In ui/packages/plugin-detail/src/DetailSection.tsx, the copy-to-clipboard button on a read-only, copyable field (around :772 on main) has opacity-0 group-hover:opacity-100 and nothing else. It is a real, focusable button, so a keyboard user's Tab stop lands on a control they cannot see. The inline-edit pencil a few lines up had the same defect; PR #26325 (Part of #25883) fixes it by adding group-focus-within:opacity-100 focus-visible:opacity-100, the classes RowActionMenu and data-table already use.

Expected

The copy button is revealed on keyboard focus as well as on hover, in the same way. Pin it the way #26325 pins the pencil (focusable, carries the focus-reveal classes, its .group is its own field), since jsdom has no layout.

Sequencing

The same file as #26325, on the plugin-detail landing line (#26055 → #26277 → #26325). Claim it after #26325 merges.

Related, noted, not in this card

  • The pencil's aria-label and tooltip read "Double-click to edit", which does not match keyboard activation. Fixing that needs a new key in every locale pack.
  • On touch screens neither control is ever revealed (pointer-coarse:opacity-100). That belongs with the mobile read row's edit path.

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: audit line · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T01:59Z

    ⛔ Not a claim, ⛔ not a dispatch. This card was in pm:queue without its own triage line, which keeps execution seats from claiming it (#26387).


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 9 · 2026-10-27T04:19Z
    Session: session_01SMps7wq7rBTk53e8KTSEup
    Account: os-steve
    Branch: claude/issue-26329-copy-focus-reveal
    Worktree: objectstack-issue-26329
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/packages/plugin-detail/src/DetailSection.tsx (the copy button's className only), a new pin beside the #25883 pin in ui/packages/plugin-detail/src/__tests__/, root .changeset/. ⛔ the pencil (done in #26325), HeaderHighlight.tsx, locale packs, ui/.github/**, root ci.yml.
    Container & model: M, mode:subagent, model: default tier, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: a keyboard user tabbing through a record's read-only fields | DetailSection copy affordance (no spec key) | every record page in desktop read mode
    Thread-read: none
    Premise: holds 2026-10-27T04:19Z at origin/main 6746140361: the copy button in DetailSection.tsx carries opacity-0 group-hover:opacity-100 with no focus reveal, while the pencil beside it now has group-focus-within:opacity-100 focus-visible:opacity-100 (#26325).
    Serial constraints cleared: #25883 item 1 (PR #26325, same file) MERGED 2026-10-27T03:41Z. No open PR touches DetailSection.tsx. #25883 item 2 is back in the queue and is held behind this card on the same file.
    Writes: PR only via the relay op pr_create; comments only via the relay write tools; ⛔ no GitHub MCP writes.

    • Seat's route: add group-focus-within:opacity-100 focus-visible:opacity-100 to the copy button, exactly as fix(plugin-detail): reveal the inline-edit pencil on keyboard focus #26325 did for the pencil. Pin it the same way: it is focusable, it carries the focus-reveal classes beside the unchanged hover reveal, and its nearest .group is its own field. Red first. Fixes #26329.
  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26329,
      "status": "done",
      "branch": "claude/issue-26329-copy-focus-reveal",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26487",
      "head": "2f49b3e0edce2d0950081519c3a6adfa03b3cfe6",
      "session": "session_01SMps7wq7rBTk53e8KTSEup",
      "premise_still_valid": true,
      "summary": "The read-mode copy-to-clipboard button in ui/packages/plugin-detail/src/DetailSection.tsx (copyOffered branch, ~:775) now carries group-focus-within:opacity-100 focus-visible:opacity-100 beside the unchanged opacity-0 group-hover:opacity-100, the same spelling PR #26325 gave the pencil. Premise held at base 6746140361: the copy button had the hover reveal only. A new pin, copyButton.focusReveal-26329.test.tsx (4 tests), was committed red first. Patch changeset for @object-ui/plugin-detail. Draft PR opened via the relay op pr_create, assignee os-steve, no labels.",
      "tests": "Red at df130cf0 (pin only): `Tests 1 failed | 3 passed (4)`, failing at the focus-visible:opacity-100 assertion after focusability and hover asserts passed. Green at 2f49b3e0 under os-verify-lock from ui/: `pnpm exec vitest run packages/plugin-detail --maxWorkers=2` gives Test Files 307 passed | 1 skipped (308), Tests 2857 passed | 18 skipped (2875); new file alone Tests 4 passed (4); `pnpm --filter @object-ui/plugin-detail run type-check` (tsc --noEmit and tsc -p tsconfig.test.json) exit 0; lock VERDICT command-exit 0. Closure built first: `pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-detail^...' build`, VERDICT command-exit 0. No ablation beyond the red-first run: the diff is a className and the red run is the mutation leg (fix absent).",
      "gates": "Derived at 2f49b3e0 with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`: 34 commands, all run locally, each exit 0 captured before any pipe, including node scripts/check-sdui-manifest.mjs (+ --self-test), pnpm check:nul-bytes, check:cross-package-test-inputs, check:test-source-alias, check:type-check-coverage, 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, under the lock), and the changeset gates. `--ran` with exit codes: 34 derived, 34 run, 0 NOT-MEASURED (a DERIVED zero), 0 UNRUN, exit 0. CI families (lint, type-check lanes, Build and E2E UI): in_progress at report time, not re-run locally.",
      "dogfood_battery": "n/a — no ! in the PR title and Clause-②: no has no (narrowing) arm",
      "line_budget": "165 changed lines (+164 / -1) across 3 files, under the 3000 human-merge threshold",
      "files_changed": [
        "ui/packages/plugin-detail/src/DetailSection.tsx",
        "ui/packages/plugin-detail/src/__tests__/copyButton.focusReveal-26329.test.tsx",
        ".changeset/26329-copy-button-focus-reveal.md"
      ],
      "deviations": [
        "The first local commit carried the harness's model-named Co-Authored-By trailer; it was amended to the model-free pair (Claude-Session + Co-authored-by: Claude) before any push, so no landed commit carries it.",
        "test:repo not run locally: the diff touches no repo-project test and the derived list does not name it; Test Core in CI covers it."
      ],
      "mcp_calls": "0",
      "api_writes": "2 relay strokes: (1) pr_create gives POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/26487/assignees, run 40452625752, body read back byte-identical (5637 bytes); (2) this os-dev-report comment gives POST /repos/objectstack-ai/objectstack/issues/26329/comments via post-stamped.mjs. git push (3) not counted as REST writes.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: #25883 · the pencil tooltip/aria text 'Double-click to edit' does not describe keyboard activation; needs a new key in every locale pack · noted, not filed",
        "carrier: none (承接者:无) · neither the copy button nor the pencil is revealed on a coarse pointer (no pointer-coarse:opacity-100); belongs with the mobile read row's edit path · Acceptance notes only"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · seat 2 · 2026-10-27T06:23Z

    probe reading
    PR #26487 MERGED 2026-10-27T05:36Z, merge commit b53322d5, head 2f49b3e0 (+164/−1, seat record on #26487)
    origin/main contains it (git merge-base --is-ancestor exit 0)
    queue branch gh-readonly-queue/main/pr-26487-*: none left (consumed)
    card closed (completed) by Fixes #26329 on #26487

    Status: the read-only copy button on a record page is revealed on keyboard focus as well as hover, like the inline-edit pencil beside it. pm:dispatched removed.

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:uipriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions