@orz/ui-hex 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +29 -0
- package/README.md +536 -2
- package/dist/column-fit.d.ts +16 -0
- package/dist/column-fit.d.ts.map +1 -0
- package/dist/column-fit.js +22 -0
- package/dist/column-fit.js.map +1 -0
- package/dist/decode.d.ts +11 -0
- package/dist/decode.d.ts.map +1 -0
- package/dist/decode.js +63 -0
- package/dist/decode.js.map +1 -0
- package/dist/document.d.ts +75 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +523 -0
- package/dist/document.js.map +1 -0
- package/dist/editing.d.ts +66 -0
- package/dist/editing.d.ts.map +1 -0
- package/dist/editing.js +202 -0
- package/dist/editing.js.map +1 -0
- package/dist/encoding-picker.d.ts +6 -0
- package/dist/encoding-picker.d.ts.map +1 -0
- package/dist/encoding-picker.js +84 -0
- package/dist/encoding-picker.js.map +1 -0
- package/dist/encodings.d.ts +19 -0
- package/dist/encodings.d.ts.map +1 -0
- package/dist/encodings.js +106 -0
- package/dist/encodings.js.map +1 -0
- package/dist/format.d.ts +29 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +73 -0
- package/dist/format.js.map +1 -0
- package/dist/hex-editor.d.ts +27 -0
- package/dist/hex-editor.d.ts.map +1 -0
- package/dist/hex-editor.js +270 -0
- package/dist/hex-editor.js.map +1 -0
- package/dist/hex-grid.d.ts +102 -0
- package/dist/hex-grid.d.ts.map +1 -0
- package/dist/hex-grid.js +860 -0
- package/dist/hex-grid.js.map +1 -0
- package/dist/hex-inspector.d.ts +12 -0
- package/dist/hex-inspector.d.ts.map +1 -0
- package/dist/hex-inspector.js +68 -0
- package/dist/hex-inspector.js.map +1 -0
- package/dist/hex-paste.d.ts +26 -0
- package/dist/hex-paste.d.ts.map +1 -0
- package/dist/hex-paste.js +42 -0
- package/dist/hex-paste.js.map +1 -0
- package/dist/hex-view.d.ts +4 -0
- package/dist/hex-view.d.ts.map +1 -0
- package/dist/hex-view.js +6 -0
- package/dist/hex-view.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation.d.ts +25 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +100 -0
- package/dist/navigation.js.map +1 -0
- package/dist/page-cache.d.ts +45 -0
- package/dist/page-cache.d.ts.map +1 -0
- package/dist/page-cache.js +334 -0
- package/dist/page-cache.js.map +1 -0
- package/dist/source.d.ts +22 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +31 -0
- package/dist/source.js.map +1 -0
- package/dist/text-decoding-multibyte.d.ts +17 -0
- package/dist/text-decoding-multibyte.d.ts.map +1 -0
- package/dist/text-decoding-multibyte.js +448 -0
- package/dist/text-decoding-multibyte.js.map +1 -0
- package/dist/text-decoding.d.ts +45 -0
- package/dist/text-decoding.d.ts.map +1 -0
- package/dist/text-decoding.js +106 -0
- package/dist/text-decoding.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/use-hex-document-state.d.ts +10 -0
- package/dist/use-hex-document-state.d.ts.map +1 -0
- package/dist/use-hex-document-state.js +22 -0
- package/dist/use-hex-document-state.js.map +1 -0
- package/package.json +53 -3
- package/styles.css +456 -0
package/dist/format.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { getTextDecoding } from "./encodings.js";
|
|
2
|
+
const UPPER = Array.from({ length: 256 }, (_, b) => b.toString(16).padStart(2, "0").toUpperCase());
|
|
3
|
+
const LOWER = UPPER.map((s) => s.toLowerCase());
|
|
4
|
+
export function hexByte(byte, uppercase = true) {
|
|
5
|
+
return (uppercase ? UPPER : LOWER)[byte & 0xff];
|
|
6
|
+
}
|
|
7
|
+
export function addressDigits(lastAddress) {
|
|
8
|
+
return Math.max(4, Math.max(0, lastAddress).toString(16).length);
|
|
9
|
+
}
|
|
10
|
+
export function formatAddress(address, digits, uppercase = true) {
|
|
11
|
+
const s = address.toString(16).padStart(digits, "0");
|
|
12
|
+
return uppercase ? s.toUpperCase() : s;
|
|
13
|
+
}
|
|
14
|
+
/** `0x5` / `0x5–0x25`: the short offset form used by the status bar and the inspector. */
|
|
15
|
+
export function formatOffset(offset) {
|
|
16
|
+
return `0x${offset.toString(16).toUpperCase()}`;
|
|
17
|
+
}
|
|
18
|
+
const UNITS = ["KB", "MB", "GB", "TB", "PB"];
|
|
19
|
+
export function formatSize(bytes) {
|
|
20
|
+
const hex = formatOffset(bytes);
|
|
21
|
+
if (bytes < 1024)
|
|
22
|
+
return `${bytes} ${bytes === 1 ? "byte" : "bytes"} (${hex})`;
|
|
23
|
+
let value = bytes / 1024;
|
|
24
|
+
let unit = 0;
|
|
25
|
+
while (value >= 1024 && unit < UNITS.length - 1) {
|
|
26
|
+
value /= 1024;
|
|
27
|
+
unit++;
|
|
28
|
+
}
|
|
29
|
+
return `${Number(value.toFixed(2))} ${UNITS[unit]} (${hex})`;
|
|
30
|
+
}
|
|
31
|
+
export const MAX_COPY_BYTES = 1 << 20;
|
|
32
|
+
function decodingOf(encoding) {
|
|
33
|
+
return typeof encoding === "string" ? getTextDecoding(encoding) : encoding;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The source range `[from, to)` to read for copying `length` bytes at
|
|
37
|
+
* `offset`: the selection widened by the encoding's lookbehind and lookahead,
|
|
38
|
+
* so `copyText` writes its first and last glyphs as the text pane shows them.
|
|
39
|
+
*/
|
|
40
|
+
export function copyRange(offset, length, size, encoding = "ascii") {
|
|
41
|
+
const decoding = decodingOf(encoding);
|
|
42
|
+
return {
|
|
43
|
+
from: Math.max(0, offset - decoding.lookbehind),
|
|
44
|
+
to: Math.min(size, offset + length + decoding.lookahead),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The clipboard text for a selection. `bytes` starts with `lead` bytes before
|
|
49
|
+
* the selection and may run past it, as `copyRange` reads them; `offset` is
|
|
50
|
+
* the source offset of the first selected byte, and `length` the selection's
|
|
51
|
+
* length. The text pane's form decodes in `encoding`, ASCII like the view's
|
|
52
|
+
* default.
|
|
53
|
+
*/
|
|
54
|
+
export function copyText(bytes, pane, uppercase = true, encoding = "ascii", lead = 0, offset = lead, length = bytes.length - lead) {
|
|
55
|
+
if (pane === "hex") {
|
|
56
|
+
const parts = new Array(length);
|
|
57
|
+
for (let i = 0; i < length; i++) {
|
|
58
|
+
parts[i] = hexByte(bytes[lead + i], uppercase);
|
|
59
|
+
}
|
|
60
|
+
return parts.join(" ");
|
|
61
|
+
}
|
|
62
|
+
let out = "";
|
|
63
|
+
const row = { start: offset, before: lead, length };
|
|
64
|
+
for (const cell of decodingOf(encoding).decodeRow(bytes, row, "dots")) {
|
|
65
|
+
// A glyph is written whole by its first byte, even when its trailing
|
|
66
|
+
// bytes lie past the selection; one starting before it is left out.
|
|
67
|
+
if (cell.kind === "continuation")
|
|
68
|
+
continue;
|
|
69
|
+
out += cell.kind === "char" ? cell.text : ".";
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type HexDocument } from "./document.ts";
|
|
2
|
+
import { type HexEditMode } from "./editing.ts";
|
|
3
|
+
import { type HexViewProps } from "./hex-grid.tsx";
|
|
4
|
+
export type { HexEditMode } from "./editing.ts";
|
|
5
|
+
export type HexPasteResult = {
|
|
6
|
+
ok: true;
|
|
7
|
+
bytes: number;
|
|
8
|
+
truncated: boolean;
|
|
9
|
+
} | {
|
|
10
|
+
ok: false;
|
|
11
|
+
/** "unencodable": the text pane's encoding has no bytes for a pasted character. */
|
|
12
|
+
reason: "not-hex" | "unencodable" | "empty" | "read-only";
|
|
13
|
+
};
|
|
14
|
+
export interface HexEditorProps extends Omit<HexViewProps, "source"> {
|
|
15
|
+
document: HexDocument;
|
|
16
|
+
mode?: HexEditMode;
|
|
17
|
+
/** "overwrite". */
|
|
18
|
+
defaultMode?: HexEditMode;
|
|
19
|
+
onModeChange?: (mode: HexEditMode) => void;
|
|
20
|
+
/** Shows the document with the editor's caret and refuses edits. */
|
|
21
|
+
readOnly?: boolean;
|
|
22
|
+
onPaste?: (result: HexPasteResult) => void;
|
|
23
|
+
/** "Hex editor". */
|
|
24
|
+
"aria-label"?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function HexEditor({ document: doc, mode: modeProp, defaultMode, onModeChange, readOnly, onPaste, selection: selectionProp, defaultSelection, onSelectionChange, "aria-label": ariaLabel, ...viewProps }: HexEditorProps): import("react").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=hex-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-editor.d.ts","sourceRoot":"","sources":["../src/hex-editor.tsx"],"names":[],"mappings":"AAUA,OAAO,EAKL,KAAK,WAAW,EAGjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAKL,KAAK,WAAW,EAEjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,KAAK,YAAY,EAGlB,MAAM,gBAAgB,CAAC;AAIxB,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAC/C;IACE,EAAE,EAAE,KAAK,CAAC;IACV,mFAAmF;IACnF,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,WAAW,CAAC;CAC3D,CAAC;AAEN,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;IAClE,QAAQ,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,mBAAmB;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC3C,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA6DD,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,QAAQ,EACd,WAAyB,EACzB,YAAY,EACZ,QAAgB,EAChB,OAAO,EACP,SAAS,EAAE,aAAa,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EAAE,SAAwB,EACtC,GAAG,SAAS,EACb,EAAE,cAAc,+BAuRhB"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore, } from "react";
|
|
3
|
+
import { breakRun, documentVersion, editDocument, editGroup, isHexDocument, lastChange, } from "./document.js";
|
|
4
|
+
import { editKey, editPaste, selectionRange, } from "./editing.js";
|
|
5
|
+
import { HexGrid, useControllableSelection, useLatest, } from "./hex-grid.js";
|
|
6
|
+
import { clipboardBytes, HEX_BYTES_TYPE } from "./hex-paste.js";
|
|
7
|
+
const utf8 = new TextEncoder();
|
|
8
|
+
const MODE_NAMES = { insert: "Insert mode", overwrite: "Overwrite mode" };
|
|
9
|
+
const NOT_CUT = "Copied, not cut: the text would not paste back as these bytes";
|
|
10
|
+
function sameBytes(a, b) {
|
|
11
|
+
if (a.length !== b.length)
|
|
12
|
+
return false;
|
|
13
|
+
for (let i = 0; i < a.length; i++)
|
|
14
|
+
if (a[i] !== b[i])
|
|
15
|
+
return false;
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
const isApple = () => typeof navigator !== "undefined" &&
|
|
19
|
+
/Mac|iPhone|iPad|iPod/.test(navigator.platform);
|
|
20
|
+
/**
|
|
21
|
+
* Whether the held modifiers compose a character rather than form a shortcut.
|
|
22
|
+
* ⌥ is how a Mac types characters, yet Chrome and Safari report it as Alt
|
|
23
|
+
* alone and Firefox reports AltGraph even with ⌘ held, so on Apple platforms
|
|
24
|
+
* the keys themselves decide.
|
|
25
|
+
*/
|
|
26
|
+
function composing(event) {
|
|
27
|
+
if (isApple())
|
|
28
|
+
return event.altKey && !event.ctrlKey && !event.metaKey;
|
|
29
|
+
return event.getModifierState?.("AltGraph") ?? false;
|
|
30
|
+
}
|
|
31
|
+
function useControllableMode(value, defaultValue, onChange) {
|
|
32
|
+
const [inner, setInner] = useState(defaultValue);
|
|
33
|
+
const current = value ?? inner;
|
|
34
|
+
const onChangeRef = useLatest(onChange);
|
|
35
|
+
const set = useCallback((next) => {
|
|
36
|
+
if (value === undefined)
|
|
37
|
+
setInner(next);
|
|
38
|
+
onChangeRef.current?.(next);
|
|
39
|
+
}, [value, onChangeRef]);
|
|
40
|
+
return [current, set];
|
|
41
|
+
}
|
|
42
|
+
function clampSelection(selection, maxOffset) {
|
|
43
|
+
if (!selection)
|
|
44
|
+
return selection;
|
|
45
|
+
if (maxOffset < 0)
|
|
46
|
+
return null;
|
|
47
|
+
if (selection.anchor <= maxOffset && selection.focus <= maxOffset) {
|
|
48
|
+
return selection;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
anchor: Math.min(selection.anchor, maxOffset),
|
|
52
|
+
focus: Math.min(selection.focus, maxOffset),
|
|
53
|
+
pane: selection.pane,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function HexEditor({ document: doc, mode: modeProp, defaultMode = "overwrite", onModeChange, readOnly = false, onPaste, selection: selectionProp, defaultSelection, onSelectionChange, "aria-label": ariaLabel = "Hex editor", ...viewProps }) {
|
|
57
|
+
if (!isHexDocument(doc)) {
|
|
58
|
+
throw new TypeError("HexEditor needs a document from createHexDocument");
|
|
59
|
+
}
|
|
60
|
+
const [selection, setSelection, selectionRef] = useControllableSelection(selectionProp, defaultSelection, onSelectionChange);
|
|
61
|
+
const [modeValue, setMode] = useControllableMode(modeProp, defaultMode, onModeChange);
|
|
62
|
+
const mode = doc.resizable ? modeValue : "overwrite";
|
|
63
|
+
const modeRef = useLatest(mode);
|
|
64
|
+
// A mode the app switches through the prop ends the typing run too.
|
|
65
|
+
const lastMode = useRef(mode);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (lastMode.current === mode)
|
|
68
|
+
return;
|
|
69
|
+
lastMode.current = mode;
|
|
70
|
+
breakRun(doc);
|
|
71
|
+
}, [doc, mode]);
|
|
72
|
+
const readOnlyRef = useLatest(readOnly);
|
|
73
|
+
const onPasteRef = useLatest(onPaste);
|
|
74
|
+
const getVersion = useCallback(() => documentVersion(doc), [doc]);
|
|
75
|
+
useSyncExternalStore(doc.subscribe, getVersion, getVersion);
|
|
76
|
+
const contextRef = useRef(null);
|
|
77
|
+
// Set while the editor applies its own edit: it sets the selection itself.
|
|
78
|
+
const applying = useRef(false);
|
|
79
|
+
const maxOffset = useCallback(() => (doc.resizable ? doc.size : doc.size - 1), [doc]);
|
|
80
|
+
useEffect(() => doc.subscribe(() => {
|
|
81
|
+
if (applying.current)
|
|
82
|
+
return;
|
|
83
|
+
const change = lastChange(doc);
|
|
84
|
+
const current = selectionRef.current;
|
|
85
|
+
const next = (change.kind === "undo" || change.kind === "redo") &&
|
|
86
|
+
change.selection !== undefined
|
|
87
|
+
? clampSelection(change.selection, maxOffset())
|
|
88
|
+
: clampSelection(current, maxOffset());
|
|
89
|
+
if (next === current)
|
|
90
|
+
return;
|
|
91
|
+
setSelection(next);
|
|
92
|
+
if (next)
|
|
93
|
+
contextRef.current?.reveal(next.focus);
|
|
94
|
+
contextRef.current?.announce(next);
|
|
95
|
+
}), [doc, maxOffset, selectionRef, setSelection]);
|
|
96
|
+
const editState = useCallback((ctx) => ({
|
|
97
|
+
selection: selectionRef.current,
|
|
98
|
+
mode: modeRef.current,
|
|
99
|
+
size: doc.size,
|
|
100
|
+
resizable: doc.resizable,
|
|
101
|
+
readOnly: readOnlyRef.current,
|
|
102
|
+
byteAt: (offset) => ctx.cache.get(offset, 1)?.[0],
|
|
103
|
+
encode: (text) => ctx.decoding.encode ? ctx.decoding.encode(text) : utf8.encode(text),
|
|
104
|
+
}), [doc, modeRef, readOnlyRef, selectionRef]);
|
|
105
|
+
const toggleMode = useCallback((ctx) => {
|
|
106
|
+
if (!doc.resizable || readOnlyRef.current)
|
|
107
|
+
return;
|
|
108
|
+
const next = modeRef.current === "insert" ? "overwrite" : "insert";
|
|
109
|
+
breakRun(doc);
|
|
110
|
+
setMode(next);
|
|
111
|
+
ctx?.announce(MODE_NAMES[next]);
|
|
112
|
+
}, [doc, modeRef, readOnlyRef, setMode]);
|
|
113
|
+
const run = useCallback((command, ctx) => {
|
|
114
|
+
switch (command.kind) {
|
|
115
|
+
case "edit": {
|
|
116
|
+
const before = selectionRef.current;
|
|
117
|
+
const after = command.selection;
|
|
118
|
+
applying.current = true;
|
|
119
|
+
try {
|
|
120
|
+
editGroup(doc, () => {
|
|
121
|
+
for (const edit of command.edits) {
|
|
122
|
+
editDocument(doc, { ...edit, key: command.key, before, after });
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
applying.current = false;
|
|
128
|
+
}
|
|
129
|
+
setSelection(after);
|
|
130
|
+
ctx.reveal(after.focus);
|
|
131
|
+
ctx.announce(after);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
case "select":
|
|
135
|
+
setSelection(command.selection);
|
|
136
|
+
ctx.announce(command.selection);
|
|
137
|
+
return;
|
|
138
|
+
case "undo":
|
|
139
|
+
doc.undo();
|
|
140
|
+
return;
|
|
141
|
+
case "redo":
|
|
142
|
+
doc.redo();
|
|
143
|
+
return;
|
|
144
|
+
case "toggle-mode":
|
|
145
|
+
toggleMode(ctx);
|
|
146
|
+
return;
|
|
147
|
+
default:
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
}, [doc, selectionRef, setSelection, toggleMode]);
|
|
151
|
+
const editing = useMemo(() => ({
|
|
152
|
+
appendCell: doc.resizable,
|
|
153
|
+
readOnly,
|
|
154
|
+
mode,
|
|
155
|
+
contextRef,
|
|
156
|
+
modifiedRanges: (offset, length) => doc.modifiedRanges(offset, length),
|
|
157
|
+
onCaretMove: () => breakRun(doc),
|
|
158
|
+
onKey(event, ctx) {
|
|
159
|
+
const command = editKey(editState(ctx), {
|
|
160
|
+
key: event.key,
|
|
161
|
+
shift: event.shiftKey,
|
|
162
|
+
mod: event.ctrlKey || event.metaKey,
|
|
163
|
+
alt: event.altKey,
|
|
164
|
+
altGraph: composing(event),
|
|
165
|
+
});
|
|
166
|
+
if (!command)
|
|
167
|
+
return false;
|
|
168
|
+
// The native cut event follows the key; cancelling the key would stop it.
|
|
169
|
+
if (command.kind === "cut")
|
|
170
|
+
return true;
|
|
171
|
+
event.preventDefault();
|
|
172
|
+
run(command, ctx);
|
|
173
|
+
return true;
|
|
174
|
+
},
|
|
175
|
+
onPaste(event, ctx) {
|
|
176
|
+
const report = (result) => onPasteRef.current?.(result);
|
|
177
|
+
const current = selectionRef.current;
|
|
178
|
+
if (!current)
|
|
179
|
+
return;
|
|
180
|
+
event.preventDefault();
|
|
181
|
+
if (readOnlyRef.current) {
|
|
182
|
+
report({ ok: false, reason: "read-only" });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const data = event.clipboardData;
|
|
186
|
+
const state = editState(ctx);
|
|
187
|
+
const bytes = clipboardBytes({
|
|
188
|
+
text: data?.getData("text/plain") ?? "",
|
|
189
|
+
bytes: data?.getData(HEX_BYTES_TYPE),
|
|
190
|
+
}, current.pane, state.encode);
|
|
191
|
+
if (bytes === null) {
|
|
192
|
+
report({
|
|
193
|
+
ok: false,
|
|
194
|
+
reason: current.pane === "hex" ? "not-hex" : "unencodable",
|
|
195
|
+
});
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (bytes.length === 0) {
|
|
199
|
+
report({ ok: false, reason: "empty" });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const { command, truncated } = editPaste(state, bytes);
|
|
203
|
+
breakRun(doc);
|
|
204
|
+
let written = 0;
|
|
205
|
+
if (command.kind === "edit") {
|
|
206
|
+
written = command.edits.at(-1)?.bytes.length ?? 0;
|
|
207
|
+
run(command, ctx);
|
|
208
|
+
breakRun(doc);
|
|
209
|
+
}
|
|
210
|
+
report({ ok: true, bytes: written, truncated });
|
|
211
|
+
},
|
|
212
|
+
onCut(event, ctx) {
|
|
213
|
+
const current = selectionRef.current;
|
|
214
|
+
const range = current && selectionRange(current, doc.size);
|
|
215
|
+
if (readOnlyRef.current || !doc.resizable || !current || !range) {
|
|
216
|
+
event.preventDefault();
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const version = documentVersion(doc);
|
|
220
|
+
ctx.copy(event, ({ bytes, clipboard }) => {
|
|
221
|
+
// An async copy lands later; an edit in between moved the bytes.
|
|
222
|
+
if (documentVersion(doc) !== version)
|
|
223
|
+
return;
|
|
224
|
+
// Text alone may not paste back as the bytes (a dot for 00), and a
|
|
225
|
+
// cut that deletes what the clipboard lacks loses it.
|
|
226
|
+
const back = clipboardBytes(clipboard, current.pane, editState(ctx).encode);
|
|
227
|
+
if (!back || !sameBytes(back, bytes)) {
|
|
228
|
+
ctx.announce(NOT_CUT);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
run({
|
|
232
|
+
kind: "edit",
|
|
233
|
+
edits: [
|
|
234
|
+
{
|
|
235
|
+
offset: range[0],
|
|
236
|
+
length: range[1] - range[0] + 1,
|
|
237
|
+
bytes: new Uint8Array(0),
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
selection: current.pane === "hex"
|
|
241
|
+
? {
|
|
242
|
+
anchor: range[0],
|
|
243
|
+
focus: range[0],
|
|
244
|
+
pane: "hex",
|
|
245
|
+
nibble: 0,
|
|
246
|
+
}
|
|
247
|
+
: { anchor: range[0], focus: range[0], pane: "text" },
|
|
248
|
+
}, ctx);
|
|
249
|
+
});
|
|
250
|
+
},
|
|
251
|
+
statusExtra: (_jsx("button", { type: "button", tabIndex: -1, className: "orz-hex-mode", "aria-label": MODE_NAMES[mode], "aria-pressed": mode === "insert", disabled: !doc.resizable || readOnly,
|
|
252
|
+
// Keeps focus, and so the caret's colours, on the grid.
|
|
253
|
+
onMouseDown: (event) => event.preventDefault(), onClick: () => {
|
|
254
|
+
toggleMode(contextRef.current);
|
|
255
|
+
contextRef.current?.focus();
|
|
256
|
+
}, children: mode === "insert" ? "INS" : "OVR" })),
|
|
257
|
+
}), [
|
|
258
|
+
doc,
|
|
259
|
+
mode,
|
|
260
|
+
readOnly,
|
|
261
|
+
editState,
|
|
262
|
+
run,
|
|
263
|
+
toggleMode,
|
|
264
|
+
onPasteRef,
|
|
265
|
+
readOnlyRef,
|
|
266
|
+
selectionRef,
|
|
267
|
+
]);
|
|
268
|
+
return (_jsx(HexGrid, { ...viewProps, source: doc, selection: selection, onSelectionChange: setSelection, "aria-label": ariaLabel, editing: editing }));
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=hex-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-editor.js","sourceRoot":"","sources":["../src/hex-editor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAEL,WAAW,EACX,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,EACR,oBAAoB,GACrB,MAAM,OAAO,CAAC;AAEf,OAAO,EACL,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,SAAS,EAET,aAAa,EACb,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,OAAO,EACP,SAAS,EAET,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,OAAO,EAEP,wBAAwB,EACxB,SAAS,GACV,MAAM,eAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA0BhE,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;AAC/B,MAAM,UAAU,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AAC1E,MAAM,OAAO,GAAG,+DAA+D,CAAC;AAEhF,SAAS,SAAS,CAAC,CAAa,EAAE,CAAa;IAC7C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,OAAO,SAAS,KAAK,WAAW;IAChC,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAElD;;;;;GAKG;AACH,SAAS,SAAS,CAAC,KAAyB;IAC1C,IAAI,OAAO,EAAE;QAAE,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IACvE,OAAO,KAAK,CAAC,gBAAgB,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;AACvD,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA8B,EAC9B,YAAyB,EACzB,QAAmD;IAEnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC;IAC/B,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,IAAiB,EAAE,EAAE;QACpB,IAAI,KAAK,KAAK,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxC,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,EACD,CAAC,KAAK,EAAE,WAAW,CAAC,CACrB,CAAC;IACF,OAAO,CAAC,OAAO,EAAE,GAAG,CAAU,CAAC;AACjC,CAAC;AAED,SAAS,cAAc,CACrB,SAA8B,EAC9B,SAAiB;IAEjB,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC;QAC7C,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC;QAC3C,IAAI,EAAE,SAAS,CAAC,IAAI;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EACxB,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,QAAQ,EACd,WAAW,GAAG,WAAW,EACzB,YAAY,EACZ,QAAQ,GAAG,KAAK,EAChB,OAAO,EACP,SAAS,EAAE,aAAa,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EAAE,SAAS,GAAG,YAAY,EACtC,GAAG,SAAS,EACG;IACf,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,wBAAwB,CACtE,aAAa,EACb,gBAAgB,EAChB,iBAAiB,CAClB,CAAC;IACF,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAC9C,QAAQ,EACR,WAAW,EACX,YAAY,CACb,CAAC;IACF,MAAM,IAAI,GAAgB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;IAClE,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,oEAAoE;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO;QACtC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAChB,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAEtC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAE5D,MAAM,UAAU,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IACpD,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,SAAS,GAAG,WAAW,CAC3B,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,EAC/C,CAAC,GAAG,CAAC,CACN,CAAC;IAEF,SAAS,CACP,GAAG,EAAE,CACH,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,IAAI,QAAQ,CAAC,OAAO;YAAE,OAAO;QAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;QACrC,MAAM,IAAI,GACR,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;YAClD,MAAM,CAAC,SAAS,KAAK,SAAS;YAC5B,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;YAC/C,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO;QAC7B,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,IAAI;YAAE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,EACJ,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAC7C,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,GAAgB,EAAa,EAAE,CAAC,CAAC;QAChC,SAAS,EAAE,YAAY,CAAC,OAAO;QAC/B,IAAI,EAAE,OAAO,CAAC,OAAO;QACrB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,WAAW,CAAC,OAAO;QAC7B,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;KACtE,CAAC,EACF,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAC1C,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,GAAuB,EAAE,EAAE;QAC1B,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,WAAW,CAAC,OAAO;YAAE,OAAO;QAClD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,GAAG,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC,EACD,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CACrC,CAAC;IAEF,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,OAAoB,EAAE,GAAgB,EAAE,EAAE;QACzC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,MAAM,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC;gBACpC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC;gBAChC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;gBACxB,IAAI,CAAC;oBACH,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE;wBAClB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;4BACjC,YAAY,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;wBAClE,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;wBAAS,CAAC;oBACT,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;gBAC3B,CAAC;gBACD,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACxB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,KAAK,QAAQ;gBACX,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAChC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAChC,OAAO;YACT,KAAK,MAAM;gBACT,GAAG,CAAC,IAAI,EAAE,CAAC;gBACX,OAAO;YACT,KAAK,MAAM;gBACT,GAAG,CAAC,IAAI,EAAE,CAAC;gBACX,OAAO;YACT,KAAK,aAAa;gBAChB,UAAU,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO;YACT;gBACE,OAAO;QACX,CAAC;IACH,CAAC,EACD,CAAC,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAC9C,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,CAAC;QACL,UAAU,EAAE,GAAG,CAAC,SAAS;QACzB,QAAQ;QACR,IAAI;QACJ,UAAU;QACV,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;QACtE,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;QAEhC,KAAK,CAAC,KAAyC,EAAE,GAAG;YAClD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;gBACtC,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,KAAK,EAAE,KAAK,CAAC,QAAQ;gBACrB,GAAG,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;gBACnC,GAAG,EAAE,KAAK,CAAC,MAAM;gBACjB,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC;aAC3B,CAAC,CAAC;YACH,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAC3B,0EAA0E;YAC1E,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC;YACxC,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,CAAC,KAAK,EAAE,GAAG;YAChB,MAAM,MAAM,GAAG,CAAC,MAAkD,EAAE,EAAE,CACpE,UAAU,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;YACrC,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC3C,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC;YACjC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,cAAc,CAC1B;gBACE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE;gBACvC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC;aACrC,EACD,OAAO,CAAC,IAAI,EACZ,KAAK,CAAC,MAAM,CACb,CAAC;YACF,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,MAAM,CAAC;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;iBAC3D,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACvD,QAAQ,CAAC,GAAG,CAAC,CAAC;YACd,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;gBAClD,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAClB,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,KAAK,CAAC,KAAK,EAAE,GAAG;YACd,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;YACrC,MAAM,KAAK,GAAG,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3D,IAAI,WAAW,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChE,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;gBACvC,iEAAiE;gBACjE,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,OAAO;oBAAE,OAAO;gBAC7C,mEAAmE;gBACnE,sDAAsD;gBACtD,MAAM,IAAI,GAAG,cAAc,CACzB,SAAS,EACT,OAAO,CAAC,IAAI,EACZ,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,CACtB,CAAC;gBACF,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;oBACrC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACtB,OAAO;gBACT,CAAC;gBACD,GAAG,CACD;oBACE,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE;wBACL;4BACE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;4BAChB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;4BAC/B,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC;yBACzB;qBACF;oBACD,SAAS,EACP,OAAO,CAAC,IAAI,KAAK,KAAK;wBACpB,CAAC,CAAC;4BACE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;4BAChB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;4BACf,IAAI,EAAE,KAAK;4BACX,MAAM,EAAE,CAAC;yBACV;wBACH,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;iBAC1D,EACD,GAAG,CACJ,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAED,WAAW,EAAE,CACX,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,CAAC,EACZ,SAAS,EAAC,cAAc,gBACZ,UAAU,CAAC,IAAI,CAAC,kBACd,IAAI,KAAK,QAAQ,EAC/B,QAAQ,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,QAAQ;YACpC,wDAAwD;YACxD,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAC9C,OAAO,EAAE,GAAG,EAAE;gBACZ,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC/B,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAC9B,CAAC,YAEA,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAC3B,CACV;KACF,CAAC,EACF;QACE,GAAG;QACH,IAAI;QACJ,QAAQ;QACR,SAAS;QACT,GAAG;QACH,UAAU;QACV,UAAU;QACV,WAAW;QACX,YAAY;KACb,CACF,CAAC;IAEF,OAAO,CACL,KAAC,OAAO,OACF,SAAS,EACb,MAAM,EAAE,GAAG,EACX,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,YAAY,gBACnB,SAAS,EACrB,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { type KeyboardEvent as ReactKeyboardEvent, type ReactNode, type Ref, type RefObject } from "react";
|
|
2
|
+
import { type HexEncoding } from "./encodings.ts";
|
|
3
|
+
import { type HexClipboard } from "./hex-paste.ts";
|
|
4
|
+
import { type PageCache } from "./page-cache.ts";
|
|
5
|
+
import type { ByteSource } from "./source.ts";
|
|
6
|
+
import { type TextDecoding } from "./text-decoding.ts";
|
|
7
|
+
import { type ControlCodes, type HexSelection } from "./types.ts";
|
|
8
|
+
export type { HexPane, HexSelection } from "./types.ts";
|
|
9
|
+
export interface HexViewHandle {
|
|
10
|
+
scrollToOffset(offset: number, align?: "nearest" | "start" | "center"): void;
|
|
11
|
+
focus(): void;
|
|
12
|
+
}
|
|
13
|
+
export type HexCopyResult = {
|
|
14
|
+
ok: true;
|
|
15
|
+
bytes: number;
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
reason: "too-large" | "read-failed" | "clipboard-unavailable";
|
|
19
|
+
};
|
|
20
|
+
export interface HexViewProps {
|
|
21
|
+
source: ByteSource;
|
|
22
|
+
selection?: HexSelection | null;
|
|
23
|
+
defaultSelection?: HexSelection | null;
|
|
24
|
+
onSelectionChange?: (selection: HexSelection | null) => void;
|
|
25
|
+
/**
|
|
26
|
+
* Bytes per row; 16. `"auto"` picks the widest of `maxColumns` and the
|
|
27
|
+
* powers of two below it, down to 4, that fits the view's width.
|
|
28
|
+
*/
|
|
29
|
+
columns?: number | "auto";
|
|
30
|
+
/** The most columns `"auto"` picks; 16. */
|
|
31
|
+
maxColumns?: number;
|
|
32
|
+
/** Bytes per group, separated by a gap; 8, and 0 for no gap. */
|
|
33
|
+
groupSize?: number;
|
|
34
|
+
/** Added to every displayed address, never to selection offsets; 0. */
|
|
35
|
+
baseAddress?: number;
|
|
36
|
+
/** A fixed viewport height in rows; omitted, the view fills its parent. */
|
|
37
|
+
rows?: number;
|
|
38
|
+
/** A resize handle in the bottom corner; `true` resizes both ways. */
|
|
39
|
+
resizable?: boolean | "horizontal" | "vertical";
|
|
40
|
+
showAddresses?: boolean;
|
|
41
|
+
showColumnLabels?: boolean;
|
|
42
|
+
/** The text pane beside the hex pane. */
|
|
43
|
+
showText?: boolean;
|
|
44
|
+
showStatusBar?: boolean;
|
|
45
|
+
uppercase?: boolean;
|
|
46
|
+
fadeZeroBytes?: boolean;
|
|
47
|
+
controlCodes?: ControlCodes;
|
|
48
|
+
/** How the text pane decodes the bytes; controlled when set. */
|
|
49
|
+
encoding?: HexEncoding;
|
|
50
|
+
/** "ascii". */
|
|
51
|
+
defaultEncoding?: HexEncoding;
|
|
52
|
+
onEncodingChange?: (encoding: HexEncoding) => void;
|
|
53
|
+
/** The encoding picker in the text pane's header; true. */
|
|
54
|
+
showEncodingPicker?: boolean;
|
|
55
|
+
onCopy?: (result: HexCopyResult) => void;
|
|
56
|
+
onReadError?: (error: unknown, offset: number) => void;
|
|
57
|
+
ref?: Ref<HexViewHandle>;
|
|
58
|
+
className?: string;
|
|
59
|
+
"aria-label"?: string;
|
|
60
|
+
}
|
|
61
|
+
/** What a copy put on the clipboard, and the selected bytes it came from. */
|
|
62
|
+
export interface HexCopied {
|
|
63
|
+
bytes: Uint8Array;
|
|
64
|
+
clipboard: HexClipboard;
|
|
65
|
+
}
|
|
66
|
+
/** What the grid hands an editor: the pieces of the view its commands drive. */
|
|
67
|
+
export interface GridContext {
|
|
68
|
+
cache: PageCache;
|
|
69
|
+
/** The active encoding's decoding; an editor encodes typed text through it. */
|
|
70
|
+
decoding: TextDecoding;
|
|
71
|
+
/** Scrolls the offset into view. */
|
|
72
|
+
reveal(offset: number): void;
|
|
73
|
+
/** Speaks a selection like a keyboard move does, or a message. */
|
|
74
|
+
announce(what: HexSelection | null | string): void;
|
|
75
|
+
/** The copy path for the selection, excluding the append cell; `onCopied` runs once the text is on the clipboard. */
|
|
76
|
+
copy(event: ClipboardEvent, onCopied?: (copied: HexCopied) => void): void;
|
|
77
|
+
focus(): void;
|
|
78
|
+
}
|
|
79
|
+
/** Turns the grid into an editor's surface; `HexView` renders without it. */
|
|
80
|
+
export interface GridEditing {
|
|
81
|
+
/** Runs ahead of navigation; true when it took the key. */
|
|
82
|
+
onKey(event: ReactKeyboardEvent<HTMLDivElement>, ctx: GridContext): boolean;
|
|
83
|
+
/** A click or a navigation key moved the caret. */
|
|
84
|
+
onCaretMove(): void;
|
|
85
|
+
onPaste(event: ClipboardEvent, ctx: GridContext): void;
|
|
86
|
+
onCut(event: ClipboardEvent, ctx: GridContext): void;
|
|
87
|
+
/** One empty cell after the last byte, where typing appends. */
|
|
88
|
+
appendCell: boolean;
|
|
89
|
+
/** Refuses every edit, so the encoder is never warmed up. */
|
|
90
|
+
readOnly: boolean;
|
|
91
|
+
mode: "overwrite" | "insert";
|
|
92
|
+
modifiedRanges(offset: number, length: number): Array<[number, number]>;
|
|
93
|
+
statusExtra?: ReactNode;
|
|
94
|
+
/** Filled on every render, for commands that arrive outside a grid event. */
|
|
95
|
+
contextRef: RefObject<GridContext | null>;
|
|
96
|
+
}
|
|
97
|
+
export declare function useLatest<T>(value: T): RefObject<T>;
|
|
98
|
+
export declare function useControllableSelection(value: HexSelection | null | undefined, defaultValue: HexSelection | null | undefined, onChange: ((selection: HexSelection | null) => void) | undefined): readonly [HexSelection | null, (next: HexSelection | null) => void, RefObject<HexSelection | null>];
|
|
99
|
+
export declare function HexGrid({ source, selection: selectionProp, defaultSelection, onSelectionChange, columns: columnsProp, maxColumns, groupSize, baseAddress, rows, resizable, showAddresses, showColumnLabels, showText, showStatusBar, uppercase, fadeZeroBytes, controlCodes, encoding: encodingProp, defaultEncoding, onEncodingChange, showEncodingPicker, onCopy, onReadError, ref, className, "aria-label": ariaLabel, editing, }: HexViewProps & {
|
|
100
|
+
editing?: GridEditing;
|
|
101
|
+
}): import("react").JSX.Element;
|
|
102
|
+
//# sourceMappingURL=hex-grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-grid.d.ts","sourceRoot":"","sources":["../src/hex-grid.tsx"],"names":[],"mappings":"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"}
|