@leavepulse/ui 0.60.0 → 0.61.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 (62) hide show
  1. package/README.md +8 -0
  2. package/dist/assets/{LpTable-BZZf_rrt.css → LpTable-DpXyPzs8.css} +19 -19
  3. package/dist/chunks/{LpAddressInput-DD4zTN4P.js → LpAddressInput-CzdZguBo.js} +1 -1
  4. package/dist/chunks/{LpAppShell-Cv-Y9qNA.js → LpAppShell-BXMNDEpF.js} +1 -1
  5. package/dist/chunks/{LpAutocomplete-PnL2ntKl.js → LpAutocomplete-D9mY5Tqk.js} +101 -36
  6. package/dist/chunks/{LpAvatar-CwGs1JCQ.js → LpAvatar-K6MOMfgn.js} +1 -1
  7. package/dist/chunks/{LpCard-B2D0GIUU.js → LpCard-D9HVgX8Y.js} +1 -1
  8. package/dist/chunks/{LpColorPicker-CvBF8TeL.js → LpColorPicker-BO1ZTY51.js} +1 -1
  9. package/dist/chunks/{LpContextMenu-BnN1k7ga.js → LpContextMenu-Cv_F2iCG.js} +6 -3
  10. package/dist/chunks/{LpFileTree-DEqh2ySW.js → LpFileTree-DTwUj0L-.js} +1 -1
  11. package/dist/chunks/{LpFileTreeNode-DCZA7sQ-.js → LpFileTreeNode-D-XLPZ6T.js} +1 -1
  12. package/dist/chunks/{LpLogViewer-BuPe23sZ.js → LpLogViewer-D9UgNz2m.js} +1 -1
  13. package/dist/chunks/{LpModalNav-Cw7m-eks.js → LpModalNav-D4rmflQn.js} +1 -1
  14. package/dist/chunks/{LpNotificationBell-xH_JphpS.js → LpNotificationBell-CyylOlZR.js} +1 -1
  15. package/dist/chunks/{LpPie-BD5Lsh-2.js → LpPie-B2deu8CI.js} +1 -1
  16. package/dist/chunks/{LpSidebar-B3E_iViL.js → LpSidebar-D8tub3bt.js} +1 -1
  17. package/dist/chunks/{LpSidebarNav-32sAXNM-.js → LpSidebarNav-BBSRg34G.js} +1 -1
  18. package/dist/chunks/LpSwap-D82jiecV.js +38 -0
  19. package/dist/chunks/{LpThemeSwitcher-CeBG0e_D.js → LpThemeSwitcher-ZFFftBQn.js} +1 -1
  20. package/dist/chunks/{LpToaster-BcKs7vX7.js → LpToaster-D3OisETH.js} +1 -1
  21. package/dist/component-names.d.ts +1 -1
  22. package/dist/components/LpAddressInput.vue.js +1 -1
  23. package/dist/components/LpAppShell.vue.js +1 -1
  24. package/dist/components/LpAutocomplete.vue.d.ts +24 -0
  25. package/dist/components/LpAutocomplete.vue.js +1 -1
  26. package/dist/components/LpAvatar.vue.js +1 -1
  27. package/dist/components/LpCard.vue.js +1 -1
  28. package/dist/components/LpChart.vue.js +1 -1
  29. package/dist/components/LpColorPicker.vue.js +1 -1
  30. package/dist/components/LpCommandPalette.vue.js +1 -1
  31. package/dist/components/LpContextMenu.vue.js +1 -1
  32. package/dist/components/LpFileTree.vue.js +1 -1
  33. package/dist/components/LpFileTreeNode.vue.js +1 -1
  34. package/dist/components/LpLogViewer.vue.js +1 -1
  35. package/dist/components/LpModalNav.vue.js +1 -1
  36. package/dist/components/LpNotificationBell.vue.js +1 -1
  37. package/dist/components/LpPaletteHeader.vue.js +1 -1
  38. package/dist/components/LpPie.vue.js +1 -1
  39. package/dist/components/LpSidebar.vue.js +1 -1
  40. package/dist/components/LpSidebarNav.vue.js +1 -1
  41. package/dist/components/LpSwap.vue.d.ts +19 -0
  42. package/dist/components/LpSwap.vue.js +4 -0
  43. package/dist/components/LpTable.vue.js +5 -4
  44. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  45. package/dist/components/LpToaster.vue.js +1 -1
  46. package/dist/composables/useHintSystem.d.ts +2 -0
  47. package/dist/composables/useHintSystem.js +16 -4
  48. package/dist/composables/useToast.d.ts +13 -4
  49. package/dist/composables/useToast.js +13 -2
  50. package/dist/index.d.ts +3 -2
  51. package/dist/index.js +62 -60
  52. package/package.json +2 -1
  53. package/src/component-names.ts +1 -0
  54. package/src/components/LpAutocomplete.vue +110 -24
  55. package/src/components/LpContextMenu.vue +6 -3
  56. package/src/components/LpSwap.vue +45 -0
  57. package/src/components/LpTable.vue +1 -0
  58. package/src/components/LpToaster.vue +1 -1
  59. package/src/composables/useHintSystem.ts +26 -4
  60. package/src/composables/useToast.ts +32 -5
  61. package/src/index.ts +3 -1
  62. package/src/tokens/selection.css +20 -0
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpAvatar-CwGs1JCQ.js";
1
+ import { _ as _sfc_main } from "../chunks/LpAvatar-K6MOMfgn.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpCard-B2D0GIUU.js";
1
+ import { _ as _sfc_main } from "../chunks/LpCard-D9HVgX8Y.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -5,7 +5,7 @@ import { prefersReducedMotion, easeTravel } from "../composables/easing.js";
5
5
  import { usePillTransition } from "../composables/usePillTransition.js";
6
6
  import { useReveal } from "../composables/useReveal.js";
7
7
  import { normalise, pointCount, resolveLabels, extent, axisTicks, plotHeight, plotWidth, xAt, yAt, areaPath, linePath, barPath, markerIndex, chartSummary, niceScale, nearestIndex, formatTick } from "./chart.js";
8
- import { _ as _sfc_main$1 } from "../chunks/LpContextMenu-BnN1k7ga.js";
8
+ import { _ as _sfc_main$1 } from "../chunks/LpContextMenu-Cv_F2iCG.js";
9
9
  import { _ as _sfc_main$2 } from "../chunks/LpIcon-CTuDVTYv.js";
10
10
  import { _ as _sfc_main$3 } from "../chunks/LpShift-DXNsauQZ.js";
11
11
  import { useMergedAttrs } from "../composables/useMergedClass.js";
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpColorPicker-CvBF8TeL.js";
1
+ import { _ as _sfc_main } from "../chunks/LpColorPicker-BO1ZTY51.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, ref, useId, computed, shallowRef, watch, useSlots, onBeforeUnmount, nextTick, openBlock, createBlock, unref, withCtx, createVNode, normalizeStyle, normalizeClass, withModifiers, createTextVNode, toDisplayString, createElementVNode, createElementBlock, Fragment, renderList, createCommentVNode, withDirectives, withKeys, vModelText, resolveDynamicComponent, Transition, renderSlot } from "vue";
2
2
  import { DialogRoot, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription } from "reka-ui";
3
- import { _ as _sfc_main$3 } from "../chunks/LpAvatar-CwGs1JCQ.js";
3
+ import { _ as _sfc_main$3 } from "../chunks/LpAvatar-K6MOMfgn.js";
4
4
  import { _ as _sfc_main$1 } from "../chunks/LpIcon-CTuDVTYv.js";
5
5
  import { _ as _sfc_main$2 } from "../chunks/LpScrollArea-Hz3-JWUG.js";
6
6
  import { useAsyncTask } from "../composables/useAsyncTask.js";
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpContextMenu-BnN1k7ga.js";
1
+ import { _ as _sfc_main } from "../chunks/LpContextMenu-Cv_F2iCG.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpFileTree-DEqh2ySW.js";
1
+ import { _ as _sfc_main } from "../chunks/LpFileTree-DTwUj0L-.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpFileTreeNode-DCZA7sQ-.js";
1
+ import { _ as _sfc_main } from "../chunks/LpFileTreeNode-D-XLPZ6T.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpLogViewer-BuPe23sZ.js";
1
+ import { _ as _sfc_main } from "../chunks/LpLogViewer-D9UgNz2m.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpModalNav-Cw7m-eks.js";
1
+ import { _ as _sfc_main } from "../chunks/LpModalNav-D4rmflQn.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpNotificationBell-xH_JphpS.js";
1
+ import { _ as _sfc_main } from "../chunks/LpNotificationBell-CyylOlZR.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, computed, openBlock, createElementBlock, createElementVNode, renderSlot, createBlock, createVNode, createCommentVNode, toDisplayString } from "vue";
2
- import { _ as _sfc_main$1 } from "../chunks/LpAvatar-CwGs1JCQ.js";
2
+ import { _ as _sfc_main$1 } from "../chunks/LpAvatar-K6MOMfgn.js";
3
3
  import { _ as _sfc_main$2 } from "../chunks/LpIcon-CTuDVTYv.js";
4
4
  import { _ as _sfc_main$3 } from "../chunks/HighlightText-BvnYZkhi.js";
5
5
  import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpPie-BD5Lsh-2.js";
1
+ import { _ as _sfc_main } from "../chunks/LpPie-B2deu8CI.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSidebar-B3E_iViL.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSidebar-D8tub3bt.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSidebarNav-32sAXNM-.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSidebarNav-BBSRg34G.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -0,0 +1,19 @@
1
+ type __VLS_Props = {
2
+ /** Identity of the current content; a new value plays the swap. */
3
+ swapKey: string | number;
4
+ /** Turn the motion off (the content still swaps). */
5
+ disabled?: boolean;
6
+ };
7
+ declare var __VLS_14: {};
8
+ type __VLS_Slots = {} & {
9
+ default?: (props: typeof __VLS_14) => any;
10
+ };
11
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
12
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
15
+ type __VLS_WithSlots<T, S> = T & {
16
+ new (): {
17
+ $slots: S;
18
+ };
19
+ };
@@ -0,0 +1,4 @@
1
+ import { _ as _sfc_main } from "../chunks/LpSwap-D82jiecV.js";
2
+ export {
3
+ _sfc_main as default
4
+ };
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, useAttrs, ref, shallowRef, watch, onMounted, onBeforeUnmount, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, createTextVNode, toDisplayString, createCommentVNode, Fragment, renderList, createElementVNode, Transition, renderSlot, mergeProps, normalizeStyle, createBlock, TransitionGroup, unref, withModifiers, nextTick } from "vue";
2
2
  import { _ as _sfc_main$7 } from "../chunks/LpCheckbox-DV9W6T3H.js";
3
- import { _ as _sfc_main$6 } from "../chunks/LpContextMenu-BnN1k7ga.js";
3
+ import { _ as _sfc_main$6 } from "../chunks/LpContextMenu-Cv_F2iCG.js";
4
4
  import { _ as _sfc_main$2 } from "../chunks/LpIcon-CTuDVTYv.js";
5
5
  import { _ as _sfc_main$a } from "../chunks/LpPagination-BFl0I7tL.js";
6
6
  import { _ as _sfc_main$8 } from "../chunks/LpPopover-DCKeqiVn.js";
@@ -18,7 +18,7 @@ import { _ as _sfc_main$1 } from "../chunks/LpButton-CJSD7N0Z.js";
18
18
  import { toCsv, downloadFile, fileStem } from "./exportData.js";
19
19
  import { summarizeShown, parseTableState, serializeTableState, countValues } from "./tableFilter.js";
20
20
  import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
21
- import '../assets/LpTable-BZZf_rrt.css';const _hoisted_1 = {
21
+ import '../assets/LpTable-DpXyPzs8.css';const _hoisted_1 = {
22
22
  key: 0,
23
23
  class: "flex justify-end"
24
24
  };
@@ -53,7 +53,7 @@ const _hoisted_16 = {
53
53
  class: "lp-row-empty"
54
54
  };
55
55
  const _hoisted_17 = ["colspan"];
56
- const _hoisted_18 = ["onContextmenu", "data-paint-key", "onClick", "onPointerdown"];
56
+ const _hoisted_18 = ["onContextmenu", "data-paint-key", "data-lp-context-row", "onClick", "onPointerdown"];
57
57
  const _hoisted_19 = ["onPointerdown"];
58
58
  const __default__ = { inheritAttrs: false };
59
59
  const _sfc_main = /* @__PURE__ */ defineComponent({
@@ -899,6 +899,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
899
899
  class: ["group border-b border-line/60 outline-none transition-colors last:border-0 hover:bg-surface-soft/60 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring data-[active]:bg-surface-soft/40", selectedSet.value.has(keyFor(row, index)) ? "bg-brand-soft/40" : ""]
900
900
  }, { ref_for: true }, unref(roving).itemProps(String(keyFor(row, index))), {
901
901
  "data-paint-key": __props.selectable ? String(keyFor(row, index)) : void 0,
902
+ "data-lp-context-row": __props.rowMenu ? "" : void 0,
902
903
  onClick: ($event) => onRowClick(row, keyFor(row, index)),
903
904
  onPointerdown: ($event) => onRowPointerDown($event, keyFor(row, index)),
904
905
  onKeydown: onRowKeydown
@@ -957,7 +958,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
957
958
  };
958
959
  }
959
960
  });
960
- const LpTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-1d2375a8"]]);
961
+ const LpTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-a9d69d56"]]);
961
962
  export {
962
963
  LpTable as default
963
964
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpThemeSwitcher-CeBG0e_D.js";
1
+ import { _ as _sfc_main } from "../chunks/LpThemeSwitcher-ZFFftBQn.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpToaster-BcKs7vX7.js";
1
+ import { _ as _sfc_main } from "../chunks/LpToaster-D3OisETH.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -75,6 +75,8 @@ export declare const HINT_SIGNALS: {
75
75
  /** An item's actions were opened in the palette (Tab). */
76
76
  readonly paletteActions: "lp.palette-actions";
77
77
  };
78
+ /** The element a left click just landed on that also has a right-click menu (a table row rather than the table). */
79
+ export declare function noteContextTarget(el: Element): void;
78
80
  /** Right click instead of the "…" button. */
79
81
  export declare function contextMenuTip(text?: Partial<Pick<HintTip, "title" | "text"> & {
80
82
  stepText: string;
@@ -15,6 +15,20 @@ const HINT_SIGNALS = {
15
15
  /** An item's actions were opened in the palette (Tab). */
16
16
  paletteActions: "lp.palette-actions"
17
17
  };
18
+ let lastContextTarget = null;
19
+ function noteContextTarget(el) {
20
+ lastContextTarget = new WeakRef(el);
21
+ }
22
+ const onScreen = (el) => {
23
+ const box = el.getBoundingClientRect();
24
+ return el.isConnected && box.width > 0 && box.bottom > 0 && box.top < window.innerHeight;
25
+ };
26
+ function rightClickTarget() {
27
+ const last = lastContextTarget?.deref();
28
+ if (last && onScreen(last)) return last;
29
+ const visible = (selector) => [...document.querySelectorAll(selector)].find(onScreen) ?? null;
30
+ return visible("[data-lp-context-row]") ?? visible("main [data-lp-context-menu]") ?? visible("[data-lp-context-menu]");
31
+ }
18
32
  function contextMenuTip(text = {}) {
19
33
  return {
20
34
  id: "lp.tip.context-menu",
@@ -22,10 +36,7 @@ function contextMenuTip(text = {}) {
22
36
  text: text.text ?? "Rows and cards open their actions on right-click, even where no … button shows it.",
23
37
  when: (count) => count(HINT_SIGNALS.contextMenu) === 0 && (count(HINT_SIGNALS.menuButton) >= 5 || count(HINT_SIGNALS.contextTarget) >= 25),
24
38
  step: () => {
25
- const target = [...document.querySelectorAll("[data-lp-context-menu]")].find((el) => {
26
- const box = el.getBoundingClientRect();
27
- return box.width > 0 && box.bottom > 0 && box.top < window.innerHeight;
28
- });
39
+ const target = rightClickTarget();
29
40
  return target ? { target, title: text.title ?? "Right-click works here", text: text.stepText ?? "Right-click this to see what it can do.", try: true } : null;
30
41
  }
31
42
  };
@@ -413,6 +424,7 @@ export {
413
424
  hintKey,
414
425
  hintSummary,
415
426
  localHintStorage,
427
+ noteContextTarget,
416
428
  paletteTip,
417
429
  provideHintSystem,
418
430
  runningHintSystem,
@@ -19,6 +19,8 @@ export interface ToastItem {
19
19
  actions?: ToastAction[];
20
20
  /** Whole-toast click handler (UAProject-style clickable toast). */
21
21
  onClick?: () => void | Promise<void>;
22
+ /** Copied with the message, not shown: what a bug report needs (request, status, ids). */
23
+ details?: string;
22
24
  }
23
25
  export interface ToastOptions {
24
26
  /**
@@ -31,12 +33,19 @@ export interface ToastOptions {
31
33
  duration?: number;
32
34
  actions?: ToastAction[];
33
35
  onClick?: () => void | Promise<void>;
36
+ /** Copied with the message, not shown. An Error passed to `error()` brings its own `details`. */
37
+ details?: string;
38
+ /** The error behind a hand-written message ("Not saved: " + e.message): its `details` ride along. */
39
+ cause?: unknown;
34
40
  }
35
- declare function push(variant: ToastVariant, message: string, options?: ToastOptions): number;
41
+ export type ToastMessage = string | (Error & {
42
+ details?: string;
43
+ });
44
+ declare function push(variant: ToastVariant, input: ToastMessage, given?: ToastOptions): number;
36
45
  export interface ToastPromiseMessages<T> {
37
46
  loading: string;
38
47
  success: string | ((value: T) => string);
39
- error: string | ((error: unknown) => string);
48
+ error: string | ((error: unknown) => ToastMessage);
40
49
  }
41
50
  /**
42
51
  * One toast that follows a promise: a persistent "loading" toast that turns
@@ -50,8 +59,8 @@ export declare function useToast(): {
50
59
  toast: (message: string, o?: ToastOptions) => number;
51
60
  info: (message: string, o?: ToastOptions) => number;
52
61
  success: (message: string, o?: ToastOptions) => number;
53
- warning: (message: string, o?: ToastOptions) => number;
54
- error: (message: string, o?: ToastOptions) => number;
62
+ warning: (message: ToastMessage, o?: ToastOptions) => number;
63
+ error: (message: ToastMessage, o?: ToastOptions) => number;
55
64
  promise: typeof promise;
56
65
  /** Low-level push for bridges (e.g. @leavepulse/ui-sdk apiError). */
57
66
  push: typeof push;
@@ -1,11 +1,21 @@
1
1
  import { reactive } from "vue";
2
+ function detailsOf(source) {
3
+ const details = source?.details;
4
+ return typeof details === "string" && details ? details : void 0;
5
+ }
6
+ function split(message, options) {
7
+ const text = typeof message === "string" ? message : message.message;
8
+ const details = options.details ?? (typeof message === "string" ? void 0 : detailsOf(message)) ?? detailsOf(options.cause);
9
+ return [text, { ...options, details }];
10
+ }
2
11
  const DEFAULT_DURATION = 4500;
3
12
  const MAX_ACTIVE = 4;
4
13
  const STATE_KEY = /* @__PURE__ */ Symbol.for("@leavepulse/ui:toast-queue");
5
14
  const g = globalThis;
6
15
  const state = g[STATE_KEY] ??= { queue: reactive([]), nextId: 0 };
7
16
  const queue = state.queue;
8
- function push(variant, message, options = {}) {
17
+ function push(variant, input, given = {}) {
18
+ const [message, options] = split(input, given);
9
19
  if (typeof window === "undefined") return -1;
10
20
  const duration = options.duration ?? DEFAULT_DURATION;
11
21
  const fields = {
@@ -16,7 +26,8 @@ function push(variant, message, options = {}) {
16
26
  duration,
17
27
  dismissAt: duration > 0 ? Date.now() + duration : null,
18
28
  actions: options.actions,
19
- onClick: options.onClick
29
+ onClick: options.onClick,
30
+ details: options.details
20
31
  };
21
32
  const same = options.key === void 0 ? -1 : queue.findIndex((t) => t.key === options.key);
22
33
  const existing = queue[same];
package/dist/index.d.ts CHANGED
@@ -8,7 +8,7 @@ export type { ActionBarAction } from "./components/LpActionBar.vue";
8
8
  export { default as LpAlert } from "./components/LpAlert.vue";
9
9
  export { default as LpAppShell } from "./components/LpAppShell.vue";
10
10
  export { default as LpAutocomplete } from "./components/LpAutocomplete.vue";
11
- export type { AutocompleteOption } from "./components/LpAutocomplete.vue";
11
+ export type { AutocompleteOption, AutocompleteSelection } from "./components/LpAutocomplete.vue";
12
12
  export { default as LpAvatar } from "./components/LpAvatar.vue";
13
13
  export { default as LpBadge } from "./components/LpBadge.vue";
14
14
  export { default as LpBreadcrumbs } from "./components/LpBreadcrumbs.vue";
@@ -125,6 +125,7 @@ export type { SelectOption, SelectValue } from "./components/LpSelect.vue";
125
125
  export { default as LpServiceNode } from "./components/LpServiceNode.vue";
126
126
  export type { ServiceNodeData } from "./components/LpServiceNode.vue";
127
127
  export { default as LpShift } from "./components/LpShift.vue";
128
+ export { default as LpSwap } from "./components/LpSwap.vue";
128
129
  export { default as LpShortcutsDialog } from "./components/LpShortcutsDialog.vue";
129
130
  export { default as LpSidebar } from "./components/LpSidebar.vue";
130
131
  export type { SidebarItem, SidebarSection } from "./components/LpSidebar.vue";
@@ -237,7 +238,7 @@ export type { UseTilt, UseTiltOptions } from "./composables/useTilt";
237
238
  export { useZoomPan } from "./composables/useZoomPan";
238
239
  export type { UseZoomPan, UseZoomPanOptions } from "./composables/useZoomPan";
239
240
  export { useToast } from "./composables/useToast";
240
- export type { ToastAction, ToastItem, ToastOptions, ToastVariant, } from "./composables/useToast";
241
+ export type { ToastAction, ToastItem, ToastMessage, ToastOptions, ToastVariant, } from "./composables/useToast";
241
242
  export type { ToastPromiseMessages } from "./composables/useToast";
242
243
  export { cacheSystemThemes, normalizeTheme, prefersDarkScheme, themeEntries, } from "./theme/useTheme";
243
244
  export type { SystemThemes, UseTheme } from "./theme/useTheme";
package/dist/index.js CHANGED
@@ -1,24 +1,24 @@
1
1
  import { _ } from "./chunks/LayoutCanvas-t7LWFCEn.js";
2
- import { _ as _2 } from "./chunks/LpAddressInput-DD4zTN4P.js";
2
+ import { _ as _2 } from "./chunks/LpAddressInput-CzdZguBo.js";
3
3
  import { _ as _3 } from "./chunks/LpMapPicker-DybIlWnF.js";
4
4
  import { OSM_TILES, createNominatimProvider, emptyAddress, formatAddress, project, tileUrl, unproject } from "./components/address.js";
5
5
  import { _ as _4 } from "./chunks/LpActionBar-BsSp66S_.js";
6
6
  import { _ as _5 } from "./chunks/LpAlert--KLL4NLk.js";
7
- import { _ as _6 } from "./chunks/LpAppShell-Cv-Y9qNA.js";
8
- import { _ as _7 } from "./chunks/LpAutocomplete-PnL2ntKl.js";
9
- import { _ as _8 } from "./chunks/LpAvatar-CwGs1JCQ.js";
7
+ import { _ as _6 } from "./chunks/LpAppShell-BXMNDEpF.js";
8
+ import { _ as _7 } from "./chunks/LpAutocomplete-D9mY5Tqk.js";
9
+ import { _ as _8 } from "./chunks/LpAvatar-K6MOMfgn.js";
10
10
  import { _ as _9 } from "./chunks/LpBadge-Fe0D1bYx.js";
11
11
  import { _ as _10 } from "./chunks/LpBreadcrumbs-CndzPYiG.js";
12
12
  import { _ as _11 } from "./chunks/LpButton-CJSD7N0Z.js";
13
13
  import { _ as _12 } from "./chunks/LpCalendar-CXVDbb2M.js";
14
- import { _ as _13 } from "./chunks/LpCard-B2D0GIUU.js";
14
+ import { _ as _13 } from "./chunks/LpCard-D9HVgX8Y.js";
15
15
  import { default as default2 } from "./components/LpChart.vue.js";
16
16
  import { backgroundOf, csvField, downloadFile, fileStem, inlineSvg, resolveCssColor, svgToPng, toCsv } from "./components/exportData.js";
17
17
  import { CHART_PALETTE, axisTicks, chartSummary, formatTick, markerIndex, niceScale, resolveSlices } from "./components/chart.js";
18
18
  import { _ as _14 } from "./chunks/LpCheckbox-DV9W6T3H.js";
19
19
  import { _ as _15 } from "./chunks/LpCodeBlock-t6MLA3fb.js";
20
20
  import { tokenizeLines } from "./components/codeHighlight.js";
21
- import { _ as _16 } from "./chunks/LpColorPicker-CvBF8TeL.js";
21
+ import { _ as _16 } from "./chunks/LpColorPicker-BO1ZTY51.js";
22
22
  import { DEFAULT_SWATCHES, clampHsv, formatColor, hsvToHsl, hsvToRgb, isLight, normalizeHue, opaqueCss, parseColor, parseHex, rgbToHex, rgbToHsv } from "./components/color.js";
23
23
  import { default as default3 } from "./components/LpCommandPalette.vue.js";
24
24
  import { applyQueryFilters, highlightParts, parseCommandQuery, parsePaletteQuery, rankCommandItems } from "./components/commandSearch.js";
@@ -33,7 +33,7 @@ import { comboKeys, comboSteps } from "./components/keys.js";
33
33
  import { _ as _18 } from "./chunks/LpConfirmDialog-tkgyY3eu.js";
34
34
  import { _ as _19 } from "./chunks/LpConfirmHost-CoYIcUdl.js";
35
35
  import { confirm, useConfirm } from "./components/confirm.js";
36
- import { _ as _20 } from "./chunks/LpContextMenu-BnN1k7ga.js";
36
+ import { _ as _20 } from "./chunks/LpContextMenu-Cv_F2iCG.js";
37
37
  import { _ as _21 } from "./chunks/LpDatePicker-DxdrVNCG.js";
38
38
  import { _ as _22 } from "./chunks/LpDateRangePicker-DjeaqikC.js";
39
39
  import { _ as _23 } from "./chunks/LpRangeCalendar-COeOYF52.js";
@@ -44,7 +44,7 @@ import { _ as _26 } from "./chunks/LpDrawer-C97yoWmh.js";
44
44
  import { _ as _27 } from "./chunks/LpDropdownMenu-CbyYu4Rw.js";
45
45
  import { default as default9 } from "./components/LpDropzone.vue.js";
46
46
  import { _ as _28 } from "./chunks/LpEmptyState-CX8fdGSU.js";
47
- import { _ as _29 } from "./chunks/LpFileTree-DEqh2ySW.js";
47
+ import { _ as _29 } from "./chunks/LpFileTree-DTwUj0L-.js";
48
48
  import { ancestorIds, checkStateOf, checkedCount, computeStats, fileIcon, formatModified, formatSize, sortNodes, subtreeIds, subtreeSize } from "./components/fileTree.js";
49
49
  import { _ as _30 } from "./chunks/LpFieldNotice-B--RzKfj.js";
50
50
  import { _ as _31 } from "./chunks/LpFormField-DMPPL1jF.js";
@@ -56,19 +56,19 @@ import { _ as _34 } from "./chunks/LpInput-C7FHxzj2.js";
56
56
  import { _ as _35 } from "./chunks/LpLightbox-DiksFa4L.js";
57
57
  import { fileNameOf } from "./components/lightbox.js";
58
58
  import { _ as _36 } from "./chunks/LpLink-Krkjhe_y.js";
59
- import { _ as _37 } from "./chunks/LpLogViewer-BuPe23sZ.js";
59
+ import { _ as _37 } from "./chunks/LpLogViewer-D9UgNz2m.js";
60
60
  import { countLevels, matchPositions, matchesTerm, ringWindow, stepMatch } from "./components/logSearch.js";
61
61
  import { _ as _38 } from "./chunks/LpMediaGallery-Cic9UHsa.js";
62
62
  import { _ as _39 } from "./chunks/LpModal-QFfctZsj.js";
63
- import { _ as _40 } from "./chunks/LpModalNav-Cw7m-eks.js";
64
- import { _ as _41 } from "./chunks/LpNotificationBell-xH_JphpS.js";
63
+ import { _ as _40 } from "./chunks/LpModalNav-D4rmflQn.js";
64
+ import { _ as _41 } from "./chunks/LpNotificationBell-CyylOlZR.js";
65
65
  import { _ as _42 } from "./chunks/LpNumberField-BFSRVGkJ.js";
66
66
  import { _ as _43 } from "./chunks/LpTimeField-BTEt0kvL.js";
67
67
  import { _ as _44 } from "./chunks/LpNumberFlow-z4WPZcZu.js";
68
68
  import { _ as _45 } from "./chunks/LpOtpInput-PbeNJ5In.js";
69
69
  import { _ as _46 } from "./chunks/LpPagination-BFl0I7tL.js";
70
70
  import { _ as _47 } from "./chunks/LpPasswordInput-C1G4k_r0.js";
71
- import { _ as _48 } from "./chunks/LpPie-BD5Lsh-2.js";
71
+ import { _ as _48 } from "./chunks/LpPie-B2deu8CI.js";
72
72
  import { _ as _49 } from "./chunks/LpPhoneInput-CZrpVxla.js";
73
73
  import { filterCountries, flagEmoji, loadCountries, matchCountryByValue } from "./components/countries.js";
74
74
  import { _ as _50 } from "./chunks/LpPopover-DCKeqiVn.js";
@@ -82,36 +82,37 @@ import { _ as _57 } from "./chunks/LpSection-BAkbf0OK.js";
82
82
  import { _ as _58 } from "./chunks/LpSelect-C4OXN_q3.js";
83
83
  import { _ as _59 } from "./chunks/LpServiceNode-D8uJ8sGk.js";
84
84
  import { _ as _60 } from "./chunks/LpShift-DXNsauQZ.js";
85
+ import { _ as _61 } from "./chunks/LpSwap-D82jiecV.js";
85
86
  import { default as default11 } from "./components/LpShortcutsDialog.vue.js";
86
- import { _ as _61 } from "./chunks/LpSidebar-B3E_iViL.js";
87
- import { _ as _62 } from "./chunks/LpSkeleton-BB6XIV-w.js";
88
- import { _ as _63 } from "./chunks/LpSlider-Cuzmrd7p.js";
89
- import { _ as _64 } from "./chunks/LpRangeSlider-C1yF9-nP.js";
90
- import { _ as _65 } from "./chunks/LpVideoBackdrop-qWRYBOTQ.js";
87
+ import { _ as _62 } from "./chunks/LpSidebar-D8tub3bt.js";
88
+ import { _ as _63 } from "./chunks/LpSkeleton-BB6XIV-w.js";
89
+ import { _ as _64 } from "./chunks/LpSlider-Cuzmrd7p.js";
90
+ import { _ as _65 } from "./chunks/LpRangeSlider-C1yF9-nP.js";
91
+ import { _ as _66 } from "./chunks/LpVideoBackdrop-qWRYBOTQ.js";
91
92
  import { formatClipTime, isNativeLoop, planLoop, seamProgress, seamReached } from "./components/videoBackdrop.js";
92
- import { _ as _66 } from "./chunks/LpSparkline-CB80N8SJ.js";
93
- import { _ as _67 } from "./chunks/LpStat-oYk6V1LZ.js";
94
- import { _ as _68 } from "./chunks/LpStepper-YgHGzgfD.js";
95
- import { _ as _69 } from "./chunks/LpSwitch-DG2AhXIL.js";
93
+ import { _ as _67 } from "./chunks/LpSparkline-CB80N8SJ.js";
94
+ import { _ as _68 } from "./chunks/LpStat-oYk6V1LZ.js";
95
+ import { _ as _69 } from "./chunks/LpStepper-YgHGzgfD.js";
96
+ import { _ as _70 } from "./chunks/LpSwitch-DG2AhXIL.js";
96
97
  import { default as default12 } from "./components/LpTable.vue.js";
97
98
  import { compareValues } from "./components/tableSort.js";
98
- import { _ as _70 } from "./chunks/LpTableOfContents-DYuqkByy.js";
99
- import { _ as _71 } from "./chunks/LpTabs-00v3VQx4.js";
100
- import { _ as _72 } from "./chunks/LpTagsInput-Sc56iy_j.js";
99
+ import { _ as _71 } from "./chunks/LpTableOfContents-DYuqkByy.js";
100
+ import { _ as _72 } from "./chunks/LpTabs-00v3VQx4.js";
101
+ import { _ as _73 } from "./chunks/LpTagsInput-Sc56iy_j.js";
101
102
  import { addTags, splitTags } from "./components/tags.js";
102
- import { _ as _73 } from "./chunks/LpTextarea-CQZccQI3.js";
103
- import { _ as _74 } from "./chunks/LpThemeSwitcher-CeBG0e_D.js";
104
- import { _ as _75 } from "./chunks/LpTilt-B7KHX1zH.js";
105
- import { _ as _76 } from "./chunks/LpToaster-BcKs7vX7.js";
106
- import { _ as _77 } from "./chunks/LpTooltip-suFCM34F.js";
107
- import { _ as _78 } from "./chunks/LpTour-C29-1wha.js";
103
+ import { _ as _74 } from "./chunks/LpTextarea-CQZccQI3.js";
104
+ import { _ as _75 } from "./chunks/LpThemeSwitcher-ZFFftBQn.js";
105
+ import { _ as _76 } from "./chunks/LpTilt-B7KHX1zH.js";
106
+ import { _ as _77 } from "./chunks/LpToaster-D3OisETH.js";
107
+ import { _ as _78 } from "./chunks/LpTooltip-suFCM34F.js";
108
+ import { _ as _79 } from "./chunks/LpTour-C29-1wha.js";
108
109
  import { holeOf, openContextMenu, panelsAround } from "./components/tour.js";
109
- import { _ as _79 } from "./chunks/LpHintLayer-DsclGYcD.js";
110
- import { _ as _80 } from "./chunks/LpHints-BTpvisgP.js";
110
+ import { _ as _80 } from "./chunks/LpHintLayer-DsclGYcD.js";
111
+ import { _ as _81 } from "./chunks/LpHints-BTpvisgP.js";
111
112
  import { HINT_SIGNALS, contextMenuTip, createHintSystem, hintKey, hintSummary, localHintStorage, paletteTip, provideHintSystem, runningHintSystem, useHintSystem } from "./composables/useHintSystem.js";
112
- import { _ as _81 } from "./chunks/LpTooltipProvider-CftjV7Xc.js";
113
- import { _ as _82 } from "./chunks/LpTopologyCanvas-6ozNrQKh.js";
114
- import { _ as _83 } from "./chunks/LpUptimeBar-B4ltCfno.js";
113
+ import { _ as _82 } from "./chunks/LpTooltipProvider-CftjV7Xc.js";
114
+ import { _ as _83 } from "./chunks/LpTopologyCanvas-6ozNrQKh.js";
115
+ import { _ as _84 } from "./chunks/LpUptimeBar-B4ltCfno.js";
115
116
  import { deserializeLayout, serializeLayout } from "./layout/tree.js";
116
117
  import { addLeaf, addTab, countBlocks, countLeaves, makeLayout, moveLeaf, removeBlock, removeLeaf, reorderTab, resizeAt, setActiveTab } from "./layout/tree.js";
117
118
  import { blockTitle, defineBlocks } from "./layout/registry.js";
@@ -145,7 +146,7 @@ import { useShift } from "./composables/useShift.js";
145
146
  import { useTilt } from "./composables/useTilt.js";
146
147
  import { useZoomPan } from "./composables/useZoomPan.js";
147
148
  import { useToast } from "./composables/useToast.js";
148
- import { _ as _84 } from "./chunks/LpThemeProvider-CQ2jC9TA.js";
149
+ import { _ as _85 } from "./chunks/LpThemeProvider-CQ2jC9TA.js";
149
150
  import { isInternalHref, resolveLink } from "./components/link.js";
150
151
  function defineTheme(base, overrides = {}) {
151
152
  const src = typeof base === "string" ? presets[base] : base;
@@ -218,8 +219,8 @@ export {
218
219
  _30 as LpFieldNotice,
219
220
  _29 as LpFileTree,
220
221
  _31 as LpFormField,
221
- _79 as LpHintLayer,
222
- _80 as LpHints,
222
+ _80 as LpHintLayer,
223
+ _81 as LpHints,
223
224
  _32 as LpIcon,
224
225
  default10 as LpImageEditor,
225
226
  _33 as LpInfraNode,
@@ -250,7 +251,7 @@ export {
250
251
  _52 as LpRadio,
251
252
  _53 as LpRadioGroup,
252
253
  _23 as LpRangeCalendar,
253
- _64 as LpRangeSlider,
254
+ _65 as LpRangeSlider,
254
255
  _54 as LpRollingText,
255
256
  _55 as LpScrollArea,
256
257
  _57 as LpSection,
@@ -259,29 +260,30 @@ export {
259
260
  _59 as LpServiceNode,
260
261
  _60 as LpShift,
261
262
  default11 as LpShortcutsDialog,
262
- _61 as LpSidebar,
263
- _62 as LpSkeleton,
264
- _63 as LpSlider,
265
- _66 as LpSparkline,
266
- _67 as LpStat,
267
- _68 as LpStepper,
268
- _69 as LpSwitch,
263
+ _62 as LpSidebar,
264
+ _63 as LpSkeleton,
265
+ _64 as LpSlider,
266
+ _67 as LpSparkline,
267
+ _68 as LpStat,
268
+ _69 as LpStepper,
269
+ _61 as LpSwap,
270
+ _70 as LpSwitch,
269
271
  default12 as LpTable,
270
- _70 as LpTableOfContents,
271
- _71 as LpTabs,
272
- _72 as LpTagsInput,
273
- _73 as LpTextarea,
274
- _84 as LpThemeProvider,
275
- _74 as LpThemeSwitcher,
276
- _75 as LpTilt,
272
+ _71 as LpTableOfContents,
273
+ _72 as LpTabs,
274
+ _73 as LpTagsInput,
275
+ _74 as LpTextarea,
276
+ _85 as LpThemeProvider,
277
+ _75 as LpThemeSwitcher,
278
+ _76 as LpTilt,
277
279
  _43 as LpTimeField,
278
- _76 as LpToaster,
279
- _77 as LpTooltip,
280
- _81 as LpTooltipProvider,
281
- _82 as LpTopologyCanvas,
282
- _78 as LpTour,
283
- _83 as LpUptimeBar,
284
- _65 as LpVideoBackdrop,
280
+ _77 as LpToaster,
281
+ _78 as LpTooltip,
282
+ _82 as LpTooltipProvider,
283
+ _83 as LpTopologyCanvas,
284
+ _79 as LpTour,
285
+ _84 as LpUptimeBar,
286
+ _66 as LpVideoBackdrop,
285
287
  N as NO_BACKDROP_ATTR,
286
288
  OSM_TILES,
287
289
  T as THEME_COOKIE,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.60.0",
3
+ "version": "0.61.0",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {
@@ -30,6 +30,7 @@
30
30
  "./css": "./src/index.css",
31
31
  "./tokens.css": "./src/tokens/tokens.css",
32
32
  "./scrollbar.css": "./src/tokens/scrollbar.css",
33
+ "./selection.css": "./src/tokens/selection.css",
33
34
  "./canvas.css": "./src/canvas.css",
34
35
  "./package.json": "./package.json",
35
36
  "./dist/*.js": {
@@ -80,6 +80,7 @@ export const COMPONENT_NAMES = [
80
80
  "LpSparkline",
81
81
  "LpStat",
82
82
  "LpStepper",
83
+ "LpSwap",
83
84
  "LpSwitch",
84
85
  "LpTable",
85
86
  "LpTableOfContents",