@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
@@ -1,5 +1,7 @@
1
- import { useReducedMotion } from "motion-v"
2
1
  import { computed, ref, toValue, type ComputedRef, type CSSProperties, type MaybeRefOrGetter, type Ref } from "vue"
2
+ import { usePointerFrame } from "./usePointerFrame"
3
+ import { usePrefersReducedMotion } from "./useReducedMotion"
4
+ import { spotlightPoint } from "./useSpotlight"
3
5
 
4
6
  /*
5
7
  * useTilt — pointer-reactive 3D tilt for a "tactile" surface (a card, a tile, a
@@ -8,9 +10,14 @@ import { computed, ref, toValue, type ComputedRef, type CSSProperties, type Mayb
8
10
  *
9
11
  * Bind the returned handlers to the element and the returned `style` to it (it
10
12
  * needs a shared `perspective` on an ANCESTOR — see LpTilt, which supplies one).
11
- * Rotation eases to rest via CSS transition; the handlers only write the target
12
- * transform, so there's no rAF loop. SSR-safe (no window access at setup) and
13
- * collapses to a flat, no-tilt style when the OS prefers reduced motion.
13
+ * Rotation eases to rest via CSS transition. The pointer is not reactive
14
+ * state: once per animation frame (usePointerFrame, shared with LpMagnetic and
15
+ * the spotlight) its position is written to custom properties on the element,
16
+ * `--lp-tilt-x`/`--lp-tilt-y` from -1 to 1 for the lean and the spotlight's own
17
+ * `--lp-spot-x`/`--lp-spot-y` for the glare, and the style reads them. It
18
+ * re-renders on enter and leave, not on every move. SSR-safe (no window access
19
+ * at setup) and collapses to a flat, no-tilt style when the OS prefers reduced
20
+ * motion.
14
21
  */
15
22
  export interface UseTiltOptions {
16
23
  /** Max rotation toward the pointer, in degrees (per axis). Default 10. */
@@ -35,22 +42,33 @@ export interface UseTilt {
35
42
  active: Ref<boolean>
36
43
  }
37
44
 
45
+ const TILT_VARS = ["--lp-tilt-x", "--lp-tilt-y", "--lp-spot-x", "--lp-spot-y"]
46
+
38
47
  export function useTilt(source: MaybeRefOrGetter<UseTiltOptions> = {}): UseTilt {
39
48
  const options = computed(() => toValue(source))
40
- const reduceMotion = useReducedMotion()
49
+ const reduceMotion = usePrefersReducedMotion()
41
50
 
42
51
  const active = ref(false)
43
- // Pointer position within the element, normalized to [-1, 1] from center.
44
- const nx = ref(0)
45
- const ny = ref(0)
52
+ // The element the handlers are bound to, learnt from the events themselves.
53
+ let target: HTMLElement | null = null
54
+
55
+ const pointer = usePointerFrame({
56
+ anyPointer: true,
57
+ paint: (x, y) => {
58
+ if (!target || !active.value) return
59
+ const r = target.getBoundingClientRect()
60
+ // Pointer position within the element, normalized to [-1, 1] from center.
61
+ target.style.setProperty("--lp-tilt-x", (((x - r.left) / r.width) * 2 - 1).toFixed(3))
62
+ target.style.setProperty("--lp-tilt-y", (((y - r.top) / r.height) * 2 - 1).toFixed(3))
63
+ const spot = spotlightPoint(r, x, y)
64
+ target.style.setProperty("--lp-spot-x", spot.x)
65
+ target.style.setProperty("--lp-spot-y", spot.y)
66
+ },
67
+ })
46
68
 
47
69
  function onPointerMove(e: PointerEvent): void {
48
- if (reduceMotion.value) return
49
- const el = e.currentTarget as HTMLElement | null
50
- if (!el) return
51
- const r = el.getBoundingClientRect()
52
- nx.value = ((e.clientX - r.left) / r.width) * 2 - 1
53
- ny.value = ((e.clientY - r.top) / r.height) * 2 - 1
70
+ if (e.currentTarget instanceof HTMLElement) target = e.currentTarget
71
+ pointer.move(e)
54
72
  }
55
73
 
56
74
  function onPointerEnter(): void {
@@ -59,8 +77,8 @@ export function useTilt(source: MaybeRefOrGetter<UseTiltOptions> = {}): UseTilt
59
77
 
60
78
  function onPointerLeave(): void {
61
79
  active.value = false
62
- nx.value = 0
63
- ny.value = 0
80
+ pointer.cancel()
81
+ for (const name of TILT_VARS) target?.style.removeProperty(name)
64
82
  }
65
83
 
66
84
  const style = computed<CSSProperties>(() => {
@@ -71,12 +89,12 @@ export function useTilt(source: MaybeRefOrGetter<UseTiltOptions> = {}): UseTilt
71
89
  // horizontal one. Only tilt while active so it rests flat when the pointer
72
90
  // leaves (nx/ny are already zeroed on leave).
73
91
  const { max = 10, lift = 8, scale = 1.03 } = options.value
74
- const rx = active.value ? -ny.value * max : 0
75
- const ry = active.value ? nx.value * max : 0
92
+ const rx = active.value ? `calc(var(--lp-tilt-y, 0) * ${-max}deg)` : "0deg"
93
+ const ry = active.value ? `calc(var(--lp-tilt-x, 0) * ${max}deg)` : "0deg"
76
94
  const z = active.value ? lift : 0
77
95
  const s = active.value ? scale : 1
78
96
  return {
79
- transform: `translate3d(0, ${-z}px, 0) rotateX(${rx}deg) rotateY(${ry}deg) scale(${s})`,
97
+ transform: `translate3d(0, ${-z}px, 0) rotateX(${rx}) rotateY(${ry}) scale(${s})`,
80
98
  transformStyle: "preserve-3d",
81
99
  transition: active.value
82
100
  ? "transform 0.12s ease-out"
@@ -88,12 +106,11 @@ export function useTilt(source: MaybeRefOrGetter<UseTiltOptions> = {}): UseTilt
88
106
  if (!options.value.glare || reduceMotion.value || !active.value) {
89
107
  return { opacity: 0 }
90
108
  }
91
- // Bright spot tracks the pointer; map [-1,1] → [0%,100%].
92
- const px = (nx.value + 1) * 50
93
- const py = (ny.value + 1) * 50
109
+ // Bright spot tracks the pointer, at the spotlight's own position
110
+ // properties, which the tilting element carries and the glare inherits.
94
111
  return {
95
112
  opacity: 1,
96
- background: `radial-gradient(circle at ${px}% ${py}%, rgba(255,255,255,0.35), transparent 55%)`,
113
+ background: "radial-gradient(circle at var(--lp-spot-x, 50%) var(--lp-spot-y, 50%), rgba(255,255,255,0.35), transparent 55%)",
97
114
  transition: "opacity 0.2s ease",
98
115
  }
99
116
  })
@@ -0,0 +1,149 @@
1
+ import { onScopeDispose, shallowRef, toValue, watch, type MaybeRefOrGetter, type ShallowRef } from "vue"
2
+ import { durationToken, prefersReducedMotion, tokenEase } from "./easing"
3
+
4
+ /*
5
+ * A value that travels to its new state instead of jumping there.
6
+ *
7
+ * Charts draw from data, and data changes wholesale: a poll returns new numbers,
8
+ * a filter drops a category. Rendering straight from it redraws the shape on
9
+ * the next frame, and the reader sees a different picture rather than the same
10
+ * picture changing — which is the one thing a chart refreshing in place has to
11
+ * convey. No browser interpolates a path's `d` between two arbitrary shapes, so
12
+ * the DATA is what moves: this holds a displayed copy and steps it toward the
13
+ * source every frame, and the component draws from the copy.
14
+ *
15
+ * The caller supplies the mix, because only it knows what "halfway" means for
16
+ * its data — a pie matches slices by label and lets new ones open from nothing,
17
+ * a line resamples to a new point count. The mix is handed whatever is
18
+ * DISPLAYED as its starting point, not the previous target, so a change that
19
+ * lands mid-flight carries on from where the shape actually is instead of
20
+ * snapping back to restart.
21
+ *
22
+ * The first value is shown as is: arrival belongs to the component's own
23
+ * entrance (useReveal), and this only animates what comes after it.
24
+ */
25
+
26
+ export interface TweenOptions<T> {
27
+ /** Travel time in ms. Defaults to `--duration-medium`, read when a tween starts. */
28
+ duration?: MaybeRefOrGetter<number | undefined>
29
+ /** Defaults to the curve of `--ease-emphasized`. */
30
+ ease?: (t: number) => number
31
+ /**
32
+ * False makes a change land at once. Read at the moment of the change, so a
33
+ * component can jump while its content is hidden or not yet revealed and
34
+ * tween once it is on screen.
35
+ */
36
+ enabled?: MaybeRefOrGetter<boolean | undefined>
37
+ /**
38
+ * Same content, new object: skip. A source rebuilt by a computed on every
39
+ * unrelated change would otherwise spend a whole duration of frames tweening
40
+ * a value into itself.
41
+ */
42
+ equal?: (a: T, b: T) => boolean
43
+ }
44
+
45
+ export function useTween<T>(
46
+ source: () => T,
47
+ mix: (from: T, to: T, t: number) => T,
48
+ options: TweenOptions<T> = {},
49
+ ): Readonly<ShallowRef<T>> {
50
+ const shown = shallowRef(source())
51
+ let target = shown.value
52
+ let frame = 0
53
+
54
+ const stop = () => {
55
+ if (frame) cancelAnimationFrame(frame)
56
+ frame = 0
57
+ }
58
+
59
+ watch(source, (to) => {
60
+ if (options.equal?.(target, to)) return
61
+ target = to
62
+ const ms = toValue(options.duration) ?? durationToken("duration-medium")
63
+ if (
64
+ toValue(options.enabled) === false ||
65
+ ms <= 0 ||
66
+ prefersReducedMotion() ||
67
+ typeof requestAnimationFrame === "undefined"
68
+ ) {
69
+ stop()
70
+ shown.value = to
71
+ return
72
+ }
73
+
74
+ const from = shown.value
75
+ const ease = options.ease ?? tokenEase("ease-emphasized")
76
+ const started = performance.now()
77
+ stop()
78
+ const step = (now: number) => {
79
+ // rAF stamps the frame's start, which can precede the watcher by a few ms.
80
+ const t = Math.min(1, Math.max(0, (now - started) / ms))
81
+ // The last frame is the target itself, not a mix that rounds near it, so
82
+ // whatever the mix carried for the journey (ghosts, resampled points)
83
+ // is gone once it lands.
84
+ shown.value = t < 1 ? mix(from, to, ease(t)) : to
85
+ frame = t < 1 ? requestAnimationFrame(step) : 0
86
+ }
87
+ frame = requestAnimationFrame(step)
88
+ })
89
+
90
+ onScopeDispose(stop)
91
+
92
+ return shown
93
+ }
94
+
95
+ export const lerp = (a: number, b: number, t: number): number => a + (b - a) * t
96
+
97
+ /**
98
+ * A colour between two, as CSS — any two, `var()` tokens included, since the
99
+ * browser resolves both ends. Mixed in oklab so a hue change passes through
100
+ * believable colours instead of the grey a straight RGB blend dips into.
101
+ */
102
+ export const mixColor = (from: string, to: string, t: number): string => {
103
+ if (from === to || t >= 1) return to
104
+ if (t <= 0) return from
105
+ return `color-mix(in oklab, ${from}, ${to} ${(t * 100).toFixed(1)}%)`
106
+ }
107
+
108
+ /**
109
+ * A series stretched or squeezed to `count` points along its own length.
110
+ *
111
+ * Morphing needs a point for every point: a line going from 12 readings to 30
112
+ * has nothing to move its 13th to 30th points FROM. Reading the old line at the
113
+ * new points' relative positions gives them a start on the shape as it was, so
114
+ * the morph changes heights rather than also redrawing the curve's outline.
115
+ * A position next to a gap takes the nearer reading, and is a gap only when
116
+ * both neighbours are.
117
+ */
118
+ export const resample = (values: (number | null)[], count: number): (number | null)[] => {
119
+ const n = values.length
120
+ if (n === count) return values
121
+ if (!n) return new Array<number | null>(count).fill(null)
122
+ return Array.from({ length: count }, (_, i) => {
123
+ const pos = count <= 1 ? 0 : (i * (n - 1)) / (count - 1)
124
+ const lo = Math.floor(pos)
125
+ const hi = Math.min(n - 1, lo + 1)
126
+ const a = values[lo]
127
+ const b = values[hi]
128
+ const f = pos - lo
129
+ if (a == null) return f >= 0.5 ? b : null
130
+ if (b == null) return f < 0.5 ? a : null
131
+ return lerp(a, b, f)
132
+ })
133
+ }
134
+
135
+ /**
136
+ * One series of readings partway to another. A point that is a gap at either
137
+ * end takes the target's value: there is no height to travel from or to.
138
+ */
139
+ export const mixValues = (
140
+ from: (number | null)[],
141
+ to: (number | null)[],
142
+ t: number,
143
+ ): (number | null)[] => {
144
+ const start = resample(from, to.length)
145
+ return to.map((v, i) => {
146
+ const a = start[i]
147
+ return v == null || a == null ? v : lerp(a, v, t)
148
+ })
149
+ }
@@ -0,0 +1,93 @@
1
+ import { computed, inject, provide, type ComputedRef, type InjectionKey } from "vue"
2
+
3
+ /*
4
+ * Which window a component lives in. Almost always the page's own, but inside
5
+ * an LpFrame it is the frame's: a document of its own with its own width, so
6
+ * a breakpoint, an overlay and a click outside are all measured there.
7
+ * Everything in the kit that reaches for the screen (media queries, portals,
8
+ * the viewport size, page-wide listeners) asks here instead of the globals,
9
+ * and so stays inside the frame it was rendered in.
10
+ */
11
+ export interface LpView {
12
+ window: Window
13
+ document: Document
14
+ /** Where overlays teleport to: the frame's body. */
15
+ portal: HTMLElement
16
+ }
17
+
18
+ const LP_VIEW: InjectionKey<ComputedRef<LpView | null>> = Symbol.for("lp-view")
19
+
20
+ export function provideView(view: ComputedRef<LpView | null>): void {
21
+ provide(LP_VIEW, view)
22
+ }
23
+
24
+ /** The view the calling component renders in; the page itself outside any frame. */
25
+ export function useView(): ComputedRef<LpView | null> {
26
+ return inject(
27
+ LP_VIEW,
28
+ computed(() => null),
29
+ )
30
+ }
31
+
32
+ /** The window to measure and listen on: the frame's inside one, the page's otherwise. */
33
+ export function viewWindow(view: LpView | null | undefined): Window {
34
+ return view?.window ?? window
35
+ }
36
+
37
+ export function viewDocument(view: LpView | null | undefined): Document {
38
+ return view?.document ?? document
39
+ }
40
+
41
+ /** The `to` of a portal: the frame's body inside one, `body` otherwise. */
42
+ export function usePortalTarget(): ComputedRef<HTMLElement | "body"> {
43
+ const view = useView()
44
+ return computed(() => view.value?.portal ?? "body")
45
+ }
46
+
47
+ /*
48
+ * reka's layers listen for "outside" presses, focus and Escape on the
49
+ * document that was current when they were set up, which inside an LpFrame
50
+ * is still the page's: a click on the page closed a menu open in the frame,
51
+ * while a click or Escape inside the frame never reached the layer at all.
52
+ * The frame forwards those events from its document to the page's, marked
53
+ * with where they came from, and every kit layer drops the ones from a
54
+ * document other than its own (useOutsideGuard).
55
+ */
56
+ const ORIGIN = "lpViewDocument"
57
+ type Marked = Event & { [ORIGIN]?: Document }
58
+
59
+ const FORWARDED = ["pointerdown", "pointerup", "click", "focusin", "keydown"] as const
60
+
61
+ export function forwardViewEvents(from: Document, to: Document): () => void {
62
+ const forward = (event: Event) => {
63
+ if (event.type === "keydown" && (event as KeyboardEvent).key !== "Escape") return
64
+ const Copy = event.constructor as new (type: string, init: Event) => Event
65
+ const copy = new Copy(event.type, event) as Marked
66
+ copy[ORIGIN] = from
67
+ to.dispatchEvent(copy)
68
+ }
69
+ for (const type of FORWARDED) from.addEventListener(type, forward)
70
+ return () => {
71
+ for (const type of FORWARDED) from.removeEventListener(type, forward)
72
+ }
73
+ }
74
+
75
+ function originOf(event: Event): Document | null {
76
+ const detail = (event as CustomEvent<{ originalEvent?: Event }>).detail
77
+ const inner = detail && typeof detail === "object" && detail.originalEvent ? detail.originalEvent : event
78
+ const marked = (inner as Marked)[ORIGIN]
79
+ if (marked) return marked
80
+ const target = inner.target as Node | null
81
+ // Not `instanceof`: a node of the frame is another realm's Node.
82
+ if (!target || typeof target.nodeType !== "number") return null
83
+ return target.nodeType === 9 ? (target as Document) : target.ownerDocument
84
+ }
85
+
86
+ /** A layer's outside and Escape handler: ignores what happened in another document. */
87
+ export function useOutsideGuard(): (event: Event) => void {
88
+ const view = useView()
89
+ return (event) => {
90
+ const origin = originOf(event)
91
+ if (origin && origin !== viewDocument(view.value)) event.preventDefault()
92
+ }
93
+ }
package/src/index.css CHANGED
@@ -14,6 +14,7 @@
14
14
  */
15
15
  @import "./tokens/tokens.css";
16
16
  @import "./tokens/utilities.css";
17
+ @import "./tokens/effects.css";
17
18
 
18
19
  @source "./components";
19
20
  @source "./composables";
package/src/index.ts CHANGED
@@ -307,7 +307,9 @@ export {
307
307
  export type { RevealOrigin } from "./theme/useTheme"
308
308
  export { detectBackdropFilter, GLASS_BACKDROP_ATTR, isBrokenBackdropEngine, NO_BACKDROP_ATTR, setGlassBackdrop } from "./theme/backdrop"
309
309
  export { DEFAULT_SURFACE } from "./theme/tokens"
310
- export { defineTheme } from "./theme/define"
310
+ export { defineTheme, withBrand } from "./theme/define"
311
+ export { STUDIO_BRANDS, STUDIO_CORNERS, STUDIO_MOTION, STUDIO_SIZES, useThemeStudio } from "./theme/studio"
312
+ export type { StudioState, ThemeStudio, ThemeStudioOptions } from "./theme/studio"
311
313
  export type { ThemeOverrides } from "./theme/define"
312
314
  export type {
313
315
  ColorTokens,
@@ -368,12 +370,20 @@ export type { FieldContext, FieldControlState } from "./composables/useField"
368
370
  export type { UseInputFilterOptions } from "./composables/useInputFilter"
369
371
  export { easeOut, easeTravel, easingToken, prefersReducedMotion } from "./composables/easing"
370
372
  export { useReveal } from "./composables/useReveal"
373
+ export { useRevealedValue } from "./composables/useRevealedValue"
371
374
  export { hints, vHint } from "./composables/useHints"
372
375
  export type { HintEvent } from "./composables/useHints"
373
376
  export { scrollParent, scrollToElement } from "./composables/scroll"
374
377
  export type { ScrollParentOptions, ScrollToElementOptions } from "./composables/scroll"
375
378
  export { useMediaQuery } from "./composables/useMediaQuery"
379
+ export { usePrefersReducedMotion } from "./composables/useReducedMotion"
380
+ export { useResizeObserver } from "./composables/useResizeObserver"
381
+ export type { UseResizeObserverOptions } from "./composables/useResizeObserver"
382
+ export { usePointerFrame } from "./composables/usePointerFrame"
383
+ export type { PointerFrame, PointerFrameOptions } from "./composables/usePointerFrame"
384
+ export { usePortalTarget, useView, viewDocument, viewWindow, type LpView } from "./composables/useView"
376
385
  export type { UseReveal, UseRevealOptions } from "./composables/useReveal"
386
+ export type { UseRevealedValue, UseRevealedValueOptions } from "./composables/useRevealedValue"
377
387
  export { useAsyncTask } from "./composables/useAsyncTask"
378
388
  export { useRovingFocus } from "./composables/useRovingFocus"
379
389
  export type { RovingItem, UseRovingFocusOptions } from "./composables/useRovingFocus"
@@ -411,5 +421,137 @@ export type { SystemThemes, UseTheme } from "./theme/useTheme"
411
421
  export { layoutController } from "./layout/useLayout"
412
422
  export type { LayoutController } from "./layout/useLayout"
413
423
  export { default as LpThemeProvider } from "./components/LpThemeProvider.vue"
424
+ export { default as LpFrame } from "./components/LpFrame.vue"
425
+ export { default as LpThemeStudio } from "./components/LpThemeStudio.vue"
426
+ export type { ThemeStudioLabels, ThemeStudioPart } from "./components/LpThemeStudio.vue"
427
+ export { default as LpThemeStudioSection } from "./components/LpThemeStudioSection.vue"
414
428
  export { isInternalHref, resolveLink } from "./components/link"
415
429
  export type { LinkTarget, ResolvedLink } from "./components/link"
430
+
431
+ export { default as LpRepeater } from "./components/LpRepeater.vue"
432
+ export type { RepeaterItemKey } from "./composables/useRepeater"
433
+
434
+ // ── Status and data (group: status) ──
435
+ export { default as LpGauge } from "./components/LpGauge.vue"
436
+ export type { GaugeLabels } from "./components/LpGauge.vue"
437
+ export { default as LpQuota } from "./components/LpQuota.vue"
438
+ export type { QuotaLabels } from "./components/LpQuota.vue"
439
+ export { default as LpStatus } from "./components/LpStatus.vue"
440
+ export { default as LpRelativeTime } from "./components/LpRelativeTime.vue"
441
+ export { default as LpActivityLine } from "./components/LpActivityLine.vue"
442
+ export {
443
+ arcPath,
444
+ capacityThresholds,
445
+ meterFraction,
446
+ toneAt,
447
+ TONE_COLOR,
448
+ TONE_SOFT,
449
+ } from "./components/meter"
450
+ export type { MeterThreshold, MeterTone } from "./components/meter"
451
+ export { TONE_ALIASES, TONES, toneLook, toneOf } from "./components/tone"
452
+ export type { Tone, ToneLook, ToneName } from "./components/tone"
453
+ export { formatAmount, quotaSegments, quotaState } from "./components/quota"
454
+ export type { QuotaPart, QuotaSegment, QuotaState, QuotaUnit } from "./components/quota"
455
+ export { compactNumber, formatBytes } from "./components/format"
456
+ export type { CompactNumberOptions, FormatBytesOptions } from "./components/format"
457
+ export { STATUS_LABELS, STATUS_LOOK } from "./components/status"
458
+ export type { StatusKind, StatusLook } from "./components/status"
459
+ export { formatRelativeTime } from "./components/relativeTime"
460
+ export type { RelativeTime, RelativeTimeOptions, RelativeUnit } from "./components/relativeTime"
461
+
462
+ // ── Processes (group: process) ──
463
+ export { default as LpPipeline } from "./components/LpPipeline.vue"
464
+ export type { PipelineLabels } from "./components/LpPipeline.vue"
465
+ export { default as LpStepMark } from "./components/LpStepMark.vue"
466
+ export type { StepMarkStatus } from "./components/LpStepMark.vue"
467
+ export {
468
+ childProgress,
469
+ connectorFilled,
470
+ currentStepIndex,
471
+ isSettled,
472
+ overallStatus,
473
+ stepElapsed,
474
+ } from "./components/pipeline"
475
+ export type { PipelineStep, StepStatus } from "./components/pipeline"
476
+ export { default as LpLoader } from "./components/LpLoader.vue"
477
+ export type { LoaderLabels, LoaderSize, LoaderTone, LoaderVariant } from "./components/LpLoader.vue"
478
+ export { useLoadingGate } from "./composables/useLoadingGate"
479
+ export type { LoadingGateOptions } from "./composables/useLoadingGate"
480
+ export { useNow } from "./composables/useNow"
481
+ export type { UseNowOptions } from "./composables/useNow"
482
+ export { default as LpCountdown } from "./components/LpCountdown.vue"
483
+ export type { CountdownLabels } from "./components/LpCountdown.vue"
484
+ export {
485
+ ceilToSecond,
486
+ crossedMilestone,
487
+ DEFAULT_MILESTONES,
488
+ DEFAULT_UNIT_LABELS,
489
+ formatElapsed,
490
+ formatTime,
491
+ msToNextSecond,
492
+ splitTime,
493
+ timeParts,
494
+ } from "./components/timeSpan"
495
+ export type { TimeFormat, TimePart, TimeSplit, TimeUnit, TimeUnitLabels } from "./components/timeSpan"
496
+
497
+ // ── Fields and text (group: fields) ──
498
+ export { default as LpCopyButton } from "./components/LpCopyButton.vue"
499
+ export type { CopyButtonLabels, CopyValue } from "./components/LpCopyButton.vue"
500
+ export { default as LpSecretField } from "./components/LpSecretField.vue"
501
+ export type { SecretFieldLabels } from "./components/LpSecretField.vue"
502
+ export { default as LpDataList } from "./components/LpDataList.vue"
503
+ export type { DataListItem, DataListLabels } from "./components/LpDataList.vue"
504
+ export { default as LpEditable } from "./components/LpEditable.vue"
505
+ export type { EditableLabels } from "./components/LpEditable.vue"
506
+ export { default as LpTruncate } from "./components/LpTruncate.vue"
507
+ export { default as LpCodeDisplay } from "./components/LpCodeDisplay.vue"
508
+ export type { CodeDisplayLabels } from "./components/LpCodeDisplay.vue"
509
+ export { formatRemaining, groupCode, middleTruncate, normalizeCode } from "./components/fieldText"
510
+
511
+ // ── Overlays and look (group: looks) ──
512
+ export { default as LpHoverCard } from "./components/LpHoverCard.vue"
513
+ export { default as LpIdenticon } from "./components/LpIdenticon.vue"
514
+ export { hashString, identicon, identiconRects, identiconSvg } from "./components/identicon"
515
+ export type { Identicon, IdenticonOptions, IdenticonSvgOptions } from "./components/identicon"
516
+ export { default as LpShaderBackdrop } from "./components/LpShaderBackdrop.vue"
517
+ export { PRESET_NAMES as SHADER_PRESETS } from "./components/shaderBackdrop"
518
+ export type { ShaderPreset } from "./components/shaderBackdrop"
519
+ export { default as LpCollapse } from "./components/LpCollapse.vue"
520
+ export { pseudoLocalize } from "./composables/pseudoLocale"
521
+ export type { PseudoOptions } from "./composables/pseudoLocale"
522
+
523
+ // ── Text effects (group: text) ──
524
+ export { default as LpTextReveal } from "./components/LpTextReveal.vue"
525
+ export { default as LpShinyText } from "./components/LpShinyText.vue"
526
+ export { default as LpTypewriter } from "./components/LpTypewriter.vue"
527
+ export { default as LpScramble } from "./components/LpScramble.vue"
528
+ export { useScramble } from "./composables/useScramble"
529
+ export type { UseScramble, UseScrambleOptions } from "./composables/useScramble"
530
+ export { useInView } from "./composables/useInView"
531
+ export type { UseInView } from "./composables/useInView"
532
+ export {
533
+ graphemes,
534
+ planScramble,
535
+ randomGlyph,
536
+ scrambleFrame,
537
+ seededRandom,
538
+ settledCells,
539
+ SCRAMBLE_GLYPHS,
540
+ } from "./components/scramble"
541
+ export type { ScrambleCell, ScrambleFrameCell, ScrambleOptions } from "./components/scramble"
542
+
543
+ // ── Layout and card effects (group: layout) ──
544
+ export { default as LpDock } from "./components/LpDock.vue"
545
+ export type { DockItem } from "./components/LpDock.vue"
546
+ export { dockSize, magneticOffset } from "./components/dock"
547
+ export { default as LpMasonry } from "./components/LpMasonry.vue"
548
+ export { masonryColumnCount, placeMasonry } from "./components/masonry"
549
+ export type { MasonryColumns, MasonryPlacement } from "./components/masonry"
550
+ export { default as LpRevealOnScroll } from "./components/LpRevealOnScroll.vue"
551
+ export { revealFrom, revealTo, staggerDelay } from "./components/reveal"
552
+ export type { RevealDirection, RevealPreset } from "./components/reveal"
553
+ export { default as LpSpotlight } from "./components/LpSpotlight.vue"
554
+ export { default as LpGlowBorder } from "./components/LpGlowBorder.vue"
555
+ export { default as LpMagnetic } from "./components/LpMagnetic.vue"
556
+ export { spotlightPoint, useSpotlight } from "./composables/useSpotlight"
557
+ export type { UseSpotlight, UseSpotlightOptions } from "./composables/useSpotlight"