@pk-design/react-tailwind 1.6.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/Accordion/Accordion.js +61 -0
- package/dist/cjs/components/Accordion/Accordion.js.map +1 -0
- package/dist/cjs/components/ActionSheet/ActionSheet.js +38 -0
- package/dist/cjs/components/ActionSheet/ActionSheet.js.map +1 -0
- package/dist/cjs/components/Alert/Alert.js +34 -0
- package/dist/cjs/components/Alert/Alert.js.map +1 -0
- package/dist/cjs/components/Badge/Badge.js +33 -0
- package/dist/cjs/components/Badge/Badge.js.map +1 -0
- package/dist/cjs/components/Banner/Banner.js +41 -0
- package/dist/cjs/components/Banner/Banner.js.map +1 -0
- package/dist/cjs/components/BodyText/BodyText.js +59 -0
- package/dist/cjs/components/BodyText/BodyText.js.map +1 -0
- package/dist/cjs/components/BottomNavigation/BottomNavigation.js +52 -0
- package/dist/cjs/components/BottomNavigation/BottomNavigation.js.map +1 -0
- package/dist/cjs/components/Breadcrumb/Breadcrumb.js +63 -0
- package/dist/cjs/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/cjs/components/Button/Button.js +118 -0
- package/dist/cjs/components/Button/Button.js.map +1 -0
- package/dist/cjs/components/ButtonGroup/ButtonGroup.js +100 -0
- package/dist/cjs/components/ButtonGroup/ButtonGroup.js.map +1 -0
- package/dist/cjs/components/Card/Card.js +65 -0
- package/dist/cjs/components/Card/Card.js.map +1 -0
- package/dist/cjs/components/Checkbox/Checkbox.js +64 -0
- package/dist/cjs/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/cjs/components/CheckboxGroup/CheckboxGroup.js +82 -0
- package/dist/cjs/components/CheckboxGroup/CheckboxGroup.js.map +1 -0
- package/dist/cjs/components/DataList/DataList.js +287 -0
- package/dist/cjs/components/DataList/DataList.js.map +1 -0
- package/dist/cjs/components/DataTable/DataTable.icons.js +20 -0
- package/dist/cjs/components/DataTable/DataTable.icons.js.map +1 -0
- package/dist/cjs/components/DataTable/DataTable.js +110 -0
- package/dist/cjs/components/DataTable/DataTable.js.map +1 -0
- package/dist/cjs/components/DataTable/DataTable.utils.js +87 -0
- package/dist/cjs/components/DataTable/DataTable.utils.js.map +1 -0
- package/dist/cjs/components/DetailedInformation/DetailedInformation.js +67 -0
- package/dist/cjs/components/DetailedInformation/DetailedInformation.js.map +1 -0
- package/dist/cjs/components/Dot/index.js +12 -0
- package/dist/cjs/components/Dot/index.js.map +1 -0
- package/dist/cjs/components/Drawer/Drawer.js +67 -0
- package/dist/cjs/components/Drawer/Drawer.js.map +1 -0
- package/dist/cjs/components/Dropdown/Dropdown.js +50 -0
- package/dist/cjs/components/Dropdown/Dropdown.js.map +1 -0
- package/dist/cjs/components/EmptyState/index.js +14 -0
- package/dist/cjs/components/EmptyState/index.js.map +1 -0
- package/dist/cjs/components/Flex/Flex.js +25 -0
- package/dist/cjs/components/Flex/Flex.js.map +1 -0
- package/dist/cjs/components/FloatingActionButton/FloatingActionButton.js +71 -0
- package/dist/cjs/components/FloatingActionButton/FloatingActionButton.js.map +1 -0
- package/dist/cjs/components/Grid/Grid.js +33 -0
- package/dist/cjs/components/Grid/Grid.js.map +1 -0
- package/dist/cjs/components/HeadingText/HeadingText.js +89 -0
- package/dist/cjs/components/HeadingText/HeadingText.js.map +1 -0
- package/dist/cjs/components/Icons/ArrowDownAZ.svg.js +46 -0
- package/dist/cjs/components/Icons/ArrowDownAZ.svg.js.map +1 -0
- package/dist/cjs/components/Icons/ArrowDownNarrowWide.svg.js +46 -0
- package/dist/cjs/components/Icons/ArrowDownNarrowWide.svg.js.map +1 -0
- package/dist/cjs/components/Icons/ArrowDownWideNarrow.svg.js +46 -0
- package/dist/cjs/components/Icons/ArrowDownWideNarrow.svg.js.map +1 -0
- package/dist/cjs/components/Icons/ArrowDownZA.svg.js +46 -0
- package/dist/cjs/components/Icons/ArrowDownZA.svg.js.map +1 -0
- package/dist/cjs/components/Icons/ArrowUpDown.svg.js +46 -0
- package/dist/cjs/components/Icons/ArrowUpDown.svg.js.map +1 -0
- package/dist/cjs/components/Icons/BadgeCheck.svg.js +48 -0
- package/dist/cjs/components/Icons/BadgeCheck.svg.js.map +1 -0
- package/dist/cjs/components/Icons/Check.svg.js +46 -0
- package/dist/cjs/components/Icons/Check.svg.js.map +1 -0
- package/dist/cjs/components/Icons/ChevronDown.svg.js +46 -0
- package/dist/cjs/components/Icons/ChevronDown.svg.js.map +1 -0
- package/dist/cjs/components/Icons/ChevronLeft.svg.js +46 -0
- package/dist/cjs/components/Icons/ChevronLeft.svg.js.map +1 -0
- package/dist/cjs/components/Icons/ChevronRight.svg.js +46 -0
- package/dist/cjs/components/Icons/ChevronRight.svg.js.map +1 -0
- package/dist/cjs/components/Icons/CircleAlert.svg.js +50 -0
- package/dist/cjs/components/Icons/CircleAlert.svg.js.map +1 -0
- package/dist/cjs/components/Icons/CircleCheck.svg.js +50 -0
- package/dist/cjs/components/Icons/CircleCheck.svg.js.map +1 -0
- package/dist/cjs/components/Icons/CirclePlus.svg.js +50 -0
- package/dist/cjs/components/Icons/CirclePlus.svg.js.map +1 -0
- package/dist/cjs/components/Icons/CircleX.svg.js +50 -0
- package/dist/cjs/components/Icons/CircleX.svg.js.map +1 -0
- package/dist/cjs/components/Icons/FolderPlus.svg.js +46 -0
- package/dist/cjs/components/Icons/FolderPlus.svg.js.map +1 -0
- package/dist/cjs/components/Icons/Info.svg.js +50 -0
- package/dist/cjs/components/Icons/Info.svg.js.map +1 -0
- package/dist/cjs/components/Icons/Search.svg.js +50 -0
- package/dist/cjs/components/Icons/Search.svg.js.map +1 -0
- package/dist/cjs/components/Icons/Slash.svg.js +46 -0
- package/dist/cjs/components/Icons/Slash.svg.js.map +1 -0
- package/dist/cjs/components/Icons/TriangleAlert.svg.js +46 -0
- package/dist/cjs/components/Icons/TriangleAlert.svg.js.map +1 -0
- package/dist/cjs/components/Icons/X.svg.js +46 -0
- package/dist/cjs/components/Icons/X.svg.js.map +1 -0
- package/dist/cjs/components/Input/Input.js +85 -0
- package/dist/cjs/components/Input/Input.js.map +1 -0
- package/dist/cjs/components/Label/Label.js +14 -0
- package/dist/cjs/components/Label/Label.js.map +1 -0
- package/dist/cjs/components/Loader/index.js +18 -0
- package/dist/cjs/components/Loader/index.js.map +1 -0
- package/dist/cjs/components/MobileHeader/MobileHeader.js +45 -0
- package/dist/cjs/components/MobileHeader/MobileHeader.js.map +1 -0
- package/dist/cjs/components/MobilePicker/MobilePicker.js +368 -0
- package/dist/cjs/components/MobilePicker/MobilePicker.js.map +1 -0
- package/dist/cjs/components/MobileStepper/MobileStepper.js +33 -0
- package/dist/cjs/components/MobileStepper/MobileStepper.js.map +1 -0
- package/dist/cjs/components/Pagination/Pagination.js +33 -0
- package/dist/cjs/components/Pagination/Pagination.js.map +1 -0
- package/dist/cjs/components/Pagination/usePagination.js +33 -0
- package/dist/cjs/components/Pagination/usePagination.js.map +1 -0
- package/dist/cjs/components/PasswordInput/PasswordInput.js +56 -0
- package/dist/cjs/components/PasswordInput/PasswordInput.js.map +1 -0
- package/dist/cjs/components/PinInput/PinInput.js +98 -0
- package/dist/cjs/components/PinInput/PinInput.js.map +1 -0
- package/dist/cjs/components/PullToRefresh/PullToRefresh.js +83 -0
- package/dist/cjs/components/PullToRefresh/PullToRefresh.js.map +1 -0
- package/dist/cjs/components/QuantityStepper/QuantityStepper.js +77 -0
- package/dist/cjs/components/QuantityStepper/QuantityStepper.js.map +1 -0
- package/dist/cjs/components/Radio/Radio.js +34 -0
- package/dist/cjs/components/Radio/Radio.js.map +1 -0
- package/dist/cjs/components/RadioGroup/RadioGroup.js +50 -0
- package/dist/cjs/components/RadioGroup/RadioGroup.js.map +1 -0
- package/dist/cjs/components/RadioSwitch/RadioSwitch.js +116 -0
- package/dist/cjs/components/RadioSwitch/RadioSwitch.js.map +1 -0
- package/dist/cjs/components/RangeInput/RangeInput.js +66 -0
- package/dist/cjs/components/RangeInput/RangeInput.js.map +1 -0
- package/dist/cjs/components/RangeSlider/RangeSlider.js +167 -0
- package/dist/cjs/components/RangeSlider/RangeSlider.js.map +1 -0
- package/dist/cjs/components/SegmentedControl/SegmentedControl.js +64 -0
- package/dist/cjs/components/SegmentedControl/SegmentedControl.js.map +1 -0
- package/dist/cjs/components/SelectBox/SelectBox.js +305 -0
- package/dist/cjs/components/SelectBox/SelectBox.js.map +1 -0
- package/dist/cjs/components/Skeleton/Skeleton.js +36 -0
- package/dist/cjs/components/Skeleton/Skeleton.js.map +1 -0
- package/dist/cjs/components/StatusPill/StatusPill.js +46 -0
- package/dist/cjs/components/StatusPill/StatusPill.js.map +1 -0
- package/dist/cjs/components/StickyActionBar/StickyActionBar.js +22 -0
- package/dist/cjs/components/StickyActionBar/StickyActionBar.js.map +1 -0
- package/dist/cjs/components/SwipeableRow/SwipeableRow.js +187 -0
- package/dist/cjs/components/SwipeableRow/SwipeableRow.js.map +1 -0
- package/dist/cjs/components/SwipeableTabs/SwipeableTabs.js +91 -0
- package/dist/cjs/components/SwipeableTabs/SwipeableTabs.js.map +1 -0
- package/dist/cjs/components/Table/Table.js +57 -0
- package/dist/cjs/components/Table/Table.js.map +1 -0
- package/dist/cjs/components/Tabs/Tabs.js +53 -0
- package/dist/cjs/components/Tabs/Tabs.js.map +1 -0
- package/dist/cjs/components/TextContent/TextContent.js +47 -0
- package/dist/cjs/components/TextContent/TextContent.js.map +1 -0
- package/dist/cjs/components/Textarea/Textarea.js +64 -0
- package/dist/cjs/components/Textarea/Textarea.js.map +1 -0
- package/dist/cjs/components/Toast/Toast.js +96 -0
- package/dist/cjs/components/Toast/Toast.js.map +1 -0
- package/dist/cjs/components/Toast/ToastProvider.js +151 -0
- package/dist/cjs/components/Toast/ToastProvider.js.map +1 -0
- package/dist/cjs/components/VirtualizedDataTable/VirtualizedDataTable.js +122 -0
- package/dist/cjs/components/VirtualizedDataTable/VirtualizedDataTable.js.map +1 -0
- package/dist/cjs/components/VirtualizedDataTable/VirtualizedRow.js +48 -0
- package/dist/cjs/components/VirtualizedDataTable/VirtualizedRow.js.map +1 -0
- package/dist/cjs/components/WheelPicker/WheelPicker.js +82 -0
- package/dist/cjs/components/WheelPicker/WheelPicker.js.map +1 -0
- package/dist/cjs/components/common-responsive.js +310 -0
- package/dist/cjs/components/common-responsive.js.map +1 -0
- package/dist/cjs/hooks/use-debounce.js +31 -0
- package/dist/cjs/hooks/use-debounce.js.map +1 -0
- package/dist/cjs/hooks/use-is-mobile.js +24 -0
- package/dist/cjs/hooks/use-is-mobile.js.map +1 -0
- package/dist/cjs/hooks/use-is-tablet-or-mobile.js +13 -0
- package/dist/cjs/hooks/use-is-tablet-or-mobile.js.map +1 -0
- package/dist/cjs/hooks/use-is-tablet.js +21 -0
- package/dist/cjs/hooks/use-is-tablet.js.map +1 -0
- package/dist/cjs/index.js +163 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/react-tailwind.css +2 -0
- package/dist/cjs/react-tailwind.css.map +1 -0
- package/dist/cjs/utils/build-classname.js +8 -0
- package/dist/cjs/utils/build-classname.js.map +1 -0
- package/dist/cjs/utils/get.js +20 -0
- package/dist/cjs/utils/get.js.map +1 -0
- package/dist/cjs/utils/is-array.js +12 -0
- package/dist/cjs/utils/is-array.js.map +1 -0
- package/dist/cjs/utils/is-empty.js +26 -0
- package/dist/cjs/utils/is-empty.js.map +1 -0
- package/dist/es/components/Accordion/Accordion.js +59 -0
- package/dist/es/components/Accordion/Accordion.js.map +1 -0
- package/dist/es/components/ActionSheet/ActionSheet.js +36 -0
- package/dist/es/components/ActionSheet/ActionSheet.js.map +1 -0
- package/dist/es/components/Alert/Alert.js +32 -0
- package/dist/es/components/Alert/Alert.js.map +1 -0
- package/dist/es/components/Badge/Badge.js +31 -0
- package/dist/es/components/Badge/Badge.js.map +1 -0
- package/dist/es/components/Banner/Banner.js +39 -0
- package/dist/es/components/Banner/Banner.js.map +1 -0
- package/dist/es/components/BodyText/BodyText.js +57 -0
- package/dist/es/components/BodyText/BodyText.js.map +1 -0
- package/dist/es/components/BottomNavigation/BottomNavigation.js +50 -0
- package/dist/es/components/BottomNavigation/BottomNavigation.js.map +1 -0
- package/dist/es/components/Breadcrumb/Breadcrumb.js +61 -0
- package/dist/es/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/es/components/Button/Button.js +116 -0
- package/dist/es/components/Button/Button.js.map +1 -0
- package/dist/es/components/ButtonGroup/ButtonGroup.js +98 -0
- package/dist/es/components/ButtonGroup/ButtonGroup.js.map +1 -0
- package/dist/es/components/Card/Card.js +57 -0
- package/dist/es/components/Card/Card.js.map +1 -0
- package/dist/es/components/Checkbox/Checkbox.js +62 -0
- package/dist/es/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/es/components/CheckboxGroup/CheckboxGroup.js +80 -0
- package/dist/es/components/CheckboxGroup/CheckboxGroup.js.map +1 -0
- package/dist/es/components/DataList/DataList.js +285 -0
- package/dist/es/components/DataList/DataList.js.map +1 -0
- package/dist/es/components/DataTable/DataTable.icons.js +17 -0
- package/dist/es/components/DataTable/DataTable.icons.js.map +1 -0
- package/dist/es/components/DataTable/DataTable.js +108 -0
- package/dist/es/components/DataTable/DataTable.js.map +1 -0
- package/dist/es/components/DataTable/DataTable.utils.js +83 -0
- package/dist/es/components/DataTable/DataTable.utils.js.map +1 -0
- package/dist/es/components/DetailedInformation/DetailedInformation.js +65 -0
- package/dist/es/components/DetailedInformation/DetailedInformation.js.map +1 -0
- package/dist/es/components/Dot/index.js +10 -0
- package/dist/es/components/Dot/index.js.map +1 -0
- package/dist/es/components/Drawer/Drawer.js +65 -0
- package/dist/es/components/Drawer/Drawer.js.map +1 -0
- package/dist/es/components/Dropdown/Dropdown.js +48 -0
- package/dist/es/components/Dropdown/Dropdown.js.map +1 -0
- package/dist/es/components/EmptyState/index.js +12 -0
- package/dist/es/components/EmptyState/index.js.map +1 -0
- package/dist/es/components/Flex/Flex.js +22 -0
- package/dist/es/components/Flex/Flex.js.map +1 -0
- package/dist/es/components/FloatingActionButton/FloatingActionButton.js +69 -0
- package/dist/es/components/FloatingActionButton/FloatingActionButton.js.map +1 -0
- package/dist/es/components/Grid/Grid.js +30 -0
- package/dist/es/components/Grid/Grid.js.map +1 -0
- package/dist/es/components/HeadingText/HeadingText.js +87 -0
- package/dist/es/components/HeadingText/HeadingText.js.map +1 -0
- package/dist/es/components/Icons/ArrowDownAZ.svg.js +23 -0
- package/dist/es/components/Icons/ArrowDownAZ.svg.js.map +1 -0
- package/dist/es/components/Icons/ArrowDownNarrowWide.svg.js +23 -0
- package/dist/es/components/Icons/ArrowDownNarrowWide.svg.js.map +1 -0
- package/dist/es/components/Icons/ArrowDownWideNarrow.svg.js +23 -0
- package/dist/es/components/Icons/ArrowDownWideNarrow.svg.js.map +1 -0
- package/dist/es/components/Icons/ArrowDownZA.svg.js +23 -0
- package/dist/es/components/Icons/ArrowDownZA.svg.js.map +1 -0
- package/dist/es/components/Icons/ArrowUpDown.svg.js +23 -0
- package/dist/es/components/Icons/ArrowUpDown.svg.js.map +1 -0
- package/dist/es/components/Icons/BadgeCheck.svg.js +25 -0
- package/dist/es/components/Icons/BadgeCheck.svg.js.map +1 -0
- package/dist/es/components/Icons/Check.svg.js +23 -0
- package/dist/es/components/Icons/Check.svg.js.map +1 -0
- package/dist/es/components/Icons/ChevronDown.svg.js +23 -0
- package/dist/es/components/Icons/ChevronDown.svg.js.map +1 -0
- package/dist/es/components/Icons/ChevronLeft.svg.js +23 -0
- package/dist/es/components/Icons/ChevronLeft.svg.js.map +1 -0
- package/dist/es/components/Icons/ChevronRight.svg.js +23 -0
- package/dist/es/components/Icons/ChevronRight.svg.js.map +1 -0
- package/dist/es/components/Icons/CircleAlert.svg.js +27 -0
- package/dist/es/components/Icons/CircleAlert.svg.js.map +1 -0
- package/dist/es/components/Icons/CircleCheck.svg.js +27 -0
- package/dist/es/components/Icons/CircleCheck.svg.js.map +1 -0
- package/dist/es/components/Icons/CirclePlus.svg.js +27 -0
- package/dist/es/components/Icons/CirclePlus.svg.js.map +1 -0
- package/dist/es/components/Icons/CircleX.svg.js +27 -0
- package/dist/es/components/Icons/CircleX.svg.js.map +1 -0
- package/dist/es/components/Icons/FolderPlus.svg.js +23 -0
- package/dist/es/components/Icons/FolderPlus.svg.js.map +1 -0
- package/dist/es/components/Icons/Info.svg.js +27 -0
- package/dist/es/components/Icons/Info.svg.js.map +1 -0
- package/dist/es/components/Icons/Search.svg.js +27 -0
- package/dist/es/components/Icons/Search.svg.js.map +1 -0
- package/dist/es/components/Icons/Slash.svg.js +23 -0
- package/dist/es/components/Icons/Slash.svg.js.map +1 -0
- package/dist/es/components/Icons/TriangleAlert.svg.js +23 -0
- package/dist/es/components/Icons/TriangleAlert.svg.js.map +1 -0
- package/dist/es/components/Icons/X.svg.js +23 -0
- package/dist/es/components/Icons/X.svg.js.map +1 -0
- package/dist/es/components/Input/Input.js +82 -0
- package/dist/es/components/Input/Input.js.map +1 -0
- package/dist/es/components/Label/Label.js +12 -0
- package/dist/es/components/Label/Label.js.map +1 -0
- package/dist/es/components/Loader/index.js +16 -0
- package/dist/es/components/Loader/index.js.map +1 -0
- package/dist/es/components/MobileHeader/MobileHeader.js +43 -0
- package/dist/es/components/MobileHeader/MobileHeader.js.map +1 -0
- package/dist/es/components/MobilePicker/MobilePicker.js +366 -0
- package/dist/es/components/MobilePicker/MobilePicker.js.map +1 -0
- package/dist/es/components/MobileStepper/MobileStepper.js +31 -0
- package/dist/es/components/MobileStepper/MobileStepper.js.map +1 -0
- package/dist/es/components/Pagination/Pagination.js +31 -0
- package/dist/es/components/Pagination/Pagination.js.map +1 -0
- package/dist/es/components/Pagination/usePagination.js +30 -0
- package/dist/es/components/Pagination/usePagination.js.map +1 -0
- package/dist/es/components/PasswordInput/PasswordInput.js +51 -0
- package/dist/es/components/PasswordInput/PasswordInput.js.map +1 -0
- package/dist/es/components/PinInput/PinInput.js +96 -0
- package/dist/es/components/PinInput/PinInput.js.map +1 -0
- package/dist/es/components/PullToRefresh/PullToRefresh.js +81 -0
- package/dist/es/components/PullToRefresh/PullToRefresh.js.map +1 -0
- package/dist/es/components/QuantityStepper/QuantityStepper.js +75 -0
- package/dist/es/components/QuantityStepper/QuantityStepper.js.map +1 -0
- package/dist/es/components/Radio/Radio.js +32 -0
- package/dist/es/components/Radio/Radio.js.map +1 -0
- package/dist/es/components/RadioGroup/RadioGroup.js +48 -0
- package/dist/es/components/RadioGroup/RadioGroup.js.map +1 -0
- package/dist/es/components/RadioSwitch/RadioSwitch.js +114 -0
- package/dist/es/components/RadioSwitch/RadioSwitch.js.map +1 -0
- package/dist/es/components/RangeInput/RangeInput.js +64 -0
- package/dist/es/components/RangeInput/RangeInput.js.map +1 -0
- package/dist/es/components/RangeSlider/RangeSlider.js +165 -0
- package/dist/es/components/RangeSlider/RangeSlider.js.map +1 -0
- package/dist/es/components/SegmentedControl/SegmentedControl.js +62 -0
- package/dist/es/components/SegmentedControl/SegmentedControl.js.map +1 -0
- package/dist/es/components/SelectBox/SelectBox.js +303 -0
- package/dist/es/components/SelectBox/SelectBox.js.map +1 -0
- package/dist/es/components/Skeleton/Skeleton.js +34 -0
- package/dist/es/components/Skeleton/Skeleton.js.map +1 -0
- package/dist/es/components/StatusPill/StatusPill.js +44 -0
- package/dist/es/components/StatusPill/StatusPill.js.map +1 -0
- package/dist/es/components/StickyActionBar/StickyActionBar.js +20 -0
- package/dist/es/components/StickyActionBar/StickyActionBar.js.map +1 -0
- package/dist/es/components/SwipeableRow/SwipeableRow.js +185 -0
- package/dist/es/components/SwipeableRow/SwipeableRow.js.map +1 -0
- package/dist/es/components/SwipeableTabs/SwipeableTabs.js +89 -0
- package/dist/es/components/SwipeableTabs/SwipeableTabs.js.map +1 -0
- package/dist/es/components/Table/Table.js +48 -0
- package/dist/es/components/Table/Table.js.map +1 -0
- package/dist/es/components/Tabs/Tabs.js +51 -0
- package/dist/es/components/Tabs/Tabs.js.map +1 -0
- package/dist/es/components/TextContent/TextContent.js +45 -0
- package/dist/es/components/TextContent/TextContent.js.map +1 -0
- package/dist/es/components/Textarea/Textarea.js +62 -0
- package/dist/es/components/Textarea/Textarea.js.map +1 -0
- package/dist/es/components/Toast/Toast.js +94 -0
- package/dist/es/components/Toast/Toast.js.map +1 -0
- package/dist/es/components/Toast/ToastProvider.js +148 -0
- package/dist/es/components/Toast/ToastProvider.js.map +1 -0
- package/dist/es/components/VirtualizedDataTable/VirtualizedDataTable.js +120 -0
- package/dist/es/components/VirtualizedDataTable/VirtualizedDataTable.js.map +1 -0
- package/dist/es/components/VirtualizedDataTable/VirtualizedRow.js +46 -0
- package/dist/es/components/VirtualizedDataTable/VirtualizedRow.js.map +1 -0
- package/dist/es/components/WheelPicker/WheelPicker.js +80 -0
- package/dist/es/components/WheelPicker/WheelPicker.js.map +1 -0
- package/dist/es/components/common-responsive.js +287 -0
- package/dist/es/components/common-responsive.js.map +1 -0
- package/dist/es/hooks/use-debounce.js +28 -0
- package/dist/es/hooks/use-debounce.js.map +1 -0
- package/dist/es/hooks/use-is-mobile.js +22 -0
- package/dist/es/hooks/use-is-mobile.js.map +1 -0
- package/dist/es/hooks/use-is-tablet-or-mobile.js +11 -0
- package/dist/es/hooks/use-is-tablet-or-mobile.js.map +1 -0
- package/dist/es/hooks/use-is-tablet.js +19 -0
- package/dist/es/hooks/use-is-tablet.js.map +1 -0
- package/dist/es/index.js +67 -0
- package/dist/es/index.js.map +1 -0
- package/dist/es/react-tailwind.css +2 -0
- package/dist/es/react-tailwind.css.map +1 -0
- package/dist/es/utils/build-classname.js +6 -0
- package/dist/es/utils/build-classname.js.map +1 -0
- package/dist/es/utils/get.js +18 -0
- package/dist/es/utils/get.js.map +1 -0
- package/dist/es/utils/is-array.js +10 -0
- package/dist/es/utils/is-array.js.map +1 -0
- package/dist/es/utils/is-empty.js +24 -0
- package/dist/es/utils/is-empty.js.map +1 -0
- package/dist/react-tailwind.cjs.js +2298 -472
- package/dist/react-tailwind.cjs.js.map +1 -1
- package/dist/react-tailwind.es.js +2284 -474
- package/dist/react-tailwind.es.js.map +1 -1
- package/dist/types/components/ActionSheet/ActionSheet.d.ts +5 -0
- package/dist/types/components/ActionSheet/ActionSheet.test.d.ts +1 -0
- package/dist/types/components/ActionSheet/ActionSheet.types.d.ts +44 -0
- package/dist/types/components/ActionSheet/index.d.ts +2 -0
- package/dist/types/components/Badge/Badge.types.d.ts +1 -1
- package/dist/types/components/BottomNavigation/BottomNavigation.d.ts +5 -0
- package/dist/types/components/BottomNavigation/BottomNavigation.test.d.ts +1 -0
- package/dist/types/components/BottomNavigation/BottomNavigation.types.d.ts +41 -0
- package/dist/types/components/BottomNavigation/index.d.ts +2 -0
- package/dist/types/components/Card/Card.types.d.ts +25 -0
- package/dist/types/components/DataList/DataList.d.ts +5 -0
- package/dist/types/components/DataList/DataList.test.d.ts +1 -0
- package/dist/types/components/DataList/DataList.types.d.ts +81 -0
- package/dist/types/components/DataList/index.d.ts +2 -0
- package/dist/types/components/DataTable/DataTable.d.ts +1 -1
- package/dist/types/components/DataTable/DataTable.types.d.ts +10 -0
- package/dist/types/components/Flex/Flex.d.ts +3 -0
- package/dist/types/components/Flex/Flex.test.d.ts +1 -0
- package/dist/types/components/Flex/Flex.types.d.ts +92 -0
- package/dist/types/components/Flex/index.d.ts +2 -0
- package/dist/types/components/FloatingActionButton/FloatingActionButton.d.ts +5 -0
- package/dist/types/components/FloatingActionButton/FloatingActionButton.test.d.ts +1 -0
- package/dist/types/components/FloatingActionButton/FloatingActionButton.types.d.ts +48 -0
- package/dist/types/components/FloatingActionButton/index.d.ts +2 -0
- package/dist/types/components/Grid/Grid.d.ts +3 -0
- package/dist/types/components/Grid/Grid.test.d.ts +1 -0
- package/dist/types/components/Grid/Grid.types.d.ts +136 -0
- package/dist/types/components/Grid/index.d.ts +2 -0
- package/dist/types/components/Input/Input.types.d.ts +3 -3
- package/dist/types/components/MobileHeader/MobileHeader.d.ts +5 -0
- package/dist/types/components/MobileHeader/MobileHeader.test.d.ts +1 -0
- package/dist/types/components/MobileHeader/MobileHeader.types.d.ts +49 -0
- package/dist/types/components/MobileHeader/index.d.ts +2 -0
- package/dist/types/components/MobilePicker/MobilePicker.d.ts +6 -0
- package/dist/types/components/MobilePicker/MobilePicker.test.d.ts +1 -0
- package/dist/types/components/MobilePicker/MobilePicker.types.d.ts +90 -0
- package/dist/types/components/MobilePicker/index.d.ts +2 -0
- package/dist/types/components/MobileStepper/MobileStepper.d.ts +5 -0
- package/dist/types/components/MobileStepper/MobileStepper.test.d.ts +1 -0
- package/dist/types/components/MobileStepper/MobileStepper.types.d.ts +28 -0
- package/dist/types/components/MobileStepper/index.d.ts +2 -0
- package/dist/types/components/PinInput/PinInput.d.ts +5 -0
- package/dist/types/components/PinInput/PinInput.test.d.ts +1 -0
- package/dist/types/components/PinInput/PinInput.types.d.ts +29 -0
- package/dist/types/components/PinInput/index.d.ts +2 -0
- package/dist/types/components/PullToRefresh/PullToRefresh.d.ts +5 -0
- package/dist/types/components/PullToRefresh/PullToRefresh.test.d.ts +1 -0
- package/dist/types/components/PullToRefresh/PullToRefresh.types.d.ts +23 -0
- package/dist/types/components/PullToRefresh/index.d.ts +2 -0
- package/dist/types/components/QuantityStepper/QuantityStepper.types.d.ts +18 -1
- package/dist/types/components/SelectBox/SelectBox.types.d.ts +9 -0
- package/dist/types/components/SwipeableRow/SwipeableRow.d.ts +3 -0
- package/dist/types/components/SwipeableRow/SwipeableRow.test.d.ts +1 -0
- package/dist/types/components/SwipeableRow/SwipeableRow.types.d.ts +42 -0
- package/dist/types/components/SwipeableRow/index.d.ts +2 -0
- package/dist/types/components/SwipeableTabs/SwipeableTabs.d.ts +5 -0
- package/dist/types/components/SwipeableTabs/SwipeableTabs.test.d.ts +1 -0
- package/dist/types/components/SwipeableTabs/SwipeableTabs.types.d.ts +38 -0
- package/dist/types/components/SwipeableTabs/index.d.ts +2 -0
- package/dist/types/components/WheelPicker/WheelPicker.d.ts +5 -0
- package/dist/types/components/WheelPicker/WheelPicker.test.d.ts +1 -0
- package/dist/types/components/WheelPicker/WheelPicker.types.d.ts +35 -0
- package/dist/types/components/WheelPicker/index.d.ts +2 -0
- package/dist/types/components/common-responsive.d.ts +57 -0
- package/dist/types/index.d.ts +14 -0
- package/package.json +11 -3
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var react = require('@headlessui/react');
|
|
6
|
+
var buildClassname = require('../../utils/build-classname.js');
|
|
7
|
+
var Input = require('../Input/Input.js');
|
|
8
|
+
var Badge = require('../Badge/Badge.js');
|
|
9
|
+
var Button = require('../Button/Button.js');
|
|
10
|
+
var Label = require('../Label/Label.js');
|
|
11
|
+
var index = require('../Loader/index.js');
|
|
12
|
+
var TextContent = require('../TextContent/TextContent.js');
|
|
13
|
+
var useDebounce = require('../../hooks/use-debounce.js');
|
|
14
|
+
var Check = require('../Icons/Check.svg.js');
|
|
15
|
+
var ChevronDown = require('../Icons/ChevronDown.svg.js');
|
|
16
|
+
var CirclePlus = require('../Icons/CirclePlus.svg.js');
|
|
17
|
+
var Search = require('../Icons/Search.svg.js');
|
|
18
|
+
var X = require('../Icons/X.svg.js');
|
|
19
|
+
|
|
20
|
+
const sizeConfigMap = {
|
|
21
|
+
sm: {
|
|
22
|
+
input: 'h-8 text-xs px-2.5',
|
|
23
|
+
icon: 'size-3.5',
|
|
24
|
+
badgeSize: 'sm',
|
|
25
|
+
group: 'w-8',
|
|
26
|
+
},
|
|
27
|
+
md: {
|
|
28
|
+
input: 'h-10 text-sm px-3',
|
|
29
|
+
icon: 'size-4',
|
|
30
|
+
badgeSize: 'md',
|
|
31
|
+
group: 'w-10',
|
|
32
|
+
},
|
|
33
|
+
lg: {
|
|
34
|
+
input: 'h-12 text-base px-3.5',
|
|
35
|
+
icon: 'size-5',
|
|
36
|
+
badgeSize: 'md',
|
|
37
|
+
group: 'w-12',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
function MobilePicker(props) {
|
|
41
|
+
const { options = [], groups, selected = null, onChange = () => { }, size = 'md', labelKey = 'label', valueKey = 'value', id, name, label, labelWrapperClass, labelClass, labelHint, title, description, placeholder = 'Choose an option...', disabled = false, multiple = false, maxSelection, showSelectAll = false, confirmText = 'Apply Selection', searchable = true, searchPlaceholder = 'Search options...', async = false, onSearch, loading = false, typeToSearchText = 'Type to search options...', filterOption, quickOptions, quickOptionsTitle = 'Quick Picks', allowClear = false, allowFreeText = false, allowAdd = false, addNewText = 'Create', onAdd = () => { }, leftGroup, error, showErrorMessage = true, helperText, noOptionsText = 'No options available', renderOption, containerClass, sheetClass, } = props;
|
|
42
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
43
|
+
const [query, setQuery] = React.useState('');
|
|
44
|
+
const debouncedQuery = useDebounce.useDebounce(query, 400);
|
|
45
|
+
const [optionsLoading, setOptionsLoading] = React.useState(false);
|
|
46
|
+
const [draftSelected, setDraftSelected] = React.useState(selected);
|
|
47
|
+
const [viewportHeight, setViewportHeight] = React.useState(null);
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
if (!isOpen) {
|
|
50
|
+
setViewportHeight(null);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const updateHeight = () => {
|
|
54
|
+
if (typeof window !== 'undefined' && window.visualViewport) {
|
|
55
|
+
setViewportHeight(window.visualViewport.height);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
updateHeight();
|
|
59
|
+
const vv = typeof window !== 'undefined' ? window.visualViewport : null;
|
|
60
|
+
vv === null || vv === void 0 ? void 0 : vv.addEventListener('resize', updateHeight);
|
|
61
|
+
vv === null || vv === void 0 ? void 0 : vv.addEventListener('scroll', updateHeight);
|
|
62
|
+
return () => {
|
|
63
|
+
vv === null || vv === void 0 ? void 0 : vv.removeEventListener('resize', updateHeight);
|
|
64
|
+
vv === null || vv === void 0 ? void 0 : vv.removeEventListener('scroll', updateHeight);
|
|
65
|
+
};
|
|
66
|
+
}, [isOpen]);
|
|
67
|
+
const currentSize = sizeConfigMap[size] || sizeConfigMap.md;
|
|
68
|
+
const hasError = Boolean(error);
|
|
69
|
+
const isAsyncLoading = loading || optionsLoading;
|
|
70
|
+
const baseInputClass = React.useMemo(() => Input.buildInputClass('', { disabled, hasError, size }), [disabled, hasError, size]);
|
|
71
|
+
const onSearchRef = React.useRef(onSearch);
|
|
72
|
+
React.useEffect(() => {
|
|
73
|
+
onSearchRef.current = onSearch;
|
|
74
|
+
}, [onSearch]);
|
|
75
|
+
const handleAsyncSearch = React.useCallback(async (searchString) => {
|
|
76
|
+
var _a;
|
|
77
|
+
try {
|
|
78
|
+
setOptionsLoading(true);
|
|
79
|
+
await ((_a = onSearchRef.current) === null || _a === void 0 ? void 0 : _a.call(onSearchRef, searchString));
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error('Error loading options:', err);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
setOptionsLoading(false);
|
|
86
|
+
}
|
|
87
|
+
}, []);
|
|
88
|
+
React.useEffect(() => {
|
|
89
|
+
if (isOpen && async) {
|
|
90
|
+
handleAsyncSearch(debouncedQuery);
|
|
91
|
+
}
|
|
92
|
+
}, [isOpen, async, debouncedQuery, handleAsyncSearch]);
|
|
93
|
+
const getDisplayValue = React.useCallback((opt) => {
|
|
94
|
+
var _a, _b;
|
|
95
|
+
if (typeof opt === 'string')
|
|
96
|
+
return opt;
|
|
97
|
+
return (_b = (_a = opt === null || opt === void 0 ? void 0 : opt[labelKey]) !== null && _a !== void 0 ? _a : opt === null || opt === void 0 ? void 0 : opt[valueKey]) !== null && _b !== void 0 ? _b : String(opt);
|
|
98
|
+
}, [labelKey, valueKey]);
|
|
99
|
+
const getValue = React.useCallback((opt) => {
|
|
100
|
+
var _a, _b;
|
|
101
|
+
if (typeof opt === 'string')
|
|
102
|
+
return opt;
|
|
103
|
+
return (_b = (_a = opt === null || opt === void 0 ? void 0 : opt[valueKey]) !== null && _a !== void 0 ? _a : opt === null || opt === void 0 ? void 0 : opt[labelKey]) !== null && _b !== void 0 ? _b : String(opt);
|
|
104
|
+
}, [valueKey, labelKey]);
|
|
105
|
+
const normalizedSelected = React.useMemo(() => {
|
|
106
|
+
if (multiple) {
|
|
107
|
+
if (Array.isArray(selected))
|
|
108
|
+
return selected;
|
|
109
|
+
if (selected !== null && selected !== undefined)
|
|
110
|
+
return [selected];
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
if (Array.isArray(selected))
|
|
115
|
+
return selected.length > 0 ? selected[0] : null;
|
|
116
|
+
return selected !== null && selected !== void 0 ? selected : null;
|
|
117
|
+
}
|
|
118
|
+
}, [multiple, selected]);
|
|
119
|
+
const normalizedDraft = React.useMemo(() => {
|
|
120
|
+
if (multiple) {
|
|
121
|
+
if (Array.isArray(draftSelected))
|
|
122
|
+
return draftSelected;
|
|
123
|
+
if (draftSelected !== null && draftSelected !== undefined)
|
|
124
|
+
return [draftSelected];
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
if (Array.isArray(draftSelected))
|
|
129
|
+
return draftSelected.length > 0 ? draftSelected[0] : null;
|
|
130
|
+
return draftSelected !== null && draftSelected !== void 0 ? draftSelected : null;
|
|
131
|
+
}
|
|
132
|
+
}, [multiple, draftSelected]);
|
|
133
|
+
const rawAllOptions = React.useMemo(() => {
|
|
134
|
+
if (groups === null || groups === void 0 ? void 0 : groups.length) {
|
|
135
|
+
return groups.flatMap((g) => g.options);
|
|
136
|
+
}
|
|
137
|
+
return options !== null && options !== void 0 ? options : [];
|
|
138
|
+
}, [groups, options]);
|
|
139
|
+
const allOptions = React.useMemo(() => {
|
|
140
|
+
const list = [...rawAllOptions];
|
|
141
|
+
const selectedList = Array.isArray(normalizedDraft)
|
|
142
|
+
? normalizedDraft
|
|
143
|
+
: normalizedDraft
|
|
144
|
+
? [normalizedDraft]
|
|
145
|
+
: [];
|
|
146
|
+
for (const sel of selectedList) {
|
|
147
|
+
if (sel !== null && sel !== undefined) {
|
|
148
|
+
const selVal = getValue(sel);
|
|
149
|
+
const exists = list.some((item) => getValue(item) === selVal);
|
|
150
|
+
if (!exists) {
|
|
151
|
+
list.unshift(sel);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return list;
|
|
156
|
+
}, [rawAllOptions, normalizedDraft, getValue]);
|
|
157
|
+
React.useEffect(() => {
|
|
158
|
+
if (isOpen) {
|
|
159
|
+
setDraftSelected(normalizedSelected);
|
|
160
|
+
setQuery('');
|
|
161
|
+
}
|
|
162
|
+
}, [isOpen, normalizedSelected]);
|
|
163
|
+
const defaultFilter = React.useCallback((opt, q) => {
|
|
164
|
+
var _a;
|
|
165
|
+
if (!q.trim())
|
|
166
|
+
return true;
|
|
167
|
+
const searchTarget = ((_a = getDisplayValue(opt)) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
|
|
168
|
+
return searchTarget.includes(q.trim().toLowerCase());
|
|
169
|
+
}, [getDisplayValue]);
|
|
170
|
+
const activeFilter = filterOption || defaultFilter;
|
|
171
|
+
const filteredOptions = React.useMemo(() => {
|
|
172
|
+
if (async)
|
|
173
|
+
return allOptions;
|
|
174
|
+
if (!query.trim())
|
|
175
|
+
return allOptions;
|
|
176
|
+
return allOptions.filter((opt) => activeFilter(opt, query));
|
|
177
|
+
}, [allOptions, query, async, activeFilter]);
|
|
178
|
+
const filteredGroups = React.useMemo(() => {
|
|
179
|
+
if (!(groups === null || groups === void 0 ? void 0 : groups.length))
|
|
180
|
+
return null;
|
|
181
|
+
if (async)
|
|
182
|
+
return groups;
|
|
183
|
+
if (!query.trim())
|
|
184
|
+
return groups;
|
|
185
|
+
return groups
|
|
186
|
+
.map((g) => ({
|
|
187
|
+
...g,
|
|
188
|
+
options: g.options.filter((opt) => activeFilter(opt, query)),
|
|
189
|
+
}))
|
|
190
|
+
.filter((g) => g.options.length > 0);
|
|
191
|
+
}, [groups, query, async, activeFilter]);
|
|
192
|
+
const createFreeTextOption = React.useCallback((text) => {
|
|
193
|
+
const sample = allOptions[0] || (Array.isArray(selected) ? selected[0] : selected);
|
|
194
|
+
if (typeof sample === 'string' ||
|
|
195
|
+
(!sample && typeof labelKey === 'string' && labelKey === 'label')) {
|
|
196
|
+
return text;
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
[labelKey]: text,
|
|
200
|
+
[valueKey]: text,
|
|
201
|
+
};
|
|
202
|
+
}, [allOptions, selected, labelKey, valueKey]);
|
|
203
|
+
const handleToggleOption = (option) => {
|
|
204
|
+
const optVal = getValue(option);
|
|
205
|
+
if (multiple) {
|
|
206
|
+
const current = Array.isArray(normalizedDraft) ? [...normalizedDraft] : [];
|
|
207
|
+
const index = current.findIndex((item) => getValue(item) === optVal);
|
|
208
|
+
if (index > -1) {
|
|
209
|
+
current.splice(index, 1);
|
|
210
|
+
setDraftSelected(current);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
if (maxSelection && current.length >= maxSelection)
|
|
214
|
+
return;
|
|
215
|
+
current.push(option);
|
|
216
|
+
setDraftSelected(current);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
setDraftSelected(option);
|
|
221
|
+
onChange(option);
|
|
222
|
+
setIsOpen(false);
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
const handleCommitFreeText = (text) => {
|
|
226
|
+
const trimmed = text.trim();
|
|
227
|
+
if (!trimmed)
|
|
228
|
+
return;
|
|
229
|
+
const existing = allOptions.find((opt) => getDisplayValue(opt).toLowerCase() === trimmed.toLowerCase());
|
|
230
|
+
const optionToCommit = existing || createFreeTextOption(trimmed);
|
|
231
|
+
if (multiple) {
|
|
232
|
+
const current = Array.isArray(normalizedDraft) ? [...normalizedDraft] : [];
|
|
233
|
+
const already = current.some((item) => getDisplayValue(item).toLowerCase() === trimmed.toLowerCase());
|
|
234
|
+
if (!already) {
|
|
235
|
+
if (maxSelection && current.length >= maxSelection)
|
|
236
|
+
return;
|
|
237
|
+
current.push(optionToCommit);
|
|
238
|
+
setDraftSelected(current);
|
|
239
|
+
}
|
|
240
|
+
setQuery('');
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
setDraftSelected(optionToCommit);
|
|
244
|
+
onChange(optionToCommit);
|
|
245
|
+
setIsOpen(false);
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
const handleAddAndSelect = async (valueToAdd) => {
|
|
249
|
+
try {
|
|
250
|
+
const result = await onAdd(valueToAdd);
|
|
251
|
+
const optionToCommit = (result || valueToAdd);
|
|
252
|
+
if (multiple) {
|
|
253
|
+
const current = Array.isArray(normalizedDraft) ? [...normalizedDraft] : [];
|
|
254
|
+
current.push(optionToCommit);
|
|
255
|
+
setDraftSelected(current);
|
|
256
|
+
setQuery('');
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
setDraftSelected(optionToCommit);
|
|
260
|
+
onChange(optionToCommit);
|
|
261
|
+
setIsOpen(false);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
console.error('MobilePicker onAdd error:', err);
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
const isAllSelected = React.useMemo(() => {
|
|
269
|
+
if (!multiple || !Array.isArray(normalizedDraft) || !allOptions.length)
|
|
270
|
+
return false;
|
|
271
|
+
return allOptions.length === normalizedDraft.length;
|
|
272
|
+
}, [multiple, normalizedDraft, allOptions]);
|
|
273
|
+
const handleToggleSelectAll = () => {
|
|
274
|
+
if (isAllSelected) {
|
|
275
|
+
setDraftSelected([]);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
setDraftSelected(allOptions);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
const handleConfirmMultiSelect = () => {
|
|
282
|
+
onChange(normalizedDraft);
|
|
283
|
+
setIsOpen(false);
|
|
284
|
+
};
|
|
285
|
+
const handleClearSingleSelect = (e) => {
|
|
286
|
+
e.preventDefault();
|
|
287
|
+
e.stopPropagation();
|
|
288
|
+
setDraftSelected(multiple ? [] : null);
|
|
289
|
+
onChange(multiple ? [] : null);
|
|
290
|
+
};
|
|
291
|
+
const handleTriggerClick = (e) => {
|
|
292
|
+
if (disabled)
|
|
293
|
+
return;
|
|
294
|
+
const isClearClick = e.target.closest('[data-testid="mobile-picker-clear-button"]');
|
|
295
|
+
if (isClearClick)
|
|
296
|
+
return;
|
|
297
|
+
setIsOpen(true);
|
|
298
|
+
};
|
|
299
|
+
const isOptionSelected = (option) => {
|
|
300
|
+
const optVal = getValue(option);
|
|
301
|
+
if (multiple) {
|
|
302
|
+
return (Array.isArray(normalizedDraft) && normalizedDraft.some((item) => getValue(item) === optVal));
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
return Boolean(normalizedDraft && getValue(normalizedDraft) === optVal);
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
const shouldShowTypeToSearch = async && !query && !isAsyncLoading && allOptions.length === 0;
|
|
309
|
+
const hasLeftGroup = leftGroup != null && leftGroup !== undefined;
|
|
310
|
+
return (jsxRuntime.jsxs("div", { className: buildClassname.buildClassName('group space-y-2 w-full', containerClass), children: [label && (jsxRuntime.jsxs("div", { className: buildClassname.buildClassName('flex items-center justify-between', labelWrapperClass), children: [jsxRuntime.jsx(Label.Label, { className: labelClass, htmlFor: id, children: label }), labelHint && jsxRuntime.jsx(TextContent.TextContent, { xsmall: true, children: labelHint })] })), jsxRuntime.jsxs("button", { type: "button", id: id, name: name, disabled: disabled, onClick: handleTriggerClick, className: buildClassname.buildClassName(baseInputClass, 'w-full flex items-center justify-between gap-2 cursor-pointer relative text-left', hasLeftGroup ? (size === 'lg' ? 'ps-12' : size === 'sm' ? 'ps-8' : 'ps-10') : ''), "data-testid": "mobile-picker-trigger", children: [hasLeftGroup && (jsxRuntime.jsx("span", { className: buildClassname.buildClassName('absolute left-0 top-0 h-full flex items-center justify-center text-gray-400 dark:text-gray-500', currentSize.group), children: leftGroup })), jsxRuntime.jsx("div", { className: "flex-1 flex flex-wrap items-center gap-1.5 min-w-0 overflow-hidden", children: multiple ? (Array.isArray(normalizedSelected) && normalizedSelected.length > 0 ? (normalizedSelected.map((item, idx) => (jsxRuntime.jsx(Badge.Badge, { theme: "secondary", size: currentSize.badgeSize, children: getDisplayValue(item) }, `${getValue(item)}-${idx}`)))) : (jsxRuntime.jsx("span", { className: "text-gray-400 dark:text-gray-500", children: placeholder }))) : normalizedSelected ? (jsxRuntime.jsx("span", { className: "text-gray-900 dark:text-white font-normal truncate", children: getDisplayValue(normalizedSelected) })) : (jsxRuntime.jsx("span", { className: "text-gray-400 dark:text-gray-500", children: placeholder })) }), jsxRuntime.jsxs("div", { className: "flex items-center gap-1 shrink-0", children: [allowClear && !multiple && normalizedSelected && (jsxRuntime.jsx("span", { role: "button", "aria-label": "Clear selection", tabIndex: 0, onClick: handleClearSingleSelect, className: "p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-full cursor-pointer z-10", "data-testid": "mobile-picker-clear-button", children: jsxRuntime.jsx(X.default, { className: "size-3.5 stroke-gray-500 dark:stroke-gray-400" }) })), jsxRuntime.jsx(ChevronDown.default, { className: buildClassname.buildClassName(currentSize.icon, 'stroke-gray-500 shrink-0') })] })] }), showErrorMessage && error && (jsxRuntime.jsx("div", { className: "mt-1", children: jsxRuntime.jsx(TextContent.TextContent, { error: true, small: true, children: error }) })), !error && helperText && (jsxRuntime.jsx("div", { className: "mt-1", children: jsxRuntime.jsx(TextContent.TextContent, { muted: true, small: true, children: helperText }) })), jsxRuntime.jsxs(react.Dialog, { open: isOpen, as: "div", className: "relative z-50 focus:outline-none", onClose: () => setIsOpen(false), transition: true, children: [jsxRuntime.jsx(react.DialogBackdrop, { className: "fixed inset-0 bg-black/50 backdrop-blur-xs transition-opacity duration-200" }), jsxRuntime.jsx("div", { className: "fixed left-0 top-0 w-full flex items-end justify-center pointer-events-none z-50", style: {
|
|
311
|
+
height: viewportHeight ? `${viewportHeight}px` : '100dvh',
|
|
312
|
+
}, children: jsxRuntime.jsxs(react.DialogPanel, { transition: true, className: buildClassname.buildClassName('w-full max-w-full md:max-w-lg bg-white dark:bg-gray-900 shadow-2xl rounded-t-3xl max-h-[85vh] max-h-[85dvh] flex flex-col pointer-events-auto overscroll-contain touch-pan-y', 'duration-200 ease-out data-[closed]:translate-y-full data-[closed]:opacity-0', sheetClass), style: {
|
|
313
|
+
maxHeight: viewportHeight ? `${Math.floor(viewportHeight * 0.9)}px` : undefined,
|
|
314
|
+
}, "data-testid": "mobile-picker-sheet", children: [jsxRuntime.jsx("div", { className: "w-12 h-1.5 rounded-full bg-gray-300 dark:bg-gray-700 mx-auto my-2.5 shrink-0" }), jsxRuntime.jsxs("div", { className: "px-4 pb-3 border-b border-[var(--ui-border-muted)] flex items-center justify-between gap-3 shrink-0", children: [jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [jsxRuntime.jsx(react.DialogTitle, { as: "h3", className: "text-base md:text-lg font-bold text-gray-900 dark:text-white truncate", children: title || label || 'Select Option' }), description && (jsxRuntime.jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400 truncate mt-0.5", children: description }))] }), jsxRuntime.jsx(Button.Button, { iconOnly: true, "aria-label": "Close picker", variant: "plain", theme: "secondary", size: "xs", onClick: () => setIsOpen(false), className: "rounded-full text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 shrink-0", children: jsxRuntime.jsx(X.default, { className: "size-4" }) })] }), searchable && (jsxRuntime.jsx("div", { className: "p-3 border-b border-[var(--ui-border-muted)] bg-gray-50 dark:bg-gray-800/50 shrink-0", children: jsxRuntime.jsxs("div", { className: "relative", children: [jsxRuntime.jsx(Search.default, { className: "absolute left-3 top-1/2 -translate-y-1/2 size-4 text-gray-400" }), jsxRuntime.jsx("input", { type: "text", value: query, onChange: (e) => setQuery(e.target.value), onKeyDown: (e) => {
|
|
315
|
+
if (allowFreeText && e.key === 'Enter' && query.trim()) {
|
|
316
|
+
e.preventDefault();
|
|
317
|
+
handleCommitFreeText(query);
|
|
318
|
+
}
|
|
319
|
+
}, placeholder: searchPlaceholder, className: "w-full pl-9 pr-10 py-2 text-sm bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-xl text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500", "data-testid": "mobile-picker-search-input" }), jsxRuntime.jsx("div", { className: "absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1.5", children: isAsyncLoading ? (jsxRuntime.jsx(index.Loader, { size: "xs" })) : (query && (jsxRuntime.jsx("button", { type: "button", onClick: () => setQuery(''), className: "p-0.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200", children: jsxRuntime.jsx(X.default, { className: "size-3.5" }) }))) })] }) })), quickOptions && quickOptions.length > 0 && (jsxRuntime.jsxs("div", { className: "px-3 py-2 bg-gray-50/60 dark:bg-gray-800/40 border-b border-[var(--ui-border-muted)] shrink-0", children: [jsxRuntime.jsx("div", { className: "text-[11px] font-semibold text-gray-400 uppercase tracking-wider mb-1.5 px-1", children: quickOptionsTitle }), jsxRuntime.jsx("div", { className: "flex items-center gap-2 overflow-x-auto no-scrollbar pb-1", children: quickOptions.map((chip, cIdx) => {
|
|
320
|
+
const isSelected = isOptionSelected(chip);
|
|
321
|
+
return (jsxRuntime.jsx("button", { type: "button", onClick: () => handleToggleOption(chip), className: buildClassname.buildClassName('px-3 py-1 rounded-full text-xs font-medium shrink-0 transition-colors cursor-pointer border', isSelected
|
|
322
|
+
? 'bg-blue-600 text-white border-blue-600'
|
|
323
|
+
: 'bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-700 hover:bg-gray-100 dark:hover:bg-gray-700'), children: getDisplayValue(chip) }, cIdx));
|
|
324
|
+
}) })] })), multiple && showSelectAll && allOptions.length > 0 && (jsxRuntime.jsxs("div", { className: "px-4 py-2 bg-gray-50/80 dark:bg-gray-800/80 border-b border-[var(--ui-border-muted)] flex items-center justify-between text-xs shrink-0", children: [jsxRuntime.jsx("button", { type: "button", onClick: handleToggleSelectAll, className: "font-semibold text-blue-600 dark:text-blue-400 hover:underline cursor-pointer", children: isAllSelected ? 'Deselect All' : 'Select All' }), jsxRuntime.jsxs("span", { className: "text-gray-500 dark:text-gray-400 font-medium", children: [Array.isArray(normalizedDraft) ? normalizedDraft.length : 0, " of", ' ', allOptions.length] })] })), jsxRuntime.jsxs("div", { onScroll: (e) => {
|
|
325
|
+
const el = e.currentTarget;
|
|
326
|
+
if (el.scrollTop === 0) {
|
|
327
|
+
el.scrollTop = 1;
|
|
328
|
+
}
|
|
329
|
+
else if (el.scrollTop + el.clientHeight >= el.scrollHeight) {
|
|
330
|
+
el.scrollTop = el.scrollHeight - el.clientHeight - 1;
|
|
331
|
+
}
|
|
332
|
+
}, className: "flex-1 overflow-y-auto overscroll-contain touch-pan-y [-webkit-overflow-scrolling:touch] p-2 space-y-1 divide-y divide-gray-100 dark:divide-gray-800/60", children: [allowFreeText &&
|
|
333
|
+
query.trim() &&
|
|
334
|
+
!allOptions.some((opt) => getDisplayValue(opt).toLowerCase() === query.trim().toLowerCase()) && (jsxRuntime.jsxs("button", { type: "button", onClick: () => handleCommitFreeText(query), className: "w-full text-left flex items-center justify-between p-3.5 rounded-2xl bg-blue-50/80 dark:bg-blue-950/30 text-blue-600 dark:text-blue-400 font-medium hover:bg-blue-100/80 cursor-pointer", "data-testid": "mobile-picker-freetext-item", children: [jsxRuntime.jsxs("span", { className: "text-sm font-medium", children: ["Use \"", query.trim(), "\""] }), jsxRuntime.jsx(ChevronDown.default, { className: "size-4 rotate-[-90deg]" })] })), isAsyncLoading && allOptions.length === 0 ? (jsxRuntime.jsxs("div", { className: "py-12 flex flex-col items-center justify-center gap-2 text-sm text-gray-500 dark:text-gray-400 select-none", children: [jsxRuntime.jsx(index.Loader, { size: "md" }), jsxRuntime.jsx("span", { children: "Loading options..." })] })) : shouldShowTypeToSearch ? (jsxRuntime.jsx("div", { className: "py-12 text-center text-sm text-gray-500 dark:text-gray-400 select-none", children: typeToSearchText })) : filteredGroups ? (filteredGroups.map((grp, gIdx) => (jsxRuntime.jsxs("div", { className: "pt-2", children: [jsxRuntime.jsx("div", { className: "text-[11px] font-bold uppercase tracking-wider text-gray-400 dark:text-gray-500 px-3 py-1.5 select-none", children: grp.group }), jsxRuntime.jsx("div", { className: "space-y-1", children: grp.options.map((option) => {
|
|
335
|
+
const optVal = getValue(option);
|
|
336
|
+
const isSelected = isOptionSelected(option);
|
|
337
|
+
const optDisabled = option.disabled;
|
|
338
|
+
const optDesc = typeof option === 'object'
|
|
339
|
+
? (option === null || option === void 0 ? void 0 : option.description) || (option === null || option === void 0 ? void 0 : option.subtitle)
|
|
340
|
+
: null;
|
|
341
|
+
return (jsxRuntime.jsxs("div", { onClick: () => !optDisabled && handleToggleOption(option), className: buildClassname.buildClassName('w-full flex items-center justify-between p-3.5 rounded-2xl transition-colors cursor-pointer select-none', isSelected
|
|
342
|
+
? 'bg-blue-50 dark:bg-blue-950/40 text-blue-600 dark:text-blue-400 font-semibold'
|
|
343
|
+
: 'text-gray-800 dark:text-gray-100 hover:bg-gray-100 dark:hover:bg-gray-800/70', optDisabled && 'opacity-50 pointer-events-none'), children: [jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 pr-3", children: [jsxRuntime.jsx("div", { className: "text-sm/6 truncate", children: renderOption
|
|
344
|
+
? renderOption(option, isSelected)
|
|
345
|
+
: getDisplayValue(option) }), optDesc && (jsxRuntime.jsx("div", { className: "text-xs text-gray-400 font-normal truncate mt-0.5", children: optDesc }))] }), isSelected && (jsxRuntime.jsx(Check.default, { className: "size-5 stroke-blue-600 dark:stroke-blue-400 shrink-0" }))] }, optVal));
|
|
346
|
+
}) })] }, gIdx)))) : filteredOptions.length > 0 ? (filteredOptions.map((option) => {
|
|
347
|
+
const optVal = getValue(option);
|
|
348
|
+
const isSelected = isOptionSelected(option);
|
|
349
|
+
const optDisabled = option.disabled;
|
|
350
|
+
const optDesc = typeof option === 'object' ? (option === null || option === void 0 ? void 0 : option.description) || (option === null || option === void 0 ? void 0 : option.subtitle) : null;
|
|
351
|
+
return (jsxRuntime.jsxs("div", { onClick: () => !optDisabled && handleToggleOption(option), className: buildClassname.buildClassName('w-full flex items-center justify-between p-3.5 rounded-2xl transition-colors cursor-pointer select-none', isSelected
|
|
352
|
+
? 'bg-blue-50 dark:bg-blue-950/40 text-blue-600 dark:text-blue-400 font-semibold'
|
|
353
|
+
: 'text-gray-800 dark:text-gray-100 hover:bg-gray-100 dark:hover:bg-gray-800/70', optDisabled && 'opacity-50 pointer-events-none'), children: [jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 pr-3", children: [jsxRuntime.jsx("div", { className: "text-sm/6 truncate", children: renderOption
|
|
354
|
+
? renderOption(option, isSelected)
|
|
355
|
+
: getDisplayValue(option) }), optDesc && (jsxRuntime.jsx("div", { className: "text-xs text-gray-400 font-normal truncate mt-0.5", children: optDesc }))] }), isSelected && (jsxRuntime.jsx(Check.default, { className: "size-5 stroke-blue-600 dark:stroke-blue-400 shrink-0" }))] }, optVal));
|
|
356
|
+
})) : (!allowFreeText &&
|
|
357
|
+
!(allowAdd && query.trim()) && (jsxRuntime.jsx("div", { className: "py-8 text-center text-sm text-gray-500 dark:text-gray-400 select-none", children: query
|
|
358
|
+
? noOptionsText !== 'No options available'
|
|
359
|
+
? noOptionsText
|
|
360
|
+
: `No results found for "${query}"`
|
|
361
|
+
: noOptionsText }))), !allowFreeText && allowAdd && Boolean(query.trim()) && (jsxRuntime.jsxs("button", { type: "button", onClick: () => handleAddAndSelect(query.trim()), className: "w-full flex items-center gap-2.5 p-3.5 rounded-2xl text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 cursor-pointer", children: [jsxRuntime.jsx(CirclePlus.default, { className: "size-5 text-blue-600 dark:text-blue-400" }), jsxRuntime.jsxs("span", { className: "text-sm font-medium", children: [addNewText, " \"", query.trim(), "\""] })] }))] }), multiple && (jsxRuntime.jsx("div", { className: "p-4 border-t border-[var(--ui-border-muted)] bg-white dark:bg-gray-900 shrink-0", children: jsxRuntime.jsxs(Button.Button, { fullWidth: true, theme: "primary", size: "md", onClick: handleConfirmMultiSelect, "data-testid": "mobile-picker-confirm-button", children: [confirmText, ' ', Array.isArray(normalizedDraft) && normalizedDraft.length > 0
|
|
362
|
+
? `(${normalizedDraft.length})`
|
|
363
|
+
: ''] }) }))] }) })] })] }));
|
|
364
|
+
}
|
|
365
|
+
MobilePicker.displayName = 'MobilePicker';
|
|
366
|
+
|
|
367
|
+
exports.MobilePicker = MobilePicker;
|
|
368
|
+
//# sourceMappingURL=MobilePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobilePicker.js","sources":["../../../../../src/components/MobilePicker/MobilePicker.tsx"],"sourcesContent":["import React, { useState, useMemo, useCallback, useEffect, useRef } from 'react'\nimport { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react'\nimport { buildClassName } from '../../utils/build-classname'\nimport { buildInputClass } from '../Input'\nimport { Badge } from '../Badge'\nimport { Button } from '../Button'\nimport { Label } from '../Label'\nimport { Loader } from '../Loader'\nimport { TextContent } from '../TextContent'\nimport { useDebounce } from '../../hooks/use-debounce'\nimport CheckIcon from '../Icons/Check.svg'\nimport ChevronDownIcon from '../Icons/ChevronDown.svg'\nimport CirclePlusIcon from '../Icons/CirclePlus.svg'\nimport SearchIcon from '../Icons/Search.svg'\nimport XIcon from '../Icons/X.svg'\nimport type { BaseOption, SelectBoxSize } from '../SelectBox/SelectBox.types'\nimport type { MobilePickerProps } from './MobilePicker.types'\n\nconst sizeConfigMap: Record<\n SelectBoxSize,\n {\n input: string\n icon: string\n badgeSize: 'sm' | 'md'\n group: string\n }\n> = {\n sm: {\n input: 'h-8 text-xs px-2.5',\n icon: 'size-3.5',\n badgeSize: 'sm',\n group: 'w-8',\n },\n md: {\n input: 'h-10 text-sm px-3',\n icon: 'size-4',\n badgeSize: 'md',\n group: 'w-10',\n },\n lg: {\n input: 'h-12 text-base px-3.5',\n icon: 'size-5',\n badgeSize: 'md',\n group: 'w-12',\n },\n}\n\nexport function MobilePicker<T extends BaseOption | string = BaseOption>(\n props: MobilePickerProps<T>,\n) {\n const {\n options = [],\n groups,\n selected = null,\n onChange = () => {},\n size = 'md',\n labelKey = 'label',\n valueKey = 'value',\n id,\n name,\n label,\n labelWrapperClass,\n labelClass,\n labelHint,\n title,\n description,\n placeholder = 'Choose an option...',\n disabled = false,\n multiple = false,\n maxSelection,\n showSelectAll = false,\n confirmText = 'Apply Selection',\n searchable = true,\n searchPlaceholder = 'Search options...',\n async = false,\n onSearch,\n loading = false,\n typeToSearchText = 'Type to search options...',\n filterOption,\n quickOptions,\n quickOptionsTitle = 'Quick Picks',\n allowClear = false,\n allowFreeText = false,\n allowAdd = false,\n addNewText = 'Create',\n onAdd = () => {},\n leftGroup,\n error,\n showErrorMessage = true,\n helperText,\n noOptionsText = 'No options available',\n renderOption,\n containerClass,\n sheetClass,\n } = props\n\n const [isOpen, setIsOpen] = useState(false)\n const [query, setQuery] = useState('')\n const debouncedQuery = useDebounce(query, 400)\n const [optionsLoading, setOptionsLoading] = useState(false)\n const [draftSelected, setDraftSelected] = useState<T | T[] | null>(selected)\n const [viewportHeight, setViewportHeight] = useState<number | null>(null)\n\n useEffect(() => {\n if (!isOpen) {\n setViewportHeight(null)\n return\n }\n\n const updateHeight = () => {\n if (typeof window !== 'undefined' && window.visualViewport) {\n setViewportHeight(window.visualViewport.height)\n }\n }\n\n updateHeight()\n const vv = typeof window !== 'undefined' ? window.visualViewport : null\n vv?.addEventListener('resize', updateHeight)\n vv?.addEventListener('scroll', updateHeight)\n\n return () => {\n vv?.removeEventListener('resize', updateHeight)\n vv?.removeEventListener('scroll', updateHeight)\n }\n }, [isOpen])\n\n const currentSize = sizeConfigMap[size] || sizeConfigMap.md\n const hasError = Boolean(error)\n const isAsyncLoading = loading || optionsLoading\n\n const baseInputClass = useMemo(\n () => buildInputClass('', { disabled, hasError, size }),\n [disabled, hasError, size],\n )\n\n const onSearchRef = useRef(onSearch)\n useEffect(() => {\n onSearchRef.current = onSearch\n }, [onSearch])\n\n const handleAsyncSearch = useCallback(async (searchString: string) => {\n try {\n setOptionsLoading(true)\n await onSearchRef.current?.(searchString)\n } catch (err) {\n console.error('Error loading options:', err)\n } finally {\n setOptionsLoading(false)\n }\n }, [])\n\n useEffect(() => {\n if (isOpen && async) {\n handleAsyncSearch(debouncedQuery)\n }\n }, [isOpen, async, debouncedQuery, handleAsyncSearch])\n\n const getDisplayValue = useCallback(\n (opt: T) => {\n if (typeof opt === 'string') return opt\n return opt?.[labelKey] ?? opt?.[valueKey] ?? String(opt)\n },\n [labelKey, valueKey],\n )\n\n const getValue = useCallback(\n (opt: T) => {\n if (typeof opt === 'string') return opt\n return opt?.[valueKey] ?? opt?.[labelKey] ?? String(opt)\n },\n [valueKey, labelKey],\n )\n\n const normalizedSelected = useMemo(() => {\n if (multiple) {\n if (Array.isArray(selected)) return selected\n if (selected !== null && selected !== undefined) return [selected as T]\n return [] as T[]\n } else {\n if (Array.isArray(selected)) return selected.length > 0 ? selected[0] : null\n return selected ?? null\n }\n }, [multiple, selected])\n\n const normalizedDraft = useMemo(() => {\n if (multiple) {\n if (Array.isArray(draftSelected)) return draftSelected\n if (draftSelected !== null && draftSelected !== undefined) return [draftSelected as T]\n return [] as T[]\n } else {\n if (Array.isArray(draftSelected)) return draftSelected.length > 0 ? draftSelected[0] : null\n return draftSelected ?? null\n }\n }, [multiple, draftSelected])\n\n const rawAllOptions = useMemo(() => {\n if (groups?.length) {\n return groups.flatMap((g) => g.options)\n }\n return options ?? []\n }, [groups, options])\n\n const allOptions = useMemo(() => {\n const list = [...rawAllOptions]\n const selectedList = Array.isArray(normalizedDraft)\n ? normalizedDraft\n : normalizedDraft\n ? [normalizedDraft as T]\n : []\n\n for (const sel of selectedList) {\n if (sel !== null && sel !== undefined) {\n const selVal = getValue(sel)\n const exists = list.some((item) => getValue(item) === selVal)\n if (!exists) {\n list.unshift(sel)\n }\n }\n }\n return list\n }, [rawAllOptions, normalizedDraft, getValue])\n\n useEffect(() => {\n if (isOpen) {\n setDraftSelected(normalizedSelected)\n setQuery('')\n }\n }, [isOpen, normalizedSelected])\n\n const defaultFilter = useCallback(\n (opt: T, q: string) => {\n if (!q.trim()) return true\n const searchTarget = getDisplayValue(opt)?.toLowerCase() || ''\n return searchTarget.includes(q.trim().toLowerCase())\n },\n [getDisplayValue],\n )\n\n const activeFilter = filterOption || defaultFilter\n\n const filteredOptions = useMemo(() => {\n if (async) return allOptions\n if (!query.trim()) return allOptions\n return allOptions.filter((opt) => activeFilter(opt, query))\n }, [allOptions, query, async, activeFilter])\n\n const filteredGroups = useMemo(() => {\n if (!groups?.length) return null\n if (async) return groups\n if (!query.trim()) return groups\n\n return groups\n .map((g) => ({\n ...g,\n options: g.options.filter((opt) => activeFilter(opt, query)),\n }))\n .filter((g) => g.options.length > 0)\n }, [groups, query, async, activeFilter])\n\n const createFreeTextOption = useCallback(\n (text: string): T => {\n const sample = allOptions[0] || (Array.isArray(selected) ? selected[0] : selected)\n if (\n typeof sample === 'string' ||\n (!sample && typeof labelKey === 'string' && labelKey === 'label')\n ) {\n return text as unknown as T\n }\n return {\n [labelKey]: text,\n [valueKey]: text,\n } as unknown as T\n },\n [allOptions, selected, labelKey, valueKey],\n )\n\n const handleToggleOption = (option: T) => {\n const optVal = getValue(option)\n if (multiple) {\n const current = Array.isArray(normalizedDraft) ? [...normalizedDraft] : []\n const index = current.findIndex((item) => getValue(item) === optVal)\n if (index > -1) {\n current.splice(index, 1)\n setDraftSelected(current as T[])\n } else {\n if (maxSelection && current.length >= maxSelection) return\n current.push(option)\n setDraftSelected(current as T[])\n }\n } else {\n setDraftSelected(option)\n onChange(option)\n setIsOpen(false)\n }\n }\n\n const handleCommitFreeText = (text: string) => {\n const trimmed = text.trim()\n if (!trimmed) return\n const existing = allOptions.find(\n (opt) => getDisplayValue(opt).toLowerCase() === trimmed.toLowerCase(),\n )\n const optionToCommit = existing || createFreeTextOption(trimmed)\n\n if (multiple) {\n const current = Array.isArray(normalizedDraft) ? [...normalizedDraft] : []\n const already = current.some(\n (item) => getDisplayValue(item).toLowerCase() === trimmed.toLowerCase(),\n )\n if (!already) {\n if (maxSelection && current.length >= maxSelection) return\n current.push(optionToCommit)\n setDraftSelected(current as T[])\n }\n setQuery('')\n } else {\n setDraftSelected(optionToCommit)\n onChange(optionToCommit)\n setIsOpen(false)\n }\n }\n\n const handleAddAndSelect = async (valueToAdd: string) => {\n try {\n const result = await onAdd(valueToAdd)\n const optionToCommit = (result || valueToAdd) as unknown as T\n if (multiple) {\n const current = Array.isArray(normalizedDraft) ? [...normalizedDraft] : []\n current.push(optionToCommit)\n setDraftSelected(current as T[])\n setQuery('')\n } else {\n setDraftSelected(optionToCommit)\n onChange(optionToCommit)\n setIsOpen(false)\n }\n } catch (err) {\n console.error('MobilePicker onAdd error:', err)\n }\n }\n\n const isAllSelected = useMemo(() => {\n if (!multiple || !Array.isArray(normalizedDraft) || !allOptions.length) return false\n return allOptions.length === normalizedDraft.length\n }, [multiple, normalizedDraft, allOptions])\n\n const handleToggleSelectAll = () => {\n if (isAllSelected) {\n setDraftSelected([] as T[])\n } else {\n setDraftSelected(allOptions as T[])\n }\n }\n\n const handleConfirmMultiSelect = () => {\n onChange(normalizedDraft)\n setIsOpen(false)\n }\n\n const handleClearSingleSelect = (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDraftSelected(multiple ? ([] as T[]) : null)\n onChange(multiple ? ([] as T[]) : null)\n }\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n if (disabled) return\n const isClearClick = (e.target as HTMLElement).closest(\n '[data-testid=\"mobile-picker-clear-button\"]',\n )\n if (isClearClick) return\n setIsOpen(true)\n }\n\n const isOptionSelected = (option: T) => {\n const optVal = getValue(option)\n if (multiple) {\n return (\n Array.isArray(normalizedDraft) && normalizedDraft.some((item) => getValue(item) === optVal)\n )\n } else {\n return Boolean(normalizedDraft && getValue(normalizedDraft as T) === optVal)\n }\n }\n\n const shouldShowTypeToSearch = async && !query && !isAsyncLoading && allOptions.length === 0\n const hasLeftGroup = leftGroup != null && leftGroup !== undefined\n\n return (\n <div className={buildClassName('group space-y-2 w-full', containerClass)}>\n {label && (\n <div className={buildClassName('flex items-center justify-between', labelWrapperClass)}>\n <Label className={labelClass} htmlFor={id}>\n {label}\n </Label>\n {labelHint && <TextContent xsmall>{labelHint}</TextContent>}\n </div>\n )}\n\n {/* Trigger Button */}\n <button\n type=\"button\"\n id={id}\n name={name}\n disabled={disabled}\n onClick={handleTriggerClick}\n className={buildClassName(\n baseInputClass,\n 'w-full flex items-center justify-between gap-2 cursor-pointer relative text-left',\n hasLeftGroup ? (size === 'lg' ? 'ps-12' : size === 'sm' ? 'ps-8' : 'ps-10') : '',\n )}\n data-testid=\"mobile-picker-trigger\"\n >\n {hasLeftGroup && (\n <span\n className={buildClassName(\n 'absolute left-0 top-0 h-full flex items-center justify-center text-gray-400 dark:text-gray-500',\n currentSize.group,\n )}\n >\n {leftGroup}\n </span>\n )}\n\n <div className=\"flex-1 flex flex-wrap items-center gap-1.5 min-w-0 overflow-hidden\">\n {multiple ? (\n Array.isArray(normalizedSelected) && normalizedSelected.length > 0 ? (\n normalizedSelected.map((item, idx) => (\n <Badge\n key={`${getValue(item)}-${idx}`}\n theme=\"secondary\"\n size={currentSize.badgeSize}\n >\n {getDisplayValue(item)}\n </Badge>\n ))\n ) : (\n <span className=\"text-gray-400 dark:text-gray-500\">{placeholder}</span>\n )\n ) : normalizedSelected ? (\n <span className=\"text-gray-900 dark:text-white font-normal truncate\">\n {getDisplayValue(normalizedSelected as T)}\n </span>\n ) : (\n <span className=\"text-gray-400 dark:text-gray-500\">{placeholder}</span>\n )}\n </div>\n\n <div className=\"flex items-center gap-1 shrink-0\">\n {allowClear && !multiple && normalizedSelected && (\n <span\n role=\"button\"\n aria-label=\"Clear selection\"\n tabIndex={0}\n onClick={handleClearSingleSelect}\n className=\"p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-full cursor-pointer z-10\"\n data-testid=\"mobile-picker-clear-button\"\n >\n <XIcon className=\"size-3.5 stroke-gray-500 dark:stroke-gray-400\" />\n </span>\n )}\n\n <ChevronDownIcon\n className={buildClassName(currentSize.icon, 'stroke-gray-500 shrink-0')}\n />\n </div>\n </button>\n\n {showErrorMessage && error && (\n <div className=\"mt-1\">\n <TextContent error small>\n {error}\n </TextContent>\n </div>\n )}\n\n {!error && helperText && (\n <div className=\"mt-1\">\n <TextContent muted small>\n {helperText}\n </TextContent>\n </div>\n )}\n\n {/* Mobile Bottom Sheet Drawer */}\n <Dialog\n open={isOpen}\n as=\"div\"\n className=\"relative z-50 focus:outline-none\"\n onClose={() => setIsOpen(false)}\n transition\n >\n <DialogBackdrop className=\"fixed inset-0 bg-black/50 backdrop-blur-xs transition-opacity duration-200\" />\n\n <div\n className=\"fixed left-0 top-0 w-full flex items-end justify-center pointer-events-none z-50\"\n style={{\n height: viewportHeight ? `${viewportHeight}px` : '100dvh',\n }}\n >\n <DialogPanel\n transition\n className={buildClassName(\n 'w-full max-w-full md:max-w-lg bg-white dark:bg-gray-900 shadow-2xl rounded-t-3xl max-h-[85vh] max-h-[85dvh] flex flex-col pointer-events-auto overscroll-contain touch-pan-y',\n 'duration-200 ease-out data-[closed]:translate-y-full data-[closed]:opacity-0',\n sheetClass,\n )}\n style={{\n maxHeight: viewportHeight ? `${Math.floor(viewportHeight * 0.9)}px` : undefined,\n }}\n data-testid=\"mobile-picker-sheet\"\n >\n {/* Top drag handle indicator */}\n <div className=\"w-12 h-1.5 rounded-full bg-gray-300 dark:bg-gray-700 mx-auto my-2.5 shrink-0\" />\n\n {/* Sheet Header */}\n <div className=\"px-4 pb-3 border-b border-[var(--ui-border-muted)] flex items-center justify-between gap-3 shrink-0\">\n <div className=\"min-w-0 flex-1\">\n <DialogTitle\n as=\"h3\"\n className=\"text-base md:text-lg font-bold text-gray-900 dark:text-white truncate\"\n >\n {title || label || 'Select Option'}\n </DialogTitle>\n {description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 truncate mt-0.5\">\n {description}\n </p>\n )}\n </div>\n\n <Button\n iconOnly\n aria-label=\"Close picker\"\n variant=\"plain\"\n theme=\"secondary\"\n size=\"xs\"\n onClick={() => setIsOpen(false)}\n className=\"rounded-full text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 shrink-0\"\n >\n <XIcon className=\"size-4\" />\n </Button>\n </div>\n\n {/* Optional Search Bar */}\n {searchable && (\n <div className=\"p-3 border-b border-[var(--ui-border-muted)] bg-gray-50 dark:bg-gray-800/50 shrink-0\">\n <div className=\"relative\">\n <SearchIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 size-4 text-gray-400\" />\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (allowFreeText && e.key === 'Enter' && query.trim()) {\n e.preventDefault()\n handleCommitFreeText(query)\n }\n }}\n placeholder={searchPlaceholder}\n className=\"w-full pl-9 pr-10 py-2 text-sm bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-xl text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n data-testid=\"mobile-picker-search-input\"\n />\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1.5\">\n {isAsyncLoading ? (\n <Loader size=\"xs\" />\n ) : (\n query && (\n <button\n type=\"button\"\n onClick={() => setQuery('')}\n className=\"p-0.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200\"\n >\n <XIcon className=\"size-3.5\" />\n </button>\n )\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Quick Choice Chips Row */}\n {quickOptions && quickOptions.length > 0 && (\n <div className=\"px-3 py-2 bg-gray-50/60 dark:bg-gray-800/40 border-b border-[var(--ui-border-muted)] shrink-0\">\n <div className=\"text-[11px] font-semibold text-gray-400 uppercase tracking-wider mb-1.5 px-1\">\n {quickOptionsTitle}\n </div>\n <div className=\"flex items-center gap-2 overflow-x-auto no-scrollbar pb-1\">\n {quickOptions.map((chip, cIdx) => {\n const isSelected = isOptionSelected(chip)\n return (\n <button\n key={cIdx}\n type=\"button\"\n onClick={() => handleToggleOption(chip)}\n className={buildClassName(\n 'px-3 py-1 rounded-full text-xs font-medium shrink-0 transition-colors cursor-pointer border',\n isSelected\n ? 'bg-blue-600 text-white border-blue-600'\n : 'bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-700 hover:bg-gray-100 dark:hover:bg-gray-700',\n )}\n >\n {getDisplayValue(chip)}\n </button>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Multi-Select Select All Toolbar */}\n {multiple && showSelectAll && allOptions.length > 0 && (\n <div className=\"px-4 py-2 bg-gray-50/80 dark:bg-gray-800/80 border-b border-[var(--ui-border-muted)] flex items-center justify-between text-xs shrink-0\">\n <button\n type=\"button\"\n onClick={handleToggleSelectAll}\n className=\"font-semibold text-blue-600 dark:text-blue-400 hover:underline cursor-pointer\"\n >\n {isAllSelected ? 'Deselect All' : 'Select All'}\n </button>\n <span className=\"text-gray-500 dark:text-gray-400 font-medium\">\n {Array.isArray(normalizedDraft) ? normalizedDraft.length : 0} of{' '}\n {allOptions.length}\n </span>\n </div>\n )}\n\n {/* Sheet Scrollable Option List */}\n <div\n onScroll={(e) => {\n const el = e.currentTarget\n if (el.scrollTop === 0) {\n el.scrollTop = 1\n } else if (el.scrollTop + el.clientHeight >= el.scrollHeight) {\n el.scrollTop = el.scrollHeight - el.clientHeight - 1\n }\n }}\n className=\"flex-1 overflow-y-auto overscroll-contain touch-pan-y [-webkit-overflow-scrolling:touch] p-2 space-y-1 divide-y divide-gray-100 dark:divide-gray-800/60\"\n >\n {/* Free-Text Action Item */}\n {allowFreeText &&\n query.trim() &&\n !allOptions.some(\n (opt) => getDisplayValue(opt).toLowerCase() === query.trim().toLowerCase(),\n ) && (\n <button\n type=\"button\"\n onClick={() => handleCommitFreeText(query)}\n className=\"w-full text-left flex items-center justify-between p-3.5 rounded-2xl bg-blue-50/80 dark:bg-blue-950/30 text-blue-600 dark:text-blue-400 font-medium hover:bg-blue-100/80 cursor-pointer\"\n data-testid=\"mobile-picker-freetext-item\"\n >\n <span className=\"text-sm font-medium\">Use \"{query.trim()}\"</span>\n <ChevronDownIcon className=\"size-4 rotate-[-90deg]\" />\n </button>\n )}\n\n {/* Loading State Body */}\n {isAsyncLoading && allOptions.length === 0 ? (\n <div className=\"py-12 flex flex-col items-center justify-center gap-2 text-sm text-gray-500 dark:text-gray-400 select-none\">\n <Loader size=\"md\" />\n <span>Loading options...</span>\n </div>\n ) : shouldShowTypeToSearch ? (\n <div className=\"py-12 text-center text-sm text-gray-500 dark:text-gray-400 select-none\">\n {typeToSearchText}\n </div>\n ) : filteredGroups ? (\n filteredGroups.map((grp, gIdx) => (\n <div key={gIdx} className=\"pt-2\">\n <div className=\"text-[11px] font-bold uppercase tracking-wider text-gray-400 dark:text-gray-500 px-3 py-1.5 select-none\">\n {grp.group}\n </div>\n <div className=\"space-y-1\">\n {grp.options.map((option) => {\n const optVal = getValue(option)\n const isSelected = isOptionSelected(option)\n const optDisabled = (option as BaseOption).disabled\n const optDesc =\n typeof option === 'object'\n ? option?.description || option?.subtitle\n : null\n\n return (\n <div\n key={optVal}\n onClick={() => !optDisabled && handleToggleOption(option)}\n className={buildClassName(\n 'w-full flex items-center justify-between p-3.5 rounded-2xl transition-colors cursor-pointer select-none',\n isSelected\n ? 'bg-blue-50 dark:bg-blue-950/40 text-blue-600 dark:text-blue-400 font-semibold'\n : 'text-gray-800 dark:text-gray-100 hover:bg-gray-100 dark:hover:bg-gray-800/70',\n optDisabled && 'opacity-50 pointer-events-none',\n )}\n >\n <div className=\"flex-1 min-w-0 pr-3\">\n <div className=\"text-sm/6 truncate\">\n {renderOption\n ? renderOption(option, isSelected)\n : getDisplayValue(option)}\n </div>\n {optDesc && (\n <div className=\"text-xs text-gray-400 font-normal truncate mt-0.5\">\n {optDesc}\n </div>\n )}\n </div>\n {isSelected && (\n <CheckIcon className=\"size-5 stroke-blue-600 dark:stroke-blue-400 shrink-0\" />\n )}\n </div>\n )\n })}\n </div>\n </div>\n ))\n ) : filteredOptions.length > 0 ? (\n filteredOptions.map((option) => {\n const optVal = getValue(option)\n const isSelected = isOptionSelected(option)\n const optDisabled = (option as BaseOption).disabled\n const optDesc =\n typeof option === 'object' ? option?.description || option?.subtitle : null\n\n return (\n <div\n key={optVal}\n onClick={() => !optDisabled && handleToggleOption(option)}\n className={buildClassName(\n 'w-full flex items-center justify-between p-3.5 rounded-2xl transition-colors cursor-pointer select-none',\n isSelected\n ? 'bg-blue-50 dark:bg-blue-950/40 text-blue-600 dark:text-blue-400 font-semibold'\n : 'text-gray-800 dark:text-gray-100 hover:bg-gray-100 dark:hover:bg-gray-800/70',\n optDisabled && 'opacity-50 pointer-events-none',\n )}\n >\n <div className=\"flex-1 min-w-0 pr-3\">\n <div className=\"text-sm/6 truncate\">\n {renderOption\n ? renderOption(option, isSelected)\n : getDisplayValue(option)}\n </div>\n {optDesc && (\n <div className=\"text-xs text-gray-400 font-normal truncate mt-0.5\">\n {optDesc}\n </div>\n )}\n </div>\n {isSelected && (\n <CheckIcon className=\"size-5 stroke-blue-600 dark:stroke-blue-400 shrink-0\" />\n )}\n </div>\n )\n })\n ) : (\n !allowFreeText &&\n !(allowAdd && query.trim()) && (\n <div className=\"py-8 text-center text-sm text-gray-500 dark:text-gray-400 select-none\">\n {query\n ? noOptionsText !== 'No options available'\n ? noOptionsText\n : `No results found for \"${query}\"`\n : noOptionsText}\n </div>\n )\n )}\n\n {/* Creatable option card */}\n {!allowFreeText && allowAdd && Boolean(query.trim()) && (\n <button\n type=\"button\"\n onClick={() => handleAddAndSelect(query.trim())}\n className=\"w-full flex items-center gap-2.5 p-3.5 rounded-2xl text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 cursor-pointer\"\n >\n <CirclePlusIcon className=\"size-5 text-blue-600 dark:text-blue-400\" />\n <span className=\"text-sm font-medium\">\n {addNewText} \"{query.trim()}\"\n </span>\n </button>\n )}\n </div>\n\n {/* Sticky Footer for Multi-Select Confirmation */}\n {multiple && (\n <div className=\"p-4 border-t border-[var(--ui-border-muted)] bg-white dark:bg-gray-900 shrink-0\">\n <Button\n fullWidth\n theme=\"primary\"\n size=\"md\"\n onClick={handleConfirmMultiSelect}\n data-testid=\"mobile-picker-confirm-button\"\n >\n {confirmText}{' '}\n {Array.isArray(normalizedDraft) && normalizedDraft.length > 0\n ? `(${normalizedDraft.length})`\n : ''}\n </Button>\n </div>\n )}\n </DialogPanel>\n </div>\n </Dialog>\n </div>\n )\n}\n\nMobilePicker.displayName = 'MobilePicker'\n"],"names":["useState","useDebounce","useEffect","useMemo","buildInputClass","useRef","useCallback","_jsxs","buildClassName","_jsx","Label","TextContent","Badge","XIcon","ChevronDownIcon","Dialog","DialogBackdrop","DialogPanel","DialogTitle","Button","SearchIcon","Loader","CheckIcon","CirclePlusIcon"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var buildClassname = require('../../utils/build-classname.js');
|
|
5
|
+
var Button = require('../Button/Button.js');
|
|
6
|
+
|
|
7
|
+
function ChevronLeftIcon() {
|
|
8
|
+
return (jsxRuntime.jsx("svg", { className: "size-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2.5, d: "M15 19l-7-7 7-7" }) }));
|
|
9
|
+
}
|
|
10
|
+
function ChevronRightIcon() {
|
|
11
|
+
return (jsxRuntime.jsx("svg", { className: "size-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2.5, d: "M9 5l7 7-7 7" }) }));
|
|
12
|
+
}
|
|
13
|
+
function MobileStepper({ steps, activeStep, variant = 'dots', onBack, onNext, backLabel = 'Back', nextLabel = 'Next', stepTitle, nextDisabled = false, backDisabled = false, nextLoading = false, className = '', }) {
|
|
14
|
+
const isFirstStep = activeStep <= 0;
|
|
15
|
+
const isLastStep = activeStep >= steps - 1;
|
|
16
|
+
const progressPercent = Math.min(Math.max(((activeStep + 1) / steps) * 100, 0), 100);
|
|
17
|
+
return (jsxRuntime.jsxs("div", { className: buildClassname.buildClassName('w-full flex flex-col gap-2 p-3 bg-white dark:bg-gray-900 border border-[var(--ui-border)] rounded-2xl shadow-xs select-none', className), "data-testid": "mobile-stepper", children: [stepTitle && (jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-1", children: [jsxRuntime.jsx("span", { className: "text-xs font-bold text-gray-900 dark:text-white truncate", "data-testid": "mobile-stepper-title", children: stepTitle }), jsxRuntime.jsxs("span", { className: "text-[11px] font-medium text-gray-500 dark:text-gray-400 shrink-0 ml-2", children: [activeStep + 1, " / ", steps] })] })), jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [jsxRuntime.jsx(Button.Button, { size: "xs", variant: "plain", theme: "secondary", disabled: disabledBack(isFirstStep, backDisabled), onClick: onBack, "aria-label": "Previous step", leftIcon: jsxRuntime.jsx(ChevronLeftIcon, {}), "data-testid": "mobile-stepper-back-btn", children: backLabel }), jsxRuntime.jsxs("div", { className: "flex items-center justify-center flex-1", "data-testid": "mobile-stepper-indicator", children: [variant === 'dots' && (jsxRuntime.jsx("div", { className: "flex items-center gap-1.5", "data-testid": "mobile-stepper-dots", children: Array.from({ length: steps }).map((_, index) => {
|
|
18
|
+
const isActive = index === activeStep;
|
|
19
|
+
const isCompleted = index < activeStep;
|
|
20
|
+
return (jsxRuntime.jsx("span", { className: buildClassname.buildClassName('h-2 transition-all duration-300 rounded-full', isActive
|
|
21
|
+
? 'w-5 bg-blue-600 dark:bg-blue-400'
|
|
22
|
+
: isCompleted
|
|
23
|
+
? 'w-2 bg-blue-300 dark:bg-blue-800'
|
|
24
|
+
: 'w-2 bg-gray-200 dark:bg-gray-700'), "data-testid": `mobile-stepper-dot-${index}` }, index));
|
|
25
|
+
}) })), variant === 'progress' && (jsxRuntime.jsx("div", { className: "w-full max-w-[140px] bg-gray-200 dark:bg-gray-700 h-2 rounded-full overflow-hidden", "data-testid": "mobile-stepper-progress", children: jsxRuntime.jsx("div", { className: "bg-blue-600 dark:bg-blue-400 h-full transition-all duration-300 rounded-full", style: { width: `${progressPercent}%` } }) })), variant === 'text' && (jsxRuntime.jsxs("div", { className: "text-xs font-semibold text-gray-600 dark:text-gray-300", "data-testid": "mobile-stepper-text", children: ["Step ", activeStep + 1, " of ", steps] }))] }), jsxRuntime.jsx(Button.Button, { size: "xs", variant: "default", theme: "primary", disabled: nextDisabled, loading: nextLoading, onClick: onNext, "aria-label": "Next step", rightIcon: !isLastStep ? jsxRuntime.jsx(ChevronRightIcon, {}) : undefined, "data-testid": "mobile-stepper-next-btn", children: nextLabel })] })] }));
|
|
26
|
+
}
|
|
27
|
+
function disabledBack(isFirstStep, backDisabled) {
|
|
28
|
+
return isFirstStep || backDisabled;
|
|
29
|
+
}
|
|
30
|
+
MobileStepper.displayName = 'MobileStepper';
|
|
31
|
+
|
|
32
|
+
exports.MobileStepper = MobileStepper;
|
|
33
|
+
//# sourceMappingURL=MobileStepper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileStepper.js","sources":["../../../../../src/components/MobileStepper/MobileStepper.tsx"],"sourcesContent":["import React from 'react'\nimport type { MobileStepperProps } from './MobileStepper.types'\nimport { buildClassName } from '../../utils/build-classname'\nimport { Button } from '../Button'\n\nfunction ChevronLeftIcon() {\n return (\n <svg className=\"size-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M15 19l-7-7 7-7\" />\n </svg>\n )\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg className=\"size-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n\nexport function MobileStepper({\n steps,\n activeStep,\n variant = 'dots',\n onBack,\n onNext,\n backLabel = 'Back',\n nextLabel = 'Next',\n stepTitle,\n nextDisabled = false,\n backDisabled = false,\n nextLoading = false,\n className = '',\n}: MobileStepperProps) {\n const isFirstStep = activeStep <= 0\n const isLastStep = activeStep >= steps - 1\n\n const progressPercent = Math.min(Math.max(((activeStep + 1) / steps) * 100, 0), 100)\n\n return (\n <div\n className={buildClassName(\n 'w-full flex flex-col gap-2 p-3 bg-white dark:bg-gray-900 border border-[var(--ui-border)] rounded-2xl shadow-xs select-none',\n className,\n )}\n data-testid=\"mobile-stepper\"\n >\n {/* Optional Step Title Header */}\n {stepTitle && (\n <div className=\"flex items-center justify-between px-1\">\n <span\n className=\"text-xs font-bold text-gray-900 dark:text-white truncate\"\n data-testid=\"mobile-stepper-title\"\n >\n {stepTitle}\n </span>\n <span className=\"text-[11px] font-medium text-gray-500 dark:text-gray-400 shrink-0 ml-2\">\n {activeStep + 1} / {steps}\n </span>\n </div>\n )}\n\n {/* Main Navigation Controls & Progress Indicator Row */}\n <div className=\"flex items-center justify-between gap-3\">\n {/* Back Button */}\n <Button\n size=\"xs\"\n variant=\"plain\"\n theme=\"secondary\"\n disabled={disabledBack(isFirstStep, backDisabled)}\n onClick={onBack}\n aria-label=\"Previous step\"\n leftIcon={<ChevronLeftIcon />}\n data-testid=\"mobile-stepper-back-btn\"\n >\n {backLabel}\n </Button>\n\n {/* Center Progress Indicator */}\n <div\n className=\"flex items-center justify-center flex-1\"\n data-testid=\"mobile-stepper-indicator\"\n >\n {variant === 'dots' && (\n <div className=\"flex items-center gap-1.5\" data-testid=\"mobile-stepper-dots\">\n {Array.from({ length: steps }).map((_, index) => {\n const isActive = index === activeStep\n const isCompleted = index < activeStep\n\n return (\n <span\n key={index}\n className={buildClassName(\n 'h-2 transition-all duration-300 rounded-full',\n isActive\n ? 'w-5 bg-blue-600 dark:bg-blue-400'\n : isCompleted\n ? 'w-2 bg-blue-300 dark:bg-blue-800'\n : 'w-2 bg-gray-200 dark:bg-gray-700',\n )}\n data-testid={`mobile-stepper-dot-${index}`}\n />\n )\n })}\n </div>\n )}\n\n {variant === 'progress' && (\n <div\n className=\"w-full max-w-[140px] bg-gray-200 dark:bg-gray-700 h-2 rounded-full overflow-hidden\"\n data-testid=\"mobile-stepper-progress\"\n >\n <div\n className=\"bg-blue-600 dark:bg-blue-400 h-full transition-all duration-300 rounded-full\"\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n )}\n\n {variant === 'text' && (\n <div\n className=\"text-xs font-semibold text-gray-600 dark:text-gray-300\"\n data-testid=\"mobile-stepper-text\"\n >\n Step {activeStep + 1} of {steps}\n </div>\n )}\n </div>\n\n {/* Next / Finish Button */}\n <Button\n size=\"xs\"\n variant=\"default\"\n theme=\"primary\"\n disabled={nextDisabled}\n loading={nextLoading}\n onClick={onNext}\n aria-label=\"Next step\"\n rightIcon={!isLastStep ? <ChevronRightIcon /> : undefined}\n data-testid=\"mobile-stepper-next-btn\"\n >\n {nextLabel}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction disabledBack(isFirstStep: boolean, backDisabled: boolean): boolean {\n return isFirstStep || backDisabled\n}\n\nMobileStepper.displayName = 'MobileStepper'\n"],"names":["_jsx","_jsxs","buildClassName","Button"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var Button = require('../Button/Button.js');
|
|
5
|
+
var usePagination = require('./usePagination.js');
|
|
6
|
+
var buildClassname = require('../../utils/build-classname.js');
|
|
7
|
+
var ChevronLeft = require('../Icons/ChevronLeft.svg.js');
|
|
8
|
+
var ChevronRight = require('../Icons/ChevronRight.svg.js');
|
|
9
|
+
|
|
10
|
+
const Pagination = ({ page: currentPage, limit, total, onChange, className, ellipsis = true, // Default to showing ellipsis
|
|
11
|
+
}) => {
|
|
12
|
+
const pages = new Array(Math.ceil(total / limit)).fill(null).map((_, i) => i + 1);
|
|
13
|
+
const isFirstPage = currentPage === 1;
|
|
14
|
+
const isLastPage = total === 0 || pages.length === currentPage;
|
|
15
|
+
const range = usePagination.usePagination({ totalPages: pages.length, currentPage });
|
|
16
|
+
const handlePageChange = (nextVal) => {
|
|
17
|
+
if (nextVal === currentPage)
|
|
18
|
+
return;
|
|
19
|
+
onChange({ page: nextVal });
|
|
20
|
+
};
|
|
21
|
+
if (ellipsis) {
|
|
22
|
+
return (jsxRuntime.jsxs("div", { "data-testid": "pagination-container", className: buildClassname.buildClassName('flex items-center justify-between bg-white dark:bg-gray-800 px-4 py-3 sm:px-6', className), children: [jsxRuntime.jsxs("div", { className: "flex flex-1 justify-between sm:hidden", children: [jsxRuntime.jsxs(Button.Button, { size: "xs", theme: "secondary", variant: "plain", disabled: isFirstPage, onClick: () => handlePageChange(currentPage - 1), "data-testid": "ellipsis-mobile-prev-btn", children: [jsxRuntime.jsx("span", { children: "Previous" }), jsxRuntime.jsx(ChevronLeft.default, { className: "size-4" })] }), jsxRuntime.jsxs(Button.Button, { size: "xs", theme: "secondary", variant: "plain", disabled: isLastPage, onClick: () => handlePageChange(currentPage + 1), "data-testid": "ellipsis-mobile-next-btn", children: [jsxRuntime.jsx("span", { children: "Next" }), jsxRuntime.jsx(ChevronRight.default, { className: "size-4" })] })] }), jsxRuntime.jsxs("div", { className: "hidden sm:flex sm:flex-1 sm:items-center sm:justify-between", children: [jsxRuntime.jsxs("p", { "data-testid": "pagination-summary", className: "text-sm text-gray-600 dark:text-gray-400 flex items-center gap-1", children: ["Showing", jsxRuntime.jsx("span", { className: "font-medium", children: total === 0 ? 0 : Math.max(currentPage * limit - limit + 1, 1) }), "to", jsxRuntime.jsx("span", { className: "font-medium", children: Math.min(currentPage * limit, total) }), "of", jsxRuntime.jsx("span", { className: "font-medium", children: total }), "results"] }), jsxRuntime.jsxs("ul", { className: "flex items-center space-x-2 text-sm", children: [jsxRuntime.jsx("li", { children: jsxRuntime.jsx(Button.Button, { size: "xs", theme: "secondary", variant: "plain", disabled: isFirstPage, onClick: () => handlePageChange(currentPage - 1), "data-testid": "ellipsis-prev-btn", children: "Prev" }) }), range.map((page, idx) => {
|
|
23
|
+
if (page === usePagination.DOTS) {
|
|
24
|
+
return (jsxRuntime.jsx("li", { "data-testid": `page-${page}`, className: "px-2 py-1 text-gray-400", children: "\u2026" }, `${page}-${idx}`));
|
|
25
|
+
}
|
|
26
|
+
return (jsxRuntime.jsx("li", { children: jsxRuntime.jsx(Button.Button, { size: "xs", theme: page === currentPage ? 'primary' : 'secondary', variant: page === currentPage ? 'default' : 'plain', "aria-current": page === currentPage ? 'page' : undefined, onClick: () => handlePageChange(page), children: page }) }, `${page}-${idx}`));
|
|
27
|
+
}), jsxRuntime.jsx("li", { children: jsxRuntime.jsx(Button.Button, { size: "xs", theme: "secondary", variant: "plain", disabled: isLastPage, onClick: () => handlePageChange(currentPage + 1), "data-testid": "ellipsis-next-btn", children: "Next" }) })] })] })] }));
|
|
28
|
+
}
|
|
29
|
+
return (jsxRuntime.jsxs("div", { "data-testid": "pagination-container", className: buildClassname.buildClassName('flex items-center justify-between bg-white dark:bg-gray-800 px-4 py-3 sm:px-6', className), children: [jsxRuntime.jsxs("div", { className: "flex flex-1 justify-between sm:hidden", children: [jsxRuntime.jsxs(Button.Button, { size: "xs", theme: "secondary", variant: "plain", disabled: isFirstPage, onClick: () => handlePageChange(currentPage - 1), "data-testid": "mobile-prev-btn", children: [jsxRuntime.jsx("span", { children: "Previous" }), jsxRuntime.jsx(ChevronLeft.default, { className: "size-4" })] }), jsxRuntime.jsxs(Button.Button, { size: "xs", theme: "secondary", variant: "plain", disabled: isLastPage, onClick: () => handlePageChange(currentPage + 1), "data-testid": "mobile-next-btn", children: [jsxRuntime.jsx("span", { children: "Next" }), jsxRuntime.jsx(ChevronRight.default, { className: "size-4" })] })] }), jsxRuntime.jsxs("div", { className: "hidden sm:flex sm:flex-1 sm:items-center sm:justify-between", children: [jsxRuntime.jsxs("p", { "data-testid": "pagination-summary", className: "text-sm text-gray-600 dark:text-gray-400 flex items-center gap-1", children: ["Showing", jsxRuntime.jsx("span", { className: "font-medium", children: total === 0 ? 0 : Math.max(currentPage * limit - limit + 1, 1) }), "to", jsxRuntime.jsx("span", { className: "font-medium", children: Math.min(currentPage * limit, total) }), "of", jsxRuntime.jsx("span", { className: "font-medium", children: total }), "results"] }), jsxRuntime.jsxs("nav", { className: "isolate inline-flex items-center rounded-md", "aria-label": "Pagination", children: [jsxRuntime.jsxs(Button.Button, { size: "xs", theme: "secondary", variant: "plain", disabled: isFirstPage, onClick: () => handlePageChange(currentPage - 1), "data-testid": "prev-btn", children: [jsxRuntime.jsx("span", { className: "sr-only", children: "Previous" }), jsxRuntime.jsx(ChevronLeft.default, { className: "size-4" })] }), pages.map((page) => (jsxRuntime.jsx(Button.Button, { size: "xs", theme: page === currentPage ? 'primary' : 'secondary', variant: page === currentPage ? 'default' : 'plain', "aria-current": page === currentPage ? 'page' : undefined, onClick: () => handlePageChange(page), children: jsxRuntime.jsx("span", { className: "size-4 block", children: page }) }, page))), jsxRuntime.jsxs(Button.Button, { size: "xs", theme: "secondary", variant: "plain", disabled: isLastPage, onClick: () => handlePageChange(currentPage + 1), "data-testid": "next-btn", children: [jsxRuntime.jsx("span", { className: "sr-only", children: "Next" }), jsxRuntime.jsx(ChevronRight.default, { className: "size-4" })] })] })] })] }));
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
exports.Pagination = Pagination;
|
|
33
|
+
//# sourceMappingURL=Pagination.js.map
|