@leavepulse/ui 0.59.0 → 0.60.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 (154) hide show
  1. package/dist/assets/{LpCommandPalette-BM_IyzwB.css → LpCommandPalette-DA5pmuPi.css} +21 -21
  2. package/dist/assets/{LpTable-B_QCQCbB.css → LpTable-BZZf_rrt.css} +19 -19
  3. package/dist/chunks/{ContextMenuItems-CioDScj3.js → ContextMenuItems-qXReFtQW.js} +1 -1
  4. package/dist/chunks/{LayoutCanvas-BcGLJVBq.js → LayoutCanvas-t7LWFCEn.js} +1 -1
  5. package/dist/chunks/{LayoutNode-BkBn6dvM.js → LayoutNode-DHsE6GwM.js} +1 -1
  6. package/dist/chunks/{LpActionBar-DCN-_pZP.js → LpActionBar-BsSp66S_.js} +2 -2
  7. package/dist/chunks/{LpAddressInput-D-H94m4q.js → LpAddressInput-DD4zTN4P.js} +7 -7
  8. package/dist/chunks/{LpAlert-CXMn1GYE.js → LpAlert--KLL4NLk.js} +1 -1
  9. package/dist/chunks/{LpAppShell-BeMuKEjh.js → LpAppShell-Cv-Y9qNA.js} +3 -3
  10. package/dist/chunks/{LpAutocomplete-hJ_6CHlh.js → LpAutocomplete-PnL2ntKl.js} +1 -1
  11. package/dist/chunks/{LpAvatar-CeW4Z5CL.js → LpAvatar-CwGs1JCQ.js} +2 -2
  12. package/dist/chunks/{LpBreadcrumbs-BLzOEgAF.js → LpBreadcrumbs-CndzPYiG.js} +1 -1
  13. package/dist/chunks/{LpButton-vhlwmpBy.js → LpButton-CJSD7N0Z.js} +1 -1
  14. package/dist/chunks/{LpCalendar-BLoE8Qm7.js → LpCalendar-CXVDbb2M.js} +1 -1
  15. package/dist/chunks/{LpCard-Gbr8a1xK.js → LpCard-B2D0GIUU.js} +1 -1
  16. package/dist/chunks/{LpCheckbox-B_C8sOoT.js → LpCheckbox-DV9W6T3H.js} +1 -1
  17. package/dist/chunks/{LpCodeBlock-D6zhp30a.js → LpCodeBlock-t6MLA3fb.js} +1 -1
  18. package/dist/chunks/{LpColorPicker-CVXwjEtX.js → LpColorPicker-CvBF8TeL.js} +2 -2
  19. package/dist/chunks/{LpConfirmDialog-DkgIT-Xg.js → LpConfirmDialog-tkgyY3eu.js} +3 -3
  20. package/dist/chunks/{LpConfirmHost-CYzXWFOI.js → LpConfirmHost-CoYIcUdl.js} +1 -1
  21. package/dist/chunks/{LpContextMenu-DRFd-iyc.js → LpContextMenu-BnN1k7ga.js} +17 -5
  22. package/dist/chunks/{LpDatePicker-B-VMHMgy.js → LpDatePicker-DxdrVNCG.js} +3 -3
  23. package/dist/chunks/{LpDateRangePicker-B68KPKPl.js → LpDateRangePicker-DjeaqikC.js} +2 -2
  24. package/dist/chunks/{LpDisclosure-Ct-VBHxt.js → LpDisclosure-s8cQ7KQq.js} +1 -1
  25. package/dist/chunks/{LpDrawer-Rc6eAJrr.js → LpDrawer-C97yoWmh.js} +1 -1
  26. package/dist/chunks/{LpDropdownMenu-BoJQsjzt.js → LpDropdownMenu-CbyYu4Rw.js} +11 -4
  27. package/dist/chunks/{LpEmptyState-CBwwkkdA.js → LpEmptyState-CX8fdGSU.js} +1 -1
  28. package/dist/chunks/{LpFieldNotice-9hH4ITZa.js → LpFieldNotice-B--RzKfj.js} +1 -1
  29. package/dist/chunks/{LpFileTree-Bs57DhVa.js → LpFileTree-DEqh2ySW.js} +2 -2
  30. package/dist/chunks/{LpFileTreeNode-XgJW65v5.js → LpFileTreeNode-DCZA7sQ-.js} +3 -3
  31. package/dist/chunks/{LpFormField-BpQ6WJPe.js → LpFormField-DMPPL1jF.js} +1 -1
  32. package/dist/chunks/{LpHintLayer-B5-6FyEf.js → LpHintLayer-DsclGYcD.js} +1 -1
  33. package/dist/chunks/{LpHints-BqoZXHZk.js → LpHints-BTpvisgP.js} +10 -4
  34. package/dist/chunks/{LpIcon-B5guGKrW.js → LpIcon-CTuDVTYv.js} +1 -1
  35. package/dist/chunks/{LpInput-WvyP02ID.js → LpInput-C7FHxzj2.js} +2 -2
  36. package/dist/chunks/{LpLightbox-Dq-e36uT.js → LpLightbox-DiksFa4L.js} +1 -1
  37. package/dist/chunks/{LpLogViewer-B92bAftG.js → LpLogViewer-BuPe23sZ.js} +2 -2
  38. package/dist/chunks/{LpMapPicker-BH5csaBt.js → LpMapPicker-DybIlWnF.js} +1 -1
  39. package/dist/chunks/{LpMediaGallery-B1kDypJ-.js → LpMediaGallery-Cic9UHsa.js} +2 -2
  40. package/dist/chunks/{LpModal-DvGD6kEe.js → LpModal-QFfctZsj.js} +1 -1
  41. package/dist/chunks/{LpModalNav-B-_zRTS-.js → LpModalNav-Cw7m-eks.js} +4 -4
  42. package/dist/chunks/{LpNotificationBell-63pvatBj.js → LpNotificationBell-xH_JphpS.js} +4 -4
  43. package/dist/chunks/{LpNumberField-CJPjmoDz.js → LpNumberField-BFSRVGkJ.js} +1 -1
  44. package/dist/chunks/{LpPagination-DehAaJLY.js → LpPagination-BFl0I7tL.js} +1 -1
  45. package/dist/chunks/{LpPasswordInput-BK25_vNG.js → LpPasswordInput-C1G4k_r0.js} +2 -2
  46. package/dist/chunks/{LpPhoneInput-Bxg7a_qD.js → LpPhoneInput-CZrpVxla.js} +2 -2
  47. package/dist/chunks/{LpPie-Coa2GMHt.js → LpPie-BD5Lsh-2.js} +2 -2
  48. package/dist/chunks/{LpRangeCalendar-D5sDID9W.js → LpRangeCalendar-COeOYF52.js} +1 -1
  49. package/dist/chunks/{LpSection-B19VPYmr.js → LpSection-BAkbf0OK.js} +1 -1
  50. package/dist/chunks/{LpSegmented-DbrUjuSA.js → LpSegmented-DslFku0N.js} +1 -1
  51. package/dist/chunks/{LpSelect-DynjWK1A.js → LpSelect-C4OXN_q3.js} +1 -1
  52. package/dist/chunks/{LpSidebar-CKamWtPo.js → LpSidebar-B3E_iViL.js} +3 -3
  53. package/dist/chunks/{LpSidebarNav-Y4LV0ZEn.js → LpSidebarNav-32sAXNM-.js} +2 -2
  54. package/dist/chunks/{LpStat-BS2TEXYK.js → LpStat-oYk6V1LZ.js} +1 -1
  55. package/dist/chunks/{LpStepper-BSglWF45.js → LpStepper-YgHGzgfD.js} +1 -1
  56. package/dist/chunks/{LpTableFilter-CwHXVxJt.js → LpTableFilter-Ba-rS4H1.js} +2 -2
  57. package/dist/chunks/{LpTabs-D01b8jBI.js → LpTabs-00v3VQx4.js} +1 -1
  58. package/dist/chunks/{LpTagsInput-CHbQoAAA.js → LpTagsInput-Sc56iy_j.js} +3 -3
  59. package/dist/chunks/{LpTextarea-Bz2IWhTH.js → LpTextarea-CQZccQI3.js} +1 -1
  60. package/dist/chunks/{LpThemeSwitcher-CbzL6ipO.js → LpThemeSwitcher-CeBG0e_D.js} +2 -2
  61. package/dist/chunks/{LpTimeField-DvGXgdES.js → LpTimeField-BTEt0kvL.js} +1 -1
  62. package/dist/chunks/{LpToaster-C9EacEfR.js → LpToaster-BcKs7vX7.js} +1 -1
  63. package/dist/chunks/{LpTour-D7m9ZxNk.js → LpTour-C29-1wha.js} +4 -1
  64. package/dist/chunks/{MenuTitle-B9HdaBwE.js → MenuTitle-FeC6I24N.js} +1 -1
  65. package/dist/chunks/{TourCard-DCHOjr6e.js → TourCard-AjN0uhs1.js} +2 -2
  66. package/dist/chunks/{icons-QqBscG5I.js → icons-CuO3W46H.js} +1 -1
  67. package/dist/components/ContextMenuItems.vue.js +1 -1
  68. package/dist/components/LayoutCanvas.vue.js +1 -1
  69. package/dist/components/LayoutNode.vue.js +1 -1
  70. package/dist/components/LpActionBar.vue.js +1 -1
  71. package/dist/components/LpAddressInput.vue.js +1 -1
  72. package/dist/components/LpAlert.vue.js +1 -1
  73. package/dist/components/LpAppShell.vue.js +1 -1
  74. package/dist/components/LpAutocomplete.vue.js +1 -1
  75. package/dist/components/LpAvatar.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/LpCalendar.vue.js +1 -1
  79. package/dist/components/LpCard.vue.js +1 -1
  80. package/dist/components/LpChart.vue.js +2 -2
  81. package/dist/components/LpCheckbox.vue.js +1 -1
  82. package/dist/components/LpCodeBlock.vue.js +1 -1
  83. package/dist/components/LpColorPicker.vue.js +1 -1
  84. package/dist/components/LpCommandPalette.vue.js +30 -19
  85. package/dist/components/LpConfirmDialog.vue.js +1 -1
  86. package/dist/components/LpConfirmHost.vue.js +1 -1
  87. package/dist/components/LpContextMenu.vue.d.ts +7 -2
  88. package/dist/components/LpContextMenu.vue.js +1 -1
  89. package/dist/components/LpDatePicker.vue.js +1 -1
  90. package/dist/components/LpDateRangePicker.vue.js +1 -1
  91. package/dist/components/LpDisclosure.vue.js +1 -1
  92. package/dist/components/LpDrawer.vue.js +1 -1
  93. package/dist/components/LpDropdownMenu.vue.d.ts +7 -2
  94. package/dist/components/LpDropdownMenu.vue.js +1 -1
  95. package/dist/components/LpDropzone.vue.js +1 -1
  96. package/dist/components/LpEmptyState.vue.js +1 -1
  97. package/dist/components/LpFieldNotice.vue.js +1 -1
  98. package/dist/components/LpFileTree.vue.js +1 -1
  99. package/dist/components/LpFileTreeNode.vue.js +1 -1
  100. package/dist/components/LpFormField.vue.js +1 -1
  101. package/dist/components/LpHintLayer.vue.js +1 -1
  102. package/dist/components/LpHints.vue.js +1 -1
  103. package/dist/components/LpIcon.vue.js +1 -1
  104. package/dist/components/LpImageEditor.vue.js +4 -2
  105. package/dist/components/LpInput.vue.js +1 -1
  106. package/dist/components/LpLightbox.vue.js +1 -1
  107. package/dist/components/LpLogViewer.vue.js +1 -1
  108. package/dist/components/LpMapPicker.vue.js +1 -1
  109. package/dist/components/LpMediaGallery.vue.js +1 -1
  110. package/dist/components/LpModal.vue.js +1 -1
  111. package/dist/components/LpModalNav.vue.js +1 -1
  112. package/dist/components/LpNotificationBell.vue.js +1 -1
  113. package/dist/components/LpNumberField.vue.js +1 -1
  114. package/dist/components/LpPagination.vue.js +1 -1
  115. package/dist/components/LpPaletteFacts.vue.js +1 -1
  116. package/dist/components/LpPaletteHeader.vue.js +2 -2
  117. package/dist/components/LpPasswordInput.vue.js +1 -1
  118. package/dist/components/LpPhoneInput.vue.js +1 -1
  119. package/dist/components/LpPie.vue.js +1 -1
  120. package/dist/components/LpRangeCalendar.vue.js +1 -1
  121. package/dist/components/LpSection.vue.js +1 -1
  122. package/dist/components/LpSegmented.vue.js +1 -1
  123. package/dist/components/LpSelect.vue.js +1 -1
  124. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  125. package/dist/components/LpSidebar.vue.js +1 -1
  126. package/dist/components/LpSidebarNav.vue.js +1 -1
  127. package/dist/components/LpStat.vue.js +1 -1
  128. package/dist/components/LpStepper.vue.js +1 -1
  129. package/dist/components/LpTable.vue.js +11 -10
  130. package/dist/components/LpTableFilter.vue.js +1 -1
  131. package/dist/components/LpTabs.vue.js +1 -1
  132. package/dist/components/LpTagsInput.vue.js +1 -1
  133. package/dist/components/LpTextarea.vue.js +1 -1
  134. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  135. package/dist/components/LpTimeField.vue.js +1 -1
  136. package/dist/components/LpToaster.vue.js +1 -1
  137. package/dist/components/LpTour.vue.js +1 -1
  138. package/dist/components/MenuTitle.vue.js +1 -1
  139. package/dist/components/TourCard.vue.js +1 -1
  140. package/dist/composables/useHintSystem.d.ts +65 -0
  141. package/dist/composables/useHintSystem.js +98 -12
  142. package/dist/icons-all.js +1 -1
  143. package/dist/index.d.ts +2 -2
  144. package/dist/index.js +62 -58
  145. package/package.json +1 -1
  146. package/src/components/LpCommandPalette.vue +26 -4
  147. package/src/components/LpContextMenu.vue +19 -1
  148. package/src/components/LpDropdownMenu.vue +13 -2
  149. package/src/components/LpHints.vue +7 -1
  150. package/src/components/LpTable.vue +1 -1
  151. package/src/components/LpTour.vue +3 -0
  152. package/src/composables/useHintSystem.ts +130 -12
  153. package/src/index.ts +2 -1
  154. package/src/kit-icons.ts +1 -1
package/dist/index.js CHANGED
@@ -1,24 +1,24 @@
1
- import { _ } from "./chunks/LayoutCanvas-BcGLJVBq.js";
2
- import { _ as _2 } from "./chunks/LpAddressInput-D-H94m4q.js";
3
- import { _ as _3 } from "./chunks/LpMapPicker-BH5csaBt.js";
1
+ import { _ } from "./chunks/LayoutCanvas-t7LWFCEn.js";
2
+ import { _ as _2 } from "./chunks/LpAddressInput-DD4zTN4P.js";
3
+ import { _ as _3 } from "./chunks/LpMapPicker-DybIlWnF.js";
4
4
  import { OSM_TILES, createNominatimProvider, emptyAddress, formatAddress, project, tileUrl, unproject } from "./components/address.js";
5
- import { _ as _4 } from "./chunks/LpActionBar-DCN-_pZP.js";
6
- import { _ as _5 } from "./chunks/LpAlert-CXMn1GYE.js";
7
- import { _ as _6 } from "./chunks/LpAppShell-BeMuKEjh.js";
8
- import { _ as _7 } from "./chunks/LpAutocomplete-hJ_6CHlh.js";
9
- import { _ as _8 } from "./chunks/LpAvatar-CeW4Z5CL.js";
5
+ import { _ as _4 } from "./chunks/LpActionBar-BsSp66S_.js";
6
+ import { _ as _5 } from "./chunks/LpAlert--KLL4NLk.js";
7
+ import { _ as _6 } from "./chunks/LpAppShell-Cv-Y9qNA.js";
8
+ import { _ as _7 } from "./chunks/LpAutocomplete-PnL2ntKl.js";
9
+ import { _ as _8 } from "./chunks/LpAvatar-CwGs1JCQ.js";
10
10
  import { _ as _9 } from "./chunks/LpBadge-Fe0D1bYx.js";
11
- import { _ as _10 } from "./chunks/LpBreadcrumbs-BLzOEgAF.js";
12
- import { _ as _11 } from "./chunks/LpButton-vhlwmpBy.js";
13
- import { _ as _12 } from "./chunks/LpCalendar-BLoE8Qm7.js";
14
- import { _ as _13 } from "./chunks/LpCard-Gbr8a1xK.js";
11
+ import { _ as _10 } from "./chunks/LpBreadcrumbs-CndzPYiG.js";
12
+ import { _ as _11 } from "./chunks/LpButton-CJSD7N0Z.js";
13
+ import { _ as _12 } from "./chunks/LpCalendar-CXVDbb2M.js";
14
+ import { _ as _13 } from "./chunks/LpCard-B2D0GIUU.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-B_C8sOoT.js";
19
- import { _ as _15 } from "./chunks/LpCodeBlock-D6zhp30a.js";
18
+ import { _ as _14 } from "./chunks/LpCheckbox-DV9W6T3H.js";
19
+ import { _ as _15 } from "./chunks/LpCodeBlock-t6MLA3fb.js";
20
20
  import { tokenizeLines } from "./components/codeHighlight.js";
21
- import { _ as _16 } from "./chunks/LpColorPicker-CVXwjEtX.js";
21
+ import { _ as _16 } from "./chunks/LpColorPicker-CvBF8TeL.js";
22
22
  import { DEFAULT_SWATCHES, clampHsv, formatColor, hsvToHsl, hsvToRgb, isLight, normalizeHue, opaqueCss, parseColor, parseHex, rgbToHex, rgbToHsv } from "./components/color.js";
23
23
  import { default as default3 } from "./components/LpCommandPalette.vue.js";
24
24
  import { applyQueryFilters, highlightParts, parseCommandQuery, parsePaletteQuery, rankCommandItems } from "./components/commandSearch.js";
@@ -30,46 +30,46 @@ 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-DkgIT-Xg.js";
34
- import { _ as _19 } from "./chunks/LpConfirmHost-CYzXWFOI.js";
33
+ import { _ as _18 } from "./chunks/LpConfirmDialog-tkgyY3eu.js";
34
+ import { _ as _19 } from "./chunks/LpConfirmHost-CoYIcUdl.js";
35
35
  import { confirm, useConfirm } from "./components/confirm.js";
36
- import { _ as _20 } from "./chunks/LpContextMenu-DRFd-iyc.js";
37
- import { _ as _21 } from "./chunks/LpDatePicker-B-VMHMgy.js";
38
- import { _ as _22 } from "./chunks/LpDateRangePicker-B68KPKPl.js";
39
- import { _ as _23 } from "./chunks/LpRangeCalendar-D5sDID9W.js";
36
+ import { _ as _20 } from "./chunks/LpContextMenu-BnN1k7ga.js";
37
+ import { _ as _21 } from "./chunks/LpDatePicker-DxdrVNCG.js";
38
+ import { _ as _22 } from "./chunks/LpDateRangePicker-DjeaqikC.js";
39
+ import { _ as _23 } from "./chunks/LpRangeCalendar-COeOYF52.js";
40
40
  import { clampRange, defaultRangePresets, formatRange, normalizeRange, sameRange } from "./components/dateRange.js";
41
- import { _ as _24 } from "./chunks/LpDisclosure-Ct-VBHxt.js";
41
+ import { _ as _24 } from "./chunks/LpDisclosure-s8cQ7KQq.js";
42
42
  import { _ as _25 } from "./chunks/LpDivider-CUX46KR0.js";
43
- import { _ as _26 } from "./chunks/LpDrawer-Rc6eAJrr.js";
44
- import { _ as _27 } from "./chunks/LpDropdownMenu-BoJQsjzt.js";
43
+ import { _ as _26 } from "./chunks/LpDrawer-C97yoWmh.js";
44
+ import { _ as _27 } from "./chunks/LpDropdownMenu-CbyYu4Rw.js";
45
45
  import { default as default9 } from "./components/LpDropzone.vue.js";
46
- import { _ as _28 } from "./chunks/LpEmptyState-CBwwkkdA.js";
47
- import { _ as _29 } from "./chunks/LpFileTree-Bs57DhVa.js";
46
+ import { _ as _28 } from "./chunks/LpEmptyState-CX8fdGSU.js";
47
+ import { _ as _29 } from "./chunks/LpFileTree-DEqh2ySW.js";
48
48
  import { ancestorIds, checkStateOf, checkedCount, computeStats, fileIcon, formatModified, formatSize, sortNodes, subtreeIds, subtreeSize } from "./components/fileTree.js";
49
- import { _ as _30 } from "./chunks/LpFieldNotice-9hH4ITZa.js";
50
- import { _ as _31 } from "./chunks/LpFormField-BpQ6WJPe.js";
51
- import { _ as _32 } from "./chunks/LpIcon-B5guGKrW.js";
52
- import { i, b, a, c } from "./chunks/icons-QqBscG5I.js";
49
+ import { _ as _30 } from "./chunks/LpFieldNotice-B--RzKfj.js";
50
+ import { _ as _31 } from "./chunks/LpFormField-DMPPL1jF.js";
51
+ import { _ as _32 } from "./chunks/LpIcon-CTuDVTYv.js";
52
+ import { i, b, a, c } from "./chunks/icons-CuO3W46H.js";
53
53
  import { default as default10 } from "./components/LpImageEditor.vue.js";
54
54
  import { _ as _33 } from "./chunks/LpInfraNode-Ds_8SZgN.js";
55
- import { _ as _34 } from "./chunks/LpInput-WvyP02ID.js";
56
- import { _ as _35 } from "./chunks/LpLightbox-Dq-e36uT.js";
55
+ import { _ as _34 } from "./chunks/LpInput-C7FHxzj2.js";
56
+ import { _ as _35 } from "./chunks/LpLightbox-DiksFa4L.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-B92bAftG.js";
59
+ import { _ as _37 } from "./chunks/LpLogViewer-BuPe23sZ.js";
60
60
  import { countLevels, matchPositions, matchesTerm, ringWindow, stepMatch } from "./components/logSearch.js";
61
- import { _ as _38 } from "./chunks/LpMediaGallery-B1kDypJ-.js";
62
- import { _ as _39 } from "./chunks/LpModal-DvGD6kEe.js";
63
- import { _ as _40 } from "./chunks/LpModalNav-B-_zRTS-.js";
64
- import { _ as _41 } from "./chunks/LpNotificationBell-63pvatBj.js";
65
- import { _ as _42 } from "./chunks/LpNumberField-CJPjmoDz.js";
66
- import { _ as _43 } from "./chunks/LpTimeField-DvGXgdES.js";
61
+ import { _ as _38 } from "./chunks/LpMediaGallery-Cic9UHsa.js";
62
+ import { _ as _39 } from "./chunks/LpModal-QFfctZsj.js";
63
+ import { _ as _40 } from "./chunks/LpModalNav-Cw7m-eks.js";
64
+ import { _ as _41 } from "./chunks/LpNotificationBell-xH_JphpS.js";
65
+ import { _ as _42 } from "./chunks/LpNumberField-BFSRVGkJ.js";
66
+ import { _ as _43 } from "./chunks/LpTimeField-BTEt0kvL.js";
67
67
  import { _ as _44 } from "./chunks/LpNumberFlow-z4WPZcZu.js";
68
68
  import { _ as _45 } from "./chunks/LpOtpInput-PbeNJ5In.js";
69
- import { _ as _46 } from "./chunks/LpPagination-DehAaJLY.js";
70
- import { _ as _47 } from "./chunks/LpPasswordInput-BK25_vNG.js";
71
- import { _ as _48 } from "./chunks/LpPie-Coa2GMHt.js";
72
- import { _ as _49 } from "./chunks/LpPhoneInput-Bxg7a_qD.js";
69
+ import { _ as _46 } from "./chunks/LpPagination-BFl0I7tL.js";
70
+ import { _ as _47 } from "./chunks/LpPasswordInput-C1G4k_r0.js";
71
+ import { _ as _48 } from "./chunks/LpPie-BD5Lsh-2.js";
72
+ import { _ as _49 } from "./chunks/LpPhoneInput-CZrpVxla.js";
73
73
  import { filterCountries, flagEmoji, loadCountries, matchCountryByValue } from "./components/countries.js";
74
74
  import { _ as _50 } from "./chunks/LpPopover-DCKeqiVn.js";
75
75
  import { _ as _51 } from "./chunks/LpProgress-CBU1iI69.js";
@@ -77,38 +77,38 @@ import { _ as _52 } from "./chunks/LpRadio-CWA5Eb3M.js";
77
77
  import { _ as _53 } from "./chunks/LpRadioGroup-CCn-Q2_c.js";
78
78
  import { _ as _54 } from "./chunks/LpRollingText-DB7upf-5.js";
79
79
  import { _ as _55 } from "./chunks/LpScrollArea-Hz3-JWUG.js";
80
- import { _ as _56 } from "./chunks/LpSegmented-DbrUjuSA.js";
81
- import { _ as _57 } from "./chunks/LpSection-B19VPYmr.js";
82
- import { _ as _58 } from "./chunks/LpSelect-DynjWK1A.js";
80
+ import { _ as _56 } from "./chunks/LpSegmented-DslFku0N.js";
81
+ import { _ as _57 } from "./chunks/LpSection-BAkbf0OK.js";
82
+ import { _ as _58 } from "./chunks/LpSelect-C4OXN_q3.js";
83
83
  import { _ as _59 } from "./chunks/LpServiceNode-D8uJ8sGk.js";
84
84
  import { _ as _60 } from "./chunks/LpShift-DXNsauQZ.js";
85
85
  import { default as default11 } from "./components/LpShortcutsDialog.vue.js";
86
- import { _ as _61 } from "./chunks/LpSidebar-CKamWtPo.js";
86
+ import { _ as _61 } from "./chunks/LpSidebar-B3E_iViL.js";
87
87
  import { _ as _62 } from "./chunks/LpSkeleton-BB6XIV-w.js";
88
88
  import { _ as _63 } from "./chunks/LpSlider-Cuzmrd7p.js";
89
89
  import { _ as _64 } from "./chunks/LpRangeSlider-C1yF9-nP.js";
90
90
  import { _ as _65 } from "./chunks/LpVideoBackdrop-qWRYBOTQ.js";
91
91
  import { formatClipTime, isNativeLoop, planLoop, seamProgress, seamReached } from "./components/videoBackdrop.js";
92
92
  import { _ as _66 } from "./chunks/LpSparkline-CB80N8SJ.js";
93
- import { _ as _67 } from "./chunks/LpStat-BS2TEXYK.js";
94
- import { _ as _68 } from "./chunks/LpStepper-BSglWF45.js";
93
+ import { _ as _67 } from "./chunks/LpStat-oYk6V1LZ.js";
94
+ import { _ as _68 } from "./chunks/LpStepper-YgHGzgfD.js";
95
95
  import { _ as _69 } from "./chunks/LpSwitch-DG2AhXIL.js";
96
96
  import { default as default12 } from "./components/LpTable.vue.js";
97
97
  import { compareValues } from "./components/tableSort.js";
98
98
  import { _ as _70 } from "./chunks/LpTableOfContents-DYuqkByy.js";
99
- import { _ as _71 } from "./chunks/LpTabs-D01b8jBI.js";
100
- import { _ as _72 } from "./chunks/LpTagsInput-CHbQoAAA.js";
99
+ import { _ as _71 } from "./chunks/LpTabs-00v3VQx4.js";
100
+ import { _ as _72 } from "./chunks/LpTagsInput-Sc56iy_j.js";
101
101
  import { addTags, splitTags } from "./components/tags.js";
102
- import { _ as _73 } from "./chunks/LpTextarea-Bz2IWhTH.js";
103
- import { _ as _74 } from "./chunks/LpThemeSwitcher-CbzL6ipO.js";
102
+ import { _ as _73 } from "./chunks/LpTextarea-CQZccQI3.js";
103
+ import { _ as _74 } from "./chunks/LpThemeSwitcher-CeBG0e_D.js";
104
104
  import { _ as _75 } from "./chunks/LpTilt-B7KHX1zH.js";
105
- import { _ as _76 } from "./chunks/LpToaster-C9EacEfR.js";
105
+ import { _ as _76 } from "./chunks/LpToaster-BcKs7vX7.js";
106
106
  import { _ as _77 } from "./chunks/LpTooltip-suFCM34F.js";
107
- import { _ as _78 } from "./chunks/LpTour-D7m9ZxNk.js";
107
+ import { _ as _78 } from "./chunks/LpTour-C29-1wha.js";
108
108
  import { holeOf, openContextMenu, panelsAround } from "./components/tour.js";
109
- import { _ as _79 } from "./chunks/LpHintLayer-B5-6FyEf.js";
110
- import { _ as _80 } from "./chunks/LpHints-BqoZXHZk.js";
111
- import { createHintSystem, hintKey, hintSummary, localHintStorage, provideHintSystem, useHintSystem } from "./composables/useHintSystem.js";
109
+ import { _ as _79 } from "./chunks/LpHintLayer-DsclGYcD.js";
110
+ import { _ as _80 } from "./chunks/LpHints-BTpvisgP.js";
111
+ import { HINT_SIGNALS, contextMenuTip, createHintSystem, hintKey, hintSummary, localHintStorage, paletteTip, provideHintSystem, runningHintSystem, useHintSystem } from "./composables/useHintSystem.js";
112
112
  import { _ as _81 } from "./chunks/LpTooltipProvider-CftjV7Xc.js";
113
113
  import { _ as _82 } from "./chunks/LpTopologyCanvas-6ozNrQKh.js";
114
114
  import { _ as _83 } from "./chunks/LpUptimeBar-B4ltCfno.js";
@@ -184,6 +184,7 @@ export {
184
184
  DEFAULT_SWATCHES,
185
185
  FIELD_NOTICE_MS,
186
186
  G as GLASS_BACKDROP_ATTR,
187
+ HINT_SIGNALS,
187
188
  LP_CONFIG,
188
189
  LP_FIELD,
189
190
  _ as LayoutCanvas,
@@ -314,6 +315,7 @@ export {
314
315
  compareValues,
315
316
  computeStats,
316
317
  confirm,
318
+ contextMenuTip,
317
319
  countBlocks,
318
320
  countLeaves,
319
321
  countLevels,
@@ -388,6 +390,7 @@ export {
388
390
  k as normalizeTheme,
389
391
  opaqueCss,
390
392
  openContextMenu,
393
+ paletteTip,
391
394
  panelsAround,
392
395
  parseColor,
393
396
  parseCommandQuery,
@@ -424,6 +427,7 @@ export {
424
427
  rgbToHsv,
425
428
  ringWindow,
426
429
  o as rose,
430
+ runningHintSystem,
427
431
  sameRange,
428
432
  scrollParent,
429
433
  scrollToElement,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.59.0",
3
+ "version": "0.60.0",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {
@@ -44,6 +44,8 @@ import { useAsyncTask } from "../composables/useAsyncTask"
44
44
  import { useGlass } from "../composables/useGlass"
45
45
  import { useClipboard } from "../composables/useClipboard"
46
46
  import { useHotkeys } from "../composables/useHotkeys"
47
+ import { hints } from "../composables/useHints"
48
+ import { HINT_SIGNALS, runningHintSystem } from "../composables/useHintSystem"
47
49
  import { useModalLayer } from "./modalDepth"
48
50
  import { useLabels } from "../composables/useLpConfig"
49
51
  import {
@@ -516,9 +518,20 @@ function onTab(event: KeyboardEvent) {
516
518
  event.stopPropagation()
517
519
  const actionsMode: Command = { id: `${c.id}:actions`, label: c.label, icon: c.icon, children: actions }
518
520
  syntheticModes.add(actionsMode)
521
+ hints.use(HINT_SIGNALS.paletteActions)
519
522
  enter(actionsMode)
520
523
  }
521
524
 
525
+ // A returning user who never pressed Tab gets the footer key lit up, nothing
526
+ // more: the palette is the one place they already came to on purpose.
527
+ const PALETTE_ACTIONS_AFTER = 3
528
+ const showActionsKey = computed(() => {
529
+ const system = runningHintSystem()
530
+ return !!system?.state.loaded
531
+ && system.count(HINT_SIGNALS.palette) >= PALETTE_ACTIONS_AFTER
532
+ && system.count(HINT_SIGNALS.paletteActions) === 0
533
+ })
534
+
522
535
  /*
523
536
  * A mode holds the command it was entered through, and a static `children`
524
537
  * list is a snapshot of that moment. When the app rebuilds its commands (a
@@ -1162,8 +1175,10 @@ function onEscape(event: KeyboardEvent) {
1162
1175
  watch(
1163
1176
  () => props.open,
1164
1177
  async (o) => {
1165
- if (o) claim()
1166
- else release()
1178
+ if (o) {
1179
+ claim()
1180
+ hints.use(HINT_SIGNALS.palette)
1181
+ } else release()
1167
1182
  cancel()
1168
1183
  query.value = ""
1169
1184
  select(0)
@@ -1461,8 +1476,15 @@ useHotkeys(() =>
1461
1476
  </span>
1462
1477
  <!-- Only inside a mode: at the root Backspace just edits the query,
1463
1478
  and advertising it there would be a lie. -->
1464
- <span v-if="selectedActions.length" class="flex items-center gap-1">
1465
- <kbd class="rounded-small border border-line px-1 text-[10px]">tab</kbd>
1479
+ <span
1480
+ v-if="selectedActions.length"
1481
+ class="flex items-center gap-1 transition-colors"
1482
+ :class="showActionsKey && 'font-medium text-brand'"
1483
+ >
1484
+ <kbd
1485
+ class="rounded-small border px-1 text-[10px] transition-colors"
1486
+ :class="showActionsKey ? 'border-brand' : 'border-line'"
1487
+ >tab</kbd>
1466
1488
  {{ text.actions }}
1467
1489
  </span>
1468
1490
  <span v-if="trail.length" class="flex items-center gap-1">
@@ -8,6 +8,8 @@
8
8
  */
9
9
  import { ContextMenuContent, ContextMenuPortal, ContextMenuRoot, ContextMenuTrigger } from "reka-ui"
10
10
  import { computed } from "vue"
11
+ import { hints } from "../composables/useHints"
12
+ import { HINT_SIGNALS } from "../composables/useHintSystem"
11
13
  import ContextMenuItems from "./ContextMenuItems.vue"
12
14
  import MenuTitle from "./MenuTitle.vue"
13
15
  import { POPOVER_PANEL } from "./dropdown"
@@ -52,6 +54,11 @@ const props = defineProps<{
52
54
  /** An icon beside the title, or `titleImage` for a picture (an avatar, a logo). */
53
55
  titleIcon?: string
54
56
  titleImage?: string
57
+ /**
58
+ * Do not count this element as "has a right-click menu" for hint tips: for
59
+ * menus that only hold generic items (a whole table without row actions).
60
+ */
61
+ noHint?: boolean
55
62
  }>()
56
63
 
57
64
  // With no items the trigger is disabled, so the element keeps the browser's
@@ -59,6 +66,7 @@ const props = defineProps<{
59
66
  // per element. `always` overrides this so a late-populated menu is ready on the
60
67
  // very first click.
61
68
  const enabled = computed(() => props.always || props.items.length > 0)
69
+ const hinted = computed(() => enabled.value && !props.noHint)
62
70
 
63
71
  const PANEL = `${POPOVER_PANEL} z-(--z-popover) min-w-48 p-1 outline-none`
64
72
 
@@ -91,6 +99,14 @@ function keepContextMenu(event: Event) {
91
99
  if (enabled.value) event.stopPropagation()
92
100
  }
93
101
 
102
+ function opened(open: boolean) {
103
+ if (open) hints.use(HINT_SIGNALS.contextMenu)
104
+ }
105
+
106
+ function leftClick() {
107
+ if (hinted.value) hints.use(HINT_SIGNALS.contextTarget)
108
+ }
109
+
94
110
  function returnFocus(event: Event) {
95
111
  const saved = field
96
112
  field = null
@@ -106,10 +122,12 @@ function returnFocus(event: Event) {
106
122
  the reka trigger remounted the wrapped content whenever items arrived
107
123
  late, losing its state and focus. A disabled trigger leaves the browser's
108
124
  own menu in place. -->
109
- <ContextMenuRoot>
125
+ <ContextMenuRoot @update:open="opened">
110
126
  <ContextMenuTrigger
111
127
  as-child
112
128
  :disabled="!enabled"
129
+ :data-lp-context-menu="hinted ? '' : undefined"
130
+ @click.capture="leftClick"
113
131
  @contextmenu.capture="rememberField"
114
132
  @contextmenu="keepContextMenu"
115
133
  >
@@ -1,4 +1,6 @@
1
1
  <script setup lang="ts">
2
+ import { hints } from "../composables/useHints"
3
+ import { HINT_SIGNALS } from "../composables/useHintSystem"
2
4
  import {
3
5
  DropdownMenuContent,
4
6
  DropdownMenuItem,
@@ -20,18 +22,27 @@ export interface MenuItem {
20
22
  onSelect?: () => void
21
23
  }
22
24
 
23
- defineProps<{
25
+ const props = defineProps<{
24
26
  items: MenuItem[]
25
27
  /** A heading naming what the menu acts on; see LpContextMenu's `title`. */
26
28
  title?: string
27
29
  subtitle?: string
28
30
  titleIcon?: string
29
31
  titleImage?: string
32
+ /**
33
+ * The same items are also on a right click (a row's "…" next to its context
34
+ * menu). Opening it then counts toward the hint system's right-click tip.
35
+ */
36
+ rightClickToo?: boolean
30
37
  }>()
38
+
39
+ function opened(open: boolean) {
40
+ if (open && props.rightClickToo) hints.use(HINT_SIGNALS.menuButton)
41
+ }
31
42
  </script>
32
43
 
33
44
  <template>
34
- <DropdownMenuRoot>
45
+ <DropdownMenuRoot @update:open="opened">
35
46
  <DropdownMenuTrigger as-child>
36
47
  <slot name="trigger" />
37
48
  </DropdownMenuTrigger>
@@ -68,6 +68,7 @@ const title = computed(() => {
68
68
  const o = offer.value
69
69
  if (!o) return ""
70
70
  if (o.kind === "nudge") return notes.value[o.nudge.feature]?.title ?? ""
71
+ if (o.kind === "tip") return o.tip.title
71
72
  if (o.kind === "news") return fill(labels.value.newsTitle)
72
73
  return fill(o.kind === "assigned" ? labels.value.assignedTitle : labels.value.tourTitle)
73
74
  })
@@ -76,6 +77,7 @@ const description = computed(() => {
76
77
  const o = offer.value
77
78
  if (!o) return ""
78
79
  if (o.kind === "nudge") return o.nudge.text
80
+ if (o.kind === "tip") return o.tip.keys ? `${o.tip.text} ${o.tip.keys}` : o.tip.text
79
81
  if (o.kind === "news") return o.items.map((n) => n.text).join(" ")
80
82
  return o.kind === "assigned" ? labels.value.assignedText : labels.value.tourText
81
83
  })
@@ -86,6 +88,10 @@ const actions = computed<ActionBarAction[]>(() => {
86
88
  const answer = (choice: "show" | "later" | "never") => () => props.system.answer(choice)
87
89
  const show: ActionBarAction = { label: labels.value.show, icon: "lucide:sparkles", onClick: answer("show") }
88
90
  if (o.kind === "nudge") return [{ label: labels.value.noThanks, variant: "ghost", onClick: answer("never") }, show]
91
+ if (o.kind === "tip") {
92
+ const later: ActionBarAction = { label: labels.value.gotIt, variant: o.tip.step ? "ghost" : undefined, onClick: answer("later") }
93
+ return [{ label: labels.value.never, variant: "ghost", onClick: answer("never") }, later, ...(o.tip.step ? [show] : [])]
94
+ }
89
95
  if (o.kind === "news") return [{ label: labels.value.gotIt, variant: "ghost", onClick: answer("later") }, show]
90
96
  return [
91
97
  ...(o.kind === "tour" ? [{ label: labels.value.never, variant: "ghost" as const, onClick: answer("never") }] : []),
@@ -109,7 +115,7 @@ const actions = computed<ActionBarAction[]>(() => {
109
115
  :open="!!offer"
110
116
  :title="title"
111
117
  :description="description"
112
- :icon="offer?.kind === 'news' ? 'lucide:gift' : 'lucide:compass'"
118
+ :icon="offer?.kind === 'news' ? 'lucide:gift' : offer?.kind === 'tip' ? 'lucide:lightbulb' : 'lucide:compass'"
113
119
  :actions="actions"
114
120
  />
115
121
  </template>
@@ -1157,7 +1157,7 @@ const barInsetTop = computed(() =>
1157
1157
  <!-- The table-wide menu, which is what a right-click on empty header space
1158
1158
  reaches: rows and headers carry their own and take the event first, so
1159
1159
  this is the fallback rather than a competitor. -->
1160
- <LpContextMenu :items="contextMenu" always>
1160
+ <LpContextMenu :items="contextMenu" always :no-hint="!rowMenu">
1161
1161
  <table ref="tableEl" class="w-full border-collapse text-sm">
1162
1162
  <!-- The background belongs on `thead` itself, not only on its row:
1163
1163
  `border-collapse` collapses the borders, and with a sticky header the
@@ -270,10 +270,12 @@ watch(
270
270
  if (value) {
271
271
  direction = 1
272
272
  document.addEventListener("click", onTargetClick, true)
273
+ document.addEventListener("contextmenu", onTargetClick, true)
273
274
  frame ||= requestAnimationFrame(track)
274
275
  void show()
275
276
  } else {
276
277
  document.removeEventListener("click", onTargetClick, true)
278
+ document.removeEventListener("contextmenu", onTargetClick, true)
277
279
  end()
278
280
  }
279
281
  },
@@ -286,6 +288,7 @@ watch(index, () => {
286
288
 
287
289
  onBeforeUnmount(() => {
288
290
  document.removeEventListener("click", onTargetClick, true)
291
+ document.removeEventListener("contextmenu", onTargetClick, true)
289
292
  if (open.value) end()
290
293
  })
291
294