@teja-app/ui 0.0.15 → 0.0.16

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,68 @@
1
+ import type { ReactElement } from 'react';
2
+ /**
3
+ * DateTimePicker — a generic, presentation-only date + time picker.
4
+ *
5
+ * Two-step so the panel stays short (never clips mid-page / in a drawer):
6
+ * step 'date' → month calendar (past / blackout dates disabled)
7
+ * step 'time' → half-hour slots grouped Morning / Afternoon / Evening,
8
+ * with a "‹ back to date" header.
9
+ *
10
+ * The component is DUMB about availability. It does not know how slots are
11
+ * computed or fetched — the host supplies `loadSlots(dateKey)` (which may hit a
12
+ * backend) and `isDateDisabled(dateKey)`. The component owns the calendar, the
13
+ * two-step flow, calling loadSlots on date-select, and rendering the
14
+ * loading / slots+blocked / empty / error states. This keeps it reusable
15
+ * across the therapist app, the client portal, and the embed.
16
+ *
17
+ * Times are rendered exactly as the host provides them in each Slot's `label`
18
+ * (so the host controls timezone formatting — e.g. office/practice time).
19
+ */
20
+ export interface DateTimePickerSlot {
21
+ /** Stable id for selection (host-defined, e.g. the ISO start instant). */
22
+ id: string;
23
+ /** Display label, e.g. "10:00 AM". Host formats it (incl. timezone). */
24
+ label: string;
25
+ /** Part of day the slot belongs to. */
26
+ period: 'morning' | 'afternoon' | 'evening';
27
+ /** False → rendered greyed/struck and non-selectable. Default true. */
28
+ available?: boolean;
29
+ /** Optional reason shown on hover when blocked (e.g. "Booked"). */
30
+ reason?: string;
31
+ }
32
+ export interface DateTimePickerValue {
33
+ /** Selected date as `YYYY-MM-DD`, or null. */
34
+ dateKey: string | null;
35
+ /** Selected slot id, or null. */
36
+ slotId: string | null;
37
+ }
38
+ export interface DateTimePickerProps {
39
+ value: DateTimePickerValue;
40
+ onChange: (value: DateTimePickerValue) => void;
41
+ /**
42
+ * Fetch (or compute) the slots for a calendar date. May be async — the
43
+ * component shows a loading state while the promise resolves, and an error
44
+ * state if it rejects. Called whenever the date changes (and on `reloadKey`).
45
+ */
46
+ loadSlots: (dateKey: string) => Promise<DateTimePickerSlot[]>;
47
+ /**
48
+ * Returns true for dates that cannot be selected (past, out-of-office,
49
+ * blackout). Defaults to disabling dates before `today`.
50
+ */
51
+ isDateDisabled?: (dateKey: string) => boolean;
52
+ /**
53
+ * Bumping this re-runs loadSlots for the current date (e.g. when the chosen
54
+ * duration changes, which changes which slots fit).
55
+ */
56
+ reloadKey?: string | number;
57
+ /** Short note under the slots (e.g. "Times shown in practice time · 50m"). */
58
+ slotsHint?: string;
59
+ /** Footnote under the calendar. Pass null to hide. Defaults to the past-off note. */
60
+ calendarNote?: string | null;
61
+ /** Which step to start on. Default 'date'. */
62
+ initialStep?: 'date' | 'time';
63
+ /** `YYYY-MM-DD` the calendar treats as "today" (ring + default past cutoff). Defaults to the real today. */
64
+ todayKey?: string;
65
+ testId?: string;
66
+ }
67
+ export declare function DateTimePicker({ value, onChange, loadSlots, isDateDisabled, reloadKey, slotsHint, calendarNote, initialStep, todayKey, testId, }: DateTimePickerProps): ReactElement;
68
+ //# sourceMappingURL=DateTimePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateTimePicker.d.ts","sourceRoot":"","sources":["../../../src/theme/components/DateTimePicker.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAK1C;;;;;;;;;;;;;;;;;GAiBG;AAIH,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;IAC5C,uEAAuE;IACvE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iCAAiC;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC/C;;;;OAIG;IACH,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC9D;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,4GAA4G;IAC5G,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA8VD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,SAAS,EACT,cAAc,EACd,SAAS,EACT,SAAS,EACT,YAAY,EACZ,WAAoB,EACpB,QAAQ,EACR,MAA2B,GAC5B,EAAE,mBAAmB,GAAG,YAAY,CAmKpC"}
@@ -80,4 +80,5 @@ export { Tooltip, type TooltipProps, type TooltipPlacement, } from './Tooltip';
80
80
  export { DarkScope, type DarkScopeProps } from './DarkScope';
81
81
  export { Toast, ToastHost, useToast, type ToastProps, type ToastHostProps, type ToastOptions, type ToastTone, } from './Toast';
82
82
  export { Accordion, AccordionItem, type AccordionProps, type AccordionItemProps, } from './Accordion';
83
+ export { DateTimePicker, type DateTimePickerProps, type DateTimePickerValue, type DateTimePickerSlot, } from './DateTimePicker';
83
84
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/components/index.ts"],"names":[],"mappings":"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"}
@@ -12456,7 +12456,7 @@ const MONTHS_SHORT = [
12456
12456
  "Nov",
12457
12457
  "Dec"
12458
12458
  ];
12459
- const pad2 = (n2) => String(n2).padStart(2, "0");
12459
+ const pad2$1 = (n2) => String(n2).padStart(2, "0");
12460
12460
  function parseDate(value) {
12461
12461
  if (!value) return void 0;
12462
12462
  const [y3, m2, d2] = value.split("-").map(Number);
@@ -12468,13 +12468,13 @@ function parseDate(value) {
12468
12468
  return date;
12469
12469
  }
12470
12470
  function formatDate(date) {
12471
- return `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`;
12471
+ return `${date.getFullYear()}-${pad2$1(date.getMonth() + 1)}-${pad2$1(date.getDate())}`;
12472
12472
  }
12473
12473
  function isValidDateString(value) {
12474
12474
  return /^\d{4}-\d{2}-\d{2}$/.test(value) && parseDate(value) !== void 0;
12475
12475
  }
12476
12476
  function displayDate(date) {
12477
- return `${MONTHS_SHORT[date.getMonth()]} ${pad2(date.getDate())}, ${date.getFullYear()}`;
12477
+ return `${MONTHS_SHORT[date.getMonth()]} ${pad2$1(date.getDate())}, ${date.getFullYear()}`;
12478
12478
  }
12479
12479
  function startOfDay(date) {
12480
12480
  return new Date(date.getFullYear(), date.getMonth(), date.getDate());
@@ -19140,6 +19140,464 @@ const AccordionItem = React.forwardRef(
19140
19140
  ] });
19141
19141
  }
19142
19142
  );
19143
+ const DOW = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
19144
+ const MONTHS = [
19145
+ "January",
19146
+ "February",
19147
+ "March",
19148
+ "April",
19149
+ "May",
19150
+ "June",
19151
+ "July",
19152
+ "August",
19153
+ "September",
19154
+ "October",
19155
+ "November",
19156
+ "December"
19157
+ ];
19158
+ const pad2 = (n2) => String(n2).padStart(2, "0");
19159
+ function dateKeyOf(year, month0, day) {
19160
+ return `${year}-${pad2(month0 + 1)}-${pad2(day)}`;
19161
+ }
19162
+ function realTodayKey() {
19163
+ const d2 = /* @__PURE__ */ new Date();
19164
+ return dateKeyOf(d2.getFullYear(), d2.getMonth(), d2.getDate());
19165
+ }
19166
+ function prettyDate(dateKey) {
19167
+ if (!dateKey) return null;
19168
+ const [y3, m2, d2] = dateKey.split("-").map(Number);
19169
+ if (!y3 || !m2 || !d2) return null;
19170
+ const dow = DOW[(new Date(y3, m2 - 1, d2).getDay() + 6) % 7];
19171
+ return `${dow}, ${MONTHS[m2 - 1]} ${d2}`;
19172
+ }
19173
+ function monthGrid(year, month0, todayKey) {
19174
+ const first = new Date(year, month0, 1);
19175
+ const lead = (first.getDay() + 6) % 7;
19176
+ const daysInMonth = new Date(year, month0 + 1, 0).getDate();
19177
+ const cells = [];
19178
+ for (let i2 = 0; i2 < lead; i2++) cells.push(null);
19179
+ for (let d2 = 1; d2 <= daysInMonth; d2++) {
19180
+ const key = dateKeyOf(year, month0, d2);
19181
+ cells.push({ day: d2, key, past: key < todayKey, today: key === todayKey });
19182
+ }
19183
+ while (cells.length % 7 !== 0) cells.push(null);
19184
+ return cells;
19185
+ }
19186
+ const PERIODS = [
19187
+ { id: "morning", label: "Morning", sub: "Before noon" },
19188
+ { id: "afternoon", label: "Afternoon", sub: "12:00 – 5:00 PM" },
19189
+ { id: "evening", label: "Evening", sub: "After 5:00 PM" }
19190
+ ];
19191
+ function NavButton({
19192
+ icon,
19193
+ disabled,
19194
+ onClick,
19195
+ ariaLabel
19196
+ }) {
19197
+ return /* @__PURE__ */ jsxRuntime.jsx(
19198
+ "button",
19199
+ {
19200
+ "aria-label": ariaLabel,
19201
+ disabled,
19202
+ type: "button",
19203
+ onClick,
19204
+ style: {
19205
+ width: 26,
19206
+ height: 26,
19207
+ borderRadius: "var(--r-sm)",
19208
+ border: "1px solid var(--border)",
19209
+ background: "var(--surface-0)",
19210
+ color: "var(--ink-2)",
19211
+ boxShadow: "var(--shadow-xs)",
19212
+ display: "inline-flex",
19213
+ alignItems: "center",
19214
+ justifyContent: "center",
19215
+ cursor: disabled ? "not-allowed" : "pointer",
19216
+ opacity: disabled ? 0.4 : 1,
19217
+ flexShrink: 0
19218
+ },
19219
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { color: "var(--ink-2)", name: icon, size: 13 })
19220
+ }
19221
+ );
19222
+ }
19223
+ function CalendarPane({
19224
+ value,
19225
+ todayKey,
19226
+ isDateDisabled,
19227
+ onPick,
19228
+ note
19229
+ }) {
19230
+ const initial = (value ?? todayKey).split("-").map(Number);
19231
+ const [view, setView] = React.useState({
19232
+ year: initial[0],
19233
+ month0: (initial[1] ?? 1) - 1
19234
+ });
19235
+ const grid = React.useMemo(
19236
+ () => monthGrid(view.year, view.month0, todayKey),
19237
+ [view.year, view.month0, todayKey]
19238
+ );
19239
+ const [ty, tm] = todayKey.split("-").map(Number);
19240
+ const canGoPrev = view.year > (ty ?? 0) || view.month0 > (tm ?? 1) - 1;
19241
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%" }, children: [
19242
+ /* @__PURE__ */ jsxRuntime.jsxs(
19243
+ "div",
19244
+ {
19245
+ style: {
19246
+ display: "flex",
19247
+ alignItems: "center",
19248
+ justifyContent: "space-between",
19249
+ marginBottom: 12,
19250
+ padding: "2px 2px 0"
19251
+ },
19252
+ children: [
19253
+ /* @__PURE__ */ jsxRuntime.jsx(
19254
+ NavButton,
19255
+ {
19256
+ ariaLabel: "Previous month",
19257
+ disabled: !canGoPrev,
19258
+ icon: "chevronLeft",
19259
+ onClick: () => {
19260
+ if (!canGoPrev) return;
19261
+ setView((v2) => v2.month0 === 0 ? { year: v2.year - 1, month0: 11 } : { ...v2, month0: v2.month0 - 1 });
19262
+ }
19263
+ }
19264
+ ),
19265
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: 13, fontWeight: 600, color: "var(--ink-1)" }, children: [
19266
+ MONTHS[view.month0],
19267
+ " ",
19268
+ view.year
19269
+ ] }),
19270
+ /* @__PURE__ */ jsxRuntime.jsx(
19271
+ NavButton,
19272
+ {
19273
+ ariaLabel: "Next month",
19274
+ icon: "chevronRight",
19275
+ onClick: () => {
19276
+ setView((v2) => v2.month0 === 11 ? { year: v2.year + 1, month0: 0 } : { ...v2, month0: v2.month0 + 1 });
19277
+ }
19278
+ }
19279
+ )
19280
+ ]
19281
+ }
19282
+ ),
19283
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: "repeat(7, 1fr)", gap: 2, marginBottom: 4 }, children: DOW.map((d2, i2) => /* @__PURE__ */ jsxRuntime.jsx(
19284
+ "span",
19285
+ {
19286
+ style: {
19287
+ textAlign: "center",
19288
+ fontSize: 10,
19289
+ fontWeight: 600,
19290
+ color: "var(--ink-3)",
19291
+ textTransform: "uppercase",
19292
+ letterSpacing: "0.04em"
19293
+ },
19294
+ children: d2[0]
19295
+ },
19296
+ i2
19297
+ )) }),
19298
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: "repeat(7, 1fr)", gap: 2, justifyItems: "center" }, children: grid.map((c2, i2) => {
19299
+ if (!c2) return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { width: 34, height: 34 } }, `e${i2}`);
19300
+ const disabled = c2.past || isDateDisabled(c2.key);
19301
+ const selected = c2.key === value;
19302
+ return /* @__PURE__ */ jsxRuntime.jsx(
19303
+ "button",
19304
+ {
19305
+ "data-testid": `dtp-day-${c2.key}`,
19306
+ disabled,
19307
+ type: "button",
19308
+ onClick: () => onPick(c2.key),
19309
+ style: {
19310
+ width: 34,
19311
+ height: 34,
19312
+ borderRadius: 999,
19313
+ border: 0,
19314
+ fontSize: 12.5,
19315
+ fontWeight: selected ? 700 : c2.today ? 600 : 500,
19316
+ cursor: disabled ? "not-allowed" : "pointer",
19317
+ background: selected ? "var(--primary)" : "transparent",
19318
+ color: disabled ? "var(--ink-4)" : selected ? "white" : c2.today ? "var(--primary)" : "var(--ink-1)",
19319
+ opacity: disabled ? 0.45 : 1,
19320
+ textDecoration: disabled ? "line-through" : "none",
19321
+ outline: c2.today && !selected ? "1px solid var(--primary-soft)" : "none",
19322
+ display: "inline-flex",
19323
+ alignItems: "center",
19324
+ justifyContent: "center"
19325
+ },
19326
+ children: c2.day
19327
+ },
19328
+ c2.key
19329
+ );
19330
+ }) }),
19331
+ note ? /* @__PURE__ */ jsxRuntime.jsxs(
19332
+ "div",
19333
+ {
19334
+ style: {
19335
+ marginTop: 10,
19336
+ fontSize: 10.5,
19337
+ color: "var(--ink-3)",
19338
+ display: "flex",
19339
+ alignItems: "center",
19340
+ gap: 5
19341
+ },
19342
+ children: [
19343
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { color: "var(--ink-4)", name: "calendar", size: 11 }),
19344
+ note
19345
+ ]
19346
+ }
19347
+ ) : null
19348
+ ] });
19349
+ }
19350
+ function SlotsPane({
19351
+ state,
19352
+ value,
19353
+ hint,
19354
+ onPick,
19355
+ onRetry
19356
+ }) {
19357
+ if (state.status === "loading") {
19358
+ return /* @__PURE__ */ jsxRuntime.jsx(
19359
+ "div",
19360
+ {
19361
+ "data-testid": "dtp-slots-loading",
19362
+ style: { minHeight: 120, display: "flex", alignItems: "center", justifyContent: "center", color: "var(--ink-3)", fontSize: 12.5 },
19363
+ children: "Loading times…"
19364
+ }
19365
+ );
19366
+ }
19367
+ if (state.status === "error") {
19368
+ return /* @__PURE__ */ jsxRuntime.jsxs(
19369
+ "div",
19370
+ {
19371
+ "data-testid": "dtp-slots-error",
19372
+ style: { minHeight: 120, display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: 8, color: "var(--ink-3)", textAlign: "center", padding: 16 },
19373
+ children: [
19374
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { color: "var(--danger)", name: "alert-circle", size: 18 }),
19375
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12.5 }, children: "Couldn't load times." }),
19376
+ /* @__PURE__ */ jsxRuntime.jsx(Button$1, { size: "sm", variant: "secondary", onClick: onRetry, children: "Try again" })
19377
+ ]
19378
+ }
19379
+ );
19380
+ }
19381
+ const { slots } = state;
19382
+ const anyAvailable = slots.some((s2) => s2.available !== false);
19383
+ if (slots.length === 0 || !anyAvailable) {
19384
+ return /* @__PURE__ */ jsxRuntime.jsxs(
19385
+ "div",
19386
+ {
19387
+ "data-testid": "dtp-slots-empty",
19388
+ style: { minHeight: 120, display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: 8, color: "var(--ink-3)", textAlign: "center", padding: 16 },
19389
+ children: [
19390
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { color: "var(--ink-4)", name: "clock", size: 18 }),
19391
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12.5, fontWeight: 500 }, children: "No times available" }),
19392
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 11, maxWidth: 200 }, children: "Try another day, or adjust the session length." })
19393
+ ]
19394
+ }
19395
+ );
19396
+ }
19397
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "dtp-slots", style: { display: "flex", flexDirection: "column", gap: 14 }, children: [
19398
+ hint ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: "var(--ink-2)" }, children: hint }) : null,
19399
+ PERIODS.map((p2) => {
19400
+ const inPeriod = slots.filter((s2) => s2.period === p2.id);
19401
+ if (inPeriod.length === 0) return null;
19402
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
19403
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "baseline", gap: 8, marginBottom: 8 }, children: [
19404
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 11.5, fontWeight: 700, color: "var(--ink-1)" }, children: p2.label }),
19405
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 10.5, color: "var(--ink-3)" }, children: p2.sub })
19406
+ ] }),
19407
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(84px, 1fr))", gap: 8 }, children: inPeriod.map((s2) => {
19408
+ const blocked = s2.available === false;
19409
+ const on = s2.id === value;
19410
+ return /* @__PURE__ */ jsxRuntime.jsx(
19411
+ "button",
19412
+ {
19413
+ "data-testid": `dtp-slot-${s2.id}`,
19414
+ disabled: blocked,
19415
+ title: blocked ? s2.reason : void 0,
19416
+ type: "button",
19417
+ onClick: () => onPick(s2.id),
19418
+ style: {
19419
+ height: 38,
19420
+ borderRadius: "var(--r-md)",
19421
+ border: `1px solid ${on ? "var(--primary)" : "var(--border-strong)"}`,
19422
+ background: on ? "var(--primary)" : "var(--surface-0)",
19423
+ color: blocked ? "var(--ink-4)" : on ? "white" : "var(--ink-1)",
19424
+ fontSize: 12.5,
19425
+ fontWeight: on ? 600 : 500,
19426
+ cursor: blocked ? "not-allowed" : "pointer",
19427
+ opacity: blocked ? 0.5 : 1,
19428
+ textDecoration: blocked ? "line-through" : "none"
19429
+ },
19430
+ children: s2.label
19431
+ },
19432
+ s2.id
19433
+ );
19434
+ }) })
19435
+ ] }, p2.id);
19436
+ })
19437
+ ] });
19438
+ }
19439
+ function DateTimePicker({
19440
+ value,
19441
+ onChange,
19442
+ loadSlots,
19443
+ isDateDisabled,
19444
+ reloadKey,
19445
+ slotsHint,
19446
+ calendarNote,
19447
+ initialStep = "date",
19448
+ todayKey,
19449
+ testId = "date-time-picker"
19450
+ }) {
19451
+ const today = todayKey ?? realTodayKey();
19452
+ const dateDisabled = React.useCallback(
19453
+ (k2) => isDateDisabled ? isDateDisabled(k2) : k2 < today,
19454
+ [isDateDisabled, today]
19455
+ );
19456
+ const [step, setStep] = React.useState(initialStep);
19457
+ const [slotsState, setSlotsState] = React.useState(
19458
+ value.dateKey ? { status: "loading" } : { status: "ready", slots: [] }
19459
+ );
19460
+ const reqIdRef = React.useRef(0);
19461
+ const runLoad = React.useCallback(
19462
+ (dateKey) => {
19463
+ const id = ++reqIdRef.current;
19464
+ setSlotsState({ status: "loading" });
19465
+ loadSlots(dateKey).then(
19466
+ (slots) => {
19467
+ if (reqIdRef.current === id) setSlotsState({ status: "ready", slots });
19468
+ },
19469
+ () => {
19470
+ if (reqIdRef.current === id) setSlotsState({ status: "error" });
19471
+ }
19472
+ );
19473
+ },
19474
+ [loadSlots]
19475
+ );
19476
+ const dateKeyRef = React.useRef(value.dateKey);
19477
+ React.useEffect(() => {
19478
+ dateKeyRef.current = value.dateKey;
19479
+ }, [value.dateKey]);
19480
+ React.useEffect(() => {
19481
+ const dateKey = dateKeyRef.current;
19482
+ if (dateKey) runLoad(dateKey);
19483
+ }, [reloadKey, runLoad]);
19484
+ const handlePickDate = (dateKey) => {
19485
+ onChange({ dateKey, slotId: null });
19486
+ setStep("time");
19487
+ runLoad(dateKey);
19488
+ };
19489
+ const handlePickSlot = (slotId) => {
19490
+ onChange({ ...value, slotId });
19491
+ };
19492
+ const pretty = prettyDate(value.dateKey);
19493
+ const selectedLabel = slotsState.status === "ready" ? slotsState.slots.find((s2) => s2.id === value.slotId)?.label : void 0;
19494
+ const note = calendarNote === void 0 ? "Past dates are off — sessions can't be created in the past." : calendarNote;
19495
+ return /* @__PURE__ */ jsxRuntime.jsxs(
19496
+ "div",
19497
+ {
19498
+ "data-testid": testId,
19499
+ style: {
19500
+ width: 340,
19501
+ maxWidth: "calc(100vw - 32px)",
19502
+ background: "var(--surface-0)",
19503
+ borderRadius: "var(--r-lg)",
19504
+ border: "1px solid var(--border-strong)",
19505
+ boxShadow: "var(--shadow-lg)",
19506
+ overflow: "hidden",
19507
+ display: "flex",
19508
+ flexDirection: "column",
19509
+ maxHeight: "min(440px, 80vh)"
19510
+ },
19511
+ children: [
19512
+ step === "date" ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: 16 }, children: /* @__PURE__ */ jsxRuntime.jsx(
19513
+ CalendarPane,
19514
+ {
19515
+ isDateDisabled: dateDisabled,
19516
+ note,
19517
+ todayKey: today,
19518
+ value: value.dateKey,
19519
+ onPick: handlePickDate
19520
+ }
19521
+ ) }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19522
+ /* @__PURE__ */ jsxRuntime.jsxs(
19523
+ "button",
19524
+ {
19525
+ "data-testid": "dtp-back-to-date",
19526
+ type: "button",
19527
+ onClick: () => setStep("date"),
19528
+ style: {
19529
+ display: "flex",
19530
+ alignItems: "center",
19531
+ gap: 8,
19532
+ width: "100%",
19533
+ padding: "12px 16px",
19534
+ border: 0,
19535
+ borderBottom: "1px solid var(--divider)",
19536
+ background: "var(--surface-1)",
19537
+ cursor: "pointer",
19538
+ textAlign: "left"
19539
+ },
19540
+ children: [
19541
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { color: "var(--ink-3)", name: "chevronLeft", size: 13 }),
19542
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12, color: "var(--ink-3)" }, children: "Date" }),
19543
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 13, fontWeight: 600, color: "var(--ink-1)", marginLeft: "auto" }, children: pretty })
19544
+ ]
19545
+ }
19546
+ ),
19547
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: 16, overflowY: "auto", flex: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(
19548
+ SlotsPane,
19549
+ {
19550
+ hint: slotsHint,
19551
+ state: slotsState,
19552
+ value: value.slotId,
19553
+ onPick: handlePickSlot,
19554
+ onRetry: () => {
19555
+ if (value.dateKey) runLoad(value.dateKey);
19556
+ }
19557
+ }
19558
+ ) })
19559
+ ] }),
19560
+ /* @__PURE__ */ jsxRuntime.jsx(
19561
+ "div",
19562
+ {
19563
+ style: {
19564
+ padding: "10px 16px",
19565
+ borderTop: "1px solid var(--divider)",
19566
+ background: "var(--surface-1)",
19567
+ display: "flex",
19568
+ alignItems: "center",
19569
+ justifyContent: "space-between",
19570
+ gap: 8,
19571
+ flexShrink: 0
19572
+ },
19573
+ children: /* @__PURE__ */ jsxRuntime.jsx(
19574
+ "span",
19575
+ {
19576
+ style: {
19577
+ fontSize: 12,
19578
+ color: "var(--ink-2)",
19579
+ minWidth: 0,
19580
+ overflow: "hidden",
19581
+ textOverflow: "ellipsis",
19582
+ whiteSpace: "nowrap"
19583
+ },
19584
+ children: value.slotId && selectedLabel ? /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
19585
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--ink-3)" }, children: "Selected:" }),
19586
+ " ",
19587
+ /* @__PURE__ */ jsxRuntime.jsxs("b", { children: [
19588
+ pretty,
19589
+ " · ",
19590
+ selectedLabel
19591
+ ] })
19592
+ ] }) : step === "date" ? "Pick a date" : "Pick a time"
19593
+ }
19594
+ )
19595
+ }
19596
+ )
19597
+ ]
19598
+ }
19599
+ );
19600
+ }
19143
19601
  exports.AIBadge = AIBadge;
19144
19602
  exports.AICard = AICard;
19145
19603
  exports.AIChip = AIChip;
@@ -19172,6 +19630,7 @@ exports.DENSITY_OPTIONS = DENSITY_OPTIONS;
19172
19630
  exports.DISPLAY_OPTIONS = DISPLAY_OPTIONS;
19173
19631
  exports.DarkScope = DarkScope;
19174
19632
  exports.DateInput = DateInput;
19633
+ exports.DateTimePicker = DateTimePicker;
19175
19634
  exports.Divider = Divider;
19176
19635
  exports.Drawer = Drawer;
19177
19636
  exports.DrawerFooter = DrawerFooter;