@leavepulse/ui 0.43.4 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/README.md +121 -7
  2. package/dist/assets/{LpCommandPalette-B-0Est4Z.css → LpCommandPalette-nGNnzXqQ.css} +21 -21
  3. package/dist/assets/{LpDropzone-BBoWvi-J.css → LpDropzone-i4BdMi1H.css} +12 -12
  4. package/dist/assets/{LpImageEditor-Ct7Y3aNu.css → LpImageEditor-CbMA82g8.css} +6 -6
  5. package/dist/assets/{LpRollingText-CR1mb0Vt.css → LpRollingText-BGnE6q9j.css} +3 -0
  6. package/dist/assets/{LpShortcutsDialog-C6YoQ8_M.css → LpShortcutsDialog-CqYX3yy6.css} +28 -7
  7. package/dist/assets/{LpSkeleton-D7xU8IPV.css → LpSkeleton-H3Z5dEIk.css} +4 -1
  8. package/dist/assets/{LpTable-BgPLJOXa.css → LpTable-CPwWxTJS.css} +49 -9
  9. package/dist/chunks/ContextMenuItems-BtKU7074.js +124 -0
  10. package/dist/chunks/{LayoutCanvas-Dd20boUG.js → LayoutCanvas-BkaGXTjx.js} +26 -9
  11. package/dist/chunks/{LayoutNode-DGpZA9LX.js → LayoutNode-B3_9E1Xa.js} +28 -12
  12. package/dist/chunks/{LpActionBar-BlvtGB2P.js → LpActionBar-CnfFVIwC.js} +26 -12
  13. package/dist/chunks/{LpAddressInput-B-Zvxsn7.js → LpAddressInput-BwX8uo4_.js} +54 -49
  14. package/dist/chunks/{LpAlert-BAYHDSS1.js → LpAlert-B6ilrM7T.js} +16 -9
  15. package/dist/chunks/{LpAppShell-BGQVIY-3.js → LpAppShell-C53_RaGF.js} +53 -26
  16. package/dist/chunks/{LpAutocomplete-DExlIZe_.js → LpAutocomplete-C8IgSMsi.js} +52 -24
  17. package/dist/chunks/{LpAvatar-B3-xAOH3.js → LpAvatar-C1XStdOo.js} +19 -10
  18. package/dist/chunks/LpBreadcrumbs-CQJd73Gm.js +95 -0
  19. package/dist/chunks/{LpButton-5VXXCjwF.js → LpButton-CKSwC6Mu.js} +45 -15
  20. package/dist/chunks/{LpCalendar-B7Ko5RdR.js → LpCalendar-DrA2McTU.js} +1 -1
  21. package/dist/chunks/{LpCard-BhI1N_vL.js → LpCard-C2IvucmX.js} +1 -1
  22. package/dist/chunks/{LpCheckbox-CVccKYaH.js → LpCheckbox-Bkj13CbW.js} +8 -4
  23. package/dist/chunks/{LpCodeBlock-Bo0B4TFR.js → LpCodeBlock-ca7ANFyW.js} +49 -17
  24. package/dist/chunks/{LpColorPicker-BlXea7LM.js → LpColorPicker-zz4VGkG4.js} +75 -26
  25. package/dist/chunks/{LpConfirmDialog-Q-bxff8z.js → LpConfirmDialog-DCw5jR1t.js} +59 -17
  26. package/dist/chunks/LpConfirmHost-CbywMpMP.js +49 -0
  27. package/dist/chunks/LpContextMenu-BqkAYa9X.js +69 -0
  28. package/dist/chunks/LpDatePicker-DuusgT69.js +195 -0
  29. package/dist/chunks/LpDateRangePicker-DHeuznfC.js +208 -0
  30. package/dist/chunks/{LpDisclosure-ChQYmjlR.js → LpDisclosure-Cc23-JOT.js} +1 -1
  31. package/dist/chunks/{LpDrawer-BZ6k3hvo.js → LpDrawer-Dt4aB4Fr.js} +65 -28
  32. package/dist/chunks/{LpDropdownMenu-DJpoqRCb.js → LpDropdownMenu-DdJGQzPn.js} +2 -1
  33. package/dist/chunks/{LpEmptyState-Dsdqz1Wj.js → LpEmptyState-BJbZXC8D.js} +1 -1
  34. package/dist/chunks/LpFieldNotice-wtieLUTj.js +64 -0
  35. package/dist/chunks/{LpFileTree-_5vFBgaK.js → LpFileTree-CNurOvkV.js} +25 -10
  36. package/dist/chunks/{LpFileTreeNode-BdcIYKIE.js → LpFileTreeNode-D_qRRdsH.js} +3 -3
  37. package/dist/chunks/LpFormField-CtVYj6tO.js +101 -0
  38. package/dist/chunks/{LpIcon-CCnX5_2j.js → LpIcon-DYtaid0K.js} +20 -6
  39. package/dist/chunks/{LpInput-9EXWUM9B.js → LpInput-D-YGQbEv.js} +58 -20
  40. package/dist/chunks/{LpLightbox-2sYVMY-S.js → LpLightbox-DSDahF23.js} +148 -61
  41. package/dist/chunks/{LpLink-DCND-zyu.js → LpLink-Krkjhe_y.js} +15 -6
  42. package/dist/chunks/{LpLogViewer-CaRy5MeS.js → LpLogViewer-KypbgOyo.js} +300 -72
  43. package/dist/chunks/{LpMapPicker-ul4oYno6.js → LpMapPicker-Cc84LaM3.js} +39 -14
  44. package/dist/chunks/{LpMediaGallery-FF-NquIo.js → LpMediaGallery-YKr-cQPN.js} +7 -4
  45. package/dist/chunks/{LpModal-Bt0pQCI_.js → LpModal-DMMDQHAu.js} +52 -29
  46. package/dist/chunks/{LpModalNav-YaifHrXC.js → LpModalNav-BVPDyIup.js} +10 -7
  47. package/dist/chunks/{LpNotificationBell-DyGGsMAM.js → LpNotificationBell-CCwyJP5C.js} +79 -33
  48. package/dist/chunks/{LpNumberField-CWuX08iX.js → LpNumberField-B77O-z28.js} +21 -8
  49. package/dist/chunks/{LpNumberFlow-amWYaeuA.js → LpNumberFlow-z4WPZcZu.js} +22 -12
  50. package/dist/chunks/{LpOtpInput-y2v-pmiN.js → LpOtpInput-CziPF3Oq.js} +37 -8
  51. package/dist/chunks/{LpPagination-5FxjmmB5.js → LpPagination-BcDlo3r_.js} +31 -20
  52. package/dist/chunks/{LpPasswordInput--sjYCkLS.js → LpPasswordInput-eKzQhbQP.js} +11 -8
  53. package/dist/chunks/LpPhoneInput-BCbrrhgE.js +336 -0
  54. package/dist/chunks/{LpPie-D6OnzwlJ.js → LpPie-BEJ2SfI6.js} +84 -28
  55. package/dist/chunks/{LpPopover-8268UmlC.js → LpPopover-DCKeqiVn.js} +5 -2
  56. package/dist/chunks/{LpProgress-Btq5W4Ut.js → LpProgress-CBU1iI69.js} +5 -4
  57. package/dist/chunks/{LpRadioGroup-xPIuVDO_.js → LpRadioGroup-DmEW0l78.js} +9 -2
  58. package/dist/chunks/LpRangeCalendar-DZuaRV0W.js +331 -0
  59. package/dist/chunks/{LpRollingText-CM5gkSeF.js → LpRollingText-DB7upf-5.js} +1 -1
  60. package/dist/chunks/{LpScrollArea-D8xyKXcF.js → LpScrollArea-Bry1fdOM.js} +14 -2
  61. package/dist/chunks/{LpSection-aM6J_u51.js → LpSection-tKEH0jYf.js} +1 -1
  62. package/dist/chunks/{LpSegmented-fV0Sk92p.js → LpSegmented-C09EEam2.js} +8 -4
  63. package/dist/chunks/{LpSelect-ANIVtrpM.js → LpSelect-DNIL6MB9.js} +50 -31
  64. package/dist/chunks/{LpSidebar-ClBUwoEz.js → LpSidebar-CQNB0-yU.js} +30 -22
  65. package/dist/chunks/{LpSidebarNav-llOcs_Fn.js → LpSidebarNav-kx-LdqNU.js} +16 -11
  66. package/dist/chunks/{LpSkeleton-CTI-vBgW.js → LpSkeleton-BB6XIV-w.js} +1 -1
  67. package/dist/chunks/{LpSlider-BwNIBkAK.js → LpSlider-Cuzmrd7p.js} +7 -2
  68. package/dist/chunks/{LpSparkline-C6xQ2dwv.js → LpSparkline-CB80N8SJ.js} +11 -4
  69. package/dist/chunks/{LpStat-CQaW8R--.js → LpStat-B-7udBRP.js} +2 -2
  70. package/dist/chunks/{LpStepper-Bk-XaQYU.js → LpStepper-C7XiVKZj.js} +34 -19
  71. package/dist/chunks/{LpSwitch-Blizvqyt.js → LpSwitch-OrcOJX9m.js} +41 -27
  72. package/dist/chunks/LpTableFilter-BV8PpLM9.js +158 -0
  73. package/dist/chunks/{LpTableOfContents-CjvxPMpU.js → LpTableOfContents-BUcAfGPQ.js} +36 -41
  74. package/dist/chunks/{LpTabs-Cefe_lys.js → LpTabs-29iW1XOx.js} +20 -6
  75. package/dist/chunks/LpTagsInput-D1SuqbhB.js +300 -0
  76. package/dist/chunks/LpTextarea-uuScWo6-.js +77 -0
  77. package/dist/chunks/LpThemeProvider-Be4r2TQX.js +35 -0
  78. package/dist/chunks/LpThemeSwitcher-B4aVPbNC.js +166 -0
  79. package/dist/chunks/{LpTilt-DuyKbpkA.js → LpTilt-B7KHX1zH.js} +2 -2
  80. package/dist/chunks/{LpTimeField-K6nAGboX.js → LpTimeField-Cqe7fXnh.js} +14 -8
  81. package/dist/chunks/{LpToaster-gDB1EaU3.js → LpToaster-DpJvoCOh.js} +94 -31
  82. package/dist/chunks/{LpTooltip-hCLPAqMG.js → LpTooltip-CXVKcOXT.js} +14 -6
  83. package/dist/chunks/LpTooltipProvider-CftjV7Xc.js +25 -0
  84. package/dist/chunks/{LpTopologyCanvas-Cm1L39uL.js → LpTopologyCanvas-6ozNrQKh.js} +8 -2
  85. package/dist/chunks/{LpUptimeBar-DvAMno0S.js → LpUptimeBar-ugcv25xj.js} +44 -15
  86. package/dist/chunks/icons-CkA0njzm.js +43 -0
  87. package/dist/chunks/{LpThemeSwitcher-Cue-myST.js → useTheme-DJm1JSsY.js} +215 -260
  88. package/dist/component-names.d.ts +1 -1
  89. package/dist/components/ContextMenuItems.vue.d.ts +8 -0
  90. package/dist/components/ContextMenuItems.vue.js +4 -0
  91. package/dist/components/LayoutCanvas.vue.js +1 -1
  92. package/dist/components/LayoutNode.vue.d.ts +4 -0
  93. package/dist/components/LayoutNode.vue.js +1 -1
  94. package/dist/components/LpActionBar.vue.d.ts +3 -0
  95. package/dist/components/LpActionBar.vue.js +1 -1
  96. package/dist/components/LpAddressInput.vue.d.ts +1 -1
  97. package/dist/components/LpAddressInput.vue.js +1 -1
  98. package/dist/components/LpAlert.vue.d.ts +9 -0
  99. package/dist/components/LpAlert.vue.js +1 -1
  100. package/dist/components/LpAppShell.vue.d.ts +10 -0
  101. package/dist/components/LpAppShell.vue.js +1 -1
  102. package/dist/components/LpAutocomplete.vue.d.ts +31 -6
  103. package/dist/components/LpAutocomplete.vue.js +1 -1
  104. package/dist/components/LpAvatar.vue.d.ts +3 -3
  105. package/dist/components/LpAvatar.vue.js +1 -1
  106. package/dist/components/LpBadge.vue.d.ts +2 -2
  107. package/dist/components/LpBreadcrumbs.vue.d.ts +13 -9
  108. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  109. package/dist/components/LpButton.vue.d.ts +35 -98
  110. package/dist/components/LpButton.vue.js +1 -1
  111. package/dist/components/LpCalendar.vue.js +1 -1
  112. package/dist/components/LpCard.vue.js +1 -1
  113. package/dist/components/LpChart.vue.d.ts +47 -3
  114. package/dist/components/LpChart.vue.js +377 -97
  115. package/dist/components/LpCheckbox.vue.js +1 -1
  116. package/dist/components/LpCodeBlock.vue.d.ts +2 -0
  117. package/dist/components/LpCodeBlock.vue.js +1 -1
  118. package/dist/components/LpColorPicker.vue.d.ts +2 -2
  119. package/dist/components/LpColorPicker.vue.js +1 -1
  120. package/dist/components/LpCommandPalette.vue.d.ts +14 -3
  121. package/dist/components/LpCommandPalette.vue.js +142 -77
  122. package/dist/components/LpConfirmDialog.vue.d.ts +15 -3
  123. package/dist/components/LpConfirmDialog.vue.js +1 -1
  124. package/dist/components/LpConfirmHost.vue.d.ts +9 -0
  125. package/dist/components/LpConfirmHost.vue.js +4 -0
  126. package/dist/components/LpContextMenu.vue.d.ts +3 -5
  127. package/dist/components/LpContextMenu.vue.js +1 -1
  128. package/dist/components/LpDatePicker.vue.d.ts +24 -6
  129. package/dist/components/LpDatePicker.vue.js +1 -1
  130. package/dist/components/LpDateRangePicker.vue.d.ts +60 -0
  131. package/dist/components/LpDateRangePicker.vue.js +4 -0
  132. package/dist/components/LpDisclosure.vue.js +1 -1
  133. package/dist/components/LpDrawer.vue.d.ts +10 -0
  134. package/dist/components/LpDrawer.vue.js +1 -1
  135. package/dist/components/LpDropdownMenu.vue.js +1 -1
  136. package/dist/components/LpDropzone.vue.js +23 -7
  137. package/dist/components/LpEmptyState.vue.js +1 -1
  138. package/dist/components/LpFieldNotice.vue.d.ts +8 -0
  139. package/dist/components/LpFieldNotice.vue.js +4 -0
  140. package/dist/components/LpFileTree.vue.d.ts +11 -2
  141. package/dist/components/LpFileTree.vue.js +1 -1
  142. package/dist/components/LpFileTreeNode.vue.js +1 -1
  143. package/dist/components/LpFormField.vue.d.ts +13 -1
  144. package/dist/components/LpFormField.vue.js +1 -1
  145. package/dist/components/LpIcon.vue.d.ts +0 -1
  146. package/dist/components/LpIcon.vue.js +1 -1
  147. package/dist/components/LpImageEditor.vue.js +93 -58
  148. package/dist/components/LpInput.vue.d.ts +22 -3
  149. package/dist/components/LpInput.vue.js +1 -1
  150. package/dist/components/LpLightbox.vue.d.ts +17 -0
  151. package/dist/components/LpLightbox.vue.js +1 -1
  152. package/dist/components/LpLink.vue.d.ts +11 -11
  153. package/dist/components/LpLink.vue.js +1 -1
  154. package/dist/components/LpLogViewer.vue.d.ts +72 -3
  155. package/dist/components/LpLogViewer.vue.js +1 -1
  156. package/dist/components/LpMapPicker.vue.d.ts +4 -4
  157. package/dist/components/LpMapPicker.vue.js +1 -1
  158. package/dist/components/LpMediaGallery.vue.js +1 -1
  159. package/dist/components/LpModal.vue.d.ts +16 -6
  160. package/dist/components/LpModal.vue.js +1 -1
  161. package/dist/components/LpModalNav.vue.d.ts +0 -1
  162. package/dist/components/LpModalNav.vue.js +1 -1
  163. package/dist/components/LpNotificationBell.vue.d.ts +11 -2
  164. package/dist/components/LpNotificationBell.vue.js +1 -1
  165. package/dist/components/LpNumberField.vue.d.ts +2 -0
  166. package/dist/components/LpNumberField.vue.js +1 -1
  167. package/dist/components/LpNumberFlow.vue.js +1 -1
  168. package/dist/components/LpOtpInput.vue.js +1 -1
  169. package/dist/components/LpPagination.vue.d.ts +2 -0
  170. package/dist/components/LpPagination.vue.js +1 -1
  171. package/dist/components/LpPasswordInput.vue.js +1 -1
  172. package/dist/components/LpPhoneInput.vue.d.ts +13 -0
  173. package/dist/components/LpPhoneInput.vue.js +1 -1
  174. package/dist/components/LpPie.vue.d.ts +21 -2
  175. package/dist/components/LpPie.vue.js +1 -1
  176. package/dist/components/LpPopover.vue.d.ts +2 -0
  177. package/dist/components/LpPopover.vue.js +1 -1
  178. package/dist/components/LpProgress.vue.d.ts +1 -1
  179. package/dist/components/LpProgress.vue.js +1 -1
  180. package/dist/components/LpRadioGroup.vue.js +1 -1
  181. package/dist/components/LpRangeCalendar.vue.d.ts +51 -0
  182. package/dist/components/LpRangeCalendar.vue.js +4 -0
  183. package/dist/components/LpRollingText.vue.d.ts +1 -1
  184. package/dist/components/LpRollingText.vue.js +1 -1
  185. package/dist/components/LpScrollArea.vue.d.ts +2 -2
  186. package/dist/components/LpScrollArea.vue.js +1 -1
  187. package/dist/components/LpSection.vue.d.ts +1 -1
  188. package/dist/components/LpSection.vue.js +1 -1
  189. package/dist/components/LpSegmented.vue.d.ts +5 -0
  190. package/dist/components/LpSegmented.vue.js +1 -1
  191. package/dist/components/LpSelect.vue.d.ts +1 -0
  192. package/dist/components/LpSelect.vue.js +1 -1
  193. package/dist/components/LpShortcutsDialog.vue.d.ts +7 -1
  194. package/dist/components/LpShortcutsDialog.vue.js +60 -15
  195. package/dist/components/LpSidebar.vue.d.ts +6 -2
  196. package/dist/components/LpSidebar.vue.js +1 -1
  197. package/dist/components/LpSidebarNav.vue.js +1 -1
  198. package/dist/components/LpSkeleton.vue.js +1 -1
  199. package/dist/components/LpSlider.vue.js +1 -1
  200. package/dist/components/LpSparkline.vue.d.ts +1 -0
  201. package/dist/components/LpSparkline.vue.js +1 -1
  202. package/dist/components/LpStat.vue.js +1 -1
  203. package/dist/components/LpStepper.vue.js +1 -1
  204. package/dist/components/LpSwitch.vue.js +1 -1
  205. package/dist/components/LpTable.vue.d.ts +107 -3
  206. package/dist/components/LpTable.vue.js +540 -128
  207. package/dist/components/LpTableFilter.vue.d.ts +31 -0
  208. package/dist/components/LpTableFilter.vue.js +4 -0
  209. package/dist/components/LpTableOfContents.vue.d.ts +4 -2
  210. package/dist/components/LpTableOfContents.vue.js +1 -1
  211. package/dist/components/LpTabs.vue.d.ts +2 -0
  212. package/dist/components/LpTabs.vue.js +1 -1
  213. package/dist/components/LpTagsInput.vue.d.ts +77 -0
  214. package/dist/components/LpTagsInput.vue.js +4 -0
  215. package/dist/components/LpTextarea.vue.d.ts +19 -6
  216. package/dist/components/LpTextarea.vue.js +1 -1
  217. package/dist/components/LpThemeProvider.vue.d.ts +22 -0
  218. package/dist/components/LpThemeProvider.vue.js +4 -0
  219. package/dist/components/LpThemeSwitcher.vue.d.ts +15 -2
  220. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  221. package/dist/components/LpTilt.vue.js +1 -1
  222. package/dist/components/LpTimeField.vue.js +1 -1
  223. package/dist/components/LpToaster.vue.d.ts +6 -1
  224. package/dist/components/LpToaster.vue.js +1 -1
  225. package/dist/components/LpTooltip.vue.d.ts +1 -2
  226. package/dist/components/LpTooltip.vue.js +1 -1
  227. package/dist/components/LpTooltipProvider.vue.d.ts +22 -0
  228. package/dist/components/LpTooltipProvider.vue.js +4 -0
  229. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  230. package/dist/components/LpUptimeBar.vue.d.ts +4 -0
  231. package/dist/components/LpUptimeBar.vue.js +1 -1
  232. package/dist/components/chart.d.ts +32 -1
  233. package/dist/components/chart.js +42 -6
  234. package/dist/components/codeHighlight.d.ts +6 -0
  235. package/dist/components/codeHighlight.js +92 -20
  236. package/dist/components/color.d.ts +1 -1
  237. package/dist/components/color.js +20 -9
  238. package/dist/components/commandSearch.js +3 -0
  239. package/dist/components/confirm.d.ts +25 -0
  240. package/dist/components/confirm.js +26 -0
  241. package/dist/components/countries.d.ts +6 -0
  242. package/dist/components/countries.js +7 -0
  243. package/dist/components/dateRange.d.ts +43 -0
  244. package/dist/components/dateRange.js +76 -0
  245. package/dist/components/exportData.d.ts +58 -0
  246. package/dist/components/exportData.js +165 -0
  247. package/dist/components/fileTree.js +16 -7
  248. package/dist/components/imageCrop.d.ts +42 -0
  249. package/dist/components/imageCrop.js +47 -0
  250. package/dist/components/link.d.ts +12 -0
  251. package/dist/components/link.js +19 -0
  252. package/dist/components/logSearch.d.ts +18 -0
  253. package/dist/components/logSearch.js +36 -0
  254. package/dist/components/modalDepth.d.ts +18 -2
  255. package/dist/components/modalDepth.js +17 -5
  256. package/dist/components/otp.d.ts +5 -0
  257. package/dist/components/otp.js +10 -0
  258. package/dist/components/phone.d.ts +41 -0
  259. package/dist/components/phone.js +80 -0
  260. package/dist/components/sidebar.d.ts +7 -1
  261. package/dist/components/tableFilter.d.ts +36 -0
  262. package/dist/components/tableFilter.js +84 -0
  263. package/dist/components/tableSort.d.ts +8 -0
  264. package/dist/components/tableSort.js +31 -0
  265. package/dist/components/tags.d.ts +20 -0
  266. package/dist/components/tags.js +37 -0
  267. package/dist/composables/useField.d.ts +38 -0
  268. package/dist/composables/useField.js +45 -0
  269. package/dist/composables/useFieldNotice.d.ts +17 -0
  270. package/dist/composables/useFieldNotice.js +28 -0
  271. package/dist/composables/useForm.d.ts +53 -0
  272. package/dist/composables/useForm.js +207 -0
  273. package/dist/composables/useFormDraft.d.ts +10 -3
  274. package/dist/composables/useFormDraft.js +9 -14
  275. package/dist/composables/useHotkeys.d.ts +81 -5
  276. package/dist/composables/useHotkeys.js +223 -25
  277. package/dist/composables/useInputFilter.d.ts +17 -0
  278. package/dist/composables/useInputFilter.js +47 -10
  279. package/dist/composables/useInputMask.d.ts +59 -0
  280. package/dist/composables/useInputMask.js +170 -0
  281. package/dist/composables/useLpConfig.d.ts +24 -0
  282. package/dist/composables/useLpConfig.js +44 -0
  283. package/dist/composables/usePaintSelect.d.ts +22 -0
  284. package/dist/composables/usePaintSelect.js +169 -0
  285. package/dist/composables/useRovingFocus.js +7 -0
  286. package/dist/composables/useShift.js +7 -2
  287. package/dist/composables/useTilt.d.ts +2 -2
  288. package/dist/composables/useTilt.js +5 -6
  289. package/dist/composables/useToast.d.ts +20 -0
  290. package/dist/composables/useToast.js +28 -4
  291. package/dist/composables/useZoomPan.d.ts +3 -3
  292. package/dist/composables/useZoomPan.js +4 -4
  293. package/dist/icons-all.d.ts +1 -0
  294. package/dist/icons-all.js +3 -0
  295. package/dist/icons.d.ts +14 -1
  296. package/dist/index.d.ts +60 -4
  297. package/dist/index.js +245 -141
  298. package/dist/kit-icons.d.ts +2 -0
  299. package/dist/layout/tree.d.ts +2 -0
  300. package/dist/layout/tree.js +16 -1
  301. package/dist/layout/useLayout.d.ts +15 -0
  302. package/dist/layout/useLayout.js +41 -14
  303. package/dist/theme/backdrop.d.ts +12 -0
  304. package/dist/theme/presets.d.ts +0 -2
  305. package/dist/theme/useTheme.d.ts +32 -9
  306. package/package.json +18 -8
  307. package/src/component-names.ts +9 -7
  308. package/src/components/ContextMenuItems.vue +88 -0
  309. package/src/components/LayoutCanvas.vue +26 -6
  310. package/src/components/LayoutNode.vue +30 -4
  311. package/src/components/LpActionBar.vue +31 -8
  312. package/src/components/LpAddressInput.vue +57 -41
  313. package/src/components/LpAlert.vue +16 -3
  314. package/src/components/LpAppShell.vue +45 -12
  315. package/src/components/LpAutocomplete.vue +47 -10
  316. package/src/components/LpAvatar.vue +20 -6
  317. package/src/components/LpBreadcrumbs.vue +65 -41
  318. package/src/components/LpButton.vue +60 -14
  319. package/src/components/LpChart.vue +351 -28
  320. package/src/components/LpCheckbox.vue +7 -3
  321. package/src/components/LpCodeBlock.vue +50 -14
  322. package/src/components/LpColorPicker.vue +73 -10
  323. package/src/components/LpCommandPalette.vue +115 -20
  324. package/src/components/LpConfirmDialog.vue +68 -17
  325. package/src/components/LpConfirmHost.vue +59 -0
  326. package/src/components/LpContextMenu.vue +15 -116
  327. package/src/components/LpDatePicker.vue +104 -68
  328. package/src/components/LpDateRangePicker.vue +224 -0
  329. package/src/components/LpDrawer.vue +56 -19
  330. package/src/components/LpDropdownMenu.vue +1 -0
  331. package/src/components/LpDropzone.vue +21 -4
  332. package/src/components/LpFieldNotice.vue +65 -0
  333. package/src/components/LpFileTree.vue +33 -7
  334. package/src/components/LpFormField.vue +59 -7
  335. package/src/components/LpIcon.vue +22 -4
  336. package/src/components/LpImageEditor.vue +96 -57
  337. package/src/components/LpInput.vue +62 -11
  338. package/src/components/LpLightbox.vue +140 -29
  339. package/src/components/LpLink.vue +24 -13
  340. package/src/components/LpLogViewer.vue +311 -39
  341. package/src/components/LpMapPicker.vue +36 -13
  342. package/src/components/LpMediaGallery.vue +8 -2
  343. package/src/components/LpModal.vue +54 -28
  344. package/src/components/LpModalNav.vue +5 -2
  345. package/src/components/LpNotificationBell.vue +77 -23
  346. package/src/components/LpNumberField.vue +21 -6
  347. package/src/components/LpNumberFlow.vue +26 -10
  348. package/src/components/LpOtpInput.vue +43 -8
  349. package/src/components/LpPagination.vue +23 -7
  350. package/src/components/LpPasswordInput.vue +4 -1
  351. package/src/components/LpPhoneInput.vue +224 -39
  352. package/src/components/LpPie.vue +102 -20
  353. package/src/components/LpPopover.vue +4 -0
  354. package/src/components/LpProgress.vue +5 -3
  355. package/src/components/LpRadioGroup.vue +9 -2
  356. package/src/components/LpRangeCalendar.vue +365 -0
  357. package/src/components/LpRollingText.vue +3 -0
  358. package/src/components/LpScrollArea.vue +22 -2
  359. package/src/components/LpSegmented.vue +12 -2
  360. package/src/components/LpSelect.vue +0 -0
  361. package/src/components/LpShortcutsDialog.vue +83 -9
  362. package/src/components/LpSidebar.vue +14 -9
  363. package/src/components/LpSidebarNav.vue +17 -5
  364. package/src/components/LpSkeleton.vue +4 -1
  365. package/src/components/LpSlider.vue +7 -1
  366. package/src/components/LpSparkline.vue +11 -3
  367. package/src/components/LpStepper.vue +23 -10
  368. package/src/components/LpSwitch.vue +31 -8
  369. package/src/components/LpTable.vue +668 -90
  370. package/src/components/LpTableFilter.vue +175 -0
  371. package/src/components/LpTableOfContents.vue +50 -32
  372. package/src/components/LpTabs.vue +23 -6
  373. package/src/components/LpTagsInput.vue +364 -0
  374. package/src/components/LpTextarea.vue +44 -6
  375. package/src/components/LpThemeProvider.vue +41 -0
  376. package/src/components/LpThemeSwitcher.vue +76 -33
  377. package/src/components/LpTilt.vue +2 -2
  378. package/src/components/LpTimeField.vue +14 -3
  379. package/src/components/LpToaster.vue +115 -27
  380. package/src/components/LpTooltip.vue +29 -5
  381. package/src/components/LpTooltipProvider.vue +24 -0
  382. package/src/components/LpTopologyCanvas.vue +19 -2
  383. package/src/components/LpUptimeBar.vue +46 -8
  384. package/src/components/chart.ts +82 -8
  385. package/src/components/codeHighlight.ts +111 -15
  386. package/src/components/color.ts +30 -9
  387. package/src/components/commandSearch.ts +6 -0
  388. package/src/components/confirm.ts +58 -0
  389. package/src/components/countries.ts +12 -0
  390. package/src/components/dateRange.ts +134 -0
  391. package/src/components/exportData.ts +228 -0
  392. package/src/components/fileTree.ts +19 -7
  393. package/src/components/imageCrop.ts +107 -0
  394. package/src/components/link.ts +34 -0
  395. package/src/components/logSearch.ts +46 -0
  396. package/src/components/modalDepth.ts +48 -6
  397. package/src/components/otp.ts +16 -0
  398. package/src/components/phone.ts +140 -0
  399. package/src/components/sidebar.ts +7 -1
  400. package/src/components/tableFilter.ts +122 -0
  401. package/src/components/tableSort.ts +37 -0
  402. package/src/components/tags.ts +62 -0
  403. package/src/composables/useField.ts +83 -0
  404. package/src/composables/useFieldNotice.ts +59 -0
  405. package/src/composables/useForm.ts +314 -0
  406. package/src/composables/useFormDraft.ts +25 -20
  407. package/src/composables/useHotkeys.ts +355 -28
  408. package/src/composables/useInputFilter.ts +77 -14
  409. package/src/composables/useInputMask.ts +254 -0
  410. package/src/composables/useLpConfig.ts +87 -0
  411. package/src/composables/usePaintSelect.ts +243 -0
  412. package/src/composables/useRovingFocus.ts +11 -0
  413. package/src/composables/useShift.ts +13 -2
  414. package/src/composables/useTilt.ts +5 -6
  415. package/src/composables/useToast.ts +56 -4
  416. package/src/composables/useZoomPan.ts +6 -6
  417. package/src/iconSubset.d.mts +10 -0
  418. package/src/iconSubset.mjs +51 -0
  419. package/src/icons-all.ts +10 -0
  420. package/src/icons.ts +59 -8
  421. package/src/index.ts +73 -4
  422. package/src/kit-icons.ts +5 -0
  423. package/src/layout/tree.ts +30 -0
  424. package/src/layout/useLayout.ts +68 -18
  425. package/src/nuxt.ts +87 -17
  426. package/src/runtime/config.plugin.ts +14 -0
  427. package/src/runtime/theme.plugin.ts +43 -23
  428. package/src/theme/backdrop.ts +69 -0
  429. package/src/theme/presets.ts +6 -64
  430. package/src/theme/useTheme.ts +206 -100
  431. package/src/tokens/tokens.css +46 -0
  432. package/dist/chunks/LpBreadcrumbs-p4jHe_V-.js +0 -62
  433. package/dist/chunks/LpContextMenu-CwW1QXe_.js +0 -217
  434. package/dist/chunks/LpDatePicker-CwOToxGq.js +0 -164
  435. package/dist/chunks/LpFormField-CazBc2-a.js +0 -62
  436. package/dist/chunks/LpPhoneInput-BDSKVl_z.js +0 -209
  437. package/dist/chunks/LpTextarea-t7F6gv8E.js +0 -47
@@ -0,0 +1,44 @@
1
+ import { computed, inject, provide, toValue } from "vue";
2
+ const LP_CONFIG = /* @__PURE__ */ Symbol.for("lp-config");
3
+ function provideLpConfig(config) {
4
+ provide(LP_CONFIG, layered(inject(LP_CONFIG, {}), config));
5
+ }
6
+ function lpConfig(config) {
7
+ return {
8
+ install: (app) => {
9
+ const outer = app.runWithContext(() => inject(LP_CONFIG, {}));
10
+ app.provide(LP_CONFIG, layered(outer, config));
11
+ }
12
+ };
13
+ }
14
+ function layered(outer, inner) {
15
+ return () => mergeConfig(toValue(outer), toValue(inner));
16
+ }
17
+ function mergeConfig(outer, inner) {
18
+ const labels = { ...outer.labels };
19
+ for (const [scope, values] of Object.entries(inner.labels ?? {})) {
20
+ labels[scope] = { ...labels[scope], ...values };
21
+ }
22
+ return { ...outer, ...inner, linkComponent: inner.linkComponent ?? outer.linkComponent, labels };
23
+ }
24
+ function useLpConfig() {
25
+ const config = inject(LP_CONFIG, {});
26
+ return computed(() => toValue(config));
27
+ }
28
+ function useLabels(scope, defaults, own) {
29
+ const config = useLpConfig();
30
+ return computed(() => ({ ...defaults, ...config.value.labels?.[scope], ...own?.() }));
31
+ }
32
+ function useLinkComponent() {
33
+ const config = useLpConfig();
34
+ return computed(() => config.value.linkComponent ?? "a");
35
+ }
36
+ export {
37
+ LP_CONFIG,
38
+ lpConfig,
39
+ mergeConfig,
40
+ provideLpConfig,
41
+ useLabels,
42
+ useLinkComponent,
43
+ useLpConfig
44
+ };
@@ -0,0 +1,22 @@
1
+ import { type MaybeRefOrGetter, type Ref } from "vue";
2
+ import { type HotkeyHelp } from "./useHotkeys";
3
+ export interface UsePaintSelectOptions<K> {
4
+ /** The element that holds the items. */
5
+ root: Ref<HTMLElement | null>;
6
+ selection: () => readonly K[];
7
+ set: (keys: K[]) => void;
8
+ /** Turn painting off without unmounting (e.g. selection mode is off). */
9
+ enabled?: MaybeRefOrGetter<boolean>;
10
+ /** Map an item's `data-paint-key` back to its key. Defaults to the string itself. */
11
+ resolve?: (raw: string) => K | undefined;
12
+ /** Every key, for Ctrl+A while the focus is inside `root`. Omit to leave Ctrl+A alone. */
13
+ selectAll?: () => K[];
14
+ /** How Ctrl+A is listed in the shortcuts reference. */
15
+ help?: MaybeRefOrGetter<HotkeyHelp | undefined>;
16
+ }
17
+ export declare function usePaintSelect<K = string>(options: UsePaintSelectOptions<K>): {
18
+ onPointerDown: (event: PointerEvent, key: K, behaviour?: {
19
+ hold?: number;
20
+ }) => void;
21
+ painting: Readonly<Ref<boolean, boolean>>;
22
+ };
@@ -0,0 +1,169 @@
1
+ import { ref, toValue, onMounted, onBeforeUnmount, readonly } from "vue";
2
+ import { useHotkeys } from "./useHotkeys.js";
3
+ const HOLD_MS = 320;
4
+ const SLOP_PX = 8;
5
+ const EDGE_PX = 40;
6
+ const SCROLL_STEP = 14;
7
+ function scrollParent(el) {
8
+ for (let node = el?.parentElement; node; node = node.parentElement) {
9
+ const { overflowY } = getComputedStyle(node);
10
+ if ((overflowY === "auto" || overflowY === "scroll") && node.scrollHeight > node.clientHeight) return node;
11
+ }
12
+ return null;
13
+ }
14
+ function usePaintSelect(options) {
15
+ const resolve = options.resolve ?? ((raw) => raw);
16
+ let stroke = null;
17
+ let pending = null;
18
+ let swallowClick = false;
19
+ let frame = 0;
20
+ const painting = ref(false);
21
+ const enabled = () => toValue(options.enabled) ?? true;
22
+ function keysInView() {
23
+ const items = options.root.value?.querySelectorAll("[data-paint-key]") ?? [];
24
+ const out = [];
25
+ for (const item of items) {
26
+ if (item.offsetParent === null) continue;
27
+ const key = resolve(item.dataset.paintKey ?? "");
28
+ if (key !== void 0) out.push(key);
29
+ }
30
+ return out;
31
+ }
32
+ function keyAt(x, y) {
33
+ const item = document.elementFromPoint(x, y)?.closest("[data-paint-key]");
34
+ if (!item || !options.root.value?.contains(item)) return void 0;
35
+ return resolve(item.dataset.paintKey ?? "");
36
+ }
37
+ function extend() {
38
+ if (!stroke) return;
39
+ const key = keyAt(stroke.x, stroke.y);
40
+ const at = key === void 0 ? -1 : stroke.keys.indexOf(key);
41
+ if (at < 0) return;
42
+ const [lo, hi] = at < stroke.anchor ? [at, stroke.anchor] : [stroke.anchor, at];
43
+ const next = new Set(stroke.before);
44
+ for (let i = lo; i <= hi; i++) {
45
+ const k = stroke.keys[i];
46
+ if (stroke.paint) next.add(k);
47
+ else next.delete(k);
48
+ }
49
+ options.set([...next]);
50
+ }
51
+ function tick() {
52
+ frame = 0;
53
+ if (!stroke) return;
54
+ const box = stroke.scroller?.getBoundingClientRect() ?? { top: 0, bottom: window.innerHeight };
55
+ const delta = stroke.y > box.bottom - EDGE_PX ? SCROLL_STEP : stroke.y < box.top + EDGE_PX ? -SCROLL_STEP : 0;
56
+ if (delta) {
57
+ if (stroke.scroller) stroke.scroller.scrollTop += delta;
58
+ else window.scrollBy(0, delta);
59
+ extend();
60
+ }
61
+ frame = requestAnimationFrame(tick);
62
+ }
63
+ function begin(key, x, y) {
64
+ const keys = keysInView();
65
+ const anchor = keys.indexOf(key);
66
+ if (anchor < 0) return;
67
+ const before = new Set(options.selection());
68
+ stroke = { keys, anchor, paint: !before.has(key), before, x, y, scroller: scrollParent(options.root.value) };
69
+ painting.value = true;
70
+ window.getSelection()?.removeAllRanges();
71
+ if (options.root.value) options.root.value.style.userSelect = "none";
72
+ extend();
73
+ if (!frame) frame = requestAnimationFrame(tick);
74
+ }
75
+ function cancelPending() {
76
+ if (pending) clearTimeout(pending.timer);
77
+ pending = null;
78
+ }
79
+ function onPointerDown(event, key, behaviour = {}) {
80
+ if (!enabled() || event.button !== 0) return;
81
+ cancelPending();
82
+ if (behaviour.hold === void 0 && event.pointerType !== "touch") {
83
+ event.preventDefault();
84
+ begin(key, event.clientX, event.clientY);
85
+ return;
86
+ }
87
+ const { pointerId, clientX: x, clientY: y } = event;
88
+ pending = {
89
+ key,
90
+ pointerId,
91
+ x,
92
+ y,
93
+ timer: setTimeout(() => {
94
+ pending = null;
95
+ begin(key, x, y);
96
+ navigator.vibrate?.(8);
97
+ }, behaviour.hold ?? HOLD_MS)
98
+ };
99
+ }
100
+ function onMove(event) {
101
+ if (pending && event.pointerId === pending.pointerId) {
102
+ if (Math.hypot(event.clientX - pending.x, event.clientY - pending.y) > SLOP_PX) cancelPending();
103
+ return;
104
+ }
105
+ if (!stroke) return;
106
+ stroke.x = event.clientX;
107
+ stroke.y = event.clientY;
108
+ extend();
109
+ }
110
+ function onUp() {
111
+ cancelPending();
112
+ if (!stroke) return;
113
+ stroke = null;
114
+ painting.value = false;
115
+ if (options.root.value) options.root.value.style.userSelect = "";
116
+ if (frame) cancelAnimationFrame(frame);
117
+ frame = 0;
118
+ swallowClick = true;
119
+ setTimeout(() => swallowClick = false, 0);
120
+ }
121
+ function onClickCapture(event) {
122
+ if (!swallowClick) return;
123
+ swallowClick = false;
124
+ event.stopPropagation();
125
+ event.preventDefault();
126
+ }
127
+ function onContextMenu(event) {
128
+ if (!stroke && !swallowClick) return;
129
+ event.preventDefault();
130
+ event.stopPropagation();
131
+ }
132
+ function onTouchMove(event) {
133
+ if (stroke) event.preventDefault();
134
+ }
135
+ useHotkeys(
136
+ () => options.selectAll && enabled() ? [
137
+ {
138
+ key: "a",
139
+ code: "KeyA",
140
+ ctrl: true,
141
+ help: toValue(options.help),
142
+ handler: () => options.set(options.selectAll())
143
+ }
144
+ ] : [],
145
+ { scope: options.root }
146
+ );
147
+ onMounted(() => {
148
+ window.addEventListener("pointermove", onMove);
149
+ window.addEventListener("pointerup", onUp);
150
+ window.addEventListener("pointercancel", onUp);
151
+ window.addEventListener("click", onClickCapture, true);
152
+ window.addEventListener("contextmenu", onContextMenu, true);
153
+ options.root.value?.addEventListener("touchmove", onTouchMove, { passive: false });
154
+ });
155
+ onBeforeUnmount(() => {
156
+ onUp();
157
+ swallowClick = false;
158
+ window.removeEventListener("pointermove", onMove);
159
+ window.removeEventListener("pointerup", onUp);
160
+ window.removeEventListener("pointercancel", onUp);
161
+ window.removeEventListener("click", onClickCapture, true);
162
+ window.removeEventListener("contextmenu", onContextMenu, true);
163
+ options.root.value?.removeEventListener("touchmove", onTouchMove);
164
+ });
165
+ return { onPointerDown, painting: readonly(painting) };
166
+ }
167
+ export {
168
+ usePaintSelect
169
+ };
@@ -1,4 +1,5 @@
1
1
  import { ref, computed, toValue, watch } from "vue";
2
+ const NON_TEXT_INPUTS = /* @__PURE__ */ new Set(["checkbox", "radio", "button", "submit", "reset", "range", "color", "file", "image"]);
2
3
  const TYPEAHEAD_RESET_MS = 700;
3
4
  function useRovingFocus(items, options = {}) {
4
5
  const {
@@ -69,7 +70,13 @@ function useRovingFocus(items, options = {}) {
69
70
  }
70
71
  }
71
72
  }
73
+ function isTextEntry(target) {
74
+ if (!(target instanceof HTMLElement)) return false;
75
+ if (target.isContentEditable || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) return true;
76
+ return target instanceof HTMLInputElement && !NON_TEXT_INPUTS.has(target.type);
77
+ }
72
78
  function onKeydown(event) {
79
+ if (event.isComposing || isTextEntry(event.target)) return;
73
80
  const vertical = orientation === "vertical" || orientation === "both";
74
81
  const horizontal = orientation === "horizontal" || orientation === "both";
75
82
  switch (event.key) {
@@ -12,6 +12,7 @@ function useShift(options = {}) {
12
12
  let settleTimer;
13
13
  let lastHeight = 0;
14
14
  let lastWidth = 0;
15
+ let laidOut = false;
15
16
  let inFlight = false;
16
17
  let tweenStart = 0;
17
18
  const scrolled = /* @__PURE__ */ new Set();
@@ -64,8 +65,10 @@ function useShift(options = {}) {
64
65
  restoreScroll(tops);
65
66
  lastHeight = toHeight;
66
67
  lastWidth = toWidth;
67
- const movesHeight = wantsHeight() && fromHeight !== 0 && toHeight !== fromHeight;
68
- const movesWidth = wantsWidth() && fromWidth !== 0 && toWidth !== fromWidth;
68
+ const wasLaidOut = laidOut;
69
+ laidOut = node.getClientRects().length > 0;
70
+ const movesHeight = wantsHeight() && (fromHeight !== 0 || wasLaidOut) && toHeight !== fromHeight;
71
+ const movesWidth = wantsWidth() && (fromWidth !== 0 || wasLaidOut) && toWidth !== fromWidth;
69
72
  if (!movesHeight && !movesWidth) return;
70
73
  if (movesHeight) node.style.height = `${fromHeight}px`;
71
74
  if (movesWidth) node.style.width = `${fromWidth}px`;
@@ -102,6 +105,7 @@ function useShift(options = {}) {
102
105
  resizing.value = false;
103
106
  lastHeight = 0;
104
107
  lastWidth = 0;
108
+ laidOut = false;
105
109
  inFlight = false;
106
110
  }
107
111
  watch(
@@ -111,6 +115,7 @@ function useShift(options = {}) {
111
115
  if (!enabled || !node) return;
112
116
  lastHeight = node.offsetHeight;
113
117
  lastWidth = node.offsetWidth;
118
+ laidOut = node.getClientRects().length > 0;
114
119
  scrollHost = node;
115
120
  node.addEventListener("scroll", rememberScroll, { capture: true, passive: true });
116
121
  if (wantsHeight()) node.style.height = `${lastHeight}px`;
@@ -1,4 +1,4 @@
1
- import { type ComputedRef, type CSSProperties, type Ref } from "vue";
1
+ import { type ComputedRef, type CSSProperties, type MaybeRefOrGetter, type Ref } from "vue";
2
2
  export interface UseTiltOptions {
3
3
  /** Max rotation toward the pointer, in degrees (per axis). Default 10. */
4
4
  max?: number;
@@ -20,4 +20,4 @@ export interface UseTilt {
20
20
  /** True while the pointer is over the element (drives lift/scale). */
21
21
  active: Ref<boolean>;
22
22
  }
23
- export declare function useTilt(options?: UseTiltOptions): UseTilt;
23
+ export declare function useTilt(source?: MaybeRefOrGetter<UseTiltOptions>): UseTilt;
@@ -1,9 +1,7 @@
1
1
  import { useReducedMotion } from "motion-v";
2
- import { ref, computed } from "vue";
3
- function useTilt(options = {}) {
4
- const max = options.max ?? 10;
5
- const lift = options.lift ?? 8;
6
- const scale = options.scale ?? 1.03;
2
+ import { computed, toValue, ref } from "vue";
3
+ function useTilt(source = {}) {
4
+ const options = computed(() => toValue(source));
7
5
  const reduceMotion = useReducedMotion();
8
6
  const active = ref(false);
9
7
  const nx = ref(0);
@@ -28,6 +26,7 @@ function useTilt(options = {}) {
28
26
  if (reduceMotion.value) {
29
27
  return { transition: "transform 0.2s ease" };
30
28
  }
29
+ const { max = 10, lift = 8, scale = 1.03 } = options.value;
31
30
  const rx = active.value ? -ny.value * max : 0;
32
31
  const ry = active.value ? nx.value * max : 0;
33
32
  const z = active.value ? lift : 0;
@@ -39,7 +38,7 @@ function useTilt(options = {}) {
39
38
  };
40
39
  });
41
40
  const glareStyle = computed(() => {
42
- if (!options.glare || reduceMotion.value || !active.value) {
41
+ if (!options.value.glare || reduceMotion.value || !active.value) {
43
42
  return { opacity: 0 };
44
43
  }
45
44
  const px = (nx.value + 1) * 50;
@@ -7,6 +7,9 @@ export interface ToastAction {
7
7
  }
8
8
  export interface ToastItem {
9
9
  id: number;
10
+ /** Bumped when a toast with the same `key` replaces this one in place. */
11
+ rev: number;
12
+ key?: string;
10
13
  title?: string;
11
14
  message: string;
12
15
  variant: ToastVariant;
@@ -18,12 +21,28 @@ export interface ToastItem {
18
21
  onClick?: () => void | Promise<void>;
19
22
  }
20
23
  export interface ToastOptions {
24
+ /**
25
+ * A toast with the same key replaces the one on screen instead of stacking
26
+ * beside it: "Saved" ten times is one toast, and a progress toast can turn
27
+ * into its result.
28
+ */
29
+ key?: string;
21
30
  title?: string;
22
31
  duration?: number;
23
32
  actions?: ToastAction[];
24
33
  onClick?: () => void | Promise<void>;
25
34
  }
26
35
  declare function push(variant: ToastVariant, message: string, options?: ToastOptions): number;
36
+ export interface ToastPromiseMessages<T> {
37
+ loading: string;
38
+ success: string | ((value: T) => string);
39
+ error: string | ((error: unknown) => string);
40
+ }
41
+ /**
42
+ * One toast that follows a promise: a persistent "loading" toast that turns
43
+ * into the success or error toast when it settles. Returns the promise itself.
44
+ */
45
+ declare function promise<T>(task: Promise<T>, messages: ToastPromiseMessages<T>, options?: ToastOptions): Promise<T>;
27
46
  declare function dismiss(id: number): void;
28
47
  declare function clear(): void;
29
48
  export declare function useToast(): {
@@ -33,6 +52,7 @@ export declare function useToast(): {
33
52
  success: (message: string, o?: ToastOptions) => number;
34
53
  warning: (message: string, o?: ToastOptions) => number;
35
54
  error: (message: string, o?: ToastOptions) => number;
55
+ promise: typeof promise;
36
56
  /** Low-level push for bridges (e.g. @leavepulse/ui-sdk apiError). */
37
57
  push: typeof push;
38
58
  dismiss: typeof dismiss;
@@ -6,10 +6,10 @@ const g = globalThis;
6
6
  const state = g[STATE_KEY] ??= { queue: reactive([]), nextId: 0 };
7
7
  const queue = state.queue;
8
8
  function push(variant, message, options = {}) {
9
- const id = state.nextId++;
9
+ if (typeof window === "undefined") return -1;
10
10
  const duration = options.duration ?? DEFAULT_DURATION;
11
- const item = {
12
- id,
11
+ const fields = {
12
+ key: options.key,
13
13
  title: options.title,
14
14
  message,
15
15
  variant,
@@ -18,11 +18,34 @@ function push(variant, message, options = {}) {
18
18
  actions: options.actions,
19
19
  onClick: options.onClick
20
20
  };
21
+ const same = options.key === void 0 ? -1 : queue.findIndex((t) => t.key === options.key);
22
+ const existing = queue[same];
23
+ if (existing) {
24
+ queue.splice(same, 1, { ...fields, id: existing.id, rev: existing.rev + 1 });
25
+ return existing.id;
26
+ }
27
+ const id = state.nextId++;
21
28
  const overflow = queue.length - (MAX_ACTIVE - 1);
22
29
  if (overflow > 0) queue.splice(0, overflow);
23
- queue.push(item);
30
+ queue.push({ ...fields, id, rev: 0 });
24
31
  return id;
25
32
  }
33
+ let promiseKey = 0;
34
+ function promise(task, messages, options = {}) {
35
+ const key = options.key ?? `@leavepulse/ui:promise-${promiseKey++}`;
36
+ push("info", messages.loading, { ...options, key, duration: 0, actions: void 0 });
37
+ task.then(
38
+ (value) => {
39
+ const text = typeof messages.success === "function" ? messages.success(value) : messages.success;
40
+ push("success", text, { ...options, key });
41
+ },
42
+ (error) => {
43
+ const text = typeof messages.error === "function" ? messages.error(error) : messages.error;
44
+ push("error", text, { ...options, key });
45
+ }
46
+ );
47
+ return task;
48
+ }
26
49
  function dismiss(id) {
27
50
  const i = queue.findIndex((t) => t.id === id);
28
51
  if (i !== -1) queue.splice(i, 1);
@@ -38,6 +61,7 @@ function useToast() {
38
61
  success: (message, o) => push("success", message, o),
39
62
  warning: (message, o) => push("warning", message, o),
40
63
  error: (message, o) => push("error", message, o),
64
+ promise,
41
65
  /** Low-level push for bridges (e.g. @leavepulse/ui-sdk apiError). */
42
66
  push,
43
67
  dismiss,
@@ -1,9 +1,9 @@
1
- import { type ComputedRef, type CSSProperties, type Ref } from "vue";
1
+ import { type ComputedRef, type CSSProperties, type MaybeRefOrGetter, type Ref } from "vue";
2
2
  export interface UseZoomPanOptions {
3
3
  /** Smallest allowed scale. Default 1 (fit — never shrink past the viewport). */
4
4
  min?: number;
5
- /** Largest allowed scale. Default 8. */
6
- max?: number;
5
+ /** Largest allowed scale. Default 8. Read on every change, so it may be a getter. */
6
+ max?: MaybeRefOrGetter<number | undefined>;
7
7
  /** Multiplier per wheel notch. Default 1.15. */
8
8
  step?: number;
9
9
  /** Scale that a double-click/tap toggles to, from `min`. Default 2. */
@@ -1,7 +1,7 @@
1
- import { ref, computed } from "vue";
1
+ import { ref, computed, toValue } from "vue";
2
2
  function useZoomPan(options = {}) {
3
3
  const min = options.min ?? 1;
4
- const max = options.max ?? 8;
4
+ const maxOf = () => toValue(options.max) ?? 8;
5
5
  const step = options.step ?? 1.15;
6
6
  const zoomedScale = options.zoomedScale ?? 2;
7
7
  const scale = ref(min);
@@ -29,7 +29,7 @@ function useZoomPan(options = {}) {
29
29
  y.value = clamp(y.value, -slackY, slackY);
30
30
  }
31
31
  function zoomAbout(next, px, py) {
32
- const clamped = clamp(next, min, max);
32
+ const clamped = clamp(next, min, maxOf());
33
33
  if (clamped === scale.value) return;
34
34
  const contentX = px / scale.value - x.value;
35
35
  const contentY = py / scale.value - y.value;
@@ -116,7 +116,7 @@ function useZoomPan(options = {}) {
116
116
  const offset = computed(() => ({ x: x.value, y: y.value }));
117
117
  function setView(view) {
118
118
  if (view.scale !== void 0) {
119
- scale.value = Math.min(max, Math.max(min, view.scale));
119
+ scale.value = Math.min(maxOf(), Math.max(min, view.scale));
120
120
  }
121
121
  x.value = view.x;
122
122
  y.value = view.y;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import lucide from "@iconify-json/lucide/icons.json";
2
+ import { a as registerIconCollection } from "./chunks/icons-CkA0njzm.js";
3
+ registerIconCollection(lucide);
package/dist/icons.d.ts CHANGED
@@ -1 +1,14 @@
1
- export {};
1
+ import { type IconifyJSON } from "@iconify/vue";
2
+ /** Bumped whenever icons are registered, so rendered icons re-resolve. */
3
+ export declare const iconsVersion: import("vue").Ref<number, number>;
4
+ /** Register a whole iconify collection (any prefix) for offline use. */
5
+ export declare function registerIconCollection(collection: IconifyJSON): void;
6
+ /**
7
+ * Register lucide icons by name ("check" or "lucide:check") from the bundled
8
+ * collection. Resolves once they render offline.
9
+ */
10
+ export declare function registerIcons(names: readonly string[]): Promise<void>;
11
+ /** Register the full lucide collection. */
12
+ export declare function registerAllIcons(): Promise<void>;
13
+ /** A lucide name that isn't registered yet: load it from the bundled set. */
14
+ export declare function requestIcon(name: string): void;