@leavepulse/ui 0.71.1 → 0.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/dist/assets/{LpCommandPalette-DgPZX0us.css → LpCommandPalette-Rtbg669l.css} +19 -19
  2. package/dist/assets/{LpNumberFlow-rZkwQwlU.css → LpNumberFlow-Chp9pEDe.css} +8 -0
  3. package/dist/assets/LpTabs-CDchzoRL.css +18 -0
  4. package/dist/chunks/{ContextMenuItems-eS7qx9gD.js → ContextMenuItems-BXumicbh.js} +1 -1
  5. package/dist/chunks/{DropzoneLinkField-DkFhdfEJ.js → DropzoneLinkField-D2Rnkcys.js} +2 -2
  6. package/dist/chunks/{FieldWrapper-YzbvvC3M.js → FieldWrapper-DnA1rxZ8.js} +1 -1
  7. package/dist/chunks/{LayoutCanvas-Ba4A9QC5.js → LayoutCanvas-CNOAUk7D.js} +1 -1
  8. package/dist/chunks/{LayoutNode-CTTTLMDM.js → LayoutNode-DF5BMN0J.js} +1 -1
  9. package/dist/chunks/{LpActionBar-B7anGlkI.js → LpActionBar-DfiBL1dE.js} +3 -3
  10. package/dist/chunks/{LpAddressInput-CD0bzrt-.js → LpAddressInput-B1bB3F6M.js} +7 -7
  11. package/dist/chunks/{LpAlert-BHi7ARqu.js → LpAlert-CpRF9eYr.js} +3 -3
  12. package/dist/chunks/{LpAppShell-1RmBp6xQ.js → LpAppShell-D8Q0Jv9d.js} +68 -18
  13. package/dist/chunks/{LpAutocomplete-DDqe2M5g.js → LpAutocomplete-DOu7FN5P.js} +2 -2
  14. package/dist/chunks/{LpAvatar-DqfKCIdr.js → LpAvatar-Cg6Az3wz.js} +1 -1
  15. package/dist/chunks/{LpBadge-C8fKEmTF.js → LpBadge-vtCpsDmv.js} +3 -3
  16. package/dist/chunks/LpBottomNav-VXJf0cKc.js +89 -0
  17. package/dist/chunks/{LpBreadcrumbs-DhcoStFa.js → LpBreadcrumbs-BdzjQcql.js} +3 -3
  18. package/dist/chunks/{LpButton-BQDAFXBd.js → LpButton-Dk7eT4ro.js} +1 -1
  19. package/dist/chunks/{LpCalendar-NmrA47J9.js → LpCalendar-CuoWks-0.js} +1 -1
  20. package/dist/chunks/{LpCard-CqKLnEhl.js → LpCard-Ce3rw8zm.js} +1 -1
  21. package/dist/chunks/{LpCheckbox-BoOuLnGB.js → LpCheckbox-DLX4amba.js} +2 -2
  22. package/dist/chunks/{LpCodeBlock-Czu-fq1M.js → LpCodeBlock-j0W5bpmF.js} +2 -2
  23. package/dist/chunks/{LpCodeDisplay-BK2FHbtM.js → LpCodeDisplay-COdiv4xu.js} +6 -6
  24. package/dist/chunks/{LpColorPicker-Ee1DZiRd.js → LpColorPicker-1y1QJHZR.js} +56 -28
  25. package/dist/chunks/{LpCommandScope-ubtWDMa0.js → LpCommandScope-BlKcgBnK.js} +1 -1
  26. package/dist/chunks/{LpConfirmDialog-i15pulMT.js → LpConfirmDialog-w1ni5nxh.js} +3 -3
  27. package/dist/chunks/{LpConfirmHost-D0oGavtd.js → LpConfirmHost-Br_-Gn-6.js} +1 -1
  28. package/dist/chunks/{LpContextMenu-DXpFJjlO.js → LpContextMenu-rx2tCjwk.js} +2 -2
  29. package/dist/chunks/{LpCopyButton-Dmq7DmFw.js → LpCopyButton-DaD1KCn6.js} +2 -2
  30. package/dist/chunks/{LpCountdown-DTdMF8DL.js → LpCountdown-Cgy0mVEq.js} +3 -3
  31. package/dist/chunks/{LpDataList-CFPtSsBB.js → LpDataList-CkcGFJgv.js} +3 -3
  32. package/dist/chunks/{LpDatePicker-cC9K-Pk8.js → LpDatePicker-CA0QTfBC.js} +4 -4
  33. package/dist/chunks/{LpDateRangePicker-BVQKPbvo.js → LpDateRangePicker-u3J51xXk.js} +2 -2
  34. package/dist/chunks/{LpDisclosure-hRnX3FWL.js → LpDisclosure-Cpa7Hc5T.js} +1 -1
  35. package/dist/chunks/{LpDrawer-u4rxnuR-.js → LpDrawer-RRamxbLV.js} +1 -1
  36. package/dist/chunks/{LpDropdownMenu-BgZ0Z_Im.js → LpDropdownMenu-Dl7Z4ZhS.js} +2 -2
  37. package/dist/chunks/{LpEditable-CjxuOVh_.js → LpEditable-D3PvD6Zm.js} +5 -5
  38. package/dist/chunks/{LpEmptyState-CKFTtQgJ.js → LpEmptyState-EQHiRYhG.js} +7 -3
  39. package/dist/chunks/{LpFieldNotice-CPI8EwtU.js → LpFieldNotice-CzQ2_5rQ.js} +1 -1
  40. package/dist/chunks/{LpFileTree-BH0gNlSJ.js → LpFileTree-D7KTaJiM.js} +2 -2
  41. package/dist/chunks/{LpFileTreeNode-gPVB1oXM.js → LpFileTreeNode-14GVqQTd.js} +5 -5
  42. package/dist/chunks/{LpFormField-gRASfyj2.js → LpFormField-MSQhRCTz.js} +2 -2
  43. package/dist/chunks/{LpGauge-BdjPGnqw.js → LpGauge-BO1PYYqD.js} +2 -2
  44. package/dist/chunks/{LpHintLayer-C2asBIfs.js → LpHintLayer-CmYm37z7.js} +2 -2
  45. package/dist/chunks/{LpHints-CNZQ76JV.js → LpHints-iLIRUkCj.js} +3 -3
  46. package/dist/chunks/{LpIcon-DkP-9mzK.js → LpIcon--5WSb3jJ.js} +1 -1
  47. package/dist/chunks/{LpInfraNode-yTh4-5qa.js → LpInfraNode-BT0VQrOa.js} +2 -2
  48. package/dist/chunks/{LpInput-2H-5ILOB.js → LpInput-1eNvtzXs.js} +2 -2
  49. package/dist/chunks/{LpLightbox-lAt5uIfx.js → LpLightbox-DWw6OSA4.js} +3 -3
  50. package/dist/chunks/{LpLoader-DjJEX8hL.js → LpLoader-B82_CcV0.js} +1 -1
  51. package/dist/chunks/{LpLogViewer-x78YfhJf.js → LpLogViewer-pzanZASC.js} +6 -6
  52. package/dist/chunks/{LpMapPicker-Dp5RSCi9.js → LpMapPicker-DNIUvF6V.js} +2 -2
  53. package/dist/chunks/{LpMediaGallery-D92oJfY_.js → LpMediaGallery-Dx8xzg5N.js} +3 -3
  54. package/dist/chunks/{LpModal-CpH0bNo7.js → LpModal-BnjZ2iem.js} +1 -1
  55. package/dist/chunks/{LpModalNav-BH4ANQGJ.js → LpModalNav-Cu04W1pV.js} +4 -4
  56. package/dist/chunks/{LpNotificationBell-BdUQqZhs.js → LpNotificationBell-PSQqFqEv.js} +8 -8
  57. package/dist/chunks/{LpNumberField-DZY3Z670.js → LpNumberField-e0IBkWU1.js} +1 -1
  58. package/dist/chunks/{LpNumberFlow-5khYxsfX.js → LpNumberFlow-CcxEGUy0.js} +10 -7
  59. package/dist/chunks/{LpPagination-DbeACavM.js → LpPagination-BIIiYHXR.js} +1 -1
  60. package/dist/chunks/{LpPaletteTheme-CqWNRwHE.js → LpPaletteTheme-D05ywM1W.js} +8 -6
  61. package/dist/chunks/{LpPasswordInput-BzAZsf5V.js → LpPasswordInput-vdcw-koG.js} +2 -2
  62. package/dist/chunks/{LpPhoneInput-BMpd-0QR.js → LpPhoneInput-CETEp5W7.js} +2 -2
  63. package/dist/chunks/{LpPie-DdFSTbGE.js → LpPie-BlWDxCtG.js} +6 -6
  64. package/dist/chunks/{LpPipeline-zjEM1Lwc.js → LpPipeline-BXjoxkq_.js} +4 -4
  65. package/dist/chunks/{LpProgress-BX33EKkN.js → LpProgress-rOlyafqp.js} +1 -1
  66. package/dist/chunks/{LpQuota-DqNv1yjs.js → LpQuota-B12yijdB.js} +3 -3
  67. package/dist/chunks/{LpRadioGroup-CsXeV9Ct.js → LpRadioGroup-ggaPL92T.js} +1 -1
  68. package/dist/chunks/{LpRangeCalendar-l-0nSFmY.js → LpRangeCalendar-CYYUYqJ7.js} +1 -1
  69. package/dist/chunks/{LpRelativeTime-UM8EkfrN.js → LpRelativeTime-DwgCb5-8.js} +1 -1
  70. package/dist/chunks/{LpRepeater-OvzByE5L.js → LpRepeater-fliVBcN7.js} +3 -3
  71. package/dist/chunks/LpRollingText-B54Pje7P.js +86 -0
  72. package/dist/chunks/{LpScramble-TDO5Kdou.js → LpScramble-Cw-af0Yh.js} +1 -1
  73. package/dist/chunks/{LpSecretField-DwQiPOko.js → LpSecretField-D_IMxEGW.js} +7 -7
  74. package/dist/chunks/{LpSection-DcQsieHG.js → LpSection-DFK_uoJE.js} +1 -1
  75. package/dist/chunks/{LpSegmented-D2VST0o3.js → LpSegmented-CeACsMMA.js} +4 -2
  76. package/dist/chunks/{LpSelect-DYX2-u5A.js → LpSelect-Cxq4yBGd.js} +7 -7
  77. package/dist/chunks/LpShift-BAp8lGoa.js +160 -0
  78. package/dist/chunks/LpSidebar-BftYsk5d.js +494 -0
  79. package/dist/chunks/LpSidebarNav-BzNWMZfc.js +357 -0
  80. package/dist/chunks/LpSidebarRow-BIReMT1f.js +302 -0
  81. package/dist/chunks/{LpStat-DIsQfbeD.js → LpStat-BFCM6fUn.js} +9 -7
  82. package/dist/chunks/{LpStatus-BQU1TUsv.js → LpStatus-BWTLVPVh.js} +3 -3
  83. package/dist/chunks/{LpStepMark-CXa7DJy_.js → LpStepMark-DkdkebLC.js} +3 -3
  84. package/dist/chunks/{LpStepper-C9RM_yTG.js → LpStepper-BgqjKrqg.js} +1 -1
  85. package/dist/chunks/{LpSwap-DzE6M3Mg.js → LpSwap-B5YOXgtx.js} +1 -1
  86. package/dist/chunks/{LpSwitch-bGZxUDSx.js → LpSwitch-DyrRes7s.js} +1 -1
  87. package/dist/chunks/LpTabFace-D6BMCbAP.js +77 -0
  88. package/dist/chunks/{LpTableFilter-CTZMqFDU.js → LpTableFilter-Dkzamzkl.js} +3 -3
  89. package/dist/chunks/{LpTagsInput-DrjmrOge.js → LpTagsInput-DAZNNehI.js} +5 -5
  90. package/dist/chunks/{LpTextarea-BbYqmG1S.js → LpTextarea-DbmVPj2X.js} +32 -7
  91. package/dist/chunks/{useTheme-BOV_-AiY.js → LpThemeProvider-8MG6yqU9.js} +66 -1
  92. package/dist/chunks/{LpThemeStudio-B2nPaG-h.js → LpThemeStudio-DWtG6OZZ.js} +140 -106
  93. package/dist/chunks/LpThemeStudioSection-B7bt8Iyg.js +32 -0
  94. package/dist/chunks/{LpThemeSwitcher-C0A5sg_E.js → LpThemeSwitcher-Dcx-VkSk.js} +9 -8
  95. package/dist/chunks/{LpTimeField-DQ8WvPr2.js → LpTimeField-BawSVsmt.js} +1 -1
  96. package/dist/chunks/{LpToaster-BTTl_wuy.js → LpToaster-50hp_B5O.js} +2 -2
  97. package/dist/chunks/{LpTopologyCanvas-B0wEvAoq.js → LpTopologyCanvas-CnUh8uzS.js} +43 -13
  98. package/dist/chunks/{LpTour-BgCfNlaW.js → LpTour-DC3LTlxg.js} +1 -1
  99. package/dist/chunks/{LpTruncate-TcqfkyJM.js → LpTruncate-Ced4gquB.js} +1 -1
  100. package/dist/chunks/{LpUptimeBar-DRadGq4Y.js → LpUptimeBar-CuB0LX8K.js} +4 -4
  101. package/dist/chunks/{MenuTitle-Dab3EGOp.js → MenuTitle-BmCNNTKH.js} +1 -1
  102. package/dist/chunks/{OptionContent-DPzNsybd.js → OptionContent-22UT8zLn.js} +1 -1
  103. package/dist/chunks/{PickerField-DwLw7j0L.js → PickerField-Bfh8id3d.js} +2 -2
  104. package/dist/chunks/{RevealToggle-BVFM_FAU.js → RevealToggle-B0ITuIX-.js} +2 -2
  105. package/dist/chunks/{TourCard--2IfgnUU.js → TourCard-CBkj1GYi.js} +5 -5
  106. package/dist/chunks/{icons-CLu1iR1j.js → icons-DMITlfw5.js} +1 -1
  107. package/dist/chunks/{palette-BiY7yQZL.js → palette-Cvxl_1tM.js} +1 -1
  108. package/dist/component-names.d.ts +1 -1
  109. package/dist/components/ContextMenuItems.vue.js +1 -1
  110. package/dist/components/DropzoneLinkField.vue.js +1 -1
  111. package/dist/components/FieldWrapper.vue.js +1 -1
  112. package/dist/components/LayoutCanvas.vue.js +1 -1
  113. package/dist/components/LayoutNode.vue.js +1 -1
  114. package/dist/components/LpActionBar.vue.js +1 -1
  115. package/dist/components/LpAddressInput.vue.js +1 -1
  116. package/dist/components/LpAlert.vue.js +1 -1
  117. package/dist/components/LpAppShell.vue.d.ts +67 -2
  118. package/dist/components/LpAppShell.vue.js +1 -1
  119. package/dist/components/LpAutocomplete.vue.js +1 -1
  120. package/dist/components/LpAvatar.vue.js +1 -1
  121. package/dist/components/LpBadge.vue.js +1 -1
  122. package/dist/components/LpBottomNav.vue.d.ts +28 -0
  123. package/dist/components/LpBottomNav.vue.js +4 -0
  124. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  125. package/dist/components/LpButton.vue.js +1 -1
  126. package/dist/components/LpCalendar.vue.js +1 -1
  127. package/dist/components/LpCard.vue.js +1 -1
  128. package/dist/components/LpChart.vue.js +26 -8
  129. package/dist/components/LpCheckbox.vue.js +1 -1
  130. package/dist/components/LpCodeBlock.vue.js +1 -1
  131. package/dist/components/LpCodeDisplay.vue.js +1 -1
  132. package/dist/components/LpColorPicker.vue.d.ts +15 -2
  133. package/dist/components/LpColorPicker.vue.js +1 -1
  134. package/dist/components/LpCommandPalette.vue.js +47 -26
  135. package/dist/components/LpCommandScope.vue.js +1 -1
  136. package/dist/components/LpConfirmDialog.vue.js +1 -1
  137. package/dist/components/LpConfirmHost.vue.js +1 -1
  138. package/dist/components/LpContextMenu.vue.js +1 -1
  139. package/dist/components/LpCopyButton.vue.js +1 -1
  140. package/dist/components/LpCountdown.vue.js +1 -1
  141. package/dist/components/LpDataList.vue.js +1 -1
  142. package/dist/components/LpDatePicker.vue.js +1 -1
  143. package/dist/components/LpDateRangePicker.vue.js +1 -1
  144. package/dist/components/LpDisclosure.vue.js +1 -1
  145. package/dist/components/LpDock.vue.js +1 -1
  146. package/dist/components/LpDrawer.vue.js +1 -1
  147. package/dist/components/LpDropdownMenu.vue.js +1 -1
  148. package/dist/components/LpDropzone.vue.js +2 -2
  149. package/dist/components/LpEditable.vue.js +1 -1
  150. package/dist/components/LpEmptyState.vue.d.ts +2 -0
  151. package/dist/components/LpEmptyState.vue.js +1 -1
  152. package/dist/components/LpFieldNotice.vue.js +1 -1
  153. package/dist/components/LpFileTree.vue.js +1 -1
  154. package/dist/components/LpFileTreeNode.vue.js +1 -1
  155. package/dist/components/LpFormField.vue.js +1 -1
  156. package/dist/components/LpGauge.vue.js +1 -1
  157. package/dist/components/LpHintLayer.vue.js +1 -1
  158. package/dist/components/LpHints.vue.js +1 -1
  159. package/dist/components/LpIcon.vue.js +1 -1
  160. package/dist/components/LpImageEditor.vue.js +2 -2
  161. package/dist/components/LpInfraNode.vue.js +1 -1
  162. package/dist/components/LpInput.vue.js +1 -1
  163. package/dist/components/LpLightbox.vue.js +1 -1
  164. package/dist/components/LpLoader.vue.js +1 -1
  165. package/dist/components/LpLogViewer.vue.d.ts +1 -1
  166. package/dist/components/LpLogViewer.vue.js +1 -1
  167. package/dist/components/LpMapPicker.vue.js +1 -1
  168. package/dist/components/LpMediaGallery.vue.js +1 -1
  169. package/dist/components/LpModal.vue.js +1 -1
  170. package/dist/components/LpModalNav.vue.js +1 -1
  171. package/dist/components/LpNotificationBell.vue.js +1 -1
  172. package/dist/components/LpNumberField.vue.js +1 -1
  173. package/dist/components/LpNumberFlow.vue.js +1 -1
  174. package/dist/components/LpPagination.vue.js +1 -1
  175. package/dist/components/LpPaletteFacts.vue.js +2 -2
  176. package/dist/components/LpPaletteHeader.vue.js +2 -2
  177. package/dist/components/LpPaletteStats.vue.js +2 -2
  178. package/dist/components/LpPaletteTheme.vue.d.ts +2 -0
  179. package/dist/components/LpPaletteTheme.vue.js +1 -1
  180. package/dist/components/LpPasswordInput.vue.js +1 -1
  181. package/dist/components/LpPhoneInput.vue.js +1 -1
  182. package/dist/components/LpPie.vue.js +1 -1
  183. package/dist/components/LpPipeline.vue.js +1 -1
  184. package/dist/components/LpProgress.vue.js +1 -1
  185. package/dist/components/LpQuota.vue.js +1 -1
  186. package/dist/components/LpRadioGroup.vue.js +1 -1
  187. package/dist/components/LpRangeCalendar.vue.js +1 -1
  188. package/dist/components/LpRelativeTime.vue.js +1 -1
  189. package/dist/components/LpRepeater.vue.js +1 -1
  190. package/dist/components/LpRollingText.vue.d.ts +2 -2
  191. package/dist/components/LpRollingText.vue.js +1 -1
  192. package/dist/components/LpScramble.vue.js +1 -1
  193. package/dist/components/LpSecretField.vue.js +1 -1
  194. package/dist/components/LpSection.vue.js +1 -1
  195. package/dist/components/LpSegmented.vue.js +1 -1
  196. package/dist/components/LpSelect.vue.js +1 -1
  197. package/dist/components/LpShift.vue.d.ts +20 -0
  198. package/dist/components/LpShift.vue.js +1 -1
  199. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  200. package/dist/components/LpSidebar.vue.d.ts +74 -23
  201. package/dist/components/LpSidebar.vue.js +1 -1
  202. package/dist/components/LpSidebarNav.vue.d.ts +30 -2
  203. package/dist/components/LpSidebarNav.vue.js +1 -1
  204. package/dist/components/LpSidebarRow.vue.d.ts +49 -0
  205. package/dist/components/LpSidebarRow.vue.js +4 -0
  206. package/dist/components/LpStat.vue.d.ts +11 -0
  207. package/dist/components/LpStat.vue.js +1 -1
  208. package/dist/components/LpStatus.vue.js +1 -1
  209. package/dist/components/LpStepMark.vue.js +1 -1
  210. package/dist/components/LpStepper.vue.js +1 -1
  211. package/dist/components/LpSwap.vue.js +1 -1
  212. package/dist/components/LpSwitch.vue.js +1 -1
  213. package/dist/components/LpTabFace.vue.d.ts +14 -0
  214. package/dist/components/LpTabFace.vue.js +4 -0
  215. package/dist/components/LpTable.vue.js +11 -11
  216. package/dist/components/LpTableFilter.vue.js +1 -1
  217. package/dist/components/LpTabs.vue.d.ts +12 -4
  218. package/dist/components/LpTabs.vue.js +22 -74
  219. package/dist/components/LpTagsInput.vue.js +1 -1
  220. package/dist/components/LpTextarea.vue.d.ts +19 -1
  221. package/dist/components/LpTextarea.vue.js +1 -1
  222. package/dist/components/LpThemeProvider.vue.js +1 -1
  223. package/dist/components/LpThemeStudio.vue.d.ts +2 -2
  224. package/dist/components/LpThemeStudio.vue.js +1 -1
  225. package/dist/components/LpThemeStudioSection.vue.d.ts +4 -1
  226. package/dist/components/LpThemeStudioSection.vue.js +1 -1
  227. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  228. package/dist/components/LpTimeField.vue.js +1 -1
  229. package/dist/components/LpToaster.vue.js +1 -1
  230. package/dist/components/LpTopologyCanvas.vue.d.ts +3 -1
  231. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  232. package/dist/components/LpTour.vue.js +1 -1
  233. package/dist/components/LpTruncate.vue.js +1 -1
  234. package/dist/components/LpUptimeBar.vue.js +1 -1
  235. package/dist/components/MenuTitle.vue.js +1 -1
  236. package/dist/components/OptionContent.vue.js +1 -1
  237. package/dist/components/PickerField.vue.js +1 -1
  238. package/dist/components/RevealToggle.vue.js +1 -1
  239. package/dist/components/TourCard.vue.js +1 -1
  240. package/dist/components/chart.d.ts +14 -0
  241. package/dist/components/chart.js +13 -0
  242. package/dist/components/format.d.ts +10 -3
  243. package/dist/components/format.js +14 -2
  244. package/dist/components/menuWhen.js +1 -1
  245. package/dist/components/rolling.d.ts +5 -0
  246. package/dist/components/rolling.js +23 -0
  247. package/dist/components/sidebar.d.ts +33 -0
  248. package/dist/components/tabs.d.ts +3 -0
  249. package/dist/components/tabs.js +6 -0
  250. package/dist/composables/usePaletteCommands.js +1 -0
  251. package/dist/composables/useReveal.js +1 -22
  252. package/dist/icons-all.js +1 -1
  253. package/dist/index.d.ts +2 -1
  254. package/dist/index.js +156 -154
  255. package/dist/theme/palette.d.ts +3 -0
  256. package/package.json +1 -1
  257. package/src/component-names.ts +1 -0
  258. package/src/components/LpAppShell.vue +75 -7
  259. package/src/components/LpBottomNav.vue +84 -0
  260. package/src/components/LpChart.vue +23 -3
  261. package/src/components/LpColorPicker.vue +32 -1
  262. package/src/components/LpCommandPalette.vue +23 -5
  263. package/src/components/LpEmptyState.vue +4 -1
  264. package/src/components/LpNumberFlow.vue +23 -9
  265. package/src/components/LpPaletteTheme.vue +3 -3
  266. package/src/components/LpRollingText.vue +27 -2
  267. package/src/components/LpSegmented.vue +3 -1
  268. package/src/components/LpSelect.vue +5 -4
  269. package/src/components/LpShift.vue +174 -2
  270. package/src/components/LpSidebar.vue +304 -18
  271. package/src/components/LpSidebarNav.vue +200 -70
  272. package/src/components/LpSidebarRow.vue +238 -0
  273. package/src/components/LpStat.vue +12 -4
  274. package/src/components/LpTabFace.vue +52 -0
  275. package/src/components/LpTabs.vue +15 -42
  276. package/src/components/LpTextarea.vue +34 -4
  277. package/src/components/LpThemeStudio.vue +92 -56
  278. package/src/components/LpThemeStudioSection.vue +15 -7
  279. package/src/components/LpThemeSwitcher.vue +4 -1
  280. package/src/components/LpTopologyCanvas.vue +35 -4
  281. package/src/components/chart.ts +26 -0
  282. package/src/components/format.ts +31 -5
  283. package/src/components/rolling.ts +28 -0
  284. package/src/components/sidebar.ts +33 -0
  285. package/src/components/tabs.ts +9 -0
  286. package/src/composables/usePaletteCommands.ts +3 -0
  287. package/src/composables/useReveal.ts +7 -30
  288. package/src/index.ts +2 -1
  289. package/src/kit-icons.ts +1 -1
  290. package/src/theme/palette.ts +4 -2
  291. package/dist/assets/LpTabs-CO3EcsNV.css +0 -18
  292. package/dist/chunks/LpRollingText-DiL717LK.js +0 -51
  293. package/dist/chunks/LpShift-DXNsauQZ.js +0 -40
  294. package/dist/chunks/LpSidebar-D44peKq2.js +0 -256
  295. package/dist/chunks/LpSidebarNav--VwkXO_a.js +0 -211
  296. package/dist/chunks/LpThemeProvider-DcbfOxsU.js +0 -69
  297. package/dist/chunks/LpThemeStudioSection-BwhqYDLf.js +0 -20
@@ -1,22 +1,15 @@
1
- import { defineComponent, computed, ref, watch, nextTick, useId, openBlock, createBlock, unref, withCtx, createVNode, normalizeClass, createElementBlock, Fragment, renderList, createCommentVNode, Transition, createElementVNode, toDisplayString, renderSlot } from "vue";
1
+ import { defineComponent, computed, ref, watch, nextTick, useId, openBlock, createBlock, unref, withCtx, createVNode, normalizeClass, createElementBlock, Fragment, renderList, createCommentVNode, renderSlot } from "vue";
2
2
  import { usePaletteScope, usePaletteCommands } from "../composables/usePaletteCommands.js";
3
3
  import { Motion } from "motion-v";
4
4
  import { TabsRoot, TabsList, TabsTrigger, TabsContent } from "reka-ui";
5
5
  import { usePillTransition } from "../composables/usePillTransition.js";
6
6
  import { prefersReducedMotion } from "../composables/easing.js";
7
- import { _ as _sfc_main$3 } from "../chunks/AttentionDot-DCBf4aWg.js";
8
- import { _ as _sfc_main$4 } from "../chunks/LpBadge-C8fKEmTF.js";
9
- import { _ as _sfc_main$1 } from "../chunks/LpContextMenu-DXpFJjlO.js";
10
- import { _ as _sfc_main$2 } from "../chunks/LpIcon-DkP-9mzK.js";
11
- import { _ as _sfc_main$5 } from "../chunks/LpRollingText-DiL717LK.js";
12
- import { _ as _sfc_main$6 } from "../chunks/LpSkeleton-BB6XIV-w.js";
13
- import { pickTab } from "./tabs.js";
7
+ import { _ as _sfc_main$1 } from "../chunks/LpContextMenu-rx2tCjwk.js";
8
+ import { _ as _sfc_main$3 } from "../chunks/LpSkeleton-BB6XIV-w.js";
9
+ import { _ as _sfc_main$2 } from "../chunks/LpTabFace-D6BMCbAP.js";
10
+ import { pickTab, BOTTOM_BAR, BOTTOM_ITEM, BOTTOM_MARKER } from "./tabs.js";
14
11
  import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
15
- import '../assets/LpTabs-CO3EcsNV.css';const _hoisted_1 = {
16
- key: 1,
17
- class: "relative z-10 inline-flex"
18
- };
19
- const _sfc_main = /* @__PURE__ */ defineComponent({
12
+ import '../assets/LpTabs-CDchzoRL.css';const _sfc_main = /* @__PURE__ */ defineComponent({
20
13
  __name: "LpTabs",
21
14
  props: {
22
15
  modelValue: {},
@@ -26,7 +19,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
26
19
  accent: { type: Boolean, default: false },
27
20
  block: { type: Boolean, default: false },
28
21
  label: {},
29
- hoverFollow: { type: Boolean, default: true }
22
+ hoverFollow: { type: Boolean, default: true },
23
+ compact: { type: Boolean, default: false }
30
24
  },
31
25
  emits: ["update:modelValue"],
32
26
  setup(__props, { emit: __emit }) {
@@ -94,7 +88,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
94
88
  ref_key: "list",
95
89
  ref: list,
96
90
  "aria-label": __props.label,
97
- class: normalizeClass(bottom.value ? "grid w-full auto-cols-fr grid-flow-col border-t border-line bg-surface pb-[env(safe-area-inset-bottom)] pl-[env(safe-area-inset-left)] pr-[env(safe-area-inset-right)]" : [
91
+ class: normalizeClass(bottom.value ? unref(BOTTOM_BAR) : [
98
92
  "max-w-full gap-1 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
99
93
  __props.block ? "flex w-full" : "inline-flex",
100
94
  __props.variant === "contained" ? "rounded-control border border-line bg-surface-soft p-1" : "",
@@ -114,8 +108,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
114
108
  createVNode(unref(TabsTrigger), {
115
109
  value: item.value,
116
110
  disabled: item.disabled,
111
+ title: __props.compact && item.icon && !bottom.value ? item.label : void 0,
117
112
  class: normalizeClass(["relative inline-flex items-center justify-center outline-none transition-[color,opacity] duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-ring data-[disabled]:cursor-not-allowed data-[disabled]:opacity-45", [
118
- bottom.value ? "min-h-14 min-w-0 flex-col gap-0.5 px-1 py-1.5 text-[11px] font-medium focus-visible:ring-inset" : "shrink-0 gap-1.5 whitespace-nowrap text-sm",
113
+ bottom.value ? unref(BOTTOM_ITEM) : "shrink-0 gap-1.5 whitespace-nowrap text-sm",
119
114
  __props.block && !bottom.value ? "flex-1" : "",
120
115
  __props.variant === "underline" ? "rounded-t-inner px-3 pt-1.5 pb-2" : "",
121
116
  __props.variant === "contained" || __props.variant === "plain" ? "rounded-inner px-3 py-1.5" : "",
@@ -133,67 +128,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
133
128
  class: normalizeClass(__props.variant === "underline" ? [
134
129
  "absolute inset-x-0 -bottom-px z-0 h-0.5 rounded-full",
135
130
  __props.accent ? "bg-brand" : "bg-ink"
136
- ] : bottom.value ? [
137
- "absolute inset-x-[22%] top-0 z-0 h-0.5 rounded-b-full",
138
- __props.accent ? "bg-brand" : "bg-ink"
139
- ] : [
131
+ ] : bottom.value ? [unref(BOTTOM_MARKER), __props.accent ? "bg-brand" : "bg-ink"] : [
140
132
  "absolute inset-0 z-0 rounded-inner shadow-sm",
141
133
  __props.accent ? "border border-brand/35 bg-brand/12" : "border border-line bg-surface-raised"
142
134
  ])
143
135
  }, null, 8, ["transition", "class"])) : createCommentVNode("", true),
144
- item.icon ? (openBlock(), createElementBlock("span", _hoisted_1, [
145
- createVNode(_sfc_main$2, {
146
- name: item.icon,
147
- size: bottom.value ? 22 : 14
148
- }, null, 8, ["name", "size"]),
149
- item.dot ? (openBlock(), createBlock(_sfc_main$3, {
150
- key: 0,
151
- corner: ""
152
- })) : createCommentVNode("", true),
153
- createVNode(Transition, { name: "lp-tab-badge" }, {
154
- default: withCtx(() => [
155
- bottom.value && item.badge != null ? (openBlock(), createBlock(_sfc_main$4, {
156
- key: 0,
157
- size: "sm",
158
- tone: current.value === item.value ? "brand" : "neutral",
159
- class: "absolute -right-3 -top-1.5 min-w-[18px] justify-center"
160
- }, {
161
- default: withCtx(() => [
162
- createVNode(_sfc_main$5, {
163
- value: item.badge
164
- }, null, 8, ["value"])
165
- ]),
166
- _: 2
167
- }, 1032, ["tone"])) : createCommentVNode("", true)
168
- ]),
169
- _: 2
170
- }, 1024)
171
- ])) : createCommentVNode("", true),
172
- createElementVNode("span", {
173
- class: normalizeClass(["relative z-10", bottom.value ? "max-w-full truncate" : ""])
174
- }, toDisplayString(item.label), 3),
175
- item.dot && !item.icon ? (openBlock(), createBlock(_sfc_main$3, { key: 2 })) : createCommentVNode("", true),
176
- createVNode(Transition, { name: "lp-tab-badge" }, {
177
- default: withCtx(() => [
178
- !(bottom.value && item.icon) && item.badge != null ? (openBlock(), createBlock(_sfc_main$4, {
179
- key: 0,
180
- size: "sm",
181
- tone: current.value === item.value ? "brand" : "neutral",
182
- class: "relative z-10 min-w-[18px] justify-center"
183
- }, {
184
- default: withCtx(() => [
185
- createVNode(_sfc_main$5, {
186
- value: item.badge
187
- }, null, 8, ["value"])
188
- ]),
189
- _: 2
190
- }, 1032, ["tone"])) : createCommentVNode("", true)
191
- ]),
192
- _: 2
193
- }, 1024)
136
+ createVNode(_sfc_main$2, {
137
+ item,
138
+ bottom: bottom.value,
139
+ compact: __props.compact,
140
+ active: current.value === item.value
141
+ }, null, 8, ["item", "bottom", "compact", "active"])
194
142
  ]),
195
143
  _: 2
196
- }, 1032, ["value", "disabled", "class", "onPointerenter"])
144
+ }, 1032, ["value", "disabled", "title", "class", "onPointerenter"])
197
145
  ]),
198
146
  _: 2
199
147
  }, 1032, ["items", "title", "title-icon"]);
@@ -203,12 +151,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
203
151
  key: `skeleton-${n}`,
204
152
  class: normalizeClass(["flex items-center justify-center", bottom.value ? "min-h-14 flex-col gap-1.5 py-1.5" : "px-1 py-1.5"])
205
153
  }, [
206
- bottom.value ? (openBlock(), createBlock(_sfc_main$6, {
154
+ bottom.value ? (openBlock(), createBlock(_sfc_main$3, {
207
155
  key: 0,
208
156
  rounded: "pill",
209
157
  class: "size-5"
210
158
  })) : createCommentVNode("", true),
211
- createVNode(_sfc_main$6, {
159
+ createVNode(_sfc_main$3, {
212
160
  class: normalizeClass(bottom.value ? "h-2.5 w-10" : "h-5 w-16")
213
161
  }, null, 8, ["class"])
214
162
  ], 2);
@@ -247,7 +195,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
247
195
  };
248
196
  }
249
197
  });
250
- const LpTabs = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-2c920d5a"]]);
198
+ const LpTabs = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-9f51a497"]]);
251
199
  export {
252
200
  LpTabs as default
253
201
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpTagsInput-DrjmrOge.js";
1
+ import { _ as _sfc_main } from "../chunks/LpTagsInput-DAZNNehI.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -17,7 +17,17 @@ declare const __VLS_export: import("vue").DefineComponent<{
17
17
  * the <textarea> for native validation.
18
18
  */
19
19
  required?: boolean;
20
- }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
20
+ /**
21
+ * Grows with what is typed, wrapped lines included, from `rows` up to
22
+ * `maxRows`, then scrolls; the drag handle goes, since the height is the
23
+ * text's. For a composer, where a fixed box is either cramped or empty.
24
+ */
25
+ autosize?: boolean;
26
+ maxRows?: number;
27
+ }, {
28
+ el: import("vue").Ref<HTMLTextAreaElement | null, HTMLTextAreaElement | null>;
29
+ fit: () => void;
30
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
21
31
  "update:modelValue": (value: string) => any;
22
32
  }, string, import("vue").PublicProps, Readonly<{
23
33
  /** Contextual palette metadata; false excludes this control. */
@@ -35,8 +45,16 @@ declare const __VLS_export: import("vue").DefineComponent<{
35
45
  * the <textarea> for native validation.
36
46
  */
37
47
  required?: boolean;
48
+ /**
49
+ * Grows with what is typed, wrapped lines included, from `rows` up to
50
+ * `maxRows`, then scrolls; the drag handle goes, since the height is the
51
+ * text's. For a composer, where a fixed box is either cramped or empty.
52
+ */
53
+ autosize?: boolean;
54
+ maxRows?: number;
38
55
  }> & Readonly<{
39
56
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
40
57
  }>, {
41
58
  palette: PaletteControlOptions;
59
+ maxRows: number;
42
60
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpTextarea-BbYqmG1S.js";
1
+ import { _ as _sfc_main } from "../chunks/LpTextarea-DbmVPj2X.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpThemeProvider-DcbfOxsU.js";
1
+ import { _ as _sfc_main } from "../chunks/LpThemeProvider-8MG6yqU9.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -35,13 +35,13 @@ type __VLS_Props = {
35
35
  };
36
36
  declare var __VLS_14: {
37
37
  studio: ThemeStudio;
38
- }, __VLS_74: {
38
+ }, __VLS_89: {
39
39
  studio: ThemeStudio;
40
40
  };
41
41
  type __VLS_Slots = {} & {
42
42
  start?: (props: typeof __VLS_14) => any;
43
43
  } & {
44
- end?: (props: typeof __VLS_74) => any;
44
+ end?: (props: typeof __VLS_89) => any;
45
45
  };
46
46
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
47
47
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpThemeStudio-B2nPaG-h.js";
1
+ import { _ as _sfc_main } from "../chunks/LpThemeStudio-DWtG6OZZ.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,9 +1,12 @@
1
1
  type __VLS_Props = {
2
2
  label: string;
3
+ inline?: boolean;
3
4
  };
4
- declare var __VLS_1: {};
5
+ declare var __VLS_1: {}, __VLS_3: {};
5
6
  type __VLS_Slots = {} & {
6
7
  default?: (props: typeof __VLS_1) => any;
8
+ } & {
9
+ default?: (props: typeof __VLS_3) => any;
7
10
  };
8
11
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
9
12
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpThemeStudioSection-BwhqYDLf.js";
1
+ import { _ as _sfc_main } from "../chunks/LpThemeStudioSection-B7bt8Iyg.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpThemeSwitcher-C0A5sg_E.js";
1
+ import { _ as _sfc_main } from "../chunks/LpThemeSwitcher-Dcx-VkSk.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpTimeField-DQ8WvPr2.js";
1
+ import { _ as _sfc_main } from "../chunks/LpTimeField-BawSVsmt.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpToaster-BTTl_wuy.js";
1
+ import { _ as _sfc_main } from "../chunks/LpToaster-50hp_B5O.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -120,13 +120,15 @@ type __VLS_Props = {
120
120
  minimap?: boolean;
121
121
  controls?: boolean;
122
122
  };
123
+ declare const fitView: import("@vue-flow/core").FitView;
124
+ declare function fitFramed(params?: Parameters<typeof fitView>[0]): Promise<boolean>;
123
125
  declare function applyViewport(v: CanvasViewport): Promise<void>;
124
126
  declare var __VLS_29: {};
125
127
  type __VLS_Slots = {} & {
126
128
  'legend-extra'?: (props: typeof __VLS_29) => any;
127
129
  };
128
130
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
129
- fitView: import("@vue-flow/core").FitView;
131
+ fitView: typeof fitFramed;
130
132
  setViewport: typeof applyViewport;
131
133
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
132
134
  connect: (value: Connection) => any;
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpTopologyCanvas-B0wEvAoq.js";
1
+ import { _ as _sfc_main } from "../chunks/LpTopologyCanvas-CnUh8uzS.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpTour-BgCfNlaW.js";
1
+ import { _ as _sfc_main } from "../chunks/LpTour-DC3LTlxg.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpTruncate-TcqfkyJM.js";
1
+ import { _ as _sfc_main } from "../chunks/LpTruncate-Ced4gquB.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpUptimeBar-DRadGq4Y.js";
1
+ import { _ as _sfc_main } from "../chunks/LpUptimeBar-CuB0LX8K.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/MenuTitle-Dab3EGOp.js";
1
+ import { _ as _sfc_main } from "../chunks/MenuTitle-BmCNNTKH.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/OptionContent-DPzNsybd.js";
1
+ import { _ as _sfc_main } from "../chunks/OptionContent-22UT8zLn.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/PickerField-DwLw7j0L.js";
1
+ import { _ as _sfc_main } from "../chunks/PickerField-Bfh8id3d.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/RevealToggle-BVFM_FAU.js";
1
+ import { _ as _sfc_main } from "../chunks/RevealToggle-B0ITuIX-.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/TourCard--2IfgnUU.js";
1
+ import { _ as _sfc_main } from "../chunks/TourCard-CBkj1GYi.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -19,6 +19,13 @@ export interface ChartSeries {
19
19
  * own scale and its own ticks.
20
20
  */
21
21
  axis?: "left" | "right";
22
+ /**
23
+ * Start with this series switched off, the legend turning it back on. For a
24
+ * series worth having but loud next to the rest: messages in thousands beside
25
+ * people in tens flatten the people line on a shared axis until they are
26
+ * hidden, so the chart opens on the readable view.
27
+ */
28
+ hidden?: boolean;
22
29
  }
23
30
  export type ChartAxis = "left" | "right";
24
31
  /**
@@ -45,6 +52,13 @@ export interface ChartMarker {
45
52
  label?: string;
46
53
  color?: string;
47
54
  }
55
+ /**
56
+ * Which x labels to print with every `stride`-th one shown. The last point is
57
+ * always labelled (it is usually "now"), and when it lands within half a
58
+ * stride to the previous shown label that one gives way: "20 22 23" read as
59
+ * one smudge at the end of an hourly axis.
60
+ */
61
+ export declare function xLabelIndices(count: number, stride: number): number[];
48
62
  /** The x index a marker points at, or -1 when it names nothing on the axis. */
49
63
  export declare const markerIndex: (at: number | string, labels: string[], count: number) => number;
50
64
  /**
@@ -1,4 +1,16 @@
1
1
  import { compactNumber } from "./format.js";
2
+ function xLabelIndices(count, stride) {
3
+ if (count <= 0) return [];
4
+ const step = Math.max(1, Math.floor(stride));
5
+ const out = [];
6
+ for (let i = 0; i < count; i += step) out.push(i);
7
+ const last = count - 1;
8
+ if (out[out.length - 1] !== last) {
9
+ if (out.length > 1 && last - out[out.length - 1] <= step / 2) out.pop();
10
+ out.push(last);
11
+ }
12
+ return out;
13
+ }
2
14
  const markerIndex = (at, labels, count) => {
3
15
  if (typeof at === "number") return Number.isInteger(at) && at >= 0 && at < count ? at : -1;
4
16
  return labels.indexOf(at);
@@ -383,5 +395,6 @@ export {
383
395
  resolveLabels,
384
396
  resolveSlices,
385
397
  xAt,
398
+ xLabelIndices,
386
399
  yAt
387
400
  };
@@ -17,10 +17,16 @@ export interface CompactNumberOptions {
17
17
  /**
18
18
  * Writes the decimal separator the locale's way ("1,2k" in Russian). The
19
19
  * k/M/B/T suffixes stay: Intl's own compact notation changes the shape of
20
- * the figure per locale ("1,2 тыс."), which a tick label or a rolling
21
- * counter cannot absorb. Unset keeps a plain "." whatever the browser says.
20
+ * the figure per locale ("1,2 тыс."), which a tick label cannot absorb.
21
+ * Unset keeps a plain "." whatever the browser says.
22
22
  */
23
23
  locale?: string;
24
+ /**
25
+ * With a locale, write the unit as that locale does: "11,9 тыс." in Russian.
26
+ * For a figure read on its own (a stat tile, a counter), where "11,9k" looks
27
+ * foreign; not for axis ticks, where the longer word crowds the axis.
28
+ */
29
+ words?: boolean;
24
30
  /** Places for a figure below a thousand (12.25). Default 2. */
25
31
  plainDecimals?: number;
26
32
  /** Places once a unit is in play (1.2k). Default 1. */
@@ -32,7 +38,8 @@ export interface CompactNumberOptions {
32
38
  fixed?: boolean;
33
39
  }
34
40
  /**
35
- * A figure shortened with k/M/B/T: 1 200 → "1.2k", 3 400 000 → "3.4M".
41
+ * A figure shortened with k/M/B/T: 1 200 → "1.2k", 3 400 000 → "3.4M"; with
42
+ * `words` and a locale in that locale's own words, "1,2 тыс." in Russian.
36
43
  *
37
44
  * The unit is picked by what will PRINT, not by the raw size: 999 950 at one
38
45
  * place rounds to "1000k", which reads as the next unit up, so it becomes
@@ -39,9 +39,21 @@ const COMPACT_UNITS = [
39
39
  [1e9, "B"],
40
40
  [1e12, "T"]
41
41
  ];
42
+ const compactSuffixes = /* @__PURE__ */ new Map();
43
+ function compactSuffix(locale, step) {
44
+ const key = `${locale}|${step}`;
45
+ let found = compactSuffixes.get(key);
46
+ if (found === void 0) {
47
+ const parts = numberFormat(locale, { notation: "compact", compactDisplay: "short" }).formatToParts(COMPACT_UNITS[step][0]);
48
+ const at = parts.findIndex((p) => p.type === "compact");
49
+ found = at < 0 ? COMPACT_UNITS[step][1] : (parts[at - 1]?.type === "literal" ? parts[at - 1].value : "") + parts[at].value;
50
+ compactSuffixes.set(key, found);
51
+ }
52
+ return found;
53
+ }
42
54
  function compactNumber(value, options = {}) {
43
55
  if (!Number.isFinite(value)) return String(value);
44
- const { locale, plainDecimals = 2, decimals = 1, fixed = false } = options;
56
+ const { locale, plainDecimals = 2, decimals = 1, fixed = false, words = false } = options;
45
57
  const abs = Math.abs(value);
46
58
  let i = COMPACT_UNITS.length - 1;
47
59
  while (i > 0 && abs < COMPACT_UNITS[i][0]) i--;
@@ -59,7 +71,7 @@ function compactNumber(value, options = {}) {
59
71
  maximumFractionDigits: places,
60
72
  useGrouping: false
61
73
  }).format(scaled);
62
- return `${number}${COMPACT_UNITS[i][1]}`;
74
+ return `${number}${words && locale !== void 0 && i > 0 ? compactSuffix(locale, i) : COMPACT_UNITS[i][1]}`;
63
75
  }
64
76
  function decimalMark(locale) {
65
77
  return numberFormat(locale, {}).formatToParts(1.5).find((p) => p.type === "decimal")?.value ?? ".";
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, h } from "vue";
2
- import { _ as _sfc_main } from "../chunks/LpContextMenu-DXpFJjlO.js";
2
+ import { _ as _sfc_main } from "../chunks/LpContextMenu-rx2tCjwk.js";
3
3
  const MenuWhen = defineComponent({
4
4
  name: "MenuWhen",
5
5
  inheritAttrs: false,
@@ -0,0 +1,5 @@
1
+ export declare function splitChange(before: string, after: string): {
2
+ head: string;
3
+ mid: string;
4
+ tail: string;
5
+ };
@@ -0,0 +1,23 @@
1
+ const LETTER = new RegExp("\\p{L}", "u");
2
+ function letter(ch) {
3
+ return ch !== void 0 && LETTER.test(ch);
4
+ }
5
+ function splitChange(before, after) {
6
+ if (before === after) return { head: "", mid: after, tail: "" };
7
+ const a = [...before];
8
+ const b = [...after];
9
+ let head = 0;
10
+ while (head < a.length && head < b.length && a[head] === b[head]) head++;
11
+ while (head > 0 && letter(b[head - 1]) && (letter(b[head]) || letter(a[head]))) head--;
12
+ let tail = 0;
13
+ while (tail < a.length - head && tail < b.length - head && a[a.length - 1 - tail] === b[b.length - 1 - tail]) tail++;
14
+ while (tail > 0 && letter(b[b.length - tail]) && (letter(b[b.length - tail - 1]) || letter(a[a.length - tail - 1]))) tail--;
15
+ return {
16
+ head: b.slice(0, head).join(""),
17
+ mid: b.slice(head, b.length - tail).join(""),
18
+ tail: b.slice(b.length - tail).join("")
19
+ };
20
+ }
21
+ export {
22
+ splitChange
23
+ };
@@ -1,3 +1,4 @@
1
+ import type { Component } from "vue";
1
2
  import type { ContextMenuItemDef } from "./LpContextMenu.vue";
2
3
  export interface SidebarItem {
3
4
  id: string;
@@ -27,6 +28,38 @@ export interface SidebarItem {
27
28
  * "invoice", a page found by the feature it used to be called.
28
29
  */
29
30
  keywords?: string[];
31
+ /**
32
+ * Pages under this one, one level deep: folded under the row and opened
33
+ * while one of them is the current page, so a section's tabs are a click
34
+ * away without opening the section first. In a compact sidebar they open in
35
+ * a card beside the icon.
36
+ */
37
+ children?: SidebarItem[];
38
+ /** A dot instead of a count: something new here that has no number to it. */
39
+ dot?: boolean;
40
+ /**
41
+ * The keys that open this page ("G D"), shown at the row's end on hover and
42
+ * in the compact card. Display only: the app binds the keys.
43
+ */
44
+ hotkey?: string;
45
+ /**
46
+ * What the page holds, shown in a card beside the row once the pointer has
47
+ * rested on it (`previewDelay`): a glance before going there.
48
+ */
49
+ preview?: Component;
50
+ /**
51
+ * The hint-system page (or pages) this row opens. With the sidebar's
52
+ * `hints`, the row carries a dot while that page has news nobody has read,
53
+ * and loses it once the news is read there.
54
+ */
55
+ hintPage?: string | string[];
56
+ /**
57
+ * Work started on this page is still running (a publish, a deploy): a thin
58
+ * bar along the row's foot, sweeping while `true`, filled to a fraction
59
+ * while a number from 0 to 1. Leaving the page no longer hides that it is
60
+ * not done.
61
+ */
62
+ busy?: boolean | number;
30
63
  }
31
64
  export interface SidebarSection {
32
65
  /** Optional heading above the group. */
@@ -14,3 +14,6 @@ export interface TabChoice {
14
14
  * that contain it rather than being thrown away before they load.
15
15
  */
16
16
  export declare function pickTab(items: readonly TabChoice[], current: string | undefined): string | undefined;
17
+ export declare const BOTTOM_BAR = "grid w-full auto-cols-fr grid-flow-col border-t border-line bg-surface pb-[env(safe-area-inset-bottom)] pl-[env(safe-area-inset-left)] pr-[env(safe-area-inset-right)]";
18
+ export declare const BOTTOM_ITEM = "min-h-14 min-w-0 flex-col gap-0.5 px-1 py-1.5 text-[11px] font-medium focus-visible:ring-inset";
19
+ export declare const BOTTOM_MARKER = "absolute inset-x-[22%] top-0 z-0 h-0.5 rounded-b-full";
@@ -3,6 +3,12 @@ function pickTab(items, current) {
3
3
  if (items.some((item) => item.value === current && !item.disabled)) return current;
4
4
  return items.find((item) => !item.disabled)?.value ?? current;
5
5
  }
6
+ const BOTTOM_BAR = "grid w-full auto-cols-fr grid-flow-col border-t border-line bg-surface pb-[env(safe-area-inset-bottom)] pl-[env(safe-area-inset-left)] pr-[env(safe-area-inset-right)]";
7
+ const BOTTOM_ITEM = "min-h-14 min-w-0 flex-col gap-0.5 px-1 py-1.5 text-[11px] font-medium focus-visible:ring-inset";
8
+ const BOTTOM_MARKER = "absolute inset-x-[22%] top-0 z-0 h-0.5 rounded-b-full";
6
9
  export {
10
+ BOTTOM_BAR,
11
+ BOTTOM_ITEM,
12
+ BOTTOM_MARKER,
7
13
  pickTab
8
14
  };
@@ -13,6 +13,7 @@ function numbered(entries) {
13
13
  for (const entry of entries) {
14
14
  for (const command of entry.commands()) {
15
15
  if (!entry.automatic) {
16
+ if (manual.has(command.id)) continue;
16
17
  manual.add(command.id);
17
18
  out.push(command);
18
19
  continue;
@@ -1,20 +1,13 @@
1
1
  import { ref, watch, toValue, onBeforeUnmount } from "vue";
2
2
  import { prefersReducedMotion } from "./easing.js";
3
- import { atScrollEnd } from "./scroll.js";
4
3
  function useReveal(options = {}) {
5
- const { threshold = 0.25, rootMargin = "0px 0px -10% 0px" } = options;
4
+ const { threshold = 0.25, rootMargin = "0px" } = options;
6
5
  const el = ref(null);
7
6
  const revealed = ref(typeof window === "undefined");
8
7
  let observer = null;
9
- let edge = null;
10
- let onScroll = null;
11
8
  function stop() {
12
9
  observer?.disconnect();
13
10
  observer = null;
14
- edge?.disconnect();
15
- edge = null;
16
- if (onScroll) window.removeEventListener("scroll", onScroll, true);
17
- onScroll = null;
18
11
  }
19
12
  function reveal() {
20
13
  revealed.value = true;
@@ -41,20 +34,6 @@ function useReveal(options = {}) {
41
34
  { threshold, rootMargin }
42
35
  );
43
36
  observer.observe(node);
44
- let onScreen = false;
45
- const check = () => {
46
- if (onScreen && atScrollEnd(node)) reveal();
47
- };
48
- edge = new IntersectionObserver(
49
- (entries) => {
50
- onScreen = entries.some((entry) => entry.isIntersecting);
51
- check();
52
- },
53
- { threshold }
54
- );
55
- edge.observe(node);
56
- onScroll = check;
57
- window.addEventListener("scroll", onScroll, { capture: true, passive: true });
58
37
  },
59
38
  { immediate: true, flush: "post" }
60
39
  );