@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.
- package/LICENSE +201 -0
- package/README.md +87 -0
- package/dist/admin/booking-contract-dialog.d.ts +22 -0
- package/dist/admin/booking-contract-dialog.d.ts.map +1 -0
- package/dist/admin/booking-contract-dialog.js +161 -0
- package/dist/admin/booking-detail-host.d.ts +103 -0
- package/dist/admin/booking-detail-host.d.ts.map +1 -0
- package/dist/admin/booking-detail-host.js +127 -0
- package/dist/admin/booking-detail-skeleton.d.ts +7 -0
- package/dist/admin/booking-detail-skeleton.d.ts.map +1 -0
- package/dist/admin/booking-detail-skeleton.js +24 -0
- package/dist/admin/booking-documents-table.d.ts +13 -0
- package/dist/admin/booking-documents-table.d.ts.map +1 -0
- package/dist/admin/booking-documents-table.js +259 -0
- package/dist/admin/booking-invoice-sheet.d.ts +18 -0
- package/dist/admin/booking-invoice-sheet.d.ts.map +1 -0
- package/dist/admin/booking-invoice-sheet.js +101 -0
- package/dist/admin/booking-journey-host.d.ts +24 -0
- package/dist/admin/booking-journey-host.d.ts.map +1 -0
- package/dist/admin/booking-journey-host.js +278 -0
- package/dist/admin/bookings-host.d.ts +26 -0
- package/dist/admin/bookings-host.d.ts.map +1 -0
- package/dist/admin/bookings-host.js +18 -0
- package/dist/admin/bookings-list-skeleton.d.ts +10 -0
- package/dist/admin/bookings-list-skeleton.d.ts.map +1 -0
- package/dist/admin/bookings-list-skeleton.js +25 -0
- package/dist/admin/index.d.ts +273 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +331 -0
- package/dist/admin/journey-billing-duplicate-warning.d.ts +3 -0
- package/dist/admin/journey-billing-duplicate-warning.d.ts.map +1 -0
- package/dist/admin/journey-billing-duplicate-warning.js +26 -0
- package/dist/admin/journey-departure-picker.d.ts +7 -0
- package/dist/admin/journey-departure-picker.d.ts.map +1 -0
- package/dist/admin/journey-departure-picker.js +100 -0
- package/dist/admin/journey-units-picker.d.ts +11 -0
- package/dist/admin/journey-units-picker.d.ts.map +1 -0
- package/dist/admin/journey-units-picker.js +60 -0
- package/dist/admin/journey-voucher-picker.d.ts +3 -0
- package/dist/admin/journey-voucher-picker.d.ts.map +1 -0
- package/dist/admin/journey-voucher-picker.js +71 -0
- package/dist/admin/pages/booking-compose-page.d.ts +9 -0
- package/dist/admin/pages/booking-compose-page.d.ts.map +1 -0
- package/dist/admin/pages/booking-compose-page.js +17 -0
- package/dist/admin/pages/booking-detail-page.d.ts +11 -0
- package/dist/admin/pages/booking-detail-page.d.ts.map +1 -0
- package/dist/admin/pages/booking-detail-page.js +14 -0
- package/dist/admin/pages/booking-journey-page.d.ts +12 -0
- package/dist/admin/pages/booking-journey-page.d.ts.map +1 -0
- package/dist/admin/pages/booking-journey-page.js +26 -0
- package/dist/admin/pages/booking-new-page.d.ts +15 -0
- package/dist/admin/pages/booking-new-page.d.ts.map +1 -0
- package/dist/admin/pages/booking-new-page.js +50 -0
- package/dist/admin/pages/bookings-index-page.d.ts +20 -0
- package/dist/admin/pages/bookings-index-page.d.ts.map +1 -0
- package/dist/admin/pages/bookings-index-page.js +18 -0
- package/dist/admin/person-bookings-widget.d.ts +13 -0
- package/dist/admin/person-bookings-widget.d.ts.map +1 -0
- package/dist/admin/person-bookings-widget.js +48 -0
- package/dist/admin/slots.d.ts +31 -0
- package/dist/admin/slots.d.ts.map +1 -0
- package/dist/admin/slots.js +30 -0
- package/dist/admin/use-booking-action-ledger-events.d.ts +15 -0
- package/dist/admin/use-booking-action-ledger-events.d.ts.map +1 -0
- package/dist/admin/use-booking-action-ledger-events.js +66 -0
- package/dist/client.d.ts +14 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +59 -0
- package/dist/components/booking-activity-timeline.d.ts +32 -0
- package/dist/components/booking-activity-timeline.d.ts.map +1 -0
- package/dist/components/booking-activity-timeline.js +147 -0
- package/dist/components/booking-billing-dialog.d.ts +16 -0
- package/dist/components/booking-billing-dialog.d.ts.map +1 -0
- package/dist/components/booking-billing-dialog.js +315 -0
- package/dist/components/booking-cancellation-dialog.d.ts +18 -0
- package/dist/components/booking-cancellation-dialog.d.ts.map +1 -0
- package/dist/components/booking-cancellation-dialog.js +79 -0
- package/dist/components/booking-combobox.d.ts +13 -0
- package/dist/components/booking-combobox.d.ts.map +1 -0
- package/dist/components/booking-combobox.js +44 -0
- package/dist/components/booking-create-form-utils.d.ts +56 -0
- package/dist/components/booking-create-form-utils.d.ts.map +1 -0
- package/dist/components/booking-create-form-utils.js +216 -0
- package/dist/components/booking-create-page.d.ts +14 -0
- package/dist/components/booking-create-page.d.ts.map +1 -0
- package/dist/components/booking-create-page.js +11 -0
- package/dist/components/booking-create-preview-card.d.ts +26 -0
- package/dist/components/booking-create-preview-card.d.ts.map +1 -0
- package/dist/components/booking-create-preview-card.js +107 -0
- package/dist/components/booking-create-product-extras-picker.d.ts +18 -0
- package/dist/components/booking-create-product-extras-picker.d.ts.map +1 -0
- package/dist/components/booking-create-product-extras-picker.js +82 -0
- package/dist/components/booking-create-sheet.d.ts +34 -0
- package/dist/components/booking-create-sheet.d.ts.map +1 -0
- package/dist/components/booking-create-sheet.js +811 -0
- package/dist/components/booking-create-utils.d.ts +66 -0
- package/dist/components/booking-create-utils.d.ts.map +1 -0
- package/dist/components/booking-create-utils.js +185 -0
- package/dist/components/booking-detail-page.d.ts +126 -0
- package/dist/components/booking-detail-page.d.ts.map +1 -0
- package/dist/components/booking-detail-page.js +264 -0
- package/dist/components/booking-dialog.d.ts +28 -0
- package/dist/components/booking-dialog.d.ts.map +1 -0
- package/dist/components/booking-dialog.js +130 -0
- package/dist/components/booking-document-dialog.d.ts +8 -0
- package/dist/components/booking-document-dialog.d.ts.map +1 -0
- package/dist/components/booking-document-dialog.js +83 -0
- package/dist/components/booking-document-list.d.ts +5 -0
- package/dist/components/booking-document-list.d.ts.map +1 -0
- package/dist/components/booking-document-list.js +43 -0
- package/dist/components/booking-group-link-dialog.d.ts +10 -0
- package/dist/components/booking-group-link-dialog.d.ts.map +1 -0
- package/dist/components/booking-group-link-dialog.js +79 -0
- package/dist/components/booking-group-section.d.ts +27 -0
- package/dist/components/booking-group-section.d.ts.map +1 -0
- package/dist/components/booking-group-section.js +51 -0
- package/dist/components/booking-guarantee-dialog.d.ts +10 -0
- package/dist/components/booking-guarantee-dialog.d.ts.map +1 -0
- package/dist/components/booking-guarantee-dialog.js +123 -0
- package/dist/components/booking-guarantee-list.d.ts +5 -0
- package/dist/components/booking-guarantee-list.d.ts.map +1 -0
- package/dist/components/booking-guarantee-list.js +86 -0
- package/dist/components/booking-item-dialog.d.ts +10 -0
- package/dist/components/booking-item-dialog.d.ts.map +1 -0
- package/dist/components/booking-item-dialog.js +155 -0
- package/dist/components/booking-item-list.d.ts +12 -0
- package/dist/components/booking-item-list.d.ts.map +1 -0
- package/dist/components/booking-item-list.js +191 -0
- package/dist/components/booking-item-travelers.d.ts +6 -0
- package/dist/components/booking-item-travelers.d.ts.map +1 -0
- package/dist/components/booking-item-travelers.js +57 -0
- package/dist/components/booking-list-filters.d.ts +43 -0
- package/dist/components/booking-list-filters.d.ts.map +1 -0
- package/dist/components/booking-list-filters.js +192 -0
- package/dist/components/booking-list.d.ts +50 -0
- package/dist/components/booking-list.d.ts.map +1 -0
- package/dist/components/booking-list.js +352 -0
- package/dist/components/booking-note-dialog.d.ts +16 -0
- package/dist/components/booking-note-dialog.d.ts.map +1 -0
- package/dist/components/booking-note-dialog.js +41 -0
- package/dist/components/booking-notes.d.ts +5 -0
- package/dist/components/booking-notes.d.ts.map +1 -0
- package/dist/components/booking-notes.js +45 -0
- package/dist/components/booking-payment-reconciliation-banner.d.ts +5 -0
- package/dist/components/booking-payment-reconciliation-banner.d.ts.map +1 -0
- package/dist/components/booking-payment-reconciliation-banner.js +91 -0
- package/dist/components/booking-payment-schedule-dialog.d.ts +10 -0
- package/dist/components/booking-payment-schedule-dialog.d.ts.map +1 -0
- package/dist/components/booking-payment-schedule-dialog.js +117 -0
- package/dist/components/booking-payment-schedule-list.d.ts +10 -0
- package/dist/components/booking-payment-schedule-list.d.ts.map +1 -0
- package/dist/components/booking-payment-schedule-list.js +217 -0
- package/dist/components/booking-payments-summary.d.ts +83 -0
- package/dist/components/booking-payments-summary.d.ts.map +1 -0
- package/dist/components/booking-payments-summary.js +176 -0
- package/dist/components/booking-quick-view-sheet.d.ts +14 -0
- package/dist/components/booking-quick-view-sheet.d.ts.map +1 -0
- package/dist/components/booking-quick-view-sheet.js +283 -0
- package/dist/components/bookings-page.d.ts +19 -0
- package/dist/components/bookings-page.d.ts.map +1 -0
- package/dist/components/bookings-page.js +9 -0
- package/dist/components/file-dropzone.d.ts +25 -0
- package/dist/components/file-dropzone.d.ts.map +1 -0
- package/dist/components/file-dropzone.js +102 -0
- package/dist/components/icon-action-button.d.ts +18 -0
- package/dist/components/icon-action-button.d.ts.map +1 -0
- package/dist/components/icon-action-button.js +13 -0
- package/dist/components/option-units-stepper-section.d.ts +111 -0
- package/dist/components/option-units-stepper-section.d.ts.map +1 -0
- package/dist/components/option-units-stepper-section.js +276 -0
- package/dist/components/payment-schedule-section.d.ts +91 -0
- package/dist/components/payment-schedule-section.d.ts.map +1 -0
- package/dist/components/payment-schedule-section.js +206 -0
- package/dist/components/person-picker-section.d.ts +71 -0
- package/dist/components/person-picker-section.d.ts.map +1 -0
- package/dist/components/person-picker-section.js +160 -0
- package/dist/components/price-breakdown-section.d.ts +83 -0
- package/dist/components/price-breakdown-section.d.ts.map +1 -0
- package/dist/components/price-breakdown-section.js +278 -0
- package/dist/components/product-picker-section.d.ts +29 -0
- package/dist/components/product-picker-section.d.ts.map +1 -0
- package/dist/components/product-picker-section.js +74 -0
- package/dist/components/shared-room-section.d.ts +40 -0
- package/dist/components/shared-room-section.d.ts.map +1 -0
- package/dist/components/shared-room-section.js +99 -0
- package/dist/components/status-badge.d.ts +24 -0
- package/dist/components/status-badge.d.ts.map +1 -0
- package/dist/components/status-badge.js +65 -0
- package/dist/components/status-change-dialog.d.ts +10 -0
- package/dist/components/status-change-dialog.d.ts.map +1 -0
- package/dist/components/status-change-dialog.js +57 -0
- package/dist/components/supplier-status-dialog.d.ts +10 -0
- package/dist/components/supplier-status-dialog.d.ts.map +1 -0
- package/dist/components/supplier-status-dialog.js +98 -0
- package/dist/components/supplier-status-list.d.ts +5 -0
- package/dist/components/supplier-status-list.d.ts.map +1 -0
- package/dist/components/supplier-status-list.js +115 -0
- package/dist/components/traveler-category-buttons.d.ts +26 -0
- package/dist/components/traveler-category-buttons.d.ts.map +1 -0
- package/dist/components/traveler-category-buttons.js +35 -0
- package/dist/components/traveler-dialog.d.ts +10 -0
- package/dist/components/traveler-dialog.d.ts.map +1 -0
- package/dist/components/traveler-dialog.js +256 -0
- package/dist/components/traveler-list.d.ts +6 -0
- package/dist/components/traveler-list.d.ts.map +1 -0
- package/dist/components/traveler-list.js +295 -0
- package/dist/components/travelers-section-controls.d.ts +52 -0
- package/dist/components/travelers-section-controls.d.ts.map +1 -0
- package/dist/components/travelers-section-controls.js +206 -0
- package/dist/components/travelers-section.d.ts +159 -0
- package/dist/components/travelers-section.d.ts.map +1 -0
- package/dist/components/travelers-section.js +355 -0
- package/dist/components/voucher-picker-section.d.ts +50 -0
- package/dist/components/voucher-picker-section.d.ts.map +1 -0
- package/dist/components/voucher-picker-section.js +79 -0
- package/dist/extras/client.d.ts +14 -0
- package/dist/extras/client.d.ts.map +1 -0
- package/dist/extras/client.js +58 -0
- package/dist/extras/components/extra-catalog-card.d.ts +13 -0
- package/dist/extras/components/extra-catalog-card.d.ts.map +1 -0
- package/dist/extras/components/extra-catalog-card.js +52 -0
- package/dist/extras/components/product-combobox.d.ts +9 -0
- package/dist/extras/components/product-combobox.d.ts.map +1 -0
- package/dist/extras/components/product-combobox.js +46 -0
- package/dist/extras/components/slot-extras-manifest-panel.d.ts +6 -0
- package/dist/extras/components/slot-extras-manifest-panel.d.ts.map +1 -0
- package/dist/extras/components/slot-extras-manifest-panel.js +108 -0
- package/dist/extras/hooks/index.d.ts +5 -0
- package/dist/extras/hooks/index.d.ts.map +1 -0
- package/dist/extras/hooks/index.js +4 -0
- package/dist/extras/hooks/use-product-extra.d.ts +24 -0
- package/dist/extras/hooks/use-product-extra.d.ts.map +1 -0
- package/dist/extras/hooks/use-product-extra.js +12 -0
- package/dist/extras/hooks/use-product-extras.d.ts +30 -0
- package/dist/extras/hooks/use-product-extras.d.ts.map +1 -0
- package/dist/extras/hooks/use-product-extras.js +12 -0
- package/dist/extras/hooks/use-slot-extra-manifest-mutation.d.ts +48 -0
- package/dist/extras/hooks/use-slot-extra-manifest-mutation.d.ts.map +1 -0
- package/dist/extras/hooks/use-slot-extra-manifest-mutation.js +26 -0
- package/dist/extras/hooks/use-slot-extra-manifest.d.ts +68 -0
- package/dist/extras/hooks/use-slot-extra-manifest.d.ts.map +1 -0
- package/dist/extras/hooks/use-slot-extra-manifest.js +11 -0
- package/dist/extras/i18n/en.d.ts +52 -0
- package/dist/extras/i18n/en.d.ts.map +1 -0
- package/dist/extras/i18n/en.js +51 -0
- package/dist/extras/i18n/index.d.ts +5 -0
- package/dist/extras/i18n/index.d.ts.map +1 -0
- package/dist/extras/i18n/index.js +3 -0
- package/dist/extras/i18n/messages.d.ts +37 -0
- package/dist/extras/i18n/messages.d.ts.map +1 -0
- package/dist/extras/i18n/messages.js +1 -0
- package/dist/extras/i18n/provider.d.ts +126 -0
- package/dist/extras/i18n/provider.d.ts.map +1 -0
- package/dist/extras/i18n/provider.js +44 -0
- package/dist/extras/i18n/ro.d.ts +52 -0
- package/dist/extras/i18n/ro.d.ts.map +1 -0
- package/dist/extras/i18n/ro.js +51 -0
- package/dist/extras/index.d.ts +7 -0
- package/dist/extras/index.d.ts.map +1 -0
- package/dist/extras/index.js +6 -0
- package/dist/extras/provider.d.ts +2 -0
- package/dist/extras/provider.d.ts.map +1 -0
- package/dist/extras/provider.js +1 -0
- package/dist/extras/query-keys.d.ts +16 -0
- package/dist/extras/query-keys.d.ts.map +1 -0
- package/dist/extras/query-keys.js +8 -0
- package/dist/extras/query-options.d.ts +455 -0
- package/dist/extras/query-options.d.ts.map +1 -0
- package/dist/extras/query-options.js +44 -0
- package/dist/extras/schemas.d.ts +416 -0
- package/dist/extras/schemas.d.ts.map +1 -0
- package/dist/extras/schemas.js +89 -0
- package/dist/extras/ui.d.ts +4 -0
- package/dist/extras/ui.d.ts.map +1 -0
- package/dist/extras/ui.js +3 -0
- package/dist/extras.d.ts +10 -0
- package/dist/extras.d.ts.map +1 -0
- package/dist/extras.js +9 -0
- package/dist/hooks/index.d.ts +36 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +35 -0
- package/dist/hooks/use-booking-action-ledger.d.ts +63 -0
- package/dist/hooks/use-booking-action-ledger.d.ts.map +1 -0
- package/dist/hooks/use-booking-action-ledger.js +34 -0
- package/dist/hooks/use-booking-activity.d.ts +17 -0
- package/dist/hooks/use-booking-activity.d.ts.map +1 -0
- package/dist/hooks/use-booking-activity.js +12 -0
- package/dist/hooks/use-booking-cancel-mutation.d.ts +69 -0
- package/dist/hooks/use-booking-cancel-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-cancel-mutation.js +24 -0
- package/dist/hooks/use-booking-contract-generation.d.ts +31 -0
- package/dist/hooks/use-booking-contract-generation.d.ts.map +1 -0
- package/dist/hooks/use-booking-contract-generation.js +36 -0
- package/dist/hooks/use-booking-convert-mutation.d.ts +81 -0
- package/dist/hooks/use-booking-convert-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-convert-mutation.js +24 -0
- package/dist/hooks/use-booking-create-mutation.d.ts +337 -0
- package/dist/hooks/use-booking-create-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-create-mutation.js +43 -0
- package/dist/hooks/use-booking-documents.d.ts +41 -0
- package/dist/hooks/use-booking-documents.d.ts.map +1 -0
- package/dist/hooks/use-booking-documents.js +46 -0
- package/dist/hooks/use-booking-dual-create-mutation.d.ts +338 -0
- package/dist/hooks/use-booking-dual-create-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-dual-create-mutation.js +45 -0
- package/dist/hooks/use-booking-group-for-booking.d.ts +24 -0
- package/dist/hooks/use-booking-group-for-booking.d.ts.map +1 -0
- package/dist/hooks/use-booking-group-for-booking.js +12 -0
- package/dist/hooks/use-booking-group-member-mutation.d.ts +27 -0
- package/dist/hooks/use-booking-group-member-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-group-member-mutation.js +38 -0
- package/dist/hooks/use-booking-group-mutation.d.ts +40 -0
- package/dist/hooks/use-booking-group-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-group-mutation.js +32 -0
- package/dist/hooks/use-booking-group.d.ts +85 -0
- package/dist/hooks/use-booking-group.d.ts.map +1 -0
- package/dist/hooks/use-booking-group.js +12 -0
- package/dist/hooks/use-booking-groups.d.ts +21 -0
- package/dist/hooks/use-booking-groups.d.ts.map +1 -0
- package/dist/hooks/use-booking-groups.js +12 -0
- package/dist/hooks/use-booking-item-mutation.d.ts +101 -0
- package/dist/hooks/use-booking-item-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-item-mutation.js +42 -0
- package/dist/hooks/use-booking-item-travelers.d.ts +32 -0
- package/dist/hooks/use-booking-item-travelers.d.ts.map +1 -0
- package/dist/hooks/use-booking-item-travelers.js +48 -0
- package/dist/hooks/use-booking-items.d.ts +36 -0
- package/dist/hooks/use-booking-items.d.ts.map +1 -0
- package/dist/hooks/use-booking-items.js +12 -0
- package/dist/hooks/use-booking-mutation.d.ts +158 -0
- package/dist/hooks/use-booking-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-mutation.js +39 -0
- package/dist/hooks/use-booking-note-mutation.d.ts +39 -0
- package/dist/hooks/use-booking-note-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-note-mutation.js +44 -0
- package/dist/hooks/use-booking-notes.d.ts +15 -0
- package/dist/hooks/use-booking-notes.d.ts.map +1 -0
- package/dist/hooks/use-booking-notes.js +12 -0
- package/dist/hooks/use-booking-primary-product.d.ts +28 -0
- package/dist/hooks/use-booking-primary-product.d.ts.map +1 -0
- package/dist/hooks/use-booking-primary-product.js +20 -0
- package/dist/hooks/use-booking-status-mutation.d.ts +156 -0
- package/dist/hooks/use-booking-status-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-status-mutation.js +54 -0
- package/dist/hooks/use-booking-tax-preview.d.ts +29 -0
- package/dist/hooks/use-booking-tax-preview.d.ts.map +1 -0
- package/dist/hooks/use-booking-tax-preview.js +21 -0
- package/dist/hooks/use-booking.d.ts +67 -0
- package/dist/hooks/use-booking.d.ts.map +1 -0
- package/dist/hooks/use-booking.js +12 -0
- package/dist/hooks/use-bookings.d.ts +71 -0
- package/dist/hooks/use-bookings.d.ts.map +1 -0
- package/dist/hooks/use-bookings.js +12 -0
- package/dist/hooks/use-pricing-preview.d.ts +61 -0
- package/dist/hooks/use-pricing-preview.d.ts.map +1 -0
- package/dist/hooks/use-pricing-preview.js +18 -0
- package/dist/hooks/use-public-booking-session-flow-mutation.d.ts +148 -0
- package/dist/hooks/use-public-booking-session-flow-mutation.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-session-flow-mutation.js +35 -0
- package/dist/hooks/use-public-booking-session-state.d.ts +16 -0
- package/dist/hooks/use-public-booking-session-state.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-session-state.js +12 -0
- package/dist/hooks/use-public-booking-session.d.ts +101 -0
- package/dist/hooks/use-public-booking-session.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-session.js +12 -0
- package/dist/hooks/use-reveal-traveler.d.ts +54 -0
- package/dist/hooks/use-reveal-traveler.d.ts.map +1 -0
- package/dist/hooks/use-reveal-traveler.js +18 -0
- package/dist/hooks/use-sharing-groups.d.ts +41 -0
- package/dist/hooks/use-sharing-groups.d.ts.map +1 -0
- package/dist/hooks/use-sharing-groups.js +20 -0
- package/dist/hooks/use-supplier-status-mutation.d.ts +46 -0
- package/dist/hooks/use-supplier-status-mutation.d.ts.map +1 -0
- package/dist/hooks/use-supplier-status-mutation.js +39 -0
- package/dist/hooks/use-supplier-statuses.d.ts +20 -0
- package/dist/hooks/use-supplier-statuses.d.ts.map +1 -0
- package/dist/hooks/use-supplier-statuses.js +12 -0
- package/dist/hooks/use-traveler-mutation.d.ts +55 -0
- package/dist/hooks/use-traveler-mutation.d.ts.map +1 -0
- package/dist/hooks/use-traveler-mutation.js +42 -0
- package/dist/hooks/use-traveler-with-travel-details-mutation.d.ts +120 -0
- package/dist/hooks/use-traveler-with-travel-details-mutation.d.ts.map +1 -0
- package/dist/hooks/use-traveler-with-travel-details-mutation.js +43 -0
- package/dist/hooks/use-travelers.d.ts +23 -0
- package/dist/hooks/use-travelers.d.ts.map +1 -0
- package/dist/hooks/use-travelers.js +12 -0
- package/dist/i18n/en-base.d.ts +295 -0
- package/dist/i18n/en-base.d.ts.map +1 -0
- package/dist/i18n/en-base.js +294 -0
- package/dist/i18n/en-create-list.d.ts +327 -0
- package/dist/i18n/en-create-list.d.ts.map +1 -0
- package/dist/i18n/en-create-list.js +326 -0
- package/dist/i18n/en-journey.d.ts +229 -0
- package/dist/i18n/en-journey.d.ts.map +1 -0
- package/dist/i18n/en-journey.js +228 -0
- package/dist/i18n/en-operations.d.ts +382 -0
- package/dist/i18n/en-operations.d.ts.map +1 -0
- package/dist/i18n/en-operations.js +381 -0
- package/dist/i18n/en-sections.d.ts +360 -0
- package/dist/i18n/en-sections.d.ts.map +1 -0
- package/dist/i18n/en-sections.js +359 -0
- package/dist/i18n/en.d.ts +1581 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +12 -0
- package/dist/i18n/index.d.ts +5 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/messages-base.d.ts +251 -0
- package/dist/i18n/messages-base.d.ts.map +1 -0
- package/dist/i18n/messages-base.js +1 -0
- package/dist/i18n/messages-create-list.d.ts +310 -0
- package/dist/i18n/messages-create-list.d.ts.map +1 -0
- package/dist/i18n/messages-create-list.js +1 -0
- package/dist/i18n/messages-journey.d.ts +198 -0
- package/dist/i18n/messages-journey.d.ts.map +1 -0
- package/dist/i18n/messages-journey.js +1 -0
- package/dist/i18n/messages-operations.d.ts +362 -0
- package/dist/i18n/messages-operations.d.ts.map +1 -0
- package/dist/i18n/messages-operations.js +1 -0
- package/dist/i18n/messages-sections.d.ts +312 -0
- package/dist/i18n/messages-sections.d.ts.map +1 -0
- package/dist/i18n/messages-sections.js +1 -0
- package/dist/i18n/messages.d.ts +7 -0
- package/dist/i18n/messages.d.ts.map +1 -0
- package/dist/i18n/messages.js +1 -0
- package/dist/i18n/provider.d.ts +3185 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +45 -0
- package/dist/i18n/ro-base.d.ts +295 -0
- package/dist/i18n/ro-base.d.ts.map +1 -0
- package/dist/i18n/ro-base.js +294 -0
- package/dist/i18n/ro-create-list.d.ts +327 -0
- package/dist/i18n/ro-create-list.d.ts.map +1 -0
- package/dist/i18n/ro-create-list.js +326 -0
- package/dist/i18n/ro-journey.d.ts +229 -0
- package/dist/i18n/ro-journey.d.ts.map +1 -0
- package/dist/i18n/ro-journey.js +228 -0
- package/dist/i18n/ro-operations.d.ts +382 -0
- package/dist/i18n/ro-operations.d.ts.map +1 -0
- package/dist/i18n/ro-operations.js +381 -0
- package/dist/i18n/ro-sections.d.ts +360 -0
- package/dist/i18n/ro-sections.d.ts.map +1 -0
- package/dist/i18n/ro-sections.js +359 -0
- package/dist/i18n/ro.d.ts +1581 -0
- package/dist/i18n/ro.d.ts.map +1 -0
- package/dist/i18n/ro.js +12 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/journey/components/booking-journey-rules.d.ts +48 -0
- package/dist/journey/components/booking-journey-rules.d.ts.map +1 -0
- package/dist/journey/components/booking-journey-rules.js +235 -0
- package/dist/journey/components/booking-journey.d.ts +3 -0
- package/dist/journey/components/booking-journey.d.ts.map +1 -0
- package/dist/journey/components/booking-journey.js +368 -0
- package/dist/journey/components/configure-step-skeleton.d.ts +8 -0
- package/dist/journey/components/configure-step-skeleton.d.ts.map +1 -0
- package/dist/journey/components/configure-step-skeleton.js +11 -0
- package/dist/journey/components/contract-preview-dialog.d.ts +47 -0
- package/dist/journey/components/contract-preview-dialog.d.ts.map +1 -0
- package/dist/journey/components/contract-preview-dialog.js +124 -0
- package/dist/journey/components/journey-steps/accommodation-step.d.ts +3 -0
- package/dist/journey/components/journey-steps/accommodation-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/accommodation-step.js +71 -0
- package/dist/journey/components/journey-steps/addons-step.d.ts +3 -0
- package/dist/journey/components/journey-steps/addons-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/addons-step.js +40 -0
- package/dist/journey/components/journey-steps/billing-step.d.ts +8 -0
- package/dist/journey/components/journey-steps/billing-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/billing-step.js +78 -0
- package/dist/journey/components/journey-steps/configure-steps.d.ts +28 -0
- package/dist/journey/components/journey-steps/configure-steps.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/configure-steps.js +232 -0
- package/dist/journey/components/journey-steps/documents-step.d.ts +11 -0
- package/dist/journey/components/journey-steps/documents-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/documents-step.js +36 -0
- package/dist/journey/components/journey-steps/payment-step.d.ts +29 -0
- package/dist/journey/components/journey-steps/payment-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/payment-step.js +225 -0
- package/dist/journey/components/journey-steps/review-step.d.ts +27 -0
- package/dist/journey/components/journey-steps/review-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/review-step.js +18 -0
- package/dist/journey/components/journey-steps/shared.d.ts +75 -0
- package/dist/journey/components/journey-steps/shared.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/shared.js +108 -0
- package/dist/journey/components/journey-steps/travelers-step.d.ts +7 -0
- package/dist/journey/components/journey-steps/travelers-step.d.ts.map +1 -0
- package/dist/journey/components/journey-steps/travelers-step.js +201 -0
- package/dist/journey/components/journey-steps.d.ts +21 -0
- package/dist/journey/components/journey-steps.d.ts.map +1 -0
- package/dist/journey/components/journey-steps.js +20 -0
- package/dist/journey/components/side-panel.d.ts +17 -0
- package/dist/journey/components/side-panel.d.ts.map +1 -0
- package/dist/journey/components/side-panel.js +245 -0
- package/dist/journey/components/stacked-journey.d.ts +30 -0
- package/dist/journey/components/stacked-journey.d.ts.map +1 -0
- package/dist/journey/components/stacked-journey.js +50 -0
- package/dist/journey/components/step-header.d.ts +7 -0
- package/dist/journey/components/step-header.d.ts.map +1 -0
- package/dist/journey/components/step-header.js +12 -0
- package/dist/journey/index.d.ts +18 -0
- package/dist/journey/index.d.ts.map +1 -0
- package/dist/journey/index.js +17 -0
- package/dist/journey/lib/draft-state.d.ts +35 -0
- package/dist/journey/lib/draft-state.d.ts.map +1 -0
- package/dist/journey/lib/draft-state.js +57 -0
- package/dist/journey/lib/pax-band-dependencies.d.ts +27 -0
- package/dist/journey/lib/pax-band-dependencies.d.ts.map +1 -0
- package/dist/journey/lib/pax-band-dependencies.js +50 -0
- package/dist/journey/lib/payment-schedule.d.ts +19 -0
- package/dist/journey/lib/payment-schedule.d.ts.map +1 -0
- package/dist/journey/lib/payment-schedule.js +90 -0
- package/dist/journey/types.d.ts +403 -0
- package/dist/journey/types.d.ts.map +1 -0
- package/dist/journey/types.js +19 -0
- package/dist/provider.d.ts +2 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +1 -0
- package/dist/query-keys.d.ts +74 -0
- package/dist/query-keys.d.ts.map +1 -0
- package/dist/query-keys.js +26 -0
- package/dist/query-options.d.ts +2534 -0
- package/dist/query-options.d.ts.map +1 -0
- package/dist/query-options.js +233 -0
- package/dist/requirements/client.d.ts +14 -0
- package/dist/requirements/client.d.ts.map +1 -0
- package/dist/requirements/client.js +59 -0
- package/dist/requirements/components/booking-requirements-contact-tab.d.ts +8 -0
- package/dist/requirements/components/booking-requirements-contact-tab.d.ts.map +1 -0
- package/dist/requirements/components/booking-requirements-contact-tab.js +8 -0
- package/dist/requirements/components/booking-requirements-questions-tab.d.ts +14 -0
- package/dist/requirements/components/booking-requirements-questions-tab.d.ts.map +1 -0
- package/dist/requirements/components/booking-requirements-questions-tab.js +17 -0
- package/dist/requirements/constants.d.ts +114 -0
- package/dist/requirements/constants.d.ts.map +1 -0
- package/dist/requirements/constants.js +45 -0
- package/dist/requirements/hooks/index.d.ts +6 -0
- package/dist/requirements/hooks/index.d.ts.map +1 -0
- package/dist/requirements/hooks/index.js +6 -0
- package/dist/requirements/hooks/use-booking-questions.d.ts +24 -0
- package/dist/requirements/hooks/use-booking-questions.d.ts.map +1 -0
- package/dist/requirements/hooks/use-booking-questions.js +9 -0
- package/dist/requirements/hooks/use-contact-requirements.d.ts +22 -0
- package/dist/requirements/hooks/use-contact-requirements.d.ts.map +1 -0
- package/dist/requirements/hooks/use-contact-requirements.js +9 -0
- package/dist/requirements/hooks/use-products.d.ts +16 -0
- package/dist/requirements/hooks/use-products.d.ts.map +1 -0
- package/dist/requirements/hooks/use-products.js +9 -0
- package/dist/requirements/hooks/use-question-options.d.ts +19 -0
- package/dist/requirements/hooks/use-question-options.d.ts.map +1 -0
- package/dist/requirements/hooks/use-question-options.js +9 -0
- package/dist/requirements/hooks/use-transport-requirements.d.ts +30 -0
- package/dist/requirements/hooks/use-transport-requirements.d.ts.map +1 -0
- package/dist/requirements/hooks/use-transport-requirements.js +9 -0
- package/dist/requirements/i18n/en.d.ts +94 -0
- package/dist/requirements/i18n/en.d.ts.map +1 -0
- package/dist/requirements/i18n/en.js +93 -0
- package/dist/requirements/i18n/index.d.ts +5 -0
- package/dist/requirements/i18n/index.d.ts.map +1 -0
- package/dist/requirements/i18n/index.js +3 -0
- package/dist/requirements/i18n/messages.d.ts +59 -0
- package/dist/requirements/i18n/messages.d.ts.map +1 -0
- package/dist/requirements/i18n/messages.js +1 -0
- package/dist/requirements/i18n/provider.d.ts +210 -0
- package/dist/requirements/i18n/provider.d.ts.map +1 -0
- package/dist/requirements/i18n/provider.js +44 -0
- package/dist/requirements/i18n/ro.d.ts +94 -0
- package/dist/requirements/i18n/ro.d.ts.map +1 -0
- package/dist/requirements/i18n/ro.js +93 -0
- package/dist/requirements/index.d.ts +9 -0
- package/dist/requirements/index.d.ts.map +1 -0
- package/dist/requirements/index.js +8 -0
- package/dist/requirements/provider.d.ts +2 -0
- package/dist/requirements/provider.d.ts.map +1 -0
- package/dist/requirements/provider.js +1 -0
- package/dist/requirements/query-keys.d.ts +33 -0
- package/dist/requirements/query-keys.d.ts.map +1 -0
- package/dist/requirements/query-keys.js +13 -0
- package/dist/requirements/query-options.d.ts +371 -0
- package/dist/requirements/query-options.d.ts.map +1 -0
- package/dist/requirements/query-options.js +80 -0
- package/dist/requirements/schemas.d.ts +320 -0
- package/dist/requirements/schemas.d.ts.map +1 -0
- package/dist/requirements/schemas.js +121 -0
- package/dist/requirements/ui.d.ts +4 -0
- package/dist/requirements/ui.d.ts.map +1 -0
- package/dist/requirements/ui.js +3 -0
- package/dist/requirements/utils.d.ts +2 -0
- package/dist/requirements/utils.d.ts.map +1 -0
- package/dist/requirements/utils.js +4 -0
- package/dist/schemas.d.ts +2070 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +507 -0
- package/dist/status-presentation.d.ts +34 -0
- package/dist/status-presentation.d.ts.map +1 -0
- package/dist/status-presentation.js +38 -0
- package/dist/ui.d.ts +43 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +42 -0
- package/package.json +256 -0
- package/src/requirements/styles.css +1 -0
- package/src/styles.css +13 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } 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 { Label } from "@voyant-travel/ui/components/label";
|
|
7
|
+
import { formatMessage, useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
8
|
+
import { setAccommodation } from "../../lib/draft-state.js";
|
|
9
|
+
// ─────────────────────────────────────────────────────────────────
|
|
10
|
+
// Accommodation
|
|
11
|
+
// ─────────────────────────────────────────────────────────────────
|
|
12
|
+
export function AccommodationStep({ draft, setDraft, shape }) {
|
|
13
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
14
|
+
const subSteps = shape.accommodation?.subSteps ?? [];
|
|
15
|
+
const rooms = shape.accommodation?.roomOptions ?? [];
|
|
16
|
+
const accommodation = draft.accommodation ?? {
|
|
17
|
+
rooms: [],
|
|
18
|
+
travelerAssignments: {},
|
|
19
|
+
};
|
|
20
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: messages.bookingJourney.accommodation.title }) }), _jsx(Separator, {}), _jsx(CardContent, { className: "space-y-4", children: rooms.length === 0 && subSteps.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: messages.bookingJourney.accommodation.empty })) : (_jsxs("div", { className: "space-y-3", children: [rooms.map((room) => {
|
|
21
|
+
const current = accommodation.rooms.find((r) => r.optionUnitId === room.id);
|
|
22
|
+
const ratePlans = room.ratePlans ?? [];
|
|
23
|
+
return (_jsxs("div", { className: "space-y-3 rounded-md border p-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("div", { className: "font-medium", children: room.name }), room.description ? (_jsx("div", { className: "text-muted-foreground text-xs", children: room.description })) : null] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", size: "sm", type: "button", onClick: () => {
|
|
24
|
+
const list = accommodation.rooms.filter((r) => r.optionUnitId !== room.id);
|
|
25
|
+
const qty = (current?.quantity ?? 0) - 1;
|
|
26
|
+
if (qty > 0) {
|
|
27
|
+
list.push({
|
|
28
|
+
optionUnitId: room.id,
|
|
29
|
+
quantity: qty,
|
|
30
|
+
ratePlanId: current?.ratePlanId,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
setDraft(setAccommodation(draft, {
|
|
34
|
+
...accommodation,
|
|
35
|
+
rooms: list,
|
|
36
|
+
}));
|
|
37
|
+
}, children: "\u2212" }), _jsx("span", { className: "min-w-6 text-center", children: current?.quantity ?? 0 }), _jsx(Button, { variant: "outline", size: "sm", type: "button", onClick: () => {
|
|
38
|
+
const list = accommodation.rooms.filter((r) => r.optionUnitId !== room.id);
|
|
39
|
+
const qty = (current?.quantity ?? 0) + 1;
|
|
40
|
+
// Auto-select the only rate plan when there's
|
|
41
|
+
// exactly one — saves a click on the common case.
|
|
42
|
+
const ratePlanId = current?.ratePlanId ??
|
|
43
|
+
(ratePlans.length === 1 ? ratePlans[0]?.id : undefined);
|
|
44
|
+
list.push({
|
|
45
|
+
optionUnitId: room.id,
|
|
46
|
+
quantity: qty,
|
|
47
|
+
ratePlanId,
|
|
48
|
+
});
|
|
49
|
+
setDraft(setAccommodation(draft, {
|
|
50
|
+
...accommodation,
|
|
51
|
+
rooms: list,
|
|
52
|
+
}));
|
|
53
|
+
}, children: "+" })] })] }), current && current.quantity > 0 && ratePlans.length > 0 ? (_jsx(RatePlanPicker, { roomId: room.id, ratePlans: ratePlans, selected: current.ratePlanId, onSelect: (planId) => {
|
|
54
|
+
const list = accommodation.rooms.map((r) => r.optionUnitId === room.id ? { ...r, ratePlanId: planId } : r);
|
|
55
|
+
setDraft(setAccommodation(draft, {
|
|
56
|
+
...accommodation,
|
|
57
|
+
rooms: list,
|
|
58
|
+
}));
|
|
59
|
+
} })) : null] }, room.id));
|
|
60
|
+
}), subSteps.map((sub) => sub.kind === "extensions" ? (_jsx("div", { className: "rounded-md border p-3 text-muted-foreground text-sm", children: formatMessage(messages.bookingJourney.accommodation.extensionsAvailable, {
|
|
61
|
+
count: sub.options.length,
|
|
62
|
+
plural: sub.options.length === 1 ? "" : "s",
|
|
63
|
+
}) }, "extensions")) : null)] })) })] }));
|
|
64
|
+
}
|
|
65
|
+
function RatePlanPicker({ roomId, ratePlans, selected, onSelect, }) {
|
|
66
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
67
|
+
return (_jsxs("div", { className: "space-y-2 border-t pt-3", children: [_jsx(Label, { htmlFor: `bj-rate-plan-${roomId}`, children: messages.bookingJourney.accommodation.ratePlan }), _jsx("div", { className: "space-y-2", children: ratePlans.map((plan) => {
|
|
68
|
+
const isSelected = plan.id === selected;
|
|
69
|
+
return (_jsxs("button", { type: "button", onClick: () => onSelect(plan.id), className: `w-full rounded-md border p-2 text-left text-sm ${isSelected ? "border-primary ring-2 ring-primary" : ""}`, children: [_jsx("div", { className: "font-medium", children: plan.name }), plan.description ? (_jsx("div", { className: "text-muted-foreground text-xs", children: plan.description })) : null, plan.cancellationPolicy ? (_jsxs("div", { className: "text-muted-foreground text-xs", children: [messages.bookingJourney.accommodation.cancellationPrefix, " ", plan.cancellationPolicy] })) : null, plan.inclusions && plan.inclusions.length > 0 ? (_jsxs("div", { className: "text-muted-foreground text-xs", children: [messages.bookingJourney.accommodation.includesPrefix, " ", plan.inclusions.join(", ")] })) : null] }, plan.id));
|
|
70
|
+
}) })] }));
|
|
71
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addons-step.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/addons-step.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAM5D,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAmD1F"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } 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 { useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
7
|
+
import { setAddons } from "../../lib/draft-state.js";
|
|
8
|
+
import { bucketBy } from "./shared.js";
|
|
9
|
+
// ─────────────────────────────────────────────────────────────────
|
|
10
|
+
// Add-ons
|
|
11
|
+
// ─────────────────────────────────────────────────────────────────
|
|
12
|
+
export function AddonsStep({ draft, setDraft, shape }) {
|
|
13
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
14
|
+
const flat = shape.addons?.catalog ?? [];
|
|
15
|
+
const groups = shape.addons?.groups ?? [];
|
|
16
|
+
const all = [...flat, ...groups.flatMap((g) => g.items)];
|
|
17
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: messages.bookingJourney.addons.title }) }), _jsx(Separator, {}), _jsxs(CardContent, { className: "space-y-4", children: [all.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: messages.bookingJourney.addons.empty })) : null, groups.map((group) => {
|
|
18
|
+
// Group by port/day when the descriptor asks — cruise
|
|
19
|
+
// excursions arrive grouped by port name.
|
|
20
|
+
const buckets = group.groupBy === "port" || group.groupBy === "day"
|
|
21
|
+
? bucketBy(group.items, (i) => i.groupKey ?? messages.bookingJourney.addons.otherBucket)
|
|
22
|
+
: new Map([["", group.items]]);
|
|
23
|
+
return (_jsxs("div", { className: "space-y-3", children: [_jsx("div", { className: "font-medium text-sm", children: group.label }), [...buckets.entries()].map(([bucket, items]) => (_jsxs("div", { className: "space-y-2", children: [bucket ? (_jsx("div", { className: "text-muted-foreground text-xs uppercase", children: bucket })) : null, items.map((item) => (_jsx(AddonRow, { draft: draft, setDraft: setDraft, item: item }, item.id)))] }, bucket || "all")))] }, group.label));
|
|
24
|
+
}), flat.length > 0 && groups.length === 0 ? (_jsx("div", { className: "space-y-2", children: flat.map((item) => (_jsx(AddonRow, { draft: draft, setDraft: setDraft, item: item }, item.id))) })) : null] })] }));
|
|
25
|
+
}
|
|
26
|
+
function AddonRow({ draft, setDraft, item, }) {
|
|
27
|
+
const current = draft.addons.find((a) => a.extraId === item.id);
|
|
28
|
+
return (_jsxs("div", { className: "flex items-center justify-between rounded-md border p-3", children: [_jsxs("div", { children: [_jsx("div", { className: "font-medium", children: item.name }), item.description ? (_jsx("div", { className: "text-muted-foreground text-xs", children: item.description })) : null] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "outline", size: "sm", type: "button", onClick: () => {
|
|
29
|
+
const list = draft.addons.filter((a) => a.extraId !== item.id);
|
|
30
|
+
const qty = (current?.quantity ?? 0) - 1;
|
|
31
|
+
if (qty > 0)
|
|
32
|
+
list.push({ extraId: item.id, quantity: qty });
|
|
33
|
+
setDraft(setAddons(draft, list));
|
|
34
|
+
}, children: "\u2212" }), _jsx("span", { className: "min-w-6 text-center", children: current?.quantity ?? 0 }), _jsx(Button, { variant: "outline", size: "sm", type: "button", onClick: () => {
|
|
35
|
+
const list = draft.addons.filter((a) => a.extraId !== item.id);
|
|
36
|
+
const qty = (current?.quantity ?? 0) + 1;
|
|
37
|
+
list.push({ extraId: item.id, quantity: qty });
|
|
38
|
+
setDraft(setAddons(draft, list));
|
|
39
|
+
}, children: "+" })] })] }));
|
|
40
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LeadContactPickerProps } from "../../types.js";
|
|
2
|
+
import { type StepCommonProps } from "./shared.js";
|
|
3
|
+
export declare function BillingStep({ draft, setDraft, renderLeadContactPicker, renderExtras, warnings, }: StepCommonProps & {
|
|
4
|
+
renderLeadContactPicker?: (props: LeadContactPickerProps) => React.ReactNode;
|
|
5
|
+
renderExtras?: () => React.ReactNode;
|
|
6
|
+
warnings?: ReadonlyArray<string>;
|
|
7
|
+
}): React.ReactElement;
|
|
8
|
+
//# sourceMappingURL=billing-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing-step.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/billing-step.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAAsC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAMtF,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,uBAAuB,EACvB,YAAY,EACZ,QAAQ,GACT,EAAE,eAAe,GAAG;IACnB,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,KAAK,CAAC,SAAS,CAAA;IAC5E,YAAY,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAA;IACpC,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACjC,GAAG,KAAK,CAAC,YAAY,CAyOrB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
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 { Card, CardContent, CardHeader, CardTitle } from "@voyant-travel/ui/components/card";
|
|
5
|
+
import { CountryCombobox } from "@voyant-travel/ui/components/country-combobox";
|
|
6
|
+
import { Label } from "@voyant-travel/ui/components/label";
|
|
7
|
+
import { RadioGroup, RadioGroupItem } from "@voyant-travel/ui/components/radio-group";
|
|
8
|
+
import { useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
9
|
+
import { patchBilling } from "../../lib/draft-state.js";
|
|
10
|
+
import { Field, JourneyWarnings, PhoneField } from "./shared.js";
|
|
11
|
+
// ─────────────────────────────────────────────────────────────────
|
|
12
|
+
// Billing
|
|
13
|
+
// ─────────────────────────────────────────────────────────────────
|
|
14
|
+
export function BillingStep({ draft, setDraft, renderLeadContactPicker, renderExtras, warnings, }) {
|
|
15
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
16
|
+
const billing = draft.billing;
|
|
17
|
+
// Merge each partial from the picker (person record, org record, address
|
|
18
|
+
// lookup) into the billing draft without clobbering the other slices.
|
|
19
|
+
const apply = (next) => {
|
|
20
|
+
const patch = {};
|
|
21
|
+
if (next.firstName !== undefined ||
|
|
22
|
+
next.lastName !== undefined ||
|
|
23
|
+
next.email !== undefined ||
|
|
24
|
+
next.phone !== undefined ||
|
|
25
|
+
next.personId !== undefined) {
|
|
26
|
+
patch.contact = {
|
|
27
|
+
...billing.contact,
|
|
28
|
+
...(next.firstName !== undefined ? { firstName: next.firstName } : {}),
|
|
29
|
+
...(next.lastName !== undefined ? { lastName: next.lastName } : {}),
|
|
30
|
+
...(next.email !== undefined ? { email: next.email } : {}),
|
|
31
|
+
...(next.phone !== undefined ? { phone: next.phone } : {}),
|
|
32
|
+
...(next.personId !== undefined ? { personId: next.personId } : {}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (next.organizationId !== undefined) {
|
|
36
|
+
patch.organizationId = next.organizationId;
|
|
37
|
+
}
|
|
38
|
+
if (next.companyName !== undefined || next.taxId !== undefined) {
|
|
39
|
+
patch.company = {
|
|
40
|
+
name: next.companyName ?? billing.company?.name ?? "",
|
|
41
|
+
vatId: next.taxId ?? billing.company?.vatId,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (next.address) {
|
|
45
|
+
patch.address = { ...billing.address, ...next.address };
|
|
46
|
+
}
|
|
47
|
+
setDraft(patchBilling(draft, patch));
|
|
48
|
+
};
|
|
49
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: messages.bookingJourney.billing.title }) }), _jsx(Separator, {}), _jsxs(CardContent, { className: "space-y-6", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: messages.bookingJourney.billing.buyerType }), _jsxs(RadioGroup, { value: billing.buyerType, onValueChange: (v) => setDraft(patchBilling(draft, { buyerType: v })), className: "flex gap-4", children: [_jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx(RadioGroupItem, { value: "B2C" }), " ", messages.bookingJourney.billing.individual] }), _jsxs("label", { className: "flex items-center gap-2 text-sm", children: [_jsx(RadioGroupItem, { value: "B2B" }), " ", messages.bookingJourney.billing.company] })] })] }), renderLeadContactPicker ? (_jsx("div", { children: renderLeadContactPicker({ apply, buyerType: billing.buyerType }) })) : null, renderLeadContactPicker ? null : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [_jsx(Field, { id: "bj-billing-firstName", label: messages.bookingJourney.billing.firstName, value: billing.contact.firstName, onChange: (v) => setDraft(patchBilling(draft, {
|
|
50
|
+
contact: { ...billing.contact, firstName: v },
|
|
51
|
+
})) }), _jsx(Field, { id: "bj-billing-lastName", label: messages.bookingJourney.billing.lastName, value: billing.contact.lastName, onChange: (v) => setDraft(patchBilling(draft, {
|
|
52
|
+
contact: { ...billing.contact, lastName: v },
|
|
53
|
+
})) }), _jsx(Field, { id: "bj-billing-email", label: messages.bookingJourney.billing.email, type: "email", value: billing.contact.email, onChange: (v) => setDraft(patchBilling(draft, {
|
|
54
|
+
contact: { ...billing.contact, email: v },
|
|
55
|
+
})) }), _jsx(PhoneField, { id: "bj-billing-phone", label: messages.bookingJourney.billing.phone, value: billing.contact.phone ?? "", onChange: (v) => setDraft(patchBilling(draft, {
|
|
56
|
+
contact: { ...billing.contact, phone: v },
|
|
57
|
+
})) })] }), _jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [_jsx(Field, { id: "bj-billing-line1", label: messages.bookingJourney.billing.addressLine1, value: billing.address.line1 ?? "", onChange: (v) => setDraft(patchBilling(draft, {
|
|
58
|
+
address: { ...billing.address, line1: v },
|
|
59
|
+
})) }), _jsx(Field, { id: "bj-billing-line2", label: messages.bookingJourney.billing.addressLine2Optional, value: billing.address.line2 ?? "", onChange: (v) => setDraft(patchBilling(draft, {
|
|
60
|
+
address: { ...billing.address, line2: v },
|
|
61
|
+
})) }), _jsx(Field, { id: "bj-billing-city", label: messages.bookingJourney.billing.city, value: billing.address.city ?? "", onChange: (v) => setDraft(patchBilling(draft, {
|
|
62
|
+
address: { ...billing.address, city: v },
|
|
63
|
+
})) }), _jsx(Field, { id: "bj-billing-postal", label: messages.bookingJourney.billing.postalCode, value: billing.address.postal ?? "", onChange: (v) => setDraft(patchBilling(draft, {
|
|
64
|
+
address: { ...billing.address, postal: v },
|
|
65
|
+
})) }), _jsxs("div", { className: "space-y-1 sm:col-span-2", children: [_jsx(Label, { htmlFor: "bj-billing-country", children: messages.bookingJourney.billing.country }), _jsx(CountryCombobox, { value: billing.address.country ?? null, onChange: (code) => setDraft(patchBilling(draft, {
|
|
66
|
+
address: { ...billing.address, country: code ?? "" },
|
|
67
|
+
})) })] })] }), billing.buyerType === "B2B" ? (_jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [_jsx(Field, { id: "bj-billing-companyName", label: messages.bookingJourney.billing.companyName, value: billing.company?.name ?? "", onChange: (v) => setDraft(patchBilling(draft, {
|
|
68
|
+
company: {
|
|
69
|
+
...(billing.company ?? { name: "" }),
|
|
70
|
+
name: v,
|
|
71
|
+
},
|
|
72
|
+
})) }), _jsx(Field, { id: "bj-billing-vatId", label: messages.bookingJourney.billing.vatId, value: billing.company?.vatId ?? "", onChange: (v) => setDraft(patchBilling(draft, {
|
|
73
|
+
company: {
|
|
74
|
+
...(billing.company ?? { name: "" }),
|
|
75
|
+
vatId: v,
|
|
76
|
+
},
|
|
77
|
+
})) })] })) : null] })), renderExtras ? _jsx("div", { children: renderExtras() }) : null, _jsx(JourneyWarnings, { warnings: warnings })] })] }));
|
|
78
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { BookingDraftShape } from "@voyant-travel/catalog-contracts/booking-engine/draft-shape";
|
|
2
|
+
import { type Draft } from "../../lib/draft-state.js";
|
|
3
|
+
import { type RenderDeparturePicker, type RenderUnitsPicker, type StepCommonProps } from "./shared.js";
|
|
4
|
+
export declare function DepartureStep({ draft, setDraft, shape, productId, renderDeparturePicker, }: StepCommonProps & {
|
|
5
|
+
/** Owned product id — passed to the injected departure picker. */
|
|
6
|
+
productId?: string;
|
|
7
|
+
renderDeparturePicker?: RenderDeparturePicker;
|
|
8
|
+
}): React.ReactElement;
|
|
9
|
+
export declare function OptionsStep({ draft, setDraft, shape, productId, renderUnitsPicker, }: StepCommonProps & {
|
|
10
|
+
/** Owned product id — passed to the injected units picker. */
|
|
11
|
+
productId?: string;
|
|
12
|
+
renderUnitsPicker?: RenderUnitsPicker;
|
|
13
|
+
}): React.ReactElement;
|
|
14
|
+
export declare function PaxBands({ draft, setDraft, shape }: StepCommonProps): React.ReactElement;
|
|
15
|
+
export declare function PaxValidation({ draft, shape, }: {
|
|
16
|
+
draft: Draft;
|
|
17
|
+
shape: BookingDraftShape;
|
|
18
|
+
}): React.ReactNode;
|
|
19
|
+
/**
|
|
20
|
+
* Surfaces broken cross-band occupancy rules (e.g. "Child under 6
|
|
21
|
+
* requires an Adult") as hard validation errors under the pax steppers.
|
|
22
|
+
* These also block step advancement via `canAdvanceFromStep`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function PaxDependencyWarnings({ draft, shape, }: {
|
|
25
|
+
draft: Draft;
|
|
26
|
+
shape: BookingDraftShape;
|
|
27
|
+
}): React.ReactNode;
|
|
28
|
+
//# sourceMappingURL=configure-steps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure-steps.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/configure-steps.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6DAA6D,CAAA;AASpG,OAAO,EAAE,KAAK,KAAK,EAA2C,MAAM,0BAA0B,CAAA;AAK9F,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAA;AAMpB,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,SAAS,EACT,qBAAqB,GACtB,EAAE,eAAe,GAAG;IACnB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;CAC9C,GAAG,KAAK,CAAC,YAAY,CA0CrB;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,SAAS,EACT,iBAAiB,GAClB,EAAE,eAAe,GAAG;IACnB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;CACtC,GAAG,KAAK,CAAC,YAAY,CAiErB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAsDxF;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,iBAAiB,CAAA;CACzB,GAAG,KAAK,CAAC,SAAS,CAwBlB;AAgCD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,iBAAiB,CAAA;CACzB,GAAG,KAAK,CAAC,SAAS,CAoBlB"}
|
|
@@ -0,0 +1,232 @@
|
|
|
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 { Separator } from "@voyant-travel/ui/components";
|
|
5
|
+
import { Button } from "@voyant-travel/ui/components/button";
|
|
6
|
+
import { Card, CardContent, CardHeader, CardTitle } from "@voyant-travel/ui/components/card";
|
|
7
|
+
import { Input } from "@voyant-travel/ui/components/input";
|
|
8
|
+
import { Label } from "@voyant-travel/ui/components/label";
|
|
9
|
+
import { RadioGroup, RadioGroupItem } from "@voyant-travel/ui/components/radio-group";
|
|
10
|
+
import { Minus, Plus } from "lucide-react";
|
|
11
|
+
import { formatMessage, useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
12
|
+
import { patchConfigure, patchPaxCount, totalPax } from "../../lib/draft-state.js";
|
|
13
|
+
import { evaluatePaxBandDependencies, } from "../../lib/pax-band-dependencies.js";
|
|
14
|
+
import { ageHint, DateField, } from "./shared.js";
|
|
15
|
+
// ─────────────────────────────────────────────────────────────────
|
|
16
|
+
// Configure
|
|
17
|
+
// ─────────────────────────────────────────────────────────────────
|
|
18
|
+
export function DepartureStep({ draft, setDraft, shape, productId, renderDeparturePicker, }) {
|
|
19
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
20
|
+
const subSteps = shape.configureSubSteps ?? [];
|
|
21
|
+
// With no descriptor sub-steps, still offer a departure (storefront
|
|
22
|
+
// free-date fallback).
|
|
23
|
+
const showsDeparture = subSteps.length === 0 || subSteps.some((s) => s.kind === "departure");
|
|
24
|
+
const departureNode = showsDeparture ? (renderDeparturePicker && productId ? (renderDeparturePicker({
|
|
25
|
+
productId,
|
|
26
|
+
optionId: draft.configure.variantId ?? null,
|
|
27
|
+
slotId: draft.configure.departureSlotId ?? null,
|
|
28
|
+
departureDate: draft.configure.departureDate ?? null,
|
|
29
|
+
departureTime: draft.configure.departureTime ?? null,
|
|
30
|
+
onChange: (next) => setDraft(patchConfigure(draft, {
|
|
31
|
+
...(next.slotId !== undefined ? { departureSlotId: next.slotId ?? undefined } : {}),
|
|
32
|
+
...(next.departureDate !== undefined
|
|
33
|
+
? { departureDate: next.departureDate ?? undefined }
|
|
34
|
+
: {}),
|
|
35
|
+
...(next.departureTime !== undefined
|
|
36
|
+
? { departureTime: next.departureTime ?? undefined }
|
|
37
|
+
: {}),
|
|
38
|
+
})),
|
|
39
|
+
})) : (_jsx(DepartureBasic, { draft: draft, setDraft: setDraft }))) : null;
|
|
40
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: messages.bookingJourney.steps.departure }) }), _jsx(Separator, {}), _jsx(CardContent, { className: "space-y-6", children: departureNode })] }));
|
|
41
|
+
}
|
|
42
|
+
export function OptionsStep({ draft, setDraft, shape, productId, renderUnitsPicker, }) {
|
|
43
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
44
|
+
const subSteps = shape.configureSubSteps ?? [];
|
|
45
|
+
const optionList = subSteps.flatMap((s) => (s.kind === "product-option" ? s.options : []));
|
|
46
|
+
const multipleOptions = optionList.length > 1;
|
|
47
|
+
const showsUnits = subSteps.some((s) => s.kind === "option-units");
|
|
48
|
+
const otherSteps = subSteps.filter((s) => s.kind !== "departure" &&
|
|
49
|
+
s.kind !== "product-option" &&
|
|
50
|
+
s.kind !== "option-units" &&
|
|
51
|
+
s.kind !== "occupancy");
|
|
52
|
+
const unitsNode = showsUnits && renderUnitsPicker && productId
|
|
53
|
+
? renderUnitsPicker({
|
|
54
|
+
productId,
|
|
55
|
+
optionId: draft.configure.variantId ?? null,
|
|
56
|
+
slotId: draft.configure.departureSlotId ?? null,
|
|
57
|
+
selections: draft.configure.optionSelections ?? [],
|
|
58
|
+
onChange: (selections) => setDraft(patchConfigure(draft, { optionSelections: selections })),
|
|
59
|
+
})
|
|
60
|
+
: null;
|
|
61
|
+
const optionNode = optionList.length > 0 ? (_jsx(ProductOptionFields, { draft: draft, setDraft: setDraft, options: optionList,
|
|
62
|
+
// With a real choice between options, nest the rooms under the
|
|
63
|
+
// SELECTED option so switching reveals that option's inventory in
|
|
64
|
+
// place. With a single/no option there's nothing to switch, so the
|
|
65
|
+
// rooms render directly below instead.
|
|
66
|
+
renderSelectedUnits: multipleOptions && unitsNode ? () => unitsNode : undefined })) : null;
|
|
67
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: messages.bookingJourney.steps.options }) }), _jsx(Separator, {}), _jsxs(CardContent, { className: "space-y-6", children: [optionNode || unitsNode ? (_jsxs("div", { className: "space-y-3", children: [optionNode, unitsNode && !multipleOptions ? unitsNode : null] })) : null, otherSteps.length > 0 ? (_jsx("div", { className: "space-y-4", children: otherSteps.map((sub) => renderOtherConfigureSubStep(sub, draft, setDraft)) })) : null] })] }));
|
|
68
|
+
}
|
|
69
|
+
export function PaxBands({ draft, setDraft, shape }) {
|
|
70
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
71
|
+
return (_jsxs("div", { className: "flex flex-col gap-2 rounded-md border p-3", children: [_jsx(Label, { children: messages.bookingJourney.travelers.partySize }), _jsx("div", { className: "flex flex-col gap-2", children: shape.paxBands.map((band) => {
|
|
72
|
+
const value = draft.configure.pax?.[band.code] ?? 0;
|
|
73
|
+
return (_jsxs("div", { className: "flex items-center gap-3 rounded-md border px-3 py-2", children: [_jsxs("div", { className: "flex-1", children: [_jsx("div", { className: "text-sm font-medium", children: band.label }), band.minAge != null || band.maxAge != null ? (_jsx("div", { className: "text-muted-foreground text-xs", children: ageHint(band.minAge, band.maxAge, messages) })) : null] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { variant: "ghost", size: "sm", type: "button", className: "h-7 w-7 p-0", disabled: value <= band.minCount, onClick: () => setDraft(patchPaxCount(draft, band.code, value - 1)), "aria-label": formatMessage(messages.bookingJourney.travelers.decrease, {
|
|
74
|
+
label: band.label,
|
|
75
|
+
}), children: _jsx(Minus, { className: "h-3.5 w-3.5" }) }), _jsx("span", { className: "min-w-[1.5rem] text-center text-sm tabular-nums", children: value }), _jsx(Button, { variant: "ghost", size: "sm", type: "button", className: "h-7 w-7 p-0", disabled: value >= band.maxCount, onClick: () => setDraft(patchPaxCount(draft, band.code, value + 1)), "aria-label": formatMessage(messages.bookingJourney.travelers.increase, {
|
|
76
|
+
label: band.label,
|
|
77
|
+
}), children: _jsx(Plus, { className: "h-3.5 w-3.5" }) })] })] }, band.code));
|
|
78
|
+
}) }), _jsx(PaxValidation, { draft: draft, shape: shape })] }));
|
|
79
|
+
}
|
|
80
|
+
export function PaxValidation({ draft, shape, }) {
|
|
81
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
82
|
+
const total = totalPax(draft);
|
|
83
|
+
const { min, max } = shape.paxBandsAllowedTotal;
|
|
84
|
+
if (total < min) {
|
|
85
|
+
return (_jsx("p", { className: "text-sm text-amber-600", children: formatMessage(messages.bookingJourney.validation.addAtLeastTravelers, {
|
|
86
|
+
count: min,
|
|
87
|
+
plural: min === 1 ? "" : "s",
|
|
88
|
+
}) }));
|
|
89
|
+
}
|
|
90
|
+
if (total > max) {
|
|
91
|
+
return (_jsx("p", { className: "text-sm text-destructive", children: formatMessage(messages.bookingJourney.validation.maxTravelersPerBooking, {
|
|
92
|
+
count: max,
|
|
93
|
+
}) }));
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/** Formats one occupancy-rule violation into a localized message. */
|
|
98
|
+
function formatPaxDependencyViolation(violation, messages) {
|
|
99
|
+
switch (violation.type) {
|
|
100
|
+
case "requires":
|
|
101
|
+
return formatMessage(messages.dependencyRequires, {
|
|
102
|
+
dependent: violation.dependentLabel,
|
|
103
|
+
master: violation.masterLabel,
|
|
104
|
+
});
|
|
105
|
+
case "excludes":
|
|
106
|
+
return formatMessage(messages.dependencyExcludes, {
|
|
107
|
+
dependent: violation.dependentLabel,
|
|
108
|
+
master: violation.masterLabel,
|
|
109
|
+
});
|
|
110
|
+
case "limits_per_master":
|
|
111
|
+
return formatMessage(messages.dependencyLimitPerMaster, {
|
|
112
|
+
limit: violation.limit ?? 0,
|
|
113
|
+
dependent: violation.dependentLabel,
|
|
114
|
+
master: violation.masterLabel,
|
|
115
|
+
});
|
|
116
|
+
case "limits_sum":
|
|
117
|
+
return formatMessage(messages.dependencyLimitSum, {
|
|
118
|
+
limit: violation.limit ?? 0,
|
|
119
|
+
dependent: violation.dependentLabel,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Surfaces broken cross-band occupancy rules (e.g. "Child under 6
|
|
125
|
+
* requires an Adult") as hard validation errors under the pax steppers.
|
|
126
|
+
* These also block step advancement via `canAdvanceFromStep`.
|
|
127
|
+
*/
|
|
128
|
+
export function PaxDependencyWarnings({ draft, shape, }) {
|
|
129
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
130
|
+
const violations = evaluatePaxBandDependencies(draft.configure.pax, shape.paxBandDependencies, shape.paxBands);
|
|
131
|
+
if (violations.length === 0)
|
|
132
|
+
return null;
|
|
133
|
+
return (_jsx("div", { className: "space-y-1", children: violations.map((violation) => (_jsx("p", { className: "text-destructive text-sm", children: formatPaxDependencyViolation(violation, messages.bookingJourney.validation) }, `${violation.type}-${violation.dependentCode}-${violation.masterCode}`))) }));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Renders the vertical-specific Configure sub-steps that aren't part of the
|
|
137
|
+
* fixed products layout (departure / option / rooms / occupancy are handled
|
|
138
|
+
* explicitly in `ConfigureStep`). Cruise cabins, date ranges, and air
|
|
139
|
+
* arrangement land here, in descriptor order.
|
|
140
|
+
*/
|
|
141
|
+
function renderOtherConfigureSubStep(sub, draft, setDraft) {
|
|
142
|
+
if (sub.kind === "date-range") {
|
|
143
|
+
return (_jsx(DateRangeFields, { draft: draft, setDraft: setDraft, minNights: sub.minNights, maxNights: sub.maxNights }, "date-range"));
|
|
144
|
+
}
|
|
145
|
+
if (sub.kind === "cabin-category") {
|
|
146
|
+
return (_jsx(CabinCategoryFields, { draft: draft, setDraft: setDraft, categories: sub.categories }, "cabin-category"));
|
|
147
|
+
}
|
|
148
|
+
if (sub.kind === "cabin-number") {
|
|
149
|
+
return (_jsx(CabinNumberFields, { draft: draft, setDraft: setDraft, perCategory: sub.perCategory }, "cabin-number"));
|
|
150
|
+
}
|
|
151
|
+
if (sub.kind === "air-arrangement") {
|
|
152
|
+
return _jsx(AirArrangementFields, { draft: draft, setDraft: setDraft }, "air-arrangement");
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
function ProductOptionFields({ draft, setDraft, options, renderSelectedUnits, }) {
|
|
157
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
158
|
+
const selectedId = draft.configure.variantId;
|
|
159
|
+
if (options.length === 0)
|
|
160
|
+
return null;
|
|
161
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: messages.bookingJourney.configure.option }), _jsx(RadioGroup, { value: selectedId ?? "",
|
|
162
|
+
// Switching options must clear the previous option's room/unit picks —
|
|
163
|
+
// otherwise stale `optionSelections` from option A still drive the
|
|
164
|
+
// quote/commit (price, item lines, rooms gate) under option B.
|
|
165
|
+
onValueChange: (v) => setDraft(patchConfigure(draft, v === selectedId ? { variantId: v } : { variantId: v, optionSelections: [] })), className: "grid grid-cols-1 gap-2", children: options.map((option) => {
|
|
166
|
+
const selected = option.id === selectedId;
|
|
167
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "flex cursor-pointer items-start gap-3 rounded-md border p-3 text-sm transition-colors " +
|
|
168
|
+
(selected ? "border-primary bg-primary/5" : "border-input hover:bg-muted/50"), children: [_jsx(RadioGroupItem, { value: option.id, className: "mt-0.5" }), _jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "font-medium", children: [option.name, option.code ? (_jsx("span", { className: "ml-2 text-muted-foreground text-xs uppercase", children: option.code })) : null] }), option.description ? (_jsx("div", { className: "mt-1 text-muted-foreground text-xs", children: option.description })) : null] })] }), selected && renderSelectedUnits ? (_jsx("div", { className: "ml-7 space-y-2 border-muted border-l-2 pl-4", children: renderSelectedUnits() })) : null] }, option.id));
|
|
169
|
+
}) })] }));
|
|
170
|
+
}
|
|
171
|
+
function DepartureBasic({ draft, setDraft, }) {
|
|
172
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
173
|
+
return (_jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [_jsx(DateField, { id: "bj-departure-date", label: messages.bookingJourney.configure.departureDate, value: draft.configure.departureDate ?? "", onChange: (v) => setDraft(patchConfigure(draft, { departureDate: v })), range: "future" }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "bj-departure-time", children: messages.bookingJourney.configure.timeOptional }), _jsx(Input, { id: "bj-departure-time", type: "time", value: draft.configure.departureTime ?? "", onChange: (e) => setDraft(patchConfigure(draft, { departureTime: e.target.value })) })] })] }));
|
|
174
|
+
}
|
|
175
|
+
function DateRangeFields({ draft, setDraft, minNights, maxNights, }) {
|
|
176
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
177
|
+
const range = draft.configure.dateRange;
|
|
178
|
+
return (_jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [_jsx(DateField, { id: "bj-checkin", label: messages.bookingJourney.configure.checkIn, value: range?.checkIn ?? "", onChange: (v) => setDraft(patchConfigure(draft, {
|
|
179
|
+
dateRange: { checkIn: v, checkOut: range?.checkOut ?? "" },
|
|
180
|
+
})), range: "future" }), _jsx(DateField, { id: "bj-checkout", label: formatMessage(messages.bookingJourney.configure.checkOutWithNights, {
|
|
181
|
+
minNights,
|
|
182
|
+
maxNights,
|
|
183
|
+
}), value: range?.checkOut ?? "", onChange: (v) => setDraft(patchConfigure(draft, {
|
|
184
|
+
dateRange: { checkIn: range?.checkIn ?? "", checkOut: v },
|
|
185
|
+
})), range: "future" })] }));
|
|
186
|
+
}
|
|
187
|
+
function CabinCategoryFields({ draft, setDraft, categories, }) {
|
|
188
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
189
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: messages.bookingJourney.configure.cabinCategory }), _jsx("div", { className: "grid grid-cols-1 gap-2 sm:grid-cols-2", children: categories.map((cat) => {
|
|
190
|
+
const selected = draft.configure.cabinCategoryId === cat.id;
|
|
191
|
+
return (_jsxs("button", { type: "button", className: `rounded-md border p-3 text-left ${selected ? "border-primary ring-2 ring-primary" : ""}`, onClick: () => setDraft(patchConfigure(draft, {
|
|
192
|
+
cabinCategoryId: cat.id,
|
|
193
|
+
cabinNumberId: undefined,
|
|
194
|
+
})), children: [_jsx("div", { className: "font-medium", children: cat.name }), cat.description ? (_jsx("div", { className: "text-muted-foreground text-xs", children: cat.description })) : null] }, cat.id));
|
|
195
|
+
}) })] }));
|
|
196
|
+
}
|
|
197
|
+
function AirArrangementFields({ draft, setDraft, }) {
|
|
198
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
199
|
+
const current = draft.configure.airArrangement;
|
|
200
|
+
const options = [
|
|
201
|
+
{
|
|
202
|
+
value: "cruise_line",
|
|
203
|
+
label: messages.bookingJourney.configure.airOptions.cruise_line.label,
|
|
204
|
+
description: messages.bookingJourney.configure.airOptions.cruise_line.description,
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
value: "independent",
|
|
208
|
+
label: messages.bookingJourney.configure.airOptions.independent.label,
|
|
209
|
+
description: messages.bookingJourney.configure.airOptions.independent.description,
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
value: "none",
|
|
213
|
+
label: messages.bookingJourney.configure.airOptions.none.label,
|
|
214
|
+
description: messages.bookingJourney.configure.airOptions.none.description,
|
|
215
|
+
},
|
|
216
|
+
];
|
|
217
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: messages.bookingJourney.configure.airArrangements }), _jsx("div", { className: "grid grid-cols-1 gap-2 sm:grid-cols-3", children: options.map((opt) => {
|
|
218
|
+
const selected = current === opt.value;
|
|
219
|
+
return (_jsxs("button", { type: "button", className: `rounded-md border p-3 text-left text-sm ${selected ? "border-primary ring-2 ring-primary" : ""}`, onClick: () => setDraft(patchConfigure(draft, { airArrangement: opt.value })), children: [_jsx("div", { className: "font-medium", children: opt.label }), _jsx("div", { className: "text-muted-foreground text-xs", children: opt.description })] }, opt.value));
|
|
220
|
+
}) })] }));
|
|
221
|
+
}
|
|
222
|
+
function CabinNumberFields({ draft, setDraft, perCategory, }) {
|
|
223
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
224
|
+
const catId = draft.configure.cabinCategoryId;
|
|
225
|
+
if (!catId)
|
|
226
|
+
return null;
|
|
227
|
+
const cabins = perCategory[catId] ?? [];
|
|
228
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: messages.bookingJourney.configure.cabinNumber }), _jsx("div", { className: "grid grid-cols-2 gap-2 sm:grid-cols-4", children: cabins.map((cabin) => {
|
|
229
|
+
const selected = draft.configure.cabinNumberId === cabin.id;
|
|
230
|
+
return (_jsx("button", { type: "button", className: `rounded-md border p-2 text-sm ${selected ? "border-primary ring-2 ring-primary" : ""}`, onClick: () => setDraft(patchConfigure(draft, { cabinNumberId: cabin.id })), children: cabin.label }, cabin.id));
|
|
231
|
+
}) })] }));
|
|
232
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Draft } from "../../lib/draft-state.js";
|
|
2
|
+
/**
|
|
3
|
+
* Operator-only finalization that isn't about payment: an internal note and the
|
|
4
|
+
* document-generation settings (proforma vs invoice+contract, notify). Split
|
|
5
|
+
* out of the Payment block since these don't affect the amount due.
|
|
6
|
+
*/
|
|
7
|
+
export declare function DocumentsStep({ draft, setDraft, }: {
|
|
8
|
+
draft: Draft;
|
|
9
|
+
setDraft: (next: Draft) => void;
|
|
10
|
+
}): React.ReactElement;
|
|
11
|
+
//# sourceMappingURL=documents-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents-step.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/documents-step.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAErD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAA;CAChC,GAAG,KAAK,CAAC,YAAY,CA6GrB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Card, CardContent, CardHeader, CardTitle } from "@voyant-travel/ui/components/card";
|
|
4
|
+
import { Checkbox } from "@voyant-travel/ui/components/checkbox";
|
|
5
|
+
import { Label } from "@voyant-travel/ui/components/label";
|
|
6
|
+
import { Separator } from "@voyant-travel/ui/components/separator";
|
|
7
|
+
import { Textarea } from "@voyant-travel/ui/components/textarea";
|
|
8
|
+
import { useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Operator-only finalization that isn't about payment: an internal note and the
|
|
11
|
+
* document-generation settings (proforma vs invoice+contract, notify). Split
|
|
12
|
+
* out of the Payment block since these don't affect the amount due.
|
|
13
|
+
*/
|
|
14
|
+
export function DocumentsStep({ draft, setDraft, }) {
|
|
15
|
+
const messages = useBookingsUiMessagesOrDefault();
|
|
16
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: messages.bookingJourney.steps.documents }) }), _jsx(Separator, {}), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "flex items-start gap-2 text-sm", children: [_jsx(Checkbox, { id: "bj-save-as-draft", checked: draft.saveAsDraft === true, onCheckedChange: (v) => setDraft({ ...draft, saveAsDraft: v === true }), className: "mt-0.5" }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Label, { htmlFor: "bj-save-as-draft", className: "cursor-pointer", children: messages.bookingJourney.documents.saveAsDraft }), _jsx("p", { className: "text-muted-foreground text-xs", children: messages.bookingJourney.documents.saveAsDraftHint })] })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "bj-internal-notes", children: messages.bookingJourney.review.internalNotes }), _jsx(Textarea, { id: "bj-internal-notes", value: draft.internalNotes ?? "", onChange: (e) => setDraft({ ...draft, internalNotes: e.target.value }) })] }), _jsxs("div", { className: "flex flex-col gap-3 rounded-md border p-3", children: [_jsx(Label, { children: messages.bookingCreateDialog.labels.documentGenerationHeading }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { id: "bj-doc-proforma", checked: draft.documentGeneration?.invoiceType === "proforma", onCheckedChange: (v) => setDraft({
|
|
17
|
+
...draft,
|
|
18
|
+
documentGeneration: v === true
|
|
19
|
+
? {
|
|
20
|
+
contractDocument: false,
|
|
21
|
+
invoiceDocument: true,
|
|
22
|
+
invoiceType: "proforma",
|
|
23
|
+
}
|
|
24
|
+
: undefined,
|
|
25
|
+
}) }), _jsx(Label, { htmlFor: "bj-doc-proforma", className: "cursor-pointer", children: messages.bookingCreateDialog.labels.generateProforma })] }), _jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { id: "bj-doc-invoice-contract", checked: draft.documentGeneration?.contractDocument === true &&
|
|
26
|
+
draft.documentGeneration?.invoiceType !== "proforma", onCheckedChange: (v) => setDraft({
|
|
27
|
+
...draft,
|
|
28
|
+
documentGeneration: v === true
|
|
29
|
+
? {
|
|
30
|
+
contractDocument: true,
|
|
31
|
+
invoiceDocument: true,
|
|
32
|
+
invoiceType: "invoice",
|
|
33
|
+
}
|
|
34
|
+
: undefined,
|
|
35
|
+
}) }), _jsx(Label, { htmlFor: "bj-doc-invoice-contract", className: "cursor-pointer", children: messages.bookingCreateDialog.labels.generateInvoiceAndContract })] }), _jsxs("div", { className: "flex items-start gap-2 border-t pt-2 text-sm", children: [_jsx(Checkbox, { id: "bj-notify-traveler", checked: draft.suppressNotifications !== true, onCheckedChange: (v) => setDraft({ ...draft, suppressNotifications: v !== true }) }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Label, { htmlFor: "bj-notify-traveler", className: "cursor-pointer", children: messages.bookingCreateDialog.fields.notifyTraveler }), _jsx("p", { className: "text-muted-foreground text-xs", children: messages.bookingCreateDialog.fields.notifyTravelerHint })] })] })] })] })] })] }));
|
|
36
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Draft } from "../../lib/draft-state.js";
|
|
2
|
+
import type { PaymentProviderCapabilities, PaymentProviderStepRenderProps, VoucherPickerProps } from "../../types.js";
|
|
3
|
+
import type { StepCommonProps } from "./shared.js";
|
|
4
|
+
export declare function PaymentStep({ draft, setDraft, shape, capabilities, renderProviderStep, surface, pricing, }: StepCommonProps & {
|
|
5
|
+
capabilities: PaymentProviderCapabilities;
|
|
6
|
+
renderProviderStep?: (props: PaymentProviderStepRenderProps) => React.ReactNode;
|
|
7
|
+
surface?: "admin" | "public";
|
|
8
|
+
/** Live quote total + currency — drives the payment-schedule editor defaults. */
|
|
9
|
+
pricing?: {
|
|
10
|
+
total: number;
|
|
11
|
+
currency: string;
|
|
12
|
+
} | null;
|
|
13
|
+
}): React.ReactElement;
|
|
14
|
+
/**
|
|
15
|
+
* Operator-only PAYMENT-RELATED finalize controls — manual price override and
|
|
16
|
+
* voucher redemption (both change the amount due, so they live in the Payment
|
|
17
|
+
* block). Non-payment finalization (internal notes, document generation) lives
|
|
18
|
+
* in the separate Documents step.
|
|
19
|
+
*/
|
|
20
|
+
export declare function FinalizeControls({ draft, setDraft, pricing, renderVoucherPicker, }: {
|
|
21
|
+
draft: Draft;
|
|
22
|
+
setDraft: (next: Draft) => void;
|
|
23
|
+
pricing?: {
|
|
24
|
+
total: number;
|
|
25
|
+
currency: string;
|
|
26
|
+
} | null;
|
|
27
|
+
renderVoucherPicker?: (props: VoucherPickerProps) => React.ReactNode;
|
|
28
|
+
}): React.ReactElement;
|
|
29
|
+
//# sourceMappingURL=payment-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-step.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/payment-step.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAE,KAAK,KAAK,EAAc,MAAM,0BAA0B,CAAA;AAKjE,OAAO,KAAK,EACV,2BAA2B,EAC3B,8BAA8B,EAC9B,kBAAkB,EACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAMlD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,kBAAkB,EAClB,OAAO,EACP,OAAO,GACR,EAAE,eAAe,GAAG;IACnB,YAAY,EAAE,2BAA2B,CAAA;IACzC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,KAAK,CAAC,SAAS,CAAA;IAC/E,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B,iFAAiF;IACjF,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CACrD,GAAG,KAAK,CAAC,YAAY,CAqIrB;AAiSD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,mBAAmB,GACpB,EAAE;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAA;IAC/B,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACpD,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,KAAK,CAAC,SAAS,CAAA;CACrE,GAAG,KAAK,CAAC,YAAY,CAerB"}
|