feat(tickets): popup réutilisable de sélection de ticket (#18)

Ajoute TicketPicker, popup modale réutilisable de sélection de ticket,
socle du chemin critique du sprint UI rework (#17 et #19 en dépendent).

- TicketPicker.tsx : popup de recherche/sélection réutilisable
- useTicketSearch.ts : hook de recherche/filtrage extrait et partagé
- TicketFacetsBar.tsx : barre de facettes extraite de TicketsPanel
  pour réutilisation (listing principal + picker)
- shared/ui/zIndex.ts : échelle z-index centralisée
- TicketsPanel : consomme la barre de facettes extraite

Tests : TicketPicker.test.tsx 8/8, suite tickets 37/37, tsc --noEmit clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-06 15:54:47 +02:00
parent d97abb116f
commit 140daae8b3
8 changed files with 954 additions and 65 deletions

View File

@ -31,3 +31,6 @@ export type { ToolbarProps } from "./ui/Toolbar";
export { Spinner } from "./ui/Spinner";
export type { SpinnerProps } from "./ui/Spinner";
export { zIndex } from "./ui/zIndex";
export type { ZIndexLevel } from "./ui/zIndex";

View File

@ -0,0 +1,28 @@
/**
* Centralized z-index scale for full-window chrome overlays (G2 — UI rework).
*
* In-cell veils/portals keep their historical low values (chrome 25, F3 z-20,
* write-portal z-4, resume z-5); this scale is for floating windows and menus
* mounted at the **chrome level** (ProjectsView/App), never inside
* LayoutGrid/LeafView (G5).
*
* ⚠️ PROVISIONAL (lot B / ticket #18): created here because lot A (ticket #16)
* introduces the canonical `shared/ui/zIndex.ts` (+ `FloatingWindow`) in
* parallel. The values below MUST match the frozen scale; at merge, keep a
* single module (drop this one if lot A's is richer). See the sprint scoping
* note `ui-rework-sprint-scoping-contracts`.
*/
export const zIndex = {
/** Dropdown menus / popovers anchored to a control. */
menuDropdown: 40,
/** A top-level floating window (movable panel, editor overlay). */
floatingWindow: 50,
/** A floating window opened from within another floating window (e.g. a
* ticket picker launched from a sprint/link dialog). Sits above it. */
floatingWindowNested: 60,
/** Transient toasts, always on top. */
toast: 70,
} as const;
/** A level name in the {@link zIndex} scale. */
export type ZIndexLevel = keyof typeof zIndex;