@lifesg/react-design-system 4.0.0-alpha.5 → 4.0.0-alpha.6
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/accordion/types.d.ts +1 -1
- package/breadcrumb/breadcrumb.d.ts +7 -0
- package/breadcrumb/breadcrumb.js.map +1 -1
- package/breadcrumb/types.d.ts +31 -0
- package/button/button.d.ts +1 -0
- package/button/button.js.map +1 -1
- package/button/types.d.ts +42 -9
- package/calendar/calendar.d.ts +3 -0
- package/calendar/calendar.js.map +1 -1
- package/calendar/types.d.ts +43 -7
- package/card/card.d.ts +1 -0
- package/card/card.js.map +1 -1
- package/card/types.d.ts +1 -0
- package/checkbox/checkbox.d.ts +3 -0
- package/checkbox/checkbox.js.map +1 -1
- package/checkbox/types.d.ts +19 -3
- package/cjs/breadcrumb/breadcrumb.js.map +1 -1
- package/cjs/button/button.js.map +1 -1
- package/cjs/calendar/calendar.js.map +1 -1
- package/cjs/card/card.js.map +1 -1
- package/cjs/checkbox/checkbox.js.map +1 -1
- package/cjs/data-table/data-table.js +1 -1
- package/cjs/data-table/data-table.js.map +1 -1
- package/cjs/data-table/data-table.styles.js +1 -1
- package/cjs/data-table/data-table.styles.js.map +1 -1
- package/cjs/data-table/data-table.styles_rxganh.css +27 -0
- package/cjs/external/dompurify/dist/purify.es.js +2 -2
- package/cjs/external/dompurify/dist/purify.es.js.map +1 -1
- package/cjs/external/lodash/_setCacheHas.js.map +1 -1
- package/cjs/external/lodash/lodash.js +1 -1
- package/cjs/external/lodash/lodash.js.map +1 -1
- package/cjs/form/form-label-addon.js +1 -1
- package/cjs/form/form-label-addon.js.map +1 -1
- package/cjs/form/index.js +1 -1
- package/cjs/form/index.js.map +1 -1
- package/cjs/fullscreen-image-carousel/fullscreen-image-carousel.js +1 -1
- package/cjs/fullscreen-image-carousel/fullscreen-image-carousel.js.map +1 -1
- package/cjs/histogram-slider/histogram-slider.js.map +1 -1
- package/cjs/image-button/image-button.js.map +1 -1
- package/cjs/index.js +1 -1
- package/cjs/input/input.js.map +1 -1
- package/cjs/input-group/input-group.js.map +1 -1
- package/cjs/input-multi-select/input-multi-select.js.map +1 -1
- package/cjs/input-nested-multi-select/input-nested-multi-select.js.map +1 -1
- package/cjs/input-nested-select/input-nested-select.js.map +1 -1
- package/cjs/input-range-select/input-range-select.js.map +1 -1
- package/cjs/input-range-slider/input-range-slider.js.map +1 -1
- package/cjs/input-select/input-select.js.map +1 -1
- package/cjs/input-slider/input-slider.js.map +1 -1
- package/cjs/input-textarea/textarea.js.map +1 -1
- package/cjs/language-switcher/language-switcher.js.map +1 -1
- package/cjs/layout/index.js +1 -1
- package/cjs/layout/index.js.map +1 -1
- package/cjs/link-list/link-list.js.map +1 -1
- package/cjs/local-nav/local-nav-dropdown/local-nav-dropdown.js.map +1 -1
- package/cjs/local-nav/local-nav-menu/local-nav-menu.js.map +1 -1
- package/cjs/markup/markup.js.map +1 -1
- package/cjs/masked-input/masked-input.js.map +1 -1
- package/cjs/masthead/masthead.js.map +1 -1
- package/cjs/menu/menu.js +1 -1
- package/cjs/menu/menu.js.map +1 -1
- package/cjs/modal/index.js.map +1 -1
- package/cjs/modal/modal-box.js +1 -1
- package/cjs/modal/modal-box.js.map +1 -1
- package/cjs/modal-v2/index.js +1 -1
- package/cjs/modal-v2/index.js.map +1 -1
- package/cjs/modal-v2/modal-v2.js +1 -1
- package/cjs/modal-v2/modal-v2.js.map +1 -1
- package/cjs/modal-v2/slots/card.js +1 -1
- package/cjs/modal-v2/slots/card.js.map +1 -1
- package/cjs/navbar/navbar.js.map +1 -1
- package/cjs/notification-banner/notification-banner-hoc.js.map +1 -1
- package/cjs/notification-banner/notification-banner.js.map +1 -1
- package/cjs/otp-input/otp-input.js.map +1 -1
- package/cjs/otp-verification/otp-verification.js.map +1 -1
- package/cjs/overlay/overlay.js.map +1 -1
- package/cjs/pagination/pagination.js.map +1 -1
- package/cjs/phone-number-input/phone-number-input.js.map +1 -1
- package/cjs/pill/pill.js.map +1 -1
- package/cjs/popover/popover-inline/popover-inline.js.map +1 -1
- package/cjs/popover/popover-trigger.js.map +1 -1
- package/cjs/popover/popover.js +1 -1
- package/cjs/popover/popover.js.map +1 -1
- package/cjs/predictive-text-input/predictive-text-input.js.map +1 -1
- package/cjs/progress-indicator/progress-indicator.js.map +1 -1
- package/cjs/radio-button/radio-button.js.map +1 -1
- package/cjs/schedule/schedule.js.map +1 -1
- package/cjs/schedule/shared/with-optional-popover.js +1 -1
- package/cjs/schedule/shared/with-optional-popover.js.map +1 -1
- package/cjs/select-histogram/select-histogram.js.map +1 -1
- package/cjs/sidenav/sidenav.js.map +1 -1
- package/cjs/singpass-button/singpass-button.js.map +1 -1
- package/cjs/smart-app-banner/smart-app-banner.js.map +1 -1
- package/cjs/tab/tab.js.map +1 -1
- package/cjs/table/table.js.map +1 -1
- package/cjs/table/table.styles.js +1 -1
- package/cjs/table/table.styles.js.map +1 -1
- package/{table/table.styles_1af5ipv.css → cjs/table/table.styles_1vjx31g.css} +1 -1
- package/cjs/tag/tag.js.map +1 -1
- package/cjs/text-list/index.js.map +1 -1
- package/cjs/theme/theme-provider/breakpoint.js +1 -1
- package/cjs/theme/theme-provider/breakpoint.js.map +1 -1
- package/cjs/theme/theme-provider/hooks.js.map +1 -1
- package/cjs/theme/theme-provider/index.js.map +1 -1
- package/cjs/theme/tokens/border.js.map +1 -1
- package/cjs/theme/tokens/breakpoint.js.map +1 -1
- package/cjs/theme/tokens/colour.js.map +1 -1
- package/cjs/theme/tokens/component.js.map +1 -1
- package/cjs/theme/tokens/font.js.map +1 -1
- package/cjs/theme/tokens/media-query.js.map +1 -1
- package/cjs/theme/tokens/motion.js.map +1 -1
- package/cjs/theme/tokens/radius.js.map +1 -1
- package/cjs/theme/tokens/shadow.js.map +1 -1
- package/cjs/theme/tokens/spacing.js.map +1 -1
- package/cjs/theme/types.js.map +1 -1
- package/cjs/theme/utils/css-variable.js.map +1 -1
- package/cjs/theme/utils/font.js.map +1 -1
- package/cjs/theme/utils/use-apply-styles.js +1 -1
- package/cjs/theme/utils/use-apply-styles.js.map +1 -1
- package/cjs/theme/utils/use-design-token-override.js.map +1 -1
- package/cjs/theme/utils/use-design-token.js.map +1 -1
- package/cjs/theme/utils/use-media-query.js.map +1 -1
- package/cjs/time-range-picker/combobox-picker/combobox-picker.js +1 -1
- package/cjs/time-range-picker/combobox-picker/combobox-picker.js.map +1 -1
- package/cjs/time-range-picker/common.styles.js +1 -1
- package/cjs/time-range-picker/common.styles.js.map +1 -1
- package/{time-range-picker/common.styles_1qwp4xa.css → cjs/time-range-picker/common.styles_cnkkax.css} +2 -1
- package/cjs/time-range-picker/dial-picker/dial-picker.js +1 -1
- package/cjs/time-range-picker/dial-picker/dial-picker.js.map +1 -1
- package/cjs/time-range-picker/time-range-picker.js.map +1 -1
- package/cjs/time-slot-bar/time-slot-bar.js.map +1 -1
- package/cjs/time-slot-bar-week/time-slot-bar-week.js.map +1 -1
- package/cjs/time-slot-week-view/time-slot-week-view.js.map +1 -1
- package/cjs/timeline/timeline.js.map +1 -1
- package/cjs/timepicker/timepicker.js +1 -1
- package/cjs/timepicker/timepicker.js.map +1 -1
- package/cjs/timepicker/timepicker.styles.js +1 -1
- package/cjs/timepicker/timepicker.styles.js.map +1 -1
- package/cjs/timepicker/timepicker.styles_lyizvq.css +2 -0
- package/cjs/timetable/timetable-row/with-optional-popover.js +1 -1
- package/cjs/timetable/timetable-row/with-optional-popover.js.map +1 -1
- package/cjs/timetable/timetable.js +1 -1
- package/cjs/timetable/timetable.js.map +1 -1
- package/cjs/toast/toast.js.map +1 -1
- package/cjs/toggle/toggle.js.map +1 -1
- package/cjs/typography/index.js.map +1 -1
- package/cjs/uneditable-section/index.js.map +1 -1
- package/cjs/unit-number/unit-number-input.js.map +1 -1
- package/cjs/util/merge-refs.js.map +1 -1
- package/cjs/util/use-throttle.js +2 -0
- package/cjs/util/use-throttle.js.map +1 -0
- package/countdown-timer/types.d.ts +3 -3
- package/data-table/data-table.js +1 -1
- package/data-table/data-table.js.map +1 -1
- package/data-table/data-table.styles.d.ts +2 -1
- package/data-table/data-table.styles.js +1 -1
- package/data-table/data-table.styles.js.map +1 -1
- package/data-table/data-table.styles_rxganh.css +27 -0
- package/date-range-input/types.d.ts +1 -1
- package/drawer/types.d.ts +1 -1
- package/e-signature/types.d.ts +1 -1
- package/external/dompurify/dist/purify.es.js +2 -2
- package/external/dompurify/dist/purify.es.js.map +1 -1
- package/external/lodash/_setCacheHas.js.map +1 -1
- package/external/lodash/lodash.js +1 -1
- package/external/lodash/lodash.js.map +1 -1
- package/file-upload/types.d.ts +0 -1
- package/filter/types.d.ts +6 -10
- package/form/form-label-addon.js +1 -1
- package/form/form-label-addon.js.map +1 -1
- package/form/index.d.ts +65 -8
- package/form/index.js +1 -1
- package/form/index.js.map +1 -1
- package/form/types.d.ts +155 -6
- package/fullscreen-image-carousel/fullscreen-image-carousel.d.ts +7 -0
- package/fullscreen-image-carousel/fullscreen-image-carousel.js +1 -1
- package/fullscreen-image-carousel/fullscreen-image-carousel.js.map +1 -1
- package/fullscreen-image-carousel/types.d.ts +91 -3
- package/histogram-slider/histogram-slider.d.ts +6 -0
- package/histogram-slider/histogram-slider.js.map +1 -1
- package/histogram-slider/types.d.ts +63 -3
- package/image-button/image-button.d.ts +6 -0
- package/image-button/image-button.js.map +1 -1
- package/image-button/types.d.ts +11 -1
- package/index.js +1 -1
- package/input/input.d.ts +6 -0
- package/input/input.js.map +1 -1
- package/input/types.d.ts +38 -2
- package/input-group/input-group.d.ts +7 -0
- package/input-group/input-group.js.map +1 -1
- package/input-group/types.d.ts +84 -8
- package/input-multi-select/input-multi-select.d.ts +6 -0
- package/input-multi-select/input-multi-select.js.map +1 -1
- package/input-multi-select/types.d.ts +46 -5
- package/input-nested-multi-select/input-nested-multi-select.d.ts +8 -0
- package/input-nested-multi-select/input-nested-multi-select.js.map +1 -1
- package/input-nested-multi-select/types.d.ts +35 -5
- package/input-nested-select/input-nested-select.d.ts +9 -2
- package/input-nested-select/input-nested-select.js.map +1 -1
- package/input-nested-select/types.d.ts +77 -8
- package/input-range-select/input-range-select.d.ts +6 -0
- package/input-range-select/input-range-select.js.map +1 -1
- package/input-range-select/types.d.ts +68 -1
- package/input-range-slider/input-range-slider.d.ts +7 -0
- package/input-range-slider/input-range-slider.js.map +1 -1
- package/input-range-slider/types.d.ts +91 -6
- package/input-select/input-select.d.ts +5 -0
- package/input-select/input-select.js.map +1 -1
- package/input-select/types.d.ts +70 -14
- package/input-slider/input-slider.d.ts +6 -0
- package/input-slider/input-slider.js.map +1 -1
- package/input-slider/types.d.ts +21 -2
- package/input-textarea/textarea.d.ts +3 -0
- package/input-textarea/textarea.js.map +1 -1
- package/input-textarea/types.d.ts +24 -1
- package/language-switcher/language-switcher.d.ts +6 -0
- package/language-switcher/language-switcher.js.map +1 -1
- package/language-switcher/types.d.ts +23 -0
- package/layout/index.d.ts +16 -2
- package/layout/index.js +1 -1
- package/layout/index.js.map +1 -1
- package/layout/types.d.ts +61 -3
- package/link-list/internal-types.d.ts +57 -3
- package/link-list/link-list.d.ts +6 -0
- package/link-list/link-list.js.map +1 -1
- package/link-list/types.d.ts +3 -0
- package/local-nav/local-nav-dropdown/local-nav-dropdown.d.ts +11 -0
- package/local-nav/local-nav-dropdown/local-nav-dropdown.js.map +1 -1
- package/local-nav/local-nav-menu/local-nav-menu.d.ts +6 -0
- package/local-nav/local-nav-menu/local-nav-menu.js.map +1 -1
- package/local-nav/types.d.ts +51 -0
- package/markup/markup.d.ts +6 -0
- package/markup/markup.js.map +1 -1
- package/markup/types.d.ts +6 -2
- package/masked-input/masked-input.d.ts +6 -0
- package/masked-input/masked-input.js.map +1 -1
- package/masked-input/types.d.ts +83 -8
- package/masthead/masthead.d.ts +6 -0
- package/masthead/masthead.js.map +1 -1
- package/masthead/types.d.ts +9 -0
- package/menu/menu.d.ts +27 -4
- package/menu/menu.js +1 -1
- package/menu/menu.js.map +1 -1
- package/menu/types.d.ts +32 -0
- package/modal/index.d.ts +13 -0
- package/modal/index.js.map +1 -1
- package/modal/modal-box.js +1 -1
- package/modal/modal-box.js.map +1 -1
- package/modal/types.d.ts +54 -7
- package/modal-v2/index.d.ts +1 -15
- package/modal-v2/index.js +1 -1
- package/modal-v2/index.js.map +1 -1
- package/modal-v2/modal-v2.d.ts +32 -1
- package/modal-v2/modal-v2.js +1 -1
- package/modal-v2/modal-v2.js.map +1 -1
- package/modal-v2/slots/card.js +1 -1
- package/modal-v2/slots/card.js.map +1 -1
- package/modal-v2/types.d.ts +75 -8
- package/navbar/navbar.d.ts +7 -0
- package/navbar/navbar.js.map +1 -1
- package/navbar/types.d.ts +200 -13
- package/notification-banner/notification-banner-hoc.d.ts +6 -0
- package/notification-banner/notification-banner-hoc.js.map +1 -1
- package/notification-banner/notification-banner.d.ts +7 -0
- package/notification-banner/notification-banner.js.map +1 -1
- package/notification-banner/types.d.ts +57 -2
- package/otp-input/otp-input.d.ts +7 -0
- package/otp-input/otp-input.js.map +1 -1
- package/otp-input/types.d.ts +54 -11
- package/otp-verification/internal-types.d.ts +22 -5
- package/otp-verification/otp-verification.d.ts +6 -0
- package/otp-verification/otp-verification.js.map +1 -1
- package/otp-verification/types.d.ts +125 -6
- package/overlay/overlay.d.ts +7 -0
- package/overlay/overlay.js.map +1 -1
- package/overlay/types.d.ts +57 -2
- package/package.json +1 -1
- package/pagination/pagination.d.ts +5 -0
- package/pagination/pagination.js.map +1 -1
- package/pagination/types.d.ts +48 -0
- package/phone-number-input/phone-number-input.d.ts +7 -0
- package/phone-number-input/phone-number-input.js.map +1 -1
- package/phone-number-input/types.d.ts +78 -13
- package/pill/pill.d.ts +6 -0
- package/pill/pill.js.map +1 -1
- package/pill/types.d.ts +19 -0
- package/popover/popover-inline/popover-inline.d.ts +5 -0
- package/popover/popover-inline/popover-inline.js.map +1 -1
- package/popover/popover-trigger.d.ts +6 -0
- package/popover/popover-trigger.js.map +1 -1
- package/popover/popover.d.ts +6 -0
- package/popover/popover.js +1 -1
- package/popover/popover.js.map +1 -1
- package/popover/types.d.ts +150 -3
- package/predictive-text-input/predictive-text-input.d.ts +6 -0
- package/predictive-text-input/predictive-text-input.js.map +1 -1
- package/predictive-text-input/types.d.ts +65 -11
- package/progress-indicator/progress-indicator.d.ts +7 -0
- package/progress-indicator/progress-indicator.js.map +1 -1
- package/progress-indicator/types.d.ts +18 -0
- package/radio-button/radio-button.d.ts +5 -0
- package/radio-button/radio-button.js.map +1 -1
- package/radio-button/types.d.ts +11 -0
- package/schedule/internal-types.d.ts +18 -0
- package/schedule/schedule-day-view/types.d.ts +2 -1
- package/schedule/schedule-week-view/types.d.ts +2 -1
- package/schedule/schedule.d.ts +3 -0
- package/schedule/schedule.js.map +1 -1
- package/schedule/shared/with-optional-popover.js +1 -1
- package/schedule/shared/with-optional-popover.js.map +1 -1
- package/schedule/types.d.ts +129 -10
- package/select-histogram/select-histogram.d.ts +5 -0
- package/select-histogram/select-histogram.js.map +1 -1
- package/select-histogram/types.d.ts +57 -4
- package/shared/dropdown-list/types.d.ts +52 -19
- package/shared/dropdown-wrapper/types.d.ts +6 -0
- package/sidenav/sidenav.d.ts +10 -0
- package/sidenav/sidenav.js.map +1 -1
- package/sidenav/types.d.ts +70 -21
- package/singpass-button/singpass-button.d.ts +6 -0
- package/singpass-button/singpass-button.js.map +1 -1
- package/singpass-button/types.d.ts +29 -2
- package/smart-app-banner/smart-app-banner.d.ts +5 -0
- package/smart-app-banner/smart-app-banner.js.map +1 -1
- package/smart-app-banner/types.d.ts +54 -0
- package/tab/tab.d.ts +7 -0
- package/tab/tab.js.map +1 -1
- package/tab/types.d.ts +55 -6
- package/table/table.d.ts +21 -0
- package/table/table.js.map +1 -1
- package/table/table.styles.js +1 -1
- package/table/table.styles.js.map +1 -1
- package/{cjs/table/table.styles_1af5ipv.css → table/table.styles_1vjx31g.css} +1 -1
- package/tag/tag.d.ts +5 -0
- package/tag/tag.js.map +1 -1
- package/tag/types.d.ts +24 -0
- package/text-list/index.d.ts +17 -0
- package/text-list/index.js.map +1 -1
- package/text-list/types.d.ts +33 -4
- package/theme/theme-provider/breakpoint.d.ts +0 -1
- package/theme/theme-provider/breakpoint.js +1 -1
- package/theme/theme-provider/breakpoint.js.map +1 -1
- package/theme/theme-provider/hooks.d.ts +16 -0
- package/theme/theme-provider/hooks.js.map +1 -1
- package/theme/theme-provider/index.d.ts +7 -0
- package/theme/theme-provider/index.js.map +1 -1
- package/theme/theme-provider/types.d.ts +14 -0
- package/theme/tokens/border.d.ts +3 -0
- package/theme/tokens/border.js.map +1 -1
- package/theme/tokens/breakpoint.d.ts +3 -0
- package/theme/tokens/breakpoint.js.map +1 -1
- package/theme/tokens/colour.d.ts +3 -0
- package/theme/tokens/colour.js.map +1 -1
- package/theme/tokens/component.d.ts +1 -0
- package/theme/tokens/component.js.map +1 -1
- package/theme/tokens/font.d.ts +2 -0
- package/theme/tokens/font.js.map +1 -1
- package/theme/tokens/media-query.d.ts +1 -0
- package/theme/tokens/media-query.js.map +1 -1
- package/theme/tokens/motion.d.ts +1 -0
- package/theme/tokens/motion.js.map +1 -1
- package/theme/tokens/radius.d.ts +1 -0
- package/theme/tokens/radius.js.map +1 -1
- package/theme/tokens/shadow.d.ts +1 -0
- package/theme/tokens/shadow.js.map +1 -1
- package/theme/tokens/spacing.d.ts +1 -0
- package/theme/tokens/spacing.js.map +1 -1
- package/theme/types.d.ts +23 -3
- package/theme/types.js.map +1 -1
- package/theme/utils/css-variable.d.ts +10 -2
- package/theme/utils/css-variable.js.map +1 -1
- package/theme/utils/font.d.ts +2 -1
- package/theme/utils/font.js.map +1 -1
- package/theme/utils/use-apply-styles.d.ts +8 -2
- package/theme/utils/use-apply-styles.js +1 -1
- package/theme/utils/use-apply-styles.js.map +1 -1
- package/theme/utils/use-design-token-override.d.ts +9 -1
- package/theme/utils/use-design-token-override.js.map +1 -1
- package/theme/utils/use-design-token.d.ts +9 -0
- package/theme/utils/use-design-token.js.map +1 -1
- package/theme/utils/use-media-query.d.ts +41 -3
- package/theme/utils/use-media-query.js.map +1 -1
- package/time-range-picker/combobox-picker/combobox-picker.js +1 -1
- package/time-range-picker/combobox-picker/combobox-picker.js.map +1 -1
- package/time-range-picker/common.styles.d.ts +1 -0
- package/time-range-picker/common.styles.js +1 -1
- package/time-range-picker/common.styles.js.map +1 -1
- package/{cjs/time-range-picker/common.styles_1qwp4xa.css → time-range-picker/common.styles_cnkkax.css} +2 -1
- package/time-range-picker/dial-picker/dial-picker.js +1 -1
- package/time-range-picker/dial-picker/dial-picker.js.map +1 -1
- package/time-range-picker/time-range-picker.d.ts +5 -0
- package/time-range-picker/time-range-picker.js.map +1 -1
- package/time-range-picker/types.d.ts +85 -25
- package/time-slot-bar/internal-types.d.ts +1 -0
- package/time-slot-bar/time-slot-bar.d.ts +7 -0
- package/time-slot-bar/time-slot-bar.js.map +1 -1
- package/time-slot-bar/types.d.ts +112 -20
- package/time-slot-bar-week/time-slot-bar-week.d.ts +8 -0
- package/time-slot-bar-week/time-slot-bar-week.js.map +1 -1
- package/time-slot-bar-week/types.d.ts +74 -13
- package/time-slot-week-view/time-slot-week-view.d.ts +7 -0
- package/time-slot-week-view/time-slot-week-view.js.map +1 -1
- package/time-slot-week-view/types.d.ts +53 -10
- package/timeline/timeline.d.ts +6 -0
- package/timeline/timeline.js.map +1 -1
- package/timeline/types.d.ts +58 -4
- package/timepicker/timepicker.d.ts +5 -0
- package/timepicker/timepicker.js +1 -1
- package/timepicker/timepicker.js.map +1 -1
- package/timepicker/timepicker.styles.d.ts +1 -0
- package/timepicker/timepicker.styles.js +1 -1
- package/timepicker/timepicker.styles.js.map +1 -1
- package/timepicker/timepicker.styles_lyizvq.css +2 -0
- package/timepicker/types.d.ts +49 -14
- package/timetable/timetable-row/with-optional-popover.js +1 -1
- package/timetable/timetable-row/with-optional-popover.js.map +1 -1
- package/timetable/timetable.d.ts +6 -0
- package/timetable/timetable.js +1 -1
- package/timetable/timetable.js.map +1 -1
- package/timetable/types.d.ts +175 -50
- package/toast/toast.d.ts +6 -0
- package/toast/toast.js.map +1 -1
- package/toast/types.d.ts +42 -8
- package/toggle/toggle.d.ts +6 -0
- package/toggle/toggle.js.map +1 -1
- package/toggle/types.d.ts +95 -17
- package/typography/index.d.ts +29 -0
- package/typography/index.js.map +1 -1
- package/typography/types.d.ts +51 -8
- package/uneditable-section/index.d.ts +15 -0
- package/uneditable-section/index.js.map +1 -1
- package/uneditable-section/types.d.ts +66 -23
- package/unit-number/types.d.ts +30 -4
- package/unit-number/unit-number-input.d.ts +6 -0
- package/unit-number/unit-number-input.js.map +1 -1
- package/util/index.d.ts +1 -0
- package/util/merge-refs.d.ts +1 -1
- package/util/merge-refs.js.map +1 -1
- package/util/use-throttle.d.ts +1 -0
- package/util/use-throttle.js +2 -0
- package/util/use-throttle.js.map +1 -0
- package/cjs/data-table/data-table.styles_1iqq1g7.css +0 -26
- package/cjs/timepicker/timepicker.styles_1jm33yw.css +0 -1
- package/data-table/data-table.styles_1iqq1g7.css +0 -26
- package/timepicker/timepicker.styles_1jm33yw.css +0 -1
|
@@ -1,14 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How overflowing option text is truncated.
|
|
3
|
+
*
|
|
4
|
+
* - `"middle"` trims the centre of the text.
|
|
5
|
+
* - `"end"` trims from the right.
|
|
6
|
+
*/
|
|
1
7
|
export type TruncateType = "middle" | "end";
|
|
8
|
+
/**
|
|
9
|
+
* Async load state for dropdown items.
|
|
10
|
+
*
|
|
11
|
+
* - `"loading"` while fetching.
|
|
12
|
+
* - `"fail"` on error (shows a call-to-action to retry).
|
|
13
|
+
* - `"success"` when ready.
|
|
14
|
+
*/
|
|
2
15
|
export type ItemsLoadStateType = "loading" | "fail" | "success";
|
|
16
|
+
/** Controls whether secondary labels render inline or on a new line. */
|
|
3
17
|
export type LabelDisplayType = "inline" | "next-line";
|
|
18
|
+
/**
|
|
19
|
+
* Visual size variant for the dropdown.
|
|
20
|
+
*
|
|
21
|
+
* - `"default"` renders standard height.
|
|
22
|
+
* - `"small"` renders reduced height.
|
|
23
|
+
*/
|
|
4
24
|
export type DropdownVariantType = "small" | "default";
|
|
25
|
+
/** Runtime context passed to a custom `renderListItem` callback. */
|
|
5
26
|
export interface ListItemRenderArgs {
|
|
6
27
|
selected: boolean;
|
|
7
28
|
}
|
|
29
|
+
/** Display model for a list item with an optional secondary label. */
|
|
8
30
|
export interface ListItemDisplayProps {
|
|
9
31
|
title: string;
|
|
10
32
|
secondaryLabel?: string | undefined;
|
|
11
33
|
}
|
|
34
|
+
/** Overrides for built-in text labels rendered inside a dropdown. */
|
|
12
35
|
export interface DropdownCustomLabelProps {
|
|
13
36
|
searchPlaceholder?: string | undefined;
|
|
14
37
|
noResultsLabel?: string | undefined;
|
|
@@ -18,48 +41,49 @@ export interface DropdownCustomLabelProps {
|
|
|
18
41
|
allSelectedLabel?: string | undefined;
|
|
19
42
|
multiSelectedLabel?: string | undefined;
|
|
20
43
|
}
|
|
44
|
+
/** Props controlling how dropdown items are displayed and rendered. */
|
|
21
45
|
export interface DropdownDisplayProps<T, V> {
|
|
22
|
-
/**
|
|
46
|
+
/** Extracts the comparable value from an option item. */
|
|
23
47
|
valueExtractor?: ((item: T) => V) | undefined;
|
|
24
|
-
/**
|
|
48
|
+
/** Extracts the display text for a list item. */
|
|
25
49
|
listExtractor?: ((item: T) => string | ListItemDisplayProps) | undefined;
|
|
26
|
-
/**
|
|
50
|
+
/** Renders a fully custom element for each list item. */
|
|
27
51
|
renderListItem?: ((item: T, args: ListItemRenderArgs) => JSX.Element) | undefined;
|
|
28
52
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* @param
|
|
32
|
-
* @
|
|
53
|
+
* Renders a custom call-to-action at the bottom of the dropdown list.
|
|
54
|
+
*
|
|
55
|
+
* @param hideOptions Callback to programmatically close the dropdown.
|
|
56
|
+
* @param options The currently displayed list items.
|
|
33
57
|
*/
|
|
34
58
|
renderCustomCallToAction?: ((hideOptions: () => void, options: T[]) => JSX.Element) | undefined;
|
|
35
59
|
}
|
|
60
|
+
/** Props controlling the search functionality within a dropdown. */
|
|
36
61
|
export interface DropdownSearchProps<T> {
|
|
37
|
-
/**
|
|
62
|
+
/** Renders a search bar inside the dropdown when `true`. */
|
|
38
63
|
enableSearch?: boolean | undefined;
|
|
39
|
-
/**
|
|
64
|
+
/** Suppresses the built-in "no results" message when `true`. */
|
|
40
65
|
hideNoResultsDisplay?: boolean | undefined;
|
|
41
|
-
/** @deprecated
|
|
66
|
+
/** @deprecated Use `noResultsDescription` inside `customLabels`. */
|
|
42
67
|
noResultsDescription?: React.ReactNode | undefined;
|
|
43
|
-
/** @deprecated
|
|
68
|
+
/** @deprecated Use `searchPlaceholder` inside `customLabels`. */
|
|
44
69
|
searchPlaceholder?: string | undefined;
|
|
45
|
-
/** Custom function
|
|
70
|
+
/** Custom filter function invoked on each keystroke in the search input. */
|
|
46
71
|
searchFunction?: ((searchValue: string) => T[]) | undefined;
|
|
72
|
+
/** Called when the user types in the search input. */
|
|
47
73
|
onSearch?: (() => void) | undefined;
|
|
48
74
|
}
|
|
75
|
+
/** Internal configuration props for the dropdown list behaviour. */
|
|
49
76
|
export interface DropdownConfigProps {
|
|
50
77
|
multiSelect?: boolean | undefined;
|
|
51
78
|
maxSelectable?: number | undefined;
|
|
52
79
|
customLabels?: DropdownCustomLabelProps | undefined;
|
|
53
|
-
/**
|
|
54
|
-
* Used when items are loaded from an api call.
|
|
55
|
-
* Values: "loading" | "fail" | "success"
|
|
56
|
-
*/
|
|
80
|
+
/** Async load state driving the loading spinner, error retry, or list render. */
|
|
57
81
|
itemsLoadState?: ItemsLoadStateType | undefined;
|
|
58
|
-
/**
|
|
82
|
+
/** How overflowing item text is truncated. */
|
|
59
83
|
itemTruncationType?: TruncateType | undefined;
|
|
60
|
-
/**
|
|
84
|
+
/** Maximum visible lines before the label is truncated (applies to `"end"` truncation). */
|
|
61
85
|
itemMaxLines?: number | undefined;
|
|
62
|
-
/**
|
|
86
|
+
/** Visual size variant for the dropdown items. */
|
|
63
87
|
variant?: DropdownVariantType | undefined;
|
|
64
88
|
}
|
|
65
89
|
export interface DropdownListProps<T, V> extends DropdownDisplayProps<T, V>, DropdownSearchProps<T>, DropdownConfigProps {
|
|
@@ -86,19 +110,27 @@ export interface DropdownListApi {
|
|
|
86
110
|
preferSelected?: boolean;
|
|
87
111
|
}) => void;
|
|
88
112
|
}
|
|
113
|
+
/** A leaf node in a nested dropdown tree (has no children). */
|
|
89
114
|
export interface NestedDropdownListLeafItem<T> {
|
|
90
115
|
key: string;
|
|
91
116
|
label: string;
|
|
92
117
|
value: T;
|
|
93
118
|
subItems?: never | undefined;
|
|
94
119
|
}
|
|
120
|
+
/** A parent node in a nested dropdown tree (has child `subItems`). */
|
|
95
121
|
export interface NestedDropdownListParentItem<T> {
|
|
96
122
|
key: string;
|
|
97
123
|
label: string;
|
|
98
124
|
value: T;
|
|
99
125
|
subItems: NestedDropdownListItemProps<T>[];
|
|
100
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* A single node in a nested dropdown tree.
|
|
129
|
+
*
|
|
130
|
+
* Presence of `subItems` discriminates parent nodes from leaf nodes.
|
|
131
|
+
*/
|
|
101
132
|
export type NestedDropdownListItemProps<T> = NestedDropdownListLeafItem<T> | NestedDropdownListParentItem<T>;
|
|
133
|
+
/** Internal enriched representation of a nested dropdown item with computed tree state. */
|
|
102
134
|
export interface NestedDropdownListLocalItem<T> {
|
|
103
135
|
item: NestedDropdownListItemProps<T>;
|
|
104
136
|
index: number;
|
|
@@ -117,6 +149,7 @@ export interface NestedDropdownListLocalItem<T> {
|
|
|
117
149
|
matched: boolean;
|
|
118
150
|
hasMatchedSubItems: boolean;
|
|
119
151
|
}
|
|
152
|
+
/** Initial expand/collapse state for nested dropdown items when the list opens. */
|
|
120
153
|
export type ExpandMode = "default" | "expand" | "collapse";
|
|
121
154
|
export interface NestedDropdownListProps<T> extends DropdownSearchProps<NestedDropdownListItemProps<T>>, DropdownConfigProps {
|
|
122
155
|
listItems: NestedDropdownListItemProps<T>[];
|
|
@@ -19,4 +19,10 @@ export interface LabelContainerProps {
|
|
|
19
19
|
disabled?: boolean | undefined;
|
|
20
20
|
children: React.ReactNode;
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Horizontal alignment of the dropdown relative to its trigger.
|
|
24
|
+
*
|
|
25
|
+
* - `"left"` left-aligns the dropdown with the trigger.
|
|
26
|
+
* - `"right"` right-aligns the dropdown with the trigger.
|
|
27
|
+
*/
|
|
22
28
|
export type DropdownAlignmentType = "left" | "right";
|
package/sidenav/sidenav.d.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import type { SidenavProps } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* A fixed sidebar navigation component for multi-level page navigation.
|
|
4
|
+
*
|
|
5
|
+
* Use `Sidenav` to present a persistent icon-based navigation rail with
|
|
6
|
+
* optional menu drawers.
|
|
7
|
+
*/
|
|
2
8
|
export declare const Sidenav: (({ fixed, children, "aria-label": ariaLabel, className, ...otherProps }: SidenavProps) => import("react/jsx-runtime").JSX.Element) & {
|
|
9
|
+
/** Renders a group of navigation items, optionally separated by a divider. */
|
|
3
10
|
Group: ({ separator, children, className, ...otherProps }: import("./types").SidenavGroupProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
/** Renders a single icon-and-label navigation entry that can open a menu drawer. */
|
|
4
12
|
Item: ({ children, icon, title, onClick, selected, className, ...otherProps }: import("./types").SidenavItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
/** Renders a menu item inside an item's drawer, with optional collapsible sub-items. */
|
|
5
14
|
DrawerItem: ({ id, title, onClick, children, className, ...otherProps }: import("./types").SidenavDrawerItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
/** Renders a leaf-level navigation entry inside a `Sidenav.DrawerItem`. */
|
|
6
16
|
DrawerSubitem: ({ id, title, onClick, className, ...otherProps }: import("./types").SidenavDrawerSubitemProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
17
|
};
|
package/sidenav/sidenav.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidenav.js","sources":["../../src/sidenav/sidenav.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useRef, useState } from \"react\";\n\nimport { useId } from \"../util\";\nimport * as styles from \"./sidenav.styles\";\nimport type { SidenavContextItem } from \"./sidenav-context\";\nimport { SidenavContext } from \"./sidenav-context\";\nimport { SidenavDrawerItem } from \"./sidenav-drawer-item\";\nimport { SidenavDrawerSubitem } from \"./sidenav-drawer-subitem\";\nimport { SidenavGroup } from \"./sidenav-group\";\nimport { SidenavItem } from \"./sidenav-item\";\nimport type { SidenavProps } from \"./types\";\n\nconst SidenavBase = ({\n fixed = true,\n children,\n \"aria-label\": ariaLabel = \"Sidebar\",\n className,\n ...otherProps\n}: SidenavProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const wrapperRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const internalId = useId();\n\n const [currentItem, setCurrentItem] = useState<\n SidenavContextItem | undefined\n >(undefined);\n const [selectedItem, setSelectedItem] = useState<\n SidenavContextItem | undefined\n >(undefined);\n const [previouslySelectedItemId, setPreviouslySelectedItemId] = useState<\n string | undefined\n >(undefined);\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n return (\n <SidenavContext.Provider\n value={{\n internalId,\n menuRef,\n currentItem,\n selectedItem,\n previouslySelectedItemId,\n setCurrentItem,\n setSelectedItem,\n setPreviouslySelectedItemId,\n }}\n >\n <div\n ref={wrapperRef}\n {...otherProps}\n className={clsx(\n styles.wrapper,\n fixed && styles.wrapperFixed,\n className\n )}\n >\n <nav\n ref={menuRef}\n aria-label={ariaLabel}\n className={clsx(\n styles.containerBase,\n styles.desktopContainer\n )}\n >\n {children}\n </nav>\n {/** NOTE: Since mobile view not supported yet, children will not be rendered */}\n <nav\n className={clsx(\n styles.containerBase,\n styles.mobileContainer\n )}\n ></nav>\n </div>\n </SidenavContext.Provider>\n );\n};\n\nexport const Sidenav = Object.assign(SidenavBase, {\n Group: SidenavGroup,\n Item: SidenavItem,\n DrawerItem: SidenavDrawerItem,\n DrawerSubitem: SidenavDrawerSubitem,\n});\n"],"names":["Sidenav","Object","assign","_a","fixed","children","ariaLabel","className","otherProps","__rest","wrapperRef","useRef","menuRef","internalId","useId","currentItem","setCurrentItem","useState","undefined","selectedItem","setSelectedItem","previouslySelectedItemId","setPreviouslySelectedItemId","_jsx","SidenavContext","Provider","value","_jsxs","ref","clsx","styles.wrapper","styles.wrapperFixed","styles.containerBase","styles.desktopContainer","styles.mobileContainer","Group","SidenavGroup","Item","SidenavItem","DrawerItem","SidenavDrawerItem","DrawerSubitem","SidenavDrawerSubitem"],"mappings":"6vBAaA,
|
|
1
|
+
{"version":3,"file":"sidenav.js","sources":["../../src/sidenav/sidenav.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { useRef, useState } from \"react\";\n\nimport { useId } from \"../util\";\nimport * as styles from \"./sidenav.styles\";\nimport type { SidenavContextItem } from \"./sidenav-context\";\nimport { SidenavContext } from \"./sidenav-context\";\nimport { SidenavDrawerItem } from \"./sidenav-drawer-item\";\nimport { SidenavDrawerSubitem } from \"./sidenav-drawer-subitem\";\nimport { SidenavGroup } from \"./sidenav-group\";\nimport { SidenavItem } from \"./sidenav-item\";\nimport type { SidenavProps } from \"./types\";\n\nconst SidenavBase = ({\n fixed = true,\n children,\n \"aria-label\": ariaLabel = \"Sidebar\",\n className,\n ...otherProps\n}: SidenavProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const wrapperRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const internalId = useId();\n\n const [currentItem, setCurrentItem] = useState<\n SidenavContextItem | undefined\n >(undefined);\n const [selectedItem, setSelectedItem] = useState<\n SidenavContextItem | undefined\n >(undefined);\n const [previouslySelectedItemId, setPreviouslySelectedItemId] = useState<\n string | undefined\n >(undefined);\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n return (\n <SidenavContext.Provider\n value={{\n internalId,\n menuRef,\n currentItem,\n selectedItem,\n previouslySelectedItemId,\n setCurrentItem,\n setSelectedItem,\n setPreviouslySelectedItemId,\n }}\n >\n <div\n ref={wrapperRef}\n {...otherProps}\n className={clsx(\n styles.wrapper,\n fixed && styles.wrapperFixed,\n className\n )}\n >\n <nav\n ref={menuRef}\n aria-label={ariaLabel}\n className={clsx(\n styles.containerBase,\n styles.desktopContainer\n )}\n >\n {children}\n </nav>\n {/** NOTE: Since mobile view not supported yet, children will not be rendered */}\n <nav\n className={clsx(\n styles.containerBase,\n styles.mobileContainer\n )}\n ></nav>\n </div>\n </SidenavContext.Provider>\n );\n};\n\n/**\n * A fixed sidebar navigation component for multi-level page navigation.\n *\n * Use `Sidenav` to present a persistent icon-based navigation rail with\n * optional menu drawers.\n */\nexport const Sidenav = Object.assign(SidenavBase, {\n /** Renders a group of navigation items, optionally separated by a divider. */\n Group: SidenavGroup,\n /** Renders a single icon-and-label navigation entry that can open a menu drawer. */\n Item: SidenavItem,\n /** Renders a menu item inside an item's drawer, with optional collapsible sub-items. */\n DrawerItem: SidenavDrawerItem,\n /** Renders a leaf-level navigation entry inside a `Sidenav.DrawerItem`. */\n DrawerSubitem: SidenavDrawerSubitem,\n});\n"],"names":["Sidenav","Object","assign","_a","fixed","children","ariaLabel","className","otherProps","__rest","wrapperRef","useRef","menuRef","internalId","useId","currentItem","setCurrentItem","useState","undefined","selectedItem","setSelectedItem","previouslySelectedItemId","setPreviouslySelectedItemId","_jsx","SidenavContext","Provider","value","_jsxs","ref","clsx","styles.wrapper","styles.wrapperFixed","styles.containerBase","styles.desktopContainer","styles.mobileContainer","Group","SidenavGroup","Item","SidenavItem","DrawerItem","SidenavDrawerItem","DrawerSubitem","SidenavDrawerSubitem"],"mappings":"6vBAaA,MA6EaA,EAAUC,OAAOC,QA7ETC,IAAA,IAAAC,MACjBA,GAAQ,EAAIC,SACZA,EACA,aAAcC,EAAY,UAASC,UACnCA,GAASJ,EACNK,EAAUC,EAAAN,EALI,+CAUjB,MAAMO,EAAaC,EAAuB,MACpCC,EAAUD,EAAuB,MACjCE,EAAaC,KAEZC,EAAaC,GAAkBC,OAEpCC,IACKC,EAAcC,GAAmBH,OAEtCC,IACKG,EAA0BC,GAA+BL,OAE9DC,GAKF,OACIK,EAACC,EAAeC,SAAQ,CACpBC,MAAO,CACHb,aACAD,UACAG,cACAI,eACAE,2BACAL,iBACAI,kBACAE,+BACHjB,SAEDsB,EAAA,MAAA1B,OAAAC,OAAA,CACI0B,IAAKlB,GACDF,EAAU,CACdD,UAAWsB,EACPC,EACA1B,GAAS2B,EACTxB,GACHF,SAAA,CAEDkB,EAAA,MAAA,CACIK,IAAKhB,EAAO,aACAN,EACZC,UAAWsB,EACPG,EACAC,GACH5B,SAEAA,IAGLkB,EAAA,MAAA,CACIhB,UAAWsB,EACPG,EACAE,UAIU,GAUgB,CAE9CC,MAAOC,EAEPC,KAAMC,EAENC,WAAYC,EAEZC,cAAeC"}
|
package/sidenav/types.d.ts
CHANGED
|
@@ -3,59 +3,108 @@ interface SidenavBaseProps {
|
|
|
3
3
|
"data-testid"?: string | undefined;
|
|
4
4
|
className?: string | undefined;
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* Props for the `Sidenav` component.
|
|
8
|
+
*/
|
|
6
9
|
export interface SidenavProps extends SidenavBaseProps {
|
|
7
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* Pins the sidebar to the left edge of the viewport while the page scrolls.
|
|
12
|
+
*
|
|
13
|
+
* @default true
|
|
14
|
+
*/
|
|
8
15
|
fixed?: boolean | undefined;
|
|
9
16
|
/**
|
|
10
|
-
*
|
|
11
|
-
* ...
|
|
12
|
-
* </Sidenav.Group>
|
|
17
|
+
* Navigation groups and items. Accepts `Sidenav.Group` elements.
|
|
13
18
|
*/
|
|
14
19
|
children: React.ReactNode;
|
|
15
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* Accessible label announced for the sidebar navigation landmark.
|
|
22
|
+
*
|
|
23
|
+
* @default "Sidebar"
|
|
24
|
+
*/
|
|
16
25
|
"aria-label"?: string | undefined;
|
|
17
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Props for the `Sidenav.Group` sub-component.
|
|
29
|
+
*/
|
|
18
30
|
export interface SidenavGroupProps extends SidenavBaseProps {
|
|
19
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* Renders a horizontal divider after the last item in the group.
|
|
33
|
+
*/
|
|
20
34
|
separator?: boolean | undefined;
|
|
21
35
|
/**
|
|
22
|
-
*
|
|
23
|
-
* ...
|
|
24
|
-
* </Sidenav.Item>
|
|
36
|
+
* Navigation items within the group. Accepts `Sidenav.Item` elements.
|
|
25
37
|
*/
|
|
26
38
|
children: React.ReactNode;
|
|
27
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Accessible label for this navigation group.
|
|
41
|
+
*/
|
|
28
42
|
"aria-label"?: string | undefined;
|
|
29
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Props for the `Sidenav.Item` sub-component.
|
|
46
|
+
*/
|
|
30
47
|
export interface SidenavItemProps extends SidenavBaseProps {
|
|
48
|
+
/**
|
|
49
|
+
* Label displayed below the icon.
|
|
50
|
+
*/
|
|
31
51
|
title: string;
|
|
32
|
-
/**
|
|
52
|
+
/**
|
|
53
|
+
* Icon displayed above the title.
|
|
54
|
+
*/
|
|
33
55
|
icon: React.ReactNode;
|
|
34
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* Sets the item as initially selected on mount.
|
|
58
|
+
*/
|
|
35
59
|
selected?: boolean | undefined;
|
|
36
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Called when the item is activated and it has no drawer children. When
|
|
62
|
+
* `children` are provided, clicking opens the drawer without invoking this
|
|
63
|
+
* callback.
|
|
64
|
+
*
|
|
65
|
+
* @param id The item's resolved `id` value.
|
|
66
|
+
*/
|
|
37
67
|
onClick?: ((id: string | undefined) => void) | undefined;
|
|
38
68
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* </Sidenav.DrawerItem>
|
|
69
|
+
* Drawer content displayed to the right of the sidebar when the item is
|
|
70
|
+
* active. Accepts `Sidenav.DrawerItem` elements.
|
|
42
71
|
*/
|
|
43
72
|
children?: React.ReactNode | undefined;
|
|
44
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Props for the `Sidenav.DrawerItem` sub-component.
|
|
76
|
+
*/
|
|
45
77
|
export interface SidenavDrawerItemProps extends SidenavBaseProps {
|
|
78
|
+
/**
|
|
79
|
+
* The displayed label.
|
|
80
|
+
*/
|
|
46
81
|
title: string;
|
|
47
82
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
83
|
+
* Sub-level entries for this section. Accepts `Sidenav.DrawerSubitem`
|
|
84
|
+
* elements. When provided, clicking toggles the collapsed/expanded state
|
|
85
|
+
* instead of invoking `onClick`.
|
|
51
86
|
*/
|
|
52
87
|
children?: React.ReactNode | undefined;
|
|
53
|
-
/**
|
|
88
|
+
/**
|
|
89
|
+
* Called when the item is activated and it has no sub-item children.
|
|
90
|
+
*
|
|
91
|
+
* @param id The item's `id` value.
|
|
92
|
+
*/
|
|
54
93
|
onClick?: ((id: string | undefined) => void) | undefined;
|
|
55
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Props for the `Sidenav.DrawerSubitem` sub-component.
|
|
97
|
+
*/
|
|
56
98
|
export interface SidenavDrawerSubitemProps extends SidenavBaseProps {
|
|
99
|
+
/**
|
|
100
|
+
* The displayed label.
|
|
101
|
+
*/
|
|
57
102
|
title: string;
|
|
58
|
-
/**
|
|
103
|
+
/**
|
|
104
|
+
* Called when the sub-item is activated.
|
|
105
|
+
*
|
|
106
|
+
* @param id The sub-item's `id` value.
|
|
107
|
+
*/
|
|
59
108
|
onClick?: ((id: string | undefined) => void) | undefined;
|
|
60
109
|
}
|
|
61
110
|
export {};
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import type { SingpassButtonProps } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Call-to-action for Singpass authentication,
|
|
4
|
+
* following the brand [guidelines](https://docs.developer.singpass.gov.sg/docs/products/login/singpass-button-guidelines-for-developers-and-designers).
|
|
5
|
+
*
|
|
6
|
+
* Use `SingpassButton` to let users log in with their Singpass account.
|
|
7
|
+
*/
|
|
2
8
|
export declare const SingpassButton: ((props: SingpassButtonProps & import("react").RefAttributes<HTMLButtonElement>) => React.ReactElement | null) & {
|
|
3
9
|
/** @deprecated Use the `sizeType` prop instead: `<SingpassButton>` or `<SingpassButton sizeType="default">` */
|
|
4
10
|
Default: (props: SingpassButtonProps & import("react").RefAttributes<HTMLButtonElement>) => React.ReactElement | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singpass-button.js","sources":["../../src/singpass-button/singpass-button.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { forwardRef } from \"react\";\n\nimport { getSpLogo } from \"./singpass-assets\";\nimport * as styles from \"./singpass-button.styles\";\nimport type {\n SingpassButtonProps,\n SingpassButtonRef,\n SingpassButtonSizeType,\n SingpassButtonStyleType,\n} from \"./types\";\n\nconst styleClassMap: Record<SingpassButtonStyleType, string> = {\n \"red-filled\": styles.mainStyleRedFilled,\n \"white-filled\": styles.mainStyleWhiteFilled,\n};\n\nconst sizeClassMap: Record<SingpassButtonSizeType, string> = {\n small: styles.mainSizeSmall,\n large: styles.mainSizeLarge,\n default: \"\",\n};\n\nconst Component = (props: SingpassButtonProps, ref: SingpassButtonRef) => {\n const {\n styleType = \"white-filled\",\n sizeType = \"default\",\n className,\n \"data-testid\": testId = \"singpass-button\",\n ...otherProps\n } = props;\n\n return (\n <button\n ref={ref}\n data-testid={testId}\n {...otherProps}\n aria-label=\"Log in with Singpass\"\n className={clsx(\n styles.main,\n sizeClassMap[sizeType],\n styleClassMap[styleType],\n className\n )}\n >\n <span\n className={clsx(\n styles.svgContainer,\n sizeType === \"large\" && styles.svgContainerSizeLarge\n )}\n >\n <img src={getSpLogo(styleType)} alt=\"\" />\n </span>\n </button>\n );\n};\n\nconst BaseSingpassButton = forwardRef(Component);\n\nconst DefaultSingpassButtonComponent = (\n props: SingpassButtonProps,\n ref: SingpassButtonRef\n) => (\n <BaseSingpassButton\n {...props}\n sizeType={props.sizeType ?? \"default\"}\n ref={ref}\n />\n);\nDefaultSingpassButtonComponent.displayName = \"SingpassButton.Default\";\n\nconst SmallSingpassButtonComponent = (\n props: SingpassButtonProps,\n ref: SingpassButtonRef\n) => <BaseSingpassButton {...props} sizeType=\"small\" ref={ref} />;\nSmallSingpassButtonComponent.displayName = \"SingpassButton.Small\";\n\nconst LargeSingpassButtonComponent = (\n props: SingpassButtonProps,\n ref: SingpassButtonRef\n) => <BaseSingpassButton {...props} sizeType=\"large\" ref={ref} />;\nLargeSingpassButtonComponent.displayName = \"SingpassButton.Large\";\n\nexport const SingpassButton = Object.assign(BaseSingpassButton, {\n /** @deprecated Use the `sizeType` prop instead: `<SingpassButton>` or `<SingpassButton sizeType=\"default\">` */\n Default: forwardRef(DefaultSingpassButtonComponent),\n /** @deprecated Use the `sizeType` prop instead: `<SingpassButton sizeType=\"small\">` */\n Small: forwardRef(SmallSingpassButtonComponent),\n /** @deprecated Use the `sizeType` prop instead: `<SingpassButton sizeType=\"large\">` */\n Large: forwardRef(LargeSingpassButtonComponent),\n});\n"],"names":["styleClassMap","styles.mainStyleRedFilled","styles.mainStyleWhiteFilled","sizeClassMap","small","styles.mainSizeSmall","large","styles.mainSizeLarge","default","BaseSingpassButton","forwardRef","props","ref","styleType","sizeType","className","testId","otherProps","__rest","_jsx","Object","assign","clsx","styles.main","children","styles.svgContainer","styles.svgContainerSizeLarge","src","getSpLogo","alt","DefaultSingpassButtonComponent","_a","displayName","SmallSingpassButtonComponent","LargeSingpassButtonComponent","SingpassButton","Default","Small","Large"],"mappings":"uXAYA,MAAMA,EAAyD,CAC3D,aAAcC,EACd,eAAgBC,GAGdC,EAAuD,CACzDC,MAAOC,EACPC,MAAOC,EACPC,QAAS,IAqCPC,EAAqBC,GAlCT,CAACC,EAA4BC,KAC3C,MAAMC,UACFA,EAAY,eAAcC,SAC1BA,EAAW,UAASC,UACpBA,EACA,cAAeC,EAAS,mBAExBL,EADGM,EAAUC,EACbP,EANE,CAAA,YAAA,WAAA,YAAA,gBAQN,OACIQ,EAAA,SAAAC,OAAAC,OAAA,CACIT,IAAKA,EAAG,cACKI,GACTC,EAAU,CAAA,aACH,uBACXF,UAAWO,EACPC,EACApB,EAAaW,GACbd,EAAca,GACdE,GACHS,SAEDL,EAAA,OAAA,CACIJ,UAAWO,EACPG,EACa,UAAbX,GAAwBY,GAC3BF,SAEDL,EAAA,MAAA,CAAKQ,IAAKC,EAAUf,GAAYgB,IAAI,SAEnC,IAMXC,EAAiC,CACnCnB,EACAC,WACC,OACDO,EAACV,EAAkBW,OAAAC,OAAA,CAAA,EACXV,EAAK,CACTG,SAAwB,QAAdiB,EAAApB,EAAMG,gBAAQ,IAAAiB,EAAAA,EAAI,UAC5BnB,IAAKA,IACP,EAENkB,EAA+BE,YAAc,yBAE7C,MAAMC,EAA+B,CACjCtB,EACAC,IACCO,EAACV,mBAAuBE,EAAK,CAAEG,SAAS,QAAQF,IAAKA,KAC1DqB,EAA6BD,YAAc,uBAE3C,MAAME,EAA+B,CACjCvB,EACAC,IACCO,EAACV,mBAAuBE,EAAK,CAAEG,SAAS,QAAQF,IAAKA,KAC1DsB,EAA6BF,YAAc,
|
|
1
|
+
{"version":3,"file":"singpass-button.js","sources":["../../src/singpass-button/singpass-button.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { forwardRef } from \"react\";\n\nimport { getSpLogo } from \"./singpass-assets\";\nimport * as styles from \"./singpass-button.styles\";\nimport type {\n SingpassButtonProps,\n SingpassButtonRef,\n SingpassButtonSizeType,\n SingpassButtonStyleType,\n} from \"./types\";\n\nconst styleClassMap: Record<SingpassButtonStyleType, string> = {\n \"red-filled\": styles.mainStyleRedFilled,\n \"white-filled\": styles.mainStyleWhiteFilled,\n};\n\nconst sizeClassMap: Record<SingpassButtonSizeType, string> = {\n small: styles.mainSizeSmall,\n large: styles.mainSizeLarge,\n default: \"\",\n};\n\nconst Component = (props: SingpassButtonProps, ref: SingpassButtonRef) => {\n const {\n styleType = \"white-filled\",\n sizeType = \"default\",\n className,\n \"data-testid\": testId = \"singpass-button\",\n ...otherProps\n } = props;\n\n return (\n <button\n ref={ref}\n data-testid={testId}\n {...otherProps}\n aria-label=\"Log in with Singpass\"\n className={clsx(\n styles.main,\n sizeClassMap[sizeType],\n styleClassMap[styleType],\n className\n )}\n >\n <span\n className={clsx(\n styles.svgContainer,\n sizeType === \"large\" && styles.svgContainerSizeLarge\n )}\n >\n <img src={getSpLogo(styleType)} alt=\"\" />\n </span>\n </button>\n );\n};\n\nconst BaseSingpassButton = forwardRef(Component);\n\nconst DefaultSingpassButtonComponent = (\n props: SingpassButtonProps,\n ref: SingpassButtonRef\n) => (\n <BaseSingpassButton\n {...props}\n sizeType={props.sizeType ?? \"default\"}\n ref={ref}\n />\n);\nDefaultSingpassButtonComponent.displayName = \"SingpassButton.Default\";\n\nconst SmallSingpassButtonComponent = (\n props: SingpassButtonProps,\n ref: SingpassButtonRef\n) => <BaseSingpassButton {...props} sizeType=\"small\" ref={ref} />;\nSmallSingpassButtonComponent.displayName = \"SingpassButton.Small\";\n\nconst LargeSingpassButtonComponent = (\n props: SingpassButtonProps,\n ref: SingpassButtonRef\n) => <BaseSingpassButton {...props} sizeType=\"large\" ref={ref} />;\nLargeSingpassButtonComponent.displayName = \"SingpassButton.Large\";\n\n/**\n * Call-to-action for Singpass authentication,\n * following the brand [guidelines](https://docs.developer.singpass.gov.sg/docs/products/login/singpass-button-guidelines-for-developers-and-designers).\n *\n * Use `SingpassButton` to let users log in with their Singpass account.\n */\nexport const SingpassButton = Object.assign(BaseSingpassButton, {\n /** @deprecated Use the `sizeType` prop instead: `<SingpassButton>` or `<SingpassButton sizeType=\"default\">` */\n Default: forwardRef(DefaultSingpassButtonComponent),\n /** @deprecated Use the `sizeType` prop instead: `<SingpassButton sizeType=\"small\">` */\n Small: forwardRef(SmallSingpassButtonComponent),\n /** @deprecated Use the `sizeType` prop instead: `<SingpassButton sizeType=\"large\">` */\n Large: forwardRef(LargeSingpassButtonComponent),\n});\n"],"names":["styleClassMap","styles.mainStyleRedFilled","styles.mainStyleWhiteFilled","sizeClassMap","small","styles.mainSizeSmall","large","styles.mainSizeLarge","default","BaseSingpassButton","forwardRef","props","ref","styleType","sizeType","className","testId","otherProps","__rest","_jsx","Object","assign","clsx","styles.main","children","styles.svgContainer","styles.svgContainerSizeLarge","src","getSpLogo","alt","DefaultSingpassButtonComponent","_a","displayName","SmallSingpassButtonComponent","LargeSingpassButtonComponent","SingpassButton","Default","Small","Large"],"mappings":"uXAYA,MAAMA,EAAyD,CAC3D,aAAcC,EACd,eAAgBC,GAGdC,EAAuD,CACzDC,MAAOC,EACPC,MAAOC,EACPC,QAAS,IAqCPC,EAAqBC,GAlCT,CAACC,EAA4BC,KAC3C,MAAMC,UACFA,EAAY,eAAcC,SAC1BA,EAAW,UAASC,UACpBA,EACA,cAAeC,EAAS,mBAExBL,EADGM,EAAUC,EACbP,EANE,CAAA,YAAA,WAAA,YAAA,gBAQN,OACIQ,EAAA,SAAAC,OAAAC,OAAA,CACIT,IAAKA,EAAG,cACKI,GACTC,EAAU,CAAA,aACH,uBACXF,UAAWO,EACPC,EACApB,EAAaW,GACbd,EAAca,GACdE,GACHS,SAEDL,EAAA,OAAA,CACIJ,UAAWO,EACPG,EACa,UAAbX,GAAwBY,GAC3BF,SAEDL,EAAA,MAAA,CAAKQ,IAAKC,EAAUf,GAAYgB,IAAI,SAEnC,IAMXC,EAAiC,CACnCnB,EACAC,WACC,OACDO,EAACV,EAAkBW,OAAAC,OAAA,CAAA,EACXV,EAAK,CACTG,SAAwB,QAAdiB,EAAApB,EAAMG,gBAAQ,IAAAiB,EAAAA,EAAI,UAC5BnB,IAAKA,IACP,EAENkB,EAA+BE,YAAc,yBAE7C,MAAMC,EAA+B,CACjCtB,EACAC,IACCO,EAACV,mBAAuBE,EAAK,CAAEG,SAAS,QAAQF,IAAKA,KAC1DqB,EAA6BD,YAAc,uBAE3C,MAAME,EAA+B,CACjCvB,EACAC,IACCO,EAACV,mBAAuBE,EAAK,CAAEG,SAAS,QAAQF,IAAKA,KAC1DsB,EAA6BF,YAAc,6BAQ9BG,EAAiBf,OAAOC,OAAOZ,EAAoB,CAE5D2B,QAAS1B,EAAWoB,GAEpBO,MAAO3B,EAAWuB,GAElBK,MAAO5B,EAAWwB"}
|
|
@@ -1,11 +1,38 @@
|
|
|
1
1
|
import type React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Visual style variant of the Singpass button.
|
|
4
|
+
*
|
|
5
|
+
* - `"red-filled"` — Singpass red background with white logo.
|
|
6
|
+
* - `"white-filled"` — white background with red logo.
|
|
7
|
+
*/
|
|
2
8
|
export type SingpassButtonStyleType = "red-filled" | "white-filled";
|
|
9
|
+
/**
|
|
10
|
+
* Size variant of the Singpass button.
|
|
11
|
+
*
|
|
12
|
+
* - `"default"` — standard button size.
|
|
13
|
+
* - `"small"` — compact button size.
|
|
14
|
+
* - `"large"` — expanded button size.
|
|
15
|
+
*/
|
|
3
16
|
export type SingpassButtonSizeType = "default" | "small" | "large";
|
|
17
|
+
/**
|
|
18
|
+
* Props for the Singpass-branded login button.
|
|
19
|
+
*/
|
|
4
20
|
export interface SingpassButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
5
21
|
"data-testid"?: string | undefined;
|
|
6
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Visual style variant controlling the button background and logo colour.
|
|
24
|
+
*
|
|
25
|
+
* @default "white-filled"
|
|
26
|
+
*/
|
|
7
27
|
styleType?: SingpassButtonStyleType | undefined;
|
|
8
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Size variant of the button.
|
|
30
|
+
*
|
|
31
|
+
* @default "default"
|
|
32
|
+
*/
|
|
9
33
|
sizeType?: SingpassButtonSizeType | undefined;
|
|
10
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Ref type for the underlying `<button>` element rendered by `SingpassButton`.
|
|
37
|
+
*/
|
|
11
38
|
export type SingpassButtonRef = React.Ref<HTMLButtonElement>;
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import type { SmartAppBannerProps } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* A fixed top banner that promotes a mobile app and links to its store listing.
|
|
5
|
+
*
|
|
6
|
+
* Use `SmartAppBanner` to invite users to install or open the native app.
|
|
7
|
+
*/
|
|
3
8
|
export declare const SmartAppBanner: (props: SmartAppBannerProps & React.RefAttributes<HTMLDivElement>) => React.ReactElement | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-app-banner.js","sources":["../../src/smart-app-banner/smart-app-banner.tsx"],"sourcesContent":["import { CrossIcon } from \"@lifesg/react-icons/cross\";\nimport { StarIcon } from \"@lifesg/react-icons/star\";\nimport { StarFillIcon } from \"@lifesg/react-icons/star-fill\";\nimport { StarHalfIcon } from \"@lifesg/react-icons/star-half\";\nimport clsx from \"clsx\";\nimport React, { useContext, useRef } from \"react\";\n\nimport { Button } from \"../button\";\nimport { ClickableIcon } from \"../shared/clickable-icon\";\nimport { useApplyStyle } from \"../theme\";\nimport { ThemeContext } from \"../theme/theme-provider/context\";\nimport { Typography } from \"../typography\";\nimport { mergeRefs } from \"../util\";\nimport * as styles from \"./smart-app-banner.styles\";\nimport type { SmartAppBannerProps } from \"./types\";\n\nconst APP_ICON =\n \"https://assets.life.gov.sg/react-design-system/img/app-icon/app-icon.png\";\n\nconst ID = \"smart-app-banner\";\nconst MAX_STARS = 5;\n\nfunction SmartAppBannerComponent(\n props: SmartAppBannerProps,\n ref: React.Ref<HTMLDivElement>\n): JSX.Element {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const {\n className,\n show,\n href,\n content,\n offset = 0,\n icon = APP_ICON,\n animated = false,\n onDismiss,\n onClick,\n } = props;\n\n const {\n title,\n message,\n buttonLabel,\n iconAriaLabel,\n buttonAriaLabel,\n numberOfStars,\n } = content;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const theme = useContext(ThemeContext);\n const isDark = theme?.mode === \"dark\";\n\n useApplyStyle(containerRef, {\n [styles.tokens.container.top]: `${offset}px`,\n });\n\n const ariaLabels = {\n dismiss: \"Close banner\",\n icon: iconAriaLabel ?? \"\",\n cta: buttonAriaLabel ?? buttonLabel,\n };\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleClick = (\n e: React.MouseEvent<HTMLDivElement | HTMLButtonElement>\n ) => {\n e.stopPropagation();\n window.open(href, \"_blank\", \"noreferrer\");\n onClick?.();\n };\n\n // =============================================================================\n // RENDER FUNCTION\n // =============================================================================\n\n const generateStarRating = () => {\n if (isNaN(numberOfStars) || numberOfStars < 0) {\n return;\n }\n\n const stars = [];\n const hasHalfStar = numberOfStars - Math.floor(numberOfStars) >= 0.4;\n\n for (let i = 0; i < Math.floor(numberOfStars); i++) {\n stars.push(\n <StarFillIcon\n key={`star${i}`}\n aria-hidden\n className={styles.starIcon}\n />\n );\n }\n if (hasHalfStar) {\n stars.push(\n <StarHalfIcon\n key={`halfstar`}\n aria-hidden\n className={styles.starIcon}\n />\n );\n }\n if (stars.length < MAX_STARS) {\n const remaining = 5 - stars.length;\n for (let i = 0; i < remaining; i++) {\n stars.push(\n <StarIcon\n key={`emptystar${i}`}\n aria-hidden\n className={styles.starIcon}\n />\n );\n }\n }\n\n /* maximum of 5 stars */\n return (\n <div\n className={styles.ratingContainer}\n role=\"group\"\n aria-label={`A rating of ${numberOfStars} out of ${MAX_STARS} stars`}\n data-testid={`${ID}-star-rating`}\n >\n {stars.slice(0, MAX_STARS)}\n </div>\n );\n };\n\n return (\n <>\n {show && (\n <div\n ref={mergeRefs(containerRef, ref)}\n data-testid={ID}\n className={clsx(\n styles.smartAppBannerContainer,\n isDark\n ? styles.smartAppBannerContainerDark\n : styles.smartAppBannerContainerLight,\n animated && styles.smartAppBannerContainerAnimated,\n className\n )}\n >\n <div\n className={styles.proceedContainer}\n onClick={handleClick}\n id={`${ID}-proceed`}\n data-testid={`${ID}-proceed-container`}\n >\n <img\n className={styles.bannerIcon}\n src={icon}\n alt={ariaLabels.icon}\n />\n <div className={styles.textContainer}>\n <Typography.BodySM className={styles.title}>\n {title}\n </Typography.BodySM>\n <Typography.BodyXS className={styles.description}>\n {message}\n </Typography.BodyXS>\n {generateStarRating()}\n </div>\n <div className={styles.buttonContainer}>\n <Button\n className={styles.button}\n type=\"button\"\n onClick={handleClick}\n aria-label={ariaLabels.cta}\n sizeType=\"small\"\n >\n {buttonLabel}\n </Button>\n </div>\n </div>\n <div\n className={styles.dismissContainer}\n onClick={onDismiss}\n id={`${ID}-dismiss`}\n data-testid={`${ID}-dismiss-container`}\n >\n <ClickableIcon\n className={styles.dismissButton}\n aria-label={ariaLabels.dismiss}\n >\n <CrossIcon className={styles.cross} />\n </ClickableIcon>\n </div>\n </div>\n )}\n </>\n );\n}\n\nexport const SmartAppBanner = React.forwardRef(SmartAppBannerComponent);\n"],"names":["APP_ICON","ID","SmartAppBanner","React","forwardRef","props","ref","className","show","href","content","offset","icon","animated","onDismiss","onClick","title","message","buttonLabel","iconAriaLabel","buttonAriaLabel","numberOfStars","containerRef","useRef","theme","useContext","ThemeContext","isDark","mode","useApplyStyle","styles.tokens","container","top","ariaLabels","dismiss","cta","handleClick","e","stopPropagation","window","open","_jsx","_Fragment","children","_jsxs","mergeRefs","clsx","styles.smartAppBannerContainer","styles.smartAppBannerContainerDark","styles.smartAppBannerContainerLight","styles.smartAppBannerContainerAnimated","styles.proceedContainer","id","styles.bannerIcon","src","alt","styles.textContainer","Typography","BodySM","styles.title","BodyXS","styles.description","isNaN","stars","hasHalfStar","Math","floor","i","push","StarFillIcon","styles.starIcon","StarHalfIcon","length","remaining","StarIcon","styles.ratingContainer","role","slice","generateStarRating","styles.buttonContainer","Button","styles.button","type","sizeType","styles.dismissContainer","ClickableIcon","styles.dismissButton","CrossIcon","styles.cross"],"mappings":"w+CAgBA,MAAMA,EACF,2EAEEC,EAAK,mBAiLJ,MAAMC,EAAiBC,EAAMC,YA9KpC,SACIC,EACAC,GAKA,MAAMC,UACFA,EAASC,KACTA,EAAIC,KACJA,EAAIC,QACJA,EAAOC,OACPA,EAAS,EAACC,KACVA,EAAOZ,EAAQa,SACfA,GAAW,EAAKC,UAChBA,EAASC,QACTA,GACAV,GAEEW,MACFA,EAAKC,QACLA,EAAOC,YACPA,EAAWC,cACXA,EAAaC,gBACbA,EAAeC,cACfA,GACAX,EAEEY,EAAeC,EAAuB,MACtCC,EAAQC,EAAWC,GACnBC,GAAyB,UAAhBH,aAAK,EAALA,EAAOI,MAEtBC,EAAcP,EAAc,CACxB,CAACQ,EAAcC,UAAUC,KAAM,GAAGrB,QAGtC,MAAMsB,GAAa,CACfC,QAAS,eACTtB,KAAMO,QAAAA,EAAiB,GACvBgB,IAAKf,QAAAA,EAAmBF,GAKtBkB,GACFC,IAEAA,EAAEC,kBACFC,OAAOC,KAAK/B,EAAM,SAAU,cAC5BM,SAAAA,GAAW,EA2Df,OACI0B,EAAAC,EAAA,CAAAC,SACKnC,GACGoC,SACItC,IAAKuC,EAAUvB,EAAchB,GAAI,cACpBL,EACbM,UAAWuC,EACPC,EACApB,GACMqB,EACAC,EACNpC,GAAYqC,EACZ3C,GACHoC,SAAA,CAEDC,SACIrC,UAAW4C,EACXpC,QAASqB,GACTgB,GAAI,GAAGnD,YAAY,cACN,GAAGA,gCAEhBwC,EAAA,MAAA,CACIlC,UAAW8C,EACXC,IAAK1C,EACL2C,IAAKtB,GAAWrB,OAEpBgC,EAAA,MAAA,CAAKrC,UAAWiD,EAAoBb,SAAA,CAChCF,EAACgB,EAAWC,OAAM,CAACnD,UAAWoD,EAAYhB,SACrC3B,IAELyB,EAACgB,EAAWG,OAAM,CAACrD,UAAWsD,EAAkBlB,SAC3C1B,IAnFF,MACvB,GAAI6C,MAAMzC,IAAkBA,EAAgB,EACxC,OAGJ,MAAM0C,EAAQ,GACRC,EAAc3C,EAAgB4C,KAAKC,MAAM7C,IAAkB,GAEjE,IAAK,IAAI8C,EAAI,EAAGA,EAAIF,KAAKC,MAAM7C,GAAgB8C,IAC3CJ,EAAMK,KACF3B,EAAC4B,oBAGG9D,UAAW+D,GAFN,OAAOH,MAexB,GATIH,GACAD,EAAMK,KACF3B,EAAC8B,EAAY,CAAA,eAAA,EAGThE,UAAW+D,GAFN,aAMbP,EAAMS,OApFA,EAoFoB,CAC1B,MAAMC,EAAY,EAAIV,EAAMS,OAC5B,IAAK,IAAIL,EAAI,EAAGA,EAAIM,EAAWN,IAC3BJ,EAAMK,KACF3B,EAACiC,oBAGGnE,UAAW+D,GAFN,YAAYH,KAMjC,CAGA,OACI1B,EAAA,MAAA,CACIlC,UAAWoE,EACXC,KAAK,QAAO,aACA,eAAevD,mBAAyC,cACvD,GAAGpB,gBAAgB0C,SAE/BoB,EAAMc,MAAM,EAzGX,IA0GA,EAqCWC,MAELrC,EAAA,MAAA,CAAKlC,UAAWwE,EAAsBpC,SAClCF,EAACuC,EAAM,CACHzE,UAAW0E,EACXC,KAAK,SACLnE,QAASqB,GAAW,aACRH,GAAWE,IACvBgD,SAAS,QAAOxC,SAEfzB,SAIbuB,EAAA,MAAA,CACIlC,UAAW6E,EACXrE,QAASD,EACTsC,GAAI,GAAGnD,0BACM,GAAGA,sBAAsB0C,SAEtCF,EAAC4C,EAAa,CACV9E,UAAW+E,EAAoB,aACnBrD,GAAWC,iBAEvBO,EAAC8C,GAAUhF,UAAWiF,YAOlD"}
|
|
1
|
+
{"version":3,"file":"smart-app-banner.js","sources":["../../src/smart-app-banner/smart-app-banner.tsx"],"sourcesContent":["import { CrossIcon } from \"@lifesg/react-icons/cross\";\nimport { StarIcon } from \"@lifesg/react-icons/star\";\nimport { StarFillIcon } from \"@lifesg/react-icons/star-fill\";\nimport { StarHalfIcon } from \"@lifesg/react-icons/star-half\";\nimport clsx from \"clsx\";\nimport React, { useContext, useRef } from \"react\";\n\nimport { Button } from \"../button\";\nimport { ClickableIcon } from \"../shared/clickable-icon\";\nimport { useApplyStyle } from \"../theme\";\nimport { ThemeContext } from \"../theme/theme-provider/context\";\nimport { Typography } from \"../typography\";\nimport { mergeRefs } from \"../util\";\nimport * as styles from \"./smart-app-banner.styles\";\nimport type { SmartAppBannerProps } from \"./types\";\n\nconst APP_ICON =\n \"https://assets.life.gov.sg/react-design-system/img/app-icon/app-icon.png\";\n\nconst ID = \"smart-app-banner\";\nconst MAX_STARS = 5;\n\nfunction SmartAppBannerComponent(\n props: SmartAppBannerProps,\n ref: React.Ref<HTMLDivElement>\n): JSX.Element {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const {\n className,\n show,\n href,\n content,\n offset = 0,\n icon = APP_ICON,\n animated = false,\n onDismiss,\n onClick,\n } = props;\n\n const {\n title,\n message,\n buttonLabel,\n iconAriaLabel,\n buttonAriaLabel,\n numberOfStars,\n } = content;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const theme = useContext(ThemeContext);\n const isDark = theme?.mode === \"dark\";\n\n useApplyStyle(containerRef, {\n [styles.tokens.container.top]: `${offset}px`,\n });\n\n const ariaLabels = {\n dismiss: \"Close banner\",\n icon: iconAriaLabel ?? \"\",\n cta: buttonAriaLabel ?? buttonLabel,\n };\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleClick = (\n e: React.MouseEvent<HTMLDivElement | HTMLButtonElement>\n ) => {\n e.stopPropagation();\n window.open(href, \"_blank\", \"noreferrer\");\n onClick?.();\n };\n\n // =============================================================================\n // RENDER FUNCTION\n // =============================================================================\n\n const generateStarRating = () => {\n if (isNaN(numberOfStars) || numberOfStars < 0) {\n return;\n }\n\n const stars = [];\n const hasHalfStar = numberOfStars - Math.floor(numberOfStars) >= 0.4;\n\n for (let i = 0; i < Math.floor(numberOfStars); i++) {\n stars.push(\n <StarFillIcon\n key={`star${i}`}\n aria-hidden\n className={styles.starIcon}\n />\n );\n }\n if (hasHalfStar) {\n stars.push(\n <StarHalfIcon\n key={`halfstar`}\n aria-hidden\n className={styles.starIcon}\n />\n );\n }\n if (stars.length < MAX_STARS) {\n const remaining = 5 - stars.length;\n for (let i = 0; i < remaining; i++) {\n stars.push(\n <StarIcon\n key={`emptystar${i}`}\n aria-hidden\n className={styles.starIcon}\n />\n );\n }\n }\n\n /* maximum of 5 stars */\n return (\n <div\n className={styles.ratingContainer}\n role=\"group\"\n aria-label={`A rating of ${numberOfStars} out of ${MAX_STARS} stars`}\n data-testid={`${ID}-star-rating`}\n >\n {stars.slice(0, MAX_STARS)}\n </div>\n );\n };\n\n return (\n <>\n {show && (\n <div\n ref={mergeRefs(containerRef, ref)}\n data-testid={ID}\n className={clsx(\n styles.smartAppBannerContainer,\n isDark\n ? styles.smartAppBannerContainerDark\n : styles.smartAppBannerContainerLight,\n animated && styles.smartAppBannerContainerAnimated,\n className\n )}\n >\n <div\n className={styles.proceedContainer}\n onClick={handleClick}\n id={`${ID}-proceed`}\n data-testid={`${ID}-proceed-container`}\n >\n <img\n className={styles.bannerIcon}\n src={icon}\n alt={ariaLabels.icon}\n />\n <div className={styles.textContainer}>\n <Typography.BodySM className={styles.title}>\n {title}\n </Typography.BodySM>\n <Typography.BodyXS className={styles.description}>\n {message}\n </Typography.BodyXS>\n {generateStarRating()}\n </div>\n <div className={styles.buttonContainer}>\n <Button\n className={styles.button}\n type=\"button\"\n onClick={handleClick}\n aria-label={ariaLabels.cta}\n sizeType=\"small\"\n >\n {buttonLabel}\n </Button>\n </div>\n </div>\n <div\n className={styles.dismissContainer}\n onClick={onDismiss}\n id={`${ID}-dismiss`}\n data-testid={`${ID}-dismiss-container`}\n >\n <ClickableIcon\n className={styles.dismissButton}\n aria-label={ariaLabels.dismiss}\n >\n <CrossIcon className={styles.cross} />\n </ClickableIcon>\n </div>\n </div>\n )}\n </>\n );\n}\n\n/**\n * A fixed top banner that promotes a mobile app and links to its store listing.\n *\n * Use `SmartAppBanner` to invite users to install or open the native app.\n */\nexport const SmartAppBanner = React.forwardRef(SmartAppBannerComponent);\n"],"names":["APP_ICON","ID","SmartAppBanner","React","forwardRef","props","ref","className","show","href","content","offset","icon","animated","onDismiss","onClick","title","message","buttonLabel","iconAriaLabel","buttonAriaLabel","numberOfStars","containerRef","useRef","theme","useContext","ThemeContext","isDark","mode","useApplyStyle","styles.tokens","container","top","ariaLabels","dismiss","cta","handleClick","e","stopPropagation","window","open","_jsx","_Fragment","children","_jsxs","mergeRefs","clsx","styles.smartAppBannerContainer","styles.smartAppBannerContainerDark","styles.smartAppBannerContainerLight","styles.smartAppBannerContainerAnimated","styles.proceedContainer","id","styles.bannerIcon","src","alt","styles.textContainer","Typography","BodySM","styles.title","BodyXS","styles.description","isNaN","stars","hasHalfStar","Math","floor","i","push","StarFillIcon","styles.starIcon","StarHalfIcon","length","remaining","StarIcon","styles.ratingContainer","role","slice","generateStarRating","styles.buttonContainer","Button","styles.button","type","sizeType","styles.dismissContainer","ClickableIcon","styles.dismissButton","CrossIcon","styles.cross"],"mappings":"w+CAgBA,MAAMA,EACF,2EAEEC,EAAK,mBAsLJ,MAAMC,EAAiBC,EAAMC,YAnLpC,SACIC,EACAC,GAKA,MAAMC,UACFA,EAASC,KACTA,EAAIC,KACJA,EAAIC,QACJA,EAAOC,OACPA,EAAS,EAACC,KACVA,EAAOZ,EAAQa,SACfA,GAAW,EAAKC,UAChBA,EAASC,QACTA,GACAV,GAEEW,MACFA,EAAKC,QACLA,EAAOC,YACPA,EAAWC,cACXA,EAAaC,gBACbA,EAAeC,cACfA,GACAX,EAEEY,EAAeC,EAAuB,MACtCC,EAAQC,EAAWC,GACnBC,GAAyB,UAAhBH,aAAK,EAALA,EAAOI,MAEtBC,EAAcP,EAAc,CACxB,CAACQ,EAAcC,UAAUC,KAAM,GAAGrB,QAGtC,MAAMsB,GAAa,CACfC,QAAS,eACTtB,KAAMO,QAAAA,EAAiB,GACvBgB,IAAKf,QAAAA,EAAmBF,GAKtBkB,GACFC,IAEAA,EAAEC,kBACFC,OAAOC,KAAK/B,EAAM,SAAU,cAC5BM,SAAAA,GAAW,EA2Df,OACI0B,EAAAC,EAAA,CAAAC,SACKnC,GACGoC,SACItC,IAAKuC,EAAUvB,EAAchB,GAAI,cACpBL,EACbM,UAAWuC,EACPC,EACApB,GACMqB,EACAC,EACNpC,GAAYqC,EACZ3C,GACHoC,SAAA,CAEDC,SACIrC,UAAW4C,EACXpC,QAASqB,GACTgB,GAAI,GAAGnD,YAAY,cACN,GAAGA,gCAEhBwC,EAAA,MAAA,CACIlC,UAAW8C,EACXC,IAAK1C,EACL2C,IAAKtB,GAAWrB,OAEpBgC,EAAA,MAAA,CAAKrC,UAAWiD,EAAoBb,SAAA,CAChCF,EAACgB,EAAWC,OAAM,CAACnD,UAAWoD,EAAYhB,SACrC3B,IAELyB,EAACgB,EAAWG,OAAM,CAACrD,UAAWsD,EAAkBlB,SAC3C1B,IAnFF,MACvB,GAAI6C,MAAMzC,IAAkBA,EAAgB,EACxC,OAGJ,MAAM0C,EAAQ,GACRC,EAAc3C,EAAgB4C,KAAKC,MAAM7C,IAAkB,GAEjE,IAAK,IAAI8C,EAAI,EAAGA,EAAIF,KAAKC,MAAM7C,GAAgB8C,IAC3CJ,EAAMK,KACF3B,EAAC4B,oBAGG9D,UAAW+D,GAFN,OAAOH,MAexB,GATIH,GACAD,EAAMK,KACF3B,EAAC8B,EAAY,CAAA,eAAA,EAGThE,UAAW+D,GAFN,aAMbP,EAAMS,OApFA,EAoFoB,CAC1B,MAAMC,EAAY,EAAIV,EAAMS,OAC5B,IAAK,IAAIL,EAAI,EAAGA,EAAIM,EAAWN,IAC3BJ,EAAMK,KACF3B,EAACiC,oBAGGnE,UAAW+D,GAFN,YAAYH,KAMjC,CAGA,OACI1B,EAAA,MAAA,CACIlC,UAAWoE,EACXC,KAAK,QAAO,aACA,eAAevD,mBAAyC,cACvD,GAAGpB,gBAAgB0C,SAE/BoB,EAAMc,MAAM,EAzGX,IA0GA,EAqCWC,MAELrC,EAAA,MAAA,CAAKlC,UAAWwE,EAAsBpC,SAClCF,EAACuC,EAAM,CACHzE,UAAW0E,EACXC,KAAK,SACLnE,QAASqB,GAAW,aACRH,GAAWE,IACvBgD,SAAS,QAAOxC,SAEfzB,SAIbuB,EAAA,MAAA,CACIlC,UAAW6E,EACXrE,QAASD,EACTsC,GAAI,GAAGnD,0BACM,GAAGA,sBAAsB0C,SAEtCF,EAAC4C,EAAa,CACV9E,UAAW+E,EAAoB,aACnBrD,GAAWC,iBAEvBO,EAAC8C,GAAUhF,UAAWiF,YAOlD"}
|
|
@@ -1,19 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Props for the `SmartAppBanner` component.
|
|
3
|
+
*/
|
|
1
4
|
export interface SmartAppBannerProps {
|
|
5
|
+
/**
|
|
6
|
+
* Controls whether the banner is visible.
|
|
7
|
+
*/
|
|
2
8
|
show: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Destination URL opened in a new tab when the banner or CTA button is clicked.
|
|
11
|
+
*/
|
|
3
12
|
href: string;
|
|
13
|
+
/**
|
|
14
|
+
* Text, labels, and rating content rendered inside the banner.
|
|
15
|
+
*/
|
|
4
16
|
content: SmartAppBannerContentProps;
|
|
17
|
+
/**
|
|
18
|
+
* Top offset in pixels applied to the banner's position.
|
|
19
|
+
*
|
|
20
|
+
* @default 0
|
|
21
|
+
*/
|
|
5
22
|
offset?: number | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* URL of the app icon image displayed in the banner.
|
|
25
|
+
*/
|
|
6
26
|
icon?: string | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Applies a slide-in entrance animation to the banner.
|
|
29
|
+
*
|
|
30
|
+
* @default false
|
|
31
|
+
*/
|
|
7
32
|
animated?: boolean | undefined;
|
|
8
33
|
className?: string | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Called when the user clicks the dismiss button.
|
|
36
|
+
*/
|
|
9
37
|
onDismiss: () => void;
|
|
38
|
+
/**
|
|
39
|
+
* Called when the user clicks on the banner or the CTA button.
|
|
40
|
+
*/
|
|
10
41
|
onClick?: (() => void) | undefined;
|
|
11
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Text content and accessible labels rendered inside `SmartAppBanner`.
|
|
45
|
+
*/
|
|
12
46
|
export interface SmartAppBannerContentProps {
|
|
47
|
+
/**
|
|
48
|
+
* Primary heading text, typically the app name.
|
|
49
|
+
*/
|
|
13
50
|
title: string;
|
|
51
|
+
/**
|
|
52
|
+
* Label text for the CTA button.
|
|
53
|
+
*/
|
|
14
54
|
buttonLabel: string;
|
|
55
|
+
/**
|
|
56
|
+
* Alt text for the app icon image.
|
|
57
|
+
*
|
|
58
|
+
* @default ""
|
|
59
|
+
*/
|
|
15
60
|
iconAriaLabel?: string | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Accessible label for the CTA button. Falls back to `buttonLabel` when omitted.
|
|
63
|
+
*/
|
|
16
64
|
buttonAriaLabel?: string | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Secondary description text displayed beneath the title.
|
|
67
|
+
*/
|
|
17
68
|
message?: string | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* App store rating rendered as up to 5 star icons.
|
|
71
|
+
*/
|
|
18
72
|
numberOfStars: number;
|
|
19
73
|
}
|
package/tab/tab.d.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import type { TabProps } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* A tabbed-panel layout that switches visible content by selecting a tab link.
|
|
4
|
+
*
|
|
5
|
+
* Use `Tab` to organise content into labelled panels where only one panel is
|
|
6
|
+
* visible at a time. Compose with `Tab.Item` to define each panel.
|
|
7
|
+
*/
|
|
2
8
|
export declare const Tab: {
|
|
3
9
|
({ children, currentActive: currentActiveIndex, initialActive, onTabClick, "data-testid": testId, className, fullWidthIndicatorLine, fadeColor, ...otherProps }: TabProps): import("react/jsx-runtime").JSX.Element;
|
|
4
10
|
displayName: string;
|
|
5
11
|
} & {
|
|
12
|
+
/** Renders an individual content panel within a `Tab`. */
|
|
6
13
|
Item: {
|
|
7
14
|
({ index, children, titleAddon: _titleAddon, ...otherProps }: import("./tab-item").TabItemComponentProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
15
|
displayName: string;
|
package/tab/tab.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab.js","sources":["../../src/tab/tab.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport type { ReactElement } from \"react\";\nimport { Children, cloneElement, useEffect, useMemo, useState } from \"react\";\n\nimport * as styles from \"./tab.styles\";\nimport type { TabLinkProps } from \"./tab-context\";\nimport { TabContext } from \"./tab-context\";\nimport { TabItem } from \"./tab-item\";\nimport { TabLinkChain } from \"./tab-link-chain\";\nimport type { TabItemProps, TabProps } from \"./types\";\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\nconst TabBase = ({\n children,\n currentActive: currentActiveIndex,\n initialActive = 0,\n onTabClick,\n \"data-testid\": testId,\n className,\n fullWidthIndicatorLine,\n fadeColor,\n ...otherProps\n}: TabProps) => {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const [currentActive, setCurrentActive] = useState<number>(\n currentActiveIndex || initialActive\n );\n\n const tabLinks = useMemo(() => {\n const validChildren = Children.toArray(children).filter(\n Boolean\n ) as ReactElement<TabItemProps>[];\n\n return validChildren.map((child) => {\n return {\n title: child.props.title,\n width: child.props.width,\n titleAddon: child.props.titleAddon,\n };\n }) as TabLinkProps[];\n }, [children]);\n\n const tabContextValue = useMemo(\n () => ({\n tabLinks,\n currentActiveIndex: currentActive,\n setCurrentActiveIndex: setCurrentActive,\n }),\n [currentActive, tabLinks]\n );\n\n // =========================================================================\n // Effects\n // =========================================================================\n useEffect(() => {\n if (typeof currentActiveIndex === \"number\") {\n setCurrentActive(currentActiveIndex);\n }\n }, [currentActiveIndex]);\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const renderChildren = () => {\n const validChildren = Children.toArray(children).filter(Boolean);\n\n return validChildren.map((child, index) => {\n const element = child as ReactElement<TabItemProps>;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return cloneElement(child as ReactElement<any>, {\n key: element.key ?? element.props.title,\n index,\n });\n });\n };\n\n return (\n <div\n data-testid={testId}\n className={clsx(styles.wrapper, className)}\n {...otherProps}\n >\n <TabContext.Provider value={tabContextValue}>\n <TabLinkChain\n controlledMode={typeof currentActiveIndex === \"number\"}\n onTabClick={onTabClick}\n data-testid={`${testId}-tabs`}\n fullWidthIndicatorLine={fullWidthIndicatorLine}\n fadeColor={fadeColor}\n />\n {renderChildren()}\n </TabContext.Provider>\n </div>\n );\n};\n\nTabBase.displayName = \"Tab\";\n\n// =============================================================================\n// EXPORTS\n// =============================================================================\nexport const Tab = Object.assign(TabBase, {\n Item: TabItem,\n});\n"],"names":["TabBase","_a","children","currentActive","currentActiveIndex","initialActive","onTabClick","testId","className","fullWidthIndicatorLine","fadeColor","otherProps","__rest","setCurrentActive","useState","tabLinks","useMemo","Children","toArray","filter","Boolean","map","child","title","props","width","titleAddon","tabContextValue","setCurrentActiveIndex","useEffect","_jsx","Object","assign","clsx","styles.wrapper","_jsxs","TabContext","Provider","value","TabLinkChain","controlledMode","index","element","cloneElement","key","displayName","Tab","Item","TabItem"],"mappings":"qYAcA,MAAMA,EAAWC,QAAAC,SACbA,EACAC,cAAeC,EAAkBC,cACjCA,EAAgB,EAACC,WACjBA,EACA,cAAeC,EAAMC,UACrBA,EAASC,uBACTA,EAAsBC,UACtBA,GAAST,EACNU,EAAUC,EAAAX,EATA,CAAA,WAAA,gBAAA,gBAAA,aAAA,cAAA,YAAA,yBAAA,cAcb,MAAOE,EAAeU,GAAoBC,EACtCV,GAAsBC,GAGpBU,EAAWC,GAAQ,IACCC,EAASC,QAAQhB,GAAUiB,OAC7CC,SAGiBC,KAAKC,IACf,CACHC,MAAOD,EAAME,MAAMD,MACnBE,MAAOH,EAAME,MAAMC,MACnBC,WAAYJ,EAAME,MAAME,gBAGjC,CAACxB,IAEEyB,EAAkBX,GACpB,KAAA,CACID,WACAX,mBAAoBD,EACpByB,sBAAuBf,KAE3B,CAACV,EAAeY,IAMpBc,GAAU,KAC4B,iBAAvBzB,GACPS,EAAiBT,EACrB,GACD,CAACA,IAmBJ,OACI0B,EAAA,MAAAC,OAAAC,OAAA,CAAA,cACiBzB,EACbC,UAAWyB,EAAKC,EAAgB1B,IAC5BG,EAAU,CAAAT,SAEdiC,EAACC,EAAWC,SAAQ,CAACC,MAAOX,EAAezB,SAAA,CACvC4B,EAACS,EAAY,CACTC,eAA8C,iBAAvBpC,EACvBE,WAAYA,EAAU,cACT,GAAGC,SAChBE,uBAAwBA,EACxBC,UAAWA,IAzBDO,EAASC,QAAQhB,GAAUiB,OAAOC,SAEnCC,KAAI,CAACC,EAAOmB,WAC7B,MAAMC,EAAUpB,EAGhB,OAAOqB,EAAarB,EAA4B,CAC5CsB,YAAK3C,EAAAyC,EAAQE,mBAAOF,EAAQlB,MAAMD,MAClCkB,SACF,SAoBA,EAIdzC,EAAQ6C,YAAc,
|
|
1
|
+
{"version":3,"file":"tab.js","sources":["../../src/tab/tab.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport type { ReactElement } from \"react\";\nimport { Children, cloneElement, useEffect, useMemo, useState } from \"react\";\n\nimport * as styles from \"./tab.styles\";\nimport type { TabLinkProps } from \"./tab-context\";\nimport { TabContext } from \"./tab-context\";\nimport { TabItem } from \"./tab-item\";\nimport { TabLinkChain } from \"./tab-link-chain\";\nimport type { TabItemProps, TabProps } from \"./types\";\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\nconst TabBase = ({\n children,\n currentActive: currentActiveIndex,\n initialActive = 0,\n onTabClick,\n \"data-testid\": testId,\n className,\n fullWidthIndicatorLine,\n fadeColor,\n ...otherProps\n}: TabProps) => {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const [currentActive, setCurrentActive] = useState<number>(\n currentActiveIndex || initialActive\n );\n\n const tabLinks = useMemo(() => {\n const validChildren = Children.toArray(children).filter(\n Boolean\n ) as ReactElement<TabItemProps>[];\n\n return validChildren.map((child) => {\n return {\n title: child.props.title,\n width: child.props.width,\n titleAddon: child.props.titleAddon,\n };\n }) as TabLinkProps[];\n }, [children]);\n\n const tabContextValue = useMemo(\n () => ({\n tabLinks,\n currentActiveIndex: currentActive,\n setCurrentActiveIndex: setCurrentActive,\n }),\n [currentActive, tabLinks]\n );\n\n // =========================================================================\n // Effects\n // =========================================================================\n useEffect(() => {\n if (typeof currentActiveIndex === \"number\") {\n setCurrentActive(currentActiveIndex);\n }\n }, [currentActiveIndex]);\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const renderChildren = () => {\n const validChildren = Children.toArray(children).filter(Boolean);\n\n return validChildren.map((child, index) => {\n const element = child as ReactElement<TabItemProps>;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return cloneElement(child as ReactElement<any>, {\n key: element.key ?? element.props.title,\n index,\n });\n });\n };\n\n return (\n <div\n data-testid={testId}\n className={clsx(styles.wrapper, className)}\n {...otherProps}\n >\n <TabContext.Provider value={tabContextValue}>\n <TabLinkChain\n controlledMode={typeof currentActiveIndex === \"number\"}\n onTabClick={onTabClick}\n data-testid={`${testId}-tabs`}\n fullWidthIndicatorLine={fullWidthIndicatorLine}\n fadeColor={fadeColor}\n />\n {renderChildren()}\n </TabContext.Provider>\n </div>\n );\n};\n\nTabBase.displayName = \"Tab\";\n\n// =============================================================================\n// EXPORTS\n// =============================================================================\n/**\n * A tabbed-panel layout that switches visible content by selecting a tab link.\n *\n * Use `Tab` to organise content into labelled panels where only one panel is\n * visible at a time. Compose with `Tab.Item` to define each panel.\n */\nexport const Tab = Object.assign(TabBase, {\n /** Renders an individual content panel within a `Tab`. */\n Item: TabItem,\n});\n"],"names":["TabBase","_a","children","currentActive","currentActiveIndex","initialActive","onTabClick","testId","className","fullWidthIndicatorLine","fadeColor","otherProps","__rest","setCurrentActive","useState","tabLinks","useMemo","Children","toArray","filter","Boolean","map","child","title","props","width","titleAddon","tabContextValue","setCurrentActiveIndex","useEffect","_jsx","Object","assign","clsx","styles.wrapper","_jsxs","TabContext","Provider","value","TabLinkChain","controlledMode","index","element","cloneElement","key","displayName","Tab","Item","TabItem"],"mappings":"qYAcA,MAAMA,EAAWC,QAAAC,SACbA,EACAC,cAAeC,EAAkBC,cACjCA,EAAgB,EAACC,WACjBA,EACA,cAAeC,EAAMC,UACrBA,EAASC,uBACTA,EAAsBC,UACtBA,GAAST,EACNU,EAAUC,EAAAX,EATA,CAAA,WAAA,gBAAA,gBAAA,aAAA,cAAA,YAAA,yBAAA,cAcb,MAAOE,EAAeU,GAAoBC,EACtCV,GAAsBC,GAGpBU,EAAWC,GAAQ,IACCC,EAASC,QAAQhB,GAAUiB,OAC7CC,SAGiBC,KAAKC,IACf,CACHC,MAAOD,EAAME,MAAMD,MACnBE,MAAOH,EAAME,MAAMC,MACnBC,WAAYJ,EAAME,MAAME,gBAGjC,CAACxB,IAEEyB,EAAkBX,GACpB,KAAA,CACID,WACAX,mBAAoBD,EACpByB,sBAAuBf,KAE3B,CAACV,EAAeY,IAMpBc,GAAU,KAC4B,iBAAvBzB,GACPS,EAAiBT,EACrB,GACD,CAACA,IAmBJ,OACI0B,EAAA,MAAAC,OAAAC,OAAA,CAAA,cACiBzB,EACbC,UAAWyB,EAAKC,EAAgB1B,IAC5BG,EAAU,CAAAT,SAEdiC,EAACC,EAAWC,SAAQ,CAACC,MAAOX,EAAezB,SAAA,CACvC4B,EAACS,EAAY,CACTC,eAA8C,iBAAvBpC,EACvBE,WAAYA,EAAU,cACT,GAAGC,SAChBE,uBAAwBA,EACxBC,UAAWA,IAzBDO,EAASC,QAAQhB,GAAUiB,OAAOC,SAEnCC,KAAI,CAACC,EAAOmB,WAC7B,MAAMC,EAAUpB,EAGhB,OAAOqB,EAAarB,EAA4B,CAC5CsB,YAAK3C,EAAAyC,EAAQE,mBAAOF,EAAQlB,MAAMD,MAClCkB,SACF,SAoBA,EAIdzC,EAAQ6C,YAAc,YAWTC,EAAMf,OAAOC,OAAOhC,EAAS,CAEtC+C,KAAMC"}
|