@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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/charts/frequency-histogram-plot.d.ts +33 -0
  4. package/dist/charts/frequency-histogram-plot.d.ts.map +1 -0
  5. package/dist/charts/frequency-histogram-plot.js +54 -0
  6. package/dist/charts/frequency-histogram-plot.js.map +1 -0
  7. package/dist/charts/histogram-vis.d.ts +57 -0
  8. package/dist/charts/histogram-vis.d.ts.map +1 -0
  9. package/dist/charts/histogram-vis.js +222 -0
  10. package/dist/charts/histogram-vis.js.map +1 -0
  11. package/dist/charts/plot.d.ts +128 -0
  12. package/dist/charts/plot.d.ts.map +1 -0
  13. package/dist/charts/plot.js +456 -0
  14. package/dist/charts/plot.js.map +1 -0
  15. package/dist/crumb-nav.d.ts +41 -0
  16. package/dist/crumb-nav.d.ts.map +1 -0
  17. package/dist/crumb-nav.js +198 -0
  18. package/dist/crumb-nav.js.map +1 -0
  19. package/dist/crumb-navigation.d.ts +30 -0
  20. package/dist/crumb-navigation.d.ts.map +1 -0
  21. package/dist/crumb-navigation.js +307 -0
  22. package/dist/crumb-navigation.js.map +1 -0
  23. package/dist/data-display.d.ts +15 -0
  24. package/dist/data-display.d.ts.map +1 -0
  25. package/dist/data-display.js +110 -0
  26. package/dist/data-display.js.map +1 -0
  27. package/dist/dial.d.ts +89 -0
  28. package/dist/dial.d.ts.map +1 -0
  29. package/dist/dial.js +506 -0
  30. package/dist/dial.js.map +1 -0
  31. package/dist/index.d.ts +11 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +13 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/my-element.d.ts +14 -0
  36. package/dist/my-element.d.ts.map +1 -0
  37. package/dist/my-element.js +44 -0
  38. package/dist/my-element.js.map +1 -0
  39. package/dist/selecthorizontal.d.ts +12 -0
  40. package/dist/selecthorizontal.d.ts.map +1 -0
  41. package/dist/selecthorizontal.js +46 -0
  42. package/dist/selecthorizontal.js.map +1 -0
  43. package/dist/split-layout/split-layout.d.ts +35 -0
  44. package/dist/split-layout/split-layout.d.ts.map +1 -0
  45. package/dist/split-layout/split-layout.js +220 -0
  46. package/dist/split-layout/split-layout.js.map +1 -0
  47. package/dist/svg-edit-label.d.ts +2 -0
  48. package/dist/svg-edit-label.d.ts.map +1 -0
  49. package/dist/svg-edit-label.js +110 -0
  50. package/dist/svg-edit-label.js.map +1 -0
  51. package/dist/tabs/tab-layout-item.d.ts +10 -0
  52. package/dist/tabs/tab-layout-item.d.ts.map +1 -0
  53. package/dist/tabs/tab-layout-item.js +20 -0
  54. package/dist/tabs/tab-layout-item.js.map +1 -0
  55. package/dist/tabs/tab-layout.d.ts +10 -0
  56. package/dist/tabs/tab-layout.d.ts.map +1 -0
  57. package/dist/tabs/tab-layout.js +25 -0
  58. package/dist/tabs/tab-layout.js.map +1 -0
  59. package/dist/tabs/tab-list-item.d.ts +18 -0
  60. package/dist/tabs/tab-list-item.d.ts.map +1 -0
  61. package/dist/tabs/tab-list-item.js +63 -0
  62. package/dist/tabs/tab-list-item.js.map +1 -0
  63. package/dist/tabs/tab-list.d.ts +21 -0
  64. package/dist/tabs/tab-list.d.ts.map +1 -0
  65. package/dist/tabs/tab-list.js +148 -0
  66. package/dist/tabs/tab-list.js.map +1 -0
  67. package/dist/tabs/tab-panel.d.ts +11 -0
  68. package/dist/tabs/tab-panel.d.ts.map +1 -0
  69. package/dist/tabs/tab-panel.js +30 -0
  70. package/dist/tabs/tab-panel.js.map +1 -0
  71. package/dist/tabs/tab-panels.d.ts +30 -0
  72. package/dist/tabs/tab-panels.d.ts.map +1 -0
  73. package/dist/tabs/tab-panels.js +80 -0
  74. package/dist/tabs/tab-panels.js.map +1 -0
  75. package/dist/util/circle-arc.d.ts +34 -0
  76. package/dist/util/circle-arc.d.ts.map +1 -0
  77. package/dist/util/circle-arc.js +77 -0
  78. package/dist/util/circle-arc.js.map +1 -0
  79. package/dist/util/compare.d.ts +53 -0
  80. package/dist/util/compare.d.ts.map +1 -0
  81. package/dist/util/compare.js +91 -0
  82. package/dist/util/compare.js.map +1 -0
  83. package/dist/util/content-editable.d.ts +2 -0
  84. package/dist/util/content-editable.d.ts.map +1 -0
  85. package/dist/util/content-editable.js +13 -0
  86. package/dist/util/content-editable.js.map +1 -0
  87. package/dist/util/drag-controller.d.ts +13 -0
  88. package/dist/util/drag-controller.d.ts.map +1 -0
  89. package/dist/util/drag-controller.js +21 -0
  90. package/dist/util/drag-controller.js.map +1 -0
  91. package/dist/util/key-value.d.ts +5 -0
  92. package/dist/util/key-value.d.ts.map +1 -0
  93. package/dist/util/key-value.js +30 -0
  94. package/dist/util/key-value.js.map +1 -0
  95. package/dist/util/primitive-types.d.ts +6 -0
  96. package/dist/util/primitive-types.d.ts.map +1 -0
  97. package/dist/util/primitive-types.js +2 -0
  98. package/dist/util/primitive-types.js.map +1 -0
  99. package/dist/util/svg-editable-text.d.ts +22 -0
  100. package/dist/util/svg-editable-text.d.ts.map +1 -0
  101. package/dist/util/svg-editable-text.js +121 -0
  102. package/dist/util/svg-editable-text.js.map +1 -0
  103. package/dist/util/time.d.ts +2 -0
  104. package/dist/util/time.d.ts.map +1 -0
  105. package/dist/util/time.js +2 -0
  106. package/dist/util/time.js.map +1 -0
  107. package/package.json +48 -0
@@ -0,0 +1,198 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ /* eslint-disable @typescript-eslint/unbound-method */
8
+ import { css, html, LitElement } from "lit";
9
+ import { customElement, property } from "lit/decorators.js";
10
+ /**
11
+ * Events
12
+ * * 'change': yields newly selected node and previous
13
+ *
14
+ * CSS variables
15
+ * * --text-highlight: red; // highlight on mouse hover
16
+ * * --separator: silver; // text colour of separator character
17
+ * * --padding-s: 0.12ch; // padding between items
18
+ */
19
+ let CrumbNavElement = class CrumbNavElement extends LitElement {
20
+ constructor() {
21
+ super();
22
+ this.segments = [];
23
+ this.editing = false;
24
+ this.editPath = ``;
25
+ this.onclick = () => {
26
+ console.log(`click`);
27
+ this.editing = true;
28
+ };
29
+ this.segments = [
30
+ { label: `root`, key: `root` },
31
+ { label: `This PC`, key: `ThisPC` },
32
+ { label: `Storage (D:)`, key: `D:` },
33
+ { label: `Archives`, key: `Archives` },
34
+ { label: `Tumblr`, key: `Tumblr` },
35
+ { label: `whatevruk`, key: `whatevruk` },
36
+ ];
37
+ }
38
+ updated(_changedProperties) {
39
+ if (this.editing) {
40
+ this.shadowRoot?.querySelector(`input`)?.focus();
41
+ this.shadowRoot?.querySelector(`input`)?.select();
42
+ }
43
+ }
44
+ setSegmentsWithPath(path, separator = `/`) {
45
+ const split = path.split(separator);
46
+ let root = ``;
47
+ let segments = [];
48
+ for (const s of split) {
49
+ root += s + separator;
50
+ segments.push({
51
+ key: root,
52
+ label: s
53
+ });
54
+ }
55
+ ;
56
+ this.segments = segments;
57
+ this.editPath = path;
58
+ }
59
+ renderSegment(s, i) {
60
+ const last = i === this.segments.length - 1;
61
+ const caret = html `<div .data=${s} @click=${this.onCaretClick} class="caret">&rsaquo;</div>`;
62
+ return html `<div class="seg ${s.ensureVisible ? `chosen` : ``}" >
63
+ <label .data=${s} title=${s.label} @click=${this.onLabelClick}>
64
+ ${s.label}
65
+ </label>
66
+ ${last ? `` : caret}
67
+ </div>`;
68
+ }
69
+ async onCaretClick(event) {
70
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
71
+ const data = event.target.data;
72
+ console.log(data);
73
+ event.preventDefault();
74
+ event.stopPropagation();
75
+ if (this.onNavPopup) {
76
+ for await (const item of this.onNavPopup(data)) {
77
+ console.log(item);
78
+ }
79
+ console.log(`done`);
80
+ }
81
+ }
82
+ onLabelClick(event) {
83
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
84
+ const data = event.target.data;
85
+ event.preventDefault();
86
+ event.stopPropagation();
87
+ this.dispatchEvent(new CustomEvent(`navigate`, {
88
+ detail: data
89
+ }));
90
+ }
91
+ render() {
92
+ if (this.editing) {
93
+ return html `<input @keyup=${this.onInputKeyUp} @blur=${this.onInputBlur} value=${this.editPath} type="text">`;
94
+ }
95
+ else {
96
+ const segs = this.segments.map((s, index) => this.renderSegment(s, index));
97
+ return html `${segs}`;
98
+ }
99
+ }
100
+ onInputKeyUp(event) {
101
+ const el = this.shadowRoot?.querySelector(`input`);
102
+ if (!el)
103
+ return;
104
+ if (event.key === `Enter`) {
105
+ console.log(`asf`);
106
+ this.editPath = el.value;
107
+ this.editing = false;
108
+ }
109
+ else if (event.key === `Escape`) {
110
+ this.editing = false;
111
+ }
112
+ }
113
+ onInputBlur() {
114
+ this.editing = false;
115
+ }
116
+ static { this.styles = css `
117
+ :host {
118
+ --text-highlight: red;
119
+ --separator: silver;
120
+ --padding: 0.5em;
121
+ --padding-s: 0.1em;
122
+ --padding-m: 0.25em;
123
+ --hover-bg: darkgray;
124
+ --hover-fg: unset;
125
+ display: flex;
126
+ width: 100%;
127
+ gap: var(--padding-s);
128
+ transition: all 2s ease-in-out;
129
+ cursor: text;
130
+ }
131
+
132
+ .seg {
133
+ cursor: pointer;
134
+ display:flex;
135
+ flex-wrap: nowrap;
136
+ align-items:center;
137
+ user-select: none;
138
+ overflow:hidden;
139
+ }
140
+
141
+ input {
142
+ appearance: none;
143
+ border: 0;
144
+ width: 100%;
145
+ margin:var(--padding-s);
146
+ padding: calc(2*var(--padding-s));
147
+ font:unset;
148
+ }
149
+ .seg:hover {
150
+ * {
151
+ color: var(--hover-fg);
152
+ background: color-mix(in srgb, var(--hover-bg) 20%, transparent);
153
+ }
154
+ }
155
+ .seg {
156
+ * {
157
+ transition: all 0.2s ease-in-out;
158
+ }
159
+ }
160
+
161
+ label {
162
+ height: 100%;
163
+ white-space:nowrap;
164
+ text-overflow: ellipsis;
165
+ align-content: center;
166
+ overflow: hidden;
167
+ padding: 0 var(--padding-s) 0 var(--padding-s);
168
+ }
169
+
170
+ label:hover,.caret:hover {
171
+ background: var(--hover-bg) !important;
172
+ }
173
+
174
+ .seg:hover,.seg.chosen {
175
+ overflow:unset;
176
+ }
177
+
178
+ .caret {
179
+ padding: var(--padding-m);
180
+ margin-left: var(--padding-s);
181
+ margin-left: var(--padding-s);
182
+ }
183
+ `; }
184
+ };
185
+ __decorate([
186
+ property({ type: Object })
187
+ ], CrumbNavElement.prototype, "segments", void 0);
188
+ __decorate([
189
+ property({ type: Boolean })
190
+ ], CrumbNavElement.prototype, "editing", void 0);
191
+ __decorate([
192
+ property({ type: String })
193
+ ], CrumbNavElement.prototype, "editPath", void 0);
194
+ CrumbNavElement = __decorate([
195
+ customElement('ixfx-crumb-nav')
196
+ ], CrumbNavElement);
197
+ export { CrumbNavElement };
198
+ //# sourceMappingURL=crumb-nav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crumb-nav.js","sourceRoot":"","sources":["../src/crumb-nav.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { LitElement, type PropertyValues } from "lit";
2
+ import { Trees } from '@ixfx/collections';
3
+ export type CrumbNavigationPart = {
4
+ label: string;
5
+ key: string;
6
+ };
7
+ /**
8
+ * Events
9
+ * * 'change': yields newly selected node and previous
10
+ *
11
+ * CSS variables
12
+ * * --text-highlight: red; // highlight on mouse hover
13
+ * * --separator: silver; // text colour of separator character
14
+ * * --padding-s: 0.12ch; // padding between items
15
+ */
16
+ export declare class CrumbNavigationElement extends LitElement {
17
+ #private;
18
+ tree: Trees.TreeNode<CrumbNavigationPart>;
19
+ selectedNode: Trees.TreeNode<CrumbNavigationPart> | undefined;
20
+ constructor();
21
+ protected updated(_changedProperties: PropertyValues): void;
22
+ render(): import("lit-html").TemplateResult<1>;
23
+ static styles: import("lit").CSSResult;
24
+ }
25
+ declare global {
26
+ interface HTMLElementTagNameMap {
27
+ "ixfx-crumb-navigation": CrumbNavigationElement;
28
+ }
29
+ }
30
+ //# sourceMappingURL=crumb-navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crumb-navigation.d.ts","sourceRoot":"","sources":["../src/crumb-navigation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED;;;;;;;;GAQG;AACH,qBACa,sBAAuB,SAAQ,UAAU;;IAEpD,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAG1C,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,SAAS,CAAC;;IA4F9D,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,cAAc,GAAG,IAAI;IAmD3D,MAAM;IAmDN,MAAM,CAAC,MAAM,0BAiGd;CACA;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,uBAAuB,EAAE,sBAAsB,CAAC;KACjD;CACF"}
@@ -0,0 +1,307 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { css, html, LitElement } from "lit";
8
+ import { customElement, property } from "lit/decorators.js";
9
+ import { Trees } from '@ixfx/collections';
10
+ import { join } from "lit/directives/join.js";
11
+ /**
12
+ * Events
13
+ * * 'change': yields newly selected node and previous
14
+ *
15
+ * CSS variables
16
+ * * --text-highlight: red; // highlight on mouse hover
17
+ * * --separator: silver; // text colour of separator character
18
+ * * --padding-s: 0.12ch; // padding between items
19
+ */
20
+ let CrumbNavigationElement = class CrumbNavigationElement extends LitElement {
21
+ constructor() {
22
+ super();
23
+ const t = Trees.Mutable.createNode({ key: `root`, label: `root` });
24
+ const nodeC = Trees.Mutable.addValue({ key: `c`, label: `c:` }, t);
25
+ const nodeUsers = Trees.Mutable.addValue({ key: `users`, label: `users` }, nodeC);
26
+ Trees.Mutable.addValue({ key: `guest`, label: `guest` }, nodeUsers);
27
+ Trees.Mutable.addValue({ key: `ch`, label: `ch` }, nodeUsers);
28
+ Trees.Mutable.addValue({ key: `admin`, label: `admin` }, nodeUsers);
29
+ Trees.Mutable.addValue({ key: `jane`, label: `jane` }, nodeUsers);
30
+ Trees.Mutable.addValue({ key: `barry`, label: `barry` }, nodeUsers);
31
+ Trees.Mutable.addValue({ key: `reallylongoptionwow`, label: `reallylongoptionwow` }, nodeUsers);
32
+ this.selectedNode = nodeUsers;
33
+ this.tree = t;
34
+ }
35
+ #previousSelectionKey = ``;
36
+ #onPartClick = (event) => {
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
38
+ const part = event.target.value;
39
+ // Find node for clicked part
40
+ const n = Trees.Traverse.findAnyChildByValue(this.tree, part);
41
+ if (n) {
42
+ this.#setSelected(n);
43
+ }
44
+ };
45
+ /**
46
+ * Sets the selected node and fires event
47
+ * @param node
48
+ */
49
+ #setSelected(node) {
50
+ const previous = this.selectedNode;
51
+ if (previous) {
52
+ this.#previousSelectionKey = previous.value?.key ?? ``;
53
+ }
54
+ else {
55
+ this.#previousSelectionKey = ``;
56
+ }
57
+ this.selectedNode = node;
58
+ this.dispatchEvent(new CustomEvent(`change`, {
59
+ detail: {
60
+ selected: node,
61
+ previous: previous
62
+ }
63
+ }));
64
+ }
65
+ #onSubPartClick = (event) => {
66
+ const currentlySelected = this.selectedNode;
67
+ if (!currentlySelected) {
68
+ console.warn(`Bug. No selectedNode`);
69
+ return;
70
+ }
71
+ // const parentNode = currentlySelected.parent;
72
+ // if (!parentNode) {
73
+ // console.warn(`Bug. No parent node`);
74
+ // console.log(currentlySelected);
75
+ // return;
76
+ // }
77
+ const currentlySelectedKey = currentlySelected.value?.key;
78
+ if (!currentlySelectedKey) {
79
+ console.warn(`Bug. No key for selected value`);
80
+ return;
81
+ }
82
+ // Selected option
83
+ const li = event.target;
84
+ if (!li) {
85
+ console.warn(`Bug. No LI element`);
86
+ return;
87
+ }
88
+ const key = li.getAttribute(`data-key`) ?? ``;
89
+ if (!key) {
90
+ console.warn(`Bug. No data-key attribute`);
91
+ return;
92
+ }
93
+ // Find the node
94
+ for (const c of currentlySelected.childrenStore) {
95
+ if (c.value?.key === key) {
96
+ this.#setSelected(c);
97
+ break;
98
+ }
99
+ }
100
+ };
101
+ updated(_changedProperties) {
102
+ //if (!this.expanded) return;
103
+ // const s = this.selectedNode;
104
+ // if (!s) {
105
+ // console.warn(`No selectedNode`);
106
+ // return;
107
+ // }
108
+ // const selectedKey = s.value?.key;
109
+ // if (!selectedKey) {
110
+ // console.warn(`No .key on selectedNode.value`);
111
+ // return;
112
+ // }
113
+ if (!this.shadowRoot)
114
+ return;
115
+ const hsiElement = this.shadowRoot.querySelector(`.horiz-select-items`);
116
+ if (!hsiElement)
117
+ return;
118
+ const ulElement = hsiElement.querySelector(`ul`);
119
+ const btnExpand = this.shadowRoot.querySelector(`#btnExpand`);
120
+ // Show expander button only when needed
121
+ if (ulElement.getBoundingClientRect().width > hsiElement.getBoundingClientRect().width) {
122
+ btnExpand.style.display = `inline`;
123
+ }
124
+ else {
125
+ btnExpand.style.display = `none`;
126
+ }
127
+ // Scroll container to find selected item
128
+ for (const li of ulElement.querySelectorAll(`li`)) {
129
+ const key = li.getAttribute(`data-key`) ?? ``;
130
+ if (key === this.#previousSelectionKey) {
131
+ this.#scrollToValue(li);
132
+ break;
133
+ }
134
+ }
135
+ }
136
+ #scrollToValue(li) {
137
+ let l = li.offsetLeft;
138
+ const ul = li.parentElement;
139
+ if (!ul)
140
+ return;
141
+ l -= ul.offsetLeft;
142
+ const horizSelectItems = ul.parentElement;
143
+ if (!horizSelectItems)
144
+ return;
145
+ horizSelectItems.scroll({ left: l, top: 0, behavior: `smooth` });
146
+ const horizSelect = horizSelectItems.parentElement;
147
+ if (!horizSelect)
148
+ return;
149
+ horizSelect.style.minWidth = li.getBoundingClientRect().width + 'px';
150
+ }
151
+ render() {
152
+ const t = this.tree;
153
+ const sel = this.selectedNode ?? t;
154
+ // Get parents of selected node
155
+ let parts = [];
156
+ parts.push(html `<div .value=${sel.value} @click=${this.#onPartClick}>${sel.value?.label}</div>`);
157
+ for (const p of Trees.Traverse.parents(sel)) {
158
+ if (p.value === undefined)
159
+ continue;
160
+ const v = p.value;
161
+ parts.push(html `<div .value=${v} @click=${this.#onPartClick}>${v.label}</div>`);
162
+ }
163
+ parts.reverse();
164
+ // Get available options at current location
165
+ const currentOpt = this.#renderFinalOption();
166
+ return html `<div class="parts">${join(parts, html `<span class="separator">&rsaquo;</span>`)}</div>
167
+ ${currentOpt}`;
168
+ }
169
+ #renderFinalOption() {
170
+ const s = this.selectedNode;
171
+ if (s === undefined) {
172
+ console.warn(`No selectedNode`);
173
+ return html ``; // Part missing
174
+ }
175
+ return this.#renderOptions(s, this.#previousSelectionKey);
176
+ }
177
+ #renderOptions(node, preselectKey) {
178
+ if (node.childrenStore.length === 0)
179
+ return html ``;
180
+ const options = node.childrenStore.map(c => html `<li class="${c.value?.key === preselectKey ? `previous` : ``}" @click=${this.#onSubPartClick} data-key=${c.value?.key}>${c.value?.label}</li>`);
181
+ return html `
182
+ <span class="separator">&rsaquo;</span>
183
+ <div class="horiz-select">
184
+ <div class="horiz-select-items">
185
+ <ul>
186
+ ${options}
187
+ </ul>
188
+ </div>
189
+ <div id="pop" popover anchor="btnExpand">
190
+ <ul>
191
+ ${options}
192
+ </ul>
193
+ </div>
194
+ <button popovertarget="pop" id="btnExpand">&and;</button>
195
+ </div>
196
+ `;
197
+ }
198
+ static { this.styles = css `
199
+ :host {
200
+ --text-highlight: red;
201
+ --separator: silver;
202
+ --padding-s: 0.12ch;
203
+ display: flex;
204
+ overflow: scroll;
205
+ width: 100%;
206
+ scroll-snap-type: x mandatory;
207
+ scrollbar-width: none;
208
+ }
209
+ #btnExpand {
210
+ scale: 0.5;
211
+ margin:0;
212
+ }
213
+ .parts {
214
+ display: flex;
215
+ }
216
+ .parts > div {
217
+ cursor: pointer;
218
+ margin-right: var(--padding-s);
219
+
220
+ }
221
+ .parts > div:hover {
222
+ color: var(--text-highlight);
223
+ }
224
+
225
+ .horiz-select {
226
+ display:flex;
227
+ min-width: 5ch;
228
+ }
229
+ .horiz-select-items {
230
+ overflow-y: scroll;
231
+ scrollbar-width: none;
232
+ scroll-behavior: smooth;
233
+ }
234
+
235
+ .separator {
236
+ margin-left: var(--padding-s);
237
+ margin-right: var(--padding-s);
238
+ color: var(--separator);
239
+ }
240
+ #pop {
241
+ top: anchor(bottom);
242
+ left: anchor(left);
243
+ padding: 1ch;
244
+ }
245
+ #pop {
246
+ ul {
247
+ list-style: none;
248
+ padding: 0;
249
+ margin: 0;
250
+ }
251
+ li {
252
+ cursor: pointer;
253
+ opacity: 0.8;
254
+ }
255
+ li.previous {
256
+ opacity: 0.9;
257
+ }
258
+ li:hover {
259
+ opacity: 1;
260
+ }
261
+ }
262
+
263
+ .horiz-select-items {
264
+ ul {
265
+ list-style: none;
266
+ padding: 0;
267
+ margin: 0;
268
+ display: inline;
269
+ }
270
+
271
+ li {
272
+ display: inline;
273
+ margin-left: var(--padding-s);
274
+ margin-right: var(--padding-s);
275
+ cursor: pointer;
276
+ opacity: 0.3;
277
+ }
278
+ li.previous {
279
+ opacity: 0.6;
280
+ }
281
+ li:hover {
282
+ opacity: 1;
283
+ }
284
+
285
+ li:not(:last-child):after {
286
+ content: ',';
287
+ }
288
+ }
289
+ ::slotted(*),option {
290
+ user-select: none;
291
+ scroll-snap-align: start;
292
+ border: 1px solid silver;
293
+ color:red;
294
+ }
295
+ `; }
296
+ };
297
+ __decorate([
298
+ property({ type: Object })
299
+ ], CrumbNavigationElement.prototype, "tree", void 0);
300
+ __decorate([
301
+ property({ type: Object })
302
+ ], CrumbNavigationElement.prototype, "selectedNode", void 0);
303
+ CrumbNavigationElement = __decorate([
304
+ customElement('ixfx-crumb-navigation')
305
+ ], CrumbNavigationElement);
306
+ export { CrumbNavigationElement };
307
+ //# sourceMappingURL=crumb-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crumb-navigation.js","sourceRoot":"","sources":["../src/crumb-navigation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type FormattingOptions = {
2
+ readonly precision?: number;
3
+ readonly roundNumbers?: number;
4
+ };
5
+ export declare class DataDisplayComponent extends HTMLElement {
6
+ previousValue: Record<string, unknown> | undefined;
7
+ _shadow: ShadowRoot;
8
+ _container: HTMLElement;
9
+ constructor();
10
+ formatValue(v: unknown, options?: FormattingOptions): string;
11
+ displayData(o: Record<string, unknown> | unknown[]): void;
12
+ getOrCreate(path: string, init?: (parent: HTMLElement) => void): HTMLElement;
13
+ update(value: Record<string, unknown>): void;
14
+ }
15
+ //# sourceMappingURL=data-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-display.d.ts","sourceRoot":"","sources":["../src/data-display.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AAED,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACnD,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,EAAE,WAAW,CAAC;;IAyBxB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM;IAchE,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE;IA+ClD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,WAAW;IAY5E,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQtC"}
@@ -0,0 +1,110 @@
1
+ import { changedObjectDataFields } from "@ixfx/core/records";
2
+ import { round } from "@ixfx/numbers";
3
+ export class DataDisplayComponent extends HTMLElement {
4
+ constructor() {
5
+ super();
6
+ this._shadow = this.attachShadow({ mode: `open` });
7
+ this._container = document.createElement(`section`);
8
+ const style = document.createElement(`style`);
9
+ style.textContent = `
10
+ section {
11
+ background: white;
12
+ color: black;
13
+ border: 2px solid hsl(0deg 0.61% 90%);
14
+ padding: 1em;
15
+ font-family: monospace;
16
+ display:grid;
17
+ grid-template-cols: repeat(2, 1fr);
18
+ }
19
+ div {
20
+ border:1px solid black;
21
+ }
22
+ `;
23
+ this._shadow.append(style, this._container);
24
+ }
25
+ formatValue(v, options = {}) {
26
+ if (v === null)
27
+ return `(null)`;
28
+ if (v === undefined)
29
+ return `(undefined)`;
30
+ if (typeof v === `boolean`)
31
+ return v ? `true` : `false`;
32
+ if (typeof v === `string`)
33
+ return `"${v}"`;
34
+ if (typeof v === `number`) {
35
+ let vAsNumber = v;
36
+ if (options.roundNumbers !== undefined)
37
+ vAsNumber = round(options.roundNumbers, v);
38
+ if (options.precision !== undefined)
39
+ return vAsNumber.toFixed(options.precision);
40
+ return vAsNumber.toString();
41
+ }
42
+ return JSON.stringify(v);
43
+ }
44
+ displayData(o) {
45
+ if (o === null) {
46
+ this.innerHTML = ``;
47
+ return;
48
+ }
49
+ for (const [key, value] of Object.entries(o)) {
50
+ const domKey = `path-${key}`;
51
+ if (typeof value === `object`) {
52
+ const element = this.getOrCreate(domKey, (parent) => {
53
+ parent.classList.add(`row`, `nested`);
54
+ const label = document.createElement(`label`);
55
+ label.textContent = key;
56
+ const valueElement = new DataDisplayComponent();
57
+ parent.append(label, valueElement);
58
+ });
59
+ const valueElement = element.querySelector(`data-display`);
60
+ if (valueElement !== null) {
61
+ valueElement.update(value);
62
+ }
63
+ }
64
+ else {
65
+ const element = this.getOrCreate(domKey, (parent) => {
66
+ parent.classList.add(`row`);
67
+ const label = document.createElement(`label`);
68
+ label.textContent = key;
69
+ const valueElement = document.createElement(`div`);
70
+ valueElement.textContent = this.formatValue(value);
71
+ parent.append(label, valueElement);
72
+ });
73
+ const valueElement = element.querySelector(`div`);
74
+ if (valueElement === null) {
75
+ console.warn(`data-display.displayData Unexpected case?`);
76
+ //debugger;
77
+ }
78
+ else {
79
+ valueElement.innerHTML = this.formatValue(value);
80
+ }
81
+ }
82
+ }
83
+ // const paths = getFieldPaths(o);
84
+ // console.log(`paths: ${ JSON.stringify(paths) }`);
85
+ // for (const path of paths) {
86
+ // }
87
+ }
88
+ getOrCreate(path, init) {
89
+ const element = this._shadow.getElementById(path);
90
+ if (element !== null)
91
+ return element;
92
+ const elementCreated = document.createElement(`div`);
93
+ elementCreated.id = path;
94
+ if (init)
95
+ init(elementCreated);
96
+ this._container.append(elementCreated);
97
+ return elementCreated;
98
+ }
99
+ update(value) {
100
+ if (this.previousValue === undefined) {
101
+ this.displayData(value);
102
+ }
103
+ else {
104
+ this.displayData(changedObjectDataFields(this.previousValue, value));
105
+ }
106
+ this.previousValue = value;
107
+ }
108
+ }
109
+ customElements.define(`data-display`, DataDisplayComponent);
110
+ //# sourceMappingURL=data-display.js.map