@docmentis/udoc-editor 0.8.5 → 0.8.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"edit-mode.d.ts","sourceRoot":"","sources":["../src/edit-mode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAsBrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAQ5C,6FAA6F;AAC7F,MAAM,WAAW,QAAS,SAAQ,WAAW;IACzC,8EAA8E;IAC9E,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,kEAAkE;IAClE,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,wDAAwD;IACxD,WAAW,IAAI,UAAU,CAAC;IAC1B,kDAAkD;IAClD,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,uEAAuE;IACvE,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAwGD,4CAA4C;AAC5C,wBAAgB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,QAAQ,CAqG7D"}
1
+ {"version":3,"file":"edit-mode.d.ts","sourceRoot":"","sources":["../src/edit-mode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAsBrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAS5C,6FAA6F;AAC7F,MAAM,WAAW,QAAS,SAAQ,WAAW;IACzC,8EAA8E;IAC9E,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,kEAAkE;IAClE,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,wDAAwD;IACxD,WAAW,IAAI,UAAU,CAAC;IAC1B,kDAAkD;IAClD,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,uEAAuE;IACvE,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAyGD,4CAA4C;AAC5C,wBAAgB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,QAAQ,CAsG7D"}
package/dist/edit-mode.js CHANGED
@@ -14,7 +14,8 @@ import { mountNewSlide, newSlideCommand } from "./new-slide.js";
14
14
  import { mountPageControls, PAGE_CONTROLS_SPACING, pageControlsShown } from "./page-controls.js";
15
15
  import { ALL_MODES, EDIT_MODE } from "./mode.js";
16
16
  import { editState, INITIAL_EDIT_STATE, updateEditState } from "./state.js";
17
- import { RULER, rulerShown, setShowRuler } from "./ruler.js";
17
+ import { createRuler, rulerShown, setShowRuler } from "./ruler.js";
18
+ import { selectionRuler } from "./ruler-edits.js";
18
19
  import { editorStyles } from "./styles.js";
19
20
  import { editTabs } from "./tabs.js";
20
21
  import { createEditTools } from "./tools.js";
@@ -69,6 +70,7 @@ function mountDocumentState(host) {
69
70
  client.onSelection((state) => updateEditState(store, {
70
71
  selectionText: selectionTextFormat(state.properties),
71
72
  selectionPaint: selectionPaint(state.properties),
73
+ selectionRuler: selectionRuler(state.properties),
72
74
  })),
73
75
  ];
74
76
  return () => {
@@ -116,6 +118,7 @@ export function editMode(options) {
116
118
  let tools = null;
117
119
  let newSlide = null;
118
120
  const grips = createGrips(() => tools);
121
+ const ruler = createRuler(() => host);
119
122
  const mountedTools = () => {
120
123
  if (!tools)
121
124
  throw new Error("udoc: edit mode is not mounted");
@@ -154,7 +157,7 @@ export function editMode(options) {
154
157
  // Edit mode's acts on the selection, a table's rows added over one; view
155
158
  // mode keeps the shell's.
156
159
  contextMenuItems: (state, inTable) => (editing(state) ? (inTable ? TABLE_CONTEXT_MENU : CONTEXT_MENU) : null),
157
- guideBand: (state) => (rulerShown(state) ? RULER : null),
160
+ guideBand: (state) => (rulerShown(state) ? ruler : null),
158
161
  placedShape,
159
162
  selectionChrome: grips.chrome,
160
163
  pressCanvas: (x, y, _ev, canvas) => grips.press(x, y, canvas),
@@ -1 +1 @@
1
- {"version":3,"file":"edit-mode.js","sourceRoot":"","sources":["../src/edit-mode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edit-mode.js","sourceRoot":"","sources":["../src/edit-mode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { RulerAxis, RulerText } from "@docmentis/udoc-wasm";
2
+ /** A margin's edge: the text area's side it bounds. */
3
+ export type RulerEdge = "left" | "top" | "right" | "bottom";
4
+ /** An indent marker, as Word's ruler names them. */
5
+ export type RulerIndent = "firstLine" | "hanging" | "left" | "right";
6
+ /** Which of the ruler's controls — a margin's edge, an indent marker, or the
7
+ * tab stop at `index` in the guide's list. */
8
+ export type RulerControl = {
9
+ readonly kind: "margin";
10
+ readonly edge: RulerEdge;
11
+ } | {
12
+ readonly kind: "indent";
13
+ readonly indent: RulerIndent;
14
+ } | {
15
+ readonly kind: "tab";
16
+ readonly index: number;
17
+ };
18
+ /** A control dropped `by` points along its ruler from where the guide put it. */
19
+ export interface RulerDrop {
20
+ readonly control: RulerControl;
21
+ readonly by: number;
22
+ }
23
+ /** One ruler, as the guide places the controls along it this frame. */
24
+ export interface RulerPlacement {
25
+ /** The layer over the ruler's strip the controls stand in. */
26
+ readonly layer: HTMLElement;
27
+ /** The layer over the content pane a drag along the ruler draws its line
28
+ * across, measured along the ruler as the strip is. */
29
+ readonly pane: HTMLElement;
30
+ /** What the ruler measures, in points from its origin. */
31
+ readonly axis: RulerAxis;
32
+ /** Where the ruler's zero falls along the strip, CSS px, and the CSS px a
33
+ * point spans — what a drag measures its points by. */
34
+ readonly origin: number;
35
+ readonly scale: number;
36
+ /** Where `points` from the origin falls along the strip, CSS px — on the
37
+ * tick there. */
38
+ readonly at: (points: number) => number;
39
+ }
40
+ /** The ruler's controls. */
41
+ export interface RulerControls {
42
+ /**
43
+ * Stand the controls where the guide places them — the margins' edges along
44
+ * each ruler, `text`'s indent markers and tab stops along the horizontal
45
+ * one — and hide those it places nowhere. A ruler whose strip collapsed is
46
+ * null. Those `movable` refuses stay put under a press.
47
+ */
48
+ place(horizontal: RulerPlacement | null, vertical: RulerPlacement | null, text: RulerText | null, movable: (control: RulerControl) => boolean): void;
49
+ }
50
+ /** The ruler's controls for a ruler `thickness` CSS px deep, handing what a
51
+ * drop moved to `drop` — the edit it sends, settling when that is done, or
52
+ * `null` for none, which returns the controls to where they stood. */
53
+ export declare function createRulerControls(thickness: number, drop: (drop: RulerDrop) => Promise<unknown> | null): RulerControls;
54
+ //# sourceMappingURL=ruler-controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruler-controls.d.ts","sourceRoot":"","sources":["../src/ruler-controls.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAiB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAgChF,uDAAuD;AACvD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5D,oDAAoD;AACpD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAErE;+CAC+C;AAC/C,MAAM,MAAM,YAAY,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,iFAAiF;AACjF,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACvB;AAED,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B;4DACwD;IACxD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB;4DACwD;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;sBACkB;IAClB,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AAED,4BAA4B;AAC5B,MAAM,WAAW,aAAa;IAC1B;;;;;OAKG;IACH,KAAK,CACD,UAAU,EAAE,cAAc,GAAG,IAAI,EACjC,QAAQ,EAAE,cAAc,GAAG,IAAI,EAC/B,IAAI,EAAE,SAAS,GAAG,IAAI,EACtB,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,GAC5C,IAAI,CAAC;CACX;AAyED;;uEAEuE;AACvE,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,GACnD,aAAa,CAsNf"}
@@ -0,0 +1,270 @@
1
+ const SVG_NS = "http://www.w3.org/2000/svg";
2
+ /** Half the width of an indent marker's box, and of a tab stop's, CSS px: each
3
+ * shape is drawn about its box's middle pixel, so its 1px strokes fall whole
4
+ * on pixels. */
5
+ const INDENT_HALF = 5.5;
6
+ const TAB_HALF = 4.5;
7
+ /** The depth of the left indent's box, CSS px. */
8
+ const INDENT_BOX = 5;
9
+ /** Half the width of the strip a margin's edge is grabbed by, CSS px. */
10
+ const EDGE_HALF = 3.5;
11
+ /** What a drag snaps to, in points: a sixteenth of an inch from the ruler's
12
+ * zero, as Word's ruler does. */
13
+ const SNAP = 72 / 16;
14
+ /** How long the controls a drop left hold where it left them with no frame
15
+ * arriving after its edit, ms — they settle on the next frame otherwise. */
16
+ const HOLD = 500;
17
+ /** A tab stop's mark by its alignment, as Word's: a stem, and a foot running
18
+ * the way the text runs from the stop — right of a left stop, left of a right
19
+ * one, both ways under a center or a decimal one — or for a bar, the stem
20
+ * alone. A decimal stop adds its point beside the stem. */
21
+ const TAB_MARKS = {
22
+ left: "M4.5 0V6M4.5 5.5H8",
23
+ center: "M4.5 0V6M1 5.5H8",
24
+ right: "M4.5 0V6M1 5.5H4.5",
25
+ decimal: "M4.5 0V6M1 5.5H8",
26
+ bar: "M4.5 0V6",
27
+ };
28
+ /** An SVG `width` × `height` CSS px in `el`, its one path drawn by `d`. */
29
+ function svg(el, width, height, d) {
30
+ const s = document.createElementNS(SVG_NS, "svg");
31
+ s.setAttribute("width", String(width));
32
+ s.setAttribute("height", String(height));
33
+ const path = document.createElementNS(SVG_NS, "path");
34
+ path.setAttribute("d", d);
35
+ s.append(path);
36
+ el.append(s);
37
+ return path;
38
+ }
39
+ /** Move `c` to `at` along its ruler. */
40
+ function move(c, at) {
41
+ if (c.orient === "h")
42
+ c.el.style.left = `${at - c.half}px`;
43
+ else
44
+ c.el.style.top = `${at - c.half}px`;
45
+ }
46
+ /** Return `c` to where the guide placed it, or hide it where it placed it nowhere. */
47
+ function settle(c) {
48
+ c.el.style.display = c.home === null ? "none" : "";
49
+ if (c.home !== null)
50
+ move(c, c.home);
51
+ }
52
+ /** The ruler's controls for a ruler `thickness` CSS px deep, handing what a
53
+ * drop moved to `drop` — the edit it sends, settling when that is done, or
54
+ * `null` for none, which returns the controls to where they stood. */
55
+ export function createRulerControls(thickness, drop) {
56
+ let drag = null;
57
+ /** The controls a drop left where it left them, until its edit is done. */
58
+ let held = new Set();
59
+ /** Whether that edit is done, so the next frame settles them. */
60
+ let released = false;
61
+ /** Make control `name` of `className`, and let a drag take it. */
62
+ const control = (name, className, orient, half) => {
63
+ const el = document.createElement("div");
64
+ el.className = `udoc-ui__ruler-control ${className}`;
65
+ const c = { el, name, orient, half, ruler: null, points: null, home: null, page: null };
66
+ grab(c);
67
+ return c;
68
+ };
69
+ /** A margin's `edge`: the strip it is grabbed by, the full depth of its
70
+ * ruler, over the line the band's canvas draws for it. */
71
+ const edge = (edge) => {
72
+ const orient = edge === "left" || edge === "right" ? "h" : "v";
73
+ return control({ kind: "margin", edge }, `udoc-ui__ruler-edge udoc-ui__ruler-edge--${orient}`, orient, EDGE_HALF);
74
+ };
75
+ /** Indent marker `indent` drawn by `d`, in a box the full depth of the
76
+ * ruler that takes a press only on the shape — the edge under it takes the
77
+ * rest. */
78
+ const indent = (indent, d) => {
79
+ const c = control({ kind: "indent", indent }, "udoc-ui__ruler-marker udoc-ui__ruler-marker--indent", "h", INDENT_HALF);
80
+ svg(c.el, INDENT_HALF * 2, thickness, d);
81
+ return c;
82
+ };
83
+ /** The tab stop at `index`, its mark's foot level with the hanging indent's
84
+ * base. */
85
+ const tab = (index) => {
86
+ const c = control({ kind: "tab", index }, "udoc-ui__ruler-marker udoc-ui__ruler-marker--tab", "h", TAB_HALF);
87
+ c.el.style.top = `${thickness - 12}px`;
88
+ const mark = svg(c.el, TAB_HALF * 2, 6, TAB_MARKS.left);
89
+ const point = document.createElementNS(SVG_NS, "rect");
90
+ point.setAttribute("x", "6");
91
+ point.setAttribute("y", "2");
92
+ point.setAttribute("width", "1");
93
+ point.setAttribute("height", "1");
94
+ mark.after(point);
95
+ return { control: c, mark, point };
96
+ };
97
+ // The margins' edges come first, so the markers standing on one take a
98
+ // press on their shapes, and the edge the press beside them.
99
+ const leftMargin = edge("left");
100
+ const rightMargin = edge("right");
101
+ const topMargin = edge("top");
102
+ const bottomMargin = edge("bottom");
103
+ // The left indent's box sits a pixel above the ruler's baseline, the
104
+ // hanging indent's triangle stands on it, and the first-line indent's hangs
105
+ // from the outer edge to meet it tip to tip; the right indent's stands
106
+ // level with the hanging indent's.
107
+ const floor = thickness - 1.5;
108
+ const base = floor - INDENT_BOX;
109
+ const tip = (base + 0.5) / 2;
110
+ const right = INDENT_HALF * 2 - 0.5;
111
+ const standing = `M0.5 ${base}L${INDENT_HALF} ${tip}L${right} ${base}Z`;
112
+ const firstLine = indent("firstLine", `M0.5 0.5H${right}L${INDENT_HALF} ${tip}Z`);
113
+ const hanging = indent("hanging", standing);
114
+ const leftIndent = indent("left", `M0.5 ${base}H${right}V${floor}H0.5Z`);
115
+ const rightIndent = indent("right", standing);
116
+ const tabs = [];
117
+ /** The dashed line a drag draws across the content pane at the pressed
118
+ * control — down from the horizontal ruler, across from the vertical. */
119
+ const line = document.createElement("div");
120
+ line.style.display = "none";
121
+ /** Draw the drag's line at `at` along `c`'s ruler, or with null, clear it. */
122
+ function drawLine(c, at) {
123
+ line.style.display = at === null ? "none" : "";
124
+ if (at === null)
125
+ return;
126
+ line.className = `udoc-ui__ruler-guide udoc-ui__ruler-guide--${c.orient}`;
127
+ // Its 1px dash centred on the control.
128
+ line.style.left = c.orient === "h" ? `${at - 0.5}px` : "";
129
+ line.style.top = c.orient === "v" ? `${at - 0.5}px` : "";
130
+ }
131
+ /** What a drag on `c` carries, as Word's ruler does: the left indent's box
132
+ * both triangles above it, the hanging indent's triangle the box, a
133
+ * margin's edge the markers measured from it — the left the indents and
134
+ * tab stops, the right the right indent. */
135
+ function carriedBy(c) {
136
+ if (c === leftIndent)
137
+ return [firstLine, hanging, leftIndent];
138
+ if (c === hanging)
139
+ return [hanging, leftIndent];
140
+ if (c === leftMargin)
141
+ return [leftMargin, firstLine, hanging, leftIndent, ...tabs.map((t) => t.control)];
142
+ if (c === rightMargin)
143
+ return [rightMargin, rightIndent];
144
+ return [c];
145
+ }
146
+ /** Let the controls a drop held go back to where the guide stands them. */
147
+ function release() {
148
+ released = false;
149
+ const was = held;
150
+ held = new Set();
151
+ for (const c of was)
152
+ settle(c);
153
+ }
154
+ function grab(c) {
155
+ const along = (ev) => (c.orient === "h" ? ev.clientX : ev.clientY);
156
+ c.el.addEventListener("pointerdown", (ev) => {
157
+ if (drag || held.size > 0 || ev.button !== 0)
158
+ return;
159
+ if (c.home === null || c.points === null || !c.page || !c.ruler)
160
+ return;
161
+ ev.preventDefault();
162
+ ev.stopPropagation();
163
+ c.el.setPointerCapture(ev.pointerId);
164
+ const carried = carriedBy(c).flatMap((k) => (k.home === null ? [] : [{ control: k, from: k.home }]));
165
+ drag = {
166
+ pointerId: ev.pointerId,
167
+ from: along(ev),
168
+ ruler: c.ruler,
169
+ points: c.points,
170
+ home: c.home,
171
+ carried,
172
+ min: c.page.start - c.home,
173
+ max: c.page.end - c.home,
174
+ by: 0,
175
+ };
176
+ c.el.classList.add("udoc-ui__ruler-control--dragging");
177
+ drawLine(c, c.home);
178
+ });
179
+ c.el.addEventListener("pointermove", (ev) => {
180
+ if (drag?.pointerId !== ev.pointerId)
181
+ return;
182
+ const { ruler } = drag;
183
+ // Where it lands, in points from the ruler's zero — on the nearest
184
+ // sixteenth of an inch unless Alt is held.
185
+ const free = drag.points + (along(ev) - drag.from) / ruler.scale;
186
+ const to = ev.altKey ? free : Math.round(free / SNAP) * SNAP;
187
+ const target = ruler.origin + to * ruler.scale - drag.home;
188
+ const offset = Math.min(drag.max, Math.max(drag.min, target));
189
+ drag.by = offset === target ? to - drag.points : offset / ruler.scale;
190
+ // Whole device pixels, so the shapes keep their crisp strokes.
191
+ const dpr = globalThis.devicePixelRatio || 1;
192
+ const shown = Math.round(offset * dpr) / dpr;
193
+ for (const { control, from } of drag.carried)
194
+ move(control, from + shown);
195
+ drawLine(c, drag.home + shown);
196
+ });
197
+ const end = (ev) => {
198
+ if (drag?.pointerId !== ev.pointerId)
199
+ return;
200
+ const { carried, by } = drag;
201
+ drag = null;
202
+ c.el.classList.remove("udoc-ui__ruler-control--dragging");
203
+ drawLine(c, null);
204
+ // A cancelled gesture drops nothing.
205
+ const sent = by !== 0 && ev.type === "pointerup" ? drop({ control: c.name, by }) : null;
206
+ if (!sent) {
207
+ for (const { control } of carried)
208
+ settle(control);
209
+ return;
210
+ }
211
+ held = new Set(carried.map(({ control }) => control));
212
+ void sent.finally(() => {
213
+ released = true;
214
+ setTimeout(() => {
215
+ if (released)
216
+ release();
217
+ }, HOLD);
218
+ });
219
+ };
220
+ c.el.addEventListener("pointerup", end);
221
+ c.el.addEventListener("pointercancel", end);
222
+ c.el.addEventListener("lostpointercapture", end);
223
+ }
224
+ return {
225
+ place(horizontal, vertical, text, movable) {
226
+ /** The page's span along `ruler`, CSS px. */
227
+ const pageOf = (ruler) => ruler && { start: ruler.at(ruler.axis.page.start), end: ruler.at(ruler.axis.page.end) };
228
+ const pages = { h: pageOf(horizontal), v: pageOf(vertical) };
229
+ const pane = (horizontal ?? vertical)?.pane;
230
+ if (pane && line.parentElement !== pane)
231
+ pane.append(line);
232
+ /** Place `c` at `points` along `ruler`, or nowhere for none — but
233
+ * leave it where a drag carries it, or a drop left it. */
234
+ const stand = (c, ruler, points) => {
235
+ if (ruler && c.el.parentElement !== ruler.layer)
236
+ ruler.layer.append(c.el);
237
+ c.ruler = ruler;
238
+ c.points = ruler && points != null ? points : null;
239
+ c.home = ruler && points != null ? ruler.at(points) : null;
240
+ c.page = pages[c.orient];
241
+ c.el.classList.toggle("udoc-ui__ruler-control--fixed", !movable(c.name));
242
+ if (!drag?.carried.some((k) => k.control === c) && !held.has(c))
243
+ settle(c);
244
+ };
245
+ // The edit a drop sent is done, and this frame is what it brought.
246
+ if (released)
247
+ release();
248
+ stand(leftMargin, horizontal, horizontal?.axis.margins?.start);
249
+ stand(rightMargin, horizontal, horizontal?.axis.margins?.end);
250
+ stand(topMargin, vertical, vertical?.axis.margins?.start);
251
+ stand(bottomMargin, vertical, vertical?.axis.margins?.end);
252
+ stand(firstLine, horizontal, text?.firstLine);
253
+ stand(hanging, horizontal, text?.left);
254
+ stand(leftIndent, horizontal, text?.left);
255
+ stand(rightIndent, horizontal, text?.right);
256
+ const stops = text?.tabs ?? [];
257
+ while (tabs.length < stops.length)
258
+ tabs.push(tab(tabs.length));
259
+ tabs.forEach((t, i) => {
260
+ const stop = stops[i];
261
+ if (stop) {
262
+ t.mark.setAttribute("d", TAB_MARKS[stop.alignment]);
263
+ t.point.style.display = stop.alignment === "decimal" ? "" : "none";
264
+ }
265
+ stand(t.control, horizontal, stop?.position);
266
+ });
267
+ },
268
+ };
269
+ }
270
+ //# sourceMappingURL=ruler-controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruler-controls.js","sourceRoot":"","sources":["../src/ruler-controls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { Guide, TextTabStop, UDocSelectionProperties, UDocType } from "@docmentis/udoc-wasm";
2
+ import type { SelectionCapabilities, SelectionEdit } from "@docmentis/udoc-ui/internal";
3
+ import type { RulerControl, RulerDrop } from "./ruler-controls.js";
4
+ /** The ruler arm of the engine's guide projection. */
5
+ type RulerGuide = Extract<Guide, {
6
+ type: "ruler";
7
+ }>;
8
+ /** What a ruler drop moves from: the selection's resolved indents and tab
9
+ * stops, and the text insets of the shape it is in, each `null` where the
10
+ * selection holds none or its paragraphs or shapes disagree. */
11
+ export interface SelectionRuler {
12
+ readonly indentLeft: number | null;
13
+ readonly indentRight: number | null;
14
+ readonly indentFirstLine: number | null;
15
+ readonly tabStops: readonly TextTabStop[] | null;
16
+ readonly insetLeft: number | null;
17
+ readonly insetTop: number | null;
18
+ readonly insetRight: number | null;
19
+ readonly insetBottom: number | null;
20
+ }
21
+ /** A selection a ruler drop moves nothing from. */
22
+ export declare const EMPTY_SELECTION_RULER: SelectionRuler;
23
+ /** Project the engine's selection `properties` onto what a ruler drop moves
24
+ * from. The office doc types carry the text and shape reads alike; any other
25
+ * moves nothing. */
26
+ export declare function selectionRuler(properties: UDocSelectionProperties | null): SelectionRuler;
27
+ /** Whether `control` takes a drag on `docType` now — the engine gates the edit
28
+ * it would send, and the selection has the values it moves from. */
29
+ export declare function rulerMovable(control: RulerControl, guide: RulerGuide, docType: UDocType, caps: SelectionCapabilities, ruler: SelectionRuler): boolean;
30
+ /**
31
+ * The selection edit `drop` sends on `docType` — its control moved `by` points
32
+ * along its ruler — or `null` where it means none: an indent or a tab moves
33
+ * the paragraphs' own, a margin edge a Word section's page margin, a shape's
34
+ * text inset or a PDF text box's side.
35
+ */
36
+ export declare function rulerEdit(drop: RulerDrop, guide: RulerGuide, docType: UDocType, ruler: SelectionRuler): SelectionEdit | null;
37
+ export {};
38
+ //# sourceMappingURL=ruler-edits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruler-edits.d.ts","sourceRoot":"","sources":["../src/ruler-edits.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAER,KAAK,EAIL,WAAW,EACX,uBAAuB,EACvB,QAAQ,EACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAA0B,MAAM,qBAAqB,CAAC;AAE3F,sDAAsD;AACtD,KAAK,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAEpD;;iEAEiE;AACjE,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI,CAAC;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,mDAAmD;AACnD,eAAO,MAAM,qBAAqB,EAAE,cASnC,CAAC;AAOF;;qBAEqB;AACrB,wBAAgB,cAAc,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,GAAG,cAAc,CAmBzF;AASD;qEACqE;AACrE,wBAAgB,YAAY,CACxB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,qBAAqB,EAC3B,KAAK,EAAE,cAAc,GACtB,OAAO,CAOT;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CACrB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,cAAc,GACtB,aAAa,GAAG,IAAI,CActB"}
@@ -0,0 +1,157 @@
1
+ /** A selection a ruler drop moves nothing from. */
2
+ export const EMPTY_SELECTION_RULER = {
3
+ indentLeft: null,
4
+ indentRight: null,
5
+ indentFirstLine: null,
6
+ tabStops: null,
7
+ insetLeft: null,
8
+ insetTop: null,
9
+ insetRight: null,
10
+ insetBottom: null,
11
+ };
12
+ /** The value `consensus` agrees on, or `null` for none. */
13
+ function agreed(consensus) {
14
+ return typeof consensus === "object" ? consensus.value : null;
15
+ }
16
+ /** Project the engine's selection `properties` onto what a ruler drop moves
17
+ * from. The office doc types carry the text and shape reads alike; any other
18
+ * moves nothing. */
19
+ export function selectionRuler(properties) {
20
+ const common = properties && "presentation" in properties
21
+ ? properties.presentation
22
+ : properties && "wordprocessing" in properties
23
+ ? properties.wordprocessing
24
+ : null;
25
+ if (!common)
26
+ return EMPTY_SELECTION_RULER;
27
+ const { text, shape } = common;
28
+ return {
29
+ indentLeft: agreed(text.indentLeft),
30
+ indentRight: agreed(text.indentRight),
31
+ indentFirstLine: agreed(text.indentFirstLine),
32
+ tabStops: agreed(text.tabStops),
33
+ insetLeft: agreed(shape.insetLeft),
34
+ insetTop: agreed(shape.insetTop),
35
+ insetRight: agreed(shape.insetRight),
36
+ insetBottom: agreed(shape.insetBottom),
37
+ };
38
+ }
39
+ /** The gate a margin edge's edit goes by, for the doc types that take one. */
40
+ const MARGIN_GATES = {
41
+ wordprocessing: "setSectionPageMargins",
42
+ presentation: "setShapeTextBodyProperties",
43
+ portable: "resizeTextBox",
44
+ };
45
+ /** Whether `control` takes a drag on `docType` now — the engine gates the edit
46
+ * it would send, and the selection has the values it moves from. */
47
+ export function rulerMovable(control, guide, docType, caps, ruler) {
48
+ const gate = control.kind === "margin" ? MARGIN_GATES[docType] : "setParagraphProperties";
49
+ return (gate !== undefined &&
50
+ caps.allowed.includes(gate) &&
51
+ rulerEdit({ control, by: 0 }, guide, docType, ruler) !== null);
52
+ }
53
+ /**
54
+ * The selection edit `drop` sends on `docType` — its control moved `by` points
55
+ * along its ruler — or `null` where it means none: an indent or a tab moves
56
+ * the paragraphs' own, a margin edge a Word section's page margin, a shape's
57
+ * text inset or a PDF text box's side.
58
+ */
59
+ export function rulerEdit(drop, guide, docType, ruler) {
60
+ const { control, by } = drop;
61
+ switch (control.kind) {
62
+ case "indent": {
63
+ const properties = indentProperties(control.indent, by, ruler);
64
+ return properties && { kind: "setParagraphProperties", properties };
65
+ }
66
+ case "tab": {
67
+ const stops = movedTabStops(control.index, by, docType, ruler);
68
+ return stops && { kind: "setParagraphProperties", properties: [{ tabStops: stops }] };
69
+ }
70
+ case "margin":
71
+ return marginEdit(control.edge, by, guide, docType, ruler);
72
+ }
73
+ }
74
+ /** The indents a drag of `indent` by `by` sets, as Word's ruler moves them:
75
+ * the first line alone; the hanging indent's lines with the first line
76
+ * staying put; the left indent's box both; the right indent from the right. */
77
+ function indentProperties(indent, by, ruler) {
78
+ const { indentLeft, indentRight, indentFirstLine } = ruler;
79
+ switch (indent) {
80
+ case "firstLine":
81
+ return indentFirstLine === null ? null : [{ indentFirstLine: indentFirstLine + by }];
82
+ case "hanging":
83
+ return indentLeft === null || indentFirstLine === null
84
+ ? null
85
+ : [{ indentLeft: indentLeft + by }, { indentFirstLine: indentFirstLine - by }];
86
+ case "left":
87
+ return indentLeft === null ? null : [{ indentLeft: indentLeft + by }];
88
+ case "right":
89
+ return indentRight === null ? null : [{ indentRight: indentRight - by }];
90
+ }
91
+ }
92
+ /** The paragraphs' tab stops with stop `index` — counted as the ruler shows
93
+ * them, `clear` entries skipped — moved `by`. Word merges a paragraph's stops
94
+ * with its style's, so there a stop moved off a position is cleared at it,
95
+ * which a slide's list, written whole, has no need of. */
96
+ function movedTabStops(index, by, docType, ruler) {
97
+ const { tabStops } = ruler;
98
+ const moved = tabStops?.filter((stop) => stop.alignment !== "clear")[index];
99
+ if (!tabStops || !moved)
100
+ return null;
101
+ const stops = tabStops.map((stop) => (stop === moved ? { ...stop, position: stop.position + by } : stop));
102
+ if (docType === "wordprocessing" && by !== 0 && !stops.some((stop) => stop.position === moved.position)) {
103
+ stops.push({ position: moved.position, alignment: "clear", leader: "none" });
104
+ }
105
+ return stops.sort((a, b) => a.position - b.position);
106
+ }
107
+ /** The insets each margin edge sets. */
108
+ const INSET_KEYS = {
109
+ left: "insetLeft",
110
+ top: "insetTop",
111
+ right: "insetRight",
112
+ bottom: "insetBottom",
113
+ };
114
+ /** The side of a frame each margin edge sets. */
115
+ const FRAME_KEYS = { left: "x0", top: "y0", right: "x1", bottom: "y1" };
116
+ /** The edit moving margin `edge` by `by`: a Word section's page margin, from
117
+ * the page's edge to the text area's; a shape's text inset, from the one it
118
+ * has; a PDF text box's side, the guide's text area moved into page-local
119
+ * points. A PDF box's height follows its lines, so its bottom takes none. */
120
+ function marginEdit(edge, by, guide, docType, ruler) {
121
+ const near = edge === "left" || edge === "top";
122
+ const { page, margins } = edge === "left" || edge === "right" ? guide.horizontal : guide.vertical;
123
+ if (!margins)
124
+ return null;
125
+ switch (docType) {
126
+ case "wordprocessing": {
127
+ const sides = {};
128
+ sides[edge] = near ? margins.start + by - page.start : page.end - (margins.end + by);
129
+ return { kind: "setSectionPageMargins", ...sides };
130
+ }
131
+ case "presentation": {
132
+ const key = INSET_KEYS[edge];
133
+ const inset = ruler[key];
134
+ if (inset === null)
135
+ return null;
136
+ const properties = {};
137
+ properties[key] = inset + (near ? by : -by);
138
+ return { kind: "setShapeTextBodyProperties", properties };
139
+ }
140
+ case "portable": {
141
+ const { horizontal: h, vertical: v } = guide;
142
+ if (edge === "bottom" || !h.margins || !v.margins)
143
+ return null;
144
+ const frame = {
145
+ x0: h.margins.start - h.page.start,
146
+ y0: v.margins.start - v.page.start,
147
+ x1: h.margins.end - h.page.start,
148
+ y1: v.margins.end - v.page.start,
149
+ };
150
+ frame[FRAME_KEYS[edge]] += by;
151
+ return { kind: "object", edit: { kind: "resizeTextBox", frame } };
152
+ }
153
+ default:
154
+ return null;
155
+ }
156
+ }
157
+ //# sourceMappingURL=ruler-edits.js.map