@leavepulse/ui 0.46.0 → 0.47.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 (64) hide show
  1. package/dist/assets/HighlightText-BwC5xbqn.css +6 -0
  2. package/dist/assets/{LpCommandPalette-5miKYsb-.css → LpCommandPalette-DmQUsJqA.css} +21 -21
  3. package/dist/assets/LpKeys-BxRhfQda.css +36 -0
  4. package/dist/assets/LpPaletteFacts-B9FdVmIO.css +93 -0
  5. package/dist/assets/LpPaletteHeader-BVOu1UX5.css +70 -0
  6. package/dist/assets/LpPalettePreview-CJmAKgYW.css +43 -0
  7. package/dist/assets/LpPaletteStats-ClE-37MK.css +33 -0
  8. package/dist/assets/LpPaletteSwatches-CA0B8y2E.css +21 -0
  9. package/dist/assets/{LpShortcutsDialog-CqYX3yy6.css → LpShortcutsDialog-BUp_BX4s.css} +7 -28
  10. package/dist/assets/{LpTable-BoeA_TgK.css → LpTable-xWwI4KPZ.css} +17 -17
  11. package/dist/chunks/HighlightText-BvnYZkhi.js +27 -0
  12. package/dist/chunks/{LpAvatar-DeSb6H0c.js → LpAvatar-Cb1jtOVv.js} +21 -3
  13. package/dist/chunks/{LpLightbox-DSDahF23.js → LpLightbox-EVXzAq62.js} +3 -3
  14. package/dist/chunks/{LpMediaGallery-YKr-cQPN.js → LpMediaGallery-BnlkN_1f.js} +1 -1
  15. package/dist/chunks/LpPalettePreview-CFav_7co.js +19 -0
  16. package/dist/component-names.d.ts +1 -1
  17. package/dist/components/HighlightText.vue.d.ts +7 -0
  18. package/dist/components/HighlightText.vue.js +4 -0
  19. package/dist/components/LpAvatar.vue.d.ts +12 -0
  20. package/dist/components/LpAvatar.vue.js +1 -1
  21. package/dist/components/LpCommandPalette.vue.d.ts +152 -15
  22. package/dist/components/LpCommandPalette.vue.js +178 -92
  23. package/dist/components/LpKeys.vue.d.ts +22 -0
  24. package/dist/components/LpKeys.vue.js +52 -0
  25. package/dist/components/LpLightbox.vue.js +1 -1
  26. package/dist/components/LpMediaGallery.vue.js +1 -1
  27. package/dist/components/LpPaletteFacts.vue.d.ts +25 -0
  28. package/dist/components/LpPaletteFacts.vue.js +85 -0
  29. package/dist/components/LpPaletteHeader.vue.d.ts +32 -0
  30. package/dist/components/LpPaletteHeader.vue.js +103 -0
  31. package/dist/components/LpPalettePreview.vue.d.ts +19 -0
  32. package/dist/components/LpPalettePreview.vue.js +4 -0
  33. package/dist/components/LpPaletteStats.vue.d.ts +11 -0
  34. package/dist/components/LpPaletteStats.vue.js +47 -0
  35. package/dist/components/LpPaletteSwatches.vue.d.ts +10 -0
  36. package/dist/components/LpPaletteSwatches.vue.js +34 -0
  37. package/dist/components/LpShortcutsDialog.vue.js +8 -28
  38. package/dist/components/LpTable.vue.js +5 -3
  39. package/dist/components/commandPalette.d.ts +157 -0
  40. package/dist/components/commandPalette.js +103 -0
  41. package/dist/components/commandSearch.d.ts +32 -0
  42. package/dist/components/commandSearch.js +48 -0
  43. package/dist/components/keys.d.ts +2 -0
  44. package/dist/components/keys.js +11 -0
  45. package/dist/index.d.ts +12 -3
  46. package/dist/index.js +157 -134
  47. package/package.json +1 -1
  48. package/src/component-names.ts +6 -0
  49. package/src/components/HighlightText.vue +28 -0
  50. package/src/components/LpAvatar.vue +21 -2
  51. package/src/components/LpCommandPalette.vue +387 -87
  52. package/src/components/LpKeys.vue +79 -0
  53. package/src/components/LpLightbox.vue +4 -1
  54. package/src/components/LpPaletteFacts.vue +165 -0
  55. package/src/components/LpPaletteHeader.vue +155 -0
  56. package/src/components/LpPalettePreview.vue +77 -0
  57. package/src/components/LpPaletteStats.vue +81 -0
  58. package/src/components/LpPaletteSwatches.vue +56 -0
  59. package/src/components/LpShortcutsDialog.vue +2 -45
  60. package/src/components/LpTable.vue +6 -1
  61. package/src/components/commandPalette.ts +264 -0
  62. package/src/components/commandSearch.ts +79 -0
  63. package/src/components/keys.ts +13 -0
  64. package/src/index.ts +12 -3
@@ -0,0 +1,103 @@
1
+ import { parsePaletteQuery, applyQueryFilters } from "./commandSearch.js";
2
+ function commandHasPreview(command, options) {
3
+ if (!command || command.noPreview) return false;
4
+ if (options.hasPreview) return options.hasPreview(command);
5
+ return options.slot || !!(command.preview || command.excerpt);
6
+ }
7
+ function matchModePrefix(query, commands) {
8
+ const typed = query.trimStart().toLowerCase();
9
+ let best = null;
10
+ for (const command of commands) {
11
+ const prefix = command.prefix?.toLowerCase();
12
+ if (!prefix || !command.children || command.disabled || !typed.startsWith(prefix)) continue;
13
+ if (!best || prefix.length > (best.prefix?.length ?? 0)) best = command;
14
+ }
15
+ if (!best) return null;
16
+ return { command: best, rest: query.trimStart().slice(best.prefix.length) };
17
+ }
18
+ function fallbackRows(items, raw) {
19
+ const parsed = parsePaletteQuery(raw.trim());
20
+ if (!parsed.text) return [];
21
+ return applyQueryFilters(
22
+ items.filter((c) => c.fallback),
23
+ parsed
24
+ ).map((command) => ({ command, label: command.label.split("{query}").join(parsed.text) }));
25
+ }
26
+ function isEntry(value) {
27
+ if (!value || typeof value !== "object") return false;
28
+ const v = value;
29
+ return typeof v.id === "string" && typeof v.label === "string" && Array.isArray(v.path) && v.path.every((step) => typeof step === "string");
30
+ }
31
+ function readRecent(stored) {
32
+ if (!Array.isArray(stored)) return [];
33
+ return stored.filter((v) => typeof v === "string" || isEntry(v));
34
+ }
35
+ function recentKey(item) {
36
+ return typeof item === "string" ? item : [...item.path, item.id].join("\0");
37
+ }
38
+ function toRecentItem(command, path) {
39
+ if (!path.length) return command.id;
40
+ const entry = { id: command.id, label: command.label, path: [...path] };
41
+ if (command.description) entry.description = command.description;
42
+ if (command.icon) entry.icon = command.icon;
43
+ if (typeof command.image === "string") entry.image = command.image;
44
+ else if (command.image) {
45
+ const { src, alt, fallback, icon, shape } = command.image;
46
+ entry.image = { src, alt, fallback, icon, shape };
47
+ }
48
+ if (command.href) entry.href = command.href;
49
+ if (command.recentData !== void 0) entry.data = command.recentData;
50
+ return entry;
51
+ }
52
+ function pushRecent(list, item, keep) {
53
+ const key = recentKey(item);
54
+ return [item, ...list.filter((v) => recentKey(v) !== key)].slice(0, keep);
55
+ }
56
+ function resolveRecentItems(items, commands, options) {
57
+ const out = [];
58
+ const seen = /* @__PURE__ */ new Set();
59
+ for (const item of items) {
60
+ if (out.length >= options.limit) break;
61
+ const key = recentKey(item);
62
+ if (seen.has(key)) continue;
63
+ const found = typeof item === "string" ? commands.find((c) => c.id === item) : findEntry(item, commands, options);
64
+ if (!found || found.disabled || found.children) continue;
65
+ seen.add(key);
66
+ out.push({ command: found, path: typeof item === "string" ? [] : [...item.path] });
67
+ }
68
+ return out;
69
+ }
70
+ function findEntry(entry, commands, options) {
71
+ let level = commands;
72
+ for (const step of entry.path) {
73
+ const mode = level?.find((c) => c.id === step);
74
+ level = mode && Array.isArray(mode.children) ? mode.children : null;
75
+ }
76
+ const live = level?.find((c) => c.id === entry.id);
77
+ if (live) return live;
78
+ const resolved = options.resolve?.(entry);
79
+ if (resolved) return resolved;
80
+ return entry.href ? options.fromEntry(entry) : void 0;
81
+ }
82
+ function recentVisible(command, terms, recentLabel) {
83
+ if (!applyQueryFilters([{ ...command, group: void 0 }], { ...terms, groups: [] }).length) return false;
84
+ return terms.groups.every(
85
+ (term) => [command.group, recentLabel].some((group) => group?.toLowerCase().includes(term))
86
+ );
87
+ }
88
+ function modeChipLabel(command) {
89
+ if (command.modeLabel) return command.modeLabel;
90
+ if (!command.label.includes("{query}")) return command.label;
91
+ return command.label.replace(/\s*["'“”«»]?\{query\}["'“”«»]?/g, "").replace(/\s+(for|in|on|:)$/i, "").trim();
92
+ }
93
+ export {
94
+ commandHasPreview,
95
+ fallbackRows,
96
+ matchModePrefix,
97
+ modeChipLabel,
98
+ pushRecent,
99
+ readRecent,
100
+ recentVisible,
101
+ resolveRecentItems,
102
+ toRecentItem
103
+ };
@@ -11,3 +11,35 @@ export interface CommandSearchTerms {
11
11
  }
12
12
  export declare function parseCommandQuery(value: string): CommandSearchTerms;
13
13
  export declare function rankCommandItems<T extends SearchableCommand>(items: T[], terms: CommandSearchTerms): T[];
14
+ /**
15
+ * A query as a fetcher receives it. `text` is what a remote search should be
16
+ * sent: the positive words and phrases, in the case they were typed, without
17
+ * the operators a server would not understand. The operators come alongside
18
+ * as data, so a provider that can scope or exclude on the server may.
19
+ */
20
+ export interface PaletteQuery extends CommandSearchTerms {
21
+ /** The box as typed, operators and all. */
22
+ raw: string;
23
+ /** Positive terms joined by spaces, case kept, quotes dropped. */
24
+ text: string;
25
+ }
26
+ export declare function parsePaletteQuery(raw: string): PaletteQuery;
27
+ /**
28
+ * The operators applied to results someone else matched: a server answered
29
+ * the positive words, and `-word` and `in:group` still have to hold for what
30
+ * it sent back. Positive terms are not re-checked here; the server may match
31
+ * word forms the text does not contain.
32
+ */
33
+ export declare function applyQueryFilters<T extends SearchableCommand>(items: T[], terms: CommandSearchTerms): T[];
34
+ /** A run of text, and whether it matched the query. */
35
+ export interface HighlightPart {
36
+ text: string;
37
+ hit: boolean;
38
+ }
39
+ /**
40
+ * Text split around the terms that matched, for <mark> without v-html. Terms
41
+ * shorter than two characters are skipped (one letter would mark half the
42
+ * text), longer ones win where two start at the same place, and case is
43
+ * ignored. Pass positive terms only: an excluded word is never a match.
44
+ */
45
+ export declare function highlightParts(value: string, terms: readonly string[]): HighlightPart[];
@@ -47,7 +47,55 @@ function score(command, terms) {
47
47
  function rankCommandItems(items, terms) {
48
48
  return items.map((command) => ({ command, score: score(command, terms) })).filter((entry) => entry.score > 0).sort((a, b) => b.score - a.score || a.command.label.localeCompare(b.command.label)).map((entry) => entry.command);
49
49
  }
50
+ function parsePaletteQuery(raw) {
51
+ const terms = parseCommandQuery(raw);
52
+ const words = [];
53
+ QUERY_TOKEN.lastIndex = 0;
54
+ for (let match; match = QUERY_TOKEN.exec(raw); ) {
55
+ const text = (match[3] ?? match[4] ?? "").trim();
56
+ if (text && !match[1] && !match[2]) words.push(text);
57
+ }
58
+ return { ...terms, raw, text: words.join(" ") };
59
+ }
60
+ function applyQueryFilters(items, terms) {
61
+ if (!terms.exclude.length && !terms.groups.length) return items;
62
+ return items.filter((command) => {
63
+ const group = command.group?.toLowerCase() ?? "";
64
+ return !terms.exclude.some((term) => matches(command, term)) && terms.groups.every((term) => group.includes(term));
65
+ });
66
+ }
67
+ function highlightParts(value, terms) {
68
+ const sorted = [...new Set(terms.map((t) => t.toLowerCase()).filter((t) => t.length >= 2))].sort(
69
+ (a, b) => b.length - a.length
70
+ );
71
+ if (!value || sorted.length === 0) return value ? [{ text: value, hit: false }] : [];
72
+ const lower = value.toLowerCase();
73
+ const parts = [];
74
+ let i = 0;
75
+ while (i < value.length) {
76
+ let at = -1;
77
+ let term = "";
78
+ for (const t of sorted) {
79
+ const found = lower.indexOf(t, i);
80
+ if (found !== -1 && (at === -1 || found < at || found === at && t.length > term.length)) {
81
+ at = found;
82
+ term = t;
83
+ }
84
+ }
85
+ if (at === -1) {
86
+ parts.push({ text: value.slice(i), hit: false });
87
+ break;
88
+ }
89
+ if (at > i) parts.push({ text: value.slice(i, at), hit: false });
90
+ parts.push({ text: value.slice(at, at + term.length), hit: true });
91
+ i = at + term.length;
92
+ }
93
+ return parts;
94
+ }
50
95
  export {
96
+ applyQueryFilters,
97
+ highlightParts,
51
98
  parseCommandQuery,
99
+ parsePaletteQuery,
52
100
  rankCommandItems
53
101
  };
@@ -0,0 +1,2 @@
1
+ export declare function comboKeys(chord: string): string[];
2
+ export declare function comboSteps(combo: string): string[][];
@@ -0,0 +1,11 @@
1
+ function comboKeys(chord) {
2
+ return chord.split(/\+(?!$)/);
3
+ }
4
+ function comboSteps(combo) {
5
+ const trimmed = combo.trim();
6
+ return trimmed ? trimmed.split(/\s+/).map(comboKeys) : [];
7
+ }
8
+ export {
9
+ comboKeys,
10
+ comboSteps
11
+ };
package/dist/index.d.ts CHANGED
@@ -35,9 +35,18 @@ export type { ColorPickerLabels } from "./components/LpColorPicker.vue";
35
35
  export { clampHsv, DEFAULT_SWATCHES, formatColor, hsvToHsl, hsvToRgb, isLight, normalizeHue, opaqueCss, parseColor, parseHex, rgbToHex, rgbToHsv, } from "./components/color";
36
36
  export type { ColorFormat, Hsv, Rgb } from "./components/color";
37
37
  export { default as LpCommandPalette } from "./components/LpCommandPalette.vue";
38
- export type { Command, PaletteLabels } from "./components/LpCommandPalette.vue";
39
- export { parseCommandQuery, rankCommandItems } from "./components/commandSearch";
40
- export type { CommandSearchTerms, SearchableCommand } from "./components/commandSearch";
38
+ export type { Command, CommandFetcher, CommandImage, PaletteLabels } from "./components/LpCommandPalette.vue";
39
+ export { applyQueryFilters, highlightParts, parseCommandQuery, parsePaletteQuery, rankCommandItems } from "./components/commandSearch";
40
+ export { commandHasPreview, pushRecent, readRecent, toRecentItem } from "./components/commandPalette";
41
+ export type { PaletteFact, PaletteStat, PreviewableCommand, RecentEntry, RecentItem } from "./components/commandPalette";
42
+ export { default as LpPalettePreview } from "./components/LpPalettePreview.vue";
43
+ export { default as LpPaletteHeader } from "./components/LpPaletteHeader.vue";
44
+ export { default as LpPaletteFacts } from "./components/LpPaletteFacts.vue";
45
+ export { default as LpPaletteStats } from "./components/LpPaletteStats.vue";
46
+ export { default as LpPaletteSwatches } from "./components/LpPaletteSwatches.vue";
47
+ export { default as LpKeys } from "./components/LpKeys.vue";
48
+ export { comboKeys, comboSteps } from "./components/keys";
49
+ export type { CommandSearchTerms, HighlightPart, PaletteQuery, SearchableCommand } from "./components/commandSearch";
41
50
  export { default as LpConfirmDialog } from "./components/LpConfirmDialog.vue";
42
51
  export type { ConfirmLabels } from "./components/LpConfirmDialog.vue";
43
52
  export { default as LpConfirmHost } from "./components/LpConfirmHost.vue";
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import { _ as _4 } from "./chunks/LpActionBar-CnfFVIwC.js";
6
6
  import { _ as _5 } from "./chunks/LpAlert-B6ilrM7T.js";
7
7
  import { _ as _6 } from "./chunks/LpAppShell-BmMYcEVx.js";
8
8
  import { _ as _7 } from "./chunks/LpAutocomplete-C8IgSMsi.js";
9
- import { _ as _8 } from "./chunks/LpAvatar-DeSb6H0c.js";
9
+ import { _ as _8 } from "./chunks/LpAvatar-Cb1jtOVv.js";
10
10
  import { _ as _9 } from "./chunks/LpBadge-Fe0D1bYx.js";
11
11
  import { _ as _10 } from "./chunks/LpBreadcrumbs-CQJd73Gm.js";
12
12
  import { _ as _11 } from "./chunks/LpButton-CKSwC6Mu.js";
@@ -21,81 +21,89 @@ import { tokenizeLines } from "./components/codeHighlight.js";
21
21
  import { _ as _16 } from "./chunks/LpColorPicker-BLqPX5Vw.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
- import { parseCommandQuery, rankCommandItems } from "./components/commandSearch.js";
25
- import { _ as _17 } from "./chunks/LpConfirmDialog-Ca-CTlxT.js";
26
- import { _ as _18 } from "./chunks/LpConfirmHost-BAaSaT2b.js";
24
+ import { applyQueryFilters, highlightParts, parseCommandQuery, parsePaletteQuery, rankCommandItems } from "./components/commandSearch.js";
25
+ import { commandHasPreview, pushRecent, readRecent, toRecentItem } from "./components/commandPalette.js";
26
+ import { _ as _17 } from "./chunks/LpPalettePreview-CFav_7co.js";
27
+ import { default as default4 } from "./components/LpPaletteHeader.vue.js";
28
+ import { default as default5 } from "./components/LpPaletteFacts.vue.js";
29
+ import { default as default6 } from "./components/LpPaletteStats.vue.js";
30
+ import { default as default7 } from "./components/LpPaletteSwatches.vue.js";
31
+ import { default as default8 } from "./components/LpKeys.vue.js";
32
+ import { comboKeys, comboSteps } from "./components/keys.js";
33
+ import { _ as _18 } from "./chunks/LpConfirmDialog-Ca-CTlxT.js";
34
+ import { _ as _19 } from "./chunks/LpConfirmHost-BAaSaT2b.js";
27
35
  import { confirm, useConfirm } from "./components/confirm.js";
28
- import { _ as _19 } from "./chunks/LpContextMenu-1cKew_Dc.js";
29
- import { _ as _20 } from "./chunks/LpDatePicker-BrdFtSTy.js";
30
- import { _ as _21 } from "./chunks/LpDateRangePicker-Drd7EbIz.js";
31
- import { _ as _22 } from "./chunks/LpRangeCalendar-DZuaRV0W.js";
36
+ import { _ as _20 } from "./chunks/LpContextMenu-1cKew_Dc.js";
37
+ import { _ as _21 } from "./chunks/LpDatePicker-BrdFtSTy.js";
38
+ import { _ as _22 } from "./chunks/LpDateRangePicker-Drd7EbIz.js";
39
+ import { _ as _23 } from "./chunks/LpRangeCalendar-DZuaRV0W.js";
32
40
  import { clampRange, defaultRangePresets, formatRange, normalizeRange, sameRange } from "./components/dateRange.js";
33
- import { _ as _23 } from "./chunks/LpDisclosure-Cc23-JOT.js";
34
- import { _ as _24 } from "./chunks/LpDivider-CUX46KR0.js";
35
- import { _ as _25 } from "./chunks/LpDrawer-CBFVD624.js";
36
- import { _ as _26 } from "./chunks/LpDropdownMenu-DrpJJBp0.js";
37
- import { default as default4 } from "./components/LpDropzone.vue.js";
38
- import { _ as _27 } from "./chunks/LpEmptyState-BJbZXC8D.js";
39
- import { _ as _28 } from "./chunks/LpFileTree-bk5VjBey.js";
41
+ import { _ as _24 } from "./chunks/LpDisclosure-Cc23-JOT.js";
42
+ import { _ as _25 } from "./chunks/LpDivider-CUX46KR0.js";
43
+ import { _ as _26 } from "./chunks/LpDrawer-CBFVD624.js";
44
+ import { _ as _27 } from "./chunks/LpDropdownMenu-DrpJJBp0.js";
45
+ import { default as default9 } from "./components/LpDropzone.vue.js";
46
+ import { _ as _28 } from "./chunks/LpEmptyState-BJbZXC8D.js";
47
+ import { _ as _29 } from "./chunks/LpFileTree-bk5VjBey.js";
40
48
  import { ancestorIds, checkStateOf, checkedCount, computeStats, fileIcon, formatModified, formatSize, sortNodes, subtreeIds, subtreeSize } from "./components/fileTree.js";
41
- import { _ as _29 } from "./chunks/LpFieldNotice-wtieLUTj.js";
42
- import { _ as _30 } from "./chunks/LpFormField-CtVYj6tO.js";
43
- import { _ as _31 } from "./chunks/LpIcon-DYtaid0K.js";
49
+ import { _ as _30 } from "./chunks/LpFieldNotice-wtieLUTj.js";
50
+ import { _ as _31 } from "./chunks/LpFormField-CtVYj6tO.js";
51
+ import { _ as _32 } from "./chunks/LpIcon-DYtaid0K.js";
44
52
  import { i, b, a, c } from "./chunks/icons-CkA0njzm.js";
45
- import { default as default5 } from "./components/LpImageEditor.vue.js";
46
- import { _ as _32 } from "./chunks/LpInfraNode-Ds_8SZgN.js";
47
- import { _ as _33 } from "./chunks/LpInput-D-YGQbEv.js";
48
- import { _ as _34 } from "./chunks/LpLightbox-DSDahF23.js";
53
+ import { default as default10 } from "./components/LpImageEditor.vue.js";
54
+ import { _ as _33 } from "./chunks/LpInfraNode-Ds_8SZgN.js";
55
+ import { _ as _34 } from "./chunks/LpInput-D-YGQbEv.js";
56
+ import { _ as _35 } from "./chunks/LpLightbox-EVXzAq62.js";
49
57
  import { fileNameOf } from "./components/lightbox.js";
50
- import { _ as _35 } from "./chunks/LpLink-Krkjhe_y.js";
51
- import { _ as _36 } from "./chunks/LpLogViewer-BDFXzvcl.js";
58
+ import { _ as _36 } from "./chunks/LpLink-Krkjhe_y.js";
59
+ import { _ as _37 } from "./chunks/LpLogViewer-BDFXzvcl.js";
52
60
  import { countLevels, matchPositions, matchesTerm, ringWindow, stepMatch } from "./components/logSearch.js";
53
- import { _ as _37 } from "./chunks/LpMediaGallery-YKr-cQPN.js";
54
- import { _ as _38 } from "./chunks/LpModal-JNa3B_Lr.js";
55
- import { _ as _39 } from "./chunks/LpModalNav-BAxC9et7.js";
56
- import { _ as _40 } from "./chunks/LpNotificationBell-DsqSyMwS.js";
57
- import { _ as _41 } from "./chunks/LpNumberField-B77O-z28.js";
58
- import { _ as _42 } from "./chunks/LpTimeField-Cqe7fXnh.js";
59
- import { _ as _43 } from "./chunks/LpNumberFlow-z4WPZcZu.js";
60
- import { _ as _44 } from "./chunks/LpOtpInput-CziPF3Oq.js";
61
- import { _ as _45 } from "./chunks/LpPagination-BcDlo3r_.js";
62
- import { _ as _46 } from "./chunks/LpPasswordInput-eKzQhbQP.js";
63
- import { _ as _47 } from "./chunks/LpPie-BdSnta11.js";
64
- import { _ as _48 } from "./chunks/LpPhoneInput-BCbrrhgE.js";
61
+ import { _ as _38 } from "./chunks/LpMediaGallery-BnlkN_1f.js";
62
+ import { _ as _39 } from "./chunks/LpModal-JNa3B_Lr.js";
63
+ import { _ as _40 } from "./chunks/LpModalNav-BAxC9et7.js";
64
+ import { _ as _41 } from "./chunks/LpNotificationBell-DsqSyMwS.js";
65
+ import { _ as _42 } from "./chunks/LpNumberField-B77O-z28.js";
66
+ import { _ as _43 } from "./chunks/LpTimeField-Cqe7fXnh.js";
67
+ import { _ as _44 } from "./chunks/LpNumberFlow-z4WPZcZu.js";
68
+ import { _ as _45 } from "./chunks/LpOtpInput-CziPF3Oq.js";
69
+ import { _ as _46 } from "./chunks/LpPagination-BcDlo3r_.js";
70
+ import { _ as _47 } from "./chunks/LpPasswordInput-eKzQhbQP.js";
71
+ import { _ as _48 } from "./chunks/LpPie-BdSnta11.js";
72
+ import { _ as _49 } from "./chunks/LpPhoneInput-BCbrrhgE.js";
65
73
  import { filterCountries, flagEmoji, loadCountries, matchCountryByValue } from "./components/countries.js";
66
- import { _ as _49 } from "./chunks/LpPopover-DCKeqiVn.js";
67
- import { _ as _50 } from "./chunks/LpProgress-CBU1iI69.js";
68
- import { _ as _51 } from "./chunks/LpRadio-B5AfqTpZ.js";
69
- import { _ as _52 } from "./chunks/LpRadioGroup-DmEW0l78.js";
70
- import { _ as _53 } from "./chunks/LpRollingText-DB7upf-5.js";
71
- import { _ as _54 } from "./chunks/LpScrollArea-Hz3-JWUG.js";
72
- import { _ as _55 } from "./chunks/LpSegmented-C09EEam2.js";
73
- import { _ as _56 } from "./chunks/LpSection-tKEH0jYf.js";
74
- import { _ as _57 } from "./chunks/LpSelect-DNIL6MB9.js";
75
- import { _ as _58 } from "./chunks/LpServiceNode-D8uJ8sGk.js";
76
- import { _ as _59 } from "./chunks/LpShift-DXNsauQZ.js";
77
- import { default as default6 } from "./components/LpShortcutsDialog.vue.js";
78
- import { _ as _60 } from "./chunks/LpSidebar-DpEiGi8L.js";
79
- import { _ as _61 } from "./chunks/LpSkeleton-BB6XIV-w.js";
80
- import { _ as _62 } from "./chunks/LpSlider-Cuzmrd7p.js";
81
- import { _ as _63 } from "./chunks/LpSparkline-CB80N8SJ.js";
82
- import { _ as _64 } from "./chunks/LpStat-B-7udBRP.js";
83
- import { _ as _65 } from "./chunks/LpStepper-C7XiVKZj.js";
84
- import { _ as _66 } from "./chunks/LpSwitch-OrcOJX9m.js";
85
- import { default as default7 } from "./components/LpTable.vue.js";
74
+ import { _ as _50 } from "./chunks/LpPopover-DCKeqiVn.js";
75
+ import { _ as _51 } from "./chunks/LpProgress-CBU1iI69.js";
76
+ import { _ as _52 } from "./chunks/LpRadio-B5AfqTpZ.js";
77
+ import { _ as _53 } from "./chunks/LpRadioGroup-DmEW0l78.js";
78
+ import { _ as _54 } from "./chunks/LpRollingText-DB7upf-5.js";
79
+ import { _ as _55 } from "./chunks/LpScrollArea-Hz3-JWUG.js";
80
+ import { _ as _56 } from "./chunks/LpSegmented-C09EEam2.js";
81
+ import { _ as _57 } from "./chunks/LpSection-tKEH0jYf.js";
82
+ import { _ as _58 } from "./chunks/LpSelect-DNIL6MB9.js";
83
+ import { _ as _59 } from "./chunks/LpServiceNode-D8uJ8sGk.js";
84
+ import { _ as _60 } from "./chunks/LpShift-DXNsauQZ.js";
85
+ import { default as default11 } from "./components/LpShortcutsDialog.vue.js";
86
+ import { _ as _61 } from "./chunks/LpSidebar-DpEiGi8L.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/LpSparkline-CB80N8SJ.js";
90
+ import { _ as _65 } from "./chunks/LpStat-B-7udBRP.js";
91
+ import { _ as _66 } from "./chunks/LpStepper-C7XiVKZj.js";
92
+ import { _ as _67 } from "./chunks/LpSwitch-OrcOJX9m.js";
93
+ import { default as default12 } from "./components/LpTable.vue.js";
86
94
  import { compareValues } from "./components/tableSort.js";
87
- import { _ as _67 } from "./chunks/LpTableOfContents-BUcAfGPQ.js";
88
- import { _ as _68 } from "./chunks/LpTabs-29iW1XOx.js";
89
- import { _ as _69 } from "./chunks/LpTagsInput-D1SuqbhB.js";
95
+ import { _ as _68 } from "./chunks/LpTableOfContents-BUcAfGPQ.js";
96
+ import { _ as _69 } from "./chunks/LpTabs-29iW1XOx.js";
97
+ import { _ as _70 } from "./chunks/LpTagsInput-D1SuqbhB.js";
90
98
  import { addTags, splitTags } from "./components/tags.js";
91
- import { _ as _70 } from "./chunks/LpTextarea-uuScWo6-.js";
92
- import { _ as _71 } from "./chunks/LpThemeSwitcher-BbYFFT5w.js";
93
- import { _ as _72 } from "./chunks/LpTilt-B7KHX1zH.js";
94
- import { _ as _73 } from "./chunks/LpToaster-DTtWuKvq.js";
95
- import { _ as _74 } from "./chunks/LpTooltip-CXVKcOXT.js";
96
- import { _ as _75 } from "./chunks/LpTooltipProvider-CftjV7Xc.js";
97
- import { _ as _76 } from "./chunks/LpTopologyCanvas-6ozNrQKh.js";
98
- import { _ as _77 } from "./chunks/LpUptimeBar-ugcv25xj.js";
99
+ import { _ as _71 } from "./chunks/LpTextarea-uuScWo6-.js";
100
+ import { _ as _72 } from "./chunks/LpThemeSwitcher-BbYFFT5w.js";
101
+ import { _ as _73 } from "./chunks/LpTilt-B7KHX1zH.js";
102
+ import { _ as _74 } from "./chunks/LpToaster-DTtWuKvq.js";
103
+ import { _ as _75 } from "./chunks/LpTooltip-CXVKcOXT.js";
104
+ import { _ as _76 } from "./chunks/LpTooltipProvider-CftjV7Xc.js";
105
+ import { _ as _77 } from "./chunks/LpTopologyCanvas-6ozNrQKh.js";
106
+ import { _ as _78 } from "./chunks/LpUptimeBar-ugcv25xj.js";
99
107
  import { deserializeLayout, serializeLayout } from "./layout/tree.js";
100
108
  import { addLeaf, addTab, countBlocks, countLeaves, makeLayout, moveLeaf, removeBlock, removeLeaf, reorderTab, resizeAt, setActiveTab } from "./layout/tree.js";
101
109
  import { blockTitle, defineBlocks } from "./layout/registry.js";
@@ -124,7 +132,7 @@ import { useShift } from "./composables/useShift.js";
124
132
  import { useTilt } from "./composables/useTilt.js";
125
133
  import { useZoomPan } from "./composables/useZoomPan.js";
126
134
  import { useToast } from "./composables/useToast.js";
127
- import { _ as _78 } from "./chunks/LpThemeProvider-Be4r2TQX.js";
135
+ import { _ as _79 } from "./chunks/LpThemeProvider-Be4r2TQX.js";
128
136
  import { isInternalHref, resolveLink } from "./components/link.js";
129
137
  function defineTheme(base, overrides = {}) {
130
138
  const src = typeof base === "string" ? presets[base] : base;
@@ -182,73 +190,79 @@ export {
182
190
  _15 as LpCodeBlock,
183
191
  _16 as LpColorPicker,
184
192
  default3 as LpCommandPalette,
185
- _17 as LpConfirmDialog,
186
- _18 as LpConfirmHost,
187
- _19 as LpContextMenu,
188
- _20 as LpDatePicker,
189
- _21 as LpDateRangePicker,
190
- _23 as LpDisclosure,
191
- _24 as LpDivider,
192
- _25 as LpDrawer,
193
- _26 as LpDropdownMenu,
194
- default4 as LpDropzone,
195
- _27 as LpEmptyState,
196
- _29 as LpFieldNotice,
197
- _28 as LpFileTree,
198
- _30 as LpFormField,
199
- _31 as LpIcon,
200
- default5 as LpImageEditor,
201
- _32 as LpInfraNode,
202
- _33 as LpInput,
203
- _34 as LpLightbox,
204
- _35 as LpLink,
205
- _36 as LpLogViewer,
193
+ _18 as LpConfirmDialog,
194
+ _19 as LpConfirmHost,
195
+ _20 as LpContextMenu,
196
+ _21 as LpDatePicker,
197
+ _22 as LpDateRangePicker,
198
+ _24 as LpDisclosure,
199
+ _25 as LpDivider,
200
+ _26 as LpDrawer,
201
+ _27 as LpDropdownMenu,
202
+ default9 as LpDropzone,
203
+ _28 as LpEmptyState,
204
+ _30 as LpFieldNotice,
205
+ _29 as LpFileTree,
206
+ _31 as LpFormField,
207
+ _32 as LpIcon,
208
+ default10 as LpImageEditor,
209
+ _33 as LpInfraNode,
210
+ _34 as LpInput,
211
+ default8 as LpKeys,
212
+ _35 as LpLightbox,
213
+ _36 as LpLink,
214
+ _37 as LpLogViewer,
206
215
  _3 as LpMapPicker,
207
- _37 as LpMediaGallery,
208
- _38 as LpModal,
209
- _39 as LpModalNav,
210
- _40 as LpNotificationBell,
211
- _41 as LpNumberField,
212
- _43 as LpNumberFlow,
213
- _44 as LpOtpInput,
214
- _45 as LpPagination,
215
- _46 as LpPasswordInput,
216
- _48 as LpPhoneInput,
217
- _47 as LpPie,
218
- _49 as LpPopover,
219
- _50 as LpProgress,
220
- _51 as LpRadio,
221
- _52 as LpRadioGroup,
222
- _22 as LpRangeCalendar,
223
- _53 as LpRollingText,
224
- _54 as LpScrollArea,
225
- _56 as LpSection,
226
- _55 as LpSegmented,
227
- _57 as LpSelect,
228
- _58 as LpServiceNode,
229
- _59 as LpShift,
230
- default6 as LpShortcutsDialog,
231
- _60 as LpSidebar,
232
- _61 as LpSkeleton,
233
- _62 as LpSlider,
234
- _63 as LpSparkline,
235
- _64 as LpStat,
236
- _65 as LpStepper,
237
- _66 as LpSwitch,
238
- default7 as LpTable,
239
- _67 as LpTableOfContents,
240
- _68 as LpTabs,
241
- _69 as LpTagsInput,
242
- _70 as LpTextarea,
243
- _78 as LpThemeProvider,
244
- _71 as LpThemeSwitcher,
245
- _72 as LpTilt,
246
- _42 as LpTimeField,
247
- _73 as LpToaster,
248
- _74 as LpTooltip,
249
- _75 as LpTooltipProvider,
250
- _76 as LpTopologyCanvas,
251
- _77 as LpUptimeBar,
216
+ _38 as LpMediaGallery,
217
+ _39 as LpModal,
218
+ _40 as LpModalNav,
219
+ _41 as LpNotificationBell,
220
+ _42 as LpNumberField,
221
+ _44 as LpNumberFlow,
222
+ _45 as LpOtpInput,
223
+ _46 as LpPagination,
224
+ default5 as LpPaletteFacts,
225
+ default4 as LpPaletteHeader,
226
+ _17 as LpPalettePreview,
227
+ default6 as LpPaletteStats,
228
+ default7 as LpPaletteSwatches,
229
+ _47 as LpPasswordInput,
230
+ _49 as LpPhoneInput,
231
+ _48 as LpPie,
232
+ _50 as LpPopover,
233
+ _51 as LpProgress,
234
+ _52 as LpRadio,
235
+ _53 as LpRadioGroup,
236
+ _23 as LpRangeCalendar,
237
+ _54 as LpRollingText,
238
+ _55 as LpScrollArea,
239
+ _57 as LpSection,
240
+ _56 as LpSegmented,
241
+ _58 as LpSelect,
242
+ _59 as LpServiceNode,
243
+ _60 as LpShift,
244
+ default11 as LpShortcutsDialog,
245
+ _61 as LpSidebar,
246
+ _62 as LpSkeleton,
247
+ _63 as LpSlider,
248
+ _64 as LpSparkline,
249
+ _65 as LpStat,
250
+ _66 as LpStepper,
251
+ _67 as LpSwitch,
252
+ default12 as LpTable,
253
+ _68 as LpTableOfContents,
254
+ _69 as LpTabs,
255
+ _70 as LpTagsInput,
256
+ _71 as LpTextarea,
257
+ _79 as LpThemeProvider,
258
+ _72 as LpThemeSwitcher,
259
+ _73 as LpTilt,
260
+ _43 as LpTimeField,
261
+ _74 as LpToaster,
262
+ _75 as LpTooltip,
263
+ _76 as LpTooltipProvider,
264
+ _77 as LpTopologyCanvas,
265
+ _78 as LpUptimeBar,
252
266
  N as NO_BACKDROP_ATTR,
253
267
  OSM_TILES,
254
268
  T as THEME_COOKIE,
@@ -263,6 +277,7 @@ export {
263
277
  anyModalOpen,
264
278
  appleModifierLabel,
265
279
  applyMask,
280
+ applyQueryFilters,
266
281
  c2 as applyTheme,
267
282
  d as applyThemeWithTransition,
268
283
  axisTicks,
@@ -275,6 +290,9 @@ export {
275
290
  checkedCount,
276
291
  clampHsv,
277
292
  clampRange,
293
+ comboKeys,
294
+ comboSteps,
295
+ commandHasPreview,
278
296
  compareValues,
279
297
  computeStats,
280
298
  confirm,
@@ -308,6 +326,7 @@ export {
308
326
  formatRange,
309
327
  formatSize,
310
328
  formatTick,
329
+ highlightParts,
311
330
  hotkeyConflicts,
312
331
  hotkeySteps,
313
332
  hsvToHsl,
@@ -345,6 +364,7 @@ export {
345
364
  parseConfig,
346
365
  parseHex,
347
366
  parseMask,
367
+ parsePaletteQuery,
348
368
  parseTheme,
349
369
  pendingHotkey,
350
370
  m as prefersDarkScheme,
@@ -354,7 +374,9 @@ export {
354
374
  provideField,
355
375
  provideGlass,
356
376
  provideLpConfig,
377
+ pushRecent,
357
378
  rankCommandItems,
379
+ readRecent,
358
380
  b as registerAllIcons,
359
381
  a as registerIconCollection,
360
382
  c as registerIcons,
@@ -389,6 +411,7 @@ export {
389
411
  w as themeToCssVars,
390
412
  tileUrl,
391
413
  toCsv,
414
+ toRecentItem,
392
415
  tokenizeLines,
393
416
  topModalElement,
394
417
  unproject,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leavepulse/ui",
3
- "version": "0.46.0",
3
+ "version": "0.47.0",
4
4
  "type": "module",
5
5
  "description": "LeavePulse token-driven Vue component kit.",
6
6
  "repository": {
@@ -37,6 +37,7 @@ export const COMPONENT_NAMES = [
37
37
  "LpImageEditor",
38
38
  "LpInfraNode",
39
39
  "LpInput",
40
+ "LpKeys",
40
41
  "LpLightbox",
41
42
  "LpLink",
42
43
  "LpLogViewer",
@@ -49,6 +50,11 @@ export const COMPONENT_NAMES = [
49
50
  "LpNumberFlow",
50
51
  "LpOtpInput",
51
52
  "LpPagination",
53
+ "LpPaletteFacts",
54
+ "LpPaletteHeader",
55
+ "LpPalettePreview",
56
+ "LpPaletteStats",
57
+ "LpPaletteSwatches",
52
58
  "LpPasswordInput",
53
59
  "LpPhoneInput",
54
60
  "LpPie",