@j-solution/components 1.0.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/LICENSE +22 -0
- package/README.md +130 -0
- package/UPDATE_GUIDE.md +441 -0
- package/USAGE_GUIDE.md +748 -0
- package/assets/images/README.md +18 -0
- package/assets/images/logo-fallback.png +0 -0
- package/assets/images/logo-fallback.png.README +14 -0
- package/assets/images/logo-fallback.png.cjs +2 -0
- package/assets/images/logo-fallback.png.cjs.map +1 -0
- package/assets/images/logo-fallback.png.js +5 -0
- package/assets/images/logo-fallback.png.js.map +1 -0
- package/assets/jwms-portal-frontend-DjoLgoaO.css +1 -0
- package/assets/styles/j-components.css +1 -0
- package/assets/styles/themes.css +337 -0
- package/assets/vue.svg +1 -0
- package/components/atoms/JAvatar.vue.cjs +2 -0
- package/components/atoms/JAvatar.vue.cjs.map +1 -0
- package/components/atoms/JAvatar.vue.js +94 -0
- package/components/atoms/JAvatar.vue.js.map +1 -0
- package/components/atoms/JAvatar.vue2.cjs +2 -0
- package/components/atoms/JAvatar.vue2.cjs.map +1 -0
- package/components/atoms/JAvatar.vue2.js +5 -0
- package/components/atoms/JAvatar.vue2.js.map +1 -0
- package/components/atoms/JBadge.vue.cjs +2 -0
- package/components/atoms/JBadge.vue.cjs.map +1 -0
- package/components/atoms/JBadge.vue.js +61 -0
- package/components/atoms/JBadge.vue.js.map +1 -0
- package/components/atoms/JBadge.vue2.cjs +2 -0
- package/components/atoms/JBadge.vue2.cjs.map +1 -0
- package/components/atoms/JBadge.vue2.js +5 -0
- package/components/atoms/JBadge.vue2.js.map +1 -0
- package/components/atoms/JButton.vue.cjs +2 -0
- package/components/atoms/JButton.vue.cjs.map +1 -0
- package/components/atoms/JButton.vue.js +88 -0
- package/components/atoms/JButton.vue.js.map +1 -0
- package/components/atoms/JButton.vue2.cjs +2 -0
- package/components/atoms/JButton.vue2.cjs.map +1 -0
- package/components/atoms/JButton.vue2.js +5 -0
- package/components/atoms/JButton.vue2.js.map +1 -0
- package/components/atoms/JCheckbox.vue.cjs +2 -0
- package/components/atoms/JCheckbox.vue.cjs.map +1 -0
- package/components/atoms/JCheckbox.vue.js +62 -0
- package/components/atoms/JCheckbox.vue.js.map +1 -0
- package/components/atoms/JCheckbox.vue2.cjs +2 -0
- package/components/atoms/JCheckbox.vue2.cjs.map +1 -0
- package/components/atoms/JCheckbox.vue2.js +5 -0
- package/components/atoms/JCheckbox.vue2.js.map +1 -0
- package/components/atoms/JCombo.vue.cjs +2 -0
- package/components/atoms/JCombo.vue.cjs.map +1 -0
- package/components/atoms/JCombo.vue.js +88 -0
- package/components/atoms/JCombo.vue.js.map +1 -0
- package/components/atoms/JCombo.vue2.cjs +2 -0
- package/components/atoms/JCombo.vue2.cjs.map +1 -0
- package/components/atoms/JCombo.vue2.js +5 -0
- package/components/atoms/JCombo.vue2.js.map +1 -0
- package/components/atoms/JDatepicker.vue.cjs +2 -0
- package/components/atoms/JDatepicker.vue.cjs.map +1 -0
- package/components/atoms/JDatepicker.vue.js +120 -0
- package/components/atoms/JDatepicker.vue.js.map +1 -0
- package/components/atoms/JDatepicker.vue2.cjs +2 -0
- package/components/atoms/JDatepicker.vue2.cjs.map +1 -0
- package/components/atoms/JDatepicker.vue2.js +5 -0
- package/components/atoms/JDatepicker.vue2.js.map +1 -0
- package/components/atoms/JDivider.vue.cjs +2 -0
- package/components/atoms/JDivider.vue.cjs.map +1 -0
- package/components/atoms/JDivider.vue.js +32 -0
- package/components/atoms/JDivider.vue.js.map +1 -0
- package/components/atoms/JDivider.vue2.cjs +2 -0
- package/components/atoms/JDivider.vue2.cjs.map +1 -0
- package/components/atoms/JDivider.vue2.js +5 -0
- package/components/atoms/JDivider.vue2.js.map +1 -0
- package/components/atoms/JGrid.vue.cjs +7 -0
- package/components/atoms/JGrid.vue.cjs.map +1 -0
- package/components/atoms/JGrid.vue.js +13 -0
- package/components/atoms/JGrid.vue.js.map +1 -0
- package/components/atoms/JGrid.vue2.cjs +2 -0
- package/components/atoms/JGrid.vue2.cjs.map +1 -0
- package/components/atoms/JGrid.vue2.js +107 -0
- package/components/atoms/JGrid.vue2.js.map +1 -0
- package/components/atoms/JIcon.vue.cjs +2 -0
- package/components/atoms/JIcon.vue.cjs.map +1 -0
- package/components/atoms/JIcon.vue.js +192 -0
- package/components/atoms/JIcon.vue.js.map +1 -0
- package/components/atoms/JIcon.vue2.cjs +2 -0
- package/components/atoms/JIcon.vue2.cjs.map +1 -0
- package/components/atoms/JIcon.vue2.js +5 -0
- package/components/atoms/JIcon.vue2.js.map +1 -0
- package/components/atoms/JImage.vue.cjs +2 -0
- package/components/atoms/JImage.vue.cjs.map +1 -0
- package/components/atoms/JImage.vue.js +79 -0
- package/components/atoms/JImage.vue.js.map +1 -0
- package/components/atoms/JImage.vue2.cjs +2 -0
- package/components/atoms/JImage.vue2.cjs.map +1 -0
- package/components/atoms/JImage.vue2.js +5 -0
- package/components/atoms/JImage.vue2.js.map +1 -0
- package/components/atoms/JInput.vue.cjs +2 -0
- package/components/atoms/JInput.vue.cjs.map +1 -0
- package/components/atoms/JInput.vue.js +68 -0
- package/components/atoms/JInput.vue.js.map +1 -0
- package/components/atoms/JInput.vue2.cjs +2 -0
- package/components/atoms/JInput.vue2.cjs.map +1 -0
- package/components/atoms/JInput.vue2.js +5 -0
- package/components/atoms/JInput.vue2.js.map +1 -0
- package/components/atoms/JKbd.vue.cjs +2 -0
- package/components/atoms/JKbd.vue.cjs.map +1 -0
- package/components/atoms/JKbd.vue.js +52 -0
- package/components/atoms/JKbd.vue.js.map +1 -0
- package/components/atoms/JKbd.vue2.cjs +2 -0
- package/components/atoms/JKbd.vue2.cjs.map +1 -0
- package/components/atoms/JKbd.vue2.js +5 -0
- package/components/atoms/JKbd.vue2.js.map +1 -0
- package/components/atoms/JLabel.vue.cjs +2 -0
- package/components/atoms/JLabel.vue.cjs.map +1 -0
- package/components/atoms/JLabel.vue.js +67 -0
- package/components/atoms/JLabel.vue.js.map +1 -0
- package/components/atoms/JLabel.vue2.cjs +2 -0
- package/components/atoms/JLabel.vue2.cjs.map +1 -0
- package/components/atoms/JLabel.vue2.js +5 -0
- package/components/atoms/JLabel.vue2.js.map +1 -0
- package/components/atoms/JLink.vue.cjs +2 -0
- package/components/atoms/JLink.vue.cjs.map +1 -0
- package/components/atoms/JLink.vue.js +51 -0
- package/components/atoms/JLink.vue.js.map +1 -0
- package/components/atoms/JLink.vue2.cjs +2 -0
- package/components/atoms/JLink.vue2.cjs.map +1 -0
- package/components/atoms/JLink.vue2.js +5 -0
- package/components/atoms/JLink.vue2.js.map +1 -0
- package/components/atoms/JPopover.vue.cjs +2 -0
- package/components/atoms/JPopover.vue.cjs.map +1 -0
- package/components/atoms/JPopover.vue.js +100 -0
- package/components/atoms/JPopover.vue.js.map +1 -0
- package/components/atoms/JPopover.vue2.cjs +2 -0
- package/components/atoms/JPopover.vue2.cjs.map +1 -0
- package/components/atoms/JPopover.vue2.js +5 -0
- package/components/atoms/JPopover.vue2.js.map +1 -0
- package/components/atoms/JProgress.vue.cjs +2 -0
- package/components/atoms/JProgress.vue.cjs.map +1 -0
- package/components/atoms/JProgress.vue.js +189 -0
- package/components/atoms/JProgress.vue.js.map +1 -0
- package/components/atoms/JProgress.vue3.cjs +2 -0
- package/components/atoms/JProgress.vue3.cjs.map +1 -0
- package/components/atoms/JProgress.vue3.js +6 -0
- package/components/atoms/JProgress.vue3.js.map +1 -0
- package/components/atoms/JRadio.vue.cjs +2 -0
- package/components/atoms/JRadio.vue.cjs.map +1 -0
- package/components/atoms/JRadio.vue.js +94 -0
- package/components/atoms/JRadio.vue.js.map +1 -0
- package/components/atoms/JRadio.vue2.cjs +2 -0
- package/components/atoms/JRadio.vue2.cjs.map +1 -0
- package/components/atoms/JRadio.vue2.js +5 -0
- package/components/atoms/JRadio.vue2.js.map +1 -0
- package/components/atoms/JSearchCombo.vue.cjs +2 -0
- package/components/atoms/JSearchCombo.vue.cjs.map +1 -0
- package/components/atoms/JSearchCombo.vue.js +146 -0
- package/components/atoms/JSearchCombo.vue.js.map +1 -0
- package/components/atoms/JSearchCombo.vue2.cjs +2 -0
- package/components/atoms/JSearchCombo.vue2.cjs.map +1 -0
- package/components/atoms/JSearchCombo.vue2.js +5 -0
- package/components/atoms/JSearchCombo.vue2.js.map +1 -0
- package/components/atoms/JSpinner.vue.cjs +2 -0
- package/components/atoms/JSpinner.vue.cjs.map +1 -0
- package/components/atoms/JSpinner.vue.js +65 -0
- package/components/atoms/JSpinner.vue.js.map +1 -0
- package/components/atoms/JSpinner.vue2.cjs +2 -0
- package/components/atoms/JSpinner.vue2.cjs.map +1 -0
- package/components/atoms/JSpinner.vue2.js +5 -0
- package/components/atoms/JSpinner.vue2.js.map +1 -0
- package/components/atoms/JSwitch.vue.cjs +2 -0
- package/components/atoms/JSwitch.vue.cjs.map +1 -0
- package/components/atoms/JSwitch.vue.js +60 -0
- package/components/atoms/JSwitch.vue.js.map +1 -0
- package/components/atoms/JSwitch.vue2.cjs +2 -0
- package/components/atoms/JSwitch.vue2.cjs.map +1 -0
- package/components/atoms/JSwitch.vue2.js +5 -0
- package/components/atoms/JSwitch.vue2.js.map +1 -0
- package/components/atoms/JTextarea.vue.cjs +2 -0
- package/components/atoms/JTextarea.vue.cjs.map +1 -0
- package/components/atoms/JTextarea.vue.js +66 -0
- package/components/atoms/JTextarea.vue.js.map +1 -0
- package/components/atoms/JTextarea.vue2.cjs +2 -0
- package/components/atoms/JTextarea.vue2.cjs.map +1 -0
- package/components/atoms/JTextarea.vue2.js +5 -0
- package/components/atoms/JTextarea.vue2.js.map +1 -0
- package/components/atoms/JTooltip.vue.cjs +2 -0
- package/components/atoms/JTooltip.vue.cjs.map +1 -0
- package/components/atoms/JTooltip.vue.js +130 -0
- package/components/atoms/JTooltip.vue.js.map +1 -0
- package/components/atoms/JTooltip.vue2.cjs +2 -0
- package/components/atoms/JTooltip.vue2.cjs.map +1 -0
- package/components/atoms/JTooltip.vue2.js +5 -0
- package/components/atoms/JTooltip.vue2.js.map +1 -0
- package/components/molecules/JAccordion.vue.cjs +2 -0
- package/components/molecules/JAccordion.vue.cjs.map +1 -0
- package/components/molecules/JAccordion.vue.js +61 -0
- package/components/molecules/JAccordion.vue.js.map +1 -0
- package/components/molecules/JAccordion.vue2.cjs +2 -0
- package/components/molecules/JAccordion.vue2.cjs.map +1 -0
- package/components/molecules/JAccordion.vue2.js +5 -0
- package/components/molecules/JAccordion.vue2.js.map +1 -0
- package/components/molecules/JAlert.vue.cjs +2 -0
- package/components/molecules/JAlert.vue.cjs.map +1 -0
- package/components/molecules/JAlert.vue.js +84 -0
- package/components/molecules/JAlert.vue.js.map +1 -0
- package/components/molecules/JAlert.vue2.cjs +2 -0
- package/components/molecules/JAlert.vue2.cjs.map +1 -0
- package/components/molecules/JAlert.vue2.js +5 -0
- package/components/molecules/JAlert.vue2.js.map +1 -0
- package/components/molecules/JBreadcrumb.vue.cjs +2 -0
- package/components/molecules/JBreadcrumb.vue.cjs.map +1 -0
- package/components/molecules/JBreadcrumb.vue.js +87 -0
- package/components/molecules/JBreadcrumb.vue.js.map +1 -0
- package/components/molecules/JBreadcrumb.vue2.cjs +2 -0
- package/components/molecules/JBreadcrumb.vue2.cjs.map +1 -0
- package/components/molecules/JBreadcrumb.vue2.js +5 -0
- package/components/molecules/JBreadcrumb.vue2.js.map +1 -0
- package/components/molecules/JButtonGroup.vue.cjs +2 -0
- package/components/molecules/JButtonGroup.vue.cjs.map +1 -0
- package/components/molecules/JButtonGroup.vue.js +58 -0
- package/components/molecules/JButtonGroup.vue.js.map +1 -0
- package/components/molecules/JButtonGroup.vue2.cjs +2 -0
- package/components/molecules/JButtonGroup.vue2.cjs.map +1 -0
- package/components/molecules/JButtonGroup.vue2.js +5 -0
- package/components/molecules/JButtonGroup.vue2.js.map +1 -0
- package/components/molecules/JCard.vue.cjs +2 -0
- package/components/molecules/JCard.vue.cjs.map +1 -0
- package/components/molecules/JCard.vue.js +61 -0
- package/components/molecules/JCard.vue.js.map +1 -0
- package/components/molecules/JCard.vue2.cjs +2 -0
- package/components/molecules/JCard.vue2.cjs.map +1 -0
- package/components/molecules/JCard.vue2.js +5 -0
- package/components/molecules/JCard.vue2.js.map +1 -0
- package/components/molecules/JContextMenu.vue.cjs +7 -0
- package/components/molecules/JContextMenu.vue.cjs.map +1 -0
- package/components/molecules/JContextMenu.vue.js +13 -0
- package/components/molecules/JContextMenu.vue.js.map +1 -0
- package/components/molecules/JContextMenu.vue2.cjs +2 -0
- package/components/molecules/JContextMenu.vue2.cjs.map +1 -0
- package/components/molecules/JContextMenu.vue2.js +138 -0
- package/components/molecules/JContextMenu.vue2.js.map +1 -0
- package/components/molecules/JFormField.vue.cjs +2 -0
- package/components/molecules/JFormField.vue.cjs.map +1 -0
- package/components/molecules/JFormField.vue.js +259 -0
- package/components/molecules/JFormField.vue.js.map +1 -0
- package/components/molecules/JFormField.vue3.cjs +2 -0
- package/components/molecules/JFormField.vue3.cjs.map +1 -0
- package/components/molecules/JFormField.vue3.js +6 -0
- package/components/molecules/JFormField.vue3.js.map +1 -0
- package/components/molecules/JGroupCombo.vue.cjs +2 -0
- package/components/molecules/JGroupCombo.vue.cjs.map +1 -0
- package/components/molecules/JGroupCombo.vue.js +102 -0
- package/components/molecules/JGroupCombo.vue.js.map +1 -0
- package/components/molecules/JGroupCombo.vue2.cjs +2 -0
- package/components/molecules/JGroupCombo.vue2.cjs.map +1 -0
- package/components/molecules/JGroupCombo.vue2.js +5 -0
- package/components/molecules/JGroupCombo.vue2.js.map +1 -0
- package/components/molecules/JSearchAddr.vue.cjs +7 -0
- package/components/molecules/JSearchAddr.vue.cjs.map +1 -0
- package/components/molecules/JSearchAddr.vue.js +13 -0
- package/components/molecules/JSearchAddr.vue.js.map +1 -0
- package/components/molecules/JSearchAddr.vue2.cjs +2 -0
- package/components/molecules/JSearchAddr.vue2.cjs.map +1 -0
- package/components/molecules/JSearchAddr.vue2.js +171 -0
- package/components/molecules/JSearchAddr.vue2.js.map +1 -0
- package/components/molecules/JTabs.vue.cjs +7 -0
- package/components/molecules/JTabs.vue.cjs.map +1 -0
- package/components/molecules/JTabs.vue.js +13 -0
- package/components/molecules/JTabs.vue.js.map +1 -0
- package/components/molecules/JTabs.vue2.cjs +2 -0
- package/components/molecules/JTabs.vue2.cjs.map +1 -0
- package/components/molecules/JTabs.vue2.js +130 -0
- package/components/molecules/JTabs.vue2.js.map +1 -0
- package/components/molecules/JTitlebar.vue.cjs +2 -0
- package/components/molecules/JTitlebar.vue.cjs.map +1 -0
- package/components/molecules/JTitlebar.vue.js +144 -0
- package/components/molecules/JTitlebar.vue.js.map +1 -0
- package/components/molecules/JTitlebar.vue2.cjs +2 -0
- package/components/molecules/JTitlebar.vue2.cjs.map +1 -0
- package/components/molecules/JTitlebar.vue2.js +5 -0
- package/components/molecules/JTitlebar.vue2.js.map +1 -0
- package/components/organisms/JDynamicForm.vue.cjs +7 -0
- package/components/organisms/JDynamicForm.vue.cjs.map +1 -0
- package/components/organisms/JDynamicForm.vue.js +13 -0
- package/components/organisms/JDynamicForm.vue.js.map +1 -0
- package/components/organisms/JDynamicForm.vue2.cjs +2 -0
- package/components/organisms/JDynamicForm.vue2.cjs.map +1 -0
- package/components/organisms/JDynamicForm.vue2.js +401 -0
- package/components/organisms/JDynamicForm.vue2.js.map +1 -0
- package/components/organisms/JDynamicTabs.vue.cjs +2 -0
- package/components/organisms/JDynamicTabs.vue.cjs.map +1 -0
- package/components/organisms/JDynamicTabs.vue.js +116 -0
- package/components/organisms/JDynamicTabs.vue.js.map +1 -0
- package/components/organisms/JDynamicTabs.vue2.cjs +2 -0
- package/components/organisms/JDynamicTabs.vue2.cjs.map +1 -0
- package/components/organisms/JDynamicTabs.vue2.js +5 -0
- package/components/organisms/JDynamicTabs.vue2.js.map +1 -0
- package/components/organisms/JFormModal.vue.cjs +2 -0
- package/components/organisms/JFormModal.vue.cjs.map +1 -0
- package/components/organisms/JFormModal.vue.js +175 -0
- package/components/organisms/JFormModal.vue.js.map +1 -0
- package/components/organisms/JFormModal.vue2.cjs +2 -0
- package/components/organisms/JFormModal.vue2.cjs.map +1 -0
- package/components/organisms/JFormModal.vue2.js +5 -0
- package/components/organisms/JFormModal.vue2.js.map +1 -0
- package/components/organisms/JHeader.vue.cjs +2 -0
- package/components/organisms/JHeader.vue.cjs.map +1 -0
- package/components/organisms/JHeader.vue.js +450 -0
- package/components/organisms/JHeader.vue.js.map +1 -0
- package/components/organisms/JHeader.vue2.cjs +2 -0
- package/components/organisms/JHeader.vue2.cjs.map +1 -0
- package/components/organisms/JHeader.vue2.js +5 -0
- package/components/organisms/JHeader.vue2.js.map +1 -0
- package/components/organisms/JModal.vue.cjs +2 -0
- package/components/organisms/JModal.vue.cjs.map +1 -0
- package/components/organisms/JModal.vue.js +170 -0
- package/components/organisms/JModal.vue.js.map +1 -0
- package/components/organisms/JModal.vue2.cjs +2 -0
- package/components/organisms/JModal.vue2.cjs.map +1 -0
- package/components/organisms/JModal.vue2.js +5 -0
- package/components/organisms/JModal.vue2.js.map +1 -0
- package/components/organisms/JPageContainer.vue.cjs +2 -0
- package/components/organisms/JPageContainer.vue.cjs.map +1 -0
- package/components/organisms/JPageContainer.vue.js +72 -0
- package/components/organisms/JPageContainer.vue.js.map +1 -0
- package/components/organisms/JPageContainer.vue2.cjs +2 -0
- package/components/organisms/JPageContainer.vue2.cjs.map +1 -0
- package/components/organisms/JPageContainer.vue2.js +5 -0
- package/components/organisms/JPageContainer.vue2.js.map +1 -0
- package/components/organisms/JSearchPanel.vue.cjs +7 -0
- package/components/organisms/JSearchPanel.vue.cjs.map +1 -0
- package/components/organisms/JSearchPanel.vue.js +13 -0
- package/components/organisms/JSearchPanel.vue.js.map +1 -0
- package/components/organisms/JSearchPanel.vue2.cjs +2 -0
- package/components/organisms/JSearchPanel.vue2.cjs.map +1 -0
- package/components/organisms/JSearchPanel.vue2.js +180 -0
- package/components/organisms/JSearchPanel.vue2.js.map +1 -0
- package/components/organisms/JSidebarAdvanced.vue.cjs +7 -0
- package/components/organisms/JSidebarAdvanced.vue.cjs.map +1 -0
- package/components/organisms/JSidebarAdvanced.vue.js +13 -0
- package/components/organisms/JSidebarAdvanced.vue.js.map +1 -0
- package/components/organisms/JSidebarAdvanced.vue2.cjs +2 -0
- package/components/organisms/JSidebarAdvanced.vue2.cjs.map +1 -0
- package/components/organisms/JSidebarAdvanced.vue2.js +236 -0
- package/components/organisms/JSidebarAdvanced.vue2.js.map +1 -0
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs +2 -0
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs.map +1 -0
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js +132 -0
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js.map +1 -0
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue2.cjs +2 -0
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue2.cjs.map +1 -0
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue2.js +5 -0
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue2.js.map +1 -0
- package/components/organisms/JSidebarSimple.vue.cjs +7 -0
- package/components/organisms/JSidebarSimple.vue.cjs.map +1 -0
- package/components/organisms/JSidebarSimple.vue.js +13 -0
- package/components/organisms/JSidebarSimple.vue.js.map +1 -0
- package/components/organisms/JSidebarSimple.vue2.cjs +2 -0
- package/components/organisms/JSidebarSimple.vue2.cjs.map +1 -0
- package/components/organisms/JSidebarSimple.vue2.js +110 -0
- package/components/organisms/JSidebarSimple.vue2.js.map +1 -0
- package/components/shadcn/Accordion.vue.cjs +2 -0
- package/components/shadcn/Accordion.vue.cjs.map +1 -0
- package/components/shadcn/Accordion.vue.js +31 -0
- package/components/shadcn/Accordion.vue.js.map +1 -0
- package/components/shadcn/Accordion.vue2.cjs +2 -0
- package/components/shadcn/Accordion.vue2.cjs.map +1 -0
- package/components/shadcn/Accordion.vue2.js +5 -0
- package/components/shadcn/Accordion.vue2.js.map +1 -0
- package/components/shadcn/AccordionContent.vue.cjs +2 -0
- package/components/shadcn/AccordionContent.vue.cjs.map +1 -0
- package/components/shadcn/AccordionContent.vue.js +30 -0
- package/components/shadcn/AccordionContent.vue.js.map +1 -0
- package/components/shadcn/AccordionContent.vue2.cjs +2 -0
- package/components/shadcn/AccordionContent.vue2.cjs.map +1 -0
- package/components/shadcn/AccordionContent.vue2.js +5 -0
- package/components/shadcn/AccordionContent.vue2.js.map +1 -0
- package/components/shadcn/AccordionItem.vue.cjs +2 -0
- package/components/shadcn/AccordionItem.vue.cjs.map +1 -0
- package/components/shadcn/AccordionItem.vue.js +30 -0
- package/components/shadcn/AccordionItem.vue.js.map +1 -0
- package/components/shadcn/AccordionItem.vue2.cjs +2 -0
- package/components/shadcn/AccordionItem.vue2.cjs.map +1 -0
- package/components/shadcn/AccordionItem.vue2.js +5 -0
- package/components/shadcn/AccordionItem.vue2.js.map +1 -0
- package/components/shadcn/AccordionTrigger.vue.cjs +2 -0
- package/components/shadcn/AccordionTrigger.vue.cjs.map +1 -0
- package/components/shadcn/AccordionTrigger.vue.js +39 -0
- package/components/shadcn/AccordionTrigger.vue.js.map +1 -0
- package/components/shadcn/AccordionTrigger.vue2.cjs +2 -0
- package/components/shadcn/AccordionTrigger.vue2.cjs.map +1 -0
- package/components/shadcn/AccordionTrigger.vue2.js +5 -0
- package/components/shadcn/AccordionTrigger.vue2.js.map +1 -0
- package/components/shadcn/Alert.vue.cjs +2 -0
- package/components/shadcn/Alert.vue.cjs.map +1 -0
- package/components/shadcn/Alert.vue.js +23 -0
- package/components/shadcn/Alert.vue.js.map +1 -0
- package/components/shadcn/Alert.vue2.cjs +2 -0
- package/components/shadcn/Alert.vue2.cjs.map +1 -0
- package/components/shadcn/Alert.vue2.js +5 -0
- package/components/shadcn/Alert.vue2.js.map +1 -0
- package/components/shadcn/AlertDescription.vue.cjs +2 -0
- package/components/shadcn/AlertDescription.vue.cjs.map +1 -0
- package/components/shadcn/AlertDescription.vue.js +20 -0
- package/components/shadcn/AlertDescription.vue.js.map +1 -0
- package/components/shadcn/AlertDescription.vue2.cjs +2 -0
- package/components/shadcn/AlertDescription.vue2.cjs.map +1 -0
- package/components/shadcn/AlertDescription.vue2.js +5 -0
- package/components/shadcn/AlertDescription.vue2.js.map +1 -0
- package/components/shadcn/AlertTitle.vue.cjs +2 -0
- package/components/shadcn/AlertTitle.vue.cjs.map +1 -0
- package/components/shadcn/AlertTitle.vue.js +20 -0
- package/components/shadcn/AlertTitle.vue.js.map +1 -0
- package/components/shadcn/AlertTitle.vue2.cjs +2 -0
- package/components/shadcn/AlertTitle.vue2.cjs.map +1 -0
- package/components/shadcn/AlertTitle.vue2.js +5 -0
- package/components/shadcn/AlertTitle.vue2.js.map +1 -0
- package/components/shadcn/Avatar.vue.cjs +2 -0
- package/components/shadcn/Avatar.vue.cjs.map +1 -0
- package/components/shadcn/Avatar.vue.js +27 -0
- package/components/shadcn/Avatar.vue.js.map +1 -0
- package/components/shadcn/Avatar.vue2.cjs +2 -0
- package/components/shadcn/Avatar.vue2.cjs.map +1 -0
- package/components/shadcn/Avatar.vue2.js +5 -0
- package/components/shadcn/Avatar.vue2.js.map +1 -0
- package/components/shadcn/AvatarFallback.vue.cjs +2 -0
- package/components/shadcn/AvatarFallback.vue.cjs.map +1 -0
- package/components/shadcn/AvatarFallback.vue.js +23 -0
- package/components/shadcn/AvatarFallback.vue.js.map +1 -0
- package/components/shadcn/AvatarFallback.vue2.cjs +2 -0
- package/components/shadcn/AvatarFallback.vue2.cjs.map +1 -0
- package/components/shadcn/AvatarFallback.vue2.js +5 -0
- package/components/shadcn/AvatarFallback.vue2.js.map +1 -0
- package/components/shadcn/AvatarImage.vue.cjs +2 -0
- package/components/shadcn/AvatarImage.vue.cjs.map +1 -0
- package/components/shadcn/AvatarImage.vue.js +25 -0
- package/components/shadcn/AvatarImage.vue.js.map +1 -0
- package/components/shadcn/AvatarImage.vue2.cjs +2 -0
- package/components/shadcn/AvatarImage.vue2.cjs.map +1 -0
- package/components/shadcn/AvatarImage.vue2.js +5 -0
- package/components/shadcn/AvatarImage.vue2.js.map +1 -0
- package/components/shadcn/Badge.vue.cjs +2 -0
- package/components/shadcn/Badge.vue.cjs.map +1 -0
- package/components/shadcn/Badge.vue.js +22 -0
- package/components/shadcn/Badge.vue.js.map +1 -0
- package/components/shadcn/Badge.vue2.cjs +2 -0
- package/components/shadcn/Badge.vue2.cjs.map +1 -0
- package/components/shadcn/Badge.vue2.js +5 -0
- package/components/shadcn/Badge.vue2.js.map +1 -0
- package/components/shadcn/Button.vue.cjs +2 -0
- package/components/shadcn/Button.vue.cjs.map +1 -0
- package/components/shadcn/Button.vue.js +31 -0
- package/components/shadcn/Button.vue.js.map +1 -0
- package/components/shadcn/Button.vue2.cjs +2 -0
- package/components/shadcn/Button.vue2.cjs.map +1 -0
- package/components/shadcn/Button.vue2.js +5 -0
- package/components/shadcn/Button.vue2.js.map +1 -0
- package/components/shadcn/ButtonGroup.vue.cjs +2 -0
- package/components/shadcn/ButtonGroup.vue.cjs.map +1 -0
- package/components/shadcn/ButtonGroup.vue.js +25 -0
- package/components/shadcn/ButtonGroup.vue.js.map +1 -0
- package/components/shadcn/ButtonGroup.vue2.cjs +2 -0
- package/components/shadcn/ButtonGroup.vue2.cjs.map +1 -0
- package/components/shadcn/ButtonGroup.vue2.js +5 -0
- package/components/shadcn/ButtonGroup.vue2.js.map +1 -0
- package/components/shadcn/ButtonGroupSeparator.vue.cjs +2 -0
- package/components/shadcn/ButtonGroupSeparator.vue.cjs.map +1 -0
- package/components/shadcn/ButtonGroupSeparator.vue.js +29 -0
- package/components/shadcn/ButtonGroupSeparator.vue.js.map +1 -0
- package/components/shadcn/ButtonGroupSeparator.vue2.cjs +2 -0
- package/components/shadcn/ButtonGroupSeparator.vue2.cjs.map +1 -0
- package/components/shadcn/ButtonGroupSeparator.vue2.js +5 -0
- package/components/shadcn/ButtonGroupSeparator.vue2.js.map +1 -0
- package/components/shadcn/Calendar.vue.cjs +2 -0
- package/components/shadcn/Calendar.vue.cjs.map +1 -0
- package/components/shadcn/Calendar.vue.js +121 -0
- package/components/shadcn/Calendar.vue.js.map +1 -0
- package/components/shadcn/Calendar.vue2.cjs +2 -0
- package/components/shadcn/Calendar.vue2.cjs.map +1 -0
- package/components/shadcn/Calendar.vue2.js +5 -0
- package/components/shadcn/Calendar.vue2.js.map +1 -0
- package/components/shadcn/CalendarCell.vue.cjs +2 -0
- package/components/shadcn/CalendarCell.vue.cjs.map +1 -0
- package/components/shadcn/CalendarCell.vue.js +5 -0
- package/components/shadcn/CalendarCell.vue.js.map +1 -0
- package/components/shadcn/CalendarCell.vue2.cjs +2 -0
- package/components/shadcn/CalendarCell.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarCell.vue2.js +28 -0
- package/components/shadcn/CalendarCell.vue2.js.map +1 -0
- package/components/shadcn/CalendarCellTrigger.vue.cjs +2 -0
- package/components/shadcn/CalendarCellTrigger.vue.cjs.map +1 -0
- package/components/shadcn/CalendarCellTrigger.vue.js +5 -0
- package/components/shadcn/CalendarCellTrigger.vue.js.map +1 -0
- package/components/shadcn/CalendarCellTrigger.vue2.cjs +2 -0
- package/components/shadcn/CalendarCellTrigger.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarCellTrigger.vue2.js +43 -0
- package/components/shadcn/CalendarCellTrigger.vue2.js.map +1 -0
- package/components/shadcn/CalendarGrid.vue.cjs +2 -0
- package/components/shadcn/CalendarGrid.vue.cjs.map +1 -0
- package/components/shadcn/CalendarGrid.vue.js +5 -0
- package/components/shadcn/CalendarGrid.vue.js.map +1 -0
- package/components/shadcn/CalendarGrid.vue2.cjs +2 -0
- package/components/shadcn/CalendarGrid.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarGrid.vue2.js +27 -0
- package/components/shadcn/CalendarGrid.vue2.js.map +1 -0
- package/components/shadcn/CalendarGridBody.vue.cjs +2 -0
- package/components/shadcn/CalendarGridBody.vue.cjs.map +1 -0
- package/components/shadcn/CalendarGridBody.vue.js +5 -0
- package/components/shadcn/CalendarGridBody.vue.js.map +1 -0
- package/components/shadcn/CalendarGridBody.vue2.cjs +2 -0
- package/components/shadcn/CalendarGridBody.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarGridBody.vue2.js +22 -0
- package/components/shadcn/CalendarGridBody.vue2.js.map +1 -0
- package/components/shadcn/CalendarGridHead.vue.cjs +2 -0
- package/components/shadcn/CalendarGridHead.vue.cjs.map +1 -0
- package/components/shadcn/CalendarGridHead.vue.js +5 -0
- package/components/shadcn/CalendarGridHead.vue.js.map +1 -0
- package/components/shadcn/CalendarGridHead.vue2.cjs +2 -0
- package/components/shadcn/CalendarGridHead.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarGridHead.vue2.js +22 -0
- package/components/shadcn/CalendarGridHead.vue2.js.map +1 -0
- package/components/shadcn/CalendarGridRow.vue.cjs +2 -0
- package/components/shadcn/CalendarGridRow.vue.cjs.map +1 -0
- package/components/shadcn/CalendarGridRow.vue.js +5 -0
- package/components/shadcn/CalendarGridRow.vue.js.map +1 -0
- package/components/shadcn/CalendarGridRow.vue2.cjs +2 -0
- package/components/shadcn/CalendarGridRow.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarGridRow.vue2.js +27 -0
- package/components/shadcn/CalendarGridRow.vue2.js.map +1 -0
- package/components/shadcn/CalendarHeadCell.vue.cjs +2 -0
- package/components/shadcn/CalendarHeadCell.vue.cjs.map +1 -0
- package/components/shadcn/CalendarHeadCell.vue.js +5 -0
- package/components/shadcn/CalendarHeadCell.vue.js.map +1 -0
- package/components/shadcn/CalendarHeadCell.vue2.cjs +2 -0
- package/components/shadcn/CalendarHeadCell.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarHeadCell.vue2.js +27 -0
- package/components/shadcn/CalendarHeadCell.vue2.js.map +1 -0
- package/components/shadcn/CalendarHeader.vue.cjs +2 -0
- package/components/shadcn/CalendarHeader.vue.cjs.map +1 -0
- package/components/shadcn/CalendarHeader.vue.js +5 -0
- package/components/shadcn/CalendarHeader.vue.js.map +1 -0
- package/components/shadcn/CalendarHeader.vue2.cjs +2 -0
- package/components/shadcn/CalendarHeader.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarHeader.vue2.js +27 -0
- package/components/shadcn/CalendarHeader.vue2.js.map +1 -0
- package/components/shadcn/CalendarHeading.vue.cjs +2 -0
- package/components/shadcn/CalendarHeading.vue.cjs.map +1 -0
- package/components/shadcn/CalendarHeading.vue.js +5 -0
- package/components/shadcn/CalendarHeading.vue.js.map +1 -0
- package/components/shadcn/CalendarHeading.vue2.cjs +2 -0
- package/components/shadcn/CalendarHeading.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarHeading.vue2.js +29 -0
- package/components/shadcn/CalendarHeading.vue2.js.map +1 -0
- package/components/shadcn/CalendarNextButton.vue.cjs +2 -0
- package/components/shadcn/CalendarNextButton.vue.cjs.map +1 -0
- package/components/shadcn/CalendarNextButton.vue.js +5 -0
- package/components/shadcn/CalendarNextButton.vue.js.map +1 -0
- package/components/shadcn/CalendarNextButton.vue2.cjs +2 -0
- package/components/shadcn/CalendarNextButton.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarNextButton.vue2.js +36 -0
- package/components/shadcn/CalendarNextButton.vue2.js.map +1 -0
- package/components/shadcn/CalendarPrevButton.vue.cjs +2 -0
- package/components/shadcn/CalendarPrevButton.vue.cjs.map +1 -0
- package/components/shadcn/CalendarPrevButton.vue.js +5 -0
- package/components/shadcn/CalendarPrevButton.vue.js.map +1 -0
- package/components/shadcn/CalendarPrevButton.vue2.cjs +2 -0
- package/components/shadcn/CalendarPrevButton.vue2.cjs.map +1 -0
- package/components/shadcn/CalendarPrevButton.vue2.js +36 -0
- package/components/shadcn/CalendarPrevButton.vue2.js.map +1 -0
- package/components/shadcn/Card.vue.cjs +2 -0
- package/components/shadcn/Card.vue.cjs.map +1 -0
- package/components/shadcn/Card.vue.js +25 -0
- package/components/shadcn/Card.vue.js.map +1 -0
- package/components/shadcn/Card.vue2.cjs +2 -0
- package/components/shadcn/Card.vue2.cjs.map +1 -0
- package/components/shadcn/Card.vue2.js +5 -0
- package/components/shadcn/Card.vue2.js.map +1 -0
- package/components/shadcn/CardContent.vue.cjs +2 -0
- package/components/shadcn/CardContent.vue.cjs.map +1 -0
- package/components/shadcn/CardContent.vue.js +20 -0
- package/components/shadcn/CardContent.vue.js.map +1 -0
- package/components/shadcn/CardContent.vue2.cjs +2 -0
- package/components/shadcn/CardContent.vue2.cjs.map +1 -0
- package/components/shadcn/CardContent.vue2.js +5 -0
- package/components/shadcn/CardContent.vue2.js.map +1 -0
- package/components/shadcn/CardDescription.vue.cjs +2 -0
- package/components/shadcn/CardDescription.vue.cjs.map +1 -0
- package/components/shadcn/CardDescription.vue.js +20 -0
- package/components/shadcn/CardDescription.vue.js.map +1 -0
- package/components/shadcn/CardDescription.vue2.cjs +2 -0
- package/components/shadcn/CardDescription.vue2.cjs.map +1 -0
- package/components/shadcn/CardDescription.vue2.js +5 -0
- package/components/shadcn/CardDescription.vue2.js.map +1 -0
- package/components/shadcn/CardFooter.vue.cjs +2 -0
- package/components/shadcn/CardFooter.vue.cjs.map +1 -0
- package/components/shadcn/CardFooter.vue.js +20 -0
- package/components/shadcn/CardFooter.vue.js.map +1 -0
- package/components/shadcn/CardFooter.vue2.cjs +2 -0
- package/components/shadcn/CardFooter.vue2.cjs.map +1 -0
- package/components/shadcn/CardFooter.vue2.js +5 -0
- package/components/shadcn/CardFooter.vue2.js.map +1 -0
- package/components/shadcn/CardHeader.vue.cjs +2 -0
- package/components/shadcn/CardHeader.vue.cjs.map +1 -0
- package/components/shadcn/CardHeader.vue.js +20 -0
- package/components/shadcn/CardHeader.vue.js.map +1 -0
- package/components/shadcn/CardHeader.vue2.cjs +2 -0
- package/components/shadcn/CardHeader.vue2.cjs.map +1 -0
- package/components/shadcn/CardHeader.vue2.js +5 -0
- package/components/shadcn/CardHeader.vue2.js.map +1 -0
- package/components/shadcn/CardTitle.vue.cjs +2 -0
- package/components/shadcn/CardTitle.vue.cjs.map +1 -0
- package/components/shadcn/CardTitle.vue.js +22 -0
- package/components/shadcn/CardTitle.vue.js.map +1 -0
- package/components/shadcn/CardTitle.vue2.cjs +2 -0
- package/components/shadcn/CardTitle.vue2.cjs.map +1 -0
- package/components/shadcn/CardTitle.vue2.js +5 -0
- package/components/shadcn/CardTitle.vue2.js.map +1 -0
- package/components/shadcn/Checkbox.vue.cjs +2 -0
- package/components/shadcn/Checkbox.vue.cjs.map +1 -0
- package/components/shadcn/Checkbox.vue.js +46 -0
- package/components/shadcn/Checkbox.vue.js.map +1 -0
- package/components/shadcn/Checkbox.vue2.cjs +2 -0
- package/components/shadcn/Checkbox.vue2.cjs.map +1 -0
- package/components/shadcn/Checkbox.vue2.js +5 -0
- package/components/shadcn/Checkbox.vue2.js.map +1 -0
- package/components/shadcn/Combobox.vue.cjs +2 -0
- package/components/shadcn/Combobox.vue.cjs.map +1 -0
- package/components/shadcn/Combobox.vue.js +40 -0
- package/components/shadcn/Combobox.vue.js.map +1 -0
- package/components/shadcn/Combobox.vue2.cjs +2 -0
- package/components/shadcn/Combobox.vue2.cjs.map +1 -0
- package/components/shadcn/Combobox.vue2.js +5 -0
- package/components/shadcn/Combobox.vue2.js.map +1 -0
- package/components/shadcn/ComboboxAnchor.vue.cjs +2 -0
- package/components/shadcn/ComboboxAnchor.vue.cjs.map +1 -0
- package/components/shadcn/ComboboxAnchor.vue.js +28 -0
- package/components/shadcn/ComboboxAnchor.vue.js.map +1 -0
- package/components/shadcn/ComboboxAnchor.vue2.cjs +2 -0
- package/components/shadcn/ComboboxAnchor.vue2.cjs.map +1 -0
- package/components/shadcn/ComboboxAnchor.vue2.js +5 -0
- package/components/shadcn/ComboboxAnchor.vue2.js.map +1 -0
- package/components/shadcn/ComboboxEmpty.vue.cjs +2 -0
- package/components/shadcn/ComboboxEmpty.vue.cjs.map +1 -0
- package/components/shadcn/ComboboxEmpty.vue.js +27 -0
- package/components/shadcn/ComboboxEmpty.vue.js.map +1 -0
- package/components/shadcn/ComboboxEmpty.vue2.cjs +2 -0
- package/components/shadcn/ComboboxEmpty.vue2.cjs.map +1 -0
- package/components/shadcn/ComboboxEmpty.vue2.js +5 -0
- package/components/shadcn/ComboboxEmpty.vue2.js.map +1 -0
- package/components/shadcn/ComboboxGroup.vue.cjs +2 -0
- package/components/shadcn/ComboboxGroup.vue.cjs.map +1 -0
- package/components/shadcn/ComboboxGroup.vue.js +37 -0
- package/components/shadcn/ComboboxGroup.vue.js.map +1 -0
- package/components/shadcn/ComboboxGroup.vue2.cjs +2 -0
- package/components/shadcn/ComboboxGroup.vue2.cjs.map +1 -0
- package/components/shadcn/ComboboxGroup.vue2.js +5 -0
- package/components/shadcn/ComboboxGroup.vue2.js.map +1 -0
- package/components/shadcn/ComboboxInput.vue.cjs +2 -0
- package/components/shadcn/ComboboxInput.vue.cjs.map +1 -0
- package/components/shadcn/ComboboxInput.vue.js +32 -0
- package/components/shadcn/ComboboxInput.vue.js.map +1 -0
- package/components/shadcn/ComboboxInput.vue2.cjs +2 -0
- package/components/shadcn/ComboboxInput.vue2.cjs.map +1 -0
- package/components/shadcn/ComboboxInput.vue2.js +5 -0
- package/components/shadcn/ComboboxInput.vue2.js.map +1 -0
- package/components/shadcn/ComboboxItem.vue.cjs +2 -0
- package/components/shadcn/ComboboxItem.vue.cjs.map +1 -0
- package/components/shadcn/ComboboxItem.vue.js +31 -0
- package/components/shadcn/ComboboxItem.vue.js.map +1 -0
- package/components/shadcn/ComboboxItem.vue2.cjs +2 -0
- package/components/shadcn/ComboboxItem.vue2.cjs.map +1 -0
- package/components/shadcn/ComboboxItem.vue2.js +5 -0
- package/components/shadcn/ComboboxItem.vue2.js.map +1 -0
- package/components/shadcn/ComboboxList.vue.cjs +2 -0
- package/components/shadcn/ComboboxList.vue.cjs.map +1 -0
- package/components/shadcn/ComboboxList.vue.js +59 -0
- package/components/shadcn/ComboboxList.vue.js.map +1 -0
- package/components/shadcn/ComboboxList.vue2.cjs +2 -0
- package/components/shadcn/ComboboxList.vue2.cjs.map +1 -0
- package/components/shadcn/ComboboxList.vue2.js +5 -0
- package/components/shadcn/ComboboxList.vue2.js.map +1 -0
- package/components/shadcn/ComboboxTrigger.vue.cjs +2 -0
- package/components/shadcn/ComboboxTrigger.vue.cjs.map +1 -0
- package/components/shadcn/ComboboxTrigger.vue.js +29 -0
- package/components/shadcn/ComboboxTrigger.vue.js.map +1 -0
- package/components/shadcn/ComboboxTrigger.vue2.cjs +2 -0
- package/components/shadcn/ComboboxTrigger.vue2.cjs.map +1 -0
- package/components/shadcn/ComboboxTrigger.vue2.js +5 -0
- package/components/shadcn/ComboboxTrigger.vue2.js.map +1 -0
- package/components/shadcn/ContextMenu.vue.cjs +2 -0
- package/components/shadcn/ContextMenu.vue.cjs.map +1 -0
- package/components/shadcn/ContextMenu.vue.js +24 -0
- package/components/shadcn/ContextMenu.vue.js.map +1 -0
- package/components/shadcn/ContextMenu.vue2.cjs +2 -0
- package/components/shadcn/ContextMenu.vue2.cjs.map +1 -0
- package/components/shadcn/ContextMenu.vue2.js +5 -0
- package/components/shadcn/ContextMenu.vue2.js.map +1 -0
- package/components/shadcn/ContextMenuContent.vue.cjs +2 -0
- package/components/shadcn/ContextMenuContent.vue.cjs.map +1 -0
- package/components/shadcn/ContextMenuContent.vue.js +50 -0
- package/components/shadcn/ContextMenuContent.vue.js.map +1 -0
- package/components/shadcn/ContextMenuContent.vue2.cjs +2 -0
- package/components/shadcn/ContextMenuContent.vue2.cjs.map +1 -0
- package/components/shadcn/ContextMenuContent.vue2.js +5 -0
- package/components/shadcn/ContextMenuContent.vue2.js.map +1 -0
- package/components/shadcn/ContextMenuGroup.vue.cjs +2 -0
- package/components/shadcn/ContextMenuGroup.vue.cjs.map +1 -0
- package/components/shadcn/ContextMenuGroup.vue.js +22 -0
- package/components/shadcn/ContextMenuGroup.vue.js.map +1 -0
- package/components/shadcn/ContextMenuGroup.vue2.cjs +2 -0
- package/components/shadcn/ContextMenuGroup.vue2.cjs.map +1 -0
- package/components/shadcn/ContextMenuGroup.vue2.js +5 -0
- package/components/shadcn/ContextMenuGroup.vue2.js.map +1 -0
- package/components/shadcn/ContextMenuItem.vue.cjs +2 -0
- package/components/shadcn/ContextMenuItem.vue.cjs.map +1 -0
- package/components/shadcn/ContextMenuItem.vue.js +35 -0
- package/components/shadcn/ContextMenuItem.vue.js.map +1 -0
- package/components/shadcn/ContextMenuItem.vue2.cjs +2 -0
- package/components/shadcn/ContextMenuItem.vue2.cjs.map +1 -0
- package/components/shadcn/ContextMenuItem.vue2.js +5 -0
- package/components/shadcn/ContextMenuItem.vue2.js.map +1 -0
- package/components/shadcn/ContextMenuLabel.vue.cjs +2 -0
- package/components/shadcn/ContextMenuLabel.vue.cjs.map +1 -0
- package/components/shadcn/ContextMenuLabel.vue.js +32 -0
- package/components/shadcn/ContextMenuLabel.vue.js.map +1 -0
- package/components/shadcn/ContextMenuLabel.vue2.cjs +2 -0
- package/components/shadcn/ContextMenuLabel.vue2.cjs.map +1 -0
- package/components/shadcn/ContextMenuLabel.vue2.js +5 -0
- package/components/shadcn/ContextMenuLabel.vue2.js.map +1 -0
- package/components/shadcn/ContextMenuSeparator.vue.cjs +2 -0
- package/components/shadcn/ContextMenuSeparator.vue.cjs.map +1 -0
- package/components/shadcn/ContextMenuSeparator.vue.js +22 -0
- package/components/shadcn/ContextMenuSeparator.vue.js.map +1 -0
- package/components/shadcn/ContextMenuSeparator.vue2.cjs +2 -0
- package/components/shadcn/ContextMenuSeparator.vue2.cjs.map +1 -0
- package/components/shadcn/ContextMenuSeparator.vue2.js +5 -0
- package/components/shadcn/ContextMenuSeparator.vue2.js.map +1 -0
- package/components/shadcn/ContextMenuSub.vue.cjs +2 -0
- package/components/shadcn/ContextMenuSub.vue.cjs.map +1 -0
- package/components/shadcn/ContextMenuSub.vue.js +23 -0
- package/components/shadcn/ContextMenuSub.vue.js.map +1 -0
- package/components/shadcn/ContextMenuSub.vue2.cjs +2 -0
- package/components/shadcn/ContextMenuSub.vue2.cjs.map +1 -0
- package/components/shadcn/ContextMenuSub.vue2.js +5 -0
- package/components/shadcn/ContextMenuSub.vue2.js.map +1 -0
- package/components/shadcn/ContextMenuSubContent.vue.cjs +2 -0
- package/components/shadcn/ContextMenuSubContent.vue.cjs.map +1 -0
- package/components/shadcn/ContextMenuSubContent.vue.js +48 -0
- package/components/shadcn/ContextMenuSubContent.vue.js.map +1 -0
- package/components/shadcn/ContextMenuSubContent.vue2.cjs +2 -0
- package/components/shadcn/ContextMenuSubContent.vue2.cjs.map +1 -0
- package/components/shadcn/ContextMenuSubContent.vue2.js +5 -0
- package/components/shadcn/ContextMenuSubContent.vue2.js.map +1 -0
- package/components/shadcn/ContextMenuSubTrigger.vue.cjs +2 -0
- package/components/shadcn/ContextMenuSubTrigger.vue.cjs.map +1 -0
- package/components/shadcn/ContextMenuSubTrigger.vue.js +36 -0
- package/components/shadcn/ContextMenuSubTrigger.vue.js.map +1 -0
- package/components/shadcn/ContextMenuSubTrigger.vue2.cjs +2 -0
- package/components/shadcn/ContextMenuSubTrigger.vue2.cjs.map +1 -0
- package/components/shadcn/ContextMenuSubTrigger.vue2.js +5 -0
- package/components/shadcn/ContextMenuSubTrigger.vue2.js.map +1 -0
- package/components/shadcn/ContextMenuTrigger.vue.cjs +2 -0
- package/components/shadcn/ContextMenuTrigger.vue.cjs.map +1 -0
- package/components/shadcn/ContextMenuTrigger.vue.js +23 -0
- package/components/shadcn/ContextMenuTrigger.vue.js.map +1 -0
- package/components/shadcn/ContextMenuTrigger.vue2.cjs +2 -0
- package/components/shadcn/ContextMenuTrigger.vue2.cjs.map +1 -0
- package/components/shadcn/ContextMenuTrigger.vue2.js +5 -0
- package/components/shadcn/ContextMenuTrigger.vue2.js.map +1 -0
- package/components/shadcn/Dialog.vue.cjs +2 -0
- package/components/shadcn/Dialog.vue.cjs.map +1 -0
- package/components/shadcn/Dialog.vue.js +34 -0
- package/components/shadcn/Dialog.vue.js.map +1 -0
- package/components/shadcn/Dialog.vue2.cjs +2 -0
- package/components/shadcn/Dialog.vue2.cjs.map +1 -0
- package/components/shadcn/Dialog.vue2.js +5 -0
- package/components/shadcn/Dialog.vue2.js.map +1 -0
- package/components/shadcn/DialogBody.vue.cjs +2 -0
- package/components/shadcn/DialogBody.vue.cjs.map +1 -0
- package/components/shadcn/DialogBody.vue.js +19 -0
- package/components/shadcn/DialogBody.vue.js.map +1 -0
- package/components/shadcn/DialogBody.vue2.cjs +2 -0
- package/components/shadcn/DialogBody.vue2.cjs.map +1 -0
- package/components/shadcn/DialogBody.vue2.js +5 -0
- package/components/shadcn/DialogBody.vue2.js.map +1 -0
- package/components/shadcn/DialogContent.vue.cjs +2 -0
- package/components/shadcn/DialogContent.vue.cjs.map +1 -0
- package/components/shadcn/DialogContent.vue.js +19 -0
- package/components/shadcn/DialogContent.vue.js.map +1 -0
- package/components/shadcn/DialogContent.vue2.cjs +2 -0
- package/components/shadcn/DialogContent.vue2.cjs.map +1 -0
- package/components/shadcn/DialogContent.vue2.js +5 -0
- package/components/shadcn/DialogContent.vue2.js.map +1 -0
- package/components/shadcn/DialogFooter.vue.cjs +2 -0
- package/components/shadcn/DialogFooter.vue.cjs.map +1 -0
- package/components/shadcn/DialogFooter.vue.js +19 -0
- package/components/shadcn/DialogFooter.vue.js.map +1 -0
- package/components/shadcn/DialogFooter.vue2.cjs +2 -0
- package/components/shadcn/DialogFooter.vue2.cjs.map +1 -0
- package/components/shadcn/DialogFooter.vue2.js +5 -0
- package/components/shadcn/DialogFooter.vue2.js.map +1 -0
- package/components/shadcn/DialogHeader.vue.cjs +2 -0
- package/components/shadcn/DialogHeader.vue.cjs.map +1 -0
- package/components/shadcn/DialogHeader.vue.js +19 -0
- package/components/shadcn/DialogHeader.vue.js.map +1 -0
- package/components/shadcn/DialogHeader.vue2.cjs +2 -0
- package/components/shadcn/DialogHeader.vue2.cjs.map +1 -0
- package/components/shadcn/DialogHeader.vue2.js +5 -0
- package/components/shadcn/DialogHeader.vue2.js.map +1 -0
- package/components/shadcn/DialogTitle.vue.cjs +2 -0
- package/components/shadcn/DialogTitle.vue.cjs.map +1 -0
- package/components/shadcn/DialogTitle.vue.js +19 -0
- package/components/shadcn/DialogTitle.vue.js.map +1 -0
- package/components/shadcn/DialogTitle.vue2.cjs +2 -0
- package/components/shadcn/DialogTitle.vue2.cjs.map +1 -0
- package/components/shadcn/DialogTitle.vue2.js +5 -0
- package/components/shadcn/DialogTitle.vue2.js.map +1 -0
- package/components/shadcn/Field.vue.cjs +2 -0
- package/components/shadcn/Field.vue.cjs.map +1 -0
- package/components/shadcn/Field.vue.js +28 -0
- package/components/shadcn/Field.vue.js.map +1 -0
- package/components/shadcn/Field.vue2.cjs +2 -0
- package/components/shadcn/Field.vue2.cjs.map +1 -0
- package/components/shadcn/Field.vue2.js +5 -0
- package/components/shadcn/Field.vue2.js.map +1 -0
- package/components/shadcn/FieldContent.vue.cjs +2 -0
- package/components/shadcn/FieldContent.vue.cjs.map +1 -0
- package/components/shadcn/FieldContent.vue.js +24 -0
- package/components/shadcn/FieldContent.vue.js.map +1 -0
- package/components/shadcn/FieldContent.vue2.cjs +2 -0
- package/components/shadcn/FieldContent.vue2.cjs.map +1 -0
- package/components/shadcn/FieldContent.vue2.js +5 -0
- package/components/shadcn/FieldContent.vue2.js.map +1 -0
- package/components/shadcn/FieldDescription.vue.cjs +2 -0
- package/components/shadcn/FieldDescription.vue.cjs.map +1 -0
- package/components/shadcn/FieldDescription.vue.js +26 -0
- package/components/shadcn/FieldDescription.vue.js.map +1 -0
- package/components/shadcn/FieldDescription.vue2.cjs +2 -0
- package/components/shadcn/FieldDescription.vue2.cjs.map +1 -0
- package/components/shadcn/FieldDescription.vue2.js +5 -0
- package/components/shadcn/FieldDescription.vue2.js.map +1 -0
- package/components/shadcn/FieldError.vue.cjs +2 -0
- package/components/shadcn/FieldError.vue.cjs.map +1 -0
- package/components/shadcn/FieldError.vue.js +31 -0
- package/components/shadcn/FieldError.vue.js.map +1 -0
- package/components/shadcn/FieldError.vue2.cjs +2 -0
- package/components/shadcn/FieldError.vue2.cjs.map +1 -0
- package/components/shadcn/FieldError.vue2.js +5 -0
- package/components/shadcn/FieldError.vue2.js.map +1 -0
- package/components/shadcn/FieldGroup.vue.cjs +2 -0
- package/components/shadcn/FieldGroup.vue.cjs.map +1 -0
- package/components/shadcn/FieldGroup.vue.js +24 -0
- package/components/shadcn/FieldGroup.vue.js.map +1 -0
- package/components/shadcn/FieldGroup.vue2.cjs +2 -0
- package/components/shadcn/FieldGroup.vue2.cjs.map +1 -0
- package/components/shadcn/FieldGroup.vue2.js +5 -0
- package/components/shadcn/FieldGroup.vue2.js.map +1 -0
- package/components/shadcn/FieldLabel.vue.cjs +2 -0
- package/components/shadcn/FieldLabel.vue.cjs.map +1 -0
- package/components/shadcn/FieldLabel.vue.js +31 -0
- package/components/shadcn/FieldLabel.vue.js.map +1 -0
- package/components/shadcn/FieldLabel.vue2.cjs +2 -0
- package/components/shadcn/FieldLabel.vue2.cjs.map +1 -0
- package/components/shadcn/FieldLabel.vue2.js +5 -0
- package/components/shadcn/FieldLabel.vue2.js.map +1 -0
- package/components/shadcn/Input.vue.cjs +2 -0
- package/components/shadcn/Input.vue.cjs.map +1 -0
- package/components/shadcn/Input.vue.js +28 -0
- package/components/shadcn/Input.vue.js.map +1 -0
- package/components/shadcn/Input.vue2.cjs +2 -0
- package/components/shadcn/Input.vue2.cjs.map +1 -0
- package/components/shadcn/Input.vue2.js +5 -0
- package/components/shadcn/Input.vue2.js.map +1 -0
- package/components/shadcn/Kbd.vue.cjs +2 -0
- package/components/shadcn/Kbd.vue.cjs.map +1 -0
- package/components/shadcn/Kbd.vue.js +25 -0
- package/components/shadcn/Kbd.vue.js.map +1 -0
- package/components/shadcn/Kbd.vue2.cjs +2 -0
- package/components/shadcn/Kbd.vue2.cjs.map +1 -0
- package/components/shadcn/Kbd.vue2.js +5 -0
- package/components/shadcn/Kbd.vue2.js.map +1 -0
- package/components/shadcn/Label.vue.cjs +2 -0
- package/components/shadcn/Label.vue.cjs.map +1 -0
- package/components/shadcn/Label.vue.js +31 -0
- package/components/shadcn/Label.vue.js.map +1 -0
- package/components/shadcn/Label.vue2.cjs +2 -0
- package/components/shadcn/Label.vue2.cjs.map +1 -0
- package/components/shadcn/Label.vue2.js +5 -0
- package/components/shadcn/Label.vue2.js.map +1 -0
- package/components/shadcn/Popover.vue.cjs +2 -0
- package/components/shadcn/Popover.vue.cjs.map +1 -0
- package/components/shadcn/Popover.vue.js +24 -0
- package/components/shadcn/Popover.vue.js.map +1 -0
- package/components/shadcn/Popover.vue2.cjs +2 -0
- package/components/shadcn/Popover.vue2.cjs.map +1 -0
- package/components/shadcn/Popover.vue2.js +5 -0
- package/components/shadcn/Popover.vue2.js.map +1 -0
- package/components/shadcn/PopoverContent.vue.cjs +2 -0
- package/components/shadcn/PopoverContent.vue.cjs.map +1 -0
- package/components/shadcn/PopoverContent.vue.js +56 -0
- package/components/shadcn/PopoverContent.vue.js.map +1 -0
- package/components/shadcn/PopoverContent.vue2.cjs +2 -0
- package/components/shadcn/PopoverContent.vue2.cjs.map +1 -0
- package/components/shadcn/PopoverContent.vue2.js +5 -0
- package/components/shadcn/PopoverContent.vue2.js.map +1 -0
- package/components/shadcn/PopoverTrigger.vue.cjs +2 -0
- package/components/shadcn/PopoverTrigger.vue.cjs.map +1 -0
- package/components/shadcn/PopoverTrigger.vue.js +22 -0
- package/components/shadcn/PopoverTrigger.vue.js.map +1 -0
- package/components/shadcn/PopoverTrigger.vue2.cjs +2 -0
- package/components/shadcn/PopoverTrigger.vue2.cjs.map +1 -0
- package/components/shadcn/PopoverTrigger.vue2.js +5 -0
- package/components/shadcn/PopoverTrigger.vue2.js.map +1 -0
- package/components/shadcn/Progress.vue.cjs +2 -0
- package/components/shadcn/Progress.vue.cjs.map +1 -0
- package/components/shadcn/Progress.vue.js +37 -0
- package/components/shadcn/Progress.vue.js.map +1 -0
- package/components/shadcn/Progress.vue2.cjs +2 -0
- package/components/shadcn/Progress.vue2.cjs.map +1 -0
- package/components/shadcn/Progress.vue2.js +5 -0
- package/components/shadcn/Progress.vue2.js.map +1 -0
- package/components/shadcn/RadioGroup.vue.cjs +2 -0
- package/components/shadcn/RadioGroup.vue.cjs.map +1 -0
- package/components/shadcn/RadioGroup.vue.js +36 -0
- package/components/shadcn/RadioGroup.vue.js.map +1 -0
- package/components/shadcn/RadioGroup.vue2.cjs +2 -0
- package/components/shadcn/RadioGroup.vue2.cjs.map +1 -0
- package/components/shadcn/RadioGroup.vue2.js +5 -0
- package/components/shadcn/RadioGroup.vue2.js.map +1 -0
- package/components/shadcn/RadioGroupItem.vue.cjs +2 -0
- package/components/shadcn/RadioGroupItem.vue.cjs.map +1 -0
- package/components/shadcn/RadioGroupItem.vue.js +41 -0
- package/components/shadcn/RadioGroupItem.vue.js.map +1 -0
- package/components/shadcn/RadioGroupItem.vue2.cjs +2 -0
- package/components/shadcn/RadioGroupItem.vue2.cjs.map +1 -0
- package/components/shadcn/RadioGroupItem.vue2.js +5 -0
- package/components/shadcn/RadioGroupItem.vue2.js.map +1 -0
- package/components/shadcn/Select.vue.cjs +2 -0
- package/components/shadcn/Select.vue.cjs.map +1 -0
- package/components/shadcn/Select.vue.js +32 -0
- package/components/shadcn/Select.vue.js.map +1 -0
- package/components/shadcn/Select.vue2.cjs +2 -0
- package/components/shadcn/Select.vue2.cjs.map +1 -0
- package/components/shadcn/Select.vue2.js +5 -0
- package/components/shadcn/Select.vue2.js.map +1 -0
- package/components/shadcn/SelectContent.vue.cjs +2 -0
- package/components/shadcn/SelectContent.vue.cjs.map +1 -0
- package/components/shadcn/SelectContent.vue.js +69 -0
- package/components/shadcn/SelectContent.vue.js.map +1 -0
- package/components/shadcn/SelectContent.vue2.cjs +2 -0
- package/components/shadcn/SelectContent.vue2.cjs.map +1 -0
- package/components/shadcn/SelectContent.vue2.js +5 -0
- package/components/shadcn/SelectContent.vue2.js.map +1 -0
- package/components/shadcn/SelectGroup.vue.cjs +2 -0
- package/components/shadcn/SelectGroup.vue.cjs.map +1 -0
- package/components/shadcn/SelectGroup.vue.js +27 -0
- package/components/shadcn/SelectGroup.vue.js.map +1 -0
- package/components/shadcn/SelectGroup.vue2.cjs +2 -0
- package/components/shadcn/SelectGroup.vue2.cjs.map +1 -0
- package/components/shadcn/SelectGroup.vue2.js +5 -0
- package/components/shadcn/SelectGroup.vue2.js.map +1 -0
- package/components/shadcn/SelectItem.vue.cjs +2 -0
- package/components/shadcn/SelectItem.vue.cjs.map +1 -0
- package/components/shadcn/SelectItem.vue.js +47 -0
- package/components/shadcn/SelectItem.vue.js.map +1 -0
- package/components/shadcn/SelectItem.vue2.cjs +2 -0
- package/components/shadcn/SelectItem.vue2.cjs.map +1 -0
- package/components/shadcn/SelectItem.vue2.js +5 -0
- package/components/shadcn/SelectItem.vue2.js.map +1 -0
- package/components/shadcn/SelectLabel.vue.cjs +2 -0
- package/components/shadcn/SelectLabel.vue.cjs.map +1 -0
- package/components/shadcn/SelectLabel.vue.js +27 -0
- package/components/shadcn/SelectLabel.vue.js.map +1 -0
- package/components/shadcn/SelectLabel.vue2.cjs +2 -0
- package/components/shadcn/SelectLabel.vue2.cjs.map +1 -0
- package/components/shadcn/SelectLabel.vue2.js +5 -0
- package/components/shadcn/SelectLabel.vue2.js.map +1 -0
- package/components/shadcn/SelectScrollDownButton.vue.cjs +2 -0
- package/components/shadcn/SelectScrollDownButton.vue.cjs.map +1 -0
- package/components/shadcn/SelectScrollDownButton.vue.js +5 -0
- package/components/shadcn/SelectScrollDownButton.vue.js.map +1 -0
- package/components/shadcn/SelectScrollDownButton.vue2.cjs +2 -0
- package/components/shadcn/SelectScrollDownButton.vue2.cjs.map +1 -0
- package/components/shadcn/SelectScrollDownButton.vue2.js +30 -0
- package/components/shadcn/SelectScrollDownButton.vue2.js.map +1 -0
- package/components/shadcn/SelectScrollUpButton.vue.cjs +2 -0
- package/components/shadcn/SelectScrollUpButton.vue.cjs.map +1 -0
- package/components/shadcn/SelectScrollUpButton.vue.js +5 -0
- package/components/shadcn/SelectScrollUpButton.vue.js.map +1 -0
- package/components/shadcn/SelectScrollUpButton.vue2.cjs +2 -0
- package/components/shadcn/SelectScrollUpButton.vue2.cjs.map +1 -0
- package/components/shadcn/SelectScrollUpButton.vue2.js +30 -0
- package/components/shadcn/SelectScrollUpButton.vue2.js.map +1 -0
- package/components/shadcn/SelectTrigger.vue.cjs +2 -0
- package/components/shadcn/SelectTrigger.vue.cjs.map +1 -0
- package/components/shadcn/SelectTrigger.vue.js +39 -0
- package/components/shadcn/SelectTrigger.vue.js.map +1 -0
- package/components/shadcn/SelectTrigger.vue2.cjs +2 -0
- package/components/shadcn/SelectTrigger.vue2.cjs.map +1 -0
- package/components/shadcn/SelectTrigger.vue2.js +5 -0
- package/components/shadcn/SelectTrigger.vue2.js.map +1 -0
- package/components/shadcn/SelectValue.vue.cjs +2 -0
- package/components/shadcn/SelectValue.vue.cjs.map +1 -0
- package/components/shadcn/SelectValue.vue.js +23 -0
- package/components/shadcn/SelectValue.vue.js.map +1 -0
- package/components/shadcn/SelectValue.vue2.cjs +2 -0
- package/components/shadcn/SelectValue.vue2.cjs.map +1 -0
- package/components/shadcn/SelectValue.vue2.js +5 -0
- package/components/shadcn/SelectValue.vue2.js.map +1 -0
- package/components/shadcn/Separator.vue.cjs +2 -0
- package/components/shadcn/Separator.vue.cjs.map +1 -0
- package/components/shadcn/Separator.vue.js +28 -0
- package/components/shadcn/Separator.vue.js.map +1 -0
- package/components/shadcn/Separator.vue2.cjs +2 -0
- package/components/shadcn/Separator.vue2.cjs.map +1 -0
- package/components/shadcn/Separator.vue2.js +5 -0
- package/components/shadcn/Separator.vue2.js.map +1 -0
- package/components/shadcn/Switch.vue.cjs +2 -0
- package/components/shadcn/Switch.vue.cjs.map +1 -0
- package/components/shadcn/Switch.vue.js +45 -0
- package/components/shadcn/Switch.vue.js.map +1 -0
- package/components/shadcn/Switch.vue2.cjs +2 -0
- package/components/shadcn/Switch.vue2.cjs.map +1 -0
- package/components/shadcn/Switch.vue2.js +5 -0
- package/components/shadcn/Switch.vue2.js.map +1 -0
- package/components/shadcn/Tabs.vue.cjs +2 -0
- package/components/shadcn/Tabs.vue.cjs.map +1 -0
- package/components/shadcn/Tabs.vue.js +34 -0
- package/components/shadcn/Tabs.vue.js.map +1 -0
- package/components/shadcn/Tabs.vue2.cjs +2 -0
- package/components/shadcn/Tabs.vue2.cjs.map +1 -0
- package/components/shadcn/Tabs.vue2.js +5 -0
- package/components/shadcn/Tabs.vue2.js.map +1 -0
- package/components/shadcn/TabsContent.vue.cjs +2 -0
- package/components/shadcn/TabsContent.vue.cjs.map +1 -0
- package/components/shadcn/TabsContent.vue.js +32 -0
- package/components/shadcn/TabsContent.vue.js.map +1 -0
- package/components/shadcn/TabsContent.vue2.cjs +2 -0
- package/components/shadcn/TabsContent.vue2.cjs.map +1 -0
- package/components/shadcn/TabsContent.vue2.js +5 -0
- package/components/shadcn/TabsContent.vue2.js.map +1 -0
- package/components/shadcn/TabsList.vue.cjs +2 -0
- package/components/shadcn/TabsList.vue.cjs.map +1 -0
- package/components/shadcn/TabsList.vue.js +31 -0
- package/components/shadcn/TabsList.vue.js.map +1 -0
- package/components/shadcn/TabsList.vue2.cjs +2 -0
- package/components/shadcn/TabsList.vue2.cjs.map +1 -0
- package/components/shadcn/TabsList.vue2.js +5 -0
- package/components/shadcn/TabsList.vue2.js.map +1 -0
- package/components/shadcn/TabsTrigger.vue.cjs +2 -0
- package/components/shadcn/TabsTrigger.vue.cjs.map +1 -0
- package/components/shadcn/TabsTrigger.vue.js +32 -0
- package/components/shadcn/TabsTrigger.vue.js.map +1 -0
- package/components/shadcn/TabsTrigger.vue2.cjs +2 -0
- package/components/shadcn/TabsTrigger.vue2.cjs.map +1 -0
- package/components/shadcn/TabsTrigger.vue2.js +5 -0
- package/components/shadcn/TabsTrigger.vue2.js.map +1 -0
- package/components/shadcn/Textarea.vue.cjs +2 -0
- package/components/shadcn/Textarea.vue.cjs.map +1 -0
- package/components/shadcn/Textarea.vue.js +28 -0
- package/components/shadcn/Textarea.vue.js.map +1 -0
- package/components/shadcn/Textarea.vue2.cjs +2 -0
- package/components/shadcn/Textarea.vue2.cjs.map +1 -0
- package/components/shadcn/Textarea.vue2.js +5 -0
- package/components/shadcn/Textarea.vue2.js.map +1 -0
- package/components/shadcn/Tooltip.vue.cjs +2 -0
- package/components/shadcn/Tooltip.vue.cjs.map +1 -0
- package/components/shadcn/Tooltip.vue.js +28 -0
- package/components/shadcn/Tooltip.vue.js.map +1 -0
- package/components/shadcn/Tooltip.vue2.cjs +2 -0
- package/components/shadcn/Tooltip.vue2.cjs.map +1 -0
- package/components/shadcn/Tooltip.vue2.js +5 -0
- package/components/shadcn/Tooltip.vue2.js.map +1 -0
- package/components/shadcn/TooltipContent.vue.cjs +2 -0
- package/components/shadcn/TooltipContent.vue.cjs.map +1 -0
- package/components/shadcn/TooltipContent.vue.js +48 -0
- package/components/shadcn/TooltipContent.vue.js.map +1 -0
- package/components/shadcn/TooltipContent.vue2.cjs +2 -0
- package/components/shadcn/TooltipContent.vue2.cjs.map +1 -0
- package/components/shadcn/TooltipContent.vue2.js +5 -0
- package/components/shadcn/TooltipContent.vue2.js.map +1 -0
- package/components/shadcn/TooltipProvider.vue.cjs +2 -0
- package/components/shadcn/TooltipProvider.vue.cjs.map +1 -0
- package/components/shadcn/TooltipProvider.vue.js +26 -0
- package/components/shadcn/TooltipProvider.vue.js.map +1 -0
- package/components/shadcn/TooltipProvider.vue2.cjs +2 -0
- package/components/shadcn/TooltipProvider.vue2.cjs.map +1 -0
- package/components/shadcn/TooltipProvider.vue2.js +5 -0
- package/components/shadcn/TooltipProvider.vue2.js.map +1 -0
- package/components/shadcn/TooltipTrigger.vue.cjs +2 -0
- package/components/shadcn/TooltipTrigger.vue.cjs.map +1 -0
- package/components/shadcn/TooltipTrigger.vue.js +23 -0
- package/components/shadcn/TooltipTrigger.vue.js.map +1 -0
- package/components/shadcn/TooltipTrigger.vue2.cjs +2 -0
- package/components/shadcn/TooltipTrigger.vue2.cjs.map +1 -0
- package/components/shadcn/TooltipTrigger.vue2.js +5 -0
- package/components/shadcn/TooltipTrigger.vue2.js.map +1 -0
- package/components/shadcn/alert-variants.cjs +2 -0
- package/components/shadcn/alert-variants.cjs.map +1 -0
- package/components/shadcn/alert-variants.js +19 -0
- package/components/shadcn/alert-variants.js.map +1 -0
- package/components/shadcn/avatar-variants.cjs +2 -0
- package/components/shadcn/avatar-variants.cjs.map +1 -0
- package/components/shadcn/avatar-variants.js +21 -0
- package/components/shadcn/avatar-variants.js.map +1 -0
- package/components/shadcn/badge-variants.cjs +2 -0
- package/components/shadcn/badge-variants.cjs.map +1 -0
- package/components/shadcn/badge-variants.js +21 -0
- package/components/shadcn/badge-variants.js.map +1 -0
- package/components/shadcn/button-group-variants.cjs +2 -0
- package/components/shadcn/button-group-variants.cjs.map +1 -0
- package/components/shadcn/button-group-variants.js +19 -0
- package/components/shadcn/button-group-variants.js.map +1 -0
- package/components/shadcn/index.cjs +2 -0
- package/components/shadcn/index.cjs.map +1 -0
- package/components/shadcn/index.js +40 -0
- package/components/shadcn/index.js.map +1 -0
- package/components/templates/JLayout.vue.cjs +2 -0
- package/components/templates/JLayout.vue.cjs.map +1 -0
- package/components/templates/JLayout.vue.js +46 -0
- package/components/templates/JLayout.vue.js.map +1 -0
- package/components/templates/JLayout.vue2.cjs +2 -0
- package/components/templates/JLayout.vue2.cjs.map +1 -0
- package/components/templates/JLayout.vue2.js +5 -0
- package/components/templates/JLayout.vue2.js.map +1 -0
- package/components/templates/JLayoutAdvanced.vue.cjs +2 -0
- package/components/templates/JLayoutAdvanced.vue.cjs.map +1 -0
- package/components/templates/JLayoutAdvanced.vue.js +146 -0
- package/components/templates/JLayoutAdvanced.vue.js.map +1 -0
- package/components/templates/JLayoutAdvanced.vue2.cjs +2 -0
- package/components/templates/JLayoutAdvanced.vue2.cjs.map +1 -0
- package/components/templates/JLayoutAdvanced.vue2.js +5 -0
- package/components/templates/JLayoutAdvanced.vue2.js.map +1 -0
- package/components/templates/JLayoutSimple.vue.cjs +2 -0
- package/components/templates/JLayoutSimple.vue.cjs.map +1 -0
- package/components/templates/JLayoutSimple.vue.js +65 -0
- package/components/templates/JLayoutSimple.vue.js.map +1 -0
- package/components/templates/JLayoutSimple.vue2.cjs +2 -0
- package/components/templates/JLayoutSimple.vue2.cjs.map +1 -0
- package/components/templates/JLayoutSimple.vue2.js +5 -0
- package/components/templates/JLayoutSimple.vue2.js.map +1 -0
- package/components.json +17 -0
- package/index.cjs +4 -0
- package/index.js +99 -0
- package/lib/styleTypePreset.cjs +2 -0
- package/lib/styleTypePreset.cjs.map +1 -0
- package/lib/styleTypePreset.js +36 -0
- package/lib/styleTypePreset.js.map +1 -0
- package/lib/theme-utils.cjs +2 -0
- package/lib/theme-utils.cjs.map +1 -0
- package/lib/theme-utils.js +75 -0
- package/lib/theme-utils.js.map +1 -0
- package/lib/utils.cjs +2 -0
- package/lib/utils.cjs.map +1 -0
- package/lib/utils.js +15 -0
- package/lib/utils.js.map +1 -0
- package/package.json +96 -0
- package/tailwind.config.js +80 -0
- package/types/index.d.ts +2491 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JSearchPanel.vue2.js","sources":["../../../../src/components/organisms/JSearchPanel.vue"],"sourcesContent":["<template>\r\n <Card class=\"w-full\">\r\n <!-- 헤더: 제목, Badge 목록, 초기화 버튼 -->\r\n <CardHeader class=\"pt-4 pb-3 px-6\">\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex items-center gap-3 flex-1\">\r\n <button\r\n v-if=\"collapsible\"\r\n type=\"button\"\r\n @click=\"isExpanded = !isExpanded\"\r\n class=\"flex items-center gap-2 font-semibold hover:text-primary transition-colors\"\r\n >\r\n <ChevronDown\r\n :class=\"['h-4 w-4 transition-transform', isExpanded ? 'rotate-0' : '-rotate-90']\"\r\n />\r\n {{ title }}\r\n </button>\r\n <CardTitle v-else class=\"mb-0\">{{ title }}</CardTitle>\r\n \r\n <!-- 조건 Badge 목록 -->\r\n <div v-if=\"conditionBadges.length > 0\" class=\"flex flex-wrap items-center gap-2 ml-2\">\r\n <JBadge\r\n v-for=\"badge in conditionBadges\"\r\n :key=\"badge.fieldName\"\r\n variant=\"secondary\"\r\n size=\"sm\"\r\n class=\"flex items-center gap-1.5 pr-1\"\r\n >\r\n <span>{{ badge.label }}: {{ badge.value }}</span>\r\n <button\r\n type=\"button\"\r\n @click.stop=\"handleFieldReset(badge.fieldName)\"\r\n class=\"h-4 w-4 rounded-full hover:bg-destructive/20 hover:text-destructive transition-colors flex items-center justify-center\"\r\n :aria-label=\"`${badge.label} 조건 제거`\"\r\n >\r\n <X class=\"h-3 w-3\" />\r\n </button>\r\n </JBadge>\r\n </div>\r\n </div>\r\n \r\n <JButton\r\n variant=\"outline\"\r\n size=\"sm\"\r\n @click.stop=\"handleReset\"\r\n >\r\n 초기화\r\n </JButton>\r\n </div>\r\n </CardHeader>\r\n \r\n <!-- 폼 내용 -->\r\n <CardContent v-show=\"isExpanded || !collapsible\" class=\"px-6 pb-6 pt-0\">\r\n <JDynamicForm\r\n ref=\"dynamicFormRef\"\r\n :schema=\"schema\"\r\n :model-value=\"localModelValue\"\r\n @update:model-value=\"handleFormValueUpdate\"\r\n @submit=\"handleSubmit\"\r\n />\r\n </CardContent>\r\n </Card>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, reactive, watch } from 'vue'\r\nimport { ChevronDown, X } from 'lucide-vue-next'\r\nimport { Card, CardHeader, CardTitle, CardContent } from '@/components/shadcn'\r\nimport { JButton, JBadge } from '@/components/atoms'\r\nimport JDynamicForm from './JDynamicForm.vue'\r\nimport type { FormSchema, DynamicFormField } from '@/types/dynamic-form'\r\nimport type { ComponentPublicInstance } from 'vue'\r\n\r\ninterface ConditionBadge {\r\n fieldName: string\r\n label: string\r\n value: string\r\n}\r\n\r\nexport interface JSearchPanelProps {\r\n /** 패널 제목 */\r\n title?: string\r\n /** JDynamicForm에 전달할 FormSchema */\r\n schema: FormSchema\r\n /** JDynamicForm의 v-model 값 */\r\n modelValue?: Record<string, any>\r\n /** 기본 접힘 상태 */\r\n defaultCollapsed?: boolean\r\n /** 접기/펼치기 가능 여부 */\r\n collapsible?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<JSearchPanelProps>(), {\r\n title: '조회조건',\r\n defaultCollapsed: false,\r\n collapsible: true,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: Record<string, any>]\r\n 'submit': [values: Record<string, any>]\r\n 'reset': []\r\n}>()\r\n\r\nconst dynamicFormRef = ref<ComponentPublicInstance & { reset: () => void } | null>(null)\r\nconst isExpanded = ref(!props.defaultCollapsed)\r\n\r\n// 로컬 modelValue - reactive로 관리하여 양방향 바인딩\r\nconst localModelValue = reactive<Record<string, any>>(props.modelValue ? { ...props.modelValue } : {})\r\n\r\n// 내부 변경인지 외부 변경인지 구분하는 플래그\r\nlet isInternalUpdate = false\r\n\r\n// props.modelValue 변경 시 localModelValue 동기화 (외부 변경)\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n if (newValue && !isInternalUpdate) {\r\n // 기존 키 중 새 값에 없는 것은 삭제\r\n Object.keys(localModelValue).forEach(key => {\r\n if (!(key in newValue)) {\r\n delete localModelValue[key]\r\n }\r\n })\r\n // 새 값으로 업데이트\r\n Object.assign(localModelValue, newValue)\r\n }\r\n isInternalUpdate = false\r\n },\r\n { deep: true, immediate: true }\r\n)\r\n\r\n// JDynamicForm에서 값이 변경되었을 때 처리\r\nfunction handleFormValueUpdate(value: Record<string, any>) {\r\n // JDynamicForm에서 emit된 값을 localModelValue에 반영\r\n isInternalUpdate = true\r\n Object.assign(localModelValue, value)\r\n // 상위로 emit\r\n emit('update:modelValue', { ...value })\r\n}\r\n\r\n// 모든 필드 가져오기\r\nconst allFields = computed((): DynamicFormField[] => {\r\n if (!props.schema) return []\r\n \r\n const fields: DynamicFormField[] = []\r\n if (props.schema.type === 'simple' && props.schema.fields) {\r\n fields.push(...props.schema.fields)\r\n } else if (props.schema.type === 'sectioned' && props.schema.sections) {\r\n props.schema.sections.forEach(section => {\r\n if (section.fields) fields.push(...section.fields)\r\n })\r\n } else if (props.schema.type === 'wizard' && props.schema.steps) {\r\n props.schema.steps.forEach(step => {\r\n if (step.fields) fields.push(...step.fields)\r\n })\r\n }\r\n return fields\r\n})\r\n\r\n// 조건 Badge 목록 생성\r\nconst conditionBadges = computed((): ConditionBadge[] => {\r\n if (!localModelValue || !props.schema) {\r\n return []\r\n }\r\n\r\n const badges: ConditionBadge[] = []\r\n const formState = localModelValue\r\n\r\n allFields.value.forEach((field) => {\r\n const value = formState[field.controlName]\r\n \r\n // 빈 값 체크 (빈 문자열, null, undefined, 'ALL', 'SELECT' 제외)\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n value === '' ||\r\n value === 'ALL' ||\r\n value === 'SELECT' ||\r\n (field.type === 'checkbox' && value === 'N') ||\r\n (field.type === 'switch' && value === 'N')\r\n ) {\r\n return\r\n }\r\n\r\n // 필드 타입에 따라 값 표시\r\n let displayValue = String(value)\r\n\r\n // 콤보/검색콤보인 경우 옵션의 label 찾기\r\n if ((field.type === 'combo' || field.type === 'searchcombo') && field.options) {\r\n const option = field.options.find(opt => opt.value === value)\r\n if (option) {\r\n displayValue = option.label\r\n }\r\n }\r\n\r\n // 체크박스/스위치는 'Y'일 때만 표시\r\n if (field.type === 'checkbox' || field.type === 'switch') {\r\n if (value === 'Y') {\r\n badges.push({\r\n fieldName: field.controlName,\r\n label: field.label,\r\n value: field.inlineLabel || field.label\r\n })\r\n }\r\n } else {\r\n badges.push({\r\n fieldName: field.controlName,\r\n label: field.label,\r\n value: displayValue\r\n })\r\n }\r\n })\r\n\r\n return badges\r\n})\r\n\r\n// submit 핸들러\r\nfunction handleSubmit(values: Record<string, any>) {\r\n emit('submit', values)\r\n}\r\n\r\n// 전체 초기화 핸들러\r\nfunction handleReset() {\r\n if (dynamicFormRef.value) {\r\n dynamicFormRef.value.reset()\r\n emit('reset')\r\n }\r\n}\r\n\r\n// 필드별 초기화 핸들러\r\nfunction handleFieldReset(fieldName: string) {\r\n if (!localModelValue || !props.schema) return\r\n \r\n const field = allFields.value.find(f => f.controlName === fieldName)\r\n \r\n if (field) {\r\n // 필드 타입에 따라 초기값 설정 - reactive 객체 직접 수정\r\n if (field.type === 'checkbox' || field.type === 'switch') {\r\n localModelValue[fieldName] = 'N'\r\n } else {\r\n localModelValue[fieldName] = ''\r\n }\r\n \r\n // localModelValue 변경 후 상위로 emit하여 JDynamicForm에도 반영\r\n isInternalUpdate = true\r\n emit('update:modelValue', { ...localModelValue })\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n/* 필요시 스타일 추가 */\r\n</style>\r\n\r\n"],"names":["props","__props","emit","__emit","dynamicFormRef","ref","isExpanded","localModelValue","reactive","isInternalUpdate","watch","newValue","key","handleFormValueUpdate","value","allFields","computed","fields","section","step","conditionBadges","badges","formState","field","displayValue","option","opt","handleSubmit","values","handleReset","handleFieldReset","fieldName","f","_createBlock","_unref","Card","_createVNode","CardHeader","_createElementVNode","_hoisted_1","_hoisted_2","_createElementBlock","_cache","$event","ChevronDown","_createTextVNode","CardTitle","_openBlock","_hoisted_3","_Fragment","_renderList","badge","JBadge","_toDisplayString","_withModifiers","X","JButton","CardContent","JDynamicForm","_vShow"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./JSidebarAdvanced.vue2.cjs");;/* empty css */const t = (t_comp, t_opts) => {
|
|
2
|
+
const t_merged = t_comp.__vccOpts || t_comp;
|
|
3
|
+
for (const [t_key, t_val] of t_opts)
|
|
4
|
+
t_merged[t_key] = t_val;
|
|
5
|
+
return t_merged;
|
|
6
|
+
};,u=t(e.default,[["__scopeId","data-v-a4482a84"]]);exports.default=u;
|
|
7
|
+
//# sourceMappingURL=JSidebarAdvanced.vue.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JSidebarAdvanced.vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import a from "./JSidebarAdvanced.vue2.js";
|
|
2
|
+
/* empty css */
|
|
3
|
+
const o = (o_comp, o_opts) => {
|
|
4
|
+
const o_merged = o_comp.__vccOpts || o_comp;
|
|
5
|
+
for (const [o_key, o_val] of o_opts)
|
|
6
|
+
o_merged[o_key] = o_val;
|
|
7
|
+
return o_merged;
|
|
8
|
+
};
|
|
9
|
+
const e = /* @__PURE__ */ o(a, [["__scopeId", "data-v-a4482a84"]]);
|
|
10
|
+
export {
|
|
11
|
+
e as default
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=JSidebarAdvanced.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JSidebarAdvanced.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),T=require("vue-router"),I=require("./JSidebarSimple/JDynamicMenuItem.vue.cjs"),L=require("../atoms/JInput.vue.cjs"),S=require("../atoms/JIcon.vue.cjs"),y=require("../../lib/utils.cjs"),z={class:"relative"},q={key:1,class:"text-center py-8 text-muted-foreground"},P={key:1,class:"text-center py-8 text-muted-foreground"},J=e.defineComponent({__name:"JSidebarAdvanced",props:{menuItems:{},permissions:{default:()=>[]},favorites:{default:()=>[]},styletype:{default:"minimal"},class:{},width:{default:"280px"},isVisible:{type:Boolean,default:!0}},emits:["menuClick","favoriteChange"],setup(u,{emit:V}){const l=u,b=V,w=T.useRoute(),m=e.ref("menu"),o=e.ref(""),C=e.computed(()=>w.path),f=e.ref(new Set),p=e.computed(()=>{if(!Array.isArray(l.favorites)||l.favorites.length===0)return[];if(!Array.isArray(l.menuItems)||l.menuItems.length===0)return[];const t=r=>{const n=[];if(!Array.isArray(r))return n;for(const a of r){const s=a.menuKey||a.label;if(Array.isArray(l.favorites)&&l.favorites.includes(s)&&a.menuType==="L"&&n.push({...a,children:void 0}),a.children&&Array.isArray(a.children)&&a.children.length>0){const i=t(a.children);n.push(...i)}}return n};return t(l.menuItems)}),h=e.computed(()=>{if(!Array.isArray(l.menuItems)||l.menuItems.length===0)return[];if(!o.value||o.value.trim()==="")return l.menuItems;const t=o.value.toLowerCase().trim(),r=n=>{const a=[];if(!Array.isArray(n))return a;for(const s of n){const v=s.label?.toLowerCase().includes(t)??!1;let i;s.children&&Array.isArray(s.children)&&s.children.length>0&&(i=r(s.children)),(v||Array.isArray(i)&&i.length>0)&&a.push({...s,children:i})}return a};return r(l.menuItems)});e.watch(()=>h.value,t=>{if(!o.value||o.value.trim()==="")return;(a=>{const s=new Set,v=i=>{if(Array.isArray(i)){for(const d of i)if(d.children&&Array.isArray(d.children)&&d.children.length>0){const N=d.menuKey||d.label;s.add(N),v(d.children)}}};return v(a),s})(t).forEach(a=>{f.value.add(a)})},{immediate:!1});const k=e.computed(()=>{if(!Array.isArray(p.value)||p.value.length===0)return[];if(!o.value||o.value.trim()==="")return p.value;const t=o.value.toLowerCase().trim();return p.value.filter(r=>r.label?.toLowerCase().includes(t)??!1)}),x=t=>{m.value!==t&&(m.value=t,o.value="")},g=(t,r)=>{t&&(r?f.value.add(t):f.value.delete(t))},E=t=>{b("menuClick",t)},_=t=>{if(!t)return;const r=l.favorites?.includes(t)??!1;b("favoriteChange",t,!r)},A=(t,r)=>{for(const n of t){if((n.menuKey||n.label)===r)return n;if(n.children&&n.children.length>0){const s=A(n.children,r);if(s)return s}}return null},F=t=>!t||!l.favorites?.includes(t)?!1:A(l.menuItems,t)?.menuType==="L",B={default:{containerClass:"h-full bg-background border-r border-border flex flex-col",tabContainerClass:"flex border-b border-border",tabButtonClass:"flex-1 px-4 py-2 text-sm font-medium transition-colors border-b-2 hover:bg-accent/50",searchContainerClass:"p-2 border-b border-border",menuContainerClass:"flex-1 overflow-y-auto p-2 space-y-1"},minimal:{containerClass:"h-full bg-background border-r border-border flex flex-col",tabContainerClass:"flex border-b border-border pt-[8px]",tabButtonClass:"flex-1 px-2 py-[6.5px] text-xs font-medium transition-colors border-b-2",searchContainerClass:"p-1 border-b border-border",menuContainerClass:"flex-1 overflow-y-auto p-1 space-y-1"}},c=e.computed(()=>B[l.styletype]??B.default),M=e.computed(()=>y.cn(c.value.containerClass,l.class));return(t,r)=>(e.openBlock(),e.createBlock(e.Transition,{name:"slide"},{default:e.withCtx(()=>[e.withDirectives(e.createElementVNode("aside",{class:e.normalizeClass(M.value),style:e.normalizeStyle({width:u.width})},[e.createElementVNode("div",{class:e.normalizeClass(c.value.tabContainerClass)},[e.createElementVNode("button",{class:e.normalizeClass(e.unref(y.cn)(c.value.tabButtonClass,m.value==="menu"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground")),onClick:r[0]||(r[0]=n=>x("menu"))}," 기본메뉴 ",2),e.createElementVNode("button",{class:e.normalizeClass(e.unref(y.cn)(c.value.tabButtonClass,m.value==="favorites"?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground")),onClick:r[1]||(r[1]=n=>x("favorites"))}," 즐겨찾기 ",2)],2),e.createElementVNode("div",{class:e.normalizeClass(c.value.searchContainerClass)},[e.createElementVNode("div",z,[e.createVNode(S.default,{name:"search",size:"sm",class:"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground"}),e.createVNode(L.default,{modelValue:o.value,"onUpdate:modelValue":r[2]||(r[2]=n=>o.value=n),placeholder:"메뉴 검색...",class:e.normalizeClass(e.unref(y.cn)("pl-8",l.styletype==="minimal"&&"h-8 text-xs"))},null,8,["modelValue","class"])])],2),e.createElementVNode("div",{class:e.normalizeClass(c.value.menuContainerClass)},[m.value==="menu"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[h.value.length>0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(h.value,(n,a)=>(e.openBlock(),e.createElementBlock("div",{key:n.menuKey||n.label||a,class:"flex items-center group"},[e.createVNode(I.default,{item:n,level:0,permissions:u.permissions,"active-path":C.value,"expanded-keys":f.value,favorites:u.favorites,"on-favorite-toggle":_,"is-favorite":F,styletype:u.styletype,class:"flex-1",onMenuClick:E,onExpandChange:g},null,8,["item","permissions","active-path","expanded-keys","favorites","styletype"])]))),128)):(e.openBlock(),e.createElementBlock("div",q,[...r[3]||(r[3]=[e.createElementVNode("p",null,"검색 결과가 없습니다.",-1)])]))],64)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[k.value.length>0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(k.value,(n,a)=>(e.openBlock(),e.createBlock(I.default,{key:n.menuKey||n.label||a,item:n,level:0,permissions:u.permissions,"active-path":C.value,"expanded-keys":f.value,styletype:u.styletype,onMenuClick:E,onExpandChange:g},null,8,["item","permissions","active-path","expanded-keys","styletype"]))),128)):(e.openBlock(),e.createElementBlock("div",P,[...r[4]||(r[4]=[e.createElementVNode("p",null,"즐겨찾기가 없습니다.",-1)])]))],64))],2)],6),[[e.vShow,l.isVisible]])]),_:1}))}});exports.default=J;
|
|
2
|
+
//# sourceMappingURL=JSidebarAdvanced.vue2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JSidebarAdvanced.vue2.cjs","sources":["../../../../src/components/organisms/JSidebarAdvanced.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { ref, computed, watch } from 'vue'\r\nimport { useRoute } from 'vue-router'\r\nimport type { SidebarMenuItem, MenuPermission, MenuClickEvent } from '@/types/sidebar-menu.types'\r\nimport JDynamicMenuItem from './JSidebarSimple/JDynamicMenuItem.vue'\r\nimport JInput from '@/components/atoms/JInput.vue'\r\nimport JIcon from '@/components/atoms/JIcon.vue'\r\nimport { cn } from '@/lib/utils'\r\n\r\n/**\r\n * JSidebarAdvanced - 고급 사이드바 컴포넌트\r\n * Advanced Sidebar Component\r\n * \r\n * @description\r\n * 검색, 즐겨찾기, 다단계 메뉴를 지원하는 고급 사이드바 컴포넌트입니다.\r\n * 기본 메뉴와 즐겨찾기 탭을 제공합니다.\r\n * \r\n * @example\r\n * ```vue\r\n * <JSidebarAdvanced\r\n * :menu-items=\"menuItems\"\r\n * :permissions=\"userPermissions\"\r\n * :favorites=\"favoriteMenuKeys\"\r\n * @menu-click=\"handleMenuClick\"\r\n * @favorite-change=\"handleFavoriteChange\"\r\n * />\r\n * ```\r\n * \r\n * @example JSON 메뉴 데이터 예시\r\n * ```json\r\n * [\r\n * {\r\n * \"label\": \"대시보드\",\r\n * \"icon\": \"house\",\r\n * \"menuType\": \"L\",\r\n * \"menuKey\": 1,\r\n * \"path\": \"/dashboard\"\r\n * },\r\n * {\r\n * \"label\": \"재고 관리\",\r\n * \"icon\": \"package\",\r\n * \"menuType\": \"F\",\r\n * \"menuKey\": 2,\r\n * \"children\": [\r\n * {\r\n * \"label\": \"재고 현황\",\r\n * \"menuType\": \"L\",\r\n * \"menuKey\": 21,\r\n * \"path\": \"/inventory/status\"\r\n * },\r\n * {\r\n * \"label\": \"입고 관리\",\r\n * \"menuType\": \"F\",\r\n * \"menuKey\": 22,\r\n * \"children\": [\r\n * {\r\n * \"label\": \"입고 등록\",\r\n * \"menuType\": \"L\",\r\n * \"menuKey\": 221,\r\n * \"path\": \"/inventory/receiving/register\"\r\n * }\r\n * ]\r\n * }\r\n * ]\r\n * }\r\n * ]\r\n * ```\r\n */\r\n\r\ntype TabType = 'menu' | 'favorites'\r\n\r\ntype StyleType = 'default' | 'minimal'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 메뉴 아이템 목록 */\r\n menuItems: SidebarMenuItem[]\r\n /** 권한 목록 */\r\n permissions?: MenuPermission[]\r\n /** 즐겨찾기 메뉴 키 목록 */\r\n favorites?: (number | string)[]\r\n /** 스타일 타입 */\r\n styletype?: StyleType\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n /** 너비 */\r\n width?: string\r\n /** 표시 여부 */\r\n isVisible?: boolean\r\n }>(),\r\n {\r\n permissions: () => [],\r\n favorites: () => [],\r\n styletype: 'minimal',\r\n width: '280px',\r\n isVisible: true,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n /** 메뉴 클릭 이벤트 */\r\n menuClick: [event: MenuClickEvent]\r\n /** 즐겨찾기 변경 이벤트 */\r\n favoriteChange: [menuKey: number | string | undefined, isFavorite: boolean]\r\n}>()\r\n\r\n// vue-router가 설정되지 않은 경우를 대비 (Storybook에서 router가 제공됨)\r\nconst route = useRoute()\r\n\r\n/**\r\n * 현재 활성 탭\r\n */\r\nconst activeTab = ref<TabType>('menu')\r\n\r\n/**\r\n * 검색어\r\n */\r\nconst searchQuery = ref('')\r\n\r\n/**\r\n * 현재 활성화된 경로\r\n */\r\nconst activePath = computed(() => route.path)\r\n\r\n/**\r\n * 확장된 메뉴 키 목록\r\n */\r\nconst expandedKeys = ref<Set<number | string>>(new Set())\r\n\r\n/**\r\n * 즐겨찾기 메뉴 아이템 목록\r\n * 즐겨찾기는 dept 없이 1단계로만 평탄화하여 표시\r\n */\r\nconst favoriteMenuItems = computed(() => {\r\n if (!Array.isArray(props.favorites) || props.favorites.length === 0) {\r\n return []\r\n }\r\n\r\n if (!Array.isArray(props.menuItems) || props.menuItems.length === 0) {\r\n return []\r\n }\r\n\r\n /**\r\n * 메뉴 아이템을 재귀적으로 순회하며 즐겨찾기만 추출\r\n * 즐겨찾기에서는 dept 없이 1단계로만 평탄화\r\n * menuType L(Link)만 포함하고 F(Folder)는 제외\r\n */\r\n const flattenFavorites = (items: SidebarMenuItem[]): SidebarMenuItem[] => {\r\n const result: SidebarMenuItem[] = []\r\n\r\n if (!Array.isArray(items)) {\r\n return result\r\n }\r\n\r\n for (const item of items) {\r\n const key = item.menuKey || item.label\r\n const isFavorite = Array.isArray(props.favorites) && props.favorites.includes(key)\r\n\r\n // 즐겨찾기이고 menuType이 L(Link)인 경우만 추가 (F는 제외)\r\n if (isFavorite && item.menuType === 'L') {\r\n result.push({\r\n ...item,\r\n children: undefined, // children 제거하여 1단계로만 표시\r\n })\r\n }\r\n\r\n // 하위 메뉴도 재귀적으로 탐색\r\n if (item.children && Array.isArray(item.children) && item.children.length > 0) {\r\n const childFavorites = flattenFavorites(item.children)\r\n result.push(...childFavorites)\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n return flattenFavorites(props.menuItems)\r\n})\r\n\r\n/**\r\n * 검색어로 필터링된 메뉴 아이템\r\n * 재귀적으로 children까지 검색\r\n */\r\nconst filteredMenuItems = computed(() => {\r\n if (!Array.isArray(props.menuItems) || props.menuItems.length === 0) {\r\n return []\r\n }\r\n\r\n if (!searchQuery.value || searchQuery.value.trim() === '') {\r\n return props.menuItems\r\n }\r\n\r\n const query = searchQuery.value.toLowerCase().trim()\r\n\r\n /**\r\n * 메뉴 아이템을 재귀적으로 검색\r\n */\r\n const searchInMenu = (items: SidebarMenuItem[]): SidebarMenuItem[] => {\r\n const result: SidebarMenuItem[] = []\r\n\r\n if (!Array.isArray(items)) {\r\n return result\r\n }\r\n\r\n for (const item of items) {\r\n const matchesLabel = item.label?.toLowerCase().includes(query) ?? false\r\n\r\n // 하위 메뉴 검색\r\n let filteredChildren: SidebarMenuItem[] | undefined = undefined\r\n if (item.children && Array.isArray(item.children) && item.children.length > 0) {\r\n filteredChildren = searchInMenu(item.children)\r\n }\r\n\r\n // 현재 메뉴나 하위 메뉴 중 하나라도 매칭되면 포함\r\n if (matchesLabel || (Array.isArray(filteredChildren) && filteredChildren.length > 0)) {\r\n result.push({\r\n ...item,\r\n children: filteredChildren,\r\n })\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n return searchInMenu(props.menuItems)\r\n})\r\n\r\n/**\r\n * 검색 결과에 따라 부모 메뉴 자동 확장\r\n * computed 외부에서 watch를 통해 처리\r\n */\r\nwatch(\r\n () => filteredMenuItems.value,\r\n (filtered) => {\r\n if (!searchQuery.value || searchQuery.value.trim() === '') {\r\n return\r\n }\r\n\r\n // 검색 결과에서 매칭된 하위 메뉴가 있는 부모를 찾아 확장\r\n const findParentsWithMatches = (items: SidebarMenuItem[]): Set<number | string> => {\r\n const keysToExpand = new Set<number | string>()\r\n\r\n const traverse = (menuItems: SidebarMenuItem[]): void => {\r\n if (!Array.isArray(menuItems)) {\r\n return\r\n }\r\n\r\n for (const item of menuItems) {\r\n if (item.children && Array.isArray(item.children) && item.children.length > 0) {\r\n const key = item.menuKey || item.label\r\n keysToExpand.add(key)\r\n traverse(item.children)\r\n }\r\n }\r\n }\r\n\r\n traverse(items)\r\n return keysToExpand\r\n }\r\n\r\n const keysToExpand = findParentsWithMatches(filtered)\r\n keysToExpand.forEach(key => {\r\n expandedKeys.value.add(key)\r\n })\r\n },\r\n { immediate: false }\r\n)\r\n\r\n/**\r\n * 검색어로 필터링된 즐겨찾기 메뉴 아이템\r\n * 즐겨찾기는 이미 평탄화되어 있으므로 단순 필터링만 수행\r\n */\r\nconst filteredFavoriteItems = computed(() => {\r\n if (!Array.isArray(favoriteMenuItems.value) || favoriteMenuItems.value.length === 0) {\r\n return []\r\n }\r\n\r\n if (!searchQuery.value || searchQuery.value.trim() === '') {\r\n return favoriteMenuItems.value\r\n }\r\n\r\n const query = searchQuery.value.toLowerCase().trim()\r\n\r\n // 즐겨찾기는 이미 평탄화되어 1단계이므로 단순 필터링만 수행\r\n return favoriteMenuItems.value.filter((item) =>\r\n item.label?.toLowerCase().includes(query) ?? false\r\n )\r\n})\r\n\r\n\r\n/**\r\n * 탭 변경 핸들러\r\n * 탭 전환 시 검색 쿼리를 초기화하여 각 탭의 독립적인 검색 상태 유지\r\n */\r\nconst handleTabChange = (tab: TabType) => {\r\n if (activeTab.value !== tab) {\r\n activeTab.value = tab\r\n // 탭 전환 시 검색 쿼리 초기화 (선택적 - UX 고려)\r\n // 검색 쿼리를 유지하려면 아래 라인을 제거하세요\r\n searchQuery.value = ''\r\n }\r\n}\r\n\r\n/**\r\n * 확장 상태 변경 핸들러\r\n */\r\nconst handleExpandChange = (menuKey: number | string | undefined, expanded: boolean) => {\r\n if (!menuKey) return\r\n\r\n if (expanded) {\r\n expandedKeys.value.add(menuKey)\r\n } else {\r\n expandedKeys.value.delete(menuKey)\r\n }\r\n}\r\n\r\n/**\r\n * 메뉴 클릭 핸들러\r\n */\r\nconst handleMenuClick = (event: MenuClickEvent) => {\r\n emit('menuClick', event)\r\n}\r\n\r\n/**\r\n * 즐겨찾기 토글 핸들러\r\n */\r\nconst handleFavoriteToggle = (menuKey: number | string | undefined) => {\r\n if (!menuKey) return\r\n\r\n const isFavorite = props.favorites?.includes(menuKey) ?? false\r\n emit('favoriteChange', menuKey, !isFavorite)\r\n}\r\n\r\n/**\r\n * 메뉴 아이템에서 특정 menuKey를 찾는 헬퍼 함수\r\n */\r\nconst findMenuItemByKey = (items: SidebarMenuItem[], targetKey: number | string): SidebarMenuItem | null => {\r\n for (const item of items) {\r\n const key = item.menuKey || item.label\r\n if (key === targetKey) {\r\n return item\r\n }\r\n if (item.children && item.children.length > 0) {\r\n const found = findMenuItemByKey(item.children, targetKey)\r\n if (found) return found\r\n }\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * 메뉴가 즐겨찾기인지 확인 (L 타입만 즐겨찾기 가능)\r\n */\r\nconst isFavorite = (menuKey: number | string | undefined): boolean => {\r\n if (!menuKey) return false\r\n if (!props.favorites?.includes(menuKey)) return false\r\n \r\n // menuType이 L인 경우만 즐겨찾기로 인정\r\n const menuItem = findMenuItemByKey(props.menuItems, menuKey)\r\n return menuItem?.menuType === 'L'\r\n}\r\n\r\n/**\r\n * 스타일 프리셋\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, {\r\n containerClass: string\r\n tabContainerClass: string\r\n tabButtonClass: string\r\n searchContainerClass: string\r\n menuContainerClass: string\r\n}> = {\r\n default: {\r\n containerClass: 'h-full bg-background border-r border-border flex flex-col',\r\n tabContainerClass: 'flex border-b border-border',\r\n tabButtonClass: 'flex-1 px-4 py-2 text-sm font-medium transition-colors border-b-2 hover:bg-accent/50',\r\n searchContainerClass: 'p-2 border-b border-border',\r\n menuContainerClass: 'flex-1 overflow-y-auto p-2 space-y-1',\r\n },\r\n minimal: {\r\n containerClass: 'h-full bg-background border-r border-border flex flex-col',\r\n tabContainerClass: 'flex border-b border-border pt-[8px]',\r\n tabButtonClass: 'flex-1 px-2 py-[6.5px] text-xs font-medium transition-colors border-b-2',\r\n searchContainerClass: 'p-1 border-b border-border',\r\n menuContainerClass: 'flex-1 overflow-y-auto p-1 space-y-1',\r\n },\r\n}\r\n\r\nconst preset = computed(() => {\r\n return STYLE_PRESETS[props.styletype] ?? STYLE_PRESETS.default\r\n})\r\n\r\n/**\r\n * 루트 클래스\r\n */\r\nconst rootClasses = computed(() => {\r\n return cn(\r\n preset.value.containerClass,\r\n props.class\r\n )\r\n})\r\n</script>\r\n\r\n<template>\r\n <Transition name=\"slide\">\r\n <aside v-show=\"props.isVisible\" :class=\"rootClasses\" :style=\"{ width }\">\r\n <!-- 탭 헤더 -->\r\n <div :class=\"preset.tabContainerClass\">\r\n <button\r\n :class=\"cn(\r\n preset.tabButtonClass,\r\n activeTab === 'menu'\r\n ? 'border-primary text-primary'\r\n : 'border-transparent text-muted-foreground hover:text-foreground'\r\n )\"\r\n @click=\"handleTabChange('menu')\"\r\n >\r\n 기본메뉴\r\n </button>\r\n <button\r\n :class=\"cn(\r\n preset.tabButtonClass,\r\n activeTab === 'favorites'\r\n ? 'border-primary text-primary'\r\n : 'border-transparent text-muted-foreground hover:text-foreground'\r\n )\"\r\n @click=\"handleTabChange('favorites')\"\r\n >\r\n 즐겨찾기\r\n </button>\r\n </div>\r\n\r\n <!-- 검색 영역 -->\r\n <div :class=\"preset.searchContainerClass\">\r\n <div class=\"relative\">\r\n <JIcon\r\n name=\"search\"\r\n size=\"sm\"\r\n class=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground\"\r\n />\r\n <JInput\r\n v-model=\"searchQuery\"\r\n placeholder=\"메뉴 검색...\"\r\n :class=\"cn(\r\n 'pl-8',\r\n props.styletype === 'minimal' && 'h-8 text-xs'\r\n )\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 메뉴 목록 -->\r\n <div :class=\"preset.menuContainerClass\">\r\n <template v-if=\"activeTab === 'menu'\">\r\n <template v-if=\"filteredMenuItems.length > 0\">\r\n <div\r\n v-for=\"(item, index) in filteredMenuItems\"\r\n :key=\"item.menuKey || item.label || index\"\r\n class=\"flex items-center group\"\r\n >\r\n <JDynamicMenuItem\r\n :item=\"item\"\r\n :level=\"0\"\r\n :permissions=\"permissions\"\r\n :active-path=\"activePath\"\r\n :expanded-keys=\"expandedKeys\"\r\n :favorites=\"favorites\"\r\n :on-favorite-toggle=\"handleFavoriteToggle\"\r\n :is-favorite=\"isFavorite\"\r\n :styletype=\"styletype\"\r\n class=\"flex-1\"\r\n @menu-click=\"handleMenuClick\"\r\n @expand-change=\"handleExpandChange\"\r\n />\r\n </div>\r\n </template>\r\n <div v-else class=\"text-center py-8 text-muted-foreground\">\r\n <p>검색 결과가 없습니다.</p>\r\n </div>\r\n </template>\r\n\r\n <template v-else>\r\n <template v-if=\"filteredFavoriteItems.length > 0\">\r\n <JDynamicMenuItem\r\n v-for=\"(item, index) in filteredFavoriteItems\"\r\n :key=\"item.menuKey || item.label || index\"\r\n :item=\"item\"\r\n :level=\"0\"\r\n :permissions=\"permissions\"\r\n :active-path=\"activePath\"\r\n :expanded-keys=\"expandedKeys\"\r\n :styletype=\"styletype\"\r\n @menu-click=\"handleMenuClick\"\r\n @expand-change=\"handleExpandChange\"\r\n />\r\n </template>\r\n <div v-else class=\"text-center py-8 text-muted-foreground\">\r\n <p>즐겨찾기가 없습니다.</p>\r\n </div>\r\n </template>\r\n </div>\r\n </aside>\r\n </Transition>\r\n</template>\r\n\r\n<style scoped>\r\n.slide-enter-active,\r\n.slide-leave-active {\r\n transition: transform 0.3s ease, opacity 0.3s ease;\r\n}\r\n\r\n.slide-enter-from,\r\n.slide-leave-to {\r\n transform: translateX(-100%);\r\n opacity: 0;\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","route","useRoute","activeTab","ref","searchQuery","activePath","computed","expandedKeys","favoriteMenuItems","flattenFavorites","items","result","item","key","childFavorites","filteredMenuItems","query","searchInMenu","matchesLabel","filteredChildren","watch","filtered","keysToExpand","traverse","menuItems","filteredFavoriteItems","handleTabChange","tab","handleExpandChange","menuKey","expanded","handleMenuClick","event","handleFavoriteToggle","isFavorite","findMenuItemByKey","targetKey","found","STYLE_PRESETS","preset","rootClasses","cn","_createBlock","_Transition","_createElementVNode","_normalizeClass","_unref","_hoisted_1","_createVNode","JIcon","JInput","$event","_createElementBlock","_Fragment","_openBlock","_renderList","index","JDynamicMenuItem","_hoisted_2","_cache","_hoisted_3","_vShow"],"mappings":"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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { defineComponent as Q, ref as A, computed as y, watch as U, createBlock as $, openBlock as i, Transition as Y, withCtx as j, withDirectives as G, createElementVNode as u, normalizeStyle as H, normalizeClass as c, unref as w, createVNode as I, createElementBlock as f, Fragment as C, renderList as P, vShow as K } from "vue";
|
|
2
|
+
import { useRoute as O } from "vue-router";
|
|
3
|
+
import z from "./JSidebarSimple/JDynamicMenuItem.vue.js";
|
|
4
|
+
import X from "../atoms/JInput.vue.js";
|
|
5
|
+
import Z from "../atoms/JIcon.vue.js";
|
|
6
|
+
import { cn as g } from "../../lib/utils.js";
|
|
7
|
+
const _ = { class: "relative" }, ee = {
|
|
8
|
+
key: 1,
|
|
9
|
+
class: "text-center py-8 text-muted-foreground"
|
|
10
|
+
}, te = {
|
|
11
|
+
key: 1,
|
|
12
|
+
class: "text-center py-8 text-muted-foreground"
|
|
13
|
+
}, ie = /* @__PURE__ */ Q({
|
|
14
|
+
__name: "JSidebarAdvanced",
|
|
15
|
+
props: {
|
|
16
|
+
menuItems: {},
|
|
17
|
+
permissions: { default: () => [] },
|
|
18
|
+
favorites: { default: () => [] },
|
|
19
|
+
styletype: { default: "minimal" },
|
|
20
|
+
class: {},
|
|
21
|
+
width: { default: "280px" },
|
|
22
|
+
isVisible: { type: Boolean, default: !0 }
|
|
23
|
+
},
|
|
24
|
+
emits: ["menuClick", "favoriteChange"],
|
|
25
|
+
setup(d, { emit: q }) {
|
|
26
|
+
const a = d, E = q, N = O(), p = A("menu"), l = A(""), T = y(() => N.path), h = A(/* @__PURE__ */ new Set()), x = y(() => {
|
|
27
|
+
if (!Array.isArray(a.favorites) || a.favorites.length === 0)
|
|
28
|
+
return [];
|
|
29
|
+
if (!Array.isArray(a.menuItems) || a.menuItems.length === 0)
|
|
30
|
+
return [];
|
|
31
|
+
const e = (t) => {
|
|
32
|
+
const r = [];
|
|
33
|
+
if (!Array.isArray(t))
|
|
34
|
+
return r;
|
|
35
|
+
for (const n of t) {
|
|
36
|
+
const s = n.menuKey || n.label;
|
|
37
|
+
if (Array.isArray(a.favorites) && a.favorites.includes(s) && n.menuType === "L" && r.push({
|
|
38
|
+
...n,
|
|
39
|
+
children: void 0
|
|
40
|
+
// children 제거하여 1단계로만 표시
|
|
41
|
+
}), n.children && Array.isArray(n.children) && n.children.length > 0) {
|
|
42
|
+
const o = e(n.children);
|
|
43
|
+
r.push(...o);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return r;
|
|
47
|
+
};
|
|
48
|
+
return e(a.menuItems);
|
|
49
|
+
}), k = y(() => {
|
|
50
|
+
if (!Array.isArray(a.menuItems) || a.menuItems.length === 0)
|
|
51
|
+
return [];
|
|
52
|
+
if (!l.value || l.value.trim() === "")
|
|
53
|
+
return a.menuItems;
|
|
54
|
+
const e = l.value.toLowerCase().trim(), t = (r) => {
|
|
55
|
+
const n = [];
|
|
56
|
+
if (!Array.isArray(r))
|
|
57
|
+
return n;
|
|
58
|
+
for (const s of r) {
|
|
59
|
+
const b = s.label?.toLowerCase().includes(e) ?? !1;
|
|
60
|
+
let o;
|
|
61
|
+
s.children && Array.isArray(s.children) && s.children.length > 0 && (o = t(s.children)), (b || Array.isArray(o) && o.length > 0) && n.push({
|
|
62
|
+
...s,
|
|
63
|
+
children: o
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return n;
|
|
67
|
+
};
|
|
68
|
+
return t(a.menuItems);
|
|
69
|
+
});
|
|
70
|
+
U(
|
|
71
|
+
() => k.value,
|
|
72
|
+
(e) => {
|
|
73
|
+
if (!l.value || l.value.trim() === "")
|
|
74
|
+
return;
|
|
75
|
+
((n) => {
|
|
76
|
+
const s = /* @__PURE__ */ new Set(), b = (o) => {
|
|
77
|
+
if (Array.isArray(o)) {
|
|
78
|
+
for (const v of o)
|
|
79
|
+
if (v.children && Array.isArray(v.children) && v.children.length > 0) {
|
|
80
|
+
const J = v.menuKey || v.label;
|
|
81
|
+
s.add(J), b(v.children);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
return b(n), s;
|
|
86
|
+
})(e).forEach((n) => {
|
|
87
|
+
h.value.add(n);
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
{ immediate: !1 }
|
|
91
|
+
);
|
|
92
|
+
const B = y(() => {
|
|
93
|
+
if (!Array.isArray(x.value) || x.value.length === 0)
|
|
94
|
+
return [];
|
|
95
|
+
if (!l.value || l.value.trim() === "")
|
|
96
|
+
return x.value;
|
|
97
|
+
const e = l.value.toLowerCase().trim();
|
|
98
|
+
return x.value.filter(
|
|
99
|
+
(t) => t.label?.toLowerCase().includes(e) ?? !1
|
|
100
|
+
);
|
|
101
|
+
}), F = (e) => {
|
|
102
|
+
p.value !== e && (p.value = e, l.value = "");
|
|
103
|
+
}, L = (e, t) => {
|
|
104
|
+
e && (t ? h.value.add(e) : h.value.delete(e));
|
|
105
|
+
}, M = (e) => {
|
|
106
|
+
E("menuClick", e);
|
|
107
|
+
}, R = (e) => {
|
|
108
|
+
if (!e) return;
|
|
109
|
+
const t = a.favorites?.includes(e) ?? !1;
|
|
110
|
+
E("favoriteChange", e, !t);
|
|
111
|
+
}, S = (e, t) => {
|
|
112
|
+
for (const r of e) {
|
|
113
|
+
if ((r.menuKey || r.label) === t)
|
|
114
|
+
return r;
|
|
115
|
+
if (r.children && r.children.length > 0) {
|
|
116
|
+
const s = S(r.children, t);
|
|
117
|
+
if (s) return s;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}, W = (e) => !e || !a.favorites?.includes(e) ? !1 : S(a.menuItems, e)?.menuType === "L", V = {
|
|
122
|
+
default: {
|
|
123
|
+
containerClass: "h-full bg-background border-r border-border flex flex-col",
|
|
124
|
+
tabContainerClass: "flex border-b border-border",
|
|
125
|
+
tabButtonClass: "flex-1 px-4 py-2 text-sm font-medium transition-colors border-b-2 hover:bg-accent/50",
|
|
126
|
+
searchContainerClass: "p-2 border-b border-border",
|
|
127
|
+
menuContainerClass: "flex-1 overflow-y-auto p-2 space-y-1"
|
|
128
|
+
},
|
|
129
|
+
minimal: {
|
|
130
|
+
containerClass: "h-full bg-background border-r border-border flex flex-col",
|
|
131
|
+
tabContainerClass: "flex border-b border-border pt-[8px]",
|
|
132
|
+
tabButtonClass: "flex-1 px-2 py-[6.5px] text-xs font-medium transition-colors border-b-2",
|
|
133
|
+
searchContainerClass: "p-1 border-b border-border",
|
|
134
|
+
menuContainerClass: "flex-1 overflow-y-auto p-1 space-y-1"
|
|
135
|
+
}
|
|
136
|
+
}, m = y(() => V[a.styletype] ?? V.default), D = y(() => g(
|
|
137
|
+
m.value.containerClass,
|
|
138
|
+
a.class
|
|
139
|
+
));
|
|
140
|
+
return (e, t) => (i(), $(Y, { name: "slide" }, {
|
|
141
|
+
default: j(() => [
|
|
142
|
+
G(u("aside", {
|
|
143
|
+
class: c(D.value),
|
|
144
|
+
style: H({ width: d.width })
|
|
145
|
+
}, [
|
|
146
|
+
u("div", {
|
|
147
|
+
class: c(m.value.tabContainerClass)
|
|
148
|
+
}, [
|
|
149
|
+
u("button", {
|
|
150
|
+
class: c(w(g)(
|
|
151
|
+
m.value.tabButtonClass,
|
|
152
|
+
p.value === "menu" ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"
|
|
153
|
+
)),
|
|
154
|
+
onClick: t[0] || (t[0] = (r) => F("menu"))
|
|
155
|
+
}, " 기본메뉴 ", 2),
|
|
156
|
+
u("button", {
|
|
157
|
+
class: c(w(g)(
|
|
158
|
+
m.value.tabButtonClass,
|
|
159
|
+
p.value === "favorites" ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"
|
|
160
|
+
)),
|
|
161
|
+
onClick: t[1] || (t[1] = (r) => F("favorites"))
|
|
162
|
+
}, " 즐겨찾기 ", 2)
|
|
163
|
+
], 2),
|
|
164
|
+
u("div", {
|
|
165
|
+
class: c(m.value.searchContainerClass)
|
|
166
|
+
}, [
|
|
167
|
+
u("div", _, [
|
|
168
|
+
I(Z, {
|
|
169
|
+
name: "search",
|
|
170
|
+
size: "sm",
|
|
171
|
+
class: "absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground"
|
|
172
|
+
}),
|
|
173
|
+
I(X, {
|
|
174
|
+
modelValue: l.value,
|
|
175
|
+
"onUpdate:modelValue": t[2] || (t[2] = (r) => l.value = r),
|
|
176
|
+
placeholder: "메뉴 검색...",
|
|
177
|
+
class: c(w(g)(
|
|
178
|
+
"pl-8",
|
|
179
|
+
a.styletype === "minimal" && "h-8 text-xs"
|
|
180
|
+
))
|
|
181
|
+
}, null, 8, ["modelValue", "class"])
|
|
182
|
+
])
|
|
183
|
+
], 2),
|
|
184
|
+
u("div", {
|
|
185
|
+
class: c(m.value.menuContainerClass)
|
|
186
|
+
}, [
|
|
187
|
+
p.value === "menu" ? (i(), f(C, { key: 0 }, [
|
|
188
|
+
k.value.length > 0 ? (i(!0), f(C, { key: 0 }, P(k.value, (r, n) => (i(), f("div", {
|
|
189
|
+
key: r.menuKey || r.label || n,
|
|
190
|
+
class: "flex items-center group"
|
|
191
|
+
}, [
|
|
192
|
+
I(z, {
|
|
193
|
+
item: r,
|
|
194
|
+
level: 0,
|
|
195
|
+
permissions: d.permissions,
|
|
196
|
+
"active-path": T.value,
|
|
197
|
+
"expanded-keys": h.value,
|
|
198
|
+
favorites: d.favorites,
|
|
199
|
+
"on-favorite-toggle": R,
|
|
200
|
+
"is-favorite": W,
|
|
201
|
+
styletype: d.styletype,
|
|
202
|
+
class: "flex-1",
|
|
203
|
+
onMenuClick: M,
|
|
204
|
+
onExpandChange: L
|
|
205
|
+
}, null, 8, ["item", "permissions", "active-path", "expanded-keys", "favorites", "styletype"])
|
|
206
|
+
]))), 128)) : (i(), f("div", ee, [...t[3] || (t[3] = [
|
|
207
|
+
u("p", null, "검색 결과가 없습니다.", -1)
|
|
208
|
+
])]))
|
|
209
|
+
], 64)) : (i(), f(C, { key: 1 }, [
|
|
210
|
+
B.value.length > 0 ? (i(!0), f(C, { key: 0 }, P(B.value, (r, n) => (i(), $(z, {
|
|
211
|
+
key: r.menuKey || r.label || n,
|
|
212
|
+
item: r,
|
|
213
|
+
level: 0,
|
|
214
|
+
permissions: d.permissions,
|
|
215
|
+
"active-path": T.value,
|
|
216
|
+
"expanded-keys": h.value,
|
|
217
|
+
styletype: d.styletype,
|
|
218
|
+
onMenuClick: M,
|
|
219
|
+
onExpandChange: L
|
|
220
|
+
}, null, 8, ["item", "permissions", "active-path", "expanded-keys", "styletype"]))), 128)) : (i(), f("div", te, [...t[4] || (t[4] = [
|
|
221
|
+
u("p", null, "즐겨찾기가 없습니다.", -1)
|
|
222
|
+
])]))
|
|
223
|
+
], 64))
|
|
224
|
+
], 2)
|
|
225
|
+
], 6), [
|
|
226
|
+
[K, a.isVisible]
|
|
227
|
+
])
|
|
228
|
+
]),
|
|
229
|
+
_: 1
|
|
230
|
+
}));
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
export {
|
|
234
|
+
ie as default
|
|
235
|
+
};
|
|
236
|
+
//# sourceMappingURL=JSidebarAdvanced.vue2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JSidebarAdvanced.vue2.js","sources":["../../../../src/components/organisms/JSidebarAdvanced.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { ref, computed, watch } from 'vue'\r\nimport { useRoute } from 'vue-router'\r\nimport type { SidebarMenuItem, MenuPermission, MenuClickEvent } from '@/types/sidebar-menu.types'\r\nimport JDynamicMenuItem from './JSidebarSimple/JDynamicMenuItem.vue'\r\nimport JInput from '@/components/atoms/JInput.vue'\r\nimport JIcon from '@/components/atoms/JIcon.vue'\r\nimport { cn } from '@/lib/utils'\r\n\r\n/**\r\n * JSidebarAdvanced - 고급 사이드바 컴포넌트\r\n * Advanced Sidebar Component\r\n * \r\n * @description\r\n * 검색, 즐겨찾기, 다단계 메뉴를 지원하는 고급 사이드바 컴포넌트입니다.\r\n * 기본 메뉴와 즐겨찾기 탭을 제공합니다.\r\n * \r\n * @example\r\n * ```vue\r\n * <JSidebarAdvanced\r\n * :menu-items=\"menuItems\"\r\n * :permissions=\"userPermissions\"\r\n * :favorites=\"favoriteMenuKeys\"\r\n * @menu-click=\"handleMenuClick\"\r\n * @favorite-change=\"handleFavoriteChange\"\r\n * />\r\n * ```\r\n * \r\n * @example JSON 메뉴 데이터 예시\r\n * ```json\r\n * [\r\n * {\r\n * \"label\": \"대시보드\",\r\n * \"icon\": \"house\",\r\n * \"menuType\": \"L\",\r\n * \"menuKey\": 1,\r\n * \"path\": \"/dashboard\"\r\n * },\r\n * {\r\n * \"label\": \"재고 관리\",\r\n * \"icon\": \"package\",\r\n * \"menuType\": \"F\",\r\n * \"menuKey\": 2,\r\n * \"children\": [\r\n * {\r\n * \"label\": \"재고 현황\",\r\n * \"menuType\": \"L\",\r\n * \"menuKey\": 21,\r\n * \"path\": \"/inventory/status\"\r\n * },\r\n * {\r\n * \"label\": \"입고 관리\",\r\n * \"menuType\": \"F\",\r\n * \"menuKey\": 22,\r\n * \"children\": [\r\n * {\r\n * \"label\": \"입고 등록\",\r\n * \"menuType\": \"L\",\r\n * \"menuKey\": 221,\r\n * \"path\": \"/inventory/receiving/register\"\r\n * }\r\n * ]\r\n * }\r\n * ]\r\n * }\r\n * ]\r\n * ```\r\n */\r\n\r\ntype TabType = 'menu' | 'favorites'\r\n\r\ntype StyleType = 'default' | 'minimal'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 메뉴 아이템 목록 */\r\n menuItems: SidebarMenuItem[]\r\n /** 권한 목록 */\r\n permissions?: MenuPermission[]\r\n /** 즐겨찾기 메뉴 키 목록 */\r\n favorites?: (number | string)[]\r\n /** 스타일 타입 */\r\n styletype?: StyleType\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n /** 너비 */\r\n width?: string\r\n /** 표시 여부 */\r\n isVisible?: boolean\r\n }>(),\r\n {\r\n permissions: () => [],\r\n favorites: () => [],\r\n styletype: 'minimal',\r\n width: '280px',\r\n isVisible: true,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n /** 메뉴 클릭 이벤트 */\r\n menuClick: [event: MenuClickEvent]\r\n /** 즐겨찾기 변경 이벤트 */\r\n favoriteChange: [menuKey: number | string | undefined, isFavorite: boolean]\r\n}>()\r\n\r\n// vue-router가 설정되지 않은 경우를 대비 (Storybook에서 router가 제공됨)\r\nconst route = useRoute()\r\n\r\n/**\r\n * 현재 활성 탭\r\n */\r\nconst activeTab = ref<TabType>('menu')\r\n\r\n/**\r\n * 검색어\r\n */\r\nconst searchQuery = ref('')\r\n\r\n/**\r\n * 현재 활성화된 경로\r\n */\r\nconst activePath = computed(() => route.path)\r\n\r\n/**\r\n * 확장된 메뉴 키 목록\r\n */\r\nconst expandedKeys = ref<Set<number | string>>(new Set())\r\n\r\n/**\r\n * 즐겨찾기 메뉴 아이템 목록\r\n * 즐겨찾기는 dept 없이 1단계로만 평탄화하여 표시\r\n */\r\nconst favoriteMenuItems = computed(() => {\r\n if (!Array.isArray(props.favorites) || props.favorites.length === 0) {\r\n return []\r\n }\r\n\r\n if (!Array.isArray(props.menuItems) || props.menuItems.length === 0) {\r\n return []\r\n }\r\n\r\n /**\r\n * 메뉴 아이템을 재귀적으로 순회하며 즐겨찾기만 추출\r\n * 즐겨찾기에서는 dept 없이 1단계로만 평탄화\r\n * menuType L(Link)만 포함하고 F(Folder)는 제외\r\n */\r\n const flattenFavorites = (items: SidebarMenuItem[]): SidebarMenuItem[] => {\r\n const result: SidebarMenuItem[] = []\r\n\r\n if (!Array.isArray(items)) {\r\n return result\r\n }\r\n\r\n for (const item of items) {\r\n const key = item.menuKey || item.label\r\n const isFavorite = Array.isArray(props.favorites) && props.favorites.includes(key)\r\n\r\n // 즐겨찾기이고 menuType이 L(Link)인 경우만 추가 (F는 제외)\r\n if (isFavorite && item.menuType === 'L') {\r\n result.push({\r\n ...item,\r\n children: undefined, // children 제거하여 1단계로만 표시\r\n })\r\n }\r\n\r\n // 하위 메뉴도 재귀적으로 탐색\r\n if (item.children && Array.isArray(item.children) && item.children.length > 0) {\r\n const childFavorites = flattenFavorites(item.children)\r\n result.push(...childFavorites)\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n return flattenFavorites(props.menuItems)\r\n})\r\n\r\n/**\r\n * 검색어로 필터링된 메뉴 아이템\r\n * 재귀적으로 children까지 검색\r\n */\r\nconst filteredMenuItems = computed(() => {\r\n if (!Array.isArray(props.menuItems) || props.menuItems.length === 0) {\r\n return []\r\n }\r\n\r\n if (!searchQuery.value || searchQuery.value.trim() === '') {\r\n return props.menuItems\r\n }\r\n\r\n const query = searchQuery.value.toLowerCase().trim()\r\n\r\n /**\r\n * 메뉴 아이템을 재귀적으로 검색\r\n */\r\n const searchInMenu = (items: SidebarMenuItem[]): SidebarMenuItem[] => {\r\n const result: SidebarMenuItem[] = []\r\n\r\n if (!Array.isArray(items)) {\r\n return result\r\n }\r\n\r\n for (const item of items) {\r\n const matchesLabel = item.label?.toLowerCase().includes(query) ?? false\r\n\r\n // 하위 메뉴 검색\r\n let filteredChildren: SidebarMenuItem[] | undefined = undefined\r\n if (item.children && Array.isArray(item.children) && item.children.length > 0) {\r\n filteredChildren = searchInMenu(item.children)\r\n }\r\n\r\n // 현재 메뉴나 하위 메뉴 중 하나라도 매칭되면 포함\r\n if (matchesLabel || (Array.isArray(filteredChildren) && filteredChildren.length > 0)) {\r\n result.push({\r\n ...item,\r\n children: filteredChildren,\r\n })\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n return searchInMenu(props.menuItems)\r\n})\r\n\r\n/**\r\n * 검색 결과에 따라 부모 메뉴 자동 확장\r\n * computed 외부에서 watch를 통해 처리\r\n */\r\nwatch(\r\n () => filteredMenuItems.value,\r\n (filtered) => {\r\n if (!searchQuery.value || searchQuery.value.trim() === '') {\r\n return\r\n }\r\n\r\n // 검색 결과에서 매칭된 하위 메뉴가 있는 부모를 찾아 확장\r\n const findParentsWithMatches = (items: SidebarMenuItem[]): Set<number | string> => {\r\n const keysToExpand = new Set<number | string>()\r\n\r\n const traverse = (menuItems: SidebarMenuItem[]): void => {\r\n if (!Array.isArray(menuItems)) {\r\n return\r\n }\r\n\r\n for (const item of menuItems) {\r\n if (item.children && Array.isArray(item.children) && item.children.length > 0) {\r\n const key = item.menuKey || item.label\r\n keysToExpand.add(key)\r\n traverse(item.children)\r\n }\r\n }\r\n }\r\n\r\n traverse(items)\r\n return keysToExpand\r\n }\r\n\r\n const keysToExpand = findParentsWithMatches(filtered)\r\n keysToExpand.forEach(key => {\r\n expandedKeys.value.add(key)\r\n })\r\n },\r\n { immediate: false }\r\n)\r\n\r\n/**\r\n * 검색어로 필터링된 즐겨찾기 메뉴 아이템\r\n * 즐겨찾기는 이미 평탄화되어 있으므로 단순 필터링만 수행\r\n */\r\nconst filteredFavoriteItems = computed(() => {\r\n if (!Array.isArray(favoriteMenuItems.value) || favoriteMenuItems.value.length === 0) {\r\n return []\r\n }\r\n\r\n if (!searchQuery.value || searchQuery.value.trim() === '') {\r\n return favoriteMenuItems.value\r\n }\r\n\r\n const query = searchQuery.value.toLowerCase().trim()\r\n\r\n // 즐겨찾기는 이미 평탄화되어 1단계이므로 단순 필터링만 수행\r\n return favoriteMenuItems.value.filter((item) =>\r\n item.label?.toLowerCase().includes(query) ?? false\r\n )\r\n})\r\n\r\n\r\n/**\r\n * 탭 변경 핸들러\r\n * 탭 전환 시 검색 쿼리를 초기화하여 각 탭의 독립적인 검색 상태 유지\r\n */\r\nconst handleTabChange = (tab: TabType) => {\r\n if (activeTab.value !== tab) {\r\n activeTab.value = tab\r\n // 탭 전환 시 검색 쿼리 초기화 (선택적 - UX 고려)\r\n // 검색 쿼리를 유지하려면 아래 라인을 제거하세요\r\n searchQuery.value = ''\r\n }\r\n}\r\n\r\n/**\r\n * 확장 상태 변경 핸들러\r\n */\r\nconst handleExpandChange = (menuKey: number | string | undefined, expanded: boolean) => {\r\n if (!menuKey) return\r\n\r\n if (expanded) {\r\n expandedKeys.value.add(menuKey)\r\n } else {\r\n expandedKeys.value.delete(menuKey)\r\n }\r\n}\r\n\r\n/**\r\n * 메뉴 클릭 핸들러\r\n */\r\nconst handleMenuClick = (event: MenuClickEvent) => {\r\n emit('menuClick', event)\r\n}\r\n\r\n/**\r\n * 즐겨찾기 토글 핸들러\r\n */\r\nconst handleFavoriteToggle = (menuKey: number | string | undefined) => {\r\n if (!menuKey) return\r\n\r\n const isFavorite = props.favorites?.includes(menuKey) ?? false\r\n emit('favoriteChange', menuKey, !isFavorite)\r\n}\r\n\r\n/**\r\n * 메뉴 아이템에서 특정 menuKey를 찾는 헬퍼 함수\r\n */\r\nconst findMenuItemByKey = (items: SidebarMenuItem[], targetKey: number | string): SidebarMenuItem | null => {\r\n for (const item of items) {\r\n const key = item.menuKey || item.label\r\n if (key === targetKey) {\r\n return item\r\n }\r\n if (item.children && item.children.length > 0) {\r\n const found = findMenuItemByKey(item.children, targetKey)\r\n if (found) return found\r\n }\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * 메뉴가 즐겨찾기인지 확인 (L 타입만 즐겨찾기 가능)\r\n */\r\nconst isFavorite = (menuKey: number | string | undefined): boolean => {\r\n if (!menuKey) return false\r\n if (!props.favorites?.includes(menuKey)) return false\r\n \r\n // menuType이 L인 경우만 즐겨찾기로 인정\r\n const menuItem = findMenuItemByKey(props.menuItems, menuKey)\r\n return menuItem?.menuType === 'L'\r\n}\r\n\r\n/**\r\n * 스타일 프리셋\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, {\r\n containerClass: string\r\n tabContainerClass: string\r\n tabButtonClass: string\r\n searchContainerClass: string\r\n menuContainerClass: string\r\n}> = {\r\n default: {\r\n containerClass: 'h-full bg-background border-r border-border flex flex-col',\r\n tabContainerClass: 'flex border-b border-border',\r\n tabButtonClass: 'flex-1 px-4 py-2 text-sm font-medium transition-colors border-b-2 hover:bg-accent/50',\r\n searchContainerClass: 'p-2 border-b border-border',\r\n menuContainerClass: 'flex-1 overflow-y-auto p-2 space-y-1',\r\n },\r\n minimal: {\r\n containerClass: 'h-full bg-background border-r border-border flex flex-col',\r\n tabContainerClass: 'flex border-b border-border pt-[8px]',\r\n tabButtonClass: 'flex-1 px-2 py-[6.5px] text-xs font-medium transition-colors border-b-2',\r\n searchContainerClass: 'p-1 border-b border-border',\r\n menuContainerClass: 'flex-1 overflow-y-auto p-1 space-y-1',\r\n },\r\n}\r\n\r\nconst preset = computed(() => {\r\n return STYLE_PRESETS[props.styletype] ?? STYLE_PRESETS.default\r\n})\r\n\r\n/**\r\n * 루트 클래스\r\n */\r\nconst rootClasses = computed(() => {\r\n return cn(\r\n preset.value.containerClass,\r\n props.class\r\n )\r\n})\r\n</script>\r\n\r\n<template>\r\n <Transition name=\"slide\">\r\n <aside v-show=\"props.isVisible\" :class=\"rootClasses\" :style=\"{ width }\">\r\n <!-- 탭 헤더 -->\r\n <div :class=\"preset.tabContainerClass\">\r\n <button\r\n :class=\"cn(\r\n preset.tabButtonClass,\r\n activeTab === 'menu'\r\n ? 'border-primary text-primary'\r\n : 'border-transparent text-muted-foreground hover:text-foreground'\r\n )\"\r\n @click=\"handleTabChange('menu')\"\r\n >\r\n 기본메뉴\r\n </button>\r\n <button\r\n :class=\"cn(\r\n preset.tabButtonClass,\r\n activeTab === 'favorites'\r\n ? 'border-primary text-primary'\r\n : 'border-transparent text-muted-foreground hover:text-foreground'\r\n )\"\r\n @click=\"handleTabChange('favorites')\"\r\n >\r\n 즐겨찾기\r\n </button>\r\n </div>\r\n\r\n <!-- 검색 영역 -->\r\n <div :class=\"preset.searchContainerClass\">\r\n <div class=\"relative\">\r\n <JIcon\r\n name=\"search\"\r\n size=\"sm\"\r\n class=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground\"\r\n />\r\n <JInput\r\n v-model=\"searchQuery\"\r\n placeholder=\"메뉴 검색...\"\r\n :class=\"cn(\r\n 'pl-8',\r\n props.styletype === 'minimal' && 'h-8 text-xs'\r\n )\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 메뉴 목록 -->\r\n <div :class=\"preset.menuContainerClass\">\r\n <template v-if=\"activeTab === 'menu'\">\r\n <template v-if=\"filteredMenuItems.length > 0\">\r\n <div\r\n v-for=\"(item, index) in filteredMenuItems\"\r\n :key=\"item.menuKey || item.label || index\"\r\n class=\"flex items-center group\"\r\n >\r\n <JDynamicMenuItem\r\n :item=\"item\"\r\n :level=\"0\"\r\n :permissions=\"permissions\"\r\n :active-path=\"activePath\"\r\n :expanded-keys=\"expandedKeys\"\r\n :favorites=\"favorites\"\r\n :on-favorite-toggle=\"handleFavoriteToggle\"\r\n :is-favorite=\"isFavorite\"\r\n :styletype=\"styletype\"\r\n class=\"flex-1\"\r\n @menu-click=\"handleMenuClick\"\r\n @expand-change=\"handleExpandChange\"\r\n />\r\n </div>\r\n </template>\r\n <div v-else class=\"text-center py-8 text-muted-foreground\">\r\n <p>검색 결과가 없습니다.</p>\r\n </div>\r\n </template>\r\n\r\n <template v-else>\r\n <template v-if=\"filteredFavoriteItems.length > 0\">\r\n <JDynamicMenuItem\r\n v-for=\"(item, index) in filteredFavoriteItems\"\r\n :key=\"item.menuKey || item.label || index\"\r\n :item=\"item\"\r\n :level=\"0\"\r\n :permissions=\"permissions\"\r\n :active-path=\"activePath\"\r\n :expanded-keys=\"expandedKeys\"\r\n :styletype=\"styletype\"\r\n @menu-click=\"handleMenuClick\"\r\n @expand-change=\"handleExpandChange\"\r\n />\r\n </template>\r\n <div v-else class=\"text-center py-8 text-muted-foreground\">\r\n <p>즐겨찾기가 없습니다.</p>\r\n </div>\r\n </template>\r\n </div>\r\n </aside>\r\n </Transition>\r\n</template>\r\n\r\n<style scoped>\r\n.slide-enter-active,\r\n.slide-leave-active {\r\n transition: transform 0.3s ease, opacity 0.3s ease;\r\n}\r\n\r\n.slide-enter-from,\r\n.slide-leave-to {\r\n transform: translateX(-100%);\r\n opacity: 0;\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","route","useRoute","activeTab","ref","searchQuery","activePath","computed","expandedKeys","favoriteMenuItems","flattenFavorites","items","result","item","key","childFavorites","filteredMenuItems","query","searchInMenu","matchesLabel","filteredChildren","watch","filtered","keysToExpand","traverse","menuItems","filteredFavoriteItems","handleTabChange","tab","handleExpandChange","menuKey","expanded","handleMenuClick","event","handleFavoriteToggle","isFavorite","findMenuItemByKey","targetKey","found","STYLE_PRESETS","preset","rootClasses","cn","_createBlock","_Transition","_createElementVNode","_normalizeClass","_unref","_hoisted_1","_createVNode","JIcon","JInput","$event","_createElementBlock","_Fragment","_openBlock","_renderList","index","JDynamicMenuItem","_hoisted_2","_cache","_hoisted_3","_vShow"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),F=require("vue-router"),f=require("../../atoms/JIcon.vue.cjs"),u=require("../../../lib/utils.cjs"),P={key:1,class:"w-4 flex-shrink-0"},S={key:0,class:"w-full"},E=e.defineComponent({__name:"JDynamicMenuItem",props:{item:{},level:{default:0},permissions:{default:()=>[]},activePath:{},expandedKeys:{default:()=>new Set},favorites:{default:()=>[]},onFavoriteToggle:{},isFavorite:{},styletype:{default:"default"},className:{},maxDepth:{default:10}},emits:["menuClick","expandChange"],setup(t,{emit:h}){const n=t,s=h,k=F.useRouter(),x=e.computed(()=>u.hasMenuPermission(n.item.menuKey,n.permissions)),m=e.computed(()=>!n.item.path||!n.activePath?!1:n.activePath===n.item.path),c=e.computed(()=>n.item.menuType==="F"||Array.isArray(n.item.children)&&n.item.children.length>0),d=e.computed(()=>{if(!c.value)return!1;const l=n.item.menuKey||n.item.label;return n.expandedKeys?.has(l)??!1}),v=e.computed(()=>n.item.disabled||!x.value),C=e.computed(()=>({paddingLeft:`${12+(n.level||0)*16}px`})),p=l=>{if(v.value){l.preventDefault();return}if(c.value){const a=n.item.menuKey||n.item.label,r=!d.value;s("expandChange",a,r)}else n.item.path&&(k.push(n.item.path),s("menuClick",{menuItem:n.item,path:[n.item],event:l}))},g={default:{itemClass:"flex items-center gap-2 py-2 rounded-md cursor-pointer transition-colors group",labelClass:"flex-1 truncate",iconSize:"sm"},minimal:{itemClass:"flex items-center gap-1.5 py-1.5 rounded-md cursor-pointer transition-colors group",labelClass:"flex-1 truncate text-xs",iconSize:"sm"}},i=e.computed(()=>g[n.styletype]??g.default),b=e.computed(()=>d.value?"chevronDown":"chevronRight");return(l,a)=>{const r=e.resolveComponent("JDynamicMenuItem",!0);return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(u.cn)("w-full",t.className))},[e.createElementVNode("div",{class:e.normalizeClass(e.unref(u.cn)(i.value.itemClass,{"bg-accent text-accent-foreground":m.value,"hover:bg-accent/50":!v.value&&!m.value,"opacity-50 cursor-not-allowed":v.value,"font-medium":m.value})),style:e.normalizeStyle(C.value),onClick:p},[c.value?(e.openBlock(),e.createBlock(f.default,{key:0,name:b.value,size:i.value.iconSize,class:"flex-shrink-0"},null,8,["name","size"])):(e.openBlock(),e.createElementBlock("span",P)),t.item.icon?(e.openBlock(),e.createBlock(f.default,{key:2,name:t.item.icon,size:i.value.iconSize,class:"flex-shrink-0"},null,8,["name","size"])):e.createCommentVNode("",!0),e.createElementVNode("span",{class:e.normalizeClass(i.value.labelClass)},e.toDisplayString(t.item.label),3),t.item.menuKey&&t.item.menuType==="L"&&t.onFavoriteToggle?(e.openBlock(),e.createElementBlock("button",{key:3,class:e.normalizeClass(e.unref(u.cn)("opacity-0 group-hover:opacity-100 transition-opacity hover:bg-accent rounded flex-shrink-0",n.styletype==="minimal"?"p-0.5":"p-1",t.isFavorite&&t.isFavorite(t.item.menuKey)&&"opacity-100")),onClick:a[0]||(a[0]=e.withModifiers(o=>t.onFavoriteToggle(t.item.menuKey),["stop"]))},[e.createVNode(f.default,{name:(t.isFavorite&&t.isFavorite(t.item.menuKey),"star"),size:i.value.iconSize,class:e.normalizeClass(t.isFavorite&&t.isFavorite(t.item.menuKey)?"text-yellow-500 fill-yellow-500":"text-muted-foreground")},null,8,["name","size","class"])],2)):e.createCommentVNode("",!0)],6),c.value&&d.value&&t.item.children&&Array.isArray(t.item.children)&&t.item.children.length>0&&t.level+1<t.maxDepth?(e.openBlock(),e.createElementBlock("div",S,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.item.children,(o,z)=>(e.openBlock(),e.createBlock(r,{key:o.menuKey||o.label||z,item:o,level:t.level+1,"max-depth":t.maxDepth,permissions:t.permissions,"active-path":t.activePath,"expanded-keys":t.expandedKeys,favorites:t.favorites,"on-favorite-toggle":t.onFavoriteToggle,"is-favorite":t.isFavorite,styletype:t.styletype,onMenuClick:a[1]||(a[1]=y=>s("menuClick",y)),onExpandChange:a[2]||(a[2]=(y,B)=>s("expandChange",y,B))},null,8,["item","level","max-depth","permissions","active-path","expanded-keys","favorites","on-favorite-toggle","is-favorite","styletype"]))),128))])):e.createCommentVNode("",!0)],2)}}});exports.default=E;
|
|
2
|
+
//# sourceMappingURL=JDynamicMenuItem.vue.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JDynamicMenuItem.vue.cjs","sources":["../../../../../src/components/organisms/JSidebarSimple/JDynamicMenuItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { useRouter } from 'vue-router'\r\nimport type { SidebarMenuItem, MenuPermission, MenuClickEvent } from '@/types/sidebar-menu.types'\r\nimport JIcon from '@/components/atoms/JIcon.vue'\r\nimport { cn, hasMenuPermission } from '@/lib/utils'\r\n\r\n/**\r\n * JDynamicMenuItem - 재귀적 메뉴 아이템 컴포넌트\r\n * Recursive Menu Item Component\r\n * \r\n * @description\r\n * 다단계 메뉴 구조를 재귀적으로 렌더링하는 컴포넌트입니다.\r\n * 폴더 타입 메뉴는 확장/축소가 가능하고, 링크 타입 메뉴는 클릭 시 라우팅합니다.\r\n */\r\n\r\ntype StyleType = 'default' | 'minimal'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 메뉴 아이템 */\r\n item: SidebarMenuItem\r\n /** 메뉴 레벨 (들여쓰기용, 0부터 시작) */\r\n level?: number\r\n /** 권한 목록 */\r\n permissions?: MenuPermission[]\r\n /** 활성화된 메뉴 경로 */\r\n activePath?: string\r\n /** 확장된 메뉴 키 목록 */\r\n expandedKeys?: Set<number | string>\r\n /** 즐겨찾기 메뉴 키 목록 */\r\n favorites?: (number | string)[]\r\n /** 즐겨찾기 변경 핸들러 */\r\n onFavoriteToggle?: (menuKey: number | string | undefined) => void\r\n /** 즐겨찾기 확인 함수 */\r\n isFavorite?: (menuKey: number | string | undefined) => boolean\r\n /** 스타일 타입 */\r\n styletype?: StyleType\r\n /** 추가 CSS 클래스 */\r\n className?: string\r\n /** 최대 깊이 제한 (무한 루프 방지, 기본값: 10) */\r\n maxDepth?: number\r\n }>(),\r\n {\r\n level: 0,\r\n permissions: () => [],\r\n expandedKeys: () => new Set(),\r\n favorites: () => [],\r\n styletype: 'default',\r\n maxDepth: 10,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n /** 메뉴 클릭 이벤트 */\r\n menuClick: [event: MenuClickEvent]\r\n /** 확장 상태 변경 이벤트 */\r\n expandChange: [menuKey: number | string | undefined, expanded: boolean]\r\n}>()\r\n\r\nconst router = useRouter()\r\n\r\n/**\r\n * 권한 체크 함수\r\n * Permission check function\r\n * hasMenuPermission 유틸리티 함수를 사용하여 일관성 유지\r\n */\r\nconst checkPermission = computed(() => {\r\n return hasMenuPermission(props.item.menuKey, props.permissions)\r\n})\r\n\r\n/**\r\n * 메뉴가 활성화되어 있는지 여부\r\n */\r\nconst isActive = computed(() => {\r\n if (!props.item.path || !props.activePath) return false\r\n return props.activePath === props.item.path\r\n})\r\n\r\n/**\r\n * 메뉴 타입이 폴더인지 여부\r\n * 순환 참조 방지: children이 유효한 배열인지 확인\r\n */\r\nconst isFolder = computed(() => {\r\n return props.item.menuType === 'F' || (Array.isArray(props.item.children) && props.item.children.length > 0)\r\n})\r\n\r\n/**\r\n * 메뉴가 확장되어 있는지 여부\r\n */\r\nconst isExpanded = computed(() => {\r\n if (!isFolder.value) return false\r\n const key = props.item.menuKey || props.item.label\r\n return props.expandedKeys?.has(key) ?? false\r\n})\r\n\r\n/**\r\n * 메뉴가 비활성화되어 있는지 여부\r\n */\r\nconst isDisabled = computed(() => {\r\n return props.item.disabled || !checkPermission.value\r\n})\r\n\r\n/**\r\n * 레벨별 들여쓰기 스타일\r\n * Tailwind의 표준 클래스는 제한적이므로 인라인 스타일 사용\r\n */\r\nconst indentStyle = computed(() => {\r\n const basePadding = 12 // 기본 패딩 (px)\r\n const level = props.level || 0\r\n const levelPadding = level * 16 // 레벨당 16px\r\n const totalPadding = basePadding + levelPadding\r\n return { paddingLeft: `${totalPadding}px` }\r\n})\r\n\r\n/**\r\n * 메뉴 클릭 핸들러\r\n */\r\nconst handleMenuClick = (event: MouseEvent) => {\r\n if (isDisabled.value) {\r\n event.preventDefault()\r\n return\r\n }\r\n\r\n if (isFolder.value) {\r\n // 폴더 타입: 확장/축소 토글\r\n const key = props.item.menuKey || props.item.label\r\n const newExpanded = !isExpanded.value\r\n emit('expandChange', key, newExpanded)\r\n } else if (props.item.path) {\r\n // 링크 타입: 라우팅\r\n router.push(props.item.path)\r\n \r\n // 메뉴 클릭 이벤트 발생\r\n emit('menuClick', {\r\n menuItem: props.item,\r\n path: [props.item], // 단순화된 경로 (필요시 부모 경로 포함하도록 확장 가능)\r\n event,\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * 스타일 프리셋\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, {\r\n itemClass: string\r\n labelClass: string\r\n iconSize: 'sm' | 'md'\r\n}> = {\r\n default: {\r\n itemClass: 'flex items-center gap-2 py-2 rounded-md cursor-pointer transition-colors group',\r\n labelClass: 'flex-1 truncate',\r\n iconSize: 'sm',\r\n },\r\n minimal: {\r\n itemClass: 'flex items-center gap-1.5 py-1.5 rounded-md cursor-pointer transition-colors group',\r\n labelClass: 'flex-1 truncate text-xs',\r\n iconSize: 'sm', // JIcon은 'xs'를 지원하지 않으므로 'sm' 사용\r\n },\r\n}\r\n\r\nconst preset = computed(() => {\r\n return STYLE_PRESETS[props.styletype] ?? STYLE_PRESETS.default\r\n})\r\n\r\n/**\r\n * Chevron 아이콘 컴포넌트\r\n */\r\nconst ChevronIcon = computed(() => {\r\n return isExpanded.value ? 'chevronDown' : 'chevronRight'\r\n})\r\n</script>\r\n\r\n<template>\r\n <div :class=\"cn('w-full', className)\">\r\n <!-- 메뉴 아이템 -->\r\n <div\r\n :class=\"cn(\r\n preset.itemClass,\r\n {\r\n 'bg-accent text-accent-foreground': isActive,\r\n 'hover:bg-accent/50': !isDisabled && !isActive,\r\n 'opacity-50 cursor-not-allowed': isDisabled,\r\n 'font-medium': isActive,\r\n }\r\n )\"\r\n :style=\"indentStyle\"\r\n @click=\"handleMenuClick\"\r\n >\r\n <!-- Chevron 아이콘 (폴더 타입만) -->\r\n <JIcon\r\n v-if=\"isFolder\"\r\n :name=\"ChevronIcon\"\r\n :size=\"preset.iconSize\"\r\n class=\"flex-shrink-0\"\r\n />\r\n <span v-else class=\"w-4 flex-shrink-0\" /> <!-- 폴더가 아닐 때 공간 확보 -->\r\n\r\n <!-- 메뉴 아이콘 -->\r\n <JIcon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n :size=\"preset.iconSize\"\r\n class=\"flex-shrink-0\"\r\n />\r\n\r\n <!-- 메뉴 라벨 -->\r\n <span :class=\"preset.labelClass\">{{ item.label }}</span>\r\n \r\n <!-- 즐겨찾기 버튼 (menuType이 L인 경우만) -->\r\n <button\r\n v-if=\"item.menuKey && item.menuType === 'L' && onFavoriteToggle\"\r\n :class=\"cn(\r\n 'opacity-0 group-hover:opacity-100 transition-opacity hover:bg-accent rounded flex-shrink-0',\r\n props.styletype === 'minimal' ? 'p-0.5' : 'p-1',\r\n isFavorite && isFavorite(item.menuKey) && 'opacity-100'\r\n )\"\r\n @click.stop=\"onFavoriteToggle(item.menuKey)\"\r\n >\r\n <JIcon\r\n :name=\"isFavorite && isFavorite(item.menuKey) ? 'star' : 'star'\"\r\n :size=\"preset.iconSize\"\r\n :class=\"isFavorite && isFavorite(item.menuKey) ? 'text-yellow-500 fill-yellow-500' : 'text-muted-foreground'\"\r\n />\r\n </button>\r\n </div>\r\n\r\n <!-- 하위 메뉴 (폴더 타입이고 확장된 경우) -->\r\n <!-- 깊이 제한 체크: maxDepth를 초과하지 않는 경우에만 렌더링 -->\r\n <div\r\n v-if=\"isFolder && isExpanded && item.children && Array.isArray(item.children) && item.children.length > 0 && (level + 1) < maxDepth\"\r\n class=\"w-full\"\r\n >\r\n <JDynamicMenuItem\r\n v-for=\"(child, index) in item.children\"\r\n :key=\"child.menuKey || child.label || index\"\r\n :item=\"child\"\r\n :level=\"level + 1\"\r\n :max-depth=\"maxDepth\"\r\n :permissions=\"permissions\"\r\n :active-path=\"activePath\"\r\n :expanded-keys=\"expandedKeys\"\r\n :favorites=\"favorites\"\r\n :on-favorite-toggle=\"onFavoriteToggle\"\r\n :is-favorite=\"isFavorite\"\r\n :styletype=\"styletype\"\r\n @menu-click=\"emit('menuClick', $event)\"\r\n @expand-change=\"(menuKey, expanded) => emit('expandChange', menuKey, expanded)\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","router","useRouter","checkPermission","computed","hasMenuPermission","isActive","isFolder","isExpanded","key","isDisabled","indentStyle","handleMenuClick","event","newExpanded","STYLE_PRESETS","preset","ChevronIcon","_createElementBlock","_normalizeClass","_unref","cn","_createElementVNode","_createBlock","JIcon","_openBlock","_hoisted_1","_toDisplayString","_cache","_withModifiers","$event","_createVNode","_hoisted_2","_Fragment","child","index","_component_JDynamicMenuItem","menuKey","expanded"],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { defineComponent as M, computed as i, resolveComponent as A, createElementBlock as m, openBlock as a, normalizeClass as r, unref as g, createElementVNode as z, createCommentVNode as x, normalizeStyle as I, createBlock as k, toDisplayString as N, withModifiers as L, createVNode as B, Fragment as J, renderList as R } from "vue";
|
|
2
|
+
import { useRouter as V } from "vue-router";
|
|
3
|
+
import C from "../../atoms/JIcon.vue.js";
|
|
4
|
+
import { hasMenuPermission as $, cn as b } from "../../../lib/utils.js";
|
|
5
|
+
const Y = {
|
|
6
|
+
key: 1,
|
|
7
|
+
class: "w-4 flex-shrink-0"
|
|
8
|
+
}, j = {
|
|
9
|
+
key: 0,
|
|
10
|
+
class: "w-full"
|
|
11
|
+
}, Q = /* @__PURE__ */ M({
|
|
12
|
+
__name: "JDynamicMenuItem",
|
|
13
|
+
props: {
|
|
14
|
+
item: {},
|
|
15
|
+
level: { default: 0 },
|
|
16
|
+
permissions: { default: () => [] },
|
|
17
|
+
activePath: {},
|
|
18
|
+
expandedKeys: { default: () => /* @__PURE__ */ new Set() },
|
|
19
|
+
favorites: { default: () => [] },
|
|
20
|
+
onFavoriteToggle: {},
|
|
21
|
+
isFavorite: {},
|
|
22
|
+
styletype: { default: "default" },
|
|
23
|
+
className: {},
|
|
24
|
+
maxDepth: { default: 10 }
|
|
25
|
+
},
|
|
26
|
+
emits: ["menuClick", "expandChange"],
|
|
27
|
+
setup(e, { emit: P }) {
|
|
28
|
+
const t = e, u = P, K = V(), S = i(() => $(t.item.menuKey, t.permissions)), v = i(() => !t.item.path || !t.activePath ? !1 : t.activePath === t.item.path), c = i(() => t.item.menuType === "F" || Array.isArray(t.item.children) && t.item.children.length > 0), y = i(() => {
|
|
29
|
+
if (!c.value) return !1;
|
|
30
|
+
const l = t.item.menuKey || t.item.label;
|
|
31
|
+
return t.expandedKeys?.has(l) ?? !1;
|
|
32
|
+
}), f = i(() => t.item.disabled || !S.value), p = i(() => ({ paddingLeft: `${12 + (t.level || 0) * 16}px` })), w = (l) => {
|
|
33
|
+
if (f.value) {
|
|
34
|
+
l.preventDefault();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (c.value) {
|
|
38
|
+
const n = t.item.menuKey || t.item.label, d = !y.value;
|
|
39
|
+
u("expandChange", n, d);
|
|
40
|
+
} else t.item.path && (K.push(t.item.path), u("menuClick", {
|
|
41
|
+
menuItem: t.item,
|
|
42
|
+
path: [t.item],
|
|
43
|
+
// 단순화된 경로 (필요시 부모 경로 포함하도록 확장 가능)
|
|
44
|
+
event: l
|
|
45
|
+
}));
|
|
46
|
+
}, F = {
|
|
47
|
+
default: {
|
|
48
|
+
itemClass: "flex items-center gap-2 py-2 rounded-md cursor-pointer transition-colors group",
|
|
49
|
+
labelClass: "flex-1 truncate",
|
|
50
|
+
iconSize: "sm"
|
|
51
|
+
},
|
|
52
|
+
minimal: {
|
|
53
|
+
itemClass: "flex items-center gap-1.5 py-1.5 rounded-md cursor-pointer transition-colors group",
|
|
54
|
+
labelClass: "flex-1 truncate text-xs",
|
|
55
|
+
iconSize: "sm"
|
|
56
|
+
// JIcon은 'xs'를 지원하지 않으므로 'sm' 사용
|
|
57
|
+
}
|
|
58
|
+
}, s = i(() => F[t.styletype] ?? F.default), D = i(() => y.value ? "chevronDown" : "chevronRight");
|
|
59
|
+
return (l, n) => {
|
|
60
|
+
const d = A("JDynamicMenuItem", !0);
|
|
61
|
+
return a(), m("div", {
|
|
62
|
+
class: r(g(b)("w-full", e.className))
|
|
63
|
+
}, [
|
|
64
|
+
z("div", {
|
|
65
|
+
class: r(g(b)(
|
|
66
|
+
s.value.itemClass,
|
|
67
|
+
{
|
|
68
|
+
"bg-accent text-accent-foreground": v.value,
|
|
69
|
+
"hover:bg-accent/50": !f.value && !v.value,
|
|
70
|
+
"opacity-50 cursor-not-allowed": f.value,
|
|
71
|
+
"font-medium": v.value
|
|
72
|
+
}
|
|
73
|
+
)),
|
|
74
|
+
style: I(p.value),
|
|
75
|
+
onClick: w
|
|
76
|
+
}, [
|
|
77
|
+
c.value ? (a(), k(C, {
|
|
78
|
+
key: 0,
|
|
79
|
+
name: D.value,
|
|
80
|
+
size: s.value.iconSize,
|
|
81
|
+
class: "flex-shrink-0"
|
|
82
|
+
}, null, 8, ["name", "size"])) : (a(), m("span", Y)),
|
|
83
|
+
e.item.icon ? (a(), k(C, {
|
|
84
|
+
key: 2,
|
|
85
|
+
name: e.item.icon,
|
|
86
|
+
size: s.value.iconSize,
|
|
87
|
+
class: "flex-shrink-0"
|
|
88
|
+
}, null, 8, ["name", "size"])) : x("", !0),
|
|
89
|
+
z("span", {
|
|
90
|
+
class: r(s.value.labelClass)
|
|
91
|
+
}, N(e.item.label), 3),
|
|
92
|
+
e.item.menuKey && e.item.menuType === "L" && e.onFavoriteToggle ? (a(), m("button", {
|
|
93
|
+
key: 3,
|
|
94
|
+
class: r(g(b)(
|
|
95
|
+
"opacity-0 group-hover:opacity-100 transition-opacity hover:bg-accent rounded flex-shrink-0",
|
|
96
|
+
t.styletype === "minimal" ? "p-0.5" : "p-1",
|
|
97
|
+
e.isFavorite && e.isFavorite(e.item.menuKey) && "opacity-100"
|
|
98
|
+
)),
|
|
99
|
+
onClick: n[0] || (n[0] = L((o) => e.onFavoriteToggle(e.item.menuKey), ["stop"]))
|
|
100
|
+
}, [
|
|
101
|
+
B(C, {
|
|
102
|
+
name: (e.isFavorite && e.isFavorite(e.item.menuKey), "star"),
|
|
103
|
+
size: s.value.iconSize,
|
|
104
|
+
class: r(e.isFavorite && e.isFavorite(e.item.menuKey) ? "text-yellow-500 fill-yellow-500" : "text-muted-foreground")
|
|
105
|
+
}, null, 8, ["name", "size", "class"])
|
|
106
|
+
], 2)) : x("", !0)
|
|
107
|
+
], 6),
|
|
108
|
+
c.value && y.value && e.item.children && Array.isArray(e.item.children) && e.item.children.length > 0 && e.level + 1 < e.maxDepth ? (a(), m("div", j, [
|
|
109
|
+
(a(!0), m(J, null, R(e.item.children, (o, E) => (a(), k(d, {
|
|
110
|
+
key: o.menuKey || o.label || E,
|
|
111
|
+
item: o,
|
|
112
|
+
level: e.level + 1,
|
|
113
|
+
"max-depth": e.maxDepth,
|
|
114
|
+
permissions: e.permissions,
|
|
115
|
+
"active-path": e.activePath,
|
|
116
|
+
"expanded-keys": e.expandedKeys,
|
|
117
|
+
favorites: e.favorites,
|
|
118
|
+
"on-favorite-toggle": e.onFavoriteToggle,
|
|
119
|
+
"is-favorite": e.isFavorite,
|
|
120
|
+
styletype: e.styletype,
|
|
121
|
+
onMenuClick: n[1] || (n[1] = (h) => u("menuClick", h)),
|
|
122
|
+
onExpandChange: n[2] || (n[2] = (h, T) => u("expandChange", h, T))
|
|
123
|
+
}, null, 8, ["item", "level", "max-depth", "permissions", "active-path", "expanded-keys", "favorites", "on-favorite-toggle", "is-favorite", "styletype"]))), 128))
|
|
124
|
+
])) : x("", !0)
|
|
125
|
+
], 2);
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
export {
|
|
130
|
+
Q as default
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=JDynamicMenuItem.vue.js.map
|