@ixfx/components 0.2.3 → 0.2.5
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.
- package/LICENSE +1 -1
- package/bundle/chunk-pbuEa-1d.js +13 -0
- package/bundle/index.d.ts +4702 -569
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +34929 -2800
- package/bundle/index.js.map +1 -1
- package/bundle/style.css +133 -0
- package/dist/ac-text.d.ts +97 -0
- package/dist/ac-text.d.ts.map +1 -0
- package/dist/ac-text.js +484 -0
- package/dist/ac-text.js.map +1 -0
- package/dist/button-DgKUzE5o.js +121 -0
- package/dist/button-DgKUzE5o.js.map +1 -0
- package/dist/button.d.ts +21 -0
- package/dist/button.d.ts.map +1 -0
- package/dist/button.js +3 -0
- package/dist/checkbox.d.ts +34 -0
- package/dist/checkbox.d.ts.map +1 -0
- package/dist/checkbox.js +251 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chunk-pbuEa-1d.js +13 -0
- package/dist/colour-C3MQIjFJ-BJV-QC-3.js +4138 -0
- package/dist/colour-C3MQIjFJ-BJV-QC-3.js.map +1 -0
- package/dist/colour-picker-Bw-AZoWx.js +922 -0
- package/dist/colour-picker-Bw-AZoWx.js.map +1 -0
- package/dist/colour-picker.d.ts +2 -0
- package/dist/colour-picker.js +2 -0
- package/dist/crumbs.d.ts +92 -0
- package/dist/crumbs.d.ts.map +1 -0
- package/dist/crumbs.js +789 -0
- package/dist/crumbs.js.map +1 -0
- package/dist/data-display.d.ts +24 -12
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +96 -105
- package/dist/data-display.js.map +1 -1
- package/dist/decorate-BZbkqIhA.js +9 -0
- package/dist/defaults-FEZaGiYZ.js +38 -0
- package/dist/defaults-FEZaGiYZ.js.map +1 -0
- package/dist/dist-By5URG0Y.js +1290 -0
- package/dist/dist-By5URG0Y.js.map +1 -0
- package/dist/dist-D7kJgnSE.js +1039 -0
- package/dist/dist-D7kJgnSE.js.map +1 -0
- package/dist/editable-label.d.ts +71 -0
- package/dist/editable-label.d.ts.map +1 -0
- package/dist/editable-label.js +279 -0
- package/dist/editable-label.js.map +1 -0
- package/dist/hex-editor-Gib1Grg2.d.ts +131 -0
- package/dist/hex-editor-Gib1Grg2.d.ts.map +1 -0
- package/dist/hex-editor-Wd6ZtZA2.js +1147 -0
- package/dist/hex-editor-Wd6ZtZA2.js.map +1 -0
- package/dist/hex.d.ts +2 -0
- package/dist/hex.js +2 -0
- package/dist/highlight-CAjwQ4GE.js +50 -0
- package/dist/highlight-CAjwQ4GE.js.map +1 -0
- package/dist/icon-BR5aTIiP.js +100 -0
- package/dist/icon-BR5aTIiP.js.map +1 -0
- package/dist/icon-DQKdfR7U.d.ts +36 -0
- package/dist/icon-DQKdfR7U.d.ts.map +1 -0
- package/dist/icons.d.ts +3 -0
- package/dist/icons.js +9 -0
- package/dist/icons.js.map +1 -0
- package/dist/incr-search-BjCNClnC.js +311 -0
- package/dist/incr-search-BjCNClnC.js.map +1 -0
- package/dist/incr-search.d.ts +2 -0
- package/dist/incr-search.js +3 -0
- package/dist/index-B1hNR7Z9.d.ts +36 -0
- package/dist/index-B1hNR7Z9.d.ts.map +1 -0
- package/dist/index-C5dK8RZa.d.ts +23 -0
- package/dist/index-C5dK8RZa.d.ts.map +1 -0
- package/dist/index-C9iBN908.d.ts +160 -0
- package/dist/index-C9iBN908.d.ts.map +1 -0
- package/dist/index-CPVcTTXo.d.ts +396 -0
- package/dist/index-CPVcTTXo.d.ts.map +1 -0
- package/dist/index-CQxanqXF.d.ts +183 -0
- package/dist/index-CQxanqXF.d.ts.map +1 -0
- package/dist/index-CpbBI3n7.d.ts +1239 -0
- package/dist/index-CpbBI3n7.d.ts.map +1 -0
- package/dist/index.d.ts +422 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5729 -14
- package/dist/index.js.map +1 -1
- package/dist/interaction-CQDQJf2Q.js +1 -0
- package/dist/keyboard-De_vOHLg.js +20 -0
- package/dist/keyboard-De_vOHLg.js.map +1 -0
- package/dist/labelled-input-base-DS6-6C0r.js +155 -0
- package/dist/labelled-input-base-DS6-6C0r.js.map +1 -0
- package/dist/labelled-input-base-DnRh4reU.d.ts +43 -0
- package/dist/labelled-input-base-DnRh4reU.d.ts.map +1 -0
- package/dist/labelled-radial-input.d.ts +34 -0
- package/dist/labelled-radial-input.d.ts.map +1 -0
- package/dist/labelled-radial-input.js +188 -0
- package/dist/labelled-radial-input.js.map +1 -0
- package/dist/labelled-range-input.d.ts +2 -0
- package/dist/labelled-range-input.js +132 -0
- package/dist/labelled-range-input.js.map +1 -0
- package/dist/led.d.ts +25 -0
- package/dist/led.d.ts.map +1 -0
- package/dist/led.js +92 -0
- package/dist/led.js.map +1 -0
- package/dist/menu-BV6UFx_z.js +813 -0
- package/dist/menu-BV6UFx_z.js.map +1 -0
- package/dist/menu-item-Cikacp4F.d.ts +128 -0
- package/dist/menu-item-Cikacp4F.d.ts.map +1 -0
- package/dist/menu-item-DEzL_Yjk.js +766 -0
- package/dist/menu-item-DEzL_Yjk.js.map +1 -0
- package/dist/menu.d.ts +3 -0
- package/dist/menu.js +3 -0
- package/dist/miller.d.ts +324 -0
- package/dist/miller.d.ts.map +1 -0
- package/dist/miller.js +1343 -0
- package/dist/miller.js.map +1 -0
- package/dist/narrowed-text.d.ts +72 -0
- package/dist/narrowed-text.d.ts.map +1 -0
- package/dist/narrowed-text.js +571 -0
- package/dist/narrowed-text.js.map +1 -0
- package/dist/panel.d.ts +43 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +408 -0
- package/dist/panel.js.map +1 -0
- package/dist/plots.d.ts +2 -0
- package/dist/plots.js +2 -0
- package/dist/polar-pad.d.ts +67 -0
- package/dist/polar-pad.d.ts.map +1 -0
- package/dist/polar-pad.js +537 -0
- package/dist/polar-pad.js.map +1 -0
- package/dist/popup-Ddx9LCzY.js +24 -0
- package/dist/popup-Ddx9LCzY.js.map +1 -0
- package/dist/prominence-CreDBdCs.js +98 -0
- package/dist/prominence-CreDBdCs.js.map +1 -0
- package/dist/radial-input-CNJ8asY2.js +849 -0
- package/dist/radial-input-CNJ8asY2.js.map +1 -0
- package/dist/radial-input-xSTd4kEz.d.ts +70 -0
- package/dist/radial-input-xSTd4kEz.d.ts.map +1 -0
- package/dist/radial-input.d.ts +2 -0
- package/dist/radial-input.js +2 -0
- package/dist/range-input.d.ts +43 -0
- package/dist/range-input.d.ts.map +1 -0
- package/dist/range-input.js +459 -0
- package/dist/range-input.js.map +1 -0
- package/dist/range.d.ts +28 -0
- package/dist/range.d.ts.map +1 -0
- package/dist/range.js +136 -0
- package/dist/range.js.map +1 -0
- package/dist/registry-CZEB1YI9.js +21 -0
- package/dist/registry-CZEB1YI9.js.map +1 -0
- package/dist/selecthorizontal.d.ts +13 -8
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +21 -25
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/snap-container.d.ts +50 -0
- package/dist/snap-container.d.ts.map +1 -0
- package/dist/snap-container.js +297 -0
- package/dist/snap-container.js.map +1 -0
- package/dist/split-layout.d.ts +56 -0
- package/dist/split-layout.d.ts.map +1 -0
- package/dist/split-layout.js +545 -0
- package/dist/split-layout.js.map +1 -0
- package/dist/style.css +133 -0
- package/dist/swipe.d.ts +48 -0
- package/dist/swipe.d.ts.map +1 -0
- package/dist/swipe.js +204 -0
- package/dist/swipe.js.map +1 -0
- package/dist/tab-list-CFF7uSYH.d.ts +66 -0
- package/dist/tab-list-CFF7uSYH.d.ts.map +1 -0
- package/dist/tabs.d.ts +2 -0
- package/dist/tabs.js +203 -0
- package/dist/tabs.js.map +1 -0
- package/dist/tickled-controller-Cq1Va0rR.d.ts +218 -0
- package/dist/tickled-controller-Cq1Va0rR.d.ts.map +1 -0
- package/dist/tickled-styles-Bg3QbcrD.js +327 -0
- package/dist/tickled-styles-Bg3QbcrD.js.map +1 -0
- package/dist/timeline-DBWJsSjd.js +1748 -0
- package/dist/timeline-DBWJsSjd.js.map +1 -0
- package/dist/timeline.d.ts +2 -0
- package/dist/timeline.js +2 -0
- package/dist/tooltip-DMxmBNky.js +104 -0
- package/dist/tooltip-DMxmBNky.js.map +1 -0
- package/dist/tooltip-kfUBWYVB.d.ts +26 -0
- package/dist/tooltip-kfUBWYVB.d.ts.map +1 -0
- package/dist/tree-component-CQpoPo4s.d.ts +326 -0
- package/dist/tree-component-CQpoPo4s.d.ts.map +1 -0
- package/dist/tree-data-model-DGvRVOFY.js +190 -0
- package/dist/tree-data-model-DGvRVOFY.js.map +1 -0
- package/dist/tree.d.ts +100 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +1144 -0
- package/dist/tree.js.map +1 -0
- package/dist/types-BKaqnpwx.d.ts +8 -0
- package/dist/types-BKaqnpwx.d.ts.map +1 -0
- package/dist/xy-axis-BANbgrI5.js +6243 -0
- package/dist/xy-axis-BANbgrI5.js.map +1 -0
- package/dist/xy-axis-CIFok7MF.d.ts +141 -0
- package/dist/xy-axis-CIFok7MF.d.ts.map +1 -0
- package/dist/xy-pad.d.ts +81 -0
- package/dist/xy-pad.d.ts.map +1 -0
- package/dist/xy-pad.js +435 -0
- package/dist/xy-pad.js.map +1 -0
- package/package.json +48 -39
- package/README.md +0 -14
- package/dist/charts/frequency-histogram-plot.d.ts +0 -33
- package/dist/charts/frequency-histogram-plot.d.ts.map +0 -1
- package/dist/charts/frequency-histogram-plot.js +0 -54
- package/dist/charts/frequency-histogram-plot.js.map +0 -1
- package/dist/charts/histogram-vis.d.ts +0 -57
- package/dist/charts/histogram-vis.d.ts.map +0 -1
- package/dist/charts/histogram-vis.js +0 -222
- package/dist/charts/histogram-vis.js.map +0 -1
- package/dist/charts/plot.d.ts +0 -199
- package/dist/charts/plot.d.ts.map +0 -1
- package/dist/charts/plot.js +0 -914
- package/dist/charts/plot.js.map +0 -1
- package/dist/crumb-nav.d.ts +0 -41
- package/dist/crumb-nav.d.ts.map +0 -1
- package/dist/crumb-nav.js +0 -198
- package/dist/crumb-nav.js.map +0 -1
- package/dist/crumb-navigation.d.ts +0 -30
- package/dist/crumb-navigation.d.ts.map +0 -1
- package/dist/crumb-navigation.js +0 -307
- package/dist/crumb-navigation.js.map +0 -1
- package/dist/dial.d.ts +0 -89
- package/dist/dial.d.ts.map +0 -1
- package/dist/dial.js +0 -506
- package/dist/dial.js.map +0 -1
- package/dist/my-element.d.ts +0 -14
- package/dist/my-element.d.ts.map +0 -1
- package/dist/my-element.js +0 -44
- package/dist/my-element.js.map +0 -1
- package/dist/split-layout/split-layout.d.ts +0 -35
- package/dist/split-layout/split-layout.d.ts.map +0 -1
- package/dist/split-layout/split-layout.js +0 -220
- package/dist/split-layout/split-layout.js.map +0 -1
- package/dist/svg-edit-label.d.ts +0 -2
- package/dist/svg-edit-label.d.ts.map +0 -1
- package/dist/svg-edit-label.js +0 -110
- package/dist/svg-edit-label.js.map +0 -1
- package/dist/tabs/tab-layout-item.d.ts +0 -10
- package/dist/tabs/tab-layout-item.d.ts.map +0 -1
- package/dist/tabs/tab-layout-item.js +0 -20
- package/dist/tabs/tab-layout-item.js.map +0 -1
- package/dist/tabs/tab-layout.d.ts +0 -10
- package/dist/tabs/tab-layout.d.ts.map +0 -1
- package/dist/tabs/tab-layout.js +0 -25
- package/dist/tabs/tab-layout.js.map +0 -1
- package/dist/tabs/tab-list-item.d.ts +0 -18
- package/dist/tabs/tab-list-item.d.ts.map +0 -1
- package/dist/tabs/tab-list-item.js +0 -63
- package/dist/tabs/tab-list-item.js.map +0 -1
- package/dist/tabs/tab-list.d.ts +0 -21
- package/dist/tabs/tab-list.d.ts.map +0 -1
- package/dist/tabs/tab-list.js +0 -148
- package/dist/tabs/tab-list.js.map +0 -1
- package/dist/tabs/tab-panel.d.ts +0 -11
- package/dist/tabs/tab-panel.d.ts.map +0 -1
- package/dist/tabs/tab-panel.js +0 -30
- package/dist/tabs/tab-panel.js.map +0 -1
- package/dist/tabs/tab-panels.d.ts +0 -30
- package/dist/tabs/tab-panels.d.ts.map +0 -1
- package/dist/tabs/tab-panels.js +0 -80
- package/dist/tabs/tab-panels.js.map +0 -1
- package/dist/util/circle-arc.d.ts +0 -34
- package/dist/util/circle-arc.d.ts.map +0 -1
- package/dist/util/circle-arc.js +0 -77
- package/dist/util/circle-arc.js.map +0 -1
- package/dist/util/compare.d.ts +0 -53
- package/dist/util/compare.d.ts.map +0 -1
- package/dist/util/compare.js +0 -91
- package/dist/util/compare.js.map +0 -1
- package/dist/util/content-editable.d.ts +0 -2
- package/dist/util/content-editable.d.ts.map +0 -1
- package/dist/util/content-editable.js +0 -13
- package/dist/util/content-editable.js.map +0 -1
- package/dist/util/drag-controller.d.ts +0 -13
- package/dist/util/drag-controller.d.ts.map +0 -1
- package/dist/util/drag-controller.js +0 -21
- package/dist/util/drag-controller.js.map +0 -1
- package/dist/util/key-value.d.ts +0 -5
- package/dist/util/key-value.d.ts.map +0 -1
- package/dist/util/key-value.js +0 -30
- package/dist/util/key-value.js.map +0 -1
- package/dist/util/primitive-types.d.ts +0 -6
- package/dist/util/primitive-types.d.ts.map +0 -1
- package/dist/util/primitive-types.js +0 -2
- package/dist/util/primitive-types.js.map +0 -1
- package/dist/util/svg-editable-text.d.ts +0 -22
- package/dist/util/svg-editable-text.d.ts.map +0 -1
- package/dist/util/svg-editable-text.js +0 -121
- package/dist/util/svg-editable-text.js.map +0 -1
- package/dist/util/time.d.ts +0 -2
- package/dist/util/time.d.ts.map +0 -1
- package/dist/util/time.js +0 -2
- package/dist/util/time.js.map +0 -1
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { n as buildHighlightTargets, r as clearHighlights, t as applyHighlights } from "./highlight-CAjwQ4GE.js";
|
|
2
|
+
import { Fzf } from "fzf";
|
|
3
|
+
//#region src/incr-search/fuzzy.ts
|
|
4
|
+
const defaultSelector = (item) => {
|
|
5
|
+
if (typeof item === `string`) return item;
|
|
6
|
+
const r = item;
|
|
7
|
+
if (typeof r[`label`] === `string`) return r[`label`];
|
|
8
|
+
if (typeof r[`key`] === `string`) return r[`key`];
|
|
9
|
+
if (typeof r[`value`] === `string`) return r[`value`];
|
|
10
|
+
return String(item);
|
|
11
|
+
};
|
|
12
|
+
function createFuzzySearch(items, options = {}) {
|
|
13
|
+
const fzf = new Fzf(items, {
|
|
14
|
+
selector: options.selector ?? defaultSelector,
|
|
15
|
+
...options.fzf ?? {}
|
|
16
|
+
});
|
|
17
|
+
const find = (query) => {
|
|
18
|
+
if (!query.trim()) return items.map((item) => ({
|
|
19
|
+
item,
|
|
20
|
+
positions: /* @__PURE__ */ new Set(),
|
|
21
|
+
score: 0
|
|
22
|
+
}));
|
|
23
|
+
return fzf.find(query).map((r) => ({
|
|
24
|
+
item: r.item,
|
|
25
|
+
positions: r.positions,
|
|
26
|
+
score: r.score
|
|
27
|
+
}));
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
find,
|
|
31
|
+
items
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/incr-search/incr-search.ts
|
|
36
|
+
const buildState = (results, query) => {
|
|
37
|
+
const positionsByItem = /* @__PURE__ */ new Map();
|
|
38
|
+
for (const r of results) positionsByItem.set(r.item, r.positions);
|
|
39
|
+
return Object.freeze({
|
|
40
|
+
query,
|
|
41
|
+
results: Object.freeze([...results]),
|
|
42
|
+
positionsByItem
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
function createIncrSearch(options = {}) {
|
|
46
|
+
let items = options.items ?? [];
|
|
47
|
+
let query = ``;
|
|
48
|
+
let fuzzy = createFuzzySearch(items, {
|
|
49
|
+
selector: options.selector,
|
|
50
|
+
fzf: options.fzf
|
|
51
|
+
});
|
|
52
|
+
let state = buildState(fuzzy.find(query), query);
|
|
53
|
+
let disposed = false;
|
|
54
|
+
const observers = /* @__PURE__ */ new Set();
|
|
55
|
+
if (options.onChange) observers.add(options.onChange);
|
|
56
|
+
const notify = (s) => {
|
|
57
|
+
for (const cb of observers) cb(s);
|
|
58
|
+
};
|
|
59
|
+
const run = async (q, signal) => {
|
|
60
|
+
await Promise.resolve();
|
|
61
|
+
if (signal?.aborted || disposed) return state;
|
|
62
|
+
const results = fuzzy.find(q);
|
|
63
|
+
if (signal?.aborted || disposed) return state;
|
|
64
|
+
state = buildState(results, q);
|
|
65
|
+
notify(state);
|
|
66
|
+
return state;
|
|
67
|
+
};
|
|
68
|
+
return {
|
|
69
|
+
get state() {
|
|
70
|
+
return state;
|
|
71
|
+
},
|
|
72
|
+
async setItems(newItems, signal) {
|
|
73
|
+
items = newItems;
|
|
74
|
+
fuzzy = createFuzzySearch(items, {
|
|
75
|
+
selector: options.selector,
|
|
76
|
+
fzf: options.fzf
|
|
77
|
+
});
|
|
78
|
+
await run(query, signal);
|
|
79
|
+
},
|
|
80
|
+
async setQuery(q, signal) {
|
|
81
|
+
query = q;
|
|
82
|
+
return run(q, signal);
|
|
83
|
+
},
|
|
84
|
+
async clearQuery() {
|
|
85
|
+
query = ``;
|
|
86
|
+
await run(``, void 0);
|
|
87
|
+
},
|
|
88
|
+
onChange(cb) {
|
|
89
|
+
observers.add(cb);
|
|
90
|
+
cb(state);
|
|
91
|
+
return () => {
|
|
92
|
+
observers.delete(cb);
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
dispose() {
|
|
96
|
+
disposed = true;
|
|
97
|
+
observers.clear();
|
|
98
|
+
items = [];
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//#endregion
|
|
103
|
+
//#region src/incr-search/element-search.ts
|
|
104
|
+
const defaultGetLabel = (el) => el.textContent?.trim() ?? ``;
|
|
105
|
+
const defaultGetKey = (el) => el.getAttribute(`data-key`) ?? el.getAttribute(`data-value`) ?? el.textContent?.trim() ?? ``;
|
|
106
|
+
function createElementIncrSearch(opts) {
|
|
107
|
+
const { container, itemSelector, getLabel = defaultGetLabel, getKey = defaultGetKey, labelSelector, highlightKey } = opts;
|
|
108
|
+
let elementByKey = /* @__PURE__ */ new Map();
|
|
109
|
+
const search = createIncrSearch({
|
|
110
|
+
selector: (item) => item.label,
|
|
111
|
+
fzf: opts.fzf
|
|
112
|
+
});
|
|
113
|
+
const updateVisibility = (state) => {
|
|
114
|
+
const matchedKeys = new Set(state.results.map((r) => r.item.key));
|
|
115
|
+
const hasQuery = state.query.trim().length > 0;
|
|
116
|
+
for (const [key, el] of elementByKey) el.hidden = hasQuery ? !matchedKeys.has(key) : false;
|
|
117
|
+
};
|
|
118
|
+
const updateHighlights = (state) => {
|
|
119
|
+
if (!state.query.trim()) {
|
|
120
|
+
clearHighlights({ key: highlightKey });
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
applyHighlights(buildHighlightTargets(container, labelSelector ?? itemSelector, state.positionsByItem, (el) => {
|
|
124
|
+
const key = getKey(el);
|
|
125
|
+
return state.results.find((r) => r.item.key === key)?.item;
|
|
126
|
+
}, (el) => getLabel(el)), { key: highlightKey });
|
|
127
|
+
};
|
|
128
|
+
const unsubscribeState = search.onChange((state) => {
|
|
129
|
+
updateVisibility(state);
|
|
130
|
+
updateHighlights(state);
|
|
131
|
+
opts.onChange?.(state);
|
|
132
|
+
});
|
|
133
|
+
let refreshPending = false;
|
|
134
|
+
const refresh = () => {
|
|
135
|
+
if (refreshPending) return;
|
|
136
|
+
refreshPending = true;
|
|
137
|
+
Promise.resolve().then(() => {
|
|
138
|
+
refreshPending = false;
|
|
139
|
+
elementByKey = /* @__PURE__ */ new Map();
|
|
140
|
+
const els = container.querySelectorAll(itemSelector);
|
|
141
|
+
const items = [];
|
|
142
|
+
for (const el of els) {
|
|
143
|
+
const key = getKey(el);
|
|
144
|
+
elementByKey.set(key, el);
|
|
145
|
+
items.push({
|
|
146
|
+
key,
|
|
147
|
+
label: getLabel(el)
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
search.setItems(items);
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
const observer = new MutationObserver(() => refresh());
|
|
154
|
+
observer.observe(container, {
|
|
155
|
+
childList: true,
|
|
156
|
+
subtree: false
|
|
157
|
+
});
|
|
158
|
+
refresh();
|
|
159
|
+
return {
|
|
160
|
+
async setQuery(query, signal) {
|
|
161
|
+
await search.setQuery(query, signal);
|
|
162
|
+
},
|
|
163
|
+
async clearQuery() {
|
|
164
|
+
await search.clearQuery();
|
|
165
|
+
},
|
|
166
|
+
refresh,
|
|
167
|
+
onChange(cb) {
|
|
168
|
+
return search.onChange(cb);
|
|
169
|
+
},
|
|
170
|
+
dispose() {
|
|
171
|
+
observer.disconnect();
|
|
172
|
+
unsubscribeState();
|
|
173
|
+
search.dispose();
|
|
174
|
+
clearHighlights({ key: highlightKey });
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
//#endregion
|
|
179
|
+
//#region src/incr-search/ac-adapter.ts
|
|
180
|
+
/**
|
|
181
|
+
* Creates an ixfx-ac-text-compatible `completionProvider` function from a
|
|
182
|
+
* static item list. Uses synchronous fuzzy search wrapped in a Promise so it
|
|
183
|
+
* fits the async provider signature.
|
|
184
|
+
*
|
|
185
|
+
* Each returned item has `positions` populated with matched character indices,
|
|
186
|
+
* which `ixfx-ac-text` uses to render CSS Custom Highlights on the label.
|
|
187
|
+
*
|
|
188
|
+
* Empty query returns all items in original order (no positions).
|
|
189
|
+
* A cancelled signal causes the returned promise to reject with an AbortError.
|
|
190
|
+
*/
|
|
191
|
+
function createAcCompletionProvider(items, options = {}) {
|
|
192
|
+
const fuzzy = createFuzzySearch(items, { selector: options.selector ?? ((item) => item.label) });
|
|
193
|
+
return (query, signal) => new Promise((resolve, reject) => {
|
|
194
|
+
if (signal.aborted) {
|
|
195
|
+
reject(new DOMException(`Aborted`, `AbortError`));
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const results = fuzzy.find(query).map((r) => ({
|
|
199
|
+
...r.item,
|
|
200
|
+
positions: r.positions
|
|
201
|
+
}));
|
|
202
|
+
if (signal.aborted) {
|
|
203
|
+
reject(new DOMException(`Aborted`, `AbortError`));
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
resolve(results);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
//#endregion
|
|
210
|
+
//#region src/incr-search/controller-tree.ts
|
|
211
|
+
const DEFAULT_HIGHLIGHT_KEY = `incr-search-highlight`;
|
|
212
|
+
/**
|
|
213
|
+
* Incremental-search controller for any component implementing `TreeSearchHost`
|
|
214
|
+
* (i.e. `ixfx-tree-list`, `ixfx-miller-list`, `ixfx-crumb-navigation`).
|
|
215
|
+
*
|
|
216
|
+
* Replaces the previous separate `IncrSearchTreeController` / `IncrSearchMillerController`
|
|
217
|
+
* classes — the unified `TreeFilterPredicate` (with depth) means one implementation works
|
|
218
|
+
* for all tree-like components.
|
|
219
|
+
*
|
|
220
|
+
* @example Using with ixfx-tree-list:
|
|
221
|
+
* ```typescript
|
|
222
|
+
* const ctrl = new IncrSearchTreeController(myTreeList, {
|
|
223
|
+
* selector: item => item.node.item.label,
|
|
224
|
+
* });
|
|
225
|
+
* ctrl.connect();
|
|
226
|
+
* ```
|
|
227
|
+
*
|
|
228
|
+
* @example Using with ixfx-miller-list (different label selector):
|
|
229
|
+
* ```typescript
|
|
230
|
+
* const ctrl = new IncrSearchTreeController(myMillerList, {
|
|
231
|
+
* selector: item => item.node.item.label,
|
|
232
|
+
* labelSelector: '.label',
|
|
233
|
+
* });
|
|
234
|
+
* ctrl.connect();
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
var IncrSearchTreeController = class {
|
|
238
|
+
#el;
|
|
239
|
+
#opts;
|
|
240
|
+
#search;
|
|
241
|
+
#unsub;
|
|
242
|
+
#labelMap = /* @__PURE__ */ new Map();
|
|
243
|
+
constructor(el, opts) {
|
|
244
|
+
this.#el = el;
|
|
245
|
+
this.#opts = opts;
|
|
246
|
+
this.#search = createIncrSearch({
|
|
247
|
+
selector: opts.selector,
|
|
248
|
+
fzf: opts.fzf
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
connect() {
|
|
252
|
+
this.disconnect();
|
|
253
|
+
const items = this.#el.getNodes();
|
|
254
|
+
for (const item of items) this.#labelMap.set(this.#opts.selector(item), item);
|
|
255
|
+
this.#search.setItems(items);
|
|
256
|
+
if (this.#opts.input) {
|
|
257
|
+
this.#opts.input.addEventListener(`input`, this.#onInput);
|
|
258
|
+
this.#opts.input.addEventListener(`keydown`, this.#onKeydown);
|
|
259
|
+
}
|
|
260
|
+
this.#unsub = this.#search.onChange((state) => this.#onStateChange(state));
|
|
261
|
+
}
|
|
262
|
+
disconnect() {
|
|
263
|
+
if (this.#unsub) {
|
|
264
|
+
this.#unsub();
|
|
265
|
+
this.#unsub = void 0;
|
|
266
|
+
}
|
|
267
|
+
if (this.#opts.input) {
|
|
268
|
+
this.#opts.input.removeEventListener(`input`, this.#onInput);
|
|
269
|
+
this.#opts.input.removeEventListener(`keydown`, this.#onKeydown);
|
|
270
|
+
}
|
|
271
|
+
this.#el.filterPredicate = void 0;
|
|
272
|
+
clearHighlights({ key: this.#opts.highlightKey ?? DEFAULT_HIGHLIGHT_KEY });
|
|
273
|
+
this.#labelMap.clear();
|
|
274
|
+
}
|
|
275
|
+
async setQuery(query) {
|
|
276
|
+
await this.#search.setQuery(query);
|
|
277
|
+
}
|
|
278
|
+
async clearQuery() {
|
|
279
|
+
await this.#search.clearQuery();
|
|
280
|
+
}
|
|
281
|
+
#onInput = () => {
|
|
282
|
+
const value = this.#opts.input?.value ?? ``;
|
|
283
|
+
this.setQuery(value);
|
|
284
|
+
};
|
|
285
|
+
#onKeydown = (e) => {
|
|
286
|
+
if (e.key === `Escape` && this.#opts.input) {
|
|
287
|
+
this.#opts.input.value = ``;
|
|
288
|
+
this.clearQuery();
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
#onStateChange(state) {
|
|
292
|
+
const matched = new Set(state.results.map((r) => r.item.node.item.key));
|
|
293
|
+
const hasQuery = state.query.trim().length > 0;
|
|
294
|
+
this.#el.filterPredicate = hasQuery && matched.size > 0 ? (node, _depth) => matched.has(node.item.key) : void 0;
|
|
295
|
+
const key = this.#opts.highlightKey ?? DEFAULT_HIGHLIGHT_KEY;
|
|
296
|
+
if (!this.#el.shadowRoot) return;
|
|
297
|
+
if (!state.query.trim()) {
|
|
298
|
+
clearHighlights({ key });
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const labelSelector = this.#opts.labelSelector ?? `.tree-label`;
|
|
302
|
+
applyHighlights(buildHighlightTargets(this.#el.shadowRoot, labelSelector, state.positionsByItem, (labelEl) => {
|
|
303
|
+
const text = labelEl.textContent ?? ``;
|
|
304
|
+
return this.#labelMap.get(text);
|
|
305
|
+
}, (labelEl) => labelEl.textContent ?? ``), { key });
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
//#endregion
|
|
309
|
+
export { createFuzzySearch as a, createIncrSearch as i, createAcCompletionProvider as n, createElementIncrSearch as r, IncrSearchTreeController as t };
|
|
310
|
+
|
|
311
|
+
//# sourceMappingURL=incr-search-BjCNClnC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incr-search-BjCNClnC.js","names":["FzfAny","#el","#opts","#search","#labelMap","#onInput","#onKeydown","#unsub","#onStateChange"],"sources":["../src/incr-search/fuzzy.ts","../src/incr-search/incr-search.ts","../src/incr-search/element-search.ts","../src/incr-search/ac-adapter.ts","../src/incr-search/controller-tree.ts"],"sourcesContent":["import { Fzf } from 'fzf';\nimport type { FuzzySearch, FuzzySearchOptions, IncrSearchResult } from './types.js';\n\nconst defaultSelector = <T>(item: T): string => {\n if (typeof item === `string`) return item;\n const r = item as Record<string, unknown>;\n if (typeof r[`label`] === `string`) return r[`label`];\n if (typeof r[`key`] === `string`) return r[`key`];\n if (typeof r[`value`] === `string`) return r[`value`];\n return String(item);\n};\n\nexport function createFuzzySearch<T>(\n items: readonly T[],\n options: FuzzySearchOptions<T> = {},\n): FuzzySearch<T> {\n const selector = options.selector ?? defaultSelector<T>;\n // fzf uses a conditional SyncOptionsTuple<T> rest-parameter overload that TypeScript\n // cannot narrow through a spread when T is generic.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const FzfAny = Fzf as new (list: readonly T[], opts: any) => { find(q: string): { item: T; positions: ReadonlySet<number>; score: number }[] };\n const fzf = new FzfAny(items as readonly T[], { selector, ...(options.fzf ?? {}) });\n\n const find = (query: string): readonly IncrSearchResult<T>[] => {\n if (!query.trim()) {\n return items.map(item => ({\n item,\n positions: new Set<number>(),\n score: 0,\n }));\n }\n return fzf.find(query).map(r => ({\n item: r.item,\n positions: r.positions,\n score: r.score,\n }));\n };\n\n return { find, items };\n}\n","import type {\n IncrSearch,\n IncrSearchChangeCallback,\n IncrSearchOptions,\n IncrSearchState,\n} from './types.js';\nimport { createFuzzySearch } from './fuzzy.js';\n\nconst buildState = <T>(\n results: ReturnType<ReturnType<typeof createFuzzySearch<T>>[`find`]>,\n query: string,\n): IncrSearchState<T> => {\n const positionsByItem = new Map<T, ReadonlySet<number>>();\n for (const r of results) {\n positionsByItem.set(r.item, r.positions);\n }\n return Object.freeze({\n query,\n results: Object.freeze([...results]),\n positionsByItem,\n });\n};\n\nexport function createIncrSearch<T>(options: IncrSearchOptions<T> = {}): IncrSearch<T> {\n let items: readonly T[] = options.items ?? [];\n let query = ``;\n let fuzzy = createFuzzySearch(items, { selector: options.selector, fzf: options.fzf });\n let state: IncrSearchState<T> = buildState(fuzzy.find(query), query);\n let disposed = false;\n\n const observers = new Set<IncrSearchChangeCallback<T>>();\n\n if (options.onChange) {\n observers.add(options.onChange);\n }\n\n const notify = (s: IncrSearchState<T>): void => {\n for (const cb of observers) {\n cb(s);\n }\n };\n\n const run = async (q: string, signal?: AbortSignal): Promise<IncrSearchState<T>> => {\n // Yield to the microtask queue for a consistent async interface\n await Promise.resolve();\n if (signal?.aborted || disposed) {\n return state;\n }\n const results = fuzzy.find(q);\n if (signal?.aborted || disposed) {\n return state;\n }\n state = buildState(results, q);\n notify(state);\n return state;\n };\n\n return {\n get state() {\n return state;\n },\n\n async setItems(newItems: readonly T[], signal?: AbortSignal): Promise<void> {\n items = newItems;\n fuzzy = createFuzzySearch(items, { selector: options.selector, fzf: options.fzf });\n await run(query, signal);\n },\n\n async setQuery(q: string, signal?: AbortSignal): Promise<IncrSearchState<T>> {\n query = q;\n return run(q, signal);\n },\n\n async clearQuery(): Promise<void> {\n query = ``;\n await run(``, undefined);\n },\n\n onChange(cb: IncrSearchChangeCallback<T>): () => void {\n observers.add(cb);\n cb(state);\n return () => {\n observers.delete(cb);\n };\n },\n\n dispose(): void {\n disposed = true;\n observers.clear();\n items = [];\n },\n };\n}\n","import type {\n ElementIncrSearchOptions,\n IncrSearchChangeCallback,\n IncrSearchState,\n} from './types.js';\nimport { createIncrSearch } from './incr-search.js';\nimport { applyHighlights, buildHighlightTargets, clearHighlights } from './highlight.js';\n\ntype ElementItem = { readonly key: string; readonly label: string };\n\nconst defaultGetLabel = (el: Element): string => el.textContent?.trim() ?? ``;\n\nconst defaultGetKey = (el: Element): string =>\n el.getAttribute(`data-key`)\n ?? el.getAttribute(`data-value`)\n ?? el.textContent?.trim()\n ?? ``;\n\nexport type ElementIncrSearch = {\n readonly setQuery: (query: string, signal?: AbortSignal) => Promise<void>;\n readonly clearQuery: () => Promise<void>;\n readonly refresh: () => void;\n readonly onChange: (cb: IncrSearchChangeCallback<ElementItem>) => () => void;\n readonly dispose: () => void;\n};\n\nexport function createElementIncrSearch(opts: ElementIncrSearchOptions): ElementIncrSearch {\n const {\n container,\n itemSelector,\n getLabel = defaultGetLabel,\n getKey = defaultGetKey,\n labelSelector,\n highlightKey,\n } = opts;\n\n // Map from key → element reference for highlight lookup\n let elementByKey = new Map<string, Element>();\n\n const search = createIncrSearch<ElementItem>({\n selector: item => item.label,\n fzf: opts.fzf,\n });\n\n const updateVisibility = (state: IncrSearchState<ElementItem>): void => {\n const matchedKeys = new Set(state.results.map(r => r.item.key));\n const hasQuery = state.query.trim().length > 0;\n\n for (const [key, el] of elementByKey) {\n (el as HTMLElement).hidden = hasQuery ? !matchedKeys.has(key) : false;\n }\n };\n\n const updateHighlights = (state: IncrSearchState<ElementItem>): void => {\n if (!state.query.trim()) {\n clearHighlights({ key: highlightKey });\n return;\n }\n\n const sel = labelSelector ?? itemSelector;\n const targets = buildHighlightTargets(\n container,\n sel,\n state.positionsByItem,\n el => {\n const key = getKey(el);\n // Find the ElementItem whose key matches this element's key\n const result = state.results.find(r => r.item.key === key);\n return result?.item;\n },\n el => getLabel(el),\n );\n applyHighlights(targets, { key: highlightKey });\n };\n\n const unsubscribeState = search.onChange(state => {\n updateVisibility(state);\n updateHighlights(state);\n opts.onChange?.(state);\n });\n\n let refreshPending = false;\n\n const refresh = (): void => {\n if (refreshPending) return;\n refreshPending = true;\n void Promise.resolve().then(() => {\n refreshPending = false;\n elementByKey = new Map<string, Element>();\n const els = container.querySelectorAll(itemSelector);\n const items: ElementItem[] = [];\n for (const el of els) {\n const key = getKey(el);\n elementByKey.set(key, el);\n items.push({ key, label: getLabel(el) });\n }\n void search.setItems(items);\n });\n };\n\n const observer = new MutationObserver(() => refresh());\n observer.observe(container, { childList: true, subtree: false });\n\n refresh();\n\n return {\n async setQuery(query, signal) {\n await search.setQuery(query, signal);\n },\n\n async clearQuery() {\n await search.clearQuery();\n },\n\n refresh,\n\n onChange(cb) {\n return search.onChange(cb);\n },\n\n dispose() {\n observer.disconnect();\n unsubscribeState();\n search.dispose();\n clearHighlights({ key: highlightKey });\n },\n };\n}\n","import { createFuzzySearch } from './fuzzy.js';\nimport type { FuzzySearchOptions } from './types.js';\n\n/**\n * Creates an ixfx-ac-text-compatible `completionProvider` function from a\n * static item list. Uses synchronous fuzzy search wrapped in a Promise so it\n * fits the async provider signature.\n *\n * Each returned item has `positions` populated with matched character indices,\n * which `ixfx-ac-text` uses to render CSS Custom Highlights on the label.\n *\n * Empty query returns all items in original order (no positions).\n * A cancelled signal causes the returned promise to reject with an AbortError.\n */\nexport function createAcCompletionProvider<T extends { label: string }>(\n items: readonly T[],\n options: Pick<FuzzySearchOptions<T>, `selector`> = {},\n): (query: string, signal: AbortSignal) => Promise<(T & { positions: ReadonlySet<number> })[]> {\n const selector = options.selector ?? ((item: T) => item.label);\n const fuzzy = createFuzzySearch(items, { selector });\n\n return (\n query: string,\n signal: AbortSignal,\n ): Promise<(T & { positions: ReadonlySet<number> })[]> =>\n new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException(`Aborted`, `AbortError`));\n return;\n }\n\n const results = fuzzy.find(query).map(r => ({ ...r.item, positions: r.positions }));\n\n if (signal.aborted) {\n reject(new DOMException(`Aborted`, `AbortError`));\n return;\n }\n\n resolve(results);\n });\n}\n","import type { FzfOptions } from 'fzf';\nimport type { IncrSearchState } from './types.js';\nimport { createIncrSearch } from './incr-search.js';\nimport { applyHighlights, clearHighlights, buildHighlightTargets } from './highlight.js';\nimport type { TreeSearchHost } from '../common/searchable.js';\nimport type { TreeNode } from '../common/types.js';\n\nconst DEFAULT_HIGHLIGHT_KEY = `incr-search-highlight`;\n\nexport type IncrSearchTreeOptions = {\n selector: (item: { node: TreeNode; depth: number }) => string;\n /**\n * CSS selector for the label elements inside the shadow root.\n * Defaults to `.tree-label` (suitable for ixfx-tree-list).\n * Use `.label` for ixfx-miller-list.\n */\n labelSelector?: string;\n highlightKey?: string;\n input?: HTMLInputElement;\n fzf?: Partial<FzfOptions<{ node: TreeNode; depth: number }>>;\n};\n\ntype SearchItem = { node: TreeNode; depth: number };\n\n/**\n * Incremental-search controller for any component implementing `TreeSearchHost`\n * (i.e. `ixfx-tree-list`, `ixfx-miller-list`, `ixfx-crumb-navigation`).\n *\n * Replaces the previous separate `IncrSearchTreeController` / `IncrSearchMillerController`\n * classes — the unified `TreeFilterPredicate` (with depth) means one implementation works\n * for all tree-like components.\n *\n * @example Using with ixfx-tree-list:\n * ```typescript\n * const ctrl = new IncrSearchTreeController(myTreeList, {\n * selector: item => item.node.item.label,\n * });\n * ctrl.connect();\n * ```\n *\n * @example Using with ixfx-miller-list (different label selector):\n * ```typescript\n * const ctrl = new IncrSearchTreeController(myMillerList, {\n * selector: item => item.node.item.label,\n * labelSelector: '.label',\n * });\n * ctrl.connect();\n * ```\n */\nexport class IncrSearchTreeController {\n #el: TreeSearchHost;\n #opts: IncrSearchTreeOptions;\n #search: ReturnType<typeof createIncrSearch<SearchItem>>;\n #unsub: (() => void) | undefined;\n #labelMap = new Map<string, SearchItem>();\n\n constructor(el: TreeSearchHost, opts: IncrSearchTreeOptions) {\n this.#el = el;\n this.#opts = opts;\n this.#search = createIncrSearch<SearchItem>({\n selector: opts.selector,\n fzf: opts.fzf,\n });\n }\n\n connect(): void {\n this.disconnect();\n\n const items = this.#el.getNodes();\n for (const item of items) {\n this.#labelMap.set(this.#opts.selector(item), item);\n }\n void this.#search.setItems(items);\n\n if (this.#opts.input) {\n this.#opts.input.addEventListener(`input`, this.#onInput);\n this.#opts.input.addEventListener(`keydown`, this.#onKeydown);\n }\n\n this.#unsub = this.#search.onChange(state => this.#onStateChange(state));\n }\n\n disconnect(): void {\n if (this.#unsub) {\n this.#unsub();\n this.#unsub = undefined;\n }\n if (this.#opts.input) {\n this.#opts.input.removeEventListener(`input`, this.#onInput);\n this.#opts.input.removeEventListener(`keydown`, this.#onKeydown);\n }\n this.#el.filterPredicate = undefined;\n clearHighlights({ key: this.#opts.highlightKey ?? DEFAULT_HIGHLIGHT_KEY });\n this.#labelMap.clear();\n }\n\n async setQuery(query: string): Promise<void> {\n await this.#search.setQuery(query);\n }\n\n async clearQuery(): Promise<void> {\n await this.#search.clearQuery();\n }\n\n #onInput = () => {\n const value = this.#opts.input?.value ?? ``;\n void this.setQuery(value);\n };\n\n #onKeydown = (e: KeyboardEvent) => {\n if (e.key === `Escape` && this.#opts.input) {\n this.#opts.input.value = ``;\n void this.clearQuery();\n }\n };\n\n #onStateChange(state: IncrSearchState<SearchItem>): void {\n const matched = new Set(state.results.map(r => r.item.node.item.key));\n const hasQuery = state.query.trim().length > 0;\n this.#el.filterPredicate = hasQuery && matched.size > 0\n ? (node: TreeNode, _depth: number) => matched.has(node.item.key)\n : undefined;\n\n const key = this.#opts.highlightKey ?? DEFAULT_HIGHLIGHT_KEY;\n if (!this.#el.shadowRoot) return;\n\n if (!state.query.trim()) {\n clearHighlights({ key });\n return;\n }\n\n const labelSelector = this.#opts.labelSelector ?? `.tree-label`;\n const targets = buildHighlightTargets(\n this.#el.shadowRoot,\n labelSelector,\n state.positionsByItem,\n (labelEl) => {\n const text = labelEl.textContent ?? ``;\n return this.#labelMap.get(text);\n },\n (labelEl) => labelEl.textContent ?? ``,\n );\n applyHighlights(targets, { key });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { _ as IncrSearchChangeCallback, a as createElementIncrSearch, b as IncrSearchState, c as clearHighlights, d as ElementIncrSearchOptions, f as FuzzySearch, g as IncrSearch, h as HighlightTarget, i as ElementIncrSearch, l as createIncrSearch, m as HighlightOptions, n as IncrSearchTreeOptions, o as applyHighlights, p as FuzzySearchOptions, r as createAcCompletionProvider, s as buildHighlightTargets, t as IncrSearchTreeController, u as createFuzzySearch, v as IncrSearchOptions, y as IncrSearchResult } from "./index-C9iBN908.js";
|
|
2
|
+
export { ElementIncrSearch, ElementIncrSearchOptions, FuzzySearch, FuzzySearchOptions, HighlightOptions, HighlightTarget, IncrSearch, IncrSearchChangeCallback, IncrSearchTreeController as IncrSearchMillerController, IncrSearchTreeController, IncrSearchTreeOptions as IncrSearchMillerOptions, IncrSearchTreeOptions, IncrSearchOptions, IncrSearchResult, IncrSearchState, applyHighlights, buildHighlightTargets, clearHighlights, createAcCompletionProvider, createElementIncrSearch, createFuzzySearch, createIncrSearch };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { n as buildHighlightTargets, r as clearHighlights, t as applyHighlights } from "./highlight-CAjwQ4GE.js";
|
|
2
|
+
import { a as createFuzzySearch, i as createIncrSearch, n as createAcCompletionProvider, r as createElementIncrSearch, t as IncrSearchTreeController } from "./incr-search-BjCNClnC.js";
|
|
3
|
+
export { IncrSearchTreeController as IncrSearchMillerController, IncrSearchTreeController, applyHighlights, buildHighlightTargets, clearHighlights, createAcCompletionProvider, createElementIncrSearch, createFuzzySearch, createIncrSearch };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
//#region src/icons/defaults.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Chevron pointing down. Used for split-button dropdown toggle.
|
|
4
|
+
* fill="currentColor" so it inherits CSS color.
|
|
5
|
+
*/
|
|
6
|
+
declare const ICON_CHEVRON_DOWN = "<svg viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"/></svg>";
|
|
7
|
+
/**
|
|
8
|
+
* Caret pointing right. Used for tree-basic expand indicator as a CSS mask.
|
|
9
|
+
* fill="black" is correct for CSS mask-image use (shape only, color comes from background-color).
|
|
10
|
+
*/
|
|
11
|
+
declare const ICON_CARET_RIGHT = "<svg viewBox=\"0 0 24 24\" fill=\"black\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 7l6 5-6 5V7z\"/></svg>";
|
|
12
|
+
/**
|
|
13
|
+
* Checkmark. Useful for menu-check-item or confirmation states.
|
|
14
|
+
* fill="currentColor" so it inherits CSS color.
|
|
15
|
+
*/
|
|
16
|
+
declare const ICON_CHECK = "<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\"/></svg>";
|
|
17
|
+
/**
|
|
18
|
+
* Close / X icon. Useful for dialogs, notifications, dismissible elements.
|
|
19
|
+
* fill="currentColor" so it inherits CSS color.
|
|
20
|
+
*/
|
|
21
|
+
declare const ICON_CLOSE = "<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\"/></svg>";
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/icons/registry.d.ts
|
|
24
|
+
declare const iconBus: EventTarget;
|
|
25
|
+
type IconChangedDetail = {
|
|
26
|
+
readonly name: string;
|
|
27
|
+
};
|
|
28
|
+
type IconChangedEvent = CustomEvent<IconChangedDetail>;
|
|
29
|
+
declare function registerIcon(name: string, svg: string): void;
|
|
30
|
+
declare function getIcon(name: string): string | undefined;
|
|
31
|
+
declare function hasIcon(name: string): boolean;
|
|
32
|
+
/** Converts an SVG string to a CSS data-URI value, e.g. for use as a mask-image. */
|
|
33
|
+
declare function svgToDataUri(svg: string): string;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { iconBus as a, ICON_CARET_RIGHT as c, ICON_CLOSE as d, hasIcon as i, ICON_CHECK as l, IconChangedEvent as n, registerIcon as o, getIcon as r, svgToDataUri as s, IconChangedDetail as t, ICON_CHEVRON_DOWN as u };
|
|
36
|
+
//# sourceMappingURL=index-B1hNR7Z9.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-B1hNR7Z9.d.ts","names":[],"sources":["../src/icons/defaults.ts","../src/icons/registry.ts"],"mappings":";;;;AAMA;cAAa,iBAAA;;;;AAMb;cAAa,gBAAA;;;;AAMb;cAAa,UAAA;;;;AAMb;cAAa,UAAA;;;cCtBA,OAAA,EAAO,WAAA;AAAA,KAER,iBAAA;EAAA,SAA+B,IAAA;AAAA;AAAA,KAC/B,gBAAA,GAAmB,WAAA,CAAY,iBAAA;AAAA,iBAE3B,YAAA,CAAa,IAAA,UAAc,GAAA;AAAA,iBAK3B,OAAA,CAAQ,IAAA;AAAA,iBAIR,OAAA,CAAQ,IAAA;ADJxB;AAAA,iBCSgB,YAAA,CAAa,GAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { t as LabelledInputBase } from "./labelled-input-base-DnRh4reU.js";
|
|
2
|
+
import * as _$lit from "lit";
|
|
3
|
+
import { CSSResultGroup } from "lit";
|
|
4
|
+
|
|
5
|
+
//#region src/labelled-range-input/labelled-range-input.d.ts
|
|
6
|
+
declare class LabelledRangeInput extends LabelledInputBase {
|
|
7
|
+
readonly inputSelector = "ixfx-range-input";
|
|
8
|
+
orientation: `horizontal` | `vertical`;
|
|
9
|
+
tooltip: boolean;
|
|
10
|
+
noTooltip: boolean;
|
|
11
|
+
tooltipOrientation: `top` | `right`;
|
|
12
|
+
switchHeight: number;
|
|
13
|
+
render(): _$lit.TemplateResult<1>;
|
|
14
|
+
static styles: CSSResultGroup;
|
|
15
|
+
}
|
|
16
|
+
declare global {
|
|
17
|
+
interface HTMLElementTagNameMap {
|
|
18
|
+
'ixfx-labelled-range-input': LabelledRangeInput;
|
|
19
|
+
}
|
|
20
|
+
} //# sourceMappingURL=labelled-range-input.d.ts.map
|
|
21
|
+
//#endregion
|
|
22
|
+
export { LabelledRangeInput as t };
|
|
23
|
+
//# sourceMappingURL=index-C5dK8RZa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-C5dK8RZa.d.ts","names":[],"sources":["../src/labelled-range-input/labelled-range-input.ts"],"mappings":";;;;;cAoEa,kBAAA,SAA2B,iBAAA;EAAA,SAC7B,aAAA;EAEmB,WAAA;EACC,OAAA;EACyB,SAAA;EACQ,kBAAA;EAEN,YAAA;EAE/C,MAAA,CAAA,GAVqB,KAAA,CAUf,cAAA;EAAA,OA0BR,MAAA,EAAQ,cAAA;AAAA;AAAA,QA2ET,MAAA;EAAA,UACI,qBAAA;IACR,2BAAA,EAA6B,kBAAA;EAAA;AAAA"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { C as TreeNode, d as TreeSearchHost } from "./tree-component-CQpoPo4s.js";
|
|
2
|
+
import { FzfOptions } from "fzf";
|
|
3
|
+
|
|
4
|
+
//#region src/incr-search/types.d.ts
|
|
5
|
+
type IncrSearchResult<T> = {
|
|
6
|
+
readonly item: T;
|
|
7
|
+
readonly positions: ReadonlySet<number>;
|
|
8
|
+
readonly score: number;
|
|
9
|
+
};
|
|
10
|
+
type IncrSearchState<T> = {
|
|
11
|
+
readonly query: string;
|
|
12
|
+
readonly results: readonly IncrSearchResult<T>[];
|
|
13
|
+
readonly positionsByItem: ReadonlyMap<T, ReadonlySet<number>>;
|
|
14
|
+
};
|
|
15
|
+
type IncrSearchChangeCallback<T> = (state: IncrSearchState<T>) => void;
|
|
16
|
+
type IncrSearchOptions<T> = {
|
|
17
|
+
readonly items?: readonly T[];
|
|
18
|
+
readonly selector?: (item: T) => string;
|
|
19
|
+
readonly fzf?: Partial<FzfOptions<T>>;
|
|
20
|
+
readonly onChange?: IncrSearchChangeCallback<T>;
|
|
21
|
+
};
|
|
22
|
+
type IncrSearch<T> = {
|
|
23
|
+
readonly setItems: (items: readonly T[], signal?: AbortSignal) => Promise<void>;
|
|
24
|
+
readonly setQuery: (query: string, signal?: AbortSignal) => Promise<IncrSearchState<T>>;
|
|
25
|
+
readonly clearQuery: () => Promise<void>;
|
|
26
|
+
readonly state: IncrSearchState<T>;
|
|
27
|
+
readonly onChange: (cb: IncrSearchChangeCallback<T>) => () => void;
|
|
28
|
+
readonly dispose: () => void;
|
|
29
|
+
};
|
|
30
|
+
type FuzzySearchOptions<T> = {
|
|
31
|
+
readonly selector?: (item: T) => string;
|
|
32
|
+
readonly fzf?: Partial<FzfOptions<T>>;
|
|
33
|
+
};
|
|
34
|
+
type FuzzySearch<T> = {
|
|
35
|
+
readonly find: (query: string) => readonly IncrSearchResult<T>[];
|
|
36
|
+
readonly items: readonly T[];
|
|
37
|
+
};
|
|
38
|
+
type HighlightTarget = {
|
|
39
|
+
readonly element: Element;
|
|
40
|
+
readonly text?: string;
|
|
41
|
+
readonly positions: ReadonlySet<number>;
|
|
42
|
+
};
|
|
43
|
+
type HighlightOptions = {
|
|
44
|
+
readonly key?: string;
|
|
45
|
+
};
|
|
46
|
+
type ElementIncrSearchOptions = {
|
|
47
|
+
readonly container: Element;
|
|
48
|
+
readonly itemSelector: string;
|
|
49
|
+
readonly getLabel?: (el: Element) => string;
|
|
50
|
+
readonly getKey?: (el: Element) => string;
|
|
51
|
+
readonly labelSelector?: string;
|
|
52
|
+
readonly highlightKey?: string;
|
|
53
|
+
readonly fzf?: Partial<FzfOptions<{
|
|
54
|
+
key: string;
|
|
55
|
+
label: string;
|
|
56
|
+
}>>;
|
|
57
|
+
readonly onChange?: IncrSearchChangeCallback<{
|
|
58
|
+
key: string;
|
|
59
|
+
label: string;
|
|
60
|
+
}>;
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/incr-search/fuzzy.d.ts
|
|
64
|
+
declare function createFuzzySearch<T>(items: readonly T[], options?: FuzzySearchOptions<T>): FuzzySearch<T>;
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region src/incr-search/incr-search.d.ts
|
|
67
|
+
declare function createIncrSearch<T>(options?: IncrSearchOptions<T>): IncrSearch<T>;
|
|
68
|
+
//#endregion
|
|
69
|
+
//#region src/incr-search/highlight.d.ts
|
|
70
|
+
declare function applyHighlights(targets: readonly HighlightTarget[], options?: HighlightOptions): void;
|
|
71
|
+
declare function clearHighlights(options?: HighlightOptions): void;
|
|
72
|
+
declare function buildHighlightTargets<T>(root: ShadowRoot | Element, itemSelector: string, positionsByItem: ReadonlyMap<T, ReadonlySet<number>>, getItem: (el: Element) => T | undefined, getText: (el: Element) => string): HighlightTarget[];
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/incr-search/element-search.d.ts
|
|
75
|
+
type ElementItem = {
|
|
76
|
+
readonly key: string;
|
|
77
|
+
readonly label: string;
|
|
78
|
+
};
|
|
79
|
+
type ElementIncrSearch = {
|
|
80
|
+
readonly setQuery: (query: string, signal?: AbortSignal) => Promise<void>;
|
|
81
|
+
readonly clearQuery: () => Promise<void>;
|
|
82
|
+
readonly refresh: () => void;
|
|
83
|
+
readonly onChange: (cb: IncrSearchChangeCallback<ElementItem>) => () => void;
|
|
84
|
+
readonly dispose: () => void;
|
|
85
|
+
};
|
|
86
|
+
declare function createElementIncrSearch(opts: ElementIncrSearchOptions): ElementIncrSearch;
|
|
87
|
+
//#endregion
|
|
88
|
+
//#region src/incr-search/ac-adapter.d.ts
|
|
89
|
+
/**
|
|
90
|
+
* Creates an ixfx-ac-text-compatible `completionProvider` function from a
|
|
91
|
+
* static item list. Uses synchronous fuzzy search wrapped in a Promise so it
|
|
92
|
+
* fits the async provider signature.
|
|
93
|
+
*
|
|
94
|
+
* Each returned item has `positions` populated with matched character indices,
|
|
95
|
+
* which `ixfx-ac-text` uses to render CSS Custom Highlights on the label.
|
|
96
|
+
*
|
|
97
|
+
* Empty query returns all items in original order (no positions).
|
|
98
|
+
* A cancelled signal causes the returned promise to reject with an AbortError.
|
|
99
|
+
*/
|
|
100
|
+
declare function createAcCompletionProvider<T extends {
|
|
101
|
+
label: string;
|
|
102
|
+
}>(items: readonly T[], options?: Pick<FuzzySearchOptions<T>, `selector`>): (query: string, signal: AbortSignal) => Promise<(T & {
|
|
103
|
+
positions: ReadonlySet<number>;
|
|
104
|
+
})[]>;
|
|
105
|
+
//#endregion
|
|
106
|
+
//#region src/incr-search/controller-tree.d.ts
|
|
107
|
+
type IncrSearchTreeOptions = {
|
|
108
|
+
selector: (item: {
|
|
109
|
+
node: TreeNode;
|
|
110
|
+
depth: number;
|
|
111
|
+
}) => string;
|
|
112
|
+
/**
|
|
113
|
+
* CSS selector for the label elements inside the shadow root.
|
|
114
|
+
* Defaults to `.tree-label` (suitable for ixfx-tree-list).
|
|
115
|
+
* Use `.label` for ixfx-miller-list.
|
|
116
|
+
*/
|
|
117
|
+
labelSelector?: string;
|
|
118
|
+
highlightKey?: string;
|
|
119
|
+
input?: HTMLInputElement;
|
|
120
|
+
fzf?: Partial<FzfOptions<{
|
|
121
|
+
node: TreeNode;
|
|
122
|
+
depth: number;
|
|
123
|
+
}>>;
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Incremental-search controller for any component implementing `TreeSearchHost`
|
|
127
|
+
* (i.e. `ixfx-tree-list`, `ixfx-miller-list`, `ixfx-crumb-navigation`).
|
|
128
|
+
*
|
|
129
|
+
* Replaces the previous separate `IncrSearchTreeController` / `IncrSearchMillerController`
|
|
130
|
+
* classes — the unified `TreeFilterPredicate` (with depth) means one implementation works
|
|
131
|
+
* for all tree-like components.
|
|
132
|
+
*
|
|
133
|
+
* @example Using with ixfx-tree-list:
|
|
134
|
+
* ```typescript
|
|
135
|
+
* const ctrl = new IncrSearchTreeController(myTreeList, {
|
|
136
|
+
* selector: item => item.node.item.label,
|
|
137
|
+
* });
|
|
138
|
+
* ctrl.connect();
|
|
139
|
+
* ```
|
|
140
|
+
*
|
|
141
|
+
* @example Using with ixfx-miller-list (different label selector):
|
|
142
|
+
* ```typescript
|
|
143
|
+
* const ctrl = new IncrSearchTreeController(myMillerList, {
|
|
144
|
+
* selector: item => item.node.item.label,
|
|
145
|
+
* labelSelector: '.label',
|
|
146
|
+
* });
|
|
147
|
+
* ctrl.connect();
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
declare class IncrSearchTreeController {
|
|
151
|
+
#private;
|
|
152
|
+
constructor(el: TreeSearchHost, opts: IncrSearchTreeOptions);
|
|
153
|
+
connect(): void;
|
|
154
|
+
disconnect(): void;
|
|
155
|
+
setQuery(query: string): Promise<void>;
|
|
156
|
+
clearQuery(): Promise<void>;
|
|
157
|
+
}
|
|
158
|
+
//#endregion
|
|
159
|
+
export { IncrSearchChangeCallback as _, createElementIncrSearch as a, IncrSearchState as b, clearHighlights as c, ElementIncrSearchOptions as d, FuzzySearch as f, IncrSearch as g, HighlightTarget as h, ElementIncrSearch as i, createIncrSearch as l, HighlightOptions as m, IncrSearchTreeOptions as n, applyHighlights as o, FuzzySearchOptions as p, createAcCompletionProvider as r, buildHighlightTargets as s, IncrSearchTreeController as t, createFuzzySearch as u, IncrSearchOptions as v, IncrSearchResult as y };
|
|
160
|
+
//# sourceMappingURL=index-C9iBN908.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-C9iBN908.d.ts","names":[],"sources":["../src/incr-search/types.ts","../src/incr-search/fuzzy.ts","../src/incr-search/incr-search.ts","../src/incr-search/highlight.ts","../src/incr-search/element-search.ts","../src/incr-search/ac-adapter.ts","../src/incr-search/controller-tree.ts"],"mappings":"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"}
|