@leavepulse/ui 0.43.3 → 0.44.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 (340) hide show
  1. package/README.md +75 -7
  2. package/dist/assets/{LpCommandPalette-DH7sPcKP.css → LpCommandPalette-DCP5g2ik.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/{LpShortcutsDialog-C6YoQ8_M.css → LpShortcutsDialog-ChUyU7oV.css} +7 -7
  6. package/dist/assets/{LpSkeleton-D7xU8IPV.css → LpSkeleton-H3Z5dEIk.css} +4 -1
  7. package/dist/assets/{LpTable-BgPLJOXa.css → LpTable-DDQNdf86.css} +9 -9
  8. package/dist/chunks/ContextMenuItems-CrfeNPWT.js +123 -0
  9. package/dist/chunks/{LayoutCanvas-Dd20boUG.js → LayoutCanvas-D-jPOAvg.js} +26 -9
  10. package/dist/chunks/{LayoutNode-DGpZA9LX.js → LayoutNode-D8Xy9N-o.js} +20 -8
  11. package/dist/chunks/{LpActionBar-BlvtGB2P.js → LpActionBar-BbwCF6l5.js} +24 -10
  12. package/dist/chunks/{LpAddressInput-B-Zvxsn7.js → LpAddressInput-BrOqkZqg.js} +53 -48
  13. package/dist/chunks/{LpAlert-BAYHDSS1.js → LpAlert-DkOIjsbq.js} +15 -8
  14. package/dist/chunks/{LpAppShell-BGQVIY-3.js → LpAppShell-BUKPcHco.js} +51 -24
  15. package/dist/chunks/{LpAutocomplete-DExlIZe_.js → LpAutocomplete-DxV3Y9h4.js} +50 -23
  16. package/dist/chunks/{LpAvatar-B3-xAOH3.js → LpAvatar-ClBbEYZN.js} +17 -8
  17. package/dist/chunks/LpBreadcrumbs-B8IJgFIc.js +95 -0
  18. package/dist/chunks/{LpButton-5VXXCjwF.js → LpButton-kqJBHIIb.js} +44 -14
  19. package/dist/chunks/{LpCard-BhI1N_vL.js → LpCard-CpRByR0q.js} +1 -1
  20. package/dist/chunks/{LpCheckbox-CVccKYaH.js → LpCheckbox-DpqchzH4.js} +7 -3
  21. package/dist/chunks/{LpCodeBlock-Bo0B4TFR.js → LpCodeBlock-DeHJPq7p.js} +48 -16
  22. package/dist/chunks/{LpColorPicker-BlXea7LM.js → LpColorPicker-Bhf1qxhB.js} +32 -9
  23. package/dist/chunks/{LpConfirmDialog-Q-bxff8z.js → LpConfirmDialog-CIUOSnWo.js} +58 -16
  24. package/dist/chunks/LpConfirmHost-CDm0Wtpv.js +49 -0
  25. package/dist/chunks/LpContextMenu-DQw5dGfG.js +68 -0
  26. package/dist/chunks/LpDatePicker-Drirx1AK.js +191 -0
  27. package/dist/chunks/{LpDrawer-BZ6k3hvo.js → LpDrawer-bScx-KMO.js} +63 -26
  28. package/dist/chunks/{LpFileTree-_5vFBgaK.js → LpFileTree-CSI_5SK2.js} +23 -8
  29. package/dist/chunks/{LpFileTreeNode-BdcIYKIE.js → LpFileTreeNode-B4MiSQX2.js} +2 -2
  30. package/dist/chunks/LpFormField-CIk5qosh.js +87 -0
  31. package/dist/chunks/{LpInput-9EXWUM9B.js → LpInput-C0e8y8_d.js} +26 -11
  32. package/dist/chunks/{LpLightbox-2sYVMY-S.js → LpLightbox-Mr0W_6HK.js} +147 -60
  33. package/dist/chunks/{LpLink-DCND-zyu.js → LpLink-Krkjhe_y.js} +15 -6
  34. package/dist/chunks/{LpLogViewer-CaRy5MeS.js → LpLogViewer-YBOaFnc_.js} +68 -34
  35. package/dist/chunks/{LpMapPicker-ul4oYno6.js → LpMapPicker-NUzS9e37.js} +38 -13
  36. package/dist/chunks/{LpMediaGallery-FF-NquIo.js → LpMediaGallery-DfJmMW0I.js} +6 -3
  37. package/dist/chunks/{LpModal-Bt0pQCI_.js → LpModal-DPwGKBPv.js} +49 -26
  38. package/dist/chunks/{LpModalNav-YaifHrXC.js → LpModalNav-DPg5H9f3.js} +9 -6
  39. package/dist/chunks/{LpNotificationBell-DyGGsMAM.js → LpNotificationBell-t5yn-siX.js} +58 -24
  40. package/dist/chunks/{LpNumberField-CWuX08iX.js → LpNumberField-DWnQKktS.js} +20 -7
  41. package/dist/chunks/{LpNumberFlow-amWYaeuA.js → LpNumberFlow-z4WPZcZu.js} +22 -12
  42. package/dist/chunks/{LpOtpInput-y2v-pmiN.js → LpOtpInput-CziPF3Oq.js} +37 -8
  43. package/dist/chunks/{LpPagination-5FxjmmB5.js → LpPagination-DFngX7Xo.js} +30 -19
  44. package/dist/chunks/{LpPasswordInput--sjYCkLS.js → LpPasswordInput-CWVDuBJ5.js} +10 -7
  45. package/dist/chunks/{LpPhoneInput-BDSKVl_z.js → LpPhoneInput-CD-ZTeSd.js} +57 -33
  46. package/dist/chunks/{LpPie-D6OnzwlJ.js → LpPie-BLco31Nx.js} +78 -21
  47. package/dist/chunks/{LpPopover-8268UmlC.js → LpPopover-p_e_shN3.js} +4 -2
  48. package/dist/chunks/{LpProgress-Btq5W4Ut.js → LpProgress-CBU1iI69.js} +5 -4
  49. package/dist/chunks/{LpRadioGroup-xPIuVDO_.js → LpRadioGroup-DmEW0l78.js} +9 -2
  50. package/dist/chunks/{LpSegmented-fV0Sk92p.js → LpSegmented-Dejd7cIx.js} +7 -3
  51. package/dist/chunks/{LpSelect-ANIVtrpM.js → LpSelect-DrRD9I7L.js} +40 -18
  52. package/dist/chunks/{LpSidebar-ClBUwoEz.js → LpSidebar-BgwUNWpJ.js} +30 -22
  53. package/dist/chunks/{LpSidebarNav-llOcs_Fn.js → LpSidebarNav-Bqxz8aWT.js} +14 -9
  54. package/dist/chunks/{LpSkeleton-CTI-vBgW.js → LpSkeleton-BB6XIV-w.js} +1 -1
  55. package/dist/chunks/{LpSlider-BwNIBkAK.js → LpSlider-Cuzmrd7p.js} +7 -2
  56. package/dist/chunks/{LpSparkline-C6xQ2dwv.js → LpSparkline-CB80N8SJ.js} +11 -4
  57. package/dist/chunks/{LpStat-CQaW8R--.js → LpStat-dXtyrdX9.js} +1 -1
  58. package/dist/chunks/{LpSwitch-Blizvqyt.js → LpSwitch-B1aLKulj.js} +40 -26
  59. package/dist/chunks/{LpTableOfContents-CjvxPMpU.js → LpTableOfContents-BUcAfGPQ.js} +36 -41
  60. package/dist/chunks/{LpTabs-Cefe_lys.js → LpTabs-_qMVaZJ6.js} +19 -5
  61. package/dist/chunks/LpTextarea-yP8hGedR.js +77 -0
  62. package/dist/chunks/LpThemeProvider-Wjm7Tuit.js +35 -0
  63. package/dist/chunks/LpThemeSwitcher-CKLc10KZ.js +169 -0
  64. package/dist/chunks/{LpTilt-DuyKbpkA.js → LpTilt-B7KHX1zH.js} +2 -2
  65. package/dist/chunks/{LpTimeField-K6nAGboX.js → LpTimeField-C5HRgS5H.js} +13 -7
  66. package/dist/chunks/{LpToaster-gDB1EaU3.js → LpToaster--oT6lfhL.js} +57 -28
  67. package/dist/chunks/{LpTooltip-hCLPAqMG.js → LpTooltip-CBdzeKNf.js} +13 -6
  68. package/dist/chunks/LpTooltipProvider-CftjV7Xc.js +25 -0
  69. package/dist/chunks/{LpTopologyCanvas-Cm1L39uL.js → LpTopologyCanvas-DocsLal3.js} +6 -1
  70. package/dist/chunks/{LpUptimeBar-DvAMno0S.js → LpUptimeBar-DLtxOMRy.js} +43 -14
  71. package/dist/chunks/{LpThemeSwitcher-Cue-myST.js → useTheme-C8JHUlPM.js} +173 -215
  72. package/dist/component-names.d.ts +1 -1
  73. package/dist/components/ContextMenuItems.vue.d.ts +8 -0
  74. package/dist/components/ContextMenuItems.vue.js +4 -0
  75. package/dist/components/LayoutCanvas.vue.js +1 -1
  76. package/dist/components/LayoutNode.vue.d.ts +4 -0
  77. package/dist/components/LayoutNode.vue.js +1 -1
  78. package/dist/components/LpActionBar.vue.d.ts +3 -0
  79. package/dist/components/LpActionBar.vue.js +1 -1
  80. package/dist/components/LpAddressInput.vue.d.ts +1 -1
  81. package/dist/components/LpAddressInput.vue.js +1 -1
  82. package/dist/components/LpAlert.vue.d.ts +9 -0
  83. package/dist/components/LpAlert.vue.js +1 -1
  84. package/dist/components/LpAppShell.vue.d.ts +10 -0
  85. package/dist/components/LpAppShell.vue.js +1 -1
  86. package/dist/components/LpAutocomplete.vue.d.ts +31 -6
  87. package/dist/components/LpAutocomplete.vue.js +1 -1
  88. package/dist/components/LpAvatar.vue.d.ts +3 -3
  89. package/dist/components/LpAvatar.vue.js +1 -1
  90. package/dist/components/LpBadge.vue.d.ts +2 -2
  91. package/dist/components/LpBreadcrumbs.vue.d.ts +13 -9
  92. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  93. package/dist/components/LpButton.vue.d.ts +35 -98
  94. package/dist/components/LpButton.vue.js +1 -1
  95. package/dist/components/LpCard.vue.js +1 -1
  96. package/dist/components/LpChart.vue.d.ts +31 -2
  97. package/dist/components/LpChart.vue.js +317 -95
  98. package/dist/components/LpCheckbox.vue.js +1 -1
  99. package/dist/components/LpCodeBlock.vue.d.ts +2 -0
  100. package/dist/components/LpCodeBlock.vue.js +1 -1
  101. package/dist/components/LpColorPicker.vue.js +1 -1
  102. package/dist/components/LpCommandPalette.vue.d.ts +8 -10
  103. package/dist/components/LpCommandPalette.vue.js +88 -78
  104. package/dist/components/LpConfirmDialog.vue.d.ts +15 -3
  105. package/dist/components/LpConfirmDialog.vue.js +1 -1
  106. package/dist/components/LpConfirmHost.vue.d.ts +9 -0
  107. package/dist/components/LpConfirmHost.vue.js +4 -0
  108. package/dist/components/LpContextMenu.vue.d.ts +3 -5
  109. package/dist/components/LpContextMenu.vue.js +1 -1
  110. package/dist/components/LpDatePicker.vue.d.ts +24 -6
  111. package/dist/components/LpDatePicker.vue.js +1 -1
  112. package/dist/components/LpDrawer.vue.d.ts +10 -0
  113. package/dist/components/LpDrawer.vue.js +1 -1
  114. package/dist/components/LpDropzone.vue.js +22 -6
  115. package/dist/components/LpFileTree.vue.d.ts +11 -2
  116. package/dist/components/LpFileTree.vue.js +1 -1
  117. package/dist/components/LpFileTreeNode.vue.js +1 -1
  118. package/dist/components/LpFormField.vue.d.ts +9 -0
  119. package/dist/components/LpFormField.vue.js +1 -1
  120. package/dist/components/LpImageEditor.vue.js +92 -57
  121. package/dist/components/LpInput.vue.d.ts +3 -3
  122. package/dist/components/LpInput.vue.js +1 -1
  123. package/dist/components/LpLightbox.vue.d.ts +17 -0
  124. package/dist/components/LpLightbox.vue.js +1 -1
  125. package/dist/components/LpLink.vue.d.ts +11 -11
  126. package/dist/components/LpLink.vue.js +1 -1
  127. package/dist/components/LpLogViewer.vue.d.ts +20 -2
  128. package/dist/components/LpLogViewer.vue.js +1 -1
  129. package/dist/components/LpMapPicker.vue.d.ts +4 -4
  130. package/dist/components/LpMapPicker.vue.js +1 -1
  131. package/dist/components/LpMediaGallery.vue.js +1 -1
  132. package/dist/components/LpModal.vue.d.ts +16 -6
  133. package/dist/components/LpModal.vue.js +1 -1
  134. package/dist/components/LpModalNav.vue.d.ts +0 -1
  135. package/dist/components/LpModalNav.vue.js +1 -1
  136. package/dist/components/LpNotificationBell.vue.d.ts +11 -2
  137. package/dist/components/LpNotificationBell.vue.js +1 -1
  138. package/dist/components/LpNumberField.vue.d.ts +2 -0
  139. package/dist/components/LpNumberField.vue.js +1 -1
  140. package/dist/components/LpNumberFlow.vue.js +1 -1
  141. package/dist/components/LpOtpInput.vue.js +1 -1
  142. package/dist/components/LpPagination.vue.d.ts +2 -0
  143. package/dist/components/LpPagination.vue.js +1 -1
  144. package/dist/components/LpPasswordInput.vue.js +1 -1
  145. package/dist/components/LpPhoneInput.vue.js +1 -1
  146. package/dist/components/LpPie.vue.d.ts +21 -2
  147. package/dist/components/LpPie.vue.js +1 -1
  148. package/dist/components/LpPopover.vue.d.ts +2 -0
  149. package/dist/components/LpPopover.vue.js +1 -1
  150. package/dist/components/LpProgress.vue.js +1 -1
  151. package/dist/components/LpRadioGroup.vue.js +1 -1
  152. package/dist/components/LpSection.vue.d.ts +1 -1
  153. package/dist/components/LpSegmented.vue.d.ts +5 -0
  154. package/dist/components/LpSegmented.vue.js +1 -1
  155. package/dist/components/LpSelect.vue.d.ts +1 -0
  156. package/dist/components/LpSelect.vue.js +1 -1
  157. package/dist/components/LpShortcutsDialog.vue.d.ts +1 -1
  158. package/dist/components/LpShortcutsDialog.vue.js +11 -8
  159. package/dist/components/LpSidebar.vue.d.ts +6 -2
  160. package/dist/components/LpSidebar.vue.js +1 -1
  161. package/dist/components/LpSidebarNav.vue.js +1 -1
  162. package/dist/components/LpSkeleton.vue.js +1 -1
  163. package/dist/components/LpSlider.vue.js +1 -1
  164. package/dist/components/LpSparkline.vue.d.ts +1 -0
  165. package/dist/components/LpSparkline.vue.js +1 -1
  166. package/dist/components/LpStat.vue.js +1 -1
  167. package/dist/components/LpSwitch.vue.js +1 -1
  168. package/dist/components/LpTable.vue.d.ts +23 -1
  169. package/dist/components/LpTable.vue.js +74 -36
  170. package/dist/components/LpTableOfContents.vue.d.ts +4 -2
  171. package/dist/components/LpTableOfContents.vue.js +1 -1
  172. package/dist/components/LpTabs.vue.d.ts +2 -0
  173. package/dist/components/LpTabs.vue.js +1 -1
  174. package/dist/components/LpTextarea.vue.d.ts +19 -6
  175. package/dist/components/LpTextarea.vue.js +1 -1
  176. package/dist/components/LpThemeProvider.vue.d.ts +22 -0
  177. package/dist/components/LpThemeProvider.vue.js +4 -0
  178. package/dist/components/LpThemeSwitcher.vue.d.ts +13 -0
  179. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  180. package/dist/components/LpTilt.vue.js +1 -1
  181. package/dist/components/LpTimeField.vue.js +1 -1
  182. package/dist/components/LpToaster.vue.d.ts +6 -1
  183. package/dist/components/LpToaster.vue.js +1 -1
  184. package/dist/components/LpTooltip.vue.d.ts +1 -2
  185. package/dist/components/LpTooltip.vue.js +1 -1
  186. package/dist/components/LpTooltipProvider.vue.d.ts +22 -0
  187. package/dist/components/LpTooltipProvider.vue.js +4 -0
  188. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  189. package/dist/components/LpUptimeBar.vue.d.ts +4 -0
  190. package/dist/components/LpUptimeBar.vue.js +1 -1
  191. package/dist/components/chart.d.ts +32 -1
  192. package/dist/components/chart.js +39 -4
  193. package/dist/components/codeHighlight.d.ts +6 -0
  194. package/dist/components/codeHighlight.js +92 -20
  195. package/dist/components/color.d.ts +1 -1
  196. package/dist/components/color.js +20 -9
  197. package/dist/components/commandSearch.d.ts +0 -1
  198. package/dist/components/commandSearch.js +1 -17
  199. package/dist/components/confirm.d.ts +25 -0
  200. package/dist/components/confirm.js +26 -0
  201. package/dist/components/countries.d.ts +6 -0
  202. package/dist/components/countries.js +7 -0
  203. package/dist/components/fileTree.js +16 -7
  204. package/dist/components/imageCrop.d.ts +42 -0
  205. package/dist/components/imageCrop.js +47 -0
  206. package/dist/components/link.d.ts +12 -0
  207. package/dist/components/link.js +19 -0
  208. package/dist/components/modalDepth.d.ts +18 -2
  209. package/dist/components/modalDepth.js +17 -5
  210. package/dist/components/otp.d.ts +5 -0
  211. package/dist/components/otp.js +10 -0
  212. package/dist/components/sidebar.d.ts +7 -1
  213. package/dist/components/tableSort.d.ts +8 -0
  214. package/dist/components/tableSort.js +31 -0
  215. package/dist/composables/useField.d.ts +34 -0
  216. package/dist/composables/useField.js +45 -0
  217. package/dist/composables/useFormDraft.d.ts +10 -3
  218. package/dist/composables/useFormDraft.js +9 -14
  219. package/dist/composables/useHotkeys.d.ts +17 -1
  220. package/dist/composables/useHotkeys.js +55 -18
  221. package/dist/composables/useInputFilter.d.ts +17 -0
  222. package/dist/composables/useInputFilter.js +47 -10
  223. package/dist/composables/useLpConfig.d.ts +24 -0
  224. package/dist/composables/useLpConfig.js +44 -0
  225. package/dist/composables/useRovingFocus.js +7 -0
  226. package/dist/composables/useTilt.d.ts +2 -2
  227. package/dist/composables/useTilt.js +5 -6
  228. package/dist/composables/useToast.d.ts +20 -0
  229. package/dist/composables/useToast.js +28 -4
  230. package/dist/composables/useZoomPan.d.ts +3 -3
  231. package/dist/composables/useZoomPan.js +4 -4
  232. package/dist/index.d.ts +33 -3
  233. package/dist/index.js +185 -139
  234. package/dist/layout/tree.d.ts +2 -0
  235. package/dist/layout/tree.js +16 -1
  236. package/dist/layout/useLayout.d.ts +15 -0
  237. package/dist/layout/useLayout.js +41 -14
  238. package/dist/theme/useTheme.d.ts +32 -9
  239. package/package.json +8 -7
  240. package/src/component-names.ts +5 -7
  241. package/src/components/ContextMenuItems.vue +88 -0
  242. package/src/components/LayoutCanvas.vue +26 -6
  243. package/src/components/LayoutNode.vue +19 -2
  244. package/src/components/LpActionBar.vue +30 -7
  245. package/src/components/LpAddressInput.vue +57 -41
  246. package/src/components/LpAlert.vue +16 -3
  247. package/src/components/LpAppShell.vue +45 -12
  248. package/src/components/LpAutocomplete.vue +46 -10
  249. package/src/components/LpAvatar.vue +19 -5
  250. package/src/components/LpBreadcrumbs.vue +65 -41
  251. package/src/components/LpButton.vue +59 -13
  252. package/src/components/LpChart.vue +272 -28
  253. package/src/components/LpCheckbox.vue +7 -3
  254. package/src/components/LpCodeBlock.vue +50 -14
  255. package/src/components/LpColorPicker.vue +39 -9
  256. package/src/components/LpCommandPalette.vue +36 -25
  257. package/src/components/LpConfirmDialog.vue +68 -17
  258. package/src/components/LpConfirmHost.vue +59 -0
  259. package/src/components/LpContextMenu.vue +14 -115
  260. package/src/components/LpDatePicker.vue +99 -68
  261. package/src/components/LpDrawer.vue +56 -19
  262. package/src/components/LpDropzone.vue +21 -4
  263. package/src/components/LpFileTree.vue +33 -7
  264. package/src/components/LpFormField.vue +30 -7
  265. package/src/components/LpImageEditor.vue +96 -57
  266. package/src/components/LpInput.vue +18 -7
  267. package/src/components/LpLightbox.vue +140 -29
  268. package/src/components/LpLink.vue +24 -13
  269. package/src/components/LpLogViewer.vue +86 -17
  270. package/src/components/LpMapPicker.vue +36 -13
  271. package/src/components/LpMediaGallery.vue +8 -2
  272. package/src/components/LpModal.vue +53 -27
  273. package/src/components/LpModalNav.vue +5 -2
  274. package/src/components/LpNotificationBell.vue +63 -17
  275. package/src/components/LpNumberField.vue +21 -6
  276. package/src/components/LpNumberFlow.vue +26 -10
  277. package/src/components/LpOtpInput.vue +43 -8
  278. package/src/components/LpPagination.vue +23 -7
  279. package/src/components/LpPasswordInput.vue +4 -1
  280. package/src/components/LpPhoneInput.vue +53 -27
  281. package/src/components/LpPie.vue +94 -15
  282. package/src/components/LpPopover.vue +3 -0
  283. package/src/components/LpProgress.vue +5 -3
  284. package/src/components/LpRadioGroup.vue +9 -2
  285. package/src/components/LpSegmented.vue +12 -2
  286. package/src/components/LpSelect.vue +0 -0
  287. package/src/components/LpShortcutsDialog.vue +8 -3
  288. package/src/components/LpSidebar.vue +14 -9
  289. package/src/components/LpSidebarNav.vue +17 -5
  290. package/src/components/LpSkeleton.vue +4 -1
  291. package/src/components/LpSlider.vue +7 -1
  292. package/src/components/LpSparkline.vue +11 -3
  293. package/src/components/LpSwitch.vue +30 -7
  294. package/src/components/LpTable.vue +91 -32
  295. package/src/components/LpTableOfContents.vue +50 -32
  296. package/src/components/LpTabs.vue +23 -6
  297. package/src/components/LpTextarea.vue +44 -6
  298. package/src/components/LpThemeProvider.vue +41 -0
  299. package/src/components/LpThemeSwitcher.vue +64 -17
  300. package/src/components/LpTilt.vue +2 -2
  301. package/src/components/LpTimeField.vue +14 -3
  302. package/src/components/LpToaster.vue +66 -26
  303. package/src/components/LpTooltip.vue +22 -5
  304. package/src/components/LpTooltipProvider.vue +24 -0
  305. package/src/components/LpTopologyCanvas.vue +12 -1
  306. package/src/components/LpUptimeBar.vue +46 -8
  307. package/src/components/chart.ts +77 -5
  308. package/src/components/codeHighlight.ts +111 -15
  309. package/src/components/color.ts +30 -9
  310. package/src/components/commandSearch.ts +0 -17
  311. package/src/components/confirm.ts +58 -0
  312. package/src/components/countries.ts +12 -0
  313. package/src/components/fileTree.ts +19 -7
  314. package/src/components/imageCrop.ts +107 -0
  315. package/src/components/link.ts +34 -0
  316. package/src/components/modalDepth.ts +48 -6
  317. package/src/components/otp.ts +16 -0
  318. package/src/components/sidebar.ts +7 -1
  319. package/src/components/tableSort.ts +37 -0
  320. package/src/composables/useField.ts +79 -0
  321. package/src/composables/useFormDraft.ts +25 -20
  322. package/src/composables/useHotkeys.ts +89 -18
  323. package/src/composables/useInputFilter.ts +77 -14
  324. package/src/composables/useLpConfig.ts +87 -0
  325. package/src/composables/useRovingFocus.ts +11 -0
  326. package/src/composables/useTilt.ts +5 -6
  327. package/src/composables/useToast.ts +56 -4
  328. package/src/composables/useZoomPan.ts +6 -6
  329. package/src/index.ts +38 -3
  330. package/src/layout/tree.ts +30 -0
  331. package/src/layout/useLayout.ts +68 -18
  332. package/src/nuxt.ts +59 -17
  333. package/src/runtime/config.plugin.ts +14 -0
  334. package/src/runtime/theme.plugin.ts +42 -22
  335. package/src/theme/useTheme.ts +206 -100
  336. package/dist/chunks/LpBreadcrumbs-p4jHe_V-.js +0 -62
  337. package/dist/chunks/LpContextMenu-CwW1QXe_.js +0 -217
  338. package/dist/chunks/LpDatePicker-CwOToxGq.js +0 -164
  339. package/dist/chunks/LpFormField-CazBc2-a.js +0 -62
  340. package/dist/chunks/LpTextarea-t7F6gv8E.js +0 -47
@@ -1,7 +1,8 @@
1
1
  import { defineComponent, computed, ref, onMounted, openBlock, createBlock, withCtx, createVNode, unref, mergeProps, createCommentVNode, createTextVNode, toDisplayString } from "vue";
2
2
  import { AvatarRoot, AvatarImage, AvatarFallback } from "reka-ui";
3
3
  import { tv } from "tailwind-variants";
4
- import { _ as _sfc_main$1 } from "./LpContextMenu-CwW1QXe_.js";
4
+ import { _ as _sfc_main$1 } from "./LpContextMenu-DQw5dGfG.js";
5
+ import { useMergedAttrs } from "../composables/useMergedClass.js";
5
6
  const __default__ = { inheritAttrs: false };
6
7
  const _sfc_main = /* @__PURE__ */ defineComponent({
7
8
  ...__default__,
@@ -46,8 +47,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
46
47
  fontSize: `${Math.max(10, Math.round(props.pixelSize * 0.4))}px`
47
48
  } : void 0
48
49
  );
49
- const initials = computed(
50
- () => props.fallback ?? props.alt?.slice(0, 2).toUpperCase() ?? "?"
50
+ const initials = computed(() => {
51
+ if (props.fallback) return props.fallback;
52
+ const words = (props.alt ?? "").trim().split(/\s+/).filter(Boolean);
53
+ if (!words.length) return "?";
54
+ const first = Array.from(words[0]);
55
+ const letters = words.length > 1 ? [first[0], Array.from(words[words.length - 1])[0]] : first.slice(0, 2);
56
+ return letters.join("").toUpperCase();
57
+ });
58
+ const { class: rootClass, attrs: rest } = useMergedAttrs(
59
+ () => avatar({ size: props.pixelSize ? void 0 : props.size, shape: props.shape, ring: props.ring })
51
60
  );
52
61
  const mounted = ref(false);
53
62
  onMounted(() => {
@@ -60,9 +69,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
60
69
  }, {
61
70
  default: withCtx(() => [
62
71
  createVNode(unref(AvatarRoot), mergeProps({
63
- class: unref(avatar)({ size: __props.pixelSize ? void 0 : __props.size, shape: __props.shape, ring: __props.ring }),
72
+ class: unref(rootClass),
64
73
  style: sizeStyle.value
65
- }, _ctx.$attrs), {
74
+ }, unref(rest)), {
66
75
  default: withCtx(() => [
67
76
  __props.src && mounted.value ? (openBlock(), createBlock(unref(AvatarImage), {
68
77
  key: 0,
@@ -83,11 +92,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
83
92
  _: 1
84
93
  }, 8, ["items"])) : (openBlock(), createBlock(unref(AvatarRoot), mergeProps({
85
94
  key: 1,
86
- class: unref(avatar)({ size: __props.pixelSize ? void 0 : __props.size, shape: __props.shape, ring: __props.ring }),
95
+ class: unref(rootClass),
87
96
  style: sizeStyle.value
88
- }, _ctx.$attrs), {
97
+ }, unref(rest)), {
89
98
  default: withCtx(() => [
90
- __props.src ? (openBlock(), createBlock(unref(AvatarImage), {
99
+ __props.src && mounted.value ? (openBlock(), createBlock(unref(AvatarImage), {
91
100
  key: 0,
92
101
  src: __props.src,
93
102
  alt: __props.alt,
@@ -0,0 +1,95 @@
1
+ import { defineComponent, computed, openBlock, createElementBlock, mergeProps, unref, createElementVNode, normalizeClass, Fragment, renderList, createBlock, createCommentVNode, resolveDynamicComponent, withCtx, createTextVNode, toDisplayString } from "vue";
2
+ import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
3
+ import { useLabels, useLinkComponent } from "../composables/useLpConfig.js";
4
+ import { useMergedAttrs } from "../composables/useMergedClass.js";
5
+ import { resolveLink } from "../components/link.js";
6
+ const _hoisted_1 = ["aria-label"];
7
+ const _hoisted_2 = ["aria-current"];
8
+ const __default__ = { inheritAttrs: false };
9
+ const _sfc_main = /* @__PURE__ */ defineComponent({
10
+ ...__default__,
11
+ __name: "LpBreadcrumbs",
12
+ props: {
13
+ items: {},
14
+ as: {},
15
+ labels: {}
16
+ },
17
+ emits: ["navigate"],
18
+ setup(__props) {
19
+ const props = __props;
20
+ const text = useLabels("breadcrumbs", { nav: "Breadcrumb" }, () => props.labels);
21
+ const linkComponent = useLinkComponent();
22
+ function linkOf(item) {
23
+ if (props.as && props.as !== "a") {
24
+ if (item.to != null) return { is: props.as, props: { to: item.to } };
25
+ return item.href != null ? { is: "a", props: { href: item.href } } : null;
26
+ }
27
+ return resolveLink(props.as === "a" ? "a" : linkComponent.value, { to: item.to, href: item.href });
28
+ }
29
+ const crumbs = computed(
30
+ () => props.items.map((item, i) => ({
31
+ item,
32
+ last: i === props.items.length - 1,
33
+ link: i === props.items.length - 1 ? null : linkOf(item)
34
+ }))
35
+ );
36
+ const { class: rootClass, attrs: rest } = useMergedAttrs(
37
+ "flex items-center gap-1.5 text-sm"
38
+ );
39
+ return (_ctx, _cache) => {
40
+ return openBlock(), createElementBlock("nav", mergeProps({
41
+ "aria-label": unref(text).nav
42
+ }, unref(rest)), [
43
+ createElementVNode("ol", {
44
+ class: normalizeClass(unref(rootClass))
45
+ }, [
46
+ (openBlock(true), createElementBlock(Fragment, null, renderList(crumbs.value, ({ item, last, link }, i) => {
47
+ return openBlock(), createElementBlock("li", {
48
+ key: i,
49
+ class: "inline-flex items-center gap-1.5"
50
+ }, [
51
+ i > 0 ? (openBlock(), createBlock(_sfc_main$1, {
52
+ key: 0,
53
+ name: "lucide:chevron-right",
54
+ size: 14,
55
+ class: "text-muted",
56
+ "aria-hidden": "true"
57
+ })) : createCommentVNode("", true),
58
+ link ? (openBlock(), createBlock(resolveDynamicComponent(link.is), mergeProps({
59
+ key: 1,
60
+ ref_for: true
61
+ }, link.props, {
62
+ class: "inline-flex items-center gap-1.5 rounded-xs text-muted outline-none transition-colors duration-[var(--duration-fast)] hover:text-ink focus-visible:ring-2 focus-visible:ring-ring",
63
+ onClick: ($event) => _ctx.$emit("navigate", item, i)
64
+ }), {
65
+ default: withCtx(() => [
66
+ item.icon ? (openBlock(), createBlock(_sfc_main$1, {
67
+ key: 0,
68
+ name: item.icon,
69
+ size: 14
70
+ }, null, 8, ["name"])) : createCommentVNode("", true),
71
+ createTextVNode(" " + toDisplayString(item.label), 1)
72
+ ]),
73
+ _: 2
74
+ }, 1040, ["onClick"])) : (openBlock(), createElementBlock("span", {
75
+ key: 2,
76
+ class: normalizeClass(["inline-flex items-center gap-1.5", last ? "text-ink" : "text-muted"]),
77
+ "aria-current": last ? "page" : void 0
78
+ }, [
79
+ item.icon ? (openBlock(), createBlock(_sfc_main$1, {
80
+ key: 0,
81
+ name: item.icon,
82
+ size: 14
83
+ }, null, 8, ["name"])) : createCommentVNode("", true),
84
+ createTextVNode(" " + toDisplayString(item.label), 1)
85
+ ], 10, _hoisted_2))
86
+ ]);
87
+ }), 128))
88
+ ], 2)
89
+ ], 16, _hoisted_1);
90
+ };
91
+ }
92
+ });
93
+ export {
94
+ _sfc_main as _
95
+ };
@@ -1,6 +1,11 @@
1
- import { defineComponent, computed, openBlock, createBlock, resolveDynamicComponent, normalizeClass, withCtx, renderSlot } from "vue";
1
+ import { defineComponent, computed, openBlock, createBlock, resolveDynamicComponent, mergeProps, unref, withCtx, renderSlot } from "vue";
2
2
  import { tv } from "tailwind-variants";
3
+ import { useLinkComponent } from "../composables/useLpConfig.js";
4
+ import { useMergedAttrs } from "../composables/useMergedClass.js";
5
+ import { resolveLink } from "../components/link.js";
6
+ const __default__ = { inheritAttrs: false };
3
7
  const _sfc_main = /* @__PURE__ */ defineComponent({
8
+ ...__default__,
4
9
  __name: "LpButton",
5
10
  props: {
6
11
  variant: {},
@@ -8,7 +13,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
8
13
  block: { type: Boolean },
9
14
  square: { type: Boolean },
10
15
  glow: { type: Boolean },
11
- as: { default: "button" },
16
+ as: {},
17
+ to: {},
18
+ href: {},
12
19
  type: { default: "button" },
13
20
  disabled: { type: Boolean }
14
21
  },
@@ -26,13 +33,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
26
33
  variant: {
27
34
  solid: "bg-brand text-ink-inverse hover:bg-brand-hover",
28
35
  action: "bg-action text-ink-inverse shadow-[0_14px_28px_color-mix(in_srgb,var(--color-action)_24%,transparent)] hover:bg-action-hover",
29
- outline: "border border-line-strong text-ink hover:border-brand hover:bg-white/[0.04]",
36
+ outline: "border border-line-strong text-ink hover:border-brand hover:bg-ink/[0.04]",
30
37
  // raised surface tile with a border — a visible, neutral filled button
31
38
  soft: "border border-line bg-surface-raised/80 text-ink hover:border-line-strong hover:bg-surface-soft",
32
- ghost: "text-ink hover:bg-white/[0.06]",
33
- muted: "text-muted hover:bg-white/[0.04] hover:text-ink",
34
- // high-contrast light fill (e.g. a "download" CTA on a dark hero)
35
- light: "border border-white/20 bg-white text-ink-inverse hover:bg-white/90",
39
+ ghost: "text-ink hover:bg-ink/[0.06]",
40
+ muted: "text-muted hover:bg-ink/[0.04] hover:text-ink",
41
+ // high-contrast light fill (e.g. a "download" CTA on a dark hero). The
42
+ // text is a fixed dark tone: `ink-inverse` is light in light themes,
43
+ // which made this white on white there.
44
+ light: "border border-black/10 bg-white text-[#0b1210] hover:bg-white/90",
36
45
  danger: "bg-danger text-ink-inverse hover:bg-danger-hover"
37
46
  },
38
47
  size: {
@@ -65,14 +74,33 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
65
74
  {
66
75
  glow: true,
67
76
  variant: "light",
68
- class: "shadow-[0_8px_18px_rgba(255,255,255,0.2)] hover:shadow-[0_12px_24px_rgba(255,255,255,0.3)]"
77
+ class: "shadow-[0_8px_18px_color-mix(in_srgb,var(--color-ink)_20%,transparent)] hover:shadow-[0_12px_24px_color-mix(in_srgb,var(--color-ink)_30%,transparent)]"
69
78
  }
70
79
  ],
71
80
  defaultVariants: { variant: "solid", size: "md" }
72
81
  });
73
82
  const props = __props;
74
- const isNativeButton = computed(() => props.as === "button");
75
- const classes = computed(
83
+ const linkComponent = useLinkComponent();
84
+ const resolved = computed(() => {
85
+ if (props.as && props.as !== "a") {
86
+ const target = props.to != null ? { to: props.to } : props.href != null ? { href: props.href } : {};
87
+ return { is: props.as, props: props.as === "button" ? {} : target };
88
+ }
89
+ if (props.as === "a") return { is: "a", props: { href: props.href } };
90
+ return resolveLink(linkComponent.value, { to: props.to, href: props.href }) ?? { is: "button", props: {} };
91
+ });
92
+ const isNativeButton = computed(() => resolved.value.is === "button");
93
+ function blockDisabled(event) {
94
+ if (!props.disabled || isNativeButton.value) return;
95
+ event.preventDefault();
96
+ event.stopImmediatePropagation();
97
+ }
98
+ const linkProps = computed(() => {
99
+ if (isNativeButton.value) return {};
100
+ if (!props.disabled) return resolved.value.props;
101
+ return resolved.value.is === "a" ? {} : resolved.value.props;
102
+ });
103
+ const { class: classes, attrs: rest } = useMergedAttrs(
76
104
  () => button({
77
105
  variant: props.variant,
78
106
  size: props.size,
@@ -82,17 +110,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
82
110
  })
83
111
  );
84
112
  return (_ctx, _cache) => {
85
- return openBlock(), createBlock(resolveDynamicComponent(__props.as), {
113
+ return openBlock(), createBlock(resolveDynamicComponent(resolved.value.is), mergeProps({ ...unref(rest), ...linkProps.value }, {
86
114
  type: isNativeButton.value ? __props.type : void 0,
87
115
  disabled: isNativeButton.value ? __props.disabled : void 0,
88
116
  "aria-disabled": !isNativeButton.value && __props.disabled ? "true" : void 0,
89
- class: normalizeClass(classes.value)
90
- }, {
117
+ tabindex: !isNativeButton.value && __props.disabled ? -1 : void 0,
118
+ class: unref(classes),
119
+ onClickCapture: blockDisabled
120
+ }), {
91
121
  default: withCtx(() => [
92
122
  renderSlot(_ctx.$slots, "default")
93
123
  ]),
94
124
  _: 3
95
- }, 8, ["type", "disabled", "aria-disabled", "class"]);
125
+ }, 16, ["type", "disabled", "aria-disabled", "tabindex", "class"]);
96
126
  };
97
127
  }
98
128
  });
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, computed, openBlock, createBlock, withCtx, resolveDynamicComponent, mergeProps, unref, renderSlot } from "vue";
2
2
  import { tv } from "tailwind-variants";
3
3
  import { useMergedAttrs } from "../composables/useMergedClass.js";
4
- import { _ as _sfc_main$1 } from "./LpContextMenu-CwW1QXe_.js";
4
+ import { _ as _sfc_main$1 } from "./LpContextMenu-DQw5dGfG.js";
5
5
  const __default__ = { inheritAttrs: false };
6
6
  const _sfc_main = /* @__PURE__ */ defineComponent({
7
7
  ...__default__,
@@ -1,6 +1,7 @@
1
1
  import { defineComponent, openBlock, createElementBlock, mergeProps, unref, createVNode, withCtx, renderSlot, createTextVNode, toDisplayString } from "vue";
2
2
  import { CheckboxRoot, CheckboxIndicator } from "reka-ui";
3
3
  import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
4
+ import { useFieldControl } from "../composables/useField.js";
4
5
  import { useMergedAttrs } from "../composables/useMergedClass.js";
5
6
  const __default__ = { inheritAttrs: false };
6
7
  const _sfc_main = /* @__PURE__ */ defineComponent({
@@ -16,22 +17,25 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
16
17
  },
17
18
  emits: ["update:modelValue", "change"],
18
19
  setup(__props, { emit: __emit }) {
20
+ const props = __props;
19
21
  const emit = __emit;
20
22
  function onUpdate(v) {
21
23
  const checked = v === true;
22
24
  emit("update:modelValue", checked);
23
25
  emit("change", checked);
24
26
  }
27
+ const field = useFieldControl(() => ({ wrapped: false, id: props.id, disabled: props.disabled }));
25
28
  const { class: rootClass, attrs: rest } = useMergedAttrs(
26
29
  "group inline-flex cursor-pointer items-center gap-2 text-sm text-ink"
27
30
  );
28
31
  return (_ctx, _cache) => {
29
32
  return openBlock(), createElementBlock("label", mergeProps({ class: unref(rootClass) }, unref(rest)), [
30
33
  createVNode(unref(CheckboxRoot), {
31
- id: __props.id,
34
+ id: unref(field).id,
32
35
  name: __props.name,
33
36
  "model-value": __props.indeterminate ? "indeterminate" : __props.modelValue,
34
- disabled: __props.disabled,
37
+ disabled: unref(field).disabled,
38
+ "aria-describedby": unref(field).describedBy,
35
39
  class: "flex size-[18px] items-center justify-center rounded-[5px] border border-line-strong bg-surface-soft outline-none transition-[color,background-color,border-color,box-shadow,scale] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] not-data-[state=checked]:not-data-[state=indeterminate]:group-hover:border-brand active:scale-90 motion-reduce:active:scale-100 focus-visible:ring-2 focus-visible:ring-ring data-[state=checked]:border-transparent data-[state=checked]:bg-brand data-[state=indeterminate]:border-transparent data-[state=indeterminate]:bg-brand disabled:cursor-not-allowed disabled:opacity-55",
36
40
  "onUpdate:modelValue": onUpdate
37
41
  }, {
@@ -47,7 +51,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
47
51
  })
48
52
  ]),
49
53
  _: 1
50
- }, 8, ["id", "name", "model-value", "disabled"]),
54
+ }, 8, ["id", "name", "model-value", "disabled", "aria-describedby"]),
51
55
  renderSlot(_ctx.$slots, "default", {}, () => [
52
56
  createTextVNode(toDisplayString(__props.label), 1)
53
57
  ])
@@ -1,6 +1,7 @@
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";
3
+ import { tokenizeLines } from "../components/codeHighlight.js";
4
+ import { useLabels } from "../composables/useLpConfig.js";
4
5
  import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
5
6
  import { useMergedAttrs } from "../composables/useMergedClass.js";
6
7
  const _hoisted_1 = {
@@ -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,15 @@
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, withKeys, Fragment, renderList, renderSlot } from "vue";
2
2
  import { PopoverRoot, PopoverAnchor, PopoverTrigger, PopoverPortal, PopoverContent } from "reka-ui";
3
+ import { useFieldControl } from "../composables/useField.js";
3
4
  import { DEFAULT_SWATCHES, formatColor, opaqueCss, parseColor, rgbToHsv, isLight, clampHsv } from "../components/color.js";
4
5
  import { useClipboard } from "../composables/useClipboard.js";
5
6
  import { POPOVER_PANEL } from "../components/dropdown.js";
6
- import { _ as _sfc_main$1 } from "./LpContextMenu-CwW1QXe_.js";
7
+ import { _ as _sfc_main$1 } from "./LpContextMenu-DQw5dGfG.js";
7
8
  import { _ as _sfc_main$2 } from "./LpIcon-CCnX5_2j.js";
8
- const _hoisted_1 = ["disabled", "aria-label"];
9
+ const _hoisted_1 = ["id", "disabled", "aria-label", "aria-invalid", "aria-describedby"];
9
10
  const _hoisted_2 = { class: "min-w-0 flex-1 truncate font-mono text-xs text-muted-strong" };
10
11
  const _hoisted_3 = { class: "flex flex-col gap-3" };
11
- const _hoisted_4 = ["tabindex", "aria-label", "aria-valuetext"];
12
+ const _hoisted_4 = ["tabindex", "aria-label", "aria-valuenow", "aria-valuetext"];
12
13
  const _hoisted_5 = ["aria-label", "aria-valuenow", "tabindex"];
13
14
  const _hoisted_6 = ["aria-label", "aria-valuenow", "tabindex"];
14
15
  const _hoisted_7 = {
@@ -123,7 +124,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
123
124
  el.addEventListener("pointercancel", up);
124
125
  }
125
126
  const onFieldPointer = (e) => trackPointer(e, (x, y) => set({ s: x, v: 1 - y }));
126
- const onHuePointer = (e) => trackPointer(e, (x) => set({ h: x * 360 }));
127
+ const onHuePointer = (e) => trackPointer(e, (x) => set({ h: Math.min(x * 360, 359.9) }));
127
128
  const onAlphaPointer = (e) => trackPointer(e, (x) => set({ a: x }));
128
129
  function step(e, axis) {
129
130
  const big = e.shiftKey;
@@ -148,6 +149,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
148
149
  set({ s: hsv.value.s + dx / 100, v: hsv.value.v + dy / 100 }, true);
149
150
  }
150
151
  const typed = ref(null);
152
+ let typedChange = false;
151
153
  const inputValue = computed(() => typed.value ?? current.value);
152
154
  function onInput(e) {
153
155
  const value = e.target.value;
@@ -157,10 +159,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
157
159
  const next = rgbToHsv(rgb);
158
160
  if (next.s === 0) next.h = hsv.value.h;
159
161
  if (next.v === 0) next.s = hsv.value.s;
160
- set(props.alpha ? next : { ...next, a: 1 }, true);
162
+ set(props.alpha ? next : { ...next, a: 1 });
163
+ typedChange = true;
164
+ }
165
+ function commitTyped() {
166
+ if (!typedChange) return;
167
+ typedChange = false;
168
+ emit("change", current.value);
161
169
  }
162
170
  function onInputBlur() {
163
171
  typed.value = null;
172
+ commitTyped();
164
173
  }
165
174
  function pickSwatch(value) {
166
175
  const rgb = parseColor(value);
@@ -223,8 +232,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
223
232
  } catch {
224
233
  }
225
234
  }
235
+ let openedOn = "";
226
236
  watch(open, (isOpen, was) => {
227
- if (was && !isOpen) remember(current.value);
237
+ if (isOpen) openedOn = current.value;
238
+ else if (was && current.value !== openedOn) remember(current.value);
228
239
  });
229
240
  const swatchRows = computed(
230
241
  () => [
@@ -294,6 +305,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
294
305
  ];
295
306
  return own.length ? [...builtin, { ...own[0], separatorBefore: true }, ...own.slice(1)] : builtin;
296
307
  });
308
+ const field = useFieldControl(() => ({
309
+ wrapped: false,
310
+ invalid: props.invalid,
311
+ disabled: props.disabled
312
+ }));
297
313
  __expose({ open });
298
314
  return (_ctx, _cache) => {
299
315
  return openBlock(), createBlock(unref(PopoverRoot), {
@@ -309,11 +325,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
309
325
  default: withCtx(() => [
310
326
  createElementVNode("button", {
311
327
  type: "button",
312
- disabled: __props.disabled,
328
+ id: unref(field).id,
329
+ disabled: unref(field).disabled,
313
330
  "aria-label": __props.ariaLabel,
331
+ "aria-invalid": unref(field).invalid || void 0,
332
+ "aria-describedby": unref(field).describedBy,
314
333
  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
334
  triggerSize[__props.size],
316
- __props.invalid ? "border-danger focus-visible:ring-danger-soft" : "border-line focus-visible:border-brand"
335
+ unref(field).invalid ? "border-danger focus-visible:ring-danger-soft" : "border-line focus-visible:border-brand"
317
336
  ]])
318
337
  }, [
319
338
  createElementVNode("span", {
@@ -359,6 +378,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
359
378
  role: "slider",
360
379
  tabindex: __props.disabled ? -1 : 0,
361
380
  "aria-label": l.value.saturation,
381
+ "aria-valuemin": 0,
382
+ "aria-valuemax": 100,
383
+ "aria-valuenow": Math.round(hsv.value.s * 100),
362
384
  "aria-valuetext": fill(l.value.saturationValueText, { s: Math.round(hsv.value.s * 100), v: Math.round(hsv.value.v * 100) }),
363
385
  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
386
  style: normalizeStyle(fieldStyle.value),
@@ -427,6 +449,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
427
449
  "aria-label": l.value.value,
428
450
  class: "min-w-0 flex-1 select-text bg-transparent font-mono text-xs text-ink outline-none placeholder:text-muted",
429
451
  onInput,
452
+ onKeydown: withKeys(commitTyped, ["enter"]),
430
453
  onBlur: onInputBlur
431
454
  }, null, 40, _hoisted_8)
432
455
  ])) : createCommentVNode("", true),