@voyant-travel/bookings-react 0.119.3

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 (602) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +87 -0
  3. package/dist/admin/booking-contract-dialog.d.ts +22 -0
  4. package/dist/admin/booking-contract-dialog.d.ts.map +1 -0
  5. package/dist/admin/booking-contract-dialog.js +161 -0
  6. package/dist/admin/booking-detail-host.d.ts +103 -0
  7. package/dist/admin/booking-detail-host.d.ts.map +1 -0
  8. package/dist/admin/booking-detail-host.js +127 -0
  9. package/dist/admin/booking-detail-skeleton.d.ts +7 -0
  10. package/dist/admin/booking-detail-skeleton.d.ts.map +1 -0
  11. package/dist/admin/booking-detail-skeleton.js +24 -0
  12. package/dist/admin/booking-documents-table.d.ts +13 -0
  13. package/dist/admin/booking-documents-table.d.ts.map +1 -0
  14. package/dist/admin/booking-documents-table.js +259 -0
  15. package/dist/admin/booking-invoice-sheet.d.ts +18 -0
  16. package/dist/admin/booking-invoice-sheet.d.ts.map +1 -0
  17. package/dist/admin/booking-invoice-sheet.js +101 -0
  18. package/dist/admin/booking-journey-host.d.ts +24 -0
  19. package/dist/admin/booking-journey-host.d.ts.map +1 -0
  20. package/dist/admin/booking-journey-host.js +278 -0
  21. package/dist/admin/bookings-host.d.ts +26 -0
  22. package/dist/admin/bookings-host.d.ts.map +1 -0
  23. package/dist/admin/bookings-host.js +18 -0
  24. package/dist/admin/bookings-list-skeleton.d.ts +10 -0
  25. package/dist/admin/bookings-list-skeleton.d.ts.map +1 -0
  26. package/dist/admin/bookings-list-skeleton.js +25 -0
  27. package/dist/admin/index.d.ts +273 -0
  28. package/dist/admin/index.d.ts.map +1 -0
  29. package/dist/admin/index.js +331 -0
  30. package/dist/admin/journey-billing-duplicate-warning.d.ts +3 -0
  31. package/dist/admin/journey-billing-duplicate-warning.d.ts.map +1 -0
  32. package/dist/admin/journey-billing-duplicate-warning.js +26 -0
  33. package/dist/admin/journey-departure-picker.d.ts +7 -0
  34. package/dist/admin/journey-departure-picker.d.ts.map +1 -0
  35. package/dist/admin/journey-departure-picker.js +100 -0
  36. package/dist/admin/journey-units-picker.d.ts +11 -0
  37. package/dist/admin/journey-units-picker.d.ts.map +1 -0
  38. package/dist/admin/journey-units-picker.js +60 -0
  39. package/dist/admin/journey-voucher-picker.d.ts +3 -0
  40. package/dist/admin/journey-voucher-picker.d.ts.map +1 -0
  41. package/dist/admin/journey-voucher-picker.js +71 -0
  42. package/dist/admin/pages/booking-compose-page.d.ts +9 -0
  43. package/dist/admin/pages/booking-compose-page.d.ts.map +1 -0
  44. package/dist/admin/pages/booking-compose-page.js +17 -0
  45. package/dist/admin/pages/booking-detail-page.d.ts +11 -0
  46. package/dist/admin/pages/booking-detail-page.d.ts.map +1 -0
  47. package/dist/admin/pages/booking-detail-page.js +14 -0
  48. package/dist/admin/pages/booking-journey-page.d.ts +12 -0
  49. package/dist/admin/pages/booking-journey-page.d.ts.map +1 -0
  50. package/dist/admin/pages/booking-journey-page.js +26 -0
  51. package/dist/admin/pages/booking-new-page.d.ts +15 -0
  52. package/dist/admin/pages/booking-new-page.d.ts.map +1 -0
  53. package/dist/admin/pages/booking-new-page.js +50 -0
  54. package/dist/admin/pages/bookings-index-page.d.ts +20 -0
  55. package/dist/admin/pages/bookings-index-page.d.ts.map +1 -0
  56. package/dist/admin/pages/bookings-index-page.js +18 -0
  57. package/dist/admin/person-bookings-widget.d.ts +13 -0
  58. package/dist/admin/person-bookings-widget.d.ts.map +1 -0
  59. package/dist/admin/person-bookings-widget.js +48 -0
  60. package/dist/admin/slots.d.ts +31 -0
  61. package/dist/admin/slots.d.ts.map +1 -0
  62. package/dist/admin/slots.js +30 -0
  63. package/dist/admin/use-booking-action-ledger-events.d.ts +15 -0
  64. package/dist/admin/use-booking-action-ledger-events.d.ts.map +1 -0
  65. package/dist/admin/use-booking-action-ledger-events.js +66 -0
  66. package/dist/client.d.ts +14 -0
  67. package/dist/client.d.ts.map +1 -0
  68. package/dist/client.js +59 -0
  69. package/dist/components/booking-activity-timeline.d.ts +32 -0
  70. package/dist/components/booking-activity-timeline.d.ts.map +1 -0
  71. package/dist/components/booking-activity-timeline.js +147 -0
  72. package/dist/components/booking-billing-dialog.d.ts +16 -0
  73. package/dist/components/booking-billing-dialog.d.ts.map +1 -0
  74. package/dist/components/booking-billing-dialog.js +315 -0
  75. package/dist/components/booking-cancellation-dialog.d.ts +18 -0
  76. package/dist/components/booking-cancellation-dialog.d.ts.map +1 -0
  77. package/dist/components/booking-cancellation-dialog.js +79 -0
  78. package/dist/components/booking-combobox.d.ts +13 -0
  79. package/dist/components/booking-combobox.d.ts.map +1 -0
  80. package/dist/components/booking-combobox.js +44 -0
  81. package/dist/components/booking-create-form-utils.d.ts +56 -0
  82. package/dist/components/booking-create-form-utils.d.ts.map +1 -0
  83. package/dist/components/booking-create-form-utils.js +216 -0
  84. package/dist/components/booking-create-page.d.ts +14 -0
  85. package/dist/components/booking-create-page.d.ts.map +1 -0
  86. package/dist/components/booking-create-page.js +11 -0
  87. package/dist/components/booking-create-preview-card.d.ts +26 -0
  88. package/dist/components/booking-create-preview-card.d.ts.map +1 -0
  89. package/dist/components/booking-create-preview-card.js +107 -0
  90. package/dist/components/booking-create-product-extras-picker.d.ts +18 -0
  91. package/dist/components/booking-create-product-extras-picker.d.ts.map +1 -0
  92. package/dist/components/booking-create-product-extras-picker.js +82 -0
  93. package/dist/components/booking-create-sheet.d.ts +34 -0
  94. package/dist/components/booking-create-sheet.d.ts.map +1 -0
  95. package/dist/components/booking-create-sheet.js +811 -0
  96. package/dist/components/booking-create-utils.d.ts +66 -0
  97. package/dist/components/booking-create-utils.d.ts.map +1 -0
  98. package/dist/components/booking-create-utils.js +185 -0
  99. package/dist/components/booking-detail-page.d.ts +126 -0
  100. package/dist/components/booking-detail-page.d.ts.map +1 -0
  101. package/dist/components/booking-detail-page.js +264 -0
  102. package/dist/components/booking-dialog.d.ts +28 -0
  103. package/dist/components/booking-dialog.d.ts.map +1 -0
  104. package/dist/components/booking-dialog.js +130 -0
  105. package/dist/components/booking-document-dialog.d.ts +8 -0
  106. package/dist/components/booking-document-dialog.d.ts.map +1 -0
  107. package/dist/components/booking-document-dialog.js +83 -0
  108. package/dist/components/booking-document-list.d.ts +5 -0
  109. package/dist/components/booking-document-list.d.ts.map +1 -0
  110. package/dist/components/booking-document-list.js +43 -0
  111. package/dist/components/booking-group-link-dialog.d.ts +10 -0
  112. package/dist/components/booking-group-link-dialog.d.ts.map +1 -0
  113. package/dist/components/booking-group-link-dialog.js +79 -0
  114. package/dist/components/booking-group-section.d.ts +27 -0
  115. package/dist/components/booking-group-section.d.ts.map +1 -0
  116. package/dist/components/booking-group-section.js +51 -0
  117. package/dist/components/booking-guarantee-dialog.d.ts +10 -0
  118. package/dist/components/booking-guarantee-dialog.d.ts.map +1 -0
  119. package/dist/components/booking-guarantee-dialog.js +123 -0
  120. package/dist/components/booking-guarantee-list.d.ts +5 -0
  121. package/dist/components/booking-guarantee-list.d.ts.map +1 -0
  122. package/dist/components/booking-guarantee-list.js +86 -0
  123. package/dist/components/booking-item-dialog.d.ts +10 -0
  124. package/dist/components/booking-item-dialog.d.ts.map +1 -0
  125. package/dist/components/booking-item-dialog.js +155 -0
  126. package/dist/components/booking-item-list.d.ts +12 -0
  127. package/dist/components/booking-item-list.d.ts.map +1 -0
  128. package/dist/components/booking-item-list.js +191 -0
  129. package/dist/components/booking-item-travelers.d.ts +6 -0
  130. package/dist/components/booking-item-travelers.d.ts.map +1 -0
  131. package/dist/components/booking-item-travelers.js +57 -0
  132. package/dist/components/booking-list-filters.d.ts +43 -0
  133. package/dist/components/booking-list-filters.d.ts.map +1 -0
  134. package/dist/components/booking-list-filters.js +192 -0
  135. package/dist/components/booking-list.d.ts +50 -0
  136. package/dist/components/booking-list.d.ts.map +1 -0
  137. package/dist/components/booking-list.js +352 -0
  138. package/dist/components/booking-note-dialog.d.ts +16 -0
  139. package/dist/components/booking-note-dialog.d.ts.map +1 -0
  140. package/dist/components/booking-note-dialog.js +41 -0
  141. package/dist/components/booking-notes.d.ts +5 -0
  142. package/dist/components/booking-notes.d.ts.map +1 -0
  143. package/dist/components/booking-notes.js +45 -0
  144. package/dist/components/booking-payment-reconciliation-banner.d.ts +5 -0
  145. package/dist/components/booking-payment-reconciliation-banner.d.ts.map +1 -0
  146. package/dist/components/booking-payment-reconciliation-banner.js +91 -0
  147. package/dist/components/booking-payment-schedule-dialog.d.ts +10 -0
  148. package/dist/components/booking-payment-schedule-dialog.d.ts.map +1 -0
  149. package/dist/components/booking-payment-schedule-dialog.js +117 -0
  150. package/dist/components/booking-payment-schedule-list.d.ts +10 -0
  151. package/dist/components/booking-payment-schedule-list.d.ts.map +1 -0
  152. package/dist/components/booking-payment-schedule-list.js +217 -0
  153. package/dist/components/booking-payments-summary.d.ts +83 -0
  154. package/dist/components/booking-payments-summary.d.ts.map +1 -0
  155. package/dist/components/booking-payments-summary.js +176 -0
  156. package/dist/components/booking-quick-view-sheet.d.ts +14 -0
  157. package/dist/components/booking-quick-view-sheet.d.ts.map +1 -0
  158. package/dist/components/booking-quick-view-sheet.js +283 -0
  159. package/dist/components/bookings-page.d.ts +19 -0
  160. package/dist/components/bookings-page.d.ts.map +1 -0
  161. package/dist/components/bookings-page.js +9 -0
  162. package/dist/components/file-dropzone.d.ts +25 -0
  163. package/dist/components/file-dropzone.d.ts.map +1 -0
  164. package/dist/components/file-dropzone.js +102 -0
  165. package/dist/components/icon-action-button.d.ts +18 -0
  166. package/dist/components/icon-action-button.d.ts.map +1 -0
  167. package/dist/components/icon-action-button.js +13 -0
  168. package/dist/components/option-units-stepper-section.d.ts +111 -0
  169. package/dist/components/option-units-stepper-section.d.ts.map +1 -0
  170. package/dist/components/option-units-stepper-section.js +276 -0
  171. package/dist/components/payment-schedule-section.d.ts +91 -0
  172. package/dist/components/payment-schedule-section.d.ts.map +1 -0
  173. package/dist/components/payment-schedule-section.js +206 -0
  174. package/dist/components/person-picker-section.d.ts +71 -0
  175. package/dist/components/person-picker-section.d.ts.map +1 -0
  176. package/dist/components/person-picker-section.js +160 -0
  177. package/dist/components/price-breakdown-section.d.ts +83 -0
  178. package/dist/components/price-breakdown-section.d.ts.map +1 -0
  179. package/dist/components/price-breakdown-section.js +278 -0
  180. package/dist/components/product-picker-section.d.ts +29 -0
  181. package/dist/components/product-picker-section.d.ts.map +1 -0
  182. package/dist/components/product-picker-section.js +74 -0
  183. package/dist/components/shared-room-section.d.ts +40 -0
  184. package/dist/components/shared-room-section.d.ts.map +1 -0
  185. package/dist/components/shared-room-section.js +99 -0
  186. package/dist/components/status-badge.d.ts +24 -0
  187. package/dist/components/status-badge.d.ts.map +1 -0
  188. package/dist/components/status-badge.js +65 -0
  189. package/dist/components/status-change-dialog.d.ts +10 -0
  190. package/dist/components/status-change-dialog.d.ts.map +1 -0
  191. package/dist/components/status-change-dialog.js +57 -0
  192. package/dist/components/supplier-status-dialog.d.ts +10 -0
  193. package/dist/components/supplier-status-dialog.d.ts.map +1 -0
  194. package/dist/components/supplier-status-dialog.js +98 -0
  195. package/dist/components/supplier-status-list.d.ts +5 -0
  196. package/dist/components/supplier-status-list.d.ts.map +1 -0
  197. package/dist/components/supplier-status-list.js +115 -0
  198. package/dist/components/traveler-category-buttons.d.ts +26 -0
  199. package/dist/components/traveler-category-buttons.d.ts.map +1 -0
  200. package/dist/components/traveler-category-buttons.js +35 -0
  201. package/dist/components/traveler-dialog.d.ts +10 -0
  202. package/dist/components/traveler-dialog.d.ts.map +1 -0
  203. package/dist/components/traveler-dialog.js +256 -0
  204. package/dist/components/traveler-list.d.ts +6 -0
  205. package/dist/components/traveler-list.d.ts.map +1 -0
  206. package/dist/components/traveler-list.js +295 -0
  207. package/dist/components/travelers-section-controls.d.ts +52 -0
  208. package/dist/components/travelers-section-controls.d.ts.map +1 -0
  209. package/dist/components/travelers-section-controls.js +206 -0
  210. package/dist/components/travelers-section.d.ts +159 -0
  211. package/dist/components/travelers-section.d.ts.map +1 -0
  212. package/dist/components/travelers-section.js +355 -0
  213. package/dist/components/voucher-picker-section.d.ts +50 -0
  214. package/dist/components/voucher-picker-section.d.ts.map +1 -0
  215. package/dist/components/voucher-picker-section.js +79 -0
  216. package/dist/extras/client.d.ts +14 -0
  217. package/dist/extras/client.d.ts.map +1 -0
  218. package/dist/extras/client.js +58 -0
  219. package/dist/extras/components/extra-catalog-card.d.ts +13 -0
  220. package/dist/extras/components/extra-catalog-card.d.ts.map +1 -0
  221. package/dist/extras/components/extra-catalog-card.js +52 -0
  222. package/dist/extras/components/product-combobox.d.ts +9 -0
  223. package/dist/extras/components/product-combobox.d.ts.map +1 -0
  224. package/dist/extras/components/product-combobox.js +46 -0
  225. package/dist/extras/components/slot-extras-manifest-panel.d.ts +6 -0
  226. package/dist/extras/components/slot-extras-manifest-panel.d.ts.map +1 -0
  227. package/dist/extras/components/slot-extras-manifest-panel.js +108 -0
  228. package/dist/extras/hooks/index.d.ts +5 -0
  229. package/dist/extras/hooks/index.d.ts.map +1 -0
  230. package/dist/extras/hooks/index.js +4 -0
  231. package/dist/extras/hooks/use-product-extra.d.ts +24 -0
  232. package/dist/extras/hooks/use-product-extra.d.ts.map +1 -0
  233. package/dist/extras/hooks/use-product-extra.js +12 -0
  234. package/dist/extras/hooks/use-product-extras.d.ts +30 -0
  235. package/dist/extras/hooks/use-product-extras.d.ts.map +1 -0
  236. package/dist/extras/hooks/use-product-extras.js +12 -0
  237. package/dist/extras/hooks/use-slot-extra-manifest-mutation.d.ts +48 -0
  238. package/dist/extras/hooks/use-slot-extra-manifest-mutation.d.ts.map +1 -0
  239. package/dist/extras/hooks/use-slot-extra-manifest-mutation.js +26 -0
  240. package/dist/extras/hooks/use-slot-extra-manifest.d.ts +68 -0
  241. package/dist/extras/hooks/use-slot-extra-manifest.d.ts.map +1 -0
  242. package/dist/extras/hooks/use-slot-extra-manifest.js +11 -0
  243. package/dist/extras/i18n/en.d.ts +52 -0
  244. package/dist/extras/i18n/en.d.ts.map +1 -0
  245. package/dist/extras/i18n/en.js +51 -0
  246. package/dist/extras/i18n/index.d.ts +5 -0
  247. package/dist/extras/i18n/index.d.ts.map +1 -0
  248. package/dist/extras/i18n/index.js +3 -0
  249. package/dist/extras/i18n/messages.d.ts +37 -0
  250. package/dist/extras/i18n/messages.d.ts.map +1 -0
  251. package/dist/extras/i18n/messages.js +1 -0
  252. package/dist/extras/i18n/provider.d.ts +126 -0
  253. package/dist/extras/i18n/provider.d.ts.map +1 -0
  254. package/dist/extras/i18n/provider.js +44 -0
  255. package/dist/extras/i18n/ro.d.ts +52 -0
  256. package/dist/extras/i18n/ro.d.ts.map +1 -0
  257. package/dist/extras/i18n/ro.js +51 -0
  258. package/dist/extras/index.d.ts +7 -0
  259. package/dist/extras/index.d.ts.map +1 -0
  260. package/dist/extras/index.js +6 -0
  261. package/dist/extras/provider.d.ts +2 -0
  262. package/dist/extras/provider.d.ts.map +1 -0
  263. package/dist/extras/provider.js +1 -0
  264. package/dist/extras/query-keys.d.ts +16 -0
  265. package/dist/extras/query-keys.d.ts.map +1 -0
  266. package/dist/extras/query-keys.js +8 -0
  267. package/dist/extras/query-options.d.ts +455 -0
  268. package/dist/extras/query-options.d.ts.map +1 -0
  269. package/dist/extras/query-options.js +44 -0
  270. package/dist/extras/schemas.d.ts +416 -0
  271. package/dist/extras/schemas.d.ts.map +1 -0
  272. package/dist/extras/schemas.js +89 -0
  273. package/dist/extras/ui.d.ts +4 -0
  274. package/dist/extras/ui.d.ts.map +1 -0
  275. package/dist/extras/ui.js +3 -0
  276. package/dist/extras.d.ts +10 -0
  277. package/dist/extras.d.ts.map +1 -0
  278. package/dist/extras.js +9 -0
  279. package/dist/hooks/index.d.ts +36 -0
  280. package/dist/hooks/index.d.ts.map +1 -0
  281. package/dist/hooks/index.js +35 -0
  282. package/dist/hooks/use-booking-action-ledger.d.ts +63 -0
  283. package/dist/hooks/use-booking-action-ledger.d.ts.map +1 -0
  284. package/dist/hooks/use-booking-action-ledger.js +34 -0
  285. package/dist/hooks/use-booking-activity.d.ts +17 -0
  286. package/dist/hooks/use-booking-activity.d.ts.map +1 -0
  287. package/dist/hooks/use-booking-activity.js +12 -0
  288. package/dist/hooks/use-booking-cancel-mutation.d.ts +69 -0
  289. package/dist/hooks/use-booking-cancel-mutation.d.ts.map +1 -0
  290. package/dist/hooks/use-booking-cancel-mutation.js +24 -0
  291. package/dist/hooks/use-booking-contract-generation.d.ts +31 -0
  292. package/dist/hooks/use-booking-contract-generation.d.ts.map +1 -0
  293. package/dist/hooks/use-booking-contract-generation.js +36 -0
  294. package/dist/hooks/use-booking-convert-mutation.d.ts +81 -0
  295. package/dist/hooks/use-booking-convert-mutation.d.ts.map +1 -0
  296. package/dist/hooks/use-booking-convert-mutation.js +24 -0
  297. package/dist/hooks/use-booking-create-mutation.d.ts +337 -0
  298. package/dist/hooks/use-booking-create-mutation.d.ts.map +1 -0
  299. package/dist/hooks/use-booking-create-mutation.js +43 -0
  300. package/dist/hooks/use-booking-documents.d.ts +41 -0
  301. package/dist/hooks/use-booking-documents.d.ts.map +1 -0
  302. package/dist/hooks/use-booking-documents.js +46 -0
  303. package/dist/hooks/use-booking-dual-create-mutation.d.ts +338 -0
  304. package/dist/hooks/use-booking-dual-create-mutation.d.ts.map +1 -0
  305. package/dist/hooks/use-booking-dual-create-mutation.js +45 -0
  306. package/dist/hooks/use-booking-group-for-booking.d.ts +24 -0
  307. package/dist/hooks/use-booking-group-for-booking.d.ts.map +1 -0
  308. package/dist/hooks/use-booking-group-for-booking.js +12 -0
  309. package/dist/hooks/use-booking-group-member-mutation.d.ts +27 -0
  310. package/dist/hooks/use-booking-group-member-mutation.d.ts.map +1 -0
  311. package/dist/hooks/use-booking-group-member-mutation.js +38 -0
  312. package/dist/hooks/use-booking-group-mutation.d.ts +40 -0
  313. package/dist/hooks/use-booking-group-mutation.d.ts.map +1 -0
  314. package/dist/hooks/use-booking-group-mutation.js +32 -0
  315. package/dist/hooks/use-booking-group.d.ts +85 -0
  316. package/dist/hooks/use-booking-group.d.ts.map +1 -0
  317. package/dist/hooks/use-booking-group.js +12 -0
  318. package/dist/hooks/use-booking-groups.d.ts +21 -0
  319. package/dist/hooks/use-booking-groups.d.ts.map +1 -0
  320. package/dist/hooks/use-booking-groups.js +12 -0
  321. package/dist/hooks/use-booking-item-mutation.d.ts +101 -0
  322. package/dist/hooks/use-booking-item-mutation.d.ts.map +1 -0
  323. package/dist/hooks/use-booking-item-mutation.js +42 -0
  324. package/dist/hooks/use-booking-item-travelers.d.ts +32 -0
  325. package/dist/hooks/use-booking-item-travelers.d.ts.map +1 -0
  326. package/dist/hooks/use-booking-item-travelers.js +48 -0
  327. package/dist/hooks/use-booking-items.d.ts +36 -0
  328. package/dist/hooks/use-booking-items.d.ts.map +1 -0
  329. package/dist/hooks/use-booking-items.js +12 -0
  330. package/dist/hooks/use-booking-mutation.d.ts +158 -0
  331. package/dist/hooks/use-booking-mutation.d.ts.map +1 -0
  332. package/dist/hooks/use-booking-mutation.js +39 -0
  333. package/dist/hooks/use-booking-note-mutation.d.ts +39 -0
  334. package/dist/hooks/use-booking-note-mutation.d.ts.map +1 -0
  335. package/dist/hooks/use-booking-note-mutation.js +44 -0
  336. package/dist/hooks/use-booking-notes.d.ts +15 -0
  337. package/dist/hooks/use-booking-notes.d.ts.map +1 -0
  338. package/dist/hooks/use-booking-notes.js +12 -0
  339. package/dist/hooks/use-booking-primary-product.d.ts +28 -0
  340. package/dist/hooks/use-booking-primary-product.d.ts.map +1 -0
  341. package/dist/hooks/use-booking-primary-product.js +20 -0
  342. package/dist/hooks/use-booking-status-mutation.d.ts +156 -0
  343. package/dist/hooks/use-booking-status-mutation.d.ts.map +1 -0
  344. package/dist/hooks/use-booking-status-mutation.js +54 -0
  345. package/dist/hooks/use-booking-tax-preview.d.ts +29 -0
  346. package/dist/hooks/use-booking-tax-preview.d.ts.map +1 -0
  347. package/dist/hooks/use-booking-tax-preview.js +21 -0
  348. package/dist/hooks/use-booking.d.ts +67 -0
  349. package/dist/hooks/use-booking.d.ts.map +1 -0
  350. package/dist/hooks/use-booking.js +12 -0
  351. package/dist/hooks/use-bookings.d.ts +71 -0
  352. package/dist/hooks/use-bookings.d.ts.map +1 -0
  353. package/dist/hooks/use-bookings.js +12 -0
  354. package/dist/hooks/use-pricing-preview.d.ts +61 -0
  355. package/dist/hooks/use-pricing-preview.d.ts.map +1 -0
  356. package/dist/hooks/use-pricing-preview.js +18 -0
  357. package/dist/hooks/use-public-booking-session-flow-mutation.d.ts +148 -0
  358. package/dist/hooks/use-public-booking-session-flow-mutation.d.ts.map +1 -0
  359. package/dist/hooks/use-public-booking-session-flow-mutation.js +35 -0
  360. package/dist/hooks/use-public-booking-session-state.d.ts +16 -0
  361. package/dist/hooks/use-public-booking-session-state.d.ts.map +1 -0
  362. package/dist/hooks/use-public-booking-session-state.js +12 -0
  363. package/dist/hooks/use-public-booking-session.d.ts +101 -0
  364. package/dist/hooks/use-public-booking-session.d.ts.map +1 -0
  365. package/dist/hooks/use-public-booking-session.js +12 -0
  366. package/dist/hooks/use-reveal-traveler.d.ts +54 -0
  367. package/dist/hooks/use-reveal-traveler.d.ts.map +1 -0
  368. package/dist/hooks/use-reveal-traveler.js +18 -0
  369. package/dist/hooks/use-sharing-groups.d.ts +41 -0
  370. package/dist/hooks/use-sharing-groups.d.ts.map +1 -0
  371. package/dist/hooks/use-sharing-groups.js +20 -0
  372. package/dist/hooks/use-supplier-status-mutation.d.ts +46 -0
  373. package/dist/hooks/use-supplier-status-mutation.d.ts.map +1 -0
  374. package/dist/hooks/use-supplier-status-mutation.js +39 -0
  375. package/dist/hooks/use-supplier-statuses.d.ts +20 -0
  376. package/dist/hooks/use-supplier-statuses.d.ts.map +1 -0
  377. package/dist/hooks/use-supplier-statuses.js +12 -0
  378. package/dist/hooks/use-traveler-mutation.d.ts +55 -0
  379. package/dist/hooks/use-traveler-mutation.d.ts.map +1 -0
  380. package/dist/hooks/use-traveler-mutation.js +42 -0
  381. package/dist/hooks/use-traveler-with-travel-details-mutation.d.ts +120 -0
  382. package/dist/hooks/use-traveler-with-travel-details-mutation.d.ts.map +1 -0
  383. package/dist/hooks/use-traveler-with-travel-details-mutation.js +43 -0
  384. package/dist/hooks/use-travelers.d.ts +23 -0
  385. package/dist/hooks/use-travelers.d.ts.map +1 -0
  386. package/dist/hooks/use-travelers.js +12 -0
  387. package/dist/i18n/en-base.d.ts +295 -0
  388. package/dist/i18n/en-base.d.ts.map +1 -0
  389. package/dist/i18n/en-base.js +294 -0
  390. package/dist/i18n/en-create-list.d.ts +327 -0
  391. package/dist/i18n/en-create-list.d.ts.map +1 -0
  392. package/dist/i18n/en-create-list.js +326 -0
  393. package/dist/i18n/en-journey.d.ts +229 -0
  394. package/dist/i18n/en-journey.d.ts.map +1 -0
  395. package/dist/i18n/en-journey.js +228 -0
  396. package/dist/i18n/en-operations.d.ts +382 -0
  397. package/dist/i18n/en-operations.d.ts.map +1 -0
  398. package/dist/i18n/en-operations.js +381 -0
  399. package/dist/i18n/en-sections.d.ts +360 -0
  400. package/dist/i18n/en-sections.d.ts.map +1 -0
  401. package/dist/i18n/en-sections.js +359 -0
  402. package/dist/i18n/en.d.ts +1581 -0
  403. package/dist/i18n/en.d.ts.map +1 -0
  404. package/dist/i18n/en.js +12 -0
  405. package/dist/i18n/index.d.ts +5 -0
  406. package/dist/i18n/index.d.ts.map +1 -0
  407. package/dist/i18n/index.js +3 -0
  408. package/dist/i18n/messages-base.d.ts +251 -0
  409. package/dist/i18n/messages-base.d.ts.map +1 -0
  410. package/dist/i18n/messages-base.js +1 -0
  411. package/dist/i18n/messages-create-list.d.ts +310 -0
  412. package/dist/i18n/messages-create-list.d.ts.map +1 -0
  413. package/dist/i18n/messages-create-list.js +1 -0
  414. package/dist/i18n/messages-journey.d.ts +198 -0
  415. package/dist/i18n/messages-journey.d.ts.map +1 -0
  416. package/dist/i18n/messages-journey.js +1 -0
  417. package/dist/i18n/messages-operations.d.ts +362 -0
  418. package/dist/i18n/messages-operations.d.ts.map +1 -0
  419. package/dist/i18n/messages-operations.js +1 -0
  420. package/dist/i18n/messages-sections.d.ts +312 -0
  421. package/dist/i18n/messages-sections.d.ts.map +1 -0
  422. package/dist/i18n/messages-sections.js +1 -0
  423. package/dist/i18n/messages.d.ts +7 -0
  424. package/dist/i18n/messages.d.ts.map +1 -0
  425. package/dist/i18n/messages.js +1 -0
  426. package/dist/i18n/provider.d.ts +3185 -0
  427. package/dist/i18n/provider.d.ts.map +1 -0
  428. package/dist/i18n/provider.js +45 -0
  429. package/dist/i18n/ro-base.d.ts +295 -0
  430. package/dist/i18n/ro-base.d.ts.map +1 -0
  431. package/dist/i18n/ro-base.js +294 -0
  432. package/dist/i18n/ro-create-list.d.ts +327 -0
  433. package/dist/i18n/ro-create-list.d.ts.map +1 -0
  434. package/dist/i18n/ro-create-list.js +326 -0
  435. package/dist/i18n/ro-journey.d.ts +229 -0
  436. package/dist/i18n/ro-journey.d.ts.map +1 -0
  437. package/dist/i18n/ro-journey.js +228 -0
  438. package/dist/i18n/ro-operations.d.ts +382 -0
  439. package/dist/i18n/ro-operations.d.ts.map +1 -0
  440. package/dist/i18n/ro-operations.js +381 -0
  441. package/dist/i18n/ro-sections.d.ts +360 -0
  442. package/dist/i18n/ro-sections.d.ts.map +1 -0
  443. package/dist/i18n/ro-sections.js +359 -0
  444. package/dist/i18n/ro.d.ts +1581 -0
  445. package/dist/i18n/ro.d.ts.map +1 -0
  446. package/dist/i18n/ro.js +12 -0
  447. package/dist/index.d.ts +9 -0
  448. package/dist/index.d.ts.map +1 -0
  449. package/dist/index.js +8 -0
  450. package/dist/journey/components/booking-journey-rules.d.ts +48 -0
  451. package/dist/journey/components/booking-journey-rules.d.ts.map +1 -0
  452. package/dist/journey/components/booking-journey-rules.js +235 -0
  453. package/dist/journey/components/booking-journey.d.ts +3 -0
  454. package/dist/journey/components/booking-journey.d.ts.map +1 -0
  455. package/dist/journey/components/booking-journey.js +368 -0
  456. package/dist/journey/components/configure-step-skeleton.d.ts +8 -0
  457. package/dist/journey/components/configure-step-skeleton.d.ts.map +1 -0
  458. package/dist/journey/components/configure-step-skeleton.js +11 -0
  459. package/dist/journey/components/contract-preview-dialog.d.ts +47 -0
  460. package/dist/journey/components/contract-preview-dialog.d.ts.map +1 -0
  461. package/dist/journey/components/contract-preview-dialog.js +124 -0
  462. package/dist/journey/components/journey-steps/accommodation-step.d.ts +3 -0
  463. package/dist/journey/components/journey-steps/accommodation-step.d.ts.map +1 -0
  464. package/dist/journey/components/journey-steps/accommodation-step.js +71 -0
  465. package/dist/journey/components/journey-steps/addons-step.d.ts +3 -0
  466. package/dist/journey/components/journey-steps/addons-step.d.ts.map +1 -0
  467. package/dist/journey/components/journey-steps/addons-step.js +40 -0
  468. package/dist/journey/components/journey-steps/billing-step.d.ts +8 -0
  469. package/dist/journey/components/journey-steps/billing-step.d.ts.map +1 -0
  470. package/dist/journey/components/journey-steps/billing-step.js +78 -0
  471. package/dist/journey/components/journey-steps/configure-steps.d.ts +28 -0
  472. package/dist/journey/components/journey-steps/configure-steps.d.ts.map +1 -0
  473. package/dist/journey/components/journey-steps/configure-steps.js +232 -0
  474. package/dist/journey/components/journey-steps/documents-step.d.ts +11 -0
  475. package/dist/journey/components/journey-steps/documents-step.d.ts.map +1 -0
  476. package/dist/journey/components/journey-steps/documents-step.js +36 -0
  477. package/dist/journey/components/journey-steps/payment-step.d.ts +29 -0
  478. package/dist/journey/components/journey-steps/payment-step.d.ts.map +1 -0
  479. package/dist/journey/components/journey-steps/payment-step.js +225 -0
  480. package/dist/journey/components/journey-steps/review-step.d.ts +27 -0
  481. package/dist/journey/components/journey-steps/review-step.d.ts.map +1 -0
  482. package/dist/journey/components/journey-steps/review-step.js +18 -0
  483. package/dist/journey/components/journey-steps/shared.d.ts +75 -0
  484. package/dist/journey/components/journey-steps/shared.d.ts.map +1 -0
  485. package/dist/journey/components/journey-steps/shared.js +108 -0
  486. package/dist/journey/components/journey-steps/travelers-step.d.ts +7 -0
  487. package/dist/journey/components/journey-steps/travelers-step.d.ts.map +1 -0
  488. package/dist/journey/components/journey-steps/travelers-step.js +201 -0
  489. package/dist/journey/components/journey-steps.d.ts +21 -0
  490. package/dist/journey/components/journey-steps.d.ts.map +1 -0
  491. package/dist/journey/components/journey-steps.js +20 -0
  492. package/dist/journey/components/side-panel.d.ts +17 -0
  493. package/dist/journey/components/side-panel.d.ts.map +1 -0
  494. package/dist/journey/components/side-panel.js +245 -0
  495. package/dist/journey/components/stacked-journey.d.ts +30 -0
  496. package/dist/journey/components/stacked-journey.d.ts.map +1 -0
  497. package/dist/journey/components/stacked-journey.js +50 -0
  498. package/dist/journey/components/step-header.d.ts +7 -0
  499. package/dist/journey/components/step-header.d.ts.map +1 -0
  500. package/dist/journey/components/step-header.js +12 -0
  501. package/dist/journey/index.d.ts +18 -0
  502. package/dist/journey/index.d.ts.map +1 -0
  503. package/dist/journey/index.js +17 -0
  504. package/dist/journey/lib/draft-state.d.ts +35 -0
  505. package/dist/journey/lib/draft-state.d.ts.map +1 -0
  506. package/dist/journey/lib/draft-state.js +57 -0
  507. package/dist/journey/lib/pax-band-dependencies.d.ts +27 -0
  508. package/dist/journey/lib/pax-band-dependencies.d.ts.map +1 -0
  509. package/dist/journey/lib/pax-band-dependencies.js +50 -0
  510. package/dist/journey/lib/payment-schedule.d.ts +19 -0
  511. package/dist/journey/lib/payment-schedule.d.ts.map +1 -0
  512. package/dist/journey/lib/payment-schedule.js +90 -0
  513. package/dist/journey/types.d.ts +403 -0
  514. package/dist/journey/types.d.ts.map +1 -0
  515. package/dist/journey/types.js +19 -0
  516. package/dist/provider.d.ts +2 -0
  517. package/dist/provider.d.ts.map +1 -0
  518. package/dist/provider.js +1 -0
  519. package/dist/query-keys.d.ts +74 -0
  520. package/dist/query-keys.d.ts.map +1 -0
  521. package/dist/query-keys.js +26 -0
  522. package/dist/query-options.d.ts +2534 -0
  523. package/dist/query-options.d.ts.map +1 -0
  524. package/dist/query-options.js +233 -0
  525. package/dist/requirements/client.d.ts +14 -0
  526. package/dist/requirements/client.d.ts.map +1 -0
  527. package/dist/requirements/client.js +59 -0
  528. package/dist/requirements/components/booking-requirements-contact-tab.d.ts +8 -0
  529. package/dist/requirements/components/booking-requirements-contact-tab.d.ts.map +1 -0
  530. package/dist/requirements/components/booking-requirements-contact-tab.js +8 -0
  531. package/dist/requirements/components/booking-requirements-questions-tab.d.ts +14 -0
  532. package/dist/requirements/components/booking-requirements-questions-tab.d.ts.map +1 -0
  533. package/dist/requirements/components/booking-requirements-questions-tab.js +17 -0
  534. package/dist/requirements/constants.d.ts +114 -0
  535. package/dist/requirements/constants.d.ts.map +1 -0
  536. package/dist/requirements/constants.js +45 -0
  537. package/dist/requirements/hooks/index.d.ts +6 -0
  538. package/dist/requirements/hooks/index.d.ts.map +1 -0
  539. package/dist/requirements/hooks/index.js +6 -0
  540. package/dist/requirements/hooks/use-booking-questions.d.ts +24 -0
  541. package/dist/requirements/hooks/use-booking-questions.d.ts.map +1 -0
  542. package/dist/requirements/hooks/use-booking-questions.js +9 -0
  543. package/dist/requirements/hooks/use-contact-requirements.d.ts +22 -0
  544. package/dist/requirements/hooks/use-contact-requirements.d.ts.map +1 -0
  545. package/dist/requirements/hooks/use-contact-requirements.js +9 -0
  546. package/dist/requirements/hooks/use-products.d.ts +16 -0
  547. package/dist/requirements/hooks/use-products.d.ts.map +1 -0
  548. package/dist/requirements/hooks/use-products.js +9 -0
  549. package/dist/requirements/hooks/use-question-options.d.ts +19 -0
  550. package/dist/requirements/hooks/use-question-options.d.ts.map +1 -0
  551. package/dist/requirements/hooks/use-question-options.js +9 -0
  552. package/dist/requirements/hooks/use-transport-requirements.d.ts +30 -0
  553. package/dist/requirements/hooks/use-transport-requirements.d.ts.map +1 -0
  554. package/dist/requirements/hooks/use-transport-requirements.js +9 -0
  555. package/dist/requirements/i18n/en.d.ts +94 -0
  556. package/dist/requirements/i18n/en.d.ts.map +1 -0
  557. package/dist/requirements/i18n/en.js +93 -0
  558. package/dist/requirements/i18n/index.d.ts +5 -0
  559. package/dist/requirements/i18n/index.d.ts.map +1 -0
  560. package/dist/requirements/i18n/index.js +3 -0
  561. package/dist/requirements/i18n/messages.d.ts +59 -0
  562. package/dist/requirements/i18n/messages.d.ts.map +1 -0
  563. package/dist/requirements/i18n/messages.js +1 -0
  564. package/dist/requirements/i18n/provider.d.ts +210 -0
  565. package/dist/requirements/i18n/provider.d.ts.map +1 -0
  566. package/dist/requirements/i18n/provider.js +44 -0
  567. package/dist/requirements/i18n/ro.d.ts +94 -0
  568. package/dist/requirements/i18n/ro.d.ts.map +1 -0
  569. package/dist/requirements/i18n/ro.js +93 -0
  570. package/dist/requirements/index.d.ts +9 -0
  571. package/dist/requirements/index.d.ts.map +1 -0
  572. package/dist/requirements/index.js +8 -0
  573. package/dist/requirements/provider.d.ts +2 -0
  574. package/dist/requirements/provider.d.ts.map +1 -0
  575. package/dist/requirements/provider.js +1 -0
  576. package/dist/requirements/query-keys.d.ts +33 -0
  577. package/dist/requirements/query-keys.d.ts.map +1 -0
  578. package/dist/requirements/query-keys.js +13 -0
  579. package/dist/requirements/query-options.d.ts +371 -0
  580. package/dist/requirements/query-options.d.ts.map +1 -0
  581. package/dist/requirements/query-options.js +80 -0
  582. package/dist/requirements/schemas.d.ts +320 -0
  583. package/dist/requirements/schemas.d.ts.map +1 -0
  584. package/dist/requirements/schemas.js +121 -0
  585. package/dist/requirements/ui.d.ts +4 -0
  586. package/dist/requirements/ui.d.ts.map +1 -0
  587. package/dist/requirements/ui.js +3 -0
  588. package/dist/requirements/utils.d.ts +2 -0
  589. package/dist/requirements/utils.d.ts.map +1 -0
  590. package/dist/requirements/utils.js +4 -0
  591. package/dist/schemas.d.ts +2070 -0
  592. package/dist/schemas.d.ts.map +1 -0
  593. package/dist/schemas.js +507 -0
  594. package/dist/status-presentation.d.ts +34 -0
  595. package/dist/status-presentation.d.ts.map +1 -0
  596. package/dist/status-presentation.js +38 -0
  597. package/dist/ui.d.ts +43 -0
  598. package/dist/ui.d.ts.map +1 -0
  599. package/dist/ui.js +42 -0
  600. package/package.json +256 -0
  601. package/src/requirements/styles.css +1 -0
  602. package/src/styles.css +13 -0
@@ -0,0 +1,201 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { Separator } from "@voyant-travel/ui/components";
4
+ import { Button } from "@voyant-travel/ui/components/button";
5
+ import { Card, CardContent, CardHeader, CardTitle } from "@voyant-travel/ui/components/card";
6
+ import { Plus } from "lucide-react";
7
+ import { useEffect, useRef } from "react";
8
+ import { formatMessage, useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
9
+ import { canCopyBillingContactToTraveler, patchConfigure, setTravelers, totalPax, } from "../../lib/draft-state.js";
10
+ import { PaxDependencyWarnings, PaxValidation } from "./configure-steps.js";
11
+ import { computeAge, cryptoRowId, DateField, Field, JourneyWarnings, PhoneField, SelectField, } from "./shared.js";
12
+ /** Pax counts are DERIVED from the traveler rows — each row's band is the
13
+ * source of truth, so the quote always matches who's actually in the list. */
14
+ function paxFromTravelers(travelers, bands) {
15
+ const counts = {};
16
+ for (const band of bands)
17
+ counts[band.code] = 0;
18
+ for (const traveler of travelers) {
19
+ counts[traveler.band] = (counts[traveler.band] ?? 0) + 1;
20
+ }
21
+ return counts;
22
+ }
23
+ /** Commit a new traveler list AND re-derive the band counts in one update. */
24
+ function applyTravelers(draft, next, bands) {
25
+ return patchConfigure(setTravelers(draft, next), { pax: paxFromTravelers(next, bands) });
26
+ }
27
+ export function TravelersStep({ draft, setDraft, shape, renderTravelerContactPicker, warnings, }) {
28
+ const messages = useBookingsUiMessagesOrDefault();
29
+ const travelers = draft.travelers;
30
+ const bands = shape.paxBands;
31
+ const hasBandChoice = bands.length > 1;
32
+ const { min, max } = shape.paxBandsAllowedTotal;
33
+ // Seed the initial rows ONCE: from any pre-set band counts (detail-page
34
+ // hand-off) or up to the minimum party size, then keep the derived pax in
35
+ // sync. After this, the rows are authoritative.
36
+ const seeded = useRef(false);
37
+ // biome-ignore lint/correctness/useExhaustiveDependencies: one-shot seed guarded by the ref -- owner: bookings-react; existing suppression is intentional pending typed cleanup.
38
+ useEffect(() => {
39
+ if (seeded.current)
40
+ return;
41
+ seeded.current = true;
42
+ const target = Math.max(min, totalPax(draft), travelers.length);
43
+ if (travelers.length >= target) {
44
+ // Rows already exist — just make sure the counts reflect them.
45
+ if (travelers.length > 0)
46
+ setDraft(applyTravelers(draft, travelers, bands));
47
+ return;
48
+ }
49
+ const rows = [...travelers];
50
+ while (rows.length < target) {
51
+ rows.push({
52
+ rowId: cryptoRowId(),
53
+ firstName: "",
54
+ lastName: "",
55
+ band: bandForSeedIndex(draft, rows.length, shape),
56
+ });
57
+ }
58
+ setDraft(applyTravelers(draft, rows, bands));
59
+ }, []);
60
+ const addTraveler = () => {
61
+ const band = (bands[0]?.code ?? "adult");
62
+ const next = [...travelers, { rowId: cryptoRowId(), firstName: "", lastName: "", band }];
63
+ setDraft(applyTravelers(draft, next, bands));
64
+ };
65
+ const removeTraveler = (idx) => {
66
+ setDraft(applyTravelers(draft, travelers.filter((_, i) => i !== idx), bands));
67
+ };
68
+ const atMax = max != null && travelers.length >= max;
69
+ return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: messages.bookingJourney.travelers.title }) }), _jsx(Separator, {}), _jsxs(CardContent, { className: "space-y-4", children: [travelers.map((traveler, idx) => {
70
+ const apply = (contact) => {
71
+ const next = [...travelers];
72
+ next[idx] = {
73
+ ...next[idx],
74
+ firstName: contact.firstName,
75
+ lastName: contact.lastName,
76
+ email: contact.email,
77
+ phone: contact.phone,
78
+ personId: contact.personId,
79
+ };
80
+ setDraft(applyTravelers(draft, next, bands));
81
+ };
82
+ return (_jsx(TravelerCard, { idx: idx, traveler: traveler, shape: shape, draft: draft, setDraft: setDraft, renderTravelerContactPicker: renderTravelerContactPicker, apply: apply, showBandSelect: hasBandChoice, onRemove: travelers.length > 1 ? () => removeTraveler(idx) : undefined }, traveler.rowId ?? idx));
83
+ }), _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: addTraveler, disabled: atMax, className: "w-full", children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), messages.bookingJourney.travelers.addTraveler] }), _jsx(PaxValidation, { draft: draft, shape: shape }), _jsx(PaxDependencyWarnings, { draft: draft, shape: shape }), _jsx(JourneyWarnings, { warnings: warnings })] })] }));
84
+ }
85
+ /**
86
+ * One traveler block — type (band) selector, name, optional contact, age, and
87
+ * any descriptor-driven document fields. Honors `appliesToBands` so DOB is
88
+ * required for child / infant bands and adult-only fields like passport drop
89
+ * off the form for non-adult travelers.
90
+ */
91
+ function TravelerCard({ idx, traveler, shape, draft, setDraft, renderTravelerContactPicker, apply, showBandSelect, onRemove, }) {
92
+ const messages = useBookingsUiMessagesOrDefault();
93
+ const bands = shape.paxBands;
94
+ const applicableFields = shape.travelerFields.filter((f) => {
95
+ if (!f.appliesToBands || f.appliesToBands.length === 0)
96
+ return true;
97
+ return f.appliesToBands.includes(traveler.band);
98
+ });
99
+ const dobField = applicableFields.find((f) => f.key === "dateOfBirth");
100
+ const phoneField = applicableFields.find((f) => f.key === "phone");
101
+ const dynamicFields = applicableFields.filter((f) => !["firstName", "lastName", "email", "phone", "dateOfBirth"].includes(f.key));
102
+ // When a contact picker is wired (operator), identity comes from the picked
103
+ // CRM contact — the manual name/email/phone inputs are never shown (pick an
104
+ // existing contact or Create new). Only surfaces (e.g. storefront) WITHOUT a
105
+ // picker show the manual identity fields. Travel-specific fields (DOB,
106
+ // documents) always show.
107
+ const showIdentity = !renderTravelerContactPicker;
108
+ const gridHasContent = showIdentity || Boolean(dobField) || dynamicFields.length > 0;
109
+ // Live age from DOB — surfaces in the header so the user gets feedback as
110
+ // they pick a date.
111
+ const computedAge = traveler.dateOfBirth ? computeAge(traveler.dateOfBirth) : null;
112
+ // All row mutations go through here so the derived band counts stay in sync.
113
+ const patchRow = (patch) => {
114
+ const next = [...draft.travelers];
115
+ if (!next[idx])
116
+ return;
117
+ next[idx] = { ...next[idx], ...patch };
118
+ setDraft(applyTravelers(draft, next, bands));
119
+ };
120
+ // Picking a DOB that lands in a different band snaps the type selector to
121
+ // match, so pricing stays correct.
122
+ const onDobChange = (v) => {
123
+ const age = v ? computeAge(v) : null;
124
+ let band = traveler.band;
125
+ if (age != null) {
126
+ const target = bands.find((b) => {
127
+ if (b.minAge != null && age < b.minAge)
128
+ return false;
129
+ if (b.maxAge != null && age > b.maxAge)
130
+ return false;
131
+ return true;
132
+ });
133
+ if (target)
134
+ band = target.code;
135
+ }
136
+ patchRow({ dateOfBirth: v, band });
137
+ };
138
+ // Out-of-range warning — only when the DOB fits NO band (e.g. older than the
139
+ // supplier accepts); we can't auto-fix that, the booking would be rejected.
140
+ const ageOutOfBounds = computedAge != null &&
141
+ !bands.some((b) => {
142
+ if (b.minAge != null && computedAge < b.minAge)
143
+ return false;
144
+ if (b.maxAge != null && computedAge > b.maxAge)
145
+ return false;
146
+ return true;
147
+ });
148
+ // Quick-fill from billing — useful when the lead booker is also a traveler.
149
+ const billingContact = draft.billing.contact;
150
+ const canCopyFromBilling = canCopyBillingContactToTraveler(billingContact);
151
+ const copyFromBilling = () => {
152
+ patchRow({
153
+ firstName: billingContact.firstName,
154
+ lastName: billingContact.lastName,
155
+ email: billingContact.email || undefined,
156
+ phone: billingContact.phone || undefined,
157
+ personId: billingContact.personId || undefined,
158
+ });
159
+ };
160
+ const travelerName = [traveler.firstName, traveler.lastName].filter(Boolean).join(" ").trim();
161
+ return (_jsxs("div", { className: "space-y-4 rounded-md border p-4", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "text-sm font-medium", children: [formatMessage(messages.bookingJourney.travelers.travelerNumber, {
162
+ number: idx + 1,
163
+ }), travelerName ? (_jsx("span", { className: "text-muted-foreground font-normal", children: ` · ${travelerName}` })) : null, computedAge != null ? (_jsxs("span", { className: "text-muted-foreground font-normal", children: [" · ", formatMessage(messages.bookingJourney.travelers.ageLabel, {
164
+ age: computedAge,
165
+ })] })) : null] }), _jsxs("div", { className: "flex items-center gap-1", children: [canCopyFromBilling ? (_jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "h-7 text-muted-foreground", onClick: copyFromBilling, children: messages.bookingJourney.travelers.copyFromBilling })) : null, onRemove ? (_jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "h-7 text-destructive hover:text-destructive", onClick: onRemove, children: messages.bookingJourney.travelers.remove })) : null] })] }), showBandSelect ? (_jsx(SelectField, { id: `bj-trav-${idx}-band`, label: messages.bookingJourney.travelers.travelerType, value: traveler.band, options: bands.map((b) => ({ value: b.code, label: b.label })), onChange: (code) => patchRow({ band: code }) })) : null, renderTravelerContactPicker ? (_jsx("div", { children: renderTravelerContactPicker({
166
+ rowIndex: idx,
167
+ apply,
168
+ selectedPersonId: traveler.personId,
169
+ }) })) : null, gridHasContent ? (_jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [showIdentity ? (_jsxs(_Fragment, { children: [_jsx(Field, { id: `bj-trav-${idx}-first`, label: messages.bookingJourney.billing.firstName, value: traveler.firstName, onChange: (v) => patchRow({ firstName: v }) }), _jsx(Field, { id: `bj-trav-${idx}-last`, label: messages.bookingJourney.billing.lastName, value: traveler.lastName, onChange: (v) => patchRow({ lastName: v }) }), applicableFields.some((f) => f.key === "email") ? (_jsx(Field, { id: `bj-trav-${idx}-email`, label: messages.bookingJourney.billing.email, type: "email", value: traveler.email ?? "", onChange: (v) => patchRow({ email: v }) })) : null, phoneField ? (_jsx(PhoneField, { id: `bj-trav-${idx}-phone`,
170
+ // i18n-literal-ok Required marker appended to a descriptor-supplied field label.
171
+ label: phoneField.label + (phoneField.required ? " *" : ""), value: traveler.phone ?? "", onChange: (v) => patchRow({ phone: v }) })) : null] })) : null, dobField ? (_jsxs("div", { className: "space-y-1", children: [_jsx(DateField, { id: `bj-trav-${idx}-dob`,
172
+ // i18n-literal-ok Required marker appended to a descriptor-supplied field label.
173
+ label: dobField.label + (dobField.required ? " *" : ""), value: traveler.dateOfBirth ?? "", onChange: onDobChange, range: "past" }), ageOutOfBounds ? (_jsxs("p", { className: "text-amber-600 text-xs dark:text-amber-400", children: ["\u26A0", " ", formatMessage(messages.bookingJourney.validation.ageOutOfRange, {
174
+ age: computedAge,
175
+ })] })) : null] })) : null, dynamicFields.map((field) => {
176
+ const value = traveler.documents?.[field.key] ?? "";
177
+ const onFieldChange = (v) => patchRow({ documents: { ...traveler.documents, [field.key]: v } });
178
+ // i18n-literal-ok Required marker appended to a descriptor-supplied field label.
179
+ const labelText = field.label + (field.required ? " *" : "");
180
+ if (field.type === "select" && field.options) {
181
+ return (_jsx(SelectField, { id: `bj-trav-${idx}-${field.key}`, label: labelText, value: value, options: field.options, onChange: onFieldChange }, field.key));
182
+ }
183
+ if (field.type === "date") {
184
+ return (_jsx(DateField, { id: `bj-trav-${idx}-${field.key}`, label: labelText, value: value, onChange: onFieldChange, range: field.key === "documentExpiry" ? "document" : "future" }, field.key));
185
+ }
186
+ return (_jsx(Field, { id: `bj-trav-${idx}-${field.key}`, label: labelText, type: "text", value: value, onChange: onFieldChange }, field.key));
187
+ })] })) : null] }));
188
+ }
189
+ /** Band for a freshly-seeded row at `idx`, distributing across any pre-set
190
+ * band counts in order (so a detail-page hand-off of 1 adult + 1 child seeds
191
+ * the right two rows). Falls back to the first band. */
192
+ function bandForSeedIndex(draft, idx, shape) {
193
+ let cursor = 0;
194
+ for (const band of shape.paxBands) {
195
+ const count = draft.configure.pax?.[band.code] ?? 0;
196
+ if (idx < cursor + count)
197
+ return band.code;
198
+ cursor += count;
199
+ }
200
+ return (shape.paxBands[0]?.code ?? "adult");
201
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Step components rendered inside `<BookingJourney />`. Each takes a
3
+ * draft + setDraft pair plus the active descriptor; updates flow up
4
+ * via setDraft and the shell re-quotes on the next debounce tick.
5
+ *
6
+ * Per booking-journey-architecture §3.
7
+ *
8
+ * This module is a thin barrel — the implementations live in the
9
+ * `./journey-steps/` directory, split by step. Consumers import the
10
+ * same public symbols from here as before.
11
+ */
12
+ export { AccommodationStep } from "./journey-steps/accommodation-step.js";
13
+ export { AddonsStep } from "./journey-steps/addons-step.js";
14
+ export { BillingStep } from "./journey-steps/billing-step.js";
15
+ export { DepartureStep, OptionsStep } from "./journey-steps/configure-steps.js";
16
+ export { DocumentsStep } from "./journey-steps/documents-step.js";
17
+ export { FinalizeControls, PaymentStep } from "./journey-steps/payment-step.js";
18
+ export { ReviewStep } from "./journey-steps/review-step.js";
19
+ export { JourneyWarnings } from "./journey-steps/shared.js";
20
+ export { TravelersStep } from "./journey-steps/travelers-step.js";
21
+ //# sourceMappingURL=journey-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey-steps.d.ts","sourceRoot":"","sources":["../../../src/journey/components/journey-steps.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Step components rendered inside `<BookingJourney />`. Each takes a
3
+ * draft + setDraft pair plus the active descriptor; updates flow up
4
+ * via setDraft and the shell re-quotes on the next debounce tick.
5
+ *
6
+ * Per booking-journey-architecture §3.
7
+ *
8
+ * This module is a thin barrel — the implementations live in the
9
+ * `./journey-steps/` directory, split by step. Consumers import the
10
+ * same public symbols from here as before.
11
+ */
12
+ export { AccommodationStep } from "./journey-steps/accommodation-step.js";
13
+ export { AddonsStep } from "./journey-steps/addons-step.js";
14
+ export { BillingStep } from "./journey-steps/billing-step.js";
15
+ export { DepartureStep, OptionsStep } from "./journey-steps/configure-steps.js";
16
+ export { DocumentsStep } from "./journey-steps/documents-step.js";
17
+ export { FinalizeControls, PaymentStep } from "./journey-steps/payment-step.js";
18
+ export { ReviewStep } from "./journey-steps/review-step.js";
19
+ export { JourneyWarnings } from "./journey-steps/shared.js";
20
+ export { TravelersStep } from "./journey-steps/travelers-step.js";
@@ -0,0 +1,17 @@
1
+ import { useBookingsUiMessagesOrDefault } from "../../i18n/index.js";
2
+ import type { JourneyStep, SidePanelState } from "../types.js";
3
+ /**
4
+ * Right-rail summary panel. Shows what's being booked, an
5
+ * accordion-per-step recap of the user's input, and the live
6
+ * pricing breakdown at the bottom. The current step's accordion is
7
+ * expanded by default; users can click any step to peek at what
8
+ * they've filled in elsewhere.
9
+ */
10
+ export declare function PriceSidePanel({ pricing, isQuoting, invalidReason, entitySummary, currentStep, steps, shape, draft, className, pricingExtras, }: SidePanelState & {
11
+ className?: string;
12
+ /** Operator-only price controls (override + voucher) rendered with the
13
+ * pricing, where they're most in context. */
14
+ pricingExtras?: React.ReactNode;
15
+ }): React.ReactElement;
16
+ export declare function stepHeadline(step: JourneyStep, draft: NonNullable<SidePanelState["draft"]>, messages: ReturnType<typeof useBookingsUiMessagesOrDefault>): string;
17
+ //# sourceMappingURL=side-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"side-panel.d.ts","sourceRoot":"","sources":["../../../src/journey/components/side-panel.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAiB,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AACnF,OAAO,KAAK,EAAwB,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEpF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,EACT,aAAa,EACb,aAAa,EACb,WAAW,EACX,KAAK,EACL,KAAK,EACL,KAAK,EACL,SAAS,EACT,aAAa,GACd,EAAE,cAAc,GAAG;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;kDAC8C;IAC9C,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAChC,GAAG,KAAK,CAAC,YAAY,CA2FrB;AAoFD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAC3C,QAAQ,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,GAC1D,MAAM,CAgER"}
@@ -0,0 +1,245 @@
1
+ // agent-quality: file-size exception -- owner: bookings-react; existing UI surface stays co-located until a dedicated split preserves behavior and tests.
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@voyant-travel/ui/components/accordion";
5
+ import { Card, CardContent } from "@voyant-travel/ui/components/card";
6
+ import { Skeleton } from "@voyant-travel/ui/components/skeleton";
7
+ import { formatMessage, useBookingsUiMessagesOrDefault } from "../../i18n/index.js";
8
+ /**
9
+ * Right-rail summary panel. Shows what's being booked, an
10
+ * accordion-per-step recap of the user's input, and the live
11
+ * pricing breakdown at the bottom. The current step's accordion is
12
+ * expanded by default; users can click any step to peek at what
13
+ * they've filled in elsewhere.
14
+ */
15
+ export function PriceSidePanel({ pricing, isQuoting, invalidReason, entitySummary, currentStep, steps, shape, draft, className, pricingExtras, }) {
16
+ const messages = useBookingsUiMessagesOrDefault();
17
+ // Only surface pricing once the user has configured what actually drives
18
+ // the price — otherwise the quote's baseline shows a misleading total
19
+ // (e.g. a per-pax "from" price before any room is picked). Room products
20
+ // (an `option-units` sub-step) require a room selection; everything else
21
+ // requires at least one traveler.
22
+ const configuredPax = draft?.configure?.pax
23
+ ? Object.values(draft.configure.pax).reduce((sum, n) => sum + (n ?? 0), 0)
24
+ : 0;
25
+ const isRoomProduct = (shape?.configureSubSteps ?? []).some((s) => s.kind === "option-units");
26
+ const roomsPicked = (draft?.configure?.optionSelections?.length ?? 0) > 0;
27
+ const showPricing = isRoomProduct ? roomsPicked : configuredPax > 0;
28
+ const pricingHint = isRoomProduct
29
+ ? messages.bookingJourney.sidePanel.pricingHintRooms
30
+ : messages.bookingJourney.sidePanel.pricingHint;
31
+ // Departure shows directly under the product title — it's the most-glanced
32
+ // fact, so it doesn't belong buried in the recap accordion.
33
+ const departureText = draft ? stepHeadline("departure", draft, messages) : "";
34
+ return (_jsxs(Card, { className: className, children: [entitySummary?.heroImageUrl ? (_jsx("img", { src: entitySummary.heroImageUrl, alt: entitySummary.name, className: "aspect-video w-full object-cover" })) : null, entitySummary ? (_jsx(EntityHeader, { summary: entitySummary, departureText: departureText })) : null, _jsxs(CardContent, { className: "space-y-4", children: [steps && steps.length > 0 && currentStep && draft ? (_jsx(StepRecap, { steps: steps, currentStep: currentStep, draft: draft })) : null, invalidReason ? _jsx("p", { className: "text-destructive text-sm", children: invalidReason }) : null, !showPricing ? (_jsx("p", { className: "border-t pt-4 text-muted-foreground text-sm", children: pricingHint })) : isQuoting && !pricing ? (_jsxs("div", { className: "space-y-2 border-t pt-4", children: [_jsx(Skeleton, { className: "h-4 w-24" }), _jsx(Skeleton, { className: "h-4 w-32" }), _jsx(Skeleton, { className: "h-4 w-20" })] })) : null, showPricing && pricing ? (_jsxs("div", { className: "space-y-2 border-t pt-4", children: [_jsx("ul", { className: "space-y-1 text-sm", children: pricing.lines.map((line) => (_jsxs("li", { className: "flex justify-between", children: [_jsxs("span", { children: [line.label, line.quantity ? (_jsxs("span", { className: "text-muted-foreground", children: [" \u00D7 ", line.quantity] })) : null] }), _jsx("span", { children: formatMoney(line.totalAmount, pricing.currency) })] }, `${line.kind}-${line.label}-${line.totalAmount}`))) }), pricing.taxes.length > 0 ? (_jsx("ul", { className: "space-y-1 border-t pt-2 text-sm text-muted-foreground", children: pricing.taxes.map((tax) => (_jsxs("li", { className: "flex justify-between", children: [_jsxs("span", { children: [tax.label, tax.rate > 0 ? ` (${formatTaxRate(tax.rate)})` : ""] }), _jsx("span", { children: formatMoney(tax.amount, pricing.currency) })] }, tax.code))) })) : null, _jsxs("div", { className: "flex justify-between border-t pt-2 font-medium", children: [_jsx("span", { children: messages.bookingJourney.sidePanel.total }), _jsx("span", { children: formatMoney(pricing.total, pricing.currency) })] })] })) : null, pricingExtras ? _jsx("div", { className: "border-t pt-4", children: pricingExtras }) : null] })] }));
35
+ }
36
+ function EntityHeader({ summary, departureText, }) {
37
+ // Text block only — the hero image is rendered as a direct Card child above.
38
+ return (_jsxs("div", { className: "space-y-1 px-6 pt-4 pb-2", children: [_jsx("div", { className: "font-semibold leading-tight", children: summary.name }), departureText ? _jsx("div", { className: "text-muted-foreground text-sm", children: departureText }) : null, summary.subtitle ? (_jsx("div", { className: "text-muted-foreground text-sm", children: summary.subtitle })) : null, summary.whenLabel || summary.locationLabel ? (_jsx("div", { className: "text-muted-foreground text-xs", children: [summary.whenLabel, summary.locationLabel].filter(Boolean).join(" · ") })) : null] }));
39
+ }
40
+ function StepRecap({ steps, currentStep, draft, }) {
41
+ const messages = useBookingsUiMessagesOrDefault();
42
+ if (!draft)
43
+ return null;
44
+ // Departure shows in the header; payment + documents aren't worth a recap
45
+ // row — so the accordion covers the substantive in-between steps only.
46
+ const recapSteps = steps.filter((step) => step !== "departure" && step !== "payment" && step !== "documents");
47
+ if (recapSteps.length === 0)
48
+ return null;
49
+ // Default-open the current step. Uncontrolled — users can toggle
50
+ // freely. Re-mounts when currentStep changes (key) so the
51
+ // newly-active step opens automatically as the user advances.
52
+ return (_jsx(Accordion, { defaultValue: [currentStep], multiple: true, children: recapSteps.map((step) => (_jsxs(AccordionItem, { value: step, children: [_jsx(AccordionTrigger, { className: "py-3", children: _jsxs("div", { className: "flex flex-1 flex-col text-left", children: [_jsx("span", { className: step === currentStep ? "font-semibold" : "text-muted-foreground font-medium", children: stepLabel(step, messages) }), _jsx(StepSummaryLine, { step: step, draft: draft })] }) }), _jsx(AccordionContent, { children: _jsx(StepDetails, { step: step, draft: draft }) })] }, step))) }, currentStep));
53
+ }
54
+ function StepSummaryLine({ step, draft, }) {
55
+ const messages = useBookingsUiMessagesOrDefault();
56
+ const text = stepHeadline(step, draft, messages);
57
+ if (!text)
58
+ return null;
59
+ return _jsx("span", { className: "text-muted-foreground text-xs", children: text });
60
+ }
61
+ export function stepHeadline(step, draft, messages) {
62
+ switch (step) {
63
+ case "departure": {
64
+ const range = draft.configure?.dateRange;
65
+ if (range?.checkIn && range?.checkOut)
66
+ return `${range.checkIn} → ${range.checkOut}`;
67
+ // Never surface the raw slot id — show the departure date.
68
+ return draft.configure?.departureDate
69
+ ? formatConfigureDate(draft.configure.departureDate)
70
+ : "";
71
+ }
72
+ case "options": {
73
+ const rooms = (draft.configure?.optionSelections ?? []).reduce((sum, s) => sum + (s.quantity ?? 0), 0);
74
+ if (rooms <= 0)
75
+ return "";
76
+ return `${rooms} ${rooms === 1
77
+ ? messages.bookingJourney.sidePanel.roomSingular
78
+ : messages.bookingJourney.sidePanel.roomPlural}`;
79
+ }
80
+ case "billing": {
81
+ const c = draft.billing.contact;
82
+ const name = [c.firstName, c.lastName].filter(Boolean).join(" ").trim();
83
+ return name || c.email || messages.bookingJourney.values.notSet;
84
+ }
85
+ case "travelers": {
86
+ const filled = draft.travelers.filter((t) => t.firstName && t.lastName).length;
87
+ return formatMessage(messages.bookingJourney.sidePanel.filledOf, {
88
+ filled,
89
+ total: draft.travelers.length,
90
+ });
91
+ }
92
+ case "accommodation": {
93
+ const rooms = draft.accommodation?.rooms ?? [];
94
+ if (rooms.length === 0)
95
+ return "";
96
+ return `${rooms.length} ${rooms.length === 1
97
+ ? messages.bookingJourney.sidePanel.roomSingular
98
+ : messages.bookingJourney.sidePanel.roomPlural}`;
99
+ }
100
+ case "addons": {
101
+ const addons = draft.addons ?? [];
102
+ if (addons.length === 0)
103
+ return messages.bookingJourney.values.none;
104
+ return `${addons.length} ${addons.length === 1
105
+ ? messages.bookingJourney.sidePanel.addOnSingular
106
+ : messages.bookingJourney.sidePanel.addOnPlural}`;
107
+ }
108
+ case "payment": {
109
+ const intent = draft.payment.intent;
110
+ if (intent === "card")
111
+ return messages.bookingJourney.sidePanel.card;
112
+ if (intent === "hold")
113
+ return messages.bookingJourney.sidePanel.hold;
114
+ if (intent === "ticket_on_credit")
115
+ return messages.bookingJourney.sidePanel.onCredit;
116
+ return "";
117
+ }
118
+ case "review":
119
+ return messages.bookingJourney.sidePanel.confirmAndBook;
120
+ default:
121
+ return "";
122
+ }
123
+ }
124
+ function StepDetails({ step, draft, }) {
125
+ const messages = useBookingsUiMessagesOrDefault();
126
+ switch (step) {
127
+ case "departure":
128
+ return _jsx(DepartureDetails, { draft: draft });
129
+ case "options":
130
+ return _jsx(OptionsDetails, { draft: draft });
131
+ case "billing":
132
+ return _jsx(BillingDetails, { draft: draft });
133
+ case "travelers":
134
+ return _jsx(TravelersDetails, { draft: draft });
135
+ case "accommodation":
136
+ return _jsx(AccommodationDetails, { draft: draft });
137
+ case "addons":
138
+ return _jsx(AddonsDetails, { draft: draft });
139
+ case "payment":
140
+ return _jsx(PaymentDetails, { draft: draft });
141
+ case "review":
142
+ return (_jsx("p", { className: "text-muted-foreground text-xs", children: messages.bookingJourney.sidePanel.reviewDetails }));
143
+ default:
144
+ return null;
145
+ }
146
+ }
147
+ function DepartureDetails({ draft, }) {
148
+ const messages = useBookingsUiMessagesOrDefault();
149
+ const cfg = draft.configure ?? {};
150
+ const range = cfg.dateRange;
151
+ return (_jsxs("dl", { className: "space-y-1 text-xs", children: [cfg.departureDate ? (_jsx(Row, { label: messages.bookingJourney.sidePanel.departure, value: formatConfigureDate(cfg.departureDate) })) : null, range?.checkIn ? (_jsx(Row, { label: messages.bookingJourney.sidePanel.checkIn, value: range.checkIn })) : null, range?.checkOut ? (_jsx(Row, { label: messages.bookingJourney.sidePanel.checkOut, value: range.checkOut })) : null] }));
152
+ }
153
+ function OptionsDetails({ draft, }) {
154
+ const messages = useBookingsUiMessagesOrDefault();
155
+ const cfg = draft.configure ?? {};
156
+ const selections = (cfg.optionSelections ?? []).filter((s) => (s.quantity ?? 0) > 0);
157
+ return (_jsxs("dl", { className: "space-y-1 text-xs", children: [selections.map((selection) => (_jsx(Row, { label: selection.optionUnitName ?? selection.optionName ?? selection.optionId, value: `× ${selection.quantity}` }, selection.optionUnitId ?? selection.optionId))), cfg.cabinCategoryId ? (_jsx(Row, { label: messages.bookingJourney.sidePanel.cabin, value: cfg.cabinCategoryId })) : null] }));
158
+ }
159
+ function BillingDetails({ draft, }) {
160
+ const messages = useBookingsUiMessagesOrDefault();
161
+ const c = draft.billing.contact;
162
+ const a = draft.billing.address;
163
+ const addressLine = [a.line1, a.line2, a.city, a.postal, a.country].filter(Boolean).join(", ");
164
+ return (_jsxs("dl", { className: "space-y-1 text-xs", children: [_jsx(Row, { label: messages.bookingJourney.sidePanel.name, value: [c.firstName, c.lastName].filter(Boolean).join(" ") ||
165
+ messages.bookingJourney.values.noValue }), _jsx(Row, { label: messages.bookingJourney.sidePanel.email, value: c.email || messages.bookingJourney.values.noValue }), c.phone ? _jsx(Row, { label: messages.bookingJourney.sidePanel.phone, value: c.phone }) : null, _jsx(Row, { label: messages.bookingJourney.sidePanel.buyer, value: draft.billing.buyerType === "B2B"
166
+ ? messages.bookingJourney.sidePanel.company
167
+ : messages.bookingJourney.sidePanel.individual }), draft.billing.company?.name ? (_jsx(Row, { label: messages.bookingJourney.sidePanel.company, value: draft.billing.company.name })) : null, draft.billing.company?.vatId ? (_jsx(Row, { label: messages.bookingJourney.sidePanel.vat, value: draft.billing.company.vatId })) : null, addressLine ? (_jsx(Row, { label: messages.bookingJourney.sidePanel.address, value: addressLine })) : null] }));
168
+ }
169
+ function TravelersDetails({ draft, }) {
170
+ const messages = useBookingsUiMessagesOrDefault();
171
+ if (draft.travelers.length === 0) {
172
+ return (_jsx("p", { className: "text-muted-foreground text-xs", children: messages.bookingJourney.sidePanel.noTravelersYet }));
173
+ }
174
+ return (_jsx("ul", { className: "space-y-3 text-xs", children: draft.travelers.map((t, i) => {
175
+ const key = t.rowId ?? `t-${i}`;
176
+ const name = [t.firstName, t.lastName].filter(Boolean).join(" ").trim();
177
+ const docType = t.documents?.documentType;
178
+ const docNum = t.documents?.documentNumber;
179
+ const docExpiry = t.documents?.documentExpiry;
180
+ const docLine = [docType, docNum, docExpiry ? `exp ${docExpiry}` : null]
181
+ .filter(Boolean)
182
+ .join(" · ");
183
+ return (_jsxs("li", { className: "space-y-0.5", children: [_jsxs("div", { className: "flex justify-between gap-2", children: [_jsx("span", { className: "text-muted-foreground", children: formatMessage(messages.bookingJourney.sidePanel.travelerNumber, {
184
+ number: i + 1,
185
+ }) }), _jsx("span", { className: "truncate font-medium", children: name || messages.bookingJourney.values.noValue })] }), t.email ? _jsx("div", { className: "text-muted-foreground truncate", children: t.email }) : null, t.phone ? _jsx("div", { className: "text-muted-foreground", children: t.phone }) : null, t.dateOfBirth ? (_jsxs("div", { className: "text-muted-foreground", children: [messages.bookingJourney.sidePanel.dob, " ", t.dateOfBirth] })) : null, docLine ? _jsx("div", { className: "text-muted-foreground", children: docLine }) : null] }, key));
186
+ }) }));
187
+ }
188
+ function AccommodationDetails({ draft, }) {
189
+ const messages = useBookingsUiMessagesOrDefault();
190
+ const rooms = draft.accommodation?.rooms ?? [];
191
+ if (rooms.length === 0) {
192
+ return (_jsx("p", { className: "text-muted-foreground text-xs", children: messages.bookingJourney.sidePanel.notSelected }));
193
+ }
194
+ return (_jsx("ul", { className: "space-y-1 text-xs", children: rooms.map((r) => (_jsxs("li", { className: "flex justify-between gap-2", children: [_jsx("span", { className: "truncate", children: r.optionUnitId }), _jsxs("span", { className: "text-muted-foreground", children: ["\u00D7 ", r.quantity, r.ratePlanId ? ` · ${r.ratePlanId}` : ""] })] }, `${r.optionUnitId}-${r.ratePlanId ?? ""}-${r.quantity}`))) }));
195
+ }
196
+ function AddonsDetails({ draft, }) {
197
+ const messages = useBookingsUiMessagesOrDefault();
198
+ const addons = draft.addons ?? [];
199
+ if (addons.length === 0) {
200
+ return (_jsx("p", { className: "text-muted-foreground text-xs", children: messages.bookingJourney.sidePanel.noAddonsSelected }));
201
+ }
202
+ return (_jsx("ul", { className: "space-y-1 text-xs", children: addons.map((a) => (_jsxs("li", { className: "flex justify-between gap-2", children: [_jsx("span", { className: "truncate", children: a.extraId }), _jsxs("span", { className: "text-muted-foreground", children: ["\u00D7 ", a.quantity] })] }, `${a.extraId}-${a.quantity}`))) }));
203
+ }
204
+ function PaymentDetails({ draft, }) {
205
+ const messages = useBookingsUiMessagesOrDefault();
206
+ const intent = draft.payment.intent;
207
+ const label = intent === "card"
208
+ ? messages.bookingJourney.sidePanel.payByCard
209
+ : intent === "ticket_on_credit"
210
+ ? messages.bookingJourney.sidePanel.ticketOnCredit
211
+ : messages.bookingJourney.sidePanel.holdNoChargeYet;
212
+ return (_jsxs("dl", { className: "space-y-1 text-xs", children: [_jsx(Row, { label: messages.bookingJourney.sidePanel.method, value: label }), draft.payment.schedule ? (_jsx(Row, { label: messages.bookingJourney.sidePanel.schedule, value: String(draft.payment.schedule) })) : null] }));
213
+ }
214
+ function Row({ label, value }) {
215
+ return (_jsxs("div", { className: "flex justify-between gap-2", children: [_jsx("dt", { className: "text-muted-foreground", children: label }), _jsx("dd", { className: "truncate text-right", children: value })] }));
216
+ }
217
+ function stepLabel(step, messages) {
218
+ if (step === "billing")
219
+ return messages.bookingJourney.steps.billingAndContact;
220
+ return messages.bookingJourney.steps[step];
221
+ }
222
+ function formatMoney(cents, currency) {
223
+ try {
224
+ return new Intl.NumberFormat(undefined, { style: "currency", currency }).format(cents / 100);
225
+ }
226
+ catch {
227
+ return `${(cents / 100).toFixed(2)} ${currency}`;
228
+ }
229
+ }
230
+ /** Tax rate is stored as a fraction (0.19 → "19%"). Trim trailing zeros. */
231
+ function formatTaxRate(rate) {
232
+ return `${Number((rate * 100).toFixed(2))}%`;
233
+ }
234
+ /** Format an ISO date (YYYY-MM-DD or full ISO) for the recap, falling back
235
+ * to the raw value when unparseable. Never surfaces a raw slot id. */
236
+ function formatConfigureDate(iso) {
237
+ const date = new Date(iso);
238
+ if (Number.isNaN(date.getTime()))
239
+ return iso;
240
+ return new Intl.DateTimeFormat(undefined, {
241
+ year: "numeric",
242
+ month: "short",
243
+ day: "numeric",
244
+ }).format(date);
245
+ }
@@ -0,0 +1,30 @@
1
+ import type * as React from "react";
2
+ import type { JourneyStep } from "../types.js";
3
+ /**
4
+ * The admin's guided single-page layout — every section is a block on one
5
+ * page, but content stays collapsed until the previous section is complete,
6
+ * so the operator fills them in sequence and focuses on one at a time.
7
+ *
8
+ * - LOCKED (a prior section isn't done): a muted, disabled summary row.
9
+ * - ACTIVE (the first not-yet-done section): expanded with its full
10
+ * content + a "Continue" button (enabled once the section is valid).
11
+ * - DONE (passed via Continue): collapses to a one-line summary row with a
12
+ * check — click to re-open and edit, so nothing entered is ever lost.
13
+ *
14
+ * Completeness derives from the same per-step gate the wizard uses; the
15
+ * final Review section's Confirm is gated on the whole booking.
16
+ */
17
+ export declare function StackedJourney({ className, steps, renderStep, isStepComplete, commitError, onCancel, onConfirm, isCommitting, canConfirm, sidePanel, contractDialog, }: {
18
+ className?: string;
19
+ steps: ReadonlyArray<JourneyStep>;
20
+ renderStep: (step: JourneyStep) => React.ReactNode;
21
+ isStepComplete: (step: JourneyStep) => boolean;
22
+ commitError: unknown;
23
+ onCancel?: () => void;
24
+ onConfirm?: () => void;
25
+ isCommitting?: boolean;
26
+ canConfirm?: boolean;
27
+ sidePanel: React.ReactNode;
28
+ contractDialog: React.ReactNode;
29
+ }): React.ReactElement;
30
+ //# sourceMappingURL=stacked-journey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stacked-journey.d.ts","sourceRoot":"","sources":["../../../src/journey/components/stacked-journey.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAW9C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,KAAK,EACL,UAAU,EACV,cAAc,EACd,WAAW,EACX,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,SAAS,EACT,cAAc,GACf,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,KAAK,CAAC,SAAS,CAAA;IAClD,cAAc,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAA;IAC9C,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,cAAc,EAAE,KAAK,CAAC,SAAS,CAAA;CAChC,GAAG,KAAK,CAAC,YAAY,CAiGrB"}
@@ -0,0 +1,50 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { Button } from "@voyant-travel/ui/components/button";
4
+ import { Tooltip, TooltipContent, TooltipTrigger } from "@voyant-travel/ui/components/tooltip";
5
+ import { Loader2, Lock } from "lucide-react";
6
+ import { useBookingsUiMessagesOrDefault } from "../../i18n/index.js";
7
+ const sectionId = (step) => `bj-section-${step}`;
8
+ /**
9
+ * The sequential gates in the stacked layout: each must be filled before the
10
+ * next sections unlock. Once all three are done, the remaining sections
11
+ * (options, extras, payment) all open together.
12
+ */
13
+ const GATE_STEPS = new Set(["departure", "billing", "travelers"]);
14
+ /**
15
+ * The admin's guided single-page layout — every section is a block on one
16
+ * page, but content stays collapsed until the previous section is complete,
17
+ * so the operator fills them in sequence and focuses on one at a time.
18
+ *
19
+ * - LOCKED (a prior section isn't done): a muted, disabled summary row.
20
+ * - ACTIVE (the first not-yet-done section): expanded with its full
21
+ * content + a "Continue" button (enabled once the section is valid).
22
+ * - DONE (passed via Continue): collapses to a one-line summary row with a
23
+ * check — click to re-open and edit, so nothing entered is ever lost.
24
+ *
25
+ * Completeness derives from the same per-step gate the wizard uses; the
26
+ * final Review section's Confirm is gated on the whole booking.
27
+ */
28
+ export function StackedJourney({ className, steps, renderStep, isStepComplete, commitError, onCancel, onConfirm, isCommitting, canConfirm, sidePanel, contractDialog, }) {
29
+ const messages = useBookingsUiMessagesOrDefault();
30
+ const nav = messages.bookingJourney.navigation;
31
+ // Progressive unlock gated only on the SEQUENTIAL gates (departure →
32
+ // billing → travelers). Once those are filled, the remaining sections
33
+ // (options, extras, payment) all unlock together — they're independent
34
+ // refinements, not a strict sequence. Unlocked sections stay open so the
35
+ // operator keeps full context of everything they've filled.
36
+ const firstIncompleteGate = steps.find((s) => GATE_STEPS.has(s) && !isStepComplete(s));
37
+ const unlockThroughIndex = firstIncompleteGate
38
+ ? steps.indexOf(firstIncompleteGate)
39
+ : steps.length - 1;
40
+ return (_jsxs("div", { className: className, children: [_jsxs("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-8 md:items-start", children: [_jsxs("div", { className: "space-y-3 md:col-span-5", children: [steps.map((step, i) => {
41
+ // Locked: a section beyond the active gate — a muted, disabled row
42
+ // until the operator clears the gates above it.
43
+ if (i > unlockThroughIndex) {
44
+ return (_jsxs("div", { id: sectionId(step), className: "flex w-full scroll-mt-4 items-center gap-3 rounded-md border p-4 opacity-60", children: [_jsx("span", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground text-xs", children: i + 1 }), _jsx("div", { className: "min-w-0 flex-1 font-medium text-sm", children: messages.bookingJourney.steps[step] }), _jsx(Lock, { className: "h-4 w-4 text-muted-foreground" })] }, step));
45
+ }
46
+ // Unlocked: full section content, stays open once reached. Its
47
+ // warnings render inside the step's own card (scoped to the block).
48
+ return (_jsx("section", { id: sectionId(step), className: "scroll-mt-4", children: renderStep(step) }, step));
49
+ }), commitError ? (_jsx("p", { className: "text-destructive text-sm", children: commitError instanceof Error ? commitError.message : String(commitError) })) : null, _jsxs("div", { className: "flex items-center gap-2 pt-1", children: [_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => onCancel?.(), children: nav.cancel }), onConfirm ? (canConfirm === false ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { render: _jsx("span", { className: "ml-auto inline-flex" }), children: _jsx(Button, { type: "button", disabled: true, children: messages.bookingJourney.review.confirmBooking }) }), _jsx(TooltipContent, { children: messages.bookingJourney.review.completeToConfirm })] })) : (_jsx(Button, { type: "button", className: "ml-auto", onClick: onConfirm, disabled: isCommitting === true, children: isCommitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), messages.bookingJourney.review.confirming] })) : (messages.bookingJourney.review.confirmBooking) }))) : null] })] }), _jsx("aside", { className: "md:sticky md:top-4 md:col-span-3", children: sidePanel })] }), contractDialog] }));
50
+ }
@@ -0,0 +1,7 @@
1
+ import type { JourneyHeaderState, JourneyStep } from "../types.js";
2
+ interface StepHeaderProps extends JourneyHeaderState {
3
+ onJumpTo: (step: JourneyStep) => void;
4
+ }
5
+ export declare function StepHeader({ current, visited, steps, onJumpTo, }: StepHeaderProps): React.ReactElement;
6
+ export {};
7
+ //# sourceMappingURL=step-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-header.d.ts","sourceRoot":"","sources":["../../../src/journey/components/step-header.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAElE,UAAU,eAAgB,SAAQ,kBAAkB;IAClD,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;CACtC;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAwBtC"}