@docmentis/udoc-editor 0.8.6 → 0.8.8
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/arrange.d.ts +3 -0
- package/dist/arrange.d.ts.map +1 -1
- package/dist/arrange.js +11 -13
- package/dist/arrange.js.map +1 -1
- package/dist/components/CropOverlay.d.ts +27 -0
- package/dist/components/CropOverlay.d.ts.map +1 -0
- package/dist/components/CropOverlay.js +126 -0
- package/dist/components/CropOverlay.js.map +1 -0
- package/dist/components/ImageSizeModal.d.ts +23 -0
- package/dist/components/ImageSizeModal.d.ts.map +1 -0
- package/dist/components/ImageSizeModal.js +189 -0
- package/dist/components/ImageSizeModal.js.map +1 -0
- package/dist/components/NewSlideModal.d.ts +7 -2
- package/dist/components/NewSlideModal.d.ts.map +1 -1
- package/dist/components/NewSlideModal.js +10 -3
- package/dist/components/NewSlideModal.js.map +1 -1
- package/dist/components/PageControls.d.ts.map +1 -1
- package/dist/components/PageControls.js +1 -2
- package/dist/components/PageControls.js.map +1 -1
- package/dist/components/PageSettingsModal.d.ts.map +1 -1
- package/dist/components/PageSettingsModal.js +1 -2
- package/dist/components/PageSettingsModal.js.map +1 -1
- package/dist/crop-box.d.ts +33 -0
- package/dist/crop-box.d.ts.map +1 -0
- package/dist/crop-box.js +107 -0
- package/dist/crop-box.js.map +1 -0
- package/dist/crop.d.ts +28 -0
- package/dist/crop.d.ts.map +1 -0
- package/dist/crop.js +260 -0
- package/dist/crop.js.map +1 -0
- package/dist/edit-mode.d.ts.map +1 -1
- package/dist/edit-mode.js +46 -3
- package/dist/edit-mode.js.map +1 -1
- package/dist/formatting-marks.d.ts +4 -5
- package/dist/formatting-marks.d.ts.map +1 -1
- package/dist/formatting-marks.js +4 -5
- package/dist/formatting-marks.js.map +1 -1
- package/dist/i18n/ar.d.ts.map +1 -1
- package/dist/i18n/ar.js +14 -0
- package/dist/i18n/ar.js.map +1 -1
- package/dist/i18n/de.d.ts.map +1 -1
- package/dist/i18n/de.js +14 -0
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +14 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +14 -0
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/fr.d.ts.map +1 -1
- package/dist/i18n/fr.js +14 -0
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/ja.d.ts.map +1 -1
- package/dist/i18n/ja.js +14 -0
- package/dist/i18n/ja.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +14 -0
- package/dist/i18n/ko.js.map +1 -1
- package/dist/i18n/messages.d.ts +26 -0
- package/dist/i18n/messages.d.ts.map +1 -1
- package/dist/i18n/pt-BR.d.ts.map +1 -1
- package/dist/i18n/pt-BR.js +14 -0
- package/dist/i18n/pt-BR.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +14 -0
- package/dist/i18n/ru.js.map +1 -1
- package/dist/i18n/zh-CN.d.ts.map +1 -1
- package/dist/i18n/zh-CN.js +14 -0
- package/dist/i18n/zh-CN.js.map +1 -1
- package/dist/i18n/zh-TW.d.ts.map +1 -1
- package/dist/i18n/zh-TW.js +14 -0
- package/dist/i18n/zh-TW.js.map +1 -1
- package/dist/icons.d.ts +8 -6
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +8 -6
- package/dist/icons.js.map +1 -1
- package/dist/image.d.ts +39 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +203 -0
- package/dist/image.js.map +1 -0
- package/dist/insert.d.ts +5 -4
- package/dist/insert.d.ts.map +1 -1
- package/dist/insert.js +20 -9
- package/dist/insert.js.map +1 -1
- package/dist/markup.d.ts +23 -0
- package/dist/markup.d.ts.map +1 -0
- package/dist/markup.js +100 -0
- package/dist/markup.js.map +1 -0
- package/dist/menu-action.d.ts +6 -1
- package/dist/menu-action.d.ts.map +1 -1
- package/dist/menu-action.js +4 -1
- package/dist/menu-action.js.map +1 -1
- package/dist/new-slide.d.ts +5 -4
- package/dist/new-slide.d.ts.map +1 -1
- package/dist/new-slide.js +47 -17
- package/dist/new-slide.js.map +1 -1
- package/dist/page-controls.d.ts.map +1 -1
- package/dist/page-controls.js +31 -10
- package/dist/page-controls.js.map +1 -1
- package/dist/paint.d.ts +5 -1
- package/dist/paint.d.ts.map +1 -1
- package/dist/paint.js +27 -16
- package/dist/paint.js.map +1 -1
- package/dist/state.d.ts +24 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +3 -0
- package/dist/state.js.map +1 -1
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +147 -1
- package/dist/styles.js.map +1 -1
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.d.ts.map +1 -1
- package/dist/tabs.js +53 -15
- package/dist/tabs.js.map +1 -1
- package/dist/text-format.js +7 -7
- package/dist/text-format.js.map +1 -1
- package/dist/tools.d.ts +3 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +4 -2
- package/dist/tools.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/handlers.d.ts.map +1 -1
- package/dist/worker/handlers.js +16 -10
- package/dist/worker/handlers.js.map +1 -1
- package/dist/worker/worker-source.js +1 -1
- package/package.json +3 -3
package/dist/image.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { allowsEdit, ICON_ROTATE_LEFT, ICON_ROTATE_RIGHT } from "@docmentis/udoc-ui/internal";
|
|
2
|
+
import { ICON_FLIP_VERTICAL } from "./arrange.js";
|
|
3
|
+
import { createImageSizeModal } from "./components/ImageSizeModal.js";
|
|
4
|
+
import { ICON_CROP, ICON_FLIP, ICON_IMAGE_SIZE } from "./icons.js";
|
|
5
|
+
import { markupShape } from "./markup.js";
|
|
6
|
+
import { editStateOf } from "./state.js";
|
|
7
|
+
/** A large insert index that clamps to "on top" in the engine. */
|
|
8
|
+
const APPEND_INDEX = 0x7fff_ffff;
|
|
9
|
+
/** The resolution a page whose file gave none is taken at — the engine's. */
|
|
10
|
+
const DEFAULT_DPI = 96;
|
|
11
|
+
/** Points per inch. */
|
|
12
|
+
const POINTS_PER_INCH = 72;
|
|
13
|
+
/** Wrap a command on an image's pages in its `UDocCommand`. */
|
|
14
|
+
export function editPage(command) {
|
|
15
|
+
return { image: { editPage: { command } } };
|
|
16
|
+
}
|
|
17
|
+
/** The page's resolution along its own `[x, y]`, in dots per inch: its
|
|
18
|
+
* image's, swapped where the image lies a quarter turn — the engine's
|
|
19
|
+
* `ImagePageInfo::resolution`. */
|
|
20
|
+
function resolution(info) {
|
|
21
|
+
const [dpiX, dpiY] = info.dpi ?? [DEFAULT_DPI, DEFAULT_DPI];
|
|
22
|
+
return quarterTurned(info) ? [dpiY, dpiX] : [dpiX, dpiY];
|
|
23
|
+
}
|
|
24
|
+
/** Whether page `info`'s image lies a quarter turn either way. */
|
|
25
|
+
function quarterTurned(info) {
|
|
26
|
+
return info.imageRotation === "clockwise90" || info.imageRotation === "clockwise270";
|
|
27
|
+
}
|
|
28
|
+
/** The pixels page `info` holds at its resolution — the engine's
|
|
29
|
+
* `ImagePageInfo::pixel_size`: what a save writes, and what a resize names. */
|
|
30
|
+
export function pagePixels(info) {
|
|
31
|
+
const [dpiX, dpiY] = resolution(info);
|
|
32
|
+
return {
|
|
33
|
+
width: Math.max(1, Math.round((info.size.width * dpiX) / POINTS_PER_INCH)),
|
|
34
|
+
height: Math.max(1, Math.round((info.size.height * dpiY) / POINTS_PER_INCH)),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** The pixels of its image page `info` shows, as loaded — before any resize:
|
|
38
|
+
* the page's size over the points its image's pixels cover on it. */
|
|
39
|
+
function imagePixels(info) {
|
|
40
|
+
const [across, down] = quarterTurned(info) ? [info.height, info.width] : [info.width, info.height];
|
|
41
|
+
const rect = info.imageRect;
|
|
42
|
+
return {
|
|
43
|
+
width: Math.max(1, Math.round((info.size.width * across) / (rect.x1 - rect.x0))),
|
|
44
|
+
height: Math.max(1, Math.round((info.size.height * down) / (rect.y1 - rect.y0))),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** Whether page `info` shows less than its whole image — a crop Reset can
|
|
48
|
+
* take away. */
|
|
49
|
+
export function croppedPage(info) {
|
|
50
|
+
const rect = info.imageRect;
|
|
51
|
+
const near = (a, b) => Math.abs(a - b) < 1e-6;
|
|
52
|
+
return !(near(rect.x0, 0) && near(rect.y0, 0) && near(rect.x1, info.size.width) && near(rect.y1, info.size.height));
|
|
53
|
+
}
|
|
54
|
+
/** The current page of the open image's manifest entry — what an edit of it
|
|
55
|
+
* names and measures — or null with none. */
|
|
56
|
+
function currentPage(host) {
|
|
57
|
+
return host.client.image.pageInfoByIndex(host.store.getState().pageIndex);
|
|
58
|
+
}
|
|
59
|
+
/** Mount the Image Size dialog into `host` — once, re-seeded with the current
|
|
60
|
+
* page's sizes each open: its pixels now, and its image's as loaded. */
|
|
61
|
+
export function mountImageSize(host, i18n) {
|
|
62
|
+
const modal = createImageSizeModal(i18n);
|
|
63
|
+
modal.mount(host.root);
|
|
64
|
+
return {
|
|
65
|
+
async open() {
|
|
66
|
+
const info = await currentPage(host);
|
|
67
|
+
if (!info)
|
|
68
|
+
return;
|
|
69
|
+
const shown = pagePixels(info);
|
|
70
|
+
const original = imagePixels(info);
|
|
71
|
+
modal.open({
|
|
72
|
+
width: shown.width,
|
|
73
|
+
height: shown.height,
|
|
74
|
+
originalWidth: original.width,
|
|
75
|
+
originalHeight: original.height,
|
|
76
|
+
onResize: (width, height) => void host.commit(() => host.client.execute(editPage({ resizePage: { id: info.id, width, height } }))),
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
destroy: () => modal.destroy(),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Turn the pages picked in the thumbnails a quarter turn — clockwise, or
|
|
83
|
+
* counter-clockwise — or the current page with none picked. */
|
|
84
|
+
async function rotatePages(host, clockwise) {
|
|
85
|
+
if (allowsEdit(host.store.getState().selectionCaps, "rotatePages")) {
|
|
86
|
+
await host.commit(() => host.client.executeOnSelection({ kind: "page", edit: { kind: "rotatePages", clockwise } }));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const info = await currentPage(host);
|
|
90
|
+
if (info)
|
|
91
|
+
await host.commit(() => host.client.execute(editPage({ rotatePages: { ids: [info.id], clockwise } })));
|
|
92
|
+
}
|
|
93
|
+
/** Flip the pages picked in the thumbnails — left to right, or top to bottom
|
|
94
|
+
* — or the current page with none picked. */
|
|
95
|
+
async function flipPages(host, horizontal) {
|
|
96
|
+
if (allowsEdit(host.store.getState().selectionCaps, "flipPages")) {
|
|
97
|
+
await host.commit(() => host.client.executeOnSelection({ kind: "page", edit: { kind: "flipPages", horizontal } }));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const info = await currentPage(host);
|
|
101
|
+
if (info)
|
|
102
|
+
await host.commit(() => host.client.execute(editPage({ flipPages: { ids: [info.id], horizontal } })));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Whether an image's page edits show on its Home tab in `c`: with no shape
|
|
106
|
+
* drawn over a page selected — nothing, or pages in the thumbnails — outside
|
|
107
|
+
* crop mode. Home is contextual, so they yield to the text and shape controls
|
|
108
|
+
* the moment a shape is.
|
|
109
|
+
*/
|
|
110
|
+
function whenPageEdits(c) {
|
|
111
|
+
return (c.ready &&
|
|
112
|
+
c.docType === "image" &&
|
|
113
|
+
editStateOf(c).cropping === null &&
|
|
114
|
+
(c.selection.count === 0 || allowsEdit(c.selection, "rotatePages")));
|
|
115
|
+
}
|
|
116
|
+
/** The image Home tab's page commands, over `host` once edit mode is mounted. */
|
|
117
|
+
export function imageCommands(host, actions) {
|
|
118
|
+
const rotate = (clockwise) => {
|
|
119
|
+
const mounted = host();
|
|
120
|
+
if (mounted)
|
|
121
|
+
void rotatePages(mounted, clockwise);
|
|
122
|
+
};
|
|
123
|
+
const flip = (horizontal) => {
|
|
124
|
+
const mounted = host();
|
|
125
|
+
if (mounted)
|
|
126
|
+
void flipPages(mounted, horizontal);
|
|
127
|
+
};
|
|
128
|
+
return {
|
|
129
|
+
rotatePageLeft: {
|
|
130
|
+
id: "rotatePageLeft",
|
|
131
|
+
label: "thumbnails.rotateLeft",
|
|
132
|
+
icon: ICON_ROTATE_LEFT,
|
|
133
|
+
group: "image",
|
|
134
|
+
run: { kind: "action", press: () => rotate(false) },
|
|
135
|
+
enabledWhen: whenPageEdits,
|
|
136
|
+
},
|
|
137
|
+
rotatePageRight: {
|
|
138
|
+
id: "rotatePageRight",
|
|
139
|
+
label: "thumbnails.rotateRight",
|
|
140
|
+
icon: ICON_ROTATE_RIGHT,
|
|
141
|
+
group: "image",
|
|
142
|
+
run: { kind: "action", press: () => rotate(true) },
|
|
143
|
+
enabledWhen: whenPageEdits,
|
|
144
|
+
},
|
|
145
|
+
flipPageHorizontal: {
|
|
146
|
+
id: "flipPageHorizontal",
|
|
147
|
+
label: "arrange.flipHorizontal",
|
|
148
|
+
icon: ICON_FLIP,
|
|
149
|
+
group: "image",
|
|
150
|
+
run: { kind: "action", press: () => flip(true) },
|
|
151
|
+
enabledWhen: whenPageEdits,
|
|
152
|
+
},
|
|
153
|
+
flipPageVertical: {
|
|
154
|
+
id: "flipPageVertical",
|
|
155
|
+
label: "arrange.flipVertical",
|
|
156
|
+
icon: ICON_FLIP_VERTICAL,
|
|
157
|
+
group: "image",
|
|
158
|
+
run: { kind: "action", press: () => flip(false) },
|
|
159
|
+
enabledWhen: whenPageEdits,
|
|
160
|
+
},
|
|
161
|
+
cropPage: {
|
|
162
|
+
id: "cropPage",
|
|
163
|
+
label: "command.cropPage",
|
|
164
|
+
icon: ICON_CROP,
|
|
165
|
+
group: "image",
|
|
166
|
+
run: { kind: "action", press: actions.crop },
|
|
167
|
+
enabledWhen: whenPageEdits,
|
|
168
|
+
},
|
|
169
|
+
resizePage: {
|
|
170
|
+
id: "resizePage",
|
|
171
|
+
label: "command.resizePage",
|
|
172
|
+
icon: ICON_IMAGE_SIZE,
|
|
173
|
+
group: "image",
|
|
174
|
+
run: { kind: "action", press: actions.resize },
|
|
175
|
+
enabledWhen: whenPageEdits,
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Draw `shape` over page `page` from `p0` to `p1` — the page's own points —
|
|
181
|
+
* and select it. One committing edit. A no-op on a page that takes no markup,
|
|
182
|
+
* or with no image open.
|
|
183
|
+
*/
|
|
184
|
+
export async function placeMarkup(host, shape, page, p0, p1) {
|
|
185
|
+
const [info, id, story] = await Promise.all([
|
|
186
|
+
host.client.image.pageInfoByIndex(page),
|
|
187
|
+
host.client.mintId(),
|
|
188
|
+
host.client.mintId(),
|
|
189
|
+
]);
|
|
190
|
+
if (!info || !id || !story)
|
|
191
|
+
return;
|
|
192
|
+
const node = markupShape(id, story, shape, p0, p1, info.size);
|
|
193
|
+
await host.commit(() => host.client.execute({
|
|
194
|
+
image: {
|
|
195
|
+
editShape: {
|
|
196
|
+
page: info.id,
|
|
197
|
+
command: { insertShapes: { parent: null, index: APPEND_INDEX, nodes: [node] } },
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
}));
|
|
201
|
+
host.client.setSelection({ image: { shapes: { page: info.id, selection: { shapes: [id] } } } });
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"}
|
package/dist/insert.d.ts
CHANGED
|
@@ -4,9 +4,9 @@ import type { MessageKey } from "./i18n/index.js";
|
|
|
4
4
|
/** The shape the Insert tab's place `tool` drags out. */
|
|
5
5
|
export declare function placedShape(tool: string): ShapeKind | null;
|
|
6
6
|
/** Place the Insert tab's `tool` on page `page`, spanning the page-local points
|
|
7
|
-
* `p0 → p1
|
|
8
|
-
* its id and selects it
|
|
9
|
-
*
|
|
7
|
+
* `p0 → p1`, on top of the page: on a PDF, a shape as a page object — the
|
|
8
|
+
* engine mints its id and selects it — and on an image, a shape drawn over
|
|
9
|
+
* it. A no-op for a page with no id (no document, or neither). */
|
|
10
10
|
export declare function place(host: EditHost, tool: string, page: number, p0: ShapePoint, p1: ShapePoint): Promise<void>;
|
|
11
11
|
/** Insert the image file `bytes` as a picture on the current slide, centred
|
|
12
12
|
* and scaled down to fit, then selected — a committing edit, so the picture's
|
|
@@ -16,6 +16,7 @@ export declare function insertImage(host: EditHost, bytes: Uint8Array, contentTy
|
|
|
16
16
|
* file's size and format from its bytes; the browser's MIME type rides along,
|
|
17
17
|
* empty when it has none. */
|
|
18
18
|
export declare function pickImage(host: EditHost): void;
|
|
19
|
-
/** The Insert tab's commands, Image asking for its file with `pickImage
|
|
19
|
+
/** The Insert tab's commands, Image asking for its file with `pickImage` —
|
|
20
|
+
* live on a deck's slides, which it inserts onto: not on its notes pages. */
|
|
20
21
|
export declare function insertCommands(pickImage: () => void): Readonly<Record<string, CommandDef<MessageKey>>>;
|
|
21
22
|
//# sourceMappingURL=insert.d.ts.map
|
package/dist/insert.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../src/insert.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../src/insert.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAgB,SAAS,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACnG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAuElD,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE1D;AAED;;;mEAGmE;AACnE,wBAAsB,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrH;AAED;;4BAE4B;AAC5B,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjG;AAED;;8BAE8B;AAC9B,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAa9C;AAED;8EAC8E;AAC9E,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAyBtG"}
|
package/dist/insert.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
// The Insert tab's commands: Shapes on a PDF
|
|
2
|
-
// canvas carries out, and Image on a slide deck, asked
|
|
1
|
+
// The Insert tab's commands: Shapes on a PDF or over an image's page, placed by
|
|
2
|
+
// a pointer gesture the canvas carries out, and Image on a slide deck, asked
|
|
3
|
+
// for and inserted at once.
|
|
3
4
|
import { ICON_SUBTOOL_ARROW, ICON_SUBTOOL_ELLIPSE, ICON_SUBTOOL_LINE, ICON_SUBTOOL_RECTANGLE, SHAPE_STROKE, SHAPE_STROKE_WIDTH, segmentsFor, } from "@docmentis/udoc-ui/internal";
|
|
4
5
|
import { EditCommand } from "./edit-command.js";
|
|
5
6
|
import { ICON_IMAGE } from "./icons.js";
|
|
7
|
+
import { placeMarkup } from "./image.js";
|
|
8
|
+
import { editStateOf } from "./state.js";
|
|
6
9
|
/** A placed shape's fill — translucent blue (filled shapes only). */
|
|
7
10
|
const FILL = { components: [0.26, 0.55, 0.96], colorSpace: "srgb" };
|
|
8
11
|
/** A placed shape's fill opacity. */
|
|
@@ -68,13 +71,16 @@ export function placedShape(tool) {
|
|
|
68
71
|
return SHAPES.has(tool) ? tool : null;
|
|
69
72
|
}
|
|
70
73
|
/** Place the Insert tab's `tool` on page `page`, spanning the page-local points
|
|
71
|
-
* `p0 → p1
|
|
72
|
-
* its id and selects it
|
|
73
|
-
*
|
|
74
|
+
* `p0 → p1`, on top of the page: on a PDF, a shape as a page object — the
|
|
75
|
+
* engine mints its id and selects it — and on an image, a shape drawn over
|
|
76
|
+
* it. A no-op for a page with no id (no document, or neither). */
|
|
74
77
|
export async function place(host, tool, page, p0, p1) {
|
|
75
78
|
const shape = placedShape(tool);
|
|
76
|
-
|
|
79
|
+
const state = host.store.getState();
|
|
80
|
+
if (!shape || state.status !== "ready")
|
|
77
81
|
return;
|
|
82
|
+
if (state.docType === "image")
|
|
83
|
+
return placeMarkup(host, shape, page, p0, p1);
|
|
78
84
|
const pageId = await host.client.portable.pageIdByIndex(page);
|
|
79
85
|
if (pageId === undefined)
|
|
80
86
|
return;
|
|
@@ -104,7 +110,8 @@ export function pickImage(host) {
|
|
|
104
110
|
});
|
|
105
111
|
input.click();
|
|
106
112
|
}
|
|
107
|
-
/** The Insert tab's commands, Image asking for its file with `pickImage
|
|
113
|
+
/** The Insert tab's commands, Image asking for its file with `pickImage` —
|
|
114
|
+
* live on a deck's slides, which it inserts onto: not on its notes pages. */
|
|
108
115
|
export function insertCommands(pickImage) {
|
|
109
116
|
return {
|
|
110
117
|
insertImage: {
|
|
@@ -114,7 +121,7 @@ export function insertCommands(pickImage) {
|
|
|
114
121
|
group: "insert",
|
|
115
122
|
labeled: true,
|
|
116
123
|
run: { kind: "action", press: pickImage },
|
|
117
|
-
enabledWhen: (c) => c.ready && c.docType === "presentation",
|
|
124
|
+
enabledWhen: (c) => c.ready && c.docType === "presentation" && c.presentationView === "normal",
|
|
118
125
|
},
|
|
119
126
|
insertShape: {
|
|
120
127
|
id: "insertShape",
|
|
@@ -122,7 +129,11 @@ export function insertCommands(pickImage) {
|
|
|
122
129
|
icon: ICON_SUBTOOL_RECTANGLE,
|
|
123
130
|
group: "insert",
|
|
124
131
|
run: { kind: "armPicker", options: SHAPE_OPTIONS },
|
|
125
|
-
|
|
132
|
+
// An image's current page takes them unless it's animated or a
|
|
133
|
+
// vector, and not while it's cropped.
|
|
134
|
+
enabledWhen: (c) => c.ready &&
|
|
135
|
+
(c.docType === "portable" ||
|
|
136
|
+
(c.docType === "image" && editStateOf(c).pageTakesMarkup && editStateOf(c).cropping === null)),
|
|
126
137
|
},
|
|
127
138
|
};
|
|
128
139
|
}
|
package/dist/insert.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insert.js","sourceRoot":"","sources":["../src/insert.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"insert.js","sourceRoot":"","sources":["../src/insert.ts"],"names":[],"mappings":"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"}
|
package/dist/markup.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ShapeNode } from "@docmentis/udoc-wasm";
|
|
2
|
+
import type { ShapeKind, ShapePoint } from "@docmentis/udoc-ui/internal";
|
|
3
|
+
/** The weight in points a shape is outlined at over a page `width` ×
|
|
4
|
+
* `height` points: a point per {@link POINTS_PER_LINE_POINT} of its shorter
|
|
5
|
+
* side, and at least {@link MIN_LINE_WEIGHT}. */
|
|
6
|
+
export declare function markupLineWeight(width: number, height: number): number;
|
|
7
|
+
/** The size in points a label typed into a box is set at over a page `width`
|
|
8
|
+
* × `height` points: a point per {@link POINTS_PER_TEXT_POINT} of its shorter
|
|
9
|
+
* side, and at least {@link MIN_TEXT_SIZE}. */
|
|
10
|
+
export declare function markupTextSize(width: number, height: number): number;
|
|
11
|
+
/**
|
|
12
|
+
* The drawing shape `shape` spanning `p0 → p1` (the page's points) over a
|
|
13
|
+
* page `page` points in size, its id `id` and a box's text story `story` —
|
|
14
|
+
* outlined in {@link MARKUP_COLOR} and unfilled, so the image shows through;
|
|
15
|
+
* an arrow's head at `p1`; a box with an empty label to type into. A line runs
|
|
16
|
+
* from `p0` to `p1` by flipping the box its preset runs corner to corner
|
|
17
|
+
* across; a box is never flipped, as a flip turns its label upside down.
|
|
18
|
+
*/
|
|
19
|
+
export declare function markupShape(id: string, story: string, shape: ShapeKind, p0: ShapePoint, p1: ShapePoint, page: {
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
}): ShapeNode;
|
|
23
|
+
//# sourceMappingURL=markup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup.d.ts","sourceRoot":"","sources":["../src/markup.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAyB,SAAS,EAAqC,MAAM,sBAAsB,CAAC;AAChH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAmBzE;;kDAEkD;AAClD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;gDAEgD;AAChD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpE;AAgCD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACvB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC,SAAS,CAsCX"}
|
package/dist/markup.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/** The color shapes are drawn over an image in — a markup red. An image has
|
|
2
|
+
* no theme, so it is an sRGB color, never a scheme one. */
|
|
3
|
+
const MARKUP_COLOR = { base: { sRgb: { r: 0xe5, g: 0x39, b: 0x35 } }, transforms: [] };
|
|
4
|
+
/** The page size, in points, one point of line weight is drawn per — so a
|
|
5
|
+
* shape's outline reads at the page's size, a photo's as a screenshot's. */
|
|
6
|
+
const POINTS_PER_LINE_POINT = 250;
|
|
7
|
+
/** The thinnest line a shape is drawn with, in points. */
|
|
8
|
+
const MIN_LINE_WEIGHT = 2;
|
|
9
|
+
/** The page size, in points, one point of a label's size is set per. */
|
|
10
|
+
const POINTS_PER_TEXT_POINT = 30;
|
|
11
|
+
/** The smallest a label is set, in points. */
|
|
12
|
+
const MIN_TEXT_SIZE = 12;
|
|
13
|
+
/** The weight in points a shape is outlined at over a page `width` ×
|
|
14
|
+
* `height` points: a point per {@link POINTS_PER_LINE_POINT} of its shorter
|
|
15
|
+
* side, and at least {@link MIN_LINE_WEIGHT}. */
|
|
16
|
+
export function markupLineWeight(width, height) {
|
|
17
|
+
return Math.max(MIN_LINE_WEIGHT, Math.round(Math.min(width, height) / POINTS_PER_LINE_POINT));
|
|
18
|
+
}
|
|
19
|
+
/** The size in points a label typed into a box is set at over a page `width`
|
|
20
|
+
* × `height` points: a point per {@link POINTS_PER_TEXT_POINT} of its shorter
|
|
21
|
+
* side, and at least {@link MIN_TEXT_SIZE}. */
|
|
22
|
+
export function markupTextSize(width, height) {
|
|
23
|
+
return Math.max(MIN_TEXT_SIZE, Math.round(Math.min(width, height) / POINTS_PER_TEXT_POINT));
|
|
24
|
+
}
|
|
25
|
+
/** Each shape the Insert tab draws: its preset outline, its name, and whether
|
|
26
|
+
* it is a box, which takes a label. */
|
|
27
|
+
const MARKUP_SHAPES = {
|
|
28
|
+
rectangle: { preset: "rect", name: "Rectangle", box: true },
|
|
29
|
+
ellipse: { preset: "ellipse", name: "Oval", box: true },
|
|
30
|
+
line: { preset: "line", name: "Line", box: false },
|
|
31
|
+
arrow: { preset: "line", name: "Arrow", box: false },
|
|
32
|
+
};
|
|
33
|
+
/** A box's text body, empty: one paragraph centred in it, which the text typed
|
|
34
|
+
* into it takes the markup color and `size` points from — what a press in the
|
|
35
|
+
* box lands a caret in, as in a slide's shape. Its story is `story`. */
|
|
36
|
+
function labelBody(story, size) {
|
|
37
|
+
return {
|
|
38
|
+
properties: { anchor: "center" },
|
|
39
|
+
story: {
|
|
40
|
+
id: story,
|
|
41
|
+
blocks: [
|
|
42
|
+
{
|
|
43
|
+
paragraph: {
|
|
44
|
+
properties: [{ align: "center" }],
|
|
45
|
+
end: { mark: [{ size }, { fill: { solid: MARKUP_COLOR } }] },
|
|
46
|
+
spans: [],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The drawing shape `shape` spanning `p0 → p1` (the page's points) over a
|
|
55
|
+
* page `page` points in size, its id `id` and a box's text story `story` —
|
|
56
|
+
* outlined in {@link MARKUP_COLOR} and unfilled, so the image shows through;
|
|
57
|
+
* an arrow's head at `p1`; a box with an empty label to type into. A line runs
|
|
58
|
+
* from `p0` to `p1` by flipping the box its preset runs corner to corner
|
|
59
|
+
* across; a box is never flipped, as a flip turns its label upside down.
|
|
60
|
+
*/
|
|
61
|
+
export function markupShape(id, story, shape, p0, p1, page) {
|
|
62
|
+
const { preset, name, box } = MARKUP_SHAPES[shape];
|
|
63
|
+
const line = {
|
|
64
|
+
width: markupLineWeight(page.width, page.height),
|
|
65
|
+
cap: "round",
|
|
66
|
+
compound: null,
|
|
67
|
+
align: null,
|
|
68
|
+
fill: { solid: MARKUP_COLOR },
|
|
69
|
+
dash: null,
|
|
70
|
+
join: "round",
|
|
71
|
+
headEnd: null,
|
|
72
|
+
tailEnd: shape === "arrow" ? { kind: "triangle", width: "medium", length: "medium" } : null,
|
|
73
|
+
};
|
|
74
|
+
return {
|
|
75
|
+
shape: {
|
|
76
|
+
id,
|
|
77
|
+
nonVisual: { name, description: null, title: null, hidden: false, placeholder: null },
|
|
78
|
+
properties: {
|
|
79
|
+
transform: {
|
|
80
|
+
offset: { x: Math.min(p0.x, p1.x), y: Math.min(p0.y, p1.y) },
|
|
81
|
+
extents: { width: Math.abs(p1.x - p0.x), height: Math.abs(p1.y - p0.y) },
|
|
82
|
+
rotation: 0,
|
|
83
|
+
flipH: !box && p1.x < p0.x,
|
|
84
|
+
flipV: !box && p1.y < p0.y,
|
|
85
|
+
},
|
|
86
|
+
geometry: { preset: { preset, adjustValues: [] } },
|
|
87
|
+
fill: "none",
|
|
88
|
+
line,
|
|
89
|
+
effects: null,
|
|
90
|
+
scene3d: null,
|
|
91
|
+
shape3d: null,
|
|
92
|
+
},
|
|
93
|
+
style: null,
|
|
94
|
+
textBody: box ? labelBody(story, markupTextSize(page.width, page.height)) : null,
|
|
95
|
+
textTransform: null,
|
|
96
|
+
diagramPoint: null,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=markup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup.js","sourceRoot":"","sources":["../src/markup.ts"],"names":[],"mappings":"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"}
|
package/dist/menu-action.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { TableSelectionEdit } from "@docmentis/udoc-wasm";
|
|
2
2
|
import type { AlignEdge, EditAxis, MenuAction, TextParagraphAlign, ZOrder } from "@docmentis/udoc-ui/internal";
|
|
3
3
|
import type { ClipboardOp, TableSelectScope } from "./context-menu.js";
|
|
4
|
+
import type { CropAspect } from "./crop-box.js";
|
|
4
5
|
import type { ParagraphSpaceEdge } from "./text-format.js";
|
|
5
6
|
import type { EditTools } from "./tools.js";
|
|
6
7
|
/**
|
|
@@ -10,7 +11,8 @@ import type { EditTools } from "./tools.js";
|
|
|
10
11
|
* / `flip` / `rotate` the Align and Rotate dropdowns; `alignToPage` the Align
|
|
11
12
|
* dropdown's reference toggle (a UI flag, not a document edit). `clipboard` /
|
|
12
13
|
* `delete` are the context menu's acts on the selection, and `selectTable` /
|
|
13
|
-
* `tableEdit` its rows over a table.
|
|
14
|
+
* `tableEdit` its rows over a table. `cropAspect` is crop mode's Aspect Ratio
|
|
15
|
+
* dropdown.
|
|
14
16
|
*
|
|
15
17
|
* The first five are the paragraph menus' rows. `indent` carries a *step*, not
|
|
16
18
|
* a measure: an indent is relative per paragraph — a selection spanning two
|
|
@@ -65,6 +67,9 @@ export type EditMenuAction = {
|
|
|
65
67
|
} | {
|
|
66
68
|
kind: "tableEdit";
|
|
67
69
|
edit: TableSelectionEdit;
|
|
70
|
+
} | {
|
|
71
|
+
kind: "cropAspect";
|
|
72
|
+
aspect: CropAspect;
|
|
68
73
|
};
|
|
69
74
|
/** `action` as a shell {@link MenuAction}: carried as the extension's own. */
|
|
70
75
|
export declare function editAction(action: EditMenuAction): MenuAction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-action.d.ts","sourceRoot":"","sources":["../src/menu-action.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC/G,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"menu-action.d.ts","sourceRoot":"","sources":["../src/menu-action.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC/G,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,cAAc,GACpB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAEjD,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAE7D;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAoFhF"}
|
package/dist/menu-action.js
CHANGED
|
@@ -5,7 +5,7 @@ export function editAction(action) {
|
|
|
5
5
|
}
|
|
6
6
|
/** Run one of edit mode's menu rows' intents on the current selection. */
|
|
7
7
|
export function runEditMenuAction(tools, action) {
|
|
8
|
-
const { arrange, text, clipboard, host } = tools;
|
|
8
|
+
const { arrange, text, clipboard, crop, host } = tools;
|
|
9
9
|
switch (action.kind) {
|
|
10
10
|
case "reorder":
|
|
11
11
|
void arrange.reorderSelection(action.order);
|
|
@@ -84,6 +84,9 @@ export function runEditMenuAction(tools, action) {
|
|
|
84
84
|
void host.commit(() => host.client.executeOnSelection(edit));
|
|
85
85
|
break;
|
|
86
86
|
}
|
|
87
|
+
case "cropAspect":
|
|
88
|
+
crop.setAspect(action.aspect);
|
|
89
|
+
break;
|
|
87
90
|
}
|
|
88
91
|
}
|
|
89
92
|
//# sourceMappingURL=menu-action.js.map
|
package/dist/menu-action.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-action.js","sourceRoot":"","sources":["../src/menu-action.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"menu-action.js","sourceRoot":"","sources":["../src/menu-action.ts"],"names":[],"mappings":"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"}
|
package/dist/new-slide.d.ts
CHANGED
|
@@ -12,10 +12,11 @@ export interface NewSlide {
|
|
|
12
12
|
export declare function mountNewSlide(host: EditHost, i18n: I18n): NewSlide;
|
|
13
13
|
/**
|
|
14
14
|
* The New Slide command, opening the picker with `open` — a document-level
|
|
15
|
-
* action shown
|
|
16
|
-
* property controls go, so it shows on the empty canvas and
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* action shown with nothing selected, or slides or sections: it sits where the
|
|
16
|
+
* selection's property controls go, so it shows on the empty canvas and with
|
|
17
|
+
* slides or sections picked in the thumbnails, and yields to those controls the
|
|
18
|
+
* moment a shape or text is selected. Labeled, as its page-add glyph reads
|
|
19
|
+
* "slide" only once you know.
|
|
19
20
|
*/
|
|
20
21
|
export declare function newSlideCommand(open: () => void): CommandDef<MessageKey>;
|
|
21
22
|
//# sourceMappingURL=new-slide.d.ts.map
|
package/dist/new-slide.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new-slide.d.ts","sourceRoot":"","sources":["../src/new-slide.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"new-slide.d.ts","sourceRoot":"","sources":["../src/new-slide.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA0BxD,+CAA+C;AAC/C,MAAM,WAAW,QAAQ;IACrB,6DAA6D;IAC7D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,IAAI,CAAC;CACnB;AAED;+BAC+B;AAC/B,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,CAgDlE;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAYxE"}
|