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
|
@@ -33,12 +33,12 @@ const _hoisted_11$2 = {
|
|
|
33
33
|
fill: "none",
|
|
34
34
|
preserveAspectRatio: "none"
|
|
35
35
|
};
|
|
36
|
-
const _hoisted_12$
|
|
37
|
-
const _hoisted_13$
|
|
36
|
+
const _hoisted_12$1 = ["stroke"];
|
|
37
|
+
const _hoisted_13$1 = {
|
|
38
38
|
key: 0,
|
|
39
39
|
class: "text-lg text-white/80 max-w-md mb-10"
|
|
40
40
|
};
|
|
41
|
-
const _hoisted_14$
|
|
41
|
+
const _hoisted_14$1 = {
|
|
42
42
|
key: 0,
|
|
43
43
|
class: "space-y-4"
|
|
44
44
|
};
|
|
@@ -165,14 +165,14 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
|
165
165
|
stroke: __props.underlineColor,
|
|
166
166
|
"stroke-width": "4",
|
|
167
167
|
"stroke-linecap": "round"
|
|
168
|
-
}, null, 8, _hoisted_12$
|
|
168
|
+
}, null, 8, _hoisted_12$1)
|
|
169
169
|
]))
|
|
170
170
|
])) : createCommentVNode("", true)
|
|
171
171
|
])) : createCommentVNode("", true)
|
|
172
172
|
]),
|
|
173
|
-
__props.description ? (openBlock(), createElementBlock("p", _hoisted_13$
|
|
173
|
+
__props.description ? (openBlock(), createElementBlock("p", _hoisted_13$1, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
|
|
174
174
|
renderSlot(_ctx.$slots, "branding-features", {}, () => [
|
|
175
|
-
__props.features.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_14$
|
|
175
|
+
__props.features.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_14$1, [
|
|
176
176
|
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.features, (feature, index) => {
|
|
177
177
|
return openBlock(), createElementBlock("div", {
|
|
178
178
|
key: index,
|
|
@@ -243,9 +243,9 @@ const _hoisted_8$2 = { class: "flex-1" };
|
|
|
243
243
|
const _hoisted_9$2 = { class: "flex items-center gap-3" };
|
|
244
244
|
const _hoisted_10$2 = { class: "flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800" };
|
|
245
245
|
const _hoisted_11$1 = { class: "flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white" };
|
|
246
|
-
const _hoisted_12
|
|
247
|
-
const _hoisted_13
|
|
248
|
-
const _hoisted_14
|
|
246
|
+
const _hoisted_12 = { class: "hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block" };
|
|
247
|
+
const _hoisted_13 = { class: "min-w-48 py-1" };
|
|
248
|
+
const _hoisted_14 = { class: "flex flex-1 flex-col overflow-y-auto overflow-x-hidden" };
|
|
249
249
|
const _hoisted_15 = { class: "container mx-auto flex flex-1 flex-col gap-5 p-5 max-w-full" };
|
|
250
250
|
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
251
251
|
__name: "BaseLayout",
|
|
@@ -421,7 +421,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
|
421
421
|
trigger: withCtx(() => [
|
|
422
422
|
createElementVNode("button", _hoisted_10$2, [
|
|
423
423
|
createElementVNode("div", _hoisted_11$1, toDisplayString(__props.userAvatar || "?"), 1),
|
|
424
|
-
createElementVNode("span", _hoisted_12
|
|
424
|
+
createElementVNode("span", _hoisted_12, toDisplayString(__props.userName), 1),
|
|
425
425
|
createVNode(unref(Icon), {
|
|
426
426
|
icon: "lucide:chevron-down",
|
|
427
427
|
class: "size-4 text-gray-500"
|
|
@@ -429,7 +429,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
|
429
429
|
])
|
|
430
430
|
]),
|
|
431
431
|
default: withCtx(({ close }) => [
|
|
432
|
-
createElementVNode("div", _hoisted_13
|
|
432
|
+
createElementVNode("div", _hoisted_13, [
|
|
433
433
|
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.userMenuItems, (item) => {
|
|
434
434
|
return openBlock(), createBlock(resolveDynamicComponent(item.link ? routerLinkComponent.value : "button"), mergeProps({
|
|
435
435
|
key: item.label
|
|
@@ -457,7 +457,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
|
457
457
|
})) : createCommentVNode("", true)
|
|
458
458
|
])
|
|
459
459
|
]),
|
|
460
|
-
createElementVNode("div", _hoisted_14
|
|
460
|
+
createElementVNode("div", _hoisted_14, [
|
|
461
461
|
createElementVNode("main", _hoisted_15, [
|
|
462
462
|
renderSlot(_ctx.$slots, "default", {}, () => [
|
|
463
463
|
routerViewComponent.value ? (openBlock(), createBlock(resolveDynamicComponent(routerViewComponent.value), { key: 0 })) : createCommentVNode("", true)
|
|
@@ -570,41 +570,35 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
570
570
|
};
|
|
571
571
|
}
|
|
572
572
|
});
|
|
573
|
-
const _hoisted_1 = {
|
|
574
|
-
const _hoisted_2 = {
|
|
573
|
+
const _hoisted_1 = {
|
|
575
574
|
key: 0,
|
|
576
575
|
class: "absolute inset-0 overflow-hidden pointer-events-none"
|
|
577
576
|
};
|
|
578
|
-
const
|
|
577
|
+
const _hoisted_2 = {
|
|
579
578
|
key: 1,
|
|
580
579
|
class: "absolute inset-0 overflow-hidden pointer-events-none"
|
|
581
580
|
};
|
|
582
|
-
const
|
|
583
|
-
const
|
|
584
|
-
const
|
|
581
|
+
const _hoisted_3 = { class: "relative px-4 pt-8 pb-10 sm:px-6 lg:px-8 max-w-5xl mx-auto" };
|
|
582
|
+
const _hoisted_4 = { class: "text-center mb-8 animate-fade-in-up" };
|
|
583
|
+
const _hoisted_5 = {
|
|
585
584
|
key: 0,
|
|
586
585
|
class: "inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/15 backdrop-blur-sm border border-white/20 mb-4"
|
|
587
586
|
};
|
|
588
|
-
const
|
|
587
|
+
const _hoisted_6 = {
|
|
589
588
|
key: 1,
|
|
590
589
|
class: "text-sm font-medium text-white"
|
|
591
590
|
};
|
|
592
|
-
const
|
|
593
|
-
const
|
|
594
|
-
key: 1,
|
|
595
|
-
class: "text-primary-100 text-sm sm:text-base"
|
|
596
|
-
};
|
|
597
|
-
const _hoisted_10 = {
|
|
591
|
+
const _hoisted_7 = { class: "text-2xl sm:text-3xl font-bold text-white mb-2" };
|
|
592
|
+
const _hoisted_8 = {
|
|
598
593
|
key: 0,
|
|
599
594
|
class: "animate-fade-in-up [animation-delay:0.1s]"
|
|
600
595
|
};
|
|
601
|
-
const
|
|
596
|
+
const _hoisted_9 = {
|
|
602
597
|
key: 0,
|
|
603
598
|
class: "w-10 h-10 mx-auto mb-2 rounded-xl bg-white/20 flex items-center justify-center"
|
|
604
599
|
};
|
|
605
|
-
const
|
|
606
|
-
const
|
|
607
|
-
const _hoisted_14 = {
|
|
600
|
+
const _hoisted_10 = { class: "text-2xl sm:text-3xl font-bold text-white" };
|
|
601
|
+
const _hoisted_11 = {
|
|
608
602
|
key: 2,
|
|
609
603
|
class: "absolute bottom-0 left-0 right-0"
|
|
610
604
|
};
|
|
@@ -619,17 +613,58 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
619
613
|
showWave: { type: Boolean, default: true },
|
|
620
614
|
stats: {},
|
|
621
615
|
gradientDirection: { default: "br" },
|
|
622
|
-
decorativeIcons: {}
|
|
616
|
+
decorativeIcons: {},
|
|
617
|
+
colorScheme: { default: "primary" }
|
|
623
618
|
},
|
|
624
619
|
setup(__props) {
|
|
620
|
+
const props = __props;
|
|
621
|
+
const colorClasses = computed(() => {
|
|
622
|
+
const schemes = {
|
|
623
|
+
primary: {
|
|
624
|
+
gradient: "from-primary-600 via-primary-500 to-primary-400",
|
|
625
|
+
subtitle: "text-primary-100"
|
|
626
|
+
},
|
|
627
|
+
cyan: {
|
|
628
|
+
gradient: "from-cyan-600 via-cyan-500 to-teal-500",
|
|
629
|
+
subtitle: "text-cyan-100"
|
|
630
|
+
},
|
|
631
|
+
violet: {
|
|
632
|
+
gradient: "from-violet-600 via-violet-500 to-purple-500",
|
|
633
|
+
subtitle: "text-violet-100"
|
|
634
|
+
},
|
|
635
|
+
emerald: {
|
|
636
|
+
gradient: "from-emerald-600 via-emerald-500 to-teal-500",
|
|
637
|
+
subtitle: "text-emerald-100"
|
|
638
|
+
},
|
|
639
|
+
rose: {
|
|
640
|
+
gradient: "from-rose-600 via-rose-500 to-pink-500",
|
|
641
|
+
subtitle: "text-rose-100"
|
|
642
|
+
},
|
|
643
|
+
amber: {
|
|
644
|
+
gradient: "from-amber-600 via-amber-500 to-orange-500",
|
|
645
|
+
subtitle: "text-amber-100"
|
|
646
|
+
},
|
|
647
|
+
blue: {
|
|
648
|
+
gradient: "from-blue-600 via-blue-500 to-indigo-500",
|
|
649
|
+
subtitle: "text-blue-100"
|
|
650
|
+
},
|
|
651
|
+
teal: {
|
|
652
|
+
gradient: "from-teal-600 via-teal-500 to-cyan-500",
|
|
653
|
+
subtitle: "text-teal-100"
|
|
654
|
+
}
|
|
655
|
+
};
|
|
656
|
+
return schemes[props.colorScheme];
|
|
657
|
+
});
|
|
625
658
|
return (_ctx, _cache) => {
|
|
626
659
|
var _a, _b;
|
|
627
|
-
return openBlock(), createElementBlock("div",
|
|
628
|
-
|
|
660
|
+
return openBlock(), createElementBlock("div", {
|
|
661
|
+
class: normalizeClass(["relative overflow-hidden bg-linear-to-br", colorClasses.value.gradient])
|
|
662
|
+
}, [
|
|
663
|
+
__props.showBlobs ? (openBlock(), createElementBlock("div", _hoisted_1, [..._cache[0] || (_cache[0] = [
|
|
629
664
|
createElementVNode("div", { class: "absolute -top-20 -right-20 w-72 h-72 bg-white/10 rounded-full blur-3xl animate-float" }, null, -1),
|
|
630
665
|
createElementVNode("div", { class: "absolute -bottom-32 -left-32 w-96 h-96 bg-white/5 rounded-full blur-3xl animate-float [animation-delay:1s]" }, null, -1)
|
|
631
666
|
])])) : createCommentVNode("", true),
|
|
632
|
-
((_a = __props.decorativeIcons) == null ? void 0 : _a.length) ? (openBlock(), createElementBlock("div",
|
|
667
|
+
((_a = __props.decorativeIcons) == null ? void 0 : _a.length) ? (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
633
668
|
__props.decorativeIcons[0] ? (openBlock(), createBlock(unref(Icon), {
|
|
634
669
|
key: 0,
|
|
635
670
|
icon: __props.decorativeIcons[0],
|
|
@@ -642,30 +677,33 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
642
677
|
}, null, 8, ["icon"])) : createCommentVNode("", true)
|
|
643
678
|
])) : createCommentVNode("", true),
|
|
644
679
|
renderSlot(_ctx.$slots, "background"),
|
|
645
|
-
createElementVNode("div",
|
|
646
|
-
createElementVNode("div",
|
|
647
|
-
__props.badge || __props.badgeIcon || _ctx.$slots.badge ? (openBlock(), createElementBlock("div",
|
|
680
|
+
createElementVNode("div", _hoisted_3, [
|
|
681
|
+
createElementVNode("div", _hoisted_4, [
|
|
682
|
+
__props.badge || __props.badgeIcon || _ctx.$slots.badge ? (openBlock(), createElementBlock("div", _hoisted_5, [
|
|
648
683
|
renderSlot(_ctx.$slots, "badge", {}, () => [
|
|
649
684
|
__props.badgeIcon ? (openBlock(), createBlock(unref(Icon), {
|
|
650
685
|
key: 0,
|
|
651
686
|
icon: __props.badgeIcon,
|
|
652
687
|
class: "w-5 h-5 text-white"
|
|
653
688
|
}, null, 8, ["icon"])) : createCommentVNode("", true),
|
|
654
|
-
__props.badge ? (openBlock(), createElementBlock("span",
|
|
689
|
+
__props.badge ? (openBlock(), createElementBlock("span", _hoisted_6, toDisplayString(__props.badge), 1)) : createCommentVNode("", true)
|
|
655
690
|
])
|
|
656
691
|
])) : createCommentVNode("", true),
|
|
657
|
-
createElementVNode("h1",
|
|
692
|
+
createElementVNode("h1", _hoisted_7, [
|
|
658
693
|
renderSlot(_ctx.$slots, "title", {}, () => [
|
|
659
694
|
createTextVNode(toDisplayString(__props.title), 1)
|
|
660
695
|
])
|
|
661
696
|
]),
|
|
662
|
-
__props.subtitle || _ctx.$slots.subtitle ? (openBlock(), createElementBlock("p",
|
|
697
|
+
__props.subtitle || _ctx.$slots.subtitle ? (openBlock(), createElementBlock("p", {
|
|
698
|
+
key: 1,
|
|
699
|
+
class: normalizeClass(["text-sm sm:text-base", colorClasses.value.subtitle])
|
|
700
|
+
}, [
|
|
663
701
|
renderSlot(_ctx.$slots, "subtitle", {}, () => [
|
|
664
702
|
createTextVNode(toDisplayString(__props.subtitle), 1)
|
|
665
703
|
])
|
|
666
|
-
])) : createCommentVNode("", true)
|
|
704
|
+
], 2)) : createCommentVNode("", true)
|
|
667
705
|
]),
|
|
668
|
-
((_b = __props.stats) == null ? void 0 : _b.length) || _ctx.$slots.stats ? (openBlock(), createElementBlock("div",
|
|
706
|
+
((_b = __props.stats) == null ? void 0 : _b.length) || _ctx.$slots.stats ? (openBlock(), createElementBlock("div", _hoisted_8, [
|
|
669
707
|
renderSlot(_ctx.$slots, "stats", {}, () => {
|
|
670
708
|
var _a2, _b2, _c;
|
|
671
709
|
return [
|
|
@@ -682,14 +720,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
682
720
|
key: index,
|
|
683
721
|
class: "bg-white/15 backdrop-blur-sm rounded-2xl p-4 border border-white/20 text-center"
|
|
684
722
|
}, [
|
|
685
|
-
stat.icon ? (openBlock(), createElementBlock("div",
|
|
723
|
+
stat.icon ? (openBlock(), createElementBlock("div", _hoisted_9, [
|
|
686
724
|
createVNode(unref(Icon), {
|
|
687
725
|
icon: stat.icon,
|
|
688
726
|
class: "w-5 h-5 text-white"
|
|
689
727
|
}, null, 8, ["icon"])
|
|
690
728
|
])) : createCommentVNode("", true),
|
|
691
|
-
createElementVNode("div",
|
|
692
|
-
createElementVNode("div",
|
|
729
|
+
createElementVNode("div", _hoisted_10, toDisplayString(stat.value), 1),
|
|
730
|
+
createElementVNode("div", {
|
|
731
|
+
class: normalizeClass(["text-xs sm:text-sm", colorClasses.value.subtitle])
|
|
732
|
+
}, toDisplayString(stat.label), 3)
|
|
693
733
|
]);
|
|
694
734
|
}), 128))
|
|
695
735
|
], 2)
|
|
@@ -698,7 +738,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
698
738
|
])) : createCommentVNode("", true),
|
|
699
739
|
renderSlot(_ctx.$slots, "content")
|
|
700
740
|
]),
|
|
701
|
-
__props.showWave ? (openBlock(), createElementBlock("div",
|
|
741
|
+
__props.showWave ? (openBlock(), createElementBlock("div", _hoisted_11, [..._cache[1] || (_cache[1] = [
|
|
702
742
|
createElementVNode("svg", {
|
|
703
743
|
viewBox: "0 0 1440 80",
|
|
704
744
|
fill: "none",
|
|
@@ -712,7 +752,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
712
752
|
})
|
|
713
753
|
], -1)
|
|
714
754
|
])])) : createCommentVNode("", true)
|
|
715
|
-
]);
|
|
755
|
+
], 2);
|
|
716
756
|
};
|
|
717
757
|
}
|
|
718
758
|
});
|
|
@@ -722,4 +762,4 @@ export {
|
|
|
722
762
|
_sfc_main$1 as b,
|
|
723
763
|
_sfc_main as c
|
|
724
764
|
};
|
|
725
|
-
//# sourceMappingURL=PageHero.vue_vue_type_script_setup_true_lang-
|
|
765
|
+
//# sourceMappingURL=PageHero.vue_vue_type_script_setup_true_lang-BYx595-2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHero.vue_vue_type_script_setup_true_lang-C-YXGDTY.js","sources":["../src/components/layout/AuthLayout.vue","../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue","../src/components/layout/PageHero.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent, useSlots } from 'vue'\nimport { Icon } from '@iconify/vue'\n\n/**\n * Feature item for the branding panel\n */\nexport interface AuthFeature {\n /** Iconify icon name */\n icon: string\n /** Feature text */\n text: string\n}\n\nconst props = withDefaults(defineProps<{\n /** App/brand name (used in default logo slots) */\n appName?: string\n /** App icon - Iconify icon name (used in default logo slots) */\n appIcon?: string\n /** Headline text (first line) */\n headline?: string\n /** Sub-headline text (second line, with optional underline) */\n subHeadline?: string\n /** Description paragraph below headlines */\n description?: string\n /** List of features to display in branding panel */\n features?: AuthFeature[]\n /** Primary gradient from color (Tailwind class) */\n gradientFrom?: string\n /** Primary gradient via color (Tailwind class, optional) */\n gradientVia?: string\n /** Primary gradient to color (Tailwind class) */\n gradientTo?: string\n /** Show decorative floating shapes and blurs */\n showDecorations?: boolean\n /** Show dot pattern overlay on branding panel */\n showPattern?: boolean\n /** Underline accent color for sub-headline (CSS color value) */\n underlineColor?: string\n /** Form panel title */\n formTitle?: string\n /** Form panel subtitle */\n formSubtitle?: string\n /** Home link URL (used for mobile logo link) */\n homeLink?: string\n /** CSS animation class for branding content entry */\n brandingAnimation?: string\n /** CSS animation class for form panel entry */\n formAnimation?: string\n}>(), {\n appName: '',\n appIcon: 'lucide:box',\n headline: '',\n subHeadline: '',\n description: '',\n features: () => [],\n gradientFrom: 'from-primary-700',\n gradientVia: '',\n gradientTo: 'to-primary-800',\n showDecorations: true,\n showPattern: true,\n underlineColor: 'rgba(165, 180, 252, 0.5)',\n formTitle: '',\n formSubtitle: '',\n homeLink: '/',\n brandingAnimation: '',\n formAnimation: '',\n})\n\nconst slots = useSlots()\n\n// Check if branding panel has any content\nconst hasBrandingContent = computed(() => {\n return props.headline ||\n props.subHeadline ||\n props.description ||\n props.features.length > 0 ||\n slots['branding-logo'] ||\n slots['branding-headline'] ||\n slots['branding-content'] ||\n props.appName\n})\n\n// Try to resolve RouterLink (works with Vue Router)\nconst routerLinkComponent = 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 getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst gradientClasses = computed(() => {\n const classes = [props.gradientFrom, props.gradientTo]\n if (props.gradientVia) {\n classes.splice(1, 0, props.gradientVia)\n }\n return classes.filter(Boolean)\n})\n</script>\n\n<template>\n <div class=\"flex min-h-screen\">\n <!-- Left Panel - Branding (hidden on mobile) -->\n <div\n v-if=\"hasBrandingContent || $slots['branding-panel']\"\n :class=\"[\n 'hidden lg:flex lg:w-1/2 relative overflow-hidden bg-gradient-to-br',\n ...gradientClasses,\n ]\"\n >\n <!-- Allow complete customization of branding panel -->\n <slot name=\"branding-panel\">\n <!-- Decorative floating blurs -->\n <div\n v-if=\"showDecorations\"\n class=\"absolute inset-0 overflow-hidden pointer-events-none\"\n >\n <div class=\"absolute -top-20 -left-20 size-80 bg-white/5 rounded-full blur-3xl\" />\n <div class=\"absolute top-1/3 right-10 size-60 bg-white/5 rounded-full blur-3xl\" />\n <div class=\"absolute bottom-20 left-1/4 size-72 bg-white/5 rounded-full blur-3xl\" />\n </div>\n\n <!-- Dot pattern -->\n <div\n v-if=\"showPattern\"\n class=\"absolute inset-0 opacity-20 pointer-events-none\"\n style=\"background-image: radial-gradient(circle, rgba(255,255,255,0.4) 1px, transparent 1px); background-size: 24px 24px;\"\n />\n\n <!-- Floating decorative shapes -->\n <template v-if=\"showDecorations\">\n <div class=\"absolute top-20 right-20 size-16 border-2 border-white/20 rounded-2xl rotate-12 pointer-events-none\" />\n <div class=\"absolute bottom-32 left-16 size-12 border-2 border-white/20 rounded-full pointer-events-none\" />\n <div class=\"absolute top-1/2 left-10 size-8 bg-white/10 rounded-lg rotate-45 pointer-events-none\" />\n </template>\n\n <!-- Content -->\n <div class=\"relative z-10 flex flex-col justify-center px-16 py-12 text-white w-full\">\n <div :class=\"brandingAnimation\">\n <!-- Logo -->\n <div class=\"flex items-center gap-3 mb-12\">\n <slot name=\"branding-logo\">\n <template v-if=\"appName || appIcon\">\n <div class=\"size-14 bg-white/20 backdrop-blur-sm rounded-2xl flex items-center justify-center\">\n <Icon\n :icon=\"appIcon\"\n class=\"size-8 text-white\"\n />\n </div>\n <span\n v-if=\"appName\"\n class=\"text-3xl font-bold\"\n >\n {{ appName }}\n </span>\n </template>\n </slot>\n </div>\n\n <!-- Headlines -->\n <slot name=\"branding-headline\">\n <h1\n v-if=\"headline || subHeadline\"\n class=\"text-4xl xl:text-5xl font-bold leading-tight mb-6\"\n >\n <template v-if=\"headline\">\n {{ headline }}<br>\n </template>\n <span\n v-if=\"subHeadline\"\n class=\"relative inline-block\"\n >\n <span class=\"relative z-10\">{{ subHeadline }}</span>\n <svg\n class=\"absolute -bottom-2 left-0 w-full\"\n viewBox=\"0 0 280 12\"\n fill=\"none\"\n preserveAspectRatio=\"none\"\n >\n <path\n d=\"M2 10C45 4 90 2 140 6C190 10 235 4 278 8\"\n :stroke=\"underlineColor\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n />\n </svg>\n </span>\n </h1>\n </slot>\n\n <!-- Description -->\n <p\n v-if=\"description\"\n class=\"text-lg text-white/80 max-w-md mb-10\"\n >\n {{ description }}\n </p>\n\n <!-- Features list -->\n <slot name=\"branding-features\">\n <div\n v-if=\"features.length > 0\"\n class=\"space-y-4\"\n >\n <div\n v-for=\"(feature, index) in features\"\n :key=\"index\"\n class=\"flex items-center gap-3 text-white/90\"\n >\n <div class=\"size-10 rounded-xl bg-white/10 backdrop-blur-sm flex items-center justify-center shrink-0\">\n <Icon\n :icon=\"feature.icon\"\n class=\"size-5\"\n />\n </div>\n <span>{{ feature.text }}</span>\n </div>\n </div>\n </slot>\n\n <!-- Additional branding content -->\n <slot name=\"branding-content\" />\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Right Panel - Form -->\n <div class=\"flex-1 flex items-center justify-center p-6 sm:p-12 bg-gradient-to-br from-gray-50 to-gray-100 dark:from-slate-900 dark:to-slate-800\">\n <div\n :class=\"['w-full max-w-md', formAnimation]\"\n >\n <!-- Mobile Logo -->\n <div class=\"lg:hidden text-center mb-8\">\n <component\n :is=\"routerLinkComponent\"\n v-bind=\"getLinkProps(homeLink)\"\n class=\"inline-flex items-center gap-3\"\n >\n <slot name=\"mobile-logo\">\n <template v-if=\"appName || appIcon\">\n <div class=\"size-12 bg-primary-600 rounded-xl flex items-center justify-center shadow-lg shadow-primary-200 dark:shadow-primary-900/30\">\n <Icon\n :icon=\"appIcon\"\n class=\"size-6 text-white\"\n />\n </div>\n <span\n v-if=\"appName\"\n class=\"text-2xl font-bold text-gray-900 dark:text-white\"\n >\n {{ appName }}\n </span>\n </template>\n </slot>\n </component>\n </div>\n\n <!-- Form Header (title/subtitle) -->\n <slot name=\"form-header\">\n <div\n v-if=\"formTitle || formSubtitle\"\n class=\"text-center lg:text-left mb-8\"\n >\n <h2\n v-if=\"formTitle\"\n class=\"text-2xl sm:text-3xl font-bold text-gray-900 dark:text-white mb-2\"\n >\n {{ formTitle }}\n </h2>\n <p\n v-if=\"formSubtitle\"\n class=\"text-gray-600 dark:text-gray-400\"\n >\n {{ formSubtitle }}\n </p>\n </div>\n </slot>\n\n <!-- Form Card -->\n <div class=\"bg-white dark:bg-slate-800/80 rounded-3xl shadow-xl shadow-gray-200/50 dark:shadow-none p-8\">\n <slot />\n </div>\n\n <!-- Form Footer -->\n <slot name=\"form-footer\" />\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\n\nexport type MenuPosition = 'top' | 'center' | 'bottom'\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\n /** Menu vertical position in sidebar: 'top', 'center', or 'bottom' */\n menuPosition?: MenuPosition\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\n menuPosition: 'top',\n },\n)\n\nconst menuPositionClass = computed(() => {\n switch (props.menuPosition) {\n case 'center':\n return 'lg:justify-center'\n case 'bottom':\n return 'lg:justify-end'\n case 'top':\n default:\n return 'lg:justify-start'\n }\n})\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n\n// Try to resolve RouterLink\nconst routerLinkComponent = 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 getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\n}\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh overflow-hidden bg-gray-100 dark:bg-slate-900\">\n <!-- Backdrop for mobile -->\n <div\n v-if=\"sidebarOpenModel\"\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\n @click=\"sidebarOpenModel = false\"\n />\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n sidebarOpenModel ? 'lg:w-60' : 'max-lg:-translate-x-76 lg:w-16',\n sidebarClass,\n ]\"\n class=\"@container max-lg:absolute max-lg:z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon\n class=\"size-5 text-white\"\n :icon=\"appIcon\"\n />\n </div>\n <span\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\n >\n {{ appName }}\n </span>\n </slot>\n </div>\n\n <button\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-white\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <!-- Menu Items -->\n <div\n :class=\"[sidebarOpenModel ? 'items-start' : 'items-center', menuPositionClass]\"\n class=\"flex min-h-0 flex-1 flex-col gap-8 overflow-y-auto overflow-x-hidden px-2\"\n >\n <slot\n name=\"menu\"\n :current-path=\"currentPath\"\n >\n <MenuItem\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n :menu-item=\"item\"\n :expanded=\"sidebarOpenModel\"\n :current-path=\"currentPath\"\n />\n </slot>\n </div>\n\n <!-- Sidebar Footer -->\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\n <slot name=\"sidebar-footer\" />\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex flex-1 flex-col min-w-0\">\n <!-- Header -->\n <header\n class=\"flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950\"\n >\n <div>\n <button\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <div class=\"flex-1\">\n <slot name=\"header-center\" />\n </div>\n\n <div class=\"flex items-center gap-3\">\n <slot name=\"header-actions\" />\n\n <button\n v-if=\"showDarkToggle\"\n class=\"flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleDark\"\n >\n <Icon\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\n class=\"size-5 text-gray-900 dark:text-gray-100\"\n />\n </button>\n\n <!-- User Menu -->\n <Dropdown\n v-if=\"userName || userAvatar\"\n align=\"right\"\n >\n <template #trigger>\n <button\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\n >\n <div\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\n >\n {{ userAvatar || '?' }}\n </div>\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\n {{ userName }}\n </span>\n <Icon\n icon=\"lucide:chevron-down\"\n class=\"size-4 text-gray-500\"\n />\n </button>\n </template>\n\n <template #default=\"{ close }\">\n <div class=\"min-w-48 py-1\">\n <component\n :is=\"item.link ? routerLinkComponent : 'button'\"\n v-for=\"item in userMenuItems\"\n :key=\"item.label\"\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\"\n @click=\"handleUserMenuClick(item); close()\"\n >\n <Icon\n v-if=\"item.icon\"\n :icon=\"item.icon\"\n class=\"size-4\"\n />\n {{ item.label }}\n </component>\n </div>\n </template>\n </Dropdown>\n </div>\n </header>\n\n <!-- Page Content -->\n <div class=\"flex flex-1 flex-col overflow-y-auto overflow-x-hidden\">\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5 max-w-full\">\n <slot>\n <component\n :is=\"routerViewComponent\"\n v-if=\"routerViewComponent\"\n />\n </slot>\n </main>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\n\nexport interface PageBreadcrumb {\n label: string\n link: string\n}\n\ndefineProps<{\n /** Page title */\n title?: string\n /** Page description */\n description?: string\n /** Breadcrumb navigation items */\n breadcrumbs?: PageBreadcrumb[]\n}>()\n\n// Try to resolve RouterLink\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 getLinkProps = (link: string) => {\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-4\">\n <!-- Breadcrumbs -->\n <nav\n v-if=\"breadcrumbs && breadcrumbs.length > 0\"\n aria-label=\"Breadcrumb\"\n >\n <ol class=\"flex items-center\">\n <li\n v-for=\"(breadcrumb, index) in breadcrumbs\"\n :key=\"index\"\n class=\"flex items-center\"\n >\n <span\n v-if=\"index > 0\"\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\n >\n /\n </span>\n\n <slot\n name=\"breadcrumb\"\n :breadcrumb=\"breadcrumb\"\n :index=\"index\"\n :is-last=\"index === breadcrumbs.length - 1\"\n >\n <component\n :is=\"linkComponent\"\n v-bind=\"getLinkProps(breadcrumb.link)\"\n :class=\"[\n 'text-sm transition-colors',\n index < breadcrumbs.length - 1\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\n : 'text-gray-400 dark:text-gray-600',\n ]\"\n >\n {{ breadcrumb.label }}\n </component>\n </slot>\n </li>\n </ol>\n </nav>\n\n <!-- Page Header -->\n <div class=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n <div class=\"flex flex-col gap-1 min-w-0 flex-1\">\n <h1\n v-if=\"title\"\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100 truncate\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </h1>\n\n <p\n v-if=\"description\"\n class=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">\n {{ description }}\n </slot>\n </p>\n </div>\n\n <div class=\"flex items-center gap-2 flex-wrap shrink-0\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <!-- Page Content -->\n <div class=\"flex-1\">\n <slot />\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nexport interface PageHeroStat {\n label: string\n value: string | number\n icon?: string\n}\n\nwithDefaults(\n defineProps<{\n /** Main title */\n title: string\n /** Subtitle/description */\n subtitle?: string\n /** Badge text (shown above title) */\n badge?: string\n /** Badge icon */\n badgeIcon?: string\n /** Show animated background blobs */\n showBlobs?: boolean\n /** Show wave decoration at bottom */\n showWave?: boolean\n /** Stats to display in grid */\n stats?: PageHeroStat[]\n /** Gradient direction: 'br' (bottom-right), 'r' (right), 'b' (bottom) */\n gradientDirection?: 'br' | 'r' | 'b'\n /** Decorative icons (shown faded in background) */\n decorativeIcons?: string[]\n }>(),\n {\n showBlobs: true,\n showWave: true,\n gradientDirection: 'br',\n }\n)\n</script>\n\n<template>\n <div class=\"relative overflow-hidden bg-linear-to-br from-primary-600 via-primary-500 to-primary-400\">\n <!-- Animated background blobs -->\n <div v-if=\"showBlobs\" class=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div\n class=\"absolute -top-20 -right-20 w-72 h-72 bg-white/10 rounded-full blur-3xl animate-float\"\n />\n <div\n class=\"absolute -bottom-32 -left-32 w-96 h-96 bg-white/5 rounded-full blur-3xl animate-float [animation-delay:1s]\"\n />\n </div>\n\n <!-- Decorative icons -->\n <div v-if=\"decorativeIcons?.length\" class=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <Icon\n v-if=\"decorativeIcons[0]\"\n :icon=\"decorativeIcons[0]\"\n class=\"absolute top-12 right-8 w-24 h-24 text-white/5 rotate-12\"\n />\n <Icon\n v-if=\"decorativeIcons[1]\"\n :icon=\"decorativeIcons[1]\"\n class=\"absolute bottom-8 left-12 w-20 h-20 text-white/5 -rotate-12\"\n />\n </div>\n\n <!-- Custom background slot -->\n <slot name=\"background\" />\n\n <div class=\"relative px-4 pt-8 pb-10 sm:px-6 lg:px-8 max-w-5xl mx-auto\">\n <!-- Header content -->\n <div class=\"text-center mb-8 animate-fade-in-up\">\n <!-- Badge -->\n <div\n v-if=\"badge || badgeIcon || $slots.badge\"\n class=\"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/15 backdrop-blur-sm border border-white/20 mb-4\"\n >\n <slot name=\"badge\">\n <Icon v-if=\"badgeIcon\" :icon=\"badgeIcon\" class=\"w-5 h-5 text-white\" />\n <span v-if=\"badge\" class=\"text-sm font-medium text-white\">{{ badge }}</span>\n </slot>\n </div>\n\n <!-- Title -->\n <h1 class=\"text-2xl sm:text-3xl font-bold text-white mb-2\">\n <slot name=\"title\">{{ title }}</slot>\n </h1>\n\n <!-- Subtitle -->\n <p v-if=\"subtitle || $slots.subtitle\" class=\"text-primary-100 text-sm sm:text-base\">\n <slot name=\"subtitle\">{{ subtitle }}</slot>\n </p>\n </div>\n\n <!-- Stats Grid -->\n <div\n v-if=\"stats?.length || $slots.stats\"\n class=\"animate-fade-in-up [animation-delay:0.1s]\"\n >\n <slot name=\"stats\">\n <div\n class=\"grid gap-3 sm:gap-4\"\n :class=\"[\n stats?.length === 2 ? 'grid-cols-2' : '',\n stats?.length === 3 ? 'grid-cols-3' : '',\n stats?.length === 4 ? 'grid-cols-2 sm:grid-cols-4' : '',\n stats && stats.length > 4 ? 'grid-cols-2 sm:grid-cols-3 lg:grid-cols-4' : '',\n ]\"\n >\n <div\n v-for=\"(stat, index) in stats\"\n :key=\"index\"\n class=\"bg-white/15 backdrop-blur-sm rounded-2xl p-4 border border-white/20 text-center\"\n >\n <div\n v-if=\"stat.icon\"\n class=\"w-10 h-10 mx-auto mb-2 rounded-xl bg-white/20 flex items-center justify-center\"\n >\n <Icon :icon=\"stat.icon\" class=\"w-5 h-5 text-white\" />\n </div>\n <div class=\"text-2xl sm:text-3xl font-bold text-white\">{{ stat.value }}</div>\n <div class=\"text-xs sm:text-sm text-primary-100\">{{ stat.label }}</div>\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Additional content -->\n <slot name=\"content\" />\n </div>\n\n <!-- Wave decoration -->\n <div v-if=\"showWave\" class=\"absolute bottom-0 left-0 right-0\">\n <svg\n viewBox=\"0 0 1440 80\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-full h-auto\"\n preserveAspectRatio=\"none\"\n >\n <path\n d=\"M0 80L60 74.7C120 69 240 59 360 53.3C480 48 600 48 720 53.3C840 59 960 69 1080 69.3C1200 69 1320 59 1380 53.3L1440 48V80H1380C1320 80 1200 80 1080 80C960 80 840 80 720 80C600 80 480 80 360 80C240 80 120 80 60 80H0Z\"\n class=\"fill-gray-50 dark:fill-slate-900\"\n />\n </svg>\n </div>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","$slots","_normalizeClass","_renderSlot","_hoisted_2","_createElementVNode","_hoisted_3","_Fragment","_hoisted_4","_hoisted_5","_hoisted_6","_createVNode","_unref","_hoisted_7","_toDisplayString","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_13","_hoisted_14","_renderList","_hoisted_15","_createBlock","_resolveDynamicComponent","_mergeProps","MenuItem","Dropdown","_hoisted_12","_withCtx","_createTextVNode","_a","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PageHero.vue_vue_type_script_setup_true_lang-BYx595-2.js","sources":["../src/components/layout/AuthLayout.vue","../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue","../src/components/layout/PageHero.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent, useSlots } from 'vue'\nimport { Icon } from '@iconify/vue'\n\n/**\n * Feature item for the branding panel\n */\nexport interface AuthFeature {\n /** Iconify icon name */\n icon: string\n /** Feature text */\n text: string\n}\n\nconst props = withDefaults(defineProps<{\n /** App/brand name (used in default logo slots) */\n appName?: string\n /** App icon - Iconify icon name (used in default logo slots) */\n appIcon?: string\n /** Headline text (first line) */\n headline?: string\n /** Sub-headline text (second line, with optional underline) */\n subHeadline?: string\n /** Description paragraph below headlines */\n description?: string\n /** List of features to display in branding panel */\n features?: AuthFeature[]\n /** Primary gradient from color (Tailwind class) */\n gradientFrom?: string\n /** Primary gradient via color (Tailwind class, optional) */\n gradientVia?: string\n /** Primary gradient to color (Tailwind class) */\n gradientTo?: string\n /** Show decorative floating shapes and blurs */\n showDecorations?: boolean\n /** Show dot pattern overlay on branding panel */\n showPattern?: boolean\n /** Underline accent color for sub-headline (CSS color value) */\n underlineColor?: string\n /** Form panel title */\n formTitle?: string\n /** Form panel subtitle */\n formSubtitle?: string\n /** Home link URL (used for mobile logo link) */\n homeLink?: string\n /** CSS animation class for branding content entry */\n brandingAnimation?: string\n /** CSS animation class for form panel entry */\n formAnimation?: string\n}>(), {\n appName: '',\n appIcon: 'lucide:box',\n headline: '',\n subHeadline: '',\n description: '',\n features: () => [],\n gradientFrom: 'from-primary-700',\n gradientVia: '',\n gradientTo: 'to-primary-800',\n showDecorations: true,\n showPattern: true,\n underlineColor: 'rgba(165, 180, 252, 0.5)',\n formTitle: '',\n formSubtitle: '',\n homeLink: '/',\n brandingAnimation: '',\n formAnimation: '',\n})\n\nconst slots = useSlots()\n\n// Check if branding panel has any content\nconst hasBrandingContent = computed(() => {\n return props.headline ||\n props.subHeadline ||\n props.description ||\n props.features.length > 0 ||\n slots['branding-logo'] ||\n slots['branding-headline'] ||\n slots['branding-content'] ||\n props.appName\n})\n\n// Try to resolve RouterLink (works with Vue Router)\nconst routerLinkComponent = 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 getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst gradientClasses = computed(() => {\n const classes = [props.gradientFrom, props.gradientTo]\n if (props.gradientVia) {\n classes.splice(1, 0, props.gradientVia)\n }\n return classes.filter(Boolean)\n})\n</script>\n\n<template>\n <div class=\"flex min-h-screen\">\n <!-- Left Panel - Branding (hidden on mobile) -->\n <div\n v-if=\"hasBrandingContent || $slots['branding-panel']\"\n :class=\"[\n 'hidden lg:flex lg:w-1/2 relative overflow-hidden bg-gradient-to-br',\n ...gradientClasses,\n ]\"\n >\n <!-- Allow complete customization of branding panel -->\n <slot name=\"branding-panel\">\n <!-- Decorative floating blurs -->\n <div\n v-if=\"showDecorations\"\n class=\"absolute inset-0 overflow-hidden pointer-events-none\"\n >\n <div class=\"absolute -top-20 -left-20 size-80 bg-white/5 rounded-full blur-3xl\" />\n <div class=\"absolute top-1/3 right-10 size-60 bg-white/5 rounded-full blur-3xl\" />\n <div class=\"absolute bottom-20 left-1/4 size-72 bg-white/5 rounded-full blur-3xl\" />\n </div>\n\n <!-- Dot pattern -->\n <div\n v-if=\"showPattern\"\n class=\"absolute inset-0 opacity-20 pointer-events-none\"\n style=\"background-image: radial-gradient(circle, rgba(255,255,255,0.4) 1px, transparent 1px); background-size: 24px 24px;\"\n />\n\n <!-- Floating decorative shapes -->\n <template v-if=\"showDecorations\">\n <div class=\"absolute top-20 right-20 size-16 border-2 border-white/20 rounded-2xl rotate-12 pointer-events-none\" />\n <div class=\"absolute bottom-32 left-16 size-12 border-2 border-white/20 rounded-full pointer-events-none\" />\n <div class=\"absolute top-1/2 left-10 size-8 bg-white/10 rounded-lg rotate-45 pointer-events-none\" />\n </template>\n\n <!-- Content -->\n <div class=\"relative z-10 flex flex-col justify-center px-16 py-12 text-white w-full\">\n <div :class=\"brandingAnimation\">\n <!-- Logo -->\n <div class=\"flex items-center gap-3 mb-12\">\n <slot name=\"branding-logo\">\n <template v-if=\"appName || appIcon\">\n <div class=\"size-14 bg-white/20 backdrop-blur-sm rounded-2xl flex items-center justify-center\">\n <Icon\n :icon=\"appIcon\"\n class=\"size-8 text-white\"\n />\n </div>\n <span\n v-if=\"appName\"\n class=\"text-3xl font-bold\"\n >\n {{ appName }}\n </span>\n </template>\n </slot>\n </div>\n\n <!-- Headlines -->\n <slot name=\"branding-headline\">\n <h1\n v-if=\"headline || subHeadline\"\n class=\"text-4xl xl:text-5xl font-bold leading-tight mb-6\"\n >\n <template v-if=\"headline\">\n {{ headline }}<br>\n </template>\n <span\n v-if=\"subHeadline\"\n class=\"relative inline-block\"\n >\n <span class=\"relative z-10\">{{ subHeadline }}</span>\n <svg\n class=\"absolute -bottom-2 left-0 w-full\"\n viewBox=\"0 0 280 12\"\n fill=\"none\"\n preserveAspectRatio=\"none\"\n >\n <path\n d=\"M2 10C45 4 90 2 140 6C190 10 235 4 278 8\"\n :stroke=\"underlineColor\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n />\n </svg>\n </span>\n </h1>\n </slot>\n\n <!-- Description -->\n <p\n v-if=\"description\"\n class=\"text-lg text-white/80 max-w-md mb-10\"\n >\n {{ description }}\n </p>\n\n <!-- Features list -->\n <slot name=\"branding-features\">\n <div\n v-if=\"features.length > 0\"\n class=\"space-y-4\"\n >\n <div\n v-for=\"(feature, index) in features\"\n :key=\"index\"\n class=\"flex items-center gap-3 text-white/90\"\n >\n <div class=\"size-10 rounded-xl bg-white/10 backdrop-blur-sm flex items-center justify-center shrink-0\">\n <Icon\n :icon=\"feature.icon\"\n class=\"size-5\"\n />\n </div>\n <span>{{ feature.text }}</span>\n </div>\n </div>\n </slot>\n\n <!-- Additional branding content -->\n <slot name=\"branding-content\" />\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Right Panel - Form -->\n <div class=\"flex-1 flex items-center justify-center p-6 sm:p-12 bg-gradient-to-br from-gray-50 to-gray-100 dark:from-slate-900 dark:to-slate-800\">\n <div\n :class=\"['w-full max-w-md', formAnimation]\"\n >\n <!-- Mobile Logo -->\n <div class=\"lg:hidden text-center mb-8\">\n <component\n :is=\"routerLinkComponent\"\n v-bind=\"getLinkProps(homeLink)\"\n class=\"inline-flex items-center gap-3\"\n >\n <slot name=\"mobile-logo\">\n <template v-if=\"appName || appIcon\">\n <div class=\"size-12 bg-primary-600 rounded-xl flex items-center justify-center shadow-lg shadow-primary-200 dark:shadow-primary-900/30\">\n <Icon\n :icon=\"appIcon\"\n class=\"size-6 text-white\"\n />\n </div>\n <span\n v-if=\"appName\"\n class=\"text-2xl font-bold text-gray-900 dark:text-white\"\n >\n {{ appName }}\n </span>\n </template>\n </slot>\n </component>\n </div>\n\n <!-- Form Header (title/subtitle) -->\n <slot name=\"form-header\">\n <div\n v-if=\"formTitle || formSubtitle\"\n class=\"text-center lg:text-left mb-8\"\n >\n <h2\n v-if=\"formTitle\"\n class=\"text-2xl sm:text-3xl font-bold text-gray-900 dark:text-white mb-2\"\n >\n {{ formTitle }}\n </h2>\n <p\n v-if=\"formSubtitle\"\n class=\"text-gray-600 dark:text-gray-400\"\n >\n {{ formSubtitle }}\n </p>\n </div>\n </slot>\n\n <!-- Form Card -->\n <div class=\"bg-white dark:bg-slate-800/80 rounded-3xl shadow-xl shadow-gray-200/50 dark:shadow-none p-8\">\n <slot />\n </div>\n\n <!-- Form Footer -->\n <slot name=\"form-footer\" />\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\n\nexport type MenuPosition = 'top' | 'center' | 'bottom'\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\n /** Menu vertical position in sidebar: 'top', 'center', or 'bottom' */\n menuPosition?: MenuPosition\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\n menuPosition: 'top',\n },\n)\n\nconst menuPositionClass = computed(() => {\n switch (props.menuPosition) {\n case 'center':\n return 'lg:justify-center'\n case 'bottom':\n return 'lg:justify-end'\n case 'top':\n default:\n return 'lg:justify-start'\n }\n})\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n\n// Try to resolve RouterLink\nconst routerLinkComponent = 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 getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\n}\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh overflow-hidden bg-gray-100 dark:bg-slate-900\">\n <!-- Backdrop for mobile -->\n <div\n v-if=\"sidebarOpenModel\"\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\n @click=\"sidebarOpenModel = false\"\n />\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n sidebarOpenModel ? 'lg:w-60' : 'max-lg:-translate-x-76 lg:w-16',\n sidebarClass,\n ]\"\n class=\"@container max-lg:absolute max-lg:z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon\n class=\"size-5 text-white\"\n :icon=\"appIcon\"\n />\n </div>\n <span\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\n >\n {{ appName }}\n </span>\n </slot>\n </div>\n\n <button\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-white\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <!-- Menu Items -->\n <div\n :class=\"[sidebarOpenModel ? 'items-start' : 'items-center', menuPositionClass]\"\n class=\"flex min-h-0 flex-1 flex-col gap-8 overflow-y-auto overflow-x-hidden px-2\"\n >\n <slot\n name=\"menu\"\n :current-path=\"currentPath\"\n >\n <MenuItem\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n :menu-item=\"item\"\n :expanded=\"sidebarOpenModel\"\n :current-path=\"currentPath\"\n />\n </slot>\n </div>\n\n <!-- Sidebar Footer -->\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\n <slot name=\"sidebar-footer\" />\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex flex-1 flex-col min-w-0\">\n <!-- Header -->\n <header\n class=\"flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950\"\n >\n <div>\n <button\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <div class=\"flex-1\">\n <slot name=\"header-center\" />\n </div>\n\n <div class=\"flex items-center gap-3\">\n <slot name=\"header-actions\" />\n\n <button\n v-if=\"showDarkToggle\"\n class=\"flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleDark\"\n >\n <Icon\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\n class=\"size-5 text-gray-900 dark:text-gray-100\"\n />\n </button>\n\n <!-- User Menu -->\n <Dropdown\n v-if=\"userName || userAvatar\"\n align=\"right\"\n >\n <template #trigger>\n <button\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\n >\n <div\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\n >\n {{ userAvatar || '?' }}\n </div>\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\n {{ userName }}\n </span>\n <Icon\n icon=\"lucide:chevron-down\"\n class=\"size-4 text-gray-500\"\n />\n </button>\n </template>\n\n <template #default=\"{ close }\">\n <div class=\"min-w-48 py-1\">\n <component\n :is=\"item.link ? routerLinkComponent : 'button'\"\n v-for=\"item in userMenuItems\"\n :key=\"item.label\"\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\"\n @click=\"handleUserMenuClick(item); close()\"\n >\n <Icon\n v-if=\"item.icon\"\n :icon=\"item.icon\"\n class=\"size-4\"\n />\n {{ item.label }}\n </component>\n </div>\n </template>\n </Dropdown>\n </div>\n </header>\n\n <!-- Page Content -->\n <div class=\"flex flex-1 flex-col overflow-y-auto overflow-x-hidden\">\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5 max-w-full\">\n <slot>\n <component\n :is=\"routerViewComponent\"\n v-if=\"routerViewComponent\"\n />\n </slot>\n </main>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\n\nexport interface PageBreadcrumb {\n label: string\n link: string\n}\n\ndefineProps<{\n /** Page title */\n title?: string\n /** Page description */\n description?: string\n /** Breadcrumb navigation items */\n breadcrumbs?: PageBreadcrumb[]\n}>()\n\n// Try to resolve RouterLink\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 getLinkProps = (link: string) => {\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-4\">\n <!-- Breadcrumbs -->\n <nav\n v-if=\"breadcrumbs && breadcrumbs.length > 0\"\n aria-label=\"Breadcrumb\"\n >\n <ol class=\"flex items-center\">\n <li\n v-for=\"(breadcrumb, index) in breadcrumbs\"\n :key=\"index\"\n class=\"flex items-center\"\n >\n <span\n v-if=\"index > 0\"\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\n >\n /\n </span>\n\n <slot\n name=\"breadcrumb\"\n :breadcrumb=\"breadcrumb\"\n :index=\"index\"\n :is-last=\"index === breadcrumbs.length - 1\"\n >\n <component\n :is=\"linkComponent\"\n v-bind=\"getLinkProps(breadcrumb.link)\"\n :class=\"[\n 'text-sm transition-colors',\n index < breadcrumbs.length - 1\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\n : 'text-gray-400 dark:text-gray-600',\n ]\"\n >\n {{ breadcrumb.label }}\n </component>\n </slot>\n </li>\n </ol>\n </nav>\n\n <!-- Page Header -->\n <div class=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n <div class=\"flex flex-col gap-1 min-w-0 flex-1\">\n <h1\n v-if=\"title\"\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100 truncate\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </h1>\n\n <p\n v-if=\"description\"\n class=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">\n {{ description }}\n </slot>\n </p>\n </div>\n\n <div class=\"flex items-center gap-2 flex-wrap shrink-0\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <!-- Page Content -->\n <div class=\"flex-1\">\n <slot />\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport interface PageHeroStat {\n label: string\n value: string | number\n icon?: string\n}\n\nexport type PageHeroColorScheme = 'primary' | 'cyan' | 'violet' | 'emerald' | 'rose' | 'amber' | 'blue' | 'teal'\n\nconst props = withDefaults(\n defineProps<{\n /** Main title */\n title: string\n /** Subtitle/description */\n subtitle?: string\n /** Badge text (shown above title) */\n badge?: string\n /** Badge icon */\n badgeIcon?: string\n /** Show animated background blobs */\n showBlobs?: boolean\n /** Show wave decoration at bottom */\n showWave?: boolean\n /** Stats to display in grid */\n stats?: PageHeroStat[]\n /** Gradient direction: 'br' (bottom-right), 'r' (right), 'b' (bottom) */\n gradientDirection?: 'br' | 'r' | 'b'\n /** Decorative icons (shown faded in background) */\n decorativeIcons?: string[]\n /** Color scheme for gradient and accents */\n colorScheme?: PageHeroColorScheme\n }>(),\n {\n showBlobs: true,\n showWave: true,\n gradientDirection: 'br',\n colorScheme: 'primary',\n }\n)\n\n// Color scheme mappings\nconst colorClasses = computed(() => {\n const schemes: Record<PageHeroColorScheme, { gradient: string; subtitle: string }> = {\n primary: {\n gradient: 'from-primary-600 via-primary-500 to-primary-400',\n subtitle: 'text-primary-100',\n },\n cyan: {\n gradient: 'from-cyan-600 via-cyan-500 to-teal-500',\n subtitle: 'text-cyan-100',\n },\n violet: {\n gradient: 'from-violet-600 via-violet-500 to-purple-500',\n subtitle: 'text-violet-100',\n },\n emerald: {\n gradient: 'from-emerald-600 via-emerald-500 to-teal-500',\n subtitle: 'text-emerald-100',\n },\n rose: {\n gradient: 'from-rose-600 via-rose-500 to-pink-500',\n subtitle: 'text-rose-100',\n },\n amber: {\n gradient: 'from-amber-600 via-amber-500 to-orange-500',\n subtitle: 'text-amber-100',\n },\n blue: {\n gradient: 'from-blue-600 via-blue-500 to-indigo-500',\n subtitle: 'text-blue-100',\n },\n teal: {\n gradient: 'from-teal-600 via-teal-500 to-cyan-500',\n subtitle: 'text-teal-100',\n },\n }\n return schemes[props.colorScheme]\n})\n</script>\n\n<template>\n <div class=\"relative overflow-hidden bg-linear-to-br\" :class=\"colorClasses.gradient\">\n <!-- Animated background blobs -->\n <div v-if=\"showBlobs\" class=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div\n class=\"absolute -top-20 -right-20 w-72 h-72 bg-white/10 rounded-full blur-3xl animate-float\"\n />\n <div\n class=\"absolute -bottom-32 -left-32 w-96 h-96 bg-white/5 rounded-full blur-3xl animate-float [animation-delay:1s]\"\n />\n </div>\n\n <!-- Decorative icons -->\n <div v-if=\"decorativeIcons?.length\" class=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <Icon\n v-if=\"decorativeIcons[0]\"\n :icon=\"decorativeIcons[0]\"\n class=\"absolute top-12 right-8 w-24 h-24 text-white/5 rotate-12\"\n />\n <Icon\n v-if=\"decorativeIcons[1]\"\n :icon=\"decorativeIcons[1]\"\n class=\"absolute bottom-8 left-12 w-20 h-20 text-white/5 -rotate-12\"\n />\n </div>\n\n <!-- Custom background slot -->\n <slot name=\"background\" />\n\n <div class=\"relative px-4 pt-8 pb-10 sm:px-6 lg:px-8 max-w-5xl mx-auto\">\n <!-- Header content -->\n <div class=\"text-center mb-8 animate-fade-in-up\">\n <!-- Badge -->\n <div\n v-if=\"badge || badgeIcon || $slots.badge\"\n class=\"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/15 backdrop-blur-sm border border-white/20 mb-4\"\n >\n <slot name=\"badge\">\n <Icon v-if=\"badgeIcon\" :icon=\"badgeIcon\" class=\"w-5 h-5 text-white\" />\n <span v-if=\"badge\" class=\"text-sm font-medium text-white\">{{ badge }}</span>\n </slot>\n </div>\n\n <!-- Title -->\n <h1 class=\"text-2xl sm:text-3xl font-bold text-white mb-2\">\n <slot name=\"title\">{{ title }}</slot>\n </h1>\n\n <!-- Subtitle -->\n <p v-if=\"subtitle || $slots.subtitle\" class=\"text-sm sm:text-base\" :class=\"colorClasses.subtitle\">\n <slot name=\"subtitle\">{{ subtitle }}</slot>\n </p>\n </div>\n\n <!-- Stats Grid -->\n <div\n v-if=\"stats?.length || $slots.stats\"\n class=\"animate-fade-in-up [animation-delay:0.1s]\"\n >\n <slot name=\"stats\">\n <div\n class=\"grid gap-3 sm:gap-4\"\n :class=\"[\n stats?.length === 2 ? 'grid-cols-2' : '',\n stats?.length === 3 ? 'grid-cols-3' : '',\n stats?.length === 4 ? 'grid-cols-2 sm:grid-cols-4' : '',\n stats && stats.length > 4 ? 'grid-cols-2 sm:grid-cols-3 lg:grid-cols-4' : '',\n ]\"\n >\n <div\n v-for=\"(stat, index) in stats\"\n :key=\"index\"\n class=\"bg-white/15 backdrop-blur-sm rounded-2xl p-4 border border-white/20 text-center\"\n >\n <div\n v-if=\"stat.icon\"\n class=\"w-10 h-10 mx-auto mb-2 rounded-xl bg-white/20 flex items-center justify-center\"\n >\n <Icon :icon=\"stat.icon\" class=\"w-5 h-5 text-white\" />\n </div>\n <div class=\"text-2xl sm:text-3xl font-bold text-white\">{{ stat.value }}</div>\n <div class=\"text-xs sm:text-sm\" :class=\"colorClasses.subtitle\">{{ stat.label }}</div>\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Additional content -->\n <slot name=\"content\" />\n </div>\n\n <!-- Wave decoration -->\n <div v-if=\"showWave\" class=\"absolute bottom-0 left-0 right-0\">\n <svg\n viewBox=\"0 0 1440 80\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-full h-auto\"\n preserveAspectRatio=\"none\"\n >\n <path\n d=\"M0 80L60 74.7C120 69 240 59 360 53.3C480 48 600 48 720 53.3C840 59 960 69 1080 69.3C1200 69 1320 59 1380 53.3L1440 48V80H1380C1320 80 1200 80 1080 80C960 80 840 80 720 80C600 80 480 80 360 80C240 80 120 80 60 80H0Z\"\n class=\"fill-gray-50 dark:fill-slate-900\"\n />\n </svg>\n </div>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","$slots","_normalizeClass","_renderSlot","_hoisted_2","_createElementVNode","_hoisted_3","_Fragment","_hoisted_4","_hoisted_5","_hoisted_6","_createVNode","_unref","_hoisted_7","_toDisplayString","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_13","_hoisted_14","_renderList","_hoisted_15","_createBlock","_resolveDynamicComponent","_mergeProps","MenuItem","Dropdown","_withCtx","_createTextVNode","_a","_b"],"mappings":"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"}
|
|
@@ -2566,7 +2566,7 @@ const _hoisted_12 = {
|
|
|
2566
2566
|
class: "px-3 py-4 text-center text-sm text-gray-500"
|
|
2567
2567
|
};
|
|
2568
2568
|
const defaultCountries = [
|
|
2569
|
-
{ code: "FR", name: "France", dialCode: "+33", flag: "🇫🇷", format: "
|
|
2569
|
+
{ code: "FR", name: "France", dialCode: "+33", flag: "🇫🇷", format: "## ## ## ## ##" },
|
|
2570
2570
|
{ code: "US", name: "United States", dialCode: "+1", flag: "🇺🇸", format: "(###) ###-####" },
|
|
2571
2571
|
{ code: "GB", name: "United Kingdom", dialCode: "+44", flag: "🇬🇧", format: "#### ######" },
|
|
2572
2572
|
{ code: "DE", name: "Germany", dialCode: "+49", flag: "🇩🇪", format: "### #######" },
|
|
@@ -2602,6 +2602,10 @@ function formatPhoneWithPattern(value, pattern) {
|
|
|
2602
2602
|
function getPhoneDigits(value) {
|
|
2603
2603
|
return value.replace(/\D/g, "");
|
|
2604
2604
|
}
|
|
2605
|
+
function getMaxDigitsFromPattern(pattern) {
|
|
2606
|
+
if (!pattern) return void 0;
|
|
2607
|
+
return (pattern.match(/#/g) || []).length;
|
|
2608
|
+
}
|
|
2605
2609
|
const _sfc_main$7 = /* @__PURE__ */ defineComponent({
|
|
2606
2610
|
...{
|
|
2607
2611
|
inheritAttrs: false
|
|
@@ -2644,6 +2648,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
|
|
|
2644
2648
|
if (!modelValue.value) return "";
|
|
2645
2649
|
return `${selectedCountry.value.dialCode}${modelValue.value}`;
|
|
2646
2650
|
});
|
|
2651
|
+
const maxDigits = computed(() => getMaxDigitsFromPattern(selectedCountry.value.format));
|
|
2647
2652
|
const displayValue = computed(() => {
|
|
2648
2653
|
if (rawDialCodeInput.value) {
|
|
2649
2654
|
return rawDialCodeInput.value;
|
|
@@ -2672,6 +2677,10 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
|
|
|
2672
2677
|
}
|
|
2673
2678
|
return { digits: getPhoneDigits(value) };
|
|
2674
2679
|
}
|
|
2680
|
+
function limitDigits(digits, max) {
|
|
2681
|
+
if (max === void 0) return digits;
|
|
2682
|
+
return digits.slice(0, max);
|
|
2683
|
+
}
|
|
2675
2684
|
function handleInput(event) {
|
|
2676
2685
|
const target = event.target;
|
|
2677
2686
|
const inputValue = target.value;
|
|
@@ -2679,7 +2688,8 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
|
|
|
2679
2688
|
const { digits, country } = parsePhoneWithDialCode(inputValue);
|
|
2680
2689
|
if (country) {
|
|
2681
2690
|
selectedCountry.value = country;
|
|
2682
|
-
|
|
2691
|
+
const countryMax = getMaxDigitsFromPattern(country.format);
|
|
2692
|
+
modelValue.value = limitDigits(digits, countryMax);
|
|
2683
2693
|
rawDialCodeInput.value = "";
|
|
2684
2694
|
} else {
|
|
2685
2695
|
rawDialCodeInput.value = inputValue;
|
|
@@ -2687,7 +2697,8 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
|
|
|
2687
2697
|
}
|
|
2688
2698
|
} else {
|
|
2689
2699
|
rawDialCodeInput.value = "";
|
|
2690
|
-
|
|
2700
|
+
const digits = getPhoneDigits(inputValue);
|
|
2701
|
+
modelValue.value = limitDigits(digits, maxDigits.value);
|
|
2691
2702
|
}
|
|
2692
2703
|
}
|
|
2693
2704
|
function handlePaste(event) {
|
|
@@ -2698,7 +2709,8 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
|
|
|
2698
2709
|
if (country) {
|
|
2699
2710
|
event.preventDefault();
|
|
2700
2711
|
selectedCountry.value = country;
|
|
2701
|
-
|
|
2712
|
+
const countryMax = getMaxDigitsFromPattern(country.format);
|
|
2713
|
+
modelValue.value = limitDigits(digits, countryMax);
|
|
2702
2714
|
}
|
|
2703
2715
|
}
|
|
2704
2716
|
function handleClickOutside(event) {
|
|
@@ -3680,4 +3692,4 @@ export {
|
|
|
3680
3692
|
_sfc_main$2 as x,
|
|
3681
3693
|
_sfc_main$1 as y
|
|
3682
3694
|
};
|
|
3683
|
-
//# sourceMappingURL=TagsInput-
|
|
3695
|
+
//# sourceMappingURL=TagsInput-DtoJKN3L.js.map
|