@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
@@ -75,7 +75,7 @@ function formatSize(bytes) {
75
75
  const units = ["KB", "MB", "GB", "TB", "PB"];
76
76
  let value = bytes / 1024;
77
77
  let i = 0;
78
- while (value >= 1024 && i < units.length - 1) {
78
+ while (Math.round(value) >= 1024 && i < units.length - 1) {
79
79
  value /= 1024;
80
80
  i++;
81
81
  }
@@ -118,14 +118,18 @@ function checkStateOf(node, checked) {
118
118
  }
119
119
  let all = true;
120
120
  let any = false;
121
+ let considered = 0;
121
122
  for (const child of node.children) {
122
123
  const state = checkStateOf(child, checked);
124
+ if (child.disabled && state === "unchecked") continue;
125
+ considered++;
123
126
  if (state === "checked") any = true;
124
127
  else if (state === "indeterminate") {
125
128
  any = true;
126
129
  all = false;
127
130
  } else all = false;
128
131
  }
132
+ if (!considered) return checked.has(node.id) ? "checked" : "unchecked";
129
133
  if (all) return "checked";
130
134
  return any ? "indeterminate" : "unchecked";
131
135
  }
@@ -165,13 +169,17 @@ function computeStats(nodes, checked) {
165
169
  let total = 0;
166
170
  let bytes = 0;
167
171
  let sized = node.size !== void 0;
172
+ let considered = 0;
168
173
  for (const child of node.children) {
169
174
  const childStats = visit(child);
170
- if (childStats.state === "checked") any = true;
171
- else if (childStats.state === "indeterminate") {
172
- any = true;
173
- all = false;
174
- } else all = false;
175
+ if (!child.disabled || childStats.state !== "unchecked") {
176
+ considered++;
177
+ if (childStats.state === "checked") any = true;
178
+ else if (childStats.state === "indeterminate") {
179
+ any = true;
180
+ all = false;
181
+ } else all = false;
182
+ }
175
183
  count += childStats.checked;
176
184
  total += childStats.total;
177
185
  if (childStats.size !== void 0) {
@@ -179,8 +187,9 @@ function computeStats(nodes, checked) {
179
187
  sized = true;
180
188
  }
181
189
  }
190
+ const own = checked.has(node.id) ? "checked" : "unchecked";
182
191
  const self = {
183
- state: all ? "checked" : any ? "indeterminate" : "unchecked",
192
+ state: !considered ? own : all ? "checked" : any ? "indeterminate" : "unchecked",
184
193
  checked: count,
185
194
  total,
186
195
  // An explicit size on the directory wins: a server-side listing usually
@@ -0,0 +1,42 @@
1
+ export interface Point {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ export interface CropInput {
6
+ sourceWidth: number;
7
+ sourceHeight: number;
8
+ frameWidth: number;
9
+ frameHeight: number;
10
+ /** Accumulated rotation in degrees; any angle, not only quarter turns. */
11
+ rotation: number;
12
+ /** Zoom factor, 1 = the picture just covers the frame. */
13
+ scale: number;
14
+ /** Pan in frame pixels before the zoom, as useZoomPan reports it. */
15
+ offset: Point;
16
+ }
17
+ export interface CropGeometry {
18
+ /** CSS pixels per source pixel at zoom 1. */
19
+ cover: number;
20
+ /** Crop size in upright (source-pixel) units. */
21
+ width: number;
22
+ height: number;
23
+ /** Crop centre in upright space. */
24
+ centre: Point;
25
+ }
26
+ /** Rotate a point clockwise by `deg` in a y-down space. */
27
+ export declare function rotatePoint(p: Point, deg: number): Point;
28
+ /** The source pixel (from the source's top-left) under an upright-space point. */
29
+ export declare function uprightToSource(u: Point, rotation: number, sourceWidth: number, sourceHeight: number): Point;
30
+ /**
31
+ * Smallest scale at which the turned picture still covers the whole frame.
32
+ *
33
+ * Covering the bounding box of a turned picture is not enough at a free angle:
34
+ * its corners are empty. The frame, turned back by the same angle, has to fit
35
+ * inside the unturned picture; for a quarter turn this reduces to the usual
36
+ * object-cover of the swapped dimensions.
37
+ */
38
+ export declare function coverScale(sourceWidth: number, sourceHeight: number, frameWidth: number, frameHeight: number, rotation: number): number;
39
+ /** What the frame holds, in upright space. */
40
+ export declare function cropGeometry(input: CropInput): CropGeometry;
41
+ /** Whether the turn is closer to sideways than to upright. */
42
+ export declare function isSideways(rotation: number): boolean;
@@ -0,0 +1,47 @@
1
+ const radians = (deg) => deg * Math.PI / 180;
2
+ function rotatePoint(p, deg) {
3
+ const a = radians(deg);
4
+ const cos = Math.cos(a);
5
+ const sin = Math.sin(a);
6
+ return { x: p.x * cos - p.y * sin, y: p.x * sin + p.y * cos };
7
+ }
8
+ function uprightToSource(u, rotation, sourceWidth, sourceHeight) {
9
+ const q = rotatePoint(u, -rotation);
10
+ return { x: q.x + sourceWidth / 2, y: q.y + sourceHeight / 2 };
11
+ }
12
+ function coverScale(sourceWidth, sourceHeight, frameWidth, frameHeight, rotation) {
13
+ const a = radians(rotation);
14
+ const cos = Math.abs(Math.cos(a));
15
+ const sin = Math.abs(Math.sin(a));
16
+ return Math.max(
17
+ (frameWidth * cos + frameHeight * sin) / sourceWidth,
18
+ (frameWidth * sin + frameHeight * cos) / sourceHeight
19
+ );
20
+ }
21
+ function cropGeometry(input) {
22
+ const cover = coverScale(
23
+ input.sourceWidth,
24
+ input.sourceHeight,
25
+ input.frameWidth,
26
+ input.frameHeight,
27
+ input.rotation
28
+ );
29
+ const shown = cover * input.scale;
30
+ return {
31
+ cover,
32
+ width: input.frameWidth / shown,
33
+ height: input.frameHeight / shown,
34
+ centre: { x: -input.offset.x / cover, y: -input.offset.y / cover }
35
+ };
36
+ }
37
+ function isSideways(rotation) {
38
+ const quarters = Math.round(rotation / 90);
39
+ return (quarters % 2 + 2) % 2 === 1;
40
+ }
41
+ export {
42
+ coverScale,
43
+ cropGeometry,
44
+ isSideways,
45
+ rotatePoint,
46
+ uprightToSource
47
+ };
@@ -0,0 +1,12 @@
1
+ import type { Component } from "vue";
2
+ export type LinkTarget = string | Record<string, unknown>;
3
+ export interface ResolvedLink {
4
+ is: Component | string;
5
+ props: Record<string, unknown>;
6
+ }
7
+ /** An app-relative path: "/x", not "//host" or "https://…". */
8
+ export declare function isInternalHref(href: string): boolean;
9
+ export declare function resolveLink(linkComponent: Component | string, target: {
10
+ to?: LinkTarget;
11
+ href?: string;
12
+ }): ResolvedLink | null;
@@ -0,0 +1,19 @@
1
+ function isInternalHref(href) {
2
+ return href.startsWith("/") && !href.startsWith("//");
3
+ }
4
+ function resolveLink(linkComponent, target) {
5
+ const router = linkComponent !== "a";
6
+ if (target.to != null) {
7
+ if (router) return { is: linkComponent, props: { to: target.to } };
8
+ return typeof target.to === "string" ? { is: "a", props: { href: target.to } } : null;
9
+ }
10
+ if (target.href != null) {
11
+ if (router && isInternalHref(target.href)) return { is: linkComponent, props: { to: target.href } };
12
+ return { is: "a", props: { href: target.href } };
13
+ }
14
+ return null;
15
+ }
16
+ export {
17
+ isInternalHref,
18
+ resolveLink
19
+ };
@@ -0,0 +1,18 @@
1
+ /** The last `max` lines, and how many were cut from the front. */
2
+ export declare function ringWindow<T>(lines: readonly T[], max: number | undefined): {
3
+ lines: readonly T[];
4
+ offset: number;
5
+ };
6
+ /** Lines per level, a line with no level counting as `fallback`. */
7
+ export declare function countLevels<L extends string>(lines: readonly {
8
+ level?: L;
9
+ }[], fallback: L): Map<L, number>;
10
+ /** Case-insensitive substring test; an empty term matches nothing. */
11
+ export declare function matchesTerm(message: string, term: string): boolean;
12
+ /** Positions (into `rows`) of the rows whose message or source holds the term. */
13
+ export declare function matchPositions(rows: readonly {
14
+ message: string;
15
+ source?: string;
16
+ }[], term: string): number[];
17
+ /** The next match cursor, wrapping at both ends; -1 when there are none. */
18
+ export declare function stepMatch(current: number, total: number, direction: 1 | -1): number;
@@ -0,0 +1,36 @@
1
+ function ringWindow(lines, max) {
2
+ if (!max || max <= 0 || lines.length <= max) return { lines, offset: 0 };
3
+ return { lines: lines.slice(lines.length - max), offset: lines.length - max };
4
+ }
5
+ function countLevels(lines, fallback) {
6
+ const counts = /* @__PURE__ */ new Map();
7
+ for (const line of lines) {
8
+ const level = line.level ?? fallback;
9
+ counts.set(level, (counts.get(level) ?? 0) + 1);
10
+ }
11
+ return counts;
12
+ }
13
+ function matchesTerm(message, term) {
14
+ const needle = term.trim().toLowerCase();
15
+ return needle.length > 0 && message.toLowerCase().includes(needle);
16
+ }
17
+ function matchPositions(rows, term) {
18
+ if (!term.trim()) return [];
19
+ const out = [];
20
+ rows.forEach((row, i) => {
21
+ if (matchesTerm(row.message, term) || row.source !== void 0 && matchesTerm(row.source, term)) out.push(i);
22
+ });
23
+ return out;
24
+ }
25
+ function stepMatch(current, total, direction) {
26
+ if (total <= 0) return -1;
27
+ if (current < 0 || current >= total) return direction === 1 ? 0 : total - 1;
28
+ return (current + direction + total) % total;
29
+ }
30
+ export {
31
+ countLevels,
32
+ matchPositions,
33
+ matchesTerm,
34
+ ringWindow,
35
+ stepMatch
36
+ };
@@ -1,11 +1,27 @@
1
1
  import { type ComputedRef } from "vue";
2
- export declare function useModalLayer(): {
2
+ export interface ModalLayer {
3
+ /** Join the stack on top. Ignored on the server, where nothing would ever release it. */
3
4
  claim: () => void;
4
5
  release: () => void;
6
+ /** z-index values for this surface's scrim and panel, and whether another modal is under it. */
5
7
  layer: ComputedRef<{
6
8
  scrim: string;
7
9
  panel: string;
8
10
  nested: boolean;
9
11
  }>;
10
- };
12
+ /** Whether this surface is the topmost open one. */
13
+ top: ComputedRef<boolean>;
14
+ }
15
+ export interface ModalLayerOptions {
16
+ /** The surface's panel, so keyboard handling can tell what sits inside the top modal. */
17
+ element?: () => HTMLElement | null | undefined;
18
+ }
19
+ /**
20
+ * Put an overlay on the shared modal stack, so a surface opened from another
21
+ * one (a dialog from a drawer, a lightbox from a dialog) lands above it with
22
+ * its scrim, whatever component either of them is.
23
+ */
24
+ export declare function useModalLayer(options?: ModalLayerOptions): ModalLayer;
11
25
  export declare function anyModalOpen(): boolean;
26
+ /** The panel of the topmost modal, when it registered one. */
27
+ export declare function topModalElement(): HTMLElement | null;
@@ -1,18 +1,23 @@
1
1
  import { ref, computed } from "vue";
2
2
  const STEP = 20;
3
- const stack = ref([]);
4
- let nextId = 0;
5
- function useModalLayer() {
6
- const id = nextId++;
3
+ const STATE_KEY = /* @__PURE__ */ Symbol.for("@leavepulse/ui:modal-stack");
4
+ const g = globalThis;
5
+ const state = g[STATE_KEY] ??= { stack: ref([]), nextId: 0, elements: /* @__PURE__ */ new Map() };
6
+ const stack = state.stack;
7
+ function useModalLayer(options = {}) {
8
+ const id = state.nextId++;
7
9
  const fromTop = computed(() => {
8
10
  const at = stack.value.indexOf(id);
9
11
  return at === -1 ? 0 : stack.value.length - 1 - at;
10
12
  });
11
13
  return {
12
14
  claim: () => {
15
+ if (typeof window === "undefined") return;
16
+ if (options.element) state.elements.set(id, options.element);
13
17
  if (!stack.value.includes(id)) stack.value = [...stack.value, id];
14
18
  },
15
19
  release: () => {
20
+ state.elements.delete(id);
16
21
  stack.value = stack.value.filter((x) => x !== id);
17
22
  },
18
23
  layer: computed(() => {
@@ -22,13 +27,20 @@ function useModalLayer() {
22
27
  panel: `calc(var(--z-modal) - ${drop})`,
23
28
  nested: stack.value.indexOf(id) > 0
24
29
  };
25
- })
30
+ }),
31
+ top: computed(() => stack.value[stack.value.length - 1] === id)
26
32
  };
27
33
  }
28
34
  function anyModalOpen() {
29
35
  return stack.value.length > 0;
30
36
  }
37
+ function topModalElement() {
38
+ const id = stack.value[stack.value.length - 1];
39
+ if (id === void 0) return null;
40
+ return state.elements.get(id)?.() ?? null;
41
+ }
31
42
  export {
32
43
  anyModalOpen,
44
+ topModalElement,
33
45
  useModalLayer
34
46
  };
@@ -0,0 +1,5 @@
1
+ export type OtpCells = (string | number | undefined)[];
2
+ /** The code typed so far: the filled cells in order. */
3
+ export declare function joinCells(cells: OtpCells): string;
4
+ /** Cells for a code given from outside, one character each. */
5
+ export declare function splitCode(code: string | undefined, length: number): string[];
@@ -0,0 +1,10 @@
1
+ function joinCells(cells) {
2
+ return Array.from(cells, (c) => c === void 0 ? "" : String(c)).join("");
3
+ }
4
+ function splitCode(code, length) {
5
+ return (code ?? "").split("").slice(0, length);
6
+ }
7
+ export {
8
+ joinCells,
9
+ splitCode
10
+ };
@@ -0,0 +1,41 @@
1
+ import type { CountryCode } from "libphonenumber-js/min";
2
+ export type PhoneLib = typeof import("libphonenumber-js/min");
3
+ type Examples = typeof import("libphonenumber-js/examples.mobile.json")["default"];
4
+ export declare function loadPhoneLib(): Promise<PhoneLib>;
5
+ export declare function loadPhoneExamples(): Promise<Examples>;
6
+ /** E.164 allows at most 15 digits, country code included. */
7
+ export declare const E164_MAX_DIGITS = 15;
8
+ export declare function digitsOf(text: string): string;
9
+ /** How many digits sit before `caret` in `text`. */
10
+ export declare function digitsBefore(text: string, caret: number): number;
11
+ /**
12
+ * The caret position in `formatted` that has `count` digits before it, placed
13
+ * right after the last of them so typing continues from there. Zero digits
14
+ * puts it after a leading "+".
15
+ */
16
+ export declare function caretAfterDigits(formatted: string, count: number): number;
17
+ export type PhoneProblem = "too-short" | "too-long" | "invalid" | "invalid-country";
18
+ export interface FormattedPhone {
19
+ /** What the field shows: "+380 50 123 4567". */
20
+ display: string;
21
+ /** Normalised "+380501234567", or "" when there are no digits. */
22
+ e164: string;
23
+ /** Digits that were typed past the longest number the country allows. */
24
+ dropped: number;
25
+ /** The calling code the number starts with ("380"), once recognised. */
26
+ callingCode?: string;
27
+ /** Country libphonenumber recognised from the number, when it did. */
28
+ country?: CountryCode;
29
+ possible: boolean;
30
+ valid: boolean;
31
+ type?: string;
32
+ problem?: PhoneProblem;
33
+ }
34
+ /**
35
+ * Format what was typed, dropping digits beyond what the number may hold:
36
+ * the country's own maximum once libphonenumber knows the country, the E.164
37
+ * cap otherwise. The value always starts with "+", since the field holds a
38
+ * full international number.
39
+ */
40
+ export declare function formatPhone(input: string, phone: PhoneLib | undefined): FormattedPhone;
41
+ export {};
@@ -0,0 +1,80 @@
1
+ let lib;
2
+ let examples;
3
+ function loadPhoneLib() {
4
+ lib ??= import("libphonenumber-js/min");
5
+ return lib;
6
+ }
7
+ function loadPhoneExamples() {
8
+ examples ??= import("libphonenumber-js/examples.mobile.json").then((m) => m.default);
9
+ return examples;
10
+ }
11
+ const E164_MAX_DIGITS = 15;
12
+ function digitsOf(text) {
13
+ return text.replace(/\D/g, "");
14
+ }
15
+ function digitsBefore(text, caret) {
16
+ return digitsOf(text.slice(0, caret)).length;
17
+ }
18
+ function caretAfterDigits(formatted, count) {
19
+ if (count <= 0) return formatted.startsWith("+") ? 1 : 0;
20
+ let seen = 0;
21
+ for (let i = 0; i < formatted.length; i++) {
22
+ if (/\d/.test(formatted[i])) {
23
+ seen++;
24
+ if (seen === count) return i + 1;
25
+ }
26
+ }
27
+ return formatted.length;
28
+ }
29
+ function formatPhone(input, phone) {
30
+ let digits = digitsOf(input);
31
+ let dropped = 0;
32
+ if (digits.length > E164_MAX_DIGITS) {
33
+ dropped += digits.length - E164_MAX_DIGITS;
34
+ digits = digits.slice(0, E164_MAX_DIGITS);
35
+ }
36
+ if (!digits) return { display: input.trim().startsWith("+") ? "+" : "", e164: "", dropped, possible: false, valid: false };
37
+ if (!phone) return { display: `+${digits}`, e164: `+${digits}`, dropped, possible: false, valid: false };
38
+ while (digits.length > 1 && phone.validatePhoneNumberLength(`+${digits}`) === "TOO_LONG") {
39
+ digits = digits.slice(0, -1);
40
+ dropped++;
41
+ }
42
+ const isValid = (d) => phone.parsePhoneNumberFromString(`+${d}`)?.isValid() ?? false;
43
+ while (digits.length > 1 && !isValid(digits) && isValid(digits.slice(0, -1))) {
44
+ digits = digits.slice(0, -1);
45
+ dropped++;
46
+ }
47
+ const typer = new phone.AsYouType();
48
+ let display = typer.input(`+${digits}`);
49
+ const code = typer.getCallingCode();
50
+ if (code && !/\s/.test(display.slice(code.length + 2))) {
51
+ const national = digits.slice(code.length);
52
+ display = `+${code}${national ? " " + (national.match(/.{1,3}/g) ?? []).join(" ") : ""}`;
53
+ }
54
+ const parsed = phone.parsePhoneNumberFromString(`+${digits}`);
55
+ const country = typer.getCountry() ?? parsed?.country;
56
+ const possible = parsed?.isPossible() ?? false;
57
+ const valid = parsed?.isValid() ?? false;
58
+ const length = phone.validatePhoneNumberLength(`+${digits}`);
59
+ const problem = valid ? void 0 : length === "TOO_SHORT" || length === "NOT_A_NUMBER" ? "too-short" : length === "INVALID_COUNTRY" ? "invalid-country" : length === "TOO_LONG" ? "too-long" : "invalid";
60
+ return {
61
+ display,
62
+ e164: `+${digits}`,
63
+ dropped,
64
+ callingCode: code,
65
+ country,
66
+ possible,
67
+ valid,
68
+ type: valid ? parsed?.getType() : void 0,
69
+ problem
70
+ };
71
+ }
72
+ export {
73
+ E164_MAX_DIGITS,
74
+ caretAfterDigits,
75
+ digitsBefore,
76
+ digitsOf,
77
+ formatPhone,
78
+ loadPhoneExamples,
79
+ loadPhoneLib
80
+ };
@@ -3,8 +3,14 @@ export interface SidebarItem {
3
3
  id: string;
4
4
  label: string;
5
5
  icon?: string;
6
- /** Render as a link instead of a button. */
6
+ /**
7
+ * Render as a link instead of a button. An app-relative path goes through
8
+ * the link component from provideLpConfig (NuxtLink under the Nuxt module),
9
+ * so it navigates client-side; other URLs render a plain anchor.
10
+ */
7
11
  href?: string;
12
+ /** Router destination (rendered through the configured link component). */
13
+ to?: string | Record<string, unknown>;
8
14
  /** Count chip on the right (number or short string). */
9
15
  badge?: number | string;
10
16
  disabled?: boolean;
@@ -0,0 +1,36 @@
1
+ /** Hide everything except `keep`: "show only this" in one step. */
2
+ export declare function onlyValues(values: readonly unknown[], keep: readonly unknown[]): Set<unknown>;
3
+ /** Hide every value: the "None" step before ticking the few that matter. */
4
+ export declare function hideAllValues(values: readonly unknown[]): Set<unknown>;
5
+ /** Swap shown and hidden among the values the column holds. */
6
+ export declare function invertHidden(values: readonly unknown[], hidden: ReadonlySet<unknown>): Set<unknown>;
7
+ /** Show these values again, leaving the rest of the filter as it was. */
8
+ export declare function unhideValues(hidden: ReadonlySet<unknown>, values: readonly unknown[]): Set<unknown>;
9
+ /** Lower-cased and stripped of accents, so "cafe" finds "Café". */
10
+ export declare function foldText(text: string): string;
11
+ /** Every word of the query appears somewhere in the label, in any order. */
12
+ export declare function matchesQuery(label: string, query: string): boolean;
13
+ /** How many rows hold each value of a column. */
14
+ export declare function countValues<Row extends Record<string, unknown>>(rows: readonly Row[], key: string): Map<unknown, number>;
15
+ /**
16
+ * A chip's text for one column's filter: the values still shown, the first
17
+ * `listed` by name and the rest as "+N", which says more than "3 of 12".
18
+ */
19
+ export declare function summarizeShown(shownLabels: readonly string[], listed?: number): string;
20
+ export interface PersistedTableState {
21
+ sort?: {
22
+ key: string;
23
+ dir: "asc" | "desc";
24
+ } | null;
25
+ hidden?: Record<string, unknown[]>;
26
+ columns?: string[];
27
+ }
28
+ /**
29
+ * The state worth keeping across visits, as JSON. Only plain values survive:
30
+ * a Date or an object hidden in a filter cannot come back as the same value
31
+ * (the filter compares by identity), so it is left out rather than restored
32
+ * as something that matches nothing.
33
+ */
34
+ export declare function serializeTableState(state: PersistedTableState): string;
35
+ /** Read it back, dropping anything about columns the table no longer has. */
36
+ export declare function parseTableState(raw: string | null, columnKeys: readonly string[]): PersistedTableState | null;
@@ -0,0 +1,84 @@
1
+ function onlyValues(values, keep) {
2
+ const kept = new Set(keep);
3
+ return new Set(values.filter((v) => !kept.has(v)));
4
+ }
5
+ function hideAllValues(values) {
6
+ return new Set(values);
7
+ }
8
+ function invertHidden(values, hidden) {
9
+ return new Set(values.filter((v) => !hidden.has(v)));
10
+ }
11
+ function unhideValues(hidden, values) {
12
+ const next = new Set(hidden);
13
+ for (const v of values) next.delete(v);
14
+ return next;
15
+ }
16
+ function foldText(text) {
17
+ return text.normalize("NFKD").replace(new RegExp("\\p{M}", "gu"), "").toLocaleLowerCase();
18
+ }
19
+ function matchesQuery(label, query) {
20
+ const words = foldText(query).split(/\s+/).filter(Boolean);
21
+ if (!words.length) return true;
22
+ const hay = foldText(label);
23
+ return words.every((w) => hay.includes(w));
24
+ }
25
+ function countValues(rows, key) {
26
+ const counts = /* @__PURE__ */ new Map();
27
+ for (const row of rows) counts.set(row[key], (counts.get(row[key]) ?? 0) + 1);
28
+ return counts;
29
+ }
30
+ function summarizeShown(shownLabels, listed = 2) {
31
+ if (shownLabels.length <= listed) return shownLabels.join(", ");
32
+ return `${shownLabels.slice(0, listed).join(", ")} +${shownLabels.length - listed}`;
33
+ }
34
+ function isPlain(value) {
35
+ return value === null || ["string", "number", "boolean"].includes(typeof value);
36
+ }
37
+ function serializeTableState(state) {
38
+ const hidden = {};
39
+ for (const [key, values] of Object.entries(state.hidden ?? {})) {
40
+ const plain = values.filter(isPlain);
41
+ if (plain.length) hidden[key] = plain;
42
+ }
43
+ return JSON.stringify({ sort: state.sort ?? null, hidden, columns: state.columns ?? [] });
44
+ }
45
+ function parseTableState(raw, columnKeys) {
46
+ if (!raw) return null;
47
+ let data;
48
+ try {
49
+ data = JSON.parse(raw);
50
+ } catch {
51
+ return null;
52
+ }
53
+ if (!data || typeof data !== "object") return null;
54
+ const known = new Set(columnKeys);
55
+ const record = data;
56
+ const out = {};
57
+ const sort = record.sort;
58
+ if (sort === null) out.sort = null;
59
+ else if (sort && typeof sort.key === "string" && known.has(sort.key) && (sort.dir === "asc" || sort.dir === "desc")) {
60
+ out.sort = { key: sort.key, dir: sort.dir };
61
+ }
62
+ if (record.hidden && typeof record.hidden === "object") {
63
+ out.hidden = {};
64
+ for (const [key, values] of Object.entries(record.hidden)) {
65
+ if (known.has(key) && Array.isArray(values)) out.hidden[key] = values.filter(isPlain);
66
+ }
67
+ }
68
+ if (Array.isArray(record.columns)) {
69
+ out.columns = record.columns.filter((c) => typeof c === "string" && known.has(c));
70
+ }
71
+ return out;
72
+ }
73
+ export {
74
+ countValues,
75
+ foldText,
76
+ hideAllValues,
77
+ invertHidden,
78
+ matchesQuery,
79
+ onlyValues,
80
+ parseTableState,
81
+ serializeTableState,
82
+ summarizeShown,
83
+ unhideValues
84
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Ascending order for raw cell values. Empty values (null, undefined, NaN, an
3
+ * invalid Date) come first; numbers, bigints and Dates compare by magnitude,
4
+ * booleans false before true, everything else as text with numeric runs read as
5
+ * numbers ("file 2" before "file 10"). Mixed kinds group by kind so the order
6
+ * is total and a sort is stable from one run to the next.
7
+ */
8
+ export declare function compareValues(a: unknown, b: unknown): number;
@@ -0,0 +1,31 @@
1
+ const COLLATOR = new Intl.Collator(void 0, { numeric: true });
2
+ const rank = (v) => {
3
+ if (v == null || typeof v === "number" && Number.isNaN(v)) return 0;
4
+ if (typeof v === "boolean") return 1;
5
+ if (typeof v === "number" || typeof v === "bigint") return 2;
6
+ if (v instanceof Date) return Number.isNaN(v.getTime()) ? 0 : 3;
7
+ return 4;
8
+ };
9
+ function compareValues(a, b) {
10
+ const ra = rank(a);
11
+ const rb = rank(b);
12
+ if (ra !== rb) return ra - rb;
13
+ switch (ra) {
14
+ case 0:
15
+ return 0;
16
+ case 1:
17
+ return Number(a) - Number(b);
18
+ case 2: {
19
+ const x = a;
20
+ const y = b;
21
+ return x < y ? -1 : x > y ? 1 : 0;
22
+ }
23
+ case 3:
24
+ return a.getTime() - b.getTime();
25
+ default:
26
+ return COLLATOR.compare(String(a), String(b));
27
+ }
28
+ }
29
+ export {
30
+ compareValues
31
+ };
@@ -0,0 +1,20 @@
1
+ export type TagDuplicates = "reject" | "ignore" | "allow";
2
+ /** An error message for an invalid tag; anything else accepts it. */
3
+ export type TagValidator = (tag: string, tags: readonly string[]) => string | null | undefined | void;
4
+ export type TagRejection = {
5
+ value: string;
6
+ reason: "max" | "duplicate" | "invalid";
7
+ message?: string;
8
+ };
9
+ export interface AddTagsOptions {
10
+ max?: number;
11
+ duplicates?: TagDuplicates;
12
+ validate?: TagValidator;
13
+ normalize?: (tag: string) => string;
14
+ }
15
+ export declare function splitTags(text: string, delimiter: string | RegExp | readonly string[]): string[];
16
+ export declare function addTags(current: readonly string[], candidates: readonly string[], options?: AddTagsOptions): {
17
+ tags: string[];
18
+ rejected: TagRejection[];
19
+ ignored: string[];
20
+ };