@leavepulse/ui 0.73.6 → 0.74.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 (152) hide show
  1. package/dist/chunks/{DropzoneLinkField-ppY9xalk.js → DropzoneLinkField-C-9BCGJn.js} +2 -2
  2. package/dist/chunks/{FieldWrapper-y5bKBNxA.js → FieldWrapper-CORPzo9s.js} +1 -1
  3. package/dist/chunks/{LpActionBar-B55msXTr.js → LpActionBar-BP1ld7-S.js} +2 -2
  4. package/dist/chunks/{LpAddressInput-mf_dEpj_.js → LpAddressInput-Al3HT5ey.js} +3 -3
  5. package/dist/chunks/{LpAlert-Cg7oIx1B.js → LpAlert-n5XPAZfv.js} +2 -2
  6. package/dist/chunks/{LpAppShell-B0Yu9MVs.js → LpAppShell-CpSSm5WT.js} +53 -24
  7. package/dist/chunks/{LpBadge-0A6sPks3.js → LpBadge-wUYLN4U9.js} +1 -1
  8. package/dist/chunks/{LpBottomNav-Dik-ZcHv.js → LpBottomNav-CbNQQPuL.js} +1 -1
  9. package/dist/chunks/{LpBreadcrumbs-ssZV3_od.js → LpBreadcrumbs-DPdbth-c.js} +1 -1
  10. package/dist/chunks/{LpButton-BgdewXxF.js → LpButton-CFb44IjC.js} +1 -1
  11. package/dist/chunks/{LpCard-BJ59q6hR.js → LpCard-r13WRqox.js} +1 -1
  12. package/dist/chunks/{LpCheckbox-B0kJ-t6T.js → LpCheckbox-Cs4SHaHX.js} +1 -1
  13. package/dist/chunks/{LpCodeBlock-CXR_7t_F.js → LpCodeBlock-DRC8VbXW.js} +1 -1
  14. package/dist/chunks/{LpCodeDisplay-BCghfBFC.js → LpCodeDisplay-CE9TxCA4.js} +4 -4
  15. package/dist/chunks/{LpConfirmDialog-CaA4pAre.js → LpConfirmDialog-DY2VjDji.js} +1 -1
  16. package/dist/chunks/{LpConfirmHost-CBIzALSL.js → LpConfirmHost-DvSZTJ4N.js} +1 -1
  17. package/dist/chunks/LpContextSwitcher-Dwh6dyID.js +81 -0
  18. package/dist/chunks/{LpCopyButton-Cw-lF7Q3.js → LpCopyButton-xF7wFVoU.js} +1 -1
  19. package/dist/chunks/{LpCountdown-BNNhnQAK.js → LpCountdown-DgeY3cLG.js} +1 -1
  20. package/dist/chunks/{LpDataList-CcAA-rD9.js → LpDataList-Jxyl9H5w.js} +1 -1
  21. package/dist/chunks/{LpEditable-CSuJIPbG.js → LpEditable-Cy6GLbFx.js} +2 -2
  22. package/dist/chunks/{LpFileTree-CxOh3rL2.js → LpFileTree-zIFEgo3I.js} +1 -1
  23. package/dist/chunks/{LpFileTreeNode-9ue2P7ER.js → LpFileTreeNode-cT6BIWvz.js} +3 -3
  24. package/dist/chunks/{LpFormField-BBFg8i2I.js → LpFormField-Ch69Jd-X.js} +1 -1
  25. package/dist/chunks/{LpHintLayer-Db_s9_DL.js → LpHintLayer-CgObdUsM.js} +2 -2
  26. package/dist/chunks/{LpHints-Cxf5GXsx.js → LpHints-Bz-BlaSl.js} +3 -3
  27. package/dist/chunks/{LpInfraNode-6NLxkAnr.js → LpInfraNode-46XOCkfq.js} +2 -2
  28. package/dist/chunks/{LpInput-B2dTt4pc.js → LpInput-Tw-yxT4I.js} +1 -1
  29. package/dist/chunks/{LpLightbox-Coe4OBUl.js → LpLightbox-B95yu22B.js} +2 -2
  30. package/dist/chunks/{LpLoader-DPTNhqLu.js → LpLoader-DVwkOmt9.js} +1 -1
  31. package/dist/chunks/{LpLogViewer-DxiR6Mbd.js → LpLogViewer-D25jM2_I.js} +3 -3
  32. package/dist/chunks/{LpMapPicker-DeJRMfFN.js → LpMapPicker-DRGgh89B.js} +1 -1
  33. package/dist/chunks/{LpMediaGallery-B7Km8N9l.js → LpMediaGallery-Bkram-MO.js} +1 -1
  34. package/dist/chunks/{LpModalNav-BmxEyqOx.js → LpModalNav-DQpV2kdn.js} +2 -2
  35. package/dist/chunks/{LpNotificationBell-u8-ZjRON.js → LpNotificationBell-3244LUVc.js} +3 -3
  36. package/dist/chunks/{LpPaletteTheme-CWAIjBCi.js → LpPaletteTheme-DiLYKQiZ.js} +3 -3
  37. package/dist/chunks/{LpPasswordInput-Ih7Lv43S.js → LpPasswordInput-BkHKQDhM.js} +2 -2
  38. package/dist/chunks/{LpPie-Idujdb3M.js → LpPie-DrZepi0p.js} +2 -2
  39. package/dist/chunks/{LpPipeline-QCZWWB0G.js → LpPipeline-B3aOVOkV.js} +2 -2
  40. package/dist/chunks/{LpRepeater-DghUJ3bc.js → LpRepeater-D7ZmnIYd.js} +2 -2
  41. package/dist/chunks/{LpScramble-DeT_D36q.js → LpScramble-Bn9OoOtC.js} +1 -1
  42. package/dist/chunks/{LpSecretField-osKPNdNT.js → LpSecretField-BbmqM9ye.js} +6 -6
  43. package/dist/chunks/{LpShift-kKUeG9NS.js → LpShift-CCq7dofl.js} +2 -4
  44. package/dist/chunks/{LpSidebar-CR_WKcn2.js → LpSidebar-BoNLKgh-.js} +2 -2
  45. package/dist/chunks/{LpSidebarNav-h3YunOAr.js → LpSidebarNav-Bky8chrv.js} +2 -2
  46. package/dist/chunks/{LpSidebarRow-SjV0Ouhq.js → LpSidebarRow-BRYhNDSo.js} +1 -1
  47. package/dist/chunks/{LpStat-DXqKD1h5.js → LpStat-f2LfDCJ4.js} +1 -1
  48. package/dist/chunks/{LpStatus-DfZREVe0.js → LpStatus-DglxttQ7.js} +2 -2
  49. package/dist/chunks/{LpStepMark-TaAyuNsH.js → LpStepMark-DpzKVyh8.js} +1 -1
  50. package/dist/chunks/{LpStepper-CKSTFzHE.js → LpStepper-DpsocBNJ.js} +1 -1
  51. package/dist/chunks/{LpSwap-KIS24N8W.js → LpSwap-C96c0LWh.js} +1 -1
  52. package/dist/chunks/{LpSwitch-DlZHmj-M.js → LpSwitch-BnXd1llc.js} +1 -1
  53. package/dist/chunks/{LpTabFace-JFJLW0kA.js → LpTabFace-DPCwKkH2.js} +1 -1
  54. package/dist/chunks/{LpTableFilter-47ANnx_a.js → LpTableFilter-CiVBpaq0.js} +3 -3
  55. package/dist/chunks/{LpTagsInput-CHoiid8u.js → LpTagsInput-C-mDG648.js} +2 -2
  56. package/dist/chunks/{LpTextarea-CU7C1pLO.js → LpTextarea-TE-yZv2U.js} +1 -1
  57. package/dist/chunks/{LpThemeStudio-zyOH3dF2.js → LpThemeStudio-BpORDvH6.js} +2 -2
  58. package/dist/chunks/{LpThemeSwitcher-BXJhQYGD.js → LpThemeSwitcher-BnEn_mvf.js} +2 -2
  59. package/dist/chunks/{LpToaster-C1D35SKk.js → LpToaster-IwTXjbbU.js} +1 -1
  60. package/dist/chunks/{LpTopologyCanvas-1OufbBtQ.js → LpTopologyCanvas-B1gIbS0n.js} +1 -1
  61. package/dist/chunks/{LpTour-XshJslGg.js → LpTour-BZq-mUMv.js} +1 -1
  62. package/dist/chunks/{LpTruncate-qgKA-3K3.js → LpTruncate-CflAIwiJ.js} +1 -1
  63. package/dist/chunks/{LpUptimeBar-qhvvmmoI.js → LpUptimeBar-DqNvvMBK.js} +2 -2
  64. package/dist/chunks/{RevealToggle-6MlmohxS.js → RevealToggle-BEit1n6Z.js} +1 -1
  65. package/dist/chunks/{TourCard-BuB-i4kv.js → TourCard-DNclH3u_.js} +3 -3
  66. package/dist/component-names.d.ts +1 -1
  67. package/dist/components/DropzoneLinkField.vue.js +1 -1
  68. package/dist/components/FieldWrapper.vue.js +1 -1
  69. package/dist/components/LpActionBar.vue.js +1 -1
  70. package/dist/components/LpAddressInput.vue.js +1 -1
  71. package/dist/components/LpAlert.vue.js +1 -1
  72. package/dist/components/LpAppShell.vue.d.ts +25 -1
  73. package/dist/components/LpAppShell.vue.js +1 -1
  74. package/dist/components/LpBadge.vue.js +1 -1
  75. package/dist/components/LpBottomNav.vue.js +1 -1
  76. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  77. package/dist/components/LpButton.vue.js +1 -1
  78. package/dist/components/LpCard.vue.js +1 -1
  79. package/dist/components/LpChart.vue.js +2 -2
  80. package/dist/components/LpCheckbox.vue.js +1 -1
  81. package/dist/components/LpCodeBlock.vue.js +1 -1
  82. package/dist/components/LpCodeDisplay.vue.js +1 -1
  83. package/dist/components/LpCommandPalette.vue.js +2 -2
  84. package/dist/components/LpConfirmDialog.vue.js +1 -1
  85. package/dist/components/LpConfirmHost.vue.js +1 -1
  86. package/dist/components/LpContextSwitcher.vue.d.ts +34 -0
  87. package/dist/components/LpContextSwitcher.vue.js +4 -0
  88. package/dist/components/LpCopyButton.vue.js +1 -1
  89. package/dist/components/LpCountdown.vue.js +1 -1
  90. package/dist/components/LpDataList.vue.js +1 -1
  91. package/dist/components/LpDropzone.vue.js +1 -1
  92. package/dist/components/LpEditable.vue.js +1 -1
  93. package/dist/components/LpFileTree.vue.js +1 -1
  94. package/dist/components/LpFileTreeNode.vue.js +1 -1
  95. package/dist/components/LpFormField.vue.js +1 -1
  96. package/dist/components/LpHintLayer.vue.js +1 -1
  97. package/dist/components/LpHints.vue.js +1 -1
  98. package/dist/components/LpImageEditor.vue.js +1 -1
  99. package/dist/components/LpInfraNode.vue.js +1 -1
  100. package/dist/components/LpInput.vue.js +1 -1
  101. package/dist/components/LpLightbox.vue.js +1 -1
  102. package/dist/components/LpLoader.vue.js +1 -1
  103. package/dist/components/LpLogViewer.vue.js +1 -1
  104. package/dist/components/LpMapPicker.vue.js +1 -1
  105. package/dist/components/LpMediaGallery.vue.js +1 -1
  106. package/dist/components/LpModalNav.vue.js +1 -1
  107. package/dist/components/LpNotificationBell.vue.js +1 -1
  108. package/dist/components/LpPaletteTheme.vue.js +1 -1
  109. package/dist/components/LpPasswordInput.vue.js +1 -1
  110. package/dist/components/LpPie.vue.js +1 -1
  111. package/dist/components/LpPipeline.vue.js +1 -1
  112. package/dist/components/LpRepeater.vue.js +1 -1
  113. package/dist/components/LpScramble.vue.js +1 -1
  114. package/dist/components/LpSecretField.vue.js +1 -1
  115. package/dist/components/LpShift.vue.js +1 -1
  116. package/dist/components/LpSidebar.vue.js +1 -1
  117. package/dist/components/LpSidebarNav.vue.js +1 -1
  118. package/dist/components/LpSidebarRow.vue.js +1 -1
  119. package/dist/components/LpStat.vue.js +1 -1
  120. package/dist/components/LpStatus.vue.js +1 -1
  121. package/dist/components/LpStepMark.vue.js +1 -1
  122. package/dist/components/LpStepper.vue.js +1 -1
  123. package/dist/components/LpSwap.vue.js +1 -1
  124. package/dist/components/LpSwitch.vue.js +1 -1
  125. package/dist/components/LpTabFace.vue.js +1 -1
  126. package/dist/components/LpTable.vue.js +6 -6
  127. package/dist/components/LpTableFilter.vue.js +1 -1
  128. package/dist/components/LpTabs.vue.js +1 -1
  129. package/dist/components/LpTagsInput.vue.js +1 -1
  130. package/dist/components/LpTextarea.vue.js +1 -1
  131. package/dist/components/LpThemeStudio.vue.js +1 -1
  132. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  133. package/dist/components/LpToaster.vue.js +1 -1
  134. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  135. package/dist/components/LpTour.vue.js +1 -1
  136. package/dist/components/LpTruncate.vue.js +1 -1
  137. package/dist/components/LpUptimeBar.vue.js +1 -1
  138. package/dist/components/RevealToggle.vue.js +1 -1
  139. package/dist/components/TourCard.vue.js +1 -1
  140. package/dist/components/sidebar.d.ts +6 -0
  141. package/dist/composables/useShift.d.ts +0 -2
  142. package/dist/composables/useShift.js +0 -5
  143. package/dist/index.d.ts +2 -0
  144. package/dist/index.js +143 -141
  145. package/package.json +1 -1
  146. package/src/component-names.ts +1 -0
  147. package/src/components/LpAppShell.vue +27 -3
  148. package/src/components/LpContextSwitcher.vue +74 -0
  149. package/src/components/LpShift.vue +2 -4
  150. package/src/components/sidebar.ts +7 -0
  151. package/src/composables/useShift.ts +0 -10
  152. package/src/index.ts +2 -0
package/dist/index.js CHANGED
@@ -1,22 +1,22 @@
1
1
  import { _ } from "./chunks/LayoutCanvas-CNOAUk7D.js";
2
- import { _ as _2 } from "./chunks/LpAddressInput-mf_dEpj_.js";
3
- import { _ as _3 } from "./chunks/LpMapPicker-DeJRMfFN.js";
2
+ import { _ as _2 } from "./chunks/LpAddressInput-Al3HT5ey.js";
3
+ import { _ as _3 } from "./chunks/LpMapPicker-DRGgh89B.js";
4
4
  import { OSM_TILES, createNominatimProvider, emptyAddress, formatAddress, project, tileUrl, unproject } from "./components/address.js";
5
- import { _ as _4 } from "./chunks/LpActionBar-B55msXTr.js";
6
- import { _ as _5 } from "./chunks/LpAlert-Cg7oIx1B.js";
7
- import { _ as _6 } from "./chunks/LpAppShell-B0Yu9MVs.js";
5
+ import { _ as _4 } from "./chunks/LpActionBar-BP1ld7-S.js";
6
+ import { _ as _5 } from "./chunks/LpAlert-n5XPAZfv.js";
7
+ import { _ as _6 } from "./chunks/LpAppShell-CpSSm5WT.js";
8
8
  import { _ as _7 } from "./chunks/LpAutocomplete-DOu7FN5P.js";
9
9
  import { _ as _8 } from "./chunks/LpAvatar-Cg6Az3wz.js";
10
- import { _ as _9 } from "./chunks/LpBadge-0A6sPks3.js";
11
- import { _ as _10 } from "./chunks/LpBreadcrumbs-ssZV3_od.js";
12
- import { _ as _11 } from "./chunks/LpButton-BgdewXxF.js";
10
+ import { _ as _9 } from "./chunks/LpBadge-wUYLN4U9.js";
11
+ import { _ as _10 } from "./chunks/LpBreadcrumbs-DPdbth-c.js";
12
+ import { _ as _11 } from "./chunks/LpButton-CFb44IjC.js";
13
13
  import { _ as _12 } from "./chunks/LpCalendar-CuoWks-0.js";
14
- import { _ as _13 } from "./chunks/LpCard-BJ59q6hR.js";
14
+ import { _ as _13 } from "./chunks/LpCard-r13WRqox.js";
15
15
  import { default as default2 } from "./components/LpChart.vue.js";
16
16
  import { backgroundOf, csvField, downloadFile, fileStem, inlineSvg, resolveCssColor, svgToPng, toCsv } from "./components/exportData.js";
17
17
  import { CHART_PALETTE, axisTicks, chartSummary, formatTick, markerIndex, niceScale, resolveSlices } from "./components/chart.js";
18
- import { _ as _14 } from "./chunks/LpCheckbox-B0kJ-t6T.js";
19
- import { _ as _15 } from "./chunks/LpCodeBlock-CXR_7t_F.js";
18
+ import { _ as _14 } from "./chunks/LpCheckbox-Cs4SHaHX.js";
19
+ import { _ as _15 } from "./chunks/LpCodeBlock-DRC8VbXW.js";
20
20
  import { tokenizeLines } from "./components/codeHighlight.js";
21
21
  import { _ as _16 } from "./chunks/LpColorPicker-1y1QJHZR.js";
22
22
  import { DEFAULT_SWATCHES, clampHsv, formatColor, hsvToHsl, hsvToRgb, isLight, normalizeHue, opaqueCss, parseColor, parseHex, rgbToHex, rgbToHsv } from "./components/color.js";
@@ -30,8 +30,8 @@ import { default as default6 } from "./components/LpPaletteStats.vue.js";
30
30
  import { default as default7 } from "./components/LpPaletteSwatches.vue.js";
31
31
  import { default as default8 } from "./components/LpKeys.vue.js";
32
32
  import { comboKeys, comboSteps } from "./components/keys.js";
33
- import { _ as _18 } from "./chunks/LpConfirmDialog-CaA4pAre.js";
34
- import { _ as _19 } from "./chunks/LpConfirmHost-CBIzALSL.js";
33
+ import { _ as _18 } from "./chunks/LpConfirmDialog-DY2VjDji.js";
34
+ import { _ as _19 } from "./chunks/LpConfirmHost-DvSZTJ4N.js";
35
35
  import { confirm, useConfirm } from "./components/confirm.js";
36
36
  import { _ as _20 } from "./chunks/LpContextMenu-rx2tCjwk.js";
37
37
  import { _ as _21 } from "./chunks/LpDatePicker-CA0QTfBC.js";
@@ -44,31 +44,31 @@ import { _ as _26 } from "./chunks/LpDrawer-RRamxbLV.js";
44
44
  import { _ as _27 } from "./chunks/LpDropdownMenu-Dl7Z4ZhS.js";
45
45
  import { default as default9 } from "./components/LpDropzone.vue.js";
46
46
  import { _ as _28 } from "./chunks/LpEmptyState-EQHiRYhG.js";
47
- import { _ as _29 } from "./chunks/LpFileTree-CxOh3rL2.js";
47
+ import { _ as _29 } from "./chunks/LpFileTree-zIFEgo3I.js";
48
48
  import { ancestorIds, checkStateOf, checkedCount, computeStats, fileIcon, formatModified, formatSize, sortNodes, subtreeIds, subtreeSize } from "./components/fileTree.js";
49
49
  import { _ as _30 } from "./chunks/LpFieldNotice-CzQ2_5rQ.js";
50
- import { _ as _31 } from "./chunks/LpFormField-BBFg8i2I.js";
50
+ import { _ as _31 } from "./chunks/LpFormField-Ch69Jd-X.js";
51
51
  import { _ as _32 } from "./chunks/LpIcon--5WSb3jJ.js";
52
52
  import { i, b, a, c } from "./chunks/icons-DMITlfw5.js";
53
53
  import { default as default10 } from "./components/LpImageEditor.vue.js";
54
- import { _ as _33 } from "./chunks/LpInfraNode-6NLxkAnr.js";
55
- import { _ as _34 } from "./chunks/LpInput-B2dTt4pc.js";
56
- import { _ as _35 } from "./chunks/LpLightbox-Coe4OBUl.js";
54
+ import { _ as _33 } from "./chunks/LpInfraNode-46XOCkfq.js";
55
+ import { _ as _34 } from "./chunks/LpInput-Tw-yxT4I.js";
56
+ import { _ as _35 } from "./chunks/LpLightbox-B95yu22B.js";
57
57
  import { fileNameOf } from "./components/lightbox.js";
58
58
  import { _ as _36 } from "./chunks/LpLink-Krkjhe_y.js";
59
- import { _ as _37 } from "./chunks/LpLogViewer-DxiR6Mbd.js";
59
+ import { _ as _37 } from "./chunks/LpLogViewer-D25jM2_I.js";
60
60
  import { countLevels, matchPositions, matchesTerm, ringWindow, stepMatch } from "./components/logSearch.js";
61
- import { _ as _38 } from "./chunks/LpMediaGallery-B7Km8N9l.js";
61
+ import { _ as _38 } from "./chunks/LpMediaGallery-Bkram-MO.js";
62
62
  import { _ as _39 } from "./chunks/LpModal-BnjZ2iem.js";
63
- import { _ as _40 } from "./chunks/LpModalNav-BmxEyqOx.js";
64
- import { _ as _41 } from "./chunks/LpNotificationBell-u8-ZjRON.js";
63
+ import { _ as _40 } from "./chunks/LpModalNav-DQpV2kdn.js";
64
+ import { _ as _41 } from "./chunks/LpNotificationBell-3244LUVc.js";
65
65
  import { _ as _42 } from "./chunks/LpNumberField-e0IBkWU1.js";
66
66
  import { _ as _43 } from "./chunks/LpTimeField-BawSVsmt.js";
67
67
  import { _ as _44 } from "./chunks/LpNumberFlow-Vqj0tP7B.js";
68
68
  import { _ as _45 } from "./chunks/LpOtpInput-CeBPsM7D.js";
69
69
  import { _ as _46 } from "./chunks/LpPagination-BIIiYHXR.js";
70
- import { _ as _47 } from "./chunks/LpPasswordInput-Ih7Lv43S.js";
71
- import { _ as _48 } from "./chunks/LpPie-Idujdb3M.js";
70
+ import { _ as _47 } from "./chunks/LpPasswordInput-BkHKQDhM.js";
71
+ import { _ as _48 } from "./chunks/LpPie-DrZepi0p.js";
72
72
  import { _ as _49 } from "./chunks/LpPhoneInput-CETEp5W7.js";
73
73
  import { filterCountries, flagEmoji, loadCountries, matchCountryByValue } from "./components/countries.js";
74
74
  import { _ as _50 } from "./chunks/LpPopover-DmZ3wUtP.js";
@@ -82,49 +82,50 @@ import { _ as _57 } from "./chunks/LpSection-DFK_uoJE.js";
82
82
  import { _ as _58 } from "./chunks/LpSelect-Cxq4yBGd.js";
83
83
  import { fitChips, toggledValues } from "./components/select.js";
84
84
  import { _ as _59 } from "./chunks/LpServiceNode-D8uJ8sGk.js";
85
- import { _ as _60 } from "./chunks/LpShift-kKUeG9NS.js";
86
- import { _ as _61 } from "./chunks/LpSwap-KIS24N8W.js";
85
+ import { _ as _60 } from "./chunks/LpShift-CCq7dofl.js";
86
+ import { _ as _61 } from "./chunks/LpSwap-C96c0LWh.js";
87
87
  import { _ as _62 } from "./chunks/LpHintExample-9Py0wc-L.js";
88
88
  import { default as default11 } from "./components/LpShortcutsDialog.vue.js";
89
- import { _ as _63 } from "./chunks/LpSidebar-CR_WKcn2.js";
90
- import { _ as _64 } from "./chunks/LpSkeleton-BB6XIV-w.js";
91
- import { _ as _65 } from "./chunks/LpSlider-DxYoCJJO.js";
92
- import { _ as _66 } from "./chunks/LpRangeSlider-CM-0ZITZ.js";
93
- import { _ as _67 } from "./chunks/LpVideoBackdrop-DS1wGv-X.js";
89
+ import { _ as _63 } from "./chunks/LpSidebar-BoNLKgh-.js";
90
+ import { _ as _64 } from "./chunks/LpContextSwitcher-Dwh6dyID.js";
91
+ import { _ as _65 } from "./chunks/LpSkeleton-BB6XIV-w.js";
92
+ import { _ as _66 } from "./chunks/LpSlider-DxYoCJJO.js";
93
+ import { _ as _67 } from "./chunks/LpRangeSlider-CM-0ZITZ.js";
94
+ import { _ as _68 } from "./chunks/LpVideoBackdrop-DS1wGv-X.js";
94
95
  import { formatClipTime, isNativeLoop, planLoop, seamProgress, seamReached } from "./components/videoBackdrop.js";
95
- import { _ as _68 } from "./chunks/LpSparkline-CExIRDb3.js";
96
- import { _ as _69 } from "./chunks/LpStat-DXqKD1h5.js";
97
- import { _ as _70 } from "./chunks/LpStepper-CKSTFzHE.js";
98
- import { _ as _71 } from "./chunks/LpSwitch-DlZHmj-M.js";
96
+ import { _ as _69 } from "./chunks/LpSparkline-CExIRDb3.js";
97
+ import { _ as _70 } from "./chunks/LpStat-f2LfDCJ4.js";
98
+ import { _ as _71 } from "./chunks/LpStepper-DpsocBNJ.js";
99
+ import { _ as _72 } from "./chunks/LpSwitch-BnXd1llc.js";
99
100
  import { default as default12 } from "./components/LpTable.vue.js";
100
101
  import { compareValues } from "./components/tableSort.js";
101
102
  import { resolveRowMenu } from "./components/tableRowMenu.js";
102
- import { _ as _72 } from "./chunks/LpTableOfContents-BN5zvpnx.js";
103
+ import { _ as _73 } from "./chunks/LpTableOfContents-BN5zvpnx.js";
103
104
  import { default as default13 } from "./components/LpTabs.vue.js";
104
- import { _ as _73 } from "./chunks/LpBottomNav-Dik-ZcHv.js";
105
- import { _ as _74 } from "./chunks/LpTagsInput-CHoiid8u.js";
105
+ import { _ as _74 } from "./chunks/LpBottomNav-CbNQQPuL.js";
106
+ import { _ as _75 } from "./chunks/LpTagsInput-C-mDG648.js";
106
107
  import { addTags, splitTags } from "./components/tags.js";
107
- import { _ as _75 } from "./chunks/LpTextarea-CU7C1pLO.js";
108
- import { _ as _76 } from "./chunks/LpThemeSwitcher-BXJhQYGD.js";
109
- import { _ as _77 } from "./chunks/LpTilt-B7KHX1zH.js";
110
- import { _ as _78 } from "./chunks/LpToaster-C1D35SKk.js";
111
- import { _ as _79 } from "./chunks/LpTooltip-BcBvIx4z.js";
112
- import { _ as _80 } from "./chunks/LpTour-XshJslGg.js";
108
+ import { _ as _76 } from "./chunks/LpTextarea-TE-yZv2U.js";
109
+ import { _ as _77 } from "./chunks/LpThemeSwitcher-BnEn_mvf.js";
110
+ import { _ as _78 } from "./chunks/LpTilt-B7KHX1zH.js";
111
+ import { _ as _79 } from "./chunks/LpToaster-IwTXjbbU.js";
112
+ import { _ as _80 } from "./chunks/LpTooltip-BcBvIx4z.js";
113
+ import { _ as _81 } from "./chunks/LpTour-BZq-mUMv.js";
113
114
  import { holeOf, openContextMenu, panelsAround } from "./components/tour.js";
114
- import { _ as _81 } from "./chunks/LpHintLayer-Db_s9_DL.js";
115
- import { _ as _82 } from "./chunks/LpHints-Cxf5GXsx.js";
115
+ import { _ as _82 } from "./chunks/LpHintLayer-CgObdUsM.js";
116
+ import { _ as _83 } from "./chunks/LpHints-Bz-BlaSl.js";
116
117
  import { HINT_SIGNALS, contextMenuTip, createHintSystem, dropzoneTip, hintKey, hintSummary, hotkeyTip, localHintStorage, noteDropzone, noteHotkeyTarget, paletteTip, provideHintSystem, runningHintSystem, useHintSystem } from "./composables/useHintSystem.js";
117
- import { _ as _83 } from "./chunks/LpTooltipProvider-CftjV7Xc.js";
118
- import { _ as _84 } from "./chunks/LpTopologyCanvas-1OufbBtQ.js";
119
- import { _ as _85 } from "./chunks/LpUptimeBar-qhvvmmoI.js";
118
+ import { _ as _84 } from "./chunks/LpTooltipProvider-CftjV7Xc.js";
119
+ import { _ as _85 } from "./chunks/LpTopologyCanvas-B1gIbS0n.js";
120
+ import { _ as _86 } from "./chunks/LpUptimeBar-DqNvvMBK.js";
120
121
  import { deserializeLayout, serializeLayout } from "./layout/tree.js";
121
122
  import { addLeaf, addTab, countBlocks, countLeaves, makeLayout, moveLeaf, removeBlock, removeLeaf, reorderTab, resizeAt, setActiveTab } from "./layout/tree.js";
122
123
  import { blockTitle, defineBlocks } from "./layout/registry.js";
123
124
  import { layoutController, useLayout } from "./layout/useLayout.js";
124
125
  import { a as parseTheme, s as serializeTheme } from "./chunks/LpThemeProvider-8MG6yqU9.js";
125
- import { D, _ as _86, T, b as b2, c as c2, d, e, f, g, l, h, n, i as i2, j, p, r, k, t, m, o, q, u, v } from "./chunks/LpThemeProvider-8MG6yqU9.js";
126
+ import { D, _ as _87, T, b as b2, c as c2, d, e, f, g, l, h, n, i as i2, j, p, r, k, t, m, o, q, u, v } from "./chunks/LpThemeProvider-8MG6yqU9.js";
126
127
  import { G, N, d as d2, i as i3, s } from "./chunks/backdrop-Dkf2vM81.js";
127
- import { _ as _87, a as a2, b as b3, c as c3, d as d3, S, e as e2, u as u2, w } from "./chunks/LpThemeStudio-zyOH3dF2.js";
128
+ import { _ as _88, a as a2, b as b3, c as c3, d as d3, S, e as e2, u as u2, w } from "./chunks/LpThemeStudio-BpORDvH6.js";
128
129
  import { useClipboard } from "./composables/useClipboard.js";
129
130
  import { activeShortcuts, appleModifierLabel, findHotkeyConflicts, hotkeyConflicts, hotkeySteps, isAppleKeyboard, matchesHotkey, mergeShortcutGroups, parseCombo, pendingHotkey, sequenceProgress, useAppleKeyboard, useHotkeys } from "./composables/useHotkeys.js";
130
131
  import { anyModalOpen, topModalElement, useModalLayer } from "./components/modalDepth.js";
@@ -160,64 +161,64 @@ import { useShift } from "./composables/useShift.js";
160
161
  import { useTilt } from "./composables/useTilt.js";
161
162
  import { useZoomPan } from "./composables/useZoomPan.js";
162
163
  import { useToast } from "./composables/useToast.js";
163
- import { _ as _88 } from "./chunks/LpFrame-BVQCQLDI.js";
164
- import { _ as _89 } from "./chunks/LpThemeStudioSection-B7bt8Iyg.js";
164
+ import { _ as _89 } from "./chunks/LpFrame-BVQCQLDI.js";
165
+ import { _ as _90 } from "./chunks/LpThemeStudioSection-B7bt8Iyg.js";
165
166
  import { isInternalHref, resolveLink } from "./components/link.js";
166
- import { _ as _90 } from "./chunks/LpRepeater-DghUJ3bc.js";
167
- import { _ as _91 } from "./chunks/LpGauge-KZaQ_FDR.js";
168
- import { _ as _92 } from "./chunks/LpQuota-Dk2MyI2Z.js";
169
- import { _ as _93 } from "./chunks/LpStatus-DfZREVe0.js";
170
- import { _ as _94 } from "./chunks/LpRelativeTime-DwgCb5-8.js";
171
- import { _ as _95 } from "./chunks/LpActivityLine-CJvzrNpj.js";
167
+ import { _ as _91 } from "./chunks/LpRepeater-D7ZmnIYd.js";
168
+ import { _ as _92 } from "./chunks/LpGauge-KZaQ_FDR.js";
169
+ import { _ as _93 } from "./chunks/LpQuota-Dk2MyI2Z.js";
170
+ import { _ as _94 } from "./chunks/LpStatus-DglxttQ7.js";
171
+ import { _ as _95 } from "./chunks/LpRelativeTime-DwgCb5-8.js";
172
+ import { _ as _96 } from "./chunks/LpActivityLine-CJvzrNpj.js";
172
173
  import { TONE_COLOR, TONE_SOFT, arcPath, capacityThresholds, meterFraction, toneAt } from "./components/meter.js";
173
174
  import { TONES, TONE_ALIASES, toneLook, toneOf } from "./components/tone.js";
174
175
  import { formatAmount, quotaSegments, quotaState } from "./components/quota.js";
175
176
  import { compactNumber, decimalMark, formatBytes } from "./components/format.js";
176
177
  import { STATUS_LABELS, STATUS_LOOK } from "./components/status.js";
177
178
  import { formatRelativeTime } from "./components/relativeTime.js";
178
- import { _ as _96 } from "./chunks/LpPipeline-QCZWWB0G.js";
179
- import { _ as _97 } from "./chunks/LpStepMark-TaAyuNsH.js";
179
+ import { _ as _97 } from "./chunks/LpPipeline-B3aOVOkV.js";
180
+ import { _ as _98 } from "./chunks/LpStepMark-DpzKVyh8.js";
180
181
  import { childProgress, connectorFilled, currentStepIndex, isSettled, overallStatus, stepElapsed } from "./components/pipeline.js";
181
- import { _ as _98 } from "./chunks/LpLoader-DPTNhqLu.js";
182
+ import { _ as _99 } from "./chunks/LpLoader-DVwkOmt9.js";
182
183
  import { useLoadingGate } from "./composables/useLoadingGate.js";
183
184
  import { useNow } from "./composables/useNow.js";
184
- import { _ as _99 } from "./chunks/LpCountdown-BNNhnQAK.js";
185
+ import { _ as _100 } from "./chunks/LpCountdown-DgeY3cLG.js";
185
186
  import { DEFAULT_MILESTONES, DEFAULT_UNIT_LABELS, ceilToSecond, crossedMilestone, formatElapsed, formatTime, msToNextSecond, splitTime, timeParts } from "./components/timeSpan.js";
186
- import { _ as _100 } from "./chunks/LpCopyButton-Cw-lF7Q3.js";
187
- import { _ as _101 } from "./chunks/LpSecretField-osKPNdNT.js";
188
- import { _ as _102 } from "./chunks/LpDataList-CcAA-rD9.js";
189
- import { _ as _103 } from "./chunks/LpEditable-CSuJIPbG.js";
190
- import { _ as _104 } from "./chunks/LpTruncate-qgKA-3K3.js";
191
- import { _ as _105 } from "./chunks/LpCodeDisplay-BCghfBFC.js";
187
+ import { _ as _101 } from "./chunks/LpCopyButton-xF7wFVoU.js";
188
+ import { _ as _102 } from "./chunks/LpSecretField-BbmqM9ye.js";
189
+ import { _ as _103 } from "./chunks/LpDataList-Jxyl9H5w.js";
190
+ import { _ as _104 } from "./chunks/LpEditable-Cy6GLbFx.js";
191
+ import { _ as _105 } from "./chunks/LpTruncate-CflAIwiJ.js";
192
+ import { _ as _106 } from "./chunks/LpCodeDisplay-CE9TxCA4.js";
192
193
  import { formatRemaining, groupCode, middleTruncate, normalizeCode } from "./components/fieldText.js";
193
- import { _ as _106 } from "./chunks/LpHoverCard-spGxyw7T.js";
194
- import { _ as _107 } from "./chunks/LpIdenticon-BzdC_qz9.js";
194
+ import { _ as _107 } from "./chunks/LpHoverCard-spGxyw7T.js";
195
+ import { _ as _108 } from "./chunks/LpIdenticon-BzdC_qz9.js";
195
196
  import { hashString, identicon, identiconRects, identiconSvg } from "./components/identicon.js";
196
- import { _ as _108 } from "./chunks/LpShaderBackdrop-Bote0iuy.js";
197
+ import { _ as _109 } from "./chunks/LpShaderBackdrop-Bote0iuy.js";
197
198
  import { PRESET_NAMES } from "./components/shaderBackdrop.js";
198
- import { _ as _109 } from "./chunks/LpCollapse-CWS9M_lm.js";
199
+ import { _ as _110 } from "./chunks/LpCollapse-CWS9M_lm.js";
199
200
  import { pseudoLocalize } from "./composables/pseudoLocale.js";
200
- import { _ as _110 } from "./chunks/LpTextReveal-CtAnOUkp.js";
201
- import { _ as _111 } from "./chunks/LpShinyText-DX2ajtWq.js";
202
- import { _ as _112 } from "./chunks/LpTypewriter-BCL_a6wE.js";
203
- import { _ as _113 } from "./chunks/LpScramble-DeT_D36q.js";
201
+ import { _ as _111 } from "./chunks/LpTextReveal-CtAnOUkp.js";
202
+ import { _ as _112 } from "./chunks/LpShinyText-DX2ajtWq.js";
203
+ import { _ as _113 } from "./chunks/LpTypewriter-BCL_a6wE.js";
204
+ import { _ as _114 } from "./chunks/LpScramble-Bn9OoOtC.js";
204
205
  import { useScramble } from "./composables/useScramble.js";
205
206
  import { useInView } from "./composables/useInView.js";
206
207
  import { SCRAMBLE_GLYPHS, graphemes, planScramble, randomGlyph, scrambleFrame, seededRandom, settledCells } from "./components/scramble.js";
207
208
  import { default as default14 } from "./components/LpDock.vue.js";
208
209
  import { dockSize, magneticOffset } from "./components/dock.js";
209
- import { _ as _114 } from "./chunks/LpMasonry--k0571qG.js";
210
+ import { _ as _115 } from "./chunks/LpMasonry--k0571qG.js";
210
211
  import { masonryColumnCount, placeMasonry } from "./components/masonry.js";
211
- import { _ as _115 } from "./chunks/LpRevealOnScroll-DcQjexLy.js";
212
+ import { _ as _116 } from "./chunks/LpRevealOnScroll-DcQjexLy.js";
212
213
  import { revealFrom, revealTo, staggerDelay } from "./components/reveal.js";
213
- import { _ as _116 } from "./chunks/LpSpotlight-4F3NeUMY.js";
214
- import { _ as _117 } from "./chunks/LpGlowBorder-B8V-QzIl.js";
215
- import { _ as _118 } from "./chunks/LpMagnetic-CtXKLa2Y.js";
214
+ import { _ as _117 } from "./chunks/LpSpotlight-4F3NeUMY.js";
215
+ import { _ as _118 } from "./chunks/LpGlowBorder-B8V-QzIl.js";
216
+ import { _ as _119 } from "./chunks/LpMagnetic-CtXKLa2Y.js";
216
217
  import { spotlightPoint, useSpotlight } from "./composables/useSpotlight.js";
217
- import { _ as _119 } from "./chunks/LpCommandScope-CtUhJe8T.js";
218
+ import { _ as _120 } from "./chunks/LpCommandScope-CtUhJe8T.js";
218
219
  import { createPaletteRegistry, mergePaletteCommands, usePaletteCommands, vPalette } from "./composables/usePaletteCommands.js";
219
220
  import { u as u3 } from "./chunks/palette-Co8tSASo.js";
220
- import { _ as _120 } from "./chunks/LpPaletteTheme-CWAIjBCi.js";
221
+ import { _ as _121 } from "./chunks/LpPaletteTheme-DiLYKQiZ.js";
221
222
  const UI_CONFIG_VERSION = 1;
222
223
  function serializeConfig(config) {
223
224
  const out = {
@@ -250,14 +251,14 @@ export {
250
251
  LP_FIELD,
251
252
  _ as LayoutCanvas,
252
253
  _4 as LpActionBar,
253
- _95 as LpActivityLine,
254
+ _96 as LpActivityLine,
254
255
  _2 as LpAddressInput,
255
256
  _5 as LpAlert,
256
257
  _6 as LpAppShell,
257
258
  _7 as LpAutocomplete,
258
259
  _8 as LpAvatar,
259
260
  _9 as LpBadge,
260
- _73 as LpBottomNav,
261
+ _74 as LpBottomNav,
261
262
  _10 as LpBreadcrumbs,
262
263
  _11 as LpButton,
263
264
  _12 as LpCalendar,
@@ -265,17 +266,18 @@ export {
265
266
  default2 as LpChart,
266
267
  _14 as LpCheckbox,
267
268
  _15 as LpCodeBlock,
268
- _105 as LpCodeDisplay,
269
- _109 as LpCollapse,
269
+ _106 as LpCodeDisplay,
270
+ _110 as LpCollapse,
270
271
  _16 as LpColorPicker,
271
272
  default3 as LpCommandPalette,
272
- _119 as LpCommandScope,
273
+ _120 as LpCommandScope,
273
274
  _18 as LpConfirmDialog,
274
275
  _19 as LpConfirmHost,
275
276
  _20 as LpContextMenu,
276
- _100 as LpCopyButton,
277
- _99 as LpCountdown,
278
- _102 as LpDataList,
277
+ _64 as LpContextSwitcher,
278
+ _101 as LpCopyButton,
279
+ _100 as LpCountdown,
280
+ _103 as LpDataList,
279
281
  _21 as LpDatePicker,
280
282
  _22 as LpDateRangePicker,
281
283
  _24 as LpDisclosure,
@@ -284,31 +286,31 @@ export {
284
286
  _26 as LpDrawer,
285
287
  _27 as LpDropdownMenu,
286
288
  default9 as LpDropzone,
287
- _103 as LpEditable,
289
+ _104 as LpEditable,
288
290
  _28 as LpEmptyState,
289
291
  _30 as LpFieldNotice,
290
292
  _29 as LpFileTree,
291
293
  _31 as LpFormField,
292
- _88 as LpFrame,
293
- _91 as LpGauge,
294
- _117 as LpGlowBorder,
294
+ _89 as LpFrame,
295
+ _92 as LpGauge,
296
+ _118 as LpGlowBorder,
295
297
  _62 as LpHintExample,
296
- _81 as LpHintLayer,
297
- _82 as LpHints,
298
- _106 as LpHoverCard,
298
+ _82 as LpHintLayer,
299
+ _83 as LpHints,
300
+ _107 as LpHoverCard,
299
301
  _32 as LpIcon,
300
- _107 as LpIdenticon,
302
+ _108 as LpIdenticon,
301
303
  default10 as LpImageEditor,
302
304
  _33 as LpInfraNode,
303
305
  _34 as LpInput,
304
306
  default8 as LpKeys,
305
307
  _35 as LpLightbox,
306
308
  _36 as LpLink,
307
- _98 as LpLoader,
309
+ _99 as LpLoader,
308
310
  _37 as LpLogViewer,
309
- _118 as LpMagnetic,
311
+ _119 as LpMagnetic,
310
312
  _3 as LpMapPicker,
311
- _114 as LpMasonry,
313
+ _115 as LpMasonry,
312
314
  _38 as LpMediaGallery,
313
315
  _39 as LpModal,
314
316
  _40 as LpModalNav,
@@ -322,65 +324,65 @@ export {
322
324
  _17 as LpPalettePreview,
323
325
  default6 as LpPaletteStats,
324
326
  default7 as LpPaletteSwatches,
325
- _120 as LpPaletteTheme,
327
+ _121 as LpPaletteTheme,
326
328
  _47 as LpPasswordInput,
327
329
  _49 as LpPhoneInput,
328
330
  _48 as LpPie,
329
- _96 as LpPipeline,
331
+ _97 as LpPipeline,
330
332
  _50 as LpPopover,
331
333
  _51 as LpProgress,
332
- _92 as LpQuota,
334
+ _93 as LpQuota,
333
335
  _52 as LpRadio,
334
336
  _53 as LpRadioGroup,
335
337
  _23 as LpRangeCalendar,
336
- _66 as LpRangeSlider,
337
- _94 as LpRelativeTime,
338
- _90 as LpRepeater,
339
- _115 as LpRevealOnScroll,
338
+ _67 as LpRangeSlider,
339
+ _95 as LpRelativeTime,
340
+ _91 as LpRepeater,
341
+ _116 as LpRevealOnScroll,
340
342
  _54 as LpRollingText,
341
- _113 as LpScramble,
343
+ _114 as LpScramble,
342
344
  _55 as LpScrollArea,
343
- _101 as LpSecretField,
345
+ _102 as LpSecretField,
344
346
  _57 as LpSection,
345
347
  _56 as LpSegmented,
346
348
  _58 as LpSelect,
347
349
  _59 as LpServiceNode,
348
- _108 as LpShaderBackdrop,
350
+ _109 as LpShaderBackdrop,
349
351
  _60 as LpShift,
350
- _111 as LpShinyText,
352
+ _112 as LpShinyText,
351
353
  default11 as LpShortcutsDialog,
352
354
  _63 as LpSidebar,
353
- _64 as LpSkeleton,
354
- _65 as LpSlider,
355
- _68 as LpSparkline,
356
- _116 as LpSpotlight,
357
- _69 as LpStat,
358
- _93 as LpStatus,
359
- _97 as LpStepMark,
360
- _70 as LpStepper,
355
+ _65 as LpSkeleton,
356
+ _66 as LpSlider,
357
+ _69 as LpSparkline,
358
+ _117 as LpSpotlight,
359
+ _70 as LpStat,
360
+ _94 as LpStatus,
361
+ _98 as LpStepMark,
362
+ _71 as LpStepper,
361
363
  _61 as LpSwap,
362
- _71 as LpSwitch,
364
+ _72 as LpSwitch,
363
365
  default12 as LpTable,
364
- _72 as LpTableOfContents,
366
+ _73 as LpTableOfContents,
365
367
  default13 as LpTabs,
366
- _74 as LpTagsInput,
367
- _110 as LpTextReveal,
368
- _75 as LpTextarea,
369
- _86 as LpThemeProvider,
370
- _87 as LpThemeStudio,
371
- _89 as LpThemeStudioSection,
372
- _76 as LpThemeSwitcher,
373
- _77 as LpTilt,
368
+ _75 as LpTagsInput,
369
+ _111 as LpTextReveal,
370
+ _76 as LpTextarea,
371
+ _87 as LpThemeProvider,
372
+ _88 as LpThemeStudio,
373
+ _90 as LpThemeStudioSection,
374
+ _77 as LpThemeSwitcher,
375
+ _78 as LpTilt,
374
376
  _43 as LpTimeField,
375
- _78 as LpToaster,
376
- _79 as LpTooltip,
377
- _83 as LpTooltipProvider,
378
- _84 as LpTopologyCanvas,
379
- _80 as LpTour,
380
- _104 as LpTruncate,
381
- _112 as LpTypewriter,
382
- _85 as LpUptimeBar,
383
- _67 as LpVideoBackdrop,
377
+ _79 as LpToaster,
378
+ _80 as LpTooltip,
379
+ _84 as LpTooltipProvider,
380
+ _85 as LpTopologyCanvas,
381
+ _81 as LpTour,
382
+ _105 as LpTruncate,
383
+ _113 as LpTypewriter,
384
+ _86 as LpUptimeBar,
385
+ _68 as LpVideoBackdrop,
384
386
  N as NO_BACKDROP_ATTR,
385
387
  OSM_TILES,
386
388
  PALETTE_MODES,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.73.6",
3
+ "version": "0.74.1",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {
@@ -27,6 +27,7 @@ export const COMPONENT_NAMES = [
27
27
  "LpConfirmDialog",
28
28
  "LpConfirmHost",
29
29
  "LpContextMenu",
30
+ "LpContextSwitcher",
30
31
  "LpCopyButton",
31
32
  "LpCountdown",
32
33
  "LpDataList",
@@ -35,12 +35,13 @@ import { computed, onMounted, ref, useId, watch } from "vue"
35
35
  import { useLabels } from "../composables/useLpConfig"
36
36
  import { useScrollMemory } from "../composables/scrollMemory"
37
37
  import LpBottomNav from "./LpBottomNav.vue"
38
+ import LpContextSwitcher from "./LpContextSwitcher.vue"
38
39
  import LpButton from "./LpButton.vue"
39
40
  import LpIcon from "./LpIcon.vue"
40
41
  import LpScrollArea from "./LpScrollArea.vue"
41
42
  import LpShift from "./LpShift.vue"
42
43
  import LpSidebar from "./LpSidebar.vue"
43
- import type { SidebarItem, SidebarSection } from "./sidebar"
44
+ import type { AppContext, SidebarItem, SidebarSection } from "./sidebar"
44
45
  import { mergeClass, useMergedAttrs } from "../composables/useMergedClass"
45
46
 
46
47
  export type { SidebarItem, SidebarSection } from "./sidebar"
@@ -107,6 +108,14 @@ const props = withDefaults(
107
108
  previewDelay?: number
108
109
  /** The key that folds the rail; false turns it off. Forwarded to LpSidebar. */
109
110
  compactHotkey?: string | false
111
+ /**
112
+ * The app's contexts — a server, a workspace, a part of the product — each
113
+ * with its own rail. With more than one, the rail's header becomes the
114
+ * switcher between them (v-model:context), and the `logo` slot draws the
115
+ * switcher's face with the current `context` in its props.
116
+ */
117
+ contexts?: AppContext[]
118
+ context?: string
110
119
  /** Marks a non-production copy along the top of the rail. Forwarded to LpSidebar. */
111
120
  environment?: string | { label: string; tone?: "warning" | "danger" | "action" | "brand" }
112
121
  /** The app's hint system; rows with a `hintPage` show unread news as a dot. Forwarded to LpSidebar. */
@@ -134,8 +143,11 @@ const emit = defineEmits<{
134
143
  (e: "select", item: SidebarItem): void
135
144
  (e: "update:compact", value: boolean): void
136
145
  (e: "update:pinned", ids: string[]): void
146
+ (e: "update:context", id: string): void
137
147
  }>()
138
148
 
149
+ const switching = computed(() => (props.contexts?.length ?? 0) > 1)
150
+
139
151
  // Normalise items/sections to a flat list for the title computation.
140
152
  const flatItems = computed<SidebarItem[]>(() =>
141
153
  (props.sections ? props.sections.flatMap((s) => s.items) : (props.items ?? [])).flatMap((i) => [i, ...(i.children ?? [])]),
@@ -297,8 +309,20 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
297
309
  @update:collapsed="(v) => emit('update:collapsed', v)"
298
310
  @select="onSelect"
299
311
  >
300
- <template v-if="$slots.logo" #header="{ compact: folded }">
301
- <slot name="logo" :compact="folded" />
312
+ <template v-if="switching" #header="{ compact: folded }">
313
+ <LpContextSwitcher
314
+ :contexts="contexts!"
315
+ :model-value="context"
316
+ :compact="folded"
317
+ @update:model-value="(id) => emit('update:context', id)"
318
+ >
319
+ <template v-if="$slots.logo" #default="{ context: shown }">
320
+ <slot name="logo" :compact="folded" :context="shown" />
321
+ </template>
322
+ </LpContextSwitcher>
323
+ </template>
324
+ <template v-else-if="$slots.logo" #header="{ compact: folded }">
325
+ <slot name="logo" :compact="folded" :context="contexts?.[0]" />
302
326
  </template>
303
327
  <template v-if="$slots['sidebar-actions']" #actions>
304
328
  <slot name="sidebar-actions" />
@@ -0,0 +1,74 @@
1
+ <script setup lang="ts">
2
+ /*
3
+ * Which of an app's contexts the rail is showing — a server, a workspace, a
4
+ * machine, a part of the product — and the menu to change it. Every app used
5
+ * to draw this into the rail's header slot itself, each a little differently;
6
+ * LpAppShell renders it from its `contexts` prop, and a standalone LpSidebar
7
+ * can put it in its own header.
8
+ *
9
+ * The trigger shows the current context's icon and label, or whatever the
10
+ * default slot draws (a brand mark for one context, a plain word for
11
+ * another). Folded to icons it is the icon alone, or the label's first letter.
12
+ */
13
+ import { computed } from "vue"
14
+ import { useLabels } from "../composables/useLpConfig"
15
+ import LpDropdownMenu from "./LpDropdownMenu.vue"
16
+ import LpIcon from "./LpIcon.vue"
17
+ import type { ContextMenuItemDef } from "./LpContextMenu.vue"
18
+ import type { AppContext } from "./sidebar"
19
+
20
+ const props = withDefaults(
21
+ defineProps<{
22
+ contexts: AppContext[]
23
+ /** The current context's id (v-model). */
24
+ modelValue?: string
25
+ /** The icon rail: the trigger is a square with the icon or an initial. */
26
+ compact?: boolean
27
+ labels?: Partial<{ switch: string; title: string }>
28
+ }>(),
29
+ { compact: false },
30
+ )
31
+
32
+ const emit = defineEmits<{ (e: "update:modelValue", id: string): void }>()
33
+
34
+ const text = useLabels("contextSwitcher", { switch: "{label}, switch", title: "Switch to" }, () => props.labels)
35
+
36
+ const current = computed(() => props.contexts.find((c) => c.id === props.modelValue) ?? props.contexts[0])
37
+ const initial = computed(() => [...(current.value?.label ?? "")][0] ?? "")
38
+
39
+ const items = computed<ContextMenuItemDef[]>(() =>
40
+ props.contexts.map((c) => ({
41
+ label: c.label,
42
+ icon: c.icon,
43
+ checked: c.id === current.value?.id ? true : undefined,
44
+ onSelect: () => {
45
+ if (c.id !== current.value?.id) emit("update:modelValue", c.id)
46
+ },
47
+ })),
48
+ )
49
+ </script>
50
+
51
+ <template>
52
+ <LpDropdownMenu :items="items" :title="text.title" :palette="false">
53
+ <template #trigger>
54
+ <button
55
+ type="button"
56
+ class="flex min-w-0 items-center gap-2 rounded-control text-base font-semibold text-ink outline-none transition-colors hover:bg-surface-soft focus-visible:ring-2 focus-visible:ring-ring"
57
+ :class="compact ? 'grid size-9 shrink-0 place-items-center bg-surface-soft' : 'max-w-full px-2 py-1'"
58
+ :aria-label="text.switch.replace('{label}', current?.label ?? '')"
59
+ >
60
+ <slot :context="current" :compact="compact">
61
+ <template v-if="compact">
62
+ <LpIcon v-if="current?.icon" :name="current.icon" :size="17" />
63
+ <template v-else>{{ initial }}</template>
64
+ </template>
65
+ <template v-else>
66
+ <LpIcon v-if="current?.icon" :name="current.icon" :size="17" class="shrink-0 text-brand" />
67
+ <span class="truncate">{{ current?.label }}</span>
68
+ </template>
69
+ </slot>
70
+ <LpIcon v-if="!compact" name="lucide:chevrons-up-down" :size="14" class="shrink-0 text-muted" />
71
+ </button>
72
+ </template>
73
+ </LpDropdownMenu>
74
+ </template>
@@ -304,10 +304,8 @@ defineExpose({ resizing })
304
304
  resizing ? 'overflow-hidden' : '',
305
305
  // While the box holds a width its content has outgrown, a flex row would
306
306
  // squeeze its children to fit (a button's keys folding into a column)
307
- // instead of letting the easing edge clip them. A single child that is
308
- // itself a wrapping row is laid out at the width the box is heading for,
309
- // or it would break onto a second line until the tween lands.
310
- resizing && axis !== 'height' ? '[&>*]:shrink-0 [&>*:only-child]:min-w-(--lp-shift-to-w)' : '',
307
+ // instead of letting the easing edge clip them.
308
+ resizing && axis !== 'height' ? '[&>*]:shrink-0' : '',
311
309
  resizing && anchor === 'end' ? 'justify-end' : '',
312
310
  ]"
313
311
  >
@@ -7,6 +7,13 @@
7
7
  import type { Component } from "vue"
8
8
  import type { ContextMenuItemDef } from "./LpContextMenu.vue"
9
9
 
10
+ /** One of an app's contexts in the rail header switcher (LpContextSwitcher). */
11
+ export interface AppContext {
12
+ id: string
13
+ label: string
14
+ icon?: string
15
+ }
16
+
10
17
  export interface SidebarItem {
11
18
  id: string
12
19
  label: string