cisse-vue-ui 0.7.2 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{PageHero.vue_vue_type_script_setup_true_lang-C-YXGDTY.js → PageHero.vue_vue_type_script_setup_true_lang-BYx595-2.js} +87 -47
- package/dist/{PageHero.vue_vue_type_script_setup_true_lang-C-YXGDTY.js.map → PageHero.vue_vue_type_script_setup_true_lang-BYx595-2.js.map} +1 -1
- package/dist/{TagsInput-D0O6z6le.js → TagsInput-DtoJKN3L.js} +17 -5
- package/dist/TagsInput-DtoJKN3L.js.map +1 -0
- package/dist/components/form/index.js +1 -1
- package/dist/components/index.js +2 -2
- package/dist/components/layout/index.js +1 -1
- package/dist/{index-D9_zMCpN.js → index-F9yanU6_.js} +3 -3
- package/dist/index-F9yanU6_.js.map +1 -0
- package/dist/index.js +3 -3
- package/package.json +1 -1
- package/dist/BadgeType.vue_vue_type_script_setup_true_lang-zs0NXN4g.cjs +0 -145
- package/dist/BadgeType.vue_vue_type_script_setup_true_lang-zs0NXN4g.cjs.map +0 -1
- package/dist/Button.vue_vue_type_script_setup_true_lang-CXRj7LEP.cjs +0 -98
- package/dist/Button.vue_vue_type_script_setup_true_lang-CXRj7LEP.cjs.map +0 -1
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs +0 -928
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs.map +0 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs +0 -228
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs.map +0 -1
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-HwjuvIJX.cjs +0 -2242
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-HwjuvIJX.cjs.map +0 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs +0 -149
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs.map +0 -1
- package/dist/PageHero.vue_vue_type_script_setup_true_lang-CKCmOxOa.cjs +0 -724
- package/dist/PageHero.vue_vue_type_script_setup_true_lang-CKCmOxOa.cjs.map +0 -1
- package/dist/TagsInput-BF3zRMcU.cjs +0 -3682
- package/dist/TagsInput-BF3zRMcU.cjs.map +0 -1
- package/dist/TagsInput-D0O6z6le.js.map +0 -1
- package/dist/_plugin-vue_export-helper-DM9IkUGy.cjs +0 -10
- package/dist/_plugin-vue_export-helper-DM9IkUGy.cjs.map +0 -1
- package/dist/components/core/Accordion.stories.d.ts +0 -11
- package/dist/components/core/Accordion.test.d.ts +0 -1
- package/dist/components/core/Accordion.vue.d.ts +0 -27
- package/dist/components/core/AccordionItem.stories.d.ts +0 -10
- package/dist/components/core/AccordionItem.vue.d.ts +0 -29
- package/dist/components/core/AutocompleteComponent.stories.d.ts +0 -14
- package/dist/components/core/AutocompleteComponent.test.d.ts +0 -1
- package/dist/components/core/AutocompleteComponent.vue.d.ts +0 -25
- package/dist/components/core/Avatar.stories.d.ts +0 -12
- package/dist/components/core/Avatar.test.d.ts +0 -1
- package/dist/components/core/Avatar.vue.d.ts +0 -20
- package/dist/components/core/Breadcrumb.stories.d.ts +0 -11
- package/dist/components/core/Breadcrumb.test.d.ts +0 -1
- package/dist/components/core/Breadcrumb.vue.d.ts +0 -26
- package/dist/components/core/Button.stories.d.ts +0 -18
- package/dist/components/core/Button.test.d.ts +0 -1
- package/dist/components/core/Button.vue.d.ts +0 -49
- package/dist/components/core/CardComponent.stories.d.ts +0 -13
- package/dist/components/core/CardComponent.test.d.ts +0 -1
- package/dist/components/core/CardComponent.vue.d.ts +0 -40
- package/dist/components/core/CollapsibleCard.stories.d.ts +0 -10
- package/dist/components/core/CollapsibleCard.test.d.ts +0 -1
- package/dist/components/core/CollapsibleCard.vue.d.ts +0 -38
- package/dist/components/core/DarkModeToggle.stories.d.ts +0 -15
- package/dist/components/core/DarkModeToggle.test.d.ts +0 -1
- package/dist/components/core/DarkModeToggle.vue.d.ts +0 -21
- package/dist/components/core/Drawer.stories.d.ts +0 -12
- package/dist/components/core/Drawer.test.d.ts +0 -1
- package/dist/components/core/Drawer.vue.d.ts +0 -50
- package/dist/components/core/Dropdown.stories.d.ts +0 -11
- package/dist/components/core/Dropdown.test.d.ts +0 -1
- package/dist/components/core/Dropdown.vue.d.ts +0 -56
- package/dist/components/core/FilterTabs.stories.d.ts +0 -14
- package/dist/components/core/FilterTabs.test.d.ts +0 -1
- package/dist/components/core/FilterTabs.vue.d.ts +0 -29
- package/dist/components/core/MenuItem.stories.d.ts +0 -13
- package/dist/components/core/MenuItem.test.d.ts +0 -1
- package/dist/components/core/MenuItem.vue.d.ts +0 -16
- package/dist/components/core/MobileList.stories.d.ts +0 -13
- package/dist/components/core/MobileList.test.d.ts +0 -1
- package/dist/components/core/MobileList.vue.d.ts +0 -86
- package/dist/components/core/Popover.stories.d.ts +0 -10
- package/dist/components/core/Popover.test.d.ts +0 -1
- package/dist/components/core/Popover.vue.d.ts +0 -44
- package/dist/components/core/ResponsiveList.stories.d.ts +0 -15
- package/dist/components/core/ResponsiveList.test.d.ts +0 -1
- package/dist/components/core/ResponsiveList.vue.d.ts +0 -128
- package/dist/components/core/StatsCard.stories.d.ts +0 -15
- package/dist/components/core/StatsCard.test.d.ts +0 -1
- package/dist/components/core/StatsCard.vue.d.ts +0 -44
- package/dist/components/core/StatsGrid.stories.d.ts +0 -12
- package/dist/components/core/StatsGrid.test.d.ts +0 -1
- package/dist/components/core/StatsGrid.vue.d.ts +0 -16
- package/dist/components/core/StatusBadge.stories.d.ts +0 -13
- package/dist/components/core/StatusBadge.test.d.ts +0 -1
- package/dist/components/core/StatusBadge.vue.d.ts +0 -21
- package/dist/components/core/Stepper.stories.d.ts +0 -12
- package/dist/components/core/Stepper.test.d.ts +0 -1
- package/dist/components/core/Stepper.vue.d.ts +0 -22
- package/dist/components/core/TabPanel.stories.d.ts +0 -8
- package/dist/components/core/TabPanel.test.d.ts +0 -1
- package/dist/components/core/TabPanel.vue.d.ts +0 -21
- package/dist/components/core/TableAction.stories.d.ts +0 -14
- package/dist/components/core/TableAction.test.d.ts +0 -1
- package/dist/components/core/TableAction.vue.d.ts +0 -8
- package/dist/components/core/TableComponent.stories.d.ts +0 -16
- package/dist/components/core/TableComponent.test.d.ts +0 -1
- package/dist/components/core/TableComponent.vue.d.ts +0 -67
- package/dist/components/core/Tabs.stories.d.ts +0 -10
- package/dist/components/core/Tabs.test.d.ts +0 -1
- package/dist/components/core/Tabs.vue.d.ts +0 -39
- package/dist/components/core/Timeline.stories.d.ts +0 -11
- package/dist/components/core/Timeline.test.d.ts +0 -1
- package/dist/components/core/Timeline.vue.d.ts +0 -34
- package/dist/components/core/Tooltip.stories.d.ts +0 -10
- package/dist/components/core/Tooltip.test.d.ts +0 -1
- package/dist/components/core/Tooltip.vue.d.ts +0 -34
- package/dist/components/core/index.cjs +0 -33
- package/dist/components/core/index.cjs.map +0 -1
- package/dist/components/core/index.test.d.ts +0 -1
- package/dist/components/feedback/Alert.stories.d.ts +0 -13
- package/dist/components/feedback/Alert.test.d.ts +0 -1
- package/dist/components/feedback/Alert.vue.d.ts +0 -34
- package/dist/components/feedback/CardSkeleton.stories.d.ts +0 -11
- package/dist/components/feedback/CardSkeleton.test.d.ts +0 -1
- package/dist/components/feedback/CardSkeleton.vue.d.ts +0 -14
- package/dist/components/feedback/ConfirmDialog.stories.d.ts +0 -12
- package/dist/components/feedback/ConfirmDialog.test.d.ts +0 -1
- package/dist/components/feedback/ConfirmDialog.vue.d.ts +0 -53
- package/dist/components/feedback/EmptyState.stories.d.ts +0 -13
- package/dist/components/feedback/EmptyState.test.d.ts +0 -1
- package/dist/components/feedback/EmptyState.vue.d.ts +0 -29
- package/dist/components/feedback/ListSkeleton.stories.d.ts +0 -12
- package/dist/components/feedback/ListSkeleton.test.d.ts +0 -1
- package/dist/components/feedback/ListSkeleton.vue.d.ts +0 -17
- package/dist/components/feedback/LoadingSpinner.stories.d.ts +0 -11
- package/dist/components/feedback/LoadingSpinner.test.d.ts +0 -1
- package/dist/components/feedback/LoadingSpinner.vue.d.ts +0 -12
- package/dist/components/feedback/Modal.stories.d.ts +0 -11
- package/dist/components/feedback/Modal.test.d.ts +0 -1
- package/dist/components/feedback/Modal.vue.d.ts +0 -47
- package/dist/components/feedback/NotificationComponent.stories.d.ts +0 -14
- package/dist/components/feedback/NotificationComponent.test.d.ts +0 -1
- package/dist/components/feedback/NotificationComponent.vue.d.ts +0 -12
- package/dist/components/feedback/NotificationList.stories.d.ts +0 -11
- package/dist/components/feedback/NotificationList.test.d.ts +0 -1
- package/dist/components/feedback/NotificationList.vue.d.ts +0 -18
- package/dist/components/feedback/PaginationControls.stories.d.ts +0 -12
- package/dist/components/feedback/PaginationControls.test.d.ts +0 -1
- package/dist/components/feedback/PaginationControls.vue.d.ts +0 -21
- package/dist/components/feedback/Progress.stories.d.ts +0 -14
- package/dist/components/feedback/Progress.test.d.ts +0 -1
- package/dist/components/feedback/Progress.vue.d.ts +0 -30
- package/dist/components/feedback/Skeleton.stories.d.ts +0 -15
- package/dist/components/feedback/Skeleton.test.d.ts +0 -1
- package/dist/components/feedback/Skeleton.vue.d.ts +0 -19
- package/dist/components/feedback/TableSkeleton.stories.d.ts +0 -12
- package/dist/components/feedback/TableSkeleton.test.d.ts +0 -1
- package/dist/components/feedback/TableSkeleton.vue.d.ts +0 -14
- package/dist/components/feedback/Toast.stories.d.ts +0 -12
- package/dist/components/feedback/Toast.test.d.ts +0 -1
- package/dist/components/feedback/Toast.vue.d.ts +0 -23
- package/dist/components/feedback/ToastContainer.stories.d.ts +0 -15
- package/dist/components/feedback/ToastContainer.test.d.ts +0 -1
- package/dist/components/feedback/ToastContainer.vue.d.ts +0 -24
- package/dist/components/feedback/index.cjs +0 -20
- package/dist/components/feedback/index.cjs.map +0 -1
- package/dist/components/feedback/index.test.d.ts +0 -1
- package/dist/components/form/Checkbox.stories.d.ts +0 -13
- package/dist/components/form/Checkbox.test.d.ts +0 -1
- package/dist/components/form/Checkbox.vue.d.ts +0 -22
- package/dist/components/form/ColorPicker.stories.d.ts +0 -12
- package/dist/components/form/ColorPicker.test.d.ts +0 -1
- package/dist/components/form/ColorPicker.vue.d.ts +0 -26
- package/dist/components/form/Combobox.stories.d.ts +0 -15
- package/dist/components/form/Combobox.test.d.ts +0 -1
- package/dist/components/form/Combobox.vue.d.ts +0 -46
- package/dist/components/form/DatePicker.stories.d.ts +0 -15
- package/dist/components/form/DatePicker.test.d.ts +0 -1
- package/dist/components/form/DatePicker.vue.d.ts +0 -36
- package/dist/components/form/EmailInput.stories.d.ts +0 -13
- package/dist/components/form/EmailInput.test.d.ts +0 -1
- package/dist/components/form/EmailInput.vue.d.ts +0 -32
- package/dist/components/form/FileUpload.stories.d.ts +0 -12
- package/dist/components/form/FileUpload.test.d.ts +0 -1
- package/dist/components/form/FileUpload.vue.d.ts +0 -40
- package/dist/components/form/FormActions.stories.d.ts +0 -18
- package/dist/components/form/FormActions.test.d.ts +0 -1
- package/dist/components/form/FormActions.vue.d.ts +0 -56
- package/dist/components/form/FormGroup.stories.d.ts +0 -10
- package/dist/components/form/FormGroup.test.d.ts +0 -1
- package/dist/components/form/FormGroup.vue.d.ts +0 -30
- package/dist/components/form/FormHelp.stories.d.ts +0 -11
- package/dist/components/form/FormHelp.test.d.ts +0 -1
- package/dist/components/form/FormHelp.vue.d.ts +0 -23
- package/dist/components/form/FormInput.stories.d.ts +0 -12
- package/dist/components/form/FormInput.test.d.ts +0 -1
- package/dist/components/form/FormInput.vue.d.ts +0 -13
- package/dist/components/form/FormLabel.stories.d.ts +0 -12
- package/dist/components/form/FormLabel.test.d.ts +0 -1
- package/dist/components/form/FormLabel.vue.d.ts +0 -21
- package/dist/components/form/FormSection.stories.d.ts +0 -13
- package/dist/components/form/FormSection.test.d.ts +0 -1
- package/dist/components/form/FormSection.vue.d.ts +0 -49
- package/dist/components/form/FormSelect.stories.d.ts +0 -13
- package/dist/components/form/FormSelect.test.d.ts +0 -1
- package/dist/components/form/FormSelect.vue.d.ts +0 -55
- package/dist/components/form/IconPicker.vue.d.ts +0 -33
- package/dist/components/form/InputWrapper.stories.d.ts +0 -16
- package/dist/components/form/InputWrapper.test.d.ts +0 -1
- package/dist/components/form/InputWrapper.vue.d.ts +0 -40
- package/dist/components/form/MoneyInput.stories.d.ts +0 -16
- package/dist/components/form/MoneyInput.test.d.ts +0 -1
- package/dist/components/form/MoneyInput.vue.d.ts +0 -40
- package/dist/components/form/NumberInput.stories.d.ts +0 -14
- package/dist/components/form/NumberInput.test.d.ts +0 -1
- package/dist/components/form/NumberInput.vue.d.ts +0 -39
- package/dist/components/form/OTPInput.stories.d.ts +0 -13
- package/dist/components/form/OTPInput.test.d.ts +0 -1
- package/dist/components/form/OTPInput.vue.d.ts +0 -33
- package/dist/components/form/PasswordInput.stories.d.ts +0 -15
- package/dist/components/form/PasswordInput.test.d.ts +0 -1
- package/dist/components/form/PasswordInput.vue.d.ts +0 -36
- package/dist/components/form/PercentInput.stories.d.ts +0 -12
- package/dist/components/form/PercentInput.test.d.ts +0 -1
- package/dist/components/form/PercentInput.vue.d.ts +0 -38
- package/dist/components/form/PhoneInput.stories.d.ts +0 -13
- package/dist/components/form/PhoneInput.test.d.ts +0 -1
- package/dist/components/form/PhoneInput.vue.d.ts +0 -89
- package/dist/components/form/QuantityInput.stories.d.ts +0 -12
- package/dist/components/form/QuantityInput.test.d.ts +0 -1
- package/dist/components/form/QuantityInput.vue.d.ts +0 -32
- package/dist/components/form/RangeSlider.stories.d.ts +0 -13
- package/dist/components/form/RangeSlider.test.d.ts +0 -1
- package/dist/components/form/RangeSlider.vue.d.ts +0 -35
- package/dist/components/form/Rating.stories.d.ts +0 -16
- package/dist/components/form/Rating.test.d.ts +0 -1
- package/dist/components/form/Rating.vue.d.ts +0 -43
- package/dist/components/form/SearchInput.stories.d.ts +0 -13
- package/dist/components/form/SearchInput.test.d.ts +0 -1
- package/dist/components/form/SearchInput.vue.d.ts +0 -26
- package/dist/components/form/Slider.stories.d.ts +0 -13
- package/dist/components/form/Slider.test.d.ts +0 -1
- package/dist/components/form/Slider.vue.d.ts +0 -29
- package/dist/components/form/Switch.stories.d.ts +0 -11
- package/dist/components/form/Switch.test.d.ts +0 -1
- package/dist/components/form/Switch.vue.d.ts +0 -23
- package/dist/components/form/TagsInput.stories.d.ts +0 -13
- package/dist/components/form/TagsInput.test.d.ts +0 -1
- package/dist/components/form/TagsInput.vue.d.ts +0 -37
- package/dist/components/form/URLInput.stories.d.ts +0 -11
- package/dist/components/form/URLInput.test.d.ts +0 -1
- package/dist/components/form/URLInput.vue.d.ts +0 -32
- package/dist/components/form/index.cjs +0 -34
- package/dist/components/form/index.cjs.map +0 -1
- package/dist/components/form/index.test.d.ts +0 -1
- package/dist/components/index.cjs +0 -91
- package/dist/components/index.cjs.map +0 -1
- package/dist/components/index.d.ts +0 -5
- package/dist/components/index.test.d.ts +0 -1
- package/dist/components/layout/AuthLayout.stories.d.ts +0 -10
- package/dist/components/layout/AuthLayout.test.d.ts +0 -1
- package/dist/components/layout/AuthLayout.vue.d.ts +0 -88
- package/dist/components/layout/BaseLayout.stories.d.ts +0 -11
- package/dist/components/layout/BaseLayout.test.d.ts +0 -1
- package/dist/components/layout/BaseLayout.vue.d.ts +0 -77
- package/dist/components/layout/PageHero.stories.d.ts +0 -11
- package/dist/components/layout/PageHero.test.d.ts +0 -1
- package/dist/components/layout/PageHero.vue.d.ts +0 -51
- package/dist/components/layout/PageLayout.stories.d.ts +0 -10
- package/dist/components/layout/PageLayout.test.d.ts +0 -1
- package/dist/components/layout/PageLayout.vue.d.ts +0 -37
- package/dist/components/layout/index.cjs +0 -8
- package/dist/components/layout/index.cjs.map +0 -1
- package/dist/components/layout/index.test.d.ts +0 -1
- package/dist/components/type/BadgeType.stories.d.ts +0 -13
- package/dist/components/type/BadgeType.test.d.ts +0 -1
- package/dist/components/type/BooleanType.stories.d.ts +0 -12
- package/dist/components/type/BooleanType.test.d.ts +0 -1
- package/dist/components/type/DateType.stories.d.ts +0 -12
- package/dist/components/type/DateType.test.d.ts +0 -1
- package/dist/components/type/NumberType.stories.d.ts +0 -11
- package/dist/components/type/NumberType.test.d.ts +0 -1
- package/dist/components/type/TextType.stories.d.ts +0 -10
- package/dist/components/type/TextType.test.d.ts +0 -1
- package/dist/components/type/index.cjs +0 -9
- package/dist/components/type/index.cjs.map +0 -1
- package/dist/components/type/index.test.d.ts +0 -1
- package/dist/composables/index.cjs +0 -19
- package/dist/composables/index.cjs.map +0 -1
- package/dist/composables/index.d.ts +0 -8
- package/dist/composables/index.test.d.ts +0 -1
- package/dist/composables/useDarkMode.d.ts +0 -14
- package/dist/composables/useDarkMode.test.d.ts +0 -1
- package/dist/composables/useDropdown.d.ts +0 -51
- package/dist/composables/useDropdown.test.d.ts +0 -1
- package/dist/composables/useExportCSV.d.ts +0 -10
- package/dist/composables/useExportCSV.test.d.ts +0 -1
- package/dist/composables/useFocusTrap.d.ts +0 -41
- package/dist/composables/useFocusTrap.test.d.ts +0 -1
- package/dist/composables/useId.d.ts +0 -42
- package/dist/composables/useId.test.d.ts +0 -1
- package/dist/composables/useModal.d.ts +0 -60
- package/dist/composables/useModal.test.d.ts +0 -1
- package/dist/composables/useNotifications.d.ts +0 -27
- package/dist/composables/useNotifications.test.d.ts +0 -1
- package/dist/composables/useToast.d.ts +0 -30
- package/dist/composables/useToast.test.d.ts +0 -1
- package/dist/index-D1x3TH9k.cjs +0 -401
- package/dist/index-D1x3TH9k.cjs.map +0 -1
- package/dist/index-D9_zMCpN.js.map +0 -1
- package/dist/index-PehFvNFG.cjs +0 -94
- package/dist/index-PehFvNFG.cjs.map +0 -1
- package/dist/index.cjs +0 -123
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.test.d.ts +0 -1
- package/dist/plugin.d.ts +0 -24
- package/dist/style.css +0 -2
- package/dist/types/components.d.ts +0 -27
- package/dist/types/form.d.ts +0 -37
- package/dist/types/index.cjs +0 -2
- package/dist/types/index.cjs.map +0 -1
- package/dist/types/index.d.ts +0 -4
- package/dist/types/index.test.d.ts +0 -1
- package/dist/types/notification.d.ts +0 -12
- package/dist/types/property.d.ts +0 -34
- package/dist/useDarkMode-DLZcJEUQ.cjs +0 -52
- package/dist/useDarkMode-DLZcJEUQ.cjs.map +0 -1
- package/dist/useDropdown-DHFnd259.cjs +0 -130
- package/dist/useDropdown-DHFnd259.cjs.map +0 -1
- package/dist/useFocusTrap-kcxO8AeU.cjs +0 -119
- package/dist/useFocusTrap-kcxO8AeU.cjs.map +0 -1
- package/dist/useId-nxrBaIC9.cjs +0 -25
- package/dist/useId-nxrBaIC9.cjs.map +0 -1
- package/dist/useToast-Bk60GArg.cjs +0 -176
- package/dist/useToast-Bk60GArg.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs","sources":["../src/components/feedback/LoadingSpinner.vue","../src/components/feedback/Modal.vue","../src/components/feedback/PaginationControls.vue","../src/components/feedback/NotificationComponent.vue","../src/components/feedback/NotificationList.vue","../src/components/feedback/Alert.vue","../src/components/feedback/EmptyState.vue","../src/components/feedback/Toast.vue","../src/components/feedback/ToastContainer.vue","../src/components/feedback/Progress.vue","../src/components/feedback/Skeleton.vue","../src/components/feedback/ConfirmDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { SpinnerSize } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n text?: string\n size?: SpinnerSize\n /** Accessible label for screen readers (defaults to 'Loading' or text prop) */\n ariaLabel?: string\n }>(),\n {\n size: 'md',\n ariaLabel: 'Loading',\n },\n)\n\nconst sizeClasses: Record<SpinnerSize, string> = {\n sm: 'size-8',\n md: 'size-12',\n lg: 'size-16',\n}\n\nconst accessibleLabel = computed(() => props.text || props.ariaLabel)\n</script>\n\n<template>\n <div\n class=\"flex items-center justify-center py-12\"\n role=\"status\"\n aria-live=\"polite\"\n :aria-label=\"accessibleLabel\"\n >\n <div class=\"text-center\">\n <div\n :class=\"sizeClasses[size]\"\n class=\"border-primary inline-block animate-spin rounded-full border-4 border-solid border-r-transparent\"\n aria-hidden=\"true\"\n />\n <p\n v-if=\"text\"\n class=\"mt-4 text-gray-600 dark:text-gray-400\"\n >\n {{ text }}\n </p>\n <span v-else class=\"sr-only\">{{ accessibleLabel }}</span>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\nimport { onMounted, onUnmounted, computed, ref } from 'vue'\nimport type { ModalSize } from '@/types'\nimport { useId } from '@/composables/useId'\nimport { useFocusTrap } from '@/composables/useFocusTrap'\n\nconst props = withDefaults(\n defineProps<{\n title?: string\n size?: ModalSize\n closeOnBackdrop?: boolean\n closeOnEscape?: boolean\n closeButtonLabel?: string\n /** Teleport target (e.g., 'body', '#app'). Set to false to disable teleport. */\n teleport?: string | false\n /** Custom ID for the modal (auto-generated if not provided) */\n id?: string\n }>(),\n {\n title: '',\n size: 'default',\n closeOnBackdrop: true,\n closeOnEscape: true,\n closeButtonLabel: 'Close',\n teleport: 'body',\n },\n)\n\nconst {\n title,\n size,\n closeOnBackdrop,\n closeOnEscape,\n closeButtonLabel,\n} = props\n\nconst teleportDisabled = computed(() => props.teleport === false)\nconst teleportTarget = computed(() => props.teleport === false ? 'body' : props.teleport)\n\nconst emit = defineEmits<{\n close: []\n}>()\n\n// Generate unique IDs for ARIA relationships\nconst { id: modalId, related } = useId({ prefix: 'modal', id: props.id })\nconst titleId = computed(() => related('title'))\n\n// Focus trap\nconst isActive = ref(true)\nconst { containerRef: dialogRef } = useFocusTrap({\n active: isActive,\n focusFirst: true,\n restoreFocus: true,\n})\n\n// Check if modal has a title (for aria-labelledby)\nconst hasTitle = computed(() => Boolean(props.title))\n\nconst sizeClasses: Record<ModalSize, string> = {\n sm: 'max-w-md',\n default: 'max-w-3xl',\n lg: 'max-w-5xl',\n xl: 'max-w-7xl',\n full: 'max-w-full mx-4',\n}\n\nconst handleBackdropClick = () => {\n if (closeOnBackdrop) {\n emit('close')\n }\n}\n\nconst handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && closeOnEscape) {\n emit('close')\n }\n}\n\nonMounted(() => {\n document.addEventListener('keydown', handleEscape)\n document.body.style.overflow = 'hidden'\n})\n\nonUnmounted(() => {\n document.removeEventListener('keydown', handleEscape)\n document.body.style.overflow = ''\n})\n</script>\n\n<template>\n <Teleport :to=\"teleportTarget\" :disabled=\"teleportDisabled\">\n <div\n class=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\"\n @click.self=\"handleBackdropClick\"\n >\n <div\n ref=\"dialogRef\"\n :id=\"modalId\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"hasTitle ? titleId : undefined\"\n :class=\"sizeClasses[size]\"\n class=\"flex max-h-[90vh] w-full flex-col rounded-lg bg-white shadow-xl dark:bg-gray-900\"\n >\n <!-- Header -->\n <div\n v-if=\"title || $slots.header || $slots.title\"\n class=\"flex items-center justify-between border-b border-gray-200 px-6 py-4 dark:border-gray-700\"\n >\n <h3\n :id=\"titleId\"\n class=\"text-xl font-semibold text-gray-900 dark:text-gray-100\"\n >\n <slot name=\"header\">\n <slot name=\"title\">\n {{ title }}\n </slot>\n </slot>\n </h3>\n <button\n class=\"rounded-lg p-1.5 text-gray-400 hover:bg-gray-100 hover:text-gray-900 dark:hover:bg-gray-800 dark:hover:text-gray-100\"\n type=\"button\"\n aria-label=\"Close dialog\"\n @click=\"emit('close')\"\n >\n <Icon\n class=\"size-5\"\n icon=\"lucide:x\"\n aria-hidden=\"true\"\n />\n <span class=\"sr-only\">{{ closeButtonLabel }}</span>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"flex-1 overflow-y-auto px-6 py-4\">\n <slot />\n </div>\n\n <!-- Footer -->\n <div\n v-if=\"$slots.footer\"\n class=\"flex items-center justify-end gap-3 border-t border-gray-200 px-6 py-4 dark:border-gray-700\"\n >\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nconst {\n currentPage,\n totalPages,\n loading = false,\n pageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n showPageSize = true,\n pageLabel = 'Page',\n ofLabel = 'of',\n itemsPerPageLabel = 'Items per page:',\n previousLabel = 'Previous',\n nextLabel = 'Next',\n} = defineProps<{\n currentPage: number\n totalPages: number\n loading?: boolean\n pageSize?: number\n pageSizeOptions?: number[]\n showPageSize?: boolean\n pageLabel?: string\n ofLabel?: string\n itemsPerPageLabel?: string\n previousLabel?: string\n nextLabel?: string\n}>()\n\nconst emit = defineEmits<{\n 'update:page': [page: number]\n 'update:pageSize': [size: number]\n}>()\n\nconst changePage = (page: number) => {\n if (page >= 1 && page <= totalPages && !loading) {\n emit('update:page', page)\n }\n}\n\nconst changePageSize = (event: Event) => {\n const target = event.target as HTMLSelectElement\n emit('update:pageSize', Number(target.value))\n}\n</script>\n\n<template>\n <div\n v-if=\"totalPages > 1\"\n class=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 border-t border-gray-200 px-4 sm:px-6 py-4 dark:border-gray-700\"\n >\n <!-- Info and page size -->\n <div class=\"flex flex-col sm:flex-row sm:items-center gap-3 sm:gap-4\">\n <div class=\"text-sm text-gray-700 dark:text-gray-300 text-center sm:text-left\">\n {{ pageLabel }} {{ currentPage }} {{ ofLabel }} {{ totalPages }}\n </div>\n <div\n v-if=\"showPageSize\"\n class=\"flex items-center justify-center sm:justify-start gap-2\"\n >\n <label\n class=\"text-sm text-gray-600 dark:text-gray-400 hidden sm:inline\"\n for=\"page-size\"\n >\n {{ itemsPerPageLabel }}\n </label>\n <select\n id=\"page-size\"\n :value=\"pageSize\"\n class=\"focus:border-primary focus:ring-primary rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100\"\n @change=\"changePageSize\"\n >\n <option\n v-for=\"size in pageSizeOptions\"\n :key=\"size\"\n :value=\"size\"\n >\n {{ size }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Navigation buttons -->\n <div class=\"flex justify-center sm:justify-end gap-2\">\n <button\n :disabled=\"currentPage === 1 || loading\"\n class=\"focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 sm:px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n @click=\"changePage(currentPage - 1)\"\n >\n <Icon\n class=\"size-4\"\n icon=\"lucide:chevron-left\"\n />\n <span class=\"hidden sm:inline\">{{ previousLabel }}</span>\n </button>\n <button\n :disabled=\"currentPage === totalPages || loading\"\n class=\"focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 sm:px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n @click=\"changePage(currentPage + 1)\"\n >\n <span class=\"hidden sm:inline\">{{ nextLabel }}</span>\n <Icon\n class=\"size-4\"\n icon=\"lucide:chevron-right\"\n />\n </button>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport type { Notification } from '@/types'\nimport { computed, onMounted } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nconst props = defineProps<{\n notification: Notification\n autoDismiss?: boolean\n duration?: number\n}>()\n\nconst emit = defineEmits<{\n dismiss: [id: string]\n}>()\n\nconst iconName = computed(() => {\n switch (props.notification.type) {\n case 'success':\n return 'lucide:check-circle'\n case 'info':\n return 'lucide:info'\n case 'warning':\n return 'lucide:alert-triangle'\n case 'error':\n return 'lucide:x-circle'\n default:\n return 'lucide:bell'\n }\n})\n\nconst iconColor = computed(() => {\n switch (props.notification.type) {\n case 'success':\n return 'text-green-600 dark:text-green-400'\n case 'info':\n return 'text-blue-600 dark:text-blue-400'\n case 'warning':\n return 'text-yellow-600 dark:text-yellow-400'\n case 'error':\n return 'text-red-600 dark:text-red-400'\n default:\n return 'text-gray-600 dark:text-gray-400'\n }\n})\n\nconst bgColor = computed(() => {\n switch (props.notification.type) {\n case 'success':\n return 'bg-green-50 dark:bg-green-950'\n case 'info':\n return 'bg-blue-50 dark:bg-blue-950'\n case 'warning':\n return 'bg-yellow-50 dark:bg-yellow-950'\n case 'error':\n return 'bg-red-50 dark:bg-red-950'\n default:\n return 'bg-gray-50 dark:bg-gray-950'\n }\n})\n\nconst handleDismiss = () => {\n if (props.notification.id) {\n emit('dismiss', props.notification.id)\n }\n}\n\nonMounted(() => {\n const duration = props.notification.duration ?? props.duration ?? 5000\n if (props.autoDismiss !== false && duration > 0) {\n setTimeout(() => {\n handleDismiss()\n }, duration)\n }\n})\n</script>\n\n<template>\n <div\n class=\"flex max-w-md items-start space-x-3 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-800 dark:bg-black\"\n >\n <div :class=\"[bgColor, 'flex items-center justify-center rounded-full p-2']\">\n <Icon\n :class=\"iconColor\"\n :icon=\"iconName\"\n class=\"size-5\"\n />\n </div>\n\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <h4\n v-if=\"notification.title\"\n class=\"text-sm font-semibold text-gray-900 dark:text-gray-100\"\n >\n {{ notification.title }}\n </h4>\n <p\n v-if=\"notification.message\"\n class=\"mt-1 text-sm text-gray-600 dark:text-gray-400\"\n >\n {{ notification.message }}\n </p>\n </div>\n\n <button\n class=\"shrink-0 text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-600 dark:hover:text-gray-400\"\n @click=\"handleDismiss\"\n >\n <Icon\n class=\"size-4\"\n icon=\"lucide:x\"\n />\n </button>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { Notification } from '@/types'\nimport NotificationComponent from './NotificationComponent.vue'\n\nconst props = withDefaults(\n defineProps<{\n notifications: Notification[]\n autoDismiss?: boolean\n duration?: number\n /** Position of the container */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'\n /** Custom top offset (e.g., '80px', '5rem') to account for fixed headers */\n topOffset?: string\n }>(),\n {\n position: 'top-right',\n },\n)\n\nconst emit = defineEmits<{\n dismiss: [id: string]\n}>()\n\nconst positionClasses: Record<string, string> = {\n 'top-right': 'top-5 right-5',\n 'top-left': 'top-5 left-5',\n 'bottom-right': 'bottom-5 right-5',\n 'bottom-left': 'bottom-5 left-5',\n}\n\nconst isTopPosition = computed(() => props.position?.startsWith('top'))\n\nconst topStyle = computed(() => {\n if (!isTopPosition.value || !props.topOffset) return {}\n return { top: props.topOffset }\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n :class=\"['fixed z-50 flex flex-col gap-3 w-full max-w-sm', positionClasses[position]]\"\n :style=\"topStyle\"\n >\n <TransitionGroup\n enter-active-class=\"transition duration-300 ease-out\"\n enter-from-class=\"opacity-0 translate-x-4\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 translate-x-4\"\n >\n <NotificationComponent\n v-for=\"notification in notifications\"\n :key=\"notification.id\"\n :notification=\"notification\"\n :auto-dismiss=\"autoDismiss\"\n :duration=\"duration\"\n @dismiss=\"emit('dismiss', $event)\"\n />\n </TransitionGroup>\n </div>\n </Teleport>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'error'\n\nconst props = withDefaults(\n defineProps<{\n /** Alert variant */\n variant?: AlertVariant\n /** Title text */\n title?: string\n /** Show close button */\n dismissible?: boolean\n /** Custom icon */\n icon?: string\n }>(),\n {\n variant: 'info',\n },\n)\n\nconst emit = defineEmits<{\n dismiss: []\n}>()\n\nconst variantStyles: Record<AlertVariant, { bg: string; border: string; icon: string; iconColor: string }> = {\n info: {\n bg: 'bg-blue-50 dark:bg-blue-900/20',\n border: 'border-blue-200 dark:border-blue-800',\n icon: 'lucide:info',\n iconColor: 'text-blue-500',\n },\n success: {\n bg: 'bg-green-50 dark:bg-green-900/20',\n border: 'border-green-200 dark:border-green-800',\n icon: 'lucide:check-circle',\n iconColor: 'text-green-500',\n },\n warning: {\n bg: 'bg-yellow-50 dark:bg-yellow-900/20',\n border: 'border-yellow-200 dark:border-yellow-800',\n icon: 'lucide:alert-triangle',\n iconColor: 'text-yellow-500',\n },\n error: {\n bg: 'bg-red-50 dark:bg-red-900/20',\n border: 'border-red-200 dark:border-red-800',\n icon: 'lucide:alert-circle',\n iconColor: 'text-red-500',\n },\n}\n\nconst styles = variantStyles[props.variant]\n</script>\n\n<template>\n <div\n :class=\"[\n 'flex gap-3 rounded-lg border p-4',\n styles.bg,\n styles.border,\n ]\"\n role=\"alert\"\n >\n <Icon\n :icon=\"icon || styles.icon\"\n :class=\"['size-5 shrink-0', styles.iconColor]\"\n aria-hidden=\"true\"\n />\n <div class=\"flex-1\">\n <h4\n v-if=\"title\"\n class=\"mb-1 font-medium text-gray-900 dark:text-white\"\n >\n {{ title }}\n </h4>\n <div class=\"text-sm text-gray-700 dark:text-gray-300\">\n <slot />\n </div>\n </div>\n <button\n v-if=\"dismissible\"\n type=\"button\"\n class=\"shrink-0 rounded p-1 text-gray-400 hover:bg-gray-200 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n aria-label=\"Dismiss alert\"\n @click=\"emit('dismiss')\"\n >\n <Icon\n icon=\"lucide:x\"\n class=\"size-4\"\n aria-hidden=\"true\"\n />\n </button>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nwithDefaults(\n defineProps<{\n /** Message to display */\n message?: string\n /** Icon name (iconify format) */\n icon?: string\n /** Title text */\n title?: string\n }>(),\n {\n message: 'No results found',\n icon: 'lucide:inbox',\n },\n)\n</script>\n\n<template>\n <div class=\"py-12 text-center\">\n <Icon\n v-if=\"icon\"\n :icon=\"icon\"\n class=\"mx-auto mb-4 size-12 text-gray-400 dark:text-gray-500\"\n />\n <h3\n v-if=\"title\"\n class=\"mb-2 text-lg font-medium text-gray-900 dark:text-white\"\n >\n {{ title }}\n </h3>\n <p class=\"text-gray-500 dark:text-gray-400\">\n <slot>{{ message }}</slot>\n </p>\n <div\n v-if=\"$slots.action\"\n class=\"mt-4\"\n >\n <slot name=\"action\" />\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info'\n\nconst props = withDefaults(\n defineProps<{\n /** Toast message */\n message: string\n /** Toast type */\n type?: ToastType\n /** Title (optional) */\n title?: string\n /** Show close button */\n closable?: boolean\n /** Duration in ms (0 = no auto-close) */\n duration?: number\n }>(),\n {\n type: 'info',\n closable: true,\n duration: 5000,\n },\n)\n\nconst emit = defineEmits<{\n close: []\n}>()\n\nconst typeConfig: Record<ToastType, { icon: string; bg: string; iconColor: string }> = {\n success: {\n icon: 'lucide:check-circle',\n bg: 'bg-green-50 border-green-200 dark:bg-green-950 dark:border-green-800',\n iconColor: 'text-green-500',\n },\n error: {\n icon: 'lucide:x-circle',\n bg: 'bg-red-50 border-red-200 dark:bg-red-950 dark:border-red-800',\n iconColor: 'text-red-500',\n },\n warning: {\n icon: 'lucide:alert-triangle',\n bg: 'bg-yellow-50 border-yellow-200 dark:bg-yellow-950 dark:border-yellow-800',\n iconColor: 'text-yellow-500',\n },\n info: {\n icon: 'lucide:info',\n bg: 'bg-blue-50 border-blue-200 dark:bg-blue-950 dark:border-blue-800',\n iconColor: 'text-blue-500',\n },\n}\n\nconst config = typeConfig[props.type]\n\n// Auto-close\nif (props.duration > 0) {\n setTimeout(() => {\n emit('close')\n }, props.duration)\n}\n</script>\n\n<template>\n <div\n :class=\"[\n 'flex items-start gap-3 rounded-lg border p-4 shadow-lg',\n config.bg,\n ]\"\n role=\"alert\"\n >\n <Icon\n :icon=\"config.icon\"\n :class=\"['size-5 shrink-0', config.iconColor]\"\n aria-hidden=\"true\"\n />\n <div class=\"flex-1 min-w-0\">\n <p\n v-if=\"title\"\n class=\"font-medium text-gray-900 dark:text-white\"\n >\n {{ title }}\n </p>\n <p class=\"text-sm text-gray-700 dark:text-gray-300\">\n {{ message }}\n </p>\n </div>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"shrink-0 rounded p-1 text-gray-400 hover:bg-gray-200 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n aria-label=\"Dismiss notification\"\n @click=\"emit('close')\"\n >\n <Icon\n icon=\"lucide:x\"\n class=\"size-4\"\n aria-hidden=\"true\"\n />\n </button>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport Toast from './Toast.vue'\nimport type { ToastType } from './Toast.vue'\n\nexport interface ToastItem {\n id: string\n message: string\n type?: ToastType\n title?: string\n duration?: number\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Array of toast items */\n toasts: ToastItem[]\n /** Position of the container */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center'\n /** Custom top offset (e.g., '80px', '5rem') to account for fixed headers */\n topOffset?: string\n }>(),\n {\n position: 'top-right',\n },\n)\n\nconst emit = defineEmits<{\n close: [id: string]\n}>()\n\nconst positionClasses: Record<string, string> = {\n 'top-right': 'right-4',\n 'top-left': 'left-4',\n 'bottom-right': 'bottom-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'top-center': 'left-1/2 -translate-x-1/2',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n}\n\nconst isTopPosition = computed(() => props.position?.startsWith('top'))\n\nconst topStyle = computed(() => {\n if (!isTopPosition.value) return {}\n return { top: props.topOffset || '1rem' }\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n :class=\"['fixed z-9999 flex flex-col gap-2 w-full max-w-sm', positionClasses[position]]\"\n :style=\"topStyle\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n >\n <TransitionGroup\n enter-active-class=\"transition duration-300 ease-out\"\n enter-from-class=\"opacity-0 translate-x-4\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 translate-x-4\"\n >\n <Toast\n v-for=\"toast in toasts\"\n :key=\"toast.id\"\n :message=\"toast.message\"\n :type=\"toast.type\"\n :title=\"toast.title\"\n :duration=\"toast.duration\"\n @close=\"emit('close', toast.id)\"\n />\n </TransitionGroup>\n </div>\n </Teleport>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\n\nexport type ProgressSize = 'sm' | 'md' | 'lg'\nexport type ProgressVariant = 'default' | 'success' | 'warning' | 'error'\n\nconst props = withDefaults(\n defineProps<{\n /** Current value (0-100) */\n value: number\n /** Maximum value */\n max?: number\n /** Size variant */\n size?: ProgressSize\n /** Color variant */\n variant?: ProgressVariant\n /** Show percentage label */\n showLabel?: boolean\n /** Striped animation */\n striped?: boolean\n /** Animated stripes */\n animated?: boolean\n /** Indeterminate state (loading) */\n indeterminate?: boolean\n }>(),\n {\n max: 100,\n size: 'md',\n variant: 'default',\n showLabel: false,\n striped: false,\n animated: false,\n indeterminate: false,\n },\n)\n\nconst percentage = computed(() => {\n if (props.indeterminate) return 100\n return Math.min(Math.max((props.value / props.max) * 100, 0), 100)\n})\n\nconst sizeClasses: Record<ProgressSize, string> = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-4',\n}\n\nconst variantClasses: Record<ProgressVariant, string> = {\n default: 'bg-primary',\n success: 'bg-green-500',\n warning: 'bg-yellow-500',\n error: 'bg-red-500',\n}\n</script>\n\n<template>\n <div class=\"w-full\">\n <div\n v-if=\"showLabel && !indeterminate\"\n class=\"mb-1 flex justify-between text-sm\"\n >\n <span class=\"text-gray-600 dark:text-gray-400\">Progress</span>\n <span class=\"font-medium text-gray-900 dark:text-white\">{{ Math.round(percentage) }}%</span>\n </div>\n <div\n :class=\"[\n 'w-full overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700',\n sizeClasses[size],\n ]\"\n role=\"progressbar\"\n :aria-valuenow=\"indeterminate ? undefined : value\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"max\"\n >\n <div\n :class=\"[\n 'h-full rounded-full transition-all duration-300',\n variantClasses[variant],\n striped && 'bg-stripes',\n animated && 'animate-stripes',\n indeterminate && 'animate-indeterminate',\n ]\"\n :style=\"{ width: indeterminate ? '30%' : `${percentage}%` }\"\n />\n </div>\n </div>\n</template>\n\n<style scoped>\n.bg-stripes {\n background-image: linear-gradient(\n 45deg,\n rgba(255, 255, 255, 0.15) 25%,\n transparent 25%,\n transparent 50%,\n rgba(255, 255, 255, 0.15) 50%,\n rgba(255, 255, 255, 0.15) 75%,\n transparent 75%,\n transparent\n );\n background-size: 1rem 1rem;\n}\n\n.animate-stripes {\n animation: stripes 1s linear infinite;\n}\n\n@keyframes stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.animate-indeterminate {\n animation: indeterminate 1.5s ease-in-out infinite;\n}\n\n@keyframes indeterminate {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(400%);\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nexport type SkeletonVariant = 'text' | 'circular' | 'rectangular' | 'rounded'\n\nwithDefaults(\n defineProps<{\n /** Variant style */\n variant?: SkeletonVariant\n /** Width (CSS value) */\n width?: string\n /** Height (CSS value) */\n height?: string\n /** Number of lines (for text variant) */\n lines?: number\n /** Animate the skeleton */\n animate?: boolean\n }>(),\n {\n variant: 'text',\n animate: true,\n lines: 1,\n },\n)\n\nconst variantClasses: Record<SkeletonVariant, string> = {\n text: 'h-4 rounded',\n circular: 'rounded-full',\n rectangular: '',\n rounded: 'rounded-lg',\n}\n</script>\n\n<template>\n <div\n v-if=\"variant === 'text' && lines > 1\"\n class=\"space-y-2\"\n aria-hidden=\"true\"\n >\n <div\n v-for=\"i in lines\"\n :key=\"i\"\n :class=\"[\n 'bg-gray-200 dark:bg-gray-700',\n variantClasses[variant],\n animate && 'animate-pulse',\n ]\"\n :style=\"{\n width: i === lines ? '75%' : width || '100%',\n height: height,\n }\"\n />\n </div>\n <div\n v-else\n :class=\"[\n 'bg-gray-200 dark:bg-gray-700',\n variantClasses[variant],\n animate && 'animate-pulse',\n ]\"\n :style=\"{\n width: width || (variant === 'circular' ? '3rem' : '100%'),\n height: height || (variant === 'circular' ? '3rem' : variant === 'text' ? '1rem' : '6rem'),\n }\"\n aria-hidden=\"true\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\nimport Modal from './Modal.vue'\nimport Button from '@/components/core/Button.vue'\n\nexport type ConfirmDialogVariant = 'info' | 'warning' | 'danger' | 'success'\n\nconst props = withDefaults(\n defineProps<{\n /** Whether the dialog is open */\n open?: boolean\n /** Dialog title */\n title?: string\n /** Dialog message */\n message?: string\n /** Confirm button text */\n confirmText?: string\n /** Cancel button text */\n cancelText?: string\n /** Dialog variant (affects icon and confirm button color) */\n variant?: ConfirmDialogVariant\n /** Show loading state on confirm button */\n loading?: boolean\n /** Icon to display */\n icon?: string\n /** Teleport target (e.g., 'body', '#app'). Set to false to disable teleport. */\n teleport?: string | false\n }>(),\n {\n open: false,\n title: 'Confirm',\n message: 'Are you sure you want to proceed?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n variant: 'info',\n loading: false,\n teleport: 'body',\n },\n)\n\nconst emit = defineEmits<{\n confirm: []\n cancel: []\n}>()\n\nconst variantConfig: Record<ConfirmDialogVariant, { icon: string; iconClass: string; buttonVariant: 'primary' | 'danger' | 'success' }> = {\n info: {\n icon: 'lucide:info',\n iconClass: 'text-blue-500',\n buttonVariant: 'primary',\n },\n warning: {\n icon: 'lucide:alert-triangle',\n iconClass: 'text-yellow-500',\n buttonVariant: 'primary',\n },\n danger: {\n icon: 'lucide:alert-circle',\n iconClass: 'text-red-500',\n buttonVariant: 'danger',\n },\n success: {\n icon: 'lucide:check-circle',\n iconClass: 'text-green-500',\n buttonVariant: 'success',\n },\n}\n\nconst config = variantConfig[props.variant]\n</script>\n\n<template>\n <Modal\n v-if=\"open\"\n size=\"sm\"\n :close-on-backdrop=\"!loading\"\n :close-on-escape=\"!loading\"\n :teleport=\"teleport\"\n @close=\"emit('cancel')\"\n >\n <div class=\"text-center\">\n <!-- Icon -->\n <div class=\"mx-auto mb-4 flex size-14 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-800\">\n <Icon\n :icon=\"icon || config.icon\"\n :class=\"[config.iconClass, 'size-8']\"\n />\n </div>\n\n <!-- Title -->\n <h3 class=\"mb-2 text-lg font-semibold text-gray-900 dark:text-gray-100\">\n {{ title }}\n </h3>\n\n <!-- Message -->\n <p class=\"mb-6 text-gray-600 dark:text-gray-400\">\n <slot>{{ message }}</slot>\n </p>\n\n <!-- Actions -->\n <div class=\"flex justify-center gap-3\">\n <Button\n variant=\"outline\"\n :disabled=\"loading\"\n @click=\"emit('cancel')\"\n >\n {{ cancelText }}\n </Button>\n <Button\n :variant=\"config.buttonVariant\"\n :loading=\"loading\"\n @click=\"emit('confirm')\"\n >\n {{ confirmText }}\n </Button>\n </div>\n </div>\n </Modal>\n</template>\n"],"names":["computed","_createElementBlock","_createElementVNode","_hoisted_2","_normalizeClass","_hoisted_3","_toDisplayString","_hoisted_4","useId","ref","useFocusTrap","onMounted","onUnmounted","_createBlock","_Teleport","_unref","$slots","_openBlock","_renderSlot","_createVNode","Icon","_hoisted_5","_hoisted_6","_hoisted_1","_Fragment","_renderList","_TransitionGroup","NotificationComponent","Toast","_normalizeStyle","Modal","Button"],"mappings":"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"}
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
const vue = require("vue");
|
|
3
|
-
const vue$1 = require("@iconify/vue");
|
|
4
|
-
const useDropdown = require("./useDropdown-DHFnd259.cjs");
|
|
5
|
-
const useId = require("./useId-nxrBaIC9.cjs");
|
|
6
|
-
const _hoisted_1$1 = { class: "relative" };
|
|
7
|
-
const _hoisted_2$1 = {
|
|
8
|
-
key: 0,
|
|
9
|
-
class: "absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600"
|
|
10
|
-
};
|
|
11
|
-
const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
12
|
-
__name: "MenuItem",
|
|
13
|
-
props: {
|
|
14
|
-
menuItem: {},
|
|
15
|
-
expanded: { type: Boolean, default: true },
|
|
16
|
-
active: { type: Boolean, default: void 0 },
|
|
17
|
-
currentPath: { default: void 0 }
|
|
18
|
-
},
|
|
19
|
-
setup(__props) {
|
|
20
|
-
const props = __props;
|
|
21
|
-
const isRouteActive = vue.computed(() => {
|
|
22
|
-
if (props.active !== void 0) {
|
|
23
|
-
return props.active;
|
|
24
|
-
}
|
|
25
|
-
const path = props.currentPath ?? (typeof window !== "undefined" ? window.location.pathname : "/");
|
|
26
|
-
if (props.menuItem.link === "/") {
|
|
27
|
-
return path === "/";
|
|
28
|
-
}
|
|
29
|
-
return path === props.menuItem.link || path.startsWith(props.menuItem.link + "/");
|
|
30
|
-
});
|
|
31
|
-
const linkComponent = vue.computed(() => {
|
|
32
|
-
try {
|
|
33
|
-
const RouterLink = vue.resolveComponent("RouterLink");
|
|
34
|
-
if (typeof RouterLink !== "string") {
|
|
35
|
-
return RouterLink;
|
|
36
|
-
}
|
|
37
|
-
} catch {
|
|
38
|
-
}
|
|
39
|
-
return "a";
|
|
40
|
-
});
|
|
41
|
-
const linkProps = vue.computed(() => {
|
|
42
|
-
if (linkComponent.value === "a") {
|
|
43
|
-
return { href: props.menuItem.link };
|
|
44
|
-
}
|
|
45
|
-
return { to: props.menuItem.link };
|
|
46
|
-
});
|
|
47
|
-
return (_ctx, _cache) => {
|
|
48
|
-
return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(linkComponent.value), vue.mergeProps(linkProps.value, {
|
|
49
|
-
class: [__props.expanded ? "flex-row" : "flex-col", "group relative flex items-center justify-center gap-2 px-5"]
|
|
50
|
-
}), {
|
|
51
|
-
default: vue.withCtx(() => [
|
|
52
|
-
vue.createElementVNode("div", _hoisted_1$1, [
|
|
53
|
-
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
54
|
-
class: vue.normalizeClass([[
|
|
55
|
-
isRouteActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
|
|
56
|
-
__props.expanded ? "size-6" : "size-8"
|
|
57
|
-
], "transition-all duration-300"]),
|
|
58
|
-
icon: __props.menuItem.icon
|
|
59
|
-
}, null, 8, ["class", "icon"]),
|
|
60
|
-
__props.menuItem.notification ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2$1)) : vue.createCommentVNode("", true)
|
|
61
|
-
]),
|
|
62
|
-
vue.createVNode(vue.Transition, {
|
|
63
|
-
"enter-active-class": "transition-all duration-300 ease-out",
|
|
64
|
-
"enter-from-class": "opacity-0 -translate-x-2",
|
|
65
|
-
"enter-to-class": "opacity-100 translate-x-0",
|
|
66
|
-
"leave-active-class": "transition-all duration-200 ease-in",
|
|
67
|
-
"leave-from-class": "opacity-100 translate-x-0",
|
|
68
|
-
"leave-to-class": "opacity-0 -translate-x-2"
|
|
69
|
-
}, {
|
|
70
|
-
default: vue.withCtx(() => [
|
|
71
|
-
__props.expanded ? (vue.openBlock(), vue.createElementBlock("span", {
|
|
72
|
-
key: 0,
|
|
73
|
-
class: vue.normalizeClass([
|
|
74
|
-
isRouteActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
|
|
75
|
-
"text-sm font-semibold whitespace-nowrap"
|
|
76
|
-
])
|
|
77
|
-
}, vue.toDisplayString(__props.menuItem.label), 3)) : vue.createCommentVNode("", true)
|
|
78
|
-
]),
|
|
79
|
-
_: 1
|
|
80
|
-
})
|
|
81
|
-
]),
|
|
82
|
-
_: 1
|
|
83
|
-
}, 16, ["class"]);
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
const _hoisted_1 = { class: "relative inline-block" };
|
|
88
|
-
const _hoisted_2 = ["id", "aria-expanded", "aria-controls"];
|
|
89
|
-
const _hoisted_3 = ["id", "aria-labelledby"];
|
|
90
|
-
const _hoisted_4 = {
|
|
91
|
-
key: 0,
|
|
92
|
-
role: "separator",
|
|
93
|
-
class: "my-1 border-t border-gray-200 dark:border-gray-700"
|
|
94
|
-
};
|
|
95
|
-
const _hoisted_5 = ["disabled", "onClick"];
|
|
96
|
-
const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
97
|
-
__name: "Dropdown",
|
|
98
|
-
props: {
|
|
99
|
-
items: { default: () => [] },
|
|
100
|
-
align: { default: "left" },
|
|
101
|
-
width: { default: "auto" },
|
|
102
|
-
teleport: { type: Boolean, default: true },
|
|
103
|
-
id: {}
|
|
104
|
-
},
|
|
105
|
-
emits: ["select"],
|
|
106
|
-
setup(__props, { emit: __emit }) {
|
|
107
|
-
const props = __props;
|
|
108
|
-
const { related } = useId.useId({ prefix: "dropdown", id: props.id });
|
|
109
|
-
const triggerId = vue.computed(() => related("trigger"));
|
|
110
|
-
const menuId = vue.computed(() => related("menu"));
|
|
111
|
-
const emit = __emit;
|
|
112
|
-
const triggerRef = vue.ref();
|
|
113
|
-
const menuRef = vue.ref();
|
|
114
|
-
const { isOpen, dropdownStyle, toggle, close } = useDropdown.useDropdown(triggerRef, menuRef, {
|
|
115
|
-
teleport: props.teleport,
|
|
116
|
-
align: props.align
|
|
117
|
-
});
|
|
118
|
-
const selectItem = (item) => {
|
|
119
|
-
if (item.disabled || item.divider) return;
|
|
120
|
-
emit("select", item);
|
|
121
|
-
close();
|
|
122
|
-
};
|
|
123
|
-
const widthClasses = {
|
|
124
|
-
auto: "w-auto min-w-40",
|
|
125
|
-
full: "w-full",
|
|
126
|
-
sm: "w-32",
|
|
127
|
-
md: "w-48",
|
|
128
|
-
lg: "w-64"
|
|
129
|
-
};
|
|
130
|
-
const computedDropdownStyle = vue.computed(() => {
|
|
131
|
-
if (!props.teleport) return {};
|
|
132
|
-
const { width: _, ...rest } = dropdownStyle.value;
|
|
133
|
-
return rest;
|
|
134
|
-
});
|
|
135
|
-
return (_ctx, _cache) => {
|
|
136
|
-
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
|
|
137
|
-
vue.createElementVNode("div", {
|
|
138
|
-
ref_key: "triggerRef",
|
|
139
|
-
ref: triggerRef,
|
|
140
|
-
onClick: _cache[0] || (_cache[0] = //@ts-ignore
|
|
141
|
-
(...args) => vue.unref(toggle) && vue.unref(toggle)(...args))
|
|
142
|
-
}, [
|
|
143
|
-
vue.renderSlot(_ctx.$slots, "trigger", {}, () => [
|
|
144
|
-
vue.createElementVNode("button", {
|
|
145
|
-
id: triggerId.value,
|
|
146
|
-
type: "button",
|
|
147
|
-
"aria-expanded": vue.unref(isOpen),
|
|
148
|
-
"aria-haspopup": "menu",
|
|
149
|
-
"aria-controls": menuId.value,
|
|
150
|
-
class: "inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700"
|
|
151
|
-
}, [
|
|
152
|
-
vue.renderSlot(_ctx.$slots, "trigger-label", {}, () => [
|
|
153
|
-
_cache[1] || (_cache[1] = vue.createTextVNode(" Options ", -1))
|
|
154
|
-
]),
|
|
155
|
-
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
156
|
-
icon: "lucide:chevron-down",
|
|
157
|
-
class: vue.normalizeClass(["size-4 transition-transform", vue.unref(isOpen) && "rotate-180"]),
|
|
158
|
-
"aria-hidden": "true"
|
|
159
|
-
}, null, 8, ["class"])
|
|
160
|
-
], 8, _hoisted_2)
|
|
161
|
-
])
|
|
162
|
-
], 512),
|
|
163
|
-
(vue.openBlock(), vue.createBlock(vue.Teleport, {
|
|
164
|
-
to: "body",
|
|
165
|
-
disabled: !__props.teleport
|
|
166
|
-
}, [
|
|
167
|
-
vue.createVNode(vue.Transition, {
|
|
168
|
-
"enter-active-class": "transition ease-out duration-100",
|
|
169
|
-
"enter-from-class": "transform opacity-0 scale-95",
|
|
170
|
-
"enter-to-class": "transform opacity-100 scale-100",
|
|
171
|
-
"leave-active-class": "transition ease-in duration-75",
|
|
172
|
-
"leave-from-class": "transform opacity-100 scale-100",
|
|
173
|
-
"leave-to-class": "transform opacity-0 scale-95"
|
|
174
|
-
}, {
|
|
175
|
-
default: vue.withCtx(() => [
|
|
176
|
-
vue.unref(isOpen) ? (vue.openBlock(), vue.createElementBlock("div", {
|
|
177
|
-
key: 0,
|
|
178
|
-
id: menuId.value,
|
|
179
|
-
ref_key: "menuRef",
|
|
180
|
-
ref: menuRef,
|
|
181
|
-
role: "menu",
|
|
182
|
-
"aria-labelledby": triggerId.value,
|
|
183
|
-
style: vue.normalizeStyle(computedDropdownStyle.value),
|
|
184
|
-
class: vue.normalizeClass([
|
|
185
|
-
"z-9999 rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800",
|
|
186
|
-
widthClasses[__props.width],
|
|
187
|
-
!__props.teleport && (__props.align === "right" ? "absolute mt-2 right-0" : "absolute mt-2 left-0")
|
|
188
|
-
])
|
|
189
|
-
}, [
|
|
190
|
-
vue.renderSlot(_ctx.$slots, "default", { close: vue.unref(close) }, () => [
|
|
191
|
-
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item) => {
|
|
192
|
-
return vue.openBlock(), vue.createElementBlock(vue.Fragment, {
|
|
193
|
-
key: item.key
|
|
194
|
-
}, [
|
|
195
|
-
item.divider ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4)) : (vue.openBlock(), vue.createElementBlock("button", {
|
|
196
|
-
key: 1,
|
|
197
|
-
type: "button",
|
|
198
|
-
role: "menuitem",
|
|
199
|
-
disabled: item.disabled,
|
|
200
|
-
class: vue.normalizeClass([
|
|
201
|
-
"flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors",
|
|
202
|
-
item.disabled ? "cursor-not-allowed opacity-50" : item.danger ? "text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20" : "text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700"
|
|
203
|
-
]),
|
|
204
|
-
onClick: ($event) => selectItem(item)
|
|
205
|
-
}, [
|
|
206
|
-
item.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
207
|
-
key: 0,
|
|
208
|
-
icon: item.icon,
|
|
209
|
-
class: "size-4",
|
|
210
|
-
"aria-hidden": "true"
|
|
211
|
-
}, null, 8, ["icon"])) : vue.createCommentVNode("", true),
|
|
212
|
-
vue.createTextVNode(" " + vue.toDisplayString(item.label), 1)
|
|
213
|
-
], 10, _hoisted_5))
|
|
214
|
-
], 64);
|
|
215
|
-
}), 128))
|
|
216
|
-
])
|
|
217
|
-
], 14, _hoisted_3)) : vue.createCommentVNode("", true)
|
|
218
|
-
]),
|
|
219
|
-
_: 3
|
|
220
|
-
})
|
|
221
|
-
], 8, ["disabled"]))
|
|
222
|
-
]);
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
exports._sfc_main = _sfc_main$1;
|
|
227
|
-
exports._sfc_main$1 = _sfc_main;
|
|
228
|
-
//# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { MenuItemProps } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n menuItem: MenuItemProps\n /** Whether sidebar is expanded (shows labels) */\n expanded?: boolean\n /** Override active state directly */\n active?: boolean\n /** Current route path (pass from parent using useRoute().path) */\n currentPath?: string\n }>(),\n {\n expanded: true,\n active: undefined,\n currentPath: undefined,\n },\n)\n\nconst isRouteActive = computed(() => {\n // If active prop is explicitly set, use it\n if (props.active !== undefined) {\n return props.active\n }\n\n // Use currentPath prop if provided, otherwise fall back to window.location\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n\n if (props.menuItem.link === '/') {\n return path === '/'\n }\n return path === props.menuItem.link || path.startsWith(props.menuItem.link + '/')\n})\n\n// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst linkProps = computed(() => {\n if (linkComponent.value === 'a') {\n return { href: props.menuItem.link }\n }\n return { to: props.menuItem.link }\n})\n</script>\n\n<template>\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"expanded ? 'flex-row' : 'flex-col'\"\n class=\"group relative flex items-center justify-center gap-2 px-5\"\n >\n <div class=\"relative\">\n <Icon\n :class=\"[\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\n expanded ? 'size-6' : 'size-8',\n ]\"\n class=\"transition-all duration-300\"\n :icon=\"menuItem.icon\"\n />\n\n <span\n v-if=\"menuItem.notification\"\n class=\"absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600\"\n />\n </div>\n\n <Transition\n enter-active-class=\"transition-all duration-300 ease-out\"\n enter-from-class=\"opacity-0 -translate-x-2\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition-all duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 -translate-x-2\"\n >\n <span\n v-if=\"expanded\"\n :class=\"\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\n \"\n class=\"text-sm font-semibold whitespace-nowrap\"\n >{{ menuItem.label }}</span>\n </Transition>\n </component>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport { useDropdown } from '@/composables/useDropdown'\nimport { useId } from '@/composables/useId'\n\nexport interface DropdownItem {\n key: string\n label: string\n icon?: string\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Dropdown items (optional if using default slot) */\n items?: DropdownItem[]\n /** Align dropdown */\n align?: 'left' | 'right'\n /** Dropdown width */\n width?: 'auto' | 'full' | 'sm' | 'md' | 'lg'\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n /** Custom ID for accessibility */\n id?: string\n }>(),\n {\n items: () => [],\n align: 'left',\n width: 'auto',\n teleport: true,\n },\n)\n\n// Generate unique IDs for accessibility\nconst { related } = useId({ prefix: 'dropdown', id: props.id })\nconst triggerId = computed(() => related('trigger'))\nconst menuId = computed(() => related('menu'))\n\nconst emit = defineEmits<{\n select: [item: DropdownItem]\n}>()\n\nconst triggerRef = ref<HTMLElement>()\nconst menuRef = ref<HTMLElement>()\n\nconst { isOpen, dropdownStyle, toggle, close } = useDropdown(triggerRef, menuRef, {\n teleport: props.teleport,\n align: props.align,\n})\n\nconst selectItem = (item: DropdownItem) => {\n if (item.disabled || item.divider) return\n emit('select', item)\n close()\n}\n\nconst widthClasses = {\n auto: 'w-auto min-w-40',\n full: 'w-full',\n sm: 'w-32',\n md: 'w-48',\n lg: 'w-64',\n}\n\nconst computedDropdownStyle = computed(() => {\n if (!props.teleport) return {}\n const { width: _, ...rest } = dropdownStyle.value\n return rest\n})\n</script>\n\n<template>\n <div class=\"relative inline-block\">\n <div\n ref=\"triggerRef\"\n @click=\"toggle\"\n >\n <slot name=\"trigger\">\n <button\n :id=\"triggerId\"\n type=\"button\"\n :aria-expanded=\"isOpen\"\n aria-haspopup=\"menu\"\n :aria-controls=\"menuId\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n >\n <slot name=\"trigger-label\">\n Options\n </slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 transition-transform', isOpen && 'rotate-180']\"\n aria-hidden=\"true\"\n />\n </button>\n </slot>\n </div>\n\n <Teleport\n to=\"body\"\n :disabled=\"!teleport\"\n >\n <Transition\n enter-active-class=\"transition ease-out duration-100\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-75\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n :id=\"menuId\"\n ref=\"menuRef\"\n role=\"menu\"\n :aria-labelledby=\"triggerId\"\n :style=\"computedDropdownStyle\"\n :class=\"[\n 'z-9999 rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800',\n widthClasses[width],\n !teleport && (align === 'right' ? 'absolute mt-2 right-0' : 'absolute mt-2 left-0'),\n ]\"\n >\n <!-- Custom content via default slot -->\n <slot :close=\"close\">\n <!-- Default items rendering -->\n <template\n v-for=\"item in items\"\n :key=\"item.key\"\n >\n <div\n v-if=\"item.divider\"\n role=\"separator\"\n class=\"my-1 border-t border-gray-200 dark:border-gray-700\"\n />\n <button\n v-else\n type=\"button\"\n role=\"menuitem\"\n :disabled=\"item.disabled\"\n :class=\"[\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors',\n item.disabled\n ? 'cursor-not-allowed opacity-50'\n : item.danger\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20'\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700',\n ]\"\n @click=\"selectItem(item)\"\n >\n <Icon\n v-if=\"item.icon\"\n :icon=\"item.icon\"\n class=\"size-4\"\n aria-hidden=\"true\"\n />\n {{ item.label }}\n </button>\n </template>\n </slot>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n"],"names":["computed","resolveComponent","_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_1","_createVNode","_unref","Icon","_normalizeClass","_createElementBlock","_hoisted_2","_Transition","_toDisplayString","useId","ref","useDropdown","_renderSlot","_Teleport","_Fragment","_renderList"],"mappings":"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"}
|