@pk-design/react-tailwind 1.6.0 → 1.7.0
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,87 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Compute the next sorting direction for a column.
|
|
7
|
+
* - string: undefined → asc → desc → undefined
|
|
8
|
+
* - number/date: undefined → 1 → -1 → undefined
|
|
9
|
+
*/
|
|
10
|
+
const nextSortDirection = (prev, type = 'string') => {
|
|
11
|
+
if (type === 'string') {
|
|
12
|
+
if (!prev)
|
|
13
|
+
return 'asc';
|
|
14
|
+
if (prev === 'asc')
|
|
15
|
+
return 'desc';
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
// number / date
|
|
19
|
+
if (!prev)
|
|
20
|
+
return '1';
|
|
21
|
+
if (prev === '1')
|
|
22
|
+
return '-1';
|
|
23
|
+
return undefined;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Update the sort query object for a table column.
|
|
27
|
+
* Toggles sort direction, removing key when reset.
|
|
28
|
+
*/
|
|
29
|
+
const updateSortQuery = (sortQuery, name, type = 'string') => {
|
|
30
|
+
const next = nextSortDirection(sortQuery[name], type);
|
|
31
|
+
// Shallow clone once
|
|
32
|
+
const updated = { ...sortQuery };
|
|
33
|
+
if (next == null) {
|
|
34
|
+
delete updated[name];
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
updated[name] = next;
|
|
38
|
+
}
|
|
39
|
+
return updated;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Shared row-selection state/behaviour used by DataTable and VirtualizedDataTable.
|
|
43
|
+
* Supports controlled (`selectedRowKeys`) and uncontrolled (`defaultSelectedRowKeys`) usage.
|
|
44
|
+
*/
|
|
45
|
+
const useRowSelection = ({ items, getKey, selectedRowKeys, defaultSelectedRowKeys = [], onSelectionChange, isRowSelectable, }) => {
|
|
46
|
+
const [internalKeys, setInternalKeys] = React.useState(defaultSelectedRowKeys);
|
|
47
|
+
const isControlled = selectedRowKeys !== undefined;
|
|
48
|
+
const keys = isControlled ? selectedRowKeys : internalKeys;
|
|
49
|
+
const keySet = React.useMemo(() => new Set(keys), [keys]);
|
|
50
|
+
const selectableEntries = React.useMemo(() => items
|
|
51
|
+
.map((item, idx) => ({ item, key: getKey(item, idx) }))
|
|
52
|
+
.filter(({ item }) => !isRowSelectable || isRowSelectable(item)), [items, getKey, isRowSelectable]);
|
|
53
|
+
const emit = React.useCallback((nextKeys) => {
|
|
54
|
+
if (!isControlled)
|
|
55
|
+
setInternalKeys(nextKeys);
|
|
56
|
+
const nextKeySet = new Set(nextKeys);
|
|
57
|
+
const nextItems = items.filter((item, idx) => nextKeySet.has(getKey(item, idx)));
|
|
58
|
+
onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(nextKeys, nextItems);
|
|
59
|
+
}, [isControlled, items, getKey, onSelectionChange]);
|
|
60
|
+
const toggleRow = React.useCallback((key) => {
|
|
61
|
+
emit(keySet.has(key) ? keys.filter((k) => k !== key) : [...keys, key]);
|
|
62
|
+
}, [keys, keySet, emit]);
|
|
63
|
+
const allSelected = selectableEntries.length > 0 && selectableEntries.every(({ key }) => keySet.has(key));
|
|
64
|
+
const someSelected = !allSelected && selectableEntries.some(({ key }) => keySet.has(key));
|
|
65
|
+
const toggleAll = React.useCallback(() => {
|
|
66
|
+
const selectableKeySet = new Set(selectableEntries.map(({ key }) => key));
|
|
67
|
+
if (allSelected) {
|
|
68
|
+
emit(keys.filter((k) => !selectableKeySet.has(k)));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
emit(Array.from(new Set([...keys, ...selectableKeySet])));
|
|
72
|
+
}
|
|
73
|
+
}, [allSelected, selectableEntries, keys, emit]);
|
|
74
|
+
return {
|
|
75
|
+
selectedKeys: keys,
|
|
76
|
+
isSelected: (key) => keySet.has(key),
|
|
77
|
+
toggleRow,
|
|
78
|
+
toggleAll,
|
|
79
|
+
allSelected,
|
|
80
|
+
someSelected,
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
exports.nextSortDirection = nextSortDirection;
|
|
85
|
+
exports.updateSortQuery = updateSortQuery;
|
|
86
|
+
exports.useRowSelection = useRowSelection;
|
|
87
|
+
//# sourceMappingURL=DataTable.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.utils.js","sources":["../../../../../src/components/DataTable/DataTable.utils.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react'\nimport type { DataValueType, Sorting, SortQuery } from './DataTable.types'\n\n/**\n * Compute the next sorting direction for a column.\n * - string: undefined → asc → desc → undefined\n * - number/date: undefined → 1 → -1 → undefined\n */\nexport const nextSortDirection = (\n prev: Sorting | undefined,\n type: 'string' | 'number' | 'date' = 'string',\n): Sorting | undefined => {\n if (type === 'string') {\n if (!prev) return 'asc'\n if (prev === 'asc') return 'desc'\n return undefined\n }\n\n // number / date\n if (!prev) return '1'\n if (prev === '1') return '-1'\n return undefined\n}\n\n/**\n * Update the sort query object for a table column.\n * Toggles sort direction, removing key when reset.\n */\nexport const updateSortQuery = (\n sortQuery: SortQuery,\n name: string,\n type: DataValueType = 'string',\n): SortQuery => {\n const next = nextSortDirection(sortQuery[name], type)\n\n // Shallow clone once\n const updated = { ...sortQuery }\n\n if (next == null) {\n delete updated[name]\n } else {\n updated[name] = next\n }\n\n return updated\n}\n\n/** Options for {@link useRowSelection}. */\nexport interface UseRowSelectionOptions<T> {\n items: T[]\n getKey: (item: T, idx: number) => string | number\n selectedRowKeys?: Array<string | number>\n defaultSelectedRowKeys?: Array<string | number>\n onSelectionChange?: (selectedRowKeys: Array<string | number>, selectedItems: T[]) => void\n isRowSelectable?: (item: T) => boolean\n}\n\n/**\n * Shared row-selection state/behaviour used by DataTable and VirtualizedDataTable.\n * Supports controlled (`selectedRowKeys`) and uncontrolled (`defaultSelectedRowKeys`) usage.\n */\nexport const useRowSelection = <T>({\n items,\n getKey,\n selectedRowKeys,\n defaultSelectedRowKeys = [],\n onSelectionChange,\n isRowSelectable,\n}: UseRowSelectionOptions<T>) => {\n const [internalKeys, setInternalKeys] = useState<Array<string | number>>(defaultSelectedRowKeys)\n const isControlled = selectedRowKeys !== undefined\n const keys = isControlled ? selectedRowKeys : internalKeys\n const keySet = useMemo(() => new Set(keys), [keys])\n\n const selectableEntries = useMemo(\n () =>\n items\n .map((item, idx) => ({ item, key: getKey(item, idx) }))\n .filter(({ item }) => !isRowSelectable || isRowSelectable(item)),\n [items, getKey, isRowSelectable],\n )\n\n const emit = useCallback(\n (nextKeys: Array<string | number>) => {\n if (!isControlled) setInternalKeys(nextKeys)\n const nextKeySet = new Set(nextKeys)\n const nextItems = items.filter((item, idx) => nextKeySet.has(getKey(item, idx)))\n onSelectionChange?.(nextKeys, nextItems)\n },\n [isControlled, items, getKey, onSelectionChange],\n )\n\n const toggleRow = useCallback(\n (key: string | number) => {\n emit(keySet.has(key) ? keys.filter((k) => k !== key) : [...keys, key])\n },\n [keys, keySet, emit],\n )\n\n const allSelected =\n selectableEntries.length > 0 && selectableEntries.every(({ key }) => keySet.has(key))\n const someSelected = !allSelected && selectableEntries.some(({ key }) => keySet.has(key))\n\n const toggleAll = useCallback(() => {\n const selectableKeySet = new Set(selectableEntries.map(({ key }) => key))\n if (allSelected) {\n emit(keys.filter((k) => !selectableKeySet.has(k)))\n } else {\n emit(Array.from(new Set([...keys, ...selectableKeySet])))\n }\n }, [allSelected, selectableEntries, keys, emit])\n\n return {\n selectedKeys: keys,\n isSelected: (key: string | number) => keySet.has(key),\n toggleRow,\n toggleAll,\n allSelected,\n someSelected,\n }\n}\n"],"names":["useState","useMemo","useCallback"],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var buildClassname = require('../../utils/build-classname.js');
|
|
6
|
+
var HeadingText = require('../HeadingText/HeadingText.js');
|
|
7
|
+
|
|
8
|
+
const COLUMN_GRID_CLASS = {
|
|
9
|
+
1: 'grid-cols-1',
|
|
10
|
+
2: 'grid grid-cols-1 md:grid-cols-2 gap-x-6 gap-y-3',
|
|
11
|
+
3: 'grid grid-cols-1 md:grid-cols-3 gap-x-6 gap-y-3',
|
|
12
|
+
4: 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-x-6 gap-y-3',
|
|
13
|
+
};
|
|
14
|
+
function CopyableValue({ text, children }) {
|
|
15
|
+
const [copied, setCopied] = React.useState(false);
|
|
16
|
+
const handleCopy = async (e) => {
|
|
17
|
+
e.stopPropagation();
|
|
18
|
+
try {
|
|
19
|
+
await navigator.clipboard.writeText(text);
|
|
20
|
+
setCopied(true);
|
|
21
|
+
setTimeout(() => setCopied(false), 2000);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Ignore clipboard error
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return (jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1.5 group/copy", children: [jsxRuntime.jsx("span", { children: children }), jsxRuntime.jsx("button", { type: "button", onClick: handleCopy, className: "opacity-0 group-hover/copy:opacity-100 focus:opacity-100 transition-opacity p-0.5 text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 cursor-pointer", title: "Copy to clipboard", "aria-label": "Copy to clipboard", children: copied ? (jsxRuntime.jsx("svg", { className: "size-3.5 text-emerald-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) })) : (jsxRuntime.jsx("svg", { className: "size-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" }) })) })] }));
|
|
28
|
+
}
|
|
29
|
+
const DetailedInformation = React.forwardRef((props, ref) => {
|
|
30
|
+
const { className, title, subTitle, action, details = [], columns = 1, layout = 'horizontal', variant = 'flat', compact = false, bordered = false, divider = true, emptyValue = '- -', titleClass, detailsClass, labelClass, ...divProps } = props;
|
|
31
|
+
const isCard = variant === 'card';
|
|
32
|
+
const isBordered = bordered || variant === 'bordered' || isCard;
|
|
33
|
+
const hasTitles = title || subTitle || action;
|
|
34
|
+
const filteredDetails = details.filter((detail) => !detail.hidden);
|
|
35
|
+
const isMultiColumn = columns > 1;
|
|
36
|
+
return (jsxRuntime.jsxs("div", { ref: ref, className: buildClassname.buildClassName(isCard
|
|
37
|
+
? compact
|
|
38
|
+
? 'p-3 sm:p-4 bg-gray-50/60 dark:bg-gray-800/40 rounded-2xl border border-[var(--ui-border)]'
|
|
39
|
+
: 'p-4 sm:p-6 bg-gray-50/60 dark:bg-gray-800/40 rounded-2xl border border-[var(--ui-border)]'
|
|
40
|
+
: isBordered
|
|
41
|
+
? compact
|
|
42
|
+
? 'p-3 sm:p-4 border border-[var(--ui-border)] rounded-2xl'
|
|
43
|
+
: 'p-4 sm:p-6 border border-[var(--ui-border)] rounded-2xl'
|
|
44
|
+
: compact
|
|
45
|
+
? 'p-2 md:p-3'
|
|
46
|
+
: 'p-3 md:p-4', className), ...divProps, children: [hasTitles && (jsxRuntime.jsxs("div", { className: "mb-4 flex items-start justify-between gap-4", children: [jsxRuntime.jsxs("div", { children: [title && (jsxRuntime.jsx(HeadingText.HeadingText.SubTitle2, { className: buildClassname.buildClassName(titleClass), children: title })), subTitle && (jsxRuntime.jsx("p", { className: "mt-1 max-w-2xl text-sm/6 text-gray-500 dark:text-gray-400 font-normal", children: subTitle }))] }), action && jsxRuntime.jsx("div", { className: "shrink-0 flex items-center", children: action })] })), filteredDetails.length ? (jsxRuntime.jsx("div", { className: buildClassname.buildClassName('border-[var(--ui-border-muted)]', hasTitles && !isMultiColumn && 'border-t pt-2', detailsClass), children: jsxRuntime.jsx("dl", { className: buildClassname.buildClassName(COLUMN_GRID_CLASS[columns] || COLUMN_GRID_CLASS[1], !isMultiColumn && divider && 'divide-y divide-[var(--ui-border-muted)]'), children: filteredDetails.map((detail, index) => {
|
|
47
|
+
var _a;
|
|
48
|
+
const itemFallback = (_a = detail.emptyValue) !== null && _a !== void 0 ? _a : emptyValue;
|
|
49
|
+
const hasValue = detail.value !== undefined && detail.value !== null && detail.value !== '';
|
|
50
|
+
const displayValue = hasValue ? detail.value : itemFallback;
|
|
51
|
+
const copyText = typeof detail.value === 'string' || typeof detail.value === 'number'
|
|
52
|
+
? String(detail.value)
|
|
53
|
+
: '';
|
|
54
|
+
const isVertical = layout === 'vertical' || isMultiColumn;
|
|
55
|
+
return (jsxRuntime.jsxs("div", { className: buildClassname.buildClassName(isMultiColumn && isCard
|
|
56
|
+
? compact
|
|
57
|
+
? 'p-3 bg-white dark:bg-gray-900 rounded-xl border border-[var(--ui-border)] shadow-2xs flex flex-col gap-1'
|
|
58
|
+
: 'p-4 bg-white dark:bg-gray-900 rounded-xl border border-[var(--ui-border)] shadow-2xs flex flex-col gap-1'
|
|
59
|
+
: isVertical
|
|
60
|
+
? 'flex flex-col gap-1 py-2 px-1'
|
|
61
|
+
: 'grid grid-cols-3 gap-4 items-center py-2.5 px-1', compact && !isMultiColumn ? 'py-1.5' : ''), children: [jsxRuntime.jsxs("dt", { className: buildClassname.buildClassName('text-sm/6 font-medium text-gray-900 dark:text-gray-100 flex items-center gap-1.5', labelClass, detail.labelClass), children: [detail.icon && jsxRuntime.jsx("span", { className: "shrink-0 text-gray-400", children: detail.icon }), jsxRuntime.jsx("span", { children: detail.label }), detail.helpText && (jsxRuntime.jsx("span", { className: "text-xs text-gray-400 font-normal cursor-help", title: detail.helpText, children: "(?)" }))] }), jsxRuntime.jsx("dd", { className: buildClassname.buildClassName('text-sm/6 text-gray-700 dark:text-gray-300', !isVertical && 'sm:col-span-2 sm:mt-0', detail.contentClass), children: detail.copyable && copyText ? (jsxRuntime.jsx(CopyableValue, { text: copyText, children: displayValue })) : (displayValue) })] }, detail.label || index));
|
|
62
|
+
}) }) })) : null] }));
|
|
63
|
+
});
|
|
64
|
+
DetailedInformation.displayName = 'DetailedInformation';
|
|
65
|
+
|
|
66
|
+
exports.DetailedInformation = DetailedInformation;
|
|
67
|
+
//# sourceMappingURL=DetailedInformation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DetailedInformation.js","sources":["../../../../../src/components/DetailedInformation/DetailedInformation.tsx"],"sourcesContent":["import { forwardRef, useState, type ReactNode } from 'react'\nimport { buildClassName } from '../../utils/build-classname'\nimport { HeadingText } from '../HeadingText'\nimport type { Detail, DetailedInformationProps } from './DetailedInformation.types'\n\nconst COLUMN_GRID_CLASS: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid grid-cols-1 md:grid-cols-2 gap-x-6 gap-y-3',\n 3: 'grid grid-cols-1 md:grid-cols-3 gap-x-6 gap-y-3',\n 4: 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-x-6 gap-y-3',\n}\n\nfunction CopyableValue({ text, children }: { text: string; children: ReactNode }) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation()\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Ignore clipboard error\n }\n }\n\n return (\n <span className=\"inline-flex items-center gap-1.5 group/copy\">\n <span>{children}</span>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"opacity-0 group-hover/copy:opacity-100 focus:opacity-100 transition-opacity p-0.5 text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 cursor-pointer\"\n title=\"Copy to clipboard\"\n aria-label=\"Copy to clipboard\"\n >\n {copied ? (\n <svg\n className=\"size-3.5 text-emerald-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"size-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n )}\n </button>\n </span>\n )\n}\n\nexport const DetailedInformation = forwardRef<HTMLDivElement, DetailedInformationProps>(\n (props, ref) => {\n const {\n className,\n title,\n subTitle,\n action,\n details = [],\n columns = 1,\n layout = 'horizontal',\n variant = 'flat',\n compact = false,\n bordered = false,\n divider = true,\n emptyValue = '- -',\n titleClass,\n detailsClass,\n labelClass,\n ...divProps\n } = props\n\n const isCard = variant === 'card'\n const isBordered = bordered || variant === 'bordered' || isCard\n const hasTitles = title || subTitle || action\n const filteredDetails = details.filter((detail) => !detail.hidden)\n const isMultiColumn = columns > 1\n\n return (\n <div\n ref={ref}\n className={buildClassName(\n isCard\n ? compact\n ? 'p-3 sm:p-4 bg-gray-50/60 dark:bg-gray-800/40 rounded-2xl border border-[var(--ui-border)]'\n : 'p-4 sm:p-6 bg-gray-50/60 dark:bg-gray-800/40 rounded-2xl border border-[var(--ui-border)]'\n : isBordered\n ? compact\n ? 'p-3 sm:p-4 border border-[var(--ui-border)] rounded-2xl'\n : 'p-4 sm:p-6 border border-[var(--ui-border)] rounded-2xl'\n : compact\n ? 'p-2 md:p-3'\n : 'p-3 md:p-4',\n className,\n )}\n {...divProps}\n >\n {hasTitles && (\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <div>\n {title && (\n <HeadingText.SubTitle2 className={buildClassName(titleClass)}>\n {title}\n </HeadingText.SubTitle2>\n )}\n {subTitle && (\n <p className=\"mt-1 max-w-2xl text-sm/6 text-gray-500 dark:text-gray-400 font-normal\">\n {subTitle}\n </p>\n )}\n </div>\n {action && <div className=\"shrink-0 flex items-center\">{action}</div>}\n </div>\n )}\n\n {filteredDetails.length ? (\n <div\n className={buildClassName(\n 'border-[var(--ui-border-muted)]',\n hasTitles && !isMultiColumn && 'border-t pt-2',\n detailsClass,\n )}\n >\n <dl\n className={buildClassName(\n COLUMN_GRID_CLASS[columns] || COLUMN_GRID_CLASS[1],\n !isMultiColumn && divider && 'divide-y divide-[var(--ui-border-muted)]',\n )}\n >\n {filteredDetails.map((detail, index) => {\n const itemFallback = detail.emptyValue ?? emptyValue\n const hasValue =\n detail.value !== undefined && detail.value !== null && detail.value !== ''\n const displayValue = hasValue ? detail.value : itemFallback\n const copyText =\n typeof detail.value === 'string' || typeof detail.value === 'number'\n ? String(detail.value)\n : ''\n\n const isVertical = layout === 'vertical' || isMultiColumn\n\n return (\n <div\n key={detail.label || index}\n className={buildClassName(\n isMultiColumn && isCard\n ? compact\n ? 'p-3 bg-white dark:bg-gray-900 rounded-xl border border-[var(--ui-border)] shadow-2xs flex flex-col gap-1'\n : 'p-4 bg-white dark:bg-gray-900 rounded-xl border border-[var(--ui-border)] shadow-2xs flex flex-col gap-1'\n : isVertical\n ? 'flex flex-col gap-1 py-2 px-1'\n : 'grid grid-cols-3 gap-4 items-center py-2.5 px-1',\n compact && !isMultiColumn ? 'py-1.5' : '',\n )}\n >\n <dt\n className={buildClassName(\n 'text-sm/6 font-medium text-gray-900 dark:text-gray-100 flex items-center gap-1.5',\n labelClass,\n detail.labelClass,\n )}\n >\n {detail.icon && <span className=\"shrink-0 text-gray-400\">{detail.icon}</span>}\n <span>{detail.label}</span>\n {detail.helpText && (\n <span\n className=\"text-xs text-gray-400 font-normal cursor-help\"\n title={detail.helpText}\n >\n (?)\n </span>\n )}\n </dt>\n <dd\n className={buildClassName(\n 'text-sm/6 text-gray-700 dark:text-gray-300',\n !isVertical && 'sm:col-span-2 sm:mt-0',\n detail.contentClass,\n )}\n >\n {detail.copyable && copyText ? (\n <CopyableValue text={copyText}>{displayValue}</CopyableValue>\n ) : (\n displayValue\n )}\n </dd>\n </div>\n )\n })}\n </dl>\n </div>\n ) : null}\n </div>\n )\n },\n)\n\nDetailedInformation.displayName = 'DetailedInformation'\n"],"names":["useState","_jsxs","_jsx","forwardRef","buildClassName","HeadingText"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var buildClassname = require('../../utils/build-classname.js');
|
|
5
|
+
|
|
6
|
+
const Dot = ({ as = 'span', className, ...props }) => React.createElement(as, {
|
|
7
|
+
className: buildClassname.buildClassName('inline-block rounded-full bg-gray-500 dark:bg-gray-300', 'w-1 h-1', className),
|
|
8
|
+
...props,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
exports.Dot = Dot;
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/Dot/index.tsx"],"sourcesContent":["import React, { type HTMLAttributes, type JSX, type JSXElementConstructor } from 'react'\nimport { buildClassName } from '../../utils/build-classname'\n\nexport const Dot: React.FC<\n HTMLAttributes<HTMLElement> & {\n as?: keyof JSX.IntrinsicElements | JSXElementConstructor<any>\n }\n> = ({ as = 'span', className, ...props }) =>\n React.createElement(as, {\n className: buildClassName(\n 'inline-block rounded-full bg-gray-500 dark:bg-gray-300',\n 'w-1 h-1',\n className,\n ),\n ...props,\n })\n"],"names":["buildClassName"],"mappings":";;;;;MAGa,GAAG,GAIZ,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,KACvC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE;IACtB,SAAS,EAAEA,6BAAc,CACvB,wDAAwD,EACxD,SAAS,EACT,SAAS,CACV;AACD,IAAA,GAAG,KAAK;AACT,CAAA;;;;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 Button = require('../Button/Button.js');
|
|
8
|
+
var ChevronLeft = require('../Icons/ChevronLeft.svg.js');
|
|
9
|
+
var X = require('../Icons/X.svg.js');
|
|
10
|
+
|
|
11
|
+
const alignmentMap = {
|
|
12
|
+
center: 'items-center justify-center h-full',
|
|
13
|
+
start: 'justify-start h-full',
|
|
14
|
+
end: 'justify-end h-full',
|
|
15
|
+
top: 'items-start justify-center w-full',
|
|
16
|
+
bottom: 'items-end justify-center h-full',
|
|
17
|
+
};
|
|
18
|
+
const panelAlignmentMap = {
|
|
19
|
+
center: 'data-[closed]:scale-95 rounded-2xl',
|
|
20
|
+
start: 'data-[closed]:-translate-x-1/2 rounded-r-2xl',
|
|
21
|
+
end: 'data-[closed]:translate-x-1/2 rounded-l-2xl',
|
|
22
|
+
top: 'data-[closed]:-translate-y-1/2 rounded-b-2xl',
|
|
23
|
+
bottom: 'data-[closed]:translate-y-full rounded-t-2xl md:rounded-t-3xl max-h-[88vh] max-h-[88dvh]',
|
|
24
|
+
};
|
|
25
|
+
const panelSizeMap = {
|
|
26
|
+
xs: 'max-w-xs',
|
|
27
|
+
sm: 'max-w-sm',
|
|
28
|
+
md: 'max-w-md',
|
|
29
|
+
lg: 'max-w-lg',
|
|
30
|
+
xl: 'max-w-xl',
|
|
31
|
+
'2xl': 'max-w-2xl',
|
|
32
|
+
full: 'w-full',
|
|
33
|
+
};
|
|
34
|
+
const Drawer = ({ isOpen, onClose = () => { }, closeOnOutsideClick = true, align = 'end', size = 'md', backdrop = true, title, description, children, footer, footerSticky = false, panelClass = '', contentClass = '', titleClass = '', descriptionClass = '', titleSticky = false, showBackButton = false, showCloseButton = true, dragHandle, }) => {
|
|
35
|
+
const showTitleSection = Boolean(title || description || showBackButton || showCloseButton);
|
|
36
|
+
const shouldShowDragHandle = dragHandle !== null && dragHandle !== void 0 ? dragHandle : align === 'bottom';
|
|
37
|
+
const [viewportHeight, setViewportHeight] = React.useState(null);
|
|
38
|
+
React.useEffect(() => {
|
|
39
|
+
if (!isOpen) {
|
|
40
|
+
setViewportHeight(null);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const updateHeight = () => {
|
|
44
|
+
if (typeof window !== 'undefined' && window.visualViewport) {
|
|
45
|
+
setViewportHeight(window.visualViewport.height);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
updateHeight();
|
|
49
|
+
const vv = typeof window !== 'undefined' ? window.visualViewport : null;
|
|
50
|
+
vv === null || vv === void 0 ? void 0 : vv.addEventListener('resize', updateHeight);
|
|
51
|
+
vv === null || vv === void 0 ? void 0 : vv.addEventListener('scroll', updateHeight);
|
|
52
|
+
return () => {
|
|
53
|
+
vv === null || vv === void 0 ? void 0 : vv.removeEventListener('resize', updateHeight);
|
|
54
|
+
vv === null || vv === void 0 ? void 0 : vv.removeEventListener('scroll', updateHeight);
|
|
55
|
+
};
|
|
56
|
+
}, [isOpen]);
|
|
57
|
+
const handleDialogClose = () => {
|
|
58
|
+
if (closeOnOutsideClick) {
|
|
59
|
+
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
return (jsxRuntime.jsxs(react.Dialog, { open: isOpen, as: "div", className: "relative z-50 focus:outline-none", onClose: handleDialogClose, transition: true, children: [backdrop && (jsxRuntime.jsx(react.DialogBackdrop, { className: "fixed inset-0 bg-black/40 backdrop-blur-xs transition-opacity duration-200" })), jsxRuntime.jsx("div", { className: "fixed left-0 top-0 w-full", style: { height: viewportHeight ? `${viewportHeight}px` : '100dvh' }, children: jsxRuntime.jsx("div", { className: buildClassname.buildClassName('flex', alignmentMap[align]), children: jsxRuntime.jsxs(react.DialogPanel, { transition: true, className: buildClassname.buildClassName('w-full max-w-full bg-white dark:bg-gray-800 shadow-xl flex flex-col min-w-0', 'overflow-y-auto overflow-x-hidden overscroll-contain touch-pan-y [-webkit-overflow-scrolling:touch] duration-200 ease-out data-[closed]:opacity-0', panelAlignmentMap[align], panelSizeMap[size], panelClass), children: [shouldShowDragHandle && (jsxRuntime.jsx("div", { className: "w-12 h-1.5 rounded-full bg-gray-300 dark:bg-gray-600 mx-auto my-2.5 shrink-0 cursor-grab", "data-testid": "drawer-drag-handle" })), showTitleSection && (jsxRuntime.jsxs("div", { className: buildClassname.buildClassName('space-y-1 py-3 px-4 md:px-6 flex flex-col border-b border-[var(--ui-border)] shrink-0', titleSticky && 'sticky top-0 bg-white dark:bg-gray-800 z-10'), children: [jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3 min-w-0", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-2 min-w-0 flex-1", children: [showBackButton && (jsxRuntime.jsx(Button.Button, { iconOnly: true, "aria-label": "Back", variant: "plain", theme: "secondary", size: "xs", onClick: onClose, children: jsxRuntime.jsx(ChevronLeft.default, { className: "size-4" }) })), title && (jsxRuntime.jsx(react.DialogTitle, { as: "h3", className: buildClassname.buildClassName('text-lg font-semibold text-gray-900 dark:text-white truncate tracking-tight min-w-0', titleClass), children: title }))] }), showCloseButton && (jsxRuntime.jsx(Button.Button, { iconOnly: true, "aria-label": "Close drawer", variant: "plain", theme: "secondary", size: "xs", onClick: onClose, 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" }) }))] }), description && (jsxRuntime.jsx("p", { className: buildClassname.buildClassName('text-sm text-gray-500 dark:text-gray-400 font-normal truncate', descriptionClass), children: description }))] })), jsxRuntime.jsx("div", { className: buildClassname.buildClassName('flex-1 p-4 md:p-6 space-y-4 min-w-0', contentClass), children: children }), footer && (jsxRuntime.jsx("div", { className: buildClassname.buildClassName('p-4 border-t border-[var(--ui-border-muted)] bg-white dark:bg-gray-800 shrink-0 min-w-0', footerSticky && 'sticky bottom-0 z-10'), children: footer }))] }) }) })] }));
|
|
63
|
+
};
|
|
64
|
+
Drawer.displayName = 'Drawer';
|
|
65
|
+
|
|
66
|
+
exports.Drawer = Drawer;
|
|
67
|
+
//# sourceMappingURL=Drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drawer.js","sources":["../../../../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["import React from 'react'\nimport { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react'\nimport { buildClassName } from '../../utils/build-classname'\nimport { Button } from '../Button'\nimport ChevronLeftIcon from '../Icons/ChevronLeft.svg'\nimport XIcon from '../Icons/X.svg'\nimport type { AlignmentMap, DrawerProps, SizeMap } from './Drawer.types'\n\nconst alignmentMap: AlignmentMap = {\n center: 'items-center justify-center h-full',\n start: 'justify-start h-full',\n end: 'justify-end h-full',\n top: 'items-start justify-center w-full',\n bottom: 'items-end justify-center h-full',\n}\n\nconst panelAlignmentMap: AlignmentMap = {\n center: 'data-[closed]:scale-95 rounded-2xl',\n start: 'data-[closed]:-translate-x-1/2 rounded-r-2xl',\n end: 'data-[closed]:translate-x-1/2 rounded-l-2xl',\n top: 'data-[closed]:-translate-y-1/2 rounded-b-2xl',\n bottom:\n 'data-[closed]:translate-y-full rounded-t-2xl md:rounded-t-3xl max-h-[88vh] max-h-[88dvh]',\n}\n\nconst panelSizeMap: SizeMap = {\n xs: 'max-w-xs',\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n '2xl': 'max-w-2xl',\n full: 'w-full',\n}\n\nexport const Drawer: React.FC<DrawerProps> = ({\n isOpen,\n onClose = () => {},\n closeOnOutsideClick = true,\n align = 'end',\n size = 'md',\n backdrop = true,\n title,\n description,\n children,\n footer,\n footerSticky = false,\n panelClass = '',\n contentClass = '',\n titleClass = '',\n descriptionClass = '',\n titleSticky = false,\n showBackButton = false,\n showCloseButton = true,\n dragHandle,\n}) => {\n const showTitleSection = Boolean(title || description || showBackButton || showCloseButton)\n const shouldShowDragHandle = dragHandle ?? align === 'bottom'\n const [viewportHeight, setViewportHeight] = React.useState<number | null>(null)\n\n React.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 handleDialogClose = () => {\n if (closeOnOutsideClick) {\n onClose?.()\n }\n }\n\n return (\n <Dialog\n open={isOpen}\n as=\"div\"\n className=\"relative z-50 focus:outline-none\"\n onClose={handleDialogClose}\n transition\n >\n {backdrop && (\n <DialogBackdrop className=\"fixed inset-0 bg-black/40 backdrop-blur-xs transition-opacity duration-200\" />\n )}\n\n <div\n className=\"fixed left-0 top-0 w-full\"\n style={{ height: viewportHeight ? `${viewportHeight}px` : '100dvh' }}\n >\n <div className={buildClassName('flex', alignmentMap[align])}>\n <DialogPanel\n transition\n className={buildClassName(\n 'w-full max-w-full bg-white dark:bg-gray-800 shadow-xl flex flex-col min-w-0',\n 'overflow-y-auto overflow-x-hidden overscroll-contain touch-pan-y [-webkit-overflow-scrolling:touch] duration-200 ease-out data-[closed]:opacity-0',\n panelAlignmentMap[align],\n panelSizeMap[size],\n panelClass,\n )}\n >\n {/* Top drag handle indicator for mobile bottom sheet */}\n {shouldShowDragHandle && (\n <div\n className=\"w-12 h-1.5 rounded-full bg-gray-300 dark:bg-gray-600 mx-auto my-2.5 shrink-0 cursor-grab\"\n data-testid=\"drawer-drag-handle\"\n />\n )}\n\n {/* Header Section */}\n {showTitleSection && (\n <div\n className={buildClassName(\n 'space-y-1 py-3 px-4 md:px-6 flex flex-col border-b border-[var(--ui-border)] shrink-0',\n titleSticky && 'sticky top-0 bg-white dark:bg-gray-800 z-10',\n )}\n >\n <div className=\"flex items-center justify-between gap-3 min-w-0\">\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n {showBackButton && (\n <Button\n iconOnly\n aria-label=\"Back\"\n variant=\"plain\"\n theme=\"secondary\"\n size=\"xs\"\n onClick={onClose}\n >\n <ChevronLeftIcon className=\"size-4\" />\n </Button>\n )}\n {title && (\n <DialogTitle\n as=\"h3\"\n className={buildClassName(\n 'text-lg font-semibold text-gray-900 dark:text-white truncate tracking-tight min-w-0',\n titleClass,\n )}\n >\n {title}\n </DialogTitle>\n )}\n </div>\n\n {showCloseButton && (\n <Button\n iconOnly\n aria-label=\"Close drawer\"\n variant=\"plain\"\n theme=\"secondary\"\n size=\"xs\"\n onClick={onClose}\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 )}\n </div>\n\n {description && (\n <p\n className={buildClassName(\n 'text-sm text-gray-500 dark:text-gray-400 font-normal truncate',\n descriptionClass,\n )}\n >\n {description}\n </p>\n )}\n </div>\n )}\n\n {/* Content Body */}\n <div className={buildClassName('flex-1 p-4 md:p-6 space-y-4 min-w-0', contentClass)}>\n {children}\n </div>\n\n {/* Footer Section */}\n {footer && (\n <div\n className={buildClassName(\n 'p-4 border-t border-[var(--ui-border-muted)] bg-white dark:bg-gray-800 shrink-0 min-w-0',\n footerSticky && 'sticky bottom-0 z-10',\n )}\n >\n {footer}\n </div>\n )}\n </DialogPanel>\n </div>\n </div>\n </Dialog>\n )\n}\n\nDrawer.displayName = 'Drawer'\n"],"names":["_jsxs","Dialog","_jsx","DialogBackdrop","buildClassName","DialogPanel","Button","ChevronLeftIcon","DialogTitle","XIcon"],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
|
|
8
|
+
const WIDTH_CLASS = {
|
|
9
|
+
auto: 'w-auto min-w-[120px]',
|
|
10
|
+
sm: 'w-44',
|
|
11
|
+
md: 'w-56',
|
|
12
|
+
lg: 'w-64',
|
|
13
|
+
xl: 'w-72',
|
|
14
|
+
};
|
|
15
|
+
const Dropdown = ({ triggerButton, renderTriggerButton, className, items, renderItem, itemsContainerClass, transition = true, anchor = 'bottom start', width = 'md', menuItemClass, onMenuClick, ...restProps }) => {
|
|
16
|
+
var _a, _b, _c, _d;
|
|
17
|
+
const widthClass = WIDTH_CLASS[width] || width || WIDTH_CLASS.md;
|
|
18
|
+
const { theme, variant, size, disabled } = restProps;
|
|
19
|
+
return (jsxRuntime.jsxs(react.Menu, { as: "div", className: "relative inline-block", children: [renderTriggerButton ? (jsxRuntime.jsx(react.MenuButton, { as: React.Fragment, children: (state) => {
|
|
20
|
+
const rendered = renderTriggerButton(state);
|
|
21
|
+
if (React.isValidElement(rendered) && className) {
|
|
22
|
+
return React.cloneElement(rendered, {
|
|
23
|
+
className: buildClassname.buildClassName(rendered.props.className, className),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return rendered;
|
|
27
|
+
} })) : React.isValidElement(triggerButton) ? (jsxRuntime.jsx(react.MenuButton, { as: React.Fragment, children: React.cloneElement(triggerButton, {
|
|
28
|
+
className: buildClassname.buildClassName(triggerButton.props.className, className),
|
|
29
|
+
theme: (_a = triggerButton.props.theme) !== null && _a !== void 0 ? _a : theme,
|
|
30
|
+
variant: (_b = triggerButton.props.variant) !== null && _b !== void 0 ? _b : variant,
|
|
31
|
+
size: (_c = triggerButton.props.size) !== null && _c !== void 0 ? _c : size,
|
|
32
|
+
disabled: (_d = triggerButton.props.disabled) !== null && _d !== void 0 ? _d : disabled,
|
|
33
|
+
}) })) : (jsxRuntime.jsx(react.MenuButton, { as: React.Fragment, children: triggerButton })), jsxRuntime.jsx(react.MenuItems, { transition: transition, anchor: anchor, className: buildClassname.buildClassName('origin-top-right rounded-xl shadow-lg p-1.5 text-sm transition duration-100 ease-out z-50', 'border border-[var(--ui-border)] bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-200', 'focus:outline-none data-[closed]:scale-95 data-[closed]:opacity-0', '[--anchor-gap:--spacing(1)]', widthClass, itemsContainerClass), "data-testid": "dropdown-items", as: "ul", children: items.map((item, idx) => (jsxRuntime.jsxs(React.Fragment, { children: [item.groupTitle && (jsxRuntime.jsx("li", { className: "px-2.5 pt-2 pb-1 text-[11px] font-semibold text-gray-400 dark:text-gray-500 uppercase tracking-wider select-none", "data-testid": `dropdown-group-${item.id}`, children: item.groupTitle }, `group-${item.id}`)), jsxRuntime.jsx(react.MenuItem, { as: "li", disabled: item.disabled, children: ({ disabled, active }) => (jsxRuntime.jsx("div", { onClick: () => {
|
|
34
|
+
var _a;
|
|
35
|
+
if (!disabled) {
|
|
36
|
+
(_a = item.onClick) === null || _a === void 0 ? void 0 : _a.call(item, item);
|
|
37
|
+
onMenuClick === null || onMenuClick === void 0 ? void 0 : onMenuClick(item, idx);
|
|
38
|
+
}
|
|
39
|
+
}, className: buildClassname.buildClassName('flex items-center justify-between gap-3 w-full px-2.5 py-1.5 rounded-lg text-sm transition-colors cursor-pointer select-none', item.danger
|
|
40
|
+
? buildClassname.buildClassName('text-rose-600 dark:text-rose-400', active
|
|
41
|
+
? 'bg-rose-50 dark:bg-rose-950/40'
|
|
42
|
+
: 'hover:bg-rose-50 dark:hover:bg-rose-950/40')
|
|
43
|
+
: buildClassname.buildClassName('text-gray-700 dark:text-gray-200', active
|
|
44
|
+
? 'bg-gray-100 dark:bg-gray-700/80'
|
|
45
|
+
: 'hover:bg-gray-100/80 dark:hover:bg-gray-700/80'), disabled && 'opacity-40 cursor-not-allowed pointer-events-none', menuItemClass), "data-testid": `dropdown-item-${item.id}`, children: renderItem ? (renderItem(item)) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5 min-w-0 flex-1", children: [item.icon && (jsxRuntime.jsx("span", { className: buildClassname.buildClassName('shrink-0', item.danger ? 'text-rose-500' : 'text-gray-400 dark:text-gray-500'), children: item.icon })), jsxRuntime.jsxs("div", { className: "flex flex-col min-w-0", children: [item.label && jsxRuntime.jsx("span", { className: "font-medium truncate", children: item.label }), item.description && (jsxRuntime.jsx("span", { className: "text-xs text-gray-400 dark:text-gray-500 font-normal truncate", children: item.description }))] })] }), item.shortcut && (jsxRuntime.jsx("kbd", { className: "shrink-0 text-[10px] font-medium font-mono px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-700/80 border border-[var(--ui-border-muted)] text-gray-400 dark:text-gray-400", children: item.shortcut }))] })) })) }), item.divider && idx < items.length - 1 && (jsxRuntime.jsx("li", { className: "my-1 h-px bg-gray-200/80 dark:bg-gray-700/80", "data-testid": "dropdown-divider" }, `divider-${item.id}`))] }, item.id))) })] }));
|
|
46
|
+
};
|
|
47
|
+
Dropdown.displayName = 'Dropdown';
|
|
48
|
+
|
|
49
|
+
exports.Dropdown = Dropdown;
|
|
50
|
+
//# sourceMappingURL=Dropdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../../../../../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import React, { Fragment, cloneElement, isValidElement } from 'react'\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react'\nimport { buildClassName } from '../../utils/build-classname'\nimport type { DropdownItem, DropdownProps } from './Dropdown.types'\n\nconst WIDTH_CLASS: Record<string, string> = {\n auto: 'w-auto min-w-[120px]',\n sm: 'w-44',\n md: 'w-56',\n lg: 'w-64',\n xl: 'w-72',\n}\n\nexport const Dropdown: React.FC<DropdownProps> = ({\n triggerButton,\n renderTriggerButton,\n className,\n items,\n renderItem,\n itemsContainerClass,\n transition = true,\n anchor = 'bottom start',\n width = 'md',\n menuItemClass,\n onMenuClick,\n ...restProps\n}: DropdownProps & Record<string, any>) => {\n const widthClass = WIDTH_CLASS[width] || width || WIDTH_CLASS.md\n const { theme, variant, size, disabled } = restProps\n\n return (\n <Menu as=\"div\" className=\"relative inline-block\">\n {/* Trigger */}\n {renderTriggerButton ? (\n <MenuButton as={Fragment}>\n {(state) => {\n const rendered = renderTriggerButton(state)\n if (isValidElement(rendered) && className) {\n return cloneElement(rendered as React.ReactElement<any>, {\n className: buildClassName((rendered.props as any).className, className),\n })\n }\n return rendered as React.ReactElement\n }}\n </MenuButton>\n ) : isValidElement(triggerButton) ? (\n <MenuButton as={Fragment}>\n {cloneElement(triggerButton as React.ReactElement<any>, {\n className: buildClassName((triggerButton.props as any).className, className),\n theme: (triggerButton.props as any).theme ?? theme,\n variant: (triggerButton.props as any).variant ?? variant,\n size: (triggerButton.props as any).size ?? size,\n disabled: (triggerButton.props as any).disabled ?? disabled,\n })}\n </MenuButton>\n ) : (\n <MenuButton as={Fragment}>{triggerButton}</MenuButton>\n )}\n\n {/* Dropdown Panel */}\n <MenuItems\n transition={transition}\n anchor={anchor}\n className={buildClassName(\n 'origin-top-right rounded-xl shadow-lg p-1.5 text-sm transition duration-100 ease-out z-50',\n 'border border-[var(--ui-border)] bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-200',\n 'focus:outline-none data-[closed]:scale-95 data-[closed]:opacity-0',\n '[--anchor-gap:--spacing(1)]',\n widthClass,\n itemsContainerClass,\n )}\n data-testid=\"dropdown-items\"\n as=\"ul\"\n >\n {items.map((item: DropdownItem, idx: number) => (\n <Fragment key={item.id}>\n {item.groupTitle && (\n <li\n key={`group-${item.id}`}\n className=\"px-2.5 pt-2 pb-1 text-[11px] font-semibold text-gray-400 dark:text-gray-500 uppercase tracking-wider select-none\"\n data-testid={`dropdown-group-${item.id}`}\n >\n {item.groupTitle}\n </li>\n )}\n <MenuItem as=\"li\" disabled={item.disabled}>\n {({ disabled, active }) => (\n <div\n onClick={() => {\n if (!disabled) {\n item.onClick?.(item)\n onMenuClick?.(item, idx)\n }\n }}\n className={buildClassName(\n 'flex items-center justify-between gap-3 w-full px-2.5 py-1.5 rounded-lg text-sm transition-colors cursor-pointer select-none',\n item.danger\n ? buildClassName(\n 'text-rose-600 dark:text-rose-400',\n active\n ? 'bg-rose-50 dark:bg-rose-950/40'\n : 'hover:bg-rose-50 dark:hover:bg-rose-950/40',\n )\n : buildClassName(\n 'text-gray-700 dark:text-gray-200',\n active\n ? 'bg-gray-100 dark:bg-gray-700/80'\n : 'hover:bg-gray-100/80 dark:hover:bg-gray-700/80',\n ),\n disabled && 'opacity-40 cursor-not-allowed pointer-events-none',\n menuItemClass,\n )}\n data-testid={`dropdown-item-${item.id}`}\n >\n {renderItem ? (\n renderItem(item)\n ) : (\n <>\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n {item.icon && (\n <span\n className={buildClassName(\n 'shrink-0',\n item.danger ? 'text-rose-500' : 'text-gray-400 dark:text-gray-500',\n )}\n >\n {item.icon}\n </span>\n )}\n <div className=\"flex flex-col min-w-0\">\n {item.label && <span className=\"font-medium truncate\">{item.label}</span>}\n {item.description && (\n <span className=\"text-xs text-gray-400 dark:text-gray-500 font-normal truncate\">\n {item.description}\n </span>\n )}\n </div>\n </div>\n {item.shortcut && (\n <kbd className=\"shrink-0 text-[10px] font-medium font-mono px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-700/80 border border-[var(--ui-border-muted)] text-gray-400 dark:text-gray-400\">\n {item.shortcut}\n </kbd>\n )}\n </>\n )}\n </div>\n )}\n </MenuItem>\n {item.divider && idx < items.length - 1 && (\n <li\n key={`divider-${item.id}`}\n className=\"my-1 h-px bg-gray-200/80 dark:bg-gray-700/80\"\n data-testid=\"dropdown-divider\"\n />\n )}\n </Fragment>\n ))}\n </MenuItems>\n </Menu>\n )\n}\n\nDropdown.displayName = 'Dropdown'\n"],"names":["_jsxs","Menu","_jsx","MenuButton","Fragment","isValidElement","cloneElement","buildClassName","MenuItems","MenuItem","_Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var FolderPlus = require('../Icons/FolderPlus.svg.js');
|
|
5
|
+
var HeadingText = require('../HeadingText/HeadingText.js');
|
|
6
|
+
var BodyText = require('../BodyText/BodyText.js');
|
|
7
|
+
var buildClassname = require('../../utils/build-classname.js');
|
|
8
|
+
|
|
9
|
+
const EmptyState = ({ title, description, className, action = null, }) => {
|
|
10
|
+
return (jsxRuntime.jsx("div", { className: buildClassname.buildClassName('w-full flex justify-center px-4 pt-16', className), children: jsxRuntime.jsxs("div", { className: "max-w-md flex flex-col items-center gap-4", children: [jsxRuntime.jsx(FolderPlus.default, { className: "size-8 text-[var(--ui-text)]" }), jsxRuntime.jsx(HeadingText.HeadingText.SubTitle, { children: title }), description && (jsxRuntime.jsx(BodyText.BodyText, { as: "p", className: "text-center", muted: true, small: true, children: description })), action] }) }));
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
exports.EmptyState = EmptyState;
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/EmptyState/index.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react'\nimport FolderPlusIcon from '../Icons/FolderPlus.svg'\nimport { HeadingText } from '../HeadingText'\nimport { BodyText } from '../BodyText'\nimport { buildClassName } from '../../utils/build-classname'\n\nexport interface EmptyStateProps {\n title: string\n description?: string\n action?: ReactNode\n className?: string\n}\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({\n title,\n description,\n className,\n action = null,\n}) => {\n return (\n <div className={buildClassName('w-full flex justify-center px-4 pt-16', className)}>\n <div className=\"max-w-md flex flex-col items-center gap-4\">\n <FolderPlusIcon className=\"size-8 text-[var(--ui-text)]\" />\n <HeadingText.SubTitle>{title}</HeadingText.SubTitle>\n {description && (\n <BodyText as=\"p\" className=\"text-center\" muted small>\n {description}\n </BodyText>\n )}\n {action}\n </div>\n </div>\n )\n}\n"],"names":["_jsx","buildClassName","_jsxs","FolderPlusIcon","HeadingText","BodyText"],"mappings":";;;;;;;;AAaO,MAAM,UAAU,GAA8B,CAAC,EACpD,KAAK,EACL,WAAW,EACX,SAAS,EACT,MAAM,GAAG,IAAI,GACd,KAAI;IACH,QACEA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAEC,6BAAc,CAAC,uCAAuC,EAAE,SAAS,CAAC,EAAA,QAAA,EAChFC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2CAA2C,EAAA,QAAA,EAAA,CACxDF,cAAA,CAACG,kBAAc,EAAA,EAAC,SAAS,EAAC,8BAA8B,EAAA,CAAG,EAC3DH,cAAA,CAACI,uBAAW,CAAC,QAAQ,EAAA,EAAA,QAAA,EAAE,KAAK,EAAA,CAAwB,EACnD,WAAW,KACVJ,cAAA,CAACK,iBAAQ,EAAA,EAAC,EAAE,EAAC,GAAG,EAAC,SAAS,EAAC,aAAa,EAAC,KAAK,EAAA,IAAA,EAAC,KAAK,EAAA,IAAA,EAAA,QAAA,EACjD,WAAW,EAAA,CACH,CACZ,EACA,MAAM,CAAA,EAAA,CACH,EAAA,CACF;AAEV;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var buildClassname = require('../../utils/build-classname.js');
|
|
6
|
+
var commonResponsive = require('../common-responsive.js');
|
|
7
|
+
|
|
8
|
+
const FlexItem = React.forwardRef((props, ref) => {
|
|
9
|
+
const { as: Component = 'div', span, sm, md, lg, xl, xxl, grow, shrink, order, className, style, children, ...restProps } = props;
|
|
10
|
+
const classes = buildClassname.buildClassName('min-w-0 box-border', span && commonResponsive.FLEX_SPAN_MAP[String(span)], sm && commonResponsive.FLEX_SM_SPAN_MAP[String(sm)], md && commonResponsive.FLEX_MD_SPAN_MAP[String(md)], lg && commonResponsive.FLEX_LG_SPAN_MAP[String(lg)], xl && commonResponsive.FLEX_XL_SPAN_MAP[String(xl)], xxl && commonResponsive.FLEX_XXL_SPAN_MAP[String(xxl)], commonResponsive.resolveOrderClassName(order), grow === true && 'grow', grow === false && 'grow-0', shrink === true && 'shrink', shrink === false && 'shrink-0', className);
|
|
11
|
+
return (jsxRuntime.jsx(Component, { ref: ref, className: classes, style: { ...commonResponsive.resolveOrderStyle(order), ...style }, ...restProps, children: children }));
|
|
12
|
+
});
|
|
13
|
+
FlexItem.displayName = 'Flex.Item';
|
|
14
|
+
const Flex = React.forwardRef((props, ref) => {
|
|
15
|
+
const { as: Component = 'div', gap, gapX, gapY, align = 'stretch', justify = 'start', direction = 'row', wrap = 'wrap', inline = false, className, children, ...restProps } = props;
|
|
16
|
+
const classes = buildClassname.buildClassName(inline ? 'inline-flex' : 'flex', commonResponsive.DIRECTION_MAP[direction] || 'flex-row', commonResponsive.WRAP_MAP[wrap] || 'flex-wrap', 'w-full', !gapX && !gapY && gap && commonResponsive.GAP_MAP[gap], gapX && commonResponsive.GAP_X_MAP[gapX], gapY && commonResponsive.GAP_Y_MAP[gapY], commonResponsive.ALIGN_MAP[align] || 'items-stretch', commonResponsive.JUSTIFY_MAP[justify] || 'justify-start', className);
|
|
17
|
+
return (jsxRuntime.jsx(Component, { ref: ref, className: classes, ...restProps, children: children }));
|
|
18
|
+
});
|
|
19
|
+
Flex.Item = FlexItem;
|
|
20
|
+
Flex.Col = FlexItem;
|
|
21
|
+
Flex.displayName = 'Flex';
|
|
22
|
+
|
|
23
|
+
exports.Flex = Flex;
|
|
24
|
+
exports.FlexItem = FlexItem;
|
|
25
|
+
//# sourceMappingURL=Flex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Flex.js","sources":["../../../../../src/components/Flex/Flex.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { buildClassName } from '../../utils/build-classname'\nimport {\n ALIGN_MAP,\n DIRECTION_MAP,\n FLEX_LG_SPAN_MAP,\n FLEX_MD_SPAN_MAP,\n FLEX_SM_SPAN_MAP,\n FLEX_SPAN_MAP,\n FLEX_XL_SPAN_MAP,\n FLEX_XXL_SPAN_MAP,\n GAP_MAP,\n GAP_X_MAP,\n GAP_Y_MAP,\n JUSTIFY_MAP,\n WRAP_MAP,\n resolveOrderClassName,\n resolveOrderStyle,\n} from '../common-responsive'\nimport type { FlexComponent, FlexItemProps, FlexProps } from './Flex.types'\n\nexport const FlexItem = forwardRef<HTMLDivElement, FlexItemProps>((props, ref) => {\n const {\n as: Component = 'div',\n span,\n sm,\n md,\n lg,\n xl,\n xxl,\n grow,\n shrink,\n order,\n className,\n style,\n children,\n ...restProps\n } = props\n\n const classes = buildClassName(\n 'min-w-0 box-border',\n span && FLEX_SPAN_MAP[String(span)],\n sm && FLEX_SM_SPAN_MAP[String(sm)],\n md && FLEX_MD_SPAN_MAP[String(md)],\n lg && FLEX_LG_SPAN_MAP[String(lg)],\n xl && FLEX_XL_SPAN_MAP[String(xl)],\n xxl && FLEX_XXL_SPAN_MAP[String(xxl)],\n resolveOrderClassName(order),\n grow === true && 'grow',\n grow === false && 'grow-0',\n shrink === true && 'shrink',\n shrink === false && 'shrink-0',\n className,\n )\n\n return (\n <Component\n ref={ref}\n className={classes}\n style={{ ...resolveOrderStyle(order), ...style }}\n {...restProps}\n >\n {children}\n </Component>\n )\n})\n\nFlexItem.displayName = 'Flex.Item'\n\nexport const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {\n const {\n as: Component = 'div',\n gap,\n gapX,\n gapY,\n align = 'stretch',\n justify = 'start',\n direction = 'row',\n wrap = 'wrap',\n inline = false,\n className,\n children,\n ...restProps\n } = props\n\n const classes = buildClassName(\n inline ? 'inline-flex' : 'flex',\n DIRECTION_MAP[direction] || 'flex-row',\n WRAP_MAP[wrap] || 'flex-wrap',\n 'w-full',\n !gapX && !gapY && gap && GAP_MAP[gap],\n gapX && GAP_X_MAP[gapX],\n gapY && GAP_Y_MAP[gapY],\n ALIGN_MAP[align] || 'items-stretch',\n JUSTIFY_MAP[justify] || 'justify-start',\n className,\n )\n\n return (\n <Component ref={ref} className={classes} {...restProps}>\n {children}\n </Component>\n )\n}) as unknown as FlexComponent\n\nFlex.Item = FlexItem\nFlex.Col = FlexItem\nFlex.displayName = 'Flex'\n"],"names":["forwardRef","buildClassName","FLEX_SPAN_MAP","FLEX_SM_SPAN_MAP","FLEX_MD_SPAN_MAP","FLEX_LG_SPAN_MAP","FLEX_XL_SPAN_MAP","FLEX_XXL_SPAN_MAP","resolveOrderClassName","_jsx","resolveOrderStyle","DIRECTION_MAP","WRAP_MAP","GAP_MAP","GAP_X_MAP","GAP_Y_MAP","ALIGN_MAP","JUSTIFY_MAP"],"mappings":";;;;;;;AAqBO,MAAM,QAAQ,GAAGA,gBAAU,CAAgC,CAAC,KAAK,EAAE,GAAG,KAAI;AAC/E,IAAA,MAAM,EACJ,EAAE,EAAE,SAAS,GAAG,KAAK,EACrB,IAAI,EACJ,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,GAAG,EACH,IAAI,EACJ,MAAM,EACN,KAAK,EACL,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,SAAS,EACb,GAAG,KAAK;IAET,MAAM,OAAO,GAAGC,6BAAc,CAC5B,oBAAoB,EACpB,IAAI,IAAIC,8BAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EACnC,EAAE,IAAIC,iCAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAClC,EAAE,IAAIC,iCAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAClC,EAAE,IAAIC,iCAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAClC,EAAE,IAAIC,iCAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAClC,GAAG,IAAIC,kCAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EACrCC,sCAAqB,CAAC,KAAK,CAAC,EAC5B,IAAI,KAAK,IAAI,IAAI,MAAM,EACvB,IAAI,KAAK,KAAK,IAAI,QAAQ,EAC1B,MAAM,KAAK,IAAI,IAAI,QAAQ,EAC3B,MAAM,KAAK,KAAK,IAAI,UAAU,EAC9B,SAAS,CACV;AAED,IAAA,QACEC,cAAA,CAAC,SAAS,EAAA,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,EAAE,GAAGC,kCAAiB,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,EAAA,GAC5C,SAAS,EAAA,QAAA,EAEZ,QAAQ,EAAA,CACC;AAEhB,CAAC;AAED,QAAQ,CAAC,WAAW,GAAG,WAAW;AAE3B,MAAM,IAAI,GAAGV,gBAAU,CAA4B,CAAC,KAAK,EAAE,GAAG,KAAI;AACvE,IAAA,MAAM,EACJ,EAAE,EAAE,SAAS,GAAG,KAAK,EACrB,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,KAAK,GAAG,SAAS,EACjB,OAAO,GAAG,OAAO,EACjB,SAAS,GAAG,KAAK,EACjB,IAAI,GAAG,MAAM,EACb,MAAM,GAAG,KAAK,EACd,SAAS,EACT,QAAQ,EACR,GAAG,SAAS,EACb,GAAG,KAAK;AAET,IAAA,MAAM,OAAO,GAAGC,6BAAc,CAC5B,MAAM,GAAG,aAAa,GAAG,MAAM,EAC/BU,8BAAa,CAAC,SAAS,CAAC,IAAI,UAAU,EACtCC,yBAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,EAC7B,QAAQ,EACR,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,IAAIC,wBAAO,CAAC,GAAG,CAAC,EACrC,IAAI,IAAIC,0BAAS,CAAC,IAAI,CAAC,EACvB,IAAI,IAAIC,0BAAS,CAAC,IAAI,CAAC,EACvBC,0BAAS,CAAC,KAAK,CAAC,IAAI,eAAe,EACnCC,4BAAW,CAAC,OAAO,CAAC,IAAI,eAAe,EACvC,SAAS,CACV;AAED,IAAA,QACER,cAAA,CAAC,SAAS,EAAA,EAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAA,GAAM,SAAS,YACnD,QAAQ,EAAA,CACC;AAEhB,CAAC;AAED,IAAI,CAAC,IAAI,GAAG,QAAQ;AACpB,IAAI,CAAC,GAAG,GAAG,QAAQ;AACnB,IAAI,CAAC,WAAW,GAAG,MAAM;;;;;"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var buildClassname = require('../../utils/build-classname.js');
|
|
6
|
+
|
|
7
|
+
function FloatingActionButton({ icon, activeIcon, label, variant = 'primary', size = 'md', position = 'bottom-right', speedDialActions, isOpen: externalIsOpen, onToggle, disabled = false, onClick, 'aria-label': ariaLabel, containerClass = '', className = '', }) {
|
|
8
|
+
const [internalIsOpen, setInternalIsOpen] = React.useState(false);
|
|
9
|
+
const isSpeedDial = Array.isArray(speedDialActions) && speedDialActions.length > 0;
|
|
10
|
+
const isOpen = externalIsOpen !== undefined ? externalIsOpen : internalIsOpen;
|
|
11
|
+
const toggleOpen = () => {
|
|
12
|
+
const nextState = !isOpen;
|
|
13
|
+
setInternalIsOpen(nextState);
|
|
14
|
+
onToggle === null || onToggle === void 0 ? void 0 : onToggle(nextState);
|
|
15
|
+
};
|
|
16
|
+
const handleMainClick = () => {
|
|
17
|
+
if (disabled)
|
|
18
|
+
return;
|
|
19
|
+
if (isSpeedDial) {
|
|
20
|
+
toggleOpen();
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
onClick === null || onClick === void 0 ? void 0 : onClick();
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const handleSubActionClick = (action) => {
|
|
27
|
+
var _a;
|
|
28
|
+
if (action.disabled)
|
|
29
|
+
return;
|
|
30
|
+
(_a = action.onClick) === null || _a === void 0 ? void 0 : _a.call(action);
|
|
31
|
+
setInternalIsOpen(false);
|
|
32
|
+
onToggle === null || onToggle === void 0 ? void 0 : onToggle(false);
|
|
33
|
+
};
|
|
34
|
+
const positionClasses = {
|
|
35
|
+
'bottom-right': 'fixed bottom-6 right-6 z-40',
|
|
36
|
+
'bottom-left': 'fixed bottom-6 left-6 z-40',
|
|
37
|
+
'bottom-center': 'fixed bottom-6 left-1/2 -translate-x-1/2 z-40',
|
|
38
|
+
inline: 'relative inline-flex z-10',
|
|
39
|
+
}[position];
|
|
40
|
+
const variantClasses = {
|
|
41
|
+
primary: 'bg-blue-600 hover:bg-blue-700 active:bg-blue-800 text-white shadow-lg shadow-blue-600/30',
|
|
42
|
+
secondary: 'bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-800 dark:text-gray-100 border border-[var(--ui-border)] shadow-lg',
|
|
43
|
+
danger: 'bg-red-600 hover:bg-red-700 active:bg-red-800 text-white shadow-lg shadow-red-600/30',
|
|
44
|
+
dark: 'bg-gray-900 hover:bg-black active:bg-black text-white shadow-lg shadow-gray-900/40',
|
|
45
|
+
}[variant];
|
|
46
|
+
const sizeClasses = {
|
|
47
|
+
sm: label ? 'px-3.5 py-2 text-xs gap-2 rounded-full' : 'p-2.5 rounded-full',
|
|
48
|
+
md: label ? 'px-5 py-3 text-sm gap-2.5 rounded-full' : 'p-3.5 rounded-full',
|
|
49
|
+
lg: label ? 'px-6 py-4 text-base gap-3 rounded-full' : 'p-4 rounded-full',
|
|
50
|
+
}[size];
|
|
51
|
+
return (jsxRuntime.jsxs("div", { className: buildClassname.buildClassName(positionClasses, containerClass), "data-testid": "fab-container", children: [isSpeedDial && isOpen && (jsxRuntime.jsx("div", { className: "fixed inset-0 bg-black/25 backdrop-blur-xs z-30 transition-opacity duration-200", onClick: () => toggleOpen(), "data-testid": "fab-backdrop" })), isSpeedDial && (jsxRuntime.jsx("div", { className: buildClassname.buildClassName('absolute bottom-full mb-3 flex flex-col gap-2.5 z-40 transition-all duration-200 origin-bottom', position === 'bottom-left'
|
|
52
|
+
? 'items-start left-0'
|
|
53
|
+
: position === 'bottom-center'
|
|
54
|
+
? 'items-center left-1/2 -translate-x-1/2'
|
|
55
|
+
: 'items-end right-0', isOpen
|
|
56
|
+
? 'scale-100 opacity-100 pointer-events-auto'
|
|
57
|
+
: 'scale-90 opacity-0 pointer-events-none'), "data-testid": "fab-speed-dial-menu", children: speedDialActions.map((action) => {
|
|
58
|
+
const isDanger = action.theme === 'danger';
|
|
59
|
+
const isPrimary = action.theme === 'primary';
|
|
60
|
+
return (jsxRuntime.jsxs("button", { type: "button", disabled: action.disabled, onClick: () => handleSubActionClick(action), className: buildClassname.buildClassName('flex items-center gap-2.5 py-2 px-3.5 rounded-full text-xs font-semibold shadow-md transition-all duration-150 cursor-pointer group', action.disabled && 'opacity-50 cursor-not-allowed pointer-events-none', !action.disabled &&
|
|
61
|
+
(isDanger
|
|
62
|
+
? 'bg-red-600 text-white hover:bg-red-700'
|
|
63
|
+
: isPrimary
|
|
64
|
+
? 'bg-blue-600 text-white hover:bg-blue-700'
|
|
65
|
+
: 'bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-100 hover:bg-gray-100 dark:hover:bg-gray-700 border border-[var(--ui-border)]')), "data-testid": `fab-action-${action.id}`, children: [jsxRuntime.jsx("span", { className: "text-sm", children: action.icon }), jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: action.label })] }, action.id));
|
|
66
|
+
}) })), jsxRuntime.jsxs("button", { type: "button", disabled: disabled, onClick: handleMainClick, "aria-label": ariaLabel || (typeof label === 'string' ? label : 'Floating action'), "aria-expanded": isSpeedDial ? isOpen : undefined, className: buildClassname.buildClassName('inline-flex items-center justify-center font-semibold transition-all duration-200 cursor-pointer select-none z-40 active:scale-95', disabled && 'opacity-50 cursor-not-allowed pointer-events-none shadow-none', variantClasses, sizeClasses, className), "data-testid": "fab-button", children: [jsxRuntime.jsx("span", { className: buildClassname.buildClassName('transition-transform duration-200', isOpen && 'rotate-45'), children: isOpen && activeIcon ? activeIcon : icon }), label && jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: label })] })] }));
|
|
67
|
+
}
|
|
68
|
+
FloatingActionButton.displayName = 'FloatingActionButton';
|
|
69
|
+
|
|
70
|
+
exports.FloatingActionButton = FloatingActionButton;
|
|
71
|
+
//# sourceMappingURL=FloatingActionButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FloatingActionButton.js","sources":["../../../../../src/components/FloatingActionButton/FloatingActionButton.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport type { FloatingActionButtonProps, FABSpeedDialAction } from './FloatingActionButton.types'\nimport { buildClassName } from '../../utils/build-classname'\n\nexport function FloatingActionButton({\n icon,\n activeIcon,\n label,\n variant = 'primary',\n size = 'md',\n position = 'bottom-right',\n speedDialActions,\n isOpen: externalIsOpen,\n onToggle,\n disabled = false,\n onClick,\n 'aria-label': ariaLabel,\n containerClass = '',\n className = '',\n}: FloatingActionButtonProps) {\n const [internalIsOpen, setInternalIsOpen] = useState(false)\n\n const isSpeedDial = Array.isArray(speedDialActions) && speedDialActions.length > 0\n const isOpen = externalIsOpen !== undefined ? externalIsOpen : internalIsOpen\n\n const toggleOpen = () => {\n const nextState = !isOpen\n setInternalIsOpen(nextState)\n onToggle?.(nextState)\n }\n\n const handleMainClick = () => {\n if (disabled) return\n if (isSpeedDial) {\n toggleOpen()\n } else {\n onClick?.()\n }\n }\n\n const handleSubActionClick = (action: FABSpeedDialAction) => {\n if (action.disabled) return\n action.onClick?.()\n setInternalIsOpen(false)\n onToggle?.(false)\n }\n\n const positionClasses = {\n 'bottom-right': 'fixed bottom-6 right-6 z-40',\n 'bottom-left': 'fixed bottom-6 left-6 z-40',\n 'bottom-center': 'fixed bottom-6 left-1/2 -translate-x-1/2 z-40',\n inline: 'relative inline-flex z-10',\n }[position]\n\n const variantClasses = {\n primary:\n 'bg-blue-600 hover:bg-blue-700 active:bg-blue-800 text-white shadow-lg shadow-blue-600/30',\n secondary:\n 'bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-800 dark:text-gray-100 border border-[var(--ui-border)] shadow-lg',\n danger: 'bg-red-600 hover:bg-red-700 active:bg-red-800 text-white shadow-lg shadow-red-600/30',\n dark: 'bg-gray-900 hover:bg-black active:bg-black text-white shadow-lg shadow-gray-900/40',\n }[variant]\n\n const sizeClasses = {\n sm: label ? 'px-3.5 py-2 text-xs gap-2 rounded-full' : 'p-2.5 rounded-full',\n md: label ? 'px-5 py-3 text-sm gap-2.5 rounded-full' : 'p-3.5 rounded-full',\n lg: label ? 'px-6 py-4 text-base gap-3 rounded-full' : 'p-4 rounded-full',\n }[size]\n\n return (\n <div className={buildClassName(positionClasses, containerClass)} data-testid=\"fab-container\">\n {/* Speed Dial Backdrop Overlay */}\n {isSpeedDial && isOpen && (\n <div\n className=\"fixed inset-0 bg-black/25 backdrop-blur-xs z-30 transition-opacity duration-200\"\n onClick={() => toggleOpen()}\n data-testid=\"fab-backdrop\"\n />\n )}\n\n {/* Speed Dial Sub-Actions List */}\n {isSpeedDial && (\n <div\n className={buildClassName(\n 'absolute bottom-full mb-3 flex flex-col gap-2.5 z-40 transition-all duration-200 origin-bottom',\n position === 'bottom-left'\n ? 'items-start left-0'\n : position === 'bottom-center'\n ? 'items-center left-1/2 -translate-x-1/2'\n : 'items-end right-0',\n isOpen\n ? 'scale-100 opacity-100 pointer-events-auto'\n : 'scale-90 opacity-0 pointer-events-none',\n )}\n data-testid=\"fab-speed-dial-menu\"\n >\n {speedDialActions.map((action) => {\n const isDanger = action.theme === 'danger'\n const isPrimary = action.theme === 'primary'\n\n return (\n <button\n key={action.id}\n type=\"button\"\n disabled={action.disabled}\n onClick={() => handleSubActionClick(action)}\n className={buildClassName(\n 'flex items-center gap-2.5 py-2 px-3.5 rounded-full text-xs font-semibold shadow-md transition-all duration-150 cursor-pointer group',\n action.disabled && 'opacity-50 cursor-not-allowed pointer-events-none',\n !action.disabled &&\n (isDanger\n ? 'bg-red-600 text-white hover:bg-red-700'\n : isPrimary\n ? 'bg-blue-600 text-white hover:bg-blue-700'\n : 'bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-100 hover:bg-gray-100 dark:hover:bg-gray-700 border border-[var(--ui-border)]'),\n )}\n data-testid={`fab-action-${action.id}`}\n >\n <span className=\"text-sm\">{action.icon}</span>\n <span className=\"whitespace-nowrap\">{action.label}</span>\n </button>\n )\n })}\n </div>\n )}\n\n {/* Primary Floating Action Button */}\n <button\n type=\"button\"\n disabled={disabled}\n onClick={handleMainClick}\n aria-label={ariaLabel || (typeof label === 'string' ? label : 'Floating action')}\n aria-expanded={isSpeedDial ? isOpen : undefined}\n className={buildClassName(\n 'inline-flex items-center justify-center font-semibold transition-all duration-200 cursor-pointer select-none z-40 active:scale-95',\n disabled && 'opacity-50 cursor-not-allowed pointer-events-none shadow-none',\n variantClasses,\n sizeClasses,\n className,\n )}\n data-testid=\"fab-button\"\n >\n <span\n className={buildClassName('transition-transform duration-200', isOpen && 'rotate-45')}\n >\n {isOpen && activeIcon ? activeIcon : icon}\n </span>\n {label && <span className=\"whitespace-nowrap\">{label}</span>}\n </button>\n </div>\n )\n}\n\nFloatingActionButton.displayName = 'FloatingActionButton'\n"],"names":["useState","_jsxs","buildClassName","_jsx"],"mappings":"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"}
|