@ixfx/components 0.4.3 → 0.4.4
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 +395 -1176
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +7699 -20648
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +12 -7
- package/dist/ac-text.d.ts.map +1 -1
- package/dist/ac-text.js +2 -3
- package/dist/ac-text.js.map +1 -1
- package/dist/{button-C3fLMKUv.js → button-DxYee1ZH.js} +2 -2
- package/dist/{button-C3fLMKUv.js.map → button-DxYee1ZH.js.map} +1 -1
- package/dist/button.d.ts +1 -2
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -2
- package/dist/checkbox.d.ts +0 -1
- package/dist/checkbox.d.ts.map +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/checkbox.js.map +1 -1
- package/dist/{colour-picker-0sgAha1T.js → colour-picker-BacNRabo.js} +14 -16
- package/dist/colour-picker-BacNRabo.js.map +1 -0
- package/dist/colour-picker.d.ts +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +5 -2
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +45 -20
- 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 +25 -23
- package/dist/data-display.js.map +1 -1
- package/dist/{data-provider-DgI909FP.js → data-provider-35TyWclX.js} +2 -2
- package/dist/data-provider-35TyWclX.js.map +1 -0
- package/dist/{decorate-DdjvVHS-.js → decorate-VRK8rslU.js} +2 -2
- package/dist/{decorate-DdjvVHS-.js.map → decorate-VRK8rslU.js.map} +1 -1
- package/dist/editable-label.d.ts +1 -2
- package/dist/editable-label.d.ts.map +1 -1
- package/dist/editable-label.js +1 -1
- package/dist/editable-label.js.map +1 -1
- package/dist/{hex-editor-WZrjRtvL.js → hex-editor-Bk6rxhfg.js} +9 -11
- package/dist/hex-editor-Bk6rxhfg.js.map +1 -0
- package/dist/{hex-editor-CMIxtNgT.d.ts → hex-editor-Caq8vNQk.d.ts} +2 -3
- package/dist/hex-editor-Caq8vNQk.d.ts.map +1 -0
- package/dist/hex.d.ts +1 -1
- package/dist/hex.js +1 -1
- package/dist/highlight-B-eQrhhb.js.map +1 -1
- package/dist/{icon-Ndo40kNO.js → icon-B22XVlCt.js} +6 -4
- package/dist/{icon-Ndo40kNO.js.map → icon-B22XVlCt.js.map} +1 -1
- package/dist/{icon-Bd5BiU4b.d.ts → icon-DpA9x2Ve.d.ts} +2 -3
- package/dist/icon-DpA9x2Ve.d.ts.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +1 -1
- package/dist/{incr-search-CeERfijK.js → incr-search-2pz21xtR.js} +9 -6
- package/dist/incr-search-2pz21xtR.js.map +1 -0
- package/dist/incr-search.d.ts +1 -1
- package/dist/incr-search.js +1 -1
- package/dist/{index-CowKi2mo.d.ts → index-BeuCXtiO.d.ts} +3 -4
- package/dist/index-BeuCXtiO.d.ts.map +1 -0
- package/dist/{index-D87kRcEs.d.ts → index-BtGFYfaK.d.ts} +2 -1
- package/dist/index-BtGFYfaK.d.ts.map +1 -0
- package/dist/{index-s_IhSnwc.d.ts → index-CoqtMSd9.d.ts} +6 -4
- package/dist/index-CoqtMSd9.d.ts.map +1 -0
- package/dist/{index-9fGVAg1d.d.ts → index-Cxwxtj6g.d.ts} +3 -3
- package/dist/index-Cxwxtj6g.d.ts.map +1 -0
- package/dist/index-D_ftz_IT.d.ts +184 -0
- package/dist/index-D_ftz_IT.d.ts.map +1 -0
- package/dist/{index-_RTQSKHi.d.ts → index-DfEkTGvT.d.ts} +11 -11
- package/dist/index-DfEkTGvT.d.ts.map +1 -0
- package/dist/index.d.ts +44 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +304 -3075
- package/dist/index.js.map +1 -1
- package/dist/keyboard-B5xD7Fz-.js +36 -0
- package/dist/keyboard-B5xD7Fz-.js.map +1 -0
- package/dist/{labelled-input-base-ORb1rGq6.d.ts → labelled-input-base-DiTme1JO.d.ts} +1 -2
- package/dist/labelled-input-base-DiTme1JO.d.ts.map +1 -0
- package/dist/{labelled-input-base-9K_w3oLj.js → labelled-input-base-hoKGwyKT.js} +2 -2
- package/dist/{labelled-input-base-9K_w3oLj.js.map → labelled-input-base-hoKGwyKT.js.map} +1 -1
- package/dist/labelled-radial-input.d.ts +5 -4
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-radial-input.js +7 -3
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +27 -3
- package/dist/labelled-range-input.js.map +1 -1
- package/dist/led.d.ts +1 -2
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +1 -1
- package/dist/led.js.map +1 -1
- package/dist/{menu-vjoiHZ13.js → menu-g6yd7ddN.js} +8 -9
- package/dist/menu-g6yd7ddN.js.map +1 -0
- package/dist/{menu-item-COx-Azgj.d.ts → menu-item-DSyf9f_L.d.ts} +4 -4
- package/dist/menu-item-DSyf9f_L.d.ts.map +1 -0
- package/dist/{menu-item-BrIuORYD.js → menu-item-NUKwJ4s5.js} +3 -4
- package/dist/{menu-item-BrIuORYD.js.map → menu-item-NUKwJ4s5.js.map} +1 -1
- package/dist/menu.d.ts +2 -2
- package/dist/menu.js +2 -2
- package/dist/miller.d.ts +8 -5
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +22 -24
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.d.ts +7 -3
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +73 -47
- package/dist/narrowed-text.js.map +1 -1
- package/dist/panel.d.ts +1 -1
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +2 -2
- package/dist/panel.js.map +1 -1
- package/dist/plots.d.ts +2 -2
- package/dist/plots.js +1 -1
- package/dist/polar-pad.d.ts +15 -3
- package/dist/polar-pad.d.ts.map +1 -1
- package/dist/polar-pad.js +64 -11
- package/dist/polar-pad.js.map +1 -1
- package/dist/{radial-input-CpQPs1Mp.d.ts → radial-input-DXMN55Nz.d.ts} +6 -4
- package/dist/radial-input-DXMN55Nz.d.ts.map +1 -0
- package/dist/{radial-input-DZ7eQCcM.js → radial-input-DxCrt_NE.js} +41 -19
- package/dist/radial-input-DxCrt_NE.js.map +1 -0
- package/dist/radial-input.d.ts +1 -1
- package/dist/radial-input.js +1 -1
- package/dist/range-input.d.ts +15 -4
- package/dist/range-input.d.ts.map +1 -1
- package/dist/range-input.js +23 -2
- package/dist/range-input.js.map +1 -1
- package/dist/range.d.ts +15 -4
- package/dist/range.d.ts.map +1 -1
- package/dist/range.js +23 -2
- package/dist/range.js.map +1 -1
- package/dist/selecthorizontal.d.ts +1 -2
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +1 -1
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/slider-input-DFpG23bS.js +1592 -0
- package/dist/slider-input-DFpG23bS.js.map +1 -0
- package/dist/slider-input-XppH3vcy.d.ts +160 -0
- package/dist/slider-input-XppH3vcy.d.ts.map +1 -0
- package/dist/slider-input.d.ts +2 -0
- package/dist/slider-input.js +2 -0
- package/dist/snap-container.d.ts +1 -2
- package/dist/snap-container.d.ts.map +1 -1
- package/dist/snap-container.js +6 -5
- package/dist/snap-container.js.map +1 -1
- package/dist/split-layout.d.ts +1 -2
- package/dist/split-layout.d.ts.map +1 -1
- package/dist/split-layout.js +6 -4
- package/dist/split-layout.js.map +1 -1
- package/dist/swipe.d.ts +12 -2
- package/dist/swipe.d.ts.map +1 -1
- package/dist/swipe.js +22 -3
- package/dist/swipe.js.map +1 -1
- package/dist/{tab-list-DLzb-m-I.d.ts → tab-list-BohmbvqF.d.ts} +14 -5
- package/dist/tab-list-BohmbvqF.d.ts.map +1 -0
- package/dist/tab-list-DzknpdSo.js +592 -0
- package/dist/tab-list-DzknpdSo.js.map +1 -0
- package/dist/tabs.d.ts +2 -2
- package/dist/tabs.js +1 -208
- package/dist/{tickled-controller-BjYCzGrU.d.ts → tickled-controller-BF2Ea0DE.d.ts} +2 -31
- package/dist/tickled-controller-BF2Ea0DE.d.ts.map +1 -0
- package/dist/tickled-styles-fNDdqf6l.js.map +1 -1
- package/dist/{timeline-2OFtN4Ta.js → timeline-B2fgDL4U.js} +37 -1438
- package/dist/timeline-B2fgDL4U.js.map +1 -0
- package/dist/timeline.d.ts +1 -1
- package/dist/timeline.js +1 -1
- package/dist/{tooltip-RGVIwHrZ.d.ts → tooltip-BlvBUQxx.d.ts} +3 -3
- package/dist/tooltip-BlvBUQxx.d.ts.map +1 -0
- package/dist/{tree-D84RUgFC.js → tree-BnvzhsAw.js} +8 -9
- package/dist/tree-BnvzhsAw.js.map +1 -0
- package/dist/{tree-component-BaCSPWg1.d.ts → tree-component-DCmmKZ4j.d.ts} +8 -124
- package/dist/tree-component-DCmmKZ4j.d.ts.map +1 -0
- package/dist/tree.d.ts +10 -4
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +1 -1
- package/dist/types-DO3gt5vg.d.ts +130 -0
- package/dist/types-DO3gt5vg.d.ts.map +1 -0
- package/dist/wheel-nudge-BlSCe_hD.js +86 -0
- package/dist/wheel-nudge-BlSCe_hD.js.map +1 -0
- package/dist/wheel-nudge-DGrNzWuE.d.ts +29 -0
- package/dist/wheel-nudge-DGrNzWuE.d.ts.map +1 -0
- package/dist/{xy-axis-BeWRMmbo.d.ts → xy-axis-5KhVTNoX.d.ts} +30 -7
- package/dist/xy-axis-5KhVTNoX.d.ts.map +1 -0
- package/dist/xy-axis-CxHC8z5E.js +1849 -0
- package/dist/xy-axis-CxHC8z5E.js.map +1 -0
- package/dist/xy-pad.d.ts +13 -2
- package/dist/xy-pad.d.ts.map +1 -1
- package/dist/xy-pad.js +47 -6
- package/dist/xy-pad.js.map +1 -1
- package/docs-user/radial-input.md +2 -2
- package/package.json +21 -20
- package/dist/colour-C3MQIjFJ-vRCdr8W-.js +0 -3732
- package/dist/colour-C3MQIjFJ-vRCdr8W-.js.map +0 -1
- package/dist/colour-picker-0sgAha1T.js.map +0 -1
- package/dist/data-provider-DgI909FP.js.map +0 -1
- package/dist/dist-CA13FvMn.js +0 -980
- package/dist/dist-CA13FvMn.js.map +0 -1
- package/dist/hex-editor-CMIxtNgT.d.ts.map +0 -1
- package/dist/hex-editor-WZrjRtvL.js.map +0 -1
- package/dist/icon-Bd5BiU4b.d.ts.map +0 -1
- package/dist/incr-search-CeERfijK.js.map +0 -1
- package/dist/index-9fGVAg1d.d.ts.map +0 -1
- package/dist/index-CowKi2mo.d.ts.map +0 -1
- package/dist/index-D87kRcEs.d.ts.map +0 -1
- package/dist/index-DgXpCg_G.d.ts +0 -1244
- package/dist/index-DgXpCg_G.d.ts.map +0 -1
- package/dist/index-_RTQSKHi.d.ts.map +0 -1
- package/dist/index-s_IhSnwc.d.ts.map +0 -1
- package/dist/keyboard-CimiEskD.js +0 -20
- package/dist/keyboard-CimiEskD.js.map +0 -1
- package/dist/labelled-input-base-ORb1rGq6.d.ts.map +0 -1
- package/dist/menu-item-COx-Azgj.d.ts.map +0 -1
- package/dist/menu-vjoiHZ13.js.map +0 -1
- package/dist/radial-input-CpQPs1Mp.d.ts.map +0 -1
- package/dist/radial-input-DZ7eQCcM.js.map +0 -1
- package/dist/tab-list-DLzb-m-I.d.ts.map +0 -1
- package/dist/tabs.js.map +0 -1
- package/dist/tickled-controller-BjYCzGrU.d.ts.map +0 -1
- package/dist/timeline-2OFtN4Ta.js.map +0 -1
- package/dist/tooltip-RGVIwHrZ.d.ts.map +0 -1
- package/dist/tree-D84RUgFC.js.map +0 -1
- package/dist/tree-component-BaCSPWg1.d.ts.map +0 -1
- package/dist/types-DSfbtHs3.d.ts +0 -8
- package/dist/types-DSfbtHs3.d.ts.map +0 -1
- package/dist/xy-axis-BeWRMmbo.d.ts.map +0 -1
- package/dist/xy-axis-no0OL_O1.js +0 -7893
- package/dist/xy-axis-no0OL_O1.js.map +0 -1
- /package/bundle/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
- /package/dist/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
package/dist/editable-label.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { CSSResult, LitElement, PropertyValues } from "lit";
|
|
2
|
-
|
|
3
2
|
//#region src/editable-label/editable-label.d.ts
|
|
4
3
|
type EditableMode = `label` | `editor`;
|
|
5
4
|
type EntryMode = `free` | `text` | `number` | `percent`;
|
|
@@ -70,7 +69,7 @@ declare global {
|
|
|
70
69
|
interface HTMLElementTagNameMap {
|
|
71
70
|
'ixfx-editable-label': EditableLabel;
|
|
72
71
|
}
|
|
73
|
-
}
|
|
72
|
+
}
|
|
74
73
|
//#endregion
|
|
75
74
|
export { DisplayTextLogic, EditableLabel, EditableLabelChangeDetail, EditableLabelChangeEvent, EditableMode, EntryMode };
|
|
76
75
|
//# sourceMappingURL=editable-label.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editable-label.d.ts","names":[],"sources":["../src/editable-label/editable-label.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"editable-label.d.ts","names":[],"sources":["../src/editable-label/editable-label.ts"],"mappings":";;KAoCY;KACA;KACA;KAEA;WACD;;KAEC,2BAA2B,YAAY;cAGtC,sBAAsB;EACJ,MAAM;EACmB,WAAW;EACpC;EACe;EAChC;;EAG6B;;;;;;;;EASM,kBAAkB;;EAGV;;EAGG;;EAG1B,aAAa;;EAGb,aAAa;YAE1B;gBAEL,cAAc;;YAKlB;EAED;EAMA;YAQC;YACA;YACA;YACA;YAEA;UAOF;UAWA;YAOE;YAUA;;YAUA;YAWA;YAMA;YAMA;YAKA,iBAAkB,GAAG;YAgBrB,qBAAsB,GAAG;YAQzB;YAeA;YAMA;YAsBA;YAMA;YAcA;YAoBA,gBAAgB;UASlB;EAWC,wBAAM;EAgBN,QAAQ,SAAS;SAcV,QAAQ;;QA8FlB;YACI;IACR,uBAAuB"}
|
package/dist/editable-label.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as themeFallbacks } from "./fallbacks-pNMOMx38.js";
|
|
2
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
3
3
|
import { LitElement, css, html, nothing } from "lit";
|
|
4
4
|
import { property, state } from "lit/decorators.js";
|
|
5
5
|
//#region src/editable-label/editable-label.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editable-label.js","names":["customElement"],"sources":["../src/editable-label/editable-label.ts"],"sourcesContent":["/**\n * <ixfx-editable-label> — inline editable text label.\n *\n * Two display modes:\n * label (default) — renders as plain text until clicked, then becomes an editable box.\n * editor — always renders as an editable box; becomes active on focus/click.\n *\n * Entry modes (filter characters as typed):\n * free (default) — no restrictions\n * text — alphabetical characters and spaces only\n * number — digits, decimal point, minus sign\n * percent — digits, decimal point, percent sign\n *\n * Properties (not attributes):\n * validator (value: string) => boolean — override commit validation; default uses entry-mode rules\n * formatter (value: string) => string — transform committed value for display\n *\n * Events:\n * input — CustomEvent<{ value: string }>, bubbles + composed; fired as value changes during editing\n * change — CustomEvent<{ value: string }>, bubbles + composed; fired when value is committed\n *\n * CSS variables:\n * --label-font-size defaults to var(--text-m, 12px)\n * --label-font-family defaults to var(--font-family, system-ui, sans-serif)\n * --label-color defaults to var(--surface-2-text)\n * --label-muted-color placeholder colour, defaults to var(--surface-muted-text)\n * --label-padding defaults to var(--space-xs, 3px) var(--space-s, 4px)\n * --label-radius defaults to var(--radius-s, 3px)\n * --label-align text alignment: left | center (default) | right\n */\nimport type { CSSResult, PropertyValues } from 'lit';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type EditableMode = `label` | `editor`;\nexport type EntryMode = `free` | `text` | `number` | `percent`;\nexport type DisplayTextLogic = `hidden` | `show` | `override` | `transient`;\n\nexport type EditableLabelChangeDetail = {\n readonly value: string;\n};\nexport type EditableLabelChangeEvent = CustomEvent<EditableLabelChangeDetail>;\n\n@customElement(`ixfx-editable-label`)\nexport class EditableLabel extends LitElement {\n @property({ reflect: true }) mode: EditableMode = `label`;\n @property({ attribute: `entry-mode`, reflect: true }) entryMode: EntryMode = `free`;\n @property({ reflect: true }) value = ``;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property() placeholder = ``;\n\n /** Override displayed text. Bypasses formatter and value. When editing, shows raw value. */\n @property({ attribute: `display-text` }) displayText?: string;\n\n /**\n * Controls when displayText is shown:\n * - 'hidden' (default): never use displayText\n * - 'show': show displayText instead of formatted value, but hide while editing; revert after disappearDelay\n * - 'override': always show displayText, even when editing\n * - 'transient': show displayText by default, switch to formatted value after appearDelay on hover/interaction; revert after disappearDelay\n */\n @property({ attribute: `display-text-logic` }) displayTextLogic: DisplayTextLogic = `hidden`;\n\n /** Delay before showing value in transient mode (ms). Default: 50 */\n @property({ type: Number, attribute: `appear-delay` }) appearDelay = 50;\n\n /** Delay before reverting to displayText after editing ends (ms). Default: 1000 */\n @property({ type: Number, attribute: `disappear-delay` }) disappearDelay = 1000;\n\n /** Override commit validation. Return true to accept, false to reject (reverts). */\n @property({ attribute: false }) validator?: (value: string) => boolean;\n\n /** Transform the committed value for display. Does not affect the stored value. */\n @property({ attribute: false }) formatter?: (value: string) => string;\n\n @state() protected _editing = false;\n\n protected get _contentEl(): HTMLElement | undefined {\n return this.renderRoot?.querySelector<HTMLElement>(`.content`) ?? undefined;\n }\n\n /** Snapshot of value taken when editing begins; restored on cancel. */\n protected _prevValue = ``;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`mouseenter`, this._onMouseEnter);\n this.addEventListener(`mouseleave`, this._onMouseLeave);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`mouseenter`, this._onMouseEnter);\n this.removeEventListener(`mouseleave`, this._onMouseLeave);\n this._clearTransientTimer();\n }\n\n // ── Transient display state ─────────────────────────────────────────────────\n protected _hovering = false;\n protected _transientShowingValue = false;\n protected _transientTimer: number | undefined = undefined;\n protected _showModeWaitingToHide = false;\n\n protected _clearTransientTimer(): void {\n if (this._transientTimer !== undefined) {\n clearTimeout(this._transientTimer);\n this._transientTimer = undefined;\n }\n }\n\n private _onMouseEnter = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = true;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n private _onMouseLeave = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = false;\n this._startTransientRevertTimer();\n };\n\n protected _startTransientRevertTimer(): void {\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering && this.displayTextLogic === `transient`) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n }\n\n protected _requestDisplayUpdate(): void {\n if (!this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this._getDisplayText();\n }\n }\n }\n\n /** Called by subclasses when user interacts (drag, keyboard, etc) to temporarily show value in transient mode */\n protected _onUserInteraction(): void {\n if (this.displayTextLogic !== `transient`)\n return;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._startTransientRevertTimer();\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n protected _handleClick = (): void => {\n if (this.mode === `label` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleFocus = (): void => {\n if (this.mode === `editor` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleBlur = (): void => {\n if (this._editing)\n this._tryCommit();\n };\n\n protected _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._editing)\n return;\n if (e.key === `Enter`) {\n e.preventDefault();\n this._tryCommit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n } else if (e.key === `Escape`) {\n e.preventDefault();\n this._cancelEdit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n }\n };\n\n protected _handleBeforeInput = (e: InputEvent): void => {\n if (e.inputType !== `insertText` || !e.data)\n return;\n if (!this._isAllowedInput(e.data)) {\n e.preventDefault();\n }\n };\n\n protected _handleInput = (): void => {\n if (!this._editing)\n return;\n\n const raw = this._contentEl?.textContent?.trim() ?? ``;\n\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`input`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n };\n\n // ── Core logic ───────────────────────────────────────────────────────────\n\n protected _beginEdit(): void {\n this._prevValue = this.value;\n this._editing = true;\n this.removeAttribute(`invalid`);\n }\n\n protected _tryCommit(): void {\n let raw = this._contentEl?.textContent?.trim() ?? ``;\n if (this.entryMode === `percent`)\n raw = raw.replaceAll(`%`, ``).trim();\n const validate = this.validator ?? this._defaultValidator.bind(this);\n if (validate(raw)) {\n this.removeAttribute(`invalid`);\n const prev = this.value;\n this.value = raw;\n this._editing = false;\n if (raw !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n }\n } else {\n this._cancelEdit();\n }\n }\n\n protected _cancelEdit(): void {\n this.value = this._prevValue;\n this._editing = false;\n this.removeAttribute(`invalid`);\n }\n\n protected _getDisplayText(): string {\n const useDisplayText = this._shouldUseDisplayText();\n if (useDisplayText && this.displayText !== undefined && this.displayText !== ``) {\n return this.displayText;\n }\n if (!this.value)\n return ``;\n if (this.formatter)\n return this.formatter(this.value);\n if (this.entryMode === `percent`)\n return `${this.value}%`;\n return this.value;\n }\n\n protected _shouldUseDisplayText(): boolean {\n if (this.displayTextLogic === `hidden`)\n return false;\n if (this.displayTextLogic === `override`)\n return true;\n if (this.displayTextLogic === `show`) {\n if (this._editing)\n return false;\n return this._showModeWaitingToHide;\n }\n if (this.displayTextLogic === `transient`) {\n if (this._editing)\n return false;\n if (this._transientShowingValue)\n return false;\n return true;\n }\n return false;\n }\n\n protected _isAllowedInput(char: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]$/i.test(char);\n case `number`: return /^[\\d.\\-]$/.test(char);\n case `percent`: return /^[\\d.%]$/.test(char);\n default: return true;\n }\n }\n\n private _defaultValidator(value: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]*$/i.test(value);\n case `number`: return value === `` || /^-?\\d*(?:\\.\\d*)?$/.test(value);\n case `percent`: return value === `` || /^\\d*(?:\\.\\d*)?$/.test(value);\n default: return true;\n } // asdf\n }\n\n // ── Render ───────────────────────────────────────────────────────────────\n\n override render() {\n const isEditor = this.mode === `editor`;\n return html`<div\n class=\"content\"\n contenteditable=${this._editing ? `plaintext-only` : `false`}\n data-placeholder=${this.placeholder}\n tabindex=${isEditor && !this._editing ? `0` : nothing}\n @click=${this._handleClick}\n @focus=${this._handleFocus}\n @blur=${this._handleBlur}\n @keydown=${this._handleKeydown}\n @beforeinput=${this._handleBeforeInput}\n @input=${this._handleInput}\n >${this._editing ? nothing : this._getDisplayText()}</div>`;\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`_editing`) && this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this.value;\n el.focus();\n _selectAll(el);\n }\n }\n }\n\n // ── Styles ───────────────────────────────────────────────────────────────\n\n static override styles: CSSResult[] = [themeFallbacks, css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n --_font-size: var(--label-font-size, var(--text-m, 12px));\n --_font-family: var(--label-font-family, var(--font-family, system-ui, sans-serif));\n --_color: var(--label-color, var(--surface-2-text));\n --_muted: var(--label-muted-color, var(--surface-muted-text, oklch(55% 0.02 240)));\n --_padding: var(--label-padding, var(--space-xs, 3px) var(--space-s, 4px));\n --_radius: var(--label-radius, var(--radius-s, 3px));\n --_align: var(--label-align, center);\n --_min-width: var(--label-min-width, 1ch);\n }\n\n .content {\n box-sizing: border-box;\n width: 100%;\n text-align: var(--_align);\n outline: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: var(--_min-width);\n font-family: var(--_font-family);\n font-size: var(--_font-size);\n color: var(--_color);\n padding: var(--_padding);\n border: 1px solid transparent;\n border-radius: var(--_radius);\n cursor: pointer;\n transition:\n background var(--transition, 0.15s ease-out),\n border-color var(--transition, 0.15s ease-out);\n }\n\n /* Remove overflow clipping while editing so the cursor is never hidden */\n .content[contenteditable=\"plaintext-only\"] {\n overflow: visible;\n text-overflow: clip;\n }\n\n /* ── Label mode ── */\n :host([mode=\"label\"]) .content {\n background: transparent;\n }\n\n :host([mode=\"label\"]) .content[contenteditable=\"plaintext-only\"] {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n cursor: text;\n }\n\n /* ── Editor mode — always shows box ── */\n :host([mode=\"editor\"]) .content {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n }\n\n :host([mode=\"editor\"]) .content[contenteditable=\"plaintext-only\"] {\n border-color: var(--accent, oklch(60% 0.15 140));\n cursor: text;\n }\n\n /* ── Placeholder ── */\n .content:empty::before {\n content: attr(data-placeholder);\n color: var(--_muted);\n pointer-events: none;\n }\n\n /* ── Invalid ── */\n :host([invalid]) .content {\n border-color: var(--error, oklch(60% 0.15 20));\n }\n\n /* ── Disabled ── */\n :host([disabled]) .content {\n opacity: var(--disabled-opacity, 0.5);\n cursor: not-allowed;\n pointer-events: none;\n }\n `];\n}\n\nfunction _selectAll(el: HTMLElement): void {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-editable-label': EditableLabel;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"editable-label.js","names":["customElement"],"sources":["../src/editable-label/editable-label.ts"],"sourcesContent":["/**\n * <ixfx-editable-label> — inline editable text label.\n *\n * Two display modes:\n * label (default) — renders as plain text until clicked, then becomes an editable box.\n * editor — always renders as an editable box; becomes active on focus/click.\n *\n * Entry modes (filter characters as typed):\n * free (default) — no restrictions\n * text — alphabetical characters and spaces only\n * number — digits, decimal point, minus sign\n * percent — digits, decimal point, percent sign\n *\n * Properties (not attributes):\n * validator (value: string) => boolean — override commit validation; default uses entry-mode rules\n * formatter (value: string) => string — transform committed value for display\n *\n * Events:\n * input — CustomEvent<{ value: string }>, bubbles + composed; fired as value changes during editing\n * change — CustomEvent<{ value: string }>, bubbles + composed; fired when value is committed\n *\n * CSS variables:\n * --label-font-size defaults to var(--text-m, 12px)\n * --label-font-family defaults to var(--font-family, system-ui, sans-serif)\n * --label-color defaults to var(--surface-2-text)\n * --label-muted-color placeholder colour, defaults to var(--surface-muted-text)\n * --label-padding defaults to var(--space-xs, 3px) var(--space-s, 4px)\n * --label-radius defaults to var(--radius-s, 3px)\n * --label-align text alignment: left | center (default) | right\n */\nimport type { CSSResult, PropertyValues } from 'lit';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type EditableMode = `label` | `editor`;\nexport type EntryMode = `free` | `text` | `number` | `percent`;\nexport type DisplayTextLogic = `hidden` | `show` | `override` | `transient`;\n\nexport type EditableLabelChangeDetail = {\n readonly value: string;\n};\nexport type EditableLabelChangeEvent = CustomEvent<EditableLabelChangeDetail>;\n\n@customElement(`ixfx-editable-label`)\nexport class EditableLabel extends LitElement {\n @property({ reflect: true }) mode: EditableMode = `label`;\n @property({ attribute: `entry-mode`, reflect: true }) entryMode: EntryMode = `free`;\n @property({ reflect: true }) value = ``;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property() placeholder = ``;\n\n /** Override displayed text. Bypasses formatter and value. When editing, shows raw value. */\n @property({ attribute: `display-text` }) displayText?: string;\n\n /**\n * Controls when displayText is shown:\n * - 'hidden' (default): never use displayText\n * - 'show': show displayText instead of formatted value, but hide while editing; revert after disappearDelay\n * - 'override': always show displayText, even when editing\n * - 'transient': show displayText by default, switch to formatted value after appearDelay on hover/interaction; revert after disappearDelay\n */\n @property({ attribute: `display-text-logic` }) displayTextLogic: DisplayTextLogic = `hidden`;\n\n /** Delay before showing value in transient mode (ms). Default: 50 */\n @property({ type: Number, attribute: `appear-delay` }) appearDelay = 50;\n\n /** Delay before reverting to displayText after editing ends (ms). Default: 1000 */\n @property({ type: Number, attribute: `disappear-delay` }) disappearDelay = 1000;\n\n /** Override commit validation. Return true to accept, false to reject (reverts). */\n @property({ attribute: false }) validator?: (value: string) => boolean;\n\n /** Transform the committed value for display. Does not affect the stored value. */\n @property({ attribute: false }) formatter?: (value: string) => string;\n\n @state() protected _editing = false;\n\n protected get _contentEl(): HTMLElement | undefined {\n return this.renderRoot?.querySelector<HTMLElement>(`.content`) ?? undefined;\n }\n\n /** Snapshot of value taken when editing begins; restored on cancel. */\n protected _prevValue = ``;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`mouseenter`, this._onMouseEnter);\n this.addEventListener(`mouseleave`, this._onMouseLeave);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`mouseenter`, this._onMouseEnter);\n this.removeEventListener(`mouseleave`, this._onMouseLeave);\n this._clearTransientTimer();\n }\n\n // ── Transient display state ─────────────────────────────────────────────────\n protected _hovering = false;\n protected _transientShowingValue = false;\n protected _transientTimer: number | undefined = undefined;\n protected _showModeWaitingToHide = false;\n\n protected _clearTransientTimer(): void {\n if (this._transientTimer !== undefined) {\n clearTimeout(this._transientTimer);\n this._transientTimer = undefined;\n }\n }\n\n private _onMouseEnter = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = true;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n private _onMouseLeave = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = false;\n this._startTransientRevertTimer();\n };\n\n protected _startTransientRevertTimer(): void {\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering && this.displayTextLogic === `transient`) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n }\n\n protected _requestDisplayUpdate(): void {\n if (!this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this._getDisplayText();\n }\n }\n }\n\n /** Called by subclasses when user interacts (drag, keyboard, etc) to temporarily show value in transient mode */\n protected _onUserInteraction(): void {\n if (this.displayTextLogic !== `transient`)\n return;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._startTransientRevertTimer();\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n protected _handleClick = (): void => {\n if (this.mode === `label` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleFocus = (): void => {\n if (this.mode === `editor` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleBlur = (): void => {\n if (this._editing)\n this._tryCommit();\n };\n\n protected _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._editing)\n return;\n if (e.key === `Enter`) {\n e.preventDefault();\n this._tryCommit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n } else if (e.key === `Escape`) {\n e.preventDefault();\n this._cancelEdit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n }\n };\n\n protected _handleBeforeInput = (e: InputEvent): void => {\n if (e.inputType !== `insertText` || !e.data)\n return;\n if (!this._isAllowedInput(e.data)) {\n e.preventDefault();\n }\n };\n\n protected _handleInput = (): void => {\n if (!this._editing)\n return;\n\n const raw = this._contentEl?.textContent?.trim() ?? ``;\n\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`input`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n };\n\n // ── Core logic ───────────────────────────────────────────────────────────\n\n protected _beginEdit(): void {\n this._prevValue = this.value;\n this._editing = true;\n this.removeAttribute(`invalid`);\n }\n\n protected _tryCommit(): void {\n let raw = this._contentEl?.textContent?.trim() ?? ``;\n if (this.entryMode === `percent`)\n raw = raw.replaceAll(`%`, ``).trim();\n const validate = this.validator ?? this._defaultValidator.bind(this);\n if (validate(raw)) {\n this.removeAttribute(`invalid`);\n const prev = this.value;\n this.value = raw;\n this._editing = false;\n if (raw !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n }\n } else {\n this._cancelEdit();\n }\n }\n\n protected _cancelEdit(): void {\n this.value = this._prevValue;\n this._editing = false;\n this.removeAttribute(`invalid`);\n }\n\n protected _getDisplayText(): string {\n const useDisplayText = this._shouldUseDisplayText();\n if (useDisplayText && this.displayText !== undefined && this.displayText !== ``) {\n return this.displayText;\n }\n if (!this.value)\n return ``;\n if (this.formatter)\n return this.formatter(this.value);\n if (this.entryMode === `percent`)\n return `${this.value}%`;\n return this.value;\n }\n\n protected _shouldUseDisplayText(): boolean {\n if (this.displayTextLogic === `hidden`)\n return false;\n if (this.displayTextLogic === `override`)\n return true;\n if (this.displayTextLogic === `show`) {\n if (this._editing)\n return false;\n return this._showModeWaitingToHide;\n }\n if (this.displayTextLogic === `transient`) {\n if (this._editing)\n return false;\n if (this._transientShowingValue)\n return false;\n return true;\n }\n return false;\n }\n\n protected _isAllowedInput(char: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]$/i.test(char);\n case `number`: return /^[\\d.\\-]$/.test(char);\n case `percent`: return /^[\\d.%]$/.test(char);\n default: return true;\n }\n }\n\n private _defaultValidator(value: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]*$/i.test(value);\n case `number`: return value === `` || /^-?\\d*(?:\\.\\d*)?$/.test(value);\n case `percent`: return value === `` || /^\\d*(?:\\.\\d*)?$/.test(value);\n default: return true;\n } // asdf\n }\n\n // ── Render ───────────────────────────────────────────────────────────────\n\n override render() {\n const isEditor = this.mode === `editor`;\n return html`<div\n class=\"content\"\n contenteditable=${this._editing ? `plaintext-only` : `false`}\n data-placeholder=${this.placeholder}\n tabindex=${isEditor && !this._editing ? `0` : nothing}\n @click=${this._handleClick}\n @focus=${this._handleFocus}\n @blur=${this._handleBlur}\n @keydown=${this._handleKeydown}\n @beforeinput=${this._handleBeforeInput}\n @input=${this._handleInput}\n >${this._editing ? nothing : this._getDisplayText()}</div>`;\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`_editing`) && this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this.value;\n el.focus();\n _selectAll(el);\n }\n }\n }\n\n // ── Styles ───────────────────────────────────────────────────────────────\n\n static override styles: CSSResult[] = [themeFallbacks, css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n --_font-size: var(--label-font-size, var(--text-m, 12px));\n --_font-family: var(--label-font-family, var(--font-family, system-ui, sans-serif));\n --_color: var(--label-color, var(--surface-2-text));\n --_muted: var(--label-muted-color, var(--surface-muted-text, oklch(55% 0.02 240)));\n --_padding: var(--label-padding, var(--space-xs, 3px) var(--space-s, 4px));\n --_radius: var(--label-radius, var(--radius-s, 3px));\n --_align: var(--label-align, center);\n --_min-width: var(--label-min-width, 1ch);\n }\n\n .content {\n box-sizing: border-box;\n width: 100%;\n text-align: var(--_align);\n outline: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: var(--_min-width);\n font-family: var(--_font-family);\n font-size: var(--_font-size);\n color: var(--_color);\n padding: var(--_padding);\n border: 1px solid transparent;\n border-radius: var(--_radius);\n cursor: pointer;\n transition:\n background var(--transition, 0.15s ease-out),\n border-color var(--transition, 0.15s ease-out);\n }\n\n /* Remove overflow clipping while editing so the cursor is never hidden */\n .content[contenteditable=\"plaintext-only\"] {\n overflow: visible;\n text-overflow: clip;\n }\n\n /* ── Label mode ── */\n :host([mode=\"label\"]) .content {\n background: transparent;\n }\n\n :host([mode=\"label\"]) .content[contenteditable=\"plaintext-only\"] {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n cursor: text;\n }\n\n /* ── Editor mode — always shows box ── */\n :host([mode=\"editor\"]) .content {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n }\n\n :host([mode=\"editor\"]) .content[contenteditable=\"plaintext-only\"] {\n border-color: var(--accent, oklch(60% 0.15 140));\n cursor: text;\n }\n\n /* ── Placeholder ── */\n .content:empty::before {\n content: attr(data-placeholder);\n color: var(--_muted);\n pointer-events: none;\n }\n\n /* ── Invalid ── */\n :host([invalid]) .content {\n border-color: var(--error, oklch(60% 0.15 20));\n }\n\n /* ── Disabled ── */\n :host([disabled]) .content {\n opacity: var(--disabled-opacity, 0.5);\n cursor: not-allowed;\n pointer-events: none;\n }\n `];\n}\n\nfunction _selectAll(el: HTMLElement): void {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-editable-label': EditableLabel;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
2
|
-
import { t as colour_exports } from "./colour-C3MQIjFJ-vRCdr8W-.js";
|
|
1
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
3
2
|
import { LitElement, css, html } from "lit";
|
|
4
3
|
import { property, state } from "lit/decorators.js";
|
|
4
|
+
import { Colour } from "@ixfx/visual";
|
|
5
5
|
import { repeat } from "lit/directives/repeat.js";
|
|
6
6
|
import { styleMap } from "lit/directives/style-map.js";
|
|
7
7
|
//#region src/hex/colour.ts
|
|
8
|
-
const WHITESPACE_BYTES = new Set([
|
|
8
|
+
const WHITESPACE_BYTES = /* @__PURE__ */ new Set([
|
|
9
9
|
9,
|
|
10
10
|
10,
|
|
11
11
|
11,
|
|
@@ -27,7 +27,7 @@ function getAsciiClass(byte) {
|
|
|
27
27
|
return `byte-other`;
|
|
28
28
|
}
|
|
29
29
|
function createShadeMap(nullColour, maxColour, stepStart, stepEnd) {
|
|
30
|
-
const cssSteps =
|
|
30
|
+
const cssSteps = Colour.createSteps(stepStart, stepEnd, { steps: 16 }).map(Colour.toCssColour);
|
|
31
31
|
return { forByte: (byte) => {
|
|
32
32
|
if (byte === 0) return nullColour;
|
|
33
33
|
if (byte === 255) return maxColour;
|
|
@@ -54,7 +54,7 @@ function clamp(value) {
|
|
|
54
54
|
function writeByte(store, pos, value) {
|
|
55
55
|
const clampedValue = clamp(value);
|
|
56
56
|
const before = store.data[pos];
|
|
57
|
-
const diff = new Map([[pos, {
|
|
57
|
+
const diff = /* @__PURE__ */ new Map([[pos, {
|
|
58
58
|
before,
|
|
59
59
|
after: clampedValue
|
|
60
60
|
}]]);
|
|
@@ -263,9 +263,7 @@ function extendRectangular(sel, dir, columns, _dataLength, anchorX = 0, anchorY
|
|
|
263
263
|
height += 1;
|
|
264
264
|
}
|
|
265
265
|
break;
|
|
266
|
-
case `down`:
|
|
267
|
-
height += 1;
|
|
268
|
-
break;
|
|
266
|
+
case `down`: height += 1;
|
|
269
267
|
}
|
|
270
268
|
return {
|
|
271
269
|
kind: `rectangular`,
|
|
@@ -311,7 +309,7 @@ let IxfxHexEditorElement = class IxfxHexEditorElement extends LitElement {
|
|
|
311
309
|
this._containerH = 0;
|
|
312
310
|
this._shadeMap = null;
|
|
313
311
|
this._focusSide = null;
|
|
314
|
-
this._store = createHexStore(new Uint8Array(0));
|
|
312
|
+
this._store = createHexStore(/* @__PURE__ */ new Uint8Array(0));
|
|
315
313
|
this._undoStack = createUndoRedoStack();
|
|
316
314
|
this._copyBuffer = null;
|
|
317
315
|
this._rowHeight = 24;
|
|
@@ -885,7 +883,7 @@ let IxfxHexEditorElement = class IxfxHexEditorElement extends LitElement {
|
|
|
885
883
|
_commitDecimalValue() {
|
|
886
884
|
if (!this._editState) return;
|
|
887
885
|
const value = Number.parseInt(this._editState.partial.slice(1), 10);
|
|
888
|
-
if (!isNaN(value)) {
|
|
886
|
+
if (!Number.isNaN(value)) {
|
|
889
887
|
const diff = writeByte(this._store, this._editState.pos, value);
|
|
890
888
|
push(this._undoStack, diff);
|
|
891
889
|
this._dispatchChangeEvent(diff);
|
|
@@ -1144,4 +1142,4 @@ IxfxHexEditorElement = __decorate([safeCustomElement(`ixfx-hex-editor`)], IxfxHe
|
|
|
1144
1142
|
//#endregion
|
|
1145
1143
|
export { IxfxHexEditorElement as t };
|
|
1146
1144
|
|
|
1147
|
-
//# sourceMappingURL=hex-editor-
|
|
1145
|
+
//# sourceMappingURL=hex-editor-Bk6rxhfg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-editor-Bk6rxhfg.js","names":["storeLength","undoDiff","redoDiff","customElement"],"sources":["../src/hex/colour.ts","../src/hex/data.ts","../src/hex/diff.ts","../src/hex/selection.ts","../src/hex/hex-editor.ts"],"sourcesContent":["import { Colour } from '@ixfx/visual';\n\nexport type ColourMap = {\n forByte: (byte: number) => string;\n};\n\nconst WHITESPACE_BYTES = new Set([0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x20]);\n\nfunction isControlByte(byte: number): boolean {\n return byte < 0x20 && byte !== 0x09 && byte !== 0x0A && byte !== 0x0B && byte !== 0x0C && byte !== 0x0D;\n}\n\nfunction isPrintableAscii(byte: number): boolean {\n return byte >= 0x20 && byte <= 0x7E;\n}\n\nexport function getAsciiClass(byte: number): string {\n if (byte === 0)\n return `byte-null`;\n if (WHITESPACE_BYTES.has(byte))\n return `byte-whitespace`;\n if (isControlByte(byte))\n return `byte-control`;\n if (isPrintableAscii(byte))\n return `byte-printable`;\n return `byte-other`;\n}\n\nexport function createShadeMap(nullColour: string, maxColour: string, stepStart: string, stepEnd: string): ColourMap {\n const steps = Colour.createSteps(stepStart, stepEnd, { steps: 16 });\n const cssSteps = steps.map(Colour.toCssColour);\n return {\n forByte: (byte) => {\n if (byte === 0x00)\n return nullColour;\n if (byte === 0xFF)\n return maxColour;\n return cssSteps[byte >> 4];\n },\n };\n}\n","import type { BytePos, Diff } from './types.js';\n\ntype StoreImpl = {\n data: Uint8Array;\n changeset: Set<BytePos>;\n};\n\nexport type HexStore = StoreImpl;\n\nexport function createHexStore(data: Uint8Array): HexStore {\n return {\n data: new Uint8Array(data),\n changeset: new Set<BytePos>(),\n };\n}\n\nexport function readByte(store: HexStore, pos: BytePos): number {\n return store.data[pos] ?? 0;\n}\n\nexport function readBytes(store: HexStore, positions: readonly BytePos[]): readonly number[] {\n return positions.map(p => store.data[p] ?? 0);\n}\n\nexport function length(store: HexStore): number {\n return store.data.length;\n}\n\nfunction clamp(value: number): number {\n return Math.max(0, Math.min(255, value));\n}\n\nexport function writeByte(store: HexStore, pos: BytePos, value: number): Diff {\n const clampedValue = clamp(value);\n const before = store.data[pos];\n const diff: Diff = new Map([[pos, { before, after: clampedValue }]]);\n store.data[pos] = clampedValue;\n store.changeset.add(pos);\n return diff;\n}\n\nexport function writeBytes(store: HexStore, entries: ReadonlyMap<BytePos, number>): Diff {\n const diff = new Map<BytePos, { before: number; after: number }>();\n entries.forEach((value, pos) => {\n const clampedValue = clamp(value);\n const before = store.data[pos];\n diff.set(pos, { before, after: clampedValue });\n store.data[pos] = clampedValue;\n store.changeset.add(pos);\n });\n return diff as Diff;\n}\n\nexport function applyDiff(store: HexStore, diff: Diff): Diff {\n const reverse = new Map<BytePos, { before: number; after: number }>();\n diff.forEach((entry, pos) => {\n const before = store.data[pos];\n reverse.set(pos, { before: entry.after, after: before });\n store.data[pos] = entry.after;\n store.changeset.add(pos);\n });\n return reverse as Diff;\n}\n\nexport function reverseDiff(diff: Diff): Diff {\n const reversed = new Map<BytePos, { before: number; after: number }>();\n diff.forEach((entry, pos) => {\n reversed.set(pos, { before: entry.after, after: entry.before });\n });\n return reversed as Diff;\n}\n\nexport function getChangeset(store: HexStore): ReadonlySet<BytePos> {\n return store.changeset;\n}\n\nexport function clearChangeset(store: HexStore): void {\n store.changeset.clear();\n}\n","import type { Diff } from './types.js';\n\ntype StackImpl = {\n undos: Diff[];\n redos: Diff[];\n};\n\nexport type UndoRedoStack = StackImpl;\n\nexport function createUndoRedoStack(): UndoRedoStack {\n return {\n undos: [],\n redos: [],\n };\n}\n\nexport function push(stack: UndoRedoStack, diff: Diff): void {\n stack.undos.push(diff);\n stack.redos = [];\n}\n\nexport function undo(stack: UndoRedoStack): Diff | undefined {\n const diff = stack.undos.pop();\n if (diff) {\n stack.redos.push(diff);\n }\n return diff;\n}\n\nexport function redo(stack: UndoRedoStack): Diff | undefined {\n const diff = stack.redos.pop();\n if (diff) {\n stack.undos.push(diff);\n }\n return diff;\n}\n\nexport function canUndo(stack: UndoRedoStack): boolean {\n return stack.undos.length > 0;\n}\n\nexport function canRedo(stack: UndoRedoStack): boolean {\n return stack.redos.length > 0;\n}\n","import type { BytePos, ContiguousSelection, RectangularSelection, Selection, SingleSelection } from './types.js';\n\nexport const bytesPerRow = (columns: number): number => columns * 4;\n\nconst min = (a: number, b: number): number => (a < b ? a : b);\nconst max = (a: number, b: number): number => (a > b ? a : b);\n\nexport function clampPos(pos: BytePos, dataLength: number): BytePos {\n return Math.max(0, Math.min(pos, dataLength - 1));\n}\n\nexport function getSelectedPositions(sel: Selection, columns: number): readonly BytePos[] {\n if (!sel)\n return [];\n\n const bpr = bytesPerRow(columns);\n\n if (sel.kind === `single`) {\n return [sel.pos];\n }\n\n if (sel.kind === `contiguous`) {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n const positions: BytePos[] = [];\n for (let i = start; i <= end; i++) {\n positions.push(i);\n }\n return positions;\n }\n\n if (sel.kind === `rectangular`) {\n const positions: BytePos[] = [];\n for (let row = 0; row < sel.height; row++) {\n for (let col = 0; col < sel.width; col++) {\n const y = sel.y + row;\n const x = sel.x + col;\n const pos = y * bpr + x;\n positions.push(pos);\n }\n }\n return positions;\n }\n\n return [];\n}\n\nexport function selectionContains(sel: Selection, pos: BytePos, columns: number): boolean {\n if (!sel)\n return false;\n\n const bpr = bytesPerRow(columns);\n\n if (sel.kind === `single`) {\n return pos === sel.pos;\n }\n\n if (sel.kind === `contiguous`) {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n return pos >= start && pos <= end;\n }\n\n if (sel.kind === `rectangular`) {\n const row = Math.floor(pos / bpr);\n const col = pos % bpr;\n const x = sel.x;\n const y = sel.y;\n const width = sel.width;\n const height = sel.height;\n return row >= y && row < y + height && col >= x && col < x + width;\n }\n\n return false;\n}\n\nexport function getCursorPos(sel: Selection, dir: `up` | `down` | `left` | `right`, columns: number, dataLength: number): BytePos {\n let currentPos: BytePos;\n\n if (!sel) {\n currentPos = 0;\n } else if (sel.kind === `single`) {\n currentPos = sel.pos;\n } else if (sel.kind === `contiguous`) {\n currentPos = max(sel.start, sel.end);\n } else if (sel.kind === `rectangular`) {\n currentPos = sel.y * bytesPerRow(columns) + sel.x + sel.width - 1;\n } else {\n currentPos = 0;\n }\n\n const bpr = bytesPerRow(columns);\n let newPos: BytePos;\n\n switch (dir) {\n case `left`:\n newPos = currentPos - 1;\n break;\n case `right`:\n newPos = currentPos + 1;\n break;\n case `up`:\n newPos = currentPos - bpr;\n break;\n case `down`:\n newPos = currentPos + bpr;\n break;\n default:\n newPos = currentPos;\n }\n\n return clampPos(newPos, dataLength);\n}\n\nexport function moveSelection(sel: Selection, dir: `up` | `down` | `left` | `right`, columns: number, dataLength: number): SingleSelection {\n const newPos = getCursorPos(sel, dir, columns, dataLength);\n return { kind: `single`, pos: newPos };\n}\n\nexport function extendContiguous(sel: Selection, _dir: `up` | `down` | `left` | `right`, columns: number, _dataLength: number, anchor: BytePos | null = null): ContiguousSelection {\n let currentPos: BytePos;\n\n if (!sel || sel.kind === `single`) {\n currentPos = sel?.kind === `single` ? sel.pos : 0;\n } else if (sel.kind === `contiguous`) {\n currentPos = max(sel.start, sel.end);\n } else if (sel.kind === `rectangular`) {\n currentPos = sel.y * bytesPerRow(columns) + sel.x;\n } else {\n currentPos = 0;\n }\n\n const newPos = anchor ?? currentPos;\n const start = Math.min(currentPos, newPos);\n const end = Math.max(currentPos, newPos);\n\n return {\n kind: `contiguous`,\n start,\n end,\n };\n}\n\nexport function extendRectangular(sel: Selection, dir: `up` | `down` | `left` | `right`, columns: number, _dataLength: number, anchorX: number = 0, anchorY: number = 0): RectangularSelection {\n const bpr = bytesPerRow(columns);\n\n let x: number;\n let y: number;\n let width: number;\n let height: number;\n\n if (!sel || sel.kind === `single`) {\n const pos = sel?.kind === `single` ? sel.pos : 0;\n x = pos % bpr;\n y = Math.floor(pos / bpr);\n width = 1;\n height = 1;\n } else if (sel.kind === `contiguous`) {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n x = start % bpr;\n y = Math.floor(start / bpr);\n width = end - start + 1;\n height = 1;\n } else if (sel.kind === `rectangular`) {\n x = sel.x;\n y = sel.y;\n width = sel.width;\n height = sel.height;\n } else {\n x = 0;\n y = 0;\n width = 1;\n height = 1;\n }\n\n const effectiveAnchorX = anchorX > 0 || (sel?.kind === `rectangular`) ? anchorX : x;\n const effectiveAnchorY = anchorY > 0 || (sel?.kind === `rectangular`) ? anchorY : y;\n\n switch (dir) {\n case `left`:\n if (x > effectiveAnchorX) {\n width -= 1;\n } else if (x === effectiveAnchorX && width > 1) {\n x -= 1;\n width += 1;\n } else if (x > 0) {\n x -= 1;\n width += 1;\n }\n break;\n case `right`:\n if (x + width < bpr) {\n width += 1;\n }\n break;\n case `up`:\n if (y > effectiveAnchorY) {\n height -= 1;\n } else if (y === effectiveAnchorY && height > 1) {\n y -= 1;\n height += 1;\n } else if (y > 0) {\n y -= 1;\n height += 1;\n }\n break;\n case `down`:\n height += 1;\n break;\n }\n\n return { kind: `rectangular`, x, y, width, height };\n}\n\nexport function selectionFromPointerRange(start: BytePos, end: BytePos, mode: `contiguous` | `rectangular`, columns: number): Selection {\n const bpr = bytesPerRow(columns);\n\n if (mode === `contiguous`) {\n const s = min(start, end);\n const e = max(start, end);\n return {\n kind: `contiguous`,\n start: s,\n end: e,\n };\n }\n\n const startX = start % bpr;\n const startY = Math.floor(start / bpr);\n const endX = end % bpr;\n const endY = Math.floor(end / bpr);\n\n const x = min(startX, endX);\n const y = min(startY, endY);\n const width = Math.abs(endX - startX) + 1;\n const height = Math.abs(endY - startY) + 1;\n\n return { kind: `rectangular`, x, y, width, height };\n}\n","import type { ColourMap } from './colour.js';\nimport type { BytePos, ColourScheme, Diff, EditState, Selection } from './types.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\n\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createShadeMap, getAsciiClass } from './colour.js';\n\nimport { applyDiff, createHexStore, getChangeset, readByte, reverseDiff, length as storeLength, writeByte, writeBytes } from './data.js';\nimport { createUndoRedoStack, push as pushDiff, redo as redoDiff, undo as undoDiff } from './diff.js';\nimport { bytesPerRow, clampPos, extendRectangular, getCursorPos, getSelectedPositions, moveSelection, selectionContains, selectionFromPointerRange } from './selection.js';\n\ntype PointerMode = `pending` | `drag-value` | `select-cont` | `select-rect` | null;\n\ntype DragStart = {\n pos: BytePos;\n startValue: number;\n startY: number;\n startX: number;\n};\n\n@customElement(`ixfx-hex-editor`)\nexport class IxfxHexEditorElement extends LitElement {\n @property({ type: Number })\n columns = 4;\n\n @property({ type: String })\n colourScheme: ColourScheme = `ascii`;\n\n @property({ type: Boolean })\n showChangeset = true;\n\n @property({ type: Boolean, attribute: `hide-offset-col` })\n hideOffsetCol = false;\n\n @property({ type: Boolean, attribute: `hide-hex-col` })\n hideHexCol = false;\n\n @property({ type: Boolean, attribute: `hide-text-col` })\n hideTextCol = false;\n\n @state()\n private _selection: Selection = null;\n\n @state()\n private _scrollTop = 0;\n\n @state()\n private _editState: EditState | null = null;\n\n @state()\n private _containerH = 0;\n\n @state()\n private _shadeMap: ColourMap | null = null;\n\n @state()\n private _focusSide: `hex` | `text` | null = null;\n\n private _store = createHexStore(new Uint8Array(0));\n private _undoStack = createUndoRedoStack();\n private _copyBuffer: Uint8Array | null = null;\n private _rowHeight = 24;\n private _dragStart: DragStart | null = null;\n private _dragAnchor: BytePos | null = null;\n private _rectAnchorX = 0;\n private _rectAnchorY = 0;\n private _rectAnchorXFromKeyboard = 0;\n private _rectAnchorYFromKeyboard = 0;\n private _initialSelectionPoint: BytePos = 0;\n private _currentCursorPoint: BytePos = 0;\n private _pointerMode: PointerMode = null;\n private _currentDragDiff: Diff | null = null;\n private _shiftClickTarget: BytePos | null = null;\n\n static styles = css`\n :host {\n --hex-row-height: 24px;\n --hex-offset-width: 8ch;\n --hex-font: monospace;\n --hex-font-size: 0.85rem;\n --hex-changed-weight: bold;\n\n --ascii-null: #808080;\n --ascii-printable: #4caf50;\n --ascii-whitespace: #ffffff;\n --ascii-control: #f48fb1;\n --ascii-other: #ffeb3b;\n\n --shade-null: #808080;\n --shade-max: #ffffff;\n --shade-step-start: #ff0000;\n --shade-step-end: #0000ff;\n\n display: block;\n font-family: var(--hex-font);\n font-size: var(--hex-font-size);\n }\n\n .hex-editor {\n display: flex;\n flex-direction: column;\n height: 300px;\n overflow: hidden;\n background: #1e1e1e;\n color: #e0e0e0;\n border: 1px solid #333;\n border-radius: 4px;\n }\n\n .scroll-container {\n flex: 1;\n overflow-y: auto;\n position: relative;\n }\n\n .header {\n display: flex;\n background: #2d2d2d;\n font-weight: bold;\n border-bottom: 1px solid #444;\n height: var(--hex-row-height);\n flex-shrink: 0;\n align-items: center;\n }\n\n .row {\n display: flex;\n height: var(--hex-row-height);\n align-items: center;\n }\n\n .row:hover {\n background: rgba(255, 255, 255, 0.05);\n }\n\n .offset-cell {\n width: var(--hex-offset-width);\n padding: 0 8px;\n text-align: right;\n color: #888;\n flex-shrink: 0;\n box-sizing: border-box;\n }\n\n .col-group {\n display: inline-flex;\n gap: 4px;\n margin-right: 16px;\n }\n\n .col-header {\n width: calc(8ch + 28px);\n padding: 0 8px;\n color: #555;\n text-align: right;\n flex-shrink: 0;\n box-sizing: border-box;\n }\n\n .col-header.active {\n color: #aaa;\n }\n\n .text-header {\n padding: 4px 8px;\n color: #555;\n width: calc(var(--columns, 4) * 4 * 1ch);\n box-sizing: border-box;\n flex-shrink: 0;\n }\n\n .text-header.active {\n color: #aaa;\n }\n\n .hex-cell, .text-char {\n display: inline-block;\n width: 2ch;\n text-align: center;\n cursor: pointer;\n user-select: none;\n padding: 2px 0;\n }\n\n .hex-cell.selected, .text-char.selected {\n background: rgba(100, 149, 237, 0.4);\n }\n\n .hex-cell.changed, .text-char.changed {\n font-weight: var(--hex-changed-weight);\n }\n\n .hex-cell.editing {\n background: rgba(255, 215, 0, 0.3);\n }\n\n\n .text-area {\n display: inline-flex;\n gap: 0;\n }\n\n .text-char {\n width: 1ch;\n text-align: left;\n }\n\n .byte-null { color: var(--ascii-null); }\n .byte-printable { color: var(--ascii-printable); }\n .byte-whitespace { color: var(--ascii-whitespace); }\n .byte-control { color: var(--ascii-control); }\n .byte-other { color: var(--ascii-other); }\n `;\n\n setData(data: Uint8Array): void {\n this._store = createHexStore(data);\n this._undoStack = createUndoRedoStack();\n this._selection = null;\n this._editState = null;\n this._scrollTop = 0;\n this.requestUpdate();\n }\n\n undo(): void {\n const diff = undoDiff(this._undoStack);\n if (!diff)\n return;\n const reverse = reverseDiff(diff);\n applyDiff(this._store, reverse);\n this.requestUpdate();\n }\n\n redo(): void {\n const diff = redoDiff(this._undoStack);\n if (!diff)\n return;\n applyDiff(this._store, diff);\n this.requestUpdate();\n }\n\n recomputeColours(): void {\n const style = getComputedStyle(this);\n const nullC = style.getPropertyValue(`--shade-null`).trim() || `#808080`;\n const maxC = style.getPropertyValue(`--shade-max`).trim() || `#ffffff`;\n const stepStart = style.getPropertyValue(`--shade-step-start`).trim() || `#ff0000`;\n const stepEnd = style.getPropertyValue(`--shade-step-end`).trim() || `#0000ff`;\n this._shadeMap = createShadeMap(nullC, maxC, stepStart, stepEnd);\n this.requestUpdate();\n }\n\n * selectedBytes(): Generator<{ selection_index: number; array_index: number; value: number }> {\n const positions = getSelectedPositions(this._selection, this.columns);\n for (let i = 0; i < positions.length; i++) {\n const pos = positions[i];\n yield {\n selection_index: i,\n array_index: pos,\n value: readByte(this._store, pos),\n };\n }\n }\n\n containsPosition(pos: number): boolean {\n return selectionContains(this._selection, pos as BytePos, this.columns);\n }\n\n selectSingle(position: number): void {\n this._selection = { kind: `single`, pos: position as BytePos };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n selectContiguous(start: number, end: number): void {\n this._selection = {\n kind: `contiguous`,\n start: start as BytePos,\n end: end as BytePos,\n };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n selectRectangular(x: number, y: number, width: number, height: number): void {\n this._selection = {\n kind: `rectangular`,\n x,\n y,\n width,\n height,\n };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n clearSelection(): void {\n this._selection = null;\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n getSelection(): Selection {\n return this._selection;\n }\n\n protected override firstUpdated(): void {\n const container = this.shadowRoot?.querySelector(`.scroll-container`);\n if (container) {\n const ro = new ResizeObserver((entries) => {\n this._containerH = entries[0].contentRect.height;\n this.requestUpdate();\n });\n ro.observe(container);\n this._containerH = container.clientHeight;\n }\n this.recomputeColours();\n }\n\n private _onScroll = (e: Event): void => {\n const target = e.target as HTMLElement;\n this._scrollTop = target.scrollTop;\n this.requestUpdate();\n };\n\n private _onPointerDown(pos: BytePos, side: `hex` | `text`, e: PointerEvent): void {\n e.preventDefault();\n if (e.button !== 0)\n return;\n\n (this.shadowRoot?.querySelector(`.hex-editor`) as HTMLElement)?.focus();\n this._focusSide = side;\n\n const target = e.target as Element;\n target.setPointerCapture(e.pointerId);\n\n const bpr = bytesPerRow(this.columns);\n const startX = pos % bpr;\n const startY = Math.floor(pos / bpr);\n\n if (e.metaKey || e.ctrlKey) {\n this._pointerMode = `select-rect`;\n this._dragAnchor = pos;\n this._rectAnchorX = startX;\n this._rectAnchorY = startY;\n } else if (e.shiftKey) {\n this._pointerMode = `select-cont`;\n if (!this._selection || this._selection.kind !== `single`) {\n this._dragAnchor = pos;\n } else {\n this._dragAnchor = this._selection.pos;\n this._shiftClickTarget = pos;\n }\n } else {\n this._pointerMode = `pending`;\n this._dragStart = { pos, startValue: readByte(this._store, pos), startY: e.clientY, startX: e.clientX };\n this._dragAnchor = pos;\n this._currentDragDiff = null;\n }\n }\n\n private _onPointerMove(pos: BytePos, _side: `hex` | `text`, e: PointerEvent): void {\n if (!this._dragStart)\n return;\n\n const dy = Math.abs(e.clientY - this._dragStart.startY);\n const dx = Math.abs(e.clientX - this._dragStart.startX);\n\n if (this._pointerMode === `pending` && dy > 4 && dy > dx) {\n this._pointerMode = `drag-value`;\n this._editState = null;\n }\n\n if (this._pointerMode === `drag-value`) {\n const delta = Math.round((e.clientY - this._dragStart.startY) / 4);\n const newValue = Math.max(0, Math.min(255, this._dragStart.startValue - delta));\n this._currentDragDiff = writeByte(this._store, pos, newValue);\n this.requestUpdate();\n }\n\n if (this._pointerMode === `select-cont`) {\n if (this._dragAnchor !== null) {\n const mode = `contiguous`;\n this._selection = selectionFromPointerRange(this._dragAnchor, pos, mode, this.columns);\n this._dispatchSelectEvent();\n }\n }\n\n if (this._pointerMode === `select-rect`) {\n const bpr = bytesPerRow(this.columns);\n const currentX = pos % bpr;\n const currentY = Math.floor(pos / bpr);\n const x = Math.min(this._rectAnchorX, currentX);\n const y = Math.min(this._rectAnchorY, currentY);\n const width = Math.abs(currentX - this._rectAnchorX) + 1;\n const height = Math.abs(currentY - this._rectAnchorY) + 1;\n this._selection = { kind: `rectangular`, x, y, width, height };\n this._dispatchSelectEvent();\n }\n }\n\n private _onPointerUp(pos: BytePos, side: `hex` | `text`, e: PointerEvent): void {\n const target = e.target as Element;\n target.releasePointerCapture(e.pointerId);\n\n if (this._pointerMode === `pending`) {\n this._selection = { kind: `single`, pos };\n this._initialSelectionPoint = pos;\n this._currentCursorPoint = pos;\n this._editState = { pos, side, partial: `` };\n this._dispatchSelectEvent();\n }\n\n if (this._pointerMode === `select-cont`) {\n if (this._dragAnchor !== null && this._shiftClickTarget !== null) {\n this._selection = {\n kind: `contiguous`,\n start: this._dragAnchor,\n end: this._shiftClickTarget,\n };\n this._initialSelectionPoint = Math.min(this._dragAnchor, this._shiftClickTarget);\n this._currentCursorPoint = Math.max(this._dragAnchor, this._shiftClickTarget);\n this._dispatchSelectEvent();\n } else if (this._dragAnchor !== null) {\n const mode = `contiguous`;\n this._selection = selectionFromPointerRange(this._dragAnchor, pos, mode, this.columns);\n this._initialSelectionPoint = this._dragAnchor;\n this._currentCursorPoint = pos;\n this._dispatchSelectEvent();\n }\n }\n\n if (this._pointerMode === `select-rect`) {\n const bpr = bytesPerRow(this.columns);\n const currentX = pos % bpr;\n const currentY = Math.floor(pos / bpr);\n const x = Math.min(this._rectAnchorX, currentX);\n const y = Math.min(this._rectAnchorY, currentY);\n const width = Math.abs(currentX - this._rectAnchorX) + 1;\n const height = Math.abs(currentY - this._rectAnchorY) + 1;\n this._selection = { kind: `rectangular`, x, y, width, height };\n this._dispatchSelectEvent();\n }\n\n if (this._pointerMode === `drag-value` && this._currentDragDiff) {\n pushDiff(this._undoStack, this._currentDragDiff);\n this._dispatchChangeEvent(this._currentDragDiff);\n }\n\n this._pointerMode = null;\n this._dragStart = null;\n this._dragAnchor = null;\n this._currentDragDiff = null;\n this._shiftClickTarget = null;\n }\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n const isNavigationKey = [`ArrowLeft`, `ArrowRight`, `ArrowUp`, `ArrowDown`].includes(e.key);\n\n if (isNavigationKey) {\n e.preventDefault();\n e.stopPropagation();\n\n if (this._editState) {\n this._editState = null;\n }\n\n const dir = e.key.replace(`Arrow`, ``).toLowerCase() as `left` | `right` | `up` | `down`;\n const dataLen = storeLength(this._store);\n const bpr = bytesPerRow(this.columns);\n\n if (e.metaKey || e.ctrlKey) {\n if (!this._selection || this._selection.kind !== `rectangular`) {\n let startPos = 0;\n if (this._selection?.kind === `single`) {\n startPos = this._selection.pos;\n } else if (this._selection?.kind === `contiguous`) {\n startPos = Math.min(this._selection.start, this._selection.end);\n }\n this._rectAnchorXFromKeyboard = startPos % bpr;\n this._rectAnchorYFromKeyboard = Math.floor(startPos / bpr);\n this._selection = { kind: `rectangular`, x: this._rectAnchorXFromKeyboard, y: this._rectAnchorYFromKeyboard, width: 1, height: 1 };\n }\n this._selection = extendRectangular(this._selection, dir, this.columns, dataLen, this._rectAnchorXFromKeyboard, this._rectAnchorYFromKeyboard);\n } else if (e.shiftKey) {\n if (!this._selection) {\n this._initialSelectionPoint = 0;\n this._currentCursorPoint = 0;\n } else if (this._selection.kind === `single`) {\n this._initialSelectionPoint = this._selection.pos;\n this._currentCursorPoint = this._selection.pos;\n } else if (this._selection.kind === `rectangular`) {\n const cursorPos = this._selection.y * bpr + this._selection.x;\n this._initialSelectionPoint = cursorPos;\n this._currentCursorPoint = cursorPos;\n }\n const newPos = getCursorPos(this._selection, dir, this.columns, dataLen);\n const start = Math.min(this._initialSelectionPoint, newPos);\n const end = Math.max(this._initialSelectionPoint, newPos);\n this._currentCursorPoint = newPos;\n this._selection = { kind: `contiguous`, start, end };\n } else {\n this._selection = moveSelection(this._selection, dir, this.columns, dataLen);\n const pos = getCursorPos(this._selection, dir, this.columns, dataLen);\n this._initialSelectionPoint = pos;\n this._currentCursorPoint = pos;\n }\n this._dispatchSelectEvent();\n this.requestUpdate();\n return;\n }\n\n if (e.key === `Tab`) {\n e.preventDefault();\n e.stopPropagation();\n if (this._editState) {\n this._advanceCursor();\n } else {\n const dataLen = storeLength(this._store);\n this._selection = moveSelection(this._selection, `right`, this.columns, dataLen);\n this._dispatchSelectEvent();\n }\n this.requestUpdate();\n return;\n }\n\n if (e.key === `Escape`) {\n e.preventDefault();\n e.stopPropagation();\n if (this._editState) {\n this._editState = null;\n } else if (this._selection && this._selection.kind !== `single`) {\n const sel = this._selection;\n let firstPos = 0;\n if ((sel as { kind: string }).kind === `contiguous`) {\n const c = sel as { start: number; end: number };\n firstPos = Math.min(c.start, c.end);\n }\n if ((sel as { kind: string }).kind === `rectangular`) {\n const r = sel as { y: number; x: number };\n firstPos = r.y * bytesPerRow(this.columns) + r.x;\n }\n this._selection = { kind: `single`, pos: firstPos };\n this._dispatchSelectEvent();\n }\n this.requestUpdate();\n return;\n }\n\n if (this._editState) {\n e.stopPropagation();\n\n if (e.key === `Backspace`) {\n this._handleBackspace();\n return;\n }\n\n if (e.key === `Enter`) {\n if (this._editState.side === `hex` && this._editState.partial.startsWith(`.`)) {\n this._commitDecimalValue();\n }\n return;\n }\n\n if (e.key.length === 1) {\n this._handleValueEntry(e.key);\n }\n return;\n }\n\n if (this._selection && this._selection.kind === `single` && e.key.length === 1) {\n e.preventDefault();\n e.stopPropagation();\n const pos = this._selection.pos;\n const side: `hex` | `text` = this._focusSide ?? `hex`;\n this._editState = { pos, side, partial: `` };\n this._handleValueEntry(e.key);\n }\n };\n\n private _handleBackspace(): void {\n if (!this._editState)\n return;\n this._editState = { ...this._editState, partial: `` };\n this.requestUpdate();\n }\n\n private _handleValueEntry(key: string): void {\n if (!this._editState)\n return;\n\n const { pos, side, partial } = this._editState;\n\n if (side === `text`) {\n if (key.length === 1 && key.charCodeAt(0) >= 0x20 && key.charCodeAt(0) <= 0x7E) {\n const value = key.charCodeAt(0);\n const diff = writeByte(this._store, pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n return;\n }\n\n if (partial === `` && key === `.`) {\n this._editState = { ...this._editState, partial: `.` };\n this.requestUpdate();\n return;\n }\n\n if (partial.startsWith(`.`)) {\n if (/\\d/.test(key)) {\n let newPartial = partial + key;\n if (Number(newPartial.slice(1)) > 255) {\n newPartial = `.255`;\n }\n this._editState = { ...this._editState, partial: newPartial };\n this.requestUpdate();\n }\n return;\n }\n\n const hexChars = `0123456789ABCDEFabcdef`;\n if (hexChars.includes(key)) {\n const newPartial = (partial + key.toUpperCase()).slice(-2);\n this._editState = { ...this._editState, partial: newPartial };\n this.requestUpdate();\n\n if (newPartial.length === 2) {\n const value = Number.parseInt(newPartial, 16);\n const diff = writeByte(this._store, pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n } else if (partial !== ``) {\n this._editState = { ...this._editState, partial: `` };\n this.requestUpdate();\n }\n }\n\n private _commitDecimalValue(): void {\n if (!this._editState)\n return;\n const value = Number.parseInt(this._editState.partial.slice(1), 10);\n if (!Number.isNaN(value)) {\n const diff = writeByte(this._store, this._editState.pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n }\n\n private _advanceCursor(): void {\n if (!this._editState)\n return;\n const dataLen = storeLength(this._store);\n const newPos = clampPos(this._editState.pos + 1, dataLen);\n this._editState = { pos: newPos, side: this._editState.side, partial: `` };\n this._selection = { kind: `single`, pos: newPos };\n this.requestUpdate();\n }\n\n private _dispatchChangeEvent(diff: Diff): void {\n this.dispatchEvent(new CustomEvent(`hex-change`, {\n detail: { diff },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _dispatchSelectEvent(): void {\n const sel = this._selection;\n let detail: SelectEventDetail;\n\n if (!sel) {\n detail = { type: `none` };\n } else if (sel.kind === `single`) {\n detail = { type: `single`, position: sel.pos };\n } else if (sel.kind === `contiguous`) {\n detail = { type: `contiguous`, start: sel.start, end: sel.end };\n } else if (sel.kind === `rectangular`) {\n detail = { type: `rectangular`, x: sel.x, y: sel.y, width: sel.width, height: sel.height };\n } else {\n detail = { type: `none` };\n }\n\n this.dispatchEvent(new CustomEvent(`select`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _copy(): void {\n const positions = getSelectedPositions(this._selection, this.columns);\n if (positions.length === 0)\n return;\n\n const bytes = positions.map((p: BytePos) => readByte(this._store, p));\n this._copyBuffer = new Uint8Array(bytes);\n\n const hexStr = bytes.map((b: number) => b.toString(16).padStart(2, `0`)).join(` `);\n navigator.clipboard?.writeText(hexStr).catch(() => {});\n }\n\n private async _paste(): Promise<void> {\n let bytes: number[] | null = null;\n\n try {\n const text = await navigator.clipboard?.readText();\n if (text) {\n bytes = this._parseHexString(text);\n }\n } catch {\n // ignore\n }\n\n if (!bytes && this._copyBuffer) {\n bytes = Array.from(this._copyBuffer);\n }\n\n if (!bytes || bytes.length === 0)\n return;\n\n if (!this._selection)\n return;\n\n const entries = new Map<BytePos, number>();\n\n if (this._selection.kind === `single`) {\n const startPos = this._selection.pos;\n const dataLen = storeLength(this._store);\n for (let i = 0; i < bytes.length && startPos + i < dataLen; i++) {\n entries.set(startPos + i, bytes[i]);\n }\n } else if (this._selection.kind === `contiguous`) {\n const startPos = Math.min(this._selection.start, this._selection.end);\n const endPos = Math.max(this._selection.start, this._selection.end);\n const available = endPos - startPos + 1;\n for (let i = 0; i < Math.min(bytes.length, available); i++) {\n entries.set(startPos + i, bytes[i]);\n }\n } else if (this._selection.kind === `rectangular`) {\n const { x, y, width, height } = this._selection;\n const bpr = bytesPerRow(this.columns);\n let byteIdx = 0;\n for (let row = 0; row < height && byteIdx < bytes.length; row++) {\n for (let col = 0; col < width && byteIdx < bytes.length; col++) {\n const pos = (y + row) * bpr + x + col;\n entries.set(pos, bytes[byteIdx++]);\n }\n }\n }\n\n if (entries.size > 0) {\n const diff = writeBytes(this._store, entries);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this.requestUpdate();\n }\n }\n\n private _parseHexString(text: string): number[] {\n const bytes: number[] = [];\n const cleaned = text.replace(/[^0-9A-F]/gi, ` `).trim();\n if (!cleaned)\n return bytes;\n\n const parts = cleaned.split(/\\s+/);\n for (const part of parts) {\n if (part.length === 1) {\n bytes.push(Number.parseInt(part + part, 16));\n } else if (part.length === 2) {\n bytes.push(Number.parseInt(part, 16));\n }\n }\n return bytes;\n }\n\n private _getColHeaders(): string[] {\n const headers: string[] = [];\n for (let i = 0; i < this.columns; i++) {\n const offset = i * 4;\n headers.push(`+${offset.toString(16).toUpperCase()}`);\n }\n return headers;\n }\n\n private _isRowShaded(pos: BytePos): boolean {\n const sel = this._selection;\n if (!sel || sel.kind !== `single`)\n return true;\n const bpr = bytesPerRow(this.columns);\n const row = Math.floor(pos / bpr);\n const selRow = Math.floor(sel.pos / bpr);\n return row === selRow;\n }\n\n private _isHexShaded(pos: BytePos): boolean {\n return this._isRowShaded(pos);\n }\n\n private _isTextShaded(pos: BytePos): boolean {\n return this._isRowShaded(pos);\n }\n\n protected render() {\n const dataLen = storeLength(this._store);\n const bpr = bytesPerRow(this.columns);\n const totalRows = Math.ceil(dataLen / bpr);\n const containerH = this._containerH > 0 ? this._containerH : 280;\n const startRow = Math.floor(this._scrollTop / this._rowHeight);\n const endRow = Math.min(startRow + Math.ceil(containerH / this._rowHeight) + 2, totalRows);\n const topSpacerHeight = startRow * this._rowHeight;\n const botSpacerHeight = (totalRows - endRow) * this._rowHeight;\n const changeset = getChangeset(this._store);\n\n const colHeaders = this._getColHeaders();\n const hexActive = this._focusSide === `hex` || this._focusSide === null;\n const textActive = this._focusSide === `text`;\n\n return html`\n <div class=\"hex-editor\" tabindex=\"0\" @keydown=${this._onKeyDown} @pointerleave=${() => {}}>\n <div class=\"header\">\n ${this.hideOffsetCol ? null : html`<span class=\"offset-cell\">Offset</span>`}\n ${this.hideHexCol ? null : repeat(colHeaders, h => html`<span class=\"col-header ${hexActive ? `active` : ``}\">${h}</span>`)}\n ${this.hideTextCol ? null : html`<span class=\"text-header ${textActive ? `active` : ``}\">Text</span>`}\n </div>\n <div class=\"scroll-container\" @scroll=${this._onScroll}>\n <div style=\"height: ${topSpacerHeight}px\"></div>\n ${repeat(\n Array.from({ length: endRow - startRow }, (_, i) => startRow + i),\n rowIndex => rowIndex,\n rowIndex => this._renderRow(rowIndex, changeset),\n )}\n <div style=\"height: ${botSpacerHeight}px\"></div>\n </div>\n </div>\n `;\n }\n\n private _renderRow(rowIndex: number, changeset: ReadonlySet<BytePos>) {\n const bpr = bytesPerRow(this.columns);\n const offset = rowIndex * bpr;\n\n return html`\n <div class=\"row\" data-row=${rowIndex}>\n ${this.hideOffsetCol ? null : html`<span class=\"offset-cell\">${offset.toString(16).toUpperCase().padStart(6, `0`)}</span>`}\n ${this.hideHexCol\n ? null\n : repeat(\n Array.from({ length: this.columns }, (_, i) => i),\n colIndex => colIndex,\n colIndex => this._renderColumn(rowIndex, colIndex, changeset),\n )}\n ${this.hideTextCol\n ? null\n : html`\n <span class=\"text-area\">\n ${repeat(\n Array.from({ length: bpr }, (_, i) => i),\n i => i,\n i => this._renderTextChar(offset + i, changeset),\n )}\n </span>\n `}\n </div>\n `;\n }\n\n private _renderColumn(rowIndex: number, colIndex: number, changeset: ReadonlySet<BytePos>) {\n const bpr = bytesPerRow(this.columns);\n const basePos = rowIndex * bpr + colIndex * 4;\n\n return html`\n <span class=\"col-group\">\n ${[0, 1, 2, 3].map(b => this._renderHexCell(basePos + b, changeset))}\n </span>\n `;\n }\n\n private _renderHexCell(pos: BytePos, changeset: ReadonlySet<BytePos>) {\n const dataLen = storeLength(this._store);\n if (pos >= dataLen) {\n return html`<span class=\"hex-cell\"></span>`;\n }\n\n const byte = readByte(this._store, pos);\n const hexStr = byte.toString(16).toUpperCase().padStart(2, `0`);\n\n const isSelected = selectionContains(this._selection, pos, this.columns);\n const isChanged = this.showChangeset && changeset.has(pos);\n const isEditing = this._editState?.pos === pos;\n\n const classes: string[] = [`hex-cell`];\n if (isSelected)\n classes.push(`selected`);\n if (isChanged)\n classes.push(`changed`);\n if (isEditing)\n classes.push(`editing`);\n if (this._isHexShaded(pos))\n classes.push(`shaded`);\n\n let displayText = hexStr;\n let colourStyle: Record<string, string> | undefined;\n\n if (isEditing && this._editState) {\n displayText = this._editState.partial === `` ? hexStr : `${this._editState.partial}_`;\n }\n\n if (this.colourScheme === `shade` && this._shadeMap) {\n colourStyle = { color: this._shadeMap.forByte(byte) };\n } else if (this.colourScheme === `ascii`) {\n classes.push(getAsciiClass(byte));\n }\n\n return html`\n <span\n class=${classes.join(` `)}\n style=${styleMap(colourStyle || {})}\n @pointerdown=${(e: PointerEvent) => this._onPointerDown(pos, `hex`, e)}\n @pointerup=${(e: PointerEvent) => this._onPointerUp(pos, `hex`, e)}\n @pointermove=${(e: PointerEvent) => this._onPointerMove(pos, `hex`, e)}\n >${displayText}</span>\n `;\n }\n\n private _renderTextChar(pos: BytePos, changeset: ReadonlySet<BytePos>) {\n const dataLen = storeLength(this._store);\n if (pos >= dataLen) {\n return html`<span class=\"text-char\"></span>`;\n }\n\n const byte = readByte(this._store, pos);\n const char = byte >= 0x20 && byte <= 0x7E ? String.fromCharCode(byte) : `.`;\n\n const isSelected = selectionContains(this._selection, pos, this.columns);\n const isChanged = this.showChangeset && changeset.has(pos);\n\n const classes: string[] = [`text-char`];\n if (isSelected)\n classes.push(`selected`);\n if (isChanged)\n classes.push(`changed`);\n if (this._isTextShaded(pos))\n classes.push(`shaded`);\n\n let colourStyle: Record<string, string> | undefined;\n\n if (this.colourScheme === `shade` && this._shadeMap) {\n colourStyle = { color: this._shadeMap.forByte(byte) };\n } else if (this.colourScheme === `ascii`) {\n classes.push(getAsciiClass(byte));\n }\n\n return html`\n <span\n class=${classes.join(` `)}\n style=${styleMap(colourStyle || {})}\n @pointerdown=${(e: PointerEvent) => this._onPointerDown(pos, `text`, e)}\n @pointerup=${(e: PointerEvent) => this._onPointerUp(pos, `text`, e)}\n @pointermove=${(e: PointerEvent) => this._onPointerMove(pos, `text`, e)}\n >${char}</span>\n `;\n }\n}\n\nexport type HexChangeDetail = {\n readonly diff: Diff;\n};\n\nexport type HexChangeEvent = CustomEvent<HexChangeDetail>;\n\nexport type SingleSelectEventDetail = { readonly type: `single`; readonly position: number };\nexport type ContiguousSelectEventDetail = { readonly type: `contiguous`; readonly start: number; readonly end: number };\nexport type RectangularSelectEventDetail = { readonly type: `rectangular`; readonly x: number; readonly y: number; readonly width: number; readonly height: number };\nexport type NoneSelectEventDetail = { readonly type: `none` };\nexport type SelectEventDetail = SingleSelectEventDetail | ContiguousSelectEventDetail | RectangularSelectEventDetail | NoneSelectEventDetail;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-hex-editor': IxfxHexEditorElement;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { LitElement } from "lit";
|
|
2
|
-
|
|
3
2
|
//#region src/hex/types.d.ts
|
|
4
3
|
type BytePos = number;
|
|
5
4
|
type SingleSelection = {
|
|
@@ -124,7 +123,7 @@ declare global {
|
|
|
124
123
|
interface HTMLElementTagNameMap {
|
|
125
124
|
'ixfx-hex-editor': IxfxHexEditorElement;
|
|
126
125
|
}
|
|
127
|
-
}
|
|
126
|
+
}
|
|
128
127
|
//#endregion
|
|
129
128
|
export { NoneSelectEventDetail as a, SingleSelectEventDetail as c, IxfxHexEditorElement as i, HexChangeDetail as n, RectangularSelectEventDetail as o, HexChangeEvent as r, SelectEventDetail as s, ContiguousSelectEventDetail as t };
|
|
130
|
-
//# sourceMappingURL=hex-editor-
|
|
129
|
+
//# sourceMappingURL=hex-editor-Caq8vNQk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-editor-Caq8vNQk.d.ts","names":[],"sources":["../src/hex/types.ts","../src/hex/hex-editor.ts"],"mappings":";;KAAY;KAEA;WAA6B;WAAyB,KAAK;;KAC3D;WAAiC;WAA6B,OAAO;WAAkB,KAAK;;KAC5F;WAAkC;WAA8B;WAAoB;WAAoB;WAAwB;;KAChI,YAAY,kBAAkB,sBAAsB;KAYpD;WAAuB;WAAyB;;KAChD,OAAO,YAAY,SAAS;KAK5B;;;cCCC,6BAA6B;EAExC;EAGA,cAAc;EAGd;EAGA;EAGA;EAGA;UAGQ;UAGA;UAGA;UAGA;UAGA;UAGA;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;SAED,sBAAM;EA4Ib,QAAQ,MAAM;EASd;EASA;EAQA;EAUE,iBAAiB;IAAY;IAAyB;IAAqB;;EAY7E,iBAAiB;EAIjB,aAAa;EAMb,iBAAiB,eAAe;EAUhC,kBAAkB,WAAW,WAAW,eAAe;EAYvD;EAMA,gBAAgB;YAIG;UAaX;UAMA;UAoCA;UAwCA;UAuDA;UA4HA;UAOA;UAsDA;UAYA;UAUA;UAQA;UAuBA;UAYM;UAyDN;UAiBA;UASA;UAUA;UAIA;YAIE,wBAAM;UAmCR;UA6BA;UAWA;UA+CA;;KAwCE;WACD,MAAM;;KAGL,iBAAiB,YAAY;KAE7B;WAAqC;WAAyB;;KAC9D;WAAyC;WAA6B;WAAwB;;KAC9F;WAA0C;WAA8B;WAAoB;WAAoB;WAAwB;;KACxI;WAAmC;;KACnC,oBAAoB,0BAA0B,8BAA8B,+BAA+B;QAE/G;YACI;IACR,mBAAmB"}
|
package/dist/hex.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as NoneSelectEventDetail, c as SingleSelectEventDetail, i as IxfxHexEditorElement, n as HexChangeDetail, o as RectangularSelectEventDetail, r as HexChangeEvent, s as SelectEventDetail, t as ContiguousSelectEventDetail } from "./hex-editor-
|
|
1
|
+
import { a as NoneSelectEventDetail, c as SingleSelectEventDetail, i as IxfxHexEditorElement, n as HexChangeDetail, o as RectangularSelectEventDetail, r as HexChangeEvent, s as SelectEventDetail, t as ContiguousSelectEventDetail } from "./hex-editor-Caq8vNQk.js";
|
|
2
2
|
export { ContiguousSelectEventDetail, HexChangeDetail, HexChangeEvent, IxfxHexEditorElement, NoneSelectEventDetail, RectangularSelectEventDetail, SelectEventDetail, SingleSelectEventDetail };
|
package/dist/hex.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as IxfxHexEditorElement } from "./hex-editor-
|
|
1
|
+
import { t as IxfxHexEditorElement } from "./hex-editor-Bk6rxhfg.js";
|
|
2
2
|
export { IxfxHexEditorElement };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"highlight-B-eQrhhb.js","names":[],"sources":["../src/incr-search/highlight.ts"],"sourcesContent":["import type { HighlightOptions, HighlightTarget } from './types.js';\n\nconst DEFAULT_KEY = `incr-search-highlight`;\n\nexport function applyHighlights(\n targets: readonly HighlightTarget[],\n options: HighlightOptions = {},\n): void {\n if (typeof CSS === `undefined` || !CSS.highlights)\n return;\n\n const key = options.key ?? DEFAULT_KEY;\n CSS.highlights.delete(key);\n\n const ranges: Range[] = [];\n\n for (const { element, text, positions } of targets) {\n if (!positions.size)\n continue;\n\n const textNode = findTextNode(element, text);\n if (!textNode)\n continue;\n\n for (const pos of positions) {\n const range = new Range();\n range.setStart(textNode, pos);\n range.setEnd(textNode, pos + 1);\n ranges.push(range);\n }\n }\n\n if (ranges.length > 0) {\n CSS.highlights.set(key, new Highlight(...ranges));\n }\n}\n\nexport function clearHighlights(options: HighlightOptions = {}): void {\n if (typeof CSS === `undefined` || !CSS.highlights)\n return;\n CSS.highlights.delete(options.key ?? DEFAULT_KEY);\n}\n\nexport function buildHighlightTargets<T>(\n root: ShadowRoot | Element,\n itemSelector: string,\n positionsByItem: ReadonlyMap<T, ReadonlySet<number>>,\n getItem: (el: Element) => T | undefined,\n getText: (el: Element) => string,\n): HighlightTarget[] {\n const targets: HighlightTarget[] = [];\n const labelEls = root.querySelectorAll(itemSelector);\n\n for (const el of labelEls) {\n const item = getItem(el);\n if (item === undefined)\n continue;\n const positions = positionsByItem.get(item);\n if (!positions || positions.size === 0)\n continue;\n targets.push({ element: el, text: getText(el), positions });\n }\n\n return targets;\n}\n\nfunction findTextNode(element: Element, expectedText?: string): Text | null {\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n if (expectedText === undefined || node.textContent === expectedText) {\n return node as Text;\n }\n }\n }\n return null;\n}\n"],"mappings":";AAEA,MAAM,cAAc;AAEpB,SAAgB,gBACd,SACA,UAA4B,CAAC,GACvB;CACN,IAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,YACrC;CAEF,MAAM,MAAM,QAAQ,OAAO;CAC3B,IAAI,WAAW,OAAO,GAAG;CAEzB,MAAM,SAAkB,CAAC;CAEzB,KAAK,MAAM,EAAE,SAAS,MAAM,eAAe,SAAS;EAClD,IAAI,CAAC,UAAU,MACb;EAEF,MAAM,WAAW,aAAa,SAAS,IAAI;EAC3C,IAAI,CAAC,UACH;EAEF,KAAK,MAAM,OAAO,WAAW;GAC3B,MAAM,QAAQ,IAAI,MAAM;GACxB,MAAM,SAAS,UAAU,GAAG;GAC5B,MAAM,OAAO,UAAU,MAAM,CAAC;GAC9B,OAAO,KAAK,KAAK;EACnB;CACF;CAEA,IAAI,OAAO,SAAS,GAClB,IAAI,WAAW,IAAI,KAAK,IAAI,UAAU,GAAG,MAAM,CAAC;AAEpD;AAEA,SAAgB,gBAAgB,UAA4B,CAAC,GAAS;CACpE,IAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,YACrC;CACF,IAAI,WAAW,OAAO,QAAQ,OAAO,WAAW;AAClD;AAEA,SAAgB,sBACd,MACA,cACA,iBACA,SACA,SACmB;CACnB,MAAM,UAA6B,CAAC;CACpC,MAAM,WAAW,KAAK,iBAAiB,YAAY;CAEnD,KAAK,MAAM,MAAM,UAAU;EACzB,MAAM,OAAO,QAAQ,EAAE;EACvB,IAAI,SAAS,KAAA,GACX;EACF,MAAM,YAAY,gBAAgB,IAAI,IAAI;EAC1C,IAAI,CAAC,aAAa,UAAU,SAAS,GACnC;EACF,QAAQ,KAAK;GAAE,SAAS;GAAI,MAAM,QAAQ,EAAE;GAAG;EAAU,CAAC;CAC5D;CAEA,OAAO;AACT;AAEA,SAAS,aAAa,SAAkB,cAAoC;CAC1E,KAAK,MAAM,QAAQ,QAAQ,YACzB,IAAI,KAAK,aAAa,KAAK;
|
|
1
|
+
{"version":3,"file":"highlight-B-eQrhhb.js","names":[],"sources":["../src/incr-search/highlight.ts"],"sourcesContent":["import type { HighlightOptions, HighlightTarget } from './types.js';\n\nconst DEFAULT_KEY = `incr-search-highlight`;\n\nexport function applyHighlights(\n targets: readonly HighlightTarget[],\n options: HighlightOptions = {},\n): void {\n if (typeof CSS === `undefined` || !CSS.highlights)\n return;\n\n const key = options.key ?? DEFAULT_KEY;\n CSS.highlights.delete(key);\n\n const ranges: Range[] = [];\n\n for (const { element, text, positions } of targets) {\n if (!positions.size)\n continue;\n\n const textNode = findTextNode(element, text);\n if (!textNode)\n continue;\n\n for (const pos of positions) {\n const range = new Range();\n range.setStart(textNode, pos);\n range.setEnd(textNode, pos + 1);\n ranges.push(range);\n }\n }\n\n if (ranges.length > 0) {\n CSS.highlights.set(key, new Highlight(...ranges));\n }\n}\n\nexport function clearHighlights(options: HighlightOptions = {}): void {\n if (typeof CSS === `undefined` || !CSS.highlights)\n return;\n CSS.highlights.delete(options.key ?? DEFAULT_KEY);\n}\n\nexport function buildHighlightTargets<T>(\n root: ShadowRoot | Element,\n itemSelector: string,\n positionsByItem: ReadonlyMap<T, ReadonlySet<number>>,\n getItem: (el: Element) => T | undefined,\n getText: (el: Element) => string,\n): HighlightTarget[] {\n const targets: HighlightTarget[] = [];\n const labelEls = root.querySelectorAll(itemSelector);\n\n for (const el of labelEls) {\n const item = getItem(el);\n if (item === undefined)\n continue;\n const positions = positionsByItem.get(item);\n if (!positions || positions.size === 0)\n continue;\n targets.push({ element: el, text: getText(el), positions });\n }\n\n return targets;\n}\n\nfunction findTextNode(element: Element, expectedText?: string): Text | null {\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n if (expectedText === undefined || node.textContent === expectedText) {\n return node as Text;\n }\n }\n }\n return null;\n}\n"],"mappings":";AAEA,MAAM,cAAc;AAEpB,SAAgB,gBACd,SACA,UAA4B,CAAC,GACvB;CACN,IAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,YACrC;CAEF,MAAM,MAAM,QAAQ,OAAO;CAC3B,IAAI,WAAW,OAAO,GAAG;CAEzB,MAAM,SAAkB,CAAC;CAEzB,KAAK,MAAM,EAAE,SAAS,MAAM,eAAe,SAAS;EAClD,IAAI,CAAC,UAAU,MACb;EAEF,MAAM,WAAW,aAAa,SAAS,IAAI;EAC3C,IAAI,CAAC,UACH;EAEF,KAAK,MAAM,OAAO,WAAW;GAC3B,MAAM,QAAQ,IAAI,MAAM;GACxB,MAAM,SAAS,UAAU,GAAG;GAC5B,MAAM,OAAO,UAAU,MAAM,CAAC;GAC9B,OAAO,KAAK,KAAK;EACnB;CACF;CAEA,IAAI,OAAO,SAAS,GAClB,IAAI,WAAW,IAAI,KAAK,IAAI,UAAU,GAAG,MAAM,CAAC;AAEpD;AAEA,SAAgB,gBAAgB,UAA4B,CAAC,GAAS;CACpE,IAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,YACrC;CACF,IAAI,WAAW,OAAO,QAAQ,OAAO,WAAW;AAClD;AAEA,SAAgB,sBACd,MACA,cACA,iBACA,SACA,SACmB;CACnB,MAAM,UAA6B,CAAC;CACpC,MAAM,WAAW,KAAK,iBAAiB,YAAY;CAEnD,KAAK,MAAM,MAAM,UAAU;EACzB,MAAM,OAAO,QAAQ,EAAE;EACvB,IAAI,SAAS,KAAA,GACX;EACF,MAAM,YAAY,gBAAgB,IAAI,IAAI;EAC1C,IAAI,CAAC,aAAa,UAAU,SAAS,GACnC;EACF,QAAQ,KAAK;GAAE,SAAS;GAAI,MAAM,QAAQ,EAAE;GAAG;EAAU,CAAC;CAC5D;CAEA,OAAO;AACT;AAEA,SAAS,aAAa,SAAkB,cAAoC;CAC1E,KAAK,MAAM,QAAQ,QAAQ,YACzB,IAAI,KAAK,aAAa,KAAK,WACrB;MAAA,iBAAiB,KAAA,KAAa,KAAK,gBAAgB,cACrD,OAAO;CAAA;CAIb,OAAO;AACT"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as themeFallbacks } from "./fallbacks-pNMOMx38.js";
|
|
2
|
-
import { n as safeCustomElement, t as __decorate } from "./decorate-
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
3
3
|
import { r as iconBus, t as getIcon } from "./registry-CkW7q09Q.js";
|
|
4
4
|
import { LitElement, css, html, nothing } from "lit";
|
|
5
5
|
import { property } from "lit/decorators.js";
|
|
@@ -39,8 +39,10 @@ let IxfxIconElement = class IxfxIconElement extends LitElement {
|
|
|
39
39
|
}
|
|
40
40
|
updated(changed) {
|
|
41
41
|
super.updated(changed);
|
|
42
|
-
if (changed.has(`rotate`))
|
|
43
|
-
|
|
42
|
+
if (changed.has(`rotate`)) {
|
|
43
|
+
if (this.rotate?.length > 0) this.style.setProperty(`--rotate`, this.rotate);
|
|
44
|
+
else this.style.removeProperty(`--rotate`);
|
|
45
|
+
}
|
|
44
46
|
}
|
|
45
47
|
static {
|
|
46
48
|
this.styles = [themeFallbacks, css`
|
|
@@ -97,4 +99,4 @@ IxfxIconElement = __decorate([safeCustomElement(`ixfx-icon`)], IxfxIconElement);
|
|
|
97
99
|
//#endregion
|
|
98
100
|
export { IxfxIconElement as t };
|
|
99
101
|
|
|
100
|
-
//# sourceMappingURL=icon-
|
|
102
|
+
//# sourceMappingURL=icon-B22XVlCt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-
|
|
1
|
+
{"version":3,"file":"icon-B22XVlCt.js","names":["#onIconChange","customElement"],"sources":["../src/icons/icon.ts"],"sourcesContent":["import type { IconChangedEvent } from './registry.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { getIcon, iconBus } from './registry.js';\n\n/**\n * Renders an icon from the icon registry by name.\n *\n * @example\n * ```html\n * <ixfx-icon name=\"chevron-down\"></ixfx-icon>\n * <ixfx-icon name=\"close\" size=\"32\" label=\"Close dialog\"></ixfx-icon>\n * ```\n *\n * Use `registerIcon(name, svgString)` to add or override icons.\n */\n@customElement(`ixfx-icon`)\nexport class IxfxIconElement extends LitElement {\n @property() name = ``;\n @property({ type: Number }) size: number | undefined;\n @property() label = ``;\n @property({ type: Boolean, attribute: `prominence` }) prominence = false;\n @property({ type: String, attribute: `rotate`, reflect: true }) rotate = ``;\n\n #onIconChange = (e: Event): void => {\n if ((e as IconChangedEvent).detail.name === this.name) {\n this.requestUpdate();\n }\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n iconBus.addEventListener(`ixfx-icon-change`, this.#onIconChange);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n iconBus.removeEventListener(`ixfx-icon-change`, this.#onIconChange);\n }\n\n protected override render() {\n const svg = getIcon(this.name);\n if (!svg)\n return nothing;\n\n const hasLabel = this.label.length > 0;\n\n return html`\n <span\n class=\"icon-wrapper\"\n aria-hidden=${hasLabel ? nothing : `true`}\n aria-label=${hasLabel ? this.label : nothing}\n >${unsafeHTML(svg)}</span>\n `;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`rotate`)) {\n if (this.rotate?.length > 0) {\n this.style.setProperty(`--rotate`, this.rotate);\n } else {\n this.style.removeProperty(`--rotate`);\n }\n }\n }\n\n static override styles = [themeFallbacks, css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1em;\n height: 1em;\n opacity: var(--opacity, 1);\n }\n\n :host([prominence]) {\n opacity: var(--prominence-idle-opacity, 1);\n }\n\n :host([prominence]:hover) {\n opacity: var(--prominence-tickled-opacity, 1);\n }\n\n :host([prominence][disabled]) {\n opacity: var(--prominence-disabled-opacity, 0.5);\n }\n\n .icon-wrapper {\n display: contents;\n }\n\n :host svg {\n width: 100%;\n height: 100%;\n transition: transform var(--transition, 0.15s ease-out);\n }\n\n :host([rotate]) svg {\n transform: rotate(var(--rotate));\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-icon': IxfxIconElement;\n }\n}\n"],"mappings":";;;;;;;AAoBO,IAAM,kBAAN,MAAM,wBAAwB,WAAW;;;EAC3B,KAAA,OAAA;EAEC,KAAA,QAAA;EAC+C,KAAA,aAAA;EACM,KAAA,SAAA;EAExD,KAAA,iBAAA,MAAmB;GAClC,IAAK,EAAuB,OAAO,SAAS,KAAK,MAC/C,KAAK,cAAc;EAEvB;;CAJA;CAMA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,QAAQ,iBAAiB,oBAAoB,KAAKA,aAAa;CACjE;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,QAAQ,oBAAoB,oBAAoB,KAAKA,aAAa;CACpE;CAEA,SAA4B;EAC1B,MAAM,MAAM,QAAQ,KAAK,IAAI;EAC7B,IAAI,CAAC,KACH,OAAO;EAET,MAAM,WAAW,KAAK,MAAM,SAAS;EAErC,OAAO,IAAI;;;sBAGO,WAAW,UAAU,OAAO;qBAC7B,WAAW,KAAK,QAAQ,QAAQ;SAC5C,WAAW,GAAG,EAAE;;CAEvB;CAEA,QAA2B,SAAqC;EAC9D,MAAM,QAAQ,OAAO;EACrB,IAAI,QAAQ,IAAI,QAAQ,GAAG;GACzB,IAAI,KAAK,QAAQ,SAAS,GACxB,KAAK,MAAM,YAAY,YAAY,KAAK,MAAM;QAE9C,KAAK,MAAM,eAAe,UAAU;EAExC;CACF;;EAEyB,KAAA,SAAA,CAAC,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmC5C;;AACH;AArFG,WAAA,CAAA,SAAS,CAAA,GAAA,gBAAA,WAAA,QAAA,KAAA,CAAA;AACT,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,gBAAA,WAAA,QAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,CAAA,GAAA,gBAAA,WAAA,SAAA,KAAA,CAAA;AACT,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,WAAW;AAAa,CAAC,CAAA,GAAA,gBAAA,WAAA,cAAA,KAAA,CAAA;AACnD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAU,SAAS;AAAK,CAAC,CAAA,GAAA,gBAAA,WAAA,UAAA,KAAA,CAAA;AAN/DC,kBAAAA,WAAAA,CAAAA,kBAAc,WAAW,CAAA,GAAA,eAAA"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { LitElement, nothing } from "lit";
|
|
2
|
-
|
|
3
2
|
//#region src/icons/icon.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Renders an icon from the icon registry by name.
|
|
@@ -29,7 +28,7 @@ declare global {
|
|
|
29
28
|
interface HTMLElementTagNameMap {
|
|
30
29
|
'ixfx-icon': IxfxIconElement;
|
|
31
30
|
}
|
|
32
|
-
}
|
|
31
|
+
}
|
|
33
32
|
//#endregion
|
|
34
33
|
export { IxfxIconElement as t };
|
|
35
|
-
//# sourceMappingURL=icon-
|
|
34
|
+
//# sourceMappingURL=icon-DpA9x2Ve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-DpA9x2Ve.d.ts","names":[],"sources":["../src/icons/icon.ts"],"mappings":";;;;;;;;;;;;;cAoBa,wBAAwB;;EACvB;EACgB;EAChB;EAC0C;EACU;EAQvD;EAKA;YAKU,iBAAM,wBAAA;YAgBN,QAAQ,SAAS;SAWpB,sBAAM;;QAsChB;YACI;IACR,aAAa"}
|
package/dist/icons.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as IxfxIconElement } from "./icon-
|
|
2
|
-
import { a as iconBus, c as ICON_CARET_RIGHT, d as ICON_CLOSE, i as hasIcon, l as ICON_CHECK, n as IconChangedEvent, o as registerIcon, r as getIcon, s as svgToDataUri, t as IconChangedDetail, u as ICON_CHEVRON_DOWN } from "./index-
|
|
1
|
+
import { t as IxfxIconElement } from "./icon-DpA9x2Ve.js";
|
|
2
|
+
import { a as iconBus, c as ICON_CARET_RIGHT, d as ICON_CLOSE, i as hasIcon, l as ICON_CHECK, n as IconChangedEvent, o as registerIcon, r as getIcon, s as svgToDataUri, t as IconChangedDetail, u as ICON_CHEVRON_DOWN } from "./index-BtGFYfaK.js";
|
|
3
3
|
export { ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE, type IconChangedDetail, type IconChangedEvent, IxfxIconElement, getIcon, hasIcon, iconBus, registerIcon, svgToDataUri };
|
package/dist/icons.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as svgToDataUri, i as registerIcon, n as hasIcon, r as iconBus, t as getIcon } from "./registry-CkW7q09Q.js";
|
|
2
|
-
import { t as IxfxIconElement } from "./icon-
|
|
2
|
+
import { t as IxfxIconElement } from "./icon-B22XVlCt.js";
|
|
3
3
|
import { a as registerDefaults, i as ICON_CLOSE, n as ICON_CHECK, r as ICON_CHEVRON_DOWN, t as ICON_CARET_RIGHT } from "./defaults-C3b9OWJD.js";
|
|
4
4
|
//#region src/icons/index.ts
|
|
5
5
|
registerDefaults();
|
|
@@ -10,8 +10,9 @@ function defaultSelector(item) {
|
|
|
10
10
|
return String(item);
|
|
11
11
|
}
|
|
12
12
|
function createFuzzySearch(items, options = {}) {
|
|
13
|
+
const selector = options.selector ?? defaultSelector;
|
|
13
14
|
const fzf = new Fzf(items, {
|
|
14
|
-
selector
|
|
15
|
+
selector,
|
|
15
16
|
...options.fzf ?? {}
|
|
16
17
|
});
|
|
17
18
|
const find = (query) => {
|
|
@@ -223,10 +224,11 @@ var IncrSearchTreeController = class {
|
|
|
223
224
|
return;
|
|
224
225
|
}
|
|
225
226
|
const labelSelector = this.#opts.labelSelector ?? `.tree-label`;
|
|
226
|
-
|
|
227
|
+
const targets = buildHighlightTargets(this.#el.shadowRoot, labelSelector, state.positionsByItem, (labelEl) => {
|
|
227
228
|
const text = labelEl.textContent ?? ``;
|
|
228
229
|
return this.#labelMap.get(text);
|
|
229
|
-
}, (labelEl) => labelEl.textContent ?? ``)
|
|
230
|
+
}, (labelEl) => labelEl.textContent ?? ``);
|
|
231
|
+
applyHighlights(targets, { key });
|
|
230
232
|
}
|
|
231
233
|
};
|
|
232
234
|
//#endregion
|
|
@@ -252,10 +254,11 @@ function createElementIncrSearch(opts) {
|
|
|
252
254
|
clearHighlights({ key: highlightKey });
|
|
253
255
|
return;
|
|
254
256
|
}
|
|
255
|
-
|
|
257
|
+
const targets = buildHighlightTargets(container, labelSelector ?? itemSelector, state.positionsByItem, (el) => {
|
|
256
258
|
const key = getKey(el);
|
|
257
259
|
return state.results.find((r) => r.item.key === key)?.item;
|
|
258
|
-
}, (el) => getLabel(el))
|
|
260
|
+
}, (el) => getLabel(el));
|
|
261
|
+
applyHighlights(targets, { key: highlightKey });
|
|
259
262
|
};
|
|
260
263
|
const unsubscribeState = search.onChange((state) => {
|
|
261
264
|
updateVisibility(state);
|
|
@@ -310,4 +313,4 @@ function createElementIncrSearch(opts) {
|
|
|
310
313
|
//#endregion
|
|
311
314
|
export { createFuzzySearch as a, createAcCompletionProvider as i, IncrSearchTreeController as n, createIncrSearch as r, createElementIncrSearch as t };
|
|
312
315
|
|
|
313
|
-
//# sourceMappingURL=incr-search-
|
|
316
|
+
//# sourceMappingURL=incr-search-2pz21xtR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incr-search-2pz21xtR.js","names":["FzfAny","#el","#opts","#search","#labelMap","#onInput","#onKeydown","#unsub","#onStateChange"],"sources":["../src/incr-search/fuzzy.ts","../src/incr-search/ac-adapter.ts","../src/incr-search/incr-search.ts","../src/incr-search/controller-tree.ts","../src/incr-search/element-search.ts"],"sourcesContent":["import type { FuzzySearch, FuzzySearchOptions, IncrSearchResult } from './types.js';\nimport { Fzf } from 'fzf';\n\nfunction defaultSelector<T>(item: T): string {\n if (typeof item === `string`)\n return item;\n const r = item as Record<string, unknown>;\n if (typeof r.label === `string`)\n return r.label;\n if (typeof r.key === `string`)\n return r.key;\n if (typeof r.value === `string`)\n return r.value;\n return String(item);\n}\n\nexport function createFuzzySearch<T>(\n items: readonly T[],\n options: FuzzySearchOptions<T> = {},\n): FuzzySearch<T> {\n const selector = options.selector ?? defaultSelector<T>;\n // fzf uses a conditional SyncOptionsTuple<T> rest-parameter overload that TypeScript\n // cannot narrow through a spread when T is generic.\n const FzfAny = Fzf as new (list: readonly T[], opts: any) => { find: (q: string) => Array<{ item: T; positions: ReadonlySet<number>; score: number }> };\n const fzf = new FzfAny(items as readonly T[], { selector, ...(options.fzf ?? {}) });\n\n const find = (query: string): ReadonlyArray<IncrSearchResult<T>> => {\n if (!query.trim()) {\n return items.map(item => ({\n item,\n positions: new Set<number>(),\n score: 0,\n }));\n }\n return fzf.find(query).map(r => ({\n item: r.item,\n positions: r.positions,\n score: r.score,\n }));\n };\n\n return { find, items };\n}\n","import type { FuzzySearchOptions } from './types.js';\nimport { createFuzzySearch } from './fuzzy.js';\n\n/**\n * Creates an ixfx-ac-text-compatible `completionProvider` function from a\n * static item list. Uses synchronous fuzzy search wrapped in a Promise so it\n * fits the async provider signature.\n *\n * Each returned item has `positions` populated with matched character indices,\n * which `ixfx-ac-text` uses to render CSS Custom Highlights on the label.\n *\n * Empty query returns all items in original order (no positions).\n * A cancelled signal causes the returned promise to reject with an AbortError.\n */\nexport function createAcCompletionProvider<T extends { label: string }>(\n items: readonly T[],\n options: Pick<FuzzySearchOptions<T>, `selector`> = {},\n): (query: string, signal: AbortSignal) => Promise<Array<T & { positions: ReadonlySet<number> }>> {\n const selector = options.selector ?? ((item: T) => item.label);\n const fuzzy = createFuzzySearch(items, { selector });\n\n return (\n query: string,\n signal: AbortSignal,\n ): Promise<Array<T & { positions: ReadonlySet<number> }>> =>\n new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException(`Aborted`, `AbortError`));\n return;\n }\n\n const results = fuzzy.find(query).map(r => ({ ...r.item, positions: r.positions }));\n\n if (signal.aborted) {\n reject(new DOMException(`Aborted`, `AbortError`));\n return;\n }\n\n resolve(results);\n });\n}\n","import type {\n IncrSearch,\n IncrSearchChangeCallback,\n IncrSearchOptions,\n IncrSearchState,\n} from './types.js';\nimport { createFuzzySearch } from './fuzzy.js';\n\nfunction buildState<T>(results: ReturnType<ReturnType<typeof createFuzzySearch<T>>[`find`]>, query: string): IncrSearchState<T> {\n const positionsByItem = new Map<T, ReadonlySet<number>>();\n for (const r of results) {\n positionsByItem.set(r.item, r.positions);\n }\n return Object.freeze({\n query,\n results: Object.freeze([...results]),\n positionsByItem,\n });\n}\n\nexport function createIncrSearch<T>(options: IncrSearchOptions<T> = {}): IncrSearch<T> {\n let items: readonly T[] = options.items ?? [];\n let query = ``;\n let fuzzy = createFuzzySearch(items, { selector: options.selector, fzf: options.fzf });\n let state: IncrSearchState<T> = buildState(fuzzy.find(query), query);\n let disposed = false;\n\n const observers = new Set<IncrSearchChangeCallback<T>>();\n\n if (options.onChange) {\n observers.add(options.onChange);\n }\n\n const notify = (s: IncrSearchState<T>): void => {\n for (const cb of observers) {\n cb(s);\n }\n };\n\n const run = async (q: string, signal?: AbortSignal): Promise<IncrSearchState<T>> => {\n // Yield to the microtask queue for a consistent async interface\n await Promise.resolve();\n if (signal?.aborted || disposed) {\n return state;\n }\n const results = fuzzy.find(q);\n if (signal?.aborted || disposed) {\n return state;\n }\n state = buildState(results, q);\n notify(state);\n return state;\n };\n\n return {\n get state() {\n return state;\n },\n\n async setItems(newItems: readonly T[], signal?: AbortSignal): Promise<void> {\n items = newItems;\n fuzzy = createFuzzySearch(items, { selector: options.selector, fzf: options.fzf });\n await run(query, signal);\n },\n\n async setQuery(q: string, signal?: AbortSignal): Promise<IncrSearchState<T>> {\n query = q;\n return run(q, signal);\n },\n\n async clearQuery(): Promise<void> {\n query = ``;\n await run(``, undefined);\n },\n\n onChange(cb: IncrSearchChangeCallback<T>): () => void {\n observers.add(cb);\n cb(state);\n return () => {\n observers.delete(cb);\n };\n },\n\n dispose(): void {\n disposed = true;\n observers.clear();\n items = [];\n },\n };\n}\n","import type { FzfOptions } from 'fzf';\nimport type { TreeSearchHost } from '../common/searchable.js';\nimport type { TreeNode } from '../common/types.js';\nimport type { IncrSearchState } from './types.js';\nimport { applyHighlights, buildHighlightTargets, clearHighlights } from './highlight.js';\nimport { createIncrSearch } from './incr-search.js';\n\nconst DEFAULT_HIGHLIGHT_KEY = `incr-search-highlight`;\n\nexport type IncrSearchTreeOptions = {\n selector: (item: { node: TreeNode; depth: number }) => string;\n /**\n * CSS selector for the label elements inside the shadow root.\n * Defaults to `.tree-label` (suitable for ixfx-tree-list).\n * Use `.label` for ixfx-miller-list.\n */\n labelSelector?: string;\n highlightKey?: string;\n input?: HTMLInputElement;\n fzf?: Partial<FzfOptions<{ node: TreeNode; depth: number }>>;\n};\n\ntype SearchItem = { node: TreeNode; depth: number };\n\n/**\n * Incremental-search controller for any component implementing `TreeSearchHost`\n * (i.e. `ixfx-tree-list`, `ixfx-miller-list`, `ixfx-crumb-navigation`).\n *\n * Replaces the previous separate `IncrSearchTreeController` / `IncrSearchMillerController`\n * classes — the unified `TreeFilterPredicate` (with depth) means one implementation works\n * for all tree-like components.\n *\n * @example Using with ixfx-tree-list:\n * ```typescript\n * const ctrl = new IncrSearchTreeController(myTreeList, {\n * selector: item => item.node.item.label,\n * });\n * ctrl.connect();\n * ```\n *\n * @example Using with ixfx-miller-list (different label selector):\n * ```typescript\n * const ctrl = new IncrSearchTreeController(myMillerList, {\n * selector: item => item.node.item.label,\n * labelSelector: '.label',\n * });\n * ctrl.connect();\n * ```\n */\nexport class IncrSearchTreeController {\n #el: TreeSearchHost;\n #opts: IncrSearchTreeOptions;\n #search: ReturnType<typeof createIncrSearch<SearchItem>>;\n #unsub: (() => void) | undefined;\n #labelMap = new Map<string, SearchItem>();\n\n constructor(el: TreeSearchHost, opts: IncrSearchTreeOptions) {\n this.#el = el;\n this.#opts = opts;\n this.#search = createIncrSearch<SearchItem>({\n selector: opts.selector,\n fzf: opts.fzf,\n });\n }\n\n connect(): void {\n this.disconnect();\n\n const items = this.#el.getNodes();\n for (const item of items) {\n this.#labelMap.set(this.#opts.selector(item), item);\n }\n void this.#search.setItems(items);\n\n if (this.#opts.input) {\n this.#opts.input.addEventListener(`input`, this.#onInput);\n this.#opts.input.addEventListener(`keydown`, this.#onKeydown);\n }\n\n this.#unsub = this.#search.onChange(state => this.#onStateChange(state));\n }\n\n disconnect(): void {\n if (this.#unsub) {\n this.#unsub();\n this.#unsub = undefined;\n }\n if (this.#opts.input) {\n this.#opts.input.removeEventListener(`input`, this.#onInput);\n this.#opts.input.removeEventListener(`keydown`, this.#onKeydown);\n }\n this.#el.filterPredicate = undefined;\n clearHighlights({ key: this.#opts.highlightKey ?? DEFAULT_HIGHLIGHT_KEY });\n this.#labelMap.clear();\n }\n\n async setQuery(query: string): Promise<void> {\n await this.#search.setQuery(query);\n }\n\n async clearQuery(): Promise<void> {\n await this.#search.clearQuery();\n }\n\n #onInput = () => {\n const value = this.#opts.input?.value ?? ``;\n void this.setQuery(value);\n };\n\n #onKeydown = (e: KeyboardEvent) => {\n if (e.key === `Escape` && this.#opts.input) {\n this.#opts.input.value = ``;\n void this.clearQuery();\n }\n };\n\n #onStateChange(state: IncrSearchState<SearchItem>): void {\n const matched = new Set(state.results.map(r => r.item.node.item.key));\n const hasQuery = state.query.trim().length > 0;\n this.#el.filterPredicate = hasQuery && matched.size > 0\n ? (node: TreeNode, _depth: number) => matched.has(node.item.key)\n : undefined;\n\n const key = this.#opts.highlightKey ?? DEFAULT_HIGHLIGHT_KEY;\n if (!this.#el.shadowRoot)\n return;\n\n if (!state.query.trim()) {\n clearHighlights({ key });\n return;\n }\n\n const labelSelector = this.#opts.labelSelector ?? `.tree-label`;\n const targets = buildHighlightTargets(\n this.#el.shadowRoot,\n labelSelector,\n state.positionsByItem,\n (labelEl) => {\n const text = labelEl.textContent ?? ``;\n return this.#labelMap.get(text);\n },\n labelEl => labelEl.textContent ?? ``,\n );\n applyHighlights(targets, { key });\n }\n}\n","import type {\n ElementIncrSearchOptions,\n IncrSearchChangeCallback,\n IncrSearchState,\n} from './types.js';\nimport { applyHighlights, buildHighlightTargets, clearHighlights } from './highlight.js';\nimport { createIncrSearch } from './incr-search.js';\n\ntype ElementItem = { readonly key: string; readonly label: string };\n\nconst defaultGetLabel = (el: Element): string => el.textContent?.trim() ?? ``;\n\nfunction defaultGetKey(el: Element): string {\n return el.getAttribute(`data-key`)\n ?? el.getAttribute(`data-value`)\n ?? el.textContent?.trim()\n ?? ``;\n}\n\nexport type ElementIncrSearch = {\n readonly setQuery: (query: string, signal?: AbortSignal) => Promise<void>;\n readonly clearQuery: () => Promise<void>;\n readonly refresh: () => void;\n readonly onChange: (cb: IncrSearchChangeCallback<ElementItem>) => () => void;\n readonly dispose: () => void;\n};\n\nexport function createElementIncrSearch(opts: ElementIncrSearchOptions): ElementIncrSearch {\n const {\n container,\n itemSelector,\n getLabel = defaultGetLabel,\n getKey = defaultGetKey,\n labelSelector,\n highlightKey,\n } = opts;\n\n // Map from key → element reference for highlight lookup\n let elementByKey = new Map<string, Element>();\n\n const search = createIncrSearch<ElementItem>({\n selector: item => item.label,\n fzf: opts.fzf,\n });\n\n const updateVisibility = (state: IncrSearchState<ElementItem>): void => {\n const matchedKeys = new Set(state.results.map(r => r.item.key));\n const hasQuery = state.query.trim().length > 0;\n\n for (const [key, el] of elementByKey) {\n (el as HTMLElement).hidden = hasQuery ? !matchedKeys.has(key) : false;\n }\n };\n\n const updateHighlights = (state: IncrSearchState<ElementItem>): void => {\n if (!state.query.trim()) {\n clearHighlights({ key: highlightKey });\n return;\n }\n\n const sel = labelSelector ?? itemSelector;\n const targets = buildHighlightTargets(\n container,\n sel,\n state.positionsByItem,\n (el) => {\n const key = getKey(el);\n // Find the ElementItem whose key matches this element's key\n const result = state.results.find(r => r.item.key === key);\n return result?.item;\n },\n el => getLabel(el),\n );\n applyHighlights(targets, { key: highlightKey });\n };\n\n const unsubscribeState = search.onChange((state) => {\n updateVisibility(state);\n updateHighlights(state);\n opts.onChange?.(state);\n });\n\n let refreshPending = false;\n\n const refresh = (): void => {\n if (refreshPending)\n return;\n refreshPending = true;\n void Promise.resolve().then(() => {\n refreshPending = false;\n elementByKey = new Map<string, Element>();\n const els = container.querySelectorAll(itemSelector);\n const items: ElementItem[] = [];\n for (const el of els) {\n const key = getKey(el);\n elementByKey.set(key, el);\n items.push({ key, label: getLabel(el) });\n }\n void search.setItems(items);\n });\n };\n\n const observer = new MutationObserver(() => refresh());\n observer.observe(container, { childList: true, subtree: false });\n\n refresh();\n\n return {\n async setQuery(query, signal) {\n await search.setQuery(query, signal);\n },\n\n async clearQuery() {\n await search.clearQuery();\n },\n\n refresh,\n\n onChange(cb) {\n return search.onChange(cb);\n },\n\n dispose() {\n observer.disconnect();\n unsubscribeState();\n search.dispose();\n clearHighlights({ key: highlightKey });\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/incr-search.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { _ as IncrSearchChangeCallback, a as createFuzzySearch, b as IncrSearchState, c as IncrSearchTreeController, d as ElementIncrSearchOptions, f as FuzzySearch, g as IncrSearch, h as HighlightTarget, i as clearHighlights, l as IncrSearchTreeOptions, m as HighlightOptions, n as applyHighlights, o as ElementIncrSearch, p as FuzzySearchOptions, r as buildHighlightTargets, s as createElementIncrSearch, t as createIncrSearch, u as createAcCompletionProvider, v as IncrSearchOptions, y as IncrSearchResult } from "./index-
|
|
1
|
+
import { _ as IncrSearchChangeCallback, a as createFuzzySearch, b as IncrSearchState, c as IncrSearchTreeController, d as ElementIncrSearchOptions, f as FuzzySearch, g as IncrSearch, h as HighlightTarget, i as clearHighlights, l as IncrSearchTreeOptions, m as HighlightOptions, n as applyHighlights, o as ElementIncrSearch, p as FuzzySearchOptions, r as buildHighlightTargets, s as createElementIncrSearch, t as createIncrSearch, u as createAcCompletionProvider, v as IncrSearchOptions, y as IncrSearchResult } from "./index-Cxwxtj6g.js";
|
|
2
2
|
export { type ElementIncrSearch, type ElementIncrSearchOptions, type FuzzySearch, type FuzzySearchOptions, type HighlightOptions, type HighlightTarget, type IncrSearch, type IncrSearchChangeCallback, IncrSearchTreeController as IncrSearchMillerController, IncrSearchTreeController, type IncrSearchTreeOptions as IncrSearchMillerOptions, type IncrSearchTreeOptions, type IncrSearchOptions, type IncrSearchResult, type IncrSearchState, applyHighlights, buildHighlightTargets, clearHighlights, createAcCompletionProvider, createElementIncrSearch, createFuzzySearch, createIncrSearch };
|