ooxml-ui 1.1.0 → 1.3.0

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 (203) hide show
  1. package/README.md +38 -36
  2. package/custom-elements.json +372 -4
  3. package/dist/chrome/ruler.d.ts +60 -2
  4. package/dist/chrome/ruler.d.ts.map +1 -1
  5. package/dist/chrome/status-bar.d.ts +3 -1
  6. package/dist/chrome/status-bar.d.ts.map +1 -1
  7. package/dist/{chunk-JFJXBYRD.js → chunk-2WLRFPMW.js} +9 -0
  8. package/dist/{chunk-X7RINDJQ.js → chunk-56A2JK63.js} +1 -1
  9. package/dist/{chunk-KVKKXRL7.js → chunk-5OFAJDMQ.js} +93 -14
  10. package/dist/{chunk-M5DTJSOV.js → chunk-723JC3OC.js} +461 -16
  11. package/dist/{chunk-USDLALB5.js → chunk-IY7QJLQG.js} +1 -1
  12. package/dist/{chunk-BOX43CZD.js → chunk-M6GF5ED2.js} +2 -1
  13. package/dist/{chunk-BEN3453I.js → chunk-NYRRH2MD.js} +1 -1
  14. package/dist/{chunk-3FPW7M6U.js → chunk-TWQ45BFL.js} +1 -1
  15. package/dist/{chunk-ZU7GX4SY.js → chunk-V6P6KZCO.js} +7 -5
  16. package/dist/comments/comments-pane.d.ts +116 -0
  17. package/dist/comments/comments-pane.d.ts.map +1 -0
  18. package/dist/comments/types.d.ts +80 -0
  19. package/dist/comments/types.d.ts.map +1 -0
  20. package/dist/controls.d.ts +6 -2
  21. package/dist/controls.d.ts.map +1 -1
  22. package/dist/controls.js +5 -5
  23. package/dist/docx/comments-panel.d.ts +8 -1
  24. package/dist/docx/editor-chrome.d.ts +8 -1
  25. package/dist/docx/file-commands.d.ts +1 -1
  26. package/dist/docx/image-media.d.ts +1 -1
  27. package/dist/docx/locales/en-app.d.ts +1 -0
  28. package/dist/docx/locales/en-ribbon.d.ts +1 -0
  29. package/dist/docx/locales/en.d.ts +2 -0
  30. package/dist/docx/localization-strings.d.ts +2 -0
  31. package/dist/docx/localization.d.ts +7 -0
  32. package/dist/docx/print-layout.d.ts +2 -2
  33. package/dist/docx/print-picture.d.ts +12 -0
  34. package/dist/docx/review-controller.d.ts +2 -0
  35. package/dist/docx/ribbon-actions.d.ts +22 -0
  36. package/dist/docx/ruler.d.ts +7 -10
  37. package/dist/docx/title-bar.d.ts +3 -5
  38. package/dist/docx.js +342 -362
  39. package/dist/form/gradient-preset-gallery.d.ts +2 -2
  40. package/dist/icons.d.ts.map +1 -1
  41. package/dist/icons.js +1 -1
  42. package/dist/index.d.ts +1 -1
  43. package/dist/index.js +9 -9
  44. package/dist/pptx/{chart-3d-view-scene-2KRQ5667.mjs → chart-3d-view-scene-OYJ4CDCO.mjs} +4 -5
  45. package/dist/pptx/{chart-3d-view-scene-36DMZWZ3.cjs → chart-3d-view-scene-SE2Y6QRE.cjs} +38 -39
  46. package/dist/pptx/{chunk-YOGDIDPB.mjs → chunk-CIVA3MLN.mjs} +8 -2
  47. package/dist/pptx/{chunk-KPZWYF44.cjs → chunk-FPE5PZMI.cjs} +789 -491
  48. package/dist/pptx/{chunk-AIL3BNZS.cjs → chunk-IURZJAWP.cjs} +529 -387
  49. package/dist/pptx/{chunk-YHA6XAB3.cjs → chunk-KRMMJUCO.cjs} +83 -1
  50. package/dist/pptx/{chunk-Y2W4SZER.mjs → chunk-MWHGUEIJ.mjs} +637 -348
  51. package/dist/pptx/{chunk-YARCML7O.mjs → chunk-STLXPKJJ.mjs} +519 -388
  52. package/dist/pptx/{chunk-ADOC5JLI.mjs → chunk-TC7HCF5M.mjs} +76 -2
  53. package/dist/pptx/{chunk-CJU4P5FT.cjs → chunk-WKLHJEPD.cjs} +18 -12
  54. package/dist/pptx/dom/element-styles.d.ts.map +1 -1
  55. package/dist/pptx/dom/elements/chart.d.ts +2 -3
  56. package/dist/pptx/dom/elements/chart.d.ts.map +1 -1
  57. package/dist/pptx/dom/elements/connector.d.ts.map +1 -1
  58. package/dist/pptx/dom/elements/shape-filter-defs.d.ts.map +1 -1
  59. package/dist/pptx/dom/elements/table.d.ts.map +1 -1
  60. package/dist/pptx/dom/index.cjs +272 -261
  61. package/dist/pptx/dom/index.mjs +46 -35
  62. package/dist/pptx/dom/slide-stage.d.ts.map +1 -1
  63. package/dist/pptx/export/html2canvas-clone.cjs +2 -2
  64. package/dist/pptx/export/html2canvas-clone.mjs +1 -1
  65. package/dist/pptx/index.cjs +3065 -2993
  66. package/dist/pptx/index.mjs +4 -4
  67. package/dist/pptx/render/chart-3d-oblique-layout.d.ts.map +1 -1
  68. package/dist/pptx/render/chart-3d-persp-bars.d.ts.map +1 -1
  69. package/dist/pptx/render/chart-3d-persp-layout.d.ts.map +1 -1
  70. package/dist/pptx/render/chart-axis-range.d.ts +7 -0
  71. package/dist/pptx/render/chart-axis-range.d.ts.map +1 -1
  72. package/dist/pptx/render/chart-axis-render.d.ts +3 -1
  73. package/dist/pptx/render/chart-axis-render.d.ts.map +1 -1
  74. package/dist/pptx/render/chart-axis-style.d.ts +5 -0
  75. package/dist/pptx/render/chart-axis-style.d.ts.map +1 -1
  76. package/dist/pptx/render/chart-axis.d.ts +1 -1
  77. package/dist/pptx/render/chart-axis.d.ts.map +1 -1
  78. package/dist/pptx/render/chart-bar-cluster-geometry.d.ts +1 -1
  79. package/dist/pptx/render/chart-bar-cluster-geometry.d.ts.map +1 -1
  80. package/dist/pptx/render/chart-cartesian-area.d.ts.map +1 -1
  81. package/dist/pptx/render/chart-cartesian-axes.d.ts.map +1 -1
  82. package/dist/pptx/render/chart-cartesian-bars.d.ts +3 -3
  83. package/dist/pptx/render/chart-cartesian-line-area.d.ts.map +1 -1
  84. package/dist/pptx/render/chart-cartesian-percent-stacked.d.ts.map +1 -1
  85. package/dist/pptx/render/chart-cartesian-stacked-labels.d.ts +11 -7
  86. package/dist/pptx/render/chart-cartesian-stacked-labels.d.ts.map +1 -1
  87. package/dist/pptx/render/chart-cartesian.d.ts.map +1 -1
  88. package/dist/pptx/render/chart-combo-stock.cjs +3 -3
  89. package/dist/pptx/render/chart-combo-stock.mjs +1 -1
  90. package/dist/pptx/render/chart-combo.d.ts.map +1 -1
  91. package/dist/pptx/render/chart-data-label-anchor.d.ts +4 -1
  92. package/dist/pptx/render/chart-data-label-anchor.d.ts.map +1 -1
  93. package/dist/pptx/render/chart-gridlines-toggle.d.ts +13 -1
  94. package/dist/pptx/render/chart-gridlines-toggle.d.ts.map +1 -1
  95. package/dist/pptx/render/chart-helpers.d.ts +13 -13
  96. package/dist/pptx/render/chart-helpers.d.ts.map +1 -1
  97. package/dist/pptx/render/chart-horizontal-bars-helpers.d.ts +7 -3
  98. package/dist/pptx/render/chart-horizontal-bars-helpers.d.ts.map +1 -1
  99. package/dist/pptx/render/chart-horizontal-bars.d.ts.map +1 -1
  100. package/dist/pptx/render/chart-interaction-stacked.d.ts.map +1 -1
  101. package/dist/pptx/render/chart-line-path.d.ts +9 -0
  102. package/dist/pptx/render/chart-line-path.d.ts.map +1 -1
  103. package/dist/pptx/render/chart-overlays.cjs +7 -7
  104. package/dist/pptx/render/chart-overlays.mjs +1 -1
  105. package/dist/pptx/render/chart-palette.d.ts +5 -14
  106. package/dist/pptx/render/chart-palette.d.ts.map +1 -1
  107. package/dist/pptx/render/chart-plot-clip.d.ts +37 -0
  108. package/dist/pptx/render/chart-plot-clip.d.ts.map +1 -0
  109. package/dist/pptx/render/chart-quick-action-styles.d.ts +5 -3
  110. package/dist/pptx/render/chart-quick-action-styles.d.ts.map +1 -1
  111. package/dist/pptx/render/chart-scatter-x-axis.d.ts.map +1 -1
  112. package/dist/pptx/render/chart-style-palette.d.ts +52 -0
  113. package/dist/pptx/render/chart-style-palette.d.ts.map +1 -0
  114. package/dist/pptx/render/chart-surface-treemap.cjs +4 -4
  115. package/dist/pptx/render/chart-surface-treemap.mjs +1 -1
  116. package/dist/pptx/render/chart-view-model-bars.d.ts +32 -1
  117. package/dist/pptx/render/chart-view-model-bars.d.ts.map +1 -1
  118. package/dist/pptx/render/chart-view-model-build.d.ts.map +1 -1
  119. package/dist/pptx/render/chart-view-model.cjs +53 -41
  120. package/dist/pptx/render/chart-view-model.mjs +1 -1
  121. package/dist/pptx/render/chart-waterfall-map.cjs +6 -6
  122. package/dist/pptx/render/chart-waterfall-map.mjs +1 -1
  123. package/dist/pptx/render/device-pixel-stroke.d.ts +101 -0
  124. package/dist/pptx/render/device-pixel-stroke.d.ts.map +1 -0
  125. package/dist/pptx/render/export-clone.d.ts +4 -0
  126. package/dist/pptx/render/export-clone.d.ts.map +1 -1
  127. package/dist/pptx/render/foreign-object-svg-document.d.ts +12 -0
  128. package/dist/pptx/render/foreign-object-svg-document.d.ts.map +1 -1
  129. package/dist/pptx/render/index.d.ts +3 -0
  130. package/dist/pptx/render/index.d.ts.map +1 -1
  131. package/dist/pptx/render/stroke-outline.d.ts +6 -0
  132. package/dist/pptx/render/stroke-outline.d.ts.map +1 -1
  133. package/dist/pptx/render/stroke-style.d.ts +8 -2
  134. package/dist/pptx/render/stroke-style.d.ts.map +1 -1
  135. package/dist/pptx/render/tab-row-actions.d.ts +40 -0
  136. package/dist/pptx/render/tab-row-actions.d.ts.map +1 -0
  137. package/dist/pptx/render/table-cell-css.d.ts +3 -2
  138. package/dist/pptx/render/table-cell-css.d.ts.map +1 -1
  139. package/dist/pptx/render/table-cell-edit.d.ts +1 -1
  140. package/dist/pptx/render/table-cell-edit.d.ts.map +1 -1
  141. package/dist/pptx/render/table-cell-paragraphs.d.ts +29 -0
  142. package/dist/pptx/render/table-cell-paragraphs.d.ts.map +1 -0
  143. package/dist/pptx/render/table-style-borders.d.ts.map +1 -1
  144. package/dist/pptx/render/table-style.d.ts +2 -0
  145. package/dist/pptx/render/table-style.d.ts.map +1 -1
  146. package/dist/pptx/render/title-bar.d.ts +5 -0
  147. package/dist/pptx/render/title-bar.d.ts.map +1 -1
  148. package/dist/pptx/render/viewer-root-options.d.ts +11 -3
  149. package/dist/pptx/render/viewer-root-options.d.ts.map +1 -1
  150. package/dist/pptx/web-components/index.d.ts.map +1 -1
  151. package/dist/pptx/web-components/office-token-bridge.d.ts +1 -1
  152. package/dist/pptx/web-components/office-token-bridge.d.ts.map +1 -1
  153. package/dist/pptx/web-components/ribbon-actions.d.ts +8 -0
  154. package/dist/pptx/web-components/ribbon-actions.d.ts.map +1 -0
  155. package/dist/presence.js +3 -3
  156. package/dist/ribbon/ribbon-actions.d.ts +119 -0
  157. package/dist/ribbon/ribbon-actions.d.ts.map +1 -0
  158. package/dist/ribbon/ribbon-tabs.d.ts +2 -1
  159. package/dist/ribbon/ribbon-tabs.d.ts.map +1 -1
  160. package/dist/smartart/smartart-svg.d.ts +3 -2
  161. package/dist/smartart.js +3 -3
  162. package/dist/suite/attachment-store.d.ts +13 -0
  163. package/dist/suite/document-store.d.ts +31 -0
  164. package/dist/suite/index.d.ts +2 -0
  165. package/dist/suite.js +132 -1
  166. package/dist/teams/app/channel-tab.d.ts +5 -0
  167. package/dist/teams/chat-composer.d.ts +3 -0
  168. package/dist/teams.js +7 -7
  169. package/dist/theme.js +2 -2
  170. package/dist/tokens.d.ts +9 -0
  171. package/dist/tokens.d.ts.map +1 -1
  172. package/dist/visio/styles/index.d.ts +2 -0
  173. package/dist/visio/styles/theme.d.ts +11 -0
  174. package/dist/visio/styles.d.ts +2 -2
  175. package/dist/visio.js +66 -21
  176. package/dist/xlsx/backstage/index.d.ts +4 -1
  177. package/dist/xlsx/backstage/pages-share.d.ts +19 -0
  178. package/dist/xlsx/backstage/parts.d.ts +3 -0
  179. package/dist/xlsx/calc-preparation.d.ts +44 -0
  180. package/dist/xlsx/chart-fill-binding.d.ts +2 -2
  181. package/dist/xlsx/chart-series-gradient-type.d.ts +3 -2
  182. package/dist/xlsx/collaboration-session.d.ts +9 -0
  183. package/dist/xlsx/collaboration-types.d.ts +41 -0
  184. package/dist/xlsx/collaboration.d.ts +56 -0
  185. package/dist/xlsx/component.d.ts +8 -0
  186. package/dist/xlsx/dialogs/comments-list.d.ts +4 -0
  187. package/dist/xlsx/dialogs/help-dialogs.d.ts +1 -1
  188. package/dist/xlsx/editor-core.d.ts +6 -0
  189. package/dist/xlsx/element-api.d.ts +19 -1
  190. package/dist/xlsx/events.d.ts +4 -1
  191. package/dist/xlsx/grid/remote-layer.d.ts +3 -0
  192. package/dist/xlsx/grid/sparkline.d.ts +3 -0
  193. package/dist/xlsx/grid/styles.d.ts +1 -1
  194. package/dist/xlsx/index.d.ts +1 -0
  195. package/dist/xlsx/ribbon-actions.d.ts +22 -0
  196. package/dist/xlsx/shell-commands.d.ts +1 -1
  197. package/dist/xlsx/title-bar.d.ts +4 -2
  198. package/dist/xlsx.js +801 -92
  199. package/package.json +2 -2
  200. package/dist/pptx/web-components/status-bar-styles.d.ts +0 -3
  201. package/dist/pptx/web-components/status-bar-styles.d.ts.map +0 -1
  202. package/dist/pptx/web-components/title-bar-styles.d.ts +0 -7
  203. package/dist/pptx/web-components/title-bar-styles.d.ts.map +0 -1
package/dist/docx.js CHANGED
@@ -1,14 +1,14 @@
1
- import { defineSmartArt } from './chunk-BEN3453I.js';
2
- import { shadcnBridge } from './chunk-X7RINDJQ.js';
3
- import { createRibbonOverflow, defineRibbon, defineDialog, defineSearchField, defineSwitch, defineTitleBar, defineBackstage, defineStatusBar, defineZoomSlider, defineContextMenu, runKeyTips, assignKeyTips } from './chunk-M5DTJSOV.js';
4
- import { registerIcon } from './chunk-BOX43CZD.js';
5
- import './chunk-3FPW7M6U.js';
6
- import './chunk-USDLALB5.js';
7
- import './chunk-JFJXBYRD.js';
1
+ import { defineSmartArt } from './chunk-NYRRH2MD.js';
2
+ import { shadcnBridge } from './chunk-56A2JK63.js';
3
+ import { createRibbonOverflow, defineRibbon, defineRuler, defineCommentsPane, defineDialog, defineSearchField, defineSwitch, defineTitleBar, defineRibbonActions, defineBackstage, defineStatusBar, defineZoomSlider, defineContextMenu, runKeyTips, assignKeyTips } from './chunk-723JC3OC.js';
4
+ import { registerIcon } from './chunk-M6GF5ED2.js';
5
+ import './chunk-TWQ45BFL.js';
6
+ import './chunk-IY7QJLQG.js';
7
+ import './chunk-2WLRFPMW.js';
8
8
  import { normalizeLocale, SUPPORTED_OFFICE_LOCALES, interpolate } from 'ooxml-core/i18n';
9
9
  import { createDocument, saveDocx, sectionsFromLayout, sectionLayoutJson, sectionsOf, pageSizeOf, columnPreset, applyPageSetup, withSection, computeListLabels, numberNotesInOrder, tocEntries, tableOfFiguresInstruction, findTableOfContents, ensureListDefinition, resolveNumberingLevel, equalColumnDraft, readColumnDraft, PAGE_SIZE_OPTIONS, PAGE_SIZES, readPageSetup, isRunHiddenForReview, resolveTableStyleFormatting, resolveParagraphFormatting, displayListLabel, setTitlePage, setLineNumbering, setVerticalAlign, setPageNumbering, ST_NumberFormat, unequalColumnPreset, setColumns, setOrientation, setPageSize, setMargins, lineSpacingLabel, formatNoteNumber, reviewDocumentFormatting, reviewFormattingWarnings, listRevisions, plainText, tocHyperlinks, DEFAULT_TOC_INSTRUCTION, tocBookmarks, buildTableOfContents, tocCaptionLabel, isFieldLocked, twips as twips$1, signedTwips, formatListNumber, columnTextWidth, validColumnDraft, validatePageSetup, presetOf, LIGATURE_VALUES, isLigatures, reviewRunFormatting, resolveRunFormatting, reviewParagraphFormatting, resolveThemeColorReference, lineSpacingValue, isStHighlightColor, transformCase, DEFAULT_TABLE_BORDERS, parseLineSpacingValue, twipsAttr, twipsFromPixels, headingLevel, isValidLanguageTag, WORD, isHeadingListKind, fieldName, lineSpacingOptions, halfPointsFromPoints, changeColumnWidth, changeColumnGap, createListDefinition, linkStylesToList, headingListLevels, documentStats } from 'ooxml-core/docx';
10
10
  import { Schema, DOMSerializer, Fragment } from 'prosemirror-model';
11
- import { markSpecs, imageNodeSpec, fieldMarkerNodeSpec, noteReferenceNodeSpec, pageBreakNodeSpec, hardBreakNodeSpec, commentHistoryAttributes, tableCellStyle, tableStyle, createToggleFormat, expectDefined, paragraphBoxCss, themeToCssVars, lightTheme, darkTheme, normalizeThemeMode, applyThemeColors, refreshWordYjsPresence, normalizeRibbonActions, DirtyState, isWordYjsRemoteTransaction, REMOTE_TRANSACTION_META, repairCollaborativeDocumentIds, HEADER_FOOTER_INPUT, restoreSectionParts, commentThreadsFromDoc, restoreNoteParts, CollaborationClient, createCollaborationIdGenerator, WordYjsCollaboration, sectionPartsJson, NotePartsStep, notePartsJson, SectionPartsStep, fitZoomPercent, hasChangeAtCursor, hasAnyChange, commentIdsAtSelection, commentAnchors, countWords, fieldGuardPlugin, trackChangesPlugin, wordYjsPresencePlugin, placementClass, removeCommentThread, removeCommentAnchor, deleteComment, updateCommentThreads, addComment, toggleTrackChanges, goToNextChange, goToPreviousChange, rejectAllChanges, acceptAllChanges, rejectChangeAtCursor, acceptChangeAtCursor, goToComment, appendInlineNode, sameJson, sameRuns, PARAGRAPH_KEEP_KEYS, paragraphFromAttrs, parseBordersJson, isNavigableHref, wordYjsPluginKey, setReviewRecordingPreferences, nodeNumbering, paragraphFormattingRevision, inlineNodeRun, formattingRevision, insertWordHardBreak, paragraphAttrs, resolveCellVisuals, themeDrawing, ribbonActionIdForLabel, removeWordLink, fieldResultRanges, wordLinkRangeAt, ligatureCss as ligatureCss$1, wordYjsRedo, wordYjsUndo, runToInlineNodes as runToInlineNodes$1, backstageFocus, applyRunFormattingPatch, clearDirectRunFormatting, applyWordLink, ligatureStyle, wordHighlightColors, swatchColor, cssBorderSide, deleteFieldSelection, resolveComment, replyToComment, CollaborationAuthority } from 'ooxml-core/docx/ui';
11
+ import { markSpecs, imageNodeSpec, fieldMarkerNodeSpec, noteReferenceNodeSpec, pageBreakNodeSpec, hardBreakNodeSpec, commentHistoryAttributes, tableCellStyle, tableStyle, createToggleFormat, expectDefined, paragraphBoxCss, themeToCssVars, lightTheme, darkTheme, normalizeThemeMode, applyThemeColors, refreshWordYjsPresence, normalizeRibbonActions, DirtyState, isWordYjsRemoteTransaction, REMOTE_TRANSACTION_META, repairCollaborativeDocumentIds, HEADER_FOOTER_INPUT, restoreSectionParts, commentThreadsFromDoc, restoreNoteParts, CollaborationClient, createCollaborationIdGenerator, WordYjsCollaboration, sectionPartsJson, NotePartsStep, notePartsJson, SectionPartsStep, fitZoomPercent, hasChangeAtCursor, hasAnyChange, commentIdsAtSelection, commentAnchors, countWords, fieldGuardPlugin, trackChangesPlugin, wordYjsPresencePlugin, chartNodeSpec, placementClass, removeCommentThread, removeCommentAnchor, deleteComment, updateCommentThreads, addComment, toggleTrackChanges, goToNextChange, goToPreviousChange, rejectAllChanges, acceptAllChanges, rejectChangeAtCursor, acceptChangeAtCursor, goToComment, appendInlineNode, sameJson, sameRuns, PARAGRAPH_KEEP_KEYS, paragraphFromAttrs, parseBordersJson, isNavigableHref, wordYjsPluginKey, setReviewRecordingPreferences, nodeNumbering, paragraphFormattingRevision, inlineNodeRun, formattingRevision, insertWordHardBreak, paragraphAttrs, resolveCellVisuals, themeDrawing, ribbonActionIdForLabel, removeWordLink, fieldResultRanges, wordLinkRangeAt, ligatureCss as ligatureCss$1, wordYjsRedo, wordYjsUndo, runToInlineNodes as runToInlineNodes$1, backstageFocus, applyRunFormattingPatch, clearDirectRunFormatting, applyWordLink, ligatureStyle, wordHighlightColors, swatchColor, cssBorderSide, deleteFieldSelection, resolveComment, replyToComment, CollaborationAuthority } from 'ooxml-core/docx/ui';
12
12
  export { CollaborationAuthority, CollaborationClient, RIBBON_ACTION_IDS, RIBBON_ACTION_LABELS, createCollaborationIdGenerator, darkTheme, isRibbonActionId, lightTheme, normalizeRibbonActions, repairCollaborativeDocumentIds, themeToCssVars } from 'ooxml-core/docx/ui';
13
13
  import { parseOmml, convertOmmlToLatex, convertOmmlToMathMl } from 'ooxml-core/math';
14
14
  import { PluginKey, EditorState, Plugin, NodeSelection, TextSelection, Selection } from 'prosemirror-state';
@@ -529,6 +529,7 @@ var deApp = {
529
529
  Editing: "Bearbeiten",
530
530
  Viewing: "Anzeigen",
531
531
  "Show comments": "Kommentare anzeigen",
532
+ Share: "Freigeben",
532
533
  "Unsaved changes": "Nicht gespeicherte \xC4nderungen",
533
534
  Saved: "Gespeichert",
534
535
  "Saving\u2026": "Speichern\u2026",
@@ -1267,6 +1268,7 @@ var deRibbon = {
1267
1268
  Reply: "Antworten",
1268
1269
  Resolve: "L\xF6sen",
1269
1270
  Reopen: "Erneut \xF6ffnen",
1271
+ Resolved: "Gel\xF6st",
1270
1272
  Delete: "L\xF6schen",
1271
1273
  "No comments": "Noch keine Kommentare.",
1272
1274
  Tracking: "Nachverfolgung",
@@ -1319,6 +1321,7 @@ var enApp = {
1319
1321
  Editing: "Editing",
1320
1322
  Viewing: "Viewing",
1321
1323
  "Show comments": "Show comments",
1324
+ Share: "Share",
1322
1325
  "Unsaved changes": "Unsaved changes",
1323
1326
  Saved: "Saved",
1324
1327
  "Saving\u2026": "Saving\u2026",
@@ -1927,6 +1930,7 @@ var enRibbon = {
1927
1930
  Reply: "Reply",
1928
1931
  Resolve: "Resolve",
1929
1932
  Reopen: "Reopen",
1933
+ Resolved: "Resolved",
1930
1934
  Delete: "Delete",
1931
1935
  "No comments": "No comments yet.",
1932
1936
  Tracking: "Tracking",
@@ -1979,6 +1983,7 @@ var esApp = {
1979
1983
  Editing: "Edici\xF3n",
1980
1984
  Viewing: "Visualizaci\xF3n",
1981
1985
  "Show comments": "Mostrar comentarios",
1986
+ Share: "Compartir",
1982
1987
  "Unsaved changes": "Cambios sin guardar",
1983
1988
  Saved: "Guardado",
1984
1989
  "Saving\u2026": "Guardando\u2026",
@@ -2587,6 +2592,7 @@ var esRibbon = {
2587
2592
  Reply: "Responder",
2588
2593
  Resolve: "Resolver",
2589
2594
  Reopen: "Reabrir",
2595
+ Resolved: "Resuelto",
2590
2596
  Delete: "Eliminar",
2591
2597
  "No comments": "A\xFAn no hay comentarios.",
2592
2598
  Tracking: "Seguimiento",
@@ -2639,6 +2645,7 @@ var frApp = {
2639
2645
  Editing: "Modification",
2640
2646
  Viewing: "Lecture",
2641
2647
  "Show comments": "Afficher les commentaires",
2648
+ Share: "Partager",
2642
2649
  "Unsaved changes": "Modifications non enregistr\xE9es",
2643
2650
  Saved: "Enregistr\xE9",
2644
2651
  "Saving\u2026": "Enregistrement\u2026",
@@ -3247,6 +3254,7 @@ var frRibbon = {
3247
3254
  Reply: "R\xE9pondre",
3248
3255
  Resolve: "R\xE9soudre",
3249
3256
  Reopen: "Rouvrir",
3257
+ Resolved: "R\xE9solu",
3250
3258
  Delete: "Supprimer",
3251
3259
  "No comments": "Aucun commentaire pour le moment.",
3252
3260
  Tracking: "Suivi",
@@ -3299,6 +3307,7 @@ var zhCNApp = {
3299
3307
  Editing: "\u7F16\u8F91",
3300
3308
  Viewing: "\u67E5\u770B",
3301
3309
  "Show comments": "\u663E\u793A\u6279\u6CE8",
3310
+ Share: "\u5171\u4EAB",
3302
3311
  "Unsaved changes": "\u672A\u4FDD\u5B58\u7684\u66F4\u6539",
3303
3312
  Saved: "\u5DF2\u4FDD\u5B58",
3304
3313
  "Saving\u2026": "\u6B63\u5728\u4FDD\u5B58\u2026",
@@ -3907,6 +3916,7 @@ var zhCNRibbon = {
3907
3916
  Reply: "\u56DE\u590D",
3908
3917
  Resolve: "\u89E3\u51B3",
3909
3918
  Reopen: "\u91CD\u65B0\u6253\u5F00",
3919
+ Resolved: "\u5DF2\u89E3\u51B3",
3910
3920
  Delete: "\u5220\u9664",
3911
3921
  "No comments": "\u6682\u65E0\u6279\u6CE8\u3002",
3912
3922
  Tracking: "\u4FEE\u8BA2",
@@ -4061,8 +4071,18 @@ function localizeElement(root, locale) {
4061
4071
  }
4062
4072
  }
4063
4073
  }
4074
+ var controlCache = /* @__PURE__ */ new WeakMap();
4064
4075
  function findLocalizedControl(root, label) {
4065
- return root.querySelector(`[aria-label="${label}"], [data-localearialabel="${label}"]`);
4076
+ let cache = controlCache.get(root);
4077
+ const cached = cache?.get(label);
4078
+ if (cached?.isConnected && root.contains(cached) && (cached.getAttribute("aria-label") === label || cached.dataset.localearialabel === label))
4079
+ return cached;
4080
+ const found = root.querySelector(`[aria-label="${label}"], [data-localearialabel="${label}"]`);
4081
+ if (found) {
4082
+ if (!cache) controlCache.set(root, cache = /* @__PURE__ */ new Map());
4083
+ cache.set(label, found);
4084
+ }
4085
+ return found;
4066
4086
  }
4067
4087
 
4068
4088
  // src/docx/shell-labels.ts
@@ -4348,9 +4368,9 @@ var schema = new Schema({
4348
4368
  }
4349
4369
  const body = [
4350
4370
  "tbody",
4351
- ...rows.map((row4) => [
4371
+ ...rows.map((row3) => [
4352
4372
  "tr",
4353
- ...row4.map((cell) => ["td", cell.text])
4373
+ ...row3.map((cell) => ["td", cell.text])
4354
4374
  ])
4355
4375
  ];
4356
4376
  return ["table", { class: "dve-nested-preview", contenteditable: "false" }, body];
@@ -4366,12 +4386,12 @@ function cellKey(cell) {
4366
4386
  function tableNode(block, paragraphNode2, tableStyles) {
4367
4387
  const columnCount = Math.max(
4368
4388
  1,
4369
- ...block.rows.map((row4) => row4.reduce((sum, cell) => sum + (cell.gridSpan ?? 1), 0))
4389
+ ...block.rows.map((row3) => row3.reduce((sum, cell) => sum + (cell.gridSpan ?? 1), 0))
4370
4390
  );
4371
- const rows = block.rows.map((row4, rowIndex) => {
4391
+ const rows = block.rows.map((row3, rowIndex) => {
4372
4392
  const cells = [];
4373
4393
  let gridColumn = 0;
4374
- row4.forEach((cell, columnIndex) => {
4394
+ row3.forEach((cell, columnIndex) => {
4375
4395
  const column = gridColumn;
4376
4396
  gridColumn += cell.gridSpan ?? 1;
4377
4397
  if (cell.verticalMerge === "continue") return;
@@ -4446,19 +4466,19 @@ function tableNode(block, paragraphNode2, tableStyles) {
4446
4466
  }
4447
4467
  function tableFormattingFromNode(node) {
4448
4468
  const rowProperties = [];
4449
- node.forEach((row4) => rowProperties.push(structuredClone(row4.attrs.properties ?? {})));
4469
+ node.forEach((row3) => rowProperties.push(structuredClone(row3.attrs.properties ?? {})));
4450
4470
  return {
4451
- rowProperties: rowProperties.some((row4) => Object.keys(row4).length) ? rowProperties : void 0,
4471
+ rowProperties: rowProperties.some((row3) => Object.keys(row3).length) ? rowProperties : void 0,
4452
4472
  cellMargins: typeof node.attrs.cellMargins === "string" ? JSON.parse(node.attrs.cellMargins) : void 0
4453
4473
  };
4454
4474
  }
4455
4475
  function convertSimpleTable(node, convertParagraph, prior) {
4456
4476
  const priorCells = /* @__PURE__ */ new Map();
4457
- for (const row4 of prior?.rows ?? []) for (const cell of row4) priorCells.set(cellKey(cell), cell);
4477
+ for (const row3 of prior?.rows ?? []) for (const cell of row3) priorCells.set(cellKey(cell), cell);
4458
4478
  const rows = [];
4459
- node.forEach((row4) => {
4479
+ node.forEach((row3) => {
4460
4480
  const cells = [];
4461
- row4.forEach((cell) => {
4481
+ row3.forEach((cell) => {
4462
4482
  const paragraphs = [];
4463
4483
  cell.forEach((paragraph2) => {
4464
4484
  if (paragraph2.type.name === "paragraph") paragraphs.push(convertParagraph(paragraph2));
@@ -4492,9 +4512,9 @@ function convertSimpleTable(node, convertParagraph, prior) {
4492
4512
  function convertMergedTable(node, prior, convertParagraph) {
4493
4513
  const updated = structuredClone(prior);
4494
4514
  const cellByKey = /* @__PURE__ */ new Map();
4495
- for (const row4 of updated.rows) for (const cell of row4) cellByKey.set(cellKey(cell), cell);
4515
+ for (const row3 of updated.rows) for (const cell of row3) cellByKey.set(cellKey(cell), cell);
4496
4516
  node.forEach(
4497
- (row4) => row4.forEach((cellNode) => {
4517
+ (row3) => row3.forEach((cellNode) => {
4498
4518
  const target = cellByKey.get(String(cellNode.attrs.sourceCellKey || ""));
4499
4519
  if (!target) return;
4500
4520
  const paragraphs = [];
@@ -4551,14 +4571,14 @@ function sectionBreaksPlugin() {
4551
4571
  const json = state.doc.attrs.sections;
4552
4572
  const sections = typeof json === "string" ? JSON.parse(json) : [];
4553
4573
  if (sections.length < 2) return null;
4554
- const labels2 = /* @__PURE__ */ new Map();
4574
+ const labels3 = /* @__PURE__ */ new Map();
4555
4575
  sections.slice(0, -1).forEach((section3, index) => {
4556
4576
  const following = sections[index + 1];
4557
- if (following) labels2.set(section3.endsAtBlockId, BREAK_LABEL[following.type]);
4577
+ if (following) labels3.set(section3.endsAtBlockId, BREAK_LABEL[following.type]);
4558
4578
  });
4559
4579
  const decorations2 = [];
4560
4580
  state.doc.forEach((node, offset) => {
4561
- const label = labels2.get(String(node.attrs.id));
4581
+ const label = labels3.get(String(node.attrs.id));
4562
4582
  if (label)
4563
4583
  decorations2.push(
4564
4584
  Decoration.node(offset, offset + node.nodeSize, {
@@ -4572,8 +4592,8 @@ function sectionBreaksPlugin() {
4572
4592
  }
4573
4593
  });
4574
4594
  }
4575
- function paragraphNode(paragraph2, labels2, noteNumber) {
4576
- const label = labels2.get(paragraph2.id);
4595
+ function paragraphNode(paragraph2, labels3, noteNumber) {
4596
+ const label = labels3.get(paragraph2.id);
4577
4597
  const children = paragraph2.runs.flatMap((run) => runToInlineNodes(run, noteNumber));
4578
4598
  return schema.node(
4579
4599
  "paragraph",
@@ -4589,7 +4609,7 @@ function paragraphNode(paragraph2, labels2, noteNumber) {
4589
4609
  );
4590
4610
  }
4591
4611
  function modelToDoc(model) {
4592
- const labels2 = computeListLabels(model);
4612
+ const labels3 = computeListLabels(model);
4593
4613
  const footnoteOrder = numberNotesInOrder(model.blocks, "footnote");
4594
4614
  const endnoteOrder = numberNotesInOrder(model.blocks, "endnote");
4595
4615
  const noteNumber = (kind, id) => {
@@ -4598,10 +4618,10 @@ function modelToDoc(model) {
4598
4618
  return { number, label: formatNoteNumber(number, format) };
4599
4619
  };
4600
4620
  const blocks = model.blocks.map((block) => {
4601
- if (block.type === "paragraph") return paragraphNode(block, labels2, noteNumber);
4621
+ if (block.type === "paragraph") return paragraphNode(block, labels3, noteNumber);
4602
4622
  return tableNode(
4603
4623
  block,
4604
- (paragraph2) => paragraphNode(paragraph2, labels2, noteNumber),
4624
+ (paragraph2) => paragraphNode(paragraph2, labels3, noteNumber),
4605
4625
  model.tableStyles
4606
4626
  );
4607
4627
  });
@@ -4666,7 +4686,7 @@ function docToModel(doc, prior) {
4666
4686
  if (block.type === "paragraph") remember(block);
4667
4687
  else {
4668
4688
  priorTables.set(block.id, block);
4669
- for (const row4 of block.rows) for (const cell of row4) cell.paragraphs.forEach(remember);
4689
+ for (const row3 of block.rows) for (const cell of row3) cell.paragraphs.forEach(remember);
4670
4690
  }
4671
4691
  }
4672
4692
  const convertParagraph = (node) => {
@@ -4968,10 +4988,10 @@ var DOCX_EDITOR_EVENTS = [
4968
4988
  function on(target, name, listener) {
4969
4989
  target.addEventListener(name, (event) => listener(event));
4970
4990
  }
4971
- function emit(target, name, detail, options = {}) {
4991
+ function emit(target, name, detail2, options = {}) {
4972
4992
  return target.dispatchEvent(
4973
4993
  new CustomEvent(name, {
4974
- detail,
4994
+ detail: detail2,
4975
4995
  bubbles: true,
4976
4996
  composed: true,
4977
4997
  ...options
@@ -5435,7 +5455,7 @@ function openColorGridPopover(anchor, choose, options = {}) {
5435
5455
  grid(
5436
5456
  ...THEME.map(([hex, name]) => swatch(hex, name)),
5437
5457
  ...[0, 1, 2, 3, 4].flatMap(
5438
- (row4) => THEME.map(([, name], column) => swatch(shades[column][row4], name))
5458
+ (row3) => THEME.map(([, name], column) => swatch(shades[column][row3], name))
5439
5459
  )
5440
5460
  ),
5441
5461
  title("Standard Colors"),
@@ -5807,10 +5827,10 @@ function openGallery(anchor, control, kind, commands) {
5807
5827
  words.className = "gallery-words";
5808
5828
  words.append(name);
5809
5829
  if (look.detail) {
5810
- const detail = document.createElement("span");
5811
- detail.className = "gallery-detail";
5812
- detail.textContent = look.detail;
5813
- words.append(detail);
5830
+ const detail2 = document.createElement("span");
5831
+ detail2.className = "gallery-detail";
5832
+ detail2.textContent = look.detail;
5833
+ words.append(detail2);
5814
5834
  }
5815
5835
  item.append(look.thumb, words);
5816
5836
  item.addEventListener("mousedown", (event) => event.preventDefault());
@@ -6505,8 +6525,8 @@ var languageOptions = [
6505
6525
  ["hi-IN", "Hindi (India)"],
6506
6526
  ["ru-RU", "Russian (Russia)"]
6507
6527
  ];
6508
- function emit2(control, detail) {
6509
- emit(control, "ribbon-action", detail);
6528
+ function emit2(control, detail2) {
6529
+ emit(control, "ribbon-action", detail2);
6510
6530
  }
6511
6531
  function languageControl(label, key2) {
6512
6532
  const wrapper = document.createElement("label");
@@ -7838,15 +7858,15 @@ function runStylesPlugin(getModel, getMode = () => "all") {
7838
7858
  if (block.type.name !== "table") return;
7839
7859
  const table = tables.get(String(block.attrs.id));
7840
7860
  let columnCount = 1;
7841
- block.forEach((row4) => {
7861
+ block.forEach((row3) => {
7842
7862
  let width = 0;
7843
- row4.forEach((cell) => width += Number(cell.attrs.colspan) || 1);
7863
+ row3.forEach((cell) => width += Number(cell.attrs.colspan) || 1);
7844
7864
  columnCount = Math.max(columnCount, width);
7845
7865
  });
7846
- block.forEach((row4, rowOffset, rowIndex) => {
7866
+ block.forEach((row3, rowOffset, rowIndex) => {
7847
7867
  let column = 0;
7848
7868
  const rowStart = blockOffset + 1 + rowOffset + 1;
7849
- row4.forEach((cell, cellOffset) => {
7869
+ row3.forEach((cell, cellOffset) => {
7850
7870
  const tableStyleRun = table?.style ? resolveTableStyleFormatting(
7851
7871
  table.style,
7852
7872
  model.tableStyles,
@@ -9206,7 +9226,7 @@ function readCellFill(ctx, state, scope) {
9206
9226
  const fills = /* @__PURE__ */ new Set();
9207
9227
  const table = state.doc.nodeAt(ctx.tablePos);
9208
9228
  table?.forEach(
9209
- (row4, _offset, rowIndex) => row4.forEach((cell, _cellOffset, column) => {
9229
+ (row3, _offset, rowIndex) => row3.forEach((cell, _cellOffset, column) => {
9210
9230
  if (scope === "cell" && (rowIndex < ctx.rect.top || rowIndex > ctx.rect.bottom || column < ctx.rect.left || column > ctx.rect.right))
9211
9231
  return;
9212
9232
  const fill = cell.attrs.shadingFill;
@@ -9221,7 +9241,7 @@ function applyCellFill(tr, ctx, scope, fill) {
9221
9241
  const table = tr.doc.nodeAt(ctx.tablePos);
9222
9242
  if (!table) return;
9223
9243
  table.forEach(
9224
- (row4, rowOffset, rowIndex) => row4.forEach((cell, cellOffset, column) => {
9244
+ (row3, rowOffset, rowIndex) => row3.forEach((cell, cellOffset, column) => {
9225
9245
  if (scope === "cell" && (rowIndex < ctx.rect.top || rowIndex > ctx.rect.bottom || column < ctx.rect.left || column > ctx.rect.right))
9226
9246
  return;
9227
9247
  tr.setNodeMarkup(ctx.tablePos + 2 + rowOffset + cellOffset, void 0, {
@@ -9258,8 +9278,8 @@ function tableBorderContext(state) {
9258
9278
  if (table.attrs.structureEditable === false) return null;
9259
9279
  const tablePos = $from.before(depth);
9260
9280
  const cells = [];
9261
- table.forEach((row4, rowOffset, rowIndex) => {
9262
- row4.forEach((cell, cellOffset, column) => {
9281
+ table.forEach((row3, rowOffset, rowIndex) => {
9282
+ row3.forEach((cell, cellOffset, column) => {
9263
9283
  const pos = tablePos + 1 + rowOffset + 1 + cellOffset;
9264
9284
  if (Math.max(from2, pos + 1) <= Math.min(to, pos + cell.nodeSize - 1))
9265
9285
  cells.push({ pos, row: rowIndex, column, node: cell });
@@ -9283,11 +9303,11 @@ function tableBorderContext(state) {
9283
9303
  }
9284
9304
  function edgesOf(preset, rect) {
9285
9305
  const edges = [];
9286
- for (let row4 = rect.top; row4 <= rect.bottom; row4++)
9306
+ for (let row3 = rect.top; row3 <= rect.bottom; row3++)
9287
9307
  for (let column = rect.left; column <= rect.right; column++) {
9288
9308
  const outside = {
9289
- top: row4 === rect.top,
9290
- bottom: row4 === rect.bottom,
9309
+ top: row3 === rect.top,
9310
+ bottom: row3 === rect.bottom,
9291
9311
  left: column === rect.left,
9292
9312
  right: column === rect.right
9293
9313
  };
@@ -9295,13 +9315,13 @@ function edgesOf(preset, rect) {
9295
9315
  const isOutside = outside[side];
9296
9316
  const horizontal = side === "top" || side === "bottom";
9297
9317
  const wanted = preset === "all" || preset === "outside" && isOutside || preset === "insideH" && horizontal && !isOutside || preset === "insideV" && !horizontal && !isOutside || preset === side && isOutside;
9298
- if (wanted) edges.push({ row: row4, column, side });
9318
+ if (wanted) edges.push({ row: row3, column, side });
9299
9319
  }
9300
9320
  }
9301
9321
  return edges;
9302
9322
  }
9303
- var current = (ctx, state, row4, column) => {
9304
- const cell = state.doc.nodeAt(ctx.tablePos)?.child(row4).child(column);
9323
+ var current = (ctx, state, row3, column) => {
9324
+ const cell = state.doc.nodeAt(ctx.tablePos)?.child(row3).child(column);
9305
9325
  return parse2(cell?.attrs.borders);
9306
9326
  };
9307
9327
  function applyEdits(view, ctx, edits, shading) {
@@ -9326,9 +9346,9 @@ function applyEdits(view, ctx, edits, shading) {
9326
9346
  edit
9327
9347
  ]);
9328
9348
  let rowOffset = ctx.tablePos + 1;
9329
- table.forEach((row4, _offset, rowIndex) => {
9349
+ table.forEach((row3, _offset, rowIndex) => {
9330
9350
  let cellPos = rowOffset + 1;
9331
- row4.forEach((cell, _cellOffset, column) => {
9351
+ row3.forEach((cell, _cellOffset, column) => {
9332
9352
  const group3 = grouped.get(`${rowIndex}:${column}`);
9333
9353
  if (group3) {
9334
9354
  const visual = parse2(cell.attrs.borders);
@@ -9350,7 +9370,7 @@ function applyEdits(view, ctx, edits, shading) {
9350
9370
  }
9351
9371
  cellPos += cell.nodeSize;
9352
9372
  });
9353
- rowOffset += row4.nodeSize;
9373
+ rowOffset += row3.nodeSize;
9354
9374
  });
9355
9375
  if (shading) applyCellFill(tr, ctx, shading.scope, shading.fill);
9356
9376
  if (!tr.docChanged) return false;
@@ -10129,9 +10149,9 @@ function paragraphElement(paragraph2, values2) {
10129
10149
  function blockElement(block, values2) {
10130
10150
  if (block.type === "paragraph") return paragraphElement(block, values2);
10131
10151
  const table = document.createElement("table");
10132
- for (const row4 of block.rows) {
10152
+ for (const row3 of block.rows) {
10133
10153
  const tr = document.createElement("tr");
10134
- for (const cell of row4) {
10154
+ for (const cell of row3) {
10135
10155
  const td = document.createElement("td");
10136
10156
  if (cell.gridSpan && cell.gridSpan > 1) td.colSpan = cell.gridSpan;
10137
10157
  for (const paragraph2 of cell.paragraphs) td.append(paragraphElement(paragraph2, values2));
@@ -10150,7 +10170,7 @@ function renderHeaderFooter(content, values2, kind) {
10150
10170
  }
10151
10171
  function floatingPictures(content, page2, anchorTopPx, values2) {
10152
10172
  const paragraphs = content.blocks.flatMap(
10153
- (block) => block.type === "paragraph" ? [block] : block.rows.flatMap((row4) => row4.flatMap((cell) => cell.paragraphs))
10173
+ (block) => block.type === "paragraph" ? [block] : block.rows.flatMap((row3) => row3.flatMap((cell) => cell.paragraphs))
10154
10174
  );
10155
10175
  const column = { xPx: 0, widthPx: page2.widthPx - page2.marginLeftPx - page2.marginRightPx };
10156
10176
  return paragraphs.flatMap(
@@ -11028,10 +11048,10 @@ function tablePropertiesContext(state) {
11028
11048
  const rows = [];
11029
11049
  const cells = [];
11030
11050
  let pos = $from.start(depth);
11031
- table.forEach((row4, offset, index) => {
11051
+ table.forEach((row3, offset, index) => {
11032
11052
  if (index >= $from.index(depth) && index <= $to.index(depth))
11033
- rows.push({ pos: pos + offset, properties: row4.attrs.properties ?? {} });
11034
- row4.forEach((cell, cellOffset) => {
11053
+ rows.push({ pos: pos + offset, properties: row3.attrs.properties ?? {} });
11054
+ row3.forEach((cell, cellOffset) => {
11035
11055
  const cellPos = pos + offset + 1 + cellOffset;
11036
11056
  if (Math.max(state.selection.from, cellPos + 1) <= Math.min(state.selection.to, cellPos + cell.nodeSize - 1))
11037
11057
  cells.push({
@@ -11057,12 +11077,12 @@ function applyTableProperties(view, rowPatch, marginPatch, cellMarginPatch, cell
11057
11077
  if (!Object.keys(rowPatch).length && !Object.keys(marginPatch).length && cellMarginPatch === void 0 && cellAlignment === void 0)
11058
11078
  return true;
11059
11079
  const tr = closeHistory(view.state.tr);
11060
- for (const row4 of context2.rows) {
11061
- const node = tr.doc.nodeAt(row4.pos);
11062
- const properties = { ...row4.properties, ...rowPatch };
11080
+ for (const row3 of context2.rows) {
11081
+ const node = tr.doc.nodeAt(row3.pos);
11082
+ const properties = { ...row3.properties, ...rowPatch };
11063
11083
  for (const key2 of Object.keys(properties))
11064
11084
  if (properties[key2] === void 0) delete properties[key2];
11065
- tr.setNodeMarkup(row4.pos, void 0, {
11085
+ tr.setNodeMarkup(row3.pos, void 0, {
11066
11086
  ...node.attrs,
11067
11087
  properties,
11068
11088
  heightPx: properties.heightTwips ? properties.heightTwips / 15 : null
@@ -11222,7 +11242,7 @@ function createTablePropertiesDialog(viewOf) {
11222
11242
  element.replaceChildren(...content);
11223
11243
  localizeDialog(element, locale);
11224
11244
  const common = (read) => {
11225
- const values2 = context2.rows.map((row4) => read(row4.properties));
11245
+ const values2 = context2.rows.map((row3) => read(row3.properties));
11226
11246
  return values2.every((value) => value === values2[0]) ? values2[0] : null;
11227
11247
  };
11228
11248
  setTriState(
@@ -12330,13 +12350,13 @@ function syncFormatControls(toolbar, state) {
12330
12350
  });
12331
12351
  if (!found) addMarks(state.selection.$from.marks());
12332
12352
  }
12333
- const labels2 = {
12353
+ const labels3 = {
12334
12354
  bold: "Bold",
12335
12355
  italic: "Italic",
12336
12356
  underline: "Underline",
12337
12357
  strike: "Strikethrough"
12338
12358
  };
12339
- for (const [key2, label] of Object.entries(labels2)) {
12359
+ for (const [key2, label] of Object.entries(labels3)) {
12340
12360
  const values2 = marked.get(key2);
12341
12361
  findLocalizedControl(toolbar, label)?.setAttribute(
12342
12362
  "aria-pressed",
@@ -12958,7 +12978,7 @@ function paragraphStylesPlugin(getModel, getMode = () => "all") {
12958
12978
  state.doc.descendants((node) => {
12959
12979
  if (node.type.name === "paragraph") paragraphs.push(displayParagraph(node, mode).value);
12960
12980
  });
12961
- const labels2 = computeListLabels({ ...model, blocks: paragraphs });
12981
+ const labels3 = computeListLabels({ ...model, blocks: paragraphs });
12962
12982
  const decorations2 = [];
12963
12983
  state.doc.descendants((node, pos) => {
12964
12984
  if (node.type.name !== "paragraph") return;
@@ -12966,7 +12986,7 @@ function paragraphStylesPlugin(getModel, getMode = () => "all") {
12966
12986
  const paragraph2 = projected.value;
12967
12987
  const reset = mode === "original" && node.attrs.formatRevision && !projected.error ? `${ORIGINAL_PARAGRAPH_RESET};` : "";
12968
12988
  const effective = catalog ? resolveParagraphFormatting(paragraph2, catalog) : paragraph2;
12969
- const label = labels2.get(String(node.attrs.id));
12989
+ const label = labels3.get(String(node.attrs.id));
12970
12990
  const marker = listMarkerDisplay(
12971
12991
  node,
12972
12992
  { ...paragraph2, ...effective },
@@ -13009,8 +13029,8 @@ function context(view) {
13009
13029
  const table = $from.node(tableDepth);
13010
13030
  const width = table.childCount ? table.child(0).childCount : 0;
13011
13031
  if (!width || table.childCount < 1) return null;
13012
- for (let row4 = 0; row4 < table.childCount; row4++)
13013
- if (table.child(row4).childCount !== width) return null;
13032
+ for (let row3 = 0; row3 < table.childCount; row3++)
13033
+ if (table.child(row3).childCount !== width) return null;
13014
13034
  return {
13015
13035
  table,
13016
13036
  tablePos: $from.before(tableDepth),
@@ -13100,9 +13120,9 @@ function executeTableCommand(view, action) {
13100
13120
  view,
13101
13121
  ctx,
13102
13122
  rows.map(
13103
- (row4) => row4.copy(
13123
+ (row3) => row3.copy(
13104
13124
  Fragment.fromArray(
13105
- Array.from({ length: row4.childCount }, (_, index) => row4.child(index)).filter(
13125
+ Array.from({ length: row3.childCount }, (_, index) => row3.child(index)).filter(
13106
13126
  (_, index) => index !== ctx.columnIndex
13107
13127
  )
13108
13128
  )
@@ -13115,10 +13135,10 @@ function executeTableCommand(view, action) {
13115
13135
  replacedTable(
13116
13136
  view,
13117
13137
  ctx,
13118
- rows.map((row4) => {
13119
- const cells = Array.from({ length: row4.childCount }, (_, index) => row4.child(index));
13138
+ rows.map((row3) => {
13139
+ const cells = Array.from({ length: row3.childCount }, (_, index) => row3.child(index));
13120
13140
  cells.splice(at, 0, emptyCell(nextId));
13121
- return row4.copy(Fragment.fromArray(cells));
13141
+ return row3.copy(Fragment.fromArray(cells));
13122
13142
  })
13123
13143
  );
13124
13144
  return true;
@@ -13256,13 +13276,6 @@ function markerPositions(geometry) {
13256
13276
  right: geometry.pageWidth - geometry.marginRight - geometry.indentRight
13257
13277
  };
13258
13278
  }
13259
- function inchLabels(geometry) {
13260
- const labels2 = [];
13261
- const width = geometry.pageWidth - geometry.marginLeft - geometry.marginRight;
13262
- for (let inch = 1; inch * PX_PER_INCH < width; inch++)
13263
- labels2.push({ at: geometry.marginLeft + inch * PX_PER_INCH, text: String(inch) });
13264
- return labels2;
13265
- }
13266
13279
  function markerChange(marker, x, geometry) {
13267
13280
  const snap = (px2) => Math.round(px2 / SNAP_PX) * SNAP_PX;
13268
13281
  const inches3 = (px2) => Math.round(px2 / PX_PER_INCH * 1e3) / 1e3;
@@ -13289,87 +13302,52 @@ function markerChange(marker, x, geometry) {
13289
13302
  }
13290
13303
  var SNAP_PX = PX_PER_INCH / 16;
13291
13304
  var geometries = /* @__PURE__ */ new WeakMap();
13292
- function enableDragging(ruler, onChange) {
13293
- for (const name of ["first-line", "left", "right"]) {
13294
- const marker = ruler.querySelector(`.dve-ruler-marker-${name}`);
13295
- marker.addEventListener("pointerdown", (event) => {
13296
- const geometry = geometries.get(ruler);
13297
- if (!geometry || event.button !== 0) return;
13298
- event.preventDefault();
13299
- marker.setPointerCapture?.(event.pointerId);
13300
- const zoom = Number(ruler.style.getPropertyValue("--dve-zoom")) || 1;
13301
- const at = (e) => (e.clientX - ruler.getBoundingClientRect().left) / zoom;
13302
- const move = (e) => {
13303
- const preview = markerChange(name, at(e), geometry);
13304
- const shifted = { ...geometry };
13305
- if (preview.leftInches !== void 0) shifted.indentLeft = preview.leftInches * PX_PER_INCH;
13306
- if (preview.rightInches !== void 0)
13307
- shifted.indentRight = preview.rightInches * PX_PER_INCH;
13308
- if (preview.special)
13309
- shifted.firstLine = (preview.special === "hanging" ? -1 : 1) * (preview.specialInches ?? 0) * PX_PER_INCH;
13310
- paintMarkers(ruler, shifted);
13311
- };
13312
- const finish = (e) => {
13313
- marker.removeEventListener("pointermove", move);
13314
- marker.removeEventListener("pointerup", finish);
13315
- marker.removeEventListener("pointercancel", finish);
13316
- onChange(e.type === "pointerup" ? markerChange(name, at(e), geometry) : {});
13317
- };
13318
- marker.addEventListener("pointermove", move);
13319
- marker.addEventListener("pointerup", finish);
13320
- marker.addEventListener("pointercancel", finish);
13321
- });
13322
- }
13305
+ function previewGeometry(marker, x, geometry) {
13306
+ const preview = markerChange(marker, x, geometry);
13307
+ const shifted = { ...geometry };
13308
+ if (preview.leftInches !== void 0) shifted.indentLeft = preview.leftInches * PX_PER_INCH;
13309
+ if (preview.rightInches !== void 0) shifted.indentRight = preview.rightInches * PX_PER_INCH;
13310
+ if (preview.special)
13311
+ shifted.firstLine = (preview.special === "hanging" ? -1 : 1) * (preview.specialInches ?? 0) * PX_PER_INCH;
13312
+ return shifted;
13323
13313
  }
13324
13314
  function paintMarkers(ruler, geometry) {
13325
13315
  const positions = markerPositions(geometry);
13326
- const at = (name) => ruler.querySelector(`.dve-ruler-marker-${name}`);
13327
- at("first-line").style.left = `${positions.firstLine}px`;
13328
- at("left").style.left = `${positions.left}px`;
13329
- at("right").style.left = `${positions.right}px`;
13316
+ ruler.markers = [
13317
+ { name: "first-line", position: positions.firstLine, edge: "top" },
13318
+ { name: "left", position: positions.left },
13319
+ { name: "right", position: positions.right }
13320
+ ];
13330
13321
  }
13331
13322
  function createRuler(onChange) {
13332
- const ruler = document.createElement("div");
13323
+ defineRuler();
13324
+ const ruler = document.createElement("office-ui-ruler");
13333
13325
  ruler.className = "dve-ruler";
13334
- ruler.setAttribute("role", "img");
13335
- ruler.setAttribute("aria-label", "Ruler");
13336
- for (const name of ["margin-left", "margin-right", "labels"]) {
13337
- const part = document.createElement("div");
13338
- part.className = `dve-ruler-${name}`;
13339
- ruler.append(part);
13340
- }
13341
- for (const name of ["first-line", "left", "right"]) {
13342
- const marker = document.createElement("div");
13343
- marker.className = `dve-ruler-marker dve-ruler-marker-${name}`;
13344
- ruler.append(marker);
13345
- }
13346
- if (onChange) enableDragging(ruler, onChange);
13326
+ ruler.label = "Ruler";
13327
+ ruler.labelsWithinMargins = true;
13328
+ const detail2 = (event) => event.detail;
13329
+ const marker = (event) => detail2(event).name;
13330
+ ruler.addEventListener("ruler-marker-move", (event) => {
13331
+ const geometry = geometries.get(ruler);
13332
+ if (geometry)
13333
+ paintMarkers(ruler, previewGeometry(marker(event), detail2(event).position, geometry));
13334
+ });
13335
+ ruler.addEventListener("ruler-marker-commit", (event) => {
13336
+ const geometry = geometries.get(ruler);
13337
+ if (geometry) onChange?.(markerChange(marker(event), detail2(event).position, geometry));
13338
+ });
13339
+ ruler.addEventListener("ruler-marker-cancel", () => onChange?.({}));
13347
13340
  return ruler;
13348
13341
  }
13349
13342
  function updateRuler(ruler, geometry, zoom) {
13350
- const part = (name) => ruler.querySelector(`.dve-ruler-${name}`);
13351
- ruler.style.width = `${geometry.pageWidth}px`;
13352
- ruler.style.setProperty("--dve-zoom", String(zoom));
13353
- ruler.style.setProperty("--dve-ruler-origin", `${geometry.marginLeft}px`);
13354
- const left = part("margin-left");
13355
- left.style.width = `${geometry.marginLeft}px`;
13356
- const right = part("margin-right");
13357
- right.style.width = `${geometry.marginRight}px`;
13343
+ const element = ruler;
13358
13344
  geometries.set(ruler, geometry);
13359
- paintMarkers(ruler, geometry);
13360
- const labels2 = part("labels");
13361
- const wanted = inchLabels(geometry);
13362
- if (labels2.dataset.key !== JSON.stringify(wanted)) {
13363
- labels2.dataset.key = JSON.stringify(wanted);
13364
- labels2.replaceChildren(
13365
- ...wanted.map(({ at, text }) => {
13366
- const label = document.createElement("span");
13367
- label.textContent = text;
13368
- label.style.left = `${at}px`;
13369
- return label;
13370
- })
13371
- );
13372
- }
13345
+ element.extent = geometry.pageWidth;
13346
+ element.zoom = zoom;
13347
+ element.origin = geometry.marginLeft;
13348
+ element.marginStart = geometry.marginLeft;
13349
+ element.marginEnd = geometry.marginRight;
13350
+ paintMarkers(element, geometry);
13373
13351
  }
13374
13352
 
13375
13353
  // src/docx/ruler-sync.ts
@@ -13445,9 +13423,9 @@ function refreshEditorControls(toolbar, view, model, readOnly, collaboration, lo
13445
13423
  syncParagraphToggles(toolbar, view, model);
13446
13424
  syncContextualTabs(toolbar, state);
13447
13425
  syncRuler(toolbar, view, model);
13448
- const trackButton = toolbar.querySelector('[aria-label="Track changes"]');
13426
+ const trackButton = findLocalizedControl(toolbar, "Track changes");
13449
13427
  trackButton?.setAttribute("aria-pressed", String(Boolean(model.trackChanges)));
13450
- const commentsButton = toolbar.querySelector('[aria-label="Comments"]');
13428
+ const commentsButton = findLocalizedControl(toolbar, "Comments");
13451
13429
  commentsButton?.setAttribute("aria-pressed", String(commentsOpen));
13452
13430
  const changeAtCursor = hasChangeAtCursor(view);
13453
13431
  const anyChange = hasAnyChange(view);
@@ -13467,9 +13445,7 @@ function refreshEditorControls(toolbar, view, model, readOnly, collaboration, lo
13467
13445
  state.selection instanceof NodeSelection && state.selection.node.type.name === "image"
13468
13446
  ]
13469
13447
  ]) {
13470
- const control = toolbar.querySelector(
13471
- `[data-localearialabel="${label}"], [aria-label="${label}"]`
13472
- );
13448
+ const control = findLocalizedControl(toolbar, label);
13473
13449
  if (control) control.disabled = readOnly || !enabled;
13474
13450
  }
13475
13451
  }
@@ -14001,6 +13977,10 @@ function imageNodeView(cache, options = {}) {
14001
13977
  return (node, view, getPos) => {
14002
13978
  const diagram = parseDiagram(node.attrs.diagram);
14003
13979
  if (diagram) return smartArtNodeView(node, diagram, options.theme?.());
13980
+ if (node.attrs.chart) {
13981
+ const spec = chartNodeSpec(node, options.theme?.());
13982
+ return { dom: DOMSerializer.renderSpec(document, spec).dom, ignoreMutation: () => true };
13983
+ }
14004
13984
  const content = renderSpec(node);
14005
13985
  if (content.tagName !== "IMG") return { dom: content, ignoreMutation: () => true };
14006
13986
  const refresh = () => {
@@ -14340,7 +14320,7 @@ function refreshPreviewScaleWithFonts(element, text, formatting, family) {
14340
14320
  // src/docx/preview-run-styles.ts
14341
14321
  function stylePreviewRuns(element, block, model, serializer, mode = "all") {
14342
14322
  const measurer = scaleMeasurer();
14343
- const paragraphs = block.type === "paragraph" ? [block] : block.rows.flatMap((row4) => row4.flatMap((cell) => cell.paragraphs));
14323
+ const paragraphs = block.type === "paragraph" ? [block] : block.rows.flatMap((row3) => row3.flatMap((cell) => cell.paragraphs));
14344
14324
  const elements = block.type === "paragraph" ? [element] : [...element.querySelectorAll("p")];
14345
14325
  paragraphs.forEach((current2, index) => {
14346
14326
  const target = elements[index];
@@ -14417,10 +14397,10 @@ function blockNode(block) {
14417
14397
  return schema.node("paragraph", paragraphAttrs(block), children);
14418
14398
  }
14419
14399
  const rows = block.rows.map(
14420
- (row4) => schema.node(
14400
+ (row3) => schema.node(
14421
14401
  "tableRow",
14422
14402
  null,
14423
- row4.map(
14403
+ row3.map(
14424
14404
  (cell) => schema.node(
14425
14405
  "tableCell",
14426
14406
  null,
@@ -16060,8 +16040,8 @@ var InsertController = class {
16060
16040
  if (action.key === "figures")
16061
16041
  insertTableOfContents(view, this.host.model(), void 0, 3, action.label ?? "Figure");
16062
16042
  else if (action.key === "updateFigures") {
16063
- const labels2 = action.label ? [action.label] : ["Figure", "Table", "Equation"];
16064
- const updated = labels2.filter(
16043
+ const labels3 = action.label ? [action.label] : ["Figure", "Table", "Equation"];
16044
+ const updated = labels3.filter(
16065
16045
  (label) => updateTableOfContents(view, this.host.model(), void 0, label)
16066
16046
  );
16067
16047
  if (!updated.length)
@@ -16441,6 +16421,7 @@ var EditorCore = class {
16441
16421
  );
16442
16422
  const { searchPanel, printLayout, review, chrome, toolbar } = this.shell;
16443
16423
  searchPanel?.refresh();
16424
+ if (review?.commentsOpen) review.commentsPanel.refresh();
16444
16425
  if (this.pages.viewMode === "print") printLayout?.refreshCurrentPage();
16445
16426
  const status = refreshEditorControls(
16446
16427
  toolbar,
@@ -16464,7 +16445,7 @@ var EditorCore = class {
16464
16445
  this.host.canEditOutsideBody()
16465
16446
  );
16466
16447
  syncPageState(this);
16467
- chrome?.titleBar.setCommentsOpen(Boolean(review?.commentsOpen));
16448
+ chrome?.ribbonActions.setCommentsOpen(Boolean(review?.commentsOpen));
16468
16449
  }
16469
16450
  };
16470
16451
 
@@ -16499,10 +16480,10 @@ var ribbon_polish_default = "/* Ribbon polish: distinct pressed state and Word's
16499
16480
  var document_default = ".dve-revision-insert {\n color: var(--dve-revision-color, inherit);\n text-decoration: underline;\n text-decoration-color: var(--dve-revision-color, currentColor);\n}\n.dve-revision-delete {\n color: var(--dve-revision-color, inherit);\n text-decoration: line-through;\n text-decoration-color: var(--dve-revision-color, currentColor);\n}\n/* Moved text, like Word: green, double underline at the destination, double strike at the source. */\n.dve-revision-move {\n --dve-revision-color: #2e7d32;\n text-decoration-style: double;\n}\n.ProseMirror .dve-revision-hidden {\n /* Review visibility takes precedence over picture/equation node-view display rules. */\n display: none !important;\n}\n[data-review-display]:not([data-review-display='all']) .dve-revision-insert,\n[data-review-display]:not([data-review-display='all']) .dve-revision-delete {\n color: inherit;\n text-decoration: none;\n}\n[data-review-display]:not([data-review-display='all']) .dve-comment-range {\n background: transparent;\n}\n.dve-revision-format-markup {\n outline: 1px dotted currentColor;\n outline-offset: 2px;\n}\n.dve-comment-range {\n background: rgba(255, 212, 0, 0.28);\n}\n.dve-paper {\n box-sizing: border-box;\n position: relative;\n flex: none;\n margin: 0 auto;\n background: var(--dve-page-color, #fff);\n color: #202124;\n box-shadow:\n 0 1px 3px #20212430,\n 0 4px 12px #20212420;\n outline: none;\n /* Single spacing and no paragraph gap unless the document's styles set them, as in Word. */\n font:\n 11pt/1.2 Calibri,\n Carlito,\n Arial,\n sans-serif;\n zoom: var(--dve-zoom, 1);\n}\n.dve-paper p {\n min-height: 1.2em;\n margin: 0;\n white-space: pre-wrap;\n}\n.dve-paper p:last-child {\n margin-bottom: 0;\n}\n/* The caret marks focus in the document, as in Word; no ring around the editable area. */\n.dve-paper .ProseMirror:focus,\n.dve-paper .ProseMirror:focus-visible {\n outline: none;\n}\n.dve-paper:focus {\n box-shadow:\n 0 1px 3px #20212430,\n 0 4px 12px #20212420,\n 0 0 0 1px var(--blue);\n}\n/* Columns follow the table's grid and cell widths (equal when it has none), as Word lays them out;\n tables add no space around themselves. */\n.dve-paper table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n margin: 0;\n}\n.dve-paper td {\n min-width: 44px;\n border: var(--dve-cell-border, 1px dashed #c8c6c4);\n vertical-align: top;\n}\n.dve-paper td p {\n margin: 0;\n}\n.dve-paper p[data-list-label]::before {\n content: attr(data-list-label);\n white-space: pre;\n user-select: none;\n}\n.dve-paper p[data-list-marker]:not([data-list-marker=''])::before {\n content: attr(data-list-marker);\n position: absolute;\n left: var(--dve-marker-left);\n text-indent: 0;\n font-family: var(--dve-marker-family);\n font-size: var(--dve-marker-size);\n font-weight: var(--dve-marker-weight);\n font-style: var(--dve-marker-style);\n color: var(--dve-marker-color);\n}\n.multilingual-controls {\n flex: 1 1 100%;\n align-items: flex-start;\n gap: 9px 14px;\n}\n.multilingual-language-control {\n display: grid;\n grid-template-columns: minmax(145px, 180px);\n gap: 4px;\n color: var(--muted);\n font-size: 11px;\n}\n.multilingual-language-control select,\n.multilingual-language-control input {\n box-sizing: border-box;\n width: 180px;\n}\n.multilingual-language-control input {\n height: 26px;\n border: 1px solid var(--line);\n border-radius: 3px;\n background: var(--surface);\n padding: 0 7px;\n color: var(--ink);\n font:\n 11px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.multilingual-note {\n align-self: end;\n max-width: 240px;\n color: var(--muted);\n font-size: 11px;\n}\n@media (max-width: 650px) {\n .ribbon-panel {\n min-height: 96px;\n padding: 6px;\n gap: 4px;\n }\n .ribbon-group {\n padding-right: 7px;\n }\n .ribbon-panel[data-panel='Home'] .ribbon-group[data-label='Font'] {\n width: 340px;\n }\n .ribbon-panel[data-panel='Home'] .ribbon-group[data-label='Paragraph'] {\n width: 280px;\n }\n .ribbon-panel[data-panel='Home'] .ribbon-group[data-label='Editing'] {\n width: auto;\n }\n .ribbon-group button {\n min-width: 34px;\n min-height: 34px;\n }\n .ribbon-group select {\n max-width: min(150px, 42vw);\n }\n .dve-canvas {\n padding: 18px 8px 38px;\n align-items: flex-start;\n }\n .ribbon-group select.font-family-select {\n width: 120px;\n max-width: 38vw;\n }\n .ribbon-group select.font-size-select {\n width: 56px;\n }\n .ribbon-group select.spacing-select {\n width: min(128px, 36vw);\n }\n .ribbon-group select.line-spacing-select {\n width: min(112px, 32vw);\n }\n}\n.dve-break-marker {\n display: block;\n margin: 0.4em 0;\n padding: 2px 0;\n border-top: 1px dashed var(--muted);\n border-bottom: 1px dashed var(--muted);\n color: var(--muted);\n font-size: 10px;\n text-align: center;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n user-select: none;\n}\n.dve-note-reference {\n color: var(--blue);\n cursor: default;\n}\n.dve-header,\n.dve-footer {\n box-sizing: border-box;\n width: 816px;\n max-width: 100%;\n margin: 0 auto;\n padding: 10px clamp(16px, 5vw, 70px);\n background: var(--surface);\n color: var(--muted);\n font:\n 10pt/1.35 Calibri,\n Arial,\n sans-serif;\n}\n.dve-header {\n border-bottom: 1px dashed var(--line);\n}\n.dve-footer {\n border-top: 1px dashed var(--line);\n}\n.dve-header-footer-label {\n margin-bottom: 2px;\n color: var(--muted);\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n.dve-notes-container {\n box-sizing: border-box;\n width: 816px;\n max-width: 100%;\n margin: 12px auto 0;\n}\n.dve-notes {\n box-sizing: border-box;\n padding: 10px clamp(16px, 5vw, 70px);\n background: var(--surface);\n border-top: 1px solid var(--line);\n font:\n 10pt/1.35 Calibri,\n Arial,\n sans-serif;\n}\n.dve-notes-heading {\n margin: 0 0 6px;\n color: var(--ink);\n font-size: 12px;\n}\n.dve-note-list {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.dve-note-list li {\n display: flex;\n gap: 4px;\n align-items: baseline;\n margin-bottom: 4px;\n}\n.dve-note-marker {\n flex: none;\n color: var(--muted);\n}\n@media (prefers-reduced-motion: reduce) {\n * {\n scroll-behavior: auto !important;\n }\n}\n\n/* Print Layout: a read-only, paginated render kept beside the continuous\n editing surface (see print-layout.ts / print-layout-view.ts). */\n";
16500
16481
 
16501
16482
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/print.css?raw
16502
- var print_default = ".dve-print-pages {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n margin: 0 auto;\n zoom: var(--dve-zoom, 1);\n}\n.dve-print-pages[hidden] {\n display: none;\n}\n.dve-print-page {\n position: relative;\n flex: none;\n background: var(--dve-page-color, #fff);\n color: #202124;\n box-shadow:\n 0 1px 3px #20212430,\n 0 4px 12px #20212420;\n overflow: hidden;\n}\n.dve-print-column {\n position: absolute;\n z-index: 1;\n}\n/* Floating pictures sit in front of text unless anchored behind it (wp:anchor/@behindDoc). */\n.dve-print-float {\n z-index: 2;\n}\n.dve-print-float-behind {\n z-index: 0;\n}\n.dve-print-picture-missing {\n box-sizing: border-box;\n border: 1px dashed #8a8886;\n background: #f3f2f1;\n}\n.dve-print-block {\n position: absolute;\n left: 0;\n width: 100%;\n}\n.dve-print-line {\n position: absolute;\n left: 0;\n width: 100%;\n font:\n 11pt/1.2 Calibri,\n Arial,\n sans-serif;\n cursor: text;\n}\n.dve-print-line span {\n position: absolute;\n top: 0;\n}\n.dve-print-row {\n position: absolute;\n left: 0;\n width: 100%;\n}\n/* Cells sit at their grid positions; borders come from the document (Word prints no gridlines). */\n.dve-print-cell {\n position: absolute;\n top: 0;\n box-sizing: border-box;\n}\n.dve-print-cell-content {\n position: absolute;\n bottom: 0;\n}\n@media print {\n .dve-ribbon,\n .dve-status,\n .multilingual-controls {\n display: none !important;\n }\n .dve-canvas {\n overflow: visible !important;\n padding: 0 !important;\n }\n .dve-paper {\n display: none !important;\n }\n .dve-print-pages {\n gap: 0 !important;\n zoom: 1 !important;\n }\n .dve-print-page {\n /* Like Word, page colours are not printed unless asked for. */\n background: #fff !important;\n box-shadow: none !important;\n break-after: page;\n }\n}\n.dve-print-header,\n.dve-print-footer {\n position: absolute;\n color: var(--ink);\n font-size: 11pt;\n pointer-events: none;\n}\n.dve-print-header p,\n.dve-print-footer p {\n margin: 0;\n}\n.dve-print-header table,\n.dve-print-footer table {\n width: 100%;\n border-collapse: collapse;\n}\n\n/* Complex field begin/code/separate/end markers: kept in the document, never shown. */\n.dve-field-marker {\n display: inline;\n font-size: 0;\n}\n\n/* TOC entries link to hidden _Toc bookmarks; Word draws them in the entry's style, not as links. */\na.dve-link[data-anchor^='_Toc'] {\n color: inherit;\n text-decoration: none;\n}\n\n/* Tabs sized to Word's tab stops by tab-stops-view.ts; leaders fill the tab's width. */\n.dve-tab {\n display: inline-block;\n overflow: hidden;\n white-space: pre;\n vertical-align: baseline;\n text-indent: 0;\n}\n.dve-tab-leader-dot,\n.dve-tab-leader-middleDot {\n background-image: radial-gradient(circle, currentColor 0.8px, transparent 1.1px);\n background-size: 4px 4px;\n background-repeat: repeat-x;\n background-position: right 0 bottom 0.25em;\n}\n.dve-tab-leader-hyphen {\n background-image: linear-gradient(to right, currentColor 50%, transparent 50%);\n background-size: 6px 1px;\n background-repeat: repeat-x;\n background-position: right 0 bottom 0.4em;\n}\n.dve-tab-leader-underscore,\n.dve-tab-leader-heavy {\n border-bottom: 1px solid currentColor;\n}\n.dve-tab-leader-heavy {\n border-bottom-width: 2px;\n}\n\n/* Footnotes above the bottom margin; the separator is Word's 2-inch rule. */\n.dve-print-footnotes {\n position: absolute;\n z-index: 1;\n}\n.dve-print-footnote-separator {\n position: absolute;\n top: -7px;\n left: 0;\n width: 192px;\n border-top: 1px solid currentColor;\n}\n.dve-print-footnote {\n position: absolute;\n left: 0;\n width: 100%;\n}\n\n[data-print-view] .dve-notes-container {\n display: none;\n}\n\n/* Word draws superscript and subscript at about two thirds size without growing the line. */\n.dve-paper sup,\n.dve-paper sub {\n font-size: 0.65em;\n line-height: 0;\n}\n/* Exact-height rows clip content that does not fit, as Word does. */\n.dve-print-cell {\n overflow: hidden;\n}\n.dve-print-paragraph-frame {\n position: absolute;\n top: 0;\n box-sizing: border-box;\n}\n\n/* View > Multiple Pages: Print Layout's sheets sit side by side and wrap, instead of one column. */\n.dve-canvas[data-multipage] .dve-print-pages {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: center;\n}\n\n/* Layout > Line Numbers: numbers in the left margin, one per printed line. */\n.dve-print-line-number {\n position: absolute;\n width: 40px;\n text-align: right;\n font:\n 10px 'Segoe UI',\n Arial,\n sans-serif;\n color: #444;\n pointer-events: none;\n}\n";
16483
+ var print_default = ".dve-print-pages {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n margin: 0 auto;\n zoom: var(--dve-zoom, 1);\n}\n.dve-print-pages[hidden] {\n display: none;\n}\n.dve-print-page {\n position: relative;\n flex: none;\n background: var(--dve-page-color, #fff);\n color: #202124;\n box-shadow:\n 0 1px 3px #20212430,\n 0 4px 12px #20212420;\n overflow: hidden;\n}\n.dve-print-column {\n position: absolute;\n z-index: 1;\n}\n/* Floating pictures sit in front of text unless anchored behind it (wp:anchor/@behindDoc). */\n.dve-print-float {\n z-index: 2;\n}\n.dve-print-float-behind {\n z-index: 0;\n}\n.dve-print-picture-missing {\n box-sizing: border-box;\n border: 1px dashed #8a8886;\n background: #f3f2f1;\n}\n.dve-print-chart {\n overflow: hidden;\n background: #fff;\n}\n.dve-print-chart > svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n.dve-print-chart-frame {\n display: grid;\n place-items: center;\n color: #605e5c;\n font-size: 11px;\n}\n.dve-print-block {\n position: absolute;\n left: 0;\n width: 100%;\n}\n.dve-print-line {\n position: absolute;\n left: 0;\n width: 100%;\n font:\n 11pt/1.2 Calibri,\n Arial,\n sans-serif;\n cursor: text;\n}\n.dve-print-line span {\n position: absolute;\n top: 0;\n}\n.dve-print-row {\n position: absolute;\n left: 0;\n width: 100%;\n}\n/* Cells sit at their grid positions; borders come from the document (Word prints no gridlines). */\n.dve-print-cell {\n position: absolute;\n top: 0;\n box-sizing: border-box;\n}\n.dve-print-cell-content {\n position: absolute;\n bottom: 0;\n}\n@media print {\n .dve-ribbon,\n .dve-status,\n .multilingual-controls {\n display: none !important;\n }\n .dve-canvas {\n overflow: visible !important;\n padding: 0 !important;\n }\n .dve-paper {\n display: none !important;\n }\n .dve-print-pages {\n gap: 0 !important;\n zoom: 1 !important;\n }\n .dve-print-page {\n /* Like Word, page colours are not printed unless asked for. */\n background: #fff !important;\n box-shadow: none !important;\n break-after: page;\n }\n}\n.dve-print-header,\n.dve-print-footer {\n position: absolute;\n color: var(--ink);\n font-size: 11pt;\n pointer-events: none;\n}\n.dve-print-header p,\n.dve-print-footer p {\n margin: 0;\n}\n.dve-print-header table,\n.dve-print-footer table {\n width: 100%;\n border-collapse: collapse;\n}\n\n/* Complex field begin/code/separate/end markers: kept in the document, never shown. */\n.dve-field-marker {\n display: inline;\n font-size: 0;\n}\n\n/* TOC entries link to hidden _Toc bookmarks; Word draws them in the entry's style, not as links. */\na.dve-link[data-anchor^='_Toc'] {\n color: inherit;\n text-decoration: none;\n}\n\n/* Tabs sized to Word's tab stops by tab-stops-view.ts; leaders fill the tab's width. */\n.dve-tab {\n display: inline-block;\n overflow: hidden;\n white-space: pre;\n vertical-align: baseline;\n text-indent: 0;\n}\n.dve-tab-leader-dot,\n.dve-tab-leader-middleDot {\n background-image: radial-gradient(circle, currentColor 0.8px, transparent 1.1px);\n background-size: 4px 4px;\n background-repeat: repeat-x;\n background-position: right 0 bottom 0.25em;\n}\n.dve-tab-leader-hyphen {\n background-image: linear-gradient(to right, currentColor 50%, transparent 50%);\n background-size: 6px 1px;\n background-repeat: repeat-x;\n background-position: right 0 bottom 0.4em;\n}\n.dve-tab-leader-underscore,\n.dve-tab-leader-heavy {\n border-bottom: 1px solid currentColor;\n}\n.dve-tab-leader-heavy {\n border-bottom-width: 2px;\n}\n\n/* Footnotes above the bottom margin; the separator is Word's 2-inch rule. */\n.dve-print-footnotes {\n position: absolute;\n z-index: 1;\n}\n.dve-print-footnote-separator {\n position: absolute;\n top: -7px;\n left: 0;\n width: 192px;\n border-top: 1px solid currentColor;\n}\n.dve-print-footnote {\n position: absolute;\n left: 0;\n width: 100%;\n}\n\n[data-print-view] .dve-notes-container {\n display: none;\n}\n\n/* Word draws superscript and subscript at about two thirds size without growing the line. */\n.dve-paper sup,\n.dve-paper sub {\n font-size: 0.65em;\n line-height: 0;\n}\n/* Exact-height rows clip content that does not fit, as Word does. */\n.dve-print-cell {\n overflow: hidden;\n}\n.dve-print-paragraph-frame {\n position: absolute;\n top: 0;\n box-sizing: border-box;\n}\n\n/* View > Multiple Pages: Print Layout's sheets sit side by side and wrap, instead of one column. */\n.dve-canvas[data-multipage] .dve-print-pages {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: center;\n}\n\n/* Layout > Line Numbers: numbers in the left margin, one per printed line. */\n.dve-print-line-number {\n position: absolute;\n width: 40px;\n text-align: right;\n font:\n 10px 'Segoe UI',\n Arial,\n sans-serif;\n color: #444;\n pointer-events: none;\n}\n";
16503
16484
 
16504
16485
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/chrome-titlebar.css?raw
16505
- var chrome_titlebar_default = ".dve-frame {\n position: relative;\n border: 0;\n box-shadow: none;\n}\n.dve-icon {\n flex: none;\n}\n.dve-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 28px;\n padding: 0 6px;\n border: 0;\n border-radius: 4px;\n background: none;\n color: inherit;\n cursor: pointer;\n}\n.dve-icon-button:hover:not(:disabled),\n.dve-icon-button[aria-pressed='true'] {\n background: var(--word-soft);\n}\n.dve-icon-button:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* Title bar: drawn by the shared office-ui-title-bar; these colour it and style the account slot. */\n.dve-titlebar {\n flex: none;\n --office-title-bar-height: 40px;\n --office-title-bar-background: var(--chrome);\n --office-title-bar-border: var(--line);\n --office-title-bar-mark-background: var(--word);\n --office-title-bar-mark-foreground: var(--dve-primary-foreground);\n}\n.dve-title-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n.dve-mode-select {\n height: 28px;\n margin-left: 4px;\n padding: 0 6px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: var(--surface);\n color: var(--ink);\n font: inherit;\n}\n";
16486
+ var chrome_titlebar_default = ".dve-frame {\n position: relative;\n border: 0;\n box-shadow: none;\n}\n.dve-icon {\n flex: none;\n}\n.dve-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 28px;\n padding: 0 6px;\n border: 0;\n border-radius: 4px;\n background: none;\n color: inherit;\n cursor: pointer;\n}\n.dve-icon-button:hover:not(:disabled),\n.dve-icon-button[aria-pressed='true'] {\n background: var(--word-soft);\n}\n.dve-icon-button:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* Title bar: drawn by the shared office-ui-title-bar; these colour it. */\n.dve-titlebar {\n flex: none;\n --office-title-bar-height: 40px;\n --office-title-bar-background: var(--chrome);\n --office-title-bar-border: var(--line);\n --office-title-bar-mark-background: var(--word);\n --office-title-bar-mark-foreground: var(--dve-primary-foreground);\n}\n";
16506
16487
 
16507
16488
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/backstage.css?raw
16508
16489
  var backstage_default = "/* Backstage: the shared office-ui-backstage draws the frame; these colour it and style the pages. */\n.dve-backstage {\n --office-backstage-nav-width: 220px;\n --office-backstage-nav-background: var(--word);\n --office-backstage-nav-foreground: var(--dve-primary-foreground);\n --office-backstage-item-hover: var(--word-strong);\n z-index: 40;\n background: var(--surface);\n}\n.dve-backstage-content {\n overflow: auto;\n padding: 28px 40px;\n color: var(--ink);\n}\n.dve-backstage-content h2 {\n margin: 0 0 20px;\n font-size: 30px;\n font-weight: 300;\n}\n.dve-backstage-content h3 {\n margin: 24px 0 10px;\n font-size: 15px;\n font-weight: 600;\n}\n.dve-backstage-facts {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n gap: 6px 24px;\n margin: 0;\n}\n.dve-backstage-facts dt {\n color: var(--muted);\n}\n.dve-backstage-facts dd {\n margin: 0;\n overflow-wrap: anywhere;\n}\n.dve-compatibility-notes {\n display: grid;\n gap: 8px;\n max-width: 760px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.dve-compatibility-notes li {\n display: flex;\n gap: 8px;\n padding: 10px 12px;\n border: 1px solid var(--line);\n border-radius: 6px;\n line-height: 1.45;\n}\n.dve-compatibility-notes .dve-icon {\n margin-top: 2px;\n color: #b7791f;\n}\n.dve-backstage-tile {\n display: inline-flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: none;\n color: var(--ink);\n font: inherit;\n cursor: pointer;\n}\n.dve-backstage-tile:hover {\n border-color: var(--line);\n background: var(--word-soft);\n}\n.dve-backstage-tile-preview {\n width: 150px;\n height: 190px;\n border: 1px solid var(--line);\n background: #fff;\n box-shadow: 0 1px 3px #0002;\n}\n.dve-backstage-primary {\n padding: 8px 18px;\n border: 0;\n border-radius: 4px;\n background: var(--word);\n color: var(--dve-primary-foreground);\n font: inherit;\n cursor: pointer;\n}\n.dve-backstage-muted {\n color: var(--muted);\n}\n\n.dve-backstage-title {\n margin: 0 0 4px;\n font-size: 26px;\n font-weight: 400;\n overflow-wrap: anywhere;\n}\n.dve-backstage-columns {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 300px;\n gap: 40px;\n align-items: start;\n}\n.dve-backstage-properties {\n padding: 4px 0 0 24px;\n border-left: 1px solid var(--line);\n}\n.dve-backstage-properties h3 {\n margin-top: 0;\n}\n.dve-backstage-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 24px;\n max-width: 760px;\n margin-bottom: 12px;\n padding: 14px 18px;\n border: 1px solid var(--line);\n border-radius: 6px;\n}\n.dve-backstage-card h3 {\n margin: 0 0 4px;\n}\n.dve-backstage-card p {\n margin: 0;\n}\n.dve-backstage-field {\n display: grid;\n gap: 4px;\n max-width: 420px;\n margin-bottom: 14px;\n color: var(--muted);\n font-size: 12px;\n}\n.dve-backstage-field input,\n.dve-backstage-field select {\n height: 32px;\n padding: 0 8px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: var(--surface);\n color: var(--ink);\n font:\n 14px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.dve-backstage-home-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n margin: 24px 0;\n}\n.dve-backstage-toggle {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n.dve-backstage-toggle input {\n width: 18px;\n height: 18px;\n}\n@media (max-width: 760px) {\n .dve-backstage-content {\n padding: 20px;\n }\n .dve-backstage-card {\n align-items: stretch;\n flex-direction: column;\n }\n .dve-backstage-columns {\n grid-template-columns: minmax(0, 1fr);\n }\n .dve-backstage-properties {\n padding-left: 0;\n border-left: 0;\n }\n}\n\n/* Customize Ribbon: one block per tab, one fieldset per group, a checkbox per command. */\n.dve-customize-tab h3 {\n margin: 18px 0 6px;\n}\n.dve-customize-group {\n margin: 0 0 8px;\n padding: 6px 10px 8px;\n border: 1px solid var(--line);\n border-radius: 4px;\n}\n.dve-customize-group legend {\n padding: 0 4px;\n color: var(--muted);\n font-size: 12px;\n}\n.dve-customize-row {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 180px;\n padding: 2px 8px 2px 0;\n font-size: 13px;\n}\n";
@@ -16511,7 +16492,7 @@ var backstage_default = "/* Backstage: the shared office-ui-backstage draws the
16511
16492
  var status_dialogs_default = "/* Status bar: drawn by the shared office-ui-status-bar; this only places it in the frame. */\n.dve-status {\n display: block;\n flex: none;\n min-width: 0;\n border-top: 1px solid var(--line);\n}\n\n@media (max-width: 760px) {\n .dve-backstage-content {\n padding: 20px;\n }\n}\n\n/* Dialogs: the shared office-ui-dialog draws the modal frame; these style the fields inside it. */\n.dve-dialog {\n --office-dialog-width: min(440px, calc(100vw - 32px));\n}\n/* The fields are the dialog's light-DOM children, laid out in the shared body. */\n.dve-dialog > :not([slot]) + :not([slot]) {\n margin-top: 10px;\n}\n.dve-dialog label {\n display: grid;\n gap: 4px;\n color: var(--muted);\n font-size: 12px;\n}\n.dve-dialog input,\n.dve-dialog select {\n height: 30px;\n padding: 0 8px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: var(--surface);\n color: var(--ink);\n font: inherit;\n}\n.dve-dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n}\n.dve-dialog-actions button {\n min-height: 30px;\n padding: 0 14px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: var(--surface);\n color: var(--ink);\n font: inherit;\n cursor: pointer;\n}\n.dve-dialog-actions .dve-dialog-primary {\n border-color: var(--word);\n background: var(--word);\n color: var(--dve-primary-foreground);\n}\n";
16512
16493
 
16513
16494
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/chrome-document.css?raw
16514
- var chrome_document_default = "/* Links, pictures and hidden text in the document */\n.dve-equation {\n display: inline-block;\n vertical-align: middle;\n max-width: 100%;\n font-family: 'Cambria Math', math, serif;\n}\n.dve-equation-display {\n display: block;\n margin: 0.5em 0;\n text-align: center;\n}\n.dve-equation-unavailable {\n color: var(--muted);\n font-size: 0.85em;\n}\n.dve-paper a.dve-link {\n color: var(--word);\n text-decoration: underline;\n cursor: text;\n}\n.dve-paper img.dve-image {\n max-width: 100%;\n height: auto;\n vertical-align: bottom;\n}\n.dve-paper .dve-image-placeholder {\n display: inline-grid;\n place-items: center;\n border: 1px dashed var(--line);\n background: var(--canvas);\n color: var(--muted);\n font-size: 11px;\n}\n.dve-paper .dve-image-placeholder:has(.dve-textbox-line) {\n place-items: start;\n align-content: start;\n overflow: hidden;\n padding: 4px 6px;\n box-sizing: border-box;\n text-align: left;\n border-style: solid;\n}\n.dve-paper .dve-textbox-line {\n display: block;\n color: var(--text, #1f1f1f);\n font-size: 12px;\n}\n.dve-paper:not([data-show-hidden]) .dve-hidden-text {\n display: none;\n}\n.dve-paper[data-show-hidden] .dve-hidden-text {\n opacity: 0.55;\n text-decoration: underline dotted;\n}\n\n/* Pictures: selection outline and proportional resize handle */\n.dve-paper .dve-picture {\n position: relative;\n display: inline-block;\n max-width: 100%;\n line-height: 0;\n}\n.dve-paper .dve-picture-selected {\n outline: 2px solid var(--word);\n outline-offset: 1px;\n}\n.dve-picture-handle {\n position: absolute;\n right: -5px;\n bottom: -5px;\n display: none;\n width: 10px;\n height: 10px;\n border: 1px solid var(--word);\n background: #fff;\n cursor: nwse-resize;\n}\n.dve-picture-selected .dve-picture-handle {\n display: block;\n}\n.dve-dialog textarea {\n min-height: 60px;\n padding: 6px 8px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: var(--surface);\n color: var(--ink);\n font: inherit;\n resize: vertical;\n}\n.dve-dialog-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n.dve-dialog .dve-dialog-check {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--ink);\n}\n\n/* Header/footer editing (double-click a header or footer) */\n.dve-header-footer-slot[data-slot] {\n cursor: text;\n}\n.dve-header-footer-editing {\n outline: 1px dashed var(--word);\n outline-offset: 4px;\n}\n.dve-header-footer-editor .ProseMirror {\n outline: none;\n white-space: pre-wrap;\n}\n.dve-header-footer-editor .ProseMirror p {\n margin: 0;\n}\n\n/* Section break marks after the paragraph that ends a section */\n.dve-paper .dve-section-end::after {\n display: block;\n margin: 6px 0;\n border-top: 1px dotted var(--muted);\n border-bottom: 1px dotted var(--muted);\n color: var(--muted);\n content: attr(data-section-break);\n font-size: 10px;\n line-height: 14px;\n text-align: center;\n user-select: none;\n}\n\n/* Floating pictures: an approximation of Word's text wrapping */\n.dve-paper .dve-float-left,\n.dve-header-footer-body .dve-float-left {\n float: left;\n margin: 2px 12px 6px 0;\n}\n.dve-paper .dve-float-right,\n.dve-header-footer-body .dve-float-right {\n float: right;\n margin: 2px 0 6px 12px;\n}\n.dve-paper .dve-float-block {\n display: block;\n width: fit-content;\n margin: 6px 0;\n}\n.dve-paper .dve-float-block-center {\n margin-right: auto;\n margin-left: auto;\n}\n.dve-paper .dve-float-block-right {\n margin-left: auto;\n}\n.dve-paper[data-show-marks] .ProseMirror p::after,\n.dve-paper[data-show-marks] .ProseMirror h1::after,\n.dve-paper[data-show-marks] .ProseMirror h2::after,\n.dve-paper[data-show-marks] .ProseMirror h3::after {\n color: var(--blue);\n content: '\\00b6';\n opacity: 0.7;\n pointer-events: none;\n}\n\n/* Font and Paragraph dialogs */\n.dve-format-dialog {\n --office-dialog-width: min(520px, calc(100vw - 32px));\n}\n.dve-format-dialog .dve-dialog-fieldset {\n display: grid;\n gap: 8px;\n margin: 0;\n padding: 8px 10px 10px;\n border: 1px solid var(--line);\n border-radius: 6px;\n}\n.dve-format-dialog legend {\n padding: 0 4px;\n color: var(--muted);\n font-size: 12px;\n}\n.dve-format-dialog .dve-dialog-cols {\n grid-template-columns: repeat(var(--cols, 2), minmax(0, 1fr));\n}\n.dve-format-dialog input[type='color'] {\n padding: 2px;\n}\n.dve-format-dialog .dve-dialog-fieldset > .dve-dialog-check {\n display: flex;\n}\n.dve-font-dialog .dve-dialog-fieldset:nth-of-type(1) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.dve-font-dialog .dve-font-tab-panel[hidden] {\n display: none;\n}\n.dve-font-tab-panel {\n display: grid;\n gap: 10px;\n}\n.dve-font-dialog .dve-font-tab-panel .dve-dialog-fieldset:has(.dve-dialog-cols) {\n grid-template-columns: 1fr;\n}\n.dve-font-tabs {\n display: flex;\n gap: 2px;\n border-bottom: 1px solid var(--line);\n}\n.dve-font-tabs button {\n background: transparent;\n border: 0;\n border-radius: 0;\n padding: 7px 14px;\n}\n.dve-font-tabs button[aria-selected='true'] {\n color: var(--word);\n border-bottom: 2px solid var(--word);\n font-weight: 600;\n}\n.dve-format-preview {\n display: grid;\n min-height: 54px;\n place-items: center;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: #fff;\n color: #000;\n overflow: hidden;\n}\n.dve-dialog input[type='checkbox'] {\n width: 16px;\n height: 16px;\n padding: 0;\n margin: 0;\n accent-color: var(--word);\n}\n.dve-format-dialog .dve-dialog-fieldset:has(> .dve-dialog-check):not(:has(> .dve-dialog-cols)) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 6px 12px;\n}\n.dve-format-dialog\n .dve-dialog-fieldset:has(> .dve-dialog-check):not(:has(> .dve-dialog-cols))\n legend {\n grid-column: 1 / -1;\n}\n\n/* View > Gridlines: a quarter-inch alignment grid over the page. */\n.dve-paper[data-show-gridlines] {\n background-image:\n linear-gradient(to right, #8ab4f855 1px, transparent 1px),\n linear-gradient(to bottom, #8ab4f855 1px, transparent 1px);\n background-size: 24px 24px;\n}\n\n.dve-dialog-message {\n min-height: 1.2em;\n margin: 0;\n color: #b3261e;\n font-size: 12px;\n}\n\n/* View > Ruler: inch ticks from the left margin, shaded margins and indent markers. */\n.dve-canvas > .dve-ruler {\n position: sticky;\n top: -30px;\n z-index: 6;\n flex: none;\n box-sizing: border-box;\n height: 22px;\n margin: -30px auto 8px;\n zoom: var(--dve-zoom, 1);\n border: 1px solid var(--line);\n background:\n linear-gradient(to right, #6b6f75 1px, transparent 1px) var(--dve-ruler-origin, 0) 100% / 96px\n 11px repeat-x,\n linear-gradient(to right, #6b6f75 1px, transparent 1px) var(--dve-ruler-origin, 0) 100% / 48px\n 8px repeat-x,\n linear-gradient(to right, #9aa0a6 1px, transparent 1px) var(--dve-ruler-origin, 0) 100% / 12px\n 5px repeat-x,\n #fff;\n color: #4a4d52;\n font:\n 9px 'Segoe UI',\n Arial,\n sans-serif;\n pointer-events: none;\n}\n.dve-ruler-margin-left,\n.dve-ruler-margin-right {\n position: absolute;\n top: 0;\n bottom: 0;\n background: #dfe3e8;\n}\n.dve-ruler-margin-left {\n left: 0;\n}\n.dve-ruler-margin-right {\n right: 0;\n}\n.dve-ruler-labels span {\n position: absolute;\n top: 1px;\n transform: translateX(-50%);\n}\n.dve-ruler-marker {\n pointer-events: auto;\n cursor: ew-resize;\n touch-action: none;\n position: absolute;\n width: 0;\n height: 0;\n margin-left: -4px;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dve-ruler-marker::after {\n content: '';\n position: absolute;\n inset: -6px -6px -6px -6px;\n margin-left: -4px;\n}\n.dve-ruler-marker-first-line {\n top: 1px;\n border-top: 6px solid #2b579a;\n}\n.dve-ruler-marker-left,\n.dve-ruler-marker-right {\n bottom: 1px;\n border-bottom: 6px solid #2b579a;\n}\n";
16495
+ var chrome_document_default = "/* Links, pictures and hidden text in the document */\n.dve-equation {\n display: inline-block;\n vertical-align: middle;\n max-width: 100%;\n font-family: 'Cambria Math', math, serif;\n}\n.dve-equation-display {\n display: block;\n margin: 0.5em 0;\n text-align: center;\n}\n.dve-equation-unavailable {\n color: var(--muted);\n font-size: 0.85em;\n}\n.dve-paper a.dve-link {\n color: var(--word);\n text-decoration: underline;\n cursor: text;\n}\n.dve-paper img.dve-image {\n max-width: 100%;\n height: auto;\n vertical-align: bottom;\n}\n.dve-paper .dve-image-placeholder {\n display: inline-grid;\n place-items: center;\n border: 1px dashed var(--line);\n background: var(--canvas);\n color: var(--muted);\n font-size: 11px;\n}\n/* Charts: painted read-only from the cached values in the chart part. */\n.dve-paper .dve-chart {\n display: inline-block;\n vertical-align: bottom;\n max-width: 100%;\n overflow: hidden;\n background: #fff;\n}\n.dve-paper .dve-chart > svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n.dve-paper .dve-image-placeholder:has(.dve-textbox-line) {\n place-items: start;\n align-content: start;\n overflow: hidden;\n padding: 4px 6px;\n box-sizing: border-box;\n text-align: left;\n border-style: solid;\n}\n.dve-paper .dve-textbox-line {\n display: block;\n color: var(--text, #1f1f1f);\n font-size: 12px;\n}\n.dve-paper:not([data-show-hidden]) .dve-hidden-text {\n display: none;\n}\n.dve-paper[data-show-hidden] .dve-hidden-text {\n opacity: 0.55;\n text-decoration: underline dotted;\n}\n\n/* Pictures: selection outline and proportional resize handle */\n.dve-paper .dve-picture {\n position: relative;\n display: inline-block;\n max-width: 100%;\n line-height: 0;\n}\n.dve-paper .dve-picture-selected {\n outline: 2px solid var(--word);\n outline-offset: 1px;\n}\n.dve-picture-handle {\n position: absolute;\n right: -5px;\n bottom: -5px;\n display: none;\n width: 10px;\n height: 10px;\n border: 1px solid var(--word);\n background: #fff;\n cursor: nwse-resize;\n}\n.dve-picture-selected .dve-picture-handle {\n display: block;\n}\n.dve-dialog textarea {\n min-height: 60px;\n padding: 6px 8px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: var(--surface);\n color: var(--ink);\n font: inherit;\n resize: vertical;\n}\n.dve-dialog-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n.dve-dialog .dve-dialog-check {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--ink);\n}\n\n/* Header/footer editing (double-click a header or footer) */\n.dve-header-footer-slot[data-slot] {\n cursor: text;\n}\n.dve-header-footer-editing {\n outline: 1px dashed var(--word);\n outline-offset: 4px;\n}\n.dve-header-footer-editor .ProseMirror {\n outline: none;\n white-space: pre-wrap;\n}\n.dve-header-footer-editor .ProseMirror p {\n margin: 0;\n}\n\n/* Section break marks after the paragraph that ends a section */\n.dve-paper .dve-section-end::after {\n display: block;\n margin: 6px 0;\n border-top: 1px dotted var(--muted);\n border-bottom: 1px dotted var(--muted);\n color: var(--muted);\n content: attr(data-section-break);\n font-size: 10px;\n line-height: 14px;\n text-align: center;\n user-select: none;\n}\n\n/* Floating pictures: an approximation of Word's text wrapping */\n.dve-paper .dve-float-left,\n.dve-header-footer-body .dve-float-left {\n float: left;\n margin: 2px 12px 6px 0;\n}\n.dve-paper .dve-float-right,\n.dve-header-footer-body .dve-float-right {\n float: right;\n margin: 2px 0 6px 12px;\n}\n.dve-paper .dve-float-block {\n display: block;\n width: fit-content;\n margin: 6px 0;\n}\n.dve-paper .dve-float-block-center {\n margin-right: auto;\n margin-left: auto;\n}\n.dve-paper .dve-float-block-right {\n margin-left: auto;\n}\n.dve-paper[data-show-marks] .ProseMirror p::after,\n.dve-paper[data-show-marks] .ProseMirror h1::after,\n.dve-paper[data-show-marks] .ProseMirror h2::after,\n.dve-paper[data-show-marks] .ProseMirror h3::after {\n color: var(--blue);\n content: '\\00b6';\n opacity: 0.7;\n pointer-events: none;\n}\n\n/* Font and Paragraph dialogs */\n.dve-format-dialog {\n --office-dialog-width: min(520px, calc(100vw - 32px));\n}\n.dve-format-dialog .dve-dialog-fieldset {\n display: grid;\n gap: 8px;\n margin: 0;\n padding: 8px 10px 10px;\n border: 1px solid var(--line);\n border-radius: 6px;\n}\n.dve-format-dialog legend {\n padding: 0 4px;\n color: var(--muted);\n font-size: 12px;\n}\n.dve-format-dialog .dve-dialog-cols {\n grid-template-columns: repeat(var(--cols, 2), minmax(0, 1fr));\n}\n.dve-format-dialog input[type='color'] {\n padding: 2px;\n}\n.dve-format-dialog .dve-dialog-fieldset > .dve-dialog-check {\n display: flex;\n}\n.dve-font-dialog .dve-dialog-fieldset:nth-of-type(1) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.dve-font-dialog .dve-font-tab-panel[hidden] {\n display: none;\n}\n.dve-font-tab-panel {\n display: grid;\n gap: 10px;\n}\n.dve-font-dialog .dve-font-tab-panel .dve-dialog-fieldset:has(.dve-dialog-cols) {\n grid-template-columns: 1fr;\n}\n.dve-font-tabs {\n display: flex;\n gap: 2px;\n border-bottom: 1px solid var(--line);\n}\n.dve-font-tabs button {\n background: transparent;\n border: 0;\n border-radius: 0;\n padding: 7px 14px;\n}\n.dve-font-tabs button[aria-selected='true'] {\n color: var(--word);\n border-bottom: 2px solid var(--word);\n font-weight: 600;\n}\n.dve-format-preview {\n display: grid;\n min-height: 54px;\n place-items: center;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: #fff;\n color: #000;\n overflow: hidden;\n}\n.dve-dialog input[type='checkbox'] {\n width: 16px;\n height: 16px;\n padding: 0;\n margin: 0;\n accent-color: var(--word);\n}\n.dve-format-dialog .dve-dialog-fieldset:has(> .dve-dialog-check):not(:has(> .dve-dialog-cols)) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 6px 12px;\n}\n.dve-format-dialog\n .dve-dialog-fieldset:has(> .dve-dialog-check):not(:has(> .dve-dialog-cols))\n legend {\n grid-column: 1 / -1;\n}\n\n/* View > Gridlines: a quarter-inch alignment grid over the page. */\n.dve-paper[data-show-gridlines] {\n background-image:\n linear-gradient(to right, #8ab4f855 1px, transparent 1px),\n linear-gradient(to bottom, #8ab4f855 1px, transparent 1px);\n background-size: 24px 24px;\n}\n\n.dve-dialog-message {\n min-height: 1.2em;\n margin: 0;\n color: #b3261e;\n font-size: 12px;\n}\n\n/* View > Ruler: placement only; the shared office-ui-ruler draws ticks, margins and markers. */\n.dve-canvas > .dve-ruler {\n position: sticky;\n top: -30px;\n z-index: 6;\n flex: none;\n height: 22px;\n margin: -30px auto 8px;\n border: 1px solid var(--line);\n pointer-events: none;\n}\n";
16515
16496
 
16516
16497
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/page-navigator.css?raw
16517
16498
  var page_navigator_default = "/* Page thumbnail rail and ribbon customisation */\n[data-dve-hidden] {\n display: none !important;\n}\n.dve-pages-rail {\n display: flex;\n flex: none;\n flex-direction: column;\n box-sizing: border-box;\n width: 156px;\n min-height: 0;\n border-right: 1px solid var(--line);\n background: var(--surface);\n color: var(--ink);\n}\n.dve-pages-rail[hidden] {\n display: none;\n}\n.dve-pages-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 8px;\n border-bottom: 1px solid var(--line);\n font-size: 11px;\n font-weight: 600;\n}\n.dve-pages-close {\n border: 0;\n border-radius: 4px;\n background: none;\n color: var(--muted);\n font-size: 16px;\n line-height: 1;\n cursor: pointer;\n}\n.dve-pages-close:hover {\n background: var(--word-soft);\n}\n.dve-pages-message {\n margin: 0;\n padding: 12px 10px;\n color: var(--muted);\n font-size: 11px;\n line-height: 1.4;\n}\n.dve-pages-message[hidden],\n.dve-pages-list[hidden] {\n display: none;\n}\n.dve-pages-list {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 10px 0 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n}\n.dve-page-thumb {\n display: flex;\n flex: none;\n flex-direction: column;\n align-items: center;\n gap: 3px;\n padding: 4px;\n border: 2px solid transparent;\n border-radius: 4px;\n cursor: pointer;\n}\n.dve-page-thumb:hover {\n background: var(--word-soft);\n}\n.dve-page-thumb[aria-selected='true'] {\n border-color: var(--word);\n background: var(--word-soft);\n}\n.dve-page-thumb-sheet {\n position: relative;\n overflow: hidden;\n background: #fff;\n box-shadow: 0 1px 3px #20212440;\n pointer-events: none;\n}\n.dve-page-thumb-sheet .dve-print-page {\n position: absolute;\n top: 0;\n left: 0;\n box-shadow: none;\n}\n.dve-page-thumb-number {\n color: var(--muted);\n font-size: 11px;\n}\n.dve-page-thumb[aria-selected='true'] .dve-page-thumb-number {\n color: var(--ink);\n font-weight: 600;\n}\n@media print {\n .dve-pages-rail {\n display: none !important;\n }\n}\n";
@@ -16886,10 +16867,10 @@ function createSearchPanel(options, initialLocale = "en") {
16886
16867
 
16887
16868
  // src/docx/print-table.ts
16888
16869
  var cssBorder = (border) => border ? `${border.widthPx}px ${border.style} ${border.color}` : "";
16889
- function geometryOf(row4, index, widthPx) {
16890
- const given = row4.geometry?.[index];
16870
+ function geometryOf(row3, index, widthPx) {
16871
+ const given = row3.geometry?.[index];
16891
16872
  if (given) return given;
16892
- const share = widthPx / Math.max(1, row4.cells.length);
16873
+ const share = widthPx / Math.max(1, row3.cells.length);
16893
16874
  return {
16894
16875
  xPx: share * index,
16895
16876
  widthPx: share,
@@ -16904,31 +16885,31 @@ function renderTable(box2, columnWidthPx, renderParagraph) {
16904
16885
  table.style.top = `${box2.yPx}px`;
16905
16886
  table.style.height = `${box2.heightPx}px`;
16906
16887
  if (box2.xPx) table.style.left = `${box2.xPx}px`;
16907
- box2.rows.forEach((row4, rowIndex) => {
16888
+ box2.rows.forEach((row3, rowIndex) => {
16908
16889
  const rowEl = document.createElement("div");
16909
16890
  rowEl.className = "dve-print-row";
16910
- rowEl.style.top = `${row4.yPx}px`;
16911
- rowEl.style.height = `${row4.heightPx}px`;
16912
- if (row4.repeated) rowEl.dataset.repeated = "true";
16891
+ rowEl.style.top = `${row3.yPx}px`;
16892
+ rowEl.style.height = `${row3.heightPx}px`;
16893
+ if (row3.repeated) rowEl.dataset.repeated = "true";
16913
16894
  const lastRow = rowIndex === box2.rows.length - 1;
16914
- row4.cells.forEach((paragraphs, cellIndex) => {
16915
- const geometry = geometryOf(row4, cellIndex, columnWidthPx);
16895
+ row3.cells.forEach((paragraphs, cellIndex) => {
16896
+ const geometry = geometryOf(row3, cellIndex, columnWidthPx);
16916
16897
  const cell = document.createElement("div");
16917
16898
  cell.className = "dve-print-cell";
16918
16899
  Object.assign(cell.style, {
16919
16900
  left: `${geometry.xPx}px`,
16920
16901
  width: `${geometry.widthPx}px`,
16921
- height: `${row4.heightPx}px`
16902
+ height: `${row3.heightPx}px`
16922
16903
  });
16923
16904
  if (geometry.shading) cell.style.background = geometry.shading;
16924
16905
  const borders = geometry.borders;
16925
16906
  cell.style.borderTop = cssBorder(borders?.top);
16926
16907
  cell.style.borderLeft = cssBorder(borders?.left);
16927
- if (cellIndex === row4.cells.length - 1) cell.style.borderRight = cssBorder(borders?.right);
16908
+ if (cellIndex === row3.cells.length - 1) cell.style.borderRight = cssBorder(borders?.right);
16928
16909
  if (lastRow) cell.style.borderBottom = cssBorder(borders?.bottom);
16929
16910
  const content = document.createElement("div");
16930
16911
  content.className = "dve-print-cell-content";
16931
- const free = Math.max(0, row4.heightPx - geometry.contentHeightPx);
16912
+ const free = Math.max(0, row3.heightPx - geometry.contentHeightPx);
16932
16913
  const offset = geometry.verticalAlign === "center" ? free / 2 : geometry.verticalAlign === "bottom" ? free : 0;
16933
16914
  Object.assign(content.style, {
16934
16915
  left: `${geometry.paddingLeftPx}px`,
@@ -16950,7 +16931,7 @@ function lineNumberLabels(page2, settings, counter3, suppressed) {
16950
16931
  if (counter3.section === -1 || settings.restart === "newPage" || newSection && settings.restart === "newSection")
16951
16932
  counter3.next = settings.start;
16952
16933
  counter3.section = page2.sectionIndex;
16953
- const labels2 = [];
16934
+ const labels3 = [];
16954
16935
  const gap = (settings.distanceTwips ?? 360) / 15;
16955
16936
  for (const column of page2.columns)
16956
16937
  for (const block of column.blocks) {
@@ -16967,10 +16948,10 @@ function lineNumberLabels(page2, settings, counter3, suppressed) {
16967
16948
  height: `${line.heightPx}px`,
16968
16949
  lineHeight: `${line.heightPx}px`
16969
16950
  });
16970
- labels2.push(label);
16951
+ labels3.push(label);
16971
16952
  }
16972
16953
  }
16973
- return labels2;
16954
+ return labels3;
16974
16955
  }
16975
16956
  var POINT = 4 / 3;
16976
16957
  function pageBorderBox(page2, borders) {
@@ -17064,8 +17045,30 @@ function resolveFragmentClick(fragments, clientX) {
17064
17045
  return start + Math.round((end - start) * ratio);
17065
17046
  }
17066
17047
 
17067
- // src/docx/print-layout.ts
17048
+ // src/docx/print-picture.ts
17049
+ function chartElement(chart) {
17050
+ const element = document.createElement("div");
17051
+ element.dataset.docxChart = chart.svg ? "1" : "frame";
17052
+ const svg = chart.svg ? new DOMParser().parseFromString(chart.svg, "image/svg+xml").documentElement : void 0;
17053
+ if (svg && svg.localName === "svg") {
17054
+ element.classList.add("dve-print-chart");
17055
+ element.title = chart.label;
17056
+ element.append(document.importNode(svg, true));
17057
+ } else {
17058
+ element.classList.add("dve-print-picture-missing", "dve-print-chart-frame");
17059
+ element.textContent = chart.label;
17060
+ }
17061
+ return element;
17062
+ }
17068
17063
  function pictureElement(object, pictureUrl) {
17064
+ if (object.chart) {
17065
+ const element2 = chartElement(object.chart);
17066
+ element2.classList.add("dve-print-picture");
17067
+ element2.style.position = "absolute";
17068
+ element2.style.width = `${object.widthPx}px`;
17069
+ element2.style.height = `${object.heightPx}px`;
17070
+ return element2;
17071
+ }
17069
17072
  const url = object.partName ? pictureUrl?.(object.partName, object.contentType) : void 0;
17070
17073
  const element = document.createElement(url ? "img" : "div");
17071
17074
  if (url) {
@@ -17078,6 +17081,8 @@ function pictureElement(object, pictureUrl) {
17078
17081
  element.style.height = `${object.heightPx}px`;
17079
17082
  return element;
17080
17083
  }
17084
+
17085
+ // src/docx/print-layout.ts
17081
17086
  var LEADER_CHARACTERS = { dot: ".", hyphen: "-", middleDot: "\xB7" };
17082
17087
  function leaderElement(fragment) {
17083
17088
  const el = document.createElement("span");
@@ -17461,107 +17466,70 @@ function moveCursorToBlock(view, blockId, offset) {
17461
17466
  }
17462
17467
 
17463
17468
  // src/docx/comments-panel.ts
17464
- var styleText2 = `
17465
- .dve-comments-panel{display:flex;flex-direction:column;gap:8px;padding:10px 12px;border-left:1px solid var(--line,#ddd);background:var(--surface,#fff);color:var(--ink,#222);font:12px/1.4 'Segoe UI',Arial,sans-serif;width:clamp(220px,26vw,320px);overflow-y:auto}
17466
- .dve-comments-panel[hidden]{display:none}
17467
- .dve-comments-panel h2{margin:0;font-size:13px}
17468
- .dve-comment-new textarea,.dve-comment-reply textarea{box-sizing:border-box;width:100%;min-height:44px;resize:vertical;border:1px solid var(--line,#ddd);border-radius:3px;padding:5px 7px;font:inherit;background:var(--surface,#fff);color:var(--ink,#222)}
17469
- .dve-comment-new button,.dve-comment-actions button,.dve-comment-reply button{border:1px solid var(--line,#ddd);border-radius:3px;background:var(--surface,#fff);color:var(--ink,#222);font:inherit;cursor:pointer;padding:3px 8px}
17470
- .dve-comment-new button:disabled,.dve-comment-actions button:disabled{opacity:.5;cursor:default}
17471
- .dve-comment-thread{border:1px solid var(--line,#ddd);border-radius:4px;padding:7px 8px;display:flex;flex-direction:column;gap:4px}
17472
- .dve-comment-thread[data-resolved="true"]{opacity:.65}
17473
- .dve-comment-meta{display:flex;justify-content:space-between;gap:6px;color:var(--muted,#666);font-size:11px}
17474
- .dve-comment-text{white-space:pre-wrap}
17475
- .dve-comment-actions{display:flex;gap:5px;flex-wrap:wrap}
17476
- .dve-comment-reply{margin-left:12px;display:flex;flex-direction:column;gap:4px}
17477
- .dve-comment-empty{color:var(--muted,#666)}
17478
- `;
17479
- function row3(comment, indent, locale, options) {
17480
- const thread = document.createElement("div");
17481
- thread.className = "dve-comment-thread";
17482
- if (indent) thread.style.marginLeft = "14px";
17483
- thread.dataset.resolved = String(Boolean(comment.resolved));
17484
- const meta = document.createElement("div");
17485
- meta.className = "dve-comment-meta";
17486
- meta.append(
17487
- Object.assign(document.createElement("span"), { textContent: comment.author }),
17488
- Object.assign(document.createElement("span"), { textContent: comment.date ?? "" })
17489
- );
17490
- const text = document.createElement("p");
17491
- text.className = "dve-comment-text";
17492
- text.textContent = comment.text;
17493
- const actions = document.createElement("div");
17494
- const canEdit = options.canEdit?.() ?? true;
17495
- actions.className = "dve-comment-actions";
17496
- if (!comment.parentId) {
17497
- const resolve = document.createElement("button");
17498
- resolve.type = "button";
17499
- resolve.disabled = !canEdit;
17500
- resolve.textContent = translate(locale, comment.resolved ? "Reopen" : "Resolve");
17501
- resolve.addEventListener("click", () => options.onResolve(comment.id, !comment.resolved));
17502
- actions.append(resolve);
17503
- }
17504
- const del = document.createElement("button");
17505
- del.type = "button";
17506
- del.disabled = !canEdit;
17507
- del.textContent = translate(locale, "Delete");
17508
- del.addEventListener("click", () => options.onDelete(comment.id));
17509
- actions.append(del);
17510
- thread.append(meta, text, actions);
17511
- if (!comment.parentId) {
17512
- const replyForm = document.createElement("div");
17513
- replyForm.className = "dve-comment-reply";
17514
- const input = document.createElement("textarea");
17515
- input.disabled = !canEdit;
17516
- input.setAttribute("aria-label", translate(locale, "Reply"));
17517
- input.placeholder = translate(locale, "Reply");
17518
- const send = document.createElement("button");
17519
- send.type = "button";
17520
- send.disabled = !canEdit;
17521
- send.textContent = translate(locale, "Reply");
17522
- send.addEventListener("click", () => {
17523
- if (!input.value.trim()) return;
17524
- options.onReply(comment.id, input.value.trim());
17525
- input.value = "";
17526
- });
17527
- replyForm.append(input, send);
17528
- thread.append(replyForm);
17529
- }
17530
- return thread;
17469
+ function wordCommentThreads(comments) {
17470
+ const entry = (comment) => ({
17471
+ id: comment.id,
17472
+ author: comment.author,
17473
+ text: comment.text,
17474
+ ...comment.initials ? { initials: comment.initials } : {},
17475
+ ...comment.date ? { created: comment.date } : {}
17476
+ });
17477
+ return comments.filter((comment) => !comment.parentId).map((comment) => ({
17478
+ id: comment.id,
17479
+ resolved: Boolean(comment.resolved),
17480
+ comments: [
17481
+ entry(comment),
17482
+ ...comments.filter((reply) => reply.parentId === comment.id).map(entry)
17483
+ ]
17484
+ }));
17531
17485
  }
17486
+ function labels2(locale) {
17487
+ const t = (key2) => translate(locale, key2);
17488
+ return {
17489
+ heading: t("Comments"),
17490
+ list: t("Comments"),
17491
+ close: t("Close comments"),
17492
+ newComment: t("New comment"),
17493
+ add: t("Add comment"),
17494
+ reply: t("Reply"),
17495
+ resolve: t("Resolve"),
17496
+ reopen: t("Reopen"),
17497
+ resolved: t("Resolved"),
17498
+ delete: t("Delete"),
17499
+ empty: t("No comments")
17500
+ };
17501
+ }
17502
+ var detail = (event) => event.detail;
17532
17503
  function createCommentsPanel(options) {
17533
17504
  let locale = "en";
17534
- const panel = document.createElement("aside");
17505
+ defineCommentsPane();
17506
+ const panel = document.createElement("office-ui-comments-pane");
17535
17507
  panel.className = "dve-comments-panel";
17536
17508
  panel.setAttribute("role", "complementary");
17537
17509
  panel.setAttribute("aria-label", translate(locale, "Comments"));
17538
17510
  panel.hidden = true;
17539
- const style = document.createElement("style");
17540
- style.textContent = styleText2;
17541
- const heading2 = document.createElement("h2");
17542
- heading2.textContent = translate(locale, "Comments");
17543
- const closeButton = document.createElement("button");
17544
- closeButton.type = "button";
17545
- closeButton.textContent = translate(locale, "Close comments");
17546
- closeButton.setAttribute("aria-label", translate(locale, "Close comments"));
17547
- closeButton.addEventListener("click", () => close3());
17548
- const newForm = document.createElement("div");
17549
- newForm.className = "dve-comment-new";
17550
- const newInput = document.createElement("textarea");
17551
- newInput.setAttribute("aria-label", translate(locale, "New comment"));
17552
- newInput.placeholder = translate(locale, "New comment");
17553
- const addButton = document.createElement("button");
17554
- addButton.type = "button";
17555
- addButton.textContent = translate(locale, "Add comment");
17556
- addButton.addEventListener("click", () => {
17557
- if (!newInput.value.trim()) return;
17558
- options.onAdd(newInput.value.trim());
17559
- newInput.value = "";
17511
+ panel.closable = true;
17512
+ panel.classNames = { thread: "dve-comment-card", comment: "dve-comment-thread" };
17513
+ panel.labels = labels2(locale);
17514
+ panel.addEventListener("comment-add", (event) => {
17515
+ options.onAdd(detail(event).text);
17560
17516
  refresh();
17561
17517
  });
17562
- newForm.append(newInput, addButton);
17563
- const list = document.createElement("div");
17564
- panel.append(style, heading2, closeButton, newForm, list);
17518
+ panel.addEventListener(
17519
+ "comment-reply",
17520
+ (event) => options.onReply(detail(event).threadId, detail(event).text)
17521
+ );
17522
+ panel.addEventListener(
17523
+ "thread-resolve",
17524
+ (event) => options.onResolve(detail(event).threadId, true)
17525
+ );
17526
+ panel.addEventListener(
17527
+ "thread-reopen",
17528
+ (event) => options.onResolve(detail(event).threadId, false)
17529
+ );
17530
+ panel.addEventListener("comment-delete", (event) => options.onDelete(detail(event).commentId));
17531
+ panel.addEventListener("thread-select", (event) => options.onSelect?.(detail(event).threadId));
17532
+ panel.addEventListener("comments-close", () => close3());
17565
17533
  let isOpen = false;
17566
17534
  function close3() {
17567
17535
  isOpen = false;
@@ -17569,24 +17537,11 @@ function createCommentsPanel(options) {
17569
17537
  options.onClose?.();
17570
17538
  }
17571
17539
  function refresh() {
17572
- addButton.disabled = !options.canAdd();
17573
- const comments = options.getModel().comments ?? [];
17574
- list.replaceChildren();
17575
- const top = comments.filter((comment) => !comment.parentId);
17576
- if (!top.length) {
17577
- const empty = document.createElement("p");
17578
- empty.className = "dve-comment-empty";
17579
- empty.textContent = translate(locale, "No comments");
17580
- list.append(empty);
17581
- return;
17582
- }
17583
- for (const comment of top) {
17584
- list.append(row3(comment, false, locale, options));
17585
- for (const reply of comments.filter((item) => item.parentId === comment.id))
17586
- list.append(row3(reply, true, locale, options));
17587
- }
17540
+ panel.readOnly = !(options.canEdit?.() ?? true);
17541
+ panel.addDisabled = !options.canAdd();
17542
+ panel.activeThreadId = options.activeId?.() ?? null;
17543
+ panel.threads = wordCommentThreads(options.getModel().comments ?? []);
17588
17544
  }
17589
- localizeElement(panel, locale);
17590
17545
  refresh();
17591
17546
  return {
17592
17547
  element: panel,
@@ -17602,13 +17557,9 @@ function createCommentsPanel(options) {
17602
17557
  refresh,
17603
17558
  setLocale(value) {
17604
17559
  locale = normalizeEditorLocale(value);
17605
- heading2.textContent = translate(locale, "Comments");
17606
17560
  panel.setAttribute("aria-label", translate(locale, "Comments"));
17607
- closeButton.textContent = translate(locale, "Close comments");
17608
- closeButton.setAttribute("aria-label", translate(locale, "Close comments"));
17609
- newInput.setAttribute("aria-label", translate(locale, "New comment"));
17610
- newInput.placeholder = translate(locale, "New comment");
17611
- addButton.textContent = translate(locale, "Add comment");
17561
+ panel.labels = labels2(locale);
17562
+ panel.locale = locale;
17612
17563
  refresh();
17613
17564
  }
17614
17565
  };
@@ -17625,6 +17576,11 @@ var ReviewController = class {
17625
17576
  const view = host.getView();
17626
17577
  return Boolean(host.canEditComments() && view && !view.state.selection.empty);
17627
17578
  },
17579
+ activeId: () => {
17580
+ const view = host.getView();
17581
+ return view ? commentIdsAtSelection(view)[0] : void 0;
17582
+ },
17583
+ onSelect: (id) => this.goToAnchor(id),
17628
17584
  onAdd: (text) => this.addComment(text),
17629
17585
  onReply: (parentId, text) => {
17630
17586
  if (!host.canEditComments()) return;
@@ -17664,6 +17620,15 @@ var ReviewController = class {
17664
17620
  setLocale(locale) {
17665
17621
  this.commentsPanel.setLocale(locale);
17666
17622
  }
17623
+ /** Moves the caret to the start of a thread's anchored text (the pane keeps focus). */
17624
+ goToAnchor(id) {
17625
+ const view = this.host.getView();
17626
+ const anchor = view && commentAnchors(view).find((item) => item.id === id);
17627
+ if (!view || !anchor) return;
17628
+ view.dispatch(
17629
+ view.state.tr.setSelection(TextSelection.create(view.state.doc, anchor.from)).scrollIntoView()
17630
+ );
17631
+ }
17667
17632
  /** Removes a comment, its replies and its anchored range in one go. */
17668
17633
  deleteById(id) {
17669
17634
  if (!this.host.canEditComments()) return;
@@ -17806,15 +17771,6 @@ function icon(name) {
17806
17771
  svg.append(path);
17807
17772
  return svg;
17808
17773
  }
17809
- function iconButton(name, label, className = "") {
17810
- const button3 = document.createElement("button");
17811
- button3.type = "button";
17812
- button3.className = `dve-icon-button ${className}`.trim();
17813
- button3.setAttribute("aria-label", label);
17814
- button3.title = label;
17815
- button3.append(icon(name));
17816
- return button3;
17817
- }
17818
17774
 
17819
17775
  // src/docx/backstage-options.ts
17820
17776
  function renderOptions({ handlers, t, content }) {
@@ -17869,9 +17825,9 @@ function renderOptions({ handlers, t, content }) {
17869
17825
  input.type = "checkbox";
17870
17826
  input.checked = current2[key2];
17871
17827
  input.addEventListener("change", () => handlers.setOption(key2, String(input.checked)));
17872
- const row4 = field2(label, input);
17873
- row4.classList.add("dve-backstage-toggle");
17874
- controls.push(row4);
17828
+ const row3 = field2(label, input);
17829
+ row3.classList.add("dve-backstage-toggle");
17830
+ controls.push(row3);
17875
17831
  }
17876
17832
  const note = document.createElement("p");
17877
17833
  note.className = "dve-backstage-muted";
@@ -17930,9 +17886,9 @@ var facts = (rows, t) => {
17930
17886
  for (const [label, value] of rows) {
17931
17887
  const term = document.createElement("dt");
17932
17888
  term.textContent = t(label);
17933
- const detail = document.createElement("dd");
17934
- detail.textContent = value;
17935
- list.append(term, detail);
17889
+ const detail2 = document.createElement("dd");
17890
+ detail2.textContent = value;
17891
+ list.append(term, detail2);
17936
17892
  }
17937
17893
  return list;
17938
17894
  };
@@ -18144,16 +18100,16 @@ function renderCustomize({ handlers, t, content }) {
18144
18100
  const id = ribbonControlId(control);
18145
18101
  if (!id || seen.has(id)) continue;
18146
18102
  seen.add(id);
18147
- const row4 = document.createElement("label");
18148
- row4.className = "dve-customize-row";
18103
+ const row3 = document.createElement("label");
18104
+ row3.className = "dve-customize-row";
18149
18105
  const input = document.createElement("input");
18150
18106
  input.type = "checkbox";
18151
18107
  input.checked = !hidden.has(id);
18152
18108
  input.addEventListener("change", commit);
18153
18109
  const text = document.createElement("span");
18154
18110
  text.textContent = control.getAttribute("aria-label") ?? id;
18155
- row4.append(input, text);
18156
- list.append(row4);
18111
+ row3.append(input, text);
18112
+ list.append(row3);
18157
18113
  boxes.push({ id, input });
18158
18114
  }
18159
18115
  if (list.children.length > 1) tabSection.append(list);
@@ -18323,6 +18279,46 @@ function withExtension(fileName, extension) {
18323
18279
  return `${base}.${extension}`;
18324
18280
  }
18325
18281
 
18282
+ // src/docx/ribbon-actions.ts
18283
+ function createRibbonActions(handlers) {
18284
+ defineRibbonActions();
18285
+ const element = document.createElement("office-ui-ribbon-actions");
18286
+ element.className = "dve-ribbon-actions";
18287
+ element.slot = "actions";
18288
+ element.mode = "editing";
18289
+ element.addEventListener(
18290
+ "office-ribbon-mode",
18291
+ (event) => handlers.setReadOnly(event.detail.mode === "viewing")
18292
+ );
18293
+ element.addEventListener("office-ribbon-comments", () => handlers.toggleComments());
18294
+ element.addEventListener("office-ribbon-share", () => handlers.share());
18295
+ const relocalize = (locale) => {
18296
+ element.modeLabel = translate(locale, "Editing mode");
18297
+ element.modes = [
18298
+ { value: "editing", label: translate(locale, "Editing") },
18299
+ { value: "viewing", label: translate(locale, "Viewing") }
18300
+ ];
18301
+ element.commentsLabel = translate(locale, "Comments");
18302
+ element.commentsTitle = translate(locale, "Show comments");
18303
+ element.shareLabel = translate(locale, "Share");
18304
+ element.shareTitle = translate(locale, "Share");
18305
+ };
18306
+ relocalize("en");
18307
+ return {
18308
+ element,
18309
+ setReadOnly(readOnly) {
18310
+ element.mode = readOnly ? "viewing" : "editing";
18311
+ },
18312
+ setCommentsOpen(open) {
18313
+ element.commentsPressed = open;
18314
+ },
18315
+ setSharing(active) {
18316
+ element.sharePressed = active;
18317
+ },
18318
+ relocalize
18319
+ };
18320
+ }
18321
+
18326
18322
  // src/docx/status-bar.ts
18327
18323
  var ZOOM_MIN = 50;
18328
18324
  var ZOOM_MAX = 200;
@@ -18448,28 +18444,6 @@ function createTitleBar(handlers) {
18448
18444
  defineTitleBar();
18449
18445
  const element = document.createElement("office-ui-title-bar");
18450
18446
  element.className = "dve-titlebar";
18451
- const actions = document.createElement("div");
18452
- actions.className = "dve-title-actions";
18453
- actions.slot = "account";
18454
- const comments = iconButton("comment", "Show comments");
18455
- comments.setAttribute("aria-pressed", "false");
18456
- comments.addEventListener("click", () => handlers.toggleComments());
18457
- const mode = document.createElement("select");
18458
- mode.className = "dve-mode-select";
18459
- mode.setAttribute("aria-label", "Editing mode");
18460
- const modeOptions = [
18461
- ["editing", "Editing"],
18462
- ["viewing", "Viewing"]
18463
- ];
18464
- for (const [value, text] of modeOptions) {
18465
- const option = document.createElement("option");
18466
- option.value = value;
18467
- option.textContent = text;
18468
- mode.append(option);
18469
- }
18470
- mode.addEventListener("change", () => handlers.setReadOnly(mode.value === "viewing"));
18471
- actions.append(comments, mode);
18472
- element.append(actions);
18473
18447
  const model = { fileName: "", saveState: "saved", readOnly: false };
18474
18448
  let found = /* @__PURE__ */ new Map();
18475
18449
  const render = () => {
@@ -18542,12 +18516,8 @@ function createTitleBar(handlers) {
18542
18516
  },
18543
18517
  setReadOnly(readOnly) {
18544
18518
  model.readOnly = readOnly;
18545
- mode.value = readOnly ? "viewing" : "editing";
18546
18519
  render();
18547
18520
  },
18548
- setCommentsOpen(open) {
18549
- comments.setAttribute("aria-pressed", String(open));
18550
- },
18551
18521
  relocalize: render
18552
18522
  };
18553
18523
  }
@@ -18560,10 +18530,13 @@ var EditorChrome = class {
18560
18530
  this.titleBar = createTitleBar({
18561
18531
  fileCommand: (command) => void this.run(command),
18562
18532
  history: (key2) => host.history(key2),
18563
- toggleComments: () => host.toggleComments(),
18564
- setReadOnly: (readOnly) => host.setReadOnly(readOnly),
18565
18533
  ribbon: () => host.ribbon()
18566
18534
  });
18535
+ this.ribbonActions = createRibbonActions({
18536
+ setReadOnly: (readOnly) => host.setReadOnly(readOnly),
18537
+ toggleComments: () => host.toggleComments(),
18538
+ share: () => void this.run("share")
18539
+ });
18567
18540
  this.backstage = createBackstage({
18568
18541
  fileCommand: (command, fileName) => void this.run(command, fileName),
18569
18542
  close: () => this.closeBackstage(),
@@ -18608,6 +18581,7 @@ var EditorChrome = class {
18608
18581
  }
18609
18582
  host;
18610
18583
  titleBar;
18584
+ ribbonActions;
18611
18585
  backstage;
18612
18586
  statusBar;
18613
18587
  fileInput;
@@ -18619,6 +18593,7 @@ var EditorChrome = class {
18619
18593
  frame.prepend(this.titleBar.element);
18620
18594
  frame.append(this.statusBar.element, this.backstage.element, this.fileInput);
18621
18595
  this.ribbon = ribbon;
18596
+ ribbon.append(this.ribbonActions.element);
18622
18597
  ribbon.addEventListener("office-ribbon-file", () => this.backstage.open("home"));
18623
18598
  }
18624
18599
  get fileName() {
@@ -18644,6 +18619,7 @@ var EditorChrome = class {
18644
18619
  this.statusBar.relocalize();
18645
18620
  this.backstage.relocalize();
18646
18621
  this.titleBar.relocalize();
18622
+ this.ribbonActions.relocalize(locale);
18647
18623
  const fileTab = this.host.ribbon()?.querySelector(".dve-file-tab");
18648
18624
  if (fileTab) fileTab.textContent = translate(locale, "File");
18649
18625
  this.fileInput.setAttribute("aria-label", translate(locale, "Open"));
@@ -18655,6 +18631,8 @@ var EditorChrome = class {
18655
18631
  this.statusBar.setNoteCount(model.warnings.length);
18656
18632
  this.statusBar.setLanguage(this.host.element.lang || "");
18657
18633
  this.titleBar.setReadOnly(this.host.readOnly());
18634
+ this.ribbonActions.setReadOnly(this.host.readOnly());
18635
+ this.ribbonActions.setSharing(this.host.collaborating());
18658
18636
  }
18659
18637
  closeBackstage() {
18660
18638
  this.backstage.close();
@@ -18667,6 +18645,7 @@ var EditorChrome = class {
18667
18645
  if (command === "new") this.newDocument();
18668
18646
  else if (command === "open") this.fileInput.click();
18669
18647
  else if (command === "print") this.host.print();
18648
+ else if (command === "share") return;
18670
18649
  else if (command === "exportText")
18671
18650
  downloadText(plainText(this.host.model()), withExtension(this._fileName, "txt"));
18672
18651
  else if (command === "saveAs") {
@@ -18827,25 +18806,25 @@ function openTablePicker(anchor, onPick, onClose) {
18827
18806
  const paint = () => {
18828
18807
  caption.textContent = translateTemplate(locale, "table.size", { columns, rows });
18829
18808
  cells.forEach((cell, index) => {
18830
- const row4 = Math.floor(index / PICKER_COLUMNS);
18809
+ const row3 = Math.floor(index / PICKER_COLUMNS);
18831
18810
  const column = index % PICKER_COLUMNS;
18832
- cell.classList.toggle("active", row4 < rows && column < columns);
18811
+ cell.classList.toggle("active", row3 < rows && column < columns);
18833
18812
  });
18834
18813
  };
18835
- for (let row4 = 0; row4 < PICKER_ROWS; row4++)
18814
+ for (let row3 = 0; row3 < PICKER_ROWS; row3++)
18836
18815
  for (let column = 0; column < PICKER_COLUMNS; column++) {
18837
18816
  const cell = document.createElement("div");
18838
18817
  cell.setAttribute("role", "gridcell");
18839
- cell.dataset.rows = String(row4 + 1);
18818
+ cell.dataset.rows = String(row3 + 1);
18840
18819
  cell.dataset.columns = String(column + 1);
18841
18820
  cell.addEventListener("mouseenter", () => {
18842
- rows = row4 + 1;
18821
+ rows = row3 + 1;
18843
18822
  columns = column + 1;
18844
18823
  paint();
18845
18824
  });
18846
18825
  cell.addEventListener("mousedown", (event) => event.preventDefault());
18847
18826
  cell.addEventListener("click", () => {
18848
- onPick(row4 + 1, column + 1);
18827
+ onPick(row3 + 1, column + 1);
18849
18828
  onClose();
18850
18829
  });
18851
18830
  cells.push(cell);
@@ -19408,9 +19387,9 @@ var PageNavigator = class {
19408
19387
  }
19409
19388
  const version = this.host.version();
19410
19389
  if (version !== this.built || this.thumbs.length !== status.total) this.rebuild(version);
19411
- const labels2 = `${locale}:${status.total}`;
19412
- if (labels2 !== this.labels) this.relabelThumbs(locale, status.total);
19413
- this.labels = labels2;
19390
+ const labels3 = `${locale}:${status.total}`;
19391
+ if (labels3 !== this.labels) this.relabelThumbs(locale, status.total);
19392
+ this.labels = labels3;
19414
19393
  this.mark(status.current);
19415
19394
  }
19416
19395
  relabelChrome(locale, active, ready) {
@@ -19880,7 +19859,7 @@ function createContextMenu(host) {
19880
19859
  element.state = {
19881
19860
  ...state,
19882
19861
  items: state.items.map(
19883
- (row4) => row4.id === "paste" ? { ...row4, disabled: true, title: denied } : row4
19862
+ (row3) => row3.id === "paste" ? { ...row3, disabled: true, title: denied } : row3
19884
19863
  )
19885
19864
  };
19886
19865
  });
@@ -19926,7 +19905,7 @@ function shortcutRows(registry, mac) {
19926
19905
  label: shortcut.label,
19927
19906
  keys: registry.keysFor(shortcut.id, mac).join(" / ")
19928
19907
  }));
19929
- return [...general, ...editorShortcutRows(mac)].filter((row4) => row4.keys);
19908
+ return [...general, ...editorShortcutRows(mac)].filter((row3) => row3.keys);
19930
19909
  }
19931
19910
  function createShortcutHelp(onClose) {
19932
19911
  const element = createDialogShell("", "dve-shortcut-help");
@@ -19966,11 +19945,11 @@ function createShortcutHelp(onClose) {
19966
19945
  head.append(cell);
19967
19946
  }
19968
19947
  const body = table.createTBody();
19969
- for (const row4 of rows) {
19948
+ for (const row3 of rows) {
19970
19949
  const tr = body.insertRow();
19971
- tr.insertCell().textContent = translate(locale, row4.label);
19950
+ tr.insertCell().textContent = translate(locale, row3.label);
19972
19951
  const kbd = document.createElement("kbd");
19973
- kbd.textContent = row4.keys;
19952
+ kbd.textContent = row3.keys;
19974
19953
  tr.insertCell().append(kbd);
19975
19954
  }
19976
19955
  setDialogOpen(element, true);
@@ -20139,6 +20118,7 @@ function createChrome(core, api) {
20139
20118
  if (typeof document.execCommand === "function") core.targetView()?.focus();
20140
20119
  },
20141
20120
  toggleComments: () => shell.review?.handleComments("toggle"),
20121
+ collaborating: () => core.collab.active,
20142
20122
  setViewMode: (mode) => core.pages.setViewMode(mode),
20143
20123
  setZoom: (percent) => core.pages.setZoom(percent),
20144
20124
  options: () => ({