@flamingo-stack/openframe-frontend-core 0.0.596-2034.5684.1 → 0.0.596-2034.5686.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/__tests__/fixtures/meeting-booking.d.ts +21 -0
  2. package/dist/__tests__/fixtures/meeting-booking.d.ts.map +1 -1
  3. package/dist/{chunk-NE3SHUIJ.cjs → chunk-25LZZY6E.cjs} +3 -3
  4. package/dist/{chunk-NE3SHUIJ.cjs.map → chunk-25LZZY6E.cjs.map} +1 -1
  5. package/dist/{chunk-CBR4H6JJ.cjs → chunk-3IT35YDV.cjs} +53 -53
  6. package/dist/{chunk-CBR4H6JJ.cjs.map → chunk-3IT35YDV.cjs.map} +1 -1
  7. package/dist/{chunk-WTK5YZYU.js → chunk-A6YERC4N.js} +2 -2
  8. package/dist/{chunk-XNZMKCA4.js → chunk-AGKFT4FA.js} +5 -5
  9. package/dist/{chunk-QAJXIOK2.js → chunk-AYMBMVOD.js} +2 -2
  10. package/dist/{chunk-7XHONLYQ.js → chunk-BLYQD3PG.js} +2 -2
  11. package/dist/{chunk-WDOERQZK.cjs → chunk-D3Q3VYRU.cjs} +16 -16
  12. package/dist/{chunk-WDOERQZK.cjs.map → chunk-D3Q3VYRU.cjs.map} +1 -1
  13. package/dist/{chunk-DD64DQHM.cjs → chunk-E4YWJY3A.cjs} +4 -4
  14. package/dist/{chunk-DD64DQHM.cjs.map → chunk-E4YWJY3A.cjs.map} +1 -1
  15. package/dist/{chunk-E7FDTOJ6.js → chunk-FGHJ3BC7.js} +3 -3
  16. package/dist/{chunk-E6NN7MAN.js → chunk-FIQIT6HX.js} +2 -2
  17. package/dist/{chunk-J2OCCRFC.js → chunk-GZ76RASF.js} +4 -4
  18. package/dist/{chunk-BC73KAXX.cjs → chunk-HPUD7X67.cjs} +4 -4
  19. package/dist/{chunk-BC73KAXX.cjs.map → chunk-HPUD7X67.cjs.map} +1 -1
  20. package/dist/{chunk-B3446RB6.cjs → chunk-IDDGXYES.cjs} +17 -17
  21. package/dist/{chunk-B3446RB6.cjs.map → chunk-IDDGXYES.cjs.map} +1 -1
  22. package/dist/{chunk-ESHCKTES.js → chunk-J5EA7PMY.js} +4 -4
  23. package/dist/{chunk-3PUXHFC4.js → chunk-JVYNMMNE.js} +3 -3
  24. package/dist/{chunk-QT6Q6SUK.js → chunk-KOLVBEW5.js} +1 -1
  25. package/dist/{chunk-QT6Q6SUK.js.map → chunk-KOLVBEW5.js.map} +1 -1
  26. package/dist/{chunk-NBJELHZE.cjs → chunk-MN4TFBRA.cjs} +3 -3
  27. package/dist/{chunk-NBJELHZE.cjs.map → chunk-MN4TFBRA.cjs.map} +1 -1
  28. package/dist/{chunk-C2UBAAGD.cjs → chunk-N6HNK25A.cjs} +1 -1
  29. package/dist/{chunk-C2UBAAGD.cjs.map → chunk-N6HNK25A.cjs.map} +1 -1
  30. package/dist/{chunk-NTJGRZ7G.cjs → chunk-OI7RNQAS.cjs} +33 -33
  31. package/dist/{chunk-NTJGRZ7G.cjs.map → chunk-OI7RNQAS.cjs.map} +1 -1
  32. package/dist/{chunk-OKCGXXEK.js → chunk-PO4ATWE4.js} +2 -2
  33. package/dist/{chunk-X6TLDYMG.js → chunk-QNZM43HU.js} +3 -3
  34. package/dist/{chunk-6RISTRR3.cjs → chunk-QVOGALQE.cjs} +3 -3
  35. package/dist/{chunk-6RISTRR3.cjs.map → chunk-QVOGALQE.cjs.map} +1 -1
  36. package/dist/{chunk-IJ4SGRAN.js → chunk-S7LV66HD.js} +6 -6
  37. package/dist/{chunk-6X63WX5D.cjs → chunk-SLIUM3VO.cjs} +34 -34
  38. package/dist/{chunk-6X63WX5D.cjs.map → chunk-SLIUM3VO.cjs.map} +1 -1
  39. package/dist/{chunk-XTZECFMT.cjs → chunk-TDLETTI4.cjs} +10 -10
  40. package/dist/{chunk-XTZECFMT.cjs.map → chunk-TDLETTI4.cjs.map} +1 -1
  41. package/dist/{chunk-S2WP7ELW.js → chunk-TYURDSIN.js} +34 -32
  42. package/dist/chunk-TYURDSIN.js.map +1 -0
  43. package/dist/{chunk-DR4WXTKP.cjs → chunk-TZK5N6AH.cjs} +83 -81
  44. package/dist/chunk-TZK5N6AH.cjs.map +1 -0
  45. package/dist/{chunk-EM3T7YXE.js → chunk-Y6JB7X5Y.js} +2 -2
  46. package/dist/{chunk-HCHTKE6I.cjs → chunk-YP56SX7C.cjs} +3 -3
  47. package/dist/{chunk-HCHTKE6I.cjs.map → chunk-YP56SX7C.cjs.map} +1 -1
  48. package/dist/{chunk-UG43WQ2C.cjs → chunk-YQYOEGAT.cjs} +23 -23
  49. package/dist/{chunk-UG43WQ2C.cjs.map → chunk-YQYOEGAT.cjs.map} +1 -1
  50. package/dist/{chunk-YZALGXOM.js → chunk-ZVBYWM5Z.js} +2 -2
  51. package/dist/{chunk-ANGSMT5Q.cjs → chunk-ZXEYS2XP.cjs} +17 -17
  52. package/dist/{chunk-ANGSMT5Q.cjs.map → chunk-ZXEYS2XP.cjs.map} +1 -1
  53. package/dist/components/case-studies/index.cjs +9 -9
  54. package/dist/components/case-studies/index.js +3 -3
  55. package/dist/components/contact/index.cjs +4 -4
  56. package/dist/components/contact/index.js +3 -3
  57. package/dist/components/docs/index.cjs +7 -7
  58. package/dist/components/docs/index.js +6 -6
  59. package/dist/components/embeds/index.cjs +4 -4
  60. package/dist/components/embeds/index.js +3 -3
  61. package/dist/components/faq/index.cjs +4 -4
  62. package/dist/components/faq/index.js +3 -3
  63. package/dist/components/features/index.cjs +3 -3
  64. package/dist/components/features/index.js +2 -2
  65. package/dist/components/help-center-pages/index.cjs +23 -23
  66. package/dist/components/help-center-pages/index.js +14 -14
  67. package/dist/components/index.cjs +35 -33
  68. package/dist/components/index.cjs.map +1 -1
  69. package/dist/components/index.js +15 -13
  70. package/dist/components/index.js.map +1 -1
  71. package/dist/components/meeting-scheduler/booking-form.d.ts +15 -3
  72. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  73. package/dist/components/meeting-scheduler/index.cjs +81 -89
  74. package/dist/components/meeting-scheduler/index.cjs.map +1 -1
  75. package/dist/components/meeting-scheduler/index.d.ts +2 -0
  76. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  77. package/dist/components/meeting-scheduler/index.js +56 -64
  78. package/dist/components/meeting-scheduler/index.js.map +1 -1
  79. package/dist/components/navigation/index.cjs +6 -6
  80. package/dist/components/navigation/index.js +5 -5
  81. package/dist/components/onboarding-guides/index.cjs +6 -6
  82. package/dist/components/onboarding-guides/index.js +5 -5
  83. package/dist/components/tickets/index.cjs +7 -7
  84. package/dist/components/tickets/index.js +6 -6
  85. package/dist/components/ui/benefit-card.d.ts +7 -0
  86. package/dist/components/ui/benefit-card.d.ts.map +1 -1
  87. package/dist/components/ui/field-wrapper.d.ts +4 -4
  88. package/dist/components/ui/file-manager/index.cjs +4 -4
  89. package/dist/components/ui/file-manager/index.js +1 -1
  90. package/dist/components/ui/index.cjs +5 -3
  91. package/dist/components/ui/index.cjs.map +1 -1
  92. package/dist/components/ui/index.js +4 -2
  93. package/dist/index.cjs +9 -7
  94. package/dist/index.cjs.map +1 -1
  95. package/dist/index.js +8 -6
  96. package/dist/index.js.map +1 -1
  97. package/dist/schemas/meeting-booking-schema.cjs.map +1 -1
  98. package/dist/schemas/meeting-booking-schema.d.ts.map +1 -1
  99. package/dist/schemas/meeting-booking-schema.js.map +1 -1
  100. package/dist/utils/hubspot-meetings-convention.d.ts +1 -1
  101. package/dist/utils/hubspot-meetings-convention.d.ts.map +1 -1
  102. package/dist/utils/index.cjs.map +1 -1
  103. package/dist/utils/index.js.map +1 -1
  104. package/package.json +1 -1
  105. package/src/__tests__/benefit-card-border.test.ts +29 -0
  106. package/src/__tests__/booking-form-field-rows.test.tsx +9 -47
  107. package/src/__tests__/booking-form-number-field.test.tsx +14 -44
  108. package/src/__tests__/fixtures/meeting-booking.tsx +61 -0
  109. package/src/__tests__/meeting-scheduler-details-first.test.tsx +3 -6
  110. package/src/components/meeting-scheduler/booking-form.tsx +96 -70
  111. package/src/components/meeting-scheduler/index.tsx +24 -14
  112. package/src/components/ui/benefit-card.tsx +45 -39
  113. package/src/components/ui/field-wrapper.tsx +4 -4
  114. package/src/schemas/meeting-booking-schema.ts +1 -0
  115. package/src/utils/hubspot-meetings-convention.ts +1 -1
  116. package/dist/chunk-DR4WXTKP.cjs.map +0 -1
  117. package/dist/chunk-S2WP7ELW.js.map +0 -1
  118. package/src/__tests__/fixtures/meeting-booking.ts +0 -27
  119. /package/dist/{chunk-WTK5YZYU.js.map → chunk-A6YERC4N.js.map} +0 -0
  120. /package/dist/{chunk-XNZMKCA4.js.map → chunk-AGKFT4FA.js.map} +0 -0
  121. /package/dist/{chunk-QAJXIOK2.js.map → chunk-AYMBMVOD.js.map} +0 -0
  122. /package/dist/{chunk-7XHONLYQ.js.map → chunk-BLYQD3PG.js.map} +0 -0
  123. /package/dist/{chunk-E7FDTOJ6.js.map → chunk-FGHJ3BC7.js.map} +0 -0
  124. /package/dist/{chunk-E6NN7MAN.js.map → chunk-FIQIT6HX.js.map} +0 -0
  125. /package/dist/{chunk-J2OCCRFC.js.map → chunk-GZ76RASF.js.map} +0 -0
  126. /package/dist/{chunk-ESHCKTES.js.map → chunk-J5EA7PMY.js.map} +0 -0
  127. /package/dist/{chunk-3PUXHFC4.js.map → chunk-JVYNMMNE.js.map} +0 -0
  128. /package/dist/{chunk-OKCGXXEK.js.map → chunk-PO4ATWE4.js.map} +0 -0
  129. /package/dist/{chunk-X6TLDYMG.js.map → chunk-QNZM43HU.js.map} +0 -0
  130. /package/dist/{chunk-IJ4SGRAN.js.map → chunk-S7LV66HD.js.map} +0 -0
  131. /package/dist/{chunk-EM3T7YXE.js.map → chunk-Y6JB7X5Y.js.map} +0 -0
  132. /package/dist/{chunk-YZALGXOM.js.map → chunk-ZVBYWM5Z.js.map} +0 -0
@@ -10,8 +10,8 @@ export interface BookingFieldSlot {
10
10
  /** Columns out of four at `md` and up. Defaults to an even split of the row. */
11
11
  span?: BookingFieldSpan;
12
12
  }
13
- /** Columns out of four at `md` and up. */
14
- export type BookingFieldSpan = 1 | 2 | 3 | 4;
13
+ /** Columns out of `GRID_COLUMNS` at `md` and up — the keys of `SPAN_CLASS`. */
14
+ export type BookingFieldSpan = keyof typeof SPAN_CLASS;
15
15
  export type BookingFieldRow = BookingFieldSlot[];
16
16
  /**
17
17
  * A HOST-supplied consent row — the block the waitlist form draws for its SMS
@@ -31,6 +31,16 @@ export interface BookingFormConsent {
31
31
  /** Shown under the row when Continue is pressed unticked. */
32
32
  errorMessage?: string;
33
33
  }
34
+ /** Static so Tailwind's scanner sees every class — a template built from a
35
+ * runtime span would compile to nothing. */
36
+ declare const SPAN_CLASS: {
37
+ readonly 1: "md:col-span-1";
38
+ readonly 2: "md:col-span-2";
39
+ readonly 3: "md:col-span-3";
40
+ readonly 4: "md:col-span-4";
41
+ };
42
+ /** The submit copy every standalone `BookingForm` gets; the slot-first preset reads the same constant. */
43
+ export declare const DEFAULT_SUBMIT_LABEL = "Confirm Booking";
34
44
  /** The even split of four columns over `count` slots; a remainder goes to the
35
45
  * leading slots (three slots → 2/1/1), so a row never leaves a trailing gap. */
36
46
  export declare const evenSpan: (count: number, index: number) => BookingFieldSpan;
@@ -100,7 +110,9 @@ export declare function BookingForm({ availability, meetingId, startTimeMs, dura
100
110
  * this card. Same footprint discipline as its sibling: fixed heights, no shift
101
111
  * when the real form swaps in.
102
112
  */
103
- export declare function BookingFormSkeleton({ fieldRows }: {
113
+ export declare function BookingFormSkeleton({ fieldRows, footerNote }: {
104
114
  fieldRows?: BookingFieldRow[];
115
+ footerNote?: string;
105
116
  }): import("react").JSX.Element;
117
+ export {};
106
118
  //# sourceMappingURL=booking-form.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"booking-form.d.ts","sourceRoot":"","sources":["../../../src/components/meeting-scheduler/booking-form.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAa,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,EAEL,KAAK,uBAAuB,EAM5B,KAAK,mBAAmB,EAIzB,MAAM,sCAAsC,CAAC;AAqB9C;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yFAAyF;IACzF,IAAI,EAAE,uBAAuB,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,gFAAgF;IAChF,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAED,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE7C,MAAM,MAAM,eAAe,GAAG,gBAAgB,EAAE,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAsBD;iFACiF;AACjF,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,gBAIvD,CAAC;AA6IF,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;qEACiE;IACjE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,uFAAuF;IACvF,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,mFAAmF;IACnF,kBAAkB,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CACnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,EAC1B,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,EACV,QAAQ,EACR,SAAiB,EACjB,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,kBAAkB,EAClB,UAAU,GACX,EAAE,gBAAgB,+BA6UlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,eAAe,EAAE,CAAA;CAAE,+BAmCnF"}
1
+ {"version":3,"file":"booking-form.d.ts","sourceRoot":"","sources":["../../../src/components/meeting-scheduler/booking-form.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAa,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,EAEL,KAAK,uBAAuB,EAM5B,KAAK,mBAAmB,EAIzB,MAAM,sCAAsC,CAAC;AAqB9C;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yFAAyF;IACzF,IAAI,EAAE,uBAAuB,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,gFAAgF;IAChF,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAED,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,UAAU,CAAC;AAEvD,MAAM,MAAM,eAAe,GAAG,gBAAgB,EAAE,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAiBD;6CAC6C;AAC7C,QAAA,MAAM,UAAU;;;;;CAKN,CAAC;AAKX,0GAA0G;AAC1G,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAYtD;iFACiF;AACjF,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,gBAIvD,CAAC;AAoJF,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;qEACiE;IACjE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,uFAAuF;IACvF,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,mFAAmF;IACnF,kBAAkB,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CACnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,EAC1B,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,EACV,QAAQ,EACR,SAAiB,EACjB,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,kBAAkB,EAClB,UAAU,GACX,EAAE,gBAAgB,+BAmTlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,+BA2BpH"}
@@ -23,7 +23,7 @@ var _chunkO4VZOA2Qcjs = require('../../chunk-O4VZOA2Q.cjs');
23
23
 
24
24
 
25
25
 
26
- var _chunkDR4WXTKPcjs = require('../../chunk-DR4WXTKP.cjs');
26
+ var _chunkTZK5N6AHcjs = require('../../chunk-TZK5N6AH.cjs');
27
27
  require('../../chunk-GQWM3ECA.cjs');
28
28
  require('../../chunk-TON3YCCW.cjs');
29
29
 
@@ -40,7 +40,7 @@ var _chunkH64ZHSYRcjs = require('../../chunk-H64ZHSYR.cjs');
40
40
 
41
41
 
42
42
 
43
- var _chunkC2UBAAGDcjs = require('../../chunk-C2UBAAGD.cjs');
43
+ var _chunkN6HNK25Acjs = require('../../chunk-N6HNK25A.cjs');
44
44
 
45
45
 
46
46
  var _chunkL7GNBUXFcjs = require('../../chunk-L7GNBUXF.cjs');
@@ -252,7 +252,7 @@ function useMeetingBooking(options) {
252
252
  const seededOffset = _optionalChain([initialAvailability, 'optionalAccess', _3 => _3.meetingId]) === meetingId ? initialAvailability.monthOffset : void 0;
253
253
  const [monthOffset, setMonthOffsetState] = _react.useState.call(void 0, _nullishCoalesce(seededOffset, () => ( 0)));
254
254
  const setMonthOffset = _react.useCallback.call(void 0, (offset) => {
255
- setMonthOffsetState(Math.max(0, Math.min(_chunkDR4WXTKPcjs.MAX_MONTH_OFFSET, offset)));
255
+ setMonthOffsetState(Math.max(0, Math.min(_chunkTZK5N6AHcjs.MAX_MONTH_OFFSET, offset)));
256
256
  }, []);
257
257
  const prevMeetingIdRef = _react.useRef.call(void 0, meetingId);
258
258
  _react.useLayoutEffect.call(void 0, () => {
@@ -337,17 +337,25 @@ var _jsxruntime = require('react/jsx-runtime');
337
337
  var FORM_STACK = "flex flex-col gap-[var(--spacing-system-l)]";
338
338
  var ROW_GRID = "grid grid-cols-2 gap-x-[var(--spacing-system-m)] gap-y-[var(--spacing-system-lf)] md:grid-cols-4";
339
339
  var HOST_CONSENT_KEY = "hostConsent";
340
+ var GRID_COLUMNS = 4;
340
341
  var SPAN_CLASS = {
341
342
  1: "md:col-span-1",
342
343
  2: "md:col-span-2",
343
344
  3: "md:col-span-3",
344
345
  4: "md:col-span-4"
345
346
  };
347
+ var FIELD_SKELETON_CLASS = "h-[4.75rem] w-full";
348
+ var DEFAULT_SUBMIT_LABEL = "Confirm Booking";
349
+ var FOOTER_ROW_CLASS = "flex flex-wrap items-center justify-between gap-[var(--spacing-system-m)]";
350
+ var FOOTER_BARE_CLASS = "flex";
351
+ var SUBMIT_WIDE_CLASS = "md:w-60";
352
+ var DEFAULT_FIELD_ROWS = [[{ name: "email" }], [{ name: "firstName" }, { name: "lastName" }]];
346
353
  var evenSpan = (count, index) => {
347
- const base = Math.floor(4 / Math.max(1, count));
348
- const extra = 4 - base * count;
349
- return Math.min(4, Math.max(1, index < extra ? base + 1 : base));
354
+ const base = Math.floor(GRID_COLUMNS / Math.max(1, count));
355
+ const extra = GRID_COLUMNS - base * count;
356
+ return Math.min(GRID_COLUMNS, Math.max(1, index < extra ? base + 1 : base));
350
357
  };
358
+ var slotColumnClass = (row, slot, index) => _chunk23V5BSHDcjs.cn.call(void 0, row.length === 2 ? "col-span-1" : "col-span-2", SPAN_CLASS[_nullishCoalesce(slot.span, () => ( evenSpan(row.length, index)))]);
351
359
  var placeholderFor = (field) => _nullishCoalesce(field.placeholder, () => ( _optionalChain([fieldTypeSpec, 'call', _5 => _5(field.type), 'access', _6 => _6.placeholder, 'optionalCall', _7 => _7(field)])));
352
360
  var canonicalNumber = (v) => {
353
361
  const s = String(_nullishCoalesce(v, () => ( ""))).trim();
@@ -359,7 +367,7 @@ var canonicalNumber = (v) => {
359
367
  };
360
368
  var FIELD_CONTROLS = {
361
369
  text: ({ field, id, registerName, error, register }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
362
- _chunkC2UBAAGDcjs.Input,
370
+ _chunkN6HNK25Acjs.Input,
363
371
  {
364
372
  id,
365
373
  type: _nullishCoalesce(field.inputType, () => ( "text")),
@@ -371,7 +379,7 @@ var FIELD_CONTROLS = {
371
379
  }
372
380
  ),
373
381
  textarea: ({ field, id, registerName, error, register }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
374
- _chunkDR4WXTKPcjs.Textarea,
382
+ _chunkTZK5N6AHcjs.Textarea,
375
383
  {
376
384
  id,
377
385
  required: field.required,
@@ -381,7 +389,7 @@ var FIELD_CONTROLS = {
381
389
  }
382
390
  ),
383
391
  number: ({ field, id, registerName, error, register }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
384
- _chunkC2UBAAGDcjs.Input,
392
+ _chunkN6HNK25Acjs.Input,
385
393
  {
386
394
  id,
387
395
  type: "number",
@@ -397,9 +405,9 @@ var FIELD_CONTROLS = {
397
405
  {
398
406
  control,
399
407
  name: registerName,
400
- render: ({ field: rhf }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkDR4WXTKPcjs.Select, { value: _nullishCoalesce(rhf.value, () => ( "")), onValueChange: rhf.onChange, children: [
401
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.SelectTrigger, { id, "aria-required": field.required || void 0, "aria-invalid": Boolean(error), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.SelectValue, { placeholder: "Select\u2026" }) }),
402
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.SelectContent, { children: (_nullishCoalesce(field.options, () => ( []))).map((opt) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.SelectItem, { value: opt, children: opt }, opt)) })
408
+ render: ({ field: rhf }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkTZK5N6AHcjs.Select, { value: _nullishCoalesce(rhf.value, () => ( "")), onValueChange: rhf.onChange, children: [
409
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.SelectTrigger, { id, "aria-required": field.required || void 0, "aria-invalid": Boolean(error), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.SelectValue, { placeholder: "Select\u2026" }) }),
410
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.SelectContent, { children: (_nullishCoalesce(field.options, () => ( []))).map((opt) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.SelectItem, { value: opt, children: opt }, opt)) })
403
411
  ] })
404
412
  }
405
413
  ),
@@ -409,14 +417,14 @@ var FIELD_CONTROLS = {
409
417
  control,
410
418
  name: registerName,
411
419
  render: ({ field: rhf }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
412
- _chunkDR4WXTKPcjs.RadioGroup,
420
+ _chunkTZK5N6AHcjs.RadioGroup,
413
421
  {
414
422
  value: _nullishCoalesce(rhf.value, () => ( "")),
415
423
  onValueChange: rhf.onChange,
416
424
  "aria-required": field.required || void 0,
417
425
  "aria-invalid": Boolean(error),
418
426
  children: (_nullishCoalesce(field.options, () => ( []))).map((opt) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-[var(--spacing-system-xs)]", children: [
419
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.RadioGroupItem, { id: `${id}-${opt}`, value: opt }),
427
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.RadioGroupItem, { id: `${id}-${opt}`, value: opt }),
420
428
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Label, { htmlFor: `${id}-${opt}`, children: opt })
421
429
  ] }, opt))
422
430
  }
@@ -433,7 +441,7 @@ var FIELD_CONTROLS = {
433
441
  // this id — a second inline label would double the visible text AND
434
442
  // the accessible name.
435
443
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex items-center gap-[var(--spacing-system-xs)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
436
- _chunkC2UBAAGDcjs.Checkbox,
444
+ _chunkN6HNK25Acjs.Checkbox,
437
445
  {
438
446
  id,
439
447
  checked: Boolean(rhf.value),
@@ -541,7 +549,7 @@ function BookingForm({
541
549
  const err = _optionalChain([errors, 'access', _15 => _15.formFields, 'optionalAccess', _16 => _16[name]]);
542
550
  return _optionalChain([err, 'optionalAccess', _17 => _17.message]);
543
551
  };
544
- const renderField = (field, where) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkC2UBAAGDcjs.FieldWrapper, { label: field.label, htmlFor: where.id, required: field.required, error: where.error, children: FIELD_CONTROLS[field.type]({
552
+ const renderField = (field, where) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN6HNK25Acjs.FieldWrapper, { label: field.label, htmlFor: where.id, required: field.required, error: where.error, children: FIELD_CONTROLS[field.type]({
545
553
  field,
546
554
  id: where.id,
547
555
  registerName: where.registerName,
@@ -568,42 +576,22 @@ function BookingForm({
568
576
  const declared = declaredByName.get(name);
569
577
  return declared ? renderDeclaredField(declared) : null;
570
578
  };
571
- const placedNames = new Set((_nullishCoalesce(fieldRows, () => ( []))).flat().map((slot) => slot.name));
572
- const unplacedBuiltIns = fieldRows ? BUILT_IN_BOOKING_FIELDS.filter((f) => !placedNames.has(f.name)) : [];
579
+ const { rows: placedRows, unplacedBuiltIns, named: placedNames } = normalizeFieldRows(_nullishCoalesce(fieldRows, () => ( [])), slotResolves);
573
580
  const unplacedFields = fieldRows ? supportedFields.filter((f) => !placedNames.has(f.name)) : [];
574
- const seen = /* @__PURE__ */ new Set();
575
- const placedRows = (_nullishCoalesce(fieldRows, () => ( []))).map((row) => {
576
- const kept = row.filter((slot) => slotResolves(slot.name) && !seen.has(slot.name) && Boolean(seen.add(slot.name)));
577
- return kept.length === row.length ? kept : kept.map((slot) => ({ name: slot.name }));
578
- }).filter((row) => row.length > 0);
579
581
  const submitButton = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
580
582
  _chunkCJBSU3XBcjs.Button,
581
583
  {
582
584
  type: "submit",
583
585
  loading: isSubmitting,
584
586
  disabled: isSubmitting,
585
- className: footerNote ? "md:w-60" : void 0,
586
- children: _nullishCoalesce(submitLabel, () => ( "Confirm Booking"))
587
+ className: footerNote ? SUBMIT_WIDE_CLASS : void 0,
588
+ children: _nullishCoalesce(submitLabel, () => ( DEFAULT_SUBMIT_LABEL))
587
589
  }
588
590
  );
589
591
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "form", { onSubmit: submit, className: FORM_STACK, noValidate: true, children: [
590
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.HoneypotField, { ...honeypotInputProps }),
592
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.HoneypotField, { ...honeypotInputProps }),
591
593
  fieldRows ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
592
- placedRows.map((row, rowIndex) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: ROW_GRID, children: row.map((slot, slotIndex) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
593
- "div",
594
- {
595
- className: _chunk23V5BSHDcjs.cn.call(void 0,
596
- // A two-field row stays side by side on a phone — the rule
597
- // the built-in name pair has always followed: two short
598
- // fields cost one line instead of two on the layout that can
599
- // least afford them.
600
- row.length === 2 ? "col-span-1" : "col-span-2",
601
- SPAN_CLASS[_nullishCoalesce(slot.span, () => ( evenSpan(row.length, slotIndex)))]
602
- ),
603
- children: slotNode(slot.name)
604
- },
605
- slot.name
606
- )) }, row.map((s) => s.name).join("|") || rowIndex)),
594
+ 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("|"))),
607
595
  [...unplacedBuiltIns, ...unplacedFields].map((field) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react.Fragment, { children: slotNode(field.name) }, field.name))
608
596
  ] }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
609
597
  builtInFields.email,
@@ -614,7 +602,7 @@ function BookingForm({
614
602
  supportedFields.map((field) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react.Fragment, { children: renderDeclaredField(field) }, field.name))
615
603
  ] }),
616
604
  consent && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
617
- _chunkDR4WXTKPcjs.CheckboxBlock,
605
+ _chunkTZK5N6AHcjs.CheckboxBlock,
618
606
  {
619
607
  id: "ms-host-consent",
620
608
  checked: consented,
@@ -633,7 +621,7 @@ function BookingForm({
633
621
  // box doesn't shove the submit button down the card. With no error the
634
622
  // wrapper is `display:contents` and the panel below is the flex item,
635
623
  // exactly as it was.
636
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkC2UBAAGDcjs.FieldWrapper, { error: _optionalChain([errors, 'access', _20 => _20.legalConsentResponses, 'optionalAccess', _21 => _21.message]), children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-[var(--spacing-system-xs)]", children: [
624
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN6HNK25Acjs.FieldWrapper, { error: _optionalChain([errors, 'access', _20 => _20.legalConsentResponses, 'optionalAccess', _21 => _21.message]), children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-[var(--spacing-system-xs)]", children: [
637
625
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: legalConsent.processingConsentText }),
638
626
  legalConsent.communicationConsentText && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: legalConsent.communicationConsentText }),
639
627
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
@@ -649,7 +637,7 @@ function BookingForm({
649
637
  // same block the waitlist form uses): box + label in one
650
638
  // bordered row.
651
639
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
652
- _chunkDR4WXTKPcjs.CheckboxBlock,
640
+ _chunkTZK5N6AHcjs.CheckboxBlock,
653
641
  {
654
642
  id: `ms-consent-${box.communicationTypeId}`,
655
643
  checked: _nullishCoalesce(_optionalChain([current, 'optionalAccess', _22 => _22.consented]), () => ( false)),
@@ -669,39 +657,37 @@ function BookingForm({
669
657
  ),
670
658
  legalConsent.privacyPolicyText && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: legalConsent.privacyPolicyText })
671
659
  ] }) }),
672
- footerNote ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-wrap items-center justify-between gap-[var(--spacing-system-m)]", children: [
660
+ footerNote ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: FOOTER_ROW_CLASS, children: [
673
661
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary text-h6", children: footerNote }),
674
662
  submitButton
675
- ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex", children: submitButton })
663
+ ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: FOOTER_BARE_CLASS, children: submitButton })
676
664
  ] });
677
665
  }
678
- function BookingFormSkeleton({ fieldRows }) {
666
+ function BookingFormSkeleton({ fieldRows, footerNote }) {
679
667
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk23V5BSHDcjs.cn.call(void 0, "flex-1", FORM_STACK), children: [
680
- fieldRows ? (
681
- // The host's rows, through the SAME grid + span rule as the loaded form.
682
- fieldRows.map((row, rowIndex) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: ROW_GRID, children: row.map((slot, slotIndex) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
683
- _chunkCHIHYC7Qcjs.Skeleton,
684
- {
685
- className: _chunk23V5BSHDcjs.cn.call(void 0,
686
- "h-[4.75rem] w-full",
687
- row.length === 2 ? "col-span-1" : "col-span-2",
688
- SPAN_CLASS[_nullishCoalesce(slot.span, () => ( evenSpan(row.length, slotIndex)))]
689
- )
690
- },
691
- slot.name
692
- )) }, rowIndex))
693
- ) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
694
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "grid grid-cols-1 gap-[var(--spacing-system-m)] md:grid-cols-2", children: [
695
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: "h-[4.75rem] w-full" }),
696
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: "h-[4.75rem] w-full" })
697
- ] }),
698
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: "h-[4.75rem] w-full" }),
699
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: "h-[7.75rem] w-full" })
700
- ] }),
668
+ skeletonRows(_nullishCoalesce(fieldRows, () => ( DEFAULT_FIELD_ROWS))).map((row) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: ROW_GRID, children: row.map((slot, slotIndex) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: _chunk23V5BSHDcjs.cn.call(void 0, FIELD_SKELETON_CLASS, slotColumnClass(row, slot, slotIndex)) }, slot.name)) }, row.map((s) => s.name).join("|"))),
669
+ !fieldRows && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: "h-[7.75rem] w-full" }),
701
670
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: "h-[4.25rem] w-full" }),
702
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex justify-end", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: "h-12 w-40" }) })
671
+ footerNote ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: FOOTER_ROW_CLASS, children: [
672
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: "h-5 min-w-40 flex-1" }),
673
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: _chunk23V5BSHDcjs.cn.call(void 0, "h-12 w-full", SUBMIT_WIDE_CLASS) })
674
+ ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: FOOTER_BARE_CLASS, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCHIHYC7Qcjs.Skeleton, { className: "h-12 w-40" }) })
703
675
  ] });
704
676
  }
677
+ function normalizeFieldRows(fieldRows, resolves = () => true) {
678
+ const seen = /* @__PURE__ */ new Set();
679
+ const rows = fieldRows.map((row) => {
680
+ const kept = row.filter((slot) => resolves(slot.name) && !seen.has(slot.name) && Boolean(seen.add(slot.name)));
681
+ return kept.length === row.length ? kept : kept.map((slot) => ({ name: slot.name }));
682
+ }).filter((row) => row.length > 0);
683
+ const named = new Set(fieldRows.flat().map((slot) => slot.name));
684
+ const unplacedBuiltIns = BUILT_IN_BOOKING_FIELDS.filter((f) => !named.has(f.name));
685
+ return { rows, unplacedBuiltIns, named };
686
+ }
687
+ function skeletonRows(fieldRows) {
688
+ const { rows, unplacedBuiltIns } = normalizeFieldRows(fieldRows);
689
+ return [...rows, ...unplacedBuiltIns.map((f) => [{ name: f.name }])];
690
+ }
705
691
 
706
692
  // src/components/meeting-scheduler/confirmation.tsx
707
693
 
@@ -756,7 +742,7 @@ function ContextPanelSkeleton({
756
742
  backLabel = "Back"
757
743
  }) {
758
744
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk23V5BSHDcjs.cn.call(void 0, PANEL_STACK, className), children: [
759
- onBack && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.BackButton, { label: backLabel, onClick: onBack, className: BACK_BUTTON_CLASS }),
745
+ onBack && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.BackButton, { label: backLabel, onClick: onBack, className: BACK_BUTTON_CLASS }),
760
746
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: STRIP_BODY, children: [
761
747
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: STRIP_MAIN, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: IDENTITY_ROW, children: [
762
748
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xs)] lg:flex-none", children: [
@@ -804,7 +790,7 @@ function SchedulerContextPanel({
804
790
  return zones.map((tz) => ({ value: tz, label: zoneLabel(tz) }));
805
791
  }, [timezone]);
806
792
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk23V5BSHDcjs.cn.call(void 0, PANEL_STACK, className), children: [
807
- onBack && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.BackButton, { label: backLabel, onClick: onBack, className: BACK_BUTTON_CLASS }),
793
+ onBack && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.BackButton, { label: backLabel, onClick: onBack, className: BACK_BUTTON_CLASS }),
808
794
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: STRIP_BODY, children: [
809
795
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: STRIP_MAIN, children: [
810
796
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: IDENTITY_ROW, children: [
@@ -866,7 +852,7 @@ function SchedulerContextPanel({
866
852
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk23V5BSHDcjs.cn.call(void 0, STRIP_ASIDE, locked && "max-lg:hidden"), children: [
867
853
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: FIELD_LABEL_CLASS, children: "Timezone" }),
868
854
  timezone ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
869
- _chunkDR4WXTKPcjs.Autocomplete,
855
+ _chunkTZK5N6AHcjs.Autocomplete,
870
856
  {
871
857
  value: timezone,
872
858
  disabled,
@@ -953,18 +939,18 @@ var NOOP = () => void 0;
953
939
  function DayCalendar({ monthOffset, onMonthOffsetChange, selectedDay, onSelectDay, slotsByDay }) {
954
940
  const now = /* @__PURE__ */ new Date();
955
941
  const startMonth = new Date(now.getFullYear(), now.getMonth(), 1);
956
- const endMonth = new Date(now.getFullYear(), now.getMonth() + _chunkDR4WXTKPcjs.MAX_MONTH_OFFSET + 1, 0);
942
+ const endMonth = new Date(now.getFullYear(), now.getMonth() + _chunkTZK5N6AHcjs.MAX_MONTH_OFFSET + 1, 0);
957
943
  const visibleMonth = new Date(now.getFullYear(), now.getMonth() + monthOffset, 1);
958
944
  const dayHasNoSlots = _react.useCallback.call(void 0, (day) => !_optionalChain([slotsByDay, 'optionalAccess', _27 => _27.has, 'call', _28 => _28(calendarDayKey(day))]), [slotsByDay]);
959
945
  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,
960
- _chunkDR4WXTKPcjs.DatePickerCalendar,
946
+ _chunkTZK5N6AHcjs.DatePickerCalendar,
961
947
  {
962
948
  mode: "single",
963
949
  bare: true,
964
950
  month: visibleMonth,
965
951
  onMonthChange: (month) => {
966
952
  const offset = (month.getFullYear() - now.getFullYear()) * 12 + (month.getMonth() - now.getMonth());
967
- onMonthOffsetChange(Math.max(0, Math.min(_chunkDR4WXTKPcjs.MAX_MONTH_OFFSET, offset)));
953
+ onMonthOffsetChange(Math.max(0, Math.min(_chunkTZK5N6AHcjs.MAX_MONTH_OFFSET, offset)));
968
954
  },
969
955
  fromDate: startMonth,
970
956
  toDate: endMonth,
@@ -1084,7 +1070,7 @@ function SlotPicker({
1084
1070
  monthLabelFor(monthOffset),
1085
1071
  "."
1086
1072
  ] }),
1087
- monthOffset < _chunkDR4WXTKPcjs.MAX_MONTH_OFFSET && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1073
+ monthOffset < _chunkTZK5N6AHcjs.MAX_MONTH_OFFSET && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1088
1074
  _chunkCJBSU3XBcjs.Button,
1089
1075
  {
1090
1076
  variant: "outline",
@@ -1272,10 +1258,12 @@ var BOOKING_ERROR_COPY = {
1272
1258
  var CONTEXT_PANEL_CLASS = "p-[var(--spacing-system-l)] shrink-0 lg:w-[280px] border-b lg:border-b-0 lg:border-r border-ods-border lg:min-h-0 lg:overflow-y-auto";
1273
1259
  var ACTION_PANEL_CLASS = "flex-1 min-w-0 flex flex-col md:min-h-0 lg:p-[var(--spacing-system-l)]";
1274
1260
  var PANEL_STEP_CLASS = "p-[var(--spacing-system-l)] md:min-h-0 md:overflow-y-auto lg:p-0";
1261
+ var STEP_PANEL_CLASS = _chunk23V5BSHDcjs.cn.call(void 0, "flex flex-1 flex-col", PANEL_STEP_CLASS);
1275
1262
  var MEETING_SCHEDULER_H = "md:h-[34.375rem] lg:h-[23.75rem]";
1276
1263
  var MEETING_SCHEDULER_DETAILS_FIRST_H = "md:h-[39.875rem]";
1264
+ var DEFAULT_SCHEDULER_FLOW = "slot-first";
1277
1265
  var SCHEDULER_FLOW_PRESETS = {
1278
- "slot-first": { initialStep: "slot", height: MEETING_SCHEDULER_H, submitLabel: "Confirm Booking" },
1266
+ "slot-first": { initialStep: "slot", height: MEETING_SCHEDULER_H, submitLabel: DEFAULT_SUBMIT_LABEL },
1279
1267
  "details-first": {
1280
1268
  initialStep: "details",
1281
1269
  height: MEETING_SCHEDULER_DETAILS_FIRST_H,
@@ -1296,7 +1284,7 @@ var CARD_DEGRADED_CLASS = _chunk23V5BSHDcjs.cn.call(void 0,
1296
1284
  "md:justify-center md:overflow-y-auto"
1297
1285
  );
1298
1286
  function SchedulerDegradedCard({
1299
- flow = "slot-first",
1287
+ flow = DEFAULT_SCHEDULER_FLOW,
1300
1288
  className,
1301
1289
  message,
1302
1290
  action,
@@ -1329,7 +1317,7 @@ function HubSpotMeetingScheduler({
1329
1317
  onBack,
1330
1318
  onBooked,
1331
1319
  className,
1332
- flow = "slot-first",
1320
+ flow = DEFAULT_SCHEDULER_FLOW,
1333
1321
  detailsForm: DetailsForm = BookingForm,
1334
1322
  detailsFormProps
1335
1323
  }) {
@@ -1472,16 +1460,17 @@ function HubSpotMeetingScheduler({
1472
1460
  [book, bookingError, detailsFirst, onBooked, refetchAvailability, resetSignals, toast]
1473
1461
  );
1474
1462
  const escapeHatch = fallbackUrl ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCJBSU3XBcjs.Button, { variant: "outline", size: "small-legacy", href: fallbackUrl, openInNewTab: true, children: "Open in HubSpot" }) : null;
1463
+ const backEdge = detailsFirst ? step === "slot" ? backToDetails : onBack : step === "details" ? backToSlot : onBack;
1475
1464
  const cardClass = _chunk23V5BSHDcjs.cn.call(void 0, CARD_CLASS, preset.height, formOnly && "bg-ods-bg", className);
1476
1465
  const degraded = (message) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SchedulerDegradedCard, { flow, className, message, action: escapeHatch });
1477
1466
  const degradedCard = degraded("We couldn't load available call times. Please try again shortly.");
1478
1467
  if (isLoadingAvailability && !availability) {
1479
1468
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: cardClass, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: CARD_INNER_CLASS, children: [
1480
- !formOnly && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContextPanelSkeleton, { onBack, className: CONTEXT_PANEL_CLASS }),
1469
+ !formOnly && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContextPanelSkeleton, { onBack: backEdge, className: CONTEXT_PANEL_CLASS }),
1481
1470
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: ACTION_PANEL_CLASS, children: detailsFirst && step === "details" ? (
1482
1471
  // The SAME wrapper the loaded form gets, so the skeleton never
1483
1472
  // states its own inset.
1484
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunk23V5BSHDcjs.cn.call(void 0, "flex flex-1 flex-col", PANEL_STEP_CLASS), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, BookingFormSkeleton, { fieldRows: _optionalChain([detailsFormProps, 'optionalAccess', _36 => _36.fieldRows]) }) })
1473
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: STEP_PANEL_CLASS, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, BookingFormSkeleton, { fieldRows: _optionalChain([detailsFormProps, 'optionalAccess', _36 => _36.fieldRows]), footerNote: preset.footerNote }) })
1485
1474
  ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SlotPickerSkeleton, { monthOffset }) })
1486
1475
  ] }) });
1487
1476
  }
@@ -1506,19 +1495,21 @@ function HubSpotMeetingScheduler({
1506
1495
  },
1507
1496
  timezone,
1508
1497
  onTimezoneChange: setTimezone,
1509
- onBack: detailsFirst ? step === "slot" ? backToDetails : onBack : step === "details" ? backToSlot : onBack,
1498
+ onBack: backEdge,
1510
1499
  locked: detailsFirst ? step === "confirmed" : step !== "slot",
1511
1500
  disabled: detailsFirst && isSubmitting,
1512
1501
  showTimezone: step !== "confirmed",
1513
1502
  className: CONTEXT_PANEL_CLASS
1514
1503
  }
1515
1504
  ),
1516
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: ACTION_PANEL_CLASS, children: step === "confirmed" && confirmation && timezone ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunk23V5BSHDcjs.cn.call(void 0, "flex flex-1 flex-col", PANEL_STEP_CLASS), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Confirmation, { confirmation, timezone }) }) : step === "details" && (detailsFirst ? (
1505
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: ACTION_PANEL_CLASS, children: step === "confirmed" && confirmation && timezone ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: STEP_PANEL_CLASS, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Confirmation, { confirmation, timezone }) }) : step === "details" && (detailsFirst ? (
1517
1506
  // The form is step ONE here: no slot yet, and `timezone` is null
1518
1507
  // on the server render, so neither may gate the PANEL. A link
1519
- // publishing no durations has no form worth showing.
1520
- durations.length > 0
1521
- ) : durationMs != null && selectedSlot != null && timezone) ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk23V5BSHDcjs.cn.call(void 0, "flex flex-1 flex-col gap-[var(--spacing-system-m)]", PANEL_STEP_CLASS), children: [
1508
+ // publishing no durations has no form worth showing — but while a
1509
+ // refetch is in flight the form stays (a calendar skeleton is
1510
+ // the wrong shape here).
1511
+ durations.length > 0 || isFetchingAvailability
1512
+ ) : durationMs != null && selectedSlot != null && timezone) ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk23V5BSHDcjs.cn.call(void 0, STEP_PANEL_CLASS, "gap-[var(--spacing-system-m)]"), children: [
1522
1513
  selectedSlot != null && durationMs != null && timezone != null && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { className: "text-ods-text-primary text-h4", children: [
1523
1514
  new Intl.DateTimeFormat(void 0, {
1524
1515
  timeZone: timezone,
@@ -1554,11 +1545,11 @@ function HubSpotMeetingScheduler({
1554
1545
  )
1555
1546
  ] }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-[var(--spacing-system-m)] md:min-h-0 md:flex-1", children: [
1556
1547
  bookingError === "SLOT_TAKEN" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1557
- _chunkDR4WXTKPcjs.Alert,
1548
+ _chunkTZK5N6AHcjs.Alert,
1558
1549
  {
1559
1550
  variant: "warning",
1560
1551
  className: "mx-[var(--spacing-system-l)] mt-[var(--spacing-system-l)] w-auto lg:m-0 lg:w-full",
1561
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.AlertDescription, { children: "That time was just taken \u2014 pick another slot below. (If you already submitted, check your email for a confirmation before rebooking.)" })
1552
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.AlertDescription, { children: "That time was just taken \u2014 pick another slot below. (If you already submitted, check your email for a confirmation before rebooking.)" })
1562
1553
  }
1563
1554
  ),
1564
1555
  timezone && durationMs != null ? (
@@ -1639,5 +1630,6 @@ function HubSpotMeetingScheduler({
1639
1630
 
1640
1631
 
1641
1632
 
1642
- exports.BookingForm = BookingForm; exports.BookingFormSkeleton = BookingFormSkeleton; exports.HubSpotMeetingScheduler = HubSpotMeetingScheduler; exports.MEETING_SCHEDULER_DETAILS_FIRST_H = MEETING_SCHEDULER_DETAILS_FIRST_H; exports.MEETING_SCHEDULER_H = MEETING_SCHEDULER_H; exports.MeetingSchedulerDirectory = MeetingSchedulerDirectory; exports.MeetingSchedulerDirectoryRowSkeleton = MeetingSchedulerDirectoryRowSkeleton; exports.SCHEDULER_FLOW_PRESETS = SCHEDULER_FLOW_PRESETS; exports.SchedulerDegradedCard = SchedulerDegradedCard;
1633
+
1634
+ exports.BookingForm = BookingForm; exports.BookingFormSkeleton = BookingFormSkeleton; exports.DEFAULT_SCHEDULER_FLOW = DEFAULT_SCHEDULER_FLOW; exports.HubSpotMeetingScheduler = HubSpotMeetingScheduler; exports.MEETING_SCHEDULER_DETAILS_FIRST_H = MEETING_SCHEDULER_DETAILS_FIRST_H; exports.MEETING_SCHEDULER_H = MEETING_SCHEDULER_H; exports.MeetingSchedulerDirectory = MeetingSchedulerDirectory; exports.MeetingSchedulerDirectoryRowSkeleton = MeetingSchedulerDirectoryRowSkeleton; exports.SCHEDULER_FLOW_PRESETS = SCHEDULER_FLOW_PRESETS; exports.SchedulerDegradedCard = SchedulerDegradedCard;
1643
1635
  //# sourceMappingURL=index.cjs.map