@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.
Files changed (133) hide show
  1. package/dist/arrange.d.ts +3 -0
  2. package/dist/arrange.d.ts.map +1 -1
  3. package/dist/arrange.js +10 -12
  4. package/dist/arrange.js.map +1 -1
  5. package/dist/components/CropOverlay.d.ts +27 -0
  6. package/dist/components/CropOverlay.d.ts.map +1 -0
  7. package/dist/components/CropOverlay.js +126 -0
  8. package/dist/components/CropOverlay.js.map +1 -0
  9. package/dist/components/ImageSizeModal.d.ts +23 -0
  10. package/dist/components/ImageSizeModal.d.ts.map +1 -0
  11. package/dist/components/ImageSizeModal.js +189 -0
  12. package/dist/components/ImageSizeModal.js.map +1 -0
  13. package/dist/components/NewSlideModal.d.ts +7 -2
  14. package/dist/components/NewSlideModal.d.ts.map +1 -1
  15. package/dist/components/NewSlideModal.js +10 -3
  16. package/dist/components/NewSlideModal.js.map +1 -1
  17. package/dist/crop-box.d.ts +33 -0
  18. package/dist/crop-box.d.ts.map +1 -0
  19. package/dist/crop-box.js +107 -0
  20. package/dist/crop-box.js.map +1 -0
  21. package/dist/crop.d.ts +28 -0
  22. package/dist/crop.d.ts.map +1 -0
  23. package/dist/crop.js +256 -0
  24. package/dist/crop.js.map +1 -0
  25. package/dist/edit-client.d.ts +0 -6
  26. package/dist/edit-client.d.ts.map +1 -1
  27. package/dist/edit-client.js +0 -8
  28. package/dist/edit-client.js.map +1 -1
  29. package/dist/edit-mode.d.ts +0 -2
  30. package/dist/edit-mode.d.ts.map +1 -1
  31. package/dist/edit-mode.js +48 -14
  32. package/dist/edit-mode.js.map +1 -1
  33. package/dist/editor.d.ts +0 -8
  34. package/dist/editor.d.ts.map +1 -1
  35. package/dist/editor.js +0 -10
  36. package/dist/editor.js.map +1 -1
  37. package/dist/i18n/ar.d.ts.map +1 -1
  38. package/dist/i18n/ar.js +15 -1
  39. package/dist/i18n/ar.js.map +1 -1
  40. package/dist/i18n/de.d.ts.map +1 -1
  41. package/dist/i18n/de.js +15 -1
  42. package/dist/i18n/de.js.map +1 -1
  43. package/dist/i18n/en.d.ts.map +1 -1
  44. package/dist/i18n/en.js +15 -1
  45. package/dist/i18n/en.js.map +1 -1
  46. package/dist/i18n/es.d.ts.map +1 -1
  47. package/dist/i18n/es.js +15 -1
  48. package/dist/i18n/es.js.map +1 -1
  49. package/dist/i18n/fr.d.ts.map +1 -1
  50. package/dist/i18n/fr.js +15 -1
  51. package/dist/i18n/fr.js.map +1 -1
  52. package/dist/i18n/ja.d.ts.map +1 -1
  53. package/dist/i18n/ja.js +15 -1
  54. package/dist/i18n/ja.js.map +1 -1
  55. package/dist/i18n/ko.d.ts.map +1 -1
  56. package/dist/i18n/ko.js +15 -1
  57. package/dist/i18n/ko.js.map +1 -1
  58. package/dist/i18n/messages.d.ts +28 -2
  59. package/dist/i18n/messages.d.ts.map +1 -1
  60. package/dist/i18n/pt-BR.d.ts.map +1 -1
  61. package/dist/i18n/pt-BR.js +15 -1
  62. package/dist/i18n/pt-BR.js.map +1 -1
  63. package/dist/i18n/ru.d.ts.map +1 -1
  64. package/dist/i18n/ru.js +15 -1
  65. package/dist/i18n/ru.js.map +1 -1
  66. package/dist/i18n/zh-CN.d.ts.map +1 -1
  67. package/dist/i18n/zh-CN.js +15 -1
  68. package/dist/i18n/zh-CN.js.map +1 -1
  69. package/dist/i18n/zh-TW.d.ts.map +1 -1
  70. package/dist/i18n/zh-TW.js +15 -1
  71. package/dist/i18n/zh-TW.js.map +1 -1
  72. package/dist/icons.d.ts +10 -2
  73. package/dist/icons.d.ts.map +1 -1
  74. package/dist/icons.js +10 -2
  75. package/dist/icons.js.map +1 -1
  76. package/dist/image.d.ts +39 -0
  77. package/dist/image.d.ts.map +1 -0
  78. package/dist/image.js +203 -0
  79. package/dist/image.js.map +1 -0
  80. package/dist/insert.d.ts +3 -3
  81. package/dist/insert.d.ts.map +1 -1
  82. package/dist/insert.js +17 -8
  83. package/dist/insert.js.map +1 -1
  84. package/dist/markup.d.ts +23 -0
  85. package/dist/markup.d.ts.map +1 -0
  86. package/dist/markup.js +100 -0
  87. package/dist/markup.js.map +1 -0
  88. package/dist/menu-action.d.ts +6 -1
  89. package/dist/menu-action.d.ts.map +1 -1
  90. package/dist/menu-action.js +4 -1
  91. package/dist/menu-action.js.map +1 -1
  92. package/dist/new-slide.d.ts +1 -2
  93. package/dist/new-slide.d.ts.map +1 -1
  94. package/dist/new-slide.js +9 -5
  95. package/dist/new-slide.js.map +1 -1
  96. package/dist/paint.d.ts +5 -1
  97. package/dist/paint.d.ts.map +1 -1
  98. package/dist/paint.js +27 -16
  99. package/dist/paint.js.map +1 -1
  100. package/dist/ruler.d.ts +8 -1
  101. package/dist/ruler.d.ts.map +1 -1
  102. package/dist/ruler.js +16 -1
  103. package/dist/ruler.js.map +1 -1
  104. package/dist/state.d.ts +25 -10
  105. package/dist/state.d.ts.map +1 -1
  106. package/dist/state.js +3 -1
  107. package/dist/state.js.map +1 -1
  108. package/dist/styles.d.ts.map +1 -1
  109. package/dist/styles.js +149 -2
  110. package/dist/styles.js.map +1 -1
  111. package/dist/tabs.d.ts +1 -1
  112. package/dist/tabs.d.ts.map +1 -1
  113. package/dist/tabs.js +72 -19
  114. package/dist/tabs.js.map +1 -1
  115. package/dist/text-format.js +7 -7
  116. package/dist/text-format.js.map +1 -1
  117. package/dist/tools.d.ts +3 -0
  118. package/dist/tools.d.ts.map +1 -1
  119. package/dist/tools.js +4 -2
  120. package/dist/tools.js.map +1 -1
  121. package/dist/version.d.ts +1 -1
  122. package/dist/version.js +1 -1
  123. package/dist/worker/handlers.d.ts.map +1 -1
  124. package/dist/worker/handlers.js +0 -9
  125. package/dist/worker/handlers.js.map +1 -1
  126. package/dist/worker/protocol.d.ts +1 -12
  127. package/dist/worker/protocol.d.ts.map +1 -1
  128. package/dist/worker/worker-source.js +1 -1
  129. package/package.json +3 -3
  130. package/dist/formatting-marks.d.ts +0 -23
  131. package/dist/formatting-marks.d.ts.map +0 -1
  132. package/dist/formatting-marks.js +0 -55
  133. 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`: a shape as a page object, on top of the page — the engine mints
8
- * its id and selects it. A no-op for a page with no id (no document, or not a
9
- * PDF). */
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
@@ -1 +1 @@
1
- {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../src/insert.ts"],"names":[],"mappings":"AAWA,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;AAqElD,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE1D;AAED;;;YAGY;AACZ,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,CAMrH;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,CAoBtG"}
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, placed by a pointer gesture the
2
- // canvas carries out, and Image on a slide deck, asked for and inserted at once.
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`: a shape as a page object, on top of the page — the engine mints
72
- * its id and selects it. A no-op for a page with no id (no document, or not a
73
- * PDF). */
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
- if (!shape || host.store.getState().status !== "ready")
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
- enabledWhen: (c) => c.ready && c.docType === "portable",
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"insert.js","sourceRoot":"","sources":["../src/insert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"insert.js","sourceRoot":"","sources":["../src/insert.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -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;AAEvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;;;;;;GAcG;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,CAAC;AAEtD,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,CAiFhF"}
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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"menu-action.js","sourceRoot":"","sources":["../src/menu-action.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"menu-action.js","sourceRoot":"","sources":["../src/menu-action.ts"],"names":[],"mappings":"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"}
@@ -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. Labeled, as its page-add glyph reads
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
@@ -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,CA0ClE;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAYxE"}
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. Falls back to the copy-neighbor default
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 host.edit.slideMastersSummary();
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. Labeled, as its page-add glyph reads
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),
@@ -1 +1 @@
1
- {"version":3,"file":"new-slide.js","sourceRoot":"","sources":["../src/new-slide.ts"],"names":[],"mappings":"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"}
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,oEAAoE;QACpE,qEAAqE;QACrE,sEAAsE;QACtE,sEAAsE;QACtE,iEAAiE;QACjE,oEAAoE;QACpE,oBAAoB;QACpB,KAAK,CAAC,IAAI;YACN,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjG,MAAM,OAAO,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YACnG,MAAM,WAAW,GACb,OAAO,KAAK,SAAS;gBACjB,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAClF,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC/B,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC;aACzC,CAAC,CAAC;YACH,MAAM,OAAO,GAAmB,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CACjE,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClD,MAAM,EAAE,WAAW,CAAC,EAAE;gBACtB,KAAK,EAAE,WAAW,CAAC,KAAK;gBACxB,IAAI,EAAE,KAAK,GAAG,CAAC;gBACf,IAAI,EAAE,WAAW,CAAC,IAAI;aACzB,CAAC,CAAC,CACN,CAAC;YACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,KAAK,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC3D,OAAO;YACX,CAAC;YACD,KAAK,CAAC,IAAI,CAAC;gBACP,WAAW;gBACX,OAAO;gBACP,qCAAqC;gBACrC,SAAS,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;gBACzE,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;gBACxF,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;aAC9E,CAAC,CAAC;QACP,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;KACjC,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAgB;IAC5C,OAAO;QACH,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;QACpC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CACf,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;KACjH,CAAC;AACN,CAAC"}
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). */