@alfadocs/ui-kit-debug 0.30.3 → 0.30.4
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.
- package/dist/_chunks/{booking-DiyuLsQV.js → booking-Cw92aqo3.js} +426 -422
- package/dist/_chunks/booking-Cw92aqo3.js.map +1 -0
- package/dist/agent-catalog.json +1 -1
- package/dist/components/booking/booking.d.ts.map +1 -1
- package/dist/components/booking/cascade.d.ts.map +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/_chunks/booking-DiyuLsQV.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-Cw92aqo3.js","sources":["../../node_modules/lucide-react/dist/esm/icons/activity.js","../../node_modules/lucide-react/dist/esm/icons/baby.js","../../node_modules/lucide-react/dist/esm/icons/bone.js","../../node_modules/lucide-react/dist/esm/icons/brain.js","../../node_modules/lucide-react/dist/esm/icons/calendar-range.js","../../node_modules/lucide-react/dist/esm/icons/clipboard-check.js","../../node_modules/lucide-react/dist/esm/icons/ear.js","../../node_modules/lucide-react/dist/esm/icons/microscope.js","../../node_modules/lucide-react/dist/esm/icons/pill.js","../../node_modules/lucide-react/dist/esm/icons/scan-line.js","../../node_modules/lucide-react/dist/esm/icons/scissors.js","../../node_modules/lucide-react/dist/esm/icons/smile.js","../../node_modules/lucide-react/dist/esm/icons/sunset.js","../../node_modules/lucide-react/dist/esm/icons/syringe.js","../../node_modules/date-fns/subMonths.js","../../src/components/booking/booking.agent.ts","../../src/components/booking/booking-types.ts","../../src/components/booking/cascade.ts","../../src/components/booking/details-form.tsx","../../src/components/booking/booking.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 [\n \"path\",\n {\n d: \"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\",\n key: \"169zse\"\n }\n ]\n];\nconst Activity = createLucideIcon(\"activity\", __iconNode);\n\nexport { __iconNode, Activity as default };\n//# sourceMappingURL=activity.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: \"M10 16c.5.3 1.2.5 2 .5s1.5-.2 2-.5\", key: \"1u7htd\" }],\n [\"path\", { d: \"M15 12h.01\", key: \"1k8ypt\" }],\n [\n \"path\",\n {\n d: \"M19.38 6.813A9 9 0 0 1 20.8 10.2a2 2 0 0 1 0 3.6 9 9 0 0 1-17.6 0 2 2 0 0 1 0-3.6A9 9 0 0 1 12 3c2 0 3.5 1.1 3.5 2.5s-.9 2.5-2 2.5c-.8 0-1.5-.4-1.5-1\",\n key: \"11xh7x\"\n }\n ],\n [\"path\", { d: \"M9 12h.01\", key: \"157uk2\" }]\n];\nconst Baby = createLucideIcon(\"baby\", __iconNode);\n\nexport { __iconNode, Baby as default };\n//# sourceMappingURL=baby.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: \"M17 10c.7-.7 1.69 0 2.5 0a2.5 2.5 0 1 0 0-5 .5.5 0 0 1-.5-.5 2.5 2.5 0 1 0-5 0c0 .81.7 1.8 0 2.5l-7 7c-.7.7-1.69 0-2.5 0a2.5 2.5 0 0 0 0 5c.28 0 .5.22.5.5a2.5 2.5 0 1 0 5 0c0-.81-.7-1.8 0-2.5Z\",\n key: \"w610uw\"\n }\n ]\n];\nconst Bone = createLucideIcon(\"bone\", __iconNode);\n\nexport { __iconNode, Bone as default };\n//# sourceMappingURL=bone.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: \"M12 18V5\", key: \"adv99a\" }],\n [\"path\", { d: \"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4\", key: \"1e3is1\" }],\n [\"path\", { d: \"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5\", key: \"1gqd8o\" }],\n [\"path\", { d: \"M17.997 5.125a4 4 0 0 1 2.526 5.77\", key: \"iwvgf7\" }],\n [\"path\", { d: \"M18 18a4 4 0 0 0 2-7.464\", key: \"efp6ie\" }],\n [\"path\", { d: \"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517\", key: \"1gq6am\" }],\n [\"path\", { d: \"M6 18a4 4 0 0 1-2-7.464\", key: \"k1g0md\" }],\n [\"path\", { d: \"M6.003 5.125a4 4 0 0 0-2.526 5.77\", key: \"q97ue3\" }]\n];\nconst Brain = createLucideIcon(\"brain\", __iconNode);\n\nexport { __iconNode, Brain as default };\n//# sourceMappingURL=brain.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 [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }],\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M17 14h-6\", key: \"bkmgh3\" }],\n [\"path\", { d: \"M13 18H7\", key: \"bb0bb7\" }],\n [\"path\", { d: \"M7 14h.01\", key: \"1qa3f1\" }],\n [\"path\", { d: \"M17 18h.01\", key: \"1bdyru\" }]\n];\nconst CalendarRange = createLucideIcon(\"calendar-range\", __iconNode);\n\nexport { __iconNode, CalendarRange as default };\n//# sourceMappingURL=calendar-range.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 [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\n \"path\",\n {\n d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\n key: \"116196\"\n }\n ],\n [\"path\", { d: \"m9 14 2 2 4-4\", key: \"df797q\" }]\n];\nconst ClipboardCheck = createLucideIcon(\"clipboard-check\", __iconNode);\n\nexport { __iconNode, ClipboardCheck as default };\n//# sourceMappingURL=clipboard-check.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: \"M6 8.5a6.5 6.5 0 1 1 13 0c0 6-6 6-6 10a3.5 3.5 0 1 1-7 0\", key: \"1dfaln\" }],\n [\"path\", { d: \"M15 8.5a2.5 2.5 0 0 0-5 0v1a2 2 0 1 1 0 4\", key: \"1qnva7\" }]\n];\nconst Ear = createLucideIcon(\"ear\", __iconNode);\n\nexport { __iconNode, Ear as default };\n//# sourceMappingURL=ear.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: \"M6 18h8\", key: \"1borvv\" }],\n [\"path\", { d: \"M3 22h18\", key: \"8prr45\" }],\n [\"path\", { d: \"M14 22a7 7 0 1 0 0-14h-1\", key: \"1jwaiy\" }],\n [\"path\", { d: \"M9 14h2\", key: \"197e7h\" }],\n [\"path\", { d: \"M9 12a2 2 0 0 1-2-2V6h6v4a2 2 0 0 1-2 2Z\", key: \"1bmzmy\" }],\n [\"path\", { d: \"M12 6V3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3\", key: \"1drr47\" }]\n];\nconst Microscope = createLucideIcon(\"microscope\", __iconNode);\n\nexport { __iconNode, Microscope as default };\n//# sourceMappingURL=microscope.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 { d: \"m10.5 20.5 10-10a4.95 4.95 0 1 0-7-7l-10 10a4.95 4.95 0 1 0 7 7Z\", key: \"wa1lgi\" }\n ],\n [\"path\", { d: \"m8.5 8.5 7 7\", key: \"rvfmvr\" }]\n];\nconst Pill = createLucideIcon(\"pill\", __iconNode);\n\nexport { __iconNode, Pill as default };\n//# sourceMappingURL=pill.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: \"M3 7V5a2 2 0 0 1 2-2h2\", key: \"aa7l1z\" }],\n [\"path\", { d: \"M17 3h2a2 2 0 0 1 2 2v2\", key: \"4qcy5o\" }],\n [\"path\", { d: \"M21 17v2a2 2 0 0 1-2 2h-2\", key: \"6vwrx8\" }],\n [\"path\", { d: \"M7 21H5a2 2 0 0 1-2-2v-2\", key: \"ioqczr\" }],\n [\"path\", { d: \"M7 12h10\", key: \"b7w52i\" }]\n];\nconst ScanLine = createLucideIcon(\"scan-line\", __iconNode);\n\nexport { __iconNode, ScanLine as default };\n//# sourceMappingURL=scan-line.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 [\"circle\", { cx: \"6\", cy: \"6\", r: \"3\", key: \"1lh9wr\" }],\n [\"path\", { d: \"M8.12 8.12 12 12\", key: \"1alkpv\" }],\n [\"path\", { d: \"M20 4 8.12 15.88\", key: \"xgtan2\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M14.8 14.8 20 20\", key: \"ptml3r\" }]\n];\nconst Scissors = createLucideIcon(\"scissors\", __iconNode);\n\nexport { __iconNode, Scissors as default };\n//# sourceMappingURL=scissors.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 [\"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","/**\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: \"M12 10V2\", key: \"16sf7g\" }],\n [\"path\", { d: \"m4.93 10.93 1.41 1.41\", key: \"2a7f42\" }],\n [\"path\", { d: \"M2 18h2\", key: \"j10viu\" }],\n [\"path\", { d: \"M20 18h2\", key: \"wocana\" }],\n [\"path\", { d: \"m19.07 10.93-1.41 1.41\", key: \"15zs5n\" }],\n [\"path\", { d: \"M22 22H2\", key: \"19qnx5\" }],\n [\"path\", { d: \"m16 6-4 4-4-4\", key: \"6wukr\" }],\n [\"path\", { d: \"M16 18a4 4 0 0 0-8 0\", key: \"1lzouq\" }]\n];\nconst Sunset = createLucideIcon(\"sunset\", __iconNode);\n\nexport { __iconNode, Sunset as default };\n//# sourceMappingURL=sunset.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: \"m18 2 4 4\", key: \"22kx64\" }],\n [\"path\", { d: \"m17 7 3-3\", key: \"1w1zoj\" }],\n [\"path\", { d: \"M19 9 8.7 19.3c-1 1-2.5 1-3.4 0l-.6-.6c-1-1-1-2.5 0-3.4L15 5\", key: \"1exhtz\" }],\n [\"path\", { d: \"m9 11 4 4\", key: \"rovt3i\" }],\n [\"path\", { d: \"m5 19-3 3\", key: \"59f2uf\" }],\n [\"path\", { d: \"m14 4 6 6\", key: \"yqp9t2\" }]\n];\nconst Syringe = createLucideIcon(\"syringe\", __iconNode);\n\nexport { __iconNode, Syringe as default };\n//# sourceMappingURL=syringe.js.map\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The subMonths function options.\n */\n\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function subMonths(date, amount, options) {\n return addMonths(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subMonths;\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — Booking (0.26.0). */\n/* */\n/* The Booking component consolidates the seven-step patient booking */\n/* flow into a single component. The adapter exposes variant + step */\n/* navigation. The booking value itself is owned by the consumer and */\n/* flows through `value` / `onChange` — never read here (PHI: patient */\n/* identity + contact stays on the page). */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { BookingHandle } from './booking-types';\n\nexport const bookingAgent: AgentAdapter<BookingHandle> = {\n id: 'booking',\n capabilities: ['navigate', 'view_change'],\n state: {\n variant: {\n type: 'string',\n descriptionKey: 'ui.agent.booking.state.variant',\n description:\n 'Active variant — one of `inline-list`, `accordion`, `calendar`, `flexible`, `progress`.',\n read: (handle) => handle.getVariant(),\n },\n },\n actions: {\n reset: {\n safety: 'write',\n descriptionKey: 'ui.agent.booking.actions.reset',\n description:\n 'Clear the booking value back to an empty state. Use to abandon an in-progress flow.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n goto_step: {\n safety: 'read',\n argsType: '{ step: 1 | 2 | 3 | 4 | 5 | 6 | 7 }',\n descriptionKey: 'ui.agent.booking.actions.gotoStep',\n description:\n 'Jump to the given step. Implementations may clamp to the first incomplete step if the requested one is not reachable yet.',\n invoke: (handle, args: { step: 1 | 2 | 3 | 4 | 5 | 6 | 7 }) => {\n handle.goToStep(args.step);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'booking',\n description: 'Marks the Booking root region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* Booking — public type surface (0.26.0). */\n/* */\n/* Re-exported from `booking.tsx`. Lives in its own module so */\n/* `cascade.ts` can import the types without a circular dependency on */\n/* the main component file. */\n/* -------------------------------------------------------------------- */\n\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react';\n\n/* -------------------------------------------------------------------- */\n/* Variant */\n/* -------------------------------------------------------------------- */\n\nexport type BookingVariant =\n | 'inline-list'\n | 'accordion'\n | 'calendar'\n | 'flexible'\n | 'progress';\n\n/* -------------------------------------------------------------------- */\n/* Domain shapes */\n/* -------------------------------------------------------------------- */\n\nexport type InsuranceType = 'private' | 'public';\n\n/** Channels the patient can pick to receive the confirmation link. */\nexport type ConfirmationChannel = 'email' | 'whatsapp' | 'sms';\n\n/** Fixed order — email first, then WhatsApp, then SMS. */\nexport const CONFIRMATION_CHANNEL_ORDER: readonly ConfirmationChannel[] = [\n 'email',\n 'whatsapp',\n 'sms',\n] as const;\n\nexport interface BookingSpecialty {\n id: string;\n label: string;\n /** Optional ordering hint; falls back to array order. */\n sequenceNumber?: number;\n /** Restrict to operators-on-page when lockedOperatorId is set. */\n operatorIds?: string[];\n}\n\nexport interface BookingService {\n id: string;\n label: string;\n /** Minutes — required for slot fetching. */\n durationMin: number;\n /** Required when useSpecialties is true. */\n specialtyId?: string;\n /** Operators who can perform this service. */\n operatorIds?: string[];\n}\n\nexport interface BookingOperator {\n id: string;\n name: string;\n specialtyIds?: string[];\n appointmentBookingReasonIds?: string[];\n}\n\nexport interface BookingSlot {\n /** Opaque unique key within `availableSlots[date]`. */\n key: string;\n /** HH:mm 24h — used for display. */\n time: string;\n available: boolean;\n /** Opaque passthrough so the consumer can resolve operatorId / chairId\n * / dateTime when `onSubmit` fires. */\n meta?: Record<string, unknown>;\n}\n\nexport interface BookingDetails {\n firstName: string;\n lastName: string;\n email: string;\n mobilePhone: string;\n privacyConsent: boolean;\n termsConsent: boolean;\n // Opt-in fields — typed optional, required only when their `require*`\n // prop is true on `BookingProps`.\n codiceFiscale?: string;\n dateOfBirth?: string;\n insuranceNumber?: string;\n // Optional, gated by `show*` props.\n note?: string;\n returningPatient?: boolean;\n /**\n * Channels the patient picked for the confirmation link. Guaranteed to\n * be a non-empty subset of the practice's enabled `confirmationChannels`\n * when present. Omitted when only one channel is enabled (implicit —\n * backend infers from the practice config).\n */\n confirmationChannels?: ConfirmationChannel[];\n}\n\nexport interface BookingValue {\n insuranceType?: InsuranceType;\n specialtyId?: string;\n serviceId?: string;\n /** May be the literal `'all'` sentinel to mean \"no operator preference\". */\n operatorId?: string;\n /** YYYY-MM-DD. */\n date?: string;\n /** Opaque key from `availableSlots[date]`. */\n slotKey?: string;\n /** Partial details — fully populated when the user is ready to submit. */\n details?: Partial<BookingDetails>;\n}\n\n/* -------------------------------------------------------------------- */\n/* Submit payload — fully resolved. */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingSubmitPayload {\n slot: BookingSlot;\n value: BookingValue;\n /** Fully populated + validated (privacy + terms ticked, required fields filled). */\n details: BookingDetails;\n}\n\n/* -------------------------------------------------------------------- */\n/* Async validator return shape */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingValidationResult {\n valid: boolean;\n /** Optional localised hint shown next to the field on failure. */\n hint?: string;\n}\n\nexport type BookingValidator = (\n value: string,\n) => Promise<BookingValidationResult>;\n\n/* -------------------------------------------------------------------- */\n/* Imperative handle */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingHandle {\n getVariant: () => BookingVariant;\n /** Clear `value` back to an empty state via `onChange`. */\n reset: () => void;\n /**\n * Jump to a specific step. Implementations may clamp to the first\n * incomplete step if the requested one isn't reachable yet.\n */\n goToStep: (step: 1 | 2 | 3 | 4 | 5 | 6 | 7) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component props */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'onChange' | 'onSubmit'\n> {\n variant?: BookingVariant;\n\n // Policy\n country?: string;\n useSpecialties?: boolean;\n allowOperatorSelection?: boolean;\n /** Pins step 4 to this operator. */\n lockedOperatorId?: string;\n\n // Data (any may be empty — the cascade handles it)\n specialties?: BookingSpecialty[];\n services: BookingService[];\n operators?: BookingOperator[];\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n /** Server-side hint of the next free date when the current window is empty. */\n nextAvailableDate?: string;\n\n // Step 7 controls (all opt-in, default false)\n requireCodiceFiscale?: boolean;\n requireDateOfBirth?: boolean;\n requireInsuranceNumber?: boolean;\n showNote?: boolean;\n showReturningPatientFlag?: boolean;\n privacyPolicyUrl?: string;\n termsUrl?: string;\n\n // Validation hooks (consumer-injected)\n validateCodiceFiscale?: BookingValidator;\n validateInsuranceNumber?: BookingValidator;\n\n // Auto-select policy\n /** Default: false. Specialty auto-select on length=1 is always on. */\n autoSelectSingleService?: boolean;\n\n // Confirmation-channel delivery\n /**\n * Channels the practice has enabled. The picker renders one checkbox\n * per channel; when length === 1, the picker is hidden and the single\n * channel is implicit. Defaults to `['email']` when omitted.\n */\n confirmationChannels?: ConfirmationChannel[];\n /**\n * Pre-checked channels. Intersected with `confirmationChannels` for\n * safety. When omitted, the kit applies a smart default (always email;\n * +whatsapp when mobile is plausibly filled; +sms when whatsapp isn't\n * available).\n */\n defaultConfirmationChannels?: ConfirmationChannel[];\n\n // State\n value: BookingValue;\n onChange: (next: BookingValue) => void;\n onSubmit: (payload: BookingSubmitPayload) => void | Promise<void>;\n\n // UX\n loadingSlots?: boolean;\n submitting?: boolean;\n /**\n * @default 'flat'\n * `'elevated'` wraps the kit-rendered surface in the equivalent of\n * `Card variant=\"elevated\"` (same tokens, same padding). Use to drop\n * the consumer-side Card wrap.\n */\n surface?: 'flat' | 'elevated';\n /**\n * Fires whenever the displayed step changes — steps 1..7 from the\n * cascade engine + step `8` when the success view mounts. Useful for\n * analytics events that aren't already kit-internal, custom focus\n * management, or page-title updates. The kit also auto-scrolls the\n * success container into view on the 1..7 → 8 transition; consumers\n * don't need to do that themselves.\n */\n onStepChange?: (step: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8) => void;\n /**\n * Surface a submit-failure message inside the form (Alert variant=destructive\n * above the submit button). The consumer owns the state — set it after an\n * `onSubmit` rejection, clear it when retrying or on a field edit. When set,\n * the kit's normal \"form stays mounted on rejected promise\" behaviour is\n * unchanged; this just gives the failure a sanctioned slot to render.\n */\n submitError?: ReactNode;\n /**\n * @default 'live'\n * In `'demo'` mode the kit's step-8 success view swaps its description to\n * a localised \"This was a demo — no confirmation was sent.\" so the copy\n * stays honest when no real API call was made.\n */\n mode?: 'live' | 'demo';\n /**\n * @default true\n * Render a \"Modify booking\" button on the step-8 success view that returns\n * to step 7 without clearing `value`/`details`. Practices that want a\n * one-shot booking flow can hide this.\n */\n showModifyOnSuccess?: boolean;\n emptyServicesSlot?: ReactNode;\n onboardingIncompleteSlot?: ReactNode;\n\n // a11y\n 'aria-label'?: string;\n id?: string;\n}\n","/* -------------------------------------------------------------------- */\n/* Booking cascade engine — pure functions, no React. */\n/* */\n/* The seven-step state machine that drives every variant. Visibility */\n/* gates, downstream filtering, auto-skip rules, and reset semantics */\n/* live here so each variant only renders a phase of the cascade — it */\n/* doesn't re-implement the logic. The booking-website's legacy */\n/* `useBookingState.js` is the behavioural source-of-truth; the */\n/* mapping is documented inline at each gate. */\n/* -------------------------------------------------------------------- */\n\nimport type {\n BookingOperator,\n BookingService,\n BookingSlot,\n BookingSpecialty,\n BookingValue,\n ConfirmationChannel,\n InsuranceType,\n} from './booking-types';\nimport { CONFIRMATION_CHANNEL_ORDER } from './booking-types';\n\n/**\n * Sentinel for the operator filter's \"All operators\" pseudo-option. Mirrors\n * `OPERATORS_ALL = '0'` in the legacy `useBookingState.js`, but the kit\n * uses `'all'` as the well-known string so consumers can't accidentally\n * collide with a real operator id of `'0'`.\n */\nexport const OPERATORS_ALL = 'all' as const;\n\nconst COUNTRY_GERMANY = 'de';\n\n/* -------------------------------------------------------------------- */\n/* Inputs / outputs */\n/* -------------------------------------------------------------------- */\n\nexport interface CascadePolicy {\n /** ISO 3166-1 alpha-2 country code. Currently only `'de'` toggles a gate. */\n country?: string;\n useSpecialties?: boolean;\n allowOperatorSelection?: boolean;\n /** When set, locks step 4 to this operator id and hides the picker. */\n lockedOperatorId?: string;\n /** Defaults to `false`. When true, single-service lists auto-pre-fill. */\n autoSelectSingleService?: boolean;\n}\n\nexport interface CascadeInputs extends CascadePolicy {\n specialties: BookingSpecialty[];\n services: BookingService[];\n operators: BookingOperator[];\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n value: BookingValue;\n}\n\nexport interface CascadeGates {\n insurance: boolean;\n specialty: boolean;\n service: boolean;\n operator: boolean;\n date: boolean;\n slot: boolean;\n details: boolean;\n /** True when a service is picked but no eligible operators can perform it. */\n onboardingIncomplete: boolean;\n}\n\nexport interface CascadeFiltered {\n specialties: BookingSpecialty[];\n services: BookingService[];\n /**\n * Eligible operators for the active specialty (when `useSpecialties=true`)\n * OR the active service. Excludes the \"All operators\" sentinel — that's\n * always prepended in the UI layer.\n */\n operators: BookingOperator[];\n}\n\n/** Step number — 1-indexed, matches the docs / a11y order. */\nexport type CascadeStep = 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\nexport interface CascadeOutputs {\n gates: CascadeGates;\n filtered: CascadeFiltered;\n /** Current step: the first visible step that has an unfulfilled requirement. */\n currentStep: CascadeStep;\n /** Total visible steps (1..7 minus any auto-skipped). */\n totalSteps: number;\n /** Ordered list of the visible step indices, used by variants that show a stepper. */\n visibleSteps: CascadeStep[];\n /** Whether every required step is satisfied — the submit button is gated on this. */\n isReadyToSubmit: boolean;\n /** Selected service's duration, if any — needed for slot fetching. */\n durationMin?: number;\n /** Selected slot resolved from `value.date` + `value.slotKey`. */\n selectedSlot?: BookingSlot;\n}\n\n/* -------------------------------------------------------------------- */\n/* Filtering helpers */\n/* -------------------------------------------------------------------- */\n\nfunction filterSpecialties(inputs: CascadeInputs): BookingSpecialty[] {\n const list = inputs.lockedOperatorId\n ? inputs.specialties.filter((s) =>\n s.operatorIds?.includes(inputs.lockedOperatorId as string),\n )\n : inputs.specialties;\n // Stable copy + sort by `sequenceNumber` (falsy → bottom).\n return [...list].sort((a, b) => {\n const aSeq = a.sequenceNumber ?? Number.POSITIVE_INFINITY;\n const bSeq = b.sequenceNumber ?? Number.POSITIVE_INFINITY;\n return aSeq - bSeq;\n });\n}\n\nfunction filterServices(inputs: CascadeInputs): BookingService[] {\n let list = inputs.services;\n if (inputs.lockedOperatorId) {\n list = list.filter((s) =>\n s.operatorIds?.includes(inputs.lockedOperatorId as string),\n );\n }\n // Mirror the `gates.specialty` auto-on rule — see computeGates().\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n if (useSpecialtiesResolved && inputs.value.specialtyId) {\n list = list.filter((s) => s.specialtyId === inputs.value.specialtyId);\n }\n return list;\n}\n\nfunction eligibleOperators(inputs: CascadeInputs): BookingOperator[] {\n // Mirror the gates.specialty auto-on rule.\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n // When `useSpecialties` is on, eligibility is by specialty. Otherwise by\n // the selected service's reverse-link. Both are inclusive — if a service\n // says any operator can perform it, all operators are eligible.\n if (useSpecialtiesResolved && inputs.value.specialtyId) {\n const specialtyId = inputs.value.specialtyId;\n return inputs.operators.filter((op) =>\n op.specialtyIds?.includes(specialtyId),\n );\n }\n if (!useSpecialtiesResolved && inputs.value.serviceId) {\n const serviceId = inputs.value.serviceId;\n return inputs.operators.filter((op) =>\n op.appointmentBookingReasonIds?.includes(serviceId),\n );\n }\n return [];\n}\n\n/* -------------------------------------------------------------------- */\n/* Gates */\n/* -------------------------------------------------------------------- */\n\nfunction computeGates(\n inputs: CascadeInputs,\n filtered: CascadeFiltered,\n): CascadeGates {\n const insuranceVisible = inputs.country === COUNTRY_GERMANY;\n // Insurance gate is satisfied either if it's not visible or the user has\n // picked one of the two values.\n const insuranceSatisfied =\n !insuranceVisible || inputs.value.insuranceType !== undefined;\n\n // Specialty visibility — 0.30.4: auto-on when `specialties` has items.\n // - `useSpecialties === true` → visible (legacy explicit opt-in)\n // - `useSpecialties === false` → hidden (explicit opt-out)\n // - `useSpecialties === undefined` (default) → visible iff `specialties`\n // has items. Previously the default `false` meant the step never\n // rendered unless the consumer explicitly opted in, which silently\n // dropped the step in every variant for the common case where the\n // consumer passed `specialties` data but not the boolean.\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n const specialtyVisible = useSpecialtiesResolved && insuranceSatisfied;\n const specialtySatisfied =\n !specialtyVisible || inputs.value.specialtyId !== undefined;\n\n const serviceVisible = specialtySatisfied;\n const serviceSatisfied =\n !serviceVisible || inputs.value.serviceId !== undefined;\n\n // Operator: visible only when the user can pick from >1 eligible.\n const eligibleOps = filtered.operators;\n const operatorVisible =\n Boolean(inputs.allowOperatorSelection) &&\n serviceSatisfied &&\n inputs.value.serviceId !== undefined &&\n !inputs.lockedOperatorId &&\n eligibleOps.length > 1;\n // operator is always \"satisfied\" because the \"All operators\" sentinel is\n // the implicit default — patients who don't pick still flow through.\n const operatorSatisfied = true;\n void operatorSatisfied;\n\n const dateVisible = serviceSatisfied && inputs.value.serviceId !== undefined;\n const dateSatisfied = !dateVisible || inputs.value.date !== undefined;\n\n const slotVisible = dateSatisfied && inputs.value.date !== undefined;\n const slotSatisfied = !slotVisible || inputs.value.slotKey !== undefined;\n\n const detailsVisible = slotSatisfied && inputs.value.slotKey !== undefined;\n\n const onboardingIncomplete =\n Boolean(inputs.value.serviceId) && eligibleOps.length === 0;\n\n return {\n insurance: insuranceVisible,\n specialty: specialtyVisible,\n service: serviceVisible,\n operator: operatorVisible,\n date: dateVisible,\n slot: slotVisible,\n details: detailsVisible,\n onboardingIncomplete,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Step number derivation */\n/* -------------------------------------------------------------------- */\n\nfunction deriveStep(\n inputs: CascadeInputs,\n gates: CascadeGates,\n): { currentStep: CascadeStep; visibleSteps: CascadeStep[] } {\n const visible: CascadeStep[] = [];\n if (gates.insurance) visible.push(1);\n if (gates.specialty) visible.push(2);\n visible.push(3); // service is always required\n if (gates.operator) visible.push(4);\n visible.push(5); // date is always required (after service)\n visible.push(6); // slot is always required\n visible.push(7); // details is always required (the final submit step)\n\n const isFulfilled: Record<CascadeStep, boolean> = {\n 1: inputs.value.insuranceType !== undefined,\n 2: inputs.value.specialtyId !== undefined,\n 3: inputs.value.serviceId !== undefined,\n 4: inputs.value.operatorId !== undefined,\n 5: inputs.value.date !== undefined,\n 6: inputs.value.slotKey !== undefined,\n 7: false, // details fulfilment is owned by the form's own validation\n };\n\n const firstIncomplete = visible.find((s) => !isFulfilled[s]);\n return {\n currentStep: firstIncomplete ?? 7,\n visibleSteps: visible,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Main derive */\n/* -------------------------------------------------------------------- */\n\nexport function deriveCascade(inputs: CascadeInputs): CascadeOutputs {\n const filtered: CascadeFiltered = {\n specialties: filterSpecialties(inputs),\n services: filterServices(inputs),\n operators: eligibleOperators(inputs),\n };\n const gates = computeGates(inputs, filtered);\n const { currentStep, visibleSteps } = deriveStep(inputs, gates);\n\n // Look up the selected slot for variant bodies that want to render it\n // (e.g. the \"Confirm at HH:mm on DATE\" summary line above the details\n // form). Cheaper to do here than make each variant re-search.\n let selectedSlot: BookingSlot | undefined;\n if (inputs.value.date && inputs.value.slotKey) {\n const day = inputs.availableSlots[inputs.value.date];\n if (day) selectedSlot = day.find((s) => s.key === inputs.value.slotKey);\n }\n\n const selectedService = inputs.value.serviceId\n ? inputs.services.find((s) => s.id === inputs.value.serviceId)\n : undefined;\n\n const isReadyToSubmit =\n inputs.value.serviceId !== undefined &&\n inputs.value.date !== undefined &&\n inputs.value.slotKey !== undefined &&\n (!gates.insurance || inputs.value.insuranceType !== undefined) &&\n (!gates.specialty || inputs.value.specialtyId !== undefined);\n\n return {\n gates,\n filtered,\n currentStep,\n totalSteps: visibleSteps.length,\n visibleSteps,\n isReadyToSubmit,\n durationMin: selectedService?.durationMin,\n selectedSlot,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Reset helpers — pure, return next value */\n/* */\n/* Every cascade change clears downstream selections so the user never */\n/* lands on a fulfilled-but-inconsistent state. */\n/* -------------------------------------------------------------------- */\n\nexport function resetOnInsuranceChange(\n value: BookingValue,\n next: InsuranceType | undefined,\n): BookingValue {\n return {\n ...value,\n insuranceType: next,\n specialtyId: undefined,\n serviceId: undefined,\n operatorId: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\nexport function resetOnSpecialtyChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n specialtyId: next,\n serviceId: undefined,\n operatorId: undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\nexport function resetOnServiceChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n serviceId: next,\n // Default the operator to the \"All operators\" sentinel so a patient\n // who doesn't care about picking lands on a satisfied step 4 without\n // any further input.\n operatorId: next ? OPERATORS_ALL : undefined,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\nexport function resetOnOperatorChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n operatorId: next,\n date: undefined,\n slotKey: undefined,\n details: undefined,\n };\n}\n\nexport function resetOnDateChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n date: next,\n slotKey: undefined,\n // Keep details — date/slot changes shouldn't wipe the patient form\n // since the user has already filled some fields.\n };\n}\n\nexport function resetOnSlotChange(\n value: BookingValue,\n next: string | undefined,\n): BookingValue {\n return {\n ...value,\n slotKey: next,\n };\n}\n\n/* -------------------------------------------------------------------- */\n/* Auto-pre-select normalisation */\n/* */\n/* Called once on mount (and whenever the inputs that trigger them */\n/* arrive — e.g. when `specialties` populates from a fetch). Returns the */\n/* value possibly mutated with the auto-picked fields. Callers should */\n/* compare the result to the input and fire `onChange` once if they */\n/* differ so the consumer sees the normalised value. */\n/* -------------------------------------------------------------------- */\n\nexport function applyAutoSelects(\n value: BookingValue,\n inputs: CascadePolicy & {\n specialties: BookingSpecialty[];\n services: BookingService[];\n },\n): BookingValue {\n let next = value;\n\n // Rule 1: locked operator pins step 4.\n if (inputs.lockedOperatorId && next.operatorId !== inputs.lockedOperatorId) {\n next = { ...next, operatorId: inputs.lockedOperatorId };\n }\n\n // Rule 2: single specialty auto-skips step 2.\n const useSpecialtiesResolved =\n inputs.useSpecialties === undefined\n ? inputs.specialties.length > 0\n : inputs.useSpecialties;\n if (\n useSpecialtiesResolved &&\n inputs.specialties.length === 1 &&\n next.specialtyId === undefined\n ) {\n next = { ...next, specialtyId: inputs.specialties[0].id };\n }\n\n // Rule 3: single resolved service auto-fills step 3 — only when explicitly\n // opted into. The spec says specialty auto-select is always on, but\n // service auto-select is opt-in because UX teams may want explicit\n // confirmation.\n if (inputs.autoSelectSingleService) {\n const resolvedServices = next.specialtyId\n ? inputs.services.filter((s) => s.specialtyId === next.specialtyId)\n : inputs.services;\n if (resolvedServices.length === 1 && next.serviceId === undefined) {\n next = { ...next, serviceId: resolvedServices[0].id };\n // Mirror resetOnServiceChange's operator default.\n if (next.operatorId === undefined) {\n next = { ...next, operatorId: OPERATORS_ALL };\n }\n }\n }\n\n return next;\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers exposed for the variants (and tests). */\n/* -------------------------------------------------------------------- */\n\n/** Resolve the active operator id, treating the `'all'` sentinel as `undefined`. */\nexport function resolveOperatorId(value: BookingValue): string | undefined {\n if (!value.operatorId) return undefined;\n if (value.operatorId === OPERATORS_ALL) return undefined;\n return value.operatorId;\n}\n\n/* -------------------------------------------------------------------- */\n/* Confirmation channels — smart default + ordering */\n/* -------------------------------------------------------------------- */\n\n/**\n * Naïve E.164-ish check for the smart-default heuristic. Doesn't validate\n * the phone fully — just confirms the patient has typed *something* that\n * looks like a phone number, so we can decide whether to pre-tick WhatsApp.\n */\nfunction looksLikePhone(value: string | undefined): boolean {\n if (!value) return false;\n const trimmed = value.trim();\n // Require a leading \"+\" or country code-style digits + at least 8 chars.\n return /^\\+?\\d[\\d\\s\\-()]{6,}$/.test(trimmed);\n}\n\n/**\n * Resolve the effective list of enabled channels. Falls back to `['email']`\n * when the consumer omits the prop, preserving the pre-amendment behaviour.\n */\nexport function resolveConfirmationChannels(\n enabled: ConfirmationChannel[] | undefined,\n): ConfirmationChannel[] {\n const list = enabled && enabled.length > 0 ? enabled : ['email'];\n // Canonical order: email → whatsapp → sms.\n const set = new Set(list);\n return CONFIRMATION_CHANNEL_ORDER.filter((c) => set.has(c));\n}\n\n/**\n * Compute the channels to pre-check. Result is intersected with `enabled`\n * for safety so a channel the practice didn't enable never gets ticked.\n *\n * Rules (per spec):\n * 1. Always include 'email'.\n * 2. Include 'whatsapp' if enabled AND mobile looks plausible.\n * 3. Include 'sms' ONLY when whatsapp is NOT in `enabled`.\n * 4. If the consumer passes `override`, honour it verbatim (still\n * intersected with `enabled` for safety).\n */\nexport function defaultConfirmationSelection(\n enabled: ConfirmationChannel[] | undefined,\n mobile: string | undefined,\n override?: ConfirmationChannel[],\n): ConfirmationChannel[] {\n const resolvedEnabled = resolveConfirmationChannels(enabled);\n const enabledSet = new Set(resolvedEnabled);\n\n if (override) {\n return CONFIRMATION_CHANNEL_ORDER.filter(\n (c) => override.includes(c) && enabledSet.has(c),\n );\n }\n\n const out: ConfirmationChannel[] = [];\n if (enabledSet.has('email')) out.push('email');\n\n const mobilePlausible = looksLikePhone(mobile);\n const hasWhatsApp = enabledSet.has('whatsapp');\n if (hasWhatsApp && mobilePlausible) out.push('whatsapp');\n // SMS is pre-checked whenever WhatsApp is not in the enabled set —\n // the spec doesn't gate this on a mobile-present check (matches rule 3).\n if (!hasWhatsApp && enabledSet.has('sms')) out.push('sms');\n\n // Final canonical order pass.\n const outSet = new Set(out);\n return CONFIRMATION_CHANNEL_ORDER.filter((c) => outSet.has(c));\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Trans } from 'react-i18next';\nimport { Alert } from '../alert/alert';\nimport { Button } from '../button/button';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { CheckboxGroup } from '../checkbox-group/checkbox-group';\nimport { DatePicker } from '../date-picker/date-picker';\nimport { EmailInput } from '../email-input/email-input';\nimport { FormField } from '../form-field/form-field';\nimport { PhoneInput } from '../phone-input/phone-input';\nimport { TextArea } from '../text-area/text-area';\nimport { TextInput } from '../text-input/text-input';\nimport { Spinner } from '../spinner/spinner';\nimport {\n defaultConfirmationSelection,\n resolveConfirmationChannels,\n} from './cascade';\nimport type {\n BookingDetails,\n BookingValidator,\n ConfirmationChannel,\n} from './booking-types';\n\n/* -------------------------------------------------------------------- */\n/* BookingDetailsForm — step 7 of the cascade. */\n/* */\n/* Captures the patient's identity + contact + consents before submit. */\n/* The form's `onChange` fires per-field so the parent value can persist */\n/* a partial across step navigation; the parent's `onSubmit` is called */\n/* with the full `BookingDetails` payload only when every required field */\n/* + both consents validate. */\n/* -------------------------------------------------------------------- */\n\nconst NOTE_MAX_LENGTH = 500;\nconst CF_REGEX = /^[A-Z0-9]{16}$/;\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst VALIDATE_DEBOUNCE_MS = 300;\n\n/* -------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------- */\n\nexport interface BookingDetailsFormProps {\n value: Partial<BookingDetails>;\n onChange: (next: Partial<BookingDetails>) => void;\n onSubmit: (details: BookingDetails) => void | Promise<void>;\n\n // Opt-in fields\n requireCodiceFiscale?: boolean;\n requireDateOfBirth?: boolean;\n /** When `true` AND `insuranceType === 'public'`, render the Versichertennummer field. */\n requireInsuranceNumber?: boolean;\n insuranceType?: 'private' | 'public';\n showNote?: boolean;\n showReturningPatientFlag?: boolean;\n\n // Consent labels\n privacyPolicyUrl?: string;\n termsUrl?: string;\n\n // Validation hooks\n validateCodiceFiscale?: BookingValidator;\n validateInsuranceNumber?: BookingValidator;\n\n // UX\n submitting?: boolean;\n /** Optional summary node rendered above the form (e.g. confirm-time chip). */\n summarySlot?: ReactNode;\n\n // Phone country default — propagated from the practice country code so\n // the country prefix selector starts on the right option.\n defaultPhoneCountry?: string;\n\n // Confirmation-channel picker (sub-section of step 7)\n /**\n * Channels the practice has enabled. When omitted, defaults to\n * `['email']` (picker hidden — single implicit channel). When the\n * resolved list has length 1 the picker stays hidden.\n */\n confirmationChannels?: ConfirmationChannel[];\n /** Pre-checked channels override; falls back to a smart default. */\n defaultConfirmationChannels?: ConfirmationChannel[];\n /**\n * Render an error Alert above the submit button. Set after an\n * `onSubmit` rejection, clear before retrying. The kit doesn't\n * disable the submit button while this is set — the patient can\n * re-submit immediately.\n */\n submitError?: ReactNode;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\ninterface AsyncStatus {\n state: 'idle' | 'pending' | 'valid' | 'invalid';\n hint?: string;\n}\n\nconst idleStatus: AsyncStatus = { state: 'idle' };\n\nexport const BookingDetailsForm = forwardRef<\n HTMLFormElement,\n BookingDetailsFormProps\n>(\n (\n {\n value,\n onChange,\n onSubmit,\n requireCodiceFiscale = false,\n requireDateOfBirth = false,\n requireInsuranceNumber = false,\n insuranceType,\n showNote = false,\n showReturningPatientFlag = false,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n submitting = false,\n summarySlot,\n defaultPhoneCountry,\n confirmationChannels,\n defaultConfirmationChannels,\n submitError,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const formId = useId();\n\n // Async-validation state per field.\n const [cfStatus, setCfStatus] = useState<AsyncStatus>(idleStatus);\n const [insuranceStatus, setInsuranceStatus] =\n useState<AsyncStatus>(idleStatus);\n\n // Show-validation-error toggle — flips on first blur / submit attempt\n // so the inline errors don't shout at the user mid-typing.\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n const markTouched = useCallback(\n (field: string) => setTouched((t) => ({ ...t, [field]: true })),\n [],\n );\n\n // Per-field debounce timers for the async validators.\n const cfTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const insuranceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (cfTimerRef.current) clearTimeout(cfTimerRef.current);\n if (insuranceTimerRef.current) clearTimeout(insuranceTimerRef.current);\n },\n [],\n );\n\n /* -------------------------- Mutators ---------------------------- */\n\n const update = useCallback(\n (patch: Partial<BookingDetails>) => onChange({ ...value, ...patch }),\n [value, onChange],\n );\n\n /* -------------------- Confirmation-channel picker ---------------- */\n\n const resolvedEnabledChannels = useMemo(\n () => resolveConfirmationChannels(confirmationChannels),\n [confirmationChannels],\n );\n const pickerVisible = resolvedEnabledChannels.length >= 2;\n\n // Smart-default the selection once on mount (and whenever the inputs\n // that drive it change — `mobilePhone` toggles WhatsApp eligibility).\n // We only seed when the parent value is undefined so the patient's own\n // changes win.\n const seededRef = useRef(false);\n useEffect(() => {\n if (!pickerVisible) {\n // Implicit single channel — strip any stale selection.\n if (value.confirmationChannels !== undefined) {\n update({ confirmationChannels: undefined });\n }\n return;\n }\n if (value.confirmationChannels !== undefined) {\n seededRef.current = true;\n return;\n }\n const seed = defaultConfirmationSelection(\n resolvedEnabledChannels,\n value.mobilePhone,\n defaultConfirmationChannels,\n );\n seededRef.current = true;\n update({ confirmationChannels: seed });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n pickerVisible,\n resolvedEnabledChannels,\n value.mobilePhone,\n defaultConfirmationChannels,\n ]);\n\n const selectedChannels = useMemo<ConfirmationChannel[]>(\n () => value.confirmationChannels ?? [],\n [value.confirmationChannels],\n );\n const noChannelsSelected = pickerVisible && selectedChannels.length === 0;\n\n /* -------------------------- CF async ---------------------------- */\n\n useEffect(() => {\n const cf = value.codiceFiscale;\n if (!requireCodiceFiscale || !validateCodiceFiscale || !cf) {\n setCfStatus(idleStatus);\n return;\n }\n if (!CF_REGEX.test(cf)) {\n // Don't fire the async validator until the format is plausible.\n setCfStatus({\n state: 'invalid',\n hint: t('booking.details.codiceFiscale.invalidFormat'),\n });\n return;\n }\n setCfStatus({ state: 'pending' });\n if (cfTimerRef.current) clearTimeout(cfTimerRef.current);\n cfTimerRef.current = setTimeout(() => {\n validateCodiceFiscale(cf)\n .then((res) =>\n setCfStatus(\n res.valid\n ? { state: 'valid' }\n : { state: 'invalid', hint: res.hint },\n ),\n )\n .catch(() =>\n setCfStatus({\n state: 'invalid',\n hint: t('booking.details.codiceFiscale.unavailable'),\n }),\n );\n }, VALIDATE_DEBOUNCE_MS);\n }, [requireCodiceFiscale, validateCodiceFiscale, value.codiceFiscale, t]);\n\n /* ----------------------- Insurance async ------------------------ */\n\n const insuranceShown = requireInsuranceNumber && insuranceType === 'public';\n useEffect(() => {\n const n = value.insuranceNumber;\n if (!insuranceShown || !validateInsuranceNumber || !n) {\n setInsuranceStatus(idleStatus);\n return;\n }\n setInsuranceStatus({ state: 'pending' });\n if (insuranceTimerRef.current) clearTimeout(insuranceTimerRef.current);\n insuranceTimerRef.current = setTimeout(() => {\n validateInsuranceNumber(n)\n .then((res) =>\n setInsuranceStatus(\n res.valid\n ? { state: 'valid' }\n : { state: 'invalid', hint: res.hint },\n ),\n )\n .catch(() =>\n setInsuranceStatus({\n state: 'invalid',\n hint: t('booking.details.insuranceNumber.unavailable'),\n }),\n );\n }, VALIDATE_DEBOUNCE_MS);\n }, [insuranceShown, validateInsuranceNumber, value.insuranceNumber, t]);\n\n /* ------------------------- Validation --------------------------- */\n\n const emailValid = useMemo(\n () => Boolean(value.email && EMAIL_REGEX.test(value.email)),\n [value.email],\n );\n const phoneValid = useMemo(\n () => Boolean(value.mobilePhone && value.mobilePhone.length >= 6),\n [value.mobilePhone],\n );\n\n const requiredFieldsValid = useMemo(() => {\n if (!value.firstName?.trim()) return false;\n if (!value.lastName?.trim()) return false;\n if (!emailValid) return false;\n if (!phoneValid) return false;\n if (requireCodiceFiscale && cfStatus.state !== 'valid') return false;\n if (requireDateOfBirth && !value.dateOfBirth) return false;\n if (insuranceShown && insuranceStatus.state !== 'valid') return false;\n return true;\n }, [\n value.firstName,\n value.lastName,\n emailValid,\n phoneValid,\n requireCodiceFiscale,\n cfStatus.state,\n requireDateOfBirth,\n value.dateOfBirth,\n insuranceShown,\n insuranceStatus.state,\n ]);\n\n const consentsTicked = Boolean(value.privacyConsent && value.termsConsent);\n const channelsSatisfied = !pickerVisible || selectedChannels.length > 0;\n const canSubmit =\n requiredFieldsValid && consentsTicked && channelsSatisfied && !submitting;\n\n /* --------------------------- Submit ----------------------------- */\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n // Surface every validation error on submit attempt.\n setTouched({\n firstName: true,\n lastName: true,\n email: true,\n mobilePhone: true,\n codiceFiscale: true,\n dateOfBirth: true,\n insuranceNumber: true,\n });\n if (!canSubmit) return;\n const payload: BookingDetails = {\n firstName: value.firstName!.trim(),\n lastName: value.lastName!.trim(),\n email: value.email!.trim(),\n mobilePhone: value.mobilePhone!,\n privacyConsent: true,\n termsConsent: true,\n codiceFiscale: value.codiceFiscale,\n dateOfBirth: value.dateOfBirth,\n insuranceNumber: value.insuranceNumber,\n note: value.note,\n returningPatient: value.returningPatient,\n // Only include when the picker was visible; otherwise the single\n // implicit channel is inferred backend-side from the practice\n // config.\n confirmationChannels: pickerVisible ? selectedChannels : undefined,\n };\n onSubmit(payload);\n };\n\n /* ---------------------- Consent label JSX ----------------------- */\n\n // Translated label with an embedded link to the policy URL. Uses\n // <Trans> so the link target is bound at render rather than baked\n // into the localised string.\n const renderConsentLabel = (\n i18nKey: string,\n url: string | undefined,\n ): ReactNode => {\n // Strip the link if the URL isn't http(s) — guards against\n // `javascript:` / `data:` URIs reaching the rendered `href`.\n const safeUrl = url && /^https?:\\/\\//i.test(url) ? url : undefined;\n if (!safeUrl) {\n return t(i18nKey);\n }\n return (\n <Trans\n i18nKey={i18nKey}\n components={{\n // The `<Trans>` runtime injects link text from the i18n\n // string. The anchor renders empty at static-analysis time,\n // so `jsx-a11y/anchor-has-content` would false-flag — silence\n // it; the runtime content is the localised policy / terms\n // label.\n policyLink: (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a\n href={safeUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ds:underline ds:text-[var(--primary)]\"\n />\n ),\n }}\n />\n );\n };\n\n return (\n <form\n ref={ref}\n id={formId}\n noValidate\n onSubmit={handleSubmit}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n {summarySlot}\n\n {/* Identity */}\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n <FormField\n label={t('booking.details.firstName.label')}\n required\n error={\n touched.firstName && !value.firstName?.trim()\n ? t('booking.details.firstName.required')\n : undefined\n }\n >\n <TextInput\n autoComplete=\"given-name\"\n value={value.firstName ?? ''}\n onChange={(e) => update({ firstName: e.target.value })}\n onBlur={() => markTouched('firstName')}\n />\n </FormField>\n <FormField\n label={t('booking.details.lastName.label')}\n required\n error={\n touched.lastName && !value.lastName?.trim()\n ? t('booking.details.lastName.required')\n : undefined\n }\n >\n <TextInput\n autoComplete=\"family-name\"\n value={value.lastName ?? ''}\n onChange={(e) => update({ lastName: e.target.value })}\n onBlur={() => markTouched('lastName')}\n />\n </FormField>\n </div>\n\n {/* Contact */}\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n <FormField\n label={t('booking.details.email.label')}\n required\n error={\n touched.email && !emailValid\n ? t('booking.details.email.invalid')\n : undefined\n }\n >\n <EmailInput\n value={value.email ?? ''}\n onChange={(e) => update({ email: e.target.value })}\n onBlur={() => markTouched('email')}\n />\n </FormField>\n <FormField\n label={t('booking.details.mobilePhone.label')}\n required\n error={\n touched.mobilePhone && !phoneValid\n ? t('booking.details.mobilePhone.invalid')\n : undefined\n }\n >\n <PhoneInput\n value={value.mobilePhone ?? ''}\n defaultCountry={\n defaultPhoneCountry?.toUpperCase() as\n | 'IT'\n | 'DE'\n | 'GB'\n | undefined\n }\n onChange={(e164) => {\n update({ mobilePhone: e164 });\n markTouched('mobilePhone');\n }}\n />\n </FormField>\n </div>\n\n {/* Optional identity fields */}\n {requireCodiceFiscale || requireDateOfBirth ? (\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n {requireCodiceFiscale ? (\n <FormField\n label={t('booking.details.codiceFiscale.label')}\n required\n description={\n cfStatus.state === 'pending'\n ? t('booking.details.codiceFiscale.checking')\n : t('booking.details.codiceFiscale.helper')\n }\n error={\n touched.codiceFiscale && cfStatus.state === 'invalid'\n ? (cfStatus.hint ??\n t('booking.details.codiceFiscale.invalid'))\n : undefined\n }\n >\n <TextInput\n value={value.codiceFiscale ?? ''}\n maxLength={16}\n onChange={(e) =>\n update({\n codiceFiscale: e.target.value.slice(0, 16).toUpperCase(),\n })\n }\n onBlur={() => markTouched('codiceFiscale')}\n />\n </FormField>\n ) : null}\n {requireDateOfBirth ? (\n <FormField\n label={t('booking.details.dateOfBirth.label')}\n required\n error={\n touched.dateOfBirth && !value.dateOfBirth\n ? t('booking.details.dateOfBirth.required')\n : undefined\n }\n >\n <DatePicker\n value={\n value.dateOfBirth ? new Date(value.dateOfBirth) : undefined\n }\n onChange={(next: Date | undefined) => {\n update({\n dateOfBirth: next\n ? next.toISOString().slice(0, 10)\n : undefined,\n });\n markTouched('dateOfBirth');\n }}\n />\n </FormField>\n ) : null}\n </div>\n ) : null}\n\n {insuranceShown ? (\n <FormField\n label={t('booking.details.insuranceNumber.label')}\n required\n description={\n insuranceStatus.state === 'pending'\n ? t('booking.details.insuranceNumber.checking')\n : undefined\n }\n error={\n touched.insuranceNumber && insuranceStatus.state === 'invalid'\n ? (insuranceStatus.hint ??\n t('booking.details.insuranceNumber.invalid'))\n : undefined\n }\n >\n <TextInput\n value={value.insuranceNumber ?? ''}\n onChange={(e) => update({ insuranceNumber: e.target.value })}\n onBlur={() => markTouched('insuranceNumber')}\n />\n </FormField>\n ) : null}\n\n {showNote ? (\n <FormField\n label={t('booking.details.note.label')}\n description={t('booking.details.note.helper', {\n max: NOTE_MAX_LENGTH,\n })}\n >\n <TextArea\n value={value.note ?? ''}\n maxLength={NOTE_MAX_LENGTH}\n rows={3}\n onChange={(e) => update({ note: e.target.value })}\n />\n </FormField>\n ) : null}\n\n {showReturningPatientFlag ? (\n <Checkbox\n checked={Boolean(value.returningPatient)}\n onCheckedChange={(checked) =>\n update({ returningPatient: checked === true })\n }\n label={t('booking.details.returningPatient.label')}\n />\n ) : null}\n\n {/* Consents — privacy + T&C. Both required for submit. */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <Checkbox\n checked={Boolean(value.privacyConsent)}\n onCheckedChange={(checked) =>\n update({ privacyConsent: checked === true })\n }\n label={\n <>\n {renderConsentLabel(\n 'booking.details.consent.privacy.label',\n privacyPolicyUrl,\n )}\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[var(--destructive)] ds:ms-[var(--spacing-2xs)]\"\n >\n *\n </span>\n </>\n }\n />\n <Checkbox\n checked={Boolean(value.termsConsent)}\n onCheckedChange={(checked) =>\n update({ termsConsent: checked === true })\n }\n label={\n <>\n {renderConsentLabel(\n 'booking.details.consent.terms.label',\n termsUrl,\n )}\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[var(--destructive)] ds:ms-[var(--spacing-2xs)]\"\n >\n *\n </span>\n </>\n }\n />\n </div>\n\n {pickerVisible ? (\n <div\n data-component=\"booking-confirmation-channels\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <CheckboxGroup\n label={t('booking.confirmation.heading')}\n helperText={t('booking.confirmation.helper')}\n value={selectedChannels}\n onChange={(next) =>\n update({\n confirmationChannels: next as ConfirmationChannel[],\n })\n }\n orientation=\"vertical\"\n options={resolvedEnabledChannels.map((c) => ({\n value: c,\n label: t(`booking.confirmation.channel.${c}`),\n }))}\n error={\n noChannelsSelected\n ? t('booking.confirmation.atLeastOne')\n : undefined\n }\n />\n </div>\n ) : null}\n\n {submitError ? (\n <Alert variant=\"error\">\n <Alert.Description>{submitError}</Alert.Description>\n </Alert>\n ) : null}\n\n <Button\n intent=\"primary\"\n size=\"md\"\n type=\"submit\"\n disabled={!canSubmit}\n startIcon={submitting ? <Spinner size=\"sm\" /> : undefined}\n >\n {t('booking.details.submit')}\n </Button>\n </form>\n );\n },\n);\n\nBookingDetailsForm.displayName = 'BookingDetailsForm';\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n Activity,\n Baby,\n Bone,\n Brain,\n CalendarRange,\n ChevronLeft,\n ChevronRight,\n ClipboardCheck,\n Ear,\n Eye,\n HeartPulse,\n Microscope,\n Moon,\n Pill,\n ScanLine,\n Scissors,\n Smile,\n Sparkles,\n Stethoscope,\n Sun,\n Sunset,\n Syringe,\n type LucideIcon,\n} from 'lucide-react';\nimport {\n addMonths,\n endOfMonth,\n format as fnsFormat,\n isSameDay,\n isSameMonth,\n parseISO,\n startOfMonth,\n subMonths,\n} from 'date-fns';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { bookingAgent } from './booking.agent';\nimport {\n OPERATORS_ALL,\n applyAutoSelects,\n deriveCascade,\n resetOnDateChange,\n resetOnInsuranceChange,\n resetOnOperatorChange,\n resetOnServiceChange,\n resetOnSlotChange,\n resetOnSpecialtyChange,\n resolveOperatorId,\n type CascadeOutputs,\n type CascadeStep,\n} from './cascade';\nimport { BookingDetailsForm } from './details-form';\nimport type {\n BookingDetails,\n BookingHandle,\n BookingOperator,\n BookingProps,\n BookingService,\n BookingSlot,\n BookingSpecialty,\n BookingValue,\n BookingVariant,\n InsuranceType,\n} from './booking-types';\nimport { Alert } from '../alert/alert';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { Select, type SelectOption } from '../select/select';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { StepperAccordion } from '../stepper-accordion/stepper-accordion';\nimport { StepperProgress } from '../stepper-progress/stepper-progress';\n\n/* -------------------------------------------------------------------- */\n/* Re-exports */\n/* */\n/* Public types live in `booking-types.ts` so the cascade engine can */\n/* import them without a circular dep. Re-exported here so consumers */\n/* keep importing from `@alfadocs/ui-kit/booking`. */\n/* -------------------------------------------------------------------- */\n\nexport type {\n BookingDetails,\n BookingHandle,\n BookingOperator,\n BookingProps,\n BookingService,\n BookingSlot,\n BookingSpecialty,\n BookingSubmitPayload,\n BookingValidationResult,\n BookingValidator,\n BookingValue,\n BookingVariant,\n ConfirmationChannel,\n InsuranceType,\n} from './booking-types';\nexport { CONFIRMATION_CHANNEL_ORDER } from './booking-types';\nexport { OPERATORS_ALL } from './cascade';\n\n/* -------------------------------------------------------------------- */\n/* Root variant CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:text-[var(--foreground)]',\n {\n variants: {\n variant: {\n 'inline-list': 'ds:gap-[var(--spacing-md)]',\n accordion: 'ds:gap-[var(--spacing-md)]',\n calendar: 'ds:gap-[var(--spacing-md)]',\n flexible: 'ds:gap-[var(--spacing-lg)]',\n progress: 'ds:gap-[var(--spacing-sm)]',\n },\n // `surface=\"elevated\"` matches `Card variant=\"elevated\"` — same\n // tokens, same padding, same boundary behaviour — so consumers can\n // drop their own Card wraps without a double-card look. Default\n // `'flat'` preserves 0.30.x rendering.\n surface: {\n flat: '',\n elevated: [\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:shadow-[var(--shadow-card)]',\n 'ds:p-[var(--spacing-md)]',\n ].join(' '),\n },\n },\n defaultVariants: { variant: 'inline-list', surface: 'flat' },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Icon inference (kept from 0.25.x — services don't carry an explicit */\n/* icon prop, so we fall back to a keyword-matched Lucide icon). */\n/* -------------------------------------------------------------------- */\n\ntype IconRule = readonly [RegExp, LucideIcon];\n\nconst SERVICE_ICON_RULES: readonly IconRule[] = [\n [\n /\\b(estetic|aesthetic|botox|filler|mesoterap|chirurgia\\s*plastic)/i,\n Syringe,\n ],\n [/\\b(cardio|ecg|elettrocardio|ecocardio|cuore|heart)/i, HeartPulse],\n [/\\b(dent|odonto|tooth|teeth|pulizia|igien|smile)/i, Smile],\n [/\\b(oftalmo|ocul|ophthal|vision|occhi|eye)/i, Eye],\n [/\\b(otorin|udito|orecchi|hearing|ear)/i, Ear],\n [/\\b(neuro|brain|cervello)/i, Brain],\n [/\\b(pediatr|child|bambin)/i, Baby],\n [/\\b(ortop|ortho|osteo|skeleton|ossa|bone)/i, Bone],\n [/\\b(lab|analis|test|sang|esami)/i, Microscope],\n [/\\b(farmaco|pharm|pillol|refill)/i, Pill],\n [/\\b(chirurg|surg|intervent|operat)/i, Scissors],\n [/\\b(scan|rx|x-?ray|raggi|imag|radio|risonan|ecograf|ultras)/i, ScanLine],\n [/\\b(vacc|inject|inie|punto)/i, Syringe],\n [/\\b(derma|skin|pelle)/i, Sparkles],\n [/\\b(prima\\s*visit|first\\s*visit|consult|consulto|valutaz)/i, ClipboardCheck],\n [/\\b(general|medicin|family|control|check[-\\s]?up)/i, Activity],\n];\n\nfunction pickIcon(text: string): LucideIcon | null {\n for (const [pattern, Icon] of SERVICE_ICON_RULES) {\n if (pattern.test(text)) return Icon;\n }\n return null;\n}\n\nfunction inferServiceIcon(service: BookingService): ReactNode {\n const Icon = pickIcon(service.label) ?? Stethoscope;\n return <Icon aria-hidden=\"true\" className=\"ds:size-5\" />;\n}\n\n/* -------------------------------------------------------------------- */\n/* Shared helpers */\n/* -------------------------------------------------------------------- */\n\nfunction isoOf(date: Date): string {\n return fnsFormat(date, 'yyyy-MM-dd');\n}\n\n/* -------------------------------------------------------------------- */\n/* MonthGrid — inline 6×7 calendar with roving tabindex */\n/* -------------------------------------------------------------------- */\n\ninterface MonthGridProps {\n availableDates: string[];\n selectedDate?: string;\n onSelectDate: (iso: string) => void;\n locale: string;\n loading?: boolean;\n}\n\nconst monthCellBase = [\n 'ds:relative ds:flex ds:items-center ds:justify-center',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[length:var(--font-size-sm)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)]',\n '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-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nconst monthCellVariants = cva(monthCellBase, {\n variants: {\n state: {\n available:\n 'ds:cursor-pointer ds:text-[var(--foreground)] ds:hover:bg-[var(--muted)]/30',\n unavailable: 'ds:cursor-not-allowed ds:text-[var(--muted-foreground)]/60',\n selected:\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)] ds:font-[var(--font-weight-semibold)]',\n outside: 'ds:text-[var(--muted-foreground)]/40',\n },\n },\n defaultVariants: { state: 'unavailable' },\n});\n\nfunction MonthGrid({\n availableDates,\n selectedDate,\n onSelectDate,\n locale,\n loading,\n}: MonthGridProps) {\n const { t } = useTranslation();\n\n const initialMonth = useMemo<Date>(() => {\n if (selectedDate) return startOfMonth(parseISO(selectedDate));\n if (availableDates.length > 0) {\n return startOfMonth(parseISO(availableDates[0]));\n }\n return startOfMonth(new Date());\n }, [selectedDate, availableDates]);\n\n const [viewMonth, setViewMonth] = useState<Date>(initialMonth);\n const [focusDate, setFocusDate] = useState<Date | null>(null);\n\n const cells = useMemo(() => {\n const monthStart = startOfMonth(viewMonth);\n const monthEnd = endOfMonth(viewMonth);\n const startWeekday = monthStart.getDay();\n const totalDays = monthEnd.getDate();\n const grid: Date[] = [];\n for (let i = startWeekday; i > 0; i -= 1) {\n const d = new Date(monthStart);\n d.setDate(monthStart.getDate() - i);\n grid.push(d);\n }\n for (let i = 0; i < totalDays; i += 1) {\n const d = new Date(monthStart);\n d.setDate(monthStart.getDate() + i);\n grid.push(d);\n }\n while (grid.length < 42) {\n const last = grid[grid.length - 1];\n const d = new Date(last);\n d.setDate(last.getDate() + 1);\n grid.push(d);\n }\n return grid;\n }, [viewMonth]);\n\n const monthLabel = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n month: 'long',\n year: 'numeric',\n }).format(viewMonth);\n } catch {\n return fnsFormat(viewMonth, 'MMMM yyyy');\n }\n }, [viewMonth, locale]);\n\n const weekdayLabels = useMemo(() => {\n const base = new Date(2024, 0, 7);\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(base);\n d.setDate(base.getDate() + i);\n try {\n return new Intl.DateTimeFormat(locale, { weekday: 'short' }).format(d);\n } catch {\n return fnsFormat(d, 'EEE');\n }\n });\n }, [locale]);\n\n const availableSet = useMemo(() => new Set(availableDates), [availableDates]);\n const isAvailable = useCallback(\n (date: Date) => availableSet.has(isoOf(date)),\n [availableSet],\n );\n\n const rovingDate = useMemo<Date | null>(() => {\n if (focusDate) return focusDate;\n if (selectedDate) return parseISO(selectedDate);\n const firstAvailable = cells.find(\n (d) => isSameMonth(d, viewMonth) && isAvailable(d),\n );\n if (firstAvailable) return firstAvailable;\n return cells.find((d) => isSameMonth(d, viewMonth)) ?? null;\n }, [focusDate, selectedDate, cells, viewMonth, isAvailable]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, current: Date) => {\n let next: Date | null = null;\n switch (event.key) {\n case 'ArrowLeft':\n next = new Date(current);\n next.setDate(current.getDate() - 1);\n break;\n case 'ArrowRight':\n next = new Date(current);\n next.setDate(current.getDate() + 1);\n break;\n case 'ArrowUp':\n next = new Date(current);\n next.setDate(current.getDate() - 7);\n break;\n case 'ArrowDown':\n next = new Date(current);\n next.setDate(current.getDate() + 7);\n break;\n case 'Home':\n next = new Date(current);\n next.setDate(current.getDate() - current.getDay());\n break;\n case 'End':\n next = new Date(current);\n next.setDate(current.getDate() + (6 - current.getDay()));\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (isAvailable(current)) onSelectDate(isoOf(current));\n return;\n }\n default:\n return;\n }\n if (!next) return;\n event.preventDefault();\n if (!isSameMonth(next, viewMonth)) {\n setViewMonth(startOfMonth(next));\n }\n setFocusDate(next);\n },\n [isAvailable, onSelectDate, viewMonth],\n );\n\n if (loading) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={t('common.loading')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <Skeleton variant=\"text\" width=\"40%\" />\n <div className=\"ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-2xs)]\">\n {Array.from({ length: 42 }, (_, i) => (\n <Skeleton key={`mg-skel-${i}`} variant=\"rounded\" height=\"2.5rem\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <IconButton\n icon={<ChevronLeft />}\n aria-label={t('booking.previousMonth')}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => {\n setViewMonth((m) => subMonths(m, 1));\n setFocusDate(null);\n }}\n />\n <span\n className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\"\n aria-live=\"polite\"\n >\n {monthLabel}\n </span>\n <IconButton\n icon={<ChevronRight />}\n aria-label={t('booking.nextMonth')}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => {\n setViewMonth((m) => addMonths(m, 1));\n setFocusDate(null);\n }}\n />\n </div>\n <div\n role=\"grid\"\n aria-label={t('booking.monthGridLabel')}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <div\n role=\"row\"\n className=\"ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-2xs)]\"\n >\n {weekdayLabels.map((label, i) => (\n <div\n key={`wd-${i}`}\n role=\"columnheader\"\n className=\"type-meta ds:text-center ds:text-[var(--muted-foreground)] ds:font-[var(--font-weight-medium)]\"\n >\n {label}\n </div>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, rowIndex) => (\n <div\n key={`mg-row-${rowIndex}`}\n role=\"row\"\n className=\"ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-2xs)]\"\n >\n {cells\n .slice(rowIndex * 7, rowIndex * 7 + 7)\n .map((date, colIndex) => {\n const i = rowIndex * 7 + colIndex;\n const inMonth = isSameMonth(date, viewMonth);\n const available = inMonth && isAvailable(date);\n const isSelected = selectedDate\n ? isSameDay(date, parseISO(selectedDate))\n : false;\n const state:\n | 'available'\n | 'unavailable'\n | 'selected'\n | 'outside' = !inMonth\n ? 'outside'\n : isSelected\n ? 'selected'\n : available\n ? 'available'\n : 'unavailable';\n const isRoving = rovingDate\n ? isSameDay(rovingDate, date)\n : false;\n const dayLabel = (() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n dateStyle: 'full',\n }).format(date);\n } catch {\n return fnsFormat(date, 'PPP');\n }\n })();\n return (\n <button\n key={`mg-cell-${i}`}\n type=\"button\"\n role=\"gridcell\"\n aria-label={dayLabel}\n aria-selected={isSelected || undefined}\n aria-disabled={!available || undefined}\n tabIndex={isRoving ? 0 : -1}\n disabled={!available}\n onClick={() => {\n if (available) onSelectDate(isoOf(date));\n }}\n onKeyDown={(e) => handleKeyDown(e, date)}\n className={monthCellVariants({ state })}\n >\n <span aria-hidden=\"true\">{date.getDate()}</span>\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* ServiceCardGroup — hand-rolled radiogroup for service selection. */\n/* */\n/* Used by the `inline-list` variant where services render as full-row */\n/* cards with the inferred icon. Other variants use a Select dropdown */\n/* via `ServiceStep` below. */\n/* -------------------------------------------------------------------- */\n\nconst serviceCardVariants = cva(\n [\n 'ds:relative ds:flex ds:w-full ds:items-center ds:gap-[var(--spacing-md)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start',\n 'ds:transition-[background-color,box-shadow]',\n 'ds:duration-[var(--animation-duration)]',\n '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-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:[outline:1px_solid_CanvasText]',\n 'ds:cursor-pointer',\n ].join(' '),\n {\n variants: {\n state: {\n idle: 'ds:bg-[var(--card)] ds:shadow-[var(--shadow-sm)] ds:hover:shadow-[var(--shadow-md)]',\n selected:\n 'ds:bg-[color-mix(in_srgb,var(--primary)_8%,var(--card))] ds:shadow-[var(--shadow-sm)]',\n },\n },\n defaultVariants: { state: 'idle' },\n },\n);\n\ninterface ServiceCardGroupProps {\n services: BookingService[];\n selectedServiceId?: string;\n onSelect: (id: string) => void;\n}\n\nfunction ServiceCardGroup({\n services,\n selectedServiceId,\n onSelect,\n}: ServiceCardGroupProps) {\n const { t } = useTranslation();\n const groupId = useId();\n\n const [focusIndex, setFocusIndex] = useState<number>(() => {\n if (selectedServiceId) {\n const i = services.findIndex((s) => s.id === selectedServiceId);\n if (i >= 0) return i;\n }\n return 0;\n });\n\n const cardRefs = useRef<Map<number, HTMLButtonElement>>(new Map());\n const focusAt = useCallback((index: number) => {\n cardRefs.current.get(index)?.focus();\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, index: number, id: string) => {\n const total = services.length;\n if (total === 0) return;\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight': {\n event.preventDefault();\n const next = (index + 1) % total;\n setFocusIndex(next);\n focusAt(next);\n break;\n }\n case 'ArrowUp':\n case 'ArrowLeft': {\n event.preventDefault();\n const prev = (index - 1 + total) % total;\n setFocusIndex(prev);\n focusAt(prev);\n break;\n }\n case 'Home': {\n event.preventDefault();\n setFocusIndex(0);\n focusAt(0);\n break;\n }\n case 'End': {\n event.preventDefault();\n const last = total - 1;\n setFocusIndex(last);\n focusAt(last);\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n onSelect(id);\n break;\n }\n default:\n break;\n }\n },\n [services.length, focusAt, onSelect],\n );\n\n if (services.length === 0) {\n return null;\n }\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={t('booking.serviceListLabel')}\n id={groupId}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {services.map((service, index) => {\n const isSelected = selectedServiceId === service.id;\n const isFocused = focusIndex === index;\n const ariaLabel = t('booking.serviceCardLabel', {\n label: service.label,\n duration: service.durationMin,\n });\n const iconNode = inferServiceIcon(service);\n return (\n <button\n key={service.id}\n ref={(node) => {\n if (node) cardRefs.current.set(index, node);\n else cardRefs.current.delete(index);\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n aria-label={ariaLabel}\n tabIndex={isFocused ? 0 : -1}\n onClick={() => onSelect(service.id)}\n onFocus={() => setFocusIndex(index)}\n onKeyDown={(e) => handleKeyDown(e, index, service.id)}\n className={serviceCardVariants({\n state: isSelected ? 'selected' : 'idle',\n })}\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:flex ds:size-10 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-[var(--radius-sm)] ds:bg-[var(--primary)]/10 ds:text-[var(--primary)]\"\n >\n {iconNode}\n </span>\n <span className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\">\n {service.label}\n </span>\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {t('booking.serviceSummary', { minutes: service.durationMin })}\n </span>\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* GroupedTimeSlots — calendar variant's morning/afternoon/evening slots */\n/* -------------------------------------------------------------------- */\n\nconst slotChipVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:gap-[var(--spacing-2xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-2xs)] ds:pb-[var(--spacing-2xs)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-[var(--font-weight-medium)]',\n 'ds:transition-[background-color,color,box-shadow] ds:duration-[var(--animation-duration)]',\n '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:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:forced-colors:[border:1px_solid_ButtonText] ds:forced-colors:text-[ButtonText]',\n ].join(' '),\n {\n variants: {\n state: {\n idle: 'ds:bg-[color:var(--card)] ds:text-[color:var(--foreground)] ds:shadow-[var(--shadow-sm)] ds:hover:enabled:bg-[color:var(--muted)]/40 ds:hover:enabled:shadow-[var(--shadow-md)]',\n selected:\n 'ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:shadow-[var(--shadow-sm)]',\n unavailable:\n 'ds:[outline:1px_dashed_color:var(--border)] ds:[outline-offset:-1px] ds:bg-transparent ds:text-[color:var(--muted-foreground)]',\n },\n },\n defaultVariants: { state: 'idle' },\n },\n);\n\ntype TimeOfDay = 'morning' | 'afternoon' | 'evening';\n\nfunction bucketForTime(time: string): TimeOfDay {\n const [hh] = time.split(':').map((s) => parseInt(s, 10));\n const hour = Number.isFinite(hh) ? hh : 0;\n if (hour < 12) return 'morning';\n if (hour < 17) return 'afternoon';\n return 'evening';\n}\n\nconst BUCKET_ICONS: Record<TimeOfDay, LucideIcon> = {\n morning: Sun,\n afternoon: Sunset,\n evening: Moon,\n};\n\ninterface GroupedTimeSlotsProps {\n date: string;\n slots: BookingSlot[];\n selectedSlotKey?: string;\n onSelect: (slot: BookingSlot) => void;\n loading?: boolean;\n locale: string;\n}\n\nfunction GroupedTimeSlots({\n date,\n slots,\n selectedSlotKey,\n onSelect,\n loading,\n locale,\n}: GroupedTimeSlotsProps) {\n const { t } = useTranslation();\n\n const dateLabel = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n }).format(parseISO(date));\n } catch {\n return date;\n }\n }, [date, locale]);\n\n const groups = useMemo(() => {\n const result: Record<TimeOfDay, BookingSlot[]> = {\n morning: [],\n afternoon: [],\n evening: [],\n };\n for (const slot of slots) {\n result[bucketForTime(slot.time)].push(slot);\n }\n return result;\n }, [slots]);\n\n const availableCount = slots.filter((s) => s.available).length;\n const order: TimeOfDay[] = ['morning', 'afternoon', 'evening'];\n\n if (loading) {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Skeleton variant=\"text\" width=\"60%\" />\n {[0, 1].map((row) => (\n <div\n key={row}\n className=\"ds:grid ds:grid-cols-3 ds:gap-[var(--spacing-xs)]\"\n >\n {[0, 1, 2].map((c) => (\n <Skeleton key={c} variant=\"rounded\" height=\"44px\" />\n ))}\n </div>\n ))}\n </div>\n );\n }\n\n if (availableCount === 0) {\n return (\n <EmptyState variant=\"no-results\" title={t('booking.noSlotsForDate')} />\n );\n }\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-baseline ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <CalendarRange\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--accent)]\"\n />\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {dateLabel}\n </h3>\n </div>\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {t('booking.slotsAvailable', { count: availableCount })}\n </span>\n </div>\n {order.map((bucket) => {\n const items = groups[bucket];\n if (items.length === 0) return null;\n const Icon = BUCKET_ICONS[bucket];\n return (\n <div\n key={bucket}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n <Icon aria-hidden=\"true\" className=\"ds:size-3.5\" />\n <span className=\"type-meta ds:font-[var(--font-weight-semibold)] ds:uppercase\">\n {t(`booking.timeOfDay.${bucket}`)}\n </span>\n </div>\n <div\n role=\"group\"\n aria-label={t(`booking.timeOfDay.${bucket}`)}\n className=\"ds:grid ds:grid-cols-3 ds:gap-[var(--spacing-xs)] ds:sm:grid-cols-4\"\n >\n {items.map((slot) => {\n const isSelected = slot.key === selectedSlotKey;\n const state = !slot.available\n ? 'unavailable'\n : isSelected\n ? 'selected'\n : 'idle';\n return (\n <button\n key={slot.key}\n type=\"button\"\n data-slot-id={slot.key}\n disabled={!slot.available}\n aria-pressed={isSelected}\n aria-label={t('booking.slotAvailableLabel', {\n time: slot.time,\n })}\n onClick={() => slot.available && onSelect(slot)}\n className={slotChipVariants({ state })}\n >\n {slot.time}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Step subcomponents */\n/* */\n/* Each step is rendered by every variant that needs it. The variants */\n/* differ in layout (chip rail vs accordion vs vertical list) but the */\n/* step content itself is the same. */\n/* -------------------------------------------------------------------- */\n\ninterface InsuranceStepProps {\n value?: InsuranceType;\n onChange: (next: InsuranceType) => void;\n}\n\nfunction InsuranceStep({ value, onChange }: InsuranceStepProps) {\n const { t } = useTranslation();\n const options: SelectOption[] = [\n { value: 'private', label: t('booking.insurance.private') },\n { value: 'public', label: t('booking.insurance.public') },\n ];\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.insurance.heading')}\n </h3>\n <Select\n options={options}\n value={value ?? ''}\n onValueChange={(next) => {\n if (next === 'private' || next === 'public') onChange(next);\n }}\n placeholder={t('booking.insurance.placeholder')}\n aria-label={t('booking.insurance.heading')}\n />\n </div>\n );\n}\n\ninterface SpecialtyStepProps {\n specialties: BookingSpecialty[];\n value?: string;\n onChange: (next: string) => void;\n}\n\nfunction SpecialtyStep({ specialties, value, onChange }: SpecialtyStepProps) {\n const { t } = useTranslation();\n const options: SelectOption[] = specialties.map((s) => ({\n value: s.id,\n label: s.label,\n }));\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.specialty.heading')}\n </h3>\n <Select\n options={options}\n value={value ?? ''}\n onValueChange={(next) => onChange(next)}\n placeholder={t('booking.specialty.placeholder')}\n aria-label={t('booking.specialty.heading')}\n />\n </div>\n );\n}\n\ninterface ServiceStepProps {\n services: BookingService[];\n value?: string;\n onChange: (next: string) => void;\n /** When true, render as a Select dropdown (compact). Default is the full ServiceCardGroup. */\n compact?: boolean;\n}\n\nfunction ServiceStep({ services, value, onChange, compact }: ServiceStepProps) {\n const { t } = useTranslation();\n if (compact) {\n const options: SelectOption[] = services.map((s) => ({\n value: s.id,\n label: `${s.label} · ${t('booking.serviceSummary', {\n minutes: s.durationMin,\n })}`,\n }));\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.service.heading')}\n </h3>\n <Select\n options={options}\n value={value ?? ''}\n onValueChange={(next) => onChange(next)}\n placeholder={t('booking.service.placeholder')}\n aria-label={t('booking.service.heading')}\n />\n </div>\n );\n }\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.service.heading')}\n </h3>\n <ServiceCardGroup\n services={services}\n selectedServiceId={value}\n onSelect={onChange}\n />\n </div>\n );\n}\n\ninterface OperatorStepProps {\n operators: BookingOperator[];\n value?: string;\n onChange: (next: string) => void;\n}\n\nfunction OperatorStep({ operators, value, onChange }: OperatorStepProps) {\n const { t } = useTranslation();\n // \"All operators\" is always the first option — matches the legacy\n // `OPERATORS_ALL` sentinel from the booking-website state hook.\n const options: SelectOption[] = [\n { value: OPERATORS_ALL, label: t('booking.operator.all') },\n ...operators.map((op) => ({ value: op.id, label: op.name })),\n ];\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.operator.heading')}\n </h3>\n <Select\n options={options}\n value={value ?? OPERATORS_ALL}\n onValueChange={(next) => onChange(next)}\n placeholder={t('booking.operator.placeholder')}\n aria-label={t('booking.operator.heading')}\n />\n </div>\n );\n}\n\ninterface OnboardingIncompleteAlertProps {\n customSlot?: ReactNode;\n}\n\nfunction OnboardingIncompleteAlert({\n customSlot,\n}: OnboardingIncompleteAlertProps) {\n const { t } = useTranslation();\n if (customSlot) return <>{customSlot}</>;\n // Use Alert.Title with `as=\"h4\"` so the heading-order stays valid\n // inside the booking section (which has h2 panel + h3 step headers).\n // The default h5 would skip the h4 level and trip\n // `heading-order` in axe.\n return (\n <Alert variant=\"warning\">\n <Alert.Title as=\"h4\">\n {t('booking.onboardingIncomplete.title')}\n </Alert.Title>\n <Alert.Description>\n {t('booking.onboardingIncomplete.description')}\n </Alert.Description>\n </Alert>\n );\n}\n\ninterface NextAvailableCtaProps {\n nextAvailableDate: string;\n onJump: () => void;\n locale: string;\n}\n\nfunction NextAvailableCta({\n nextAvailableDate,\n onJump,\n locale,\n}: NextAvailableCtaProps) {\n const { t } = useTranslation();\n const formatted = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, { dateStyle: 'long' }).format(\n parseISO(nextAvailableDate),\n );\n } catch {\n return nextAvailableDate;\n }\n }, [nextAvailableDate, locale]);\n return (\n <Alert variant=\"info\">\n <Alert.Description>\n {t('booking.nextAvailable.description', { date: formatted })}\n </Alert.Description>\n <Alert.Action>\n <Button intent=\"secondary\" size=\"sm\" onClick={onJump}>\n {t('booking.nextAvailable.cta')}\n </Button>\n </Alert.Action>\n </Alert>\n );\n}\n\ninterface BookingSuccessProps {\n snapshot: {\n slot: BookingSlot;\n details: BookingDetails;\n insuranceType?: InsuranceType;\n operatorId?: string;\n specialtyId?: string;\n serviceId?: string;\n date?: string;\n };\n operators: BookingOperator[];\n specialties: BookingSpecialty[];\n services: BookingService[];\n locale: string;\n mode: 'live' | 'demo';\n showModify: boolean;\n onReset: () => void;\n onModify: () => void;\n}\n\nfunction BookingSuccess({\n snapshot,\n operators,\n specialties,\n services,\n locale,\n mode,\n showModify,\n onReset,\n onModify,\n}: BookingSuccessProps) {\n const { t } = useTranslation();\n const channels = snapshot.details.confirmationChannels ?? ['email'];\n\n const channelLabels = channels.map((c) =>\n t(`booking.confirmation.channel.${c}`),\n );\n // In demo mode, override the channel-aware description with the\n // honest \"this was a demo\" copy — consumers running in mock mode\n // (no real API call) shouldn't tell the patient an email was sent.\n const description =\n mode === 'demo'\n ? t('booking.success.descriptionDemo')\n : channelLabels.length > 1\n ? t('booking.success.descriptionMultiple', {\n channels: channelLabels.join(' · '),\n })\n : t('booking.success.descriptionSingle', { channel: channelLabels[0] });\n\n const formattedDate = useMemo(() => {\n if (!snapshot.date) return undefined;\n try {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n }).format(parseISO(snapshot.date));\n } catch {\n return snapshot.date;\n }\n }, [snapshot.date, locale]);\n\n const operator = snapshot.operatorId\n ? operators.find((op) => op.id === snapshot.operatorId)\n : undefined;\n const specialty = snapshot.specialtyId\n ? specialties.find((s) => s.id === snapshot.specialtyId)\n : undefined;\n const service = snapshot.serviceId\n ? services.find((s) => s.id === snapshot.serviceId)\n : undefined;\n\n return (\n <div\n data-component=\"booking-success\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <Alert variant=\"success\">\n <Alert.Title as=\"h3\">{t('booking.success.heading')}</Alert.Title>\n <Alert.Description>{description}</Alert.Description>\n </Alert>\n\n <div className=\"ds:rounded-[var(--radius-md)] ds:bg-[var(--secondary)] ds:p-[var(--spacing-md)]\">\n <dl className=\"ds:grid ds:grid-cols-[auto_minmax(0,1fr)] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-xs)] ds:m-0\">\n {specialty ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summarySpecialty')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {specialty.label}\n </dd>\n </>\n ) : null}\n {service ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryService')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {service.label}\n </dd>\n </>\n ) : null}\n {formattedDate ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryDate')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {formattedDate}\n </dd>\n </>\n ) : null}\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryTime')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {snapshot.slot.time}\n </dd>\n {operator ? (\n <>\n <dt className=\"type-label ds:text-[var(--muted-foreground)]\">\n {t('booking.success.summaryProvider')}\n </dt>\n <dd className=\"type-body ds:m-0 ds:text-[var(--foreground)]\">\n {operator.name}\n </dd>\n </>\n ) : null}\n </dl>\n </div>\n\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Button intent=\"secondary\" size=\"md\" onClick={onReset}>\n {t('booking.success.bookAnother')}\n </Button>\n {showModify ? (\n <Button intent=\"ghost\" size=\"md\" onClick={onModify}>\n {t('booking.success.modifyBooking')}\n </Button>\n ) : null}\n </div>\n </div>\n );\n}\n\ninterface EmptyServicesProps {\n customSlot?: ReactNode;\n}\n\nfunction EmptyServicesAlert({ customSlot }: EmptyServicesProps) {\n const { t } = useTranslation();\n if (customSlot) return <>{customSlot}</>;\n return (\n <EmptyState\n variant=\"no-results\"\n title={t('booking.emptyServices.title')}\n description={t('booking.emptyServices.description')}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Variant body shared props */\n/* -------------------------------------------------------------------- */\n\ninterface VariantBodyProps {\n cascade: CascadeOutputs;\n inputs: {\n specialties: BookingSpecialty[];\n services: BookingService[];\n operators: BookingOperator[];\n availableDates: string[];\n availableSlots: Record<string, BookingSlot[]>;\n nextAvailableDate?: string;\n };\n value: BookingValue;\n onChange: (next: BookingValue) => void;\n onSubmit: (details: BookingDetails) => void | Promise<void>;\n policy: {\n country?: string;\n lockedOperatorId?: string;\n };\n detailsProps: Omit<\n React.ComponentProps<typeof BookingDetailsForm>,\n 'value' | 'onChange' | 'onSubmit' | 'summarySlot' | 'defaultPhoneCountry'\n >;\n emptyServicesSlot?: ReactNode;\n onboardingIncompleteSlot?: ReactNode;\n loadingSlots?: boolean;\n submitting?: boolean;\n locale: string;\n activeStep: CascadeStep;\n setActiveStep: (step: CascadeStep) => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* InlineListBody */\n/* -------------------------------------------------------------------- */\n\nfunction InlineListBody(props: VariantBodyProps) {\n const {\n cascade,\n inputs,\n value,\n onChange,\n onSubmit,\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingSlots,\n submitting,\n locale,\n detailsProps,\n } = props;\n const { t } = useTranslation();\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {cascade.gates.insurance ? (\n <InsuranceStep\n value={value.insuranceType}\n onChange={(next) => onChange(resetOnInsuranceChange(value, next))}\n />\n ) : null}\n\n {cascade.gates.specialty ? (\n <SpecialtyStep\n specialties={cascade.filtered.specialties}\n value={value.specialtyId}\n onChange={(next) => onChange(resetOnSpecialtyChange(value, next))}\n />\n ) : null}\n\n {cascade.gates.service ? (\n cascade.filtered.services.length === 0 ? (\n <EmptyServicesAlert customSlot={emptyServicesSlot} />\n ) : (\n <ServiceStep\n services={cascade.filtered.services}\n value={value.serviceId}\n onChange={(next) => onChange(resetOnServiceChange(value, next))}\n />\n )\n ) : null}\n\n {cascade.gates.onboardingIncomplete ? (\n <OnboardingIncompleteAlert customSlot={onboardingIncompleteSlot} />\n ) : null}\n\n {cascade.gates.operator ? (\n <OperatorStep\n operators={cascade.filtered.operators}\n value={value.operatorId}\n onChange={(next) => onChange(resetOnOperatorChange(value, next))}\n />\n ) : null}\n\n {cascade.gates.date ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.date.heading')}\n </h3>\n {inputs.availableDates.length === 0 && inputs.nextAvailableDate ? (\n <NextAvailableCta\n nextAvailableDate={inputs.nextAvailableDate}\n onJump={() =>\n onChange(resetOnDateChange(value, inputs.nextAvailableDate))\n }\n locale={locale}\n />\n ) : (\n <MonthGrid\n availableDates={inputs.availableDates}\n selectedDate={value.date}\n onSelectDate={(iso) => onChange(resetOnDateChange(value, iso))}\n locale={locale}\n loading={loadingSlots}\n />\n )}\n </div>\n ) : null}\n\n {cascade.gates.slot && value.date ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-label ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.slot.heading')}\n </h3>\n <GroupedTimeSlots\n date={value.date}\n slots={inputs.availableSlots[value.date] ?? []}\n selectedSlotKey={value.slotKey}\n onSelect={(slot) => onChange(resetOnSlotChange(value, slot.key))}\n loading={loadingSlots}\n locale={locale}\n />\n </div>\n ) : null}\n\n {cascade.gates.details && cascade.selectedSlot ? (\n <BookingDetailsForm\n {...detailsProps}\n value={value.details ?? {}}\n onChange={(next) => onChange({ ...value, details: next })}\n onSubmit={onSubmit}\n submitting={submitting}\n defaultPhoneCountry={props.policy.country}\n />\n ) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* getStepNode — render a single cascade step's content. */\n/* */\n/* Shared by all variants so the cascade renders the same content; */\n/* variants just choose how to chrome / sequence it. */\n/* -------------------------------------------------------------------- */\n\ninterface GetStepNodeOptions {\n /** When true, ServiceStep renders as a compact Select (used by all\n * variants except inline-list, which gets the full ServiceCardGroup). */\n compactService?: boolean;\n}\n\nfunction getStepNode(\n step: CascadeStep,\n props: VariantBodyProps,\n options: GetStepNodeOptions = {},\n): ReactNode {\n const {\n cascade,\n inputs,\n value,\n onChange,\n onSubmit,\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingSlots,\n submitting,\n locale,\n detailsProps,\n policy,\n } = props;\n\n switch (step) {\n case 1:\n return (\n <InsuranceStep\n value={value.insuranceType}\n onChange={(next) => onChange(resetOnInsuranceChange(value, next))}\n />\n );\n case 2:\n return (\n <SpecialtyStep\n specialties={cascade.filtered.specialties}\n value={value.specialtyId}\n onChange={(next) => onChange(resetOnSpecialtyChange(value, next))}\n />\n );\n case 3:\n if (cascade.filtered.services.length === 0) {\n return <EmptyServicesAlert customSlot={emptyServicesSlot} />;\n }\n if (cascade.gates.onboardingIncomplete) {\n return (\n <OnboardingIncompleteAlert customSlot={onboardingIncompleteSlot} />\n );\n }\n return (\n <ServiceStep\n services={cascade.filtered.services}\n value={value.serviceId}\n onChange={(next) => onChange(resetOnServiceChange(value, next))}\n compact={options.compactService}\n />\n );\n case 4:\n return (\n <OperatorStep\n operators={cascade.filtered.operators}\n value={value.operatorId}\n onChange={(next) => onChange(resetOnOperatorChange(value, next))}\n />\n );\n case 5:\n if (inputs.availableDates.length === 0 && inputs.nextAvailableDate) {\n return (\n <NextAvailableCta\n nextAvailableDate={inputs.nextAvailableDate}\n onJump={() =>\n onChange(resetOnDateChange(value, inputs.nextAvailableDate))\n }\n locale={locale}\n />\n );\n }\n return (\n <MonthGrid\n availableDates={inputs.availableDates}\n selectedDate={value.date}\n onSelectDate={(iso) => onChange(resetOnDateChange(value, iso))}\n locale={locale}\n loading={loadingSlots}\n />\n );\n case 6:\n if (!value.date) return null;\n return (\n <GroupedTimeSlots\n date={value.date}\n slots={inputs.availableSlots[value.date] ?? []}\n selectedSlotKey={value.slotKey}\n onSelect={(slot) => onChange(resetOnSlotChange(value, slot.key))}\n loading={loadingSlots}\n locale={locale}\n />\n );\n case 7:\n if (!cascade.selectedSlot) return null;\n return (\n <BookingDetailsForm\n {...detailsProps}\n value={value.details ?? {}}\n onChange={(next) => onChange({ ...value, details: next })}\n onSubmit={onSubmit}\n submitting={submitting}\n defaultPhoneCountry={policy.country}\n />\n );\n /* c8 ignore next 2 */\n default:\n return null;\n }\n}\n\n/* -------------------------------------------------------------------- */\n/* getStepLabel — i18n label per cascade step. */\n/* -------------------------------------------------------------------- */\n\nfunction useStepLabels(): Record<CascadeStep, string> {\n const { t } = useTranslation();\n return useMemo(\n () => ({\n 1: t('booking.insurance.heading'),\n 2: t('booking.specialty.heading'),\n 3: t('booking.service.heading'),\n 4: t('booking.operator.heading'),\n 5: t('booking.date.heading'),\n 6: t('booking.slot.heading'),\n 7: t('booking.details.heading'),\n }),\n [t],\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* AccordionBody — StepperAccordion-backed flow with per-step summaries. */\n/* -------------------------------------------------------------------- */\n\nfunction AccordionBody(props: VariantBodyProps) {\n const { cascade, value, activeStep, setActiveStep } = props;\n const labels = useStepLabels();\n\n // Compose accordion specs from the visible cascade steps. Pull a\n // localised summary off `value` for completed steps so collapsed\n // panels still convey what was picked.\n const accordionSteps = useMemo(\n () =>\n cascade.visibleSteps.map((stepNum) => ({\n label: labels[stepNum],\n summary: getStepSummary(stepNum, value, cascade),\n status:\n stepIsFulfilled(stepNum, value) && stepNum < cascade.currentStep\n ? ('completed' as const)\n : undefined,\n content: getStepNode(stepNum, props, { compactService: true }),\n })),\n [cascade, value, labels, props],\n );\n\n // The accordion uses a 0-indexed activeStep but our cascade steps are\n // 1-indexed; map to the position in visibleSteps.\n const activeIndex = Math.max(0, cascade.visibleSteps.indexOf(activeStep));\n\n return (\n <StepperAccordion\n activeStep={activeIndex}\n steps={accordionSteps}\n onStepChange={(idx) => {\n const next = cascade.visibleSteps[idx];\n if (next) setActiveStep(next);\n }}\n />\n );\n}\n\nfunction stepIsFulfilled(step: CascadeStep, value: BookingValue): boolean {\n switch (step) {\n case 1:\n return value.insuranceType !== undefined;\n case 2:\n return value.specialtyId !== undefined;\n case 3:\n return value.serviceId !== undefined;\n case 4:\n return value.operatorId !== undefined;\n case 5:\n return value.date !== undefined;\n case 6:\n return value.slotKey !== undefined;\n case 7:\n return false;\n }\n}\n\nfunction getStepSummary(\n step: CascadeStep,\n value: BookingValue,\n cascade: CascadeOutputs,\n): ReactNode {\n if (!stepIsFulfilled(step, value)) return undefined;\n switch (step) {\n case 1:\n return value.insuranceType;\n case 2: {\n const sp = cascade.filtered.specialties.find(\n (s) => s.id === value.specialtyId,\n );\n return sp?.label;\n }\n case 3: {\n const sv = cascade.filtered.services.find(\n (s) => s.id === value.serviceId,\n );\n return sv?.label;\n }\n case 4: {\n const opId = resolveOperatorId(value);\n if (!opId) return undefined;\n const op = cascade.filtered.operators.find((o) => o.id === opId);\n return op?.name;\n }\n case 5:\n return value.date;\n case 6:\n return cascade.selectedSlot?.time;\n case 7:\n return undefined;\n }\n}\n\n/* -------------------------------------------------------------------- */\n/* CalendarBody — chip rail of completed selections + calendar dominant. */\n/* -------------------------------------------------------------------- */\n\nfunction CalendarBody(props: VariantBodyProps) {\n const { cascade, value, setActiveStep } = props;\n const { t } = useTranslation();\n const labels = useStepLabels();\n\n // Filters that come before the calendar (insurance/specialty/service/operator).\n const filterSteps = cascade.visibleSteps.filter(\n (s) => s === 1 || s === 2 || s === 3 || s === 4,\n );\n const hasUnfulfilledFilter = filterSteps.some(\n (s) => !stepIsFulfilled(s, value),\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {/* Active step is the first unfulfilled filter — render it inline. */}\n {hasUnfulfilledFilter ? (\n filterSteps\n .filter((s) => !stepIsFulfilled(s, value))\n .slice(0, 1)\n .map((s) => (\n <div key={`csf-${s}`}>\n {getStepNode(s, props, { compactService: true })}\n </div>\n ))\n ) : (\n <div\n role=\"group\"\n aria-label={t('booking.regionLabel')}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {filterSteps.map((s) => {\n const summary = getStepSummary(s, value, cascade);\n if (!summary) return null;\n return (\n <Button\n key={`csc-${s}`}\n intent=\"tonal\"\n size=\"sm\"\n onClick={() => setActiveStep(s)}\n >\n {labels[s]}: {summary}\n </Button>\n );\n })}\n </div>\n )}\n\n {!hasUnfulfilledFilter && cascade.gates.date ? (\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:md:grid-cols-2\">\n <div className=\"ds:min-w-0\">{getStepNode(5, props)}</div>\n <div className=\"ds:min-w-0\">\n {value.date ? getStepNode(6, props) : null}\n </div>\n </div>\n ) : null}\n\n {cascade.gates.details ? <div>{getStepNode(7, props)}</div> : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* FlexibleBody — 2-col desktop (filters L, calendar+slots R), inline */\n/* below md. */\n/* -------------------------------------------------------------------- */\n\nfunction FlexibleBody(props: VariantBodyProps) {\n const { cascade } = props;\n\n const filterStepNumbers = cascade.visibleSteps.filter(\n (s) => s === 1 || s === 2 || s === 3 || s === 4,\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:md:grid-cols-2\">\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {filterStepNumbers.map((s) => (\n <div key={`fbf-${s}`}>\n {getStepNode(s, props, { compactService: true })}\n </div>\n ))}\n </div>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {cascade.gates.date ? getStepNode(5, props) : null}\n {cascade.gates.slot && props.value.date\n ? getStepNode(6, props)\n : null}\n </div>\n </div>\n {cascade.gates.details ? getStepNode(7, props) : null}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* ProgressBody — wizard with stepper + one step on screen + Back/Next. */\n/* -------------------------------------------------------------------- */\n\nfunction ProgressBody(props: VariantBodyProps) {\n const { cascade, value, activeStep, setActiveStep } = props;\n const { t } = useTranslation();\n const labels = useStepLabels();\n\n const visibleSteps = cascade.visibleSteps;\n const activeIndex = Math.max(0, visibleSteps.indexOf(activeStep));\n const totalSteps = visibleSteps.length;\n\n const stepSpecs = useMemo(\n () => visibleSteps.map((s) => ({ label: labels[s] })),\n [visibleSteps, labels],\n );\n\n const canGoBack = activeIndex > 0;\n // Forward navigation is gated by the cascade — can only advance when\n // the active step is fulfilled.\n const canGoNext =\n activeIndex < totalSteps - 1 && stepIsFulfilled(activeStep, value);\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <StepperProgress activeStep={activeIndex} steps={stepSpecs} />\n <div>{getStepNode(activeStep, props, { compactService: true })}</div>\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <Button\n intent=\"ghost\"\n size=\"md\"\n disabled={!canGoBack}\n onClick={() => {\n const prev = visibleSteps[activeIndex - 1];\n if (prev) setActiveStep(prev);\n }}\n >\n {t('booking.actions.back')}\n </Button>\n {activeStep < 7 ? (\n <Button\n intent=\"primary\"\n size=\"md\"\n disabled={!canGoNext}\n onClick={() => {\n const next = visibleSteps[activeIndex + 1];\n if (next) setActiveStep(next);\n }}\n >\n {t('booking.actions.next')}\n </Button>\n ) : null}\n </div>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Root Booking component */\n/* -------------------------------------------------------------------- */\n\nconst EMPTY_SPECIALTIES: BookingSpecialty[] = [];\nconst EMPTY_OPERATORS: BookingOperator[] = [];\n\nexport const Booking = forwardRef<HTMLDivElement, BookingProps>(\n (\n {\n variant = 'inline-list',\n country,\n // No default — the cascade engine treats `undefined` as \"auto-on\n // when `specialties` has items\" so consumers who pass specialty\n // data without the explicit flag still get the step.\n useSpecialties,\n allowOperatorSelection = false,\n lockedOperatorId,\n autoSelectSingleService = false,\n specialties: specialtiesProp,\n services,\n operators: operatorsProp,\n availableDates,\n availableSlots,\n nextAvailableDate,\n requireCodiceFiscale,\n requireDateOfBirth,\n requireInsuranceNumber,\n showNote,\n showReturningPatientFlag,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n confirmationChannels,\n defaultConfirmationChannels,\n value,\n onChange,\n onSubmit,\n onStepChange,\n loadingSlots,\n submitting,\n submitError,\n mode = 'live',\n showModifyOnSuccess = true,\n surface = 'flat',\n emptyServicesSlot,\n onboardingIncompleteSlot,\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const resolvedVariant = (variant ?? 'inline-list') as BookingVariant;\n const locale = i18n.language ?? 'en';\n\n const specialties = specialtiesProp ?? EMPTY_SPECIALTIES;\n const operators = operatorsProp ?? EMPTY_OPERATORS;\n\n // Auto-pre-select on mount + whenever the inputs that drive them\n // arrive (e.g. when `specialties` populates from an async fetch).\n useEffect(() => {\n const next = applyAutoSelects(value, {\n country,\n useSpecialties,\n allowOperatorSelection,\n lockedOperatorId,\n autoSelectSingleService,\n specialties,\n services,\n });\n // Shallow compare the keys we might have changed.\n if (\n next.specialtyId !== value.specialtyId ||\n next.operatorId !== value.operatorId ||\n next.serviceId !== value.serviceId\n ) {\n onChange(next);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n lockedOperatorId,\n useSpecialties,\n autoSelectSingleService,\n specialties,\n services,\n ]);\n\n const cascade = useMemo(\n () =>\n deriveCascade({\n country,\n useSpecialties,\n allowOperatorSelection,\n lockedOperatorId,\n autoSelectSingleService,\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n value,\n }),\n [\n country,\n useSpecialties,\n allowOperatorSelection,\n lockedOperatorId,\n autoSelectSingleService,\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n value,\n ],\n );\n\n const [activeStep, setActiveStep] = useState<CascadeStep>(\n cascade.currentStep,\n );\n // Sync activeStep to the cascade's current step when the user\n // advances forward via the value, but not on the initial mount.\n const lastCurrentStepRef = useRef(cascade.currentStep);\n useEffect(() => {\n if (cascade.currentStep > lastCurrentStepRef.current) {\n setActiveStep(cascade.currentStep);\n }\n lastCurrentStepRef.current = cascade.currentStep;\n }, [cascade.currentStep]);\n\n const [submitState, setSubmitState] = useState<\n 'idle' | 'submitting' | 'success' | 'error'\n >('idle');\n const [submittedSnapshot, setSubmittedSnapshot] = useState<{\n slot: BookingSlot;\n details: BookingDetails;\n insuranceType?: InsuranceType;\n operatorId?: string;\n specialtyId?: string;\n serviceId?: string;\n date?: string;\n } | null>(null);\n\n const handleSubmit = useCallback(\n async (details: BookingDetails) => {\n if (!cascade.selectedSlot) return;\n const payload = {\n slot: cascade.selectedSlot,\n value: {\n ...value,\n details,\n operatorId: resolveOperatorId(value) ?? value.operatorId,\n },\n details,\n };\n setSubmitState('submitting');\n try {\n await onSubmit(payload);\n setSubmittedSnapshot({\n slot: cascade.selectedSlot,\n details,\n specialtyId: value.specialtyId,\n serviceId: value.serviceId,\n insuranceType: value.insuranceType,\n operatorId: resolveOperatorId(value),\n date: value.date,\n });\n setSubmitState('success');\n } catch {\n setSubmitState('error');\n // Re-throw so the consumer can observe + log. The form\n // stays mounted so the patient can retry.\n throw new Error('Booking submission failed');\n }\n },\n [cascade.selectedSlot, onSubmit, value],\n );\n\n /* ---------- Imperative handle ---------- */\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n /* ---------- onStepChange + auto-scroll on success ---------- */\n\n // The displayed step is `8` when the success view is mounted, and\n // matches the cascade's `currentStep` otherwise. Tracked via a ref\n // so the effect only fires when the displayed step actually changes\n // (vs every time `currentStep` or `submitState` updates).\n const displayedStep: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 =\n submitState === 'success' ? 8 : cascade.currentStep;\n // Initialise to `null` so the first effect-fire (after mount) still\n // emits onStepChange with the initial step. Subsequent fires only\n // emit when the step actually changes.\n const lastDisplayedStepRef = useRef<typeof displayedStep | null>(null);\n useEffect(() => {\n if (displayedStep === lastDisplayedStepRef.current) return;\n lastDisplayedStepRef.current = displayedStep;\n onStepChange?.(displayedStep);\n // Auto-scroll the booking surface into view on the transition to\n // step 8 — the success card is much shorter than the form, so\n // without this the patient often ends up below the booking column\n // and has to scroll up to see \"Booking submitted.\" See the\n // 0.30.0-adoption follow-up notes for the failure mode.\n if (displayedStep === 8 && rootRef.current) {\n try {\n rootRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n } catch {\n // jsdom + older browsers may not implement smooth scroll.\n // Fall back to a plain scroll — still better than nothing.\n rootRef.current.scrollIntoView();\n }\n }\n }, [displayedStep, onStepChange]);\n\n const agentHandle = useMemo<BookingHandle>(\n () => ({\n getVariant: () => resolvedVariant,\n reset: () => {\n // Clear the value to an empty state + drop any success view;\n // the consumer's onChange observes the normalised value.\n onChange({});\n setSubmittedSnapshot(null);\n setSubmitState('idle');\n setActiveStep(1);\n },\n goToStep: (step) => {\n setActiveStep(step);\n },\n }),\n [resolvedVariant, onChange],\n );\n useAgentRegistration(bookingAgent, agentHandle, id);\n\n const resolvedAriaLabel = ariaLabel ?? t('booking.regionLabel');\n\n // Success view replaces the entire cascade body once `onSubmit`\n // resolves. The header still renders so the patient sees their\n // booking context above the confirmation card.\n const successBody = useMemo(() => {\n if (submitState !== 'success' || !submittedSnapshot) return null;\n return (\n <BookingSuccess\n snapshot={submittedSnapshot}\n operators={operators}\n specialties={specialties}\n services={services}\n locale={locale}\n mode={mode}\n showModify={showModifyOnSuccess}\n onReset={() => agentHandle.reset()}\n onModify={() => {\n // Modify path — keep `value` + `details` intact, just drop\n // the success view + return to step 7. The form will paint\n // pre-populated.\n setSubmittedSnapshot(null);\n setSubmitState('idle');\n setActiveStep(7);\n }}\n />\n );\n }, [\n submitState,\n submittedSnapshot,\n operators,\n specialties,\n services,\n locale,\n mode,\n showModifyOnSuccess,\n agentHandle,\n ]);\n\n const variantBody = useMemo(() => {\n if (submitState === 'success') return null;\n const Body =\n resolvedVariant === 'accordion'\n ? AccordionBody\n : resolvedVariant === 'calendar'\n ? CalendarBody\n : resolvedVariant === 'flexible'\n ? FlexibleBody\n : resolvedVariant === 'progress'\n ? ProgressBody\n : InlineListBody;\n const bodyProps: VariantBodyProps = {\n cascade,\n inputs: {\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n nextAvailableDate,\n },\n value,\n onChange,\n onSubmit: handleSubmit,\n policy: { country, lockedOperatorId },\n detailsProps: {\n requireCodiceFiscale,\n requireDateOfBirth,\n requireInsuranceNumber,\n insuranceType: value.insuranceType,\n showNote,\n showReturningPatientFlag,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n confirmationChannels,\n defaultConfirmationChannels,\n submitError,\n },\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingSlots,\n submitting,\n locale,\n activeStep,\n setActiveStep,\n };\n return <Body {...bodyProps} />;\n }, [\n submitState,\n resolvedVariant,\n cascade,\n specialties,\n services,\n operators,\n availableDates,\n availableSlots,\n nextAvailableDate,\n value,\n onChange,\n handleSubmit,\n country,\n lockedOperatorId,\n requireCodiceFiscale,\n requireDateOfBirth,\n requireInsuranceNumber,\n submitError,\n showNote,\n showReturningPatientFlag,\n privacyPolicyUrl,\n termsUrl,\n validateCodiceFiscale,\n validateInsuranceNumber,\n confirmationChannels,\n defaultConfirmationChannels,\n emptyServicesSlot,\n onboardingIncompleteSlot,\n loadingSlots,\n submitting,\n locale,\n activeStep,\n ]);\n\n return (\n <div\n ref={rootRef}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n id={id}\n data-component=\"booking\"\n data-component-id={id}\n data-variant={resolvedVariant}\n className={rootVariants({\n variant: resolvedVariant,\n surface,\n className,\n })}\n {...rest}\n >\n <div\n className={[\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]',\n resolvedVariant === 'inline-list'\n ? [\n 'ds:rounded-[var(--radius-md)]',\n 'ds:bg-[color-mix(in_srgb,var(--primary)_35%,var(--background))]',\n 'ds:bg-[image:var(--gradient-hero-brand)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' ')\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <h2 className=\"type-title-card ds:text-[var(--foreground)] ds:m-0\">\n {t('booking.regionLabel')}\n </h2>\n <p className=\"type-body-sm ds:text-[var(--muted-foreground)] ds:m-0\">\n {t('booking.headingSubtitle')}\n </p>\n </div>\n {successBody ?? variantBody}\n </div>\n );\n },\n);\n\nBooking.displayName = 'Booking';\n"],"names":["__iconNode","Activity","createLucideIcon","Baby","Bone","Brain","CalendarRange","ClipboardCheck","Ear","Microscope","Pill","ScanLine","Scissors","Smile","Sunset","Syringe","subMonths","date","amount","options","addMonths","bookingAgent","handle","args","CONFIRMATION_CHANNEL_ORDER","OPERATORS_ALL","COUNTRY_GERMANY","filterSpecialties","inputs","_a","a","b","aSeq","bSeq","filterServices","list","s","eligibleOperators","useSpecialtiesResolved","specialtyId","op","serviceId","computeGates","filtered","insuranceVisible","insuranceSatisfied","specialtyVisible","serviceVisible","serviceSatisfied","eligibleOps","operatorVisible","dateVisible","slotVisible","detailsVisible","onboardingIncomplete","deriveStep","gates","visible","isFulfilled","deriveCascade","currentStep","visibleSteps","selectedSlot","day","selectedService","isReadyToSubmit","resetOnInsuranceChange","value","next","resetOnSpecialtyChange","resetOnServiceChange","resetOnOperatorChange","resetOnDateChange","resetOnSlotChange","applyAutoSelects","resolvedServices","resolveOperatorId","looksLikePhone","trimmed","resolveConfirmationChannels","enabled","set","c","defaultConfirmationSelection","mobile","override","resolvedEnabled","enabledSet","out","mobilePlausible","hasWhatsApp","outSet","NOTE_MAX_LENGTH","CF_REGEX","EMAIL_REGEX","VALIDATE_DEBOUNCE_MS","idleStatus","BookingDetailsForm","forwardRef","onChange","onSubmit","requireCodiceFiscale","requireDateOfBirth","requireInsuranceNumber","insuranceType","showNote","showReturningPatientFlag","privacyPolicyUrl","termsUrl","validateCodiceFiscale","validateInsuranceNumber","submitting","summarySlot","defaultPhoneCountry","confirmationChannels","defaultConfirmationChannels","submitError","ref","t","useTranslation","formId","useId","cfStatus","setCfStatus","useState","insuranceStatus","setInsuranceStatus","touched","setTouched","markTouched","useCallback","field","cfTimerRef","useRef","insuranceTimerRef","useEffect","update","patch","resolvedEnabledChannels","useMemo","pickerVisible","seededRef","seed","selectedChannels","noChannelsSelected","cf","res","insuranceShown","n","emailValid","phoneValid","requiredFieldsValid","_b","consentsTicked","channelsSatisfied","canSubmit","handleSubmit","e","payload","renderConsentLabel","i18nKey","url","safeUrl","jsx","Trans","jsxs","FormField","TextInput","EmailInput","PhoneInput","e164","DatePicker","TextArea","Checkbox","checked","Fragment","CheckboxGroup","Alert","Button","Spinner","rootVariants","cva","SERVICE_ICON_RULES","HeartPulse","Eye","Sparkles","pickIcon","text","pattern","Icon","inferServiceIcon","service","Stethoscope","isoOf","fnsFormat","monthCellBase","monthCellVariants","MonthGrid","availableDates","selectedDate","onSelectDate","locale","loading","initialMonth","startOfMonth","parseISO","viewMonth","setViewMonth","focusDate","setFocusDate","cells","monthStart","monthEnd","endOfMonth","startWeekday","totalDays","grid","i","d","last","monthLabel","weekdayLabels","base","_","availableSet","isAvailable","rovingDate","firstAvailable","isSameMonth","handleKeyDown","event","current","Skeleton","IconButton","ChevronLeft","m","ChevronRight","label","rowIndex","colIndex","inMonth","available","isSelected","isSameDay","state","isRoving","dayLabel","serviceCardVariants","ServiceCardGroup","services","selectedServiceId","onSelect","groupId","focusIndex","setFocusIndex","cardRefs","focusAt","index","id","total","prev","isFocused","ariaLabel","iconNode","node","slotChipVariants","bucketForTime","time","hh","hour","BUCKET_ICONS","Sun","Moon","GroupedTimeSlots","slots","selectedSlotKey","dateLabel","groups","result","slot","availableCount","order","row","EmptyState","bucket","items","InsuranceStep","Select","SpecialtyStep","specialties","ServiceStep","compact","OperatorStep","operators","OnboardingIncompleteAlert","customSlot","NextAvailableCta","nextAvailableDate","onJump","formatted","BookingSuccess","snapshot","mode","showModify","onReset","onModify","channelLabels","description","formattedDate","operator","specialty","EmptyServicesAlert","InlineListBody","props","cascade","emptyServicesSlot","onboardingIncompleteSlot","loadingSlots","detailsProps","iso","getStepNode","step","policy","useStepLabels","AccordionBody","activeStep","setActiveStep","labels","accordionSteps","stepNum","getStepSummary","stepIsFulfilled","activeIndex","StepperAccordion","idx","sp","sv","opId","o","CalendarBody","filterSteps","hasUnfulfilledFilter","summary","FlexibleBody","filterStepNumbers","ProgressBody","totalSteps","stepSpecs","canGoBack","canGoNext","StepperProgress","EMPTY_SPECIALTIES","EMPTY_OPERATORS","Booking","variant","country","useSpecialties","allowOperatorSelection","lockedOperatorId","autoSelectSingleService","specialtiesProp","operatorsProp","availableSlots","onStepChange","showModifyOnSuccess","surface","className","rest","i18n","resolvedVariant","lastCurrentStepRef","submitState","setSubmitState","submittedSnapshot","setSubmittedSnapshot","details","rootRef","useImperativeHandle","displayedStep","lastDisplayedStepRef","agentHandle","useAgentRegistration","resolvedAriaLabel","successBody","variantBody","Body","bodyProps"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]}
|
package/dist/agent-catalog.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"booking.d.ts","sourceRoot":"","sources":["../../../src/components/booking/booking.tsx"],"names":[],"mappings":"AAkEA,OAAO,KAAK,EAIV,YAAY,EAOb,MAAM,iBAAiB,CAAC;AAkBzB,YAAY,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAioD1C,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"booking.d.ts","sourceRoot":"","sources":["../../../src/components/booking/booking.tsx"],"names":[],"mappings":"AAkEA,OAAO,KAAK,EAIV,YAAY,EAOb,MAAM,iBAAiB,CAAC;AAkBzB,YAAY,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAioD1C,eAAO,MAAM,OAAO,yGAiZnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade.d.ts","sourceRoot":"","sources":["../../../src/components/booking/cascade.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACd,MAAM,iBAAiB,CAAC;AAGzB;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAG,KAAc,CAAC;AAQ5C,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0EAA0E;IAC1E,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9C,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B;;;;OAIG;IACH,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,8DAA8D;AAC9D,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,gFAAgF;IAChF,WAAW,EAAE,WAAW,CAAC;IACzB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,qFAAqF;IACrF,eAAe,EAAE,OAAO,CAAC;IACzB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;
|
|
1
|
+
{"version":3,"file":"cascade.d.ts","sourceRoot":"","sources":["../../../src/components/booking/cascade.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -125,7 +125,7 @@ import { S as Sn, a as Tn } from "./_chunks/suggestion-chip-C4kxWUIs.js";
|
|
|
125
125
|
import { s as bn } from "./_chunks/suggestion-chip.agent-6sNWFj7m.js";
|
|
126
126
|
import { T as hn, t as Rn } from "./_chunks/transcript-panel-QUQ9XJmf.js";
|
|
127
127
|
import { T as Fn } from "./_chunks/typing-indicator-DHeVN4ob.js";
|
|
128
|
-
import { B as Ln, C as kn, O as Nn, b as Bn } from "./_chunks/booking-
|
|
128
|
+
import { B as Ln, C as kn, O as Nn, b as Bn } from "./_chunks/booking-Cw92aqo3.js";
|
|
129
129
|
import { C as yn, c as Dn, r as wn } from "./_chunks/calendar-WWNx448i.js";
|
|
130
130
|
import { P as _n, p as vn } from "./_chunks/patient-search-ZpHN-pgJ.js";
|
|
131
131
|
import { P as Hn, f as Gn, p as Wn, a as Un, s as Kn, b as jn, c as Yn } from "./_chunks/payment-form-Ds3rxvad.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfadocs/ui-kit-debug",
|
|
3
|
-
"version": "0.30.
|
|
3
|
+
"version": "0.30.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AlfaDocs shared design system — tokens, components, patterns, and translations for platform, booking, and alfascribe. (debug build — identical runtime to @alfadocs/ui-kit, ships source maps for symbolication).",
|
|
6
6
|
"license": "BUSL-1.1",
|