@leavepulse/ui 0.77.3 → 0.78.1

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 (621) hide show
  1. package/README.md +68 -0
  2. package/dist/assets/{LpCommandPalette-DOIZHw-g.css → LpCommandPalette-DDJKICKh.css} +19 -19
  3. package/dist/assets/{LpDock-Cbh0wQUv.css → LpDock-Dw82tWVD.css} +3 -3
  4. package/dist/assets/{LpDropzone-B_qRq1-R.css → LpDropzone-DNbh_NFJ.css} +10 -10
  5. package/dist/assets/{LpImageEditor-XM5bAziW.css → LpImageEditor-Bgu20XLs.css} +6 -6
  6. package/dist/assets/{LpTable-Bv-EcQs7.css → LpTable-CCk0ZHo7.css} +19 -19
  7. package/dist/assets/LpTabs-Bh7a-Bdl.css +18 -0
  8. package/dist/chunks/AppShellContextNav-C6Ho2mof.js +49 -0
  9. package/dist/chunks/ChartRangeSelector-HO0sMMz6.js +129 -0
  10. package/dist/chunks/{ContextMenuItems-BXumicbh.js → ContextMenuItems-DmaKSJVv.js} +1 -1
  11. package/dist/chunks/{DropzoneLinkField-C-9BCGJn.js → DropzoneLinkField-CLLhd3WB.js} +2 -2
  12. package/dist/chunks/FieldLeading-mr81aEAP.js +27 -0
  13. package/dist/chunks/{FieldWrapper-CORPzo9s.js → FieldWrapper-DnuMTrqW.js} +1 -1
  14. package/dist/chunks/IconCloseButton-COZEsa9u.js +29 -0
  15. package/dist/chunks/{LayoutCanvas-CNOAUk7D.js → LayoutCanvas-CZKOltfA.js} +1 -1
  16. package/dist/chunks/{LayoutNode-DF5BMN0J.js → LayoutNode-D2f7v683.js} +45 -45
  17. package/dist/chunks/{LpActionBar-BP1ld7-S.js → LpActionBar-BGMk5KoG.js} +3 -3
  18. package/dist/chunks/{LpActivityLine-CJvzrNpj.js → LpActivityLine-Ea-t5Vza.js} +4 -2
  19. package/dist/chunks/{LpAddressInput-E8KtwU7-.js → LpAddressInput-BSS49jpm.js} +12 -11
  20. package/dist/chunks/{LpAlert-n5XPAZfv.js → LpAlert-CjvTZIKF.js} +3 -3
  21. package/dist/chunks/LpAppShell-BKbYCHkx.js +601 -0
  22. package/dist/chunks/{LpAutocomplete-C-SpPfBG.js → LpAutocomplete-DkY6CSyD.js} +24 -42
  23. package/dist/chunks/{LpAvatar-Cg6Az3wz.js → LpAvatar-cQVsNk6F.js} +2 -2
  24. package/dist/chunks/{LpBadge-wUYLN4U9.js → LpBadge-D5QQdDQ_.js} +2 -2
  25. package/dist/chunks/{LpBottomNav-CbNQQPuL.js → LpBottomNav-zxLGGbjm.js} +9 -2
  26. package/dist/chunks/{LpBreadcrumbs-DPdbth-c.js → LpBreadcrumbs-CIIBsygI.js} +4 -3
  27. package/dist/chunks/{LpButton-CFb44IjC.js → LpButton-DSHioIfD.js} +5 -4
  28. package/dist/chunks/{LpCalendar-CuoWks-0.js → LpCalendar-D4-LVjfF.js} +1 -1
  29. package/dist/chunks/{LpCard-r13WRqox.js → LpCard-BPtYXwnT.js} +1 -1
  30. package/dist/chunks/{LpCheckbox-Cs4SHaHX.js → LpCheckbox-D6RuDW4X.js} +38 -16
  31. package/dist/chunks/{LpCodeBlock-DRC8VbXW.js → LpCodeBlock-DBqy4RLd.js} +19 -41
  32. package/dist/chunks/{LpCodeDisplay-CE9TxCA4.js → LpCodeDisplay-D3BUAhV1.js} +5 -5
  33. package/dist/chunks/{LpCollapse-CWS9M_lm.js → LpCollapse-DrAw5DBZ.js} +5 -4
  34. package/dist/chunks/{LpColorPicker-1y1QJHZR.js → LpColorPicker-COHzV68R.js} +11 -12
  35. package/dist/chunks/{LpCommandScope-CtUhJe8T.js → LpCommandScope-DRUvHiX7.js} +1 -1
  36. package/dist/chunks/{LpConfirmDialog-DlD45Bi_.js → LpConfirmDialog-CnrmzkuN.js} +3 -3
  37. package/dist/chunks/{LpConfirmHost-BIWjBLmI.js → LpConfirmHost-CwbObVGH.js} +1 -1
  38. package/dist/chunks/{LpContextMenu-rx2tCjwk.js → LpContextMenu-Bx_IhQDS.js} +17 -19
  39. package/dist/chunks/{LpContextSwitcher-Dwh6dyID.js → LpContextSwitcher-1C1tExdl.js} +2 -2
  40. package/dist/chunks/{LpCopyButton-xF7wFVoU.js → LpCopyButton-sAMvWeLP.js} +3 -3
  41. package/dist/chunks/{LpCountdown-DgeY3cLG.js → LpCountdown-DVl7vXI1.js} +4 -3
  42. package/dist/chunks/{LpDataList-Jxyl9H5w.js → LpDataList-CaVfsozH.js} +13 -4
  43. package/dist/chunks/{LpDatePicker-CA0QTfBC.js → LpDatePicker-DwSDY0mt.js} +12 -18
  44. package/dist/chunks/{LpDateRangePicker-u3J51xXk.js → LpDateRangePicker-CNQXdTVv.js} +10 -16
  45. package/dist/chunks/{LpDisclosure-Cpa7Hc5T.js → LpDisclosure-DG7JCo-d.js} +2 -2
  46. package/dist/chunks/{LpDrawer-CrG8t_KP.js → LpDrawer-DXNQFpAA.js} +61 -61
  47. package/dist/chunks/{LpDropdownMenu-Dl7Z4ZhS.js → LpDropdownMenu-CLzxIOgM.js} +9 -17
  48. package/dist/chunks/{LpEditable-Cy6GLbFx.js → LpEditable-DVT0Rh8F.js} +9 -6
  49. package/dist/chunks/{LpEmptyState-EQHiRYhG.js → LpEmptyState-DurPF001.js} +1 -1
  50. package/dist/chunks/{LpFieldNotice-CzQ2_5rQ.js → LpFieldNotice-DJ10cYIo.js} +1 -1
  51. package/dist/chunks/LpFileTree-C-rJKzEQ.js +735 -0
  52. package/dist/chunks/{LpFileTreeNode-cT6BIWvz.js → LpFileTreeNode-BgYn4U1J.js} +116 -34
  53. package/dist/chunks/{LpFormField-Ch69Jd-X.js → LpFormField-BKYn9dyP.js} +3 -3
  54. package/dist/chunks/{LpFrame-BVQCQLDI.js → LpFrame-Bv5Fphte.js} +25 -11
  55. package/dist/chunks/{LpHintExample-9Py0wc-L.js → LpHintExample-YzCXiSUp.js} +1 -1
  56. package/dist/chunks/{LpHintLayer-CgObdUsM.js → LpHintLayer-BeKRsRon.js} +2 -2
  57. package/dist/chunks/{LpHints-Bz-BlaSl.js → LpHints-qf3xYsza.js} +3 -3
  58. package/dist/chunks/{LpHoverCard-spGxyw7T.js → LpHoverCard-CHE9jAJG.js} +29 -11
  59. package/dist/chunks/{LpIcon--5WSb3jJ.js → LpIcon-C6JpQ5td.js} +6 -3
  60. package/dist/chunks/{LpIdenticon-BzdC_qz9.js → LpIdenticon-Dbbr4fvt.js} +2 -1
  61. package/dist/chunks/{LpInfraNode-46XOCkfq.js → LpInfraNode-Bb5nbuFY.js} +19 -2
  62. package/dist/chunks/{LpInput-Tw-yxT4I.js → LpInput-D0O6dpuA.js} +32 -47
  63. package/dist/chunks/LpInspector-DO3fTCQ1.js +209 -0
  64. package/dist/chunks/{LpLaneNode-HtnQf2FF.js → LpLaneNode-Bqcdm8Rf.js} +19 -1
  65. package/dist/chunks/{LpLightbox-B95yu22B.js → LpLightbox-CtDTQV01.js} +57 -32
  66. package/dist/chunks/{LpLoader-DVwkOmt9.js → LpLoader-Bf1yZwaU.js} +1 -1
  67. package/dist/chunks/LpLogInspector-BdQlX6S-.js +119 -0
  68. package/dist/chunks/{LpLogViewer-ngqkns4m.js → LpLogViewer-umCZBapN.js} +234 -53
  69. package/dist/chunks/{LpMapPicker-DRGgh89B.js → LpMapPicker-D5_YLLBC.js} +4 -3
  70. package/dist/chunks/{LpMasonry--k0571qG.js → LpMasonry-DPYekFxs.js} +8 -5
  71. package/dist/chunks/{LpMediaGallery-Bkram-MO.js → LpMediaGallery-BYEwySoF.js} +3 -3
  72. package/dist/chunks/{LpModal-CoGhLTyH.js → LpModal-DDvrSAnf.js} +11 -13
  73. package/dist/chunks/{LpModalNav-BGvs2y5Q.js → LpModalNav-gOi1Giz1.js} +11 -37
  74. package/dist/chunks/{LpNotificationBell-B0034Lk-.js → LpNotificationBell-DUbVyK6R.js} +9 -9
  75. package/dist/chunks/{LpNumberField-e0IBkWU1.js → LpNumberField-Csg-1Zh_.js} +25 -20
  76. package/dist/chunks/{LpOtpInput-CeBPsM7D.js → LpOtpInput-BRpLBbOD.js} +2 -2
  77. package/dist/chunks/LpPageScrollbar-D2O0xhJw.js +164 -0
  78. package/dist/chunks/{LpPagination-BIIiYHXR.js → LpPagination-snQ020xQ.js} +6 -4
  79. package/dist/chunks/{LpPaletteTheme-DiLYKQiZ.js → LpPaletteTheme-BIXpZLGe.js} +4 -4
  80. package/dist/chunks/{LpPasswordInput-BkHKQDhM.js → LpPasswordInput-D4HPhqfV.js} +2 -2
  81. package/dist/chunks/{LpPhoneInput-CETEp5W7.js → LpPhoneInput-BSL7NX4z.js} +15 -26
  82. package/dist/chunks/{LpPie-DrZepi0p.js → LpPie-oVNHjsKD.js} +22 -21
  83. package/dist/chunks/{LpPipeline-B3aOVOkV.js → LpPipeline-BSXT6oUJ.js} +16 -7
  84. package/dist/chunks/{LpPopover-DmZ3wUtP.js → LpPopover-BQSuxtai.js} +10 -1
  85. package/dist/chunks/{LpProgress-Yr6ONG5t.js → LpProgress-D_MSjowb.js} +2 -1
  86. package/dist/chunks/{LpQuota-Dk2MyI2Z.js → LpQuota-CgWPgdVt.js} +1 -1
  87. package/dist/chunks/{LpRadioGroup-ggaPL92T.js → LpRadioGroup-BrazjLY_.js} +4 -4
  88. package/dist/chunks/{LpRangeCalendar-CYYUYqJ7.js → LpRangeCalendar-BrqlGZzE.js} +1 -1
  89. package/dist/chunks/{LpRangeSlider-CM-0ZITZ.js → LpRangeSlider-fz61tzc-.js} +5 -9
  90. package/dist/chunks/{LpRelativeTime-DwgCb5-8.js → LpRelativeTime-0zI-44ve.js} +1 -1
  91. package/dist/chunks/{LpRepeater-D7ZmnIYd.js → LpRepeater-BkJHSPI1.js} +3 -3
  92. package/dist/chunks/{LpRevealOnScroll-DcQjexLy.js → LpRevealOnScroll-CPwyiQAr.js} +1 -1
  93. package/dist/chunks/{LpScramble-Bn9OoOtC.js → LpScramble-DsE77iVp.js} +1 -1
  94. package/dist/chunks/{LpScrollArea-MyEnVB_5.js → LpScrollArea-CqvwfZs2.js} +31 -22
  95. package/dist/chunks/{LpSecretField-BbmqM9ye.js → LpSecretField-B2roc4Iz.js} +10 -9
  96. package/dist/chunks/{LpSection-DFK_uoJE.js → LpSection-BfteipxU.js} +1 -1
  97. package/dist/chunks/{LpSegmented-CeACsMMA.js → LpSegmented-DbEJhbv-.js} +8 -10
  98. package/dist/chunks/{LpSelect-Cxq4yBGd.js → LpSelect-Y-iuSymW.js} +47 -30
  99. package/dist/chunks/{LpServiceNode-D8uJ8sGk.js → LpServiceNode-Cln2ntdw.js} +17 -0
  100. package/dist/chunks/{LpShaderBackdrop-Bote0iuy.js → LpShaderBackdrop-wQygYb5h.js} +13 -10
  101. package/dist/chunks/{LpShift-CCq7dofl.js → LpShift-DAgS_d2x.js} +18 -15
  102. package/dist/chunks/{LpSidebar-DzE1783C.js → LpSidebar-DDNJzb69.js} +74 -87
  103. package/dist/chunks/{LpSidebarNav-DE3PhXVP.js → LpSidebarNav-CE0jQS8i.js} +8 -6
  104. package/dist/chunks/{LpSidebarRow-BRYhNDSo.js → LpSidebarRow-DOTg1txp.js} +6 -5
  105. package/dist/chunks/{LpSlider-DxYoCJJO.js → LpSlider-A4ixovgS.js} +5 -9
  106. package/dist/chunks/{LpSpotlight-4F3NeUMY.js → LpSpotlight-DwxkhFgR.js} +2 -1
  107. package/dist/chunks/{LpStat-f2LfDCJ4.js → LpStat-DPjc6_fX.js} +19 -6
  108. package/dist/chunks/{LpStatus-DglxttQ7.js → LpStatus-DGJFwk5F.js} +2 -2
  109. package/dist/chunks/{LpStepMark-DpzKVyh8.js → LpStepMark-Dw2MRTrt.js} +2 -2
  110. package/dist/chunks/{LpStepper-DpsocBNJ.js → LpStepper-DNnh7lCu.js} +1 -1
  111. package/dist/chunks/{LpSwap-C96c0LWh.js → LpSwap-M7nFeW3C.js} +1 -1
  112. package/dist/chunks/{LpSwitch-BnXd1llc.js → LpSwitch-DnC2-0aV.js} +3 -3
  113. package/dist/chunks/{LpTabFace-DPCwKkH2.js → LpTabFace-DQoV8mQG.js} +2 -2
  114. package/dist/chunks/{LpTableFilter-CiVBpaq0.js → LpTableFilter-B_XMOeAh.js} +4 -4
  115. package/dist/chunks/{LpTableOfContents-BN5zvpnx.js → LpTableOfContents-CKkWEK6R.js} +14 -9
  116. package/dist/chunks/{LpTagsInput-C-mDG648.js → LpTagsInput-Dt0mteSj.js} +19 -27
  117. package/dist/chunks/{LpTextarea-TE-yZv2U.js → LpTextarea-Co0b9PVx.js} +8 -16
  118. package/dist/chunks/LpThemeProvider-XK6ZeWAE.js +81 -0
  119. package/dist/chunks/{LpThemeStudio-BpORDvH6.js → LpThemeStudio-ChU0_Ga8.js} +12 -195
  120. package/dist/chunks/{LpThemeSwitcher-BnEn_mvf.js → LpThemeSwitcher-DmCZ21P_.js} +8 -6
  121. package/dist/chunks/{LpTimeField-BawSVsmt.js → LpTimeField-DeOcKWJq.js} +6 -9
  122. package/dist/chunks/{LpToaster-IwTXjbbU.js → LpToaster-Ct_ZOhCh.js} +10 -8
  123. package/dist/chunks/{LpTooltip-BcBvIx4z.js → LpTooltip-Bz_rrq5S.js} +56 -24
  124. package/dist/chunks/LpTopologyCanvas-jqz1KCq2.js +678 -0
  125. package/dist/chunks/{LpTour-BZq-mUMv.js → LpTour-ClKYhx4h.js} +7 -5
  126. package/dist/chunks/{LpTruncate-CflAIwiJ.js → LpTruncate-ellq9RYM.js} +6 -5
  127. package/dist/chunks/{LpTypewriter-BCL_a6wE.js → LpTypewriter-CZIzpdbe.js} +2 -1
  128. package/dist/chunks/{LpUptimeBar-DqNvvMBK.js → LpUptimeBar-BoxcCDVY.js} +3 -3
  129. package/dist/chunks/{LpVideoBackdrop-DS1wGv-X.js → LpVideoBackdrop-Ct4St4ZL.js} +10 -13
  130. package/dist/chunks/LpWindow-B8YSRVTH.js +297 -0
  131. package/dist/chunks/LpWorkspaceSwitcher-BeNHCLd5.js +139 -0
  132. package/dist/chunks/{MenuTitle-BmCNNTKH.js → MenuTitle-Bh5dAdV1.js} +1 -1
  133. package/dist/chunks/{OptionContent-22UT8zLn.js → OptionContent-CGb8QlHA.js} +1 -1
  134. package/dist/chunks/{PickerField-Bfh8id3d.js → PickerField-BM1dyafh.js} +4 -4
  135. package/dist/chunks/{RevealToggle-BEit1n6Z.js → RevealToggle-D_iyrB8d.js} +3 -3
  136. package/dist/chunks/SliderRail-DhPREa_R.js +18 -0
  137. package/dist/chunks/{TourCard-DNclH3u_.js → TourCard-DAzTYfav.js} +4 -4
  138. package/dist/chunks/{icons-DMITlfw5.js → icons-CYfcpSDS.js} +26 -10
  139. package/dist/component-names.d.ts +1 -1
  140. package/dist/components/AppShellContextNav.vue.d.ts +13 -0
  141. package/dist/components/AppShellContextNav.vue.js +4 -0
  142. package/dist/components/ChartRangeSelector.vue.d.ts +21 -0
  143. package/dist/components/ChartRangeSelector.vue.js +4 -0
  144. package/dist/components/ContextMenuItems.vue.js +1 -1
  145. package/dist/components/DropzoneLinkField.vue.d.ts +2 -2
  146. package/dist/components/DropzoneLinkField.vue.js +1 -1
  147. package/dist/components/FieldLeading.vue.d.ts +16 -0
  148. package/dist/components/FieldLeading.vue.js +4 -0
  149. package/dist/components/FieldWrapper.vue.js +1 -1
  150. package/dist/components/IconCloseButton.vue.d.ts +7 -0
  151. package/dist/components/IconCloseButton.vue.js +4 -0
  152. package/dist/components/LayoutCanvas.vue.js +1 -1
  153. package/dist/components/LayoutNode.vue.js +1 -1
  154. package/dist/components/LpActionBar.vue.js +1 -1
  155. package/dist/components/LpActivityLine.vue.js +1 -1
  156. package/dist/components/LpAddressInput.vue.js +1 -1
  157. package/dist/components/LpAlert.vue.js +1 -1
  158. package/dist/components/LpAppShell.vue.d.ts +125 -2
  159. package/dist/components/LpAppShell.vue.js +1 -1
  160. package/dist/components/LpAutocomplete.vue.js +1 -1
  161. package/dist/components/LpAvatar.vue.js +1 -1
  162. package/dist/components/LpBadge.vue.js +1 -1
  163. package/dist/components/LpBottomNav.vue.d.ts +5 -0
  164. package/dist/components/LpBottomNav.vue.js +1 -1
  165. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  166. package/dist/components/LpButton.vue.d.ts +14 -2
  167. package/dist/components/LpButton.vue.js +1 -1
  168. package/dist/components/LpCalendar.vue.js +1 -1
  169. package/dist/components/LpCard.vue.js +1 -1
  170. package/dist/components/LpChart.vue.d.ts +74 -2
  171. package/dist/components/LpChart.vue.js +326 -85
  172. package/dist/components/LpCheckbox.vue.d.ts +6 -2
  173. package/dist/components/LpCheckbox.vue.js +1 -1
  174. package/dist/components/LpCodeBlock.vue.js +1 -1
  175. package/dist/components/LpCodeDisplay.vue.js +1 -1
  176. package/dist/components/LpCollapse.vue.js +1 -1
  177. package/dist/components/LpColorPicker.vue.js +1 -1
  178. package/dist/components/LpCommandPalette.vue.d.ts +8 -0
  179. package/dist/components/LpCommandPalette.vue.js +107 -56
  180. package/dist/components/LpCommandScope.vue.js +1 -1
  181. package/dist/components/LpConfirmDialog.vue.js +1 -1
  182. package/dist/components/LpConfirmHost.vue.js +1 -1
  183. package/dist/components/LpContextMenu.vue.js +1 -1
  184. package/dist/components/LpContextSwitcher.vue.js +1 -1
  185. package/dist/components/LpCopyButton.vue.js +1 -1
  186. package/dist/components/LpCountdown.vue.js +1 -1
  187. package/dist/components/LpDataList.vue.d.ts +1 -1
  188. package/dist/components/LpDataList.vue.js +1 -1
  189. package/dist/components/LpDatePicker.vue.d.ts +3 -15
  190. package/dist/components/LpDatePicker.vue.js +1 -1
  191. package/dist/components/LpDateRangePicker.vue.d.ts +3 -13
  192. package/dist/components/LpDateRangePicker.vue.js +1 -1
  193. package/dist/components/LpDisclosure.vue.js +1 -1
  194. package/dist/components/LpDock.vue.js +21 -18
  195. package/dist/components/LpDrawer.vue.d.ts +1 -1
  196. package/dist/components/LpDrawer.vue.js +1 -1
  197. package/dist/components/LpDropdownMenu.vue.js +1 -1
  198. package/dist/components/LpDropzone.vue.js +14 -11
  199. package/dist/components/LpEditable.vue.js +1 -1
  200. package/dist/components/LpEmptyState.vue.js +1 -1
  201. package/dist/components/LpFieldNotice.vue.js +1 -1
  202. package/dist/components/LpFileTree.vue.d.ts +96 -6
  203. package/dist/components/LpFileTree.vue.js +1 -1
  204. package/dist/components/LpFileTreeNode.vue.d.ts +48 -0
  205. package/dist/components/LpFileTreeNode.vue.js +1 -1
  206. package/dist/components/LpFormField.vue.js +1 -1
  207. package/dist/components/LpFrame.vue.js +1 -1
  208. package/dist/components/LpGauge.vue.d.ts +1 -1
  209. package/dist/components/LpHintExample.vue.js +1 -1
  210. package/dist/components/LpHintLayer.vue.js +1 -1
  211. package/dist/components/LpHints.vue.js +1 -1
  212. package/dist/components/LpHoverCard.vue.js +1 -1
  213. package/dist/components/LpIcon.vue.d.ts +2 -0
  214. package/dist/components/LpIcon.vue.js +1 -1
  215. package/dist/components/LpIdenticon.vue.js +1 -1
  216. package/dist/components/LpImageEditor.vue.js +7 -6
  217. package/dist/components/LpInfraNode.vue.d.ts +11 -2
  218. package/dist/components/LpInfraNode.vue.js +1 -1
  219. package/dist/components/LpInput.vue.d.ts +1 -1
  220. package/dist/components/LpInput.vue.js +1 -1
  221. package/dist/components/LpInspector.vue.d.ts +87 -0
  222. package/dist/components/LpInspector.vue.js +4 -0
  223. package/dist/components/LpLaneNode.vue.d.ts +2 -3
  224. package/dist/components/LpLaneNode.vue.js +1 -1
  225. package/dist/components/LpLightbox.vue.d.ts +8 -0
  226. package/dist/components/LpLightbox.vue.js +1 -1
  227. package/dist/components/LpLoader.vue.d.ts +1 -1
  228. package/dist/components/LpLoader.vue.js +1 -1
  229. package/dist/components/LpLogInspector.vue.d.ts +18 -0
  230. package/dist/components/LpLogInspector.vue.js +4 -0
  231. package/dist/components/LpLogViewer.vue.d.ts +93 -0
  232. package/dist/components/LpLogViewer.vue.js +1 -1
  233. package/dist/components/LpMapPicker.vue.js +1 -1
  234. package/dist/components/LpMasonry.vue.js +1 -1
  235. package/dist/components/LpMediaGallery.vue.js +1 -1
  236. package/dist/components/LpModal.vue.d.ts +4 -2
  237. package/dist/components/LpModal.vue.js +1 -1
  238. package/dist/components/LpModalNav.vue.d.ts +5 -5
  239. package/dist/components/LpModalNav.vue.js +1 -1
  240. package/dist/components/LpNotificationBell.vue.d.ts +2 -2
  241. package/dist/components/LpNotificationBell.vue.js +1 -1
  242. package/dist/components/LpNumberField.vue.d.ts +13 -2
  243. package/dist/components/LpNumberField.vue.js +1 -1
  244. package/dist/components/LpOtpInput.vue.js +1 -1
  245. package/dist/components/LpPageScrollbar.vue.d.ts +10 -0
  246. package/dist/components/LpPageScrollbar.vue.js +4 -0
  247. package/dist/components/LpPagination.vue.js +1 -1
  248. package/dist/components/LpPaletteFacts.vue.js +1 -1
  249. package/dist/components/LpPaletteHeader.vue.js +2 -2
  250. package/dist/components/LpPaletteTheme.vue.js +1 -1
  251. package/dist/components/LpPasswordInput.vue.js +1 -1
  252. package/dist/components/LpPhoneInput.vue.js +1 -1
  253. package/dist/components/LpPie.vue.d.ts +2 -2
  254. package/dist/components/LpPie.vue.js +1 -1
  255. package/dist/components/LpPipeline.vue.d.ts +4 -0
  256. package/dist/components/LpPipeline.vue.js +1 -1
  257. package/dist/components/LpPopover.vue.d.ts +7 -3
  258. package/dist/components/LpPopover.vue.js +1 -1
  259. package/dist/components/LpProgress.vue.d.ts +1 -1
  260. package/dist/components/LpProgress.vue.js +1 -1
  261. package/dist/components/LpQuota.vue.js +1 -1
  262. package/dist/components/LpRadioGroup.vue.js +1 -1
  263. package/dist/components/LpRangeCalendar.vue.js +1 -1
  264. package/dist/components/LpRangeSlider.vue.js +1 -1
  265. package/dist/components/LpRelativeTime.vue.js +1 -1
  266. package/dist/components/LpRepeater.vue.js +1 -1
  267. package/dist/components/LpRevealOnScroll.vue.js +1 -1
  268. package/dist/components/LpScramble.vue.js +1 -1
  269. package/dist/components/LpScrollArea.vue.js +1 -1
  270. package/dist/components/LpSecretField.vue.js +1 -1
  271. package/dist/components/LpSection.vue.js +1 -1
  272. package/dist/components/LpSegmented.vue.js +1 -1
  273. package/dist/components/LpSelect.vue.js +1 -1
  274. package/dist/components/LpServiceNode.vue.d.ts +8 -2
  275. package/dist/components/LpServiceNode.vue.js +1 -1
  276. package/dist/components/LpShaderBackdrop.vue.js +1 -1
  277. package/dist/components/LpShift.vue.js +1 -1
  278. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  279. package/dist/components/LpSidebar.vue.d.ts +1 -1
  280. package/dist/components/LpSidebar.vue.js +1 -1
  281. package/dist/components/LpSidebarNav.vue.js +1 -1
  282. package/dist/components/LpSidebarRow.vue.js +1 -1
  283. package/dist/components/LpSlider.vue.js +1 -1
  284. package/dist/components/LpSparkline.vue.d.ts +1 -1
  285. package/dist/components/LpSpotlight.vue.js +1 -1
  286. package/dist/components/LpStat.vue.d.ts +16 -0
  287. package/dist/components/LpStat.vue.js +1 -1
  288. package/dist/components/LpStatus.vue.js +1 -1
  289. package/dist/components/LpStepMark.vue.js +1 -1
  290. package/dist/components/LpStepper.vue.js +1 -1
  291. package/dist/components/LpSwap.vue.js +1 -1
  292. package/dist/components/LpSwitch.vue.js +1 -1
  293. package/dist/components/LpTabFace.vue.js +1 -1
  294. package/dist/components/LpTable.vue.d.ts +132 -0
  295. package/dist/components/LpTable.vue.js +547 -135
  296. package/dist/components/LpTableFilter.vue.js +1 -1
  297. package/dist/components/LpTableOfContents.vue.js +1 -1
  298. package/dist/components/LpTabs.vue.js +6 -5
  299. package/dist/components/LpTagsInput.vue.js +1 -1
  300. package/dist/components/LpTextarea.vue.js +1 -1
  301. package/dist/components/LpThemeProvider.vue.d.ts +2 -0
  302. package/dist/components/LpThemeProvider.vue.js +1 -1
  303. package/dist/components/LpThemeStudio.vue.js +1 -1
  304. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  305. package/dist/components/LpTimeField.vue.js +1 -1
  306. package/dist/components/LpToaster.vue.js +1 -1
  307. package/dist/components/LpTooltip.vue.js +1 -1
  308. package/dist/components/LpTopologyCanvas.vue.d.ts +131 -5
  309. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  310. package/dist/components/LpTour.vue.js +1 -1
  311. package/dist/components/LpTruncate.vue.js +1 -1
  312. package/dist/components/LpTypewriter.vue.js +1 -1
  313. package/dist/components/LpUptimeBar.vue.js +1 -1
  314. package/dist/components/LpVideoBackdrop.vue.js +1 -1
  315. package/dist/components/LpWindow.vue.d.ts +99 -0
  316. package/dist/components/LpWindow.vue.js +4 -0
  317. package/dist/components/LpWorkspaceSwitcher.vue.d.ts +18 -0
  318. package/dist/components/LpWorkspaceSwitcher.vue.js +4 -0
  319. package/dist/components/MenuTitle.vue.js +1 -1
  320. package/dist/components/OptionContent.vue.js +1 -1
  321. package/dist/components/PickerField.vue.d.ts +2 -2
  322. package/dist/components/PickerField.vue.js +1 -1
  323. package/dist/components/RevealToggle.vue.js +1 -1
  324. package/dist/components/SliderRail.vue.d.ts +3 -0
  325. package/dist/components/SliderRail.vue.js +4 -0
  326. package/dist/components/TourCard.vue.js +1 -1
  327. package/dist/components/address.js +2 -1
  328. package/dist/components/appShell.d.ts +36 -0
  329. package/dist/components/appShell.js +30 -0
  330. package/dist/components/calendar.d.ts +12 -3
  331. package/dist/components/calendar.js +2 -5
  332. package/dist/components/chart.d.ts +21 -0
  333. package/dist/components/chart.js +4 -3
  334. package/dist/components/chartWindow.d.ts +57 -0
  335. package/dist/components/chartWindow.js +136 -0
  336. package/dist/components/color.js +1 -1
  337. package/dist/components/commandPalette.d.ts +16 -2
  338. package/dist/components/commandPalette.js +39 -4
  339. package/dist/components/controlSize.d.ts +5 -0
  340. package/dist/components/controlSize.js +8 -0
  341. package/dist/components/dropdown.d.ts +5 -0
  342. package/dist/components/dropdown.js +2 -0
  343. package/dist/components/exportData.d.ts +6 -1
  344. package/dist/components/exportData.js +25 -18
  345. package/dist/components/fileTree.d.ts +67 -0
  346. package/dist/components/fileTree.js +141 -1
  347. package/dist/components/identicon.js +3 -2
  348. package/dist/components/logTools.d.ts +93 -0
  349. package/dist/components/logTools.js +210 -0
  350. package/dist/components/menuWhen.js +1 -1
  351. package/dist/components/meter.js +2 -1
  352. package/dist/components/pipeline.d.ts +2 -0
  353. package/dist/components/pipeline.js +5 -0
  354. package/dist/components/relativeTime.js +2 -1
  355. package/dist/components/reveal.js +2 -1
  356. package/dist/components/scrollbar.d.ts +34 -0
  357. package/dist/components/scrollbar.js +47 -0
  358. package/dist/components/select.d.ts +5 -0
  359. package/dist/components/select.js +10 -0
  360. package/dist/components/sidebar.d.ts +1 -0
  361. package/dist/components/tableFeatures.d.ts +58 -0
  362. package/dist/components/tableFeatures.js +87 -0
  363. package/dist/components/topologyGraph.d.ts +164 -0
  364. package/dist/components/topologyGraph.js +416 -0
  365. package/dist/components/tour.js +5 -3
  366. package/dist/components/videoBackdrop.js +7 -6
  367. package/dist/composables/clamp.d.ts +2 -0
  368. package/dist/composables/clamp.js +4 -0
  369. package/dist/composables/devWarn.d.ts +3 -0
  370. package/dist/composables/devWarn.js +14 -0
  371. package/dist/composables/easing.d.ts +13 -4
  372. package/dist/composables/easing.js +16 -10
  373. package/dist/composables/overlayHistory.js +14 -1
  374. package/dist/composables/pointerDrag.d.ts +15 -0
  375. package/dist/composables/pointerDrag.js +40 -0
  376. package/dist/composables/propCheck.d.ts +10 -0
  377. package/dist/composables/propCheck.js +89 -0
  378. package/dist/composables/realm.d.ts +6 -0
  379. package/dist/composables/realm.js +23 -0
  380. package/dist/composables/scroll.js +4 -2
  381. package/dist/composables/scrollMemory.d.ts +12 -1
  382. package/dist/composables/scrollMemory.js +36 -12
  383. package/dist/composables/spatialNav.js +2 -1
  384. package/dist/composables/textEntry.d.ts +17 -0
  385. package/dist/composables/textEntry.js +19 -0
  386. package/dist/composables/useAsyncTask.d.ts +6 -0
  387. package/dist/composables/useChartSync.d.ts +5 -0
  388. package/dist/composables/useChartSync.js +33 -0
  389. package/dist/composables/useCloseGuard.d.ts +3 -1
  390. package/dist/composables/useCloseGuard.js +6 -3
  391. package/dist/composables/useCommands.d.ts +50 -0
  392. package/dist/composables/useCommands.js +66 -0
  393. package/dist/composables/useField.d.ts +37 -0
  394. package/dist/composables/useField.js +27 -2
  395. package/dist/composables/useFitScale.js +4 -1
  396. package/dist/composables/useFormDraft.d.ts +13 -2
  397. package/dist/composables/useFormDraft.js +17 -9
  398. package/dist/composables/useHintSystem.js +2 -2
  399. package/dist/composables/useHotkeys.js +11 -32
  400. package/dist/composables/useInView.js +2 -1
  401. package/dist/composables/useInputFilter.js +7 -5
  402. package/dist/composables/useInputMask.js +5 -3
  403. package/dist/composables/useLinkedView.d.ts +97 -0
  404. package/dist/composables/useLinkedView.js +139 -0
  405. package/dist/composables/useOptimisticToggle.d.ts +3 -1
  406. package/dist/composables/useOptimisticToggle.js +2 -1
  407. package/dist/composables/useOverlayHistory.d.ts +7 -0
  408. package/dist/composables/useOverlayHistory.js +16 -2
  409. package/dist/composables/usePaintSelect.js +18 -14
  410. package/dist/composables/usePaletteCommands.d.ts +7 -0
  411. package/dist/composables/usePaletteCommands.js +16 -3
  412. package/dist/composables/usePersisted.d.ts +10 -0
  413. package/dist/composables/usePersisted.js +1 -1
  414. package/dist/composables/usePillTransition.d.ts +2 -2
  415. package/dist/composables/usePillTransition.js +5 -5
  416. package/dist/composables/useResizeObserver.js +2 -1
  417. package/dist/composables/useReveal.js +2 -1
  418. package/dist/composables/useRovingFocus.d.ts +2 -2
  419. package/dist/composables/useRovingFocus.js +9 -11
  420. package/dist/composables/useScramble.js +7 -1
  421. package/dist/composables/useShift.js +8 -6
  422. package/dist/composables/useTilt.js +2 -1
  423. package/dist/composables/useTween.js +9 -5
  424. package/dist/composables/useView.d.ts +1 -0
  425. package/dist/composables/useView.js +14 -2
  426. package/dist/composables/useZoomPan.js +2 -4
  427. package/dist/composables/windowing.d.ts +40 -0
  428. package/dist/composables/windowing.js +118 -0
  429. package/dist/icons-all.js +1 -1
  430. package/dist/icons.d.ts +4 -0
  431. package/dist/index.d.ts +31 -5
  432. package/dist/index.js +312 -264
  433. package/dist/layout/tree.js +19 -15
  434. package/dist/layout/useLayout.d.ts +2 -0
  435. package/dist/layout/useLayout.js +5 -1
  436. package/dist/layout/useWorkspaces.d.ts +52 -0
  437. package/dist/layout/useWorkspaces.js +140 -0
  438. package/dist/{chunks/backdrop-Dkf2vM81.js → theme/backdrop.js} +5 -5
  439. package/dist/theme/config.js +25 -0
  440. package/dist/theme/define.js +61 -0
  441. package/dist/{chunks/palette-Co8tSASo.js → theme/palette.js} +2 -2
  442. package/dist/theme/presets.js +239 -0
  443. package/dist/theme/studio.js +134 -0
  444. package/dist/theme/tokens.js +63 -0
  445. package/dist/theme/useTheme.d.ts +3 -2
  446. package/dist/theme/useTheme.js +325 -0
  447. package/package.json +8 -1
  448. package/src/component-names.ts +6 -1
  449. package/src/components/AppShellContextNav.vue +44 -0
  450. package/src/components/ChartRangeSelector.vue +120 -0
  451. package/src/components/FieldLeading.vue +17 -0
  452. package/src/components/IconCloseButton.vue +21 -0
  453. package/src/components/LayoutCanvas.vue +3 -0
  454. package/src/components/LayoutNode.vue +37 -38
  455. package/src/components/LpActivityLine.vue +4 -2
  456. package/src/components/LpAddressInput.vue +3 -3
  457. package/src/components/LpAppShell.vue +385 -24
  458. package/src/components/LpAutocomplete.vue +13 -30
  459. package/src/components/LpBottomNav.vue +9 -1
  460. package/src/components/LpBreadcrumbs.vue +2 -1
  461. package/src/components/LpButton.vue +11 -4
  462. package/src/components/LpChart.vue +336 -37
  463. package/src/components/LpCheckbox.vue +43 -9
  464. package/src/components/LpCodeBlock.vue +17 -23
  465. package/src/components/LpCollapse.vue +5 -4
  466. package/src/components/LpColorPicker.vue +8 -9
  467. package/src/components/LpCommandPalette.vue +133 -50
  468. package/src/components/LpContextMenu.vue +22 -13
  469. package/src/components/LpCountdown.vue +2 -1
  470. package/src/components/LpDataList.vue +13 -1
  471. package/src/components/LpDatePicker.vue +5 -17
  472. package/src/components/LpDateRangePicker.vue +5 -16
  473. package/src/components/LpDock.vue +25 -16
  474. package/src/components/LpDrawer.vue +70 -61
  475. package/src/components/LpDropdownMenu.vue +6 -10
  476. package/src/components/LpDropzone.vue +12 -7
  477. package/src/components/LpEditable.vue +6 -2
  478. package/src/components/LpFileTree.vue +507 -66
  479. package/src/components/LpFileTreeNode.vue +106 -5
  480. package/src/components/LpFormField.vue +1 -1
  481. package/src/components/LpFrame.vue +33 -13
  482. package/src/components/LpHoverCard.vue +37 -5
  483. package/src/components/LpIcon.vue +6 -2
  484. package/src/components/LpIdenticon.vue +2 -1
  485. package/src/components/LpImageEditor.vue +5 -2
  486. package/src/components/LpInfraNode.vue +4 -3
  487. package/src/components/LpInput.vue +19 -26
  488. package/src/components/LpInspector.vue +197 -0
  489. package/src/components/LpLaneNode.vue +5 -1
  490. package/src/components/LpLightbox.vue +74 -29
  491. package/src/components/LpLogInspector.vue +85 -0
  492. package/src/components/LpLogViewer.vue +239 -29
  493. package/src/components/LpMapPicker.vue +2 -1
  494. package/src/components/LpMasonry.vue +8 -5
  495. package/src/components/LpModal.vue +12 -12
  496. package/src/components/LpModalNav.vue +2 -21
  497. package/src/components/LpNumberField.vue +13 -16
  498. package/src/components/LpOtpInput.vue +2 -2
  499. package/src/components/LpPageScrollbar.vue +195 -0
  500. package/src/components/LpPagination.vue +5 -3
  501. package/src/components/LpPhoneInput.vue +8 -19
  502. package/src/components/LpPie.vue +25 -23
  503. package/src/components/LpPipeline.vue +14 -1
  504. package/src/components/LpPopover.vue +23 -2
  505. package/src/components/LpProgress.vue +2 -1
  506. package/src/components/LpRadioGroup.vue +2 -2
  507. package/src/components/LpRangeSlider.vue +5 -6
  508. package/src/components/LpRevealOnScroll.vue +1 -1
  509. package/src/components/LpScrollArea.vue +55 -34
  510. package/src/components/LpSecretField.vue +2 -1
  511. package/src/components/LpSegmented.vue +6 -8
  512. package/src/components/LpSelect.vue +54 -24
  513. package/src/components/LpServiceNode.vue +4 -2
  514. package/src/components/LpShaderBackdrop.vue +12 -9
  515. package/src/components/LpShift.vue +18 -15
  516. package/src/components/LpSidebar.vue +77 -74
  517. package/src/components/LpSidebarNav.vue +3 -2
  518. package/src/components/LpSidebarRow.vue +2 -1
  519. package/src/components/LpSlider.vue +5 -6
  520. package/src/components/LpSpotlight.vue +2 -1
  521. package/src/components/LpStat.vue +25 -5
  522. package/src/components/LpSwitch.vue +5 -3
  523. package/src/components/LpTable.vue +609 -93
  524. package/src/components/LpTableFilter.vue +1 -1
  525. package/src/components/LpTableOfContents.vue +16 -9
  526. package/src/components/LpTabs.vue +2 -1
  527. package/src/components/LpTagsInput.vue +12 -19
  528. package/src/components/LpTextarea.vue +5 -11
  529. package/src/components/LpThemeProvider.vue +29 -13
  530. package/src/components/LpTimeField.vue +4 -7
  531. package/src/components/LpToaster.vue +7 -6
  532. package/src/components/LpTooltip.vue +69 -18
  533. package/src/components/LpTopologyCanvas.vue +569 -42
  534. package/src/components/LpTour.vue +7 -5
  535. package/src/components/LpTruncate.vue +4 -3
  536. package/src/components/LpTypewriter.vue +2 -1
  537. package/src/components/LpVideoBackdrop.vue +11 -13
  538. package/src/components/LpWindow.vue +373 -0
  539. package/src/components/LpWorkspaceSwitcher.vue +116 -0
  540. package/src/components/PickerField.vue +2 -2
  541. package/src/components/SliderRail.vue +10 -0
  542. package/src/components/address.ts +3 -1
  543. package/src/components/appShell.ts +74 -0
  544. package/src/components/calendar.ts +12 -5
  545. package/src/components/chart.ts +27 -3
  546. package/src/components/chartWindow.ts +198 -0
  547. package/src/components/color.ts +2 -1
  548. package/src/components/commandPalette.ts +66 -5
  549. package/src/components/controlSize.ts +6 -0
  550. package/src/components/dropdown.ts +3 -0
  551. package/src/components/exportData.ts +33 -18
  552. package/src/components/fileTree.ts +215 -0
  553. package/src/components/identicon.ts +4 -2
  554. package/src/components/logTools.ts +298 -0
  555. package/src/components/meter.ts +2 -1
  556. package/src/components/pipeline.ts +6 -0
  557. package/src/components/relativeTime.ts +2 -1
  558. package/src/components/reveal.ts +3 -1
  559. package/src/components/scrollbar.ts +71 -0
  560. package/src/components/select.ts +14 -0
  561. package/src/components/sidebar.ts +1 -0
  562. package/src/components/tableFeatures.ts +149 -0
  563. package/src/components/topologyGraph.ts +655 -0
  564. package/src/components/tour.ts +5 -3
  565. package/src/components/videoBackdrop.ts +7 -6
  566. package/src/composables/clamp.ts +2 -0
  567. package/src/composables/devWarn.ts +19 -0
  568. package/src/composables/easing.ts +37 -12
  569. package/src/composables/overlayHistory.ts +24 -0
  570. package/src/composables/pointerDrag.ts +54 -0
  571. package/src/composables/propCheck.ts +105 -0
  572. package/src/composables/realm.ts +25 -0
  573. package/src/composables/scroll.ts +4 -2
  574. package/src/composables/scrollMemory.ts +56 -14
  575. package/src/composables/spatialNav.ts +2 -1
  576. package/src/composables/textEntry.ts +33 -0
  577. package/src/composables/useAsyncTask.ts +6 -0
  578. package/src/composables/useChartSync.ts +52 -0
  579. package/src/composables/useCloseGuard.ts +22 -10
  580. package/src/composables/useCommands.ts +123 -0
  581. package/src/composables/useField.ts +41 -2
  582. package/src/composables/useFitScale.ts +4 -1
  583. package/src/composables/useFormDraft.ts +38 -14
  584. package/src/composables/useHintSystem.ts +2 -2
  585. package/src/composables/useHotkeys.ts +19 -48
  586. package/src/composables/useInView.ts +2 -1
  587. package/src/composables/useInputFilter.ts +8 -5
  588. package/src/composables/useInputMask.ts +8 -3
  589. package/src/composables/useLinkedView.ts +222 -0
  590. package/src/composables/useOptimisticToggle.ts +7 -1
  591. package/src/composables/useOverlayHistory.ts +20 -0
  592. package/src/composables/usePaintSelect.ts +20 -14
  593. package/src/composables/usePaletteCommands.ts +18 -2
  594. package/src/composables/usePersisted.ts +10 -0
  595. package/src/composables/usePillTransition.ts +9 -6
  596. package/src/composables/useResizeObserver.ts +2 -1
  597. package/src/composables/useReveal.ts +2 -1
  598. package/src/composables/useRovingFocus.ts +11 -14
  599. package/src/composables/useScramble.ts +12 -1
  600. package/src/composables/useShift.ts +8 -6
  601. package/src/composables/useTilt.ts +2 -1
  602. package/src/composables/useTween.ts +10 -5
  603. package/src/composables/useView.ts +17 -3
  604. package/src/composables/useZoomPan.ts +2 -5
  605. package/src/composables/windowing.ts +190 -0
  606. package/src/icons.ts +27 -6
  607. package/src/index.ts +42 -4
  608. package/src/kit-icons.ts +1 -1
  609. package/src/layout/tree.ts +31 -16
  610. package/src/layout/useLayout.ts +6 -0
  611. package/src/layout/useWorkspaces.ts +234 -0
  612. package/src/nuxt.ts +9 -1
  613. package/src/runtime/propCheck.plugin.ts +10 -0
  614. package/src/theme/studio.ts +7 -5
  615. package/src/theme/useTheme.ts +89 -15
  616. package/src/tokens/tokens.css +8 -1
  617. package/dist/assets/LpTabs-CJ0rYQbx.css +0 -18
  618. package/dist/chunks/LpAppShell-Dgejipzz.js +0 -319
  619. package/dist/chunks/LpFileTree-CooHinsC.js +0 -425
  620. package/dist/chunks/LpThemeProvider-8MG6yqU9.js +0 -640
  621. package/dist/chunks/LpTopologyCanvas-B1gIbS0n.js +0 -298
@@ -6,6 +6,7 @@ export default { inheritAttrs: false }
6
6
  </script>
7
7
 
8
8
  <script setup lang="ts">
9
+ import SliderRail from "./SliderRail.vue"
9
10
  import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
10
11
  /*
11
12
  * Two thumbs on one track: a range rather than a value. A price "from – to",
@@ -14,8 +15,8 @@ import { usePaletteControl, type PaletteControlOptions } from "../composables/us
14
15
  * Each thumb can carry a label above it (`format`), shown while it is hovered,
15
16
  * focused or dragged, so the numbers are readable without a second readout.
16
17
  */
17
- import { SliderRange, SliderRoot, SliderThumb, SliderTrack } from "reka-ui"
18
- import { useFieldControl } from "../composables/useField"
18
+ import { SliderRoot, SliderThumb } from "reka-ui"
19
+ import { useFieldControl, mergeDescribedBy } from "../composables/useField"
19
20
  import { useMergedAttrs } from "../composables/useMergedClass"
20
21
  import { SLIDER_GLIDE, useSliderDrag } from "./slider"
21
22
 
@@ -87,16 +88,14 @@ usePaletteControl({ disabled: () => field.value.disabled })
87
88
  @update:model-value="onUpdate"
88
89
  @value-commit="onCommit"
89
90
  >
90
- <SliderTrack class="relative h-1.5 grow overflow-hidden rounded-pill bg-surface-soft">
91
- <SliderRange class="absolute h-full rounded-pill bg-brand" />
92
- </SliderTrack>
91
+ <SliderRail />
93
92
  <SliderThumb
94
93
  v-for="index in [0, 1] as const"
95
94
  :key="index"
96
95
  :id="index === 0 ? field.id : undefined"
97
96
  :aria-label="ariaLabels?.[index]"
98
97
  :aria-labelledby="ariaLabels ? undefined : field.labelId"
99
- :aria-describedby="field.describedBy"
98
+ :aria-describedby="mergeDescribedBy(rest['aria-describedby'], field.describedBy)"
100
99
  :class="thumbClass"
101
100
  >
102
101
  <span v-if="format" :class="labelClass">{{ format(props.modelValue[index]) }}</span>
@@ -85,7 +85,7 @@ function play(node: HTMLElement) {
85
85
  if (props.immediate || prefersReducedMotion() || typeof node.animate !== "function") return
86
86
  const from = revealFrom(props.preset, props.direction, props.distance)
87
87
  const frames = [from, revealTo(from)]
88
- const easing = easingToken("ease-emphasized")
88
+ const easing = easingToken("ease-emphasized", undefined, node)
89
89
  // `backwards` holds each target in its hidden state through its delay, so a
90
90
  // staggered child does not flash in before its turn.
91
91
  const targets = props.stagger > 0 ? Array.from(node.children) : [node]
@@ -13,7 +13,20 @@ import {
13
13
  ScrollAreaThumb,
14
14
  ScrollAreaViewport,
15
15
  } from "reka-ui"
16
- import { prefersReducedMotion } from "../composables/easing"
16
+ import { nodeWindow } from "../composables/useView"
17
+ import {
18
+ BAR_FADE,
19
+ BAR_X,
20
+ BAR_X_SIZE,
21
+ BAR_Y,
22
+ BAR_Y_SIZE,
23
+ pageToward,
24
+ SCROLL_HIDE_DELAY_MS,
25
+ THUMB_X,
26
+ THUMB_X_ROUND,
27
+ THUMB_Y,
28
+ THUMB_Y_ROUND,
29
+ } from "./scrollbar"
17
30
 
18
31
  // `fade` softens whichever of the top/bottom edges currently has content beyond
19
32
  // it, so a clipped list reads as continuing rather than as cut off. On by
@@ -79,8 +92,7 @@ function onViewportBlur() {
79
92
  // `opacity-0` + the hidden-state fade is what keeps the bar invisible at rest:
80
93
  // with force-mount the element stays in the DOM, so a one-shot fade-out alone
81
94
  // would snap back to visible once the animation finished.
82
- const barFade =
83
- "opacity-0 data-[state=visible]:animate-[fade-in_180ms_ease] data-[state=visible]:opacity-100 data-[state=hidden]:animate-[fade-out_240ms_ease]"
95
+ const edge = computed(() => (props.floating ? "floating" : "wall"))
84
96
 
85
97
  // Dragging the thumb pulls the pointer off the bar and across the content, and
86
98
  // the browser reads that as a text selection — the rows highlight blue while
@@ -122,7 +134,9 @@ function measureEdges(el: HTMLElement) {
122
134
  * it has to come off the element.
123
135
  *
124
136
  * Kept in sync with content size rather than set once: a list that fills in
125
- * later becomes scrollable without anything else changing.
137
+ * later becomes scrollable without anything else changing. The viewport's
138
+ * tabindex is therefore this component's alone; `tabindex` on LpScrollArea
139
+ * lands on its root and does not reach it.
126
140
  */
127
141
  function syncViewportFocusable(el: HTMLElement) {
128
142
  const scrollable = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth
@@ -161,8 +175,10 @@ watch(
161
175
  }
162
176
  remeasure()
163
177
 
164
- if (typeof ResizeObserver !== "undefined") {
165
- edgeResize = new ResizeObserver(remeasure)
178
+ // The element's own window: the observers belong to the realm they watch.
179
+ const win = nodeWindow(el)
180
+ if (win.ResizeObserver) {
181
+ edgeResize = new win.ResizeObserver(remeasure)
166
182
  edgeResize.observe(el)
167
183
  // Watching the children too, since a grid that reflows into more rows
168
184
  // grows the content box without the viewport's own size moving.
@@ -171,8 +187,8 @@ watch(
171
187
  // Rows arriving after the first paint are the common case — a list waiting
172
188
  // on a query renders empty, and observing only the boxes that existed then
173
189
  // left the fade off until something else happened to trigger a measure.
174
- if (typeof MutationObserver !== "undefined") {
175
- edgeMutation = new MutationObserver(() => {
190
+ if (win.MutationObserver) {
191
+ edgeMutation = new win.MutationObserver(() => {
176
192
  if (edgeResize) {
177
193
  edgeResize.disconnect()
178
194
  edgeResize.observe(el)
@@ -186,16 +202,15 @@ watch(
186
202
  { immediate: true, flush: "post" },
187
203
  )
188
204
 
189
- onBeforeUnmount(stopEdgeWatch)
205
+ onBeforeUnmount(() => {
206
+ stopEdgeWatch()
207
+ stopThumbDrag?.()
208
+ })
190
209
 
191
210
  /*
192
- * A press on the bar beside the thumb. reka treats any press on the track as
193
- * "put the thumb's middle under the pointer" and sets the scroll in one go,
194
- * so a press that just missed the narrow thumb yanked the content by half a
195
- * thumb, and a press further away teleported it. Like a native bar, a press
196
- * off the thumb now pages one viewport towards the pointer, smoothly; the
197
- * thumb itself has a hit area as wide as the bar (see its `before:`), so a
198
- * press that meant to grab it does.
211
+ * A press on the bar beside the thumb pages towards the pointer (pageToward)
212
+ * instead of reka's jump; the thumb's hit area is as wide as the bar (its
213
+ * `before:`), so a press that meant to grab it does.
199
214
  */
200
215
  function onTrackPointerDown(event: PointerEvent, axis: "x" | "y") {
201
216
  const el = viewportEl.value
@@ -205,23 +220,29 @@ function onTrackPointerDown(event: PointerEvent, axis: "x" | "y") {
205
220
  event.preventDefault()
206
221
  event.stopImmediatePropagation()
207
222
  const rect = thumb.getBoundingClientRect()
208
- const before = axis === "y" ? event.clientY < rect.top : event.clientX < rect.left
209
- const step = (axis === "y" ? el.clientHeight : el.clientWidth) * 0.85 * (before ? -1 : 1)
210
- const behavior = prefersReducedMotion() ? "auto" : "smooth"
211
- el.scrollBy(axis === "y" ? { top: step, behavior } : { left: step, behavior })
223
+ pageToward(el, axis, axis === "y" ? event.clientY < rect.top : event.clientX < rect.left)
212
224
  }
213
225
 
214
- function onThumbPointerDown() {
226
+ let stopThumbDrag: (() => void) | null = null
227
+
228
+ function onThumbPointerDown(event: PointerEvent) {
215
229
  dragging.value = true
230
+ stopThumbDrag?.()
231
+ // The thumb's own window: inside an LpFrame the page's never hears the release.
232
+ const win = nodeWindow(event.currentTarget as Node)
216
233
  const stop = () => {
217
234
  dragging.value = false
218
- window.removeEventListener("pointerup", stop)
219
- window.removeEventListener("pointercancel", stop)
235
+ win.removeEventListener("pointerup", stop)
236
+ win.removeEventListener("pointercancel", stop)
237
+ win.removeEventListener("lostpointercapture", stop)
238
+ stopThumbDrag = null
220
239
  }
240
+ stopThumbDrag = stop
221
241
  // Bound on the window: the pointer is captured by the thumb, and the release
222
242
  // routinely happens far outside the scroll area.
223
- window.addEventListener("pointerup", stop)
224
- window.addEventListener("pointercancel", stop)
243
+ win.addEventListener("pointerup", stop)
244
+ win.addEventListener("pointercancel", stop)
245
+ win.addEventListener("lostpointercapture", stop)
225
246
  }
226
247
  </script>
227
248
 
@@ -236,7 +257,7 @@ function onThumbPointerDown() {
236
257
  class="relative flex flex-col overflow-hidden"
237
258
  :class="dragging ? 'select-none' : undefined"
238
259
  type="hover"
239
- :scroll-hide-delay="500"
260
+ :scroll-hide-delay="SCROLL_HIDE_DELAY_MS"
240
261
  >
241
262
  <!-- The bar itself is a pointer target far wider than it looks: the visible
242
263
  rail is the thumb, sized below, while the track pads it out to a
@@ -256,8 +277,8 @@ function onThumbPointerDown() {
256
277
  <ScrollAreaScrollbar
257
278
  orientation="vertical"
258
279
  force-mount
259
- class="group z-1 flex touch-none select-none justify-end pl-2.5"
260
- :class="[barFade, floating ? 'w-4 py-1 pr-1' : 'w-3.5 py-px pr-px']"
280
+ class="z-1"
281
+ :class="[BAR_Y, BAR_FADE, BAR_Y_SIZE[edge]]"
261
282
  :style="barInsetTop ? { marginTop: barInsetTop } : undefined"
262
283
  @pointerdown.capture="onTrackPointerDown($event, 'y')"
263
284
  >
@@ -269,22 +290,22 @@ function onThumbPointerDown() {
269
290
  the positioning reka owns. -->
270
291
  <ScrollAreaThumb
271
292
  data-lp-thumb
272
- class="relative min-w-1 bg-brand/40 before:absolute before:inset-y-0 before:right-0 before:-left-2.5 before:content-[''] transition-[min-width,background-color] duration-[var(--duration-fast)] group-hover:min-w-1.5 group-hover:bg-brand"
273
- :class="floating ? 'rounded-pill' : 'rounded-l-pill'"
293
+ class="relative"
294
+ :class="[THUMB_Y, THUMB_Y_ROUND[edge]]"
274
295
  @pointerdown="onThumbPointerDown"
275
296
  />
276
297
  </ScrollAreaScrollbar>
277
298
 
278
299
  <ScrollAreaScrollbar
279
300
  orientation="horizontal"
280
- class="group z-1 flex flex-col touch-none select-none justify-end pt-2.5"
281
- :class="[barFade, floating ? 'h-4 px-1 pb-1' : 'h-3.5 px-px pb-px']"
301
+ class="z-1"
302
+ :class="[BAR_X, BAR_FADE, BAR_X_SIZE[edge]]"
282
303
  @pointerdown.capture="onTrackPointerDown($event, 'x')"
283
304
  >
284
305
  <ScrollAreaThumb
285
306
  data-lp-thumb
286
- class="relative min-h-1 bg-brand/40 before:absolute before:inset-x-0 before:bottom-0 before:-top-2.5 before:content-[''] transition-[min-height,background-color] duration-[var(--duration-fast)] group-hover:min-h-1.5 group-hover:bg-brand"
287
- :class="floating ? 'rounded-pill' : 'rounded-t-pill'"
307
+ class="relative"
308
+ :class="[THUMB_X, THUMB_X_ROUND[edge]]"
288
309
  @pointerdown="onThumbPointerDown"
289
310
  />
290
311
  </ScrollAreaScrollbar>
@@ -12,6 +12,7 @@ export interface SecretFieldLabels extends Record<string, string> {
12
12
  </script>
13
13
 
14
14
  <script setup lang="ts">
15
+ import { isElement } from "../composables/useView"
15
16
  import { suppressPaletteDiscovery } from "../composables/usePaletteCommands"
16
17
  /*
17
18
  * A value someone must be able to read and copy but should not have on screen
@@ -159,7 +160,7 @@ const field = ref<{ $el?: Element } | null>(null)
159
160
  watch(revealed, () => {
160
161
  if (!props.input || prefersReducedMotion()) return
161
162
  const el = field.value?.$el
162
- const input = el instanceof Element ? el.querySelector("input") : null
163
+ const input = isElement(el) ? el.querySelector("input") : null
163
164
  input?.animate([{ filter: "blur(4px)", opacity: 0.35 }, { filter: "blur(0)", opacity: 1 }], {
164
165
  duration: 260,
165
166
  easing: "cubic-bezier(0.2, 0, 0, 1)",
@@ -6,6 +6,8 @@ export default { inheritAttrs: false }
6
6
  </script>
7
7
 
8
8
  <script setup lang="ts">
9
+ import { CONTROL_SIZE } from "./controlSize"
10
+ import { isHTMLElement } from "../composables/useView"
9
11
  import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
10
12
  /*
11
13
  * Segmented control — a compact bar of mutually-exclusive options with a sliding
@@ -17,7 +19,7 @@ import { usePaletteControl, type PaletteControlOptions } from "../composables/us
17
19
  import { Motion } from "motion-v"
18
20
  import { ToggleGroupItem, ToggleGroupRoot } from "reka-ui"
19
21
  import { ref, useId } from "vue"
20
- import { useFieldControl } from "../composables/useField"
22
+ import { useFieldControl, mergeDescribedBy } from "../composables/useField"
21
23
  import { useMergedAttrs } from "../composables/useMergedClass"
22
24
  import { usePillTransition } from "../composables/usePillTransition"
23
25
  import AttentionDot from "./AttentionDot.vue"
@@ -66,11 +68,7 @@ function onChange(v: unknown) {
66
68
  if (typeof v === "string" && v) emit("update:modelValue", v)
67
69
  }
68
70
 
69
- const sizeCls = {
70
- sm: "h-(--size-control-sm) text-xs",
71
- md: "h-(--size-control-md) text-sm",
72
- lg: "h-(--size-control-lg) text-sm",
73
- }
71
+ const sizeCls = CONTROL_SIZE
74
72
 
75
73
  // The bar sizes itself from `size` and `block`, which is right until a consumer
76
74
  // needs it flush against something — `class="p-0"` and `class="rounded-none"`
@@ -109,7 +107,7 @@ function pillUnder(value: string): boolean {
109
107
  */
110
108
  function releaseFocusAfterPointer(event: PointerEvent) {
111
109
  const target = event.currentTarget
112
- if (target instanceof HTMLElement) target.blur()
110
+ if (isHTMLElement(target)) target.blur()
113
111
  }
114
112
 
115
113
  usePaletteControl({ disabled: () => field.value.disabled })
@@ -121,10 +119,10 @@ usePaletteControl({ disabled: () => field.value.disabled })
121
119
  type="single"
122
120
  :disabled="field.disabled"
123
121
  :aria-labelledby="field.labelId"
124
- :aria-describedby="field.describedBy"
125
122
  :rovingFocus="true"
126
123
  :class="rootClass"
127
124
  v-bind="rest"
125
+ :aria-describedby="mergeDescribedBy(rest['aria-describedby'], field.describedBy)"
128
126
  @update:model-value="onChange"
129
127
  @pointerleave="hovered = null"
130
128
  >
@@ -16,6 +16,8 @@ export type SelectLabels = {
16
16
  </script>
17
17
 
18
18
  <script setup lang="ts" generic="V extends SelectValue = string">
19
+ import IconCloseButton from "./IconCloseButton.vue"
20
+ import { CONTROL_SIZE } from "./controlSize"
19
21
  import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
20
22
  /*
21
23
  * One select to rule them all — built on reka-ui Combobox.
@@ -37,7 +39,7 @@ import {
37
39
  ComboboxViewport,
38
40
  } from "reka-ui"
39
41
  import { computed, nextTick, reactive, ref, useAttrs, useId, watch } from "vue"
40
- import { useFieldBlur, useFieldControl } from "../composables/useField"
42
+ import { useFieldBlur, useFieldControl, mergeDescribedBy } from "../composables/useField"
41
43
  import { useLabels } from "../composables/useLpConfig"
42
44
  import { useMergedAttrs } from "../composables/useMergedClass"
43
45
  import { OPTION_ITEM, optionStagger, POPOVER_PANEL } from "./dropdown"
@@ -45,8 +47,8 @@ import LpIcon from "./LpIcon.vue"
45
47
  import OptionContent from "./OptionContent.vue"
46
48
  import LpRollingText from "./LpRollingText.vue"
47
49
  import type { LpOptionBase, OptionSelection } from "./options"
48
- import { fitChips, toggledValues } from "./select"
49
- import { useOutsideGuard, usePortalTarget } from "../composables/useView"
50
+ import { evictOldest, fitChips, toggledValues } from "./select"
51
+ import { nodeWindow, useOutsideGuard, usePortalTarget } from "../composables/useView"
50
52
  import { useResizeObserver } from "../composables/useResizeObserver"
51
53
 
52
54
  export type SelectValue = string | number
@@ -105,11 +107,7 @@ const props = withDefaults(
105
107
  )
106
108
 
107
109
  /* The text steps with the height, as in every other kit field: a small select beside a small input read a size larger. */
108
- const SIZE_HEIGHT = {
109
- sm: "h-(--size-control-sm) text-xs",
110
- md: "h-(--size-control-md) text-sm",
111
- lg: "h-(--size-control-lg) text-sm",
112
- } as const
110
+ const SIZE_HEIGHT = CONTROL_SIZE
113
111
  const anchorHeight = computed(() => SIZE_HEIGHT[props.size])
114
112
 
115
113
  const field = useFieldControl(() => ({
@@ -189,7 +187,38 @@ async function openFromKeyboard(event: KeyboardEvent) {
189
187
  const items = panel?.querySelectorAll<HTMLElement>('[role="option"]:not([data-disabled])')
190
188
  const selected = panel?.querySelector<HTMLElement>('[role="option"][aria-selected="true"]:not([data-disabled])')
191
189
  const target = search ?? selected ?? (event.key === "ArrowUp" ? items?.[items.length - 1] : items?.[0])
192
- target?.focus()
190
+ // Something else may have kept the list shut: nothing to move into then.
191
+ if (isOpen.value) target?.focus()
192
+ }
193
+
194
+ /*
195
+ * reka reads the arrow keys from the search box. A list without one takes focus
196
+ * on an option, where its own handling put focus straight back on the option
197
+ * the list opened on, so that was all a keyboard could ever pick. Taken here,
198
+ * ahead of it.
199
+ */
200
+ const LIST_KEYS = ["ArrowDown", "ArrowUp", "Home", "End", "Enter"]
201
+
202
+ function moveInList(event: KeyboardEvent) {
203
+ if (props.searchable || serverSide.value || !LIST_KEYS.includes(event.key)) return
204
+ const list = event.currentTarget as HTMLElement
205
+ const items = Array.from(list.querySelectorAll<HTMLElement>('[role="option"]:not([data-disabled])'))
206
+ if (!items.length) return
207
+ event.preventDefault()
208
+ event.stopPropagation()
209
+ const at = items.indexOf(list.ownerDocument.activeElement as HTMLElement)
210
+ if (event.key === "Enter") {
211
+ items[at]?.click()
212
+ return
213
+ }
214
+ const last = items.length - 1
215
+ const next = {
216
+ ArrowDown: at === last ? 0 : at + 1,
217
+ ArrowUp: at <= 0 ? last : at - 1,
218
+ Home: 0,
219
+ End: last,
220
+ }[event.key]
221
+ items[next ?? 0]?.focus()
193
222
  }
194
223
 
195
224
  // Leaving the field, not moving between its parts: the trigger and the list
@@ -219,7 +248,9 @@ function onListFocusOut(event: FocusEvent) {
219
248
  * The trigger's name. reka hard-codes aria-label="Show popup" on it, which hid
220
249
  * the field's label and the chosen value; aria-labelledby outranks aria-label,
221
250
  * so inside a labelled field the name is the label plus the value. On its own,
222
- * the consumer's aria-label, else the value or placeholder.
251
+ * the consumer's aria-label plus the value, else the value or placeholder: the
252
+ * name has to hold the text the button shows, or a voice user who says what
253
+ * they see ("click Alpha") cannot reach it (WCAG 2.5.3).
223
254
  */
224
255
  const attrs = useAttrs()
225
256
  const valueId = `lp-select-${useId()}-value`
@@ -227,7 +258,7 @@ const valueText = computed(() => (chips.value.length ? chipNames.value : display
227
258
  const triggerName = computed(() =>
228
259
  field.value.labelId
229
260
  ? { "aria-labelledby": `${field.value.labelId} ${valueId}`, "aria-label": undefined }
230
- : { "aria-label": (attrs["aria-label"] as string | undefined) ?? valueText.value },
261
+ : { "aria-label": [attrs["aria-label"] as string | undefined, valueText.value].filter(Boolean).join(", ") },
231
262
  )
232
263
 
233
264
  // reka's Combobox forbids an empty-string item value (it reserves "" for
@@ -281,6 +312,7 @@ const filtered = computed(() => {
281
312
  type Shown = { label: string; hint?: string; image?: string; icon?: string }
282
313
 
283
314
  const remembered = reactive(new Map<SelectValue, Shown>())
315
+ const REMEMBERED_LIMIT = 500
284
316
 
285
317
  function fromOption(o: SelectOption<V>): Shown {
286
318
  return { label: o.label, hint: o.description, image: o.image, icon: o.icon }
@@ -291,6 +323,7 @@ function remember(values: readonly SelectValue[]) {
291
323
  const o = props.options.find((x) => x.value === v)
292
324
  if (o) remembered.set(v, fromOption(o))
293
325
  }
326
+ evictOldest(remembered, new Set(values), REMEMBERED_LIMIT)
294
327
  }
295
328
 
296
329
  const modelList = computed<V[]>(() => {
@@ -355,7 +388,7 @@ function measure() {
355
388
  if (!row || !probe) return
356
389
  const kids = Array.from(probe.children) as HTMLElement[]
357
390
  const more = kids.pop()
358
- const gap = Number.parseFloat(getComputedStyle(probe).columnGap) || 0
391
+ const gap = Number.parseFloat(nodeWindow(probe).getComputedStyle(probe).columnGap) || 0
359
392
  fit.value = fitChips(
360
393
  kids.map((k) => k.offsetWidth),
361
394
  row.clientWidth,
@@ -365,6 +398,9 @@ function measure() {
365
398
  }
366
399
 
367
400
  useResizeObserver(chipRow, () => measure())
401
+ // The chips can change width while the row keeps its own: a web font arriving,
402
+ // a theme. The probe is as wide as they are, so it notices.
403
+ useResizeObserver(probeRow, () => measure())
368
404
  watch(chips, () => void nextTick(measure), { flush: "post", deep: true })
369
405
 
370
406
  const shownChips = computed(() => chips.value.slice(0, fit.value))
@@ -451,7 +487,7 @@ usePaletteControl({ disabled: () => field.value.disabled, invalid: () => field.v
451
487
  @keydown="openFromKeyboard"
452
488
  v-bind="triggerName"
453
489
  :aria-invalid="field.invalid || undefined"
454
- :aria-describedby="field.describedBy"
490
+ :aria-describedby="mergeDescribedBy(rootAttrs['aria-describedby'], field.describedBy)"
455
491
  class="flex min-w-0 flex-1 items-center gap-2 outline-none"
456
492
  >
457
493
  <!-- Several picks read as chips (picture + name) that collapse into
@@ -527,20 +563,13 @@ usePaletteControl({ disabled: () => field.value.disabled, invalid: () => field.v
527
563
  </LpRollingText>
528
564
  </template>
529
565
  </ComboboxTrigger>
530
- <button
566
+ <IconCloseButton
531
567
  v-if="clearable && hasValue && !field.disabled"
532
- type="button"
533
- class="group flex shrink-0 items-center text-muted outline-none transition-colors duration-[var(--duration-fast)] hover:text-ink"
534
- :aria-label="labels.clear"
568
+ inline
569
+ :label="labels.clear"
535
570
  @pointerdown.prevent
536
571
  @click="clear"
537
- >
538
- <LpIcon
539
- name="lucide:x"
540
- :size="16"
541
- class="transition-transform duration-200 ease-[var(--ease-emphasized)] group-hover:rotate-90 group-active:scale-90 motion-reduce:group-hover:rotate-0"
542
- />
543
- </button>
572
+ />
544
573
  <!-- A second way in for the pointer only: the main trigger already owns
545
574
  focus and the accessible name, so this one stays out of the tab order
546
575
  and the accessibility tree. -->
@@ -565,6 +594,7 @@ usePaletteControl({ disabled: () => field.value.disabled, invalid: () => field.v
565
594
  <ComboboxContent
566
595
  :data-lp-field-part="partId"
567
596
  @focusout="onListFocusOut"
597
+ @keydown.capture="moveInList"
568
598
  @interact-outside="guardOutside"
569
599
  @escape-key-down="guardOutside"
570
600
  position="popper"
@@ -5,7 +5,7 @@
5
5
  * depends_on edges connect these across host frames. Tailwind utilities only
6
6
  * (no scoped CSS) so styles reach consumer apps via @source.
7
7
  */
8
- import { Handle, Position } from "@vue-flow/core"
8
+ import { Handle, Position, type NodeProps } from "@vue-flow/core"
9
9
  import { computed } from "vue"
10
10
 
11
11
  export interface ServiceNodeData {
@@ -16,7 +16,9 @@ export interface ServiceNodeData {
16
16
  dimmed?: boolean
17
17
  }
18
18
 
19
- const props = defineProps<{ data: ServiceNodeData; selected?: boolean }>()
19
+ // Vue Flow hands a custom node all of NodeProps. Declared, they stop falling
20
+ // through onto the node's root as attributes (position="[object Object]").
21
+ const props = defineProps<Omit<NodeProps<ServiceNodeData>, "selected"> & { selected?: boolean }>()
20
22
 
21
23
  const kindVar: Record<string, string> = {
22
24
  service: "var(--color-brand)",
@@ -35,6 +35,8 @@ export default { inheritAttrs: false }
35
35
  * - Unmounting releases the GL context, so a page that mounts and unmounts
36
36
  * backdrops does not run into the browser's limit on live contexts.
37
37
  */
38
+ import { clamp } from "../composables/clamp"
39
+ import { nodeWindow } from "../composables/useView"
38
40
  import { computed, onBeforeUnmount, onMounted, ref, watch } from "vue"
39
41
  import { parseColor } from "./color"
40
42
  import { approach, frameDue, FRAGMENT_HEADER, PRESETS, tooSlow, VERTEX_SHADER, type ShaderPreset, type Vec3 } from "./shaderBackdrop"
@@ -95,7 +97,7 @@ const weakEngine = typeof navigator !== "undefined" && isBrokenBackdropEngine()
95
97
  const fallbackStyle = computed(() => ({ background: PRESETS[props.preset].fallback, opacity: Math.min(1, clamp01(props.intensity) * 1.15) }))
96
98
 
97
99
  function clamp01(n: number) {
98
- return Math.max(0, Math.min(1, n))
100
+ return clamp(n, 0, 1)
99
101
  }
100
102
 
101
103
  // ── Theme colours ───────────────────────────────────────────────────────────
@@ -115,10 +117,10 @@ let paint: CanvasRenderingContext2D | null = null
115
117
  function tokenColor(name: string): Vec3 {
116
118
  if (!probe || !root.value) return [0, 0, 0]
117
119
  probe.style.color = `var(--color-${name})`
118
- const css = getComputedStyle(probe).color
120
+ const css = nodeWindow(probe).getComputedStyle(probe).color
119
121
  const rgb = parseColor(css)
120
122
  if (rgb) return [rgb.r / 255, rgb.g / 255, rgb.b / 255]
121
- paint ??= document.createElement("canvas").getContext("2d", { willReadFrequently: true })
123
+ paint ??= probe.ownerDocument.createElement("canvas").getContext("2d", { willReadFrequently: true })
122
124
  if (!paint) return [0, 0, 0]
123
125
  paint.clearRect(0, 0, 1, 1)
124
126
  paint.fillStyle = "#000"
@@ -204,7 +206,7 @@ let pixelRatio = 1
204
206
  function sizeCanvas() {
205
207
  const el = canvas.value
206
208
  if (!el) return
207
- const dpr = Math.min(weakEngine ? 1 : 2, window.devicePixelRatio || 1)
209
+ const dpr = Math.min(weakEngine ? 1 : 2, nodeWindow(el).devicePixelRatio || 1)
208
210
  pixelRatio = dpr * PRESETS[props.preset].scale
209
211
  const w = Math.max(1, Math.round(el.clientWidth * pixelRatio))
210
212
  const h = Math.max(1, Math.round(el.clientHeight * pixelRatio))
@@ -351,16 +353,17 @@ useResizeObserver(root, () => {
351
353
  })
352
354
 
353
355
  onMounted(() => {
354
- probe = document.createElement("span")
356
+ const page = root.value?.ownerDocument ?? document
357
+ probe = page.createElement("span")
355
358
  probe.style.display = "none"
356
359
  root.value?.appendChild(probe)
357
360
 
358
361
  // Themes are applied as variables and attributes on <html>; a scheme switch can also come from the OS.
359
- themeObserver = new MutationObserver(() => {
362
+ themeObserver = new (nodeWindow(page).MutationObserver)(() => {
360
363
  if (gl) refreshPalette()
361
364
  })
362
- themeObserver.observe(document.documentElement, { attributes: true, attributeFilter: ["style", "class", "data-theme", "data-theme-mode"] })
363
- schemeQuery = window.matchMedia?.("(prefers-color-scheme: dark)")
365
+ themeObserver.observe(page.documentElement, { attributes: true, attributeFilter: ["style", "class", "data-theme", "data-theme-mode"] })
366
+ schemeQuery = nodeWindow(page).matchMedia?.("(prefers-color-scheme: dark)")
364
367
  schemeQuery?.addEventListener("change", refreshPalette)
365
368
 
366
369
  if (wantGl.value) start()
@@ -391,7 +394,7 @@ watch(
391
394
  }
392
395
  drawFrame()
393
396
  shown.value = true
394
- }, durationToken("duration-medium"))
397
+ }, durationToken("duration-medium", undefined, root.value ?? undefined))
395
398
  },
396
399
  )
397
400
  watch(