@arbidocs/blocks 0.4.108 → 0.4.110

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 (174) hide show
  1. package/dist/{NativeDocxEditor-UAZUKZ77.js → NativeDocxEditor-4PY4YZYC.js} +3 -3
  2. package/dist/{NativeDocxEditor-UAZUKZ77.js.map → NativeDocxEditor-4PY4YZYC.js.map} +1 -1
  3. package/dist/{NativeDocxEditor-YX7B7OFH.cjs → NativeDocxEditor-WODZAURG.cjs} +7 -7
  4. package/dist/{NativeDocxEditor-YX7B7OFH.cjs.map → NativeDocxEditor-WODZAURG.cjs.map} +1 -1
  5. package/dist/agents/index.cjs +286 -286
  6. package/dist/agents/index.js +10 -10
  7. package/dist/agents/tasks/ConversationListView.d.ts +5 -1
  8. package/dist/agents/tasks/TaskActivityTimeline.d.ts +5 -1
  9. package/dist/calendar/EventDetails.d.ts +1 -1
  10. package/dist/calendar/index.cjs +13 -0
  11. package/dist/calendar/index.cjs.map +1 -1
  12. package/dist/calendar/index.js +13 -0
  13. package/dist/calendar/index.js.map +1 -1
  14. package/dist/calendar/types.d.ts +3 -0
  15. package/dist/calls/CallSidePanel.d.ts +17 -0
  16. package/dist/calls/CallStage.d.ts +57 -0
  17. package/dist/calls/ControlBar.d.ts +91 -0
  18. package/dist/calls/ControlButton.d.ts +44 -0
  19. package/dist/calls/PreJoin.d.ts +31 -0
  20. package/dist/calls/cards.d.ts +54 -0
  21. package/dist/calls/hooks.d.ts +20 -0
  22. package/dist/calls/index.cjs +1853 -0
  23. package/dist/calls/index.cjs.map +1 -0
  24. package/dist/calls/index.d.ts +20 -0
  25. package/dist/calls/index.js +1737 -0
  26. package/dist/calls/index.js.map +1 -0
  27. package/dist/calls/join-choices.d.ts +11 -0
  28. package/dist/calls/layout.d.ts +106 -0
  29. package/dist/calls/panels.d.ts +55 -0
  30. package/dist/calls/status.d.ts +69 -0
  31. package/dist/calls/tiles.d.ts +59 -0
  32. package/dist/chat/Message.d.ts +17 -2
  33. package/dist/chat/TranscriptLine.d.ts +50 -0
  34. package/dist/chat/index.cjs +147 -126
  35. package/dist/chat/index.d.ts +3 -1
  36. package/dist/chat/index.js +5 -4
  37. package/dist/chat/transcript-runs.d.ts +6 -0
  38. package/dist/{chunk-QT6EGMAJ.cjs → chunk-2NIL2ASF.cjs} +38 -294
  39. package/dist/chunk-2NIL2ASF.cjs.map +1 -0
  40. package/dist/{chunk-XMBYDLZQ.cjs → chunk-2UAJVK3C.cjs} +4 -4
  41. package/dist/{chunk-XMBYDLZQ.cjs.map → chunk-2UAJVK3C.cjs.map} +1 -1
  42. package/dist/{chunk-TTXK62YI.cjs → chunk-54WBIVHV.cjs} +5 -5
  43. package/dist/{chunk-TTXK62YI.cjs.map → chunk-54WBIVHV.cjs.map} +1 -1
  44. package/dist/{chunk-7C35WXYB.js → chunk-5HFPRI3W.js} +5 -5
  45. package/dist/chunk-5HFPRI3W.js.map +1 -0
  46. package/dist/{chunk-S7RHJI5Q.js → chunk-6RHHMBZ5.js} +158 -5
  47. package/dist/chunk-6RHHMBZ5.js.map +1 -0
  48. package/dist/{chunk-3Y6NQIDE.js → chunk-A35KT2II.js} +37 -19
  49. package/dist/chunk-A35KT2II.js.map +1 -0
  50. package/dist/{chunk-PGDL26TQ.js → chunk-AY32GGKU.js} +10 -4
  51. package/dist/{chunk-PGDL26TQ.js.map → chunk-AY32GGKU.js.map} +1 -1
  52. package/dist/{chunk-IXALYQT7.cjs → chunk-C2CWWEHO.cjs} +2 -2
  53. package/dist/chunk-C2CWWEHO.cjs.map +1 -0
  54. package/dist/{chunk-S55VDTX3.js → chunk-CECWAIHL.js} +3 -3
  55. package/dist/{chunk-S55VDTX3.js.map → chunk-CECWAIHL.js.map} +1 -1
  56. package/dist/{chunk-XQDM6T6C.js → chunk-CXZ7FPTQ.js} +3 -3
  57. package/dist/{chunk-XQDM6T6C.js.map → chunk-CXZ7FPTQ.js.map} +1 -1
  58. package/dist/{chunk-C2HRZSAT.cjs → chunk-DJM7DLCT.cjs} +5 -5
  59. package/dist/chunk-DJM7DLCT.cjs.map +1 -0
  60. package/dist/{chunk-XQKGYGCJ.js → chunk-DQCYCEDR.js} +3 -3
  61. package/dist/{chunk-XQKGYGCJ.js.map → chunk-DQCYCEDR.js.map} +1 -1
  62. package/dist/{chunk-ZYSY4L5L.cjs → chunk-ELDUWTRR.cjs} +4 -4
  63. package/dist/{chunk-ZYSY4L5L.cjs.map → chunk-ELDUWTRR.cjs.map} +1 -1
  64. package/dist/{chunk-A2MN2ZLX.js → chunk-GKDWQLVU.js} +13 -274
  65. package/dist/chunk-GKDWQLVU.js.map +1 -0
  66. package/dist/{chunk-24ND4S6Y.cjs → chunk-HBBJYRGI.cjs} +162 -5
  67. package/dist/{chunk-S7RHJI5Q.js.map → chunk-HBBJYRGI.cjs.map} +1 -1
  68. package/dist/{chunk-P2KPDPFF.js → chunk-IXTQYFIF.js} +23 -15
  69. package/dist/chunk-IXTQYFIF.js.map +1 -0
  70. package/dist/{chunk-JQVPGMLU.js → chunk-JB32KYAH.js} +3 -3
  71. package/dist/{chunk-JQVPGMLU.js.map → chunk-JB32KYAH.js.map} +1 -1
  72. package/dist/{chunk-PBS5MFIY.cjs → chunk-JK45LSIH.cjs} +3 -3
  73. package/dist/{chunk-PBS5MFIY.cjs.map → chunk-JK45LSIH.cjs.map} +1 -1
  74. package/dist/chunk-MWDW5UBW.cjs +199 -0
  75. package/dist/chunk-MWDW5UBW.cjs.map +1 -0
  76. package/dist/{chunk-ZPLG7QYF.js → chunk-N5YEF3LC.js} +2 -2
  77. package/dist/chunk-N5YEF3LC.js.map +1 -0
  78. package/dist/{chunk-EWSEQEPL.js → chunk-NRUPUDWB.js} +17 -7
  79. package/dist/chunk-NRUPUDWB.js.map +1 -0
  80. package/dist/{chunk-DDF5GPIJ.js → chunk-P5ST47VY.js} +3 -3
  81. package/dist/{chunk-DDF5GPIJ.js.map → chunk-P5ST47VY.js.map} +1 -1
  82. package/dist/{chunk-EGDWNEAG.js → chunk-PEHLUB52.js} +3 -3
  83. package/dist/{chunk-EGDWNEAG.js.map → chunk-PEHLUB52.js.map} +1 -1
  84. package/dist/{chunk-W7NZRZ54.js → chunk-SQNAJPNR.js} +4 -4
  85. package/dist/{chunk-W7NZRZ54.js.map → chunk-SQNAJPNR.js.map} +1 -1
  86. package/dist/{chunk-DTBSGG36.cjs → chunk-U6MPHCEB.cjs} +24 -16
  87. package/dist/chunk-U6MPHCEB.cjs.map +1 -0
  88. package/dist/{chunk-MP6FK43E.cjs → chunk-VP4KJ4LK.cjs} +17 -6
  89. package/dist/chunk-VP4KJ4LK.cjs.map +1 -0
  90. package/dist/{chunk-LLFW2T6S.cjs → chunk-VZKBI2KJ.cjs} +85 -67
  91. package/dist/chunk-VZKBI2KJ.cjs.map +1 -0
  92. package/dist/{chunk-5YXG342J.cjs → chunk-W7ZDBPJ3.cjs} +4 -4
  93. package/dist/{chunk-5YXG342J.cjs.map → chunk-W7ZDBPJ3.cjs.map} +1 -1
  94. package/dist/{chunk-SKSE4OT6.cjs → chunk-WPVIOGDG.cjs} +5 -5
  95. package/dist/{chunk-SKSE4OT6.cjs.map → chunk-WPVIOGDG.cjs.map} +1 -1
  96. package/dist/{chunk-3US5OIDQ.cjs → chunk-XSUOEJB3.cjs} +9 -3
  97. package/dist/chunk-XSUOEJB3.cjs.map +1 -0
  98. package/dist/chunk-Z3AZ7Q5X.js +177 -0
  99. package/dist/chunk-Z3AZ7Q5X.js.map +1 -0
  100. package/dist/{chunk-Z5VUZ6YD.cjs → chunk-ZV3BKLFY.cjs} +3 -3
  101. package/dist/{chunk-Z5VUZ6YD.cjs.map → chunk-ZV3BKLFY.cjs.map} +1 -1
  102. package/dist/citations/index.cjs +10 -10
  103. package/dist/citations/index.js +1 -1
  104. package/dist/collaboration/index.cjs +57 -57
  105. package/dist/collaboration/index.js +3 -3
  106. package/dist/connect/docx.cjs +6 -6
  107. package/dist/connect/docx.js +4 -4
  108. package/dist/connect/index.cjs +87 -87
  109. package/dist/connect/index.js +16 -16
  110. package/dist/databases/index.cjs +2 -2
  111. package/dist/databases/index.js +1 -1
  112. package/dist/docx/definitions/fragment.d.ts +2 -6
  113. package/dist/docx/definitions/port.d.ts +2 -57
  114. package/dist/docx/index.cjs +46 -46
  115. package/dist/docx/index.js +3 -3
  116. package/dist/docx/references/commands.d.ts +3 -31
  117. package/dist/docx/references/numbering.d.ts +3 -47
  118. package/dist/facts/index.cjs +5 -5
  119. package/dist/facts/index.js +4 -4
  120. package/dist/files/GridView.d.ts +4 -1
  121. package/dist/files/TagPassagePanel.d.ts +2 -0
  122. package/dist/files/index.cjs +89 -79
  123. package/dist/files/index.cjs.map +1 -1
  124. package/dist/files/index.js +88 -78
  125. package/dist/files/index.js.map +1 -1
  126. package/dist/home/index.cjs +17 -17
  127. package/dist/home/index.js +3 -3
  128. package/dist/index.cjs +739 -718
  129. package/dist/index.cjs.map +1 -1
  130. package/dist/index.js +22 -21
  131. package/dist/index.js.map +1 -1
  132. package/dist/retrieval/index.cjs +1 -1
  133. package/dist/retrieval/index.js +1 -1
  134. package/dist/settings/FirmPool.d.ts +45 -0
  135. package/dist/settings/index.cjs +134 -37
  136. package/dist/settings/index.cjs.map +1 -1
  137. package/dist/settings/index.d.ts +1 -0
  138. package/dist/settings/index.js +100 -6
  139. package/dist/settings/index.js.map +1 -1
  140. package/dist/shell/index.cjs +12 -12
  141. package/dist/shell/index.js +4 -4
  142. package/dist/site/index.cjs +5 -5
  143. package/dist/site/index.js +1 -1
  144. package/dist/studio/index.cjs +5 -5
  145. package/dist/studio/index.js +4 -4
  146. package/dist/workflow-canvas/index.cjs +53 -53
  147. package/dist/workflow-canvas/index.js +10 -10
  148. package/dist/workspaces/index.cjs +3 -3
  149. package/dist/workspaces/index.cjs.map +1 -1
  150. package/dist/workspaces/index.js +3 -3
  151. package/dist/workspaces/index.js.map +1 -1
  152. package/node_modules/@arbidocs/coedit/dist/commands.cjs +356 -0
  153. package/node_modules/@arbidocs/coedit/dist/commands.cjs.map +1 -0
  154. package/node_modules/@arbidocs/coedit/dist/commands.d.cts +235 -0
  155. package/node_modules/@arbidocs/coedit/dist/commands.d.ts +235 -0
  156. package/node_modules/@arbidocs/coedit/dist/commands.js +338 -0
  157. package/node_modules/@arbidocs/coedit/dist/commands.js.map +1 -0
  158. package/node_modules/@arbidocs/coedit/package.json +6 -1
  159. package/package.json +15 -5
  160. package/src/calls/calls.css +157 -0
  161. package/dist/chunk-24ND4S6Y.cjs.map +0 -1
  162. package/dist/chunk-3US5OIDQ.cjs.map +0 -1
  163. package/dist/chunk-3Y6NQIDE.js.map +0 -1
  164. package/dist/chunk-7C35WXYB.js.map +0 -1
  165. package/dist/chunk-A2MN2ZLX.js.map +0 -1
  166. package/dist/chunk-C2HRZSAT.cjs.map +0 -1
  167. package/dist/chunk-DTBSGG36.cjs.map +0 -1
  168. package/dist/chunk-EWSEQEPL.js.map +0 -1
  169. package/dist/chunk-IXALYQT7.cjs.map +0 -1
  170. package/dist/chunk-LLFW2T6S.cjs.map +0 -1
  171. package/dist/chunk-MP6FK43E.cjs.map +0 -1
  172. package/dist/chunk-P2KPDPFF.js.map +0 -1
  173. package/dist/chunk-QT6EGMAJ.cjs.map +0 -1
  174. package/dist/chunk-ZPLG7QYF.js.map +0 -1
@@ -0,0 +1,338 @@
1
+ import { openHeadlessDocument } from '@docx-editor.dev/core/store';
2
+ import { resolveNumberingLevel, resolveStoryListItems, buildStyleCascadeTable, withNumberingStyleLinks, buildNumberingIndex } from '@docx-editor.dev/core/layout';
3
+
4
+ // src/commands/index.ts
5
+
6
+ // src/commands/read.ts
7
+ var DEFINED_TERM_STYLE = "DefinedTerm";
8
+ var CROSS_REFERENCE_STYLE = "CrossReference";
9
+ var BROKEN_CROSS_REFERENCE_STYLE = "CrossReferenceBroken";
10
+ var WATCHED_STYLES = /* @__PURE__ */ new Set([BROKEN_CROSS_REFERENCE_STYLE]);
11
+ var attr = (node, name) => node.attributes?.find((a) => a.localName === name)?.value;
12
+ var FIELD_ATOM = "\uFFFC";
13
+ var HEADING_STYLE = /^(heading|berschrift|titre|t[ií]tulo|titolo|kop)\s*\d/i;
14
+ function readParagraphs(root) {
15
+ const out = [];
16
+ const body = root.children?.find((n) => n.kind === "body") ?? root;
17
+ const visit = (node, topLevel, pending) => {
18
+ for (const child of node.children ?? []) {
19
+ if (child.kind === "paragraph") {
20
+ out.push(readParagraph(child, topLevel, pending.splice(0)));
21
+ } else if (child.localName === "bookmarkStart") {
22
+ const name = attr(child, "name");
23
+ if (name) pending.push(name);
24
+ } else if (child.localName === "tbl" || child.localName === "tr" || child.localName === "tc") {
25
+ visit(child, false, pending);
26
+ } else if (child.localName === "sdt" || child.localName === "sdtContent") {
27
+ visit(child, topLevel, pending);
28
+ }
29
+ }
30
+ };
31
+ visit(body, true, []);
32
+ return out;
33
+ }
34
+ function readParagraph(node, topLevel, bookmarks) {
35
+ let text = "";
36
+ const links = [];
37
+ let styleId;
38
+ let outline = false;
39
+ let fieldDepth = 0;
40
+ const marks = [];
41
+ let runStyle;
42
+ const fields = [];
43
+ const notes = [];
44
+ let current = null;
45
+ const field = (c) => {
46
+ const type = attr(c, "fldCharType");
47
+ if (type === "begin") {
48
+ if (fieldDepth === 0) {
49
+ current = { offset: text.length, instruction: "", result: "", inResult: false };
50
+ text += FIELD_ATOM;
51
+ }
52
+ fieldDepth++;
53
+ } else if (type === "separate" && fieldDepth === 1 && current) current.inResult = true;
54
+ else if (type === "end") {
55
+ fieldDepth = Math.max(0, fieldDepth - 1);
56
+ if (fieldDepth === 0 && current) {
57
+ const { offset, instruction, result } = current;
58
+ fields.push({ offset, instruction: instruction.trim(), result });
59
+ current = null;
60
+ }
61
+ }
62
+ };
63
+ const walk = (n, link) => {
64
+ for (const c of n.children ?? []) {
65
+ if (c.localName === "fldChar") {
66
+ field(c);
67
+ continue;
68
+ }
69
+ if (c.localName === "fldSimple") {
70
+ if (fieldDepth === 0) text += FIELD_ATOM;
71
+ continue;
72
+ }
73
+ if (c.localName === "instrText") {
74
+ if (fieldDepth === 1 && current)
75
+ current.instruction += (c.children ?? []).map((t) => t.value ?? "").join("");
76
+ continue;
77
+ }
78
+ if (c.kind === "paragraphProperties" || c.localName === "pPr") {
79
+ for (const p of c.children ?? []) {
80
+ if (p.localName === "pStyle") styleId = attr(p, "val");
81
+ if (p.localName === "outlineLvl" && Number(attr(p, "val")) < 9) outline = true;
82
+ }
83
+ continue;
84
+ }
85
+ if (c.localName === "delText" || c.localName === "del" || c.localName === "rPr") continue;
86
+ if (c.localName === "r") {
87
+ const rStyle = c.children?.find((x) => x.localName === "rPr")?.children?.find((x) => x.localName === "rStyle");
88
+ const watched = rStyle && attr(rStyle, "val");
89
+ runStyle = watched && WATCHED_STYLES.has(watched) ? watched : void 0;
90
+ walk(c, link);
91
+ runStyle = void 0;
92
+ continue;
93
+ }
94
+ if ((c.localName === "footnoteReference" || c.localName === "endnoteReference") && fieldDepth === 0) {
95
+ notes.push({
96
+ offset: text.length,
97
+ kind: c.localName === "footnoteReference" ? "footnote" : "endnote",
98
+ id: attr(c, "id") ?? ""
99
+ });
100
+ text += FIELD_ATOM;
101
+ continue;
102
+ }
103
+ if (c.localName === "bookmarkStart") {
104
+ const name = attr(c, "name");
105
+ if (name) bookmarks.push(name);
106
+ continue;
107
+ }
108
+ if (c.localName === "hyperlink") {
109
+ const anchor = attr(c, "anchor");
110
+ const next = anchor ? { anchor, text: "", offset: text.length } : void 0;
111
+ walk(c, next ?? link);
112
+ if (next) links.push(next);
113
+ continue;
114
+ }
115
+ if (c.kind === "textValue") {
116
+ if (fieldDepth > 0) {
117
+ const open = current;
118
+ if (fieldDepth === 1 && open?.inResult) open.result += c.value ?? "";
119
+ continue;
120
+ }
121
+ if (runStyle && c.value) {
122
+ const last = marks[marks.length - 1];
123
+ if (last && last.styleId === runStyle && last.offset + last.text.length === text.length)
124
+ last.text += c.value;
125
+ else marks.push({ styleId: runStyle, offset: text.length, text: c.value });
126
+ }
127
+ text += c.value ?? "";
128
+ if (link) link.text += c.value ?? "";
129
+ continue;
130
+ }
131
+ if (c.localName === "tab" && fieldDepth === 0) text += " ";
132
+ walk(c, link);
133
+ }
134
+ };
135
+ walk(node);
136
+ const paraId = attr(node, "paraId");
137
+ return {
138
+ id: node.id,
139
+ ...paraId ? { paraId } : {},
140
+ text,
141
+ heading: outline || !!styleId && HEADING_STYLE.test(styleId),
142
+ styleId,
143
+ topLevel,
144
+ bookmarks,
145
+ links,
146
+ ...fields.length ? { fields } : {},
147
+ ...marks.length ? { marks } : {},
148
+ ...notes.length ? { notes } : {}
149
+ };
150
+ }
151
+ function styleNames(root) {
152
+ const names = /* @__PURE__ */ new Map();
153
+ for (const style of root?.children ?? []) {
154
+ if (style.localName !== "style") continue;
155
+ const id = attr(style, "styleId");
156
+ const name = style.children?.find((c) => c.localName === "name");
157
+ if (id) names.set(id, name && attr(name, "val") || id);
158
+ }
159
+ return names;
160
+ }
161
+ var numbers = (level) => !!level && level.numFmt !== "bullet" && level.numFmt !== "none" && (level.lvlText ?? level.markerText ?? "").length > 0;
162
+ function paragraphNumber(order, items, levelOf, paragraphId) {
163
+ const item = items.get(paragraphId);
164
+ if (!item || !numbers(item)) return null;
165
+ const at = order.indexOf(paragraphId);
166
+ const markerAt = (ilvl) => {
167
+ if (ilvl === item.ilvl) return item.markerText;
168
+ for (let i = at - 1; i >= 0; i--) {
169
+ const other = items.get(order[i]);
170
+ if (other && other.numId === item.numId && other.ilvl === ilvl) return other.markerText;
171
+ }
172
+ return null;
173
+ };
174
+ const chain = [];
175
+ const texts = [];
176
+ for (let u = item.ilvl; u >= 0; u--) {
177
+ const level = levelOf(item.numId, u);
178
+ if (!level || !numbers(level)) continue;
179
+ if (u !== item.ilvl && texts.some((t) => t.includes(`%${u + 1}`))) continue;
180
+ chain.push(u);
181
+ texts.push(level.lvlText);
182
+ }
183
+ const value = chain.reverse().map((u) => markerAt(u) ?? "").join("");
184
+ if (!value) return null;
185
+ return value.length > 1 && value.endsWith(".") ? value.slice(0, -1) : value;
186
+ }
187
+ function listTargets(paragraphs, items, levelOf) {
188
+ const order = paragraphs.map((p) => p.id);
189
+ const out = [];
190
+ for (const p of paragraphs) {
191
+ const text = p.text.replace(//g, "").trim();
192
+ if (!text) continue;
193
+ const number = paragraphNumber(order, items, levelOf, p.id);
194
+ const item = items.get(p.id);
195
+ if (number !== null)
196
+ out.push({
197
+ paragraphId: p.id,
198
+ kind: "numbered",
199
+ number,
200
+ marker: item?.markerText ?? "",
201
+ text,
202
+ heading: p.heading,
203
+ level: item?.ilvl ?? 0
204
+ });
205
+ else if (p.heading)
206
+ out.push({
207
+ paragraphId: p.id,
208
+ kind: "heading",
209
+ number: null,
210
+ marker: "",
211
+ text,
212
+ heading: true,
213
+ level: 0
214
+ });
215
+ }
216
+ return out;
217
+ }
218
+ function filterTargets(targets, query) {
219
+ const q = query.trim().toLowerCase();
220
+ if (!q) return [...targets];
221
+ return targets.filter(
222
+ (t) => (t.number ?? "").toLowerCase().startsWith(q) || t.text.toLowerCase().includes(q)
223
+ );
224
+ }
225
+ function documentNumbering(source) {
226
+ let numbering;
227
+ let cascade;
228
+ const index = () => {
229
+ if (!numbering) {
230
+ cascade = buildStyleCascadeTable(
231
+ source.stylesRoot(),
232
+ void 0,
233
+ source.settingsRoot()
234
+ );
235
+ numbering = withNumberingStyleLinks(
236
+ buildNumberingIndex(source.numberingRoot()),
237
+ cascade
238
+ );
239
+ }
240
+ return numbering;
241
+ };
242
+ return {
243
+ listItems: () => {
244
+ const body = source.root().children?.find((n) => n.kind === "body");
245
+ const items = resolveStoryListItems(
246
+ body?.children ?? [],
247
+ index(),
248
+ cascade
249
+ );
250
+ const out = /* @__PURE__ */ new Map();
251
+ for (const [id, item] of items)
252
+ out.set(id, {
253
+ numId: item.numId,
254
+ ilvl: item.ilvl,
255
+ markerText: item.markerText,
256
+ numFmt: item.numFmt
257
+ });
258
+ return out;
259
+ },
260
+ levelOf: (numId, ilvl) => {
261
+ const level = resolveNumberingLevel(index(), numId, ilvl)?.level;
262
+ return level ? { lvlText: level.lvlText, numFmt: level.numFmt } : null;
263
+ }
264
+ };
265
+ }
266
+
267
+ // src/commands/references.ts
268
+ var REF_BOOKMARK_PREFIX = "_Ref";
269
+ var REF_FIELD = /^REF\s+(\S+)((?:\s+\\[A-Za-z*]+(?:\s+MERGEFORMAT)?)*)\s*$/i;
270
+ function crossReferences(port) {
271
+ const paragraphs = port.paragraphs();
272
+ if (!paragraphs.some((p) => p.fields?.length)) return [];
273
+ const items = port.listItems();
274
+ const order = paragraphs.map((p) => p.id);
275
+ const owner = /* @__PURE__ */ new Map();
276
+ for (const p of paragraphs) for (const b of p.bookmarks) if (!owner.has(b)) owner.set(b, p.id);
277
+ const out = [];
278
+ for (const p of paragraphs)
279
+ for (const field of p.fields ?? []) {
280
+ const match = REF_FIELD.exec(field.instruction);
281
+ if (!match || !match[1].startsWith(REF_BOOKMARK_PREFIX)) continue;
282
+ const switches = match[2].toLowerCase();
283
+ const mode = /\\[rwn]\b/.test(switches) ? "number" : "text";
284
+ const target = owner.get(match[1]) ?? null;
285
+ const value = !target ? null : mode === "number" ? switches.includes("\\r") ? paragraphNumber(order, items, port.levelOf, target) : null : (paragraphs.find((x) => x.id === target)?.text ?? "").replace(//g, "").trim();
286
+ out.push({
287
+ paragraphId: p.id,
288
+ offset: field.offset,
289
+ instruction: field.instruction,
290
+ bookmark: match[1],
291
+ mode,
292
+ cached: field.result,
293
+ target,
294
+ value
295
+ });
296
+ }
297
+ return out;
298
+ }
299
+ function staleCrossReferences(port) {
300
+ return crossReferences(port).filter((ref) => !ref.target || ref.value && ref.value !== ref.cached.trim()).map(({ paragraphId, offset, instruction, value, cached, bookmark, mode }) => ({
301
+ paragraphId,
302
+ offset,
303
+ instruction,
304
+ value,
305
+ cached,
306
+ bookmark,
307
+ mode
308
+ }));
309
+ }
310
+ function brokenCrossReferences(port) {
311
+ return port.paragraphs().flatMap(
312
+ (p) => (p.marks ?? []).filter((m) => m.styleId === BROKEN_CROSS_REFERENCE_STYLE).map((m) => ({ paragraphId: p.id, offset: m.offset, text: m.text }))
313
+ );
314
+ }
315
+
316
+ // src/commands/index.ts
317
+ function documentReader(view) {
318
+ const root = () => view.part().root;
319
+ let paragraphs;
320
+ let items;
321
+ let names;
322
+ const numbering = documentNumbering({ ...view, root });
323
+ return {
324
+ paragraphs: () => paragraphs ??= readParagraphs(root()),
325
+ listItems: () => items ??= numbering.listItems(),
326
+ levelOf: numbering.levelOf,
327
+ styleName: (id) => (names ??= styleNames(view.stylesRoot())).get(id) ?? id
328
+ };
329
+ }
330
+ function readDocument(bytes) {
331
+ const opened = openHeadlessDocument(bytes);
332
+ if (!opened.ok) throw new Error(`The document cannot be read (${opened.reason}).`);
333
+ return documentReader(opened.view);
334
+ }
335
+
336
+ export { BROKEN_CROSS_REFERENCE_STYLE, CROSS_REFERENCE_STYLE, DEFINED_TERM_STYLE, FIELD_ATOM, REF_BOOKMARK_PREFIX, WATCHED_STYLES, brokenCrossReferences, crossReferences, documentNumbering, documentReader, filterTargets, listTargets, paragraphNumber, readDocument, readParagraphs, staleCrossReferences, styleNames };
337
+ //# sourceMappingURL=commands.js.map
338
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/read.ts","../src/commands/numbering.ts","../src/commands/references.ts","../src/commands/index.ts"],"names":[],"mappings":"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","file":"commands.js","sourcesContent":["/**\n * The read side of the Word-editor commands: a document's paragraphs as the commands see them\n * (text in the engine's offset vocabulary, bookmarks, internal links, fields, note references),\n * read from the engine's OOXML tree. The same tree comes from a live editor\n * (`surface.session.part().root`) or from document bytes (`openHeadlessDocument`), so the toolbar\n * and ARBI's headless tools read a document the same way.\n */\n\n/** Character style of an inserted term: a dotted underline, so a defined term reads as one. */\nexport const DEFINED_TERM_STYLE = 'DefinedTerm'\n\n/** Character style of a cross-reference: a muted blue with a dotted underline (Word's name). */\nexport const CROSS_REFERENCE_STYLE = 'CrossReference'\n/** Character style of a cross-reference whose target is gone: its last text, flagged. */\nexport const BROKEN_CROSS_REFERENCE_STYLE = 'CrossReferenceBroken'\n\n/** A position: a paragraph (the engine's node id) and a UTF-16 offset into its text. */\nexport interface DocPoint {\n paragraphId: string\n offset: number\n}\n\n/** An internal link in a paragraph. */\nexport interface DocLink {\n anchor: string\n text: string\n /** Where its text starts in the paragraph's text. */\n offset?: number\n}\n\n/** A footnote or endnote reference: one character of the paragraph, as the engine counts it. */\nexport interface DocNote {\n offset: number\n kind: 'footnote' | 'endnote'\n /** `w:id` of the note. */\n id: string\n}\n\n/** One paragraph, in document order. */\nexport interface DocParagraph {\n id: string\n /** `w14:paraId`, the id that is the same in every replica of a collaboration room. */\n paraId?: string\n text: string\n /** Styled as a heading (a `Heading n` style or an outline level). */\n heading: boolean\n styleId?: string\n /** A paragraph of the body itself, not inside a table. */\n topLevel: boolean\n /** Names of the bookmarks that start in it. */\n bookmarks: string[]\n /** Its internal links (`w:hyperlink w:anchor`). */\n links: DocLink[]\n /** Its complex fields: where each sits (its one-character offset), its instruction and result. */\n fields?: DocField[]\n /** Its runs in a watched character style (a broken cross-reference's mark), with their text. */\n marks?: DocMark[]\n /** Its footnote and endnote references. */\n notes?: DocNote[]\n}\n\n/** A stretch of a paragraph's text in a watched character style. */\nexport interface DocMark {\n styleId: string\n offset: number\n text: string\n}\n\n/** Character styles whose runs a paragraph read reports as marks. */\nexport const WATCHED_STYLES = new Set([BROKEN_CROSS_REFERENCE_STYLE])\n\n/** A complex field of a paragraph. */\nexport interface DocField {\n offset: number\n instruction: string\n result: string\n}\n\nexport type OoxmlNodeLike = {\n id: string\n kind: string\n localName?: string\n value?: string\n attributes?: readonly { localName: string; value: string }[]\n children?: readonly OoxmlNodeLike[]\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** How a field (or a note reference) counts in a paragraph's text (the engine's model vocabulary). */\nexport const FIELD_ATOM = '\\uFFFC'\n\n/** A heading style id in any of the spellings Word localises it to (`Heading1`, `berschrift1`…). */\nconst HEADING_STYLE = /^(heading|berschrift|titre|t[ií]tulo|titolo|kop)\\s*\\d/i\n\n/** The paragraphs of a part's body, read from the engine's OOXML tree. */\nexport function readParagraphs(root: OoxmlNodeLike): DocParagraph[] {\n const out: DocParagraph[] = []\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n const visit = (node: OoxmlNodeLike, topLevel: boolean, pending: string[]) => {\n for (const child of node.children ?? []) {\n if (child.kind === 'paragraph') {\n out.push(readParagraph(child, topLevel, pending.splice(0)))\n } else if (child.localName === 'bookmarkStart') {\n // A bookmark between paragraphs belongs to the next one.\n const name = attr(child, 'name')\n if (name) pending.push(name)\n } else if (\n child.localName === 'tbl' ||\n child.localName === 'tr' ||\n child.localName === 'tc'\n ) {\n visit(child, false, pending)\n } else if (child.localName === 'sdt' || child.localName === 'sdtContent') {\n visit(child, topLevel, pending)\n }\n }\n }\n visit(body, true, [])\n return out\n}\n\nfunction readParagraph(node: OoxmlNodeLike, topLevel: boolean, bookmarks: string[]): DocParagraph {\n let text = ''\n const links: DocLink[] = []\n let styleId: string | undefined\n let outline = false\n // A field reads as ONE character (U+FFFC), as the engine counts offsets: its instruction and\n // its cached result are not text of the paragraph.\n let fieldDepth = 0\n const marks: DocMark[] = []\n /** The watched style of the run being walked, if any. */\n let runStyle: string | undefined\n const fields: DocField[] = []\n const notes: DocNote[] = []\n let current: (DocField & { inResult: boolean }) | null = null\n const field = (c: OoxmlNodeLike) => {\n const type = attr(c, 'fldCharType')\n if (type === 'begin') {\n if (fieldDepth === 0) {\n current = { offset: text.length, instruction: '', result: '', inResult: false }\n text += FIELD_ATOM\n }\n fieldDepth++\n } else if (type === 'separate' && fieldDepth === 1 && current) current.inResult = true\n else if (type === 'end') {\n fieldDepth = Math.max(0, fieldDepth - 1)\n if (fieldDepth === 0 && current) {\n const { offset, instruction, result } = current\n fields.push({ offset, instruction: instruction.trim(), result })\n current = null\n }\n }\n }\n const walk = (n: OoxmlNodeLike, link?: DocLink) => {\n for (const c of n.children ?? []) {\n if (c.localName === 'fldChar') {\n field(c)\n continue\n }\n if (c.localName === 'fldSimple') {\n if (fieldDepth === 0) text += FIELD_ATOM\n continue\n }\n if (c.localName === 'instrText') {\n if (fieldDepth === 1 && current)\n (current as DocField).instruction += (c.children ?? []).map((t) => t.value ?? '').join('')\n continue\n }\n if (c.kind === 'paragraphProperties' || c.localName === 'pPr') {\n for (const p of c.children ?? []) {\n if (p.localName === 'pStyle') styleId = attr(p, 'val')\n if (p.localName === 'outlineLvl' && Number(attr(p, 'val')) < 9) outline = true\n }\n continue\n }\n if (c.localName === 'delText' || c.localName === 'del' || c.localName === 'rPr') continue\n if (c.localName === 'r') {\n const rStyle = c.children\n ?.find((x) => x.localName === 'rPr')\n ?.children?.find((x) => x.localName === 'rStyle')\n const watched = rStyle && attr(rStyle, 'val')\n runStyle = watched && WATCHED_STYLES.has(watched) ? watched : undefined\n walk(c, link)\n runStyle = undefined\n continue\n }\n if (\n (c.localName === 'footnoteReference' || c.localName === 'endnoteReference') &&\n fieldDepth === 0\n ) {\n notes.push({\n offset: text.length,\n kind: c.localName === 'footnoteReference' ? 'footnote' : 'endnote',\n id: attr(c, 'id') ?? '',\n })\n text += FIELD_ATOM\n continue\n }\n if (c.localName === 'bookmarkStart') {\n const name = attr(c, 'name')\n if (name) bookmarks.push(name)\n continue\n }\n if (c.localName === 'hyperlink') {\n const anchor = attr(c, 'anchor')\n const next = anchor ? { anchor, text: '', offset: text.length } : undefined\n walk(c, next ?? link)\n if (next) links.push(next)\n continue\n }\n if (c.kind === 'textValue') {\n if (fieldDepth > 0) {\n const open = current as (DocField & { inResult: boolean }) | null\n if (fieldDepth === 1 && open?.inResult) open.result += c.value ?? ''\n continue\n }\n if (runStyle && c.value) {\n const last = marks[marks.length - 1]\n if (last && last.styleId === runStyle && last.offset + last.text.length === text.length)\n last.text += c.value\n else marks.push({ styleId: runStyle, offset: text.length, text: c.value })\n }\n text += c.value ?? ''\n if (link) link.text += c.value ?? ''\n continue\n }\n if (c.localName === 'tab' && fieldDepth === 0) text += '\\t'\n walk(c, link)\n }\n }\n walk(node)\n const paraId = attr(node, 'paraId')\n return {\n id: node.id,\n ...(paraId ? { paraId } : {}),\n text,\n heading: outline || (!!styleId && HEADING_STYLE.test(styleId)),\n styleId,\n topLevel,\n bookmarks,\n links,\n ...(fields.length ? { fields } : {}),\n ...(marks.length ? { marks } : {}),\n ...(notes.length ? { notes } : {}),\n }\n}\n\n/** Style id to style name (`Heading1` → `heading 1`), from a styles part's tree. */\nexport function styleNames(root: OoxmlNodeLike | null | undefined): Map<string, string> {\n const names = new Map<string, string>()\n for (const style of root?.children ?? []) {\n if (style.localName !== 'style') continue\n const id = attr(style, 'styleId')\n const name = style.children?.find((c) => c.localName === 'name')\n if (id) names.set(id, (name && attr(name, 'val')) || id)\n }\n return names\n}\n","/**\n * Cross-reference targets: the document's numbered paragraphs (clauses, sub-clauses, numbered\n * captions) and its headings, with the number Word's `REF \\r` shows for each.\n *\n * The number is what the editor computes for a `REF … \\r` field — and it has to be exactly that,\n * because the engine shows a field's live value only while the field's cached result matches what\n * it computes (otherwise it keeps the cached text for good). So this mirrors the engine: the\n * paragraph's own list level, preceded by each higher level whose number its level text does not\n * already show (`%1.%2` already shows level 1; `(%3)` does not show `2.1`), and one trailing\n * period dropped (`2.` reads `2`).\n */\n\nimport type { DocParagraph, OoxmlNodeLike } from './read'\nimport {\n buildNumberingIndex,\n buildStyleCascadeTable,\n resolveNumberingLevel,\n resolveStoryListItems,\n withNumberingStyleLinks,\n} from '@docx-editor.dev/core/layout'\n\n/** A paragraph's resolved list numbering (the engine's list item). */\nexport interface ListItemInfo {\n numId: string\n ilvl: number\n markerText: string\n numFmt: string\n}\n\n/** A list level's definition: its level text (`%1.%2`) and number format. */\nexport interface LevelInfo {\n lvlText: string\n numFmt: string\n}\n\nexport type LevelOf = (numId: string, ilvl: number) => LevelInfo | null\n\nconst numbers = (level: { numFmt: string; lvlText?: string; markerText?: string } | null) =>\n !!level &&\n level.numFmt !== 'bullet' &&\n level.numFmt !== 'none' &&\n (level.lvlText ?? level.markerText ?? '').length > 0\n\n/**\n * The number `REF \\r` shows for a paragraph, or null when it is not numbered. `order` is every\n * paragraph id in document order (for the markers of the levels above it).\n */\nexport function paragraphNumber(\n order: readonly string[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf,\n paragraphId: string\n): string | null {\n const item = items.get(paragraphId)\n if (!item || !numbers(item)) return null\n const at = order.indexOf(paragraphId)\n /** The marker the nearest paragraph at `ilvl` of this list had, up to the target. */\n const markerAt = (ilvl: number): string | null => {\n if (ilvl === item.ilvl) return item.markerText\n for (let i = at - 1; i >= 0; i--) {\n const other = items.get(order[i])\n if (other && other.numId === item.numId && other.ilvl === ilvl) return other.markerText\n }\n return null\n }\n const chain: number[] = []\n const texts: string[] = []\n for (let u = item.ilvl; u >= 0; u--) {\n const level = levelOf(item.numId, u)\n if (!level || !numbers(level)) continue\n if (u !== item.ilvl && texts.some((t) => t.includes(`%${u + 1}`))) continue\n chain.push(u)\n texts.push(level.lvlText)\n }\n const value = chain\n .reverse()\n .map((u) => markerAt(u) ?? '')\n .join('')\n if (!value) return null\n return value.length > 1 && value.endsWith('.') ? value.slice(0, -1) : value\n}\n\n/** One place a cross-reference can point at. */\nexport interface CrossReferenceTarget {\n paragraphId: string\n /** A numbered paragraph (clause, sub-clause, caption) or an unnumbered heading. */\n kind: 'numbered' | 'heading'\n /** What `REF \\r` shows (`8.2`), or null for an unnumbered heading. */\n number: string | null\n /** The paragraph's list marker as painted (`8.2`, `(a)`), or empty. */\n marker: string\n /** The paragraph's text (without its marker). */\n text: string\n heading: boolean\n /** Its list level (0 for a top-level clause), or 0 for a heading. */\n level: number\n}\n\n/** Every numbered paragraph and every heading, in document order. */\nexport function listTargets(\n paragraphs: readonly DocParagraph[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf\n): CrossReferenceTarget[] {\n const order = paragraphs.map((p) => p.id)\n const out: CrossReferenceTarget[] = []\n for (const p of paragraphs) {\n const text = p.text.replace(//g, '').trim()\n if (!text) continue\n const number = paragraphNumber(order, items, levelOf, p.id)\n const item = items.get(p.id)\n if (number !== null)\n out.push({\n paragraphId: p.id,\n kind: 'numbered',\n number,\n marker: item?.markerText ?? '',\n text,\n heading: p.heading,\n level: item?.ilvl ?? 0,\n })\n else if (p.heading)\n out.push({\n paragraphId: p.id,\n kind: 'heading',\n number: null,\n marker: '',\n text,\n heading: true,\n level: 0,\n })\n }\n return out\n}\n\n/** Targets whose number or text contains the query (case-insensitive). */\nexport function filterTargets(\n targets: readonly CrossReferenceTarget[],\n query: string\n): CrossReferenceTarget[] {\n const q = query.trim().toLowerCase()\n if (!q) return [...targets]\n return targets.filter(\n (t) => (t.number ?? '').toLowerCase().startsWith(q) || t.text.toLowerCase().includes(q)\n )\n}\n\n/** What the engine's numbering needs of a document: its parts' trees. */\nexport interface NumberingSource {\n /** The main document part's root. */\n root(): OoxmlNodeLike\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A document's list numbering as the engine resolves it. */\nexport interface DocumentNumbering {\n /** Each numbered paragraph's list item, by paragraph (node) id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/**\n * The numbering of a document, as the editor paints it: from a live editor's session or from a\n * headless document view alike.\n */\nexport function documentNumbering(source: NumberingSource): DocumentNumbering {\n type Index = ReturnType<typeof buildNumberingIndex>\n type Cascade = ReturnType<typeof buildStyleCascadeTable>\n let numbering: Index | undefined\n let cascade: Cascade | undefined\n const index = () => {\n if (!numbering) {\n cascade = buildStyleCascadeTable(\n source.stylesRoot() as Parameters<typeof buildStyleCascadeTable>[0],\n undefined,\n source.settingsRoot() as Parameters<typeof buildStyleCascadeTable>[2]\n )\n numbering = withNumberingStyleLinks(\n buildNumberingIndex(source.numberingRoot() as Parameters<typeof buildNumberingIndex>[0]),\n cascade\n )\n }\n return numbering\n }\n return {\n listItems: () => {\n const body = source.root().children?.find((n) => n.kind === 'body')\n const items = resolveStoryListItems(\n (body?.children ?? []) as unknown as Parameters<typeof resolveStoryListItems>[0],\n index(),\n cascade\n )\n const out = new Map<string, ListItemInfo>()\n for (const [id, item] of items)\n out.set(id, {\n numId: item.numId,\n ilvl: item.ilvl,\n markerText: item.markerText,\n numFmt: item.numFmt,\n })\n return out\n },\n levelOf: (numId, ilvl) => {\n const level = resolveNumberingLevel(index(), numId, ilvl)?.level\n return level ? { lvlText: level.lvlText, numFmt: level.numFmt } : null\n },\n }\n}\n","/**\n * The cross-references of a document (`REF` fields to `_Ref` bookmarks), each with what it shows\n * and what its target now is: current, stale (a clause renumbered, a heading reworded) or broken\n * (the target is gone).\n */\n\nimport { BROKEN_CROSS_REFERENCE_STYLE, type DocParagraph } from './read'\nimport { paragraphNumber, type LevelOf, type ListItemInfo } from './numbering'\n\n/** Prefix of Word's hidden cross-reference bookmarks. */\nexport const REF_BOOKMARK_PREFIX = '_Ref'\n\nexport type CrossReferenceMode = 'number' | 'text'\n\nconst REF_FIELD = /^REF\\s+(\\S+)((?:\\s+\\\\[A-Za-z*]+(?:\\s+MERGEFORMAT)?)*)\\s*$/i\n\n/** What reading cross-references needs of a document. */\nexport interface ReferencesReader {\n paragraphs(): DocParagraph[]\n /** Each numbered paragraph's list item, by paragraph id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/** One `REF` field to a `_Ref` bookmark. */\nexport interface CrossReference {\n paragraphId: string\n offset: number\n instruction: string\n bookmark: string\n mode: CrossReferenceMode\n /** The field's cached result (what it shows). */\n cached: string\n /** The paragraph the bookmark is in, or null when it is gone (the reference is broken). */\n target: string | null\n /** What the reference should show now, or null when that cannot be computed. */\n value: string | null\n}\n\n/** A `REF` field whose cached result no longer says what its target now is. */\nexport interface StaleReference {\n paragraphId: string\n offset: number\n instruction: string\n /** The current value, or null when the target is gone (the reference is broken). */\n value: string | null\n /** The field's cached result (what it last showed). */\n cached: string\n bookmark: string\n mode: CrossReferenceMode\n}\n\n/** A cross-reference whose target was deleted: its last text, marked in the Broken style. */\nexport interface BrokenReference {\n paragraphId: string\n offset: number\n text: string\n}\n\n/** Every cross-reference of the document, in document order. */\nexport function crossReferences(port: ReferencesReader): CrossReference[] {\n const paragraphs = port.paragraphs()\n if (!paragraphs.some((p) => p.fields?.length)) return []\n const items = port.listItems()\n const order = paragraphs.map((p) => p.id)\n const owner = new Map<string, string>()\n for (const p of paragraphs) for (const b of p.bookmarks) if (!owner.has(b)) owner.set(b, p.id)\n const out: CrossReference[] = []\n for (const p of paragraphs)\n for (const field of p.fields ?? []) {\n const match = REF_FIELD.exec(field.instruction)\n if (!match || !match[1].startsWith(REF_BOOKMARK_PREFIX)) continue\n const switches = match[2].toLowerCase()\n const mode: CrossReferenceMode = /\\\\[rwn]\\b/.test(switches) ? 'number' : 'text'\n const target = owner.get(match[1]) ?? null\n const value = !target\n ? null\n : mode === 'number'\n ? switches.includes('\\\\r')\n ? paragraphNumber(order, items, port.levelOf, target)\n : null\n : (paragraphs.find((x) => x.id === target)?.text ?? '').replace(//g, '').trim()\n out.push({\n paragraphId: p.id,\n offset: field.offset,\n instruction: field.instruction,\n bookmark: match[1],\n mode,\n cached: field.result,\n target,\n value,\n })\n }\n return out\n}\n\n/**\n * The cross-references whose cached result is out of date: a clause renumbered, a heading\n * reworded, or the target gone. The editor paints a field's live value only while its cached\n * result matches what it computes, so a stale cache shows the OLD number after the document is\n * reopened (and Word shows the cached result until its fields are updated).\n */\nexport function staleCrossReferences(port: ReferencesReader): StaleReference[] {\n return crossReferences(port)\n .filter((ref) => !ref.target || (ref.value && ref.value !== ref.cached.trim()))\n .map(({ paragraphId, offset, instruction, value, cached, bookmark, mode }) => ({\n paragraphId,\n offset,\n instruction,\n value,\n cached,\n bookmark,\n mode,\n }))\n}\n\n/** The broken cross-references marked in the document, in document order. */\nexport function brokenCrossReferences(\n port: Pick<ReferencesReader, 'paragraphs'>\n): BrokenReference[] {\n return port\n .paragraphs()\n .flatMap((p) =>\n (p.marks ?? [])\n .filter((m) => m.styleId === BROKEN_CROSS_REFERENCE_STYLE)\n .map((m) => ({ paragraphId: p.id, offset: m.offset, text: m.text }))\n )\n}\n","/**\n * Word-editor commands shared by the editor's toolbar and ARBI's headless tools in the\n * collaboration service. Pure functions over the engine's OOXML tree, so they run on a live\n * editor's session and on a headless document view alike.\n */\nimport { openHeadlessDocument } from '@docx-editor.dev/core/store'\nimport { readParagraphs, styleNames, type DocParagraph, type OoxmlNodeLike } from './read'\nimport { documentNumbering, type DocumentNumbering } from './numbering'\nimport type { ReferencesReader } from './references'\n\nexport * from './read'\nexport * from './numbering'\nexport * from './references'\n\n/** A document's parts as trees: a live editor's session or a headless view (`openHeadlessDocument`). */\nexport interface DocumentTrees {\n part(): { root: unknown }\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A read-only snapshot of a document: its paragraphs, numbering and style names. */\nexport interface DocumentReader extends ReferencesReader, DocumentNumbering {\n /** A style's name (`heading 1`) by its id, or the id when the document does not name it. */\n styleName(styleId: string): string\n}\n\n/** Read a document whose trees do not change while the reader is used (a headless view). */\nexport function documentReader(view: DocumentTrees): DocumentReader {\n const root = () => view.part().root as OoxmlNodeLike\n let paragraphs: DocParagraph[] | undefined\n let items: ReturnType<DocumentNumbering['listItems']> | undefined\n let names: Map<string, string> | undefined\n const numbering = documentNumbering({ ...view, root })\n return {\n paragraphs: () => (paragraphs ??= readParagraphs(root())),\n listItems: () => (items ??= numbering.listItems()),\n levelOf: numbering.levelOf,\n styleName: (id) =>\n (names ??= styleNames(view.stylesRoot() as OoxmlNodeLike | null)).get(id) ?? id,\n }\n}\n\n/** Read a document from its bytes (a collaboration room's `readRoom`). Throws on a bad package. */\nexport function readDocument(bytes: Uint8Array): DocumentReader {\n const opened = openHeadlessDocument(bytes)\n if (!opened.ok) throw new Error(`The document cannot be read (${opened.reason}).`)\n return documentReader(opened.view)\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbidocs/coedit",
3
- "version": "0.4.108",
3
+ "version": "0.4.110",
4
4
  "description": "Real-time collaboration for the ARBI native DOCX editor: a Yjs mirror of the canonical OOXML package, session, and server runtime",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -32,6 +32,11 @@
32
32
  "types": "./dist/template.d.ts",
33
33
  "import": "./dist/template.js",
34
34
  "require": "./dist/template.cjs"
35
+ },
36
+ "./commands": {
37
+ "types": "./dist/commands.d.ts",
38
+ "import": "./dist/commands.js",
39
+ "require": "./dist/commands.cjs"
35
40
  }
36
41
  },
37
42
  "files": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbidocs/blocks",
3
- "version": "0.4.108",
3
+ "version": "0.4.110",
4
4
  "description": "Composable, domain-neutral UI blocks for ARBI apps, organised by capability (retrieval, facts, agents, workspaces, citations, collaboration) plus shell, theme and site primitives, on top of @arbidocs/react.",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -108,6 +108,12 @@
108
108
  "require": "./dist/calendar/index.cjs"
109
109
  },
110
110
  "./calendar.css": "./src/calendar/calendar.css",
111
+ "./calls": {
112
+ "types": "./dist/calls/index.d.ts",
113
+ "import": "./dist/calls/index.js",
114
+ "require": "./dist/calls/index.cjs"
115
+ },
116
+ "./calls.css": "./src/calls/calls.css",
111
117
  "./studio": {
112
118
  "types": "./dist/studio/index.d.ts",
113
119
  "import": "./dist/studio/index.js",
@@ -214,6 +220,9 @@
214
220
  "calendar": [
215
221
  "./dist/calendar/index.d.ts"
216
222
  ],
223
+ "calls": [
224
+ "./dist/calls/index.d.ts"
225
+ ],
217
226
  "studio": [
218
227
  "./dist/studio/index.d.ts"
219
228
  ],
@@ -257,7 +266,8 @@
257
266
  "src/docx/styles.css",
258
267
  "src/docx/layout/layout.css",
259
268
  "src/docx/README.md",
260
- "src/calendar/calendar.css"
269
+ "src/calendar/calendar.css",
270
+ "src/calls/calls.css"
261
271
  ],
262
272
  "scripts": {
263
273
  "build": "rm -rf dist && tsup && tsc -p tsconfig.build.json",
@@ -270,8 +280,8 @@
270
280
  "example:test:e2e": "playwright test -c examples/custom-ui/playwright.config.ts"
271
281
  },
272
282
  "dependencies": {
273
- "@arbidocs/client": "0.4.108",
274
- "@arbidocs/coedit": "0.4.108",
283
+ "@arbidocs/client": "0.4.110",
284
+ "@arbidocs/coedit": "0.4.110",
275
285
  "@dnd-kit/core": "^6.3.1",
276
286
  "@dnd-kit/sortable": "^10.0.0",
277
287
  "@dnd-kit/utilities": "^3.2.2",
@@ -313,7 +323,7 @@
313
323
  "y-protocols": "^1.0.6"
314
324
  },
315
325
  "peerDependencies": {
316
- "@arbidocs/react": "0.4.108",
326
+ "@arbidocs/react": "0.4.110",
317
327
  "@lexical/html": "0.35.0",
318
328
  "@lexical/link": "0.35.0",
319
329
  "@lexical/list": "0.35.0",
@@ -0,0 +1,157 @@
1
+ /*
2
+ * Call tiles (`@arbidocs/blocks/calls.css`). Everything around the tiles is plain ARBI chrome
3
+ * (theme tokens via Tailwind classes); only the video tiles need rules of their own. They sit on
4
+ * the deep brand navy (`--hero`) so video and initials read the same in light and dark.
5
+ */
6
+
7
+ .call-tile-box > .call-tile {
8
+ width: 100%;
9
+ height: 100%;
10
+ }
11
+
12
+ .call-tile {
13
+ position: relative;
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ overflow: hidden;
18
+ container-type: size;
19
+ border-radius: var(--radius);
20
+ background-color: hsl(var(--hero));
21
+ color: #fff;
22
+ }
23
+
24
+ /* Camera video fills its 16:9 tile; a share is letterboxed so nothing on it is cut off. */
25
+ .call-tile video {
26
+ width: 100%;
27
+ height: 100%;
28
+ object-fit: cover;
29
+ object-position: 50% 30%;
30
+ }
31
+ .call-tile[data-source='screen'] video {
32
+ object-fit: contain;
33
+ }
34
+ /* A selfie view flips the <video> element only: names, initials and icons are siblings, never
35
+ * inside the transform (a recording drawn from the <video> stays unmirrored too). */
36
+ .call-tile[data-mirror='true'] > video {
37
+ transform: scaleX(-1);
38
+ }
39
+
40
+ .call-tile-placeholder {
41
+ display: flex;
42
+ width: 100%;
43
+ height: 100%;
44
+ align-items: center;
45
+ justify-content: center;
46
+ }
47
+ .call-tile-avatar {
48
+ display: flex;
49
+ width: clamp(2.5rem, 22cqmin, 6rem);
50
+ aspect-ratio: 1;
51
+ align-items: center;
52
+ justify-content: center;
53
+ border-radius: 9999px;
54
+ background-color: rgb(255 255 255 / 0.14);
55
+ font-size: clamp(0.875rem, 8cqmin, 1.75rem);
56
+ font-weight: 600;
57
+ letter-spacing: 0.02em;
58
+ }
59
+ .call-tile-avatar-sm {
60
+ width: 2.25rem;
61
+ font-size: 0.8125rem;
62
+ }
63
+
64
+ /* A tile too short for both (a filmstrip thumbnail): the name chip carries the person; the large
65
+ * initials would sit under it. */
66
+ @container (max-height: 96px) {
67
+ .call-tile-placeholder .call-tile-avatar {
68
+ display: none;
69
+ }
70
+ }
71
+
72
+ /* The name, once, bottom-left (the app's person pill, on its own surface), and the tile's state
73
+ * icons in a small dark chip beside it. */
74
+ .call-tile-name {
75
+ position: absolute;
76
+ left: 0.5rem;
77
+ bottom: 0.5rem;
78
+ display: flex;
79
+ max-width: calc(100% - 1rem);
80
+ align-items: center;
81
+ gap: 0.25rem;
82
+ font-size: 0.75rem;
83
+ line-height: 1.125rem;
84
+ font-weight: 500;
85
+ }
86
+ .call-tile-chip {
87
+ display: inline-flex;
88
+ align-items: center;
89
+ gap: 0.25rem;
90
+ border-radius: var(--radius);
91
+ background-color: rgb(0 0 0 / 0.6);
92
+ padding: 0.1875rem 0.375rem;
93
+ color: #fff;
94
+ }
95
+ .call-tile-signal {
96
+ position: absolute;
97
+ right: 0.5rem;
98
+ top: 0.5rem;
99
+ display: flex;
100
+ border-radius: var(--radius);
101
+ background-color: rgb(0 0 0 / 0.6);
102
+ padding: 0.125rem;
103
+ color: hsl(var(--yellow-solid));
104
+ }
105
+
106
+ /* Who is talking: a brand-cyan frame over the video that thickens with the voice level, and a
107
+ * ring around the avatar that grows with it (camera off). Never colour alone: the name chip also
108
+ * shows a sound icon, and the panel says "Speaking: …". */
109
+ .call-tile::after {
110
+ content: '';
111
+ position: absolute;
112
+ inset: 0;
113
+ border: 0 solid transparent;
114
+ border-radius: inherit;
115
+ pointer-events: none;
116
+ transition:
117
+ border-width 60ms linear,
118
+ border-color 120ms ease-out;
119
+ }
120
+ .call-tile[data-speaking='true']::after {
121
+ border-color: hsl(var(--theme-cyan));
122
+ border-width: calc(2px + var(--call-level, 0) * 4px);
123
+ }
124
+ .call-tile-avatar {
125
+ transition: box-shadow 60ms linear;
126
+ }
127
+ .call-tile[data-speaking='true'] .call-tile-avatar {
128
+ box-shadow:
129
+ 0 0 0 3px hsl(var(--theme-cyan)),
130
+ 0 0 0 calc(3px + var(--call-level, 0) * 14px) hsl(var(--theme-cyan) / 0.35);
131
+ }
132
+ .call-tile-speaking {
133
+ color: hsl(var(--theme-cyan));
134
+ }
135
+
136
+ .call-tile-more {
137
+ flex-direction: column;
138
+ gap: 0.375rem;
139
+ font-size: 0.875rem;
140
+ font-weight: 500;
141
+ }
142
+
143
+ /* Reduced motion: a steady ring while someone talks, no pulsing with the level. */
144
+ @media (prefers-reduced-motion: reduce) {
145
+ .call-tile::after,
146
+ .call-tile-avatar {
147
+ transition: none;
148
+ }
149
+ .call-tile[data-speaking='true']::after {
150
+ border-width: 4px;
151
+ }
152
+ .call-tile[data-speaking='true'] .call-tile-avatar {
153
+ box-shadow:
154
+ 0 0 0 3px hsl(var(--theme-cyan)),
155
+ 0 0 0 8px hsl(var(--theme-cyan) / 0.35);
156
+ }
157
+ }