@leavepulse/ui 0.20.5 → 0.20.7

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 (36) hide show
  1. package/dist/assets/{LpCommandPalette-Cp6Y-j7g.css → LpCommandPalette-C3LdDNHk.css} +4 -4
  2. package/dist/chunks/{LpAddressInput-CK6y3xZm.js → LpAddressInput-DaJ97mQ4.js} +1 -1
  3. package/dist/chunks/{LpAppShell-JWrWjNdC.js → LpAppShell-Ds3WkurD.js} +2 -2
  4. package/dist/chunks/{LpConfirmDialog-ClefCHIT.js → LpConfirmDialog-Cwqzbfgo.js} +1 -1
  5. package/dist/chunks/{LpDrawer-Dr1USsND.js → LpDrawer-DcxlpxJ7.js} +2 -2
  6. package/dist/chunks/{LpFileTree-DcoePIZq.js → LpFileTree-BGNzXknB.js} +1 -1
  7. package/dist/chunks/{LpLightbox-CzhFe9wZ.js → LpLightbox-Ci35Y_xP.js} +1 -1
  8. package/dist/chunks/{LpLogViewer-BDPbnCOU.js → LpLogViewer-DQod8kXW.js} +1 -1
  9. package/dist/chunks/{LpModal-BQvb6ekk.js → LpModal-2YEJI45Q.js} +2 -2
  10. package/dist/chunks/{LpNotificationBell-DDzQY0YA.js → LpNotificationBell-D1gdEtuI.js} +1 -1
  11. package/dist/chunks/{LpScrollArea-ZnycmmEI.js → LpScrollArea-CXy8dkTN.js} +29 -9
  12. package/dist/chunks/{LpSidebar-CC5759Mh.js → LpSidebar-B_UD_yUx.js} +2 -2
  13. package/dist/chunks/{LpSidebarNav-C0LjLp0O.js → LpSidebarNav-S1QPTGcg.js} +1 -1
  14. package/dist/chunks/{LpTable-CWS2V4JO.js → LpTable-pZmjnEti.js} +1 -1
  15. package/dist/components/LpAddressInput.vue.js +1 -1
  16. package/dist/components/LpAppShell.vue.js +1 -1
  17. package/dist/components/LpCommandPalette.vue.js +4 -4
  18. package/dist/components/LpConfirmDialog.vue.js +1 -1
  19. package/dist/components/LpDrawer.vue.js +1 -1
  20. package/dist/components/LpFileTree.vue.js +1 -1
  21. package/dist/components/LpLightbox.vue.js +1 -1
  22. package/dist/components/LpLogViewer.vue.js +1 -1
  23. package/dist/components/LpModal.vue.js +1 -1
  24. package/dist/components/LpNotificationBell.vue.js +1 -1
  25. package/dist/components/LpScrollArea.vue.js +1 -1
  26. package/dist/components/LpSidebar.vue.js +1 -1
  27. package/dist/components/LpSidebarNav.vue.js +1 -1
  28. package/dist/components/LpTable.vue.js +1 -1
  29. package/dist/index.js +12 -12
  30. package/package.json +1 -1
  31. package/src/components/LpCommandPalette.vue +1 -1
  32. package/src/components/LpDrawer.vue +1 -1
  33. package/src/components/LpLightbox.vue +1 -1
  34. package/src/components/LpModal.vue +1 -1
  35. package/src/components/LpScrollArea.vue +37 -10
  36. package/src/tokens/tokens.css +20 -0
@@ -1,16 +1,16 @@
1
1
 
2
2
  /* Each result eases in; honours reduced motion. */
3
- .lp-cmd-item[data-v-7fba2dd8] {
4
- animation: lp-cmd-in-7fba2dd8 140ms ease-out both;
3
+ .lp-cmd-item[data-v-75a17488] {
4
+ animation: lp-cmd-in-75a17488 140ms ease-out both;
5
5
  }
6
- @keyframes lp-cmd-in-7fba2dd8 {
6
+ @keyframes lp-cmd-in-75a17488 {
7
7
  from {
8
8
  opacity: 0;
9
9
  transform: translateY(3px);
10
10
  }
11
11
  }
12
12
  @media (prefers-reduced-motion: reduce) {
13
- .lp-cmd-item[data-v-7fba2dd8] {
13
+ .lp-cmd-item[data-v-75a17488] {
14
14
  animation: none;
15
15
  }
16
16
  }
@@ -6,7 +6,7 @@ import { _ as _sfc_main$3 } from "./LpButton-5VXXCjwF.js";
6
6
  import { _ as _sfc_main$1 } from "./LpFormField-Bn-ZwC6z.js";
7
7
  import { _ as _sfc_main$4 } from "./LpIcon-CCnX5_2j.js";
8
8
  import { _ as _sfc_main$5 } from "./LpInput-BauZRyzm.js";
9
- import { _ as _sfc_main$7 } from "./LpModal-BQvb6ekk.js";
9
+ import { _ as _sfc_main$7 } from "./LpModal-2YEJI45Q.js";
10
10
  import { _ as _sfc_main$6 } from "./LpSelect-D5mU4cZO.js";
11
11
  const _hoisted_1 = { class: "flex flex-col gap-3" };
12
12
  const _hoisted_2 = { class: "flex items-stretch gap-2" };
@@ -1,8 +1,8 @@
1
1
  import { defineComponent, computed, watch, openBlock, createElementBlock, createVNode, createSlots, withCtx, renderSlot, normalizeProps, guardReactiveProps, createElementVNode, normalizeClass, toDisplayString, createCommentVNode, createBlock } from "vue";
2
2
  import { _ as _sfc_main$2 } from "./LpButton-5VXXCjwF.js";
3
3
  import { _ as _sfc_main$3 } from "./LpIcon-CCnX5_2j.js";
4
- import { _ as _sfc_main$4 } from "./LpScrollArea-ZnycmmEI.js";
5
- import { _ as _sfc_main$1 } from "./LpSidebar-CC5759Mh.js";
4
+ import { _ as _sfc_main$4 } from "./LpScrollArea-CXy8dkTN.js";
5
+ import { _ as _sfc_main$1 } from "./LpSidebar-B_UD_yUx.js";
6
6
  const _hoisted_1 = { class: "flex h-dvh overflow-hidden bg-surface text-ink" };
7
7
  const _hoisted_2 = { class: "flex min-w-0 flex-1 flex-col" };
8
8
  const _hoisted_3 = { class: "flex h-16 shrink-0 items-center gap-3 border-b border-line bg-surface px-4 md:px-6" };
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, openBlock, createBlock, withCtx, renderSlot, createVNode, createTextVNode, toDisplayString } from "vue";
2
2
  import { _ as _sfc_main$2 } from "./LpButton-5VXXCjwF.js";
3
- import { _ as _sfc_main$1 } from "./LpModal-BQvb6ekk.js";
3
+ import { _ as _sfc_main$1 } from "./LpModal-2YEJI45Q.js";
4
4
  const _sfc_main = /* @__PURE__ */ defineComponent({
5
5
  __name: "LpConfirmDialog",
6
6
  props: {
@@ -3,7 +3,7 @@ import { usePointerSwipe } from "@vueuse/core";
3
3
  import { DrawerRoot, DrawerPortal, DrawerOverlay, DrawerContent, DrawerHandle, DrawerTitle, DrawerDescription, DrawerClose } from "vaul-vue";
4
4
  import { CLOSE_ICON } from "../components/dropdown.js";
5
5
  import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
6
- import { _ as _sfc_main$2 } from "./LpScrollArea-ZnycmmEI.js";
6
+ import { _ as _sfc_main$2 } from "./LpScrollArea-CXy8dkTN.js";
7
7
  const _hoisted_1 = { class: "text-base font-semibold text-ink" };
8
8
  const _hoisted_2 = { class: "flex flex-col gap-1" };
9
9
  const _hoisted_3 = ["data-vaul-no-drag"];
@@ -215,7 +215,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
215
215
  default: withCtx(() => [
216
216
  createVNode(unref(DrawerPortal), null, {
217
217
  default: withCtx(() => [
218
- createVNode(unref(DrawerOverlay), { class: "lp-scrim fixed inset-0 z-(--z-overlay) backdrop-blur-sm data-[state=open]:animate-[fade-in_150ms_ease] data-[state=closed]:animate-[fade-out_130ms_ease]" }),
218
+ createVNode(unref(DrawerOverlay), { class: "lp-scrim fixed inset-0 z-(--z-overlay) data-[state=open]:animate-[fade-in_150ms_ease] data-[state=closed]:animate-[fade-out_130ms_ease]" }),
219
219
  createVNode(unref(DrawerContent), {
220
220
  class: normalizeClass(contentClass.value),
221
221
  style: normalizeStyle(sizeStyle.value),
@@ -2,7 +2,7 @@ import { defineComponent, ref, watch, computed, openBlock, createElementBlock, F
2
2
  import { formatSize, sortNodes, computeStats, subtreeIds, ancestorIds } from "../components/fileTree.js";
3
3
  import { _ as _sfc_main$1 } from "./LpEmptyState-CrfyRJUG.js";
4
4
  import { _ as _sfc_main$3 } from "./LpFileTreeNode-DFg4PhOK.js";
5
- import { _ as _sfc_main$2 } from "./LpScrollArea-ZnycmmEI.js";
5
+ import { _ as _sfc_main$2 } from "./LpScrollArea-CXy8dkTN.js";
6
6
  const _hoisted_1 = {
7
7
  key: 0,
8
8
  class: "flex h-full w-full min-w-0 flex-col gap-1 overflow-hidden"
@@ -210,7 +210,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
210
210
  default: withCtx(() => [
211
211
  createVNode(unref(DialogPortal), null, {
212
212
  default: withCtx(() => [
213
- createVNode(unref(DialogOverlay), { class: "lp-scrim fixed inset-0 z-(--z-lightbox-overlay) backdrop-blur-sm data-[state=open]:animate-[fade-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[fade-out_120ms_ease]" }),
213
+ createVNode(unref(DialogOverlay), { class: "lp-scrim lp-scrim--deep fixed inset-0 z-(--z-lightbox-overlay) data-[state=open]:animate-[fade-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[fade-out_120ms_ease]" }),
214
214
  createVNode(unref(DialogContent), {
215
215
  class: "fixed inset-0 z-(--z-lightbox) flex flex-col outline-none data-[state=open]:animate-[lightbox-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[lightbox-out_140ms_cubic-bezier(0.4,0,1,1)] motion-reduce:animate-none",
216
216
  onKeydown
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, computed, ref, watch, nextTick, onMounted, onBeforeUnmount, openBlock, createElementBlock, createVNode, normalizeStyle, withCtx, createElementVNode, toDisplayString, createCommentVNode, Fragment, createBlock, resolveDynamicComponent, TransitionGroup, mergeProps, renderList, normalizeClass, createTextVNode, Transition } from "vue";
2
2
  import { _ as _sfc_main$3 } from "./LpContextMenu-D0mzXqA7.js";
3
3
  import { _ as _sfc_main$2 } from "./LpIcon-CCnX5_2j.js";
4
- import { _ as _sfc_main$1 } from "./LpScrollArea-ZnycmmEI.js";
4
+ import { _ as _sfc_main$1 } from "./LpScrollArea-CXy8dkTN.js";
5
5
  const _hoisted_1 = { class: "relative overflow-hidden rounded-card border border-line bg-surface font-mono text-xs leading-relaxed" };
6
6
  const _hoisted_2 = {
7
7
  key: 0,
@@ -2,7 +2,7 @@ import { defineComponent, computed, useSlots, ref, watch, onBeforeUnmount, openB
2
2
  import { DialogRoot, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose } from "reka-ui";
3
3
  import { CLOSE_ICON } from "../components/dropdown.js";
4
4
  import { _ as _sfc_main$1 } from "./LpIcon-CCnX5_2j.js";
5
- import { _ as _sfc_main$2 } from "./LpScrollArea-ZnycmmEI.js";
5
+ import { _ as _sfc_main$2 } from "./LpScrollArea-CXy8dkTN.js";
6
6
  const _hoisted_1 = { class: "fixed inset-0 z-(--z-modal) flex items-center justify-center pointer-events-none" };
7
7
  const _hoisted_2 = {
8
8
  key: 0,
@@ -135,7 +135,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
135
135
  default: withCtx(() => [
136
136
  createVNode(unref(DialogPortal), null, {
137
137
  default: withCtx(() => [
138
- createVNode(unref(DialogOverlay), { class: "lp-scrim fixed inset-0 z-(--z-overlay) backdrop-blur-sm data-[state=open]:animate-[fade-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[fade-out_120ms_ease]" }),
138
+ createVNode(unref(DialogOverlay), { class: "lp-scrim fixed inset-0 z-(--z-overlay) data-[state=open]:animate-[fade-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[fade-out_120ms_ease]" }),
139
139
  createElementVNode("div", _hoisted_1, [
140
140
  createVNode(unref(DialogContent), mergeProps({
141
141
  ref_key: "panelRef",
@@ -5,7 +5,7 @@ import { _ as _sfc_main$4 } from "./LpContextMenu-D0mzXqA7.js";
5
5
  import { _ as _sfc_main$2 } from "./LpEmptyState-CrfyRJUG.js";
6
6
  import { _ as _sfc_main$5 } from "./LpIcon-CCnX5_2j.js";
7
7
  import { _ as _sfc_main$1 } from "./LpPopover-8268UmlC.js";
8
- import { _ as _sfc_main$3 } from "./LpScrollArea-ZnycmmEI.js";
8
+ import { _ as _sfc_main$3 } from "./LpScrollArea-CXy8dkTN.js";
9
9
  const _hoisted_1 = { class: "flex items-center justify-between gap-2 px-3 py-2.5" };
10
10
  const _hoisted_2 = { class: "text-sm font-semibold" };
11
11
  const _hoisted_3 = {
@@ -35,21 +35,41 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
35
35
  if (props.fade) measureEdges(event.target);
36
36
  emit("scroll", event);
37
37
  }
38
- let edgeObserver;
38
+ let edgeResize;
39
+ let edgeMutation;
40
+ function stopEdgeWatch() {
41
+ edgeResize?.disconnect();
42
+ edgeMutation?.disconnect();
43
+ edgeResize = void 0;
44
+ edgeMutation = void 0;
45
+ }
39
46
  watch(
40
47
  [viewportEl, () => props.fade],
41
48
  ([el, enabled]) => {
42
- edgeObserver?.disconnect();
43
- edgeObserver = void 0;
44
- if (!el || !enabled || typeof ResizeObserver === "undefined") return;
45
- measureEdges(el);
46
- edgeObserver = new ResizeObserver(() => measureEdges(el));
47
- edgeObserver.observe(el);
48
- for (const child of Array.from(el.children)) edgeObserver.observe(child);
49
+ stopEdgeWatch();
50
+ if (!el || !enabled) return;
51
+ const remeasure = () => measureEdges(el);
52
+ remeasure();
53
+ if (typeof ResizeObserver !== "undefined") {
54
+ edgeResize = new ResizeObserver(remeasure);
55
+ edgeResize.observe(el);
56
+ for (const child of Array.from(el.children)) edgeResize.observe(child);
57
+ }
58
+ if (typeof MutationObserver !== "undefined") {
59
+ edgeMutation = new MutationObserver(() => {
60
+ if (edgeResize) {
61
+ edgeResize.disconnect();
62
+ edgeResize.observe(el);
63
+ for (const child of Array.from(el.children)) edgeResize.observe(child);
64
+ }
65
+ remeasure();
66
+ });
67
+ edgeMutation.observe(el, { childList: true, subtree: true });
68
+ }
49
69
  },
50
70
  { immediate: true, flush: "post" }
51
71
  );
52
- onBeforeUnmount(() => edgeObserver?.disconnect());
72
+ onBeforeUnmount(stopEdgeWatch);
53
73
  function onThumbPointerDown() {
54
74
  dragging.value = true;
55
75
  const stop = () => {
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, useId, openBlock, createElementBlock, Fragment, createElementVNode, mergeProps, normalizeClass, renderSlot, createCommentVNode, createVNode, createSlots, withCtx, normalizeProps, guardReactiveProps, createBlock } from "vue";
2
- import { _ as _sfc_main$2 } from "./LpDrawer-Dr1USsND.js";
3
- import { _ as _sfc_main$1 } from "./LpSidebarNav-C0LjLp0O.js";
2
+ import { _ as _sfc_main$2 } from "./LpDrawer-DcxlpxJ7.js";
3
+ import { _ as _sfc_main$1 } from "./LpSidebarNav-S1QPTGcg.js";
4
4
  const _hoisted_1 = {
5
5
  key: 1,
6
6
  class: "mt-2 flex shrink-0 flex-col gap-2"
@@ -4,7 +4,7 @@ import { usePillTransition } from "../composables/usePillTransition.js";
4
4
  import { _ as _sfc_main$4 } from "./LpBadge-CXzBPnwO.js";
5
5
  import { _ as _sfc_main$2 } from "./LpContextMenu-D0mzXqA7.js";
6
6
  import { _ as _sfc_main$3 } from "./LpIcon-CCnX5_2j.js";
7
- import { _ as _sfc_main$1 } from "./LpScrollArea-ZnycmmEI.js";
7
+ import { _ as _sfc_main$1 } from "./LpScrollArea-CXy8dkTN.js";
8
8
  const _hoisted_1 = {
9
9
  key: 0,
10
10
  class: "flex min-h-0 flex-1 flex-col gap-4"
@@ -2,7 +2,7 @@ import { defineComponent, computed, ref, watch, onBeforeUnmount, openBlock, crea
2
2
  import { _ as _sfc_main$2 } from "./LpCheckbox-BO0zuuPh.js";
3
3
  import { _ as _sfc_main$4 } from "./LpContextMenu-D0mzXqA7.js";
4
4
  import { _ as _sfc_main$3 } from "./LpIcon-CCnX5_2j.js";
5
- import { _ as _sfc_main$1 } from "./LpScrollArea-ZnycmmEI.js";
5
+ import { _ as _sfc_main$1 } from "./LpScrollArea-CXy8dkTN.js";
6
6
  const _hoisted_1 = { class: "w-full border-collapse text-sm" };
7
7
  const _hoisted_2 = { class: "border-b border-line bg-surface-soft" };
8
8
  const _hoisted_3 = {
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpAddressInput-CK6y3xZm.js";
1
+ import { _ as _sfc_main } from "../chunks/LpAddressInput-DaJ97mQ4.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpAppShell-JWrWjNdC.js";
1
+ import { _ as _sfc_main } from "../chunks/LpAppShell-Ds3WkurD.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,8 +1,8 @@
1
1
  import { defineComponent, ref, computed, watch, nextTick, onMounted, onBeforeUnmount, openBlock, createBlock, unref, withCtx, createVNode, withModifiers, createTextVNode, createElementVNode, withDirectives, withKeys, vModelText, createElementBlock, toDisplayString, createCommentVNode, Fragment, renderList, normalizeClass } from "vue";
2
2
  import { DialogRoot, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription } from "reka-ui";
3
3
  import { _ as _sfc_main$1 } from "../chunks/LpIcon-CCnX5_2j.js";
4
- import { _ as _sfc_main$2 } from "../chunks/LpScrollArea-ZnycmmEI.js";
5
- import '../assets/LpCommandPalette-Cp6Y-j7g.css';const _hoisted_1 = { class: "flex shrink-0 items-center gap-2.5 border-b border-line px-4" };
4
+ import { _ as _sfc_main$2 } from "../chunks/LpScrollArea-CXy8dkTN.js";
5
+ import '../assets/LpCommandPalette-C3LdDNHk.css';const _hoisted_1 = { class: "flex shrink-0 items-center gap-2.5 border-b border-line px-4" };
6
6
  const _hoisted_2 = ["placeholder", "onKeydown"];
7
7
  const _hoisted_3 = {
8
8
  key: 0,
@@ -167,7 +167,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
167
167
  default: withCtx(() => [
168
168
  createVNode(unref(DialogPortal), null, {
169
169
  default: withCtx(() => [
170
- createVNode(unref(DialogOverlay), { class: "lp-scrim fixed inset-0 z-(--z-overlay) backdrop-blur-sm data-[state=open]:animate-[fade-in_150ms_ease] data-[state=closed]:animate-[fade-out_130ms_ease]" }),
170
+ createVNode(unref(DialogOverlay), { class: "lp-scrim fixed inset-0 z-(--z-overlay) data-[state=open]:animate-[fade-in_150ms_ease] data-[state=closed]:animate-[fade-out_130ms_ease]" }),
171
171
  createVNode(unref(DialogContent), {
172
172
  class: "fixed left-1/2 top-[12vh] z-(--z-modal) flex max-h-[76vh] w-[min(92vw,40rem)] -translate-x-1/2 flex-col overflow-hidden rounded-card border border-line bg-surface-raised shadow-panel outline-none data-[state=open]:animate-[pop-in_160ms_var(--ease-emphasized)] data-[state=closed]:animate-[pop-out_130ms_ease]",
173
173
  onOpenAutoFocus: _cache[1] || (_cache[1] = withModifiers(() => {
@@ -304,7 +304,7 @@ const _export_sfc = (sfc, props) => {
304
304
  }
305
305
  return target;
306
306
  };
307
- const LpCommandPalette = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-7fba2dd8"]]);
307
+ const LpCommandPalette = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-75a17488"]]);
308
308
  export {
309
309
  LpCommandPalette as default
310
310
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpConfirmDialog-ClefCHIT.js";
1
+ import { _ as _sfc_main } from "../chunks/LpConfirmDialog-Cwqzbfgo.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpDrawer-Dr1USsND.js";
1
+ import { _ as _sfc_main } from "../chunks/LpDrawer-DcxlpxJ7.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpFileTree-DcoePIZq.js";
1
+ import { _ as _sfc_main } from "../chunks/LpFileTree-BGNzXknB.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpLightbox-CzhFe9wZ.js";
1
+ import { _ as _sfc_main } from "../chunks/LpLightbox-Ci35Y_xP.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpLogViewer-BDPbnCOU.js";
1
+ import { _ as _sfc_main } from "../chunks/LpLogViewer-DQod8kXW.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpModal-BQvb6ekk.js";
1
+ import { _ as _sfc_main } from "../chunks/LpModal-2YEJI45Q.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpNotificationBell-DDzQY0YA.js";
1
+ import { _ as _sfc_main } from "../chunks/LpNotificationBell-D1gdEtuI.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpScrollArea-ZnycmmEI.js";
1
+ import { _ as _sfc_main } from "../chunks/LpScrollArea-CXy8dkTN.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSidebar-CC5759Mh.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSidebar-B_UD_yUx.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSidebarNav-C0LjLp0O.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSidebarNav-S1QPTGcg.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpTable-CWS2V4JO.js";
1
+ import { _ as _sfc_main } from "../chunks/LpTable-pZmjnEti.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { _ } from "./chunks/LayoutCanvas-Dd20boUG.js";
2
- import { _ as _2 } from "./chunks/LpAddressInput-CK6y3xZm.js";
2
+ import { _ as _2 } from "./chunks/LpAddressInput-DaJ97mQ4.js";
3
3
  import { _ as _3 } from "./chunks/LpMapPicker-DFKrd1Ne.js";
4
4
  import { OSM_TILES, createNominatimProvider, emptyAddress, formatAddress, project, tileUrl, unproject } from "./components/address.js";
5
5
  import { _ as _4 } from "./chunks/LpAlert-BAYHDSS1.js";
6
- import { _ as _5 } from "./chunks/LpAppShell-JWrWjNdC.js";
6
+ import { _ as _5 } from "./chunks/LpAppShell-Ds3WkurD.js";
7
7
  import { _ as _6 } from "./chunks/LpAutocomplete-DIgXmtCA.js";
8
8
  import { _ as _7 } from "./chunks/LpAvatar-B1Ez0ZAx.js";
9
9
  import { _ as _8 } from "./chunks/LpBadge-CXzBPnwO.js";
@@ -14,26 +14,26 @@ import { _ as _12 } from "./chunks/LpCard-BmrTvWOe.js";
14
14
  import { _ as _13 } from "./chunks/LpCheckbox-BO0zuuPh.js";
15
15
  import { _ as _14 } from "./chunks/LpCodeBlock-CSiOSPs8.js";
16
16
  import { default as default2 } from "./components/LpCommandPalette.vue.js";
17
- import { _ as _15 } from "./chunks/LpConfirmDialog-ClefCHIT.js";
17
+ import { _ as _15 } from "./chunks/LpConfirmDialog-Cwqzbfgo.js";
18
18
  import { _ as _16 } from "./chunks/LpContextMenu-D0mzXqA7.js";
19
19
  import { _ as _17 } from "./chunks/LpDatePicker-dY2q4dr4.js";
20
20
  import { _ as _18 } from "./chunks/LpDisclosure-DP6yfgfM.js";
21
21
  import { _ as _19 } from "./chunks/LpDivider-CUX46KR0.js";
22
- import { _ as _20 } from "./chunks/LpDrawer-Dr1USsND.js";
22
+ import { _ as _20 } from "./chunks/LpDrawer-DcxlpxJ7.js";
23
23
  import { _ as _21 } from "./chunks/LpDropdownMenu-DJpoqRCb.js";
24
24
  import { _ as _22 } from "./chunks/LpEmptyState-CrfyRJUG.js";
25
- import { _ as _23 } from "./chunks/LpFileTree-DcoePIZq.js";
25
+ import { _ as _23 } from "./chunks/LpFileTree-BGNzXknB.js";
26
26
  import { ancestorIds, checkStateOf, checkedCount, computeStats, fileIcon, formatModified, formatSize, sortNodes, subtreeIds, subtreeSize } from "./components/fileTree.js";
27
27
  import { _ as _24 } from "./chunks/LpFormField-Bn-ZwC6z.js";
28
28
  import { _ as _25 } from "./chunks/LpIcon-CCnX5_2j.js";
29
29
  import { _ as _26 } from "./chunks/LpInfraNode-C_PHcthC.js";
30
30
  import { _ as _27 } from "./chunks/LpInput-BauZRyzm.js";
31
- import { _ as _28 } from "./chunks/LpLightbox-CzhFe9wZ.js";
31
+ import { _ as _28 } from "./chunks/LpLightbox-Ci35Y_xP.js";
32
32
  import { fileNameOf } from "./components/lightbox.js";
33
33
  import { _ as _29 } from "./chunks/LpLink-DHwOEp4e.js";
34
- import { _ as _30 } from "./chunks/LpLogViewer-BDPbnCOU.js";
35
- import { _ as _31 } from "./chunks/LpModal-BQvb6ekk.js";
36
- import { _ as _32 } from "./chunks/LpNotificationBell-DDzQY0YA.js";
34
+ import { _ as _30 } from "./chunks/LpLogViewer-DQod8kXW.js";
35
+ import { _ as _31 } from "./chunks/LpModal-2YEJI45Q.js";
36
+ import { _ as _32 } from "./chunks/LpNotificationBell-D1gdEtuI.js";
37
37
  import { _ as _33 } from "./chunks/LpNumberField-C5ar-OwE.js";
38
38
  import { _ as _34 } from "./chunks/LpOtpInput-DqaT0Z75.js";
39
39
  import { _ as _35 } from "./chunks/LpPagination-CeGuNe_q.js";
@@ -44,17 +44,17 @@ import { _ as _38 } from "./chunks/LpPopover-8268UmlC.js";
44
44
  import { _ as _39 } from "./chunks/LpProgress-BhI0IbjC.js";
45
45
  import { _ as _40 } from "./chunks/LpRadio-CL-pI0_O.js";
46
46
  import { _ as _41 } from "./chunks/LpRadioGroup-B4yDTmi6.js";
47
- import { _ as _42 } from "./chunks/LpScrollArea-ZnycmmEI.js";
47
+ import { _ as _42 } from "./chunks/LpScrollArea-CXy8dkTN.js";
48
48
  import { _ as _43 } from "./chunks/LpSegmented-BmpanyAo.js";
49
49
  import { _ as _44 } from "./chunks/LpSelect-D5mU4cZO.js";
50
50
  import { _ as _45 } from "./chunks/LpServiceNode-Dc-Ut5RS.js";
51
- import { _ as _46 } from "./chunks/LpSidebar-CC5759Mh.js";
51
+ import { _ as _46 } from "./chunks/LpSidebar-B_UD_yUx.js";
52
52
  import { _ as _47 } from "./chunks/LpSkeleton-eSFIo4kD.js";
53
53
  import { _ as _48 } from "./chunks/LpSlider-B1SF3pRV.js";
54
54
  import { _ as _49 } from "./chunks/LpStat-CdbEFOvn.js";
55
55
  import { _ as _50 } from "./chunks/LpStepper-5dFTrW21.js";
56
56
  import { _ as _51 } from "./chunks/LpSwitch-v6fnccSM.js";
57
- import { _ as _52 } from "./chunks/LpTable-CWS2V4JO.js";
57
+ import { _ as _52 } from "./chunks/LpTable-pZmjnEti.js";
58
58
  import { _ as _53 } from "./chunks/LpTableOfContents-CjvxPMpU.js";
59
59
  import { _ as _54 } from "./chunks/LpTabs-D7aTVPOb.js";
60
60
  import { _ as _55 } from "./chunks/LpTextarea-CRAkhemZ.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.20.5",
3
+ "version": "0.20.7",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {
@@ -212,7 +212,7 @@ onBeforeUnmount(() => window.removeEventListener("keydown", onHotkey))
212
212
  <DialogRoot :open="open" @update:open="(v) => emit('update:open', v)">
213
213
  <DialogPortal>
214
214
  <DialogOverlay
215
- class="lp-scrim fixed inset-0 z-(--z-overlay) backdrop-blur-sm data-[state=open]:animate-[fade-in_150ms_ease] data-[state=closed]:animate-[fade-out_130ms_ease]"
215
+ class="lp-scrim fixed inset-0 z-(--z-overlay) data-[state=open]:animate-[fade-in_150ms_ease] data-[state=closed]:animate-[fade-out_130ms_ease]"
216
216
  />
217
217
  <DialogContent
218
218
  class="fixed left-1/2 top-[12vh] z-(--z-modal) flex max-h-[76vh] w-[min(92vw,40rem)] -translate-x-1/2 flex-col overflow-hidden rounded-card border border-line bg-surface-raised shadow-panel outline-none data-[state=open]:animate-[pop-in_160ms_var(--ease-emphasized)] data-[state=closed]:animate-[pop-out_130ms_ease]"
@@ -345,7 +345,7 @@ const edgeStripClass = computed(() =>
345
345
  >
346
346
  <DrawerPortal>
347
347
  <DrawerOverlay
348
- class="lp-scrim fixed inset-0 z-(--z-overlay) backdrop-blur-sm data-[state=open]:animate-[fade-in_150ms_ease] data-[state=closed]:animate-[fade-out_130ms_ease]"
348
+ class="lp-scrim fixed inset-0 z-(--z-overlay) data-[state=open]:animate-[fade-in_150ms_ease] data-[state=closed]:animate-[fade-out_130ms_ease]"
349
349
  />
350
350
  <DrawerContent
351
351
  :class="contentClass"
@@ -273,7 +273,7 @@ const ARROW =
273
273
  <!-- Sits on the lightbox rung, not the shared modal one: opening this
274
274
  from inside a dialog must cover that dialog, not tie with it. -->
275
275
  <DialogOverlay
276
- class="lp-scrim fixed inset-0 z-(--z-lightbox-overlay) backdrop-blur-sm data-[state=open]:animate-[fade-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[fade-out_120ms_ease]"
276
+ class="lp-scrim lp-scrim--deep fixed inset-0 z-(--z-lightbox-overlay) data-[state=open]:animate-[fade-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[fade-out_120ms_ease]"
277
277
  />
278
278
  <DialogContent
279
279
  class="fixed inset-0 z-(--z-lightbox) flex flex-col outline-none data-[state=open]:animate-[lightbox-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[lightbox-out_140ms_cubic-bezier(0.4,0,1,1)] motion-reduce:animate-none"
@@ -219,7 +219,7 @@ onBeforeUnmount(() => {
219
219
  <DialogRoot :open="open" @update:open="(v) => $emit('update:open', v)">
220
220
  <DialogPortal>
221
221
  <DialogOverlay
222
- class="lp-scrim fixed inset-0 z-(--z-overlay) backdrop-blur-sm data-[state=open]:animate-[fade-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[fade-out_120ms_ease]"
222
+ class="lp-scrim fixed inset-0 z-(--z-overlay) data-[state=open]:animate-[fade-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[fade-out_120ms_ease]"
223
223
  />
224
224
  <!-- Centred by a full-screen flex wrapper rather than by translating the
225
225
  panel off its own centre. With `top:50% / -translate-y-1/2` the panel
@@ -101,24 +101,51 @@ function onViewportScroll(event: Event) {
101
101
  // that fills in, a panel that resizes, or content short enough to need no fade
102
102
  // at all never fire a scroll event. Watched only when `fade` is on, since
103
103
  // nothing else here depends on the measurements.
104
- let edgeObserver: ResizeObserver | undefined
104
+ let edgeResize: ResizeObserver | undefined
105
+ let edgeMutation: MutationObserver | undefined
106
+
107
+ function stopEdgeWatch() {
108
+ edgeResize?.disconnect()
109
+ edgeMutation?.disconnect()
110
+ edgeResize = undefined
111
+ edgeMutation = undefined
112
+ }
105
113
 
106
114
  watch(
107
115
  [viewportEl, () => props.fade],
108
116
  ([el, enabled]) => {
109
- edgeObserver?.disconnect()
110
- edgeObserver = undefined
111
- if (!el || !enabled || typeof ResizeObserver === "undefined") return
112
- measureEdges(el)
113
- edgeObserver = new ResizeObserver(() => measureEdges(el))
114
- edgeObserver.observe(el)
115
- // The content box grows independently of the viewport's own size.
116
- for (const child of Array.from(el.children)) edgeObserver.observe(child)
117
+ stopEdgeWatch()
118
+ if (!el || !enabled) return
119
+
120
+ const remeasure = () => measureEdges(el)
121
+ remeasure()
122
+
123
+ if (typeof ResizeObserver !== "undefined") {
124
+ edgeResize = new ResizeObserver(remeasure)
125
+ edgeResize.observe(el)
126
+ // Watching the children too, since a grid that reflows into more rows
127
+ // grows the content box without the viewport's own size moving.
128
+ for (const child of Array.from(el.children)) edgeResize.observe(child)
129
+ }
130
+ // Rows arriving after the first paint are the common case — a list waiting
131
+ // on a query renders empty, and observing only the boxes that existed then
132
+ // left the fade off until something else happened to trigger a measure.
133
+ if (typeof MutationObserver !== "undefined") {
134
+ edgeMutation = new MutationObserver(() => {
135
+ if (edgeResize) {
136
+ edgeResize.disconnect()
137
+ edgeResize.observe(el)
138
+ for (const child of Array.from(el.children)) edgeResize.observe(child)
139
+ }
140
+ remeasure()
141
+ })
142
+ edgeMutation.observe(el, { childList: true, subtree: true })
143
+ }
117
144
  },
118
145
  { immediate: true, flush: "post" },
119
146
  )
120
147
 
121
- onBeforeUnmount(() => edgeObserver?.disconnect())
148
+ onBeforeUnmount(stopEdgeWatch)
122
149
 
123
150
  function onThumbPointerDown() {
124
151
  dragging.value = true
@@ -436,14 +436,34 @@
436
436
  */
437
437
  .lp-scrim {
438
438
  background-color: rgb(0 0 0 / var(--scrim-opacity, 0.5));
439
+ backdrop-filter: blur(var(--scrim-blur, 4px));
440
+ -webkit-backdrop-filter: blur(var(--scrim-blur, 4px));
439
441
  }
440
442
 
443
+ /*
444
+ * The blur lives here rather than on each overlay as a `backdrop-blur-*`
445
+ * utility: a utility sits outside this rule and the fallback below cannot
446
+ * unset it, so on WebKitGTK every scrim carried a filter that never painted
447
+ * while the engines that do paint it disagreed with the token. One owner for
448
+ * both halves keeps the two cases in step.
449
+ */
441
450
  :root[data-lp-no-backdrop] .lp-scrim {
442
451
  backdrop-filter: none;
443
452
  -webkit-backdrop-filter: none;
444
453
  --scrim-opacity: 0.62;
445
454
  }
446
455
 
456
+ /*
457
+ * A lightbox is the one scrim that hides a whole page behind a photo, and it is
458
+ * usually opened FROM a dialog — so it is the layer the mild shared tint serves
459
+ * worst: without the blur, the content behind stayed readable around the image.
460
+ * It gets its own value instead of raising the shared one, which would darken
461
+ * every stacked pair.
462
+ */
463
+ :root[data-lp-no-backdrop] .lp-scrim--deep {
464
+ --scrim-opacity: 0.78;
465
+ }
466
+
447
467
  /* The overlay gradient rides above the base fill but under the content. */
448
468
  .lp-skin-panel::before {
449
469
  content: "";