@docmentis/udoc-editor 0.8.7 → 0.8.9
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 +10 -12
- 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/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 +256 -0
- package/dist/crop.js.map +1 -0
- package/dist/edit-client.d.ts +0 -6
- package/dist/edit-client.d.ts.map +1 -1
- package/dist/edit-client.js +0 -8
- package/dist/edit-client.js.map +1 -1
- package/dist/edit-mode.d.ts +0 -2
- package/dist/edit-mode.d.ts.map +1 -1
- package/dist/edit-mode.js +48 -14
- package/dist/edit-mode.js.map +1 -1
- package/dist/editor.d.ts +0 -8
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +0 -10
- package/dist/editor.js.map +1 -1
- package/dist/i18n/ar.d.ts.map +1 -1
- package/dist/i18n/ar.js +15 -1
- package/dist/i18n/ar.js.map +1 -1
- package/dist/i18n/de.d.ts.map +1 -1
- package/dist/i18n/de.js +15 -1
- package/dist/i18n/de.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +15 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +15 -1
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/fr.d.ts.map +1 -1
- package/dist/i18n/fr.js +15 -1
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/ja.d.ts.map +1 -1
- package/dist/i18n/ja.js +15 -1
- package/dist/i18n/ja.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +15 -1
- package/dist/i18n/ko.js.map +1 -1
- package/dist/i18n/messages.d.ts +28 -2
- 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 +15 -1
- package/dist/i18n/pt-BR.js.map +1 -1
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +15 -1
- package/dist/i18n/ru.js.map +1 -1
- package/dist/i18n/zh-CN.d.ts.map +1 -1
- package/dist/i18n/zh-CN.js +15 -1
- 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 +15 -1
- package/dist/i18n/zh-TW.js.map +1 -1
- package/dist/icons.d.ts +10 -2
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +10 -2
- 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 +3 -3
- package/dist/insert.d.ts.map +1 -1
- package/dist/insert.js +17 -8
- 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 +1 -2
- package/dist/new-slide.d.ts.map +1 -1
- package/dist/new-slide.js +9 -5
- package/dist/new-slide.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/ruler.d.ts +8 -1
- package/dist/ruler.d.ts.map +1 -1
- package/dist/ruler.js +16 -1
- package/dist/ruler.js.map +1 -1
- package/dist/state.d.ts +25 -10
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +3 -1
- package/dist/state.js.map +1 -1
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +149 -2
- 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 +72 -19
- 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 +0 -9
- package/dist/worker/handlers.js.map +1 -1
- package/dist/worker/protocol.d.ts +1 -12
- package/dist/worker/protocol.d.ts.map +1 -1
- package/dist/worker/worker-source.js +1 -1
- package/package.json +3 -3
- package/dist/formatting-marks.d.ts +0 -23
- package/dist/formatting-marks.d.ts.map +0 -1
- package/dist/formatting-marks.js +0 -55
- package/dist/formatting-marks.js.map +0 -1
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
|
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,CAwBtG"}
|
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;
|
|
@@ -113,7 +119,6 @@ export function insertCommands(pickImage) {
|
|
|
113
119
|
label: "command.insertImage",
|
|
114
120
|
icon: ICON_IMAGE,
|
|
115
121
|
group: "insert",
|
|
116
|
-
labeled: true,
|
|
117
122
|
run: { kind: "action", press: pickImage },
|
|
118
123
|
enabledWhen: (c) => c.ready && c.docType === "presentation" && c.presentationView === "normal",
|
|
119
124
|
},
|
|
@@ -123,7 +128,11 @@ export function insertCommands(pickImage) {
|
|
|
123
128
|
icon: ICON_SUBTOOL_RECTANGLE,
|
|
124
129
|
group: "insert",
|
|
125
130
|
run: { kind: "armPicker", options: SHAPE_OPTIONS },
|
|
126
|
-
|
|
131
|
+
// An image's current page takes them unless it's animated or a
|
|
132
|
+
// vector, and not while it's cropped.
|
|
133
|
+
enabledWhen: (c) => c.ready &&
|
|
134
|
+
(c.docType === "portable" ||
|
|
135
|
+
(c.docType === "image" && editStateOf(c).pageTakesMarkup && editStateOf(c).cropping === null)),
|
|
127
136
|
},
|
|
128
137
|
};
|
|
129
138
|
}
|
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
|
@@ -15,8 +15,7 @@ export declare function mountNewSlide(host: EditHost, i18n: I18n): NewSlide;
|
|
|
15
15
|
* action shown with nothing selected, or slides or sections: it sits where the
|
|
16
16
|
* selection's property controls go, so it shows on the empty canvas and with
|
|
17
17
|
* slides or sections picked in the thumbnails, and yields to those controls the
|
|
18
|
-
* moment a shape or text is selected.
|
|
19
|
-
* "slide" only once you know.
|
|
18
|
+
* moment a shape or text is selected.
|
|
20
19
|
*/
|
|
21
20
|
export declare function newSlideCommand(open: () => void): CommandDef<MessageKey>;
|
|
22
21
|
//# 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":"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,
|
|
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;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAWxE"}
|
package/dist/new-slide.js
CHANGED
|
@@ -31,7 +31,8 @@ export function mountNewSlide(host, i18n) {
|
|
|
31
31
|
return {
|
|
32
32
|
// Pull every slide master's summary, flatten it to pickable options
|
|
33
33
|
// (each slide layout previews on its slide master's plane at page
|
|
34
|
-
// `1 + its index`), and open
|
|
34
|
+
// `1 + its index`), and open — with the current slide's size, which
|
|
35
|
+
// every slide layout shares. Falls back to the copy-neighbor default
|
|
35
36
|
// when no slide layouts are available. The new slide lands at the end
|
|
36
37
|
// of the last section selected in the thumbnails — an empty one too —
|
|
37
38
|
// else right after the last slide selected there, else after the
|
|
@@ -43,7 +44,10 @@ export function mountNewSlide(host, i18n) {
|
|
|
43
44
|
const insertIndex = section !== undefined
|
|
44
45
|
? APPEND_INDEX
|
|
45
46
|
: (selectedPages.length > 0 ? Math.max(...selectedPages) : pageIndex) + 1;
|
|
46
|
-
const slideMasters = await
|
|
47
|
+
const [slideMasters, slideSize] = await Promise.all([
|
|
48
|
+
host.edit.slideMastersSummary(),
|
|
49
|
+
host.client.pageDisplaySize(pageIndex),
|
|
50
|
+
]);
|
|
47
51
|
const options = slideMasters.flatMap((slideMaster) => slideMaster.slideLayouts.map((slideLayout, index) => ({
|
|
48
52
|
layout: slideLayout.id,
|
|
49
53
|
plane: slideMaster.plane,
|
|
@@ -57,6 +61,8 @@ export function mountNewSlide(host, i18n) {
|
|
|
57
61
|
modal.open({
|
|
58
62
|
insertIndex,
|
|
59
63
|
options,
|
|
64
|
+
// Zero in a deck with no slides yet.
|
|
65
|
+
slideSize: slideSize.width > 0 && slideSize.height > 0 ? slideSize : null,
|
|
60
66
|
renderPreview: (plane, page, scale) => host.client.renderPagePreview(plane, page, scale),
|
|
61
67
|
onPick: (layout) => void execute(createSlide(insertIndex, layout, section)),
|
|
62
68
|
});
|
|
@@ -69,8 +75,7 @@ export function mountNewSlide(host, i18n) {
|
|
|
69
75
|
* action shown with nothing selected, or slides or sections: it sits where the
|
|
70
76
|
* selection's property controls go, so it shows on the empty canvas and with
|
|
71
77
|
* slides or sections picked in the thumbnails, and yields to those controls the
|
|
72
|
-
* moment a shape or text is selected.
|
|
73
|
-
* "slide" only once you know.
|
|
78
|
+
* moment a shape or text is selected.
|
|
74
79
|
*/
|
|
75
80
|
export function newSlideCommand(open) {
|
|
76
81
|
return {
|
|
@@ -78,7 +83,6 @@ export function newSlideCommand(open) {
|
|
|
78
83
|
label: "command.createSlide",
|
|
79
84
|
icon: ICON_PAGE_ADD,
|
|
80
85
|
group: "slide",
|
|
81
|
-
labeled: true,
|
|
82
86
|
run: { kind: "action", press: open },
|
|
83
87
|
enabledWhen: (c) => c.ready &&
|
|
84
88
|
(c.selection.count === 0 || allowsEdit(c.selection, "insertSlide") || c.slideSections.selected.length > 0),
|
package/dist/new-slide.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new-slide.js","sourceRoot":"","sources":["../src/new-slide.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAIpE;uCACuC;AACvC,MAAM,YAAY,GAAG,WAAW,CAAC;AAEjC;;;iFAGiF;AACjF,SAAS,WAAW,CAAC,KAAa,EAAE,MAAe,EAAE,YAAqB;IACtE,OAAO;QACH,YAAY,EAAE;YACV,SAAS,EAAE;gBACP,OAAO,EAAE;oBACL,WAAW,EAAE;wBACT,KAAK;wBACL,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;wBACrC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;qBACpD;iBACJ;aACJ;SACJ;KACJ,CAAC;AACN,CAAC;AASD;+BAC+B;AAC/B,MAAM,UAAU,aAAa,CAAC,IAAc,EAAE,IAAU;IACpD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACxC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,CAAC,OAAoB,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1F,OAAO;QACH,oEAAoE;QACpE,kEAAkE;QAClE,
|
|
1
|
+
{"version":3,"file":"new-slide.js","sourceRoot":"","sources":["../src/new-slide.ts"],"names":[],"mappings":"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"}
|
package/dist/paint.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PaintColor, PaintFill } from "@docmentis/udoc-wasm";
|
|
1
|
+
import type { PaintColor, PaintFill, PaintLine, UDocSelectionProperties } from "@docmentis/udoc-wasm";
|
|
2
2
|
import type { LineDash, PaintChannel, PaintSpec, RibbonControl, RibbonControlEnv, StrokeStyle, UIShellHost } from "@docmentis/udoc-ui/internal";
|
|
3
3
|
import type { EditTools } from "./tools.js";
|
|
4
4
|
/** A picker paint as a `PaintColor`, or `null` for "no fill": a solid sRGB
|
|
@@ -9,6 +9,10 @@ export declare function paintToDrawingColor(paint: PaintSpec): PaintColor | null
|
|
|
9
9
|
/** A picker paint as a `PaintFill`: a solid / theme color wrapped as a solid
|
|
10
10
|
* fill, or explicit `"none"` for "no fill". */
|
|
11
11
|
export declare function paintToDrawingFill(paint: PaintSpec): PaintFill;
|
|
12
|
+
/** The line the selected shapes agree on — a deck's, a word document's, or
|
|
13
|
+
* those drawn over an image — or null where they don't, or none is
|
|
14
|
+
* selected. */
|
|
15
|
+
export declare function selectionLine(properties: UDocSelectionProperties | null): PaintLine | null;
|
|
12
16
|
/** A composed stroke the Line picker applies: its color plus the weight and
|
|
13
17
|
* dash from the Weight / Dashes fly-outs. The shell lowers it to the doc type's
|
|
14
18
|
* outline model (`DrawingML` `Line` / PDF stroking style). */
|