@alfadocs/ui-kit-debug 0.30.5 → 0.31.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 (40) hide show
  1. package/dist/_chunks/{booking-Cw92aqo3.js → booking-Bhk9IYm3.js} +136 -147
  2. package/dist/_chunks/booking-Bhk9IYm3.js.map +1 -0
  3. package/dist/_chunks/calendar-clock-CYkcqdwl.js +19 -0
  4. package/dist/_chunks/calendar-clock-CYkcqdwl.js.map +1 -0
  5. package/dist/_chunks/{editable-currency-cell-renderer-CztRy_21.js → editable-currency-cell-renderer-Od3Q-Y8J.js} +178 -189
  6. package/dist/_chunks/editable-currency-cell-renderer-Od3Q-Y8J.js.map +1 -0
  7. package/dist/_chunks/practice-results-CEKjwsgS.js +1441 -0
  8. package/dist/_chunks/practice-results-CEKjwsgS.js.map +1 -0
  9. package/dist/_chunks/refresh-cw-CC8jSKMr.js +17 -0
  10. package/dist/_chunks/refresh-cw-CC8jSKMr.js.map +1 -0
  11. package/dist/_chunks/smile-BSYLAHy6.js +17 -0
  12. package/dist/_chunks/smile-BSYLAHy6.js.map +1 -0
  13. package/dist/_chunks/{transaction-chip-z9ENE50O.js → transaction-chip-B8ujzowA.js} +47 -60
  14. package/dist/_chunks/transaction-chip-B8ujzowA.js.map +1 -0
  15. package/dist/agent-catalog.json +42 -1
  16. package/dist/components/booking/index.js +1 -1
  17. package/dist/components/data-table/index.js +1 -1
  18. package/dist/components/index.d.ts +1 -0
  19. package/dist/components/index.d.ts.map +1 -1
  20. package/dist/components/practice-results/index.d.ts +4 -0
  21. package/dist/components/practice-results/index.d.ts.map +1 -0
  22. package/dist/components/practice-results/index.js +6 -0
  23. package/dist/components/practice-results/index.js.map +1 -0
  24. package/dist/components/practice-results/practice-results.agent.d.ts +4 -0
  25. package/dist/components/practice-results/practice-results.agent.d.ts.map +1 -0
  26. package/dist/components/practice-results/practice-results.d.ts +137 -0
  27. package/dist/components/practice-results/practice-results.d.ts.map +1 -0
  28. package/dist/components/transaction-chip/index.js +1 -1
  29. package/dist/i18n/locales/en.d.ts +65 -0
  30. package/dist/i18n/locales/en.d.ts.map +1 -1
  31. package/dist/i18n/locales/en.js +65 -0
  32. package/dist/i18n/locales/en.js.map +1 -1
  33. package/dist/index.js +100 -97
  34. package/dist/index.js.map +1 -1
  35. package/dist/locales/en.json +65 -0
  36. package/dist/tokens.css +1 -1
  37. package/package.json +5 -1
  38. package/dist/_chunks/booking-Cw92aqo3.js.map +0 -1
  39. package/dist/_chunks/editable-currency-cell-renderer-CztRy_21.js.map +0 -1
  40. package/dist/_chunks/transaction-chip-z9ENE50O.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"practice-results-CEKjwsgS.js","sources":["../../node_modules/lucide-react/dist/esm/icons/languages.js","../../node_modules/lucide-react/dist/esm/icons/map.js","../../node_modules/lucide-react/dist/esm/icons/shield-check.js","../../src/components/practice-results/practice-results.agent.ts","../../src/components/practice-results/practice-results.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.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.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m5 8 6 6\", key: \"1wu5hv\" }],\n [\"path\", { d: \"m4 14 6-6 2-3\", key: \"1k1g8d\" }],\n [\"path\", { d: \"M2 5h12\", key: \"or177f\" }],\n [\"path\", { d: \"M7 2h1\", key: \"1t2jsx\" }],\n [\"path\", { d: \"m22 22-5-10-5 10\", key: \"don7ne\" }],\n [\"path\", { d: \"M14 18h6\", key: \"1m8k6r\" }]\n];\nconst Languages = createLucideIcon(\"languages\", __iconNode);\n\nexport { __iconNode, Languages as default };\n//# sourceMappingURL=languages.js.map\n","/**\n * @license lucide-react v1.8.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.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z\",\n key: \"169xi5\"\n }\n ],\n [\"path\", { d: \"M15 5.764v15\", key: \"1pn4in\" }],\n [\"path\", { d: \"M9 3.236v15\", key: \"1uimfh\" }]\n];\nconst Map = createLucideIcon(\"map\", __iconNode);\n\nexport { __iconNode, Map as default };\n//# sourceMappingURL=map.js.map\n","/**\n * @license lucide-react v1.8.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.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n];\nconst ShieldCheck = createLucideIcon(\"shield-check\", __iconNode);\n\nexport { __iconNode, ShieldCheck as default };\n//# sourceMappingURL=shield-check.js.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — PracticeResults (0.31.0). */\n/* */\n/* PracticeResults is the SERP primitive — a three-way A/B-testable */\n/* surface (`split-list-map`, `map-first`, `rich-cards`). The adapter */\n/* exposes the active variant + read-only actions for scrolling a card */\n/* into view and focusing a pin. Selection state and filter values are */\n/* consumer-owned via `value` / `onChange` — never read here (the */\n/* result list itself is generally non-sensitive, but follows the same */\n/* pattern as Booking / PatientSearch for consistency). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PracticeResultsHandle } from './practice-results';\n\nexport const practiceResultsAgent: AgentAdapter<PracticeResultsHandle> = {\n id: 'practice-results',\n capabilities: ['navigate', 'view_change'],\n state: {\n variant: {\n type: 'string',\n descriptionKey: 'ui.agent.practiceResults.state.variant',\n description:\n 'Active variant — one of `split-list-map`, `map-first`, `rich-cards`.',\n read: (handle) => handle.getVariant(),\n },\n },\n actions: {\n scroll_to_result: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.practiceResults.actions.scrollToResult',\n description:\n 'Scroll the result card with the given id into the visible viewport.',\n invoke: (handle, args: { id: string }) => {\n handle.scrollToResult(args.id);\n },\n },\n focus_pin: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.practiceResults.actions.focusPin',\n description:\n 'Highlight the map pin for the given result id (no-op on rich-cards).',\n invoke: (handle, args: { id: string }) => {\n handle.focusPin(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'practice-results',\n description: 'Marks the PracticeResults 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 useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n CalendarClock,\n ChevronDown,\n Languages,\n Map as MapIcon,\n MapPin,\n RefreshCw,\n ShieldCheck,\n Smile,\n} from 'lucide-react';\nimport { Alert } from '../alert/alert';\nimport { Avatar } from '../avatar/avatar';\nimport { Button } from '../button/button';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { MapView, type MapMarker } from '../map-view/map-view';\nimport { Rating } from '../rating/rating';\nimport { Sheet } from '../sheet/sheet';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { Spinner } from '../spinner/spinner';\nimport { Tag } from '../tag/tag';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { practiceResultsAgent } from './practice-results.agent';\n\n/* -------------------------------------------------------------------- */\n/* PracticeResults */\n/* */\n/* SERP primitive — a three-way A/B-testable surface. One `variant` */\n/* prop selects between Doctolib-style split-list-map (default), */\n/* map-first (map dominant, list rail), and rich-cards (no live map, */\n/* each card carries a static thumbnail + distance + languages + */\n/* insurance + next-available CTA). Telemetry and the */\n/* `PracticeResultsValue` contract are identical across variants so */\n/* A/B comparison is like-for-like. */\n/* */\n/* The consumer owns the search backend (results array, totalCount, */\n/* bbox-driven re-queries via `onBoundsChange`, pagination via */\n/* `onLoadMore`) and the routing (`onResultSelect`). The kit owns */\n/* layout, filter/sort logic, pin↔card sync, accessibility, telemetry. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\nexport type PracticeResultsVariant =\n | 'split-list-map'\n | 'map-first'\n | 'rich-cards';\n\nexport type PracticeResultsSort =\n | 'distance'\n | 'rating'\n | 'next-available'\n | 'relevance';\n\nexport type PracticeResultsSelectSource = 'card' | 'pin';\n\nexport interface PracticeResultsBounds {\n north: number;\n south: number;\n east: number;\n west: number;\n}\n\nexport interface PracticeResult {\n id: string;\n /** Stable URL for the practice or operator detail page. */\n href: string;\n name: string;\n /** Profession or specialty caption. */\n subtitle?: string;\n /** Avatar / logo URL. */\n imageUrl?: string;\n /** Practice location. Required by the two map variants. */\n location?: {\n lat: number;\n lng: number;\n /** Display string e.g. \"Via Brera 14, 20121 Milano\". */\n address?: string;\n /** Distance from search centre, in km. Rendered by rich-cards. */\n distanceKm?: number;\n };\n rating?: {\n value: number;\n count: number;\n };\n /** ISO 639-1 codes. Rendered as chips by rich-cards. */\n languages?: string[];\n /** Short brand names. Rendered as chips by rich-cards. */\n insurances?: string[];\n /** Anxious-patient friendly — renders an icon chip on rich-cards. */\n specializedInFearPatients?: boolean;\n /** Next available slot — rendered as inline CTA on rich-cards. */\n nextAvailableSlot?: {\n /** ISO datetime, e.g. \"2026-05-23T10:30:00+02:00\". */\n dateTime: string;\n /** Direct deep-link to the kit's Booking with this slot pre-selected. */\n bookingHref: string;\n };\n /** Opaque payload echoed back in onResultSelect. */\n __payload?: unknown;\n}\n\nexport interface PracticeResultsValue {\n /** Selected facets — keys match consumer's `facets[].key`. */\n facets?: Record<string, string[]>;\n /** Sort key. Default `'distance'` when searchCentre is set, otherwise `'relevance'`. */\n sort?: PracticeResultsSort;\n}\n\n/** Shared facet shape — same as PatientSearch. */\nexport interface FacetOption {\n value: string;\n label: string;\n}\n\nexport interface FacetGroup {\n key: string;\n label: string;\n /** Empty array = boolean toggle. Non-empty = dropdown. */\n options: FacetOption[];\n multi?: boolean;\n}\n\nexport interface PracticeResultsHandle {\n getVariant: () => PracticeResultsVariant;\n /** Scroll a specific result into view (useful for deep-link → highlight). */\n scrollToResult: (id: string) => void;\n /** Imperatively focus a pin on the map (no-op on rich-cards). */\n focusPin: (id: string) => void;\n}\n\nexport interface PracticeResultsProps\n extends\n Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'onChange' | 'onSelect' | 'results' | 'defaultValue'\n >,\n VariantProps<typeof rootVariants> {\n /** Default: 'split-list-map'. Pass to override (PostHog / dev-menu). */\n variant?: PracticeResultsVariant;\n\n // Data\n results: PracticeResult[];\n /** Total count for the \"{{count}} risultati\" header. May differ from results.length. */\n totalCount?: number;\n /** Visible search location — drives map centre + distance calcs. */\n searchCentre?: { lat: number; lng: number; label?: string };\n\n // Filters (same shape as PatientSearch)\n facets?: FacetGroup[];\n\n // Map config (used by split + map-first; ignored by rich-cards)\n googleMapsApiKey?: string;\n /** Initial map zoom. Default 13. */\n defaultZoom?: number;\n /** Fires when patient pans/zooms (split + map-first only). */\n onBoundsChange?: (bounds: PracticeResultsBounds) => void;\n /**\n * GDPR consent gate, forwarded to the embedded MapView. When `false`\n * (default) the kit renders the same consent placeholder MapView ships\n * by default — third-party scripts never load until the consumer\n * captures opt-in. Also gates the rich-cards static thumbnails (which\n * are still IP-disclosing third-party loads).\n */\n consentGranted?: boolean;\n /** Fires when the patient clicks the \"Load map\" CTA in the consent placeholder. */\n onConsentRequest?: () => void;\n\n // Pagination\n /** Fires when the patient scrolls to the bottom of the list. */\n onLoadMore?: () => void;\n /** True while the next page is loading — kit shows a Spinner at the list tail. */\n loadingMore?: boolean;\n\n // State\n value: PracticeResultsValue;\n onChange: (next: PracticeResultsValue) => void;\n onResultSelect: (\n result: PracticeResult,\n source: PracticeResultsSelectSource,\n ) => void;\n\n // UX\n /**\n * Initial loading skeletons. Per SSR-first design, skeletons render\n * only when `results.length === 0 && loading === true` so a server-\n * rendered list isn't flashed away on hydration.\n */\n loading?: boolean;\n /** Custom empty-state slot. Defaults to the localised EmptyState. */\n emptyResultsSlot?: ReactNode;\n /** Custom error slot. Renders when `error` is truthy. */\n errorSlot?: ReactNode;\n /** Truthy = render the error slot. Pair with `onRetry` for the default slot. */\n error?: boolean;\n /** Retry handler for the default error slot's CTA. */\n onRetry?: () => void;\n /** Heading rendered above the results (e.g. \"I migliori Dentisti a Milano\"). */\n heading?: string;\n /** Intro text below the heading. */\n intro?: string;\n\n // a11y\n 'aria-label'?: string;\n /** Agent-readiness instance id. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Constants */\n/* -------------------------------------------------------------------- */\n\nconst DEFAULT_ZOOM = 13;\n\nconst SORT_OPTIONS: readonly PracticeResultsSort[] = [\n 'distance',\n 'rating',\n 'next-available',\n 'relevance',\n] as const;\n\n/* -------------------------------------------------------------------- */\n/* Telemetry */\n/* */\n/* Same `window.track` convention as PatientSearch / booking-website. */\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/* Helpers */\n/* -------------------------------------------------------------------- */\n\n/**\n * Emit `serp_result_clicked` + invoke the consumer's `onResultSelect`\n * with the result's `position` in the currently-rendered (filtered +\n * sorted) list — needed for the PostHog funnel's position-bias analysis\n * (which rank gets clicked across variants).\n */\nfunction emitResultClick(\n results: PracticeResult[],\n id: string,\n source: PracticeResultsSelectSource,\n onResultSelect: PracticeResultsProps['onResultSelect'],\n): void {\n const position = results.findIndex((r) => r.id === id);\n if (position < 0) return;\n const result = results[position];\n if (!result) return;\n track('serp_result_clicked', { resultId: id, source, position });\n onResultSelect(result, source);\n}\n\n/** Haversine distance between two lat/lng points, in km. */\nfunction haversineKm(\n a: { lat: number; lng: number },\n b: { lat: number; lng: number },\n): number {\n const R = 6371; // earth radius in km\n const dLat = ((b.lat - a.lat) * Math.PI) / 180;\n const dLng = ((b.lng - a.lng) * Math.PI) / 180;\n const lat1 = (a.lat * Math.PI) / 180;\n const lat2 = (b.lat * Math.PI) / 180;\n const sinDLat = Math.sin(dLat / 2);\n const sinDLng = Math.sin(dLng / 2);\n const h =\n sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLng * sinDLng;\n return 2 * R * Math.asin(Math.min(1, Math.sqrt(h)));\n}\n\n/** Apply selected facets to the result list — client-side narrowing. */\nfunction applyFilters(\n results: PracticeResult[],\n facets: PracticeResultsValue['facets'],\n facetGroups: FacetGroup[],\n): PracticeResult[] {\n if (!facets || Object.keys(facets).length === 0) return results;\n return results.filter((result) => {\n for (const group of facetGroups) {\n const selected = facets[group.key];\n if (!selected || selected.length === 0) continue;\n if (group.options.length === 0) {\n // Boolean toggle — match the convention used by PatientSearch.\n // Selection of `['true']` means the consumer's data shape should\n // expose a boolean field on the result. The kit can't enumerate\n // every possible boolean key, so we treat the chip as a hint\n // the consumer's backend / pre-filter should honour. Locally,\n // we attempt a heuristic: result has the same key set to true.\n const value = (result as unknown as Record<string, unknown>)[group.key];\n if (value !== true) return false;\n continue;\n }\n const field =\n group.key === 'insurance'\n ? result.insurances\n : group.key === 'language'\n ? result.languages\n : (result as unknown as Record<string, unknown>)[group.key];\n if (!Array.isArray(field)) return false;\n const hit = group.multi\n ? selected.some((v) => field.includes(v))\n : field.includes(selected[0]);\n if (!hit) return false;\n }\n return true;\n });\n}\n\n/** Sort results by the active sort key. Mutation-free. */\nfunction applySort(\n results: PracticeResult[],\n sort: PracticeResultsSort,\n searchCentre?: { lat: number; lng: number },\n): PracticeResult[] {\n const decorated = results.map((result) => {\n const distanceKm = result.location\n ? (result.location.distanceKm ??\n (searchCentre ? haversineKm(searchCentre, result.location) : undefined))\n : undefined;\n return { result, distanceKm };\n });\n const compare = (\n a: { result: PracticeResult; distanceKm?: number },\n b: { result: PracticeResult; distanceKm?: number },\n ): number => {\n switch (sort) {\n case 'distance': {\n if (a.distanceKm == null && b.distanceKm == null) return 0;\n if (a.distanceKm == null) return 1;\n if (b.distanceKm == null) return -1;\n return a.distanceKm - b.distanceKm;\n }\n case 'rating': {\n const av = a.result.rating?.value ?? -1;\n const bv = b.result.rating?.value ?? -1;\n return bv - av;\n }\n case 'next-available': {\n const av = a.result.nextAvailableSlot?.dateTime ?? '';\n const bv = b.result.nextAvailableSlot?.dateTime ?? '';\n if (!av && !bv) return 0;\n if (!av) return 1;\n if (!bv) return -1;\n return av.localeCompare(bv);\n }\n case 'relevance':\n default:\n return 0;\n }\n };\n return [...decorated].sort(compare).map(({ result, distanceKm }) =>\n distanceKm != null && result.location\n ? {\n ...result,\n location: { ...result.location, distanceKm },\n }\n : result,\n );\n}\n\n/** Compute the bounding box of an array of lat/lng pairs. */\nfunction boundsForResults(\n results: PracticeResult[],\n): PracticeResultsBounds | undefined {\n let north = -Infinity;\n let south = Infinity;\n let east = -Infinity;\n let west = Infinity;\n let anyPoint = false;\n for (const result of results) {\n if (!result.location) continue;\n anyPoint = true;\n const { lat, lng } = result.location;\n if (lat > north) north = lat;\n if (lat < south) south = lat;\n if (lng > east) east = lng;\n if (lng < west) west = lng;\n }\n if (!anyPoint) return undefined;\n return { north, south, east, west };\n}\n\n/* -------------------------------------------------------------------- */\n/* Root CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:text-[var(--foreground)] ds:gap-[var(--spacing-md)]',\n {\n variants: {\n variant: {\n 'split-list-map': '',\n 'map-first': '',\n 'rich-cards': '',\n },\n },\n defaultVariants: { variant: 'split-list-map' },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* HeaderBlock — heading + intro + totalCount summary */\n/* -------------------------------------------------------------------- */\n\ninterface HeaderBlockProps {\n heading?: string;\n intro?: string;\n totalCount?: number;\n searchCentreLabel?: string;\n}\n\nfunction HeaderBlock({\n heading,\n intro,\n totalCount,\n searchCentreLabel,\n}: HeaderBlockProps) {\n const { t } = useTranslation();\n if (!heading && !intro && totalCount == null) return null;\n const summary =\n totalCount != null\n ? searchCentreLabel\n ? t('practiceResults.results.heading', {\n count: totalCount,\n place: searchCentreLabel,\n })\n : t('practiceResults.results.summary', { count: totalCount })\n : undefined;\n // Plain <div> rather than <header>: the surrounding region landmark\n // already names the section, and <header> inside a landmark can trip\n // axe's `landmark-banner-is-top-level` when the rule's heuristic\n // walks the DOM. The visual rendering is unchanged.\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {heading ? (\n <h2 className=\"type-title-section ds:m-0 ds:text-[var(--foreground)]\">\n {heading}\n </h2>\n ) : null}\n {intro ? (\n <p className=\"type-body ds:m-0 ds:text-[var(--muted-foreground)]\">\n {intro}\n </p>\n ) : null}\n {summary ? (\n <p\n className=\"type-body-sm ds:m-0 ds:text-[var(--muted-foreground)]\"\n aria-live=\"polite\"\n >\n {summary}\n </p>\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* FilterChipRow */\n/* */\n/* Shared chip rail — same shape as PatientSearch's FacetChipRow, lifted */\n/* here so the SERP can carry the same set of filters without depending */\n/* on PatientSearch internals. */\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 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\nconst filterChipRowVariants = cva(\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]',\n {\n variants: {\n placement: {\n inline: '',\n // Floating chrome on map-first: soft `--popover` surface so chips\n // read over the map without losing contrast. Same surface as\n // dropdowns / sheets — themed and forced-colors safe.\n floating: [\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--popover)] ds:shadow-[var(--shadow-md)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-2xs)] ds:pb-[var(--spacing-2xs)]',\n ].join(' '),\n },\n },\n defaultVariants: { placement: 'inline' },\n },\n);\n\nconst clearFiltersButtonVariants = cva(\n [\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\ninterface FilterChipRowProps {\n facets: FacetGroup[];\n value: PracticeResultsValue['facets'];\n onChange: (next: Record<string, string[]>) => void;\n /** Visual placement — floating overlay on map-first; inline elsewhere. */\n floating?: boolean;\n}\n\nfunction FilterChipRow({\n facets,\n value,\n onChange,\n floating,\n}: FilterChipRowProps) {\n const { t } = useTranslation();\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('serp_filter_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 if (facets.length === 0) return null;\n\n return (\n <div\n data-component=\"practice-results-filters\"\n role=\"group\"\n aria-label={t('practiceResults.filters.label')}\n className={filterChipRowVariants({\n placement: floating ? 'floating' : 'inline',\n })}\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 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 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('serp_filter_changed', { key: '*', values: [] });\n }}\n className={clearFiltersButtonVariants()}\n >\n {t('practiceResults.filters.clear')}\n </button>\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* SortControl — DropdownMenu chip for the active sort key. */\n/* -------------------------------------------------------------------- */\n\ninterface SortControlProps {\n value: PracticeResultsSort;\n onChange: (next: PracticeResultsSort) => void;\n}\n\nfunction SortControl({ value, onChange }: SortControlProps) {\n const { t } = useTranslation();\n const labelFor = (sort: PracticeResultsSort): string => {\n switch (sort) {\n case 'distance':\n return t('practiceResults.sort.distance');\n case 'rating':\n return t('practiceResults.sort.rating');\n case 'next-available':\n return t('practiceResults.sort.nextAvailable');\n case 'relevance':\n default:\n return t('practiceResults.sort.relevance');\n }\n };\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n aria-label={`${t('practiceResults.sort.label')}: ${labelFor(value)}`}\n className={facetChipVariants({ state: 'idle' })}\n >\n <span>\n {t('practiceResults.sort.label')}: {labelFor(value)}\n </span>\n <ChevronDown aria-hidden=\"true\" className=\"ds:size-3.5 ds:shrink-0\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content sideOffset={8} align=\"end\">\n <DropdownMenu.RadioGroup\n value={value}\n onValueChange={(next) => {\n const sort = next as PracticeResultsSort;\n if (sort !== value) {\n onChange(sort);\n track('serp_sort_changed', { sort });\n }\n }}\n >\n {SORT_OPTIONS.map((sort) => (\n <DropdownMenu.RadioItem key={sort} value={sort}>\n {labelFor(sort)}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* DistanceChip — formatted \"{km} km\" or \"< 1 km\" reading. */\n/* -------------------------------------------------------------------- */\n\ninterface DistanceChipProps {\n distanceKm: number;\n}\n\nfunction DistanceChip({ distanceKm }: DistanceChipProps) {\n const { t, i18n } = useTranslation();\n const label = useMemo(() => {\n if (distanceKm < 1) return t('practiceResults.distance.below');\n const formatted = new Intl.NumberFormat(i18n.language, {\n maximumFractionDigits: 1,\n }).format(distanceKm);\n return t('practiceResults.distance.km', { distance: formatted });\n }, [distanceKm, t, i18n.language]);\n return (\n <Tag\n label={label}\n variant=\"neutral\"\n fill=\"outline\"\n size=\"sm\"\n leading={<MapPin aria-hidden=\"true\" />}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* StaticMapThumb — Google Static Maps `<img>`. Consent-gated. */\n/* -------------------------------------------------------------------- */\n\ninterface StaticMapThumbProps {\n apiKey?: string;\n center: { lat: number; lng: number };\n zoom?: number;\n consentGranted: boolean;\n}\n\nconst staticMapThumbVariants = cva(\n [\n 'ds:inline-size-[12rem] ds:block-size-[8rem] ds:shrink-0',\n 'ds:rounded-[var(--radius-md)]',\n ].join(' '),\n {\n variants: {\n state: {\n placeholder:\n 'ds:flex ds:items-center ds:justify-center ds:bg-[var(--muted)] ds:text-[var(--muted-foreground)]',\n image: 'ds:[object-fit:cover]',\n },\n },\n defaultVariants: { state: 'placeholder' },\n },\n);\n\n/**\n * Resolve the kit's `--map-marker-color` token to a six-character hex\n * string (no leading `#`) for Google Static Maps' `markers=color:` URL\n * parameter, which requires a literal hex value at fetch time.\n *\n * The token is defined as a direct hex literal in `src/tokens/index.css`\n * (no `var()` indirection), so `getPropertyValue` returns the hex\n * verbatim and we strip the `#`. SSR-safe: when `document` is undefined\n * we fall back to the kit's brand violet (`--color-violet-700`).\n */\nfunction getStaticMapMarkerHex(): string {\n if (typeof document === 'undefined') return '4945a3';\n const raw = getComputedStyle(document.documentElement)\n .getPropertyValue('--map-marker-color')\n .trim();\n const match = /^#?([0-9a-fA-F]{6})$/.exec(raw);\n return match ? match[1] : '4945a3';\n}\n\nfunction StaticMapThumb({\n apiKey,\n center,\n zoom = 14,\n consentGranted,\n}: StaticMapThumbProps) {\n const { t } = useTranslation();\n // Consent-gated. Without grant, render a tinted placeholder with the\n // MapPin glyph — no IP-disclosing third-party load.\n if (!consentGranted || !apiKey) {\n return (\n <div\n aria-hidden=\"true\"\n className={staticMapThumbVariants({ state: 'placeholder' })}\n >\n <MapPin aria-hidden=\"true\" className=\"ds:size-6\" />\n </div>\n );\n }\n // Static Maps URL. 240×160 keeps the asset under the 1MP free tier\n // and looks crisp on 2× displays at the rendered 12rem × 8rem cell.\n // Marker colour is sourced from the `--map-marker-color` token at\n // runtime so the value stays in `src/tokens/**` per the closed-palette\n // constraint (Google's URL parameter can't read a CSS custom prop).\n const markerHex = getStaticMapMarkerHex();\n const src =\n `https://maps.googleapis.com/maps/api/staticmap` +\n `?center=${center.lat},${center.lng}` +\n `&zoom=${zoom}` +\n `&size=240x160&scale=2` +\n `&markers=color:0x${markerHex}%7C${center.lat},${center.lng}` +\n `&key=${encodeURIComponent(apiKey)}`;\n return (\n <img\n src={src}\n alt={t('practiceResults.thumbnail.alt')}\n loading=\"lazy\"\n decoding=\"async\"\n width={240}\n height={160}\n className={staticMapThumbVariants({ state: 'image' })}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* ResultCardBase */\n/* */\n/* Compact card used by `split-list-map` left list and `map-first` rail. */\n/* Avatar + name + subtitle + rating + optional chip row. */\n/* -------------------------------------------------------------------- */\n\nconst resultCardBaseVariants = cva(\n [\n 'ds:relative ds:flex ds:w-full ds:cursor-pointer',\n 'ds:rounded-[var(--radius-lg)]',\n 'ds:bg-[var(--card)] ds:text-[var(--card-foreground)]',\n 'ds:border ds:border-[color:var(--card-border)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:gap-[var(--spacing-md)]',\n 'ds:transition-[box-shadow,border-color] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\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:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n // Use `data-highlighted` for the pin↔card sync visual so consumers\n // can override (e.g. dim siblings) without fighting the kit.\n 'ds:data-[highlighted=true]:border-[color:var(--primary)]',\n 'ds:data-[highlighted=true]:shadow-[var(--shadow-md)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n density: {\n compact: '',\n rich: 'ds:p-[var(--spacing-lg)] ds:gap-[var(--spacing-lg)]',\n },\n },\n defaultVariants: { density: 'compact' },\n },\n);\n\ninterface ResultCardBaseProps {\n result: PracticeResult;\n highlighted: boolean;\n onSelect: () => void;\n onHover: () => void;\n /** Used for layout density (compact vs rich). */\n density?: 'compact' | 'rich';\n children?: ReactNode;\n}\n\nfunction ResultCardBase({\n result,\n highlighted,\n onSelect,\n onHover,\n density = 'compact',\n children,\n}: ResultCardBaseProps) {\n const ratingLabel = result.rating;\n // `<div role=\"link\">` — we can't use a native `<a>` because the rich\n // card carries its own inner Next-Slot anchor and nested <a> is\n // invalid HTML. The consumer's `onResultSelect` is the sole routing\n // hook; the kit's role+tabIndex+keyboard handler give the row the\n // same affordances as an anchor for SR / keyboard users. axe\n // `aria-allowed-role` accepts `link` on `<div>` (not on `<article>`,\n // which is why we don't reach for that semantic root).\n return (\n <div\n data-component=\"practice-result-card\"\n data-result-id={result.id}\n data-highlighted={highlighted ? 'true' : 'false'}\n role=\"link\"\n tabIndex={0}\n aria-labelledby={`practice-result-${result.id}-name`}\n onClick={onSelect}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onSelect();\n }\n }}\n onMouseEnter={onHover}\n onFocus={onHover}\n className={resultCardBaseVariants({ density })}\n >\n <Avatar src={result.imageUrl} name={result.name} size=\"lg\" />\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span\n id={`practice-result-${result.id}-name`}\n className=\"type-title-card ds:text-[var(--foreground)]\"\n >\n {result.name}\n </span>\n {result.subtitle ? (\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)]\">\n {result.subtitle}\n </span>\n ) : null}\n {result.location?.address ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <MapPin aria-hidden=\"true\" className=\"ds:size-3.5 ds:shrink-0\" />\n {result.location.address}\n </span>\n ) : null}\n </div>\n {ratingLabel && ratingLabel.count > 0 ? (\n <Rating\n value={ratingLabel.value}\n reviews={{ count: ratingLabel.count }}\n size=\"sm\"\n />\n ) : null}\n {children}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* RichResultCard */\n/* */\n/* Full-fat card for `rich-cards`. Thumbnail map + distance + language + */\n/* insurance chips + next-slot CTA + anxious-patient badge. */\n/* -------------------------------------------------------------------- */\n\ninterface RichResultCardProps {\n result: PracticeResult;\n apiKey?: string;\n consentGranted: boolean;\n highlighted: boolean;\n onSelect: () => void;\n onHover: () => void;\n}\n\nfunction RichResultCard({\n result,\n apiKey,\n consentGranted,\n highlighted,\n onSelect,\n onHover,\n}: RichResultCardProps) {\n const { t, i18n } = useTranslation();\n const slotLabel = useMemo(() => {\n if (!result.nextAvailableSlot) return undefined;\n try {\n return new Intl.DateTimeFormat(i18n.language, {\n weekday: 'short',\n hour: 'numeric',\n minute: 'numeric',\n }).format(new Date(result.nextAvailableSlot.dateTime));\n } catch {\n return result.nextAvailableSlot.dateTime;\n }\n }, [result.nextAvailableSlot, i18n.language]);\n const showLanguages = (result.languages?.length ?? 0) > 0;\n const showInsurances = (result.insurances?.length ?? 0) > 0;\n const showFearPatient = result.specializedInFearPatients;\n const showChipRow = showLanguages || showInsurances || showFearPatient;\n const distanceKm = result.location?.distanceKm;\n\n return (\n <div\n data-component=\"practice-result-card\"\n data-result-id={result.id}\n data-density=\"rich\"\n data-highlighted={highlighted ? 'true' : 'false'}\n role=\"link\"\n tabIndex={0}\n aria-labelledby={`practice-result-${result.id}-name`}\n onClick={onSelect}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onSelect();\n }\n }}\n onMouseEnter={onHover}\n onFocus={onHover}\n className={resultCardBaseVariants({ density: 'rich' })}\n >\n {result.location ? (\n <StaticMapThumb\n apiKey={apiKey}\n center={{\n lat: result.location.lat,\n lng: result.location.lng,\n }}\n consentGranted={consentGranted}\n />\n ) : null}\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-start ds:gap-[var(--spacing-md)]\">\n <Avatar src={result.imageUrl} name={result.name} size=\"md\" />\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span\n id={`practice-result-${result.id}-name`}\n className=\"type-title-card ds:text-[var(--foreground)]\"\n >\n {result.name}\n </span>\n {distanceKm != null ? (\n <DistanceChip distanceKm={distanceKm} />\n ) : null}\n </div>\n {result.subtitle ? (\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)]\">\n {result.subtitle}\n </span>\n ) : null}\n {result.location?.address ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n <MapPin\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:shrink-0\"\n />\n {result.location.address}\n </span>\n ) : null}\n </div>\n {result.rating && result.rating.count > 0 ? (\n <Rating\n value={result.rating.value}\n reviews={{ count: result.rating.count }}\n size=\"md\"\n />\n ) : null}\n </div>\n {showChipRow ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {showLanguages\n ? (result.languages ?? []).map((lang) => (\n <Tag\n key={`lang-${lang}`}\n label={lang.toUpperCase()}\n variant=\"info\"\n fill=\"outline\"\n size=\"sm\"\n leading={<Languages aria-hidden=\"true\" />}\n />\n ))\n : null}\n {showInsurances\n ? (result.insurances ?? []).map((ins) => (\n <Tag\n key={`ins-${ins}`}\n label={ins}\n variant=\"brand\"\n fill=\"outline\"\n size=\"sm\"\n leading={<ShieldCheck aria-hidden=\"true\" />}\n />\n ))\n : null}\n {showFearPatient ? (\n <Tag\n label={t('practiceResults.fearPatient.label')}\n variant=\"success\"\n fill=\"outline\"\n size=\"sm\"\n leading={<Smile aria-hidden=\"true\" />}\n />\n ) : null}\n </div>\n ) : null}\n {result.nextAvailableSlot && slotLabel ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)] ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <CalendarClock\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[var(--primary)]\"\n />\n {t('practiceResults.nextSlot.summary', { time: slotLabel })}\n </span>\n <Button\n intent=\"primary\"\n size=\"sm\"\n asChild\n onClick={(event) => {\n // The card itself is interactive; clicking the inline\n // CTA must not bubble up and re-fire `onResultSelect`.\n event.stopPropagation();\n }}\n >\n <a\n href={result.nextAvailableSlot.bookingHref}\n data-component=\"practice-result-next-slot-cta\"\n >\n {t('practiceResults.nextSlot.cta', { time: slotLabel })}\n </a>\n </Button>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* ResultsList — scroll container + infinite-scroll observer + skeletons. */\n/* -------------------------------------------------------------------- */\n\ninterface ResultsListProps {\n results: PracticeResult[];\n highlightedId: string | null;\n onCardHover: (id: string) => void;\n onCardSelect: (id: string) => void;\n onLoadMore?: () => void;\n loadingMore?: boolean;\n loadingSkeletons?: boolean;\n density?: 'compact' | 'rich';\n apiKey?: string;\n consentGranted?: boolean;\n /** Ref to the scrollable container so the parent can imperatively\n * scroll a card into view (handle.scrollToResult). */\n containerRef?: React.RefObject<HTMLDivElement>;\n}\n\nfunction ResultsList({\n results,\n highlightedId,\n onCardHover,\n onCardSelect,\n onLoadMore,\n loadingMore,\n loadingSkeletons,\n density = 'compact',\n apiKey,\n consentGranted = false,\n containerRef,\n}: ResultsListProps) {\n const { t } = useTranslation();\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n // IntersectionObserver-driven `onLoadMore`. The kit fires once per\n // \"intersection\" — the consumer is responsible for guarding against\n // double-fires while a request is in-flight (`loadingMore`).\n useEffect(() => {\n if (!onLoadMore) return;\n const node = sentinelRef.current;\n if (!node) return;\n if (typeof IntersectionObserver === 'undefined') return;\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n track('serp_load_more', {\n currentCount: results.length,\n });\n onLoadMore();\n }\n }\n },\n { root: null, rootMargin: '200px' },\n );\n observer.observe(node);\n return () => observer.disconnect();\n // `results.length` is a snapshot at observe-time — re-bind so the\n // telemetry payload reflects the count at firing.\n }, [onLoadMore, results.length]);\n\n if (loadingSkeletons) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={t('practiceResults.loading')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {Array.from({ length: 4 }).map((_, i) => (\n <Skeleton\n key={`pr-skel-${i}`}\n variant=\"rounded\"\n height={density === 'rich' ? '11rem' : '7rem'}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n data-component=\"practice-results-list\"\n role=\"list\"\n aria-label={t('practiceResults.list.label')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:overflow-y-auto\"\n >\n {results.map((result) => (\n <div key={result.id} role=\"listitem\">\n {density === 'rich' ? (\n <RichResultCard\n result={result}\n apiKey={apiKey}\n consentGranted={consentGranted}\n highlighted={highlightedId === result.id}\n onSelect={() => onCardSelect(result.id)}\n onHover={() => onCardHover(result.id)}\n />\n ) : (\n <ResultCardBase\n result={result}\n highlighted={highlightedId === result.id}\n onSelect={() => onCardSelect(result.id)}\n onHover={() => onCardHover(result.id)}\n />\n )}\n </div>\n ))}\n {onLoadMore ? (\n <div\n ref={sentinelRef}\n aria-hidden=\"true\"\n className=\"ds:flex ds:items-center ds:justify-center ds:py-[var(--spacing-md)]\"\n >\n {loadingMore ? (\n <Spinner size=\"md\" variant=\"pulse\" />\n ) : (\n <span className=\"ds:size-1\" />\n )}\n </div>\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* MapPanel — wraps MapView with markers + bounds-change tracking. */\n/* -------------------------------------------------------------------- */\n\ninterface MapPanelProps {\n results: PracticeResult[];\n searchCentre?: { lat: number; lng: number };\n zoom: number;\n apiKey?: string;\n highlightedId: string | null;\n onPinClick: (id: string) => void;\n onPinHover: (id: string) => void;\n /**\n * Fires once per pin per session (de-duped at the root). Use to emit\n * the `serp_result_hovered_pin` telemetry without re-firing on every\n * click of the same pin. The kit's MapView wrapper only surfaces\n * click events from vis.gl AdvancedMarker (no native hover), so this\n * approximates \"the patient noticed a pin\" rather than a true mouse\n * hover.\n */\n onPinFirstInteract: (id: string) => void;\n onBoundsChange?: (bounds: PracticeResultsBounds) => void;\n consentGranted?: boolean;\n onConsentRequest?: () => void;\n}\n\nfunction MapPanel({\n results,\n searchCentre,\n zoom,\n apiKey,\n highlightedId,\n onPinClick,\n onPinHover,\n onPinFirstInteract,\n onBoundsChange,\n consentGranted,\n onConsentRequest,\n}: MapPanelProps) {\n const { t } = useTranslation();\n // Filter to results that carry a location — pins-without-coordinates\n // would land at 0,0.\n const markers = useMemo<MapMarker[]>(\n () =>\n results\n .filter(\n (\n result,\n ): result is PracticeResult & {\n location: { lat: number; lng: number };\n } => Boolean(result.location),\n )\n .map((result) => ({\n id: result.id,\n position: {\n lat: result.location.lat,\n lng: result.location.lng,\n },\n label: result.name,\n })),\n [results],\n );\n\n // Auto-fit centre: prefer the explicit `searchCentre`; otherwise use\n // the centroid of all visible markers; otherwise fall back to a safe\n // default (Milano).\n const center = useMemo(() => {\n if (searchCentre) return searchCentre;\n const bounds = boundsForResults(results);\n if (bounds) {\n return {\n lat: (bounds.north + bounds.south) / 2,\n lng: (bounds.east + bounds.west) / 2,\n };\n }\n return { lat: 45.4642, lng: 9.19 };\n }, [results, searchCentre]);\n\n // `serp_map_panned` fires on bbox change. The MapView itself doesn't\n // surface a bounds callback yet — until it does, we wire a passive\n // hover-on-pin handler to surface the events the prompt asks for.\n // The consumer's `onBoundsChange` still has to be invoked when bounds\n // *do* arrive; for now, we surface a one-shot synthetic call once\n // markers settle so the consumer can begin its bbox-based search.\n useEffect(() => {\n if (!onBoundsChange) return;\n const bounds = boundsForResults(results);\n if (!bounds) return;\n onBoundsChange(bounds);\n track('serp_map_panned', { bounds });\n }, [results, onBoundsChange]);\n\n // Pin hover is impossible to wire through Google Maps' AdvancedMarker\n // wrapper today (vis.gl exposes click only). The kit's data-component\n // ring still lets a consumer DOM-snoop, but for SR users the pin row\n // can't drive a hover state. We expose a `focusPin` imperative handle\n // instead so deep-link → pin highlight works via React, not DOM\n // hover events.\n //\n // TODO(`data-component=\"practice-result-pin\"`): The 0.31.0 prompt asks\n // for a per-pin `data-component` marker so agents / consumers can\n // target individual pins. The MapView's AdvancedMarker wrapper\n // doesn't currently expose a custom-attribute prop — adding it\n // requires changes to `src/components/map-view/map-view.tsx`. Until\n // that lands, agents use `handle.focusPin(id)` for pin-level\n // imperative access.\n return (\n <div\n data-component=\"practice-results-map-panel\"\n className=\"ds:relative ds:flex ds:size-full ds:min-h-[24rem] ds:flex-col\"\n >\n <MapView\n apiKey={apiKey ?? ''}\n center={center}\n zoom={zoom}\n markers={markers}\n selectedMarkerId={highlightedId}\n consentGranted={Boolean(consentGranted)}\n onConsentRequest={onConsentRequest}\n onMarkerClick={(id) => {\n if (id == null) return;\n onPinHover(id);\n onPinFirstInteract(id);\n onPinClick(id);\n }}\n ariaLabel={t('practiceResults.map.label')}\n size=\"lg\"\n surface=\"bordered\"\n className=\"ds:size-full\"\n />\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* SplitListMapBody — desktop two-column, mobile list + \"Vedi mappa\". */\n/* -------------------------------------------------------------------- */\n\ninterface VariantBodyProps {\n results: PracticeResult[];\n totalCount?: number;\n searchCentre?: PracticeResultsProps['searchCentre'];\n facets: FacetGroup[];\n value: PracticeResultsValue;\n onChange: (next: PracticeResultsValue) => void;\n onResultSelect: PracticeResultsProps['onResultSelect'];\n onLoadMore?: PracticeResultsProps['onLoadMore'];\n loadingMore?: boolean;\n apiKey?: string;\n zoom: number;\n consentGranted?: boolean;\n onConsentRequest?: () => void;\n onBoundsChange?: PracticeResultsProps['onBoundsChange'];\n loadingSkeletons: boolean;\n emptyResultsSlot?: ReactNode;\n errorSlot?: ReactNode;\n error?: boolean;\n onRetry?: () => void;\n heading?: string;\n intro?: string;\n /** Highlight + sync state. */\n highlightedId: string | null;\n onCardHover: (id: string) => void;\n onPinClick: (id: string) => void;\n onPinFirstInteract: (id: string) => void;\n /** Imperative ref to the scrollable list container. */\n listContainerRef: React.RefObject<HTMLDivElement>;\n}\n\nfunction HeaderRow({\n variantBodyProps,\n}: {\n variantBodyProps: VariantBodyProps;\n}) {\n const { facets, value, onChange, heading, intro, totalCount, searchCentre } =\n variantBodyProps;\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <HeaderBlock\n heading={heading}\n intro={intro}\n totalCount={totalCount}\n searchCentreLabel={searchCentre?.label}\n />\n {facets.length > 0 ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <FilterChipRow\n facets={facets}\n value={value.facets}\n onChange={(next) => onChange({ ...value, facets: next })}\n />\n <SortControl\n value={value.sort ?? 'relevance'}\n onChange={(next) => onChange({ ...value, sort: next })}\n />\n </div>\n ) : (\n <div className=\"ds:flex ds:justify-end\">\n <SortControl\n value={value.sort ?? 'relevance'}\n onChange={(next) => onChange({ ...value, sort: next })}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction DefaultEmpty() {\n const { t } = useTranslation();\n return (\n <EmptyState\n variant=\"no-results\"\n title={t('practiceResults.empty.title')}\n description={t('practiceResults.empty.description')}\n />\n );\n}\n\nfunction DefaultError({ onRetry }: { onRetry?: () => void }) {\n const { t } = useTranslation();\n return (\n <Alert variant=\"error\">\n <Alert.Title as=\"h3\">{t('practiceResults.error.title')}</Alert.Title>\n <Alert.Description>\n {t('practiceResults.error.description')}\n </Alert.Description>\n {onRetry ? (\n <Alert.Action>\n <Button\n intent=\"secondary\"\n size=\"sm\"\n startIcon={<RefreshCw aria-hidden=\"true\" />}\n onClick={onRetry}\n >\n {t('practiceResults.error.retry')}\n </Button>\n </Alert.Action>\n ) : null}\n </Alert>\n );\n}\n\nfunction SplitListMapBody(props: VariantBodyProps) {\n const {\n results,\n apiKey,\n zoom,\n searchCentre,\n onLoadMore,\n loadingMore,\n loadingSkeletons,\n emptyResultsSlot,\n errorSlot,\n error,\n onRetry,\n highlightedId,\n onCardHover,\n onPinClick,\n consentGranted,\n onConsentRequest,\n onBoundsChange,\n listContainerRef,\n } = props;\n const { t } = useTranslation();\n const [mobileMapOpen, setMobileMapOpen] = useState(false);\n\n const body = error ? (\n (errorSlot ?? <DefaultError onRetry={onRetry} />)\n ) : results.length === 0 && !loadingSkeletons ? (\n (emptyResultsSlot ?? <DefaultEmpty />)\n ) : (\n <ResultsList\n results={results}\n highlightedId={highlightedId}\n onCardHover={onCardHover}\n onCardSelect={(id) =>\n emitResultClick(results, id, 'card', props.onResultSelect)\n }\n onLoadMore={onLoadMore}\n loadingMore={loadingMore}\n loadingSkeletons={loadingSkeletons}\n density=\"compact\"\n containerRef={listContainerRef}\n />\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <HeaderRow variantBodyProps={props} />\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:lg:grid ds:lg:grid-cols-[55%_45%] ds:lg:gap-[var(--spacing-lg)] ds:lg:items-start\">\n <div className=\"ds:min-w-0 ds:lg:max-h-[40rem] ds:lg:overflow-hidden\">\n {body}\n </div>\n <div className=\"ds:hidden ds:lg:block ds:sticky ds:top-[var(--spacing-md)] ds:h-[40rem]\">\n <MapPanel\n results={results}\n searchCentre={searchCentre}\n zoom={zoom}\n apiKey={apiKey}\n highlightedId={highlightedId}\n onPinClick={(id) => {\n emitResultClick(results, id, 'pin', props.onResultSelect);\n onPinClick(id);\n }}\n onPinHover={onCardHover}\n onPinFirstInteract={props.onPinFirstInteract}\n onBoundsChange={onBoundsChange}\n consentGranted={consentGranted}\n onConsentRequest={onConsentRequest}\n />\n </div>\n </div>\n {/* Mobile: sticky \"Vedi mappa\" CTA — bottom-of-viewport. */}\n <div className=\"ds:flex ds:lg:hidden ds:sticky ds:bottom-[var(--spacing-md)] ds:justify-center\">\n <Button\n intent=\"primary\"\n size=\"md\"\n startIcon={<MapIcon aria-hidden=\"true\" />}\n onClick={() => setMobileMapOpen(true)}\n >\n {t('practiceResults.viewMap')}\n </Button>\n </div>\n <Sheet.Root open={mobileMapOpen} onOpenChange={setMobileMapOpen}>\n <Sheet.Content side=\"bottom\" size=\"lg\">\n <Sheet.Header>\n <Sheet.Title>{t('practiceResults.map.label')}</Sheet.Title>\n </Sheet.Header>\n <Sheet.Body>\n <Sheet.Description className=\"ds:sr-only\">\n {t('practiceResults.sheet.description')}\n </Sheet.Description>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:h-[20rem]\">\n <MapPanel\n results={results}\n searchCentre={searchCentre}\n zoom={zoom}\n apiKey={apiKey}\n highlightedId={highlightedId}\n onPinClick={(id) => {\n emitResultClick(results, id, 'pin', props.onResultSelect);\n onPinClick(id);\n }}\n onPinHover={onCardHover}\n onPinFirstInteract={props.onPinFirstInteract}\n onBoundsChange={onBoundsChange}\n consentGranted={consentGranted}\n onConsentRequest={onConsentRequest}\n />\n </div>\n {body}\n </div>\n </Sheet.Body>\n </Sheet.Content>\n </Sheet.Root>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* MapFirstBody — map dominant, list rail. */\n/* -------------------------------------------------------------------- */\n\ntype MapFirstSheetState = 'peek' | 'half' | 'full';\n\nconst SHEET_STATE_SIZE: Record<MapFirstSheetState, 'sm' | 'md' | 'lg'> = {\n peek: 'sm',\n half: 'md',\n full: 'lg',\n};\n\nconst SNAP_STATES: readonly MapFirstSheetState[] = [\n 'peek',\n 'half',\n 'full',\n] as const;\n\ninterface SheetSnapRadioGroupProps {\n value: MapFirstSheetState;\n onChange: (next: MapFirstSheetState) => void;\n}\n\n/**\n * WAI-ARIA radiogroup for the mobile bottom-sheet's snap state. Only\n * the checked option lives in the tab stop; arrow keys cycle through\n * options and update the checked state in one motion (per the radio\n * pattern). RTL inverts the horizontal arrow keys so ArrowRight always\n * means \"logical next\".\n */\nfunction SheetSnapRadioGroup({ value, onChange }: SheetSnapRadioGroupProps) {\n const { t, i18n } = useTranslation();\n const isRTL = i18n.dir() === 'rtl';\n const buttonRefs = useRef<Map<MapFirstSheetState, HTMLButtonElement>>(\n new Map(),\n );\n const focusAt = useCallback((state: MapFirstSheetState) => {\n buttonRefs.current.get(state)?.focus();\n }, []);\n const handleKeyDown = useCallback(\n (\n event: React.KeyboardEvent<HTMLButtonElement>,\n current: MapFirstSheetState,\n ) => {\n const idx = SNAP_STATES.indexOf(current);\n const total = SNAP_STATES.length;\n const forwardKey = isRTL ? 'ArrowLeft' : 'ArrowRight';\n const backwardKey = isRTL ? 'ArrowRight' : 'ArrowLeft';\n let next: MapFirstSheetState | null = null;\n switch (event.key) {\n case forwardKey:\n case 'ArrowDown':\n next = SNAP_STATES[(idx + 1) % total];\n break;\n case backwardKey:\n case 'ArrowUp':\n next = SNAP_STATES[(idx - 1 + total) % total];\n break;\n case 'Home':\n next = SNAP_STATES[0];\n break;\n case 'End':\n next = SNAP_STATES[total - 1];\n break;\n default:\n return;\n }\n event.preventDefault();\n if (next && next !== current) onChange(next);\n if (next) focusAt(next);\n },\n [focusAt, isRTL, onChange],\n );\n return (\n <div\n role=\"radiogroup\"\n aria-label={t('practiceResults.sheet.snap.label')}\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-2xs)]\"\n >\n {SNAP_STATES.map((state) => {\n const isChecked = value === state;\n return (\n <button\n key={state}\n ref={(node) => {\n if (node) buttonRefs.current.set(state, node);\n else buttonRefs.current.delete(state);\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isChecked}\n aria-label={t(`practiceResults.sheet.snap.${state}`)}\n tabIndex={isChecked ? 0 : -1}\n onClick={() => onChange(state)}\n onKeyDown={(event) => handleKeyDown(event, state)}\n className={facetChipVariants({\n state: isChecked ? 'active' : 'idle',\n })}\n >\n {t(`practiceResults.sheet.snap.${state}`)}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction MapFirstBody(props: VariantBodyProps) {\n const {\n results,\n apiKey,\n zoom,\n searchCentre,\n onLoadMore,\n loadingMore,\n loadingSkeletons,\n emptyResultsSlot,\n errorSlot,\n error,\n onRetry,\n highlightedId,\n onCardHover,\n onPinClick,\n consentGranted,\n onConsentRequest,\n onBoundsChange,\n listContainerRef,\n facets,\n value,\n onChange,\n } = props;\n const { t } = useTranslation();\n // Bottom-sheet open + snap state. The kit's Sheet ships three discrete\n // size tokens (sm/md/lg) — until drag-snap lands as a primitive, we\n // cycle between them on button presses, which lets a patient promote\n // the result list to \"full\" without re-opening the sheet.\n const [sheetState, setSheetState] = useState<MapFirstSheetState>('peek');\n const [sheetOpen, setSheetOpen] = useState(true);\n const sheetSize = SHEET_STATE_SIZE[sheetState];\n\n const listContent = error ? (\n (errorSlot ?? <DefaultError onRetry={onRetry} />)\n ) : results.length === 0 && !loadingSkeletons ? (\n (emptyResultsSlot ?? <DefaultEmpty />)\n ) : (\n <ResultsList\n results={results}\n highlightedId={highlightedId}\n onCardHover={onCardHover}\n onCardSelect={(id) =>\n emitResultClick(results, id, 'card', props.onResultSelect)\n }\n onLoadMore={onLoadMore}\n loadingMore={loadingMore}\n loadingSkeletons={loadingSkeletons}\n density=\"rich\"\n apiKey={apiKey}\n consentGranted={consentGranted}\n containerRef={listContainerRef}\n />\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <HeaderBlock\n heading={props.heading}\n intro={props.intro}\n totalCount={props.totalCount}\n searchCentreLabel={searchCentre?.label}\n />\n {/* Desktop: 65/35 map+list. Mobile: full-bleed map + Sheet. */}\n <div className=\"ds:hidden ds:lg:grid ds:lg:grid-cols-[65%_35%] ds:lg:gap-[var(--spacing-lg)] ds:lg:items-start\">\n <div className=\"ds:relative ds:h-[40rem]\">\n <MapPanel\n results={results}\n searchCentre={searchCentre}\n zoom={zoom}\n apiKey={apiKey}\n highlightedId={highlightedId}\n onPinClick={(id) => {\n emitResultClick(results, id, 'pin', props.onResultSelect);\n onPinClick(id);\n }}\n onPinHover={onCardHover}\n onPinFirstInteract={props.onPinFirstInteract}\n onBoundsChange={onBoundsChange}\n consentGranted={consentGranted}\n onConsentRequest={onConsentRequest}\n />\n {/* Floating filter strip — overlaid on the map's top edge. */}\n {facets.length > 0 ? (\n <div className=\"ds:absolute ds:start-[var(--spacing-md)] ds:top-[var(--spacing-md)] ds:max-w-[80%]\">\n <FilterChipRow\n facets={facets}\n value={value.facets}\n onChange={(next) => onChange({ ...value, facets: next })}\n floating\n />\n </div>\n ) : null}\n </div>\n <div className=\"ds:min-w-0 ds:max-h-[40rem] ds:overflow-y-auto\">\n {listContent}\n </div>\n </div>\n <div className=\"ds:flex ds:lg:hidden ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:relative ds:h-[60vh] ds:min-h-[20rem]\">\n <MapPanel\n results={results}\n searchCentre={searchCentre}\n zoom={zoom}\n apiKey={apiKey}\n highlightedId={highlightedId}\n onPinClick={(id) => {\n emitResultClick(results, id, 'pin', props.onResultSelect);\n onPinClick(id);\n }}\n onPinHover={onCardHover}\n onPinFirstInteract={props.onPinFirstInteract}\n onBoundsChange={onBoundsChange}\n consentGranted={consentGranted}\n onConsentRequest={onConsentRequest}\n />\n {facets.length > 0 ? (\n <div className=\"ds:absolute ds:start-[var(--spacing-md)] ds:top-[var(--spacing-md)] ds:max-w-[calc(100%-var(--spacing-lg))]\">\n <FilterChipRow\n facets={facets}\n value={value.facets}\n onChange={(next) => onChange({ ...value, facets: next })}\n floating\n />\n </div>\n ) : null}\n </div>\n <Sheet.Root open={sheetOpen} onOpenChange={setSheetOpen}>\n <Sheet.Content side=\"bottom\" size={sheetSize}>\n <Sheet.Header>\n <Sheet.Title>\n {t('practiceResults.sheet.title', {\n count: props.totalCount ?? results.length,\n })}\n </Sheet.Title>\n </Sheet.Header>\n <Sheet.Body>\n <Sheet.Description className=\"ds:sr-only\">\n {t('practiceResults.sheet.descriptionMapFirst')}\n </Sheet.Description>\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]\">\n <SortControl\n value={value.sort ?? 'relevance'}\n onChange={(next) => onChange({ ...value, sort: next })}\n />\n <SheetSnapRadioGroup\n value={sheetState}\n onChange={setSheetState}\n />\n </div>\n {listContent}\n </Sheet.Body>\n </Sheet.Content>\n </Sheet.Root>\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* RichCardsBody — vertical column of rich cards. */\n/* -------------------------------------------------------------------- */\n\nfunction RichCardsBody(props: VariantBodyProps) {\n const {\n results,\n apiKey,\n onLoadMore,\n loadingMore,\n loadingSkeletons,\n emptyResultsSlot,\n errorSlot,\n error,\n onRetry,\n highlightedId,\n onCardHover,\n consentGranted,\n listContainerRef,\n } = props;\n\n const body = error ? (\n (errorSlot ?? <DefaultError onRetry={onRetry} />)\n ) : results.length === 0 && !loadingSkeletons ? (\n (emptyResultsSlot ?? <DefaultEmpty />)\n ) : (\n <ResultsList\n results={results}\n highlightedId={highlightedId}\n onCardHover={onCardHover}\n onCardSelect={(id) =>\n emitResultClick(results, id, 'card', props.onResultSelect)\n }\n onLoadMore={onLoadMore}\n loadingMore={loadingMore}\n loadingSkeletons={loadingSkeletons}\n density=\"rich\"\n apiKey={apiKey}\n consentGranted={consentGranted}\n containerRef={listContainerRef}\n />\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <HeaderRow variantBodyProps={props} />\n {body}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* PracticeResults */\n/* -------------------------------------------------------------------- */\n\nexport const PracticeResults = forwardRef<\n PracticeResultsHandle,\n PracticeResultsProps\n>(function PracticeResults(\n {\n variant = 'split-list-map',\n results,\n totalCount,\n searchCentre,\n facets,\n googleMapsApiKey,\n defaultZoom = DEFAULT_ZOOM,\n onBoundsChange,\n consentGranted,\n onConsentRequest,\n onLoadMore,\n loadingMore,\n value,\n onChange,\n onResultSelect,\n loading,\n emptyResultsSlot,\n errorSlot,\n error,\n onRetry,\n heading,\n intro,\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useTranslation();\n\n // Track which card / pin is currently highlighted for the pin↔card\n // sync visual. Lives at the root so hover on either side updates the\n // other.\n const [highlightedId, setHighlightedId] = useState<string | null>(null);\n // Once-per-card hover telemetry de-dupe. PostHog charges per event;\n // we don't want to flood it with re-hovers on the same card.\n const hoveredCardIdsRef = useRef<Set<string>>(new Set());\n const hoveredPinIdsRef = useRef<Set<string>>(new Set());\n\n // Imperative handle — `scrollToResult` finds the card by id within the\n // currently-rendered list and scrolls it into view; `focusPin` updates\n // the highlight state which feeds the embedded MapView's\n // `selectedMarkerId`.\n const listContainerRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const handle = useMemo<PracticeResultsHandle>(\n () => ({\n getVariant: () => variant,\n scrollToResult: (resultId: string) => {\n const root = rootRef.current;\n if (!root) return;\n const card = root.querySelector<HTMLElement>(\n `[data-component=\"practice-result-card\"][data-result-id=\"${CSS.escape(resultId)}\"]`,\n );\n if (!card) return;\n card.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n setHighlightedId(resultId);\n },\n focusPin: (resultId: string) => {\n setHighlightedId(resultId);\n },\n }),\n [variant],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(practiceResultsAgent, handle, id);\n\n // `serp_variant_exposed` — fire once per variant assignment.\n const exposedRef = useRef<PracticeResultsVariant | null>(null);\n useEffect(() => {\n if (exposedRef.current === variant) return;\n exposedRef.current = variant;\n track('serp_variant_exposed', {\n variant,\n totalCount: totalCount ?? results.length,\n });\n // Reset per-card de-dupe so the new variant doesn't share state.\n hoveredCardIdsRef.current = new Set();\n hoveredPinIdsRef.current = new Set();\n // Intentionally omit totalCount / results.length so the event fires\n // once per variant, not once per render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [variant]);\n\n // `serp_empty_results` — fire when the visible (filtered) list drops\n // to zero. Compared against the most-recent emit so consecutive\n // empties don't flood telemetry.\n const lastEmptyEmitRef = useRef<boolean>(false);\n\n // Resolved values: facets default to []; sort defaults to 'distance'\n // when searchCentre is set, otherwise 'relevance'. `resolvedFacets`\n // is memoised so the `processedResults` useMemo below doesn't\n // re-invalidate on every render when the consumer passes `undefined`\n // and `?? []` allocates a fresh array.\n const resolvedFacets = useMemo(() => facets ?? [], [facets]);\n const resolvedSort = value.sort ?? (searchCentre ? 'distance' : 'relevance');\n\n // Apply filters + sort. The kit does this client-side so consumers\n // get the right ordering without re-querying — the consumer's backend\n // is still free to pre-sort, but the kit's `sort` switch never\n // requires a network round-trip.\n const processedResults = useMemo(() => {\n const filtered = applyFilters(results, value.facets, resolvedFacets);\n return applySort(filtered, resolvedSort, searchCentre);\n }, [results, value.facets, resolvedFacets, resolvedSort, searchCentre]);\n\n useEffect(() => {\n const isEmpty = processedResults.length === 0;\n if (isEmpty && !lastEmptyEmitRef.current) {\n track('serp_empty_results', {\n appliedFacets: value.facets ?? {},\n });\n lastEmptyEmitRef.current = true;\n } else if (!isEmpty) {\n lastEmptyEmitRef.current = false;\n }\n }, [processedResults.length, value.facets]);\n\n // Hover debounce — `serp_result_hovered_card` only fires after 500ms\n // of continuous hover on the same card AND only once per card per\n // session. Per the prompt's instrumentation spec — distinguishes\n // genuine intent signals from accidental drag-throughs.\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastHoverIdRef = useRef<string | null>(null);\n useEffect(\n () => () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n },\n [],\n );\n const onCardHover = useCallback((resultId: string) => {\n setHighlightedId(resultId);\n // De-dupe: already-tracked-this-session cards skip the debounce\n // entirely so we don't queue a no-op timer.\n if (hoveredCardIdsRef.current.has(resultId)) return;\n if (lastHoverIdRef.current === resultId && hoverTimerRef.current) {\n return;\n }\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n lastHoverIdRef.current = resultId;\n hoverTimerRef.current = setTimeout(() => {\n if (!hoveredCardIdsRef.current.has(resultId)) {\n hoveredCardIdsRef.current.add(resultId);\n track('serp_result_hovered_card', { resultId });\n }\n hoverTimerRef.current = null;\n }, 500);\n }, []);\n const onPinClick = useCallback((resultId: string) => {\n setHighlightedId(resultId);\n // Scroll the matching card into view (split-list-map / map-first\n // behaviour — rich-cards has no map so this is unreachable there).\n const root = rootRef.current;\n if (!root) return;\n const card = root.querySelector<HTMLElement>(\n `[data-component=\"practice-result-card\"][data-result-id=\"${CSS.escape(resultId)}\"]`,\n );\n card?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, []);\n // Once-per-pin telemetry de-dupe. `onPinFirstInteract` fires on the\n // first marker click per pin per session; subsequent clicks update\n // the highlight but don't re-fire `serp_result_hovered_pin`.\n const onPinFirstInteract = useCallback((resultId: string) => {\n if (hoveredPinIdsRef.current.has(resultId)) return;\n hoveredPinIdsRef.current.add(resultId);\n track('serp_result_hovered_pin', { resultId });\n }, []);\n\n // SSR-first: only render skeletons when the consumer is actively\n // loading AND has nothing to show. A server-rendered list keeps its\n // bones during hydration even if the consumer flips `loading` on its\n // background re-fetch.\n const loadingSkeletons = Boolean(loading) && results.length === 0;\n\n const bodyProps: VariantBodyProps = {\n results: processedResults,\n totalCount,\n searchCentre,\n facets: resolvedFacets,\n value: { ...value, sort: resolvedSort },\n onChange,\n onResultSelect,\n onLoadMore,\n loadingMore,\n apiKey: googleMapsApiKey,\n zoom: defaultZoom,\n consentGranted,\n onConsentRequest,\n onBoundsChange,\n loadingSkeletons,\n emptyResultsSlot,\n errorSlot,\n error,\n onRetry,\n heading,\n intro,\n highlightedId,\n onCardHover,\n onPinClick,\n onPinFirstInteract,\n listContainerRef,\n };\n\n const body = (() => {\n switch (variant) {\n case 'map-first':\n return <MapFirstBody {...bodyProps} />;\n case 'rich-cards':\n return <RichCardsBody {...bodyProps} />;\n case 'split-list-map':\n default:\n return <SplitListMapBody {...bodyProps} />;\n }\n })();\n\n const resolvedAriaLabel = ariaLabel ?? t('practiceResults.regionLabel');\n\n return (\n <div\n ref={rootRef}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n id={id}\n data-component=\"practice-results\"\n data-component-id={id}\n data-variant={variant}\n className={rootVariants({ variant, className })}\n {...rest}\n >\n {body}\n </div>\n );\n});\n\nPracticeResults.displayName = 'PracticeResults';\n"],"names":["__iconNode","Languages","createLucideIcon","Map","ShieldCheck","practiceResultsAgent","handle","args","DEFAULT_ZOOM","SORT_OPTIONS","track","event","payload","fn","emitResultClick","results","id","source","onResultSelect","position","r","result","haversineKm","a","b","dLat","dLng","lat1","lat2","sinDLat","sinDLng","h","applyFilters","facets","facetGroups","group","selected","field","v","applySort","sort","searchCentre","decorated","distanceKm","compare","av","_a","_b","_c","bv","_d","boundsForResults","north","south","east","west","anyPoint","lat","lng","rootVariants","cva","HeaderBlock","heading","intro","totalCount","searchCentreLabel","t","useTranslation","summary","jsxs","jsx","facetChipVariants","filterChipRowVariants","clearFiltersButtonVariants","FilterChipRow","value","onChange","floating","selections","useMemo","hasAnyActive","arr","updateFacet","key","values","next","toggleBoolean","isActive","toggleOption","option","current","active","isBoolean","countSuffix","DropdownMenu","ChevronDown","SortControl","labelFor","DistanceChip","i18n","label","formatted","Tag","MapPin","staticMapThumbVariants","getStaticMapMarkerHex","raw","match","StaticMapThumb","apiKey","center","zoom","consentGranted","markerHex","src","resultCardBaseVariants","ResultCardBase","highlighted","onSelect","onHover","density","children","ratingLabel","Avatar","Rating","RichResultCard","slotLabel","showLanguages","showInsurances","showFearPatient","showChipRow","lang","ins","Smile","CalendarClock","Button","ResultsList","highlightedId","onCardHover","onCardSelect","onLoadMore","loadingMore","loadingSkeletons","containerRef","sentinelRef","useRef","useEffect","node","observer","entries","entry","_","i","Skeleton","Spinner","MapPanel","onPinClick","onPinHover","onPinFirstInteract","onBoundsChange","onConsentRequest","markers","bounds","MapView","HeaderRow","variantBodyProps","DefaultEmpty","EmptyState","DefaultError","onRetry","Alert","RefreshCw","SplitListMapBody","props","emptyResultsSlot","errorSlot","error","listContainerRef","mobileMapOpen","setMobileMapOpen","useState","body","MapIcon","Sheet","SHEET_STATE_SIZE","SNAP_STATES","SheetSnapRadioGroup","isRTL","buttonRefs","focusAt","useCallback","state","handleKeyDown","idx","total","forwardKey","backwardKey","isChecked","MapFirstBody","sheetState","setSheetState","sheetOpen","setSheetOpen","sheetSize","listContent","RichCardsBody","PracticeResults","forwardRef","variant","googleMapsApiKey","defaultZoom","loading","ariaLabel","className","rest","ref","setHighlightedId","hoveredCardIdsRef","hoveredPinIdsRef","rootRef","resultId","root","card","useImperativeHandle","useAgentRegistration","exposedRef","lastEmptyEmitRef","resolvedFacets","resolvedSort","processedResults","filtered","isEmpty","hoverTimerRef","lastHoverIdRef","bodyProps","resolvedAriaLabel"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -0,0 +1,17 @@
1
+ import { c as e } from "./createLucideIcon-CrFbzy84.js";
2
+ /**
3
+ * @license lucide-react v1.8.0 - ISC
4
+ *
5
+ * This source code is licensed under the ISC license.
6
+ * See the LICENSE file in the root directory of this source tree.
7
+ */
8
+ const c = [
9
+ ["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
10
+ ["path", { d: "M21 3v5h-5", key: "1q7to0" }],
11
+ ["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
12
+ ["path", { d: "M8 16H3v5", key: "1cv678" }]
13
+ ], a = e("refresh-cw", c);
14
+ export {
15
+ a as R
16
+ };
17
+ //# sourceMappingURL=refresh-cw-CC8jSKMr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-cw-CC8jSKMr.js","sources":["../../node_modules/lucide-react/dist/esm/icons/refresh-cw.js"],"sourcesContent":["/**\n * @license lucide-react v1.8.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.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n"],"names":["__iconNode","RefreshCw","createLucideIcon"],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,sDAAsD,KAAK,SAAQ,CAAE;AAAA,EACnF,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAQ,CAAE;AAAA,EAC3C,CAAC,QAAQ,EAAE,GAAG,uDAAuD,KAAK,SAAQ,CAAE;AAAA,EACpF,CAAC,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAQ,CAAE;AAC5C,GACMC,IAAYC,EAAiB,cAAcF,CAAU;","x_google_ignoreList":[0]}
@@ -0,0 +1,17 @@
1
+ import { c as e } from "./createLucideIcon-CrFbzy84.js";
2
+ /**
3
+ * @license lucide-react v1.8.0 - ISC
4
+ *
5
+ * This source code is licensed under the ISC license.
6
+ * See the LICENSE file in the root directory of this source tree.
7
+ */
8
+ const y = [
9
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
10
+ ["path", { d: "M8 14s1.5 2 4 2 4-2 4-2", key: "1y1vjs" }],
11
+ ["line", { x1: "9", x2: "9.01", y1: "9", y2: "9", key: "yxxnd0" }],
12
+ ["line", { x1: "15", x2: "15.01", y1: "9", y2: "9", key: "1p4y9e" }]
13
+ ], i = e("smile", y);
14
+ export {
15
+ i as S
16
+ };
17
+ //# sourceMappingURL=smile-BSYLAHy6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smile-BSYLAHy6.js","sources":["../../node_modules/lucide-react/dist/esm/icons/smile.js"],"sourcesContent":["/**\n * @license lucide-react v1.8.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.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M8 14s1.5 2 4 2 4-2 4-2\", key: \"1y1vjs\" }],\n [\"line\", { x1: \"9\", x2: \"9.01\", y1: \"9\", y2: \"9\", key: \"yxxnd0\" }],\n [\"line\", { x1: \"15\", x2: \"15.01\", y1: \"9\", y2: \"9\", key: \"1p4y9e\" }]\n];\nconst Smile = createLucideIcon(\"smile\", __iconNode);\n\nexport { __iconNode, Smile as default };\n//# sourceMappingURL=smile.js.map\n"],"names":["__iconNode","Smile","createLucideIcon"],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa;AAAA,EACjB,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,MAAM,KAAK,UAAU;AAAA,EACzD,CAAC,QAAQ,EAAE,GAAG,2BAA2B,KAAK,SAAQ,CAAE;AAAA,EACxD,CAAC,QAAQ,EAAE,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,KAAK,SAAQ,CAAE;AAAA,EACjE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,KAAK,SAAQ,CAAE;AACrE,GACMC,IAAQC,EAAiB,SAASF,CAAU;","x_google_ignoreList":[0]}
@@ -1,68 +1,55 @@
1
- import { jsxs as z, jsx as s } from "react/jsx-runtime";
2
- import { forwardRef as N } from "react";
3
- import { c as l } from "./index-D2ZczOXr.js";
4
- import { useTranslation as T } from "react-i18next";
5
- import { C as M } from "./check-DPdL_Sm7.js";
6
- import { c as t } from "./createLucideIcon-CrFbzy84.js";
1
+ import { jsxs as N, jsx as s } from "react/jsx-runtime";
2
+ import { forwardRef as T } from "react";
3
+ import { c } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as C } from "react-i18next";
5
+ import { C as I } from "./check-DPdL_Sm7.js";
6
+ import { C as k } from "./calendar-clock-CYkcqdwl.js";
7
7
  import { F as _ } from "./file-text-DSNuv2B8.js";
8
+ import { c as l } from "./createLucideIcon-CrFbzy84.js";
8
9
  /**
9
10
  * @license lucide-react v1.8.0 - ISC
10
11
  *
11
12
  * This source code is licensed under the ISC license.
12
13
  * See the LICENSE file in the root directory of this source tree.
13
14
  */
14
- const I = [
15
+ const A = [
15
16
  ["path", { d: "M17 7 7 17", key: "15tmo1" }],
16
17
  ["path", { d: "M17 17H7V7", key: "1org7z" }]
17
- ], C = t("arrow-down-left", I);
18
+ ], E = l("arrow-down-left", A);
18
19
  /**
19
20
  * @license lucide-react v1.8.0 - ISC
20
21
  *
21
22
  * This source code is licensed under the ISC license.
22
23
  * See the LICENSE file in the root directory of this source tree.
23
24
  */
24
- const A = [
25
+ const L = [
25
26
  ["path", { d: "M7 7h10v10", key: "1tivn9" }],
26
27
  ["path", { d: "M7 17 17 7", key: "1vkiza" }]
27
- ], E = t("arrow-up-right", A);
28
- /**
29
- * @license lucide-react v1.8.0 - ISC
30
- *
31
- * This source code is licensed under the ISC license.
32
- * See the LICENSE file in the root directory of this source tree.
33
- */
34
- const L = [
35
- ["path", { d: "M16 14v2.2l1.6 1", key: "fo4ql5" }],
36
- ["path", { d: "M16 2v4", key: "4m81vk" }],
37
- ["path", { d: "M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5", key: "1osxxc" }],
38
- ["path", { d: "M3 10h5", key: "r794hk" }],
39
- ["path", { d: "M8 2v4", key: "1cmpym" }],
40
- ["circle", { cx: "16", cy: "16", r: "6", key: "qoo3c4" }]
41
- ], R = t("calendar-clock", L), S = {
28
+ ], R = l("arrow-up-right", L), S = {
42
29
  debt: "debt",
43
30
  credit: "credit",
44
31
  "to-invoice": "toInvoice",
45
32
  "to-deliver": "toDeliver",
46
33
  settled: "settled"
47
- }, V = {
48
- debt: C,
49
- credit: E,
50
- "to-invoice": _,
51
- "to-deliver": R,
52
- settled: M
53
34
  }, F = {
35
+ debt: E,
36
+ credit: R,
37
+ "to-invoice": _,
38
+ "to-deliver": k,
39
+ settled: I
40
+ }, M = {
54
41
  debt: "−",
55
42
  credit: "+",
56
43
  "to-invoice": "",
57
44
  "to-deliver": "",
58
45
  settled: ""
59
- }, D = {
46
+ }, V = {
60
47
  debt: -1,
61
48
  credit: 1,
62
49
  "to-invoice": 1,
63
50
  "to-deliver": 1,
64
51
  settled: 1
65
- }, U = "EUR", j = l(
52
+ }, D = "EUR", U = c(
66
53
  [
67
54
  "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]",
68
55
  "ds:rounded-[var(--radius-full)] ds:border",
@@ -114,7 +101,7 @@ const L = [
114
101
  { state: "settled", class: "ds:font-medium" }
115
102
  ]
116
103
  }
117
- ), $ = l(
104
+ ), j = c(
118
105
  "ds:shrink-0 ds:[&>svg]:block ds:rtl:[&>svg]:-scale-x-100",
119
106
  {
120
107
  variants: {
@@ -126,54 +113,54 @@ const L = [
126
113
  },
127
114
  defaultVariants: { size: "md" }
128
115
  }
129
- ), q = N(
116
+ ), G = T(
130
117
  ({
131
118
  state: e,
132
- amount: v,
133
- currency: o = U,
134
- locale: m,
119
+ amount: m,
120
+ currency: t = D,
121
+ locale: v,
135
122
  size: r = "md",
136
- showLabel: p = !1,
137
- className: f,
123
+ showLabel: f = !1,
124
+ className: p,
138
125
  "aria-label": u,
139
126
  ...g
140
- }, h) => {
141
- const { t: a, i18n: b } = T(), i = m ?? b.language ?? "en", y = V[e], n = F[e], d = Math.abs(v), x = new Intl.NumberFormat(i, {
127
+ }, b) => {
128
+ const { t: o, i18n: h } = C(), a = v ?? h.language ?? "en", x = F[e], i = M[e], n = Math.abs(m), y = new Intl.NumberFormat(a, {
142
129
  style: "currency",
143
- currency: o,
130
+ currency: t,
144
131
  signDisplay: "never"
145
- }).format(d), c = a(`financial.state.${S[e]}`), k = new Intl.NumberFormat(i, {
132
+ }).format(n), d = o(`financial.state.${S[e]}`), w = new Intl.NumberFormat(a, {
146
133
  style: "currency",
147
- currency: o,
134
+ currency: t,
148
135
  signDisplay: e === "debt" ? "always" : "auto"
149
- }).format(d * D[e]), w = u ?? a("financial.aria.label", {
150
- state: c,
151
- amount: k
136
+ }).format(n * V[e]), z = u ?? o("financial.aria.label", {
137
+ state: d,
138
+ amount: w
152
139
  });
153
- return /* @__PURE__ */ z(
140
+ return /* @__PURE__ */ N(
154
141
  "span",
155
142
  {
156
- ref: h,
143
+ ref: b,
157
144
  role: "img",
158
- "aria-label": w,
145
+ "aria-label": z,
159
146
  "data-component": "transaction-chip",
160
147
  "data-state": e,
161
- className: j({
148
+ className: U({
162
149
  state: e,
163
150
  size: r,
164
151
  bold: e !== "settled",
165
- className: f
152
+ className: p
166
153
  }),
167
154
  ...g,
168
155
  children: [
169
- /* @__PURE__ */ s("span", { "aria-hidden": "true", className: $({ size: r }), children: /* @__PURE__ */ s(y, {}) }),
170
- p && /* @__PURE__ */ s("span", { "aria-hidden": "true", className: "type-eyebrow", children: c }),
171
- n && /* @__PURE__ */ s(
156
+ /* @__PURE__ */ s("span", { "aria-hidden": "true", className: j({ size: r }), children: /* @__PURE__ */ s(x, {}) }),
157
+ f && /* @__PURE__ */ s("span", { "aria-hidden": "true", className: "type-eyebrow", children: d }),
158
+ i && /* @__PURE__ */ s(
172
159
  "span",
173
160
  {
174
161
  "aria-hidden": "true",
175
162
  className: "ds:[font-variant-numeric:var(--font-feature-tabular)]",
176
- children: n
163
+ children: i
177
164
  }
178
165
  ),
179
166
  /* @__PURE__ */ s(
@@ -181,7 +168,7 @@ const L = [
181
168
  {
182
169
  "aria-hidden": "true",
183
170
  className: "ds:[font-variant-numeric:var(--font-feature-tabular)]",
184
- children: x
171
+ children: y
185
172
  }
186
173
  )
187
174
  ]
@@ -189,8 +176,8 @@ const L = [
189
176
  );
190
177
  }
191
178
  );
192
- q.displayName = "TransactionChip";
179
+ G.displayName = "TransactionChip";
193
180
  export {
194
- q as T
181
+ G as T
195
182
  };
196
- //# sourceMappingURL=transaction-chip-z9ENE50O.js.map
183
+ //# sourceMappingURL=transaction-chip-B8ujzowA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-chip-B8ujzowA.js","sources":["../../node_modules/lucide-react/dist/esm/icons/arrow-down-left.js","../../node_modules/lucide-react/dist/esm/icons/arrow-up-right.js","../../src/components/transaction-chip/transaction-chip.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.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.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M17 7 7 17\", key: \"15tmo1\" }],\n [\"path\", { d: \"M17 17H7V7\", key: \"1org7z\" }]\n];\nconst ArrowDownLeft = createLucideIcon(\"arrow-down-left\", __iconNode);\n\nexport { __iconNode, ArrowDownLeft as default };\n//# sourceMappingURL=arrow-down-left.js.map\n","/**\n * @license lucide-react v1.8.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.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M7 7h10v10\", key: \"1tivn9\" }],\n [\"path\", { d: \"M7 17 17 7\", key: \"1vkiza\" }]\n];\nconst ArrowUpRight = createLucideIcon(\"arrow-up-right\", __iconNode);\n\nexport { __iconNode, ArrowUpRight as default };\n//# sourceMappingURL=arrow-up-right.js.map\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n ArrowDownLeft,\n ArrowUpRight,\n CalendarClock,\n Check,\n FileText,\n type LucideIcon,\n} from 'lucide-react';\n\n/* ------------------------------------------------------------------ */\n/* State vocabulary */\n/* ------------------------------------------------------------------ */\n\nexport type TransactionState =\n | 'debt'\n | 'credit'\n | 'to-invoice'\n | 'to-deliver'\n | 'settled';\n\n// State → translation-key segment. Hyphenated state names are flattened to\n// camelCase so the i18next bundle stays consistent with the rest of `ui.*`.\nconst STATE_KEY: Record<TransactionState, string> = {\n debt: 'debt',\n credit: 'credit',\n 'to-invoice': 'toInvoice',\n 'to-deliver': 'toDeliver',\n settled: 'settled',\n};\n\nconst STATE_ICON: Record<TransactionState, LucideIcon> = {\n debt: ArrowDownLeft,\n credit: ArrowUpRight,\n 'to-invoice': FileText,\n 'to-deliver': CalendarClock,\n settled: Check,\n};\n\n// U+2212 MINUS SIGN — matches PR alfadocs/platform#523's typographic minus.\n// Hyphen-minus would render visually narrower next to the currency glyph.\nconst STATE_SIGN: Record<TransactionState, '' | '+' | '−'> = {\n debt: '−',\n credit: '+',\n 'to-invoice': '',\n 'to-deliver': '',\n settled: '',\n};\n\n// Multiplier used when composing the screen-reader announcement so SR users\n// hear the signed amount Intl produces (\"minus one thousand…\") rather than\n// the magnitude plus a separate sign glyph.\nconst SIGN_MULTIPLIER: Record<TransactionState, -1 | 1> = {\n debt: -1,\n credit: 1,\n 'to-invoice': 1,\n 'to-deliver': 1,\n settled: 1,\n};\n\nconst DEFAULT_CURRENCY = 'EUR';\n\n/* ------------------------------------------------------------------ */\n/* CVA — chip root */\n/* ------------------------------------------------------------------ */\n\nconst chipVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-full)] ds:border',\n 'ds:whitespace-nowrap ds:align-middle',\n 'ds:focus-visible:outline-none',\n 'ds:focus-visible:ring-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:ring-[color:var(--ring)]',\n 'ds:focus-visible:ring-offset-[length:var(--focus-ring-offset)]',\n ].join(' '),\n {\n variants: {\n state: {\n // Text uses the deeper `*-foreground` token (matching Badge / Tag) so\n // small chip text clears WCAG AA (4.5:1) against the 10% tinted\n // background. The surface and border use the lighter alias.\n debt: 'ds:bg-destructive/10 ds:text-[color:var(--error-foreground)] ds:border-destructive/20',\n credit:\n 'ds:bg-success/10 ds:text-[color:var(--success-foreground)] ds:border-success/20',\n // The orange \"to-invoice\" tint has no kit-wide semantic alias — see\n // src/tokens/index.css §Transaction-chip-scoped tokens. The component\n // owns the alias because the customer-anchored \"Da fatturare\" orange\n // is distinct from `--warning` (yellow) and from `--destructive`.\n 'to-invoice':\n 'ds:bg-transaction-chip-to-invoice/10 ds:text-[color:var(--transaction-chip-to-invoice-foreground)] ds:border-transaction-chip-to-invoice/20',\n 'to-deliver':\n 'ds:bg-info/10 ds:text-[color:var(--info-foreground)] ds:border-info/20',\n settled: 'ds:bg-muted/30 ds:text-muted-foreground ds:border-muted/40',\n },\n size: {\n // Heights tuned for table-cell density (sm), default app surfaces (md),\n // and header / summary cards (lg). `--type-eyebrow-size` flows into the\n // optional label span, keeping its typography in step with the chip.\n sm: 'ds:h-5 ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-sm)] ds:text-[length:var(--font-size-2xs)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n md: 'ds:h-6 ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:text-[length:var(--font-size-xs)] ds:[--type-eyebrow-size:var(--font-size-2xs)]',\n lg: 'ds:h-7 ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-sm)] ds:[--type-eyebrow-size:var(--font-size-xs)]',\n },\n bold: {\n // `settled` is the terminal resting state — see compound variant below.\n true: 'ds:font-semibold',\n false: 'ds:font-medium',\n },\n },\n defaultVariants: {\n state: 'debt',\n size: 'md',\n bold: true,\n },\n compoundVariants: [\n // `settled` always renders at the lighter weight, regardless of the\n // resolved default. Mirrors PR #523's follow-up where the resting branch\n // dropped from bold to medium to recede visually.\n { state: 'settled', class: 'ds:font-medium' },\n ],\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* CVA — icon wrapper */\n/* ------------------------------------------------------------------ */\n\n// `ArrowDownLeft` (debt) and `ArrowUpRight` (credit) are direction-encoded\n// glyphs — their physical orientation carries the semantic (\"money coming\n// in\" / \"money going out\"). PRS §05 RTL: directional icons flip in RTL.\n// The non-directional glyphs (FileText, CalendarClock, Check) are unaffected.\nconst iconWrapperVariants = cva(\n 'ds:shrink-0 ds:[&>svg]:block ds:rtl:[&>svg]:-scale-x-100',\n {\n variants: {\n size: {\n sm: 'ds:[&>svg]:size-3',\n md: 'ds:[&>svg]:size-3.5',\n lg: 'ds:[&>svg]:size-4',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface TransactionChipProps\n extends\n Omit<HTMLAttributes<HTMLSpanElement>, 'children'>,\n Pick<VariantProps<typeof chipVariants>, 'size'> {\n /** Financial state — drives colour, icon, sign, and label. */\n state: TransactionState;\n /**\n * Magnitude of the amount as a non-negative number. The sign is rendered\n * separately based on `state` — callers must never pass a negative value.\n */\n amount: number;\n /**\n * ISO 4217 currency code. Defaults to `EUR` for the Italian-anchored\n * release. Required at the type level so consumers can't silently render\n * a different currency than they intended.\n */\n currency?: string;\n /** BCP 47 locale override. Defaults to the active i18next language. */\n locale?: string;\n /** Render the state label (e.g. \"Da incassare\") before the amount. */\n showLabel?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const TransactionChip = forwardRef<\n HTMLSpanElement,\n TransactionChipProps\n>(\n (\n {\n state,\n amount,\n currency = DEFAULT_CURRENCY,\n locale,\n size = 'md',\n showLabel = false,\n className,\n 'aria-label': ariaLabelProp,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const activeLocale = locale ?? i18n.language ?? 'en';\n\n const StateIcon = STATE_ICON[state];\n const sign = STATE_SIGN[state];\n const magnitude = Math.abs(amount);\n\n // The visible amount is rendered without a sign; the leading sign glyph\n // (or its absence) is owned by the state, not the formatter.\n const formattedAmount = new Intl.NumberFormat(activeLocale, {\n style: 'currency',\n currency,\n signDisplay: 'never',\n }).format(magnitude);\n\n // The accessible name uses Intl's own signed output so screen readers\n // announce the locale-correct \"minus\" / \"negative\" phrasing instead of\n // skipping the U+2212 glyph or speaking it as \"hyphen\".\n const stateLabel = t(`financial.state.${STATE_KEY[state]}`);\n const signedAmountForSR = new Intl.NumberFormat(activeLocale, {\n style: 'currency',\n currency,\n signDisplay: state === 'debt' ? 'always' : 'auto',\n }).format(magnitude * SIGN_MULTIPLIER[state]);\n const ariaLabel =\n ariaLabelProp ??\n t('financial.aria.label', {\n state: stateLabel,\n amount: signedAmountForSR,\n });\n\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={ariaLabel}\n data-component=\"transaction-chip\"\n data-state={state}\n className={chipVariants({\n state,\n size,\n bold: state !== 'settled',\n className,\n })}\n {...rest}\n >\n <span aria-hidden=\"true\" className={iconWrapperVariants({ size })}>\n <StateIcon />\n </span>\n {showLabel && (\n <span aria-hidden=\"true\" className=\"type-eyebrow\">\n {stateLabel}\n </span>\n )}\n {sign && (\n <span\n aria-hidden=\"true\"\n className=\"ds:[font-variant-numeric:var(--font-feature-tabular)]\"\n >\n {sign}\n </span>\n )}\n <span\n aria-hidden=\"true\"\n className=\"ds:[font-variant-numeric:var(--font-feature-tabular)]\"\n >\n {formattedAmount}\n </span>\n </span>\n );\n },\n);\n\nTransactionChip.displayName = 'TransactionChip';\n"],"names":["__iconNode","ArrowDownLeft","createLucideIcon","ArrowUpRight","STATE_KEY","STATE_ICON","FileText","CalendarClock","Check","STATE_SIGN","SIGN_MULTIPLIER","DEFAULT_CURRENCY","chipVariants","cva","iconWrapperVariants","TransactionChip","forwardRef","state","amount","currency","locale","size","showLabel","className","ariaLabelProp","rest","ref","t","i18n","useTranslation","activeLocale","StateIcon","sign","magnitude","formattedAmount","stateLabel","signedAmountForSR","ariaLabel","jsxs","jsx"],"mappings":"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","x_google_ignoreList":[0,1]}