@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,37 @@
1
+ function splitTags(text, delimiter) {
2
+ const parts = delimiter instanceof RegExp ? text.split(new RegExp(delimiter.source, delimiter.flags.includes("g") ? delimiter.flags : `${delimiter.flags}g`)) : (typeof delimiter === "string" ? [delimiter] : delimiter).reduce(
3
+ (acc, d) => d ? acc.flatMap((p) => p.split(d)) : acc,
4
+ [text]
5
+ );
6
+ return parts.map((p) => p.trim()).filter(Boolean);
7
+ }
8
+ function addTags(current, candidates, options = {}) {
9
+ const tags = [...current];
10
+ const rejected = [];
11
+ const ignored = [];
12
+ const duplicates = options.duplicates ?? "reject";
13
+ for (const candidate of candidates) {
14
+ const value = options.normalize ? options.normalize(candidate) : candidate;
15
+ if (!value) continue;
16
+ if (tags.includes(value) && duplicates !== "allow") {
17
+ if (duplicates === "reject") rejected.push({ value: candidate, reason: "duplicate" });
18
+ else ignored.push(value);
19
+ continue;
20
+ }
21
+ if (options.max && tags.length >= options.max) {
22
+ rejected.push({ value: candidate, reason: "max" });
23
+ continue;
24
+ }
25
+ const message = options.validate?.(value, tags);
26
+ if (typeof message === "string" && message) {
27
+ rejected.push({ value: candidate, reason: "invalid", message });
28
+ continue;
29
+ }
30
+ tags.push(value);
31
+ }
32
+ return { tags, rejected, ignored };
33
+ }
34
+ export {
35
+ addTags,
36
+ splitTags
37
+ };
@@ -0,0 +1,38 @@
1
+ import { type ComputedRef, type InjectionKey } from "vue";
2
+ import type { FieldNoticeOptions } from "./useFieldNotice";
3
+ export interface FieldContext {
4
+ id: string;
5
+ /** Id of the visible label, for controls a `<label for>` cannot name (groups). */
6
+ labelId?: string;
7
+ describedBy?: string;
8
+ invalid: boolean;
9
+ required: boolean;
10
+ disabled: boolean;
11
+ /** Float a short note under the control without moving the layout (see useFieldNotice). */
12
+ notify?: (text: string, options?: FieldNoticeOptions) => void;
13
+ clearNotice?: () => void;
14
+ }
15
+ export declare const LP_FIELD: InjectionKey<ComputedRef<FieldContext>>;
16
+ export declare function provideField(context: ComputedRef<FieldContext>): void;
17
+ /** The nearest LpFormField's context, or null outside one. */
18
+ export declare function useField(): ComputedRef<FieldContext> | null;
19
+ export declare function fieldMessageId(id: string): string;
20
+ export interface FieldControlState {
21
+ /** The control wraps itself in its own LpFormField (it has a label, hint or error prop). */
22
+ wrapped: boolean;
23
+ /** That own field renders a hint or error line. */
24
+ hasMessage?: boolean;
25
+ /** An id the consumer set on the control, which must win over a generated one. */
26
+ id?: string;
27
+ invalid?: boolean;
28
+ required?: boolean;
29
+ disabled?: boolean;
30
+ }
31
+ /**
32
+ * The field state a control renders with: its own wrapping field when it has
33
+ * one, otherwise the field around it, with the control's own flags or-ed in.
34
+ * `id` is undefined only for a bare control outside any field.
35
+ */
36
+ export declare function useFieldControl(own: () => FieldControlState): ComputedRef<Omit<FieldContext, "id"> & {
37
+ id?: string;
38
+ }>;
@@ -0,0 +1,45 @@
1
+ import { provide, useId, computed, inject } from "vue";
2
+ const LP_FIELD = /* @__PURE__ */ Symbol.for("lp-field");
3
+ function provideField(context) {
4
+ provide(LP_FIELD, context);
5
+ }
6
+ function useField() {
7
+ return inject(LP_FIELD, null);
8
+ }
9
+ function fieldMessageId(id) {
10
+ return `${id}-message`;
11
+ }
12
+ function useFieldControl(own) {
13
+ const outer = useField();
14
+ const generated = useId();
15
+ return computed(() => {
16
+ const state = own();
17
+ if (state.wrapped) {
18
+ const id = state.id ?? generated;
19
+ return {
20
+ id,
21
+ labelId: void 0,
22
+ describedBy: state.hasMessage ? fieldMessageId(id) : void 0,
23
+ invalid: !!state.invalid,
24
+ required: !!state.required,
25
+ disabled: !!state.disabled
26
+ };
27
+ }
28
+ const field = outer?.value;
29
+ return {
30
+ id: state.id ?? field?.id,
31
+ labelId: field?.labelId,
32
+ describedBy: field?.describedBy,
33
+ invalid: !!state.invalid || !!field?.invalid,
34
+ required: !!state.required || !!field?.required,
35
+ disabled: !!state.disabled || !!field?.disabled
36
+ };
37
+ });
38
+ }
39
+ export {
40
+ LP_FIELD,
41
+ fieldMessageId,
42
+ provideField,
43
+ useField,
44
+ useFieldControl
45
+ };
@@ -0,0 +1,17 @@
1
+ import { type Ref } from "vue";
2
+ export type FieldNoticeTone = "info" | "danger";
3
+ export interface FieldNoticeOptions {
4
+ tone?: FieldNoticeTone;
5
+ /** How long it stays, in ms. 0 keeps it until `clear()`. */
6
+ duration?: number;
7
+ }
8
+ export interface FieldNotice {
9
+ message: Ref<string>;
10
+ tone: Ref<FieldNoticeTone>;
11
+ /** Bumped on every `show`, so a repeat of the same note can nudge rather than sit still. */
12
+ seq: Ref<number>;
13
+ show: (text: string, options?: FieldNoticeOptions) => void;
14
+ clear: () => void;
15
+ }
16
+ export declare const FIELD_NOTICE_MS = 2600;
17
+ export declare function useFieldNotice(defaultDuration?: number): FieldNotice;
@@ -0,0 +1,28 @@
1
+ import { ref, getCurrentScope, onScopeDispose } from "vue";
2
+ const FIELD_NOTICE_MS = 2600;
3
+ function useFieldNotice(defaultDuration = FIELD_NOTICE_MS) {
4
+ const message = ref("");
5
+ const tone = ref("info");
6
+ const seq = ref(0);
7
+ let timer;
8
+ function clear() {
9
+ if (timer) clearTimeout(timer);
10
+ timer = void 0;
11
+ message.value = "";
12
+ }
13
+ function show(text, options = {}) {
14
+ if (timer) clearTimeout(timer);
15
+ timer = void 0;
16
+ message.value = text;
17
+ tone.value = options.tone ?? "info";
18
+ seq.value++;
19
+ const duration = options.duration ?? defaultDuration;
20
+ if (duration > 0 && text) timer = setTimeout(clear, duration);
21
+ }
22
+ if (getCurrentScope()) onScopeDispose(clear);
23
+ return { message, tone, seq, show, clear };
24
+ }
25
+ export {
26
+ FIELD_NOTICE_MS,
27
+ useFieldNotice
28
+ };
@@ -0,0 +1,53 @@
1
+ import { type ComputedRef, type MaybeRefOrGetter, type Ref, type UnwrapRef } from "vue";
2
+ export type FormErrorMessage = string | null | undefined | void | false;
3
+ export type FieldRule<V, T> = (value: V, values: T) => FormErrorMessage | Promise<FormErrorMessage>;
4
+ export type FormRules<T> = {
5
+ [K in keyof T]?: FieldRule<T[K], T> | FieldRule<T[K], T>[];
6
+ };
7
+ export type FormErrors<T> = Partial<Record<keyof T | "form", string>>;
8
+ export interface UseFormOptions<T extends object> {
9
+ initial: MaybeRefOrGetter<T>;
10
+ rules?: FormRules<T>;
11
+ /** Cross-field checks; return messages by field, or under `form` for the whole form. */
12
+ validate?: (values: T) => FormErrors<T> | void | Promise<FormErrors<T> | void>;
13
+ }
14
+ export interface FieldBinding<V> {
15
+ modelValue: V;
16
+ "onUpdate:modelValue": (value: V) => void;
17
+ onBlur: () => void;
18
+ error: string | undefined;
19
+ invalid: boolean;
20
+ }
21
+ export interface UseForm<T extends object> {
22
+ values: UnwrapRef<T>;
23
+ /** Errors as currently computed, shown or not. */
24
+ errors: ComputedRef<FormErrors<T>>;
25
+ /** Errors the user should see now. */
26
+ visibleErrors: ComputedRef<FormErrors<T>>;
27
+ touched: Partial<Record<keyof T, boolean>>;
28
+ dirty: ComputedRef<boolean>;
29
+ valid: ComputedRef<boolean>;
30
+ validating: Ref<boolean>;
31
+ submitting: Ref<boolean>;
32
+ submitCount: Ref<number>;
33
+ isDirty: (name: keyof T) => boolean;
34
+ /** Props for a kit control: `<LpInput v-bind="form.field('email')" />`. */
35
+ field: <K extends keyof T>(name: K) => FieldBinding<T[K]>;
36
+ set: <K extends keyof T>(name: K, value: T[K]) => void;
37
+ setValues: (values: Partial<T>) => void;
38
+ touch: (name: keyof T) => void;
39
+ /** Run the checks for one field, or all of them; resolves to whether it passed. */
40
+ validate: (name?: keyof T) => Promise<boolean>;
41
+ /** Errors from elsewhere, a server reply most often. Cleared field by field on edit. */
42
+ setErrors: (errors: FormErrors<T>) => void;
43
+ /** Back to `values` (or the current initial), which also become the new baseline. */
44
+ reset: (values?: T) => void;
45
+ /**
46
+ * Wrap the submit handler: touches everything, validates, and calls `fn`
47
+ * only when valid and not already submitting. A successful `fn` makes the
48
+ * submitted values the new baseline.
49
+ */
50
+ handleSubmit: (fn: (values: T) => unknown) => (event?: Event) => Promise<void>;
51
+ }
52
+ export declare function deepEqual(a: unknown, b: unknown): boolean;
53
+ export declare function useForm<T extends object>(options: UseFormOptions<T>): UseForm<T>;
@@ -0,0 +1,207 @@
1
+ import { toValue, reactive, ref, computed, watch, toRaw } from "vue";
2
+ function clone(value) {
3
+ try {
4
+ return structuredClone(toRaw(value));
5
+ } catch {
6
+ return JSON.parse(JSON.stringify(value));
7
+ }
8
+ }
9
+ function deepEqual(a, b) {
10
+ if (Object.is(a, b)) return true;
11
+ if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
12
+ if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) return false;
13
+ if (Array.isArray(a) !== Array.isArray(b)) return false;
14
+ const ka = Object.keys(a);
15
+ const kb = Object.keys(b);
16
+ if (ka.length !== kb.length) return false;
17
+ return ka.every((k) => deepEqual(a[k], b[k]));
18
+ }
19
+ function message(result) {
20
+ return typeof result === "string" && result ? result : void 0;
21
+ }
22
+ function useForm(options) {
23
+ let baseline = clone(toValue(options.initial));
24
+ const values = reactive(clone(baseline));
25
+ const plain = () => values;
26
+ const errors = reactive({});
27
+ const external = reactive({});
28
+ const touched = reactive({});
29
+ const validating = ref(false);
30
+ const submitting = ref(false);
31
+ const submitCount = ref(0);
32
+ const runs = /* @__PURE__ */ new Map();
33
+ const baseVersion = ref(0);
34
+ const keys = () => Object.keys(plain());
35
+ const dirty = computed(() => {
36
+ void baseVersion.value;
37
+ return !deepEqual(plain(), baseline);
38
+ });
39
+ function isDirty(name) {
40
+ void baseVersion.value;
41
+ return !deepEqual(plain()[name], baseline[name]);
42
+ }
43
+ async function checkField(name) {
44
+ const rule = options.rules?.[name];
45
+ const list = Array.isArray(rule) ? rule : rule ? [rule] : [];
46
+ for (const r of list) {
47
+ const found = message(await r(plain()[name], plain()));
48
+ if (found) return found;
49
+ }
50
+ return void 0;
51
+ }
52
+ async function runField(name) {
53
+ const run = (runs.get(name) ?? 0) + 1;
54
+ runs.set(name, run);
55
+ const found = await checkField(name);
56
+ if (runs.get(name) !== run) return !errors[name];
57
+ if (found) errors[name] = found;
58
+ else delete errors[name];
59
+ return !found && !external[name];
60
+ }
61
+ async function runForm() {
62
+ if (!options.validate) return true;
63
+ const run = (runs.get("form") ?? 0) + 1;
64
+ runs.set("form", run);
65
+ const found = await options.validate(plain()) ?? {};
66
+ if (runs.get("form") !== run) return true;
67
+ let ok = true;
68
+ for (const [name, text] of Object.entries(found)) {
69
+ if (!text) continue;
70
+ ok = false;
71
+ if (!errors[name]) errors[name] = text;
72
+ }
73
+ return ok;
74
+ }
75
+ async function validate(name) {
76
+ validating.value = true;
77
+ try {
78
+ if (name !== void 0) return await runField(name);
79
+ if (errors.form) delete errors.form;
80
+ const fields = await Promise.all(keys().map(runField));
81
+ const form = await runForm();
82
+ return fields.every(Boolean) && form && !Object.values(external).some(Boolean);
83
+ } finally {
84
+ validating.value = false;
85
+ }
86
+ }
87
+ function touch(name) {
88
+ touched[name] = true;
89
+ void validate(name);
90
+ }
91
+ function set(name, value) {
92
+ values[name] = value;
93
+ }
94
+ function setValues(next) {
95
+ for (const [k, v] of Object.entries(next)) set(k, v);
96
+ }
97
+ function clearState() {
98
+ for (const k of Object.keys(errors)) delete errors[k];
99
+ for (const k of Object.keys(external)) delete external[k];
100
+ for (const k of Object.keys(touched)) delete touched[k];
101
+ runs.clear();
102
+ submitCount.value = 0;
103
+ }
104
+ function adopt(next) {
105
+ baseline = clone(next);
106
+ const target = values;
107
+ for (const k of Object.keys(target)) if (!(k in baseline)) delete target[k];
108
+ Object.assign(target, clone(baseline));
109
+ baseVersion.value++;
110
+ }
111
+ function reset(next) {
112
+ adopt(next ?? toValue(options.initial));
113
+ clearState();
114
+ }
115
+ function setErrors(next) {
116
+ for (const [k, v] of Object.entries(next)) {
117
+ if (v) external[k] = v;
118
+ else delete external[k];
119
+ }
120
+ }
121
+ watch(
122
+ () => toValue(options.initial),
123
+ (next) => {
124
+ if (!dirty.value && !deepEqual(next, baseline)) adopt(next);
125
+ },
126
+ { deep: true }
127
+ );
128
+ let snapshot = clone(plain());
129
+ watch(
130
+ plain,
131
+ () => {
132
+ const now = clone(plain());
133
+ for (const name of Object.keys(now)) {
134
+ if (deepEqual(now[name], snapshot[name])) continue;
135
+ if (external[name]) delete external[name];
136
+ if (touched[name] || submitCount.value) void validate(name);
137
+ }
138
+ snapshot = now;
139
+ },
140
+ { deep: true }
141
+ );
142
+ const merged = computed(() => ({ ...errors, ...external }));
143
+ const visibleErrors = computed(() => {
144
+ const all = merged.value;
145
+ if (submitCount.value) return all;
146
+ const shown = {};
147
+ for (const [k, v] of Object.entries(all)) {
148
+ if (touched[k] || external[k]) shown[k] = v;
149
+ }
150
+ return shown;
151
+ });
152
+ const valid = computed(() => !Object.values(merged.value).some(Boolean));
153
+ function field(name) {
154
+ const error = visibleErrors.value[name];
155
+ return {
156
+ modelValue: values[name],
157
+ "onUpdate:modelValue": (value) => set(name, value),
158
+ onBlur: () => touch(name),
159
+ error,
160
+ invalid: !!error
161
+ };
162
+ }
163
+ function handleSubmit(fn) {
164
+ return async (event) => {
165
+ event?.preventDefault();
166
+ if (submitting.value) return;
167
+ submitting.value = true;
168
+ try {
169
+ submitCount.value++;
170
+ for (const name of keys()) touched[name] = true;
171
+ if (!await validate()) return;
172
+ const submitted = clone(plain());
173
+ await fn(submitted);
174
+ if (deepEqual(plain(), submitted)) {
175
+ baseline = submitted;
176
+ baseVersion.value++;
177
+ }
178
+ } finally {
179
+ submitting.value = false;
180
+ }
181
+ };
182
+ }
183
+ return {
184
+ values,
185
+ errors: merged,
186
+ visibleErrors,
187
+ touched,
188
+ dirty,
189
+ valid,
190
+ validating,
191
+ submitting,
192
+ submitCount,
193
+ isDirty,
194
+ field,
195
+ set,
196
+ setValues,
197
+ touch,
198
+ validate,
199
+ setErrors,
200
+ reset,
201
+ handleSubmit
202
+ };
203
+ }
204
+ export {
205
+ deepEqual,
206
+ useForm
207
+ };
@@ -24,9 +24,16 @@ export interface UseFormDraftOptions<T> {
24
24
  disabled?: MaybeRefOrGetter<boolean>;
25
25
  }
26
26
  export interface UseFormDraft<T> {
27
- /** A draft was found for this key, and has not been restored or discarded. */
27
+ /**
28
+ * A draft was found for this key, and has not been restored or discarded.
29
+ * Only a draft found on reading counts: the writes this composable makes as
30
+ * the user types never raise it. While it is up, automatic writes are held
31
+ * back, so the draft on offer cannot be overwritten by the form's own state
32
+ * (an async load of the record, or typing past the banner) before the user
33
+ * has answered.
34
+ */
28
35
  hasDraft: Ref<boolean>;
29
- /** When that draft was written, ISO-8601, or `null` when there is none. */
36
+ /** When the found draft was written, ISO-8601, or `null` when there is none. */
30
37
  savedAt: Ref<string | null>;
31
38
  /**
32
39
  * The stored value, or `null`. Reading does not apply it — the caller decides
@@ -35,7 +42,7 @@ export interface UseFormDraft<T> {
35
42
  read: () => T | null;
36
43
  /** Forget the draft. Call after applying it, and after a successful save. */
37
44
  discard: () => void;
38
- /** Write now, ignoring `dirty`. For "save and come back to this later". */
45
+ /** Write now, ignoring `dirty` and a pending draft. For "save and come back to this later". */
39
46
  save: () => void;
40
47
  }
41
48
  /**
@@ -16,6 +16,11 @@ function useFormDraft(options) {
16
16
  function currentKey() {
17
17
  return String(toValue(options.key) || "").trim();
18
18
  }
19
+ function fresh(parsed) {
20
+ if (!parsed || parsed.version !== ENVELOPE_VERSION) return false;
21
+ if (maxAge <= 0) return true;
22
+ return !(Date.now() - Date.parse(parsed.savedAt) > maxAge);
23
+ }
19
24
  function read() {
20
25
  const store = storage();
21
26
  const key = currentKey();
@@ -29,17 +34,10 @@ function useFormDraft(options) {
29
34
  if (!raw) return null;
30
35
  try {
31
36
  const parsed = JSON.parse(raw);
32
- if (!parsed || parsed.version !== ENVELOPE_VERSION) {
37
+ if (!fresh(parsed)) {
33
38
  discard();
34
39
  return null;
35
40
  }
36
- if (maxAge > 0) {
37
- const age = Date.now() - Date.parse(parsed.savedAt);
38
- if (age > maxAge) {
39
- discard();
40
- return null;
41
- }
42
- }
43
41
  return parsed.value;
44
42
  } catch {
45
43
  discard();
@@ -50,21 +48,18 @@ function useFormDraft(options) {
50
48
  const store = storage();
51
49
  const key = currentKey();
52
50
  if (!store || !key) return;
53
- const stamp = (/* @__PURE__ */ new Date()).toISOString();
54
51
  try {
55
52
  store.setItem(
56
53
  key,
57
54
  JSON.stringify({
58
55
  version: ENVELOPE_VERSION,
59
- savedAt: stamp,
56
+ savedAt: (/* @__PURE__ */ new Date()).toISOString(),
60
57
  value
61
58
  })
62
59
  );
63
60
  } catch {
64
61
  return;
65
62
  }
66
- hasDraft.value = true;
67
- savedAt.value = stamp;
68
63
  }
69
64
  function discard() {
70
65
  const store = storage();
@@ -97,7 +92,7 @@ function useFormDraft(options) {
97
92
  if (!raw) return;
98
93
  try {
99
94
  const parsed = JSON.parse(raw);
100
- if (parsed?.version !== ENVELOPE_VERSION) return;
95
+ if (!fresh(parsed)) return;
101
96
  hasDraft.value = true;
102
97
  savedAt.value = parsed.savedAt;
103
98
  } catch {
@@ -108,7 +103,7 @@ function useFormDraft(options) {
108
103
  watch(
109
104
  () => [toValue(options.value), toValue(options.dirty), toValue(options.disabled)],
110
105
  ([value, dirty, disabled]) => {
111
- if (disabled) return;
106
+ if (disabled || hasDraft.value) return;
112
107
  if (options.dirty !== void 0 && !dirty) return;
113
108
  write(value);
114
109
  },
@@ -1,7 +1,18 @@
1
1
  import { type MaybeRefOrGetter } from "vue";
2
- export interface HotkeyBinding {
3
- /** Layout-produced key, compared case-insensitively ("l", "f2", "escape"). */
2
+ /** One key of a sequence: a bare key ("g") or a full chord. */
3
+ export interface HotkeyStep {
4
4
  key: string;
5
+ code?: string;
6
+ ctrl?: boolean;
7
+ shift?: boolean;
8
+ alt?: boolean;
9
+ }
10
+ export interface HotkeyBinding {
11
+ /**
12
+ * Layout-produced key, compared case-insensitively ("l", "f2", "escape").
13
+ * Required unless the binding is a `sequence`.
14
+ */
15
+ key?: string;
5
16
  /**
6
17
  * Physical key position ("KeyL", "F2", "Digit1"). Matches on its own, which
7
18
  * is what makes non-Latin layouts work.
@@ -11,11 +22,31 @@ export interface HotkeyBinding {
11
22
  ctrl?: boolean;
12
23
  shift?: boolean;
13
24
  alt?: boolean;
25
+ /**
26
+ * Keys pressed one after another: `"g i"`, or steps for chords and physical
27
+ * positions (`[{ key: "g", code: "KeyG" }, { key: "i", code: "KeyI" }]`).
28
+ * The string form splits on spaces, so a Space step needs the array form.
29
+ */
30
+ sequence?: string | (string | HotkeyStep)[];
31
+ /** How long a sequence waits for its next key, in ms. Default 1000. */
32
+ timeout?: number;
33
+ /** Extra condition checked on every press; `false` leaves the key alone. */
34
+ when?: (event: KeyboardEvent) => boolean;
14
35
  /**
15
36
  * Runs even while a text field has focus. Only for shortcuts that mean
16
37
  * something there — Escape, and the palette the user reaches from anywhere.
17
38
  */
18
39
  allowInInput?: boolean;
40
+ /**
41
+ * Runs even while an overlay owns the keyboard. By default a binding declared
42
+ * outside the topmost modal stays quiet while that modal is open, and an
43
+ * Escape binding declared outside the topmost dismissable layer (dialog,
44
+ * popover, menu) leaves Escape to that layer, so a page-level shortcut can
45
+ * neither act behind a dialog nor stop the dialog from closing.
46
+ */
47
+ overLayers?: boolean;
48
+ /** Set `false` to ignore auto-repeat while the key is held. */
49
+ repeat?: boolean;
19
50
  /**
20
51
  * How the key reference lists this binding while it is mounted. Bindings
21
52
  * without it still work, they just stay out of `activeShortcuts`.
@@ -38,14 +69,19 @@ export interface HotkeyHelp {
38
69
  /**
39
70
  * Written the way it reads, "+"-separated. Defaults to one built from the
40
71
  * binding; set it where the binding is not the whole story, such as the
41
- * second key of a chord ("G+D") or a key that needs Shift to type ("?").
72
+ * key that needs Shift to type ("?"). Sequences read with spaces: "G I".
42
73
  */
43
74
  combo?: string;
44
75
  }
45
76
  export interface ShortcutEntry {
46
- /** Rendered one <kbd> per "+"-separated key, so write it the way it reads. */
77
+ /**
78
+ * Rendered one <kbd> per "+"-separated key, so write it the way it reads.
79
+ * Spaces separate the steps of a sequence ("G I", "Ctrl+K Ctrl+S").
80
+ */
47
81
  combo: string;
48
82
  label: string;
83
+ /** Another mounted binding answers the same keys at the same priority. */
84
+ conflict?: boolean;
49
85
  }
50
86
  export interface ShortcutGroup {
51
87
  title: string;
@@ -57,11 +93,25 @@ export interface ShortcutGroup {
57
93
  * used to pick a label.
58
94
  */
59
95
  export declare const isAppleKeyboard: boolean;
96
+ /**
97
+ * `isAppleKeyboard` for render paths: false until mounted, so the server and
98
+ * the hydrating client print the same label and the client switches after.
99
+ */
100
+ export declare function useAppleKeyboard(): import("vue").Ref<boolean, boolean>;
60
101
  /**
61
102
  * The symbol to print for a modifier on this platform. Bindings treat Ctrl and
62
103
  * Meta as one modifier, so only the label may differ — never the binding.
63
104
  */
64
- export declare function appleModifierLabel(key: string): string;
105
+ export declare function appleModifierLabel(key: string, apple?: boolean): string;
106
+ type KeyLike = Pick<KeyboardEvent, "key" | "code" | "ctrlKey" | "metaKey" | "shiftKey" | "altKey">;
107
+ export declare function matchesHotkey(event: KeyLike, binding: HotkeyBinding | HotkeyStep): boolean;
108
+ /** The keys a binding waits for, in order: one step for a plain binding. */
109
+ export declare function hotkeySteps(binding: HotkeyBinding): HotkeyStep[];
110
+ /**
111
+ * Where a run of presses stands against a binding: "full" when they spell it
112
+ * out, "prefix" when more keys would, otherwise null.
113
+ */
114
+ export declare function sequenceProgress(presses: KeyLike[], binding: HotkeyBinding): "full" | "prefix" | null;
65
115
  /**
66
116
  * Bind a list of hotkeys for as long as the calling component is mounted.
67
117
  *
@@ -86,7 +136,32 @@ export interface UseHotkeysOptions {
86
136
  */
87
137
  scope?: MaybeRefOrGetter<HTMLElement | null | undefined>;
88
138
  }
139
+ /**
140
+ * The keys of a sequence typed so far ("G" after the first key of "g i"),
141
+ * empty when nothing is pending. For a "G…" hint while the next key is awaited.
142
+ */
143
+ export declare const pendingHotkey: import("vue").ComputedRef<string[]>;
89
144
  export declare function useHotkeys(bindings: MaybeRefOrGetter<HotkeyBinding[]>, options?: UseHotkeysOptions): void;
145
+ export interface HotkeyConflict {
146
+ /** The keys both answer, written as in the shortcut reference. */
147
+ combo: string;
148
+ /** `help` labels of the clashing bindings; unlabelled ones are omitted. */
149
+ labels: string[];
150
+ priority: number;
151
+ }
152
+ /**
153
+ * Pure part of `hotkeyConflicts`: bindings from different `useHotkeys` calls
154
+ * answering the same keys at the same priority within the same scope. Within
155
+ * one call a repeat is deliberate (the first may decline), and a binding with
156
+ * `when` is conditional by design, so neither counts.
157
+ */
158
+ export declare function findHotkeyConflicts(groups: {
159
+ bindings: HotkeyBinding[];
160
+ priority: number;
161
+ scope: unknown;
162
+ }[]): HotkeyConflict[];
163
+ /** Bindings among the mounted ones that answer the same keys. */
164
+ export declare const hotkeyConflicts: import("vue").ComputedRef<HotkeyConflict[]>;
90
165
  /**
91
166
  * The shortcuts that work right now, grouped for `LpShortcutsDialog`: every
92
167
  * binding with `help` from every mounted `useHotkeys`. A screen that binds its
@@ -99,3 +174,4 @@ export declare const activeShortcuts: import("vue").ComputedRef<ShortcutGroup[]>
99
174
  * when it lists both its own entries and the live ones.
100
175
  */
101
176
  export declare function mergeShortcutGroups(...lists: ShortcutGroup[][]): ShortcutGroup[];
177
+ export {};