@ixfx/components 0.2.5 → 0.3.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 +365 -143
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +2330 -826
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +2 -3
- package/dist/ac-text.d.ts.map +1 -1
- package/dist/ac-text.js +5 -5
- package/dist/ac-text.js.map +1 -1
- package/dist/{button-DgKUzE5o.js → button-DMt5XWUK.js} +6 -6
- package/dist/button-DMt5XWUK.js.map +1 -0
- package/dist/button.d.ts +3 -4
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -1
- package/dist/checkbox.d.ts +3 -5
- package/dist/checkbox.d.ts.map +1 -1
- package/dist/checkbox.js +3 -3
- package/dist/checkbox.js.map +1 -1
- package/dist/{colour-C3MQIjFJ-BJV-QC-3.js → colour-C3MQIjFJ-BLXg8W3U.js} +2 -2
- package/dist/{colour-C3MQIjFJ-BJV-QC-3.js.map → colour-C3MQIjFJ-BLXg8W3U.js.map} +1 -1
- package/dist/{colour-picker-Bw-AZoWx.js → colour-picker-K6zu82lm.js} +8 -8
- package/dist/colour-picker-K6zu82lm.js.map +1 -0
- package/dist/colour-picker.d.ts +2 -2
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +4 -6
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +12 -12
- package/dist/crumbs.js.map +1 -1
- package/dist/data-display.d.ts +1 -2
- package/dist/data-display.d.ts.map +1 -1
- package/dist/data-display.js +4 -5
- package/dist/data-display.js.map +1 -1
- package/dist/decorate-D7rC1gLP.js +27 -0
- package/dist/decorate-D7rC1gLP.js.map +1 -0
- package/dist/{defaults-FEZaGiYZ.js → defaults-C7elhuyJ.js} +2 -2
- package/dist/{defaults-FEZaGiYZ.js.map → defaults-C7elhuyJ.js.map} +1 -1
- package/dist/{dist-By5URG0Y.js → dist-BX0OVIm7.js} +2 -2
- package/dist/{dist-By5URG0Y.js.map → dist-BX0OVIm7.js.map} +1 -1
- package/dist/{dist-D7kJgnSE.js → dist-TAGYwaju.js} +1 -1
- package/dist/{dist-D7kJgnSE.js.map → dist-TAGYwaju.js.map} +1 -1
- package/dist/editable-label.d.ts +6 -1
- package/dist/editable-label.d.ts.map +1 -1
- package/dist/editable-label.js +51 -4
- package/dist/editable-label.js.map +1 -1
- package/dist/{hex-editor-Wd6ZtZA2.js → hex-editor-CsN_ySkH.js} +87 -87
- package/dist/hex-editor-CsN_ySkH.js.map +1 -0
- package/dist/{hex-editor-Gib1Grg2.d.ts → hex-editor-DlfoA65y.d.ts} +7 -8
- package/dist/hex-editor-DlfoA65y.d.ts.map +1 -0
- package/dist/hex.d.ts +1 -1
- package/dist/hex.js +1 -1
- package/dist/{highlight-CAjwQ4GE.js → highlight-TPbSHruI.js} +3 -3
- package/dist/highlight-TPbSHruI.js.map +1 -0
- package/dist/{icon-BR5aTIiP.js → icon-9NWTXtE1.js} +6 -7
- package/dist/icon-9NWTXtE1.js.map +1 -0
- package/dist/{icon-DQKdfR7U.d.ts → icon-CeTDJhC7.d.ts} +3 -4
- package/dist/icon-CeTDJhC7.d.ts.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +3 -3
- package/dist/icons.js.map +1 -1
- package/dist/{incr-search-BjCNClnC.js → incr-search-DSKKsk6w.js} +119 -117
- package/dist/incr-search-DSKKsk6w.js.map +1 -0
- package/dist/incr-search.d.ts +2 -2
- package/dist/incr-search.js +2 -2
- package/dist/{index-CPVcTTXo.d.ts → index--hrxPBkQ.d.ts} +73 -74
- package/dist/index--hrxPBkQ.d.ts.map +1 -0
- package/dist/index-B1hNR7Z9.d.ts.map +1 -1
- package/dist/{index-CpbBI3n7.d.ts → index-CnL9krsH.d.ts} +3 -4
- package/dist/index-CnL9krsH.d.ts.map +1 -0
- package/dist/{index-CQxanqXF.d.ts → index-DSlPeWLK.d.ts} +28 -29
- package/dist/index-DSlPeWLK.d.ts.map +1 -0
- package/dist/{index-C5dK8RZa.d.ts → index-DrQjA8Gs.d.ts} +3 -4
- package/dist/index-DrQjA8Gs.d.ts.map +1 -0
- package/dist/{index-C9iBN908.d.ts → index-hXFn14tM.d.ts} +32 -32
- package/dist/index-hXFn14tM.d.ts.map +1 -0
- package/dist/index.d.ts +246 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1464 -32
- package/dist/index.js.map +1 -1
- package/dist/keyboard-De_vOHLg.js.map +1 -1
- package/dist/{labelled-input-base-DS6-6C0r.js → labelled-input-base-CqPL5rKm.js} +2 -2
- package/dist/labelled-input-base-CqPL5rKm.js.map +1 -0
- package/dist/{labelled-input-base-DnRh4reU.d.ts → labelled-input-base-D-Y7agky.d.ts} +2 -3
- package/dist/labelled-input-base-D-Y7agky.d.ts.map +1 -0
- 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 +5 -5
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +4 -4
- package/dist/labelled-range-input.js.map +1 -1
- package/dist/led.d.ts +2 -3
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +3 -3
- package/dist/led.js.map +1 -1
- package/dist/{menu-BV6UFx_z.js → menu-DJJuCm-5.js} +55 -55
- package/dist/menu-DJJuCm-5.js.map +1 -0
- package/dist/{menu-item-DEzL_Yjk.js → menu-item-CKRfP0pN.js} +14 -14
- package/dist/menu-item-CKRfP0pN.js.map +1 -0
- package/dist/{menu-item-Cikacp4F.d.ts → menu-item-ClQF2DKN.d.ts} +7 -8
- package/dist/menu-item-ClQF2DKN.d.ts.map +1 -0
- package/dist/menu.d.ts +3 -3
- package/dist/menu.js +2 -2
- package/dist/miller.d.ts +7 -10
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +17 -17
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.d.ts +2 -3
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +6 -6
- package/dist/narrowed-text.js.map +1 -1
- package/dist/panel.d.ts +2 -3
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +4 -4
- 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 +3 -3
- package/dist/polar-pad.js.map +1 -1
- package/dist/{popup-Ddx9LCzY.js → popup-ImtS9KnS.js} +1 -1
- package/dist/{popup-Ddx9LCzY.js.map → popup-ImtS9KnS.js.map} +1 -1
- package/dist/{prominence-CreDBdCs.js → prominence--ic9uWBl.js} +1 -1
- package/dist/{prominence-CreDBdCs.js.map → prominence--ic9uWBl.js.map} +1 -1
- package/dist/{radial-input-CNJ8asY2.js → radial-input-DZA6WaFu.js} +16 -16
- package/dist/radial-input-DZA6WaFu.js.map +1 -0
- package/dist/{radial-input-xSTd4kEz.d.ts → radial-input-LUSBEycd.d.ts} +2 -3
- package/dist/radial-input-LUSBEycd.d.ts.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 +3 -3
- 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 +4 -4
- package/dist/range.js.map +1 -1
- package/dist/{registry-CZEB1YI9.js → registry-Q2gYQCHM.js} +1 -1
- package/dist/{registry-CZEB1YI9.js.map → registry-Q2gYQCHM.js.map} +1 -1
- package/dist/selecthorizontal.d.ts +2 -3
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +3 -3
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/snap-container.d.ts +1 -2
- package/dist/snap-container.d.ts.map +1 -1
- package/dist/snap-container.js +3 -3
- package/dist/snap-container.js.map +1 -1
- package/dist/split-layout.d.ts +2 -3
- package/dist/split-layout.d.ts.map +1 -1
- package/dist/split-layout.js +6 -6
- 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 -4
- package/dist/swipe.js.map +1 -1
- package/dist/{tab-list-CFF7uSYH.d.ts → tab-list-BnqISNvO.d.ts} +5 -6
- package/dist/tab-list-BnqISNvO.d.ts.map +1 -0
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +4 -4
- package/dist/tabs.js.map +1 -1
- package/dist/tickled-controller-Cq1Va0rR.d.ts.map +1 -1
- package/dist/tickled-styles-Bg3QbcrD.js.map +1 -1
- package/dist/{timeline-DBWJsSjd.js → timeline-Cv75Th2U.js} +123 -119
- package/dist/timeline-Cv75Th2U.js.map +1 -0
- package/dist/timeline.d.ts +2 -2
- package/dist/timeline.js +1 -1
- package/dist/{tooltip-kfUBWYVB.d.ts → tooltip-CwGfb4lp.d.ts} +2 -3
- package/dist/tooltip-CwGfb4lp.d.ts.map +1 -0
- package/dist/tree-CvvKbO-f.js +1330 -0
- package/dist/tree-CvvKbO-f.js.map +1 -0
- package/dist/{tree-component-CQpoPo4s.d.ts → tree-component-D8Bg48tt.d.ts} +12 -12
- package/dist/tree-component-D8Bg48tt.d.ts.map +1 -0
- package/dist/tree.d.ts +4 -5
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1143
- package/dist/types-BKaqnpwx.d.ts.map +1 -1
- package/dist/{xy-axis-CIFok7MF.d.ts → xy-axis-D9uwpGTT.d.ts} +5 -6
- package/dist/xy-axis-D9uwpGTT.d.ts.map +1 -0
- package/dist/{xy-axis-BANbgrI5.js → xy-axis-DL0tfJDr.js} +13 -13
- package/dist/xy-axis-DL0tfJDr.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 +4 -4
- package/dist/xy-pad.js.map +1 -1
- package/package.json +17 -13
- package/dist/button-DgKUzE5o.js.map +0 -1
- package/dist/colour-picker-Bw-AZoWx.js.map +0 -1
- package/dist/decorate-BZbkqIhA.js +0 -9
- package/dist/hex-editor-Gib1Grg2.d.ts.map +0 -1
- package/dist/hex-editor-Wd6ZtZA2.js.map +0 -1
- package/dist/highlight-CAjwQ4GE.js.map +0 -1
- package/dist/icon-BR5aTIiP.js.map +0 -1
- package/dist/icon-DQKdfR7U.d.ts.map +0 -1
- package/dist/incr-search-BjCNClnC.js.map +0 -1
- package/dist/index-C5dK8RZa.d.ts.map +0 -1
- package/dist/index-C9iBN908.d.ts.map +0 -1
- package/dist/index-CPVcTTXo.d.ts.map +0 -1
- package/dist/index-CQxanqXF.d.ts.map +0 -1
- package/dist/index-CpbBI3n7.d.ts.map +0 -1
- package/dist/labelled-input-base-DS6-6C0r.js.map +0 -1
- package/dist/labelled-input-base-DnRh4reU.d.ts.map +0 -1
- package/dist/menu-BV6UFx_z.js.map +0 -1
- package/dist/menu-item-Cikacp4F.d.ts.map +0 -1
- package/dist/menu-item-DEzL_Yjk.js.map +0 -1
- package/dist/radial-input-CNJ8asY2.js.map +0 -1
- package/dist/radial-input-xSTd4kEz.d.ts.map +0 -1
- package/dist/tab-list-CFF7uSYH.d.ts.map +0 -1
- package/dist/timeline-DBWJsSjd.js.map +0 -1
- package/dist/tooltip-kfUBWYVB.d.ts.map +0 -1
- package/dist/tree-component-CQpoPo4s.d.ts.map +0 -1
- package/dist/tree-data-model-DGvRVOFY.js +0 -190
- package/dist/tree-data-model-DGvRVOFY.js.map +0 -1
- package/dist/tree.js.map +0 -1
- package/dist/xy-axis-BANbgrI5.js.map +0 -1
- package/dist/xy-axis-CIFok7MF.d.ts.map +0 -1
- /package/dist/{interaction-CQDQJf2Q.js → interaction-DG7X1rhI.js} +0 -0
package/dist/xy-pad.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import * as _$lit from "lit";
|
|
2
1
|
import { LitElement, PropertyValues, html } from "lit";
|
|
3
2
|
|
|
4
3
|
//#region src/xy-pad.d.ts
|
|
5
4
|
declare class XyPad extends LitElement {
|
|
6
|
-
static styles:
|
|
5
|
+
static styles: import("lit").CSSResult[];
|
|
7
6
|
xMin: number;
|
|
8
7
|
xMax: number;
|
|
9
8
|
x: number;
|
package/dist/xy-pad.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xy-pad.d.ts","names":[],"sources":["../src/xy-pad.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"xy-pad.d.ts","names":[],"sources":["../src/xy-pad.ts"],"mappings":";;;cAwEa,KAAA,SAAc,UAAA;EAAA,OACT,MAAA,gBAAM,SAAA;EAoHM,IAAA;EACA,IAAA;EACA,CAAA;EAEA,IAAA;EACA,IAAA;EACA,CAAA;EAEA,MAAA;EACA,MAAA;EAC0B,SAAA;EACA,SAAA;EAE1B,MAAA;EACA,MAAA;EAE8C,cAAA;EACN,QAAA;EACE,UAAA;EAC1B,QAAA;EAsOlC;EAnOkB,KAAA;;EAGsB,MAAA;EAkOxC;EA/NwC,MAAA;EAAA,QAE1C,SAAA;EAAA,QACA,WAAA;EAAA,QACA,WAAA;EAAA,QACA,YAAA;EAAA,QAEA,UAAA;EAAA,QAuBA,QAAA;EAAA,QAIA,mBAAA;EAAA,QA2CA,cAAA;EAAA,QAeA,cAAA;EAAA,QAOA,YAAA;EAAA,QAeA,kBAAA;EAAA,QA+BA,WAAA;EAqFc;;AAAA;EAjEtB,YAAA,CAAA;EAqE4B;;;EA7D5B,YAAA,CAAA;EA8DO;;;;AACgB;EArDvB,QAAA,CAAA;IAAc,MAAA;IAAgB,KAAA;EAAA;EAUrB,OAAA,CAAQ,QAAA,EAAU,cAAA;EAKlB,oBAAA,CAAA;EAMA,MAAA,CAAA,GAAU,UAAA,QAAkB,IAAA;AAAA;AAAA,KAiB3B,gBAAA;EAAA,SACD,CAAA;EAAA,SACA,CAAC;AAAA;AAAA,KAGA,eAAA,GAAkB,WAAW,CAAC,gBAAA;AAAA,QAElC,MAAA;EAAA,UACI,qBAAA;IACR,aAAA,EAAe,KAAK;EAAA;AAAA;AAAA,UAIP,aAAA;EACf,KAAA,EAAO,eAAA;EACP,MAAA,EAAQ,eAAe;AAAA;AAAA,UAGR,KAAA;EACf,gBAAA,oBAAoC,aAAA,EAClC,IAAA,EAAM,CAAA,EACN,QAAA,GAAW,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,aAAA,CAAc,CAAA,YAC7C,OAAA,aAAoB,uBAAA,eAEpB,IAAA,UACA,QAAA,EAAU,kCAAA,EACV,OAAA,aAAoB,uBAAA;AAAA"}
|
package/dist/xy-pad.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as __decorate } from "./decorate-
|
|
2
|
-
import { t as prominenceStyles } from "./prominence
|
|
1
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-D7rC1gLP.js";
|
|
2
|
+
import { t as prominenceStyles } from "./prominence--ic9uWBl.js";
|
|
3
3
|
import { t as resolveStep } from "./keyboard-De_vOHLg.js";
|
|
4
4
|
import { LitElement, css, html } from "lit";
|
|
5
|
-
import {
|
|
5
|
+
import { property } from "lit/decorators.js";
|
|
6
6
|
//#region src/xy-pad.ts
|
|
7
7
|
/**
|
|
8
8
|
* <x-xy-pad> — 2D touch-friendly XY pad for controlling two parameters.
|
|
@@ -428,7 +428,7 @@ __decorate([property({
|
|
|
428
428
|
type: Number,
|
|
429
429
|
attribute: `stops-y`
|
|
430
430
|
})], XyPad.prototype, "stopsY", void 0);
|
|
431
|
-
XyPad = __decorate([
|
|
431
|
+
XyPad = __decorate([safeCustomElement(`ixfx-xy-pad`)], XyPad);
|
|
432
432
|
//#endregion
|
|
433
433
|
export { XyPad };
|
|
434
434
|
|
package/dist/xy-pad.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xy-pad.js","names":[],"sources":["../src/xy-pad.ts"],"sourcesContent":["import type { PropertyValues } from 'lit';\n/**\n * <x-xy-pad> — 2D touch-friendly XY pad for controlling two parameters.\n *\n * Generic pad that accepts min/max/value for both axes with configurable labels.\n * Each axis can independently use logarithmic or linear scaling.\n * Y axis is inverted (top = high value).\n *\n * Properties\n * xMin, xMax, x – horizontal range and current value\n * yMin, yMax, y – vertical range and current value\n * xScale, yScale – 'log' (default) or 'linear'\n * xSnapStep, ySnapStep – snap granularity for pointer and keyboard moves (defaults: 1 / 0.01)\n * xLabel, yLabel – axis labels (displayed in corners)\n * showCrosshairs – show X/Y axis lines (default: false)\n * showGrid – show background grid (default: false)\n *\n * CSS variables:\n * --marker-size – size of the position marker (default: 10cqb)\n * --crosshair-color – colour of both crosshair lines (default: surface-hh)\n * --crosshair-width – thickness of both crosshair lines (default: 2px)\n * --crosshair-x-color – colour of the vertical (X) crosshair line; falls back to --crosshair-color\n * --crosshair-x-width – thickness of the vertical (X) crosshair line; falls back to --crosshair-width\n * --crosshair-y-color – colour of the horizontal (Y) crosshair line; falls back to --crosshair-color\n * --crosshair-y-width – thickness of the horizontal (Y) crosshair line; falls back to --crosshair-width\n * --grid-color – colour of grid lines (default: surface-hh)\n * --grid-width – thickness of grid lines (default: 1px)\n * --x-pct – current X position as unitless number (0–100), set on host so external styles can use it\n * --y-pct – current Y position as unitless number (0–100), set on host so external styles can use it\n * --radius-pct – distance from center as unitless number (0–100), set on host so external styles can use it\n * hide-cursor – boolean, hide cursor during drag and hover (default: false)\n *\n * Events\n * input – CustomEvent { detail: { x: number, y: number } }, bubbles + composed, fires continuously during drag\n * change – CustomEvent { detail: { x: number, y: number } }, bubbles + composed, fires when drag ends\n *\n * Methods\n * getRelativeX() – returns X position as 0–1 fraction\n * getRelativeY() – returns Y position as 0–1 fraction\n * getPolar() – returns { radius: number, angle: number } where radius is 0–1 and angle is in radians (0 to 2π, 0 = right, clockwise)\n */\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { KEY_STEP_DIVISOR, resolveStep } from './keyboard.js';\nimport { prominenceStyles } from './styles/prominence.js';\n\n// ---------------------------------------------------------------------------\n// Scale helpers — log or linear, selected per-axis\n// ---------------------------------------------------------------------------\n\nfunction valueToFrac(value: number, min: number, max: number, scale: string): number {\n if (scale === `linear`)\n return (value - min) / (max - min);\n return Math.log(value / min) / Math.log(max / min);\n}\n\nfunction fracToValue(frac: number, min: number, max: number, scale: string): number {\n if (scale === `linear`)\n return min + frac * (max - min);\n return min * (max / min) ** frac;\n}\n\nfunction quantise(value: number, min: number, max: number, stops?: number): number {\n if (!stops || stops <= 1)\n return value;\n const range = max - min;\n const step = range / stops;\n return Math.round((value - min) / step) * step + min;\n}\n\n@customElement(`ixfx-xy-pad`)\nexport class XyPad extends LitElement {\n static override styles = [prominenceStyles, css`\n :host {\n display: block;\n width: 200px;\n height: 200px;\n touch-action: none;\n user-select: none;\n container-type: size;\n --marker-size: 10cqb;\n --crosshair-color: var(--surface-6);\n --crosshair-width: 2px;\n --crosshair-x-color: var(--crosshair-color);\n --crosshair-x-width: var(--crosshair-width);\n --crosshair-y-color: var(--crosshair-color);\n --crosshair-y-width: var(--crosshair-width);\n --grid-color: var(--surface-6);\n --grid-width: 1px;\n --_space-s: var(--space-s, 4px);\n --_space-m: var(--space-m, 8px);\n }\n .xy-pad-area {\n position: relative;\n width: 100%;\n height: 100%;\n background: var(--xy-pad-bg, var(--surface-3));\n border: var(--border);\n border-radius: var(--radius-m);\n overflow: hidden;\n box-shadow: var(--deboss-3);\n cursor: var(--cursor-display, crosshair);\n }\n :host([dragging]) .xy-pad-area {\n cursor: none;\n }\n\n .xy-pad-area:focus {\n outline: none;\n }\n\n .xy-pad-area:focus-visible {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n .xy-pad-area::before,\n .xy-pad-area::after {\n content: '';\n position: absolute;\n pointer-events: none;\n opacity: var(--show-crosshairs, 0);\n }\n :host([show-crosshairs]) {\n --show-crosshairs: 1;\n }\n .xy-pad-area::before {\n left: 0;\n right: 0;\n top: calc(100% - var(--y-pct, 50) * 1%);\n height: var(--crosshair-y-width);\n background: var(--crosshair-y-color);\n }\n .xy-pad-area::after {\n top: 0;\n bottom: 0;\n left: calc(var(--x-pct, 50) * 1%);\n width: var(--crosshair-x-width);\n background: var(--crosshair-x-color);\n }\n\n .xy-pad-grid {\n position: absolute;\n inset: 0;\n background-image:\n linear-gradient(to right, var(--grid-color) var(--grid-width), transparent var(--grid-width)),\n linear-gradient(to bottom, var(--grid-color) var(--grid-width), transparent var(--grid-width));\n background-size: 10cqb 10cqb;\n pointer-events: none;\n opacity: var(--show-grid, 0);\n }\n :host([show-grid]) {\n --show-grid: 1;\n }\n \n .xy-pad-marker {\n position: absolute;\n width: var(--marker-size, 10cqb);\n height: var(--marker-size, 10cqb);\n border-radius: 50%;\n background: var(--surface-2-accent, var(--accent));\n top: calc(100% - var(--y-pct, 50) * 1%);\n left: calc(var(--x-pct, 50) * 1%);\n transform: translate(-50%, -50%);\n pointer-events: none;\n z-index: 2;\n }\n .xy-pad-label-x {\n position: absolute;\n bottom: var(--_space-s);\n color: var(--surface-muted-text);\n font-size: var(--text-s, 12px);\n pointer-events: none;\n width: 100%;\n text-align: center;\n }\n .xy-pad-label-y {\n position: absolute;\n top: var(--_space-s);\n left: var(--_space-m);\n color: var(--surface-muted-text);\n font-size: var(--text-s, 12px);\n pointer-events: none;\n writing-mode: sideways-lr;\n height:100%;\n text-align:center;\n }\n `];\n\n @property({ type: Number }) xMin = 1;\n @property({ type: Number }) xMax = 100;\n @property({ type: Number }) x = 50;\n\n @property({ type: Number }) yMin = 1;\n @property({ type: Number }) yMax = 100;\n @property({ type: Number }) y = 50;\n\n @property({ type: String }) xScale = `linear`;\n @property({ type: String }) yScale = `linear`;\n @property({ type: Number, attribute: `x-snap-step` }) xSnapStep?: number;\n @property({ type: Number, attribute: `y-snap-step` }) ySnapStep?: number;\n\n @property({ type: String }) xLabel = `X`;\n @property({ type: String }) yLabel = `Y`;\n\n @property({ type: Boolean, reflect: true, attribute: `show-crosshairs` }) showCrosshairs = false;\n @property({ type: Boolean, reflect: true, attribute: `show-grid` }) showGrid = false;\n @property({ type: Boolean, reflect: true, attribute: `hide-cursor` }) hideCursor = false;\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** Number of quantised stops for both axes. Overridden by stops-x/stops-y if set. */\n @property({ type: Number }) stops?: number;\n\n /** Number of quantised stops for X axis. If set, overrides the stops setting for X. */\n @property({ type: Number, attribute: `stops-x` }) stopsX?: number;\n\n /** Number of quantised stops for Y axis. If set, overrides the stops setting for Y. */\n @property({ type: Number, attribute: `stops-y` }) stopsY?: number;\n\n private _dragging = false;\n private _dragStartX = 0;\n private _dragStartY = 0;\n private _pressedKeys = new Set<string>();\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this.disabled)\n return;\n if ([`ArrowLeft`, `ArrowRight`, `ArrowUp`, `ArrowDown`].includes(e.key)) {\n e.preventDefault();\n this._pressedKeys.add(e.key);\n this._handleKeyboardMove(e.shiftKey);\n } else if (e.key === `Home` || e.key === `End`) {\n e.preventDefault();\n const newX = e.key === `Home` ? this.xMin : this.xMax;\n const newY = e.key === `Home` ? this.yMin : this.yMax;\n if (newX !== this.x || newY !== this.y) {\n this.x = newX;\n this.y = newY;\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`input`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n }\n };\n\n private _onKeyUp = (e: KeyboardEvent): void => {\n this._pressedKeys.delete(e.key);\n };\n\n private _handleKeyboardMove = (shiftKey: boolean): void => {\n const shiftDivisor = shiftKey ? KEY_STEP_DIVISOR : 1;\n const xRange = this.xMax - this.xMin;\n const yRange = this.yMax - this.yMin;\n const effectiveStopsX = this.stopsX ?? this.stops;\n const effectiveStopsY = this.stopsY ?? this.stops;\n\n const xStep = resolveStep(xRange, effectiveStopsX, undefined) / shiftDivisor;\n const yStep = resolveStep(yRange, effectiveStopsY, undefined) / shiftDivisor;\n\n let newX = this.x;\n let newY = this.y;\n\n if (this._pressedKeys.has(`ArrowLeft`)) {\n newX = Math.max(this.xMin, this.x - xStep);\n }\n if (this._pressedKeys.has(`ArrowRight`)) {\n newX = Math.min(this.xMax, this.x + xStep);\n }\n if (this._pressedKeys.has(`ArrowUp`)) {\n newY = Math.min(this.yMax, this.y + yStep);\n }\n if (this._pressedKeys.has(`ArrowDown`)) {\n newY = Math.max(this.yMin, this.y - yStep);\n }\n\n if (newX !== this.x || newY !== this.y) {\n let finalX = (this.xSnapStep && this.xSnapStep > 0) ? Math.round(newX / this.xSnapStep) * this.xSnapStep : newX;\n let finalY = (this.ySnapStep && this.ySnapStep > 0) ? Math.round(newY / this.ySnapStep) * this.ySnapStep : newY;\n\n finalX = quantise(finalX, this.xMin, this.xMax, effectiveStopsX);\n finalY = quantise(finalY, this.yMin, this.yMax, effectiveStopsY);\n\n this.x = finalX;\n this.y = finalY;\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`input`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n private _onPointerDown = (e: PointerEvent): void => {\n e.preventDefault();\n const pad = this.renderRoot.querySelector(`.xy-pad-area`) as HTMLElement | undefined;\n pad?.focus();\n if (pad)\n pad.setPointerCapture(e.pointerId);\n this._dragging = true;\n this._dragStartX = this.x;\n this._dragStartY = this.y;\n this.setAttribute(`dragging`, ``);\n this._updateFromPointer(e);\n globalThis.addEventListener(`pointermove`, this._onPointerMove);\n globalThis.addEventListener(`pointerup`, this._onPointerUp);\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._dragging)\n return;\n e.preventDefault();\n this._updateFromPointer(e);\n };\n\n private _onPointerUp = (): void => {\n const hasChanged = this.x !== this._dragStartX || this.y !== this._dragStartY;\n this._dragging = false;\n this.removeAttribute(`dragging`);\n globalThis.removeEventListener(`pointermove`, this._onPointerMove);\n globalThis.removeEventListener(`pointerup`, this._onPointerUp);\n if (hasChanged) {\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`change`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n private _updateFromPointer(e: PointerEvent): void {\n const pad = this.renderRoot.querySelector(`.xy-pad-area`);\n if (!pad)\n return;\n\n const rect = pad.getBoundingClientRect();\n const xFrac = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const yFrac = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height));\n\n const newX = fracToValue(xFrac, this.xMin, this.xMax, this.xScale);\n const newY = fracToValue(yFrac, this.yMin, this.yMax, this.yScale);\n\n let finalX = (this.xSnapStep && this.xSnapStep > 0) ? Math.round(newX / this.xSnapStep) * this.xSnapStep : newX;\n let finalY = (this.ySnapStep && this.ySnapStep > 0) ? Math.round(newY / this.ySnapStep) * this.ySnapStep : newY;\n\n const effectiveStopsX = this.stopsX ?? this.stops;\n const effectiveStopsY = this.stopsY ?? this.stops;\n\n finalX = quantise(finalX, this.xMin, this.xMax, effectiveStopsX);\n finalY = quantise(finalY, this.yMin, this.yMax, effectiveStopsY);\n\n this.x = finalX;\n this.y = finalY;\n\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`input`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _setPctVars(): void {\n const cx = Math.max(this.xMin, Math.min(this.xMax, this.x));\n const cy = Math.max(this.yMin, Math.min(this.yMax, this.y));\n const xPct = valueToFrac(cx, this.xMin, this.xMax, this.xScale) * 100;\n const yPct = valueToFrac(cy, this.yMin, this.yMax, this.yScale) * 100;\n this.style.setProperty(`--x-pct`, `${xPct}`);\n this.style.setProperty(`--y-pct`, `${yPct}`);\n\n // Calculate radius from center (50, 50) - distance as 0-100\n const dx = xPct - 50;\n const dy = yPct - 50;\n const radiusPct = Math.sqrt(dx * dx + dy * dy);\n this.style.setProperty(`--radius-pct`, `${radiusPct}`);\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Returns X position as a 0–1 fraction.\n */\n getRelativeX(): number {\n const cx = Math.max(this.xMin, Math.min(this.xMax, this.x));\n return valueToFrac(cx, this.xMin, this.xMax, this.xScale);\n }\n\n /**\n * Returns Y position as a 0–1 fraction.\n */\n getRelativeY(): number {\n const cy = Math.max(this.yMin, Math.min(this.yMax, this.y));\n return valueToFrac(cy, this.yMin, this.yMax, this.yScale);\n }\n\n /**\n * Returns polar coordinates.\n * - radius: 0–1 distance from center\n * - angle: radians, 0 = right, clockwise (0 to 2π)\n */\n getPolar(): { radius: number; angle: number } {\n const xRel = this.getRelativeX() - 0.5; // -0.5 to 0.5\n const yRel = this.getRelativeY() - 0.5; // -0.5 to 0.5\n const radius = Math.sqrt(xRel * xRel + yRel * yRel) * 2; // 0 to 1\n let angle = Math.atan2(yRel, xRel); // -π to π\n if (angle < 0)\n angle += 2 * Math.PI; // 0 to 2π\n return { radius, angle };\n }\n\n override updated(_changed: PropertyValues): void {\n super.updated(_changed);\n this._setPctVars();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._onPointerUp();\n this._pressedKeys.clear();\n }\n\n override render(): ReturnType<typeof html> {\n return html`\n <div class=\"xy-pad-area\"\n tabindex=${this.disabled ? -1 : 0}\n @pointerdown=${this._onPointerDown}\n @keydown=${this._onKeyDown}\n @keyup=${this._onKeyUp}\n @blur=${() => this._pressedKeys.clear()}>\n ${this.showGrid ? html`<div class=\"xy-pad-grid\"></div>` : ``}\n <div class=\"xy-pad-marker\"></div>\n <div class=\"xy-pad-label-x\">${this.xLabel}</div>\n <div class=\"xy-pad-label-y\">${this.yLabel}</div>\n </div>\n `;\n }\n}\n\nexport type XyPadInputDetail = {\n readonly x: number;\n readonly y: number;\n};\n\nexport type XyPadInputEvent = CustomEvent<XyPadInputDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-xy-pad': XyPad;\n }\n}\n\nexport interface XyPadEventMap {\n input: XyPadInputEvent;\n change: XyPadInputEvent;\n}\n\nexport interface XyPad {\n addEventListener: (<K extends keyof XyPadEventMap>(\n type: K,\n listener: (this: XyPad, event: XyPadEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"xy-pad.js","names":["customElement"],"sources":["../src/xy-pad.ts"],"sourcesContent":["import type { PropertyValues } from 'lit';\n/**\n * <x-xy-pad> — 2D touch-friendly XY pad for controlling two parameters.\n *\n * Generic pad that accepts min/max/value for both axes with configurable labels.\n * Each axis can independently use logarithmic or linear scaling.\n * Y axis is inverted (top = high value).\n *\n * Properties\n * xMin, xMax, x – horizontal range and current value\n * yMin, yMax, y – vertical range and current value\n * xScale, yScale – 'log' (default) or 'linear'\n * xSnapStep, ySnapStep – snap granularity for pointer and keyboard moves (defaults: 1 / 0.01)\n * xLabel, yLabel – axis labels (displayed in corners)\n * showCrosshairs – show X/Y axis lines (default: false)\n * showGrid – show background grid (default: false)\n *\n * CSS variables:\n * --marker-size – size of the position marker (default: 10cqb)\n * --crosshair-color – colour of both crosshair lines (default: surface-hh)\n * --crosshair-width – thickness of both crosshair lines (default: 2px)\n * --crosshair-x-color – colour of the vertical (X) crosshair line; falls back to --crosshair-color\n * --crosshair-x-width – thickness of the vertical (X) crosshair line; falls back to --crosshair-width\n * --crosshair-y-color – colour of the horizontal (Y) crosshair line; falls back to --crosshair-color\n * --crosshair-y-width – thickness of the horizontal (Y) crosshair line; falls back to --crosshair-width\n * --grid-color – colour of grid lines (default: surface-hh)\n * --grid-width – thickness of grid lines (default: 1px)\n * --x-pct – current X position as unitless number (0–100), set on host so external styles can use it\n * --y-pct – current Y position as unitless number (0–100), set on host so external styles can use it\n * --radius-pct – distance from center as unitless number (0–100), set on host so external styles can use it\n * hide-cursor – boolean, hide cursor during drag and hover (default: false)\n *\n * Events\n * input – CustomEvent { detail: { x: number, y: number } }, bubbles + composed, fires continuously during drag\n * change – CustomEvent { detail: { x: number, y: number } }, bubbles + composed, fires when drag ends\n *\n * Methods\n * getRelativeX() – returns X position as 0–1 fraction\n * getRelativeY() – returns Y position as 0–1 fraction\n * getPolar() – returns { radius: number, angle: number } where radius is 0–1 and angle is in radians (0 to 2π, 0 = right, clockwise)\n */\nimport { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { KEY_STEP_DIVISOR, resolveStep } from './keyboard.js';\nimport { prominenceStyles } from './styles/prominence.js';\nimport { safeCustomElement as customElement } from './util/custom-elements.js';\n\n// ---------------------------------------------------------------------------\n// Scale helpers — log or linear, selected per-axis\n// ---------------------------------------------------------------------------\n\nfunction valueToFrac(value: number, min: number, max: number, scale: string): number {\n if (scale === `linear`)\n return (value - min) / (max - min);\n return Math.log(value / min) / Math.log(max / min);\n}\n\nfunction fracToValue(frac: number, min: number, max: number, scale: string): number {\n if (scale === `linear`)\n return min + frac * (max - min);\n return min * (max / min) ** frac;\n}\n\nfunction quantise(value: number, min: number, max: number, stops?: number): number {\n if (!stops || stops <= 1)\n return value;\n const range = max - min;\n const step = range / stops;\n return Math.round((value - min) / step) * step + min;\n}\n\n@customElement(`ixfx-xy-pad`)\nexport class XyPad extends LitElement {\n static override styles = [prominenceStyles, css`\n :host {\n display: block;\n width: 200px;\n height: 200px;\n touch-action: none;\n user-select: none;\n container-type: size;\n --marker-size: 10cqb;\n --crosshair-color: var(--surface-6);\n --crosshair-width: 2px;\n --crosshair-x-color: var(--crosshair-color);\n --crosshair-x-width: var(--crosshair-width);\n --crosshair-y-color: var(--crosshair-color);\n --crosshair-y-width: var(--crosshair-width);\n --grid-color: var(--surface-6);\n --grid-width: 1px;\n --_space-s: var(--space-s, 4px);\n --_space-m: var(--space-m, 8px);\n }\n .xy-pad-area {\n position: relative;\n width: 100%;\n height: 100%;\n background: var(--xy-pad-bg, var(--surface-3));\n border: var(--border);\n border-radius: var(--radius-m);\n overflow: hidden;\n box-shadow: var(--deboss-3);\n cursor: var(--cursor-display, crosshair);\n }\n :host([dragging]) .xy-pad-area {\n cursor: none;\n }\n\n .xy-pad-area:focus {\n outline: none;\n }\n\n .xy-pad-area:focus-visible {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n .xy-pad-area::before,\n .xy-pad-area::after {\n content: '';\n position: absolute;\n pointer-events: none;\n opacity: var(--show-crosshairs, 0);\n }\n :host([show-crosshairs]) {\n --show-crosshairs: 1;\n }\n .xy-pad-area::before {\n left: 0;\n right: 0;\n top: calc(100% - var(--y-pct, 50) * 1%);\n height: var(--crosshair-y-width);\n background: var(--crosshair-y-color);\n }\n .xy-pad-area::after {\n top: 0;\n bottom: 0;\n left: calc(var(--x-pct, 50) * 1%);\n width: var(--crosshair-x-width);\n background: var(--crosshair-x-color);\n }\n\n .xy-pad-grid {\n position: absolute;\n inset: 0;\n background-image:\n linear-gradient(to right, var(--grid-color) var(--grid-width), transparent var(--grid-width)),\n linear-gradient(to bottom, var(--grid-color) var(--grid-width), transparent var(--grid-width));\n background-size: 10cqb 10cqb;\n pointer-events: none;\n opacity: var(--show-grid, 0);\n }\n :host([show-grid]) {\n --show-grid: 1;\n }\n \n .xy-pad-marker {\n position: absolute;\n width: var(--marker-size, 10cqb);\n height: var(--marker-size, 10cqb);\n border-radius: 50%;\n background: var(--surface-2-accent, var(--accent));\n top: calc(100% - var(--y-pct, 50) * 1%);\n left: calc(var(--x-pct, 50) * 1%);\n transform: translate(-50%, -50%);\n pointer-events: none;\n z-index: 2;\n }\n .xy-pad-label-x {\n position: absolute;\n bottom: var(--_space-s);\n color: var(--surface-muted-text);\n font-size: var(--text-s, 12px);\n pointer-events: none;\n width: 100%;\n text-align: center;\n }\n .xy-pad-label-y {\n position: absolute;\n top: var(--_space-s);\n left: var(--_space-m);\n color: var(--surface-muted-text);\n font-size: var(--text-s, 12px);\n pointer-events: none;\n writing-mode: sideways-lr;\n height:100%;\n text-align:center;\n }\n `];\n\n @property({ type: Number }) xMin = 1;\n @property({ type: Number }) xMax = 100;\n @property({ type: Number }) x = 50;\n\n @property({ type: Number }) yMin = 1;\n @property({ type: Number }) yMax = 100;\n @property({ type: Number }) y = 50;\n\n @property({ type: String }) xScale = `linear`;\n @property({ type: String }) yScale = `linear`;\n @property({ type: Number, attribute: `x-snap-step` }) xSnapStep?: number;\n @property({ type: Number, attribute: `y-snap-step` }) ySnapStep?: number;\n\n @property({ type: String }) xLabel = `X`;\n @property({ type: String }) yLabel = `Y`;\n\n @property({ type: Boolean, reflect: true, attribute: `show-crosshairs` }) showCrosshairs = false;\n @property({ type: Boolean, reflect: true, attribute: `show-grid` }) showGrid = false;\n @property({ type: Boolean, reflect: true, attribute: `hide-cursor` }) hideCursor = false;\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** Number of quantised stops for both axes. Overridden by stops-x/stops-y if set. */\n @property({ type: Number }) stops?: number;\n\n /** Number of quantised stops for X axis. If set, overrides the stops setting for X. */\n @property({ type: Number, attribute: `stops-x` }) stopsX?: number;\n\n /** Number of quantised stops for Y axis. If set, overrides the stops setting for Y. */\n @property({ type: Number, attribute: `stops-y` }) stopsY?: number;\n\n private _dragging = false;\n private _dragStartX = 0;\n private _dragStartY = 0;\n private _pressedKeys = new Set<string>();\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (this.disabled)\n return;\n if ([`ArrowLeft`, `ArrowRight`, `ArrowUp`, `ArrowDown`].includes(e.key)) {\n e.preventDefault();\n this._pressedKeys.add(e.key);\n this._handleKeyboardMove(e.shiftKey);\n } else if (e.key === `Home` || e.key === `End`) {\n e.preventDefault();\n const newX = e.key === `Home` ? this.xMin : this.xMax;\n const newY = e.key === `Home` ? this.yMin : this.yMax;\n if (newX !== this.x || newY !== this.y) {\n this.x = newX;\n this.y = newY;\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`input`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n }\n };\n\n private _onKeyUp = (e: KeyboardEvent): void => {\n this._pressedKeys.delete(e.key);\n };\n\n private _handleKeyboardMove = (shiftKey: boolean): void => {\n const shiftDivisor = shiftKey ? KEY_STEP_DIVISOR : 1;\n const xRange = this.xMax - this.xMin;\n const yRange = this.yMax - this.yMin;\n const effectiveStopsX = this.stopsX ?? this.stops;\n const effectiveStopsY = this.stopsY ?? this.stops;\n\n const xStep = resolveStep(xRange, effectiveStopsX, undefined) / shiftDivisor;\n const yStep = resolveStep(yRange, effectiveStopsY, undefined) / shiftDivisor;\n\n let newX = this.x;\n let newY = this.y;\n\n if (this._pressedKeys.has(`ArrowLeft`)) {\n newX = Math.max(this.xMin, this.x - xStep);\n }\n if (this._pressedKeys.has(`ArrowRight`)) {\n newX = Math.min(this.xMax, this.x + xStep);\n }\n if (this._pressedKeys.has(`ArrowUp`)) {\n newY = Math.min(this.yMax, this.y + yStep);\n }\n if (this._pressedKeys.has(`ArrowDown`)) {\n newY = Math.max(this.yMin, this.y - yStep);\n }\n\n if (newX !== this.x || newY !== this.y) {\n let finalX = (this.xSnapStep && this.xSnapStep > 0) ? Math.round(newX / this.xSnapStep) * this.xSnapStep : newX;\n let finalY = (this.ySnapStep && this.ySnapStep > 0) ? Math.round(newY / this.ySnapStep) * this.ySnapStep : newY;\n\n finalX = quantise(finalX, this.xMin, this.xMax, effectiveStopsX);\n finalY = quantise(finalY, this.yMin, this.yMax, effectiveStopsY);\n\n this.x = finalX;\n this.y = finalY;\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`input`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n private _onPointerDown = (e: PointerEvent): void => {\n e.preventDefault();\n const pad = this.renderRoot.querySelector(`.xy-pad-area`) as HTMLElement | undefined;\n pad?.focus();\n if (pad)\n pad.setPointerCapture(e.pointerId);\n this._dragging = true;\n this._dragStartX = this.x;\n this._dragStartY = this.y;\n this.setAttribute(`dragging`, ``);\n this._updateFromPointer(e);\n globalThis.addEventListener(`pointermove`, this._onPointerMove);\n globalThis.addEventListener(`pointerup`, this._onPointerUp);\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._dragging)\n return;\n e.preventDefault();\n this._updateFromPointer(e);\n };\n\n private _onPointerUp = (): void => {\n const hasChanged = this.x !== this._dragStartX || this.y !== this._dragStartY;\n this._dragging = false;\n this.removeAttribute(`dragging`);\n globalThis.removeEventListener(`pointermove`, this._onPointerMove);\n globalThis.removeEventListener(`pointerup`, this._onPointerUp);\n if (hasChanged) {\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`change`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n private _updateFromPointer(e: PointerEvent): void {\n const pad = this.renderRoot.querySelector(`.xy-pad-area`);\n if (!pad)\n return;\n\n const rect = pad.getBoundingClientRect();\n const xFrac = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const yFrac = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height));\n\n const newX = fracToValue(xFrac, this.xMin, this.xMax, this.xScale);\n const newY = fracToValue(yFrac, this.yMin, this.yMax, this.yScale);\n\n let finalX = (this.xSnapStep && this.xSnapStep > 0) ? Math.round(newX / this.xSnapStep) * this.xSnapStep : newX;\n let finalY = (this.ySnapStep && this.ySnapStep > 0) ? Math.round(newY / this.ySnapStep) * this.ySnapStep : newY;\n\n const effectiveStopsX = this.stopsX ?? this.stops;\n const effectiveStopsY = this.stopsY ?? this.stops;\n\n finalX = quantise(finalX, this.xMin, this.xMax, effectiveStopsX);\n finalY = quantise(finalY, this.yMin, this.yMax, effectiveStopsY);\n\n this.x = finalX;\n this.y = finalY;\n\n this.dispatchEvent(new CustomEvent<XyPadInputDetail>(`input`, {\n detail: { x: this.x, y: this.y },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _setPctVars(): void {\n const cx = Math.max(this.xMin, Math.min(this.xMax, this.x));\n const cy = Math.max(this.yMin, Math.min(this.yMax, this.y));\n const xPct = valueToFrac(cx, this.xMin, this.xMax, this.xScale) * 100;\n const yPct = valueToFrac(cy, this.yMin, this.yMax, this.yScale) * 100;\n this.style.setProperty(`--x-pct`, `${xPct}`);\n this.style.setProperty(`--y-pct`, `${yPct}`);\n\n // Calculate radius from center (50, 50) - distance as 0-100\n const dx = xPct - 50;\n const dy = yPct - 50;\n const radiusPct = Math.sqrt(dx * dx + dy * dy);\n this.style.setProperty(`--radius-pct`, `${radiusPct}`);\n }\n\n // ── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Returns X position as a 0–1 fraction.\n */\n getRelativeX(): number {\n const cx = Math.max(this.xMin, Math.min(this.xMax, this.x));\n return valueToFrac(cx, this.xMin, this.xMax, this.xScale);\n }\n\n /**\n * Returns Y position as a 0–1 fraction.\n */\n getRelativeY(): number {\n const cy = Math.max(this.yMin, Math.min(this.yMax, this.y));\n return valueToFrac(cy, this.yMin, this.yMax, this.yScale);\n }\n\n /**\n * Returns polar coordinates.\n * - radius: 0–1 distance from center\n * - angle: radians, 0 = right, clockwise (0 to 2π)\n */\n getPolar(): { radius: number; angle: number } {\n const xRel = this.getRelativeX() - 0.5; // -0.5 to 0.5\n const yRel = this.getRelativeY() - 0.5; // -0.5 to 0.5\n const radius = Math.sqrt(xRel * xRel + yRel * yRel) * 2; // 0 to 1\n let angle = Math.atan2(yRel, xRel); // -π to π\n if (angle < 0)\n angle += 2 * Math.PI; // 0 to 2π\n return { radius, angle };\n }\n\n override updated(_changed: PropertyValues): void {\n super.updated(_changed);\n this._setPctVars();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._onPointerUp();\n this._pressedKeys.clear();\n }\n\n override render(): ReturnType<typeof html> {\n return html`\n <div class=\"xy-pad-area\"\n tabindex=${this.disabled ? -1 : 0}\n @pointerdown=${this._onPointerDown}\n @keydown=${this._onKeyDown}\n @keyup=${this._onKeyUp}\n @blur=${() => this._pressedKeys.clear()}>\n ${this.showGrid ? html`<div class=\"xy-pad-grid\"></div>` : ``}\n <div class=\"xy-pad-marker\"></div>\n <div class=\"xy-pad-label-x\">${this.xLabel}</div>\n <div class=\"xy-pad-label-y\">${this.yLabel}</div>\n </div>\n `;\n }\n}\n\nexport type XyPadInputDetail = {\n readonly x: number;\n readonly y: number;\n};\n\nexport type XyPadInputEvent = CustomEvent<XyPadInputDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-xy-pad': XyPad;\n }\n}\n\nexport interface XyPadEventMap {\n input: XyPadInputEvent;\n change: XyPadInputEvent;\n}\n\nexport interface XyPad {\n addEventListener: (<K extends keyof XyPadEventMap>(\n type: K,\n listener: (this: XyPad, event: XyPadEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ixfx/components",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"description": "",
|
|
6
6
|
"author": "",
|
|
7
7
|
"license": "ISC",
|
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
"types": "./bundle/index.d.ts",
|
|
16
16
|
"import": "./bundle/index.js"
|
|
17
17
|
},
|
|
18
|
+
"./incr-search": {
|
|
19
|
+
"types": "./dist/incr-search.d.ts",
|
|
20
|
+
"import": "./dist/incr-search.js"
|
|
21
|
+
},
|
|
18
22
|
"./*": {
|
|
19
23
|
"types": "./dist/*.d.ts",
|
|
20
24
|
"import": "./dist/*.js"
|
|
@@ -31,19 +35,19 @@
|
|
|
31
35
|
"lint": "eslint",
|
|
32
36
|
"lint:fix": "eslint --fix",
|
|
33
37
|
"build": "tsdown",
|
|
34
|
-
"rebuild": "rm -rf dist bundle &&
|
|
35
|
-
"publish-prepare": "
|
|
38
|
+
"rebuild": "rm -rf dist bundle && pnpm run build",
|
|
39
|
+
"publish-prepare": "pnpm run rebuild",
|
|
36
40
|
"preview": "vite preview",
|
|
37
41
|
"knip": "knip --config ./config/knip.json"
|
|
38
42
|
},
|
|
39
43
|
"dependencies": {
|
|
40
|
-
"@clinth/ui-commands": "1.0
|
|
41
|
-
"@clinth/vcanvas": "
|
|
44
|
+
"@clinth/ui-commands": "1.1.0",
|
|
45
|
+
"@clinth/vcanvas": "link:../../../Library/pnpm/global/5/node_modules/@clinth/vcanvas",
|
|
42
46
|
"fzf": "0.5.2",
|
|
43
|
-
"lit": "3.3.
|
|
47
|
+
"lit": "3.3.3"
|
|
44
48
|
},
|
|
45
49
|
"devDependencies": {
|
|
46
|
-
"@antfu/eslint-config": "^
|
|
50
|
+
"@antfu/eslint-config": "^9.0.0",
|
|
47
51
|
"@ixfx/arrays": "0.56.12",
|
|
48
52
|
"@ixfx/collections": "0.56.12",
|
|
49
53
|
"@ixfx/core": "0.56.12",
|
|
@@ -53,14 +57,14 @@
|
|
|
53
57
|
"@ixfx/modulation": "0.56.12",
|
|
54
58
|
"@ixfx/numbers": "0.56.12",
|
|
55
59
|
"@ixfx/visual": "0.56.12",
|
|
56
|
-
"@tsdown/css": "0.
|
|
57
|
-
"eslint": "10.
|
|
60
|
+
"@tsdown/css": "0.22.0",
|
|
61
|
+
"eslint": "10.4.0",
|
|
58
62
|
"eslint-plugin-format": "2.0.1",
|
|
59
63
|
"globals": "17.6.0",
|
|
60
|
-
"knip": "6.
|
|
61
|
-
"tsdown": "0.
|
|
64
|
+
"knip": "6.14.1",
|
|
65
|
+
"tsdown": "0.22.0",
|
|
62
66
|
"typescript": "6.0.3",
|
|
63
|
-
"typescript-eslint": "8.59.
|
|
64
|
-
"vite": "8.0.
|
|
67
|
+
"typescript-eslint": "8.59.3",
|
|
68
|
+
"vite": "8.0.13"
|
|
65
69
|
}
|
|
66
70
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"button-DgKUzE5o.js","names":[],"sources":["../src/button/button-styles.ts","../src/button/button.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const buttonStyles = css`\n :host {\n display: inline-flex;\n max-width: 100%;\n vertical-align: middle;\n user-select: none;\n -webkit-user-select: none;\n }\n\n button {\n cursor: pointer;\n appearance: none;\n background: var(--surface-4, #ccc);\n color: var(--surface-3-text, #000);\n border: var(--border, 1px solid #999);\n border-radius: var(--radius-xl, 8px);\n corner-shape: superellipse(1);\n padding: var(--space-m, 8px) var(--space-l, 12px);\n font-family: var(--font-family, inherit);\n font-size: var(--text-m, 14px);\n margin: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5em;\n width: 100%;\n overflow: hidden;\n white-space: nowrap;\n box-shadow: \n inset 1px 1px 1px 1px color-mix(in oklch, var(--surface-4) 30%, transparent), inset -1px -1px 1px 1px color-mix(in oklch, var(--surface-2) 20%, transparent),\n 2px 2px 1px 0px color-mix(in oklch, var(--surface-2) 30%, transparent);\n transition: background var(--transition, 0.2s), border-color var(--transition, 0.2s);\n }\n\n button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n button:hover:not(:disabled) {\n background: color-mix(in oklch, var(--surface-4) 80%, transparent);\n border-color: var(--accent, #666);\n box-shadow: \n inset 1px 1px 1px 1px color-mix(in oklch, var(--surface-5) 70%, transparent), \n inset -1px -1px 1px 1px color-mix(in oklch, var(--surface-2) 60%, transparent),\n 2px 2px 1px 0px color-mix(in oklch, var(--surface-2) 90%, transparent);\n }\n\n button:active:not(:disabled) {\n background: var(--surface-2, #aaa);\n transform: translateY(1px);\n box-shadow: inset 1px 1px 0px 0.5px color-mix(in oklch,var(--surface-1),transparent);\n }\n\n .button-icon {\n display: var(--ixfx-button-hide-icon, inline-flex);\n align-items: center;\n flex-shrink: 0;\n }\n\n .button-label {\n white-space: nowrap;\n display: var(--ixfx-button-hide-label, inline);\n }\n\n :host([hide-label]) .button-label {\n display: none;\n }\n\n :host([hide-icon]) .button-icon {\n display: none;\n }\n`;\n","import { html, LitElement, nothing } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { getIcon } from \"../icons/index.js\";\nimport { prominenceStyles } from \"../styles/prominence.js\";\nimport { buttonStyles } from \"./button-styles.js\";\n\n@customElement(`ixfx-button`)\nexport class ButtonElement extends LitElement {\n @property({ type: Boolean })\n disabled = false;\n\n @property({ type: String })\n icon?: string;\n\n @property({ type: Boolean, attribute: `hide-icon`, reflect: true })\n hideIcon = false;\n\n @property({ type: Boolean, attribute: `hide-label`, reflect: true })\n hideLabel = false;\n\n protected _renderIcon() {\n if (this.hideIcon || !this.icon)\n return nothing;\n\n if (this.icon.startsWith(`<svg`)) {\n return html`<span class=\"button-icon\">${unsafeHTML(this.icon)}</span>`;\n }\n\n const svg = getIcon(this.icon);\n\n if (!svg)\n return nothing;\n\n return html`<ixfx-icon class=\"button-icon\" name=\"${this.icon}\"></ixfx-icon>`;\n }\n\n protected render() {\n const label = this.hideLabel\n ? nothing\n : html`<span class=\"button-label\"><slot></slot></span>`;\n return html`<button ?disabled=${this.disabled}>${this._renderIcon()}${label}</button>`;\n }\n\n static styles = [\n prominenceStyles,\n buttonStyles,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-button\": ButtonElement;\n }\n}\n"],"mappings":";;;;;;;;AAEA,MAAa,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACMxB,IAAA,gBAAA,MAAM,sBAAsB,WAAW;;;kBAEjC;kBAMA;mBAGC;;CAEZ,cAAwB;AACtB,MAAI,KAAK,YAAY,CAAC,KAAK,KACzB,QAAO;AAET,MAAI,KAAK,KAAK,WAAW,OAAO,CAC9B,QAAO,IAAI,6BAA6B,WAAW,KAAK,KAAK,CAAC;AAKhE,MAAI,CAFQ,QAAQ,KAAK,KAEjB,CACN,QAAO;AAET,SAAO,IAAI,wCAAwC,KAAK,KAAK;;CAG/D,SAAmB;EACjB,MAAM,QAAQ,KAAK,YACf,UACA,IAAI;AACR,SAAO,IAAI,qBAAqB,KAAK,SAAS,GAAG,KAAK,aAAa,GAAG,MAAM;;;gBAG9D,CACd,kBACA,aACD;;;YAtCA,SAAS,EAAE,MAAM,SAAS,CAAC,CAAA,EAAA,cAAA,WAAA,YAAA,KAAA,EAAA;YAG3B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,cAAA,WAAA,QAAA,KAAA,EAAA;YAG1B,SAAS;CAAE,MAAM;CAAS,WAAW;CAAa,SAAS;CAAM,CAAC,CAAA,EAAA,cAAA,WAAA,YAAA,KAAA,EAAA;YAGlE,SAAS;CAAE,MAAM;CAAS,WAAW;CAAc,SAAS;CAAM,CAAC,CAAA,EAAA,cAAA,WAAA,aAAA,KAAA,EAAA;4BAXrE,cAAc,cAAc,CAAA,EAAA,cAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"colour-picker-Bw-AZoWx.js","names":["Colour","Colour"],"sources":["../src/colour-picker/util.ts","../src/colour-picker/colour-picker.ts","../src/colour-picker/colour-picker-popup.ts"],"sourcesContent":["import type { Range, SliderType } from \"./types\";\n\nexport const MAX_CHROMA = 0.4;\nexport const RANGE_LIMITS: Record<SliderType, Range> = {\n l: [0, 1],\n c: [0, MAX_CHROMA],\n h: [0, 360],\n a: [0, 1],\n} as const;\nexport const DEFAULT_RANGES: Record<SliderType, Range> = {\n l: RANGE_LIMITS.l,\n c: RANGE_LIMITS.c,\n h: RANGE_LIMITS.h,\n a: RANGE_LIMITS.a,\n} as const;\n\nexport function rangeSpan([min, max]: Range): number {\n return Math.max(max - min, 0);\n}\n\nexport function cloneRange(range: Range): Range {\n return [range[0], range[1]] as Range;\n}\n\n/**\n * Convert OKLCH to a CSS string\n */\nexport function oklchToCss(l: number, c: number, h: number, a: number = 1): string {\n if (a < 1) {\n return `oklch(${l} ${c} ${h} / ${a})`;\n }\n return `oklch(${l} ${c} ${h})`;\n}\n\n/**\n * Clamp a value between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n","/**\n * <ixfx-colour-picker> — OKLCH colour picker using CSS-gradient-rendered sliders.\n *\n * Properties:\n * l — lightness 0..1\n * c — chroma 0..0.4\n * h — hue 0..360\n *\n * Getters:\n * value — current color as CSS string e.g. \"oklch(0.7 0.15 180)\"\n *\n * Methods:\n * setColour(colour: Colour.Colourish) — programmatically set colour from any\n * ixfx-compatible format; also resets double-click defaults for all sliders.\n *\n * Events:\n * input — CustomEvent { detail: { l, c, h } }\n *\n * Double-click any slider label to reset that channel to the last\n * programmatically set value (not the user-dialled value).\n */\nimport type { CSSResultGroup, PropertyValues } from 'lit';\nimport type { ColourPickerEventDetail, Range, RangeInput } from './types.js';\nimport { Colour } from '@ixfx/visual';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { DEFAULT_RANGES, oklchToCss } from './util.js';\nimport '../labelled-range-input/index.js';\n\ntype ChannelSlider = `l` | `c` | `h` | `a`;\n\n@customElement(`ixfx-colour-picker`)\nexport class ColourPicker extends LitElement {\n @property({ type: Number }) l = 0.7;\n @property({ type: Number }) c = 0.15;\n @property({ type: Number }) h = 180;\n @property({ type: Number }) a = 1;\n\n @property({ type: Boolean, attribute: `hide-preview`, reflect: true }) hidePreview = false;\n @property({ type: Boolean, attribute: `hide-h`, reflect: true }) hideH = false;\n @property({ type: Boolean, attribute: `hide-l`, reflect: true }) hideL = false;\n @property({ type: Boolean, attribute: `hide-c`, reflect: true }) hideC = false;\n @property({ type: Boolean, attribute: `show-a` }) showA = false;\n @property({ type: Boolean, attribute: `horizontal`, reflect: true }) horizontal = false;\n @property({ type: Boolean, attribute: `sliders-vertical`, reflect: true }) slidersVertical = false;\n @property({ type: Boolean, attribute: `hide-tooltips`, reflect: true }) hideTooltips = false;\n\n @property({ type: String, attribute: `value` })\n private _valueAttr: string | null = null;\n\n @property({ type: String, attribute: `range-l` }) rangeLAttr: string | null = null;\n @property({ type: String, attribute: `range-c` }) rangeCAttr: string | null = null;\n @property({ type: String, attribute: `range-h` }) rangeHAttr: string | null = null;\n @property({ type: String, attribute: `range-a` }) rangeAAttr: string | null = null;\n\n private _ranges: Record<ChannelSlider, Range> = {\n l: DEFAULT_RANGES.l,\n c: DEFAULT_RANGES.c,\n h: DEFAULT_RANGES.h,\n a: DEFAULT_RANGES.a,\n };\n\n @query(`#slider-l`) _sliderL!: HTMLElement;\n @query(`#slider-c`) _sliderC!: HTMLElement;\n @query(`#slider-h`) _sliderH!: HTMLElement;\n @query(`#slider-a`) _sliderA!: HTMLElement;\n @query(`.preview`) _previewEl!: HTMLElement;\n\n // Last programmatically-set values — used as double-click reset targets.\n // Initialised to the component's own defaults.\n private _defaultL = this.l;\n private _defaultC = this.c;\n private _defaultH = this.h;\n private _defaultA = this.a;\n\n // Keys are added synchronously in input handlers and cleared only inside\n // updated() (which runs asynchronously). This means updated() can reliably\n // tell whether a property change was user-initiated or programmatic.\n private readonly _userInitiated = new Set<string>();\n\n get value(): string {\n return oklchToCss(this.l, this.c, this.h, this.a);\n }\n\n set value(colourString: string) {\n const c = Colour.convert(colourString, `oklch-absolute`);\n this.l = c.l;\n this.c = c.c;\n this.h = c.h;\n this.a = c.opacity ?? 1;\n this._valueAttr = colourString;\n }\n\n /**\n * Set the colour from any ixfx-compatible format (CSS string, OkLch object,\n * HSL object, etc.). Also updates the double-click reset defaults for all\n * sliders.\n */\n setColour(colour: Colour.Colourish): void {\n const c = Colour.convert(colour, `oklch-absolute`);\n this.l = c.l;\n this.c = c.c;\n this.h = c.h;\n this.a = c.opacity ?? 1;\n // No _userInitiated keys added → updated() will set _defaultL/C/H/A. ✓\n }\n\n get rangeL(): Range {\n return [this._ranges.l[0], this._ranges.l[1]];\n }\n\n set rangeL(range: RangeInput) {\n this._applyRangeInput(`l`, range);\n }\n\n get rangeC(): Range {\n return [this._ranges.c[0], this._ranges.c[1]];\n }\n\n set rangeC(range: RangeInput) {\n this._applyRangeInput(`c`, range);\n }\n\n get rangeH(): Range {\n return [this._ranges.h[0], this._ranges.h[1]];\n }\n\n set rangeH(range: RangeInput) {\n this._applyRangeInput(`h`, range);\n }\n\n get rangeA(): Range {\n return [this._ranges.a[0], this._ranges.a[1]];\n }\n\n set rangeA(range: RangeInput) {\n this._applyRangeInput(`a`, range);\n }\n\n setRangeL(range: RangeInput): void {\n this.rangeL = range;\n }\n\n setRangeC(range: RangeInput): void {\n this.rangeC = range;\n }\n\n setRangeH(range: RangeInput): void {\n this.rangeH = range;\n }\n\n setRangeA(range: RangeInput): void {\n this.rangeA = range;\n }\n\n override willUpdate(changedProperties: PropertyValues): void {\n if (changedProperties.has(`rangeLAttr`))\n this._setRangeFromAttribute(`l`, this.rangeLAttr);\n if (changedProperties.has(`rangeCAttr`))\n this._setRangeFromAttribute(`c`, this.rangeCAttr);\n if (changedProperties.has(`rangeHAttr`))\n this._setRangeFromAttribute(`h`, this.rangeHAttr);\n if (changedProperties.has(`rangeAAttr`))\n this._setRangeFromAttribute(`a`, this.rangeAAttr);\n super.willUpdate(changedProperties);\n }\n\n private _applyRangeInput(channel: ChannelSlider, input: RangeInput): void {\n const normalized = this._coerceRangeInput(channel, input);\n if (!normalized)\n return;\n this._setRange(channel, normalized);\n }\n\n private _coerceRangeInput(channel: ChannelSlider, input: RangeInput): Range | null {\n if (!Array.isArray(input) || input.length < 2)\n return null;\n const [start, end] = input;\n if (!Number.isFinite(start) || !Number.isFinite(end))\n return null;\n return this._normalizeRange(channel, [start, end]);\n }\n\n private _setRangeFromAttribute(channel: ChannelSlider, value: string | null): void {\n if (value === null) {\n this._setRange(channel, DEFAULT_RANGES[channel]);\n return;\n }\n const parsed = this._parseRangeString(channel, value);\n if (parsed)\n this._setRange(channel, parsed);\n }\n\n private _setRange(channel: ChannelSlider, range: Range): void {\n const normalized = this._normalizeRange(channel, range);\n const currentRange = this._ranges[channel];\n if (currentRange[0] === normalized[0] && currentRange[1] === normalized[1])\n return;\n\n this._ranges = { ...this._ranges, [channel]: normalized };\n\n switch (channel) {\n case `l`:\n this.l = this._clampToRange(`l`, this.l);\n break;\n case `c`:\n this.c = this._clampToRange(`c`, this.c);\n break;\n case `h`:\n this.h = this._clampToRange(`h`, this.h);\n break;\n case `a`:\n this.a = this._clampToRange(`a`, this.a);\n break;\n }\n\n this.requestUpdate();\n }\n\n private _getRange(channel: ChannelSlider): Range {\n return this._ranges[channel] ?? DEFAULT_RANGES[channel];\n }\n\n private _parseRangeString(channel: ChannelSlider, value: string): Range | null {\n const cleaned = value.trim();\n const parts = cleaned.split(`-`, 2);\n if (parts.length !== 2)\n return null;\n const start = Number(parts[0]!.trim());\n const end = Number(parts[1]!.trim());\n if (!Number.isFinite(start) || !Number.isFinite(end))\n return null;\n return this._normalizeRange(channel, [start, end]);\n }\n\n private _normalizeRange(channel: ChannelSlider, range: Range): Range {\n const limits = DEFAULT_RANGES[channel];\n const [rawMin, rawMax] = range;\n const minVal = Math.min(Math.min(rawMin, rawMax), limits[1]);\n const maxVal = Math.max(Math.max(rawMin, rawMax), limits[0]);\n return [\n Math.max(minVal, limits[0]),\n Math.min(maxVal, limits[1]),\n ];\n }\n\n private _clampToRange(channel: ChannelSlider, value: number): number {\n const [min, max] = this._getRange(channel);\n return Math.min(Math.max(value, min), max);\n }\n\n override render() {\n const makeSlider = (channel: `l` | `c` | `h` | `a`, label: string, min: number, max: number, step: number, isHidden: boolean, formatter?: (value: string) => string) => {\n if (isHidden)\n return nothing;\n return html`\n <ixfx-labelled-range-input\n id=\"slider-${channel}\"\n label=\"${label}\"\n min=${min}\n max=${max}\n mini-width-threshold=200\n .value=${this[channel]}\n step=${step}\n .orientation=${this.slidersVertical ? `vertical` : `horizontal`}\n .formatter=${formatter}\n ?no-tooltip=${this.hideTooltips}\n .displayTextLogic=${this.hideTooltips ? `show` : `transient`}\n @input=${(e: Event) => this._onInput(e, channel)}\n @change=${(e: Event) => this._onChange(e, channel)}\n ></ixfx-labelled-range-input>\n `;\n };\n\n return html`\n <div class=\"picker\" ?horizontal=${this.horizontal}>\n <div class=\"preview\" ?hidden=${this.hidePreview}></div>\n <div class=\"sliders\">\n ${makeSlider(`h`, `Hue`, ...this._getRange(`h`), 1, this.hideH, v => `${Math.round(Number(v))}°`)}\n ${makeSlider(`l`, `Lightness`, ...this._getRange(`l`), 0.01, this.hideL, v => `${Math.round(Number(v) * 100)}%`)}\n ${makeSlider(`c`, `Chroma`, ...this._getRange(`c`), 0.005, this.hideC, v => `${Number.parseFloat(v).toFixed(2)}`)}\n ${this.showA ? makeSlider(`a`, `Opacity`, ...this._getRange(`a`), 0.01, false, v => `${Math.round(Number(v) * 100)}%`) : nothing}\n </div>\n </div>\n `;\n }\n\n override firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n this._updateGradients();\n }\n\n override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n\n // Update reset defaults only for programmatic changes (not user input).\n // _userInitiated is populated synchronously in input handlers and cleared\n // here, so it correctly reflects what changed since the last render.\n if (changedProperties.has(`l`) && !this._userInitiated.has(`l`))\n this._defaultL = this.l;\n if (changedProperties.has(`c`) && !this._userInitiated.has(`c`))\n this._defaultC = this.c;\n if (changedProperties.has(`h`) && !this._userInitiated.has(`h`))\n this._defaultH = this.h;\n if (changedProperties.has(`a`) && !this._userInitiated.has(`a`))\n this._defaultA = this.a;\n this._userInitiated.clear();\n\n if (changedProperties.has(`l`) || changedProperties.has(`c`) || changedProperties.has(`h`) || changedProperties.has(`a`) || changedProperties.has(`showA`) || changedProperties.has(`slidersVertical`)) {\n this._updateGradients();\n }\n }\n\n _updateGradients(): void {\n const l = this.l;\n const c = this.c;\n const h = this.h;\n const a = this.a;\n\n // Get actual ranges from this._ranges (may be restricted via attributes)\n const [lMin, lMax] = this._ranges.l;\n const [cMin, cMax] = this._ranges.c;\n const [hMin, hMax] = this._ranges.h;\n const [aMin, aMax] = this._ranges.a;\n\n // Gradient direction: vertical sliders fill bottom→top (bottom = min, top = max).\n const dir = this.slidersVertical ? `to top` : `to right`;\n\n // L slider: black → white at current chroma + hue, using actual range\n const lGrad = `linear-gradient(in oklch ${dir}, oklch(${lMin} ${c} ${h}), oklch(${lMax} ${c} ${h}))`;\n\n // C slider: neutral grey → fully saturated at current lightness + hue, using actual range\n const cGrad = `linear-gradient(in oklch ${dir}, oklch(${l} ${cMin} ${h}), oklch(${l} ${cMax} ${h}))`;\n\n // H slider: hue range at current lightness + chroma.\n // Use 'longer hue' for full 0-360 range, 'shorter hue' for restricted ranges.\n const hRange = hMax - hMin;\n const hLonger = hRange >= 300; // Full or near-full hue range\n const hGrad = `linear-gradient(in oklch ${hLonger ? `longer` : `shorter`} hue ${dir}, oklch(${l} ${c} ${hMin}), oklch(${l} ${c} ${hMax}))`;\n\n // A slider: transparent to opaque at current colour, using actual range.\n // Includes checkerboard pattern as bottom layer, with opacity gradient on top.\n const aGrad = `\n linear-gradient(${dir}, oklch(${l} ${c} ${h} / ${aMin}), oklch(${l} ${c} ${h} / ${aMax})),\n repeating-conic-gradient(\n var(--surface-2) 0% 25%,\n var(--surface-4) 0% 50%\n ) 50% / 16px 16px\n `;\n\n // Set gradient on --background-track (goes to .range-bg, the track background)\n // Set --background-track-value to transparent to hide the filled-portion bar\n const trackBgVars = [\n `--background-track`,\n `--background-track-hover`,\n ] as const;\n\n const trackValueVars = [\n `--background-track-value`,\n `--background-track-value-hover`,\n `--background-track-value-active`,\n `--background-track-value-vertical`,\n `--background-track-value-hover-vertical`,\n `--background-track-value-active-vertical`,\n ] as const;\n\n const sliders: Array<[HTMLElement | null, string]> = [\n [this._sliderL, lGrad],\n [this._sliderC, cGrad],\n [this._sliderH, hGrad],\n ];\n\n if (this.showA && this._sliderA)\n sliders.push([this._sliderA, aGrad]);\n\n for (const [el, grad] of sliders) {\n if (!el)\n continue;\n // Set gradient on track background (.range-bg)\n for (const v of trackBgVars) {\n el.style.setProperty(v, grad);\n }\n // Hide the filled-portion bar (track pseudo-element)\n for (const v of trackValueVars) {\n el.style.setProperty(v, `transparent`);\n }\n }\n\n // Preview swatch background - show checkerboard behind when opacity < 1\n if (this._previewEl) {\n if (this.a < 1) {\n const previewBg = `\n linear-gradient(oklch(${l} ${c} ${h} / ${a}), oklch(${l} ${c} ${h} / ${a})),\n repeating-conic-gradient(\n var(--surface-2) 0% 25%,\n var(--surface-4) 0% 50%\n ) 50% / 16px 16px\n `;\n this._previewEl.style.background = previewBg;\n } else {\n this._previewEl.style.background = this.value;\n }\n }\n }\n\n _onInput = (e: Event, channel: `l` | `c` | `h` | `a`): void => {\n const detail = (e as CustomEvent).detail;\n this._userInitiated.add(channel);\n this[channel] = detail.value;\n this._dispatchInput();\n e.stopPropagation();\n };\n\n _onChange = (e: Event, channel: `l` | `c` | `h` | `a`): void => {\n const detail = (e as CustomEvent).detail;\n this._userInitiated.add(channel);\n const value = typeof detail.value === `string` ? Number.parseFloat(detail.value) : detail.value;\n switch (channel) {\n case `l`: this.l = value; break;\n case `c`: this.c = value; break;\n case `h`: this.h = value; break;\n case `a`: this.a = value; break;\n }\n e.stopPropagation();\n this.requestUpdate();\n this._dispatchChange();\n };\n\n _dispatchInput(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`input`, { detail, bubbles: true, composed: true }));\n }\n\n _dispatchChange(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`change`, { detail, bubbles: true, composed: true }));\n }\n\n static styles: CSSResultGroup = css`\n /*\n * Default intrinsic size — not determined by label text.\n * Override via CSS: ixfx-colour-picker { width: 100%; height: 200px; }\n * Or via custom properties: --picker-alt-width, --picker-alt-min-slider-height\n */\n :host {\n display: block;\n width: var(--picker-alt-width, 240px);\n height: var(--picker-alt-height, 240px);\n --_radius-m: var(--radius-m, 4px);\n --_radius-s: var(--radius-m, 3px);\n container-type: size;\n }\n\n .picker {\n display: flex;\n flex-direction: column;\n gap: var(--space-s, 8px);\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n .picker[horizontal] {\n flex-direction: row;\n align-items: stretch;\n }\n\n .sliders {\n display: flex;\n flex-direction: column;\n gap: var(--space-s, 8px);\n flex: 1;\n min-height: 0;\n }\n\n .picker[horizontal] .sliders {\n flex-direction: column;\n }\n\n .preview {\n flex-shrink: 0;\n height: 30%;\n border-radius: var(--_radius-m);\n border: 1px solid rgba(0, 0, 0, 0.2);\n }\n\n .preview[hidden] {\n display: none;\n }\n\n .picker[horizontal] .preview {\n width: 3em;\n height: auto;\n flex-shrink: 0;\n }\n\n ixfx-labelled-range-input {\n flex: 1;\n min-height: var(--picker-alt-min-slider-height, 2.5em);\n width: 100%;\n min-width: 0;\n --track-thickness: 2em;\n --track-radius: var(--_radius-s);\n --label-width: 5em;\n --thumb-thickness: 4px;\n --thumb-color: rgba(255, 255, 255, 0.9);\n --thumb-color-active: white;\n --thumb-radius: 3px;\n --thumb-border: 2px solid rgba(255, 255, 255, 0.85);\n --thumb-shadow: 0 0 0 2px rgba(0, 0, 0, 0.65);\n }\n\n /* Vertical sliders mode: sliders are side-by-side vertical bars */\n :host([sliders-vertical]) .sliders {\n flex-direction: row;\n align-items: stretch;\n }\n\n :host([sliders-vertical]) ixfx-labelled-range-input {\n width: auto;\n height: 100%;\n min-height: 0;\n --mini: 1; /* force mini mode: no label, tooltip on hover */\n --track-thickness: 100%; /* fill full width of the narrow slider */\n }\n\n /* Landscape */\n @container (aspect-ratio > 1) {\n .picker {\n flex-direction: row;\n display:flex;\n align-items: stretch;\n\n }\n .preview {\n width: 30%;\n height: unset;\n }\n .sliders {\n height: 100%;\n overflow: hidden;\n }\n }\n\n /* Small height. Show as landscape */\n @container (max-height: 150px) {\n .picker {\n flex-direction: row;\n align-items: stretch;\n }\n ixfx-labelled-range-input {\n --track-thickness: 1em;\n min-height: unset;\n }\n .preview {\n min-width: 50%;\n height: auto;\n }\n }\n\n /* Medium height — tighter but not extreme */\n @container (max-height: 210px) and (min-height: 150px) {\n ixfx-labelled-range-input {\n --track-thickness: 1.6em;\n min-height: 1.8em;\n }\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-colour-picker': ColourPicker;\n }\n}\n","/**\n * <ixfx-colour-picker-popup> — inline colour swatch that opens an ixfx-colour-picker\n * in a native popover.\n *\n * Properties:\n * mode — \"fluid\" (default) | \"confirm\"\n * l, c, h, a — committed OKLCH values\n * hide-h, hide-l, hide-c, show-a, horizontal — passed to inner picker\n * show-preview — show the colour preview swatch inside the picker (fluid mode hides it by default)\n *\n * Getters:\n * value — committed colour as CSS string e.g. \"oklch(0.7 0.15 180)\"\n *\n * Methods:\n * setColour(colour: Colour.Colourish) — programmatically set committed colour\n *\n * Events:\n * input — (fluid mode only) CustomEvent { detail: { l, c, h, a } }\n * change — CustomEvent { detail: { l, c, h, a } }\n *\n * CSS custom properties:\n * --cp-popup-swatch-size — swatch button size (default: 1.5em)\n */\nimport type { CSSResultGroup, PropertyValues } from 'lit';\nimport type { ColourPicker } from './colour-picker.js';\nimport type { ColourPickerEventDetail } from './types.js';\nimport { Colour } from '@ixfx/visual';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { ICON_CHECK } from '../icons/defaults.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { oklchToCss } from './util.js';\nimport './colour-picker.js';\n\nlet _instanceCounter = 0;\n\nconst PICKER_SIZES = {\n small: { width: 130, height: 100 },\n medium: { width: 100, height: 155 },\n large: { width: 200, height: 180 },\n huge: { width: 290, height: 240 },\n} as const;\n\ntype PickerSize = keyof typeof PICKER_SIZES;\n\nfunction swatchBackground(l: number, c: number, h: number, a: number): string {\n if (a < 1) {\n return `\n linear-gradient(oklch(${l} ${c} ${h} / ${a}), oklch(${l} ${c} ${h} / ${a})),\n repeating-conic-gradient(\n var(--surface-2) 0% 25%,\n var(--surface-4) 0% 50%\n ) 50% / 8px 8px\n `;\n }\n return oklchToCss(l, c, h);\n}\n\n@customElement(`ixfx-colour-picker-popup`)\nexport class ColourPickerPopup extends LitElement {\n @property({ type: String }) mode: `fluid` | `confirm` = `fluid`;\n\n @property({ type: Number }) l = 0.7;\n @property({ type: Number }) c = 0.15;\n @property({ type: Number }) h = 180;\n @property({ type: Number }) a = 1;\n\n @property({ type: Boolean, attribute: `show-preview` }) showPreview = false;\n @property({ type: Boolean, attribute: `hide-h`, reflect: true }) hideH = false;\n @property({ type: Boolean, attribute: `hide-l`, reflect: true }) hideL = false;\n @property({ type: Boolean, attribute: `hide-c`, reflect: true }) hideC = false;\n @property({ type: Boolean, attribute: `show-a` }) showA = false;\n @property({ type: Boolean, attribute: `horizontal` }) horizontal = false;\n @property({ type: String }) size: PickerSize = `medium`;\n\n @state() private _isOpen = false;\n @state() private _everOpened = false;\n\n @query(`.popup`) _popupEl!: HTMLElement;\n @query(`ixfx-colour-picker`) _pickerEl!: ColourPicker;\n\n private readonly _uid: string;\n private readonly _anchorName: string;\n private readonly _popupId: string;\n\n // Confirm mode: values being adjusted (not yet committed)\n private _pendingL = this.l;\n private _pendingC = this.c;\n private _pendingH = this.h;\n private _pendingA = this.a;\n\n // Confirm mode: snapshot taken on open, used for revert on dismiss\n private _savedL = this.l;\n private _savedC = this.c;\n private _savedH = this.h;\n private _savedA = this.a;\n\n // Set to true just before hidePopover() in _onConfirm to suppress revert\n private _pendingConfirmed = false;\n\n constructor() {\n super();\n const id = ++_instanceCounter;\n this._uid = `cp-popup-${id}`;\n this._anchorName = `--cp-popup-anchor-${id}`;\n this._popupId = `cp-popup-panel-${id}`;\n }\n\n get value(): string {\n return oklchToCss(this.l, this.c, this.h, this.a);\n }\n\n private get _innerHidePreview(): boolean {\n // Fluid mode hides the preview by default (swatch already shows live colour).\n // show-preview overrides this. Confirm mode shows it by default.\n if (this.mode === `fluid`)\n return !this.showPreview;\n return false;\n }\n\n private get _pickerDimensions(): { width: number; height: number } {\n return PICKER_SIZES[this.size] ?? PICKER_SIZES.medium;\n }\n\n setColour(colour: Colour.Colourish): void {\n const c = Colour.convert(colour, `oklch-absolute`);\n this.l = c.l;\n this.c = c.c;\n this.h = c.h;\n this.a = c.opacity ?? 1;\n }\n\n override firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n this._applyAnchorPositioning();\n this._updateSwatchBackground();\n }\n\n override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n const colourChanged = changedProperties.has(`l`) || changedProperties.has(`c`)\n || changedProperties.has(`h`) || changedProperties.has(`a`);\n if (colourChanged) {\n this._updateSwatchBackground();\n }\n }\n\n private _applyAnchorPositioning(): void {\n const swatch = this.shadowRoot?.querySelector(`.swatch`) as HTMLElement | null;\n if (swatch) {\n swatch.style.setProperty(`anchor-name`, this._anchorName);\n }\n if (this._popupEl) {\n this._popupEl.style.setProperty(`position-anchor`, this._anchorName);\n }\n }\n\n private _updateSwatchBackground(): void {\n const swatch = this.shadowRoot?.querySelector(`.swatch`) as HTMLElement | null;\n if (swatch) {\n swatch.style.background = swatchBackground(this.l, this.c, this.h, this.a);\n }\n }\n\n private _onPopoverToggle = (e: Event): void => {\n const te = e as ToggleEvent;\n this._isOpen = te.newState === `open`;\n\n if (te.newState === `open`) {\n this._savedL = this.l;\n this._savedC = this.c;\n this._savedH = this.h;\n this._savedA = this.a;\n this._pendingL = this.l;\n this._pendingC = this.c;\n this._pendingH = this.h;\n this._pendingA = this.a;\n this._pendingConfirmed = false;\n } else if (this.mode === `confirm` && !this._pendingConfirmed) {\n // Dismissed without confirming — reset inner picker to saved values\n this._pickerEl?.setColour(oklchToCss(this._savedL, this._savedC, this._savedH, this._savedA));\n }\n };\n\n private _onPickerInput = (e: Event): void => {\n e.stopPropagation();\n const detail = (e as CustomEvent<ColourPickerEventDetail>).detail;\n\n if (this.mode === `confirm`) {\n this._pendingL = detail.l;\n this._pendingC = detail.c;\n this._pendingH = detail.h;\n this._pendingA = detail.a ?? 1;\n return;\n }\n\n this.l = detail.l;\n this.c = detail.c;\n this.h = detail.h;\n this.a = detail.a ?? 1;\n this._dispatchInput();\n };\n\n private _onPickerChange = (e: Event): void => {\n e.stopPropagation();\n const detail = (e as CustomEvent<ColourPickerEventDetail>).detail;\n\n if (this.mode === `confirm`) {\n this._pendingL = detail.l;\n this._pendingC = detail.c;\n this._pendingH = detail.h;\n this._pendingA = detail.a ?? 1;\n return;\n }\n\n this.l = detail.l;\n this.c = detail.c;\n this.h = detail.h;\n this.a = detail.a ?? 1;\n this._dispatchChange();\n };\n\n private _onConfirm = (): void => {\n this.l = this._pendingL;\n this.c = this._pendingC;\n this.h = this._pendingH;\n this.a = this._pendingA;\n this._pendingConfirmed = true;\n this._dispatchChange();\n try {\n (this._popupEl as HTMLElement & { hidePopover: () => void }).hidePopover();\n } catch {\n // Popover API not supported\n }\n };\n\n private _onSwatchClick = async (): Promise<void> => {\n if (!this._everOpened) {\n this._everOpened = true;\n await this.updateComplete;\n }\n try {\n (this._popupEl as HTMLElement & { showPopover: () => void }).showPopover();\n } catch {\n // Popover API not supported\n }\n };\n\n private _dispatchInput(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`input`, { detail, bubbles: true, composed: true }));\n }\n\n private _dispatchChange(): void {\n const detail: ColourPickerEventDetail = { l: this.l, c: this.c, h: this.h, a: this.a };\n this.dispatchEvent(new CustomEvent<ColourPickerEventDetail>(`change`, { detail, bubbles: true, composed: true }));\n }\n\n override render() {\n return html`\n <button\n class=\"swatch\"\n @click=${this._onSwatchClick}\n aria-label=\"Pick colour: ${this.value}\"\n aria-expanded=\"${this._isOpen}\"\n aria-haspopup=\"dialog\"\n ></button>\n <div\n id=\"${this._popupId}\"\n class=\"popup popup-surface\"\n popover=\"auto\"\n role=\"dialog\"\n aria-label=\"Colour picker\"\n style=\"--cp-popup-min-width:${this._pickerDimensions.width}px;--cp-popup-min-height:${this._pickerDimensions.height}px\"\n @toggle=${this._onPopoverToggle}\n >\n ${this._everOpened\n ? html`\n <ixfx-colour-picker\n .l=${this.l}\n .c=${this.c}\n .h=${this.h}\n .a=${this.a}\n style=\"width:${this._pickerDimensions.width}px;height:${this._pickerDimensions.height}px\"\n ?hide-preview=${this._innerHidePreview}\n ?hide-h=${this.hideH}\n ?hide-l=${this.hideL}\n ?hide-c=${this.hideC}\n ?show-a=${this.showA}\n ?horizontal=${this.horizontal}\n hide-tooltips\n @input=${this._onPickerInput}\n @change=${this._onPickerChange}\n ></ixfx-colour-picker>\n ${this.mode === `confirm`\n ? html`\n <button class=\"confirm-btn\" @click=${this._onConfirm} aria-label=\"Confirm colour\" title=\"Confirm colour\">\n ${unsafeHTML(ICON_CHECK)}\n </button>\n `\n : nothing}\n `\n : nothing}\n </div>\n `;\n }\n\n static styles: CSSResultGroup = [popupSurfaceStyles, css`\n :host {\n display: inline-block;\n }\n\n .swatch {\n display: inline-block;\n width: var(--cp-popup-swatch-size, 1.5em);\n height: var(--cp-popup-swatch-size, 1.5em);\n border-radius: var(--radius-m, 4px);\n border: 1px solid rgba(0, 0, 0, 0.2);\n cursor: pointer;\n padding: 0;\n box-sizing: border-box;\n vertical-align: middle;\n transition: transform 0.1s ease, box-shadow 0.1s ease;\n }\n\n .swatch:hover {\n transform: scale(1.1);\n }\n\n .swatch:focus-visible {\n outline: 2px solid var(--accent, oklch(60% 0.15 140));\n outline-offset: 2px;\n }\n\n /* Popover panel */\n .popup {\n display:flex;\n flex-direction: column;\n gap: var(--space-s);\n /* Reset popover UA inset */\n inset: unset;\n margin: 0;\n\n min-width: var(--cp-popup-min-width);\n min-height: var(--cp-popup-min-height);\n\n /* CSS anchor positioning — position-anchor set via inline style in JS */\n position: fixed;\n position-area: block-end span-inline-start;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n margin-block-start: 4px;\n\n padding: var(--space-l);\n z-index: 100;\n\n /* Animate in/out */\n opacity: 0;\n scale: 0.97;\n pointer-events: none;\n transition: opacity 0.12s ease, scale 0.12s ease;\n }\n\n .popup:popover-open {\n opacity: 1;\n scale: 1;\n pointer-events: auto;\n }\n\n ixfx-colour-picker {\n display: block;\n }\n\n .confirm-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-block-start: var(--space-s);\n margin-inline-start: auto;\n width: 1.8em;\n height: 1.8em;\n border-radius: 50%;\n border: none;\n background: var(--accent, oklch(60% 0.15 140));\n color: var(--accent-text, #fff);\n padding: 0;\n cursor: pointer;\n transition: background var(--transition, 0.15s ease-out);\n }\n\n .confirm-btn svg {\n width: 1.1em;\n height: 1.1em;\n flex-shrink: 0;\n }\n\n .confirm-btn:hover {\n background: var(--accent, oklch(70% 0.15 140));\n }\n\n .confirm-btn:focus-visible {\n outline: 2px solid var(--accent, oklch(60% 0.15 140));\n outline-offset: 2px;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-colour-picker-popup': ColourPickerPopup;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
//#region \0@oxc-project+runtime@0.127.0/helpers/decorate.js
|
|
2
|
-
function __decorate(decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
}
|
|
8
|
-
//#endregion
|
|
9
|
-
export { __decorate as t };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hex-editor-Gib1Grg2.d.ts","names":[],"sources":["../src/hex/types.ts","../src/hex/hex-editor.ts"],"mappings":";;;;KAAY,OAAA;AAAA,KAEA,eAAA;EAAA,SAA6B,IAAA;EAAA,SAAyB,GAAA,EAAK,OAAA;AAAA;AAAA,KAC3D,mBAAA;EAAA,SAAiC,IAAA;EAAA,SAA6B,KAAA,EAAO,OAAA;EAAA,SAAkB,GAAA,EAAK,OAAA;AAAA;AAAA,KAC5F,oBAAA;EAAA,SAAkC,IAAA;EAAA,SAA8B,CAAA;EAAA,SAAoB,CAAA;EAAA,SAAoB,KAAA;EAAA,SAAwB,MAAA;AAAA;AAAA,KAChI,SAAA,GAAY,eAAA,GAAkB,mBAAA,GAAsB,oBAAA;AAAA,KASpD,SAAA;EAAA,SAAuB,MAAA;EAAA,SAAyB,KAAA;AAAA;AAAA,KAChD,IAAA,GAAO,WAAA,CAAY,OAAA,EAAS,SAAA;AAAA,KAK5B,YAAA;;;cCIC,oBAAA,SAA6B,UAAA;EAExC,OAAA;EAGA,YAAA,EAAc,YAAA;EAGd,aAAA;EAGA,aAAA;EAGA,UAAA;EAGA,WAAA;EAAA,QAGQ,UAAA;EAAA,QAGA,UAAA;EAAA,QAGA,UAAA;EAAA,QAGA,WAAA;EAAA,QAGA,SAAA;EAAA,QAGA,UAAA;EAAA,QAEA,MAAA;EAAA,QACA,UAAA;EAAA,QACA,WAAA;EAAA,QACA,UAAA;EAAA,QACA,UAAA;EAAA,QACA,WAAA;EAAA,QACA,YAAA;EAAA,QACA,YAAA;EAAA,QACA,wBAAA;EAAA,QACA,wBAAA;EAAA,QACA,sBAAA;EAAA,QACA,mBAAA;EAAA,QACA,YAAA;EAAA,QACA,gBAAA;EAAA,QACA,iBAAA;EAAA,OAED,MAAA,EAhDmB,KAAA,CAgDb,SAAA;EA4Ib,OAAA,CAAQ,IAAA,EAAM,UAAA;EASd,IAAA,CAAA;EASA,IAAA,CAAA;EAQA,gBAAA,CAAA;EAUE,aAAA,CAAA,GAAiB,SAAA;IAAY,eAAA;IAAyB,WAAA;IAAqB,KAAA;EAAA;EAY7E,gBAAA,CAAiB,GAAA;EAIjB,YAAA,CAAa,QAAA;EAMb,gBAAA,CAAiB,KAAA,UAAe,GAAA;EAUhC,iBAAA,CAAkB,CAAA,UAAW,CAAA,UAAW,KAAA,UAAe,MAAA;EAYvD,cAAA,CAAA;EAMA,YAAA,CAAA,GAAgB,SAAA;EAAA,UAIG,YAAA,CAAA;EAAA,QAaX,SAAA;EAAA,QAMA,cAAA;EAAA,QAoCA,cAAA;EAAA,QAwCA,YAAA;EAAA,QAuDA,UAAA;EAAA,QA4HA,gBAAA;EAAA,QAOA,iBAAA;EAAA,QAsDA,mBAAA;EAAA,QAYA,cAAA;EAAA,QAUA,oBAAA;EAAA,QAQA,oBAAA;EAAA,QAuBA,KAAA;EAAA,QAYM,MAAA;EAAA,QAyDN,eAAA;EAAA,QAiBA,cAAA;EAAA,QASA,YAAA;EAAA,QAUA,YAAA;EAAA,QAIA,aAAA;EAAA,UAIE,MAAA,CAAA,GAzfe,KAAA,CAyfT,cAAA;EAAA,QAmCR,UAAA;EAAA,QA6BA,aAAA;EAAA,QAWA,cAAA;EAAA,QA+CA,eAAA;AAAA;AAAA,KAwCE,eAAA;EAAA,SACD,IAAA,EAAM,IAAA;AAAA;AAAA,KAGL,cAAA,GAAiB,WAAA,CAAY,eAAA;AAAA,KAE7B,uBAAA;EAAA,SAAqC,IAAA;EAAA,SAAyB,QAAA;AAAA;AAAA,KAC9D,2BAAA;EAAA,SAAyC,IAAA;EAAA,SAA6B,KAAA;EAAA,SAAwB,GAAA;AAAA;AAAA,KAC9F,4BAAA;EAAA,SAA0C,IAAA;EAAA,SAA8B,CAAA;EAAA,SAAoB,CAAA;EAAA,SAAoB,KAAA;EAAA,SAAwB,MAAA;AAAA;AAAA,KACxI,qBAAA;EAAA,SAAmC,IAAA;AAAA;AAAA,KACnC,iBAAA,GAAoB,uBAAA,GAA0B,2BAAA,GAA8B,4BAAA,GAA+B,qBAAA;AAAA,QAE/G,MAAA;EAAA,UACI,qBAAA;IACR,iBAAA,EAAmB,oBAAA;EAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hex-editor-Wd6ZtZA2.js","names":["Colour","storeLength","undoDiff","redoDiff"],"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\nconst isControlByte = (byte: number): boolean => {\n return byte < 0x20 && byte !== 0x09 && byte !== 0x0a && byte !== 0x0b && byte !== 0x0c && byte !== 0x0d;\n};\n\nconst isPrintableAscii = (byte: number): boolean => {\n return byte >= 0x20 && byte <= 0x7e;\n};\n\nexport const getAsciiClass = (byte: number): string => {\n if (byte === 0) return 'byte-null';\n if (WHITESPACE_BYTES.has(byte)) return 'byte-whitespace';\n if (isControlByte(byte)) return 'byte-control';\n if (isPrintableAscii(byte)) return 'byte-printable';\n return 'byte-other';\n};\n\nexport const createShadeMap = (\n nullColour: string,\n maxColour: string,\n stepStart: string,\n stepEnd: string\n): 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) return nullColour;\n if (byte === 0xff) 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 const createHexStore = (data: Uint8Array): HexStore => {\n return {\n data: new Uint8Array(data),\n changeset: new Set<BytePos>(),\n };\n};\n\nexport const readByte = (store: HexStore, pos: BytePos): number => {\n return store.data[pos] ?? 0;\n};\n\nexport const readBytes = (store: HexStore, positions: readonly BytePos[]): readonly number[] => {\n return positions.map((p) => store.data[p] ?? 0);\n};\n\nexport const length = (store: HexStore): number => {\n return store.data.length;\n};\n\nconst clamp = (value: number): number => {\n return Math.max(0, Math.min(255, value));\n};\n\nexport const 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 const 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 const 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 const 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 const getChangeset = (store: HexStore): ReadonlySet<BytePos> => {\n return store.changeset;\n};\n\nexport const 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 const createUndoRedoStack = (): UndoRedoStack => {\n return {\n undos: [],\n redos: [],\n };\n};\n\nexport const push = (stack: UndoRedoStack, diff: Diff): void => {\n stack.undos.push(diff);\n stack.redos = [];\n};\n\nexport const 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 const 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 const canUndo = (stack: UndoRedoStack): boolean => {\n return stack.undos.length > 0;\n};\n\nexport const canRedo = (stack: UndoRedoStack): boolean => {\n return stack.redos.length > 0;\n};\n","import type { BytePos, Selection, SingleSelection, ContiguousSelection, RectangularSelection } 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 const clampPos = (pos: BytePos, dataLength: number): BytePos => {\n return Math.max(0, Math.min(pos, dataLength - 1));\n};\n\nexport const getSelectedPositions = (\n sel: Selection,\n columns: number\n): readonly BytePos[] => {\n if (!sel) 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 const selectionContains = (\n sel: Selection,\n pos: BytePos,\n columns: number\n): boolean => {\n if (!sel) 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 const getCursorPos = (\n sel: Selection,\n dir: 'up' | 'down' | 'left' | 'right',\n columns: number,\n dataLength: number\n): 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 const moveSelection = (\n sel: Selection,\n dir: 'up' | 'down' | 'left' | 'right',\n columns: number,\n dataLength: number\n): SingleSelection => {\n const newPos = getCursorPos(sel, dir, columns, dataLength);\n return { kind: 'single', pos: newPos };\n};\n\nexport const extendContiguous = (\n sel: Selection,\n _dir: 'up' | 'down' | 'left' | 'right',\n columns: number,\n _dataLength: number,\n anchor: BytePos | null = null\n): 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 const extendRectangular = (\n sel: Selection,\n dir: 'up' | 'down' | 'left' | 'right',\n columns: number,\n _dataLength: number,\n anchorX: number = 0,\n anchorY: number = 0\n): 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 const selectionFromPointerRange = (\n start: BytePos,\n end: BytePos,\n mode: 'contiguous' | 'rectangular',\n columns: number\n): 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 { customElement, property, state } from 'lit/decorators.js';\n\nimport { repeat } from 'lit/directives/repeat.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { createShadeMap, getAsciiClass } from './colour.js';\n\nimport { applyDiff, clearChangeset, 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, extendContiguous, extendRectangular, getCursorPos, getSelectedPositions, moveSelection, selectionContains, selectionFromPointerRange } from './selection.js';\nimport { isContiguousSelection, isRectangularSelection } from './types.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 (!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":";;;;;;;AAMA,MAAM,mBAAmB,IAAI,IAAI;CAAC;CAAM;CAAM;CAAM;CAAM;CAAM;CAAK,CAAC;AAEtE,MAAM,iBAAiB,SAA0B;AAC/C,QAAO,OAAO,MAAQ,SAAS,KAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS;;AAGrG,MAAM,oBAAoB,SAA0B;AAClD,QAAO,QAAQ,MAAQ,QAAQ;;AAGjC,MAAa,iBAAiB,SAAyB;AACrD,KAAI,SAAS,EAAG,QAAO;AACvB,KAAI,iBAAiB,IAAI,KAAK,CAAE,QAAO;AACvC,KAAI,cAAc,KAAK,CAAE,QAAO;AAChC,KAAI,iBAAiB,KAAK,CAAE,QAAO;AACnC,QAAO;;AAGT,MAAa,kBACX,YACA,WACA,WACA,YACc;CAEd,MAAM,WADQA,eAAO,YAAY,WAAW,SAAS,EAAE,OAAO,IAAI,CAC5C,CAAC,IAAIA,eAAO,YAAY;AAC9C,QAAO,EACL,UAAU,SAAS;AACjB,MAAI,SAAS,EAAM,QAAO;AAC1B,MAAI,SAAS,IAAM,QAAO;AAC1B,SAAO,SAAS,QAAQ;IAE3B;;;;AC7BH,MAAa,kBAAkB,SAA+B;AAC5D,QAAO;EACL,MAAM,IAAI,WAAW,KAAK;EAC1B,2BAAW,IAAI,KAAc;EAC9B;;AAGH,MAAa,YAAY,OAAiB,QAAyB;AACjE,QAAO,MAAM,KAAK,QAAQ;;AAO5B,MAAa,UAAU,UAA4B;AACjD,QAAO,MAAM,KAAK;;AAGpB,MAAM,SAAS,UAA0B;AACvC,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,CAAC;;AAG1C,MAAa,aAAa,OAAiB,KAAc,UAAwB;CAC/E,MAAM,eAAe,MAAM,MAAM;CACjC,MAAM,SAAS,MAAM,KAAK;CAC1B,MAAM,OAAa,IAAI,IAAI,CAAC,CAAC,KAAK;EAAE;EAAQ,OAAO;EAAc,CAAC,CAAC,CAAC;AACpE,OAAM,KAAK,OAAO;AAClB,OAAM,UAAU,IAAI,IAAI;AACxB,QAAO;;AAGT,MAAa,cAAc,OAAiB,YAAgD;CAC1F,MAAM,uBAAO,IAAI,KAAiD;AAClE,SAAQ,SAAS,OAAO,QAAQ;EAC9B,MAAM,eAAe,MAAM,MAAM;EACjC,MAAM,SAAS,MAAM,KAAK;AAC1B,OAAK,IAAI,KAAK;GAAE;GAAQ,OAAO;GAAc,CAAC;AAC9C,QAAM,KAAK,OAAO;AAClB,QAAM,UAAU,IAAI,IAAI;GACxB;AACF,QAAO;;AAGT,MAAa,aAAa,OAAiB,SAAqB;CAC9D,MAAM,0BAAU,IAAI,KAAiD;AACrE,MAAK,SAAS,OAAO,QAAQ;EAC3B,MAAM,SAAS,MAAM,KAAK;AAC1B,UAAQ,IAAI,KAAK;GAAE,QAAQ,MAAM;GAAO,OAAO;GAAQ,CAAC;AACxD,QAAM,KAAK,OAAO,MAAM;AACxB,QAAM,UAAU,IAAI,IAAI;GACxB;AACF,QAAO;;AAGT,MAAa,eAAe,SAAqB;CAC/C,MAAM,2BAAW,IAAI,KAAiD;AACtE,MAAK,SAAS,OAAO,QAAQ;AAC3B,WAAS,IAAI,KAAK;GAAE,QAAQ,MAAM;GAAO,OAAO,MAAM;GAAQ,CAAC;GAC/D;AACF,QAAO;;AAGT,MAAa,gBAAgB,UAA0C;AACrE,QAAO,MAAM;;;;AChEf,MAAa,4BAA2C;AACtD,QAAO;EACL,OAAO,EAAE;EACT,OAAO,EAAE;EACV;;AAGH,MAAa,QAAQ,OAAsB,SAAqB;AAC9D,OAAM,MAAM,KAAK,KAAK;AACtB,OAAM,QAAQ,EAAE;;AAGlB,MAAa,QAAQ,UAA2C;CAC9D,MAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,KAAI,KACF,OAAM,MAAM,KAAK,KAAK;AAExB,QAAO;;AAGT,MAAa,QAAQ,UAA2C;CAC9D,MAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,KAAI,KACF,OAAM,MAAM,KAAK,KAAK;AAExB,QAAO;;;;AChCT,MAAa,eAAe,YAA4B,UAAU;AAElE,MAAM,OAAO,GAAW,MAAuB,IAAI,IAAI,IAAI;AAC3D,MAAM,OAAO,GAAW,MAAuB,IAAI,IAAI,IAAI;AAE3D,MAAa,YAAY,KAAc,eAAgC;AACrE,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,aAAa,EAAE,CAAC;;AAGnD,MAAa,wBACX,KACA,YACuB;AACvB,KAAI,CAAC,IAAK,QAAO,EAAE;CAEnB,MAAM,MAAM,YAAY,QAAQ;AAEhC,KAAI,IAAI,SAAS,SACf,QAAO,CAAC,IAAI,IAAI;AAGlB,KAAI,IAAI,SAAS,cAAc;EAC7B,MAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,IAAI;EACrC,MAAM,MAAM,IAAI,IAAI,OAAO,IAAI,IAAI;EACnC,MAAM,YAAuB,EAAE;AAC/B,OAAK,IAAI,IAAI,OAAO,KAAK,KAAK,IAC5B,WAAU,KAAK,EAAE;AAEnB,SAAO;;AAGT,KAAI,IAAI,SAAS,eAAe;EAC9B,MAAM,YAAuB,EAAE;AAC/B,OAAK,IAAI,MAAM,GAAG,MAAM,IAAI,QAAQ,MAClC,MAAK,IAAI,MAAM,GAAG,MAAM,IAAI,OAAO,OAAO;GACxC,MAAM,IAAI,IAAI,IAAI;GAClB,MAAM,IAAI,IAAI,IAAI;GAClB,MAAM,MAAM,IAAI,MAAM;AACtB,aAAU,KAAK,IAAI;;AAGvB,SAAO;;AAGT,QAAO,EAAE;;AAGX,MAAa,qBACX,KACA,KACA,YACY;AACZ,KAAI,CAAC,IAAK,QAAO;CAEjB,MAAM,MAAM,YAAY,QAAQ;AAEhC,KAAI,IAAI,SAAS,SACf,QAAO,QAAQ,IAAI;AAGrB,KAAI,IAAI,SAAS,cAAc;EAC7B,MAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,IAAI;EACrC,MAAM,MAAM,IAAI,IAAI,OAAO,IAAI,IAAI;AACnC,SAAO,OAAO,SAAS,OAAO;;AAGhC,KAAI,IAAI,SAAS,eAAe;EAC9B,MAAM,MAAM,KAAK,MAAM,MAAM,IAAI;EACjC,MAAM,MAAM,MAAM;EAClB,MAAM,IAAI,IAAI;EACd,MAAM,IAAI,IAAI;EACd,MAAM,QAAQ,IAAI;EAClB,MAAM,SAAS,IAAI;AACnB,SAAO,OAAO,KAAK,MAAM,IAAI,UAAU,OAAO,KAAK,MAAM,IAAI;;AAG/D,QAAO;;AAGT,MAAa,gBACX,KACA,KACA,SACA,eACY;CACZ,IAAI;AAEJ,KAAI,CAAC,IACH,cAAa;UACJ,IAAI,SAAS,SACtB,cAAa,IAAI;UACR,IAAI,SAAS,aACtB,cAAa,IAAI,IAAI,OAAO,IAAI,IAAI;UAC3B,IAAI,SAAS,cACtB,cAAa,IAAI,IAAI,YAAY,QAAQ,GAAG,IAAI,IAAI,IAAI,QAAQ;KAEhE,cAAa;CAGf,MAAM,MAAM,YAAY,QAAQ;CAChC,IAAI;AAEJ,SAAQ,KAAR;EACE,KAAK;AACH,YAAS,aAAa;AACtB;EACF,KAAK;AACH,YAAS,aAAa;AACtB;EACF,KAAK;AACH,YAAS,aAAa;AACtB;EACF,KAAK;AACH,YAAS,aAAa;AACtB;EACF,QACE,UAAS;;AAGb,QAAO,SAAS,QAAQ,WAAW;;AAGrC,MAAa,iBACX,KACA,KACA,SACA,eACoB;AAEpB,QAAO;EAAE,MAAM;EAAU,KADV,aAAa,KAAK,KAAK,SAAS,WACX;EAAE;;AAiCxC,MAAa,qBACX,KACA,KACA,SACA,aACA,UAAkB,GAClB,UAAkB,MACO;CACzB,MAAM,MAAM,YAAY,QAAQ;CAEhC,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AAEJ,KAAI,CAAC,OAAO,IAAI,SAAS,UAAU;EACjC,MAAM,MAAM,KAAK,SAAS,WAAW,IAAI,MAAM;AAC/C,MAAI,MAAM;AACV,MAAI,KAAK,MAAM,MAAM,IAAI;AACzB,UAAQ;AACR,WAAS;YACA,IAAI,SAAS,cAAc;EACpC,MAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,IAAI;EACrC,MAAM,MAAM,IAAI,IAAI,OAAO,IAAI,IAAI;AACnC,MAAI,QAAQ;AACZ,MAAI,KAAK,MAAM,QAAQ,IAAI;AAC3B,UAAQ,MAAM,QAAQ;AACtB,WAAS;YACA,IAAI,SAAS,eAAe;AACrC,MAAI,IAAI;AACR,MAAI,IAAI;AACR,UAAQ,IAAI;AACZ,WAAS,IAAI;QACR;AACL,MAAI;AACJ,MAAI;AACJ,UAAQ;AACR,WAAS;;CAGX,MAAM,mBAAmB,UAAU,KAAM,KAAK,SAAS,gBAAiB,UAAU;CAClF,MAAM,mBAAmB,UAAU,KAAM,KAAK,SAAS,gBAAiB,UAAU;AAElF,SAAQ,KAAR;EACE,KAAK;AACH,OAAI,IAAI,iBACN,UAAS;YACA,MAAM,oBAAoB,QAAQ,GAAG;AAC9C,SAAK;AACL,aAAS;cACA,IAAI,GAAG;AAChB,SAAK;AACL,aAAS;;AAEX;EACF,KAAK;AACH,OAAI,IAAI,QAAQ,IACd,UAAS;AAEX;EACF,KAAK;AACH,OAAI,IAAI,iBACN,WAAU;YACD,MAAM,oBAAoB,SAAS,GAAG;AAC/C,SAAK;AACL,cAAU;cACD,IAAI,GAAG;AAChB,SAAK;AACL,cAAU;;AAEZ;EACF,KAAK;AACH,aAAU;AACV;;AAGJ,QAAO;EAAE,MAAM;EAAe;EAAG;EAAG;EAAO;EAAQ;;AAGrD,MAAa,6BACX,OACA,KACA,MACA,YACc;CACd,MAAM,MAAM,YAAY,QAAQ;AAEhC,KAAI,SAAS,aAGX,QAAO;EACL,MAAM;EACN,OAJQ,IAAI,OAAO,IAIX;EACR,KAJQ,IAAI,OAAO,IAIb;EACP;CAGH,MAAM,SAAS,QAAQ;CACvB,MAAM,SAAS,KAAK,MAAM,QAAQ,IAAI;CACtC,MAAM,OAAO,MAAM;CACnB,MAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAOlC,QAAO;EAAE,MAAM;EAAe,GALpB,IAAI,QAAQ,KAKS;EAAE,GAJvB,IAAI,QAAQ,KAIY;EAAE,OAHtB,KAAK,IAAI,OAAO,OAAO,GAAG;EAGG,QAF5B,KAAK,IAAI,OAAO,OAAO,GAAG;EAEU;;;;ACvP9C,IAAA,uBAAA,MAAM,6BAA6B,WAAW;;;iBAEzC;sBAGmB;uBAGb;uBAGA;oBAGH;qBAGC;oBAGkB;oBAGX;oBAGkB;qBAGjB;mBAGgB;oBAGM;gBAE3B,eAAe,IAAI,WAAW,EAAE,CAAC;oBAC7B,qBAAqB;qBACD;oBACpB;oBACkB;qBACD;sBACf;sBACA;kCACY;kCACA;gCACO;6BACH;sBACH;0BACI;2BACI;oBAqPvB,MAAmB;GACtC,MAAM,SAAS,EAAE;AACjB,QAAK,aAAa,OAAO;AACzB,QAAK,eAAe;;qBAsIA,MAA2B;AAG/C,OAFwB;IAAC;IAAa;IAAc;IAAW;IAAY,CAAC,SAAS,EAAE,IAEpE,EAAE;AACnB,MAAE,gBAAgB;AAClB,MAAE,iBAAiB;AAEnB,QAAI,KAAK,WACP,MAAK,aAAa;IAGpB,MAAM,MAAM,EAAE,IAAI,QAAQ,SAAS,GAAG,CAAC,aAAa;IACpD,MAAM,UAAUC,OAAY,KAAK,OAAO;IACxC,MAAM,MAAM,YAAY,KAAK,QAAQ;AAErC,QAAI,EAAE,WAAW,EAAE,SAAS;AAC1B,SAAI,CAAC,KAAK,cAAc,KAAK,WAAW,SAAS,eAAe;MAC9D,IAAI,WAAW;AACf,UAAI,KAAK,YAAY,SAAS,SAC5B,YAAW,KAAK,WAAW;eAClB,KAAK,YAAY,SAAS,aACnC,YAAW,KAAK,IAAI,KAAK,WAAW,OAAO,KAAK,WAAW,IAAI;AAEjE,WAAK,2BAA2B,WAAW;AAC3C,WAAK,2BAA2B,KAAK,MAAM,WAAW,IAAI;AAC1D,WAAK,aAAa;OAAE,MAAM;OAAe,GAAG,KAAK;OAA0B,GAAG,KAAK;OAA0B,OAAO;OAAG,QAAQ;OAAG;;AAEpI,UAAK,aAAa,kBAAkB,KAAK,YAAY,KAAK,KAAK,SAAS,SAAS,KAAK,0BAA0B,KAAK,yBAAyB;eACrI,EAAE,UAAU;AACrB,SAAI,CAAC,KAAK,YAAY;AACpB,WAAK,yBAAyB;AAC9B,WAAK,sBAAsB;gBAClB,KAAK,WAAW,SAAS,UAAU;AAC5C,WAAK,yBAAyB,KAAK,WAAW;AAC9C,WAAK,sBAAsB,KAAK,WAAW;gBAClC,KAAK,WAAW,SAAS,eAAe;MACjD,MAAM,YAAY,KAAK,WAAW,IAAI,MAAM,KAAK,WAAW;AAC5D,WAAK,yBAAyB;AAC9B,WAAK,sBAAsB;;KAE7B,MAAM,SAAS,aAAa,KAAK,YAAY,KAAK,KAAK,SAAS,QAAQ;KACxE,MAAM,QAAQ,KAAK,IAAI,KAAK,wBAAwB,OAAO;KAC3D,MAAM,MAAM,KAAK,IAAI,KAAK,wBAAwB,OAAO;AACzD,UAAK,sBAAsB;AAC3B,UAAK,aAAa;MAAE,MAAM;MAAc;MAAO;MAAK;WAC/C;AACL,UAAK,aAAa,cAAc,KAAK,YAAY,KAAK,KAAK,SAAS,QAAQ;KAC5E,MAAM,MAAM,aAAa,KAAK,YAAY,KAAK,KAAK,SAAS,QAAQ;AACrE,UAAK,yBAAyB;AAC9B,UAAK,sBAAsB;;AAE7B,SAAK,sBAAsB;AAC3B,SAAK,eAAe;AACpB;;AAGF,OAAI,EAAE,QAAQ,OAAO;AACnB,MAAE,gBAAgB;AAClB,MAAE,iBAAiB;AACnB,QAAI,KAAK,WACP,MAAK,gBAAgB;SAChB;KACL,MAAM,UAAUA,OAAY,KAAK,OAAO;AACxC,UAAK,aAAa,cAAc,KAAK,YAAY,SAAS,KAAK,SAAS,QAAQ;AAChF,UAAK,sBAAsB;;AAE7B,SAAK,eAAe;AACpB;;AAGF,OAAI,EAAE,QAAQ,UAAU;AACtB,MAAE,gBAAgB;AAClB,MAAE,iBAAiB;AACnB,QAAI,KAAK,WACP,MAAK,aAAa;aACT,KAAK,cAAc,KAAK,WAAW,SAAS,UAAU;KAC/D,MAAM,MAAM,KAAK;KACjB,IAAI,WAAW;AACf,SAAK,IAAyB,SAAS,cAAc;MACnD,MAAM,IAAI;AACV,iBAAW,KAAK,IAAI,EAAE,OAAO,EAAE,IAAI;;AAErC,SAAK,IAAyB,SAAS,eAAe;MACpD,MAAM,IAAI;AACV,iBAAW,EAAE,IAAI,YAAY,KAAK,QAAQ,GAAG,EAAE;;AAEjD,UAAK,aAAa;MAAE,MAAM;MAAU,KAAK;MAAU;AACnD,UAAK,sBAAsB;;AAE7B,SAAK,eAAe;AACpB;;AAGF,OAAI,KAAK,YAAY;AACnB,MAAE,iBAAiB;AAEnB,QAAI,EAAE,QAAQ,aAAa;AACzB,UAAK,kBAAkB;AACvB;;AAGF,QAAI,EAAE,QAAQ,SAAS;AACrB,SAAI,KAAK,WAAW,SAAS,SAAS,KAAK,WAAW,QAAQ,WAAW,IAAI,CAC3E,MAAK,qBAAqB;AAE5B;;AAGF,QAAI,EAAE,IAAI,WAAW,EACnB,MAAK,kBAAkB,EAAE,IAAI;AAE/B;;AAGF,OAAI,KAAK,cAAc,KAAK,WAAW,SAAS,YAAY,EAAE,IAAI,WAAW,GAAG;AAC9E,MAAE,gBAAgB;AAClB,MAAE,iBAAiB;IACnB,MAAM,MAAM,KAAK,WAAW;IAC5B,MAAM,OAAuB,KAAK,cAAc;AAChD,SAAK,aAAa;KAAE;KAAK;KAAM,SAAS;KAAI;AAC5C,SAAK,kBAAkB,EAAE,IAAI;;;;;gBApfjB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4InB,QAAQ,MAAwB;AAC9B,OAAK,SAAS,eAAe,KAAK;AAClC,OAAK,aAAa,qBAAqB;AACvC,OAAK,aAAa;AAClB,OAAK,aAAa;AAClB,OAAK,aAAa;AAClB,OAAK,eAAe;;CAGtB,OAAa;EACX,MAAM,OAAOC,KAAS,KAAK,WAAW;AACtC,MAAI,CAAC,KACH;EACF,MAAM,UAAU,YAAY,KAAK;AACjC,YAAU,KAAK,QAAQ,QAAQ;AAC/B,OAAK,eAAe;;CAGtB,OAAa;EACX,MAAM,OAAOC,KAAS,KAAK,WAAW;AACtC,MAAI,CAAC,KACH;AACF,YAAU,KAAK,QAAQ,KAAK;AAC5B,OAAK,eAAe;;CAGtB,mBAAyB;EACvB,MAAM,QAAQ,iBAAiB,KAAK;EACpC,MAAM,QAAQ,MAAM,iBAAiB,eAAe,CAAC,MAAM,IAAI;EAC/D,MAAM,OAAO,MAAM,iBAAiB,cAAc,CAAC,MAAM,IAAI;EAC7D,MAAM,YAAY,MAAM,iBAAiB,qBAAqB,CAAC,MAAM,IAAI;EACzE,MAAM,UAAU,MAAM,iBAAiB,mBAAmB,CAAC,MAAM,IAAI;AACrE,OAAK,YAAY,eAAe,OAAO,MAAM,WAAW,QAAQ;AAChE,OAAK,eAAe;;CAGtB,CAAE,gBAA4F;EAC5F,MAAM,YAAY,qBAAqB,KAAK,YAAY,KAAK,QAAQ;AACrE,OAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;GACzC,MAAM,MAAM,UAAU;AACtB,SAAM;IACJ,iBAAiB;IACjB,aAAa;IACb,OAAO,SAAS,KAAK,QAAQ,IAAI;IAClC;;;CAIL,iBAAiB,KAAsB;AACrC,SAAO,kBAAkB,KAAK,YAAY,KAAgB,KAAK,QAAQ;;CAGzE,aAAa,UAAwB;AACnC,OAAK,aAAa;GAAE,MAAM;GAAU,KAAK;GAAqB;AAC9D,OAAK,sBAAsB;AAC3B,OAAK,eAAe;;CAGtB,iBAAiB,OAAe,KAAmB;AACjD,OAAK,aAAa;GAChB,MAAM;GACC;GACF;GACN;AACD,OAAK,sBAAsB;AAC3B,OAAK,eAAe;;CAGtB,kBAAkB,GAAW,GAAW,OAAe,QAAsB;AAC3E,OAAK,aAAa;GAChB,MAAM;GACN;GACA;GACA;GACA;GACD;AACD,OAAK,sBAAsB;AAC3B,OAAK,eAAe;;CAGtB,iBAAuB;AACrB,OAAK,aAAa;AAClB,OAAK,sBAAsB;AAC3B,OAAK,eAAe;;CAGtB,eAA0B;AACxB,SAAO,KAAK;;CAGd,eAAwC;EACtC,MAAM,YAAY,KAAK,YAAY,cAAc,oBAAoB;AACrE,MAAI,WAAW;AAKb,OAJe,gBAAgB,YAAY;AACzC,SAAK,cAAc,QAAQ,GAAG,YAAY;AAC1C,SAAK,eAAe;KAEpB,CAAC,QAAQ,UAAU;AACrB,QAAK,cAAc,UAAU;;AAE/B,OAAK,kBAAkB;;CASzB,eAAuB,KAAc,MAAsB,GAAuB;AAChF,IAAE,gBAAgB;AAClB,MAAI,EAAE,WAAW,EACf;AAEF,GAAC,KAAK,YAAY,cAAc,cAAc,GAAkB,OAAO;AACvE,OAAK,aAAa;AAEH,IAAE,OACV,kBAAkB,EAAE,UAAU;EAErC,MAAM,MAAM,YAAY,KAAK,QAAQ;EACrC,MAAM,SAAS,MAAM;EACrB,MAAM,SAAS,KAAK,MAAM,MAAM,IAAI;AAEpC,MAAI,EAAE,WAAW,EAAE,SAAS;AAC1B,QAAK,eAAe;AACpB,QAAK,cAAc;AACnB,QAAK,eAAe;AACpB,QAAK,eAAe;aACX,EAAE,UAAU;AACrB,QAAK,eAAe;AACpB,OAAI,CAAC,KAAK,cAAc,KAAK,WAAW,SAAS,SAC/C,MAAK,cAAc;QACd;AACL,SAAK,cAAc,KAAK,WAAW;AACnC,SAAK,oBAAoB;;SAEtB;AACL,QAAK,eAAe;AACpB,QAAK,aAAa;IAAE;IAAK,YAAY,SAAS,KAAK,QAAQ,IAAI;IAAE,QAAQ,EAAE;IAAS,QAAQ,EAAE;IAAS;AACvG,QAAK,cAAc;AACnB,QAAK,mBAAmB;;;CAI5B,eAAuB,KAAc,OAAuB,GAAuB;AACjF,MAAI,CAAC,KAAK,WACR;EAEF,MAAM,KAAK,KAAK,IAAI,EAAE,UAAU,KAAK,WAAW,OAAO;EACvD,MAAM,KAAK,KAAK,IAAI,EAAE,UAAU,KAAK,WAAW,OAAO;AAEvD,MAAI,KAAK,iBAAiB,aAAa,KAAK,KAAK,KAAK,IAAI;AACxD,QAAK,eAAe;AACpB,QAAK,aAAa;;AAGpB,MAAI,KAAK,iBAAiB,cAAc;GACtC,MAAM,QAAQ,KAAK,OAAO,EAAE,UAAU,KAAK,WAAW,UAAU,EAAE;GAClE,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,WAAW,aAAa,MAAM,CAAC;AAC/E,QAAK,mBAAmB,UAAU,KAAK,QAAQ,KAAK,SAAS;AAC7D,QAAK,eAAe;;AAGtB,MAAI,KAAK,iBAAiB;OACpB,KAAK,gBAAgB,MAAM;IAC7B,MAAM,OAAO;AACb,SAAK,aAAa,0BAA0B,KAAK,aAAa,KAAK,MAAM,KAAK,QAAQ;AACtF,SAAK,sBAAsB;;;AAI/B,MAAI,KAAK,iBAAiB,eAAe;GACvC,MAAM,MAAM,YAAY,KAAK,QAAQ;GACrC,MAAM,WAAW,MAAM;GACvB,MAAM,WAAW,KAAK,MAAM,MAAM,IAAI;GACtC,MAAM,IAAI,KAAK,IAAI,KAAK,cAAc,SAAS;GAC/C,MAAM,IAAI,KAAK,IAAI,KAAK,cAAc,SAAS;GAC/C,MAAM,QAAQ,KAAK,IAAI,WAAW,KAAK,aAAa,GAAG;GACvD,MAAM,SAAS,KAAK,IAAI,WAAW,KAAK,aAAa,GAAG;AACxD,QAAK,aAAa;IAAE,MAAM;IAAe;IAAG;IAAG;IAAO;IAAQ;AAC9D,QAAK,sBAAsB;;;CAI/B,aAAqB,KAAc,MAAsB,GAAuB;AAC/D,IAAE,OACV,sBAAsB,EAAE,UAAU;AAEzC,MAAI,KAAK,iBAAiB,WAAW;AACnC,QAAK,aAAa;IAAE,MAAM;IAAU;IAAK;AACzC,QAAK,yBAAyB;AAC9B,QAAK,sBAAsB;AAC3B,QAAK,aAAa;IAAE;IAAK;IAAM,SAAS;IAAI;AAC5C,QAAK,sBAAsB;;AAG7B,MAAI,KAAK,iBAAiB;OACpB,KAAK,gBAAgB,QAAQ,KAAK,sBAAsB,MAAM;AAChE,SAAK,aAAa;KAChB,MAAM;KACN,OAAO,KAAK;KACZ,KAAK,KAAK;KACX;AACD,SAAK,yBAAyB,KAAK,IAAI,KAAK,aAAa,KAAK,kBAAkB;AAChF,SAAK,sBAAsB,KAAK,IAAI,KAAK,aAAa,KAAK,kBAAkB;AAC7E,SAAK,sBAAsB;cAClB,KAAK,gBAAgB,MAAM;IACpC,MAAM,OAAO;AACb,SAAK,aAAa,0BAA0B,KAAK,aAAa,KAAK,MAAM,KAAK,QAAQ;AACtF,SAAK,yBAAyB,KAAK;AACnC,SAAK,sBAAsB;AAC3B,SAAK,sBAAsB;;;AAI/B,MAAI,KAAK,iBAAiB,eAAe;GACvC,MAAM,MAAM,YAAY,KAAK,QAAQ;GACrC,MAAM,WAAW,MAAM;GACvB,MAAM,WAAW,KAAK,MAAM,MAAM,IAAI;GACtC,MAAM,IAAI,KAAK,IAAI,KAAK,cAAc,SAAS;GAC/C,MAAM,IAAI,KAAK,IAAI,KAAK,cAAc,SAAS;GAC/C,MAAM,QAAQ,KAAK,IAAI,WAAW,KAAK,aAAa,GAAG;GACvD,MAAM,SAAS,KAAK,IAAI,WAAW,KAAK,aAAa,GAAG;AACxD,QAAK,aAAa;IAAE,MAAM;IAAe;IAAG;IAAG;IAAO;IAAQ;AAC9D,QAAK,sBAAsB;;AAG7B,MAAI,KAAK,iBAAiB,gBAAgB,KAAK,kBAAkB;AAC/D,QAAS,KAAK,YAAY,KAAK,iBAAiB;AAChD,QAAK,qBAAqB,KAAK,iBAAiB;;AAGlD,OAAK,eAAe;AACpB,OAAK,aAAa;AAClB,OAAK,cAAc;AACnB,OAAK,mBAAmB;AACxB,OAAK,oBAAoB;;CA+H3B,mBAAiC;AAC/B,MAAI,CAAC,KAAK,WACR;AACF,OAAK,aAAa;GAAE,GAAG,KAAK;GAAY,SAAS;GAAI;AACrD,OAAK,eAAe;;CAGtB,kBAA0B,KAAmB;AAC3C,MAAI,CAAC,KAAK,WACR;EAEF,MAAM,EAAE,KAAK,MAAM,YAAY,KAAK;AAEpC,MAAI,SAAS,QAAQ;AACnB,OAAI,IAAI,WAAW,KAAK,IAAI,WAAW,EAAE,IAAI,MAAQ,IAAI,WAAW,EAAE,IAAI,KAAM;IAC9E,MAAM,QAAQ,IAAI,WAAW,EAAE;IAC/B,MAAM,OAAO,UAAU,KAAK,QAAQ,KAAK,MAAM;AAC/C,SAAS,KAAK,YAAY,KAAK;AAC/B,SAAK,qBAAqB,KAAK;AAC/B,SAAK,gBAAgB;;AAEvB;;AAGF,MAAI,YAAY,MAAM,QAAQ,KAAK;AACjC,QAAK,aAAa;IAAE,GAAG,KAAK;IAAY,SAAS;IAAK;AACtD,QAAK,eAAe;AACpB;;AAGF,MAAI,QAAQ,WAAW,IAAI,EAAE;AAC3B,OAAI,KAAK,KAAK,IAAI,EAAE;IAClB,IAAI,aAAa,UAAU;AAC3B,QAAI,OAAO,WAAW,MAAM,EAAE,CAAC,GAAG,IAChC,cAAa;AAEf,SAAK,aAAa;KAAE,GAAG,KAAK;KAAY,SAAS;KAAY;AAC7D,SAAK,eAAe;;AAEtB;;AAIF,MAAI,yBAAS,SAAS,IAAI,EAAE;GAC1B,MAAM,cAAc,UAAU,IAAI,aAAa,EAAE,MAAM,GAAG;AAC1D,QAAK,aAAa;IAAE,GAAG,KAAK;IAAY,SAAS;IAAY;AAC7D,QAAK,eAAe;AAEpB,OAAI,WAAW,WAAW,GAAG;IAC3B,MAAM,QAAQ,OAAO,SAAS,YAAY,GAAG;IAC7C,MAAM,OAAO,UAAU,KAAK,QAAQ,KAAK,MAAM;AAC/C,SAAS,KAAK,YAAY,KAAK;AAC/B,SAAK,qBAAqB,KAAK;AAC/B,SAAK,gBAAgB;;aAEd,YAAY,IAAI;AACzB,QAAK,aAAa;IAAE,GAAG,KAAK;IAAY,SAAS;IAAI;AACrD,QAAK,eAAe;;;CAIxB,sBAAoC;AAClC,MAAI,CAAC,KAAK,WACR;EACF,MAAM,QAAQ,OAAO,SAAS,KAAK,WAAW,QAAQ,MAAM,EAAE,EAAE,GAAG;AACnE,MAAI,CAAC,MAAM,MAAM,EAAE;GACjB,MAAM,OAAO,UAAU,KAAK,QAAQ,KAAK,WAAW,KAAK,MAAM;AAC/D,QAAS,KAAK,YAAY,KAAK;AAC/B,QAAK,qBAAqB,KAAK;AAC/B,QAAK,gBAAgB;;;CAIzB,iBAA+B;AAC7B,MAAI,CAAC,KAAK,WACR;EACF,MAAM,UAAUF,OAAY,KAAK,OAAO;EACxC,MAAM,SAAS,SAAS,KAAK,WAAW,MAAM,GAAG,QAAQ;AACzD,OAAK,aAAa;GAAE,KAAK;GAAQ,MAAM,KAAK,WAAW;GAAM,SAAS;GAAI;AAC1E,OAAK,aAAa;GAAE,MAAM;GAAU,KAAK;GAAQ;AACjD,OAAK,eAAe;;CAGtB,qBAA6B,MAAkB;AAC7C,OAAK,cAAc,IAAI,YAAY,cAAc;GAC/C,QAAQ,EAAE,MAAM;GAChB,SAAS;GACT,UAAU;GACX,CAAC,CAAC;;CAGL,uBAAqC;EACnC,MAAM,MAAM,KAAK;EACjB,IAAI;AAEJ,MAAI,CAAC,IACH,UAAS,EAAE,MAAM,QAAQ;WAChB,IAAI,SAAS,SACtB,UAAS;GAAE,MAAM;GAAU,UAAU,IAAI;GAAK;WACrC,IAAI,SAAS,aACtB,UAAS;GAAE,MAAM;GAAc,OAAO,IAAI;GAAO,KAAK,IAAI;GAAK;WACtD,IAAI,SAAS,cACtB,UAAS;GAAE,MAAM;GAAe,GAAG,IAAI;GAAG,GAAG,IAAI;GAAG,OAAO,IAAI;GAAO,QAAQ,IAAI;GAAQ;MAE1F,UAAS,EAAE,MAAM,QAAQ;AAG3B,OAAK,cAAc,IAAI,YAAY,UAAU;GAC3C;GACA,SAAS;GACT,UAAU;GACX,CAAC,CAAC;;CAGL,QAAsB;EACpB,MAAM,YAAY,qBAAqB,KAAK,YAAY,KAAK,QAAQ;AACrE,MAAI,UAAU,WAAW,EACvB;EAEF,MAAM,QAAQ,UAAU,KAAK,MAAe,SAAS,KAAK,QAAQ,EAAE,CAAC;AACrE,OAAK,cAAc,IAAI,WAAW,MAAM;EAExC,MAAM,SAAS,MAAM,KAAK,MAAc,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI;AAClF,YAAU,WAAW,UAAU,OAAO,CAAC,YAAY,GAAG;;CAGxD,MAAc,SAAwB;EACpC,IAAI,QAAyB;AAE7B,MAAI;GACF,MAAM,OAAO,MAAM,UAAU,WAAW,UAAU;AAClD,OAAI,KACF,SAAQ,KAAK,gBAAgB,KAAK;UAE9B;AAIR,MAAI,CAAC,SAAS,KAAK,YACjB,SAAQ,MAAM,KAAK,KAAK,YAAY;AAGtC,MAAI,CAAC,SAAS,MAAM,WAAW,EAC7B;AAEF,MAAI,CAAC,KAAK,WACR;EAEF,MAAM,0BAAU,IAAI,KAAsB;AAE1C,MAAI,KAAK,WAAW,SAAS,UAAU;GACrC,MAAM,WAAW,KAAK,WAAW;GACjC,MAAM,UAAUA,OAAY,KAAK,OAAO;AACxC,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,UAAU,WAAW,IAAI,SAAS,IAC1D,SAAQ,IAAI,WAAW,GAAG,MAAM,GAAG;aAE5B,KAAK,WAAW,SAAS,cAAc;GAChD,MAAM,WAAW,KAAK,IAAI,KAAK,WAAW,OAAO,KAAK,WAAW,IAAI;GAErE,MAAM,YADS,KAAK,IAAI,KAAK,WAAW,OAAO,KAAK,WAAW,IACvC,GAAG,WAAW;AACtC,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,MAAM,QAAQ,UAAU,EAAE,IACrD,SAAQ,IAAI,WAAW,GAAG,MAAM,GAAG;aAE5B,KAAK,WAAW,SAAS,eAAe;GACjD,MAAM,EAAE,GAAG,GAAG,OAAO,WAAW,KAAK;GACrC,MAAM,MAAM,YAAY,KAAK,QAAQ;GACrC,IAAI,UAAU;AACd,QAAK,IAAI,MAAM,GAAG,MAAM,UAAU,UAAU,MAAM,QAAQ,MACxD,MAAK,IAAI,MAAM,GAAG,MAAM,SAAS,UAAU,MAAM,QAAQ,OAAO;IAC9D,MAAM,OAAO,IAAI,OAAO,MAAM,IAAI;AAClC,YAAQ,IAAI,KAAK,MAAM,WAAW;;;AAKxC,MAAI,QAAQ,OAAO,GAAG;GACpB,MAAM,OAAO,WAAW,KAAK,QAAQ,QAAQ;AAC7C,QAAS,KAAK,YAAY,KAAK;AAC/B,QAAK,qBAAqB,KAAK;AAC/B,QAAK,eAAe;;;CAIxB,gBAAwB,MAAwB;EAC9C,MAAM,QAAkB,EAAE;EAC1B,MAAM,UAAU,KAAK,QAAQ,eAAe,IAAI,CAAC,MAAM;AACvD,MAAI,CAAC,QACH,QAAO;EAET,MAAM,QAAQ,QAAQ,MAAM,MAAM;AAClC,OAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,WAAW,EAClB,OAAM,KAAK,OAAO,SAAS,OAAO,MAAM,GAAG,CAAC;WACnC,KAAK,WAAW,EACzB,OAAM,KAAK,OAAO,SAAS,MAAM,GAAG,CAAC;AAGzC,SAAO;;CAGT,iBAAmC;EACjC,MAAM,UAAoB,EAAE;AAC5B,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,KAAK;GACrC,MAAM,SAAS,IAAI;AACnB,WAAQ,KAAK,IAAI,OAAO,SAAS,GAAG,CAAC,aAAa,GAAG;;AAEvD,SAAO;;CAGT,aAAqB,KAAuB;EAC1C,MAAM,MAAM,KAAK;AACjB,MAAI,CAAC,OAAO,IAAI,SAAS,SACvB,QAAO;EACT,MAAM,MAAM,YAAY,KAAK,QAAQ;AAGrC,SAFY,KAAK,MAAM,MAAM,IAEnB,KADK,KAAK,MAAM,IAAI,MAAM,IACf;;CAGvB,aAAqB,KAAuB;AAC1C,SAAO,KAAK,aAAa,IAAI;;CAG/B,cAAsB,KAAuB;AAC3C,SAAO,KAAK,aAAa,IAAI;;CAG/B,SAAmB;EACjB,MAAM,UAAUA,OAAY,KAAK,OAAO;EACxC,MAAM,MAAM,YAAY,KAAK,QAAQ;EACrC,MAAM,YAAY,KAAK,KAAK,UAAU,IAAI;EAC1C,MAAM,aAAa,KAAK,cAAc,IAAI,KAAK,cAAc;EAC7D,MAAM,WAAW,KAAK,MAAM,KAAK,aAAa,KAAK,WAAW;EAC9D,MAAM,SAAS,KAAK,IAAI,WAAW,KAAK,KAAK,aAAa,KAAK,WAAW,GAAG,GAAG,UAAU;EAC1F,MAAM,kBAAkB,WAAW,KAAK;EACxC,MAAM,mBAAmB,YAAY,UAAU,KAAK;EACpD,MAAM,YAAY,aAAa,KAAK,OAAO;EAE3C,MAAM,aAAa,KAAK,gBAAgB;EACxC,MAAM,YAAY,KAAK,eAAe,SAAS,KAAK,eAAe;EACnE,MAAM,aAAa,KAAK,eAAe;AAEvC,SAAO,IAAI;sDACuC,KAAK,WAAW,uBAAuB,GAAG;;YAEpF,KAAK,gBAAgB,OAAO,IAAI,0CAA0C;YAC1E,KAAK,aAAa,OAAO,OAAO,aAAY,MAAK,IAAI,2BAA2B,YAAY,WAAW,GAAG,IAAI,EAAE,SAAS,CAAC;YAC1H,KAAK,cAAc,OAAO,IAAI,4BAA4B,aAAa,WAAW,GAAG,eAAe;;gDAEhE,KAAK,UAAU;gCAC/B,gBAAgB;YACpC,OACA,MAAM,KAAK,EAAE,QAAQ,SAAS,UAAU,GAAG,GAAG,MAAM,WAAW,EAAE,GACjE,aAAY,WACZ,aAAY,KAAK,WAAW,UAAU,UAAU,CACjD,CAAC;gCACoB,gBAAgB;;;;;CAM9C,WAAmB,UAAkB,WAAiC;EACpE,MAAM,MAAM,YAAY,KAAK,QAAQ;EACrC,MAAM,SAAS,WAAW;AAE1B,SAAO,IAAI;kCACmB,SAAS;UACjC,KAAK,gBAAgB,OAAO,IAAI,6BAA6B,OAAO,SAAS,GAAG,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;UACzH,KAAK,aACH,OACA,OACE,MAAM,KAAK,EAAE,QAAQ,KAAK,SAAS,GAAG,GAAG,MAAM,EAAE,GACjD,aAAY,WACZ,aAAY,KAAK,cAAc,UAAU,UAAU,UAAU,CAC9D,CAAC;UACJ,KAAK,cACH,OACA,IAAI;;cAEF,OACA,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,GAAG,MAAM,EAAE,GACxC,MAAK,IACL,MAAK,KAAK,gBAAgB,SAAS,GAAG,UAAU,CACjD,CAAC;;UAEJ;;;;CAKR,cAAsB,UAAkB,UAAkB,WAAiC;EAEzF,MAAM,UAAU,WADJ,YAAY,KAAK,QACC,GAAG,WAAW;AAE5C,SAAO,IAAI;;UAEL;GAAC;GAAG;GAAG;GAAG;GAAE,CAAC,KAAI,MAAK,KAAK,eAAe,UAAU,GAAG,UAAU,CAAC,CAAC;;;;CAK3E,eAAuB,KAAc,WAAiC;AAEpE,MAAI,OADYA,OAAY,KAAK,OACf,CAChB,QAAO,IAAI;EAGb,MAAM,OAAO,SAAS,KAAK,QAAQ,IAAI;EACvC,MAAM,SAAS,KAAK,SAAS,GAAG,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI;EAE/D,MAAM,aAAa,kBAAkB,KAAK,YAAY,KAAK,KAAK,QAAQ;EACxE,MAAM,YAAY,KAAK,iBAAiB,UAAU,IAAI,IAAI;EAC1D,MAAM,YAAY,KAAK,YAAY,QAAQ;EAE3C,MAAM,UAAoB,CAAC,WAAW;AACtC,MAAI,WACF,SAAQ,KAAK,WAAW;AAC1B,MAAI,UACF,SAAQ,KAAK,UAAU;AACzB,MAAI,UACF,SAAQ,KAAK,UAAU;AACzB,MAAI,KAAK,aAAa,IAAI,CACxB,SAAQ,KAAK,SAAS;EAExB,IAAI,cAAc;EAClB,IAAI;AAEJ,MAAI,aAAa,KAAK,WACpB,eAAc,KAAK,WAAW,YAAY,KAAK,SAAS,GAAG,KAAK,WAAW,QAAQ;AAGrF,MAAI,KAAK,iBAAiB,WAAW,KAAK,UACxC,eAAc,EAAE,OAAO,KAAK,UAAU,QAAQ,KAAK,EAAE;WAC5C,KAAK,iBAAiB,QAC/B,SAAQ,KAAK,cAAc,KAAK,CAAC;AAGnC,SAAO,IAAI;;gBAEC,QAAQ,KAAK,IAAI,CAAC;gBAClB,SAAS,eAAe,EAAE,CAAC,CAAC;wBACpB,MAAoB,KAAK,eAAe,KAAK,OAAO,EAAE,CAAC;sBACzD,MAAoB,KAAK,aAAa,KAAK,OAAO,EAAE,CAAC;wBACnD,MAAoB,KAAK,eAAe,KAAK,OAAO,EAAE,CAAC;SACtE,YAAY;;;CAInB,gBAAwB,KAAc,WAAiC;AAErE,MAAI,OADYA,OAAY,KAAK,OACf,CAChB,QAAO,IAAI;EAGb,MAAM,OAAO,SAAS,KAAK,QAAQ,IAAI;EACvC,MAAM,OAAO,QAAQ,MAAQ,QAAQ,MAAO,OAAO,aAAa,KAAK,GAAG;EAExE,MAAM,aAAa,kBAAkB,KAAK,YAAY,KAAK,KAAK,QAAQ;EACxE,MAAM,YAAY,KAAK,iBAAiB,UAAU,IAAI,IAAI;EAE1D,MAAM,UAAoB,CAAC,YAAY;AACvC,MAAI,WACF,SAAQ,KAAK,WAAW;AAC1B,MAAI,UACF,SAAQ,KAAK,UAAU;AACzB,MAAI,KAAK,cAAc,IAAI,CACzB,SAAQ,KAAK,SAAS;EAExB,IAAI;AAEJ,MAAI,KAAK,iBAAiB,WAAW,KAAK,UACxC,eAAc,EAAE,OAAO,KAAK,UAAU,QAAQ,KAAK,EAAE;WAC5C,KAAK,iBAAiB,QAC/B,SAAQ,KAAK,cAAc,KAAK,CAAC;AAGnC,SAAO,IAAI;;gBAEC,QAAQ,KAAK,IAAI,CAAC;gBAClB,SAAS,eAAe,EAAE,CAAC,CAAC;wBACpB,MAAoB,KAAK,eAAe,KAAK,QAAQ,EAAE,CAAC;sBAC1D,MAAoB,KAAK,aAAa,KAAK,QAAQ,EAAE,CAAC;wBACpD,MAAoB,KAAK,eAAe,KAAK,QAAQ,EAAE,CAAC;SACvE,KAAK;;;;YA56BX,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,qBAAA,WAAA,WAAA,KAAA,EAAA;YAG1B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,qBAAA,WAAA,gBAAA,KAAA,EAAA;YAG1B,SAAS,EAAE,MAAM,SAAS,CAAC,CAAA,EAAA,qBAAA,WAAA,iBAAA,KAAA,EAAA;YAG3B,SAAS;CAAE,MAAM;CAAS,WAAW;CAAmB,CAAC,CAAA,EAAA,qBAAA,WAAA,iBAAA,KAAA,EAAA;YAGzD,SAAS;CAAE,MAAM;CAAS,WAAW;CAAgB,CAAC,CAAA,EAAA,qBAAA,WAAA,cAAA,KAAA,EAAA;YAGtD,SAAS;CAAE,MAAM;CAAS,WAAW;CAAiB,CAAC,CAAA,EAAA,qBAAA,WAAA,eAAA,KAAA,EAAA;YAGvD,OAAO,CAAA,EAAA,qBAAA,WAAA,cAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,qBAAA,WAAA,cAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,qBAAA,WAAA,cAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,qBAAA,WAAA,eAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,qBAAA,WAAA,aAAA,KAAA,EAAA;YAGP,OAAO,CAAA,EAAA,qBAAA,WAAA,cAAA,KAAA,EAAA;mCAnCT,cAAc,kBAAkB,CAAA,EAAA,qBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"highlight-CAjwQ4GE.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) 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) continue;\n\n const textNode = findTextNode(element, text);\n if (!textNode) 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) 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) continue;\n const positions = positionsByItem.get(item);\n if (!positions || positions.size === 0) continue;\n targets.push({ element: el, text: getText(el), positions });\n }\n\n return targets;\n}\n\nconst 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,EAAE,EACxB;AACN,KAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,WAAY;CAEnD,MAAM,MAAM,QAAQ,OAAO;AAC3B,KAAI,WAAW,OAAO,IAAI;CAE1B,MAAM,SAAkB,EAAE;AAE1B,MAAK,MAAM,EAAE,SAAS,MAAM,eAAe,SAAS;AAClD,MAAI,CAAC,UAAU,KAAM;EAErB,MAAM,WAAW,aAAa,SAAS,KAAK;AAC5C,MAAI,CAAC,SAAU;AAEf,OAAK,MAAM,OAAO,WAAW;GAC3B,MAAM,QAAQ,IAAI,OAAO;AACzB,SAAM,SAAS,UAAU,IAAI;AAC7B,SAAM,OAAO,UAAU,MAAM,EAAE;AAC/B,UAAO,KAAK,MAAM;;;AAItB,KAAI,OAAO,SAAS,EAClB,KAAI,WAAW,IAAI,KAAK,IAAI,UAAU,GAAG,OAAO,CAAC;;AAIrD,SAAgB,gBAAgB,UAA4B,EAAE,EAAQ;AACpE,KAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,WAAY;AACnD,KAAI,WAAW,OAAO,QAAQ,OAAO,YAAY;;AAGnD,SAAgB,sBACd,MACA,cACA,iBACA,SACA,SACmB;CACnB,MAAM,UAA6B,EAAE;CACrC,MAAM,WAAW,KAAK,iBAAiB,aAAa;AAEpD,MAAK,MAAM,MAAM,UAAU;EACzB,MAAM,OAAO,QAAQ,GAAG;AACxB,MAAI,SAAS,KAAA,EAAW;EACxB,MAAM,YAAY,gBAAgB,IAAI,KAAK;AAC3C,MAAI,CAAC,aAAa,UAAU,SAAS,EAAG;AACxC,UAAQ,KAAK;GAAE,SAAS;GAAI,MAAM,QAAQ,GAAG;GAAE;GAAW,CAAC;;AAG7D,QAAO;;AAGT,MAAM,gBAAgB,SAAkB,iBAAuC;AAC7E,MAAK,MAAM,QAAQ,QAAQ,WACzB,KAAI,KAAK,aAAa,KAAK;MACrB,iBAAiB,KAAA,KAAa,KAAK,gBAAgB,aACrD,QAAO;;AAIb,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icon-BR5aTIiP.js","names":["#onIconChange"],"sources":["../src/icons/icon.ts"],"sourcesContent":["import type { IconChangedEvent } from './registry.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.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 = 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"],"mappings":";;;;;;;AAmBO,IAAA,kBAAA,MAAM,wBAAwB,WAAW;;;cAC3B;eAEC;oBAC+C;gBACM;wBAExD,MAAmB;AAClC,OAAK,EAAuB,OAAO,SAAS,KAAK,KAC/C,MAAK,eAAe;;;CAFxB;CAMA,oBAAmC;AACjC,QAAM,mBAAmB;AACzB,UAAQ,iBAAiB,oBAAoB,MAAA,aAAmB;;CAGlE,uBAAsC;AACpC,QAAM,sBAAsB;AAC5B,UAAQ,oBAAoB,oBAAoB,MAAA,aAAmB;;CAGrE,SAA4B;EAC1B,MAAM,MAAM,QAAQ,KAAK,KAAK;AAC9B,MAAI,CAAC,IACH,QAAO;EAET,MAAM,WAAW,KAAK,MAAM,SAAS;AAErC,SAAO,IAAI;;;sBAGO,WAAW,UAAU,OAAO;qBAC7B,WAAW,KAAK,QAAQ,QAAQ;SAC5C,WAAW,IAAI,CAAC;;;CAIvB,QAA2B,SAAqC;AAC9D,QAAM,QAAQ,QAAQ;AACtB,MAAI,QAAQ,IAAI,SAAS,CACvB,KAAI,KAAK,QAAQ,SAAS,EACxB,MAAK,MAAM,YAAY,YAAY,KAAK,OAAO;MAE/C,MAAK,MAAM,eAAe,WAAW;;;gBAKlB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAjD3B,UAAU,CAAA,EAAA,gBAAA,WAAA,QAAA,KAAA,EAAA;YACV,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,gBAAA,WAAA,QAAA,KAAA,EAAA;YAC1B,UAAU,CAAA,EAAA,gBAAA,WAAA,SAAA,KAAA,EAAA;YACV,SAAS;CAAE,MAAM;CAAS,WAAW;CAAc,CAAC,CAAA,EAAA,gBAAA,WAAA,cAAA,KAAA,EAAA;YACpD,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAU,SAAS;CAAM,CAAC,CAAA,EAAA,gBAAA,WAAA,UAAA,KAAA,EAAA;8BANhE,cAAc,YAAY,CAAA,EAAA,gBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icon-DQKdfR7U.d.ts","names":[],"sources":["../src/icons/icon.ts"],"mappings":";;;;;;;AAkBA;;;;;;;;cACa,eAAA,SAAwB,UAAA;EAAA;EACvB,IAAA;EACgB,IAAA;EAChB,KAAA;EAC0C,UAAA;EACU,MAAA;EAQvD,iBAAA,CAAA;EAKA,oBAAA,CAAA;EAAA,UAKU,MAAA,CAAA,UAAM,OAAA,GAAA,KAAA,CAAA,cAAA;EAAA,UAgBN,OAAA,CAAQ,OAAA,EAAS,GAAA;EAAA,OAWpB,MAAA,EAXuB,KAAA,CAWjB,SAAA;AAAA;AAAA,QAsChB,MAAA;EAAA,UACI,qBAAA;IACR,WAAA,EAAa,eAAA;EAAA;AAAA"}
|