cisse-vue-ui 0.7.3 → 0.7.5

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.
Files changed (330) hide show
  1. package/dist/BadgeType.vue_vue_type_script_setup_true_lang-zs0NXN4g.cjs +145 -0
  2. package/dist/BadgeType.vue_vue_type_script_setup_true_lang-zs0NXN4g.cjs.map +1 -0
  3. package/dist/Button.vue_vue_type_script_setup_true_lang-CXRj7LEP.cjs +98 -0
  4. package/dist/Button.vue_vue_type_script_setup_true_lang-CXRj7LEP.cjs.map +1 -0
  5. package/dist/{TagsInput-DtoJKN3L.js → CheckboxGroup.vue_vue_type_script_setup_true_lang-BOGul8zU.js} +400 -225
  6. package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-BOGul8zU.js.map +1 -0
  7. package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-BcoXb8Xg.cjs +3869 -0
  8. package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-BcoXb8Xg.cjs.map +1 -0
  9. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs +928 -0
  10. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs.map +1 -0
  11. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs +228 -0
  12. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs.map +1 -0
  13. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-HwjuvIJX.cjs +2242 -0
  14. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-HwjuvIJX.cjs.map +1 -0
  15. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs +149 -0
  16. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs.map +1 -0
  17. package/dist/PageHero.vue_vue_type_script_setup_true_lang-CZ-TibKk.cjs +764 -0
  18. package/dist/PageHero.vue_vue_type_script_setup_true_lang-CZ-TibKk.cjs.map +1 -0
  19. package/dist/_plugin-vue_export-helper-DM9IkUGy.cjs +10 -0
  20. package/dist/_plugin-vue_export-helper-DM9IkUGy.cjs.map +1 -0
  21. package/dist/components/core/Accordion.stories.d.ts +11 -0
  22. package/dist/components/core/Accordion.test.d.ts +1 -0
  23. package/dist/components/core/Accordion.vue.d.ts +27 -0
  24. package/dist/components/core/AccordionItem.stories.d.ts +10 -0
  25. package/dist/components/core/AccordionItem.vue.d.ts +29 -0
  26. package/dist/components/core/AutocompleteComponent.stories.d.ts +14 -0
  27. package/dist/components/core/AutocompleteComponent.test.d.ts +1 -0
  28. package/dist/components/core/AutocompleteComponent.vue.d.ts +25 -0
  29. package/dist/components/core/Avatar.stories.d.ts +12 -0
  30. package/dist/components/core/Avatar.test.d.ts +1 -0
  31. package/dist/components/core/Avatar.vue.d.ts +20 -0
  32. package/dist/components/core/Breadcrumb.stories.d.ts +11 -0
  33. package/dist/components/core/Breadcrumb.test.d.ts +1 -0
  34. package/dist/components/core/Breadcrumb.vue.d.ts +26 -0
  35. package/dist/components/core/Button.stories.d.ts +18 -0
  36. package/dist/components/core/Button.test.d.ts +1 -0
  37. package/dist/components/core/Button.vue.d.ts +49 -0
  38. package/dist/components/core/CardComponent.stories.d.ts +13 -0
  39. package/dist/components/core/CardComponent.test.d.ts +1 -0
  40. package/dist/components/core/CardComponent.vue.d.ts +40 -0
  41. package/dist/components/core/CollapsibleCard.stories.d.ts +10 -0
  42. package/dist/components/core/CollapsibleCard.test.d.ts +1 -0
  43. package/dist/components/core/CollapsibleCard.vue.d.ts +38 -0
  44. package/dist/components/core/DarkModeToggle.stories.d.ts +15 -0
  45. package/dist/components/core/DarkModeToggle.test.d.ts +1 -0
  46. package/dist/components/core/DarkModeToggle.vue.d.ts +21 -0
  47. package/dist/components/core/Drawer.stories.d.ts +12 -0
  48. package/dist/components/core/Drawer.test.d.ts +1 -0
  49. package/dist/components/core/Drawer.vue.d.ts +50 -0
  50. package/dist/components/core/Dropdown.stories.d.ts +11 -0
  51. package/dist/components/core/Dropdown.test.d.ts +1 -0
  52. package/dist/components/core/Dropdown.vue.d.ts +56 -0
  53. package/dist/components/core/FilterTabs.stories.d.ts +14 -0
  54. package/dist/components/core/FilterTabs.test.d.ts +1 -0
  55. package/dist/components/core/FilterTabs.vue.d.ts +29 -0
  56. package/dist/components/core/MenuItem.stories.d.ts +13 -0
  57. package/dist/components/core/MenuItem.test.d.ts +1 -0
  58. package/dist/components/core/MenuItem.vue.d.ts +16 -0
  59. package/dist/components/core/MobileList.stories.d.ts +13 -0
  60. package/dist/components/core/MobileList.test.d.ts +1 -0
  61. package/dist/components/core/MobileList.vue.d.ts +86 -0
  62. package/dist/components/core/Popover.stories.d.ts +10 -0
  63. package/dist/components/core/Popover.test.d.ts +1 -0
  64. package/dist/components/core/Popover.vue.d.ts +44 -0
  65. package/dist/components/core/ResponsiveList.stories.d.ts +15 -0
  66. package/dist/components/core/ResponsiveList.test.d.ts +1 -0
  67. package/dist/components/core/ResponsiveList.vue.d.ts +128 -0
  68. package/dist/components/core/StatsCard.stories.d.ts +15 -0
  69. package/dist/components/core/StatsCard.test.d.ts +1 -0
  70. package/dist/components/core/StatsCard.vue.d.ts +44 -0
  71. package/dist/components/core/StatsGrid.stories.d.ts +12 -0
  72. package/dist/components/core/StatsGrid.test.d.ts +1 -0
  73. package/dist/components/core/StatsGrid.vue.d.ts +16 -0
  74. package/dist/components/core/StatusBadge.stories.d.ts +13 -0
  75. package/dist/components/core/StatusBadge.test.d.ts +1 -0
  76. package/dist/components/core/StatusBadge.vue.d.ts +21 -0
  77. package/dist/components/core/Stepper.stories.d.ts +12 -0
  78. package/dist/components/core/Stepper.test.d.ts +1 -0
  79. package/dist/components/core/Stepper.vue.d.ts +22 -0
  80. package/dist/components/core/TabPanel.stories.d.ts +8 -0
  81. package/dist/components/core/TabPanel.test.d.ts +1 -0
  82. package/dist/components/core/TabPanel.vue.d.ts +21 -0
  83. package/dist/components/core/TableAction.stories.d.ts +14 -0
  84. package/dist/components/core/TableAction.test.d.ts +1 -0
  85. package/dist/components/core/TableAction.vue.d.ts +8 -0
  86. package/dist/components/core/TableComponent.stories.d.ts +16 -0
  87. package/dist/components/core/TableComponent.test.d.ts +1 -0
  88. package/dist/components/core/TableComponent.vue.d.ts +67 -0
  89. package/dist/components/core/Tabs.stories.d.ts +10 -0
  90. package/dist/components/core/Tabs.test.d.ts +1 -0
  91. package/dist/components/core/Tabs.vue.d.ts +39 -0
  92. package/dist/components/core/Timeline.stories.d.ts +11 -0
  93. package/dist/components/core/Timeline.test.d.ts +1 -0
  94. package/dist/components/core/Timeline.vue.d.ts +34 -0
  95. package/dist/components/core/Tooltip.stories.d.ts +10 -0
  96. package/dist/components/core/Tooltip.test.d.ts +1 -0
  97. package/dist/components/core/Tooltip.vue.d.ts +34 -0
  98. package/dist/components/core/index.cjs +33 -0
  99. package/dist/components/core/index.cjs.map +1 -0
  100. package/dist/components/core/index.test.d.ts +1 -0
  101. package/dist/components/feedback/Alert.stories.d.ts +13 -0
  102. package/dist/components/feedback/Alert.test.d.ts +1 -0
  103. package/dist/components/feedback/Alert.vue.d.ts +34 -0
  104. package/dist/components/feedback/CardSkeleton.stories.d.ts +11 -0
  105. package/dist/components/feedback/CardSkeleton.test.d.ts +1 -0
  106. package/dist/components/feedback/CardSkeleton.vue.d.ts +14 -0
  107. package/dist/components/feedback/ConfirmDialog.stories.d.ts +12 -0
  108. package/dist/components/feedback/ConfirmDialog.test.d.ts +1 -0
  109. package/dist/components/feedback/ConfirmDialog.vue.d.ts +53 -0
  110. package/dist/components/feedback/EmptyState.stories.d.ts +13 -0
  111. package/dist/components/feedback/EmptyState.test.d.ts +1 -0
  112. package/dist/components/feedback/EmptyState.vue.d.ts +29 -0
  113. package/dist/components/feedback/ListSkeleton.stories.d.ts +12 -0
  114. package/dist/components/feedback/ListSkeleton.test.d.ts +1 -0
  115. package/dist/components/feedback/ListSkeleton.vue.d.ts +17 -0
  116. package/dist/components/feedback/LoadingSpinner.stories.d.ts +11 -0
  117. package/dist/components/feedback/LoadingSpinner.test.d.ts +1 -0
  118. package/dist/components/feedback/LoadingSpinner.vue.d.ts +12 -0
  119. package/dist/components/feedback/Modal.stories.d.ts +11 -0
  120. package/dist/components/feedback/Modal.test.d.ts +1 -0
  121. package/dist/components/feedback/Modal.vue.d.ts +47 -0
  122. package/dist/components/feedback/NotificationComponent.stories.d.ts +14 -0
  123. package/dist/components/feedback/NotificationComponent.test.d.ts +1 -0
  124. package/dist/components/feedback/NotificationComponent.vue.d.ts +12 -0
  125. package/dist/components/feedback/NotificationList.stories.d.ts +11 -0
  126. package/dist/components/feedback/NotificationList.test.d.ts +1 -0
  127. package/dist/components/feedback/NotificationList.vue.d.ts +18 -0
  128. package/dist/components/feedback/PaginationControls.stories.d.ts +12 -0
  129. package/dist/components/feedback/PaginationControls.test.d.ts +1 -0
  130. package/dist/components/feedback/PaginationControls.vue.d.ts +21 -0
  131. package/dist/components/feedback/Progress.stories.d.ts +14 -0
  132. package/dist/components/feedback/Progress.test.d.ts +1 -0
  133. package/dist/components/feedback/Progress.vue.d.ts +30 -0
  134. package/dist/components/feedback/Skeleton.stories.d.ts +15 -0
  135. package/dist/components/feedback/Skeleton.test.d.ts +1 -0
  136. package/dist/components/feedback/Skeleton.vue.d.ts +19 -0
  137. package/dist/components/feedback/TableSkeleton.stories.d.ts +12 -0
  138. package/dist/components/feedback/TableSkeleton.test.d.ts +1 -0
  139. package/dist/components/feedback/TableSkeleton.vue.d.ts +14 -0
  140. package/dist/components/feedback/Toast.stories.d.ts +12 -0
  141. package/dist/components/feedback/Toast.test.d.ts +1 -0
  142. package/dist/components/feedback/Toast.vue.d.ts +23 -0
  143. package/dist/components/feedback/ToastContainer.stories.d.ts +15 -0
  144. package/dist/components/feedback/ToastContainer.test.d.ts +1 -0
  145. package/dist/components/feedback/ToastContainer.vue.d.ts +24 -0
  146. package/dist/components/feedback/index.cjs +20 -0
  147. package/dist/components/feedback/index.cjs.map +1 -0
  148. package/dist/components/feedback/index.test.d.ts +1 -0
  149. package/dist/components/form/Checkbox.stories.d.ts +13 -0
  150. package/dist/components/form/Checkbox.test.d.ts +1 -0
  151. package/dist/components/form/Checkbox.vue.d.ts +22 -0
  152. package/dist/components/form/CheckboxGroup.test.d.ts +1 -0
  153. package/dist/components/form/CheckboxGroup.vue.d.ts +26 -0
  154. package/dist/components/form/ColorPicker.stories.d.ts +12 -0
  155. package/dist/components/form/ColorPicker.test.d.ts +1 -0
  156. package/dist/components/form/ColorPicker.vue.d.ts +26 -0
  157. package/dist/components/form/Combobox.stories.d.ts +15 -0
  158. package/dist/components/form/Combobox.test.d.ts +1 -0
  159. package/dist/components/form/Combobox.vue.d.ts +46 -0
  160. package/dist/components/form/DatePicker.stories.d.ts +15 -0
  161. package/dist/components/form/DatePicker.test.d.ts +1 -0
  162. package/dist/components/form/DatePicker.vue.d.ts +36 -0
  163. package/dist/components/form/EmailInput.stories.d.ts +13 -0
  164. package/dist/components/form/EmailInput.test.d.ts +1 -0
  165. package/dist/components/form/EmailInput.vue.d.ts +32 -0
  166. package/dist/components/form/FileUpload.stories.d.ts +12 -0
  167. package/dist/components/form/FileUpload.test.d.ts +1 -0
  168. package/dist/components/form/FileUpload.vue.d.ts +40 -0
  169. package/dist/components/form/FormActions.stories.d.ts +18 -0
  170. package/dist/components/form/FormActions.test.d.ts +1 -0
  171. package/dist/components/form/FormActions.vue.d.ts +56 -0
  172. package/dist/components/form/FormGroup.stories.d.ts +10 -0
  173. package/dist/components/form/FormGroup.test.d.ts +1 -0
  174. package/dist/components/form/FormGroup.vue.d.ts +30 -0
  175. package/dist/components/form/FormHelp.stories.d.ts +11 -0
  176. package/dist/components/form/FormHelp.test.d.ts +1 -0
  177. package/dist/components/form/FormHelp.vue.d.ts +23 -0
  178. package/dist/components/form/FormInput.stories.d.ts +12 -0
  179. package/dist/components/form/FormInput.test.d.ts +1 -0
  180. package/dist/components/form/FormInput.vue.d.ts +13 -0
  181. package/dist/components/form/FormLabel.stories.d.ts +12 -0
  182. package/dist/components/form/FormLabel.test.d.ts +1 -0
  183. package/dist/components/form/FormLabel.vue.d.ts +21 -0
  184. package/dist/components/form/FormSection.stories.d.ts +13 -0
  185. package/dist/components/form/FormSection.test.d.ts +1 -0
  186. package/dist/components/form/FormSection.vue.d.ts +49 -0
  187. package/dist/components/form/FormSelect.stories.d.ts +13 -0
  188. package/dist/components/form/FormSelect.test.d.ts +1 -0
  189. package/dist/components/form/FormSelect.vue.d.ts +55 -0
  190. package/dist/components/form/IconPicker.vue.d.ts +33 -0
  191. package/dist/components/form/InputWrapper.stories.d.ts +16 -0
  192. package/dist/components/form/InputWrapper.test.d.ts +1 -0
  193. package/dist/components/form/InputWrapper.vue.d.ts +40 -0
  194. package/dist/components/form/MoneyInput.stories.d.ts +16 -0
  195. package/dist/components/form/MoneyInput.test.d.ts +1 -0
  196. package/dist/components/form/MoneyInput.vue.d.ts +40 -0
  197. package/dist/components/form/NumberInput.stories.d.ts +14 -0
  198. package/dist/components/form/NumberInput.test.d.ts +1 -0
  199. package/dist/components/form/NumberInput.vue.d.ts +39 -0
  200. package/dist/components/form/OTPInput.stories.d.ts +13 -0
  201. package/dist/components/form/OTPInput.test.d.ts +1 -0
  202. package/dist/components/form/OTPInput.vue.d.ts +33 -0
  203. package/dist/components/form/PasswordInput.stories.d.ts +15 -0
  204. package/dist/components/form/PasswordInput.test.d.ts +1 -0
  205. package/dist/components/form/PasswordInput.vue.d.ts +36 -0
  206. package/dist/components/form/PercentInput.stories.d.ts +12 -0
  207. package/dist/components/form/PercentInput.test.d.ts +1 -0
  208. package/dist/components/form/PercentInput.vue.d.ts +38 -0
  209. package/dist/components/form/PhoneInput.stories.d.ts +13 -0
  210. package/dist/components/form/PhoneInput.test.d.ts +1 -0
  211. package/dist/components/form/PhoneInput.vue.d.ts +91 -0
  212. package/dist/components/form/QuantityInput.stories.d.ts +12 -0
  213. package/dist/components/form/QuantityInput.test.d.ts +1 -0
  214. package/dist/components/form/QuantityInput.vue.d.ts +32 -0
  215. package/dist/components/form/RangeSlider.stories.d.ts +13 -0
  216. package/dist/components/form/RangeSlider.test.d.ts +1 -0
  217. package/dist/components/form/RangeSlider.vue.d.ts +35 -0
  218. package/dist/components/form/Rating.stories.d.ts +16 -0
  219. package/dist/components/form/Rating.test.d.ts +1 -0
  220. package/dist/components/form/Rating.vue.d.ts +43 -0
  221. package/dist/components/form/SearchInput.stories.d.ts +13 -0
  222. package/dist/components/form/SearchInput.test.d.ts +1 -0
  223. package/dist/components/form/SearchInput.vue.d.ts +26 -0
  224. package/dist/components/form/Slider.stories.d.ts +13 -0
  225. package/dist/components/form/Slider.test.d.ts +1 -0
  226. package/dist/components/form/Slider.vue.d.ts +29 -0
  227. package/dist/components/form/Switch.stories.d.ts +11 -0
  228. package/dist/components/form/Switch.test.d.ts +1 -0
  229. package/dist/components/form/Switch.vue.d.ts +23 -0
  230. package/dist/components/form/TagsInput.stories.d.ts +13 -0
  231. package/dist/components/form/TagsInput.test.d.ts +1 -0
  232. package/dist/components/form/TagsInput.vue.d.ts +37 -0
  233. package/dist/components/form/TextArea.test.d.ts +1 -0
  234. package/dist/components/form/TextArea.vue.d.ts +40 -0
  235. package/dist/components/form/URLInput.stories.d.ts +11 -0
  236. package/dist/components/form/URLInput.test.d.ts +1 -0
  237. package/dist/components/form/URLInput.vue.d.ts +32 -0
  238. package/dist/components/form/index.cjs +36 -0
  239. package/dist/components/form/index.cjs.map +1 -0
  240. package/dist/components/form/index.d.ts +2 -0
  241. package/dist/components/form/index.js +3 -1
  242. package/dist/components/form/index.test.d.ts +1 -0
  243. package/dist/components/index.cjs +93 -0
  244. package/dist/components/index.cjs.map +1 -0
  245. package/dist/components/index.d.ts +5 -0
  246. package/dist/components/index.js +3 -1
  247. package/dist/components/index.test.d.ts +1 -0
  248. package/dist/components/layout/AuthLayout.stories.d.ts +10 -0
  249. package/dist/components/layout/AuthLayout.test.d.ts +1 -0
  250. package/dist/components/layout/AuthLayout.vue.d.ts +88 -0
  251. package/dist/components/layout/BaseLayout.stories.d.ts +11 -0
  252. package/dist/components/layout/BaseLayout.test.d.ts +1 -0
  253. package/dist/components/layout/BaseLayout.vue.d.ts +77 -0
  254. package/dist/components/layout/PageHero.stories.d.ts +11 -0
  255. package/dist/components/layout/PageHero.test.d.ts +1 -0
  256. package/dist/components/layout/PageHero.vue.d.ts +55 -0
  257. package/dist/components/layout/PageLayout.stories.d.ts +10 -0
  258. package/dist/components/layout/PageLayout.test.d.ts +1 -0
  259. package/dist/components/layout/PageLayout.vue.d.ts +37 -0
  260. package/dist/components/layout/index.cjs +8 -0
  261. package/dist/components/layout/index.cjs.map +1 -0
  262. package/dist/components/layout/index.test.d.ts +1 -0
  263. package/dist/components/type/BadgeType.stories.d.ts +13 -0
  264. package/dist/components/type/BadgeType.test.d.ts +1 -0
  265. package/dist/components/type/BooleanType.stories.d.ts +12 -0
  266. package/dist/components/type/BooleanType.test.d.ts +1 -0
  267. package/dist/components/type/DateType.stories.d.ts +12 -0
  268. package/dist/components/type/DateType.test.d.ts +1 -0
  269. package/dist/components/type/NumberType.stories.d.ts +11 -0
  270. package/dist/components/type/NumberType.test.d.ts +1 -0
  271. package/dist/components/type/TextType.stories.d.ts +10 -0
  272. package/dist/components/type/TextType.test.d.ts +1 -0
  273. package/dist/components/type/index.cjs +9 -0
  274. package/dist/components/type/index.cjs.map +1 -0
  275. package/dist/components/type/index.test.d.ts +1 -0
  276. package/dist/composables/index.cjs +19 -0
  277. package/dist/composables/index.cjs.map +1 -0
  278. package/dist/composables/index.d.ts +8 -0
  279. package/dist/composables/index.test.d.ts +1 -0
  280. package/dist/composables/useDarkMode.d.ts +14 -0
  281. package/dist/composables/useDarkMode.test.d.ts +1 -0
  282. package/dist/composables/useDropdown.d.ts +51 -0
  283. package/dist/composables/useDropdown.test.d.ts +1 -0
  284. package/dist/composables/useExportCSV.d.ts +10 -0
  285. package/dist/composables/useExportCSV.test.d.ts +1 -0
  286. package/dist/composables/useFocusTrap.d.ts +41 -0
  287. package/dist/composables/useFocusTrap.test.d.ts +1 -0
  288. package/dist/composables/useId.d.ts +42 -0
  289. package/dist/composables/useId.test.d.ts +1 -0
  290. package/dist/composables/useModal.d.ts +60 -0
  291. package/dist/composables/useModal.test.d.ts +1 -0
  292. package/dist/composables/useNotifications.d.ts +27 -0
  293. package/dist/composables/useNotifications.test.d.ts +1 -0
  294. package/dist/composables/useToast.d.ts +30 -0
  295. package/dist/composables/useToast.test.d.ts +1 -0
  296. package/dist/index-D1x3TH9k.cjs +401 -0
  297. package/dist/index-D1x3TH9k.cjs.map +1 -0
  298. package/dist/index-DXO2TliH.cjs +96 -0
  299. package/dist/index-DXO2TliH.cjs.map +1 -0
  300. package/dist/index-DpEkzIVv.js +97 -0
  301. package/dist/index-DpEkzIVv.js.map +1 -0
  302. package/dist/index.cjs +125 -0
  303. package/dist/index.cjs.map +1 -0
  304. package/dist/index.d.ts +5 -0
  305. package/dist/index.js +4 -2
  306. package/dist/index.test.d.ts +1 -0
  307. package/dist/plugin.d.ts +24 -0
  308. package/dist/style.css +2 -0
  309. package/dist/types/components.d.ts +28 -0
  310. package/dist/types/form.d.ts +37 -0
  311. package/dist/types/index.cjs +2 -0
  312. package/dist/types/index.cjs.map +1 -0
  313. package/dist/types/index.d.ts +4 -0
  314. package/dist/types/index.test.d.ts +1 -0
  315. package/dist/types/notification.d.ts +12 -0
  316. package/dist/types/property.d.ts +34 -0
  317. package/dist/useDarkMode-DLZcJEUQ.cjs +52 -0
  318. package/dist/useDarkMode-DLZcJEUQ.cjs.map +1 -0
  319. package/dist/useDropdown-DHFnd259.cjs +130 -0
  320. package/dist/useDropdown-DHFnd259.cjs.map +1 -0
  321. package/dist/useFocusTrap-kcxO8AeU.cjs +119 -0
  322. package/dist/useFocusTrap-kcxO8AeU.cjs.map +1 -0
  323. package/dist/useId-nxrBaIC9.cjs +25 -0
  324. package/dist/useId-nxrBaIC9.cjs.map +1 -0
  325. package/dist/useToast-Bk60GArg.cjs +176 -0
  326. package/dist/useToast-Bk60GArg.cjs.map +1 -0
  327. package/package.json +1 -1
  328. package/dist/TagsInput-DtoJKN3L.js.map +0 -1
  329. package/dist/index-F9yanU6_.js +0 -95
  330. package/dist/index-F9yanU6_.js.map +0 -1
@@ -0,0 +1,2242 @@
1
+ "use strict";
2
+ const vue = require("vue");
3
+ const index = require("./index-D1x3TH9k.cjs");
4
+ const ListSkeleton_vue_vue_type_script_setup_true_lang = require("./ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs");
5
+ const BadgeType_vue_vue_type_script_setup_true_lang = require("./BadgeType.vue_vue_type_script_setup_true_lang-zs0NXN4g.cjs");
6
+ const vue$1 = require("@iconify/vue");
7
+ const useDropdown = require("./useDropdown-DHFnd259.cjs");
8
+ const useId = require("./useId-nxrBaIC9.cjs");
9
+ const useDarkMode = require("./useDarkMode-DLZcJEUQ.cjs");
10
+ const _hoisted_1$h = {
11
+ key: 1,
12
+ class: "flex flex-col overflow-hidden rounded-lg bg-white shadow-md dark:bg-slate-950"
13
+ };
14
+ const _hoisted_2$d = { class: "flex flex-col gap-0.5" };
15
+ const _hoisted_3$8 = {
16
+ key: 1,
17
+ class: "text-sm font-normal text-gray-600 dark:text-gray-400"
18
+ };
19
+ const _hoisted_4$6 = { class: "flex gap-2" };
20
+ const _sfc_main$l = /* @__PURE__ */ vue.defineComponent({
21
+ __name: "CardComponent",
22
+ props: {
23
+ title: {},
24
+ description: {},
25
+ titleClass: {},
26
+ dividerClass: {},
27
+ loading: { type: Boolean, default: false },
28
+ loadingLines: { default: 3 },
29
+ loadingAvatar: { type: Boolean, default: false },
30
+ loadingActions: { type: Boolean, default: false }
31
+ },
32
+ setup(__props) {
33
+ const props = __props;
34
+ const titleClasses = vue.computed(
35
+ () => props.titleClass || "text-gray-800 dark:text-gray-200"
36
+ );
37
+ const dividerClasses = vue.computed(
38
+ () => props.dividerClass || "border-gray-200 dark:border-gray-700"
39
+ );
40
+ return (_ctx, _cache) => {
41
+ return __props.loading ? (vue.openBlock(), vue.createBlock(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main$1, {
42
+ key: 0,
43
+ lines: __props.loadingLines,
44
+ "show-avatar": __props.loadingAvatar,
45
+ "show-actions": __props.loadingActions
46
+ }, null, 8, ["lines", "show-avatar", "show-actions"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$h, [
47
+ _ctx.$slots.header ? (vue.openBlock(), vue.createElementBlock("div", {
48
+ key: 0,
49
+ class: vue.normalizeClass(["border-b", dividerClasses.value])
50
+ }, [
51
+ vue.renderSlot(_ctx.$slots, "header")
52
+ ], 2)) : __props.title || __props.description || _ctx.$slots.title || _ctx.$slots.description || _ctx.$slots.actions ? (vue.openBlock(), vue.createElementBlock("div", {
53
+ key: 1,
54
+ class: vue.normalizeClass(["flex items-center justify-between border-b px-5 py-3", dividerClasses.value])
55
+ }, [
56
+ vue.createElementVNode("div", _hoisted_2$d, [
57
+ __props.title || _ctx.$slots.title ? (vue.openBlock(), vue.createElementBlock("span", {
58
+ key: 0,
59
+ class: vue.normalizeClass(["text-md font-semibold", titleClasses.value])
60
+ }, [
61
+ vue.renderSlot(_ctx.$slots, "title", {}, () => [
62
+ vue.createTextVNode(vue.toDisplayString(__props.title), 1)
63
+ ])
64
+ ], 2)) : vue.createCommentVNode("", true),
65
+ __props.description || _ctx.$slots.description ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$8, [
66
+ vue.renderSlot(_ctx.$slots, "description", {}, () => [
67
+ vue.createTextVNode(vue.toDisplayString(__props.description), 1)
68
+ ])
69
+ ])) : vue.createCommentVNode("", true)
70
+ ]),
71
+ vue.createElementVNode("div", _hoisted_4$6, [
72
+ vue.renderSlot(_ctx.$slots, "actions")
73
+ ])
74
+ ], 2)) : vue.createCommentVNode("", true),
75
+ vue.renderSlot(_ctx.$slots, "default")
76
+ ]));
77
+ };
78
+ }
79
+ });
80
+ const _hoisted_1$g = { class: "overflow-hidden" };
81
+ const _hoisted_2$c = {
82
+ key: 1,
83
+ class: "overflow-x-auto"
84
+ };
85
+ const _hoisted_3$7 = { class: "w-full divide-y divide-black/10 text-left dark:divide-white/10" };
86
+ const _hoisted_4$5 = { class: "bg-black/5 text-sm font-semibold text-gray-600 uppercase dark:bg-white/5 dark:text-gray-400" };
87
+ const _hoisted_5$3 = {
88
+ key: 0,
89
+ class: "w-12 px-3 py-3"
90
+ };
91
+ const _hoisted_6$3 = ["onClick"];
92
+ const _hoisted_7$3 = {
93
+ key: 0,
94
+ d: "M7 14l5-5 5 5H7z"
95
+ };
96
+ const _hoisted_8$3 = {
97
+ key: 1,
98
+ d: "M7 10l5 5 5-5H7z"
99
+ };
100
+ const _hoisted_9$3 = {
101
+ key: 1,
102
+ class: "px-3 py-3 text-right"
103
+ };
104
+ const _hoisted_10$2 = { class: "divide-y divide-black/10 font-medium dark:divide-white/10" };
105
+ const _hoisted_11$1 = {
106
+ key: 0,
107
+ class: "px-3 py-4"
108
+ };
109
+ const _hoisted_12$1 = {
110
+ key: 1,
111
+ class: "flex items-center justify-end gap-2 px-3 py-4"
112
+ };
113
+ const _hoisted_13 = { key: 0 };
114
+ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
115
+ __name: "TableComponent",
116
+ props: {
117
+ properties: {},
118
+ items: {},
119
+ selectable: { type: Boolean, default: false },
120
+ selectedItems: {},
121
+ selectableFilter: {},
122
+ keyField: { default: "id" },
123
+ sortBy: {},
124
+ sortDirection: {},
125
+ loading: { type: Boolean, default: false },
126
+ loadingRows: { default: 5 }
127
+ },
128
+ emits: ["select", "selectAll", "sort"],
129
+ setup(__props, { emit: __emit }) {
130
+ const slots = vue.useSlots();
131
+ const props = __props;
132
+ const emit = __emit;
133
+ const typeComponents = {
134
+ text: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1,
135
+ number: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$2,
136
+ date: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$3,
137
+ boolean: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$4,
138
+ badge: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$5
139
+ };
140
+ const getTypeComponent = (type = "text") => {
141
+ return typeComponents[type] || BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1;
142
+ };
143
+ const visibleProperties = vue.computed(() => props.properties.filter((p) => !p.hidden));
144
+ const getKey = (item) => {
145
+ const keyValue = item[props.keyField];
146
+ return String(keyValue ?? Math.random());
147
+ };
148
+ const getItemValue = (item, property) => {
149
+ if (property.name.includes(".")) {
150
+ let value = item;
151
+ for (const key of property.name.split(".")) {
152
+ if (value && typeof value === "object" && key in value) {
153
+ value = value[key];
154
+ } else {
155
+ return void 0;
156
+ }
157
+ }
158
+ return value;
159
+ }
160
+ return item[property.name];
161
+ };
162
+ const getAlignmentClass = (align) => {
163
+ switch (align) {
164
+ case "center":
165
+ return "text-center";
166
+ case "right":
167
+ return "text-right";
168
+ default:
169
+ return "text-left";
170
+ }
171
+ };
172
+ const getMainClass = (main) => {
173
+ if (main) {
174
+ return "text-sm font-semibold text-gray-900 dark:text-gray-100";
175
+ }
176
+ return "text-xs font-medium text-gray-600 dark:text-gray-400";
177
+ };
178
+ const selectableItems = vue.computed(() => {
179
+ if (!props.selectableFilter) return props.items;
180
+ return props.items.filter(props.selectableFilter);
181
+ });
182
+ const allSelected = vue.computed(() => {
183
+ if (selectableItems.value.length === 0) return false;
184
+ return selectableItems.value.every((item) => {
185
+ var _a;
186
+ return (_a = props.selectedItems) == null ? void 0 : _a.has(getKey(item));
187
+ });
188
+ });
189
+ const someSelected = vue.computed(() => {
190
+ var _a;
191
+ return (((_a = props.selectedItems) == null ? void 0 : _a.size) || 0) > 0 && !allSelected.value;
192
+ });
193
+ const isSelected = (item) => {
194
+ var _a;
195
+ return ((_a = props.selectedItems) == null ? void 0 : _a.has(getKey(item))) || false;
196
+ };
197
+ const isSelectable = (item) => {
198
+ if (!props.selectable) return false;
199
+ if (!props.selectableFilter) return true;
200
+ return props.selectableFilter(item);
201
+ };
202
+ const handleSelect = (item) => {
203
+ emit("select", getKey(item));
204
+ };
205
+ const hasActionSlot = vue.computed(() => !!slots.action);
206
+ const handleSort = (property) => {
207
+ if (!property.sortable) return;
208
+ const newDirection = props.sortBy === property.name && props.sortDirection === "asc" ? "desc" : "asc";
209
+ emit("sort", property.name, newDirection);
210
+ };
211
+ const isSortedColumn = (property) => {
212
+ return props.sortBy === property.name;
213
+ };
214
+ return (_ctx, _cache) => {
215
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$g, [
216
+ __props.loading ? (vue.openBlock(), vue.createBlock(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main, {
217
+ key: 0,
218
+ rows: __props.loadingRows,
219
+ columns: visibleProperties.value.length
220
+ }, null, 8, ["rows", "columns"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$c, [
221
+ vue.createElementVNode("table", _hoisted_3$7, [
222
+ vue.createElementVNode("thead", _hoisted_4$5, [
223
+ vue.createElementVNode("tr", null, [
224
+ __props.selectable ? (vue.openBlock(), vue.createElementBlock("th", _hoisted_5$3, [
225
+ vue.createVNode(index._sfc_main, {
226
+ "model-value": allSelected.value,
227
+ indeterminate: someSelected.value,
228
+ disabled: selectableItems.value.length === 0,
229
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("selectAll"))
230
+ }, null, 8, ["model-value", "indeterminate", "disabled"])
231
+ ])) : vue.createCommentVNode("", true),
232
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(visibleProperties.value, (property) => {
233
+ return vue.openBlock(), vue.createElementBlock("th", {
234
+ key: property.name,
235
+ class: vue.normalizeClass([
236
+ getAlignmentClass(property.align),
237
+ "px-3 py-3",
238
+ property.sortable ? "cursor-pointer select-none hover:bg-black/5 dark:hover:bg-white/5" : ""
239
+ ]),
240
+ onClick: ($event) => handleSort(property)
241
+ }, [
242
+ vue.createElementVNode("div", {
243
+ class: vue.normalizeClass(["flex items-center gap-1", {
244
+ "justify-center": property.align === "center",
245
+ "justify-end": property.align === "right"
246
+ }])
247
+ }, [
248
+ vue.renderSlot(_ctx.$slots, "header-" + property.name, { property }, () => [
249
+ vue.createTextVNode(vue.toDisplayString(property.label ?? property.name), 1)
250
+ ]),
251
+ property.sortable ? (vue.openBlock(), vue.createElementBlock("svg", {
252
+ key: 0,
253
+ class: vue.normalizeClass([
254
+ "size-4 transition-colors",
255
+ isSortedColumn(property) ? "text-primary-500" : "text-gray-400"
256
+ ]),
257
+ viewBox: "0 0 24 24",
258
+ fill: "currentColor"
259
+ }, [
260
+ isSortedColumn(property) && __props.sortDirection === "asc" ? (vue.openBlock(), vue.createElementBlock("path", _hoisted_7$3)) : isSortedColumn(property) && __props.sortDirection === "desc" ? (vue.openBlock(), vue.createElementBlock("path", _hoisted_8$3)) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 2 }, [
261
+ _cache[1] || (_cache[1] = vue.createElementVNode("path", {
262
+ d: "M7 14l5-5 5 5H7z",
263
+ class: "opacity-40"
264
+ }, null, -1)),
265
+ _cache[2] || (_cache[2] = vue.createElementVNode("path", {
266
+ d: "M7 10l5 5 5-5H7z",
267
+ class: "opacity-40"
268
+ }, null, -1))
269
+ ], 64))
270
+ ], 2)) : vue.createCommentVNode("", true)
271
+ ], 2)
272
+ ], 10, _hoisted_6$3);
273
+ }), 128)),
274
+ hasActionSlot.value ? (vue.openBlock(), vue.createElementBlock("th", _hoisted_9$3)) : vue.createCommentVNode("", true)
275
+ ])
276
+ ]),
277
+ vue.createElementVNode("tbody", _hoisted_10$2, [
278
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item) => {
279
+ return vue.openBlock(), vue.createElementBlock("tr", {
280
+ key: getKey(item),
281
+ class: vue.normalizeClass(["hover:bg-black/5 dark:hover:bg-white/5 transition-colors", { "bg-primary/5 dark:bg-primary/10": isSelected(item) }])
282
+ }, [
283
+ __props.selectable ? (vue.openBlock(), vue.createElementBlock("td", _hoisted_11$1, [
284
+ isSelectable(item) ? (vue.openBlock(), vue.createBlock(index._sfc_main, {
285
+ key: 0,
286
+ "model-value": isSelected(item),
287
+ "onUpdate:modelValue": ($event) => handleSelect(item)
288
+ }, null, 8, ["model-value", "onUpdate:modelValue"])) : vue.createCommentVNode("", true)
289
+ ])) : vue.createCommentVNode("", true),
290
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(visibleProperties.value, (property) => {
291
+ return vue.openBlock(), vue.createElementBlock("td", {
292
+ key: property.name,
293
+ class: vue.normalizeClass([
294
+ getAlignmentClass(property.align),
295
+ getMainClass(property.main),
296
+ property.className,
297
+ "px-3 py-4"
298
+ ])
299
+ }, [
300
+ vue.renderSlot(_ctx.$slots, "item-" + property.name, {
301
+ item,
302
+ property,
303
+ value: getItemValue(item, property)
304
+ }, () => [
305
+ (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(getTypeComponent(property.type || "text")), {
306
+ value: getItemValue(item, property)
307
+ }, null, 8, ["value"]))
308
+ ])
309
+ ], 2);
310
+ }), 128)),
311
+ hasActionSlot.value ? (vue.openBlock(), vue.createElementBlock("td", _hoisted_12$1, [
312
+ vue.renderSlot(_ctx.$slots, "action", { item })
313
+ ])) : vue.createCommentVNode("", true)
314
+ ], 2);
315
+ }), 128))
316
+ ])
317
+ ]),
318
+ !__props.items || __props.items.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_13, [
319
+ vue.renderSlot(_ctx.$slots, "empty")
320
+ ])) : vue.createCommentVNode("", true)
321
+ ]))
322
+ ]);
323
+ };
324
+ }
325
+ });
326
+ const _hoisted_1$f = { class: "space-y-3" };
327
+ const _hoisted_2$b = { class: "flex items-center gap-3 p-3" };
328
+ const _hoisted_3$6 = { class: "text-sm text-gray-600 dark:text-gray-400" };
329
+ const _hoisted_4$4 = {
330
+ key: 0,
331
+ class: "text-sm text-primary font-medium"
332
+ };
333
+ const _hoisted_5$2 = { class: "p-4 flex items-center gap-4" };
334
+ const _hoisted_6$2 = {
335
+ key: 0,
336
+ class: "shrink-0"
337
+ };
338
+ const _hoisted_7$2 = {
339
+ key: 1,
340
+ class: "size-5"
341
+ };
342
+ const _hoisted_8$2 = { class: "flex-1 min-w-0 overflow-hidden" };
343
+ const _hoisted_9$2 = { class: "shrink-0" };
344
+ const _hoisted_10$1 = { key: 1 };
345
+ const _sfc_main$j = /* @__PURE__ */ vue.defineComponent({
346
+ __name: "MobileList",
347
+ props: {
348
+ items: {},
349
+ keyField: { default: "id" },
350
+ selectable: { type: Boolean, default: false },
351
+ selectedItems: {},
352
+ selectableFilter: {},
353
+ loading: { type: Boolean, default: false },
354
+ loadingItems: { default: 5 }
355
+ },
356
+ emits: ["select", "selectAll"],
357
+ setup(__props, { emit: __emit }) {
358
+ const props = __props;
359
+ const emit = __emit;
360
+ const slots = vue.useSlots();
361
+ const getKey = (item) => {
362
+ const keyValue = item[props.keyField];
363
+ return String(keyValue ?? Math.random());
364
+ };
365
+ const selectableItems = vue.computed(() => {
366
+ if (!props.selectableFilter) return props.items;
367
+ return props.items.filter(props.selectableFilter);
368
+ });
369
+ const allSelected = vue.computed(() => {
370
+ if (selectableItems.value.length === 0) return false;
371
+ return selectableItems.value.every((item) => {
372
+ var _a;
373
+ return (_a = props.selectedItems) == null ? void 0 : _a.has(getKey(item));
374
+ });
375
+ });
376
+ const someSelected = vue.computed(() => {
377
+ var _a;
378
+ return (((_a = props.selectedItems) == null ? void 0 : _a.size) || 0) > 0 && !allSelected.value;
379
+ });
380
+ const isSelected = (item) => {
381
+ var _a;
382
+ return ((_a = props.selectedItems) == null ? void 0 : _a.has(getKey(item))) || false;
383
+ };
384
+ const isSelectable = (item) => {
385
+ if (!props.selectable) return false;
386
+ if (!props.selectableFilter) return true;
387
+ return props.selectableFilter(item);
388
+ };
389
+ const handleSelect = (item) => {
390
+ emit("select", getKey(item));
391
+ };
392
+ const hasEmptySlot = vue.computed(() => !!slots.empty);
393
+ return (_ctx, _cache) => {
394
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$f, [
395
+ __props.loading ? (vue.openBlock(), vue.createBlock(_sfc_main$l, { key: 0 }, {
396
+ default: vue.withCtx(() => [
397
+ vue.createVNode(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main$2, {
398
+ items: __props.loadingItems,
399
+ "show-avatar": "",
400
+ "show-secondary": "",
401
+ "show-action": ""
402
+ }, null, 8, ["items"])
403
+ ]),
404
+ _: 1
405
+ })) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
406
+ __props.selectable && selectableItems.value.length > 0 ? (vue.openBlock(), vue.createBlock(_sfc_main$l, { key: 0 }, {
407
+ default: vue.withCtx(() => [
408
+ vue.createElementVNode("div", _hoisted_2$b, [
409
+ vue.createVNode(index._sfc_main, {
410
+ "model-value": allSelected.value,
411
+ indeterminate: someSelected.value,
412
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("selectAll"))
413
+ }, null, 8, ["model-value", "indeterminate"]),
414
+ vue.createElementVNode("span", _hoisted_3$6, vue.toDisplayString(allSelected.value ? "Tout désélectionner" : "Tout sélectionner"), 1),
415
+ __props.selectedItems && __props.selectedItems.size > 0 ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_4$4, " (" + vue.toDisplayString(__props.selectedItems.size) + " sélectionné" + vue.toDisplayString(__props.selectedItems.size > 1 ? "s" : "") + ") ", 1)) : vue.createCommentVNode("", true)
416
+ ])
417
+ ]),
418
+ _: 1
419
+ })) : vue.createCommentVNode("", true),
420
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item) => {
421
+ return vue.openBlock(), vue.createBlock(_sfc_main$l, {
422
+ key: getKey(item),
423
+ class: vue.normalizeClass(["hover:shadow-lg transition-all duration-200", {
424
+ "ring-2 ring-primary": isSelected(item)
425
+ }])
426
+ }, {
427
+ default: vue.withCtx(() => [
428
+ vue.createElementVNode("div", _hoisted_5$2, [
429
+ __props.selectable ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_6$2, [
430
+ isSelectable(item) ? (vue.openBlock(), vue.createBlock(index._sfc_main, {
431
+ key: 0,
432
+ "model-value": isSelected(item),
433
+ "onUpdate:modelValue": ($event) => handleSelect(item)
434
+ }, null, 8, ["model-value", "onUpdate:modelValue"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$2))
435
+ ])) : vue.createCommentVNode("", true),
436
+ vue.renderSlot(_ctx.$slots, "avatar", { item }),
437
+ vue.createElementVNode("div", _hoisted_8$2, [
438
+ vue.renderSlot(_ctx.$slots, "content", { item })
439
+ ]),
440
+ vue.createElementVNode("div", _hoisted_9$2, [
441
+ vue.renderSlot(_ctx.$slots, "actions", { item })
442
+ ])
443
+ ])
444
+ ]),
445
+ _: 2
446
+ }, 1032, ["class"]);
447
+ }), 128)),
448
+ __props.items.length === 0 && hasEmptySlot.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_10$1, [
449
+ vue.renderSlot(_ctx.$slots, "empty")
450
+ ])) : vue.createCommentVNode("", true)
451
+ ], 64))
452
+ ]);
453
+ };
454
+ }
455
+ });
456
+ const _sfc_main$i = /* @__PURE__ */ vue.defineComponent({
457
+ __name: "ResponsiveList",
458
+ props: {
459
+ items: {},
460
+ columns: {},
461
+ keyField: { default: "id" },
462
+ selectable: { type: Boolean, default: false },
463
+ selectedItems: {},
464
+ selectableFilter: {},
465
+ breakpoint: { default: "lg" },
466
+ sortBy: {},
467
+ sortDirection: {},
468
+ loading: { type: Boolean, default: false },
469
+ loadingRows: { default: 5 }
470
+ },
471
+ emits: ["select", "selectAll", "sort"],
472
+ setup(__props, { emit: __emit }) {
473
+ const props = __props;
474
+ const emit = __emit;
475
+ const slots = vue.useSlots();
476
+ const getColumnKey = (col) => col.key || col.name || "";
477
+ const tableProperties = vue.computed(
478
+ () => props.columns.map((col) => ({
479
+ name: getColumnKey(col),
480
+ label: col.label,
481
+ type: col.type,
482
+ sortable: col.sortable,
483
+ hidden: col.hidden,
484
+ align: col.align,
485
+ className: col.className,
486
+ main: col.main
487
+ }))
488
+ );
489
+ const getCellValue = (item, key) => {
490
+ const keys = key.split(".");
491
+ let value = item;
492
+ for (const k of keys) {
493
+ if (value && typeof value === "object" && k in value) {
494
+ value = value[k];
495
+ } else {
496
+ return void 0;
497
+ }
498
+ }
499
+ return value;
500
+ };
501
+ const hasCellSlot = (key) => {
502
+ return !!slots[`cell-${key}`];
503
+ };
504
+ const hasActionsSlot = vue.computed(() => !!slots.actions);
505
+ const breakpoints = index.useBreakpoints({
506
+ sm: 640,
507
+ md: 768,
508
+ lg: 1024,
509
+ xl: 1280,
510
+ "2xl": 1536
511
+ });
512
+ const isDesktop = vue.computed(() => breakpoints.greaterOrEqual(props.breakpoint).value);
513
+ return (_ctx, _cache) => {
514
+ return vue.openBlock(), vue.createElementBlock("div", null, [
515
+ !isDesktop.value ? (vue.openBlock(), vue.createBlock(_sfc_main$j, {
516
+ key: 0,
517
+ items: __props.items,
518
+ "key-field": __props.keyField,
519
+ selectable: __props.selectable,
520
+ "selected-items": __props.selectedItems,
521
+ "selectable-filter": __props.selectableFilter,
522
+ loading: __props.loading,
523
+ "loading-items": __props.loadingRows,
524
+ onSelect: _cache[0] || (_cache[0] = ($event) => emit("select", $event)),
525
+ onSelectAll: _cache[1] || (_cache[1] = ($event) => emit("selectAll"))
526
+ }, {
527
+ avatar: vue.withCtx(({ item }) => [
528
+ vue.renderSlot(_ctx.$slots, "avatar", { item })
529
+ ]),
530
+ content: vue.withCtx(({ item }) => [
531
+ vue.renderSlot(_ctx.$slots, "mobileContent", { item })
532
+ ]),
533
+ actions: vue.withCtx(({ item }) => [
534
+ vue.renderSlot(_ctx.$slots, "mobileActions", { item }, () => [
535
+ vue.renderSlot(_ctx.$slots, "actions", { item })
536
+ ])
537
+ ]),
538
+ empty: vue.withCtx(() => [
539
+ vue.renderSlot(_ctx.$slots, "empty")
540
+ ]),
541
+ _: 3
542
+ }, 8, ["items", "key-field", "selectable", "selected-items", "selectable-filter", "loading", "loading-items"])) : (vue.openBlock(), vue.createBlock(_sfc_main$l, { key: 1 }, {
543
+ default: vue.withCtx(() => [
544
+ vue.createVNode(_sfc_main$k, {
545
+ items: __props.items,
546
+ properties: tableProperties.value,
547
+ "key-field": __props.keyField,
548
+ selectable: __props.selectable,
549
+ "selected-items": __props.selectedItems,
550
+ "selectable-filter": __props.selectableFilter,
551
+ "sort-by": __props.sortBy,
552
+ "sort-direction": __props.sortDirection,
553
+ loading: __props.loading,
554
+ "loading-rows": __props.loadingRows,
555
+ onSelect: _cache[2] || (_cache[2] = ($event) => emit("select", $event)),
556
+ onSelectAll: _cache[3] || (_cache[3] = ($event) => emit("selectAll")),
557
+ onSort: _cache[4] || (_cache[4] = (col, dir) => emit("sort", col, dir))
558
+ }, vue.createSlots({
559
+ empty: vue.withCtx(() => [
560
+ vue.renderSlot(_ctx.$slots, "empty")
561
+ ]),
562
+ _: 2
563
+ }, [
564
+ vue.renderList(__props.columns, (col) => {
565
+ return {
566
+ name: `item-${getColumnKey(col)}`,
567
+ fn: vue.withCtx(({ item, value }) => [
568
+ hasCellSlot(getColumnKey(col)) ? vue.renderSlot(_ctx.$slots, `cell-${getColumnKey(col)}`, {
569
+ key: 0,
570
+ item,
571
+ value: getCellValue(item, getColumnKey(col))
572
+ }) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
573
+ vue.createTextVNode(vue.toDisplayString(value), 1)
574
+ ], 64))
575
+ ])
576
+ };
577
+ }),
578
+ hasActionsSlot.value ? {
579
+ name: "action",
580
+ fn: vue.withCtx(({ item }) => [
581
+ vue.renderSlot(_ctx.$slots, "actions", { item })
582
+ ]),
583
+ key: "0"
584
+ } : void 0
585
+ ]), 1032, ["items", "properties", "key-field", "selectable", "selected-items", "selectable-filter", "sort-by", "sort-direction", "loading", "loading-rows"])
586
+ ]),
587
+ _: 3
588
+ }))
589
+ ]);
590
+ };
591
+ }
592
+ });
593
+ const _hoisted_1$e = {
594
+ key: 0,
595
+ class: "mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"
596
+ };
597
+ const _hoisted_2$a = { class: "relative" };
598
+ const _hoisted_3$5 = ["disabled", "placeholder"];
599
+ const _hoisted_4$3 = ["disabled"];
600
+ const _hoisted_5$1 = {
601
+ key: 0,
602
+ class: "px-4 py-3 text-sm text-gray-500"
603
+ };
604
+ const _hoisted_6$1 = ["data-index", "onClick"];
605
+ const _hoisted_7$1 = { class: "flex-1 dark:text-white" };
606
+ const _hoisted_8$1 = { class: "text-xs text-gray-400" };
607
+ const _hoisted_9$1 = {
608
+ key: 1,
609
+ class: "mt-1 text-sm text-red-600"
610
+ };
611
+ const _sfc_main$h = /* @__PURE__ */ vue.defineComponent({
612
+ __name: "AutocompleteComponent",
613
+ props: {
614
+ modelValue: {},
615
+ options: {},
616
+ placeholder: {},
617
+ disabled: { type: Boolean },
618
+ label: {},
619
+ error: {},
620
+ noResultsText: {},
621
+ teleport: { type: Boolean, default: true }
622
+ },
623
+ emits: ["update:modelValue"],
624
+ setup(__props, { emit: __emit }) {
625
+ const props = __props;
626
+ const emit = __emit;
627
+ const searchQuery = vue.ref("");
628
+ const inputRef = vue.ref(null);
629
+ const containerRef = vue.ref(null);
630
+ const dropdownRef = vue.ref(null);
631
+ const inputWrapperRef = vue.ref(null);
632
+ const {
633
+ isOpen,
634
+ highlightedIndex,
635
+ dropdownStyle,
636
+ open: openBase,
637
+ close: closeBase,
638
+ handleKeydown: baseHandleKeydown,
639
+ scrollToHighlighted
640
+ } = useDropdown.useDropdown(inputWrapperRef, dropdownRef, {
641
+ teleport: props.teleport
642
+ });
643
+ const filteredOptions = vue.computed(() => {
644
+ if (!searchQuery.value) {
645
+ return props.options;
646
+ }
647
+ const query = searchQuery.value.toLowerCase();
648
+ return props.options.filter(
649
+ (option) => option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query)
650
+ );
651
+ });
652
+ const selectedLabel = vue.computed(() => {
653
+ if (!props.modelValue) return "";
654
+ const option = props.options.find((opt) => opt.value === props.modelValue);
655
+ return (option == null ? void 0 : option.label) || "";
656
+ });
657
+ vue.watch(
658
+ () => props.modelValue,
659
+ () => {
660
+ if (!isOpen.value) {
661
+ searchQuery.value = selectedLabel.value;
662
+ }
663
+ },
664
+ { immediate: true }
665
+ );
666
+ const openDropdown = () => {
667
+ if (props.disabled) return;
668
+ searchQuery.value = "";
669
+ highlightedIndex.value = -1;
670
+ openBase();
671
+ vue.nextTick(() => {
672
+ var _a;
673
+ (_a = inputRef.value) == null ? void 0 : _a.focus();
674
+ });
675
+ };
676
+ const closeDropdown = () => {
677
+ closeBase();
678
+ searchQuery.value = selectedLabel.value;
679
+ };
680
+ const selectOption = (option) => {
681
+ emit("update:modelValue", option.value);
682
+ searchQuery.value = option.label;
683
+ closeDropdown();
684
+ };
685
+ const clearSelection = () => {
686
+ emit("update:modelValue", null);
687
+ searchQuery.value = "";
688
+ highlightedIndex.value = -1;
689
+ vue.nextTick(() => {
690
+ var _a;
691
+ (_a = inputRef.value) == null ? void 0 : _a.focus();
692
+ });
693
+ };
694
+ const handleKeydown = (event) => {
695
+ baseHandleKeydown(event, {
696
+ itemCount: filteredOptions.value.length,
697
+ onSelect: (index2) => {
698
+ if (filteredOptions.value[index2]) {
699
+ selectOption(filteredOptions.value[index2]);
700
+ }
701
+ }
702
+ });
703
+ if (isOpen.value) {
704
+ scrollToHighlighted(dropdownRef.value);
705
+ }
706
+ };
707
+ return (_ctx, _cache) => {
708
+ return vue.openBlock(), vue.createElementBlock("div", {
709
+ ref_key: "containerRef",
710
+ ref: containerRef,
711
+ class: "autocomplete-container"
712
+ }, [
713
+ __props.label ? (vue.openBlock(), vue.createElementBlock("label", _hoisted_1$e, vue.toDisplayString(__props.label), 1)) : vue.createCommentVNode("", true),
714
+ vue.createElementVNode("div", _hoisted_2$a, [
715
+ vue.createElementVNode("div", {
716
+ ref_key: "inputWrapperRef",
717
+ ref: inputWrapperRef,
718
+ class: vue.normalizeClass([{
719
+ "border-red-500": __props.error,
720
+ "border-gray-300 dark:border-gray-600": !__props.error && !vue.unref(isOpen),
721
+ "border-primary ring-2 ring-primary/20": vue.unref(isOpen),
722
+ "cursor-not-allowed opacity-50": __props.disabled
723
+ }, "flex items-center gap-2 rounded-lg border bg-white px-3 py-2 transition dark:bg-gray-800"])
724
+ }, [
725
+ vue.createVNode(vue.unref(vue$1.Icon), {
726
+ class: "size-5 text-gray-400",
727
+ icon: "lucide:search"
728
+ }),
729
+ vue.withDirectives(vue.createElementVNode("input", {
730
+ ref_key: "inputRef",
731
+ ref: inputRef,
732
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
733
+ disabled: __props.disabled,
734
+ placeholder: __props.placeholder || "Search...",
735
+ class: "flex-1 bg-transparent text-sm outline-hidden dark:text-white",
736
+ type: "text",
737
+ onFocus: openDropdown,
738
+ onKeydown: handleKeydown
739
+ }, null, 40, _hoisted_3$5), [
740
+ [vue.vModelText, searchQuery.value]
741
+ ]),
742
+ __props.modelValue && !__props.disabled ? (vue.openBlock(), vue.createElementBlock("button", {
743
+ key: 0,
744
+ class: "rounded p-1 transition hover:bg-gray-100 dark:hover:bg-gray-700",
745
+ type: "button",
746
+ onClick: vue.withModifiers(clearSelection, ["stop"])
747
+ }, [
748
+ vue.createVNode(vue.unref(vue$1.Icon), {
749
+ class: "size-4 text-gray-400",
750
+ icon: "lucide:x"
751
+ })
752
+ ])) : vue.createCommentVNode("", true),
753
+ vue.createElementVNode("button", {
754
+ disabled: __props.disabled,
755
+ class: "rounded p-1 transition hover:bg-gray-100 dark:hover:bg-gray-700",
756
+ type: "button",
757
+ onClick: _cache[1] || (_cache[1] = vue.withModifiers(($event) => vue.unref(isOpen) ? closeDropdown() : openDropdown(), ["stop"]))
758
+ }, [
759
+ vue.createVNode(vue.unref(vue$1.Icon), {
760
+ class: vue.normalizeClass([{ "rotate-180": vue.unref(isOpen) }, "size-4 text-gray-400 transition"]),
761
+ icon: "lucide:chevron-down"
762
+ }, null, 8, ["class"])
763
+ ], 8, _hoisted_4$3)
764
+ ], 2),
765
+ (vue.openBlock(), vue.createBlock(vue.Teleport, {
766
+ to: "body",
767
+ disabled: !__props.teleport
768
+ }, [
769
+ vue.createVNode(vue.Transition, {
770
+ "enter-active-class": "transition duration-100 ease-out",
771
+ "enter-from-class": "opacity-0 scale-95",
772
+ "enter-to-class": "opacity-100 scale-100",
773
+ "leave-active-class": "transition duration-75 ease-in",
774
+ "leave-from-class": "opacity-100 scale-100",
775
+ "leave-to-class": "opacity-0 scale-95"
776
+ }, {
777
+ default: vue.withCtx(() => [
778
+ vue.unref(isOpen) ? (vue.openBlock(), vue.createElementBlock("div", {
779
+ key: 0,
780
+ ref_key: "dropdownRef",
781
+ ref: dropdownRef,
782
+ style: vue.normalizeStyle(vue.unref(dropdownStyle)),
783
+ class: vue.normalizeClass([
784
+ "autocomplete-dropdown z-9999 max-h-60 overflow-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800",
785
+ !__props.teleport && "absolute mt-2 w-full"
786
+ ])
787
+ }, [
788
+ filteredOptions.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5$1, vue.toDisplayString(__props.noResultsText || "No results found"), 1)) : vue.createCommentVNode("", true),
789
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(filteredOptions.value, (option, index2) => {
790
+ return vue.openBlock(), vue.createElementBlock("button", {
791
+ key: option.value,
792
+ class: vue.normalizeClass([{
793
+ "bg-gray-100 dark:bg-gray-700": vue.unref(highlightedIndex) === index2,
794
+ "bg-primary/10": __props.modelValue === option.value
795
+ }, "flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition hover:bg-gray-100 dark:hover:bg-gray-700"]),
796
+ "data-index": index2,
797
+ type: "button",
798
+ onClick: ($event) => selectOption(option)
799
+ }, [
800
+ __props.modelValue === option.value ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
801
+ key: 0,
802
+ class: "size-4 text-primary",
803
+ icon: "lucide:check"
804
+ })) : vue.createCommentVNode("", true),
805
+ vue.createElementVNode("span", _hoisted_7$1, vue.toDisplayString(option.label), 1),
806
+ vue.createElementVNode("span", _hoisted_8$1, "(" + vue.toDisplayString(option.value) + ")", 1)
807
+ ], 10, _hoisted_6$1);
808
+ }), 128))
809
+ ], 6)) : vue.createCommentVNode("", true)
810
+ ]),
811
+ _: 1
812
+ })
813
+ ], 8, ["disabled"]))
814
+ ]),
815
+ __props.error ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_9$1, vue.toDisplayString(__props.error), 1)) : vue.createCommentVNode("", true)
816
+ ], 512);
817
+ };
818
+ }
819
+ });
820
+ const _sfc_main$g = /* @__PURE__ */ vue.defineComponent({
821
+ __name: "TableAction",
822
+ props: {
823
+ link: {},
824
+ icon: {},
825
+ color: {}
826
+ },
827
+ setup(__props) {
828
+ const colorClass = vue.computed(() => {
829
+ switch (__props.color) {
830
+ case "info":
831
+ return "border-blue-200 hover:bg-blue-100 dark:border-blue-800 dark:hover:bg-blue-900";
832
+ case "warning":
833
+ return "border-yellow-200 hover:bg-yellow-100 dark:border-yellow-800 dark:hover:bg-yellow-900";
834
+ case "success":
835
+ return "border-green-200 hover:bg-green-100 dark:border-green-800 dark:hover:bg-green-900";
836
+ case "error":
837
+ return "border-red-200 hover:bg-red-100 dark:border-red-800 dark:hover:bg-red-900";
838
+ default:
839
+ return "border-gray-200 hover:bg-gray-100 dark:border-gray-700 dark:bg-gray-900 dark:hover:bg-gray-800";
840
+ }
841
+ });
842
+ const iconColorClass = vue.computed(() => {
843
+ switch (__props.color) {
844
+ case "info":
845
+ return "text-blue-600 group-hover:text-blue-900 dark:text-blue-400 dark:group-hover:text-blue-100";
846
+ case "warning":
847
+ return "text-yellow-600 group-hover:text-yellow-900 dark:text-yellow-400 dark:group-hover:text-yellow-100";
848
+ case "success":
849
+ return "text-green-600 group-hover:text-green-900 dark:text-green-400 dark:group-hover:text-green-100";
850
+ case "error":
851
+ return "text-red-600 group-hover:text-red-900 dark:text-red-400 dark:group-hover:text-red-100";
852
+ default:
853
+ return "text-gray-600 group-hover:text-gray-900 dark:text-gray-400 dark:group-hover:text-gray-100";
854
+ }
855
+ });
856
+ const linkComponent = vue.computed(() => {
857
+ if (!__props.link) return "button";
858
+ try {
859
+ const RouterLink = vue.resolveComponent("RouterLink");
860
+ if (typeof RouterLink !== "string") {
861
+ return RouterLink;
862
+ }
863
+ } catch {
864
+ }
865
+ return "a";
866
+ });
867
+ const linkProps = vue.computed(() => {
868
+ if (!__props.link) return {};
869
+ if (linkComponent.value === "a") {
870
+ return { href: __props.link };
871
+ }
872
+ return { to: __props.link };
873
+ });
874
+ return (_ctx, _cache) => {
875
+ return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(linkComponent.value), vue.mergeProps(linkProps.value, {
876
+ class: [colorClass.value, "group flex size-8 items-center justify-center rounded-lg border"]
877
+ }), {
878
+ default: vue.withCtx(() => [
879
+ vue.createVNode(vue.unref(vue$1.Icon), {
880
+ class: vue.normalizeClass([iconColorClass.value, "size-4"]),
881
+ icon: __props.icon
882
+ }, null, 8, ["class", "icon"])
883
+ ]),
884
+ _: 1
885
+ }, 16, ["class"]);
886
+ };
887
+ }
888
+ });
889
+ const _hoisted_1$d = { class: "relative inline-block" };
890
+ const _hoisted_2$9 = ["src", "alt"];
891
+ const _hoisted_3$4 = { key: 1 };
892
+ const _sfc_main$f = /* @__PURE__ */ vue.defineComponent({
893
+ __name: "Avatar",
894
+ props: {
895
+ src: {},
896
+ alt: {},
897
+ name: {},
898
+ size: { default: "md" },
899
+ status: {},
900
+ rounded: { default: "full" }
901
+ },
902
+ setup(__props) {
903
+ const props = __props;
904
+ const imageError = vue.ref(false);
905
+ const sizeClasses = {
906
+ xs: "size-6 text-xs",
907
+ sm: "size-8 text-sm",
908
+ md: "size-10 text-base",
909
+ lg: "size-12 text-lg",
910
+ xl: "size-16 text-xl",
911
+ "2xl": "size-20 text-2xl"
912
+ };
913
+ const statusSizes = {
914
+ xs: "size-1.5",
915
+ sm: "size-2",
916
+ md: "size-2.5",
917
+ lg: "size-3",
918
+ xl: "size-4",
919
+ "2xl": "size-5"
920
+ };
921
+ const statusColors = {
922
+ online: "bg-green-500",
923
+ offline: "bg-gray-400",
924
+ away: "bg-yellow-500",
925
+ busy: "bg-red-500"
926
+ };
927
+ const roundedClasses = {
928
+ full: "rounded-full",
929
+ lg: "rounded-lg",
930
+ md: "rounded-md"
931
+ };
932
+ const initials = vue.computed(() => {
933
+ if (!props.name) return "";
934
+ return props.name.split(" ").map((n) => n[0]).slice(0, 2).join("").toUpperCase();
935
+ });
936
+ const showImage = vue.computed(() => props.src && !imageError.value);
937
+ return (_ctx, _cache) => {
938
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$d, [
939
+ vue.createElementVNode("div", {
940
+ class: vue.normalizeClass([
941
+ "flex items-center justify-center overflow-hidden bg-gray-200 font-medium text-gray-600 dark:bg-gray-700 dark:text-gray-300",
942
+ sizeClasses[__props.size],
943
+ roundedClasses[__props.rounded]
944
+ ])
945
+ }, [
946
+ showImage.value ? (vue.openBlock(), vue.createElementBlock("img", {
947
+ key: 0,
948
+ src: __props.src,
949
+ alt: __props.alt || __props.name,
950
+ class: "size-full object-cover",
951
+ onError: _cache[0] || (_cache[0] = ($event) => imageError.value = true)
952
+ }, null, 40, _hoisted_2$9)) : initials.value ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$4, vue.toDisplayString(initials.value), 1)) : (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
953
+ key: 2,
954
+ icon: "lucide:user",
955
+ class: "size-1/2"
956
+ }))
957
+ ], 2),
958
+ __props.status ? (vue.openBlock(), vue.createElementBlock("span", {
959
+ key: 0,
960
+ class: vue.normalizeClass([
961
+ "absolute bottom-0 right-0 block rounded-full ring-2 ring-white dark:ring-gray-900",
962
+ statusSizes[__props.size],
963
+ statusColors[__props.status]
964
+ ])
965
+ }, null, 2)) : vue.createCommentVNode("", true)
966
+ ]);
967
+ };
968
+ }
969
+ });
970
+ const _hoisted_1$c = ["aria-selected", "disabled", "onClick"];
971
+ const _hoisted_2$8 = { class: "mt-4" };
972
+ const _sfc_main$e = /* @__PURE__ */ vue.defineComponent({
973
+ __name: "Tabs",
974
+ props: {
975
+ tabs: {},
976
+ modelValue: {},
977
+ variant: { default: "underline" }
978
+ },
979
+ emits: ["update:modelValue"],
980
+ setup(__props, { emit: __emit }) {
981
+ const props = __props;
982
+ const emit = __emit;
983
+ const activeTab = vue.computed({
984
+ get: () => {
985
+ var _a;
986
+ return props.modelValue || ((_a = props.tabs[0]) == null ? void 0 : _a.key);
987
+ },
988
+ set: (value) => emit("update:modelValue", value)
989
+ });
990
+ const selectTab = (tab) => {
991
+ if (tab.disabled) return;
992
+ activeTab.value = tab.key;
993
+ };
994
+ const variantClasses = {
995
+ underline: {
996
+ container: "border-b border-gray-200 dark:border-gray-700",
997
+ tab: "border-b-2 -mb-px px-4 py-2",
998
+ active: "border-primary text-primary dark:text-primary",
999
+ inactive: "border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-gray-400 dark:hover:text-gray-300"
1000
+ },
1001
+ pills: {
1002
+ container: "gap-2",
1003
+ tab: "px-4 py-2 rounded-lg",
1004
+ active: "bg-primary text-white",
1005
+ inactive: "text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800"
1006
+ },
1007
+ boxed: {
1008
+ container: "bg-gray-100 dark:bg-gray-800 p-1 rounded-lg gap-1",
1009
+ tab: "px-4 py-2 rounded-md",
1010
+ active: "bg-white dark:bg-gray-900 text-gray-900 dark:text-white shadow-sm",
1011
+ inactive: "text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"
1012
+ }
1013
+ };
1014
+ vue.provide("activeTab", activeTab);
1015
+ return (_ctx, _cache) => {
1016
+ return vue.openBlock(), vue.createElementBlock("div", null, [
1017
+ vue.createElementVNode("div", {
1018
+ class: vue.normalizeClass([
1019
+ "flex",
1020
+ variantClasses[__props.variant].container
1021
+ ]),
1022
+ role: "tablist"
1023
+ }, [
1024
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.tabs, (tab) => {
1025
+ return vue.openBlock(), vue.createElementBlock("button", {
1026
+ key: tab.key,
1027
+ type: "button",
1028
+ role: "tab",
1029
+ "aria-selected": activeTab.value === tab.key,
1030
+ disabled: tab.disabled,
1031
+ class: vue.normalizeClass([
1032
+ "text-sm font-medium transition-colors focus:outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
1033
+ variantClasses[__props.variant].tab,
1034
+ activeTab.value === tab.key ? variantClasses[__props.variant].active : variantClasses[__props.variant].inactive
1035
+ ]),
1036
+ onClick: ($event) => selectTab(tab)
1037
+ }, vue.toDisplayString(tab.label), 11, _hoisted_1$c);
1038
+ }), 128))
1039
+ ], 2),
1040
+ vue.createElementVNode("div", _hoisted_2$8, [
1041
+ vue.renderSlot(_ctx.$slots, "default", { activeTab: activeTab.value })
1042
+ ])
1043
+ ]);
1044
+ };
1045
+ }
1046
+ });
1047
+ const _hoisted_1$b = { role: "tabpanel" };
1048
+ const _sfc_main$d = /* @__PURE__ */ vue.defineComponent({
1049
+ __name: "TabPanel",
1050
+ props: {
1051
+ value: {}
1052
+ },
1053
+ setup(__props) {
1054
+ const props = __props;
1055
+ const activeTab = vue.inject("activeTab");
1056
+ const isActive = vue.computed(() => (activeTab == null ? void 0 : activeTab.value) === props.value);
1057
+ return (_ctx, _cache) => {
1058
+ return vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", _hoisted_1$b, [
1059
+ vue.renderSlot(_ctx.$slots, "default")
1060
+ ], 512)), [
1061
+ [vue.vShow, isActive.value]
1062
+ ]);
1063
+ };
1064
+ }
1065
+ });
1066
+ const _hoisted_1$a = {
1067
+ key: 2,
1068
+ class: "text-sm font-semibold"
1069
+ };
1070
+ const _sfc_main$c = /* @__PURE__ */ vue.defineComponent({
1071
+ __name: "Stepper",
1072
+ props: {
1073
+ steps: {},
1074
+ modelValue: {},
1075
+ orientation: { default: "horizontal" }
1076
+ },
1077
+ emits: ["update:modelValue"],
1078
+ setup(__props) {
1079
+ const props = __props;
1080
+ const getCurrentStepIndex = () => {
1081
+ if (props.modelValue === void 0) return 0;
1082
+ const index2 = props.steps.findIndex((s) => s.key === props.modelValue);
1083
+ return index2 >= 0 ? index2 : 0;
1084
+ };
1085
+ const isStepComplete = (index2) => index2 < getCurrentStepIndex();
1086
+ const isStepActive = (index2) => index2 === getCurrentStepIndex();
1087
+ const isStepPending = (index2) => index2 > getCurrentStepIndex();
1088
+ return (_ctx, _cache) => {
1089
+ return vue.openBlock(), vue.createElementBlock("div", {
1090
+ class: vue.normalizeClass([
1091
+ "w-full",
1092
+ __props.orientation === "vertical" ? "flex flex-col" : ""
1093
+ ])
1094
+ }, [
1095
+ vue.createElementVNode("div", {
1096
+ class: vue.normalizeClass([
1097
+ __props.orientation === "horizontal" ? "relative flex items-start justify-between" : "relative flex flex-col gap-4"
1098
+ ])
1099
+ }, [
1100
+ __props.orientation === "horizontal" ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, [
1101
+ _cache[0] || (_cache[0] = vue.createElementVNode("div", {
1102
+ class: "absolute left-0 top-6 h-0.5 w-full bg-gray-200 dark:bg-gray-700",
1103
+ "aria-hidden": "true"
1104
+ }, null, -1)),
1105
+ vue.createElementVNode("div", {
1106
+ class: "absolute left-0 top-6 h-0.5 bg-primary transition-all duration-500 ease-in-out",
1107
+ style: vue.normalizeStyle({
1108
+ width: `${getCurrentStepIndex() / (__props.steps.length - 1) * 100}%`
1109
+ }),
1110
+ "aria-hidden": "true"
1111
+ }, null, 4)
1112
+ ], 64)) : vue.createCommentVNode("", true),
1113
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.steps, (step, index2) => {
1114
+ return vue.openBlock(), vue.createElementBlock("div", {
1115
+ key: step.key,
1116
+ class: vue.normalizeClass([
1117
+ "relative",
1118
+ __props.orientation === "horizontal" ? "flex flex-1 flex-col items-center" : "flex items-start gap-4"
1119
+ ])
1120
+ }, [
1121
+ __props.orientation === "vertical" && index2 < __props.steps.length - 1 ? (vue.openBlock(), vue.createElementBlock("div", {
1122
+ key: 0,
1123
+ class: vue.normalizeClass(["absolute left-6 top-12 h-full w-0.5 -translate-x-1/2", isStepComplete(index2) ? "bg-primary" : "bg-gray-200 dark:bg-gray-700"])
1124
+ }, null, 2)) : vue.createCommentVNode("", true),
1125
+ vue.createElementVNode("div", {
1126
+ class: vue.normalizeClass(["relative z-10 flex size-12 shrink-0 items-center justify-center rounded-full border-2 transition-all duration-300", {
1127
+ "border-primary bg-primary text-white shadow-lg": isStepActive(index2) || isStepComplete(index2),
1128
+ "border-gray-300 bg-white text-gray-400 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-500": isStepPending(index2)
1129
+ }])
1130
+ }, [
1131
+ isStepComplete(index2) ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1132
+ key: 0,
1133
+ icon: "lucide:check",
1134
+ class: "size-6"
1135
+ })) : step.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1136
+ key: 1,
1137
+ icon: step.icon,
1138
+ class: "size-6"
1139
+ }, null, 8, ["icon"])) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_1$a, vue.toDisplayString(index2 + 1), 1))
1140
+ ], 2),
1141
+ vue.createElementVNode("div", {
1142
+ class: vue.normalizeClass([
1143
+ __props.orientation === "horizontal" ? "mt-4 flex flex-col items-center text-center" : "flex flex-col pt-2"
1144
+ ])
1145
+ }, [
1146
+ vue.createElementVNode("p", {
1147
+ class: vue.normalizeClass(["text-sm font-semibold transition-colors", {
1148
+ "text-primary dark:text-primary": isStepActive(index2) || isStepComplete(index2),
1149
+ "text-gray-500 dark:text-gray-400": isStepPending(index2)
1150
+ }])
1151
+ }, vue.toDisplayString(step.title), 3),
1152
+ step.description ? (vue.openBlock(), vue.createElementBlock("p", {
1153
+ key: 0,
1154
+ class: vue.normalizeClass(["mt-1 text-xs", {
1155
+ "text-gray-600 dark:text-gray-300": isStepActive(index2),
1156
+ "text-gray-500 dark:text-gray-400": !isStepActive(index2)
1157
+ }])
1158
+ }, vue.toDisplayString(step.description), 3)) : vue.createCommentVNode("", true)
1159
+ ], 2)
1160
+ ], 2);
1161
+ }), 128))
1162
+ ], 2)
1163
+ ], 2);
1164
+ };
1165
+ }
1166
+ });
1167
+ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
1168
+ __name: "CollapsibleCard",
1169
+ props: {
1170
+ title: {},
1171
+ description: {},
1172
+ defaultExpanded: { type: Boolean, default: true },
1173
+ headerClass: { default: "w-full text-left" },
1174
+ contentClass: { default: "" }
1175
+ },
1176
+ setup(__props) {
1177
+ const props = __props;
1178
+ const slots = vue.useSlots();
1179
+ const isExpanded = vue.ref(props.defaultExpanded);
1180
+ const toggle = () => {
1181
+ isExpanded.value = !isExpanded.value;
1182
+ };
1183
+ const hasCustomHeader = () => !!slots.header;
1184
+ return (_ctx, _cache) => {
1185
+ return vue.openBlock(), vue.createBlock(_sfc_main$l, null, vue.createSlots({
1186
+ default: vue.withCtx(() => [
1187
+ vue.createVNode(vue.Transition, {
1188
+ "enter-active-class": "transition-all duration-200 ease-out",
1189
+ "enter-from-class": "opacity-0 max-h-0",
1190
+ "enter-to-class": "opacity-100 max-h-[2000px]",
1191
+ "leave-active-class": "transition-all duration-200 ease-in",
1192
+ "leave-from-class": "opacity-100 max-h-[2000px]",
1193
+ "leave-to-class": "opacity-0 max-h-0"
1194
+ }, {
1195
+ default: vue.withCtx(() => [
1196
+ vue.withDirectives(vue.createElementVNode("div", {
1197
+ class: vue.normalizeClass(["overflow-hidden", __props.contentClass])
1198
+ }, [
1199
+ vue.createElementVNode("div", {
1200
+ class: vue.normalizeClass(hasCustomHeader() ? "" : "space-y-4 p-6")
1201
+ }, [
1202
+ vue.renderSlot(_ctx.$slots, "default")
1203
+ ], 2)
1204
+ ], 2), [
1205
+ [vue.vShow, isExpanded.value]
1206
+ ])
1207
+ ]),
1208
+ _: 3
1209
+ })
1210
+ ]),
1211
+ _: 2
1212
+ }, [
1213
+ hasCustomHeader() ? {
1214
+ name: "header",
1215
+ fn: vue.withCtx(() => [
1216
+ vue.createElementVNode("button", {
1217
+ type: "button",
1218
+ class: vue.normalizeClass(__props.headerClass),
1219
+ onClick: toggle
1220
+ }, [
1221
+ vue.renderSlot(_ctx.$slots, "header", {
1222
+ expanded: isExpanded.value,
1223
+ toggle
1224
+ })
1225
+ ], 2)
1226
+ ]),
1227
+ key: "0"
1228
+ } : __props.title || __props.description ? {
1229
+ name: "title",
1230
+ fn: vue.withCtx(() => [
1231
+ vue.createTextVNode(vue.toDisplayString(__props.title), 1)
1232
+ ]),
1233
+ key: "1"
1234
+ } : void 0,
1235
+ !hasCustomHeader() && __props.description ? {
1236
+ name: "description",
1237
+ fn: vue.withCtx(() => [
1238
+ vue.createTextVNode(vue.toDisplayString(__props.description), 1)
1239
+ ]),
1240
+ key: "2"
1241
+ } : void 0,
1242
+ !hasCustomHeader() ? {
1243
+ name: "actions",
1244
+ fn: vue.withCtx(() => [
1245
+ vue.renderSlot(_ctx.$slots, "actions"),
1246
+ vue.createElementVNode("button", {
1247
+ type: "button",
1248
+ class: "rounded-lg p-1.5 text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800",
1249
+ onClick: toggle
1250
+ }, [
1251
+ vue.createVNode(vue.unref(vue$1.Icon), {
1252
+ icon: isExpanded.value ? "lucide:chevron-up" : "lucide:chevron-down",
1253
+ class: "size-5"
1254
+ }, null, 8, ["icon"])
1255
+ ])
1256
+ ]),
1257
+ key: "3"
1258
+ } : void 0
1259
+ ]), 1024);
1260
+ };
1261
+ }
1262
+ });
1263
+ const _hoisted_1$9 = ["aria-describedby"];
1264
+ const _hoisted_2$7 = ["id"];
1265
+ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
1266
+ __name: "Tooltip",
1267
+ props: {
1268
+ content: {},
1269
+ position: { default: "top" },
1270
+ delay: { default: 0 },
1271
+ disabled: { type: Boolean, default: false },
1272
+ id: {}
1273
+ },
1274
+ setup(__props) {
1275
+ const props = __props;
1276
+ const { id: tooltipId } = useId.useId({ prefix: "tooltip", id: props.id });
1277
+ const isVisible = vue.ref(false);
1278
+ let timeoutId = null;
1279
+ const show = () => {
1280
+ if (props.disabled) return;
1281
+ if (props.delay > 0) {
1282
+ timeoutId = setTimeout(() => {
1283
+ isVisible.value = true;
1284
+ }, props.delay);
1285
+ } else {
1286
+ isVisible.value = true;
1287
+ }
1288
+ };
1289
+ const hide = () => {
1290
+ if (timeoutId) {
1291
+ clearTimeout(timeoutId);
1292
+ timeoutId = null;
1293
+ }
1294
+ isVisible.value = false;
1295
+ };
1296
+ const positionClasses = vue.computed(() => {
1297
+ const base = "absolute z-50 px-2 py-1 text-xs font-medium text-white bg-gray-900 rounded shadow-lg whitespace-nowrap dark:bg-gray-700";
1298
+ const arrow = "after:absolute after:border-4 after:border-transparent";
1299
+ switch (props.position) {
1300
+ case "top":
1301
+ return `${base} ${arrow} bottom-full left-1/2 -translate-x-1/2 mb-2 after:top-full after:left-1/2 after:-translate-x-1/2 after:border-t-gray-900 dark:after:border-t-gray-700`;
1302
+ case "bottom":
1303
+ return `${base} ${arrow} top-full left-1/2 -translate-x-1/2 mt-2 after:bottom-full after:left-1/2 after:-translate-x-1/2 after:border-b-gray-900 dark:after:border-b-gray-700`;
1304
+ case "left":
1305
+ return `${base} ${arrow} right-full top-1/2 -translate-y-1/2 mr-2 after:left-full after:top-1/2 after:-translate-y-1/2 after:border-l-gray-900 dark:after:border-l-gray-700`;
1306
+ case "right":
1307
+ return `${base} ${arrow} left-full top-1/2 -translate-y-1/2 ml-2 after:right-full after:top-1/2 after:-translate-y-1/2 after:border-r-gray-900 dark:after:border-r-gray-700`;
1308
+ default:
1309
+ return base;
1310
+ }
1311
+ });
1312
+ return (_ctx, _cache) => {
1313
+ return vue.openBlock(), vue.createElementBlock("div", {
1314
+ class: "relative inline-block",
1315
+ "aria-describedby": __props.content && !__props.disabled ? vue.unref(tooltipId) : void 0,
1316
+ onMouseenter: show,
1317
+ onMouseleave: hide,
1318
+ onFocus: show,
1319
+ onBlur: hide
1320
+ }, [
1321
+ vue.renderSlot(_ctx.$slots, "default"),
1322
+ vue.createVNode(vue.Transition, {
1323
+ "enter-active-class": "transition duration-150 ease-out",
1324
+ "enter-from-class": "opacity-0 scale-95",
1325
+ "enter-to-class": "opacity-100 scale-100",
1326
+ "leave-active-class": "transition duration-100 ease-in",
1327
+ "leave-from-class": "opacity-100 scale-100",
1328
+ "leave-to-class": "opacity-0 scale-95"
1329
+ }, {
1330
+ default: vue.withCtx(() => [
1331
+ isVisible.value && __props.content ? (vue.openBlock(), vue.createElementBlock("div", {
1332
+ key: 0,
1333
+ id: vue.unref(tooltipId),
1334
+ class: vue.normalizeClass(positionClasses.value),
1335
+ role: "tooltip"
1336
+ }, vue.toDisplayString(__props.content), 11, _hoisted_2$7)) : vue.createCommentVNode("", true)
1337
+ ]),
1338
+ _: 1
1339
+ })
1340
+ ], 40, _hoisted_1$9);
1341
+ };
1342
+ }
1343
+ });
1344
+ const _hoisted_1$8 = ["id", "aria-expanded", "aria-controls"];
1345
+ const _hoisted_2$6 = ["id", "aria-labelledby"];
1346
+ const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
1347
+ __name: "Popover",
1348
+ props: {
1349
+ position: { default: "bottom" },
1350
+ hover: { type: Boolean, default: false },
1351
+ teleport: { type: Boolean, default: true },
1352
+ width: { default: "auto" },
1353
+ id: {}
1354
+ },
1355
+ setup(__props) {
1356
+ const props = __props;
1357
+ const { related } = useId.useId({ prefix: "popover", id: props.id });
1358
+ const triggerId = vue.computed(() => related("trigger"));
1359
+ const popoverId = vue.computed(() => related("content"));
1360
+ const triggerRef = vue.ref();
1361
+ const popoverRef = vue.ref();
1362
+ const { isOpen, dropdownStyle, toggle, close, open } = useDropdown.useDropdown(triggerRef, popoverRef, {
1363
+ teleport: props.teleport,
1364
+ gap: 8
1365
+ });
1366
+ const handleTrigger = () => {
1367
+ if (!props.hover) {
1368
+ toggle();
1369
+ }
1370
+ };
1371
+ const handleMouseEnter = () => {
1372
+ if (props.hover) {
1373
+ open();
1374
+ }
1375
+ };
1376
+ const handleMouseLeave = () => {
1377
+ if (props.hover) {
1378
+ close();
1379
+ }
1380
+ };
1381
+ const widthClasses = {
1382
+ auto: "w-auto min-w-48",
1383
+ sm: "w-48",
1384
+ md: "w-64",
1385
+ lg: "w-80"
1386
+ };
1387
+ return (_ctx, _cache) => {
1388
+ return vue.openBlock(), vue.createElementBlock("div", {
1389
+ class: "relative inline-block",
1390
+ onMouseenter: handleMouseEnter,
1391
+ onMouseleave: handleMouseLeave
1392
+ }, [
1393
+ vue.createElementVNode("div", {
1394
+ ref_key: "triggerRef",
1395
+ ref: triggerRef,
1396
+ id: triggerId.value,
1397
+ "aria-expanded": vue.unref(isOpen),
1398
+ "aria-controls": popoverId.value,
1399
+ onClick: handleTrigger
1400
+ }, [
1401
+ vue.renderSlot(_ctx.$slots, "trigger")
1402
+ ], 8, _hoisted_1$8),
1403
+ (vue.openBlock(), vue.createBlock(vue.Teleport, {
1404
+ to: "body",
1405
+ disabled: !__props.teleport
1406
+ }, [
1407
+ vue.createVNode(vue.Transition, {
1408
+ "enter-active-class": "transition duration-150 ease-out",
1409
+ "enter-from-class": "opacity-0 scale-95",
1410
+ "enter-to-class": "opacity-100 scale-100",
1411
+ "leave-active-class": "transition duration-100 ease-in",
1412
+ "leave-from-class": "opacity-100 scale-100",
1413
+ "leave-to-class": "opacity-0 scale-95"
1414
+ }, {
1415
+ default: vue.withCtx(() => [
1416
+ vue.unref(isOpen) ? (vue.openBlock(), vue.createElementBlock("div", {
1417
+ key: 0,
1418
+ id: popoverId.value,
1419
+ ref_key: "popoverRef",
1420
+ ref: popoverRef,
1421
+ role: "dialog",
1422
+ "aria-labelledby": triggerId.value,
1423
+ style: vue.normalizeStyle(vue.unref(dropdownStyle)),
1424
+ class: vue.normalizeClass([
1425
+ "z-9999 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-700 dark:bg-gray-800",
1426
+ widthClasses[__props.width]
1427
+ ])
1428
+ }, [
1429
+ vue.renderSlot(_ctx.$slots, "default", { close: vue.unref(close) })
1430
+ ], 14, _hoisted_2$6)) : vue.createCommentVNode("", true)
1431
+ ]),
1432
+ _: 3
1433
+ })
1434
+ ], 8, ["disabled"]))
1435
+ ], 32);
1436
+ };
1437
+ }
1438
+ });
1439
+ const _hoisted_1$7 = {
1440
+ key: 0,
1441
+ class: "flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700"
1442
+ };
1443
+ const _hoisted_2$5 = { class: "text-lg font-semibold text-gray-900 dark:text-white" };
1444
+ const _hoisted_3$3 = { class: "flex-1 overflow-y-auto p-4" };
1445
+ const _hoisted_4$2 = {
1446
+ key: 1,
1447
+ class: "px-4 py-3 border-t border-gray-200 dark:border-gray-700"
1448
+ };
1449
+ const _sfc_main$8 = /* @__PURE__ */ vue.defineComponent({
1450
+ __name: "Drawer",
1451
+ props: {
1452
+ modelValue: { type: Boolean },
1453
+ position: { default: "right" },
1454
+ size: { default: "md" },
1455
+ title: {},
1456
+ showClose: { type: Boolean, default: true },
1457
+ closeOnOverlay: { type: Boolean, default: true },
1458
+ closeOnEscape: { type: Boolean, default: true },
1459
+ overlay: { type: Boolean, default: true }
1460
+ },
1461
+ emits: ["update:modelValue"],
1462
+ setup(__props, { emit: __emit }) {
1463
+ const props = __props;
1464
+ const emit = __emit;
1465
+ const close = () => {
1466
+ emit("update:modelValue", false);
1467
+ };
1468
+ const handleOverlayClick = () => {
1469
+ if (props.closeOnOverlay) {
1470
+ close();
1471
+ }
1472
+ };
1473
+ const handleKeydown = (e) => {
1474
+ if (e.key === "Escape" && props.closeOnEscape && props.modelValue) {
1475
+ close();
1476
+ }
1477
+ };
1478
+ vue.onMounted(() => {
1479
+ document.addEventListener("keydown", handleKeydown);
1480
+ });
1481
+ vue.onUnmounted(() => {
1482
+ document.removeEventListener("keydown", handleKeydown);
1483
+ });
1484
+ vue.watch(
1485
+ () => props.modelValue,
1486
+ (isOpen) => {
1487
+ if (isOpen) {
1488
+ document.body.style.overflow = "hidden";
1489
+ } else {
1490
+ document.body.style.overflow = "";
1491
+ }
1492
+ }
1493
+ );
1494
+ const sizeClasses = vue.computed(() => {
1495
+ const isHorizontal = props.position === "left" || props.position === "right";
1496
+ const sizes = {
1497
+ sm: isHorizontal ? "w-64" : "h-32",
1498
+ md: isHorizontal ? "w-80" : "h-48",
1499
+ lg: isHorizontal ? "w-96" : "h-64",
1500
+ xl: isHorizontal ? "w-lg" : "h-96",
1501
+ full: isHorizontal ? "w-screen" : "h-screen"
1502
+ };
1503
+ return sizes[props.size];
1504
+ });
1505
+ const positionClasses = vue.computed(() => {
1506
+ const base = "fixed bg-white dark:bg-gray-800 shadow-xl flex flex-col";
1507
+ switch (props.position) {
1508
+ case "left":
1509
+ return `${base} inset-y-0 left-0 ${sizeClasses.value}`;
1510
+ case "right":
1511
+ return `${base} inset-y-0 right-0 ${sizeClasses.value}`;
1512
+ case "top":
1513
+ return `${base} inset-x-0 top-0 ${sizeClasses.value}`;
1514
+ case "bottom":
1515
+ return `${base} inset-x-0 bottom-0 ${sizeClasses.value}`;
1516
+ default:
1517
+ return base;
1518
+ }
1519
+ });
1520
+ const transformClasses = vue.computed(() => {
1521
+ switch (props.position) {
1522
+ case "left":
1523
+ return { enter: "-translate-x-full", leave: "-translate-x-full" };
1524
+ case "right":
1525
+ return { enter: "translate-x-full", leave: "translate-x-full" };
1526
+ case "top":
1527
+ return { enter: "-translate-y-full", leave: "-translate-y-full" };
1528
+ case "bottom":
1529
+ return { enter: "translate-y-full", leave: "translate-y-full" };
1530
+ default:
1531
+ return { enter: "", leave: "" };
1532
+ }
1533
+ });
1534
+ return (_ctx, _cache) => {
1535
+ return vue.openBlock(), vue.createBlock(vue.Teleport, { to: "body" }, [
1536
+ vue.createVNode(vue.Transition, {
1537
+ "enter-active-class": "transition-opacity duration-300 ease-out",
1538
+ "enter-from-class": "opacity-0",
1539
+ "enter-to-class": "opacity-100",
1540
+ "leave-active-class": "transition-opacity duration-200 ease-in",
1541
+ "leave-from-class": "opacity-100",
1542
+ "leave-to-class": "opacity-0"
1543
+ }, {
1544
+ default: vue.withCtx(() => [
1545
+ __props.modelValue && __props.overlay ? (vue.openBlock(), vue.createElementBlock("div", {
1546
+ key: 0,
1547
+ class: "fixed inset-0 z-40 bg-black/50",
1548
+ onClick: handleOverlayClick
1549
+ })) : vue.createCommentVNode("", true)
1550
+ ]),
1551
+ _: 1
1552
+ }),
1553
+ vue.createVNode(vue.Transition, {
1554
+ "enter-active-class": "transition-transform duration-300 ease-out",
1555
+ "enter-from-class": transformClasses.value.enter,
1556
+ "enter-to-class": "translate-x-0 translate-y-0",
1557
+ "leave-active-class": "transition-transform duration-200 ease-in",
1558
+ "leave-from-class": "translate-x-0 translate-y-0",
1559
+ "leave-to-class": transformClasses.value.leave
1560
+ }, {
1561
+ default: vue.withCtx(() => [
1562
+ __props.modelValue ? (vue.openBlock(), vue.createElementBlock("div", {
1563
+ key: 0,
1564
+ class: vue.normalizeClass([positionClasses.value, "z-50"]),
1565
+ role: "dialog",
1566
+ "aria-modal": "true"
1567
+ }, [
1568
+ __props.title || __props.showClose || _ctx.$slots.header ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$7, [
1569
+ vue.renderSlot(_ctx.$slots, "header", {}, () => [
1570
+ vue.createElementVNode("h2", _hoisted_2$5, vue.toDisplayString(__props.title), 1)
1571
+ ]),
1572
+ __props.showClose ? (vue.openBlock(), vue.createElementBlock("button", {
1573
+ key: 0,
1574
+ type: "button",
1575
+ class: "p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700",
1576
+ onClick: close
1577
+ }, [
1578
+ vue.createVNode(vue.unref(vue$1.Icon), {
1579
+ icon: "heroicons:x-mark",
1580
+ class: "size-5"
1581
+ })
1582
+ ])) : vue.createCommentVNode("", true)
1583
+ ])) : vue.createCommentVNode("", true),
1584
+ vue.createElementVNode("div", _hoisted_3$3, [
1585
+ vue.renderSlot(_ctx.$slots, "default")
1586
+ ]),
1587
+ _ctx.$slots.footer ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$2, [
1588
+ vue.renderSlot(_ctx.$slots, "footer")
1589
+ ])) : vue.createCommentVNode("", true)
1590
+ ], 2)) : vue.createCommentVNode("", true)
1591
+ ]),
1592
+ _: 3
1593
+ }, 8, ["enter-from-class", "leave-to-class"])
1594
+ ]);
1595
+ };
1596
+ }
1597
+ });
1598
+ const _hoisted_1$6 = { "aria-label": "Breadcrumb" };
1599
+ const _hoisted_2$4 = { class: "flex items-center flex-wrap gap-1 text-sm" };
1600
+ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
1601
+ __name: "Breadcrumb",
1602
+ props: {
1603
+ items: {},
1604
+ separator: { default: "heroicons:chevron-right" },
1605
+ homeIcon: { default: "heroicons:home" },
1606
+ showHomeIcon: { type: Boolean, default: true }
1607
+ },
1608
+ emits: ["click"],
1609
+ setup(__props) {
1610
+ return (_ctx, _cache) => {
1611
+ return vue.openBlock(), vue.createElementBlock("nav", _hoisted_1$6, [
1612
+ vue.createElementVNode("ol", _hoisted_2$4, [
1613
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item, index2) => {
1614
+ return vue.openBlock(), vue.createElementBlock("li", {
1615
+ key: index2,
1616
+ class: "flex items-center"
1617
+ }, [
1618
+ index2 > 0 ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1619
+ key: 0,
1620
+ icon: __props.separator,
1621
+ class: "size-4 mx-2 text-gray-400 dark:text-gray-500 shrink-0"
1622
+ }, null, 8, ["icon"])) : vue.createCommentVNode("", true),
1623
+ (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(item.to ? "router-link" : item.href ? "a" : "span"), {
1624
+ to: item.to,
1625
+ href: item.href,
1626
+ class: vue.normalizeClass([
1627
+ "flex items-center gap-1.5 transition-colors",
1628
+ index2 === __props.items.length - 1 ? "text-gray-900 dark:text-white font-medium cursor-default" : "text-gray-500 dark:text-gray-400 hover:text-primary-600 dark:hover:text-primary-400"
1629
+ ]),
1630
+ "aria-current": index2 === __props.items.length - 1 ? "page" : void 0,
1631
+ onClick: ($event) => _ctx.$emit("click", item, index2)
1632
+ }, {
1633
+ default: vue.withCtx(() => [
1634
+ index2 === 0 && __props.showHomeIcon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1635
+ key: 0,
1636
+ icon: item.icon || __props.homeIcon,
1637
+ class: "size-4"
1638
+ }, null, 8, ["icon"])) : item.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1639
+ key: 1,
1640
+ icon: item.icon,
1641
+ class: "size-4"
1642
+ }, null, 8, ["icon"])) : vue.createCommentVNode("", true),
1643
+ vue.createElementVNode("span", null, vue.toDisplayString(item.label), 1)
1644
+ ]),
1645
+ _: 2
1646
+ }, 1032, ["to", "href", "class", "aria-current", "onClick"]))
1647
+ ]);
1648
+ }), 128))
1649
+ ])
1650
+ ]);
1651
+ };
1652
+ }
1653
+ });
1654
+ const _hoisted_1$5 = { class: "divide-y divide-gray-200 dark:divide-gray-700 border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden" };
1655
+ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
1656
+ __name: "Accordion",
1657
+ props: {
1658
+ mode: { default: "single" },
1659
+ defaultOpen: { default: () => [] }
1660
+ },
1661
+ setup(__props) {
1662
+ const props = __props;
1663
+ const openItems = vue.ref(new Set(props.defaultOpen));
1664
+ const toggle = (key) => {
1665
+ if (openItems.value.has(key)) {
1666
+ openItems.value.delete(key);
1667
+ } else {
1668
+ if (props.mode === "single") {
1669
+ openItems.value.clear();
1670
+ }
1671
+ openItems.value.add(key);
1672
+ }
1673
+ openItems.value = new Set(openItems.value);
1674
+ };
1675
+ const isOpen = (key) => openItems.value.has(key);
1676
+ vue.provide("accordion", {
1677
+ toggle,
1678
+ isOpen
1679
+ });
1680
+ return (_ctx, _cache) => {
1681
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$5, [
1682
+ vue.renderSlot(_ctx.$slots, "default")
1683
+ ]);
1684
+ };
1685
+ }
1686
+ });
1687
+ const _hoisted_1$4 = ["id", "disabled", "aria-expanded", "aria-controls"];
1688
+ const _hoisted_2$3 = { class: "flex items-center gap-2 font-medium" };
1689
+ const _hoisted_3$2 = ["id", "aria-labelledby"];
1690
+ const _hoisted_4$1 = { class: "px-4 py-3 bg-gray-50 dark:bg-gray-900 text-gray-700 dark:text-gray-300" };
1691
+ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
1692
+ __name: "AccordionItem",
1693
+ props: {
1694
+ itemKey: {},
1695
+ title: {},
1696
+ icon: {},
1697
+ disabled: { type: Boolean },
1698
+ id: {}
1699
+ },
1700
+ setup(__props) {
1701
+ const props = __props;
1702
+ const { related } = useId.useId({ prefix: "accordion", id: props.id });
1703
+ const headerId = vue.computed(() => related("header"));
1704
+ const panelId = vue.computed(() => related("panel"));
1705
+ const accordion = vue.inject("accordion");
1706
+ const isOpen = vue.computed(() => (accordion == null ? void 0 : accordion.isOpen(props.itemKey)) ?? false);
1707
+ const toggle = () => {
1708
+ if (!props.disabled) {
1709
+ accordion == null ? void 0 : accordion.toggle(props.itemKey);
1710
+ }
1711
+ };
1712
+ return (_ctx, _cache) => {
1713
+ return vue.openBlock(), vue.createElementBlock("div", null, [
1714
+ vue.createElementVNode("button", {
1715
+ id: headerId.value,
1716
+ type: "button",
1717
+ class: vue.normalizeClass(["flex items-center justify-between w-full px-4 py-3 text-left transition-colors", [
1718
+ __props.disabled ? "bg-gray-50 text-gray-400 cursor-not-allowed dark:bg-gray-800 dark:text-gray-500" : "bg-white hover:bg-gray-50 text-gray-900 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-white"
1719
+ ]]),
1720
+ disabled: __props.disabled,
1721
+ "aria-expanded": isOpen.value,
1722
+ "aria-controls": panelId.value,
1723
+ onClick: toggle
1724
+ }, [
1725
+ vue.createElementVNode("span", _hoisted_2$3, [
1726
+ __props.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1727
+ key: 0,
1728
+ icon: __props.icon,
1729
+ class: "size-5",
1730
+ "aria-hidden": "true"
1731
+ }, null, 8, ["icon"])) : vue.createCommentVNode("", true),
1732
+ vue.createTextVNode(" " + vue.toDisplayString(__props.title), 1)
1733
+ ]),
1734
+ vue.createVNode(vue.unref(vue$1.Icon), {
1735
+ icon: "heroicons:chevron-down",
1736
+ class: vue.normalizeClass(["size-5 transition-transform duration-200", { "rotate-180": isOpen.value }]),
1737
+ "aria-hidden": "true"
1738
+ }, null, 8, ["class"])
1739
+ ], 10, _hoisted_1$4),
1740
+ vue.createVNode(vue.Transition, {
1741
+ "enter-active-class": "transition-all duration-200 ease-out",
1742
+ "enter-from-class": "opacity-0 max-h-0",
1743
+ "enter-to-class": "opacity-100 max-h-screen",
1744
+ "leave-active-class": "transition-all duration-150 ease-in",
1745
+ "leave-from-class": "opacity-100 max-h-screen",
1746
+ "leave-to-class": "opacity-0 max-h-0"
1747
+ }, {
1748
+ default: vue.withCtx(() => [
1749
+ vue.withDirectives(vue.createElementVNode("div", {
1750
+ id: panelId.value,
1751
+ role: "region",
1752
+ "aria-labelledby": headerId.value,
1753
+ class: "overflow-hidden"
1754
+ }, [
1755
+ vue.createElementVNode("div", _hoisted_4$1, [
1756
+ vue.renderSlot(_ctx.$slots, "default")
1757
+ ])
1758
+ ], 8, _hoisted_3$2), [
1759
+ [vue.vShow, isOpen.value]
1760
+ ])
1761
+ ]),
1762
+ _: 3
1763
+ })
1764
+ ]);
1765
+ };
1766
+ }
1767
+ });
1768
+ const _hoisted_1$3 = {
1769
+ key: 0,
1770
+ class: "relative"
1771
+ };
1772
+ const _hoisted_2$2 = { class: "flex items-start gap-4" };
1773
+ const _hoisted_3$1 = { class: "flex-1 min-w-0 pt-0.5" };
1774
+ const _hoisted_4 = { class: "flex items-center justify-between gap-2" };
1775
+ const _hoisted_5 = { class: "text-sm font-medium text-gray-900 dark:text-white" };
1776
+ const _hoisted_6 = {
1777
+ key: 0,
1778
+ class: "text-xs text-gray-500 dark:text-gray-400 whitespace-nowrap"
1779
+ };
1780
+ const _hoisted_7 = {
1781
+ key: 0,
1782
+ class: "mt-1 text-sm text-gray-600 dark:text-gray-400"
1783
+ };
1784
+ const _hoisted_8 = {
1785
+ key: 1,
1786
+ class: "flex items-start overflow-x-auto pb-4"
1787
+ };
1788
+ const _hoisted_9 = { class: "flex items-center w-full" };
1789
+ const _hoisted_10 = { class: "mt-2 text-center max-w-[120px]" };
1790
+ const _hoisted_11 = { class: "text-xs font-medium text-gray-900 dark:text-white" };
1791
+ const _hoisted_12 = {
1792
+ key: 0,
1793
+ class: "text-xs text-gray-500 dark:text-gray-400"
1794
+ };
1795
+ const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
1796
+ __name: "Timeline",
1797
+ props: {
1798
+ items: {},
1799
+ orientation: { default: "vertical" }
1800
+ },
1801
+ setup(__props) {
1802
+ const getStatusClasses = (status) => {
1803
+ switch (status) {
1804
+ case "completed":
1805
+ return {
1806
+ dot: "bg-green-500",
1807
+ line: "bg-green-500",
1808
+ icon: "text-white"
1809
+ };
1810
+ case "current":
1811
+ return {
1812
+ dot: "bg-primary-500 ring-4 ring-primary-100 dark:ring-primary-900",
1813
+ line: "bg-gray-200 dark:bg-gray-700",
1814
+ icon: "text-white"
1815
+ };
1816
+ case "error":
1817
+ return {
1818
+ dot: "bg-red-500",
1819
+ line: "bg-red-500",
1820
+ icon: "text-white"
1821
+ };
1822
+ default:
1823
+ return {
1824
+ dot: "bg-gray-300 dark:bg-gray-600",
1825
+ line: "bg-gray-200 dark:bg-gray-700",
1826
+ icon: "text-gray-500 dark:text-gray-400"
1827
+ };
1828
+ }
1829
+ };
1830
+ const getDefaultIcon = (status) => {
1831
+ switch (status) {
1832
+ case "completed":
1833
+ return "heroicons:check";
1834
+ case "error":
1835
+ return "heroicons:x-mark";
1836
+ default:
1837
+ return "";
1838
+ }
1839
+ };
1840
+ return (_ctx, _cache) => {
1841
+ return __props.orientation === "vertical" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$3, [
1842
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item, index2) => {
1843
+ return vue.openBlock(), vue.createElementBlock("div", {
1844
+ key: item.key,
1845
+ class: "relative pb-8 last:pb-0"
1846
+ }, [
1847
+ index2 < __props.items.length - 1 ? (vue.openBlock(), vue.createElementBlock("div", {
1848
+ key: 0,
1849
+ class: vue.normalizeClass(["absolute left-4 top-8 w-0.5 h-full -ml-px", getStatusClasses(item.status).line])
1850
+ }, null, 2)) : vue.createCommentVNode("", true),
1851
+ vue.createElementVNode("div", _hoisted_2$2, [
1852
+ vue.createElementVNode("div", {
1853
+ class: vue.normalizeClass(["relative z-10 flex items-center justify-center size-8 rounded-full shrink-0", getStatusClasses(item.status).dot])
1854
+ }, [
1855
+ item.icon || getDefaultIcon(item.status) ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1856
+ key: 0,
1857
+ icon: item.icon || getDefaultIcon(item.status),
1858
+ class: vue.normalizeClass(["size-4", getStatusClasses(item.status).icon])
1859
+ }, null, 8, ["icon", "class"])) : vue.createCommentVNode("", true)
1860
+ ], 2),
1861
+ vue.createElementVNode("div", _hoisted_3$1, [
1862
+ vue.createElementVNode("div", _hoisted_4, [
1863
+ vue.createElementVNode("h3", _hoisted_5, vue.toDisplayString(item.title), 1),
1864
+ item.date ? (vue.openBlock(), vue.createElementBlock("time", _hoisted_6, vue.toDisplayString(item.date), 1)) : vue.createCommentVNode("", true)
1865
+ ]),
1866
+ item.description ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_7, vue.toDisplayString(item.description), 1)) : vue.createCommentVNode("", true),
1867
+ vue.renderSlot(_ctx.$slots, item.key, { item })
1868
+ ])
1869
+ ])
1870
+ ]);
1871
+ }), 128))
1872
+ ])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_8, [
1873
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item, index2) => {
1874
+ return vue.openBlock(), vue.createElementBlock("div", {
1875
+ key: item.key,
1876
+ class: vue.normalizeClass(["flex flex-col items-center shrink-0", { "flex-1": index2 < __props.items.length - 1 }])
1877
+ }, [
1878
+ vue.createElementVNode("div", _hoisted_9, [
1879
+ vue.createElementVNode("div", {
1880
+ class: vue.normalizeClass(["relative z-10 flex items-center justify-center size-8 rounded-full shrink-0", getStatusClasses(item.status).dot])
1881
+ }, [
1882
+ item.icon || getDefaultIcon(item.status) ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1883
+ key: 0,
1884
+ icon: item.icon || getDefaultIcon(item.status),
1885
+ class: vue.normalizeClass(["size-4", getStatusClasses(item.status).icon])
1886
+ }, null, 8, ["icon", "class"])) : vue.createCommentVNode("", true)
1887
+ ], 2),
1888
+ index2 < __props.items.length - 1 ? (vue.openBlock(), vue.createElementBlock("div", {
1889
+ key: 0,
1890
+ class: vue.normalizeClass(["flex-1 h-0.5 mx-2", getStatusClasses(item.status).line])
1891
+ }, null, 2)) : vue.createCommentVNode("", true)
1892
+ ]),
1893
+ vue.createElementVNode("div", _hoisted_10, [
1894
+ vue.createElementVNode("h3", _hoisted_11, vue.toDisplayString(item.title), 1),
1895
+ item.date ? (vue.openBlock(), vue.createElementBlock("time", _hoisted_12, vue.toDisplayString(item.date), 1)) : vue.createCommentVNode("", true)
1896
+ ])
1897
+ ], 2);
1898
+ }), 128))
1899
+ ]));
1900
+ };
1901
+ }
1902
+ });
1903
+ const _hoisted_1$2 = ["aria-label"];
1904
+ const _hoisted_2$1 = {
1905
+ key: 0,
1906
+ class: "text-sm font-medium"
1907
+ };
1908
+ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
1909
+ __name: "DarkModeToggle",
1910
+ props: {
1911
+ size: { default: "md" },
1912
+ lightIcon: { default: "lucide:sun" },
1913
+ darkIcon: { default: "lucide:moon" },
1914
+ showLabel: { type: Boolean, default: false },
1915
+ storageKey: { default: "dark-mode" }
1916
+ },
1917
+ setup(__props) {
1918
+ const props = __props;
1919
+ const { isDark, toggle } = useDarkMode.useDarkMode({ storageKey: props.storageKey });
1920
+ const sizeClasses = {
1921
+ sm: { button: "p-1.5", icon: "size-4" },
1922
+ md: { button: "p-2", icon: "size-5" },
1923
+ lg: { button: "p-2.5", icon: "size-6" }
1924
+ };
1925
+ return (_ctx, _cache) => {
1926
+ return vue.openBlock(), vue.createElementBlock("button", {
1927
+ type: "button",
1928
+ class: vue.normalizeClass([
1929
+ sizeClasses[__props.size].button,
1930
+ "inline-flex items-center gap-2 rounded-lg transition-colors",
1931
+ "text-gray-600 hover:bg-gray-100 hover:text-gray-900",
1932
+ "dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-100",
1933
+ "focus:outline-hidden focus:ring-2 focus:ring-primary focus:ring-offset-2"
1934
+ ]),
1935
+ "aria-label": vue.unref(isDark) ? "Switch to light mode" : "Switch to dark mode",
1936
+ onClick: _cache[0] || (_cache[0] = //@ts-ignore
1937
+ (...args) => vue.unref(toggle) && vue.unref(toggle)(...args))
1938
+ }, [
1939
+ vue.createVNode(vue.unref(vue$1.Icon), {
1940
+ icon: vue.unref(isDark) ? __props.darkIcon : __props.lightIcon,
1941
+ class: vue.normalizeClass(sizeClasses[__props.size].icon)
1942
+ }, null, 8, ["icon", "class"]),
1943
+ __props.showLabel ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2$1, vue.toDisplayString(vue.unref(isDark) ? "Dark" : "Light"), 1)) : vue.createCommentVNode("", true)
1944
+ ], 10, _hoisted_1$2);
1945
+ };
1946
+ }
1947
+ });
1948
+ const _hoisted_1$1 = {
1949
+ key: 0,
1950
+ class: "text-gray-400"
1951
+ };
1952
+ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
1953
+ __name: "StatsCard",
1954
+ props: {
1955
+ label: {},
1956
+ value: {},
1957
+ icon: {},
1958
+ change: {},
1959
+ changeLabel: {},
1960
+ variant: { default: "default" },
1961
+ color: { default: "primary" }
1962
+ },
1963
+ setup(__props) {
1964
+ return (_ctx, _cache) => {
1965
+ return vue.openBlock(), vue.createElementBlock("div", {
1966
+ class: vue.normalizeClass([
1967
+ "rounded-2xl p-4 text-center transition-all",
1968
+ __props.variant === "default" && "bg-white dark:bg-slate-800 border border-gray-100 dark:border-slate-700 shadow-sm",
1969
+ __props.variant === "glass" && "bg-white/15 backdrop-blur-sm border border-white/20",
1970
+ __props.variant === "outline" && "border-2 border-gray-200 dark:border-slate-600",
1971
+ __props.variant === "solid" && __props.color === "primary" && "bg-primary-500 text-white",
1972
+ __props.variant === "solid" && __props.color === "success" && "bg-emerald-500 text-white",
1973
+ __props.variant === "solid" && __props.color === "warning" && "bg-amber-500 text-white",
1974
+ __props.variant === "solid" && __props.color === "danger" && "bg-red-500 text-white",
1975
+ __props.variant === "solid" && __props.color === "info" && "bg-blue-500 text-white"
1976
+ ])
1977
+ }, [
1978
+ __props.icon ? (vue.openBlock(), vue.createElementBlock("div", {
1979
+ key: 0,
1980
+ class: vue.normalizeClass([
1981
+ "size-10 mx-auto mb-2 rounded-xl flex items-center justify-center",
1982
+ __props.variant === "glass" && "bg-white/20",
1983
+ __props.variant === "solid" && "bg-white/20",
1984
+ __props.variant === "default" && __props.color === "primary" && "bg-primary-100 dark:bg-primary-900/30",
1985
+ __props.variant === "default" && __props.color === "success" && "bg-emerald-100 dark:bg-emerald-900/30",
1986
+ __props.variant === "default" && __props.color === "warning" && "bg-amber-100 dark:bg-amber-900/30",
1987
+ __props.variant === "default" && __props.color === "danger" && "bg-red-100 dark:bg-red-900/30",
1988
+ __props.variant === "default" && __props.color === "info" && "bg-blue-100 dark:bg-blue-900/30",
1989
+ __props.variant === "outline" && "bg-gray-100 dark:bg-slate-700"
1990
+ ])
1991
+ }, [
1992
+ vue.createVNode(vue.unref(vue$1.Icon), {
1993
+ icon: __props.icon,
1994
+ class: vue.normalizeClass([
1995
+ "size-5",
1996
+ (__props.variant === "glass" || __props.variant === "solid") && "text-white",
1997
+ __props.variant === "default" && __props.color === "primary" && "text-primary-600 dark:text-primary-400",
1998
+ __props.variant === "default" && __props.color === "success" && "text-emerald-600 dark:text-emerald-400",
1999
+ __props.variant === "default" && __props.color === "warning" && "text-amber-600 dark:text-amber-400",
2000
+ __props.variant === "default" && __props.color === "danger" && "text-red-600 dark:text-red-400",
2001
+ __props.variant === "default" && __props.color === "info" && "text-blue-600 dark:text-blue-400",
2002
+ __props.variant === "outline" && "text-gray-600 dark:text-gray-400"
2003
+ ])
2004
+ }, null, 8, ["icon", "class"])
2005
+ ], 2)) : vue.createCommentVNode("", true),
2006
+ vue.createElementVNode("div", {
2007
+ class: vue.normalizeClass([
2008
+ "text-2xl sm:text-3xl font-bold",
2009
+ (__props.variant === "glass" || __props.variant === "solid") && "text-white",
2010
+ (__props.variant === "default" || __props.variant === "outline") && "text-gray-900 dark:text-white"
2011
+ ])
2012
+ }, [
2013
+ vue.renderSlot(_ctx.$slots, "value", {}, () => [
2014
+ vue.createTextVNode(vue.toDisplayString(__props.value), 1)
2015
+ ])
2016
+ ], 2),
2017
+ vue.createElementVNode("div", {
2018
+ class: vue.normalizeClass([
2019
+ "text-xs sm:text-sm",
2020
+ __props.variant === "glass" && "text-white/80",
2021
+ __props.variant === "solid" && "text-white/90",
2022
+ (__props.variant === "default" || __props.variant === "outline") && "text-gray-500 dark:text-gray-400"
2023
+ ])
2024
+ }, [
2025
+ vue.renderSlot(_ctx.$slots, "label", {}, () => [
2026
+ vue.createTextVNode(vue.toDisplayString(__props.label), 1)
2027
+ ])
2028
+ ], 2),
2029
+ __props.change !== void 0 ? (vue.openBlock(), vue.createElementBlock("div", {
2030
+ key: 1,
2031
+ class: vue.normalizeClass([
2032
+ "mt-2 text-xs font-medium inline-flex items-center gap-1",
2033
+ __props.change >= 0 ? "text-emerald-500" : "text-red-500"
2034
+ ])
2035
+ }, [
2036
+ vue.createVNode(vue.unref(vue$1.Icon), {
2037
+ icon: __props.change >= 0 ? "heroicons:arrow-trending-up" : "heroicons:arrow-trending-down",
2038
+ class: "size-3.5"
2039
+ }, null, 8, ["icon"]),
2040
+ vue.createElementVNode("span", null, vue.toDisplayString(__props.change >= 0 ? "+" : "") + vue.toDisplayString(__props.change) + "%", 1),
2041
+ __props.changeLabel ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_1$1, vue.toDisplayString(__props.changeLabel), 1)) : vue.createCommentVNode("", true)
2042
+ ], 2)) : vue.createCommentVNode("", true)
2043
+ ], 2);
2044
+ };
2045
+ }
2046
+ });
2047
+ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
2048
+ __name: "StatsGrid",
2049
+ props: {
2050
+ stats: {},
2051
+ cols: {},
2052
+ variant: { default: "default" },
2053
+ color: { default: "primary" }
2054
+ },
2055
+ setup(__props) {
2056
+ return (_ctx, _cache) => {
2057
+ return vue.openBlock(), vue.createElementBlock("div", {
2058
+ class: vue.normalizeClass(["grid gap-3 sm:gap-4", [
2059
+ __props.cols === 2 && "grid-cols-2",
2060
+ __props.cols === 3 && "grid-cols-3",
2061
+ __props.cols === 4 && "grid-cols-2 sm:grid-cols-4",
2062
+ !__props.cols && __props.stats.length === 2 && "grid-cols-2",
2063
+ !__props.cols && __props.stats.length === 3 && "grid-cols-3",
2064
+ !__props.cols && __props.stats.length === 4 && "grid-cols-2 sm:grid-cols-4",
2065
+ !__props.cols && __props.stats.length > 4 && "grid-cols-2 sm:grid-cols-3 lg:grid-cols-4"
2066
+ ]])
2067
+ }, [
2068
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.stats, (stat, index2) => {
2069
+ return vue.openBlock(), vue.createBlock(_sfc_main$2, {
2070
+ key: index2,
2071
+ label: stat.label,
2072
+ value: stat.value,
2073
+ icon: stat.icon,
2074
+ change: stat.change,
2075
+ "change-label": stat.changeLabel,
2076
+ variant: __props.variant,
2077
+ color: __props.color
2078
+ }, null, 8, ["label", "value", "icon", "change", "change-label", "variant", "color"]);
2079
+ }), 128))
2080
+ ], 2);
2081
+ };
2082
+ }
2083
+ });
2084
+ const _hoisted_1 = ["disabled", "onClick"];
2085
+ const _hoisted_2 = ["disabled", "onClick"];
2086
+ const _hoisted_3 = ["disabled", "onClick"];
2087
+ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
2088
+ __name: "FilterTabs",
2089
+ props: /* @__PURE__ */ vue.mergeModels({
2090
+ options: {},
2091
+ variant: { default: "pills" },
2092
+ size: { default: "md" },
2093
+ fullWidth: { type: Boolean }
2094
+ }, {
2095
+ "modelValue": { required: true },
2096
+ "modelModifiers": {}
2097
+ }),
2098
+ emits: ["update:modelValue"],
2099
+ setup(__props) {
2100
+ const modelValue = vue.useModel(__props, "modelValue");
2101
+ return (_ctx, _cache) => {
2102
+ return __props.variant === "pills" ? (vue.openBlock(), vue.createElementBlock("div", {
2103
+ key: 0,
2104
+ class: vue.normalizeClass([
2105
+ "inline-flex p-1 bg-white dark:bg-slate-800 rounded-2xl shadow-sm border border-gray-100 dark:border-slate-700 gap-1",
2106
+ __props.fullWidth && "w-full"
2107
+ ])
2108
+ }, [
2109
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.options, (option) => {
2110
+ return vue.openBlock(), vue.createElementBlock("button", {
2111
+ key: option.key,
2112
+ type: "button",
2113
+ disabled: option.disabled,
2114
+ class: vue.normalizeClass([
2115
+ "flex items-center justify-center gap-2 rounded-xl font-medium transition-all",
2116
+ __props.fullWidth && "flex-1",
2117
+ __props.size === "sm" && "px-3 py-1.5 text-xs",
2118
+ __props.size === "md" && "px-4 py-2.5 text-sm",
2119
+ __props.size === "lg" && "px-5 py-3 text-base",
2120
+ modelValue.value === option.key ? "bg-primary-500 text-white shadow-md" : "text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-slate-700",
2121
+ option.disabled && "opacity-50 cursor-not-allowed"
2122
+ ]),
2123
+ onClick: ($event) => !option.disabled && (modelValue.value = option.key)
2124
+ }, [
2125
+ option.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
2126
+ key: 0,
2127
+ icon: option.icon,
2128
+ class: "size-4"
2129
+ }, null, 8, ["icon"])) : vue.createCommentVNode("", true),
2130
+ vue.createElementVNode("span", null, vue.toDisplayString(option.label), 1),
2131
+ option.count !== void 0 ? (vue.openBlock(), vue.createElementBlock("span", {
2132
+ key: 1,
2133
+ class: vue.normalizeClass([
2134
+ "px-1.5 py-0.5 rounded-full text-xs font-medium",
2135
+ modelValue.value === option.key ? "bg-white/20 text-white" : "bg-gray-100 dark:bg-slate-700 text-gray-600 dark:text-gray-400"
2136
+ ])
2137
+ }, vue.toDisplayString(option.count), 3)) : vue.createCommentVNode("", true)
2138
+ ], 10, _hoisted_1);
2139
+ }), 128))
2140
+ ], 2)) : __props.variant === "underline" ? (vue.openBlock(), vue.createElementBlock("div", {
2141
+ key: 1,
2142
+ class: vue.normalizeClass([
2143
+ "flex border-b border-gray-200 dark:border-slate-700",
2144
+ __props.fullWidth && "w-full"
2145
+ ])
2146
+ }, [
2147
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.options, (option) => {
2148
+ return vue.openBlock(), vue.createElementBlock("button", {
2149
+ key: option.key,
2150
+ type: "button",
2151
+ disabled: option.disabled,
2152
+ class: vue.normalizeClass([
2153
+ "flex items-center justify-center gap-2 font-medium transition-all border-b-2 -mb-px",
2154
+ __props.fullWidth && "flex-1",
2155
+ __props.size === "sm" && "px-3 py-2 text-xs",
2156
+ __props.size === "md" && "px-4 py-3 text-sm",
2157
+ __props.size === "lg" && "px-5 py-4 text-base",
2158
+ modelValue.value === option.key ? "border-primary-500 text-primary-600 dark:text-primary-400" : "border-transparent text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300",
2159
+ option.disabled && "opacity-50 cursor-not-allowed"
2160
+ ]),
2161
+ onClick: ($event) => !option.disabled && (modelValue.value = option.key)
2162
+ }, [
2163
+ option.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
2164
+ key: 0,
2165
+ icon: option.icon,
2166
+ class: "size-4"
2167
+ }, null, 8, ["icon"])) : vue.createCommentVNode("", true),
2168
+ vue.createElementVNode("span", null, vue.toDisplayString(option.label), 1),
2169
+ option.count !== void 0 ? (vue.openBlock(), vue.createElementBlock("span", {
2170
+ key: 1,
2171
+ class: vue.normalizeClass([
2172
+ "px-1.5 py-0.5 rounded-full text-xs font-medium",
2173
+ modelValue.value === option.key ? "bg-primary-100 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400" : "bg-gray-100 dark:bg-slate-700 text-gray-500"
2174
+ ])
2175
+ }, vue.toDisplayString(option.count), 3)) : vue.createCommentVNode("", true)
2176
+ ], 10, _hoisted_2);
2177
+ }), 128))
2178
+ ], 2)) : __props.variant === "boxed" ? (vue.openBlock(), vue.createElementBlock("div", {
2179
+ key: 2,
2180
+ class: vue.normalizeClass([
2181
+ "inline-flex bg-gray-100 dark:bg-slate-800 rounded-xl p-1 gap-1",
2182
+ __props.fullWidth && "w-full"
2183
+ ])
2184
+ }, [
2185
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.options, (option) => {
2186
+ return vue.openBlock(), vue.createElementBlock("button", {
2187
+ key: option.key,
2188
+ type: "button",
2189
+ disabled: option.disabled,
2190
+ class: vue.normalizeClass([
2191
+ "flex items-center justify-center gap-2 rounded-lg font-medium transition-all",
2192
+ __props.fullWidth && "flex-1",
2193
+ __props.size === "sm" && "px-3 py-1.5 text-xs",
2194
+ __props.size === "md" && "px-4 py-2 text-sm",
2195
+ __props.size === "lg" && "px-5 py-2.5 text-base",
2196
+ modelValue.value === option.key ? "bg-white dark:bg-slate-700 text-gray-900 dark:text-white shadow-sm" : "text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white",
2197
+ option.disabled && "opacity-50 cursor-not-allowed"
2198
+ ]),
2199
+ onClick: ($event) => !option.disabled && (modelValue.value = option.key)
2200
+ }, [
2201
+ option.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
2202
+ key: 0,
2203
+ icon: option.icon,
2204
+ class: "size-4"
2205
+ }, null, 8, ["icon"])) : vue.createCommentVNode("", true),
2206
+ vue.createElementVNode("span", null, vue.toDisplayString(option.label), 1),
2207
+ option.count !== void 0 ? (vue.openBlock(), vue.createElementBlock("span", {
2208
+ key: 1,
2209
+ class: vue.normalizeClass([
2210
+ "px-1.5 py-0.5 rounded-full text-xs font-medium",
2211
+ modelValue.value === option.key ? "bg-gray-100 dark:bg-slate-600 text-gray-600 dark:text-gray-300" : "bg-gray-200 dark:bg-slate-700 text-gray-500 dark:text-gray-400"
2212
+ ])
2213
+ }, vue.toDisplayString(option.count), 3)) : vue.createCommentVNode("", true)
2214
+ ], 10, _hoisted_3);
2215
+ }), 128))
2216
+ ], 2)) : vue.createCommentVNode("", true);
2217
+ };
2218
+ }
2219
+ });
2220
+ exports._sfc_main = _sfc_main$l;
2221
+ exports._sfc_main$1 = _sfc_main$k;
2222
+ exports._sfc_main$10 = _sfc_main$b;
2223
+ exports._sfc_main$11 = _sfc_main$a;
2224
+ exports._sfc_main$12 = _sfc_main$9;
2225
+ exports._sfc_main$13 = _sfc_main$8;
2226
+ exports._sfc_main$14 = _sfc_main$7;
2227
+ exports._sfc_main$15 = _sfc_main$6;
2228
+ exports._sfc_main$16 = _sfc_main$5;
2229
+ exports._sfc_main$17 = _sfc_main$4;
2230
+ exports._sfc_main$18 = _sfc_main$3;
2231
+ exports._sfc_main$19 = _sfc_main$2;
2232
+ exports._sfc_main$2 = _sfc_main$j;
2233
+ exports._sfc_main$20 = _sfc_main$1;
2234
+ exports._sfc_main$21 = _sfc_main;
2235
+ exports._sfc_main$3 = _sfc_main$i;
2236
+ exports._sfc_main$4 = _sfc_main$h;
2237
+ exports._sfc_main$5 = _sfc_main$g;
2238
+ exports._sfc_main$6 = _sfc_main$f;
2239
+ exports._sfc_main$7 = _sfc_main$e;
2240
+ exports._sfc_main$8 = _sfc_main$d;
2241
+ exports._sfc_main$9 = _sfc_main$c;
2242
+ //# sourceMappingURL=FilterTabs.vue_vue_type_script_setup_true_lang-HwjuvIJX.cjs.map