@shadow-garden/bapbong-editor 0.1.0 → 0.2.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/dist/index.cjs +949 -201
- package/dist/index.js +959 -203
- package/dist/lib/bapbong-editor.d.ts +27 -3
- package/dist/lib/bapbong-editor.d.ts.map +1 -1
- package/dist/lib/paste-images.d.ts +13 -0
- package/dist/lib/paste-images.d.ts.map +1 -0
- package/package.json +8 -7
|
@@ -16,12 +16,12 @@ export interface SectionBoundary {
|
|
|
16
16
|
width: number;
|
|
17
17
|
} | null;
|
|
18
18
|
}
|
|
19
|
-
export type { EditorChange, EditorPlugin, PluginContext } from '@shadow-garden/bapbong-contracts';
|
|
19
|
+
export type { EditorChange, EditorPlugin, PluginContext, } from '@shadow-garden/bapbong-contracts';
|
|
20
20
|
export { RenderCore } from '@shadow-garden/bapbong-view';
|
|
21
21
|
import { Collection } from '@shadow-garden/bapbong-contracts';
|
|
22
22
|
import type { FindPlugin } from './find-plugin';
|
|
23
23
|
import type { TableSelectionPlugin } from './table-selection-plugin';
|
|
24
|
-
export type { TableSelectionPlugin, CellBlock, SelectedCell } from './table-selection-plugin';
|
|
24
|
+
export type { TableSelectionPlugin, CellBlock, SelectedCell, } from './table-selection-plugin';
|
|
25
25
|
export type { FindPlugin, FindState } from './find-plugin';
|
|
26
26
|
export interface BapbongEditorOptions {
|
|
27
27
|
/** The scroll viewport the page stack lives in (used for virtualization and
|
|
@@ -36,6 +36,15 @@ export interface BapbongEditorOptions {
|
|
|
36
36
|
measureText?: MeasureText;
|
|
37
37
|
/** Vertical-metrics provider paired with {@link measureText}. */
|
|
38
38
|
measureMetrics?: MeasureMetrics;
|
|
39
|
+
/** Fallback clipboard reader for hosts whose webview denies the async
|
|
40
|
+
* Clipboard API (e.g. the desktop shell reads the OS clipboard natively).
|
|
41
|
+
* Return every flavor present; null when empty / unavailable. */
|
|
42
|
+
readClipboardFallback?: () => Promise<{
|
|
43
|
+
html?: string;
|
|
44
|
+
text?: string;
|
|
45
|
+
image?: Uint8Array;
|
|
46
|
+
imageMime?: string;
|
|
47
|
+
} | null>;
|
|
39
48
|
}
|
|
40
49
|
/**
|
|
41
50
|
* The framework-agnostic core of bapbong: it owns the render → edit loop
|
|
@@ -77,6 +86,7 @@ export declare class BapbongEditor {
|
|
|
77
86
|
* Built from the shared command layer; the same ops run on a backend.
|
|
78
87
|
* (Plugin-contributed commands are an additive follow-up.) */
|
|
79
88
|
readonly commands: Collection<EditorCommand>;
|
|
89
|
+
private readonly readClipboardFallback?;
|
|
80
90
|
constructor(stack: HTMLElement, opts?: BapbongEditorOptions);
|
|
81
91
|
/** The controlled surface handed to each plugin (live state + geometry). */
|
|
82
92
|
private makePluginContext;
|
|
@@ -141,8 +151,22 @@ export declare class BapbongEditor {
|
|
|
141
151
|
copy(): boolean;
|
|
142
152
|
/** Cut the selection to the clipboard. */
|
|
143
153
|
cut(): boolean;
|
|
144
|
-
/** Paste clipboard content
|
|
154
|
+
/** Paste clipboard content — HTML parsed by the schema, image blobs as
|
|
155
|
+
* embedded images, else plain text.
|
|
156
|
+
*
|
|
157
|
+
* Menu-driven paste can't ride a native ClipboardEvent, so it climbs a
|
|
158
|
+
* ladder of acquisition strategies until one yields content:
|
|
159
|
+
* 1. the host's native clipboard reader (`readClipboardFallback`) when
|
|
160
|
+
* provided — on WKWebView every programmatic clipboard READ (both
|
|
161
|
+
* `navigator.clipboard.*` and execCommand) pops a "Paste" permission
|
|
162
|
+
* callout and pends until the user taps it, so the desktop shell
|
|
163
|
+
* must never touch the DOM clipboard from a menu click;
|
|
164
|
+
* 2. async Clipboard API (`navigator.clipboard.read`) — browsers, where
|
|
165
|
+
* a user-gesture read is granted silently;
|
|
166
|
+
* 3. `document.execCommand('paste')` — legacy last resort. */
|
|
145
167
|
paste(): Promise<void>;
|
|
168
|
+
private pasteViaClipboardApi;
|
|
169
|
+
private pasteViaHostClipboard;
|
|
146
170
|
/** Paste clipboard text as plain text (no formatting). */
|
|
147
171
|
pasteText(): Promise<void>;
|
|
148
172
|
destroy(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bapbong-editor.d.ts","sourceRoot":"","sources":["../../src/lib/bapbong-editor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"bapbong-editor.d.ts","sourceRoot":"","sources":["../../src/lib/bapbong-editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { EditorView } from 'prosemirror-view';
|
|
2
|
+
/** Image blobs in a DataTransfer (clipboard or drop), in item order. */
|
|
3
|
+
export declare function imageFilesIn(dt: DataTransfer | null): File[];
|
|
4
|
+
/** Insert image blobs at the selection as inline image nodes (one
|
|
5
|
+
* transaction). Resolves true if anything was inserted. */
|
|
6
|
+
export declare function insertImageBlobs(view: EditorView, blobs: Blob[]): Promise<boolean>;
|
|
7
|
+
/** editorProps.handlePaste: claim the event only when the clipboard's best
|
|
8
|
+
* payload is an image. Rich HTML (real text content) wins over the blob —
|
|
9
|
+
* ProseMirror's default paste parses it through the schema; but HTML that is
|
|
10
|
+
* merely an <img> wrapper (how browsers copy a picture) would lose the image
|
|
11
|
+
* there (remote srcs are rejected by the schema), so the blob is used. */
|
|
12
|
+
export declare function imagePasteHandler(view: EditorView, event: ClipboardEvent): boolean;
|
|
13
|
+
//# sourceMappingURL=paste-images.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paste-images.d.ts","sourceRoot":"","sources":["../../src/lib/paste-images.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAgBnD,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,EAAE,CAS5D;AAwBD;4DAC4D;AAC5D,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAED;;;;2EAI2E;AAC3E,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,cAAc,GACpB,OAAO,CAaT"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shadow-garden/bapbong-editor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "bapbong — canvas-rendered DOCX editor for the browser (work in progress)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -55,11 +55,12 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"prosemirror-model": "^1.25.7",
|
|
58
|
-
"
|
|
59
|
-
"@shadow-garden/bapbong-contracts": "^0.1.
|
|
60
|
-
"@shadow-garden/bapbong-
|
|
61
|
-
"@shadow-garden/bapbong-
|
|
62
|
-
"@shadow-garden/bapbong-
|
|
63
|
-
"@shadow-garden/bapbong-view": "^0.
|
|
58
|
+
"prosemirror-view": "^1.41.3",
|
|
59
|
+
"@shadow-garden/bapbong-contracts": "^0.1.1",
|
|
60
|
+
"@shadow-garden/bapbong-input-bridge": "^0.1.1",
|
|
61
|
+
"@shadow-garden/bapbong-commands": "^0.2.0",
|
|
62
|
+
"@shadow-garden/bapbong-selection": "^0.1.1",
|
|
63
|
+
"@shadow-garden/bapbong-view": "^0.2.0",
|
|
64
|
+
"@shadow-garden/bapbong-model": "^0.2.0"
|
|
64
65
|
}
|
|
65
66
|
}
|