@leavepulse/ui 0.40.1 → 0.42.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 (40) hide show
  1. package/dist/assets/{LpCommandPalette-DDGFwOom.css → LpCommandPalette-Esv0a-gS.css} +21 -21
  2. package/dist/assets/{LpShortcutsDialog-Cap_ALQM.css → LpShortcutsDialog-C6YoQ8_M.css} +7 -7
  3. package/dist/chunks/{LpAddressInput-H5NdhK6c.js → LpAddressInput-CMjaPQVw.js} +1 -1
  4. package/dist/chunks/{LpAppShell-BfqSA1ba.js → LpAppShell-Bcv6EhqU.js} +1 -1
  5. package/dist/chunks/{LpConfirmDialog-BBRnMkV4.js → LpConfirmDialog-BNAvOR24.js} +2 -2
  6. package/dist/chunks/{LpDrawer-B8vBnCWF.js → LpDrawer-DgaS2s2i.js} +6 -4
  7. package/dist/chunks/{LpModal-EyEdRuqF.js → LpModal-8bja5bWS.js} +5 -3
  8. package/dist/chunks/{LpModalNav-BrDtP7b_.js → LpModalNav-w9kfwHqO.js} +3 -3
  9. package/dist/chunks/{LpSidebar-DZ20iBxY.js → LpSidebar-DlTn5nXc.js} +1 -1
  10. package/dist/components/LpAddressInput.vue.js +1 -1
  11. package/dist/components/LpAppShell.vue.js +1 -1
  12. package/dist/components/LpCommandPalette.vue.d.ts +2 -1
  13. package/dist/components/LpCommandPalette.vue.js +140 -76
  14. package/dist/components/LpConfirmDialog.vue.d.ts +2 -1
  15. package/dist/components/LpConfirmDialog.vue.js +1 -1
  16. package/dist/components/LpDrawer.vue.d.ts +4 -2
  17. package/dist/components/LpDrawer.vue.js +1 -1
  18. package/dist/components/LpModal.vue.d.ts +2 -1
  19. package/dist/components/LpModal.vue.js +1 -1
  20. package/dist/components/LpModalNav.vue.d.ts +2 -1
  21. package/dist/components/LpModalNav.vue.js +1 -1
  22. package/dist/components/LpShortcutsDialog.vue.d.ts +8 -11
  23. package/dist/components/LpShortcutsDialog.vue.js +14 -9
  24. package/dist/components/LpSidebar.vue.js +1 -1
  25. package/dist/composables/useGlass.d.ts +9 -0
  26. package/dist/composables/useGlass.js +13 -0
  27. package/dist/composables/useHotkeys.d.ts +43 -2
  28. package/dist/composables/useHotkeys.js +89 -16
  29. package/dist/index.d.ts +3 -3
  30. package/dist/index.js +13 -8
  31. package/package.json +1 -1
  32. package/src/components/LpCommandPalette.vue +114 -36
  33. package/src/components/LpConfirmDialog.vue +2 -2
  34. package/src/components/LpDrawer.vue +9 -5
  35. package/src/components/LpModal.vue +8 -4
  36. package/src/components/LpModalNav.vue +2 -1
  37. package/src/components/LpShortcutsDialog.vue +32 -23
  38. package/src/composables/useGlass.ts +25 -0
  39. package/src/composables/useHotkeys.ts +146 -24
  40. package/src/index.ts +9 -3
@@ -1,20 +1,25 @@
1
- import { defineComponent, openBlock, createBlock, withCtx, createElementVNode, createElementBlock, Fragment, renderList, toDisplayString, unref } from "vue";
2
- import { _ as _sfc_main$1 } from "../chunks/LpModal-EyEdRuqF.js";
3
- import { appleModifierLabel } from "../composables/useHotkeys.js";
1
+ import { defineComponent, computed, openBlock, createBlock, withCtx, createElementVNode, createElementBlock, Fragment, renderList, toDisplayString, unref } from "vue";
2
+ import { _ as _sfc_main$1 } from "../chunks/LpModal-8bja5bWS.js";
3
+ import { mergeShortcutGroups, activeShortcuts, appleModifierLabel } from "../composables/useHotkeys.js";
4
4
  import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
5
- import '../assets/LpShortcutsDialog-Cap_ALQM.css';const _hoisted_1 = { class: "shortcut-groups" };
5
+ import '../assets/LpShortcutsDialog-C6YoQ8_M.css';const _hoisted_1 = { class: "shortcut-groups" };
6
6
  const _sfc_main = /* @__PURE__ */ defineComponent({
7
7
  __name: "LpShortcutsDialog",
8
8
  props: {
9
9
  open: { type: Boolean, default: false },
10
- groups: {},
10
+ groups: { default: () => [] },
11
+ live: { type: Boolean, default: false },
11
12
  title: { default: "Keyboard shortcuts" },
12
13
  description: {},
13
- glass: { type: Boolean }
14
+ glass: { type: Boolean, default: void 0 }
14
15
  },
15
16
  emits: ["update:open"],
16
17
  setup(__props, { emit: __emit }) {
17
18
  const props = __props;
19
+ function keysOf(combo) {
20
+ return combo.split(/\+(?!$)/);
21
+ }
22
+ const shown = computed(() => props.live ? mergeShortcutGroups(props.groups, activeShortcuts.value) : props.groups);
18
23
  const emit = __emit;
19
24
  return (_ctx, _cache) => {
20
25
  return openBlock(), createBlock(_sfc_main$1, {
@@ -27,7 +32,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
27
32
  }, {
28
33
  default: withCtx(() => [
29
34
  createElementVNode("div", _hoisted_1, [
30
- (openBlock(true), createElementBlock(Fragment, null, renderList(props.groups, (group) => {
35
+ (openBlock(true), createElementBlock(Fragment, null, renderList(shown.value, (group) => {
31
36
  return openBlock(), createElementBlock("section", {
32
37
  key: group.title,
33
38
  class: "shortcut-group"
@@ -41,7 +46,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
41
46
  }, [
42
47
  createElementVNode("dt", null, toDisplayString(entry.label), 1),
43
48
  createElementVNode("dd", null, [
44
- (openBlock(true), createElementBlock(Fragment, null, renderList(entry.combo.split("+"), (key, index) => {
49
+ (openBlock(true), createElementBlock(Fragment, null, renderList(keysOf(entry.combo), (key, index) => {
45
50
  return openBlock(), createElementBlock("kbd", {
46
51
  key: `${key}-${index}`
47
52
  }, toDisplayString(unref(appleModifierLabel)(key.trim())), 1);
@@ -59,7 +64,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
59
64
  };
60
65
  }
61
66
  });
62
- const LpShortcutsDialog = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-7b1cdfeb"]]);
67
+ const LpShortcutsDialog = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8af3bafc"]]);
63
68
  export {
64
69
  LpShortcutsDialog as default
65
70
  };
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "../chunks/LpSidebar-DZ20iBxY.js";
1
+ import { _ as _sfc_main } from "../chunks/LpSidebar-DlTn5nXc.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -0,0 +1,9 @@
1
+ import { ComputedRef, MaybeRefOrGetter } from 'vue';
2
+ /** Make `glass` the default for every overlay below the calling component. */
3
+ export declare function provideGlass(enabled?: MaybeRefOrGetter<boolean>): void;
4
+ /**
5
+ * The glass flag an overlay renders with: its own prop when set, otherwise the
6
+ * nearest `provideGlass`, otherwise off. The prop must default to `undefined`,
7
+ * not `false`, or an unset prop could not be told apart from an explicit off.
8
+ */
9
+ export declare function useGlass(own: () => boolean | undefined): ComputedRef<boolean>;
@@ -0,0 +1,13 @@
1
+ import { inject, computed, toValue, provide } from "vue";
2
+ const GLASS = /* @__PURE__ */ Symbol("lp-glass");
3
+ function provideGlass(enabled = true) {
4
+ provide(GLASS, enabled);
5
+ }
6
+ function useGlass(own) {
7
+ const inherited = inject(GLASS, false);
8
+ return computed(() => own() ?? toValue(inherited));
9
+ }
10
+ export {
11
+ provideGlass,
12
+ useGlass
13
+ };
@@ -16,13 +16,40 @@ export interface HotkeyBinding {
16
16
  * something there — Escape, and the palette the user reaches from anywhere.
17
17
  */
18
18
  allowInInput?: boolean;
19
+ /**
20
+ * How the key reference lists this binding while it is mounted. Bindings
21
+ * without it still work, they just stay out of `activeShortcuts`.
22
+ */
23
+ help?: HotkeyHelp;
19
24
  /**
20
25
  * Returning `false` declines the key: the event keeps its default and the
21
26
  * search moves on. This is what lets a binding defer to a layer that owns the
22
27
  * key better than it does — Escape belongs to whichever overlay is on top,
23
- * and swallowing it here would close all of them.
28
+ * and swallowing it here would close all of them. The event is passed for
29
+ * the checks only it can answer: where the focus is, whether an inner
30
+ * control already took the key.
31
+ */
32
+ handler: (event: KeyboardEvent) => void | boolean;
33
+ }
34
+ export interface HotkeyHelp {
35
+ /** Section of the reference the entry goes under. */
36
+ group: string;
37
+ label: string;
38
+ /**
39
+ * Written the way it reads, "+"-separated. Defaults to one built from the
40
+ * binding; set it where the binding is not the whole story, such as the
41
+ * second key of a chord ("G+D") or a key that needs Shift to type ("?").
24
42
  */
25
- handler: () => void | boolean;
43
+ combo?: string;
44
+ }
45
+ export interface ShortcutEntry {
46
+ /** Rendered one <kbd> per "+"-separated key, so write it the way it reads. */
47
+ combo: string;
48
+ label: string;
49
+ }
50
+ export interface ShortcutGroup {
51
+ title: string;
52
+ entries: ShortcutEntry[];
26
53
  }
27
54
  /**
28
55
  * Whether this machine prints ⌘ where the rest print Ctrl. Read once: the
@@ -43,6 +70,8 @@ export declare function appleModifierLabel(key: string): string;
43
70
  * formality.
44
71
  */
45
72
  export interface UseHotkeysOptions {
73
+ enabled?: MaybeRefOrGetter<boolean>;
74
+ priority?: MaybeRefOrGetter<number>;
46
75
  /**
47
76
  * Only act while the focus is inside this element.
48
77
  *
@@ -58,3 +87,15 @@ export interface UseHotkeysOptions {
58
87
  scope?: MaybeRefOrGetter<HTMLElement | null | undefined>;
59
88
  }
60
89
  export declare function useHotkeys(bindings: MaybeRefOrGetter<HotkeyBinding[]>, options?: UseHotkeysOptions): void;
90
+ /**
91
+ * The shortcuts that work right now, grouped for `LpShortcutsDialog`: every
92
+ * binding with `help` from every mounted `useHotkeys`. A screen that binds its
93
+ * own keys adds its section while it is open, so the reference never lists a
94
+ * key that does nothing here or misses one that does.
95
+ */
96
+ export declare const activeShortcuts: import('vue').ComputedRef<ShortcutGroup[]>;
97
+ /**
98
+ * Groups merged by title, entries kept once per combo: what a reference shows
99
+ * when it lists both its own entries and the live ones.
100
+ */
101
+ export declare function mergeShortcutGroups(...lists: ShortcutGroup[][]): ShortcutGroup[];
@@ -1,4 +1,4 @@
1
- import { onMounted, onBeforeUnmount, toValue } from "vue";
1
+ import { shallowReactive, computed, toValue, onMounted, onBeforeUnmount } from "vue";
2
2
  const isAppleKeyboard = typeof navigator !== "undefined" && /Mac|iPhone|iPad|iPod/.test(navigator.platform || "");
3
3
  function appleModifierLabel(key) {
4
4
  if (!isAppleKeyboard) return key;
@@ -31,30 +31,103 @@ function matches(event, binding) {
31
31
  if (event.altKey !== Boolean(binding.alt)) return false;
32
32
  return event.key.toLowerCase() === binding.key.toLowerCase() || binding.code !== void 0 && event.code === binding.code;
33
33
  }
34
- function useHotkeys(bindings, options = {}) {
35
- function inScope(target) {
36
- const el = toValue(options.scope);
37
- if (!el) return true;
38
- const node = target instanceof Node ? target : null;
39
- return !!node && (el === node || el.contains(node));
40
- }
41
- function onKeydown(event) {
42
- if (event.isComposing) return;
43
- if (!inScope(event.target)) return;
44
- const inTextEntry = isTextEntry(event.target);
45
- for (const binding of toValue(bindings)) {
34
+ const mounted = shallowReactive(/* @__PURE__ */ new Set());
35
+ let mountOrder = 0;
36
+ let listening = false;
37
+ function inScope(target, scope) {
38
+ const el = toValue(scope);
39
+ if (!el) return true;
40
+ const node = target instanceof Node ? target : null;
41
+ return !!node && (el === node || el.contains(node));
42
+ }
43
+ function onKeydown(event) {
44
+ if (event.isComposing) return;
45
+ const inTextEntry = isTextEntry(event.target);
46
+ const entries = [...mounted].sort(
47
+ (a, b) => Number(toValue(b.priority) || 0) - Number(toValue(a.priority) || 0) || b.order - a.order
48
+ );
49
+ for (const entry of entries) {
50
+ if (toValue(entry.enabled) === false || !inScope(event.target, entry.scope)) continue;
51
+ for (const binding of entry.read()) {
46
52
  if (inTextEntry && !binding.allowInInput) continue;
47
53
  if (!matches(event, binding)) continue;
48
- if (binding.handler() === false) continue;
54
+ if (binding.handler(event) === false) continue;
49
55
  event.preventDefault();
50
56
  return;
51
57
  }
52
58
  }
53
- onMounted(() => window.addEventListener("keydown", onKeydown));
54
- onBeforeUnmount(() => window.removeEventListener("keydown", onKeydown));
59
+ }
60
+ function useHotkeys(bindings, options = {}) {
61
+ const entry = {
62
+ read: () => toValue(bindings),
63
+ scope: options.scope,
64
+ enabled: options.enabled,
65
+ priority: options.priority,
66
+ order: ++mountOrder
67
+ };
68
+ onMounted(() => {
69
+ mounted.add(entry);
70
+ if (!listening) {
71
+ window.addEventListener("keydown", onKeydown);
72
+ listening = true;
73
+ }
74
+ });
75
+ onBeforeUnmount(() => {
76
+ mounted.delete(entry);
77
+ if (!mounted.size && listening) {
78
+ window.removeEventListener("keydown", onKeydown);
79
+ listening = false;
80
+ }
81
+ });
82
+ }
83
+ const KEY_NAMES = {
84
+ escape: "Esc",
85
+ enter: "Enter",
86
+ backspace: "Backspace",
87
+ delete: "Delete",
88
+ tab: "Tab",
89
+ " ": "Space",
90
+ arrowup: "↑",
91
+ arrowdown: "↓",
92
+ arrowleft: "←",
93
+ arrowright: "→"
94
+ };
95
+ function comboOf(binding) {
96
+ const key = binding.key.toLowerCase();
97
+ const name = KEY_NAMES[key] ?? (key.length === 1 || /^f\d+$/.test(key) ? key.toUpperCase() : binding.key);
98
+ return [binding.ctrl && "Ctrl", binding.alt && "Alt", binding.shift && "Shift", name].filter(Boolean).join("+");
99
+ }
100
+ const activeShortcuts = computed(() => {
101
+ const groups = /* @__PURE__ */ new Map();
102
+ for (const entry of mounted) {
103
+ if (toValue(entry.enabled) === false) continue;
104
+ for (const binding of entry.read()) {
105
+ if (!binding.help) continue;
106
+ const combo = binding.help.combo ?? comboOf(binding);
107
+ const entries = groups.get(binding.help.group) ?? [];
108
+ if (!entries.some((e) => e.combo === combo)) entries.push({ combo, label: binding.help.label });
109
+ groups.set(binding.help.group, entries);
110
+ }
111
+ }
112
+ return [...groups].map(([title, entries]) => ({ title, entries }));
113
+ });
114
+ function mergeShortcutGroups(...lists) {
115
+ const groups = /* @__PURE__ */ new Map();
116
+ for (const list of lists) {
117
+ for (const group of list) {
118
+ const entries = groups.get(group.title) ?? [];
119
+ for (const entry of group.entries) {
120
+ if (!entries.some((e) => e.combo === entry.combo)) entries.push(entry);
121
+ }
122
+ groups.set(group.title, entries);
123
+ }
124
+ }
125
+ return [...groups].map(([title, entries]) => ({ title, entries }));
55
126
  }
56
127
  export {
128
+ activeShortcuts,
57
129
  appleModifierLabel,
58
130
  isAppleKeyboard,
131
+ mergeShortcutGroups,
59
132
  useHotkeys
60
133
  };
package/dist/index.d.ts CHANGED
@@ -91,7 +91,6 @@ export { default as LpServiceNode } from './components/LpServiceNode.vue';
91
91
  export type { ServiceNodeData } from './components/LpServiceNode.vue';
92
92
  export { default as LpShift } from './components/LpShift.vue';
93
93
  export { default as LpShortcutsDialog } from './components/LpShortcutsDialog.vue';
94
- export type { ShortcutEntry, ShortcutGroup } from './components/LpShortcutsDialog.vue';
95
94
  export { default as LpSidebar } from './components/LpSidebar.vue';
96
95
  export type { SidebarItem, SidebarSection } from './components/LpSidebar.vue';
97
96
  export { default as LpSkeleton } from './components/LpSkeleton.vue';
@@ -135,8 +134,9 @@ export { parseConfig, serializeConfig, UI_CONFIG_VERSION } from './theme/config'
135
134
  export type { UiConfig } from './theme/config';
136
135
  export { useClipboard } from './composables/useClipboard';
137
136
  export type { CopyOptions, UseClipboard } from './composables/useClipboard';
138
- export { useHotkeys, isAppleKeyboard, appleModifierLabel } from './composables/useHotkeys';
139
- export type { HotkeyBinding } from './composables/useHotkeys';
137
+ export { useHotkeys, isAppleKeyboard, appleModifierLabel, activeShortcuts, mergeShortcutGroups, } from './composables/useHotkeys';
138
+ export type { HotkeyBinding, HotkeyHelp, ShortcutEntry, ShortcutGroup } from './composables/useHotkeys';
139
+ export { provideGlass, useGlass } from './composables/useGlass';
140
140
  export { useMergedClass, useMergedAttrs, mergeClass } from './composables/useMergedClass';
141
141
  export { useInputFilter } from './composables/useInputFilter';
142
142
  export type { UseInputFilterOptions } from './composables/useInputFilter';
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { _ } from "./chunks/LayoutCanvas-Dd20boUG.js";
2
- import { _ as _2 } from "./chunks/LpAddressInput-H5NdhK6c.js";
2
+ import { _ as _2 } from "./chunks/LpAddressInput-CMjaPQVw.js";
3
3
  import { _ as _3 } from "./chunks/LpMapPicker-ul4oYno6.js";
4
4
  import { OSM_TILES, createNominatimProvider, emptyAddress, formatAddress, project, tileUrl, unproject } from "./components/address.js";
5
5
  import { _ as _4 } from "./chunks/LpActionBar-BlvtGB2P.js";
6
6
  import { _ as _5 } from "./chunks/LpAlert-BAYHDSS1.js";
7
- import { _ as _6 } from "./chunks/LpAppShell-BfqSA1ba.js";
7
+ import { _ as _6 } from "./chunks/LpAppShell-Bcv6EhqU.js";
8
8
  import { _ as _7 } from "./chunks/LpAutocomplete-DExlIZe_.js";
9
9
  import { _ as _8 } from "./chunks/LpAvatar-B3-xAOH3.js";
10
10
  import { _ as _9 } from "./chunks/LpBadge-Fe0D1bYx.js";
@@ -19,12 +19,12 @@ import { _ as _15 } from "./chunks/LpCodeBlock-Bo0B4TFR.js";
19
19
  import { _ as _16 } from "./chunks/LpColorPicker-BlXea7LM.js";
20
20
  import { DEFAULT_SWATCHES, clampHsv, formatColor, hsvToHsl, hsvToRgb, isLight, normalizeHue, opaqueCss, parseColor, parseHex, rgbToHex, rgbToHsv } from "./components/color.js";
21
21
  import { default as default3 } from "./components/LpCommandPalette.vue.js";
22
- import { _ as _17 } from "./chunks/LpConfirmDialog-BBRnMkV4.js";
22
+ import { _ as _17 } from "./chunks/LpConfirmDialog-BNAvOR24.js";
23
23
  import { _ as _18 } from "./chunks/LpContextMenu-CwW1QXe_.js";
24
24
  import { _ as _19 } from "./chunks/LpDatePicker-CwOToxGq.js";
25
25
  import { _ as _20 } from "./chunks/LpDisclosure-ChQYmjlR.js";
26
26
  import { _ as _21 } from "./chunks/LpDivider-CUX46KR0.js";
27
- import { _ as _22 } from "./chunks/LpDrawer-B8vBnCWF.js";
27
+ import { _ as _22 } from "./chunks/LpDrawer-DgaS2s2i.js";
28
28
  import { _ as _23 } from "./chunks/LpDropdownMenu-DJpoqRCb.js";
29
29
  import { default as default4 } from "./components/LpDropzone.vue.js";
30
30
  import { _ as _24 } from "./chunks/LpEmptyState-Dsdqz1Wj.js";
@@ -40,8 +40,8 @@ import { fileNameOf } from "./components/lightbox.js";
40
40
  import { _ as _31 } from "./chunks/LpLink-DCND-zyu.js";
41
41
  import { _ as _32 } from "./chunks/LpLogViewer-CaRy5MeS.js";
42
42
  import { _ as _33 } from "./chunks/LpMediaGallery-Cid7PGYx.js";
43
- import { _ as _34 } from "./chunks/LpModal-EyEdRuqF.js";
44
- import { _ as _35 } from "./chunks/LpModalNav-BrDtP7b_.js";
43
+ import { _ as _34 } from "./chunks/LpModal-8bja5bWS.js";
44
+ import { _ as _35 } from "./chunks/LpModalNav-w9kfwHqO.js";
45
45
  import { _ as _36 } from "./chunks/LpNotificationBell-DyGGsMAM.js";
46
46
  import { _ as _37 } from "./chunks/LpNumberField-CWuX08iX.js";
47
47
  import { _ as _38 } from "./chunks/LpTimeField-K6nAGboX.js";
@@ -64,7 +64,7 @@ import { _ as _53 } from "./chunks/LpSelect-ANIVtrpM.js";
64
64
  import { _ as _54 } from "./chunks/LpServiceNode-D8uJ8sGk.js";
65
65
  import { _ as _55 } from "./chunks/LpShift-DXNsauQZ.js";
66
66
  import { default as default6 } from "./components/LpShortcutsDialog.vue.js";
67
- import { _ as _56 } from "./chunks/LpSidebar-DZ20iBxY.js";
67
+ import { _ as _56 } from "./chunks/LpSidebar-DlTn5nXc.js";
68
68
  import { _ as _57 } from "./chunks/LpSkeleton-CTI-vBgW.js";
69
69
  import { _ as _58 } from "./chunks/LpSlider-BwNIBkAK.js";
70
70
  import { _ as _59 } from "./chunks/LpSparkline-C6xQ2dwv.js";
@@ -87,7 +87,8 @@ import { addLeaf, addTab, countBlocks, countLeaves, makeLayout, moveLeaf, remove
87
87
  import { blockTitle, defineBlocks } from "./layout/registry.js";
88
88
  import { useLayout } from "./layout/useLayout.js";
89
89
  import { useClipboard } from "./composables/useClipboard.js";
90
- import { appleModifierLabel, isAppleKeyboard, useHotkeys } from "./composables/useHotkeys.js";
90
+ import { activeShortcuts, appleModifierLabel, isAppleKeyboard, mergeShortcutGroups, useHotkeys } from "./composables/useHotkeys.js";
91
+ import { provideGlass, useGlass } from "./composables/useGlass.js";
91
92
  import { mergeClass, useMergedAttrs, useMergedClass } from "./composables/useMergedClass.js";
92
93
  import { useInputFilter } from "./composables/useInputFilter.js";
93
94
  import { easeOut, easeTravel, easingToken, prefersReducedMotion } from "./composables/easing.js";
@@ -215,6 +216,7 @@ export {
215
216
  OSM_TILES,
216
217
  T as THEME_COOKIE,
217
218
  UI_CONFIG_VERSION,
219
+ activeShortcuts,
218
220
  addLeaf,
219
221
  addTab,
220
222
  b as amber,
@@ -261,6 +263,7 @@ export {
261
263
  makeLayout,
262
264
  matchCountryByValue,
263
265
  mergeClass,
266
+ mergeShortcutGroups,
264
267
  moveLeaf,
265
268
  niceScale,
266
269
  n as nord,
@@ -273,6 +276,7 @@ export {
273
276
  prefersReducedMotion,
274
277
  presets,
275
278
  project,
279
+ provideGlass,
276
280
  removeBlock,
277
281
  removeLeaf,
278
282
  reorderTab,
@@ -296,6 +300,7 @@ export {
296
300
  useAsyncTask,
297
301
  useClipboard,
298
302
  useFormDraft,
303
+ useGlass,
299
304
  useHotkeys,
300
305
  useInputFilter,
301
306
  useLayout,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.40.1",
3
+ "version": "0.42.0",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {