@leavepulse/ui 0.69.0 → 0.70.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 (634) hide show
  1. package/README.md +37 -0
  2. package/dist/assets/LoaderMark-DxBV2iDJ.css +43 -0
  3. package/dist/assets/LpActivityLine-B3EwNQEB.css +33 -0
  4. package/dist/assets/{LpCommandPalette-DxyjhYn_.css → LpCommandPalette-u-zOxKWa.css} +21 -31
  5. package/dist/assets/LpDock-Cbh0wQUv.css +17 -0
  6. package/dist/assets/{LpDropzone-Qb8k7cg4.css → LpDropzone-Bb1vBTeU.css} +12 -17
  7. package/dist/assets/{LpImageEditor-CElPDzpF.css → LpImageEditor-XM5bAziW.css} +6 -6
  8. package/dist/assets/LpLogViewer-BDNW6P52.css +38 -0
  9. package/dist/assets/{LpPalettePreview-CJmAKgYW.css → LpPalettePreview-B9VKDrvA.css} +2 -7
  10. package/dist/assets/LpShinyText-D69cBYDR.css +61 -0
  11. package/dist/assets/LpStatus-430OGTZY.css +17 -0
  12. package/dist/assets/LpStepMark-Drvx33Vg.css +10 -0
  13. package/dist/assets/{LpTable-BPERfJIk.css → LpTable-DHxEQ_-3.css} +19 -19
  14. package/dist/assets/LpTabs-BJ-nrJuI.css +18 -0
  15. package/dist/assets/LpTextReveal-DjI1MsDS.css +35 -0
  16. package/dist/assets/LpTypewriter-CXAm9Nca.css +27 -0
  17. package/dist/chunks/AttentionDot-DCBf4aWg.js +25 -0
  18. package/dist/chunks/{ContextMenuItems-B7XFHksm.js → ContextMenuItems-B5uE8Znw.js} +1 -1
  19. package/dist/chunks/{DropzoneLinkField-CjkrpDqO.js → DropzoneLinkField-Bw8Flkhk.js} +2 -2
  20. package/dist/chunks/FieldWrapper-BiennROB.js +43 -0
  21. package/dist/chunks/{LayoutCanvas-DF9CovaK.js → LayoutCanvas-BsJIzhdd.js} +1 -1
  22. package/dist/chunks/{LayoutNode-D9bIFzk0.js → LayoutNode-DJVhkSGk.js} +6 -8
  23. package/dist/chunks/LegendSwatch-BhRjrtzv.js +18 -0
  24. package/dist/chunks/LoaderMark-C1dubiKn.js +85 -0
  25. package/dist/chunks/{LpActionBar-MPKMu3pz.js → LpActionBar-CzOFar5t.js} +14 -20
  26. package/dist/chunks/LpActivityLine-CJvzrNpj.js +95 -0
  27. package/dist/chunks/{LpAddressInput-DG0BTqdH.js → LpAddressInput-CNnLTDZg.js} +7 -7
  28. package/dist/chunks/LpAlert-C5igj802.js +119 -0
  29. package/dist/chunks/{LpAppShell-DPh1756q.js → LpAppShell-CEUAB8kK.js} +15 -16
  30. package/dist/chunks/{LpAutocomplete-Dgn6hw3p.js → LpAutocomplete-D92niDHE.js} +15 -32
  31. package/dist/chunks/{LpAvatar-Bs0Fb1lC.js → LpAvatar-CLPl-qOF.js} +18 -6
  32. package/dist/chunks/LpBadge-HOEPBYmi.js +126 -0
  33. package/dist/chunks/LpBreadcrumbs-DYoPc3P4.js +144 -0
  34. package/dist/chunks/{LpButton-DNR-YAq5.js → LpButton-CVxBfGjd.js} +12 -4
  35. package/dist/chunks/{LpCalendar-BLya39Fh.js → LpCalendar-pVL91-Pl.js} +1 -1
  36. package/dist/chunks/{LpCard-Bf71NXZq.js → LpCard-CqKLnEhl.js} +18 -8
  37. package/dist/chunks/{LpCheckbox-Da5oZPHo.js → LpCheckbox-DHc2bHDe.js} +9 -6
  38. package/dist/chunks/{LpCodeBlock-lLbmslfs.js → LpCodeBlock-BGsQhxw8.js} +24 -32
  39. package/dist/chunks/LpCodeDisplay-CIKKT2iW.js +189 -0
  40. package/dist/chunks/LpCollapse-CWS9M_lm.js +115 -0
  41. package/dist/chunks/{LpColorPicker-DtEfBAcK.js → LpColorPicker-DFugXNUi.js} +10 -5
  42. package/dist/chunks/{LpConfirmDialog-D7s4jakB.js → LpConfirmDialog-CfGCux8m.js} +3 -3
  43. package/dist/chunks/{LpConfirmHost-DrYI5y1K.js → LpConfirmHost-exB7JmcO.js} +1 -1
  44. package/dist/chunks/{LpContextMenu-CRnjoqSt.js → LpContextMenu-COwOwRgI.js} +13 -5
  45. package/dist/chunks/LpCopyButton-DzHjnFs0.js +133 -0
  46. package/dist/chunks/LpCountdown-Dtq1ihlJ.js +231 -0
  47. package/dist/chunks/LpDataList-B-5nHfNw.js +120 -0
  48. package/dist/chunks/LpDatePicker-BUe1VUC0.js +168 -0
  49. package/dist/chunks/LpDateRangePicker-C_k65vGR.js +126 -0
  50. package/dist/chunks/{LpDisclosure-6AplYBub.js → LpDisclosure-DOarzlAG.js} +22 -11
  51. package/dist/chunks/{LpDrawer-Q4SOxM4s.js → LpDrawer-DGNKRsGq.js} +9 -4
  52. package/dist/chunks/{LpDropdownMenu-DWTt0ooM.js → LpDropdownMenu-CRgrhdAH.js} +10 -5
  53. package/dist/chunks/LpEditable-DTqLt2lT.js +236 -0
  54. package/dist/chunks/{LpEmptyState-om1UnFjV.js → LpEmptyState-KTKipws2.js} +1 -1
  55. package/dist/chunks/{LpFieldNotice-CHuDeLjc.js → LpFieldNotice-CurbNuXI.js} +1 -1
  56. package/dist/chunks/{LpFileTree-CW24YsVX.js → LpFileTree-DMISXVHC.js} +5 -3
  57. package/dist/chunks/{LpFileTreeNode-BXhTHaKW.js → LpFileTreeNode-CPXB_Yy3.js} +42 -55
  58. package/dist/chunks/{LpFormField-DPb47HEm.js → LpFormField-BWwgm1E4.js} +23 -9
  59. package/dist/chunks/LpFrame-BVQCQLDI.js +155 -0
  60. package/dist/chunks/LpGauge-Bk8TwJj0.js +204 -0
  61. package/dist/chunks/LpGlowBorder-B8V-QzIl.js +40 -0
  62. package/dist/chunks/{LpHintExample-C1eKYdeL.js → LpHintExample-9Py0wc-L.js} +11 -34
  63. package/dist/chunks/{LpHintLayer-7UOdWQG3.js → LpHintLayer-p4hqzdyA.js} +27 -14
  64. package/dist/chunks/{LpHints-BUtBp9-w.js → LpHints-CCrhRfy9.js} +3 -3
  65. package/dist/chunks/LpHoverCard-spGxyw7T.js +130 -0
  66. package/dist/chunks/{LpIcon-6tSrZ3Zy.js → LpIcon-HJP5xMz4.js} +1 -1
  67. package/dist/chunks/LpIdenticon-BzdC_qz9.js +63 -0
  68. package/dist/chunks/{LpInfraNode-Ds_8SZgN.js → LpInfraNode-CUC3t4na.js} +39 -25
  69. package/dist/chunks/{LpInput-CUyr6PIE.js → LpInput-CDuwODJG.js} +44 -18
  70. package/dist/chunks/{LpLightbox-B9J8rzsj.js → LpLightbox-XJ0LpTcZ.js} +69 -69
  71. package/dist/chunks/LpLoader-DjJEX8hL.js +92 -0
  72. package/dist/chunks/{LpLogViewer-4QFc-sVN.js → LpLogViewer-elZHbj85.js} +225 -129
  73. package/dist/chunks/LpMagnetic-CtXKLa2Y.js +62 -0
  74. package/dist/chunks/{LpMapPicker-BTbkFeSG.js → LpMapPicker-BtIl7NOM.js} +34 -31
  75. package/dist/chunks/LpMasonry--k0571qG.js +185 -0
  76. package/dist/chunks/{LpMediaGallery-CuPcscx3.js → LpMediaGallery-D5swlmZ_.js} +3 -3
  77. package/dist/chunks/{LpModal-hk1noDcr.js → LpModal-eBMt2Fqn.js} +8 -3
  78. package/dist/chunks/{LpModalNav-DQd2keZm.js → LpModalNav-D4Z0wVHR.js} +4 -4
  79. package/dist/chunks/{LpNotificationBell-X84PJIxD.js → LpNotificationBell-DPZmP5dM.js} +32 -48
  80. package/dist/chunks/LpNumberField-B9k-h2HE.js +140 -0
  81. package/dist/chunks/{LpNumberFlow-z4WPZcZu.js → LpNumberFlow-Cfyh033Q.js} +8 -28
  82. package/dist/chunks/{LpOtpInput-PbeNJ5In.js → LpOtpInput-CeBPsM7D.js} +2 -1
  83. package/dist/chunks/{LpPagination-Bx-VG4Ag.js → LpPagination-VNCX6pFC.js} +37 -6
  84. package/dist/chunks/{LpPalettePreview-CFav_7co.js → LpPalettePreview-BNB8T_MY.js} +1 -1
  85. package/dist/chunks/{LpPasswordInput-CbnXitAS.js → LpPasswordInput-DTV18FIh.js} +20 -20
  86. package/dist/chunks/{LpPhoneInput-DP69HONS.js → LpPhoneInput-C60tx1tC.js} +12 -7
  87. package/dist/chunks/{LpPie-yLF9-aDR.js → LpPie-CFuV7pZv.js} +158 -47
  88. package/dist/chunks/LpPipeline-D81yh_NX.js +329 -0
  89. package/dist/chunks/{LpPopover-DVnkHaOu.js → LpPopover-BEIcqb9p.js} +8 -3
  90. package/dist/chunks/{LpProgress-CA86wxXu.js → LpProgress-CE-m5OpD.js} +23 -63
  91. package/dist/chunks/LpQuota-2Sw_gqcJ.js +162 -0
  92. package/dist/chunks/{LpRadioGroup-8S5hf8lE.js → LpRadioGroup-CGBr5nIp.js} +1 -1
  93. package/dist/chunks/{LpRangeCalendar-ByQi-WUz.js → LpRangeCalendar-c5qj7YcC.js} +1 -1
  94. package/dist/chunks/{LpRangeSlider-C1yF9-nP.js → LpRangeSlider-Dv6lNvHY.js} +6 -2
  95. package/dist/chunks/LpRelativeTime-CKzVqAo9.js +73 -0
  96. package/dist/chunks/LpRepeater-D0VjmD6y.js +140 -0
  97. package/dist/chunks/LpRevealOnScroll-DcQjexLy.js +76 -0
  98. package/dist/chunks/LpScramble-TDO5Kdou.js +85 -0
  99. package/dist/chunks/LpSecretField-DMfdJ1cQ.js +307 -0
  100. package/dist/chunks/{LpSection-BmRXe6ZP.js → LpSection-BW4xJ-Li.js} +1 -1
  101. package/dist/chunks/{LpSegmented-CW3bFHM4.js → LpSegmented-BO99Sr4m.js} +11 -14
  102. package/dist/chunks/{LpSelect-BCyDYoih.js → LpSelect-B4f_yRi5.js} +93 -108
  103. package/dist/chunks/LpShaderBackdrop-Bote0iuy.js +332 -0
  104. package/dist/chunks/LpShinyText-DX2ajtWq.js +48 -0
  105. package/dist/chunks/{LpSidebar-DfIiS-lB.js → LpSidebar-D-M0Y_7U.js} +5 -3
  106. package/dist/chunks/{LpSidebarNav-C5FDNI0t.js → LpSidebarNav-DF-TYxOV.js} +3 -3
  107. package/dist/chunks/{LpSlider-Cuzmrd7p.js → LpSlider-DuoRpOrH.js} +6 -2
  108. package/dist/chunks/{LpSparkline-DXT4KrSi.js → LpSparkline-CExIRDb3.js} +32 -27
  109. package/dist/chunks/LpSpotlight-4F3NeUMY.js +41 -0
  110. package/dist/chunks/{LpStat-iBMF5QNk.js → LpStat-B2ix1Q7t.js} +38 -35
  111. package/dist/chunks/LpStatus-C7kx5PKE.js +86 -0
  112. package/dist/chunks/LpStepMark-DK-5BKAt.js +101 -0
  113. package/dist/chunks/LpStepper-DRFfdJaq.js +76 -0
  114. package/dist/chunks/{LpSwap-D82jiecV.js → LpSwap-DzE6M3Mg.js} +1 -1
  115. package/dist/chunks/LpSwitch-DrzKrZZV.js +112 -0
  116. package/dist/chunks/{LpTableFilter-CuIbgdW0.js → LpTableFilter-DyvHGbOk.js} +3 -2
  117. package/dist/chunks/{LpTableOfContents-C_4VBktT.js → LpTableOfContents-rYvo8z5T.js} +34 -21
  118. package/dist/chunks/{LpTagsInput-DiXrpYeE.js → LpTagsInput-DgpBFRV2.js} +68 -71
  119. package/dist/chunks/LpTextReveal-CtAnOUkp.js +140 -0
  120. package/dist/chunks/{LpTextarea-xoQd5Lnp.js → LpTextarea-DiWjeVoJ.js} +12 -11
  121. package/dist/chunks/{LpThemeProvider-CQ2jC9TA.js → LpThemeProvider-DcbfOxsU.js} +1 -1
  122. package/dist/chunks/LpThemeStudio-DguwHdGt.js +416 -0
  123. package/dist/chunks/LpThemeStudioSection-BwhqYDLf.js +20 -0
  124. package/dist/chunks/LpThemeSwitcher-D5uz0MhK.js +278 -0
  125. package/dist/chunks/{LpTimeField-MFgAsNc5.js → LpTimeField-BFQVf_PW.js} +13 -5
  126. package/dist/chunks/{LpToaster-C4zE9zB7.js → LpToaster-Wv9ksj4q.js} +49 -82
  127. package/dist/chunks/{LpTooltip-suFCM34F.js → LpTooltip-Cz8SQwRt.js} +8 -3
  128. package/dist/chunks/{LpTopologyCanvas-6ozNrQKh.js → LpTopologyCanvas-ZhKthfgz.js} +1 -1
  129. package/dist/chunks/{LpTour-BUp3Jt2e.js → LpTour-NfRJNEIP.js} +24 -18
  130. package/dist/chunks/LpTruncate-D_5Pfv5B.js +112 -0
  131. package/dist/chunks/LpTypewriter-BCL_a6wE.js +159 -0
  132. package/dist/chunks/{LpUptimeBar-B6kHw4Cj.js → LpUptimeBar-DWegV2p6.js} +9 -8
  133. package/dist/chunks/{LpVideoBackdrop-qWRYBOTQ.js → LpVideoBackdrop-DS1wGv-X.js} +7 -8
  134. package/dist/chunks/{MenuTitle-obgek0B7.js → MenuTitle-BjQZX8tQ.js} +1 -1
  135. package/dist/chunks/OptionContent-CmYUUeWj.js +40 -0
  136. package/dist/chunks/PickerField-CHRS1h7K.js +116 -0
  137. package/dist/chunks/RevealToggle-C-KzaQGJ.js +65 -0
  138. package/dist/chunks/StepConnector-37OgEOXA.js +41 -0
  139. package/dist/chunks/TourCard-BXuVHsfn.js +123 -0
  140. package/dist/chunks/backdrop-Dkf2vM81.js +59 -0
  141. package/dist/chunks/{icons-DVhZ_plB.js → icons-4IywzkHk.js} +1 -1
  142. package/dist/chunks/{useTheme-2qHG8NEU.js → useTheme-BOV_-AiY.js} +9 -65
  143. package/dist/component-names.d.ts +1 -1
  144. package/dist/components/AttentionDot.vue.d.ts +9 -0
  145. package/dist/components/AttentionDot.vue.js +4 -0
  146. package/dist/components/ContextMenuItems.vue.js +1 -1
  147. package/dist/components/DropzoneLinkField.vue.js +1 -1
  148. package/dist/components/FieldWrapper.vue.d.ts +25 -0
  149. package/dist/components/FieldWrapper.vue.js +4 -0
  150. package/dist/components/LayoutCanvas.vue.js +1 -1
  151. package/dist/components/LayoutNode.vue.d.ts +4 -4
  152. package/dist/components/LayoutNode.vue.js +1 -1
  153. package/dist/components/LegendSwatch.vue.d.ts +6 -0
  154. package/dist/components/LegendSwatch.vue.js +4 -0
  155. package/dist/components/LoaderMark.vue.d.ts +12 -0
  156. package/dist/components/LoaderMark.vue.js +4 -0
  157. package/dist/components/LpActionBar.vue.js +1 -1
  158. package/dist/components/LpActivityLine.vue.d.ts +58 -0
  159. package/dist/components/LpActivityLine.vue.js +4 -0
  160. package/dist/components/LpAddressInput.vue.js +1 -1
  161. package/dist/components/LpAlert.vue.d.ts +2 -2
  162. package/dist/components/LpAlert.vue.js +1 -1
  163. package/dist/components/LpAppShell.vue.d.ts +8 -7
  164. package/dist/components/LpAppShell.vue.js +1 -1
  165. package/dist/components/LpAutocomplete.vue.js +1 -1
  166. package/dist/components/LpAvatar.vue.d.ts +16 -0
  167. package/dist/components/LpAvatar.vue.js +1 -1
  168. package/dist/components/LpBadge.vue.d.ts +19 -5
  169. package/dist/components/LpBadge.vue.js +1 -1
  170. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  171. package/dist/components/LpButton.vue.d.ts +2 -2
  172. package/dist/components/LpButton.vue.js +1 -1
  173. package/dist/components/LpCalendar.vue.js +1 -1
  174. package/dist/components/LpCard.vue.d.ts +24 -0
  175. package/dist/components/LpCard.vue.js +1 -1
  176. package/dist/components/LpChart.vue.js +107 -138
  177. package/dist/components/LpCheckbox.vue.d.ts +2 -2
  178. package/dist/components/LpCheckbox.vue.js +1 -1
  179. package/dist/components/LpCodeBlock.vue.js +1 -1
  180. package/dist/components/LpCodeDisplay.vue.d.ts +89 -0
  181. package/dist/components/LpCodeDisplay.vue.js +4 -0
  182. package/dist/components/LpCollapse.vue.d.ts +58 -0
  183. package/dist/components/LpCollapse.vue.js +4 -0
  184. package/dist/components/LpColorPicker.vue.d.ts +2 -2
  185. package/dist/components/LpColorPicker.vue.js +1 -1
  186. package/dist/components/LpCommandPalette.vue.js +34 -23
  187. package/dist/components/LpConfirmDialog.vue.js +1 -1
  188. package/dist/components/LpConfirmHost.vue.js +1 -1
  189. package/dist/components/LpContextMenu.vue.js +1 -1
  190. package/dist/components/LpCopyButton.vue.d.ts +82 -0
  191. package/dist/components/LpCopyButton.vue.js +4 -0
  192. package/dist/components/LpCountdown.vue.d.ts +100 -0
  193. package/dist/components/LpCountdown.vue.js +4 -0
  194. package/dist/components/LpDataList.vue.d.ts +66 -0
  195. package/dist/components/LpDataList.vue.js +4 -0
  196. package/dist/components/LpDatePicker.vue.d.ts +1 -1
  197. package/dist/components/LpDatePicker.vue.js +1 -1
  198. package/dist/components/LpDateRangePicker.vue.d.ts +1 -1
  199. package/dist/components/LpDateRangePicker.vue.js +1 -1
  200. package/dist/components/LpDisclosure.vue.js +1 -1
  201. package/dist/components/LpDock.vue.d.ts +74 -0
  202. package/dist/components/LpDock.vue.js +204 -0
  203. package/dist/components/LpDrawer.vue.js +1 -1
  204. package/dist/components/LpDropdownMenu.vue.js +1 -1
  205. package/dist/components/LpDropzone.vue.d.ts +8 -1
  206. package/dist/components/LpDropzone.vue.js +36 -15
  207. package/dist/components/LpEditable.vue.d.ts +85 -0
  208. package/dist/components/LpEditable.vue.js +4 -0
  209. package/dist/components/LpEmptyState.vue.js +1 -1
  210. package/dist/components/LpFieldNotice.vue.js +1 -1
  211. package/dist/components/LpFileTree.vue.js +1 -1
  212. package/dist/components/LpFileTreeNode.vue.js +1 -1
  213. package/dist/components/LpFormField.vue.js +1 -1
  214. package/dist/components/LpFrame.vue.d.ts +22 -0
  215. package/dist/components/LpFrame.vue.js +4 -0
  216. package/dist/components/LpGauge.vue.d.ts +116 -0
  217. package/dist/components/LpGauge.vue.js +4 -0
  218. package/dist/components/LpGlowBorder.vue.d.ts +47 -0
  219. package/dist/components/LpGlowBorder.vue.js +4 -0
  220. package/dist/components/LpHintExample.vue.d.ts +2 -2
  221. package/dist/components/LpHintExample.vue.js +1 -1
  222. package/dist/components/LpHintLayer.vue.js +1 -1
  223. package/dist/components/LpHints.vue.js +1 -1
  224. package/dist/components/LpHoverCard.vue.d.ts +60 -0
  225. package/dist/components/LpHoverCard.vue.js +4 -0
  226. package/dist/components/LpIcon.vue.js +1 -1
  227. package/dist/components/LpIdenticon.vue.d.ts +37 -0
  228. package/dist/components/LpIdenticon.vue.js +4 -0
  229. package/dist/components/LpImageEditor.vue.js +13 -19
  230. package/dist/components/LpInfraNode.vue.js +1 -1
  231. package/dist/components/LpInput.vue.d.ts +10 -0
  232. package/dist/components/LpInput.vue.js +1 -1
  233. package/dist/components/LpLightbox.vue.js +1 -1
  234. package/dist/components/LpLoader.vue.d.ts +106 -0
  235. package/dist/components/LpLoader.vue.js +4 -0
  236. package/dist/components/LpLogViewer.vue.js +1 -1
  237. package/dist/components/LpMagnetic.vue.d.ts +28 -0
  238. package/dist/components/LpMagnetic.vue.js +4 -0
  239. package/dist/components/LpMapPicker.vue.js +1 -1
  240. package/dist/components/LpMasonry.vue.d.ts +42 -0
  241. package/dist/components/LpMasonry.vue.js +4 -0
  242. package/dist/components/LpMediaGallery.vue.js +1 -1
  243. package/dist/components/LpModal.vue.js +1 -1
  244. package/dist/components/LpModalNav.vue.js +1 -1
  245. package/dist/components/LpNotificationBell.vue.d.ts +15 -6
  246. package/dist/components/LpNotificationBell.vue.js +1 -1
  247. package/dist/components/LpNumberField.vue.d.ts +57 -0
  248. package/dist/components/LpNumberField.vue.js +1 -1
  249. package/dist/components/LpNumberFlow.vue.js +1 -1
  250. package/dist/components/LpOtpInput.vue.d.ts +12 -4
  251. package/dist/components/LpOtpInput.vue.js +1 -1
  252. package/dist/components/LpPagination.vue.js +1 -1
  253. package/dist/components/LpPaletteFacts.vue.js +1 -1
  254. package/dist/components/LpPaletteHeader.vue.js +2 -2
  255. package/dist/components/LpPalettePreview.vue.js +1 -1
  256. package/dist/components/LpPaletteStats.vue.js +1 -1
  257. package/dist/components/LpPasswordInput.vue.d.ts +12 -1
  258. package/dist/components/LpPasswordInput.vue.js +1 -1
  259. package/dist/components/LpPhoneInput.vue.js +1 -1
  260. package/dist/components/LpPie.vue.d.ts +3 -1
  261. package/dist/components/LpPie.vue.js +1 -1
  262. package/dist/components/LpPipeline.vue.d.ts +91 -0
  263. package/dist/components/LpPipeline.vue.js +4 -0
  264. package/dist/components/LpPopover.vue.d.ts +2 -2
  265. package/dist/components/LpPopover.vue.js +1 -1
  266. package/dist/components/LpProgress.vue.d.ts +11 -4
  267. package/dist/components/LpProgress.vue.js +1 -1
  268. package/dist/components/LpQuota.vue.d.ts +68 -0
  269. package/dist/components/LpQuota.vue.js +4 -0
  270. package/dist/components/LpRadioGroup.vue.js +1 -1
  271. package/dist/components/LpRangeCalendar.vue.js +1 -1
  272. package/dist/components/LpRangeSlider.vue.js +1 -1
  273. package/dist/components/LpRelativeTime.vue.d.ts +41 -0
  274. package/dist/components/LpRelativeTime.vue.js +4 -0
  275. package/dist/components/LpRepeater.vue.d.ts +48 -0
  276. package/dist/components/LpRepeater.vue.js +4 -0
  277. package/dist/components/LpRevealOnScroll.vue.d.ts +67 -0
  278. package/dist/components/LpRevealOnScroll.vue.js +4 -0
  279. package/dist/components/LpRollingText.vue.d.ts +1 -1
  280. package/dist/components/LpScramble.vue.d.ts +55 -0
  281. package/dist/components/LpScramble.vue.js +4 -0
  282. package/dist/components/LpScrollArea.vue.d.ts +1 -1
  283. package/dist/components/LpSecretField.vue.d.ts +108 -0
  284. package/dist/components/LpSecretField.vue.js +4 -0
  285. package/dist/components/LpSection.vue.js +1 -1
  286. package/dist/components/LpSegmented.vue.js +1 -1
  287. package/dist/components/LpSelect.vue.d.ts +2 -0
  288. package/dist/components/LpSelect.vue.js +1 -1
  289. package/dist/components/LpShaderBackdrop.vue.d.ts +39 -0
  290. package/dist/components/LpShaderBackdrop.vue.js +4 -0
  291. package/dist/components/LpShinyText.vue.d.ts +39 -0
  292. package/dist/components/LpShinyText.vue.js +4 -0
  293. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  294. package/dist/components/LpSidebar.vue.js +1 -1
  295. package/dist/components/LpSidebarNav.vue.js +1 -1
  296. package/dist/components/LpSlider.vue.js +1 -1
  297. package/dist/components/LpSparkline.vue.d.ts +4 -3
  298. package/dist/components/LpSparkline.vue.js +1 -1
  299. package/dist/components/LpSpotlight.vue.d.ts +37 -0
  300. package/dist/components/LpSpotlight.vue.js +4 -0
  301. package/dist/components/LpStat.vue.js +1 -1
  302. package/dist/components/LpStatus.vue.d.ts +65 -0
  303. package/dist/components/LpStatus.vue.js +4 -0
  304. package/dist/components/LpStepMark.vue.d.ts +31 -0
  305. package/dist/components/LpStepMark.vue.js +4 -0
  306. package/dist/components/LpStepper.vue.js +1 -1
  307. package/dist/components/LpSwap.vue.js +1 -1
  308. package/dist/components/LpSwitch.vue.d.ts +2 -2
  309. package/dist/components/LpSwitch.vue.js +1 -1
  310. package/dist/components/LpTable.vue.js +104 -120
  311. package/dist/components/LpTableFilter.vue.js +1 -1
  312. package/dist/components/LpTableOfContents.vue.d.ts +6 -1
  313. package/dist/components/LpTableOfContents.vue.js +1 -1
  314. package/dist/components/LpTabs.vue.d.ts +5 -5
  315. package/dist/components/LpTabs.vue.js +25 -33
  316. package/dist/components/LpTagsInput.vue.js +1 -1
  317. package/dist/components/LpTextReveal.vue.d.ts +58 -0
  318. package/dist/components/LpTextReveal.vue.js +4 -0
  319. package/dist/components/LpTextarea.vue.js +1 -1
  320. package/dist/components/LpThemeProvider.vue.js +1 -1
  321. package/dist/components/LpThemeStudio.vue.d.ts +54 -0
  322. package/dist/components/LpThemeStudio.vue.js +4 -0
  323. package/dist/components/LpThemeStudioSection.vue.d.ts +16 -0
  324. package/dist/components/LpThemeStudioSection.vue.js +4 -0
  325. package/dist/components/LpThemeSwitcher.vue.d.ts +32 -1
  326. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  327. package/dist/components/LpTimeField.vue.d.ts +2 -0
  328. package/dist/components/LpTimeField.vue.js +1 -1
  329. package/dist/components/LpToaster.vue.js +1 -1
  330. package/dist/components/LpTooltip.vue.d.ts +2 -2
  331. package/dist/components/LpTooltip.vue.js +1 -1
  332. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  333. package/dist/components/LpTour.vue.js +1 -1
  334. package/dist/components/LpTruncate.vue.d.ts +34 -0
  335. package/dist/components/LpTruncate.vue.js +4 -0
  336. package/dist/components/LpTypewriter.vue.d.ts +61 -0
  337. package/dist/components/LpTypewriter.vue.js +4 -0
  338. package/dist/components/LpUptimeBar.vue.js +1 -1
  339. package/dist/components/LpVideoBackdrop.vue.js +1 -1
  340. package/dist/components/MenuTitle.vue.js +1 -1
  341. package/dist/components/OptionContent.vue.d.ts +7 -0
  342. package/dist/components/OptionContent.vue.js +4 -0
  343. package/dist/components/PickerField.vue.d.ts +43 -0
  344. package/dist/components/PickerField.vue.js +4 -0
  345. package/dist/components/RevealToggle.vue.d.ts +21 -0
  346. package/dist/components/RevealToggle.vue.js +4 -0
  347. package/dist/components/StepConnector.vue.d.ts +19 -0
  348. package/dist/components/StepConnector.vue.js +4 -0
  349. package/dist/components/TourCard.vue.js +1 -1
  350. package/dist/components/badge.d.ts +1 -0
  351. package/dist/components/badge.js +4 -0
  352. package/dist/components/chart.d.ts +5 -1
  353. package/dist/components/chart.js +2 -21
  354. package/dist/components/dateRange.d.ts +11 -0
  355. package/dist/components/dateRange.js +12 -0
  356. package/dist/components/dock.d.ts +19 -0
  357. package/dist/components/dock.js +16 -0
  358. package/dist/components/dropdown.d.ts +10 -1
  359. package/dist/components/dropdown.js +7 -2
  360. package/dist/components/fieldText.d.ts +38 -0
  361. package/dist/components/fieldText.js +53 -0
  362. package/dist/components/fileTree.d.ts +7 -3
  363. package/dist/components/fileTree.js +12 -18
  364. package/dist/components/format.d.ts +41 -0
  365. package/dist/components/format.js +67 -0
  366. package/dist/components/identicon.d.ts +38 -0
  367. package/dist/components/identicon.js +85 -0
  368. package/dist/components/masonry.d.ts +32 -0
  369. package/dist/components/masonry.js +40 -0
  370. package/dist/components/menuWhen.js +1 -1
  371. package/dist/components/meter.d.ts +64 -0
  372. package/dist/components/meter.js +53 -0
  373. package/dist/components/otp.d.ts +1 -1
  374. package/dist/components/otp.js +7 -2
  375. package/dist/components/pipeline.d.ts +55 -0
  376. package/dist/components/pipeline.js +51 -0
  377. package/dist/components/quota.d.ts +57 -0
  378. package/dist/components/quota.js +40 -0
  379. package/dist/components/relativeTime.d.ts +24 -0
  380. package/dist/components/relativeTime.js +56 -0
  381. package/dist/components/reveal.d.ts +18 -0
  382. package/dist/components/reveal.js +32 -0
  383. package/dist/components/scramble.d.ts +68 -0
  384. package/dist/components/scramble.js +58 -0
  385. package/dist/components/shaderBackdrop.d.ts +20 -0
  386. package/dist/components/shaderBackdrop.js +156 -0
  387. package/dist/components/slider.d.ts +5 -0
  388. package/dist/components/slider.js +24 -0
  389. package/dist/components/slotText.d.ts +2 -0
  390. package/dist/components/slotText.js +9 -0
  391. package/dist/components/status.d.ts +14 -0
  392. package/dist/components/status.js +22 -0
  393. package/dist/components/tableFacets.d.ts +8 -0
  394. package/dist/components/tableFacets.js +19 -0
  395. package/dist/components/textSplit.d.ts +17 -0
  396. package/dist/components/textSplit.js +24 -0
  397. package/dist/components/timeSpan.d.ts +78 -0
  398. package/dist/components/timeSpan.js +85 -0
  399. package/dist/components/tone.d.ts +43 -0
  400. package/dist/components/tone.js +82 -0
  401. package/dist/components/tour.js +3 -2
  402. package/dist/components/typewriter.d.ts +36 -0
  403. package/dist/components/typewriter.js +53 -0
  404. package/dist/components/videoBackdrop.js +5 -6
  405. package/dist/composables/easing.d.ts +22 -1
  406. package/dist/composables/easing.js +42 -1
  407. package/dist/composables/pseudoLocale.d.ts +15 -0
  408. package/dist/composables/pseudoLocale.js +96 -0
  409. package/dist/composables/scroll.js +5 -3
  410. package/dist/composables/useClipboard.d.ts +4 -1
  411. package/dist/composables/useClipboard.js +12 -2
  412. package/dist/composables/useField.d.ts +8 -0
  413. package/dist/composables/useField.js +5 -0
  414. package/dist/composables/useForm.js +19 -5
  415. package/dist/composables/useInView.d.ts +11 -0
  416. package/dist/composables/useInView.js +39 -0
  417. package/dist/composables/useLoadingGate.d.ts +8 -0
  418. package/dist/composables/useLoadingGate.js +38 -0
  419. package/dist/composables/useLpConfig.d.ts +10 -0
  420. package/dist/composables/useLpConfig.js +11 -1
  421. package/dist/composables/useMediaQuery.js +3 -1
  422. package/dist/composables/useNow.d.ts +16 -0
  423. package/dist/composables/useNow.js +39 -0
  424. package/dist/composables/usePersisted.js +14 -7
  425. package/dist/composables/usePillTransition.d.ts +5 -2
  426. package/dist/composables/usePillTransition.js +4 -3
  427. package/dist/composables/usePointerFrame.d.ts +18 -0
  428. package/dist/composables/usePointerFrame.js +31 -0
  429. package/dist/composables/useReducedMotion.d.ts +2 -0
  430. package/dist/composables/useReducedMotion.js +7 -0
  431. package/dist/composables/useRepeater.d.ts +17 -0
  432. package/dist/composables/useRepeater.js +31 -0
  433. package/dist/composables/useResizeObserver.d.ts +8 -0
  434. package/dist/composables/useResizeObserver.js +33 -0
  435. package/dist/composables/useRevealedValue.d.ts +31 -0
  436. package/dist/composables/useRevealedValue.js +26 -0
  437. package/dist/composables/useScramble.d.ts +42 -0
  438. package/dist/composables/useScramble.js +76 -0
  439. package/dist/composables/useShift.js +2 -10
  440. package/dist/composables/useSpotlight.d.ts +18 -0
  441. package/dist/composables/useSpotlight.js +53 -0
  442. package/dist/composables/useTilt.js +26 -18
  443. package/dist/composables/useTween.d.ts +43 -0
  444. package/dist/composables/useTween.js +69 -0
  445. package/dist/composables/useView.d.ts +18 -0
  446. package/dist/composables/useView.js +61 -0
  447. package/dist/icons-all.js +1 -1
  448. package/dist/index.d.ts +98 -1
  449. package/dist/index.js +262 -104
  450. package/dist/theme/define.d.ts +12 -0
  451. package/dist/theme/studio.d.ts +90 -0
  452. package/package.json +5 -2
  453. package/src/component-names.ts +33 -0
  454. package/src/components/AttentionDot.vue +27 -0
  455. package/src/components/FieldWrapper.vue +38 -0
  456. package/src/components/LayoutNode.vue +5 -9
  457. package/src/components/LegendSwatch.vue +15 -0
  458. package/src/components/LoaderMark.vue +90 -0
  459. package/src/components/LpActionBar.vue +12 -20
  460. package/src/components/LpActivityLine.vue +186 -0
  461. package/src/components/LpAlert.vue +54 -24
  462. package/src/components/LpAppShell.vue +7 -11
  463. package/src/components/LpAutocomplete.vue +16 -14
  464. package/src/components/LpAvatar.vue +17 -2
  465. package/src/components/LpBadge.vue +77 -13
  466. package/src/components/LpBreadcrumbs.vue +101 -35
  467. package/src/components/LpButton.vue +15 -3
  468. package/src/components/LpCard.vue +30 -7
  469. package/src/components/LpChart.vue +143 -154
  470. package/src/components/LpCheckbox.vue +10 -4
  471. package/src/components/LpCodeBlock.vue +11 -19
  472. package/src/components/LpCodeDisplay.vue +228 -0
  473. package/src/components/LpCollapse.vue +162 -0
  474. package/src/components/LpColorPicker.vue +10 -1
  475. package/src/components/LpCommandPalette.vue +38 -24
  476. package/src/components/LpContextMenu.vue +10 -1
  477. package/src/components/LpCopyButton.vue +185 -0
  478. package/src/components/LpCountdown.vue +308 -0
  479. package/src/components/LpDataList.vue +154 -0
  480. package/src/components/LpDatePicker.vue +53 -104
  481. package/src/components/LpDateRangePicker.vue +49 -95
  482. package/src/components/LpDisclosure.vue +58 -36
  483. package/src/components/LpDock.vue +274 -0
  484. package/src/components/LpDrawer.vue +10 -1
  485. package/src/components/LpDropdownMenu.vue +10 -1
  486. package/src/components/LpDropzone.vue +34 -13
  487. package/src/components/LpEditable.vue +293 -0
  488. package/src/components/LpFileTree.vue +5 -1
  489. package/src/components/LpFileTreeNode.vue +25 -50
  490. package/src/components/LpFormField.vue +22 -3
  491. package/src/components/LpFrame.vue +200 -0
  492. package/src/components/LpGauge.vue +287 -0
  493. package/src/components/LpGlowBorder.vue +60 -0
  494. package/src/components/LpHintExample.vue +9 -32
  495. package/src/components/LpHintLayer.vue +13 -3
  496. package/src/components/LpHoverCard.vue +175 -0
  497. package/src/components/LpIdenticon.vue +69 -0
  498. package/src/components/LpImageEditor.vue +15 -18
  499. package/src/components/LpInfraNode.vue +27 -16
  500. package/src/components/LpInput.vue +30 -16
  501. package/src/components/LpLightbox.vue +44 -23
  502. package/src/components/LpLoader.vue +145 -0
  503. package/src/components/LpLogViewer.vue +311 -82
  504. package/src/components/LpMagnetic.vue +97 -0
  505. package/src/components/LpMapPicker.vue +26 -28
  506. package/src/components/LpMasonry.vue +247 -0
  507. package/src/components/LpModal.vue +10 -1
  508. package/src/components/LpNotificationBell.vue +33 -49
  509. package/src/components/LpNumberField.vue +79 -14
  510. package/src/components/LpNumberFlow.vue +10 -35
  511. package/src/components/LpOtpInput.vue +7 -2
  512. package/src/components/LpPagination.vue +38 -4
  513. package/src/components/LpPalettePreview.vue +2 -7
  514. package/src/components/LpPasswordInput.vue +16 -14
  515. package/src/components/LpPhoneInput.vue +12 -3
  516. package/src/components/LpPie.vue +197 -36
  517. package/src/components/LpPipeline.vue +366 -0
  518. package/src/components/LpPopover.vue +10 -1
  519. package/src/components/LpProgress.vue +22 -84
  520. package/src/components/LpQuota.vue +197 -0
  521. package/src/components/LpRangeSlider.vue +5 -1
  522. package/src/components/LpRelativeTime.vue +90 -0
  523. package/src/components/LpRepeater.vue +80 -0
  524. package/src/components/LpRevealOnScroll.vue +125 -0
  525. package/src/components/LpScramble.vue +107 -0
  526. package/src/components/LpSecretField.vue +313 -0
  527. package/src/components/LpSegmented.vue +3 -10
  528. package/src/components/LpSelect.vue +78 -64
  529. package/src/components/LpShaderBackdrop.vue +434 -0
  530. package/src/components/LpShinyText.vue +139 -0
  531. package/src/components/LpSidebar.vue +2 -0
  532. package/src/components/LpSlider.vue +5 -1
  533. package/src/components/LpSparkline.vue +55 -37
  534. package/src/components/LpSpotlight.vue +51 -0
  535. package/src/components/LpStat.vue +6 -2
  536. package/src/components/LpStatus.vue +127 -0
  537. package/src/components/LpStepMark.vue +138 -0
  538. package/src/components/LpStepper.vue +37 -43
  539. package/src/components/LpSwap.vue +2 -2
  540. package/src/components/LpSwitch.vue +15 -22
  541. package/src/components/LpTable.vue +47 -63
  542. package/src/components/LpTableFilter.vue +1 -0
  543. package/src/components/LpTableOfContents.vue +53 -29
  544. package/src/components/LpTabs.vue +10 -21
  545. package/src/components/LpTagsInput.vue +53 -37
  546. package/src/components/LpTextReveal.vue +236 -0
  547. package/src/components/LpTextarea.vue +11 -11
  548. package/src/components/LpThemeStudio.vue +216 -0
  549. package/src/components/LpThemeStudioSection.vue +16 -0
  550. package/src/components/LpThemeSwitcher.vue +156 -47
  551. package/src/components/LpTimeField.vue +9 -1
  552. package/src/components/LpToaster.vue +63 -83
  553. package/src/components/LpTooltip.vue +10 -1
  554. package/src/components/LpTour.vue +24 -13
  555. package/src/components/LpTruncate.vue +135 -0
  556. package/src/components/LpTypewriter.vue +236 -0
  557. package/src/components/LpUptimeBar.vue +6 -5
  558. package/src/components/LpVideoBackdrop.vue +15 -13
  559. package/src/components/OptionContent.vue +17 -0
  560. package/src/components/PickerField.vue +58 -0
  561. package/src/components/RevealToggle.vue +51 -0
  562. package/src/components/StepConnector.vue +54 -0
  563. package/src/components/TourCard.vue +29 -16
  564. package/src/components/badge.ts +8 -0
  565. package/src/components/chart.ts +8 -23
  566. package/src/components/dateRange.ts +25 -0
  567. package/src/components/dock.ts +31 -0
  568. package/src/components/dropdown.ts +15 -3
  569. package/src/components/fieldText.ts +95 -0
  570. package/src/components/fileTree.ts +19 -21
  571. package/src/components/format.ts +136 -0
  572. package/src/components/identicon.ts +160 -0
  573. package/src/components/masonry.ts +73 -0
  574. package/src/components/meter.ts +122 -0
  575. package/src/components/otp.ts +14 -3
  576. package/src/components/pipeline.ts +101 -0
  577. package/src/components/quota.ts +111 -0
  578. package/src/components/relativeTime.ts +118 -0
  579. package/src/components/reveal.ts +56 -0
  580. package/src/components/scramble.ts +138 -0
  581. package/src/components/shaderBackdrop.ts +208 -0
  582. package/src/components/slider.ts +30 -0
  583. package/src/components/slotText.ts +13 -0
  584. package/src/components/status.ts +46 -0
  585. package/src/components/tableFacets.ts +25 -0
  586. package/src/components/textSplit.ts +55 -0
  587. package/src/components/timeSpan.ts +183 -0
  588. package/src/components/tone.ts +144 -0
  589. package/src/components/tour.ts +3 -2
  590. package/src/components/typewriter.ts +104 -0
  591. package/src/components/videoBackdrop.ts +7 -6
  592. package/src/composables/easing.ts +66 -1
  593. package/src/composables/pseudoLocale.ts +105 -0
  594. package/src/composables/scroll.ts +6 -3
  595. package/src/composables/useClipboard.ts +25 -3
  596. package/src/composables/useField.ts +12 -0
  597. package/src/composables/useForm.ts +27 -6
  598. package/src/composables/useInView.ts +61 -0
  599. package/src/composables/useLoadingGate.ts +63 -0
  600. package/src/composables/useLpConfig.ts +20 -1
  601. package/src/composables/useMediaQuery.ts +6 -2
  602. package/src/composables/useNow.ts +84 -0
  603. package/src/composables/usePersisted.ts +19 -8
  604. package/src/composables/usePillTransition.ts +21 -13
  605. package/src/composables/usePointerFrame.ts +72 -0
  606. package/src/composables/useReducedMotion.ts +22 -0
  607. package/src/composables/useRepeater.ts +44 -0
  608. package/src/composables/useResizeObserver.ts +59 -0
  609. package/src/composables/useRevealedValue.ts +84 -0
  610. package/src/composables/useScramble.ts +152 -0
  611. package/src/composables/useShift.ts +10 -16
  612. package/src/composables/useSpotlight.ts +82 -0
  613. package/src/composables/useTilt.ts +40 -23
  614. package/src/composables/useTween.ts +149 -0
  615. package/src/composables/useView.ts +93 -0
  616. package/src/index.css +1 -0
  617. package/src/index.ts +143 -1
  618. package/src/kit-icons.ts +1 -1
  619. package/src/theme/define.ts +65 -0
  620. package/src/theme/studio.ts +202 -0
  621. package/src/tokens/effects.css +151 -0
  622. package/src/tokens/tokens.css +131 -39
  623. package/src/tokens/utilities.css +81 -0
  624. package/dist/assets/LpTabs-Bk7v4bZz.css +0 -18
  625. package/dist/chunks/LpAlert-BdvxvcWE.js +0 -85
  626. package/dist/chunks/LpBadge-Fe0D1bYx.js +0 -62
  627. package/dist/chunks/LpBreadcrumbs-rzOKkLiI.js +0 -98
  628. package/dist/chunks/LpDatePicker-BMfM454Y.js +0 -243
  629. package/dist/chunks/LpDateRangePicker-CNb9X3eL.js +0 -195
  630. package/dist/chunks/LpNumberField-DO1ufKvE.js +0 -107
  631. package/dist/chunks/LpStepper-C2slwObu.js +0 -90
  632. package/dist/chunks/LpSwitch-CZy9_IoA.js +0 -132
  633. package/dist/chunks/LpThemeSwitcher-CDoziW0z.js +0 -166
  634. package/dist/chunks/TourCard-BKI7X9-r.js +0 -105
@@ -13,11 +13,11 @@ import {
13
13
  NumberFieldInput,
14
14
  NumberFieldRoot,
15
15
  } from "reka-ui"
16
- import { computed, useId } from "vue"
16
+ import { computed, useAttrs, useId } from "vue"
17
17
  import LpIcon from "./LpIcon.vue"
18
- import { useFieldControl } from "../composables/useField"
18
+ import { focusLeft, useFieldControl } from "../composables/useField"
19
19
  import { useLabels } from "../composables/useLpConfig"
20
- import { useMergedAttrs } from "../composables/useMergedClass"
20
+ import { useMergedClass } from "../composables/useMergedClass"
21
21
 
22
22
  export interface NumberFieldLabels extends Record<string, string> {
23
23
  increase: string
@@ -30,7 +30,33 @@ const props = withDefaults(defineProps<{
30
30
  modelValue?: number | null
31
31
  min?: number
32
32
  max?: number
33
+ /**
34
+ * What the steppers and arrow keys add. A typed value is snapped to the
35
+ * nearest step from `min` (or 0) when it is committed, unless `stepSnapping`
36
+ * is false: then 0.37 stays 0.37 in a field that steps by 0.5.
37
+ */
33
38
  step?: number
39
+ stepSnapping?: boolean
40
+ /**
41
+ * How the value is shown and, with it, how far it is rounded: the field
42
+ * commits the number it displays, so `{ maximumFractionDigits: 0 }` makes it
43
+ * an integer field. Intl options, read in `locale` (the document's by default).
44
+ */
45
+ formatOptions?: Intl.NumberFormatOptions
46
+ locale?: string
47
+ /** Shown and focusable, not changed: typing, the steppers, arrows and the wheel all stop. */
48
+ readonly?: boolean
49
+ /** The wheel over a focused field steps the value unless this is set. */
50
+ disableWheelChange?: boolean
51
+ invertWheelChange?: boolean
52
+ /** A step from the buttons moves focus to the input (reka's default); false keeps it on the button. */
53
+ focusOnChange?: boolean
54
+ /**
55
+ * The − and + buttons. Off, the field is a plain numeric input; arrow keys
56
+ * still step. A field narrower than 8.5rem drops them by itself: two 32 px
57
+ * buttons left a 100 px column eleven pixels for the digits.
58
+ */
59
+ steppers?: boolean
34
60
  disabled?: boolean
35
61
  // The unit the number is in ("mm", "W", "mA"). It sits inside the field
36
62
  // rather than in the label, because a grid of bare boxes labelled "Width",
@@ -41,9 +67,15 @@ const props = withDefaults(defineProps<{
41
67
  /** Control height, matching LpInput. */
42
68
  size?: "sm" | "md" | "lg"
43
69
  labels?: Partial<NumberFieldLabels>
44
- }>(), { size: "md" })
70
+ }>(), { size: "md", stepSnapping: true, steppers: true, focusOnChange: true })
45
71
 
46
- defineEmits<{ (e: "update:modelValue", value: number | null): void }>()
72
+ // The value is committed when the field loses focus or Enter is pressed, and on
73
+ // every step, not on each keystroke: "1." or "-" is not a number yet, and a
74
+ // model that followed the keys would flicker through them.
75
+ const emit = defineEmits<{
76
+ (e: "update:modelValue", value: number | null): void
77
+ (e: "blur", event: FocusEvent): void
78
+ }>()
47
79
 
48
80
  // The unit is described to the input rather than merely placed beside it: on
49
81
  // screen the two read as one field, and without this a reader announces "380"
@@ -64,15 +96,35 @@ const SIZE = {
64
96
  lg: "h-(--size-control-lg) text-sm",
65
97
  }
66
98
 
67
- const field = useFieldControl(() => ({ wrapped: false, invalid: props.invalid, disabled: props.disabled }))
99
+ const attrs = useAttrs()
100
+ const field = useFieldControl(() => ({
101
+ wrapped: false,
102
+ id: typeof attrs.id === "string" ? attrs.id : undefined,
103
+ invalid: props.invalid,
104
+ disabled: props.disabled,
105
+ }))
68
106
  const describedBy = computed(
69
107
  () => [field.value.describedBy, props.unit ? unitId : undefined].filter(Boolean).join(" ") || undefined,
70
108
  )
71
109
 
110
+ // The frame takes the consumer's class and style, and `name` goes to reka's
111
+ // hidden input, which submits the number itself rather than its formatted
112
+ // text and carries `required` for the form's own check; every other attribute
113
+ // (placeholder, name, aria-label, inputmode, listeners) belongs to the input,
114
+ // which is what a form, a reader and a test reach for.
115
+ const inputAttrs = computed(() => {
116
+ const { class: _c, style: _s, id: _i, name: _n, ...rest } = attrs
117
+ return rest
118
+ })
119
+
120
+ function onFocusOut(event: FocusEvent) {
121
+ if (focusLeft(event)) emit("blur", event)
122
+ }
123
+
72
124
  // The field is full-width with its own control frame — the two things a consumer laying out a compact numeric column needs to change.
73
- const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
125
+ const rootClass = useMergedClass(() =>
74
126
  [
75
- "flex w-full items-center rounded-control border bg-surface-soft transition-colors duration-[var(--duration-fast)] focus-within:ring-2 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-55",
127
+ "@container flex w-full items-center rounded-control border bg-surface-soft transition-colors duration-[var(--duration-fast)] focus-within:ring-2 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-55",
76
128
  SIZE[props.size],
77
129
  field.value.invalid
78
130
  ? "border-danger focus-within:border-danger focus-within:ring-danger-soft"
@@ -87,16 +139,26 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
87
139
  :min="min"
88
140
  :max="max"
89
141
  :step="step"
142
+ :step-snapping="stepSnapping"
143
+ :readonly="readonly"
144
+ :disable-wheel-change="disableWheelChange"
145
+ :invert-wheel-change="invertWheelChange"
146
+ :focus-on-change="focusOnChange"
147
+ :format-options="formatOptions"
148
+ :locale="locale"
90
149
  :disabled="field.disabled"
91
150
  :required="field.required"
92
151
  data-lp-ring-owner
93
152
  :class="rootClass"
94
- v-bind="rest"
95
- @update:model-value="(v) => $emit('update:modelValue', v ?? null)"
153
+ :style="attrs.style"
154
+ :name="typeof attrs.name === 'string' ? attrs.name : undefined"
155
+ @update:model-value="(v) => emit('update:modelValue', Number.isNaN(v) ? null : (v ?? null))"
156
+ @focusout="onFocusOut"
96
157
  >
97
158
  <NumberFieldDecrement
159
+ v-if="steppers"
98
160
  :aria-label="text.decrease"
99
- class="group grid h-full w-8 place-items-center text-muted transition-colors duration-[var(--duration-fast)] hover:text-ink disabled:opacity-40"
161
+ class="group grid h-full w-8 shrink-0 place-items-center @max-[8.5rem]:hidden text-muted transition-colors duration-[var(--duration-fast)] hover:text-ink disabled:opacity-40"
100
162
  >
101
163
  <LpIcon
102
164
  name="lucide:minus"
@@ -105,18 +167,21 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
105
167
  />
106
168
  </NumberFieldDecrement>
107
169
  <NumberFieldInput
170
+ v-bind="inputAttrs"
108
171
  :id="field.id"
109
172
  :aria-describedby="describedBy"
110
173
  :aria-invalid="field.invalid || undefined"
111
- class="min-w-0 flex-1 bg-transparent text-center text-ink outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none"
174
+ class="min-w-0 flex-1 bg-transparent text-ink outline-none placeholder:text-muted [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none"
175
+ :class="steppers ? 'text-center @max-[8.5rem]:px-3 @max-[8.5rem]:text-left' : 'px-3'"
112
176
  />
113
177
  <!-- The unit sits between the value and the increment button, so a long one
114
178
  narrows the field rather than covering the digits. Not focusable and
115
179
  not part of the value: it is read, never typed. -->
116
- <span v-if="unit" :id="unitId" class="shrink-0 pr-1 text-xs text-muted">{{ unit }}</span>
180
+ <span v-if="unit" :id="unitId" class="shrink-0 pr-1 text-xs text-muted" :class="!steppers && 'pr-3'">{{ unit }}</span>
117
181
  <NumberFieldIncrement
182
+ v-if="steppers"
118
183
  :aria-label="text.increase"
119
- class="group grid h-full w-8 place-items-center text-muted transition-colors duration-[var(--duration-fast)] hover:text-ink disabled:opacity-40"
184
+ class="group grid h-full w-8 shrink-0 place-items-center @max-[8.5rem]:hidden text-muted transition-colors duration-[var(--duration-fast)] hover:text-ink disabled:opacity-40"
120
185
  >
121
186
  <LpIcon
122
187
  name="lucide:plus"
@@ -28,7 +28,8 @@
28
28
  */
29
29
  import { computed, onBeforeUnmount, ref, watch } from "vue"
30
30
  import { easeOut, prefersReducedMotion } from "../composables/easing"
31
- import { useReveal } from "../composables/useReveal"
31
+ import { useRevealedValue } from "../composables/useRevealedValue"
32
+ import { compactNumber } from "./format"
32
33
 
33
34
  const props = withDefaults(
34
35
  defineProps<{
@@ -213,40 +214,14 @@ const travel = (to: number) => {
213
214
  * page is news, and it should roll whether or not it is in view — the reveal
214
215
  * governs the FIRST reading only.
215
216
  */
216
- const { el: revealAnchor, revealed } = useReveal({ immediate: () => !props.animateOnMount })
217
-
218
- watch(revealed, (visible) => {
219
- if (visible && props.animateOnMount) travel(props.value)
220
- }, { immediate: true })
217
+ const { el: revealAnchor, target } = useRevealedValue(() => props.value, {
218
+ animateOnMount: () => props.animateOnMount,
219
+ holdChanges: false,
220
+ })
221
221
 
222
- watch(() => props.value, travel)
222
+ watch(target, travel)
223
223
  onBeforeUnmount(stop)
224
224
 
225
- const UNITS = [
226
- { limit: 1e9, suffix: "B" },
227
- { limit: 1e6, suffix: "M" },
228
- { limit: 1e3, suffix: "k" },
229
- ] as const
230
-
231
- const scaleFor = (v: number) => {
232
- const abs = Math.abs(v)
233
- let at = UNITS.findIndex((u) => abs >= u.limit)
234
- // 999 950 at one place reads "1000.0k"; that is the next unit up.
235
- if (at > 0 && Math.abs(Number((v / UNITS[at].limit).toFixed(1))) >= 1000) at--
236
- if (at === -1 && abs >= 999.5) at = UNITS.length - 1
237
- const unit = UNITS[at]
238
- if (!unit) return { divisor: 1, suffix: "", decimals: 0 }
239
- // One decimal is what makes 1.2k readable; a value that lands exactly on the
240
- // unit (5M) keeps none, matching how these are written by hand.
241
- const scaled = v / unit.limit
242
- return {
243
- divisor: unit.limit,
244
- suffix: unit.suffix,
245
- decimals: Number.isInteger(scaled) ? 0 : 1,
246
- }
247
- }
248
-
249
-
250
225
  const formatted = computed(() => formatAt(round(displayed.value), !settled.value))
251
226
 
252
227
  // Rounded first by the caller: every branch should render the shape the
@@ -264,10 +239,10 @@ function formatAt(v: number, padded: boolean): string {
264
239
  *
265
240
  * The decimal count is what stays fixed: one place whenever a unit is in
266
241
  * play, so the row's shape only changes at a rollover, not on every frame.
242
+ * No locale here: the cells below find the fraction by its ".", and a
243
+ * locale's "," would turn the fraction's columns into integer ones.
267
244
  */
268
- const { divisor, suffix } = scaleFor(v)
269
- const places = divisor === 1 ? 0 : 1
270
- return `${(v / divisor).toFixed(places)}${suffix}`
245
+ return compactNumber(v, { plainDecimals: 0, fixed: true })
271
246
  }
272
247
  const pad = padded ? Math.max(1, padTo.value) : 1
273
248
  if (props.grouped)
@@ -42,8 +42,12 @@ const props = withDefaults(
42
42
  * compared without regard to case; pass `false` for a case-sensitive code.
43
43
  */
44
44
  uppercase?: boolean
45
- /** Draw a separator after every `group` cells (e.g. 3 for "123-456"). */
46
- group?: number
45
+ /**
46
+ * Draw a separator after every `group` cells (e.g. 3 for "123-456"), or
47
+ * after blocks of the exact sizes given (`[4, 6, 5]`), as LpCodeDisplay's
48
+ * `groups` splits the printed code.
49
+ */
50
+ group?: number | number[]
47
51
  /** Error state — tints the cells red (e.g. wrong code). */
48
52
  invalid?: boolean
49
53
  size?: "sm" | "md" | "lg"
@@ -151,6 +155,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
151
155
  :type="alphanumeric ? 'text' : 'number'"
152
156
  :mask="mask"
153
157
  :disabled="field.disabled"
158
+ :required="field.required"
154
159
  otp
155
160
  :class="rootClass"
156
161
  v-bind="rest"
@@ -18,11 +18,12 @@ export default { inheritAttrs: false }
18
18
  * motion-v's shared layoutId with zero list-animation conflicts.
19
19
  */
20
20
  import { Motion } from "motion-v"
21
- import { computed, useId } from "vue"
21
+ import { computed, ref, useId } from "vue"
22
22
  import { usePillTransition } from "../composables/usePillTransition"
23
23
  import LpIcon from "./LpIcon.vue"
24
24
  import { useMergedAttrs } from "../composables/useMergedClass"
25
25
  import { useLabels } from "../composables/useLpConfig"
26
+ import { useResizeObserver } from "../composables/useResizeObserver"
26
27
 
27
28
  const props = withDefaults(
28
29
  defineProps<{
@@ -73,10 +74,42 @@ const current = computed(() =>
73
74
  // stable as the user pages through.
74
75
  type Slot = { kind: "page"; page: number } | { kind: "gap" }
75
76
 
77
+ // The row gives up siblings, down to none, when the room it is given is too
78
+ // narrow for them: on a phone nine slots and two arrows ran past the screen.
79
+ // The room is the parent's width, not the row's own, so dropping siblings
80
+ // cannot make the row look wide enough to bring them back.
81
+ const root = ref<HTMLElement | null>(null)
82
+ const room = ref(Infinity)
83
+ const slotWidth = ref(32)
84
+ const gap = ref(6)
85
+ function measure() {
86
+ const nav = root.value
87
+ if (!nav || !nav.children.length) return
88
+ gap.value = parseFloat(getComputedStyle(nav).columnGap) || 0
89
+ const items = nav.children.length
90
+ const used = [...nav.children].reduce((sum, el) => sum + (el as HTMLElement).offsetWidth, 0)
91
+ slotWidth.value = used / items
92
+ }
93
+ useResizeObserver(
94
+ () => root.value?.parentElement,
95
+ (entry) => {
96
+ measure()
97
+ if (entry) room.value = entry.contentRect.width
98
+ },
99
+ )
100
+
101
+ const siblings = computed(() => {
102
+ for (let n = props.siblings; n > 0; n--) {
103
+ const items = Math.min(n * 2 + 1 + 4, count.value) + 2
104
+ if (items * slotWidth.value + (items - 1) * gap.value <= room.value) return n
105
+ }
106
+ return 0
107
+ })
108
+
76
109
  const slots = computed<Slot[]>(() => {
77
110
  const c = count.value
78
111
  const cur = current.value
79
- const inner = props.siblings * 2 + 1 // pages shown around (and including) current
112
+ const inner = siblings.value * 2 + 1 // pages shown around (and including) current
80
113
  // Total = first + leftGap + inner + rightGap + last. Constant for a given
81
114
  // count, so the row width never changes as you page through.
82
115
  const total = inner + 4
@@ -88,8 +121,8 @@ const slots = computed<Slot[]>(() => {
88
121
 
89
122
  // Inner window [lo..hi] of length `inner`, clamped into [3 .. c-2] so there's
90
123
  // always a slot for first(1)+page 2 on the left and page c-1+last(c) on right.
91
- let lo = cur - props.siblings
92
- let hi = cur + props.siblings
124
+ let lo = cur - siblings.value
125
+ let hi = cur + siblings.value
93
126
  if (lo < 3) {
94
127
  hi += 3 - lo
95
128
  lo = 3
@@ -137,6 +170,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
137
170
 
138
171
  <template>
139
172
  <nav
173
+ ref="root"
140
174
  :class="rootClass"
141
175
  v-bind="rest" :aria-label="text.nav">
142
176
  <button
@@ -49,7 +49,8 @@ withDefaults(
49
49
  }
50
50
  .lp-palette-preview > * {
51
51
  min-width: 0;
52
- animation: lp-palette-in 260ms var(--ease-emphasized, ease-out) both;
52
+ --rise: 4px;
53
+ animation: rise-in 260ms var(--ease-emphasized, ease-out) both;
53
54
  }
54
55
  .lp-palette-preview > :nth-child(2) {
55
56
  animation-delay: 40ms;
@@ -63,12 +64,6 @@ withDefaults(
63
64
  .lp-palette-preview > :nth-child(n + 5) {
64
65
  animation-delay: 160ms;
65
66
  }
66
- @keyframes lp-palette-in {
67
- from {
68
- opacity: 0;
69
- transform: translateY(4px);
70
- }
71
- }
72
67
  @media (prefers-reduced-motion: reduce) {
73
68
  .lp-palette-preview > * {
74
69
  animation: none;
@@ -10,10 +10,12 @@ export interface PasswordInputLabels extends Record<string, string> {
10
10
  <script setup lang="ts">
11
11
  // Password field = LpInput + a show/hide toggle in its trailing slot.
12
12
  // No duplicated field styling — the shell lives in LpInput.
13
+ // LpSecretField's input form is this same field: it drives `visible` (to hide
14
+ // again on a timer) and puts its copy button in `actions`.
13
15
  import { ref } from "vue"
14
16
  import { useLabels } from "../composables/useLpConfig"
15
- import LpIcon from "./LpIcon.vue"
16
17
  import LpInput from "./LpInput.vue"
18
+ import RevealToggle from "./RevealToggle.vue"
17
19
 
18
20
  const props = defineProps<{
19
21
  modelValue?: string
@@ -31,13 +33,14 @@ const props = defineProps<{
31
33
  labels?: Partial<PasswordInputLabels>
32
34
  }>()
33
35
  defineEmits<{ (e: "update:modelValue", value: string): void }>()
36
+ /** Whether the text shows; bind it to reveal or hide from outside. */
37
+ const visible = defineModel<boolean>("visible", { default: false })
34
38
 
35
39
  const text = useLabels<PasswordInputLabels>(
36
40
  "passwordInput",
37
41
  { show: "Show password", hide: "Hide password" },
38
42
  () => props.labels,
39
43
  )
40
- const visible = ref(false)
41
44
  const inner = ref<InstanceType<typeof LpInput> | null>(null)
42
45
  defineExpose({
43
46
  focus: (options?: FocusOptions) => inner.value?.focus(options),
@@ -64,18 +67,17 @@ defineExpose({
64
67
  >
65
68
  <template v-if="$slots.leading" #leading><slot name="leading" /></template>
66
69
  <template #trailing>
67
- <button
68
- type="button"
69
- class="group rounded-inner p-1 text-muted outline-none transition-colors duration-[var(--duration-fast)] hover:text-ink focus-visible:text-ink"
70
- :aria-label="visible ? text.hide : text.show"
71
- @click="visible = !visible"
72
- >
73
- <LpIcon
74
- :name="visible ? 'lucide:eye-off' : 'lucide:eye'"
75
- :size="size === 'sm' ? 14 : 16"
76
- class="transition-transform duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] group-active:scale-90 motion-reduce:group-active:scale-100"
77
- />
78
- </button>
70
+ <slot name="actions" />
71
+ <!-- Sized to the icon with a hair of padding, as the field's other
72
+ trailing controls are, rather than to a full square button. -->
73
+ <RevealToggle
74
+ v-model="visible"
75
+ :icon-size="size === 'sm' ? 14 : 16"
76
+ :show-label="text.show"
77
+ :hide-label="text.hide"
78
+ :disabled="disabled"
79
+ class="size-auto rounded-inner p-1 hover:bg-transparent"
80
+ />
79
81
  </template>
80
82
  </LpInput>
81
83
  </template>
@@ -53,7 +53,7 @@ import { useFieldNotice, type FieldNoticeOptions } from "../composables/useField
53
53
  import { useInputFilter } from "../composables/useInputFilter"
54
54
  import { useLabels } from "../composables/useLpConfig"
55
55
  import { type Country, filterCountries, flagEmoji, loadCountries, matchCountryByValue } from "./countries"
56
- import { OPTION_ITEM, POPOVER_PANEL } from "./dropdown"
56
+ import { OPTION_ITEM, optionStagger, POPOVER_PANEL } from "./dropdown"
57
57
  import LpFieldNotice from "./LpFieldNotice.vue"
58
58
  import LpIcon from "./LpIcon.vue"
59
59
  import {
@@ -66,6 +66,7 @@ import {
66
66
  type PhoneLib,
67
67
  } from "./phone"
68
68
  import { useMergedAttrs } from "../composables/useMergedClass"
69
+ import { useOutsideGuard, usePortalTarget } from "../composables/useView"
69
70
 
70
71
  export interface PhoneDetail {
71
72
  /** Matched country, or undefined when the prefix matches none. */
@@ -359,6 +360,12 @@ const inputAttrs = computed(() => {
359
360
  const { style: _s, ...others } = rest.value
360
361
  return others
361
362
  })
363
+
364
+ // Overlays open in the window this component renders in (an LpFrame's, inside one).
365
+ const portalTo = usePortalTarget()
366
+ // What happens in another document (the page around a frame, or a frame in
367
+ // the page) is not "outside" for this layer.
368
+ const guardOutside = useOutsideGuard()
362
369
  </script>
363
370
 
364
371
  <template>
@@ -395,8 +402,10 @@ const inputAttrs = computed(() => {
395
402
  </ComboboxTrigger>
396
403
  </ComboboxAnchor>
397
404
 
398
- <ComboboxPortal>
405
+ <ComboboxPortal :to="portalTo">
399
406
  <ComboboxContent
407
+ @interact-outside="guardOutside"
408
+ @escape-key-down="guardOutside"
400
409
  :collision-padding="8"
401
410
  position="popper"
402
411
  align="start"
@@ -427,7 +436,7 @@ const inputAttrs = computed(() => {
427
436
  v-for="(c, i) in filtered"
428
437
  :key="c.iso2"
429
438
  :value="c.iso2"
430
- :style="{ animationDelay: `${Math.min(i, 12) * 22}ms` }"
439
+ :style="optionStagger(i)"
431
440
  :class="[OPTION_ITEM, 'gap-2.5']"
432
441
  @select.prevent="chooseCountry(c)"
433
442
  >