@ixfx/components 0.2.5 → 0.2.6
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 +155 -29
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +1116 -310
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.d.ts +2 -3
- package/dist/ac-text.d.ts.map +1 -1
- package/dist/ac-text.js +4 -4
- package/dist/ac-text.js.map +1 -1
- package/dist/{button-DgKUzE5o.js → button-B9ztaKyl.js} +4 -4
- package/dist/button-B9ztaKyl.js.map +1 -0
- package/dist/button.d.ts +3 -4
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +1 -1
- package/dist/checkbox.d.ts +1 -2
- package/dist/checkbox.d.ts.map +1 -1
- package/dist/checkbox.js +3 -3
- package/dist/checkbox.js.map +1 -1
- package/dist/colour-C3MQIjFJ-BJV-QC-3.js.map +1 -1
- package/dist/{colour-picker-Bw-AZoWx.js → colour-picker-BNqDz4wK.js} +5 -5
- package/dist/colour-picker-BNqDz4wK.js.map +1 -0
- package/dist/colour-picker.d.ts +2 -2
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +2 -3
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +4 -4
- 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 +2 -3
- package/dist/data-display.js.map +1 -1
- package/dist/decorate-O4m1U4l3.js +25 -0
- package/dist/decorate-O4m1U4l3.js.map +1 -0
- package/dist/defaults-FEZaGiYZ.js.map +1 -1
- package/dist/dist-By5URG0Y.js.map +1 -1
- package/dist/dist-D7kJgnSE.js.map +1 -1
- package/dist/editable-label.d.ts.map +1 -1
- package/dist/editable-label.js +3 -3
- package/dist/editable-label.js.map +1 -1
- package/dist/{hex-editor-Gib1Grg2.d.ts → hex-editor-2_s0Ua5t.d.ts} +3 -4
- package/dist/hex-editor-2_s0Ua5t.d.ts.map +1 -0
- package/dist/{hex-editor-Wd6ZtZA2.js → hex-editor-gH3mteMr.js} +4 -4
- package/dist/hex-editor-gH3mteMr.js.map +1 -0
- package/dist/hex.d.ts +1 -1
- package/dist/hex.js +1 -1
- package/dist/highlight-CAjwQ4GE.js.map +1 -1
- package/dist/{icon-BR5aTIiP.js → icon-CYACf6o8.js} +4 -4
- package/dist/icon-CYACf6o8.js.map +1 -0
- package/dist/{icon-DQKdfR7U.d.ts → icon-CeTDJhC7.d.ts} +3 -4
- package/dist/icon-CeTDJhC7.d.ts.map +1 -0
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +1 -1
- package/dist/icons.js.map +1 -1
- package/dist/{incr-search-BjCNClnC.js → incr-search-BZawvrfl.js} +109 -109
- package/dist/incr-search-BZawvrfl.js.map +1 -0
- package/dist/incr-search.d.ts +2 -2
- package/dist/incr-search.js +1 -1
- package/dist/index-B1hNR7Z9.d.ts.map +1 -1
- package/dist/{index-CpbBI3n7.d.ts → index-CnL9krsH.d.ts} +3 -4
- package/dist/index-CnL9krsH.d.ts.map +1 -0
- package/dist/{index-CPVcTTXo.d.ts → index-CwGkb9s1.d.ts} +6 -7
- package/dist/index-CwGkb9s1.d.ts.map +1 -0
- package/dist/{index-C5dK8RZa.d.ts → index-DrQjA8Gs.d.ts} +3 -4
- package/dist/index-DrQjA8Gs.d.ts.map +1 -0
- package/dist/{index-C9iBN908.d.ts → index-V2cJorlA.d.ts} +29 -29
- package/dist/index-V2cJorlA.d.ts.map +1 -0
- package/dist/{index-CQxanqXF.d.ts → index-kY5gxbkI.d.ts} +16 -17
- package/dist/index-kY5gxbkI.d.ts.map +1 -0
- package/dist/index.d.ts +144 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +813 -23
- package/dist/index.js.map +1 -1
- package/dist/keyboard-De_vOHLg.js.map +1 -1
- package/dist/{labelled-input-base-DS6-6C0r.js → labelled-input-base-BvgH7ldm.js} +2 -2
- package/dist/{labelled-input-base-DS6-6C0r.js.map → labelled-input-base-BvgH7ldm.js.map} +1 -1
- package/dist/{labelled-input-base-DnRh4reU.d.ts → labelled-input-base-D-Y7agky.d.ts} +2 -3
- package/dist/labelled-input-base-D-Y7agky.d.ts.map +1 -0
- package/dist/labelled-radial-input.d.ts +4 -5
- package/dist/labelled-radial-input.d.ts.map +1 -1
- package/dist/labelled-radial-input.js +5 -5
- package/dist/labelled-radial-input.js.map +1 -1
- package/dist/labelled-range-input.d.ts +1 -1
- package/dist/labelled-range-input.js +4 -4
- package/dist/labelled-range-input.js.map +1 -1
- package/dist/led.d.ts +2 -3
- package/dist/led.d.ts.map +1 -1
- package/dist/led.js +3 -3
- package/dist/led.js.map +1 -1
- package/dist/{menu-BV6UFx_z.js → menu-C3eANB5M.js} +12 -12
- package/dist/menu-C3eANB5M.js.map +1 -0
- package/dist/{menu-item-DEzL_Yjk.js → menu-item-6IU5weHi.js} +7 -7
- package/dist/menu-item-6IU5weHi.js.map +1 -0
- package/dist/{menu-item-Cikacp4F.d.ts → menu-item-ClQF2DKN.d.ts} +7 -8
- package/dist/menu-item-ClQF2DKN.d.ts.map +1 -0
- package/dist/menu.d.ts +3 -3
- package/dist/menu.js +2 -2
- package/dist/miller.d.ts +2 -3
- package/dist/miller.d.ts.map +1 -1
- package/dist/miller.js +4 -4
- package/dist/miller.js.map +1 -1
- package/dist/narrowed-text.d.ts +2 -3
- package/dist/narrowed-text.d.ts.map +1 -1
- package/dist/narrowed-text.js +4 -4
- package/dist/narrowed-text.js.map +1 -1
- package/dist/panel.d.ts +2 -3
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +4 -4
- package/dist/panel.js.map +1 -1
- package/dist/plots.d.ts +1 -1
- package/dist/plots.js +1 -1
- package/dist/polar-pad.d.ts +1 -2
- package/dist/polar-pad.d.ts.map +1 -1
- package/dist/polar-pad.js +3 -3
- package/dist/polar-pad.js.map +1 -1
- package/dist/{radial-input-CNJ8asY2.js → radial-input-Dbc6fgCK.js} +4 -4
- package/dist/radial-input-Dbc6fgCK.js.map +1 -0
- package/dist/{radial-input-xSTd4kEz.d.ts → radial-input-LUSBEycd.d.ts} +2 -3
- package/dist/radial-input-LUSBEycd.d.ts.map +1 -0
- package/dist/radial-input.d.ts +1 -1
- package/dist/radial-input.js +1 -1
- package/dist/range-input.d.ts +2 -3
- package/dist/range-input.d.ts.map +1 -1
- package/dist/range-input.js +3 -3
- package/dist/range-input.js.map +1 -1
- package/dist/range.d.ts +2 -3
- package/dist/range.d.ts.map +1 -1
- package/dist/range.js +3 -3
- package/dist/range.js.map +1 -1
- package/dist/registry-CZEB1YI9.js.map +1 -1
- package/dist/selecthorizontal.d.ts +2 -3
- package/dist/selecthorizontal.d.ts.map +1 -1
- package/dist/selecthorizontal.js +3 -3
- package/dist/selecthorizontal.js.map +1 -1
- package/dist/snap-container.d.ts +1 -2
- package/dist/snap-container.d.ts.map +1 -1
- package/dist/snap-container.js +3 -3
- package/dist/snap-container.js.map +1 -1
- package/dist/split-layout.d.ts +2 -3
- package/dist/split-layout.d.ts.map +1 -1
- package/dist/split-layout.js +3 -3
- package/dist/split-layout.js.map +1 -1
- package/dist/swipe.d.ts.map +1 -1
- package/dist/swipe.js +3 -3
- package/dist/swipe.js.map +1 -1
- package/dist/{tab-list-CFF7uSYH.d.ts → tab-list-BnqISNvO.d.ts} +5 -6
- package/dist/tab-list-BnqISNvO.d.ts.map +1 -0
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +3 -3
- package/dist/tabs.js.map +1 -1
- package/dist/tickled-controller-Cq1Va0rR.d.ts.map +1 -1
- package/dist/tickled-styles-Bg3QbcrD.js.map +1 -1
- package/dist/{timeline-DBWJsSjd.js → timeline-B62Sz6J_.js} +5 -5
- package/dist/timeline-B62Sz6J_.js.map +1 -0
- package/dist/timeline.d.ts +2 -2
- package/dist/timeline.js +1 -1
- package/dist/{tooltip-kfUBWYVB.d.ts → tooltip-CwGfb4lp.d.ts} +2 -3
- package/dist/tooltip-CwGfb4lp.d.ts.map +1 -0
- package/dist/tree-component-CQpoPo4s.d.ts.map +1 -1
- package/dist/tree-data-model-DGvRVOFY.js.map +1 -1
- package/dist/tree.d.ts +3 -4
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +4 -4
- package/dist/tree.js.map +1 -1
- package/dist/types-BKaqnpwx.d.ts.map +1 -1
- package/dist/{xy-axis-BANbgrI5.js → xy-axis-C7fNxDwY.js} +5 -5
- package/dist/xy-axis-C7fNxDwY.js.map +1 -0
- package/dist/{xy-axis-CIFok7MF.d.ts → xy-axis-D9uwpGTT.d.ts} +5 -6
- package/dist/xy-axis-D9uwpGTT.d.ts.map +1 -0
- package/dist/xy-pad.d.ts +1 -2
- package/dist/xy-pad.d.ts.map +1 -1
- package/dist/xy-pad.js +3 -3
- package/dist/xy-pad.js.map +1 -1
- package/package.json +15 -11
- package/dist/button-DgKUzE5o.js.map +0 -1
- package/dist/colour-picker-Bw-AZoWx.js.map +0 -1
- package/dist/decorate-BZbkqIhA.js +0 -9
- package/dist/hex-editor-Gib1Grg2.d.ts.map +0 -1
- package/dist/hex-editor-Wd6ZtZA2.js.map +0 -1
- package/dist/icon-BR5aTIiP.js.map +0 -1
- package/dist/icon-DQKdfR7U.d.ts.map +0 -1
- package/dist/incr-search-BjCNClnC.js.map +0 -1
- package/dist/index-C5dK8RZa.d.ts.map +0 -1
- package/dist/index-C9iBN908.d.ts.map +0 -1
- package/dist/index-CPVcTTXo.d.ts.map +0 -1
- package/dist/index-CQxanqXF.d.ts.map +0 -1
- package/dist/index-CpbBI3n7.d.ts.map +0 -1
- package/dist/labelled-input-base-DnRh4reU.d.ts.map +0 -1
- package/dist/menu-BV6UFx_z.js.map +0 -1
- package/dist/menu-item-Cikacp4F.d.ts.map +0 -1
- package/dist/menu-item-DEzL_Yjk.js.map +0 -1
- package/dist/radial-input-CNJ8asY2.js.map +0 -1
- package/dist/radial-input-xSTd4kEz.d.ts.map +0 -1
- package/dist/tab-list-CFF7uSYH.d.ts.map +0 -1
- package/dist/timeline-DBWJsSjd.js.map +0 -1
- package/dist/tooltip-kfUBWYVB.d.ts.map +0 -1
- package/dist/xy-axis-BANbgrI5.js.map +0 -1
- package/dist/xy-axis-CIFok7MF.d.ts.map +0 -1
|
@@ -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":";;;KAmCY,YAAA;AAAA,KACA,SAAA;AAAA,KACA,gBAAA;AAAA,KAEA,yBAAA;EAAA,SACD,KAAK;AAAA;AAAA,KAEJ,wBAAA,GAA2B,WAAW,CAAC,yBAAA;AAAA,cAGtC,aAAA,SAAsB,UAAA;EACJ,IAAA,EAAM,YAAA;EACmB,SAAA,EAAW,SAAA;EACpC,KAAA;EACe,QAAA;EAChC,WAAA;EAHqD;EAMxB,WAAA;EAJG;;;;;;;EAaG,gBAAA,EAAkB,gBAAA;EASpB;EANU,WAAA;EASV;EANa,cAAA;EAU5C;EAPkB,SAAA,IAAa,KAAA;EAYnC;EATsB,SAAA,IAAa,KAAA;EAAA,UAE1B,QAAA;EAAA,cAEL,UAAA,CAAA,GAAc,WAAA;EAWlB;EAAA,UANA,UAAA;EAAA,UAGA,SAAA;EAAA,UACA,sBAAA;EAAA,UACA,eAAA;EAAA,UACA,sBAAA;EAAA,UAEA,oBAAA,CAAA;EAAA,QAOF,aAAA;EAAA,QAWA,aAAA;EAAA,UAOE,0BAAA,CAAA;EAAA,UAUA,qBAAA,CAAA;EAgCkB;EAAA,UAtBlB,kBAAA,CAAA;EAAA,UAWA,YAAA;EAAA,UAMA,WAAA;EAAA,UAKA,cAAA,GAAkB,CAAA,EAAG,aAAA;EAAA,UAgBrB,kBAAA,GAAsB,CAAA,EAAG,UAAA;EAAA,UAQzB,YAAA;EAAA,UAeA,UAAA,CAAA;EAAA,UAMA,UAAA,CAAA;EAAA,UAsBA,WAAA,CAAA;EAAA,UAMA,eAAA,CAAA;EAAA,UAcA,qBAAA,CAAA;EAAA,UAoBA,eAAA,CAAgB,IAAA;EAAA,QASlB,iBAAA;EAAA,OAWQ,MAAA,EAAQ,SAAA;AAAA;AAAA,QA8FlB,MAAA;EAAA,UACI,qBAAA;IACR,qBAAA,EAAuB,aAAa;EAAA;AAAA"}
|
package/dist/editable-label.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as __decorate } from "./decorate-
|
|
1
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-O4m1U4l3.js";
|
|
2
2
|
import { LitElement, css } from "lit";
|
|
3
|
-
import {
|
|
3
|
+
import { property, state } from "lit/decorators.js";
|
|
4
4
|
//#region src/editable-label/editable-label.ts
|
|
5
5
|
let EditableLabel = class EditableLabel extends LitElement {
|
|
6
6
|
constructor(..._args) {
|
|
@@ -272,7 +272,7 @@ __decorate([property({
|
|
|
272
272
|
__decorate([property({ attribute: false })], EditableLabel.prototype, "validator", void 0);
|
|
273
273
|
__decorate([property({ attribute: false })], EditableLabel.prototype, "formatter", void 0);
|
|
274
274
|
__decorate([state()], EditableLabel.prototype, "_editing", void 0);
|
|
275
|
-
EditableLabel = __decorate([
|
|
275
|
+
EditableLabel = __decorate([safeCustomElement(`ixfx-editable-label`)], EditableLabel);
|
|
276
276
|
//#endregion
|
|
277
277
|
export { EditableLabel };
|
|
278
278
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editable-label.js","names":[],"sources":["../src/editable-label/editable-label.ts"],"sourcesContent":["/**\n * <ixfx-editable-label> — inline editable text label.\n *\n * Two display modes:\n * label (default) — renders as plain text until clicked, then becomes an editable box.\n * editor — always renders as an editable box; becomes active on focus/click.\n *\n * Entry modes (filter characters as typed):\n * free (default) — no restrictions\n * text — alphabetical characters and spaces only\n * number — digits, decimal point, minus sign\n * percent — digits, decimal point, percent sign\n *\n * Properties (not attributes):\n * validator (value: string) => boolean — override commit validation; default uses entry-mode rules\n * formatter (value: string) => string — transform committed value for display\n *\n * Events:\n * input — CustomEvent<{ value: string }>, bubbles + composed; fired as value changes during editing\n * change — CustomEvent<{ value: string }>, bubbles + composed; fired when value is committed\n *\n * CSS variables:\n * --label-font-size defaults to var(--text-m, 12px)\n * --label-font-family defaults to var(--font-family, system-ui, sans-serif)\n * --label-color defaults to var(--surface-2-text)\n * --label-muted-color placeholder colour, defaults to var(--surface-muted-text)\n * --label-padding defaults to var(--space-xs, 3px) var(--space-s, 4px)\n * --label-radius defaults to var(--radius-s, 3px)\n * --label-align text alignment: left | center (default) | right\n */\nimport type { CSSResult } from 'lit';\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\n\nexport type EditableMode = `label` | `editor`;\nexport type EntryMode = `free` | `text` | `number` | `percent`;\nexport type DisplayTextLogic = `hidden` | `show` | `override` | `transient`;\n\nexport type EditableLabelChangeDetail = {\n readonly value: string;\n};\nexport type EditableLabelChangeEvent = CustomEvent<EditableLabelChangeDetail>;\n\n@customElement(`ixfx-editable-label`)\nexport class EditableLabel extends LitElement {\n @property({ reflect: true }) mode: EditableMode = `label`;\n @property({ attribute: `entry-mode`, reflect: true }) entryMode: EntryMode = `free`;\n @property({ reflect: true }) value = ``;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property() placeholder = ``;\n\n /** Override displayed text. Bypasses formatter and value. When editing, shows raw value. */\n @property({ attribute: `display-text` }) displayText?: string;\n\n /**\n * Controls when displayText is shown:\n * - 'hidden' (default): never use displayText\n * - 'show': show displayText instead of formatted value, but hide while editing; revert after disappearDelay\n * - 'override': always show displayText, even when editing\n * - 'transient': show displayText by default, switch to formatted value after appearDelay on hover/interaction; revert after disappearDelay\n */\n @property({ attribute: `display-text-logic` }) displayTextLogic: DisplayTextLogic = `hidden`;\n\n /** Delay before showing value in transient mode (ms). Default: 50 */\n @property({ type: Number, attribute: `appear-delay` }) appearDelay = 50;\n\n /** Delay before reverting to displayText after editing ends (ms). Default: 1000 */\n @property({ type: Number, attribute: `disappear-delay` }) disappearDelay = 1000;\n\n /** Override commit validation. Return true to accept, false to reject (reverts). */\n @property({ attribute: false }) validator?: (value: string) => boolean;\n\n /** Transform the committed value for display. Does not affect the stored value. */\n @property({ attribute: false }) formatter?: (value: string) => string;\n\n @state() protected _editing = false;\n\n protected get _contentEl(): HTMLElement | undefined {\n return this.renderRoot?.querySelector<HTMLElement>(`.content`) ?? undefined;\n }\n\n /** Snapshot of value taken when editing begins; restored on cancel. */\n protected _prevValue = ``;\n\n // ── Transient display state ─────────────────────────────────────────────────\n protected _hovering = false;\n protected _transientShowingValue = false;\n protected _transientTimer: number | undefined = undefined;\n protected _showModeWaitingToHide = false;\n\n protected _clearTransientTimer(): void {\n if (this._transientTimer !== undefined) {\n clearTimeout(this._transientTimer);\n this._transientTimer = undefined;\n }\n }\n\n private _onMouseEnter = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = true;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n private _onMouseLeave = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = false;\n this._startTransientRevertTimer();\n };\n\n protected _startTransientRevertTimer(): void {\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering && this.displayTextLogic === `transient`) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n }\n\n protected _requestDisplayUpdate(): void {\n if (!this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this._getDisplayText();\n }\n }\n }\n\n /** Called by subclasses when user interacts (drag, keyboard, etc) to temporarily show value in transient mode */\n protected _onUserInteraction(): void {\n if (this.displayTextLogic !== `transient`)\n return;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._startTransientRevertTimer();\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n protected _handleFocus = (): void => {\n if (this.mode === `editor` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleBlur = (): void => {\n if (this._editing)\n this._tryCommit();\n };\n\n protected _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._editing)\n return;\n if (e.key === `Enter`) {\n e.preventDefault();\n this._tryCommit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n } else if (e.key === `Escape`) {\n e.preventDefault();\n this._cancelEdit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n }\n };\n\n protected _handleBeforeInput = (e: InputEvent): void => {\n if (e.inputType !== `insertText` || !e.data)\n return;\n if (!this._isAllowedInput(e.data)) {\n e.preventDefault();\n }\n };\n\n protected _handleInput = (): void => {\n if (!this._editing)\n return;\n\n const raw = this._contentEl?.textContent?.trim() ?? ``;\n\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`input`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n };\n\n // ── Core logic ───────────────────────────────────────────────────────────\n\n protected _beginEdit(): void {\n this._prevValue = this.value;\n this._editing = true;\n this.removeAttribute(`invalid`);\n }\n\n protected _tryCommit(): void {\n let raw = this._contentEl?.textContent?.trim() ?? ``;\n if (this.entryMode === `percent`)\n raw = raw.replaceAll(`%`, ``).trim();\n const validate = this.validator ?? this._defaultValidator.bind(this);\n if (validate(raw)) {\n this.removeAttribute(`invalid`);\n const prev = this.value;\n this.value = raw;\n this._editing = false;\n if (raw !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n }\n } else {\n this._cancelEdit();\n }\n }\n\n protected _cancelEdit(): void {\n this.value = this._prevValue;\n this._editing = false;\n this.removeAttribute(`invalid`);\n }\n\n protected _getDisplayText(): string {\n const useDisplayText = this._shouldUseDisplayText();\n if (useDisplayText && this.displayText !== undefined && this.displayText !== ``) {\n return this.displayText;\n }\n if (!this.value)\n return ``;\n if (this.formatter)\n return this.formatter(this.value);\n if (this.entryMode === `percent`)\n return `${this.value}%`;\n return this.value;\n }\n\n protected _shouldUseDisplayText(): boolean {\n if (this.displayTextLogic === `hidden`)\n return false;\n if (this.displayTextLogic === `override`)\n return true;\n if (this.displayTextLogic === `show`) {\n if (this._editing)\n return false;\n return this._showModeWaitingToHide;\n }\n if (this.displayTextLogic === `transient`) {\n if (this._editing)\n return false;\n if (this._transientShowingValue)\n return false;\n return true;\n }\n return false;\n }\n\n protected _isAllowedInput(char: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]$/i.test(char);\n case `number`: return /^[\\d.\\-]$/.test(char);\n case `percent`: return /^[\\d.%]$/.test(char);\n default: return true;\n }\n }\n\n private _defaultValidator(value: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]*$/i.test(value);\n case `number`: return value === `` || /^-?\\d*(?:\\.\\d*)?$/.test(value);\n case `percent`: return value === `` || /^\\d*(?:\\.\\d*)?$/.test(value);\n default: return true;\n } // asdf\n }\n\n // ── Styles ───────────────────────────────────────────────────────────────\n\n static override styles: CSSResult[] = [css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n --_font-size: var(--label-font-size, var(--text-m, 12px));\n --_font-family: var(--label-font-family, var(--font-family, system-ui, sans-serif));\n --_color: var(--label-color, var(--surface-2-text));\n --_muted: var(--label-muted-color, var(--surface-muted-text, oklch(55% 0.02 240)));\n --_padding: var(--label-padding, var(--space-xs, 3px) var(--space-s, 4px));\n --_radius: var(--label-radius, var(--radius-s, 3px));\n --_align: var(--label-align, center);\n --_min-width: var(--label-min-width, 1ch);\n }\n\n .content {\n box-sizing: border-box;\n width: 100%;\n text-align: var(--_align);\n outline: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: var(--_min-width);\n font-family: var(--_font-family);\n font-size: var(--_font-size);\n color: var(--_color);\n padding: var(--_padding);\n border: 1px solid transparent;\n border-radius: var(--_radius);\n cursor: pointer;\n transition:\n background var(--transition, 0.15s ease-out),\n border-color var(--transition, 0.15s ease-out);\n }\n\n /* Remove overflow clipping while editing so the cursor is never hidden */\n .content[contenteditable=\"plaintext-only\"] {\n overflow: visible;\n text-overflow: clip;\n }\n\n /* ── Label mode ── */\n :host([mode=\"label\"]) .content {\n background: transparent;\n }\n\n :host([mode=\"label\"]) .content[contenteditable=\"plaintext-only\"] {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n cursor: text;\n }\n\n /* ── Editor mode — always shows box ── */\n :host([mode=\"editor\"]) .content {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n }\n\n :host([mode=\"editor\"]) .content[contenteditable=\"plaintext-only\"] {\n border-color: var(--accent, oklch(60% 0.15 140));\n cursor: text;\n }\n\n /* ── Placeholder ── */\n .content:empty::before {\n content: attr(data-placeholder);\n color: var(--_muted);\n pointer-events: none;\n }\n\n /* ── Invalid ── */\n :host([invalid]) .content {\n border-color: var(--error, oklch(60% 0.15 20));\n }\n\n /* ── Disabled ── */\n :host([disabled]) .content {\n opacity: var(--disabled-opacity, 0.5);\n cursor: not-allowed;\n pointer-events: none;\n }\n `];\n}\n\nfunction _selectAll(el: HTMLElement): void {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-editable-label': EditableLabel;\n }\n}\n"],"mappings":"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"}
|
|
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 } from 'lit';\nimport { css, html, LitElement } from 'lit';\nimport { property, query, state } from 'lit/decorators.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 // ── Transient display state ─────────────────────────────────────────────────\n protected _hovering = false;\n protected _transientShowingValue = false;\n protected _transientTimer: number | undefined = undefined;\n protected _showModeWaitingToHide = false;\n\n protected _clearTransientTimer(): void {\n if (this._transientTimer !== undefined) {\n clearTimeout(this._transientTimer);\n this._transientTimer = undefined;\n }\n }\n\n private _onMouseEnter = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = true;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n private _onMouseLeave = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = false;\n this._startTransientRevertTimer();\n };\n\n protected _startTransientRevertTimer(): void {\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering && this.displayTextLogic === `transient`) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n }\n\n protected _requestDisplayUpdate(): void {\n if (!this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this._getDisplayText();\n }\n }\n }\n\n /** Called by subclasses when user interacts (drag, keyboard, etc) to temporarily show value in transient mode */\n protected _onUserInteraction(): void {\n if (this.displayTextLogic !== `transient`)\n return;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._startTransientRevertTimer();\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n protected _handleFocus = (): void => {\n if (this.mode === `editor` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleBlur = (): void => {\n if (this._editing)\n this._tryCommit();\n };\n\n protected _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._editing)\n return;\n if (e.key === `Enter`) {\n e.preventDefault();\n this._tryCommit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n } else if (e.key === `Escape`) {\n e.preventDefault();\n this._cancelEdit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n }\n };\n\n protected _handleBeforeInput = (e: InputEvent): void => {\n if (e.inputType !== `insertText` || !e.data)\n return;\n if (!this._isAllowedInput(e.data)) {\n e.preventDefault();\n }\n };\n\n protected _handleInput = (): void => {\n if (!this._editing)\n return;\n\n const raw = this._contentEl?.textContent?.trim() ?? ``;\n\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`input`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n };\n\n // ── Core logic ───────────────────────────────────────────────────────────\n\n protected _beginEdit(): void {\n this._prevValue = this.value;\n this._editing = true;\n this.removeAttribute(`invalid`);\n }\n\n protected _tryCommit(): void {\n let raw = this._contentEl?.textContent?.trim() ?? ``;\n if (this.entryMode === `percent`)\n raw = raw.replaceAll(`%`, ``).trim();\n const validate = this.validator ?? this._defaultValidator.bind(this);\n if (validate(raw)) {\n this.removeAttribute(`invalid`);\n const prev = this.value;\n this.value = raw;\n this._editing = false;\n if (raw !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n }\n } else {\n this._cancelEdit();\n }\n }\n\n protected _cancelEdit(): void {\n this.value = this._prevValue;\n this._editing = false;\n this.removeAttribute(`invalid`);\n }\n\n protected _getDisplayText(): string {\n const useDisplayText = this._shouldUseDisplayText();\n if (useDisplayText && this.displayText !== undefined && this.displayText !== ``) {\n return this.displayText;\n }\n if (!this.value)\n return ``;\n if (this.formatter)\n return this.formatter(this.value);\n if (this.entryMode === `percent`)\n return `${this.value}%`;\n return this.value;\n }\n\n protected _shouldUseDisplayText(): boolean {\n if (this.displayTextLogic === `hidden`)\n return false;\n if (this.displayTextLogic === `override`)\n return true;\n if (this.displayTextLogic === `show`) {\n if (this._editing)\n return false;\n return this._showModeWaitingToHide;\n }\n if (this.displayTextLogic === `transient`) {\n if (this._editing)\n return false;\n if (this._transientShowingValue)\n return false;\n return true;\n }\n return false;\n }\n\n protected _isAllowedInput(char: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]$/i.test(char);\n case `number`: return /^[\\d.\\-]$/.test(char);\n case `percent`: return /^[\\d.%]$/.test(char);\n default: return true;\n }\n }\n\n private _defaultValidator(value: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]*$/i.test(value);\n case `number`: return value === `` || /^-?\\d*(?:\\.\\d*)?$/.test(value);\n case `percent`: return value === `` || /^\\d*(?:\\.\\d*)?$/.test(value);\n default: return true;\n } // asdf\n }\n\n // ── Styles ───────────────────────────────────────────────────────────────\n\n static override styles: CSSResult[] = [css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n --_font-size: var(--label-font-size, var(--text-m, 12px));\n --_font-family: var(--label-font-family, var(--font-family, system-ui, sans-serif));\n --_color: var(--label-color, var(--surface-2-text));\n --_muted: var(--label-muted-color, var(--surface-muted-text, oklch(55% 0.02 240)));\n --_padding: var(--label-padding, var(--space-xs, 3px) var(--space-s, 4px));\n --_radius: var(--label-radius, var(--radius-s, 3px));\n --_align: var(--label-align, center);\n --_min-width: var(--label-min-width, 1ch);\n }\n\n .content {\n box-sizing: border-box;\n width: 100%;\n text-align: var(--_align);\n outline: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: var(--_min-width);\n font-family: var(--_font-family);\n font-size: var(--_font-size);\n color: var(--_color);\n padding: var(--_padding);\n border: 1px solid transparent;\n border-radius: var(--_radius);\n cursor: pointer;\n transition:\n background var(--transition, 0.15s ease-out),\n border-color var(--transition, 0.15s ease-out);\n }\n\n /* Remove overflow clipping while editing so the cursor is never hidden */\n .content[contenteditable=\"plaintext-only\"] {\n overflow: visible;\n text-overflow: clip;\n }\n\n /* ── Label mode ── */\n :host([mode=\"label\"]) .content {\n background: transparent;\n }\n\n :host([mode=\"label\"]) .content[contenteditable=\"plaintext-only\"] {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n cursor: text;\n }\n\n /* ── Editor mode — always shows box ── */\n :host([mode=\"editor\"]) .content {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n }\n\n :host([mode=\"editor\"]) .content[contenteditable=\"plaintext-only\"] {\n border-color: var(--accent, oklch(60% 0.15 140));\n cursor: text;\n }\n\n /* ── Placeholder ── */\n .content:empty::before {\n content: attr(data-placeholder);\n color: var(--_muted);\n pointer-events: none;\n }\n\n /* ── Invalid ── */\n :host([invalid]) .content {\n border-color: var(--error, oklch(60% 0.15 20));\n }\n\n /* ── Disabled ── */\n :host([disabled]) .content {\n opacity: var(--disabled-opacity, 0.5);\n cursor: not-allowed;\n pointer-events: none;\n }\n `];\n}\n\nfunction _selectAll(el: HTMLElement): void {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-editable-label': EditableLabel;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as _$lit from "lit";
|
|
2
1
|
import { LitElement } from "lit";
|
|
3
2
|
|
|
4
3
|
//#region src/hex/types.d.ts
|
|
@@ -56,7 +55,7 @@ declare class IxfxHexEditorElement extends LitElement {
|
|
|
56
55
|
private _pointerMode;
|
|
57
56
|
private _currentDragDiff;
|
|
58
57
|
private _shiftClickTarget;
|
|
59
|
-
static styles:
|
|
58
|
+
static styles: import("lit").CSSResult;
|
|
60
59
|
setData(data: Uint8Array): void;
|
|
61
60
|
undo(): void;
|
|
62
61
|
redo(): void;
|
|
@@ -91,7 +90,7 @@ declare class IxfxHexEditorElement extends LitElement {
|
|
|
91
90
|
private _isRowShaded;
|
|
92
91
|
private _isHexShaded;
|
|
93
92
|
private _isTextShaded;
|
|
94
|
-
protected render():
|
|
93
|
+
protected render(): import("lit").TemplateResult<1>;
|
|
95
94
|
private _renderRow;
|
|
96
95
|
private _renderColumn;
|
|
97
96
|
private _renderHexCell;
|
|
@@ -128,4 +127,4 @@ declare global {
|
|
|
128
127
|
} //# sourceMappingURL=hex-editor.d.ts.map
|
|
129
128
|
//#endregion
|
|
130
129
|
export { NoneSelectEventDetail as a, SingleSelectEventDetail as c, IxfxHexEditorElement as i, HexChangeDetail as n, RectangularSelectEventDetail as o, HexChangeEvent as r, SelectEventDetail as s, ContiguousSelectEventDetail as t };
|
|
131
|
-
//# sourceMappingURL=hex-editor-
|
|
130
|
+
//# sourceMappingURL=hex-editor-2_s0Ua5t.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-editor-2_s0Ua5t.d.ts","names":[],"sources":["../src/hex/types.ts","../src/hex/hex-editor.ts"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as __decorate } from "./decorate-
|
|
1
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-O4m1U4l3.js";
|
|
2
2
|
import { t as colour_exports } from "./colour-C3MQIjFJ-BJV-QC-3.js";
|
|
3
3
|
import { LitElement, css, html } from "lit";
|
|
4
|
-
import {
|
|
4
|
+
import { property, state } from "lit/decorators.js";
|
|
5
5
|
import { styleMap } from "lit/directives/style-map.js";
|
|
6
6
|
import { repeat } from "lit/directives/repeat.js";
|
|
7
7
|
//#region src/hex/colour.ts
|
|
@@ -1140,8 +1140,8 @@ __decorate([state()], IxfxHexEditorElement.prototype, "_editState", void 0);
|
|
|
1140
1140
|
__decorate([state()], IxfxHexEditorElement.prototype, "_containerH", void 0);
|
|
1141
1141
|
__decorate([state()], IxfxHexEditorElement.prototype, "_shadeMap", void 0);
|
|
1142
1142
|
__decorate([state()], IxfxHexEditorElement.prototype, "_focusSide", void 0);
|
|
1143
|
-
IxfxHexEditorElement = __decorate([
|
|
1143
|
+
IxfxHexEditorElement = __decorate([safeCustomElement(`ixfx-hex-editor`)], IxfxHexEditorElement);
|
|
1144
1144
|
//#endregion
|
|
1145
1145
|
export { IxfxHexEditorElement as t };
|
|
1146
1146
|
|
|
1147
|
-
//# sourceMappingURL=hex-editor-
|
|
1147
|
+
//# sourceMappingURL=hex-editor-gH3mteMr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-editor-gH3mteMr.js","names":["Colour","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\nconst isControlByte = (byte: number): boolean => {\n return byte < 0x20 && byte !== 0x09 && byte !== 0x0a && byte !== 0x0b && byte !== 0x0c && byte !== 0x0d;\n};\n\nconst isPrintableAscii = (byte: number): boolean => {\n return byte >= 0x20 && byte <= 0x7e;\n};\n\nexport const getAsciiClass = (byte: number): string => {\n if (byte === 0) return 'byte-null';\n if (WHITESPACE_BYTES.has(byte)) return 'byte-whitespace';\n if (isControlByte(byte)) return 'byte-control';\n if (isPrintableAscii(byte)) return 'byte-printable';\n return 'byte-other';\n};\n\nexport const createShadeMap = (\n nullColour: string,\n maxColour: string,\n stepStart: string,\n stepEnd: string\n): ColourMap => {\n const steps = Colour.createSteps(stepStart, stepEnd, { steps: 16 });\n const cssSteps = steps.map(Colour.toCssColour);\n return {\n forByte: (byte) => {\n if (byte === 0x00) return nullColour;\n if (byte === 0xff) return maxColour;\n return cssSteps[byte >> 4];\n },\n };\n};\n","import type { BytePos, Diff } from './types.js';\n\ntype StoreImpl = {\n data: Uint8Array;\n changeset: Set<BytePos>;\n};\n\nexport type HexStore = StoreImpl;\n\nexport const createHexStore = (data: Uint8Array): HexStore => {\n return {\n data: new Uint8Array(data),\n changeset: new Set<BytePos>(),\n };\n};\n\nexport const readByte = (store: HexStore, pos: BytePos): number => {\n return store.data[pos] ?? 0;\n};\n\nexport const readBytes = (store: HexStore, positions: readonly BytePos[]): readonly number[] => {\n return positions.map((p) => store.data[p] ?? 0);\n};\n\nexport const length = (store: HexStore): number => {\n return store.data.length;\n};\n\nconst clamp = (value: number): number => {\n return Math.max(0, Math.min(255, value));\n};\n\nexport const writeByte = (store: HexStore, pos: BytePos, value: number): Diff => {\n const clampedValue = clamp(value);\n const before = store.data[pos];\n const diff: Diff = new Map([[pos, { before, after: clampedValue }]]);\n store.data[pos] = clampedValue;\n store.changeset.add(pos);\n return diff;\n};\n\nexport const writeBytes = (store: HexStore, entries: ReadonlyMap<BytePos, number>): Diff => {\n const diff = new Map<BytePos, { before: number; after: number }>();\n entries.forEach((value, pos) => {\n const clampedValue = clamp(value);\n const before = store.data[pos];\n diff.set(pos, { before, after: clampedValue });\n store.data[pos] = clampedValue;\n store.changeset.add(pos);\n });\n return diff as Diff;\n};\n\nexport const applyDiff = (store: HexStore, diff: Diff): Diff => {\n const reverse = new Map<BytePos, { before: number; after: number }>();\n diff.forEach((entry, pos) => {\n const before = store.data[pos];\n reverse.set(pos, { before: entry.after, after: before });\n store.data[pos] = entry.after;\n store.changeset.add(pos);\n });\n return reverse as Diff;\n};\n\nexport const reverseDiff = (diff: Diff): Diff => {\n const reversed = new Map<BytePos, { before: number; after: number }>();\n diff.forEach((entry, pos) => {\n reversed.set(pos, { before: entry.after, after: entry.before });\n });\n return reversed as Diff;\n};\n\nexport const getChangeset = (store: HexStore): ReadonlySet<BytePos> => {\n return store.changeset;\n};\n\nexport const clearChangeset = (store: HexStore): void => {\n store.changeset.clear();\n};\n","import type { Diff } from './types.js';\n\ntype StackImpl = {\n undos: Diff[];\n redos: Diff[];\n};\n\nexport type UndoRedoStack = StackImpl;\n\nexport const createUndoRedoStack = (): UndoRedoStack => {\n return {\n undos: [],\n redos: [],\n };\n};\n\nexport const push = (stack: UndoRedoStack, diff: Diff): void => {\n stack.undos.push(diff);\n stack.redos = [];\n};\n\nexport const undo = (stack: UndoRedoStack): Diff | undefined => {\n const diff = stack.undos.pop();\n if (diff) {\n stack.redos.push(diff);\n }\n return diff;\n};\n\nexport const redo = (stack: UndoRedoStack): Diff | undefined => {\n const diff = stack.redos.pop();\n if (diff) {\n stack.undos.push(diff);\n }\n return diff;\n};\n\nexport const canUndo = (stack: UndoRedoStack): boolean => {\n return stack.undos.length > 0;\n};\n\nexport const canRedo = (stack: UndoRedoStack): boolean => {\n return stack.redos.length > 0;\n};\n","import type { BytePos, Selection, SingleSelection, ContiguousSelection, RectangularSelection } from './types.js';\n\nexport const bytesPerRow = (columns: number): number => columns * 4;\n\nconst min = (a: number, b: number): number => (a < b ? a : b);\nconst max = (a: number, b: number): number => (a > b ? a : b);\n\nexport const clampPos = (pos: BytePos, dataLength: number): BytePos => {\n return Math.max(0, Math.min(pos, dataLength - 1));\n};\n\nexport const getSelectedPositions = (\n sel: Selection,\n columns: number\n): readonly BytePos[] => {\n if (!sel) return [];\n\n const bpr = bytesPerRow(columns);\n\n if (sel.kind === 'single') {\n return [sel.pos];\n }\n\n if (sel.kind === 'contiguous') {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n const positions: BytePos[] = [];\n for (let i = start; i <= end; i++) {\n positions.push(i);\n }\n return positions;\n }\n\n if (sel.kind === 'rectangular') {\n const positions: BytePos[] = [];\n for (let row = 0; row < sel.height; row++) {\n for (let col = 0; col < sel.width; col++) {\n const y = sel.y + row;\n const x = sel.x + col;\n const pos = y * bpr + x;\n positions.push(pos);\n }\n }\n return positions;\n }\n\n return [];\n};\n\nexport const selectionContains = (\n sel: Selection,\n pos: BytePos,\n columns: number\n): boolean => {\n if (!sel) return false;\n\n const bpr = bytesPerRow(columns);\n\n if (sel.kind === 'single') {\n return pos === sel.pos;\n }\n\n if (sel.kind === 'contiguous') {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n return pos >= start && pos <= end;\n }\n\n if (sel.kind === 'rectangular') {\n const row = Math.floor(pos / bpr);\n const col = pos % bpr;\n const x = sel.x;\n const y = sel.y;\n const width = sel.width;\n const height = sel.height;\n return row >= y && row < y + height && col >= x && col < x + width;\n }\n\n return false;\n};\n\nexport const getCursorPos = (\n sel: Selection,\n dir: 'up' | 'down' | 'left' | 'right',\n columns: number,\n dataLength: number\n): BytePos => {\n let currentPos: BytePos;\n\n if (!sel) {\n currentPos = 0;\n } else if (sel.kind === 'single') {\n currentPos = sel.pos;\n } else if (sel.kind === 'contiguous') {\n currentPos = max(sel.start, sel.end);\n } else if (sel.kind === 'rectangular') {\n currentPos = sel.y * bytesPerRow(columns) + sel.x + sel.width - 1;\n } else {\n currentPos = 0;\n }\n\n const bpr = bytesPerRow(columns);\n let newPos: BytePos;\n\n switch (dir) {\n case 'left':\n newPos = currentPos - 1;\n break;\n case 'right':\n newPos = currentPos + 1;\n break;\n case 'up':\n newPos = currentPos - bpr;\n break;\n case 'down':\n newPos = currentPos + bpr;\n break;\n default:\n newPos = currentPos;\n }\n\n return clampPos(newPos, dataLength);\n};\n\nexport const moveSelection = (\n sel: Selection,\n dir: 'up' | 'down' | 'left' | 'right',\n columns: number,\n dataLength: number\n): SingleSelection => {\n const newPos = getCursorPos(sel, dir, columns, dataLength);\n return { kind: 'single', pos: newPos };\n};\n\nexport const extendContiguous = (\n sel: Selection,\n _dir: 'up' | 'down' | 'left' | 'right',\n columns: number,\n _dataLength: number,\n anchor: BytePos | null = null\n): ContiguousSelection => {\n let currentPos: BytePos;\n\n if (!sel || sel.kind === 'single') {\n currentPos = sel?.kind === 'single' ? sel.pos : 0;\n } else if (sel.kind === 'contiguous') {\n currentPos = max(sel.start, sel.end);\n } else if (sel.kind === 'rectangular') {\n currentPos = sel.y * bytesPerRow(columns) + sel.x;\n } else {\n currentPos = 0;\n }\n\n const newPos = anchor ?? currentPos;\n const start = Math.min(currentPos, newPos);\n const end = Math.max(currentPos, newPos);\n\n return {\n kind: 'contiguous',\n start,\n end,\n };\n};\n\nexport const extendRectangular = (\n sel: Selection,\n dir: 'up' | 'down' | 'left' | 'right',\n columns: number,\n _dataLength: number,\n anchorX: number = 0,\n anchorY: number = 0\n): RectangularSelection => {\n const bpr = bytesPerRow(columns);\n\n let x: number;\n let y: number;\n let width: number;\n let height: number;\n\n if (!sel || sel.kind === 'single') {\n const pos = sel?.kind === 'single' ? sel.pos : 0;\n x = pos % bpr;\n y = Math.floor(pos / bpr);\n width = 1;\n height = 1;\n } else if (sel.kind === 'contiguous') {\n const start = min(sel.start, sel.end);\n const end = max(sel.start, sel.end);\n x = start % bpr;\n y = Math.floor(start / bpr);\n width = end - start + 1;\n height = 1;\n } else if (sel.kind === 'rectangular') {\n x = sel.x;\n y = sel.y;\n width = sel.width;\n height = sel.height;\n } else {\n x = 0;\n y = 0;\n width = 1;\n height = 1;\n }\n\n const effectiveAnchorX = anchorX > 0 || (sel?.kind === 'rectangular') ? anchorX : x;\n const effectiveAnchorY = anchorY > 0 || (sel?.kind === 'rectangular') ? anchorY : y;\n\n switch (dir) {\n case 'left':\n if (x > effectiveAnchorX) {\n width -= 1;\n } else if (x === effectiveAnchorX && width > 1) {\n x -= 1;\n width += 1;\n } else if (x > 0) {\n x -= 1;\n width += 1;\n }\n break;\n case 'right':\n if (x + width < bpr) {\n width += 1;\n }\n break;\n case 'up':\n if (y > effectiveAnchorY) {\n height -= 1;\n } else if (y === effectiveAnchorY && height > 1) {\n y -= 1;\n height += 1;\n } else if (y > 0) {\n y -= 1;\n height += 1;\n }\n break;\n case 'down':\n height += 1;\n break;\n }\n\n return { kind: 'rectangular', x, y, width, height };\n};\n\nexport const selectionFromPointerRange = (\n start: BytePos,\n end: BytePos,\n mode: 'contiguous' | 'rectangular',\n columns: number\n): Selection => {\n const bpr = bytesPerRow(columns);\n\n if (mode === 'contiguous') {\n const s = min(start, end);\n const e = max(start, end);\n return {\n kind: 'contiguous',\n start: s,\n end: e,\n };\n }\n\n const startX = start % bpr;\n const startY = Math.floor(start / bpr);\n const endX = end % bpr;\n const endY = Math.floor(end / bpr);\n\n const x = min(startX, endX);\n const y = min(startY, endY);\n const width = Math.abs(endX - startX) + 1;\n const height = Math.abs(endY - startY) + 1;\n\n return { kind: 'rectangular', x, y, width, height };\n};\n","import type { ColourMap } from './colour.js';\nimport type { BytePos, ColourScheme, Diff, EditState, Selection } from './types.js';\nimport { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nimport { repeat } from 'lit/directives/repeat.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { createShadeMap, getAsciiClass } from './colour.js';\n\nimport { applyDiff, clearChangeset, createHexStore, getChangeset, readByte, reverseDiff, length as storeLength, writeByte, writeBytes } from './data.js';\nimport { createUndoRedoStack, push as pushDiff, redo as redoDiff, undo as undoDiff } from './diff.js';\nimport { bytesPerRow, clampPos, extendContiguous, extendRectangular, getCursorPos, getSelectedPositions, moveSelection, selectionContains, selectionFromPointerRange } from './selection.js';\nimport { isContiguousSelection, isRectangularSelection } from './types.js';\n\ntype PointerMode = `pending` | `drag-value` | `select-cont` | `select-rect` | null;\n\ntype DragStart = {\n pos: BytePos;\n startValue: number;\n startY: number;\n startX: number;\n};\n\n@customElement(`ixfx-hex-editor`)\nexport class IxfxHexEditorElement extends LitElement {\n @property({ type: Number })\n columns = 4;\n\n @property({ type: String })\n colourScheme: ColourScheme = `ascii`;\n\n @property({ type: Boolean })\n showChangeset = true;\n\n @property({ type: Boolean, attribute: `hide-offset-col` })\n hideOffsetCol = false;\n\n @property({ type: Boolean, attribute: `hide-hex-col` })\n hideHexCol = false;\n\n @property({ type: Boolean, attribute: `hide-text-col` })\n hideTextCol = false;\n\n @state()\n private _selection: Selection = null;\n\n @state()\n private _scrollTop = 0;\n\n @state()\n private _editState: EditState | null = null;\n\n @state()\n private _containerH = 0;\n\n @state()\n private _shadeMap: ColourMap | null = null;\n\n @state()\n private _focusSide: `hex` | `text` | null = null;\n\n private _store = createHexStore(new Uint8Array(0));\n private _undoStack = createUndoRedoStack();\n private _copyBuffer: Uint8Array | null = null;\n private _rowHeight = 24;\n private _dragStart: DragStart | null = null;\n private _dragAnchor: BytePos | null = null;\n private _rectAnchorX = 0;\n private _rectAnchorY = 0;\n private _rectAnchorXFromKeyboard = 0;\n private _rectAnchorYFromKeyboard = 0;\n private _initialSelectionPoint: BytePos = 0;\n private _currentCursorPoint: BytePos = 0;\n private _pointerMode: PointerMode = null;\n private _currentDragDiff: Diff | null = null;\n private _shiftClickTarget: BytePos | null = null;\n\n static styles = css`\n :host {\n --hex-row-height: 24px;\n --hex-offset-width: 8ch;\n --hex-font: monospace;\n --hex-font-size: 0.85rem;\n --hex-changed-weight: bold;\n\n --ascii-null: #808080;\n --ascii-printable: #4caf50;\n --ascii-whitespace: #ffffff;\n --ascii-control: #f48fb1;\n --ascii-other: #ffeb3b;\n\n --shade-null: #808080;\n --shade-max: #ffffff;\n --shade-step-start: #ff0000;\n --shade-step-end: #0000ff;\n\n display: block;\n font-family: var(--hex-font);\n font-size: var(--hex-font-size);\n }\n\n .hex-editor {\n display: flex;\n flex-direction: column;\n height: 300px;\n overflow: hidden;\n background: #1e1e1e;\n color: #e0e0e0;\n border: 1px solid #333;\n border-radius: 4px;\n }\n\n .scroll-container {\n flex: 1;\n overflow-y: auto;\n position: relative;\n }\n\n .header {\n display: flex;\n background: #2d2d2d;\n font-weight: bold;\n border-bottom: 1px solid #444;\n height: var(--hex-row-height);\n flex-shrink: 0;\n align-items: center;\n }\n\n .row {\n display: flex;\n height: var(--hex-row-height);\n align-items: center;\n }\n\n .row:hover {\n background: rgba(255, 255, 255, 0.05);\n }\n\n .offset-cell {\n width: var(--hex-offset-width);\n padding: 0 8px;\n text-align: right;\n color: #888;\n flex-shrink: 0;\n box-sizing: border-box;\n }\n\n .col-group {\n display: inline-flex;\n gap: 4px;\n margin-right: 16px;\n }\n\n .col-header {\n width: calc(8ch + 28px);\n padding: 0 8px;\n color: #555;\n text-align: right;\n flex-shrink: 0;\n box-sizing: border-box;\n }\n\n .col-header.active {\n color: #aaa;\n }\n\n .text-header {\n padding: 4px 8px;\n color: #555;\n width: calc(var(--columns, 4) * 4 * 1ch);\n box-sizing: border-box;\n flex-shrink: 0;\n }\n\n .text-header.active {\n color: #aaa;\n }\n\n .hex-cell, .text-char {\n display: inline-block;\n width: 2ch;\n text-align: center;\n cursor: pointer;\n user-select: none;\n padding: 2px 0;\n }\n\n .hex-cell.selected, .text-char.selected {\n background: rgba(100, 149, 237, 0.4);\n }\n\n .hex-cell.changed, .text-char.changed {\n font-weight: var(--hex-changed-weight);\n }\n\n .hex-cell.editing {\n background: rgba(255, 215, 0, 0.3);\n }\n\n\n .text-area {\n display: inline-flex;\n gap: 0;\n }\n\n .text-char {\n width: 1ch;\n text-align: left;\n }\n\n .byte-null { color: var(--ascii-null); }\n .byte-printable { color: var(--ascii-printable); }\n .byte-whitespace { color: var(--ascii-whitespace); }\n .byte-control { color: var(--ascii-control); }\n .byte-other { color: var(--ascii-other); }\n `;\n\n setData(data: Uint8Array): void {\n this._store = createHexStore(data);\n this._undoStack = createUndoRedoStack();\n this._selection = null;\n this._editState = null;\n this._scrollTop = 0;\n this.requestUpdate();\n }\n\n undo(): void {\n const diff = undoDiff(this._undoStack);\n if (!diff)\n return;\n const reverse = reverseDiff(diff);\n applyDiff(this._store, reverse);\n this.requestUpdate();\n }\n\n redo(): void {\n const diff = redoDiff(this._undoStack);\n if (!diff)\n return;\n applyDiff(this._store, diff);\n this.requestUpdate();\n }\n\n recomputeColours(): void {\n const style = getComputedStyle(this);\n const nullC = style.getPropertyValue(`--shade-null`).trim() || `#808080`;\n const maxC = style.getPropertyValue(`--shade-max`).trim() || `#ffffff`;\n const stepStart = style.getPropertyValue(`--shade-step-start`).trim() || `#ff0000`;\n const stepEnd = style.getPropertyValue(`--shade-step-end`).trim() || `#0000ff`;\n this._shadeMap = createShadeMap(nullC, maxC, stepStart, stepEnd);\n this.requestUpdate();\n }\n\n * selectedBytes(): Generator<{ selection_index: number; array_index: number; value: number }> {\n const positions = getSelectedPositions(this._selection, this.columns);\n for (let i = 0; i < positions.length; i++) {\n const pos = positions[i];\n yield {\n selection_index: i,\n array_index: pos,\n value: readByte(this._store, pos),\n };\n }\n }\n\n containsPosition(pos: number): boolean {\n return selectionContains(this._selection, pos as BytePos, this.columns);\n }\n\n selectSingle(position: number): void {\n this._selection = { kind: `single`, pos: position as BytePos };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n selectContiguous(start: number, end: number): void {\n this._selection = {\n kind: `contiguous`,\n start: start as BytePos,\n end: end as BytePos,\n };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n selectRectangular(x: number, y: number, width: number, height: number): void {\n this._selection = {\n kind: `rectangular`,\n x,\n y,\n width,\n height,\n };\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n clearSelection(): void {\n this._selection = null;\n this._dispatchSelectEvent();\n this.requestUpdate();\n }\n\n getSelection(): Selection {\n return this._selection;\n }\n\n protected override firstUpdated(): void {\n const container = this.shadowRoot?.querySelector(`.scroll-container`);\n if (container) {\n const ro = new ResizeObserver((entries) => {\n this._containerH = entries[0].contentRect.height;\n this.requestUpdate();\n });\n ro.observe(container);\n this._containerH = container.clientHeight;\n }\n this.recomputeColours();\n }\n\n private _onScroll = (e: Event): void => {\n const target = e.target as HTMLElement;\n this._scrollTop = target.scrollTop;\n this.requestUpdate();\n };\n\n private _onPointerDown(pos: BytePos, side: `hex` | `text`, e: PointerEvent): void {\n e.preventDefault();\n if (e.button !== 0)\n return;\n\n (this.shadowRoot?.querySelector(`.hex-editor`) as HTMLElement)?.focus();\n this._focusSide = side;\n\n const target = e.target as Element;\n target.setPointerCapture(e.pointerId);\n\n const bpr = bytesPerRow(this.columns);\n const startX = pos % bpr;\n const startY = Math.floor(pos / bpr);\n\n if (e.metaKey || e.ctrlKey) {\n this._pointerMode = `select-rect`;\n this._dragAnchor = pos;\n this._rectAnchorX = startX;\n this._rectAnchorY = startY;\n } else if (e.shiftKey) {\n this._pointerMode = `select-cont`;\n if (!this._selection || this._selection.kind !== `single`) {\n this._dragAnchor = pos;\n } else {\n this._dragAnchor = this._selection.pos;\n this._shiftClickTarget = pos;\n }\n } else {\n this._pointerMode = `pending`;\n this._dragStart = { pos, startValue: readByte(this._store, pos), startY: e.clientY, startX: e.clientX };\n this._dragAnchor = pos;\n this._currentDragDiff = null;\n }\n }\n\n private _onPointerMove(pos: BytePos, _side: `hex` | `text`, e: PointerEvent): void {\n if (!this._dragStart)\n return;\n\n const dy = Math.abs(e.clientY - this._dragStart.startY);\n const dx = Math.abs(e.clientX - this._dragStart.startX);\n\n if (this._pointerMode === `pending` && dy > 4 && dy > dx) {\n this._pointerMode = `drag-value`;\n this._editState = null;\n }\n\n if (this._pointerMode === `drag-value`) {\n const delta = Math.round((e.clientY - this._dragStart.startY) / 4);\n const newValue = Math.max(0, Math.min(255, this._dragStart.startValue - delta));\n this._currentDragDiff = writeByte(this._store, pos, newValue);\n this.requestUpdate();\n }\n\n if (this._pointerMode === `select-cont`) {\n if (this._dragAnchor !== null) {\n const mode = `contiguous`;\n this._selection = selectionFromPointerRange(this._dragAnchor, pos, mode, this.columns);\n this._dispatchSelectEvent();\n }\n }\n\n if (this._pointerMode === `select-rect`) {\n const bpr = bytesPerRow(this.columns);\n const currentX = pos % bpr;\n const currentY = Math.floor(pos / bpr);\n const x = Math.min(this._rectAnchorX, currentX);\n const y = Math.min(this._rectAnchorY, currentY);\n const width = Math.abs(currentX - this._rectAnchorX) + 1;\n const height = Math.abs(currentY - this._rectAnchorY) + 1;\n this._selection = { kind: `rectangular`, x, y, width, height };\n this._dispatchSelectEvent();\n }\n }\n\n private _onPointerUp(pos: BytePos, side: `hex` | `text`, e: PointerEvent): void {\n const target = e.target as Element;\n target.releasePointerCapture(e.pointerId);\n\n if (this._pointerMode === `pending`) {\n this._selection = { kind: `single`, pos };\n this._initialSelectionPoint = pos;\n this._currentCursorPoint = pos;\n this._editState = { pos, side, partial: `` };\n this._dispatchSelectEvent();\n }\n\n if (this._pointerMode === `select-cont`) {\n if (this._dragAnchor !== null && this._shiftClickTarget !== null) {\n this._selection = {\n kind: `contiguous`,\n start: this._dragAnchor,\n end: this._shiftClickTarget,\n };\n this._initialSelectionPoint = Math.min(this._dragAnchor, this._shiftClickTarget);\n this._currentCursorPoint = Math.max(this._dragAnchor, this._shiftClickTarget);\n this._dispatchSelectEvent();\n } else if (this._dragAnchor !== null) {\n const mode = `contiguous`;\n this._selection = selectionFromPointerRange(this._dragAnchor, pos, mode, this.columns);\n this._initialSelectionPoint = this._dragAnchor;\n this._currentCursorPoint = pos;\n this._dispatchSelectEvent();\n }\n }\n\n if (this._pointerMode === `select-rect`) {\n const bpr = bytesPerRow(this.columns);\n const currentX = pos % bpr;\n const currentY = Math.floor(pos / bpr);\n const x = Math.min(this._rectAnchorX, currentX);\n const y = Math.min(this._rectAnchorY, currentY);\n const width = Math.abs(currentX - this._rectAnchorX) + 1;\n const height = Math.abs(currentY - this._rectAnchorY) + 1;\n this._selection = { kind: `rectangular`, x, y, width, height };\n this._dispatchSelectEvent();\n }\n\n if (this._pointerMode === `drag-value` && this._currentDragDiff) {\n pushDiff(this._undoStack, this._currentDragDiff);\n this._dispatchChangeEvent(this._currentDragDiff);\n }\n\n this._pointerMode = null;\n this._dragStart = null;\n this._dragAnchor = null;\n this._currentDragDiff = null;\n this._shiftClickTarget = null;\n }\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n const isNavigationKey = [`ArrowLeft`, `ArrowRight`, `ArrowUp`, `ArrowDown`].includes(e.key);\n\n if (isNavigationKey) {\n e.preventDefault();\n e.stopPropagation();\n\n if (this._editState) {\n this._editState = null;\n }\n\n const dir = e.key.replace(`Arrow`, ``).toLowerCase() as `left` | `right` | `up` | `down`;\n const dataLen = storeLength(this._store);\n const bpr = bytesPerRow(this.columns);\n\n if (e.metaKey || e.ctrlKey) {\n if (!this._selection || this._selection.kind !== `rectangular`) {\n let startPos = 0;\n if (this._selection?.kind === `single`) {\n startPos = this._selection.pos;\n } else if (this._selection?.kind === `contiguous`) {\n startPos = Math.min(this._selection.start, this._selection.end);\n }\n this._rectAnchorXFromKeyboard = startPos % bpr;\n this._rectAnchorYFromKeyboard = Math.floor(startPos / bpr);\n this._selection = { kind: `rectangular`, x: this._rectAnchorXFromKeyboard, y: this._rectAnchorYFromKeyboard, width: 1, height: 1 };\n }\n this._selection = extendRectangular(this._selection, dir, this.columns, dataLen, this._rectAnchorXFromKeyboard, this._rectAnchorYFromKeyboard);\n } else if (e.shiftKey) {\n if (!this._selection) {\n this._initialSelectionPoint = 0;\n this._currentCursorPoint = 0;\n } else if (this._selection.kind === `single`) {\n this._initialSelectionPoint = this._selection.pos;\n this._currentCursorPoint = this._selection.pos;\n } else if (this._selection.kind === `rectangular`) {\n const cursorPos = this._selection.y * bpr + this._selection.x;\n this._initialSelectionPoint = cursorPos;\n this._currentCursorPoint = cursorPos;\n }\n const newPos = getCursorPos(this._selection, dir, this.columns, dataLen);\n const start = Math.min(this._initialSelectionPoint, newPos);\n const end = Math.max(this._initialSelectionPoint, newPos);\n this._currentCursorPoint = newPos;\n this._selection = { kind: `contiguous`, start, end };\n } else {\n this._selection = moveSelection(this._selection, dir, this.columns, dataLen);\n const pos = getCursorPos(this._selection, dir, this.columns, dataLen);\n this._initialSelectionPoint = pos;\n this._currentCursorPoint = pos;\n }\n this._dispatchSelectEvent();\n this.requestUpdate();\n return;\n }\n\n if (e.key === `Tab`) {\n e.preventDefault();\n e.stopPropagation();\n if (this._editState) {\n this._advanceCursor();\n } else {\n const dataLen = storeLength(this._store);\n this._selection = moveSelection(this._selection, `right`, this.columns, dataLen);\n this._dispatchSelectEvent();\n }\n this.requestUpdate();\n return;\n }\n\n if (e.key === `Escape`) {\n e.preventDefault();\n e.stopPropagation();\n if (this._editState) {\n this._editState = null;\n } else if (this._selection && this._selection.kind !== `single`) {\n const sel = this._selection;\n let firstPos = 0;\n if ((sel as { kind: string }).kind === `contiguous`) {\n const c = sel as { start: number; end: number };\n firstPos = Math.min(c.start, c.end);\n }\n if ((sel as { kind: string }).kind === `rectangular`) {\n const r = sel as { y: number; x: number };\n firstPos = r.y * bytesPerRow(this.columns) + r.x;\n }\n this._selection = { kind: `single`, pos: firstPos };\n this._dispatchSelectEvent();\n }\n this.requestUpdate();\n return;\n }\n\n if (this._editState) {\n e.stopPropagation();\n\n if (e.key === `Backspace`) {\n this._handleBackspace();\n return;\n }\n\n if (e.key === `Enter`) {\n if (this._editState.side === `hex` && this._editState.partial.startsWith(`.`)) {\n this._commitDecimalValue();\n }\n return;\n }\n\n if (e.key.length === 1) {\n this._handleValueEntry(e.key);\n }\n return;\n }\n\n if (this._selection && this._selection.kind === `single` && e.key.length === 1) {\n e.preventDefault();\n e.stopPropagation();\n const pos = this._selection.pos;\n const side: `hex` | `text` = this._focusSide ?? `hex`;\n this._editState = { pos, side, partial: `` };\n this._handleValueEntry(e.key);\n }\n };\n\n private _handleBackspace(): void {\n if (!this._editState)\n return;\n this._editState = { ...this._editState, partial: `` };\n this.requestUpdate();\n }\n\n private _handleValueEntry(key: string): void {\n if (!this._editState)\n return;\n\n const { pos, side, partial } = this._editState;\n\n if (side === `text`) {\n if (key.length === 1 && key.charCodeAt(0) >= 0x20 && key.charCodeAt(0) <= 0x7E) {\n const value = key.charCodeAt(0);\n const diff = writeByte(this._store, pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n return;\n }\n\n if (partial === `` && key === `.`) {\n this._editState = { ...this._editState, partial: `.` };\n this.requestUpdate();\n return;\n }\n\n if (partial.startsWith(`.`)) {\n if (/\\d/.test(key)) {\n let newPartial = partial + key;\n if (Number(newPartial.slice(1)) > 255) {\n newPartial = `.255`;\n }\n this._editState = { ...this._editState, partial: newPartial };\n this.requestUpdate();\n }\n return;\n }\n\n const hexChars = `0123456789ABCDEFabcdef`;\n if (hexChars.includes(key)) {\n const newPartial = (partial + key.toUpperCase()).slice(-2);\n this._editState = { ...this._editState, partial: newPartial };\n this.requestUpdate();\n\n if (newPartial.length === 2) {\n const value = Number.parseInt(newPartial, 16);\n const diff = writeByte(this._store, pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n } else if (partial !== ``) {\n this._editState = { ...this._editState, partial: `` };\n this.requestUpdate();\n }\n }\n\n private _commitDecimalValue(): void {\n if (!this._editState)\n return;\n const value = Number.parseInt(this._editState.partial.slice(1), 10);\n if (!isNaN(value)) {\n const diff = writeByte(this._store, this._editState.pos, value);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this._advanceCursor();\n }\n }\n\n private _advanceCursor(): void {\n if (!this._editState)\n return;\n const dataLen = storeLength(this._store);\n const newPos = clampPos(this._editState.pos + 1, dataLen);\n this._editState = { pos: newPos, side: this._editState.side, partial: `` };\n this._selection = { kind: `single`, pos: newPos };\n this.requestUpdate();\n }\n\n private _dispatchChangeEvent(diff: Diff): void {\n this.dispatchEvent(new CustomEvent(`hex-change`, {\n detail: { diff },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _dispatchSelectEvent(): void {\n const sel = this._selection;\n let detail: SelectEventDetail;\n\n if (!sel) {\n detail = { type: `none` };\n } else if (sel.kind === `single`) {\n detail = { type: `single`, position: sel.pos };\n } else if (sel.kind === `contiguous`) {\n detail = { type: `contiguous`, start: sel.start, end: sel.end };\n } else if (sel.kind === `rectangular`) {\n detail = { type: `rectangular`, x: sel.x, y: sel.y, width: sel.width, height: sel.height };\n } else {\n detail = { type: `none` };\n }\n\n this.dispatchEvent(new CustomEvent(`select`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _copy(): void {\n const positions = getSelectedPositions(this._selection, this.columns);\n if (positions.length === 0)\n return;\n\n const bytes = positions.map((p: BytePos) => readByte(this._store, p));\n this._copyBuffer = new Uint8Array(bytes);\n\n const hexStr = bytes.map((b: number) => b.toString(16).padStart(2, `0`)).join(` `);\n navigator.clipboard?.writeText(hexStr).catch(() => {});\n }\n\n private async _paste(): Promise<void> {\n let bytes: number[] | null = null;\n\n try {\n const text = await navigator.clipboard?.readText();\n if (text) {\n bytes = this._parseHexString(text);\n }\n } catch {\n // ignore\n }\n\n if (!bytes && this._copyBuffer) {\n bytes = Array.from(this._copyBuffer);\n }\n\n if (!bytes || bytes.length === 0)\n return;\n\n if (!this._selection)\n return;\n\n const entries = new Map<BytePos, number>();\n\n if (this._selection.kind === `single`) {\n const startPos = this._selection.pos;\n const dataLen = storeLength(this._store);\n for (let i = 0; i < bytes.length && startPos + i < dataLen; i++) {\n entries.set(startPos + i, bytes[i]);\n }\n } else if (this._selection.kind === `contiguous`) {\n const startPos = Math.min(this._selection.start, this._selection.end);\n const endPos = Math.max(this._selection.start, this._selection.end);\n const available = endPos - startPos + 1;\n for (let i = 0; i < Math.min(bytes.length, available); i++) {\n entries.set(startPos + i, bytes[i]);\n }\n } else if (this._selection.kind === `rectangular`) {\n const { x, y, width, height } = this._selection;\n const bpr = bytesPerRow(this.columns);\n let byteIdx = 0;\n for (let row = 0; row < height && byteIdx < bytes.length; row++) {\n for (let col = 0; col < width && byteIdx < bytes.length; col++) {\n const pos = (y + row) * bpr + x + col;\n entries.set(pos, bytes[byteIdx++]);\n }\n }\n }\n\n if (entries.size > 0) {\n const diff = writeBytes(this._store, entries);\n pushDiff(this._undoStack, diff);\n this._dispatchChangeEvent(diff);\n this.requestUpdate();\n }\n }\n\n private _parseHexString(text: string): number[] {\n const bytes: number[] = [];\n const cleaned = text.replace(/[^0-9A-F]/gi, ` `).trim();\n if (!cleaned)\n return bytes;\n\n const parts = cleaned.split(/\\s+/);\n for (const part of parts) {\n if (part.length === 1) {\n bytes.push(Number.parseInt(part + part, 16));\n } else if (part.length === 2) {\n bytes.push(Number.parseInt(part, 16));\n }\n }\n return bytes;\n }\n\n private _getColHeaders(): string[] {\n const headers: string[] = [];\n for (let i = 0; i < this.columns; i++) {\n const offset = i * 4;\n headers.push(`+${offset.toString(16).toUpperCase()}`);\n }\n return headers;\n }\n\n private _isRowShaded(pos: BytePos): boolean {\n const sel = this._selection;\n if (!sel || sel.kind !== `single`)\n return true;\n const bpr = bytesPerRow(this.columns);\n const row = Math.floor(pos / bpr);\n const selRow = Math.floor(sel.pos / bpr);\n return row === selRow;\n }\n\n private _isHexShaded(pos: BytePos): boolean {\n return this._isRowShaded(pos);\n }\n\n private _isTextShaded(pos: BytePos): boolean {\n return this._isRowShaded(pos);\n }\n\n protected render() {\n const dataLen = storeLength(this._store);\n const bpr = bytesPerRow(this.columns);\n const totalRows = Math.ceil(dataLen / bpr);\n const containerH = this._containerH > 0 ? this._containerH : 280;\n const startRow = Math.floor(this._scrollTop / this._rowHeight);\n const endRow = Math.min(startRow + Math.ceil(containerH / this._rowHeight) + 2, totalRows);\n const topSpacerHeight = startRow * this._rowHeight;\n const botSpacerHeight = (totalRows - endRow) * this._rowHeight;\n const changeset = getChangeset(this._store);\n\n const colHeaders = this._getColHeaders();\n const hexActive = this._focusSide === `hex` || this._focusSide === null;\n const textActive = this._focusSide === `text`;\n\n return html`\n <div class=\"hex-editor\" tabindex=\"0\" @keydown=${this._onKeyDown} @pointerleave=${() => {}}>\n <div class=\"header\">\n ${this.hideOffsetCol ? null : html`<span class=\"offset-cell\">Offset</span>`}\n ${this.hideHexCol ? null : repeat(colHeaders, h => html`<span class=\"col-header ${hexActive ? `active` : ``}\">${h}</span>`)}\n ${this.hideTextCol ? null : html`<span class=\"text-header ${textActive ? `active` : ``}\">Text</span>`}\n </div>\n <div class=\"scroll-container\" @scroll=${this._onScroll}>\n <div style=\"height: ${topSpacerHeight}px\"></div>\n ${repeat(\n Array.from({ length: endRow - startRow }, (_, i) => startRow + i),\n rowIndex => rowIndex,\n rowIndex => this._renderRow(rowIndex, changeset),\n )}\n <div style=\"height: ${botSpacerHeight}px\"></div>\n </div>\n </div>\n `;\n }\n\n private _renderRow(rowIndex: number, changeset: ReadonlySet<BytePos>) {\n const bpr = bytesPerRow(this.columns);\n const offset = rowIndex * bpr;\n\n return html`\n <div class=\"row\" data-row=${rowIndex}>\n ${this.hideOffsetCol ? null : html`<span class=\"offset-cell\">${offset.toString(16).toUpperCase().padStart(6, `0`)}</span>`}\n ${this.hideHexCol\n ? null\n : repeat(\n Array.from({ length: this.columns }, (_, i) => i),\n colIndex => colIndex,\n colIndex => this._renderColumn(rowIndex, colIndex, changeset),\n )}\n ${this.hideTextCol\n ? null\n : html`\n <span class=\"text-area\">\n ${repeat(\n Array.from({ length: bpr }, (_, i) => i),\n i => i,\n i => this._renderTextChar(offset + i, changeset),\n )}\n </span>\n `}\n </div>\n `;\n }\n\n private _renderColumn(rowIndex: number, colIndex: number, changeset: ReadonlySet<BytePos>) {\n const bpr = bytesPerRow(this.columns);\n const basePos = rowIndex * bpr + colIndex * 4;\n\n return html`\n <span class=\"col-group\">\n ${[0, 1, 2, 3].map(b => this._renderHexCell(basePos + b, changeset))}\n </span>\n `;\n }\n\n private _renderHexCell(pos: BytePos, changeset: ReadonlySet<BytePos>) {\n const dataLen = storeLength(this._store);\n if (pos >= dataLen) {\n return html`<span class=\"hex-cell\"></span>`;\n }\n\n const byte = readByte(this._store, pos);\n const hexStr = byte.toString(16).toUpperCase().padStart(2, `0`);\n\n const isSelected = selectionContains(this._selection, pos, this.columns);\n const isChanged = this.showChangeset && changeset.has(pos);\n const isEditing = this._editState?.pos === pos;\n\n const classes: string[] = [`hex-cell`];\n if (isSelected)\n classes.push(`selected`);\n if (isChanged)\n classes.push(`changed`);\n if (isEditing)\n classes.push(`editing`);\n if (this._isHexShaded(pos))\n classes.push(`shaded`);\n\n let displayText = hexStr;\n let colourStyle: Record<string, string> | undefined;\n\n if (isEditing && this._editState) {\n displayText = this._editState.partial === `` ? hexStr : `${this._editState.partial}_`;\n }\n\n if (this.colourScheme === `shade` && this._shadeMap) {\n colourStyle = { color: this._shadeMap.forByte(byte) };\n } else if (this.colourScheme === `ascii`) {\n classes.push(getAsciiClass(byte));\n }\n\n return html`\n <span\n class=${classes.join(` `)}\n style=${styleMap(colourStyle || {})}\n @pointerdown=${(e: PointerEvent) => this._onPointerDown(pos, `hex`, e)}\n @pointerup=${(e: PointerEvent) => this._onPointerUp(pos, `hex`, e)}\n @pointermove=${(e: PointerEvent) => this._onPointerMove(pos, `hex`, e)}\n >${displayText}</span>\n `;\n }\n\n private _renderTextChar(pos: BytePos, changeset: ReadonlySet<BytePos>) {\n const dataLen = storeLength(this._store);\n if (pos >= dataLen) {\n return html`<span class=\"text-char\"></span>`;\n }\n\n const byte = readByte(this._store, pos);\n const char = byte >= 0x20 && byte <= 0x7E ? String.fromCharCode(byte) : `.`;\n\n const isSelected = selectionContains(this._selection, pos, this.columns);\n const isChanged = this.showChangeset && changeset.has(pos);\n\n const classes: string[] = [`text-char`];\n if (isSelected)\n classes.push(`selected`);\n if (isChanged)\n classes.push(`changed`);\n if (this._isTextShaded(pos))\n classes.push(`shaded`);\n\n let colourStyle: Record<string, string> | undefined;\n\n if (this.colourScheme === `shade` && this._shadeMap) {\n colourStyle = { color: this._shadeMap.forByte(byte) };\n } else if (this.colourScheme === `ascii`) {\n classes.push(getAsciiClass(byte));\n }\n\n return html`\n <span\n class=${classes.join(` `)}\n style=${styleMap(colourStyle || {})}\n @pointerdown=${(e: PointerEvent) => this._onPointerDown(pos, `text`, e)}\n @pointerup=${(e: PointerEvent) => this._onPointerUp(pos, `text`, e)}\n @pointermove=${(e: PointerEvent) => this._onPointerMove(pos, `text`, e)}\n >${char}</span>\n `;\n }\n}\n\nexport type HexChangeDetail = {\n readonly diff: Diff;\n};\n\nexport type HexChangeEvent = CustomEvent<HexChangeDetail>;\n\nexport type SingleSelectEventDetail = { readonly type: `single`; readonly position: number };\nexport type ContiguousSelectEventDetail = { readonly type: `contiguous`; readonly start: number; readonly end: number };\nexport type RectangularSelectEventDetail = { readonly type: `rectangular`; readonly x: number; readonly y: number; readonly width: number; readonly height: number };\nexport type NoneSelectEventDetail = { readonly type: `none` };\nexport type SelectEventDetail = SingleSelectEventDetail | ContiguousSelectEventDetail | RectangularSelectEventDetail | NoneSelectEventDetail;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-hex-editor': IxfxHexEditorElement;\n }\n}\n"],"mappings":"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"}
|
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-2_s0Ua5t.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-gH3mteMr.js";
|
|
2
2
|
export { IxfxHexEditorElement };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"highlight-CAjwQ4GE.js","names":[],"sources":["../src/incr-search/highlight.ts"],"sourcesContent":["import type { HighlightOptions, HighlightTarget } from './types.js';\n\nconst DEFAULT_KEY = `incr-search-highlight`;\n\nexport function applyHighlights(\n targets: readonly HighlightTarget[],\n options: HighlightOptions = {},\n): void {\n if (typeof CSS === `undefined` || !CSS.highlights) return;\n\n const key = options.key ?? DEFAULT_KEY;\n CSS.highlights.delete(key);\n\n const ranges: Range[] = [];\n\n for (const { element, text, positions } of targets) {\n if (!positions.size) continue;\n\n const textNode = findTextNode(element, text);\n if (!textNode) continue;\n\n for (const pos of positions) {\n const range = new Range();\n range.setStart(textNode, pos);\n range.setEnd(textNode, pos + 1);\n ranges.push(range);\n }\n }\n\n if (ranges.length > 0) {\n CSS.highlights.set(key, new Highlight(...ranges));\n }\n}\n\nexport function clearHighlights(options: HighlightOptions = {}): void {\n if (typeof CSS === `undefined` || !CSS.highlights) return;\n CSS.highlights.delete(options.key ?? DEFAULT_KEY);\n}\n\nexport function buildHighlightTargets<T>(\n root: ShadowRoot | Element,\n itemSelector: string,\n positionsByItem: ReadonlyMap<T, ReadonlySet<number>>,\n getItem: (el: Element) => T | undefined,\n getText: (el: Element) => string,\n): HighlightTarget[] {\n const targets: HighlightTarget[] = [];\n const labelEls = root.querySelectorAll(itemSelector);\n\n for (const el of labelEls) {\n const item = getItem(el);\n if (item === undefined) continue;\n const positions = positionsByItem.get(item);\n if (!positions || positions.size === 0) continue;\n targets.push({ element: el, text: getText(el), positions });\n }\n\n return targets;\n}\n\nconst findTextNode = (element: Element, expectedText?: string): Text | null => {\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n if (expectedText === undefined || node.textContent === expectedText) {\n return node as Text;\n }\n }\n }\n return null;\n};\n"],"mappings":";AAEA,MAAM,cAAc;AAEpB,SAAgB,gBACd,SACA,UAA4B,
|
|
1
|
+
{"version":3,"file":"highlight-CAjwQ4GE.js","names":[],"sources":["../src/incr-search/highlight.ts"],"sourcesContent":["import type { HighlightOptions, HighlightTarget } from './types.js';\n\nconst DEFAULT_KEY = `incr-search-highlight`;\n\nexport function applyHighlights(\n targets: readonly HighlightTarget[],\n options: HighlightOptions = {},\n): void {\n if (typeof CSS === `undefined` || !CSS.highlights) return;\n\n const key = options.key ?? DEFAULT_KEY;\n CSS.highlights.delete(key);\n\n const ranges: Range[] = [];\n\n for (const { element, text, positions } of targets) {\n if (!positions.size) continue;\n\n const textNode = findTextNode(element, text);\n if (!textNode) continue;\n\n for (const pos of positions) {\n const range = new Range();\n range.setStart(textNode, pos);\n range.setEnd(textNode, pos + 1);\n ranges.push(range);\n }\n }\n\n if (ranges.length > 0) {\n CSS.highlights.set(key, new Highlight(...ranges));\n }\n}\n\nexport function clearHighlights(options: HighlightOptions = {}): void {\n if (typeof CSS === `undefined` || !CSS.highlights) return;\n CSS.highlights.delete(options.key ?? DEFAULT_KEY);\n}\n\nexport function buildHighlightTargets<T>(\n root: ShadowRoot | Element,\n itemSelector: string,\n positionsByItem: ReadonlyMap<T, ReadonlySet<number>>,\n getItem: (el: Element) => T | undefined,\n getText: (el: Element) => string,\n): HighlightTarget[] {\n const targets: HighlightTarget[] = [];\n const labelEls = root.querySelectorAll(itemSelector);\n\n for (const el of labelEls) {\n const item = getItem(el);\n if (item === undefined) continue;\n const positions = positionsByItem.get(item);\n if (!positions || positions.size === 0) continue;\n targets.push({ element: el, text: getText(el), positions });\n }\n\n return targets;\n}\n\nconst findTextNode = (element: Element, expectedText?: string): Text | null => {\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n if (expectedText === undefined || node.textContent === expectedText) {\n return node as Text;\n }\n }\n }\n return null;\n};\n"],"mappings":";AAEA,MAAM,cAAc;AAEpB,SAAgB,gBACd,SACA,UAA4B,CAAC,GACvB;CACN,IAAI,OAAO,QAAQ,eAAe,CAAC,IAAI,YAAY;CAEnD,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,MAAM;EAErB,MAAM,WAAW,aAAa,SAAS,IAAI;EAC3C,IAAI,CAAC,UAAU;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,YAAY;CACnD,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,GAAW;EACxB,MAAM,YAAY,gBAAgB,IAAI,IAAI;EAC1C,IAAI,CAAC,aAAa,UAAU,SAAS,GAAG;EACxC,QAAQ,KAAK;GAAE,SAAS;GAAI,MAAM,QAAQ,EAAE;GAAG;EAAU,CAAC;CAC5D;CAEA,OAAO;AACT;AAEA,MAAM,gBAAgB,SAAkB,iBAAuC;CAC7E,KAAK,MAAM,QAAQ,QAAQ,YACzB,IAAI,KAAK,aAAa,KAAK;MACrB,iBAAiB,KAAA,KAAa,KAAK,gBAAgB,cACrD,OAAO;CAAA;CAIb,OAAO;AACT"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as iconBus, t as getIcon } from "./registry-CZEB1YI9.js";
|
|
2
|
-
import { t as __decorate } from "./decorate-
|
|
2
|
+
import { n as safeCustomElement, t as __decorate } from "./decorate-O4m1U4l3.js";
|
|
3
3
|
import { LitElement, css, html, nothing } from "lit";
|
|
4
|
-
import {
|
|
4
|
+
import { property } from "lit/decorators.js";
|
|
5
5
|
import "lit/directives/style-map.js";
|
|
6
6
|
import { unsafeHTML } from "lit/directives/unsafe-html.js";
|
|
7
7
|
//#region src/icons/icon.ts
|
|
@@ -93,8 +93,8 @@ __decorate([property({
|
|
|
93
93
|
attribute: "rotate",
|
|
94
94
|
reflect: true
|
|
95
95
|
})], IxfxIconElement.prototype, "rotate", void 0);
|
|
96
|
-
IxfxIconElement = __decorate([
|
|
96
|
+
IxfxIconElement = __decorate([safeCustomElement(`ixfx-icon`)], IxfxIconElement);
|
|
97
97
|
//#endregion
|
|
98
98
|
export { IxfxIconElement as t };
|
|
99
99
|
|
|
100
|
-
//# sourceMappingURL=icon-
|
|
100
|
+
//# sourceMappingURL=icon-CYACf6o8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-CYACf6o8.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 { styleMap } from 'lit/directives/style-map.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { getIcon, iconBus } from './registry.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n/**\n * Renders an icon from the icon registry by name.\n *\n * @example\n * ```html\n * <ixfx-icon name=\"chevron-down\"></ixfx-icon>\n * <ixfx-icon name=\"close\" size=\"32\" label=\"Close dialog\"></ixfx-icon>\n * ```\n *\n * Use `registerIcon(name, svgString)` to add or override icons.\n */\n@customElement(`ixfx-icon`)\nexport class IxfxIconElement extends LitElement {\n @property() name = ``;\n @property({ type: Number }) size: number | undefined;\n @property() label = ``;\n @property({ type: Boolean, attribute: `prominence` }) prominence = false;\n @property({ type: String, attribute: 'rotate', reflect: true }) rotate = ``;\n\n #onIconChange = (e: Event): void => {\n if ((e as IconChangedEvent).detail.name === this.name) {\n this.requestUpdate();\n }\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n iconBus.addEventListener(`ixfx-icon-change`, this.#onIconChange);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n iconBus.removeEventListener(`ixfx-icon-change`, this.#onIconChange);\n }\n\n protected override render() {\n const svg = getIcon(this.name);\n if (!svg)\n return nothing;\n\n const hasLabel = this.label.length > 0;\n\n return html`\n <span\n class=\"icon-wrapper\"\n aria-hidden=${hasLabel ? nothing : `true`}\n aria-label=${hasLabel ? this.label : nothing}\n >${unsafeHTML(svg)}</span>\n `;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`rotate`)) {\n if (this.rotate?.length > 0) {\n this.style.setProperty(`--rotate`, this.rotate);\n } else {\n this.style.removeProperty(`--rotate`);\n }\n }\n }\n\n static override styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1em;\n height: 1em;\n opacity: var(--opacity, 1);\n }\n\n :host([prominence]) {\n opacity: var(--prominence-idle-opacity, 1);\n }\n\n :host([prominence]:hover) {\n opacity: var(--prominence-tickled-opacity, 1);\n }\n\n :host([prominence][disabled]) {\n opacity: var(--prominence-disabled-opacity, 0.5);\n }\n\n .icon-wrapper {\n display: contents;\n }\n\n :host svg {\n width: 100%;\n height: 100%;\n transition: transform var(--transition, 0.15s ease-out);\n }\n\n :host([rotate]) svg {\n transform: rotate(var(--rotate));\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-icon': IxfxIconElement;\n }\n}\n"],"mappings":";;;;;;;AAoBO,IAAA,kBAAA,MAAM,wBAAwB,WAAW;;;cAC3B;eAEC;oBAC+C;gBACM;wBAExD,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,GACtB,IAAI,KAAK,QAAQ,SAAS,GACxB,KAAK,MAAM,YAAY,YAAY,KAAK,MAAM;OAE9C,KAAK,MAAM,eAAe,UAAU;CAG1C;;gBAEyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoC9B;YArFG,SAAS,CAAA,GAAA,gBAAA,WAAA,QAAA,KAAA,CAAA;YACT,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,gBAAA,WAAA,QAAA,KAAA,CAAA;YACzB,SAAS,CAAA,GAAA,gBAAA,WAAA,SAAA,KAAA,CAAA;YACT,SAAS;CAAE,MAAM;CAAS,WAAW;AAAa,CAAC,CAAA,GAAA,gBAAA,WAAA,cAAA,KAAA,CAAA;YACnD,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAU,SAAS;AAAK,CAAC,CAAA,GAAA,gBAAA,WAAA,UAAA,KAAA,CAAA;8BAN/DC,kBAAc,WAAW,CAAA,GAAA,eAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as _$lit from "lit";
|
|
2
1
|
import { LitElement, nothing } from "lit";
|
|
3
2
|
|
|
4
3
|
//#region src/icons/icon.d.ts
|
|
@@ -22,9 +21,9 @@ declare class IxfxIconElement extends LitElement {
|
|
|
22
21
|
rotate: string;
|
|
23
22
|
connectedCallback(): void;
|
|
24
23
|
disconnectedCallback(): void;
|
|
25
|
-
protected render(): typeof nothing |
|
|
24
|
+
protected render(): typeof nothing | import("lit").TemplateResult<1>;
|
|
26
25
|
protected updated(changed: Map<string, unknown>): void;
|
|
27
|
-
static styles:
|
|
26
|
+
static styles: import("lit").CSSResult;
|
|
28
27
|
}
|
|
29
28
|
declare global {
|
|
30
29
|
interface HTMLElementTagNameMap {
|
|
@@ -33,4 +32,4 @@ declare global {
|
|
|
33
32
|
} //# sourceMappingURL=icon.d.ts.map
|
|
34
33
|
//#endregion
|
|
35
34
|
export { IxfxIconElement as t };
|
|
36
|
-
//# sourceMappingURL=icon-
|
|
35
|
+
//# sourceMappingURL=icon-CeTDJhC7.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-CeTDJhC7.d.ts","names":[],"sources":["../src/icons/icon.ts"],"mappings":";;;;;AAmBA;;;;;;;;;cACa,eAAA,SAAwB,UAAA;EAAA;EACvB,IAAA;EACgB,IAAA;EAChB,KAAA;EAC0C,UAAA;EACU,MAAA;EAQvD,iBAAA,CAAA;EAKA,oBAAA,CAAA;EAAA,UAKU,MAAA,CAAA,UAAM,OAAA,iBAAA,cAAA;EAAA,UAgBN,OAAA,CAAQ,OAAA,EAAS,GAAA;EAAA,OAWpB,MAAA,gBAAM,SAAA;AAAA;AAAA,QAsChB,MAAA;EAAA,UACI,qBAAA;IACR,WAAA,EAAa,eAAe;EAAA;AAAA"}
|
package/dist/icons.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as IxfxIconElement } from "./icon-
|
|
1
|
+
import { t as IxfxIconElement } from "./icon-CeTDJhC7.js";
|
|
2
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-B1hNR7Z9.js";
|
|
3
|
-
export { ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE, IconChangedDetail, IconChangedEvent, IxfxIconElement, getIcon, hasIcon, iconBus, registerIcon, svgToDataUri };
|
|
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-CZEB1YI9.js";
|
|
2
|
-
import { t as IxfxIconElement } from "./icon-
|
|
2
|
+
import { t as IxfxIconElement } from "./icon-CYACf6o8.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-FEZaGiYZ.js";
|
|
4
4
|
//#region src/icons/index.ts
|
|
5
5
|
registerDefaults();
|
package/dist/icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","names":[],"sources":["../src/icons/index.ts"],"sourcesContent":["import { registerDefaults } from './defaults.js';\n\nexport { ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE } from './defaults.js';\nexport { IxfxIconElement } from './icon.js';\nexport { getIcon, hasIcon, iconBus, registerIcon, svgToDataUri } from './registry.js';\nexport type { IconChangedDetail, IconChangedEvent } from './registry.js';\n\nregisterDefaults();\n"],"mappings":";;;;AAOA,
|
|
1
|
+
{"version":3,"file":"icons.js","names":[],"sources":["../src/icons/index.ts"],"sourcesContent":["import { registerDefaults } from './defaults.js';\n\nexport { ICON_CARET_RIGHT, ICON_CHECK, ICON_CHEVRON_DOWN, ICON_CLOSE } from './defaults.js';\nexport { IxfxIconElement } from './icon.js';\nexport { getIcon, hasIcon, iconBus, registerIcon, svgToDataUri } from './registry.js';\nexport type { IconChangedDetail, IconChangedEvent } from './registry.js';\n\nregisterDefaults();\n"],"mappings":";;;;AAOA,iBAAiB"}
|