@flamingo-stack/openframe-frontend-core 0.0.742 → 0.0.744

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 (94) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{chunk-54EA4RLX.cjs → chunk-2JRCJV3M.cjs} +3 -3
  3. package/dist/{chunk-ZIFYSLIM.cjs → chunk-2UBR53AN.cjs} +4 -4
  4. package/dist/{chunk-Z2DQYKZA.cjs → chunk-35IQLGV3.cjs} +69 -69
  5. package/dist/{chunk-WIHHA54J.cjs → chunk-4A6OF4HI.cjs} +44 -44
  6. package/dist/{chunk-OBODY7F3.cjs → chunk-4N7KGOBS.cjs} +3 -3
  7. package/dist/{chunk-HIRVNBX5.cjs → chunk-65LJNDR2.cjs} +16 -16
  8. package/dist/{chunk-32Q7K5OP.cjs → chunk-7YDF3QBN.cjs} +116 -115
  9. package/dist/{chunk-DNFSMVXJ.cjs → chunk-AT6ZI4CO.cjs} +12 -12
  10. package/dist/{chunk-UWHCRIQQ.cjs → chunk-FTYQS6VI.cjs} +13 -13
  11. package/dist/{chunk-YQGDXH3M.cjs → chunk-GAGNKWOC.cjs} +2 -2
  12. package/dist/{chunk-L34TKFTS.cjs → chunk-H62FNZGG.cjs} +16 -16
  13. package/dist/{chunk-T433HSL6.cjs → chunk-HHL23RFC.cjs} +33 -33
  14. package/dist/{chunk-4PKORVOX.cjs → chunk-HJ4KGA2M.cjs} +441 -406
  15. package/dist/{chunk-4LDU32OB.cjs → chunk-HMSUYWSB.cjs} +4 -4
  16. package/dist/{chunk-UZLRSFGG.cjs → chunk-HTQJYN47.cjs} +30 -30
  17. package/dist/{chunk-XAA5EZ5T.cjs → chunk-JGZEHBBD.cjs} +6 -6
  18. package/dist/{chunk-5MH6BRPY.cjs → chunk-LJ46XYYP.cjs} +24 -12
  19. package/dist/{chunk-ISJXKKYW.cjs → chunk-NURAL5HD.cjs} +11 -11
  20. package/dist/{chunk-PS6T65KA.cjs → chunk-OC2LBQQJ.cjs} +90 -66
  21. package/dist/{chunk-HDBY2URA.cjs → chunk-PYWHDPVC.cjs} +31 -31
  22. package/dist/{chunk-R6SCSV2I.cjs → chunk-QSO56JZ2.cjs} +81 -81
  23. package/dist/{chunk-3LW43GIJ.cjs → chunk-QZYF2YQ3.cjs} +4 -4
  24. package/dist/{chunk-BI3XBCQX.cjs → chunk-YIOWV7LS.cjs} +2 -2
  25. package/dist/{chunk-H3UA7UY5.cjs → chunk-YJRMCFX3.cjs} +2 -2
  26. package/dist/{cloud-tenants-6ICAL3HO.cjs → cloud-tenants-JPXAXSPE.cjs} +7 -7
  27. package/dist/components/case-studies/index.cjs +19 -19
  28. package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts.map +1 -1
  29. package/dist/components/chat/entity-cards/onboarding-guide-card.js +22 -12
  30. package/dist/components/chat/index.cjs +5 -5
  31. package/dist/components/chat/tool-execution-display.d.ts.map +1 -1
  32. package/dist/components/chat/tool-execution-display.js +5 -4
  33. package/dist/components/chat/utils/history-merge.d.ts.map +1 -1
  34. package/dist/components/chat/utils/history-merge.js +25 -1
  35. package/dist/components/contact/index.cjs +8 -8
  36. package/dist/components/docs/index.cjs +11 -11
  37. package/dist/components/embeds/index.cjs +8 -8
  38. package/dist/components/faq/index.cjs +9 -9
  39. package/dist/components/features/index.cjs +7 -7
  40. package/dist/components/features/scripts/schedule-form/schedule-interval-input.d.ts +1 -1
  41. package/dist/components/features/scripts/schedule-form/schedule-interval-input.d.ts.map +1 -1
  42. package/dist/components/features/scripts/schedule-form/schedule-interval-input.js +15 -13
  43. package/dist/components/features/scripts/schedule-form/schedule-offline-fields.d.ts.map +1 -1
  44. package/dist/components/features/scripts/schedule-form/schedule-offline-fields.js +9 -7
  45. package/dist/components/help-center-pages/index.cjs +101 -101
  46. package/dist/components/index.cjs +59 -57
  47. package/dist/components/meeting-scheduler/booking-form.d.ts +11 -1
  48. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  49. package/dist/components/meeting-scheduler/booking-form.js +15 -3
  50. package/dist/components/meeting-scheduler/index.cjs +408 -114
  51. package/dist/components/meeting-scheduler/index.d.ts +16 -1
  52. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  53. package/dist/components/meeting-scheduler/index.js +157 -5
  54. package/dist/components/meeting-scheduler/modal-header.d.ts +27 -0
  55. package/dist/components/meeting-scheduler/modal-header.d.ts.map +1 -0
  56. package/dist/components/meeting-scheduler/modal-header.js +104 -0
  57. package/dist/components/meeting-scheduler/slot-picker.d.ts +13 -2
  58. package/dist/components/meeting-scheduler/slot-picker.d.ts.map +1 -1
  59. package/dist/components/meeting-scheduler/slot-picker.js +112 -73
  60. package/dist/components/navigation/index.cjs +10 -10
  61. package/dist/components/onboarding-guides/index.cjs +10 -10
  62. package/dist/components/product-demo/index.cjs +7 -7
  63. package/dist/components/related-content/index.cjs +5 -5
  64. package/dist/components/shared/product-release/product-release-card.d.ts.map +1 -1
  65. package/dist/components/shared/product-release/product-release-card.js +2 -0
  66. package/dist/components/tickets/index.cjs +13 -13
  67. package/dist/components/ui/index.cjs +9 -7
  68. package/dist/components/ui/radio-group.d.ts +6 -0
  69. package/dist/components/ui/radio-group.d.ts.map +1 -1
  70. package/dist/components/ui/radio-group.js +65 -58
  71. package/dist/components/ui/tab-navigation.d.ts +19 -1
  72. package/dist/components/ui/tab-navigation.d.ts.map +1 -1
  73. package/dist/components/ui/tab-navigation.js +32 -8
  74. package/dist/{devices-OFP2IBKN.cjs → devices-ONC4JOVH.cjs} +8 -8
  75. package/dist/{embeddable-chat-4C22MGNC.cjs → embeddable-chat-7ZEGCDVF.cjs} +71 -71
  76. package/dist/index.cjs +13 -11
  77. package/dist/{knowledge-KKBCSNUA.cjs → knowledge-G7XU5YST.cjs} +8 -8
  78. package/dist/{logs-X2GRNO57.cjs → logs-5B7NY4G6.cjs} +15 -15
  79. package/dist/{policies-35BXKB6P.cjs → policies-OYR3SLJN.cjs} +11 -11
  80. package/dist/{scripts-KQYVQOLU.cjs → scripts-6CWHTY6U.cjs} +12 -12
  81. package/dist/{software-update-ED33WSKT.cjs → software-update-AJPIY4SQ.cjs} +10 -10
  82. package/package.json +1 -1
  83. package/src/components/chat/entity-cards/onboarding-guide-card.tsx +8 -1
  84. package/src/components/chat/tool-execution-display.tsx +21 -10
  85. package/src/components/chat/utils/history-merge.ts +46 -1
  86. package/src/components/features/scripts/schedule-form/schedule-interval-input.tsx +20 -13
  87. package/src/components/features/scripts/schedule-form/schedule-offline-fields.tsx +9 -5
  88. package/src/components/meeting-scheduler/booking-form.tsx +29 -3
  89. package/src/components/meeting-scheduler/index.tsx +224 -3
  90. package/src/components/meeting-scheduler/modal-header.tsx +145 -0
  91. package/src/components/meeting-scheduler/slot-picker.tsx +72 -8
  92. package/src/components/shared/product-release/product-release-card.tsx +2 -0
  93. package/src/components/ui/radio-group.tsx +51 -36
  94. package/src/components/ui/tab-navigation.tsx +54 -5
@@ -2,10 +2,10 @@
2
2
  "use client";
3
3
 
4
4
 
5
- var _chunkBI3XBCQXcjs = require('../../chunk-BI3XBCQX.cjs');
5
+ var _chunkYIOWV7LScjs = require('../../chunk-YIOWV7LS.cjs');
6
6
 
7
7
 
8
- var _chunkOBODY7F3cjs = require('../../chunk-OBODY7F3.cjs');
8
+ var _chunk4N7KGOBScjs = require('../../chunk-4N7KGOBS.cjs');
9
9
 
10
10
 
11
11
 
@@ -16,7 +16,7 @@ var _chunkOBODY7F3cjs = require('../../chunk-OBODY7F3.cjs');
16
16
 
17
17
 
18
18
 
19
- var _chunk4PKORVOXcjs = require('../../chunk-4PKORVOX.cjs');
19
+ var _chunkHJ4KGA2Mcjs = require('../../chunk-HJ4KGA2M.cjs');
20
20
  require('../../chunk-URVIPSAJ.cjs');
21
21
  require('../../chunk-NTGIQP7O.cjs');
22
22
 
@@ -39,17 +39,17 @@ require('../../chunk-LU7TD6QS.cjs');
39
39
  require('../../chunk-24I6RFVU.cjs');
40
40
  require('../../chunk-A6P6DHEZ.cjs');
41
41
  require('../../chunk-MZ4KBSH7.cjs');
42
- require('../../chunk-YQGDXH3M.cjs');
42
+ require('../../chunk-GAGNKWOC.cjs');
43
43
 
44
44
 
45
45
  var _chunkYUMFVQINcjs = require('../../chunk-YUMFVQIN.cjs');
46
46
 
47
47
 
48
48
 
49
- var _chunkPS6T65KAcjs = require('../../chunk-PS6T65KA.cjs');
49
+ var _chunkOC2LBQQJcjs = require('../../chunk-OC2LBQQJ.cjs');
50
50
 
51
51
 
52
- var _chunk32Q7K5OPcjs = require('../../chunk-32Q7K5OP.cjs');
52
+ var _chunk7YDF3QBNcjs = require('../../chunk-7YDF3QBN.cjs');
53
53
  require('../../chunk-OWGLRE74.cjs');
54
54
  require('../../chunk-3RFQPQ7Z.cjs');
55
55
  require('../../chunk-5TCIRWHL.cjs');
@@ -1852,10 +1852,10 @@ require('../../chunk-7DNL734S.cjs');
1852
1852
  require('../../chunk-WWUSFOJ7.cjs');
1853
1853
  require('../../chunk-SKI6NKOE.cjs');
1854
1854
  require('../../chunk-EWPR7662.cjs');
1855
- require('../../chunk-XAA5EZ5T.cjs');
1855
+ require('../../chunk-JGZEHBBD.cjs');
1856
1856
 
1857
1857
 
1858
- var _chunk5MH6BRPYcjs = require('../../chunk-5MH6BRPY.cjs');
1858
+ var _chunkLJ46XYYPcjs = require('../../chunk-LJ46XYYP.cjs');
1859
1859
  require('../../chunk-QYLIHZKZ.cjs');
1860
1860
  require('../../chunk-63N4FN5V.cjs');
1861
1861
 
@@ -2190,7 +2190,7 @@ function useMeetingBooking(options) {
2190
2190
  const seededOffset = _optionalChain([initialAvailability, 'optionalAccess', _12 => _12.meetingId]) === meetingId ? initialAvailability.monthOffset : void 0;
2191
2191
  const [monthOffset, setMonthOffsetState] = _react.useState.call(void 0, _nullishCoalesce(seededOffset, () => ( 0)));
2192
2192
  const setMonthOffset = _react.useCallback.call(void 0, (offset) => {
2193
- setMonthOffsetState(Math.max(0, Math.min(_chunkPS6T65KAcjs.MAX_MONTH_OFFSET, offset)));
2193
+ setMonthOffsetState(Math.max(0, Math.min(_chunkOC2LBQQJcjs.MAX_MONTH_OFFSET, offset)));
2194
2194
  }, []);
2195
2195
  const prevMeetingIdRef = _react.useRef.call(void 0, meetingId);
2196
2196
  _react.useLayoutEffect.call(void 0, () => {
@@ -2320,7 +2320,7 @@ var FIELD_CONTROLS = {
2320
2320
  }
2321
2321
  ),
2322
2322
  textarea: ({ field, id, registerName, error, register }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2323
- _chunk4PKORVOXcjs.Textarea,
2323
+ _chunkHJ4KGA2Mcjs.Textarea,
2324
2324
  {
2325
2325
  id,
2326
2326
  required: field.required,
@@ -2397,14 +2397,14 @@ var FIELD_CONTROLS = {
2397
2397
  control,
2398
2398
  name: registerName,
2399
2399
  render: ({ field: rhf }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2400
- _chunk4PKORVOXcjs.RadioGroup,
2400
+ _chunkHJ4KGA2Mcjs.RadioGroup,
2401
2401
  {
2402
2402
  value: _nullishCoalesce(rhf.value, () => ( "")),
2403
2403
  onValueChange: rhf.onChange,
2404
2404
  "aria-required": field.required || void 0,
2405
2405
  "aria-invalid": Boolean(error),
2406
2406
  children: (_nullishCoalesce(field.options, () => ( []))).map((opt) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-[var(--spacing-system-xs)]", children: [
2407
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4PKORVOXcjs.RadioGroupItem, { id: `${id}-${opt}`, value: opt }),
2407
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHJ4KGA2Mcjs.RadioGroupItem, { id: `${id}-${opt}`, value: opt }),
2408
2408
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkK6VWTUCHcjs.Label, { htmlFor: `${id}-${opt}`, children: optionLabel(field, opt) })
2409
2409
  ] }, opt))
2410
2410
  }
@@ -2476,6 +2476,9 @@ function BookingForm({
2476
2476
  submitLabel,
2477
2477
  footerNote,
2478
2478
  fieldRows,
2479
+ formId,
2480
+ hideSubmit = false,
2481
+ onValidityChange,
2479
2482
  fieldCopy,
2480
2483
  deniedEmailDomains,
2481
2484
  consent,
@@ -2528,6 +2531,15 @@ function BookingForm({
2528
2531
  const [consented, setConsented] = _react.useState.call(void 0, _optionalChain([initialValues, 'optionalAccess', _21 => _21[HOST_CONSENT_KEY]]) === true);
2529
2532
  const [consentError, setConsentError] = _react.useState.call(void 0, null);
2530
2533
  const consentMissing = Boolean(consent) && !consented;
2534
+ const watchedValues = watch();
2535
+ const liveValid = onValidityChange ? schema.safeParse(watchedValues).success && !consentMissing : false;
2536
+ const lastValidRef = _react.useRef.call(void 0, null);
2537
+ _react.useEffect.call(void 0, () => {
2538
+ if (!onValidityChange) return;
2539
+ if (lastValidRef.current === liveValid) return;
2540
+ lastValidRef.current = liveValid;
2541
+ onValidityChange(liveValid);
2542
+ });
2531
2543
  _react.useEffect.call(void 0, () => {
2532
2544
  const current = _nullishCoalesce(_nullishCoalesce(getValues("legalConsentResponses"), () => ( priorConsents)), () => ( []));
2533
2545
  setValue(
@@ -2640,8 +2652,8 @@ function BookingForm({
2640
2652
  children: _nullishCoalesce(submitLabel, () => ( DEFAULT_SUBMIT_LABEL))
2641
2653
  }
2642
2654
  );
2643
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "form", { onSubmit: submit, className: FORM_STACK, noValidate: true, ..._chunkPS6T65KAcjs.HUBSPOT_DO_NOT_COLLECT_FORM_PROPS, children: [
2644
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4PKORVOXcjs.HoneypotField, { ...honeypotInputProps }),
2655
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "form", { id: formId, onSubmit: submit, className: FORM_STACK, noValidate: true, ..._chunkOC2LBQQJcjs.HUBSPOT_DO_NOT_COLLECT_FORM_PROPS, children: [
2656
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHJ4KGA2Mcjs.HoneypotField, { ...honeypotInputProps }),
2645
2657
  fieldRows ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
2646
2658
  placedRows.map((row) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: ROW_GRID, children: row.map((slot, slotIndex) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: slotColumnClass(row, slot, slotIndex), children: slotNode(slot.name) }, slot.name)) }, row.map((s) => s.name).join("|"))),
2647
2659
  [...unplacedBuiltIns, ...unplacedFields].map((field) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react.Fragment, { children: slotNode(field.name) }, field.name))
@@ -2654,7 +2666,7 @@ function BookingForm({
2654
2666
  supportedFields.map((field) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react.Fragment, { children: renderDeclaredField(field) }, field.name))
2655
2667
  ] }),
2656
2668
  consent && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2657
- _chunk4PKORVOXcjs.CheckboxBlock,
2669
+ _chunkHJ4KGA2Mcjs.CheckboxBlock,
2658
2670
  {
2659
2671
  id: "ms-host-consent",
2660
2672
  checked: consented,
@@ -2689,7 +2701,7 @@ function BookingForm({
2689
2701
  // same block the waitlist form uses): box + label in one
2690
2702
  // bordered row.
2691
2703
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2692
- _chunk4PKORVOXcjs.CheckboxBlock,
2704
+ _chunkHJ4KGA2Mcjs.CheckboxBlock,
2693
2705
  {
2694
2706
  id: `ms-consent-${box.communicationTypeId}`,
2695
2707
  checked: _nullishCoalesce(_optionalChain([current, 'optionalAccess', _34 => _34.consented]), () => ( false)),
@@ -2709,7 +2721,7 @@ function BookingForm({
2709
2721
  ),
2710
2722
  legalConsent.privacyPolicyText && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: legalConsent.privacyPolicyText })
2711
2723
  ] }) }),
2712
- footerNote ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: FOOTER_ROW_CLASS, children: [
2724
+ hideSubmit ? null : footerNote ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: FOOTER_ROW_CLASS, children: [
2713
2725
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: footerNote }),
2714
2726
  submitButton
2715
2727
  ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: FOOTER_BARE_CLASS, children: submitButton })
@@ -2884,7 +2896,7 @@ function SchedulerContextPanel({
2884
2896
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, STRIP_ASIDE, locked && "content-max-lg:hidden"), children: [
2885
2897
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: FIELD_LABEL_CLASS, children: "Timezone" }),
2886
2898
  timezone ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2887
- _chunk4PKORVOXcjs.TimezoneSelect,
2899
+ _chunkHJ4KGA2Mcjs.TimezoneSelect,
2888
2900
  {
2889
2901
  value: timezone,
2890
2902
  disabled,
@@ -2898,6 +2910,103 @@ function SchedulerContextPanel({
2898
2910
  ] });
2899
2911
  }
2900
2912
 
2913
+ // src/components/meeting-scheduler/modal-header.tsx
2914
+
2915
+ var ROW_CLASS = "border-b border-ods-border p-[var(--spacing-system-m)]";
2916
+ var STRIP_CLASS = _chunk3ATAYP36cjs.cn.call(void 0, ROW_CLASS, "flex items-center justify-between gap-[var(--spacing-system-m)]");
2917
+ var FIELD_LABEL_CLASS2 = "text-h4 text-ods-text-primary";
2918
+ function HostIdentity({ hosts }) {
2919
+ if (hosts.length === 0) return null;
2920
+ if (hosts.length > 3) {
2921
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 flex-col gap-[var(--spacing-system-xxs)]", children: [
2922
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUY6A6TEYcjs.AvatarStack, { people: hosts, max: 4, size: "lg", label: "Hosts" }),
2923
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: [
2924
+ hosts.length,
2925
+ " hosts on this calendar"
2926
+ ] })
2927
+ ] });
2928
+ }
2929
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex min-w-0 flex-col gap-[var(--spacing-system-s)]", children: hosts.map((host) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-[var(--spacing-system-xs)]", children: [
2930
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2931
+ _chunkABLUMGCIcjs.SquareAvatar,
2932
+ {
2933
+ variant: "round",
2934
+ size: "sm",
2935
+ src: _nullishCoalesce(host.avatarUrl, () => ( void 0)),
2936
+ alt: host.name,
2937
+ fallback: host.name
2938
+ }
2939
+ ),
2940
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 flex-col", children: [
2941
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "truncate text-ods-text-primary text-h4", children: host.name }),
2942
+ host.title && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "truncate text-ods-text-secondary text-h6", children: host.title })
2943
+ ] })
2944
+ ] }, host.name)) });
2945
+ }
2946
+ function SchedulerModalHeader({
2947
+ hosts,
2948
+ durationsMs,
2949
+ selectedDurationMs,
2950
+ onSelectDuration,
2951
+ timezone,
2952
+ onTimezoneChange,
2953
+ locked = false,
2954
+ disabled = false,
2955
+ showTimezone = true
2956
+ }) {
2957
+ const chips = !locked && durationsMs.length > 1;
2958
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
2959
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: STRIP_CLASS, children: [
2960
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HostIdentity, { hosts }),
2961
+ chips ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex shrink-0 flex-wrap justify-end gap-[var(--spacing-system-xs)]", children: durationsMs.map((ms) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2962
+ _chunk2QMBXGMQcjs.Button,
2963
+ {
2964
+ variant: selectedDurationMs === ms ? void 0 : "outline",
2965
+ size: "small-legacy",
2966
+ disabled,
2967
+ onClick: () => onSelectDuration(ms),
2968
+ children: _chunkABLUMGCIcjs.formatDurationCompact.call(void 0, ms / 1e3)
2969
+ },
2970
+ ms
2971
+ )) }) : selectedDurationMs != null && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { className: "shrink-0 text-ods-text-secondary text-h6", children: [
2972
+ _chunkABLUMGCIcjs.formatDurationCompact.call(void 0, selectedDurationMs / 1e3),
2973
+ " call"
2974
+ ] })
2975
+ ] }),
2976
+ showTimezone && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, ROW_CLASS, "flex flex-col gap-[var(--spacing-system-xxs)]"), children: [
2977
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: FIELD_LABEL_CLASS2, children: "Timezone" }),
2978
+ timezone ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2979
+ _chunkHJ4KGA2Mcjs.TimezoneSelect,
2980
+ {
2981
+ value: timezone,
2982
+ disabled,
2983
+ onChange: (tz) => {
2984
+ if (tz) _optionalChain([onTimezoneChange, 'optionalCall', _36 => _36(tz)]);
2985
+ }
2986
+ }
2987
+ ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5M5C6UV4cjs.Skeleton, { className: "h-12 w-full" })
2988
+ ] })
2989
+ ] });
2990
+ }
2991
+ function SchedulerModalHeaderSkeleton() {
2992
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
2993
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: STRIP_CLASS, children: [
2994
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-[var(--spacing-system-xs)]", children: [
2995
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5M5C6UV4cjs.Skeleton, { className: "h-8 w-8 shrink-0 rounded-full" }),
2996
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-[var(--spacing-system-xxs)]", children: [
2997
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5M5C6UV4cjs.Skeleton, { className: "h-5 w-32" }),
2998
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5M5C6UV4cjs.Skeleton, { className: "h-4 w-24" })
2999
+ ] })
3000
+ ] }),
3001
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5M5C6UV4cjs.Skeleton, { className: "h-4 w-20 shrink-0" })
3002
+ ] }),
3003
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, ROW_CLASS, "flex flex-col gap-[var(--spacing-system-xxs)]"), children: [
3004
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: FIELD_LABEL_CLASS2, children: "Timezone" }),
3005
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5M5C6UV4cjs.Skeleton, { className: "h-12 w-full" })
3006
+ ] })
3007
+ ] });
3008
+ }
3009
+
2901
3010
  // src/components/meeting-scheduler/slot-picker.tsx
2902
3011
  var _lucidereact = require('lucide-react');
2903
3012
 
@@ -2957,6 +3066,15 @@ var SLOT_ROW_CLASS = _chunk3ATAYP36cjs.cn.call(void 0,
2957
3066
  );
2958
3067
  var COLUMN_BOX = "p-[var(--spacing-system-l)] content-lg:p-0";
2959
3068
  var COLUMN_DIVIDER = "border-b border-ods-border content-md:border-b-0 content-md:border-r content-lg:border-0";
3069
+ var MODAL_ROW_CLASS = "flex min-w-0 flex-col content-md:flex-row content-md:items-start";
3070
+ var MODAL_CALENDAR_W = "content-md:w-[19rem] content-md:shrink-0";
3071
+ var MODAL_COLUMN_BOX = "p-[var(--spacing-system-m)]";
3072
+ var MODAL_COLUMN_DIVIDER = "border-b border-ods-border content-md:border-b-0 content-md:border-r";
3073
+ var MODAL_TIMES_H = "content-md:h-[21.5rem]";
3074
+ var MODAL_CHIP_GRID_CLASS = _chunk3ATAYP36cjs.cn.call(void 0,
3075
+ "grid grid-cols-4 content-start gap-[var(--spacing-system-xs)] overflow-y-auto content-md:grid-cols-1",
3076
+ "max-h-[9.75rem] min-h-0 flex-1 content-md:max-h-none"
3077
+ );
2960
3078
  function monthLabelFor(offset) {
2961
3079
  const now = /* @__PURE__ */ new Date();
2962
3080
  const month = new Date(now.getFullYear(), now.getMonth() + offset, 1);
@@ -2967,18 +3085,18 @@ var NOOP = () => void 0;
2967
3085
  function DayCalendar({ monthOffset, onMonthOffsetChange, selectedDay, onSelectDay, slotsByDay }) {
2968
3086
  const now = /* @__PURE__ */ new Date();
2969
3087
  const startMonth = new Date(now.getFullYear(), now.getMonth(), 1);
2970
- const endMonth = new Date(now.getFullYear(), now.getMonth() + _chunkPS6T65KAcjs.MAX_MONTH_OFFSET + 1, 0);
3088
+ const endMonth = new Date(now.getFullYear(), now.getMonth() + _chunkOC2LBQQJcjs.MAX_MONTH_OFFSET + 1, 0);
2971
3089
  const visibleMonth = new Date(now.getFullYear(), now.getMonth() + monthOffset, 1);
2972
- const dayHasNoSlots = _react.useCallback.call(void 0, (day) => !_optionalChain([slotsByDay, 'optionalAccess', _36 => _36.has, 'call', _37 => _37(calendarDayKey(day))]), [slotsByDay]);
3090
+ const dayHasNoSlots = _react.useCallback.call(void 0, (day) => !_optionalChain([slotsByDay, 'optionalAccess', _37 => _37.has, 'call', _38 => _38(calendarDayKey(day))]), [slotsByDay]);
2973
3091
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex min-h-0 flex-1 flex-col", "aria-busy": slotsByDay === null, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2974
- _chunk4PKORVOXcjs.DatePickerCalendar,
3092
+ _chunkHJ4KGA2Mcjs.DatePickerCalendar,
2975
3093
  {
2976
3094
  mode: "single",
2977
3095
  bare: true,
2978
3096
  month: visibleMonth,
2979
3097
  onMonthChange: (month) => {
2980
3098
  const offset = (month.getFullYear() - now.getFullYear()) * 12 + (month.getMonth() - now.getMonth());
2981
- onMonthOffsetChange(Math.max(0, Math.min(_chunkPS6T65KAcjs.MAX_MONTH_OFFSET, offset)));
3099
+ onMonthOffsetChange(Math.max(0, Math.min(_chunkOC2LBQQJcjs.MAX_MONTH_OFFSET, offset)));
2982
3100
  },
2983
3101
  fromDate: startMonth,
2984
3102
  toDate: endMonth,
@@ -2987,28 +3105,44 @@ function DayCalendar({ monthOffset, onMonthOffsetChange, selectedDay, onSelectDa
2987
3105
  const day = value;
2988
3106
  if (!day) return;
2989
3107
  const key = calendarDayKey(day);
2990
- if (_optionalChain([slotsByDay, 'optionalAccess', _38 => _38.has, 'call', _39 => _39(key)])) onSelectDay(key);
3108
+ if (_optionalChain([slotsByDay, 'optionalAccess', _39 => _39.has, 'call', _40 => _40(key)])) onSelectDay(key);
2991
3109
  },
2992
3110
  disabledDays: slotsByDay === null ? DISABLE_EVERY_DAY : dayHasNoSlots
2993
3111
  }
2994
3112
  ) });
2995
3113
  }
2996
- function SlotPickerSkeleton({ monthOffset = 0 }) {
2997
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: SLOT_ROW_CLASS, children: [
2998
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, COLUMN_BOX, COLUMN_DIVIDER, CALENDAR_W, "content-md:overflow-y-auto"), children: [
2999
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: COLUMN_HEADING_CLASS, children: SLOT_PICKER_HEADING }),
3000
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3001
- DayCalendar,
3002
- {
3003
- monthOffset,
3004
- onMonthOffsetChange: NOOP,
3005
- selectedDay: null,
3006
- onSelectDay: NOOP,
3007
- slotsByDay: null
3008
- }
3009
- )
3010
- ] }),
3011
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, COLUMN_BOX, "min-w-0 content-md:flex-1"), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TimeChipsSkeleton, {}) })
3114
+ function SlotPickerSkeleton({
3115
+ monthOffset = 0,
3116
+ layout = "card"
3117
+ }) {
3118
+ const modal = layout === "modal";
3119
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: modal ? MODAL_ROW_CLASS : SLOT_ROW_CLASS, children: [
3120
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
3121
+ "div",
3122
+ {
3123
+ className: modal ? _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, MODAL_COLUMN_BOX, MODAL_COLUMN_DIVIDER, MODAL_CALENDAR_W) : _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, COLUMN_BOX, COLUMN_DIVIDER, CALENDAR_W, "content-md:overflow-y-auto"),
3124
+ children: [
3125
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: COLUMN_HEADING_CLASS, children: SLOT_PICKER_HEADING }),
3126
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3127
+ DayCalendar,
3128
+ {
3129
+ monthOffset,
3130
+ onMonthOffsetChange: NOOP,
3131
+ selectedDay: null,
3132
+ onSelectDay: NOOP,
3133
+ slotsByDay: null
3134
+ }
3135
+ )
3136
+ ]
3137
+ }
3138
+ ),
3139
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3140
+ "div",
3141
+ {
3142
+ className: modal ? _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, MODAL_COLUMN_BOX, MODAL_TIMES_H, "min-w-0 content-md:flex-1") : _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, COLUMN_BOX, "min-w-0 content-md:flex-1"),
3143
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TimeChipsSkeleton, {})
3144
+ }
3145
+ )
3012
3146
  ] });
3013
3147
  }
3014
3148
  function TimeChipsSkeleton() {
@@ -3022,6 +3156,7 @@ function TimeChipsSkeleton() {
3022
3156
  }
3023
3157
  function SlotPicker({
3024
3158
  slots,
3159
+ layout = "card",
3025
3160
  timezone,
3026
3161
  monthOffset,
3027
3162
  onMonthOffsetChange,
@@ -3050,64 +3185,77 @@ function SlotPicker({
3050
3185
  const daySlots = selectedDay ? _nullishCoalesce(slotsByDay.get(selectedDay), () => ( [])) : [];
3051
3186
  const monthPrefix = `${visibleMonth.getFullYear()}-${String(visibleMonth.getMonth() + 1).padStart(2, "0")}`;
3052
3187
  const monthHasSlots = [...slotsByDay.keys()].some((key) => key.startsWith(monthPrefix));
3053
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: SLOT_ROW_CLASS, children: [
3054
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, COLUMN_BOX, COLUMN_DIVIDER, CALENDAR_W, "content-md:overflow-y-auto"), children: [
3055
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: COLUMN_HEADING_CLASS, children: SLOT_PICKER_HEADING }),
3056
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3057
- DayCalendar,
3058
- {
3059
- monthOffset,
3060
- onMonthOffsetChange,
3061
- selectedDay,
3062
- onSelectDay,
3063
- slotsByDay: isLoading ? null : slotsByDay
3064
- }
3065
- )
3066
- ] }),
3067
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, COLUMN_BOX, "min-w-0 content-md:flex-1"), children: isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TimeChipsSkeleton, {}) : selectedDay ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
3068
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: COLUMN_HEADING_CLASS, children: _chunkABLUMGCIcjs.formatDateWithTimezone.call(void 0, dateFromDayKey(selectedDay), _chunkABLUMGCIcjs.VIEWER_TIMEZONE, "weekday", { viewerLocale: true }) }),
3069
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: CHIP_GRID_CLASS, children: daySlots.map((ms) => {
3070
- const isSelected = selectedSlot === ms;
3071
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3072
- _chunk2QMBXGMQcjs.Button,
3073
- {
3074
- variant: isSelected ? void 0 : "outline",
3075
- disabled: isSubmitting,
3076
- loading: isSubmitting && isSelected,
3077
- onClick: () => {
3078
- if (isSubmitting) return;
3079
- onSelectSlot(ms);
3080
- },
3081
- className: CHIP_CLASS,
3082
- children: timeLabelInZone(ms, timezone)
3083
- },
3084
- ms
3085
- );
3086
- }) })
3087
- ] }) : monthHasSlots ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: "Pick a day to see available times." }) : (
3088
- // A fully-booked month used to just SAY "try the next one" and leave
3089
- // the visitor to find the chevron in the other column. The way out
3090
- // of a dead end belongs in the dead end.
3091
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col items-start gap-[var(--spacing-system-s)]", children: [
3092
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: [
3093
- "No available times in ",
3094
- monthLabelFor(monthOffset),
3095
- "."
3096
- ] }),
3097
- monthOffset < _chunkPS6T65KAcjs.MAX_MONTH_OFFSET && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
3098
- _chunk2QMBXGMQcjs.Button,
3099
- {
3100
- variant: "outline",
3101
- onClick: () => onMonthOffsetChange(monthOffset + 1),
3102
- rightIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronRight, { className: "size-5" }),
3103
- children: [
3104
- "Check ",
3105
- monthLabelFor(monthOffset + 1)
3106
- ]
3107
- }
3188
+ const modal = layout === "modal";
3189
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: modal ? MODAL_ROW_CLASS : SLOT_ROW_CLASS, children: [
3190
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
3191
+ "div",
3192
+ {
3193
+ className: modal ? _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, MODAL_COLUMN_BOX, MODAL_COLUMN_DIVIDER, MODAL_CALENDAR_W) : _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, COLUMN_BOX, COLUMN_DIVIDER, CALENDAR_W, "content-md:overflow-y-auto"),
3194
+ children: [
3195
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: COLUMN_HEADING_CLASS, children: SLOT_PICKER_HEADING }),
3196
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3197
+ DayCalendar,
3198
+ {
3199
+ monthOffset,
3200
+ onMonthOffsetChange,
3201
+ selectedDay,
3202
+ onSelectDay,
3203
+ slotsByDay: isLoading ? null : slotsByDay
3204
+ }
3205
+ )
3206
+ ]
3207
+ }
3208
+ ),
3209
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3210
+ "div",
3211
+ {
3212
+ className: modal ? _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, MODAL_COLUMN_BOX, MODAL_TIMES_H, "min-w-0 content-md:flex-1") : _chunk3ATAYP36cjs.cn.call(void 0, COLUMN_STACK, COLUMN_BOX, "min-w-0 content-md:flex-1"),
3213
+ children: isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TimeChipsSkeleton, {}) : selectedDay ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
3214
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: COLUMN_HEADING_CLASS, children: _chunkABLUMGCIcjs.formatDateWithTimezone.call(void 0, dateFromDayKey(selectedDay), _chunkABLUMGCIcjs.VIEWER_TIMEZONE, "weekday", { viewerLocale: true }) }),
3215
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: modal ? MODAL_CHIP_GRID_CLASS : CHIP_GRID_CLASS, children: daySlots.map((ms) => {
3216
+ const isSelected = selectedSlot === ms;
3217
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3218
+ _chunk2QMBXGMQcjs.Button,
3219
+ {
3220
+ variant: isSelected ? void 0 : "outline",
3221
+ disabled: isSubmitting,
3222
+ loading: isSubmitting && isSelected,
3223
+ onClick: () => {
3224
+ if (isSubmitting) return;
3225
+ onSelectSlot(ms);
3226
+ },
3227
+ className: CHIP_CLASS,
3228
+ children: timeLabelInZone(ms, timezone)
3229
+ },
3230
+ ms
3231
+ );
3232
+ }) })
3233
+ ] }) : monthHasSlots ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: "Pick a day to see available times." }) : (
3234
+ // A fully-booked month used to just SAY "try the next one" and leave
3235
+ // the visitor to find the chevron in the other column. The way out
3236
+ // of a dead end belongs in the dead end.
3237
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col items-start gap-[var(--spacing-system-s)]", children: [
3238
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: [
3239
+ "No available times in ",
3240
+ monthLabelFor(monthOffset),
3241
+ "."
3242
+ ] }),
3243
+ monthOffset < _chunkOC2LBQQJcjs.MAX_MONTH_OFFSET && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
3244
+ _chunk2QMBXGMQcjs.Button,
3245
+ {
3246
+ variant: "outline",
3247
+ onClick: () => onMonthOffsetChange(monthOffset + 1),
3248
+ rightIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronRight, { className: "size-5" }),
3249
+ children: [
3250
+ "Check ",
3251
+ monthLabelFor(monthOffset + 1)
3252
+ ]
3253
+ }
3254
+ )
3255
+ ] })
3108
3256
  )
3109
- ] })
3110
- ) })
3257
+ }
3258
+ )
3111
3259
  ] });
3112
3260
  }
3113
3261
 
@@ -3116,7 +3264,7 @@ function SlotPicker({
3116
3264
 
3117
3265
 
3118
3266
  function useNextAvailableLabel(ms) {
3119
- const hydrated = _chunk32Q7K5OPcjs.useIsHydrated.call(void 0, );
3267
+ const hydrated = _chunk7YDF3QBNcjs.useIsHydrated.call(void 0, );
3120
3268
  return _react.useMemo.call(void 0, () => {
3121
3269
  if (!hydrated || ms == null) return null;
3122
3270
  return _chunkABLUMGCIcjs.formatDateWithTimezone.call(void 0, ms, _chunkABLUMGCIcjs.VIEWER_TIMEZONE, "shortWeekdayDateTime", { viewerLocale: true }) || null;
@@ -3144,7 +3292,7 @@ function DirectoryRow({
3144
3292
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "truncate text-ods-text-primary text-h3", children: link.title }),
3145
3293
  subtitle && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "truncate text-ods-text-secondary text-h6", children: subtitle })
3146
3294
  ] }),
3147
- audienceLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5MH6BRPYcjs.StatusBadge, { text: `For ${audienceLabel}`, singleLine: true, className: "hidden shrink-0 content-sm:inline-flex" }),
3295
+ audienceLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLJ46XYYPcjs.StatusBadge, { text: `For ${audienceLabel}`, singleLine: true, className: "hidden shrink-0 content-sm:inline-flex" }),
3148
3296
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUY6A6TEYcjs.AvatarStack, { people: link.hosts, max: 3, size: "md", label: "Hosts", className: "flex shrink-0" }),
3149
3297
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "hidden w-44 shrink-0 flex-col items-end justify-center content-md:flex", children: [
3150
3298
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: "Next available" }),
@@ -3211,7 +3359,7 @@ function MeetingSchedulerDirectory({
3211
3359
  };
3212
3360
  }, [initialData, includeAll, apiBaseUrl]);
3213
3361
  const rows = _react.useMemo.call(void 0, () => {
3214
- const purposes = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _40 => _40.purposes]), () => ( []));
3362
+ const purposes = _nullishCoalesce(_optionalChain([data, 'optionalAccess', _41 => _41.purposes]), () => ( []));
3215
3363
  return purposes.flatMap((p) => p.links.map((link) => ({ link, audienceLabel: p.label })));
3216
3364
  }, [data]);
3217
3365
  const totalPages = _chunkBLH2SFOOcjs.pageCount.call(void 0, rows.length, pageSize);
@@ -3225,7 +3373,7 @@ function MeetingSchedulerDirectory({
3225
3373
  }
3226
3374
  if (error) {
3227
3375
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex flex-col justify-center", className), style: { minHeight: rowsMinHeight + 104 }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3228
- _chunkOBODY7F3cjs.EmptyState,
3376
+ _chunk4N7KGOBScjs.EmptyState,
3229
3377
  {
3230
3378
  type: "generic",
3231
3379
  title: "We couldn't load available call times",
@@ -3236,7 +3384,7 @@ function MeetingSchedulerDirectory({
3236
3384
  }
3237
3385
  if (rows.length === 0) {
3238
3386
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex flex-col justify-center", className), style: { minHeight: rowsMinHeight + 104 }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3239
- _chunkOBODY7F3cjs.EmptyState,
3387
+ _chunk4N7KGOBScjs.EmptyState,
3240
3388
  {
3241
3389
  type: "generic",
3242
3390
  title: "No call times are published right now",
@@ -3248,7 +3396,7 @@ function MeetingSchedulerDirectory({
3248
3396
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex flex-col", className), children: [
3249
3397
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex w-full flex-col gap-4", style: { minHeight: rowsMinHeight }, children: pageRows.map(({ link, audienceLabel }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, DirectoryRow, { link, audienceLabel, bookingBasePath }, link.id)) }),
3250
3398
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "mt-8 flex w-full items-center justify-center", PAGINATION_SLOT_H), children: totalPages > 1 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3251
- _chunkBI3XBCQXcjs.PersistentPaginationWrapper,
3399
+ _chunkYIOWV7LScjs.PersistentPaginationWrapper,
3252
3400
  {
3253
3401
  isLoading,
3254
3402
  currentPage: page,
@@ -3319,6 +3467,18 @@ function isNativelyBookable(availability) {
3319
3467
  }
3320
3468
  return true;
3321
3469
  }
3470
+ var MODAL_STACK_CLASS = "flex flex-col gap-[var(--spacing-system-l)]";
3471
+ var MODAL_CARD_CLASS = "flex flex-col overflow-hidden rounded-md border border-ods-border bg-ods-card";
3472
+ var MODAL_STEP_CLASS = "flex flex-col p-[var(--spacing-system-m)]";
3473
+ var NOOP2 = () => void 0;
3474
+ var MODAL_FIELD_ROWS = [[{ name: "firstName" }, { name: "lastName" }], [{ name: "email" }]];
3475
+ var MODAL_PRIMARY_CLASS = "flex-1 content-md:min-w-[15.5rem] content-md:flex-none";
3476
+ function ModalFooter({ onCancel, primary }) {
3477
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex gap-[var(--spacing-system-l)] content-md:justify-end", children: [
3478
+ onCancel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2QMBXGMQcjs.Button, { variant: "outline", onClick: onCancel, className: "flex-1 content-md:hidden", children: "Cancel" }),
3479
+ primary
3480
+ ] });
3481
+ }
3322
3482
  function HubSpotMeetingScheduler({
3323
3483
  meetingId,
3324
3484
  apiBaseUrl = "",
@@ -3335,7 +3495,8 @@ function HubSpotMeetingScheduler({
3335
3495
  flow = DEFAULT_SCHEDULER_FLOW,
3336
3496
  detailsForm: DetailsForm = BookingForm,
3337
3497
  detailsFormProps,
3338
- rescue = null
3498
+ rescue = null,
3499
+ layout = "card"
3339
3500
  }) {
3340
3501
  const {
3341
3502
  availability,
@@ -3349,7 +3510,10 @@ function HubSpotMeetingScheduler({
3349
3510
  isSubmitting
3350
3511
  } = useMeetingBooking({ meetingId, apiBaseUrl, initialAvailability });
3351
3512
  const detailsFirst = flow === "details-first";
3352
- const hydrated = _chunk32Q7K5OPcjs.useIsHydrated.call(void 0, );
3513
+ const modal = layout === "modal" && !detailsFirst;
3514
+ const modalFormId = _react.useId.call(void 0, );
3515
+ const [modalFormValid, setModalFormValid] = _react.useState.call(void 0, false);
3516
+ const hydrated = _chunk7YDF3QBNcjs.useIsHydrated.call(void 0, );
3353
3517
  const [pickedTimezone, setTimezone] = _react.useState.call(void 0, null);
3354
3518
  const resolvedLocalTimezone = _react.useMemo.call(void 0, () => {
3355
3519
  if (!hydrated) return null;
@@ -3368,7 +3532,7 @@ function HubSpotMeetingScheduler({
3368
3532
  onStageChangeRef.current = onStageChange;
3369
3533
  });
3370
3534
  _react.useEffect.call(void 0, () => {
3371
- _optionalChain([onStageChangeRef, 'access', _41 => _41.current, 'optionalCall', _42 => _42(stage)]);
3535
+ _optionalChain([onStageChangeRef, 'access', _42 => _42.current, 'optionalCall', _43 => _43(stage)]);
3372
3536
  }, [stage]);
3373
3537
  const [stash, setStash] = _react.useState.call(void 0, null);
3374
3538
  const inFlightRef = _react.useRef.call(void 0, false);
@@ -3399,8 +3563,8 @@ function HubSpotMeetingScheduler({
3399
3563
  _react.useEffect.call(void 0, () => {
3400
3564
  autoAdvanceCount.current = 0;
3401
3565
  }, [meetingId]);
3402
- const durations = _react.useMemo.call(void 0, () => _nullishCoalesce(_optionalChain([availability, 'optionalAccess', _43 => _43.durationsMs]), () => ( [])), [_optionalChain([availability, 'optionalAccess', _44 => _44.durationsMs])]);
3403
- const shownHosts = _nullishCoalesce(_nullishCoalesce(hosts, () => ( _optionalChain([availability, 'optionalAccess', _45 => _45.hosts]))), () => ( []));
3566
+ const durations = _react.useMemo.call(void 0, () => _nullishCoalesce(_optionalChain([availability, 'optionalAccess', _44 => _44.durationsMs]), () => ( [])), [_optionalChain([availability, 'optionalAccess', _45 => _45.durationsMs])]);
3567
+ const shownHosts = _nullishCoalesce(_nullishCoalesce(hosts, () => ( _optionalChain([availability, 'optionalAccess', _46 => _46.hosts]))), () => ( []));
3404
3568
  const durationMs = _nullishCoalesce(_nullishCoalesce(pickedDurationMs, () => ( durations[0])), () => ( null));
3405
3569
  const slots = _react.useMemo.call(void 0, () => {
3406
3570
  if (!availability || durationMs == null) return [];
@@ -3460,7 +3624,7 @@ function HubSpotMeetingScheduler({
3460
3624
  _chunk4FWURR3Wcjs.completeFormRescue.call(void 0, rescue, payload[_chunkW2RM764Dcjs.FORM_RESCUE_ATTEMPT_FIELD]);
3461
3625
  setConfirmation(result.confirmation);
3462
3626
  setStep("confirmed");
3463
- _optionalChain([onBooked, 'optionalCall', _46 => _46(result.confirmation)]);
3627
+ _optionalChain([onBooked, 'optionalCall', _47 => _47(result.confirmation)]);
3464
3628
  return;
3465
3629
  }
3466
3630
  const code = _nullishCoalesce(result.code, () => ( "TEMPORARILY_UNAVAILABLE"));
@@ -3499,6 +3663,21 @@ function HubSpotMeetingScheduler({
3499
3663
  const stepPanelClass = _chunk3ATAYP36cjs.cn.call(void 0, STEP_PANEL_CLASS, detailsFirst && boxed && "min-h-0 overflow-y-auto");
3500
3664
  const degraded = (message) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SchedulerDegradedCard, { flow, className, message, action: escapeHatch });
3501
3665
  const degradedCard = degraded("We couldn't load available call times. Please try again shortly.");
3666
+ if (modal && isLoadingAvailability && !availability) {
3667
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, MODAL_STACK_CLASS, className), children: [
3668
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: MODAL_CARD_CLASS, children: [
3669
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SchedulerModalHeaderSkeleton, {}),
3670
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SlotPickerSkeleton, { monthOffset, layout: "modal" })
3671
+ ] }),
3672
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3673
+ ModalFooter,
3674
+ {
3675
+ onCancel: onBack,
3676
+ primary: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2QMBXGMQcjs.Button, { disabled: true, onClick: NOOP2, className: MODAL_PRIMARY_CLASS, children: "Continue" })
3677
+ }
3678
+ )
3679
+ ] });
3680
+ }
3502
3681
  if (isLoadingAvailability && !availability) {
3503
3682
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: cardClass, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: innerClass, children: [
3504
3683
  !formOnly && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContextPanelSkeleton, { onBack: backEdge, className: CONTEXT_PANEL_CLASS }),
@@ -3508,8 +3687,8 @@ function HubSpotMeetingScheduler({
3508
3687
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: stepPanelClass, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3509
3688
  BookingFormSkeleton,
3510
3689
  {
3511
- fieldRows: _optionalChain([detailsFormProps, 'optionalAccess', _47 => _47.fieldRows]),
3512
- consent: Boolean(_optionalChain([detailsFormProps, 'optionalAccess', _48 => _48.consent])),
3690
+ fieldRows: _optionalChain([detailsFormProps, 'optionalAccess', _48 => _48.fieldRows]),
3691
+ consent: Boolean(_optionalChain([detailsFormProps, 'optionalAccess', _49 => _49.consent])),
3513
3692
  footerNote: preset.footerNote
3514
3693
  }
3515
3694
  ) })
@@ -3520,6 +3699,121 @@ function HubSpotMeetingScheduler({
3520
3699
  if (!isNativelyBookable(availability)) {
3521
3700
  return degraded("This meeting type is booked directly on HubSpot.");
3522
3701
  }
3702
+ if (modal) {
3703
+ const modalBack = step === "details" ? backToSlot : onBack;
3704
+ const onSelectDuration = (ms) => {
3705
+ setDurationMs(ms);
3706
+ setSelectedDay(null);
3707
+ setSelectedSlot(null);
3708
+ };
3709
+ const summary = selectedSlot != null && durationMs != null && timezone != null ? `${_chunkABLUMGCIcjs.formatDateWithTimezone.call(void 0, selectedSlot, timezone, "weekdayDateTimeZoned", { viewerLocale: true })} \xB7 ${_chunkABLUMGCIcjs.formatDurationCompact.call(void 0, durationMs / 1e3)}` : null;
3710
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, MODAL_STACK_CLASS, className), children: [
3711
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: MODAL_CARD_CLASS, children: [
3712
+ modalBack && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3713
+ _chunkU2O5YQRPcjs.BackButton,
3714
+ {
3715
+ onClick: modalBack,
3716
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
3717
+ "px-[var(--spacing-system-m)] pt-[var(--spacing-system-m)]",
3718
+ step === "slot" && "content-md:hidden"
3719
+ )
3720
+ }
3721
+ ),
3722
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3723
+ SchedulerModalHeader,
3724
+ {
3725
+ hosts: shownHosts,
3726
+ durationsMs: durations,
3727
+ selectedDurationMs: durationMs,
3728
+ onSelectDuration,
3729
+ timezone,
3730
+ onTimezoneChange: setTimezone,
3731
+ locked: step !== "slot",
3732
+ showTimezone: step === "slot"
3733
+ }
3734
+ ),
3735
+ step === "confirmed" && confirmation && timezone ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: MODAL_STEP_CLASS, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Confirmation, { confirmation, timezone }) }) : step === "details" && durationMs != null && selectedSlot != null && timezone ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, MODAL_STEP_CLASS, "gap-[var(--spacing-system-m)]"), children: [
3736
+ summary && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-primary text-h4", children: summary }),
3737
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3738
+ DetailsForm,
3739
+ {
3740
+ fieldRows: MODAL_FIELD_ROWS,
3741
+ ...detailsFormProps,
3742
+ availability,
3743
+ meetingId,
3744
+ startTimeMs: selectedSlot,
3745
+ durationMs,
3746
+ timezone,
3747
+ formId: modalFormId,
3748
+ hideSubmit: true,
3749
+ onValidityChange: setModalFormValid,
3750
+ isSubmitting,
3751
+ onSubmit: handleSubmit,
3752
+ honeypotInputProps,
3753
+ getSignals,
3754
+ rescue
3755
+ }
3756
+ )
3757
+ ] }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
3758
+ bookingError === "SLOT_TAKEN" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHJ4KGA2Mcjs.Alert, { variant: "warning", className: "mx-[var(--spacing-system-m)] mt-[var(--spacing-system-m)] w-auto", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHJ4KGA2Mcjs.AlertDescription, { children: "That time was just taken \u2014 pick another slot below. (If you already submitted, check your email for a confirmation before rebooking.)" }) }),
3759
+ timezone && durationMs != null ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3760
+ SlotPicker,
3761
+ {
3762
+ layout: "modal",
3763
+ slots,
3764
+ timezone,
3765
+ monthOffset,
3766
+ onMonthOffsetChange: (o) => {
3767
+ setSelectedDay(null);
3768
+ setSelectedSlot(null);
3769
+ setMonthOffset(o);
3770
+ },
3771
+ selectedSlot,
3772
+ onSelectSlot: setSelectedSlot,
3773
+ selectedDay,
3774
+ onSelectDay: setSelectedDay,
3775
+ isLoading: isLoadingAvailability
3776
+ }
3777
+ ) : durations.length === 0 && !isFetchingAvailability ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, MODAL_STEP_CLASS, "items-start gap-[var(--spacing-system-m)]"), children: [
3778
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: "No call times are published right now." }),
3779
+ escapeHatch
3780
+ ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SlotPickerSkeleton, { monthOffset, layout: "modal" })
3781
+ ] })
3782
+ ] }),
3783
+ step === "slot" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3784
+ ModalFooter,
3785
+ {
3786
+ onCancel: onBack,
3787
+ primary: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3788
+ _chunk2QMBXGMQcjs.Button,
3789
+ {
3790
+ disabled: selectedSlot == null || durationMs == null,
3791
+ onClick: () => setStep("details"),
3792
+ className: MODAL_PRIMARY_CLASS,
3793
+ children: "Continue"
3794
+ }
3795
+ )
3796
+ }
3797
+ ),
3798
+ step === "details" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3799
+ ModalFooter,
3800
+ {
3801
+ onCancel: onBack,
3802
+ primary: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3803
+ _chunk2QMBXGMQcjs.Button,
3804
+ {
3805
+ type: "submit",
3806
+ form: modalFormId,
3807
+ loading: isSubmitting,
3808
+ disabled: isSubmitting || !modalFormValid,
3809
+ className: MODAL_PRIMARY_CLASS,
3810
+ children: preset.submitLabel
3811
+ }
3812
+ )
3813
+ }
3814
+ )
3815
+ ] });
3816
+ }
3523
3817
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: cardClass, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: innerClass, children: [
3524
3818
  !formOnly && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3525
3819
  SchedulerContextPanel,
@@ -3570,7 +3864,7 @@ function HubSpotMeetingScheduler({
3570
3864
  deferSlot: detailsFirst,
3571
3865
  submitLabel: preset.submitLabel,
3572
3866
  footerNote: preset.footerNote,
3573
- initialValues: detailsFirst ? _optionalChain([stash, 'optionalAccess', _49 => _49.payload]) : void 0,
3867
+ initialValues: detailsFirst ? _optionalChain([stash, 'optionalAccess', _50 => _50.payload]) : void 0,
3574
3868
  isSubmitting,
3575
3869
  onSubmit: detailsFirst ? stashDetails : handleSubmit,
3576
3870
  honeypotInputProps,
@@ -3580,11 +3874,11 @@ function HubSpotMeetingScheduler({
3580
3874
  )
3581
3875
  ] }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-[var(--spacing-system-m)] content-md:min-h-0 content-md:flex-1", children: [
3582
3876
  bookingError === "SLOT_TAKEN" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3583
- _chunk4PKORVOXcjs.Alert,
3877
+ _chunkHJ4KGA2Mcjs.Alert,
3584
3878
  {
3585
3879
  variant: "warning",
3586
3880
  className: "mx-[var(--spacing-system-l)] mt-[var(--spacing-system-l)] w-auto content-lg:m-0 content-lg:w-full",
3587
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4PKORVOXcjs.AlertDescription, { children: "That time was just taken \u2014 pick another slot below. (If you already submitted, check your email for a confirmation before rebooking.)" })
3881
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkHJ4KGA2Mcjs.AlertDescription, { children: "That time was just taken \u2014 pick another slot below. (If you already submitted, check your email for a confirmation before rebooking.)" })
3588
3882
  }
3589
3883
  ),
3590
3884
  timezone && durationMs != null ? (
@@ -3607,7 +3901,7 @@ function HubSpotMeetingScheduler({
3607
3901
  onSelectSlot: (ms) => {
3608
3902
  if (!detailsFirst) {
3609
3903
  setSelectedSlot(ms);
3610
- setStep("details");
3904
+ if (!modal) setStep("details");
3611
3905
  return;
3612
3906
  }
3613
3907
  if (postInFlight() || !stash) return;