@alfadocs/ui-kit 0.33.8 → 0.33.10

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.
@@ -0,0 +1,502 @@
1
+ import { jsx as i, jsxs as C } from "react/jsx-runtime";
2
+ import { forwardRef as pe, useId as he, useState as ve, useCallback as S } from "react";
3
+ import { c as b } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as be } from "react-i18next";
5
+ import { B as Y } from "./button-DD_0Xdmr.js";
6
+ import { I as A } from "./icon-button-CKEOrN37.js";
7
+ import { E as xe } from "./empty-state-BLy7tigq.js";
8
+ import { S as B } from "./skeleton-CZbwyJAA.js";
9
+ import { t as W, c as De, m as K, a as Z, i as ye } from "./isSameDay-DUEiAT0G.js";
10
+ function Ne(t, e) {
11
+ const s = () => De(e == null ? void 0 : e.in, NaN), n = Te(t);
12
+ let d;
13
+ if (n.date) {
14
+ const o = Ie(n.date, 2);
15
+ d = ze(o.restDateString, o.year);
16
+ }
17
+ if (!d || isNaN(+d)) return s();
18
+ const l = +d;
19
+ let u = 0, f;
20
+ if (n.time && (u = Le(n.time), isNaN(u)))
21
+ return s();
22
+ if (n.timezone) {
23
+ if (f = Se(n.timezone), isNaN(f)) return s();
24
+ } else {
25
+ const o = new Date(l + u), x = W(0, e == null ? void 0 : e.in);
26
+ return x.setFullYear(
27
+ o.getUTCFullYear(),
28
+ o.getUTCMonth(),
29
+ o.getUTCDate()
30
+ ), x.setHours(
31
+ o.getUTCHours(),
32
+ o.getUTCMinutes(),
33
+ o.getUTCSeconds(),
34
+ o.getUTCMilliseconds()
35
+ ), x;
36
+ }
37
+ return W(l + u + f, e == null ? void 0 : e.in);
38
+ }
39
+ const k = {
40
+ dateTimeDelimiter: /[T ]/,
41
+ timeZoneDelimiter: /[Z ]/i,
42
+ timezone: /([Z+-].*)$/
43
+ }, we = /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/, Ce = /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/, ke = /^([+-])(\d{2})(?::?(\d{2}))?$/;
44
+ function Te(t) {
45
+ const e = {}, s = t.split(k.dateTimeDelimiter);
46
+ let a;
47
+ if (s.length > 2)
48
+ return e;
49
+ if (/:/.test(s[0]) ? a = s[0] : (e.date = s[0], a = s[1], k.timeZoneDelimiter.test(e.date) && (e.date = t.split(k.timeZoneDelimiter)[0], a = t.substr(
50
+ e.date.length,
51
+ t.length
52
+ ))), a) {
53
+ const n = k.timezone.exec(a);
54
+ n ? (e.time = a.replace(n[1], ""), e.timezone = n[1]) : e.time = a;
55
+ }
56
+ return e;
57
+ }
58
+ function Ie(t, e) {
59
+ const s = new RegExp(
60
+ "^(?:(\\d{4}|[+-]\\d{" + (4 + e) + "})|(\\d{2}|[+-]\\d{" + (2 + e) + "})$)"
61
+ ), a = t.match(s);
62
+ if (!a) return { year: NaN, restDateString: "" };
63
+ const n = a[1] ? parseInt(a[1]) : null, d = a[2] ? parseInt(a[2]) : null;
64
+ return {
65
+ year: d === null ? n : d * 100,
66
+ restDateString: t.slice((a[1] || a[2]).length)
67
+ };
68
+ }
69
+ function ze(t, e) {
70
+ if (e === null) return /* @__PURE__ */ new Date(NaN);
71
+ const s = t.match(we);
72
+ if (!s) return /* @__PURE__ */ new Date(NaN);
73
+ const a = !!s[4], n = D(s[1]), d = D(s[2]) - 1, l = D(s[3]), u = D(s[4]), f = D(s[5]) - 1;
74
+ if (a)
75
+ return je(e, u, f) ? $e(e, u, f) : /* @__PURE__ */ new Date(NaN);
76
+ {
77
+ const o = /* @__PURE__ */ new Date(0);
78
+ return !Ge(e, d, l) || !Ve(e, n) ? /* @__PURE__ */ new Date(NaN) : (o.setUTCFullYear(e, d, Math.max(n, l)), o);
79
+ }
80
+ }
81
+ function D(t) {
82
+ return t ? parseInt(t) : 1;
83
+ }
84
+ function Le(t) {
85
+ const e = t.match(Ce);
86
+ if (!e) return NaN;
87
+ const s = $(e[1]), a = $(e[2]), n = $(e[3]);
88
+ return Ee(s, a, n) ? s * K + a * Z + n * 1e3 : NaN;
89
+ }
90
+ function $(t) {
91
+ return t && parseFloat(t.replace(",", ".")) || 0;
92
+ }
93
+ function Se(t) {
94
+ if (t === "Z") return 0;
95
+ const e = t.match(ke);
96
+ if (!e) return 0;
97
+ const s = e[1] === "+" ? -1 : 1, a = parseInt(e[2]), n = e[3] && parseInt(e[3]) || 0;
98
+ return Fe(a, n) ? s * (a * K + n * Z) : NaN;
99
+ }
100
+ function $e(t, e, s) {
101
+ const a = /* @__PURE__ */ new Date(0);
102
+ a.setUTCFullYear(t, 0, 4);
103
+ const n = a.getUTCDay() || 7, d = (e - 1) * 7 + s + 1 - n;
104
+ return a.setUTCDate(a.getUTCDate() + d), a;
105
+ }
106
+ const Ue = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
107
+ function J(t) {
108
+ return t % 400 === 0 || t % 4 === 0 && t % 100 !== 0;
109
+ }
110
+ function Ge(t, e, s) {
111
+ return e >= 0 && e <= 11 && s >= 1 && s <= (Ue[e] || (J(t) ? 29 : 28));
112
+ }
113
+ function Ve(t, e) {
114
+ return e >= 1 && e <= (J(t) ? 366 : 365);
115
+ }
116
+ function je(t, e, s) {
117
+ return e >= 1 && e <= 53 && s >= 0 && s <= 6;
118
+ }
119
+ function Ee(t, e, s) {
120
+ return t === 24 ? e === 0 && s === 0 : s >= 0 && s < 60 && e >= 0 && e < 60 && t >= 0 && t < 25;
121
+ }
122
+ function Fe(t, e) {
123
+ return e >= 0 && e <= 59;
124
+ }
125
+ const Re = b(
126
+ [
127
+ "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]",
128
+ "ds:text-[var(--foreground)]",
129
+ "ds:w-full"
130
+ ].join(" "),
131
+ {
132
+ variants: {
133
+ size: {
134
+ sm: "ds:text-[length:var(--font-size-sm)]",
135
+ md: "ds:text-[length:var(--font-size-base)]",
136
+ lg: "ds:text-[length:var(--font-size-lg)]"
137
+ }
138
+ },
139
+ defaultVariants: { size: "md" }
140
+ }
141
+ ), Me = b(
142
+ "ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:w-full"
143
+ ), Oe = 12, Ye = b(
144
+ "ds:grid ds:gap-[var(--spacing-sm)] ds:w-full ds:auto-rows-min ds:items-start",
145
+ {
146
+ variants: {
147
+ cols: {
148
+ 1: "ds:grid-cols-1",
149
+ 2: "ds:grid-cols-2",
150
+ 3: "ds:grid-cols-3",
151
+ 4: "ds:grid-cols-4",
152
+ 5: "ds:grid-cols-5",
153
+ 6: "ds:grid-cols-6",
154
+ 7: "ds:grid-cols-7",
155
+ 8: "ds:grid-cols-8",
156
+ 9: "ds:grid-cols-9",
157
+ 10: "ds:grid-cols-10",
158
+ 11: "ds:grid-cols-11",
159
+ 12: "ds:grid-cols-12"
160
+ }
161
+ },
162
+ defaultVariants: { cols: 1 }
163
+ }
164
+ );
165
+ function Ae(t) {
166
+ return Math.max(1, Math.min(t, Oe));
167
+ }
168
+ const H = b(
169
+ [
170
+ "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]",
171
+ "ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]",
172
+ "ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]",
173
+ "ds:rounded-[var(--radius-md)]",
174
+ "ds:bg-[var(--card)]",
175
+ "ds:min-w-0"
176
+ ].join(" ")
177
+ ), Be = b(
178
+ [
179
+ "ds:font-[var(--font-weight-semibold)]",
180
+ "ds:text-[var(--foreground)]",
181
+ "ds:text-start",
182
+ "ds:truncate"
183
+ ].join(" "),
184
+ {
185
+ variants: {
186
+ size: {
187
+ sm: "ds:text-[length:var(--font-size-xs)]",
188
+ md: "ds:text-[length:var(--font-size-sm)]",
189
+ lg: "ds:text-[length:var(--font-size-base)]"
190
+ }
191
+ },
192
+ defaultVariants: { size: "md" }
193
+ }
194
+ ), _ = b(
195
+ "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full ds:m-0 ds:p-0 ds:list-none"
196
+ ), We = b(
197
+ [
198
+ "ds:inline-flex ds:items-center ds:justify-center",
199
+ "ds:w-full",
200
+ "ds:rounded-[var(--radius-sm)]",
201
+ "ds:font-[var(--font-weight-medium)]",
202
+ "ds:bg-[var(--secondary)]",
203
+ "ds:shadow-[var(--shadow-sm)]",
204
+ "ds:text-[var(--foreground)]",
205
+ "ds:transition-[background-color,color,box-shadow]",
206
+ "ds:duration-[var(--animation-duration)]",
207
+ "ds:motion-reduce:transition-none",
208
+ "ds:focus-visible:outline-[var(--focus-ring-width)]",
209
+ "ds:focus-visible:outline-solid",
210
+ "ds:focus-visible:outline-[var(--ring)]",
211
+ "ds:focus-visible:outline-offset-[var(--focus-ring-offset)]",
212
+ "ds:min-h-[var(--min-target-size)]",
213
+ "ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:shadow-none",
214
+ "ds:aria-disabled:opacity-50 ds:aria-disabled:cursor-not-allowed ds:aria-disabled:shadow-none",
215
+ "ds:hover:enabled:shadow-[var(--shadow-md)]",
216
+ "ds:aria-pressed:bg-[var(--primary)] ds:aria-pressed:text-[var(--primary-foreground)]"
217
+ ].join(" "),
218
+ {
219
+ variants: {
220
+ size: {
221
+ sm: "ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:text-[length:var(--font-size-xs)] ds:h-8",
222
+ md: "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-sm)] ds:h-10",
223
+ lg: "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-base)] ds:h-12"
224
+ }
225
+ },
226
+ defaultVariants: { size: "md" }
227
+ }
228
+ );
229
+ function v(t) {
230
+ return t instanceof Date ? t : Ne(t);
231
+ }
232
+ function rt(t, e) {
233
+ return ye(v(t), v(e));
234
+ }
235
+ function it(t) {
236
+ for (const e of t) {
237
+ const s = e.slots.find((a) => a.available !== !1);
238
+ if (s) return { day: e, slot: s };
239
+ }
240
+ }
241
+ function X(t, e, s) {
242
+ try {
243
+ return new Intl.DateTimeFormat(e, {
244
+ weekday: "short",
245
+ month: "short",
246
+ day: "numeric",
247
+ timeZone: s
248
+ }).format(t);
249
+ } catch {
250
+ return new Intl.DateTimeFormat("en", {
251
+ weekday: "short",
252
+ month: "short",
253
+ day: "numeric"
254
+ }).format(t);
255
+ }
256
+ }
257
+ function q(t, e, s) {
258
+ if (t.label !== void 0) return t.label;
259
+ const a = v(t.start);
260
+ try {
261
+ const n = new Intl.DateTimeFormat(e, {
262
+ hour: "numeric",
263
+ minute: "2-digit",
264
+ timeZone: s
265
+ });
266
+ if (t.end) {
267
+ const d = v(t.end);
268
+ if (typeof n.formatRange == "function")
269
+ try {
270
+ return n.formatRange(a, d);
271
+ } catch {
272
+ }
273
+ return `${n.format(a)} – ${n.format(d)}`;
274
+ }
275
+ return n.format(a);
276
+ } catch {
277
+ return a.toISOString();
278
+ }
279
+ }
280
+ function He(t, e, s, a, n) {
281
+ if (t.ariaLabel !== void 0) return t.ariaLabel;
282
+ const d = q(t, s, a), l = e.label !== void 0 ? e.label : X(v(e.date), s, a);
283
+ return n({ time: d, day: l });
284
+ }
285
+ function _e() {
286
+ return /* @__PURE__ */ i(
287
+ "svg",
288
+ {
289
+ "aria-hidden": "true",
290
+ viewBox: "0 0 24 24",
291
+ fill: "none",
292
+ stroke: "currentColor",
293
+ strokeWidth: "2",
294
+ strokeLinecap: "round",
295
+ strokeLinejoin: "round",
296
+ className: "ds:size-4",
297
+ children: /* @__PURE__ */ i("path", { d: "M15 18l-6-6 6-6" })
298
+ }
299
+ );
300
+ }
301
+ function Ke() {
302
+ return /* @__PURE__ */ i(
303
+ "svg",
304
+ {
305
+ "aria-hidden": "true",
306
+ viewBox: "0 0 24 24",
307
+ fill: "none",
308
+ stroke: "currentColor",
309
+ strokeWidth: "2",
310
+ strokeLinecap: "round",
311
+ strokeLinejoin: "round",
312
+ className: "ds:size-4",
313
+ children: /* @__PURE__ */ i("path", { d: "M9 6l6 6-6 6" })
314
+ }
315
+ );
316
+ }
317
+ const Ze = pe(
318
+ ({
319
+ days: t,
320
+ state: e = "default",
321
+ size: s = "md",
322
+ selectedSlotId: a,
323
+ maxInitialSlotsPerDay: n = 6,
324
+ locale: d,
325
+ timeZone: l,
326
+ hasPrevious: u = !1,
327
+ hasNext: f = !1,
328
+ showNextAvailable: o = !1,
329
+ ariaLabel: x,
330
+ onSlotSelect: y,
331
+ onPreviousDays: Q,
332
+ onNextDays: P,
333
+ onShowMore: N,
334
+ onJumpToNextAvailable: ee,
335
+ className: te,
336
+ ...se
337
+ }, ae) => {
338
+ const { t: m, i18n: ne } = be(), T = d ?? ne.language ?? "en", re = he(), [ie, de] = ve({}), U = e === "loading", G = e === "disabled", h = U || G, oe = e === "empty" || t.length === 0 || t.every((r) => r.slots.length === 0), le = x ?? m("slotGrid.ariaLabel"), I = S(
339
+ (r, c) => {
340
+ h || r.available !== !1 && (y == null || y(r, c));
341
+ },
342
+ [h, y]
343
+ ), ce = S(
344
+ (r, c) => {
345
+ de((g) => ({ ...g, [c]: !0 })), N == null || N(r);
346
+ },
347
+ [N]
348
+ ), ue = S(
349
+ (r, c, g) => {
350
+ (r.key === "Enter" || r.key === " ") && (r.preventDefault(), I(c, g));
351
+ },
352
+ [I]
353
+ ), V = Ae(t.length || 1), j = Ye({ cols: V });
354
+ let w;
355
+ return U ? w = /* @__PURE__ */ i(
356
+ "div",
357
+ {
358
+ className: j,
359
+ "data-state": "loading",
360
+ role: "status",
361
+ "aria-live": "polite",
362
+ "aria-label": m("common.loading"),
363
+ children: Array.from({ length: V }, (r, c) => /* @__PURE__ */ C("div", { className: H(), children: [
364
+ /* @__PURE__ */ i(B, { variant: "text", size: s, width: "60%" }),
365
+ /* @__PURE__ */ i("div", { className: _(), children: Array.from(
366
+ { length: Math.min(n, 4) },
367
+ (g, z) => /* @__PURE__ */ i(
368
+ B,
369
+ {
370
+ variant: "rounded",
371
+ size: s,
372
+ height: "40px"
373
+ },
374
+ `loading-slot-${c}-${z}`
375
+ )
376
+ ) })
377
+ ] }, `loading-col-${c}`))
378
+ }
379
+ ) : oe ? w = /* @__PURE__ */ i("div", { "data-state": "empty", children: /* @__PURE__ */ i(xe, { variant: "no-results", title: m("slotGrid.noSlots") }) }) : w = /* @__PURE__ */ i(
380
+ "div",
381
+ {
382
+ className: j,
383
+ "data-state": G ? "disabled" : "default",
384
+ children: t.map((r, c) => {
385
+ const g = `${v(r.date).toISOString()}-${c}`, z = r.label ?? X(v(r.date), T, l), E = `${re}-day-${c}-header`, F = ie[g] ?? !1 ? r.slots : r.slots.slice(0, n), R = r.slots.length - F.length, M = r.slots.length === 0;
386
+ return (
387
+ // Use a plain <div role="group"> rather than <section> — a
388
+ // <section> with aria-labelledby is a landmark, and nesting many
389
+ // landmarks inside the outer slot-grid landmark fails axe's
390
+ // landmark-unique rule.
391
+ /* @__PURE__ */ C(
392
+ "div",
393
+ {
394
+ role: "group",
395
+ className: H(),
396
+ "aria-labelledby": E,
397
+ "data-empty": M || void 0,
398
+ children: [
399
+ /* @__PURE__ */ i("h3", { id: E, className: Be({ size: s }), children: z }),
400
+ M ? /* @__PURE__ */ i("p", { className: "type-body-sm ds:text-[var(--muted-foreground)] ds:m-0", children: m("slotGrid.noSlots") }) : null,
401
+ /* @__PURE__ */ i("ul", { className: _(), children: F.map((p) => {
402
+ const me = He(
403
+ p,
404
+ r,
405
+ T,
406
+ l,
407
+ ({ time: L, day: ge }) => m("slotGrid.slotLabel", { time: L, day: ge })
408
+ ), fe = a === p.id, O = p.available === !1 || h;
409
+ return /* @__PURE__ */ i("li", { children: /* @__PURE__ */ i(
410
+ "button",
411
+ {
412
+ type: "button",
413
+ className: We({ size: s }),
414
+ "aria-label": me,
415
+ "aria-pressed": fe,
416
+ disabled: O,
417
+ "aria-disabled": O || void 0,
418
+ "data-slot-id": p.id,
419
+ onClick: () => I(p, r),
420
+ onKeyDown: (L) => ue(L, p, r),
421
+ children: q(p, T, l)
422
+ }
423
+ ) }, p.id);
424
+ }) }),
425
+ R > 0 ? /* @__PURE__ */ i(
426
+ Y,
427
+ {
428
+ intent: "ghost",
429
+ size: s === "lg" ? "md" : "sm",
430
+ onClick: () => ce(r, g),
431
+ disabled: h,
432
+ children: m("slotGrid.showMore", { count: R })
433
+ }
434
+ ) : null
435
+ ]
436
+ },
437
+ g
438
+ )
439
+ );
440
+ })
441
+ }
442
+ ), /* @__PURE__ */ C(
443
+ "div",
444
+ {
445
+ ref: ae,
446
+ role: "region",
447
+ "aria-label": le,
448
+ className: Re({ size: s, className: te }),
449
+ "data-component": "slot-grid",
450
+ "data-state": e,
451
+ ...se,
452
+ children: [
453
+ /* @__PURE__ */ C("div", { className: Me(), children: [
454
+ /* @__PURE__ */ i(
455
+ A,
456
+ {
457
+ icon: /* @__PURE__ */ i(_e, {}),
458
+ "aria-label": m("slotGrid.previousDays"),
459
+ size: s === "lg" ? "md" : "sm",
460
+ intent: "ghost",
461
+ flipIconInRtl: !0,
462
+ disabled: !u || h,
463
+ onClick: Q
464
+ }
465
+ ),
466
+ o ? /* @__PURE__ */ i(
467
+ Y,
468
+ {
469
+ intent: "secondary",
470
+ size: s === "lg" ? "md" : "sm",
471
+ disabled: h,
472
+ onClick: ee,
473
+ children: m("slotGrid.nextAvailable")
474
+ }
475
+ ) : /* @__PURE__ */ i("span", { "aria-hidden": "true" }),
476
+ /* @__PURE__ */ i(
477
+ A,
478
+ {
479
+ icon: /* @__PURE__ */ i(Ke, {}),
480
+ "aria-label": m("slotGrid.nextDays"),
481
+ size: s === "lg" ? "md" : "sm",
482
+ intent: "ghost",
483
+ flipIconInRtl: !0,
484
+ disabled: !f || h,
485
+ onClick: P
486
+ }
487
+ )
488
+ ] }),
489
+ w
490
+ ]
491
+ }
492
+ );
493
+ }
494
+ );
495
+ Ze.displayName = "SlotGrid";
496
+ export {
497
+ Ze as S,
498
+ it as f,
499
+ rt as i,
500
+ Ne as p
501
+ };
502
+ //# sourceMappingURL=slot-grid-BlHHP9Qy.js.map
@@ -0,0 +1,8 @@
1
+ import { a as o } from "./react-day-picker-DsjfS7uI.js";
2
+ function n(a, s, r) {
3
+ return o(a, -s, r);
4
+ }
5
+ export {
6
+ n as s
7
+ };
8
+ //# sourceMappingURL=subDays-CANHP9hz.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "0.33.8",
3
+ "packageVersion": "0.33.10",
4
4
  "components": [
5
5
  {
6
6
  "kind": "component",
@@ -135,6 +135,22 @@ export interface BookingProps extends Omit<ComponentPropsWithoutRef<'div'>, 'ari
135
135
  value: BookingValue;
136
136
  onChange: (next: BookingValue) => void;
137
137
  onSubmit: (payload: BookingSubmitPayload) => void | Promise<void>;
138
+ /**
139
+ * Calendar/date-strip shimmer — set true while `availableDates` is being
140
+ * fetched. When omitted, the kit falls back to `loadingSlots` for the
141
+ * calendar shimmer (the long-standing behaviour). Split from
142
+ * `loadingSlots` in 0.33.9 so consumers using a two-query pattern
143
+ * ("which days have availability" + per-day slot fetch) can shimmer
144
+ * the calendar independently of the slot list — without this split a
145
+ * per-day slot fetch re-shimmers the whole calendar on every date click.
146
+ */
147
+ loadingDates?: boolean;
148
+ /**
149
+ * Slot-list shimmer — set true while `availableSlots[value.date]` is
150
+ * being fetched. Drives the `<GroupedTimeSlots>` and the calendar-
151
+ * variant time-slot list. When `loadingDates` is omitted, this flag
152
+ * also drives the calendar shimmer (backward-compat fallback).
153
+ */
138
154
  loadingSlots?: boolean;
139
155
  submitting?: boolean;
140
156
  /**
@@ -153,6 +169,38 @@ export interface BookingProps extends Omit<ComponentPropsWithoutRef<'div'>, 'ari
153
169
  * don't need to do that themselves.
154
170
  */
155
171
  onStepChange?: (step: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8) => void;
172
+ /**
173
+ * Fires when the patient picks a date in the calendar — sugar for
174
+ * consumers using a two-query pattern who need to kick off the
175
+ * per-day slot fetch on date click. Consumers can already detect
176
+ * a date change by diffing `value.date` inside `onChange`; this
177
+ * callback just spares them that diff. Fires AFTER the kit has
178
+ * applied the date change through `onChange` — `value.date` will
179
+ * reflect the new ISO when this fires.
180
+ */
181
+ onDateSelect?: (iso: string) => void;
182
+ /**
183
+ * @default 'month-calendar'
184
+ * Selects the date + slot picker rendered inside the cascade's date
185
+ * and slot steps. Independent of the layout `variant`:
186
+ *
187
+ * - `'month-calendar'` (default): the 6×7 `<MonthGrid>` followed by
188
+ * the morning/afternoon/evening `<GroupedTimeSlots>`. Two-step flow
189
+ * — patient picks a date, slots reveal underneath.
190
+ *
191
+ * - `'four-day-grid'`: a 4-column day-strip (`<SlotGrid>`) with ±4-day
192
+ * arrow nav and per-day vertical slot tiles. One-step flow —
193
+ * patient picks a slot directly; clicking a slot atomically sets
194
+ * both `value.date` and `value.slotKey`. The cascade's separate
195
+ * "slot" step is suppressed because the slots are inline with the
196
+ * date strip.
197
+ *
198
+ * The data contract is unchanged — `availableDates`, `availableSlots`,
199
+ * `loadingDates`, `loadingSlots`, `onDateSelect` all behave the same
200
+ * way for both styles. Defaults to `'month-calendar'` so existing
201
+ * consumers see no behavioural change.
202
+ */
203
+ datePickerStyle?: 'month-calendar' | 'four-day-grid';
156
204
  /**
157
205
  * Surface a submit-failure message inside the form (Alert variant=destructive
158
206
  * above the submit button). The consumer owns the state — set it after an
@@ -1,4 +1,4 @@
1
- import { B as A, C as R, O as a, b as s } from "../../_chunks/booking-h_kBZM6M.js";
1
+ import { B as A, C as R, O as a, b as s } from "../../_chunks/booking-x4GlW5cb.js";
2
2
  export {
3
3
  A as Booking,
4
4
  R as CONFIRMATION_CHANNEL_ORDER,
@@ -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-B9VRSV_S.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-CZcVWBPo.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-range-picker-D4dgDlLU.js";
1
+ import { D as r, d as t } from "../../_chunks/date-range-picker-D8CHNYQT.js";
2
2
  export {
3
3
  r as DateRangePicker,
4
4
  t as dateRangePickerAgent
@@ -1,4 +1,4 @@
1
- import { S as s, f as e, i as r } from "../../_chunks/slot-grid-Dz13dH82.js";
1
+ import { S as s, f as e, i as r } from "../../_chunks/slot-grid-BlHHP9Qy.js";
2
2
  export {
3
3
  s as SlotGrid,
4
4
  e as findFirstAvailable,
package/dist/index.js CHANGED
@@ -19,7 +19,7 @@ import { A as j, B as z, C as q } from "./_chunks/color-picker-9tL7pz5y.js";
19
19
  import { C as J, c as X, a as Z, b as $, d as aa, e as ea } from "./_chunks/combobox-BC-DFx8G.js";
20
20
  import { C as oa, c as ta } from "./_chunks/copy-field-CCq7j6Zc.js";
21
21
  import { D as ia, d as na } from "./_chunks/date-picker-B94HAV4A.js";
22
- import { D as ma, d as la } from "./_chunks/date-range-picker-D4dgDlLU.js";
22
+ import { D as ma, d as la } from "./_chunks/date-range-picker-D8CHNYQT.js";
23
23
  import { D as da, d as ga } from "./_chunks/date-time-picker-D1GEzf8p.js";
24
24
  import { E as xa, e as Aa } from "./_chunks/email-input-lQivsFrw.js";
25
25
  import { F as Sa, f as Ca } from "./_chunks/file-upload-CdozCPct.js";
@@ -48,7 +48,7 @@ import { B as Me } from "./_chunks/benefit-card-Xnxj4Gmo.js";
48
48
  import { C as we } from "./_chunks/card-DPmk26CL.js";
49
49
  import { C as ve, c as He } from "./_chunks/carousel.agent-DrX96W-1.js";
50
50
  import { C as Ge } from "./_chunks/contact-card-Cf8Ktyt3.js";
51
- import { A as Ke, B as Ye, C as je, a as ze, D as qe, b as Qe, c as Je, d as Xe, E as Ze, e as $e, I as ar, L as er, N as rr, f as or, S as tr, g as sr, h as ir, T as nr, i as pr, j as mr, k as lr, l as fr, m as dr, n as gr, o as cr, U as xr, p as Ar, q as ur, u as Sr } from "./_chunks/editable-currency-cell-renderer-B9VRSV_S.js";
51
+ import { A as Ke, B as Ye, C as je, a as ze, D as qe, b as Qe, c as Je, d as Xe, E as Ze, e as $e, I as ar, L as er, N as rr, f as or, S as tr, g as sr, h as ir, T as nr, i as pr, j as mr, k as lr, l as fr, m as dr, n as gr, o as cr, U as xr, p as Ar, q as ur, u as Sr } from "./_chunks/editable-currency-cell-renderer-CZcVWBPo.js";
52
52
  import { D as Tr } from "./_chunks/description-list-BEbK2g93.js";
53
53
  import { E as Pr } from "./_chunks/empty-state-BLy7tigq.js";
54
54
  import { F as Ir, a as hr, h as Fr } from "./_chunks/flag-DZ6V7-hU.js";
@@ -126,7 +126,7 @@ import { S as Tn, a as bn } from "./_chunks/suggestion-chip-C4kxWUIs.js";
126
126
  import { s as Rn } from "./_chunks/suggestion-chip.agent-6sNWFj7m.js";
127
127
  import { T as hn, t as Fn } from "./_chunks/transcript-panel-DyhTpAP7.js";
128
128
  import { T as Ln } from "./_chunks/typing-indicator-DHeVN4ob.js";
129
- import { B as kn, C as On, O as _n, b as yn } from "./_chunks/booking-h_kBZM6M.js";
129
+ import { B as kn, C as On, O as _n, b as yn } from "./_chunks/booking-x4GlW5cb.js";
130
130
  import { C as Mn, c as Dn, r as wn } from "./_chunks/calendar-YHFknAGv.js";
131
131
  import { O as vn, o as Hn } from "./_chunks/operator-hero-7LiiP7zi.js";
132
132
  import { P as Gn, p as Un } from "./_chunks/patient-search-CBq62kmL.js";
@@ -137,7 +137,7 @@ import { P as np, p as pp } from "./_chunks/pdf-viewer-DvtEHcEP.js";
137
137
  import { R as lp, r as fp } from "./_chunks/reviews-panel-Dow8Dzoa.js";
138
138
  import { R as gp, e as cp, r as xp, t as Ap, a as up, w as Sp } from "./_chunks/rich-text-editor-CHmr9Bz8.js";
139
139
  import { S as Tp, s as bp } from "./_chunks/signature-capture-C-fF71xI.js";
140
- import { S as Rp, f as Ip, i as hp } from "./_chunks/slot-grid-Dz13dH82.js";
140
+ import { S as Rp, f as Ip, i as hp } from "./_chunks/slot-grid-BlHHP9Qy.js";
141
141
  import { C as Ep, a as Lp, b as Np, F as kp, c as Op, d as _p, P as yp, e as Bp, T as Mp, f as Dp, g as wp, h as Vp, l as vp, i as Hp, t as Wp, r as Gp } from "./_chunks/tooth-scheme-CxlsLjfN.js";
142
142
  import { T as Kp } from "./_chunks/transaction-chip-B8ujzowA.js";
143
143
  import { W as jp } from "./_chunks/whatsapp-button-DUjlWGKf.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfadocs/ui-kit",
3
- "version": "0.33.8",
3
+ "version": "0.33.10",
4
4
  "type": "module",
5
5
  "description": "AlfaDocs shared design system — tokens, components, patterns, and translations for platform, booking, and alfascribe.",
6
6
  "license": "BUSL-1.1",