@docmentis/udoc-editor 0.8.15 → 0.8.16

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 (147) hide show
  1. package/dist/commands.d.ts.map +1 -1
  2. package/dist/commands.js +51 -9
  3. package/dist/commands.js.map +1 -1
  4. package/dist/components/PageControls.d.ts +13 -6
  5. package/dist/components/PageControls.d.ts.map +1 -1
  6. package/dist/components/PageControls.js +42 -33
  7. package/dist/components/PageControls.js.map +1 -1
  8. package/dist/components/PageSettingsModal.d.ts +0 -2
  9. package/dist/components/PageSettingsModal.d.ts.map +1 -1
  10. package/dist/components/PageSettingsModal.js +54 -56
  11. package/dist/components/PageSettingsModal.js.map +1 -1
  12. package/dist/components/{NewSlideModal.d.ts → SlideLayoutModal.d.ts} +15 -11
  13. package/dist/components/SlideLayoutModal.d.ts.map +1 -0
  14. package/dist/components/{NewSlideModal.js → SlideLayoutModal.js} +34 -18
  15. package/dist/components/SlideLayoutModal.js.map +1 -0
  16. package/dist/docmentis-theme.d.ts +4 -0
  17. package/dist/docmentis-theme.d.ts.map +1 -0
  18. package/dist/docmentis-theme.js +6 -0
  19. package/dist/docmentis-theme.js.map +1 -0
  20. package/dist/edit-client.d.ts +9 -1
  21. package/dist/edit-client.d.ts.map +1 -1
  22. package/dist/edit-client.js +10 -0
  23. package/dist/edit-client.js.map +1 -1
  24. package/dist/edit-command.d.ts +3 -1
  25. package/dist/edit-command.d.ts.map +1 -1
  26. package/dist/edit-command.js +7 -0
  27. package/dist/edit-command.js.map +1 -1
  28. package/dist/edit-mode.d.ts.map +1 -1
  29. package/dist/edit-mode.js +22 -10
  30. package/dist/edit-mode.js.map +1 -1
  31. package/dist/editor.d.ts +7 -6
  32. package/dist/editor.d.ts.map +1 -1
  33. package/dist/editor.js +6 -5
  34. package/dist/editor.js.map +1 -1
  35. package/dist/i18n/ar.js +10 -10
  36. package/dist/i18n/ar.js.map +1 -1
  37. package/dist/i18n/de.js +10 -10
  38. package/dist/i18n/de.js.map +1 -1
  39. package/dist/i18n/en.js +10 -10
  40. package/dist/i18n/en.js.map +1 -1
  41. package/dist/i18n/es.js +10 -10
  42. package/dist/i18n/es.js.map +1 -1
  43. package/dist/i18n/fr.js +10 -10
  44. package/dist/i18n/fr.js.map +1 -1
  45. package/dist/i18n/ja.js +10 -10
  46. package/dist/i18n/ja.js.map +1 -1
  47. package/dist/i18n/ko.js +10 -10
  48. package/dist/i18n/ko.js.map +1 -1
  49. package/dist/i18n/messages.d.ts +18 -18
  50. package/dist/i18n/messages.d.ts.map +1 -1
  51. package/dist/i18n/pt-BR.js +10 -10
  52. package/dist/i18n/pt-BR.js.map +1 -1
  53. package/dist/i18n/ru.js +10 -10
  54. package/dist/i18n/ru.js.map +1 -1
  55. package/dist/i18n/zh-CN.js +10 -10
  56. package/dist/i18n/zh-CN.js.map +1 -1
  57. package/dist/i18n/zh-TW.js +10 -10
  58. package/dist/i18n/zh-TW.js.map +1 -1
  59. package/dist/icons.d.ts +24 -0
  60. package/dist/icons.d.ts.map +1 -1
  61. package/dist/icons.js +24 -0
  62. package/dist/icons.js.map +1 -1
  63. package/dist/image.d.ts +11 -7
  64. package/dist/image.d.ts.map +1 -1
  65. package/dist/image.js +44 -7
  66. package/dist/image.js.map +1 -1
  67. package/dist/insert.d.ts +24 -12
  68. package/dist/insert.d.ts.map +1 -1
  69. package/dist/insert.js +306 -51
  70. package/dist/insert.js.map +1 -1
  71. package/dist/line-edit.d.ts +30 -0
  72. package/dist/line-edit.d.ts.map +1 -0
  73. package/dist/line-edit.js +87 -0
  74. package/dist/line-edit.js.map +1 -0
  75. package/dist/markup.d.ts +25 -5
  76. package/dist/markup.d.ts.map +1 -1
  77. package/dist/markup.js +73 -15
  78. package/dist/markup.js.map +1 -1
  79. package/dist/opacity.d.ts +19 -0
  80. package/dist/opacity.d.ts.map +1 -0
  81. package/dist/opacity.js +45 -0
  82. package/dist/opacity.js.map +1 -0
  83. package/dist/page-commands.d.ts +16 -0
  84. package/dist/page-commands.d.ts.map +1 -0
  85. package/dist/page-commands.js +122 -0
  86. package/dist/page-commands.js.map +1 -0
  87. package/dist/page-controls.d.ts +27 -1
  88. package/dist/page-controls.d.ts.map +1 -1
  89. package/dist/page-controls.js +30 -14
  90. package/dist/page-controls.js.map +1 -1
  91. package/dist/paint.d.ts +59 -12
  92. package/dist/paint.d.ts.map +1 -1
  93. package/dist/paint.js +225 -104
  94. package/dist/paint.js.map +1 -1
  95. package/dist/ruler-controls.d.ts +6 -0
  96. package/dist/ruler-controls.d.ts.map +1 -1
  97. package/dist/ruler-controls.js +18 -3
  98. package/dist/ruler-controls.js.map +1 -1
  99. package/dist/ruler-edits.d.ts +2 -5
  100. package/dist/ruler-edits.d.ts.map +1 -1
  101. package/dist/ruler-edits.js +13 -20
  102. package/dist/ruler-edits.js.map +1 -1
  103. package/dist/ruler.d.ts +7 -1
  104. package/dist/ruler.d.ts.map +1 -1
  105. package/dist/ruler.js +41 -11
  106. package/dist/ruler.js.map +1 -1
  107. package/dist/shape-gallery.d.ts +9 -4
  108. package/dist/shape-gallery.d.ts.map +1 -1
  109. package/dist/shape-gallery.js +9 -16
  110. package/dist/shape-gallery.js.map +1 -1
  111. package/dist/slide-commands.d.ts +38 -0
  112. package/dist/slide-commands.d.ts.map +1 -0
  113. package/dist/slide-commands.js +191 -0
  114. package/dist/slide-commands.js.map +1 -0
  115. package/dist/slide-shape.d.ts +24 -3
  116. package/dist/slide-shape.d.ts.map +1 -1
  117. package/dist/slide-shape.js +65 -10
  118. package/dist/slide-shape.js.map +1 -1
  119. package/dist/state.d.ts +12 -5
  120. package/dist/state.d.ts.map +1 -1
  121. package/dist/state.js +1 -0
  122. package/dist/state.js.map +1 -1
  123. package/dist/styles.d.ts.map +1 -1
  124. package/dist/styles.js +108 -63
  125. package/dist/styles.js.map +1 -1
  126. package/dist/tabs.d.ts +1 -1
  127. package/dist/tabs.d.ts.map +1 -1
  128. package/dist/tabs.js +99 -40
  129. package/dist/tabs.js.map +1 -1
  130. package/dist/text-format.d.ts.map +1 -1
  131. package/dist/text-format.js +2 -2
  132. package/dist/text-format.js.map +1 -1
  133. package/dist/version.d.ts +1 -1
  134. package/dist/version.js +1 -1
  135. package/dist/worker/handlers.d.ts.map +1 -1
  136. package/dist/worker/handlers.js +6 -0
  137. package/dist/worker/handlers.js.map +1 -1
  138. package/dist/worker/protocol.d.ts +13 -2
  139. package/dist/worker/protocol.d.ts.map +1 -1
  140. package/dist/worker/worker-source.js +1 -1
  141. package/package.json +3 -3
  142. package/dist/components/NewSlideModal.d.ts.map +0 -1
  143. package/dist/components/NewSlideModal.js.map +0 -1
  144. package/dist/new-slide.d.ts +0 -20
  145. package/dist/new-slide.d.ts.map +0 -1
  146. package/dist/new-slide.js +0 -90
  147. package/dist/new-slide.js.map +0 -1
package/dist/insert.js CHANGED
@@ -1,24 +1,38 @@
1
- // The Insert tab's commands: Shapes, placed by a pointer gesture the canvas
2
- // carries out — a PDF's four as page objects, the gallery's on a deck's slides
3
- // and over an image's pages — and Image on a slide deck, asked for and inserted
4
- // at once.
5
- import { ICON_SUBTOOL_ARROW, ICON_SUBTOOL_ELLIPSE, ICON_SUBTOOL_LINE, ICON_SUBTOOL_RECTANGLE, SHAPE_STROKE, SHAPE_STROKE_WIDTH, segmentsFor, } from "@docmentis/udoc-ui/internal";
1
+ // What goes on a page or a slide, placed by a pointer gesture the canvas carries
2
+ // out: Shapes — a PDF's four as page objects, from its Page tab, the gallery's on
3
+ // a deck's slides, from its Slide tab, and over an image's pages, from its Image
4
+ // tab — and Text Box on those and a PDF's page, a page object there; and Image on a
5
+ // slide deck or a PDF's page, asked for and inserted at once. A shape paints with
6
+ // what was last specified (`PaintMemory`), else its document's default: a deck's
7
+ // theme, or docMentis's colors on a PDF or an image.
8
+ import { ICON_SUBTOOL_ARROW, ICON_SUBTOOL_ELLIPSE, ICON_SUBTOOL_LINE, ICON_SUBTOOL_RECTANGLE, ICON_SUBTOOL_TEXTBOX, SHAPE_STROKE_WIDTH, segmentsFor, } from "@docmentis/udoc-ui/internal";
9
+ import { DOCMENTIS_FILL, DOCMENTIS_LINE } from "./docmentis-theme.js";
6
10
  import { EditCommand } from "./edit-command.js";
7
11
  import { ICON_IMAGE, ICON_SHAPES } from "./icons.js";
8
- import { placeMarkup } from "./image.js";
9
- import { galleryShape, SHAPE_GALLERY } from "./shape-gallery.js";
10
- import { slideShape } from "./slide-shape.js";
12
+ import { markupPreview, placeMarkup, placeMarkupTextBox } from "./image.js";
13
+ import { galleryShape, PREVIEW_NODE_ID, PREVIEW_STORY_ID, SHAPE_GALLERY } from "./shape-gallery.js";
14
+ import { specifiedPaint, specifiedPortablePaint } from "./paint.js";
15
+ import { slideShape, slideShapeColors, slideTextBox } from "./slide-shape.js";
11
16
  import { editStateOf } from "./state.js";
12
17
  /** A large insert index that clamps to "on top" in the engine. */
13
18
  const APPEND_INDEX = 0x7fff_ffff;
14
- /** A placed shape's fill — translucent blue (filled shapes only). */
15
- const FILL = { components: [0.26, 0.55, 0.96], colorSpace: "srgb" };
16
- /** A placed shape's fill opacity. */
17
- const FILL_ALPHA = 0.18;
18
- /** The shapes the Insert tab places on a PDF, as the shell carries their place
19
- * tools. */
19
+ /** The shapes a PDF's Page tab places, as the shell carries their place tools. */
20
20
  const PORTABLE_SHAPES = new Set(["rectangle", "ellipse", "line", "arrow"]);
21
- /** Shapes offered by a PDF's Insert tab's shape picker (`insertShape`). */
21
+ /** The tool Text Box arms, on a slide, an image or a PDF's page. */
22
+ const TEXT_BOX_TOOL = "textBox";
23
+ /** The standard font a PDF's text box is set in, and its size in points. */
24
+ const TEXT_BOX_FONT = "helvetica";
25
+ const TEXT_BOX_SIZE = 12;
26
+ /**
27
+ * What a text box holds until it is typed over, selected so the first key
28
+ * replaces it. One left untyped should still show, to be found and deleted: a
29
+ * slide's or an image's has no fill or outline to show by, and the engine sets no
30
+ * caret in a PDF's text object with nothing in it. ASCII, which the standard font's encoding
31
+ * holds byte for byte; the same in every language, as that font has no glyphs for
32
+ * most others.
33
+ */
34
+ const TEXT_BOX_PLACEHOLDER = "Text";
35
+ /** Shapes offered by a PDF's Page tab's shape picker (`insertShape`). */
22
36
  const SHAPE_OPTIONS = [
23
37
  ["rectangle", ICON_SUBTOOL_RECTANGLE, "shape.rectangle"],
24
38
  ["ellipse", ICON_SUBTOOL_ELLIPSE, "shape.ellipse"],
@@ -31,11 +45,14 @@ const SHAPE_OPTIONS = [
31
45
  * `objects`. The object carries **no `id`** — the `InsertObjects` command mints
32
46
  * one on insert, so the host never allocates ids. Rectangle and ellipse use the
33
47
  * box of the two points; line and arrow run `p0 → p1`, so the direction is
34
- * preserved. Filled shapes (rectangle / ellipse) get the translucent fill +
35
- * solid stroke; open shapes (line / arrow) are stroke only.
48
+ * preserved. Filled shapes (rectangle / ellipse) get a fill and a stroke; open
49
+ * shapes (line / arrow) are stroke only. Each paints with what was last specified
50
+ * for it, else docMentis's colors at full opacity.
36
51
  */
37
- function shapeObject(shape, p0, p1) {
52
+ function shapeObject(memory, shape, p0, p1) {
38
53
  const filled = shape === "rectangle" || shape === "ellipse";
54
+ const fill = specifiedPortablePaint(memory, "fill", DOCMENTIS_FILL);
55
+ const stroke = specifiedPortablePaint(memory, "stroke", DOCMENTIS_LINE);
39
56
  const object = {
40
57
  transform: { scaleX: 1, skewY: 0, skewX: 0, scaleY: 1, translateX: 0, translateY: 0 },
41
58
  clips: [],
@@ -44,10 +61,10 @@ function shapeObject(shape, p0, p1) {
44
61
  path: {
45
62
  path: { segments: segmentsFor(shape, p0, p1) },
46
63
  windingRule: "nonZero",
47
- nonstrokingStyle: { brush: { solid: FILL }, alpha: FILL_ALPHA, overprint: false },
64
+ nonstrokingStyle: { brush: { solid: fill.color }, alpha: fill.alpha, overprint: false },
48
65
  strokingStyle: {
49
- brush: { solid: SHAPE_STROKE },
50
- alpha: 1.0,
66
+ brush: { solid: stroke.color },
67
+ alpha: stroke.alpha,
51
68
  overprint: false,
52
69
  line: {
53
70
  width: SHAPE_STROKE_WIDTH,
@@ -72,49 +89,243 @@ function shapeObject(shape, p0, p1) {
72
89
  };
73
90
  return object;
74
91
  }
75
- /** The outline the Insert tab's place `tool` is sketched with while it is
76
- * dragged out — a gallery shape's, or a PDF shape's own. */
92
+ /** What {@link shapeObject} draws from `p0` to `p1`, as the sketch layer shows it. */
93
+ function shapeObjectPreview(memory, shape, p0, p1) {
94
+ const filled = shape === "rectangle" || shape === "ellipse";
95
+ const fill = specifiedPortablePaint(memory, "fill", DOCMENTIS_FILL);
96
+ const stroke = specifiedPortablePaint(memory, "stroke", DOCMENTIS_LINE);
97
+ return {
98
+ paths: [
99
+ {
100
+ segments: segmentsFor(shape, p0, p1),
101
+ fill: filled ? { color: fill.color, opacity: fill.alpha } : null,
102
+ stroke: {
103
+ paint: { color: stroke.color, opacity: stroke.alpha },
104
+ style: {
105
+ width: SHAPE_STROKE_WIDTH,
106
+ lineCap: "butt",
107
+ lineJoin: "miter",
108
+ miterLimit: 10,
109
+ dashArray: null,
110
+ dashOffset: 0,
111
+ },
112
+ },
113
+ },
114
+ ],
115
+ };
116
+ }
117
+ /** A quarter turn's cosine and sine, by quarter turns clockwise. */
118
+ const QUARTER_TURNS = [
119
+ [1, 0],
120
+ [0, 1],
121
+ [-1, 0],
122
+ [0, -1],
123
+ ];
124
+ /**
125
+ * The model `GraphicsObject` for a new text box: one show op of
126
+ * {@link TEXT_BOX_PLACEHOLDER}, its first line's baseline a font size below `at`
127
+ * (page-local document points), its baseline running along `(cos, sin)`. Under
128
+ * its minted `id`, so the placeholder can be selected straight after the insert.
129
+ */
130
+ function textBoxObject(id, font, at, cos, sin) {
131
+ return {
132
+ id,
133
+ transform: { scaleX: cos, skewY: sin, skewX: -sin, scaleY: cos, translateX: at.x, translateY: at.y },
134
+ clips: [],
135
+ optionalContent: [],
136
+ content: {
137
+ text: {
138
+ runs: [
139
+ {
140
+ regular: {
141
+ textStyle: {
142
+ font,
143
+ fontSize: TEXT_BOX_SIZE,
144
+ charSpacing: 0,
145
+ wordSpacing: 0,
146
+ horizontalScaling: 100,
147
+ leading: 0,
148
+ rise: 0,
149
+ renderMode: "fill",
150
+ knockout: true,
151
+ },
152
+ nonstrokingStyle: {
153
+ brush: { solid: { components: [0], colorSpace: "deviceGray" } },
154
+ alpha: 1,
155
+ overprint: false,
156
+ },
157
+ strokingStyle: {
158
+ brush: { solid: { components: [0], colorSpace: "deviceGray" } },
159
+ alpha: 1,
160
+ overprint: false,
161
+ line: {
162
+ width: 1,
163
+ lineCap: "butt",
164
+ lineJoin: "miter",
165
+ miterLimit: 10,
166
+ dashArray: null,
167
+ dashOffset: 0,
168
+ },
169
+ },
170
+ renderStyle: {
171
+ blendMode: "normal",
172
+ alphaIsShape: false,
173
+ overprintMode: "default",
174
+ renderingIntent: "relativeColorimetric",
175
+ },
176
+ softMask: null,
177
+ chunks: [{ text: [...TEXT_BOX_PLACEHOLDER].map((char) => char.charCodeAt(0)) }],
178
+ textMatrix: {
179
+ scaleX: 1,
180
+ skewY: 0,
181
+ skewX: 0,
182
+ scaleY: 1,
183
+ translateX: 0,
184
+ translateY: TEXT_BOX_SIZE,
185
+ },
186
+ markedContent: null,
187
+ },
188
+ },
189
+ ],
190
+ },
191
+ },
192
+ };
193
+ }
194
+ /** Each shell's text box font, and the open document it was minted for. */
195
+ const textBoxFonts = new WeakMap();
196
+ /**
197
+ * The font list's id for {@link TEXT_BOX_FONT}, added under an id minted once per
198
+ * document — an undo step of its own the first time, and again after that step is
199
+ * undone. Its own, not a Helvetica the document holds: the engine composes text
200
+ * only in a font it has loaded, and that one may be on a page it hasn't. Null with
201
+ * no ids to mint.
202
+ */
203
+ async function textBoxFont(host) {
204
+ const generation = host.store.getState().docGeneration;
205
+ const known = textBoxFonts.get(host);
206
+ const id = known?.generation === generation ? known.id : await host.client.mintId();
207
+ if (id === null)
208
+ return null;
209
+ textBoxFonts.set(host, { generation, id });
210
+ await host.commit(() => host.client.execute({ portable: { addStandardFont: { id, font: TEXT_BOX_FONT } } }));
211
+ return id;
212
+ }
213
+ /**
214
+ * Put a text box on page `page` — `pageId` — on top of the page, flowing in the
215
+ * box from `p0` to `p1`, with its placeholder selected to be typed over. A page
216
+ * shown turned has the text turned back, so it reads upright on screen, from the
217
+ * box's top left there. Its insert and its frame are two undo steps: the engine
218
+ * takes a frame only on a box already on the page.
219
+ */
220
+ async function placeTextBox(host, page, pageId, p0, p1) {
221
+ const [font, id] = await Promise.all([textBoxFont(host), host.client.mintId()]);
222
+ if (font === null || id === null)
223
+ return;
224
+ const [cos, sin] = QUARTER_TURNS[(4 - (host.pageView(page)?.view.rotation ?? 0)) % 4];
225
+ // The box in the text's own axes, which a frame is given in: x along its
226
+ // baseline, y down its lines.
227
+ const xs = [p0, p1].map((p) => p.x * cos + p.y * sin);
228
+ const ys = [p0, p1].map((p) => p.y * cos - p.x * sin);
229
+ const frame = { x0: Math.min(...xs), y0: Math.min(...ys), x1: Math.max(...xs), y1: Math.max(...ys) };
230
+ const at = { x: frame.x0 * cos - frame.y0 * sin, y: frame.x0 * sin + frame.y0 * cos };
231
+ const start = { object: id, run: 0, offset: 0 };
232
+ await host.commit(() => host.client.execute(EditCommand.insertObjects(pageId, [textBoxObject(id, font, at, cos, sin)])));
233
+ await host.commit(() => host.client.execute(EditCommand.resizeTextBox(pageId, start, frame)));
234
+ const end = { ...start, offset: TEXT_BOX_PLACEHOLDER.length };
235
+ host.client.setSelection({ portable: { objectText: { page: pageId, anchor: start, focus: end } } });
236
+ }
237
+ /** What a place `tool` drags out: a line or a box of a gallery shape, a PDF
238
+ * shape's own, or a text box's rectangle, which is its sketch too. */
77
239
  export function placedShape(tool) {
78
- return galleryShape(tool)?.sketch ?? (PORTABLE_SHAPES.has(tool) ? tool : null);
79
- }
80
- /** Place the Insert tab's `tool` on page `page`, spanning the page-local points
81
- * `p0 → p1`, on top of the page: on a PDF, a shape as a page object — the
82
- * engine mints its id and selects it — on a deck, a gallery shape on the
83
- * slide, and on an image, one drawn over it. A no-op for a page with no id
84
- * (no document, or none of these), or a tool not the document's. */
85
- export async function place(host, tool, page, p0, p1) {
240
+ if (tool === TEXT_BOX_TOOL)
241
+ return "rectangle";
242
+ const shape = galleryShape(tool);
243
+ if (shape)
244
+ return shape.line ? "line" : "rectangle";
245
+ return PORTABLE_SHAPES.has(tool) ? tool : null;
246
+ }
247
+ /**
248
+ * What placing `tool` from `p0` to `p1` on page `page` would draw, while it is
249
+ * dragged out: a PDF's shape as it is drawn here, or the node a gallery shape
250
+ * places, as the engine would paint it. Null, at once, for a text box, which has
251
+ * nothing to show by, and for a tool not the document's.
252
+ */
253
+ export function placePreview(host, memory, tool, page, p0, p1) {
254
+ const state = host.store.getState();
255
+ if (state.status !== "ready" || tool === TEXT_BOX_TOOL)
256
+ return null;
257
+ if (state.docType === "portable") {
258
+ return PORTABLE_SHAPES.has(tool)
259
+ ? Promise.resolve(shapeObjectPreview(memory, tool, p0, p1))
260
+ : null;
261
+ }
262
+ const shape = galleryShape(tool);
263
+ if (!shape)
264
+ return null;
265
+ if (state.docType === "image")
266
+ return markupPreview(host, memory, shape, page, p0, p1);
267
+ if (state.docType !== "presentation")
268
+ return null;
269
+ const node = slideShape(PREVIEW_NODE_ID, PREVIEW_STORY_ID, shape, p0, p1, slidePaint(memory, shape));
270
+ return host.edit.shapePreview(page, node);
271
+ }
272
+ /** What was last specified for a new `shape` on a slide, over its style: a scheme
273
+ * color stays one, as a deck has a theme to resolve it. */
274
+ function slidePaint(memory, shape) {
275
+ const colors = slideShapeColors(shape);
276
+ return {
277
+ fill: specifiedPaint(memory, "fill", true, colors.fill),
278
+ line: specifiedPaint(memory, "stroke", true, colors.line),
279
+ };
280
+ }
281
+ /** Place `tool` on page `page`, spanning the page-local points `p0 → p1`, on
282
+ * top of the page: on a PDF, a shape as a page object — the engine mints its
283
+ * id and selects it — or a text box with its text selected; on a deck, a gallery
284
+ * shape or a text box on the slide, and on an image, either drawn over it. A no-op
285
+ * for a page with no id (no document, or none of these), or a tool not the
286
+ * document's. */
287
+ export async function place(host, memory, tool, page, p0, p1) {
86
288
  const state = host.store.getState();
87
289
  if (state.status !== "ready")
88
290
  return;
89
291
  if (state.docType === "portable") {
90
- if (!PORTABLE_SHAPES.has(tool))
292
+ if (tool !== TEXT_BOX_TOOL && !PORTABLE_SHAPES.has(tool))
91
293
  return;
92
294
  const pageId = await host.client.portable.pageIdByIndex(page);
93
295
  if (pageId === undefined)
94
296
  return;
95
- const object = shapeObject(tool, p0, p1);
297
+ if (tool === TEXT_BOX_TOOL)
298
+ return placeTextBox(host, page, pageId, p0, p1);
299
+ const object = shapeObject(memory, tool, p0, p1);
96
300
  await host.commit(() => host.client.execute(EditCommand.insertObjects(pageId, [object])));
97
301
  return;
98
302
  }
303
+ if (tool === TEXT_BOX_TOOL) {
304
+ if (state.docType === "presentation")
305
+ return placeSlideTextBox(host, page, p0, p1);
306
+ if (state.docType === "image")
307
+ return placeMarkupTextBox(host, TEXT_BOX_PLACEHOLDER, page, p0, p1);
308
+ return;
309
+ }
99
310
  const shape = galleryShape(tool);
100
311
  if (!shape)
101
312
  return;
102
313
  if (state.docType === "image")
103
- return placeMarkup(host, shape, page, p0, p1);
314
+ return placeMarkup(host, memory, shape, page, p0, p1);
104
315
  if (state.docType === "presentation")
105
- return placeSlideShape(host, shape, page, p0, p1);
316
+ return placeSlideShape(host, memory, shape, page, p0, p1);
106
317
  }
107
318
  /**
108
319
  * Put `shape` on the deck's slide `page` from `p0` to `p1` — the slide's own
109
320
  * points — on top of the slide, and select it. One committing edit. A no-op
110
321
  * past the last slide.
111
322
  */
112
- async function placeSlideShape(host, shape, page, p0, p1) {
323
+ async function placeSlideShape(host, memory, shape, page, p0, p1) {
113
324
  const [slide, id, story] = await Promise.all([host.edit.slideId(page), host.client.mintId(), host.client.mintId()]);
114
325
  if (!slide || !id || !story)
115
326
  return;
116
327
  const container = { slide };
117
- const node = slideShape(id, story, shape, p0, p1);
328
+ const node = slideShape(id, story, shape, p0, p1, slidePaint(memory, shape));
118
329
  await host.commit(() => host.client.execute({
119
330
  presentation: {
120
331
  editShape: {
@@ -125,8 +336,32 @@ async function placeSlideShape(host, shape, page, p0, p1) {
125
336
  }));
126
337
  host.client.setSelection({ presentation: { shapes: { container, selection: { shapes: [id] } } } });
127
338
  }
128
- /** Insert the image file `bytes` as a picture on the current slide, centred
129
- * and scaled down to fit, then selected — a committing edit, so the picture's
339
+ /**
340
+ * Put a text box on the deck's slide `page` from `p0` to `p1` — the slide's own
341
+ * points — on top of the slide, with its text selected to be typed over. One
342
+ * committing edit. A no-op past the last slide.
343
+ */
344
+ async function placeSlideTextBox(host, page, p0, p1) {
345
+ const [slide, id, story] = await Promise.all([host.edit.slideId(page), host.client.mintId(), host.client.mintId()]);
346
+ if (!slide || !id || !story)
347
+ return;
348
+ const container = { slide };
349
+ const node = slideTextBox(id, story, TEXT_BOX_PLACEHOLDER, p0, p1);
350
+ await host.commit(() => host.client.execute({
351
+ presentation: {
352
+ editShape: {
353
+ container,
354
+ command: { insertShapes: { parent: null, index: APPEND_INDEX, nodes: [node] } },
355
+ },
356
+ },
357
+ }));
358
+ const range = { story, anchor: 0, focus: TEXT_BOX_PLACEHOLDER.length };
359
+ host.client.setSelection({
360
+ presentation: { shapes: { container, selection: { shapeText: [id, { range }] } } },
361
+ });
362
+ }
363
+ /** Insert the image file `bytes` as a picture on the current slide or page,
364
+ * centred and scaled down to fit, then selected — a committing edit, so the picture's
130
365
  * selection rides back. */
131
366
  export function insertImage(host, bytes, contentType) {
132
367
  return host.commit(() => host.edit.insertImage(bytes, contentType));
@@ -149,8 +384,20 @@ export function pickImage(host) {
149
384
  });
150
385
  input.click();
151
386
  }
152
- /** The Insert tab's commands, Image asking for its file with `pickImage` —
153
- * live on a deck's slides, which it inserts onto: not on its notes pages. */
387
+ /** Whether what goes on a deck's slide has one to go on: a slide shown, so not a
388
+ * notes page or the Slide Master view, nor a deck with no slides left. */
389
+ function onSlide(c) {
390
+ return c.ready && c.docType === "presentation" && c.presentationView === "normal" && c.pageCount > 0;
391
+ }
392
+ /** Whether what is drawn over an image has a page to go on: the current one, unless
393
+ * it's animated or a vector, and not while it's cropped. */
394
+ function overImage(c) {
395
+ return c.ready && c.docType === "image" && editStateOf(c).pageTakesMarkup && editStateOf(c).cropping === null;
396
+ }
397
+ /** The commands that put things on a page or a slide. Image asks for its file
398
+ * with `pickImage` — live on a deck's slides, which it inserts onto: not on
399
+ * its notes pages, where its Text Box and Shapes are grey too. A PDF's Text Box
400
+ * and Shapes place page objects, and its Image puts one on the current page. */
154
401
  export function insertCommands(pickImage) {
155
402
  return {
156
403
  insertImage: {
@@ -158,16 +405,30 @@ export function insertCommands(pickImage) {
158
405
  label: "command.insertImage",
159
406
  icon: ICON_IMAGE,
160
407
  group: "insert",
161
- labeled: true,
162
408
  run: { kind: "action", press: pickImage },
163
- enabledWhen: (c) => c.ready && c.docType === "presentation" && c.presentationView === "normal",
409
+ enabledWhen: onSlide,
410
+ },
411
+ insertPageImage: {
412
+ id: "insertPageImage",
413
+ label: "command.insertImage",
414
+ icon: ICON_IMAGE,
415
+ group: "insert",
416
+ run: { kind: "action", press: pickImage },
417
+ enabledWhen: (c) => c.ready && c.docType === "portable",
418
+ },
419
+ insertTextBox: {
420
+ id: "insertTextBox",
421
+ label: "command.annotateTextBox",
422
+ icon: ICON_SUBTOOL_TEXTBOX,
423
+ group: "insert",
424
+ run: { kind: "arm", tool: { kind: "extension", tool: TEXT_BOX_TOOL } },
425
+ enabledWhen: (c) => (c.ready && c.docType === "portable") || onSlide(c) || overImage(c),
164
426
  },
165
427
  insertShape: {
166
428
  id: "insertShape",
167
429
  label: "command.insertShape",
168
430
  icon: ICON_SHAPES,
169
431
  group: "insert",
170
- labeled: true,
171
432
  run: { kind: "armPicker", options: SHAPE_OPTIONS },
172
433
  enabledWhen: (c) => c.ready && c.docType === "portable",
173
434
  },
@@ -176,14 +437,8 @@ export function insertCommands(pickImage) {
176
437
  label: "command.insertShape",
177
438
  icon: ICON_SHAPES,
178
439
  group: "insert",
179
- labeled: true,
180
440
  run: { kind: "armGallery", sections: SHAPE_GALLERY },
181
- // On a deck's slides, not its notes pages. An image's current page
182
- // takes them unless it's animated or a vector, and not while it's
183
- // cropped.
184
- enabledWhen: (c) => c.ready &&
185
- ((c.docType === "presentation" && c.presentationView === "normal") ||
186
- (c.docType === "image" && editStateOf(c).pageTakesMarkup && editStateOf(c).cropping === null)),
441
+ enabledWhen: (c) => onSlide(c) || overImage(c),
187
442
  },
188
443
  };
189
444
  }
@@ -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,30 @@
1
+ import type { LineStyle, PaintFill, PaintLine, PaintLineDash } from "@docmentis/udoc-wasm";
2
+ import type { LineDash } from "@docmentis/udoc-ui/internal";
3
+ /** The line's weight and dash a Line panel change states. */
4
+ export interface LineChange {
5
+ /** The weight, in points. */
6
+ weight?: number | undefined;
7
+ dash?: LineDash | undefined;
8
+ }
9
+ /** A `DrawingML` dash as one the panel offers, or null for one it doesn't. A line
10
+ * stating none is solid. */
11
+ export declare function lineDashOfDrawing(dash: PaintLineDash | null | undefined): LineDash | null;
12
+ /** `current` with `change` and the color `fill` when given, over `fallback` for
13
+ * what it lacks: no line, or one painting nothing, takes the fallback's color, as
14
+ * setting its weight turns it on. Arrowheads, caps and joins are carried. */
15
+ export declare function changedDrawingLine(current: PaintLine | null, change: LineChange & {
16
+ fill?: PaintFill | undefined;
17
+ }, fallback: {
18
+ fill: PaintFill;
19
+ weight: number;
20
+ dash: LineDash;
21
+ }): PaintLine;
22
+ /** A PDF line's dash as one the panel offers, or null for one it doesn't. */
23
+ export declare function lineDashOfPortable(line: LineStyle): LineDash | null;
24
+ /** `current` with `change`, or a line of `fallback` for a side with none. A new
25
+ * weight alone scales the line's dashes with it, whatever they are. */
26
+ export declare function changedPortableLine(current: LineStyle | null, change: LineChange, fallback: {
27
+ weight: number;
28
+ dash: LineDash;
29
+ }): LineStyle;
30
+ //# sourceMappingURL=line-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-edit.d.ts","sourceRoot":"","sources":["../src/line-edit.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACvB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC/B;AAOD;6BAC6B;AAC7B,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAKzF;AAED;;8EAE8E;AAC9E,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,SAAS,GAAG,IAAI,EACzB,MAAM,EAAE,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,EACrD,QAAQ,EAAE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC9D,SAAS,CAaX;AAkBD,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI,CAUnE;AAeD;wEACwE;AACxE,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,SAAS,GAAG,IAAI,EACzB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC7C,SAAS,CAUX"}
@@ -0,0 +1,87 @@
1
+ /** A dash the panel offers as a `DrawingML` dash. */
2
+ function drawingDash(dash) {
3
+ return { preset: dash };
4
+ }
5
+ /** A `DrawingML` dash as one the panel offers, or null for one it doesn't. A line
6
+ * stating none is solid. */
7
+ export function lineDashOfDrawing(dash) {
8
+ if (!dash)
9
+ return "solid";
10
+ if (!("preset" in dash))
11
+ return null;
12
+ const { preset } = dash;
13
+ return preset === "solid" || preset === "dash" || preset === "dot" || preset === "dashDot" ? preset : null;
14
+ }
15
+ /** `current` with `change` and the color `fill` when given, over `fallback` for
16
+ * what it lacks: no line, or one painting nothing, takes the fallback's color, as
17
+ * setting its weight turns it on. Arrowheads, caps and joins are carried. */
18
+ export function changedDrawingLine(current, change, fallback) {
19
+ const fill = current && current.fill !== "none" ? current.fill : fallback.fill;
20
+ return {
21
+ width: change.weight ?? current?.width ?? fallback.weight,
22
+ cap: current?.cap ?? null,
23
+ compound: current?.compound ?? null,
24
+ align: current?.align ?? null,
25
+ fill: change.fill ?? fill,
26
+ dash: change.dash ? drawingDash(change.dash) : (current?.dash ?? drawingDash(fallback.dash)),
27
+ join: current?.join ?? null,
28
+ headEnd: current?.headEnd ?? null,
29
+ tailEnd: current?.tailEnd ?? null,
30
+ };
31
+ }
32
+ /** The dash array the panel's `dash` is at `weight`: scaled by it, so it reads the
33
+ * same at any weight. */
34
+ function portableDashArray(dash, weight) {
35
+ const w = weight || 1;
36
+ switch (dash) {
37
+ case "dash":
38
+ return [3 * w, 3 * w];
39
+ case "dot":
40
+ return [w, 2 * w];
41
+ case "dashDot":
42
+ return [3 * w, 2 * w, w, 2 * w];
43
+ case "solid":
44
+ return null;
45
+ }
46
+ }
47
+ /** A PDF line's dash as one the panel offers, or null for one it doesn't. */
48
+ export function lineDashOfPortable(line) {
49
+ const { dashArray, width } = line;
50
+ if (!dashArray || dashArray.length === 0)
51
+ return "solid";
52
+ for (const dash of ["dash", "dot", "dashDot"]) {
53
+ const preset = portableDashArray(dash, width);
54
+ if (preset?.length === dashArray.length && preset.every((v, i) => Math.abs(v - dashArray[i]) < 1e-6)) {
55
+ return dash;
56
+ }
57
+ }
58
+ return null;
59
+ }
60
+ /** A PDF line of `weight` and `dash` over `base`'s joins and offset. A dot's and a
61
+ * dash-dot's ends are round, as their dots are. */
62
+ function portableLineOf(base, weight, dash) {
63
+ return {
64
+ width: weight,
65
+ lineCap: dash === "dot" || dash === "dashDot" ? "round" : "butt",
66
+ lineJoin: base?.lineJoin ?? "miter",
67
+ miterLimit: base?.miterLimit ?? 10,
68
+ dashArray: portableDashArray(dash, weight),
69
+ dashOffset: base?.dashOffset ?? 0,
70
+ };
71
+ }
72
+ /** `current` with `change`, or a line of `fallback` for a side with none. A new
73
+ * weight alone scales the line's dashes with it, whatever they are. */
74
+ export function changedPortableLine(current, change, fallback) {
75
+ if (!current)
76
+ return portableLineOf(null, change.weight ?? fallback.weight, change.dash ?? fallback.dash);
77
+ const weight = change.weight ?? current.width;
78
+ if (change.dash)
79
+ return portableLineOf(current, weight, change.dash);
80
+ const scale = current.width > 0 ? weight / current.width : 1;
81
+ return {
82
+ ...current,
83
+ width: weight,
84
+ dashArray: current.dashArray ? current.dashArray.map((v) => v * scale) : current.dashArray,
85
+ };
86
+ }
87
+ //# sourceMappingURL=line-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-edit.js","sourceRoot":"","sources":["../src/line-edit.ts"],"names":[],"mappings":"AAeA,qDAAqD;AACrD,SAAS,WAAW,CAAC,IAAc;IAC/B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED;6BAC6B;AAC7B,MAAM,UAAU,iBAAiB,CAAC,IAAsC;IACpE,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC;IAC1B,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/G,CAAC;AAED;;8EAE8E;AAC9E,MAAM,UAAU,kBAAkB,CAC9B,OAAyB,EACzB,MAAqD,EACrD,QAA6D;IAE7D,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC/E,OAAO;QACH,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO,EAAE,KAAK,IAAI,QAAQ,CAAC,MAAM;QACzD,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI;QACzB,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;QACnC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5F,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;QAC3B,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI;QACjC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI;KACpC,CAAC;AACN,CAAC;AAED;0BAC0B;AAC1B,SAAS,iBAAiB,CAAC,IAAc,EAAE,MAAc;IACrD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;IACtB,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,MAAM;YACP,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,KAAK,KAAK;YACN,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,KAAK,SAAS;YACV,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,KAAK,OAAO;YACR,OAAO,IAAI,CAAC;IACpB,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,IAAe;IAC9C,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAClC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACzD,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAU,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACpG,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;oDACoD;AACpD,SAAS,cAAc,CAAC,IAAsB,EAAE,MAAc,EAAE,IAAc;IAC1E,OAAO;QACH,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QAChE,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,OAAO;QACnC,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,EAAE;QAClC,SAAS,EAAE,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC;QAC1C,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC;KACpC,CAAC;AACN,CAAC;AAED;wEACwE;AACxE,MAAM,UAAU,mBAAmB,CAC/B,OAAyB,EACzB,MAAkB,EAClB,QAA4C;IAE5C,IAAI,CAAC,OAAO;QAAE,OAAO,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC;IAC9C,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO;QACH,GAAG,OAAO;QACV,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS;KAC7F,CAAC;AACN,CAAC"}