SearchSheet
ImplementedBottom sheet for the public events search (HV2 / R5, ADR-058). What / Where / When fields plus optional date presets, submitted as a plain GET so it works without hydration. Each field can be replaced by a consumer slot — whatField / whereField (ADR-074) / whenField — the slot's input carries name into the same form, and whenView (ADR-075) swaps the panel to a full-height sub-view inside the same dialog. Modal semantics come from useOverlayDialog (Escape, scrim, focus trap, scroll lock, focus return). Default field names are the /events contract (q, city, when). ADR-071: each underline row's input paints the single field-level ring with ring-offset-ep-bg — rows never stack a wrapper ring.
components/organisms/SearchSheet/SearchSheet.tsxProps
SearchSheet
openboolean—Visibility; nothing renders when false.
onClose() => void—Close request from Escape, the scrim or the close button.
actionstring—GET target, already locale-aware (e.g. /fr/events).
labelsSearchSheetLabels—what / where / when / submit / close — the component authors no copy (DS i18n rule).
placeholdersSearchSheetPlaceholders—what / where / when placeholders.
fieldNamesPartial<SearchSheetFieldNames>{ q, city, when }Query-param names, overriding the /events contract.
presetsSearchSheetPreset[]—Date presets rendered as aria-pressed chips that write into the When field (O7).
presetsLabelstringlabels.whenAccessible name of the preset group.
triggerRefRefObject<HTMLElement | null>—Element that receives focus back on close.
classNamestring—Additional CSS classes on the overlay root.
themeScope'dark' | 'inherit''inherit'Scoped theming of the portal root (ADR-063): 'dark' carries data-theme="dark" — the scoped-dark brand band of ADR-062 (e.g. the v2 home) — while 'inherit' leaves the attribute off so the sheet resolves the surrounding/global theme.
whatFieldReactNode—Replaces the « Quoi » input with consumer-owned content (a combobox, DS SearchInput with renderForm={false}). The sheet keeps the field label, the focus contract and the GET fallback: the slot's input carries name into the same form.
whereFieldReactNode—ADR-074. Replaces the « Où » input — same contract as whatField: the sheet keeps the visible field label and the slot's input carries name into the same form.
whenFieldReactNode—Replaces the « Quand » input — same contract as whatField. When set, the built-in presets row is dropped: the slot owns the whole field.
whenViewReactNode—ADR-075. Full-screen sub-view rendered above the form while set: the panel stretches to the viewport (h-[100dvh] … p-0) and the handle/close row is not rendered — the view owns its own header. The form stays MOUNTED but hidden, so the Quoi/Où inputs keep their DOM values.
whenViewLabelstring—Accessible name of the dialog while whenView is open.
onWhenViewClose() => void—Escape pressed while whenView is open (first rung of the useOverlayDialog ladder); a second consecutive claimed Escape still closes the sheet.
<SearchSheet />