@ixfx/components 0.0.2
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 +21 -0
- package/README.md +2 -0
- package/dist/charts/frequency-histogram-plot.d.ts +33 -0
- package/dist/charts/frequency-histogram-plot.d.ts.map +1 -0
- package/dist/charts/frequency-histogram-plot.js +54 -0
- package/dist/charts/frequency-histogram-plot.js.map +1 -0
- package/dist/charts/histogram-vis.d.ts +57 -0
- package/dist/charts/histogram-vis.d.ts.map +1 -0
- package/dist/charts/histogram-vis.js +222 -0
- package/dist/charts/histogram-vis.js.map +1 -0
- package/dist/charts/plot.d.ts +128 -0
- package/dist/charts/plot.d.ts.map +1 -0
- package/dist/charts/plot.js +456 -0
- package/dist/charts/plot.js.map +1 -0
- package/dist/crumb-nav.d.ts +41 -0
- package/dist/crumb-nav.d.ts.map +1 -0
- package/dist/crumb-nav.js +198 -0
- package/dist/crumb-nav.js.map +1 -0
- package/dist/crumb-navigation.d.ts +30 -0
- package/dist/crumb-navigation.d.ts.map +1 -0
- package/dist/crumb-navigation.js +307 -0
- package/dist/crumb-navigation.js.map +1 -0
- package/dist/data-display.d.ts +15 -0
- package/dist/data-display.d.ts.map +1 -0
- package/dist/data-display.js +110 -0
- package/dist/data-display.js.map +1 -0
- package/dist/dial.d.ts +89 -0
- package/dist/dial.d.ts.map +1 -0
- package/dist/dial.js +506 -0
- package/dist/dial.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/my-element.d.ts +14 -0
- package/dist/my-element.d.ts.map +1 -0
- package/dist/my-element.js +44 -0
- package/dist/my-element.js.map +1 -0
- package/dist/selecthorizontal.d.ts +12 -0
- package/dist/selecthorizontal.d.ts.map +1 -0
- package/dist/selecthorizontal.js +46 -0
- package/dist/selecthorizontal.js.map +1 -0
- package/dist/split-layout/split-layout.d.ts +35 -0
- package/dist/split-layout/split-layout.d.ts.map +1 -0
- package/dist/split-layout/split-layout.js +220 -0
- package/dist/split-layout/split-layout.js.map +1 -0
- package/dist/svg-edit-label.d.ts +2 -0
- package/dist/svg-edit-label.d.ts.map +1 -0
- package/dist/svg-edit-label.js +110 -0
- package/dist/svg-edit-label.js.map +1 -0
- package/dist/tabs/tab-layout-item.d.ts +10 -0
- package/dist/tabs/tab-layout-item.d.ts.map +1 -0
- package/dist/tabs/tab-layout-item.js +20 -0
- package/dist/tabs/tab-layout-item.js.map +1 -0
- package/dist/tabs/tab-layout.d.ts +10 -0
- package/dist/tabs/tab-layout.d.ts.map +1 -0
- package/dist/tabs/tab-layout.js +25 -0
- package/dist/tabs/tab-layout.js.map +1 -0
- package/dist/tabs/tab-list-item.d.ts +18 -0
- package/dist/tabs/tab-list-item.d.ts.map +1 -0
- package/dist/tabs/tab-list-item.js +63 -0
- package/dist/tabs/tab-list-item.js.map +1 -0
- package/dist/tabs/tab-list.d.ts +21 -0
- package/dist/tabs/tab-list.d.ts.map +1 -0
- package/dist/tabs/tab-list.js +148 -0
- package/dist/tabs/tab-list.js.map +1 -0
- package/dist/tabs/tab-panel.d.ts +11 -0
- package/dist/tabs/tab-panel.d.ts.map +1 -0
- package/dist/tabs/tab-panel.js +30 -0
- package/dist/tabs/tab-panel.js.map +1 -0
- package/dist/tabs/tab-panels.d.ts +30 -0
- package/dist/tabs/tab-panels.d.ts.map +1 -0
- package/dist/tabs/tab-panels.js +80 -0
- package/dist/tabs/tab-panels.js.map +1 -0
- package/dist/util/circle-arc.d.ts +34 -0
- package/dist/util/circle-arc.d.ts.map +1 -0
- package/dist/util/circle-arc.js +77 -0
- package/dist/util/circle-arc.js.map +1 -0
- package/dist/util/compare.d.ts +53 -0
- package/dist/util/compare.d.ts.map +1 -0
- package/dist/util/compare.js +91 -0
- package/dist/util/compare.js.map +1 -0
- package/dist/util/content-editable.d.ts +2 -0
- package/dist/util/content-editable.d.ts.map +1 -0
- package/dist/util/content-editable.js +13 -0
- package/dist/util/content-editable.js.map +1 -0
- package/dist/util/drag-controller.d.ts +13 -0
- package/dist/util/drag-controller.d.ts.map +1 -0
- package/dist/util/drag-controller.js +21 -0
- package/dist/util/drag-controller.js.map +1 -0
- package/dist/util/key-value.d.ts +5 -0
- package/dist/util/key-value.d.ts.map +1 -0
- package/dist/util/key-value.js +30 -0
- package/dist/util/key-value.js.map +1 -0
- package/dist/util/primitive-types.d.ts +6 -0
- package/dist/util/primitive-types.d.ts.map +1 -0
- package/dist/util/primitive-types.js +2 -0
- package/dist/util/primitive-types.js.map +1 -0
- package/dist/util/svg-editable-text.d.ts +22 -0
- package/dist/util/svg-editable-text.d.ts.map +1 -0
- package/dist/util/svg-editable-text.js +121 -0
- package/dist/util/svg-editable-text.js.map +1 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.d.ts.map +1 -0
- package/dist/util/time.js +2 -0
- package/dist/util/time.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sort numbers in ascending order.
|
|
3
|
+
*
|
|
4
|
+
* ```js
|
|
5
|
+
* [10, 4, 5, 0].sort(numericComparer);
|
|
6
|
+
* // Yields: [0, 4, 5, 10]
|
|
7
|
+
* [10, 4, 5, 0].sort(comparerInverse(numericComparer));
|
|
8
|
+
* // Yields: [ 10, 5, 4, 0]
|
|
9
|
+
* ```
|
|
10
|
+
* @param x
|
|
11
|
+
* @param y
|
|
12
|
+
* @returns
|
|
13
|
+
*/
|
|
14
|
+
export const numericComparer = (x, y) => {
|
|
15
|
+
// ✔️ Unit tested
|
|
16
|
+
if (x === y)
|
|
17
|
+
return 0;
|
|
18
|
+
if (x > y)
|
|
19
|
+
return 1;
|
|
20
|
+
return -1;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Compares numbers by numeric value, otherwise uses the default
|
|
24
|
+
* logic of string comparison.
|
|
25
|
+
*
|
|
26
|
+
* Is an ascending sort:
|
|
27
|
+
* * b, a, c -> a, b, c
|
|
28
|
+
* * 10, 5, 100 -> 5, 10, 100
|
|
29
|
+
*
|
|
30
|
+
* Returns -1 if x is less than y
|
|
31
|
+
* Returns 1 if x is greater than y
|
|
32
|
+
* Returns 0 if x is the same as y
|
|
33
|
+
* @param x
|
|
34
|
+
* @param y
|
|
35
|
+
* @see {@link comparerInverse} Inverted order
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
38
|
+
export const defaultComparer = (x, y) => {
|
|
39
|
+
if (typeof x === `number` && typeof y === `number`) {
|
|
40
|
+
return numericComparer(x, y);
|
|
41
|
+
}
|
|
42
|
+
return jsComparer(x, y);
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Default sort comparer, following same sematics as Array.sort.
|
|
46
|
+
* Consider using {@link defaultComparer} to get more logical sorting of numbers.
|
|
47
|
+
*
|
|
48
|
+
* Note: numbers are sorted in alphabetical order, eg:
|
|
49
|
+
* ```js
|
|
50
|
+
* [ 10, 20, 5, 100 ].sort(jsComparer); // same as .sort()
|
|
51
|
+
* // Yields: [10, 100, 20, 5]
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* Returns -1 if x is less than y
|
|
55
|
+
* Returns 1 if x is greater than y
|
|
56
|
+
* Returns 0 if x is the same as y
|
|
57
|
+
* @param x
|
|
58
|
+
* @param y
|
|
59
|
+
* @returns
|
|
60
|
+
*/
|
|
61
|
+
export const jsComparer = (x, y) => {
|
|
62
|
+
// ✔️ Unit tested
|
|
63
|
+
// Via https://stackoverflow.com/questions/47334234/how-to-implement-array-prototype-sort-default-compare-function
|
|
64
|
+
if (x === undefined && y === undefined)
|
|
65
|
+
return 0;
|
|
66
|
+
if (x === undefined)
|
|
67
|
+
return 1;
|
|
68
|
+
if (y === undefined)
|
|
69
|
+
return -1;
|
|
70
|
+
const xString = defaultToString(x);
|
|
71
|
+
const yString = defaultToString(y);
|
|
72
|
+
if (xString < yString)
|
|
73
|
+
return -1;
|
|
74
|
+
if (xString > yString)
|
|
75
|
+
return 1;
|
|
76
|
+
return 0;
|
|
77
|
+
};
|
|
78
|
+
export const defaultToString = (object) => {
|
|
79
|
+
//ECMA specification: http://www.ecma-international.org/ecma-262/6.0/#sec-tostring
|
|
80
|
+
if (object === null)
|
|
81
|
+
return `null`;
|
|
82
|
+
if (typeof object === `boolean` || typeof object === `number`) {
|
|
83
|
+
return object.toString();
|
|
84
|
+
}
|
|
85
|
+
if (typeof object === `string`)
|
|
86
|
+
return object;
|
|
87
|
+
if (typeof object === `symbol`)
|
|
88
|
+
throw new TypeError(`Symbol cannot be converted to string`);
|
|
89
|
+
return JSON.stringify(object);
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/util/compare.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAS,EAAE,CAAS,EAAiB,EAAE;IACrE,iBAAiB;IACjB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAU,EAAE,CAAU,EAAiB,EAAE;IACvE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnD,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,CAAC,CAAC;AAGF;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAU,EAAE,CAAU,EAAiB,EAAE;IAClE,iBAAiB;IAEjB,kHAAkH;IAClH,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC;IAE/B,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,OAAO,GAAG,OAAO;QAAE,OAAO,CAAC,CAAC,CAAC;IACjC,IAAI,OAAO,GAAG,OAAO;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAe,EAAU,EAAE;IACzD,kFAAkF;IAClF,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACnC,IAAI,OAAO,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC9D,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IAC5F,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-editable.d.ts","sourceRoot":"","sources":["../../src/util/content-editable.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,IAAI,WAAW,EAAE,WAAW,OAAO,SAWxD,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const focus = (el, selectAll) => {
|
|
2
|
+
el.focus();
|
|
3
|
+
if (selectAll) {
|
|
4
|
+
const range = document.createRange();
|
|
5
|
+
range.selectNodeContents(el);
|
|
6
|
+
const sel = window.getSelection();
|
|
7
|
+
if (sel) {
|
|
8
|
+
sel.removeAllRanges();
|
|
9
|
+
sel.addRange(range);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=content-editable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-editable.js","sourceRoot":"","sources":["../../src/util/content-editable.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAe,EAAE,SAAkB,EAAE,EAAE;IAC3D,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACrC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,eAAe,EAAE,CAAC;YACtB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ReactiveControllerHost } from 'lit';
|
|
2
|
+
export declare class DragController {
|
|
3
|
+
#private;
|
|
4
|
+
private host;
|
|
5
|
+
pos: {
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
};
|
|
9
|
+
constructor(host: ReactiveControllerHost);
|
|
10
|
+
hostConnected(): void;
|
|
11
|
+
hostDisconnected(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=drag-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag-controller.d.ts","sourceRoot":"","sources":["../../src/util/drag-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,KAAK,CAAC;AAElD,qBAAa,cAAc;;IACzB,OAAO,CAAC,IAAI,CAAyB;IACrC,GAAG;;;MAAkB;gBAOT,IAAI,EAAE,sBAAsB;IAMxC,aAAa;IAKb,gBAAgB;CAGjB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {} from 'lit';
|
|
2
|
+
export class DragController {
|
|
3
|
+
#onPointerMove;
|
|
4
|
+
constructor(host) {
|
|
5
|
+
this.pos = { x: 0, y: 0 };
|
|
6
|
+
this.#onPointerMove = ({ clientX, clientY }) => {
|
|
7
|
+
this.pos = { x: clientX, y: clientY };
|
|
8
|
+
this.host.requestUpdate();
|
|
9
|
+
};
|
|
10
|
+
this.host = host;
|
|
11
|
+
host.addController(this);
|
|
12
|
+
}
|
|
13
|
+
hostConnected() {
|
|
14
|
+
window.addEventListener('pointermove', this.#onPointerMove);
|
|
15
|
+
window.addEventListener('pointermove', this.#onPointerMove);
|
|
16
|
+
}
|
|
17
|
+
hostDisconnected() {
|
|
18
|
+
window.removeEventListener('pointermove', this.#onPointerMove);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=drag-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag-controller.js","sourceRoot":"","sources":["../../src/util/drag-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,KAAK,CAAC;AAElD,MAAM,OAAO,cAAc;IAIzB,cAAc,CAGZ;IAEF,YAAY,IAA4B;QAPxC,QAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAErB,mBAAc,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAc,EAAE,EAAE;YACpD,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5B,CAAC,CAAC;QAGA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9D,CAAC;IAED,gBAAgB;QACd,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IACjE,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type KeyValue } from "./primitive-types.js";
|
|
2
|
+
export type KeyValueSorter = (data: readonly KeyValue[]) => KeyValue[];
|
|
3
|
+
export type SortSyles = `value` | `value-reverse` | `key` | `key-reverse`;
|
|
4
|
+
export declare const getSorter: (sortStyle: SortSyles) => KeyValueSorter;
|
|
5
|
+
//# sourceMappingURL=key-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-value.d.ts","sourceRoot":"","sources":["../../src/util/key-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,KAAK,QAAQ,EAAE,CAAC;AAEvE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,aAAa,CAAC;AAC1E,eAAO,MAAM,SAAS,GAAI,WAAW,SAAS,KAAG,cAkBhD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { defaultComparer } from "./compare.js";
|
|
2
|
+
import {} from "./primitive-types.js";
|
|
3
|
+
export const getSorter = (sortStyle) => {
|
|
4
|
+
switch (sortStyle) {
|
|
5
|
+
case `value`: {
|
|
6
|
+
return sorterByValueIndex(1, false);
|
|
7
|
+
}
|
|
8
|
+
case `value-reverse`: {
|
|
9
|
+
return sorterByValueIndex(1, true);
|
|
10
|
+
}
|
|
11
|
+
case `key`: {
|
|
12
|
+
return sorterByValueIndex(0, false);
|
|
13
|
+
}
|
|
14
|
+
case `key-reverse`: {
|
|
15
|
+
return sorterByValueIndex(0, true);
|
|
16
|
+
}
|
|
17
|
+
default: {
|
|
18
|
+
throw new Error(`Unknown sorting value '${sortStyle}'. Expecting: value, value-reverse, key or key-reverse`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const sorterByValueIndex = (index, reverse = false) => {
|
|
23
|
+
return (values) => {
|
|
24
|
+
const s = values.toSorted((a, b) => defaultComparer(a[index], b[index]));
|
|
25
|
+
if (reverse)
|
|
26
|
+
return s.reverse();
|
|
27
|
+
return s;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=key-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-value.js","sourceRoot":"","sources":["../../src/util/key-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAiB,MAAM,sBAAsB,CAAC;AAKrD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAAkB,EAAE;IAChE,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO,kBAAkB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,OAAO,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,OAAO,kBAAkB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,OAAO,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,0BAA4B,SAAqB,wDAAwD,CAAC,CAAC;QAC7H,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,OAAO,GAAG,KAAK,EAAE,EAAE;IAC5D,OAAO,CAAC,MAA2B,EAAE,EAAE;QACrC,MAAM,CAAC,GAAc,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAE,KAAK,CAAE,EAAE,CAAC,CAAE,KAAK,CAAE,CAAC,CAAC,CAAC;QAC1G,IAAI,OAAO;YAAE,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,CAAC,CAAC;IACX,CAAC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type StringOrNumber = string | number | bigint;
|
|
2
|
+
export type Primitive = string | number | bigint | boolean;
|
|
3
|
+
export type PrimitiveOrObject = Primitive | object;
|
|
4
|
+
export type BasicType = StringOrNumber | object;
|
|
5
|
+
export type KeyValue = readonly [key: string, value: StringOrNumber];
|
|
6
|
+
//# sourceMappingURL=primitive-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitive-types.d.ts","sourceRoot":"","sources":["../../src/util/primitive-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3D,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnD,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,MAAM,CAAC;AAChD,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitive-types.js","sourceRoot":"","sources":["../../src/util/primitive-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Ref } from 'lit/directives/ref.js';
|
|
2
|
+
export type SvgEditLabelData = {
|
|
3
|
+
editMode: boolean;
|
|
4
|
+
hideValue: boolean;
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
anchor: `start` | `middle` | `end`;
|
|
8
|
+
displayValue: number | string;
|
|
9
|
+
editValue: number | string;
|
|
10
|
+
fill: string;
|
|
11
|
+
};
|
|
12
|
+
export declare class SvgEditLabel extends EventTarget {
|
|
13
|
+
#private;
|
|
14
|
+
textRef: Ref<SVGTextElement>;
|
|
15
|
+
editorRef: Ref<HTMLDivElement>;
|
|
16
|
+
onEditMode?: (enabled: boolean, source: SvgEditLabel) => void;
|
|
17
|
+
onInput?: (value: string) => void;
|
|
18
|
+
render(data: SvgEditLabelData): import("lit-html").TemplateResult<2>;
|
|
19
|
+
onUpdated(): void;
|
|
20
|
+
static styles: import("lit").CSSResult;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=svg-editable-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-editable-text.d.ts","sourceRoot":"","sources":["../../src/util/svg-editable-text.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,GAAG,EAAO,MAAM,uBAAuB,CAAC;AAGjE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;IAClC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,qBAAa,YAAa,SAAQ,WAAW;;IAC3C,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,CAAe;IAC3C,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,CAAe;IAK7C,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAG9D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAyClC,MAAM,CAAC,IAAI,EAAE,gBAAgB;IAgC7B,SAAS;IA2BT,MAAM,CAAC,MAAM,0BAkBd;CACA"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { css, svg } from "lit";
|
|
2
|
+
import { createRef, ref } from 'lit/directives/ref.js';
|
|
3
|
+
import { focus as focusContentEditable } from "./content-editable.js";
|
|
4
|
+
export class SvgEditLabel extends EventTarget {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.textRef = createRef();
|
|
8
|
+
this.editorRef = createRef();
|
|
9
|
+
this.#keyDownBound = this.#onKeyDown.bind(this);
|
|
10
|
+
this.#blurBound = this.#onBlur.bind(this);
|
|
11
|
+
}
|
|
12
|
+
#keyDownBound;
|
|
13
|
+
#blurBound;
|
|
14
|
+
#renderLabel(data) {
|
|
15
|
+
const { fill, x, y, displayValue, anchor, hideValue } = data;
|
|
16
|
+
if (hideValue) {
|
|
17
|
+
return svg ``;
|
|
18
|
+
}
|
|
19
|
+
return svg `<text ${ref(this.textRef)} id="label-value" @click=${() => this.#onValueClick()} fill=${fill} text-anchor=${anchor} x=${x} y=${y}>${displayValue}</text>`;
|
|
20
|
+
}
|
|
21
|
+
#onValueClick() {
|
|
22
|
+
this.#onEditMode(true);
|
|
23
|
+
}
|
|
24
|
+
#onEditMode(enabled) {
|
|
25
|
+
if (this.onEditMode !== undefined)
|
|
26
|
+
this.onEditMode(enabled, this);
|
|
27
|
+
this.dispatchEvent(new CustomEvent(`edit-mode`, {
|
|
28
|
+
detail: {
|
|
29
|
+
enabled: enabled
|
|
30
|
+
}
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
#renderEdit(data) {
|
|
34
|
+
let { anchor, editValue, x, y } = data;
|
|
35
|
+
let w = 5;
|
|
36
|
+
let h = 5;
|
|
37
|
+
if (this.textRef.value) {
|
|
38
|
+
const bbox = this.textRef.value.getBBox();
|
|
39
|
+
x = x - bbox.width / 2;
|
|
40
|
+
y = y - bbox.height + 4.5;
|
|
41
|
+
w = bbox.width + 5;
|
|
42
|
+
h = bbox.height;
|
|
43
|
+
}
|
|
44
|
+
return svg `
|
|
45
|
+
<foreignObject text-anchor=${anchor} width=${w} height=${h} x=${x} y=${y}>
|
|
46
|
+
<div ${ref(this.editorRef)} @blur=${this.#blurBound} @keydown=${this.#keyDownBound} xmlns="http://www.w3.org/1999/xhtml" tab-index=0 contentEditable=true>${editValue}</div>
|
|
47
|
+
</foreignObject>`;
|
|
48
|
+
}
|
|
49
|
+
render(data) {
|
|
50
|
+
if (data.editMode) {
|
|
51
|
+
return this.#renderEdit(data);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
return this.#renderLabel(data);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
#onBlur(event) {
|
|
58
|
+
const rawValue = event.target.innerText;
|
|
59
|
+
if (this.onInput) {
|
|
60
|
+
this.onInput(rawValue);
|
|
61
|
+
}
|
|
62
|
+
this.#onEditMode(false);
|
|
63
|
+
}
|
|
64
|
+
#onKeyDown(event) {
|
|
65
|
+
const key = event.key;
|
|
66
|
+
//const shift = event.shiftKey;
|
|
67
|
+
if (key === `Escape`) {
|
|
68
|
+
this.#onEditMode(false);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
else if (key === `Enter`) {
|
|
72
|
+
const rawValue = event.target.innerText;
|
|
73
|
+
if (this.onInput) {
|
|
74
|
+
this.onInput(rawValue);
|
|
75
|
+
}
|
|
76
|
+
this.#onEditMode(false);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
onUpdated() {
|
|
81
|
+
if (this.editorRef.value) {
|
|
82
|
+
focusContentEditable(this.editorRef.value, true);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// protected override updated(_changedProperties: PropertyValues): void {
|
|
86
|
+
// if (!this.shadowRoot) return;
|
|
87
|
+
// const labelSvgEl = this.shadowRoot.querySelector(`#label-value`);
|
|
88
|
+
// if (labelSvgEl) {
|
|
89
|
+
// this.#textLabelBbox = (labelSvgEl as SVGTextElement).getBBox();
|
|
90
|
+
// }
|
|
91
|
+
// if (this.editMode) {
|
|
92
|
+
// const labelValueEditor = this.shadowRoot.querySelector(`svg>foreignObject>div`);
|
|
93
|
+
// if (labelValueEditor) {
|
|
94
|
+
// focus(labelValueEditor as HTMLDivElement, true);
|
|
95
|
+
// } else {
|
|
96
|
+
// console.warn(`Label editor not found`);
|
|
97
|
+
// }
|
|
98
|
+
// }
|
|
99
|
+
// //this.#textValueScreenCords = this.#SVGToScreen(this.#textValueSvgCoords);
|
|
100
|
+
// }
|
|
101
|
+
static { this.styles = css `
|
|
102
|
+
:host {
|
|
103
|
+
display: inline-block;
|
|
104
|
+
--value-label-color: unset;
|
|
105
|
+
}
|
|
106
|
+
input {
|
|
107
|
+
font:unset;
|
|
108
|
+
position:absolute;
|
|
109
|
+
background:unset;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
foreignObject>div {
|
|
113
|
+
width:-webkit-fill-available;
|
|
114
|
+
background:red;
|
|
115
|
+
margin: 0;
|
|
116
|
+
padding: 0;
|
|
117
|
+
line-height: unset;
|
|
118
|
+
}
|
|
119
|
+
`; }
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=svg-editable-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-editable-text.js","sourceRoot":"","sources":["../../src/util/svg-editable-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAY,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,KAAK,IAAI,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAatE,MAAM,OAAO,YAAa,SAAQ,WAAW;IAA7C;;QACE,YAAO,GAAwB,SAAS,EAAE,CAAC;QAC3C,cAAS,GAAwB,SAAS,EAAE,CAAC;QAE7C,kBAAa,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,eAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IA4HvC,CAAC;IA7HC,aAAa,CAA8B;IAC3C,UAAU,CAA2B;IAOrC,YAAY,CAAC,IAAsB;QACjC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,GAAG,CAAA,EAAE,CAAC;QACf,CAAC;QACD,OAAO,GAAG,CAAA,UAAW,GAAG,CAAC,IAAI,CAAC,OAAO,CAAE,4BAA6B,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAG,SAAU,IAAK,gBAAiB,MAAO,MAAO,CAAE,MAAO,CAAE,IAAK,YAAa,SAAS,CAAA;IACrL,CAAC;IAED,aAAa;QACX,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,WAAW,CAAC,OAAgB;QAC1B,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClE,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,WAAW,EAAE;YAC9C,MAAM,EAAE;gBACN,OAAO,EAAE,OAAO;aACjB;SACF,CAAC,CAAC,CAAC;IACN,CAAC;IAED,WAAW,CAAC,IAAsB;QAChC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC1C,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACvB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YAC1B,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACnB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAClB,CAAC;QAED,OAAO,GAAG,CAAA;iCACoB,MAAO,UAAW,CAAE,WAAY,CAAE,MAAO,CAAE,MAAO,CAAE;WAC1E,GAAG,CAAC,IAAI,CAAC,SAAS,CAAE,UAAW,IAAI,CAAC,UAAW,aAAc,IAAI,CAAC,aAAc,0EAA2E,SAAU;uBAC1J,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,IAAsB;QAC3B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,KAAY;QAClB,MAAM,QAAQ,GAAI,KAAK,CAAC,MAAyB,CAAC,SAAS,CAAC;QAC5D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,UAAU,CAAC,KAAoB;QAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,+BAA+B;QAC/B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YACvB,OAAO;QACT,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAI,KAAK,CAAC,MAAyB,CAAC,SAAS,CAAC;YAC5D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;IACH,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACzB,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAID,yEAAyE;IACzE,kCAAkC;IAClC,sEAAsE;IACtE,sBAAsB;IACtB,sEAAsE;IACtE,MAAM;IAEN,yBAAyB;IACzB,uFAAuF;IACvF,8BAA8B;IAC9B,yDAAyD;IACzD,eAAe;IACf,gDAAgD;IAChD,QAAQ;IAER,MAAM;IACN,gFAAgF;IAChF,IAAI;aAEG,WAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;CAkBpB,AAlBc,CAkBd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/util/time.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,IAAI,MAAM,qBAA0C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/util/time.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ixfx/components",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./src/index.ts",
|
|
9
|
+
"import": "./src/index.ts"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"main": "dist/src/index.js",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/src/index.d.ts",
|
|
17
|
+
"import": "./dist/src/index.js"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"lint": "tsc",
|
|
26
|
+
"dev": "vite --port=5174",
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"build-test": "tsc && vite build",
|
|
29
|
+
"preview": "vite preview",
|
|
30
|
+
"knip": "knip --config ./config/knip.json"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [],
|
|
33
|
+
"author": "",
|
|
34
|
+
"license": "ISC",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@ixfx/bundle": "0.41.0",
|
|
37
|
+
"lit": "3.3.1"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@eslint/js": "9.32.0",
|
|
41
|
+
"eslint": "9.32.0",
|
|
42
|
+
"globals": "16.3.0",
|
|
43
|
+
"knip": "5.62.0",
|
|
44
|
+
"typescript": "5.8.3",
|
|
45
|
+
"typescript-eslint": "8.38.0",
|
|
46
|
+
"vite": "5.4.6"
|
|
47
|
+
}
|
|
48
|
+
}
|