@alfadocs/ui-kit-debug 1.88.0 → 1.89.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/_chunks/{booking-DjQuhfN7.js → booking-C0FoW8Yx.js} +2 -1
  2. package/dist/_chunks/booking-C0FoW8Yx.js.map +1 -0
  3. package/dist/_chunks/{header-settings-CifwJEKB.js → header-settings-BVhjndtV.js} +188 -168
  4. package/dist/_chunks/header-settings-BVhjndtV.js.map +1 -0
  5. package/dist/_chunks/{locale-picker-QbT1p60X.js → locale-picker-DVvinQXU.js} +339 -310
  6. package/dist/_chunks/locale-picker-DVvinQXU.js.map +1 -0
  7. package/dist/_chunks/{marketplace-app-shell-vON3WhD0.js → marketplace-app-shell-x_abo_ye.js} +2 -2
  8. package/dist/_chunks/{marketplace-app-shell-vON3WhD0.js.map → marketplace-app-shell-x_abo_ye.js.map} +1 -1
  9. package/dist/_chunks/{patient-search-Dy0sxcwv.js → patient-search-BPjP2__L.js} +15 -13
  10. package/dist/_chunks/patient-search-BPjP2__L.js.map +1 -0
  11. package/dist/agent-catalog.json +4 -4
  12. package/dist/agent-i18n/en.json +3 -3
  13. package/dist/components/booking/details-form.d.ts.map +1 -1
  14. package/dist/components/booking/index.js +1 -1
  15. package/dist/components/header-settings/header-settings.d.ts +14 -0
  16. package/dist/components/header-settings/header-settings.d.ts.map +1 -1
  17. package/dist/components/header-settings/index.js +1 -1
  18. package/dist/components/locale-picker/index.js +4 -3
  19. package/dist/components/locale-picker/locale-picker.d.ts +31 -1
  20. package/dist/components/locale-picker/locale-picker.d.ts.map +1 -1
  21. package/dist/components/patient-search/index.js +1 -1
  22. package/dist/components/patient-search/patient-search.d.ts.map +1 -1
  23. package/dist/index.js +3 -3
  24. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  25. package/package.json +1 -1
  26. package/dist/_chunks/booking-DjQuhfN7.js.map +0 -1
  27. package/dist/_chunks/header-settings-CifwJEKB.js.map +0 -1
  28. package/dist/_chunks/locale-picker-QbT1p60X.js.map +0 -1
  29. package/dist/_chunks/patient-search-Dy0sxcwv.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { jsx as a, jsxs as w } from "react/jsx-runtime";
2
- import { forwardRef as ce, useRef as j, useEffect as K, useMemo as Y, useImperativeHandle as le, useState as z, useCallback as M, useId as ue } from "react";
2
+ import { forwardRef as ce, useRef as j, useEffect as K, useMemo as Y, useImperativeHandle as le, useState as W, useCallback as M, useId as ue } from "react";
3
3
  import { c as L } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as C } from "react-i18next";
5
5
  import { A as re } from "./autocomplete-CnB1mHGc.js";
@@ -7,7 +7,7 @@ import { B as fe } from "./button-DohK_Ak_.js";
7
7
  import { C as H } from "./card-BA4Ig_kn.js";
8
8
  import { S as pe } from "./slider-pZ95bEm7.js";
9
9
  import { A as ee } from "./alert-9kEwDza3.js";
10
- import { D as W } from "./dropdown-menu-D1we7oAY.js";
10
+ import { D as F } from "./dropdown-menu-D1we7oAY.js";
11
11
  import { u as me } from "./registry-DvAUVLHh.js";
12
12
  import { S as ne } from "./search-QbWPlY5f.js";
13
13
  import { X as ie } from "./x-B5YnXwCz.js";
@@ -122,7 +122,7 @@ function $({
122
122
  inputRef: p
123
123
  }) {
124
124
  var l, u, c, g;
125
- const { t: v } = C("ui"), [b, h] = z(((l = e.object) == null ? void 0 : l.label) ?? ""), d = j((u = e.object) == null ? void 0 : u.value);
125
+ const { t: v } = C("ui"), [b, h] = W(((l = e.object) == null ? void 0 : l.label) ?? ""), d = j((u = e.object) == null ? void 0 : u.value);
126
126
  K(() => {
127
127
  var m, o, S;
128
128
  ((m = e.object) == null ? void 0 : m.value) !== d.current && (d.current = (o = e.object) == null ? void 0 : o.value, h(((S = e.object) == null ? void 0 : S.label) ?? ""));
@@ -157,6 +157,7 @@ function $({
157
157
  re,
158
158
  {
159
159
  ref: p,
160
+ size: "lg",
160
161
  value: b,
161
162
  onChange: (m) => {
162
163
  h(m), e.object && m !== e.object.label && (d.current = void 0, s({ ...e, object: void 0 }));
@@ -194,8 +195,8 @@ function q({
194
195
  defaultRadiusKm: b = J,
195
196
  reverseGeocode: h
196
197
  }) {
197
- var O, F, E, P;
198
- const { t: d } = C("ui"), [n, f] = z(((O = e.place) == null ? void 0 : O.label) ?? ""), r = j((F = e.place) == null ? void 0 : F.value), l = e.geo ? "granted" : "pristine", [u, c] = z(l);
198
+ var O, z, E, P;
199
+ const { t: d } = C("ui"), [n, f] = W(((O = e.place) == null ? void 0 : O.label) ?? ""), r = j((z = e.place) == null ? void 0 : z.value), l = e.geo ? "granted" : "pristine", [u, c] = W(l);
199
200
  K(() => {
200
201
  var y, x, N;
201
202
  ((y = e.place) == null ? void 0 : y.value) !== r.current && (r.current = (x = e.place) == null ? void 0 : x.value, f(((N = e.place) == null ? void 0 : N.label) ?? ""));
@@ -291,6 +292,7 @@ function q({
291
292
  re,
292
293
  {
293
294
  ref: v,
295
+ size: "lg",
294
296
  value: n,
295
297
  onChange: (y) => {
296
298
  var x, N;
@@ -339,7 +341,7 @@ function U({
339
341
  onChange: s,
340
342
  defaultRadiusKm: t = J
341
343
  }) {
342
- const { t: i } = C("ui"), [p, v] = z(
344
+ const { t: i } = C("ui"), [p, v] = W(
343
345
  () => {
344
346
  var d;
345
347
  return _e(((d = e.geo) == null ? void 0 : d.radiusKm) ?? t);
@@ -561,8 +563,8 @@ function Re({ facets: e, value: s, onChange: t }) {
561
563
  n.key
562
564
  );
563
565
  const u = l ? ` (${r.length})` : "";
564
- return /* @__PURE__ */ w(W.Root, { children: [
565
- /* @__PURE__ */ a(W.Trigger, { asChild: !0, children: /* @__PURE__ */ w(
566
+ return /* @__PURE__ */ w(F.Root, { children: [
567
+ /* @__PURE__ */ a(F.Trigger, { asChild: !0, children: /* @__PURE__ */ w(
566
568
  "button",
567
569
  {
568
570
  type: "button",
@@ -585,8 +587,8 @@ function Re({ facets: e, value: s, onChange: t }) {
585
587
  ]
586
588
  }
587
589
  ) }),
588
- /* @__PURE__ */ a(W.Content, { sideOffset: 8, align: "start", children: n.options.map((c) => /* @__PURE__ */ a(
589
- W.CheckboxItem,
590
+ /* @__PURE__ */ a(F.Content, { sideOffset: 8, align: "start", children: n.options.map((c) => /* @__PURE__ */ a(
591
+ F.CheckboxItem,
590
592
  {
591
593
  checked: r.includes(c.value),
592
594
  onSelect: (g) => {
@@ -1086,7 +1088,7 @@ const Ve = ce(function({
1086
1088
  className: Q,
1087
1089
  ...D
1088
1090
  }, I) {
1089
- const { t: Z } = C("ui"), X = j(null), O = j(null), F = j(null), E = j(!1);
1091
+ const { t: Z } = C("ui"), X = j(null), O = j(null), z = j(null), E = j(!1);
1090
1092
  K(() => {
1091
1093
  if (!E.current && s === "who-where-when") {
1092
1094
  if (l.when !== void 0) {
@@ -1144,7 +1146,7 @@ const Ve = ce(function({
1144
1146
  submitLabel: m,
1145
1147
  allowEmptySubmit: o,
1146
1148
  whoRef: O,
1147
- whereRef: F,
1149
+ whereRef: z,
1148
1150
  cardLabel: N
1149
1151
  }, R = (() => {
1150
1152
  switch (s) {
@@ -1182,4 +1184,4 @@ export {
1182
1184
  Ve as P,
1183
1185
  we as p
1184
1186
  };
1185
- //# sourceMappingURL=patient-search-Dy0sxcwv.js.map
1187
+ //# sourceMappingURL=patient-search-BPjP2__L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patient-search-BPjP2__L.js","sources":["../../node_modules/lucide-react/dist/esm/icons/locate-fixed.mjs","../../src/components/patient-search/patient-search.agent.ts","../../src/components/patient-search/patient-search.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"line\", { x1: \"2\", x2: \"5\", y1: \"12\", y2: \"12\", key: \"bvdh0s\" }],\n [\"line\", { x1: \"19\", x2: \"22\", y1: \"12\", y2: \"12\", key: \"1tbv5k\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"2\", y2: \"5\", key: \"11lu5j\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"19\", y2: \"22\", key: \"x3vr5v\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"7\", key: \"fim9np\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n];\nconst LocateFixed = createLucideIcon(\"locate-fixed\", __iconNode);\n\nexport { __iconNode, LocateFixed as default };\n//# sourceMappingURL=locate-fixed.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — PatientSearch. */\n/* */\n/* PatientSearch is a top-of-funnel widget with four variants that vary */\n/* which search dimensions are exposed. The adapter surfaces the active */\n/* variant + lightweight actions (`reset`, `focus_primary`) so an agent */\n/* can drive the form across surfaces without knowing which variant is */\n/* in play. The selection state itself is owned by the consumer via the */\n/* `value` / `onChange` contract — never read here. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PatientSearchHandle } from './patient-search';\n\nexport const patientSearchAgent: AgentAdapter<PatientSearchHandle> = {\n id: 'patient-search',\n // `filter` is the conceptual capability of this search widget. Building the\n // actual query (WHO/WHERE/WHEN/facets/geo) is host-delegated: selection is\n // owned by the consumer via the `value` / `onChange` contract, so the agent\n // surface here is limited to clearing the query (`reset`) and focusing the\n // primary field. The previous `navigate` / `view_change` capabilities were\n // spurious — the variant is fixed by props (not agent-settable) and no\n // action navigates.\n capabilities: ['filter'],\n state: {\n variant: {\n type: 'string',\n descriptionKey: 'ui.agent.patientSearch.state.variant',\n description:\n 'Active variant — one of `who-where`, `who-where-when`, `faceted`, `discovery`.',\n read: (handle) => handle.getVariant(),\n },\n },\n actions: {\n reset: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.patientSearch.actions.reset',\n description:\n 'Clear the current search query (WHO, WHERE, WHEN, facets, geo) via the consumer-owned onChange.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n focus_primary: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.patientSearch.actions.focusPrimary',\n description:\n 'Move keyboard focus to the most-relevant search field for the current variant.',\n invoke: (handle) => {\n handle.focusPrimary();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'patient-search',\n description: 'Marks the PatientSearch root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n ChevronDown,\n LocateFixed,\n MapPin,\n Search as SearchIcon,\n Stethoscope,\n X,\n} from 'lucide-react';\nimport { Autocomplete } from '../autocomplete/autocomplete';\nimport { Button } from '../button/button';\nimport { Card } from '../card/card';\nimport { Slider } from '../slider/slider';\nimport { Alert } from '../alert/alert';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport type { OptionShape } from '../_shared/option';\nimport { useAgentRegistration } from '../../agent';\nimport { patientSearchAgent } from './patient-search.agent';\n\n/* -------------------------------------------------------------------- */\n/* PatientSearch */\n/* */\n/* Top-of-funnel search primitive with four A/B-testable variants. Each */\n/* variant exposes a different combination of patient decision-making */\n/* dimensions (WHO, WHERE, WHEN, INSURANCE/LANGUAGE, DISCOVERY) so */\n/* consumers can run PostHog-driven funnel experiments without having to */\n/* re-implement the form per surface. */\n/* */\n/* Every variant's WHERE input bakes in a \"use my location\" affordance — */\n/* a `LocateFixed` crosshair button on the inline-end of the field, with */\n/* a radius slider that appears beneath on grant. Geolocation isn't a */\n/* variant of its own; it's a universal WHERE behaviour the kit always */\n/* offers. */\n/* */\n/* Consumers own the data loaders (`loadObjects`, `loadPlaces`, */\n/* `reverseGeocode`, `discoveryCards`) + the routing logic in */\n/* `onSubmit` / `onObjectSelect` / `onPlaceSelect`. The kit owns layout, */\n/* variant gating, accessibility, telemetry, and the shared `SearchValue`*/\n/* contract that every variant feeds into. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\nexport type PatientSearchVariant =\n | 'who-where'\n | 'who-where-when'\n | 'faceted'\n | 'discovery';\n\nexport type WhenFilter = 'today' | 'tomorrow' | 'this_week' | 'anytime';\n\n/** Result from `loadObjects` — a profession, specialty, operator, or practice. */\nexport interface PatientSearchObject {\n /** Stable opaque key, e.g. `\"profession:dentista\"` or `\"operator:mario-rossi-9001\"`. */\n value: string;\n label: string;\n description?: string;\n /** Opaque consumer payload — used in `onObjectSelect` to route. */\n __payload?: unknown;\n}\n\n/** Selected place, geolocation result, or opted-in typed address. */\nexport interface PatientSearchPlace {\n /** Provider value, `geo:<lat>,<lng>`, or `text:<trimmed address>` with `allowTypedPlace`. */\n value: string;\n /** Display label, e.g. `\"Milano, Italia\"`. */\n label: string;\n lat?: number;\n lng?: number;\n}\n\n/** Curated card for the `discovery` variant. */\nexport interface DiscoveryCard {\n id: string;\n label: string;\n description?: string;\n href: string;\n icon?: ReactNode;\n /**\n * Accent token. `auto` rotates through the brand palette by row index.\n * Defaults to `auto`.\n */\n accent?: 'violet' | 'purple' | 'magenta' | 'blue' | 'auto';\n badge?: string;\n}\n\nexport interface FacetOption {\n value: string;\n label: string;\n}\n\nexport interface FacetGroup {\n /** Stable key — e.g. `\"insurance\"`, `\"language\"`. */\n key: string;\n /** Display label, e.g. `\"Convenzione\"`. */\n label: string;\n /** Empty array = boolean toggle chip. Non-empty = dropdown chip. */\n options: FacetOption[];\n /** Whether multiple options can be selected. Default false. */\n multi?: boolean;\n}\n\nexport interface SearchValue {\n object?: PatientSearchObject;\n place?: PatientSearchPlace;\n when?: WhenFilter;\n facets?: Record<string, string[]>;\n geo?: {\n lat: number;\n lng: number;\n radiusKm: number;\n label?: string;\n };\n}\n\n/** Curated imperative handle — used by the agent adapter. */\nexport interface PatientSearchHandle {\n getVariant: () => PatientSearchVariant;\n reset: () => void;\n /** Move focus to the most-relevant field for the current variant. */\n focusPrimary: () => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Telemetry */\n/* */\n/* Mirrors the booking-website convention (`window.track?.(event, p)`). */\n/* Soft-fails outside the browser and when no host has wired `track`. */\n/* -------------------------------------------------------------------- */\n\ninterface TrackFn {\n (event: string, payload?: Record<string, unknown>): void;\n}\n\nfunction track(event: string, payload?: Record<string, unknown>): void {\n if (typeof window === 'undefined') return;\n const fn = (window as unknown as { track?: TrackFn }).track;\n try {\n fn?.(event, payload);\n } catch {\n // Telemetry must never throw into the UI. Swallow.\n }\n}\n\n/* -------------------------------------------------------------------- */\n/* Constants */\n/* -------------------------------------------------------------------- */\n\nconst WHEN_OPTIONS: readonly WhenFilter[] = [\n 'today',\n 'tomorrow',\n 'this_week',\n 'anytime',\n] as const;\n\n/** Discrete radius presets per spec (1 / 5 / 10 / 25 / 50 km). */\nconst RADIUS_PRESETS: readonly number[] = [1, 5, 10, 25, 50] as const;\n\nconst DEFAULT_RADIUS_KM = 5;\n\nconst AUTOCOMPLETE_DEBOUNCE_MS = 200;\n\n/** Maps `defaultRadiusKm` to the nearest preset index. */\nfunction radiusToStepIndex(km: number): number {\n let best = 0;\n let bestDelta = Number.POSITIVE_INFINITY;\n RADIUS_PRESETS.forEach((preset, index) => {\n const delta = Math.abs(preset - km);\n if (delta < bestDelta) {\n bestDelta = delta;\n best = index;\n }\n });\n return best;\n}\n\n/* -------------------------------------------------------------------- */\n/* Root variants */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:text-[var(--foreground)]',\n {\n variants: {\n variant: {\n 'who-where': 'ds:gap-[var(--spacing-md)]',\n 'who-where-when': 'ds:gap-[var(--spacing-md)]',\n faceted: 'ds:gap-[var(--spacing-md)]',\n discovery: 'ds:gap-[var(--spacing-lg)]',\n },\n },\n defaultVariants: { variant: 'who-where' },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Public props */\n/* -------------------------------------------------------------------- */\n\nexport interface PatientSearchProps\n extends\n Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'onChange' | 'onSubmit'\n >,\n VariantProps<typeof rootVariants> {\n variant: PatientSearchVariant;\n\n // Data loaders — consumer-injected; kit calls them debounced.\n loadObjects: (\n query: string,\n ctx: { signal: AbortSignal },\n ) => Promise<PatientSearchObject[]>;\n loadPlaces: (\n query: string,\n ctx: { signal: AbortSignal },\n ) => Promise<PatientSearchPlace[]>;\n\n // Selection callbacks — the consumer decides whether to route.\n onObjectSelect?: (option: PatientSearchObject) => void;\n onPlaceSelect?: (place: PatientSearchPlace) => void;\n\n // Facet config — used by the `faceted` variant; ignored by others.\n facets?: FacetGroup[];\n\n // Geo config — applies to every variant's WHERE input. The crosshair\n // overlay on the inline-end of the input triggers geolocation on click;\n // on success the input fills with the reverse-geocoded label and a\n // radius slider appears beneath. Consumer-supplied `reverseGeocode` is\n // optional — when omitted, `value.geo.label` falls back to the localised\n // \"Vicino a me\" string.\n /** Default radius in km when geolocation is granted. Snaps to the nearest preset. */\n defaultRadiusKm?: number;\n /** Reverse-geocode lat/lng → human label. Optional. */\n reverseGeocode?: (lat: number, lng: number) => Promise<string>;\n\n // Discovery cards — used by the `discovery` variant.\n discoveryCards?: DiscoveryCard[];\n\n /** Forwarded to the consumer's loaders if they want to constrain by country. */\n countryCode?: 'it' | 'de' | string;\n\n // State — controlled.\n value: SearchValue;\n onChange: (next: SearchValue) => void;\n onSubmit: (value: SearchValue) => void | Promise<void>;\n\n // UX\n submitting?: boolean;\n /**\n * Record unselected, trimmed WHERE text in `value.place` as\n * `{ value: 'text:' + typed, label: typed }`, without coordinates.\n * Empty text clears the place. Applies to every variant.\n * @default false\n */\n allowTypedPlace?: boolean;\n /** Custom CTA label override; defaults to `ui.patientSearch.submit.cta`. */\n submitLabel?: string;\n /**\n * @default false\n * By default the kit disables the submit button until at least one\n * search dimension is set (object, place, geo, non-anytime when, or\n * a facet). Set to `true` to allow an empty submit — useful for\n * \"browse all\" patterns where the consumer wants to show all results\n * with no initial filter.\n */\n allowEmptySubmit?: boolean;\n\n // a11y\n 'aria-label'?: string;\n /** Agent-readiness instance id. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* WhoField — Autocomplete over union(profession, specialty, operator, */\n/* practice). */\n/* -------------------------------------------------------------------- */\n\ninterface WhoFieldProps {\n value: SearchValue;\n onChange: (next: SearchValue) => void;\n loadObjects: PatientSearchProps['loadObjects'];\n onObjectSelect?: PatientSearchProps['onObjectSelect'];\n inputRef?: React.Ref<HTMLInputElement>;\n}\n\nfunction WhoField({\n value,\n onChange,\n loadObjects,\n onObjectSelect,\n inputRef,\n}: WhoFieldProps) {\n const { t } = useTranslation('ui');\n\n // The Autocomplete owns its own visible text; the kit only intercepts\n // selection events to update `value.object`. We mirror external resets\n // (consumer clears `value.object` programmatically) into the visible text\n // via the controlled `value` prop, but otherwise let typed input flow\n // through Autocomplete's internal state. The local `query` state breaks\n // the controlled-input cycle: typing fires onChange(next), we store\n // `next` locally, the next render passes that exact string back as\n // `value` — no flicker, no truncation.\n const [query, setQuery] = useState<string>(value.object?.label ?? '');\n const selectedValueRef = useRef<string | undefined>(value.object?.value);\n\n useEffect(() => {\n // Sync external selection changes (e.g. consumer-driven reset) into the\n // visible text. We watch `value.object?.value` rather than `label` so an\n // identity update with the same label doesn't clobber a fresh query.\n if (value.object?.value !== selectedValueRef.current) {\n selectedValueRef.current = value.object?.value;\n setQuery(value.object?.label ?? '');\n }\n }, [value.object?.value, value.object?.label]);\n\n // Adapt consumer's `loadObjects` to Autocomplete's `loadOptions` signature.\n // PatientSearchObject is structurally a superset of OptionShape, so the\n // returned array is safe to pass through as `OptionShape<string>[]`.\n const loadOptions = useCallback(\n async (q: string, { signal }: { signal: AbortSignal; locale: string }) =>\n (await loadObjects(q, { signal })) as OptionShape<string>[],\n [loadObjects],\n );\n\n const handleSelect = (option: OptionShape<string>) => {\n const next: PatientSearchObject = {\n value: option.value,\n label: option.label,\n description: option.description,\n __payload: (option as PatientSearchObject).__payload,\n };\n setQuery(next.label);\n selectedValueRef.current = next.value;\n onChange({ ...value, object: next });\n track('patient_search_object_selected', {\n value: next.value,\n type:\n next.__payload && typeof next.__payload === 'object'\n ? (next.__payload as { type?: string }).type\n : undefined,\n });\n onObjectSelect?.(next);\n };\n\n // Autocomplete's public props don't include `onFocus`, so we capture focus\n // on a wrapping <div> via the bubbling event from the embedded input.\n // `data-component=\"patient-search-field-who\"` lets agents target the\n // wrapper for instrumentation hooks without depending on Autocomplete's\n // internal structure.\n const focusTrackedRef = useRef(false);\n return (\n <div\n data-component=\"patient-search-field\"\n data-field=\"who\"\n onFocus={() => {\n if (focusTrackedRef.current) return;\n focusTrackedRef.current = true;\n track('patient_search_object_focused');\n }}\n onBlur={(e) => {\n // Reset the once-per-mount focus flag only when focus leaves the\n // wrapper entirely (no relatedTarget inside our subtree).\n if (\n e.currentTarget &&\n !e.currentTarget.contains(e.relatedTarget as Node | null)\n ) {\n focusTrackedRef.current = false;\n }\n }}\n >\n {/* Large, the same height as the large search button beside it. */}\n <Autocomplete\n ref={inputRef}\n size=\"lg\"\n value={query}\n onChange={(next) => {\n setQuery(next);\n // User edited the input after selection — drop the structured\n // selection so submit can't reuse stale data.\n if (value.object && next !== value.object.label) {\n selectedValueRef.current = undefined;\n onChange({ ...value, object: undefined });\n }\n }}\n onSelect={handleSelect}\n loadOptions={loadOptions}\n debounceMs={AUTOCOMPLETE_DEBOUNCE_MS}\n placeholder={t('patientSearch.who.placeholder')}\n aria-label={t('patientSearch.who.label')}\n startAdornment={<SearchIcon aria-hidden=\"true\" />}\n />\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* WhereField — Autocomplete over the consumer's places provider. */\n/* -------------------------------------------------------------------- */\n\ninterface WhereFieldProps {\n value: SearchValue;\n onChange: (next: SearchValue) => void;\n loadPlaces: PatientSearchProps['loadPlaces'];\n onPlaceSelect?: PatientSearchProps['onPlaceSelect'];\n allowTypedPlace?: boolean;\n inputRef?: React.Ref<HTMLInputElement>;\n /**\n * Default radius (km) applied on a successful geolocate. Snaps to the\n * nearest preset (1 / 5 / 10 / 25 / 50). Defaults to 5 km.\n */\n defaultRadiusKm?: number;\n /** Reverse-geocode lat/lng → human label. Optional. */\n reverseGeocode?: PatientSearchProps['reverseGeocode'];\n}\n\ntype GeoStatus = 'pristine' | 'requesting' | 'granted' | 'denied';\n\nconst geoTriggerClasses = [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:size-8 ds:rounded-[var(--radius-sm)]',\n 'ds:text-[color:var(--muted-foreground)] ds:hover:text-[color:var(--primary)]',\n 'ds:hover:bg-[color-mix(in_srgb,var(--primary)_8%,transparent)]',\n 'ds:aria-pressed:text-[color:var(--primary)]',\n 'ds:aria-pressed:bg-[color-mix(in_srgb,var(--primary)_12%,transparent)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\n/**\n * Unified WHERE input — every variant uses it.\n *\n * Layout per state:\n * - pristine: `[MapPin] City... [LocateFixed]`\n * - granted : `[MapPin] Milano, Italia [X] [LocateFixed]` + radius slider beneath\n * - denied : `[MapPin] City... ` + Alert beneath\n *\n * The MapPin on the inline-start is the conventional \"this is a location\n * field\" marker. The LocateFixed crosshair on the inline-end is the\n * geolocate trigger — these are deliberately different glyphs (Doctolib /\n * Google Maps / Booking pattern) so users don't conflate the field marker\n * with the action.\n */\nfunction WhereField({\n value,\n onChange,\n loadPlaces,\n onPlaceSelect,\n allowTypedPlace,\n inputRef,\n defaultRadiusKm = DEFAULT_RADIUS_KM,\n reverseGeocode,\n}: WhereFieldProps) {\n const { t } = useTranslation('ui');\n const [query, setQuery] = useState<string>(value.place?.label ?? '');\n const selectedValueRef = useRef<string | undefined>(value.place?.value);\n const initialStatus: GeoStatus = value.geo ? 'granted' : 'pristine';\n const [status, setStatus] = useState<GeoStatus>(initialStatus);\n\n useEffect(() => {\n if (value.place?.value !== selectedValueRef.current) {\n selectedValueRef.current = value.place?.value;\n setQuery(value.place?.label ?? '');\n }\n }, [value.place?.value, value.place?.label]);\n\n const loadOptions = useCallback(\n async (q: string, { signal }: { signal: AbortSignal; locale: string }) =>\n (await loadPlaces(q, { signal })) as OptionShape<string>[],\n [loadPlaces],\n );\n\n const handleSelect = (option: OptionShape<string>) => {\n const place: PatientSearchPlace = {\n value: option.value,\n label: option.label,\n lat: (option as PatientSearchPlace).lat,\n lng: (option as PatientSearchPlace).lng,\n };\n setQuery(place.label);\n selectedValueRef.current = place.value;\n // Typing or selecting a city through the autocomplete cancels any\n // active geolocate — the consumer's search API should now run plain\n // text search rather than lat/lng-radius.\n onChange({ ...value, place, geo: undefined });\n if (status === 'granted') setStatus('pristine');\n track('patient_search_place_selected', { value: place.value });\n onPlaceSelect?.(place);\n };\n\n const requestLocation = () => {\n if (typeof window === 'undefined' || !navigator?.geolocation) {\n setStatus('denied');\n track('patient_search_geo_denied', { reason: 'unsupported' });\n return;\n }\n setStatus('requesting');\n track('patient_search_place_focused');\n navigator.geolocation.getCurrentPosition(\n async (position) => {\n const { latitude, longitude } = position.coords;\n let label: string | undefined;\n try {\n label = await reverseGeocode?.(latitude, longitude);\n } catch {\n label = undefined;\n }\n const km = defaultRadiusKm;\n const resolvedLabel = label ?? t('patientSearch.geo.fallbackLabel');\n // Mirror the geo label into `value.place` so the visible input\n // shows the reverse-geocoded text. `value.geo` carries the\n // structured lat/lng/radius the consumer's search API actually\n // needs. The synthetic place carries a `geo:` value prefix so\n // the consumer can distinguish a geo-derived place from a\n // user-selected Google Places entry.\n const syntheticPlace: PatientSearchPlace = {\n value: `geo:${latitude.toFixed(4)},${longitude.toFixed(4)}`,\n label: resolvedLabel,\n lat: latitude,\n lng: longitude,\n };\n onChange({\n ...value,\n place: syntheticPlace,\n geo: {\n lat: latitude,\n lng: longitude,\n radiusKm: km,\n label: resolvedLabel,\n },\n });\n setStatus('granted');\n track('patient_search_geo_granted', { radiusKm: km });\n },\n () => {\n setStatus('denied');\n track('patient_search_geo_denied', { reason: 'user' });\n },\n { enableHighAccuracy: false, maximumAge: 60_000, timeout: 10_000 },\n );\n };\n\n const clearGeo = () => {\n onChange({ ...value, geo: undefined, place: undefined });\n setQuery('');\n selectedValueRef.current = undefined;\n setStatus('pristine');\n };\n\n const isGranted = status === 'granted' && Boolean(value.geo);\n const isRequesting = status === 'requesting';\n const isDenied = status === 'denied';\n\n const focusTrackedRef = useRef(false);\n // Overlay button(s) that sit visually inside the inline-end of the\n // input. Rendered as siblings of the Autocomplete (not inside the\n // `endAdornment` slot, which the kit wraps in `aria-hidden` and so\n // cannot host an interactive trigger). The decorative spacer in\n // `endAdornment` carves out room so typed text doesn't run under\n // the overlay.\n // Gate the geo-assist UI on the consumer wiring `reverseGeocode`.\n // Without it, clicking \"Vicino a me\" would set value.geo to lat/lng\n // coordinates the kit can't translate into a human-readable label —\n // the patient sees coordinates or nothing. Presence of the dep\n // implies intent.\n const geoEnabled = Boolean(reverseGeocode);\n const overlay =\n isDenied || !geoEnabled ? null : (\n <span className=\"ds:absolute ds:end-[var(--spacing-xs)] ds:top-1/2 ds:-translate-y-1/2 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {isGranted ? (\n <button\n type=\"button\"\n aria-label={t('patientSearch.geo.clear')}\n onClick={clearGeo}\n className={geoTriggerClasses}\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : null}\n <button\n type=\"button\"\n aria-label={t('patientSearch.geo.cta')}\n aria-pressed={isGranted || undefined}\n disabled={isRequesting}\n onClick={isGranted ? clearGeo : requestLocation}\n className={geoTriggerClasses}\n >\n {/*\n The geo trigger uses `LocateFixed` (target-with-dot crosshair)\n rather than `MapPin`. The WHERE input's start-adornment is the\n `MapPin` (\"this is a location field\"); reusing the pin glyph\n here would visually conflate the field marker with the action.\n Crosshair = \"centre on me\" — Doctolib / Google Maps / Booking\n all use this distinction.\n */}\n <LocateFixed aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n </span>\n );\n\n return (\n <div\n data-component=\"patient-search-field\"\n data-field=\"where\"\n onFocus={() => {\n if (focusTrackedRef.current) return;\n focusTrackedRef.current = true;\n track('patient_search_place_focused');\n }}\n onBlur={(e) => {\n if (\n e.currentTarget &&\n !e.currentTarget.contains(e.relatedTarget as Node | null)\n ) {\n focusTrackedRef.current = false;\n }\n }}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <div className=\"ds:relative\">\n {/* Large, the same height as the large search button beside it. */}\n <Autocomplete\n ref={inputRef}\n size=\"lg\"\n value={query}\n onChange={(next) => {\n setQuery(next);\n if (\n (allowTypedPlace || value.place) &&\n next !== value.place?.label\n ) {\n const typed = next.trim();\n const place =\n allowTypedPlace && typed\n ? { value: `text:${typed}`, label: typed }\n : undefined;\n // Recognise our own controlled-state update so the sync effect\n // preserves the raw input, including spaces between words.\n selectedValueRef.current = place?.value;\n // Skip a no-op update (a trailing space, or spaces typed with no\n // place yet) so hosts that search on change are not re-triggered.\n if (place?.value === value.place?.value && !value.geo) return;\n // Manual edit cancels any active geolocate too — the typed\n // text owns the field now.\n onChange({ ...value, place, geo: undefined });\n if (status === 'granted') setStatus('pristine');\n }\n }}\n onSelect={handleSelect}\n loadOptions={loadOptions}\n debounceMs={AUTOCOMPLETE_DEBOUNCE_MS}\n placeholder={t('patientSearch.where.placeholder')}\n aria-label={t('patientSearch.where.label')}\n startAdornment={<MapPin aria-hidden=\"true\" />}\n endAdornment={\n isDenied ? undefined : (\n // Decorative spacer — reserves inline-end room so the typed\n // text doesn't run under the absolutely-positioned overlay.\n // Autocomplete wraps endAdornment in `aria-hidden`, which is\n // correct for this empty span. Granted-state shows an extra\n // clear-X chip, so the spacer doubles in width when granted.\n <span\n aria-hidden=\"true\"\n className={\n isGranted\n ? 'ds:inline-block ds:size-[4.5rem]'\n : 'ds:inline-block ds:size-8'\n }\n />\n )\n }\n />\n {overlay}\n </div>\n {isDenied ? (\n // Alert defaults to `role=\"status\"` + `aria-live=\"polite\"` for the\n // `info` variant — the user hears why the field reverted to plain\n // text when their browser blocked the geolocation prompt.\n <Alert variant=\"info\">\n <Alert.Description>{t('patientSearch.geo.denied')}</Alert.Description>\n </Alert>\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* GeoRadiusBar — full-width radius slider rendered beneath the top */\n/* row when geo-assist is active. Lifted out of `WhereField` so the */\n/* WHO/WHERE/Submit row stays at single-row height when the slider is */\n/* visible (release notes 0.30.2 — see `ds-kit-followup-from-0.30.0`). */\n/* -------------------------------------------------------------------- */\n\ninterface GeoRadiusBarProps {\n value: SearchValue;\n onChange: (next: SearchValue) => void;\n defaultRadiusKm?: number;\n}\n\nfunction GeoRadiusBar({\n value,\n onChange,\n defaultRadiusKm = DEFAULT_RADIUS_KM,\n}: GeoRadiusBarProps) {\n const { t } = useTranslation('ui');\n const [radiusIndex, setRadiusIndex] = useState<number>(() =>\n radiusToStepIndex(value.geo?.radiusKm ?? defaultRadiusKm),\n );\n if (!value.geo) return null;\n const commitRadius = (index: number) => {\n const km = RADIUS_PRESETS[index] ?? defaultRadiusKm;\n onChange({ ...value, geo: { ...value.geo!, radiusKm: km } });\n track('patient_search_radius_changed', { radiusKm: km });\n };\n const formatRadius = (n: number) => {\n const km = RADIUS_PRESETS[Math.round(n)] ?? defaultRadiusKm;\n return t('patientSearch.geo.radiusFormat', { km });\n };\n return (\n <div\n data-component=\"patient-search-geo-radius-bar\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-md)]\"\n >\n <span\n id=\"patient-search-radius-label\"\n className=\"type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {t('patientSearch.geo.radius')}\n </span>\n <Slider\n value={[radiusIndex]}\n min={0}\n max={RADIUS_PRESETS.length - 1}\n step={1}\n marks={RADIUS_PRESETS.map((km, index) => ({\n value: index,\n label: `${km}`,\n }))}\n formatValue={formatRadius}\n alwaysShowValue\n aria-labelledby=\"patient-search-radius-label\"\n onValueChange={(next) => setRadiusIndex(next[0] ?? 0)}\n onValueCommit={(next) => commitRadius(next[0] ?? 0)}\n />\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* WhenChipStrip — radiogroup of {today, tomorrow, this_week, anytime} */\n/* */\n/* Hand-rolled radiogroup: `role=\"radiogroup\"` on the container, button */\n/* children carry `role=\"radio\"` + `aria-checked`, arrow-key navigation */\n/* moves focus + selection. Visually presents as suggestion-style chips. */\n/* -------------------------------------------------------------------- */\n\nconst whenChipVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)]',\n 'type-label ds:font-[var(--font-weight-medium)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n state: {\n idle: 'ds:bg-[var(--secondary)] ds:text-[var(--foreground)] ds:border ds:border-[color:var(--border)] ds:hover:bg-[color-mix(in_srgb,var(--primary)_8%,var(--secondary))]',\n selected:\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)] ds:border ds:border-transparent ds:font-[var(--font-weight-semibold)]',\n },\n },\n defaultVariants: { state: 'idle' },\n },\n);\n\ninterface WhenChipStripProps {\n value?: WhenFilter;\n onChange: (next: WhenFilter) => void;\n}\n\nfunction WhenChipStrip({ value, onChange }: WhenChipStripProps) {\n const { t, i18n } = useTranslation('ui');\n const groupId = useId();\n const isRTL = i18n.dir() === 'rtl';\n\n const buttonRefs = useRef<Map<WhenFilter, HTMLButtonElement>>(new Map());\n\n const focusAt = useCallback((opt: WhenFilter) => {\n buttonRefs.current.get(opt)?.focus();\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, current: WhenFilter) => {\n const idx = WHEN_OPTIONS.indexOf(current);\n const total = WHEN_OPTIONS.length;\n const forwardKey = isRTL ? 'ArrowLeft' : 'ArrowRight';\n const backwardKey = isRTL ? 'ArrowRight' : 'ArrowLeft';\n switch (event.key) {\n case forwardKey:\n case 'ArrowDown': {\n event.preventDefault();\n const next = WHEN_OPTIONS[(idx + 1) % total];\n onChange(next);\n track('patient_search_when_selected', { when: next });\n focusAt(next);\n break;\n }\n case backwardKey:\n case 'ArrowUp': {\n event.preventDefault();\n const next = WHEN_OPTIONS[(idx - 1 + total) % total];\n onChange(next);\n track('patient_search_when_selected', { when: next });\n focusAt(next);\n break;\n }\n case 'Home': {\n event.preventDefault();\n const next = WHEN_OPTIONS[0];\n onChange(next);\n track('patient_search_when_selected', { when: next });\n focusAt(next);\n break;\n }\n case 'End': {\n event.preventDefault();\n const next = WHEN_OPTIONS[total - 1];\n onChange(next);\n track('patient_search_when_selected', { when: next });\n focusAt(next);\n break;\n }\n default:\n break;\n }\n },\n [focusAt, isRTL, onChange],\n );\n\n // Roving tabindex — the selected option (or `anytime` fallback) is the only\n // tab stop. Matches the WAI-ARIA radiogroup pattern.\n const rovingOption: WhenFilter = value ?? 'anytime';\n\n const labelKeyFor: Record<WhenFilter, string> = {\n today: 'patientSearch.when.today',\n tomorrow: 'patientSearch.when.tomorrow',\n this_week: 'patientSearch.when.thisWeek',\n anytime: 'patientSearch.when.anytime',\n };\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={t('patientSearch.when.label')}\n id={groupId}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {WHEN_OPTIONS.map((opt) => {\n const isSelected = value === opt;\n const isRoving = rovingOption === opt;\n const label = t(labelKeyFor[opt]);\n return (\n <button\n key={opt}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n aria-label={label}\n tabIndex={isRoving ? 0 : -1}\n ref={(node) => {\n if (node) buttonRefs.current.set(opt, node);\n else buttonRefs.current.delete(opt);\n }}\n onClick={() => {\n onChange(opt);\n track('patient_search_when_selected', { when: opt });\n }}\n onKeyDown={(e) => handleKeyDown(e, opt)}\n className={whenChipVariants({\n state: isSelected ? 'selected' : 'idle',\n })}\n >\n {label}\n </button>\n );\n })}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* FacetChipRow — faceted variant. One chip per FacetGroup. */\n/* -------------------------------------------------------------------- */\n\nconst facetChipVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)]',\n 'type-label',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n // Matches the WHEN chip strip's `selected` look — solid primary fill,\n // primary-foreground text, transparent border. The earlier\n // `color-mix(primary 12% / secondary)` tint read as a washed-out\n // colour over the grey input row and didn't visually signal \"this\n // filter is active\" with enough weight. Solid fill matches the kit's\n // toggle-button precedent (SuggestionChip's `suggestion` intent + the\n // ServiceGrid radio's selected state in Booking).\n state: {\n idle: 'ds:bg-[var(--secondary)] ds:text-[var(--foreground)] ds:border ds:border-[color:var(--border)] ds:hover:bg-[color-mix(in_srgb,var(--primary)_8%,var(--secondary))]',\n active:\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)] ds:border ds:border-transparent ds:font-[var(--font-weight-semibold)]',\n },\n },\n defaultVariants: { state: 'idle' },\n },\n);\n\ninterface FacetChipRowProps {\n facets: FacetGroup[];\n value: SearchValue['facets'];\n onChange: (next: Record<string, string[]>) => void;\n}\n\nfunction FacetChipRow({ facets, value, onChange }: FacetChipRowProps) {\n const { t } = useTranslation('ui');\n // `selections` is memoised because `value ?? {}` allocates a fresh `{}`\n // whenever the consumer passes `undefined`, which would otherwise invalidate\n // every downstream useMemo / useCallback that depends on it.\n const selections = useMemo(() => value ?? {}, [value]);\n\n const hasAnyActive = useMemo(\n () => Object.values(selections).some((arr) => arr && arr.length > 0),\n [selections],\n );\n\n const updateFacet = (key: string, values: string[]) => {\n const next = { ...selections };\n if (values.length === 0) delete next[key];\n else next[key] = values;\n onChange(next);\n track('patient_search_facet_changed', { key, values });\n };\n\n const toggleBoolean = (key: string) => {\n const isActive = (selections[key]?.length ?? 0) > 0;\n updateFacet(key, isActive ? [] : ['true']);\n };\n\n const toggleOption = (group: FacetGroup, option: string) => {\n const current = selections[group.key] ?? [];\n const active = current.includes(option);\n let next: string[];\n if (group.multi) {\n next = active\n ? current.filter((v) => v !== option)\n : [...current, option];\n } else {\n next = active ? [] : [option];\n }\n updateFacet(group.key, next);\n };\n\n return (\n <div\n role=\"group\"\n aria-label={t('patientSearch.facets.label')}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {facets.map((group) => {\n const isBoolean = group.options.length === 0;\n const current = selections[group.key] ?? [];\n const isActive = current.length > 0;\n\n if (isBoolean) {\n return (\n <button\n key={group.key}\n type=\"button\"\n aria-pressed={isActive}\n aria-label={group.label}\n onClick={() => toggleBoolean(group.key)}\n className={facetChipVariants({\n state: isActive ? 'active' : 'idle',\n })}\n >\n <span>{group.label}</span>\n </button>\n );\n }\n\n const countSuffix = isActive ? ` (${current.length})` : '';\n\n return (\n <DropdownMenu.Root key={group.key}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n aria-label={`${group.label}${countSuffix}`}\n className={facetChipVariants({\n state: isActive ? 'active' : 'idle',\n })}\n >\n <span>\n {group.label}\n {countSuffix}\n </span>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:shrink-0\"\n />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content sideOffset={8} align=\"start\">\n {group.options.map((option) => (\n <DropdownMenu.CheckboxItem\n key={option.value}\n checked={current.includes(option.value)}\n onSelect={(event) => {\n // Keep the menu open for multi-select facets so the user\n // can tick multiple boxes without re-opening.\n if (group.multi) event.preventDefault();\n toggleOption(group, option.value);\n }}\n >\n {option.label}\n </DropdownMenu.CheckboxItem>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n })}\n {hasAnyActive ? (\n <button\n type=\"button\"\n onClick={() => {\n onChange({});\n track('patient_search_facet_changed', { key: '*', values: [] });\n }}\n className={[\n 'ds:ms-[var(--spacing-xs)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'type-label ds:text-[color:var(--muted-foreground)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:hover:text-[color:var(--foreground)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' ')}\n >\n <X aria-hidden=\"true\" className=\"ds:size-3.5\" />\n {t('patientSearch.facets.clear')}\n </button>\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* DiscoveryGrid — responsive grid of curated cards. */\n/* -------------------------------------------------------------------- */\n\nconst WHEEL_ACCENTS = ['violet', 'purple', 'magenta', 'blue'] as const;\ntype WheelAccent = (typeof WHEEL_ACCENTS)[number];\n\nconst discoveryCardVariants = cva(\n [\n 'ds:relative ds:flex ds:h-full ds:flex-col ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-lg)] ds:overflow-hidden',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n 'ds:bg-[var(--card)] ds:text-[var(--card-foreground)]',\n 'ds:border ds:border-[color:var(--card-border)]',\n 'ds:shadow-[var(--shadow-sm)]',\n 'ds:transition-[transform,box-shadow] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:motion-safe:hover:-translate-y-0.5',\n 'ds:hover:shadow-[var(--shadow-md)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:no-underline',\n ].join(' '),\n);\n\nconst accentStripVariants = cva(\n // `inset-x-0` compiles to logical `inset-inline`; the `inset-inline-0`\n // spelling is not a Tailwind utility and compiled to nothing.\n 'ds:absolute ds:inset-x-0 ds:top-0 ds:h-[3px] ds:pointer-events-none',\n {\n variants: {\n accent: {\n violet: 'ds:bg-[var(--color-violet-500)]',\n purple: 'ds:bg-[var(--color-purple-500)]',\n magenta: 'ds:bg-[var(--color-magenta-500)]',\n blue: 'ds:bg-[var(--color-blue-500)]',\n },\n },\n defaultVariants: { accent: 'violet' },\n },\n);\n\nconst iconChipVariants = cva(\n 'ds:inline-flex ds:size-9 ds:items-center ds:justify-center ds:rounded-[var(--radius-md)]',\n {\n variants: {\n accent: {\n violet:\n 'ds:bg-[color-mix(in_srgb,var(--color-violet-500)_12%,var(--background))] ds:text-[var(--color-violet-700)]',\n purple:\n 'ds:bg-[color-mix(in_srgb,var(--color-purple-500)_12%,var(--background))] ds:text-[var(--color-purple-700)]',\n magenta:\n 'ds:bg-[color-mix(in_srgb,var(--color-magenta-500)_12%,var(--background))] ds:text-[var(--color-magenta-700)]',\n blue: 'ds:bg-[color-mix(in_srgb,var(--color-blue-500)_12%,var(--background))] ds:text-[var(--color-blue-700)]',\n },\n },\n defaultVariants: { accent: 'violet' },\n },\n);\n\nfunction resolveAccent(\n cardAccent: DiscoveryCard['accent'] | undefined,\n index: number,\n): WheelAccent {\n if (cardAccent && cardAccent !== 'auto') return cardAccent;\n return WHEEL_ACCENTS[index % WHEEL_ACCENTS.length];\n}\n\ninterface DiscoveryGridProps {\n cards: DiscoveryCard[];\n}\n\nfunction DiscoveryGrid({ cards }: DiscoveryGridProps) {\n const { t } = useTranslation('ui');\n\n if (cards.length === 0) {\n return (\n <p className=\"type-body-sm ds:text-[color:var(--muted-foreground)] ds:m-0\">\n {t('patientSearch.discovery.empty')}\n </p>\n );\n }\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <h3 className=\"type-title-card ds:text-[var(--foreground)] ds:m-0\">\n {t('patientSearch.discovery.heading')}\n </h3>\n <ul\n className={[\n 'ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)]',\n 'ds:md:grid-cols-2 ds:lg:grid-cols-3',\n 'ds:m-0 ds:p-0 ds:list-none',\n ].join(' ')}\n >\n {cards.map((card, index) => {\n const accent = resolveAccent(card.accent, index);\n return (\n <li key={card.id}>\n <a\n href={card.href}\n data-component=\"patient-search-card\"\n data-card-id={card.id}\n aria-label={\n card.description\n ? `${card.label} — ${card.description}`\n : card.label\n }\n onClick={() =>\n track('patient_search_discovery_card_clicked', {\n cardId: card.id,\n })\n }\n className={discoveryCardVariants()}\n >\n <span\n aria-hidden=\"true\"\n className={accentStripVariants({ accent })}\n />\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n aria-hidden=\"true\"\n className={iconChipVariants({ accent })}\n >\n {card.icon ?? (\n <Stethoscope className=\"ds:size-4\" aria-hidden=\"true\" />\n )}\n </span>\n {card.badge ? (\n // The badge sits inside a softly-tinted accent bubble\n // (15% accent + 85% background). The text colour must\n // contrast with that mix, not with the accent's canonical\n // foreground — `--accent-foreground` is calibrated against\n // the 100% accent surface and fails AA on the 15% tint.\n // Use `--foreground` which contrasts with the\n // mostly-background mix in both light and dark themes.\n <span className=\"type-meta ds:ms-auto ds:inline-flex ds:items-center ds:rounded-[var(--radius-full)] ds:border ds:border-[color:var(--foreground)] ds:bg-[color-mix(in_srgb,var(--accent)_15%,var(--background))] ds:text-[color:var(--foreground)] ds:font-[var(--font-weight-semibold)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]\">\n {card.badge}\n </span>\n ) : null}\n </span>\n <span className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\">\n {card.label}\n </span>\n {card.description ? (\n <span className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {card.description}\n </span>\n ) : null}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* SubmitButton — shared CTA. Disabled only when every dimension is unset. */\n/* -------------------------------------------------------------------- */\n\ninterface SubmitButtonProps {\n value: SearchValue;\n variant: PatientSearchVariant;\n submitting?: boolean;\n submitLabel?: string;\n allowEmptySubmit?: boolean;\n onSubmit: (value: SearchValue) => void | Promise<void>;\n}\n\nfunction hasAnyDimension(value: SearchValue): boolean {\n if (value.object) return true;\n if (value.place) return true;\n if (value.geo) return true;\n if (value.when && value.when !== 'anytime') return true;\n if (value.facets) {\n for (const arr of Object.values(value.facets)) {\n if (arr && arr.length > 0) return true;\n }\n }\n return false;\n}\n\nfunction SubmitButton({\n value,\n variant,\n submitting,\n submitLabel,\n allowEmptySubmit,\n onSubmit,\n}: SubmitButtonProps) {\n const { t } = useTranslation('ui');\n // While submitting, `loading` blocks it and keeps focus on it.\n const disabled = !submitting && !allowEmptySubmit && !hasAnyDimension(value);\n const label = submitLabel ?? t('patientSearch.submit.cta');\n return (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"lg\"\n startIcon={<SearchIcon aria-hidden=\"true\" />}\n loading={submitting}\n disabled={disabled}\n onClick={() => {\n track('patient_search_submitted', {\n variant,\n hasObject: Boolean(value.object),\n hasPlace: Boolean(value.place),\n hasGeo: Boolean(value.geo),\n when: value.when,\n facetKeys: value.facets ? Object.keys(value.facets) : [],\n });\n void onSubmit(value);\n }}\n >\n {label}\n </Button>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Variant body props */\n/* -------------------------------------------------------------------- */\n\ninterface VariantBodyProps {\n variant: PatientSearchVariant;\n value: SearchValue;\n onChange: (next: SearchValue) => void;\n onSubmit: PatientSearchProps['onSubmit'];\n loadObjects: PatientSearchProps['loadObjects'];\n loadPlaces: PatientSearchProps['loadPlaces'];\n onObjectSelect?: PatientSearchProps['onObjectSelect'];\n onPlaceSelect?: PatientSearchProps['onPlaceSelect'];\n allowTypedPlace?: boolean;\n facets?: FacetGroup[];\n defaultRadiusKm: number;\n reverseGeocode?: PatientSearchProps['reverseGeocode'];\n discoveryCards: DiscoveryCard[];\n submitting?: boolean;\n submitLabel?: string;\n allowEmptySubmit?: boolean;\n whoRef: React.RefObject<HTMLInputElement | null>;\n whereRef: React.RefObject<HTMLInputElement | null>;\n /**\n * Accessible name applied to the inner `<Card>` so its underlying\n * `<article>` landmark isn't unnamed when nested inside the\n * `role=\"region\"` root. Without this every variant produces an\n * unnamed article — a `landmark-unique` axe hazard once a consumer\n * page renders adjacent articles. Resolved once at the root with\n * `t('patientSearch.regionLabel')` and threaded through so the\n * variant bodies don't each have to call `useTranslation('ui')`.\n */\n cardLabel: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* WhoWhereBody — baseline variant. WHO + WHERE + submit. */\n/* -------------------------------------------------------------------- */\n\nfunction WhoWhereBody(props: VariantBodyProps) {\n const {\n variant,\n value,\n onChange,\n onSubmit,\n loadObjects,\n loadPlaces,\n onObjectSelect,\n onPlaceSelect,\n allowTypedPlace,\n submitting,\n submitLabel,\n allowEmptySubmit,\n whoRef,\n whereRef,\n defaultRadiusKm,\n reverseGeocode,\n cardLabel,\n } = props;\n return (\n <Card variant=\"elevated\" aria-label={cardLabel}>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:md:flex-row ds:md:items-start\">\n <div className=\"ds:flex-1 ds:min-w-0\">\n <WhoField\n value={value}\n onChange={onChange}\n loadObjects={loadObjects}\n onObjectSelect={onObjectSelect}\n inputRef={whoRef}\n />\n </div>\n <div className=\"ds:flex-1 ds:min-w-0\">\n <WhereField\n value={value}\n onChange={onChange}\n loadPlaces={loadPlaces}\n onPlaceSelect={onPlaceSelect}\n allowTypedPlace={allowTypedPlace}\n defaultRadiusKm={defaultRadiusKm}\n reverseGeocode={reverseGeocode}\n inputRef={whereRef}\n />\n </div>\n <SubmitButton\n value={value}\n variant={variant}\n submitting={submitting}\n submitLabel={submitLabel}\n allowEmptySubmit={allowEmptySubmit}\n onSubmit={onSubmit}\n />\n </div>\n <GeoRadiusBar\n value={value}\n onChange={onChange}\n defaultRadiusKm={defaultRadiusKm}\n />\n </div>\n </Card>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* WhoWhereWhenBody — WHO + WHERE + submit + WHEN chip strip below. */\n/* -------------------------------------------------------------------- */\n\nfunction WhoWhereWhenBody(props: VariantBodyProps) {\n const {\n variant,\n value,\n onChange,\n onSubmit,\n loadObjects,\n loadPlaces,\n onObjectSelect,\n onPlaceSelect,\n allowTypedPlace,\n submitting,\n submitLabel,\n allowEmptySubmit,\n whoRef,\n whereRef,\n defaultRadiusKm,\n reverseGeocode,\n cardLabel,\n } = props;\n return (\n <Card variant=\"elevated\" aria-label={cardLabel}>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:md:flex-row ds:md:items-start\">\n <div className=\"ds:flex-1 ds:min-w-0\">\n <WhoField\n value={value}\n onChange={onChange}\n loadObjects={loadObjects}\n onObjectSelect={onObjectSelect}\n inputRef={whoRef}\n />\n </div>\n <div className=\"ds:flex-1 ds:min-w-0\">\n <WhereField\n value={value}\n onChange={onChange}\n loadPlaces={loadPlaces}\n onPlaceSelect={onPlaceSelect}\n allowTypedPlace={allowTypedPlace}\n defaultRadiusKm={defaultRadiusKm}\n reverseGeocode={reverseGeocode}\n inputRef={whereRef}\n />\n </div>\n <SubmitButton\n value={value}\n variant={variant}\n submitting={submitting}\n submitLabel={submitLabel}\n allowEmptySubmit={allowEmptySubmit}\n onSubmit={onSubmit}\n />\n </div>\n <GeoRadiusBar\n value={value}\n onChange={onChange}\n defaultRadiusKm={defaultRadiusKm}\n />\n <WhenChipStrip\n value={value.when}\n onChange={(next) => onChange({ ...value, when: next })}\n />\n </div>\n </Card>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* FacetedBody — WHO + WHERE + submit + facet chip row below. */\n/* -------------------------------------------------------------------- */\n\nfunction FacetedBody(props: VariantBodyProps) {\n const {\n variant,\n value,\n onChange,\n onSubmit,\n loadObjects,\n loadPlaces,\n onObjectSelect,\n onPlaceSelect,\n allowTypedPlace,\n facets,\n submitting,\n submitLabel,\n allowEmptySubmit,\n whoRef,\n whereRef,\n defaultRadiusKm,\n reverseGeocode,\n cardLabel,\n } = props;\n return (\n <Card variant=\"elevated\" aria-label={cardLabel}>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:md:flex-row ds:md:items-start\">\n <div className=\"ds:flex-1 ds:min-w-0\">\n <WhoField\n value={value}\n onChange={onChange}\n loadObjects={loadObjects}\n onObjectSelect={onObjectSelect}\n inputRef={whoRef}\n />\n </div>\n <div className=\"ds:flex-1 ds:min-w-0\">\n <WhereField\n value={value}\n onChange={onChange}\n loadPlaces={loadPlaces}\n onPlaceSelect={onPlaceSelect}\n allowTypedPlace={allowTypedPlace}\n defaultRadiusKm={defaultRadiusKm}\n reverseGeocode={reverseGeocode}\n inputRef={whereRef}\n />\n </div>\n <SubmitButton\n value={value}\n variant={variant}\n submitting={submitting}\n submitLabel={submitLabel}\n allowEmptySubmit={allowEmptySubmit}\n onSubmit={onSubmit}\n />\n </div>\n <GeoRadiusBar\n value={value}\n onChange={onChange}\n defaultRadiusKm={defaultRadiusKm}\n />\n {facets && facets.length > 0 ? (\n <FacetChipRow\n facets={facets}\n value={value.facets}\n onChange={(next) => onChange({ ...value, facets: next })}\n />\n ) : null}\n </div>\n </Card>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* DiscoveryBody — hero search + card grid. */\n/* -------------------------------------------------------------------- */\n\nfunction DiscoveryBody(props: VariantBodyProps) {\n const {\n variant,\n value,\n onChange,\n onSubmit,\n loadObjects,\n loadPlaces,\n onObjectSelect,\n onPlaceSelect,\n allowTypedPlace,\n discoveryCards,\n submitting,\n submitLabel,\n allowEmptySubmit,\n whoRef,\n whereRef,\n defaultRadiusKm,\n reverseGeocode,\n cardLabel,\n } = props;\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <Card variant=\"elevated\" aria-label={cardLabel}>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-md)] ds:md:flex-row ds:md:items-stretch\">\n <div className=\"ds:flex-1 ds:min-w-0\">\n <WhoField\n value={value}\n onChange={onChange}\n loadObjects={loadObjects}\n onObjectSelect={onObjectSelect}\n inputRef={whoRef}\n />\n </div>\n <div className=\"ds:flex-1 ds:min-w-0\">\n <WhereField\n value={value}\n onChange={onChange}\n loadPlaces={loadPlaces}\n onPlaceSelect={onPlaceSelect}\n allowTypedPlace={allowTypedPlace}\n defaultRadiusKm={defaultRadiusKm}\n reverseGeocode={reverseGeocode}\n inputRef={whereRef}\n />\n </div>\n <SubmitButton\n value={value}\n variant={variant}\n submitting={submitting}\n submitLabel={submitLabel}\n allowEmptySubmit={allowEmptySubmit}\n onSubmit={onSubmit}\n />\n </div>\n <GeoRadiusBar\n value={value}\n onChange={onChange}\n defaultRadiusKm={defaultRadiusKm}\n />\n </Card>\n <DiscoveryGrid cards={discoveryCards} />\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* PatientSearch */\n/* -------------------------------------------------------------------- */\n\nexport const PatientSearch = forwardRef<\n PatientSearchHandle,\n PatientSearchProps\n>(function PatientSearch(\n {\n variant,\n loadObjects,\n loadPlaces,\n onObjectSelect,\n onPlaceSelect,\n allowTypedPlace = false,\n facets,\n defaultRadiusKm = DEFAULT_RADIUS_KM,\n reverseGeocode,\n discoveryCards,\n countryCode,\n value,\n onChange,\n onSubmit,\n submitting,\n submitLabel,\n allowEmptySubmit,\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useTranslation('ui');\n\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Primary-field refs — `focusPrimary` jumps to whichever input the variant\n // emphasises (WHO in most variants; no auto-focus on `discovery`).\n const whoRef = useRef<HTMLInputElement>(null);\n const whereRef = useRef<HTMLInputElement>(null);\n\n // Apply `when: anytime` default once on mount, but only for the variant\n // that actually renders the WHEN chip strip (`who-where-when`). The\n // `faceted` variant exposes facets, not WHEN — seeding `when: 'anytime'`\n // for it would silently pollute the consumer's value with a field the\n // form never displays.\n const seededWhenRef = useRef(false);\n useEffect(() => {\n if (seededWhenRef.current) return;\n if (variant !== 'who-where-when') return;\n if (value.when !== undefined) {\n seededWhenRef.current = true;\n return;\n }\n seededWhenRef.current = true;\n onChange({ ...value, when: 'anytime' });\n // We intentionally seed only on first render — the consumer can clear\n // back to `undefined` if they want, and we won't re-seed.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [variant]);\n\n // Apply `facets: {}` default once on mount for the faceted variant so\n // the chip row treats undefined and empty consistently.\n const seededFacetsRef = useRef(false);\n useEffect(() => {\n if (seededFacetsRef.current) return;\n if (variant !== 'faceted') return;\n if (value.facets !== undefined) {\n seededFacetsRef.current = true;\n return;\n }\n seededFacetsRef.current = true;\n onChange({ ...value, facets: {} });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [variant]);\n\n // Exposure event — fired once per variant assignment so PostHog can\n // record A/B assignment even for users who bounce before submitting.\n const exposedRef = useRef<PatientSearchVariant | null>(null);\n useEffect(() => {\n if (exposedRef.current === variant) return;\n exposedRef.current = variant;\n track('patient_search_variant_exposed', { variant, country: countryCode });\n }, [variant, countryCode]);\n\n // Imperative handle — minimal surface (`getVariant`, `reset`,\n // `focusPrimary`). The `value` reset goes through the consumer-owned\n // `onChange` so the parent's state stays the source of truth.\n //\n // The same handle is surfaced two ways: through the React `ref` (for\n // consumers driving the kit directly) and through `useAgentRegistration`\n // (for the future agent / MCP runtime). Both reach the same object so a\n // direct `ref.current?.reset()` and an `agentRegistry.invoke('reset')`\n // do the same thing.\n const handle = useMemo<PatientSearchHandle>(\n () => ({\n getVariant: () => variant,\n reset: () => {\n onChange({});\n },\n focusPrimary: () => {\n // Discovery deliberately doesn't auto-focus the search field on\n // mount; agents hitting `focus_primary` still get pulled into WHO\n // since that's the natural starting point for any keyboard-driven\n // flow once the user opts in.\n requestAnimationFrame(() => {\n whoRef.current?.focus();\n });\n },\n }),\n [variant, onChange],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(patientSearchAgent, handle, id);\n\n const resolvedAriaLabel = ariaLabel ?? t('patientSearch.regionLabel');\n\n const bodyProps: VariantBodyProps = {\n variant,\n value,\n onChange,\n onSubmit,\n loadObjects,\n loadPlaces,\n onObjectSelect,\n onPlaceSelect,\n allowTypedPlace,\n facets,\n defaultRadiusKm,\n reverseGeocode,\n discoveryCards: discoveryCards ?? [],\n submitting,\n submitLabel,\n allowEmptySubmit,\n whoRef,\n whereRef,\n cardLabel: resolvedAriaLabel,\n };\n\n const body = (() => {\n switch (variant) {\n case 'who-where':\n return <WhoWhereBody {...bodyProps} />;\n case 'who-where-when':\n return <WhoWhereWhenBody {...bodyProps} />;\n case 'faceted':\n return <FacetedBody {...bodyProps} />;\n case 'discovery':\n return <DiscoveryBody {...bodyProps} />;\n /* c8 ignore next 2 */\n default:\n return null;\n }\n })();\n\n return (\n <div\n ref={rootRef}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n id={id}\n data-component=\"patient-search\"\n data-component-id={id}\n data-variant={variant}\n className={rootVariants({ variant, className })}\n {...rest}\n >\n {body}\n </div>\n );\n});\n\nPatientSearch.displayName = 'PatientSearch';\n"],"names":["__iconNode","LocateFixed","createLucideIcon","patientSearchAgent","handle","track","event","payload","fn","WHEN_OPTIONS","RADIUS_PRESETS","DEFAULT_RADIUS_KM","AUTOCOMPLETE_DEBOUNCE_MS","radiusToStepIndex","km","best","bestDelta","preset","index","delta","rootVariants","cva","WhoField","value","onChange","loadObjects","onObjectSelect","inputRef","t","useTranslation","query","setQuery","useState","_a","selectedValueRef","useRef","_b","useEffect","_c","_d","loadOptions","useCallback","q","signal","handleSelect","option","next","focusTrackedRef","jsx","e","Autocomplete","SearchIcon","geoTriggerClasses","WhereField","loadPlaces","onPlaceSelect","allowTypedPlace","defaultRadiusKm","reverseGeocode","initialStatus","status","setStatus","place","requestLocation","position","latitude","longitude","label","resolvedLabel","syntheticPlace","clearGeo","isGranted","isRequesting","isDenied","overlay","jsxs","X","typed","MapPin","Alert","GeoRadiusBar","radiusIndex","setRadiusIndex","commitRadius","formatRadius","n","Slider","whenChipVariants","WhenChipStrip","i18n","groupId","useId","isRTL","buttonRefs","focusAt","opt","handleKeyDown","current","idx","total","forwardKey","backwardKey","rovingOption","labelKeyFor","isSelected","isRoving","node","facetChipVariants","FacetChipRow","facets","selections","useMemo","hasAnyActive","arr","updateFacet","key","values","toggleBoolean","isActive","toggleOption","group","active","v","isBoolean","countSuffix","DropdownMenu","ChevronDown","WHEEL_ACCENTS","discoveryCardVariants","accentStripVariants","iconChipVariants","resolveAccent","cardAccent","DiscoveryGrid","cards","card","accent","Stethoscope","hasAnyDimension","SubmitButton","variant","submitting","submitLabel","allowEmptySubmit","onSubmit","disabled","Button","WhoWhereBody","props","whoRef","whereRef","cardLabel","Card","WhoWhereWhenBody","FacetedBody","DiscoveryBody","discoveryCards","PatientSearch","forwardRef","countryCode","ariaLabel","id","className","rest","ref","rootRef","seededWhenRef","seededFacetsRef","exposedRef","useImperativeHandle","useAgentRegistration","resolvedAriaLabel","bodyProps","body"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "1.88.0",
3
+ "packageVersion": "1.89.0",
4
4
  "components": [
5
5
  {
6
6
  "kind": "component",
@@ -6498,7 +6498,7 @@
6498
6498
  {
6499
6499
  "name": "locale",
6500
6500
  "type": "string",
6501
- "description": "Active IETF language tag (e.g. \"en\", \"it\", \"ar\"). Initially uses storage, then HTML lang when initialLocaleFromHtmlLang is enabled, then the browser. Read after set_locale to confirm the switch; unknown tags leave it unchanged.",
6501
+ "description": "Active IETF language tag (e.g. \"en\", \"it\", \"ar\"). Initially uses HTML lang first when followHtmlLang is enabled; otherwise storage, then HTML lang when initialLocaleFromHtmlLang is enabled, then the browser. Read after set_locale to confirm the switch; unknown tags leave it unchanged.",
6502
6502
  "descriptionKey": "ui.agent.headerSettings.state.locale"
6503
6503
  },
6504
6504
  {
@@ -6549,7 +6549,7 @@
6549
6549
  "note": "Switch to Italian."
6550
6550
  }
6551
6551
  ],
6552
- "description": "Switch the active locale to the given IETF tag. Unknown tags are silently dropped — read the `locale` state slot afterwards to confirm.",
6552
+ "description": "Switch the active locale to the given IETF tag. Unknown tags are silently dropped — read the `locale` state slot afterwards to confirm. On a site with one address per language, the host may then load that language's address.",
6553
6553
  "descriptionKey": "ui.agent.headerSettings.actions.setLocale"
6554
6554
  },
6555
6555
  {
@@ -7552,7 +7552,7 @@
7552
7552
  {
7553
7553
  "name": "isSystemDefault",
7554
7554
  "type": "boolean",
7555
- "description": "True when following navigator.language. False for a saved or explicit choice, or when initialLocaleFromHtmlLang used the page language. Read alongside locale to distinguish browser detection from a concrete language selection.",
7555
+ "description": "True when following navigator.language. False for a saved or explicit choice, or when initialLocaleFromHtmlLang or followHtmlLang used the page language. Read alongside locale to distinguish browser detection from a concrete language selection.",
7556
7556
  "descriptionKey": "ui.agent.localePicker.state.isSystemDefault"
7557
7557
  }
7558
7558
  ],
@@ -675,13 +675,13 @@
675
675
  },
676
676
  "headerSettings": {
677
677
  "state": {
678
- "locale": "Active IETF language tag (e.g. \"en\", \"it\", \"ar\"). Initially uses storage, then HTML lang when initialLocaleFromHtmlLang is enabled, then the browser. Read after set_locale to confirm the switch; unknown tags leave it unchanged.",
678
+ "locale": "Active IETF language tag (e.g. \"en\", \"it\", \"ar\"). Initially uses HTML lang first when followHtmlLang is enabled; otherwise storage, then HTML lang when initialLocaleFromHtmlLang is enabled, then the browser. Read after set_locale to confirm the switch; unknown tags leave it unchanged.",
679
679
  "theme": "Stored base-theme preference. `'system'` means no override is set and the OS decides — read `resolvedTheme` for what is actually painted.",
680
680
  "accessibility": "Stored AAA-contrast preference. `'system'` means no override is set and `prefers-contrast` decides.",
681
681
  "resolvedTheme": "The theme actually applied to the document once preference and OS signals resolve. This is what makes a `set_theme(\"system\")` or `set_accessibility(\"system\")` write verifiable."
682
682
  },
683
683
  "actions": {
684
- "setLocale": "Switch the active locale to the given IETF tag. Unknown tags are silently dropped — read the `locale` state slot afterwards to confirm.",
684
+ "setLocale": "Switch the active locale to the given IETF tag. Unknown tags are silently dropped — read the `locale` state slot afterwards to confirm. On a site with one address per language, the host may then load that language's address.",
685
685
  "setTheme": "Switch the theme preference. Verify with the `theme` slot (the stored preference) and `resolvedTheme` (what is actually painted).",
686
686
  "setAccessibility": "Switch the accessibility preference. Verify with the `accessibility` slot (the stored preference) and `resolvedTheme` (what is actually painted)."
687
687
  }
@@ -773,7 +773,7 @@
773
773
  "localePicker": {
774
774
  "state": {
775
775
  "locale": "Resolved IETF tag of the locale currently applied to the page. Read this after `set_locale` — the setter silently drops tags the kit ships no bundle for, so this is the only confirmation the switch landed.",
776
- "isSystemDefault": "True when following navigator.language. False for a saved or explicit choice, or when initialLocaleFromHtmlLang used the page language. Read alongside locale to distinguish browser detection from a concrete language selection."
776
+ "isSystemDefault": "True when following navigator.language. False for a saved or explicit choice, or when initialLocaleFromHtmlLang or followHtmlLang used the page language. Read alongside locale to distinguish browser detection from a concrete language selection."
777
777
  },
778
778
  "actions": {
779
779
  "setLocale": "Switch the active locale to the given IETF tag. Unsupported tags are a silent no-op — read the `locale` state slot afterwards to confirm the switch landed."
@@ -1 +1 @@
1
- {"version":3,"file":"details-form.d.ts","sourceRoot":"","sources":["../../../src/components/booking/details-form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AA2Bf,OAAO,KAAK,EAEV,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAiHzB,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5D,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,yFAAyF;IACzF,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAGnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,eAAe,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;+EAC2E;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;IAE7C;;;;;;OAMG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAGrC,qBAAqB,CAAC,EAAE,gBAAgB,CAAC;IACzC,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;IAG3C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,SAAS,CAAC;IAIxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7C,oEAAoE;IACpE,2BAA2B,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACpD,gEAAgE;IAChE,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAiCD,eAAO,MAAM,kBAAkB,qHA4uC9B,CAAC"}
1
+ {"version":3,"file":"details-form.d.ts","sourceRoot":"","sources":["../../../src/components/booking/details-form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AA2Bf,OAAO,KAAK,EAEV,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAiHzB,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5D,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,yFAAyF;IACzF,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAGnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,eAAe,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;+EAC2E;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;IAE7C;;;;;;OAMG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAGrC,qBAAqB,CAAC,EAAE,gBAAgB,CAAC;IACzC,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;IAG3C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,SAAS,CAAC;IAIxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7C,oEAAoE;IACpE,2BAA2B,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACpD,gEAAgE;IAChE,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAiCD,eAAO,MAAM,kBAAkB,qHA6uC9B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { B as A, C as R, O as a, b as s } from "../../_chunks/booking-DjQuhfN7.js";
1
+ import { B as A, C as R, O as a, b as s } from "../../_chunks/booking-C0FoW8Yx.js";
2
2
  export {
3
3
  A as Booking,
4
4
  R as CONFIRMATION_CHANNEL_ORDER,
@@ -1,5 +1,6 @@
1
1
  import { type HTMLAttributes } from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
+ import { type LocaleChangeHandler } from '../locale-picker/locale-picker';
3
4
  import { type AccessibilityPreference, type ResolvedTheme, type ThemePreference } from '../../hooks';
4
5
  declare const wrapperVariants: (props?: ({
5
6
  align?: "end" | "start" | null | undefined;
@@ -26,6 +27,19 @@ export interface HeaderSettingsProps extends Omit<HTMLAttributes<HTMLDivElement>
26
27
  * decides for the app lifecycle; pass the same option to LocalePicker.
27
28
  */
28
29
  initialLocaleFromHtmlLang?: boolean;
30
+ /**
31
+ * The page's HTML lang decides the starting locale, ahead of a saved
32
+ * choice. For sites with one address per language, where the address
33
+ * decides. Defaults to false. Pass the same option to LocalePicker.
34
+ */
35
+ followHtmlLang?: boolean;
36
+ /**
37
+ * Called after a language picked in the menu (or set through the agent
38
+ * handle) has been applied and changed the language. Not called for the
39
+ * starting locale. A site with one address per language navigates to
40
+ * `resolved` here.
41
+ */
42
+ onLocaleChange?: LocaleChangeHandler;
29
43
  }
30
44
  export interface HeaderSettingsHandle {
31
45
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"header-settings.d.ts","sourceRoot":"","sources":["../../../src/components/header-settings/header-settings.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,cAAc,EAEpB,MAAM,OAAO,CAAC;AACf,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAWlE,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAqBrB,QAAA,MAAM,eAAe;;8EAQnB,CAAC;AA+HH,MAAM,WAAW,mBACf,SACE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EAChD,YAAY,CAAC,OAAO,eAAe,CAAC;IACtC,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,gBAAgB,EAAE,CAAC,IAAI,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAE1D,wDAAwD;IACxD,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,eAAe,CAAC;IAChC,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;IAChD;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,aAAa,CAAC;CACvC;AAaD,eAAO,MAAM,cAAc,gHA6X1B,CAAC"}
1
+ {"version":3,"file":"header-settings.d.ts","sourceRoot":"","sources":["../../../src/components/header-settings/header-settings.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,cAAc,EAEpB,MAAM,OAAO,CAAC;AACf,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMlE,OAAO,EAIL,KAAK,mBAAmB,EAEzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAqBrB,QAAA,MAAM,eAAe;;8EAQnB,CAAC;AAqIH,MAAM,WAAW,mBACf,SACE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EAChD,YAAY,CAAC,OAAO,eAAe,CAAC;IACtC,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,mBAAmB,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,gBAAgB,EAAE,CAAC,IAAI,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAE1D,wDAAwD;IACxD,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,eAAe,CAAC;IAChC,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;IAChD;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,aAAa,CAAC;CACvC;AAaD,eAAO,MAAM,cAAc,gHA0Y1B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { H as t } from "../../_chunks/header-settings-CifwJEKB.js";
1
+ import { H as t } from "../../_chunks/header-settings-BVhjndtV.js";
2
2
  export {
3
3
  t as HeaderSettings
4
4
  };
@@ -1,7 +1,8 @@
1
- import { L, a as c, b as r } from "../../_chunks/locale-picker-QbT1p60X.js";
1
+ import { L as c, a as e, b as E, c as r } from "../../_chunks/locale-picker-DVvinQXU.js";
2
2
  export {
3
- L as LOCALE_STORAGE_KEY,
4
- c as LocalePicker,
3
+ c as LOCALE_STORAGE_KEY,
4
+ e as LOCALE_SYSTEM_DEFAULT,
5
+ E as LocalePicker,
5
6
  r as LocalePickerSearchList
6
7
  };
7
8
  //# sourceMappingURL=index.js.map
@@ -10,19 +10,30 @@ export declare const LOCALE_STORAGE_KEY = "alfadocs-ui.locale";
10
10
  */
11
11
  export declare const LOCALE_SYSTEM_DEFAULT: "system";
12
12
  export type LocalePreference = Locale | typeof LOCALE_SYSTEM_DEFAULT;
13
+ /**
14
+ * Reports a language change: the picked preference, and the concrete locale it
15
+ * applied (the browser's for System default, which is what a site navigates to).
16
+ */
17
+ export type LocaleChangeHandler = (next: LocalePreference, resolved: Locale) => void;
13
18
  /** @internal Simulate a fresh app lifecycle after test components unmount. */
14
19
  export declare function __resetLocalePreferenceForTests(): void;
20
+ /**
21
+ * Calls `onLocaleChange` when a pick changed the language. Picking the language
22
+ * already shown (or System default resolving to it) reports nothing.
23
+ */
24
+ export declare function reportLocaleChange(onLocaleChange: LocaleChangeHandler | undefined, next: LocalePreference, previous: Locale): void;
15
25
  /** Shared persistence for picker selections and HeaderSettings agent actions. */
16
26
  export declare function persistLocalePreference(next: LocalePreference): void;
17
27
  /**
18
28
  * Applies storage, optionally HTML lang, then the browser, once per app lifecycle.
29
+ * With `followHtmlLang`, a supported HTML lang comes first, ahead of storage.
19
30
  * Every locale surface calls it on mount (the picker, and HeaderSettings,
20
31
  * whose search list only mounts when its flyout opens), so the page starts
21
32
  * in the right language and direction whichever one the host renders.
22
33
  * The first caller whose mount effect runs decides the option for all surfaces.
23
34
  * Pass the same option everywhere; later mounts or prop changes do not re-detect.
24
35
  */
25
- export declare function useInitialLocale(initialLocaleFromHtmlLang?: boolean): void;
36
+ export declare function useInitialLocale(initialLocaleFromHtmlLang?: boolean, followHtmlLang?: boolean): void;
26
37
  declare const wrapperVariants: (props?: ({
27
38
  variant?: "icon" | "compact" | null | undefined;
28
39
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
@@ -46,6 +57,19 @@ export interface LocalePickerProps extends Omit<HTMLAttributes<HTMLDivElement>,
46
57
  * decides for the app lifecycle; pass the same option to HeaderSettings.
47
58
  */
48
59
  initialLocaleFromHtmlLang?: boolean;
60
+ /**
61
+ * The page's HTML lang decides the starting locale, ahead of a saved
62
+ * choice. For sites with one address per language, where the address
63
+ * decides. Defaults to false. Pass the same option to HeaderSettings.
64
+ */
65
+ followHtmlLang?: boolean;
66
+ /**
67
+ * Called after the picker (or its agent handle) has applied a selection
68
+ * that changed the language. Uncontrolled mode only: with `onValueChange`
69
+ * it stays silent. A site with one address per language navigates to
70
+ * `resolved` here. Not called for the starting language.
71
+ */
72
+ onLocaleChange?: LocaleChangeHandler;
49
73
  /**
50
74
  * Side the search popover opens onto, relative to the trigger.
51
75
  * Defaults to `bottom` (standard dropdown). Use `end` (inline-end —
@@ -92,6 +116,12 @@ export interface LocalePickerSearchListProps {
92
116
  * or clears storage, updates document.dir/lang).
93
117
  */
94
118
  onValueChange?: (next: LocalePreference) => void;
119
+ /**
120
+ * Called after the shared setter has applied a selection that changed the
121
+ * language (uncontrolled mode only; with `onValueChange` it stays silent).
122
+ * A site with one address per language navigates to `resolved` here.
123
+ */
124
+ onLocaleChange?: LocaleChangeHandler;
95
125
  /** Optional id for the search input (axe `aria-labelledby` chain). */
96
126
  inputId?: string;
97
127
  /** Disable the input + list interactions. */
@@ -1 +1 @@
1
- {"version":3,"file":"locale-picker.d.ts","sourceRoot":"","sources":["../../../src/components/locale-picker/locale-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,cAAc,EAEpB,MAAM,OAAO,CAAC;AACf,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAalE,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAgB/E,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAG,QAAiB,CAAC;AACvD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,qBAAqB,CAAC;AAMrE,8EAA8E;AAC9E,wBAAgB,+BAA+B,IAAI,IAAI,CAGtD;AAmGD,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAIpE;AA4CD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,yBAAyB,UAAQ,GAAG,IAAI,CA4BxE;AAMD,QAAA,MAAM,eAAe;;8EAQnB,CAAC;AAqCH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAAC;AAErD,MAAM,WAAW,iBACf,SACE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EAChD,YAAY,CAAC,OAAO,eAAe,CAAC;IACtC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;CAClD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,0EAA0E;IAC1E,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB;;;;;OAKG;IACH,kBAAkB,EAAE,MAAM,OAAO,CAAC;CACnC;AAUD,MAAM,WAAW,2BAA2B;IAC1C;;;;;OAKG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD,eAAO,MAAM,sBAAsB,wHA6OlC,CAAC;AA6QF,eAAO,MAAM,YAAY;;CAEvB,CAAC"}
1
+ {"version":3,"file":"locale-picker.d.ts","sourceRoot":"","sources":["../../../src/components/locale-picker/locale-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,cAAc,EAEpB,MAAM,OAAO,CAAC;AACf,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAalE,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAgB/E,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAG,QAAiB,CAAC;AACvD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,qBAAqB,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;AAMV,8EAA8E;AAC9E,wBAAgB,+BAA+B,IAAI,IAAI,CAGtD;AAyDD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,mBAAmB,GAAG,SAAS,EAC/C,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,MAAM,GACf,IAAI,CAIN;AA4CD,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAIpE;AA6CD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,yBAAyB,UAAQ,EACjC,cAAc,UAAQ,GACrB,IAAI,CAsCN;AAMD,QAAA,MAAM,eAAe;;8EAQnB,CAAC;AAqCH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAAC;AAErD,MAAM,WAAW,iBACf,SACE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EAChD,YAAY,CAAC,OAAO,eAAe,CAAC;IACtC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;CAClD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,0EAA0E;IAC1E,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB;;;;;OAKG;IACH,kBAAkB,EAAE,MAAM,OAAO,CAAC;CACnC;AAUD,MAAM,WAAW,2BAA2B;IAC1C;;;;;OAKG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD;;;;OAIG;IACH,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD,eAAO,MAAM,sBAAsB,wHAkPlC,CAAC;AAsRF,eAAO,MAAM,YAAY;;CAEvB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { P as t, p as r } from "../../_chunks/patient-search-Dy0sxcwv.js";
1
+ import { P as t, p as r } from "../../_chunks/patient-search-BPjP2__L.js";
2
2
  export {
3
3
  t as PatientSearch,
4
4
  r as patientSearchAgent
@@ -1 +1 @@
1
- {"version":3,"file":"patient-search.d.ts","sourceRoot":"","sources":["../../../src/components/patient-search/patient-search.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"patient-search.d.ts","sourceRoot":"","sources":["../../../src/components/patient-search/patient-search.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,wBAAwB,EAE7B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA8ClE,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GACX,gBAAgB,GAChB,SAAS,GACT,WAAW,CAAC;AAEhB,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;AAExE,kFAAkF;AAClF,MAAM,WAAW,mBAAmB;IAClC,wFAAwF;IACxF,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,6FAA6F;IAC7F,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,oBAAoB,CAAC;IACvC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,qEAAqE;IACrE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AA2DD,QAAA,MAAM,YAAY;;8EAajB,CAAC;AAMF,MAAM,WAAW,kBACf,SACE,IAAI,CACF,wBAAwB,CAAC,KAAK,CAAC,EAC/B,YAAY,GAAG,UAAU,GAAG,UAAU,CACvC,EACD,YAAY,CAAC,OAAO,YAAY,CAAC;IACnC,OAAO,EAAE,oBAAoB,CAAC;IAG9B,WAAW,EAAE,CACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,KACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACpC,UAAU,EAAE,CACV,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,KACzB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAGnC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACvD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAGpD,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IAQtB,qFAAqF;IACrF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAG/D,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IAEjC,gFAAgF;IAChF,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IAGnC,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAG3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAo0CD,eAAO,MAAM,aAAa,oHAuKxB,CAAC"}