@docmentis/udoc-editor 0.8.15 → 0.8.17

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/markup.d.ts CHANGED
@@ -1,6 +1,14 @@
1
- import type { ShapeNode } from "@docmentis/udoc-wasm";
1
+ import type { PaintColor, PaintFill, ShapeNode } from "@docmentis/udoc-wasm";
2
2
  import type { ShapePoint } from "@docmentis/udoc-ui/internal";
3
3
  import type { GalleryShape } from "./shape-gallery.js";
4
+ /** What a shape is drawn over an image in. An image has no theme, so these are
5
+ * never scheme colors. */
6
+ export interface MarkupPaint {
7
+ readonly fill: PaintFill;
8
+ readonly line: PaintFill;
9
+ /** A box's label's. */
10
+ readonly text: PaintColor;
11
+ }
4
12
  /** The weight in points a shape is outlined at over a page `width` ×
5
13
  * `height` points: a point per {@link POINTS_PER_LINE_POINT} of its shorter
6
14
  * side, and at least {@link MIN_LINE_WEIGHT}. */
@@ -9,17 +17,29 @@ export declare function markupLineWeight(width: number, height: number): number;
9
17
  * × `height` points: a point per {@link POINTS_PER_TEXT_POINT} of its shorter
10
18
  * side, and at least {@link MIN_TEXT_SIZE}. */
11
19
  export declare function markupTextSize(width: number, height: number): number;
20
+ /**
21
+ * A text box across the box of `p0` and `p1` (the page's points) over a page
22
+ * `page` points in size, its id `id`: a rectangle with no fill or outline, holding
23
+ * `text` in the story `story`, wrapped at its width, in `color` and at the size of
24
+ * a label. It spans at least {@link TEXT_BOX_MIN_WIDTH} ×
25
+ * {@link TEXT_BOX_MIN_HEIGHT} of that size, moved back onto the page where that
26
+ * takes it past the edge.
27
+ */
28
+ export declare function markupTextBox(id: string, story: string, text: string, p0: ShapePoint, p1: ShapePoint, page: {
29
+ width: number;
30
+ height: number;
31
+ }, color: PaintColor): ShapeNode;
12
32
  /**
13
33
  * The drawing shape `shape` spanning `p0 → p1` (the page's points) over a
14
34
  * page `page` points in size, its id `id` and a box's text story `story` —
15
- * outlined in {@link MARKUP_COLOR} and unfilled, so the image shows through;
16
- * an arrowed line's head at `p1`, and at `p0` too for a double arrow; any
17
- * shape but a line a box, with an empty label to type into. A line runs from
35
+ * in `paint`, a line and an open outline taking no fill; an arrowed line's head at
36
+ * `p1`, and at `p0` too for a double arrow; any shape but a line a box, with an
37
+ * empty label to type into. A line runs from
18
38
  * `p0` to `p1` by flipping the box its preset runs corner to corner across; a
19
39
  * box is never flipped, as a flip turns its label upside down.
20
40
  */
21
41
  export declare function markupShape(id: string, story: string, shape: GalleryShape, p0: ShapePoint, p1: ShapePoint, page: {
22
42
  width: number;
23
43
  height: number;
24
- }): ShapeNode;
44
+ }, paint: MarkupPaint): ShapeNode;
25
45
  //# sourceMappingURL=markup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markup.d.ts","sourceRoot":"","sources":["../src/markup.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAuC,SAAS,EAAY,MAAM,sBAAsB,CAAC;AACrG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAmBvD;;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;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACvB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC,SAAS,CAsCX"}
1
+ {"version":3,"file":"markup.d.ts","sourceRoot":"","sources":["../src/markup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAA2B,SAAS,EAAY,MAAM,sBAAsB,CAAC;AAChH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;2BAC2B;AAC3B,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC7B;AAqBD;;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;AA0BD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CACzB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACvC,KAAK,EAAE,UAAU,GAClB,SAAS,CA+CX;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACvB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACvC,KAAK,EAAE,WAAW,GACnB,SAAS,CAsCX"}
package/dist/markup.js CHANGED
@@ -1,6 +1,3 @@
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
1
  /** The page size, in points, one point of line weight is drawn per — so a
5
2
  * shape's outline reads at the page's size, a photo's as a screenshot's. */
6
3
  const POINTS_PER_LINE_POINT = 250;
@@ -10,6 +7,11 @@ const MIN_LINE_WEIGHT = 2;
10
7
  const POINTS_PER_TEXT_POINT = 30;
11
8
  /** The smallest a label is set, in points. */
12
9
  const MIN_TEXT_SIZE = 12;
10
+ /** The least a text box spans across and down, in multiples of its text's size:
11
+ * room for a word or two, on a line. A box dropped with a click is sized in
12
+ * points, which on a large image is too narrow for one letter a line. */
13
+ const TEXT_BOX_MIN_WIDTH = 6;
14
+ const TEXT_BOX_MIN_HEIGHT = 1.5;
13
15
  /** The weight in points a shape is outlined at over a page `width` ×
14
16
  * `height` points: a point per {@link POINTS_PER_LINE_POINT} of its shorter
15
17
  * side, and at least {@link MIN_LINE_WEIGHT}. */
@@ -25,9 +27,9 @@ export function markupTextSize(width, height) {
25
27
  /** An arrowhead at a line's end. */
26
28
  const ARROWHEAD = { kind: "triangle", width: "medium", length: "medium" };
27
29
  /** A box's text body, empty: one paragraph centred in it, which the text typed
28
- * into it takes the markup color and `size` points from — what a press in the
29
- * box lands a caret in, as in a slide's shape. Its story is `story`. */
30
- function labelBody(story, size) {
30
+ * into it takes `color` and `size` points from — what a press in the box lands a
31
+ * caret in, as in a slide's shape. Its story is `story`. */
32
+ function labelBody(story, size, color) {
31
33
  return {
32
34
  properties: { anchor: "center" },
33
35
  story: {
@@ -35,8 +37,8 @@ function labelBody(story, size) {
35
37
  blocks: [
36
38
  {
37
39
  paragraph: {
38
- properties: [{ align: "center" }],
39
- end: { mark: [{ size }, { fill: { solid: MARKUP_COLOR } }] },
40
+ properties: { props: [{ align: "center" }] },
41
+ end: { mark: { properties: { props: [{ size }, { fill: { solid: color } }] } } },
40
42
  spans: [],
41
43
  },
42
44
  },
@@ -44,23 +46,79 @@ function labelBody(story, size) {
44
46
  },
45
47
  };
46
48
  }
49
+ /**
50
+ * A text box across the box of `p0` and `p1` (the page's points) over a page
51
+ * `page` points in size, its id `id`: a rectangle with no fill or outline, holding
52
+ * `text` in the story `story`, wrapped at its width, in `color` and at the size of
53
+ * a label. It spans at least {@link TEXT_BOX_MIN_WIDTH} ×
54
+ * {@link TEXT_BOX_MIN_HEIGHT} of that size, moved back onto the page where that
55
+ * takes it past the edge.
56
+ */
57
+ export function markupTextBox(id, story, text, p0, p1, page, color) {
58
+ const size = markupTextSize(page.width, page.height);
59
+ const properties = { props: [{ size }, { fill: { solid: color } }] };
60
+ const width = Math.max(Math.abs(p1.x - p0.x), size * TEXT_BOX_MIN_WIDTH);
61
+ const height = Math.max(Math.abs(p1.y - p0.y), size * TEXT_BOX_MIN_HEIGHT);
62
+ return {
63
+ shape: {
64
+ id,
65
+ nonVisual: { name: "TextBox", description: null, title: null, hidden: false, placeholder: null },
66
+ properties: {
67
+ transform: {
68
+ offset: {
69
+ x: Math.max(0, Math.min(Math.min(p0.x, p1.x), page.width - width)),
70
+ y: Math.max(0, Math.min(Math.min(p0.y, p1.y), page.height - height)),
71
+ },
72
+ extents: { width, height },
73
+ rotation: 0,
74
+ flipH: false,
75
+ flipV: false,
76
+ },
77
+ geometry: { preset: { preset: "rect", adjustValues: [] } },
78
+ fill: "none",
79
+ line: null,
80
+ effects: null,
81
+ scene3d: null,
82
+ shape3d: null,
83
+ },
84
+ style: null,
85
+ textBody: {
86
+ properties: { wrap: "square" },
87
+ story: {
88
+ id: story,
89
+ blocks: [
90
+ {
91
+ paragraph: {
92
+ properties: { props: [] },
93
+ end: { mark: { properties } },
94
+ spans: [{ regular: { properties, text } }],
95
+ },
96
+ },
97
+ ],
98
+ },
99
+ },
100
+ textTransform: null,
101
+ diagramPoint: null,
102
+ },
103
+ };
104
+ }
47
105
  /**
48
106
  * The drawing shape `shape` spanning `p0 → p1` (the page's points) over a
49
107
  * page `page` points in size, its id `id` and a box's text story `story` —
50
- * outlined in {@link MARKUP_COLOR} and unfilled, so the image shows through;
51
- * an arrowed line's head at `p1`, and at `p0` too for a double arrow; any
52
- * shape but a line a box, with an empty label to type into. A line runs from
108
+ * in `paint`, a line and an open outline taking no fill; an arrowed line's head at
109
+ * `p1`, and at `p0` too for a double arrow; any shape but a line a box, with an
110
+ * empty label to type into. A line runs from
53
111
  * `p0` to `p1` by flipping the box its preset runs corner to corner across; a
54
112
  * box is never flipped, as a flip turns its label upside down.
55
113
  */
56
- export function markupShape(id, story, shape, p0, p1, page) {
114
+ export function markupShape(id, story, shape, p0, p1, page, paint) {
57
115
  const box = !shape.line;
58
116
  const line = {
59
117
  width: markupLineWeight(page.width, page.height),
60
118
  cap: "round",
61
119
  compound: null,
62
120
  align: null,
63
- fill: { solid: MARKUP_COLOR },
121
+ fill: paint.line,
64
122
  dash: null,
65
123
  join: "round",
66
124
  headEnd: shape.arrows === "both" ? ARROWHEAD : null,
@@ -79,14 +137,14 @@ export function markupShape(id, story, shape, p0, p1, page) {
79
137
  flipV: !box && p1.y < p0.y,
80
138
  },
81
139
  geometry: { preset: { preset: shape.preset, adjustValues: [] } },
82
- fill: "none",
140
+ fill: box && !shape.outline ? paint.fill : "none",
83
141
  line,
84
142
  effects: null,
85
143
  scene3d: null,
86
144
  shape3d: null,
87
145
  },
88
146
  style: null,
89
- textBody: box ? labelBody(story, markupTextSize(page.width, page.height)) : null,
147
+ textBody: box ? labelBody(story, markupTextSize(page.width, page.height), paint.text) : null,
90
148
  textTransform: null,
91
149
  diagramPoint: null,
92
150
  },
@@ -1 +1 @@
1
- {"version":3,"file":"markup.js","sourceRoot":"","sources":["../src/markup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markup.js","sourceRoot":"","sources":["../src/markup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { PaintColor, PaintFill } from "@docmentis/udoc-wasm";
2
+ /** The opacity `color` paints with, `0` to `1`: its alpha transforms in order,
3
+ * over opaque. */
4
+ export declare function colorOpacity(color: PaintColor): number;
5
+ /** `color` at `opacity`, in place of the alpha transforms it had. Opaque states
6
+ * none, as a color with no alpha transform is. */
7
+ export declare function withOpacity(color: PaintColor, opacity: number): PaintColor;
8
+ /** The opacity `fill` paints with, or null for a fill with no one color to carry
9
+ * it: no fill, a gradient, a pattern or a picture. */
10
+ export declare function fillOpacity(fill: PaintFill): number | null;
11
+ /** `fill` at `opacity`, or as it is for a fill with no one color to carry it. */
12
+ export declare function fillWithOpacity(fill: PaintFill, opacity: number): PaintFill;
13
+ /**
14
+ * What a new shape paints a side with, from what was last specified for it: its
15
+ * `color` at its `opacity`, an opacity alone taking `defaultColor`. Null with
16
+ * neither specified, for the document's own default.
17
+ */
18
+ export declare function specifiedFill(color: PaintColor | null, opacity: number | null, defaultColor: PaintColor): PaintFill | null;
19
+ //# sourceMappingURL=opacity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opacity.d.ts","sourceRoot":"","sources":["../src/opacity.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAuB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAQvF;mBACmB;AACnB,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAStD;AAED;mDACmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAG1E;AAED;uDACuD;AACvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAE1D;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CACzB,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,YAAY,EAAE,UAAU,GACzB,SAAS,GAAG,IAAI,CAGlB"}
@@ -0,0 +1,45 @@
1
+ function isAlpha(transform) {
2
+ return (typeof transform === "object" && ("alpha" in transform || "alphaOff" in transform || "alphaMod" in transform));
3
+ }
4
+ /** The opacity `color` paints with, `0` to `1`: its alpha transforms in order,
5
+ * over opaque. */
6
+ export function colorOpacity(color) {
7
+ let opacity = 1;
8
+ for (const transform of color.transforms) {
9
+ if (typeof transform !== "object")
10
+ continue;
11
+ if ("alpha" in transform)
12
+ opacity = transform.alpha;
13
+ else if ("alphaMod" in transform)
14
+ opacity *= transform.alphaMod;
15
+ else if ("alphaOff" in transform)
16
+ opacity += transform.alphaOff;
17
+ }
18
+ return Math.min(1, Math.max(0, opacity));
19
+ }
20
+ /** `color` at `opacity`, in place of the alpha transforms it had. Opaque states
21
+ * none, as a color with no alpha transform is. */
22
+ export function withOpacity(color, opacity) {
23
+ const transforms = color.transforms.filter((transform) => !isAlpha(transform));
24
+ return { ...color, transforms: opacity < 1 ? [...transforms, { alpha: opacity }] : transforms };
25
+ }
26
+ /** The opacity `fill` paints with, or null for a fill with no one color to carry
27
+ * it: no fill, a gradient, a pattern or a picture. */
28
+ export function fillOpacity(fill) {
29
+ return typeof fill === "object" && "solid" in fill ? colorOpacity(fill.solid) : null;
30
+ }
31
+ /** `fill` at `opacity`, or as it is for a fill with no one color to carry it. */
32
+ export function fillWithOpacity(fill, opacity) {
33
+ return typeof fill === "object" && "solid" in fill ? { solid: withOpacity(fill.solid, opacity) } : fill;
34
+ }
35
+ /**
36
+ * What a new shape paints a side with, from what was last specified for it: its
37
+ * `color` at its `opacity`, an opacity alone taking `defaultColor`. Null with
38
+ * neither specified, for the document's own default.
39
+ */
40
+ export function specifiedFill(color, opacity, defaultColor) {
41
+ if (!color && opacity === null)
42
+ return null;
43
+ return { solid: withOpacity(color ?? defaultColor, opacity ?? colorOpacity(color ?? defaultColor)) };
44
+ }
45
+ //# sourceMappingURL=opacity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opacity.js","sourceRoot":"","sources":["../src/opacity.ts"],"names":[],"mappings":"AAKA,SAAS,OAAO,CAAC,SAA8B;IAC3C,OAAO,CACH,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,OAAO,IAAI,SAAS,IAAI,UAAU,IAAI,SAAS,IAAI,UAAU,IAAI,SAAS,CAAC,CAChH,CAAC;AACN,CAAC;AAED;mBACmB;AACnB,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC1C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACvC,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,SAAS;QAC5C,IAAI,OAAO,IAAI,SAAS;YAAE,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC;aAC/C,IAAI,UAAU,IAAI,SAAS;YAAE,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC;aAC3D,IAAI,UAAU,IAAI,SAAS;YAAE,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC;IACpE,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;mDACmD;AACnD,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAE,OAAe;IAC1D,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/E,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;AACpG,CAAC;AAED;uDACuD;AACvD,MAAM,UAAU,WAAW,CAAC,IAAe;IACvC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzF,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,eAAe,CAAC,IAAe,EAAE,OAAe;IAC5D,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5G,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CACzB,KAAwB,EACxB,OAAsB,EACtB,YAAwB;IAExB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,YAAY,EAAE,OAAO,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC;AACzG,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { CommandDef } from "@docmentis/udoc-ui/internal";
2
+ import type { EditHost } from "./edit-client.js";
3
+ import type { I18n, MessageKey } from "./i18n/index.js";
4
+ /** The Resize Page dialog, mounted into a shell. */
5
+ export interface PageResize {
6
+ /** Open the dialog on the current page. */
7
+ open(): void;
8
+ destroy(): void;
9
+ }
10
+ /** Mount the Resize Page dialog into `host` — once, re-seeded with the current
11
+ * page's size each open, as the last frame measured it. */
12
+ export declare function mountPageResize(host: EditHost, i18n: I18n): PageResize;
13
+ /** The Page tab's page commands, over `host` once edit mode is mounted, Resize
14
+ * Page opening its dialog with `resize`. */
15
+ export declare function pageCommands(host: () => EditHost | null, resize: () => void): Readonly<Record<string, CommandDef<MessageKey>>>;
16
+ //# sourceMappingURL=page-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-commands.d.ts","sourceRoot":"","sources":["../src/page-commands.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAkB,UAAU,EAAyB,MAAM,6BAA6B,CAAC;AAGrG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAiDxD,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACvB,2CAA2C;IAC3C,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;CACnB;AAED;4DAC4D;AAC5D,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,UAAU,CAkBtE;AAED;6CAC6C;AAC7C,wBAAgB,YAAY,CACxB,IAAI,EAAE,MAAM,QAAQ,GAAG,IAAI,EAC3B,MAAM,EAAE,MAAM,IAAI,GACnB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CA+ClD"}
@@ -0,0 +1,122 @@
1
+ // A PDF's Page tab's page commands: a blank page after the current one, and the
2
+ // current page deleted, turned a quarter turn or resized — the pages picked in
3
+ // the thumbnails in its place, but for a resize, which names one page.
4
+ import { allowsEdit, ICON_DELETE, ICON_PAGE_ADD, ICON_ROTATE_LEFT, ICON_ROTATE_RIGHT, } from "@docmentis/udoc-ui/internal";
5
+ import { pageSizeInfo } from "./components/PageControls.js";
6
+ import { createPageSettingsModal } from "./components/PageSettingsModal.js";
7
+ import { ICON_PAGE_RESIZE } from "./icons.js";
8
+ import { applyPageEdit } from "./page-controls.js";
9
+ /** Whether `caps` holds pages picked in the thumbnails. */
10
+ function pagesPicked(caps) {
11
+ return allowsEdit(caps, "rotatePages");
12
+ }
13
+ /** Whether a PDF's page edits are live in `c`. */
14
+ function whenPortable(c) {
15
+ return c.ready && c.docType === "portable";
16
+ }
17
+ /** Delete Page, greyed where it would take a PDF's last page: its only one, or
18
+ * every page picked. */
19
+ function whenDeletable(c) {
20
+ if (!whenPortable(c))
21
+ return false;
22
+ return pagesPicked(c.selection) ? allowsEdit(c.selection, "deletePages") : c.pageCount > 1;
23
+ }
24
+ /** Insert a blank page after the last page picked, or else the current one —
25
+ * a page the size of the one it follows — and go to it. */
26
+ async function createPage(host) {
27
+ const { selectionCaps, selectedPages, pageIndex } = host.store.getState();
28
+ const picked = allowsEdit(selectionCaps, "insertPage");
29
+ const index = (picked ? Math.max(...selectedPages) : pageIndex) + 1;
30
+ await (picked
31
+ ? host.commit(() => host.client.executeOnSelection({ kind: "page", edit: { kind: "insertPage" } }))
32
+ : applyPageEdit(host, { kind: "insert", index }));
33
+ host.store.dispatch({ type: "NAVIGATE_TO_PAGE", pageIndex: index });
34
+ }
35
+ /** Delete the pages picked, or else the current one. */
36
+ function deletePages(host) {
37
+ const { selectionCaps, pageIndex } = host.store.getState();
38
+ return pagesPicked(selectionCaps)
39
+ ? host.commit(() => host.client.executeOnSelection({ kind: "page", edit: { kind: "deletePages" } }))
40
+ : applyPageEdit(host, { kind: "delete", index: pageIndex });
41
+ }
42
+ /** Turn the pages picked a quarter turn, or else the current one. */
43
+ function rotatePages(host, clockwise) {
44
+ const { selectionCaps, pageIndex } = host.store.getState();
45
+ return pagesPicked(selectionCaps)
46
+ ? host.commit(() => host.client.executeOnSelection({ kind: "page", edit: { kind: "rotatePages", clockwise } }))
47
+ : applyPageEdit(host, { kind: "rotate", index: pageIndex, clockwise });
48
+ }
49
+ /** Mount the Resize Page dialog into `host` — once, re-seeded with the current
50
+ * page's size each open, as the last frame measured it. */
51
+ export function mountPageResize(host, i18n) {
52
+ const modal = createPageSettingsModal(i18n);
53
+ modal.mount(host.root);
54
+ return {
55
+ open() {
56
+ const index = host.store.getState().pageIndex;
57
+ const shown = host.pageView(index);
58
+ if (!shown)
59
+ return;
60
+ const { width, height } = pageSizeInfo(shown.view, shown.scale);
61
+ modal.open({
62
+ index,
63
+ width,
64
+ height,
65
+ onResize: (w, h) => void applyPageEdit(host, { kind: "resize", index, width: w, height: h }),
66
+ });
67
+ },
68
+ destroy: () => modal.destroy(),
69
+ };
70
+ }
71
+ /** The Page tab's page commands, over `host` once edit mode is mounted, Resize
72
+ * Page opening its dialog with `resize`. */
73
+ export function pageCommands(host, resize) {
74
+ const withHost = (run) => () => {
75
+ const mounted = host();
76
+ if (mounted)
77
+ void run(mounted);
78
+ };
79
+ return {
80
+ pageCreate: {
81
+ id: "pageCreate",
82
+ label: "thumbnails.insertPage",
83
+ icon: ICON_PAGE_ADD,
84
+ group: "page",
85
+ run: { kind: "action", press: withHost(createPage) },
86
+ enabledWhen: whenPortable,
87
+ },
88
+ pageDelete: {
89
+ id: "pageDelete",
90
+ label: "thumbnails.deletePage",
91
+ icon: ICON_DELETE,
92
+ group: "page",
93
+ run: { kind: "action", press: withHost(deletePages) },
94
+ enabledWhen: whenDeletable,
95
+ },
96
+ pageRotateLeft: {
97
+ id: "pageRotateLeft",
98
+ label: "thumbnails.rotateLeft",
99
+ icon: ICON_ROTATE_LEFT,
100
+ group: "page",
101
+ run: { kind: "action", press: withHost((mounted) => rotatePages(mounted, false)) },
102
+ enabledWhen: whenPortable,
103
+ },
104
+ pageRotateRight: {
105
+ id: "pageRotateRight",
106
+ label: "thumbnails.rotateRight",
107
+ icon: ICON_ROTATE_RIGHT,
108
+ group: "page",
109
+ run: { kind: "action", press: withHost((mounted) => rotatePages(mounted, true)) },
110
+ enabledWhen: whenPortable,
111
+ },
112
+ pageResize: {
113
+ id: "pageResize",
114
+ label: "command.pageResize",
115
+ icon: ICON_PAGE_RESIZE,
116
+ group: "page",
117
+ run: { kind: "action", press: resize },
118
+ enabledWhen: whenPortable,
119
+ },
120
+ };
121
+ }
122
+ //# sourceMappingURL=page-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-commands.js","sourceRoot":"","sources":["../src/page-commands.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,36 @@ import type { I18n } from "./i18n/index.js";
4
4
  * The spacing the page controls show with. The insert strip is sized from the
5
5
  * gap × the frame scale, so it fills the gap at every zoom. The paddings are
6
6
  * screen-fixed (CSS px), so the rail in the right padding stays a constant size
7
- * on screen — the side paddings are wide enough that the rail (offset + ~26px)
7
+ * on screen — the side paddings are wide enough that the rail (offset + ~30px)
8
8
  * clears the virtual scrollbar at fit-width.
9
9
  */
10
10
  export declare const PAGE_CONTROLS_SPACING: PageSpacing;
11
+ /** A page-structure edit addressed by index: the page controls' verbs. */
12
+ export type PageStructureEdit = {
13
+ kind: "insert";
14
+ index: number;
15
+ } | {
16
+ kind: "delete";
17
+ index: number;
18
+ } | {
19
+ kind: "reorder";
20
+ from: number;
21
+ to: number;
22
+ } | {
23
+ kind: "rotate";
24
+ index: number;
25
+ clockwise: boolean;
26
+ } | {
27
+ kind: "resize";
28
+ index: number;
29
+ width: number;
30
+ height: number;
31
+ };
32
+ /**
33
+ * Run `edit` on `host`'s document. Commands address a page by id: this reads
34
+ * the addressed page's id first, and skips the edit when that page is gone.
35
+ */
36
+ export declare function applyPageEdit(host: UIShellHost, edit: PageStructureEdit): Promise<void>;
11
37
  /**
12
38
  * Whether the page controls show in `s`: in edit mode, for a doc type whose
13
39
  * pages reorder ({@link PAGE_CONTROLLED}), in the continuous single-page
@@ -1 +1 @@
1
- {"version":3,"file":"page-controls.d.ts","sourceRoot":"","sources":["../src/page-controls.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAGrF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAM5C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAGnC,CAAC;AAmDF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED,wGAAwG;AACxG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,CA+D3E"}
1
+ {"version":3,"file":"page-controls.d.ts","sourceRoot":"","sources":["../src/page-controls.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAGrF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAM5C;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAGnC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,MAAM,iBAAiB,GACvB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAG7C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAIrD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAkCvE;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7F;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED,wGAAwG;AACxG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,CAwE3E"}
@@ -8,7 +8,7 @@ const GAP_PT = 24;
8
8
  * The spacing the page controls show with. The insert strip is sized from the
9
9
  * gap × the frame scale, so it fills the gap at every zoom. The paddings are
10
10
  * screen-fixed (CSS px), so the rail in the right padding stays a constant size
11
- * on screen — the side paddings are wide enough that the rail (offset + ~26px)
11
+ * on screen — the side paddings are wide enough that the rail (offset + ~30px)
12
12
  * clears the virtual scrollbar at fit-width.
13
13
  */
14
14
  export const PAGE_CONTROLS_SPACING = {
@@ -45,6 +45,17 @@ function pageCommand(edit, id) {
45
45
  return editPage({ resizePage: { id, size: { width: edit.width, height: edit.height } } });
46
46
  }
47
47
  }
48
+ /**
49
+ * Run `edit` on `host`'s document. Commands address a page by id: this reads
50
+ * the addressed page's id first, and skips the edit when that page is gone.
51
+ */
52
+ export async function applyPageEdit(host, edit) {
53
+ const page = addressedPage(edit);
54
+ const id = page === null ? "" : await host.client.portable.pageIdByIndex(page);
55
+ if (id === undefined)
56
+ return;
57
+ await host.commit(() => host.client.execute(pageCommand(edit, id)));
58
+ }
48
59
  /** The doc types whose pages the page controls move, rotate, delete and
49
60
  * insert: the paginated, page-reorderable ones — PDF today. */
50
61
  const PAGE_CONTROLLED = new Set(["portable"]);
@@ -63,19 +74,25 @@ export function pageControlsShown(s) {
63
74
  }
64
75
  /** Mount the page controls into `host`, shown while {@link pageControlsShown}; returns the teardown. */
65
76
  export function mountPageControls(host, i18n) {
66
- // Mounted once and reused for whichever page's "more" button is clicked.
77
+ // Mounted once and reused for whichever page's resize button is clicked.
67
78
  const settings = createPageSettingsModal(i18n);
68
79
  settings.mount(host.root);
69
- // Commands address a page by id: read the addressed page's id first, and
70
- // skip the edit when that page is gone.
71
- const pageEditAt = async (edit) => {
72
- const page = addressedPage(edit);
73
- const id = page === null ? "" : await host.client.portable.pageIdByIndex(page);
74
- if (id === undefined)
75
- return;
76
- await host.commit(() => host.client.execute(pageCommand(edit, id)));
77
- };
80
+ const pageEditAt = (edit) => applyPageEdit(host, edit);
78
81
  const pageCount = () => host.store.getState().pageCount;
82
+ // Move the page at `index` one place, `by` -1 up or 1 down, the view going
83
+ // with it: the scroll shifts by what it moved past, its neighbour and a gap,
84
+ // so it stays where it shows and the rail's button under the pointer, to press
85
+ // again. A neighbour not measured yet leaves that unknown: the view goes to the
86
+ // page instead.
87
+ const movePage = async (index, by) => {
88
+ const neighbour = index + by;
89
+ const { height } = await host.client.pageDisplaySize(0, neighbour);
90
+ await pageEditAt({ kind: "reorder", from: index, to: neighbour });
91
+ const { scrollX, scrollY } = host.store.getState();
92
+ host.store.dispatch(height > 0
93
+ ? { type: "SCROLL_TO", x: scrollX, y: scrollY + by * (height + GAP_PT) }
94
+ : { type: "NAVIGATE_TO_PAGE", pageIndex: neighbour });
95
+ };
79
96
  function show(shown) {
80
97
  if (!shown) {
81
98
  host.removeOverlay("udoc:page-insert");
@@ -97,8 +114,8 @@ export function mountPageControls(host, i18n) {
97
114
  i18n,
98
115
  pageCount,
99
116
  hoveredPage: () => host.hoveredPage(),
100
- onMoveUp: (index) => void pageEditAt({ kind: "reorder", from: index, to: index - 1 }),
101
- onMoveDown: (index) => void pageEditAt({ kind: "reorder", from: index, to: index + 1 }),
117
+ onMoveUp: (index) => void movePage(index, -1),
118
+ onMoveDown: (index) => void movePage(index, 1),
102
119
  onRotate: (index, clockwise) => void pageEditAt({ kind: "rotate", index, clockwise }),
103
120
  onDelete: (index) => void pageEditAt({ kind: "delete", index }),
104
121
  onOpenSettings: (index, size) => settings.open({
@@ -106,7 +123,6 @@ export function mountPageControls(host, i18n) {
106
123
  width: size.width,
107
124
  height: size.height,
108
125
  onResize: (width, height) => void pageEditAt({ kind: "resize", index, width, height }),
109
- onRotate: (clockwise) => void pageEditAt({ kind: "rotate", index, clockwise }),
110
126
  }),
111
127
  }));
112
128
  }
@@ -1 +1 @@
1
- {"version":3,"file":"page-controls.js","sourceRoot":"","sources":["../src/page-controls.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAG5E;2DAC2D;AAC3D,MAAM,MAAM,GAAG,EAAE,CAAC;AAElB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IAC9C,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACrF,GAAG,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;CAChD,CAAC;AAeF;oDACoD;AACpD,SAAS,aAAa,CAAC,IAAuB;IAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACT,OAAO,IAAI,CAAC;QAChB,KAAK,SAAS;YACV,OAAO,IAAI,CAAC,IAAI,CAAC;QACrB;YACI,OAAO,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;AACL,CAAC;AAED;;mDAEmD;AACnD,SAAS,WAAW,CAAC,IAAuB,EAAE,EAAU;IACpD,MAAM,QAAQ,GAAG,CAAC,OAAoB,EAAe,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAClG,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3D,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,KAAK,SAAS;YACV,OAAO,QAAQ,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/E,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAClG,CAAC;AACL,CAAC;AAED;gEACgE;AAChE,MAAM,eAAe,GAA0B,IAAI,GAAG,CAAW,CAAC,UAAU,CAAC,CAAC,CAAC;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAU;IACxC,OAAO,CACH,CAAC,CAAC,IAAI,KAAK,MAAM;QACjB,CAAC,CAAC,UAAU,KAAK,YAAY;QAC7B,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,YAAY;QAC7C,CAAC,CAAC,OAAO,KAAK,IAAI;QAClB,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CACjC,CAAC;AACN,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,IAAU;IAC3D,yEAAyE;IACzE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1B,yEAAyE;IACzE,wCAAwC;IACxC,MAAM,UAAU,GAAG,KAAK,EAAE,IAAuB,EAAiB,EAAE;QAChE,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC/E,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC;IAExD,SAAS,IAAI,CAAC,KAAc;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;YACvC,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;YACxC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,UAAU,CACX,kBAAkB,EAClB,WAAW,CAAC;YACR,IAAI;YACJ,KAAK,EAAE,MAAM;YACb,SAAS;YACT,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC/D,0DAA0D;YAC1D,8DAA8D;YAC9D,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;SACzC,CAAC,CACL,CAAC;QACF,qEAAqE;QACrE,iCAAiC;QACjC,IAAI,CAAC,UAAU,CACX,mBAAmB,EACnB,WAAW,CAAC;YACR,IAAI;YACJ,SAAS;YACT,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;YACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;YACrF,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;YACvF,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACrF,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC/D,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAC5B,QAAQ,CAAC,IAAI,CAAC;gBACV,KAAK;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;gBACtF,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;aACjF,CAAC;SACT,CAAC,CACL,CAAC;IACN,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAC3E,OAAO,GAAG,EAAE;QACR,WAAW,EAAE,CAAC;QACd,QAAQ,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"page-controls.js","sourceRoot":"","sources":["../src/page-controls.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAG5E;2DAC2D;AAC3D,MAAM,MAAM,GAAG,EAAE,CAAC;AAElB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IAC9C,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACrF,GAAG,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;CAChD,CAAC;AAeF;oDACoD;AACpD,SAAS,aAAa,CAAC,IAAuB;IAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACT,OAAO,IAAI,CAAC;QAChB,KAAK,SAAS;YACV,OAAO,IAAI,CAAC,IAAI,CAAC;QACrB;YACI,OAAO,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;AACL,CAAC;AAED;;mDAEmD;AACnD,SAAS,WAAW,CAAC,IAAuB,EAAE,EAAU;IACpD,MAAM,QAAQ,GAAG,CAAC,OAAoB,EAAe,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAClG,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3D,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,KAAK,SAAS;YACV,OAAO,QAAQ,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/E,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAClG,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAiB,EAAE,IAAuB;IAC1E,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/E,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO;IAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;gEACgE;AAChE,MAAM,eAAe,GAA0B,IAAI,GAAG,CAAW,CAAC,UAAU,CAAC,CAAC,CAAC;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAU;IACxC,OAAO,CACH,CAAC,CAAC,IAAI,KAAK,MAAM;QACjB,CAAC,CAAC,UAAU,KAAK,YAAY;QAC7B,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,YAAY;QAC7C,CAAC,CAAC,OAAO,KAAK,IAAI;QAClB,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CACjC,CAAC;AACN,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,IAAU;IAC3D,yEAAyE;IACzE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1B,MAAM,UAAU,GAAG,CAAC,IAAuB,EAAiB,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC;IAExD,2EAA2E;IAC3E,6EAA6E;IAC7E,+EAA+E;IAC/E,gFAAgF;IAChF,gBAAgB;IAChB,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAE,EAAU,EAAiB,EAAE;QAChE,MAAM,SAAS,GAAG,KAAK,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACnE,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,QAAQ,CACf,MAAM,GAAG,CAAC;YACN,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE;YACxE,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,CAC3D,CAAC;IACN,CAAC,CAAC;IAEF,SAAS,IAAI,CAAC,KAAc;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;YACvC,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;YACxC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,UAAU,CACX,kBAAkB,EAClB,WAAW,CAAC;YACR,IAAI;YACJ,KAAK,EAAE,MAAM;YACb,SAAS;YACT,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC/D,0DAA0D;YAC1D,8DAA8D;YAC9D,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;SACzC,CAAC,CACL,CAAC;QACF,qEAAqE;QACrE,iCAAiC;QACjC,IAAI,CAAC,UAAU,CACX,mBAAmB,EACnB,WAAW,CAAC;YACR,IAAI;YACJ,SAAS;YACT,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;YACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7C,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACrF,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC/D,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAC5B,QAAQ,CAAC,IAAI,CAAC;gBACV,KAAK;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;aACzF,CAAC;SACT,CAAC,CACL,CAAC;IACN,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAC3E,OAAO,GAAG,EAAE;QACR,WAAW,EAAE,CAAC;QACd,QAAQ,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC,CAAC;AACN,CAAC"}