Skip to content

test(studio): keep native title tooltips off schedule controls - #2372

Open
peppescg wants to merge 2 commits into
feat/studio-schedules-2299-transcriptfrom
refactor/studio-tooltips-2341-schedules
Open

peppescg wants to merge 2 commits into
feat/studio-schedules-2299-transcriptfrom
refactor/studio-tooltips-2341-schedules

Conversation

@peppescg

@peppescg peppescg commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Stack (4 of 4) for #2299 and #2341: the inventory and detail → the dialog → the transcript dialog → this PR. Review bottom to top; this PR's own diff is one test file.

Summary

This audits every title= under apps/web/src/features/schedules/ for #2341, on the code the three PRs below leave. No interactive control there carries a native title, so nothing moves to the Tooltip primitive. The remaining titles disclose full values on plain text, or are component props. A guard test now fails if a native title lands on a schedule control.

Part of #2341
Part of #2201
Part of #2210

What changed

  • schedules/schedules-titles.test.tsx renders every schedule surface:
    • the inventory and its row menu;
    • the create dialog, on both trigger tabs;
    • the detail page and its header menu;
    • the edit dialog;
    • the transcript dialog.
  • On each, it fails when a title sits on an interactive element (links, buttons, form fields, menu items, tabs, radios, switches, or anything with tabindex).
  • It also fails when a title sits inside an interactive element, unless it is the status dot, whose label is also visually hidden text.
  • No component changes.

Every occurrence

title= in non-test files under features/schedules/ at this PR's head (97f3f8c7f, after #2369's review fix): 12. The audit first counted 14 at 6722f9676; #2369's review moved the Next run and Last run fact dates into visible text and dropped those two Fact titles.

Occurrence (features/schedules/, line) Element Decision
schedules-workspace.tsx:252 <EmptyState title=…> Kept: a component prop (the empty state's heading).
schedules-workspace.tsx:258 <EmptyState title=…> Kept: a component prop (the empty state's heading).
schedules-workspace.tsx:414 <span title={cron or trigger}> in the Schedule cell Kept: non-interactive text. It discloses the raw cron expression, or a truncated trigger, and can't take focus.
schedules-workspace.tsx:425 TableCell title={full date} (Next run) Kept: the pointer's hover on non-interactive text. Since #2369's review the cell also holds the date as hidden text in a <time dateTime>, so the title is no longer the only way to it.
schedules-workspace.tsx:435 TableCell title={full date} (Last run) Kept: as above.
schedule-status.tsx:83 <span title={label}> (status dot) Kept: a non-interactive dot. It shows only in the phone list, inside the row's link, where its label is also visually hidden text. A Tooltip trigger would have to be focusable inside the link, which nests interactive content.
schedule-detail.tsx:190 <DetailState title=…> Kept: a component prop (the state's heading).
schedule-detail.tsx:195 <DetailState title=…> Kept: a component prop (the state's heading).
schedule-detail.tsx:277 <FactGroup title="Details"> Kept: a component prop (the group's heading).
schedule-detail.tsx:293 <FactGroup title="Frequency"> Kept: a component prop (the group's heading).
schedule-detail.tsx:296 <Fact title={cron (time zone)}> (Repeat) Kept: a component prop, rendered on the <dd> at line 681.
schedule-detail.tsx:681 <dd title={title}> Kept: non-interactive text. Only the Repeat fact passes a title now (its raw cron expression).

schedule-form.tsx, schedule-transcript-dialog.tsx and the chat TranscriptView they render have no title=.

The size-4 note from #2357 and #2368. No Button here moves into a TooltipTrigger, so no per-site size-4 workaround is added. The size-4 on the New scheduled task button's Plus icon (#1) copies the prototype's markup. That Button keeps data-slot="button", so it is not a workaround and stays after #2368.

No regression

  • The guard passes on the unchanged components (2/2). After the restack onto feat(studio): align the schedule inventory and detail page with the prototype #2369's review fix, a second commit (97f3f8c7f) changes its detail-page check from three <dd> titles to the one Repeat title left.

  • Mutation proof (each applied alone):

    Mutation Result
    title on a row's Actions button fails
    title on the run log's View transcript button fails
    title on the one-shot Date input fails
    title on the prompt text inside a phone row's link fails

Screenshots

This PR changes no UI, so Before and After are identical: every frame below matches pixel for pixel. Amber boxes mark the title= sites reviewed in the decision table above. They are on Before and After only, never on the prototype. There are no red diff boxes because nothing differs. Before = 6f5587e (#2371's head at the time), After = 6722f96, Prototype = stack-08. These frames predate #2369's review fix, which makes the detail page's Next run and Last run dates visible text; see #2369's "Review changes" for those frames.

Inventory, desktop light. The Schedule cell <span> and the Next run and Last run <td>s.

Inventory, phone dark. The status dot inside each row's link.

Detail, desktop dark. The Details and Frequency FactGroup headings, and the Repeat, Next run and Last run <dd>s.

Empty state, desktop light. The EmptyState title ("Nothing scheduled yet").

All other frames

Inventory:


Detail (the phone shots are taken at the top and scrolled to the Frequency group):





Empty states: nothing scheduled, scheduling not wired, task not found, and scheduling unavailable on the detail page. The prototype's unsupported detail page reuses its not-found card.















Gates

Through the shared lock, on 97f3f8c7f (restacked):

  • task studio:check passes: lint, typecheck and the generated-artifact check pass; server tests 252/252; web tests 1744/1744.
  • task studio:browser: 153 passed, 41 skipped.
  • task docs passes.

🤖 Generated with Claude Code

@peppescg
peppescg added this pull request to stack #2373 October 15, 2026 17:49
peppescg added a commit that referenced this pull request Oct 15, 2026
…er title sites)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@peppescg
peppescg force-pushed the refactor/studio-tooltips-2341-schedules branch from 6722f96 to 1cd4b89 Compare October 16, 2026 12:24

@kantord kantord left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for the audit, the per-occurrence table was easy to check: I counted 14 non-test title= occurrences under features/schedules/ and the lines and elements match. Approving, with a few non-blocking nits:

  • The guard test doesn't mount the loading, error, empty and not-found states, or a locked edit form. Its interactive selector also misses menuitemcheckbox, menuitemradio and slider. I think the risk is low, but it is worth knowing about.
  • .toHaveLength(3) on the dd titles breaks whenever a Fact gains or loses a title.
  • The "14" counts one data flow twice (the Fact and FactGroup props and the <dd> they reach), and the PR text calls the date cells <td> where the source has TableCell.
  • Not a problem with this PR, but worth keeping visible: the exact next-run and last-run dates and the cron expression stay hover-only titles on non-focusable text, which keyboard and touch users can't reach. That is the same question as on #2369.

Fully or partially written by an AI agent.

@peppescg
peppescg force-pushed the refactor/studio-tooltips-2341-schedules branch from 1cd4b89 to aeeb501 Compare October 16, 2026 19:51
@peppescg
peppescg force-pushed the refactor/studio-tooltips-2341-schedules branch from aeeb501 to 14d5ccb Compare October 16, 2026 19:56
peppescg and others added 2 commits October 16, 2026 22:16
Audits every title= under features/schedules/ for #2341. No interactive
control there carries a native title, so nothing moves to the Tooltip
primitive. The remaining titles disclose full values on plain text: a
date behind a relative time, a cron expression behind its description,
and a status behind its dot. The rest are component props (headings).

The guard renders the inventory and its menu, the create dialog, the
detail page, its edit dialog and the transcript dialog, and fails when
a title sits on an interactive element, or inside one other than the
status dot, whose label is also visually hidden text.

Refs #2341
Refs #2201

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… became text

#2369's review fix shows the detail page's next and last run dates as
text, so their `<dd>` titles are gone. The guard now names the one
title left (the Repeat fact's raw cron) instead of counting three.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@peppescg
peppescg force-pushed the refactor/studio-tooltips-2341-schedules branch from 14d5ccb to 97f3f8c Compare October 16, 2026 20:22

This branch has not been deployed

No deployments
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.

2 participants