@clubmed/trident-ui 2.0.0-beta.7 → 2.0.0-beta.74
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/README.md +8 -0
- package/assets/trident-ui.css +3 -0
- package/chunks/Backdrop.js +1 -1
- package/chunks/Backdrop.js.map +1 -1
- package/chunks/Birthdate.js +27 -0
- package/chunks/Birthdate.js.map +1 -0
- package/chunks/Carousel.context.js +1548 -0
- package/chunks/Carousel.context.js.map +1 -0
- package/chunks/ChatMessage.js +14395 -0
- package/chunks/ChatMessage.js.map +1 -0
- package/chunks/CriteriaParticipants.js +415 -0
- package/chunks/CriteriaParticipants.js.map +1 -0
- package/chunks/DateField.js +189 -128
- package/chunks/DateField.js.map +1 -1
- package/chunks/Datepicker.js +2039 -0
- package/chunks/Datepicker.js.map +1 -0
- package/chunks/Day.js +88 -0
- package/chunks/Day.js.map +1 -0
- package/chunks/Range.js +2 -2
- package/chunks/Range.js.map +1 -1
- package/chunks/Tooltip.js +4461 -0
- package/chunks/Tooltip.js.map +1 -0
- package/chunks/addLeadingZeros.js +33 -0
- package/chunks/addLeadingZeros.js.map +1 -0
- package/chunks/addYears.js +18 -0
- package/chunks/addYears.js.map +1 -0
- package/chunks/chunk.js +11 -4
- package/chunks/client.js +18953 -0
- package/chunks/client.js.map +1 -0
- package/chunks/endOfMonth.js +17 -0
- package/chunks/endOfMonth.js.map +1 -0
- package/chunks/format.js +1113 -0
- package/chunks/format.js.map +1 -0
- package/chunks/formatISO.js +29 -0
- package/chunks/formatISO.js.map +1 -0
- package/chunks/isAfter.js +9 -0
- package/chunks/isAfter.js.map +1 -0
- package/chunks/isBefore.js +15 -0
- package/chunks/isBefore.js.map +1 -0
- package/chunks/normalizeDates.js +10 -0
- package/chunks/normalizeDates.js.map +1 -0
- package/chunks/subYears.js +9 -0
- package/chunks/subYears.js.map +1 -0
- package/examples/accordion-demo.d.ts +1 -0
- package/examples/accordion-demo.js +79 -0
- package/examples/accordion-demo.js.map +1 -0
- package/examples/accordion-multiple-demo.d.ts +1 -0
- package/examples/accordion-multiple-demo.js +79 -0
- package/examples/accordion-multiple-demo.js.map +1 -0
- package/examples/accordion-trigger-wrapper-demo.d.ts +1 -0
- package/examples/accordion-trigger-wrapper-demo.js +80 -0
- package/examples/accordion-trigger-wrapper-demo.js.map +1 -0
- package/examples/advanced-toast-demo.js +2 -2
- package/examples/advanced-toast-demo.js.map +1 -1
- package/examples/advanced-toast-green-demo.js +1 -1
- package/examples/advanced-toast-green-demo.js.map +1 -1
- package/examples/advanced-toast-no-dismiss-demo.js +1 -1
- package/examples/advanced-toast-no-dismiss-demo.js.map +1 -1
- package/examples/advanced-toast-red-demo.js +1 -1
- package/examples/advanced-toast-red-demo.js.map +1 -1
- package/examples/advanced-toast-with-details-demo.js +2 -2
- package/examples/advanced-toast-with-details-demo.js.map +1 -1
- package/examples/arrow-button-demo.js +2 -1
- package/examples/arrow-button-demo.js.map +1 -1
- package/examples/arrow-button-disabled-demo.js +2 -1
- package/examples/arrow-button-disabled-demo.js.map +1 -1
- package/examples/arrow-button-left-demo.js +2 -1
- package/examples/arrow-button-left-demo.js.map +1 -1
- package/examples/arrow-button-outline-demo.js +2 -1
- package/examples/arrow-button-outline-demo.js.map +1 -1
- package/examples/arrow-button-tail-demo.js +2 -1
- package/examples/arrow-button-tail-demo.js.map +1 -1
- package/examples/avatar-demo.js +7 -7
- package/examples/button-demo.js +2 -2
- package/examples/button-demo.js.map +1 -1
- package/examples/card-list-demo.js +10 -10
- package/examples/card-no-border-demo.js +7 -7
- package/examples/chat-button-demo.js +1 -1
- package/examples/chat-button-demo.js.map +1 -1
- package/examples/chat-button-offset-demo.js +4 -1
- package/examples/chat-button-offset-demo.js.map +1 -1
- package/examples/chat-input-demo.d.ts +1 -0
- package/examples/chat-input-demo.js +22 -0
- package/examples/chat-input-demo.js.map +1 -0
- package/examples/chat-message-demo.d.ts +1 -0
- package/examples/chat-message-demo.js +20 -0
- package/examples/chat-message-demo.js.map +1 -0
- package/examples/chat-typing-indicator-demo.d.ts +1 -0
- package/examples/chat-typing-indicator-demo.js +14 -0
- package/examples/chat-typing-indicator-demo.js.map +1 -0
- package/examples/chat-window-csat-demo.d.ts +1 -0
- package/examples/chat-window-csat-demo.js +69 -0
- package/examples/chat-window-csat-demo.js.map +1 -0
- package/examples/chat-window-csat-prompt-demo.d.ts +1 -0
- package/examples/chat-window-csat-prompt-demo.js +40 -0
- package/examples/chat-window-csat-prompt-demo.js.map +1 -0
- package/examples/chat-window-demo.d.ts +1 -0
- package/examples/chat-window-demo.js +70 -0
- package/examples/chat-window-demo.js.map +1 -0
- package/examples/chat-window-quote-demo.d.ts +1 -0
- package/examples/chat-window-quote-demo.js +47 -0
- package/examples/chat-window-quote-demo.js.map +1 -0
- package/examples/chat-window-quotes-demo.d.ts +1 -0
- package/examples/chat-window-quotes-demo.js +68 -0
- package/examples/chat-window-quotes-demo.js.map +1 -0
- package/examples/checkbox-demo.js +17 -15
- package/examples/checkbox-demo.js.map +1 -1
- package/examples/checkbox-disabled-demo.js +12 -15
- package/examples/checkbox-disabled-demo.js.map +1 -1
- package/examples/checkbox-select-demo.d.ts +1 -0
- package/examples/checkbox-select-demo.js +101 -0
- package/examples/checkbox-select-demo.js.map +1 -0
- package/examples/checkboxes-demo.js +2 -1
- package/examples/checkboxes-demo.js.map +1 -1
- package/examples/checkboxes-with-form-control-demo.js +8 -8
- package/examples/checkboxes-with-form-control-demo.js.map +1 -1
- package/examples/chip-demo.js +4 -4
- package/examples/choice-expander-demo.js +5 -67
- package/examples/choice-expander-demo.js.map +1 -1
- package/examples/countdown-demo.d.ts +1 -0
- package/examples/countdown-demo.js +39 -0
- package/examples/countdown-demo.js.map +1 -0
- package/examples/criteria-dates-demo.d.ts +1 -0
- package/examples/criteria-dates-demo.js +41 -0
- package/examples/criteria-dates-demo.js.map +1 -0
- package/examples/criteria-participants-demo.d.ts +1 -0
- package/examples/criteria-participants-demo.js +77 -0
- package/examples/criteria-participants-demo.js.map +1 -0
- package/examples/criteria-participants-flow1-demo.d.ts +1 -0
- package/examples/criteria-participants-flow1-demo.js +53 -0
- package/examples/criteria-participants-flow1-demo.js.map +1 -0
- package/examples/criteria-participants-flow2-demo.d.ts +1 -0
- package/examples/criteria-participants-flow2-demo.js +61 -0
- package/examples/criteria-participants-flow2-demo.js.map +1 -0
- package/examples/criteria-participants-flow3-demo.d.ts +1 -0
- package/examples/criteria-participants-flow3-demo.js +72 -0
- package/examples/criteria-participants-flow3-demo.js.map +1 -0
- package/examples/criteria-transports-b2b-demo.d.ts +1 -0
- package/examples/criteria-transports-b2b-demo.js +51 -0
- package/examples/criteria-transports-b2b-demo.js.map +1 -0
- package/examples/criteria-transports-b2c-demo.d.ts +1 -0
- package/examples/criteria-transports-b2c-demo.js +37 -0
- package/examples/criteria-transports-b2c-demo.js.map +1 -0
- package/examples/criteria-transports-data.d.ts +7 -0
- package/examples/criteria-transports-data.js +151 -0
- package/examples/criteria-transports-data.js.map +1 -0
- package/examples/criteria-transports-demo.d.ts +1 -0
- package/examples/criteria-transports-demo.js +34 -0
- package/examples/criteria-transports-demo.js.map +1 -0
- package/examples/criteria-transports-error-demo.d.ts +1 -0
- package/examples/criteria-transports-error-demo.js +29 -0
- package/examples/criteria-transports-error-demo.js.map +1 -0
- package/examples/datepicker-demo.d.ts +1 -0
- package/examples/datepicker-demo.js +51 -0
- package/examples/datepicker-demo.js.map +1 -0
- package/examples/datepicker-disabled-days-demo.d.ts +1 -0
- package/examples/datepicker-disabled-days-demo.js +42 -0
- package/examples/datepicker-disabled-days-demo.js.map +1 -0
- package/examples/datepicker-duration-tooltip-demo.d.ts +1 -0
- package/examples/datepicker-duration-tooltip-demo.js +68 -0
- package/examples/datepicker-duration-tooltip-demo.js.map +1 -0
- package/examples/datepicker-no-prices-demo.d.ts +1 -0
- package/examples/datepicker-no-prices-demo.js +42 -0
- package/examples/datepicker-no-prices-demo.js.map +1 -0
- package/examples/datepicker-preselected-demo.d.ts +1 -0
- package/examples/datepicker-preselected-demo.js +77 -0
- package/examples/datepicker-preselected-demo.js.map +1 -0
- package/examples/dropdown-demo.js +9 -1
- package/examples/dropdown-demo.js.map +1 -1
- package/examples/elastic-height-demo.js +2 -1
- package/examples/elastic-height-demo.js.map +1 -1
- package/examples/expandable-text-demo.d.ts +1 -0
- package/examples/expandable-text-demo.js +22 -0
- package/examples/expandable-text-demo.js.map +1 -0
- package/examples/filter-demo.js +5 -5
- package/examples/floating-label-text-field-demo.d.ts +1 -0
- package/examples/floating-label-text-field-demo.js +32 -0
- package/examples/floating-label-text-field-demo.js.map +1 -0
- package/examples/frame-demo.d.ts +1 -0
- package/examples/frame-demo.js +36 -0
- package/examples/frame-demo.js.map +1 -0
- package/examples/frame-horizontal-demo.d.ts +1 -0
- package/examples/frame-horizontal-demo.js +44 -0
- package/examples/frame-horizontal-demo.js.map +1 -0
- package/examples/frame-no-image-demo.d.ts +1 -0
- package/examples/frame-no-image-demo.js +47 -0
- package/examples/frame-no-image-demo.js.map +1 -0
- package/examples/frame-vertical-demo.d.ts +1 -0
- package/examples/frame-vertical-demo.js +44 -0
- package/examples/frame-vertical-demo.js.map +1 -0
- package/examples/frame-with-tag-demo.d.ts +1 -0
- package/examples/frame-with-tag-demo.js +48 -0
- package/examples/frame-with-tag-demo.js.map +1 -0
- package/examples/journey-card-compact-demo.d.ts +1 -0
- package/examples/journey-card-compact-demo.js +71 -0
- package/examples/journey-card-compact-demo.js.map +1 -0
- package/examples/journey-card-demo.d.ts +1 -0
- package/examples/journey-card-demo.js +123 -0
- package/examples/journey-card-demo.js.map +1 -0
- package/examples/page-navigation-demo.d.ts +1 -0
- package/examples/page-navigation-demo.js +53 -0
- package/examples/page-navigation-demo.js.map +1 -0
- package/examples/password-demo.js +1 -0
- package/examples/password-demo.js.map +1 -1
- package/examples/phone-field-demo.js +6 -2
- package/examples/phone-field-demo.js.map +1 -1
- package/examples/radio-demo.js +3 -3
- package/examples/radio-demo.js.map +1 -1
- package/examples/radio-select-demo.d.ts +1 -0
- package/examples/radio-select-demo.js +100 -0
- package/examples/radio-select-demo.js.map +1 -0
- package/examples/scrollbar-demo.d.ts +1 -0
- package/examples/scrollbar-demo.js +42 -0
- package/examples/scrollbar-demo.js.map +1 -0
- package/examples/select-demo.js +1 -0
- package/examples/select-demo.js.map +1 -1
- package/examples/slider-frame-demo.d.ts +1 -0
- package/examples/slider-frame-demo.js +39 -0
- package/examples/slider-frame-demo.js.map +1 -0
- package/examples/slider-frame-with-button-demo.d.ts +1 -0
- package/examples/slider-frame-with-button-demo.js +47 -0
- package/examples/slider-frame-with-button-demo.js.map +1 -0
- package/examples/slider-frame-with-tag-demo.d.ts +1 -0
- package/examples/slider-frame-with-tag-demo.js +51 -0
- package/examples/slider-frame-with-tag-demo.js.map +1 -0
- package/examples/switch-demo.js +3 -2
- package/examples/switch-demo.js.map +1 -1
- package/examples/tabs-demo.js +2 -5
- package/examples/tabs-demo.js.map +1 -1
- package/examples/tabs-notification-demo.d.ts +1 -0
- package/examples/tabs-notification-demo.js +64 -0
- package/examples/tabs-notification-demo.js.map +1 -0
- package/examples/tabs-with-select-demo.js +1 -0
- package/examples/tabs-with-select-demo.js.map +1 -1
- package/examples/text-field-demo.js +6 -0
- package/examples/text-field-demo.js.map +1 -1
- package/examples/toggle-demo.d.ts +1 -0
- package/examples/toggle-demo.js +44 -0
- package/examples/toggle-demo.js.map +1 -0
- package/examples/toggle-small-demo.d.ts +1 -0
- package/examples/toggle-small-demo.js +33 -0
- package/examples/toggle-small-demo.js.map +1 -0
- package/examples/tooltip-demo.d.ts +1 -0
- package/examples/tooltip-demo.js +103 -0
- package/examples/tooltip-demo.js.map +1 -0
- package/package.json +10 -3
- package/styles/components.css +99 -0
- package/styles/index.css +0 -1
- package/styles/theme.css +5 -2
- package/styles/ui/button.css +1 -1
- package/styles/ui/chat-button.css +68 -1
- package/styles/ui/controls.css +11 -58
- package/styles/ui/range.css +6 -1
- package/styles/ui/tabs.css +0 -19
- package/ui/Accordion.d.ts +30 -0
- package/ui/Accordion.js +71 -0
- package/ui/Accordion.js.map +1 -0
- package/ui/AdvancedToast.js +31 -28
- package/ui/AdvancedToast.js.map +1 -1
- package/ui/Avatar.js +1 -1
- package/ui/Avatar.js.map +1 -1
- package/ui/BasicToast.js +13 -13
- package/ui/BasicToast.js.map +1 -1
- package/ui/Breadcrumb.js +7 -6
- package/ui/Breadcrumb.js.map +1 -1
- package/ui/ChatButton.js +9 -9
- package/ui/ChatButton.js.map +1 -1
- package/ui/ChatInput.d.ts +10 -0
- package/ui/ChatInput.js +149 -0
- package/ui/ChatInput.js.map +1 -0
- package/ui/ChatMessage.d.ts +6 -0
- package/ui/ChatMessage.js +2 -0
- package/ui/ChatTypingIndicator.d.ts +2 -0
- package/ui/ChatTypingIndicator.js +30 -0
- package/ui/ChatTypingIndicator.js.map +1 -0
- package/ui/ChatWindow.d.ts +34 -0
- package/ui/ChatWindow.js +142 -0
- package/ui/ChatWindow.js.map +1 -0
- package/ui/ChatWindowCsatPrompt.d.ts +15 -0
- package/ui/ChatWindowCsatPrompt.js +71 -0
- package/ui/ChatWindowCsatPrompt.js.map +1 -0
- package/ui/ChatWindowCsatThankYou.d.ts +9 -0
- package/ui/ChatWindowCsatThankYou.js +29 -0
- package/ui/ChatWindowCsatThankYou.js.map +1 -0
- package/ui/ChatWindowQuote.d.ts +22 -0
- package/ui/ChatWindowQuote.js +141 -0
- package/ui/ChatWindowQuote.js.map +1 -0
- package/ui/Chip.js +4 -4
- package/ui/ChoiceExpander.js +18 -18
- package/ui/ChoiceExpander.js.map +1 -1
- package/ui/Countdown.d.ts +16 -0
- package/ui/Countdown.js +61 -0
- package/ui/Countdown.js.map +1 -0
- package/ui/Datepicker.d.ts +26 -0
- package/ui/Datepicker.js +2 -0
- package/ui/Day.d.ts +25 -0
- package/ui/Day.js +2 -0
- package/ui/Dropdown.d.ts +20 -3
- package/ui/Dropdown.js +61 -27
- package/ui/Dropdown.js.map +1 -1
- package/ui/ElasticHeight.d.ts +0 -1
- package/ui/ElasticHeight.js +14 -23
- package/ui/ElasticHeight.js.map +1 -1
- package/ui/ExpandableText.d.ts +14 -0
- package/ui/ExpandableText.js +40 -0
- package/ui/ExpandableText.js.map +1 -0
- package/ui/FlipCard.d.ts +7 -0
- package/ui/FlipCard.js +59 -0
- package/ui/FlipCard.js.map +1 -0
- package/ui/HamburgerIcon.js +1 -1
- package/ui/HamburgerIcon.js.map +1 -1
- package/ui/Link.js +8 -8
- package/ui/Link.js.map +1 -1
- package/ui/PageNavigation.d.ts +13 -0
- package/ui/PageNavigation.js +71 -0
- package/ui/PageNavigation.js.map +1 -0
- package/ui/Pagination.js +23 -23
- package/ui/Pagination.js.map +1 -1
- package/ui/Scrollbar.d.ts +14 -0
- package/ui/Scrollbar.js +68 -0
- package/ui/Scrollbar.js.map +1 -0
- package/ui/SidebarLayout.d.ts +3 -1
- package/ui/SidebarLayout.js +67 -59
- package/ui/SidebarLayout.js.map +1 -1
- package/ui/Tag.js +6 -6
- package/ui/Toggle.d.ts +15 -0
- package/ui/Toggle.js +42 -0
- package/ui/Toggle.js.map +1 -0
- package/ui/Tooltip.d.ts +8 -0
- package/ui/Tooltip.js +2 -0
- package/ui/buttons/Button.type.d.ts +1 -1
- package/ui/buttons/Button.type.js +1 -1
- package/ui/buttons/Button.type.js.map +1 -1
- package/ui/buttons/ButtonContent.js +3 -3
- package/ui/carousel/Carousel.context.d.ts +27 -0
- package/ui/carousel/Carousel.context.js +2 -0
- package/ui/carousel/Carousel.d.ts +3 -0
- package/ui/carousel/Carousel.js +12 -0
- package/ui/carousel/Carousel.js.map +1 -0
- package/ui/carousel/CarouselBody.d.ts +6 -0
- package/ui/carousel/CarouselBody.js +21 -0
- package/ui/carousel/CarouselBody.js.map +1 -0
- package/ui/carousel/CarouselItem.d.ts +6 -0
- package/ui/carousel/CarouselItem.js +21 -0
- package/ui/carousel/CarouselItem.js.map +1 -0
- package/ui/carousel/CarouselNext.d.ts +8 -0
- package/ui/carousel/CarouselNext.js +23 -0
- package/ui/carousel/CarouselNext.js.map +1 -0
- package/ui/carousel/CarouselPrevious.d.ts +8 -0
- package/ui/carousel/CarouselPrevious.js +23 -0
- package/ui/carousel/CarouselPrevious.js.map +1 -0
- package/ui/contexts/TridentUIConfig.js +1 -1
- package/ui/criteria/Birthdate.d.ts +13 -0
- package/ui/criteria/Birthdate.js +2 -0
- package/ui/criteria/CriteriaDates.d.ts +32 -0
- package/ui/criteria/CriteriaDates.js +76 -0
- package/ui/criteria/CriteriaDates.js.map +1 -0
- package/ui/criteria/CriteriaParticipants.d.ts +106 -0
- package/ui/criteria/CriteriaParticipants.js +2 -0
- package/ui/criteria/CriteriaSection.d.ts +6 -0
- package/ui/criteria/CriteriaSection.js +15 -0
- package/ui/criteria/CriteriaSection.js.map +1 -0
- package/ui/criteria/CriteriaTransports.d.ts +72 -0
- package/ui/criteria/CriteriaTransports.js +224 -0
- package/ui/criteria/CriteriaTransports.js.map +1 -0
- package/ui/forms/CheckboxSelect.d.ts +31 -0
- package/ui/forms/CheckboxSelect.js +119 -0
- package/ui/forms/CheckboxSelect.js.map +1 -0
- package/ui/forms/Filter.d.ts +10 -4
- package/ui/forms/Filter.js +26 -44
- package/ui/forms/Filter.js.map +1 -1
- package/ui/forms/FloatingLabelTextField.d.ts +12 -0
- package/ui/forms/FloatingLabelTextField.js +132 -0
- package/ui/forms/FloatingLabelTextField.js.map +1 -0
- package/ui/forms/FormControl.d.ts +1 -1
- package/ui/forms/FormControl.js +4 -4
- package/ui/forms/FormControl.js.map +1 -1
- package/ui/forms/FormControlError.js +4 -4
- package/ui/forms/NumberField.d.ts +27 -26
- package/ui/forms/NumberField.js +24 -25
- package/ui/forms/NumberField.js.map +1 -1
- package/ui/forms/PhoneField.d.ts +5 -10
- package/ui/forms/PhoneField.js +31 -211
- package/ui/forms/PhoneField.js.map +1 -1
- package/ui/forms/PhoneFieldFullInput.d.ts +16 -0
- package/ui/forms/PhoneFieldFullInput.js +110 -0
- package/ui/forms/PhoneFieldFullInput.js.map +1 -0
- package/ui/forms/PhoneFieldSplitInput.d.ts +19 -0
- package/ui/forms/PhoneFieldSplitInput.js +158 -0
- package/ui/forms/PhoneFieldSplitInput.js.map +1 -0
- package/ui/forms/RadioSelect.d.ts +31 -0
- package/ui/forms/RadioSelect.js +117 -0
- package/ui/forms/RadioSelect.js.map +1 -0
- package/ui/forms/Range.d.ts +1 -1
- package/ui/forms/Select.js +18 -19
- package/ui/forms/Select.js.map +1 -1
- package/ui/forms/Switch.d.ts +5 -3
- package/ui/forms/Switch.js +54 -34
- package/ui/forms/Switch.js.map +1 -1
- package/ui/forms/TextField.js +35 -26
- package/ui/forms/TextField.js.map +1 -1
- package/ui/forms/checkboxes/Checkbox.d.ts +9 -4
- package/ui/forms/checkboxes/Checkbox.js +36 -16
- package/ui/forms/checkboxes/Checkbox.js.map +1 -1
- package/ui/forms/checkboxes/Checkboxes.d.ts +5 -0
- package/ui/forms/checkboxes/Checkboxes.js +8 -8
- package/ui/forms/checkboxes/Checkboxes.js.map +1 -1
- package/ui/forms/checkboxes/index.d.ts +0 -1
- package/ui/forms/checkboxes/index.js +1 -2
- package/ui/forms/password/Password.js +21 -22
- package/ui/forms/password/Password.js.map +1 -1
- package/ui/forms/password/ValidationMessage.js +5 -5
- package/ui/forms/radios/Radio.d.ts +2 -1
- package/ui/forms/radios/Radio.js +6 -3
- package/ui/forms/radios/Radio.js.map +1 -1
- package/ui/forms/radios/RadioGroup.js +13 -14
- package/ui/forms/radios/RadioGroup.js.map +1 -1
- package/ui/frame/Frame.d.ts +8 -0
- package/ui/frame/Frame.js +16 -0
- package/ui/frame/Frame.js.map +1 -0
- package/ui/frame/FrameLabelsWrapper.d.ts +5 -0
- package/ui/frame/FrameLabelsWrapper.js +12 -0
- package/ui/frame/FrameLabelsWrapper.js.map +1 -0
- package/ui/frame/FrameTitle.d.ts +7 -0
- package/ui/frame/FrameTitle.js +25 -0
- package/ui/frame/FrameTitle.js.map +1 -0
- package/ui/frame/FrameWrapper.d.ts +6 -0
- package/ui/frame/FrameWrapper.js +14 -0
- package/ui/frame/FrameWrapper.js.map +1 -0
- package/ui/frame/SliderFrame.d.ts +14 -0
- package/ui/frame/SliderFrame.js +50 -0
- package/ui/frame/SliderFrame.js.map +1 -0
- package/ui/helpers/cn.d.ts +2 -0
- package/ui/helpers/cn.js +10 -0
- package/ui/helpers/cn.js.map +1 -0
- package/ui/helpers/phone/defaultPrefixes.d.ts +1 -0
- package/ui/helpers/phone/defaultPrefixes.js +52 -28
- package/ui/helpers/phone/defaultPrefixes.js.map +1 -1
- package/ui/helpers/phone/formatters.d.ts +11 -0
- package/ui/helpers/phone/formatters.js +32 -1
- package/ui/helpers/phone/formatters.js.map +1 -1
- package/ui/helpers/phone/index.d.ts +1 -1
- package/ui/helpers/phone/index.js +3 -3
- package/ui/hooks/useIsClient.d.ts +1 -0
- package/ui/hooks/useIsClient.js +12 -0
- package/ui/hooks/useIsClient.js.map +1 -0
- package/ui/hooks/useValue.d.ts +3 -4
- package/ui/hooks/useValue.js +11 -11
- package/ui/hooks/useValue.js.map +1 -1
- package/ui/journey-card/FlightSegmentCard.d.ts +15 -0
- package/ui/journey-card/FlightSegmentCard.js +73 -0
- package/ui/journey-card/FlightSegmentCard.js.map +1 -0
- package/ui/journey-card/FlightTimeline.d.ts +5 -0
- package/ui/journey-card/FlightTimeline.js +27 -0
- package/ui/journey-card/FlightTimeline.js.map +1 -0
- package/ui/journey-card/ItineraryDetails.d.ts +9 -0
- package/ui/journey-card/ItineraryDetails.js +40 -0
- package/ui/journey-card/ItineraryDetails.js.map +1 -0
- package/ui/journey-card/JourneyCard.d.ts +17 -0
- package/ui/journey-card/JourneyCard.js +34 -0
- package/ui/journey-card/JourneyCard.js.map +1 -0
- package/ui/journey-card/JourneyDetails.d.ts +47 -0
- package/ui/journey-card/JourneyDetails.js +183 -0
- package/ui/journey-card/JourneyDetails.js.map +1 -0
- package/ui/tabs/Tabs.d.ts +5 -1
- package/ui/tabs/Tabs.js +208 -124
- package/ui/tabs/Tabs.js.map +1 -1
- package/examples/form-checkbox-demo.d.ts +0 -1
- package/examples/form-checkbox-demo.js +0 -30
- package/examples/form-checkbox-demo.js.map +0 -1
- package/examples/form-checkbox-disabled-demo.d.ts +0 -1
- package/examples/form-checkbox-disabled-demo.js +0 -25
- package/examples/form-checkbox-disabled-demo.js.map +0 -1
- package/ui/forms/checkboxes/FormCheckbox.d.ts +0 -12
- package/ui/forms/checkboxes/FormCheckbox.js +0 -38
- package/ui/forms/checkboxes/FormCheckbox.js.map +0 -1
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Button as e } from "./buttons/Button.js";
|
|
3
|
+
import { twMerge as t } from "./helpers/twMerge.js";
|
|
4
|
+
import { Scrollbar as n } from "./Scrollbar.js";
|
|
5
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
6
|
+
//#region lib/ui/ChatWindowQuote.tsx
|
|
7
|
+
function a({ quote: t, onCtaClick: n }) {
|
|
8
|
+
return /* @__PURE__ */ i("article", {
|
|
9
|
+
"aria-label": t.resortName,
|
|
10
|
+
className: "flex flex-col bg-white border border-lightGrey rounded-32 shadow-[0px_2px_14px_0px_rgba(0,0,0,0.25)] overflow-hidden p-24 gap-16",
|
|
11
|
+
children: [/* @__PURE__ */ i("div", {
|
|
12
|
+
className: "relative h-210 w-full overflow-hidden rounded-16",
|
|
13
|
+
children: [
|
|
14
|
+
/* @__PURE__ */ r("img", {
|
|
15
|
+
src: t.imageUrl,
|
|
16
|
+
alt: "",
|
|
17
|
+
className: "absolute inset-0 size-full object-cover"
|
|
18
|
+
}),
|
|
19
|
+
/* @__PURE__ */ r("div", { className: "absolute inset-0 bg-gradient-to-b from-transparent from-50% to-[rgba(36,36,36,0.4)]" }),
|
|
20
|
+
/* @__PURE__ */ i("div", {
|
|
21
|
+
className: "absolute bottom-20 inset-x-0 flex flex-col items-center text-white text-center px-20",
|
|
22
|
+
children: [/* @__PURE__ */ r("p", {
|
|
23
|
+
className: "text-b2 font-semibold",
|
|
24
|
+
children: t.resortName
|
|
25
|
+
}), /* @__PURE__ */ r("p", {
|
|
26
|
+
className: "text-b3",
|
|
27
|
+
children: t.country
|
|
28
|
+
})]
|
|
29
|
+
})
|
|
30
|
+
]
|
|
31
|
+
}), /* @__PURE__ */ i("div", {
|
|
32
|
+
className: "flex flex-col gap-16 items-center",
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ i("p", {
|
|
35
|
+
className: "text-b4 font-semibold text-black text-center",
|
|
36
|
+
children: [
|
|
37
|
+
t.resortName,
|
|
38
|
+
", ",
|
|
39
|
+
t.dateRange,
|
|
40
|
+
", ",
|
|
41
|
+
t.pax
|
|
42
|
+
]
|
|
43
|
+
}),
|
|
44
|
+
/* @__PURE__ */ r(e, {
|
|
45
|
+
color: "saffron",
|
|
46
|
+
onClick: () => n?.(t),
|
|
47
|
+
children: t.ctaLabel ?? "See prices"
|
|
48
|
+
}),
|
|
49
|
+
t.packageIncludes && t.packageIncludes.length > 0 && /* @__PURE__ */ i("div", {
|
|
50
|
+
className: "flex flex-col gap-4 w-full",
|
|
51
|
+
children: [/* @__PURE__ */ r("p", {
|
|
52
|
+
className: "text-b3 font-semibold text-black",
|
|
53
|
+
children: "Your All-Inclusive package includes:"
|
|
54
|
+
}), /* @__PURE__ */ r("ul", {
|
|
55
|
+
className: "flex flex-col gap-2",
|
|
56
|
+
children: t.packageIncludes.map((e) => /* @__PURE__ */ i("li", {
|
|
57
|
+
className: "text-b3 text-black",
|
|
58
|
+
children: ["• ", e]
|
|
59
|
+
}, e))
|
|
60
|
+
})]
|
|
61
|
+
}),
|
|
62
|
+
t.additionalInfo && /* @__PURE__ */ r("p", {
|
|
63
|
+
className: "text-b3 text-black",
|
|
64
|
+
children: t.additionalInfo
|
|
65
|
+
})
|
|
66
|
+
]
|
|
67
|
+
})]
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function o({ quote: t, onCtaClick: n }) {
|
|
71
|
+
return /* @__PURE__ */ i("article", {
|
|
72
|
+
"aria-label": t.resortName,
|
|
73
|
+
className: "flex flex-col gap-12 items-center shrink-0 w-200",
|
|
74
|
+
children: [/* @__PURE__ */ i("div", {
|
|
75
|
+
className: "relative size-200 rounded-16 overflow-hidden",
|
|
76
|
+
children: [
|
|
77
|
+
/* @__PURE__ */ r("img", {
|
|
78
|
+
src: t.imageUrl,
|
|
79
|
+
alt: "",
|
|
80
|
+
className: "absolute inset-0 size-full object-cover"
|
|
81
|
+
}),
|
|
82
|
+
/* @__PURE__ */ r("div", { className: "absolute inset-0 rounded-16 bg-gradient-to-b from-transparent from-50% to-[rgba(36,36,36,0.4)]" }),
|
|
83
|
+
/* @__PURE__ */ i("div", {
|
|
84
|
+
className: "absolute bottom-20 inset-x-0 flex flex-col items-center text-white text-center px-8",
|
|
85
|
+
children: [/* @__PURE__ */ r("p", {
|
|
86
|
+
className: "text-b4 font-semibold",
|
|
87
|
+
children: t.resortName
|
|
88
|
+
}), /* @__PURE__ */ r("p", {
|
|
89
|
+
className: "text-b5",
|
|
90
|
+
children: t.country
|
|
91
|
+
})]
|
|
92
|
+
})
|
|
93
|
+
]
|
|
94
|
+
}), /* @__PURE__ */ i("div", {
|
|
95
|
+
className: "flex flex-col gap-8 items-center",
|
|
96
|
+
children: [/* @__PURE__ */ i("p", {
|
|
97
|
+
className: "text-b5 font-semibold text-black text-center",
|
|
98
|
+
children: [
|
|
99
|
+
t.resortName,
|
|
100
|
+
/* @__PURE__ */ r("br", {}),
|
|
101
|
+
t.dateRange,
|
|
102
|
+
",",
|
|
103
|
+
/* @__PURE__ */ r("br", {}),
|
|
104
|
+
t.pax
|
|
105
|
+
]
|
|
106
|
+
}), /* @__PURE__ */ r(e, {
|
|
107
|
+
color: "black",
|
|
108
|
+
onClick: () => n?.(t),
|
|
109
|
+
children: t.ctaLabel ?? "See prices"
|
|
110
|
+
})]
|
|
111
|
+
})]
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function s({ quotes: e, onCtaClick: i, className: s }) {
|
|
115
|
+
return e.length === 0 ? null : e.length === 1 ? /* @__PURE__ */ r("div", {
|
|
116
|
+
className: t(s),
|
|
117
|
+
children: /* @__PURE__ */ r(a, {
|
|
118
|
+
quote: e[0],
|
|
119
|
+
onCtaClick: i
|
|
120
|
+
})
|
|
121
|
+
}) : /* @__PURE__ */ r("div", {
|
|
122
|
+
className: t("flex flex-col gap-8", s),
|
|
123
|
+
children: /* @__PURE__ */ r(n, {
|
|
124
|
+
timelineName: "--chat-quote-scroller",
|
|
125
|
+
scrollerClassName: "pb-24",
|
|
126
|
+
scrollbarWidth: "60%",
|
|
127
|
+
"aria-label": "Quote options",
|
|
128
|
+
children: /* @__PURE__ */ r("div", {
|
|
129
|
+
className: "flex gap-12",
|
|
130
|
+
children: e.map((e) => /* @__PURE__ */ r(o, {
|
|
131
|
+
quote: e,
|
|
132
|
+
onCtaClick: i
|
|
133
|
+
}, e.id))
|
|
134
|
+
})
|
|
135
|
+
})
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//#endregion
|
|
139
|
+
export { s as ChatWindowQuote };
|
|
140
|
+
|
|
141
|
+
//# sourceMappingURL=ChatWindowQuote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWindowQuote.js","names":[],"sources":["../../lib/ui/ChatWindowQuote.tsx"],"sourcesContent":["'use client';\n\nimport { twMerge } from './helpers/twMerge';\nimport { Button } from './buttons/Button';\nimport { Scrollbar } from './Scrollbar';\n\nexport interface ChatWindowQuoteItem {\n id: string;\n resortName: string;\n country: string;\n imageUrl: string;\n /** Date range, e.g. \"15 June 2026 to 24 June 2026\" */\n dateRange: string;\n /** Pax info, e.g. \"for 2 adults 2 children\" */\n pax: string;\n /** CTA button label. Defaults to \"See prices\" */\n ctaLabel?: string;\n /** Bullet-point package items. Shown in single-quote inline mode only */\n packageIncludes?: string[];\n /** Free-text paragraph shown in single-quote inline mode only */\n additionalInfo?: string;\n}\n\nexport interface ChatWindowQuoteProps {\n quotes: ChatWindowQuoteItem[];\n onCtaClick?: (quote: ChatWindowQuoteItem) => void;\n className?: string;\n}\n\ninterface QuoteCardProps {\n quote: ChatWindowQuoteItem;\n onCtaClick?: (quote: ChatWindowQuoteItem) => void;\n}\n\nfunction SingleQuoteCard({ quote, onCtaClick }: QuoteCardProps) {\n return (\n <article\n aria-label={quote.resortName}\n className=\"flex flex-col bg-white border border-lightGrey rounded-32 shadow-[0px_2px_14px_0px_rgba(0,0,0,0.25)] overflow-hidden p-24 gap-16\"\n >\n <div className=\"relative h-210 w-full overflow-hidden rounded-16\">\n <img src={quote.imageUrl} alt=\"\" className=\"absolute inset-0 size-full object-cover\" />\n <div className=\"absolute inset-0 bg-gradient-to-b from-transparent from-50% to-[rgba(36,36,36,0.4)]\" />\n <div className=\"absolute bottom-20 inset-x-0 flex flex-col items-center text-white text-center px-20\">\n <p className=\"text-b2 font-semibold\">{quote.resortName}</p>\n <p className=\"text-b3\">{quote.country}</p>\n </div>\n </div>\n <div className=\"flex flex-col gap-16 items-center\">\n <p className=\"text-b4 font-semibold text-black text-center\">\n {quote.resortName}, {quote.dateRange}, {quote.pax}\n </p>\n <Button color=\"saffron\" onClick={() => onCtaClick?.(quote)}>\n {quote.ctaLabel ?? 'See prices'}\n </Button>\n {quote.packageIncludes && quote.packageIncludes.length > 0 && (\n <div className=\"flex flex-col gap-4 w-full\">\n <p className=\"text-b3 font-semibold text-black\">Your All-Inclusive package includes:</p>\n <ul className=\"flex flex-col gap-2\">\n {quote.packageIncludes.map((item) => (\n <li key={item} className=\"text-b3 text-black\">\n • {item}\n </li>\n ))}\n </ul>\n </div>\n )}\n {quote.additionalInfo && <p className=\"text-b3 text-black\">{quote.additionalInfo}</p>}\n </div>\n </article>\n );\n}\n\nfunction CompactQuoteCard({ quote, onCtaClick }: QuoteCardProps) {\n return (\n <article\n aria-label={quote.resortName}\n className=\"flex flex-col gap-12 items-center shrink-0 w-200\"\n >\n <div className=\"relative size-200 rounded-16 overflow-hidden\">\n <img src={quote.imageUrl} alt=\"\" className=\"absolute inset-0 size-full object-cover\" />\n <div className=\"absolute inset-0 rounded-16 bg-gradient-to-b from-transparent from-50% to-[rgba(36,36,36,0.4)]\" />\n <div className=\"absolute bottom-20 inset-x-0 flex flex-col items-center text-white text-center px-8\">\n <p className=\"text-b4 font-semibold\">{quote.resortName}</p>\n <p className=\"text-b5\">{quote.country}</p>\n </div>\n </div>\n <div className=\"flex flex-col gap-8 items-center\">\n <p className=\"text-b5 font-semibold text-black text-center\">\n {quote.resortName}\n <br />\n {quote.dateRange},\n <br />\n {quote.pax}\n </p>\n <Button color=\"black\" onClick={() => onCtaClick?.(quote)}>\n {quote.ctaLabel ?? 'See prices'}\n </Button>\n </div>\n </article>\n );\n}\n\nexport function ChatWindowQuote({ quotes, onCtaClick, className }: ChatWindowQuoteProps) {\n if (quotes.length === 0) return null;\n\n if (quotes.length === 1) {\n return (\n <div className={twMerge(className)}>\n <SingleQuoteCard quote={quotes[0]} onCtaClick={onCtaClick} />\n </div>\n );\n }\n\n return (\n <div className={twMerge('flex flex-col gap-8', className)}>\n <Scrollbar\n timelineName=\"--chat-quote-scroller\"\n scrollerClassName=\"pb-24\"\n scrollbarWidth=\"60%\"\n aria-label=\"Quote options\"\n >\n <div className=\"flex gap-12\">\n {quotes.map((quote) => (\n <CompactQuoteCard key={quote.id} quote={quote} onCtaClick={onCtaClick} />\n ))}\n </div>\n </Scrollbar>\n </div>\n );\n}\n"],"mappings":";;;;;;AAkCA,SAAS,EAAgB,EAAE,UAAO,iBAA8B;AAC9D,QACE,kBAAC,WAAD;EACE,cAAY,EAAM;EAClB,WAAU;YAFZ,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,KAAK,EAAM;KAAU,KAAI;KAAG,WAAU;KAA4C,CAAA;IACvF,kBAAC,OAAD,EAAK,WAAU,uFAAwF,CAAA;IACvG,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAyB,EAAM;MAAe,CAAA,EAC3D,kBAAC,KAAD;MAAG,WAAU;gBAAW,EAAM;MAAY,CAAA,CAAA;;;MAG9C,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,KAAD;KAAG,WAAU;eAAb;MACG,EAAM;MAAW;MAAG,EAAM;MAAU;MAAG,EAAM;;;IAEhD,kBAAC,GAAD;KAAQ,OAAM;KAAU,eAAe,IAAa,EAAM;eACvD,EAAM,YAAY;KACZ,CAAA;IACR,EAAM,mBAAmB,EAAM,gBAAgB,SAAS,KACvD,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAmC;MAAwC,CAAA,EACxF,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAM,gBAAgB,KAAK,MAC1B,kBAAC,MAAD;OAAe,WAAU;iBAAzB,CAA8C,MACzC,EAAA;SADI,EAEJ,CAAA;MAEJ,CAAA,CAAA;;IAGR,EAAM,kBAAkB,kBAAC,KAAD;KAAG,WAAU;eAAsB,EAAM;KAAmB,CAAA;;;;;AAM7F,SAAS,EAAiB,EAAE,UAAO,iBAA8B;AAC/D,QACE,kBAAC,WAAD;EACE,cAAY,EAAM;EAClB,WAAU;YAFZ,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,KAAK,EAAM;KAAU,KAAI;KAAG,WAAU;KAA4C,CAAA;IACvF,kBAAC,OAAD,EAAK,WAAU,kGAAmG,CAAA;IAClH,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAyB,EAAM;MAAe,CAAA,EAC3D,kBAAC,KAAD;MAAG,WAAU;gBAAW,EAAM;MAAY,CAAA,CAAA;;;MAG9C,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAb;KACG,EAAM;KACP,kBAAC,MAAD,EAAM,CAAA;KACL,EAAM;KAAU;KACjB,kBAAC,MAAD,EAAM,CAAA;KACL,EAAM;;OAET,kBAAC,GAAD;IAAQ,OAAM;IAAQ,eAAe,IAAa,EAAM;cACrD,EAAM,YAAY;IACZ,CAAA,CAAA;;;;AAMjB,SAAgB,EAAgB,EAAE,WAAQ,eAAY,gBAAmC;AAWvF,QAVI,EAAO,WAAW,IAAU,OAE5B,EAAO,WAAW,IAElB,kBAAC,OAAD;EAAK,WAAW,EAAQ,EAAU;YAChC,kBAAC,GAAD;GAAiB,OAAO,EAAO;GAAgB;GAAc,CAAA;EACzD,CAAA,GAKR,kBAAC,OAAD;EAAK,WAAW,EAAQ,uBAAuB,EAAU;YACvD,kBAAC,GAAD;GACE,cAAa;GACb,mBAAkB;GAClB,gBAAe;GACf,cAAW;aAEX,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAO,KAAK,MACX,kBAAC,GAAD;KAAwC;KAAmB;KAAc,EAAlD,EAAM,GAA4C,CAAA;IAEvE,CAAA;GACI,CAAA;EACR,CAAA"}
|
package/ui/Chip.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { t as e } from "../chunks/clsx.js";
|
|
2
2
|
import { getTheme as t } from "./Chip.themes.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
import { Icon as i } from "@clubmed/trident-icons";
|
|
5
5
|
//#region lib/ui/Chip.tsx
|
|
6
6
|
var a = ({ className: a, color: o = "sienna", icon: s, iconWidth: c = "24px", rotation: l, size: u = "size-32", theme: d = "solid", children: f, ...p }) => {
|
|
7
7
|
let { thRoot: m } = t(d, { color: o });
|
|
8
|
-
return /* @__PURE__ */
|
|
8
|
+
return /* @__PURE__ */ r("span", {
|
|
9
9
|
...p,
|
|
10
10
|
className: e("inline-flex aspect-square shrink-0 items-center justify-center overflow-hidden rounded-full border", u, m, a),
|
|
11
11
|
"data-name": "Chip",
|
|
12
|
-
children: [f && f, s && /* @__PURE__ */
|
|
12
|
+
children: [f && f, s && /* @__PURE__ */ n(i, {
|
|
13
13
|
name: s,
|
|
14
14
|
rotation: l,
|
|
15
15
|
width: c
|
package/ui/ChoiceExpander.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import { t as e } from "../chunks/clsx.js";
|
|
3
3
|
import { getBgColor as t, getTextColor as n } from "./helpers/colors/colors.js";
|
|
4
4
|
import { useCallback as r, useEffect as i, useId as a, useRef as o, useState as s } from "react";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
|
+
import { Icon as u } from "@clubmed/trident-icons";
|
|
7
7
|
//#region lib/ui/ChoiceExpander.tsx
|
|
8
8
|
var d = ({ label: d, showCheckIcon: f = !1, children: p, expanded: m, defaultExpanded: h = !1, onExpandedChange: g, disabled: _ = !1, ariaLabel: v, buttonBgColor: y = "black", buttonTextColor: b = "white", collapseLabel: x, expandLabel: S, className: C, ...w }) => {
|
|
9
9
|
let [T, E] = s(h), D = a(), O = o(null), k = o(null), A = o(null), j = o(!1), M = m === void 0 ? T : m, N = r(() => {
|
|
@@ -31,7 +31,7 @@ var d = ({ label: d, showCheckIcon: f = !1, children: p, expanded: m, defaultExp
|
|
|
31
31
|
O.current && !O.current.contains(e.target) && N();
|
|
32
32
|
};
|
|
33
33
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
34
|
-
}, [M, N]), /* @__PURE__ */
|
|
34
|
+
}, [M, N]), /* @__PURE__ */ c("div", {
|
|
35
35
|
className: e("relative flex items-center justify-center", C),
|
|
36
36
|
"data-name": "ChoiceExpander",
|
|
37
37
|
"data-testid": "choice-expander",
|
|
@@ -40,10 +40,10 @@ var d = ({ label: d, showCheckIcon: f = !1, children: p, expanded: m, defaultExp
|
|
|
40
40
|
height: 48
|
|
41
41
|
},
|
|
42
42
|
...w,
|
|
43
|
-
children: /* @__PURE__ */
|
|
43
|
+
children: /* @__PURE__ */ l("div", {
|
|
44
44
|
ref: O,
|
|
45
45
|
className: e("absolute top-0 grid transition-all duration-500", !M && [
|
|
46
|
-
"w-240 rounded-pill border-transparent",
|
|
46
|
+
"w-240 rounded-pill-transitionable border-transparent",
|
|
47
47
|
t(y),
|
|
48
48
|
n(b)
|
|
49
49
|
], M && [
|
|
@@ -51,7 +51,7 @@ var d = ({ label: d, showCheckIcon: f = !1, children: p, expanded: m, defaultExp
|
|
|
51
51
|
"z-10",
|
|
52
52
|
_ && "opacity-50"
|
|
53
53
|
]),
|
|
54
|
-
children: [/* @__PURE__ */
|
|
54
|
+
children: [/* @__PURE__ */ l("button", {
|
|
55
55
|
ref: A,
|
|
56
56
|
type: "button",
|
|
57
57
|
"data-testid": "choice-expander-button",
|
|
@@ -60,25 +60,25 @@ var d = ({ label: d, showCheckIcon: f = !1, children: p, expanded: m, defaultExp
|
|
|
60
60
|
"aria-label": v || d,
|
|
61
61
|
disabled: _,
|
|
62
62
|
onClick: N,
|
|
63
|
-
className: e("flex items-center justify-center w-240 mx-auto relative gap-20 transition-opacity duration-200", "rounded-pill focus-visible:ring focus-visible:ring-
|
|
63
|
+
className: e("flex items-center justify-center w-240 mx-auto relative gap-20 transition-opacity duration-200", "rounded-pill focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2 outline-none px-20 py-12 ", _ ? "opacity-50 cursor-not-allowed" : "cursor-pointer", "[@supports(anchor-name:_--label-anchor)]:[--anchorSupport:1]"),
|
|
64
64
|
children: [
|
|
65
|
-
/* @__PURE__ */
|
|
65
|
+
/* @__PURE__ */ c("div", {
|
|
66
66
|
"aria-hidden": "true",
|
|
67
67
|
className: "absolute h-24 w-24 mx-auto pointer-events-none",
|
|
68
68
|
style: { anchorName: "--middle-anchor" }
|
|
69
69
|
}),
|
|
70
|
-
/* @__PURE__ */
|
|
70
|
+
/* @__PURE__ */ l("span", {
|
|
71
71
|
className: "text-b3 flex items-center font-semibold",
|
|
72
72
|
children: [
|
|
73
|
-
/* @__PURE__ */
|
|
73
|
+
/* @__PURE__ */ c("span", {
|
|
74
74
|
className: e("transition-opacity duration-200 pe-8", M && "opacity-0"),
|
|
75
75
|
children: d
|
|
76
76
|
}),
|
|
77
|
-
/* @__PURE__ */
|
|
77
|
+
/* @__PURE__ */ c("div", {
|
|
78
78
|
className: "h-24 w-24",
|
|
79
79
|
style: { anchorName: "--label-anchor" },
|
|
80
80
|
"aria-hidden": "true",
|
|
81
|
-
children: /* @__PURE__ */
|
|
81
|
+
children: /* @__PURE__ */ c(u, {
|
|
82
82
|
name: "ArrowDefaultDown",
|
|
83
83
|
width: "24px",
|
|
84
84
|
"aria-hidden": "true",
|
|
@@ -89,13 +89,13 @@ var d = ({ label: d, showCheckIcon: f = !1, children: p, expanded: m, defaultExp
|
|
|
89
89
|
}
|
|
90
90
|
})
|
|
91
91
|
}),
|
|
92
|
-
/* @__PURE__ */
|
|
92
|
+
/* @__PURE__ */ c("span", {
|
|
93
93
|
className: "sr-only",
|
|
94
94
|
children: M ? x : S
|
|
95
95
|
})
|
|
96
96
|
]
|
|
97
97
|
}),
|
|
98
|
-
/* @__PURE__ */
|
|
98
|
+
/* @__PURE__ */ c(u, {
|
|
99
99
|
name: "ArrowDefaultDown",
|
|
100
100
|
width: "24px",
|
|
101
101
|
"aria-hidden": "true",
|
|
@@ -107,18 +107,18 @@ var d = ({ label: d, showCheckIcon: f = !1, children: p, expanded: m, defaultExp
|
|
|
107
107
|
transition: "left 0.3s, rotate 0.3s"
|
|
108
108
|
}
|
|
109
109
|
}),
|
|
110
|
-
f && /* @__PURE__ */
|
|
110
|
+
f && /* @__PURE__ */ c(u, {
|
|
111
111
|
name: "CheckDefault",
|
|
112
112
|
width: "24px",
|
|
113
113
|
"aria-hidden": "true",
|
|
114
114
|
className: e("transition-opacity duration-200", M && "opacity-0")
|
|
115
115
|
})
|
|
116
116
|
]
|
|
117
|
-
}), /* @__PURE__ */
|
|
117
|
+
}), /* @__PURE__ */ c("div", {
|
|
118
118
|
className: e("grid overflow-hidden transition-[grid-template-rows,opacity] duration-500", M ? "grid-rows-[1fr]" : "grid-rows-[0fr] opacity-0"),
|
|
119
|
-
children: /* @__PURE__ */
|
|
119
|
+
children: /* @__PURE__ */ c("div", {
|
|
120
120
|
className: "overflow-hidden",
|
|
121
|
-
children: /* @__PURE__ */
|
|
121
|
+
children: /* @__PURE__ */ c("div", {
|
|
122
122
|
className: "px-8 pb-8",
|
|
123
123
|
id: D,
|
|
124
124
|
children: p
|
package/ui/ChoiceExpander.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChoiceExpander.js","names":[],"sources":["../../lib/ui/ChoiceExpander.tsx"],"sourcesContent":["'use client';\n\nimport clsx from 'clsx';\nimport {\n type ComponentPropsWithoutRef,\n type FunctionComponent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { Icon } from '@clubmed/trident-icons';\nimport { getBgColor, getTextColor } from './helpers/colors/colors';\nimport type { Colors } from './types/Colors';\n\nexport interface ChoiceExpanderProps extends ComponentPropsWithoutRef<'div'> {\n /**\n * Text shown when collapsed (e.g., \"From $255\")\n */\n label: string;\n\n /**\n * Show check icon in collapsed state (selected variant)\n */\n showCheckIcon?: boolean;\n\n /**\n * Content shown when expanded\n */\n children: ReactNode;\n\n /**\n * Controlled state - if provided, component is controlled\n */\n expanded?: boolean;\n\n /**\n * Initial state for uncontrolled mode\n */\n defaultExpanded?: boolean;\n\n /**\n * Callback when expanded state changes\n */\n onExpandedChange?: (isExpanded: boolean) => void;\n\n /**\n * Disable interaction\n */\n disabled?: boolean;\n\n /**\n * Custom aria-label for button\n */\n ariaLabel?: string;\n\n /**\n * Background color for unexpanded button state\n */\n buttonBgColor?: Colors;\n\n /**\n * Text color for unexpanded button state\n */\n buttonTextColor?: Colors;\n\n /**\n * collapse label for screen readers\n */\n collapseLabel: string;\n\n /**\n * expand label for screen readers\n */\n expandLabel: string;\n}\n\nexport const ChoiceExpander: FunctionComponent<ChoiceExpanderProps> = ({\n label,\n showCheckIcon = false,\n children,\n expanded,\n defaultExpanded = false,\n onExpandedChange,\n disabled = false,\n ariaLabel,\n buttonBgColor = 'black',\n buttonTextColor = 'white',\n collapseLabel,\n expandLabel,\n className,\n ...props\n}) => {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n const contentId = useId();\n const morphContainerRef = useRef<HTMLDivElement>(null);\n const closeButtonRef = useRef<HTMLButtonElement>(null);\n const triggerButtonRef = useRef<HTMLButtonElement>(null);\n const hasInteractedRef = useRef(false);\n\n const isExpanded = expanded !== undefined ? expanded : internalExpanded;\n\n const handleToggle = useCallback(() => {\n if (disabled) return;\n\n hasInteractedRef.current = true;\n const newState = !isExpanded;\n\n if (expanded === undefined) {\n setInternalExpanded(newState);\n }\n\n onExpandedChange?.(newState);\n }, [disabled, isExpanded, expanded, onExpandedChange]);\n\n useEffect(() => {\n if (!isExpanded) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n handleToggle();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isExpanded, handleToggle]);\n\n useEffect(() => {\n if (isExpanded && closeButtonRef.current) {\n closeButtonRef.current.focus();\n } else if (!isExpanded && hasInteractedRef.current && triggerButtonRef.current) {\n triggerButtonRef.current.focus();\n }\n }, [isExpanded]);\n\n useEffect(() => {\n if (!isExpanded) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (morphContainerRef.current && !morphContainerRef.current.contains(event.target as Node)) {\n handleToggle();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isExpanded, handleToggle]);\n\n return (\n <div\n className={clsx('relative flex items-center justify-center', className)}\n data-name=\"ChoiceExpander\"\n data-testid=\"choice-expander\"\n style={{ width: '240px', height: 48 }}\n {...props}\n >\n <div\n ref={morphContainerRef}\n className={clsx(\n 'absolute top-0 grid transition-all duration-500',\n !isExpanded && [\n 'w-240 rounded-pill border-transparent',\n getBgColor(buttonBgColor),\n getTextColor(buttonTextColor),\n ],\n isExpanded && [\n 'w-324 rounded-16 bg-white text-black border border-gray-900',\n 'z-10',\n disabled && 'opacity-50',\n ],\n )}\n >\n <button\n ref={triggerButtonRef}\n type=\"button\"\n data-testid=\"choice-expander-button\"\n aria-expanded={isExpanded}\n aria-controls={contentId}\n aria-label={ariaLabel || label}\n disabled={disabled}\n onClick={handleToggle}\n className={clsx(\n 'flex items-center justify-center w-240 mx-auto relative gap-20 transition-opacity duration-200',\n 'rounded-pill focus-visible:ring focus-visible:ring-8 focus-visible:ring-lavender/20 outline-none px-20 py-12 ',\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n '[@supports(anchor-name:_--label-anchor)]:[--anchorSupport:1]',\n )}\n >\n {/* invisible top middle anchor position */}\n <div\n aria-hidden=\"true\"\n className=\"absolute h-24 w-24 mx-auto pointer-events-none\"\n style={{ anchorName: '--middle-anchor' } as React.CSSProperties}\n ></div>\n <span className=\"text-b3 flex items-center font-semibold\">\n {/* label anchor */}\n <span\n className={clsx('transition-opacity duration-200 pe-8', isExpanded && 'opacity-0')}\n >\n {label}\n </span>\n <div\n className=\"h-24 w-24\"\n style={{ anchorName: '--label-anchor' } as React.CSSProperties}\n aria-hidden=\"true\"\n >\n <Icon\n name=\"ArrowDefaultDown\"\n width=\"24px\"\n aria-hidden=\"true\"\n className={clsx(\n isExpanded ? 'absolute left-[calc(50%-12px)] rotate-180' : 'rotate-[0deg]',\n )}\n style={\n {\n transition: 'rotate 0.3s, left 0.3s',\n opacity: 'calc((1 - var(--anchorSupport)) * 1)',\n } as React.CSSProperties\n }\n />\n </div>\n <span className=\"sr-only\">{isExpanded ? collapseLabel : expandLabel}</span>\n </span>\n <Icon\n name=\"ArrowDefaultDown\"\n width=\"24px\"\n aria-hidden=\"true\"\n className={clsx('absolute', isExpanded ? 'rotate-180' : 'rotate-[0deg]')}\n style={\n {\n positionAnchor: isExpanded ? '--middle-anchor' : '--label-anchor',\n left: 'anchor(left)',\n top: 'anchor(top)',\n transition: 'left 0.3s, rotate 0.3s',\n } as React.CSSProperties\n }\n />\n {showCheckIcon && (\n <Icon\n name=\"CheckDefault\"\n width=\"24px\"\n aria-hidden=\"true\"\n className={clsx('transition-opacity duration-200', isExpanded && 'opacity-0')}\n />\n )}\n </button>\n\n <div\n className={clsx(\n 'grid overflow-hidden transition-[grid-template-rows,opacity] duration-500',\n isExpanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr] opacity-0',\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"px-8 pb-8\" id={contentId}>\n {children}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChoiceExpander.js","names":[],"sources":["../../lib/ui/ChoiceExpander.tsx"],"sourcesContent":["'use client';\n\nimport clsx from 'clsx';\nimport {\n type ComponentPropsWithoutRef,\n type FunctionComponent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { Icon } from '@clubmed/trident-icons';\nimport { getBgColor, getTextColor } from './helpers/colors/colors';\nimport type { Colors } from './types/Colors';\n\nexport interface ChoiceExpanderProps extends ComponentPropsWithoutRef<'div'> {\n /**\n * Text shown when collapsed (e.g., \"From $255\")\n */\n label: string;\n\n /**\n * Show check icon in collapsed state (selected variant)\n */\n showCheckIcon?: boolean;\n\n /**\n * Content shown when expanded\n */\n children: ReactNode;\n\n /**\n * Controlled state - if provided, component is controlled\n */\n expanded?: boolean;\n\n /**\n * Initial state for uncontrolled mode\n */\n defaultExpanded?: boolean;\n\n /**\n * Callback when expanded state changes\n */\n onExpandedChange?: (isExpanded: boolean) => void;\n\n /**\n * Disable interaction\n */\n disabled?: boolean;\n\n /**\n * Custom aria-label for button\n */\n ariaLabel?: string;\n\n /**\n * Background color for unexpanded button state\n */\n buttonBgColor?: Colors;\n\n /**\n * Text color for unexpanded button state\n */\n buttonTextColor?: Colors;\n\n /**\n * collapse label for screen readers\n */\n collapseLabel: string;\n\n /**\n * expand label for screen readers\n */\n expandLabel: string;\n}\n\nexport const ChoiceExpander: FunctionComponent<ChoiceExpanderProps> = ({\n label,\n showCheckIcon = false,\n children,\n expanded,\n defaultExpanded = false,\n onExpandedChange,\n disabled = false,\n ariaLabel,\n buttonBgColor = 'black',\n buttonTextColor = 'white',\n collapseLabel,\n expandLabel,\n className,\n ...props\n}) => {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n const contentId = useId();\n const morphContainerRef = useRef<HTMLDivElement>(null);\n const closeButtonRef = useRef<HTMLButtonElement>(null);\n const triggerButtonRef = useRef<HTMLButtonElement>(null);\n const hasInteractedRef = useRef(false);\n\n const isExpanded = expanded !== undefined ? expanded : internalExpanded;\n\n const handleToggle = useCallback(() => {\n if (disabled) return;\n\n hasInteractedRef.current = true;\n const newState = !isExpanded;\n\n if (expanded === undefined) {\n setInternalExpanded(newState);\n }\n\n onExpandedChange?.(newState);\n }, [disabled, isExpanded, expanded, onExpandedChange]);\n\n useEffect(() => {\n if (!isExpanded) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n handleToggle();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isExpanded, handleToggle]);\n\n useEffect(() => {\n if (isExpanded && closeButtonRef.current) {\n closeButtonRef.current.focus();\n } else if (!isExpanded && hasInteractedRef.current && triggerButtonRef.current) {\n triggerButtonRef.current.focus();\n }\n }, [isExpanded]);\n\n useEffect(() => {\n if (!isExpanded) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (morphContainerRef.current && !morphContainerRef.current.contains(event.target as Node)) {\n handleToggle();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isExpanded, handleToggle]);\n\n return (\n <div\n className={clsx('relative flex items-center justify-center', className)}\n data-name=\"ChoiceExpander\"\n data-testid=\"choice-expander\"\n style={{ width: '240px', height: 48 }}\n {...props}\n >\n <div\n ref={morphContainerRef}\n className={clsx(\n 'absolute top-0 grid transition-all duration-500',\n !isExpanded && [\n 'w-240 rounded-pill-transitionable border-transparent',\n getBgColor(buttonBgColor),\n getTextColor(buttonTextColor),\n ],\n isExpanded && [\n 'w-324 rounded-16 bg-white text-black border border-gray-900',\n 'z-10',\n disabled && 'opacity-50',\n ],\n )}\n >\n <button\n ref={triggerButtonRef}\n type=\"button\"\n data-testid=\"choice-expander-button\"\n aria-expanded={isExpanded}\n aria-controls={contentId}\n aria-label={ariaLabel || label}\n disabled={disabled}\n onClick={handleToggle}\n className={clsx(\n 'flex items-center justify-center w-240 mx-auto relative gap-20 transition-opacity duration-200',\n 'rounded-pill focus-visible:ring-4 focus-visible:ring-black focus-visible:ring-offset-2 outline-none px-20 py-12 ',\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n '[@supports(anchor-name:_--label-anchor)]:[--anchorSupport:1]',\n )}\n >\n {/* invisible top middle anchor position */}\n <div\n aria-hidden=\"true\"\n className=\"absolute h-24 w-24 mx-auto pointer-events-none\"\n style={{ anchorName: '--middle-anchor' } as React.CSSProperties}\n ></div>\n <span className=\"text-b3 flex items-center font-semibold\">\n {/* label anchor */}\n <span\n className={clsx('transition-opacity duration-200 pe-8', isExpanded && 'opacity-0')}\n >\n {label}\n </span>\n <div\n className=\"h-24 w-24\"\n style={{ anchorName: '--label-anchor' } as React.CSSProperties}\n aria-hidden=\"true\"\n >\n <Icon\n name=\"ArrowDefaultDown\"\n width=\"24px\"\n aria-hidden=\"true\"\n className={clsx(\n isExpanded ? 'absolute left-[calc(50%-12px)] rotate-180' : 'rotate-[0deg]',\n )}\n style={\n {\n transition: 'rotate 0.3s, left 0.3s',\n opacity: 'calc((1 - var(--anchorSupport)) * 1)',\n } as React.CSSProperties\n }\n />\n </div>\n <span className=\"sr-only\">{isExpanded ? collapseLabel : expandLabel}</span>\n </span>\n <Icon\n name=\"ArrowDefaultDown\"\n width=\"24px\"\n aria-hidden=\"true\"\n className={clsx('absolute', isExpanded ? 'rotate-180' : 'rotate-[0deg]')}\n style={\n {\n positionAnchor: isExpanded ? '--middle-anchor' : '--label-anchor',\n left: 'anchor(left)',\n top: 'anchor(top)',\n transition: 'left 0.3s, rotate 0.3s',\n } as React.CSSProperties\n }\n />\n {showCheckIcon && (\n <Icon\n name=\"CheckDefault\"\n width=\"24px\"\n aria-hidden=\"true\"\n className={clsx('transition-opacity duration-200', isExpanded && 'opacity-0')}\n />\n )}\n </button>\n\n <div\n className={clsx(\n 'grid overflow-hidden transition-[grid-template-rows,opacity] duration-500',\n isExpanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr] opacity-0',\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"px-8 pb-8\" id={contentId}>\n {children}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ComponentProps } from 'react';
|
|
2
|
+
import { Theme } from './types/Theme';
|
|
3
|
+
export interface CountdownLabels {
|
|
4
|
+
days: string;
|
|
5
|
+
hours: string;
|
|
6
|
+
minutes: string;
|
|
7
|
+
seconds: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CountdownProps extends Omit<ComponentProps<'div'>, 'children'> {
|
|
10
|
+
countdown: {
|
|
11
|
+
labels: CountdownLabels;
|
|
12
|
+
to: string;
|
|
13
|
+
};
|
|
14
|
+
theme?: Theme;
|
|
15
|
+
}
|
|
16
|
+
export declare function Countdown({ className, countdown, theme, ...props }: CountdownProps): import("react/jsx-runtime").JSX.Element;
|
package/ui/Countdown.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { t as e } from "../chunks/clsx.js";
|
|
3
|
+
import { FlipCard as t } from "./FlipCard.js";
|
|
4
|
+
import { useEffect as n, useState as r } from "react";
|
|
5
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
6
|
+
//#region lib/ui/Countdown.tsx
|
|
7
|
+
var o = 1e3, s = o * 60, c = s * 60, l = c * 24, u = (e) => Math.max(Math.floor(e / l), 0), d = (e) => Math.max(Math.floor(e % l / c), 0), f = (e) => Math.max(Math.floor(e % c / s), 0), p = (e) => Math.max(Math.floor(e % s / o), 0);
|
|
8
|
+
function m({ className: n, countdown: r, theme: o = "white", ...s }) {
|
|
9
|
+
let { to: c, labels: l } = r, [u, d, f, p] = h(c), m = [
|
|
10
|
+
[u, l.days],
|
|
11
|
+
[d, l.hours],
|
|
12
|
+
[f, l.minutes],
|
|
13
|
+
[p, l.seconds]
|
|
14
|
+
];
|
|
15
|
+
return /* @__PURE__ */ i("div", {
|
|
16
|
+
"data-name": "Countdown",
|
|
17
|
+
role: "timer",
|
|
18
|
+
...s,
|
|
19
|
+
dir: "ltr",
|
|
20
|
+
className: e("flex gap-x-4", n),
|
|
21
|
+
children: m.map(([e, n], r) => {
|
|
22
|
+
let s = m.slice(0, r).every(([e]) => e === 0), c = e === 0 && s ? "black" : o;
|
|
23
|
+
return /* @__PURE__ */ a("div", {
|
|
24
|
+
className: "space-y-4",
|
|
25
|
+
children: [/* @__PURE__ */ i("div", {
|
|
26
|
+
className: "flex flex-row items-center gap-x-2 px-2",
|
|
27
|
+
children: e.toString().padStart(2, "0").split("").map((e, n) => /* @__PURE__ */ i(t, {
|
|
28
|
+
theme: c,
|
|
29
|
+
value: parseInt(e)
|
|
30
|
+
}, n))
|
|
31
|
+
}), /* @__PURE__ */ i("span", {
|
|
32
|
+
className: "text-b5 block max-w-58 truncate text-center",
|
|
33
|
+
children: n
|
|
34
|
+
})]
|
|
35
|
+
}, n);
|
|
36
|
+
})
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function h(e) {
|
|
40
|
+
let t = new Date(e).getTime(), i = t - Date.now(), [a, o] = r(() => u(i)), [s, c] = r(() => d(i)), [l, m] = r(() => f(i)), [h, g] = r(() => p(i));
|
|
41
|
+
return n(() => {
|
|
42
|
+
let e = setInterval(() => {
|
|
43
|
+
let n = t - Date.now();
|
|
44
|
+
if (n < 0) {
|
|
45
|
+
clearInterval(e);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
o(u(n)), c(d(n)), m(f(n)), g(p(n));
|
|
49
|
+
}, 1e3);
|
|
50
|
+
return () => clearInterval(e);
|
|
51
|
+
}, [t]), [
|
|
52
|
+
a,
|
|
53
|
+
s,
|
|
54
|
+
l,
|
|
55
|
+
h
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { m as Countdown };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=Countdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Countdown.js","names":[],"sources":["../../lib/ui/Countdown.tsx"],"sourcesContent":["'use client';\nimport type { ComponentProps } from 'react';\nimport { useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\nimport { FlipCard } from './FlipCard';\nimport type { Theme } from './types/Theme';\n\nexport interface CountdownLabels {\n days: string;\n hours: string;\n minutes: string;\n seconds: string;\n}\n\nexport interface CountdownProps extends Omit<ComponentProps<'div'>, 'children'> {\n countdown: {\n labels: CountdownLabels;\n to: string;\n };\n theme?: Theme;\n}\n\nconst ONE_SEC = 1000;\nconst ONE_MIN = ONE_SEC * 60;\nconst ONE_HOUR = ONE_MIN * 60;\nconst ONE_DAY = ONE_HOUR * 24;\n\nconst getDay = (distance: number) => Math.max(Math.floor(distance / ONE_DAY), 0);\nconst getHour = (distance: number) => Math.max(Math.floor((distance % ONE_DAY) / ONE_HOUR), 0);\nconst getMinute = (distance: number) => Math.max(Math.floor((distance % ONE_HOUR) / ONE_MIN), 0);\nconst getSecond = (distance: number) => Math.max(Math.floor((distance % ONE_MIN) / ONE_SEC), 0);\n\nexport function Countdown({ className, countdown, theme = 'white', ...props }: CountdownProps) {\n const { to, labels } = countdown;\n const [days, hours, minutes, seconds] = useCountdown(to);\n\n const structure: [number, string][] = [\n [days, labels.days],\n [hours, labels.hours],\n [minutes, labels.minutes],\n [seconds, labels.seconds],\n ];\n\n return (\n <div\n data-name=\"Countdown\"\n role=\"timer\"\n {...props}\n dir=\"ltr\"\n className={clsx('flex gap-x-4', className)}\n >\n {structure.map(([division, label], index) => {\n const areAllPreviousZero = structure.slice(0, index).every(([d]) => d === 0);\n const divisionTheme = division === 0 && areAllPreviousZero ? 'black' : theme;\n\n return (\n <div className=\"space-y-4\" key={label}>\n <div className=\"flex flex-row items-center gap-x-2 px-2\">\n {division\n .toString()\n .padStart(2, '0')\n .split('')\n .map((digit, i) => (\n <FlipCard key={i} theme={divisionTheme} value={parseInt(digit)} />\n ))}\n </div>\n <span className=\"text-b5 block max-w-58 truncate text-center\">{label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction useCountdown(to: string): [number, number, number, number] {\n const toMs = new Date(to).getTime();\n const distance = toMs - Date.now();\n const [days, setDays] = useState(() => getDay(distance));\n const [hours, setHours] = useState(() => getHour(distance));\n const [minutes, setMinutes] = useState(() => getMinute(distance));\n const [seconds, setSeconds] = useState(() => getSecond(distance));\n\n useEffect(() => {\n const interval = setInterval(() => {\n const dist = toMs - Date.now();\n if (dist < 0) {\n clearInterval(interval);\n return;\n }\n setDays(getDay(dist));\n setHours(getHour(dist));\n setMinutes(getMinute(dist));\n setSeconds(getSecond(dist));\n }, 1000);\n\n return () => clearInterval(interval);\n }, [toMs]);\n\n return [days, hours, minutes, seconds];\n}\n"],"mappings":";;;;;;AAuBA,IAAM,IAAU,KACV,IAAU,IAAU,IACpB,IAAW,IAAU,IACrB,IAAU,IAAW,IAErB,KAAU,MAAqB,KAAK,IAAI,KAAK,MAAM,IAAW,EAAQ,EAAE,EAAE,EAC1E,KAAW,MAAqB,KAAK,IAAI,KAAK,MAAO,IAAW,IAAW,EAAS,EAAE,EAAE,EACxF,KAAa,MAAqB,KAAK,IAAI,KAAK,MAAO,IAAW,IAAY,EAAQ,EAAE,EAAE,EAC1F,KAAa,MAAqB,KAAK,IAAI,KAAK,MAAO,IAAW,IAAW,EAAQ,EAAE,EAAE;AAE/F,SAAgB,EAAU,EAAE,cAAW,cAAW,WAAQ,SAAS,GAAG,KAAyB;CAC7F,IAAM,EAAE,OAAI,cAAW,GACjB,CAAC,GAAM,GAAO,GAAS,KAAW,EAAa,EAAG,EAElD,IAAgC;EACpC,CAAC,GAAM,EAAO,KAAK;EACnB,CAAC,GAAO,EAAO,MAAM;EACrB,CAAC,GAAS,EAAO,QAAQ;EACzB,CAAC,GAAS,EAAO,QAAA;EAClB;AAED,QACE,kBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,GAAI;EACJ,KAAI;EACJ,WAAW,EAAK,gBAAgB,EAAU;YAEzC,EAAU,KAAK,CAAC,GAAU,IAAQ,MAAU;GAC3C,IAAM,IAAqB,EAAU,MAAM,GAAG,EAAM,CAAC,OAAO,CAAC,OAAO,MAAM,EAAE,EACtE,IAAgB,MAAa,KAAK,IAAqB,UAAU;AAEvE,UACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eACZ,EACE,UAAU,CACV,SAAS,GAAG,IAAI,CAChB,MAAM,GAAG,CACT,KAAK,GAAO,MACX,kBAAC,GAAD;MAAkB,OAAO;MAAe,OAAO,SAAS,EAAA;MAAU,EAAnD,EAAmD,CAAA;KAElE,CAAA,EACN,kBAAC,QAAD;KAAM,WAAU;eAA+C;KAAa,CAAA,CAAA;MAV9C,EAW1B;;EAGN,CAAA;;AAIV,SAAS,EAAa,GAA8C;CAClE,IAAM,IAAO,IAAI,KAAK,EAAG,CAAC,SAAS,EAC7B,IAAW,IAAO,KAAK,KAAK,EAC5B,CAAC,GAAM,KAAW,QAAe,EAAO,EAAS,CAAC,EAClD,CAAC,GAAO,KAAY,QAAe,EAAQ,EAAS,CAAC,EACrD,CAAC,GAAS,KAAc,QAAe,EAAU,EAAS,CAAC,EAC3D,CAAC,GAAS,KAAc,QAAe,EAAU,EAAS,CAAC;AAkBjE,QAhBA,QAAgB;EACd,IAAM,IAAW,kBAAkB;GACjC,IAAM,IAAO,IAAO,KAAK,KAAK;AAC9B,OAAI,IAAO,GAAG;AACZ,kBAAc,EAAS;AACvB;;AAKF,GAHA,EAAQ,EAAO,EAAK,CAAC,EACrB,EAAS,EAAQ,EAAK,CAAC,EACvB,EAAW,EAAU,EAAK,CAAC,EAC3B,EAAW,EAAU,EAAK,CAAC;KAC1B,IAAK;AAER,eAAa,cAAc,EAAS;IACnC,CAAC,EAAK,CAAC,EAEH;EAAC;EAAM;EAAO;EAAS;EAAQ"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Locale } from 'date-fns';
|
|
2
|
+
import { FunctionComponent } from 'react';
|
|
3
|
+
import { DateRange, Matcher, Modifiers } from 'react-day-picker';
|
|
4
|
+
import { DayDataProps } from './Day';
|
|
5
|
+
export declare const getMonthHeadingId: (date: Date) => string;
|
|
6
|
+
interface Labels {
|
|
7
|
+
seeNextMonth: string;
|
|
8
|
+
seePreviousMonth: string;
|
|
9
|
+
}
|
|
10
|
+
type StatusLabelMap = Partial<Record<'green' | 'orange' | 'outline', string>>;
|
|
11
|
+
type SelectRangeHandler = (selected: DateRange | undefined, triggerDate: Date, modifiers: Modifiers, e: React.MouseEvent | React.KeyboardEvent) => void;
|
|
12
|
+
export interface DatepickerProps {
|
|
13
|
+
dates?: DayDataProps[];
|
|
14
|
+
defaultMonth?: Date;
|
|
15
|
+
disabledDays?: Matcher | Matcher[];
|
|
16
|
+
formatDurationsLabel?: (count: number) => string;
|
|
17
|
+
fromMonth?: Date;
|
|
18
|
+
labels: Labels;
|
|
19
|
+
locale?: Locale;
|
|
20
|
+
maxNumberOfMonths?: number;
|
|
21
|
+
onSelect?: SelectRangeHandler;
|
|
22
|
+
selected?: DateRange;
|
|
23
|
+
statusLabels?: StatusLabelMap;
|
|
24
|
+
}
|
|
25
|
+
export declare const Datepicker: FunctionComponent<DatepickerProps>;
|
|
26
|
+
export {};
|
package/ui/Datepicker.js
ADDED
package/ui/Day.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FunctionComponent, PropsWithChildren } from 'react';
|
|
2
|
+
import { DayButtonProps } from 'react-day-picker';
|
|
3
|
+
export interface DayDataProps {
|
|
4
|
+
/** Date in 'yyyy-MM-dd' format */
|
|
5
|
+
id: string;
|
|
6
|
+
price: string | null;
|
|
7
|
+
status: 'default' | 'green' | 'orange' | 'outline';
|
|
8
|
+
}
|
|
9
|
+
export interface DayProps {
|
|
10
|
+
formatDurationsLabel?: (count: number) => string;
|
|
11
|
+
label?: string;
|
|
12
|
+
price?: string | null;
|
|
13
|
+
status?: DayDataProps['status'];
|
|
14
|
+
}
|
|
15
|
+
interface InternalDayProps {
|
|
16
|
+
dateTime: string;
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
label?: string;
|
|
19
|
+
price?: string | null;
|
|
20
|
+
selected?: boolean;
|
|
21
|
+
status?: DayDataProps['status'];
|
|
22
|
+
}
|
|
23
|
+
export declare const _Day: FunctionComponent<PropsWithChildren<InternalDayProps>>;
|
|
24
|
+
export declare const Day: FunctionComponent<DayProps & DayButtonProps>;
|
|
25
|
+
export {};
|
package/ui/Day.js
ADDED
package/ui/Dropdown.d.ts
CHANGED
|
@@ -1,6 +1,23 @@
|
|
|
1
|
-
import { ComponentPropsWithoutRef,
|
|
1
|
+
import { ComponentPropsWithoutRef, ReactNode } from 'react';
|
|
2
2
|
import { IconicNames } from '@clubmed/trident-icons';
|
|
3
|
-
|
|
3
|
+
interface DropdownRenderContext {
|
|
4
|
+
close: () => void;
|
|
5
|
+
open: boolean;
|
|
6
|
+
toggle: () => void;
|
|
7
|
+
}
|
|
8
|
+
type DropdownChildren = ReactNode | ((context: DropdownRenderContext) => ReactNode);
|
|
9
|
+
export interface DropdownProps extends Omit<ComponentPropsWithoutRef<'button'>, 'children'> {
|
|
10
|
+
children?: DropdownChildren;
|
|
4
11
|
icon?: IconicNames;
|
|
5
12
|
}
|
|
6
|
-
export declare function
|
|
13
|
+
export declare function useDropdown(initialChildren?: DropdownChildren): {
|
|
14
|
+
children: ReactNode[];
|
|
15
|
+
close: () => void;
|
|
16
|
+
containerRef: import('react').RefObject<HTMLDivElement | null>;
|
|
17
|
+
isLeaving: boolean;
|
|
18
|
+
label: ReactNode[];
|
|
19
|
+
open: boolean;
|
|
20
|
+
toggle: () => void;
|
|
21
|
+
};
|
|
22
|
+
export declare function Dropdown({ icon, className, children: initialChildren, ...attrs }: DropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export {};
|
package/ui/Dropdown.js
CHANGED
|
@@ -2,46 +2,80 @@ import { t as e } from "../chunks/clsx.js";
|
|
|
2
2
|
import { twMerge as t } from "./helpers/twMerge.js";
|
|
3
3
|
import { useSlots as n } from "./hooks/useSlots.js";
|
|
4
4
|
import { useCallback as r, useEffect as i, useRef as a, useState as o } from "react";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
6
|
+
import { Icon as l } from "@clubmed/trident-icons";
|
|
7
7
|
//#region lib/ui/Dropdown.tsx
|
|
8
|
-
function u(
|
|
9
|
-
let
|
|
10
|
-
|
|
11
|
-
let
|
|
12
|
-
|
|
13
|
-
}, [])
|
|
8
|
+
function u(e) {
|
|
9
|
+
let [t, s] = o(!1), c = a(null), l = a(t), u = l.current, d = !t && u;
|
|
10
|
+
l.current = t;
|
|
11
|
+
let f = r(() => {
|
|
12
|
+
s((e) => !e);
|
|
13
|
+
}, []), p = r(() => {
|
|
14
|
+
s(!1);
|
|
15
|
+
}, []), m = typeof e == "function" ? e({
|
|
16
|
+
close: p,
|
|
17
|
+
open: t,
|
|
18
|
+
toggle: f
|
|
19
|
+
}) : e, { label: h, children: g } = n(m, ["label"]);
|
|
14
20
|
return i(() => {
|
|
15
|
-
if (!
|
|
21
|
+
if (!c.current) return;
|
|
22
|
+
let e = c.current.querySelectorAll(".dropdown-panel a[href], .dropdown-panel [data-dropdown-item]"), t = Array.from(e, (e) => {
|
|
23
|
+
let t = () => {
|
|
24
|
+
p();
|
|
25
|
+
};
|
|
26
|
+
return e.addEventListener("click", t), {
|
|
27
|
+
handleItemClick: t,
|
|
28
|
+
item: e
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
return () => {
|
|
32
|
+
t.forEach(({ handleItemClick: e, item: t }) => {
|
|
33
|
+
t.removeEventListener("click", e);
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
}, [p, m]), i(() => {
|
|
37
|
+
if (!t) return;
|
|
16
38
|
let e = (e) => {
|
|
17
|
-
!
|
|
39
|
+
!c.current || e.composedPath().includes(c.current) || p();
|
|
18
40
|
};
|
|
19
|
-
return document.addEventListener("
|
|
20
|
-
document.removeEventListener("
|
|
41
|
+
return document.addEventListener("click", e), () => {
|
|
42
|
+
document.removeEventListener("click", e);
|
|
21
43
|
};
|
|
22
|
-
}, [
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
44
|
+
}, [p, t]), {
|
|
45
|
+
children: g,
|
|
46
|
+
close: p,
|
|
47
|
+
containerRef: c,
|
|
48
|
+
isLeaving: d,
|
|
49
|
+
label: h,
|
|
50
|
+
open: t,
|
|
51
|
+
toggle: f
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function d({ icon: n = "ArrowOutlinedDown", className: r, children: i, ...a }) {
|
|
55
|
+
let { children: o, containerRef: d, isLeaving: f, label: p, open: m, toggle: h } = u(i);
|
|
56
|
+
return /* @__PURE__ */ c("div", {
|
|
57
|
+
ref: d,
|
|
58
|
+
className: t("flex items-center gap-8 relative", r),
|
|
59
|
+
children: [/* @__PURE__ */ c("button", {
|
|
26
60
|
tabIndex: -1,
|
|
27
|
-
...
|
|
61
|
+
...a,
|
|
28
62
|
className: "flex gap-8 items-center relative",
|
|
29
|
-
onClick:
|
|
30
|
-
children: [
|
|
31
|
-
name:
|
|
63
|
+
onClick: h,
|
|
64
|
+
children: [p, /* @__PURE__ */ s(l, {
|
|
65
|
+
name: n,
|
|
32
66
|
className: "w-30"
|
|
33
67
|
})]
|
|
34
|
-
}), /* @__PURE__ */
|
|
35
|
-
className: t(e("z-5 flex items-center gap-12 bg-white rounded-16 border-1 border-lightGrey absolute top-[calc(100%+8px)] right-0 text-black p-20 min-w-[120px] origin-center will-change[transform,opacity]", {
|
|
36
|
-
"animate-
|
|
37
|
-
"animate-
|
|
38
|
-
"opacity-0 scale-90 pointer-events-none": !
|
|
68
|
+
}), /* @__PURE__ */ s("div", {
|
|
69
|
+
className: t(e("dropdown-panel z-5 flex items-center gap-12 bg-white rounded-16 border-1 border-lightGrey absolute top-[calc(100%+8px)] right-0 text-black p-20 min-w-[120px] origin-center will-change[transform,opacity]", {
|
|
70
|
+
"animate-zoom-in": m,
|
|
71
|
+
"animate-zoom-out": !m && f,
|
|
72
|
+
"opacity-0 scale-90 pointer-events-none": !m && !f
|
|
39
73
|
})),
|
|
40
|
-
children:
|
|
74
|
+
children: o
|
|
41
75
|
})]
|
|
42
76
|
});
|
|
43
77
|
}
|
|
44
78
|
//#endregion
|
|
45
|
-
export {
|
|
79
|
+
export { d as Dropdown, u as useDropdown };
|
|
46
80
|
|
|
47
81
|
//# sourceMappingURL=Dropdown.js.map
|