Repository navigation
feat(design): DS-X-27 tooltip and banner - #1716
Conversation
Failing tests plus stubs so the tree typechecks; the components follow. Test-First: src/design/layout/tooltip.test.tsx::opens on focus and closes on Escape Test-First: src/design/layout/banner.test.tsx::bad uses role alert and info uses status Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Tooltip opens on focus and hover (delay from --g-dur-4), Banner has the kinds info/ok/warn/bad; AgentCard, TresorPanel and WegWahl use the Banner. The flip measurement moves to useFlip, shared with Popover. Test-First: src/design/layout/tooltip.test.tsx::opens on focus and closes on Escape Test-First: src/design/layout/banner.test.tsx::bad uses role alert and info uses status Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No-Test: plan text only Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
@Cuarroc Dieser PR hat einen Konflikt mit main und kann nicht in die Merge-Queue. Bitte main hineinmergen (kein Rebase, kein Force-Push) und den Konflikt loesen; das Label |
No-Test: merge commit, merge commit resolving main conflicts Co-Authored-By: gpt-6.1-sol <noreply@openai.com>
Test-First: src/design/layout/tooltip.test.tsx::Escape closes a hover-opened tooltip while focus is elsewhere Co-Authored-By: gpt-6.1-sol <noreply@openai.com>
Test-First: src/design/layout/tooltip.test.tsx::Escape closes a hover-opened tooltip while focus is elsewhere Co-Authored-By: gpt-6.1-sol <noreply@openai.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d07f7bead7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| return ( | ||
| <span | ||
| ref={root} className="g-tip" | ||
| onFocus={() => show(0)} onBlur={hide} onMouseEnter={() => show(hoverDelay())} onMouseLeave={hide} |
There was a problem hiding this comment.
Keep the tooltip open while its content is hovered
When a pointer user moves from the trigger toward the displayed tooltip, this unconditional onMouseLeave closes it immediately; .g-tip__bubble also has pointer-events: none, so the additional content can never be hovered. This breaks the expected hoverable-tooltip behavior for users who need to move the pointer over enlarged content; track trigger/bubble hover together and close only after the pointer has left both.
Useful? React with 👍 / 👎.
| | DS-X-21 | Ein Symbolsatz auf 20-px-Raster: `Icon` in `src/design/icons/` (ohne Beschriftung für Hilfstechnik verborgen, mit `label` als `role="img"`, Farbe über `currentColor`) und 24 Lucide-Pfade als Daten (`glyphs.ts`), dazu Entsprechungen für die 14 klassischen Symbole, die Seitenleisten-Symbole und den Auswahl-Pfeil; Lizenztext `LUCIDE-LIZENZ.txt` neben den Symbolen und Eintrag in `docs/THIRD_PARTY_NOTICES.md` | Implementierer · Claude; Root nimmt ab | DS-Blueprint-Schnitt 16.10. (DS-X-21), Root-Entscheidung 17.10.: Pfade kopieren, kein Paket | Server | B + Lizenzprüfung | Entwurfs-PR offen (17.10.): kein Aufrufer umgestellt, `src/components/Icon.tsx` bleibt bis KR-15; Galerie zeigt den Satz unter „Symbole“ | Tests rot→grün; `vitest run src/design`, typecheck, `contrast-check`, `plan-check --offline` und prepush Exit 0; Bilder der Galerie hell und dunkel; ein Stufe-B-Review einer Nicht-Anthropic-Familie, Root prüft den Lizenzhinweis | – | | ||
| | DS-X-32 | Datenfarben `--g-viz-1` bis `--g-viz-6` in `src/design/tokens.css` (hell und dunkel), eigene Farbtöne abseits der Zustandsfarben; `scripts/contrast-check.mjs` prüft jede Datenfarbe als Nicht-Text mit mindestens 3:1 auf Grund, Chrome und Glas (auch in allen Glas-Varianten), hält sie voneinander und von den Zustandsfarben auseinander und meldet „Token fehlt“; die Galerie-Seite Farben zeigt die sechs Farbfelder; keine Diagramm-Bausteine (das ist DS-X-33) | Implementierer · Claude; Root nimmt ab | DS-X-02; DS-Blueprint-Schnitt 16.10. (Zeile DS-X-32) | Server | B | Erledigt: #1702 (merged 2026-10-18), Branch `claude/ds-x-32`; die sechs Datenfarben stehen in `tokens.css`, `contrast-check` prüft sie und die Galerie-Seite Farben zeigt sie, Diagramm-Bausteine folgen mit DS-X-33 | red-first Gate-Tests in `scripts/lib/contrast-gate.test.mjs`; `contrast-check`, typecheck, `plan-check --offline` und prepush Exit 0; Bilder der Farben-Seite hell und dunkel; ein unabhängiger Stufe-B-Review (Root beauftragt) | – | | ||
| | DS-X-26 | Popover (Fabrik-Designsystem, Welle 4): `src/design/layout/Popover.tsx` setzt `aria-expanded`/`aria-controls` am Auslöser, schließt bei einem Pointerdown außerhalb genau einmal, mit Esc (Fokus zurück zum Auslöser) und beim Verlassen per Tab, misst einmal beim Öffnen, ob es nach oben klappt (keine CSS-Anker-Positionierung), und geht über den Austrittsübergang aus DS-X-07 (bei reduzierter Bewegung sofort); `ProjectPicker` und das kompakte Darstellungsmenü nutzen es mit unverändertem Verhalten und Aussehen; Eintrag im Register; kein Menü-Baustein, kein Tooltip (DS-X-27) | Implementierer · Claude; Root nimmt ab | DS-X-07 (#1683); DS-Blueprint-Schnitt 16.10. (Zeile DS-X-26) | Server | B | Erledigt: #1705 (merged 2026-10-18); `ProjectPicker` und das kompakte Darstellungsmenü nutzen das Popover mit unverändertem Verhalten und Aussehen, kein Menü-Baustein und kein Tooltip (DS-X-27) | red-first Vitest-Tests (`popover.test.tsx`); die bestehenden Tests von `ProjectPicker` und Darstellungsmenü bleiben unverändert grün; `vitest run src/design src/shell`, typecheck, contrast-check, `plan-check --offline` und prepush Exit 0; Bildschirmfotos beider Menüs hell und dunkel; ein unabhängiger Stufe-B-Review (Root beauftragt) | – | | ||
| | DS-X-27 | Tooltip und Banner (Fabrik-Designsystem, Welle 4): `src/design/layout/Tooltip.tsx` öffnet bei Tastaturfokus sofort und beim Überfahren nach der Verzögerung aus dem Dauer-Token `--g-dur-4`, schließt mit Esc, beim Verlassen und bei Blur, setzt `aria-describedby` und bewegt sich nie; die Klapp-Messung teilt es sich mit dem Popover (`useFlip`); `Banner.tsx` hat die Arten info/ok/warn/bad (`bad` als `role="alert"`, die anderen als `status`) mit Zustandswort aus `src/i18n/de.ts`; `AgentCard`, `TresorPanel` und `WegWahl` nutzen das Banner statt `.ls-err`, `.tr-alert` und `.wg-warning`; `.g-hdr-stop` (Knopf, Rolle `status`) und das `.ls-err` in `LeitstandRoute` (Rolle `status`) bleiben, weil der Tausch ihre Rolle oder ihr Verhalten änderte; Register-Einträge; kein Austausch aller `title` | Implementierer · Claude; Root nimmt ab | DS-X-26 (#1705); DS-Blueprint-Schnitt 16.10. (Zeile DS-X-27) | Server | B | In Arbeit: Draft-PR | red-first Vitest-Tests (`tooltip.test.tsx`, `banner.test.tsx`); `vitest run src/design src/screens`, typecheck, contrast-check, `plan-check --offline` und prepush Exit 0; Bildschirmfotos eines offenen Tooltips und aller vier Banner-Arten hell und dunkel; ein unabhängiger Stufe-B-Review (Root beauftragt) | – | |
There was a problem hiding this comment.
Mark DS-X-27 complete in the merge-state plan
The newly added Plan-ID row still says In Arbeit: Draft-PR, which becomes false as soon as this reviewed commit is merged; update it to the completed/merged state and include the resulting evidence. The repository explicitly requires a PR's PLAN row to describe what is true after merge and classifies a mismatch as a medium finding.
AGENTS.md reference: AGENTS.md:L121-L121
Useful? React with 👍 / 👎.
| ref={root} className="g-tip" | ||
| onFocus={() => show(0)} onBlur={hide} onMouseEnter={() => show(hoverDelay())} onMouseLeave={hide} | ||
| > | ||
| {children({ "aria-describedby": open ? id : undefined })} |
There was a problem hiding this comment.
Preserve the trigger's existing accessible description
When this component wraps a control that already has aria-describedby, such as a Field control with hint or error IDs, no ordinary ordering of the documented {...props} spread retains both descriptions: this value either replaces the existing IDs with the tooltip ID (or undefined while closed), or is itself overwritten. Accept and merge the trigger's existing description IDs so opening a tooltip does not hide its hint or validation message from assistive technology.
Useful? React with 👍 / 👎.
Merge Queue Status
This pull request spent 11 minutes 45 seconds in the queue, including 10 minutes 58 seconds running CI. Required conditions to merge
|
Dieses Paket baut zwei neue Bausteine: einen Tooltip (kurzer Hilfetext, der bei Tastaturfokus und beim Überfahren erscheint) und ein Banner mit den Arten Info, Erfolg, Achtung und Fehler. Drei der vier eigenen Hinweisboxen (Agentenkarte, Tresor, Agent starten) nutzen jetzt das Banner; die anderen beiden bleiben, weil ein Tausch ihr Verhalten ändern würde. Du musst nichts entscheiden; der Review wird von Root beauftragt.
Report
Plan-ID: DS-X-27
Änderung
src/design/layout/Tooltip.tsx: öffnet bei Fokus sofort, beim Überfahren nach der Verzögerung aus--g-dur-4(gelesen aus dem CSS-Token, keine feste Millisekundenzahl im Code); schließt mit Esc (Esc geht nur dann nicht weiter nach oben, wenn der Tooltip offen war), Blur und Verlassen;aria-describedbynur solange offen; keine Animation, also statisch bei reduzierter Bewegung und Modus Aus.src/design/layout/useFlip.ts: die Klapp-Messung aus dem Popover (einmal beim Öffnen), jetzt von Popover und Tooltip geteilt; Popover-Verhalten unverändert (alle Popover-Tests grün).src/design/layout/Banner.tsx: Arten info/ok/warn/bad;badistrole="alert", die anderenrole="status"; das Zustandswort steht als Text davor (banner.*insrc/i18n/de.ts), Farbe allein trägt nichts. CSS inlayout.css.BannerundTooltip; PLAN-Zeile DS-X-27..ls-errinAgentCard(alert),.tr-alertinTresorPanel(alert),.wg-warninginWegWahl(status/polite). Die toten CSS-Regeln.tr-alertund.wg-warningsind entfernt. Sichtbare Abweichung: das Zustandswort steht jetzt vor dem Text, und Rahmen, Fläche und Textfarbe folgen dem Banner..g-hdr-stopinStopBand(Rollestatusbei roter Optik, dazu Knopf und eingebetteter Fehler; einbad-Banner wäre einalert) und.ls-errinLeitstandRoute(Rollestatus; der Wechsel aufalertändert die Ansage). Beide brauchen eine Entscheidung zur Rolle oder einenrole-Parameter am Banner.title).Red → grün
tooltip.test.tsx::opens on focus and closes on Escapeundbanner.test.tsx::bad uses role alert and info uses status; Commit 2bd2e5f mit Stubs, damit der Typecheck-Hook durchläuft: 5 Tests rot (Komponenten geben nichts aus). Am Kopf grün.bad uses role alert, info uses statusmit Komma lehnt der commit-msg-Hook als „Liste“ ab; er heißt jetztbad uses role alert and info uses status.bash scripts/ci/red-first.sh→ Exit 0.Belege (Befehl → Exit)
npx vitest run src/design src/screens src/shell→ 0 (108 Dateien, 862 Tests)npm run typecheck→ 0;node scripts/contrast-check.mjs→ 0;node scripts/plan-check.mjs --offline→ 0bash scripts/ci/gates.sh lane prepush(eigener Arbeitsbaum, Slot 3) → 0, ungefiltertgit ls-remote: Kopf adc3de7ds-x-27-banner-tooltip-{light,dark}.pngim Berichtsordner des Orchestrators. Die Fotos zeigen die Bausteine auf einer Testseite, nicht die drei umgestellten Stellen in der echten App.Architecture drift: keine neuen Funde.
NICHT ABGEDECKT
#[cfg(windows)]-Tests, ConPTY/DPAPI); die Windows-Bahn läuft in der Merge-Queue.Review: ausstehend (Stufe B, Root beauftragt)
🤖 Generated with Claude Code on the ProjectA server worker
Conflict fix (Codex, 2026-10-20)
Stage: BLOCKED before push. The authorized merge is committed locally; the required prepush lane failed. No retry was made because the failure is not the one SessionProvider timeout allowed by the brief. Root owns the next decision; resume after explicit authorization for the boot-smoke failure path (diagnosis/fix or a bounded rerun). Product behavior changes and review fixes remain outside this package.
gpt-6.1-sol, effort high, from this session'sturn_context(2026-10-20T12:22:50Z); harness weekly usage observed at 3% used. Native goal was created for this bounded conflict task and remains unmet pending green prepush, push and remote verification.adc3de7de38378e0d70a998ae3bf171e097856b4.9f33f721d52a3a9188a3129118b52bab2cf1bfcd.05d615cbd7aba1ae2fdbfb81636e73430f0311a5(parents: original head and merged main). The requested identity, message, No-Test trailer and observed-model Co-Authored-By trailer are present.adc3de7de38378e0d70a998ae3bf171e097856b4, verified withgit ls-remote origin refs/heads/claude/ds-x-27(exit 0). No push was attempted.Resolution
docs/PLAN.md: retained main exactly and inserted the branch-only DS-X-27 row once; no other branch-only row exists; offline check reports 0 findings.src/design/registry.ts: retained every main entry verbatim, including ConfirmDialog, and added only the branch's original Banner and Tooltip entries (12 lines).Evidence (command -> exit code)
Worktree:
C:/Users/Cuarr/orca/ProjectA/.claude/worktrees/codex-dsx27;CARGO_TARGET_DIR=C:/Users/Cuarr/cargo-targets/projecta-b,CARGO_BUILD_JOBS=1; no CARGO_PROFILE overrides set. node_modules already existed.bash scripts/sync.sh start-> 0; initial status clean.npm run dev:start-check-> 0 before commit and prepush; immediately before prepush: 4.5 GB free, 0 cargo builds. Provider usage was observed separately from the harness, not supplied via --usage.git fetch origin-> 0;git merge origin/main-> 1 (expected: only the two authorized files conflicted).git diff --cached --check-> 0; preservation assertions -> 0.node scripts/plan-check.mjs --offline-> 0, 0 findings (also rechecked after the failed lane).bash scripts/ci/secret-scan.sh-> 0, no leaks; precommit hook -> 0 (14 green gates).git -c user.name=Cuarroc -c user.email=47299143+Cuarroc@users.noreply.github.com commit -F <temporary message file>-> 0.git diff origin/main...HEAD --stat-> 0: original 15 files, 235 insertions and 19 deletions, including only one PLAN row.git merge-base --is-ancestor origin/main HEAD-> 0.bash scripts/ci/gates.sh lane prepush-> 1, first and only run, bound to05d615cb: fe-test failed; 230/231 files and 1692/1693 tests passed.src/__tests__/boot.smoke.test.tsx:53,renders the workspace when every boot command is mocked, expectedlist_projects, observed 0 invoke calls. No cause is established. No SessionProvider failure was reported.C:/Users/Cuarr/AppData/Local/Temp/dsx27-conflict-20261020/{commit,prepush-1}.log. Worktree is clean; local merge remains available for Root's next step.NICHT ABGEDECKT
hq-test,denkraum,clippyandrust-suitedid not run in that lane. Precommit separately passed cargo check and denkraum, which does not replace prepush.Review fix R1716-C1 (Codex, 2026-10-20)
Stage: implemented, checked and pushed; independent delta review and Root acceptance pending. This entry supersedes the earlier conflict-fix blocked status. The existing PR text is preserved. No readiness, label, merge or queue action was performed.
gpt-6.1-sol, efforthigh, from this session'sturn_contextdated 2026-10-20T13:11:50Z. Harness weekly usage observed at 4% used; the start-check itself did not check provider usage because no usage file was supplied.05d615cbd7aba1ae2fdbfb81636e73430f0311a5.7b50cd3b2c6e9d0f9c5c3771e9fae87f943c6cac.d07f7bead73d2357269848043c4a59c701191b70.Change and test boundary
src/design/layout/Tooltip.tsxandsrc/design/layout/tooltip.test.tsxchanged from the assigned base (13 additions/7 deletions and 16 additions respectively).Evidence (command -> exit code)
Worktree:
C:/Users/Cuarr/orca/ProjectA/.claude/worktrees/codex-dsx27;CARGO_TARGET_DIR=C:/Users/Cuarr/cargo-targets/projecta-b,CARGO_BUILD_JOBS=1; no CARGO_PROFILE overrides.git rev-parse HEADat start -> 0: exact assigned base05d615cb; status clean.git ls-remote origin refs/heads/claude/ds-x-27before work -> 0: same full old SHA above.bash scripts/sync.sh start-> 0;git fetch origin-> 0; live PR and origin/main inspected. Thelage-jetztmirror and AgentsRoom memory tools were unavailable here.npm run dev:start-check-> 0 before commits and gate runs; before explicit prepush: 4.5 GB free, 0 cargo builds; before push: 4.1 GB free, 0 cargo builds.npx vitest run src/design/layout/tooltip.test.tsx -t 'Escape closes a hover-opened tooltip while focus is elsewhere'-> 1 on original Tooltip at the base and again at test-only commit7b50cd3b: compiling test fails at line 40 because the tooltip remains present. Same command at fix commitd07f7bea-> 0 (1 selected test passes).npx vitest run src/design/layout/tooltip.test.tsx-> 0 (5 tests).npx vitest run src/design-> 0 (59 files, 281 tests; final committed source is identical to the tested tree).bash scripts/ci/secret-scan.sh-> 0 before each commit; both commit commands and their precommit hooks -> 0.bash scripts/ci/gates.sh lane prepush-> 0, first run, bound tod07f7beain this worktree: 231 frontend files/1694 tests passed; clippy passed; 2319 Rust tests passed, 20 skipped; HQ and Denkraum passed.git push origin HEAD:claude/ds-x-27-> 0; its unchanged hook ran the full prepush lane again -> 0 (231 frontend files/1694 tests; 2319 Rust tests passed, 20 skipped). No failed acceptance run or flake retry occurred in this fix task.git ls-remote origin refs/heads/claude/ds-x-27after push -> 0, new full SHA above.git diff origin/main...HEAD --shortstat-> 0: 15 files, 257 insertions and 19 deletions = 276 total lines, within 300. Worktree clean after push.C:/Users/Cuarr/AppData/Local/Temp/dsx27-review-fix-20261020/{commit-fix,prepush-1,push}.log.Disposition: R1716-C1 accepted and fixed by
d07f7bea, regression introduced separately in7b50cd3b. Independent fix-delta review remains with Root; this implementation does not count as its own independent review.NICHT ABGEDECKT
#[cfg(unix)]tests and Linux clippy arms were not compiled/run (KI-7); no Linux lane.Reviews and disposition (Root, 2026-10-20)
Author family: Anthropic (Claude). Tier B.
05d615cb(Codex): union of both registry entries (Banner, ConfirmDialog) and both PLAN rows. The first Codex prepush failed only at the known load flakeboot.smoke.test.tsx:53; the file passed alone (2/2), and the Root push-hook rerun was green (28 gates).05d615cb(OpenAI, non-author): REQUEST CHANGES with R1716-C1.05d615cband ofd07f7bea(kilo free, non-author): APPROVE WITH CONDITIONS, all findings low.7b50cd3b(test, red) +d07f7bea(fix, green) by Codex. Root delta review (Anthropic, non-author of the OpenAI delta): APPROVE. While the tooltip is open, a capture-phasekeydownlistener ondocumentcloses it on Escape and is removed on close or unmount. The first Escape closes only the tooltip, the second reaches outer handlers; the test asserts exactly this.Tooltip.tsx:39-47)7b50cd3b(red) +d07f7bea(fix)byPointer/returnFocusin PopoverPopover.tsx:41-54GAP = 8duplicated in CSShoverDelay()token parsing fragilityBannerKindkeys are typed, so typecheck catches a missing keyspanmay wrap block contentNo open high finding.
review-okbound to headd07f7bead73d2357269848043c4a59c701191b70.