@leavepulse/ui 0.85.1 → 0.86.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 (39) hide show
  1. package/dist/assets/{LpTable-CCk0ZHo7.css → LpTable-ChCcmmtT.css} +19 -19
  2. package/dist/chunks/{LpCodeBlock-Dx0J9xlm.js → LpCodeBlock-kGT15Zou.js} +1 -1
  3. package/dist/chunks/{LpCodeDisplay-BlN7U8Z-.js → LpCodeDisplay-DlwzZo9o.js} +1 -1
  4. package/dist/chunks/{LpCopyButton-BrbvIVMG.js → LpCopyButton-TGoE43mE.js} +2 -2
  5. package/dist/chunks/{LpDataList-DhETPjzv.js → LpDataList-Due909Cy.js} +1 -1
  6. package/dist/chunks/{LpInspector-CqPgVXrm.js → LpInspector-BNxjuWMP.js} +1 -1
  7. package/dist/chunks/{LpLightbox-D7iJqdmH.js → LpLightbox-DVyiB4dw.js} +2 -2
  8. package/dist/chunks/{LpMediaGallery-D6DyJDvL.js → LpMediaGallery-OJemmbV7.js} +1 -1
  9. package/dist/chunks/{LpPaletteTheme-Bi6pD1GL.js → LpPaletteTheme-CWFz4H2D.js} +1 -1
  10. package/dist/chunks/{LpSecretField-_B2qPfk8.js → LpSecretField-Dp-c7wWc.js} +1 -1
  11. package/dist/chunks/{LpThemeStudio-C1xKiv8C.js → LpThemeStudio-RyI-SWiw.js} +1 -1
  12. package/dist/chunks/{LpThemeSwitcher-Dk4Bk6u1.js → LpThemeSwitcher-BZYJ0AXy.js} +1 -1
  13. package/dist/chunks/{LpToaster-C_CFWSys.js → LpToaster-YcLJFSsH.js} +1 -1
  14. package/dist/chunks/{LpTruncate-CBUKnr36.js → LpTruncate-DCZjfcE-.js} +1 -1
  15. package/dist/chunks/{LpVideoPlayer-koYKHKkC.js → LpVideoPlayer--87I5Kqu.js} +1 -1
  16. package/dist/components/LpCodeBlock.vue.js +1 -1
  17. package/dist/components/LpCodeDisplay.vue.js +1 -1
  18. package/dist/components/LpCopyButton.vue.js +1 -1
  19. package/dist/components/LpDataList.vue.js +1 -1
  20. package/dist/components/LpInspector.vue.js +1 -1
  21. package/dist/components/LpLightbox.vue.js +1 -1
  22. package/dist/components/LpMediaGallery.vue.js +1 -1
  23. package/dist/components/LpPaletteTheme.vue.js +1 -1
  24. package/dist/components/LpSecretField.vue.js +1 -1
  25. package/dist/components/LpTable.vue.d.ts +2 -0
  26. package/dist/components/LpTable.vue.js +45 -42
  27. package/dist/components/LpThemeStudio.vue.js +1 -1
  28. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  29. package/dist/components/LpToaster.vue.js +1 -1
  30. package/dist/components/LpTruncate.vue.js +1 -1
  31. package/dist/components/LpVideoPlayer.vue.js +1 -1
  32. package/dist/composables/useClipboard.d.ts +17 -3
  33. package/dist/composables/useClipboard.js +6 -2
  34. package/dist/index.js +14 -14
  35. package/package.json +1 -1
  36. package/src/components/LpCopyButton.vue +2 -2
  37. package/src/components/LpTable.vue +20 -9
  38. package/src/components/LpVideoPlayer.vue +1 -1
  39. package/src/composables/useClipboard.ts +18 -5
@@ -11,17 +11,17 @@
11
11
  * fade before closing the gap and the whole list lurches at the end instead of
12
12
  * gliding.
13
13
  */
14
- .lp-row-enter-active[data-v-48ad51fc],
15
- .lp-row-leave-active[data-v-48ad51fc] {
14
+ .lp-row-enter-active[data-v-f6e4fb45],
15
+ .lp-row-leave-active[data-v-f6e4fb45] {
16
16
  transition:
17
17
  opacity var(--duration-fast) var(--ease-emphasized),
18
18
  transform var(--duration-fast) var(--ease-emphasized);
19
19
  }
20
- .lp-row-move[data-v-48ad51fc] {
20
+ .lp-row-move[data-v-f6e4fb45] {
21
21
  transition: transform var(--duration-medium) var(--ease-emphasized);
22
22
  }
23
- .lp-row-enter-from[data-v-48ad51fc],
24
- .lp-row-leave-to[data-v-48ad51fc] {
23
+ .lp-row-enter-from[data-v-f6e4fb45],
24
+ .lp-row-leave-to[data-v-f6e4fb45] {
25
25
  opacity: 0;
26
26
  transform: translateX(-0.5rem);
27
27
  }
@@ -35,7 +35,7 @@
35
35
  * drops out of the table layout entirely. Nothing sits below this row to be
36
36
  * dragged around, so simply not animating its exit costs nothing.
37
37
  */
38
- .lp-row-empty.lp-row-leave-active[data-v-48ad51fc] {
38
+ .lp-row-empty.lp-row-leave-active[data-v-f6e4fb45] {
39
39
  display: none;
40
40
  }
41
41
 
@@ -54,7 +54,7 @@
54
54
  * once anything is selected. An earlier version collapsed the column to nothing
55
55
  * and floated the hover box over the first cell, where it sat on the text.
56
56
  */
57
- .lp-tick[data-v-48ad51fc] {
57
+ .lp-tick[data-v-f6e4fb45] {
58
58
  display: flex;
59
59
  align-items: center;
60
60
  max-width: 0;
@@ -66,17 +66,17 @@
66
66
  padding var(--duration-medium) var(--ease-emphasized),
67
67
  opacity var(--duration-fast) ease;
68
68
  }
69
- .lp-tick-open[data-v-48ad51fc] {
69
+ .lp-tick-open[data-v-f6e4fb45] {
70
70
  max-width: 3.25rem;
71
71
  padding-inline: 1rem;
72
72
  opacity: 1;
73
73
  }
74
- .lp-tick-hidden[data-v-48ad51fc],
75
- .lp-tick-cue[data-v-48ad51fc] {
74
+ .lp-tick-hidden[data-v-f6e4fb45],
75
+ .lp-tick-cue[data-v-f6e4fb45] {
76
76
  opacity: 0;
77
77
  }
78
- tr:hover .lp-tick-cue[data-v-48ad51fc],
79
- .lp-tick-cue[data-v-48ad51fc]:focus-within {
78
+ tr:hover .lp-tick-cue[data-v-f6e4fb45],
79
+ .lp-tick-cue[data-v-f6e4fb45]:focus-within {
80
80
  opacity: 1;
81
81
  }
82
82
 
@@ -84,24 +84,24 @@ tr:hover .lp-tick-cue[data-v-48ad51fc],
84
84
  turned down the rows change without animating rather than not changing. */
85
85
  /* Only where there is a hover to reveal it; a finger long-presses instead. */
86
86
  @media (hover: none) {
87
- tr:hover .lp-tick-cue[data-v-48ad51fc] {
87
+ tr:hover .lp-tick-cue[data-v-f6e4fb45] {
88
88
  opacity: 0;
89
89
  }
90
90
 
91
91
  /* Nor is there anything for the column's width to hold until then: on a
92
92
  touch screen it stays closed until a long press starts selecting, and
93
93
  eases open like the rest of the column. */
94
- .lp-tick-hidden[data-v-48ad51fc],
95
- .lp-tick-cue[data-v-48ad51fc] {
94
+ .lp-tick-hidden[data-v-f6e4fb45],
95
+ .lp-tick-cue[data-v-f6e4fb45] {
96
96
  max-width: 0;
97
97
  padding-inline: 0;
98
98
  }
99
99
  }
100
100
  @media (prefers-reduced-motion: reduce) {
101
- .lp-row-enter-active[data-v-48ad51fc],
102
- .lp-row-leave-active[data-v-48ad51fc],
103
- .lp-row-move[data-v-48ad51fc],
104
- .lp-tick[data-v-48ad51fc] {
101
+ .lp-row-enter-active[data-v-f6e4fb45],
102
+ .lp-row-leave-active[data-v-f6e4fb45],
103
+ .lp-row-move[data-v-f6e4fb45],
104
+ .lp-tick[data-v-f6e4fb45] {
105
105
  transition: none;
106
106
  }
107
107
  }
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, computed, reactive, watch, ref, openBlock, createElementBlock, mergeProps, unref, toDisplayString, createCommentVNode, createElementVNode, createVNode, createBlock, normalizeStyle, normalizeClass, Fragment, renderList, h } from "vue";
2
2
  import { tokenizeLines } from "../components/codeHighlight.js";
3
3
  import { useLabels } from "../composables/useLpConfig.js";
4
- import { _ as _sfc_main$2 } from "./LpCopyButton-BrbvIVMG.js";
4
+ import { _ as _sfc_main$2 } from "./LpCopyButton-TGoE43mE.js";
5
5
  import { _ as _sfc_main$1 } from "./LpIcon-DCGhNsCU.js";
6
6
  import { useMergedAttrs } from "../composables/useMergedClass.js";
7
7
  const _hoisted_1 = {
@@ -3,7 +3,7 @@ import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { useMergedAttrs } from "../composables/useMergedClass.js";
4
4
  import { useNow } from "../composables/useNow.js";
5
5
  import { _ as _sfc_main$6 } from "./LpCheckbox-DcXC2qd5.js";
6
- import { _ as _sfc_main$3 } from "./LpCopyButton-BrbvIVMG.js";
6
+ import { _ as _sfc_main$3 } from "./LpCopyButton-TGoE43mE.js";
7
7
  import { _ as _sfc_main$5 } from "./LpCountdown-DVl7vXI1.js";
8
8
  import { _ as _sfc_main$4 } from "./LpIcon-DCGhNsCU.js";
9
9
  import { _ as _sfc_main$1 } from "./LpRollingText-B54Pje7P.js";
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, ref, computed, useAttrs, openBlock, createElementBlock, Fragment, createVNode, withCtx, mergeProps, unref, createElementVNode, normalizeStyle, toDisplayString, createCommentVNode } from "vue";
2
- import { useClipboard } from "../composables/useClipboard.js";
2
+ import { COPY_LABELS, useClipboard } from "../composables/useClipboard.js";
3
3
  import { useLabels } from "../composables/useLpConfig.js";
4
4
  import { _ as _sfc_main$2 } from "./LpButton-DSHioIfD.js";
5
5
  import { _ as _sfc_main$3 } from "./LpIcon-DCGhNsCU.js";
@@ -32,7 +32,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
32
32
  const emit = __emit;
33
33
  const text = useLabels(
34
34
  "copyButton",
35
- { copy: "Copy", copied: "Copied", failed: "Couldn't copy" },
35
+ COPY_LABELS,
36
36
  () => props.labels
37
37
  );
38
38
  const { copy, copied: justCopied } = useClipboard();
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, useSlots, computed, openBlock, createElementBlock, mergeProps, unref, createVNode, TransitionGroup, normalizeClass, withCtx, Fragment, renderList, createElementVNode, renderSlot, createTextVNode, toDisplayString, createBlock, createCommentVNode } from "vue";
2
2
  import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { useMergedAttrs } from "../composables/useMergedClass.js";
4
- import { _ as _sfc_main$4 } from "./LpCopyButton-BrbvIVMG.js";
4
+ import { _ as _sfc_main$4 } from "./LpCopyButton-TGoE43mE.js";
5
5
  import { _ as _sfc_main$2 } from "./LpIcon-DCGhNsCU.js";
6
6
  import { _ as _sfc_main$3 } from "./LpRollingText-B54Pje7P.js";
7
7
  import { _ as _sfc_main$1 } from "./LpTooltip-Bz_rrq5S.js";
@@ -5,7 +5,7 @@ import { useLabels } from "../composables/useLpConfig.js";
5
5
  import { useMergedAttrs } from "../composables/useMergedClass.js";
6
6
  import { usePersisted } from "../composables/usePersisted.js";
7
7
  import { clamp } from "../composables/clamp.js";
8
- import { _ as _sfc_main$4 } from "./LpDataList-DhETPjzv.js";
8
+ import { _ as _sfc_main$4 } from "./LpDataList-Due909Cy.js";
9
9
  import { _ as _sfc_main$3 } from "./LpDisclosure-CsJ7nnFz.js";
10
10
  import "@iconify/vue";
11
11
  import "./icons-V0k93Puc.js";
@@ -6,10 +6,10 @@ import { useLabels } from "../composables/useLpConfig.js";
6
6
  import { useZoomPan } from "../composables/useZoomPan.js";
7
7
  import { clickLink } from "../components/exportData.js";
8
8
  import { isVideoItem, fileNameOf } from "../components/lightbox.js";
9
- import { _ as _sfc_main$2 } from "./LpCopyButton-BrbvIVMG.js";
9
+ import { _ as _sfc_main$2 } from "./LpCopyButton-TGoE43mE.js";
10
10
  import { _ as _sfc_main$1 } from "./LpIcon-DCGhNsCU.js";
11
11
  import { _ as _sfc_main$4 } from "./LpLoader-Bf1yZwaU.js";
12
- import { _ as _sfc_main$3 } from "./LpVideoPlayer-koYKHKkC.js";
12
+ import { _ as _sfc_main$3 } from "./LpVideoPlayer--87I5Kqu.js";
13
13
  import { _ as _sfc_main$5 } from "./VideoThumb-DL_QkAJY.js";
14
14
  import { useModalLayer } from "../components/modalDepth.js";
15
15
  import { inTextField } from "../composables/textEntry.js";
@@ -4,7 +4,7 @@ import { useMergedAttrs } from "../composables/useMergedClass.js";
4
4
  import { useLabels } from "../composables/useLpConfig.js";
5
5
  import { _ as _sfc_main$1 } from "./LpContextMenu-CUFZIQX2.js";
6
6
  import { _ as _sfc_main$3 } from "./LpIcon-DCGhNsCU.js";
7
- import { _ as _sfc_main$4 } from "./LpLightbox-D7iJqdmH.js";
7
+ import { _ as _sfc_main$4 } from "./LpLightbox-DVyiB4dw.js";
8
8
  import { _ as _sfc_main$2 } from "./VideoThumb-DL_QkAJY.js";
9
9
  const _hoisted_1 = { key: 0 };
10
10
  const _hoisted_2 = ["aria-label"];
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, ref, computed, openBlock, createElementBlock, createElementVNode, createVNode, withCtx, createTextVNode, toDisplayString, unref } from "vue";
2
2
  import { useLabels } from "../composables/useLpConfig.js";
3
3
  import { suppressPaletteDiscovery } from "../composables/usePaletteCommands.js";
4
- import { _ as _sfc_main$4 } from "./LpThemeStudio-C1xKiv8C.js";
4
+ import { _ as _sfc_main$4 } from "./LpThemeStudio-RyI-SWiw.js";
5
5
  import { _ as _sfc_main$2 } from "./LpThemeProvider-XK6ZeWAE.js";
6
6
  import { _ as _sfc_main$1 } from "./LpButton-DSHioIfD.js";
7
7
  import { _ as _sfc_main$3 } from "./LpInput-CKMblRtp.js";
@@ -8,7 +8,7 @@ import { useFieldControl } from "../composables/useField.js";
8
8
  import { mergeClass } from "../composables/useMergedClass.js";
9
9
  import { _ as _sfc_main$5 } from "./FieldWrapper-BDDw1F9H.js";
10
10
  import { _ as _sfc_main$3 } from "./LpButton-DSHioIfD.js";
11
- import { _ as _sfc_main$2 } from "./LpCopyButton-BrbvIVMG.js";
11
+ import { _ as _sfc_main$2 } from "./LpCopyButton-TGoE43mE.js";
12
12
  import { _ as _sfc_main$4 } from "./LpIcon-DCGhNsCU.js";
13
13
  import { _ as _sfc_main$1 } from "./LpPasswordInput-LaOXNYuV.js";
14
14
  import { _ as _sfc_main$6 } from "./LpShift-DAgS_d2x.js";
@@ -3,7 +3,7 @@ import { usePaletteTheme } from "../theme/palette.js";
3
3
  import { useLabels } from "../composables/useLpConfig.js";
4
4
  import { useThemeStudio, STUDIO_BRANDS, STUDIO_SYSTEM } from "../theme/studio.js";
5
5
  import { _ as _sfc_main$1 } from "./LpButton-DSHioIfD.js";
6
- import { _ as _sfc_main$7 } from "./LpCodeBlock-Dx0J9xlm.js";
6
+ import { _ as _sfc_main$7 } from "./LpCodeBlock-kGT15Zou.js";
7
7
  import { _ as _sfc_main$4 } from "./LpColorPicker-Cjna_Bio.js";
8
8
  import { _ as _sfc_main$2 } from "./LpIcon-DCGhNsCU.js";
9
9
  import { _ as _sfc_main$5 } from "./LpSegmented-CiaF9DUK.js";
@@ -11,7 +11,7 @@ import { _ as _sfc_main$1 } from "./LpContextMenu-CUFZIQX2.js";
11
11
  import { _ as _sfc_main$2 } from "./LpIcon-DCGhNsCU.js";
12
12
  import { _ as _sfc_main$4 } from "./LpRollingText-B54Pje7P.js";
13
13
  import { _ as _sfc_main$3 } from "./LpShift-DAgS_d2x.js";
14
- import { _ as _sfc_main$5 } from "./LpThemeStudio-C1xKiv8C.js";
14
+ import { _ as _sfc_main$5 } from "./LpThemeStudio-RyI-SWiw.js";
15
15
  const _hoisted_1 = ["aria-label", "title"];
16
16
  const _hoisted_2 = {
17
17
  key: 1,
@@ -4,7 +4,7 @@ import { prefersReducedMotion } from "../composables/easing.js";
4
4
  import { useLabels } from "../composables/useLpConfig.js";
5
5
  import { useToast } from "../composables/useToast.js";
6
6
  import { CLOSE_ICON } from "../components/dropdown.js";
7
- import { _ as _sfc_main$2 } from "./LpCopyButton-BrbvIVMG.js";
7
+ import { _ as _sfc_main$2 } from "./LpCopyButton-TGoE43mE.js";
8
8
  import { _ as _sfc_main$1 } from "./LpIcon-DCGhNsCU.js";
9
9
  import { toneLook } from "../components/tone.js";
10
10
  import { useView, viewDocument, usePortalTarget, viewWindow } from "../composables/useView.js";
@@ -2,7 +2,7 @@ import { defineComponent, ref, onMounted, watch, nextTick, computed, openBlock,
2
2
  import { nodeWindow } from "../composables/realm.js";
3
3
  import { useMergedAttrs } from "../composables/useMergedClass.js";
4
4
  import { useResizeObserver } from "../composables/useResizeObserver.js";
5
- import { _ as _sfc_main$2 } from "./LpCopyButton-BrbvIVMG.js";
5
+ import { _ as _sfc_main$2 } from "./LpCopyButton-TGoE43mE.js";
6
6
  import { _ as _sfc_main$1 } from "./LpTooltip-Bz_rrq5S.js";
7
7
  import { middleTruncate } from "../components/fieldText.js";
8
8
  const _hoisted_1 = ["tabindex"];
@@ -460,7 +460,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
460
460
  }, {
461
461
  default: withCtx(() => [
462
462
  createElementVNode("div", {
463
- class: normalizeClass(["@container", __props.fit && !fullscreen.value ? FRAME : ""]),
463
+ class: normalizeClass(["@container", fullscreen.value ? "w-full" : __props.fit ? FRAME : ""]),
464
464
  style: normalizeStyle(frameStyle.value),
465
465
  "data-lp-video-frame": ""
466
466
  }, [
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpCodeBlock-Dx0J9xlm.js";
1
+ import { _ as _sfc_main } from "../chunks/LpCodeBlock-kGT15Zou.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpCodeDisplay-BlN7U8Z-.js";
1
+ import { _ as _sfc_main } from "../chunks/LpCodeDisplay-DlwzZo9o.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpCopyButton-BrbvIVMG.js";
1
+ import { _ as _sfc_main } from "../chunks/LpCopyButton-TGoE43mE.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpDataList-DhETPjzv.js";
1
+ import { _ as _sfc_main } from "../chunks/LpDataList-Due909Cy.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpInspector-CqPgVXrm.js";
1
+ import { _ as _sfc_main } from "../chunks/LpInspector-BNxjuWMP.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpLightbox-D7iJqdmH.js";
1
+ import { _ as _sfc_main } from "../chunks/LpLightbox-DVyiB4dw.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpMediaGallery-D6DyJDvL.js";
1
+ import { _ as _sfc_main } from "../chunks/LpMediaGallery-OJemmbV7.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpPaletteTheme-Bi6pD1GL.js";
1
+ import { _ as _sfc_main } from "../chunks/LpPaletteTheme-CWFz4H2D.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSecretField-_B2qPfk8.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSecretField-Dp-c7wWc.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -377,6 +377,8 @@ declare const __VLS_export: <T extends Record<string, unknown>>(__VLS_props: Non
377
377
  value: unknown;
378
378
  openMenu: (event: Event) => void;
379
379
  }) => any) | undefined;
380
+ } & {
381
+ toolbar?: (props: {}) => any;
380
382
  } & {
381
383
  bulk?: (props: {
382
384
  selected: (string | number)[];
@@ -1,19 +1,19 @@
1
- import { defineComponent, computed, useAttrs, ref, shallowRef, watch, onMounted, onBeforeUnmount, useId, h, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, createTextVNode, toDisplayString, createCommentVNode, Fragment, renderList, createBlock, createElementVNode, Transition, renderSlot, mergeProps, normalizeStyle, withModifiers, TransitionGroup, unref, nextTick } from "vue";
1
+ import { defineComponent, computed, useAttrs, ref, shallowRef, watch, onMounted, useSlots, onBeforeUnmount, useId, h, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, renderSlot, createCommentVNode, Fragment, renderList, createBlock, createElementVNode, toDisplayString, createTextVNode, Transition, mergeProps, normalizeStyle, withModifiers, TransitionGroup, unref, nextTick } from "vue";
2
2
  import { usePaletteScope, suppressPaletteDiscovery, usePaletteCommands } from "../composables/usePaletteCommands.js";
3
3
  import { menuPaletteCommands } from "./commandPalette.js";
4
- import { _ as _sfc_main$1 } from "../chunks/LpDataList-DhETPjzv.js";
4
+ import { _ as _sfc_main$1 } from "../chunks/LpDataList-Due909Cy.js";
5
5
  import { _ as _sfc_main$9 } from "../chunks/LpCheckbox-DcXC2qd5.js";
6
6
  import { _ as _sfc_main$8 } from "../chunks/LpContextMenu-CUFZIQX2.js";
7
7
  import { _ as _sfc_main$e } from "../chunks/LpEditable-DCPdDDBb.js";
8
8
  import { _ as _sfc_main$d } from "../chunks/LpEmptyState-DT8U4R8L.js";
9
- import { _ as _sfc_main$5 } from "../chunks/LpBadge-RFp8uHFt.js";
10
- import { _ as _sfc_main$3 } from "../chunks/LpIcon-DCGhNsCU.js";
9
+ import { _ as _sfc_main$3 } from "../chunks/LpBadge-RFp8uHFt.js";
10
+ import { _ as _sfc_main$6 } from "../chunks/LpIcon-DCGhNsCU.js";
11
11
  import { _ as _sfc_main$c } from "../chunks/LpSkeleton-BB6XIV-w.js";
12
12
  import { _ as _sfc_main$f } from "../chunks/LpPagination-V1wEhu1K.js";
13
13
  import { _ as _sfc_main$a } from "../chunks/LpPopover-BQSuxtai.js";
14
14
  import { _ as _sfc_main$7 } from "../chunks/LpScrollArea-CqvwfZs2.js";
15
- import { _ as _sfc_main$6 } from "../chunks/LpRollingText-B54Pje7P.js";
16
- import { _ as _sfc_main$4 } from "../chunks/LpShift-DAgS_d2x.js";
15
+ import { _ as _sfc_main$4 } from "../chunks/LpRollingText-B54Pje7P.js";
16
+ import { _ as _sfc_main$2 } from "../chunks/LpShift-DAgS_d2x.js";
17
17
  import { _ as _sfc_main$b } from "../chunks/LpTableFilter-B_BFoBqS.js";
18
18
  import { useKitStorage } from "../composables/usePersisted.js";
19
19
  import { useAsyncTask } from "../composables/useAsyncTask.js";
@@ -27,21 +27,21 @@ import { orderPinned, pinOffsets, groupRows, rowWindow, presetHidden, sortByKeys
27
27
  import { devWarn } from "../composables/devWarn.js";
28
28
  import { startPointerDrag } from "../composables/pointerDrag.js";
29
29
  import { isHTMLElement, nodeWindow } from "../composables/realm.js";
30
- import { _ as _sfc_main$2 } from "../chunks/LpButton-DSHioIfD.js";
30
+ import { _ as _sfc_main$5 } from "../chunks/LpButton-DSHioIfD.js";
31
31
  import { toCsv, downloadFile, fileStem } from "./exportData.js";
32
32
  import { toHiddenSets, sameHidden, summarizeShown, parseTableState, mergeRestored, serializeTableState, fromHiddenSets } from "./tableFilter.js";
33
33
  import { resolveRowMenu } from "./tableRowMenu.js";
34
34
  import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
35
- import '../assets/LpTable-CCk0ZHo7.css';const _hoisted_1 = {
35
+ import '../assets/LpTable-ChCcmmtT.css';const _hoisted_1 = {
36
36
  key: 0,
37
- class: "flex justify-end"
37
+ class: "flex min-h-8 flex-wrap items-center gap-x-3 gap-y-2 pb-3 text-xs"
38
38
  };
39
39
  const _hoisted_2 = {
40
40
  key: 0,
41
- class: "flex min-h-8 items-center gap-x-3 pb-3 text-xs"
41
+ class: "flex min-w-0 flex-wrap items-center gap-2 text-sm"
42
42
  };
43
43
  const _hoisted_3 = {
44
- key: 0,
44
+ key: 1,
45
45
  class: "flex min-w-0 flex-1 flex-wrap items-center gap-1.5"
46
46
  };
47
47
  const _hoisted_4 = { class: "truncate" };
@@ -799,8 +799,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
799
799
  }
800
800
  return t.rowsTotal.replace("{total}", String(props.rows.length));
801
801
  });
802
+ const slots = useSlots();
802
803
  const showBar = computed(
803
- () => props.summary || !!props.selectable && props.selected.length > 0 || activeFilters.value.length > 0
804
+ () => props.summary || props.exportable || !!slots.toolbar || !!props.selectable && props.selected.length > 0 || activeFilters.value.length > 0
804
805
  );
805
806
  const filteredOut = computed(() => {
806
807
  if (busy.value || failed.value || displayRows.value.length) return false;
@@ -980,28 +981,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
980
981
  ref: frameEl,
981
982
  class: normalizeClass(["flex flex-col gap-3", rootClass.value])
982
983
  }, [
983
- __props.exportable ? (openBlock(), createElementBlock("div", _hoisted_1, [
984
- createVNode(_sfc_main$2, {
985
- variant: "ghost",
986
- size: "sm",
987
- onClick: _cache[0] || (_cache[0] = ($event) => exportCsv())
988
- }, {
989
- default: withCtx(() => [
990
- createVNode(_sfc_main$3, {
991
- name: "lucide:download",
992
- size: 14
993
- }),
994
- createTextVNode(" " + toDisplayString(text.value.exportCsv), 1)
995
- ]),
996
- _: 1
997
- })
998
- ])) : createCommentVNode("", true),
999
- createVNode(_sfc_main$4, { class: "-mb-3" }, {
984
+ createVNode(_sfc_main$2, { class: "-mb-3" }, {
1000
985
  default: withCtx(() => [
1001
- showBar.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
986
+ showBar.value ? (openBlock(), createElementBlock("div", _hoisted_1, [
987
+ _ctx.$slots.toolbar ? (openBlock(), createElementBlock("div", _hoisted_2, [
988
+ renderSlot(_ctx.$slots, "toolbar", {}, void 0, true)
989
+ ])) : createCommentVNode("", true),
1002
990
  activeFilters.value.length ? (openBlock(), createElementBlock("div", _hoisted_3, [
1003
991
  (openBlock(true), createElementBlock(Fragment, null, renderList(activeFilters.value, (f) => {
1004
- return openBlock(), createBlock(_sfc_main$5, {
992
+ return openBlock(), createBlock(_sfc_main$3, {
1005
993
  key: f.col.key,
1006
994
  tone: "brand",
1007
995
  removable: "",
@@ -1025,13 +1013,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1025
1013
  onClick: clearAllFilters
1026
1014
  }, toDisplayString(text.value.clearFilters), 1)) : createCommentVNode("", true)
1027
1015
  ])) : createCommentVNode("", true),
1028
- createVNode(_sfc_main$4, {
1016
+ createVNode(_sfc_main$2, {
1029
1017
  axis: "width",
1030
1018
  class: "ml-auto shrink-0"
1031
1019
  }, {
1032
1020
  default: withCtx(() => [
1033
1021
  createElementVNode("div", _hoisted_6, [
1034
- createVNode(_sfc_main$6, {
1022
+ createVNode(_sfc_main$4, {
1035
1023
  value: statusText.value,
1036
1024
  align: "end",
1037
1025
  class: normalizeClass(["tabular-nums", __props.selectable && __props.selected.length ? "font-medium text-ink" : ""]),
@@ -1057,7 +1045,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1057
1045
  createElementVNode("button", {
1058
1046
  type: "button",
1059
1047
  class: "rounded-control px-1.5 py-0.5 font-medium text-brand outline-none transition-colors duration-fast hover:bg-brand-soft focus-visible:ring-2 focus-visible:ring-ring",
1060
- onClick: _cache[1] || (_cache[1] = ($event) => emit("update:allMatching", true))
1048
+ onClick: _cache[0] || (_cache[0] = ($event) => emit("update:allMatching", true))
1061
1049
  }, toDisplayString(text.value.selectAllMatching.replace("{total}", String(total.value))), 1)
1062
1050
  ])) : createCommentVNode("", true)
1063
1051
  ]),
@@ -1076,7 +1064,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1076
1064
  ])) : createCommentVNode("", true)
1077
1065
  ]),
1078
1066
  _: 3
1079
- })
1067
+ }),
1068
+ __props.exportable ? (openBlock(), createBlock(_sfc_main$5, {
1069
+ key: 0,
1070
+ variant: "ghost",
1071
+ size: "sm",
1072
+ onClick: _cache[1] || (_cache[1] = ($event) => exportCsv())
1073
+ }, {
1074
+ default: withCtx(() => [
1075
+ createVNode(_sfc_main$6, {
1076
+ name: "lucide:download",
1077
+ size: 14
1078
+ }),
1079
+ createTextVNode(" " + toDisplayString(text.value.exportCsv), 1)
1080
+ ]),
1081
+ _: 1
1082
+ })) : createCommentVNode("", true)
1080
1083
  ])
1081
1084
  ]),
1082
1085
  _: 3
@@ -1158,7 +1161,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1158
1161
  onClick: ($event) => toggleSort(col, $event)
1159
1162
  }, [
1160
1163
  createTextVNode(toDisplayString(col.label) + " ", 1),
1161
- col.sortable ? (openBlock(), createBlock(_sfc_main$3, {
1164
+ col.sortable ? (openBlock(), createBlock(_sfc_main$6, {
1162
1165
  key: 0,
1163
1166
  name: sortIcon(col),
1164
1167
  size: 13,
@@ -1187,7 +1190,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1187
1190
  "aria-label": text.value.filterColumn.replace("{column}", col.label),
1188
1191
  "data-lp-filter": col.key
1189
1192
  }, [
1190
- createVNode(_sfc_main$3, {
1193
+ createVNode(_sfc_main$6, {
1191
1194
  name: hiddenValues.value[col.key]?.size ? "lucide:filter-x" : "lucide:filter",
1192
1195
  size: 12
1193
1196
  }, null, 8, ["name"])
@@ -1268,7 +1271,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1268
1271
  title: failed.value ? text.value.error : filteredOut.value ? text.value.noMatches : text.value.empty
1269
1272
  }, {
1270
1273
  default: withCtx(() => [
1271
- filteredOut.value ? (openBlock(), createBlock(_sfc_main$2, {
1274
+ filteredOut.value ? (openBlock(), createBlock(_sfc_main$5, {
1272
1275
  key: 0,
1273
1276
  variant: "outline",
1274
1277
  size: "sm",
@@ -1318,7 +1321,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1318
1321
  "aria-label": (entry.collapsed ? text.value.expandGroup : text.value.collapseGroup).replace("{label}", entry.label),
1319
1322
  onClick: ($event) => toggleGroup(entry.group)
1320
1323
  }, [
1321
- createVNode(_sfc_main$3, {
1324
+ createVNode(_sfc_main$6, {
1322
1325
  name: "lucide:chevron-right",
1323
1326
  size: 14,
1324
1327
  class: normalizeClass(["transition-transform duration-fast motion-reduce:transition-none", entry.collapsed ? "" : "rotate-90"])
@@ -1366,7 +1369,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1366
1369
  "aria-label": expandedKeys.value.has(keyFor(entry.row, entry.index)) ? text.value.collapseRow : text.value.expandRow,
1367
1370
  onClick: ($event) => toggleExpanded(keyFor(entry.row, entry.index))
1368
1371
  }, [
1369
- createVNode(_sfc_main$3, {
1372
+ createVNode(_sfc_main$6, {
1370
1373
  name: "lucide:chevron-right",
1371
1374
  size: 14,
1372
1375
  class: normalizeClass(["transition-transform duration-fast motion-reduce:transition-none", expandedKeys.value.has(keyFor(entry.row, entry.index)) ? "rotate-90" : ""])
@@ -1444,7 +1447,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1444
1447
  _: 3
1445
1448
  }, 16, ["style", "bar-inset-top"]),
1446
1449
  __props.load && total.value > __props.pageSize ? (openBlock(), createBlock(_sfc_main$f, {
1447
- key: 1,
1450
+ key: 0,
1448
1451
  page: page.value,
1449
1452
  "onUpdate:page": _cache[9] || (_cache[9] = ($event) => page.value = $event),
1450
1453
  total: total.value,
@@ -1455,7 +1458,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1455
1458
  };
1456
1459
  }
1457
1460
  });
1458
- const LpTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-48ad51fc"]]);
1461
+ const LpTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f6e4fb45"]]);
1459
1462
  export {
1460
1463
  LpTable as default
1461
1464
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpThemeStudio-C1xKiv8C.js";
1
+ import { _ as _sfc_main } from "../chunks/LpThemeStudio-RyI-SWiw.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpThemeSwitcher-Dk4Bk6u1.js";
1
+ import { _ as _sfc_main } from "../chunks/LpThemeSwitcher-BZYJ0AXy.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpToaster-C_CFWSys.js";
1
+ import { _ as _sfc_main } from "../chunks/LpToaster-YcLJFSsH.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpTruncate-CBUKnr36.js";
1
+ import { _ as _sfc_main } from "../chunks/LpTruncate-DCZjfcE-.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpVideoPlayer-koYKHKkC.js";
1
+ import { _ as _sfc_main } from "../chunks/LpVideoPlayer--87I5Kqu.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,16 +1,30 @@
1
+ /**
2
+ * The kit's words for copying, scope "copyButton": LpCopyButton's own text and
3
+ * what `toast: true` says. One set, so an app that translates the scope once
4
+ * has every copy in it speak the same language.
5
+ */
6
+ export declare const COPY_LABELS: {
7
+ copy: string;
8
+ copied: string;
9
+ failed: string;
10
+ };
1
11
  export interface CopyOptions {
2
12
  /**
3
13
  * Toast to raise on success. `false` (the default) stays silent, for callers
4
14
  * whose button already shows the tick and would otherwise say it twice.
15
+ * `true` says the kit's "Copied", in the app's language when its config
16
+ * translates the "copyButton" scope, so a menu item that copies does not
17
+ * have to bring its own word for it.
5
18
  */
6
- toast?: string | false;
19
+ toast?: string | boolean;
7
20
  /**
8
21
  * Toast to raise when the copy fails. Defaults to silence for the same
9
22
  * reason the kit's other best-effort paths are silent: a copy that didn't
10
23
  * happen is usually obvious, and a scary red box over a blocked clipboard
11
- * helps nobody. Pass a string where losing the copy actually costs something.
24
+ * helps nobody. Pass a string where losing the copy actually costs something,
25
+ * or `true` for the kit's own "Couldn't copy".
12
26
  */
13
- errorToast?: string | false;
27
+ errorToast?: string | boolean;
14
28
  }
15
29
  export interface UseClipboard {
16
30
  /**
@@ -1,4 +1,5 @@
1
1
  import { ref, onScopeDispose } from "vue";
2
+ import { useLabels } from "./useLpConfig.js";
2
3
  import { useToast } from "./useToast.js";
3
4
  async function writeAsync(text) {
4
5
  if (typeof navigator === "undefined" || !navigator.clipboard) return false;
@@ -44,9 +45,11 @@ async function writeBlob(blob) {
44
45
  }
45
46
  }
46
47
  const COPIED_MS = 1400;
48
+ const COPY_LABELS = { copy: "Copy", copied: "Copied", failed: "Couldn't copy" };
47
49
  function useClipboard() {
48
50
  const copied = ref(false);
49
51
  const { success, error } = useToast();
52
+ const labels = useLabels("copyButton", COPY_LABELS);
50
53
  let timer;
51
54
  async function copy(data, options = {}) {
52
55
  const { toast = false, errorToast = false } = options;
@@ -56,10 +59,10 @@ function useClipboard() {
56
59
  copied.value = true;
57
60
  clearTimeout(timer);
58
61
  timer = setTimeout(() => copied.value = false, COPIED_MS);
59
- if (toast) success(toast);
62
+ if (toast) success(toast === true ? labels.value.copied : toast);
60
63
  return true;
61
64
  } catch {
62
- if (errorToast) error(errorToast);
65
+ if (errorToast) error(errorToast === true ? labels.value.failed : errorToast);
63
66
  return false;
64
67
  }
65
68
  }
@@ -67,5 +70,6 @@ function useClipboard() {
67
70
  return { copied, copy };
68
71
  }
69
72
  export {
73
+ COPY_LABELS,
70
74
  useClipboard
71
75
  };
package/dist/index.js CHANGED
@@ -19,7 +19,7 @@ import { chartView, lttbIndices, minMaxBuckets, panRange, slotOf, sourceOf, zoom
19
19
  import { useChartSync } from "./composables/useChartSync.js";
20
20
  import { createLinkedView, linkChart, linkLog, linkPipeline, linkTable, linkTopology, provideLinkedView, useLinkedView } from "./composables/useLinkedView.js";
21
21
  import { _ as _14 } from "./chunks/LpCheckbox-DcXC2qd5.js";
22
- import { _ as _15 } from "./chunks/LpCodeBlock-Dx0J9xlm.js";
22
+ import { _ as _15 } from "./chunks/LpCodeBlock-kGT15Zou.js";
23
23
  import { tokenizeLines } from "./components/codeHighlight.js";
24
24
  import { _ as _16 } from "./chunks/LpColorPicker-Cjna_Bio.js";
25
25
  import { DEFAULT_SWATCHES, clampHsv, formatColor, hsvToHsl, hsvToRgb, isLight, normalizeHue, opaqueCss, parseColor, parseHex, rgbToHex, rgbToHsv } from "./components/color.js";
@@ -56,14 +56,14 @@ import { i, b, a, c } from "./chunks/icons-V0k93Puc.js";
56
56
  import { default as default10 } from "./components/LpImageEditor.vue.js";
57
57
  import { _ as _33 } from "./chunks/LpInfraNode-BsExhdPE.js";
58
58
  import { _ as _34 } from "./chunks/LpInput-CKMblRtp.js";
59
- import { _ as _35 } from "./chunks/LpLightbox-D7iJqdmH.js";
59
+ import { _ as _35 } from "./chunks/LpLightbox-DVyiB4dw.js";
60
60
  import { fileNameOf, isVideoItem } from "./components/lightbox.js";
61
61
  import { _ as _36 } from "./chunks/LpLink-Krkjhe_y.js";
62
62
  import { _ as _37 } from "./chunks/LpLogViewer-Bki-IdNC.js";
63
63
  import { _ as _38 } from "./chunks/LpLogInspector-Yj310k4n.js";
64
64
  import { compilePattern, findIds, messageShape, structuredPayload, timeMs } from "./components/logTools.js";
65
65
  import { countLevels, matchPositions, matchesTerm, ringWindow, stepMatch } from "./components/logSearch.js";
66
- import { _ as _39 } from "./chunks/LpMediaGallery-D6DyJDvL.js";
66
+ import { _ as _39 } from "./chunks/LpMediaGallery-OJemmbV7.js";
67
67
  import { _ as _40 } from "./chunks/LpModal-B5y9_LgA.js";
68
68
  import { _ as _41 } from "./chunks/LpModalNav-BLvDVl2-.js";
69
69
  import { _ as _42 } from "./chunks/LpNotificationBell-Bf0u3t5q.js";
@@ -103,7 +103,7 @@ import { formatClipTime, isNativeLoop, planLoop, seamProgress, seamReached } fro
103
103
  import { default as default12 } from "./components/LpVideoTrim.vue.js";
104
104
  import { _ as _72 } from "./chunks/LpVideoCompress-BfulQ8Rs.js";
105
105
  import { bitrateForHeight, canTranscodeVideo, estimateTranscodedBytes, probeVideo, transcodeVideo, transcodedName } from "./composables/videoTranscode.js";
106
- import { _ as _73 } from "./chunks/LpVideoPlayer-koYKHKkC.js";
106
+ import { _ as _73 } from "./chunks/LpVideoPlayer--87I5Kqu.js";
107
107
  import { useVideoMedia } from "./composables/useVideoMedia.js";
108
108
  import { dragEnd, normalizeRange as normalizeRange2, parseClipTime, setEnd } from "./components/videoTrim.js";
109
109
  import { _ as _74 } from "./chunks/LpSparkline-CExIRDb3.js";
@@ -121,9 +121,9 @@ import { _ as _79 } from "./chunks/LpBottomNav-BcJVkAhh.js";
121
121
  import { _ as _80 } from "./chunks/LpTagsInput-By7LMb47.js";
122
122
  import { addTags, splitTags } from "./components/tags.js";
123
123
  import { _ as _81 } from "./chunks/LpTextarea-Ck6RAfzu.js";
124
- import { _ as _82 } from "./chunks/LpThemeSwitcher-Dk4Bk6u1.js";
124
+ import { _ as _82 } from "./chunks/LpThemeSwitcher-BZYJ0AXy.js";
125
125
  import { _ as _83 } from "./chunks/LpTilt-B7KHX1zH.js";
126
- import { _ as _84 } from "./chunks/LpToaster-C_CFWSys.js";
126
+ import { _ as _84 } from "./chunks/LpToaster-YcLJFSsH.js";
127
127
  import { _ as _85 } from "./chunks/LpTooltip-Bz_rrq5S.js";
128
128
  import { _ as _86 } from "./chunks/LpTour-D_AN_SsZ.js";
129
129
  import { holeOf, openContextMenu, panelsAround } from "./components/tour.js";
@@ -139,7 +139,7 @@ import { blockTitle, defineBlocks } from "./layout/registry.js";
139
139
  import { layoutController, useLayout } from "./layout/useLayout.js";
140
140
  import { useWorkspaces } from "./layout/useWorkspaces.js";
141
141
  import { _ as _92 } from "./chunks/LpWorkspaceSwitcher-D50sHs9N.js";
142
- import { _ as _93 } from "./chunks/LpInspector-CqPgVXrm.js";
142
+ import { _ as _93 } from "./chunks/LpInspector-BNxjuWMP.js";
143
143
  import { _ as _94 } from "./chunks/LpWindow-Bo5qQgVY.js";
144
144
  import { WINDOW_DOCKS, clampRect, dockAt, dockedRect, isWindowRect, resizeRect, snapRect, useWindowLayer } from "./composables/windowing.js";
145
145
  import { THEME_COOKIE, applyTheme, applyThemeWithTransition, bootstrapTheme, cacheSystemThemes, normalizeTheme, parseTheme, prefersDarkScheme, revealTransition, serializeTheme, themeEntries, themeFromCookie, themeToCssRule, themeToCssVars, useTheme } from "./theme/useTheme.js";
@@ -188,7 +188,7 @@ import { useZoomPan } from "./composables/useZoomPan.js";
188
188
  import { useToast } from "./composables/useToast.js";
189
189
  import { _ as _95 } from "./chunks/LpThemeProvider-XK6ZeWAE.js";
190
190
  import { _ as _96 } from "./chunks/LpFrame-Bv5Fphte.js";
191
- import { _ as _97 } from "./chunks/LpThemeStudio-C1xKiv8C.js";
191
+ import { _ as _97 } from "./chunks/LpThemeStudio-RyI-SWiw.js";
192
192
  import { _ as _98 } from "./chunks/LpThemeStudioSection-B7bt8Iyg.js";
193
193
  import { isInternalHref, resolveLink } from "./components/link.js";
194
194
  import { _ as _99 } from "./chunks/LpRepeater-BKq5XPh4.js";
@@ -211,12 +211,12 @@ import { useLoadingGate } from "./composables/useLoadingGate.js";
211
211
  import { useNow } from "./composables/useNow.js";
212
212
  import { _ as _108 } from "./chunks/LpCountdown-DVl7vXI1.js";
213
213
  import { DEFAULT_MILESTONES, DEFAULT_UNIT_LABELS, ceilToSecond, crossedMilestone, formatElapsed, formatTime, msToNextSecond, splitTime, timeParts } from "./components/timeSpan.js";
214
- import { _ as _109 } from "./chunks/LpCopyButton-BrbvIVMG.js";
215
- import { _ as _110 } from "./chunks/LpSecretField-_B2qPfk8.js";
216
- import { _ as _111 } from "./chunks/LpDataList-DhETPjzv.js";
214
+ import { _ as _109 } from "./chunks/LpCopyButton-TGoE43mE.js";
215
+ import { _ as _110 } from "./chunks/LpSecretField-Dp-c7wWc.js";
216
+ import { _ as _111 } from "./chunks/LpDataList-Due909Cy.js";
217
217
  import { _ as _112 } from "./chunks/LpEditable-DCPdDDBb.js";
218
- import { _ as _113 } from "./chunks/LpTruncate-CBUKnr36.js";
219
- import { _ as _114 } from "./chunks/LpCodeDisplay-BlN7U8Z-.js";
218
+ import { _ as _113 } from "./chunks/LpTruncate-DCZjfcE-.js";
219
+ import { _ as _114 } from "./chunks/LpCodeDisplay-DlwzZo9o.js";
220
220
  import { formatRemaining, groupCode, middleTruncate, normalizeCode } from "./components/fieldText.js";
221
221
  import { _ as _115 } from "./chunks/LpHoverCard-CHE9jAJG.js";
222
222
  import { _ as _116 } from "./chunks/LpIdenticon-Dbbr4fvt.js";
@@ -246,7 +246,7 @@ import { _ as _128 } from "./chunks/LpCommandScope-DRUvHiX7.js";
246
246
  import { createPaletteRegistry, mergePaletteCommands, usePaletteCommands, vPalette } from "./composables/usePaletteCommands.js";
247
247
  import { commandShortcuts, commandToHotkey, commandToMenuItem, commandToPalette, useCommands } from "./composables/useCommands.js";
248
248
  import { usePaletteTheme } from "./theme/palette.js";
249
- import { _ as _129 } from "./chunks/LpPaletteTheme-Bi6pD1GL.js";
249
+ import { _ as _129 } from "./chunks/LpPaletteTheme-CWFz4H2D.js";
250
250
  const uk = {
251
251
  actionBar: { dismiss: "Закрити" },
252
252
  activityLine: { busy: "Завантаження" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.85.1",
3
+ "version": "0.86.0",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {
@@ -39,7 +39,7 @@ export type CopyValue =
39
39
  * `failed` state and the `error` event rather than as an exception.
40
40
  */
41
41
  import { computed, ref, useAttrs } from "vue"
42
- import { useClipboard } from "../composables/useClipboard"
42
+ import { COPY_LABELS, useClipboard } from "../composables/useClipboard"
43
43
  import { useLabels } from "../composables/useLpConfig"
44
44
  import LpButton from "./LpButton.vue"
45
45
  import LpIcon from "./LpIcon.vue"
@@ -92,7 +92,7 @@ const emit = defineEmits<{
92
92
 
93
93
  const text = useLabels<CopyButtonLabels>(
94
94
  "copyButton",
95
- { copy: "Copy", copied: "Copied", failed: "Couldn't copy" },
95
+ COPY_LABELS,
96
96
  () => props.labels,
97
97
  )
98
98
 
@@ -5,7 +5,7 @@ export default { inheritAttrs: false }
5
5
  </script>
6
6
 
7
7
  <script setup lang="ts" generic="T extends Record<string, unknown>">
8
- import { computed, h, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, useAttrs, useId, watch } from "vue"
8
+ import { computed, h, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, useAttrs, useId, useSlots, watch } from "vue"
9
9
  import { suppressPaletteDiscovery, usePaletteCommands, usePaletteScope } from "../composables/usePaletteCommands"
10
10
  import { menuPaletteCommands } from "./commandPalette"
11
11
  import LpDataList from "./LpDataList.vue"
@@ -1383,8 +1383,14 @@ const countText = computed(() => {
1383
1383
  // As documented on `summary`: the bar shows on its own while filters are
1384
1384
  // active or rows are selected, not merely because rows can be selected, which
1385
1385
  // left a lone "75 rows" over every selectable table.
1386
+ const slots = useSlots()
1386
1387
  const showBar = computed(
1387
- () => props.summary || (!!props.selectable && props.selected.length > 0) || activeFilters.value.length > 0,
1388
+ () =>
1389
+ props.summary ||
1390
+ props.exportable ||
1391
+ !!slots.toolbar ||
1392
+ (!!props.selectable && props.selected.length > 0) ||
1393
+ activeFilters.value.length > 0,
1388
1394
  )
1389
1395
  const filteredOut = computed(() => {
1390
1396
  if (busy.value || failed.value || displayRows.value.length) return false
@@ -1606,12 +1612,6 @@ usePaletteCommands(() => {
1606
1612
  <!-- No top fade: a sticky header sits in the masked band and would be dimmed
1607
1613
  by it. The bottom edge is left crisp with it for symmetry. -->
1608
1614
  <div ref="frameEl" class="flex flex-col gap-3" :class="rootClass">
1609
- <div v-if="exportable" class="flex justify-end">
1610
- <LpButton variant="ghost" size="sm" @click="exportCsv()">
1611
- <LpIcon name="lucide:download" :size="14" />
1612
- {{ text.exportCsv }}
1613
- </LpButton>
1614
- </div>
1615
1615
  <!-- What the table is showing right now: the filters in force, each one
1616
1616
  a chip that clears it, the row count, and what is selected with room
1617
1617
  for the consumer's bulk actions. Eased in and out (LpShift), so the
@@ -1619,7 +1619,14 @@ usePaletteCommands(() => {
1619
1619
  <!-- The gap below the bar lives inside the eased box (pb-3), cancelled
1620
1620
  outside it (-mb-3): an empty box must not leave the root's gap behind. -->
1621
1621
  <LpShift class="-mb-3">
1622
- <div v-if="showBar" class="flex min-h-8 items-center gap-x-3 pb-3 text-xs">
1622
+ <!-- One line above the table: the page's own controls (#toolbar), the
1623
+ filters in force, then the status and Export at the end. Export used
1624
+ to sit on a line of its own and the page's search and filters on a
1625
+ third, so every table opened with two bands of mostly empty space. -->
1626
+ <div v-if="showBar" class="flex min-h-8 flex-wrap items-center gap-x-3 gap-y-2 pb-3 text-xs">
1627
+ <div v-if="$slots.toolbar" class="flex min-w-0 flex-wrap items-center gap-2 text-sm">
1628
+ <slot name="toolbar" />
1629
+ </div>
1623
1630
  <div v-if="activeFilters.length" class="flex min-w-0 flex-1 flex-wrap items-center gap-1.5">
1624
1631
  <LpBadge
1625
1632
  v-for="f in activeFilters"
@@ -1689,6 +1696,10 @@ usePaletteCommands(() => {
1689
1696
  <slot name="bulk" :selected="selected" :all-matching="allMatching" :clear="clearSelection" />
1690
1697
  </span>
1691
1698
  </Transition>
1699
+ <LpButton v-if="exportable" variant="ghost" size="sm" @click="exportCsv()">
1700
+ <LpIcon name="lucide:download" :size="14" />
1701
+ {{ text.exportCsv }}
1702
+ </LpButton>
1692
1703
  </div>
1693
1704
  </LpShift>
1694
1705
  </div>
@@ -610,7 +610,7 @@ const frameStyle = computed(() => {
610
610
  <!-- The menu's trigger is a wrapper of its own: reka's as-child puts its ref on the element it wraps. -->
611
611
  <LpContextMenu :items="menu" :title="menuTitle" always>
612
612
  <!-- A size container, so the bar gives up what does not fit a narrow player (see the controls below). -->
613
- <div class="@container" :class="fit && !fullscreen ? FRAME : ''" :style="frameStyle" data-lp-video-frame>
613
+ <div class="@container" :class="fullscreen ? 'w-full' : fit ? FRAME : ''" :style="frameStyle" data-lp-video-frame>
614
614
  <div class="relative w-full" :class="fullscreen ? 'h-dvh' : ''" :style="fullscreen ? undefined : { aspectRatio: aspect }">
615
615
  <video
616
616
  ref="videoEl"
@@ -1,4 +1,5 @@
1
1
  import { onScopeDispose, ref } from "vue"
2
+ import { useLabels } from "./useLpConfig"
2
3
  import { useToast } from "./useToast"
3
4
 
4
5
  /*
@@ -90,19 +91,30 @@ async function writeBlob(blob: Blob): Promise<boolean> {
90
91
  /** How long `copied` stays true — long enough to read, short enough to not linger. */
91
92
  const COPIED_MS = 1400
92
93
 
94
+ /**
95
+ * The kit's words for copying, scope "copyButton": LpCopyButton's own text and
96
+ * what `toast: true` says. One set, so an app that translates the scope once
97
+ * has every copy in it speak the same language.
98
+ */
99
+ export const COPY_LABELS = { copy: "Copy", copied: "Copied", failed: "Couldn't copy" }
100
+
93
101
  export interface CopyOptions {
94
102
  /**
95
103
  * Toast to raise on success. `false` (the default) stays silent, for callers
96
104
  * whose button already shows the tick and would otherwise say it twice.
105
+ * `true` says the kit's "Copied", in the app's language when its config
106
+ * translates the "copyButton" scope, so a menu item that copies does not
107
+ * have to bring its own word for it.
97
108
  */
98
- toast?: string | false
109
+ toast?: string | boolean
99
110
  /**
100
111
  * Toast to raise when the copy fails. Defaults to silence for the same
101
112
  * reason the kit's other best-effort paths are silent: a copy that didn't
102
113
  * happen is usually obvious, and a scary red box over a blocked clipboard
103
- * helps nobody. Pass a string where losing the copy actually costs something.
114
+ * helps nobody. Pass a string where losing the copy actually costs something,
115
+ * or `true` for the kit's own "Couldn't copy".
104
116
  */
105
- errorToast?: string | false
117
+ errorToast?: string | boolean
106
118
  }
107
119
 
108
120
  export interface UseClipboard {
@@ -143,6 +155,7 @@ export interface UseClipboard {
143
155
  export function useClipboard(): UseClipboard {
144
156
  const copied = ref(false)
145
157
  const { success, error } = useToast()
158
+ const labels = useLabels("copyButton", COPY_LABELS)
146
159
  let timer: ReturnType<typeof setTimeout> | undefined
147
160
 
148
161
  async function copy(data: string | Blob, options: CopyOptions = {}): Promise<boolean> {
@@ -155,10 +168,10 @@ export function useClipboard(): UseClipboard {
155
168
  copied.value = true
156
169
  clearTimeout(timer)
157
170
  timer = setTimeout(() => (copied.value = false), COPIED_MS)
158
- if (toast) success(toast)
171
+ if (toast) success(toast === true ? labels.value.copied : toast)
159
172
  return true
160
173
  } catch {
161
- if (errorToast) error(errorToast)
174
+ if (errorToast) error(errorToast === true ? labels.value.failed : errorToast)
162
175
  return false
163
176
  }
164
177
  }