@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
package/README.md CHANGED
@@ -6,9 +6,15 @@ JSON token sets), and a composable block-layout canvas.
6
6
 
7
7
  ## Install
8
8
 
9
- The kit is consumed by the LeavePulse apps via a `file:`/git dependency. It needs
10
- the peer deps it declares (`vue`, `reka-ui`, `tailwindcss`, `tailwind-variants`,
11
- `tailwind-merge`, `motion-v`, `@iconify/vue`).
9
+ Published to the public npm registry:
10
+
11
+ ```bash
12
+ npm install @leavepulse/ui
13
+ ```
14
+
15
+ Peer dependencies to install alongside: `vue` 3.5+, `reka-ui` 2.9+, `tailwindcss` 4,
16
+ `tailwind-variants` 3, `motion-v` 2, `@iconify/vue` 5, `@iconify-json/lucide` and
17
+ `@internationalized/date`. `@nuxt/kit` is only needed for the Nuxt module.
12
18
 
13
19
  ## Usage
14
20
 
@@ -32,6 +38,111 @@ import { LpButton, LpModal } from "@leavepulse/ui"
32
38
  The kit does **not** ship a precompiled stylesheet — your Tailwind build emits the
33
39
  utilities its components use, scoped via the `@source` globs in the CSS entry.
34
40
 
41
+ Apps using the topology canvas (`LpTopologyCanvas`) also import its stylesheet:
42
+
43
+ ```css
44
+ @import "@leavepulse/ui/canvas.css";
45
+ ```
46
+
47
+ ### Theme before mount (plain Vue)
48
+
49
+ Themes are JSON token sets applied at runtime. Paint the saved one before the
50
+ app mounts, so the first frame already has the right colours:
51
+
52
+ ```ts
53
+ import { bootstrapTheme, dark, light, nord, useTheme } from "@leavepulse/ui"
54
+
55
+ bootstrapTheme(dark)
56
+ createApp(App).mount("#app")
57
+
58
+ // later, from a switcher or settings page
59
+ useTheme().setTheme(nord)
60
+ useTheme().setSystem({ light, dark }) // follow the OS colour scheme
61
+ ```
62
+
63
+ `LpThemeProvider` applies a theme to one subtree only (a dark sidebar in a light
64
+ app, a live preview).
65
+
66
+ ### App-wide configuration
67
+
68
+ `provideLpConfig` (or `app.use(lpConfig({...}))`) sets the link component that
69
+ internal links render (`LpLink`, `LpButton` with `to`/`href`, `LpBreadcrumbs`,
70
+ `LpSidebar` items) and overrides the English text the kit renders, per scope:
71
+
72
+ ```ts
73
+ import { RouterLink } from "vue-router"
74
+ import { lpConfig } from "@leavepulse/ui"
75
+
76
+ app.use(lpConfig({
77
+ linkComponent: RouterLink,
78
+ labels: { sidebar: { search: "Suche" }, appShell: { openMenu: "Menü öffnen" } },
79
+ }))
80
+ ```
81
+
82
+ A component's own `labels` prop wins over the configuration.
83
+
84
+ ### Nuxt
85
+
86
+ ```ts
87
+ export default defineNuxtConfig({
88
+ modules: ["@leavepulse/ui/nuxt"],
89
+ leavepulseUi: {
90
+ defaultTheme: "Nord", // fallback when nothing is saved
91
+ themes: "~/themes", // optional: module whose default export is your TokenSet[]
92
+ },
93
+ })
94
+ ```
95
+
96
+ The module registers every exported component, paints the saved theme during
97
+ SSR (from the `lp-theme` cookie, no flash), and provides `NuxtLink` as the link
98
+ component. `theme: false`, `link: false` and `exclude: ["Name"]` opt out.
99
+
100
+ ### Icons
101
+
102
+ `<LpIcon name="lucide:check">` renders offline, never through the iconify API.
103
+ The kit registers only the icons its own components use (about 20 KB instead of
104
+ the whole ~540 KB lucide set). Any other lucide name still renders: the full
105
+ collection loads as a separate chunk of your bundle the first time one is
106
+ needed, and an empty box of the same size holds the place until then.
107
+
108
+ Register icons up front when they must be in the server render or must not wait
109
+ for a chunk:
110
+
111
+ ```ts
112
+ import { registerIcons, registerIconCollection } from "@leavepulse/ui"
113
+
114
+ await registerIcons(["lucide:rocket", "lucide:server"]) // from the bundled lucide set
115
+ registerIconCollection(myIconsJson) // any iconify collection
116
+ import "@leavepulse/ui/icons-all" // the whole lucide set, as before
117
+ ```
118
+
119
+ In Nuxt the module does it for you: `icons: "scan"` (default) registers every
120
+ `lucide:*` literal found in the app's source, so they are in the SSR markup;
121
+ `"all"` registers the whole set, `"kit"` only the kit's own, or pass a list.
122
+
123
+ ### Glass on WebKitGTK (Tauri on Linux)
124
+
125
+ WebKitGTK reports `backdrop-filter` as supported and then draws nothing, and on
126
+ some GPUs (NVIDIA with the proprietary driver) it runs without hardware
127
+ acceleration at all. Call `detectBackdropFilter()` once at startup: glass
128
+ panels then turn solid instead of showing the page unblurred.
129
+
130
+ An app that paints its own wallpaper can keep the frosted look there: hand the
131
+ kit the same `background` value and glass panels draw a blurred copy of it,
132
+ aligned to the screen, under their tint.
133
+
134
+ ```ts
135
+ import { detectBackdropFilter, setGlassBackdrop } from "@leavepulse/ui"
136
+
137
+ detectBackdropFilter()
138
+ setGlassBackdrop("url(/wallpaper.jpg) center / cover no-repeat, #0b0f14")
139
+ // A wallpaper blurred ahead of time is cheaper on an engine that blurs on the CPU:
140
+ // setGlassBackdrop("url(/wallpaper-blurred.jpg) center / cover", { filter: "none" })
141
+ ```
142
+
143
+ Only the wallpaper is softened; live content under a panel stays sharp behind
144
+ its tint. Nothing changes in engines where the real blur works.
145
+
35
146
  ### Native scrollbar skin (opt-in)
36
147
 
37
148
  `LpScrollArea` skins the scroll it owns. For everything it can't — the page
@@ -51,11 +162,14 @@ Hide a specific scrollbar with the `lp-scrollbar-none` class.
51
162
  ## Develop
52
163
 
53
164
  ```bash
54
- bun install # also builds dist via the prepare hook
165
+ bun install
55
166
  bun run dev # live preview/playground on http://127.0.0.1:4500
56
- bun run build # type-check + build the library to dist/
167
+ bun test # unit tests
168
+ bun run build # type-check + build the library and declarations to dist/
169
+ npm run check:pack # the tarball has its declarations and every export target
57
170
  bun run dev:dist # rebuild dist on change (for a linked consumer)
58
171
  ```
59
172
 
60
- `dist/` is generated, not committed — the `prepare` hook rebuilds it on install so
61
- any consumer gets a fresh build.
173
+ `dist/` is generated, not committed. Releases: `npm run release` (or
174
+ `release:minor`) bumps the version and pushes the tag; CI tests, builds and
175
+ publishes it.
@@ -5,81 +5,81 @@
5
5
  * pane from its right edge as it grows. Animating the columns themselves made
6
6
  * every line of the list and the pane re-wrap on every frame.
7
7
  */
8
- .lp-cmd-dialog[data-v-89a89377] {
8
+ .lp-cmd-dialog[data-v-2da506c1] {
9
9
  --lp-cmd-list: min(92vw, 40rem);
10
10
  --lp-cmd-pane: max(0px, min(26rem, 96vw - var(--lp-cmd-list)));
11
11
  width: var(--lp-cmd-list);
12
12
  }
13
- .lp-cmd-split[data-v-89a89377] {
13
+ .lp-cmd-split[data-v-2da506c1] {
14
14
  transition:
15
15
  width 300ms var(--ease-emphasized, ease),
16
16
  min-height 300ms var(--ease-emphasized, ease);
17
17
  }
18
18
  @media (min-width: 768px) {
19
- .lp-cmd-split .lp-cmd-list[data-v-89a89377] {
19
+ .lp-cmd-split .lp-cmd-list[data-v-2da506c1] {
20
20
  flex: 0 0 auto;
21
21
  /* the dialog's 1px border on each side */
22
22
  width: calc(var(--lp-cmd-list) - 2px);
23
23
  }
24
- .lp-cmd-dialog[data-pane="open"][data-v-89a89377] {
24
+ .lp-cmd-dialog[data-pane="open"][data-v-2da506c1] {
25
25
  width: calc(var(--lp-cmd-list) + var(--lp-cmd-pane));
26
26
  min-height: min(76vh, 36rem);
27
27
  }
28
28
  }
29
- .lp-cmd-pane[data-v-89a89377] {
29
+ .lp-cmd-pane[data-v-2da506c1] {
30
30
  width: var(--lp-cmd-pane);
31
31
  }
32
32
  /*
33
33
  * The pane rides in from the right edge while the dialog opens up to it, and
34
34
  * leaves the same way, for as long as the dialog takes to close over it.
35
35
  */
36
- .lp-cmd-pane-enter-active[data-v-89a89377],
37
- .lp-cmd-pane-leave-active[data-v-89a89377] {
36
+ .lp-cmd-pane-enter-active[data-v-2da506c1],
37
+ .lp-cmd-pane-leave-active[data-v-2da506c1] {
38
38
  transition:
39
39
  transform 300ms var(--ease-emphasized, ease),
40
40
  opacity 300ms ease;
41
41
  }
42
- .lp-cmd-pane-enter-from[data-v-89a89377],
43
- .lp-cmd-pane-leave-to[data-v-89a89377] {
42
+ .lp-cmd-pane-enter-from[data-v-2da506c1],
43
+ .lp-cmd-pane-leave-to[data-v-2da506c1] {
44
44
  opacity: 0;
45
45
  transform: translateX(40%);
46
46
  }
47
- .lp-cmd-para[data-v-89a89377] {
48
- animation: lp-cmd-para-in-89a89377 260ms ease-out both;
47
+ .lp-cmd-para[data-v-2da506c1] {
48
+ animation: lp-cmd-para-in-2da506c1 260ms ease-out both;
49
49
  }
50
- @keyframes lp-cmd-para-in-89a89377 {
50
+ @keyframes lp-cmd-para-in-2da506c1 {
51
51
  from {
52
52
  opacity: 0;
53
53
  transform: translateY(4px);
54
54
  }
55
55
  }
56
56
  @media (prefers-reduced-motion: reduce) {
57
- .lp-cmd-split[data-v-89a89377],
58
- .lp-cmd-pane-enter-active[data-v-89a89377],
59
- .lp-cmd-pane-leave-active[data-v-89a89377] {
57
+ .lp-cmd-split[data-v-2da506c1],
58
+ .lp-cmd-pane-enter-active[data-v-2da506c1],
59
+ .lp-cmd-pane-leave-active[data-v-2da506c1] {
60
60
  transition: none;
61
61
  }
62
- .lp-cmd-para[data-v-89a89377] {
62
+ .lp-cmd-para[data-v-2da506c1] {
63
63
  animation: none;
64
64
  }
65
65
  }
66
- .lp-cmd-excerpt[data-v-89a89377] {
66
+ .lp-cmd-excerpt[data-v-2da506c1] {
67
67
  display: -webkit-box;
68
68
  -webkit-box-orient: vertical;
69
69
  overflow: hidden;
70
70
  }
71
71
  /* Each result eases in; honours reduced motion. */
72
- .lp-cmd-item[data-v-89a89377] {
73
- animation: lp-cmd-in-89a89377 140ms ease-out both;
72
+ .lp-cmd-item[data-v-2da506c1] {
73
+ animation: lp-cmd-in-2da506c1 140ms ease-out both;
74
74
  }
75
- @keyframes lp-cmd-in-89a89377 {
75
+ @keyframes lp-cmd-in-2da506c1 {
76
76
  from {
77
77
  opacity: 0;
78
78
  transform: translateY(3px);
79
79
  }
80
80
  }
81
81
  @media (prefers-reduced-motion: reduce) {
82
- .lp-cmd-item[data-v-89a89377] {
82
+ .lp-cmd-item[data-v-2da506c1] {
83
83
  animation: none;
84
84
  }
85
85
  }
@@ -1,9 +1,9 @@
1
1
 
2
- .lp-dropzone__frame rect[data-v-5e560a6d] {
2
+ .lp-dropzone__frame rect[data-v-6f6d375e] {
3
3
  stroke: var(--color-line);
4
4
  transition: stroke var(--duration-fast) linear;
5
5
  }
6
- .lp-dropzone:hover .lp-dropzone__frame rect[data-v-5e560a6d] {
6
+ .lp-dropzone:hover .lp-dropzone__frame rect[data-v-6f6d375e] {
7
7
  stroke: var(--color-line-strong);
8
8
  }
9
9
 
@@ -12,33 +12,33 @@
12
12
  with every other thing on it; under a drag it is the answer to "can I let go
13
13
  here". One dash period per cycle, so the travel is continuous rather than
14
14
  jumping back at the seam. */
15
- .lp-dropzone--over .lp-dropzone__frame rect[data-v-5e560a6d] {
15
+ .lp-dropzone--over .lp-dropzone__frame rect[data-v-6f6d375e] {
16
16
  stroke: var(--color-brand);
17
- animation: lp-dropzone-ants-5e560a6d 500ms linear infinite;
17
+ animation: lp-dropzone-ants-6f6d375e 500ms linear infinite;
18
18
  }
19
- @keyframes lp-dropzone-ants-5e560a6d {
19
+ @keyframes lp-dropzone-ants-6f6d375e {
20
20
  to {
21
21
  stroke-dashoffset: -11;
22
22
  }
23
23
  }
24
24
 
25
25
  /* The dashes fade in and the block settles up a few pixels. */
26
- .lp-dropzone[data-v-5e560a6d] {
27
- animation: lp-dropzone-in-5e560a6d var(--duration-slow) var(--ease-settle) both;
26
+ .lp-dropzone[data-v-6f6d375e] {
27
+ animation: lp-dropzone-in-6f6d375e var(--duration-slow) var(--ease-settle) both;
28
28
  }
29
- .lp-dropzone--waiting[data-v-5e560a6d] {
29
+ .lp-dropzone--waiting[data-v-6f6d375e] {
30
30
  opacity: 0;
31
31
  animation: none;
32
32
  }
33
- @keyframes lp-dropzone-in-5e560a6d {
33
+ @keyframes lp-dropzone-in-6f6d375e {
34
34
  from {
35
35
  opacity: 0;
36
36
  transform: translateY(6px);
37
37
  }
38
38
  }
39
39
  @media (prefers-reduced-motion: reduce) {
40
- .lp-dropzone[data-v-5e560a6d],
41
- .lp-dropzone--waiting[data-v-5e560a6d] {
40
+ .lp-dropzone[data-v-6f6d375e],
41
+ .lp-dropzone--waiting[data-v-6f6d375e] {
42
42
  opacity: 1;
43
43
  transform: none;
44
44
  animation: none;
@@ -46,7 +46,7 @@ from {
46
46
 
47
47
  /* The ants stop, the colour stays: the brand stroke is what says "drop
48
48
  here", and it says it standing still. */
49
- .lp-dropzone--over .lp-dropzone__frame rect[data-v-5e560a6d] {
49
+ .lp-dropzone--over .lp-dropzone__frame rect[data-v-6f6d375e] {
50
50
  animation: none;
51
51
  }
52
52
  }
@@ -2,22 +2,22 @@
2
2
  /* The picture settles into the frame instead of appearing in it. Scale rather
3
3
  than a slide: the frame is the fixed thing here and the image lives inside
4
4
  it, so anything that moved would read as a crop that had shifted. */
5
- .lp-editor__image[data-v-a19a8cf6] {
6
- animation: lp-editor-in-a19a8cf6 var(--duration-slow) var(--ease-settle) both;
5
+ .lp-editor__image[data-v-b510205a] {
6
+ animation: lp-editor-in-b510205a var(--duration-slow) var(--ease-settle) both;
7
7
  }
8
- .lp-editor__image--waiting[data-v-a19a8cf6] {
8
+ .lp-editor__image--waiting[data-v-b510205a] {
9
9
  opacity: 0;
10
10
  animation: none;
11
11
  }
12
- @keyframes lp-editor-in-a19a8cf6 {
12
+ @keyframes lp-editor-in-b510205a {
13
13
  from {
14
14
  opacity: 0;
15
15
  scale: 1.04;
16
16
  }
17
17
  }
18
18
  @media (prefers-reduced-motion: reduce) {
19
- .lp-editor__image[data-v-a19a8cf6],
20
- .lp-editor__image--waiting[data-v-a19a8cf6] {
19
+ .lp-editor__image[data-v-b510205a],
20
+ .lp-editor__image--waiting[data-v-b510205a] {
21
21
  opacity: 1;
22
22
  scale: 1;
23
23
  animation: none;
@@ -9,6 +9,9 @@
9
9
  }
10
10
  .lp-roll__item {
11
11
  display: inline-block;
12
+ max-width: 100%;
13
+ overflow: hidden;
14
+ text-overflow: ellipsis;
12
15
  white-space: nowrap;
13
16
  backface-visibility: hidden;
14
17
  }
@@ -1,12 +1,12 @@
1
1
 
2
2
  /* Two columns where there is room: the list is long enough that one column
3
3
  pushes the last group off a laptop screen. */
4
- .shortcut-groups[data-v-8af3bafc] {
4
+ .shortcut-groups[data-v-1c4cf3fa] {
5
5
  display: grid;
6
6
  gap: 18px;
7
7
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
8
8
  }
9
- .shortcut-group h3[data-v-8af3bafc] {
9
+ .shortcut-group h3[data-v-1c4cf3fa] {
10
10
  margin: 0 0 6px;
11
11
  color: var(--color-muted);
12
12
  font-size: 0.7rem;
@@ -14,31 +14,52 @@
14
14
  letter-spacing: 0.06em;
15
15
  text-transform: uppercase;
16
16
  }
17
- .shortcut-group dl[data-v-8af3bafc] {
17
+ .shortcut-group dl[data-v-1c4cf3fa] {
18
18
  display: flex;
19
19
  flex-direction: column;
20
20
  gap: 1px;
21
21
  margin: 0;
22
22
  }
23
- .shortcut-row[data-v-8af3bafc] {
23
+ .shortcut-row[data-v-1c4cf3fa] {
24
24
  display: flex;
25
25
  align-items: center;
26
26
  justify-content: space-between;
27
27
  gap: 12px;
28
28
  padding: 5px 0;
29
29
  }
30
- .shortcut-row dt[data-v-8af3bafc] {
30
+ .shortcut-row dt[data-v-1c4cf3fa] {
31
31
  color: var(--color-ink);
32
32
  font-size: 0.82rem;
33
33
  min-width: 0;
34
34
  }
35
- .shortcut-row dd[data-v-8af3bafc] {
35
+ .shortcut-conflict[data-v-1c4cf3fa] {
36
+ display: inline-flex;
37
+ width: 14px;
38
+ height: 14px;
39
+ margin-left: 6px;
40
+ align-items: center;
41
+ justify-content: center;
42
+ border-radius: 999px;
43
+ background: var(--color-danger-soft);
44
+ color: var(--color-danger);
45
+ font-size: 0.6rem;
46
+ font-weight: 700;
47
+ vertical-align: middle;
48
+ cursor: help;
49
+ }
50
+ .shortcut-then[data-v-1c4cf3fa] {
51
+ align-self: center;
52
+ padding: 0 2px;
53
+ color: var(--color-muted);
54
+ font-size: 0.68rem;
55
+ }
56
+ .shortcut-row dd[data-v-1c4cf3fa] {
36
57
  display: flex;
37
58
  flex-shrink: 0;
38
59
  gap: 3px;
39
60
  margin: 0;
40
61
  }
41
- kbd[data-v-8af3bafc] {
62
+ kbd[data-v-1c4cf3fa] {
42
63
  display: inline-flex;
43
64
  min-width: 20px;
44
65
  align-items: center;
@@ -22,7 +22,10 @@
22
22
  }
23
23
  }
24
24
  @media (prefers-reduced-motion: reduce) {
25
- .lp-skeleton-item {
25
+ /* Repeats the descendant form: it outranks a bare class, and grouped items
26
+ kept pulsing under reduced motion. */
27
+ .lp-skeleton-item,
28
+ .lp-skeleton .lp-skeleton-item {
26
29
  animation: none;
27
30
  opacity: 0.75;
28
31
  }
@@ -11,17 +11,17 @@
11
11
  * fade before closing the gap and the whole list lurches at the end instead of
12
12
  * gliding.
13
13
  */
14
- .lp-row-enter-active[data-v-e0bb036b],
15
- .lp-row-leave-active[data-v-e0bb036b] {
14
+ .lp-row-enter-active[data-v-fff7ed10],
15
+ .lp-row-leave-active[data-v-fff7ed10] {
16
16
  transition:
17
17
  opacity var(--duration-fast) var(--ease-emphasized),
18
18
  transform var(--duration-fast) var(--ease-emphasized);
19
19
  }
20
- .lp-row-move[data-v-e0bb036b] {
20
+ .lp-row-move[data-v-fff7ed10] {
21
21
  transition: transform var(--duration-medium) var(--ease-emphasized);
22
22
  }
23
- .lp-row-enter-from[data-v-e0bb036b],
24
- .lp-row-leave-to[data-v-e0bb036b] {
23
+ .lp-row-enter-from[data-v-fff7ed10],
24
+ .lp-row-leave-to[data-v-fff7ed10] {
25
25
  opacity: 0;
26
26
  transform: translateX(-0.5rem);
27
27
  }
@@ -35,7 +35,7 @@
35
35
  * drops out of the table layout entirely. Nothing sits below this row to be
36
36
  * dragged around, so simply not animating its exit costs nothing.
37
37
  */
38
- .lp-row-empty.lp-row-leave-active[data-v-e0bb036b] {
38
+ .lp-row-empty.lp-row-leave-active[data-v-fff7ed10] {
39
39
  display: none;
40
40
  }
41
41
 
@@ -47,12 +47,52 @@
47
47
  * which is a moment slower and stays a table the whole time.
48
48
  */
49
49
 
50
+ /*
51
+ * The tick column of a hold-to-select table keeps its width and only hides its
52
+ * boxes until they mean something, which is the desktop pattern Material
53
+ * describes: a row's box shows while the row is hovered, and every box shows
54
+ * once anything is selected. An earlier version collapsed the column to nothing
55
+ * and floated the hover box over the first cell, where it sat on the text.
56
+ */
57
+ .lp-tick[data-v-fff7ed10] {
58
+ display: flex;
59
+ align-items: center;
60
+ max-width: 0;
61
+ padding-inline: 0;
62
+ overflow: hidden;
63
+ opacity: 0;
64
+ transition:
65
+ max-width var(--duration-medium) var(--ease-emphasized),
66
+ padding var(--duration-medium) var(--ease-emphasized),
67
+ opacity var(--duration-fast) ease;
68
+ }
69
+ .lp-tick-open[data-v-fff7ed10] {
70
+ max-width: 3.25rem;
71
+ padding-inline: 1rem;
72
+ opacity: 1;
73
+ }
74
+ .lp-tick-hidden[data-v-fff7ed10],
75
+ .lp-tick-cue[data-v-fff7ed10] {
76
+ opacity: 0;
77
+ }
78
+ tr:hover .lp-tick-cue[data-v-fff7ed10],
79
+ .lp-tick-cue[data-v-fff7ed10]:focus-within {
80
+ opacity: 1;
81
+ }
82
+
50
83
  /* A filter that redraws the list is information, not decoration: with motion
51
84
  turned down the rows change without animating rather than not changing. */
85
+ /* Only where there is a hover to reveal it; a finger long-presses instead. */
86
+ @media (hover: none) {
87
+ tr:hover .lp-tick-cue[data-v-fff7ed10] {
88
+ opacity: 0;
89
+ }
90
+ }
52
91
  @media (prefers-reduced-motion: reduce) {
53
- .lp-row-enter-active[data-v-e0bb036b],
54
- .lp-row-leave-active[data-v-e0bb036b],
55
- .lp-row-move[data-v-e0bb036b] {
92
+ .lp-row-enter-active[data-v-fff7ed10],
93
+ .lp-row-leave-active[data-v-fff7ed10],
94
+ .lp-row-move[data-v-fff7ed10],
95
+ .lp-tick[data-v-fff7ed10] {
56
96
  transition: none;
57
97
  }
58
98
  }
@@ -0,0 +1,124 @@
1
+ import { defineComponent, resolveComponent, openBlock, createElementBlock, Fragment, renderList, createBlock, unref, createCommentVNode, withCtx, createVNode, normalizeClass, createElementVNode, createTextVNode, toDisplayString, withModifiers } from "vue";
2
+ import { ContextMenuSeparator, ContextMenuSub, ContextMenuSubTrigger, ContextMenuPortal, ContextMenuSubContent, ContextMenuCheckboxItem, ContextMenuItem } from "reka-ui";
3
+ import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
4
+ const _hoisted_1 = { class: "flex items-center gap-2" };
5
+ const _hoisted_2 = { class: "flex items-center gap-2" };
6
+ const _hoisted_3 = {
7
+ key: 0,
8
+ class: "text-xs text-muted"
9
+ };
10
+ const _hoisted_4 = { class: "flex items-center gap-2" };
11
+ const _hoisted_5 = {
12
+ key: 0,
13
+ class: "text-xs text-muted"
14
+ };
15
+ const ITEM = "group/item flex cursor-pointer select-none items-center gap-2 rounded-md px-2.5 py-1.5 text-sm outline-none transition-[background-color,color] duration-[var(--duration-fast)] data-[disabled]:pointer-events-none data-[disabled]:opacity-45 data-[highlighted]:bg-brand-soft";
16
+ const ICON = "transition-transform duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] group-data-[highlighted]/item:translate-x-0.5";
17
+ const _sfc_main = /* @__PURE__ */ defineComponent({
18
+ ...{ name: "ContextMenuItems" },
19
+ __name: "ContextMenuItems",
20
+ props: {
21
+ items: {},
22
+ panel: {}
23
+ },
24
+ setup(__props) {
25
+ return (_ctx, _cache) => {
26
+ const _component_ContextMenuItems = resolveComponent("ContextMenuItems", true);
27
+ return openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
28
+ return openBlock(), createElementBlock(Fragment, { key: i }, [
29
+ item.separatorBefore ? (openBlock(), createBlock(unref(ContextMenuSeparator), {
30
+ key: 0,
31
+ class: "my-1 h-px bg-line"
32
+ })) : createCommentVNode("", true),
33
+ item.children?.length ? (openBlock(), createBlock(unref(ContextMenuSub), { key: 1 }, {
34
+ default: withCtx(() => [
35
+ createVNode(unref(ContextMenuSubTrigger), {
36
+ class: normalizeClass([ITEM, "justify-between text-ink data-[highlighted]:text-brand data-[state=open]:bg-brand-soft data-[state=open]:text-brand"]),
37
+ disabled: item.disabled
38
+ }, {
39
+ default: withCtx(() => [
40
+ createElementVNode("span", _hoisted_1, [
41
+ item.icon ? (openBlock(), createBlock(_sfc_main$1, {
42
+ key: 0,
43
+ name: item.icon,
44
+ size: 15,
45
+ class: normalizeClass(ICON)
46
+ }, null, 8, ["name"])) : createCommentVNode("", true),
47
+ createTextVNode(" " + toDisplayString(item.label), 1)
48
+ ]),
49
+ createVNode(_sfc_main$1, {
50
+ name: "lucide:chevron-right",
51
+ size: 14,
52
+ class: "text-muted"
53
+ })
54
+ ]),
55
+ _: 2
56
+ }, 1032, ["class", "disabled"]),
57
+ createVNode(unref(ContextMenuPortal), null, {
58
+ default: withCtx(() => [
59
+ createVNode(unref(ContextMenuSubContent), {
60
+ "collision-padding": 8,
61
+ class: normalizeClass(__props.panel),
62
+ "side-offset": 2,
63
+ "align-offset": -4
64
+ }, {
65
+ default: withCtx(() => [
66
+ createVNode(_component_ContextMenuItems, {
67
+ items: item.children,
68
+ panel: __props.panel
69
+ }, null, 8, ["items", "panel"])
70
+ ]),
71
+ _: 2
72
+ }, 1032, ["class"])
73
+ ]),
74
+ _: 2
75
+ }, 1024)
76
+ ]),
77
+ _: 2
78
+ }, 1024)) : item.checked !== void 0 ? (openBlock(), createBlock(unref(ContextMenuCheckboxItem), {
79
+ key: 2,
80
+ "model-value": item.checked,
81
+ class: normalizeClass([ITEM, "justify-between text-ink data-[highlighted]:text-brand"]),
82
+ disabled: item.disabled,
83
+ onSelect: withModifiers(($event) => item.onSelect?.(), ["prevent"])
84
+ }, {
85
+ default: withCtx(() => [
86
+ createElementVNode("span", _hoisted_2, [
87
+ createVNode(_sfc_main$1, {
88
+ name: item.checked ? "lucide:check" : "lucide:minus",
89
+ size: 15,
90
+ class: normalizeClass([ICON, item.checked ? "" : "opacity-25"])
91
+ }, null, 8, ["name", "class"]),
92
+ createTextVNode(" " + toDisplayString(item.label), 1)
93
+ ]),
94
+ item.shortcut ? (openBlock(), createElementBlock("kbd", _hoisted_3, toDisplayString(item.shortcut), 1)) : createCommentVNode("", true)
95
+ ]),
96
+ _: 2
97
+ }, 1032, ["model-value", "class", "disabled", "onSelect"])) : (openBlock(), createBlock(unref(ContextMenuItem), {
98
+ key: 3,
99
+ class: normalizeClass([ITEM, "justify-between", item.danger ? "text-danger data-[highlighted]:bg-danger-soft data-[highlighted]:text-danger" : "text-ink data-[highlighted]:text-brand"]),
100
+ disabled: item.disabled,
101
+ onSelect: ($event) => item.onSelect?.()
102
+ }, {
103
+ default: withCtx(() => [
104
+ createElementVNode("span", _hoisted_4, [
105
+ item.icon ? (openBlock(), createBlock(_sfc_main$1, {
106
+ key: 0,
107
+ name: item.icon,
108
+ size: 15,
109
+ class: normalizeClass(ICON)
110
+ }, null, 8, ["name"])) : createCommentVNode("", true),
111
+ createTextVNode(" " + toDisplayString(item.label), 1)
112
+ ]),
113
+ item.shortcut ? (openBlock(), createElementBlock("kbd", _hoisted_5, toDisplayString(item.shortcut), 1)) : createCommentVNode("", true)
114
+ ]),
115
+ _: 2
116
+ }, 1032, ["class", "disabled", "onSelect"]))
117
+ ], 64);
118
+ }), 128);
119
+ };
120
+ }
121
+ });
122
+ export {
123
+ _sfc_main as _
124
+ };