@alfadocs/ui-kit 0.25.1 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/dist/_chunks/{agenda-card-BmpaUG1h.js → agenda-card-CznB7K8e.js} +2 -2
  2. package/dist/_chunks/{agenda-tray-DiInnVqk.js → agenda-tray-C_bha7oK.js} +4 -4
  3. package/dist/_chunks/{ai-prompt-input-B5MdixzR.js → ai-prompt-input-Bka3jX3i.js} +2 -2
  4. package/dist/_chunks/{alia-sidebar-CUi2UCbY.js → alia-sidebar-CnvXq95r.js} +92 -109
  5. package/dist/_chunks/{audio-recorder-D4xM3H5i.js → audio-recorder-OB6IV9B1.js} +2 -2
  6. package/dist/_chunks/{autocomplete-C7xq06bP.js → autocomplete-CUh0f7Dj.js} +2 -2
  7. package/dist/_chunks/{avatar-BpFohgWG.js → avatar-D_H4emLo.js} +7 -7
  8. package/dist/_chunks/{benefit-card-DXmrAyfn.js → benefit-card-CjYM8vNr.js} +29 -29
  9. package/dist/_chunks/booking-BYuc_8HV.js +2250 -0
  10. package/dist/_chunks/{calendar-zy0tUUVG.js → calendar-WWNx448i.js} +114 -142
  11. package/dist/_chunks/{card-C353dU-H.js → card-DKTMLVrw.js} +11 -11
  12. package/dist/_chunks/{carousel.agent-DnPiqijR.js → carousel.agent-C9swH-Uf.js} +2 -2
  13. package/dist/_chunks/{chat-input-B3XmFGDw.js → chat-input-BfDcz1Yi.js} +2 -2
  14. package/dist/_chunks/{chat-message-W3k8rLOA.js → chat-message-fg221-yx.js} +2 -2
  15. package/dist/_chunks/{command-palette-DkL-aW4O.js → command-palette-11BieSNq.js} +2 -2
  16. package/dist/_chunks/{contact-card-CjG7c-1q.js → contact-card-DYbp--s-.js} +3 -3
  17. package/dist/_chunks/{date-picker-BIoSLRly.js → date-picker-D0Ry1dMz.js} +26 -27
  18. package/dist/_chunks/{date-range-picker-9gANFNG9.js → date-range-picker-DYgHzMOo.js} +19 -20
  19. package/dist/_chunks/{date-time-picker-DG7BiGdb.js → date-time-picker-CGmGtcyc.js} +10 -11
  20. package/dist/_chunks/{description-list-Bsga4IW8.js → description-list-yl3y3QKg.js} +34 -24
  21. package/dist/_chunks/{dialog-DUomPCRS.js → dialog-BBXqpZIt.js} +2 -2
  22. package/dist/_chunks/{editable-currency-cell-renderer-DJB5MxAI.js → editable-currency-cell-renderer-DSReCae7.js} +7 -7
  23. package/dist/_chunks/{empty-state-3CLJIXSj.js → empty-state-BLy7tigq.js} +13 -33
  24. package/dist/_chunks/eye-LHlSU38h.js +21 -0
  25. package/dist/_chunks/{freemium-paywall-CM6V1zNf.js → freemium-paywall-B9c8Ylww.js} +11 -11
  26. package/dist/_chunks/{header-DqmKROIY.js → header-CkMb1TZS.js} +24 -24
  27. package/dist/_chunks/heart-pulse-CvuyFKHB.js +21 -0
  28. package/dist/_chunks/icon-button-BRHSSFmZ.js +70 -0
  29. package/dist/_chunks/{isSameDay-ecuM8PBB.js → isSameDay-DHG8Xade.js} +4 -4
  30. package/dist/_chunks/{key-value-pair-DBuOCtIc.js → key-value-pair-CqeKiP__.js} +2 -2
  31. package/dist/_chunks/{link-DmM5IevO.js → link-DrD_cRUg.js} +50 -45
  32. package/dist/_chunks/{locale-picker-BxEUUPW7.js → locale-picker-BHxbTNmR.js} +297 -208
  33. package/dist/_chunks/{map-view-CcwycFQX.js → map-view-DyB8tr6c.js} +9 -9
  34. package/dist/_chunks/{matrix-rain-CRPMXcVx.js → matrix-rain-sDOUUwZp.js} +35 -35
  35. package/dist/_chunks/{message-card-i61k1TGc.js → message-card-DjRtA8GG.js} +3 -3
  36. package/dist/_chunks/{message-tray-DrV7G-wR.js → message-tray-DfsAMncP.js} +3 -3
  37. package/dist/_chunks/monitor-D-SFdbrU.js +16 -0
  38. package/dist/_chunks/{notification-card-ejOw5g6g.js → notification-card-B_847w5g.js} +3 -3
  39. package/dist/_chunks/{notification-tray-D_69dXFY.js → notification-tray-6f7smmT1.js} +22 -19
  40. package/dist/_chunks/parseISO-Dk4xa7q6.js +120 -0
  41. package/dist/_chunks/patient-search-BhlxYAI3.js +1102 -0
  42. package/dist/_chunks/patient-shell-CAXYzbRw.js +173 -0
  43. package/dist/_chunks/{payment-form-F7uh0Rqr.js → payment-form-Ds3rxvad.js} +2 -2
  44. package/dist/_chunks/{pdf-viewer-CuYaVR1I.js → pdf-viewer-CIuaocnq.js} +2 -2
  45. package/dist/_chunks/{popover--derJ_wq.js → popover-D0slaBB9.js} +17 -13
  46. package/dist/_chunks/{privacy-lock-BKsI6ReN.js → privacy-lock-BI4vi9Ud.js} +2 -2
  47. package/dist/_chunks/public-footer.agent-CA29gxHJ.js +516 -0
  48. package/dist/_chunks/{public-header.agent-BQ3r6Hgq.js → public-header.agent-5U3S9QiC.js} +49 -41
  49. package/dist/_chunks/react-day-picker-D3yzgvDB.js +3127 -0
  50. package/dist/_chunks/{recaptcha-widget-Kp1XntuE.js → recaptcha-widget-BtBNb6tB.js} +2 -2
  51. package/dist/_chunks/reviews-panel-CFttsfuC.js +513 -0
  52. package/dist/_chunks/{search-bar-DORSAzNt.js → search-bar-BRMW1-WG.js} +2 -2
  53. package/dist/_chunks/{search-input-BtEJAJHa.js → search-input-CIA6pPfn.js} +2 -2
  54. package/dist/_chunks/{sheet-BT0izeoI.js → sheet-D8M8hf8B.js} +2 -2
  55. package/dist/_chunks/{sign-in-with-alfadocs-button-4zZC-I6y.js → sign-in-with-alfadocs-button-BI0fVonM.js} +2 -2
  56. package/dist/_chunks/slot-grid-B2zprPcv.js +387 -0
  57. package/dist/_chunks/sparkles-CuYXqQLg.js +23 -0
  58. package/dist/_chunks/{spinner-DirtWZNG.js → spinner-CCByyvcb.js} +2 -2
  59. package/dist/_chunks/stepper-accordion-BfS6lUB9.js +257 -0
  60. package/dist/_chunks/stepper-accordion.agent-C4quJ-MD.js +71 -0
  61. package/dist/_chunks/stethoscope-DT5qCW8Y.js +18 -0
  62. package/dist/_chunks/{sun-Eweh5fvi.js → sun-BuXE0xUS.js} +3 -15
  63. package/dist/_chunks/{task-tray-B3A2fRGR.js → task-tray-Bcmrrs8m.js} +3 -3
  64. package/dist/_chunks/{theme-toggle-FrotC2VI.js → theme-toggle-nPzb378f.js} +37 -36
  65. package/dist/_chunks/{timeline-jmd7lfDf.js → timeline-CR7HjZCK.js} +3 -3
  66. package/dist/_chunks/{toast.agent-32WNQ-_x.js → toast.agent-CTF6nIj5.js} +2 -2
  67. package/dist/_chunks/{transcript-panel-DUrjx5sa.js → transcript-panel-QUQ9XJmf.js} +2 -2
  68. package/dist/_chunks/{use-password-requirements-C9vKBSVn.js → use-password-requirements-E0sSfx5X.js} +38 -53
  69. package/dist/_chunks/use-theme-C2dHKUAN.js +145 -0
  70. package/dist/_chunks/{workflow-map-BR6txfFX.js → workflow-map-BKsKdYvZ.js} +5 -5
  71. package/dist/agent-catalog.json +151 -51
  72. package/dist/components/agenda-card/index.js +1 -1
  73. package/dist/components/agenda-tray/index.js +1 -1
  74. package/dist/components/ai-prompt-input/index.js +1 -1
  75. package/dist/components/audio-recorder/index.js +1 -1
  76. package/dist/components/autocomplete/index.js +1 -1
  77. package/dist/components/avatar/index.js +1 -1
  78. package/dist/components/benefit-card/index.js +1 -1
  79. package/dist/components/booking/booking-types.d.ts +145 -0
  80. package/dist/components/booking/booking.agent.d.ts +4 -0
  81. package/dist/components/booking/booking.d.ts +6 -0
  82. package/dist/components/booking/cascade.d.ts +96 -0
  83. package/dist/components/booking/details-form.d.ts +32 -0
  84. package/dist/components/booking/index.d.ts +5 -0
  85. package/dist/components/booking/index.js +8 -0
  86. package/dist/components/button/index.js +1 -1
  87. package/dist/components/calendar/index.js +1 -1
  88. package/dist/components/card/index.js +1 -1
  89. package/dist/components/carousel/index.js +1 -1
  90. package/dist/components/chat-input/index.js +1 -1
  91. package/dist/components/chat-message/index.js +1 -1
  92. package/dist/components/checkbox/checkbox.d.ts +6 -2
  93. package/dist/components/command-palette/index.js +1 -1
  94. package/dist/components/contact-card/index.js +1 -1
  95. package/dist/components/data-table/index.js +1 -1
  96. package/dist/components/date-picker/index.js +1 -1
  97. package/dist/components/date-range-picker/index.js +1 -1
  98. package/dist/components/date-time-picker/index.js +1 -1
  99. package/dist/components/description-list/index.js +1 -1
  100. package/dist/components/dialog/index.js +1 -1
  101. package/dist/components/empty-state/index.js +1 -1
  102. package/dist/components/freemium-paywall/index.js +1 -1
  103. package/dist/components/header/index.js +1 -1
  104. package/dist/components/header-settings/index.js +16 -15
  105. package/dist/components/icon-button/index.js +1 -1
  106. package/dist/components/index.d.ts +4 -1
  107. package/dist/components/key-value-pair/index.js +1 -1
  108. package/dist/components/link/index.js +1 -1
  109. package/dist/components/link/link.d.ts +7 -0
  110. package/dist/components/locale-picker/index.js +1 -1
  111. package/dist/components/map-view/index.js +1 -1
  112. package/dist/components/matrix-rain/index.js +1 -1
  113. package/dist/components/message-card/index.js +1 -1
  114. package/dist/components/message-tray/index.js +1 -1
  115. package/dist/components/notification-card/index.js +1 -1
  116. package/dist/components/notification-tray/index.js +1 -1
  117. package/dist/components/password-input/index.js +1 -1
  118. package/dist/components/patient-search/index.d.ts +4 -0
  119. package/dist/components/patient-search/index.js +6 -0
  120. package/dist/components/patient-search/patient-search.agent.d.ts +4 -0
  121. package/dist/components/patient-search/patient-search.d.ts +103 -0
  122. package/dist/components/payment-form/index.js +1 -1
  123. package/dist/components/pdf-viewer/index.js +1 -1
  124. package/dist/components/popover/index.js +1 -1
  125. package/dist/components/privacy-lock/index.js +1 -1
  126. package/dist/components/public-footer/index.d.ts +6 -0
  127. package/dist/components/public-footer/index.js +10 -0
  128. package/dist/components/public-footer/legal-urls.d.ts +18 -0
  129. package/dist/components/public-footer/public-footer.agent.d.ts +4 -0
  130. package/dist/components/public-footer/public-footer.d.ts +51 -0
  131. package/dist/components/public-footer/socials.d.ts +9 -0
  132. package/dist/components/public-header/index.js +1 -1
  133. package/dist/components/recaptcha-widget/index.js +1 -1
  134. package/dist/components/reviews-panel/index.d.ts +4 -0
  135. package/dist/components/reviews-panel/index.js +6 -0
  136. package/dist/components/reviews-panel/reviews-panel.agent.d.ts +4 -0
  137. package/dist/components/reviews-panel/reviews-panel.d.ts +76 -0
  138. package/dist/components/search-bar/index.js +1 -1
  139. package/dist/components/search-input/index.js +1 -1
  140. package/dist/components/sheet/index.js +1 -1
  141. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  142. package/dist/components/slot-grid/index.js +1 -1
  143. package/dist/components/spinner/index.js +1 -1
  144. package/dist/components/stepper-accordion/index.js +4 -3
  145. package/dist/components/task-tray/index.js +1 -1
  146. package/dist/components/theme-toggle/index.js +1 -1
  147. package/dist/components/timeline/index.js +1 -1
  148. package/dist/components/toast/index.js +1 -1
  149. package/dist/components/transcript-panel/index.js +1 -1
  150. package/dist/components/workflow/index.js +1 -1
  151. package/dist/hooks/index.js +1 -1
  152. package/dist/i18n/config.js +4923 -49
  153. package/dist/i18n/locales/ar.d.ts +272 -0
  154. package/dist/i18n/locales/de.d.ts +272 -0
  155. package/dist/i18n/locales/el.d.ts +272 -0
  156. package/dist/i18n/locales/es.d.ts +272 -0
  157. package/dist/i18n/locales/fr.d.ts +272 -0
  158. package/dist/i18n/locales/hi.d.ts +272 -0
  159. package/dist/i18n/locales/ja.d.ts +272 -0
  160. package/dist/i18n/locales/nl.d.ts +272 -0
  161. package/dist/i18n/locales/pl.d.ts +272 -0
  162. package/dist/i18n/locales/pt.d.ts +272 -0
  163. package/dist/i18n/locales/ro.d.ts +272 -0
  164. package/dist/i18n/locales/ru.d.ts +272 -0
  165. package/dist/i18n/locales/sq.d.ts +272 -0
  166. package/dist/i18n/locales/sv.d.ts +272 -0
  167. package/dist/i18n/locales/tr.d.ts +272 -0
  168. package/dist/i18n/locales/zh.d.ts +272 -0
  169. package/dist/i18n/resources.d.ts +544 -0
  170. package/dist/index.js +364 -348
  171. package/dist/locales/ar.json +273 -1
  172. package/dist/locales/de.json +273 -1
  173. package/dist/locales/el.json +273 -1
  174. package/dist/locales/en.json +273 -1
  175. package/dist/locales/es.json +273 -1
  176. package/dist/locales/fr.json +273 -1
  177. package/dist/locales/hi.json +273 -1
  178. package/dist/locales/it.json +273 -1
  179. package/dist/locales/ja.json +273 -1
  180. package/dist/locales/nl.json +273 -1
  181. package/dist/locales/pl.json +273 -1
  182. package/dist/locales/pt.json +273 -1
  183. package/dist/locales/ro.json +273 -1
  184. package/dist/locales/ru.json +273 -1
  185. package/dist/locales/sq.json +273 -1
  186. package/dist/locales/sv.json +273 -1
  187. package/dist/locales/tr.json +273 -1
  188. package/dist/locales/zh.json +273 -1
  189. package/dist/patterns/alia-assistant/index.js +1 -1
  190. package/dist/patterns/patient-shell/index.js +1 -1
  191. package/dist/tokens.css +1 -1
  192. package/package.json +17 -1
  193. package/dist/_chunks/icon-button-C4CGcYuz.js +0 -54
  194. package/dist/_chunks/isSameMonth-5wNF2f4I.js +0 -1307
  195. package/dist/_chunks/patient-shell-B164drIa.js +0 -173
  196. package/dist/_chunks/react-day-picker-C5F3-TTX.js +0 -1827
  197. package/dist/_chunks/slot-grid-CgpYgBkW.js +0 -502
  198. package/dist/_chunks/stepper-C-sIpRRU.js +0 -7
  199. package/dist/_chunks/stepper-accordion.agent-ckKYZCIP.js +0 -322
  200. package/dist/_chunks/stepper-calendar-BLOJUE0-.js +0 -648
  201. package/dist/_chunks/use-theme-B1cwAXJR.js +0 -145
  202. package/dist/components/stepper-calendar/index.d.ts +0 -4
  203. package/dist/components/stepper-calendar/index.js +0 -6
  204. package/dist/components/stepper-calendar/stepper-calendar.agent.d.ts +0 -4
  205. package/dist/components/stepper-calendar/stepper-calendar.d.ts +0 -62
@@ -0,0 +1,96 @@
1
+ import type { BookingOperator, BookingService, BookingSlot, BookingSpecialty, BookingValue, ConfirmationChannel, InsuranceType } from './booking-types';
2
+ /**
3
+ * Sentinel for the operator filter's "All operators" pseudo-option. Mirrors
4
+ * `OPERATORS_ALL = '0'` in the legacy `useBookingState.js`, but the kit
5
+ * uses `'all'` as the well-known string so consumers can't accidentally
6
+ * collide with a real operator id of `'0'`.
7
+ */
8
+ export declare const OPERATORS_ALL: "all";
9
+ export interface CascadePolicy {
10
+ /** ISO 3166-1 alpha-2 country code. Currently only `'de'` toggles a gate. */
11
+ country?: string;
12
+ useSpecialties?: boolean;
13
+ allowOperatorSelection?: boolean;
14
+ /** When set, locks step 4 to this operator id and hides the picker. */
15
+ lockedOperatorId?: string;
16
+ /** Defaults to `false`. When true, single-service lists auto-pre-fill. */
17
+ autoSelectSingleService?: boolean;
18
+ }
19
+ export interface CascadeInputs extends CascadePolicy {
20
+ specialties: BookingSpecialty[];
21
+ services: BookingService[];
22
+ operators: BookingOperator[];
23
+ availableDates: string[];
24
+ availableSlots: Record<string, BookingSlot[]>;
25
+ value: BookingValue;
26
+ }
27
+ export interface CascadeGates {
28
+ insurance: boolean;
29
+ specialty: boolean;
30
+ service: boolean;
31
+ operator: boolean;
32
+ date: boolean;
33
+ slot: boolean;
34
+ details: boolean;
35
+ /** True when a service is picked but no eligible operators can perform it. */
36
+ onboardingIncomplete: boolean;
37
+ }
38
+ export interface CascadeFiltered {
39
+ specialties: BookingSpecialty[];
40
+ services: BookingService[];
41
+ /**
42
+ * Eligible operators for the active specialty (when `useSpecialties=true`)
43
+ * OR the active service. Excludes the "All operators" sentinel — that's
44
+ * always prepended in the UI layer.
45
+ */
46
+ operators: BookingOperator[];
47
+ }
48
+ /** Step number — 1-indexed, matches the docs / a11y order. */
49
+ export type CascadeStep = 1 | 2 | 3 | 4 | 5 | 6 | 7;
50
+ export interface CascadeOutputs {
51
+ gates: CascadeGates;
52
+ filtered: CascadeFiltered;
53
+ /** Current step: the first visible step that has an unfulfilled requirement. */
54
+ currentStep: CascadeStep;
55
+ /** Total visible steps (1..7 minus any auto-skipped). */
56
+ totalSteps: number;
57
+ /** Ordered list of the visible step indices, used by variants that show a stepper. */
58
+ visibleSteps: CascadeStep[];
59
+ /** Whether every required step is satisfied — the submit button is gated on this. */
60
+ isReadyToSubmit: boolean;
61
+ /** Selected service's duration, if any — needed for slot fetching. */
62
+ durationMin?: number;
63
+ /** Selected slot resolved from `value.date` + `value.slotKey`. */
64
+ selectedSlot?: BookingSlot;
65
+ }
66
+ export declare function deriveCascade(inputs: CascadeInputs): CascadeOutputs;
67
+ export declare function resetOnInsuranceChange(value: BookingValue, next: InsuranceType | undefined): BookingValue;
68
+ export declare function resetOnSpecialtyChange(value: BookingValue, next: string | undefined): BookingValue;
69
+ export declare function resetOnServiceChange(value: BookingValue, next: string | undefined): BookingValue;
70
+ export declare function resetOnOperatorChange(value: BookingValue, next: string | undefined): BookingValue;
71
+ export declare function resetOnDateChange(value: BookingValue, next: string | undefined): BookingValue;
72
+ export declare function resetOnSlotChange(value: BookingValue, next: string | undefined): BookingValue;
73
+ export declare function applyAutoSelects(value: BookingValue, inputs: CascadePolicy & {
74
+ specialties: BookingSpecialty[];
75
+ services: BookingService[];
76
+ }): BookingValue;
77
+ /** Resolve the active operator id, treating the `'all'` sentinel as `undefined`. */
78
+ export declare function resolveOperatorId(value: BookingValue): string | undefined;
79
+ /**
80
+ * Resolve the effective list of enabled channels. Falls back to `['email']`
81
+ * when the consumer omits the prop, preserving the pre-amendment behaviour.
82
+ */
83
+ export declare function resolveConfirmationChannels(enabled: ConfirmationChannel[] | undefined): ConfirmationChannel[];
84
+ /**
85
+ * Compute the channels to pre-check. Result is intersected with `enabled`
86
+ * for safety so a channel the practice didn't enable never gets ticked.
87
+ *
88
+ * Rules (per spec):
89
+ * 1. Always include 'email'.
90
+ * 2. Include 'whatsapp' if enabled AND mobile looks plausible.
91
+ * 3. Include 'sms' ONLY when whatsapp is NOT in `enabled`.
92
+ * 4. If the consumer passes `override`, honour it verbatim (still
93
+ * intersected with `enabled` for safety).
94
+ */
95
+ export declare function defaultConfirmationSelection(enabled: ConfirmationChannel[] | undefined, mobile: string | undefined, override?: ConfirmationChannel[]): ConfirmationChannel[];
96
+ //# sourceMappingURL=cascade.d.ts.map
@@ -0,0 +1,32 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { BookingDetails, BookingValidator, ConfirmationChannel } from './booking-types';
3
+ export interface BookingDetailsFormProps {
4
+ value: Partial<BookingDetails>;
5
+ onChange: (next: Partial<BookingDetails>) => void;
6
+ onSubmit: (details: BookingDetails) => void | Promise<void>;
7
+ requireCodiceFiscale?: boolean;
8
+ requireDateOfBirth?: boolean;
9
+ /** When `true` AND `insuranceType === 'public'`, render the Versichertennummer field. */
10
+ requireInsuranceNumber?: boolean;
11
+ insuranceType?: 'private' | 'public';
12
+ showNote?: boolean;
13
+ showReturningPatientFlag?: boolean;
14
+ privacyPolicyUrl?: string;
15
+ termsUrl?: string;
16
+ validateCodiceFiscale?: BookingValidator;
17
+ validateInsuranceNumber?: BookingValidator;
18
+ submitting?: boolean;
19
+ /** Optional summary node rendered above the form (e.g. confirm-time chip). */
20
+ summarySlot?: ReactNode;
21
+ defaultPhoneCountry?: string;
22
+ /**
23
+ * Channels the practice has enabled. When omitted, defaults to
24
+ * `['email']` (picker hidden — single implicit channel). When the
25
+ * resolved list has length 1 the picker stays hidden.
26
+ */
27
+ confirmationChannels?: ConfirmationChannel[];
28
+ /** Pre-checked channels override; falls back to a smart default. */
29
+ defaultConfirmationChannels?: ConfirmationChannel[];
30
+ }
31
+ export declare const BookingDetailsForm: import("react").ForwardRefExoticComponent<BookingDetailsFormProps & import("react").RefAttributes<HTMLFormElement>>;
32
+ //# sourceMappingURL=details-form.d.ts.map
@@ -0,0 +1,5 @@
1
+ export { Booking } from './booking';
2
+ export type { BookingProps, BookingHandle, BookingVariant, BookingValue, BookingService, BookingSpecialty, BookingSlot, BookingOperator, BookingDetails, BookingSubmitPayload, BookingValidator, BookingValidationResult, ConfirmationChannel, InsuranceType, } from './booking';
3
+ export { CONFIRMATION_CHANNEL_ORDER, OPERATORS_ALL } from './booking';
4
+ export { bookingAgent } from './booking.agent';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,8 @@
1
+ import { B as A, C as R, O as a, b as s } from "../../_chunks/booking-BYuc_8HV.js";
2
+ export {
3
+ A as Booking,
4
+ R as CONFIRMATION_CHANNEL_ORDER,
5
+ a as OPERATORS_ALL,
6
+ s as bookingAgent
7
+ };
8
+ //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { B as r } from "../../_chunks/button-DD_0Xdmr.js";
2
- import { I as e } from "../../_chunks/icon-button-C4CGcYuz.js";
2
+ import { I as e } from "../../_chunks/icon-button-BRHSSFmZ.js";
3
3
  import { b as f } from "../../_chunks/button.agent-BuGZBktn.js";
4
4
  export {
5
5
  r as Button,
@@ -1,4 +1,4 @@
1
- import { C as r, c as l, r as n } from "../../_chunks/calendar-zy0tUUVG.js";
1
+ import { C as r, c as l, r as n } from "../../_chunks/calendar-WWNx448i.js";
2
2
  export {
3
3
  r as Calendar,
4
4
  l as calendarAgent,
@@ -1,4 +1,4 @@
1
- import { C as o } from "../../_chunks/card-C353dU-H.js";
1
+ import { C as o } from "../../_chunks/card-DKTMLVrw.js";
2
2
  export {
3
3
  o as Card
4
4
  };
@@ -1,4 +1,4 @@
1
- import { C as o, c as r } from "../../_chunks/carousel.agent-DnPiqijR.js";
1
+ import { C as o, c as r } from "../../_chunks/carousel.agent-C9swH-Uf.js";
2
2
  export {
3
3
  o as Carousel,
4
4
  r as carouselAgent
@@ -1,4 +1,4 @@
1
- import { C as n, c as p } from "../../_chunks/chat-input-B3XmFGDw.js";
1
+ import { C as n, c as p } from "../../_chunks/chat-input-BfDcz1Yi.js";
2
2
  export {
3
3
  n as ChatInput,
4
4
  p as chatInputAgent
@@ -1,4 +1,4 @@
1
- import { C as s } from "../../_chunks/chat-message-W3k8rLOA.js";
1
+ import { C as s } from "../../_chunks/chat-message-fg221-yx.js";
2
2
  export {
3
3
  s as ChatMessage
4
4
  };
@@ -1,4 +1,4 @@
1
- import { type ComponentPropsWithoutRef } from 'react';
1
+ import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
2
2
  import * as RadixCheckbox from '@radix-ui/react-checkbox';
3
3
  import { type VariantProps } from 'class-variance-authority';
4
4
  /** Agent-readiness curated handle for Checkbox. */
@@ -12,7 +12,11 @@ declare const checkboxVariants: (props?: ({
12
12
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
13
13
  type RadixRootProps = ComponentPropsWithoutRef<typeof RadixCheckbox.Root>;
14
14
  export interface CheckboxProps extends Omit<RadixRootProps, 'checked' | 'onCheckedChange' | 'children'>, VariantProps<typeof checkboxVariants> {
15
- label: string;
15
+ /**
16
+ * Visible label rendered next to the box. Accepts a string or any React
17
+ * node — useful for consent labels that embed a privacy / T&C link.
18
+ */
19
+ label: ReactNode;
16
20
  checked?: boolean | 'indeterminate';
17
21
  onCheckedChange?: (checked: boolean | 'indeterminate') => void;
18
22
  size?: 'sm' | 'md' | 'lg';
@@ -1,4 +1,4 @@
1
- import { C as t, a as e, b as o, c as s, d as n, e as d, f as i, g as C, h as r, i as l, j as c, k as h, u as g } from "../../_chunks/command-palette-DkL-aW4O.js";
1
+ import { C as t, a as e, b as o, c as s, d as n, e as d, f as i, g as C, h as r, i as l, j as c, k as h, u as g } from "../../_chunks/command-palette-11BieSNq.js";
2
2
  export {
3
3
  t as CommandEmpty,
4
4
  e as CommandGroup,
@@ -1,4 +1,4 @@
1
- import { C as r } from "../../_chunks/contact-card-CjG7c-1q.js";
1
+ import { C as r } from "../../_chunks/contact-card-DYbp--s-.js";
2
2
  export {
3
3
  r as ContactCard
4
4
  };
@@ -1,4 +1,4 @@
1
- import { A as l, B as r, C as t, a as s, D as n, b as d, c as i, d as o, E as C, e as R, I as F, L as g, N as T, f as b, S as u, g as c, h as D, T as m, i as p, j as x, k as f, l as y, m as E, n as S, o as h, U as A, p as L, q as N, u as k } from "../../_chunks/editable-currency-cell-renderer-DJB5MxAI.js";
1
+ import { A as l, B as r, C as t, a as s, D as n, b as d, c as i, d as o, E as C, e as R, I as F, L as g, N as T, f as b, S as u, g as c, h as D, T as m, i as p, j as x, k as f, l as y, m as E, n as S, o as h, U as A, p as L, q as N, u as k } from "../../_chunks/editable-currency-cell-renderer-DSReCae7.js";
2
2
  export {
3
3
  l as ActionsCellRenderer,
4
4
  r as BalanceCellRenderer,
@@ -1,4 +1,4 @@
1
- import { D as r, d as t } from "../../_chunks/date-picker-BIoSLRly.js";
1
+ import { D as r, d as t } from "../../_chunks/date-picker-D0Ry1dMz.js";
2
2
  export {
3
3
  r as DatePicker,
4
4
  t as datePickerAgent
@@ -1,4 +1,4 @@
1
- import { D as r, d as t } from "../../_chunks/date-range-picker-9gANFNG9.js";
1
+ import { D as r, d as t } from "../../_chunks/date-range-picker-DYgHzMOo.js";
2
2
  export {
3
3
  r as DateRangePicker,
4
4
  t as dateRangePickerAgent
@@ -1,4 +1,4 @@
1
- import { D as i, d as r } from "../../_chunks/date-time-picker-DG7BiGdb.js";
1
+ import { D as i, d as r } from "../../_chunks/date-time-picker-CGmGtcyc.js";
2
2
  export {
3
3
  i as DateTimePicker,
4
4
  r as dateTimePickerAgent
@@ -1,4 +1,4 @@
1
- import { D as r } from "../../_chunks/description-list-Bsga4IW8.js";
1
+ import { D as r } from "../../_chunks/description-list-yl3y3QKg.js";
2
2
  export {
3
3
  r as DescriptionList
4
4
  };
@@ -1,4 +1,4 @@
1
- import { D as g, d } from "../../_chunks/dialog-DUomPCRS.js";
1
+ import { D as g, d } from "../../_chunks/dialog-BBXqpZIt.js";
2
2
  export {
3
3
  g as Dialog,
4
4
  d as dialogAgent
@@ -1,4 +1,4 @@
1
- import { E as e } from "../../_chunks/empty-state-3CLJIXSj.js";
1
+ import { E as e } from "../../_chunks/empty-state-BLy7tigq.js";
2
2
  export {
3
3
  e as EmptyState
4
4
  };
@@ -1,4 +1,4 @@
1
- import { F as m, f as l } from "../../_chunks/freemium-paywall-CM6V1zNf.js";
1
+ import { F as m, f as l } from "../../_chunks/freemium-paywall-B9c8Ylww.js";
2
2
  export {
3
3
  m as FreemiumPaywall,
4
4
  l as freemiumPaywallAgent
@@ -1,4 +1,4 @@
1
- import { H as r, a as d, b as H, c as s, d as n, e as t, f as i, g as o } from "../../_chunks/header-DqmKROIY.js";
1
+ import { H as r, a as d, b as H, c as s, d as n, e as t, f as i, g as o } from "../../_chunks/header-CkMb1TZS.js";
2
2
  export {
3
3
  r as Header,
4
4
  d as HeaderBrand,
@@ -1,17 +1,18 @@
1
- import { jsx as e, jsxs as d } from "react/jsx-runtime";
1
+ import { jsx as e, jsxs as l } from "react/jsx-runtime";
2
2
  import { forwardRef as A, useRef as p, useImperativeHandle as C, useCallback as x, useMemo as I } from "react";
3
3
  import { c as N } from "../../_chunks/index-D2ZczOXr.js";
4
4
  import { useTranslation as E } from "react-i18next";
5
- import { I as o } from "../../_chunks/icon-button-C4CGcYuz.js";
6
- import { I as R } from "../../_chunks/icon-button-group-DeV3FpNY.js";
5
+ import { I as o } from "../../_chunks/icon-button-BRHSSFmZ.js";
6
+ import { I as M } from "../../_chunks/icon-button-group-DeV3FpNY.js";
7
7
  import { D as r } from "../../_chunks/dropdown-menu-DZxwF23X.js";
8
- import { S as M } from "../../_chunks/switch-D916VW86.js";
9
- import { c as v, a as _, L as H } from "../../_chunks/locale-picker-BxEUUPW7.js";
8
+ import { S as R } from "../../_chunks/switch-D916VW86.js";
9
+ import { c as v, a as _, L as H } from "../../_chunks/locale-picker-BHxbTNmR.js";
10
10
  import { u as O } from "../../_chunks/use-locale-BkCIHujH.js";
11
- import { u as P } from "../../_chunks/use-theme-B1cwAXJR.js";
11
+ import { u as P } from "../../_chunks/use-theme-C2dHKUAN.js";
12
12
  import { u as j } from "../../_chunks/registry-C9nwlNyL.js";
13
13
  import { S as K } from "../../_chunks/settings-ca2Yi9R8.js";
14
- import { S as D, M as z, a as V } from "../../_chunks/sun-Eweh5fvi.js";
14
+ import { S as D, M as z } from "../../_chunks/sun-BuXE0xUS.js";
15
+ import { M as V } from "../../_chunks/monitor-D-SFdbrU.js";
15
16
  const B = {
16
17
  id: "header-settings",
17
18
  capabilities: ["view_change"],
@@ -117,7 +118,7 @@ const F = N("ds:inline-flex ds:items-center", {
117
118
  "data-component-id": m,
118
119
  className: F({ align: g, className: w }),
119
120
  ...L,
120
- children: /* @__PURE__ */ d(r.Root, { children: [
121
+ children: /* @__PURE__ */ l(r.Root, { children: [
121
122
  /* @__PURE__ */ e(r.Trigger, { asChild: !0, children: /* @__PURE__ */ e(
122
123
  o,
123
124
  {
@@ -127,15 +128,15 @@ const F = N("ds:inline-flex ds:items-center", {
127
128
  "aria-label": s("navigation.headerSettings.trigger")
128
129
  }
129
130
  ) }),
130
- /* @__PURE__ */ e(r.Portal, { children: /* @__PURE__ */ d(
131
+ /* @__PURE__ */ e(r.Portal, { children: /* @__PURE__ */ l(
131
132
  r.Content,
132
133
  {
133
134
  align: g,
134
135
  sideOffset: 8,
135
136
  className: U,
136
137
  onKeyDownCapture: (a) => {
137
- const l = a.target;
138
- (l == null ? void 0 : l.tagName) === "INPUT" && // Always allow Escape so the menu can close.
138
+ const d = a.target;
139
+ (d == null ? void 0 : d.tagName) === "INPUT" && // Always allow Escape so the menu can close.
139
140
  a.key !== "Escape" && a.stopPropagation();
140
141
  },
141
142
  children: [
@@ -155,7 +156,7 @@ const F = N("ds:inline-flex ds:items-center", {
155
156
  // flex container we make this div into.
156
157
  "ds:flex ds:[&>*]:flex-1"
157
158
  ].join(" "),
158
- children: /* @__PURE__ */ e(_, { variant: "compact" })
159
+ children: /* @__PURE__ */ e(_, { variant: "compact", popoverSide: "end" })
159
160
  }
160
161
  ),
161
162
  /* @__PURE__ */ e(r.Separator, {}),
@@ -166,8 +167,8 @@ const F = N("ds:inline-flex ds:items-center", {
166
167
  role: "group",
167
168
  "aria-label": s("navigation.headerSettings.appearance.label"),
168
169
  className: "ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]",
169
- children: /* @__PURE__ */ d(
170
- R,
170
+ children: /* @__PURE__ */ l(
171
+ M,
171
172
  {
172
173
  role: "radiogroup",
173
174
  mode: "toggle-single",
@@ -217,7 +218,7 @@ const F = N("ds:inline-flex ds:items-center", {
217
218
  ),
218
219
  className: "ds:px-[var(--spacing-sm)] ds:py-[var(--spacing-sm)]",
219
220
  children: /* @__PURE__ */ e(
220
- M,
221
+ R,
221
222
  {
222
223
  label: s("navigation.headerSettings.appearance.accessible"),
223
224
  labelSide: "start",
@@ -1,4 +1,4 @@
1
- import { I as n } from "../../_chunks/icon-button-C4CGcYuz.js";
1
+ import { I as n } from "../../_chunks/icon-button-BRHSSFmZ.js";
2
2
  export {
3
3
  n as IconButton
4
4
  };
@@ -65,12 +65,12 @@ export * from './header';
65
65
  export * from './navigation-menu';
66
66
  export * from './link';
67
67
  export * from './pagination';
68
+ export * from './public-footer';
68
69
  export * from './public-header';
69
70
  export * from './search-bar';
70
71
  export * from './sidebar';
71
72
  export * from './skip-link';
72
73
  export * from './stepper-accordion';
73
- export * from './stepper-calendar';
74
74
  export * from './stepper-progress';
75
75
  export * from './tabs';
76
76
  export * from './theme-toggle';
@@ -115,9 +115,12 @@ export * from './streaming-text';
115
115
  export * from './suggestion-chip';
116
116
  export * from './transcript-panel';
117
117
  export * from './typing-indicator';
118
+ export * from './booking';
118
119
  export * from './calendar';
120
+ export * from './patient-search';
119
121
  export * from './payment-form';
120
122
  export * from './pdf-viewer';
123
+ export * from './reviews-panel';
121
124
  export * from './rich-text-editor';
122
125
  export * from './signature-capture';
123
126
  export * from './slot-grid';
@@ -1,4 +1,4 @@
1
- import { K as r } from "../../_chunks/key-value-pair-DBuOCtIc.js";
1
+ import { K as r } from "../../_chunks/key-value-pair-CqeKiP__.js";
2
2
  export {
3
3
  r as KeyValuePair
4
4
  };
@@ -1,4 +1,4 @@
1
- import { L } from "../../_chunks/link-DmM5IevO.js";
1
+ import { L } from "../../_chunks/link-DrD_cRUg.js";
2
2
  export {
3
3
  L as Link
4
4
  };
@@ -23,6 +23,13 @@ export interface LinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>,
23
23
  * trailing `ExternalLink` icon with an i18n'd aria-label.
24
24
  */
25
25
  external?: boolean;
26
+ /**
27
+ * Render the trailing external-link glyph. Default `true` — set to
28
+ * `false` for surfaces (footer, social rows, dense nav) where the
29
+ * indicator adds visual noise. The `target` / `rel` / "opens in new
30
+ * tab" aria-label are still applied.
31
+ */
32
+ externalIcon?: boolean;
26
33
  /**
27
34
  * Render the link in a non-interactive disabled state. Strips `href`,
28
35
  * adds `aria-disabled` + `role="link"`, suppresses the underline.
@@ -1,4 +1,4 @@
1
- import { L, a as c, b as r } from "../../_chunks/locale-picker-BxEUUPW7.js";
1
+ import { L, a as c, b as r } from "../../_chunks/locale-picker-BHxbTNmR.js";
2
2
  export {
3
3
  L as LOCALE_STORAGE_KEY,
4
4
  c as LocalePicker,
@@ -1,4 +1,4 @@
1
- import { M as o } from "../../_chunks/map-view-CcwycFQX.js";
1
+ import { M as o } from "../../_chunks/map-view-DyB8tr6c.js";
2
2
  export {
3
3
  o as MapView
4
4
  };
@@ -1,4 +1,4 @@
1
- import { M as i } from "../../_chunks/matrix-rain-CRPMXcVx.js";
1
+ import { M as i } from "../../_chunks/matrix-rain-sDOUUwZp.js";
2
2
  export {
3
3
  i as MatrixRain
4
4
  };
@@ -1,4 +1,4 @@
1
- import { M as a, i as r } from "../../_chunks/message-card-i61k1TGc.js";
1
+ import { M as a, i as r } from "../../_chunks/message-card-DjRtA8GG.js";
2
2
  import { m } from "../../_chunks/message-card.agent-4IeIgrnJ.js";
3
3
  export {
4
4
  a as MessageCard,
@@ -1,4 +1,4 @@
1
- import { M as s, m as r } from "../../_chunks/message-tray-DrV7G-wR.js";
1
+ import { M as s, m as r } from "../../_chunks/message-tray-DfsAMncP.js";
2
2
  export {
3
3
  s as MessageTray,
4
4
  r as messageTrayAgent
@@ -1,4 +1,4 @@
1
- import { N as a, i as t } from "../../_chunks/notification-card-ejOw5g6g.js";
1
+ import { N as a, i as t } from "../../_chunks/notification-card-B_847w5g.js";
2
2
  import { n as f } from "../../_chunks/notification-card.agent-Rqt3ofk9.js";
3
3
  export {
4
4
  a as NotificationCard,
@@ -1,4 +1,4 @@
1
- import { N as o, n as t } from "../../_chunks/notification-tray-D_69dXFY.js";
1
+ import { N as o, n as t } from "../../_chunks/notification-tray-6f7smmT1.js";
2
2
  export {
3
3
  o as NotificationTray,
4
4
  t as notificationTrayAgent
@@ -1,4 +1,4 @@
1
- import { P as r, u as a } from "../../_chunks/use-password-requirements-C9vKBSVn.js";
1
+ import { P as r, u as a } from "../../_chunks/use-password-requirements-E0sSfx5X.js";
2
2
  export {
3
3
  r as PasswordInput,
4
4
  a as usePasswordRequirements
@@ -0,0 +1,4 @@
1
+ export { PatientSearch } from './patient-search';
2
+ export type { PatientSearchProps, PatientSearchHandle, PatientSearchVariant, PatientSearchObject, PatientSearchPlace, DiscoveryCard, FacetGroup, FacetOption, SearchValue, WhenFilter, } from './patient-search';
3
+ export { patientSearchAgent } from './patient-search.agent';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,6 @@
1
+ import { P as t, p as r } from "../../_chunks/patient-search-BhlxYAI3.js";
2
+ export {
3
+ t as PatientSearch,
4
+ r as patientSearchAgent
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,4 @@
1
+ import type { AgentAdapter } from '../../agent/types';
2
+ import type { PatientSearchHandle } from './patient-search';
3
+ export declare const patientSearchAgent: AgentAdapter<PatientSearchHandle>;
4
+ //# sourceMappingURL=patient-search.agent.d.ts.map
@@ -0,0 +1,103 @@
1
+ import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
2
+ import { type VariantProps } from 'class-variance-authority';
3
+ export type PatientSearchVariant = 'who-where' | 'who-where-when' | 'faceted' | 'discovery';
4
+ export type WhenFilter = 'today' | 'tomorrow' | 'this_week' | 'anytime';
5
+ /** Result from `loadObjects` — a profession, specialty, operator, or practice. */
6
+ export interface PatientSearchObject {
7
+ /** Stable opaque key, e.g. `"profession:dentista"` or `"operator:mario-rossi-9001"`. */
8
+ value: string;
9
+ label: string;
10
+ description?: string;
11
+ /** Opaque consumer payload — used in `onObjectSelect` to route. */
12
+ __payload?: unknown;
13
+ }
14
+ /** Result from `loadPlaces` — a Google-Places-style place prediction. */
15
+ export interface PatientSearchPlace {
16
+ /** Place ID or stable text. */
17
+ value: string;
18
+ /** Display label, e.g. `"Milano, Italia"`. */
19
+ label: string;
20
+ lat?: number;
21
+ lng?: number;
22
+ }
23
+ /** Curated card for the `discovery` variant. */
24
+ export interface DiscoveryCard {
25
+ id: string;
26
+ label: string;
27
+ description?: string;
28
+ href: string;
29
+ icon?: ReactNode;
30
+ /**
31
+ * Accent token. `auto` rotates through the brand palette by row index.
32
+ * Defaults to `auto`.
33
+ */
34
+ accent?: 'violet' | 'purple' | 'magenta' | 'blue' | 'auto';
35
+ badge?: string;
36
+ }
37
+ export interface FacetOption {
38
+ value: string;
39
+ label: string;
40
+ }
41
+ export interface FacetGroup {
42
+ /** Stable key — e.g. `"insurance"`, `"language"`. */
43
+ key: string;
44
+ /** Display label, e.g. `"Convenzione"`. */
45
+ label: string;
46
+ /** Empty array = boolean toggle chip. Non-empty = dropdown chip. */
47
+ options: FacetOption[];
48
+ /** Whether multiple options can be selected. Default false. */
49
+ multi?: boolean;
50
+ }
51
+ export interface SearchValue {
52
+ object?: PatientSearchObject;
53
+ place?: PatientSearchPlace;
54
+ when?: WhenFilter;
55
+ facets?: Record<string, string[]>;
56
+ geo?: {
57
+ lat: number;
58
+ lng: number;
59
+ radiusKm: number;
60
+ label?: string;
61
+ };
62
+ }
63
+ /** Curated imperative handle — used by the agent adapter. */
64
+ export interface PatientSearchHandle {
65
+ getVariant: () => PatientSearchVariant;
66
+ reset: () => void;
67
+ /** Move focus to the most-relevant field for the current variant. */
68
+ focusPrimary: () => void;
69
+ }
70
+ declare const rootVariants: (props?: ({
71
+ variant?: "who-where" | "who-where-when" | "faceted" | "discovery" | null | undefined;
72
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
73
+ export interface PatientSearchProps extends Omit<ComponentPropsWithoutRef<'div'>, 'aria-label' | 'onChange' | 'onSubmit'>, VariantProps<typeof rootVariants> {
74
+ variant: PatientSearchVariant;
75
+ loadObjects: (query: string, ctx: {
76
+ signal: AbortSignal;
77
+ }) => Promise<PatientSearchObject[]>;
78
+ loadPlaces: (query: string, ctx: {
79
+ signal: AbortSignal;
80
+ }) => Promise<PatientSearchPlace[]>;
81
+ onObjectSelect?: (option: PatientSearchObject) => void;
82
+ onPlaceSelect?: (place: PatientSearchPlace) => void;
83
+ facets?: FacetGroup[];
84
+ /** Default radius in km when geolocation is granted. Snaps to the nearest preset. */
85
+ defaultRadiusKm?: number;
86
+ /** Reverse-geocode lat/lng → human label. Optional. */
87
+ reverseGeocode?: (lat: number, lng: number) => Promise<string>;
88
+ discoveryCards?: DiscoveryCard[];
89
+ /** Forwarded to the consumer's loaders if they want to constrain by country. */
90
+ countryCode?: 'it' | 'de' | string;
91
+ value: SearchValue;
92
+ onChange: (next: SearchValue) => void;
93
+ onSubmit: (value: SearchValue) => void | Promise<void>;
94
+ submitting?: boolean;
95
+ /** Custom CTA label override; defaults to `ui.patientSearch.submit.cta`. */
96
+ submitLabel?: string;
97
+ 'aria-label'?: string;
98
+ /** Agent-readiness instance id. */
99
+ id?: string;
100
+ }
101
+ export declare const PatientSearch: import("react").ForwardRefExoticComponent<PatientSearchProps & import("react").RefAttributes<PatientSearchHandle>>;
102
+ export {};
103
+ //# sourceMappingURL=patient-search.d.ts.map
@@ -1,4 +1,4 @@
1
- import { P as r, f as s, p as m, a as e, s as n, b as o, c as i } from "../../_chunks/payment-form-F7uh0Rqr.js";
1
+ import { P as r, f as s, p as m, a as e, s as n, b as o, c as i } from "../../_chunks/payment-form-Ds3rxvad.js";
2
2
  export {
3
3
  r as PaymentForm,
4
4
  s as formatPaymentAmount,
@@ -1,4 +1,4 @@
1
- import { P as p, p as a } from "../../_chunks/pdf-viewer-CuYaVR1I.js";
1
+ import { P as p, p as a } from "../../_chunks/pdf-viewer-CIuaocnq.js";
2
2
  export {
3
3
  p as PDFViewer,
4
4
  a as pdfViewerAgent