@leavepulse/ui 0.43.4 → 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 (337) hide show
  1. package/README.md +75 -7
  2. package/dist/assets/{LpCommandPalette-B-0Est4Z.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 -3
  103. package/dist/components/LpCommandPalette.vue.js +86 -72
  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/confirm.d.ts +25 -0
  198. package/dist/components/confirm.js +26 -0
  199. package/dist/components/countries.d.ts +6 -0
  200. package/dist/components/countries.js +7 -0
  201. package/dist/components/fileTree.js +16 -7
  202. package/dist/components/imageCrop.d.ts +42 -0
  203. package/dist/components/imageCrop.js +47 -0
  204. package/dist/components/link.d.ts +12 -0
  205. package/dist/components/link.js +19 -0
  206. package/dist/components/modalDepth.d.ts +18 -2
  207. package/dist/components/modalDepth.js +17 -5
  208. package/dist/components/otp.d.ts +5 -0
  209. package/dist/components/otp.js +10 -0
  210. package/dist/components/sidebar.d.ts +7 -1
  211. package/dist/components/tableSort.d.ts +8 -0
  212. package/dist/components/tableSort.js +31 -0
  213. package/dist/composables/useField.d.ts +34 -0
  214. package/dist/composables/useField.js +45 -0
  215. package/dist/composables/useFormDraft.d.ts +10 -3
  216. package/dist/composables/useFormDraft.js +9 -14
  217. package/dist/composables/useHotkeys.d.ts +17 -1
  218. package/dist/composables/useHotkeys.js +55 -18
  219. package/dist/composables/useInputFilter.d.ts +17 -0
  220. package/dist/composables/useInputFilter.js +47 -10
  221. package/dist/composables/useLpConfig.d.ts +24 -0
  222. package/dist/composables/useLpConfig.js +44 -0
  223. package/dist/composables/useRovingFocus.js +7 -0
  224. package/dist/composables/useTilt.d.ts +2 -2
  225. package/dist/composables/useTilt.js +5 -6
  226. package/dist/composables/useToast.d.ts +20 -0
  227. package/dist/composables/useToast.js +28 -4
  228. package/dist/composables/useZoomPan.d.ts +3 -3
  229. package/dist/composables/useZoomPan.js +4 -4
  230. package/dist/index.d.ts +32 -2
  231. package/dist/index.js +184 -137
  232. package/dist/layout/tree.d.ts +2 -0
  233. package/dist/layout/tree.js +16 -1
  234. package/dist/layout/useLayout.d.ts +15 -0
  235. package/dist/layout/useLayout.js +41 -14
  236. package/dist/theme/useTheme.d.ts +32 -9
  237. package/package.json +8 -7
  238. package/src/component-names.ts +5 -7
  239. package/src/components/ContextMenuItems.vue +88 -0
  240. package/src/components/LayoutCanvas.vue +26 -6
  241. package/src/components/LayoutNode.vue +19 -2
  242. package/src/components/LpActionBar.vue +30 -7
  243. package/src/components/LpAddressInput.vue +57 -41
  244. package/src/components/LpAlert.vue +16 -3
  245. package/src/components/LpAppShell.vue +45 -12
  246. package/src/components/LpAutocomplete.vue +46 -10
  247. package/src/components/LpAvatar.vue +19 -5
  248. package/src/components/LpBreadcrumbs.vue +65 -41
  249. package/src/components/LpButton.vue +59 -13
  250. package/src/components/LpChart.vue +272 -28
  251. package/src/components/LpCheckbox.vue +7 -3
  252. package/src/components/LpCodeBlock.vue +50 -14
  253. package/src/components/LpColorPicker.vue +39 -9
  254. package/src/components/LpCommandPalette.vue +34 -13
  255. package/src/components/LpConfirmDialog.vue +68 -17
  256. package/src/components/LpConfirmHost.vue +59 -0
  257. package/src/components/LpContextMenu.vue +14 -115
  258. package/src/components/LpDatePicker.vue +99 -68
  259. package/src/components/LpDrawer.vue +56 -19
  260. package/src/components/LpDropzone.vue +21 -4
  261. package/src/components/LpFileTree.vue +33 -7
  262. package/src/components/LpFormField.vue +30 -7
  263. package/src/components/LpImageEditor.vue +96 -57
  264. package/src/components/LpInput.vue +18 -7
  265. package/src/components/LpLightbox.vue +140 -29
  266. package/src/components/LpLink.vue +24 -13
  267. package/src/components/LpLogViewer.vue +86 -17
  268. package/src/components/LpMapPicker.vue +36 -13
  269. package/src/components/LpMediaGallery.vue +8 -2
  270. package/src/components/LpModal.vue +53 -27
  271. package/src/components/LpModalNav.vue +5 -2
  272. package/src/components/LpNotificationBell.vue +63 -17
  273. package/src/components/LpNumberField.vue +21 -6
  274. package/src/components/LpNumberFlow.vue +26 -10
  275. package/src/components/LpOtpInput.vue +43 -8
  276. package/src/components/LpPagination.vue +23 -7
  277. package/src/components/LpPasswordInput.vue +4 -1
  278. package/src/components/LpPhoneInput.vue +53 -27
  279. package/src/components/LpPie.vue +94 -15
  280. package/src/components/LpPopover.vue +3 -0
  281. package/src/components/LpProgress.vue +5 -3
  282. package/src/components/LpRadioGroup.vue +9 -2
  283. package/src/components/LpSegmented.vue +12 -2
  284. package/src/components/LpSelect.vue +0 -0
  285. package/src/components/LpShortcutsDialog.vue +8 -3
  286. package/src/components/LpSidebar.vue +14 -9
  287. package/src/components/LpSidebarNav.vue +17 -5
  288. package/src/components/LpSkeleton.vue +4 -1
  289. package/src/components/LpSlider.vue +7 -1
  290. package/src/components/LpSparkline.vue +11 -3
  291. package/src/components/LpSwitch.vue +30 -7
  292. package/src/components/LpTable.vue +91 -32
  293. package/src/components/LpTableOfContents.vue +50 -32
  294. package/src/components/LpTabs.vue +23 -6
  295. package/src/components/LpTextarea.vue +44 -6
  296. package/src/components/LpThemeProvider.vue +41 -0
  297. package/src/components/LpThemeSwitcher.vue +64 -17
  298. package/src/components/LpTilt.vue +2 -2
  299. package/src/components/LpTimeField.vue +14 -3
  300. package/src/components/LpToaster.vue +66 -26
  301. package/src/components/LpTooltip.vue +22 -5
  302. package/src/components/LpTooltipProvider.vue +24 -0
  303. package/src/components/LpTopologyCanvas.vue +12 -1
  304. package/src/components/LpUptimeBar.vue +46 -8
  305. package/src/components/chart.ts +77 -5
  306. package/src/components/codeHighlight.ts +111 -15
  307. package/src/components/color.ts +30 -9
  308. package/src/components/confirm.ts +58 -0
  309. package/src/components/countries.ts +12 -0
  310. package/src/components/fileTree.ts +19 -7
  311. package/src/components/imageCrop.ts +107 -0
  312. package/src/components/link.ts +34 -0
  313. package/src/components/modalDepth.ts +48 -6
  314. package/src/components/otp.ts +16 -0
  315. package/src/components/sidebar.ts +7 -1
  316. package/src/components/tableSort.ts +37 -0
  317. package/src/composables/useField.ts +79 -0
  318. package/src/composables/useFormDraft.ts +25 -20
  319. package/src/composables/useHotkeys.ts +89 -18
  320. package/src/composables/useInputFilter.ts +77 -14
  321. package/src/composables/useLpConfig.ts +87 -0
  322. package/src/composables/useRovingFocus.ts +11 -0
  323. package/src/composables/useTilt.ts +5 -6
  324. package/src/composables/useToast.ts +56 -4
  325. package/src/composables/useZoomPan.ts +6 -6
  326. package/src/index.ts +37 -2
  327. package/src/layout/tree.ts +30 -0
  328. package/src/layout/useLayout.ts +68 -18
  329. package/src/nuxt.ts +59 -17
  330. package/src/runtime/config.plugin.ts +14 -0
  331. package/src/runtime/theme.plugin.ts +42 -22
  332. package/src/theme/useTheme.ts +206 -100
  333. package/dist/chunks/LpBreadcrumbs-p4jHe_V-.js +0 -62
  334. package/dist/chunks/LpContextMenu-CwW1QXe_.js +0 -217
  335. package/dist/chunks/LpDatePicker-CwOToxGq.js +0 -164
  336. package/dist/chunks/LpFormField-CazBc2-a.js +0 -62
  337. package/dist/chunks/LpTextarea-t7F6gv8E.js +0 -47
@@ -1,5 +1,7 @@
1
1
  import { defineComponent, computed, ref, openBlock, createBlock, unref, withCtx, createVNode, normalizeClass, createElementBlock, toDisplayString, withModifiers, createCommentVNode, createTextVNode, Fragment, renderList, normalizeStyle, createElementVNode } from "vue";
2
2
  import { ComboboxRoot, ComboboxAnchor, ComboboxTrigger, ComboboxPortal, ComboboxContent, ComboboxInput, ComboboxViewport, ComboboxEmpty, ComboboxItem, ComboboxItemIndicator } from "reka-ui";
3
+ import { useFieldControl } from "../composables/useField.js";
4
+ import { useLabels } from "../composables/useLpConfig.js";
3
5
  import { POPOVER_PANEL, OPTION_ITEM } from "../components/dropdown.js";
4
6
  import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
5
7
  const _hoisted_1 = {
@@ -10,16 +12,17 @@ const _hoisted_2 = {
10
12
  key: 1,
11
13
  class: "truncate text-muted"
12
14
  };
13
- const _hoisted_3 = {
15
+ const _hoisted_3 = ["aria-label"];
16
+ const _hoisted_4 = {
14
17
  key: 0,
15
18
  class: "border-b border-line p-2"
16
19
  };
17
- const _hoisted_4 = {
20
+ const _hoisted_5 = {
18
21
  key: 0,
19
22
  class: "px-3 py-4 text-center text-sm italic text-muted"
20
23
  };
21
- const _hoisted_5 = { class: "flex flex-col" };
22
- const _hoisted_6 = {
24
+ const _hoisted_6 = { class: "flex flex-col" };
25
+ const _hoisted_7 = {
23
26
  key: 0,
24
27
  class: "text-xs text-muted"
25
28
  };
@@ -35,6 +38,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
35
38
  multiple: { type: Boolean, default: false },
36
39
  clearable: { type: Boolean, default: false },
37
40
  disabled: { type: Boolean, default: false },
41
+ invalid: { type: Boolean },
38
42
  emptyText: { default: "Nothing found" },
39
43
  searchTerm: { default: void 0 },
40
44
  loading: { type: Boolean, default: false },
@@ -50,6 +54,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
50
54
  lg: "h-(--size-control-lg)"
51
55
  };
52
56
  const anchorHeight = computed(() => SIZE_HEIGHT[props.size]);
57
+ const field = useFieldControl(() => ({
58
+ wrapped: false,
59
+ invalid: props.invalid,
60
+ disabled: props.disabled
61
+ }));
62
+ const labels = useLabels("select", { clear: "Clear", selected: "{count} selected" });
53
63
  const emit = __emit;
54
64
  const serverSide = computed(() => props.searchTerm !== void 0);
55
65
  const localQuery = ref("");
@@ -93,7 +103,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
93
103
  if (arr.length === 0) return "";
94
104
  if (arr.length === 1)
95
105
  return props.options.find((o) => o.value === arr[0])?.label ?? String(arr[0]);
96
- return `${arr.length} selected`;
106
+ return labels.value.selected.replace("{count}", String(arr.length));
97
107
  }
98
108
  return props.options.find((o) => o.value === v)?.label ?? "";
99
109
  });
@@ -112,7 +122,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
112
122
  return openBlock(), createBlock(unref(ComboboxRoot), {
113
123
  "model-value": comboModel.value,
114
124
  multiple: __props.multiple,
115
- disabled: __props.disabled,
125
+ disabled: unref(field).disabled,
116
126
  "ignore-filter": true,
117
127
  "reset-search-term-on-select": false,
118
128
  "reset-search-term-on-blur": false,
@@ -124,30 +134,42 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
124
134
  createVNode(unref(ComboboxAnchor), {
125
135
  class: normalizeClass([
126
136
  anchorHeight.value,
127
- "group flex w-full items-center gap-2 rounded-control border border-line bg-surface-soft px-3 text-sm text-ink transition-colors duration-[var(--duration-fast)] focus-within:border-brand focus-within:ring-2 focus-within:ring-ring data-[disabled]:cursor-not-allowed data-[disabled]:opacity-55"
137
+ "group flex w-full items-center gap-2 rounded-control border bg-surface-soft px-3 text-sm text-ink transition-colors duration-[var(--duration-fast)] focus-within:ring-2 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-55",
138
+ unref(field).invalid ? "border-danger focus-within:border-danger focus-within:ring-danger-soft" : "border-line focus-within:border-brand focus-within:ring-ring"
128
139
  ])
129
140
  }, {
130
141
  default: withCtx(() => [
131
- createVNode(unref(ComboboxTrigger), { class: "flex min-w-0 flex-1 items-center gap-2 outline-none" }, {
142
+ createVNode(unref(ComboboxTrigger), {
143
+ id: unref(field).id,
144
+ "aria-invalid": unref(field).invalid || void 0,
145
+ "aria-describedby": unref(field).describedBy,
146
+ class: "flex min-w-0 flex-1 items-center gap-2 outline-none"
147
+ }, {
132
148
  default: withCtx(() => [
133
149
  displayLabel.value ? (openBlock(), createElementBlock("span", _hoisted_1, toDisplayString(displayLabel.value), 1)) : (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(__props.placeholder), 1))
134
150
  ]),
135
151
  _: 1
136
- }),
152
+ }, 8, ["id", "aria-invalid", "aria-describedby"]),
137
153
  __props.clearable && hasValue.value ? (openBlock(), createElementBlock("button", {
138
154
  key: 0,
139
155
  type: "button",
140
156
  class: "group flex shrink-0 items-center text-muted outline-none transition-colors duration-[var(--duration-fast)] hover:text-ink",
141
- "aria-label": "Clear",
142
- onPointerdown: withModifiers(clear, ["prevent"])
157
+ "aria-label": unref(labels).clear,
158
+ onPointerdown: _cache[0] || (_cache[0] = withModifiers(() => {
159
+ }, ["prevent"])),
160
+ onClick: clear
143
161
  }, [
144
162
  createVNode(_sfc_main$1, {
145
163
  name: "lucide:x",
146
164
  size: 16,
147
165
  class: "transition-transform duration-200 ease-[var(--ease-emphasized)] group-hover:rotate-90 group-active:scale-90 motion-reduce:group-hover:rotate-0"
148
166
  })
149
- ], 32)) : createCommentVNode("", true),
150
- createVNode(unref(ComboboxTrigger), { class: "group/trig flex shrink-0 items-center text-muted transition-[rotate,color] duration-200 ease-[var(--ease-emphasized)] group-hover:text-ink data-[state=open]:rotate-180" }, {
167
+ ], 40, _hoisted_3)) : createCommentVNode("", true),
168
+ createVNode(unref(ComboboxTrigger), {
169
+ tabindex: "-1",
170
+ "aria-hidden": "true",
171
+ class: "group/trig flex shrink-0 items-center text-muted transition-[rotate,color] duration-200 ease-[var(--ease-emphasized)] group-hover:text-ink data-[state=open]:rotate-180"
172
+ }, {
151
173
  default: withCtx(() => [
152
174
  createVNode(_sfc_main$1, {
153
175
  name: "lucide:chevron-down",
@@ -168,17 +190,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
168
190
  class: normalizeClass([unref(POPOVER_PANEL), "z-(--z-popover) max-h-72 w-(--reka-combobox-trigger-width) overflow-hidden"])
169
191
  }, {
170
192
  default: withCtx(() => [
171
- __props.searchable || serverSide.value ? (openBlock(), createElementBlock("div", _hoisted_3, [
193
+ __props.searchable || serverSide.value ? (openBlock(), createElementBlock("div", _hoisted_4, [
172
194
  createVNode(unref(ComboboxInput), {
173
195
  modelValue: query.value,
174
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => query.value = $event),
196
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => query.value = $event),
175
197
  placeholder: __props.searchPlaceholder,
176
198
  class: "h-(--size-control-sm) w-full rounded-md border border-line bg-surface-soft px-2.5 text-sm text-ink outline-none placeholder:text-muted focus:border-brand"
177
199
  }, null, 8, ["modelValue", "placeholder"])
178
200
  ])) : createCommentVNode("", true),
179
201
  createVNode(unref(ComboboxViewport), { class: "max-h-56 overflow-y-auto p-1" }, {
180
202
  default: withCtx(() => [
181
- __props.loading ? (openBlock(), createElementBlock("div", _hoisted_4, toDisplayString(__props.loadingText), 1)) : (openBlock(), createBlock(unref(ComboboxEmpty), {
203
+ __props.loading ? (openBlock(), createElementBlock("div", _hoisted_5, toDisplayString(__props.loadingText), 1)) : (openBlock(), createBlock(unref(ComboboxEmpty), {
182
204
  key: 1,
183
205
  class: "px-3 py-4 text-center text-sm italic text-muted"
184
206
  }, {
@@ -195,9 +217,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
195
217
  class: normalizeClass([unref(OPTION_ITEM), "justify-between"])
196
218
  }, {
197
219
  default: withCtx(() => [
198
- createElementVNode("span", _hoisted_5, [
220
+ createElementVNode("span", _hoisted_6, [
199
221
  createElementVNode("span", null, toDisplayString(opt.label), 1),
200
- opt.description ? (openBlock(), createElementBlock("span", _hoisted_6, toDisplayString(opt.description), 1)) : createCommentVNode("", true)
222
+ opt.description ? (openBlock(), createElementBlock("span", _hoisted_7, toDisplayString(opt.description), 1)) : createCommentVNode("", true)
201
223
  ]),
202
224
  createVNode(unref(ComboboxItemIndicator), { class: "flex shrink-0 items-center text-brand" }, {
203
225
  default: withCtx(() => [
@@ -1,21 +1,23 @@
1
- import { defineComponent, computed, ref, useId, openBlock, createElementBlock, Fragment, createElementVNode, mergeProps, normalizeClass, renderSlot, createCommentVNode, createBlock, createVNode, createSlots, withCtx, normalizeProps, guardReactiveProps } from "vue";
2
- import { _ as _sfc_main$3 } from "./LpDrawer-BZ6k3hvo.js";
3
- import { _ as _sfc_main$1 } from "./LpInput-9EXWUM9B.js";
4
- import { _ as _sfc_main$2 } from "./LpSidebarNav-llOcs_Fn.js";
5
- const _hoisted_1 = {
1
+ import { defineComponent, computed, ref, useId, openBlock, createElementBlock, Fragment, createElementVNode, mergeProps, unref, normalizeClass, renderSlot, createCommentVNode, createBlock, createVNode, createSlots, withCtx, normalizeProps, guardReactiveProps } from "vue";
2
+ import { useLabels } from "../composables/useLpConfig.js";
3
+ import { _ as _sfc_main$3 } from "./LpDrawer-bScx-KMO.js";
4
+ import { _ as _sfc_main$1 } from "./LpInput-C0e8y8_d.js";
5
+ import { _ as _sfc_main$2 } from "./LpSidebarNav-Bqxz8aWT.js";
6
+ const _hoisted_1 = ["aria-label"];
7
+ const _hoisted_2 = {
6
8
  key: 2,
7
9
  class: "mt-2 flex shrink-0 flex-col gap-2"
8
10
  };
9
- const _hoisted_2 = {
11
+ const _hoisted_3 = {
10
12
  key: 3,
11
13
  class: "mt-2 shrink-0 border-t border-line pt-3"
12
14
  };
13
- const _hoisted_3 = { class: "flex h-full flex-col gap-1" };
14
- const _hoisted_4 = {
15
+ const _hoisted_4 = ["aria-label"];
16
+ const _hoisted_5 = {
15
17
  key: 2,
16
18
  class: "mt-2 flex shrink-0 flex-col gap-2"
17
19
  };
18
- const _hoisted_5 = {
20
+ const _hoisted_6 = {
19
21
  key: 3,
20
22
  class: "mt-2 shrink-0 border-t border-line pt-3"
21
23
  };
@@ -28,7 +30,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
28
30
  sections: {},
29
31
  isActive: {},
30
32
  searchable: { type: Boolean },
31
- searchPlaceholder: { default: "Search" },
33
+ searchPlaceholder: {},
34
+ labels: {},
32
35
  search: {},
33
36
  loading: { type: Boolean },
34
37
  skeletonRows: { default: 6 },
@@ -47,6 +50,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
47
50
  setup(__props, { emit: __emit }) {
48
51
  const props = __props;
49
52
  const emit = __emit;
53
+ const text = useLabels("sidebar", { nav: "Sidebar", search: "Search" }, () => props.labels);
54
+ const placeholder = computed(() => props.searchPlaceholder ?? text.value.search);
50
55
  const allGroups = computed(
51
56
  () => props.sections ?? (props.items ? [{ items: props.items }] : [])
52
57
  );
@@ -125,7 +130,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
125
130
  createElementVNode("nav", mergeProps({
126
131
  class: ["h-full flex-col gap-1 p-3", [railClass.value, chromeClass.value, __props.width ? "" : "w-60"]],
127
132
  style: __props.width ? { width: __props.width } : void 0,
128
- "aria-label": "Sidebar"
133
+ "aria-label": unref(text).nav
129
134
  }, _ctx.$attrs), [
130
135
  _ctx.$slots.header ? (openBlock(), createElementBlock("div", {
131
136
  key: 0,
@@ -143,8 +148,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
143
148
  size: "sm",
144
149
  icon: "lucide:search",
145
150
  class: "mb-2 shrink-0",
146
- placeholder: __props.searchPlaceholder,
147
- "aria-label": __props.searchPlaceholder
151
+ placeholder: placeholder.value,
152
+ "aria-label": placeholder.value
148
153
  }, null, 8, ["modelValue", "placeholder", "aria-label"])) : createCommentVNode("", true),
149
154
  createVNode(_sfc_main$2, {
150
155
  groups: groups.value,
@@ -165,13 +170,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
165
170
  key: "0"
166
171
  } : void 0
167
172
  ]), 1032, ["groups", "loading", "skeleton-rows", "skeleton-header", "collapsed-keys"]),
168
- _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_1, [
173
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_2, [
169
174
  renderSlot(_ctx.$slots, "actions")
170
175
  ])) : createCommentVNode("", true),
171
- _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_2, [
176
+ _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_3, [
172
177
  renderSlot(_ctx.$slots, "footer")
173
178
  ])) : createCommentVNode("", true)
174
- ], 16),
179
+ ], 16, _hoisted_1),
175
180
  __props.responsive ? (openBlock(), createBlock(_sfc_main$3, {
176
181
  key: 0,
177
182
  open: __props.open,
@@ -182,7 +187,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
182
187
  "onUpdate:open": _cache[2] || (_cache[2] = (v) => emit("update:open", v))
183
188
  }, {
184
189
  default: withCtx(() => [
185
- createElementVNode("div", _hoisted_3, [
190
+ createElementVNode("nav", {
191
+ class: "flex h-full flex-col gap-1",
192
+ "aria-label": unref(text).nav
193
+ }, [
186
194
  _ctx.$slots.header ? (openBlock(), createElementBlock("div", {
187
195
  key: 0,
188
196
  class: normalizeClass(["shrink-0", __props.divider ? "mb-3 border-b border-line pb-3" : "mb-2"])
@@ -196,8 +204,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
196
204
  size: "sm",
197
205
  icon: "lucide:search",
198
206
  class: "mb-2 shrink-0",
199
- placeholder: __props.searchPlaceholder,
200
- "aria-label": __props.searchPlaceholder
207
+ placeholder: placeholder.value,
208
+ "aria-label": placeholder.value
201
209
  }, null, 8, ["modelValue", "placeholder", "aria-label"])) : createCommentVNode("", true),
202
210
  createVNode(_sfc_main$2, {
203
211
  groups: groups.value,
@@ -218,13 +226,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
218
226
  key: "0"
219
227
  } : void 0
220
228
  ]), 1032, ["groups", "loading", "skeleton-rows", "skeleton-header", "collapsed-keys"]),
221
- _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_4, [
229
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_5, [
222
230
  renderSlot(_ctx.$slots, "actions")
223
231
  ])) : createCommentVNode("", true),
224
- _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_5, [
232
+ _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_6, [
225
233
  renderSlot(_ctx.$slots, "footer")
226
234
  ])) : createCommentVNode("", true)
227
- ])
235
+ ], 8, _hoisted_4)
228
236
  ]),
229
237
  _: 3
230
238
  }, 8, ["open", "edge-open", "edge-breakpoint"])) : createCommentVNode("", true)
@@ -3,9 +3,11 @@ import { Motion } from "motion-v";
3
3
  import { CollapsibleRoot, CollapsibleTrigger, CollapsibleContent } from "reka-ui";
4
4
  import { usePillTransition } from "../composables/usePillTransition.js";
5
5
  import { _ as _sfc_main$3 } from "./LpBadge-Fe0D1bYx.js";
6
- import { _ as _sfc_main$4 } from "./LpContextMenu-CwW1QXe_.js";
6
+ import { _ as _sfc_main$4 } from "./LpContextMenu-DQw5dGfG.js";
7
7
  import { _ as _sfc_main$2 } from "./LpIcon-CCnX5_2j.js";
8
8
  import { _ as _sfc_main$1 } from "./LpScrollArea-D8xyKXcF.js";
9
+ import { resolveLink } from "../components/link.js";
10
+ import { useLinkComponent } from "../composables/useLpConfig.js";
9
11
  import { useMergedAttrs } from "../composables/useMergedClass.js";
10
12
  const _hoisted_1 = {
11
13
  key: 0,
@@ -50,6 +52,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
50
52
  return !foldedKeys.value.has(sectionKey(section));
51
53
  }
52
54
  const pillTransition = usePillTransition();
55
+ const linkComponent = useLinkComponent();
56
+ function rowOf(item) {
57
+ const link = item.disabled ? null : resolveLink(linkComponent.value, { to: item.to, href: item.href });
58
+ if (link) return link;
59
+ return { is: "button", props: { type: "button", disabled: item.disabled || void 0 } };
60
+ }
53
61
  const { class: rootClass, attrs: rest } = useMergedAttrs(
54
62
  "flex min-h-0 flex-1 flex-col gap-4"
55
63
  );
@@ -91,7 +99,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
91
99
  default: withCtx(() => [
92
100
  section.title && section.collapsible ? (openBlock(), createBlock(unref(CollapsibleTrigger), {
93
101
  key: 0,
94
- class: "group/section mt-2 flex cursor-pointer items-center gap-2 rounded-control px-2 py-1 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted outline-none transition-colors duration-[var(--duration-fast)] hover:bg-white/[0.04] hover:text-ink focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring"
102
+ class: "group/section mt-2 flex cursor-pointer items-center gap-2 rounded-control px-2 py-1 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted outline-none transition-colors duration-[var(--duration-fast)] hover:bg-ink/[0.04] hover:text-ink focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring"
95
103
  }, {
96
104
  default: withCtx(() => [
97
105
  section.icon ? (openBlock(), createBlock(_sfc_main$2, {
@@ -127,15 +135,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
127
135
  items: item.menu ?? []
128
136
  }, {
129
137
  default: withCtx(() => [
130
- (openBlock(), createBlock(resolveDynamicComponent(item.href && !item.disabled ? "a" : "button"), {
131
- href: item.href && !item.disabled ? item.href : void 0,
132
- type: item.href ? void 0 : "button",
133
- disabled: item.href ? void 0 : item.disabled,
138
+ (openBlock(), createBlock(resolveDynamicComponent(rowOf(item).is), mergeProps({ ref_for: true }, rowOf(item).props, {
134
139
  "aria-current": __props.itemActive(item) ? "page" : void 0,
135
140
  "aria-disabled": item.disabled || void 0,
136
- class: normalizeClass(["group/item relative flex items-center gap-3 rounded-control px-3 py-2 text-sm font-medium outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring", item.disabled ? "cursor-not-allowed text-muted/50" : __props.itemActive(item) ? "text-ink" : "text-muted hover:text-ink"]),
141
+ class: ["group/item relative flex items-center gap-3 rounded-control px-3 py-2 text-sm font-medium outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring", item.disabled ? "cursor-not-allowed text-muted/50" : __props.itemActive(item) ? "text-ink" : "text-muted hover:text-ink"],
137
142
  onClick: ($event) => emit("activate", item)
138
- }, {
143
+ }), {
139
144
  default: withCtx(() => [
140
145
  __props.itemActive(item) ? (openBlock(), createBlock(unref(Motion), {
141
146
  key: 0,
@@ -167,7 +172,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
167
172
  ])
168
173
  ]),
169
174
  _: 2
170
- }, 1032, ["href", "type", "disabled", "aria-current", "aria-disabled", "class", "onClick"]))
175
+ }, 1040, ["aria-current", "aria-disabled", "class", "onClick"]))
171
176
  ]),
172
177
  _: 2
173
178
  }, 1032, ["items"]);
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, useSlots, computed, openBlock, createElementBlock, normalizeClass, renderSlot } from "vue";
2
- import '../assets/LpSkeleton-D7xU8IPV.css';const _sfc_main = /* @__PURE__ */ defineComponent({
2
+ import '../assets/LpSkeleton-H3Z5dEIk.css';const _sfc_main = /* @__PURE__ */ defineComponent({
3
3
  __name: "LpSkeleton",
4
4
  props: {
5
5
  rounded: {}
@@ -1,5 +1,6 @@
1
1
  import { defineComponent, openBlock, createBlock, unref, mergeProps, withCtx, createVNode } from "vue";
2
2
  import { SliderRoot, SliderTrack, SliderRange, SliderThumb } from "reka-ui";
3
+ import { useFieldControl } from "../composables/useField.js";
3
4
  import { useMergedAttrs } from "../composables/useMergedClass.js";
4
5
  const __default__ = { inheritAttrs: false };
5
6
  const _sfc_main = /* @__PURE__ */ defineComponent({
@@ -23,6 +24,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
23
24
  function onCommit(v) {
24
25
  if (v && v.length) emit("change", v[0]);
25
26
  }
27
+ const field = useFieldControl(() => ({ wrapped: false, disabled: props.disabled }));
26
28
  const { class: rootClass, attrs: rest } = useMergedAttrs(
27
29
  "relative flex h-5 w-full touch-none select-none items-center data-[disabled]:opacity-55"
28
30
  );
@@ -32,7 +34,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
32
34
  min: __props.min,
33
35
  max: __props.max,
34
36
  step: __props.step,
35
- disabled: __props.disabled,
37
+ disabled: unref(field).disabled,
36
38
  class: unref(rootClass)
37
39
  }, unref(rest), {
38
40
  "onUpdate:modelValue": onUpdate,
@@ -46,9 +48,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
46
48
  _: 1
47
49
  }),
48
50
  createVNode(unref(SliderThumb), {
51
+ id: unref(field).id,
49
52
  "aria-label": __props.ariaLabel,
53
+ "aria-labelledby": __props.ariaLabel ? void 0 : unref(field).labelId,
54
+ "aria-describedby": unref(field).describedBy,
50
55
  class: "block size-4 rounded-pill border-2 border-brand bg-surface shadow outline-none transition-transform duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] hover:scale-110 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring motion-reduce:hover:scale-100 motion-reduce:active:scale-100"
51
- }, null, 8, ["aria-label"])
56
+ }, null, 8, ["id", "aria-label", "aria-labelledby", "aria-describedby"])
52
57
  ]),
53
58
  _: 1
54
59
  }, 16, ["model-value", "min", "max", "step", "disabled", "class"]);
@@ -1,5 +1,6 @@
1
1
  import { defineComponent, computed, openBlock, createElementBlock, createElementVNode, createCommentVNode, normalizeStyle, normalizeClass } from "vue";
2
2
  import { useReveal } from "../composables/useReveal.js";
3
+ import { useLabels } from "../composables/useLpConfig.js";
3
4
  import { normalise, extent, linePath, areaPath } from "../components/chart.js";
4
5
  import '../assets/LpSparkline-0mKTq7pb.css';const _hoisted_1 = ["width", "height", "viewBox", "aria-label"];
5
6
  const _hoisted_2 = { key: 0 };
@@ -25,7 +26,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
25
26
  max: {},
26
27
  ariaLabel: {},
27
28
  animate: { type: Boolean, default: true },
28
- duration: { default: 900 }
29
+ duration: { default: 900 },
30
+ labels: {}
29
31
  },
30
32
  setup(__props) {
31
33
  const props = __props;
@@ -78,14 +80,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
78
80
  return null;
79
81
  });
80
82
  const hasData = computed(() => series.value[0].values.some((v) => v != null));
83
+ const text = useLabels(
84
+ "sparkline",
85
+ { empty: "No data", up: "trending up", down: "trending down", flat: "flat", latest: "latest" },
86
+ () => props.labels
87
+ );
81
88
  const label = computed(() => {
82
89
  if (props.ariaLabel) return props.ariaLabel;
83
90
  const values = series.value[0].values.filter((v) => v != null);
84
- if (!values.length) return "No data";
91
+ if (!values.length) return text.value.empty;
85
92
  const first = values[0];
86
93
  const last = values[values.length - 1];
87
- const dir = last > first ? "trending up" : last < first ? "trending down" : "flat";
88
- return `${dir}, latest ${last}`;
94
+ const dir = last > first ? text.value.up : last < first ? text.value.down : text.value.flat;
95
+ return `${dir}, ${text.value.latest} ${last}`;
89
96
  });
90
97
  const pathLength = computed(() => {
91
98
  const n = Math.max(1, props.data.length - 1);
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, openBlock, createElementBlock, mergeProps, unref, createElementVNode, createCommentVNode, createBlock, toDisplayString, Fragment, createTextVNode, normalizeClass, createVNode, renderSlot } from "vue";
2
2
  import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
3
- import { _ as _sfc_main$2 } from "./LpNumberFlow-amWYaeuA.js";
3
+ import { _ as _sfc_main$2 } from "./LpNumberFlow-z4WPZcZu.js";
4
4
  import { useMergedAttrs } from "../composables/useMergedClass.js";
5
5
  const _hoisted_1 = { class: "flex items-center gap-2" };
6
6
  const _hoisted_2 = {
@@ -1,22 +1,15 @@
1
- import { defineComponent, useSlots, computed, openBlock, createElementBlock, mergeProps, unref, renderSlot, createTextVNode, toDisplayString, createCommentVNode, createVNode, normalizeClass, withCtx, createBlock } from "vue";
1
+ import { defineComponent, useSlots, computed, useId, openBlock, createElementBlock, normalizeClass, unref, renderSlot, createTextVNode, toDisplayString, createCommentVNode, createVNode, mergeProps, withCtx, createBlock } from "vue";
2
2
  import { SwitchRoot, SwitchThumb } from "reka-ui";
3
+ import { useFieldControl } from "../composables/useField.js";
3
4
  import { useMergedAttrs } from "../composables/useMergedClass.js";
4
5
  const _hoisted_1 = {
5
6
  key: 0,
6
7
  class: "flex min-w-0 flex-col"
7
8
  };
8
9
  const _hoisted_2 = {
9
- key: 0,
10
- class: "text-xs text-muted"
11
- };
12
- const _hoisted_3 = {
13
10
  key: 1,
14
11
  class: "flex min-w-0 flex-col"
15
12
  };
16
- const _hoisted_4 = {
17
- key: 0,
18
- class: "text-xs text-muted"
19
- };
20
13
  const __default__ = { inheritAttrs: false };
21
14
  const _sfc_main = /* @__PURE__ */ defineComponent({
22
15
  ...__default__,
@@ -40,52 +33,73 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
40
33
  if (!labelled.value) return TRACK;
41
34
  return props.labelPosition === "start" ? "flex w-full cursor-pointer items-center justify-between gap-3 text-sm text-ink" : "inline-flex cursor-pointer items-center gap-2 text-sm text-ink";
42
35
  });
36
+ const field = useFieldControl(() => ({
37
+ wrapped: false,
38
+ id: typeof rest.value.id === "string" ? rest.value.id : void 0,
39
+ disabled: props.disabled
40
+ }));
41
+ const descriptionId = `${useId()}-description`;
42
+ const describedBy = computed(
43
+ () => [props.description && labelled.value ? descriptionId : "", field.value.describedBy ?? ""].filter(Boolean).join(" ") || void 0
44
+ );
43
45
  function onUpdate(value) {
44
46
  emit("update:modelValue", value);
45
47
  }
46
48
  return (_ctx, _cache) => {
47
- return labelled.value ? (openBlock(), createElementBlock("label", mergeProps({
49
+ return labelled.value ? (openBlock(), createElementBlock("label", {
48
50
  key: 0,
49
- class: [unref(rootClass), __props.disabled && "cursor-not-allowed"]
50
- }, unref(rest)), [
51
+ class: normalizeClass([unref(rootClass), unref(field).disabled && "cursor-not-allowed"])
52
+ }, [
51
53
  __props.labelPosition === "start" ? (openBlock(), createElementBlock("span", _hoisted_1, [
52
54
  renderSlot(_ctx.$slots, "default", {}, () => [
53
55
  createTextVNode(toDisplayString(__props.label), 1)
54
56
  ]),
55
- __props.description ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(__props.description), 1)) : createCommentVNode("", true)
57
+ __props.description ? (openBlock(), createElementBlock("span", {
58
+ key: 0,
59
+ id: descriptionId,
60
+ class: "text-xs text-muted"
61
+ }, toDisplayString(__props.description), 1)) : createCommentVNode("", true)
56
62
  ])) : createCommentVNode("", true),
57
- createVNode(unref(SwitchRoot), {
63
+ createVNode(unref(SwitchRoot), mergeProps(unref(rest), {
64
+ id: unref(field).id,
58
65
  "model-value": __props.modelValue,
59
- disabled: __props.disabled,
60
- class: normalizeClass(TRACK),
66
+ disabled: unref(field).disabled,
67
+ "aria-describedby": describedBy.value,
68
+ class: TRACK,
61
69
  "onUpdate:modelValue": onUpdate
62
- }, {
70
+ }), {
63
71
  default: withCtx(() => [
64
72
  createVNode(unref(SwitchThumb), {
65
73
  class: normalizeClass(THUMB)
66
74
  })
67
75
  ]),
68
76
  _: 1
69
- }, 8, ["model-value", "disabled"]),
70
- __props.labelPosition === "end" ? (openBlock(), createElementBlock("span", _hoisted_3, [
77
+ }, 16, ["id", "model-value", "disabled", "aria-describedby"]),
78
+ __props.labelPosition === "end" ? (openBlock(), createElementBlock("span", _hoisted_2, [
71
79
  renderSlot(_ctx.$slots, "default", {}, () => [
72
80
  createTextVNode(toDisplayString(__props.label), 1)
73
81
  ]),
74
- __props.description ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(__props.description), 1)) : createCommentVNode("", true)
82
+ __props.description ? (openBlock(), createElementBlock("span", {
83
+ key: 0,
84
+ id: descriptionId,
85
+ class: "text-xs text-muted"
86
+ }, toDisplayString(__props.description), 1)) : createCommentVNode("", true)
75
87
  ])) : createCommentVNode("", true)
76
- ], 16)) : (openBlock(), createBlock(unref(SwitchRoot), mergeProps({
77
- key: 1,
88
+ ], 2)) : (openBlock(), createBlock(unref(SwitchRoot), mergeProps({ key: 1 }, unref(rest), {
89
+ id: unref(field).id,
78
90
  "model-value": __props.modelValue,
79
- disabled: __props.disabled,
80
- class: unref(rootClass)
81
- }, unref(rest), { "onUpdate:modelValue": onUpdate }), {
91
+ disabled: unref(field).disabled,
92
+ "aria-describedby": describedBy.value,
93
+ class: unref(rootClass),
94
+ "onUpdate:modelValue": onUpdate
95
+ }), {
82
96
  default: withCtx(() => [
83
97
  createVNode(unref(SwitchThumb), {
84
98
  class: normalizeClass(THUMB)
85
99
  })
86
100
  ]),
87
101
  _: 1
88
- }, 16, ["model-value", "disabled", "class"]));
102
+ }, 16, ["id", "model-value", "disabled", "aria-describedby", "class"]));
89
103
  };
90
104
  }
91
105
  });