@stachelock/ui 0.5.5 → 0.6.2

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 (481) hide show
  1. package/README.md +118 -5
  2. package/dist/AddDeleteButtonGroup.vue_vue_type_script_setup_true_lang-6taLcPq0.js +77 -0
  3. package/dist/{AlertModal.vue_vue_type_script_setup_true_lang-C6q8Mpl4.js → AlertModal.vue_vue_type_script_setup_true_lang-DzhVQdx4.js} +45 -65
  4. package/dist/BackgroundGradientWrapper.vue_vue_type_script_setup_true_lang-C8msTrTn.js +0 -1
  5. package/dist/BarChart.vue_vue_type_script_setup_true_lang-xCb0DCbf.js +0 -1
  6. package/dist/{BaseModal.vue_vue_type_script_setup_true_lang-B67Pt3tW.js → BaseModal.vue_vue_type_script_setup_true_lang--iGzFCnC.js} +42 -44
  7. package/dist/{CalendarHeader.vue_vue_type_script_setup_true_lang-CkSUiLOH.js → CalendarHeader.vue_vue_type_script_setup_true_lang-hGa2MLyo.js} +114 -141
  8. package/dist/CardWrapper.vue_vue_type_script_setup_true_lang-D59QBAi9.js +0 -1
  9. package/dist/CheckboxInput.vue_vue_type_script_setup_true_lang-BikR9rgi.js +0 -1
  10. package/dist/ComboboxInput.vue_vue_type_script_setup_true_lang-BigvbBAU.js +331 -0
  11. package/dist/ComingSoon.vue_vue_type_script_setup_true_lang-CJ8FXE42.js +0 -1
  12. package/dist/{DashboardLayout.vue_vue_type_script_setup_true_lang-B0M6-9os.js → DashboardLayout.vue_vue_type_script_setup_true_lang-BAx4gKqh.js} +44 -47
  13. package/dist/{DatepickerInput.vue_vue_type_style_index_0_lang-BdkGLw0H.js → DatepickerInput.vue_vue_type_style_index_0_lang-DbI3619T.js} +23 -24
  14. package/dist/{DayCalendar.vue_vue_type_script_setup_true_lang-8al4Fotu.js → DayCalendar.vue_vue_type_script_setup_true_lang-D-4jcUvI.js} +1 -2
  15. package/dist/DefaultLayout.vue_vue_type_script_setup_true_lang-BZAz6aC-.js +0 -1
  16. package/dist/DisclosureWrapper.vue_vue_type_script_setup_true_lang-CgHPOC-w.js +35 -0
  17. package/dist/{DynamicForm.vue_vue_type_script_setup_true_lang-CxSaO5Cl.js → DynamicForm.vue_vue_type_script_setup_true_lang-BR8Pq7Kw.js} +52 -53
  18. package/dist/{DynamicFormField.vue_vue_type_script_setup_true_lang-CSLSRFM7.js → DynamicFormField.vue_vue_type_script_setup_true_lang-BCVmqg_n.js} +7 -8
  19. package/dist/EmailInput.vue_vue_type_script_setup_true_lang-BicPMIop.js +0 -1
  20. package/dist/EmptyInput.vue_vue_type_script_setup_true_lang-FWDCFF2c.js +0 -1
  21. package/dist/EmptyState.vue_vue_type_script_setup_true_lang-7mcKkOWP.js +0 -1
  22. package/dist/EventCard.vue_vue_type_script_setup_true_lang-B3TP-mWX.js +74 -0
  23. package/dist/EventsList.vue_vue_type_script_setup_true_lang-BTIoGr_e.js +87 -0
  24. package/dist/FileDropzoneInput.vue_vue_type_script_setup_true_lang-BJR-_ngq.js +176 -0
  25. package/dist/{FormErrorWrapper.vue_vue_type_script_setup_true_lang-BQOlG_ab.js → FormErrorWrapper.vue_vue_type_script_setup_true_lang-D7ZAgfPs.js} +12 -13
  26. package/dist/FunnelChart.vue_vue_type_script_setup_true_lang-B4pH6xCV.js +0 -1
  27. package/dist/HeaderLayout.vue_vue_type_script_setup_true_lang-BY2G6hCc.js +0 -1
  28. package/dist/HiddenInput.vue_vue_type_script_setup_true_lang-PtGZ4eLW.js +0 -1
  29. package/dist/{InlineTabs.vue_vue_type_script_setup_true_lang-CD0lnkUm.js → InlineTabs.vue_vue_type_script_setup_true_lang-B5w4yzcZ.js} +1 -2
  30. package/dist/LineChart.vue_vue_type_script_setup_true_lang-DJo0edLJ.js +0 -1
  31. package/dist/{LottieAnimation.vue_vue_type_script_setup_true_lang-swmHdR0_.js → LottieAnimation.vue_vue_type_script_setup_true_lang-C0R4ADBb.js} +1 -2
  32. package/dist/{MonthCalendar.vue_vue_type_style_index_0_lang-Cyzq7A9j.js → MonthCalendar.vue_vue_type_style_index_0_lang-lnKkvJ9u.js} +1 -2
  33. package/dist/NavigationGroup.vue_vue_type_script_setup_true_lang-BWq5fpEm.js +0 -1
  34. package/dist/NavigationItem.vue_vue_type_script_setup_true_lang-C8aX-84Q.js +0 -1
  35. package/dist/{NotificationContainer.vue_vue_type_style_index_0_lang-DSfNw4Ge.js → NotificationContainer.vue_vue_type_style_index_0_lang-CvJRwezr.js} +1 -2
  36. package/dist/{NotificationToast.vue_vue_type_script_setup_true_lang-CU__ORw8.js → NotificationToast.vue_vue_type_script_setup_true_lang-BBWpW4km.js} +61 -64
  37. package/dist/PieChart.vue_vue_type_script_setup_true_lang-e3wsA9O4.js +0 -1
  38. package/dist/ProfileHeaderAvatar.vue_vue_type_script_setup_true_lang-CKCoHD1o.js +0 -1
  39. package/dist/ProjectLogo.vue_vue_type_script_setup_true_lang-DYjp-RNh.js +0 -1
  40. package/dist/{SelectInput.vue_vue_type_script_setup_true_lang-DHiZ-7K2.js → SelectInput.vue_vue_type_script_setup_true_lang-D4GNv0MY.js} +56 -58
  41. package/dist/{SelectTextInput.vue_vue_type_script_setup_true_lang-DYrXW14A.js → SelectTextInput.vue_vue_type_script_setup_true_lang-BVaViHPl.js} +66 -69
  42. package/dist/{SidebarLayout.vue_vue_type_script_setup_true_lang-BJ5jadgZ.js → SidebarLayout.vue_vue_type_script_setup_true_lang-CZ21EVcZ.js} +36 -39
  43. package/dist/SparklineChart.vue_vue_type_script_setup_true_lang-BlNk5ZqM.js +0 -1
  44. package/dist/StatCard.vue_vue_type_script_setup_true_lang-B5SuaSXL.js +66 -0
  45. package/dist/{StepperPanels.vue_vue_type_script_setup_true_lang-D6Fv7iz3.js → StepperPanels.vue_vue_type_script_setup_true_lang-DPLQ9mQn.js} +34 -49
  46. package/dist/SwitchInput.vue_vue_type_script_setup_true_lang-D5Es9AjF.js +200 -0
  47. package/dist/{SwitchInputGroup.vue_vue_type_script_setup_true_lang-CK9JWl4F.js → SwitchInputGroup.vue_vue_type_script_setup_true_lang-DigNYqVZ.js} +1 -2
  48. package/dist/{TabGroup.vue_vue_type_script_setup_true_lang-DVVeOgWH.js → TabGroup.vue_vue_type_script_setup_true_lang-BsbiEA4E.js} +19 -20
  49. package/dist/{TabGroupUnderline.vue_vue_type_script_setup_true_lang-_3XtOn3w.js → TabGroupUnderline.vue_vue_type_script_setup_true_lang-CPcp1-Za.js} +21 -22
  50. package/dist/{TabsInPills.vue_vue_type_script_setup_true_lang-DY1NkXCQ.js → TabsInPills.vue_vue_type_script_setup_true_lang-U5CdRL7s.js} +1 -2
  51. package/dist/{TagifyInput.vue_vue_type_script_setup_true_lang-Da6-pRJ2.js → TagifyInput.vue_vue_type_script_setup_true_lang-BF2mK8JC.js} +14 -15
  52. package/dist/TextAreaInput.vue_vue_type_script_setup_true_lang-Cf0MJobG.js +0 -1
  53. package/dist/UiAvatar.vue_vue_type_script_setup_true_lang-WVY6JbUL.js +0 -1
  54. package/dist/UiBadge.vue_vue_type_script_setup_true_lang-DOtbLb9x.js +0 -1
  55. package/dist/UiButtonGroup.vue_vue_type_script_setup_true_lang-CVwXB-cb.js +0 -1
  56. package/dist/UiCheckbox.vue_vue_type_script_setup_true_lang-BxyM_F-V.js +0 -1
  57. package/dist/UiLoading.vue_vue_type_script_setup_true_lang-rNvtzKbq.js +0 -1
  58. package/dist/{UiMapAll.vue_vue_type_script_setup_true_lang-CMAyvJMk.js → UiMapAll.vue_vue_type_script_setup_true_lang-11yT7mTH.js} +93 -111
  59. package/dist/UiMenu.vue_vue_type_script_setup_true_lang-gnoIJm6x.js +127 -0
  60. package/dist/{UiModal.vue_vue_type_script_setup_true_lang-CpwFUDVU.js → UiModal.vue_vue_type_script_setup_true_lang-BZC7aN7K.js} +41 -43
  61. package/dist/{UiNavLink.vue_vue_type_script_setup_true_lang-DnWMn40M.js → UiNavLink.vue_vue_type_script_setup_true_lang-C5Gicm8o.js} +4 -5
  62. package/dist/UiProgressBar.vue_vue_type_script_setup_true_lang-BCh4orZW.js +0 -1
  63. package/dist/UiTable.vue_vue_type_script_setup_true_lang-xGAiJ9rS.js +0 -1
  64. package/dist/UiTransition.vue_vue_type_script_setup_true_lang-C4jb9I-3.js +0 -1
  65. package/dist/YearCalendar.vue_vue_type_script_setup_true_lang-CfKSpLLN.js +0 -1
  66. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +0 -1
  67. package/dist/calendar-DLry-Vik.js +147 -0
  68. package/dist/calendars/CalendarDashboard.js +3 -4
  69. package/dist/calendars/CalendarHeader.js +1 -2
  70. package/dist/calendars/DayCalendar.js +1 -2
  71. package/dist/calendars/EventCard.js +1 -2
  72. package/dist/calendars/EventsList.js +1 -2
  73. package/dist/calendars/MonthCalendar.js +1 -2
  74. package/dist/calendars/WeekCalendar.js +1 -2
  75. package/dist/calendars/YearCalendar.js +0 -1
  76. package/dist/charts/BarChart.js +0 -1
  77. package/dist/charts/BaseChart.js +42 -59
  78. package/dist/charts/FunnelChart.js +0 -1
  79. package/dist/charts/LineChart.js +0 -1
  80. package/dist/charts/PieChart.js +0 -1
  81. package/dist/charts/SparklineChart.js +0 -1
  82. package/dist/charts/StatCard.js +1 -2
  83. package/dist/charts/chartTheme.js +0 -1
  84. package/dist/charts/index.js +1 -2
  85. package/dist/components/Avatar.js +0 -1
  86. package/dist/components/Badge.js +0 -1
  87. package/dist/components/Banner.js +178 -351
  88. package/dist/components/Breadcrumb.js +41 -42
  89. package/dist/components/Button.js +0 -1
  90. package/dist/components/ButtonGroup.js +0 -1
  91. package/dist/components/Checkbox.js +0 -1
  92. package/dist/components/CloudinaryImage.js +51 -81
  93. package/dist/components/Loading.js +0 -1
  94. package/dist/components/LoadingDots.js +0 -1
  95. package/dist/components/LottieAnimation.js +1 -2
  96. package/dist/components/Menu.js +1 -2
  97. package/dist/components/Modal.js +1 -2
  98. package/dist/components/NavLink.js +1 -2
  99. package/dist/components/ProgressBar.js +0 -1
  100. package/dist/components/RadialProgressBar.js +0 -1
  101. package/dist/components/Table.js +0 -1
  102. package/dist/components/Transition.js +0 -1
  103. package/dist/composables/index.js +33 -31
  104. package/dist/composables/useCalendar.js +1 -2
  105. package/dist/composables/useFormValidation.js +0 -1
  106. package/dist/composables/useMap.js +3 -3
  107. package/dist/composables/useModal.js +0 -1
  108. package/dist/composables/useNotifications.js +0 -1
  109. package/dist/composables/useTabs.js +87 -193
  110. package/dist/composables/useTheme.js +0 -1
  111. package/dist/empty-state/ComingSoon.js +0 -1
  112. package/dist/empty-state/EmptyState.js +0 -1
  113. package/dist/empty-state/index.js +0 -1
  114. package/dist/forms/DynamicForm.js +1 -2
  115. package/dist/forms/DynamicFormField.js +1 -2
  116. package/dist/forms/FormFieldWrapper.js +7 -8
  117. package/dist/id-DafBB_QF.js +0 -1
  118. package/dist/index.js +2652 -790
  119. package/dist/inputs/AddDeleteButtonGroup.js +1 -2
  120. package/dist/inputs/CheckboxInput.js +0 -1
  121. package/dist/inputs/ComboboxInput.js +1 -2
  122. package/dist/inputs/DatepickerInput.js +1 -2
  123. package/dist/inputs/EmailInput.js +0 -1
  124. package/dist/inputs/EmptyInput.js +0 -1
  125. package/dist/inputs/FileDropzoneInput.js +1 -2
  126. package/dist/inputs/HiddenInput.js +0 -1
  127. package/dist/inputs/PhoneInput.js +371 -3539
  128. package/dist/inputs/RichTextInput.js +235 -17298
  129. package/dist/inputs/SelectInput.js +1 -2
  130. package/dist/inputs/SelectTextInput.js +1 -2
  131. package/dist/inputs/SwitchInput.js +1 -2
  132. package/dist/inputs/SwitchInputGroup.js +1 -2
  133. package/dist/inputs/TagifyInput.js +1 -2
  134. package/dist/inputs/TextAreaInput.js +0 -1
  135. package/dist/inputs/TextInput.js +7 -8
  136. package/dist/layouts/DashboardLayout.js +1 -2
  137. package/dist/layouts/DefaultLayout.js +0 -1
  138. package/dist/layouts/HeaderLayout.js +0 -1
  139. package/dist/layouts/NavigationGroup.js +0 -1
  140. package/dist/layouts/NavigationItem.js +0 -1
  141. package/dist/layouts/ProfileHeaderAvatar.js +0 -1
  142. package/dist/layouts/ProjectLogo.js +0 -1
  143. package/dist/layouts/SidebarLayout.js +1 -2
  144. package/dist/loading/ContentSkeleton.js +0 -1
  145. package/dist/loading/SmartLoadingIndicator.js +0 -1
  146. package/dist/loading/index.js +0 -1
  147. package/dist/mapThemes-DFE9fZm3.js +0 -1
  148. package/dist/maps/GoogleMap.js +13 -14
  149. package/dist/maps/UiInfoWindow.js +41 -43
  150. package/dist/maps/UiMap.js +28 -31
  151. package/dist/maps/UiMapAll.js +1 -2
  152. package/dist/maps/UiMapMarker.js +1 -2
  153. package/dist/maps/index.js +1 -2
  154. package/dist/modals/AlertModal.js +1 -2
  155. package/dist/modals/BaseModal.js +1 -2
  156. package/dist/modals/ImageCropperModal.js +130 -1666
  157. package/dist/notifications/NotificationContainer.js +1 -2
  158. package/dist/notifications/NotificationToast.js +1 -2
  159. package/dist/notifications/index.js +2 -3
  160. package/dist/src/components/UiBanner.d.ts +1 -1
  161. package/dist/src/components/UiLoadingDots.d.ts +1 -1
  162. package/dist/src/components/UiMenu.d.ts +1 -1
  163. package/dist/src/components/UiModal.d.ts +1 -1
  164. package/dist/src/components/collection-editor/CollectionItemList.d.ts +42 -0
  165. package/dist/src/components/collection-editor/OrganizationsEditor.d.ts +29 -0
  166. package/dist/src/components/collection-editor/RelatedNamesEditor.d.ts +26 -0
  167. package/dist/src/components/collection-editor/SocialLinksEditor.d.ts +26 -0
  168. package/dist/src/components/collection-editor/index.d.ts +5 -0
  169. package/dist/src/components/forms/FormFieldWrapper.d.ts +1 -1
  170. package/dist/src/components/index.d.ts +2 -0
  171. package/dist/src/components/inputs/AddressInput.d.ts +40 -0
  172. package/dist/src/components/inputs/ComboboxInput.d.ts +2 -2
  173. package/dist/src/components/inputs/DatepickerInput.d.ts +19 -19
  174. package/dist/src/components/inputs/EmailInput.d.ts +2 -2
  175. package/dist/src/components/inputs/PhoneInput.d.ts +2 -2
  176. package/dist/src/components/inputs/RichTextInput.d.ts +2 -2
  177. package/dist/src/components/inputs/SelectInput.d.ts +2 -2
  178. package/dist/src/components/inputs/SelectTextInput.d.ts +4 -4
  179. package/dist/src/components/inputs/TagifyInput.d.ts +2 -2
  180. package/dist/src/components/inputs/TextInput.d.ts +3 -3
  181. package/dist/src/components/inputs/index.d.ts +1 -0
  182. package/dist/src/components/layouts/CardLayout.d.ts +1 -1
  183. package/dist/src/components/maps/UiInfoWindow.d.ts +2 -2
  184. package/dist/src/components/maps/UiMap.d.ts +2 -2
  185. package/dist/src/components/maps/UiMapAll.d.ts +10 -10
  186. package/dist/src/components/maps/UiMapMarker.d.ts +2 -2
  187. package/dist/src/components/modals/BaseModal.d.ts +1 -1
  188. package/dist/src/components/profiles/BentoProfileLayout.d.ts +9 -0
  189. package/dist/src/components/profiles/ProfileCard.d.ts +30 -0
  190. package/dist/src/components/profiles/ProfileContactCard.d.ts +12 -0
  191. package/dist/src/components/profiles/ProfileHeaderCard.d.ts +20 -0
  192. package/dist/src/components/profiles/ProfileLocationCard.d.ts +17 -0
  193. package/dist/src/components/profiles/ProfileOrganizationsCard.d.ts +11 -0
  194. package/dist/src/components/profiles/ProfilePersonalCard.d.ts +10 -0
  195. package/dist/src/components/profiles/ProfileProfessionalCard.d.ts +11 -0
  196. package/dist/src/components/profiles/ProfileRelatedNamesCard.d.ts +11 -0
  197. package/dist/src/components/profiles/index.d.ts +9 -0
  198. package/dist/src/composables/index.d.ts +1 -0
  199. package/dist/src/composables/useCollectionEditor.d.ts +64 -0
  200. package/dist/src/composables/useNotifications.d.ts +4 -4
  201. package/dist/src/plugin/configure.d.ts +3 -1
  202. package/dist/src/services/geocoding.service.d.ts +68 -0
  203. package/dist/src/services/index.d.ts +1 -0
  204. package/dist/src/types/address.d.ts +164 -0
  205. package/dist/src/types/collection-editor.d.ts +134 -0
  206. package/dist/src/types/index.d.ts +3 -0
  207. package/dist/src/types/profiles.d.ts +149 -0
  208. package/dist/src/views/inputs/index.d.ts +1 -0
  209. package/dist/stepper/StepperPanels.js +1 -2
  210. package/dist/stepper/index.js +1 -2
  211. package/dist/style.css +1 -1
  212. package/dist/tabs/InlineTabs.js +1 -2
  213. package/dist/tabs/TabGroup.js +1 -2
  214. package/dist/tabs/TabGroupUnderline.js +1 -2
  215. package/dist/tabs/TabsInPills.js +1 -2
  216. package/dist/tabs/index.js +4 -5
  217. package/dist/ui.css +1 -1
  218. package/dist/useCollectionEditor-BYyoAT0U.js +121 -0
  219. package/dist/useEventSegments-B-r_8zCW.js +0 -1
  220. package/dist/useMap-BGg0H582.js +297 -0
  221. package/dist/useSimpleTabs-CSgkChEU.js +0 -1
  222. package/dist/useStringTransform-CSr7nZWg.js +0 -1
  223. package/dist/wrappers/BackgroundGradientWrapper.js +0 -1
  224. package/dist/wrappers/CardWrapper.js +0 -1
  225. package/dist/wrappers/DisclosureWrapper.js +1 -2
  226. package/dist/wrappers/FormErrorWrapper.js +1 -2
  227. package/dist/wrappers/index.js +2 -3
  228. package/package.json +9 -1
  229. package/dist/AddDeleteButtonGroup.vue_vue_type_script_setup_true_lang-CFS3lVF-.js +0 -128
  230. package/dist/AddDeleteButtonGroup.vue_vue_type_script_setup_true_lang-CFS3lVF-.js.map +0 -1
  231. package/dist/AlertModal.vue_vue_type_script_setup_true_lang-C6q8Mpl4.js.map +0 -1
  232. package/dist/BackgroundGradientWrapper.vue_vue_type_script_setup_true_lang-C8msTrTn.js.map +0 -1
  233. package/dist/BarChart.vue_vue_type_script_setup_true_lang-xCb0DCbf.js.map +0 -1
  234. package/dist/Bars3Icon-BdOqcGcY.js +0 -22
  235. package/dist/Bars3Icon-BdOqcGcY.js.map +0 -1
  236. package/dist/BaseModal.vue_vue_type_script_setup_true_lang-B67Pt3tW.js.map +0 -1
  237. package/dist/CalendarHeader.vue_vue_type_script_setup_true_lang-CkSUiLOH.js.map +0 -1
  238. package/dist/CardWrapper.vue_vue_type_script_setup_true_lang-D59QBAi9.js.map +0 -1
  239. package/dist/CheckIcon-BGlsmVwT.js +0 -20
  240. package/dist/CheckIcon-BGlsmVwT.js.map +0 -1
  241. package/dist/CheckboxInput.vue_vue_type_script_setup_true_lang-BikR9rgi.js.map +0 -1
  242. package/dist/ChevronRightIcon-DkUqw988.js +0 -20
  243. package/dist/ChevronRightIcon-DkUqw988.js.map +0 -1
  244. package/dist/ChevronUpDownIcon-Bq_fsgrb.js +0 -20
  245. package/dist/ChevronUpDownIcon-Bq_fsgrb.js.map +0 -1
  246. package/dist/ComboboxInput.vue_vue_type_script_setup_true_lang-kEj-NYqm.js +0 -1362
  247. package/dist/ComboboxInput.vue_vue_type_script_setup_true_lang-kEj-NYqm.js.map +0 -1
  248. package/dist/ComingSoon.vue_vue_type_script_setup_true_lang-CJ8FXE42.js.map +0 -1
  249. package/dist/DashboardLayout.vue_vue_type_script_setup_true_lang-B0M6-9os.js.map +0 -1
  250. package/dist/DatepickerInput.vue_vue_type_style_index_0_lang-BdkGLw0H.js.map +0 -1
  251. package/dist/DayCalendar.vue_vue_type_script_setup_true_lang-8al4Fotu.js.map +0 -1
  252. package/dist/DefaultLayout.vue_vue_type_script_setup_true_lang-BZAz6aC-.js.map +0 -1
  253. package/dist/DisclosureWrapper.vue_vue_type_script_setup_true_lang-C7y2bNhW.js +0 -138
  254. package/dist/DisclosureWrapper.vue_vue_type_script_setup_true_lang-C7y2bNhW.js.map +0 -1
  255. package/dist/DynamicForm.vue_vue_type_script_setup_true_lang-CxSaO5Cl.js.map +0 -1
  256. package/dist/DynamicFormField.vue_vue_type_script_setup_true_lang-CSLSRFM7.js.map +0 -1
  257. package/dist/EmailInput.vue_vue_type_script_setup_true_lang-BicPMIop.js.map +0 -1
  258. package/dist/EmptyInput.vue_vue_type_script_setup_true_lang-FWDCFF2c.js.map +0 -1
  259. package/dist/EmptyState.vue_vue_type_script_setup_true_lang-7mcKkOWP.js.map +0 -1
  260. package/dist/EventCard.vue_vue_type_script_setup_true_lang-j1mtKShZ.js +0 -136
  261. package/dist/EventCard.vue_vue_type_script_setup_true_lang-j1mtKShZ.js.map +0 -1
  262. package/dist/EventsList.vue_vue_type_script_setup_true_lang-MhuVi5u8.js +0 -102
  263. package/dist/EventsList.vue_vue_type_script_setup_true_lang-MhuVi5u8.js.map +0 -1
  264. package/dist/ExclamationCircleIcon-DjxYk45_.js +0 -22
  265. package/dist/ExclamationCircleIcon-DjxYk45_.js.map +0 -1
  266. package/dist/ExclamationCircleIcon-DmL8Wwjo.js +0 -36
  267. package/dist/ExclamationCircleIcon-DmL8Wwjo.js.map +0 -1
  268. package/dist/ExclamationTriangleIcon-BNKYmV_J.js +0 -22
  269. package/dist/ExclamationTriangleIcon-BNKYmV_J.js.map +0 -1
  270. package/dist/FileDropzoneInput.vue_vue_type_script_setup_true_lang-CclXceTb.js +0 -211
  271. package/dist/FileDropzoneInput.vue_vue_type_script_setup_true_lang-CclXceTb.js.map +0 -1
  272. package/dist/FormErrorWrapper.vue_vue_type_script_setup_true_lang-BQOlG_ab.js.map +0 -1
  273. package/dist/FunnelChart.vue_vue_type_script_setup_true_lang-B4pH6xCV.js.map +0 -1
  274. package/dist/HeaderLayout.vue_vue_type_script_setup_true_lang-BY2G6hCc.js.map +0 -1
  275. package/dist/HiddenInput.vue_vue_type_script_setup_true_lang-PtGZ4eLW.js.map +0 -1
  276. package/dist/InformationCircleIcon-B322GNIt.js +0 -40
  277. package/dist/InformationCircleIcon-B322GNIt.js.map +0 -1
  278. package/dist/InlineTabs.vue_vue_type_script_setup_true_lang-CD0lnkUm.js.map +0 -1
  279. package/dist/LineChart.vue_vue_type_script_setup_true_lang-DJo0edLJ.js.map +0 -1
  280. package/dist/LottieAnimation.vue_vue_type_script_setup_true_lang-swmHdR0_.js.map +0 -1
  281. package/dist/MapPinIcon-CSTDUZnD.js +0 -27
  282. package/dist/MapPinIcon-CSTDUZnD.js.map +0 -1
  283. package/dist/MonthCalendar.vue_vue_type_style_index_0_lang-Cyzq7A9j.js.map +0 -1
  284. package/dist/NavigationGroup.vue_vue_type_script_setup_true_lang-BWq5fpEm.js.map +0 -1
  285. package/dist/NavigationItem.vue_vue_type_script_setup_true_lang-C8aX-84Q.js.map +0 -1
  286. package/dist/NotificationContainer.vue_vue_type_style_index_0_lang-DSfNw4Ge.js.map +0 -1
  287. package/dist/NotificationToast.vue_vue_type_script_setup_true_lang-CU__ORw8.js.map +0 -1
  288. package/dist/PieChart.vue_vue_type_script_setup_true_lang-e3wsA9O4.js.map +0 -1
  289. package/dist/PlusIcon-aDFVlB90.js +0 -40
  290. package/dist/PlusIcon-aDFVlB90.js.map +0 -1
  291. package/dist/ProfileHeaderAvatar.vue_vue_type_script_setup_true_lang-CKCoHD1o.js.map +0 -1
  292. package/dist/ProjectLogo.vue_vue_type_script_setup_true_lang-DYjp-RNh.js.map +0 -1
  293. package/dist/SelectInput.vue_vue_type_script_setup_true_lang-DHiZ-7K2.js.map +0 -1
  294. package/dist/SelectTextInput.vue_vue_type_script_setup_true_lang-DYrXW14A.js.map +0 -1
  295. package/dist/SidebarLayout.vue_vue_type_script_setup_true_lang-BJ5jadgZ.js.map +0 -1
  296. package/dist/SparklineChart.vue_vue_type_script_setup_true_lang-BlNk5ZqM.js.map +0 -1
  297. package/dist/StatCard.vue_vue_type_script_setup_true_lang-BfFupfmC.js +0 -111
  298. package/dist/StatCard.vue_vue_type_script_setup_true_lang-BfFupfmC.js.map +0 -1
  299. package/dist/StepperPanels.vue_vue_type_script_setup_true_lang-D6Fv7iz3.js.map +0 -1
  300. package/dist/SwitchInput.vue_vue_type_script_setup_true_lang-C88FcxuK.js +0 -280
  301. package/dist/SwitchInput.vue_vue_type_script_setup_true_lang-C88FcxuK.js.map +0 -1
  302. package/dist/SwitchInputGroup.vue_vue_type_script_setup_true_lang-CK9JWl4F.js.map +0 -1
  303. package/dist/TabGroup.vue_vue_type_script_setup_true_lang-DVVeOgWH.js.map +0 -1
  304. package/dist/TabGroupUnderline.vue_vue_type_script_setup_true_lang-_3XtOn3w.js.map +0 -1
  305. package/dist/TabsInPills.vue_vue_type_script_setup_true_lang-DY1NkXCQ.js.map +0 -1
  306. package/dist/TagifyInput.vue_vue_type_script_setup_true_lang-Da6-pRJ2.js.map +0 -1
  307. package/dist/TextAreaInput.vue_vue_type_script_setup_true_lang-Cf0MJobG.js.map +0 -1
  308. package/dist/UiAvatar.vue_vue_type_script_setup_true_lang-WVY6JbUL.js.map +0 -1
  309. package/dist/UiBadge.vue_vue_type_script_setup_true_lang-DOtbLb9x.js.map +0 -1
  310. package/dist/UiButtonGroup.vue_vue_type_script_setup_true_lang-CVwXB-cb.js.map +0 -1
  311. package/dist/UiCheckbox.vue_vue_type_script_setup_true_lang-BxyM_F-V.js.map +0 -1
  312. package/dist/UiLoading.vue_vue_type_script_setup_true_lang-rNvtzKbq.js.map +0 -1
  313. package/dist/UiMapAll.vue_vue_type_script_setup_true_lang-CMAyvJMk.js.map +0 -1
  314. package/dist/UiMenu.vue_vue_type_script_setup_true_lang-bQdfCzk6.js +0 -330
  315. package/dist/UiMenu.vue_vue_type_script_setup_true_lang-bQdfCzk6.js.map +0 -1
  316. package/dist/UiModal.vue_vue_type_script_setup_true_lang-CpwFUDVU.js.map +0 -1
  317. package/dist/UiNavLink.vue_vue_type_script_setup_true_lang-DnWMn40M.js.map +0 -1
  318. package/dist/UiProgressBar.vue_vue_type_script_setup_true_lang-BCh4orZW.js.map +0 -1
  319. package/dist/UiTable.vue_vue_type_script_setup_true_lang-xGAiJ9rS.js.map +0 -1
  320. package/dist/UiTransition.vue_vue_type_script_setup_true_lang-C4jb9I-3.js.map +0 -1
  321. package/dist/XMarkIcon-Cwy3T6p8.js +0 -22
  322. package/dist/XMarkIcon-Cwy3T6p8.js.map +0 -1
  323. package/dist/XMarkIcon-DNvCkiOy.js +0 -16
  324. package/dist/XMarkIcon-DNvCkiOy.js.map +0 -1
  325. package/dist/YearCalendar.vue_vue_type_script_setup_true_lang-CfKSpLLN.js.map +0 -1
  326. package/dist/_plugin-vue_export-helper-CHgC5LLL.js.map +0 -1
  327. package/dist/active-element-history-BTBNVIJN.js +0 -17
  328. package/dist/active-element-history-BTBNVIJN.js.map +0 -1
  329. package/dist/calculate-active-index-Dim3sT-5.js +0 -55
  330. package/dist/calculate-active-index-Dim3sT-5.js.map +0 -1
  331. package/dist/calendar-BlSSD4nO.js +0 -575
  332. package/dist/calendar-BlSSD4nO.js.map +0 -1
  333. package/dist/calendars/CalendarDashboard.js.map +0 -1
  334. package/dist/calendars/CalendarHeader.js.map +0 -1
  335. package/dist/calendars/DayCalendar.js.map +0 -1
  336. package/dist/calendars/EventCard.js.map +0 -1
  337. package/dist/calendars/EventsList.js.map +0 -1
  338. package/dist/calendars/MonthCalendar.js.map +0 -1
  339. package/dist/calendars/WeekCalendar.js.map +0 -1
  340. package/dist/calendars/YearCalendar.js.map +0 -1
  341. package/dist/charts/BarChart.js.map +0 -1
  342. package/dist/charts/BaseChart.js.map +0 -1
  343. package/dist/charts/FunnelChart.js.map +0 -1
  344. package/dist/charts/LineChart.js.map +0 -1
  345. package/dist/charts/PieChart.js.map +0 -1
  346. package/dist/charts/SparklineChart.js.map +0 -1
  347. package/dist/charts/StatCard.js.map +0 -1
  348. package/dist/charts/chartTheme.js.map +0 -1
  349. package/dist/charts/index.js.map +0 -1
  350. package/dist/components/Avatar.js.map +0 -1
  351. package/dist/components/Badge.js.map +0 -1
  352. package/dist/components/Banner.js.map +0 -1
  353. package/dist/components/Breadcrumb.js.map +0 -1
  354. package/dist/components/Button.js.map +0 -1
  355. package/dist/components/ButtonGroup.js.map +0 -1
  356. package/dist/components/Checkbox.js.map +0 -1
  357. package/dist/components/CloudinaryImage.js.map +0 -1
  358. package/dist/components/Loading.js.map +0 -1
  359. package/dist/components/LoadingDots.js.map +0 -1
  360. package/dist/components/LottieAnimation.js.map +0 -1
  361. package/dist/components/Menu.js.map +0 -1
  362. package/dist/components/Modal.js.map +0 -1
  363. package/dist/components/NavLink.js.map +0 -1
  364. package/dist/components/ProgressBar.js.map +0 -1
  365. package/dist/components/RadialProgressBar.js.map +0 -1
  366. package/dist/components/Table.js.map +0 -1
  367. package/dist/components/Transition.js.map +0 -1
  368. package/dist/composables/index.js.map +0 -1
  369. package/dist/composables/useCalendar.js.map +0 -1
  370. package/dist/composables/useFormValidation.js.map +0 -1
  371. package/dist/composables/useMap.js.map +0 -1
  372. package/dist/composables/useModal.js.map +0 -1
  373. package/dist/composables/useNotifications.js.map +0 -1
  374. package/dist/composables/useTabs.js.map +0 -1
  375. package/dist/composables/useTheme.js.map +0 -1
  376. package/dist/description-C7cRw0tq.js +0 -30
  377. package/dist/description-C7cRw0tq.js.map +0 -1
  378. package/dist/dialog-BJ2Ld8l3.js +0 -499
  379. package/dist/dialog-BJ2Ld8l3.js.map +0 -1
  380. package/dist/empty-state/ComingSoon.js.map +0 -1
  381. package/dist/empty-state/EmptyState.js.map +0 -1
  382. package/dist/empty-state/index.js.map +0 -1
  383. package/dist/env-BZfPsfnF.js +0 -29
  384. package/dist/env-BZfPsfnF.js.map +0 -1
  385. package/dist/form-f8yP4kN-.js +0 -35
  386. package/dist/form-f8yP4kN-.js.map +0 -1
  387. package/dist/forms/DynamicForm.js.map +0 -1
  388. package/dist/forms/DynamicFormField.js.map +0 -1
  389. package/dist/forms/FormFieldWrapper.js.map +0 -1
  390. package/dist/hidden-BSRluD1y.js +0 -15
  391. package/dist/hidden-BSRluD1y.js.map +0 -1
  392. package/dist/id-DafBB_QF.js.map +0 -1
  393. package/dist/index-Dca39bYA.js +0 -2167
  394. package/dist/index-Dca39bYA.js.map +0 -1
  395. package/dist/index.js.map +0 -1
  396. package/dist/inputs/AddDeleteButtonGroup.js.map +0 -1
  397. package/dist/inputs/CheckboxInput.js.map +0 -1
  398. package/dist/inputs/ComboboxInput.js.map +0 -1
  399. package/dist/inputs/DatepickerInput.js.map +0 -1
  400. package/dist/inputs/EmailInput.js.map +0 -1
  401. package/dist/inputs/EmptyInput.js.map +0 -1
  402. package/dist/inputs/FileDropzoneInput.js.map +0 -1
  403. package/dist/inputs/HiddenInput.js.map +0 -1
  404. package/dist/inputs/PhoneInput.js.map +0 -1
  405. package/dist/inputs/RichTextInput.js.map +0 -1
  406. package/dist/inputs/SelectInput.js.map +0 -1
  407. package/dist/inputs/SelectTextInput.js.map +0 -1
  408. package/dist/inputs/SwitchInput.js.map +0 -1
  409. package/dist/inputs/SwitchInputGroup.js.map +0 -1
  410. package/dist/inputs/TagifyInput.js.map +0 -1
  411. package/dist/inputs/TextAreaInput.js.map +0 -1
  412. package/dist/inputs/TextInput.js.map +0 -1
  413. package/dist/keyboard-Dd_2-cFu.js +0 -5
  414. package/dist/keyboard-Dd_2-cFu.js.map +0 -1
  415. package/dist/layouts/DashboardLayout.js.map +0 -1
  416. package/dist/layouts/DefaultLayout.js.map +0 -1
  417. package/dist/layouts/HeaderLayout.js.map +0 -1
  418. package/dist/layouts/NavigationGroup.js.map +0 -1
  419. package/dist/layouts/NavigationItem.js.map +0 -1
  420. package/dist/layouts/ProfileHeaderAvatar.js.map +0 -1
  421. package/dist/layouts/ProjectLogo.js.map +0 -1
  422. package/dist/layouts/SidebarLayout.js.map +0 -1
  423. package/dist/listbox-YaWWZiiG.js +0 -257
  424. package/dist/listbox-YaWWZiiG.js.map +0 -1
  425. package/dist/loading/ContentSkeleton.js.map +0 -1
  426. package/dist/loading/SmartLoadingIndicator.js.map +0 -1
  427. package/dist/loading/index.js.map +0 -1
  428. package/dist/mapThemes-DFE9fZm3.js.map +0 -1
  429. package/dist/maps/GoogleMap.js.map +0 -1
  430. package/dist/maps/UiInfoWindow.js.map +0 -1
  431. package/dist/maps/UiMap.js.map +0 -1
  432. package/dist/maps/UiMapAll.js.map +0 -1
  433. package/dist/maps/UiMapMarker.js.map +0 -1
  434. package/dist/maps/index.js.map +0 -1
  435. package/dist/micro-task-D-oTY33s.js +0 -9
  436. package/dist/micro-task-D-oTY33s.js.map +0 -1
  437. package/dist/modals/AlertModal.js.map +0 -1
  438. package/dist/modals/BaseModal.js.map +0 -1
  439. package/dist/modals/ImageCropperModal.js.map +0 -1
  440. package/dist/notifications/NotificationContainer.js.map +0 -1
  441. package/dist/notifications/NotificationToast.js.map +0 -1
  442. package/dist/notifications/index.js.map +0 -1
  443. package/dist/open-closed-JTEvYTg2.js +0 -19
  444. package/dist/open-closed-JTEvYTg2.js.map +0 -1
  445. package/dist/render-QUUPyNjX.js +0 -101
  446. package/dist/render-QUUPyNjX.js.map +0 -1
  447. package/dist/stepper/StepperPanels.js.map +0 -1
  448. package/dist/stepper/index.js.map +0 -1
  449. package/dist/tabs/InlineTabs.js.map +0 -1
  450. package/dist/tabs/TabGroup.js.map +0 -1
  451. package/dist/tabs/TabGroupUnderline.js.map +0 -1
  452. package/dist/tabs/TabsInPills.js.map +0 -1
  453. package/dist/tabs/index.js.map +0 -1
  454. package/dist/tabs-J5phClGv.js +0 -202
  455. package/dist/tabs-J5phClGv.js.map +0 -1
  456. package/dist/transition-_rPfnoET.js +0 -191
  457. package/dist/transition-_rPfnoET.js.map +0 -1
  458. package/dist/use-outside-click-14T0Zn98.js +0 -151
  459. package/dist/use-outside-click-14T0Zn98.js.map +0 -1
  460. package/dist/use-resolve-button-type-h6n-lm9q.js +0 -20
  461. package/dist/use-resolve-button-type-h6n-lm9q.js.map +0 -1
  462. package/dist/use-text-value-DKnkjK00.js +0 -44
  463. package/dist/use-text-value-DKnkjK00.js.map +0 -1
  464. package/dist/use-tree-walker-Bo9gIb_K.js +0 -16
  465. package/dist/use-tree-walker-Bo9gIb_K.js.map +0 -1
  466. package/dist/useEventSegments-B-r_8zCW.js.map +0 -1
  467. package/dist/useMap-BaZEIoWM.js +0 -525
  468. package/dist/useMap-BaZEIoWM.js.map +0 -1
  469. package/dist/useSimpleTabs-CSgkChEU.js.map +0 -1
  470. package/dist/useStringTransform-CSr7nZWg.js.map +0 -1
  471. package/dist/vue-datepicker-CEn0-fJj.js +0 -4871
  472. package/dist/vue-datepicker-CEn0-fJj.js.map +0 -1
  473. package/dist/vue-router-B3K2xmg_.js +0 -120
  474. package/dist/vue-router-B3K2xmg_.js.map +0 -1
  475. package/dist/vue3-lottie.es-DT4qZE-F.js +0 -7981
  476. package/dist/vue3-lottie.es-DT4qZE-F.js.map +0 -1
  477. package/dist/wrappers/BackgroundGradientWrapper.js.map +0 -1
  478. package/dist/wrappers/CardWrapper.js.map +0 -1
  479. package/dist/wrappers/DisclosureWrapper.js.map +0 -1
  480. package/dist/wrappers/FormErrorWrapper.js.map +0 -1
  481. package/dist/wrappers/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"NotificationContainer.vue_vue_type_style_index_0_lang-DSfNw4Ge.js","sources":["../src/components/notifications/NotificationContainer.vue"],"sourcesContent":["<!--\n @component NotificationContainer\n @description Container for rendering all active notifications with proper positioning\n \n Place this component once at the root of your app to enable the notification\n system. It automatically renders all active notifications from the useNotifications\n composable with support for stacking, positioning, and actions.\n \n ## Features\n - Automatic notification stacking with offset calculation\n - Position-aware containers (6 positions: tr, tl, tc, br, bl, bc)\n - Card stacking mode for many notifications\n - Action button handling (dismiss, link, callback)\n - Pause/resume support\n - Works with importing packages (teleports to body)\n \n @example\n // In App.vue or main layout\n <template>\n <div id=\"app\">\n <RouterView />\n <NotificationContainer />\n </div>\n </template>\n \n @example\n // Using notifications in any component\n <script setup>\n import { useNotifications } from '@stachelock/ui'\n \n const { success, error, showNotification } = useNotifications()\n \n // Simple notifications\n success('Saved!', 'Your changes were saved successfully.')\n error('Error', 'Something went wrong.')\n \n // With actions\n showNotification({\n title: 'Confirm Delete',\n message: 'Are you sure you want to delete this item?',\n theme: 'warning',\n autoClose: false,\n actions: [\n { label: 'Delete', action: 'callback', callback: () => deleteItem(), theme: 'danger' },\n { label: 'Cancel', action: 'dismiss' }\n ]\n })\n </script>\n-->\n<template>\n <Teleport to=\"body\">\n <!-- Top Left -->\n <div \n v-if=\"notificationsByPosition.tl.length > 0\"\n class=\"sl-notifications-position sl-notifications-tl\"\n >\n <NotificationToast\n v-for=\"notification in notificationsByPosition.tl\"\n :key=\"notification.id\"\n :notification=\"notification\"\n @close=\"handleClose\"\n @action=\"handleAction\"\n />\n </div>\n\n <!-- Top Center -->\n <div \n v-if=\"notificationsByPosition.tc.length > 0\"\n class=\"sl-notifications-position sl-notifications-tc\"\n >\n <NotificationToast\n v-for=\"notification in notificationsByPosition.tc\"\n :key=\"notification.id\"\n :notification=\"notification\"\n @close=\"handleClose\"\n @action=\"handleAction\"\n />\n </div>\n\n <!-- Top Right -->\n <div \n v-if=\"notificationsByPosition.tr.length > 0\"\n class=\"sl-notifications-position sl-notifications-tr\"\n >\n <NotificationToast\n v-for=\"notification in notificationsByPosition.tr\"\n :key=\"notification.id\"\n :notification=\"notification\"\n @close=\"handleClose\"\n @action=\"handleAction\"\n />\n </div>\n\n <!-- Bottom Left -->\n <div \n v-if=\"notificationsByPosition.bl.length > 0\"\n class=\"sl-notifications-position sl-notifications-bl\"\n >\n <NotificationToast\n v-for=\"notification in notificationsByPosition.bl\"\n :key=\"notification.id\"\n :notification=\"notification\"\n @close=\"handleClose\"\n @action=\"handleAction\"\n />\n </div>\n\n <!-- Bottom Center -->\n <div \n v-if=\"notificationsByPosition.bc.length > 0\"\n class=\"sl-notifications-position sl-notifications-bc\"\n >\n <NotificationToast\n v-for=\"notification in notificationsByPosition.bc\"\n :key=\"notification.id\"\n :notification=\"notification\"\n @close=\"handleClose\"\n @action=\"handleAction\"\n />\n </div>\n\n <!-- Bottom Right (Default) -->\n <div \n v-if=\"notificationsByPosition.br.length > 0\"\n class=\"sl-notifications-position sl-notifications-br\"\n >\n <NotificationToast\n v-for=\"notification in notificationsByPosition.br\"\n :key=\"notification.id\"\n :notification=\"notification\"\n @close=\"handleClose\"\n @action=\"handleAction\"\n />\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * NotificationContainer - Global notification renderer with position-aware containers\n * \n * Renders all active notifications from the notification system, grouped by position.\n * Uses Teleport to render notifications at the body level for proper z-index.\n * \n * ## Setup\n * Add this component once in your app root:\n * ```vue\n * <template>\n * <div id=\"app\">\n * <YourContent />\n * <NotificationContainer />\n * </div>\n * </template>\n * ```\n * \n * ## Usage\n * Then use the composable anywhere:\n * ```typescript\n * import { useNotifications } from '@stachelock/ui'\n * \n * const { success, error, warning, info, showNotification } = useNotifications()\n * \n * // Simple notifications (defaults to bottom-right)\n * success('Saved!', 'Your changes were saved successfully.')\n * error('Error', 'Something went wrong.')\n * \n * // Position-specific notifications\n * showNotification({\n * title: 'Top Right',\n * message: 'This appears in the top right.',\n * position: 'tr'\n * })\n * \n * // Advanced notification with actions\n * showNotification({\n * title: 'Session Expiring',\n * message: 'Your session will expire in 5 minutes.',\n * theme: 'warning',\n * position: 'br',\n * priority: 'high',\n * autoClose: false,\n * actions: [\n * { label: 'Extend Session', action: 'callback', callback: extendSession, theme: 'primary' },\n * { label: 'Logout', action: 'callback', callback: logout, theme: 'secondary' }\n * ]\n * })\n * ```\n */\nimport { computed } from 'vue';\nimport { \n useNotifications, \n type NotificationState, \n type NotificationAction,\n type NotificationPosition\n} from '../../composables/useNotifications';\nimport NotificationToast from './NotificationToast.vue';\n\nconst { \n activeNotifications, \n hideNotification, \n executeAction, \n bringToFront \n} = useNotifications();\n\n// Group notifications by position\nconst notificationsByPosition = computed(() => {\n const groups: Record<NotificationPosition, NotificationState[]> = {\n tl: [],\n tc: [],\n tr: [],\n bl: [],\n bc: [],\n br: []\n };\n \n for (const notification of activeNotifications.value) {\n const pos = notification.position || 'br';\n groups[pos].push(notification);\n }\n \n return groups;\n});\n\nconst handleClose = (notification: NotificationState) => {\n hideNotification(notification);\n};\n\nconst handleAction = (notification: NotificationState, action: NotificationAction) => {\n // Handle special \"bring to front\" action for card stacking\n if (action.label === 'bringToFront') {\n bringToFront(notification.id);\n return;\n }\n \n // Execute the action\n executeAction(notification.id, action);\n \n // Auto-dismiss after callback/link actions unless sticky\n if (action.action !== 'dismiss' && !notification.sticky) {\n // Small delay to let any callback complete\n setTimeout(() => {\n hideNotification(notification);\n }, 100);\n }\n};\n</script>\n\n<style>\n/* Position containers - these are fixed positioned containers for each corner/edge */\n.sl-notifications-position {\n position: fixed;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 24px;\n pointer-events: none;\n max-height: calc(100vh - 48px);\n overflow: visible;\n}\n\n/* Allow pointer events on individual notifications and set proper width */\n.sl-notifications-position > * {\n pointer-events: auto;\n width: 384px; /* max-w-sm equivalent */\n max-width: calc(100vw - 48px);\n}\n\n/* Top positions */\n.sl-notifications-tl {\n top: 0;\n left: 0;\n align-items: flex-start;\n}\n\n.sl-notifications-tc {\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n align-items: center;\n}\n\n.sl-notifications-tr {\n top: 0;\n right: 0;\n align-items: flex-end;\n}\n\n/* Bottom positions - flex-direction reversed so new items appear at bottom */\n.sl-notifications-bl {\n bottom: 0;\n left: 0;\n align-items: flex-start;\n flex-direction: column-reverse;\n}\n\n.sl-notifications-bc {\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n align-items: center;\n flex-direction: column-reverse;\n}\n\n.sl-notifications-br {\n bottom: 0;\n right: 0;\n align-items: flex-end;\n flex-direction: column-reverse;\n}\n\n/* Mobile adjustments */\n@media (max-width: 640px) {\n .sl-notifications-position {\n padding: 16px;\n left: 0;\n right: 0;\n }\n \n .sl-notifications-position > * {\n width: 100%;\n max-width: 100%;\n }\n \n .sl-notifications-tl,\n .sl-notifications-tc,\n .sl-notifications-tr {\n top: 0;\n align-items: stretch;\n }\n \n .sl-notifications-bl,\n .sl-notifications-bc,\n .sl-notifications-br {\n bottom: 0;\n align-items: stretch;\n }\n \n /* On mobile, center positions take full width */\n .sl-notifications-tc,\n .sl-notifications-bc {\n transform: none;\n }\n}\n</style>\n"],"names":["activeNotifications","hideNotification","executeAction","bringToFront","useNotifications","notificationsByPosition","computed","groups","notification","pos","handleClose","handleAction","action","_createBlock","_Teleport","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_renderList","NotificationToast","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"NotificationToast.vue_vue_type_script_setup_true_lang-CU__ORw8.js","sources":["../src/components/notifications/NotificationToast.vue"],"sourcesContent":["<!--\n @component NotificationToast\n @description Individual notification toast with animations, theming, and dark mode support\n \n Displays a single notification with icon, title, message, actions, and close button.\n Supports multiple themes, variants, positions, and card stacking with smooth transitions.\n \n ## Features\n - Multiple themes with dark mode support\n - Three variants: default, compact, expanded\n - Action buttons with dismiss, link, and callback support\n - Card stacking mode for multiple notifications\n - Priority-based styling (low, normal, high, urgent)\n - Smooth enter/leave transitions\n \n @props\n - notification (NotificationState): The notification data object\n \n @emits\n - close: Emitted when the close button is clicked\n - action: Emitted when an action button is clicked\n \n @example\n <NotificationToast \n :notification=\"notification\" \n @close=\"handleClose\"\n @action=\"handleAction\"\n />\n-->\n<template>\n <TransitionRoot \n appear \n :show=\"notification.isOpen\" \n as=\"template\" \n @after-leave=\"onAfterLeave\"\n >\n <TransitionChild \n as=\"template\" \n enter=\"sl-duration-300 sl-ease-out sl-transform\"\n :enter-from=\"enterFromClass\"\n enter-to=\"sl-translate-y-0 sl-opacity-100 sl-translate-x-0\" \n leave=\"sl-duration-200 sl-ease-in\"\n leave-from=\"sl-opacity-100\" \n leave-to=\"sl-opacity-0\"\n >\n <div \n v-if=\"notification.isOpen\" \n :class=\"[\n themeClass,\n variantClass,\n priorityClass,\n cardModeClass,\n 'sl-pointer-events-auto sl-overflow-hidden sl-rounded-lg sl-shadow-lg sl-ring-1 sl-ring-black/5 dark:sl-ring-white/10 sl-transition-all sl-duration-200 sl-relative'\n ]\"\n :style=\"toastStyle\"\n @click=\"handleCardClick\"\n role=\"alert\"\n :aria-live=\"notification.priority === 'urgent' ? 'assertive' : 'polite'\"\n >\n <div :class=\"paddingClass\">\n <div class=\"sl-flex sl-items-start\">\n <!-- Icon -->\n <component \n v-if=\"iconComponent\"\n :is=\"iconComponent\" \n :class=\"[iconSizeClass, iconColorClass, 'sl-flex-shrink-0']\"\n aria-hidden=\"true\" \n />\n \n <!-- Content -->\n <div :class=\"contentMarginClass\">\n <!-- Title -->\n <p :class=\"[titleClass, textColorClass]\">\n {{ notification.title }}\n </p>\n \n <!-- Message -->\n <p \n v-if=\"notification.message\" \n :class=\"[messageClass, textColorClass, 'sl-opacity-90']\"\n >\n {{ notification.message }}\n </p>\n \n <!-- Actions -->\n <div \n v-if=\"notification.actions && notification.actions.length > 0\"\n class=\"sl-mt-3 sl-flex sl-gap-2\"\n >\n <button\n v-for=\"(action, idx) in notification.actions\"\n :key=\"idx\"\n type=\"button\"\n :class=\"getActionButtonClass(action)\"\n @click.stop=\"handleAction(action)\"\n >\n {{ action.label }}\n </button>\n </div>\n </div>\n \n <!-- Close Button -->\n <button \n v-if=\"notification.dismissible !== false\"\n type=\"button\" \n @click.stop=\"handleClose\"\n :class=\"[closeButtonClass, focusRingClass]\"\n >\n <span class=\"sl-sr-only\">Close</span>\n <XMarkIcon class=\"sl-h-5 sl-w-5\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n \n <!-- Priority indicator for urgent/high -->\n <div \n v-if=\"notification.priority === 'urgent' || notification.priority === 'high'\"\n :class=\"priorityIndicatorClass\"\n />\n </div>\n </TransitionChild>\n </TransitionRoot>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * NotificationToast - Individual notification display\n * \n * Renders a single notification with theming, icons, actions, and animations.\n * Used internally by NotificationContainer but can be used standalone.\n */\nimport { computed, type Component } from 'vue';\nimport { \n CheckCircleIcon, \n ExclamationTriangleIcon, \n ExclamationCircleIcon, \n InformationCircleIcon \n} from '@heroicons/vue/24/outline';\nimport { XMarkIcon } from '@heroicons/vue/20/solid';\nimport { TransitionRoot, TransitionChild } from '@headlessui/vue';\nimport type { NotificationState, NotificationAction } from '../../composables/useNotifications';\n\nconst props = defineProps<{ \n notification: NotificationState \n}>();\n\nconst emit = defineEmits<{\n close: [notification: NotificationState];\n action: [notification: NotificationState, action: NotificationAction];\n}>();\n\nconst handleClose = () => {\n emit('close', props.notification);\n};\n\nconst handleAction = (action: NotificationAction) => {\n emit('action', props.notification, action);\n};\n\nconst handleCardClick = () => {\n // Clicking on a card in card mode brings it to front\n if (props.notification.isCardMode && props.notification.cardStackIndex !== 0) {\n emit('action', props.notification, { label: 'bringToFront', action: 'callback' });\n }\n};\n\nconst onAfterLeave = () => {\n // Animation cleanup callback\n};\n\n// Theme classes with dark mode support\nconst themeClass = computed(() => {\n const themes: Record<string, string> = {\n primary: 'sl-bg-primary-600 dark:sl-bg-primary-700 sl-text-white',\n secondary: 'sl-bg-gray-600 dark:sl-bg-gray-700 sl-text-white',\n dark: 'sl-bg-gray-800 dark:sl-bg-gray-900 sl-text-white',\n light: 'sl-bg-white dark:sl-bg-gray-800 sl-text-gray-800 dark:sl-text-gray-100 sl-border sl-border-gray-200 dark:sl-border-gray-700',\n warning: 'sl-bg-amber-500 dark:sl-bg-amber-600 sl-text-white',\n danger: 'sl-bg-red-500 dark:sl-bg-red-600 sl-text-white',\n success: 'sl-bg-emerald-500 dark:sl-bg-emerald-600 sl-text-white',\n info: 'sl-bg-blue-500 dark:sl-bg-blue-600 sl-text-white',\n ghost: 'sl-bg-white dark:sl-bg-gray-800 sl-text-gray-800 dark:sl-text-gray-100 sl-border sl-border-gray-200 dark:sl-border-gray-700',\n };\n return themes[props.notification.theme] || themes.primary;\n});\n\n// Variant classes - width is controlled by container, just set max-width for variants\nconst variantClass = computed(() => {\n const variants: Record<string, string> = {\n default: '',\n compact: '',\n expanded: '',\n };\n return variants[props.notification.variant] || variants.default;\n});\n\n// Priority classes\nconst priorityClass = computed(() => {\n if (props.notification.priority === 'urgent') {\n return 'sl-animate-pulse';\n }\n return '';\n});\n\n// Priority indicator\nconst priorityIndicatorClass = computed(() => {\n const base = 'sl-absolute sl-top-0 sl-left-0 sl-right-0 sl-h-1';\n if (props.notification.priority === 'urgent') {\n return `${base} sl-bg-red-400 dark:sl-bg-red-500`;\n }\n if (props.notification.priority === 'high') {\n return `${base} sl-bg-amber-400 dark:sl-bg-amber-500`;\n }\n return '';\n});\n\n// Card mode classes\nconst cardModeClass = computed(() => {\n if (props.notification.isCardMode) {\n return 'sl-cursor-pointer hover:sl-scale-[1.02] sl-transition-transform';\n }\n return '';\n});\n\n// Toast style for card stacking and custom widths\nconst toastStyle = computed(() => {\n const styles: Record<string, string | number> = {};\n \n if (props.notification.maxWidth) {\n styles.maxWidth = `${props.notification.maxWidth}px`;\n }\n \n if (props.notification.isCardMode) {\n styles.transform = `translate(${props.notification.cardOffsetX || 0}px, ${props.notification.cardOffsetY || 0}px)`;\n styles.zIndex = props.notification.zIndex || 1;\n }\n \n return styles;\n});\n\n// Text color based on theme\nconst textColorClass = computed(() => {\n const theme = props.notification.theme;\n return ['light', 'ghost'].includes(theme) ? 'sl-text-gray-800 dark:sl-text-gray-100' : 'sl-text-white';\n});\n\n// Icon color\nconst iconColorClass = computed(() => {\n const theme = props.notification.theme;\n return ['light', 'ghost'].includes(theme) ? 'sl-text-gray-500 dark:sl-text-gray-400' : 'sl-text-white/90';\n});\n\n// Focus ring class\nconst focusRingClass = computed(() => {\n const rings: Record<string, string> = {\n primary: 'focus:sl-ring-primary-400 dark:focus:sl-ring-primary-500',\n secondary: 'focus:sl-ring-gray-400 dark:focus:sl-ring-gray-500',\n dark: 'focus:sl-ring-gray-400 dark:focus:sl-ring-gray-500',\n light: 'focus:sl-ring-gray-300 dark:focus:sl-ring-gray-600',\n warning: 'focus:sl-ring-amber-300 dark:focus:sl-ring-amber-500',\n danger: 'focus:sl-ring-red-300 dark:focus:sl-ring-red-500',\n success: 'focus:sl-ring-emerald-300 dark:focus:sl-ring-emerald-500',\n info: 'focus:sl-ring-blue-300 dark:focus:sl-ring-blue-500',\n ghost: 'focus:sl-ring-gray-300 dark:focus:sl-ring-gray-600',\n };\n return rings[props.notification.theme] || rings.primary;\n});\n\n// Close button class\nconst closeButtonClass = computed(() => {\n const theme = props.notification.theme;\n const baseClass = 'sl-ml-4 sl-inline-flex sl-rounded-md sl-opacity-70 hover:sl-opacity-100 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-offset-2 sl-transition-opacity';\n const colorClass = ['light', 'ghost'].includes(theme) \n ? 'sl-text-gray-400 dark:sl-text-gray-500 hover:sl-text-gray-500 dark:hover:sl-text-gray-400' \n : 'sl-text-white/70 hover:sl-text-white';\n return `${baseClass} ${colorClass}`;\n});\n\n// Icon component based on theme or custom\nconst iconComponent = computed((): Component | undefined => {\n // Allow custom icon override\n if (props.notification.icon) {\n return props.notification.icon;\n }\n \n const theme = props.notification.theme;\n const icons: Record<string, Component> = {\n primary: InformationCircleIcon,\n secondary: InformationCircleIcon,\n dark: ExclamationCircleIcon,\n light: InformationCircleIcon,\n warning: ExclamationTriangleIcon,\n danger: ExclamationCircleIcon,\n success: CheckCircleIcon,\n info: InformationCircleIcon,\n ghost: InformationCircleIcon,\n };\n return icons[theme] || icons.primary;\n});\n\n// Variant-specific sizing\nconst iconSizeClass = computed(() => {\n const sizes: Record<string, string> = {\n compact: 'sl-h-5 sl-w-5',\n default: 'sl-h-6 sl-w-6',\n expanded: 'sl-h-7 sl-w-7',\n };\n return sizes[props.notification.variant] || sizes.default;\n});\n\nconst titleClass = computed(() => {\n const sizes: Record<string, string> = {\n compact: 'sl-text-xs sl-font-medium',\n default: 'sl-text-sm sl-font-medium',\n expanded: 'sl-text-base sl-font-semibold',\n };\n return sizes[props.notification.variant] || sizes.default;\n});\n\nconst messageClass = computed(() => {\n const sizes: Record<string, string> = {\n compact: 'sl-mt-0.5 sl-text-xs',\n default: 'sl-mt-1 sl-text-sm',\n expanded: 'sl-mt-2 sl-text-sm',\n };\n return sizes[props.notification.variant] || sizes.default;\n});\n\nconst paddingClass = computed(() => {\n const sizes: Record<string, string> = {\n compact: 'sl-p-3',\n default: 'sl-p-4',\n expanded: 'sl-p-5',\n };\n return sizes[props.notification.variant] || sizes.default;\n});\n\nconst contentMarginClass = computed(() => {\n const sizes: Record<string, string> = {\n compact: 'sl-ml-2 sl-w-0 sl-flex-1',\n default: 'sl-ml-3 sl-w-0 sl-flex-1 sl-pt-0.5',\n expanded: 'sl-ml-4 sl-w-0 sl-flex-1 sl-pt-0.5',\n };\n return sizes[props.notification.variant] || sizes.default;\n});\n\n// Action button styling\nconst getActionButtonClass = (action: NotificationAction): string => {\n const base = 'sl-rounded sl-px-2 sl-py-1 sl-text-xs sl-font-medium sl-transition-colors focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-offset-1';\n const theme = props.notification.theme;\n const isLightTheme = ['light', 'ghost'].includes(theme);\n \n const themes: Record<string, { light: string; dark: string }> = {\n primary: {\n light: 'sl-bg-primary-100 sl-text-primary-700 hover:sl-bg-primary-200 dark:sl-bg-primary-800 dark:sl-text-primary-200 dark:hover:sl-bg-primary-700',\n dark: 'sl-bg-white/20 sl-text-white hover:sl-bg-white/30'\n },\n secondary: {\n light: 'sl-bg-gray-100 sl-text-gray-700 hover:sl-bg-gray-200 dark:sl-bg-gray-700 dark:sl-text-gray-200 dark:hover:sl-bg-gray-600',\n dark: 'sl-bg-white/20 sl-text-white hover:sl-bg-white/30'\n },\n danger: {\n light: 'sl-bg-red-100 sl-text-red-700 hover:sl-bg-red-200 dark:sl-bg-red-900 dark:sl-text-red-200 dark:hover:sl-bg-red-800',\n dark: 'sl-bg-white/20 sl-text-white hover:sl-bg-white/30'\n }\n };\n \n const actionTheme = action.theme || 'secondary';\n const themeStyle = themes[actionTheme] || themes.secondary;\n \n return `${base} ${isLightTheme ? themeStyle.light : themeStyle.dark}`;\n};\n\n// Entry animation direction based on position\nconst enterFromClass = computed(() => {\n const position = props.notification.position;\n const classes: Record<string, string> = {\n tr: 'sl-translate-x-full sl-opacity-0',\n tl: '-sl-translate-x-full sl-opacity-0',\n br: 'sl-translate-x-full sl-opacity-0',\n bl: '-sl-translate-x-full sl-opacity-0',\n tc: '-sl-translate-y-full sl-opacity-0',\n bc: 'sl-translate-y-full sl-opacity-0',\n };\n return classes[position] || classes.br;\n});\n</script>\n"],"names":["props","__props","emit","__emit","handleClose","handleAction","action","handleCardClick","onAfterLeave","themeClass","computed","themes","variantClass","variants","priorityClass","priorityIndicatorClass","base","cardModeClass","toastStyle","styles","textColorClass","theme","iconColorClass","focusRingClass","rings","closeButtonClass","baseClass","colorClass","iconComponent","icons","InformationCircleIcon","ExclamationCircleIcon","ExclamationTriangleIcon","CheckCircleIcon","iconSizeClass","sizes","titleClass","messageClass","paddingClass","contentMarginClass","getActionButtonClass","isLightTheme","actionTheme","themeStyle","enterFromClass","position","classes","_createBlock","_unref","TransitionRoot","_createVNode","TransitionChild","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_2","_openBlock","_resolveDynamicComponent","_toDisplayString","_hoisted_3","_Fragment","idx","_withModifiers","$event","_hoisted_4","_cache","XMarkIcon"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PieChart.vue_vue_type_script_setup_true_lang-e3wsA9O4.js","sources":["../src/components/charts/PieChart.vue"],"sourcesContent":["<!--\n @component PieChart\n @description Pie/Donut chart component.\n \n @props\n - data (array, required): Array of {name, value} objects\n - title (string, optional): Chart title\n - donut (boolean, optional): Render as donut chart\n - height (number|string, optional): Chart height\n - colors (array, optional): Custom color palette\n - showLabels (boolean, optional): Show segment labels\n \n @example\n <PieChart\n :data=\"[\n { name: 'Category A', value: 40 },\n { name: 'Category B', value: 30 },\n { name: 'Category C', value: 30 }\n ]\"\n title=\"Distribution\"\n donut\n />\n-->\n<template>\n <BaseChart\n :option=\"chartOption\"\n :height=\"height\"\n :loading=\"loading\"\n v-bind=\"$attrs\"\n @click=\"handleClick\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport BaseChart from './BaseChart.vue';\nimport { chartColors } from './chartTheme';\nimport type { EChartsOption } from 'echarts';\n\ninterface PieDataItem {\n name: string;\n value: number;\n}\n\ninterface Props {\n data: PieDataItem[];\n title?: string;\n donut?: boolean;\n height?: number | string;\n colors?: string[];\n loading?: boolean;\n showLabels?: boolean;\n showLegend?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n donut: false,\n height: 300,\n colors: () => chartColors.primary,\n loading: false,\n showLabels: false,\n showLegend: true,\n});\n\nconst emit = defineEmits<{\n click: [params: unknown];\n}>();\n\nconst chartOption = computed<EChartsOption>(() => {\n return {\n title: props.title ? { text: props.title } : undefined,\n legend: props.showLegend ? { \n show: true,\n orient: 'horizontal',\n bottom: 0,\n } : { show: false },\n tooltip: {\n trigger: 'item',\n formatter: '{b}: {c} ({d}%)',\n },\n color: props.colors,\n series: [{\n type: 'pie',\n radius: props.donut ? ['40%', '70%'] : '70%',\n center: ['50%', '45%'],\n avoidLabelOverlap: true,\n itemStyle: {\n borderRadius: 4,\n borderColor: '#ffffff',\n borderWidth: 2,\n },\n label: {\n show: props.showLabels,\n position: props.donut ? 'center' : 'outside',\n },\n emphasis: {\n label: {\n show: true,\n fontSize: 14,\n fontWeight: 600,\n },\n },\n labelLine: {\n show: props.showLabels && !props.donut,\n },\n data: props.data,\n }],\n };\n});\n\nconst handleClick = (params: unknown): void => {\n emit('click', params);\n};\n</script>\n\n"],"names":["props","__props","emit","__emit","chartOption","computed","handleClick","params","_openBlock","_createBlock","BaseChart","_mergeProps","$attrs"],"mappings":";;;;;;;;;;;;;;;;;AAuDA,UAAMA,IAAQC,GASRC,IAAOC,GAIPC,IAAcC,EAAwB,OACnC;AAAA,MACL,OAAOL,EAAM,QAAQ,EAAE,MAAMA,EAAM,UAAU;AAAA,MAC7C,QAAQA,EAAM,aAAa;AAAA,QACzB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,MAAA,IACN,EAAE,MAAM,GAAA;AAAA,MACZ,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,MAAA;AAAA,MAEb,OAAOA,EAAM;AAAA,MACb,QAAQ,CAAC;AAAA,QACP,MAAM;AAAA,QACN,QAAQA,EAAM,QAAQ,CAAC,OAAO,KAAK,IAAI;AAAA,QACvC,QAAQ,CAAC,OAAO,KAAK;AAAA,QACrB,mBAAmB;AAAA,QACnB,WAAW;AAAA,UACT,cAAc;AAAA,UACd,aAAa;AAAA,UACb,aAAa;AAAA,QAAA;AAAA,QAEf,OAAO;AAAA,UACL,MAAMA,EAAM;AAAA,UACZ,UAAUA,EAAM,QAAQ,WAAW;AAAA,QAAA;AAAA,QAErC,UAAU;AAAA,UACR,OAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU;AAAA,YACV,YAAY;AAAA,UAAA;AAAA,QACd;AAAA,QAEF,WAAW;AAAA,UACT,MAAMA,EAAM,cAAc,CAACA,EAAM;AAAA,QAAA;AAAA,QAEnC,MAAMA,EAAM;AAAA,MAAA,CACb;AAAA,IAAA,EAEJ,GAEKM,IAAc,CAACC,MAA0B;AAC7C,MAAAL,EAAK,SAASK,CAAM;AAAA,IACtB;sBAxFEC,EAAA,GAAAC,EAMEC,GANFC,EAME;AAAA,MALC,QAAQP,EAAA;AAAA,MACR,QAAQH,EAAA;AAAA,MACR,SAASA,EAAA;AAAA,IAAA,GACFW,EAAAA,QAAM,EACb,SAAON,EAAA,CAAW,GAAA,MAAA,IAAA,CAAA,UAAA,UAAA,SAAA,CAAA;AAAA;;"}
@@ -1,40 +0,0 @@
1
- import { createElementBlock as e, openBlock as r, createElementVNode as o } from "vue";
2
- function a(t, n) {
3
- return r(), e("svg", {
4
- xmlns: "http://www.w3.org/2000/svg",
5
- fill: "none",
6
- viewBox: "0 0 24 24",
7
- "stroke-width": "1.5",
8
- stroke: "currentColor",
9
- "aria-hidden": "true",
10
- "data-slot": "icon"
11
- }, [
12
- o("path", {
13
- "stroke-linecap": "round",
14
- "stroke-linejoin": "round",
15
- d: "M5 12h14"
16
- })
17
- ]);
18
- }
19
- function c(t, n) {
20
- return r(), e("svg", {
21
- xmlns: "http://www.w3.org/2000/svg",
22
- fill: "none",
23
- viewBox: "0 0 24 24",
24
- "stroke-width": "1.5",
25
- stroke: "currentColor",
26
- "aria-hidden": "true",
27
- "data-slot": "icon"
28
- }, [
29
- o("path", {
30
- "stroke-linecap": "round",
31
- "stroke-linejoin": "round",
32
- d: "M12 4.5v15m7.5-7.5h-15"
33
- })
34
- ]);
35
- }
36
- export {
37
- a,
38
- c as r
39
- };
40
- //# sourceMappingURL=PlusIcon-aDFVlB90.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PlusIcon-aDFVlB90.js","sources":["../node_modules/@heroicons/vue/24/outline/esm/MinusIcon.js","../node_modules/@heroicons/vue/24/outline/esm/PlusIcon.js"],"sourcesContent":["import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M5 12h14\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M12 4.5v15m7.5-7.5h-15\"\n })\n ]))\n}"],"names":["render","_ctx","_cache","_openBlock","_createElementBlock","_createElementVNode"],"mappings":";AAEe,SAASA,EAAOC,GAAMC,GAAQ;AAC3C,SAAQC,EAAU,GAAIC,EAAoB,OAAO;AAAA,IAC/C,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,aAAa;AAAA,EACjB,GAAK;AAAA,IACDC,EAAoB,QAAQ;AAAA,MAC1B,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,GAAG;AAAA,IACT,CAAK;AAAA,EACL,CAAG;AACH;AChBe,SAASL,EAAOC,GAAMC,GAAQ;AAC3C,SAAQC,EAAU,GAAIC,EAAoB,OAAO;AAAA,IAC/C,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,aAAa;AAAA,EACjB,GAAK;AAAA,IACDC,EAAoB,QAAQ;AAAA,MAC1B,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,GAAG;AAAA,IACT,CAAK;AAAA,EACL,CAAG;AACH;","x_google_ignoreList":[0,1]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProfileHeaderAvatar.vue_vue_type_script_setup_true_lang-CKCoHD1o.js","sources":["../src/components/layouts/ProfileHeaderAvatar.vue"],"sourcesContent":["<!--\n @component ProfileHeaderAvatar\n @description User avatar with dropdown menu for profile actions.\n \n A flexible user avatar component that displays a profile image (via Cloudinary)\n or initials fallback, with an expandable dropdown menu showing user info and actions.\n \n @props\n - userName (string): Display name of the user\n - userEmail (string): Email address of the user\n - imagePublicId (string, optional): Cloudinary public_id for profile image\n - imageUrl (string, optional): Direct URL for profile image (fallback if no publicId)\n - showLogout (boolean): Show logout button in dropdown (default: true)\n - logoutLabel (string): Label for logout button (default: 'Log Out')\n - size (number): Avatar size in pixels (default: 40)\n - ringColor (string): Tailwind ring color class for hover/active state\n - menuPosition (object): Position overrides for dropdown menu\n \n @emits\n - logout: Emitted when logout button is clicked\n - menu-toggle: Emitted when menu is opened/closed with boolean state\n \n @slots\n - menu-header: Custom header content in dropdown (replaces default name/email)\n - menu-items: Additional menu items between user info and logout\n - avatar: Custom avatar content (replaces default image/initials)\n \n @example\n <ProfileHeaderAvatar\n user-name=\"John Doe\"\n user-email=\"john@example.com\"\n image-public-id=\"users/john-doe-avatar\"\n @logout=\"handleLogout\"\n />\n-->\n<template>\n <div class=\"sl-relative sl-flex sl-items-center sl-gap-3\">\n <!-- User Avatar Button -->\n <button \n ref=\"avatarButton\"\n type=\"button\"\n @click=\"toggleMenu\"\n class=\"sl-relative sl-inline-flex sl-items-center sl-justify-center sl-rounded-full sl-overflow-hidden sl-transition-all sl-flex-shrink-0 focus:sl-outline-none\"\n :class=\"[\n ringClasses,\n { [activeRingClass]: isMenuOpen }\n ]\"\n :style=\"{ width: `${size}px`, height: `${size}px` }\"\n :aria-expanded=\"isMenuOpen\"\n aria-haspopup=\"true\"\n >\n <slot name=\"avatar\">\n <!-- Cloudinary image if public_id or URL available -->\n <CloudinaryImage \n v-if=\"hasImage\" \n :src=\"imageUrl\"\n :public-id=\"imagePublicId\" \n :alt=\"userName\" \n :width=\"size\"\n :height=\"size\" \n :custom-classes=\"{ image: { 'sl-w-full sl-h-full sl-object-cover sl-object-center': true } }\" \n skeleton=\"user\" \n />\n <!-- Initials fallback -->\n <div \n v-else \n class=\"sl-w-full sl-h-full sl-inline-flex sl-items-center sl-justify-center sl-bg-stachelock-200 dark:sl-bg-stachelock-700\"\n >\n <span \n class=\"sl-font-semibold sl-text-stachelock-700 dark:sl-text-stachelock-200\"\n :class=\"initialsTextSize\"\n >\n {{ computedInitials }}\n </span>\n </div>\n </slot>\n </button>\n\n <!-- Dropdown Menu -->\n <Transition\n enter-active-class=\"sl-transition sl-ease-out sl-duration-100\"\n enter-from-class=\"sl-transform sl-opacity-0 sl-scale-95\"\n enter-to-class=\"sl-transform sl-opacity-100 sl-scale-100\"\n leave-active-class=\"sl-transition sl-ease-in sl-duration-75\"\n leave-from-class=\"sl-transform sl-opacity-100 sl-scale-100\"\n leave-to-class=\"sl-transform sl-opacity-0 sl-scale-95\"\n >\n <div \n v-if=\"isMenuOpen\"\n ref=\"menuRef\"\n class=\"sl-absolute sl-bg-white dark:sl-bg-slate-800 sl-rounded-lg sl-shadow-lg sl-border sl-border-gray-200 dark:sl-border-slate-700 sl-z-50 sl-min-w-max sl-overflow-hidden\"\n :style=\"menuStyles\"\n role=\"menu\"\n aria-orientation=\"vertical\"\n >\n <!-- Header with user info -->\n <div class=\"sl-p-4 sl-border-b sl-border-gray-200 dark:sl-border-slate-700\">\n <slot name=\"menu-header\">\n <p class=\"sl-text-sm sl-font-medium sl-text-gray-900 dark:sl-text-white\">{{ userName }}</p>\n <p class=\"sl-text-xs sl-text-gray-500 dark:sl-text-slate-400\">{{ userEmail }}</p>\n </slot>\n </div>\n \n <!-- Custom menu items slot -->\n <div v-if=\"$slots['menu-items']\" class=\"sl-py-1\">\n <slot name=\"menu-items\" />\n </div>\n \n <!-- Logout button -->\n <button \n v-if=\"showLogout\"\n type=\"button\"\n @click=\"handleLogout\"\n class=\"sl-w-full sl-text-left sl-px-4 sl-py-2 sl-text-sm sl-text-red-600 dark:sl-text-red-400 hover:sl-bg-red-50 dark:hover:sl-bg-red-900/20 sl-transition-colors\"\n role=\"menuitem\"\n >\n {{ logoutLabel }}\n </button>\n </div>\n </Transition>\n\n <!-- Backdrop for closing menu -->\n <div \n v-if=\"isMenuOpen\" \n class=\"sl-fixed sl-inset-0 sl-z-40\" \n @click=\"closeMenu\" \n aria-hidden=\"true\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * ProfileHeaderAvatar - User avatar with dropdown menu\n * \n * @module components/layouts/ProfileHeaderAvatar\n */\nimport { ref, computed, onMounted, onBeforeUnmount, type CSSProperties } from 'vue';\nimport CloudinaryImage from '../CloudinaryImage.vue';\n\ninterface Props {\n /** Display name of the user */\n userName: string;\n /** Email address of the user */\n userEmail?: string;\n /** Cloudinary public_id for profile image */\n imagePublicId?: string;\n /** Direct URL for profile image (fallback if no publicId) */\n imageUrl?: string;\n /** Show logout button in dropdown */\n showLogout?: boolean;\n /** Label for logout button */\n logoutLabel?: string;\n /** Avatar size in pixels */\n size?: number;\n /** Custom ring color class for hover/active state */\n ringColorClass?: string;\n /** Menu position from top */\n menuTop?: string;\n /** Menu position from right */\n menuRight?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n userEmail: '',\n showLogout: true,\n logoutLabel: 'Log Out',\n size: 40,\n ringColorClass: 'sl-ring-stachelock-400',\n menuTop: '3rem',\n menuRight: '0',\n});\n\nconst emit = defineEmits<{\n /** Emitted when logout button is clicked */\n logout: [];\n /** Emitted when menu is opened/closed */\n 'menu-toggle': [isOpen: boolean];\n}>();\n\nconst isMenuOpen = ref(false);\nconst avatarButton = ref<HTMLButtonElement | null>(null);\nconst menuRef = ref<HTMLDivElement | null>(null);\n\n// Check if we have any image source\nconst hasImage = computed(() => {\n return !!props.imagePublicId || !!props.imageUrl;\n});\n\n// Computed initials from user name\nconst computedInitials = computed(() => {\n if (!props.userName) return 'U';\n return props.userName\n .split(' ')\n .map((n: string) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n});\n\n// Ring classes for hover and active states\nconst ringClasses = computed(() => {\n return `hover:sl-ring-2 hover:${props.ringColorClass}`;\n});\n\nconst activeRingClass = computed(() => {\n return `sl-ring-2 ${props.ringColorClass}`;\n});\n\n// Text size based on avatar size\nconst initialsTextSize = computed(() => {\n if (props.size < 32) return 'sl-text-xs';\n if (props.size < 48) return 'sl-text-sm';\n return 'sl-text-base';\n});\n\n// Menu positioning styles\nconst menuStyles = computed((): CSSProperties => ({\n top: props.menuTop,\n right: props.menuRight,\n}));\n\n// Toggle menu open/close\nconst toggleMenu = () => {\n isMenuOpen.value = !isMenuOpen.value;\n emit('menu-toggle', isMenuOpen.value);\n};\n\n// Close menu\nconst closeMenu = () => {\n if (isMenuOpen.value) {\n isMenuOpen.value = false;\n emit('menu-toggle', false);\n }\n};\n\n// Handle logout click\nconst handleLogout = () => {\n closeMenu();\n emit('logout');\n};\n\n// Handle escape key to close menu\nconst handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeMenu();\n }\n};\n\nonMounted(() => {\n document.addEventListener('keydown', handleEscapeKey);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('keydown', handleEscapeKey);\n});\n\n// Expose methods for parent components\ndefineExpose({\n toggleMenu,\n closeMenu,\n isMenuOpen,\n});\n</script>\n"],"names":["props","__props","emit","__emit","isMenuOpen","ref","avatarButton","menuRef","hasImage","computed","computedInitials","n","ringClasses","activeRingClass","initialsTextSize","menuStyles","toggleMenu","closeMenu","handleLogout","handleEscapeKey","event","onMounted","onBeforeUnmount","__expose","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeStyle","_renderSlot","_ctx","_createBlock","CloudinaryImage","_hoisted_3","_normalizeClass","_createVNode","_Transition","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","$slots","_hoisted_7"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProjectLogo.vue_vue_type_script_setup_true_lang-DYjp-RNh.js","sources":["../src/components/layouts/ProjectLogo.vue"],"sourcesContent":["<!--\n @component ProjectLogo\n @description Display a project or organization logo with fallback.\n \n A flexible logo display component that shows either a provided logo image\n or a customizable fallback placeholder when no logo is available.\n \n @props\n - logoUrl (string, optional): URL of the logo image to display\n - publicId (string, optional): Cloudinary public_id for the logo\n - alt (string): Alt text for the logo image\n - width (number): Width of the logo in pixels\n - height (number): Height of the logo in pixels\n - fallbackType ('rings' | 'initials' | 'icon'): Type of fallback to show\n - fallbackText (string): Text for initials fallback\n - rounded (boolean): Apply rounded-full class\n \n @slots\n - fallback: Custom fallback content when no logo is available\n \n @example\n <ProjectLogo\n logo-url=\"https://example.com/logo.png\"\n alt=\"Company Logo\"\n :width=\"64\"\n :height=\"64\"\n />\n-->\n<template>\n <div \n class=\"sl-flex sl-items-center sl-justify-center\"\n :style=\"containerStyles\"\n >\n <!-- Cloudinary image if public_id provided -->\n <CloudinaryImage \n v-if=\"publicId\" \n :public-id=\"publicId\" \n :alt=\"alt\" \n :width=\"width\"\n :height=\"height\" \n :custom-classes=\"{ \n image: { \n 'sl-object-contain': true,\n 'sl-rounded-full': rounded \n } \n }\" \n />\n \n <!-- Direct URL image -->\n <img \n v-else-if=\"logoUrl\" \n :src=\"logoUrl\" \n :alt=\"alt\" \n :style=\"imageStyles\"\n :class=\"[\n 'sl-object-contain',\n { 'sl-rounded-full': rounded }\n ]\"\n />\n \n <!-- Fallback -->\n <slot v-else name=\"fallback\">\n <!-- Rings fallback (default) -->\n <svg \n v-if=\"fallbackType === 'rings'\"\n :width=\"width\" \n :height=\"height\" \n viewBox=\"0 0 100 100\" \n class=\"sl-text-stachelock-500 dark:sl-text-stachelock-400\"\n >\n <circle \n cx=\"50\" \n cy=\"50\" \n r=\"45\" \n fill=\"none\" \n stroke=\"currentColor\" \n stroke-width=\"4\"\n />\n <circle \n cx=\"50\" \n cy=\"50\" \n r=\"30\" \n fill=\"none\" \n stroke=\"currentColor\" \n stroke-width=\"4\"\n />\n <circle \n cx=\"50\" \n cy=\"50\" \n r=\"15\" \n fill=\"currentColor\"\n />\n </svg>\n \n <!-- Initials fallback -->\n <div \n v-else-if=\"fallbackType === 'initials'\"\n class=\"sl-flex sl-items-center sl-justify-center sl-bg-stachelock-100 dark:sl-bg-stachelock-800 sl-text-stachelock-700 dark:sl-text-stachelock-200 sl-font-bold\"\n :class=\"{ 'sl-rounded-full': rounded }\"\n :style=\"imageStyles\"\n >\n {{ computedInitials }}\n </div>\n \n <!-- Icon fallback -->\n <div \n v-else-if=\"fallbackType === 'icon'\"\n class=\"sl-flex sl-items-center sl-justify-center sl-bg-gray-100 dark:sl-bg-gray-700\"\n :class=\"{ 'sl-rounded-full': rounded }\"\n :style=\"imageStyles\"\n >\n <svg \n class=\"sl-w-1/2 sl-h-1/2 sl-text-gray-400 dark:sl-text-gray-500\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n stroke-linecap=\"round\" \n stroke-linejoin=\"round\" \n stroke-width=\"1.5\" \n d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4\"\n />\n </svg>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * ProjectLogo - Display project or organization logo\n * \n * @module components/layouts/ProjectLogo\n */\nimport { computed, type CSSProperties } from 'vue';\nimport CloudinaryImage from '../CloudinaryImage.vue';\n\ntype FallbackType = 'rings' | 'initials' | 'icon';\n\ninterface Props {\n /** URL of the logo image */\n logoUrl?: string;\n /** Cloudinary public_id for the logo */\n publicId?: string;\n /** Alt text for the logo */\n alt?: string;\n /** Width of the logo in pixels */\n width?: number;\n /** Height of the logo in pixels */\n height?: number;\n /** Type of fallback to display */\n fallbackType?: FallbackType;\n /** Text for initials fallback (e.g., organization name) */\n fallbackText?: string;\n /** Apply rounded-full styling */\n rounded?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n alt: 'Project Logo',\n width: 64,\n height: 64,\n fallbackType: 'rings',\n fallbackText: '',\n rounded: false,\n});\n\n// Container styles\nconst containerStyles = computed((): CSSProperties => ({\n width: `${props.width}px`,\n height: `${props.height}px`,\n}));\n\n// Image styles\nconst imageStyles = computed((): CSSProperties => ({\n width: `${props.width}px`,\n height: `${props.height}px`,\n}));\n\n// Computed initials from fallback text\nconst computedInitials = computed(() => {\n if (!props.fallbackText) return '?';\n return props.fallbackText\n .split(' ')\n .map((word: string) => word[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n});\n</script>\n"],"names":["props","__props","containerStyles","computed","imageStyles","computedInitials","word","_createElementBlock","_createBlock","CloudinaryImage","_normalizeClass","_renderSlot","_ctx","_createElementVNode"],"mappings":";;;;;;;;;;;;;;;AA+JA,UAAMA,IAAQC,GAURC,IAAkBC,EAAS,OAAsB;AAAA,MACrD,OAAO,GAAGH,EAAM,KAAK;AAAA,MACrB,QAAQ,GAAGA,EAAM,MAAM;AAAA,IAAA,EACvB,GAGII,IAAcD,EAAS,OAAsB;AAAA,MACjD,OAAO,GAAGH,EAAM,KAAK;AAAA,MACrB,QAAQ,GAAGA,EAAM,MAAM;AAAA,IAAA,EACvB,GAGIK,IAAmBF,EAAS,MAC3BH,EAAM,eACJA,EAAM,aACV,MAAM,GAAG,EACT,IAAI,CAACM,MAAiBA,EAAK,CAAC,CAAC,EAC7B,KAAK,EAAE,EACP,cACA,MAAM,GAAG,CAAC,IANmB,GAOjC;2BAhKCC,EAiGM,OAAA;AAAA,MAhGJ,OAAM;AAAA,MACL,SAAOL,EAAA,KAAe;AAAA,IAAA;MAIfD,EAAA,iBADRO,EAYEC,GAAA;AAAA;QAVC,aAAWR,EAAA;AAAA,QACX,KAAKA,EAAA;AAAA,QACL,OAAOA,EAAA;AAAA,QACP,QAAQA,EAAA;AAAA,QACR,kBAAc;AAAA;;+BAAyFA,EAAA;AAAA,UAAA;AAAA;gFAU7FA,EAAA,gBADbM,EASE,OAAA;AAAA;QAPC,KAAKN,EAAA;AAAA,QACL,KAAKA,EAAA;AAAA,QACL,SAAOG,EAAA,KAAW;AAAA,QAClB,OAAKM,EAAA;AAAA;+BAA8DT,EAAA,QAAA;AAAA,QAAO;yBAO7EU,EAgEOC,kCAhEP,MAgEO;AAAA,QA7DGX,EAAA,iBAAY,gBADpBM,EA6BM,OAAA;AAAA;UA3BH,OAAON,EAAA;AAAA,UACP,QAAQA,EAAA;AAAA,UACT,SAAQ;AAAA,UACR,OAAM;AAAA,QAAA;UAENY,EAOE,UAAA;AAAA,YANA,IAAG;AAAA,YACH,IAAG;AAAA,YACH,GAAE;AAAA,YACF,MAAK;AAAA,YACL,QAAO;AAAA,YACP,gBAAa;AAAA,UAAA;UAEfA,EAOE,UAAA;AAAA,YANA,IAAG;AAAA,YACH,IAAG;AAAA,YACH,GAAE;AAAA,YACF,MAAK;AAAA,YACL,QAAO;AAAA,YACP,gBAAa;AAAA,UAAA;UAEfA,EAKE,UAAA;AAAA,YAJA,IAAG;AAAA,YACH,IAAG;AAAA,YACH,GAAE;AAAA,YACF,MAAK;AAAA,UAAA;sBAMIZ,EAAA,iBAAY,mBADzBM,EAOM,OAAA;AAAA;UALJ,OAAKG,EAAA,CAAC,4JAA0J,EAAA,mBACnIT,EAAA,QAAA,CAAO,CAAA;AAAA,UACnC,SAAOG,EAAA,KAAW;AAAA,QAAA,KAEhBC,EAAA,KAAgB,GAAA,CAAA,KAKRJ,EAAA,iBAAY,eADzBM,EAmBM,OAAA;AAAA;UAjBJ,OAAKG,EAAA,CAAC,gFAA8E,EAAA,mBACvDT,EAAA,QAAA,CAAO,CAAA;AAAA,UACnC,SAAOG,EAAA,KAAW;AAAA,QAAA;UAEnBS,EAYM,OAAA;AAAA,YAXJ,OAAM;AAAA,YACN,MAAK;AAAA,YACL,QAAO;AAAA,YACP,SAAQ;AAAA,UAAA;YAERA,EAKE,QAAA;AAAA,cAJA,kBAAe;AAAA,cACf,mBAAgB;AAAA,cAChB,gBAAa;AAAA,cACb,GAAE;AAAA,YAAA;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SelectInput.vue_vue_type_script_setup_true_lang-DHiZ-7K2.js","sources":["../src/components/inputs/SelectInput.vue"],"sourcesContent":["<!--\n @component SelectInput\n @description Dropdown select input with Headless UI integration.\n \n A select/dropdown component built on Headless UI's Listbox with support\n for single and multiple selection, icons, and validation.\n \n @props\n - name (string, required): Field name for form binding\n - items (SelectItem[], required): Options array with id/name or custom keys\n - label (string, optional): Display label\n - placeholder (string, optional): Placeholder text\n - disabled (boolean, optional): Disabled state\n - multiple (boolean, optional): Enable multiple selection\n - showAll (boolean, optional): Show \"Select All\" option for multiple\n - itemKey (string, optional): Property for item key (default: 'id')\n - itemText (string, optional): Property for item text (default: 'name')\n - rules (Schema, optional): Validation rules\n - modelValue (any, optional): Selected value(s) via v-model\n \n @emits\n - update:modelValue: Emitted when selection changes\n \n @example\n <SelectInput\n name=\"country\"\n label=\"Country\"\n :items=\"countries\"\n v-model=\"form.country\"\n placeholder=\"Select a country\"\n />\n \n @example Multiple selection with Select All\n <SelectInput\n name=\"languages\"\n label=\"Languages\"\n :items=\"languages\"\n v-model=\"form.languages\"\n multiple\n show-all\n />\n-->\n<template>\n <div class=\"sl-w-full\">\n <FormFieldWrapper\n :id=\"id\"\n :name=\"name\"\n :label=\"label\"\n :disabled=\"disabled\"\n :optional=\"!rules\"\n :tertiary-label=\"tertiaryLabel\"\n :box-shadow=\"boxShadow\"\n :error-message=\"errorMessage\"\n :success-message=\"successMessage\"\n :is-valid=\"meta.valid\"\n :is-touched=\"meta.touched\"\n >\n <Listbox\n v-model=\"selectedValue\"\n :disabled=\"disabled\"\n :multiple=\"multiple\"\n @update:model-value=\"handleChange\"\n v-slot=\"{ open }\"\n >\n <div class=\"sl-relative\">\n <!-- Track open state changes to sync position updates -->\n <DropdownPositionTracker :open=\"open\" :update-fn=\"updateDropdownPosition\" />\n <ListboxButton\n ref=\"listboxButtonRef\"\n :id=\"id\"\n :class=\"[\n selectClasses,\n buttonClass\n ]\"\n @click=\"updateDropdownPosition\"\n >\n <span class=\"sl-flex sl-items-center sl-gap-2\">\n <!-- Selected item icon -->\n <component\n v-if=\"selectedIcon\"\n :is=\"selectedIcon\"\n class=\"sl-h-4 sl-w-4 sl-flex-shrink-0\"\n aria-hidden=\"true\"\n />\n \n <!-- Selected value display -->\n <span\n v-if=\"displayValue\"\n class=\"sl-block sl-truncate sl-text-left\"\n >\n {{ displayValue }}\n </span>\n <span\n v-else\n class=\"sl-block sl-truncate sl-text-left sl-text-gray-500 dark:sl-text-slate-300\"\n >\n {{ placeholder || 'Select an option' }}\n </span>\n </span>\n \n <span class=\"sl-pointer-events-none sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-2\">\n <ChevronUpDownIcon\n class=\"sl-h-5 sl-w-5 sl-text-gray-400 dark:sl-text-slate-300\"\n aria-hidden=\"true\"\n />\n </span>\n </ListboxButton>\n\n <Teleport to=\"body\">\n <transition\n leave-active-class=\"sl-transition sl-duration-100 sl-ease-in\"\n leave-from-class=\"sl-opacity-100\"\n leave-to-class=\"sl-opacity-0\"\n >\n <ListboxOptions\n class=\"sl-fixed sl-z-[9999] sl-overflow-auto sl-rounded-md sl-bg-white dark:sl-bg-slate-800 sl-py-1 sl-text-base sl-shadow-lg dark:sl-shadow-slate-900/50 sl-ring-1 sl-ring-black sl-ring-opacity-5 dark:sl-ring-slate-700 focus:sl-outline-none sm:sl-text-sm\"\n :style=\"dropdownStyle\"\n >\n <!-- Show All option for multiple select -->\n <li\n v-if=\"multiple && showAll\"\n role=\"button\"\n tabindex=\"0\"\n @mousedown.prevent\n @click.prevent.stop=\"toggleSelectAll\"\n :class=\"[\n 'sl-relative sl-cursor-pointer sl-select-none sl-py-2 sl-pl-3 sl-pr-9 sl-text-gray-900 dark:sl-text-slate-200',\n 'hover:sl-bg-stachelock-600 hover:sl-text-white',\n ]\"\n >\n <span class=\"sl-block sl-truncate sl-font-medium\">\n {{ isAllSelected ? 'Unselect All' : 'Select All' }}\n </span>\n </li>\n\n <!-- Regular options -->\n <ListboxOption\n v-for=\"item in items\"\n :key=\"getItemKey(item)\"\n :value=\"item\"\n as=\"template\"\n :disabled=\"item.disabled\"\n v-slot=\"{ active, selected }\"\n >\n <li\n :class=\"[\n 'sl-relative sl-cursor-default sl-select-none sl-py-2 sl-pl-3 sl-pr-9',\n active ? 'sl-bg-stachelock-600 sl-text-white' : 'sl-text-gray-900 dark:sl-text-slate-200',\n item.disabled ? 'sl-opacity-50 sl-cursor-not-allowed' : ''\n ]\"\n >\n <div class=\"sl-flex sl-items-center sl-gap-2\">\n <!-- Item icon -->\n <component\n v-if=\"item.icon\"\n :is=\"item.icon\"\n class=\"sl-h-4 sl-w-4 sl-flex-shrink-0\"\n :class=\"active ? 'sl-text-white' : 'sl-text-gray-400 dark:sl-text-slate-300'\"\n aria-hidden=\"true\"\n />\n \n <span\n :class=\"[\n 'sl-block sl-truncate',\n selected ? 'sl-font-medium' : 'sl-font-normal'\n ]\"\n >\n {{ getItemText(item) }}\n </span>\n </div>\n\n <span\n v-if=\"selected\"\n class=\"sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-4\"\n >\n <CheckIcon class=\"sl-h-5 sl-w-5\" aria-hidden=\"true\" />\n </span>\n </li>\n </ListboxOption>\n </ListboxOptions>\n </transition>\n </Teleport>\n </div>\n </Listbox>\n \n <template #success-message>\n <span v-if=\"successMessage\">{{ successMessage }}</span>\n </template>\n </FormFieldWrapper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * SelectInput - Dropdown select with Headless UI\n * \n * Provides a styled select/dropdown component with single and multiple\n * selection modes. Uses Headless UI's Listbox for accessibility.\n * \n * ## Features\n * - Single and multiple selection modes\n * - \"Select All\" option for multiple mode\n * - Item icons support\n * - vee-validate integration\n * - Accessible keyboard navigation\n * - Customizable item key/text properties\n * - Teleported dropdown to avoid z-index/overflow issues\n * \n * @module components/inputs/SelectInput\n * @see {@link SelectItem} for item interface\n */\nimport { computed, ref, watch, onBeforeUnmount, defineComponent } from 'vue'\nimport {\n Listbox,\n ListboxButton,\n ListboxOption,\n ListboxOptions,\n} from '@headlessui/vue'\nimport { CheckIcon, ChevronUpDownIcon } from '@heroicons/vue/20/solid'\nimport { useField } from 'vee-validate'\nimport FormFieldWrapper from '../forms/FormFieldWrapper.vue'\nimport type { ValidationRule } from '../../types/form'\nimport { generateId } from '../../utils/id'\n\n/**\n * DropdownPositionTracker - Renderless component that watches HeadlessUI open state\n * and triggers position updates when dropdown opens or scroll/resize occurs\n */\nconst DropdownPositionTracker = defineComponent({\n props: {\n open: { type: Boolean, required: true },\n updateFn: { type: Function, required: true }\n },\n setup(props) {\n // Define handleScroll in setup scope so it's a stable reference\n const handleScroll = () => {\n if (props.open) {\n props.updateFn()\n }\n }\n \n // Watch the open prop and trigger position update + attach scroll listeners\n watch(() => props.open, (isOpen) => {\n if (isOpen) {\n // Update position immediately when opening\n props.updateFn()\n // Add scroll/resize listeners - use capture to catch scroll events from any container\n window.addEventListener('scroll', handleScroll, true)\n window.addEventListener('resize', handleScroll)\n } else {\n // Remove listeners when closed\n window.removeEventListener('scroll', handleScroll, true)\n window.removeEventListener('resize', handleScroll)\n }\n }, { immediate: true })\n \n // Cleanup on unmount\n onBeforeUnmount(() => {\n window.removeEventListener('scroll', handleScroll, true)\n window.removeEventListener('resize', handleScroll)\n })\n \n // Render nothing\n return () => null\n }\n})\n\n// Refs for floating dropdown positioning\nconst listboxButtonRef = ref<InstanceType<typeof ListboxButton> | null>(null)\nconst dropdownStyle = ref<Record<string, string>>({\n top: '0px',\n left: '0px',\n width: '200px'\n})\n\n// Estimated dropdown height for flip calculation (max-h-56 = 14rem = 224px)\nconst DROPDOWN_MAX_HEIGHT = 224\nconst DROPDOWN_GAP = 4\n\nfunction updateDropdownPosition() {\n // Get the actual DOM element from the Headless UI component\n const el = listboxButtonRef.value?.$el as HTMLElement | undefined\n if (!el) return\n \n const rect = el.getBoundingClientRect()\n const viewportHeight = window.innerHeight\n \n // Calculate available space below and above the button\n const spaceBelow = viewportHeight - rect.bottom - DROPDOWN_GAP\n const spaceAbove = rect.top - DROPDOWN_GAP\n \n // Determine if we should flip to show above\n const shouldFlipAbove = spaceBelow < DROPDOWN_MAX_HEIGHT && spaceAbove > spaceBelow\n \n if (shouldFlipAbove) {\n // Position above the button\n dropdownStyle.value = {\n bottom: `${viewportHeight - rect.top + DROPDOWN_GAP}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n maxHeight: `${Math.min(spaceAbove, DROPDOWN_MAX_HEIGHT)}px`\n }\n } else {\n // Position below the button (default)\n dropdownStyle.value = {\n top: `${rect.bottom + DROPDOWN_GAP}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n maxHeight: `${Math.min(spaceBelow, DROPDOWN_MAX_HEIGHT)}px`\n }\n }\n}\n\nimport type { SelectItem, SelectItemValue } from '../../types/inputs'\n\ninterface Props {\n name: string\n items: SelectItem[]\n label?: string\n placeholder?: string\n disabled?: boolean\n rules?: ValidationRule\n validateOnMount?: boolean\n successMessage?: string\n tertiaryLabel?: string\n buttonClass?: string\n multiple?: boolean\n showAll?: boolean\n itemKey?: string\n itemText?: string\n modelValue?: SelectItemValue | SelectItem | SelectItem[]\n boxShadow?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n itemKey: 'id',\n itemText: 'name',\n multiple: false,\n showAll: false,\n boxShadow: false\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: SelectItemValue | SelectItem | SelectItem[]]\n}>()\n\nconst id = generateId(props.name)\n\n// Use vee-validate for form validation\nconst { value, errorMessage, handleChange: handleValidation, meta, setTouched } = useField(\n () => props.name,\n props.rules,\n {\n validateOnMount: props.validateOnMount,\n initialValue: props.modelValue\n }\n)\n\nconst selectedValue = ref<any>(\n props.multiple\n ? (Array.isArray(props.modelValue) ? props.modelValue : [])\n : props.modelValue\n)\n\n// Watch for external changes\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (props.multiple) {\n const coerced = Array.isArray(newValue) ? newValue : []\n if (coerced !== selectedValue.value) {\n selectedValue.value = coerced\n value.value = coerced\n }\n } else {\n if (newValue !== selectedValue.value) {\n selectedValue.value = newValue\n value.value = newValue\n }\n }\n },\n { immediate: true }\n)\n\nwatch(\n selectedValue,\n (newValue) => {\n emit('update:modelValue', newValue)\n }\n)\n\nconst selectClasses = computed(() => {\n const baseClasses = [\n 'sl-relative',\n 'sl-w-full',\n 'sl-cursor-default',\n 'sl-rounded-md',\n 'sl-bg-white',\n 'dark:sl-bg-slate-900',\n 'sl-text-gray-900',\n 'dark:sl-text-slate-100',\n 'sl-py-2',\n 'sl-pl-3',\n 'sl-pr-10',\n 'sl-text-left',\n 'sl-border',\n 'sl-text-sm',\n 'focus:sl-outline-none',\n 'focus:sl-ring-2',\n 'focus:sl-ring-stachelock-500',\n 'focus:sl-border-stachelock-500',\n 'sl-transition-all',\n 'sl-duration-200'\n ]\n\n if (props.disabled) {\n baseClasses.push(\n 'sl-bg-gray-50',\n 'dark:sl-bg-slate-800',\n 'sl-text-gray-500',\n 'dark:sl-text-slate-300',\n 'sl-cursor-not-allowed',\n 'sl-border-gray-200',\n 'dark:sl-border-slate-700'\n )\n } else if (errorMessage.value) {\n baseClasses.push(\n 'sl-border-red-300',\n 'dark:sl-border-red-500',\n 'focus:sl-ring-red-500',\n 'focus:sl-border-red-500'\n )\n } else if (meta.valid && meta.touched) {\n baseClasses.push(\n 'sl-border-green-300',\n 'dark:sl-border-green-500',\n 'focus:sl-ring-green-500',\n 'focus:sl-border-green-500'\n )\n } else {\n baseClasses.push(\n 'sl-border-gray-300',\n 'dark:sl-border-slate-600',\n 'hover:sl-border-gray-400',\n 'dark:hover:sl-border-slate-500'\n )\n }\n\n return baseClasses.join(' ')\n})\n\nconst getItemKey = (item: SelectItem): SelectItemValue => {\n return item[props.itemKey] as SelectItemValue\n}\n\nconst getItemText = (item: SelectItem): string => {\n return item[props.itemText] || item.toString()\n}\n\nconst displayValue = computed(() => {\n if (!selectedValue.value) return ''\n \n if (props.multiple && Array.isArray(selectedValue.value)) {\n if (selectedValue.value.length === 0) return ''\n if (selectedValue.value.length === 1) {\n return getItemText(selectedValue.value[0])\n }\n return `${selectedValue.value.length} items selected`\n }\n \n return getItemText(selectedValue.value)\n})\n\nconst selectedIcon = computed(() => {\n if (!selectedValue.value) return null\n \n if (props.multiple && Array.isArray(selectedValue.value)) {\n return selectedValue.value.length === 1 ? selectedValue.value[0].icon : null\n }\n \n return selectedValue.value.icon\n})\n\nconst allItems = computed(() => {\n return props.items.filter(item => !item.disabled)\n})\n\nconst handleChange = (value: SelectItemValue | SelectItem | SelectItem[]) => {\n selectedValue.value = value\n setTouched(true)\n handleValidation(value)\n}\n\nconst isAllSelected = computed(() => {\n if (!props.multiple || !Array.isArray(selectedValue.value)) return false\n const selectable = allItems.value\n if (selectable.length === 0) return false\n // Compare by item key instead of reference for reliable equality check\n const selectedKeys = new Set((selectedValue.value as SelectItem[]).map(item => getItemKey(item)))\n return selectable.every(item => selectedKeys.has(getItemKey(item)))\n})\n\nconst toggleSelectAll = () => {\n if (!props.multiple) return\n if (isAllSelected.value) {\n selectedValue.value = []\n } else {\n selectedValue.value = [...allItems.value]\n }\n handleValidation(selectedValue.value)\n}\n</script>\n\n\n"],"names":["DROPDOWN_MAX_HEIGHT","DROPDOWN_GAP","DropdownPositionTracker","defineComponent","props","handleScroll","watch","isOpen","onBeforeUnmount","listboxButtonRef","ref","dropdownStyle","updateDropdownPosition","el","rect","viewportHeight","spaceBelow","spaceAbove","__props","emit","__emit","id","generateId","value","errorMessage","handleValidation","meta","setTouched","useField","selectedValue","newValue","coerced","selectClasses","computed","baseClasses","getItemKey","item","getItemText","displayValue","selectedIcon","allItems","handleChange","isAllSelected","selectable","selectedKeys","toggleSelectAll","_openBlock","_createElementBlock","_hoisted_1","_createVNode","FormFieldWrapper","_unref","Listbox","$event","_withCtx","open","_createElementVNode","_hoisted_2","ListboxButton","_normalizeClass","_hoisted_3","_createBlock","_resolveDynamicComponent","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_6","ChevronUpDownIcon","_Teleport","_Transition","ListboxOptions","_hoisted_7","_Fragment","_renderList","ListboxOption","active","selected","_hoisted_8","_hoisted_9","CheckIcon"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SelectTextInput.vue_vue_type_script_setup_true_lang-DYrXW14A.js","sources":["../src/components/inputs/SelectTextInput.vue"],"sourcesContent":["<!--\n @component SelectTextInput\n @description Combined select dropdown and text input field.\n \n A composite input that combines a select dropdown with a text input,\n useful for inputs like \"Fall 2023\" where the user selects a term\n and enters a year. Uses Headless UI Listbox for accessible select.\n \n @props\n - name (string, required): Field name for form binding\n - label (string, optional): Main label text\n - value (CompositeValue | string, optional): Combined value object or string\n - select (object, optional): Select configuration { options, placeholder, label }\n - text (object, optional): Text input config { placeholder, inputMode, maxLength, label }\n - delimiter (string, optional): Character between select and text in display\n - showErrors (boolean, optional): Force show validation errors\n - hasError (boolean, optional): External error state\n - disabled (boolean, optional): Disabled state\n - colorfulValidation (boolean, optional): Color-coded validation states\n - showValidCheck (boolean, optional): Show success icon when valid\n \n @emits\n - update:value: Emitted when composite value changes\n - update:validity: Emitted when validation state changes\n \n @example\n <SelectTextInput\n name=\"graduation\"\n label=\"Expected Graduation\"\n :value=\"{ select: 'Fall', text: '2024' }\"\n :select=\"{ options: [{ label: 'Fall', value: 'Fall' }, { label: 'Spring', value: 'Spring' }] }\"\n :text=\"{ placeholder: 'Year', inputMode: 'numeric', maxLength: 4 }\"\n @update:value=\"handleUpdate\"\n />\n-->\n<template>\n <div class=\"sl-space-y-1\" data-testid=\"select-text-input\">\n <!-- Main label row -->\n <div \n v-if=\"label || secondaryLabel || tertiaryLabel || (disabled && disabledMessage)\" \n class=\"sl-grid sl-grid-cols-3 sl-items-center\"\n >\n <div class=\"sl-col-span-2 sl-flex sl-items-center\">\n <component \n v-if=\"labelIconLeft\" \n :is=\"labelIconLeft\" \n class=\"sl-mr-2 sl-h-4 sl-w-4 sl-text-yellow-300\" \n />\n <label v-if=\"label\" class=\"sl-text-sm sl-font-medium\" :style=\"{ color: 'var(--sl-text-primary)' }\">\n {{ label }}\n </label>\n </div>\n <div class=\"sl-justify-self-end sl-col-start-3 sl-text-right sl-space-y-0.5\">\n <p \n v-if=\"disabled && disabledMessage\" \n class=\"sl-text-xs\" :style=\"{ color: 'var(--sl-text-muted)' }\"\n >\n {{ disabledMessage }}\n </p>\n <span \n v-if=\"secondaryLabel\" \n class=\"sl-text-2xs sl-uppercase sl-truncate sl-font-semibold sl-block\" :style=\"{ color: 'var(--sl-text-secondary)' }\"\n >\n {{ secondaryLabel }}\n </span>\n <span \n v-if=\"tertiaryLabel\" \n class=\"sl-text-xs sl-uppercase sl-truncate sl-font-semibold sl-block\" :style=\"{ color: 'var(--sl-text-secondary)' }\"\n >\n {{ tertiaryLabel }}\n </span>\n </div>\n </div>\n\n <!-- Input container -->\n <div class=\"sl-relative sl-mt-1\">\n <!-- Error icon -->\n <div \n v-if=\"showError\" \n class=\"sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-3 sl-z-20 sl-pointer-events-none\"\n >\n <ExclamationCircleIcon class=\"sl-h-5 sl-w-5 sl-text-red-500\" aria-hidden=\"true\" />\n </div>\n <!-- Success icon -->\n <div \n v-else-if=\"showSuccess\" \n class=\"sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-3 sl-z-20 sl-pointer-events-none\"\n >\n <CheckCircleIcon class=\"sl-h-5 sl-w-5 sl-text-green-500\" aria-hidden=\"true\" />\n </div>\n\n <div \n class=\"sl-flex sl-rounded-md sl-shadow-sm sl-ring-1 sl-ring-inset focus-within:sl-ring-2 focus-within:sl-ring-inset\"\n :class=\"containerRingClass\"\n >\n <!-- Select dropdown using Headless UI Listbox -->\n <Listbox\n :model-value=\"selectedOption\"\n @update:model-value=\"onSelectChange\"\n :disabled=\"disabled\"\n >\n <div class=\"sl-relative\">\n <ListboxButton\n ref=\"listboxButtonRef\"\n :class=\"[\n 'sl-relative sl-cursor-default sl-rounded-l-md sl-border-0 sl-py-2 sl-pl-3 sl-pr-10 sl-text-left sl-text-sm',\n 'sl-bg-white dark:sl-bg-slate-900 sl-text-gray-900 dark:sl-text-slate-100',\n 'focus:sl-outline-none focus:sl-ring-0',\n disabled ? 'sl-cursor-not-allowed sl-bg-gray-50 dark:sl-bg-slate-800 sl-text-gray-500 dark:sl-text-slate-400' : ''\n ]\"\n data-testid=\"select-dropdown\"\n @click=\"onDropdownClick\"\n >\n <span \n class=\"sl-block sl-truncate sl-min-w-[80px]\"\n :class=\"selectedOption ? '' : 'sl-text-gray-500 dark:sl-text-slate-400'\"\n >\n {{ selectedOption?.label || select?.placeholder || 'Select…' }}\n </span>\n <span class=\"sl-pointer-events-none sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-2\">\n <ChevronUpDownIcon class=\"sl-h-5 sl-w-5 sl-text-gray-400 dark:sl-text-slate-300\" aria-hidden=\"true\" />\n </span>\n </ListboxButton>\n \n <Teleport to=\"body\">\n <transition\n leave-active-class=\"sl-transition sl-duration-100 sl-ease-in\"\n leave-from-class=\"sl-opacity-100\"\n leave-to-class=\"sl-opacity-0\"\n >\n <ListboxOptions\n class=\"sl-fixed sl-z-[9999] sl-max-h-56 sl-overflow-auto sl-rounded-md sl-bg-white dark:sl-bg-slate-800 sl-py-1 sl-text-base sl-shadow-lg dark:sl-shadow-slate-900/50 sl-ring-1 sl-ring-black sl-ring-opacity-5 dark:sl-ring-slate-700 focus:sl-outline-none sm:sl-text-sm\"\n :style=\"dropdownStyle\"\n >\n <ListboxOption\n v-for=\"opt in selectOptions\"\n :key=\"opt.value\"\n :value=\"opt\"\n as=\"template\"\n v-slot=\"{ active, selected }\"\n >\n <li\n :class=\"[\n 'sl-relative sl-cursor-default sl-select-none sl-py-2 sl-pl-3 sl-pr-9',\n active ? 'sl-bg-stachelock-600 sl-text-white' : 'sl-text-gray-900 dark:sl-text-slate-200'\n ]\"\n >\n <span :class=\"['sl-block sl-truncate', selected ? 'sl-font-medium' : 'sl-font-normal']\">\n {{ opt.label }}\n </span>\n <span\n v-if=\"selected\"\n class=\"sl-absolute sl-inset-y-0 sl-right-0 sl-flex sl-items-center sl-pr-4\"\n >\n <CheckIcon class=\"sl-h-5 sl-w-5\" aria-hidden=\"true\" />\n </span>\n </li>\n </ListboxOption>\n </ListboxOptions>\n </transition>\n </Teleport>\n </div>\n </Listbox>\n\n <!-- Vertical divider -->\n <div class=\"sl-w-px sl-bg-gray-200 dark:sl-bg-slate-700 sl-self-stretch\" />\n\n <!-- Text input -->\n <div class=\"sl-flex-1 sl-relative\">\n <input\n :class=\"[\n 'sl-block sl-w-full sl-text-sm focus:sl-outline-none focus:sl-ring-0 sl-border-0 sl-py-2 sl-pl-3 sl-pr-10 sl-rounded-r-md',\n 'sl-placeholder:text-gray-400 dark:sl-placeholder:text-slate-500',\n disabled \n ? 'sl-bg-gray-50 dark:sl-bg-slate-800 sl-text-gray-500 dark:sl-text-slate-400 sl-cursor-not-allowed' \n : 'sl-bg-white dark:sl-bg-slate-900 sl-text-gray-900 dark:sl-text-slate-100'\n ]\"\n :aria-invalid=\"showError || undefined\"\n :name=\"`${name}__text`\"\n :placeholder=\"text?.placeholder || ''\"\n :inputmode=\"text?.inputMode ?? 'text'\"\n :maxlength=\"text?.maxLength || undefined\"\n :value=\"localValue.text || ''\"\n @input=\"onTextChange(($event.target as HTMLInputElement).value)\"\n :disabled=\"disabled\"\n data-testid=\"text-input\"\n />\n </div>\n </div>\n </div>\n\n <!-- Error message -->\n <Transition\n enter-active-class=\"sl-transition sl-ease-out sl-duration-300\"\n enter-from-class=\"sl-opacity-0 sl-transform sl-scale-95\"\n enter-to-class=\"sl-opacity-100 sl-transform sl-scale-100\"\n leave-active-class=\"sl-transition sl-ease-in sl-duration-200\"\n leave-from-class=\"sl-opacity-100 sl-transform sl-scale-100\"\n leave-to-class=\"sl-opacity-0 sl-transform sl-scale-95\"\n >\n <p \n v-if=\"showError\"\n class=\"sl-mt-2 sl-text-sm sl-text-red-600 dark:sl-text-red-400 sl-bg-red-50 dark:sl-bg-red-900/20 sl-ring-1 sl-ring-red-100 dark:sl-ring-red-800 sl-rounded-md sl-p-2\"\n >\n {{ friendlyErrorMessage }}\n </p>\n </Transition>\n\n <!-- Display value hint -->\n <p \n v-if=\"!showError && computedDisplay\" \n class=\"sl-text-xs sl-text-gray-500 dark:sl-text-slate-400\"\n >\n {{ computedDisplay }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, reactive, toRefs, watch, onMounted, ref, onBeforeUnmount, type PropType, type Component } from 'vue'\nimport { CheckCircleIcon, ExclamationCircleIcon } from '@heroicons/vue/20/solid'\nimport { CheckIcon, ChevronUpDownIcon } from '@heroicons/vue/20/solid'\nimport {\n Listbox,\n ListboxButton,\n ListboxOption,\n ListboxOptions,\n} from '@headlessui/vue'\n\n// Refs for floating dropdown positioning\nconst listboxButtonRef = ref<InstanceType<typeof ListboxButton> | null>(null)\nconst dropdownStyle = ref<{ top: string; left: string; width: string }>({\n top: '0px',\n left: '0px',\n width: '120px'\n})\nconst dropdownOpen = ref(false)\n\nfunction updateDropdownPosition() {\n // Get the actual DOM element from the Headless UI component\n const el = listboxButtonRef.value?.$el as HTMLElement | undefined\n if (!el) return\n const rect = el.getBoundingClientRect()\n dropdownStyle.value = {\n top: `${rect.bottom + 4}px`,\n left: `${rect.left}px`,\n width: `${Math.max(rect.width, 120)}px`\n }\n}\n\nfunction onDropdownClick() {\n dropdownOpen.value = !dropdownOpen.value\n if (dropdownOpen.value) {\n updateDropdownPosition()\n }\n}\n\n// Update position on scroll/resize when dropdown is open\nfunction handleScrollOrResize() {\n if (dropdownOpen.value) {\n updateDropdownPosition()\n }\n}\n\nonMounted(() => {\n window.addEventListener('scroll', handleScrollOrResize, true)\n window.addEventListener('resize', handleScrollOrResize)\n})\n\nonBeforeUnmount(() => {\n window.removeEventListener('scroll', handleScrollOrResize, true)\n window.removeEventListener('resize', handleScrollOrResize)\n})\n\ntype SelectOption = { label: string; value: string }\n\ntype CompositeValue = {\n select?: string\n text?: string\n display?: string\n}\n\ntype CompositePropValue = CompositeValue | string | number | Record<string, unknown> | null | undefined\n\nconst YEAR_PATTERN = /\\b(19|20)\\d{2}\\b$/\n\nfunction coerceString(input: unknown): string | undefined {\n if (typeof input === 'string') {\n const trimmed = input.trim()\n return trimmed.length ? trimmed : undefined\n }\n if (typeof input === 'number') {\n const str = String(input)\n return str.length ? str : undefined\n }\n return undefined\n}\n\nfunction isCompositeLike(value: unknown): value is CompositeValue {\n return (\n !!value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n ('select' in (value as Record<string, unknown>) ||\n 'text' in (value as Record<string, unknown>) ||\n 'display' in (value as Record<string, unknown>))\n )\n}\n\nfunction hasMeaningfulComposite(value: CompositeValue): boolean {\n return !!(value.select || value.text || value.display)\n}\n\nfunction buildDisplay(select?: string, text?: string, fallback?: string): string | undefined {\n if (fallback) return fallback\n if (select && text) return `${select} ${text}`.trim()\n return select || text || undefined\n}\n\nfunction normalizeCompositeValue(rawValue: CompositePropValue): CompositeValue {\n const result: CompositeValue = {}\n\n if (rawValue === null || rawValue === undefined) return result\n\n if (typeof rawValue === 'string' || typeof rawValue === 'number') {\n const str = coerceString(rawValue)\n if (!str) return result\n\n const yearMatch = str.match(YEAR_PATTERN)\n if (yearMatch) {\n const year = yearMatch[0]\n const prefix = str.slice(0, str.length - year.length).trim()\n if (prefix) result.select = prefix\n result.text = year\n result.display = buildDisplay(result.select, result.text)\n } else {\n result.text = str\n result.display = str\n }\n return result\n }\n\n if (isCompositeLike(rawValue)) {\n const composite = rawValue as CompositeValue\n const select = coerceString(composite.select)\n const text = coerceString(composite.text)\n const display = coerceString(composite.display)\n\n if (select) result.select = select\n if (text) result.text = text\n result.display = buildDisplay(result.select, result.text, display)\n return result\n }\n\n if (typeof rawValue === 'object' && !Array.isArray(rawValue)) {\n const obj = rawValue as Record<string, unknown>\n const select =\n coerceString(obj.select) ?? coerceString(obj.term) ?? coerceString(obj.semester)\n const text =\n coerceString(obj.text) ?? coerceString(obj.year) ?? coerceString(obj.value)\n const display = coerceString(obj.display) ?? coerceString(obj.label)\n\n if (select) result.select = select\n if (text) result.text = text\n result.display = buildDisplay(result.select, result.text, display)\n return result\n }\n\n return result\n}\n\nconst props = defineProps({\n name: { type: String, required: true },\n label: { type: String, default: '' },\n tertiaryLabel: { type: String, default: '' },\n secondaryLabel: { type: String, default: '' },\n labelIconLeft: { type: [Object, Function] as PropType<Component>, default: undefined },\n value: {\n type: [Object, String, Number] as PropType<CompositePropValue>,\n default: undefined\n },\n select: {\n type: Object as PropType<{ label?: string; options: SelectOption[]; placeholder?: string }>,\n default: () => ({ options: [] })\n },\n text: {\n type: Object as PropType<{\n label?: string\n placeholder?: string\n inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'\n maxLength?: number\n }>,\n default: () => ({})\n },\n delimiter: { type: String, default: ' ' },\n formatter: { type: Function as PropType<(v: CompositeValue) => string | undefined> },\n showErrors: { type: Boolean, default: false },\n hasError: { type: Boolean, default: false },\n validateOnMount: { type: Boolean, default: false },\n textValidationRegex: { type: [RegExp, Object] as PropType<RegExp>, default: undefined },\n requiredText: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n disabledMessage: { type: String, default: '' },\n colorfulValidation: { type: Boolean, default: true },\n showValidCheck: { type: Boolean, default: true }\n})\n\nconst emit = defineEmits<{\n 'update:value': [value: CompositeValue]\n 'update:validity': [isValid: boolean]\n}>()\n\nconst initialNormalizedValue = normalizeCompositeValue(props.value)\n\nconst state = reactive({\n localValue: initialNormalizedValue\n})\n\nconst { localValue } = toRefs(state)\n\nconst shouldEmitNormalizedInitialValue = computed(\n () => hasMeaningfulComposite(initialNormalizedValue) && !isCompositeLike(props.value)\n)\n\nconst selectOptions = computed<SelectOption[]>(() => props.select?.options || [])\n\n// Find the selected option object based on localValue.select\nconst selectedOption = computed<SelectOption | null>(() => {\n if (!localValue.value.select) return null\n return selectOptions.value.find(opt => opt.value === localValue.value.select) || null\n})\n\nconst isTextInvalid = computed(() => {\n const t = localValue.value.text\n if (!props.textValidationRegex) {\n return false\n }\n if (!t || String(t).trim() === '') {\n return props.requiredText === true\n }\n return !props.textValidationRegex.test(String(t))\n})\n\nconst showError = computed(() => props.showErrors && (props.hasError || isTextInvalid.value))\nconst showSuccess = computed(\n () => props.showValidCheck && !showError.value && !!computedDisplay.value\n)\n\nconst containerRingClass = computed(() => {\n if (props.disabled) return 'sl-ring-gray-200 dark:sl-ring-slate-700'\n if (!props.colorfulValidation) return 'sl-ring-gray-300 dark:sl-ring-slate-600 focus-within:sl-ring-stachelock-600'\n if (showError.value) return 'sl-ring-red-300 dark:sl-ring-red-500 focus-within:sl-ring-stachelock-600'\n if (showSuccess.value) return 'sl-ring-green-300 dark:sl-ring-green-500 focus-within:sl-ring-stachelock-600'\n return 'sl-ring-gray-300 dark:sl-ring-slate-600 focus-within:sl-ring-stachelock-600'\n})\n\nconst computedDisplay = computed(() => {\n const raw = { select: localValue.value.select, text: localValue.value.text } as CompositeValue\n const custom = props.formatter ? props.formatter(raw) : undefined\n if (custom !== undefined) return custom\n const parts = [raw.select, raw.text].filter(Boolean)\n return parts.join(props.delimiter).trim()\n})\n\nconst friendlyErrorMessage = computed(() => {\n if (!showError.value) return ''\n const hasSelect = !!localValue.value.select\n const hasText = !!localValue.value.text && String(localValue.value.text).trim() !== ''\n const yearOk = !!localValue.value.text && /^\\d{4}$/.test(String(localValue.value.text))\n if (!hasSelect && !hasText) return 'Please select an option and enter a value.'\n if (!hasSelect) return 'Please select an option.'\n if (!hasText) return 'Please enter a value.'\n if (!yearOk && props.textValidationRegex) return 'Please enter a valid value.'\n return 'Please complete both fields.'\n})\n\nfunction emitValueAndValidity() {\n const display = computedDisplay.value || undefined\n const payload: CompositeValue = {\n select: localValue.value.select,\n text: localValue.value.text,\n display\n }\n emit('update:value', payload)\n const isValid = !!(payload.select && payload.text && String(payload.text).length > 0)\n emit('update:validity', isValid)\n}\n\nfunction onSelectChange(opt: SelectOption | null) {\n localValue.value.select = opt?.value || undefined\n dropdownOpen.value = false\n emitValueAndValidity()\n}\n\nfunction onTextChange(val: string) {\n localValue.value.text = val || undefined\n emitValueAndValidity()\n}\n\n// Sync down-prop changes\nwatch(\n () => props.value,\n (v) => {\n state.localValue = normalizeCompositeValue(v)\n },\n { deep: true }\n)\n\nonMounted(() => {\n if (shouldEmitNormalizedInitialValue.value) {\n emitValueAndValidity()\n }\n})\n\n// Validate on mount if requested\nif (props.validateOnMount) {\n emitValueAndValidity()\n}\n</script>\n\n"],"names":["listboxButtonRef","ref","dropdownStyle","dropdownOpen","updateDropdownPosition","el","rect","onDropdownClick","handleScrollOrResize","onMounted","onBeforeUnmount","YEAR_PATTERN","coerceString","input","trimmed","str","isCompositeLike","value","hasMeaningfulComposite","buildDisplay","select","text","fallback","normalizeCompositeValue","rawValue","result","yearMatch","year","prefix","composite","display","obj","props","__props","emit","__emit","initialNormalizedValue","state","reactive","localValue","toRefs","shouldEmitNormalizedInitialValue","computed","selectOptions","selectedOption","opt","isTextInvalid","t","showError","showSuccess","computedDisplay","containerRingClass","raw","custom","friendlyErrorMessage","hasSelect","hasText","yearOk","emitValueAndValidity","payload","isValid","onSelectChange","onTextChange","val","watch","v","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_createBlock","_resolveDynamicComponent","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_createVNode","_unref","ExclamationCircleIcon","_hoisted_11","CheckCircleIcon","_normalizeClass","Listbox","_hoisted_12","ListboxButton","_hoisted_13","ChevronUpDownIcon","_Teleport","_Transition","ListboxOptions","_Fragment","_renderList","ListboxOption","active","selected","_hoisted_14","CheckIcon","_hoisted_15","$event","_hoisted_17","_hoisted_18"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SidebarLayout.vue_vue_type_script_setup_true_lang-BJ5jadgZ.js","sources":["../src/components/layouts/SidebarLayout.vue"],"sourcesContent":["<template>\n <div class=\"sl-relative\">\n <!-- Mobile sidebar overlay -->\n <TransitionRoot as=\"template\" :show=\"sidebarOpen\">\n <Dialog as=\"div\" class=\"sl-relative sl-z-50 lg:sl-hidden\" @close=\"closeSidebar\">\n <TransitionChild as=\"template\" enter=\"sl-transition-opacity sl-ease-linear sl-duration-300\"\n enter-from=\"sl-opacity-0\" enter-to=\"sl-opacity-100\"\n leave=\"sl-transition-opacity sl-ease-linear sl-duration-300\" leave-from=\"sl-opacity-100\"\n leave-to=\"sl-opacity-0\">\n <div class=\"sl-fixed sl-inset-0 sl-bg-gray-900/80\" />\n </TransitionChild>\n\n <div class=\"sl-fixed sl-inset-0 sl-flex\">\n <TransitionChild as=\"template\" enter=\"sl-transition sl-ease-in-out sl-duration-300 sl-transform\"\n enter-from=\"-sl-translate-x-full\" enter-to=\"sl-translate-x-0\"\n leave=\"sl-transition sl-ease-in-out sl-duration-300 sl-transform\" leave-from=\"sl-translate-x-0\"\n leave-to=\"-sl-translate-x-full\">\n <DialogPanel class=\"sl-relative sl-mr-16 sl-flex sl-w-full sl-max-w-xs sl-flex-1\">\n <TransitionChild as=\"template\" enter=\"sl-ease-in-out sl-duration-300\" enter-from=\"sl-opacity-0\"\n enter-to=\"sl-opacity-100\" leave=\"sl-ease-in-out sl-duration-300\" leave-from=\"sl-opacity-100\"\n leave-to=\"sl-opacity-0\">\n <div class=\"sl-absolute sl-left-full sl-top-0 sl-flex sl-w-16 sl-justify-center sl-pt-5\">\n <button type=\"button\" class=\"-sl-m-2.5 sl-p-2.5\" @click=\"closeSidebar()\">\n <span class=\"sl-sr-only\">Close sidebar</span>\n <XMarkIcon class=\"sl-h-6 sl-w-6 sl-text-stachelock-050\" aria-hidden=\"true\" />\n </button>\n </div>\n </TransitionChild>\n\n <div\n class=\"sl-flex sl-grow sl-flex-col sl-gap-y-5 sl-px-6 sl-pb-2 sl-ring-1 sl-ring-white/10\"\n style=\"background-color: #dc2626;\">\n <div class=\"sl-flex sl-h-16 sl-shrink-0 sl-items-center\">\n <slot name=\"logo\">\n <div class=\"sl-font-semibold sl-text-lg\" style=\"color: #fef2f2;\">Logo</div>\n </slot>\n </div>\n <nav class=\"sl-flex sl-flex-1 sl-flex-col\">\n <ul role=\"list\" class=\"-sl-mx-2 sl-flex-1 sl-space-y-1\">\n <slot name=\"navigation\">\n <!-- Default navigation slot -->\n </slot>\n </ul>\n </nav>\n <div class=\"sl-mt-auto\">\n <slot name=\"sidebar-footer\">\n <!-- Sidebar footer content -->\n </slot>\n </div>\n </div>\n </DialogPanel>\n </TransitionChild>\n </div>\n </Dialog>\n </TransitionRoot>\n\n <!-- Desktop sidebar -->\n <div\n class=\"sl-hidden lg:sl-fixed lg:sl-inset-y-0 lg:sl-left-0 lg:sl-z-50 lg:sl-block lg:sl-pb-4 sl-pt-4\"\n style=\"background-color: #dc2626;\"\n :class=\"isWideSidebar ? 'lg:sl-w-72' : 'lg:sl-w-20'\">\n <div class=\"sl-flex sl-h-16 sl-shrink-0 sl-items-center sl-px-6\">\n <slot name=\"logo\">\n <div class=\"sl-font-semibold sl-text-lg\" style=\"color: #fef2f2;\">Logo</div>\n </slot>\n </div>\n <nav class=\"sl-mt-8 sl-flex sl-flex-col sl-justify-between sl-h-full\">\n <ul role=\"list\"\n :class=\"isWideSidebar ? 'sl-flex sl-flex-col sl-items-start sl-mx-4 sl-space-y-1' : 'sl-flex sl-flex-col sl-items-center sl-space-y-1'\">\n <slot name=\"navigation\">\n <!-- Default navigation slot -->\n </slot>\n </ul>\n <div class=\"sl-absolute sl-bottom-4 sl-left-0 sl-right-0 sl-px-6\">\n <slot name=\"sidebar-footer\">\n <!-- Sidebar footer content -->\n </slot>\n </div>\n </nav>\n </div>\n\n <!-- Main content area -->\n <div :class=\"['lg:sl-pl-20', isWideSidebar ? 'lg:sl-pl-72' : 'lg:sl-pl-20']\">\n <!-- Header -->\n <div\n class=\"sl-sticky sl-top-0 sl-z-40 sl-flex sl-h-16 sl-shrink-0 sl-items-center sl-gap-x-4 sl-border-b sl-border-gray-200 dark:sl-border-slate-700 sl-bg-white dark:sl-bg-slate-800 sl-px-4 sl-shadow-sm sm:sl-gap-x-6 sm:sl-px-6 lg:sl-px-8\">\n <button type=\"button\" class=\"-sl-m-2.5 sl-p-2.5 sl-text-gray-700 dark:sl-text-slate-300 lg:sl-hidden\" @click=\"openSidebar()\">\n <span class=\"sl-sr-only\">Open sidebar</span>\n <Bars3Icon class=\"sl-h-6 sl-w-6\" aria-hidden=\"true\" />\n </button>\n\n <!-- Separator -->\n <div class=\"sl-h-6 sl-w-px sl-bg-gray-900/10 dark:sl-bg-slate-700 lg:sl-hidden\" aria-hidden=\"true\" />\n\n <div class=\"sl-flex sl-flex-1 sl-gap-x-4 sm:sl-self-stretch lg:sl-gap-x-6\">\n <div class=\"sl-relative sl-flex sl-flex-1\">\n <slot name=\"header-content\">\n <!-- Header content -->\n </slot>\n </div>\n <div class=\"sl-flex sl-items-center sl-gap-x-4 lg:sl-gap-x-6\">\n <slot name=\"header-right\">\n <!-- Header right content (notifications, profile, etc.) -->\n </slot>\n </div>\n </div>\n </div>\n\n <!-- Main content -->\n <main class=\"sl-px-4 sm:sl-px-6 lg:sl-px-8 sl-py-6\">\n <slot name=\"main\">\n <!-- Main content slot -->\n </slot>\n </main>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport { Dialog, DialogPanel, TransitionChild, TransitionRoot } from '@headlessui/vue';\nimport { Bars3Icon, XMarkIcon } from '@heroicons/vue/24/outline';\n\ndefineProps({\n isWideSidebar: {\n type: Boolean,\n default: false\n }\n});\n\nconst sidebarOpen = ref(false);\n\nconst closeSidebar = () => {\n sidebarOpen.value = false;\n};\n\nconst openSidebar = () => {\n sidebarOpen.value = true;\n};\n</script>\n\n<style scoped></style>\n"],"names":["sidebarOpen","ref","closeSidebar","openSidebar","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","TransitionRoot","Dialog","TransitionChild","_cache","_createElementVNode","_hoisted_2","DialogPanel","_hoisted_3","XMarkIcon","_hoisted_4","_hoisted_5","_renderSlot","_ctx","_hoisted_6","_hoisted_7","_hoisted_8","_normalizeClass","__props","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","Bars3Icon","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16"],"mappings":";;;;;;;;;;;;;;;;;;;;AAkIA,UAAMA,IAAcC,EAAI,EAAK,GAEvBC,IAAe,MAAM;AACzB,MAAAF,EAAY,QAAQ;AAAA,IACtB,GAEMG,IAAc,MAAM;AACxB,MAAAH,EAAY,QAAQ;AAAA,IACtB;sBAzIEI,EAAA,GAAAC,EAkHM,OAlHNC,GAkHM;AAAA,MAhHJC,EAmDiBC,EAAAC,CAAA,GAAA;AAAA,QAnDD,IAAG;AAAA,QAAY,MAAMT,EAAA;AAAA,MAAA;mBACnC,MAiDS;AAAA,UAjDTO,EAiDSC,EAAAE,CAAA,GAAA;AAAA,YAjDD,IAAG;AAAA,YAAM,OAAM;AAAA,YAAoC,SAAOR;AAAA,UAAA;uBAChE,MAKkB;AAAA,cALlBK,EAKkBC,EAAAG,CAAA,GAAA;AAAA,gBALD,IAAG;AAAA,gBAAW,OAAM;AAAA,gBACnC,cAAW;AAAA,gBAAe,YAAS;AAAA,gBACnC,OAAM;AAAA,gBAAuD,cAAW;AAAA,gBACxE,YAAS;AAAA,cAAA;2BACT,MAAqD,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAArDC,EAAqD,OAAA,EAAhD,OAAM,wCAAA,GAAuC,MAAA,EAAA;AAAA,gBAAA;;;cAGpDA,EAwCM,OAxCNC,GAwCM;AAAA,gBAvCJP,EAsCkBC,EAAAG,CAAA,GAAA;AAAA,kBAtCD,IAAG;AAAA,kBAAW,OAAM;AAAA,kBACnC,cAAW;AAAA,kBAAuB,YAAS;AAAA,kBAC3C,OAAM;AAAA,kBAA4D,cAAW;AAAA,kBAC7E,YAAS;AAAA,gBAAA;6BACT,MAiCc;AAAA,oBAjCdJ,EAiCcC,EAAAO,CAAA,GAAA,EAjCD,OAAM,kEAA8D;AAAA,iCAC/E,MASkB;AAAA,wBATlBR,EASkBC,EAAAG,CAAA,GAAA;AAAA,0BATD,IAAG;AAAA,0BAAW,OAAM;AAAA,0BAAiC,cAAW;AAAA,0BAC/E,YAAS;AAAA,0BAAiB,OAAM;AAAA,0BAAiC,cAAW;AAAA,0BAC5E,YAAS;AAAA,wBAAA;qCACT,MAKM;AAAA,4BALNE,EAKM,OALNG,GAKM;AAAA,8BAJJH,EAGS,UAAA;AAAA,gCAHD,MAAK;AAAA,gCAAS,OAAM;AAAA,gCAAsB,gCAAOX,EAAA;AAAA,8BAAY;gCACnEU,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAC,EAA6C,QAAA,EAAvC,OAAM,aAAA,GAAa,iBAAa,EAAA;AAAA,gCACtCN,EAA6EC,EAAAS,CAAA,GAAA;AAAA,kCAAlE,OAAM;AAAA,kCAAuC,eAAY;AAAA,gCAAA;;;;;;wBAK1EJ,EAoBM,OApBNK,GAoBM;AAAA,0BAjBJL,EAIM,OAJNM,GAIM;AAAA,4BAHJC,EAEOC,sBAFP,MAEO;AAAA,8CADLR,EAA2E,OAAA;AAAA,gCAAtE,OAAM;AAAA,gCAA8B,OAAA,EAAA,OAAA,UAAA;AAAA,8BAAA,GAAwB,QAAI,EAAA;AAAA,4BAAA;;0BAGzEA,EAMM,OANNS,GAMM;AAAA,4BALJT,EAIK,MAJLU,GAIK;AAAA,8BAHHH,EAEOC,EAAA,QAAA,YAAA;AAAA,4BAAA;;0BAGXR,EAIM,OAJNW,GAIM;AAAA,4BAHJJ,EAEOC,EAAA,QAAA,gBAAA;AAAA,0BAAA;;;;;;;;;;;;;;;MAUrBR,EAsBM,OAAA;AAAA,QArBJ,OAAKY,EAAA,CAAC,gGAEEC,EAAA,gBAAa,eAAA,YAAA,CAAA;AAAA,QADrB,OAAA,EAAA,oBAAA,UAAA;AAAA,MAAA;QAEAb,EAIM,OAJNc,GAIM;AAAA,UAHJP,EAEOC,sBAFP,MAEO;AAAA,4BADLR,EAA2E,OAAA;AAAA,cAAtE,OAAM;AAAA,cAA8B,OAAA,EAAA,OAAA,UAAA;AAAA,YAAA,GAAwB,QAAI,EAAA;AAAA,UAAA;;QAGzEA,EAYM,OAZNe,GAYM;AAAA,UAXJf,EAKK,MAAA;AAAA,YALD,MAAK;AAAA,YACN,SAAOa,EAAA,gBAAa,4DAAA,kDAAA;AAAA,UAAA;YACrBN,EAEOC,EAAA,QAAA,YAAA;AAAA,UAAA;UAETR,EAIM,OAJNgB,GAIM;AAAA,YAHJT,EAEOC,EAAA,QAAA,gBAAA;AAAA,UAAA;;;MAMbR,EAgCM,OAAA;AAAA,QAhCA,yBAAuBa,EAAA,gBAAa,gBAAA,aAAA,CAAA;AAAA,MAAA;QAExCb,EAsBM,OAtBNiB,GAsBM;AAAA,UApBJjB,EAGS,UAAA;AAAA,YAHD,MAAK;AAAA,YAAS,OAAM;AAAA,YAA2E,gCAAOV,EAAA;AAAA,UAAW;YACvHS,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAC,EAA4C,QAAA,EAAtC,OAAM,aAAA,GAAa,gBAAY,EAAA;AAAA,YACrCN,EAAsDC,EAAAuB,CAAA,GAAA;AAAA,cAA3C,OAAM;AAAA,cAAgB,eAAY;AAAA,YAAA;;0BAI/ClB,EAAqG,OAAA;AAAA,YAAhG,OAAM;AAAA,YAAqE,eAAY;AAAA,UAAA;UAE5FA,EAWM,OAXNmB,GAWM;AAAA,YAVJnB,EAIM,OAJNoB,GAIM;AAAA,cAHJb,EAEOC,EAAA,QAAA,gBAAA;AAAA,YAAA;YAETR,EAIM,OAJNqB,GAIM;AAAA,cAHJd,EAEOC,EAAA,QAAA,cAAA;AAAA,YAAA;;;QAMbR,EAIO,QAJPsB,GAIO;AAAA,UAHLf,EAEOC,EAAA,QAAA,MAAA;AAAA,QAAA;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SparklineChart.vue_vue_type_script_setup_true_lang-BlNk5ZqM.js","sources":["../src/components/charts/SparklineChart.vue"],"sourcesContent":["<!--\n @component SparklineChart\n @description Mini inline sparkline chart.\n \n A compact chart for displaying trends in small spaces,\n like table cells or stat cards.\n \n @props\n - data (array, required): Array of numeric values\n - type (string, optional): Chart type - 'line' | 'bar' | 'area'\n - height (number, optional): Chart height in pixels\n - width (number|string, optional): Chart width\n - color (string, optional): Primary chart color\n - showEndpoint (boolean, optional): Show endpoint marker\n \n @example\n <SparklineChart\n :data=\"[10, 25, 15, 30, 20, 35]\"\n type=\"area\"\n :height=\"40\"\n color=\"#10b981\"\n />\n-->\n<template>\n <div :style=\"containerStyle\">\n <VChart\n v-if=\"data.length > 0\"\n :option=\"chartOption\"\n :autoresize=\"true\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport VChart from 'vue-echarts';\nimport { use } from 'echarts/core';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { LineChart, BarChart } from 'echarts/charts';\nimport { GridComponent } from 'echarts/components';\nimport { chartColors, getAreaGradient } from './chartTheme';\nimport type { EChartsOption } from 'echarts';\n\nuse([CanvasRenderer, LineChart, BarChart, GridComponent]);\n\ninterface Props {\n data: number[];\n type?: 'line' | 'bar' | 'area';\n height?: number;\n width?: number | string;\n color?: string;\n showEndpoint?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'line',\n height: 40,\n width: '100%',\n color: chartColors.primary[0],\n showEndpoint: false,\n});\n\nconst containerStyle = computed(() => ({\n height: `${props.height}px`,\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\n}));\n\nconst chartOption = computed<EChartsOption>(() => {\n const isArea = props.type === 'area';\n const isBar = props.type === 'bar';\n\n return {\n grid: {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n },\n xAxis: {\n type: 'category',\n show: false,\n data: props.data.map((_, i) => i),\n },\n yAxis: {\n type: 'value',\n show: false,\n min: 'dataMin',\n max: 'dataMax',\n },\n series: [{\n type: isBar ? 'bar' : 'line',\n data: props.data,\n smooth: !isBar,\n symbol: props.showEndpoint ? 'circle' : 'none',\n symbolSize: props.showEndpoint ? 6 : 0,\n showSymbol: props.showEndpoint,\n lineStyle: isBar ? undefined : {\n width: 2,\n color: props.color,\n },\n areaStyle: isArea ? {\n color: getAreaGradient(props.color),\n } : undefined,\n itemStyle: {\n color: props.color,\n },\n barWidth: '60%',\n }],\n };\n});\n</script>\n\n"],"names":["use","CanvasRenderer","LineChart","BarChart","GridComponent","props","__props","containerStyle","computed","chartOption","isArea","isBar","_","i","getAreaGradient","_createElementBlock","_createBlock","_unref","VChart"],"mappings":";;;;;;;;;;;;;;;;;;AA2CA,IAAAA,EAAI,CAACC,GAAgBC,GAAWC,GAAUC,CAAa,CAAC;AAWxD,UAAMC,IAAQC,GAQRC,IAAiBC,EAAS,OAAO;AAAA,MACrC,QAAQ,GAAGH,EAAM,MAAM;AAAA,MACvB,OAAO,OAAOA,EAAM,SAAU,WAAW,GAAGA,EAAM,KAAK,OAAOA,EAAM;AAAA,IAAA,EACpE,GAEII,IAAcD,EAAwB,MAAM;AAChD,YAAME,IAASL,EAAM,SAAS,QACxBM,IAAQN,EAAM,SAAS;AAE7B,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,KAAK;AAAA,UACL,QAAQ;AAAA,QAAA;AAAA,QAEV,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMA,EAAM,KAAK,IAAI,CAACO,GAAGC,MAAMA,CAAC;AAAA,QAAA;AAAA,QAElC,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN,KAAK;AAAA,UACL,KAAK;AAAA,QAAA;AAAA,QAEP,QAAQ,CAAC;AAAA,UACP,MAAMF,IAAQ,QAAQ;AAAA,UACtB,MAAMN,EAAM;AAAA,UACZ,QAAQ,CAACM;AAAA,UACT,QAAQN,EAAM,eAAe,WAAW;AAAA,UACxC,YAAYA,EAAM,eAAe,IAAI;AAAA,UACrC,YAAYA,EAAM;AAAA,UAClB,WAAWM,IAAQ,SAAY;AAAA,YAC7B,OAAO;AAAA,YACP,OAAON,EAAM;AAAA,UAAA;AAAA,UAEf,WAAWK,IAAS;AAAA,YAClB,OAAOI,EAAgBT,EAAM,KAAK;AAAA,UAAA,IAChC;AAAA,UACJ,WAAW;AAAA,YACT,OAAOA,EAAM;AAAA,UAAA;AAAA,UAEf,UAAU;AAAA,QAAA,CACX;AAAA,MAAA;AAAA,IAEL,CAAC;2BArFCU,EAMM,OAAA;AAAA,MANA,SAAOR,EAAA,KAAc;AAAA,IAAA;MAEjBD,EAAA,KAAK,SAAM,UADnBU,EAIEC,EAAAC,CAAA,GAAA;AAAA;QAFC,QAAQT,EAAA;AAAA,QACR,YAAY;AAAA,MAAA;;;;"}
@@ -1,111 +0,0 @@
1
- import { createElementBlock as l, openBlock as t, createElementVNode as s, defineComponent as x, computed as n, createCommentVNode as r, createBlock as u, resolveDynamicComponent as h, toDisplayString as c, normalizeClass as f, createVNode as k } from "vue";
2
- import { _ as w } from "./SparklineChart.vue_vue_type_script_setup_true_lang-BlNk5ZqM.js";
3
- import { chartColors as d } from "./charts/chartTheme.js";
4
- function y(e, a) {
5
- return t(), l("svg", {
6
- xmlns: "http://www.w3.org/2000/svg",
7
- viewBox: "0 0 20 20",
8
- fill: "currentColor",
9
- "aria-hidden": "true",
10
- "data-slot": "icon"
11
- }, [
12
- s("path", {
13
- "fill-rule": "evenodd",
14
- d: "M10 3a.75.75 0 0 1 .75.75v10.638l3.96-4.158a.75.75 0 1 1 1.08 1.04l-5.25 5.5a.75.75 0 0 1-1.08 0l-5.25-5.5a.75.75 0 1 1 1.08-1.04l3.96 4.158V3.75A.75.75 0 0 1 10 3Z",
15
- "clip-rule": "evenodd"
16
- })
17
- ]);
18
- }
19
- function p(e, a) {
20
- return t(), l("svg", {
21
- xmlns: "http://www.w3.org/2000/svg",
22
- viewBox: "0 0 20 20",
23
- fill: "currentColor",
24
- "aria-hidden": "true",
25
- "data-slot": "icon"
26
- }, [
27
- s("path", {
28
- "fill-rule": "evenodd",
29
- d: "M10 17a.75.75 0 0 1-.75-.75V5.612L5.29 9.77a.75.75 0 0 1-1.08-1.04l5.25-5.5a.75.75 0 0 1 1.08 0l5.25 5.5a.75.75 0 1 1-1.08 1.04l-3.96-4.158V16.25A.75.75 0 0 1 10 17Z",
30
- "clip-rule": "evenodd"
31
- })
32
- ]);
33
- }
34
- function b(e, a) {
35
- return t(), l("svg", {
36
- xmlns: "http://www.w3.org/2000/svg",
37
- viewBox: "0 0 20 20",
38
- fill: "currentColor",
39
- "aria-hidden": "true",
40
- "data-slot": "icon"
41
- }, [
42
- s("path", {
43
- "fill-rule": "evenodd",
44
- d: "M4 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H4.75A.75.75 0 0 1 4 10Z",
45
- "clip-rule": "evenodd"
46
- })
47
- ]);
48
- }
49
- const _ = { class: "sl-bg-white dark:sl-bg-slate-800 sl-rounded-xl sl-shadow-sm sl-ring-1 sl-ring-gray-900/5 dark:sl-ring-slate-700 sl-p-6" }, C = { class: "sl-flex sl-items-center sl-justify-between" }, B = { class: "sl-flex sl-items-center sl-gap-3" }, D = {
50
- key: 0,
51
- class: "sl-flex sl-items-center sl-justify-center sl-w-10 sl-h-10 sl-rounded-lg sl-bg-stachelock-50 dark:sl-bg-stachelock-900/30"
52
- }, V = { class: "sl-text-sm sl-font-medium sl-text-gray-500 dark:sl-text-slate-400" }, L = { class: "sl-mt-4" }, M = {
53
- key: 0,
54
- class: "sl-text-3xl sl-font-semibold sl-text-gray-900 dark:sl-text-white sl-tabular-nums"
55
- }, N = {
56
- key: 1,
57
- class: "sl-h-9 sl-w-24 sl-bg-gray-200 dark:sl-bg-slate-700 sl-rounded sl-animate-pulse"
58
- }, A = {
59
- key: 0,
60
- class: "sl-mt-4"
61
- }, Z = {
62
- key: 1,
63
- class: "sl-mt-2 sl-text-xs sl-text-gray-500 dark:sl-text-slate-400"
64
- }, H = /* @__PURE__ */ x({
65
- __name: "StatCard",
66
- props: {
67
- title: {},
68
- value: {},
69
- change: {},
70
- changeLabel: {},
71
- sparklineData: {},
72
- icon: {},
73
- loading: { type: Boolean, default: !1 }
74
- },
75
- setup(e) {
76
- const a = e, o = n(() => a.change !== void 0 && a.change > 0), i = n(() => a.change !== void 0 && a.change < 0), g = n(() => o.value ? "sl-text-green-600 dark:sl-text-green-400" : i.value ? "sl-text-red-600 dark:sl-text-red-400" : "sl-text-gray-500 dark:sl-text-slate-400"), v = n(() => o.value ? p : i.value ? y : b), m = n(() => o.value ? d.success : i.value ? d.danger : d.primary[0]);
77
- return ($, j) => (t(), l("div", _, [
78
- s("div", C, [
79
- s("div", B, [
80
- e.icon ? (t(), l("div", D, [
81
- (t(), u(h(e.icon), { class: "sl-h-5 sl-w-5 sl-text-stachelock-600 dark:sl-text-stachelock-400" }))
82
- ])) : r("", !0),
83
- s("p", V, c(e.title), 1)
84
- ]),
85
- e.change !== void 0 ? (t(), l("div", {
86
- key: 0,
87
- class: f(["sl-flex sl-items-center sl-gap-1 sl-text-sm sl-font-medium", g.value])
88
- }, [
89
- (t(), u(h(v.value), { class: "sl-h-4 sl-w-4" })),
90
- s("span", null, c(Math.abs(e.change)) + "%", 1)
91
- ], 2)) : r("", !0)
92
- ]),
93
- s("div", L, [
94
- e.loading ? (t(), l("div", N)) : (t(), l("p", M, c(e.value), 1))
95
- ]),
96
- e.sparklineData && e.sparklineData.length > 0 ? (t(), l("div", A, [
97
- k(w, {
98
- data: e.sparklineData,
99
- type: "area",
100
- height: 40,
101
- color: m.value
102
- }, null, 8, ["data", "color"])
103
- ])) : r("", !0),
104
- e.changeLabel ? (t(), l("p", Z, c(e.changeLabel), 1)) : r("", !0)
105
- ]));
106
- }
107
- });
108
- export {
109
- H as _
110
- };
111
- //# sourceMappingURL=StatCard.vue_vue_type_script_setup_true_lang-BfFupfmC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StatCard.vue_vue_type_script_setup_true_lang-BfFupfmC.js","sources":["../node_modules/@heroicons/vue/20/solid/esm/ArrowDownIcon.js","../node_modules/@heroicons/vue/20/solid/esm/ArrowUpIcon.js","../node_modules/@heroicons/vue/20/solid/esm/MinusIcon.js","../src/components/charts/StatCard.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M10 3a.75.75 0 0 1 .75.75v10.638l3.96-4.158a.75.75 0 1 1 1.08 1.04l-5.25 5.5a.75.75 0 0 1-1.08 0l-5.25-5.5a.75.75 0 1 1 1.08-1.04l3.96 4.158V3.75A.75.75 0 0 1 10 3Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M10 17a.75.75 0 0 1-.75-.75V5.612L5.29 9.77a.75.75 0 0 1-1.08-1.04l5.25-5.5a.75.75 0 0 1 1.08 0l5.25 5.5a.75.75 0 1 1-1.08 1.04l-3.96-4.158V16.25A.75.75 0 0 1 10 17Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M4 10a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H4.75A.75.75 0 0 1 4 10Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","<!--\n @component StatCard\n @description Stat display card with optional trend sparkline.\n \n A card component for displaying key metrics with optional\n trend indicator and sparkline chart.\n \n @props\n - title (string, required): Stat label\n - value (string|number, required): Main stat value\n - change (number, optional): Percentage change\n - changeLabel (string, optional): Change context (e.g., \"vs last month\")\n - sparklineData (array, optional): Data for sparkline\n - icon (Component, optional): Icon component\n - loading (boolean, optional): Loading state\n \n @example\n <StatCard\n title=\"Total Revenue\"\n value=\"$45,231\"\n :change=\"12.5\"\n change-label=\"vs last month\"\n :sparkline-data=\"[10, 15, 12, 20, 18, 25, 22]\"\n />\n-->\n<template>\n <div class=\"sl-bg-white dark:sl-bg-slate-800 sl-rounded-xl sl-shadow-sm sl-ring-1 sl-ring-gray-900/5 dark:sl-ring-slate-700 sl-p-6\">\n <!-- Header -->\n <div class=\"sl-flex sl-items-center sl-justify-between\">\n <div class=\"sl-flex sl-items-center sl-gap-3\">\n <div \n v-if=\"icon\" \n class=\"sl-flex sl-items-center sl-justify-center sl-w-10 sl-h-10 sl-rounded-lg sl-bg-stachelock-50 dark:sl-bg-stachelock-900/30\"\n >\n <component \n :is=\"icon\" \n class=\"sl-h-5 sl-w-5 sl-text-stachelock-600 dark:sl-text-stachelock-400\" \n />\n </div>\n <p class=\"sl-text-sm sl-font-medium sl-text-gray-500 dark:sl-text-slate-400\">\n {{ title }}\n </p>\n </div>\n \n <!-- Change indicator -->\n <div \n v-if=\"change !== undefined\" \n class=\"sl-flex sl-items-center sl-gap-1 sl-text-sm sl-font-medium\"\n :class=\"changeClasses\"\n >\n <component :is=\"changeIcon\" class=\"sl-h-4 sl-w-4\" />\n <span>{{ Math.abs(change) }}%</span>\n </div>\n </div>\n\n <!-- Value -->\n <div class=\"sl-mt-4\">\n <p \n v-if=\"!loading\" \n class=\"sl-text-3xl sl-font-semibold sl-text-gray-900 dark:sl-text-white sl-tabular-nums\"\n >\n {{ value }}\n </p>\n <div v-else class=\"sl-h-9 sl-w-24 sl-bg-gray-200 dark:sl-bg-slate-700 sl-rounded sl-animate-pulse\" />\n </div>\n\n <!-- Sparkline -->\n <div v-if=\"sparklineData && sparklineData.length > 0\" class=\"sl-mt-4\">\n <SparklineChart\n :data=\"sparklineData\"\n type=\"area\"\n :height=\"40\"\n :color=\"sparklineColor\"\n />\n </div>\n\n <!-- Change label -->\n <p \n v-if=\"changeLabel\" \n class=\"sl-mt-2 sl-text-xs sl-text-gray-500 dark:sl-text-slate-400\"\n >\n {{ changeLabel }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type Component } from 'vue';\nimport { ArrowUpIcon, ArrowDownIcon, MinusIcon } from '@heroicons/vue/20/solid';\nimport SparklineChart from './SparklineChart.vue';\nimport { chartColors } from './chartTheme';\n\ninterface Props {\n title: string;\n value: string | number;\n change?: number;\n changeLabel?: string;\n sparklineData?: number[];\n icon?: Component;\n loading?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n loading: false,\n});\n\nconst isPositive = computed(() => props.change !== undefined && props.change > 0);\nconst isNegative = computed(() => props.change !== undefined && props.change < 0);\n\nconst changeClasses = computed(() => {\n if (isPositive.value) return 'sl-text-green-600 dark:sl-text-green-400';\n if (isNegative.value) return 'sl-text-red-600 dark:sl-text-red-400';\n return 'sl-text-gray-500 dark:sl-text-slate-400';\n});\n\nconst changeIcon = computed(() => {\n if (isPositive.value) return ArrowUpIcon;\n if (isNegative.value) return ArrowDownIcon;\n return MinusIcon;\n});\n\nconst sparklineColor = computed(() => {\n if (isPositive.value) return chartColors.success;\n if (isNegative.value) return chartColors.danger;\n return chartColors.primary[0];\n});\n</script>\n\n"],"names":["render","_ctx","_cache","_openBlock","_createElementBlock","_createElementVNode","props","__props","isPositive","computed","isNegative","changeClasses","changeIcon","ArrowUpIcon","ArrowDownIcon","MinusIcon","sparklineColor","chartColors","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_createBlock","_resolveDynamicComponent","_hoisted_5","_toDisplayString","_normalizeClass","_hoisted_6","_hoisted_8","_hoisted_7","_hoisted_9","_createVNode","SparklineChart","_hoisted_10"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"StepperPanels.vue_vue_type_script_setup_true_lang-D6Fv7iz3.js","sources":["../node_modules/@heroicons/vue/24/solid/esm/CheckIcon.js","../src/components/stepper/StepperPanels.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n d: \"M19.916 4.626a.75.75 0 0 1 .208 1.04l-9 13.5a.75.75 0 0 1-1.154.114l-6-6a.75.75 0 0 1 1.06-1.06l5.353 5.353 8.493-12.74a.75.75 0 0 1 1.04-.207Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","<!--\n @component StepperPanels\n @description Visual step navigation panels for multi-step wizards.\n \n A stepper component that displays steps in a horizontal panel format\n with visual indicators for complete, current, next, and upcoming states.\n \n @props\n - steps (StepsItemType[], required): Array of step configurations\n - step (StepsItemType, optional): Currently active step\n \n @emits\n - update:value: Emitted when active step changes, payload is the new step\n \n @example\n <StepperPanels\n :steps=\"wizardSteps\"\n :step=\"currentStep\"\n @update:value=\"handleStepChange\"\n />\n-->\n<template>\n <nav aria-label=\"Progress\">\n <ol \n role=\"list\" \n class=\"sl-divide-y sl-divide-gray-300 dark:sl-divide-slate-600 sl-rounded-md sl-border sl-border-gray-300 dark:sl-border-slate-600 md:sl-flex md:sl-divide-y-0\"\n >\n <li \n v-for=\"(stepItem, stepIdx) in steps\" \n :key=\"stepItem.name\" \n class=\"sl-relative md:sl-flex md:sl-flex-1\"\n >\n <!-- Complete step -->\n <button \n v-if=\"stepItem.status === 'complete'\" \n class=\"sl-group sl-flex sl-w-full sl-items-center\"\n @click=\"handleStepUpdate(stepItem)\" \n :disabled=\"stepItem.disabled\"\n :class=\"stepItem.disabled ? 'sl-cursor-not-allowed' : 'sl-cursor-pointer'\"\n >\n <span class=\"sl-flex sl-items-center sl-px-6 sl-py-4 sl-text-sm sl-font-medium\">\n <span\n class=\"sl-flex sl-h-10 sl-w-10 sl-flex-shrink-0 sl-items-center sl-justify-center sl-rounded-full sl-bg-stachelock-600 group-hover:sl-bg-stachelock-800 sl-transition-colors\"\n >\n <CheckIcon class=\"sl-h-6 sl-w-6 sl-text-white\" aria-hidden=\"true\" />\n </span>\n <span class=\"sl-ml-4 sl-text-sm sl-font-medium sl-text-gray-800 dark:sl-text-white\">\n {{ stepItem.name }}\n </span>\n </span>\n </button>\n\n <!-- Current step -->\n <button \n v-else-if=\"stepItem.status === 'current'\" \n class=\"sl-flex sl-items-center sl-px-6 sl-py-4 sl-text-sm sl-font-medium\"\n aria-current=\"step\" \n @click=\"handleStepUpdate(stepItem)\" \n :disabled=\"stepItem.disabled\"\n :class=\"stepItem.disabled ? 'sl-cursor-not-allowed' : 'sl-cursor-pointer'\"\n >\n <span \n class=\"sl-flex sl-h-10 sl-w-10 sl-flex-shrink-0 sl-items-center sl-justify-center sl-rounded-full sl-border-2\"\n :class=\"getStepStatusClasses(stepItem)\"\n >\n <span>{{ stepItem.id }}</span>\n </span>\n <span \n class=\"sl-ml-4 sl-text-sm sl-font-medium\"\n :class=\"getStepTextClasses(stepItem)\"\n >\n {{ stepItem.name }}\n </span>\n </button>\n\n <!-- Upcoming/Next step -->\n <button \n v-else \n class=\"sl-group sl-flex sl-items-center\" \n @click=\"handleStepUpdate(stepItem)\" \n :disabled=\"stepItem.disabled\"\n :class=\"stepItem.disabled ? 'sl-cursor-not-allowed' : 'sl-cursor-pointer'\"\n >\n <span class=\"sl-flex sl-items-center sl-px-6 sl-py-4 sl-text-sm sl-font-medium\">\n <span\n class=\"sl-flex sl-h-10 sl-w-10 sl-flex-shrink-0 sl-items-center sl-justify-center sl-rounded-full sl-border-2 sl-border-gray-300 dark:sl-border-slate-500 group-hover:sl-border-gray-400 dark:group-hover:sl-border-slate-400 sl-transition-colors\"\n :class=\"{ 'sl-animate-pulse': stepItem.status === 'next' && isPreviousStepValid(stepIdx) }\"\n >\n <span class=\"sl-text-gray-500 dark:sl-text-slate-400 group-hover:sl-text-gray-800 dark:group-hover:sl-text-white\">\n {{ stepItem.id }}\n </span>\n </span>\n <span class=\"sl-ml-4 sl-text-sm sl-font-medium sl-text-gray-500 dark:sl-text-slate-400 group-hover:sl-text-gray-800 dark:group-hover:sl-text-white\">\n {{ stepItem.name }}\n </span>\n </span>\n </button>\n\n <!-- Arrow separator -->\n <template v-if=\"stepIdx !== steps.length - 1\">\n <div class=\"sl-absolute sl-right-0 sl-top-0 sl-hidden sl-h-full sl-w-5 md:sl-block\" aria-hidden=\"true\">\n <svg \n class=\"sl-h-full sl-w-full sl-text-gray-300 dark:sl-text-slate-600\" \n viewBox=\"0 0 22 80\" \n fill=\"none\"\n preserveAspectRatio=\"none\"\n >\n <path \n d=\"M0 -2L20 40L0 82\" \n vector-effect=\"non-scaling-stroke\" \n stroke=\"currentcolor\"\n stroke-linejoin=\"round\" \n />\n </svg>\n </div>\n </template>\n </li>\n </ol>\n </nav>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport { CheckIcon } from '@heroicons/vue/24/solid';\nimport type { StepsItemType } from '../../types/layouts';\n\ninterface Props {\n steps: StepsItemType[];\n step?: StepsItemType;\n}\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n 'update:value': [step: StepsItemType];\n}>();\n\nconst activeStep = ref<StepsItemType | null>(null);\n\nconst getStepStatusClasses = (stepItem: StepsItemType): string => {\n if (stepItem.valid === undefined) {\n return 'sl-border-stachelock-600 sl-text-stachelock-600 dark:sl-border-stachelock-400 dark:sl-text-stachelock-400';\n }\n if (stepItem.valid === false) {\n return 'sl-border-red-500 sl-text-red-500';\n }\n return 'sl-border-green-500 sl-text-green-500';\n};\n\nconst getStepTextClasses = (stepItem: StepsItemType): string => {\n if (stepItem.valid === undefined) {\n return 'sl-text-stachelock-600 dark:sl-text-stachelock-400';\n }\n if (stepItem.valid === false) {\n return 'sl-text-red-500';\n }\n return 'sl-text-green-500';\n};\n\nconst isPreviousStepValid = (stepIdx: number): boolean => {\n if (stepIdx <= 0) return false;\n return props.steps[stepIdx - 1]?.valid === true;\n};\n\nconst handleStepUpdate = (stepItem: StepsItemType): void => {\n if (stepItem.disabled) return;\n \n if (stepItem !== activeStep.value) {\n activeStep.value = stepItem;\n }\n};\n\n// Watch activeStep and emit changes\nwatch(() => activeStep.value, (newStep) => {\n if (newStep) {\n emit('update:value', newStep);\n }\n}, { deep: true });\n\n// Initialize active step\nwatch(() => props.steps, (newSteps) => {\n if (Array.isArray(newSteps) && newSteps.length > 0) {\n if (props.step) {\n activeStep.value = props.step;\n } else {\n // Find current step or default to first\n const currentStep = newSteps.find(s => s.status === 'current');\n activeStep.value = currentStep || newSteps[0];\n }\n }\n}, { deep: true, immediate: true });\n</script>\n\n"],"names":["render","_ctx","_cache","_openBlock","_createElementBlock","_createElementVNode","props","__props","emit","__emit","activeStep","ref","getStepStatusClasses","stepItem","getStepTextClasses","isPreviousStepValid","stepIdx","handleStepUpdate","watch","newStep","newSteps","currentStep","_hoisted_1","_hoisted_2","_Fragment","_renderList","_normalizeClass","$event","_hoisted_4","_hoisted_5","_createVNode","_unref","CheckIcon","_hoisted_6","_toDisplayString","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12"],"mappings":"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","x_google_ignoreList":[0]}