@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,7 +1,9 @@
1
- import { defineComponent, ref, computed, onMounted, openBlock, createElementBlock, mergeProps, unref, createVNode, withCtx, createElementVNode, toDisplayString, normalizeClass, createTextVNode, Fragment, renderList, createBlock, withModifiers, normalizeStyle } from "vue";
1
+ import { defineComponent, ref, computed, onMounted, useAttrs, openBlock, createElementBlock, normalizeStyle, unref, normalizeClass, createVNode, withCtx, createElementVNode, toDisplayString, createTextVNode, Fragment, renderList, createBlock, withModifiers, mergeProps } from "vue";
2
2
  import { ComboboxRoot, ComboboxAnchor, ComboboxTrigger, ComboboxPortal, ComboboxContent, ComboboxInput, ComboboxViewport, ComboboxEmpty, ComboboxItem } from "reka-ui";
3
+ import { useFieldControl } from "../composables/useField.js";
3
4
  import { useInputFilter } from "../composables/useInputFilter.js";
4
- import { matchCountryByValue, loadCountries, flagEmoji } from "../components/countries.js";
5
+ import { useLabels } from "../composables/useLpConfig.js";
6
+ import { matchCountryByValue, filterCountries, loadCountries, flagEmoji } from "../components/countries.js";
5
7
  import { POPOVER_PANEL, OPTION_ITEM } from "../components/dropdown.js";
6
8
  import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
7
9
  import { useMergedAttrs } from "../composables/useMergedClass.js";
@@ -10,7 +12,7 @@ const _hoisted_2 = { class: "border-b border-line p-2" };
10
12
  const _hoisted_3 = { class: "text-base leading-none" };
11
13
  const _hoisted_4 = { class: "min-w-0 flex-1 truncate" };
12
14
  const _hoisted_5 = { class: "shrink-0 text-xs text-muted" };
13
- const _hoisted_6 = ["value", "placeholder", "disabled", "aria-invalid"];
15
+ const _hoisted_6 = ["id", "value", "placeholder", "disabled", "required", "aria-invalid", "aria-describedby"];
14
16
  const __default__ = { inheritAttrs: false };
15
17
  const _sfc_main = /* @__PURE__ */ defineComponent({
16
18
  ...__default__,
@@ -31,7 +33,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
31
33
  const props = __props;
32
34
  const emit = __emit;
33
35
  const PHONE_CHARS = /[\d+()\-\s]/;
34
- const { onBeforeInput, onPaste } = useInputFilter({ restrict: () => PHONE_CHARS });
36
+ const { onBeforeInput, onInput: filterInput, onCompositionEnd, onPaste } = useInputFilter({
37
+ restrict: () => PHONE_CHARS
38
+ });
35
39
  const allCountries = ref([]);
36
40
  const countries = computed(() => {
37
41
  if (!props.only?.length) return allCountries.value;
@@ -47,13 +51,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
47
51
  );
48
52
  const open = ref(false);
49
53
  const query = ref("");
50
- const filtered = computed(() => {
51
- const q = query.value.trim().toLowerCase();
52
- if (!q) return countries.value;
53
- return countries.value.filter(
54
- (c) => c.name.toLowerCase().includes(q) || c.dial.includes(q.replace(/\D/g, ""))
55
- );
56
- });
54
+ const filtered = computed(() => filterCountries(countries.value, query.value));
57
55
  function parse(value) {
58
56
  const country = matchCountryByValue(value, countries.value);
59
57
  const digits = value.replace(/[^\d]/g, "");
@@ -67,6 +65,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
67
65
  emit("change", parse(value));
68
66
  }
69
67
  function onInput(e) {
68
+ filterInput(e);
70
69
  setValue(e.target.value);
71
70
  }
72
71
  function chooseCountry(c) {
@@ -78,35 +77,52 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
78
77
  }
79
78
  onMounted(async () => {
80
79
  allCountries.value = await loadCountries();
81
- if (!props.modelValue && fallback.value) {
82
- emit("update:modelValue", `+${fallback.value.dial} `);
83
- }
84
80
  });
81
+ const seeded = computed(() => fallback.value ? `+${fallback.value.dial} ` : "");
82
+ function onFocus() {
83
+ if (!props.modelValue && seeded.value) setValue(seeded.value);
84
+ }
85
+ function onBlur() {
86
+ if (seeded.value && props.modelValue?.trim() === seeded.value.trim()) setValue("");
87
+ }
85
88
  const sizeClass = {
86
89
  sm: "h-(--size-control-sm) text-xs",
87
90
  md: "h-(--size-control-md) text-sm",
88
91
  lg: "h-(--size-control-lg) text-sm"
89
92
  };
93
+ const attrs = useAttrs();
94
+ const field = useFieldControl(() => ({
95
+ wrapped: false,
96
+ id: typeof attrs.id === "string" ? attrs.id : void 0,
97
+ invalid: props.invalid,
98
+ disabled: props.disabled
99
+ }));
100
+ const text = useLabels("phoneInput", { selectCountry: "Select country" });
90
101
  const { class: rootClass, attrs: rest } = useMergedAttrs(
91
102
  () => [
92
103
  "flex w-full items-stretch rounded-control border bg-surface-soft text-ink transition-colors duration-[var(--duration-fast)] focus-within:ring-2 focus-within:ring-ring",
93
104
  sizeClass[props.size],
94
- props.invalid ? "border-danger focus-within:border-danger focus-within:ring-danger-soft" : "border-line focus-within:border-brand",
95
- props.disabled ? "cursor-not-allowed opacity-55" : ""
105
+ field.value.invalid ? "border-danger focus-within:border-danger focus-within:ring-danger-soft" : "border-line focus-within:border-brand",
106
+ field.value.disabled ? "cursor-not-allowed opacity-55" : ""
96
107
  ].join(" ")
97
108
  );
109
+ const inputAttrs = computed(() => {
110
+ const { style: _s, ...others } = rest.value;
111
+ return others;
112
+ });
98
113
  return (_ctx, _cache) => {
99
- return openBlock(), createElementBlock("div", mergeProps({
114
+ return openBlock(), createElementBlock("div", {
100
115
  "data-lp-ring-owner": "",
101
- class: unref(rootClass)
102
- }, unref(rest)), [
116
+ class: normalizeClass(unref(rootClass)),
117
+ style: normalizeStyle(unref(attrs).style)
118
+ }, [
103
119
  createVNode(unref(ComboboxRoot), {
104
120
  open: open.value,
105
121
  "onUpdate:open": _cache[1] || (_cache[1] = ($event) => open.value = $event),
106
122
  "ignore-filter": true,
107
123
  "reset-search-term-on-select": false,
108
124
  "reset-search-term-on-blur": false,
109
- disabled: __props.disabled,
125
+ disabled: unref(field).disabled,
110
126
  class: "flex"
111
127
  }, {
112
128
  default: withCtx(() => [
@@ -114,9 +130,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
114
130
  default: withCtx(() => [
115
131
  createVNode(unref(ComboboxTrigger), {
116
132
  type: "button",
117
- disabled: __props.disabled,
118
- class: "flex shrink-0 items-center gap-1 rounded-l-control border-r border-line px-2.5 outline-none hover:bg-white/[0.04] data-[state=open]:bg-white/[0.04]",
119
- "aria-label": "Select country"
133
+ disabled: unref(field).disabled,
134
+ class: "flex shrink-0 items-center gap-1 rounded-l-control border-r border-line px-2.5 outline-none hover:bg-ink/5 data-[state=open]:bg-ink/5",
135
+ "aria-label": unref(text).selectCountry
120
136
  }, {
121
137
  default: withCtx(() => [
122
138
  createElementVNode("span", _hoisted_1, toDisplayString(activeCountry.value ? unref(flagEmoji)(activeCountry.value.iso2) : "🌐"), 1),
@@ -127,7 +143,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
127
143
  })
128
144
  ]),
129
145
  _: 1
130
- }, 8, ["disabled"])
146
+ }, 8, ["disabled", "aria-label"])
131
147
  ]),
132
148
  _: 1
133
149
  }),
@@ -185,22 +201,30 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
185
201
  ]),
186
202
  _: 1
187
203
  }, 8, ["open", "disabled"]),
188
- createElementVNode("input", {
189
- value: __props.modelValue,
190
- placeholder: __props.placeholder,
191
- disabled: __props.disabled,
192
- "aria-invalid": __props.invalid || void 0,
204
+ createElementVNode("input", mergeProps({
193
205
  type: "tel",
194
206
  inputmode: "tel",
195
- autocomplete: "tel",
207
+ autocomplete: "tel"
208
+ }, inputAttrs.value, {
209
+ id: unref(field).id,
210
+ value: __props.modelValue,
211
+ placeholder: __props.placeholder,
212
+ disabled: unref(field).disabled,
213
+ required: unref(field).required || void 0,
214
+ "aria-invalid": unref(field).invalid || void 0,
215
+ "aria-describedby": unref(field).describedBy,
196
216
  class: "lp-autofill min-w-0 flex-1 self-stretch bg-transparent px-3 outline-none placeholder:text-muted",
197
217
  onBeforeinput: _cache[2] || (_cache[2] = //@ts-ignore
198
218
  (...args) => unref(onBeforeInput) && unref(onBeforeInput)(...args)),
199
219
  onPaste: _cache[3] || (_cache[3] = //@ts-ignore
200
220
  (...args) => unref(onPaste) && unref(onPaste)(...args)),
201
- onInput
202
- }, null, 40, _hoisted_6)
203
- ], 16);
221
+ onCompositionend: _cache[4] || (_cache[4] = //@ts-ignore
222
+ (...args) => unref(onCompositionEnd) && unref(onCompositionEnd)(...args)),
223
+ onInput,
224
+ onFocus,
225
+ onBlur
226
+ }), null, 16, _hoisted_6)
227
+ ], 6);
204
228
  };
205
229
  }
206
230
  });
@@ -2,13 +2,14 @@ import { defineComponent, computed, ref, watch, onBeforeUnmount, openBlock, crea
2
2
  import { prefersReducedMotion, easeTravel } from "../composables/easing.js";
3
3
  import { useReveal } from "../composables/useReveal.js";
4
4
  import { resolveSlices, arcPath, calloutLabels, formatTick } from "../components/chart.js";
5
- import { _ as _sfc_main$2 } from "./LpContextMenu-CwW1QXe_.js";
5
+ import { _ as _sfc_main$2 } from "./LpContextMenu-DQw5dGfG.js";
6
6
  import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
7
- import { _ as _sfc_main$4 } from "./LpNumberFlow-amWYaeuA.js";
7
+ import { _ as _sfc_main$4 } from "./LpNumberFlow-z4WPZcZu.js";
8
8
  import { _ as _sfc_main$5 } from "./LpRollingText-CM5gkSeF.js";
9
9
  import { _ as _sfc_main$6 } from "./LpShift-DXNsauQZ.js";
10
- import { _ as _sfc_main$3 } from "./LpTooltip-hCLPAqMG.js";
10
+ import { _ as _sfc_main$3 } from "./LpTooltip-CBdzeKNf.js";
11
11
  import { useMergedAttrs } from "../composables/useMergedClass.js";
12
+ import { useLabels } from "../composables/useLpConfig.js";
12
13
  const _hoisted_1 = {
13
14
  key: 0,
14
15
  class: "flex flex-col gap-0.5"
@@ -24,7 +25,7 @@ const _hoisted_3 = {
24
25
  const _hoisted_4 = { class: "text-xs" };
25
26
  const _hoisted_5 = { class: "flex flex-wrap items-start gap-x-6 gap-y-3" };
26
27
  const _hoisted_6 = { class: "flex items-center gap-1.5" };
27
- const _hoisted_7 = ["width", "height"];
28
+ const _hoisted_7 = ["width", "height", "aria-label"];
28
29
  const _hoisted_8 = { key: 0 };
29
30
  const _hoisted_9 = ["id"];
30
31
  const _hoisted_10 = ["d"];
@@ -39,13 +40,19 @@ const _hoisted_18 = {
39
40
  key: 0,
40
41
  class: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center text-center"
41
42
  };
42
- const _hoisted_19 = ["aria-pressed", "onPointerenter", "onPointerleave", "onPointerdown", "onContextmenu"];
43
+ const _hoisted_19 = ["aria-pressed", "onPointerenter", "onPointerleave", "onPointerdown", "onClick", "onFocus", "onBlur", "onContextmenu"];
43
44
  const _hoisted_20 = { class: "truncate text-muted-strong group-hover:text-ink" };
44
45
  const _hoisted_21 = {
45
46
  key: 0,
46
47
  class: "shrink-0 text-muted"
47
48
  };
48
49
  const _hoisted_22 = { class: "ml-auto shrink-0 pl-2 font-mono tabular-nums text-muted" };
50
+ const _hoisted_23 = {
51
+ key: 3,
52
+ class: "sr-only"
53
+ };
54
+ const _hoisted_24 = { key: 0 };
55
+ const _hoisted_25 = { scope: "row" };
49
56
  const __default__ = { inheritAttrs: false };
50
57
  const _sfc_main = /* @__PURE__ */ defineComponent({
51
58
  ...__default__,
@@ -58,7 +65,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
58
65
  title: {},
59
66
  subtitle: {},
60
67
  maxSlices: { default: 6 },
61
- otherLabel: { default: "Other" },
68
+ otherLabel: {},
62
69
  sortBySize: { type: Boolean },
63
70
  unit: {},
64
71
  formatValue: {},
@@ -73,17 +80,25 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
73
80
  animate: { type: Boolean, default: true },
74
81
  duration: { default: 900 },
75
82
  menuItems: {},
76
- emptyLabel: { default: "No data" }
83
+ emptyLabel: {},
84
+ ariaLabel: {},
85
+ dataTable: { type: Boolean, default: false },
86
+ text: {}
77
87
  },
78
88
  emits: ["sliceClick", "selectionChange", "sliceContextMenu"],
79
89
  setup(__props, { emit: __emit }) {
80
90
  const props = __props;
81
91
  const emit = __emit;
92
+ const strings = useLabels(
93
+ "pie",
94
+ { empty: "No data", other: "Other", total: "total", selected: "{n} selected" },
95
+ () => props.text
96
+ );
82
97
  const resolved = computed(
83
98
  () => resolveSlices(
84
99
  props.slices,
85
100
  props.maxSlices || void 0,
86
- props.otherLabel,
101
+ props.otherLabel ?? strings.value.other,
87
102
  !props.sortBySize
88
103
  )
89
104
  );
@@ -193,6 +208,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
193
208
  const anchor = ref(-1);
194
209
  const dragging = ref(false);
195
210
  const isSelected = (i) => selected.value.has(i);
211
+ watch(
212
+ () => arcs.value.length,
213
+ (n) => {
214
+ if (active.value >= n) active.value = -1;
215
+ if (anchor.value >= n) anchor.value = -1;
216
+ if ([...selected.value].some((i) => i >= n)) {
217
+ selected.value = new Set([...selected.value].filter((i) => i < n));
218
+ emitSelection();
219
+ }
220
+ }
221
+ );
196
222
  const payloadFor = (i) => {
197
223
  const a = arcs.value[i];
198
224
  return { index: i, label: a.label, value: a.value, isOther: a.isOther };
@@ -208,7 +234,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
208
234
  for (let k = lo; k <= hi; k++) next.add(k);
209
235
  return next;
210
236
  };
211
- const onSlicePointerDown = (i, e) => {
237
+ const onSlicePointerDown = (i, e, drag = true) => {
212
238
  if (e.button === 2) return;
213
239
  if (e.shiftKey) {
214
240
  selected.value = rangeTo(i);
@@ -222,11 +248,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
222
248
  const only = selected.value.size === 1 && selected.value.has(i);
223
249
  selected.value = only ? /* @__PURE__ */ new Set() : /* @__PURE__ */ new Set([i]);
224
250
  anchor.value = only ? -1 : i;
225
- if (!only) beginDrag();
251
+ if (!only && drag) beginDrag();
226
252
  }
227
253
  emitSelection();
228
254
  emit("sliceClick", payloadFor(i));
229
255
  };
256
+ const onLegendClick = (i, e) => {
257
+ if (e.detail === 0) onSlicePointerDown(i, e, false);
258
+ };
230
259
  const onSlicePointerEnter = (i) => {
231
260
  clearTimeout(leaveTimer);
232
261
  active.value = i;
@@ -299,15 +328,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
299
328
  emit("sliceContextMenu", menuPoint.value);
300
329
  };
301
330
  const focused = computed(() => {
302
- if (active.value >= 0) return active.value;
303
- return selected.value.size === 1 ? [...selected.value][0] : -1;
331
+ const n = arcs.value.length;
332
+ if (active.value >= 0 && active.value < n) return active.value;
333
+ const only = selected.value.size === 1 ? [...selected.value][0] : -1;
334
+ return only < n ? only : -1;
304
335
  });
305
336
  const dimmed = (i) => selected.value.size > 0 && !selected.value.has(i);
306
337
  const total = computed(() => resolved.value.total);
307
338
  const selectedArcs = computed(
308
- () => [...selected.value].sort((x, y) => x - y).map((i) => arcs.value[i])
339
+ () => [...selected.value].sort((x, y) => x - y).filter((i) => i < arcs.value.length).map((i) => arcs.value[i])
309
340
  );
310
- const hovered = computed(() => active.value >= 0 ? arcs.value[active.value] : null);
341
+ const hovered = computed(() => arcs.value[active.value] ?? null);
311
342
  const tipSlice = ref(null);
312
343
  watch(hovered, (v) => {
313
344
  if (v) tipSlice.value = v;
@@ -320,9 +351,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
320
351
  });
321
352
  const centreLabel = computed(() => {
322
353
  if (focused.value >= 0) return arcs.value[focused.value].label;
323
- if (selected.value.size > 1) return `${selected.value.size} selected`;
324
- return "total";
354
+ if (selected.value.size > 1)
355
+ return strings.value.selected.replace("{n}", String(selected.value.size));
356
+ return strings.value.total;
325
357
  });
358
+ const summary = computed(
359
+ () => props.ariaLabel ?? [
360
+ props.title,
361
+ ...arcs.value.map((a) => `${a.label}: ${fmt(a.value)} (${pct(a.fraction)})`)
362
+ ].filter(Boolean).join(", ")
363
+ );
326
364
  const { class: rootClass, attrs: rest } = useMergedAttrs(
327
365
  "flex flex-col gap-3"
328
366
  );
@@ -345,7 +383,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
345
383
  name: "lucide:chart-pie",
346
384
  size: 18
347
385
  }),
348
- createElementVNode("span", _hoisted_4, toDisplayString(__props.emptyLabel), 1)
386
+ createElementVNode("span", _hoisted_4, toDisplayString(__props.emptyLabel ?? unref(strings).empty), 1)
349
387
  ], 4)) : (openBlock(), createBlock(_sfc_main$2, {
350
388
  key: 2,
351
389
  items: menuEntries.value,
@@ -403,6 +441,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
403
441
  width: canvasWidth.value,
404
442
  height: canvasHeight.value,
405
443
  class: "touch-none select-none",
444
+ role: "img",
445
+ "aria-label": summary.value,
406
446
  onPointerleave: leaveChart,
407
447
  onPointerup: endDrag,
408
448
  onClick: withModifiers(clearSelection, ["self"])
@@ -419,7 +459,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
419
459
  }, [
420
460
  (openBlock(true), createElementBlock(Fragment, null, renderList(arcs.value, (a, i) => {
421
461
  return openBlock(), createElementBlock("path", {
422
- key: a.label,
462
+ key: `${i}-${a.label}`,
423
463
  d: a.d,
424
464
  fill: a.color,
425
465
  class: "pointer-events-none transition-[transform,opacity] duration-medium ease-[var(--ease-emphasized)] motion-reduce:transition-none",
@@ -430,7 +470,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
430
470
  ], 8, _hoisted_11),
431
471
  (openBlock(true), createElementBlock(Fragment, null, renderList(arcs.value, (a, i) => {
432
472
  return openBlock(), createElementBlock("path", {
433
- key: `hit-${a.label}`,
473
+ key: `hit-${i}-${a.label}`,
434
474
  d: a.d,
435
475
  fill: "transparent",
436
476
  class: "cursor-pointer",
@@ -499,13 +539,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
499
539
  }, [
500
540
  (openBlock(true), createElementBlock(Fragment, null, renderList(arcs.value, (a, i) => {
501
541
  return openBlock(), createElementBlock("button", {
502
- key: a.label,
542
+ key: `${i}-${a.label}`,
503
543
  type: "button",
504
544
  class: normalizeClass(["group flex cursor-pointer items-center gap-2 rounded-md px-1 py-0.5 text-xs outline-none transition-[opacity,background-color] duration-fast focus-visible:ring-2 focus-visible:ring-ring", [dimmed(i) ? "opacity-45" : "", isSelected(i) ? "bg-surface-soft" : ""]]),
505
545
  "aria-pressed": isSelected(i),
506
546
  onPointerenter: ($event) => onSlicePointerEnter(i),
507
547
  onPointerleave: ($event) => onSlicePointerLeave(i),
508
548
  onPointerdown: ($event) => onSlicePointerDown(i, $event),
549
+ onClick: ($event) => onLegendClick(i, $event),
550
+ onFocus: ($event) => active.value = i,
551
+ onBlur: ($event) => active.value === i && (active.value = -1),
509
552
  onContextmenu: ($event) => onSliceContextMenu(i)
510
553
  }, [
511
554
  createElementVNode("span", {
@@ -521,7 +564,21 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
521
564
  ])
522
565
  ]),
523
566
  _: 3
524
- }, 8, ["items", "always"]))
567
+ }, 8, ["items", "always"])),
568
+ __props.dataTable && hasData.value ? (openBlock(), createElementBlock("table", _hoisted_23, [
569
+ __props.title ? (openBlock(), createElementBlock("caption", _hoisted_24, toDisplayString(__props.title), 1)) : createCommentVNode("", true),
570
+ createElementVNode("tbody", null, [
571
+ (openBlock(true), createElementBlock(Fragment, null, renderList(arcs.value, (a, i) => {
572
+ return openBlock(), createElementBlock("tr", {
573
+ key: `${i}-${a.label}`
574
+ }, [
575
+ createElementVNode("th", _hoisted_25, toDisplayString(a.label), 1),
576
+ createElementVNode("td", null, toDisplayString(fmt(a.value)), 1),
577
+ createElementVNode("td", null, toDisplayString(pct(a.fraction)), 1)
578
+ ]);
579
+ }), 128))
580
+ ])
581
+ ])) : createCommentVNode("", true)
525
582
  ], 16);
526
583
  };
527
584
  }
@@ -7,7 +7,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
7
7
  side: { default: "bottom" },
8
8
  align: { default: "center" },
9
9
  sideOffset: { default: 6 },
10
- panelClass: {}
10
+ panelClass: {},
11
+ ariaLabel: {}
11
12
  }, {
12
13
  "open": { type: Boolean },
13
14
  "openModifiers": {}
@@ -33,13 +34,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
33
34
  side: __props.side,
34
35
  align: __props.align,
35
36
  "side-offset": __props.sideOffset,
37
+ "aria-label": __props.ariaLabel,
36
38
  class: normalizeClass([unref(POPOVER_PANEL), "z-(--z-popover) w-64 rounded-card p-3 text-sm text-ink outline-none", __props.panelClass])
37
39
  }, {
38
40
  default: withCtx(() => [
39
41
  renderSlot(_ctx.$slots, "default")
40
42
  ]),
41
43
  _: 3
42
- }, 8, ["side", "align", "side-offset", "class"])
44
+ }, 8, ["side", "align", "side-offset", "aria-label", "class"])
43
45
  ]),
44
46
  _: 3
45
47
  })
@@ -2,7 +2,7 @@ import { defineComponent, ref, onBeforeUnmount, watch, computed, openBlock, crea
2
2
  import { ProgressRoot, ProgressIndicator } from "reka-ui";
3
3
  import { prefersReducedMotion, easeOut } from "../composables/easing.js";
4
4
  import { useReveal } from "../composables/useReveal.js";
5
- import { _ as _sfc_main$1 } from "./LpNumberFlow-amWYaeuA.js";
5
+ import { _ as _sfc_main$1 } from "./LpNumberFlow-z4WPZcZu.js";
6
6
  const _hoisted_1 = ["width", "height"];
7
7
  const _hoisted_2 = ["cx", "cy", "r", "stroke-width"];
8
8
  const _hoisted_3 = ["cx", "cy", "r", "stroke", "stroke-width", "stroke-dasharray"];
@@ -71,9 +71,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
71
71
  () => [props.value, props.max],
72
72
  () => runSweep(props.value, props.duration)
73
73
  );
74
- const pct = computed(
75
- () => Math.max(0, Math.min(100, shown.value / props.max * 100))
76
- );
74
+ const pct = computed(() => {
75
+ const ratio = props.max > 0 ? shown.value / props.max * 100 : 0;
76
+ return Number.isFinite(ratio) ? Math.max(0, Math.min(100, ratio)) : 0;
77
+ });
77
78
  const paintedTone = computed(() => {
78
79
  if (props.tone !== "auto") return props.tone;
79
80
  const fraction = props.max > 0 ? props.value / props.max : 0;
@@ -1,5 +1,6 @@
1
1
  import { defineComponent, openBlock, createBlock, unref, mergeProps, withCtx, renderSlot, createElementBlock, Fragment, renderList, createVNode, createElementVNode, createTextVNode, toDisplayString } from "vue";
2
2
  import { RadioGroupRoot, RadioGroupItem, RadioGroupIndicator } 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({
@@ -12,13 +13,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
12
13
  },
13
14
  emits: ["update:modelValue"],
14
15
  setup(__props) {
16
+ const props = __props;
17
+ const field = useFieldControl(() => ({ wrapped: false, disabled: props.disabled }));
15
18
  const { class: rootClass, attrs: rest } = useMergedAttrs(
16
19
  "flex flex-col gap-2"
17
20
  );
18
21
  return (_ctx, _cache) => {
19
22
  return openBlock(), createBlock(unref(RadioGroupRoot), mergeProps({
20
23
  "model-value": __props.modelValue,
21
- disabled: __props.disabled,
24
+ disabled: unref(field).disabled,
25
+ required: unref(field).required,
26
+ "aria-labelledby": unref(field).labelId,
27
+ "aria-describedby": unref(field).describedBy,
28
+ "aria-invalid": unref(field).invalid || void 0,
22
29
  class: unref(rootClass)
23
30
  }, unref(rest), {
24
31
  "onUpdate:modelValue": _cache[0] || (_cache[0] = (v) => _ctx.$emit("update:modelValue", v))
@@ -50,7 +57,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
50
57
  ])
51
58
  ]),
52
59
  _: 3
53
- }, 16, ["model-value", "disabled", "class"]);
60
+ }, 16, ["model-value", "disabled", "required", "aria-labelledby", "aria-describedby", "aria-invalid", "class"]);
54
61
  };
55
62
  }
56
63
  });
@@ -1,6 +1,7 @@
1
1
  import { defineComponent, useId, openBlock, createBlock, unref, mergeProps, withCtx, createElementBlock, Fragment, renderList, normalizeClass, createCommentVNode, toDisplayString } from "vue";
2
2
  import { Motion } from "motion-v";
3
3
  import { ToggleGroupRoot, ToggleGroupItem } from "reka-ui";
4
+ import { useFieldControl } from "../composables/useField.js";
4
5
  import { useMergedAttrs } from "../composables/useMergedClass.js";
5
6
  import { usePillTransition } from "../composables/usePillTransition.js";
6
7
  import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
@@ -37,13 +38,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
37
38
  props.block ? "flex w-full" : ""
38
39
  ].join(" ")
39
40
  );
41
+ const field = useFieldControl(() => ({ wrapped: false, disabled: props.disabled }));
40
42
  const pillId = `lp-segmented-${useId()}`;
41
43
  const pillTransition = usePillTransition();
42
44
  return (_ctx, _cache) => {
43
45
  return openBlock(), createBlock(unref(ToggleGroupRoot), mergeProps({
44
46
  "model-value": __props.modelValue,
45
47
  type: "single",
46
- disabled: __props.disabled,
48
+ disabled: unref(field).disabled,
49
+ "aria-labelledby": unref(field).labelId,
50
+ "aria-describedby": unref(field).describedBy,
47
51
  rovingFocus: true,
48
52
  class: unref(rootClass)
49
53
  }, unref(rest), { "onUpdate:modelValue": onChange }), {
@@ -52,7 +56,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
52
56
  return openBlock(), createBlock(unref(ToggleGroupItem), {
53
57
  key: opt.value,
54
58
  value: opt.value,
55
- "aria-label": opt.label ? void 0 : opt.value,
59
+ "aria-label": opt.ariaLabel ?? (opt.label ? void 0 : opt.value),
56
60
  class: normalizeClass(["relative inline-flex h-full items-center justify-center gap-1.5 rounded-md px-3 font-medium outline-none transition-colors duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] focus-visible:ring-2 focus-visible:ring-ring data-[state=on]:text-ink data-[state=off]:text-muted data-[state=off]:hover:text-ink disabled:cursor-not-allowed disabled:opacity-55", __props.block ? "flex-1" : ""])
57
61
  }, {
58
62
  default: withCtx(() => [
@@ -75,7 +79,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
75
79
  }), 128))
76
80
  ]),
77
81
  _: 1
78
- }, 16, ["model-value", "disabled", "class"]);
82
+ }, 16, ["model-value", "disabled", "aria-labelledby", "aria-describedby", "class"]);
79
83
  };
80
84
  }
81
85
  });