@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":"Button.js","sources":["../../src/components/UiButton.vue"],"sourcesContent":["<!--\n @component UiButton\n @description Versatile button component with theme, size, and loading support.\n \n @props\n - theme (Theme, optional): Color theme variant - 'primary', 'secondary', 'success', 'warning', 'danger', 'dark', 'light', 'ghost'\n - size (Size, optional): Button size - 'xs', 'sm', 'md', 'lg', 'xl', '2xl'\n - label (string, optional): Text label (alternative to default slot)\n - disabled (boolean, optional): Disabled state\n - expanded (boolean, optional): Full width mode\n - outlined (boolean, optional): Outlined variant\n - loading (boolean, optional): Loading state with spinner\n - leadingIcon (boolean, optional): Enable leading icon slot\n - trailingIcon (boolean, optional): Enable trailing icon slot\n - rounded (RoundedType, optional): Border radius style\n \n @emits\n - button-click: Emitted when button is clicked\n - hover-enter: Emitted on mouse enter\n - hover-leave: Emitted on mouse leave\n \n @slots\n - default: Button content/text\n - leading-icon: Icon displayed before content\n - trailing-icon: Icon displayed after content\n - badge: Badge overlay positioned top-right\n \n @example\n <UiButton theme=\"primary\" @button-click=\"handleClick\">\n Click Me\n </UiButton>\n \n @example\n <UiButton leading-icon theme=\"success\">\n <template #leading-icon><PlusIcon class=\"h-5 w-5\" /></template>\n Add Item\n </UiButton>\n-->\n<template>\n <button\n ref=\"buttonRef\"\n type=\"button\"\n :disabled=\"props.disabled\"\n :class=\"buttonClasses\"\n :style=\"buttonStyles\"\n :data-theme=\"props.theme\"\n :data-outlined=\"props.outlined || undefined\"\n @click=\"onClick\"\n @mouseenter=\"onMouseEnter\"\n @mouseleave=\"onMouseLeave\"\n >\n <!-- Leading Icon Area (or Loading Replacement) -->\n <template v-if=\"props.centerLeadingIcon && !isLabelPresent\">\n <div :class=\"leadingIconClasses\">\n <slot name=\"leading-icon\" />\n </div>\n </template>\n <template v-else>\n <div\n v-if=\"replaceLeadingIconWithLoading && loading\"\n class=\"sl-flex sl-items-center sl-justify-center\"\n :class=\"[leadingIconClasses, !isLabelPresent ? 'sl-h-full sl-w-full' : '']\"\n >\n <Loading :theme=\"loadingTheme\" :size=\"loadingSize\" />\n </div>\n <div v-else-if=\"props.leadingIcon\" :class=\"leadingIconClasses\">\n <slot name=\"leading-icon\" />\n </div>\n </template>\n\n <!-- Button Content (skip for icon-only buttons) -->\n <span\n v-if=\"isLabelPresent\"\n class=\"sl-flex-1 sl-text-center\"\n :class=\"[\n { 'sl-truncate sl-max-w-[150px]': truncateLabel },\n { 'sl-mx-auto': !props.leadingIcon && !props.trailingIcon }\n ]\"\n >\n {{ props.label }}\n </span>\n <span\n v-else-if=\"!isIconOnly && (!replaceLeadingIconWithLoading || !loading) && !props.centerLeadingIcon\"\n class=\"sl-flex\"\n :class=\"props.centerLabel || (!props.leadingIcon && !props.trailingIcon) ? 'sl-justify-center sl-items-center sl-flex-1' : 'sl-flex-1'\"\n >\n <slot />\n </span>\n\n <!-- Trailing Icon or Loading -->\n <div v-if=\"props.trailingLoading && loading\" :class=\"trailingLoadingClasses\">\n <Loading :theme=\"loadingTheme\" :size=\"props.trailingLoadingSize || 'sm'\" />\n </div>\n <div v-else-if=\"props.trailingIcon\" :class=\"trailingIconClasses\">\n <slot name=\"trailing-icon\" />\n </div>\n\n <!-- Badge Slot -->\n <div class=\"sl-absolute sl-top-0 sl-right-0 sl-transform sl-translate-x-1/2 -sl-translate-y-1/2\">\n <slot name=\"badge\" />\n </div>\n\n <!-- Overlay Loading (if not replacing the leading icon and not using trailing loading) -->\n <div\n v-if=\"loading && !replaceLeadingIconWithLoading && !props.trailingLoading\"\n class=\"sl-absolute sl-inset-0 sl-flex sl-items-center sl-justify-center sl-rounded sl-z-10\"\n :class=\"loadingOverlayClasses\"\n >\n <Loading :theme=\"loadingTheme\" :size=\"loadingSize\" />\n <p v-if=\"showLoadingTitle\" class=\"sl-ml-2\">Loading...</p>\n </div>\n </button>\n</template>\n\n<script lang=\"ts\" setup>\n/**\n * UiButton - Versatile button component with theme, size, and loading support\n * \n * A comprehensive button component supporting multiple themes, sizes, loading states,\n * and icon integration. Uses CSS variables for theming to allow brand customization.\n * \n * ## Features\n * - Multiple theme variants (primary, secondary, success, warning, danger, etc.)\n * - Size options from xs to 2xl\n * - Outlined variant for secondary actions\n * - Loading states with overlay, trailing, or leading replacement options\n * - Leading and trailing icon slots\n * - Badge slot for notifications\n * - Auto-contrast for background adaptation\n * \n * ## Usage\n * ```vue\n * <UiButton theme=\"primary\" size=\"md\" @button-click=\"handleClick\">\n * Click Me\n * </UiButton>\n * \n * <UiButton leading-icon :loading=\"isLoading\">\n * <template #leading-icon><PlusIcon /></template>\n * Add Item\n * </UiButton>\n * ```\n * \n * ## Props\n * | Prop | Type | Default | Description |\n * |------|------|---------|-------------|\n * | theme | Theme | 'primary' | Color theme variant |\n * | size | Size | 'md' | Button size |\n * | label | string | - | Text label (alternative to slot) |\n * | disabled | boolean | false | Disabled state |\n * | loading | boolean | false | Loading state |\n * | outlined | boolean | false | Outlined variant |\n * | expanded | boolean | false | Full width |\n * \n * ## Events\n * | Event | Payload | Description |\n * |-------|---------|-------------|\n * | button-click | void | Emitted on button click |\n * | hover-enter | void | Emitted on mouse enter |\n * | hover-leave | void | Emitted on mouse leave |\n * \n * ## Slots\n * | Slot | Description |\n * |------|-------------|\n * | default | Button content |\n * | leading-icon | Icon before content |\n * | trailing-icon | Icon after content |\n * | badge | Badge overlay (positioned top-right) |\n * \n * @module components/UiButton\n * @see {@link ButtonType} for prop interface\n */\nimport { computed, defineAsyncComponent, ref, onMounted, watch, nextTick } from 'vue';\nimport type { ButtonType } from '../types/ui';\nimport type { RoundedType, Theme } from '../types/core';\n\n// Asynchronously load the Loading component\nconst Loading = defineAsyncComponent(() => import('./UiLoading.vue'));\n\n// Define props using the ButtonType interface\ninterface ButtonProps extends ButtonType {\n replaceLeadingIconWithLoading?: boolean;\n centerLeadingIcon?: boolean;\n /**\n * When enabled, shows loading indicator in trailing position instead of overlay\n */\n trailingLoading?: boolean;\n /**\n * Size of the loading indicator when using trailingLoading\n */\n trailingLoadingSize?: import('../types/core').Size;\n /**\n * Positions trailing loading/icon absolutely at the far right, centered vertically.\n */\n trailingOverlay?: boolean;\n /**\n * When enabled the button will attempt to automatically choose a contrasting\n * colour theme if its background matches that of its closest non-transparent\n * ancestor.\n */\n autoContrast?: boolean;\n}\n\nconst props = withDefaults(defineProps<ButtonProps>(), {\n theme: 'primary',\n size: 'md',\n rounded: 'rounded-md',\n disabled: false,\n expanded: false,\n outlined: false,\n loading: false,\n leadingIcon: false,\n trailingIcon: false,\n showLoadingTitle: false,\n truncateLabel: false,\n centerLabel: false,\n inlineFlex: false,\n replaceLeadingIconWithLoading: false,\n centerLeadingIcon: false,\n trailingLoading: false,\n trailingOverlay: false,\n autoContrast: false,\n});\n\n// Define the emits\nconst emit = defineEmits<{\n 'button-click': []\n 'hover-enter': []\n 'hover-leave': []\n}>();\n\n// Reactive computed properties\nconst loading = computed(() => Boolean(props.loading));\nconst replaceLeadingIconWithLoading = computed(() => props.replaceLeadingIconWithLoading || false);\n\n// Reference to the underlying button element\nconst buttonRef = ref<HTMLElement | null>(null);\n\n// Internal reactive theme value that may be overridden for auto-contrast\nconst resolvedTheme = ref<Theme>(props.theme ?? 'primary');\n\nconst findParentBackground = (node: HTMLElement | null): string | null => {\n while (node && node !== document.documentElement) {\n const bg = window.getComputedStyle(node).backgroundColor;\n if (bg && bg !== 'rgba(0, 0, 0, 0)' && bg !== 'transparent') {\n return bg;\n }\n node = node.parentElement as HTMLElement | null;\n }\n return null;\n};\n\nconst adjustThemeBasedOnBackground = (): void => {\n if (!props.autoContrast) return;\n const el = buttonRef.value;\n if (!el) return;\n\n const parentBg = findParentBackground(el.parentElement as HTMLElement | null);\n if (!parentBg) return;\n\n const buttonBg = window.getComputedStyle(el).backgroundColor;\n\n if (buttonBg === parentBg) {\n resolvedTheme.value = resolvedTheme.value === 'light' ? 'primary' : 'light';\n }\n};\n\nonMounted(() => {\n nextTick(adjustThemeBasedOnBackground);\n});\n\nwatch(\n () => props.theme,\n (newTheme) => {\n resolvedTheme.value = newTheme || 'primary';\n nextTick(adjustThemeBasedOnBackground);\n },\n { immediate: false }\n);\n\n// Public computed theme\nconst theme = computed(() => resolvedTheme.value);\n\n// Compute loading size with fallback\nconst loadingSize = computed(() => props.loadingSize || props.size || 'md');\n\n// Determine loading theme based on button theme for proper contrast\nconst loadingTheme = computed(() => {\n // For filled buttons with dark backgrounds, use light/white spinner\n const darkBgThemes = ['primary', 'dark', 'danger', 'success', 'warning'];\n if (!props.outlined && darkBgThemes.includes(theme.value)) {\n return 'light'; // Light spinner on dark background\n }\n // For outlined or light buttons, use the button's theme color\n return theme.value;\n});\n\n// Loading overlay classes based on button theme\nconst loadingOverlayClasses = computed(() => {\n // For filled dark buttons, use semi-transparent dark overlay\n const darkBgThemes = ['primary', 'dark', 'danger', 'success', 'warning'];\n if (!props.outlined && darkBgThemes.includes(theme.value)) {\n return 'sl-bg-black/20';\n }\n // For light/outlined buttons, use semi-transparent white/dark overlay\n return 'sl-bg-white/75 dark:sl-bg-slate-900/75';\n});\n\n// Styling computed properties\nconst colorClass = computed(() => {\n const outlineBaseClasses: Record<string, string> = {\n primary: 'sl-text-stachelock-600 dark:sl-text-stachelock-400 sl-border sl-border-stachelock-600 dark:sl-border-stachelock-500 hover:sl-bg-stachelock-50 dark:hover:sl-bg-stachelock-900/30 hover:sl-border-stachelock-400 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-stachelock-300 dark:focus:sl-ring-stachelock-600 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n dark: 'sl-text-gray-700 dark:sl-text-gray-300 sl-border sl-border-gray-700 dark:sl-border-gray-500 hover:sl-bg-gray-50 dark:hover:sl-bg-gray-800 hover:sl-border-gray-800 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-gray-300 dark:focus:sl-ring-gray-600 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n secondary: 'sl-text-gray-800 dark:sl-text-gray-200 sl-border sl-border-gray-300 dark:sl-border-slate-600 hover:sl-bg-gray-100 dark:hover:sl-bg-slate-700 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-gray-300 dark:focus:sl-ring-slate-500 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n light: 'sl-text-gray-800 dark:sl-text-gray-200 sl-border sl-border-gray-300 dark:sl-border-slate-600 hover:sl-bg-gray-100 dark:hover:sl-bg-slate-700 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-gray-300 dark:focus:sl-ring-slate-500 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n warning: 'sl-text-yellow-500 dark:sl-text-yellow-400 sl-border sl-border-yellow-500 dark:sl-border-yellow-500 hover:sl-bg-yellow-50 dark:hover:sl-bg-yellow-900/20 hover:sl-border-yellow-400 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-yellow-300 dark:focus:sl-ring-yellow-600 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n danger: 'sl-text-red-500 dark:sl-text-red-400 sl-border sl-border-red-500 dark:sl-border-red-500 hover:sl-bg-red-50 dark:hover:sl-bg-red-900/20 hover:sl-border-red-400 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-red-300 dark:focus:sl-ring-red-600 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n success: 'sl-text-green-500 dark:sl-text-green-400 sl-border sl-border-green-500 dark:sl-border-green-500 hover:sl-bg-green-50 dark:hover:sl-bg-green-900/20 hover:sl-border-green-400 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-green-300 dark:focus:sl-ring-green-600 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n ghost: 'sl-text-gray-800 dark:sl-text-gray-200 sl-border sl-border-transparent sl-bg-transparent hover:sl-text-gray-700 dark:hover:sl-text-white hover:sl-bg-gray-100 dark:hover:sl-bg-slate-700 focus:sl-outline-none',\n };\n\n const filledBaseClasses: Record<string, string> = {\n primary: 'sl-border sl-border-transparent sl-text-white sl-shadow-sm focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n dark: 'sl-border sl-border-transparent sl-bg-gray-700 dark:sl-bg-gray-600 sl-text-white sl-shadow-sm hover:sl-bg-gray-800 dark:hover:sl-bg-gray-500 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-gray-500 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n secondary: 'sl-text-gray-800 dark:sl-text-gray-200 sl-bg-gray-200 dark:sl-bg-slate-700 hover:sl-bg-gray-100 dark:hover:sl-bg-slate-600 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-gray-300 dark:focus:sl-ring-slate-500 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900 sl-border sl-border-gray-300 dark:sl-border-slate-600',\n light: 'sl-text-gray-800 dark:sl-text-gray-200 sl-bg-gray-200 dark:sl-bg-slate-700 hover:sl-bg-gray-100 dark:hover:sl-bg-slate-600 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-gray-300 dark:focus:sl-ring-slate-500 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900 sl-border sl-border-gray-300 dark:sl-border-slate-600',\n warning: 'sl-border sl-border-transparent sl-bg-yellow-400 dark:sl-bg-yellow-500 sl-text-white sl-shadow-sm hover:sl-bg-yellow-600 dark:hover:sl-bg-yellow-600 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-yellow-400 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n danger: 'sl-border sl-border-transparent sl-bg-red-500 dark:sl-bg-red-600 sl-text-white sl-shadow-sm hover:sl-bg-red-600 dark:hover:sl-bg-red-700 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-red-400 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n success: 'sl-border sl-border-transparent sl-bg-green-500 dark:sl-bg-green-600 sl-text-white sl-shadow-sm hover:sl-bg-green-600 dark:hover:sl-bg-green-700 focus:sl-outline-none focus:sl-ring-2 focus:sl-ring-green-400 focus:sl-ring-offset-2 focus:sl-ring-offset-white dark:focus:sl-ring-offset-slate-900',\n ghost: 'sl-border sl-border-transparent sl-text-gray-800 dark:sl-text-gray-200 sl-bg-transparent hover:sl-text-gray-700 dark:hover:sl-text-white hover:sl-bg-gray-100 dark:hover:sl-bg-slate-700 focus:sl-outline-none',\n };\n\n if (props.outlined) {\n return `${outlineBaseClasses[theme.value] || ''} sl-bg-transparent dark:sl-bg-transparent`;\n } else {\n return filledBaseClasses[theme.value] || '';\n }\n});\n\nconst roundedClassMap: Record<RoundedType, string> = {\n square: '',\n rounded: 'sl-rounded',\n 'rounded-md': 'sl-rounded-md',\n 'rounded-lg': 'sl-rounded-lg',\n 'rounded-full': 'sl-rounded-full',\n};\n\nconst roundedClass = computed(() => roundedClassMap[props.rounded || 'rounded-md']);\n\n// Separate horizontal and vertical padding for better control\nconst sizeClass = computed(() => {\n const sizeMapping: Record<string, string> = {\n xs: 'sl-px-2 sl-py-1',\n sm: 'sl-px-2.5 sl-py-1.5',\n md: 'sl-px-3 sl-py-1.5',\n lg: 'sl-px-4 sl-py-2',\n xl: 'sl-px-5 sl-py-2.5',\n '2xl': 'sl-px-6 sl-py-3',\n };\n return sizeMapping[props.size || 'md'];\n});\n\nconst textClass = computed(() => {\n const textMapping: Record<string, string> = {\n xs: 'sl-text-xs sl-font-regular',\n sm: 'sl-text-sm sl-font-regular',\n md: 'sl-text-base sl-font-medium',\n lg: 'sl-text-lg sl-font-medium',\n xl: 'sl-text-xl sl-font-medium',\n '2xl': 'sl-text-2xl sl-font-medium',\n };\n return textMapping[props.size || 'sm'];\n});\n\nconst expandedClass = computed(() => (props.expanded ? 'sl-w-full' : ''));\n\nconst isLabelPresent = computed(() => !!props.label && props.label.length > 0);\n\n// Determine if this is an icon-only button (leading/trailing icon with no label)\nconst isIconOnly = computed(() => {\n return !isLabelPresent.value && (props.leadingIcon || props.trailingIcon);\n});\n\nconst buttonClasses = computed(() => {\n if (props.customClass) {\n return props.customClass;\n }\n\n const coreClasses = [\n roundedClass.value,\n sizeClass.value,\n textClass.value,\n expandedClass.value,\n colorClass.value,\n props.disabled ? 'sl-cursor-not-allowed' : 'sl-cursor-pointer',\n 'focus:sl-ring-0',\n 'sl-relative',\n 'sl-flex',\n 'sl-items-center',\n 'sl-justify-center',\n 'sl-gap-2', // Consistent spacing between icon and text\n ];\n\n const finalClasses = [...coreClasses];\n\n // For icon-only buttons (no label/text), use equal padding for square proportions\n if (!isLabelPresent.value && (props.leadingIcon || props.trailingIcon)) {\n // Size-aware square padding for icon-only buttons\n const iconOnlyPadding: Record<string, string> = {\n xs: '!sl-p-1.5',\n sm: '!sl-p-2',\n md: '!sl-p-2.5',\n lg: '!sl-p-3',\n xl: '!sl-p-3.5',\n '2xl': '!sl-p-4',\n };\n finalClasses.push(iconOnlyPadding[props.size || 'md'] || '!sl-p-2.5');\n }\n\n if (props.centerLeadingIcon && !isLabelPresent.value) {\n finalClasses.push('sl-w-full', 'sl-h-full');\n } else {\n if (props.leadingIcon || props.inlineFlex || props.trailingIcon) {\n finalClasses.push('sl-inline-flex');\n }\n }\n\n return finalClasses.filter(Boolean);\n});\n\nconst buttonStyles = computed(() => {\n if (props.theme === 'primary') {\n // Only apply background color for filled primary buttons, not outlined\n if (props.outlined) {\n return {\n color: 'var(--sl-color-primary-600, #3e4b9a)',\n borderColor: 'var(--sl-color-primary-600, #3e4b9a)',\n '--tw-ring-color': 'var(--sl-color-primary-500, #4d5ec0)',\n };\n }\n return {\n backgroundColor: 'var(--sl-color-primary-600, #3e4b9a)',\n '--tw-ring-color': 'var(--sl-color-primary-500, #4d5ec0)',\n };\n }\n return {};\n});\n\n// Gap on parent handles spacing, no margins needed\nconst trailingBaseClasses = 'sl-flex sl-items-center sl-flex-shrink-0';\nconst trailingAbsoluteClasses = 'sl-absolute sl-right-2 sl-top-1/2 -sl-translate-y-1/2 sl-flex sl-items-center sl-flex-shrink-0';\nconst trailingLoadingClasses = computed(() => props.trailingOverlay ? trailingAbsoluteClasses : trailingBaseClasses);\nconst trailingIconClasses = computed(() => props.trailingOverlay ? `${trailingAbsoluteClasses}` : 'sl-flex sl-items-center sl-flex-shrink-0');\n\nconst leadingIconClasses = computed(() => {\n if (props.centerLeadingIcon && !isLabelPresent.value) {\n return 'sl-absolute sl-inset-0 sl-flex sl-items-center sl-justify-center sl-w-full sl-h-full';\n }\n if (props.centerLeadingIcon) {\n return 'sl-h-full sl-flex sl-items-center sl-justify-center';\n }\n if (!isLabelPresent.value) {\n return 'sl-flex sl-items-center sl-justify-center';\n }\n // Gap on parent handles spacing\n return 'sl-flex sl-items-center sl-justify-center sl-flex-shrink-0';\n});\n\nconst onClick = (): void => {\n emit('button-click');\n};\n\nconst onMouseEnter = (): void => {\n emit('hover-enter');\n};\n\nconst onMouseLeave = (): void => {\n emit('hover-leave');\n};\n\nconst showLoadingTitle = props.showLoadingTitle || false;\n</script>\n\n<style scoped>\n/* Filled primary button hover */\nbutton[data-theme=\"primary\"]:not([data-outlined]):hover {\n background-color: var(--sl-color-primary-700, #2e3873) !important;\n}\n\n/* Outlined primary button hover - subtle background */\nbutton[data-theme=\"primary\"][data-outlined]:hover {\n background-color: rgb(var(--sl-color-primary-50-rgb, 237 239 249) / 0.5) !important;\n}\n\n/* Dark mode: Outlined primary button hover */\n:global(.dark) button[data-theme=\"primary\"][data-outlined]:hover {\n background-color: rgb(var(--sl-color-primary-900-rgb, 15 19 38) / 0.3) !important;\n}\n</style>\n\n\n"],"names":["trailingBaseClasses","trailingAbsoluteClasses","Loading","defineAsyncComponent","props","__props","emit","__emit","loading","computed","replaceLeadingIconWithLoading","buttonRef","ref","resolvedTheme","findParentBackground","node","bg","adjustThemeBasedOnBackground","el","parentBg","onMounted","nextTick","watch","newTheme","theme","loadingSize","loadingTheme","darkBgThemes","loadingOverlayClasses","colorClass","outlineBaseClasses","filledBaseClasses","roundedClassMap","roundedClass","sizeClass","textClass","expandedClass","isLabelPresent","isIconOnly","buttonClasses","finalClasses","iconOnlyPadding","buttonStyles","trailingLoadingClasses","trailingIconClasses","leadingIconClasses","onClick","onMouseEnter","onMouseLeave","showLoadingTitle","_createElementBlock","_renderSlot","_ctx","_Fragment","_normalizeClass","_createVNode","_unref","_toDisplayString","_createElementVNode","_hoisted_2","_hoisted_3"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ButtonGroup.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Checkbox.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CloudinaryImage.js","sources":["../../node_modules/@heroicons/vue/20/solid/esm/PhotoIcon.js","../../node_modules/@heroicons/vue/20/solid/esm/UserCircleIcon.js","../../src/components/CloudinaryImage.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: \"M1 5.25A2.25 2.25 0 0 1 3.25 3h13.5A2.25 2.25 0 0 1 19 5.25v9.5A2.25 2.25 0 0 1 16.75 17H3.25A2.25 2.25 0 0 1 1 14.75v-9.5Zm1.5 5.81v3.69c0 .414.336.75.75.75h13.5a.75.75 0 0 0 .75-.75v-2.69l-2.22-2.219a.75.75 0 0 0-1.06 0l-1.91 1.909.47.47a.75.75 0 1 1-1.06 1.06L6.53 8.091a.75.75 0 0 0-1.06 0l-2.97 2.97ZM12 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\",\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: \"M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-5.5-2.5a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0ZM10 12a5.99 5.99 0 0 0-4.793 2.39A6.483 6.483 0 0 0 10 16.5a6.483 6.483 0 0 0 4.793-2.11A5.99 5.99 0 0 0 10 12Z\",\n \"clip-rule\": \"evenodd\"\n })\n ]))\n}","<!--\n @component CloudinaryImage\n @description Cloudinary image component with loading states and fallbacks.\n \n Displays images from Cloudinary with automatic transformations, loading\n skeleton, error fallback, and flexible sizing options.\n \n @props\n - src (string, optional): Direct image URL (bypasses Cloudinary URL generation)\n - publicId (string, optional): Cloudinary public ID\n - imagePublicId (string, optional): Alias for publicId (for compatibility)\n - asset (CloudinaryAsset, optional): Full asset object with transformations\n - fallbackPublicId (string, optional): Fallback image public ID\n - transformations (array, optional): Additional Cloudinary transformations\n - alt (string, optional): Alt text for accessibility\n - aspectRatio (string|number, optional): Aspect ratio (e.g., '16/9')\n - width (string|number, optional): Width in pixels or 'auto'\n - height (string|number, optional): Height in pixels or 'auto'\n - quality (string|number, optional): Image quality (1-100 or 'auto')\n - skeleton (string, optional): Skeleton type - 'user' or 'photo'\n - pulse (boolean, optional): Animate skeleton\n \n @emits\n - update:imageLoaded: Emitted when image load state changes\n - error: Emitted on image load error\n \n @example Using direct URL\n ```vue\n &lt;CloudinaryImage\n src=\"https://res.cloudinary.com/demo/image/upload/sample.jpg\"\n :width=\"200\"\n :height=\"200\"\n alt=\"Sample image\"\n /&gt;\n ```\n \n @example Using public ID with auto-generated URL\n ```vue\n &lt;CloudinaryImage\n public-id=\"avatars/user123\"\n :width=\"200\"\n :height=\"200\"\n alt=\"User avatar\"\n skeleton=\"user\"\n /&gt;\n ```\n-->\n<template>\n <div :style=\"computedDivStyle\" :class=\"computedDivClass\">\n <!-- Loading skeleton -->\n <div v-show=\"!imageLoaded && !imageError\" class=\"sl-flex sl-h-full sl-w-full sl-items-center sl-justify-center\">\n <div role=\"status\" :class=\"[{ 'sl-animate-pulse': pulse }]\">\n <component :is=\"skeletonComponent\" :class=\"computedSkeletonClass\" />\n </div>\n </div>\n\n <!-- Error fallback -->\n <div v-show=\"imageError && !imageLoaded\" class=\"sl-flex sl-h-full sl-w-full sl-items-center sl-justify-center\">\n <component :is=\"skeletonComponent\" :class=\"computedFallbackClass\" />\n </div>\n\n <!-- Image -->\n <div v-if=\"computedImg && isMounted\" v-show=\"imageLoaded\" class=\"sl-h-full sl-w-full\">\n <img\n :src=\"computedImg\"\n :alt=\"alt\"\n @load=\"onImageLoad\"\n @error=\"onImageError\"\n :class=\"computedImageClass\"\n :style=\"computedImageStyle\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * CloudinaryImage - Image component with Cloudinary CDN support\n * \n * Provides a comprehensive image component with loading states, error handling,\n * and Cloudinary transformations. Uses plugin configuration for Cloudinary setup.\n * \n * ## Features\n * - Automatic loading skeleton\n * - Error fallback display\n * - Cloudinary URL generation\n * - Responsive sizing\n * - Aspect ratio control\n * - Quality optimization\n * \n * ## Plugin Configuration\n * Configure Cloudinary in your app setup:\n * ```typescript\n * app.use(StachelockUI, {\n * cloudinary: {\n * cloudName: 'your-cloud-name',\n * defaultTransformations: [...]\n * }\n * })\n * ```\n * \n * @module components/CloudinaryImage\n * @see {@link CloudinaryImageProps} for prop interface\n */\nimport { UserCircleIcon, PhotoIcon } from '@heroicons/vue/20/solid';\nimport { computed, inject, onMounted, onUnmounted, ref, watch } from 'vue';\nimport type { PropType } from 'vue';\nimport type { CloudinaryAsset, CloudinaryTransformationStep } from '../types/core';\n\n// Plugin configuration injection\nconst cloudinaryConfig = inject<{\n cloudName?: string;\n baseUrl?: string;\n defaultTransformations?: CloudinaryTransformationStep[];\n}>('cloudinary', {});\n\ninterface CustomClasses {\n div?: Record<string, boolean>;\n skeleton?: Record<string, boolean>;\n image?: Record<string, boolean>;\n fallback?: Record<string, boolean>;\n}\n\n// State\nconst imageLoaded = ref(false);\nconst imageError = ref(false);\nconst isMounted = ref(true);\n\nconst emit = defineEmits<{\n 'update:imageLoaded': [value: boolean];\n 'error': [error: unknown];\n}>();\n\nconst props = defineProps({\n /** Direct image URL - bypasses Cloudinary URL generation */\n src: {\n type: String,\n required: false,\n default: null\n },\n /** Cloudinary public ID */\n publicId: {\n type: String,\n required: false,\n default: null\n },\n /** Alias for publicId (for compatibility with different naming conventions) */\n imagePublicId: {\n type: String,\n required: false,\n default: null\n },\n asset: {\n type: Object as PropType<CloudinaryAsset | null>,\n default: null,\n required: false\n },\n fallbackPublicId: {\n type: String,\n required: false,\n default: null\n },\n /** Fallback URL to use if primary image fails */\n fallbackSrc: {\n type: String,\n required: false,\n default: null\n },\n transformations: {\n type: Array as PropType<Array<(image: unknown) => void>>,\n default: () => []\n },\n alt: {\n type: String,\n default: ''\n },\n aspectRatio: {\n type: [String, Number] as PropType<string | number>,\n default: null\n },\n width: {\n type: [String, Number] as PropType<string | number>,\n default: 64\n },\n height: {\n type: [String, Number] as PropType<string | number>,\n default: 64\n },\n quality: {\n type: [String, Number],\n default: '90'\n },\n devicePixelRatio: {\n type: String,\n default: '2.0'\n },\n skeleton: {\n type: String as PropType<'user' | 'photo'>,\n default: 'photo'\n },\n pulse: {\n type: Boolean,\n default: true\n },\n customClasses: {\n type: Object as PropType<CustomClasses>,\n default: () => ({})\n }\n});\n\n/**\n * Helper to check if a string is a full URL\n */\nconst isFullUrl = (value: string | null | undefined): boolean => {\n if (!value) return false;\n return value.startsWith('http://') || value.startsWith('https://') || value.startsWith('//');\n};\n\n// Computed: Direct URL source (if provided)\nconst directSrc = computed(() => {\n // Check src prop first\n if (props.src && isFullUrl(props.src)) {\n return props.src;\n }\n \n // Check if asset has secure_url or url\n if (props.asset?.secure_url) {\n return props.asset.secure_url;\n }\n if ((props.asset as any)?.url) {\n return (props.asset as any).url;\n }\n \n // Check if publicId or imagePublicId is actually a full URL\n if (props.publicId && isFullUrl(props.publicId)) {\n return props.publicId;\n }\n if (props.imagePublicId && isFullUrl(props.imagePublicId)) {\n return props.imagePublicId;\n }\n \n return null;\n});\n\n// Computed: Effective public ID (when not using direct URL)\nconst effectivePublicId = computed(() => {\n // If we have a direct URL, we don't need a public ID\n if (directSrc.value) return null;\n \n if (props.asset?.public_id) {\n return props.asset.public_id;\n }\n return props.imagePublicId || props.publicId || props.fallbackPublicId || null;\n});\n\n// Computed: Generate Cloudinary URL from public ID\nconst generatedCloudinaryUrl = computed(() => {\n if (!effectivePublicId.value) return null;\n \n const cloudName = cloudinaryConfig?.cloudName || 'demo';\n const baseUrl = cloudinaryConfig?.baseUrl || `https://res.cloudinary.com/${cloudName}/image/upload`;\n \n // Build transformation string\n const transformations: string[] = [];\n \n // Add width/height\n if (props.width && props.width !== 'auto') {\n transformations.push(`w_${props.width}`);\n }\n if (props.height && props.height !== 'auto') {\n transformations.push(`h_${props.height}`);\n }\n \n // Add quality\n if (props.quality) {\n transformations.push(`q_${props.quality}`);\n }\n \n // Add DPR\n if (props.devicePixelRatio) {\n transformations.push(`dpr_${props.devicePixelRatio}`);\n }\n \n // Auto format\n transformations.push('f_auto');\n \n // Crop mode\n transformations.push('c_fill');\n \n const transformString = transformations.join(',');\n \n return `${baseUrl}/${transformString}/${effectivePublicId.value}`;\n});\n\n// Computed: Final image URL (prefers direct URL over generated)\nconst computedImg = computed(() => {\n // Use direct URL if available\n if (directSrc.value) {\n return directSrc.value;\n }\n \n // Otherwise use generated Cloudinary URL\n return generatedCloudinaryUrl.value;\n});\n\n// Skeleton component based on type\nconst skeletonComponent = computed(() => {\n return props.skeleton === 'user' ? UserCircleIcon : PhotoIcon;\n});\n\n// Style computations\nconst computedDivStyle = computed(() => {\n const style: Record<string, string> = {};\n \n if (props.width && props.width !== 'auto') {\n style.width = typeof props.width === 'number' ? `${props.width}px` : props.width;\n }\n if (props.height && props.height !== 'auto') {\n style.height = typeof props.height === 'number' ? `${props.height}px` : props.height;\n }\n if (props.aspectRatio) {\n style.aspectRatio = String(props.aspectRatio);\n }\n \n return style;\n});\n\nconst computedDivClass = computed(() => ({\n 'sl-relative sl-overflow-hidden': true,\n ...props.customClasses?.div\n}));\n\nconst computedSkeletonClass = computed(() => ({\n 'sl-h-full sl-w-full sl-text-gray-200': true,\n ...props.customClasses?.skeleton\n}));\n\nconst computedFallbackClass = computed(() => ({\n 'sl-h-full sl-w-full sl-text-gray-300': true,\n ...props.customClasses?.fallback\n}));\n\nconst computedImageClass = computed(() => ({\n 'sl-h-full sl-w-full sl-object-cover': true,\n ...props.customClasses?.image\n}));\n\nconst computedImageStyle = computed(() => ({\n objectFit: 'cover' as const,\n}));\n\n// Event handlers\nconst onImageLoad = () => {\n imageLoaded.value = true;\n imageError.value = false;\n emit('update:imageLoaded', true);\n};\n\nconst onImageError = (error: Event) => {\n if (!isMounted.value) return;\n \n imageError.value = true;\n imageLoaded.value = false;\n emit('error', error);\n};\n\n// Reset state when source changes\nwatch(\n () => computedImg.value,\n () => {\n imageLoaded.value = false;\n imageError.value = false;\n }\n);\n\n// Lifecycle\nonMounted(() => {\n isMounted.value = true;\n});\n\nonUnmounted(() => {\n isMounted.value = false;\n});\n</script>\n\n<style scoped>\n/* Prevent layout shift */\n[data-loading=\"true\"] {\n min-height: 20px;\n}\n</style>\n\n"],"names":["render","_ctx","_cache","_openBlock","_createElementBlock","_createElementVNode","cloudinaryConfig","inject","imageLoaded","ref","imageError","isMounted","emit","__emit","props","__props","isFullUrl","value","directSrc","computed","effectivePublicId","generatedCloudinaryUrl","cloudName","baseUrl","transformations","transformString","computedImg","skeletonComponent","UserCircleIcon","PhotoIcon","computedDivStyle","style","computedDivClass","computedSkeletonClass","computedFallbackClass","computedImageClass","computedImageStyle","onImageLoad","onImageError","error","watch","onMounted","onUnmounted","_withDirectives","_hoisted_1","_createBlock","_resolveDynamicComponent","_vShow","_hoisted_2","_hoisted_3"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Loading.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LoadingDots.js","sources":["../../src/components/UiLoadingDots.vue"],"sourcesContent":["<template>\n <div v-if=\"title && subtitle && caption\" class=\"sl-bg-white sl-px-6 sl-py-24 sm:sl-py-32 lg:sl-px-8\">\n <div class=\"sl-mx-auto sl-max-w-2xl sl-text-center\">\n <p class=\"sl-text-base sl-font-semibold sl-leading-7\" style=\"color: var(--sl-color-primary-600, #3e4b9a);\">{{ caption }}</p>\n <h2 class=\"sl-mt-2 sl-text-4xl sl-font-bold sl-tracking-tight sl-text-gray-900 sm:sl-text-6xl\">{{ title }}</h2>\n <div class=\"sl-flex sl-justify-center sl-mt-6\">\n <div class=\"loader-dots\" :class=\"dotSizeClass\">\n <div v-for=\"n in 4\" :key=\"n\" class=\"dots-div\" :style=\"{ backgroundColor }\"></div>\n </div>\n </div>\n <p class=\"sl-mt-6 sl-text-lg sl-leading-8 sl-text-gray-600\">{{ subtitle }}</p>\n </div>\n </div>\n <div v-else class=\"sl-flex sl-justify-center sl-mt-6\">\n <div class=\"loader-dots\" :class=\"dotSizeClass\">\n <div v-for=\"n in 4\" :key=\"n\" class=\"dots-div\" :style=\"{ backgroundColor }\"></div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = defineProps({\n backgroundColor: {\n type: String,\n default: \"var(--sl-color-primary-600, #3e4b9a)\",\n },\n size: {\n type: String,\n default: \"md\",\n validator: (value: string) =>\n [\"sm\", \"md\", \"lg\", \"xl\"].includes(value),\n },\n caption: {\n type: String,\n default: 'LOADING'\n },\n title: {\n type: String,\n default: 'Please wait'\n },\n subtitle: {\n type: String,\n default: ''\n }\n});\n\nconst dotSizeClass = computed(() => {\n return `dots-${props.size}`;\n});\n</script>\n\n<style scoped>\n.loader-dots {\n display: block;\n position: relative;\n width: 5rem;\n height: 1.25rem;\n margin-top: 0.5rem;\n max-width: 20rem;\n}\n\n.dots-div {\n position: absolute;\n top: 0;\n margin-top: 0.25rem;\n border-radius: 9999999px;\n animation-timing-function: cubic-bezier(0, 1, 1, 0);\n}\n\n.loader-dots div {\n animation-timing-function: cubic-bezier(0, 1, 1, 0);\n}\n\n.loader-dots div:nth-child(1) {\n left: 8px;\n animation: loader-dots1 0.6s infinite;\n}\n\n.loader-dots div:nth-child(2) {\n left: 8px;\n animation: loader-dots2 0.6s infinite;\n}\n\n.loader-dots div:nth-child(3) {\n left: 32px;\n animation: loader-dots2 0.6s infinite;\n}\n\n.loader-dots div:nth-child(4) {\n left: 56px;\n animation: loader-dots3 0.6s infinite;\n}\n\n@keyframes loader-dots1 {\n 0% {\n transform: scale(0);\n }\n\n 100% {\n transform: scale(1);\n }\n}\n\n@keyframes loader-dots3 {\n 0% {\n transform: scale(1);\n }\n\n 100% {\n transform: scale(0);\n }\n}\n\n@keyframes loader-dots2 {\n 0% {\n transform: translate(0, 0);\n }\n\n 100% {\n transform: translate(24px, 0);\n }\n}\n\n/* Size variations */\n.dots-sm .dots-div {\n width: 0.5rem;\n height: 0.5rem;\n}\n\n.dots-md .dots-div {\n width: 0.75rem;\n height: 0.75rem;\n}\n\n.dots-lg .dots-div {\n width: 1rem;\n height: 1rem;\n}\n\n.dots-xl .dots-div {\n width: 1.25rem;\n height: 1.25rem;\n}\n</style>\n"],"names":["props","__props","dotSizeClass","computed","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_normalizeClass","_Fragment","_renderList","n","_hoisted_6","_hoisted_7"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,UAAMA,IAAQC,GAyBRC,IAAeC,EAAS,MACrB,QAAQH,EAAM,IAAI,EAC1B;qBAjDYC,EAAA,SAASA,EAAA,YAAYA,EAAA,WAAhCG,EAAA,GAAAC,EAWM,OAXNC,GAWM;AAAA,MAVJC,EASM,OATNC,GASM;AAAA,QARJD,EAA4H,KAA5HE,GAA4HC,EAAdT,EAAA,OAAO,GAAA,CAAA;AAAA,QACrHM,EAA+G,MAA/GI,GAA+GD,EAAbT,EAAA,KAAK,GAAA,CAAA;AAAA,QACvGM,EAIM,OAJNK,GAIM;AAAA,UAHJL,EAEM,OAAA;AAAA,YAFD,OAAKM,EAAA,CAAC,eAAsBX,EAAA,KAAY,CAAA;AAAA,UAAA;kBAC3CG,EAAiFS,GAAA,MAAAC,EAAhE,GAAC,CAANC,MAAZT,EAAiF,OAAA;AAAA,cAA5D,KAAKS;AAAA,cAAG,OAAM;AAAA,cAAY,4BAASf,EAAA,iBAAe;AAAA,YAAA;;;QAG3EM,EAA8E,KAA9EU,GAA8EP,EAAfT,EAAA,QAAQ,GAAA,CAAA;AAAA,MAAA;WAG3EG,EAAA,GAAAC,EAIM,OAJNa,GAIM;AAAA,MAHJX,EAEM,OAAA;AAAA,QAFD,OAAKM,EAAA,CAAC,eAAsBX,EAAA,KAAY,CAAA;AAAA,MAAA;cAC3CG,EAAiFS,GAAA,MAAAC,EAAhE,GAAC,CAANC,MAAZT,EAAiF,OAAA;AAAA,UAA5D,KAAKS;AAAA,UAAG,OAAM;AAAA,UAAY,4BAASf,EAAA,iBAAe;AAAA,QAAA;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LottieAnimation.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Menu.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Modal.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"NavLink.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProgressBar.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RadialProgressBar.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Table.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Transition.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCalendar.js","sources":["../../src/composables/useCalendar.ts"],"sourcesContent":["/**\n * @module composables/useCalendar\n * @description Reactive calendar state management composable\n * \n * Provides calendar navigation and date management with support for\n * day, week, month, and year view modes. Automatically generates\n * calendar days based on the current view mode.\n * \n * ## Usage\n * ```typescript\n * import { useCalendar } from '@stachelock/ui'\n * \n * const { mode, currentDate, days, months, prev, next } = useCalendar('month')\n * \n * // Navigate between months\n * next() // Go to next month\n * prev() // Go to previous month\n * \n * // Change view mode\n * mode.value = 'week'\n * ```\n * \n * @see CalendarDay - Individual day data structure\n * @see Month - Month data structure for year view\n */\nimport { ref, watch } from 'vue';\nimport { generateMonthDays, generateWeekDays, generateYearDays, type CalendarDay, type Month } from '@/utils/calendar';\n\n/**\n * Calendar view modes\n * - day: Single day view\n * - week: Week view (7 days)\n * - month: Full month calendar grid\n * - year: Year overview with months\n */\nexport type CalendarMode = 'day' | 'week' | 'month' | 'year';\n\n/**\n * Calendar composable for date navigation and view management\n * \n * @param initialMode - Starting view mode (default: 'month')\n * @returns Reactive calendar state and navigation methods\n * \n * @example\n * ```vue\n * <script setup>\n * import { useCalendar } from '@stachelock/ui'\n * \n * const { mode, currentDate, days, prev, next } = useCalendar()\n * </script>\n * \n * <template>\n * <div>\n * <button @click=\"prev\">Previous</button>\n * <span>{{ currentDate.toLocaleDateString() }}</span>\n * <button @click=\"next\">Next</button>\n * </div>\n * <div v-for=\"day in days\" :key=\"day.date\">\n * {{ day.day }}\n * </div>\n * </template>\n * ```\n */\nexport function useCalendar(initialMode: CalendarMode = 'month') {\n const mode = ref<CalendarMode>(initialMode);\n const currentDate = ref(new Date());\n const days = ref<CalendarDay[]>([]);\n const months = ref<Month[]>([]);\n\n const update = () => {\n if (mode.value === 'month') {\n days.value = generateMonthDays(currentDate.value);\n } else if (mode.value === 'week') {\n days.value = generateWeekDays(currentDate.value);\n } else if (mode.value === 'day') {\n days.value = generateWeekDays(currentDate.value).filter(d => d.date === days.value[0]?.date);\n } else if (mode.value === 'year') {\n months.value = generateYearDays(currentDate.value);\n }\n };\n\n watch([mode, currentDate], update, { immediate: true });\n\n const prev = () => {\n const d = new Date(currentDate.value);\n if (mode.value === 'month') d.setMonth(d.getMonth() - 1);\n else if (mode.value === 'week' || mode.value === 'day') d.setDate(d.getDate() - 7);\n else if (mode.value === 'year') d.setFullYear(d.getFullYear() - 1);\n currentDate.value = d;\n };\n\n const next = () => {\n const d = new Date(currentDate.value);\n if (mode.value === 'month') d.setMonth(d.getMonth() + 1);\n else if (mode.value === 'week' || mode.value === 'day') d.setDate(d.getDate() + 7);\n else if (mode.value === 'year') d.setFullYear(d.getFullYear() + 1);\n currentDate.value = d;\n };\n\n return {\n /** Current view mode (day/week/month/year) */\n mode,\n /** Current reference date for the calendar */\n currentDate,\n /** Array of calendar days for current view */\n days,\n /** Array of months (only populated in year view) */\n months,\n /** Navigate to previous time period */\n prev,\n /** Navigate to next time period */\n next,\n };\n}\n\nexport default useCalendar;\n\n"],"names":["useCalendar","initialMode","mode","ref","currentDate","days","months","watch","generateMonthDays","generateWeekDays","d","generateYearDays"],"mappings":";;AA+DO,SAASA,EAAYC,IAA4B,SAAS;AAC/D,QAAMC,IAAOC,EAAkBF,CAAW,GACpCG,IAAcD,EAAI,oBAAI,MAAM,GAC5BE,IAAOF,EAAmB,EAAE,GAC5BG,IAASH,EAAa,EAAE;AAc9B,SAAAI,EAAM,CAACL,GAAME,CAAW,GAZT,MAAM;AACnB,IAAIF,EAAK,UAAU,UACjBG,EAAK,QAAQG,EAAkBJ,EAAY,KAAK,IACvCF,EAAK,UAAU,SACxBG,EAAK,QAAQI,EAAiBL,EAAY,KAAK,IACtCF,EAAK,UAAU,QACxBG,EAAK,QAAQI,EAAiBL,EAAY,KAAK,EAAE,OAAO,CAAAM,MAAKA,EAAE,SAASL,EAAK,MAAM,CAAC,GAAG,IAAI,IAClFH,EAAK,UAAU,WACxBI,EAAO,QAAQK,EAAiBP,EAAY,KAAK;AAAA,EAErD,GAEmC,EAAE,WAAW,IAAM,GAkB/C;AAAA;AAAA,IAEL,MAAAF;AAAA;AAAA,IAEA,aAAAE;AAAA;AAAA,IAEA,MAAAC;AAAA;AAAA,IAEA,QAAAC;AAAA;AAAA,IAEA,MA1BW,MAAM;AACjB,YAAMI,IAAI,IAAI,KAAKN,EAAY,KAAK;AACpC,MAAIF,EAAK,UAAU,UAASQ,EAAE,SAASA,EAAE,SAAA,IAAa,CAAC,IAC9CR,EAAK,UAAU,UAAUA,EAAK,UAAU,QAAOQ,EAAE,QAAQA,EAAE,QAAA,IAAY,CAAC,IACxER,EAAK,UAAU,UAAQQ,EAAE,YAAYA,EAAE,YAAA,IAAgB,CAAC,GACjEN,EAAY,QAAQM;AAAA,IACtB;AAAA;AAAA,IAsBE,MApBW,MAAM;AACjB,YAAMA,IAAI,IAAI,KAAKN,EAAY,KAAK;AACpC,MAAIF,EAAK,UAAU,UAASQ,EAAE,SAASA,EAAE,SAAA,IAAa,CAAC,IAC9CR,EAAK,UAAU,UAAUA,EAAK,UAAU,QAAOQ,EAAE,QAAQA,EAAE,QAAA,IAAY,CAAC,IACxER,EAAK,UAAU,UAAQQ,EAAE,YAAYA,EAAE,YAAA,IAAgB,CAAC,GACjEN,EAAY,QAAQM;AAAA,IACtB;AAAA,EAcE;AAEJ;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFormValidation.js","sources":["../../src/composables/useFormValidation.ts"],"sourcesContent":["/**\n * @module composables/useFormValidation\n * @description Form validation composable with Yup schema support\n * \n * Provides comprehensive form state management with field-level validation,\n * error tracking, and form submission handling. Integrates seamlessly with\n * Yup validation schemas for declarative validation rules.\n * \n * ## Usage\n * ```typescript\n * import { useFormValidation } from '@stachelock/ui'\n * import * as yup from 'yup'\n * \n * const schema = yup.object({\n * email: yup.string().email().required(),\n * password: yup.string().min(8).required(),\n * })\n * \n * const {\n * formState,\n * isValid,\n * getFieldProps,\n * handleSubmit\n * } = useFormValidation({ schema })\n * \n * const onSubmit = handleSubmit(async (values) => {\n * await api.login(values)\n * })\n * ```\n * \n * @see FormField - Individual field state structure\n * @see FormState - Complete form state object\n */\nimport { reactive, computed, ref } from 'vue';\nimport type { ObjectSchema } from 'yup';\nimport { ValidationError } from 'yup';\n\n/**\n * State for an individual form field\n */\nexport interface FormField {\n value: string;\n error: string | null;\n touched: boolean;\n valid: boolean;\n}\n\n/**\n * Complete form state object\n * Keys are field names, values are FormField objects\n */\nexport interface FormState {\n [key: string]: FormField;\n}\n\n/**\n * Configuration options for useFormValidation\n */\nexport interface UseFormValidationOptions {\n /**\n * Validation schema (Yup schema object)\n */\n schema?: ObjectSchema<any>;\n /**\n * Initial values for the form fields\n */\n initialValues?: Record<string, string>;\n /**\n * Whether to validate on change\n */\n validateOnChange?: boolean;\n /**\n * Whether to validate on blur\n */\n validateOnBlur?: boolean;\n}\n\n/**\n * Form validation composable\n * \n * @param options - Configuration options\n * @returns Form state, computed values, and validation methods\n * \n * @example\n * ```vue\n * <script setup>\n * import { useFormValidation } from '@stachelock/ui'\n * import * as yup from 'yup'\n * \n * const schema = yup.object({\n * name: yup.string().required('Name is required'),\n * email: yup.string().email('Invalid email').required()\n * })\n * \n * const { getFieldProps, handleSubmit, errors, isValid } = useFormValidation({\n * schema,\n * initialValues: { name: '', email: '' }\n * })\n * </script>\n * \n * <template>\n * <form @submit.prevent=\"handleSubmit(onSubmit)\">\n * <input v-bind=\"getFieldProps('name')\" />\n * <span v-if=\"errors.name\">{{ errors.name }}</span>\n * \n * <input v-bind=\"getFieldProps('email')\" />\n * <span v-if=\"errors.email\">{{ errors.email }}</span>\n * \n * <button :disabled=\"!isValid\">Submit</button>\n * </form>\n * </template>\n * ```\n */\nexport function useFormValidation(options: UseFormValidationOptions = {}) {\n const {\n schema,\n initialValues = {},\n validateOnChange = true,\n validateOnBlur = true,\n } = options;\n\n const formState = reactive<FormState>({});\n const isSubmitting = ref(false);\n const submitCount = ref(0);\n\n // Initialize form fields\n const initializeField = (name: string, value = '') => {\n if (!formState[name]) {\n formState[name] = {\n value: initialValues[name] || value,\n error: null,\n touched: false,\n valid: true,\n };\n }\n };\n\n // Validate a single field\n const validateField = async (name: string, value: string): Promise<string | null> => {\n if (!schema) return null;\n\n try {\n await schema.validateAt(name, { [name]: value });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return error.message;\n }\n return 'Validation error';\n }\n };\n\n // Validate all fields\n const validateForm = async (): Promise<boolean> => {\n if (!schema) return true;\n\n const values: Record<string, string> = {};\n Object.keys(formState).forEach(key => {\n values[key] = formState[key].value;\n });\n\n try {\n await schema.validate(values, { abortEarly: false });\n \n // Clear all errors if validation passes\n Object.keys(formState).forEach(key => {\n formState[key].error = null;\n formState[key].valid = true;\n });\n \n return true;\n } catch (error) {\n if (error instanceof ValidationError) {\n // Clear previous errors\n Object.keys(formState).forEach(key => {\n formState[key].error = null;\n formState[key].valid = true;\n });\n\n // Set new errors\n error.inner.forEach(err => {\n if (err.path && formState[err.path]) {\n formState[err.path].error = err.message;\n formState[err.path].valid = false;\n }\n });\n }\n return false;\n }\n };\n\n // Set field value\n const setFieldValue = async (name: string, value: string) => {\n initializeField(name);\n formState[name].value = value;\n\n if (validateOnChange && schema) {\n const error = await validateField(name, value);\n formState[name].error = error;\n formState[name].valid = !error;\n }\n };\n\n // Set field touched\n const setFieldTouched = async (name: string, touched = true) => {\n initializeField(name);\n formState[name].touched = touched;\n\n if (validateOnBlur && touched && schema) {\n const error = await validateField(name, formState[name].value);\n formState[name].error = error;\n formState[name].valid = !error;\n }\n };\n\n // Get field props for binding to components\n const getFieldProps = (name: string) => {\n initializeField(name);\n \n return {\n name,\n value: formState[name].value,\n 'onUpdate:value': (value: string) => setFieldValue(name, value),\n onBlur: () => setFieldTouched(name, true),\n } as const;\n };\n\n // Submit handler\n const handleSubmit = async (submitHandler: (values: Record<string, string>) => Promise<void> | void) => {\n isSubmitting.value = true;\n submitCount.value++;\n\n // Mark all fields as touched\n Object.keys(formState).forEach(key => {\n formState[key].touched = true;\n });\n\n const isValid = await validateForm();\n \n if (isValid) {\n const values: Record<string, string> = {};\n Object.keys(formState).forEach(key => {\n values[key] = formState[key].value;\n });\n\n try {\n await submitHandler(values);\n } catch (error) {\n console.error('Form submission error:', error);\n }\n }\n\n isSubmitting.value = false;\n };\n\n // Reset form\n const resetForm = () => {\n Object.keys(formState).forEach(key => {\n formState[key].value = initialValues[key] || '';\n formState[key].error = null;\n formState[key].touched = false;\n formState[key].valid = true;\n });\n submitCount.value = 0;\n };\n\n // Computed properties\n const isValid = computed(() => {\n return Object.values(formState).every(field => field.valid);\n });\n\n const isDirty = computed(() => {\n return Object.values(formState).some(field => field.touched);\n });\n\n const hasErrors = computed(() => {\n return Object.values(formState).some(field => field.error);\n });\n\n const values = computed(() => {\n const result: Record<string, string> = {};\n Object.keys(formState).forEach(key => {\n result[key] = formState[key].value;\n });\n return result;\n });\n\n const errors = computed(() => {\n const result: Record<string, string | null> = {};\n Object.keys(formState).forEach(key => {\n result[key] = formState[key].error;\n });\n return result;\n });\n\n return {\n // State\n formState,\n isSubmitting: computed(() => isSubmitting.value),\n submitCount: computed(() => submitCount.value),\n \n // Computed\n isValid,\n isDirty,\n hasErrors,\n values,\n errors,\n \n // Methods\n setFieldValue,\n setFieldTouched,\n getFieldProps,\n validateField,\n validateForm,\n handleSubmit,\n resetForm,\n };\n}\n\nexport default useFormValidation;\n"],"names":["useFormValidation","options","schema","initialValues","validateOnChange","validateOnBlur","formState","reactive","isSubmitting","ref","submitCount","initializeField","name","value","validateField","error","ValidationError","validateForm","values","key","err","setFieldValue","setFieldTouched","touched","getFieldProps","handleSubmit","submitHandler","resetForm","isValid","computed","field","isDirty","hasErrors","result","errors"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useMap.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useModal.js","sources":["../../src/composables/useModal.ts"],"sourcesContent":["/**\n * @module composables/useModal\n * @description Modal state management composable with accessibility features\n * \n * Provides comprehensive modal management including open/close state,\n * focus trapping, keyboard navigation (Escape to close), click-outside\n * handling, and body scroll prevention. Designed for accessibility compliance.\n * \n * ## Usage\n * ```typescript\n * import { useModal } from '@stachelock/ui'\n * \n * const { isOpen, open, close, modalRef } = useModal()\n * \n * // Open the modal\n * open()\n * \n * // Close the modal\n * close()\n * ```\n * \n * ## With v-model support\n * ```typescript\n * const props = defineProps<{ modelValue: boolean }>()\n * const emit = defineEmits<{ 'update:modelValue': [value: boolean] }>()\n * \n * const { isOpen, modalRef } = useModal(props.modelValue, emit)\n * ```\n * \n * @see UseModalOptions - Configuration options\n */\nimport { ref, computed, watch, nextTick } from 'vue';\nimport { useVModel } from '@vueuse/core';\n\n/**\n * Configuration options for useModal\n */\nexport interface UseModalOptions {\n /**\n * Whether to close modal when clicking outside\n */\n closeOnClickOutside?: boolean;\n /**\n * Whether to close modal when pressing escape\n */\n closeOnEscape?: boolean;\n /**\n * Whether to trap focus within modal\n */\n trapFocus?: boolean;\n /**\n * Callback when modal is opened\n */\n onOpen?: () => void;\n /**\n * Callback when modal is closed\n */\n onClose?: () => void;\n /**\n * Whether to prevent body scroll when modal is open\n */\n preventBodyScroll?: boolean;\n}\n\n/**\n * Modal state management composable\n * \n * @param modelValue - Optional v-model value for two-way binding\n * @param emit - Optional emit function for v-model updates\n * @param options - Configuration options\n * @returns Modal state and control methods\n * \n * @example\n * ```vue\n * <script setup>\n * import { useModal } from '@stachelock/ui'\n * \n * const { isOpen, open, close, modalRef } = useModal(undefined, undefined, {\n * closeOnEscape: true,\n * trapFocus: true\n * })\n * </script>\n * \n * <template>\n * <button @click=\"open\">Open Modal</button>\n * \n * <div v-if=\"isOpen\" ref=\"modalRef\" role=\"dialog\" aria-modal=\"true\">\n * <h2>Modal Content</h2>\n * <button @click=\"close\">Close</button>\n * </div>\n * </template>\n * ```\n */\nexport function useModal(\n modelValue?: boolean,\n emit?: (event: 'update:modelValue', value: boolean) => void,\n options: UseModalOptions = {}\n) {\n const {\n closeOnClickOutside = true,\n closeOnEscape = true,\n trapFocus = true,\n onOpen,\n onClose,\n preventBodyScroll = true,\n } = options;\n\n // Use v-model if provided, otherwise create internal ref\n // useVModel expects props object, so we wrap modelValue\n const isOpen = modelValue !== undefined && emit \n ? useVModel({ modelValue }, 'modelValue', emit as (name: 'update:modelValue', ...args: boolean[]) => void)\n : ref(false);\n\n const modalRef = ref<HTMLElement | null>(null);\n const previouslyFocusedElement = ref<HTMLElement | null>(null);\n const focusableElements = ref<HTMLElement[]>([]);\n\n // Get focusable elements within modal\n const getFocusableElements = (): HTMLElement[] => {\n if (!modalRef.value) return [];\n\n const selectors = [\n 'button:not([disabled])',\n '[href]',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ];\n\n const elements = modalRef.value.querySelectorAll<HTMLElement>(selectors.join(','));\n return Array.from(elements).filter(element => {\n return element.offsetParent !== null && !element.hasAttribute('disabled');\n });\n };\n\n // Focus trap functionality\n const handleTabKey = (event: KeyboardEvent) => {\n if (!trapFocus || !isOpen.value) return;\n\n const focusableElementsList = getFocusableElements();\n const firstElement = focusableElementsList[0];\n const lastElement = focusableElementsList[focusableElementsList.length - 1];\n\n if (event.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n // Handle escape key\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && closeOnEscape && isOpen.value) {\n event.preventDefault();\n close();\n }\n };\n\n // Handle global keyboard events\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Tab') {\n handleTabKey(event);\n } else if (event.key === 'Escape') {\n handleEscapeKey(event);\n }\n };\n\n // Open modal\n const open = () => {\n if (isOpen.value) return;\n\n // Store currently focused element\n previouslyFocusedElement.value = document.activeElement as HTMLElement;\n \n isOpen.value = true;\n \n nextTick(() => {\n if (trapFocus && modalRef.value) {\n focusableElements.value = getFocusableElements();\n focusableElements.value[0]?.focus();\n }\n \n onOpen?.();\n });\n };\n\n // Close modal\n const close = () => {\n if (!isOpen.value) return;\n\n isOpen.value = false;\n \n // Return focus to previously focused element\n if (trapFocus && previouslyFocusedElement.value) {\n previouslyFocusedElement.value.focus();\n previouslyFocusedElement.value = null;\n }\n \n onClose?.();\n };\n\n // Toggle modal\n const toggle = () => {\n if (isOpen.value) {\n close();\n } else {\n open();\n }\n };\n\n // Handle click outside\n const handleClickOutside = (event: MouseEvent) => {\n if (!closeOnClickOutside || !isOpen.value || !modalRef.value) return;\n\n const target = event.target as Node;\n if (!modalRef.value.contains(target)) {\n close();\n }\n };\n\n // Handle body scroll prevention\n const handleBodyScroll = () => {\n if (!preventBodyScroll) return;\n\n if (isOpen.value) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n };\n\n // Watch for modal state changes\n watch(isOpen, (newValue) => {\n if (newValue) {\n document.addEventListener('keydown', handleKeydown);\n document.addEventListener('click', handleClickOutside);\n handleBodyScroll();\n } else {\n document.removeEventListener('keydown', handleKeydown);\n document.removeEventListener('click', handleClickOutside);\n handleBodyScroll();\n }\n });\n\n // Cleanup on unmount\n const cleanup = () => {\n document.removeEventListener('keydown', handleKeydown);\n document.removeEventListener('click', handleClickOutside);\n if (preventBodyScroll) {\n document.body.style.overflow = '';\n }\n };\n\n return {\n // State\n /** Whether the modal is currently open (computed) */\n isOpen: computed(() => isOpen.value),\n /** Ref to attach to the modal container element */\n modalRef,\n \n // Methods\n /** Open the modal */\n open,\n /** Close the modal */\n close,\n /** Toggle modal open/closed state */\n toggle,\n /** Cleanup function to remove event listeners (call on unmount) */\n cleanup,\n \n // Utils\n /** Get all focusable elements within the modal */\n getFocusableElements,\n };\n}\n\nexport default useModal;\n"],"names":["useModal","modelValue","emit","options","closeOnClickOutside","closeOnEscape","trapFocus","onOpen","onClose","preventBodyScroll","isOpen","useVModel","ref","modalRef","previouslyFocusedElement","focusableElements","getFocusableElements","selectors","elements","element","handleTabKey","event","focusableElementsList","firstElement","lastElement","handleEscapeKey","close","handleKeydown","open","nextTick","toggle","handleClickOutside","target","handleBodyScroll","watch","newValue","cleanup","computed"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useNotifications.js","sources":["../../src/composables/useNotifications.ts"],"sourcesContent":["/**\n * @module composables/useNotifications\n * @description Enhanced reactive notification system for toast messages\n * \n * Provides a comprehensive notification system with support for:\n * - Stacking with automatic offset calculation\n * - Multiple positions (corners and centers)\n * - Theming with dark mode support\n * - Deduplication to prevent notification spam\n * - Priority levels (low, normal, high, urgent)\n * - Variants (default, compact, expanded)\n * - Action buttons (dismiss, link, callback)\n * - Sticky notifications that don't auto-close\n * - Card stacking mode for multiple notifications\n * - Global pause/resume functionality\n * \n * ## Usage\n * ```typescript\n * import { useNotifications } from '@stachelock/ui'\n * \n * const { showNotification, hideNotification, notifications } = useNotifications()\n * \n * // Show a success notification\n * showNotification({\n * title: 'Saved!',\n * message: 'Your changes have been saved.',\n * theme: 'success',\n * timeout: 3000\n * })\n * \n * // Show a notification with actions\n * showNotification({\n * title: 'Confirm Action',\n * message: 'Do you want to proceed?',\n * theme: 'warning',\n * autoClose: false,\n * actions: [\n * { label: 'Confirm', action: 'callback', callback: () => confirm(), theme: 'primary' },\n * { label: 'Cancel', action: 'dismiss', theme: 'secondary' }\n * ]\n * })\n * \n * // Show a high priority notification\n * showNotification({\n * title: 'Critical Error',\n * message: 'Please contact support.',\n * theme: 'danger',\n * priority: 'urgent',\n * sticky: true\n * })\n * ```\n */\nimport { ref, computed, readonly, type Component } from 'vue';\n\n/**\n * Theme options for notifications\n * Maps to semantic colors with dark mode support\n */\nexport type NotificationTheme = \n | 'primary'\n | 'secondary'\n | 'dark'\n | 'light'\n | 'success'\n | 'warning'\n | 'danger'\n | 'ghost'\n | 'info';\n\n/**\n * Position options for notifications\n * - tr: top-right\n * - tl: top-left\n * - tc: top-center\n * - br: bottom-right\n * - bl: bottom-left\n * - bc: bottom-center\n */\nexport type NotificationPosition = 'tr' | 'tl' | 'tc' | 'br' | 'bl' | 'bc';\n\n/**\n * Notification variant for different display styles\n * - default: Standard notification size\n * - compact: Smaller, more minimal notification\n * - expanded: Larger notification with more space for content\n */\nexport type NotificationVariant = 'default' | 'compact' | 'expanded';\n\n/**\n * Priority levels for notification ordering and timing\n * - low: Least important, shorter timeout\n * - normal: Default priority\n * - high: Important, shown above normal\n * - urgent: Critical, longest timeout, shown first\n */\nexport type NotificationPriority = 'low' | 'normal' | 'high' | 'urgent';\n\n/**\n * Action button configuration for notifications\n */\nexport interface NotificationAction {\n /** Button label text */\n label: string;\n /** Action type */\n action: 'dismiss' | 'link' | 'callback';\n /** URL for link actions */\n href?: string;\n /** Callback function for callback actions */\n callback?: () => void;\n /** Button theme */\n theme?: 'primary' | 'secondary' | 'danger';\n}\n\n/**\n * Parameters for creating a notification\n */\nexport interface NotificationParams {\n /** Title of the notification */\n title: string;\n /** Optional detailed message */\n message?: string;\n /** Visual theme */\n theme?: NotificationTheme;\n /** Screen position */\n position?: NotificationPosition;\n /** Whether to auto-close after timeout */\n autoClose?: boolean;\n /** Timeout in milliseconds before auto-close */\n timeout?: number;\n /** Optional unique ID (auto-generated if not provided) */\n id?: string;\n /** Custom icon component */\n icon?: Component;\n /** Display variant */\n variant?: NotificationVariant;\n /** Priority level for ordering */\n priority?: NotificationPriority;\n /** Whether the notification can be dismissed */\n dismissible?: boolean;\n /** Prevent auto-close even if autoClose is true */\n sticky?: boolean;\n /** Action buttons */\n actions?: NotificationAction[];\n /** Maximum width in pixels */\n maxWidth?: number;\n /** Custom dedupe key for grouping similar notifications */\n dedupeKey?: string;\n /** Time window in ms for deduplication */\n dedupeWindowMs?: number;\n /** Whether notification should persist across route changes */\n persistent?: boolean;\n}\n\n/**\n * Internal notification state\n */\nexport interface NotificationState extends Required<Omit<NotificationParams, 'icon' | 'actions' | 'dedupeKey' | 'dedupeWindowMs'>> {\n /** Whether the notification is currently visible */\n isOpen: boolean;\n /** Creation timestamp */\n createdAt: number;\n /** Calculated Y offset for stacking */\n yOffset: number;\n /** Optional custom icon */\n icon?: Component;\n /** Optional action buttons */\n actions?: NotificationAction[];\n /** Dedupe key */\n dedupeKey?: string;\n /** Dedupe window */\n dedupeWindowMs?: number;\n /** Stack index for ordering */\n stackIndex?: number;\n /** Whether in card stacking mode */\n isCardMode?: boolean;\n /** Card stack position */\n cardStackIndex?: number;\n /** Card X offset */\n cardOffsetX?: number;\n /** Card Y offset */\n cardOffsetY?: number;\n /** Z-index for layering */\n zIndex?: number;\n}\n\n/**\n * Position-specific stacking configuration\n */\nexport interface PositionStackConfig {\n /** Maximum visible notifications */\n maxVisible: number;\n /** Stack direction */\n stackDirection: 'up' | 'down';\n /** Spacing between notifications in pixels */\n spacing: number;\n /** Base offset from edge */\n offset: { x: number; y: number };\n /** Whether to adjust for sidebar */\n respectsSidebar: boolean;\n /** Stacking mode */\n stackingMode: 'linear' | 'cards';\n /** Threshold for card stacking */\n cardStackThreshold: number;\n /** Horizontal card offset */\n cardOffsetX: number;\n /** Vertical card offset */\n cardOffsetY: number;\n}\n\n/**\n * System-wide notification state\n */\nexport interface NotificationSystemState {\n /** Global pause flag */\n globalPaused: boolean;\n /** Layout aware flag */\n layoutAware: boolean;\n /** Max per position */\n maxPerPosition: number;\n /** Stack configurations by position */\n stackConfigs: Record<NotificationPosition, PositionStackConfig>;\n}\n\n// Constants\nconst NOTIFICATION_HEIGHT_DEFAULT = 80;\nconst NOTIFICATION_HEIGHT_COMPACT = 60;\nconst NOTIFICATION_HEIGHT_EXPANDED = 120;\nconst NOTIFICATION_SPACING = 12;\nconst CARD_STACK_THRESHOLD = 3;\n\n// Generate unique ID\nconst generateId = () => `notification-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n\n// Safe lowercase helper for dedupe\nconst safeLower = (val: unknown, fallback = ''): string => {\n if (typeof val === 'string') return val.toLowerCase();\n try {\n if (val && typeof val === 'object') {\n const maybeMessage = (val as Record<string, unknown>).message ?? (val as Record<string, unknown>).name;\n if (typeof maybeMessage === 'string') return maybeMessage.toLowerCase();\n }\n return String(val ?? fallback).toLowerCase();\n } catch {\n return String(fallback).toLowerCase();\n }\n};\n\n// Compute dedupe key from notification params\nconst computeDedupeKey = (n: Partial<NotificationParams>): string => {\n if (n.dedupeKey) {\n return safeLower(n.dedupeKey, '');\n }\n const t = safeLower(n.title, '');\n const m = safeLower(n.message, '');\n const th = safeLower(n.theme || 'primary', 'primary');\n const p = safeLower(n.position || 'br', 'br');\n return `${t}|${m}|${th}|${p}`;\n};\n\n// Default stack configurations\nconst defaultStackConfigs: Record<NotificationPosition, PositionStackConfig> = {\n 'tr': {\n maxVisible: 5,\n stackDirection: 'down',\n spacing: NOTIFICATION_SPACING,\n offset: { x: 24, y: 24 },\n respectsSidebar: false,\n stackingMode: 'linear',\n cardStackThreshold: CARD_STACK_THRESHOLD,\n cardOffsetX: 6,\n cardOffsetY: 12\n },\n 'tl': {\n maxVisible: 5,\n stackDirection: 'down',\n spacing: NOTIFICATION_SPACING,\n offset: { x: 24, y: 24 },\n respectsSidebar: true,\n stackingMode: 'linear',\n cardStackThreshold: CARD_STACK_THRESHOLD,\n cardOffsetX: -6,\n cardOffsetY: 12\n },\n 'br': {\n maxVisible: 5,\n stackDirection: 'up',\n spacing: NOTIFICATION_SPACING,\n offset: { x: 24, y: 24 },\n respectsSidebar: false,\n stackingMode: 'linear',\n cardStackThreshold: CARD_STACK_THRESHOLD,\n cardOffsetX: 6,\n cardOffsetY: -12\n },\n 'bl': {\n maxVisible: 5,\n stackDirection: 'up',\n spacing: NOTIFICATION_SPACING,\n offset: { x: 24, y: 24 },\n respectsSidebar: true,\n stackingMode: 'linear',\n cardStackThreshold: CARD_STACK_THRESHOLD,\n cardOffsetX: -6,\n cardOffsetY: -12\n },\n 'tc': {\n maxVisible: 3,\n stackDirection: 'down',\n spacing: NOTIFICATION_SPACING,\n offset: { x: 0, y: 24 },\n respectsSidebar: false,\n stackingMode: 'linear',\n cardStackThreshold: CARD_STACK_THRESHOLD,\n cardOffsetX: 0,\n cardOffsetY: 12\n },\n 'bc': {\n maxVisible: 3,\n stackDirection: 'up',\n spacing: NOTIFICATION_SPACING,\n offset: { x: 0, y: 24 },\n respectsSidebar: false,\n stackingMode: 'linear',\n cardStackThreshold: CARD_STACK_THRESHOLD,\n cardOffsetX: 0,\n cardOffsetY: -12\n }\n};\n\n// Shared notification state (singleton)\nconst notifications = ref<NotificationState[]>([]);\nconst timeoutMap = new Map<string, ReturnType<typeof setTimeout>>();\n\n// System state\nconst systemState = ref<NotificationSystemState>({\n globalPaused: false,\n layoutAware: true,\n maxPerPosition: 5,\n stackConfigs: { ...defaultStackConfigs }\n});\n\n/**\n * Get notification height based on variant\n */\nconst getNotificationHeight = (notification: NotificationState): number => {\n const baseHeight = notification.variant === 'compact' ? NOTIFICATION_HEIGHT_COMPACT : \n notification.variant === 'expanded' ? NOTIFICATION_HEIGHT_EXPANDED : \n NOTIFICATION_HEIGHT_DEFAULT;\n \n // Add height for actions\n if (notification.actions && notification.actions.length > 0) {\n return baseHeight + 40;\n }\n \n return baseHeight;\n};\n\n/**\n * Get timeout based on priority\n */\nconst getTimeoutByPriority = (priority: NotificationPriority, customTimeout?: number): number => {\n if (customTimeout !== undefined) return customTimeout;\n \n const timeouts: Record<NotificationPriority, number> = {\n low: 2000,\n normal: 3000,\n high: 5000,\n urgent: 10000\n };\n \n return timeouts[priority];\n};\n\n/**\n * Recalculate Y offsets for stacked notifications\n */\nconst recalculateOffsets = () => {\n const positions: NotificationPosition[] = ['tr', 'tl', 'tc', 'br', 'bl', 'bc'];\n \n positions.forEach(position => {\n const config = systemState.value.stackConfigs[position];\n const positionNotifications = notifications.value\n .filter(n => n.isOpen && n.position === position)\n .sort((a, b) => {\n // Sort by priority first (urgent first), then by creation time (newer first)\n const priorityOrder = { urgent: 4, high: 3, normal: 2, low: 1 };\n const aPriority = priorityOrder[a.priority];\n const bPriority = priorityOrder[b.priority];\n \n if (aPriority !== bPriority) {\n return bPriority - aPriority;\n }\n return b.createdAt - a.createdAt;\n });\n \n // Determine if card stacking should be used\n const shouldUseCardStacking = positionNotifications.length >= config.cardStackThreshold;\n \n positionNotifications.forEach((notification, index) => {\n notification.stackIndex = index;\n notification.isCardMode = shouldUseCardStacking;\n notification.cardStackIndex = index;\n notification.zIndex = positionNotifications.length - index;\n \n if (shouldUseCardStacking) {\n // Card stacking mode\n notification.cardOffsetX = index * config.cardOffsetX;\n notification.cardOffsetY = index * config.cardOffsetY;\n notification.yOffset = 0;\n } else {\n // Linear stacking mode\n const height = getNotificationHeight(notification);\n notification.yOffset = index * (height + config.spacing);\n notification.cardOffsetX = 0;\n notification.cardOffsetY = 0;\n }\n });\n \n // Limit visible notifications per position\n if (positionNotifications.length > config.maxVisible) {\n const excess = positionNotifications.slice(config.maxVisible);\n excess.forEach(notification => {\n notification.isOpen = false;\n const timeoutId = timeoutMap.get(notification.id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutMap.delete(notification.id);\n }\n });\n }\n });\n};\n\n/**\n * Notification composable\n * \n * @returns Notification methods and reactive state\n * \n * @example\n * ```vue\n * <script setup>\n * import { useNotifications } from '@stachelock/ui'\n * \n * const { showNotification, success, error } = useNotifications()\n * \n * const handleSave = async () => {\n * try {\n * await saveData()\n * success('Saved!', 'Your changes have been saved successfully.')\n * } catch (err) {\n * error('Error', err.message)\n * }\n * }\n * </script>\n * ```\n */\nexport function useNotifications() {\n /**\n * Show a notification\n * \n * @param params - Notification configuration\n * @returns The notification ID\n */\n const showNotification = (params: NotificationParams): string => {\n // Check if notifications are paused\n if (systemState.value.globalPaused) {\n return '';\n }\n \n const id = params.id || generateId();\n const position = params.position || 'br';\n const priority = params.priority || 'normal';\n const now = Date.now();\n \n // Deduplication logic\n const incomingKey = computeDedupeKey(params);\n const isSessionExpired = safeLower(params.title, '').includes('session expired')\n || safeLower(params.message, '').includes('session expired');\n const dedupeWindowMs = params.dedupeWindowMs\n ?? (isSessionExpired ? 5 * 60 * 1000 : 15 * 1000); // 5m for session expired, 15s otherwise\n \n // Find existing notification with same dedupe key within window\n const existingIdx = notifications.value.findIndex((n) => {\n const sameKey = computeDedupeKey(n) === incomingKey;\n const windowMs = n.dedupeWindowMs ?? dedupeWindowMs;\n const withinWindow = now - n.createdAt <= windowMs;\n return sameKey && withinWindow && n.isOpen;\n });\n \n if (existingIdx !== -1) {\n // Refresh existing notification instead of creating duplicate\n const existing = notifications.value[existingIdx];\n existing.createdAt = now;\n existing.isOpen = true;\n \n // Adopt sticky/longer timeout if incoming has it\n if (params.sticky) existing.sticky = true;\n if (params.timeout && (!existing.timeout || params.timeout > existing.timeout)) {\n existing.timeout = params.timeout;\n }\n \n existing.dedupeWindowMs = params.dedupeWindowMs ?? existing.dedupeWindowMs ?? dedupeWindowMs;\n existing.dedupeKey = existing.dedupeKey || incomingKey;\n \n recalculateOffsets();\n return existing.id;\n }\n \n // Calculate initial yOffset based on existing notifications\n const existingInPosition = notifications.value.filter(\n n => n.isOpen && n.position === position\n );\n const yOffset = existingInPosition.length * (NOTIFICATION_HEIGHT_DEFAULT + NOTIFICATION_SPACING);\n \n const notification: NotificationState = {\n id,\n title: params.title,\n message: params.message || '',\n theme: params.theme || 'primary',\n position,\n autoClose: params.autoClose !== false,\n timeout: getTimeoutByPriority(priority, params.timeout),\n isOpen: true,\n createdAt: now,\n yOffset,\n icon: params.icon,\n variant: params.variant || 'default',\n priority,\n dismissible: params.dismissible !== false,\n sticky: params.sticky || false,\n actions: params.actions,\n maxWidth: params.maxWidth || 384,\n persistent: params.persistent || false,\n dedupeKey: incomingKey,\n dedupeWindowMs,\n };\n \n notifications.value.push(notification);\n recalculateOffsets();\n \n // Auto-close after timeout (unless sticky)\n if (notification.autoClose && !notification.sticky) {\n const timeoutId = setTimeout(() => {\n hideNotification({ id });\n }, notification.timeout);\n timeoutMap.set(id, timeoutId);\n }\n \n return id;\n };\n \n /**\n * Hide a specific notification\n * \n * @param target - Notification or object with notification ID\n */\n const hideNotification = (target: NotificationState | { id?: string }): void => {\n const id = target.id;\n if (!id) return;\n \n const index = notifications.value.findIndex(n => n.id === id);\n \n if (index !== -1) {\n notifications.value[index].isOpen = false;\n \n // Clear any pending timeout\n const timeoutId = timeoutMap.get(id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutMap.delete(id);\n }\n \n // Recalculate offsets immediately\n recalculateOffsets();\n \n // Clean up after animation\n setTimeout(() => {\n notifications.value = notifications.value.filter(n => n.id !== id);\n }, 300);\n }\n };\n \n /**\n * Clear all notifications\n */\n const clearAllNotifications = (): void => {\n notifications.value.forEach(n => {\n n.isOpen = false;\n const timeoutId = timeoutMap.get(n.id);\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutMap.delete(n.id);\n }\n });\n \n // Clean up after animations\n setTimeout(() => {\n notifications.value = [];\n }, 300);\n };\n \n /**\n * Clear notifications by position\n */\n const clearNotificationsByPosition = (position: NotificationPosition): void => {\n notifications.value\n .filter(n => n.position === position)\n .forEach(n => hideNotification(n));\n };\n \n /**\n * Pause all notifications\n */\n const pauseNotifications = (): void => {\n systemState.value.globalPaused = true;\n };\n \n /**\n * Resume notifications\n */\n const resumeNotifications = (): void => {\n systemState.value.globalPaused = false;\n };\n \n /**\n * Update stack configuration for a position\n */\n const updateStackConfig = (position: NotificationPosition, config: Partial<PositionStackConfig>): void => {\n systemState.value.stackConfigs[position] = {\n ...systemState.value.stackConfigs[position],\n ...config\n };\n recalculateOffsets();\n };\n \n /**\n * Bring a notification to the front of its stack\n */\n const bringToFront = (notificationId: string): void => {\n const notification = notifications.value.find(n => n.id === notificationId);\n if (!notification || !notification.isCardMode) return;\n \n // Update creation time to make it \"newest\"\n notification.createdAt = Date.now();\n recalculateOffsets();\n };\n \n /**\n * Execute a notification action\n */\n const executeAction = (notificationId: string, action: NotificationAction): void => {\n switch (action.action) {\n case 'dismiss':\n hideNotification({ id: notificationId });\n break;\n case 'link':\n if (action.href) {\n window.open(action.href, '_blank');\n }\n break;\n case 'callback':\n if (action.callback) {\n action.callback();\n }\n break;\n }\n };\n \n /**\n * Get active notifications (currently visible)\n */\n const activeNotifications = computed(() => \n notifications.value.filter(n => n.isOpen)\n );\n \n /**\n * Get notifications filtered by position\n */\n const getNotificationsByPosition = (position: NotificationPosition) => \n computed(() => \n notifications.value.filter(n => n.isOpen && n.position === position)\n );\n \n // Convenience methods for common notification types\n const success = (title: string, message?: string, options?: Partial<NotificationParams>) =>\n showNotification({ title, message, theme: 'success', ...options });\n \n const error = (title: string, message?: string, options?: Partial<NotificationParams>) =>\n showNotification({ title, message, theme: 'danger', ...options });\n \n const warning = (title: string, message?: string, options?: Partial<NotificationParams>) =>\n showNotification({ title, message, theme: 'warning', ...options });\n \n const info = (title: string, message?: string, options?: Partial<NotificationParams>) =>\n showNotification({ title, message, theme: 'info', ...options });\n \n const primary = (title: string, message?: string, options?: Partial<NotificationParams>) =>\n showNotification({ title, message, theme: 'primary', ...options });\n \n return {\n // State\n notifications: readonly(notifications),\n activeNotifications,\n getNotificationsByPosition,\n systemState: readonly(systemState),\n \n // Core methods\n showNotification,\n hideNotification,\n clearAllNotifications,\n clearNotificationsByPosition,\n \n // System controls\n pauseNotifications,\n resumeNotifications,\n updateStackConfig,\n bringToFront,\n executeAction,\n \n // Convenience methods\n success,\n error,\n warning,\n info,\n primary,\n };\n}\n\nexport default useNotifications;\n"],"names":["NOTIFICATION_HEIGHT_DEFAULT","NOTIFICATION_HEIGHT_COMPACT","NOTIFICATION_HEIGHT_EXPANDED","NOTIFICATION_SPACING","CARD_STACK_THRESHOLD","generateId","safeLower","val","fallback","maybeMessage","computeDedupeKey","n","t","m","th","p","defaultStackConfigs","notifications","ref","timeoutMap","systemState","getNotificationHeight","notification","baseHeight","getTimeoutByPriority","priority","customTimeout","recalculateOffsets","position","config","positionNotifications","a","b","priorityOrder","aPriority","bPriority","shouldUseCardStacking","index","height","timeoutId","useNotifications","showNotification","params","id","now","incomingKey","isSessionExpired","dedupeWindowMs","existingIdx","sameKey","windowMs","withinWindow","existing","yOffset","hideNotification","target","clearAllNotifications","clearNotificationsByPosition","pauseNotifications","resumeNotifications","updateStackConfig","bringToFront","notificationId","executeAction","action","activeNotifications","computed","getNotificationsByPosition","success","title","message","options","error","warning","info","primary","readonly"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTabs.js","sources":["../../node_modules/lodash-es/isObject.js","../../node_modules/lodash-es/_freeGlobal.js","../../node_modules/lodash-es/_root.js","../../node_modules/lodash-es/now.js","../../node_modules/lodash-es/_trimmedEndIndex.js","../../node_modules/lodash-es/_baseTrim.js","../../node_modules/lodash-es/_Symbol.js","../../node_modules/lodash-es/_getRawTag.js","../../node_modules/lodash-es/_objectToString.js","../../node_modules/lodash-es/_baseGetTag.js","../../node_modules/lodash-es/isObjectLike.js","../../node_modules/lodash-es/isSymbol.js","../../node_modules/lodash-es/toNumber.js","../../node_modules/lodash-es/debounce.js","../../src/composables/useTabs.ts"],"sourcesContent":["/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nexport default debounce;\n","/**\n * useTabs Composable\n * \n * Provides comprehensive tab management including:\n * - Mobile/desktop responsive behavior\n * - Tab filtering by group\n * - KeepAlive component management\n * - Hover state debouncing\n * - Tab selection and navigation\n */\n\nimport { computed, ref, onMounted, onUnmounted, watch, shallowRef, nextTick } from 'vue';\nimport type { TabsItemType, TabItemForDropdown } from '../types/layouts';\nimport debounce from 'lodash-es/debounce';\n\nexport type TabCountTheme = 'primary' | 'warning' | 'success' | 'danger';\n\nexport interface UseTabsProps {\n tabGroup: string;\n tab?: number | null;\n tabs: TabsItemType[];\n showHeading?: boolean;\n tabCountTheme?: TabCountTheme;\n dropdownOnMobile?: boolean;\n fixedHeight?: string;\n}\n\nexport interface HoverStates {\n [key: string]: boolean;\n}\n\nexport interface TabSelectItem {\n id: number;\n name: string;\n disabled?: boolean;\n}\n\nexport type TabEmitFn = (event: 'tab-change' | 'update:modelValue', ...args: unknown[]) => void;\n\n/**\n * Converts a string to lowercase with spaces (simple noCase implementation)\n */\nfunction toNoCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[-_]/g, ' ')\n .toLowerCase()\n .trim();\n}\n\nexport function useTabs(props: UseTabsProps, emit: TabEmitFn) {\n // Convert props for internal use\n const tabGroup = computed(() => props.tabGroup);\n const tab = computed(() => props.tab);\n const tabs = computed(() => props.tabs || []);\n const showHeading = computed(() => props.showHeading !== false);\n const tabCountTheme = computed(() => props.tabCountTheme || 'warning');\n const dropdownOnMobile = computed(() => props.dropdownOnMobile !== false);\n const fixedHeight = computed(() => props.fixedHeight);\n\n // Access to source tabs\n const dynamicTabs = computed(() => {\n return tabs.value.length > 0 ? tabs.value : [];\n });\n\n // Tab hover states\n const hoverStates = shallowRef<HoverStates>({});\n\n const debouncedMouseEnter = debounce((tabId: number) => {\n hoverStates.value = { ...hoverStates.value, [tabId]: true };\n }, 50);\n\n const debouncedMouseLeave = debounce((tabId: number) => {\n hoverStates.value = { ...hoverStates.value, [tabId]: false };\n }, 50);\n\n const mouseEnter = (tabId: number): void => {\n debouncedMouseEnter(tabId);\n };\n\n const mouseLeave = (tabId: number): void => {\n debouncedMouseLeave(tabId);\n };\n\n // Theme classes for styling - uses stachelock colors\n const themeClasses = computed(() => {\n const themes: Record<TabCountTheme, { ringColor: string; bgColor: string }> = {\n primary: { \n ringColor: 'sl-ring-stachelock-600', \n bgColor: 'sl-bg-stachelock-50' \n },\n warning: { \n ringColor: 'sl-ring-yellow-300', \n bgColor: 'sl-bg-yellow-100' \n },\n success: { \n ringColor: 'sl-ring-green-300', \n bgColor: 'sl-bg-green-100' \n },\n danger: { \n ringColor: 'sl-ring-red-300', \n bgColor: 'sl-bg-red-100' \n },\n };\n return themes[tabCountTheme.value] || themes.warning;\n });\n\n // Filter tabs for this tab group\n const filteredTabs = computed(() => {\n if (!Array.isArray(dynamicTabs.value)) {\n console.warn('[useTabs] dynamicTabs is not an array', dynamicTabs.value);\n return [];\n }\n \n const groupName = toNoCase(tabGroup.value);\n return dynamicTabs.value.filter(t => t.group === groupName);\n });\n\n const tabItemsForDropdown = computed<TabItemForDropdown[]>(() => {\n return filteredTabs.value.map(t => ({ \n id: t.id, \n name: t.name, \n disabled: t?.disabled || false \n }));\n });\n\n const initialTabId = computed(() => {\n if (tab.value === undefined || tab.value === null) {\n return filteredTabs.value.length > 0 ? filteredTabs.value[0].id : null;\n }\n \n if (tab.value >= 0 && tab.value < filteredTabs.value.length) {\n return filteredTabs.value[tab.value].id;\n }\n \n return filteredTabs.value.length > 0 ? filteredTabs.value[0].id : null;\n });\n\n const selectedTabId = ref<string | number | null>(null);\n\n // Function to reset to a valid tab state\n const resetToValidTabState = (): boolean => {\n if (filteredTabs.value.length > 0) {\n const firstTabId = filteredTabs.value[0].id;\n selectedTabId.value = firstTabId;\n \n nextTick(() => {\n emit('tab-change', 0);\n });\n \n return true;\n }\n return false;\n };\n\n // Define the updateParentWithCorrectTabIndex function\n const updateParentWithCorrectTabIndex = (): void => {\n if (selectedTabId.value !== null) {\n const correctIndex = filteredTabs.value.findIndex(t => t.id === selectedTabId.value);\n if (correctIndex >= 0 && correctIndex !== tab.value) {\n emit('tab-change', correctIndex);\n }\n }\n };\n\n onMounted(() => {\n // Check if initialTabId is valid\n if (initialTabId.value !== null) {\n selectedTabId.value = initialTabId.value;\n } else if (filteredTabs.value.length > 0) {\n selectedTabId.value = filteredTabs.value[0].id;\n }\n \n // Let the parent know which tab is actually selected\n if (selectedTabId.value !== null) {\n const actualTabIndex = filteredTabs.value.findIndex(t => t.id === selectedTabId.value);\n if (actualTabIndex !== tab.value && actualTabIndex >= 0) {\n nextTick(() => {\n emit('tab-change', actualTabIndex);\n });\n }\n }\n });\n\n const selectedTab = computed(() => {\n const index = filteredTabs.value.findIndex((t: TabsItemType) => t.id === selectedTabId.value);\n return index >= 0 ? index : 0;\n });\n\n const selectedTabObject = computed<TabSelectItem | undefined>(() => {\n const t = filteredTabs.value.find((tab: TabsItemType) => tab.id === selectedTabId.value);\n return t ? { id: t.id, name: t.name, disabled: t?.disabled || false } : undefined;\n });\n\n // Responsive behavior\n const isMobile = shallowRef(typeof window !== 'undefined' ? window.innerWidth < 768 : false);\n let resizeObserver: ResizeObserver | null = null;\n\n const updateIsMobile = debounce(() => {\n if (typeof window !== 'undefined') {\n isMobile.value = window.innerWidth < 768;\n }\n }, 150);\n\n const syncSelectedTabForDesktop = (t: TabsItemType): void => {\n try {\n if (!isMobile.value && selectedTabId.value !== t.id) {\n const tabExists = filteredTabs.value.some(tab => tab.id === t.id);\n \n if (tabExists) {\n selectedTabId.value = t.id;\n emitTabChange();\n } else {\n resetToValidTabState();\n }\n }\n } catch (error) {\n console.error('[useTabs] Error in syncSelectedTabForDesktop:', error);\n resetToValidTabState();\n }\n };\n\n onMounted(() => {\n if (typeof window !== 'undefined') {\n if (window.ResizeObserver) {\n resizeObserver = new ResizeObserver(updateIsMobile);\n resizeObserver.observe(document.documentElement);\n } else {\n window.addEventListener('resize', updateIsMobile);\n }\n \n watch(isMobile, (newVal) => {\n if (!newVal) {\n nextTick(() => {\n if (selectedTab.value >= 0 && filteredTabs.value[selectedTab.value]) {\n syncSelectedTabForDesktop(filteredTabs.value[selectedTab.value]);\n }\n });\n }\n });\n }\n });\n\n onUnmounted(() => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n } else if (typeof window !== 'undefined') {\n window.removeEventListener('resize', updateIsMobile);\n }\n debouncedMouseEnter.cancel();\n debouncedMouseLeave.cancel();\n });\n\n const emitTabChange = debounce(() => {\n nextTick(() => {\n const index = filteredTabs.value.findIndex(t => t.id === selectedTabId.value);\n emit('tab-change', index >= 0 ? index : 0);\n });\n }, 100);\n\n const handleTabGroupTabChange = (index: number): void => {\n try {\n if (index < 0 || index >= filteredTabs.value.length) {\n console.warn('[useTabs] TabGroup provided out of bounds index:', index);\n return;\n }\n \n const tabObject = filteredTabs.value[index];\n if (tabObject) {\n if (selectedTabId.value !== tabObject.id) {\n selectedTabId.value = tabObject.id;\n emitTabChange();\n }\n }\n } catch (error) {\n console.error('[useTabs] Error in handleTabGroupTabChange:', error);\n }\n };\n\n // Simple tab lookup\n const getTabById = (id: string | number | null): TabsItemType | null => {\n if (id === null) return null;\n return filteredTabs.value.find(t => t.id === id) || null;\n };\n\n const selectedComponent = computed(() => {\n const tab = getTabById(selectedTabId.value);\n return tab?.component || null;\n });\n\n const selectedProps = computed(() => {\n const tab = getTabById(selectedTabId.value);\n return tab?.props ?? undefined;\n });\n\n const selectedEvents = computed(() => {\n const tab = getTabById(selectedTabId.value);\n return tab?.events ?? undefined;\n });\n\n const handleTabChange = (value: TabSelectItem | TabSelectItem[] | null): void => {\n if (value && !Array.isArray(value)) {\n if (selectedTabId.value !== value.id) {\n const tabExists = filteredTabs.value.some(t => t.id === value.id);\n \n if (tabExists) {\n selectedTabId.value = value.id;\n emitTabChange();\n } else {\n resetToValidTabState();\n }\n }\n } else {\n resetToValidTabState();\n }\n };\n\n // Watch for external tab prop changes\n watch(() => tab.value, (newTabIndex) => {\n try {\n if (filteredTabs.value.length === 0) {\n return;\n }\n \n if (typeof newTabIndex === 'number' && newTabIndex >= 0 && newTabIndex < filteredTabs.value.length) {\n const newTabId = filteredTabs.value[newTabIndex].id;\n if (selectedTabId.value !== newTabId) {\n selectedTabId.value = newTabId;\n }\n } else if (newTabIndex !== undefined && newTabIndex !== null) {\n resetToValidTabState();\n } else if (selectedTabId.value === null) {\n resetToValidTabState();\n }\n } catch (error) {\n console.error('[useTabs] Error updating tab:', error);\n resetToValidTabState();\n }\n }, { immediate: true });\n\n // When filtered tabs change, ensure we're using a valid tab\n watch(filteredTabs, (newTabs) => {\n if (newTabs.length > 0) {\n const currentTabStillExists = newTabs.some(t => t.id === selectedTabId.value);\n if (!currentTabStillExists) {\n resetToValidTabState();\n } else {\n updateParentWithCorrectTabIndex();\n }\n }\n }, { immediate: true });\n\n return {\n // State\n selectedTabId,\n selectedTab,\n selectedTabObject,\n filteredTabs,\n tabItemsForDropdown,\n hoverStates,\n isMobile,\n themeClasses,\n showHeading,\n dropdownOnMobile,\n fixedHeight,\n \n // Computed values\n selectedComponent,\n selectedProps,\n selectedEvents,\n \n // Methods\n mouseEnter,\n mouseLeave,\n handleTabChange,\n handleTabGroupTabChange,\n syncSelectedTabForDesktop,\n getTabById,\n resetToValidTabState,\n };\n}\n\n"],"names":["isObject","value","type","freeGlobal","freeSelf","root","now","reWhitespace","trimmedEndIndex","string","index","reTrimStart","baseTrim","Symbol","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","isOwn","tag","unmasked","result","objectToString","nullTag","undefinedTag","baseGetTag","isObjectLike","symbolTag","isSymbol","NAN","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","toNumber","other","isBinary","FUNC_ERROR_TEXT","nativeMax","nativeMin","debounce","func","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","toNoCase","str","useTabs","props","emit","tabGroup","computed","tab","tabs","showHeading","tabCountTheme","dropdownOnMobile","fixedHeight","dynamicTabs","hoverStates","shallowRef","debouncedMouseEnter","tabId","debouncedMouseLeave","mouseEnter","mouseLeave","themeClasses","themes","filteredTabs","groupName","t","tabItemsForDropdown","initialTabId","selectedTabId","ref","resetToValidTabState","firstTabId","nextTick","updateParentWithCorrectTabIndex","correctIndex","onMounted","actualTabIndex","selectedTab","selectedTabObject","isMobile","resizeObserver","updateIsMobile","syncSelectedTabForDesktop","emitTabChange","error","watch","newVal","onUnmounted","handleTabGroupTabChange","tabObject","getTabById","id","selectedComponent","selectedProps","selectedEvents","handleTabChange","newTabIndex","newTabId","newTabs"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTheme.js","sources":["../../src/composables/useTheme.ts"],"sourcesContent":["/**\n * useTheme - Composable for dynamic theme management\n * \n * Provides reactive theme state and methods to dynamically update\n * CSS variables for the entire component library's color scheme.\n * Also handles dark/light mode toggling.\n * \n * @module composables/useTheme\n */\nimport { ref, computed } from 'vue';\n\nexport interface ThemeColors {\n primary: string;\n primaryLight?: string;\n primaryDark?: string;\n}\n\nexport type ColorMode = 'light' | 'dark' | 'system';\n\ninterface RGBColor {\n r: number;\n g: number;\n b: number;\n}\n\n// Convert hex to RGB\nfunction hexToRgb(hex: string): RGBColor | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null;\n}\n\n// Generate color palette from a base color\nfunction generateColorPalette(baseHex: string): Record<string, string> {\n const rgb = hexToRgb(baseHex);\n if (!rgb) return {};\n\n // Generate shades from light (50) to dark (900)\n const shades: Record<number, { factor: number; saturation: number }> = {\n 50: { factor: 0.95, saturation: 0.2 },\n 100: { factor: 0.9, saturation: 0.3 },\n 200: { factor: 0.8, saturation: 0.4 },\n 300: { factor: 0.65, saturation: 0.6 },\n 400: { factor: 0.45, saturation: 0.8 },\n 500: { factor: 0.3, saturation: 1 }, // Base color adjusted\n 600: { factor: 0, saturation: 1 }, // Base color (600 as primary)\n 700: { factor: -0.2, saturation: 1 },\n 800: { factor: -0.4, saturation: 1 },\n 900: { factor: -0.6, saturation: 1 },\n };\n\n const palette: Record<string, string> = {};\n\n for (const [shade, { factor }] of Object.entries(shades)) {\n let r: number, g: number, b: number;\n\n if (factor > 0) {\n // Lighten\n r = Math.round(rgb.r + (255 - rgb.r) * factor);\n g = Math.round(rgb.g + (255 - rgb.g) * factor);\n b = Math.round(rgb.b + (255 - rgb.b) * factor);\n } else if (factor < 0) {\n // Darken\n r = Math.round(rgb.r * (1 + factor));\n g = Math.round(rgb.g * (1 + factor));\n b = Math.round(rgb.b * (1 + factor));\n } else {\n // Base color\n r = rgb.r;\n g = rgb.g;\n b = rgb.b;\n }\n\n // Clamp values\n r = Math.min(255, Math.max(0, r));\n g = Math.min(255, Math.max(0, g));\n b = Math.min(255, Math.max(0, b));\n\n palette[shade] = `${r} ${g} ${b}`;\n }\n\n return palette;\n}\n\n// Default stachelock colors (blue-purple)\nconst defaultColors = {\n 50: '237 239 249',\n 100: '219 223 242',\n 200: '184 191 230',\n 300: '148 158 217',\n 400: '113 126 205',\n 500: '77 94 192',\n 600: '62 75 154',\n 700: '46 56 115',\n 800: '31 38 77',\n 900: '15 19 38',\n};\n\n// State\nconst currentPrimaryColor = ref('#3e4b9a'); // Default stachelock blue\nconst isThemeModalOpen = ref(false);\n\n// Dark mode state - persisted to localStorage\nconst colorMode = ref<ColorMode>('system');\nconst isDark = ref(false);\n\n// Initialize dark mode from localStorage\nfunction initializeDarkMode(): void {\n if (typeof window === 'undefined') return;\n \n const stored = localStorage.getItem('sl-color-mode') as ColorMode | null;\n if (stored && ['light', 'dark', 'system'].includes(stored)) {\n colorMode.value = stored;\n }\n \n updateDarkMode();\n \n // Listen for system preference changes\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\n if (colorMode.value === 'system') {\n isDark.value = e.matches;\n applyDarkMode(isDark.value);\n }\n });\n}\n\n// Update dark mode based on current setting\nfunction updateDarkMode(): void {\n if (colorMode.value === 'system') {\n isDark.value = window.matchMedia('(prefers-color-scheme: dark)').matches;\n } else {\n isDark.value = colorMode.value === 'dark';\n }\n applyDarkMode(isDark.value);\n}\n\n// Apply dark mode to document\nfunction applyDarkMode(dark: boolean): void {\n if (typeof document === 'undefined') return;\n \n if (dark) {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n}\n\n// Set color mode\nfunction setColorMode(mode: ColorMode): void {\n colorMode.value = mode;\n localStorage.setItem('sl-color-mode', mode);\n updateDarkMode();\n}\n\n// Toggle between light and dark (skips system)\nfunction toggleDarkMode(): void {\n const newMode = isDark.value ? 'light' : 'dark';\n setColorMode(newMode);\n}\n\n// Cycle through all modes: light -> dark -> system\nfunction cycleColorMode(): void {\n const modes: ColorMode[] = ['light', 'dark', 'system'];\n const currentIndex = modes.indexOf(colorMode.value);\n const nextIndex = (currentIndex + 1) % modes.length;\n setColorMode(modes[nextIndex]);\n}\n\n// Preset themes\nexport const presetThemes = [\n { name: 'Stachelock Blue', color: '#3e4b9a', description: 'Default brand color' },\n { name: 'Forest Green', color: '#2d5a3d', description: 'Natural and calm' },\n { name: 'Sunset Orange', color: '#d4622a', description: 'Warm and energetic' },\n { name: 'Royal Purple', color: '#6b4c9a', description: 'Elegant and creative' },\n { name: 'Ocean Teal', color: '#1a7f8e', description: 'Fresh and modern' },\n { name: 'Berry Red', color: '#9b2c4d', description: 'Bold and passionate' },\n { name: 'Slate Gray', color: '#4a5568', description: 'Professional and neutral' },\n { name: 'Golden Brown', color: '#8b6914', description: 'Warm and trustworthy' },\n];\n\nexport function useTheme() {\n /**\n * Apply a primary color to all CSS variables\n */\n const applyTheme = (hexColor: string): void => {\n const palette = generateColorPalette(hexColor);\n const root = document.documentElement;\n\n // Apply primary color variables\n for (const [shade, rgbValue] of Object.entries(palette)) {\n root.style.setProperty(`--sl-color-primary-${shade}-rgb`, rgbValue);\n root.style.setProperty(`--sl-color-stachelock-${shade}-rgb`, rgbValue);\n }\n\n // Also set the hex values for components that need them\n const rgb = hexToRgb(hexColor);\n if (rgb) {\n root.style.setProperty('--sl-color-primary-600', hexColor);\n root.style.setProperty('--sl-color-stachelock-600', hexColor);\n \n // Set ring color\n root.style.setProperty('--sl-ring-color', hexColor);\n }\n\n currentPrimaryColor.value = hexColor;\n };\n\n /**\n * Reset to default stachelock theme\n */\n const resetTheme = (): void => {\n const root = document.documentElement;\n\n // Reset to default colors\n for (const [shade, rgbValue] of Object.entries(defaultColors)) {\n root.style.setProperty(`--sl-color-primary-${shade}-rgb`, rgbValue);\n root.style.setProperty(`--sl-color-stachelock-${shade}-rgb`, rgbValue);\n }\n\n root.style.setProperty('--sl-color-primary-600', '#3e4b9a');\n root.style.setProperty('--sl-color-stachelock-600', '#3e4b9a');\n root.style.setProperty('--sl-ring-color', '#3e4b9a');\n\n currentPrimaryColor.value = '#3e4b9a';\n };\n\n /**\n * Get current theme color\n */\n const getCurrentColor = computed(() => currentPrimaryColor.value);\n\n /**\n * Open/close theme modal\n */\n const openThemeModal = () => {\n isThemeModalOpen.value = true;\n };\n\n const closeThemeModal = () => {\n isThemeModalOpen.value = false;\n };\n\n // Initialize dark mode on first use\n if (typeof window !== 'undefined') {\n initializeDarkMode();\n }\n\n return {\n // Color theming\n currentPrimaryColor,\n isThemeModalOpen,\n applyTheme,\n resetTheme,\n getCurrentColor,\n openThemeModal,\n closeThemeModal,\n presetThemes,\n // Dark mode\n colorMode,\n isDark,\n setColorMode,\n toggleDarkMode,\n cycleColorMode,\n initializeDarkMode,\n };\n}\n\nexport default useTheme;\n\n"],"names":["hexToRgb","hex","result","generateColorPalette","baseHex","rgb","shades","palette","shade","factor","r","g","b","defaultColors","currentPrimaryColor","ref","isThemeModalOpen","colorMode","isDark","initializeDarkMode","stored","updateDarkMode","applyDarkMode","dark","setColorMode","mode","toggleDarkMode","newMode","cycleColorMode","modes","nextIndex","presetThemes","useTheme","applyTheme","hexColor","root","rgbValue","resetTheme","getCurrentColor","computed","openThemeModal","closeThemeModal"],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- import { ref as l, computed as g, provide as h, defineComponent as j, onMounted as b, onUnmounted as D, unref as O, inject as w } from "vue";
2
- import { i as x, A as y } from "./render-QUUPyNjX.js";
3
- let u = Symbol("DescriptionContext");
4
- function S() {
5
- let t = w(u, null);
6
- if (t === null) throw new Error("Missing parent");
7
- return t;
8
- }
9
- function P({ slot: t = l({}), name: i = "Description", props: s = {} } = {}) {
10
- let e = l([]);
11
- function n(r) {
12
- return e.value.push(r), () => {
13
- let o = e.value.indexOf(r);
14
- o !== -1 && e.value.splice(o, 1);
15
- };
16
- }
17
- return h(u, { register: n, slot: t, name: i, props: s }), g(() => e.value.length > 0 ? e.value.join(" ") : void 0);
18
- }
19
- j({ name: "Description", props: { as: { type: [Object, String], default: "p" }, id: { type: String, default: null } }, setup(t, { attrs: i, slots: s }) {
20
- var e;
21
- let n = (e = t.id) != null ? e : `headlessui-description-${x()}`, r = S();
22
- return b(() => D(r.register(n))), () => {
23
- let { name: o = "Description", slot: p = l({}), props: a = {} } = r, { ...c } = t, d = { ...Object.entries(a).reduce((f, [m, v]) => Object.assign(f, { [m]: O(v) }), {}), id: n };
24
- return y({ ourProps: d, theirProps: c, slot: p.value, attrs: i, slots: s, name: o });
25
- };
26
- } });
27
- export {
28
- P as k
29
- };
30
- //# sourceMappingURL=description-C7cRw0tq.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"description-C7cRw0tq.js","sources":["../node_modules/@headlessui/vue/dist/components/description/description.js"],"sourcesContent":["import{computed as x,defineComponent as y,inject as R,onMounted as v,onUnmounted as D,provide as j,ref as p,unref as C}from\"vue\";import{useId as h}from'../../hooks/use-id.js';import{render as b}from'../../utils/render.js';let u=Symbol(\"DescriptionContext\");function w(){let t=R(u,null);if(t===null)throw new Error(\"Missing parent\");return t}function k({slot:t=p({}),name:o=\"Description\",props:s={}}={}){let e=p([]);function r(n){return e.value.push(n),()=>{let i=e.value.indexOf(n);i!==-1&&e.value.splice(i,1)}}return j(u,{register:r,slot:t,name:o,props:s}),x(()=>e.value.length>0?e.value.join(\" \"):void 0)}let K=y({name:\"Description\",props:{as:{type:[Object,String],default:\"p\"},id:{type:String,default:null}},setup(t,{attrs:o,slots:s}){var n;let e=(n=t.id)!=null?n:`headlessui-description-${h()}`,r=w();return v(()=>D(r.register(e))),()=>{let{name:i=\"Description\",slot:l=p({}),props:d={}}=r,{...c}=t,f={...Object.entries(d).reduce((a,[g,m])=>Object.assign(a,{[g]:C(m)}),{}),id:e};return b({ourProps:f,theirProps:c,slot:l.value,attrs:o,slots:s,name:i})}}});export{K as Description,k as useDescriptions};\n"],"names":["w","R","k","p","o","r","n","i","j","x","y","e","h","v","D","l","d","f","a","g","m","C","b"],"mappings":";;AAA8N,IAAI,IAAE,OAAO,oBAAoB;AAAE,SAASA,IAAG;AAAC,MAAI,IAAEC,EAAE,GAAE,IAAI;AAAE,MAAG,MAAI,KAAK,OAAM,IAAI,MAAM,gBAAgB;AAAE,SAAO;AAAC;AAAC,SAASC,EAAE,EAAC,MAAK,IAAEC,EAAE,EAAE,GAAE,MAAKC,IAAE,eAAc,OAAM,IAAE,CAAA,EAAE,IAAE,CAAA,GAAG;AAAC,MAAI,IAAED,EAAE,EAAE;AAAE,WAASE,EAAEC,GAAE;AAAC,WAAO,EAAE,MAAM,KAAKA,CAAC,GAAE,MAAI;AAAC,UAAIC,IAAE,EAAE,MAAM,QAAQD,CAAC;AAAE,MAAAC,MAAI,MAAI,EAAE,MAAM,OAAOA,GAAE,CAAC;AAAA,IAAC;AAAA,EAAC;AAAC,SAAOC,EAAE,GAAE,EAAC,UAASH,GAAE,MAAK,GAAE,MAAKD,GAAE,OAAM,EAAC,CAAC,GAAEK,EAAE,MAAI,EAAE,MAAM,SAAO,IAAE,EAAE,MAAM,KAAK,GAAG,IAAE,MAAM;AAAC;AAAOC,EAAE,EAAC,MAAK,eAAc,OAAM,EAAC,IAAG,EAAC,MAAK,CAAC,QAAO,MAAM,GAAE,SAAQ,IAAG,GAAE,IAAG,EAAC,MAAK,QAAO,SAAQ,KAAI,EAAC,GAAE,MAAM,GAAE,EAAC,OAAMN,GAAE,OAAM,EAAC,GAAE;AAAC,MAAIE;AAAE,MAAIK,KAAGL,IAAE,EAAE,OAAK,OAAKA,IAAE,0BAA0BM,GAAG,IAAG,IAAEZ,EAAC;AAAG,SAAOa,EAAE,MAAIC,EAAE,EAAE,SAASH,CAAC,CAAC,CAAC,GAAE,MAAI;AAAC,QAAG,EAAC,MAAKJ,IAAE,eAAc,MAAKQ,IAAEZ,EAAE,CAAA,CAAE,GAAE,OAAMa,IAAE,CAAA,EAAE,IAAE,GAAE,EAAC,GAAG,EAAC,IAAE,GAAEC,IAAE,EAAC,GAAG,OAAO,QAAQD,CAAC,EAAE,OAAO,CAACE,GAAE,CAACC,GAAEC,CAAC,MAAI,OAAO,OAAOF,GAAE,EAAC,CAACC,CAAC,GAAEE,EAAED,CAAC,EAAC,CAAC,GAAE,CAAA,CAAE,GAAE,IAAGT,EAAC;AAAE,WAAOW,EAAE,EAAC,UAASL,GAAE,YAAW,GAAE,MAAKF,EAAE,OAAM,OAAMX,GAAE,OAAM,GAAE,MAAKG,EAAC,CAAC;AAAA,EAAC;AAAC,EAAC,CAAC;","x_google_ignoreList":[0]}