@alfadocs/ui-kit 0.25.2 → 0.30.1

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 (86) hide show
  1. package/dist/_chunks/booking-Bw9eOU4k.js +2292 -0
  2. package/dist/_chunks/{calendar-9eOXumpH.js → calendar-WWNx448i.js} +10 -9
  3. package/dist/_chunks/{contact-card-CeEfEAxh.js → contact-card-DYbp--s-.js} +2 -2
  4. package/dist/_chunks/{header-B8V_sNPy.js → header-CkMb1TZS.js} +23 -23
  5. package/dist/_chunks/heart-pulse-CvuyFKHB.js +21 -0
  6. package/dist/_chunks/{link-DmM5IevO.js → link-DrD_cRUg.js} +50 -45
  7. package/dist/_chunks/parseISO-Dk4xa7q6.js +120 -0
  8. package/dist/_chunks/patient-search-DuSoGG2t.js +1113 -0
  9. package/dist/_chunks/{patient-shell-Bq8CjRYF.js → patient-shell-CAXYzbRw.js} +2 -2
  10. package/dist/_chunks/public-footer.agent-DivkKdG4.js +537 -0
  11. package/dist/_chunks/reviews-panel-CFttsfuC.js +513 -0
  12. package/dist/_chunks/slot-grid-B2zprPcv.js +387 -0
  13. package/dist/_chunks/stethoscope-DT5qCW8Y.js +18 -0
  14. package/dist/agent-catalog.json +117 -22
  15. package/dist/components/booking/booking-types.d.ts +167 -0
  16. package/dist/components/booking/booking.agent.d.ts +1 -1
  17. package/dist/components/booking/booking.d.ts +4 -89
  18. package/dist/components/booking/cascade.d.ts +96 -0
  19. package/dist/components/booking/details-form.d.ts +39 -0
  20. package/dist/components/booking/index.d.ts +2 -1
  21. package/dist/components/booking/index.js +5 -3
  22. package/dist/components/calendar/index.js +1 -1
  23. package/dist/components/checkbox/checkbox.d.ts +6 -2
  24. package/dist/components/contact-card/index.js +1 -1
  25. package/dist/components/header/index.js +1 -1
  26. package/dist/components/index.d.ts +3 -0
  27. package/dist/components/link/index.js +1 -1
  28. package/dist/components/link/link.d.ts +7 -0
  29. package/dist/components/patient-search/index.d.ts +4 -0
  30. package/dist/components/patient-search/index.js +6 -0
  31. package/dist/components/patient-search/patient-search.agent.d.ts +4 -0
  32. package/dist/components/patient-search/patient-search.d.ts +112 -0
  33. package/dist/components/public-footer/index.d.ts +6 -0
  34. package/dist/components/public-footer/index.js +10 -0
  35. package/dist/components/public-footer/legal-urls.d.ts +18 -0
  36. package/dist/components/public-footer/public-footer.agent.d.ts +4 -0
  37. package/dist/components/public-footer/public-footer.d.ts +58 -0
  38. package/dist/components/public-footer/socials.d.ts +9 -0
  39. package/dist/components/reviews-panel/index.d.ts +4 -0
  40. package/dist/components/reviews-panel/index.js +6 -0
  41. package/dist/components/reviews-panel/reviews-panel.agent.d.ts +4 -0
  42. package/dist/components/reviews-panel/reviews-panel.d.ts +76 -0
  43. package/dist/components/slot-grid/index.js +1 -1
  44. package/dist/i18n/config.js +3994 -38
  45. package/dist/i18n/locales/ar.d.ts +221 -0
  46. package/dist/i18n/locales/de.d.ts +221 -0
  47. package/dist/i18n/locales/el.d.ts +221 -0
  48. package/dist/i18n/locales/es.d.ts +221 -0
  49. package/dist/i18n/locales/fr.d.ts +221 -0
  50. package/dist/i18n/locales/hi.d.ts +221 -0
  51. package/dist/i18n/locales/ja.d.ts +221 -0
  52. package/dist/i18n/locales/nl.d.ts +221 -0
  53. package/dist/i18n/locales/pl.d.ts +221 -0
  54. package/dist/i18n/locales/pt.d.ts +221 -0
  55. package/dist/i18n/locales/ro.d.ts +221 -0
  56. package/dist/i18n/locales/ru.d.ts +221 -0
  57. package/dist/i18n/locales/sq.d.ts +221 -0
  58. package/dist/i18n/locales/sv.d.ts +221 -0
  59. package/dist/i18n/locales/tr.d.ts +221 -0
  60. package/dist/i18n/locales/zh.d.ts +221 -0
  61. package/dist/i18n/resources.d.ts +442 -0
  62. package/dist/index.js +351 -336
  63. package/dist/locales/ar.json +222 -1
  64. package/dist/locales/de.json +222 -1
  65. package/dist/locales/el.json +222 -1
  66. package/dist/locales/en.json +222 -1
  67. package/dist/locales/es.json +222 -1
  68. package/dist/locales/fr.json +222 -1
  69. package/dist/locales/hi.json +222 -1
  70. package/dist/locales/it.json +222 -1
  71. package/dist/locales/ja.json +222 -1
  72. package/dist/locales/nl.json +222 -1
  73. package/dist/locales/pl.json +222 -1
  74. package/dist/locales/pt.json +222 -1
  75. package/dist/locales/ro.json +222 -1
  76. package/dist/locales/ru.json +222 -1
  77. package/dist/locales/sq.json +222 -1
  78. package/dist/locales/sv.json +222 -1
  79. package/dist/locales/tr.json +222 -1
  80. package/dist/locales/zh.json +222 -1
  81. package/dist/patterns/patient-shell/index.js +1 -1
  82. package/dist/tokens.css +1 -1
  83. package/package.json +17 -1
  84. package/dist/_chunks/booking-CXngC-1u.js +0 -1743
  85. package/dist/_chunks/slot-grid-DoodeQGZ.js +0 -502
  86. package/dist/_chunks/stethoscope-B8kpbtjh.js +0 -35
@@ -0,0 +1,387 @@
1
+ import { jsx as t, jsxs as x } from "react/jsx-runtime";
2
+ import { forwardRef as os, useId as ls, useState as cs, useCallback as L } from "react";
3
+ import { c as f } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as ms } from "react-i18next";
5
+ import { B as $ } from "./button-DD_0Xdmr.js";
6
+ import { I as A } from "./icon-button-BRHSSFmZ.js";
7
+ import { E as us } from "./empty-state-BLy7tigq.js";
8
+ import { S as B } from "./skeleton-CZbwyJAA.js";
9
+ import { i as fs } from "./isSameDay-DHG8Xade.js";
10
+ import { p as gs } from "./parseISO-Dk4xa7q6.js";
11
+ const ps = f(
12
+ [
13
+ "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]",
14
+ "ds:text-[var(--foreground)]",
15
+ "ds:w-full"
16
+ ].join(" "),
17
+ {
18
+ variants: {
19
+ size: {
20
+ sm: "ds:text-[length:var(--font-size-sm)]",
21
+ md: "ds:text-[length:var(--font-size-base)]",
22
+ lg: "ds:text-[length:var(--font-size-lg)]"
23
+ }
24
+ },
25
+ defaultVariants: { size: "md" }
26
+ }
27
+ ), vs = f(
28
+ "ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:w-full"
29
+ ), hs = 12, bs = f(
30
+ "ds:grid ds:gap-[var(--spacing-sm)] ds:w-full ds:auto-rows-min ds:items-start",
31
+ {
32
+ variants: {
33
+ cols: {
34
+ 1: "ds:grid-cols-1",
35
+ 2: "ds:grid-cols-2",
36
+ 3: "ds:grid-cols-3",
37
+ 4: "ds:grid-cols-4",
38
+ 5: "ds:grid-cols-5",
39
+ 6: "ds:grid-cols-6",
40
+ 7: "ds:grid-cols-7",
41
+ 8: "ds:grid-cols-8",
42
+ 9: "ds:grid-cols-9",
43
+ 10: "ds:grid-cols-10",
44
+ 11: "ds:grid-cols-11",
45
+ 12: "ds:grid-cols-12"
46
+ }
47
+ },
48
+ defaultVariants: { cols: 1 }
49
+ }
50
+ );
51
+ function xs(s) {
52
+ return Math.max(1, Math.min(s, hs));
53
+ }
54
+ const R = f(
55
+ [
56
+ "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]",
57
+ "ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]",
58
+ "ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]",
59
+ "ds:rounded-[var(--radius-md)]",
60
+ "ds:bg-[var(--card)]",
61
+ "ds:min-w-0"
62
+ ].join(" ")
63
+ ), ys = f(
64
+ [
65
+ "ds:font-[var(--font-weight-semibold)]",
66
+ "ds:text-[var(--foreground)]",
67
+ "ds:text-start",
68
+ "ds:truncate"
69
+ ].join(" "),
70
+ {
71
+ variants: {
72
+ size: {
73
+ sm: "ds:text-[length:var(--font-size-xs)]",
74
+ md: "ds:text-[length:var(--font-size-sm)]",
75
+ lg: "ds:text-[length:var(--font-size-base)]"
76
+ }
77
+ },
78
+ defaultVariants: { size: "md" }
79
+ }
80
+ ), T = f(
81
+ "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full ds:m-0 ds:p-0 ds:list-none"
82
+ ), ws = f(
83
+ [
84
+ "ds:inline-flex ds:items-center ds:justify-center",
85
+ "ds:w-full",
86
+ "ds:rounded-[var(--radius-sm)]",
87
+ "ds:font-[var(--font-weight-medium)]",
88
+ "ds:bg-[var(--secondary)]",
89
+ "ds:shadow-[var(--shadow-sm)]",
90
+ "ds:text-[var(--foreground)]",
91
+ "ds:transition-[background-color,color,box-shadow]",
92
+ "ds:duration-[var(--animation-duration)]",
93
+ "ds:motion-reduce:transition-none",
94
+ "ds:focus-visible:outline-[var(--focus-ring-width)]",
95
+ "ds:focus-visible:outline-solid",
96
+ "ds:focus-visible:outline-[var(--ring)]",
97
+ "ds:focus-visible:outline-offset-[var(--focus-ring-offset)]",
98
+ "ds:min-h-[var(--min-target-size)]",
99
+ "ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:shadow-none",
100
+ "ds:aria-disabled:opacity-50 ds:aria-disabled:cursor-not-allowed ds:aria-disabled:shadow-none",
101
+ "ds:hover:enabled:shadow-[var(--shadow-md)]",
102
+ "ds:aria-pressed:bg-[var(--primary)] ds:aria-pressed:text-[var(--primary-foreground)]"
103
+ ].join(" "),
104
+ {
105
+ variants: {
106
+ size: {
107
+ sm: "ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:text-[length:var(--font-size-xs)] ds:h-8",
108
+ md: "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-sm)] ds:h-10",
109
+ lg: "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-base)] ds:h-12"
110
+ }
111
+ },
112
+ defaultVariants: { size: "md" }
113
+ }
114
+ );
115
+ function u(s) {
116
+ return s instanceof Date ? s : gs(s);
117
+ }
118
+ function Rs(s, r) {
119
+ return fs(u(s), u(r));
120
+ }
121
+ function Ts(s) {
122
+ for (const r of s) {
123
+ const e = r.slots.find((n) => n.available !== !1);
124
+ if (e) return { day: r, slot: e };
125
+ }
126
+ }
127
+ function F(s, r, e) {
128
+ try {
129
+ return new Intl.DateTimeFormat(r, {
130
+ weekday: "short",
131
+ month: "short",
132
+ day: "numeric",
133
+ timeZone: e
134
+ }).format(s);
135
+ } catch {
136
+ return new Intl.DateTimeFormat("en", {
137
+ weekday: "short",
138
+ month: "short",
139
+ day: "numeric"
140
+ }).format(s);
141
+ }
142
+ }
143
+ function O(s, r, e) {
144
+ if (s.label !== void 0) return s.label;
145
+ const n = u(s.start);
146
+ try {
147
+ const d = new Intl.DateTimeFormat(r, {
148
+ hour: "numeric",
149
+ minute: "2-digit",
150
+ timeZone: e
151
+ });
152
+ if (s.end) {
153
+ const g = u(s.end);
154
+ if (typeof d.formatRange == "function")
155
+ try {
156
+ return d.formatRange(n, g);
157
+ } catch {
158
+ }
159
+ return `${d.format(n)} – ${d.format(g)}`;
160
+ }
161
+ return d.format(n);
162
+ } catch {
163
+ return n.toISOString();
164
+ }
165
+ }
166
+ function ks(s, r, e, n, d) {
167
+ if (s.ariaLabel !== void 0) return s.ariaLabel;
168
+ const g = O(s, e, n), p = r.label !== void 0 ? r.label : F(u(r.date), e, n);
169
+ return d({ time: g, day: p });
170
+ }
171
+ function Cs() {
172
+ return /* @__PURE__ */ t(
173
+ "svg",
174
+ {
175
+ "aria-hidden": "true",
176
+ viewBox: "0 0 24 24",
177
+ fill: "none",
178
+ stroke: "currentColor",
179
+ strokeWidth: "2",
180
+ strokeLinecap: "round",
181
+ strokeLinejoin: "round",
182
+ className: "ds:size-4",
183
+ children: /* @__PURE__ */ t("path", { d: "M15 18l-6-6 6-6" })
184
+ }
185
+ );
186
+ }
187
+ function Ls() {
188
+ return /* @__PURE__ */ t(
189
+ "svg",
190
+ {
191
+ "aria-hidden": "true",
192
+ viewBox: "0 0 24 24",
193
+ fill: "none",
194
+ stroke: "currentColor",
195
+ strokeWidth: "2",
196
+ strokeLinecap: "round",
197
+ strokeLinejoin: "round",
198
+ className: "ds:size-4",
199
+ children: /* @__PURE__ */ t("path", { d: "M9 6l6 6-6 6" })
200
+ }
201
+ );
202
+ }
203
+ const Ds = os(
204
+ ({
205
+ days: s,
206
+ state: r = "default",
207
+ size: e = "md",
208
+ selectedSlotId: n,
209
+ maxInitialSlotsPerDay: d = 6,
210
+ locale: g,
211
+ timeZone: p,
212
+ hasPrevious: K = !1,
213
+ hasNext: M = !1,
214
+ showNextAvailable: _ = !1,
215
+ ariaLabel: H,
216
+ onSlotSelect: v,
217
+ onPreviousDays: W,
218
+ onNextDays: X,
219
+ onShowMore: h,
220
+ onJumpToNextAvailable: q,
221
+ className: J,
222
+ ...Q
223
+ }, U) => {
224
+ const { t: o, i18n: Y } = ms(), y = g ?? Y.language ?? "en", P = ls(), [Z, ss] = cs({}), D = r === "loading", z = r === "disabled", m = D || z, as = r === "empty" || s.length === 0 || s.every((a) => a.slots.length === 0), ts = H ?? o("slotGrid.ariaLabel"), w = L(
225
+ (a, i) => {
226
+ m || a.available !== !1 && (v == null || v(a, i));
227
+ },
228
+ [m, v]
229
+ ), es = L(
230
+ (a, i) => {
231
+ ss((l) => ({ ...l, [i]: !0 })), h == null || h(a);
232
+ },
233
+ [h]
234
+ ), rs = L(
235
+ (a, i, l) => {
236
+ (a.key === "Enter" || a.key === " ") && (a.preventDefault(), w(i, l));
237
+ },
238
+ [w]
239
+ ), I = xs(s.length || 1), N = bs({ cols: I });
240
+ let b;
241
+ return D ? b = /* @__PURE__ */ t(
242
+ "div",
243
+ {
244
+ className: N,
245
+ "data-state": "loading",
246
+ role: "status",
247
+ "aria-live": "polite",
248
+ "aria-label": o("common.loading"),
249
+ children: Array.from({ length: I }, (a, i) => /* @__PURE__ */ x("div", { className: R(), children: [
250
+ /* @__PURE__ */ t(B, { variant: "text", size: e, width: "60%" }),
251
+ /* @__PURE__ */ t("div", { className: T(), children: Array.from(
252
+ { length: Math.min(d, 4) },
253
+ (l, k) => /* @__PURE__ */ t(
254
+ B,
255
+ {
256
+ variant: "rounded",
257
+ size: e,
258
+ height: "40px"
259
+ },
260
+ `loading-slot-${i}-${k}`
261
+ )
262
+ ) })
263
+ ] }, `loading-col-${i}`))
264
+ }
265
+ ) : as ? b = /* @__PURE__ */ t("div", { "data-state": "empty", children: /* @__PURE__ */ t(us, { variant: "no-results", title: o("slotGrid.noSlots") }) }) : b = /* @__PURE__ */ t(
266
+ "div",
267
+ {
268
+ className: N,
269
+ "data-state": z ? "disabled" : "default",
270
+ children: s.map((a, i) => {
271
+ const l = `${u(a.date).toISOString()}-${i}`, k = a.label ?? F(u(a.date), y, p), S = `${P}-day-${i}-header`, G = Z[l] ?? !1 ? a.slots : a.slots.slice(0, d), V = a.slots.length - G.length, j = a.slots.length === 0;
272
+ return (
273
+ // Use a plain <div role="group"> rather than <section> — a
274
+ // <section> with aria-labelledby is a landmark, and nesting many
275
+ // landmarks inside the outer slot-grid landmark fails axe's
276
+ // landmark-unique rule.
277
+ /* @__PURE__ */ x(
278
+ "div",
279
+ {
280
+ role: "group",
281
+ className: R(),
282
+ "aria-labelledby": S,
283
+ "data-empty": j || void 0,
284
+ children: [
285
+ /* @__PURE__ */ t("h3", { id: S, className: ys({ size: e }), children: k }),
286
+ j ? /* @__PURE__ */ t("p", { className: "type-body-sm ds:text-[var(--muted-foreground)] ds:m-0", children: o("slotGrid.noSlots") }) : null,
287
+ /* @__PURE__ */ t("ul", { className: T(), children: G.map((c) => {
288
+ const ns = ks(
289
+ c,
290
+ a,
291
+ y,
292
+ p,
293
+ ({ time: C, day: ds }) => o("slotGrid.slotLabel", { time: C, day: ds })
294
+ ), is = n === c.id, E = c.available === !1 || m;
295
+ return /* @__PURE__ */ t("li", { children: /* @__PURE__ */ t(
296
+ "button",
297
+ {
298
+ type: "button",
299
+ className: ws({ size: e }),
300
+ "aria-label": ns,
301
+ "aria-pressed": is,
302
+ disabled: E,
303
+ "aria-disabled": E || void 0,
304
+ "data-slot-id": c.id,
305
+ onClick: () => w(c, a),
306
+ onKeyDown: (C) => rs(C, c, a),
307
+ children: O(c, y, p)
308
+ }
309
+ ) }, c.id);
310
+ }) }),
311
+ V > 0 ? /* @__PURE__ */ t(
312
+ $,
313
+ {
314
+ intent: "ghost",
315
+ size: e === "lg" ? "md" : "sm",
316
+ onClick: () => es(a, l),
317
+ disabled: m,
318
+ children: o("slotGrid.showMore", { count: V })
319
+ }
320
+ ) : null
321
+ ]
322
+ },
323
+ l
324
+ )
325
+ );
326
+ })
327
+ }
328
+ ), /* @__PURE__ */ x(
329
+ "div",
330
+ {
331
+ ref: U,
332
+ role: "region",
333
+ "aria-label": ts,
334
+ className: ps({ size: e, className: J }),
335
+ "data-component": "slot-grid",
336
+ "data-state": r,
337
+ ...Q,
338
+ children: [
339
+ /* @__PURE__ */ x("div", { className: vs(), children: [
340
+ /* @__PURE__ */ t(
341
+ A,
342
+ {
343
+ icon: /* @__PURE__ */ t(Cs, {}),
344
+ "aria-label": o("slotGrid.previousDays"),
345
+ size: e === "lg" ? "md" : "sm",
346
+ intent: "ghost",
347
+ flipIconInRtl: !0,
348
+ disabled: !K || m,
349
+ onClick: W
350
+ }
351
+ ),
352
+ _ ? /* @__PURE__ */ t(
353
+ $,
354
+ {
355
+ intent: "secondary",
356
+ size: e === "lg" ? "md" : "sm",
357
+ disabled: m,
358
+ onClick: q,
359
+ children: o("slotGrid.nextAvailable")
360
+ }
361
+ ) : /* @__PURE__ */ t("span", { "aria-hidden": "true" }),
362
+ /* @__PURE__ */ t(
363
+ A,
364
+ {
365
+ icon: /* @__PURE__ */ t(Ls, {}),
366
+ "aria-label": o("slotGrid.nextDays"),
367
+ size: e === "lg" ? "md" : "sm",
368
+ intent: "ghost",
369
+ flipIconInRtl: !0,
370
+ disabled: !M || m,
371
+ onClick: X
372
+ }
373
+ )
374
+ ] }),
375
+ b
376
+ ]
377
+ }
378
+ );
379
+ }
380
+ );
381
+ Ds.displayName = "SlotGrid";
382
+ export {
383
+ Ds as S,
384
+ Ts as f,
385
+ Rs as i
386
+ };
387
+ //# sourceMappingURL=slot-grid-B2zprPcv.js.map
@@ -0,0 +1,18 @@
1
+ import { c as e } from "./createLucideIcon-CrFbzy84.js";
2
+ /**
3
+ * @license lucide-react v1.8.0 - ISC
4
+ *
5
+ * This source code is licensed under the ISC license.
6
+ * See the LICENSE file in the root directory of this source tree.
7
+ */
8
+ const t = [
9
+ ["path", { d: "M11 2v2", key: "1539x4" }],
10
+ ["path", { d: "M5 2v2", key: "1yf1q8" }],
11
+ ["path", { d: "M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1", key: "rb5t3r" }],
12
+ ["path", { d: "M8 15a6 6 0 0 0 12 0v-3", key: "x18d4x" }],
13
+ ["circle", { cx: "20", cy: "10", r: "2", key: "ts1r5v" }]
14
+ ], o = e("stethoscope", t);
15
+ export {
16
+ o as S
17
+ };
18
+ //# sourceMappingURL=stethoscope-DT5qCW8Y.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "0.25.2",
3
+ "packageVersion": "0.30.1",
4
4
  "components": [
5
5
  {
6
6
  "kind": "component",
@@ -409,16 +409,6 @@
409
409
  "view_change"
410
410
  ],
411
411
  "state": [
412
- {
413
- "name": "currentStep",
414
- "type": "number",
415
- "description": "Zero-indexed active step within the active variant. Variants with no step machine report 0."
416
- },
417
- {
418
- "name": "totalSteps",
419
- "type": "number",
420
- "description": "Total number of steps in the active variant. Single-screen variants report 1."
421
- },
422
412
  {
423
413
  "name": "variant",
424
414
  "type": "string",
@@ -427,20 +417,15 @@
427
417
  ],
428
418
  "actions": [
429
419
  {
430
- "name": "goto_step",
431
- "safety": "read",
432
- "argsType": "{ step: number }",
433
- "description": "Jump to the given step within the active variant. Steps beyond first-incomplete are gated internally."
434
- },
435
- {
436
- "name": "next",
437
- "safety": "read",
438
- "description": "Advance to the next step when the current step has a valid value."
420
+ "name": "reset",
421
+ "safety": "write",
422
+ "description": "Clear the booking value back to an empty state. Use to abandon an in-progress flow."
439
423
  },
440
424
  {
441
- "name": "previous",
425
+ "name": "goto_step",
442
426
  "safety": "read",
443
- "description": "Return to the previous step."
427
+ "argsType": "{ step: 1 | 2 | 3 | 4 | 5 | 6 | 7 }",
428
+ "description": "Jump to the given step. Implementations may clamp to the first incomplete step if the requested one is not reachable yet."
444
429
  }
445
430
  ],
446
431
  "domHooks": {
@@ -2449,6 +2434,45 @@
2449
2434
  }
2450
2435
  }
2451
2436
  },
2437
+ {
2438
+ "kind": "component",
2439
+ "id": "patient-search",
2440
+ "capabilities": [
2441
+ "navigate",
2442
+ "view_change"
2443
+ ],
2444
+ "state": [
2445
+ {
2446
+ "name": "variant",
2447
+ "type": "string",
2448
+ "description": "Active variant — one of `who-where`, `who-where-when`, `faceted`, `discovery`."
2449
+ }
2450
+ ],
2451
+ "actions": [
2452
+ {
2453
+ "name": "reset",
2454
+ "safety": "write",
2455
+ "description": "Clear the current selection (WHO, WHERE, WHEN, facets, geo) via the consumer-owned onChange."
2456
+ },
2457
+ {
2458
+ "name": "focus_primary",
2459
+ "safety": "read",
2460
+ "description": "Move keyboard focus to the most-relevant field for the current variant."
2461
+ }
2462
+ ],
2463
+ "domHooks": {
2464
+ "root": {
2465
+ "attr": "data-component",
2466
+ "value": "patient-search",
2467
+ "description": "Marks the PatientSearch root region."
2468
+ },
2469
+ "instanceId": {
2470
+ "attr": "data-component-id",
2471
+ "sourceProp": "id",
2472
+ "description": "Sourced from the id prop."
2473
+ }
2474
+ }
2475
+ },
2452
2476
  {
2453
2477
  "kind": "component",
2454
2478
  "id": "payment-form",
@@ -2677,6 +2701,38 @@
2677
2701
  }
2678
2702
  }
2679
2703
  },
2704
+ {
2705
+ "kind": "component",
2706
+ "id": "public-footer",
2707
+ "capabilities": [
2708
+ "navigate"
2709
+ ],
2710
+ "state": [
2711
+ {
2712
+ "name": "variant",
2713
+ "type": "string",
2714
+ "description": "Active variant — one of `minimal`, `compact`, `full`."
2715
+ },
2716
+ {
2717
+ "name": "legalUrls",
2718
+ "type": "object",
2719
+ "description": "Resolved legal URLs for the active locale + marketingBaseUrl + overrides: `{ privacy, terms, contacts }`."
2720
+ }
2721
+ ],
2722
+ "actions": [],
2723
+ "domHooks": {
2724
+ "root": {
2725
+ "attr": "data-component",
2726
+ "value": "public-footer",
2727
+ "description": "Marks the PublicFooter root region. The root also carries `data-variant=\"minimal|compact|full\"` for CSS + agent selectors."
2728
+ },
2729
+ "instanceId": {
2730
+ "attr": "id",
2731
+ "sourceProp": "id",
2732
+ "description": "Sourced from the `id` prop when provided."
2733
+ }
2734
+ }
2735
+ },
2680
2736
  {
2681
2737
  "kind": "component",
2682
2738
  "id": "public-header",
@@ -2856,6 +2912,45 @@
2856
2912
  }
2857
2913
  }
2858
2914
  },
2915
+ {
2916
+ "kind": "component",
2917
+ "id": "reviews-panel",
2918
+ "capabilities": [
2919
+ "filter"
2920
+ ],
2921
+ "state": [
2922
+ {
2923
+ "name": "filter",
2924
+ "type": "string",
2925
+ "description": "Active star-bucket filter — `\"all\"` or an integer 1..5. Reads the controlled `filter` prop."
2926
+ },
2927
+ {
2928
+ "name": "visibleCount",
2929
+ "type": "number",
2930
+ "description": "Number of reviews currently rendered after the filter is applied."
2931
+ }
2932
+ ],
2933
+ "actions": [
2934
+ {
2935
+ "name": "set_filter",
2936
+ "safety": "read",
2937
+ "argsType": "{ filter: \"all\" | 1 | 2 | 3 | 4 | 5 }",
2938
+ "description": "Narrow the visible review list to a star bucket, or `\"all\"` to clear the filter."
2939
+ }
2940
+ ],
2941
+ "domHooks": {
2942
+ "root": {
2943
+ "attr": "data-component",
2944
+ "value": "reviews-panel",
2945
+ "description": "Marks the ReviewsPanel root region."
2946
+ },
2947
+ "instanceId": {
2948
+ "attr": "data-component-id",
2949
+ "sourceProp": "id",
2950
+ "description": "Sourced from the id prop."
2951
+ }
2952
+ }
2953
+ },
2859
2954
  {
2860
2955
  "kind": "component",
2861
2956
  "id": "rich-text-editor",