@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,279 @@
|
|
|
1
|
+
import { t as __decorate } from "./decorate-BZbkqIhA.js";
|
|
2
|
+
import { LitElement, css } from "lit";
|
|
3
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
4
|
+
//#region src/editable-label/editable-label.ts
|
|
5
|
+
let EditableLabel = class EditableLabel extends LitElement {
|
|
6
|
+
constructor(..._args) {
|
|
7
|
+
super(..._args);
|
|
8
|
+
this.mode = `label`;
|
|
9
|
+
this.entryMode = `free`;
|
|
10
|
+
this.value = ``;
|
|
11
|
+
this.disabled = false;
|
|
12
|
+
this.placeholder = ``;
|
|
13
|
+
this.displayTextLogic = `hidden`;
|
|
14
|
+
this.appearDelay = 50;
|
|
15
|
+
this.disappearDelay = 1e3;
|
|
16
|
+
this._editing = false;
|
|
17
|
+
this._prevValue = ``;
|
|
18
|
+
this._hovering = false;
|
|
19
|
+
this._transientShowingValue = false;
|
|
20
|
+
this._transientTimer = void 0;
|
|
21
|
+
this._showModeWaitingToHide = false;
|
|
22
|
+
this._onMouseEnter = () => {
|
|
23
|
+
if (this.displayTextLogic !== `transient`) return;
|
|
24
|
+
this._hovering = true;
|
|
25
|
+
this._clearTransientTimer();
|
|
26
|
+
this._transientTimer = window.setTimeout(() => {
|
|
27
|
+
this._transientShowingValue = true;
|
|
28
|
+
this._requestDisplayUpdate();
|
|
29
|
+
}, this.appearDelay);
|
|
30
|
+
};
|
|
31
|
+
this._onMouseLeave = () => {
|
|
32
|
+
if (this.displayTextLogic !== `transient`) return;
|
|
33
|
+
this._hovering = false;
|
|
34
|
+
this._startTransientRevertTimer();
|
|
35
|
+
};
|
|
36
|
+
this._handleFocus = () => {
|
|
37
|
+
if (this.mode === `editor` && !this.disabled && !this._editing) this._beginEdit();
|
|
38
|
+
};
|
|
39
|
+
this._handleBlur = () => {
|
|
40
|
+
if (this._editing) this._tryCommit();
|
|
41
|
+
};
|
|
42
|
+
this._handleKeydown = (e) => {
|
|
43
|
+
if (!this._editing) return;
|
|
44
|
+
if (e.key === `Enter`) {
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
this._tryCommit();
|
|
47
|
+
if (this.mode === `editor`) this._contentEl?.blur();
|
|
48
|
+
} else if (e.key === `Escape`) {
|
|
49
|
+
e.preventDefault();
|
|
50
|
+
this._cancelEdit();
|
|
51
|
+
if (this.mode === `editor`) this._contentEl?.blur();
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
this._handleBeforeInput = (e) => {
|
|
55
|
+
if (e.inputType !== `insertText` || !e.data) return;
|
|
56
|
+
if (!this._isAllowedInput(e.data)) e.preventDefault();
|
|
57
|
+
};
|
|
58
|
+
this._handleInput = () => {
|
|
59
|
+
if (!this._editing) return;
|
|
60
|
+
const raw = this._contentEl?.textContent?.trim() ?? ``;
|
|
61
|
+
this.dispatchEvent(new CustomEvent(`input`, {
|
|
62
|
+
detail: { value: raw },
|
|
63
|
+
bubbles: true,
|
|
64
|
+
composed: true
|
|
65
|
+
}));
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
get _contentEl() {
|
|
69
|
+
return this.renderRoot?.querySelector(`.content`) ?? void 0;
|
|
70
|
+
}
|
|
71
|
+
_clearTransientTimer() {
|
|
72
|
+
if (this._transientTimer !== void 0) {
|
|
73
|
+
clearTimeout(this._transientTimer);
|
|
74
|
+
this._transientTimer = void 0;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
_startTransientRevertTimer() {
|
|
78
|
+
this._clearTransientTimer();
|
|
79
|
+
this._transientTimer = window.setTimeout(() => {
|
|
80
|
+
if (!this._hovering && this.displayTextLogic === `transient`) {
|
|
81
|
+
this._transientShowingValue = false;
|
|
82
|
+
this._requestDisplayUpdate();
|
|
83
|
+
}
|
|
84
|
+
}, this.disappearDelay);
|
|
85
|
+
}
|
|
86
|
+
_requestDisplayUpdate() {
|
|
87
|
+
if (!this._editing) {
|
|
88
|
+
const el = this._contentEl;
|
|
89
|
+
if (el) el.textContent = this._getDisplayText();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Called by subclasses when user interacts (drag, keyboard, etc) to temporarily show value in transient mode */
|
|
93
|
+
_onUserInteraction() {
|
|
94
|
+
if (this.displayTextLogic !== `transient`) return;
|
|
95
|
+
this._clearTransientTimer();
|
|
96
|
+
this._transientTimer = window.setTimeout(() => {
|
|
97
|
+
this._transientShowingValue = true;
|
|
98
|
+
this._startTransientRevertTimer();
|
|
99
|
+
this._requestDisplayUpdate();
|
|
100
|
+
}, this.appearDelay);
|
|
101
|
+
}
|
|
102
|
+
_beginEdit() {
|
|
103
|
+
this._prevValue = this.value;
|
|
104
|
+
this._editing = true;
|
|
105
|
+
this.removeAttribute(`invalid`);
|
|
106
|
+
}
|
|
107
|
+
_tryCommit() {
|
|
108
|
+
let raw = this._contentEl?.textContent?.trim() ?? ``;
|
|
109
|
+
if (this.entryMode === `percent`) raw = raw.replaceAll(`%`, ``).trim();
|
|
110
|
+
if ((this.validator ?? this._defaultValidator.bind(this))(raw)) {
|
|
111
|
+
this.removeAttribute(`invalid`);
|
|
112
|
+
const prev = this.value;
|
|
113
|
+
this.value = raw;
|
|
114
|
+
this._editing = false;
|
|
115
|
+
if (raw !== prev) this.dispatchEvent(new CustomEvent(`change`, {
|
|
116
|
+
detail: { value: raw },
|
|
117
|
+
bubbles: true,
|
|
118
|
+
composed: true
|
|
119
|
+
}));
|
|
120
|
+
} else this._cancelEdit();
|
|
121
|
+
}
|
|
122
|
+
_cancelEdit() {
|
|
123
|
+
this.value = this._prevValue;
|
|
124
|
+
this._editing = false;
|
|
125
|
+
this.removeAttribute(`invalid`);
|
|
126
|
+
}
|
|
127
|
+
_getDisplayText() {
|
|
128
|
+
if (this._shouldUseDisplayText() && this.displayText !== void 0 && this.displayText !== ``) return this.displayText;
|
|
129
|
+
if (!this.value) return ``;
|
|
130
|
+
if (this.formatter) return this.formatter(this.value);
|
|
131
|
+
if (this.entryMode === `percent`) return `${this.value}%`;
|
|
132
|
+
return this.value;
|
|
133
|
+
}
|
|
134
|
+
_shouldUseDisplayText() {
|
|
135
|
+
if (this.displayTextLogic === `hidden`) return false;
|
|
136
|
+
if (this.displayTextLogic === `override`) return true;
|
|
137
|
+
if (this.displayTextLogic === `show`) {
|
|
138
|
+
if (this._editing) return false;
|
|
139
|
+
return this._showModeWaitingToHide;
|
|
140
|
+
}
|
|
141
|
+
if (this.displayTextLogic === `transient`) {
|
|
142
|
+
if (this._editing) return false;
|
|
143
|
+
if (this._transientShowingValue) return false;
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
_isAllowedInput(char) {
|
|
149
|
+
switch (this.entryMode) {
|
|
150
|
+
case `text`: return /^[a-z\s]$/i.test(char);
|
|
151
|
+
case `number`: return /^[\d.\-]$/.test(char);
|
|
152
|
+
case `percent`: return /^[\d.%]$/.test(char);
|
|
153
|
+
default: return true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
_defaultValidator(value) {
|
|
157
|
+
switch (this.entryMode) {
|
|
158
|
+
case `text`: return /^[a-z\s]*$/i.test(value);
|
|
159
|
+
case `number`: return value === `` || /^-?\d*(?:\.\d*)?$/.test(value);
|
|
160
|
+
case `percent`: return value === `` || /^\d*(?:\.\d*)?$/.test(value);
|
|
161
|
+
default: return true;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
static {
|
|
165
|
+
this.styles = [css`
|
|
166
|
+
:host {
|
|
167
|
+
display: inline-flex;
|
|
168
|
+
align-items: center;
|
|
169
|
+
justify-content: center;
|
|
170
|
+
|
|
171
|
+
--_font-size: var(--label-font-size, var(--text-m, 12px));
|
|
172
|
+
--_font-family: var(--label-font-family, var(--font-family, system-ui, sans-serif));
|
|
173
|
+
--_color: var(--label-color, var(--surface-2-text));
|
|
174
|
+
--_muted: var(--label-muted-color, var(--surface-muted-text, oklch(55% 0.02 240)));
|
|
175
|
+
--_padding: var(--label-padding, var(--space-xs, 3px) var(--space-s, 4px));
|
|
176
|
+
--_radius: var(--label-radius, var(--radius-s, 3px));
|
|
177
|
+
--_align: var(--label-align, center);
|
|
178
|
+
--_min-width: var(--label-min-width, 1ch);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.content {
|
|
182
|
+
box-sizing: border-box;
|
|
183
|
+
width: 100%;
|
|
184
|
+
text-align: var(--_align);
|
|
185
|
+
outline: none;
|
|
186
|
+
white-space: nowrap;
|
|
187
|
+
overflow: hidden;
|
|
188
|
+
text-overflow: ellipsis;
|
|
189
|
+
min-width: var(--_min-width);
|
|
190
|
+
font-family: var(--_font-family);
|
|
191
|
+
font-size: var(--_font-size);
|
|
192
|
+
color: var(--_color);
|
|
193
|
+
padding: var(--_padding);
|
|
194
|
+
border: 1px solid transparent;
|
|
195
|
+
border-radius: var(--_radius);
|
|
196
|
+
cursor: pointer;
|
|
197
|
+
transition:
|
|
198
|
+
background var(--transition, 0.15s ease-out),
|
|
199
|
+
border-color var(--transition, 0.15s ease-out);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* Remove overflow clipping while editing so the cursor is never hidden */
|
|
203
|
+
.content[contenteditable="plaintext-only"] {
|
|
204
|
+
overflow: visible;
|
|
205
|
+
text-overflow: clip;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* ── Label mode ── */
|
|
209
|
+
:host([mode="label"]) .content {
|
|
210
|
+
background: transparent;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
:host([mode="label"]) .content[contenteditable="plaintext-only"] {
|
|
214
|
+
background: var(--surface-4, oklch(22% 0.02 240));
|
|
215
|
+
border: var(--border, 1px solid oklch(25% 0.02 240));
|
|
216
|
+
cursor: text;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* ── Editor mode — always shows box ── */
|
|
220
|
+
:host([mode="editor"]) .content {
|
|
221
|
+
background: var(--surface-4, oklch(22% 0.02 240));
|
|
222
|
+
border: var(--border, 1px solid oklch(25% 0.02 240));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
:host([mode="editor"]) .content[contenteditable="plaintext-only"] {
|
|
226
|
+
border-color: var(--accent, oklch(60% 0.15 140));
|
|
227
|
+
cursor: text;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* ── Placeholder ── */
|
|
231
|
+
.content:empty::before {
|
|
232
|
+
content: attr(data-placeholder);
|
|
233
|
+
color: var(--_muted);
|
|
234
|
+
pointer-events: none;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* ── Invalid ── */
|
|
238
|
+
:host([invalid]) .content {
|
|
239
|
+
border-color: var(--error, oklch(60% 0.15 20));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* ── Disabled ── */
|
|
243
|
+
:host([disabled]) .content {
|
|
244
|
+
opacity: var(--disabled-opacity, 0.5);
|
|
245
|
+
cursor: not-allowed;
|
|
246
|
+
pointer-events: none;
|
|
247
|
+
}
|
|
248
|
+
`];
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
__decorate([property({ reflect: true })], EditableLabel.prototype, "mode", void 0);
|
|
252
|
+
__decorate([property({
|
|
253
|
+
attribute: `entry-mode`,
|
|
254
|
+
reflect: true
|
|
255
|
+
})], EditableLabel.prototype, "entryMode", void 0);
|
|
256
|
+
__decorate([property({ reflect: true })], EditableLabel.prototype, "value", void 0);
|
|
257
|
+
__decorate([property({
|
|
258
|
+
type: Boolean,
|
|
259
|
+
reflect: true
|
|
260
|
+
})], EditableLabel.prototype, "disabled", void 0);
|
|
261
|
+
__decorate([property()], EditableLabel.prototype, "placeholder", void 0);
|
|
262
|
+
__decorate([property({ attribute: `display-text` })], EditableLabel.prototype, "displayText", void 0);
|
|
263
|
+
__decorate([property({ attribute: `display-text-logic` })], EditableLabel.prototype, "displayTextLogic", void 0);
|
|
264
|
+
__decorate([property({
|
|
265
|
+
type: Number,
|
|
266
|
+
attribute: `appear-delay`
|
|
267
|
+
})], EditableLabel.prototype, "appearDelay", void 0);
|
|
268
|
+
__decorate([property({
|
|
269
|
+
type: Number,
|
|
270
|
+
attribute: `disappear-delay`
|
|
271
|
+
})], EditableLabel.prototype, "disappearDelay", void 0);
|
|
272
|
+
__decorate([property({ attribute: false })], EditableLabel.prototype, "validator", void 0);
|
|
273
|
+
__decorate([property({ attribute: false })], EditableLabel.prototype, "formatter", void 0);
|
|
274
|
+
__decorate([state()], EditableLabel.prototype, "_editing", void 0);
|
|
275
|
+
EditableLabel = __decorate([customElement(`ixfx-editable-label`)], EditableLabel);
|
|
276
|
+
//#endregion
|
|
277
|
+
export { EditableLabel };
|
|
278
|
+
|
|
279
|
+
//# sourceMappingURL=editable-label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editable-label.js","names":[],"sources":["../src/editable-label/editable-label.ts"],"sourcesContent":["/**\n * <ixfx-editable-label> — inline editable text label.\n *\n * Two display modes:\n * label (default) — renders as plain text until clicked, then becomes an editable box.\n * editor — always renders as an editable box; becomes active on focus/click.\n *\n * Entry modes (filter characters as typed):\n * free (default) — no restrictions\n * text — alphabetical characters and spaces only\n * number — digits, decimal point, minus sign\n * percent — digits, decimal point, percent sign\n *\n * Properties (not attributes):\n * validator (value: string) => boolean — override commit validation; default uses entry-mode rules\n * formatter (value: string) => string — transform committed value for display\n *\n * Events:\n * input — CustomEvent<{ value: string }>, bubbles + composed; fired as value changes during editing\n * change — CustomEvent<{ value: string }>, bubbles + composed; fired when value is committed\n *\n * CSS variables:\n * --label-font-size defaults to var(--text-m, 12px)\n * --label-font-family defaults to var(--font-family, system-ui, sans-serif)\n * --label-color defaults to var(--surface-2-text)\n * --label-muted-color placeholder colour, defaults to var(--surface-muted-text)\n * --label-padding defaults to var(--space-xs, 3px) var(--space-s, 4px)\n * --label-radius defaults to var(--radius-s, 3px)\n * --label-align text alignment: left | center (default) | right\n */\nimport type { CSSResult } from 'lit';\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\n\nexport type EditableMode = `label` | `editor`;\nexport type EntryMode = `free` | `text` | `number` | `percent`;\nexport type DisplayTextLogic = `hidden` | `show` | `override` | `transient`;\n\nexport type EditableLabelChangeDetail = {\n readonly value: string;\n};\nexport type EditableLabelChangeEvent = CustomEvent<EditableLabelChangeDetail>;\n\n@customElement(`ixfx-editable-label`)\nexport class EditableLabel extends LitElement {\n @property({ reflect: true }) mode: EditableMode = `label`;\n @property({ attribute: `entry-mode`, reflect: true }) entryMode: EntryMode = `free`;\n @property({ reflect: true }) value = ``;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property() placeholder = ``;\n\n /** Override displayed text. Bypasses formatter and value. When editing, shows raw value. */\n @property({ attribute: `display-text` }) displayText?: string;\n\n /**\n * Controls when displayText is shown:\n * - 'hidden' (default): never use displayText\n * - 'show': show displayText instead of formatted value, but hide while editing; revert after disappearDelay\n * - 'override': always show displayText, even when editing\n * - 'transient': show displayText by default, switch to formatted value after appearDelay on hover/interaction; revert after disappearDelay\n */\n @property({ attribute: `display-text-logic` }) displayTextLogic: DisplayTextLogic = `hidden`;\n\n /** Delay before showing value in transient mode (ms). Default: 50 */\n @property({ type: Number, attribute: `appear-delay` }) appearDelay = 50;\n\n /** Delay before reverting to displayText after editing ends (ms). Default: 1000 */\n @property({ type: Number, attribute: `disappear-delay` }) disappearDelay = 1000;\n\n /** Override commit validation. Return true to accept, false to reject (reverts). */\n @property({ attribute: false }) validator?: (value: string) => boolean;\n\n /** Transform the committed value for display. Does not affect the stored value. */\n @property({ attribute: false }) formatter?: (value: string) => string;\n\n @state() protected _editing = false;\n\n protected get _contentEl(): HTMLElement | undefined {\n return this.renderRoot?.querySelector<HTMLElement>(`.content`) ?? undefined;\n }\n\n /** Snapshot of value taken when editing begins; restored on cancel. */\n protected _prevValue = ``;\n\n // ── Transient display state ─────────────────────────────────────────────────\n protected _hovering = false;\n protected _transientShowingValue = false;\n protected _transientTimer: number | undefined = undefined;\n protected _showModeWaitingToHide = false;\n\n protected _clearTransientTimer(): void {\n if (this._transientTimer !== undefined) {\n clearTimeout(this._transientTimer);\n this._transientTimer = undefined;\n }\n }\n\n private _onMouseEnter = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = true;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n private _onMouseLeave = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = false;\n this._startTransientRevertTimer();\n };\n\n protected _startTransientRevertTimer(): void {\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering && this.displayTextLogic === `transient`) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n }\n\n protected _requestDisplayUpdate(): void {\n if (!this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this._getDisplayText();\n }\n }\n }\n\n /** Called by subclasses when user interacts (drag, keyboard, etc) to temporarily show value in transient mode */\n protected _onUserInteraction(): void {\n if (this.displayTextLogic !== `transient`)\n return;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._startTransientRevertTimer();\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n protected _handleFocus = (): void => {\n if (this.mode === `editor` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleBlur = (): void => {\n if (this._editing)\n this._tryCommit();\n };\n\n protected _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._editing)\n return;\n if (e.key === `Enter`) {\n e.preventDefault();\n this._tryCommit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n } else if (e.key === `Escape`) {\n e.preventDefault();\n this._cancelEdit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n }\n };\n\n protected _handleBeforeInput = (e: InputEvent): void => {\n if (e.inputType !== `insertText` || !e.data)\n return;\n if (!this._isAllowedInput(e.data)) {\n e.preventDefault();\n }\n };\n\n protected _handleInput = (): void => {\n if (!this._editing)\n return;\n\n const raw = this._contentEl?.textContent?.trim() ?? ``;\n\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`input`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n };\n\n // ── Core logic ───────────────────────────────────────────────────────────\n\n protected _beginEdit(): void {\n this._prevValue = this.value;\n this._editing = true;\n this.removeAttribute(`invalid`);\n }\n\n protected _tryCommit(): void {\n let raw = this._contentEl?.textContent?.trim() ?? ``;\n if (this.entryMode === `percent`)\n raw = raw.replaceAll(`%`, ``).trim();\n const validate = this.validator ?? this._defaultValidator.bind(this);\n if (validate(raw)) {\n this.removeAttribute(`invalid`);\n const prev = this.value;\n this.value = raw;\n this._editing = false;\n if (raw !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n }\n } else {\n this._cancelEdit();\n }\n }\n\n protected _cancelEdit(): void {\n this.value = this._prevValue;\n this._editing = false;\n this.removeAttribute(`invalid`);\n }\n\n protected _getDisplayText(): string {\n const useDisplayText = this._shouldUseDisplayText();\n if (useDisplayText && this.displayText !== undefined && this.displayText !== ``) {\n return this.displayText;\n }\n if (!this.value)\n return ``;\n if (this.formatter)\n return this.formatter(this.value);\n if (this.entryMode === `percent`)\n return `${this.value}%`;\n return this.value;\n }\n\n protected _shouldUseDisplayText(): boolean {\n if (this.displayTextLogic === `hidden`)\n return false;\n if (this.displayTextLogic === `override`)\n return true;\n if (this.displayTextLogic === `show`) {\n if (this._editing)\n return false;\n return this._showModeWaitingToHide;\n }\n if (this.displayTextLogic === `transient`) {\n if (this._editing)\n return false;\n if (this._transientShowingValue)\n return false;\n return true;\n }\n return false;\n }\n\n protected _isAllowedInput(char: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]$/i.test(char);\n case `number`: return /^[\\d.\\-]$/.test(char);\n case `percent`: return /^[\\d.%]$/.test(char);\n default: return true;\n }\n }\n\n private _defaultValidator(value: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]*$/i.test(value);\n case `number`: return value === `` || /^-?\\d*(?:\\.\\d*)?$/.test(value);\n case `percent`: return value === `` || /^\\d*(?:\\.\\d*)?$/.test(value);\n default: return true;\n } // asdf\n }\n\n // ── Styles ───────────────────────────────────────────────────────────────\n\n static override styles: CSSResult[] = [css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n --_font-size: var(--label-font-size, var(--text-m, 12px));\n --_font-family: var(--label-font-family, var(--font-family, system-ui, sans-serif));\n --_color: var(--label-color, var(--surface-2-text));\n --_muted: var(--label-muted-color, var(--surface-muted-text, oklch(55% 0.02 240)));\n --_padding: var(--label-padding, var(--space-xs, 3px) var(--space-s, 4px));\n --_radius: var(--label-radius, var(--radius-s, 3px));\n --_align: var(--label-align, center);\n --_min-width: var(--label-min-width, 1ch);\n }\n\n .content {\n box-sizing: border-box;\n width: 100%;\n text-align: var(--_align);\n outline: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: var(--_min-width);\n font-family: var(--_font-family);\n font-size: var(--_font-size);\n color: var(--_color);\n padding: var(--_padding);\n border: 1px solid transparent;\n border-radius: var(--_radius);\n cursor: pointer;\n transition:\n background var(--transition, 0.15s ease-out),\n border-color var(--transition, 0.15s ease-out);\n }\n\n /* Remove overflow clipping while editing so the cursor is never hidden */\n .content[contenteditable=\"plaintext-only\"] {\n overflow: visible;\n text-overflow: clip;\n }\n\n /* ── Label mode ── */\n :host([mode=\"label\"]) .content {\n background: transparent;\n }\n\n :host([mode=\"label\"]) .content[contenteditable=\"plaintext-only\"] {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n cursor: text;\n }\n\n /* ── Editor mode — always shows box ── */\n :host([mode=\"editor\"]) .content {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n }\n\n :host([mode=\"editor\"]) .content[contenteditable=\"plaintext-only\"] {\n border-color: var(--accent, oklch(60% 0.15 140));\n cursor: text;\n }\n\n /* ── Placeholder ── */\n .content:empty::before {\n content: attr(data-placeholder);\n color: var(--_muted);\n pointer-events: none;\n }\n\n /* ── Invalid ── */\n :host([invalid]) .content {\n border-color: var(--error, oklch(60% 0.15 20));\n }\n\n /* ── Disabled ── */\n :host([disabled]) .content {\n opacity: var(--disabled-opacity, 0.5);\n cursor: not-allowed;\n pointer-events: none;\n }\n `];\n}\n\nfunction _selectAll(el: HTMLElement): void {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-editable-label': EditableLabel;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import * as _$lit from "lit";
|
|
2
|
+
import { LitElement } from "lit";
|
|
3
|
+
|
|
4
|
+
//#region src/hex/types.d.ts
|
|
5
|
+
type BytePos = number;
|
|
6
|
+
type SingleSelection = {
|
|
7
|
+
readonly kind: 'single';
|
|
8
|
+
readonly pos: BytePos;
|
|
9
|
+
};
|
|
10
|
+
type ContiguousSelection = {
|
|
11
|
+
readonly kind: 'contiguous';
|
|
12
|
+
readonly start: BytePos;
|
|
13
|
+
readonly end: BytePos;
|
|
14
|
+
};
|
|
15
|
+
type RectangularSelection = {
|
|
16
|
+
readonly kind: 'rectangular';
|
|
17
|
+
readonly x: number;
|
|
18
|
+
readonly y: number;
|
|
19
|
+
readonly width: number;
|
|
20
|
+
readonly height: number;
|
|
21
|
+
};
|
|
22
|
+
type Selection = SingleSelection | ContiguousSelection | RectangularSelection | null;
|
|
23
|
+
type DiffEntry = {
|
|
24
|
+
readonly before: number;
|
|
25
|
+
readonly after: number;
|
|
26
|
+
};
|
|
27
|
+
type Diff = ReadonlyMap<BytePos, DiffEntry>;
|
|
28
|
+
type ColourScheme = 'ascii' | 'shade';
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/hex/hex-editor.d.ts
|
|
31
|
+
declare class IxfxHexEditorElement extends LitElement {
|
|
32
|
+
columns: number;
|
|
33
|
+
colourScheme: ColourScheme;
|
|
34
|
+
showChangeset: boolean;
|
|
35
|
+
hideOffsetCol: boolean;
|
|
36
|
+
hideHexCol: boolean;
|
|
37
|
+
hideTextCol: boolean;
|
|
38
|
+
private _selection;
|
|
39
|
+
private _scrollTop;
|
|
40
|
+
private _editState;
|
|
41
|
+
private _containerH;
|
|
42
|
+
private _shadeMap;
|
|
43
|
+
private _focusSide;
|
|
44
|
+
private _store;
|
|
45
|
+
private _undoStack;
|
|
46
|
+
private _copyBuffer;
|
|
47
|
+
private _rowHeight;
|
|
48
|
+
private _dragStart;
|
|
49
|
+
private _dragAnchor;
|
|
50
|
+
private _rectAnchorX;
|
|
51
|
+
private _rectAnchorY;
|
|
52
|
+
private _rectAnchorXFromKeyboard;
|
|
53
|
+
private _rectAnchorYFromKeyboard;
|
|
54
|
+
private _initialSelectionPoint;
|
|
55
|
+
private _currentCursorPoint;
|
|
56
|
+
private _pointerMode;
|
|
57
|
+
private _currentDragDiff;
|
|
58
|
+
private _shiftClickTarget;
|
|
59
|
+
static styles: _$lit.CSSResult;
|
|
60
|
+
setData(data: Uint8Array): void;
|
|
61
|
+
undo(): void;
|
|
62
|
+
redo(): void;
|
|
63
|
+
recomputeColours(): void;
|
|
64
|
+
selectedBytes(): Generator<{
|
|
65
|
+
selection_index: number;
|
|
66
|
+
array_index: number;
|
|
67
|
+
value: number;
|
|
68
|
+
}>;
|
|
69
|
+
containsPosition(pos: number): boolean;
|
|
70
|
+
selectSingle(position: number): void;
|
|
71
|
+
selectContiguous(start: number, end: number): void;
|
|
72
|
+
selectRectangular(x: number, y: number, width: number, height: number): void;
|
|
73
|
+
clearSelection(): void;
|
|
74
|
+
getSelection(): Selection;
|
|
75
|
+
protected firstUpdated(): void;
|
|
76
|
+
private _onScroll;
|
|
77
|
+
private _onPointerDown;
|
|
78
|
+
private _onPointerMove;
|
|
79
|
+
private _onPointerUp;
|
|
80
|
+
private _onKeyDown;
|
|
81
|
+
private _handleBackspace;
|
|
82
|
+
private _handleValueEntry;
|
|
83
|
+
private _commitDecimalValue;
|
|
84
|
+
private _advanceCursor;
|
|
85
|
+
private _dispatchChangeEvent;
|
|
86
|
+
private _dispatchSelectEvent;
|
|
87
|
+
private _copy;
|
|
88
|
+
private _paste;
|
|
89
|
+
private _parseHexString;
|
|
90
|
+
private _getColHeaders;
|
|
91
|
+
private _isRowShaded;
|
|
92
|
+
private _isHexShaded;
|
|
93
|
+
private _isTextShaded;
|
|
94
|
+
protected render(): _$lit.TemplateResult<1>;
|
|
95
|
+
private _renderRow;
|
|
96
|
+
private _renderColumn;
|
|
97
|
+
private _renderHexCell;
|
|
98
|
+
private _renderTextChar;
|
|
99
|
+
}
|
|
100
|
+
type HexChangeDetail = {
|
|
101
|
+
readonly diff: Diff;
|
|
102
|
+
};
|
|
103
|
+
type HexChangeEvent = CustomEvent<HexChangeDetail>;
|
|
104
|
+
type SingleSelectEventDetail = {
|
|
105
|
+
readonly type: `single`;
|
|
106
|
+
readonly position: number;
|
|
107
|
+
};
|
|
108
|
+
type ContiguousSelectEventDetail = {
|
|
109
|
+
readonly type: `contiguous`;
|
|
110
|
+
readonly start: number;
|
|
111
|
+
readonly end: number;
|
|
112
|
+
};
|
|
113
|
+
type RectangularSelectEventDetail = {
|
|
114
|
+
readonly type: `rectangular`;
|
|
115
|
+
readonly x: number;
|
|
116
|
+
readonly y: number;
|
|
117
|
+
readonly width: number;
|
|
118
|
+
readonly height: number;
|
|
119
|
+
};
|
|
120
|
+
type NoneSelectEventDetail = {
|
|
121
|
+
readonly type: `none`;
|
|
122
|
+
};
|
|
123
|
+
type SelectEventDetail = SingleSelectEventDetail | ContiguousSelectEventDetail | RectangularSelectEventDetail | NoneSelectEventDetail;
|
|
124
|
+
declare global {
|
|
125
|
+
interface HTMLElementTagNameMap {
|
|
126
|
+
'ixfx-hex-editor': IxfxHexEditorElement;
|
|
127
|
+
}
|
|
128
|
+
} //# sourceMappingURL=hex-editor.d.ts.map
|
|
129
|
+
//#endregion
|
|
130
|
+
export { NoneSelectEventDetail as a, SingleSelectEventDetail as c, IxfxHexEditorElement as i, HexChangeDetail as n, RectangularSelectEventDetail as o, HexChangeEvent as r, SelectEventDetail as s, ContiguousSelectEventDetail as t };
|
|
131
|
+
//# sourceMappingURL=hex-editor-Gib1Grg2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-editor-Gib1Grg2.d.ts","names":[],"sources":["../src/hex/types.ts","../src/hex/hex-editor.ts"],"mappings":"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"}
|