@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
@@ -0,0 +1,30 @@
1
+ const NAV_BREAKPOINT_PX = { sm: 640, md: 768, lg: 1024, xl: 1280, "2xl": 1536 };
2
+ const DENSITY_CLASS = {
3
+ comfortable: "px-4 py-6 md:px-6",
4
+ compact: "px-2 py-3 md:px-3",
5
+ auto: "px-2 py-3 sm:px-4 sm:py-4 md:px-6 md:py-6"
6
+ };
7
+ function resolveNavMode(atLeast, options) {
8
+ if (!atLeast(options.mobileBreakpoint)) return options.bottomNav ? "bottom" : "drawer";
9
+ return options.compactBelow && !atLeast(options.compactBelow) ? "compact" : "rail";
10
+ }
11
+ const SHELL_HEADER_PX = 64;
12
+ const SCROLL_SLOP_PX = 8;
13
+ function headerCollapsedAfter(collapsed, from, to, maxTop, slop = SCROLL_SLOP_PX) {
14
+ if (to <= SHELL_HEADER_PX) return false;
15
+ if (to >= maxTop - SHELL_HEADER_PX) return collapsed;
16
+ if (to - from > slop) return true;
17
+ if (from - to > slop) return false;
18
+ return collapsed;
19
+ }
20
+ function contextNavItems(items, isActive) {
21
+ return items.find((item) => item.children?.length && (isActive(item) || item.children.some(isActive)))?.children ?? [];
22
+ }
23
+ export {
24
+ DENSITY_CLASS,
25
+ NAV_BREAKPOINT_PX,
26
+ SHELL_HEADER_PX,
27
+ contextNavItems,
28
+ headerCollapsedAfter,
29
+ resolveNavMode
30
+ };
@@ -9,12 +9,21 @@ export declare const CALENDAR_NAV = "flex size-8 items-center justify-center rou
9
9
  /** The field a picker shows before it opens. */
10
10
  export declare const PICKER_TRIGGER = "group flex w-full items-center gap-2 rounded-control border bg-surface-soft px-3 text-left text-ink outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:border-brand disabled:cursor-not-allowed disabled:opacity-55";
11
11
  export declare const PICKER_SIZE: {
12
- readonly sm: "h-(--size-control-sm) text-xs";
13
- readonly md: "h-(--size-control-md) text-sm";
14
- readonly lg: "h-(--size-control-lg) text-sm";
12
+ sm: string;
13
+ md: string;
14
+ lg: string;
15
15
  };
16
16
  export declare function pickerTone(invalid: boolean): string;
17
17
  export declare const PICKER_CLEAR = "absolute top-1/2 right-[calc(0.75rem+15px+0.5rem)] flex -translate-y-1/2 items-center rounded-sm text-muted outline-none transition-colors hover:text-ink focus-visible:ring-2 focus-visible:ring-ring";
18
18
  /** Presets: a scrolling row over the calendar on a phone, a column beside it from `sm`. */
19
19
  export declare const PICKER_PRESETS = "flex gap-1 overflow-x-auto border-b border-line p-2 sm:flex-col sm:overflow-visible sm:border-r sm:border-b-0";
20
20
  export declare const PICKER_PRESET = "shrink-0 rounded-control px-2.5 py-1.5 text-left text-sm whitespace-nowrap text-muted outline-none transition-colors duration-[var(--duration-fast)] hover:bg-surface-soft hover:text-ink focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40 aria-pressed:bg-brand-soft aria-pressed:text-ink";
21
+ /** The props the two pickers share. */
22
+ export interface PickerFieldProps {
23
+ clearable?: boolean;
24
+ disabled?: boolean;
25
+ invalid?: boolean;
26
+ size?: "sm" | "md" | "lg";
27
+ /** Locale of the shown date and the calendar; defaults to reka's ConfigProvider, then the browser. */
28
+ locale?: string;
29
+ }
@@ -1,12 +1,9 @@
1
+ import { CONTROL_SIZE } from "./controlSize.js";
1
2
  const CALENDAR_LABELS = { previous: "Previous month", next: "Next month" };
2
3
  const CALENDAR_FRAME = "inline-block rounded-card border border-line bg-surface-raised p-3";
3
4
  const CALENDAR_NAV = "flex size-8 items-center justify-center rounded-control text-muted outline-none transition-[color,background-color,scale] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] hover:bg-surface-soft hover:text-ink active:scale-90 motion-reduce:active:scale-100 focus-visible:ring-2 focus-visible:ring-ring";
4
5
  const PICKER_TRIGGER = "group flex w-full items-center gap-2 rounded-control border bg-surface-soft px-3 text-left text-ink outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:border-brand disabled:cursor-not-allowed disabled:opacity-55";
5
- const PICKER_SIZE = {
6
- sm: "h-(--size-control-sm) text-xs",
7
- md: "h-(--size-control-md) text-sm",
8
- lg: "h-(--size-control-lg) text-sm"
9
- };
6
+ const PICKER_SIZE = CONTROL_SIZE;
10
7
  function pickerTone(invalid) {
11
8
  return invalid ? "border-danger focus-visible:ring-danger-soft" : "border-line focus-visible:border-brand";
12
9
  }
@@ -52,6 +52,27 @@ export interface ChartMarker {
52
52
  label?: string;
53
53
  color?: string;
54
54
  }
55
+ /**
56
+ * A stretch of the x axis: a maintenance window, an incident, off hours. `from`
57
+ * and `to` are point indices or x labels. Drawn under the data.
58
+ */
59
+ export interface ChartBand {
60
+ from: number | string;
61
+ to: number | string;
62
+ label?: string;
63
+ color?: string;
64
+ }
65
+ /**
66
+ * A note pinned to one reading. `at` is a point index or an x label; `value`
67
+ * places it on the y axis and defaults to the first visible series there.
68
+ */
69
+ export interface ChartAnnotation {
70
+ at: number | string;
71
+ value?: number;
72
+ label: string;
73
+ color?: string;
74
+ axis?: ChartAxis;
75
+ }
55
76
  /**
56
77
  * Which x labels to print with every `stride`-th one shown. The last point is
57
78
  * always labelled (it is usually "now"), and when it lands within half a
@@ -1,3 +1,4 @@
1
+ import { clamp } from "../composables/clamp.js";
1
2
  import { compactNumber } from "./format.js";
2
3
  function xLabelIndices(count, stride) {
3
4
  if (count <= 0) return [];
@@ -142,8 +143,8 @@ const smoothSegment = (pts, tension) => {
142
143
  let c2y = p2.y - (p3.y - p1.y) / 6 * tension;
143
144
  const lo = Math.min(p1.y, p2.y);
144
145
  const hi = Math.max(p1.y, p2.y);
145
- c1y = Math.min(hi, Math.max(lo, c1y));
146
- c2y = Math.min(hi, Math.max(lo, c2y));
146
+ c1y = clamp(c1y, lo, hi);
147
+ c2y = clamp(c2y, lo, hi);
147
148
  d += `C${c1x},${c1y} ${c2x},${c2y} ${p2.x},${p2.y}`;
148
149
  }
149
150
  return d;
@@ -159,7 +160,7 @@ const segmentPath = (idx, values, s, smooth) => {
159
160
  };
160
161
  const linePath = (values, s, smooth) => runs(values, s.count).map((idx) => segmentPath(idx, values, s, smooth)).join(" ");
161
162
  const areaPath = (values, s, smooth) => {
162
- const base = yAt(Math.max(s.min, Math.min(s.max, 0)), s.min, s.max, s.box);
163
+ const base = yAt(clamp(0, s.min, s.max), s.min, s.max, s.box);
163
164
  return runs(values, s.count).map((idx) => {
164
165
  const d = segmentPath(idx, values, s, smooth);
165
166
  const x0 = xAt(idx[0], s.count, s.box, s.banded);
@@ -0,0 +1,57 @@
1
+ /** A window into the data: indices of its first and last point, both included. */
2
+ export interface ChartRange {
3
+ start: number;
4
+ end: number;
5
+ }
6
+ /** How a series longer than the plot is thinned. */
7
+ export type ChartDownsample = "minmax" | "lttb";
8
+ /** What the chart draws: per series values, each slot traced back to its source. */
9
+ export interface ChartView {
10
+ values: (number | null)[][];
11
+ start: number;
12
+ end: number;
13
+ /** Source index of every slot; null while the slots are contiguous from `start`. */
14
+ indices: number[] | null;
15
+ }
16
+ type Values = (number | null)[];
17
+ export declare const MIN_RANGE_POINTS = 2;
18
+ export declare const ZOOM_STEP = 0.8;
19
+ /**
20
+ * A range fit to the data: in bounds, ordered, at least `MIN_RANGE_POINTS` wide.
21
+ * Null when there is nothing to narrow, so the whole series stays the plain case.
22
+ */
23
+ export declare function clampRange(range: ChartRange | null | undefined, count: number): ChartRange | null;
24
+ /** The range after a zoom by `factor` (below 1 is in), keeping `anchor` (0–1 across it) in place. */
25
+ export declare function zoomRange(range: ChartRange | null, count: number, anchor: number, factor: number): ChartRange | null;
26
+ /** The range moved by `delta` points, keeping its width at the ends of the data. */
27
+ export declare function panRange(range: ChartRange, count: number, delta: number): ChartRange | null;
28
+ /**
29
+ * Keeps each bucket's lowest and highest reading, per series. Slots stay shared
30
+ * across series, so a bucket is two x positions and each series fills them with
31
+ * its own extremes. A monitoring chart must not lose a one-point spike: thinning
32
+ * by average or by every n-th point does exactly that.
33
+ */
34
+ export declare function minMaxBuckets(series: Values[], slots: number): {
35
+ values: Values[];
36
+ indices: number[];
37
+ };
38
+ /**
39
+ * Largest-Triangle-Three-Buckets: the indices of `target` points that keep a
40
+ * line's shape, one a bucket, always with its first and last. It reads better
41
+ * than min/max on a smooth curve and can drop a short spike, so it is the
42
+ * option rather than the default.
43
+ */
44
+ export declare function lttbIndices(values: Values, target: number): number[];
45
+ /**
46
+ * The series as drawn. Without a range or a thinning it hands the input back, so
47
+ * a chart using neither does no work and draws what it always drew.
48
+ *
49
+ * LTTB picks by the first series that has data and the others follow those
50
+ * points, because slots are shared across series.
51
+ */
52
+ export declare function chartView(series: Values[], count: number, range: ChartRange | null, mode: ChartDownsample | false | undefined, slots: number): ChartView;
53
+ /** The slot at or before a source index, or -1 when the window does not hold it. */
54
+ export declare function slotOf(view: ChartView, source: number): number;
55
+ /** The source index behind a slot. */
56
+ export declare const sourceOf: (view: ChartView, slot: number) => number;
57
+ export {};
@@ -0,0 +1,136 @@
1
+ import { clamp } from "../composables/clamp.js";
2
+ const MIN_RANGE_POINTS = 2;
3
+ const SLOTS_PER_BUCKET = 2;
4
+ const LTTB_MIN_TARGET = 3;
5
+ const ZOOM_STEP = 0.8;
6
+ function clampRange(range, count) {
7
+ if (!range || count <= MIN_RANGE_POINTS || !Number.isFinite(range.start) || !Number.isFinite(range.end)) return null;
8
+ const last = count - 1;
9
+ let start = Math.max(0, Math.min(last, Math.round(Math.min(range.start, range.end))));
10
+ let end = Math.max(0, Math.min(last, Math.round(Math.max(range.start, range.end))));
11
+ if (end - start + 1 < MIN_RANGE_POINTS) {
12
+ end = Math.min(last, start + MIN_RANGE_POINTS - 1);
13
+ start = Math.max(0, end - MIN_RANGE_POINTS + 1);
14
+ }
15
+ return start === 0 && end === last ? null : { start, end };
16
+ }
17
+ function zoomRange(range, count, anchor, factor) {
18
+ const from = range ?? { start: 0, end: count - 1 };
19
+ const span = from.end - from.start;
20
+ const next = Math.max(MIN_RANGE_POINTS - 1, span * factor);
21
+ const at = from.start + span * clamp(anchor, 0, 1);
22
+ const start = at - (at - from.start) * (next / (span || 1));
23
+ return clampRange({ start, end: start + next }, count);
24
+ }
25
+ function panRange(range, count, delta) {
26
+ const span = range.end - range.start;
27
+ const start = Math.max(0, Math.min(count - 1 - span, range.start + delta));
28
+ return clampRange({ start, end: start + span }, count);
29
+ }
30
+ function minMaxBuckets(series, slots) {
31
+ const count = series.reduce((n, values2) => Math.max(n, values2.length), 0);
32
+ const buckets = Math.floor(slots / SLOTS_PER_BUCKET);
33
+ if (count === 0 || buckets < 1) return { values: series.map(() => []), indices: [] };
34
+ const indices = [];
35
+ const values = series.map(() => []);
36
+ for (let bucket = 0; bucket < buckets; bucket++) {
37
+ const from = Math.floor(bucket * count / buckets);
38
+ const to = Math.floor((bucket + 1) * count / buckets);
39
+ if (to <= from) continue;
40
+ indices.push(from, Math.max(from, to - 1));
41
+ series.forEach((data, s) => {
42
+ let low = -1;
43
+ let high = -1;
44
+ for (let i = from; i < to && i < data.length; i++) {
45
+ const v = data[i];
46
+ if (v == null) continue;
47
+ if (low < 0 || v < data[low]) low = i;
48
+ if (high < 0 || v > data[high]) high = i;
49
+ }
50
+ if (low < 0) values[s].push(null, null);
51
+ else values[s].push(data[Math.min(low, high)], data[Math.max(low, high)]);
52
+ });
53
+ }
54
+ return { values, indices };
55
+ }
56
+ function lttbIndices(values, target) {
57
+ const present = values.flatMap((v, i) => v == null ? [] : [i]);
58
+ if (target >= present.length || target < LTTB_MIN_TARGET) return present;
59
+ const y = (at) => values[present[at]];
60
+ const x = (at) => present[at];
61
+ const step = (present.length - 2) / (target - 2);
62
+ const kept = [0];
63
+ let previous = 0;
64
+ for (let bucket = 0; bucket < target - 2; bucket++) {
65
+ const from = Math.floor(bucket * step) + 1;
66
+ const to = Math.floor((bucket + 1) * step) + 1;
67
+ const nextEnd = Math.min(present.length, Math.floor((bucket + 2) * step) + 1);
68
+ let meanX = 0;
69
+ let meanY = 0;
70
+ for (let i = to; i < nextEnd; i++) {
71
+ meanX += x(i);
72
+ meanY += y(i);
73
+ }
74
+ const size = Math.max(1, nextEnd - to);
75
+ meanX /= size;
76
+ meanY /= size;
77
+ let best = from;
78
+ let largest = -1;
79
+ for (let i = from; i < to; i++) {
80
+ const area = Math.abs((x(previous) - meanX) * (y(i) - y(previous)) - (x(previous) - x(i)) * (meanY - y(previous)));
81
+ if (area > largest) {
82
+ largest = area;
83
+ best = i;
84
+ }
85
+ }
86
+ kept.push(best);
87
+ previous = best;
88
+ }
89
+ kept.push(present.length - 1);
90
+ return kept.map((at) => present[at]);
91
+ }
92
+ const contiguous = (series, range) => series.map((values) => values.slice(range.start, range.end + 1));
93
+ function chartView(series, count, range, mode, slots) {
94
+ const start = range?.start ?? 0;
95
+ const end = range?.end ?? Math.max(0, count - 1);
96
+ const windowed = range ? contiguous(series, range) : series;
97
+ const shown = end - start + 1;
98
+ if (!mode || slots <= 0 || shown <= slots) return { values: windowed, start, end, indices: null };
99
+ if (mode === "minmax") {
100
+ const { values, indices } = minMaxBuckets(windowed, slots);
101
+ return { values, start, end, indices: indices.map((i) => i + start) };
102
+ }
103
+ const lead = windowed.find((values) => values.some((v) => v != null)) ?? [];
104
+ const picked = lttbIndices(lead, slots);
105
+ return {
106
+ values: windowed.map((values) => picked.map((i) => values[i] ?? null)),
107
+ start,
108
+ end,
109
+ indices: picked.map((i) => i + start)
110
+ };
111
+ }
112
+ function slotOf(view, source) {
113
+ if (source < view.start || source > view.end) return -1;
114
+ if (!view.indices) return source - view.start;
115
+ let low = 0;
116
+ let high = view.indices.length - 1;
117
+ while (low < high) {
118
+ const middle = Math.ceil((low + high) / 2);
119
+ if (view.indices[middle] <= source) low = middle;
120
+ else high = middle - 1;
121
+ }
122
+ return high < 0 ? -1 : low;
123
+ }
124
+ const sourceOf = (view, slot) => view.indices ? view.indices[slot] ?? -1 : slot + view.start;
125
+ export {
126
+ MIN_RANGE_POINTS,
127
+ ZOOM_STEP,
128
+ chartView,
129
+ clampRange,
130
+ lttbIndices,
131
+ minMaxBuckets,
132
+ panRange,
133
+ slotOf,
134
+ sourceOf,
135
+ zoomRange
136
+ };
@@ -1,4 +1,4 @@
1
- const clamp = (n, min, max) => Math.min(max, Math.max(min, n));
1
+ import { clamp } from "../composables/clamp.js";
2
2
  function normalizeHue(h) {
3
3
  const wrapped = h % 360;
4
4
  return wrapped < 0 ? wrapped + 360 : wrapped;
@@ -145,14 +145,28 @@ export interface RecentSource {
145
145
  disabled?: boolean;
146
146
  children?: unknown;
147
147
  }
148
+ export declare function isSafeHref(href: string): boolean;
149
+ /** The link as it would be pasted elsewhere: absolute, or as given if it cannot be read. */
150
+ export declare function absoluteHref(href: string, base: string): string;
151
+ /** The row that unfolds a group; the NUL keeps it out of any id an app would write. */
152
+ export declare function moreRowId(group: string): string;
148
153
  /** Stored history, with anything malformed dropped rather than trusted. */
149
154
  export declare function readRecent(stored: unknown): RecentItem[];
155
+ /**
156
+ * What makes a command itself: the same id may live in two modes
157
+ * (`services/restart`, `deploy/restart`). A root command's key is its bare id,
158
+ * so a stored id and a stored entry at the root count as one.
159
+ */
160
+ export declare function commandKey(id: string, path?: readonly string[]): string;
161
+ export declare function recentKey(item: RecentItem): string;
150
162
  /**
151
163
  * The history item for a pick. A root pick stays a bare id, the format older
152
164
  * versions wrote and still read; anything deeper becomes an entry with only
153
- * the fields that survive JSON.
165
+ * the fields that survive JSON. So does a `fetched` pick at the root: its id
166
+ * stands for nothing among the root commands, and only an entry reaches
167
+ * `resolveRecent` with what is needed to find it again.
154
168
  */
155
- export declare function toRecentItem(command: RecentSource, path: readonly string[]): RecentItem;
169
+ export declare function toRecentItem(command: RecentSource, path: readonly string[], fetched?: boolean): RecentItem;
156
170
  /** The history with `item` first and any earlier copy of it dropped. */
157
171
  export declare function pushRecent(list: readonly RecentItem[], item: RecentItem, keep: number): RecentItem[];
158
172
  /**
@@ -41,20 +41,50 @@ function fallbackRows(items, raw) {
41
41
  parsed
42
42
  ).map((command) => ({ command, label: command.label.split("{query}").join(parsed.text) }));
43
43
  }
44
+ const SAFE_LINK_SCHEMES = /* @__PURE__ */ new Set(["http:", "https:", "mailto:", "tel:"]);
45
+ const RELATIVE_BASE = "http://relative.invalid/";
46
+ function isSafeHref(href) {
47
+ try {
48
+ return SAFE_LINK_SCHEMES.has(new URL(href, RELATIVE_BASE).protocol);
49
+ } catch {
50
+ return false;
51
+ }
52
+ }
53
+ function absoluteHref(href, base) {
54
+ try {
55
+ return new URL(href, base).href;
56
+ } catch {
57
+ return href;
58
+ }
59
+ }
60
+ function moreRowId(group) {
61
+ return `\0lp-cmd-more\0${group}`;
62
+ }
63
+ const IMAGE_SHAPES = ["circle", "soft", "square"];
64
+ const isOptionalString = (value) => value === void 0 || typeof value === "string";
65
+ function isStoredImage(value) {
66
+ if (value === void 0 || typeof value === "string") return true;
67
+ if (!value || typeof value !== "object") return false;
68
+ const { src, alt, fallback, icon, shape } = value;
69
+ return (src === null || isOptionalString(src)) && isOptionalString(alt) && isOptionalString(fallback) && isOptionalString(icon) && (shape === void 0 || IMAGE_SHAPES.includes(shape));
70
+ }
44
71
  function isEntry(value) {
45
72
  if (!value || typeof value !== "object") return false;
46
73
  const v = value;
47
- return typeof v.id === "string" && typeof v.label === "string" && Array.isArray(v.path) && v.path.every((step) => typeof step === "string");
74
+ return typeof v.id === "string" && typeof v.label === "string" && Array.isArray(v.path) && v.path.every((step) => typeof step === "string") && isOptionalString(v.description) && isOptionalString(v.icon) && isStoredImage(v.image) && (v.href === void 0 || typeof v.href === "string" && isSafeHref(v.href));
48
75
  }
49
76
  function readRecent(stored) {
50
77
  if (!Array.isArray(stored)) return [];
51
78
  return stored.filter((v) => typeof v === "string" || isEntry(v));
52
79
  }
80
+ function commandKey(id, path = []) {
81
+ return [...path, id].join("\0");
82
+ }
53
83
  function recentKey(item) {
54
- return typeof item === "string" ? item : [...item.path, item.id].join("\0");
84
+ return typeof item === "string" ? item : commandKey(item.id, item.path);
55
85
  }
56
- function toRecentItem(command, path) {
57
- if (!path.length) return command.id;
86
+ function toRecentItem(command, path, fetched = false) {
87
+ if (!path.length && !fetched) return command.id;
58
88
  const entry = { id: command.id, label: command.label, path: [...path] };
59
89
  if (command.description) entry.description = command.description;
60
90
  if (command.icon) entry.icon = command.icon;
@@ -110,13 +140,18 @@ function modeChipLabel(command) {
110
140
  }
111
141
  export {
112
142
  PALETTE_MODES,
143
+ absoluteHref,
113
144
  commandHasPreview,
145
+ commandKey,
114
146
  fallbackRows,
147
+ isSafeHref,
115
148
  matchModePrefix,
116
149
  menuPaletteCommands,
117
150
  modeChipLabel,
151
+ moreRowId,
118
152
  pushRecent,
119
153
  readRecent,
154
+ recentKey,
120
155
  recentVisible,
121
156
  resolveRecentItems,
122
157
  toRecentItem
@@ -0,0 +1,5 @@
1
+ export declare const CONTROL_SIZE: {
2
+ sm: string;
3
+ md: string;
4
+ lg: string;
5
+ };
@@ -0,0 +1,8 @@
1
+ const CONTROL_SIZE = {
2
+ sm: "h-(--size-control-sm) text-xs",
3
+ md: "h-(--size-control-md) text-sm",
4
+ lg: "h-(--size-control-lg) text-sm"
5
+ };
6
+ export {
7
+ CONTROL_SIZE
8
+ };
@@ -35,4 +35,9 @@ export declare const optionStagger: (index: number) => {
35
35
  * dip on press. Put on the <LpIcon>, with `group` on its button. Shared by
36
36
  * Modal, Drawer, Toaster and the Autocomplete clear button.
37
37
  */
38
+ export declare const COMBOBOX_PANEL: {
39
+ readonly collisionPadding: 8;
40
+ readonly position: "popper";
41
+ readonly sideOffset: 6;
42
+ };
38
43
  export declare const CLOSE_ICON: string;
@@ -7,9 +7,11 @@ const OPTION_ITEM = "flex cursor-pointer items-center gap-2 rounded-inner px-2.5
7
7
  const optionStagger = (index) => ({
8
8
  animationDelay: `${staggerDelay(index, 0, 22, 12)}ms`
9
9
  });
10
+ const COMBOBOX_PANEL = { collisionPadding: 8, position: "popper", sideOffset: 6 };
10
11
  const CLOSE_ICON = "transition-transform duration-medium ease-[var(--ease-emphasized)] group-hover:rotate-90 group-active:scale-90 motion-reduce:group-hover:rotate-0";
11
12
  export {
12
13
  CLOSE_ICON,
14
+ COMBOBOX_PANEL,
13
15
  OPTION_ITEM,
14
16
  PANEL_SURFACE,
15
17
  POPOVER_ANIM,
@@ -27,7 +27,12 @@ export declare function toCsv<Row>(rows: readonly Row[], columns: readonly CsvCo
27
27
  * Hand the viewer a file to save. Does nothing outside a browser, so a call
28
28
  * that runs during SSR is harmless.
29
29
  */
30
- export declare function downloadFile(name: string, data: Blob | string, type?: string): void;
30
+ export declare function downloadFile(name: string, data: Blob | string, type?: string, doc?: Document | undefined): void;
31
+ /**
32
+ * Follow a link the way a click on it would, from the document it should open
33
+ * in: an LpFrame's, inside one.
34
+ */
35
+ export declare function clickLink(doc: Document, attributes: Partial<Pick<HTMLAnchorElement, "href" | "download" | "target" | "rel">>): void;
31
36
  /**
32
37
  * A standalone copy of a live SVG: every element carries its computed paint as
33
38
  * an inline style, so CSS custom properties and classes from the page's
@@ -1,3 +1,5 @@
1
+ import "vue";
2
+ import { nodeWindow, isElement } from "../composables/realm.js";
1
3
  const FORMULA_START = /^[=+\-@\t\r]/;
2
4
  function cellText(value) {
3
5
  if (value == null) return "";
@@ -26,19 +28,20 @@ function toCsv(rows, columns, options = {}) {
26
28
  }
27
29
  return (options.bom ? "\uFEFF" : "") + out.join(newline) + newline;
28
30
  }
29
- function downloadFile(name, data, type = "text/plain;charset=utf-8") {
30
- if (typeof document === "undefined" || typeof URL === "undefined") return;
31
+ function downloadFile(name, data, type = "text/plain;charset=utf-8", doc = typeof document === "undefined" ? void 0 : document) {
32
+ if (!doc || typeof URL === "undefined") return;
31
33
  const blob = typeof data === "string" ? new Blob([data], { type }) : data;
32
34
  const url = URL.createObjectURL(blob);
33
- const a = document.createElement("a");
34
- a.href = url;
35
- a.download = name;
36
- a.rel = "noopener";
35
+ clickLink(doc, { href: url, download: name, rel: "noopener" });
36
+ setTimeout(() => URL.revokeObjectURL(url), 0);
37
+ }
38
+ function clickLink(doc, attributes) {
39
+ const a = doc.createElement("a");
40
+ Object.assign(a, attributes);
37
41
  a.style.display = "none";
38
- document.body.append(a);
42
+ doc.body.append(a);
39
43
  a.click();
40
44
  a.remove();
41
- setTimeout(() => URL.revokeObjectURL(url), 0);
42
45
  }
43
46
  const PAINT_PROPS = [
44
47
  "fill",
@@ -65,18 +68,19 @@ const PAINT_PROPS = [
65
68
  "display"
66
69
  ];
67
70
  function inlineSvg(svg) {
71
+ const view = nodeWindow(svg);
68
72
  const clone = svg.cloneNode(true);
69
73
  const source = [svg, ...svg.querySelectorAll("*")];
70
74
  const target = [clone, ...clone.querySelectorAll("*")];
71
75
  source.forEach((el, i) => {
72
76
  const copy = target[i];
73
- if (!(copy instanceof Element)) return;
74
- const computed = getComputedStyle(el);
77
+ if (!isElement(copy)) return;
78
+ const computed = view.getComputedStyle(el);
75
79
  const style = PAINT_PROPS.map((p) => `${p}:${computed.getPropertyValue(p)}`).filter((d) => !d.endsWith(":")).join(";");
76
80
  copy.setAttribute("style", style);
77
81
  copy.removeAttribute("class");
78
82
  });
79
- const comments = document.createTreeWalker(clone, NodeFilter.SHOW_COMMENT);
83
+ const comments = view.document.createTreeWalker(clone, view.NodeFilter.SHOW_COMMENT);
80
84
  const dead = [];
81
85
  while (comments.nextNode()) dead.push(comments.currentNode);
82
86
  for (const node of dead) node.parentNode?.removeChild(node);
@@ -94,13 +98,14 @@ function inlineSvg(svg) {
94
98
  return clone;
95
99
  }
96
100
  async function svgToPng(svg, options = {}) {
101
+ const view = nodeWindow(svg);
97
102
  const copy = inlineSvg(svg);
98
103
  const width = Number(copy.getAttribute("width"));
99
104
  const height = Number(copy.getAttribute("height"));
100
105
  const markup = new XMLSerializer().serializeToString(copy);
101
106
  const url = URL.createObjectURL(new Blob([markup], { type: "image/svg+xml;charset=utf-8" }));
102
107
  try {
103
- const img = new Image();
108
+ const img = new view.Image();
104
109
  img.decoding = "async";
105
110
  const loaded = new Promise((resolve, reject) => {
106
111
  img.onload = () => resolve();
@@ -108,11 +113,11 @@ async function svgToPng(svg, options = {}) {
108
113
  });
109
114
  img.src = url;
110
115
  await loaded;
111
- const scale = options.scale ?? Math.max(2, globalThis.devicePixelRatio || 1);
116
+ const scale = options.scale ?? Math.max(2, view.devicePixelRatio || 1);
112
117
  const pad = options.padding ?? 0;
113
- const measure = document.createElement("canvas").getContext("2d");
118
+ const measure = view.document.createElement("canvas").getContext("2d");
114
119
  const headerHeight = measure && options.header ? options.header(measure, width) : 0;
115
- const canvas = document.createElement("canvas");
120
+ const canvas = view.document.createElement("canvas");
116
121
  canvas.width = Math.ceil((width + pad * 2) * scale);
117
122
  canvas.height = Math.ceil((height + headerHeight + pad * 2) * scale);
118
123
  const ctx = canvas.getContext("2d");
@@ -134,18 +139,19 @@ async function svgToPng(svg, options = {}) {
134
139
  }
135
140
  function backgroundOf(el) {
136
141
  for (let node = el; node; node = node.parentElement) {
137
- const bg = getComputedStyle(node).backgroundColor;
142
+ const bg = nodeWindow(node).getComputedStyle(node).backgroundColor;
138
143
  if (bg && bg !== "transparent" && !/rgba\([^)]*,\s*0\)$/.test(bg)) return bg;
139
144
  }
140
145
  return void 0;
141
146
  }
142
147
  function resolveCssColor(value, within) {
143
148
  if (!value.includes("var(") && !value.toLowerCase().includes("currentcolor")) return value;
144
- const probe = document.createElement("span");
149
+ const view = nodeWindow(within);
150
+ const probe = view.document.createElement("span");
145
151
  probe.style.color = value;
146
152
  probe.style.display = "none";
147
153
  within.append(probe);
148
- const resolved = getComputedStyle(probe).color;
154
+ const resolved = view.getComputedStyle(probe).color;
149
155
  probe.remove();
150
156
  return resolved || value;
151
157
  }
@@ -155,6 +161,7 @@ function fileStem(title, fallback) {
155
161
  }
156
162
  export {
157
163
  backgroundOf,
164
+ clickLink,
158
165
  csvField,
159
166
  downloadFile,
160
167
  fileStem,