vlite3 0.0.9 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/extensions.json +3 -0
- package/LICENSE +21 -0
- package/README.md +126 -24
- package/index.html +16 -0
- package/package.json +2 -2
- package/scripts/bundle-css.js +45 -0
- package/src/App.vue +7 -0
- package/src/components/Accordion/Accordion.vue +139 -0
- package/src/components/Accordion/AccordionContent.vue +63 -0
- package/src/components/Accordion/AccordionItem.vue +163 -0
- package/src/components/Accordion/AccordionTrigger.vue +125 -0
- package/src/components/Accordion/index.ts +5 -0
- package/src/components/Accordion/types.ts +41 -0
- package/src/components/Alert.vue +112 -0
- package/src/components/Avatar.vue +110 -0
- package/src/components/AvatarUploader/AvatarUploader.vue +129 -0
- package/{components/AvatarUploader/index.d.ts → src/components/AvatarUploader/index.ts} +2 -2
- package/src/components/Badge.vue +45 -0
- package/src/components/Button.vue +122 -0
- package/src/components/ButtonGroup.vue +173 -0
- package/src/components/Carousel/Carousel.vue +84 -0
- package/src/components/Carousel/index.ts +2 -0
- package/src/components/Carousel/types.ts +25 -0
- package/src/components/CheckBox.vue +132 -0
- package/src/components/Chip/Chip.vue +158 -0
- package/src/components/Chip/index.ts +2 -0
- package/src/components/Chip/types.ts +23 -0
- package/src/components/ChoiceBox/ChoiceBox.vue +181 -0
- package/src/components/ChoiceBox/index.ts +2 -0
- package/src/components/ColorPicker/ColorIro.vue +207 -0
- package/src/components/ColorPicker/ColorPicker.vue +61 -0
- package/src/components/ConfirmationModal.vue +46 -0
- package/src/components/DataTable/DataTable.vue +478 -0
- package/src/components/DataTable/DataTableHeader.vue +78 -0
- package/src/components/DataTable/DataTableRow.vue +171 -0
- package/src/components/DataTable/DataTableToolbar.vue +45 -0
- package/src/components/DataTable/index.ts +5 -0
- package/src/components/DataTable/types.ts +85 -0
- package/src/components/DatePicker.vue +102 -0
- package/src/components/Dropdown/Dropdown.vue +348 -0
- package/src/components/Dropdown/DropdownBooleanItem.vue +40 -0
- package/src/components/Dropdown/DropdownGroupedLayout.vue +115 -0
- package/src/components/Dropdown/DropdownItem.vue +56 -0
- package/src/components/Dropdown/DropdownMenu.vue +374 -0
- package/src/components/Dropdown/DropdownTrigger.vue +27 -0
- package/src/components/Dropdown/composables/useDropdownIds.ts +27 -0
- package/src/components/Dropdown/composables/useDropdownNavigation.ts +109 -0
- package/src/components/Dropdown/composables/useDropdownSelection.ts +106 -0
- package/src/components/Dropdown/index.ts +6 -0
- package/src/components/FilePicker/FilePicker.vue +459 -0
- package/src/components/FilePicker/index.ts +2 -0
- package/src/components/FileTree/FileTree.vue +334 -0
- package/src/components/FileTree/FileTreeNode.vue +225 -0
- package/src/components/FileTree/index.ts +2 -0
- package/src/components/FileTree/types.ts +31 -0
- package/src/components/FileTree/useTreeSelection.ts +66 -0
- package/src/components/Form/CustomFields.vue +294 -0
- package/src/components/Form/Form.vue +406 -0
- package/src/components/Form/FormField.vue +404 -0
- package/src/components/Form/FormFields.vue +161 -0
- package/src/components/Form/composables/useFileUpload.ts +112 -0
- package/src/components/Form/composables/useForm.ts +356 -0
- package/src/components/Form/index.ts +16 -0
- package/src/components/Form/types.ts +203 -0
- package/src/components/Form/utils/form.utils.ts +209 -0
- package/src/components/Heatmap/Heatmap.vue +629 -0
- package/src/components/Heatmap/index.ts +2 -0
- package/src/components/Heatmap/types.ts +84 -0
- package/src/components/Icon.vue +47 -0
- package/src/components/IconPicker.vue +138 -0
- package/src/components/Input.vue +366 -0
- package/src/components/Label.vue +25 -0
- package/src/components/Logo.vue +5 -0
- package/src/components/Masonry/Masonry.vue +148 -0
- package/src/components/Masonry/index.ts +2 -0
- package/src/components/Masonry/types.ts +44 -0
- package/src/components/Modal.vue +135 -0
- package/src/components/MultiSelect/MultiSelect.vue +176 -0
- package/src/components/MultiSelect/index.ts +1 -0
- package/src/components/Navbar/Navbar.vue +277 -0
- package/src/components/Navbar/NavbarGroup.vue +27 -0
- package/src/components/Navbar/NavbarItem.vue +124 -0
- package/src/components/Navbar/index.ts +3 -0
- package/src/components/OTPInput/OTPInput.vue +220 -0
- package/src/components/OTPInput/index.ts +1 -0
- package/src/components/Pagination/Pagination.vue +238 -0
- package/src/components/Pagination/index.ts +1 -0
- package/src/components/PricingPlan/PricingPlan.vue +102 -0
- package/src/components/PricingPlan/PricingPlanItem.vue +148 -0
- package/src/components/PricingPlan/index.ts +3 -0
- package/src/components/PricingPlan/types.ts +29 -0
- package/src/components/SidePanel.vue +184 -0
- package/src/components/SidebarMenu/SidebarMenu.vue +146 -0
- package/src/components/SidebarMenu/SidebarMenuItem.vue +333 -0
- package/src/components/SidebarMenu/index.ts +3 -0
- package/src/components/SidebarMenu/types.ts +54 -0
- package/src/components/Slider.vue +181 -0
- package/src/components/Switch.vue +51 -0
- package/src/components/Tabes/Tabes.vue +112 -0
- package/src/components/Tabes/index.ts +2 -0
- package/src/components/Tabes/types.ts +17 -0
- package/src/components/Textarea.vue +48 -0
- package/src/components/ThemeToggle.vue +14 -0
- package/src/components/Timeline.vue +250 -0
- package/src/components/ToastNotification.vue +257 -0
- package/src/components/Tooltip.vue +25 -0
- package/src/components/Workbook/Sheet.vue +185 -0
- package/src/components/Workbook/Workbook.vue +231 -0
- package/src/components/Workbook/WorkbookAddButton.vue +17 -0
- package/src/components/Workbook/index.ts +3 -0
- package/src/components/Workbook/types.ts +43 -0
- package/src/composables/useKeyStroke.ts +291 -0
- package/src/composables/useNotifications.ts +206 -0
- package/src/composables/useTheme.ts +55 -0
- package/src/core/config.ts +37 -0
- package/src/core/index.ts +49 -0
- package/src/css/base.css +148 -0
- package/src/css/input.css +61 -0
- package/src/css/main.css +6 -0
- package/src/css/theme.css +344 -0
- package/src/directives/vRipple.ts +38 -0
- package/src/index.ts +53 -0
- package/src/main.ts +5 -0
- package/src/playground/Playground.vue +429 -0
- package/src/playground/composables/useGetUsers.ts +538 -0
- package/src/playground/demos/AccordionDemo.vue +361 -0
- package/src/playground/demos/AlertDemo.vue +36 -0
- package/src/playground/demos/AvatarDemo.vue +41 -0
- package/src/playground/demos/AvatarUploaderDemo.vue +133 -0
- package/src/playground/demos/BadgeDemo.vue +31 -0
- package/src/playground/demos/BadgesDemo.vue +26 -0
- package/src/playground/demos/ButtonDemo.vue +99 -0
- package/src/playground/demos/ButtonGroupDemo.vue +39 -0
- package/src/playground/demos/ButtonsDemo.vue +111 -0
- package/src/playground/demos/CarouselDemo.vue +135 -0
- package/src/playground/demos/CheckBoxDemo.vue +43 -0
- package/src/playground/demos/ChipDemo.vue +190 -0
- package/src/playground/demos/ChoiceBoxDemo.vue +160 -0
- package/src/playground/demos/ColorPickerDemo.vue +30 -0
- package/src/playground/demos/ColorsDemo.vue +295 -0
- package/src/playground/demos/DataTableDemo.vue +215 -0
- package/src/playground/demos/DatePickerDemo.vue +43 -0
- package/src/playground/demos/DisplayDemo.vue +101 -0
- package/src/playground/demos/DropdownDemo.vue +651 -0
- package/src/playground/demos/FilePickerDemo.vue +175 -0
- package/src/playground/demos/FileTreeDemo.vue +150 -0
- package/src/playground/demos/FormDemo.vue +1144 -0
- package/src/playground/demos/HeatmapDemo.vue +467 -0
- package/src/playground/demos/IconPickerDemo.vue +27 -0
- package/src/playground/demos/InputDemo.vue +80 -0
- package/src/playground/demos/InputsDemo.vue +127 -0
- package/src/playground/demos/LabelDemo.vue +32 -0
- package/src/playground/demos/MasonryDemo.vue +241 -0
- package/src/playground/demos/ModalDemo.vue +67 -0
- package/src/playground/demos/MultiSelectDemo.vue +300 -0
- package/src/playground/demos/NavbarDemo.vue +59 -0
- package/src/playground/demos/NavigationDemo.vue +116 -0
- package/src/playground/demos/OTPInputDemo.vue +170 -0
- package/src/playground/demos/OverlaysDemo.vue +104 -0
- package/src/playground/demos/PaginationDemo.vue +130 -0
- package/src/playground/demos/PricingPlanDemo.vue +110 -0
- package/src/playground/demos/SidePanelDemo.vue +45 -0
- package/src/playground/demos/SidebarMenuDemo.vue +170 -0
- package/src/playground/demos/SliderDemo.vue +48 -0
- package/src/playground/demos/SwitchDemo.vue +40 -0
- package/src/playground/demos/TabesDemo.vue +178 -0
- package/src/playground/demos/TextareaDemo.vue +31 -0
- package/src/playground/demos/ThemeToggleDemo.vue +20 -0
- package/src/playground/demos/TimelineDemo.vue +43 -0
- package/src/playground/demos/ToastDemo.vue +111 -0
- package/src/playground/demos/TooltipDemo.vue +30 -0
- package/src/playground/demos/WorkbookDemo.vue +227 -0
- package/src/types/alert.type.ts +11 -0
- package/{types/avatar.type.d.ts → src/types/avatar.type.ts} +9 -8
- package/src/types/button.ts +36 -0
- package/src/types/buttongroup.type.ts +1 -0
- package/{types/config.type.d.ts → src/types/config.type.ts} +16 -13
- package/src/types/form.type.ts +75 -0
- package/src/types/index.ts +11 -0
- package/src/types/navbar.type.ts +28 -0
- package/src/types/sidepanel.type.ts +14 -0
- package/src/types/styles.ts +42 -0
- package/src/types/timeline.type.ts +11 -0
- package/{utils/functions.d.ts → src/utils/functions.ts} +9 -1
- package/src/utils/index.ts +2 -0
- package/src/utils/object.ts +40 -0
- package/tsconfig.app.json +27 -0
- package/tsconfig.json +48 -0
- package/tsconfig.node.json +18 -0
- package/tsconfig.node.tsbuildinfo +1 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/vercel.json +8 -0
- package/vite.config.d.ts +2 -0
- package/vite.config.js +63 -0
- package/vite.config.ts +64 -0
- package/vite.config.vercel.ts +17 -0
- package/_virtual/_plugin-vue_export-helper.js +0 -9
- package/components/Accordion/Accordion.vue.d.ts +0 -42
- package/components/Accordion/Accordion.vue.js +0 -102
- package/components/Accordion/Accordion.vue2.js +0 -4
- package/components/Accordion/AccordionContent.vue.d.ts +0 -22
- package/components/Accordion/AccordionContent.vue.js +0 -7
- package/components/Accordion/AccordionContent.vue2.js +0 -47
- package/components/Accordion/AccordionItem.vue.d.ts +0 -54
- package/components/Accordion/AccordionItem.vue.js +0 -102
- package/components/Accordion/AccordionItem.vue2.js +0 -4
- package/components/Accordion/AccordionTrigger.vue.d.ts +0 -40
- package/components/Accordion/AccordionTrigger.vue.js +0 -69
- package/components/Accordion/AccordionTrigger.vue2.js +0 -4
- package/components/Accordion/index.d.ts +0 -5
- package/components/Accordion/types.d.ts +0 -30
- package/components/Alert.vue.d.ts +0 -36
- package/components/Alert.vue.js +0 -81
- package/components/Alert.vue2.js +0 -4
- package/components/Avatar.vue.d.ts +0 -32
- package/components/Avatar.vue.js +0 -78
- package/components/Avatar.vue2.js +0 -4
- package/components/AvatarUploader/AvatarUploader.vue.d.ts +0 -32
- package/components/AvatarUploader/AvatarUploader.vue.js +0 -99
- package/components/AvatarUploader/AvatarUploader.vue2.js +0 -4
- package/components/Badge.vue.d.ts +0 -25
- package/components/Badge.vue.js +0 -27
- package/components/Badge.vue2.js +0 -4
- package/components/Button.vue.d.ts +0 -26
- package/components/Button.vue.js +0 -108
- package/components/Button.vue2.js +0 -4
- package/components/ButtonGroup.vue.d.ts +0 -29
- package/components/ButtonGroup.vue.js +0 -7
- package/components/ButtonGroup.vue2.js +0 -30
- package/components/Carousel/Carousel.vue.d.ts +0 -847
- package/components/Carousel/Carousel.vue.js +0 -7
- package/components/Carousel/Carousel.vue2.js +0 -68
- package/components/Carousel/index.d.ts +0 -2
- package/components/Carousel/types.d.ts +0 -24
- package/components/CheckBox.vue.d.ts +0 -27
- package/components/CheckBox.vue.js +0 -115
- package/components/CheckBox.vue2.js +0 -4
- package/components/Chip/Chip.vue.d.ts +0 -33
- package/components/Chip/Chip.vue.js +0 -113
- package/components/Chip/Chip.vue2.js +0 -4
- package/components/Chip/index.d.ts +0 -2
- package/components/Chip/types.d.ts +0 -12
- package/components/ChoiceBox/ChoiceBox.vue.d.ts +0 -32
- package/components/ChoiceBox/ChoiceBox.vue.js +0 -141
- package/components/ChoiceBox/ChoiceBox.vue2.js +0 -4
- package/components/ChoiceBox/index.d.ts +0 -2
- package/components/ColorPicker/ColorIro.vue.d.ts +0 -18
- package/components/ColorPicker/ColorIro.vue.js +0 -142
- package/components/ColorPicker/ColorIro.vue3.js +0 -5
- package/components/ColorPicker/ColorPicker.vue.d.ts +0 -22
- package/components/ColorPicker/ColorPicker.vue.js +0 -55
- package/components/ColorPicker/ColorPicker.vue2.js +0 -4
- package/components/ConfirmationModal.vue.d.ts +0 -23
- package/components/ConfirmationModal.vue.js +0 -50
- package/components/ConfirmationModal.vue2.js +0 -4
- package/components/DataTable/DataTable.vue.d.ts +0 -60
- package/components/DataTable/DataTable.vue.js +0 -7
- package/components/DataTable/DataTable.vue2.js +0 -310
- package/components/DataTable/DataTableHeader.vue.d.ts +0 -14
- package/components/DataTable/DataTableHeader.vue.js +0 -49
- package/components/DataTable/DataTableHeader.vue2.js +0 -4
- package/components/DataTable/DataTableRow.vue.d.ts +0 -51
- package/components/DataTable/DataTableRow.vue.js +0 -114
- package/components/DataTable/DataTableRow.vue2.js +0 -4
- package/components/DataTable/DataTableToolbar.vue.d.ts +0 -31
- package/components/DataTable/DataTableToolbar.vue.js +0 -45
- package/components/DataTable/DataTableToolbar.vue2.js +0 -4
- package/components/DataTable/index.d.ts +0 -4
- package/components/DataTable/types.d.ts +0 -75
- package/components/DatePicker.vue.d.ts +0 -44
- package/components/DatePicker.vue.js +0 -84
- package/components/DatePicker.vue2.js +0 -4
- package/components/Dropdown/Dropdown.vue.d.ts +0 -104
- package/components/Dropdown/Dropdown.vue.js +0 -200
- package/components/Dropdown/Dropdown.vue2.js +0 -4
- package/components/Dropdown/DropdownBooleanItem.vue.d.ts +0 -12
- package/components/Dropdown/DropdownBooleanItem.vue.js +0 -41
- package/components/Dropdown/DropdownBooleanItem.vue2.js +0 -4
- package/components/Dropdown/DropdownGroupedLayout.vue.d.ts +0 -21
- package/components/Dropdown/DropdownGroupedLayout.vue.js +0 -73
- package/components/Dropdown/DropdownGroupedLayout.vue2.js +0 -4
- package/components/Dropdown/DropdownItem.vue.d.ts +0 -35
- package/components/Dropdown/DropdownItem.vue.js +0 -56
- package/components/Dropdown/DropdownItem.vue2.js +0 -4
- package/components/Dropdown/DropdownMenu.vue.d.ts +0 -71
- package/components/Dropdown/DropdownMenu.vue.js +0 -226
- package/components/Dropdown/DropdownMenu.vue2.js +0 -4
- package/components/Dropdown/DropdownTrigger.vue.d.ts +0 -13
- package/components/Dropdown/DropdownTrigger.vue.js +0 -24
- package/components/Dropdown/DropdownTrigger.vue2.js +0 -4
- package/components/Dropdown/composables/useDropdownIds.d.ts +0 -5
- package/components/Dropdown/composables/useDropdownIds.js +0 -20
- package/components/Dropdown/composables/useDropdownNavigation.d.ts +0 -19
- package/components/Dropdown/composables/useDropdownNavigation.js +0 -49
- package/components/Dropdown/composables/useDropdownSelection.d.ts +0 -16
- package/components/Dropdown/composables/useDropdownSelection.js +0 -41
- package/components/Dropdown/index.d.ts +0 -6
- package/components/FilePicker/FilePicker.vue.d.ts +0 -65
- package/components/FilePicker/FilePicker.vue.js +0 -284
- package/components/FilePicker/FilePicker.vue2.js +0 -4
- package/components/FilePicker/index.d.ts +0 -2
- package/components/FileTree/FileTree.vue.d.ts +0 -20
- package/components/FileTree/FileTree.vue.js +0 -141
- package/components/FileTree/FileTree.vue2.js +0 -4
- package/components/FileTree/FileTreeNode.vue.d.ts +0 -28
- package/components/FileTree/FileTreeNode.vue.js +0 -155
- package/components/FileTree/FileTreeNode.vue2.js +0 -4
- package/components/FileTree/index.d.ts +0 -2
- package/components/FileTree/types.d.ts +0 -28
- package/components/FileTree/useTreeSelection.d.ts +0 -12
- package/components/Form/CustomFields.vue.d.ts +0 -38
- package/components/Form/CustomFields.vue.js +0 -7
- package/components/Form/CustomFields.vue2.js +0 -161
- package/components/Form/Form.vue.d.ts +0 -94
- package/components/Form/Form.vue.js +0 -7
- package/components/Form/Form.vue2.js +0 -238
- package/components/Form/FormField.vue.d.ts +0 -28
- package/components/Form/FormField.vue.js +0 -212
- package/components/Form/FormField.vue2.js +0 -4
- package/components/Form/FormFields.vue.d.ts +0 -29
- package/components/Form/FormFields.vue.js +0 -7
- package/components/Form/FormFields.vue2.js +0 -95
- package/components/Form/composables/useFileUpload.d.ts +0 -24
- package/components/Form/composables/useFileUpload.js +0 -40
- package/components/Form/composables/useForm.d.ts +0 -48
- package/components/Form/composables/useForm.js +0 -109
- package/components/Form/index.d.ts +0 -9
- package/components/Form/types.d.ts +0 -167
- package/components/Form/utils/form.utils.d.ts +0 -44
- package/components/Form/utils/form.utils.js +0 -97
- package/components/Heatmap/Heatmap.vue.d.ts +0 -26
- package/components/Heatmap/Heatmap.vue.js +0 -7
- package/components/Heatmap/Heatmap.vue2.js +0 -326
- package/components/Heatmap/index.d.ts +0 -2
- package/components/Heatmap/types.d.ts +0 -66
- package/components/Icon.vue.d.ts +0 -7
- package/components/Icon.vue.js +0 -25
- package/components/Icon.vue2.js +0 -4
- package/components/IconPicker.vue.d.ts +0 -38
- package/components/IconPicker.vue.js +0 -124
- package/components/IconPicker.vue2.js +0 -4
- package/components/Input.vue.d.ts +0 -54
- package/components/Input.vue.js +0 -259
- package/components/Input.vue2.js +0 -4
- package/components/Label.vue.d.ts +0 -23
- package/components/Label.vue.js +0 -23
- package/components/Label.vue2.js +0 -4
- package/components/Logo.vue.d.ts +0 -2
- package/components/Logo.vue.js +0 -10
- package/components/Logo.vue2.js +0 -4
- package/components/Masonry/Masonry.vue.d.ts +0 -31
- package/components/Masonry/Masonry.vue.js +0 -7
- package/components/Masonry/Masonry.vue2.js +0 -83
- package/components/Masonry/index.d.ts +0 -2
- package/components/Masonry/types.d.ts +0 -33
- package/components/Masonry/types.js +0 -10
- package/components/Modal.vue.d.ts +0 -43
- package/components/Modal.vue.js +0 -100
- package/components/Modal.vue2.js +0 -4
- package/components/MultiSelect/MultiSelect.vue.d.ts +0 -40
- package/components/MultiSelect/MultiSelect.vue.js +0 -126
- package/components/MultiSelect/MultiSelect.vue2.js +0 -4
- package/components/MultiSelect/index.d.ts +0 -1
- package/components/Navbar/Navbar.vue.d.ts +0 -50
- package/components/Navbar/Navbar.vue.js +0 -195
- package/components/Navbar/Navbar.vue2.js +0 -4
- package/components/Navbar/NavbarGroup.vue.d.ts +0 -24
- package/components/Navbar/NavbarGroup.vue.js +0 -23
- package/components/Navbar/NavbarGroup.vue2.js +0 -4
- package/components/Navbar/NavbarItem.vue.d.ts +0 -40
- package/components/Navbar/NavbarItem.vue.js +0 -89
- package/components/Navbar/NavbarItem.vue2.js +0 -4
- package/components/Navbar/index.d.ts +0 -3
- package/components/OTPInput/OTPInput.vue.d.ts +0 -33
- package/components/OTPInput/OTPInput.vue.js +0 -115
- package/components/OTPInput/OTPInput.vue2.js +0 -4
- package/components/OTPInput/index.d.ts +0 -1
- package/components/Pagination/Pagination.vue.d.ts +0 -34
- package/components/Pagination/Pagination.vue.js +0 -196
- package/components/Pagination/Pagination.vue2.js +0 -4
- package/components/Pagination/index.d.ts +0 -1
- package/components/PricingPlan/PricingPlan.vue.d.ts +0 -22
- package/components/PricingPlan/PricingPlan.vue.js +0 -55
- package/components/PricingPlan/PricingPlan.vue2.js +0 -4
- package/components/PricingPlan/PricingPlanItem.vue.d.ts +0 -17
- package/components/PricingPlan/PricingPlanItem.vue.js +0 -94
- package/components/PricingPlan/PricingPlanItem.vue2.js +0 -4
- package/components/PricingPlan/index.d.ts +0 -3
- package/components/PricingPlan/types.d.ts +0 -25
- package/components/SidePanel.vue.d.ts +0 -58
- package/components/SidePanel.vue.js +0 -7
- package/components/SidePanel.vue2.js +0 -123
- package/components/SidebarMenu/SidebarMenu.vue.d.ts +0 -9
- package/components/SidebarMenu/SidebarMenu.vue.js +0 -73
- package/components/SidebarMenu/SidebarMenu.vue2.js +0 -4
- package/components/SidebarMenu/SidebarMenuItem.vue.d.ts +0 -9
- package/components/SidebarMenu/SidebarMenuItem.vue.js +0 -7
- package/components/SidebarMenu/SidebarMenuItem.vue2.js +0 -205
- package/components/SidebarMenu/index.d.ts +0 -3
- package/components/SidebarMenu/types.d.ts +0 -52
- package/components/Slider.vue.d.ts +0 -29
- package/components/Slider.vue.js +0 -124
- package/components/Slider.vue2.js +0 -4
- package/components/Switch.vue.d.ts +0 -16
- package/components/Switch.vue.js +0 -40
- package/components/Switch.vue2.js +0 -4
- package/components/Tabes/Tabes.vue.d.ts +0 -21
- package/components/Tabes/Tabes.vue.js +0 -75
- package/components/Tabes/Tabes.vue2.js +0 -4
- package/components/Tabes/index.d.ts +0 -2
- package/components/Tabes/types.d.ts +0 -8
- package/components/Textarea.vue.d.ts +0 -22
- package/components/Textarea.vue.js +0 -34
- package/components/Textarea.vue2.js +0 -4
- package/components/ThemeToggle.vue.d.ts +0 -2
- package/components/ThemeToggle.vue.js +0 -18
- package/components/ThemeToggle.vue2.js +0 -4
- package/components/Timeline.vue.d.ts +0 -39
- package/components/Timeline.vue.js +0 -174
- package/components/Timeline.vue2.js +0 -4
- package/components/ToastNotification.vue.d.ts +0 -7
- package/components/ToastNotification.vue.js +0 -7
- package/components/ToastNotification.vue2.js +0 -162
- package/components/Tooltip.vue.d.ts +0 -25
- package/components/Tooltip.vue.js +0 -39
- package/components/Tooltip.vue2.js +0 -4
- package/components/Workbook/Sheet.vue.d.ts +0 -38
- package/components/Workbook/Sheet.vue.js +0 -141
- package/components/Workbook/Sheet.vue2.js +0 -4
- package/components/Workbook/Workbook.vue.d.ts +0 -54
- package/components/Workbook/Workbook.vue.js +0 -7
- package/components/Workbook/Workbook.vue2.js +0 -146
- package/components/Workbook/WorkbookAddButton.vue.d.ts +0 -6
- package/components/Workbook/WorkbookAddButton.vue.js +0 -20
- package/components/Workbook/WorkbookAddButton.vue2.js +0 -4
- package/components/Workbook/index.d.ts +0 -3
- package/components/Workbook/types.d.ts +0 -34
- package/composables/useKeyStroke.d.ts +0 -21
- package/composables/useKeyStroke.js +0 -93
- package/composables/useNotifications.d.ts +0 -93
- package/composables/useNotifications.js +0 -92
- package/composables/useTheme.d.ts +0 -6
- package/composables/useTheme.js +0 -32
- package/core/config.d.ts +0 -29
- package/core/config.js +0 -12
- package/core/index.d.ts +0 -31
- package/core/index.js +0 -15
- package/directives/vRipple.d.ts +0 -4
- package/directives/vRipple.js +0 -17
- package/index.d.ts +0 -49
- package/index.js +0 -145
- package/style.css +0 -569
- package/types/alert.type.d.ts +0 -10
- package/types/button.d.ts +0 -15
- package/types/buttongroup.type.d.ts +0 -1
- package/types/form.type.d.ts +0 -45
- package/types/index.d.ts +0 -10
- package/types/navbar.type.d.ts +0 -26
- package/types/sidepanel.type.d.ts +0 -13
- package/types/styles.d.ts +0 -28
- package/types/timeline.type.d.ts +0 -9
- package/utils/functions.js +0 -11
- package/utils/index.d.ts +0 -2
- package/utils/object.d.ts +0 -6
- package/utils/object.js +0 -14
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Safdar Azeem
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -63,30 +63,25 @@ vlite3 uses a semantic theming system inspired by **shadcn/ui** and compatible w
|
|
|
63
63
|
|
|
64
64
|
You can customize these colors in your CSS by overriding the variables in `:root` or `.dark` classes (if you are using a class-based dark mode switcher).
|
|
65
65
|
|
|
66
|
-
| Variable | Class Name | Description
|
|
67
|
-
| :------------------------- | :---------------------------- |
|
|
68
|
-
| `--background` | `bg-background` | Default page background
|
|
69
|
-
| `--foreground` | `text-foreground` | Default text color
|
|
70
|
-
| `--card` | `bg-card` | Card background
|
|
71
|
-
| `--
|
|
72
|
-
| `--
|
|
73
|
-
| `--
|
|
74
|
-
| `--
|
|
75
|
-
| `--
|
|
76
|
-
| `--
|
|
77
|
-
| `--
|
|
78
|
-
| `--
|
|
79
|
-
| `--
|
|
80
|
-
| `--
|
|
81
|
-
| `--
|
|
82
|
-
| `--
|
|
83
|
-
| `--
|
|
84
|
-
| `--
|
|
85
|
-
| `--destructive-foreground` | `text-destructive-foreground` | Destructive text color | Text color on destructive backgrounds. |
|
|
86
|
-
| `--border` | `border` | Default border color | Borders for inputs, cards, and dividers. |
|
|
87
|
-
| `--input` | `border-input` | Input border color | Borders specifically for form inputs. |
|
|
88
|
-
| `--ring` | `ring-ring` | Focus ring color | Outline color for focused elements. |
|
|
89
|
-
| `--radius` | `rounded-radius` | Border radius | Global border radius for components. |
|
|
66
|
+
| Variable | Class Name | Description | Recommended Usage |
|
|
67
|
+
| :------------------------- | :---------------------------- | :---------------------- | :-------------------------------------------------------------------------- |
|
|
68
|
+
| `--background` | `bg-background` | Default page background | The main background color of your app. |
|
|
69
|
+
| `--foreground` | `text-foreground` | Default text color | The primary text color for content. |
|
|
70
|
+
| `--card` | `bg-card` | Card background | Little Gray Background for cards, containers, surfece, panels, and dialogs. |
|
|
71
|
+
| `--primary` | `bg-primary` | Primary brand color | Used for main actions (buttons, active states). |
|
|
72
|
+
| `--primary-foreground` | `text-primary-foreground` | Primary text color | Text color for content on top of primary background. |
|
|
73
|
+
| `--secondary` | `bg-secondary` | Secondary background | Used for secondary actions or muted sections. |
|
|
74
|
+
| `--secondary-foreground` | `text-secondary-foreground` | Secondary text color | Text color for content on top of secondary background. |
|
|
75
|
+
| `--muted` | `bg-muted` | Muted background | Subtle backgrounds (e.g., table headers, disabled states). |
|
|
76
|
+
| `--muted-foreground` | `text-muted-foreground` | Muted text color | Secondary text, hints, placeholders. |
|
|
77
|
+
| `--accent` | `bg-accent` | Accent background | Used for hover states, selection highlights. |
|
|
78
|
+
| `--accent-foreground` | `text-accent-foreground` | Accent text color | Text color on accent backgrounds. |
|
|
79
|
+
| `--destructive` | `bg-destructive` | Destructive color | Used for error states and destructive actions. |
|
|
80
|
+
| `--destructive-foreground` | `text-destructive-foreground` | Destructive text color | Text color on destructive backgrounds. |
|
|
81
|
+
| `--border` | `border` | Default border color | Borders for inputs, cards, and dividers. |
|
|
82
|
+
| `--input` | `border-input` | Input border color | Borders specifically for form inputs. |
|
|
83
|
+
| `--ring` | `ring-ring` | Focus ring color | Outline color for focused elements. |
|
|
84
|
+
| `--radius` | `rounded` | Border radius | Global border radius for components. |
|
|
90
85
|
|
|
91
86
|
### Extended Color Variants
|
|
92
87
|
|
|
@@ -197,3 +192,110 @@ To customize the theme, simply override the CSS variables in your main CSS file:
|
|
|
197
192
|
- **ToastNotification**
|
|
198
193
|
- **Tooltip**
|
|
199
194
|
- **Dropdown**
|
|
195
|
+
|
|
196
|
+
## Global Configuration (Registry System)
|
|
197
|
+
|
|
198
|
+
vlite3 features a plugin-based architecture that allows you to register global services. This is particularly useful for dependency injection, such as defining how file uploads should be handled across all `Form` components in your app.
|
|
199
|
+
|
|
200
|
+
### Setting up the Plugin
|
|
201
|
+
|
|
202
|
+
In your `main.ts` or `main.js`, import `createVLite` and register your services:
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
import { createApp } from 'vue'
|
|
206
|
+
import App from './App.vue'
|
|
207
|
+
import { createVLite } from 'vlite3'
|
|
208
|
+
|
|
209
|
+
const app = createApp(App)
|
|
210
|
+
|
|
211
|
+
// Initialize VLite with custom configuration
|
|
212
|
+
const vlite = createVLite({
|
|
213
|
+
services: {
|
|
214
|
+
/**
|
|
215
|
+
* Global File Upload Handler
|
|
216
|
+
*
|
|
217
|
+
* This function will be called automatically by:
|
|
218
|
+
* - useFileUpload() composable
|
|
219
|
+
* - Form components (when using 'file', 'fileUploader', or 'avatarUpload' types)
|
|
220
|
+
*
|
|
221
|
+
* @param file - The File object to upload
|
|
222
|
+
* @param folderId - (Optional) Folder ID passed from component props
|
|
223
|
+
* @returns Promise<string> - The public URL of the uploaded file
|
|
224
|
+
*/
|
|
225
|
+
upload: async (file, folderId) => {
|
|
226
|
+
// Example: Upload to your own backend
|
|
227
|
+
const formData = new FormData()
|
|
228
|
+
formData.append('file', file)
|
|
229
|
+
if (folderId) formData.append('folder_id', folderId)
|
|
230
|
+
|
|
231
|
+
// Replace with your actual API call (e.g., Axios, Fetch)
|
|
232
|
+
const response = await fetch(
|
|
233
|
+
'[https://api.yourdomain.com/v1/upload](https://api.yourdomain.com/v1/upload)',
|
|
234
|
+
{
|
|
235
|
+
method: 'POST',
|
|
236
|
+
body: formData,
|
|
237
|
+
headers: {
|
|
238
|
+
Authorization: 'Bearer ...',
|
|
239
|
+
},
|
|
240
|
+
}
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
if (!response.ok) throw new Error('Upload failed')
|
|
244
|
+
|
|
245
|
+
const data = await response.json()
|
|
246
|
+
return data.url // MUST return the file URL string
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
})
|
|
250
|
+
|
|
251
|
+
app.use(vlite)
|
|
252
|
+
app.mount('#app')
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### How it works
|
|
256
|
+
|
|
257
|
+
Once registered, you don't need to pass upload handlers to individual components.
|
|
258
|
+
|
|
259
|
+
1. **Automatic Injection**: The `Form` component detects input types like `file`, `avatarUpload`, or `fileUploader`.
|
|
260
|
+
2. **Parallel Processing**: When the form is submitted, it automatically uploads all files in **parallel** using your registered `upload` service.
|
|
261
|
+
3. **URL Replacement**: The File objects in your form data are replaced with the returned URLs before the final `onSubmit` event is triggered.
|
|
262
|
+
|
|
263
|
+
## 4. Usage
|
|
264
|
+
|
|
265
|
+
Import components directly in your Vue files:
|
|
266
|
+
|
|
267
|
+
```vue
|
|
268
|
+
<script setup>
|
|
269
|
+
import { Button, Input, Form } from 'vlite3'
|
|
270
|
+
|
|
271
|
+
// The form will automatically use the global upload service defined in main.ts
|
|
272
|
+
const schema = [
|
|
273
|
+
{
|
|
274
|
+
name: 'avatar',
|
|
275
|
+
label: 'Profile Picture',
|
|
276
|
+
type: 'avatarUpload',
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
name: 'documents',
|
|
280
|
+
label: 'Attachments',
|
|
281
|
+
type: 'fileUploader',
|
|
282
|
+
props: { multiple: true },
|
|
283
|
+
},
|
|
284
|
+
]
|
|
285
|
+
|
|
286
|
+
const handleSubmit = (payload) => {
|
|
287
|
+
// payload.values.avatar will be a URL string (e.g., "https://api...")
|
|
288
|
+
// payload.values.documents will be an array of URL strings
|
|
289
|
+
console.log(payload.values)
|
|
290
|
+
}
|
|
291
|
+
</script>
|
|
292
|
+
|
|
293
|
+
<template>
|
|
294
|
+
<div class="p-4 space-y-4">
|
|
295
|
+
<Button>Click Me</Button>
|
|
296
|
+
<Input placeholder="Type here..." />
|
|
297
|
+
|
|
298
|
+
<Form :schema="schema" @onSubmit="handleSubmit" />
|
|
299
|
+
</div>
|
|
300
|
+
</template>
|
|
301
|
+
```
|
package/index.html
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en" cl>
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8" />
|
|
6
|
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
8
|
+
<title>vLite3</title>
|
|
9
|
+
</head>
|
|
10
|
+
|
|
11
|
+
<body>
|
|
12
|
+
<div id="app"></div>
|
|
13
|
+
<script type="module" src="/src/main.ts"></script>
|
|
14
|
+
</body>
|
|
15
|
+
|
|
16
|
+
</html>
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"private": false,
|
|
4
4
|
"description": "A Vue 3 UI component library built with Tailwind CSS.",
|
|
5
5
|
"license": "MIT",
|
|
6
|
-
"version": "0.0
|
|
6
|
+
"version": "0.1.0",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"main": "index.js",
|
|
9
9
|
"module": "index.js",
|
|
@@ -66,4 +66,4 @@
|
|
|
66
66
|
"endOfLine": "auto",
|
|
67
67
|
"bracketSameLine": true
|
|
68
68
|
}
|
|
69
|
-
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
|
|
8
|
+
const distDir = path.resolve(__dirname, '../dist');
|
|
9
|
+
const srcDir = path.resolve(__dirname, '../src/css');
|
|
10
|
+
|
|
11
|
+
// Ensure dist directory exists
|
|
12
|
+
if (!fs.existsSync(distDir)) {
|
|
13
|
+
fs.mkdirSync(distDir, { recursive: true });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Define the order of files to concatenate
|
|
17
|
+
// We recreate the structure of main.css manually but directly embedding content
|
|
18
|
+
// main.css has:
|
|
19
|
+
// @import 'tailwindcss';
|
|
20
|
+
// @layer theme, base, components, utilities;
|
|
21
|
+
|
|
22
|
+
let finalCss = `@import 'tailwindcss';\n@layer theme, base, components, utilities;\n\n`;
|
|
23
|
+
|
|
24
|
+
const filesToRead = ['theme.css', 'base.css', 'input.css'];
|
|
25
|
+
|
|
26
|
+
filesToRead.forEach(file => {
|
|
27
|
+
const filePath = path.join(srcDir, file);
|
|
28
|
+
if (fs.existsSync(filePath)) {
|
|
29
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
30
|
+
finalCss += `/* --- ${file} --- */\n${content}\n\n`;
|
|
31
|
+
} else {
|
|
32
|
+
console.warn(`Warning: ${file} not found at ${filePath}`);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const outputPath = path.join(distDir, 'style.css');
|
|
37
|
+
|
|
38
|
+
if (fs.existsSync(outputPath)) {
|
|
39
|
+
const existingCss = fs.readFileSync(outputPath, 'utf8');
|
|
40
|
+
finalCss += `/* --- Vite Generated CSS --- */\n${existingCss}\n`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
fs.writeFileSync(outputPath, finalCss);
|
|
44
|
+
|
|
45
|
+
console.log(`CSS bundled successfully into ${outputPath}`);
|
package/src/App.vue
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref, watch, computed } from 'vue'
|
|
3
|
+
import type { AccordionProps } from './types'
|
|
4
|
+
import AccordionItem from './AccordionItem.vue'
|
|
5
|
+
|
|
6
|
+
const props = withDefaults(defineProps<AccordionProps>(), {
|
|
7
|
+
allowMultiple: false,
|
|
8
|
+
variant: 'default',
|
|
9
|
+
attached: false,
|
|
10
|
+
items: () => [],
|
|
11
|
+
disabled: false,
|
|
12
|
+
showIndex: false,
|
|
13
|
+
iconVariant: 'simple',
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const emit = defineEmits<{
|
|
17
|
+
(e: 'update:modelValue', value: string | string[]): void
|
|
18
|
+
(e: 'change', value: string | string[]): void
|
|
19
|
+
}>()
|
|
20
|
+
|
|
21
|
+
// Internal state
|
|
22
|
+
const internalValue = ref<string[]>([])
|
|
23
|
+
|
|
24
|
+
const normalizeValue = (val: string | string[] | undefined): string[] => {
|
|
25
|
+
if (Array.isArray(val)) return val
|
|
26
|
+
if (typeof val === 'string' && val) return [val]
|
|
27
|
+
return []
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
watch(
|
|
31
|
+
() => props.modelValue,
|
|
32
|
+
(newVal) => {
|
|
33
|
+
internalValue.value = normalizeValue(newVal)
|
|
34
|
+
},
|
|
35
|
+
{ immediate: true }
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
watch(
|
|
39
|
+
() => props.defaultValue,
|
|
40
|
+
(newVal) => {
|
|
41
|
+
if (!props.modelValue && newVal) {
|
|
42
|
+
internalValue.value = normalizeValue(newVal)
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
{ immediate: true }
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
const toggleItem = (id: string) => {
|
|
49
|
+
if (props.disabled) return
|
|
50
|
+
|
|
51
|
+
const isOpen = internalValue.value.includes(id)
|
|
52
|
+
|
|
53
|
+
if (props.allowMultiple) {
|
|
54
|
+
if (isOpen) {
|
|
55
|
+
internalValue.value = internalValue.value.filter((v) => v !== id)
|
|
56
|
+
} else {
|
|
57
|
+
internalValue.value = [...internalValue.value, id]
|
|
58
|
+
}
|
|
59
|
+
} else {
|
|
60
|
+
// Single mode
|
|
61
|
+
if (isOpen) {
|
|
62
|
+
internalValue.value = [] // Toggle off if clicking same
|
|
63
|
+
} else {
|
|
64
|
+
internalValue.value = [id]
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
emitChange()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const emitChange = () => {
|
|
72
|
+
const val = props.allowMultiple ? internalValue.value : internalValue.value[0] || ''
|
|
73
|
+
emit('update:modelValue', val)
|
|
74
|
+
emit('change', val)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const rootClasses = computed(() => {
|
|
78
|
+
const classes = ['w-full', props.class]
|
|
79
|
+
|
|
80
|
+
if (props.attached) {
|
|
81
|
+
// classes.push('rounded-lg overflow-hidden') -> Managed by Items for cleaner edges if separated logic used
|
|
82
|
+
// But for attached, usually the container clips.
|
|
83
|
+
classes.push('rounded-lg overflow-hidden')
|
|
84
|
+
|
|
85
|
+
// Add border to container if it's outline or default attached
|
|
86
|
+
// Solid usually doesn't have a container border if items are solid blocks?
|
|
87
|
+
// But if attached list, yes.
|
|
88
|
+
if (props.variant === 'outline' || props.variant === 'default') {
|
|
89
|
+
classes.push('border')
|
|
90
|
+
}
|
|
91
|
+
if (props.variant === 'solid') {
|
|
92
|
+
// If solid attached, usually no border or just internal dividers?
|
|
93
|
+
// Let's add border to keep it contained.
|
|
94
|
+
classes.push('border')
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return classes.join(' ')
|
|
99
|
+
})
|
|
100
|
+
</script>
|
|
101
|
+
|
|
102
|
+
<template>
|
|
103
|
+
<div :class="rootClasses">
|
|
104
|
+
<slot>
|
|
105
|
+
<template v-for="(item, index) in items" :key="item.id">
|
|
106
|
+
<AccordionItem
|
|
107
|
+
:item="item"
|
|
108
|
+
:isOpen="internalValue.includes(item.id)"
|
|
109
|
+
:variant="variant"
|
|
110
|
+
:attached="attached"
|
|
111
|
+
:disabled="disabled"
|
|
112
|
+
:index="index + 1"
|
|
113
|
+
:showIndex="showIndex"
|
|
114
|
+
:openIcon="openIcon"
|
|
115
|
+
:closeIcon="closeIcon"
|
|
116
|
+
:iconVariant="iconVariant"
|
|
117
|
+
:activeIconVariant="activeIconVariant"
|
|
118
|
+
:triggerClass="triggerClass"
|
|
119
|
+
:contentClass="contentClass"
|
|
120
|
+
:itemClass="itemClass"
|
|
121
|
+
@toggle="toggleItem">
|
|
122
|
+
<!-- Pass Slots Down -->
|
|
123
|
+
<template v-if="$slots.trigger" #trigger="{ item, open, toggle, triggerClass }">
|
|
124
|
+
<slot
|
|
125
|
+
name="trigger"
|
|
126
|
+
:item="item"
|
|
127
|
+
:open="open"
|
|
128
|
+
:toggle="toggle"
|
|
129
|
+
:triggerClass="triggerClass" />
|
|
130
|
+
</template>
|
|
131
|
+
|
|
132
|
+
<template v-if="$slots.content" #content="{ item }">
|
|
133
|
+
<slot name="content" :close="toggleItem" :item="item" />
|
|
134
|
+
</template>
|
|
135
|
+
</AccordionItem>
|
|
136
|
+
</template>
|
|
137
|
+
</slot>
|
|
138
|
+
</div>
|
|
139
|
+
</template>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, inject } from 'vue'
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
class?: string
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
9
|
+
class: '',
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
// In simple implementations, the open state is checked in the parent Item or here.
|
|
13
|
+
// But mostly the Item decides if Content is rendered or if it is v-show.
|
|
14
|
+
// For smooth animation on v-if/v-show, we need a Transition.
|
|
15
|
+
|
|
16
|
+
const beforeEnter = (el: Element) => {
|
|
17
|
+
const element = el as HTMLElement
|
|
18
|
+
element.style.height = '0'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const enter = (el: Element) => {
|
|
22
|
+
const element = el as HTMLElement
|
|
23
|
+
element.style.height = element.scrollHeight + 'px'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const afterEnter = (el: Element) => {
|
|
27
|
+
const element = el as HTMLElement
|
|
28
|
+
element.style.height = 'auto'
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const beforeLeave = (el: Element) => {
|
|
32
|
+
const element = el as HTMLElement
|
|
33
|
+
element.style.height = element.scrollHeight + 'px'
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const leave = (el: Element) => {
|
|
37
|
+
const element = el as HTMLElement
|
|
38
|
+
element.style.height = '0'
|
|
39
|
+
}
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<template>
|
|
43
|
+
<Transition
|
|
44
|
+
name="accordion"
|
|
45
|
+
@before-enter="beforeEnter"
|
|
46
|
+
@enter="enter"
|
|
47
|
+
@after-enter="afterEnter"
|
|
48
|
+
@before-leave="beforeLeave"
|
|
49
|
+
@leave="leave">
|
|
50
|
+
<div class="overflow-hidden text-sm transition-all duration-300 ease-in-out">
|
|
51
|
+
<div :class="['pb-4', props.class]">
|
|
52
|
+
<slot />
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</Transition>
|
|
56
|
+
</template>
|
|
57
|
+
|
|
58
|
+
<style scoped>
|
|
59
|
+
.accordion-enter-active,
|
|
60
|
+
.accordion-leave-active {
|
|
61
|
+
transition: height 0.3s ease-in-out;
|
|
62
|
+
}
|
|
63
|
+
</style>
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import type { AccordionItemSchema, AccordionVariant } from './types'
|
|
4
|
+
import AccordionTrigger from './AccordionTrigger.vue'
|
|
5
|
+
import AccordionContent from './AccordionContent.vue'
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
item: AccordionItemSchema
|
|
9
|
+
isOpen: boolean
|
|
10
|
+
variant?: AccordionVariant
|
|
11
|
+
attached?: boolean
|
|
12
|
+
disabled?: boolean
|
|
13
|
+
index?: number
|
|
14
|
+
showIndex?: boolean
|
|
15
|
+
openIcon?: string
|
|
16
|
+
closeIcon?: string
|
|
17
|
+
iconVariant?: 'simple' | 'solid' | 'outline' | 'primary' | 'ghost'
|
|
18
|
+
activeIconVariant?: 'simple' | 'solid' | 'outline' | 'primary' | 'ghost'
|
|
19
|
+
|
|
20
|
+
// Classes
|
|
21
|
+
triggerClass?: string
|
|
22
|
+
contentClass?: string
|
|
23
|
+
itemClass?: string
|
|
24
|
+
class?: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
28
|
+
variant: 'default',
|
|
29
|
+
attached: false,
|
|
30
|
+
disabled: false,
|
|
31
|
+
class: '',
|
|
32
|
+
showIndex: false,
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
const emit = defineEmits<{
|
|
36
|
+
(e: 'toggle', id: string): void
|
|
37
|
+
}>()
|
|
38
|
+
|
|
39
|
+
const handleToggle = () => {
|
|
40
|
+
if (props.item.disabled || props.disabled) return
|
|
41
|
+
emit('toggle', props.item.id)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Styling based on variant
|
|
45
|
+
const containerClass = computed(() => {
|
|
46
|
+
const { variant, attached } = props
|
|
47
|
+
|
|
48
|
+
if (attached) {
|
|
49
|
+
// ATTACHED MODE (List Group)
|
|
50
|
+
const baseAttached = 'transition-all first:rounded-t-lg last:rounded-b-lg'
|
|
51
|
+
let borderClass = 'border-b last:border-0'
|
|
52
|
+
|
|
53
|
+
if (variant === 'default' || variant === 'outline') {
|
|
54
|
+
// Outline in attached usually means the Container (Accordion) has the border, items just have separators.
|
|
55
|
+
return `${baseAttached} ${borderClass}`
|
|
56
|
+
}
|
|
57
|
+
if (variant === 'solid') {
|
|
58
|
+
// Solid attached: items might alternate or just be list.
|
|
59
|
+
return `border-b last:border-0 bg-transparent`
|
|
60
|
+
}
|
|
61
|
+
if (variant === 'ghost') {
|
|
62
|
+
return 'bg-transparent border-b last:border-0'
|
|
63
|
+
}
|
|
64
|
+
return `${baseAttached} ${borderClass}`
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// DETACHED MODE (Cards)
|
|
68
|
+
// 'solid': Container has border (outline) but no background, content needs to be inside.
|
|
69
|
+
if (variant === 'solid') {
|
|
70
|
+
return 'mb-2 border rounded-lg overflow-hidden transition-all duration-200'
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// 'outline': Item has border.
|
|
74
|
+
if (variant === 'outline') return 'border mb-2 rounded-lg overflow-hidden'
|
|
75
|
+
|
|
76
|
+
// 'separated': distinct cards style
|
|
77
|
+
if (variant === 'separated') return 'border mb-4 rounded-lg overflow-hidden'
|
|
78
|
+
|
|
79
|
+
if (variant === 'ghost') return 'border-none bg-transparent mb-1'
|
|
80
|
+
|
|
81
|
+
// Default Detached (Underline style usually)
|
|
82
|
+
return 'border-b'
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
// Specific Trigger Styling Logic
|
|
86
|
+
const computedTriggerClass = computed(() => {
|
|
87
|
+
const { variant, attached, isOpen } = props
|
|
88
|
+
const base = props.triggerClass || ''
|
|
89
|
+
|
|
90
|
+
// Solid Variant: Trigger gets the background
|
|
91
|
+
if (variant === 'solid') {
|
|
92
|
+
return `${base} px-4 bg-muted transition-colors`
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Default/Ghost in detached: no padding usually?
|
|
96
|
+
if (!attached && (variant === 'ghost' || variant === 'default')) {
|
|
97
|
+
return `${base} px-0 hover:no-underline` // ensure no unwanted hover bg
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Outline/Separated/Attached: usually need padding styling inside the border
|
|
101
|
+
return `${base} px-4 hover:bg-accent`
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
const computedContentClass = computed(() => {
|
|
105
|
+
const { variant, attached } = props
|
|
106
|
+
const base = props.contentClass || ''
|
|
107
|
+
|
|
108
|
+
if (variant === 'solid') {
|
|
109
|
+
return `${base} px-4 pt-4`
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (!attached && (variant === 'ghost' || variant === 'default')) {
|
|
113
|
+
return `${base} px-0`
|
|
114
|
+
}
|
|
115
|
+
return `${base} px-4`
|
|
116
|
+
})
|
|
117
|
+
</script>
|
|
118
|
+
|
|
119
|
+
<template>
|
|
120
|
+
<div :class="[containerClass, props.class, props.itemClass]">
|
|
121
|
+
<slot
|
|
122
|
+
name="trigger"
|
|
123
|
+
:item="item"
|
|
124
|
+
:open="isOpen"
|
|
125
|
+
:toggle="handleToggle"
|
|
126
|
+
:triggerClass="computedTriggerClass">
|
|
127
|
+
<AccordionTrigger
|
|
128
|
+
:open="isOpen"
|
|
129
|
+
:disabled="item.disabled || disabled"
|
|
130
|
+
:icon="item.icon"
|
|
131
|
+
:index="index"
|
|
132
|
+
:showIndex="showIndex"
|
|
133
|
+
:open-icon="openIcon"
|
|
134
|
+
:close-icon="closeIcon"
|
|
135
|
+
:icon-variant="iconVariant"
|
|
136
|
+
:active-icon-variant="activeIconVariant"
|
|
137
|
+
:class="computedTriggerClass"
|
|
138
|
+
@click="handleToggle">
|
|
139
|
+
<span>
|
|
140
|
+
{{ item.title }}
|
|
141
|
+
</span>
|
|
142
|
+
|
|
143
|
+
<span v-if="item.description" class="ml-2 text-sm text-muted-foreground font-normal">
|
|
144
|
+
{{ item.description }}
|
|
145
|
+
</span>
|
|
146
|
+
</AccordionTrigger>
|
|
147
|
+
</slot>
|
|
148
|
+
|
|
149
|
+
<AccordionContent v-show="isOpen" :class="computedContentClass">
|
|
150
|
+
<slot name="content" :item="item" :close="handleToggle">
|
|
151
|
+
<component
|
|
152
|
+
v-if="item.bodyComponent"
|
|
153
|
+
:is="item.bodyComponent"
|
|
154
|
+
:item="item"
|
|
155
|
+
:close="handleToggle" />
|
|
156
|
+
<div
|
|
157
|
+
v-else-if="item.content"
|
|
158
|
+
class="text-muted-foreground leading-relaxed"
|
|
159
|
+
v-html="item.content"></div>
|
|
160
|
+
</slot>
|
|
161
|
+
</AccordionContent>
|
|
162
|
+
</div>
|
|
163
|
+
</template>
|