@leavepulse/ui 0.44.0 → 0.45.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 (265) hide show
  1. package/README.md +49 -3
  2. package/dist/assets/{LpCommandPalette-DCP5g2ik.css → LpCommandPalette-nGNnzXqQ.css} +21 -21
  3. package/dist/assets/{LpRollingText-CR1mb0Vt.css → LpRollingText-BGnE6q9j.css} +3 -0
  4. package/dist/assets/{LpShortcutsDialog-ChUyU7oV.css → LpShortcutsDialog-CqYX3yy6.css} +28 -7
  5. package/dist/assets/{LpTable-DDQNdf86.css → LpTable-CPwWxTJS.css} +49 -9
  6. package/dist/chunks/{ContextMenuItems-CrfeNPWT.js → ContextMenuItems-BtKU7074.js} +2 -1
  7. package/dist/chunks/{LayoutCanvas-D-jPOAvg.js → LayoutCanvas-BkaGXTjx.js} +1 -1
  8. package/dist/chunks/{LayoutNode-D8Xy9N-o.js → LayoutNode-B3_9E1Xa.js} +9 -5
  9. package/dist/chunks/{LpActionBar-BbwCF6l5.js → LpActionBar-CnfFVIwC.js} +3 -3
  10. package/dist/chunks/{LpAddressInput-BrOqkZqg.js → LpAddressInput-BwX8uo4_.js} +7 -7
  11. package/dist/chunks/{LpAlert-DkOIjsbq.js → LpAlert-B6ilrM7T.js} +1 -1
  12. package/dist/chunks/{LpAppShell-BUKPcHco.js → LpAppShell-C53_RaGF.js} +4 -4
  13. package/dist/chunks/{LpAutocomplete-DxV3Y9h4.js → LpAutocomplete-C8IgSMsi.js} +2 -1
  14. package/dist/chunks/{LpAvatar-ClBbEYZN.js → LpAvatar-C1XStdOo.js} +3 -3
  15. package/dist/chunks/{LpBreadcrumbs-B8IJgFIc.js → LpBreadcrumbs-CQJd73Gm.js} +1 -1
  16. package/dist/chunks/{LpButton-kqJBHIIb.js → LpButton-CKSwC6Mu.js} +1 -1
  17. package/dist/chunks/{LpCalendar-B7Ko5RdR.js → LpCalendar-DrA2McTU.js} +1 -1
  18. package/dist/chunks/{LpCard-CpRByR0q.js → LpCard-C2IvucmX.js} +1 -1
  19. package/dist/chunks/{LpCheckbox-DpqchzH4.js → LpCheckbox-Bkj13CbW.js} +1 -1
  20. package/dist/chunks/{LpCodeBlock-DeHJPq7p.js → LpCodeBlock-ca7ANFyW.js} +1 -1
  21. package/dist/chunks/{LpColorPicker-Bhf1qxhB.js → LpColorPicker-zz4VGkG4.js} +46 -20
  22. package/dist/chunks/{LpConfirmDialog-CIUOSnWo.js → LpConfirmDialog-DCw5jR1t.js} +3 -3
  23. package/dist/chunks/{LpConfirmHost-CDm0Wtpv.js → LpConfirmHost-CbywMpMP.js} +1 -1
  24. package/dist/chunks/{LpContextMenu-DQw5dGfG.js → LpContextMenu-BqkAYa9X.js} +2 -1
  25. package/dist/chunks/{LpDatePicker-Drirx1AK.js → LpDatePicker-DuusgT69.js} +13 -9
  26. package/dist/chunks/LpDateRangePicker-DHeuznfC.js +208 -0
  27. package/dist/chunks/{LpDisclosure-ChQYmjlR.js → LpDisclosure-Cc23-JOT.js} +1 -1
  28. package/dist/chunks/{LpDrawer-bScx-KMO.js → LpDrawer-Dt4aB4Fr.js} +2 -2
  29. package/dist/chunks/{LpDropdownMenu-DJpoqRCb.js → LpDropdownMenu-DdJGQzPn.js} +2 -1
  30. package/dist/chunks/{LpEmptyState-Dsdqz1Wj.js → LpEmptyState-BJbZXC8D.js} +1 -1
  31. package/dist/chunks/LpFieldNotice-wtieLUTj.js +64 -0
  32. package/dist/chunks/{LpFileTree-CSI_5SK2.js → LpFileTree-CNurOvkV.js} +3 -3
  33. package/dist/chunks/{LpFileTreeNode-B4MiSQX2.js → LpFileTreeNode-D_qRRdsH.js} +3 -3
  34. package/dist/chunks/{LpFormField-CIk5qosh.js → LpFormField-CtVYj6tO.js} +29 -15
  35. package/dist/chunks/{LpIcon-CCnX5_2j.js → LpIcon-DYtaid0K.js} +20 -6
  36. package/dist/chunks/{LpInput-C0e8y8_d.js → LpInput-D-YGQbEv.js} +39 -16
  37. package/dist/chunks/{LpLightbox-Mr0W_6HK.js → LpLightbox-DSDahF23.js} +1 -1
  38. package/dist/chunks/{LpLogViewer-YBOaFnc_.js → LpLogViewer-KypbgOyo.js} +252 -58
  39. package/dist/chunks/{LpMapPicker-NUzS9e37.js → LpMapPicker-Cc84LaM3.js} +1 -1
  40. package/dist/chunks/{LpMediaGallery-DfJmMW0I.js → LpMediaGallery-YKr-cQPN.js} +2 -2
  41. package/dist/chunks/{LpModal-DPwGKBPv.js → LpModal-DMMDQHAu.js} +3 -3
  42. package/dist/chunks/{LpModalNav-DPg5H9f3.js → LpModalNav-BVPDyIup.js} +4 -4
  43. package/dist/chunks/{LpNotificationBell-t5yn-siX.js → LpNotificationBell-CCwyJP5C.js} +26 -14
  44. package/dist/chunks/{LpNumberField-DWnQKktS.js → LpNumberField-B77O-z28.js} +1 -1
  45. package/dist/chunks/{LpPagination-DFngX7Xo.js → LpPagination-BcDlo3r_.js} +1 -1
  46. package/dist/chunks/{LpPasswordInput-CWVDuBJ5.js → LpPasswordInput-eKzQhbQP.js} +2 -2
  47. package/dist/chunks/{LpPhoneInput-CD-ZTeSd.js → LpPhoneInput-BCbrrhgE.js} +126 -23
  48. package/dist/chunks/{LpPie-BLco31Nx.js → LpPie-BEJ2SfI6.js} +9 -10
  49. package/dist/chunks/{LpPopover-p_e_shN3.js → LpPopover-DCKeqiVn.js} +1 -0
  50. package/dist/chunks/LpRangeCalendar-DZuaRV0W.js +331 -0
  51. package/dist/chunks/{LpRollingText-CM5gkSeF.js → LpRollingText-DB7upf-5.js} +1 -1
  52. package/dist/chunks/{LpScrollArea-D8xyKXcF.js → LpScrollArea-Bry1fdOM.js} +14 -2
  53. package/dist/chunks/{LpSection-aM6J_u51.js → LpSection-tKEH0jYf.js} +1 -1
  54. package/dist/chunks/{LpSegmented-Dejd7cIx.js → LpSegmented-C09EEam2.js} +1 -1
  55. package/dist/chunks/{LpSelect-DrRD9I7L.js → LpSelect-DNIL6MB9.js} +20 -23
  56. package/dist/chunks/{LpSidebar-BgwUNWpJ.js → LpSidebar-CQNB0-yU.js} +3 -3
  57. package/dist/chunks/{LpSidebarNav-Bqxz8aWT.js → LpSidebarNav-kx-LdqNU.js} +3 -3
  58. package/dist/chunks/{LpStat-dXtyrdX9.js → LpStat-B-7udBRP.js} +1 -1
  59. package/dist/chunks/{LpStepper-Bk-XaQYU.js → LpStepper-C7XiVKZj.js} +34 -19
  60. package/dist/chunks/{LpSwitch-B1aLKulj.js → LpSwitch-OrcOJX9m.js} +1 -1
  61. package/dist/chunks/LpTableFilter-BV8PpLM9.js +158 -0
  62. package/dist/chunks/{LpTabs-_qMVaZJ6.js → LpTabs-29iW1XOx.js} +1 -1
  63. package/dist/chunks/LpTagsInput-D1SuqbhB.js +300 -0
  64. package/dist/chunks/{LpTextarea-yP8hGedR.js → LpTextarea-uuScWo6-.js} +1 -1
  65. package/dist/chunks/{LpThemeProvider-Wjm7Tuit.js → LpThemeProvider-Be4r2TQX.js} +1 -1
  66. package/dist/chunks/{LpThemeSwitcher-CKLc10KZ.js → LpThemeSwitcher-B4aVPbNC.js} +19 -22
  67. package/dist/chunks/{LpTimeField-C5HRgS5H.js → LpTimeField-Cqe7fXnh.js} +1 -1
  68. package/dist/chunks/{LpToaster--oT6lfhL.js → LpToaster-DpJvoCOh.js} +37 -3
  69. package/dist/chunks/{LpTooltip-CBdzeKNf.js → LpTooltip-CXVKcOXT.js} +3 -2
  70. package/dist/chunks/{LpTopologyCanvas-DocsLal3.js → LpTopologyCanvas-6ozNrQKh.js} +2 -1
  71. package/dist/chunks/{LpUptimeBar-DLtxOMRy.js → LpUptimeBar-ugcv25xj.js} +2 -2
  72. package/dist/chunks/icons-CkA0njzm.js +43 -0
  73. package/dist/chunks/{useTheme-C8JHUlPM.js → useTheme-DJm1JSsY.js} +47 -50
  74. package/dist/component-names.d.ts +1 -1
  75. package/dist/components/ContextMenuItems.vue.js +1 -1
  76. package/dist/components/LayoutCanvas.vue.js +1 -1
  77. package/dist/components/LayoutNode.vue.js +1 -1
  78. package/dist/components/LpActionBar.vue.js +1 -1
  79. package/dist/components/LpAddressInput.vue.js +1 -1
  80. package/dist/components/LpAlert.vue.js +1 -1
  81. package/dist/components/LpAppShell.vue.js +1 -1
  82. package/dist/components/LpAutocomplete.vue.js +1 -1
  83. package/dist/components/LpAvatar.vue.js +1 -1
  84. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  85. package/dist/components/LpButton.vue.d.ts +2 -2
  86. package/dist/components/LpButton.vue.js +1 -1
  87. package/dist/components/LpCalendar.vue.js +1 -1
  88. package/dist/components/LpCard.vue.js +1 -1
  89. package/dist/components/LpChart.vue.d.ts +16 -1
  90. package/dist/components/LpChart.vue.js +63 -5
  91. package/dist/components/LpCheckbox.vue.js +1 -1
  92. package/dist/components/LpCodeBlock.vue.js +1 -1
  93. package/dist/components/LpColorPicker.vue.d.ts +2 -2
  94. package/dist/components/LpColorPicker.vue.js +1 -1
  95. package/dist/components/LpCommandPalette.vue.d.ts +6 -0
  96. package/dist/components/LpCommandPalette.vue.js +61 -10
  97. package/dist/components/LpConfirmDialog.vue.js +1 -1
  98. package/dist/components/LpConfirmHost.vue.js +1 -1
  99. package/dist/components/LpContextMenu.vue.js +1 -1
  100. package/dist/components/LpDatePicker.vue.js +1 -1
  101. package/dist/components/LpDateRangePicker.vue.d.ts +60 -0
  102. package/dist/components/LpDateRangePicker.vue.js +4 -0
  103. package/dist/components/LpDisclosure.vue.js +1 -1
  104. package/dist/components/LpDrawer.vue.js +1 -1
  105. package/dist/components/LpDropdownMenu.vue.js +1 -1
  106. package/dist/components/LpDropzone.vue.js +1 -1
  107. package/dist/components/LpEmptyState.vue.js +1 -1
  108. package/dist/components/LpFieldNotice.vue.d.ts +8 -0
  109. package/dist/components/LpFieldNotice.vue.js +4 -0
  110. package/dist/components/LpFileTree.vue.js +1 -1
  111. package/dist/components/LpFileTreeNode.vue.js +1 -1
  112. package/dist/components/LpFormField.vue.d.ts +4 -1
  113. package/dist/components/LpFormField.vue.js +1 -1
  114. package/dist/components/LpIcon.vue.d.ts +0 -1
  115. package/dist/components/LpIcon.vue.js +1 -1
  116. package/dist/components/LpImageEditor.vue.js +2 -2
  117. package/dist/components/LpInput.vue.d.ts +19 -0
  118. package/dist/components/LpInput.vue.js +1 -1
  119. package/dist/components/LpLightbox.vue.js +1 -1
  120. package/dist/components/LpLogViewer.vue.d.ts +52 -1
  121. package/dist/components/LpLogViewer.vue.js +1 -1
  122. package/dist/components/LpMapPicker.vue.js +1 -1
  123. package/dist/components/LpMediaGallery.vue.js +1 -1
  124. package/dist/components/LpModal.vue.js +1 -1
  125. package/dist/components/LpModalNav.vue.js +1 -1
  126. package/dist/components/LpNotificationBell.vue.js +1 -1
  127. package/dist/components/LpNumberField.vue.js +1 -1
  128. package/dist/components/LpPagination.vue.js +1 -1
  129. package/dist/components/LpPasswordInput.vue.js +1 -1
  130. package/dist/components/LpPhoneInput.vue.d.ts +13 -0
  131. package/dist/components/LpPhoneInput.vue.js +1 -1
  132. package/dist/components/LpPie.vue.js +1 -1
  133. package/dist/components/LpPopover.vue.js +1 -1
  134. package/dist/components/LpProgress.vue.d.ts +1 -1
  135. package/dist/components/LpRangeCalendar.vue.d.ts +51 -0
  136. package/dist/components/LpRangeCalendar.vue.js +4 -0
  137. package/dist/components/LpRollingText.vue.d.ts +1 -1
  138. package/dist/components/LpRollingText.vue.js +1 -1
  139. package/dist/components/LpScrollArea.vue.d.ts +2 -2
  140. package/dist/components/LpScrollArea.vue.js +1 -1
  141. package/dist/components/LpSection.vue.js +1 -1
  142. package/dist/components/LpSegmented.vue.js +1 -1
  143. package/dist/components/LpSelect.vue.js +1 -1
  144. package/dist/components/LpShortcutsDialog.vue.d.ts +6 -0
  145. package/dist/components/LpShortcutsDialog.vue.js +56 -14
  146. package/dist/components/LpSidebar.vue.js +1 -1
  147. package/dist/components/LpSidebarNav.vue.js +1 -1
  148. package/dist/components/LpStat.vue.js +1 -1
  149. package/dist/components/LpStepper.vue.js +1 -1
  150. package/dist/components/LpSwitch.vue.js +1 -1
  151. package/dist/components/LpTable.vue.d.ts +84 -2
  152. package/dist/components/LpTable.vue.js +481 -107
  153. package/dist/components/LpTableFilter.vue.d.ts +31 -0
  154. package/dist/components/LpTableFilter.vue.js +4 -0
  155. package/dist/components/LpTabs.vue.js +1 -1
  156. package/dist/components/LpTagsInput.vue.d.ts +77 -0
  157. package/dist/components/LpTagsInput.vue.js +4 -0
  158. package/dist/components/LpTextarea.vue.js +1 -1
  159. package/dist/components/LpThemeProvider.vue.js +1 -1
  160. package/dist/components/LpThemeSwitcher.vue.d.ts +2 -2
  161. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  162. package/dist/components/LpTimeField.vue.js +1 -1
  163. package/dist/components/LpToaster.vue.js +1 -1
  164. package/dist/components/LpTooltip.vue.js +1 -1
  165. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  166. package/dist/components/LpUptimeBar.vue.js +1 -1
  167. package/dist/components/chart.js +3 -2
  168. package/dist/components/commandSearch.js +3 -0
  169. package/dist/components/dateRange.d.ts +43 -0
  170. package/dist/components/dateRange.js +76 -0
  171. package/dist/components/exportData.d.ts +58 -0
  172. package/dist/components/exportData.js +165 -0
  173. package/dist/components/logSearch.d.ts +18 -0
  174. package/dist/components/logSearch.js +36 -0
  175. package/dist/components/phone.d.ts +41 -0
  176. package/dist/components/phone.js +80 -0
  177. package/dist/components/tableFilter.d.ts +36 -0
  178. package/dist/components/tableFilter.js +84 -0
  179. package/dist/components/tags.d.ts +20 -0
  180. package/dist/components/tags.js +37 -0
  181. package/dist/composables/useField.d.ts +4 -0
  182. package/dist/composables/useFieldNotice.d.ts +17 -0
  183. package/dist/composables/useFieldNotice.js +28 -0
  184. package/dist/composables/useForm.d.ts +53 -0
  185. package/dist/composables/useForm.js +207 -0
  186. package/dist/composables/useHotkeys.d.ts +65 -5
  187. package/dist/composables/useHotkeys.js +170 -9
  188. package/dist/composables/useInputMask.d.ts +59 -0
  189. package/dist/composables/useInputMask.js +170 -0
  190. package/dist/composables/usePaintSelect.d.ts +22 -0
  191. package/dist/composables/usePaintSelect.js +169 -0
  192. package/dist/composables/useShift.js +7 -2
  193. package/dist/icons-all.d.ts +1 -0
  194. package/dist/icons-all.js +3 -0
  195. package/dist/icons.d.ts +14 -1
  196. package/dist/index.d.ts +29 -3
  197. package/dist/index.js +195 -138
  198. package/dist/kit-icons.d.ts +2 -0
  199. package/dist/theme/backdrop.d.ts +12 -0
  200. package/dist/theme/presets.d.ts +0 -2
  201. package/package.json +13 -4
  202. package/src/component-names.ts +4 -0
  203. package/src/components/ContextMenuItems.vue +1 -1
  204. package/src/components/LayoutNode.vue +11 -2
  205. package/src/components/LpActionBar.vue +1 -1
  206. package/src/components/LpAutocomplete.vue +1 -0
  207. package/src/components/LpAvatar.vue +2 -2
  208. package/src/components/LpButton.vue +1 -1
  209. package/src/components/LpChart.vue +80 -1
  210. package/src/components/LpColorPicker.vue +34 -1
  211. package/src/components/LpCommandPalette.vue +81 -7
  212. package/src/components/LpContextMenu.vue +1 -1
  213. package/src/components/LpDatePicker.vue +8 -3
  214. package/src/components/LpDateRangePicker.vue +224 -0
  215. package/src/components/LpDropdownMenu.vue +1 -0
  216. package/src/components/LpFieldNotice.vue +65 -0
  217. package/src/components/LpFormField.vue +33 -4
  218. package/src/components/LpIcon.vue +22 -4
  219. package/src/components/LpInput.vue +46 -6
  220. package/src/components/LpLogViewer.vue +225 -22
  221. package/src/components/LpModal.vue +1 -1
  222. package/src/components/LpNotificationBell.vue +15 -7
  223. package/src/components/LpPhoneInput.vue +179 -20
  224. package/src/components/LpPie.vue +8 -5
  225. package/src/components/LpPopover.vue +1 -0
  226. package/src/components/LpRangeCalendar.vue +365 -0
  227. package/src/components/LpRollingText.vue +3 -0
  228. package/src/components/LpScrollArea.vue +22 -2
  229. package/src/components/LpSelect.vue +0 -0
  230. package/src/components/LpShortcutsDialog.vue +77 -8
  231. package/src/components/LpStepper.vue +23 -10
  232. package/src/components/LpSwitch.vue +1 -1
  233. package/src/components/LpTable.vue +584 -65
  234. package/src/components/LpTableFilter.vue +175 -0
  235. package/src/components/LpTagsInput.vue +364 -0
  236. package/src/components/LpThemeSwitcher.vue +19 -23
  237. package/src/components/LpToaster.vue +49 -1
  238. package/src/components/LpTooltip.vue +9 -2
  239. package/src/components/LpTopologyCanvas.vue +7 -1
  240. package/src/components/chart.ts +5 -3
  241. package/src/components/commandSearch.ts +6 -0
  242. package/src/components/dateRange.ts +134 -0
  243. package/src/components/exportData.ts +228 -0
  244. package/src/components/logSearch.ts +46 -0
  245. package/src/components/phone.ts +140 -0
  246. package/src/components/tableFilter.ts +122 -0
  247. package/src/components/tags.ts +62 -0
  248. package/src/composables/useField.ts +4 -0
  249. package/src/composables/useFieldNotice.ts +59 -0
  250. package/src/composables/useForm.ts +314 -0
  251. package/src/composables/useHotkeys.ts +269 -13
  252. package/src/composables/useInputMask.ts +254 -0
  253. package/src/composables/usePaintSelect.ts +243 -0
  254. package/src/composables/useShift.ts +13 -2
  255. package/src/iconSubset.d.mts +10 -0
  256. package/src/iconSubset.mjs +51 -0
  257. package/src/icons-all.ts +10 -0
  258. package/src/icons.ts +59 -8
  259. package/src/index.ts +37 -3
  260. package/src/kit-icons.ts +5 -0
  261. package/src/nuxt.ts +30 -2
  262. package/src/runtime/theme.plugin.ts +2 -2
  263. package/src/theme/backdrop.ts +69 -0
  264. package/src/theme/presets.ts +6 -64
  265. package/src/tokens/tokens.css +46 -0
@@ -1,49 +1,68 @@
1
- import { defineComponent, ref, shallowRef, computed, onMounted, onBeforeUnmount, watch, nextTick, openBlock, createElementBlock, mergeProps, unref, createVNode, Transition, withCtx, toDisplayString, createCommentVNode, normalizeStyle, createElementVNode, Fragment, createBlock, resolveDynamicComponent, TransitionGroup, renderList, normalizeClass, createTextVNode } from "vue";
1
+ import { defineComponent, useModel, computed, ref, shallowRef, onMounted, onBeforeUnmount, watch, nextTick, openBlock, createElementBlock, mergeProps, unref, createVNode, Transition, withCtx, toDisplayString, createCommentVNode, createElementVNode, withDirectives, vModelText, Fragment, renderList, normalizeClass, createTextVNode, normalizeStyle, createBlock, resolveDynamicComponent, TransitionGroup, mergeModels } from "vue";
2
2
  import { prefersReducedMotion } from "../composables/easing.js";
3
3
  import { useClipboard } from "../composables/useClipboard.js";
4
4
  import { useHotkeys } from "../composables/useHotkeys.js";
5
- import { _ as _sfc_main$3 } from "./LpContextMenu-DQw5dGfG.js";
6
- import { _ as _sfc_main$2 } from "./LpIcon-CCnX5_2j.js";
7
- import { _ as _sfc_main$1 } from "./LpScrollArea-D8xyKXcF.js";
5
+ import { _ as _sfc_main$3 } from "./LpContextMenu-BqkAYa9X.js";
6
+ import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
7
+ import { _ as _sfc_main$2 } from "./LpScrollArea-Bry1fdOM.js";
8
8
  import { useMergedAttrs } from "../composables/useMergedClass.js";
9
9
  import { useLabels } from "../composables/useLpConfig.js";
10
+ import { ringWindow, matchPositions, countLevels, stepMatch } from "../components/logSearch.js";
10
11
  const _hoisted_1 = {
11
12
  key: 0,
12
13
  class: "pointer-events-none absolute top-2 left-1/2 z-10 -translate-x-1/2 rounded-pill bg-brand px-2.5 py-1 text-[11px] font-medium text-ink-inverse"
13
14
  };
14
15
  const _hoisted_2 = {
16
+ key: 0,
17
+ class: "flex flex-wrap items-center gap-2 border-b border-line px-2 py-1.5 font-sans"
18
+ };
19
+ const _hoisted_3 = { class: "flex min-w-48 flex-1 items-center gap-1.5 rounded-control bg-surface-soft px-2 focus-within:ring-2 focus-within:ring-ring" };
20
+ const _hoisted_4 = ["aria-label", "placeholder"];
21
+ const _hoisted_5 = {
22
+ key: 0,
23
+ class: "shrink-0 text-[11px] tabular-nums text-muted",
24
+ "aria-live": "polite"
25
+ };
26
+ const _hoisted_6 = ["aria-label"];
27
+ const _hoisted_7 = { class: "flex items-center" };
28
+ const _hoisted_8 = ["aria-label", "disabled"];
29
+ const _hoisted_9 = ["aria-label", "disabled"];
30
+ const _hoisted_10 = ["aria-label"];
31
+ const _hoisted_11 = ["aria-pressed", "onClick"];
32
+ const _hoisted_12 = { class: "font-normal tabular-nums text-muted" };
33
+ const _hoisted_13 = {
15
34
  key: 0,
16
35
  class: "flex h-full flex-col items-center justify-center gap-1 px-4 py-10 text-center"
17
36
  };
18
- const _hoisted_3 = { class: "text-muted" };
19
- const _hoisted_4 = {
37
+ const _hoisted_14 = { class: "text-muted" };
38
+ const _hoisted_15 = {
20
39
  key: 0,
21
40
  class: "text-muted/70"
22
41
  };
23
- const _hoisted_5 = {
42
+ const _hoisted_16 = {
24
43
  key: 0,
25
44
  class: "flex items-center justify-center gap-2 py-2 text-muted"
26
45
  };
27
- const _hoisted_6 = { class: "text-[11px]" };
28
- const _hoisted_7 = ["data-log-row"];
29
- const _hoisted_8 = {
46
+ const _hoisted_17 = { class: "text-[11px]" };
47
+ const _hoisted_18 = ["data-log-row", "aria-current"];
48
+ const _hoisted_19 = {
30
49
  key: 0,
31
50
  class: "mr-3 w-10 shrink-0 select-none text-right tabular-nums text-muted/70"
32
51
  };
33
- const _hoisted_9 = {
52
+ const _hoisted_20 = {
34
53
  key: 1,
35
54
  class: "mr-3 shrink-0 tabular-nums text-muted"
36
55
  };
37
- const _hoisted_10 = {
56
+ const _hoisted_21 = {
38
57
  key: 3,
39
58
  class: "mr-2 shrink-0 text-muted-strong"
40
59
  };
41
- const _hoisted_11 = {
60
+ const _hoisted_22 = {
42
61
  key: 0,
43
62
  class: "rounded-xs bg-accent/30 text-ink"
44
63
  };
45
- const _hoisted_12 = ["title"];
46
- const _hoisted_13 = {
64
+ const _hoisted_23 = ["title"];
65
+ const _hoisted_24 = {
47
66
  key: 0,
48
67
  class: "absolute inset-x-0 bottom-3 flex justify-center"
49
68
  };
@@ -51,7 +70,7 @@ const __default__ = { inheritAttrs: false };
51
70
  const _sfc_main = /* @__PURE__ */ defineComponent({
52
71
  ...__default__,
53
72
  __name: "LpLogViewer",
54
- props: {
73
+ props: /* @__PURE__ */ mergeModels({
55
74
  lines: {},
56
75
  showTime: { type: Boolean, default: true },
57
76
  showLevel: { type: Boolean, default: true },
@@ -69,12 +88,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
69
88
  rowMenu: { type: Boolean, default: true },
70
89
  extraRowItems: {},
71
90
  parse: { type: Boolean, default: false },
91
+ maxLines: {},
92
+ toolbar: { type: Boolean },
72
93
  labels: {}
73
- },
74
- emits: ["filter", "reach-top"],
75
- setup(__props, { emit: __emit }) {
94
+ }, {
95
+ "search": { default: "" },
96
+ "searchModifiers": {},
97
+ "levels": { default: () => [] },
98
+ "levelsModifiers": {}
99
+ }),
100
+ emits: /* @__PURE__ */ mergeModels(["filter", "reach-top"], ["update:search", "update:levels"]),
101
+ setup(__props, { expose: __expose, emit: __emit }) {
76
102
  const props = __props;
77
103
  const emit = __emit;
104
+ const query = useModel(__props, "search");
105
+ const levels = useModel(__props, "levels");
106
+ const term = computed(() => (props.toolbar && query.value ? query.value : props.highlight ?? "").trim());
78
107
  const text = useLabels(
79
108
  "logViewer",
80
109
  {
@@ -89,7 +118,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
89
118
  filterSource: "Filter by [{source}]",
90
119
  filterLevel: "Filter by {level}",
91
120
  identical: "{n} identical lines",
92
- jump: "Jump to latest"
121
+ jump: "Jump to latest",
122
+ search: "Search logs",
123
+ clearSearch: "Clear search",
124
+ previousMatch: "Previous match",
125
+ nextMatch: "Next match",
126
+ matchCount: "{current} / {total}",
127
+ noMatches: "No matches",
128
+ levels: "Levels"
93
129
  },
94
130
  () => props.labels
95
131
  );
@@ -160,11 +196,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
160
196
  const root = ref(null);
161
197
  const frozen = ref(false);
162
198
  const frozenLines = shallowRef(null);
163
- const sourceLines = computed(() => frozenLines.value ?? props.lines);
199
+ const windowed = computed(() => ringWindow(frozenLines.value ?? props.lines, props.maxLines));
200
+ const sourceLines = computed(() => windowed.value.lines);
201
+ const lineOffset = computed(() => windowed.value.offset);
164
202
  function freeze() {
165
203
  if (!hovered.value && !focusWithin()) return false;
166
204
  if (frozen.value) return true;
167
- frozenLines.value = props.lines;
205
+ frozenLines.value = props.maxLines ? props.lines.slice(-props.maxLines) : props.lines;
168
206
  frozen.value = true;
169
207
  return true;
170
208
  }
@@ -177,9 +215,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
177
215
  const el = root.value;
178
216
  return !!el && el.contains(document.activeElement);
179
217
  }
218
+ const lookedAt = () => hovered.value || focusWithin();
180
219
  useHotkeys(() => [
181
- { key: "control", allowInInput: true, handler: freeze },
182
- { key: "meta", allowInInput: true, handler: freeze }
220
+ { key: "control", allowInInput: true, when: lookedAt, handler: freeze },
221
+ { key: "meta", allowInInput: true, when: lookedAt, handler: freeze }
183
222
  ]);
184
223
  function onKeyup(event) {
185
224
  if (event.key === "Control" || event.key === "Meta") thaw();
@@ -196,8 +235,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
196
235
  () => props.parse ? sourceLines.value.map(parseLine) : sourceLines.value
197
236
  );
198
237
  const visibleLines = computed(() => {
199
- const term = props.filterMatches ? props.highlight?.trim().toLowerCase() : "";
200
- const filtered = parsedLines.value.map((line, n) => ({ line, n })).filter(({ line }) => !term || line.message.toLowerCase().includes(term));
238
+ const needle = props.filterMatches ? term.value.toLowerCase() : "";
239
+ const shown = levels.value.length ? new Set(levels.value) : null;
240
+ const filtered = parsedLines.value.map((line, n) => ({ line, n })).filter(({ line }) => !shown || shown.has(line.level ?? "info")).filter(({ line }) => !needle || matchPositions([line], needle).length > 0);
201
241
  if (!props.compact) return filtered.map((row) => ({ ...row, count: 1 }));
202
242
  const folded = [];
203
243
  for (const row of filtered) {
@@ -222,6 +262,70 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
222
262
  }
223
263
  return id;
224
264
  }
265
+ const LEVEL_ORDER = ["trace", "debug", "info", "success", "warn", "error", "fatal"];
266
+ const levelCounts = computed(() => countLevels(parsedLines.value, "info"));
267
+ const presentLevels = computed(() => LEVEL_ORDER.filter((l) => levelCounts.value.has(l)));
268
+ function toggleLevel(level) {
269
+ levels.value = levels.value.includes(level) ? levels.value.filter((l) => l !== level) : [...levels.value, level];
270
+ }
271
+ const matches = computed(() => matchPositions(visibleLines.value.map((r) => r.line), term.value));
272
+ const current = ref(-1);
273
+ const currentRow = computed(() => {
274
+ const pos = matches.value[current.value];
275
+ return pos === void 0 ? -1 : visibleLines.value[pos]?.n ?? -1;
276
+ });
277
+ watch(term, () => {
278
+ current.value = -1;
279
+ });
280
+ watch(matches, (list) => {
281
+ if (current.value >= list.length) current.value = list.length - 1;
282
+ });
283
+ const matchLabel = computed(() => {
284
+ if (!term.value) return "";
285
+ const total = matches.value.length;
286
+ if (!total) return text.value.noMatches;
287
+ return text.value.matchCount.replace("{current}", current.value >= 0 ? String(current.value + 1) : "–").replace("{total}", String(total));
288
+ });
289
+ function step(direction) {
290
+ const next = stepMatch(current.value, matches.value.length, direction);
291
+ if (next < 0) return;
292
+ current.value = next;
293
+ pinned.value = false;
294
+ nextTick(() => revealMatch(matches.value[next]));
295
+ }
296
+ function revealMatch(position) {
297
+ const el = viewport();
298
+ if (!el || position === void 0) return;
299
+ const behavior = prefersReducedMotion() ? "auto" : "smooth";
300
+ if (virtualise.value) {
301
+ el.scrollTo({ top: Math.max(0, position * ROW_HEIGHT - el.clientHeight / 2), behavior });
302
+ return;
303
+ }
304
+ const n = visibleLines.value[position]?.n;
305
+ el.querySelector(`[data-log-row="${n}"]`)?.scrollIntoView({ block: "center", behavior });
306
+ }
307
+ const searchEl = ref(null);
308
+ function onSearchKeydown(event) {
309
+ if (event.isComposing) return;
310
+ if (event.key === "Enter") {
311
+ event.preventDefault();
312
+ step(event.shiftKey ? -1 : 1);
313
+ } else if (event.key === "Escape" && query.value) {
314
+ event.preventDefault();
315
+ event.stopPropagation();
316
+ query.value = "";
317
+ }
318
+ }
319
+ const searching = () => !!term.value && lookedAt();
320
+ useHotkeys(() => [
321
+ { key: "f3", allowInInput: true, when: searching, handler: () => step(1) },
322
+ { key: "f3", shift: true, allowInInput: true, when: searching, handler: () => step(-1) }
323
+ ]);
324
+ __expose({
325
+ next: () => step(1),
326
+ previous: () => step(-1),
327
+ focusSearch: () => searchEl.value?.focus()
328
+ });
225
329
  const filteredEmpty = computed(
226
330
  () => props.lines.length > 0 && visibleLines.value.length === 0
227
331
  );
@@ -275,7 +379,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
275
379
  label: text.value.filterLevel.replace("{level}", line.level),
276
380
  icon: "lucide:filter",
277
381
  separatorBefore: !line.source,
278
- onSelect: () => emit("filter", { level: line.level })
382
+ onSelect: () => {
383
+ if (props.toolbar && line.level) levels.value = [line.level];
384
+ emit("filter", { level: line.level });
385
+ }
279
386
  });
280
387
  }
281
388
  const extra = props.extraRowItems?.(line, index) ?? [];
@@ -283,11 +390,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
283
390
  return [...items, ...extra];
284
391
  }
285
392
  function splitHighlight(message) {
286
- const term = props.highlight?.trim();
287
- if (!term) return [{ text: message, hit: false }];
393
+ if (!term.value) return [{ text: message, hit: false }];
288
394
  const parts = [];
289
395
  const lower = message.toLowerCase();
290
- const needle = term.toLowerCase();
396
+ const needle = term.value.toLowerCase();
291
397
  let i = 0;
292
398
  while (i < message.length) {
293
399
  const at = lower.indexOf(needle, i);
@@ -374,6 +480,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
374
480
  el.scrollTo({ top: el.scrollHeight, behavior: smooth && !reduce && !far ? "smooth" : "auto" });
375
481
  }
376
482
  function scrollToBottom() {
483
+ current.value = -1;
377
484
  rideToBottom(true, true);
378
485
  pinned.value = true;
379
486
  }
@@ -389,7 +496,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
389
496
  linesSignal,
390
497
  async () => {
391
498
  await nextTick();
392
- if (props.tail && pinned.value) {
499
+ if (props.tail && pinned.value && current.value < 0) {
393
500
  requestAnimationFrame(() => rideToBottom(true));
394
501
  } else {
395
502
  restoreScrollAnchor();
@@ -416,12 +523,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
416
523
  });
417
524
  const transitionProps = {
418
525
  tag: "ol",
419
- "enter-active-class": "transition duration-200 ease-[var(--ease-emphasized)]",
526
+ "enter-active-class": "transition duration-[var(--duration-medium)] ease-[var(--ease-emphasized)]",
420
527
  "enter-from-class": "-translate-x-1 opacity-0",
421
- "leave-active-class": "overflow-hidden transition-all duration-200 ease-[var(--ease-emphasized)]",
528
+ "leave-active-class": "overflow-hidden transition-all duration-[var(--duration-medium)] ease-[var(--ease-emphasized)]",
422
529
  "leave-from-class": "max-h-8 opacity-100",
423
530
  "leave-to-class": "max-h-0 -translate-y-1 opacity-0",
424
- "move-class": "transition-transform duration-200 ease-[var(--ease-emphasized)]"
531
+ "move-class": "transition-transform duration-[var(--duration-medium)] ease-[var(--ease-emphasized)]"
425
532
  };
426
533
  const { class: rootClass, attrs: rest } = useMergedAttrs(
427
534
  () => [
@@ -436,8 +543,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
436
543
  tabindex: "-1",
437
544
  class: unref(rootClass)
438
545
  }, unref(rest), {
439
- onPointerenter: _cache[0] || (_cache[0] = ($event) => hovered.value = true),
440
- onPointerleave: _cache[1] || (_cache[1] = ($event) => hovered.value = false)
546
+ onPointerenter: _cache[4] || (_cache[4] = ($event) => hovered.value = true),
547
+ onPointerleave: _cache[5] || (_cache[5] = ($event) => hovered.value = false)
441
548
  }), [
442
549
  createVNode(Transition, {
443
550
  "enter-active-class": "transition duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] motion-reduce:transition-none",
@@ -450,7 +557,93 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
450
557
  ]),
451
558
  _: 1
452
559
  }),
453
- createVNode(_sfc_main$1, {
560
+ __props.toolbar ? (openBlock(), createElementBlock("div", _hoisted_2, [
561
+ createElementVNode("div", _hoisted_3, [
562
+ createVNode(_sfc_main$1, {
563
+ name: "lucide:search",
564
+ size: 14,
565
+ class: "shrink-0 text-muted"
566
+ }),
567
+ withDirectives(createElementVNode("input", {
568
+ ref_key: "searchEl",
569
+ ref: searchEl,
570
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => query.value = $event),
571
+ type: "search",
572
+ "aria-label": unref(text).search,
573
+ placeholder: unref(text).search,
574
+ class: "h-7 min-w-0 flex-1 bg-transparent text-xs text-ink outline-none placeholder:text-muted [&::-webkit-search-cancel-button]:hidden",
575
+ onKeydown: onSearchKeydown
576
+ }, null, 40, _hoisted_4), [
577
+ [vModelText, query.value]
578
+ ]),
579
+ term.value ? (openBlock(), createElementBlock("span", _hoisted_5, toDisplayString(matchLabel.value), 1)) : createCommentVNode("", true),
580
+ query.value ? (openBlock(), createElementBlock("button", {
581
+ key: 1,
582
+ type: "button",
583
+ class: "rounded-xs p-0.5 text-muted outline-none hover:text-ink focus-visible:ring-2 focus-visible:ring-ring",
584
+ "aria-label": unref(text).clearSearch,
585
+ onClick: _cache[1] || (_cache[1] = ($event) => {
586
+ query.value = "";
587
+ searchEl.value?.focus();
588
+ })
589
+ }, [
590
+ createVNode(_sfc_main$1, {
591
+ name: "lucide:x",
592
+ size: 12
593
+ })
594
+ ], 8, _hoisted_6)) : createCommentVNode("", true)
595
+ ]),
596
+ createElementVNode("div", _hoisted_7, [
597
+ createElementVNode("button", {
598
+ type: "button",
599
+ class: "rounded-xs p-1 text-muted outline-none hover:text-ink focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40",
600
+ "aria-label": unref(text).previousMatch,
601
+ disabled: !matches.value.length,
602
+ onClick: _cache[2] || (_cache[2] = ($event) => step(-1))
603
+ }, [
604
+ createVNode(_sfc_main$1, {
605
+ name: "lucide:chevron-up",
606
+ size: 14
607
+ })
608
+ ], 8, _hoisted_8),
609
+ createElementVNode("button", {
610
+ type: "button",
611
+ class: "rounded-xs p-1 text-muted outline-none hover:text-ink focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40",
612
+ "aria-label": unref(text).nextMatch,
613
+ disabled: !matches.value.length,
614
+ onClick: _cache[3] || (_cache[3] = ($event) => step(1))
615
+ }, [
616
+ createVNode(_sfc_main$1, {
617
+ name: "lucide:chevron-down",
618
+ size: 14
619
+ })
620
+ ], 8, _hoisted_9)
621
+ ]),
622
+ presentLevels.value.length > 1 ? (openBlock(), createElementBlock("div", {
623
+ key: 0,
624
+ role: "group",
625
+ "aria-label": unref(text).levels,
626
+ class: "flex flex-wrap items-center gap-1"
627
+ }, [
628
+ (openBlock(true), createElementBlock(Fragment, null, renderList(presentLevels.value, (level) => {
629
+ return openBlock(), createElementBlock("button", {
630
+ key: level,
631
+ type: "button",
632
+ class: normalizeClass(["flex items-center gap-1 rounded-pill border px-2 py-0.5 text-[10px] font-semibold uppercase tracking-[0.06em] outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring", levels.value.includes(level) ? "border-line-strong bg-surface-soft text-ink" : "border-line text-muted hover:text-ink"]),
633
+ "aria-pressed": levels.value.includes(level),
634
+ onClick: ($event) => toggleLevel(level)
635
+ }, [
636
+ createElementVNode("span", {
637
+ class: normalizeClass(["size-1.5 rounded-full", metaFor(level).rail]),
638
+ "aria-hidden": "true"
639
+ }, null, 2),
640
+ createTextVNode(" " + toDisplayString(level) + " ", 1),
641
+ createElementVNode("span", _hoisted_12, toDisplayString(levelCounts.value.get(level)), 1)
642
+ ], 10, _hoisted_11);
643
+ }), 128))
644
+ ], 8, _hoisted_10)) : createCommentVNode("", true)
645
+ ])) : createCommentVNode("", true),
646
+ createVNode(_sfc_main$2, {
454
647
  ref_key: "scrollRef",
455
648
  ref: scrollRef,
456
649
  instant: "",
@@ -459,17 +652,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
459
652
  onScroll
460
653
  }, {
461
654
  default: withCtx(() => [
462
- __props.lines.length === 0 || filteredEmpty.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
463
- createElementVNode("span", _hoisted_3, toDisplayString(filteredEmpty.value ? unref(text).noMatch : __props.emptyLabel ?? unref(text).empty), 1),
464
- filteredEmpty.value ? (openBlock(), createElementBlock("span", _hoisted_4, "“" + toDisplayString(__props.highlight) + "”", 1)) : createCommentVNode("", true)
655
+ __props.lines.length === 0 || filteredEmpty.value ? (openBlock(), createElementBlock("div", _hoisted_13, [
656
+ createElementVNode("span", _hoisted_14, toDisplayString(filteredEmpty.value ? unref(text).noMatch : __props.emptyLabel ?? unref(text).empty), 1),
657
+ filteredEmpty.value && term.value ? (openBlock(), createElementBlock("span", _hoisted_15, "“" + toDisplayString(term.value) + "”", 1)) : createCommentVNode("", true)
465
658
  ])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
466
- __props.loadingOlder ? (openBlock(), createElementBlock("div", _hoisted_5, [
467
- createVNode(_sfc_main$2, {
659
+ __props.loadingOlder ? (openBlock(), createElementBlock("div", _hoisted_16, [
660
+ createVNode(_sfc_main$1, {
468
661
  name: "lucide:loader-circle",
469
662
  size: 14,
470
663
  class: "animate-spin"
471
664
  }),
472
- createElementVNode("span", _hoisted_6, toDisplayString(unref(text).loadingOlder), 1)
665
+ createElementVNode("span", _hoisted_17, toDisplayString(unref(text).loadingOlder), 1)
473
666
  ])) : createCommentVNode("", true),
474
667
  createVNode(_sfc_main$3, {
475
668
  items: menuItems.value,
@@ -491,48 +684,49 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
491
684
  return openBlock(), createElementBlock("li", {
492
685
  key: lineKey(n),
493
686
  "data-log-row": n,
494
- class: normalizeClass(["group relative flex items-start gap-0 px-0 leading-5 transition-colors hover:bg-surface-soft/60", metaFor(line.level).sel])
687
+ class: normalizeClass(["group relative flex items-start gap-0 px-0 leading-5 transition-colors hover:bg-surface-soft/60", [metaFor(line.level).sel, n === currentRow.value ? "bg-accent/15" : ""]]),
688
+ "aria-current": n === currentRow.value ? "true" : void 0
495
689
  }, [
496
690
  createElementVNode("span", {
497
691
  class: normalizeClass(["absolute inset-y-0 left-0 w-0.5", metaFor(line.level).rail]),
498
692
  "aria-hidden": "true"
499
693
  }, null, 2),
500
- _cache[2] || (_cache[2] = createElementVNode("span", {
694
+ _cache[6] || (_cache[6] = createElementVNode("span", {
501
695
  class: "mr-2 w-0.5 shrink-0",
502
696
  "aria-hidden": "true"
503
697
  }, null, -1)),
504
- __props.lineNumbers ? (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(n + 1), 1)) : createCommentVNode("", true),
505
- __props.showTime ? (openBlock(), createElementBlock("span", _hoisted_9, toDisplayString(fmtTime(line.time)), 1)) : createCommentVNode("", true),
698
+ __props.lineNumbers ? (openBlock(), createElementBlock("span", _hoisted_19, toDisplayString(n + lineOffset.value + 1), 1)) : createCommentVNode("", true),
699
+ __props.showTime ? (openBlock(), createElementBlock("span", _hoisted_20, toDisplayString(fmtTime(line.time)), 1)) : createCommentVNode("", true),
506
700
  __props.showLevel ? (openBlock(), createElementBlock("span", {
507
701
  key: 2,
508
702
  class: normalizeClass(["mr-3 w-12 shrink-0 text-[10px] font-semibold uppercase tracking-[0.06em]", metaFor(line.level).chip])
509
703
  }, toDisplayString(line.level ?? "info"), 3)) : createCommentVNode("", true),
510
- line.source ? (openBlock(), createElementBlock("span", _hoisted_10, "[" + toDisplayString(line.source) + "]", 1)) : createCommentVNode("", true),
704
+ line.source ? (openBlock(), createElementBlock("span", _hoisted_21, "[" + toDisplayString(line.source) + "]", 1)) : createCommentVNode("", true),
511
705
  createElementVNode("span", {
512
706
  class: normalizeClass(["min-w-0 pr-3", [metaFor(line.level).text, __props.wrap ? "whitespace-pre-wrap break-words" : "whitespace-pre"]])
513
707
  }, [
514
708
  (openBlock(true), createElementBlock(Fragment, null, renderList(splitHighlight(virtualise.value ? line.message.replace(/\r?\n/g, " ↵ ") : line.message), (part, p) => {
515
709
  return openBlock(), createElementBlock(Fragment, { key: p }, [
516
- part.hit ? (openBlock(), createElementBlock("mark", _hoisted_11, toDisplayString(part.text), 1)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
710
+ part.hit ? (openBlock(), createElementBlock("mark", _hoisted_22, toDisplayString(part.text), 1)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
517
711
  createTextVNode(toDisplayString(part.text), 1)
518
712
  ], 64))
519
713
  ], 64);
520
714
  }), 128)),
521
715
  createVNode(Transition, {
522
- "enter-active-class": "inline-block transition duration-200 ease-[var(--ease-emphasized)]",
716
+ "enter-active-class": "transition duration-[var(--duration-medium)] ease-[var(--ease-emphasized)]",
523
717
  "enter-from-class": "scale-50 opacity-0"
524
718
  }, {
525
719
  default: withCtx(() => [
526
720
  count > 1 ? (openBlock(), createElementBlock("span", {
527
721
  key: count,
528
- class: "ml-2 select-none rounded-pill bg-surface-soft px-1.5 align-[1px] text-[10px] font-semibold tabular-nums text-muted-strong",
722
+ class: "ml-2 inline-block select-none rounded-pill bg-surface-soft px-1.5 align-[1px] text-[10px] font-semibold tabular-nums text-muted-strong",
529
723
  title: unref(text).identical.replace("{n}", String(count))
530
- }, "×" + toDisplayString(count), 9, _hoisted_12)) : createCommentVNode("", true)
724
+ }, "×" + toDisplayString(count), 9, _hoisted_23)) : createCommentVNode("", true)
531
725
  ]),
532
726
  _: 2
533
727
  }, 1024)
534
728
  ], 2)
535
- ], 10, _hoisted_7);
729
+ ], 10, _hoisted_18);
536
730
  }), 128)),
537
731
  virtualise.value && padBottom.value > 0 ? (openBlock(), createElementBlock("li", {
538
732
  key: "pad-bottom",
@@ -550,22 +744,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
550
744
  _: 1
551
745
  }, 8, ["content-class", "style"]),
552
746
  createVNode(Transition, {
553
- "enter-active-class": "transition duration-200 ease-[var(--ease-emphasized)]",
747
+ "enter-active-class": "transition duration-[var(--duration-medium)] ease-[var(--ease-emphasized)]",
554
748
  "enter-from-class": "translate-y-3 scale-90 opacity-0",
555
- "leave-active-class": "transition duration-150 ease-in",
749
+ "leave-active-class": "transition duration-[var(--duration-fast)] ease-in",
556
750
  "leave-to-class": "translate-y-3 scale-90 opacity-0"
557
751
  }, {
558
752
  default: withCtx(() => [
559
- showJump.value ? (openBlock(), createElementBlock("div", _hoisted_13, [
753
+ showJump.value ? (openBlock(), createElementBlock("div", _hoisted_24, [
560
754
  createElementVNode("button", {
561
755
  type: "button",
562
756
  class: "group flex items-center gap-1.5 rounded-pill border border-line bg-surface-overlay px-3 py-1 text-xs font-medium text-ink shadow-[var(--shadow-panel)] backdrop-blur outline-none transition-colors hover:bg-surface-soft focus-visible:ring-2 focus-visible:ring-ring",
563
757
  onClick: scrollToBottom
564
758
  }, [
565
- createVNode(_sfc_main$2, {
759
+ createVNode(_sfc_main$1, {
566
760
  name: "lucide:arrow-down",
567
761
  size: 14,
568
- class: "transition-transform duration-200 ease-[var(--ease-emphasized)] group-hover:translate-y-0.5"
762
+ class: "transition-transform duration-[var(--duration-medium)] ease-[var(--ease-emphasized)] group-hover:translate-y-0.5"
569
763
  }),
570
764
  createTextVNode(" " + toDisplayString(unref(text).jump), 1)
571
765
  ])
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, computed, ref, watch, onMounted, onBeforeUnmount, openBlock, createElementBlock, mergeProps, unref, createElementVNode, normalizeClass, Fragment, renderList, normalizeStyle, createVNode, createCommentVNode, createBlock, toDisplayString } from "vue";
2
2
  import { prefersReducedMotion } from "../composables/easing.js";
3
3
  import { OSM_TILES, project, tileUrl, unproject } from "../components/address.js";
4
- import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
4
+ import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
5
5
  import { useMergedAttrs } from "../composables/useMergedClass.js";
6
6
  import { useLabels } from "../composables/useLpConfig.js";
7
7
  const _hoisted_1 = ["tabindex", "aria-label"];
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, ref, watch, computed, openBlock, createElementBlock, renderSlot, mergeProps, unref, Fragment, renderList, normalizeClass, createElementVNode, toDisplayString, createVNode, createCommentVNode, createBlock } from "vue";
2
2
  import { useMergedAttrs } from "../composables/useMergedClass.js";
3
- import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
4
- import { _ as _sfc_main$2 } from "./LpLightbox-Mr0W_6HK.js";
3
+ import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
4
+ import { _ as _sfc_main$2 } from "./LpLightbox-DSDahF23.js";
5
5
  const _hoisted_1 = { key: 0 };
6
6
  const _hoisted_2 = ["aria-label"];
7
7
  const _hoisted_3 = ["aria-label", "onClick"];
@@ -5,8 +5,8 @@ import { useLabels } from "../composables/useLpConfig.js";
5
5
  import { useShift } from "../composables/useShift.js";
6
6
  import { useModalLayer } from "../components/modalDepth.js";
7
7
  import { CLOSE_ICON } from "../components/dropdown.js";
8
- import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
9
- import { _ as _sfc_main$2 } from "./LpScrollArea-D8xyKXcF.js";
8
+ import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
9
+ import { _ as _sfc_main$2 } from "./LpScrollArea-Bry1fdOM.js";
10
10
  const _hoisted_1 = {
11
11
  key: 0,
12
12
  "data-lp-modal-aside": "",
@@ -162,7 +162,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
162
162
  createElementVNode("div", {
163
163
  ref_key: "panelRef",
164
164
  ref: panelRef,
165
- class: normalizeClass(["flex max-h-[min(90vh,calc(100dvh-2rem))] min-h-0 flex-col overflow-hidden rounded-card border border-line shadow-panel", [unref(frosted) ? unref(layer).nested ? "lp-glass-overlay--nested" : "lp-glass-overlay" : "bg-surface-raised", widthClass.value, unref(tweening) ? "transition-[height] duration-fast ease-[var(--ease-emphasized)] motion-reduce:transition-none" : ""]]),
165
+ class: normalizeClass(["relative flex max-h-[min(90vh,calc(100dvh-2rem))] min-h-0 flex-col overflow-hidden rounded-card border border-line shadow-panel", [unref(frosted) ? unref(layer).nested ? "lp-glass-overlay--nested" : "lp-glass-overlay" : "bg-surface-raised", widthClass.value, unref(tweening) ? "transition-[height] duration-fast ease-[var(--ease-emphasized)] motion-reduce:transition-none" : ""]]),
166
166
  style: normalizeStyle({ ...__props.width ? { width: __props.width } : {}, ...hasAside.value ? { alignSelf: "stretch" } : {} })
167
167
  }, [
168
168
  !(__props.title || _ctx.$slots.title) && __props.ariaLabel ? (openBlock(), createBlock(unref(DialogTitle), {
@@ -1,9 +1,9 @@
1
1
  import { defineComponent, computed, ref, openBlock, createBlock, createSlots, withCtx, renderSlot, createElementVNode, normalizeClass, createVNode, createCommentVNode, createTextVNode, toDisplayString } from "vue";
2
2
  import { useLabels } from "../composables/useLpConfig.js";
3
- import { _ as _sfc_main$2 } from "./LpButton-kqJBHIIb.js";
4
- import { _ as _sfc_main$3 } from "./LpIcon-CCnX5_2j.js";
5
- import { _ as _sfc_main$1 } from "./LpModal-DPwGKBPv.js";
6
- import { _ as _sfc_main$4 } from "./LpSidebar-BgwUNWpJ.js";
3
+ import { _ as _sfc_main$2 } from "./LpButton-CKSwC6Mu.js";
4
+ import { _ as _sfc_main$3 } from "./LpIcon-DYtaid0K.js";
5
+ import { _ as _sfc_main$1 } from "./LpModal-DMMDQHAu.js";
6
+ import { _ as _sfc_main$4 } from "./LpSidebar-CQNB0-yU.js";
7
7
  const _hoisted_1 = { class: "flex items-center gap-2" };
8
8
  const _sfc_main = /* @__PURE__ */ defineComponent({
9
9
  __name: "LpModalNav",
@@ -1,12 +1,13 @@
1
- import { defineComponent, computed, useModel, getCurrentInstance, ref, onMounted, onBeforeUnmount, openBlock, createBlock, withCtx, createElementVNode, toDisplayString, createElementBlock, createCommentVNode, createVNode, Fragment, renderList, resolveDynamicComponent, normalizeClass, createTextVNode, mergeModels } from "vue";
1
+ import { defineComponent, computed, useModel, getCurrentInstance, ref, onMounted, onBeforeUnmount, openBlock, createBlock, withCtx, createElementVNode, toDisplayString, createElementBlock, createCommentVNode, createVNode, Fragment, renderList, resolveDynamicComponent, normalizeClass, Transition, mergeModels } from "vue";
2
2
  import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { _ as _sfc_main$8 } from "./LpBadge-Fe0D1bYx.js";
4
- import { _ as _sfc_main$7 } from "./LpButton-kqJBHIIb.js";
5
- import { _ as _sfc_main$5 } from "./LpContextMenu-DQw5dGfG.js";
6
- import { _ as _sfc_main$3 } from "./LpEmptyState-Dsdqz1Wj.js";
7
- import { _ as _sfc_main$6 } from "./LpIcon-CCnX5_2j.js";
8
- import { _ as _sfc_main$1 } from "./LpPopover-p_e_shN3.js";
9
- import { _ as _sfc_main$4 } from "./LpScrollArea-D8xyKXcF.js";
4
+ import { _ as _sfc_main$7 } from "./LpButton-CKSwC6Mu.js";
5
+ import { _ as _sfc_main$5 } from "./LpContextMenu-BqkAYa9X.js";
6
+ import { _ as _sfc_main$3 } from "./LpEmptyState-BJbZXC8D.js";
7
+ import { _ as _sfc_main$6 } from "./LpIcon-DYtaid0K.js";
8
+ import { _ as _sfc_main$1 } from "./LpPopover-DCKeqiVn.js";
9
+ import { _ as _sfc_main$9 } from "./LpRollingText-DB7upf-5.js";
10
+ import { _ as _sfc_main$4 } from "./LpScrollArea-Bry1fdOM.js";
10
11
  import { _ as _sfc_main$2 } from "./LpShift-DXNsauQZ.js";
11
12
  const _hoisted_1 = { class: "flex items-center justify-between gap-2 px-3 py-2.5" };
12
13
  const _hoisted_2 = { class: "text-sm font-semibold" };
@@ -202,17 +203,28 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
202
203
  name: "lucide:bell",
203
204
  size: 18
204
205
  }),
205
- hasUnread.value ? (openBlock(), createBlock(_sfc_main$8, {
206
- key: 0,
207
- "aria-hidden": "true",
208
- tone: "danger",
209
- class: "absolute -right-1 -top-1 min-w-4 justify-center px-1 py-0 text-[10px] leading-4"
206
+ createVNode(Transition, {
207
+ "enter-active-class": "animate-[chip-in_var(--duration-fast)_var(--ease-emphasized)] motion-reduce:animate-none",
208
+ "leave-active-class": "animate-[chip-out_var(--duration-fast)_ease] motion-reduce:animate-none"
210
209
  }, {
211
210
  default: withCtx(() => [
212
- createTextVNode(toDisplayString(badgeLabel.value), 1)
211
+ hasUnread.value ? (openBlock(), createBlock(_sfc_main$8, {
212
+ key: 0,
213
+ "aria-hidden": "true",
214
+ tone: "danger",
215
+ class: "absolute -right-1 -top-1 min-w-4 justify-center px-1 py-0 text-[10px] leading-4"
216
+ }, {
217
+ default: withCtx(() => [
218
+ createVNode(_sfc_main$9, {
219
+ value: badgeLabel.value,
220
+ duration: 220
221
+ }, null, 8, ["value"])
222
+ ]),
223
+ _: 1
224
+ })) : createCommentVNode("", true)
213
225
  ]),
214
226
  _: 1
215
- })) : createCommentVNode("", true)
227
+ })
216
228
  ]),
217
229
  _: 1
218
230
  }, 8, ["aria-label"])
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, useId, computed, openBlock, createBlock, unref, mergeProps, withCtx, createVNode, createElementBlock, toDisplayString, createCommentVNode } from "vue";
2
2
  import { NumberFieldRoot, NumberFieldDecrement, NumberFieldInput, NumberFieldIncrement } from "reka-ui";
3
- import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
3
+ import { _ as _sfc_main$1 } from "./LpIcon-DYtaid0K.js";
4
4
  import { useFieldControl } from "../composables/useField.js";
5
5
  import { useMergedAttrs } from "../composables/useMergedClass.js";
6
6
  const _hoisted_1 = ["id"];