@ixfx/components 0.5.20 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/index.d.ts +535 -263
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +7971 -6596
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +12 -7
- package/dist/ac-text.d.ts.map +1 -1
- package/dist/ac-text.js +3 -4
- package/dist/ac-text.js.map +1 -1
- package/dist/ac-token-DVbmHmky.d.ts +107 -0
- package/dist/ac-token-DVbmHmky.d.ts.map +1 -0
- package/dist/ac-token.d.ts +2 -0
- package/dist/ac-token.js +646 -0
- package/dist/ac-token.js.map +1 -0
- package/dist/{button-pcDaCemT.js → button-Bn0BuLpO.js} +3 -4
- package/dist/{button-pcDaCemT.js.map → button-Bn0BuLpO.js.map} +1 -1
- package/dist/button.d.ts +1 -2
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -1
- package/dist/checkbox.d.ts +0 -1
- package/dist/checkbox.d.ts.map +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/checkbox.js.map +1 -1
- package/dist/{colour-picker-D43Q96r0.js → colour-picker-0stHB90J.js} +11 -14
- package/dist/{colour-picker-D43Q96r0.js.map → colour-picker-0stHB90J.js.map} +1 -1
- package/dist/colour-picker.d.ts +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +4 -2
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +1152 -1
- package/dist/crumbs.js.map +1 -0
- package/dist/data-controller-DOlmqNKb.js +171 -0
- package/dist/data-controller-DOlmqNKb.js.map +1 -0
- package/dist/data-display.d.ts +1 -2
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +24 -22
- package/dist/data-display.js.map +1 -1
- package/dist/data-grid-BeAkORz2.d.ts +215 -0
- package/dist/data-grid-BeAkORz2.d.ts.map +1 -0
- package/dist/data-grid.d.ts +2 -0
- package/dist/data-grid.js +1225 -0
- package/dist/data-grid.js.map +1 -0
- package/dist/data-provider-BAn_-oR1.d.ts +61 -0
- package/dist/data-provider-BAn_-oR1.d.ts.map +1 -0
- package/dist/{decorate-DdjvVHS-.js → decorate-VRK8rslU.js} +2 -2
- package/dist/{decorate-DdjvVHS-.js.map → decorate-VRK8rslU.js.map} +1 -1
- package/dist/{defaults-BkWCPJFL.js → defaults-BCiDhZbF.js} +20 -3
- package/dist/defaults-BCiDhZbF.js.map +1 -0
- package/dist/drag-ghost-DtSDvjri.js +85 -0
- package/dist/drag-ghost-DtSDvjri.js.map +1 -0
- package/dist/editable-label.d.ts +1 -2
- package/dist/editable-label.d.ts.map +1 -1
- package/dist/editable-label.js +1 -1
- package/dist/editable-label.js.map +1 -1
- package/dist/{incr-search-CeERfijK.js → element-search-Y8SRfPGM.js} +7 -135
- package/dist/element-search-Y8SRfPGM.js.map +1 -0
- package/dist/form-CsXJX15p.js +64 -0
- package/dist/form-CsXJX15p.js.map +1 -0
- package/dist/form.d.ts +15 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +2 -0
- package/dist/grouped-item-lister-CNLMgdIr.d.ts +121 -0
- package/dist/grouped-item-lister-CNLMgdIr.d.ts.map +1 -0
- package/dist/grouped-item-lister.d.ts +2 -0
- package/dist/grouped-item-lister.js +177 -0
- package/dist/grouped-item-lister.js.map +1 -0
- package/dist/{hex-editor-B-UI4OZu.js → hex-editor-Bk6rxhfg.js} +6 -8
- package/dist/{hex-editor-B-UI4OZu.js.map → hex-editor-Bk6rxhfg.js.map} +1 -1
- package/dist/{hex-editor-CMIxtNgT.d.ts → hex-editor-Caq8vNQk.d.ts} +2 -3
- package/dist/hex-editor-Caq8vNQk.d.ts.map +1 -0
- package/dist/hex.d.ts +1 -1
- package/dist/hex.js +1 -1
- package/dist/highlight-B-eQrhhb.js.map +1 -1
- package/dist/{icon-Bd5BiU4b.d.ts → icon-BUwP1CZ1.d.ts} +3 -4
- package/dist/icon-BUwP1CZ1.d.ts.map +1 -0
- package/dist/{icon-CK14NUcE.js → icons-Bm2ByQ3s.js} +10 -5
- package/dist/icons-Bm2ByQ3s.js.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +2 -8
- package/dist/incr-search-vCzuao-2.js +137 -0
- package/dist/incr-search-vCzuao-2.js.map +1 -0
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +2 -1
- package/dist/{index-DrKRD8_a.d.ts → index-BOUaDIW-.d.ts} +4 -4
- package/dist/index-BOUaDIW-.d.ts.map +1 -0
- package/dist/{index-CkMIKEWp.d.ts → index-BUB5SICW.d.ts} +3 -4
- package/dist/index-BUB5SICW.d.ts.map +1 -0
- package/dist/{index-tX6fKF8m.d.ts → index-BeuCXtiO.d.ts} +3 -3
- package/dist/index-BeuCXtiO.d.ts.map +1 -0
- package/dist/{index-BslNaMLo.d.ts → index-Cu5i8zZY.d.ts} +3 -3
- package/dist/index-Cu5i8zZY.d.ts.map +1 -0
- package/dist/{index-D87kRcEs.d.ts → index-RqMh1i-O.d.ts} +2 -1
- package/dist/index-RqMh1i-O.d.ts.map +1 -0
- package/dist/{index-Cdmrn0SZ.d.ts → index-ovq_GTdl.d.ts} +11 -11
- package/dist/index-ovq_GTdl.d.ts.map +1 -0
- package/dist/index.d.ts +93 -606
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1351 -3714
- package/dist/index.js.map +1 -1
- package/dist/{labelled-input-base-ORb1rGq6.d.ts → labelled-input-base-Dp_9KP0G.d.ts} +2 -3
- package/dist/labelled-input-base-Dp_9KP0G.d.ts.map +1 -0
- package/dist/{labelled-input-base-9K_w3oLj.js → labelled-input-base-hoKGwyKT.js} +2 -2
- package/dist/{labelled-input-base-9K_w3oLj.js.map → labelled-input-base-hoKGwyKT.js.map} +1 -1
- package/dist/labelled-radial-input.d.ts +4 -5
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-radial-input.js +2 -3
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +2 -2
- package/dist/labelled-range-input.js.map +1 -1
- package/dist/led.d.ts +1 -2
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +1 -1
- package/dist/led.js.map +1 -1
- package/dist/menu-DIfU70AA.js +1609 -0
- package/dist/menu-DIfU70AA.js.map +1 -0
- package/dist/{menu-item-AtoP6bD4.d.ts → menu-item-BG5w7fi4.d.ts} +4 -4
- package/dist/menu-item-BG5w7fi4.d.ts.map +1 -0
- package/dist/menu.d.ts +2 -2
- package/dist/menu.js +1 -2
- package/dist/miller.d.ts +7 -5
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +23 -25
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.d.ts +1 -2
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +14 -13
- package/dist/narrowed-text.js.map +1 -1
- package/dist/notification-pill-DyZydXoZ.d.ts +68 -0
- package/dist/notification-pill-DyZydXoZ.d.ts.map +1 -0
- package/dist/notifier.d.ts +2 -0
- package/dist/notifier.js +146 -0
- package/dist/notifier.js.map +1 -0
- package/dist/panel.d.ts +1 -1
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +1 -2
- package/dist/panel.js.map +1 -1
- package/dist/plots.d.ts +1 -1
- package/dist/plots.js +1 -1
- package/dist/polar-pad.d.ts +1 -2
- package/dist/polar-pad.d.ts.map +1 -1
- package/dist/polar-pad.js +2 -2
- package/dist/polar-pad.js.map +1 -1
- package/dist/{radial-input-Dhu5ZGP5.d.ts → radial-input-DXMN55Nz.d.ts} +2 -3
- package/dist/radial-input-DXMN55Nz.d.ts.map +1 -0
- package/dist/{radial-input-C4f-2Bya.js → radial-input-Dk8Wydp5.js} +26 -16
- package/dist/radial-input-Dk8Wydp5.js.map +1 -0
- package/dist/radial-input.d.ts +1 -1
- package/dist/radial-input.js +1 -1
- package/dist/range-input.d.ts +2 -3
- package/dist/range-input.d.ts.map +1 -1
- package/dist/range-input.js +2 -2
- package/dist/range-input.js.map +1 -1
- package/dist/range.d.ts +2 -3
- package/dist/range.d.ts.map +1 -1
- package/dist/range.js +2 -2
- package/dist/range.js.map +1 -1
- package/dist/scroll-fade-CAs1EabA.js +70 -0
- package/dist/scroll-fade-CAs1EabA.js.map +1 -0
- package/dist/select-horiz.d.ts +50 -0
- package/dist/select-horiz.d.ts.map +1 -0
- package/dist/select-horiz.js +263 -0
- package/dist/select-horiz.js.map +1 -0
- package/dist/{slider-input-SW7e2Ac2.js → slider-input-CT4gcF-o.js} +30 -27
- package/dist/{slider-input-SW7e2Ac2.js.map → slider-input-CT4gcF-o.js.map} +1 -1
- package/dist/{slider-input-BEaztT-g.d.ts → slider-input-XppH3vcy.d.ts} +2 -3
- package/dist/slider-input-XppH3vcy.d.ts.map +1 -0
- package/dist/slider-input.d.ts +1 -1
- package/dist/slider-input.js +1 -1
- package/dist/snackbar.d.ts +58 -0
- package/dist/snackbar.d.ts.map +1 -0
- package/dist/snackbar.js +265 -0
- package/dist/snackbar.js.map +1 -0
- package/dist/snap-container.d.ts +1 -2
- package/dist/snap-container.d.ts.map +1 -1
- package/dist/snap-container.js +6 -5
- package/dist/snap-container.js.map +1 -1
- package/dist/split-layout.d.ts +1 -2
- package/dist/split-layout.d.ts.map +1 -1
- package/dist/split-layout.js +5 -3
- package/dist/split-layout.js.map +1 -1
- package/dist/swipe.d.ts +1 -2
- package/dist/swipe.d.ts.map +1 -1
- package/dist/swipe.js +4 -3
- package/dist/swipe.js.map +1 -1
- package/dist/{tab-list-B8v9KntS.d.ts → tab-list-Beuh2nom.d.ts} +4 -4
- package/dist/tab-list-Beuh2nom.d.ts.map +1 -0
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +533 -1
- package/dist/tabs.js.map +1 -0
- package/dist/{tickled-controller-JDOR9B8V.d.ts → tickled-controller-BtevrRLV.d.ts} +1 -2
- package/dist/tickled-controller-BtevrRLV.d.ts.map +1 -0
- package/dist/{tickled-styles-Bgo_Lpw-.js → tickled-controller-DkAU-0qL.js} +2 -88
- package/dist/tickled-controller-DkAU-0qL.js.map +1 -0
- package/dist/tickled-styles-BrAHEj1q.js +89 -0
- package/dist/tickled-styles-BrAHEj1q.js.map +1 -0
- package/dist/{timeline-CdSI003L.js → timeline-B2fgDL4U.js} +3 -3
- package/dist/{timeline-CdSI003L.js.map → timeline-B2fgDL4U.js.map} +1 -1
- package/dist/timeline.d.ts +1 -1
- package/dist/timeline.js +1 -1
- package/dist/{tooltip-BMTSUPBU.d.ts → tooltip-BlvBUQxx.d.ts} +2 -3
- package/dist/tooltip-BlvBUQxx.d.ts.map +1 -0
- package/dist/transitory-label.d.ts +30 -0
- package/dist/transitory-label.d.ts.map +1 -0
- package/dist/transitory-label.js +249 -0
- package/dist/transitory-label.js.map +1 -0
- package/dist/{tree-CqPhQRHo.js → tree-BO6BXI2b.js} +9 -10
- package/dist/{tree-CqPhQRHo.js.map → tree-BO6BXI2b.js.map} +1 -1
- package/dist/{tree-component-CDLO1ITF.d.ts → tree-component-BvV4muxx.d.ts} +8 -124
- package/dist/tree-component-BvV4muxx.d.ts.map +1 -0
- package/dist/tree.d.ts +9 -4
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1
- package/dist/types-Bc23SI94.d.ts +72 -0
- package/dist/types-Bc23SI94.d.ts.map +1 -0
- package/dist/types-DlVNJez_.d.ts +41 -0
- package/dist/types-DlVNJez_.d.ts.map +1 -0
- package/dist/vertical-list.d.ts +122 -0
- package/dist/vertical-list.d.ts.map +1 -0
- package/dist/vertical-list.js +737 -0
- package/dist/vertical-list.js.map +1 -0
- package/dist/{wheel-nudge-Dhzi5nHc.js → wheel-nudge-BlSCe_hD.js} +2 -2
- package/dist/wheel-nudge-BlSCe_hD.js.map +1 -0
- package/dist/{wheel-nudge-C-ra_1os.d.ts → wheel-nudge-DGrNzWuE.d.ts} +3 -4
- package/dist/wheel-nudge-DGrNzWuE.d.ts.map +1 -0
- package/dist/{xy-axis-CtDDQzGZ.d.ts → xy-axis-5KhVTNoX.d.ts} +8 -6
- package/dist/xy-axis-5KhVTNoX.d.ts.map +1 -0
- package/dist/{xy-axis-BpA2eJq6.js → xy-axis-B6yMjckW.js} +8 -112
- package/dist/xy-axis-B6yMjckW.js.map +1 -0
- package/dist/xy-pad.d.ts +1 -2
- package/dist/xy-pad.d.ts.map +1 -1
- package/dist/xy-pad.js +2 -2
- package/dist/xy-pad.js.map +1 -1
- package/docs-user/README.md +3 -2
- package/docs-user/data-grid.md +248 -0
- package/docs-user/index.json +217 -0
- package/docs-user/llms.txt +57 -0
- package/docs-user/rating.md +102 -0
- package/llms.txt +57 -0
- package/package.json +21 -11
- package/dist/crumb-navigation-Pif-kupA.js +0 -1221
- package/dist/crumb-navigation-Pif-kupA.js.map +0 -1
- package/dist/defaults-BkWCPJFL.js.map +0 -1
- package/dist/hex-editor-CMIxtNgT.d.ts.map +0 -1
- package/dist/icon-Bd5BiU4b.d.ts.map +0 -1
- package/dist/icon-CK14NUcE.js.map +0 -1
- package/dist/icons.js.map +0 -1
- package/dist/incr-search-CeERfijK.js.map +0 -1
- package/dist/index-BslNaMLo.d.ts.map +0 -1
- package/dist/index-Cdmrn0SZ.d.ts.map +0 -1
- package/dist/index-CkMIKEWp.d.ts.map +0 -1
- package/dist/index-D87kRcEs.d.ts.map +0 -1
- package/dist/index-DrKRD8_a.d.ts.map +0 -1
- package/dist/index-tX6fKF8m.d.ts.map +0 -1
- package/dist/interaction-_Y2qO3QI.js +0 -1
- package/dist/labelled-input-base-ORb1rGq6.d.ts.map +0 -1
- package/dist/menu-BiFarLUA.js +0 -826
- package/dist/menu-BiFarLUA.js.map +0 -1
- package/dist/menu-item-AtoP6bD4.d.ts.map +0 -1
- package/dist/menu-item-yHSPV8nS.js +0 -783
- package/dist/menu-item-yHSPV8nS.js.map +0 -1
- package/dist/radial-input-C4f-2Bya.js.map +0 -1
- package/dist/radial-input-Dhu5ZGP5.d.ts.map +0 -1
- package/dist/registry-CkW7q09Q.js +0 -21
- package/dist/registry-CkW7q09Q.js.map +0 -1
- package/dist/selecthorizontal.d.ts +0 -16
- package/dist/selecthorizontal.d.ts.map +0 -1
- package/dist/selecthorizontal.js +0 -43
- package/dist/selecthorizontal.js.map +0 -1
- package/dist/slider-input-BEaztT-g.d.ts.map +0 -1
- package/dist/tab-list-B8v9KntS.d.ts.map +0 -1
- package/dist/tab-list-CR0v53KJ.js +0 -615
- package/dist/tab-list-CR0v53KJ.js.map +0 -1
- package/dist/tickled-controller-JDOR9B8V.d.ts.map +0 -1
- package/dist/tickled-styles-Bgo_Lpw-.js.map +0 -1
- package/dist/tooltip-BMTSUPBU.d.ts.map +0 -1
- package/dist/tree-component-CDLO1ITF.d.ts.map +0 -1
- package/dist/types-DSfbtHs3.d.ts +0 -8
- package/dist/types-DSfbtHs3.d.ts.map +0 -1
- package/dist/wheel-nudge-C-ra_1os.d.ts.map +0 -1
- package/dist/wheel-nudge-Dhzi5nHc.js.map +0 -1
- package/dist/xy-axis-BpA2eJq6.js.map +0 -1
- package/dist/xy-axis-CtDDQzGZ.d.ts.map +0 -1
- package/docs-user/selecthorizontal.md +0 -32
- /package/bundle/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
- /package/dist/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
1
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
2
2
|
import { LitElement, css, html } from "lit";
|
|
3
3
|
import { property, state } from "lit/decorators.js";
|
|
4
4
|
import { Colour } from "@ixfx/visual";
|
|
5
5
|
import { repeat } from "lit/directives/repeat.js";
|
|
6
6
|
import { styleMap } from "lit/directives/style-map.js";
|
|
7
7
|
//#region src/hex/colour.ts
|
|
8
|
-
const WHITESPACE_BYTES = new Set([
|
|
8
|
+
const WHITESPACE_BYTES = /* @__PURE__ */ new Set([
|
|
9
9
|
9,
|
|
10
10
|
10,
|
|
11
11
|
11,
|
|
@@ -54,7 +54,7 @@ function clamp(value) {
|
|
|
54
54
|
function writeByte(store, pos, value) {
|
|
55
55
|
const clampedValue = clamp(value);
|
|
56
56
|
const before = store.data[pos];
|
|
57
|
-
const diff = new Map([[pos, {
|
|
57
|
+
const diff = /* @__PURE__ */ new Map([[pos, {
|
|
58
58
|
before,
|
|
59
59
|
after: clampedValue
|
|
60
60
|
}]]);
|
|
@@ -263,9 +263,7 @@ function extendRectangular(sel, dir, columns, _dataLength, anchorX = 0, anchorY
|
|
|
263
263
|
height += 1;
|
|
264
264
|
}
|
|
265
265
|
break;
|
|
266
|
-
case `down`:
|
|
267
|
-
height += 1;
|
|
268
|
-
break;
|
|
266
|
+
case `down`: height += 1;
|
|
269
267
|
}
|
|
270
268
|
return {
|
|
271
269
|
kind: `rectangular`,
|
|
@@ -311,7 +309,7 @@ let IxfxHexEditorElement = class IxfxHexEditorElement extends LitElement {
|
|
|
311
309
|
this._containerH = 0;
|
|
312
310
|
this._shadeMap = null;
|
|
313
311
|
this._focusSide = null;
|
|
314
|
-
this._store = createHexStore(new Uint8Array(0));
|
|
312
|
+
this._store = createHexStore(/* @__PURE__ */ new Uint8Array(0));
|
|
315
313
|
this._undoStack = createUndoRedoStack();
|
|
316
314
|
this._copyBuffer = null;
|
|
317
315
|
this._rowHeight = 24;
|
|
@@ -1144,4 +1142,4 @@ IxfxHexEditorElement = __decorate([safeCustomElement(`ixfx-hex-editor`)], IxfxHe
|
|
|
1144
1142
|
//#endregion
|
|
1145
1143
|
export { IxfxHexEditorElement as t };
|
|
1146
1144
|
|
|
1147
|
-
//# sourceMappingURL=hex-editor-
|
|
1145
|
+
//# sourceMappingURL=hex-editor-Bk6rxhfg.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hex-editor-B-UI4OZu.js","names":["storeLength","undoDiff","redoDiff","customElement"],"sources":["../src/hex/colour.ts","../src/hex/data.ts","../src/hex/diff.ts","../src/hex/selection.ts","../src/hex/hex-editor.ts"],"sourcesContent":["import { Colour } from '@ixfx/visual';\n\nexport type ColourMap = {\n forByte: (byte: number) => string;\n};\n\nconst WHITESPACE_BYTES = new Set([0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x20]);\n\nfunction isControlByte(byte: number): boolean {\n return byte < 0x20 && byte !== 0x09 && byte !== 0x0A && byte !== 0x0B && byte !== 0x0C && byte !== 0x0D;\n}\n\nfunction isPrintableAscii(byte: number): boolean {\n return byte >= 0x20 && byte <= 0x7E;\n}\n\nexport function getAsciiClass(byte: number): string {\n if (byte === 0)\n return `byte-null`;\n if (WHITESPACE_BYTES.has(byte))\n return `byte-whitespace`;\n if (isControlByte(byte))\n return `byte-control`;\n if (isPrintableAscii(byte))\n return `byte-printable`;\n return `byte-other`;\n}\n\nexport function createShadeMap(nullColour: string, maxColour: string, stepStart: string, stepEnd: string): ColourMap {\n const steps = Colour.createSteps(stepStart, stepEnd, { steps: 16 });\n const cssSteps = steps.map(Colour.toCssColour);\n return {\n forByte: (byte) => {\n if (byte === 0x00)\n return nullColour;\n if (byte === 0xFF)\n return maxColour;\n return cssSteps[byte >> 4];\n },\n };\n}\n","import type { BytePos, Diff } from './types.js';\n\ntype StoreImpl = {\n data: Uint8Array;\n changeset: Set<BytePos>;\n};\n\nexport type HexStore = StoreImpl;\n\nexport function createHexStore(data: Uint8Array): HexStore {\n return {\n data: new Uint8Array(data),\n changeset: new Set<BytePos>(),\n };\n}\n\nexport function readByte(store: HexStore, pos: BytePos): number {\n return store.data[pos] ?? 0;\n}\n\nexport function readBytes(store: HexStore, positions: readonly BytePos[]): readonly number[] {\n return positions.map(p => store.data[p] ?? 0);\n}\n\nexport function length(store: HexStore): number {\n return store.data.length;\n}\n\nfunction clamp(value: number): number {\n return Math.max(0, Math.min(255, value));\n}\n\nexport function writeByte(store: HexStore, pos: BytePos, value: number): Diff {\n const clampedValue = clamp(value);\n const before = store.data[pos];\n const diff: Diff = new Map([[pos, { before, after: clampedValue }]]);\n store.data[pos] = clampedValue;\n store.changeset.add(pos);\n return diff;\n}\n\nexport function writeBytes(store: HexStore, entries: ReadonlyMap<BytePos, number>): Diff {\n const diff = new Map<BytePos, { before: number; after: number }>();\n entries.forEach((value, pos) => {\n const clampedValue = clamp(value);\n const before = store.data[pos];\n diff.set(pos, { before, after: clampedValue });\n store.data[pos] = clampedValue;\n store.changeset.add(pos);\n });\n return diff as Diff;\n}\n\nexport function applyDiff(store: HexStore, diff: Diff): Diff {\n const reverse = new Map<BytePos, { before: number; after: number }>();\n diff.forEach((entry, pos) => {\n const before = store.data[pos];\n reverse.set(pos, { before: entry.after, after: before });\n store.data[pos] = entry.after;\n store.changeset.add(pos);\n });\n return reverse as Diff;\n}\n\nexport function reverseDiff(diff: Diff): Diff {\n const reversed = new Map<BytePos, { before: number; after: number }>();\n diff.forEach((entry, pos) => {\n reversed.set(pos, { before: entry.after, after: entry.before });\n });\n return reversed as Diff;\n}\n\nexport function getChangeset(store: HexStore): ReadonlySet<BytePos> {\n return store.changeset;\n}\n\nexport function clearChangeset(store: HexStore): void {\n store.changeset.clear();\n}\n","import type { Diff } from './types.js';\n\ntype StackImpl = {\n undos: Diff[];\n redos: Diff[];\n};\n\nexport type UndoRedoStack = StackImpl;\n\nexport function createUndoRedoStack(): UndoRedoStack {\n return {\n undos: [],\n redos: [],\n };\n}\n\nexport function push(stack: UndoRedoStack, diff: Diff): void {\n stack.undos.push(diff);\n stack.redos = [];\n}\n\nexport function undo(stack: UndoRedoStack): Diff | undefined {\n const diff = stack.undos.pop();\n if (diff) {\n stack.redos.push(diff);\n }\n return diff;\n}\n\nexport function redo(stack: UndoRedoStack): Diff | undefined {\n const diff = stack.redos.pop();\n if (diff) {\n stack.undos.push(diff);\n }\n return diff;\n}\n\nexport function canUndo(stack: UndoRedoStack): boolean {\n return stack.undos.length > 0;\n}\n\nexport function canRedo(stack: UndoRedoStack): boolean {\n return stack.redos.length > 0;\n}\n","import type { BytePos, ContiguousSelection, RectangularSelection, Selection, SingleSelection } from './types.js';\n\nexport const bytesPerRow = (columns: number): number => columns * 4;\n\nconst min = (a: number, b: number): number => (a < b ? a : b);\nconst max = (a: number, b: number): number => (a > b ? a : b);\n\nexport function clampPos(pos: BytePos, dataLength: number): BytePos {\n return Math.max(0, Math.min(pos, dataLength - 1));\n}\n\nexport function getSelectedPositions(sel: Selection, columns: number): readonly BytePos[] {\n if (!sel)\n return [];\n\n const bpr = bytesPerRow(columns);\n\n if (sel.kind === `single`) {\n return [sel.pos];\n }\n\n if (sel.kind === `contiguous`) {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n const positions: BytePos[] = [];\n for (let i = start; i <= end; i++) {\n positions.push(i);\n }\n return positions;\n }\n\n if (sel.kind === `rectangular`) {\n const positions: BytePos[] = [];\n for (let row = 0; row < sel.height; row++) {\n for (let col = 0; col < sel.width; col++) {\n const y = sel.y + row;\n const x = sel.x + col;\n const pos = y * bpr + x;\n positions.push(pos);\n }\n }\n return positions;\n }\n\n return [];\n}\n\nexport function selectionContains(sel: Selection, pos: BytePos, columns: number): boolean {\n if (!sel)\n return false;\n\n const bpr = bytesPerRow(columns);\n\n if (sel.kind === `single`) {\n return pos === sel.pos;\n }\n\n if (sel.kind === `contiguous`) {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n return pos >= start && pos <= end;\n }\n\n if (sel.kind === `rectangular`) {\n const row = Math.floor(pos / bpr);\n const col = pos % bpr;\n const x = sel.x;\n const y = sel.y;\n const width = sel.width;\n const height = sel.height;\n return row >= y && row < y + height && col >= x && col < x + width;\n }\n\n return false;\n}\n\nexport function getCursorPos(sel: Selection, dir: `up` | `down` | `left` | `right`, columns: number, dataLength: number): BytePos {\n let currentPos: BytePos;\n\n if (!sel) {\n currentPos = 0;\n } else if (sel.kind === `single`) {\n currentPos = sel.pos;\n } else if (sel.kind === `contiguous`) {\n currentPos = max(sel.start, sel.end);\n } else if (sel.kind === `rectangular`) {\n currentPos = sel.y * bytesPerRow(columns) + sel.x + sel.width - 1;\n } else {\n currentPos = 0;\n }\n\n const bpr = bytesPerRow(columns);\n let newPos: BytePos;\n\n switch (dir) {\n case `left`:\n newPos = currentPos - 1;\n break;\n case `right`:\n newPos = currentPos + 1;\n break;\n case `up`:\n newPos = currentPos - bpr;\n break;\n case `down`:\n newPos = currentPos + bpr;\n break;\n default:\n newPos = currentPos;\n }\n\n return clampPos(newPos, dataLength);\n}\n\nexport function moveSelection(sel: Selection, dir: `up` | `down` | `left` | `right`, columns: number, dataLength: number): SingleSelection {\n const newPos = getCursorPos(sel, dir, columns, dataLength);\n return { kind: `single`, pos: newPos };\n}\n\nexport function extendContiguous(sel: Selection, _dir: `up` | `down` | `left` | `right`, columns: number, _dataLength: number, anchor: BytePos | null = null): ContiguousSelection {\n let currentPos: BytePos;\n\n if (!sel || sel.kind === `single`) {\n currentPos = sel?.kind === `single` ? sel.pos : 0;\n } else if (sel.kind === `contiguous`) {\n currentPos = max(sel.start, sel.end);\n } else if (sel.kind === `rectangular`) {\n currentPos = sel.y * bytesPerRow(columns) + sel.x;\n } else {\n currentPos = 0;\n }\n\n const newPos = anchor ?? currentPos;\n const start = Math.min(currentPos, newPos);\n const end = Math.max(currentPos, newPos);\n\n return {\n kind: `contiguous`,\n start,\n end,\n };\n}\n\nexport function extendRectangular(sel: Selection, dir: `up` | `down` | `left` | `right`, columns: number, _dataLength: number, anchorX: number = 0, anchorY: number = 0): RectangularSelection {\n const bpr = bytesPerRow(columns);\n\n let x: number;\n let y: number;\n let width: number;\n let height: number;\n\n if (!sel || sel.kind === `single`) {\n const pos = sel?.kind === `single` ? sel.pos : 0;\n x = pos % bpr;\n y = Math.floor(pos / bpr);\n width = 1;\n height = 1;\n } else if (sel.kind === `contiguous`) {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n x = start % bpr;\n y = Math.floor(start / bpr);\n width = end - start + 1;\n height = 1;\n } else if (sel.kind === `rectangular`) {\n x = sel.x;\n y = sel.y;\n width = sel.width;\n height = sel.height;\n } else {\n x = 0;\n y = 0;\n width = 1;\n height = 1;\n }\n\n const effectiveAnchorX = anchorX > 0 || (sel?.kind === `rectangular`) ? anchorX : x;\n const effectiveAnchorY = anchorY > 0 || (sel?.kind === `rectangular`) ? anchorY : y;\n\n switch (dir) {\n case `left`:\n if (x > effectiveAnchorX) {\n width -= 1;\n } else if (x === effectiveAnchorX && width > 1) {\n x -= 1;\n width += 1;\n } else if (x > 0) {\n x -= 1;\n width += 1;\n }\n break;\n case `right`:\n if (x + width < bpr) {\n width += 1;\n }\n break;\n case `up`:\n if (y > effectiveAnchorY) {\n height -= 1;\n } else if (y === effectiveAnchorY && height > 1) {\n y -= 1;\n height += 1;\n } else if (y > 0) {\n y -= 1;\n height += 1;\n }\n break;\n case `down`:\n height += 1;\n break;\n }\n\n return { kind: `rectangular`, x, y, width, height };\n}\n\nexport function selectionFromPointerRange(start: BytePos, end: BytePos, mode: `contiguous` | `rectangular`, columns: number): Selection {\n const bpr = bytesPerRow(columns);\n\n if (mode === `contiguous`) {\n const s = min(start, end);\n const e = max(start, end);\n return {\n kind: `contiguous`,\n start: s,\n end: e,\n };\n }\n\n const startX = start % bpr;\n const startY = Math.floor(start / bpr);\n const endX = end % bpr;\n const endY = Math.floor(end / bpr);\n\n const x = min(startX, endX);\n const y = min(startY, endY);\n const width = Math.abs(endX - startX) + 1;\n const height = Math.abs(endY - startY) + 1;\n\n return { kind: `rectangular`, x, y, width, height };\n}\n","import type { ColourMap } from './colour.js';\nimport type { BytePos, ColourScheme, Diff, EditState, Selection } from './types.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\n\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createShadeMap, getAsciiClass } from './colour.js';\n\nimport { applyDiff, createHexStore, getChangeset, readByte, reverseDiff, length as storeLength, writeByte, writeBytes } from './data.js';\nimport { createUndoRedoStack, push as pushDiff, redo as redoDiff, undo as undoDiff } from './diff.js';\nimport { bytesPerRow, clampPos, extendRectangular, getCursorPos, getSelectedPositions, moveSelection, selectionContains, selectionFromPointerRange } from './selection.js';\n\ntype PointerMode = `pending` | `drag-value` | `select-cont` | `select-rect` | null;\n\ntype DragStart = {\n pos: BytePos;\n startValue: number;\n startY: number;\n startX: number;\n};\n\n@customElement(`ixfx-hex-editor`)\nexport class IxfxHexEditorElement extends LitElement {\n @property({ type: Number })\n columns = 4;\n\n @property({ type: String })\n colourScheme: ColourScheme = `ascii`;\n\n @property({ type: Boolean })\n showChangeset = true;\n\n @property({ type: Boolean, attribute: `hide-offset-col` })\n hideOffsetCol = false;\n\n @property({ type: Boolean, attribute: `hide-hex-col` })\n hideHexCol = false;\n\n @property({ type: Boolean, attribute: `hide-text-col` })\n hideTextCol = false;\n\n @state()\n private _selection: Selection = null;\n\n @state()\n private _scrollTop = 0;\n\n @state()\n private _editState: EditState | null = null;\n\n @state()\n private _containerH = 0;\n\n @state()\n private _shadeMap: ColourMap | null = null;\n\n @state()\n private _focusSide: `hex` | `text` | null = null;\n\n private _store = createHexStore(new Uint8Array(0));\n private _undoStack = createUndoRedoStack();\n private _copyBuffer: Uint8Array | null = null;\n private _rowHeight = 24;\n private _dragStart: DragStart | null = null;\n private _dragAnchor: BytePos | null = null;\n private _rectAnchorX = 0;\n private _rectAnchorY = 0;\n private _rectAnchorXFromKeyboard = 0;\n private _rectAnchorYFromKeyboard = 0;\n private _initialSelectionPoint: BytePos = 0;\n private _currentCursorPoint: BytePos = 0;\n private _pointerMode: PointerMode = null;\n private _currentDragDiff: Diff | null = null;\n private _shiftClickTarget: BytePos | null = null;\n\n static styles = css`\n :host {\n --hex-row-height: 24px;\n --hex-offset-width: 8ch;\n --hex-font: monospace;\n --hex-font-size: 0.85rem;\n --hex-changed-weight: bold;\n\n --ascii-null: #808080;\n --ascii-printable: #4caf50;\n --ascii-whitespace: #ffffff;\n --ascii-control: #f48fb1;\n --ascii-other: #ffeb3b;\n\n --shade-null: #808080;\n --shade-max: #ffffff;\n --shade-step-start: #ff0000;\n --shade-step-end: #0000ff;\n\n display: block;\n font-family: var(--hex-font);\n font-size: var(--hex-font-size);\n }\n\n .hex-editor {\n display: flex;\n flex-direction: column;\n height: 300px;\n overflow: hidden;\n background: #1e1e1e;\n color: #e0e0e0;\n border: 1px solid #333;\n border-radius: 4px;\n }\n\n .scroll-container {\n flex: 1;\n overflow-y: auto;\n position: relative;\n }\n\n .header {\n display: flex;\n background: #2d2d2d;\n font-weight: bold;\n border-bottom: 1px solid #444;\n height: var(--hex-row-height);\n flex-shrink: 0;\n align-items: center;\n }\n\n .row {\n display: flex;\n height: var(--hex-row-height);\n align-items: center;\n }\n\n .row:hover {\n background: rgba(255, 255, 255, 0.05);\n }\n\n .offset-cell {\n width: var(--hex-offset-width);\n padding: 0 8px;\n text-align: right;\n color: #888;\n flex-shrink: 0;\n box-sizing: border-box;\n }\n\n .col-group {\n display: inline-flex;\n gap: 4px;\n margin-right: 16px;\n }\n\n .col-header {\n width: calc(8ch + 28px);\n padding: 0 8px;\n color: #555;\n text-align: right;\n flex-shrink: 0;\n box-sizing: border-box;\n }\n\n .col-header.active {\n color: #aaa;\n }\n\n .text-header {\n padding: 4px 8px;\n color: #555;\n width: calc(var(--columns, 4) * 4 * 1ch);\n box-sizing: border-box;\n flex-shrink: 0;\n }\n\n .text-header.active {\n color: #aaa;\n }\n\n .hex-cell, .text-char {\n display: inline-block;\n width: 2ch;\n text-align: center;\n cursor: pointer;\n user-select: none;\n padding: 2px 0;\n }\n\n .hex-cell.selected, .text-char.selected {\n background: rgba(100, 149, 237, 0.4);\n }\n\n .hex-cell.changed, .text-char.changed {\n font-weight: var(--hex-changed-weight);\n }\n\n .hex-cell.editing {\n background: rgba(255, 215, 0, 0.3);\n }\n\n\n .text-area {\n display: inline-flex;\n gap: 0;\n }\n\n .text-char {\n width: 1ch;\n text-align: left;\n }\n\n .byte-null { color: var(--ascii-null); }\n .byte-printable { color: var(--ascii-printable); }\n .byte-whitespace { color: var(--ascii-whitespace); }\n .byte-control { color: var(--ascii-control); }\n .byte-other { color: var(--ascii-other); }\n `;\n\n setData(data: Uint8Array): void {\n this._store = createHexStore(data);\n this._undoStack = createUndoRedoStack();\n this._selection = null;\n this._editState = null;\n this._scrollTop = 0;\n this.requestUpdate();\n }\n\n undo(): void {\n const diff = undoDiff(this._undoStack);\n if (!diff)\n return;\n const reverse = reverseDiff(diff);\n applyDiff(this._store, reverse);\n this.requestUpdate();\n }\n\n redo(): void {\n const diff = redoDiff(this._undoStack);\n if (!diff)\n return;\n applyDiff(this._store, diff);\n this.requestUpdate();\n }\n\n recomputeColours(): void {\n const style = getComputedStyle(this);\n const nullC = style.getPropertyValue(`--shade-null`).trim() || `#808080`;\n const maxC = style.getPropertyValue(`--shade-max`).trim() || `#ffffff`;\n const stepStart = style.getPropertyValue(`--shade-step-start`).trim() || `#ff0000`;\n const stepEnd = style.getPropertyValue(`--shade-step-end`).trim() || `#0000ff`;\n this._shadeMap = createShadeMap(nullC, maxC, stepStart, stepEnd);\n this.requestUpdate();\n }\n\n * selectedBytes(): Generator<{ selection_index: number; array_index: number; value: number }> {\n const positions = getSelectedPositions(this._selection, this.columns);\n for (let i = 0; i < positions.length; i++) {\n const pos = positions[i];\n yield {\n selection_index: i,\n array_index: pos,\n value: readByte(this._store, pos),\n };\n }\n }\n\n containsPosition(pos: number): boolean {\n return selectionContains(this._selection, pos as BytePos, this.columns);\n }\n\n selectSingle(position: number): void {\n this._selection = { kind: `single`, pos: position as BytePos };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n selectContiguous(start: number, end: number): void {\n this._selection = {\n kind: `contiguous`,\n start: start as BytePos,\n end: end as BytePos,\n };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n selectRectangular(x: number, y: number, width: number, height: number): void {\n this._selection = {\n kind: `rectangular`,\n x,\n y,\n width,\n height,\n };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n clearSelection(): void {\n this._selection = null;\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n getSelection(): Selection {\n return this._selection;\n }\n\n protected override firstUpdated(): void {\n const container = this.shadowRoot?.querySelector(`.scroll-container`);\n if (container) {\n const ro = new ResizeObserver((entries) => {\n this._containerH = entries[0].contentRect.height;\n this.requestUpdate();\n });\n ro.observe(container);\n this._containerH = container.clientHeight;\n }\n this.recomputeColours();\n }\n\n private _onScroll = (e: Event): void => {\n const target = e.target as HTMLElement;\n this._scrollTop = target.scrollTop;\n this.requestUpdate();\n };\n\n private _onPointerDown(pos: BytePos, side: `hex` | `text`, e: PointerEvent): void {\n e.preventDefault();\n if (e.button !== 0)\n return;\n\n (this.shadowRoot?.querySelector(`.hex-editor`) as HTMLElement)?.focus();\n this._focusSide = side;\n\n const target = e.target as Element;\n target.setPointerCapture(e.pointerId);\n\n const bpr = bytesPerRow(this.columns);\n const startX = pos % bpr;\n const startY = Math.floor(pos / bpr);\n\n if (e.metaKey || e.ctrlKey) {\n this._pointerMode = `select-rect`;\n this._dragAnchor = pos;\n this._rectAnchorX = startX;\n this._rectAnchorY = startY;\n } else if (e.shiftKey) {\n this._pointerMode = `select-cont`;\n if (!this._selection || this._selection.kind !== `single`) {\n this._dragAnchor = pos;\n } else {\n this._dragAnchor = this._selection.pos;\n this._shiftClickTarget = pos;\n }\n } else {\n this._pointerMode = `pending`;\n this._dragStart = { pos, startValue: readByte(this._store, pos), startY: e.clientY, startX: e.clientX };\n this._dragAnchor = pos;\n this._currentDragDiff = null;\n }\n }\n\n private _onPointerMove(pos: BytePos, _side: `hex` | `text`, e: PointerEvent): void {\n if (!this._dragStart)\n return;\n\n const dy = Math.abs(e.clientY - this._dragStart.startY);\n const dx = Math.abs(e.clientX - this._dragStart.startX);\n\n if (this._pointerMode === `pending` && dy > 4 && dy > dx) {\n this._pointerMode = `drag-value`;\n this._editState = null;\n }\n\n if (this._pointerMode === `drag-value`) {\n const delta = Math.round((e.clientY - this._dragStart.startY) / 4);\n const newValue = Math.max(0, Math.min(255, this._dragStart.startValue - delta));\n this._currentDragDiff = writeByte(this._store, pos, newValue);\n this.requestUpdate();\n }\n\n if (this._pointerMode === `select-cont`) {\n if (this._dragAnchor !== null) {\n const mode = `contiguous`;\n this._selection = selectionFromPointerRange(this._dragAnchor, pos, mode, this.columns);\n this._dispatchSelectEvent();\n }\n }\n\n if (this._pointerMode === `select-rect`) {\n const bpr = bytesPerRow(this.columns);\n const currentX = pos % bpr;\n const currentY = Math.floor(pos / bpr);\n const x = Math.min(this._rectAnchorX, currentX);\n const y = Math.min(this._rectAnchorY, currentY);\n const width = Math.abs(currentX - this._rectAnchorX) + 1;\n const height = Math.abs(currentY - this._rectAnchorY) + 1;\n this._selection = { kind: `rectangular`, x, y, width, height };\n this._dispatchSelectEvent();\n }\n }\n\n private _onPointerUp(pos: BytePos, side: `hex` | `text`, e: PointerEvent): void {\n const target = e.target as Element;\n target.releasePointerCapture(e.pointerId);\n\n if (this._pointerMode === `pending`) {\n this._selection = { kind: `single`, pos };\n this._initialSelectionPoint = pos;\n this._currentCursorPoint = pos;\n this._editState = { pos, side, partial: `` };\n this._dispatchSelectEvent();\n }\n\n if (this._pointerMode === `select-cont`) {\n if (this._dragAnchor !== null && this._shiftClickTarget !== null) {\n this._selection = {\n kind: `contiguous`,\n start: this._dragAnchor,\n end: this._shiftClickTarget,\n };\n this._initialSelectionPoint = Math.min(this._dragAnchor, this._shiftClickTarget);\n this._currentCursorPoint = Math.max(this._dragAnchor, this._shiftClickTarget);\n this._dispatchSelectEvent();\n } else if (this._dragAnchor !== null) {\n const mode = `contiguous`;\n this._selection = selectionFromPointerRange(this._dragAnchor, pos, mode, this.columns);\n this._initialSelectionPoint = this._dragAnchor;\n this._currentCursorPoint = pos;\n this._dispatchSelectEvent();\n }\n }\n\n if (this._pointerMode === `select-rect`) {\n const bpr = bytesPerRow(this.columns);\n const currentX = pos % bpr;\n const currentY = Math.floor(pos / bpr);\n const x = Math.min(this._rectAnchorX, currentX);\n const y = Math.min(this._rectAnchorY, currentY);\n const width = Math.abs(currentX - this._rectAnchorX) + 1;\n const height = Math.abs(currentY - this._rectAnchorY) + 1;\n this._selection = { kind: `rectangular`, x, y, width, height };\n this._dispatchSelectEvent();\n }\n\n if (this._pointerMode === `drag-value` && this._currentDragDiff) {\n pushDiff(this._undoStack, this._currentDragDiff);\n this._dispatchChangeEvent(this._currentDragDiff);\n }\n\n this._pointerMode = null;\n this._dragStart = null;\n this._dragAnchor = null;\n this._currentDragDiff = null;\n this._shiftClickTarget = null;\n }\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n const isNavigationKey = [`ArrowLeft`, `ArrowRight`, `ArrowUp`, `ArrowDown`].includes(e.key);\n\n if (isNavigationKey) {\n e.preventDefault();\n e.stopPropagation();\n\n if (this._editState) {\n this._editState = null;\n }\n\n const dir = e.key.replace(`Arrow`, ``).toLowerCase() as `left` | `right` | `up` | `down`;\n const dataLen = storeLength(this._store);\n const bpr = bytesPerRow(this.columns);\n\n if (e.metaKey || e.ctrlKey) {\n if (!this._selection || this._selection.kind !== `rectangular`) {\n let startPos = 0;\n if (this._selection?.kind === `single`) {\n startPos = this._selection.pos;\n } else if (this._selection?.kind === `contiguous`) {\n startPos = Math.min(this._selection.start, this._selection.end);\n }\n this._rectAnchorXFromKeyboard = startPos % bpr;\n this._rectAnchorYFromKeyboard = Math.floor(startPos / bpr);\n this._selection = { kind: `rectangular`, x: this._rectAnchorXFromKeyboard, y: this._rectAnchorYFromKeyboard, width: 1, height: 1 };\n }\n this._selection = extendRectangular(this._selection, dir, this.columns, dataLen, this._rectAnchorXFromKeyboard, this._rectAnchorYFromKeyboard);\n } else if (e.shiftKey) {\n if (!this._selection) {\n this._initialSelectionPoint = 0;\n this._currentCursorPoint = 0;\n } else if (this._selection.kind === `single`) {\n this._initialSelectionPoint = this._selection.pos;\n this._currentCursorPoint = this._selection.pos;\n } else if (this._selection.kind === `rectangular`) {\n const cursorPos = this._selection.y * bpr + this._selection.x;\n this._initialSelectionPoint = cursorPos;\n this._currentCursorPoint = cursorPos;\n }\n const newPos = getCursorPos(this._selection, dir, this.columns, dataLen);\n const start = Math.min(this._initialSelectionPoint, newPos);\n const end = Math.max(this._initialSelectionPoint, newPos);\n this._currentCursorPoint = newPos;\n this._selection = { kind: `contiguous`, start, end };\n } else {\n this._selection = moveSelection(this._selection, dir, this.columns, dataLen);\n const pos = getCursorPos(this._selection, dir, this.columns, dataLen);\n this._initialSelectionPoint = pos;\n this._currentCursorPoint = pos;\n }\n this._dispatchSelectEvent();\n this.requestUpdate();\n return;\n }\n\n if (e.key === `Tab`) {\n e.preventDefault();\n e.stopPropagation();\n if (this._editState) {\n this._advanceCursor();\n } else {\n const dataLen = storeLength(this._store);\n this._selection = moveSelection(this._selection, `right`, this.columns, dataLen);\n this._dispatchSelectEvent();\n }\n this.requestUpdate();\n return;\n }\n\n if (e.key === `Escape`) {\n e.preventDefault();\n e.stopPropagation();\n if (this._editState) {\n this._editState = null;\n } else if (this._selection && this._selection.kind !== `single`) {\n const sel = this._selection;\n let firstPos = 0;\n if ((sel as { kind: string }).kind === `contiguous`) {\n const c = sel as { start: number; end: number };\n firstPos = Math.min(c.start, c.end);\n }\n if ((sel as { kind: string }).kind === `rectangular`) {\n const r = sel as { y: number; x: number };\n firstPos = r.y * bytesPerRow(this.columns) + r.x;\n }\n this._selection = { kind: `single`, pos: firstPos };\n this._dispatchSelectEvent();\n }\n this.requestUpdate();\n return;\n }\n\n if (this._editState) {\n e.stopPropagation();\n\n if (e.key === `Backspace`) {\n this._handleBackspace();\n return;\n }\n\n if (e.key === `Enter`) {\n if (this._editState.side === `hex` && this._editState.partial.startsWith(`.`)) {\n this._commitDecimalValue();\n }\n return;\n }\n\n if (e.key.length === 1) {\n this._handleValueEntry(e.key);\n }\n return;\n }\n\n if (this._selection && this._selection.kind === `single` && e.key.length === 1) {\n e.preventDefault();\n e.stopPropagation();\n const pos = this._selection.pos;\n const side: `hex` | `text` = this._focusSide ?? `hex`;\n this._editState = { pos, side, partial: `` };\n this._handleValueEntry(e.key);\n }\n };\n\n private _handleBackspace(): void {\n if (!this._editState)\n return;\n this._editState = { ...this._editState, partial: `` };\n this.requestUpdate();\n }\n\n private _handleValueEntry(key: string): void {\n if (!this._editState)\n return;\n\n const { pos, side, partial } = this._editState;\n\n if (side === `text`) {\n if (key.length === 1 && key.charCodeAt(0) >= 0x20 && key.charCodeAt(0) <= 0x7E) {\n const value = key.charCodeAt(0);\n const diff = writeByte(this._store, pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n return;\n }\n\n if (partial === `` && key === `.`) {\n this._editState = { ...this._editState, partial: `.` };\n this.requestUpdate();\n return;\n }\n\n if (partial.startsWith(`.`)) {\n if (/\\d/.test(key)) {\n let newPartial = partial + key;\n if (Number(newPartial.slice(1)) > 255) {\n newPartial = `.255`;\n }\n this._editState = { ...this._editState, partial: newPartial };\n this.requestUpdate();\n }\n return;\n }\n\n const hexChars = `0123456789ABCDEFabcdef`;\n if (hexChars.includes(key)) {\n const newPartial = (partial + key.toUpperCase()).slice(-2);\n this._editState = { ...this._editState, partial: newPartial };\n this.requestUpdate();\n\n if (newPartial.length === 2) {\n const value = Number.parseInt(newPartial, 16);\n const diff = writeByte(this._store, pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n } else if (partial !== ``) {\n this._editState = { ...this._editState, partial: `` };\n this.requestUpdate();\n }\n }\n\n private _commitDecimalValue(): void {\n if (!this._editState)\n return;\n const value = Number.parseInt(this._editState.partial.slice(1), 10);\n if (!Number.isNaN(value)) {\n const diff = writeByte(this._store, this._editState.pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n }\n\n private _advanceCursor(): void {\n if (!this._editState)\n return;\n const dataLen = storeLength(this._store);\n const newPos = clampPos(this._editState.pos + 1, dataLen);\n this._editState = { pos: newPos, side: this._editState.side, partial: `` };\n this._selection = { kind: `single`, pos: newPos };\n this.requestUpdate();\n }\n\n private _dispatchChangeEvent(diff: Diff): void {\n this.dispatchEvent(new CustomEvent(`hex-change`, {\n detail: { diff },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _dispatchSelectEvent(): void {\n const sel = this._selection;\n let detail: SelectEventDetail;\n\n if (!sel) {\n detail = { type: `none` };\n } else if (sel.kind === `single`) {\n detail = { type: `single`, position: sel.pos };\n } else if (sel.kind === `contiguous`) {\n detail = { type: `contiguous`, start: sel.start, end: sel.end };\n } else if (sel.kind === `rectangular`) {\n detail = { type: `rectangular`, x: sel.x, y: sel.y, width: sel.width, height: sel.height };\n } else {\n detail = { type: `none` };\n }\n\n this.dispatchEvent(new CustomEvent(`select`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _copy(): void {\n const positions = getSelectedPositions(this._selection, this.columns);\n if (positions.length === 0)\n return;\n\n const bytes = positions.map((p: BytePos) => readByte(this._store, p));\n this._copyBuffer = new Uint8Array(bytes);\n\n const hexStr = bytes.map((b: number) => b.toString(16).padStart(2, `0`)).join(` `);\n navigator.clipboard?.writeText(hexStr).catch(() => {});\n }\n\n private async _paste(): Promise<void> {\n let bytes: number[] | null = null;\n\n try {\n const text = await navigator.clipboard?.readText();\n if (text) {\n bytes = this._parseHexString(text);\n }\n } catch {\n // ignore\n }\n\n if (!bytes && this._copyBuffer) {\n bytes = Array.from(this._copyBuffer);\n }\n\n if (!bytes || bytes.length === 0)\n return;\n\n if (!this._selection)\n return;\n\n const entries = new Map<BytePos, number>();\n\n if (this._selection.kind === `single`) {\n const startPos = this._selection.pos;\n const dataLen = storeLength(this._store);\n for (let i = 0; i < bytes.length && startPos + i < dataLen; i++) {\n entries.set(startPos + i, bytes[i]);\n }\n } else if (this._selection.kind === `contiguous`) {\n const startPos = Math.min(this._selection.start, this._selection.end);\n const endPos = Math.max(this._selection.start, this._selection.end);\n const available = endPos - startPos + 1;\n for (let i = 0; i < Math.min(bytes.length, available); i++) {\n entries.set(startPos + i, bytes[i]);\n }\n } else if (this._selection.kind === `rectangular`) {\n const { x, y, width, height } = this._selection;\n const bpr = bytesPerRow(this.columns);\n let byteIdx = 0;\n for (let row = 0; row < height && byteIdx < bytes.length; row++) {\n for (let col = 0; col < width && byteIdx < bytes.length; col++) {\n const pos = (y + row) * bpr + x + col;\n entries.set(pos, bytes[byteIdx++]);\n }\n }\n }\n\n if (entries.size > 0) {\n const diff = writeBytes(this._store, entries);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this.requestUpdate();\n }\n }\n\n private _parseHexString(text: string): number[] {\n const bytes: number[] = [];\n const cleaned = text.replace(/[^0-9A-F]/gi, ` `).trim();\n if (!cleaned)\n return bytes;\n\n const parts = cleaned.split(/\\s+/);\n for (const part of parts) {\n if (part.length === 1) {\n bytes.push(Number.parseInt(part + part, 16));\n } else if (part.length === 2) {\n bytes.push(Number.parseInt(part, 16));\n }\n }\n return bytes;\n }\n\n private _getColHeaders(): string[] {\n const headers: string[] = [];\n for (let i = 0; i < this.columns; i++) {\n const offset = i * 4;\n headers.push(`+${offset.toString(16).toUpperCase()}`);\n }\n return headers;\n }\n\n private _isRowShaded(pos: BytePos): boolean {\n const sel = this._selection;\n if (!sel || sel.kind !== `single`)\n return true;\n const bpr = bytesPerRow(this.columns);\n const row = Math.floor(pos / bpr);\n const selRow = Math.floor(sel.pos / bpr);\n return row === selRow;\n }\n\n private _isHexShaded(pos: BytePos): boolean {\n return this._isRowShaded(pos);\n }\n\n private _isTextShaded(pos: BytePos): boolean {\n return this._isRowShaded(pos);\n }\n\n protected render() {\n const dataLen = storeLength(this._store);\n const bpr = bytesPerRow(this.columns);\n const totalRows = Math.ceil(dataLen / bpr);\n const containerH = this._containerH > 0 ? this._containerH : 280;\n const startRow = Math.floor(this._scrollTop / this._rowHeight);\n const endRow = Math.min(startRow + Math.ceil(containerH / this._rowHeight) + 2, totalRows);\n const topSpacerHeight = startRow * this._rowHeight;\n const botSpacerHeight = (totalRows - endRow) * this._rowHeight;\n const changeset = getChangeset(this._store);\n\n const colHeaders = this._getColHeaders();\n const hexActive = this._focusSide === `hex` || this._focusSide === null;\n const textActive = this._focusSide === `text`;\n\n return html`\n <div class=\"hex-editor\" tabindex=\"0\" @keydown=${this._onKeyDown} @pointerleave=${() => {}}>\n <div class=\"header\">\n ${this.hideOffsetCol ? null : html`<span class=\"offset-cell\">Offset</span>`}\n ${this.hideHexCol ? null : repeat(colHeaders, h => html`<span class=\"col-header ${hexActive ? `active` : ``}\">${h}</span>`)}\n ${this.hideTextCol ? null : html`<span class=\"text-header ${textActive ? `active` : ``}\">Text</span>`}\n </div>\n <div class=\"scroll-container\" @scroll=${this._onScroll}>\n <div style=\"height: ${topSpacerHeight}px\"></div>\n ${repeat(\n Array.from({ length: endRow - startRow }, (_, i) => startRow + i),\n rowIndex => rowIndex,\n rowIndex => this._renderRow(rowIndex, changeset),\n )}\n <div style=\"height: ${botSpacerHeight}px\"></div>\n </div>\n </div>\n `;\n }\n\n private _renderRow(rowIndex: number, changeset: ReadonlySet<BytePos>) {\n const bpr = bytesPerRow(this.columns);\n const offset = rowIndex * bpr;\n\n return html`\n <div class=\"row\" data-row=${rowIndex}>\n ${this.hideOffsetCol ? null : html`<span class=\"offset-cell\">${offset.toString(16).toUpperCase().padStart(6, `0`)}</span>`}\n ${this.hideHexCol\n ? null\n : repeat(\n Array.from({ length: this.columns }, (_, i) => i),\n colIndex => colIndex,\n colIndex => this._renderColumn(rowIndex, colIndex, changeset),\n )}\n ${this.hideTextCol\n ? null\n : html`\n <span class=\"text-area\">\n ${repeat(\n Array.from({ length: bpr }, (_, i) => i),\n i => i,\n i => this._renderTextChar(offset + i, changeset),\n )}\n </span>\n `}\n </div>\n `;\n }\n\n private _renderColumn(rowIndex: number, colIndex: number, changeset: ReadonlySet<BytePos>) {\n const bpr = bytesPerRow(this.columns);\n const basePos = rowIndex * bpr + colIndex * 4;\n\n return html`\n <span class=\"col-group\">\n ${[0, 1, 2, 3].map(b => this._renderHexCell(basePos + b, changeset))}\n </span>\n `;\n }\n\n private _renderHexCell(pos: BytePos, changeset: ReadonlySet<BytePos>) {\n const dataLen = storeLength(this._store);\n if (pos >= dataLen) {\n return html`<span class=\"hex-cell\"></span>`;\n }\n\n const byte = readByte(this._store, pos);\n const hexStr = byte.toString(16).toUpperCase().padStart(2, `0`);\n\n const isSelected = selectionContains(this._selection, pos, this.columns);\n const isChanged = this.showChangeset && changeset.has(pos);\n const isEditing = this._editState?.pos === pos;\n\n const classes: string[] = [`hex-cell`];\n if (isSelected)\n classes.push(`selected`);\n if (isChanged)\n classes.push(`changed`);\n if (isEditing)\n classes.push(`editing`);\n if (this._isHexShaded(pos))\n classes.push(`shaded`);\n\n let displayText = hexStr;\n let colourStyle: Record<string, string> | undefined;\n\n if (isEditing && this._editState) {\n displayText = this._editState.partial === `` ? hexStr : `${this._editState.partial}_`;\n }\n\n if (this.colourScheme === `shade` && this._shadeMap) {\n colourStyle = { color: this._shadeMap.forByte(byte) };\n } else if (this.colourScheme === `ascii`) {\n classes.push(getAsciiClass(byte));\n }\n\n return html`\n <span\n class=${classes.join(` `)}\n style=${styleMap(colourStyle || {})}\n @pointerdown=${(e: PointerEvent) => this._onPointerDown(pos, `hex`, e)}\n @pointerup=${(e: PointerEvent) => this._onPointerUp(pos, `hex`, e)}\n @pointermove=${(e: PointerEvent) => this._onPointerMove(pos, `hex`, e)}\n >${displayText}</span>\n `;\n }\n\n private _renderTextChar(pos: BytePos, changeset: ReadonlySet<BytePos>) {\n const dataLen = storeLength(this._store);\n if (pos >= dataLen) {\n return html`<span class=\"text-char\"></span>`;\n }\n\n const byte = readByte(this._store, pos);\n const char = byte >= 0x20 && byte <= 0x7E ? String.fromCharCode(byte) : `.`;\n\n const isSelected = selectionContains(this._selection, pos, this.columns);\n const isChanged = this.showChangeset && changeset.has(pos);\n\n const classes: string[] = [`text-char`];\n if (isSelected)\n classes.push(`selected`);\n if (isChanged)\n classes.push(`changed`);\n if (this._isTextShaded(pos))\n classes.push(`shaded`);\n\n let colourStyle: Record<string, string> | undefined;\n\n if (this.colourScheme === `shade` && this._shadeMap) {\n colourStyle = { color: this._shadeMap.forByte(byte) };\n } else if (this.colourScheme === `ascii`) {\n classes.push(getAsciiClass(byte));\n }\n\n return html`\n <span\n class=${classes.join(` `)}\n style=${styleMap(colourStyle || {})}\n @pointerdown=${(e: PointerEvent) => this._onPointerDown(pos, `text`, e)}\n @pointerup=${(e: PointerEvent) => this._onPointerUp(pos, `text`, e)}\n @pointermove=${(e: PointerEvent) => this._onPointerMove(pos, `text`, e)}\n >${char}</span>\n `;\n }\n}\n\nexport type HexChangeDetail = {\n readonly diff: Diff;\n};\n\nexport type HexChangeEvent = CustomEvent<HexChangeDetail>;\n\nexport type SingleSelectEventDetail = { readonly type: `single`; readonly position: number };\nexport type ContiguousSelectEventDetail = { readonly type: `contiguous`; readonly start: number; readonly end: number };\nexport type RectangularSelectEventDetail = { readonly type: `rectangular`; readonly x: number; readonly y: number; readonly width: number; readonly height: number };\nexport type NoneSelectEventDetail = { readonly type: `none` };\nexport type SelectEventDetail = SingleSelectEventDetail | ContiguousSelectEventDetail | RectangularSelectEventDetail | NoneSelectEventDetail;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-hex-editor': IxfxHexEditorElement;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hex-editor-Bk6rxhfg.js","names":["storeLength","undoDiff","redoDiff","customElement"],"sources":["../src/hex/colour.ts","../src/hex/data.ts","../src/hex/diff.ts","../src/hex/selection.ts","../src/hex/hex-editor.ts"],"sourcesContent":["import { Colour } from '@ixfx/visual';\n\nexport type ColourMap = {\n forByte: (byte: number) => string;\n};\n\nconst WHITESPACE_BYTES = new Set([0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x20]);\n\nfunction isControlByte(byte: number): boolean {\n return byte < 0x20 && byte !== 0x09 && byte !== 0x0A && byte !== 0x0B && byte !== 0x0C && byte !== 0x0D;\n}\n\nfunction isPrintableAscii(byte: number): boolean {\n return byte >= 0x20 && byte <= 0x7E;\n}\n\nexport function getAsciiClass(byte: number): string {\n if (byte === 0)\n return `byte-null`;\n if (WHITESPACE_BYTES.has(byte))\n return `byte-whitespace`;\n if (isControlByte(byte))\n return `byte-control`;\n if (isPrintableAscii(byte))\n return `byte-printable`;\n return `byte-other`;\n}\n\nexport function createShadeMap(nullColour: string, maxColour: string, stepStart: string, stepEnd: string): ColourMap {\n const steps = Colour.createSteps(stepStart, stepEnd, { steps: 16 });\n const cssSteps = steps.map(Colour.toCssColour);\n return {\n forByte: (byte) => {\n if (byte === 0x00)\n return nullColour;\n if (byte === 0xFF)\n return maxColour;\n return cssSteps[byte >> 4];\n },\n };\n}\n","import type { BytePos, Diff } from './types.js';\n\ntype StoreImpl = {\n data: Uint8Array;\n changeset: Set<BytePos>;\n};\n\nexport type HexStore = StoreImpl;\n\nexport function createHexStore(data: Uint8Array): HexStore {\n return {\n data: new Uint8Array(data),\n changeset: new Set<BytePos>(),\n };\n}\n\nexport function readByte(store: HexStore, pos: BytePos): number {\n return store.data[pos] ?? 0;\n}\n\nexport function readBytes(store: HexStore, positions: readonly BytePos[]): readonly number[] {\n return positions.map(p => store.data[p] ?? 0);\n}\n\nexport function length(store: HexStore): number {\n return store.data.length;\n}\n\nfunction clamp(value: number): number {\n return Math.max(0, Math.min(255, value));\n}\n\nexport function writeByte(store: HexStore, pos: BytePos, value: number): Diff {\n const clampedValue = clamp(value);\n const before = store.data[pos];\n const diff: Diff = new Map([[pos, { before, after: clampedValue }]]);\n store.data[pos] = clampedValue;\n store.changeset.add(pos);\n return diff;\n}\n\nexport function writeBytes(store: HexStore, entries: ReadonlyMap<BytePos, number>): Diff {\n const diff = new Map<BytePos, { before: number; after: number }>();\n entries.forEach((value, pos) => {\n const clampedValue = clamp(value);\n const before = store.data[pos];\n diff.set(pos, { before, after: clampedValue });\n store.data[pos] = clampedValue;\n store.changeset.add(pos);\n });\n return diff as Diff;\n}\n\nexport function applyDiff(store: HexStore, diff: Diff): Diff {\n const reverse = new Map<BytePos, { before: number; after: number }>();\n diff.forEach((entry, pos) => {\n const before = store.data[pos];\n reverse.set(pos, { before: entry.after, after: before });\n store.data[pos] = entry.after;\n store.changeset.add(pos);\n });\n return reverse as Diff;\n}\n\nexport function reverseDiff(diff: Diff): Diff {\n const reversed = new Map<BytePos, { before: number; after: number }>();\n diff.forEach((entry, pos) => {\n reversed.set(pos, { before: entry.after, after: entry.before });\n });\n return reversed as Diff;\n}\n\nexport function getChangeset(store: HexStore): ReadonlySet<BytePos> {\n return store.changeset;\n}\n\nexport function clearChangeset(store: HexStore): void {\n store.changeset.clear();\n}\n","import type { Diff } from './types.js';\n\ntype StackImpl = {\n undos: Diff[];\n redos: Diff[];\n};\n\nexport type UndoRedoStack = StackImpl;\n\nexport function createUndoRedoStack(): UndoRedoStack {\n return {\n undos: [],\n redos: [],\n };\n}\n\nexport function push(stack: UndoRedoStack, diff: Diff): void {\n stack.undos.push(diff);\n stack.redos = [];\n}\n\nexport function undo(stack: UndoRedoStack): Diff | undefined {\n const diff = stack.undos.pop();\n if (diff) {\n stack.redos.push(diff);\n }\n return diff;\n}\n\nexport function redo(stack: UndoRedoStack): Diff | undefined {\n const diff = stack.redos.pop();\n if (diff) {\n stack.undos.push(diff);\n }\n return diff;\n}\n\nexport function canUndo(stack: UndoRedoStack): boolean {\n return stack.undos.length > 0;\n}\n\nexport function canRedo(stack: UndoRedoStack): boolean {\n return stack.redos.length > 0;\n}\n","import type { BytePos, ContiguousSelection, RectangularSelection, Selection, SingleSelection } from './types.js';\n\nexport const bytesPerRow = (columns: number): number => columns * 4;\n\nconst min = (a: number, b: number): number => (a < b ? a : b);\nconst max = (a: number, b: number): number => (a > b ? a : b);\n\nexport function clampPos(pos: BytePos, dataLength: number): BytePos {\n return Math.max(0, Math.min(pos, dataLength - 1));\n}\n\nexport function getSelectedPositions(sel: Selection, columns: number): readonly BytePos[] {\n if (!sel)\n return [];\n\n const bpr = bytesPerRow(columns);\n\n if (sel.kind === `single`) {\n return [sel.pos];\n }\n\n if (sel.kind === `contiguous`) {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n const positions: BytePos[] = [];\n for (let i = start; i <= end; i++) {\n positions.push(i);\n }\n return positions;\n }\n\n if (sel.kind === `rectangular`) {\n const positions: BytePos[] = [];\n for (let row = 0; row < sel.height; row++) {\n for (let col = 0; col < sel.width; col++) {\n const y = sel.y + row;\n const x = sel.x + col;\n const pos = y * bpr + x;\n positions.push(pos);\n }\n }\n return positions;\n }\n\n return [];\n}\n\nexport function selectionContains(sel: Selection, pos: BytePos, columns: number): boolean {\n if (!sel)\n return false;\n\n const bpr = bytesPerRow(columns);\n\n if (sel.kind === `single`) {\n return pos === sel.pos;\n }\n\n if (sel.kind === `contiguous`) {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n return pos >= start && pos <= end;\n }\n\n if (sel.kind === `rectangular`) {\n const row = Math.floor(pos / bpr);\n const col = pos % bpr;\n const x = sel.x;\n const y = sel.y;\n const width = sel.width;\n const height = sel.height;\n return row >= y && row < y + height && col >= x && col < x + width;\n }\n\n return false;\n}\n\nexport function getCursorPos(sel: Selection, dir: `up` | `down` | `left` | `right`, columns: number, dataLength: number): BytePos {\n let currentPos: BytePos;\n\n if (!sel) {\n currentPos = 0;\n } else if (sel.kind === `single`) {\n currentPos = sel.pos;\n } else if (sel.kind === `contiguous`) {\n currentPos = max(sel.start, sel.end);\n } else if (sel.kind === `rectangular`) {\n currentPos = sel.y * bytesPerRow(columns) + sel.x + sel.width - 1;\n } else {\n currentPos = 0;\n }\n\n const bpr = bytesPerRow(columns);\n let newPos: BytePos;\n\n switch (dir) {\n case `left`:\n newPos = currentPos - 1;\n break;\n case `right`:\n newPos = currentPos + 1;\n break;\n case `up`:\n newPos = currentPos - bpr;\n break;\n case `down`:\n newPos = currentPos + bpr;\n break;\n default:\n newPos = currentPos;\n }\n\n return clampPos(newPos, dataLength);\n}\n\nexport function moveSelection(sel: Selection, dir: `up` | `down` | `left` | `right`, columns: number, dataLength: number): SingleSelection {\n const newPos = getCursorPos(sel, dir, columns, dataLength);\n return { kind: `single`, pos: newPos };\n}\n\nexport function extendContiguous(sel: Selection, _dir: `up` | `down` | `left` | `right`, columns: number, _dataLength: number, anchor: BytePos | null = null): ContiguousSelection {\n let currentPos: BytePos;\n\n if (!sel || sel.kind === `single`) {\n currentPos = sel?.kind === `single` ? sel.pos : 0;\n } else if (sel.kind === `contiguous`) {\n currentPos = max(sel.start, sel.end);\n } else if (sel.kind === `rectangular`) {\n currentPos = sel.y * bytesPerRow(columns) + sel.x;\n } else {\n currentPos = 0;\n }\n\n const newPos = anchor ?? currentPos;\n const start = Math.min(currentPos, newPos);\n const end = Math.max(currentPos, newPos);\n\n return {\n kind: `contiguous`,\n start,\n end,\n };\n}\n\nexport function extendRectangular(sel: Selection, dir: `up` | `down` | `left` | `right`, columns: number, _dataLength: number, anchorX: number = 0, anchorY: number = 0): RectangularSelection {\n const bpr = bytesPerRow(columns);\n\n let x: number;\n let y: number;\n let width: number;\n let height: number;\n\n if (!sel || sel.kind === `single`) {\n const pos = sel?.kind === `single` ? sel.pos : 0;\n x = pos % bpr;\n y = Math.floor(pos / bpr);\n width = 1;\n height = 1;\n } else if (sel.kind === `contiguous`) {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n x = start % bpr;\n y = Math.floor(start / bpr);\n width = end - start + 1;\n height = 1;\n } else if (sel.kind === `rectangular`) {\n x = sel.x;\n y = sel.y;\n width = sel.width;\n height = sel.height;\n } else {\n x = 0;\n y = 0;\n width = 1;\n height = 1;\n }\n\n const effectiveAnchorX = anchorX > 0 || (sel?.kind === `rectangular`) ? anchorX : x;\n const effectiveAnchorY = anchorY > 0 || (sel?.kind === `rectangular`) ? anchorY : y;\n\n switch (dir) {\n case `left`:\n if (x > effectiveAnchorX) {\n width -= 1;\n } else if (x === effectiveAnchorX && width > 1) {\n x -= 1;\n width += 1;\n } else if (x > 0) {\n x -= 1;\n width += 1;\n }\n break;\n case `right`:\n if (x + width < bpr) {\n width += 1;\n }\n break;\n case `up`:\n if (y > effectiveAnchorY) {\n height -= 1;\n } else if (y === effectiveAnchorY && height > 1) {\n y -= 1;\n height += 1;\n } else if (y > 0) {\n y -= 1;\n height += 1;\n }\n break;\n case `down`:\n height += 1;\n break;\n }\n\n return { kind: `rectangular`, x, y, width, height };\n}\n\nexport function selectionFromPointerRange(start: BytePos, end: BytePos, mode: `contiguous` | `rectangular`, columns: number): Selection {\n const bpr = bytesPerRow(columns);\n\n if (mode === `contiguous`) {\n const s = min(start, end);\n const e = max(start, end);\n return {\n kind: `contiguous`,\n start: s,\n end: e,\n };\n }\n\n const startX = start % bpr;\n const startY = Math.floor(start / bpr);\n const endX = end % bpr;\n const endY = Math.floor(end / bpr);\n\n const x = min(startX, endX);\n const y = min(startY, endY);\n const width = Math.abs(endX - startX) + 1;\n const height = Math.abs(endY - startY) + 1;\n\n return { kind: `rectangular`, x, y, width, height };\n}\n","import type { ColourMap } from './colour.js';\nimport type { BytePos, ColourScheme, Diff, EditState, Selection } from './types.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\n\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createShadeMap, getAsciiClass } from './colour.js';\n\nimport { applyDiff, createHexStore, getChangeset, readByte, reverseDiff, length as storeLength, writeByte, writeBytes } from './data.js';\nimport { createUndoRedoStack, push as pushDiff, redo as redoDiff, undo as undoDiff } from './diff.js';\nimport { bytesPerRow, clampPos, extendRectangular, getCursorPos, getSelectedPositions, moveSelection, selectionContains, selectionFromPointerRange } from './selection.js';\n\ntype PointerMode = `pending` | `drag-value` | `select-cont` | `select-rect` | null;\n\ntype DragStart = {\n pos: BytePos;\n startValue: number;\n startY: number;\n startX: number;\n};\n\n@customElement(`ixfx-hex-editor`)\nexport class IxfxHexEditorElement extends LitElement {\n @property({ type: Number })\n columns = 4;\n\n @property({ type: String })\n colourScheme: ColourScheme = `ascii`;\n\n @property({ type: Boolean })\n showChangeset = true;\n\n @property({ type: Boolean, attribute: `hide-offset-col` })\n hideOffsetCol = false;\n\n @property({ type: Boolean, attribute: `hide-hex-col` })\n hideHexCol = false;\n\n @property({ type: Boolean, attribute: `hide-text-col` })\n hideTextCol = false;\n\n @state()\n private _selection: Selection = null;\n\n @state()\n private _scrollTop = 0;\n\n @state()\n private _editState: EditState | null = null;\n\n @state()\n private _containerH = 0;\n\n @state()\n private _shadeMap: ColourMap | null = null;\n\n @state()\n private _focusSide: `hex` | `text` | null = null;\n\n private _store = createHexStore(new Uint8Array(0));\n private _undoStack = createUndoRedoStack();\n private _copyBuffer: Uint8Array | null = null;\n private _rowHeight = 24;\n private _dragStart: DragStart | null = null;\n private _dragAnchor: BytePos | null = null;\n private _rectAnchorX = 0;\n private _rectAnchorY = 0;\n private _rectAnchorXFromKeyboard = 0;\n private _rectAnchorYFromKeyboard = 0;\n private _initialSelectionPoint: BytePos = 0;\n private _currentCursorPoint: BytePos = 0;\n private _pointerMode: PointerMode = null;\n private _currentDragDiff: Diff | null = null;\n private _shiftClickTarget: BytePos | null = null;\n\n static styles = css`\n :host {\n --hex-row-height: 24px;\n --hex-offset-width: 8ch;\n --hex-font: monospace;\n --hex-font-size: 0.85rem;\n --hex-changed-weight: bold;\n\n --ascii-null: #808080;\n --ascii-printable: #4caf50;\n --ascii-whitespace: #ffffff;\n --ascii-control: #f48fb1;\n --ascii-other: #ffeb3b;\n\n --shade-null: #808080;\n --shade-max: #ffffff;\n --shade-step-start: #ff0000;\n --shade-step-end: #0000ff;\n\n display: block;\n font-family: var(--hex-font);\n font-size: var(--hex-font-size);\n }\n\n .hex-editor {\n display: flex;\n flex-direction: column;\n height: 300px;\n overflow: hidden;\n background: #1e1e1e;\n color: #e0e0e0;\n border: 1px solid #333;\n border-radius: 4px;\n }\n\n .scroll-container {\n flex: 1;\n overflow-y: auto;\n position: relative;\n }\n\n .header {\n display: flex;\n background: #2d2d2d;\n font-weight: bold;\n border-bottom: 1px solid #444;\n height: var(--hex-row-height);\n flex-shrink: 0;\n align-items: center;\n }\n\n .row {\n display: flex;\n height: var(--hex-row-height);\n align-items: center;\n }\n\n .row:hover {\n background: rgba(255, 255, 255, 0.05);\n }\n\n .offset-cell {\n width: var(--hex-offset-width);\n padding: 0 8px;\n text-align: right;\n color: #888;\n flex-shrink: 0;\n box-sizing: border-box;\n }\n\n .col-group {\n display: inline-flex;\n gap: 4px;\n margin-right: 16px;\n }\n\n .col-header {\n width: calc(8ch + 28px);\n padding: 0 8px;\n color: #555;\n text-align: right;\n flex-shrink: 0;\n box-sizing: border-box;\n }\n\n .col-header.active {\n color: #aaa;\n }\n\n .text-header {\n padding: 4px 8px;\n color: #555;\n width: calc(var(--columns, 4) * 4 * 1ch);\n box-sizing: border-box;\n flex-shrink: 0;\n }\n\n .text-header.active {\n color: #aaa;\n }\n\n .hex-cell, .text-char {\n display: inline-block;\n width: 2ch;\n text-align: center;\n cursor: pointer;\n user-select: none;\n padding: 2px 0;\n }\n\n .hex-cell.selected, .text-char.selected {\n background: rgba(100, 149, 237, 0.4);\n }\n\n .hex-cell.changed, .text-char.changed {\n font-weight: var(--hex-changed-weight);\n }\n\n .hex-cell.editing {\n background: rgba(255, 215, 0, 0.3);\n }\n\n\n .text-area {\n display: inline-flex;\n gap: 0;\n }\n\n .text-char {\n width: 1ch;\n text-align: left;\n }\n\n .byte-null { color: var(--ascii-null); }\n .byte-printable { color: var(--ascii-printable); }\n .byte-whitespace { color: var(--ascii-whitespace); }\n .byte-control { color: var(--ascii-control); }\n .byte-other { color: var(--ascii-other); }\n `;\n\n setData(data: Uint8Array): void {\n this._store = createHexStore(data);\n this._undoStack = createUndoRedoStack();\n this._selection = null;\n this._editState = null;\n this._scrollTop = 0;\n this.requestUpdate();\n }\n\n undo(): void {\n const diff = undoDiff(this._undoStack);\n if (!diff)\n return;\n const reverse = reverseDiff(diff);\n applyDiff(this._store, reverse);\n this.requestUpdate();\n }\n\n redo(): void {\n const diff = redoDiff(this._undoStack);\n if (!diff)\n return;\n applyDiff(this._store, diff);\n this.requestUpdate();\n }\n\n recomputeColours(): void {\n const style = getComputedStyle(this);\n const nullC = style.getPropertyValue(`--shade-null`).trim() || `#808080`;\n const maxC = style.getPropertyValue(`--shade-max`).trim() || `#ffffff`;\n const stepStart = style.getPropertyValue(`--shade-step-start`).trim() || `#ff0000`;\n const stepEnd = style.getPropertyValue(`--shade-step-end`).trim() || `#0000ff`;\n this._shadeMap = createShadeMap(nullC, maxC, stepStart, stepEnd);\n this.requestUpdate();\n }\n\n * selectedBytes(): Generator<{ selection_index: number; array_index: number; value: number }> {\n const positions = getSelectedPositions(this._selection, this.columns);\n for (let i = 0; i < positions.length; i++) {\n const pos = positions[i];\n yield {\n selection_index: i,\n array_index: pos,\n value: readByte(this._store, pos),\n };\n }\n }\n\n containsPosition(pos: number): boolean {\n return selectionContains(this._selection, pos as BytePos, this.columns);\n }\n\n selectSingle(position: number): void {\n this._selection = { kind: `single`, pos: position as BytePos };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n selectContiguous(start: number, end: number): void {\n this._selection = {\n kind: `contiguous`,\n start: start as BytePos,\n end: end as BytePos,\n };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n selectRectangular(x: number, y: number, width: number, height: number): void {\n this._selection = {\n kind: `rectangular`,\n x,\n y,\n width,\n height,\n };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n clearSelection(): void {\n this._selection = null;\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n getSelection(): Selection {\n return this._selection;\n }\n\n protected override firstUpdated(): void {\n const container = this.shadowRoot?.querySelector(`.scroll-container`);\n if (container) {\n const ro = new ResizeObserver((entries) => {\n this._containerH = entries[0].contentRect.height;\n this.requestUpdate();\n });\n ro.observe(container);\n this._containerH = container.clientHeight;\n }\n this.recomputeColours();\n }\n\n private _onScroll = (e: Event): void => {\n const target = e.target as HTMLElement;\n this._scrollTop = target.scrollTop;\n this.requestUpdate();\n };\n\n private _onPointerDown(pos: BytePos, side: `hex` | `text`, e: PointerEvent): void {\n e.preventDefault();\n if (e.button !== 0)\n return;\n\n (this.shadowRoot?.querySelector(`.hex-editor`) as HTMLElement)?.focus();\n this._focusSide = side;\n\n const target = e.target as Element;\n target.setPointerCapture(e.pointerId);\n\n const bpr = bytesPerRow(this.columns);\n const startX = pos % bpr;\n const startY = Math.floor(pos / bpr);\n\n if (e.metaKey || e.ctrlKey) {\n this._pointerMode = `select-rect`;\n this._dragAnchor = pos;\n this._rectAnchorX = startX;\n this._rectAnchorY = startY;\n } else if (e.shiftKey) {\n this._pointerMode = `select-cont`;\n if (!this._selection || this._selection.kind !== `single`) {\n this._dragAnchor = pos;\n } else {\n this._dragAnchor = this._selection.pos;\n this._shiftClickTarget = pos;\n }\n } else {\n this._pointerMode = `pending`;\n this._dragStart = { pos, startValue: readByte(this._store, pos), startY: e.clientY, startX: e.clientX };\n this._dragAnchor = pos;\n this._currentDragDiff = null;\n }\n }\n\n private _onPointerMove(pos: BytePos, _side: `hex` | `text`, e: PointerEvent): void {\n if (!this._dragStart)\n return;\n\n const dy = Math.abs(e.clientY - this._dragStart.startY);\n const dx = Math.abs(e.clientX - this._dragStart.startX);\n\n if (this._pointerMode === `pending` && dy > 4 && dy > dx) {\n this._pointerMode = `drag-value`;\n this._editState = null;\n }\n\n if (this._pointerMode === `drag-value`) {\n const delta = Math.round((e.clientY - this._dragStart.startY) / 4);\n const newValue = Math.max(0, Math.min(255, this._dragStart.startValue - delta));\n this._currentDragDiff = writeByte(this._store, pos, newValue);\n this.requestUpdate();\n }\n\n if (this._pointerMode === `select-cont`) {\n if (this._dragAnchor !== null) {\n const mode = `contiguous`;\n this._selection = selectionFromPointerRange(this._dragAnchor, pos, mode, this.columns);\n this._dispatchSelectEvent();\n }\n }\n\n if (this._pointerMode === `select-rect`) {\n const bpr = bytesPerRow(this.columns);\n const currentX = pos % bpr;\n const currentY = Math.floor(pos / bpr);\n const x = Math.min(this._rectAnchorX, currentX);\n const y = Math.min(this._rectAnchorY, currentY);\n const width = Math.abs(currentX - this._rectAnchorX) + 1;\n const height = Math.abs(currentY - this._rectAnchorY) + 1;\n this._selection = { kind: `rectangular`, x, y, width, height };\n this._dispatchSelectEvent();\n }\n }\n\n private _onPointerUp(pos: BytePos, side: `hex` | `text`, e: PointerEvent): void {\n const target = e.target as Element;\n target.releasePointerCapture(e.pointerId);\n\n if (this._pointerMode === `pending`) {\n this._selection = { kind: `single`, pos };\n this._initialSelectionPoint = pos;\n this._currentCursorPoint = pos;\n this._editState = { pos, side, partial: `` };\n this._dispatchSelectEvent();\n }\n\n if (this._pointerMode === `select-cont`) {\n if (this._dragAnchor !== null && this._shiftClickTarget !== null) {\n this._selection = {\n kind: `contiguous`,\n start: this._dragAnchor,\n end: this._shiftClickTarget,\n };\n this._initialSelectionPoint = Math.min(this._dragAnchor, this._shiftClickTarget);\n this._currentCursorPoint = Math.max(this._dragAnchor, this._shiftClickTarget);\n this._dispatchSelectEvent();\n } else if (this._dragAnchor !== null) {\n const mode = `contiguous`;\n this._selection = selectionFromPointerRange(this._dragAnchor, pos, mode, this.columns);\n this._initialSelectionPoint = this._dragAnchor;\n this._currentCursorPoint = pos;\n this._dispatchSelectEvent();\n }\n }\n\n if (this._pointerMode === `select-rect`) {\n const bpr = bytesPerRow(this.columns);\n const currentX = pos % bpr;\n const currentY = Math.floor(pos / bpr);\n const x = Math.min(this._rectAnchorX, currentX);\n const y = Math.min(this._rectAnchorY, currentY);\n const width = Math.abs(currentX - this._rectAnchorX) + 1;\n const height = Math.abs(currentY - this._rectAnchorY) + 1;\n this._selection = { kind: `rectangular`, x, y, width, height };\n this._dispatchSelectEvent();\n }\n\n if (this._pointerMode === `drag-value` && this._currentDragDiff) {\n pushDiff(this._undoStack, this._currentDragDiff);\n this._dispatchChangeEvent(this._currentDragDiff);\n }\n\n this._pointerMode = null;\n this._dragStart = null;\n this._dragAnchor = null;\n this._currentDragDiff = null;\n this._shiftClickTarget = null;\n }\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n const isNavigationKey = [`ArrowLeft`, `ArrowRight`, `ArrowUp`, `ArrowDown`].includes(e.key);\n\n if (isNavigationKey) {\n e.preventDefault();\n e.stopPropagation();\n\n if (this._editState) {\n this._editState = null;\n }\n\n const dir = e.key.replace(`Arrow`, ``).toLowerCase() as `left` | `right` | `up` | `down`;\n const dataLen = storeLength(this._store);\n const bpr = bytesPerRow(this.columns);\n\n if (e.metaKey || e.ctrlKey) {\n if (!this._selection || this._selection.kind !== `rectangular`) {\n let startPos = 0;\n if (this._selection?.kind === `single`) {\n startPos = this._selection.pos;\n } else if (this._selection?.kind === `contiguous`) {\n startPos = Math.min(this._selection.start, this._selection.end);\n }\n this._rectAnchorXFromKeyboard = startPos % bpr;\n this._rectAnchorYFromKeyboard = Math.floor(startPos / bpr);\n this._selection = { kind: `rectangular`, x: this._rectAnchorXFromKeyboard, y: this._rectAnchorYFromKeyboard, width: 1, height: 1 };\n }\n this._selection = extendRectangular(this._selection, dir, this.columns, dataLen, this._rectAnchorXFromKeyboard, this._rectAnchorYFromKeyboard);\n } else if (e.shiftKey) {\n if (!this._selection) {\n this._initialSelectionPoint = 0;\n this._currentCursorPoint = 0;\n } else if (this._selection.kind === `single`) {\n this._initialSelectionPoint = this._selection.pos;\n this._currentCursorPoint = this._selection.pos;\n } else if (this._selection.kind === `rectangular`) {\n const cursorPos = this._selection.y * bpr + this._selection.x;\n this._initialSelectionPoint = cursorPos;\n this._currentCursorPoint = cursorPos;\n }\n const newPos = getCursorPos(this._selection, dir, this.columns, dataLen);\n const start = Math.min(this._initialSelectionPoint, newPos);\n const end = Math.max(this._initialSelectionPoint, newPos);\n this._currentCursorPoint = newPos;\n this._selection = { kind: `contiguous`, start, end };\n } else {\n this._selection = moveSelection(this._selection, dir, this.columns, dataLen);\n const pos = getCursorPos(this._selection, dir, this.columns, dataLen);\n this._initialSelectionPoint = pos;\n this._currentCursorPoint = pos;\n }\n this._dispatchSelectEvent();\n this.requestUpdate();\n return;\n }\n\n if (e.key === `Tab`) {\n e.preventDefault();\n e.stopPropagation();\n if (this._editState) {\n this._advanceCursor();\n } else {\n const dataLen = storeLength(this._store);\n this._selection = moveSelection(this._selection, `right`, this.columns, dataLen);\n this._dispatchSelectEvent();\n }\n this.requestUpdate();\n return;\n }\n\n if (e.key === `Escape`) {\n e.preventDefault();\n e.stopPropagation();\n if (this._editState) {\n this._editState = null;\n } else if (this._selection && this._selection.kind !== `single`) {\n const sel = this._selection;\n let firstPos = 0;\n if ((sel as { kind: string }).kind === `contiguous`) {\n const c = sel as { start: number; end: number };\n firstPos = Math.min(c.start, c.end);\n }\n if ((sel as { kind: string }).kind === `rectangular`) {\n const r = sel as { y: number; x: number };\n firstPos = r.y * bytesPerRow(this.columns) + r.x;\n }\n this._selection = { kind: `single`, pos: firstPos };\n this._dispatchSelectEvent();\n }\n this.requestUpdate();\n return;\n }\n\n if (this._editState) {\n e.stopPropagation();\n\n if (e.key === `Backspace`) {\n this._handleBackspace();\n return;\n }\n\n if (e.key === `Enter`) {\n if (this._editState.side === `hex` && this._editState.partial.startsWith(`.`)) {\n this._commitDecimalValue();\n }\n return;\n }\n\n if (e.key.length === 1) {\n this._handleValueEntry(e.key);\n }\n return;\n }\n\n if (this._selection && this._selection.kind === `single` && e.key.length === 1) {\n e.preventDefault();\n e.stopPropagation();\n const pos = this._selection.pos;\n const side: `hex` | `text` = this._focusSide ?? `hex`;\n this._editState = { pos, side, partial: `` };\n this._handleValueEntry(e.key);\n }\n };\n\n private _handleBackspace(): void {\n if (!this._editState)\n return;\n this._editState = { ...this._editState, partial: `` };\n this.requestUpdate();\n }\n\n private _handleValueEntry(key: string): void {\n if (!this._editState)\n return;\n\n const { pos, side, partial } = this._editState;\n\n if (side === `text`) {\n if (key.length === 1 && key.charCodeAt(0) >= 0x20 && key.charCodeAt(0) <= 0x7E) {\n const value = key.charCodeAt(0);\n const diff = writeByte(this._store, pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n return;\n }\n\n if (partial === `` && key === `.`) {\n this._editState = { ...this._editState, partial: `.` };\n this.requestUpdate();\n return;\n }\n\n if (partial.startsWith(`.`)) {\n if (/\\d/.test(key)) {\n let newPartial = partial + key;\n if (Number(newPartial.slice(1)) > 255) {\n newPartial = `.255`;\n }\n this._editState = { ...this._editState, partial: newPartial };\n this.requestUpdate();\n }\n return;\n }\n\n const hexChars = `0123456789ABCDEFabcdef`;\n if (hexChars.includes(key)) {\n const newPartial = (partial + key.toUpperCase()).slice(-2);\n this._editState = { ...this._editState, partial: newPartial };\n this.requestUpdate();\n\n if (newPartial.length === 2) {\n const value = Number.parseInt(newPartial, 16);\n const diff = writeByte(this._store, pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n } else if (partial !== ``) {\n this._editState = { ...this._editState, partial: `` };\n this.requestUpdate();\n }\n }\n\n private _commitDecimalValue(): void {\n if (!this._editState)\n return;\n const value = Number.parseInt(this._editState.partial.slice(1), 10);\n if (!Number.isNaN(value)) {\n const diff = writeByte(this._store, this._editState.pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n }\n\n private _advanceCursor(): void {\n if (!this._editState)\n return;\n const dataLen = storeLength(this._store);\n const newPos = clampPos(this._editState.pos + 1, dataLen);\n this._editState = { pos: newPos, side: this._editState.side, partial: `` };\n this._selection = { kind: `single`, pos: newPos };\n this.requestUpdate();\n }\n\n private _dispatchChangeEvent(diff: Diff): void {\n this.dispatchEvent(new CustomEvent(`hex-change`, {\n detail: { diff },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _dispatchSelectEvent(): void {\n const sel = this._selection;\n let detail: SelectEventDetail;\n\n if (!sel) {\n detail = { type: `none` };\n } else if (sel.kind === `single`) {\n detail = { type: `single`, position: sel.pos };\n } else if (sel.kind === `contiguous`) {\n detail = { type: `contiguous`, start: sel.start, end: sel.end };\n } else if (sel.kind === `rectangular`) {\n detail = { type: `rectangular`, x: sel.x, y: sel.y, width: sel.width, height: sel.height };\n } else {\n detail = { type: `none` };\n }\n\n this.dispatchEvent(new CustomEvent(`select`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _copy(): void {\n const positions = getSelectedPositions(this._selection, this.columns);\n if (positions.length === 0)\n return;\n\n const bytes = positions.map((p: BytePos) => readByte(this._store, p));\n this._copyBuffer = new Uint8Array(bytes);\n\n const hexStr = bytes.map((b: number) => b.toString(16).padStart(2, `0`)).join(` `);\n navigator.clipboard?.writeText(hexStr).catch(() => {});\n }\n\n private async _paste(): Promise<void> {\n let bytes: number[] | null = null;\n\n try {\n const text = await navigator.clipboard?.readText();\n if (text) {\n bytes = this._parseHexString(text);\n }\n } catch {\n // ignore\n }\n\n if (!bytes && this._copyBuffer) {\n bytes = Array.from(this._copyBuffer);\n }\n\n if (!bytes || bytes.length === 0)\n return;\n\n if (!this._selection)\n return;\n\n const entries = new Map<BytePos, number>();\n\n if (this._selection.kind === `single`) {\n const startPos = this._selection.pos;\n const dataLen = storeLength(this._store);\n for (let i = 0; i < bytes.length && startPos + i < dataLen; i++) {\n entries.set(startPos + i, bytes[i]);\n }\n } else if (this._selection.kind === `contiguous`) {\n const startPos = Math.min(this._selection.start, this._selection.end);\n const endPos = Math.max(this._selection.start, this._selection.end);\n const available = endPos - startPos + 1;\n for (let i = 0; i < Math.min(bytes.length, available); i++) {\n entries.set(startPos + i, bytes[i]);\n }\n } else if (this._selection.kind === `rectangular`) {\n const { x, y, width, height } = this._selection;\n const bpr = bytesPerRow(this.columns);\n let byteIdx = 0;\n for (let row = 0; row < height && byteIdx < bytes.length; row++) {\n for (let col = 0; col < width && byteIdx < bytes.length; col++) {\n const pos = (y + row) * bpr + x + col;\n entries.set(pos, bytes[byteIdx++]);\n }\n }\n }\n\n if (entries.size > 0) {\n const diff = writeBytes(this._store, entries);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this.requestUpdate();\n }\n }\n\n private _parseHexString(text: string): number[] {\n const bytes: number[] = [];\n const cleaned = text.replace(/[^0-9A-F]/gi, ` `).trim();\n if (!cleaned)\n return bytes;\n\n const parts = cleaned.split(/\\s+/);\n for (const part of parts) {\n if (part.length === 1) {\n bytes.push(Number.parseInt(part + part, 16));\n } else if (part.length === 2) {\n bytes.push(Number.parseInt(part, 16));\n }\n }\n return bytes;\n }\n\n private _getColHeaders(): string[] {\n const headers: string[] = [];\n for (let i = 0; i < this.columns; i++) {\n const offset = i * 4;\n headers.push(`+${offset.toString(16).toUpperCase()}`);\n }\n return headers;\n }\n\n private _isRowShaded(pos: BytePos): boolean {\n const sel = this._selection;\n if (!sel || sel.kind !== `single`)\n return true;\n const bpr = bytesPerRow(this.columns);\n const row = Math.floor(pos / bpr);\n const selRow = Math.floor(sel.pos / bpr);\n return row === selRow;\n }\n\n private _isHexShaded(pos: BytePos): boolean {\n return this._isRowShaded(pos);\n }\n\n private _isTextShaded(pos: BytePos): boolean {\n return this._isRowShaded(pos);\n }\n\n protected render() {\n const dataLen = storeLength(this._store);\n const bpr = bytesPerRow(this.columns);\n const totalRows = Math.ceil(dataLen / bpr);\n const containerH = this._containerH > 0 ? this._containerH : 280;\n const startRow = Math.floor(this._scrollTop / this._rowHeight);\n const endRow = Math.min(startRow + Math.ceil(containerH / this._rowHeight) + 2, totalRows);\n const topSpacerHeight = startRow * this._rowHeight;\n const botSpacerHeight = (totalRows - endRow) * this._rowHeight;\n const changeset = getChangeset(this._store);\n\n const colHeaders = this._getColHeaders();\n const hexActive = this._focusSide === `hex` || this._focusSide === null;\n const textActive = this._focusSide === `text`;\n\n return html`\n <div class=\"hex-editor\" tabindex=\"0\" @keydown=${this._onKeyDown} @pointerleave=${() => {}}>\n <div class=\"header\">\n ${this.hideOffsetCol ? null : html`<span class=\"offset-cell\">Offset</span>`}\n ${this.hideHexCol ? null : repeat(colHeaders, h => html`<span class=\"col-header ${hexActive ? `active` : ``}\">${h}</span>`)}\n ${this.hideTextCol ? null : html`<span class=\"text-header ${textActive ? `active` : ``}\">Text</span>`}\n </div>\n <div class=\"scroll-container\" @scroll=${this._onScroll}>\n <div style=\"height: ${topSpacerHeight}px\"></div>\n ${repeat(\n Array.from({ length: endRow - startRow }, (_, i) => startRow + i),\n rowIndex => rowIndex,\n rowIndex => this._renderRow(rowIndex, changeset),\n )}\n <div style=\"height: ${botSpacerHeight}px\"></div>\n </div>\n </div>\n `;\n }\n\n private _renderRow(rowIndex: number, changeset: ReadonlySet<BytePos>) {\n const bpr = bytesPerRow(this.columns);\n const offset = rowIndex * bpr;\n\n return html`\n <div class=\"row\" data-row=${rowIndex}>\n ${this.hideOffsetCol ? null : html`<span class=\"offset-cell\">${offset.toString(16).toUpperCase().padStart(6, `0`)}</span>`}\n ${this.hideHexCol\n ? null\n : repeat(\n Array.from({ length: this.columns }, (_, i) => i),\n colIndex => colIndex,\n colIndex => this._renderColumn(rowIndex, colIndex, changeset),\n )}\n ${this.hideTextCol\n ? null\n : html`\n <span class=\"text-area\">\n ${repeat(\n Array.from({ length: bpr }, (_, i) => i),\n i => i,\n i => this._renderTextChar(offset + i, changeset),\n )}\n </span>\n `}\n </div>\n `;\n }\n\n private _renderColumn(rowIndex: number, colIndex: number, changeset: ReadonlySet<BytePos>) {\n const bpr = bytesPerRow(this.columns);\n const basePos = rowIndex * bpr + colIndex * 4;\n\n return html`\n <span class=\"col-group\">\n ${[0, 1, 2, 3].map(b => this._renderHexCell(basePos + b, changeset))}\n </span>\n `;\n }\n\n private _renderHexCell(pos: BytePos, changeset: ReadonlySet<BytePos>) {\n const dataLen = storeLength(this._store);\n if (pos >= dataLen) {\n return html`<span class=\"hex-cell\"></span>`;\n }\n\n const byte = readByte(this._store, pos);\n const hexStr = byte.toString(16).toUpperCase().padStart(2, `0`);\n\n const isSelected = selectionContains(this._selection, pos, this.columns);\n const isChanged = this.showChangeset && changeset.has(pos);\n const isEditing = this._editState?.pos === pos;\n\n const classes: string[] = [`hex-cell`];\n if (isSelected)\n classes.push(`selected`);\n if (isChanged)\n classes.push(`changed`);\n if (isEditing)\n classes.push(`editing`);\n if (this._isHexShaded(pos))\n classes.push(`shaded`);\n\n let displayText = hexStr;\n let colourStyle: Record<string, string> | undefined;\n\n if (isEditing && this._editState) {\n displayText = this._editState.partial === `` ? hexStr : `${this._editState.partial}_`;\n }\n\n if (this.colourScheme === `shade` && this._shadeMap) {\n colourStyle = { color: this._shadeMap.forByte(byte) };\n } else if (this.colourScheme === `ascii`) {\n classes.push(getAsciiClass(byte));\n }\n\n return html`\n <span\n class=${classes.join(` `)}\n style=${styleMap(colourStyle || {})}\n @pointerdown=${(e: PointerEvent) => this._onPointerDown(pos, `hex`, e)}\n @pointerup=${(e: PointerEvent) => this._onPointerUp(pos, `hex`, e)}\n @pointermove=${(e: PointerEvent) => this._onPointerMove(pos, `hex`, e)}\n >${displayText}</span>\n `;\n }\n\n private _renderTextChar(pos: BytePos, changeset: ReadonlySet<BytePos>) {\n const dataLen = storeLength(this._store);\n if (pos >= dataLen) {\n return html`<span class=\"text-char\"></span>`;\n }\n\n const byte = readByte(this._store, pos);\n const char = byte >= 0x20 && byte <= 0x7E ? String.fromCharCode(byte) : `.`;\n\n const isSelected = selectionContains(this._selection, pos, this.columns);\n const isChanged = this.showChangeset && changeset.has(pos);\n\n const classes: string[] = [`text-char`];\n if (isSelected)\n classes.push(`selected`);\n if (isChanged)\n classes.push(`changed`);\n if (this._isTextShaded(pos))\n classes.push(`shaded`);\n\n let colourStyle: Record<string, string> | undefined;\n\n if (this.colourScheme === `shade` && this._shadeMap) {\n colourStyle = { color: this._shadeMap.forByte(byte) };\n } else if (this.colourScheme === `ascii`) {\n classes.push(getAsciiClass(byte));\n }\n\n return html`\n <span\n class=${classes.join(` `)}\n style=${styleMap(colourStyle || {})}\n @pointerdown=${(e: PointerEvent) => this._onPointerDown(pos, `text`, e)}\n @pointerup=${(e: PointerEvent) => this._onPointerUp(pos, `text`, e)}\n @pointermove=${(e: PointerEvent) => this._onPointerMove(pos, `text`, e)}\n >${char}</span>\n `;\n }\n}\n\nexport type HexChangeDetail = {\n readonly diff: Diff;\n};\n\nexport type HexChangeEvent = CustomEvent<HexChangeDetail>;\n\nexport type SingleSelectEventDetail = { readonly type: `single`; readonly position: number };\nexport type ContiguousSelectEventDetail = { readonly type: `contiguous`; readonly start: number; readonly end: number };\nexport type RectangularSelectEventDetail = { readonly type: `rectangular`; readonly x: number; readonly y: number; readonly width: number; readonly height: number };\nexport type NoneSelectEventDetail = { readonly type: `none` };\nexport type SelectEventDetail = SingleSelectEventDetail | ContiguousSelectEventDetail | RectangularSelectEventDetail | NoneSelectEventDetail;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-hex-editor': IxfxHexEditorElement;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { LitElement } from "lit";
|
|
2
|
-
|
|
3
2
|
//#region src/hex/types.d.ts
|
|
4
3
|
type BytePos = number;
|
|
5
4
|
type SingleSelection = {
|
|
@@ -124,7 +123,7 @@ declare global {
|
|
|
124
123
|
interface HTMLElementTagNameMap {
|
|
125
124
|
'ixfx-hex-editor': IxfxHexEditorElement;
|
|
126
125
|
}
|
|
127
|
-
}
|
|
126
|
+
}
|
|
128
127
|
//#endregion
|
|
129
128
|
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 };
|
|
130
|
-
//# sourceMappingURL=hex-editor-
|
|
129
|
+
//# sourceMappingURL=hex-editor-Caq8vNQk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-editor-Caq8vNQk.d.ts","names":[],"sources":["../src/hex/types.ts","../src/hex/hex-editor.ts"],"mappings":";;KAAY;KAEA;WAA6B;WAAyB,KAAK;;KAC3D;WAAiC;WAA6B,OAAO;WAAkB,KAAK;;KAC5F;WAAkC;WAA8B;WAAoB;WAAoB;WAAwB;;KAChI,YAAY,kBAAkB,sBAAsB;KAYpD;WAAuB;WAAyB;;KAChD,OAAO,YAAY,SAAS;KAK5B;;;cCCC,6BAA6B;EAExC;EAGA,cAAc;EAGd;EAGA;EAGA;EAGA;UAGQ;UAGA;UAGA;UAGA;UAGA;UAGA;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;SAED,sBAAM;EA4Ib,QAAQ,MAAM;EASd;EASA;EAQA;EAUE,iBAAiB;IAAY;IAAyB;IAAqB;;EAY7E,iBAAiB;EAIjB,aAAa;EAMb,iBAAiB,eAAe;EAUhC,kBAAkB,WAAW,WAAW,eAAe;EAYvD;EAMA,gBAAgB;YAIG;UAaX;UAMA;UAoCA;UAwCA;UAuDA;UA4HA;UAOA;UAsDA;UAYA;UAUA;UAQA;UAuBA;UAYM;UAyDN;UAiBA;UASA;UAUA;UAIA;YAIE,wBAAM;UAmCR;UA6BA;UAWA;UA+CA;;KAwCE;WACD,MAAM;;KAGL,iBAAiB,YAAY;KAE7B;WAAqC;WAAyB;;KAC9D;WAAyC;WAA6B;WAAwB;;KAC9F;WAA0C;WAA8B;WAAoB;WAAoB;WAAwB;;KACxI;WAAmC;;KACnC,oBAAoB,0BAA0B,8BAA8B,+BAA+B;QAE/G;YACI;IACR,mBAAmB"}
|
package/dist/hex.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as NoneSelectEventDetail, c as SingleSelectEventDetail, i as IxfxHexEditorElement, n as HexChangeDetail, o as RectangularSelectEventDetail, r as HexChangeEvent, s as SelectEventDetail, t as ContiguousSelectEventDetail } from "./hex-editor-
|
|
1
|
+
import { a as NoneSelectEventDetail, c as SingleSelectEventDetail, i as IxfxHexEditorElement, n as HexChangeDetail, o as RectangularSelectEventDetail, r as HexChangeEvent, s as SelectEventDetail, t as ContiguousSelectEventDetail } from "./hex-editor-Caq8vNQk.js";
|
|
2
2
|
export { ContiguousSelectEventDetail, HexChangeDetail, HexChangeEvent, IxfxHexEditorElement, NoneSelectEventDetail, RectangularSelectEventDetail, SelectEventDetail, SingleSelectEventDetail };
|
package/dist/hex.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as IxfxHexEditorElement } from "./hex-editor-
|
|
1
|
+
import { t as IxfxHexEditorElement } from "./hex-editor-Bk6rxhfg.js";
|
|
2
2
|
export { IxfxHexEditorElement };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"highlight-B-eQrhhb.js","names":[],"sources":["../src/incr-search/highlight.ts"],"sourcesContent":["import type { HighlightOptions, HighlightTarget } from './types.js';\n\nconst DEFAULT_KEY = `incr-search-highlight`;\n\nexport function applyHighlights(\n targets: readonly HighlightTarget[],\n options: HighlightOptions = {},\n): void {\n if (typeof CSS === `undefined` || !CSS.highlights)\n return;\n\n const key = options.key ?? DEFAULT_KEY;\n CSS.highlights.delete(key);\n\n const ranges: Range[] = [];\n\n for (const { element, text, positions } of targets) {\n if (!positions.size)\n continue;\n\n const textNode = findTextNode(element, text);\n if (!textNode)\n continue;\n\n for (const pos of positions) {\n const range = new Range();\n range.setStart(textNode, pos);\n range.setEnd(textNode, pos + 1);\n ranges.push(range);\n }\n }\n\n if (ranges.length > 0) {\n CSS.highlights.set(key, new Highlight(...ranges));\n }\n}\n\nexport function clearHighlights(options: HighlightOptions = {}): void {\n if (typeof CSS === `undefined` || !CSS.highlights)\n return;\n CSS.highlights.delete(options.key ?? DEFAULT_KEY);\n}\n\nexport function buildHighlightTargets<T>(\n root: ShadowRoot | Element,\n itemSelector: string,\n positionsByItem: ReadonlyMap<T, ReadonlySet<number>>,\n getItem: (el: Element) => T | undefined,\n getText: (el: Element) => string,\n): HighlightTarget[] {\n const targets: HighlightTarget[] = [];\n const labelEls = root.querySelectorAll(itemSelector);\n\n for (const el of labelEls) {\n const item = getItem(el);\n if (item === undefined)\n continue;\n const positions = positionsByItem.get(item);\n if (!positions || positions.size === 0)\n continue;\n targets.push({ element: el, text: getText(el), positions });\n }\n\n return targets;\n}\n\nfunction findTextNode(element: Element, expectedText?: string): Text | null {\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n if (expectedText === undefined || node.textContent === expectedText) {\n return node as Text;\n }\n }\n }\n return null;\n}\n"],"mappings":";AAEA,MAAM,cAAc;AAEpB,SAAgB,gBACd,SACA,UAA4B,CAAC,GACvB;CACN,IAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,YACrC;CAEF,MAAM,MAAM,QAAQ,OAAO;CAC3B,IAAI,WAAW,OAAO,GAAG;CAEzB,MAAM,SAAkB,CAAC;CAEzB,KAAK,MAAM,EAAE,SAAS,MAAM,eAAe,SAAS;EAClD,IAAI,CAAC,UAAU,MACb;EAEF,MAAM,WAAW,aAAa,SAAS,IAAI;EAC3C,IAAI,CAAC,UACH;EAEF,KAAK,MAAM,OAAO,WAAW;GAC3B,MAAM,QAAQ,IAAI,MAAM;GACxB,MAAM,SAAS,UAAU,GAAG;GAC5B,MAAM,OAAO,UAAU,MAAM,CAAC;GAC9B,OAAO,KAAK,KAAK;EACnB;CACF;CAEA,IAAI,OAAO,SAAS,GAClB,IAAI,WAAW,IAAI,KAAK,IAAI,UAAU,GAAG,MAAM,CAAC;AAEpD;AAEA,SAAgB,gBAAgB,UAA4B,CAAC,GAAS;CACpE,IAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,YACrC;CACF,IAAI,WAAW,OAAO,QAAQ,OAAO,WAAW;AAClD;AAEA,SAAgB,sBACd,MACA,cACA,iBACA,SACA,SACmB;CACnB,MAAM,UAA6B,CAAC;CACpC,MAAM,WAAW,KAAK,iBAAiB,YAAY;CAEnD,KAAK,MAAM,MAAM,UAAU;EACzB,MAAM,OAAO,QAAQ,EAAE;EACvB,IAAI,SAAS,KAAA,GACX;EACF,MAAM,YAAY,gBAAgB,IAAI,IAAI;EAC1C,IAAI,CAAC,aAAa,UAAU,SAAS,GACnC;EACF,QAAQ,KAAK;GAAE,SAAS;GAAI,MAAM,QAAQ,EAAE;GAAG;EAAU,CAAC;CAC5D;CAEA,OAAO;AACT;AAEA,SAAS,aAAa,SAAkB,cAAoC;CAC1E,KAAK,MAAM,QAAQ,QAAQ,YACzB,IAAI,KAAK,aAAa,KAAK;
|
|
1
|
+
{"version":3,"file":"highlight-B-eQrhhb.js","names":[],"sources":["../src/incr-search/highlight.ts"],"sourcesContent":["import type { HighlightOptions, HighlightTarget } from './types.js';\n\nconst DEFAULT_KEY = `incr-search-highlight`;\n\nexport function applyHighlights(\n targets: readonly HighlightTarget[],\n options: HighlightOptions = {},\n): void {\n if (typeof CSS === `undefined` || !CSS.highlights)\n return;\n\n const key = options.key ?? DEFAULT_KEY;\n CSS.highlights.delete(key);\n\n const ranges: Range[] = [];\n\n for (const { element, text, positions } of targets) {\n if (!positions.size)\n continue;\n\n const textNode = findTextNode(element, text);\n if (!textNode)\n continue;\n\n for (const pos of positions) {\n const range = new Range();\n range.setStart(textNode, pos);\n range.setEnd(textNode, pos + 1);\n ranges.push(range);\n }\n }\n\n if (ranges.length > 0) {\n CSS.highlights.set(key, new Highlight(...ranges));\n }\n}\n\nexport function clearHighlights(options: HighlightOptions = {}): void {\n if (typeof CSS === `undefined` || !CSS.highlights)\n return;\n CSS.highlights.delete(options.key ?? DEFAULT_KEY);\n}\n\nexport function buildHighlightTargets<T>(\n root: ShadowRoot | Element,\n itemSelector: string,\n positionsByItem: ReadonlyMap<T, ReadonlySet<number>>,\n getItem: (el: Element) => T | undefined,\n getText: (el: Element) => string,\n): HighlightTarget[] {\n const targets: HighlightTarget[] = [];\n const labelEls = root.querySelectorAll(itemSelector);\n\n for (const el of labelEls) {\n const item = getItem(el);\n if (item === undefined)\n continue;\n const positions = positionsByItem.get(item);\n if (!positions || positions.size === 0)\n continue;\n targets.push({ element: el, text: getText(el), positions });\n }\n\n return targets;\n}\n\nfunction findTextNode(element: Element, expectedText?: string): Text | null {\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n if (expectedText === undefined || node.textContent === expectedText) {\n return node as Text;\n }\n }\n }\n return null;\n}\n"],"mappings":";AAEA,MAAM,cAAc;AAEpB,SAAgB,gBACd,SACA,UAA4B,CAAC,GACvB;CACN,IAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,YACrC;CAEF,MAAM,MAAM,QAAQ,OAAO;CAC3B,IAAI,WAAW,OAAO,GAAG;CAEzB,MAAM,SAAkB,CAAC;CAEzB,KAAK,MAAM,EAAE,SAAS,MAAM,eAAe,SAAS;EAClD,IAAI,CAAC,UAAU,MACb;EAEF,MAAM,WAAW,aAAa,SAAS,IAAI;EAC3C,IAAI,CAAC,UACH;EAEF,KAAK,MAAM,OAAO,WAAW;GAC3B,MAAM,QAAQ,IAAI,MAAM;GACxB,MAAM,SAAS,UAAU,GAAG;GAC5B,MAAM,OAAO,UAAU,MAAM,CAAC;GAC9B,OAAO,KAAK,KAAK;EACnB;CACF;CAEA,IAAI,OAAO,SAAS,GAClB,IAAI,WAAW,IAAI,KAAK,IAAI,UAAU,GAAG,MAAM,CAAC;AAEpD;AAEA,SAAgB,gBAAgB,UAA4B,CAAC,GAAS;CACpE,IAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,YACrC;CACF,IAAI,WAAW,OAAO,QAAQ,OAAO,WAAW;AAClD;AAEA,SAAgB,sBACd,MACA,cACA,iBACA,SACA,SACmB;CACnB,MAAM,UAA6B,CAAC;CACpC,MAAM,WAAW,KAAK,iBAAiB,YAAY;CAEnD,KAAK,MAAM,MAAM,UAAU;EACzB,MAAM,OAAO,QAAQ,EAAE;EACvB,IAAI,SAAS,KAAA,GACX;EACF,MAAM,YAAY,gBAAgB,IAAI,IAAI;EAC1C,IAAI,CAAC,aAAa,UAAU,SAAS,GACnC;EACF,QAAQ,KAAK;GAAE,SAAS;GAAI,MAAM,QAAQ,EAAE;GAAG;EAAU,CAAC;CAC5D;CAEA,OAAO;AACT;AAEA,SAAS,aAAa,SAAkB,cAAoC;CAC1E,KAAK,MAAM,QAAQ,QAAQ,YACzB,IAAI,KAAK,aAAa,KAAK,WACrB;MAAA,iBAAiB,KAAA,KAAa,KAAK,gBAAgB,cACrD,OAAO;CAAA;CAIb,OAAO;AACT"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { LitElement, nothing } from "lit";
|
|
2
|
-
|
|
3
2
|
//#region src/icons/icon.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Renders an icon from the icon registry by name.
|
|
@@ -21,7 +20,7 @@ declare class IxfxIconElement extends LitElement {
|
|
|
21
20
|
rotate: string;
|
|
22
21
|
connectedCallback(): void;
|
|
23
22
|
disconnectedCallback(): void;
|
|
24
|
-
protected render():
|
|
23
|
+
protected render(): import("lit").TemplateResult<1> | typeof nothing;
|
|
25
24
|
protected updated(changed: Map<string, unknown>): void;
|
|
26
25
|
static styles: import("lit").CSSResult[];
|
|
27
26
|
}
|
|
@@ -29,7 +28,7 @@ declare global {
|
|
|
29
28
|
interface HTMLElementTagNameMap {
|
|
30
29
|
'ixfx-icon': IxfxIconElement;
|
|
31
30
|
}
|
|
32
|
-
}
|
|
31
|
+
}
|
|
33
32
|
//#endregion
|
|
34
33
|
export { IxfxIconElement as t };
|
|
35
|
-
//# sourceMappingURL=icon-
|
|
34
|
+
//# sourceMappingURL=icon-BUwP1CZ1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-BUwP1CZ1.d.ts","names":[],"sources":["../src/icons/icon.ts"],"mappings":";;;;;;;;;;;;;cAoBa,wBAAwB;;EACvB;EACgB;EAChB;EAC0C;EACU;EAQvD;EAKA;YAKU,wBAAM,2BAAA;YAgBN,QAAQ,SAAS;SAWpB,sBAAM;;QAsChB;YACI;IACR,aAAa"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
|
|
2
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
3
|
-
import {
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
3
|
+
import { a as registerDefaults, c as iconBus, o as getIcon } from "./defaults-BCiDhZbF.js";
|
|
4
4
|
import { LitElement, css, html, nothing } from "lit";
|
|
5
5
|
import { property } from "lit/decorators.js";
|
|
6
6
|
import { unsafeHTML } from "lit/directives/unsafe-html.js";
|
|
@@ -39,8 +39,10 @@ let IxfxIconElement = class IxfxIconElement extends LitElement {
|
|
|
39
39
|
}
|
|
40
40
|
updated(changed) {
|
|
41
41
|
super.updated(changed);
|
|
42
|
-
if (changed.has(`rotate`))
|
|
43
|
-
|
|
42
|
+
if (changed.has(`rotate`)) {
|
|
43
|
+
if (this.rotate?.length > 0) this.style.setProperty(`--rotate`, this.rotate);
|
|
44
|
+
else this.style.removeProperty(`--rotate`);
|
|
45
|
+
}
|
|
44
46
|
}
|
|
45
47
|
static {
|
|
46
48
|
this.styles = [themeFallbacks, css`
|
|
@@ -95,6 +97,9 @@ __decorate([property({
|
|
|
95
97
|
})], IxfxIconElement.prototype, "rotate", void 0);
|
|
96
98
|
IxfxIconElement = __decorate([safeCustomElement(`ixfx-icon`)], IxfxIconElement);
|
|
97
99
|
//#endregion
|
|
100
|
+
//#region src/icons/index.ts
|
|
101
|
+
registerDefaults();
|
|
102
|
+
//#endregion
|
|
98
103
|
export { IxfxIconElement as t };
|
|
99
104
|
|
|
100
|
-
//# sourceMappingURL=
|
|
105
|
+
//# sourceMappingURL=icons-Bm2ByQ3s.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons-Bm2ByQ3s.js","names":["#onIconChange","customElement"],"sources":["../src/icons/icon.ts","../src/icons/index.ts"],"sourcesContent":["import type { IconChangedEvent } from './registry.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { getIcon, iconBus } from './registry.js';\n\n/**\n * Renders an icon from the icon registry by name.\n *\n * @example\n * ```html\n * <ixfx-icon name=\"chevron-down\"></ixfx-icon>\n * <ixfx-icon name=\"close\" size=\"32\" label=\"Close dialog\"></ixfx-icon>\n * ```\n *\n * Use `registerIcon(name, svgString)` to add or override icons.\n */\n@customElement(`ixfx-icon`)\nexport class IxfxIconElement extends LitElement {\n @property() name = ``;\n @property({ type: Number }) size: number | undefined;\n @property() label = ``;\n @property({ type: Boolean, attribute: `prominence` }) prominence = false;\n @property({ type: String, attribute: `rotate`, reflect: true }) rotate = ``;\n\n #onIconChange = (e: Event): void => {\n if ((e as IconChangedEvent).detail.name === this.name) {\n this.requestUpdate();\n }\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n iconBus.addEventListener(`ixfx-icon-change`, this.#onIconChange);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n iconBus.removeEventListener(`ixfx-icon-change`, this.#onIconChange);\n }\n\n protected override render() {\n const svg = getIcon(this.name);\n if (!svg)\n return nothing;\n\n const hasLabel = this.label.length > 0;\n\n return html`\n <span\n class=\"icon-wrapper\"\n aria-hidden=${hasLabel ? nothing : `true`}\n aria-label=${hasLabel ? this.label : nothing}\n >${unsafeHTML(svg)}</span>\n `;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`rotate`)) {\n if (this.rotate?.length > 0) {\n this.style.setProperty(`--rotate`, this.rotate);\n } else {\n this.style.removeProperty(`--rotate`);\n }\n }\n }\n\n static override styles = [themeFallbacks, css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1em;\n height: 1em;\n opacity: var(--opacity, 1);\n }\n\n :host([prominence]) {\n opacity: var(--prominence-idle-opacity, 1);\n }\n\n :host([prominence]:hover) {\n opacity: var(--prominence-tickled-opacity, 1);\n }\n\n :host([prominence][disabled]) {\n opacity: var(--prominence-disabled-opacity, 0.5);\n }\n\n .icon-wrapper {\n display: contents;\n }\n\n :host svg {\n width: 100%;\n height: 100%;\n transition: transform var(--transition, 0.15s ease-out);\n }\n\n :host([rotate]) svg {\n transform: rotate(var(--rotate));\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-icon': IxfxIconElement;\n }\n}\n","import { registerDefaults } from './defaults.js';\n\nexport { ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE } from './defaults.js';\nexport { IxfxIconElement } from './icon.js';\nexport { getIcon, hasIcon, iconBus, registerIcon, svgToDataUri } from './registry.js';\nexport type { IconChangedDetail, IconChangedEvent } from './registry.js';\n\nregisterDefaults();\n"],"mappings":";;;;;;;AAoBO,IAAM,kBAAN,MAAM,wBAAwB,WAAW;;;EAC3B,KAAA,OAAA;EAEC,KAAA,QAAA;EAC+C,KAAA,aAAA;EACM,KAAA,SAAA;EAExD,KAAA,iBAAA,MAAmB;GAClC,IAAK,EAAuB,OAAO,SAAS,KAAK,MAC/C,KAAK,cAAc;EAEvB;;CAJA;CAMA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,QAAQ,iBAAiB,oBAAoB,KAAKA,aAAa;CACjE;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,QAAQ,oBAAoB,oBAAoB,KAAKA,aAAa;CACpE;CAEA,SAA4B;EAC1B,MAAM,MAAM,QAAQ,KAAK,IAAI;EAC7B,IAAI,CAAC,KACH,OAAO;EAET,MAAM,WAAW,KAAK,MAAM,SAAS;EAErC,OAAO,IAAI;;;sBAGO,WAAW,UAAU,OAAO;qBAC7B,WAAW,KAAK,QAAQ,QAAQ;SAC5C,WAAW,GAAG,EAAE;;CAEvB;CAEA,QAA2B,SAAqC;EAC9D,MAAM,QAAQ,OAAO;EACrB,IAAI,QAAQ,IAAI,QAAQ,GAAG;GACzB,IAAI,KAAK,QAAQ,SAAS,GACxB,KAAK,MAAM,YAAY,YAAY,KAAK,MAAM;QAE9C,KAAK,MAAM,eAAe,UAAU;EAExC;CACF;;EAEyB,KAAA,SAAA,CAAC,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmC5C;;AACH;AArFG,WAAA,CAAA,SAAS,CAAA,GAAA,gBAAA,WAAA,QAAA,KAAA,CAAA;AACT,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,gBAAA,WAAA,QAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,CAAA,GAAA,gBAAA,WAAA,SAAA,KAAA,CAAA;AACT,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;AAAa,CAAC,CAAA,GAAA,gBAAA,WAAA,cAAA,KAAA,CAAA;AACnD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAU,SAAS;AAAK,CAAC,CAAA,GAAA,gBAAA,WAAA,UAAA,KAAA,CAAA;AAN/DC,kBAAAA,WAAAA,CAAAA,kBAAc,WAAW,CAAA,GAAA,eAAA;;;ACZ1B,iBAAiB"}
|
package/dist/icons.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as IxfxIconElement } from "./icon-
|
|
2
|
-
import { a as iconBus, c as ICON_CARET_RIGHT, d as ICON_CLOSE, i as hasIcon, l as ICON_CHECK, n as IconChangedEvent, o as registerIcon, r as getIcon, s as svgToDataUri, t as IconChangedDetail, u as ICON_CHEVRON_DOWN } from "./index-
|
|
1
|
+
import { t as IxfxIconElement } from "./icon-BUwP1CZ1.js";
|
|
2
|
+
import { a as iconBus, c as ICON_CARET_RIGHT, d as ICON_CLOSE, i as hasIcon, l as ICON_CHECK, n as IconChangedEvent, o as registerIcon, r as getIcon, s as svgToDataUri, t as IconChangedDetail, u as ICON_CHEVRON_DOWN } from "./index-RqMh1i-O.js";
|
|
3
3
|
export { ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE, type IconChangedDetail, type IconChangedEvent, IxfxIconElement, getIcon, hasIcon, iconBus, registerIcon, svgToDataUri };
|
package/dist/icons.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as IxfxIconElement } from "./
|
|
3
|
-
import { a as registerDefaults, i as ICON_CLOSE, n as ICON_CHECK, r as ICON_CHEVRON_DOWN, t as ICON_CARET_RIGHT } from "./defaults-BkWCPJFL.js";
|
|
4
|
-
//#region src/icons/index.ts
|
|
5
|
-
registerDefaults();
|
|
6
|
-
//#endregion
|
|
1
|
+
import { c as iconBus, i as ICON_CLOSE, l as registerIcon, n as ICON_CHECK, o as getIcon, r as ICON_CHEVRON_DOWN, s as hasIcon, t as ICON_CARET_RIGHT, u as svgToDataUri } from "./defaults-BCiDhZbF.js";
|
|
2
|
+
import { t as IxfxIconElement } from "./icons-Bm2ByQ3s.js";
|
|
7
3
|
export { ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE, IxfxIconElement, getIcon, hasIcon, iconBus, registerIcon, svgToDataUri };
|
|
8
|
-
|
|
9
|
-
//# sourceMappingURL=icons.js.map
|