@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
@@ -1,7 +1,8 @@
1
- import { defineComponent, computed, reactive, watch, openBlock, createElementBlock, mergeProps, unref, toDisplayString, createCommentVNode, createElementVNode, createVNode, normalizeClass, normalizeStyle, Fragment, renderList } from "vue";
1
+ import { defineComponent, computed, reactive, watch, ref, openBlock, createElementBlock, mergeProps, unref, toDisplayString, createCommentVNode, createElementVNode, createVNode, normalizeClass, normalizeStyle, Fragment, renderList } from "vue";
2
2
  import { useClipboard } from "../composables/useClipboard.js";
3
- import { tokenizeLine } from "../components/codeHighlight.js";
4
- import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
3
+ import { tokenizeLines } from "../components/codeHighlight.js";
4
+ import { useLabels } from "../composables/useLpConfig.js";
5
+ import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
5
6
  import { useMergedAttrs } from "../composables/useMergedClass.js";
6
7
  const _hoisted_1 = {
7
8
  key: 0,
@@ -50,12 +51,27 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
50
51
  copyable: { type: Boolean, default: true },
51
52
  title: {},
52
53
  height: {},
53
- foldImports: { type: Boolean, default: false }
54
+ foldImports: { type: Boolean, default: false },
55
+ labels: {}
54
56
  },
55
57
  emits: ["update:modelValue", "update:locked"],
56
58
  setup(__props, { emit: __emit }) {
57
59
  const props = __props;
58
60
  const emit = __emit;
61
+ const text = useLabels(
62
+ "codeBlock",
63
+ {
64
+ unlock: "Unlock to edit",
65
+ lock: "Lock (read-only)",
66
+ copy: "Copy code",
67
+ copied: "Copied",
68
+ imports: "imports",
69
+ details: "details",
70
+ /** `{n}` is replaced by the count. */
71
+ lines: "({n} lines)"
72
+ },
73
+ () => props.labels
74
+ );
59
75
  const code = computed(() => props.modelValue ?? "");
60
76
  const rawLines = computed(() => code.value.replace(/\n$/, "").split("\n"));
61
77
  const REGION_START = /^\s*(?:\/\/|#|--)\s*#region\b\s*(.*?)\s*$/;
@@ -85,7 +101,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
85
101
  flushPlain();
86
102
  const lines = [];
87
103
  for (let k = start; k < realEnd; k++) lines.push({ n: k + 1, text: src[k] });
88
- out.push({ kind: "fold", id: foldId++, label: "imports", defaultOpen: false, lines });
104
+ out.push({ kind: "fold", id: foldId++, label: text.value.imports, defaultOpen: false, lines });
89
105
  i = realEnd;
90
106
  }
91
107
  }
@@ -96,7 +112,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
96
112
  flushPlain();
97
113
  const rest2 = startMatch[1] ?? "";
98
114
  const defaultOpen = /\bopen\b/.test(rest2);
99
- const label = rest2.replace(/\bopen\b/, "").trim() || "details";
115
+ const label = rest2.replace(/\bopen\b/, "").trim() || text.value.details;
100
116
  const lines = [];
101
117
  i++;
102
118
  for (; i < src.length; i++) {
@@ -112,6 +128,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
112
128
  return out;
113
129
  });
114
130
  const hasFolds = computed(() => segments.value.some((s) => s.kind === "fold"));
131
+ const editing = computed(() => !props.locked && !hasFolds.value);
115
132
  const openState = reactive({});
116
133
  watch(
117
134
  segments,
@@ -124,8 +141,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
124
141
  function toggleFold(id) {
125
142
  openState[id] = !openState[id];
126
143
  }
127
- function tokens(text) {
128
- return tokenizeLine(text, props.lang);
144
+ const highlighted = computed(() => tokenizeLines(rawLines.value, props.lang));
145
+ function tokens(n) {
146
+ return highlighted.value[n - 1] ?? [];
147
+ }
148
+ const preEl = ref(null);
149
+ function syncScroll(e) {
150
+ const area = e.target;
151
+ if (!preEl.value) return;
152
+ preEl.value.scrollLeft = area.scrollLeft;
153
+ preEl.value.scrollTop = area.scrollTop;
129
154
  }
130
155
  const copyText = computed(
131
156
  () => segments.value.flatMap((s) => s.lines.map((l) => l.text)).join("\n")
@@ -154,7 +179,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
154
179
  key: 0,
155
180
  type: "button",
156
181
  class: "group/lock flex items-center gap-1 rounded px-1.5 py-1 outline-none transition-colors duration-[var(--duration-fast)] hover:text-ink focus-visible:ring-2 focus-visible:ring-ring",
157
- "aria-label": __props.locked ? "Unlock to edit" : "Lock (read-only)",
182
+ "aria-label": __props.locked ? unref(text).unlock : unref(text).lock,
158
183
  onClick: toggleLock
159
184
  }, [
160
185
  createVNode(_sfc_main$1, {
@@ -167,7 +192,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
167
192
  key: 1,
168
193
  type: "button",
169
194
  class: "group/copy flex items-center gap-1 rounded px-1.5 py-1 outline-none transition-colors duration-[var(--duration-fast)] hover:text-ink focus-visible:ring-2 focus-visible:ring-ring",
170
- "aria-label": unref(copied) ? "Copied" : "Copy code",
195
+ "aria-label": unref(copied) ? unref(text).copied : unref(text).copy,
171
196
  onClick: copy
172
197
  }, [
173
198
  createVNode(_sfc_main$1, {
@@ -179,18 +204,25 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
179
204
  ])
180
205
  ])) : createCommentVNode("", true),
181
206
  createElementVNode("div", {
182
- class: normalizeClass(["lp-scrollbar-none relative", __props.height ? "overflow-auto" : ""]),
207
+ class: normalizeClass(["lp-scrollbar-none relative", __props.height ? editing.value ? "overflow-hidden" : "overflow-auto" : ""]),
183
208
  style: normalizeStyle(__props.height ? { height: __props.height } : void 0)
184
209
  }, [
185
210
  !__props.locked && !hasFolds.value ? (openBlock(), createElementBlock("textarea", {
186
211
  key: 0,
187
212
  value: code.value,
188
213
  spellcheck: "false",
189
- class: normalizeClass(["lp-scrollbar-none absolute inset-0 size-full resize-none overflow-auto whitespace-pre bg-transparent p-3 leading-relaxed text-transparent caret-brand outline-none", [__props.wrap ? "whitespace-pre-wrap break-words" : "whitespace-pre", __props.lineNumbers ? "pl-12" : ""]]),
190
- onInput
214
+ class: normalizeClass(["lp-scrollbar-none absolute inset-0 size-full resize-none overflow-auto whitespace-pre bg-transparent p-3 leading-relaxed text-transparent caret-brand outline-none", [__props.wrap ? "whitespace-pre-wrap break-words" : "whitespace-pre", __props.lineNumbers ? "pl-13" : ""]]),
215
+ onInput,
216
+ onScroll: syncScroll
191
217
  }, null, 42, _hoisted_7)) : createCommentVNode("", true),
192
218
  createElementVNode("pre", {
193
- class: normalizeClass(["lp-scrollbar-none m-0 overflow-auto p-3 leading-relaxed", [__props.wrap ? "whitespace-pre-wrap break-words" : "whitespace-pre", !__props.locked && !hasFolds.value ? "pointer-events-none" : ""]])
219
+ ref_key: "preEl",
220
+ ref: preEl,
221
+ class: normalizeClass(["lp-scrollbar-none m-0 overflow-auto p-3 leading-relaxed", [
222
+ __props.wrap ? "whitespace-pre-wrap break-words" : "whitespace-pre",
223
+ editing.value ? "pointer-events-none" : "",
224
+ editing.value && __props.height ? "h-full overflow-hidden" : ""
225
+ ]])
194
226
  }, [
195
227
  createElementVNode("code", _hoisted_8, [
196
228
  (openBlock(true), createElementBlock(Fragment, null, renderList(segments.value, (seg, s) => {
@@ -201,7 +233,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
201
233
  class: "block min-h-[1.4em]"
202
234
  }, [
203
235
  __props.lineNumbers ? (openBlock(), createElementBlock("span", _hoisted_9, toDisplayString(ln.n), 1)) : createCommentVNode("", true),
204
- (openBlock(true), createElementBlock(Fragment, null, renderList(tokens(ln.text), (tok, j) => {
236
+ (openBlock(true), createElementBlock(Fragment, null, renderList(tokens(ln.n), (tok, j) => {
205
237
  return openBlock(), createElementBlock("span", {
206
238
  key: j,
207
239
  class: normalizeClass(tok.cls)
@@ -221,7 +253,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
221
253
  class: "shrink-0"
222
254
  }, null, 8, ["name"]),
223
255
  createElementVNode("span", _hoisted_11, toDisplayString(openState[seg.id] ? seg.label : seg.label + " …"), 1),
224
- !openState[seg.id] ? (openBlock(), createElementBlock("span", _hoisted_12, "(" + toDisplayString(seg.lines.length) + " lines)", 1)) : createCommentVNode("", true)
256
+ !openState[seg.id] ? (openBlock(), createElementBlock("span", _hoisted_12, toDisplayString(unref(text).lines.replace("{n}", String(seg.lines.length))), 1)) : createCommentVNode("", true)
225
257
  ], 8, _hoisted_10),
226
258
  openState[seg.id] ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(seg.lines, (ln) => {
227
259
  return openBlock(), createElementBlock("span", {
@@ -229,7 +261,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
229
261
  class: "block min-h-[1.4em]"
230
262
  }, [
231
263
  __props.lineNumbers ? (openBlock(), createElementBlock("span", _hoisted_13, toDisplayString(ln.n), 1)) : createCommentVNode("", true),
232
- (openBlock(true), createElementBlock(Fragment, null, renderList(tokens(ln.text), (tok, j) => {
264
+ (openBlock(true), createElementBlock(Fragment, null, renderList(tokens(ln.n), (tok, j) => {
233
265
  return openBlock(), createElementBlock("span", {
234
266
  key: j,
235
267
  class: normalizeClass(tok.cls)
@@ -1,14 +1,17 @@
1
- import { defineComponent, computed, ref, watch, openBlock, createBlock, unref, withCtx, createVNode, createElementVNode, normalizeClass, normalizeStyle, toDisplayString, createElementBlock, createCommentVNode, Fragment, renderList, renderSlot } from "vue";
1
+ import { defineComponent, computed, ref, watch, openBlock, createBlock, unref, withCtx, createVNode, createElementVNode, normalizeClass, normalizeStyle, toDisplayString, createElementBlock, createCommentVNode, withDirectives, vShow, withKeys, Fragment, renderList, renderSlot, nextTick } from "vue";
2
2
  import { PopoverRoot, PopoverAnchor, PopoverTrigger, PopoverPortal, PopoverContent } from "reka-ui";
3
+ import { prefersReducedMotion } from "../composables/easing.js";
4
+ import { useFieldControl } from "../composables/useField.js";
3
5
  import { DEFAULT_SWATCHES, formatColor, opaqueCss, parseColor, rgbToHsv, isLight, clampHsv } from "../components/color.js";
4
6
  import { useClipboard } from "../composables/useClipboard.js";
5
7
  import { POPOVER_PANEL } from "../components/dropdown.js";
6
- import { _ as _sfc_main$1 } from "./LpContextMenu-CwW1QXe_.js";
7
- import { _ as _sfc_main$2 } from "./LpIcon-CCnX5_2j.js";
8
- const _hoisted_1 = ["disabled", "aria-label"];
8
+ import { _ as _sfc_main$1 } from "./LpContextMenu-BqkAYa9X.js";
9
+ import { _ as _sfc_main$2 } from "./LpIcon-DYtaid0K.js";
10
+ import { _ as _sfc_main$3 } from "./LpRollingText-DB7upf-5.js";
11
+ const _hoisted_1 = ["id", "disabled", "aria-label", "aria-invalid", "aria-describedby"];
9
12
  const _hoisted_2 = { class: "min-w-0 flex-1 truncate font-mono text-xs text-muted-strong" };
10
13
  const _hoisted_3 = { class: "flex flex-col gap-3" };
11
- const _hoisted_4 = ["tabindex", "aria-label", "aria-valuetext"];
14
+ const _hoisted_4 = ["tabindex", "aria-label", "aria-valuenow", "aria-valuetext"];
12
15
  const _hoisted_5 = ["aria-label", "aria-valuenow", "tabindex"];
13
16
  const _hoisted_6 = ["aria-label", "aria-valuenow", "tabindex"];
14
17
  const _hoisted_7 = {
@@ -16,13 +19,15 @@ const _hoisted_7 = {
16
19
  "data-lp-ring-owner": "",
17
20
  class: "flex h-(--size-control-sm) items-center gap-2 overflow-hidden rounded-control border border-line bg-surface-soft px-2 transition-colors duration-[var(--duration-fast)] focus-within:border-brand focus-within:ring-2 focus-within:ring-ring"
18
21
  };
19
- const _hoisted_8 = ["value", "disabled", "aria-label"];
20
- const _hoisted_9 = {
22
+ const _hoisted_8 = { class: "relative flex min-w-0 flex-1 items-center" };
23
+ const _hoisted_9 = ["value", "disabled", "aria-label"];
24
+ const _hoisted_10 = {
21
25
  key: 0,
22
26
  class: "text-[11px] font-medium uppercase tracking-wide text-muted"
23
27
  };
24
- const _hoisted_10 = ["disabled", "aria-label", "aria-pressed", "onClick"];
28
+ const _hoisted_11 = ["disabled", "aria-label", "aria-pressed", "onClick"];
25
29
  const CHECKERBOARD = "repeating-conic-gradient(var(--color-line-strong) 0% 25%, transparent 0% 50%) 0 0 / 12px 12px";
30
+ const ROLL_MS = 320;
26
31
  const _sfc_main = /* @__PURE__ */ defineComponent({
27
32
  __name: "LpColorPicker",
28
33
  props: {
@@ -123,7 +128,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
123
128
  el.addEventListener("pointercancel", up);
124
129
  }
125
130
  const onFieldPointer = (e) => trackPointer(e, (x, y) => set({ s: x, v: 1 - y }));
126
- const onHuePointer = (e) => trackPointer(e, (x) => set({ h: x * 360 }));
131
+ const onHuePointer = (e) => trackPointer(e, (x) => set({ h: Math.min(x * 360, 359.9) }));
127
132
  const onAlphaPointer = (e) => trackPointer(e, (x) => set({ a: x }));
128
133
  function step(e, axis) {
129
134
  const big = e.shiftKey;
@@ -148,6 +153,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
148
153
  set({ s: hsv.value.s + dx / 100, v: hsv.value.v + dy / 100 }, true);
149
154
  }
150
155
  const typed = ref(null);
156
+ let typedChange = false;
151
157
  const inputValue = computed(() => typed.value ?? current.value);
152
158
  function onInput(e) {
153
159
  const value = e.target.value;
@@ -157,10 +163,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
157
163
  const next = rgbToHsv(rgb);
158
164
  if (next.s === 0) next.h = hsv.value.h;
159
165
  if (next.v === 0) next.s = hsv.value.s;
160
- set(props.alpha ? next : { ...next, a: 1 }, true);
166
+ set(props.alpha ? next : { ...next, a: 1 });
167
+ typedChange = true;
168
+ }
169
+ function commitTyped() {
170
+ if (!typedChange) return;
171
+ typedChange = false;
172
+ emit("change", current.value);
161
173
  }
162
174
  function onInputBlur() {
163
175
  typed.value = null;
176
+ commitTyped();
164
177
  }
165
178
  function pickSwatch(value) {
166
179
  const rgb = parseColor(value);
@@ -223,8 +236,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
223
236
  } catch {
224
237
  }
225
238
  }
239
+ let openedOn = "";
226
240
  watch(open, (isOpen, was) => {
227
- if (was && !isOpen) remember(current.value);
241
+ if (isOpen) openedOn = current.value;
242
+ else if (was && current.value !== openedOn) remember(current.value);
228
243
  });
229
244
  const swatchRows = computed(
230
245
  () => [
@@ -264,9 +279,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
264
279
  } catch {
265
280
  }
266
281
  }
282
+ const rollText = ref(current.value);
283
+ const rolling = ref(false);
284
+ let rollTimer;
267
285
  function setFormat(f) {
268
286
  if (activeFormat.value === f) return;
287
+ rollText.value = inputValue.value;
269
288
  activeFormat.value = f;
289
+ if (!prefersReducedMotion()) {
290
+ rolling.value = true;
291
+ void nextTick(() => rollText.value = current.value);
292
+ if (rollTimer) clearTimeout(rollTimer);
293
+ rollTimer = setTimeout(() => rolling.value = false, ROLL_MS + 40);
294
+ }
270
295
  typed.value = null;
271
296
  emit("update:modelValue", current.value);
272
297
  emit("change", current.value);
@@ -294,6 +319,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
294
319
  ];
295
320
  return own.length ? [...builtin, { ...own[0], separatorBefore: true }, ...own.slice(1)] : builtin;
296
321
  });
322
+ const field = useFieldControl(() => ({
323
+ wrapped: false,
324
+ invalid: props.invalid,
325
+ disabled: props.disabled
326
+ }));
297
327
  __expose({ open });
298
328
  return (_ctx, _cache) => {
299
329
  return openBlock(), createBlock(unref(PopoverRoot), {
@@ -309,11 +339,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
309
339
  default: withCtx(() => [
310
340
  createElementVNode("button", {
311
341
  type: "button",
312
- disabled: __props.disabled,
342
+ id: unref(field).id,
343
+ disabled: unref(field).disabled,
313
344
  "aria-label": __props.ariaLabel,
345
+ "aria-invalid": unref(field).invalid || void 0,
346
+ "aria-describedby": unref(field).describedBy,
314
347
  class: normalizeClass(["group inline-flex w-full items-center gap-2 rounded-control border bg-surface-soft px-2 text-left text-ink outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:border-brand disabled:cursor-not-allowed disabled:opacity-55", [
315
348
  triggerSize[__props.size],
316
- __props.invalid ? "border-danger focus-visible:ring-danger-soft" : "border-line focus-visible:border-brand"
349
+ unref(field).invalid ? "border-danger focus-visible:ring-danger-soft" : "border-line focus-visible:border-brand"
317
350
  ]])
318
351
  }, [
319
352
  createElementVNode("span", {
@@ -345,6 +378,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
345
378
  createVNode(unref(PopoverPortal), null, {
346
379
  default: withCtx(() => [
347
380
  createVNode(unref(PopoverContent), {
381
+ "collision-padding": 8,
348
382
  side: __props.side,
349
383
  align: __props.align,
350
384
  "side-offset": 6,
@@ -359,6 +393,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
359
393
  role: "slider",
360
394
  tabindex: __props.disabled ? -1 : 0,
361
395
  "aria-label": l.value.saturation,
396
+ "aria-valuemin": 0,
397
+ "aria-valuemax": 100,
398
+ "aria-valuenow": Math.round(hsv.value.s * 100),
362
399
  "aria-valuetext": fill(l.value.saturationValueText, { s: Math.round(hsv.value.s * 100), v: Math.round(hsv.value.v * 100) }),
363
400
  class: "relative h-36 w-full cursor-crosshair touch-none overflow-hidden rounded-control outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring",
364
401
  style: normalizeStyle(fieldStyle.value),
@@ -418,24 +455,36 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
418
455
  class: "size-4 shrink-0 rounded-[5px] border border-line",
419
456
  style: normalizeStyle({ backgroundColor: previewCss.value })
420
457
  }, null, 4),
421
- createElementVNode("input", {
422
- value: inputValue.value,
423
- disabled: __props.disabled,
424
- spellcheck: "false",
425
- autocapitalize: "off",
426
- autocomplete: "off",
427
- "aria-label": l.value.value,
428
- class: "min-w-0 flex-1 select-text bg-transparent font-mono text-xs text-ink outline-none placeholder:text-muted",
429
- onInput,
430
- onBlur: onInputBlur
431
- }, null, 40, _hoisted_8)
458
+ createElementVNode("span", _hoisted_8, [
459
+ withDirectives(createVNode(_sfc_main$3, {
460
+ value: rollText.value,
461
+ duration: ROLL_MS,
462
+ align: "start",
463
+ "aria-hidden": "true",
464
+ class: "pointer-events-none absolute inset-0 font-mono text-xs text-ink"
465
+ }, null, 8, ["value"]), [
466
+ [vShow, rolling.value]
467
+ ]),
468
+ createElementVNode("input", {
469
+ value: inputValue.value,
470
+ disabled: __props.disabled,
471
+ spellcheck: "false",
472
+ autocapitalize: "off",
473
+ autocomplete: "off",
474
+ "aria-label": l.value.value,
475
+ class: normalizeClass(["min-w-0 flex-1 select-text bg-transparent font-mono text-xs text-ink outline-none placeholder:text-muted", rolling.value ? "text-transparent" : ""]),
476
+ onInput,
477
+ onKeydown: withKeys(commitTyped, ["enter"]),
478
+ onBlur: onInputBlur
479
+ }, null, 42, _hoisted_9)
480
+ ])
432
481
  ])) : createCommentVNode("", true),
433
482
  (openBlock(true), createElementBlock(Fragment, null, renderList(swatchRows.value, (row) => {
434
483
  return openBlock(), createElementBlock("div", {
435
484
  key: row.key,
436
485
  class: "flex flex-col gap-1.5"
437
486
  }, [
438
- row.heading ? (openBlock(), createElementBlock("span", _hoisted_9, toDisplayString(row.heading), 1)) : createCommentVNode("", true),
487
+ row.heading ? (openBlock(), createElementBlock("span", _hoisted_10, toDisplayString(row.heading), 1)) : createCommentVNode("", true),
439
488
  createElementVNode("div", {
440
489
  class: normalizeClass(["grid gap-1.5", row.cols])
441
490
  }, [
@@ -461,7 +510,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
461
510
  size: 13,
462
511
  class: normalizeClass(["relative", tickClass(c)])
463
512
  }, null, 8, ["class"])) : createCommentVNode("", true)
464
- ], 14, _hoisted_10);
513
+ ], 14, _hoisted_11);
465
514
  }), 128))
466
515
  ], 2)
467
516
  ]);
@@ -1,35 +1,75 @@
1
- import { defineComponent, computed, openBlock, createBlock, createSlots, withCtx, renderSlot, createVNode, createTextVNode, toDisplayString, createElementVNode, normalizeClass } from "vue";
2
- import { _ as _sfc_main$2 } from "./LpButton-5VXXCjwF.js";
3
- import { _ as _sfc_main$3 } from "./LpIcon-CCnX5_2j.js";
4
- import { _ as _sfc_main$1 } from "./LpModal-Bt0pQCI_.js";
1
+ import { defineComponent, computed, ref, watch, openBlock, createBlock, createSlots, withCtx, renderSlot, createElementBlock, toDisplayString, createCommentVNode, createVNode, createTextVNode, unref, createElementVNode, normalizeClass, nextTick } from "vue";
2
+ import { useLabels } from "../composables/useLpConfig.js";
3
+ import { _ as _sfc_main$2 } from "./LpButton-CKSwC6Mu.js";
4
+ import { _ as _sfc_main$3 } from "./LpIcon-DYtaid0K.js";
5
+ import { _ as _sfc_main$1 } from "./LpModal-DMMDQHAu.js";
5
6
  const _hoisted_1 = { class: "inline-flex items-center gap-2.5" };
7
+ const _hoisted_2 = {
8
+ key: 0,
9
+ role: "alert",
10
+ class: "mt-3 text-sm text-danger"
11
+ };
6
12
  const _sfc_main = /* @__PURE__ */ defineComponent({
7
13
  __name: "LpConfirmDialog",
8
14
  props: {
9
15
  open: { type: Boolean },
10
16
  title: {},
11
17
  description: {},
12
- confirmLabel: { default: "Confirm" },
13
- cancelLabel: { default: "Cancel" },
18
+ confirmLabel: {},
19
+ cancelLabel: {},
14
20
  danger: { type: Boolean },
15
21
  icon: {},
16
22
  loading: { type: Boolean },
17
- loadingLabel: { default: "Working…" },
18
- glass: { type: Boolean, default: void 0 }
23
+ loadingLabel: {},
24
+ action: {},
25
+ glass: { type: Boolean, default: void 0 },
26
+ labels: {}
19
27
  },
20
28
  emits: ["update:open", "confirm", "cancel"],
21
29
  setup(__props, { emit: __emit }) {
22
30
  const props = __props;
23
31
  const emit = __emit;
32
+ const text = useLabels(
33
+ "confirm",
34
+ { confirm: "Confirm", cancel: "Cancel", loading: "Working…", failed: "Something went wrong." },
35
+ () => props.labels
36
+ );
24
37
  const marker = computed(() => {
25
38
  if (props.icon !== void 0) return props.icon;
26
39
  return props.danger ? "lucide:triangle-alert" : "";
27
40
  });
28
- function confirm() {
41
+ const running = ref(false);
42
+ const error = ref("");
43
+ const busy = computed(() => props.loading || running.value);
44
+ watch(
45
+ () => props.open,
46
+ (open) => {
47
+ if (open) error.value = "";
48
+ }
49
+ );
50
+ async function confirm() {
51
+ if (busy.value) return;
52
+ error.value = "";
29
53
  emit("confirm");
54
+ if (props.action) {
55
+ running.value = true;
56
+ try {
57
+ await props.action();
58
+ } catch (e) {
59
+ error.value = e instanceof Error && e.message ? e.message : text.value.failed;
60
+ return;
61
+ } finally {
62
+ running.value = false;
63
+ }
64
+ emit("update:open", false);
65
+ return;
66
+ }
67
+ await nextTick();
30
68
  if (!props.loading) emit("update:open", false);
31
69
  }
32
- function cancel() {
70
+ function dismiss(open) {
71
+ if (open) return emit("update:open", true);
72
+ if (busy.value) return;
33
73
  emit("cancel");
34
74
  emit("update:open", false);
35
75
  }
@@ -39,32 +79,34 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
39
79
  open: __props.open,
40
80
  title: __props.title,
41
81
  description: __props.description,
42
- "onUpdate:open": _cache[0] || (_cache[0] = (v) => _ctx.$emit("update:open", v))
82
+ role: "alertdialog",
83
+ "onUpdate:open": dismiss
43
84
  }, createSlots({
44
85
  footer: withCtx(() => [
45
86
  createVNode(_sfc_main$2, {
46
87
  variant: "ghost",
47
- disabled: __props.loading,
48
- onClick: cancel
88
+ disabled: busy.value,
89
+ onClick: _cache[0] || (_cache[0] = ($event) => dismiss(false))
49
90
  }, {
50
91
  default: withCtx(() => [
51
- createTextVNode(toDisplayString(__props.cancelLabel), 1)
92
+ createTextVNode(toDisplayString(__props.cancelLabel ?? unref(text).cancel), 1)
52
93
  ]),
53
94
  _: 1
54
95
  }, 8, ["disabled"]),
55
96
  createVNode(_sfc_main$2, {
56
97
  variant: __props.danger ? "danger" : "solid",
57
- disabled: __props.loading,
98
+ disabled: busy.value,
58
99
  onClick: confirm
59
100
  }, {
60
101
  default: withCtx(() => [
61
- createTextVNode(toDisplayString(__props.loading ? __props.loadingLabel : __props.confirmLabel), 1)
102
+ createTextVNode(toDisplayString(busy.value ? __props.loadingLabel ?? unref(text).loading : __props.confirmLabel ?? unref(text).confirm), 1)
62
103
  ]),
63
104
  _: 1
64
105
  }, 8, ["variant", "disabled"])
65
106
  ]),
66
107
  default: withCtx(() => [
67
- renderSlot(_ctx.$slots, "default")
108
+ renderSlot(_ctx.$slots, "default"),
109
+ error.value ? (openBlock(), createElementBlock("p", _hoisted_2, toDisplayString(error.value), 1)) : createCommentVNode("", true)
68
110
  ]),
69
111
  _: 2
70
112
  }, [
@@ -0,0 +1,49 @@
1
+ import { defineComponent, computed, ref, watch, openBlock, createBlock, createCommentVNode } from "vue";
2
+ import { confirmQueue, settleConfirm } from "../components/confirm.js";
3
+ import { _ as _sfc_main$1 } from "./LpConfirmDialog-DCw5jR1t.js";
4
+ const _sfc_main = /* @__PURE__ */ defineComponent({
5
+ __name: "LpConfirmHost",
6
+ props: {
7
+ glass: { type: Boolean, default: void 0 }
8
+ },
9
+ setup(__props) {
10
+ const current = computed(() => confirmQueue[0]);
11
+ const open = ref(false);
12
+ let confirmed = false;
13
+ const answer = (value) => confirmed = value;
14
+ watch(
15
+ () => current.value?.id,
16
+ (id) => {
17
+ confirmed = false;
18
+ open.value = id !== void 0;
19
+ },
20
+ { immediate: true }
21
+ );
22
+ function onOpen(value) {
23
+ open.value = value;
24
+ const request = current.value;
25
+ if (!value && request) settleConfirm(request.id, confirmed);
26
+ }
27
+ return (_ctx, _cache) => {
28
+ return current.value ? (openBlock(), createBlock(_sfc_main$1, {
29
+ key: current.value.id,
30
+ open: open.value,
31
+ glass: __props.glass,
32
+ title: current.value.title,
33
+ description: current.value.description,
34
+ danger: current.value.danger,
35
+ icon: current.value.icon,
36
+ "confirm-label": current.value.confirmLabel,
37
+ "cancel-label": current.value.cancelLabel,
38
+ "loading-label": current.value.loadingLabel,
39
+ action: current.value.action,
40
+ onConfirm: _cache[0] || (_cache[0] = ($event) => answer(true)),
41
+ onCancel: _cache[1] || (_cache[1] = ($event) => answer(false)),
42
+ "onUpdate:open": onOpen
43
+ }, null, 8, ["open", "glass", "title", "description", "danger", "icon", "confirm-label", "cancel-label", "loading-label", "action"])) : createCommentVNode("", true);
44
+ };
45
+ }
46
+ });
47
+ export {
48
+ _sfc_main as _
49
+ };
@@ -0,0 +1,69 @@
1
+ import { defineComponent, computed, openBlock, createBlock, unref, withCtx, createVNode, renderSlot, normalizeClass, createCommentVNode } from "vue";
2
+ import { ContextMenuRoot, ContextMenuTrigger, ContextMenuPortal, ContextMenuContent } from "reka-ui";
3
+ import { _ as _sfc_main$1 } from "./ContextMenuItems-BtKU7074.js";
4
+ import { POPOVER_PANEL } from "../components/dropdown.js";
5
+ const _sfc_main = /* @__PURE__ */ defineComponent({
6
+ __name: "LpContextMenu",
7
+ props: {
8
+ items: {},
9
+ always: { type: Boolean }
10
+ },
11
+ setup(__props) {
12
+ const props = __props;
13
+ const enabled = computed(() => props.always || props.items.length > 0);
14
+ const PANEL = `${POPOVER_PANEL} z-(--z-popover) min-w-48 p-1 outline-none`;
15
+ const SELECTABLE = /* @__PURE__ */ new Set(["text", "search", "url", "tel", "password"]);
16
+ let field = null;
17
+ function rememberField() {
18
+ const el = document.activeElement;
19
+ const text = el instanceof HTMLTextAreaElement || el instanceof HTMLInputElement && SELECTABLE.has(el.type);
20
+ field = text ? { el, value: el.value, start: el.selectionStart ?? 0, end: el.selectionEnd ?? 0 } : null;
21
+ }
22
+ function returnFocus(event) {
23
+ const saved = field;
24
+ field = null;
25
+ if (!saved || !saved.el.isConnected) return;
26
+ event.preventDefault();
27
+ saved.el.focus();
28
+ if (saved.el.value === saved.value) saved.el.setSelectionRange(saved.start, saved.end);
29
+ }
30
+ return (_ctx, _cache) => {
31
+ return openBlock(), createBlock(unref(ContextMenuRoot), null, {
32
+ default: withCtx(() => [
33
+ createVNode(unref(ContextMenuTrigger), {
34
+ "as-child": "",
35
+ disabled: !enabled.value,
36
+ onContextmenuCapture: rememberField
37
+ }, {
38
+ default: withCtx(() => [
39
+ renderSlot(_ctx.$slots, "default")
40
+ ]),
41
+ _: 3
42
+ }, 8, ["disabled"]),
43
+ __props.items.length ? (openBlock(), createBlock(unref(ContextMenuPortal), { key: 0 }, {
44
+ default: withCtx(() => [
45
+ createVNode(unref(ContextMenuContent), {
46
+ "collision-padding": 8,
47
+ class: normalizeClass(PANEL),
48
+ onCloseAutoFocus: returnFocus
49
+ }, {
50
+ default: withCtx(() => [
51
+ createVNode(_sfc_main$1, {
52
+ items: __props.items,
53
+ panel: PANEL
54
+ }, null, 8, ["items"])
55
+ ]),
56
+ _: 1
57
+ })
58
+ ]),
59
+ _: 1
60
+ })) : createCommentVNode("", true)
61
+ ]),
62
+ _: 3
63
+ });
64
+ };
65
+ }
66
+ });
67
+ export {
68
+ _sfc_main as _
69
+ };