ooxml-ui 1.0.0 → 1.2.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 (169) hide show
  1. package/README.md +40 -36
  2. package/custom-elements.json +211 -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-T3HB5LMH.js → chunk-7FNDOWTX.js} +393 -15
  8. package/dist/{chunk-FLHM5Q4O.js → chunk-AYXFLBSV.js} +92 -13
  9. package/dist/{chunk-X7RINDJQ.js → chunk-JAJFLFAV.js} +1 -1
  10. package/dist/{chunk-OXKWNNNJ.js → chunk-VUB44CAJ.js} +1 -1
  11. package/dist/{chunk-JFJXBYRD.js → chunk-XNCWB2X6.js} +5 -0
  12. package/dist/{chunk-XDUYS4KK.js → chunk-Y2E22JVO.js} +1 -1
  13. package/dist/{chunk-ZV2Z4IWH.js → chunk-YK2DPYMU.js} +5 -2
  14. package/dist/{chunk-4QQASR5A.js → chunk-YP5S7DTT.js} +6 -5
  15. package/dist/comments/comments-pane.d.ts +116 -0
  16. package/dist/comments/comments-pane.d.ts.map +1 -0
  17. package/dist/comments/types.d.ts +80 -0
  18. package/dist/comments/types.d.ts.map +1 -0
  19. package/dist/controls.d.ts +4 -2
  20. package/dist/controls.d.ts.map +1 -1
  21. package/dist/controls.js +4 -4
  22. package/dist/docx/comments-panel.d.ts +8 -1
  23. package/dist/docx/image-media.d.ts +1 -1
  24. package/dist/docx/locales/en-ribbon.d.ts +1 -0
  25. package/dist/docx/locales/en.d.ts +1 -0
  26. package/dist/docx/localization-strings.d.ts +2 -1
  27. package/dist/docx/localization.d.ts +7 -1
  28. package/dist/docx/print-layout.d.ts +2 -2
  29. package/dist/docx/print-picture.d.ts +12 -0
  30. package/dist/docx/review-controller.d.ts +2 -0
  31. package/dist/docx/ruler.d.ts +7 -10
  32. package/dist/docx.js +289 -339
  33. package/dist/form/gradient-preset-gallery.d.ts +2 -2
  34. package/dist/index.d.ts +1 -1
  35. package/dist/index.js +8 -8
  36. package/dist/pptx/{chart-3d-view-scene-2KRQ5667.mjs → chart-3d-view-scene-6B5TOWB6.mjs} +3 -3
  37. package/dist/pptx/{chart-3d-view-scene-36DMZWZ3.cjs → chart-3d-view-scene-MJ6YNT56.cjs} +37 -37
  38. package/dist/pptx/{chunk-YOGDIDPB.mjs → chunk-AWKKC3VW.mjs} +8 -2
  39. package/dist/pptx/{chunk-XQZWZMGZ.cjs → chunk-SM3CWDIQ.cjs} +7 -17
  40. package/dist/pptx/{chunk-CJU4P5FT.cjs → chunk-STKGUT5S.cjs} +18 -12
  41. package/dist/pptx/{chunk-JSBGBVBH.mjs → chunk-VRFNAF3Q.mjs} +7 -17
  42. package/dist/pptx/{chunk-YHA6XAB3.cjs → chunk-XIQMFSNG.cjs} +1 -1
  43. package/dist/pptx/{chunk-YARCML7O.mjs → chunk-XQVKQD5Z.mjs} +294 -265
  44. package/dist/pptx/{chunk-XWE5GSE7.mjs → chunk-YI5LH5NN.mjs} +533 -428
  45. package/dist/pptx/{chunk-ADOC5JLI.mjs → chunk-YMTQLZ2I.mjs} +1 -1
  46. package/dist/pptx/{chunk-AIL3BNZS.cjs → chunk-YRHK45AB.cjs} +301 -265
  47. package/dist/pptx/{chunk-FEFQTZDM.cjs → chunk-ZK344LOB.cjs} +689 -574
  48. package/dist/pptx/dom/elements/chart.d.ts +2 -3
  49. package/dist/pptx/dom/elements/chart.d.ts.map +1 -1
  50. package/dist/pptx/dom/elements/table.d.ts.map +1 -1
  51. package/dist/pptx/dom/index.cjs +257 -246
  52. package/dist/pptx/dom/index.mjs +28 -17
  53. package/dist/pptx/export/html2canvas-clone.cjs +2 -2
  54. package/dist/pptx/export/html2canvas-clone.mjs +1 -1
  55. package/dist/pptx/i18n/index.cjs +6 -6
  56. package/dist/pptx/i18n/index.mjs +1 -1
  57. package/dist/pptx/i18n/translator.d.ts.map +1 -1
  58. package/dist/pptx/index.cjs +3035 -2991
  59. package/dist/pptx/index.mjs +5 -5
  60. package/dist/pptx/render/chart-axis-range.d.ts +7 -0
  61. package/dist/pptx/render/chart-axis-range.d.ts.map +1 -1
  62. package/dist/pptx/render/chart-axis-render.d.ts +3 -1
  63. package/dist/pptx/render/chart-axis-render.d.ts.map +1 -1
  64. package/dist/pptx/render/chart-axis-style.d.ts +5 -0
  65. package/dist/pptx/render/chart-axis-style.d.ts.map +1 -1
  66. package/dist/pptx/render/chart-axis.d.ts +1 -1
  67. package/dist/pptx/render/chart-axis.d.ts.map +1 -1
  68. package/dist/pptx/render/chart-cartesian-axes.d.ts.map +1 -1
  69. package/dist/pptx/render/chart-cartesian-bars.d.ts +3 -3
  70. package/dist/pptx/render/chart-cartesian-bars.d.ts.map +1 -1
  71. package/dist/pptx/render/chart-cartesian-percent-stacked.d.ts.map +1 -1
  72. package/dist/pptx/render/chart-cartesian.d.ts.map +1 -1
  73. package/dist/pptx/render/chart-combo-stock.cjs +3 -3
  74. package/dist/pptx/render/chart-combo-stock.mjs +1 -1
  75. package/dist/pptx/render/chart-combo.d.ts.map +1 -1
  76. package/dist/pptx/render/chart-gridlines-toggle.d.ts +13 -1
  77. package/dist/pptx/render/chart-gridlines-toggle.d.ts.map +1 -1
  78. package/dist/pptx/render/chart-helpers.d.ts +13 -13
  79. package/dist/pptx/render/chart-helpers.d.ts.map +1 -1
  80. package/dist/pptx/render/chart-horizontal-bars-helpers.d.ts +7 -3
  81. package/dist/pptx/render/chart-horizontal-bars-helpers.d.ts.map +1 -1
  82. package/dist/pptx/render/chart-horizontal-bars.d.ts.map +1 -1
  83. package/dist/pptx/render/chart-interaction-stacked.d.ts.map +1 -1
  84. package/dist/pptx/render/chart-overlays.cjs +7 -7
  85. package/dist/pptx/render/chart-overlays.mjs +1 -1
  86. package/dist/pptx/render/chart-palette.d.ts +5 -14
  87. package/dist/pptx/render/chart-palette.d.ts.map +1 -1
  88. package/dist/pptx/render/chart-quick-action-styles.d.ts +5 -3
  89. package/dist/pptx/render/chart-quick-action-styles.d.ts.map +1 -1
  90. package/dist/pptx/render/chart-scatter-x-axis.d.ts.map +1 -1
  91. package/dist/pptx/render/chart-style-palette.d.ts +52 -0
  92. package/dist/pptx/render/chart-style-palette.d.ts.map +1 -0
  93. package/dist/pptx/render/chart-surface-treemap.cjs +4 -4
  94. package/dist/pptx/render/chart-surface-treemap.mjs +1 -1
  95. package/dist/pptx/render/chart-view-model-bars.d.ts +31 -1
  96. package/dist/pptx/render/chart-view-model-bars.d.ts.map +1 -1
  97. package/dist/pptx/render/chart-view-model-build.d.ts.map +1 -1
  98. package/dist/pptx/render/chart-view-model.cjs +53 -41
  99. package/dist/pptx/render/chart-view-model.mjs +1 -1
  100. package/dist/pptx/render/chart-waterfall-map.cjs +6 -6
  101. package/dist/pptx/render/chart-waterfall-map.mjs +1 -1
  102. package/dist/pptx/render/connector-elbow-geometry.d.ts +7 -43
  103. package/dist/pptx/render/connector-elbow-geometry.d.ts.map +1 -1
  104. package/dist/pptx/render/foreign-object-svg-document.d.ts +12 -0
  105. package/dist/pptx/render/foreign-object-svg-document.d.ts.map +1 -1
  106. package/dist/pptx/render/index.d.ts +2 -0
  107. package/dist/pptx/render/index.d.ts.map +1 -1
  108. package/dist/pptx/render/table-cell-css.d.ts +3 -2
  109. package/dist/pptx/render/table-cell-css.d.ts.map +1 -1
  110. package/dist/pptx/render/table-cell-edit.d.ts +1 -1
  111. package/dist/pptx/render/table-cell-edit.d.ts.map +1 -1
  112. package/dist/pptx/render/table-cell-paragraphs.d.ts +29 -0
  113. package/dist/pptx/render/table-cell-paragraphs.d.ts.map +1 -0
  114. package/dist/pptx/render/table-style.d.ts +2 -0
  115. package/dist/pptx/render/table-style.d.ts.map +1 -1
  116. package/dist/pptx/render/title-bar.d.ts +5 -0
  117. package/dist/pptx/render/title-bar.d.ts.map +1 -1
  118. package/dist/pptx/render/viewer-root-options.d.ts +54 -0
  119. package/dist/pptx/render/viewer-root-options.d.ts.map +1 -0
  120. package/dist/pptx/web-components/office-token-bridge.d.ts.map +1 -1
  121. package/dist/pptx/web-components/registration-contract.d.ts.map +1 -1
  122. package/dist/presence.js +3 -3
  123. package/dist/registry.d.ts +2 -0
  124. package/dist/registry.d.ts.map +1 -1
  125. package/dist/ribbon/ribbon-tabs.d.ts +2 -1
  126. package/dist/ribbon/ribbon-tabs.d.ts.map +1 -1
  127. package/dist/smartart/smartart-svg.d.ts +3 -2
  128. package/dist/smartart.js +3 -3
  129. package/dist/suite/attachment-store.d.ts +13 -0
  130. package/dist/suite/document-store.d.ts +31 -0
  131. package/dist/suite/index.d.ts +2 -0
  132. package/dist/suite.js +132 -1
  133. package/dist/teams/app/channel-tab.d.ts +5 -0
  134. package/dist/teams/chat-composer.d.ts +3 -0
  135. package/dist/teams.js +6 -6
  136. package/dist/theme.js +2 -2
  137. package/dist/tokens.d.ts +5 -0
  138. package/dist/tokens.d.ts.map +1 -1
  139. package/dist/visio/styles/index.d.ts +2 -0
  140. package/dist/visio/styles/theme.d.ts +11 -0
  141. package/dist/visio/styles.d.ts +2 -2
  142. package/dist/visio.js +76 -25
  143. package/dist/xlsx/backstage/index.d.ts +4 -1
  144. package/dist/xlsx/backstage/pages-share.d.ts +19 -0
  145. package/dist/xlsx/backstage/parts.d.ts +3 -0
  146. package/dist/xlsx/chart-fill-binding.d.ts +2 -2
  147. package/dist/xlsx/chart-series-gradient-type.d.ts +3 -2
  148. package/dist/xlsx/collaboration-session.d.ts +9 -0
  149. package/dist/xlsx/collaboration-types.d.ts +41 -0
  150. package/dist/xlsx/collaboration.d.ts +56 -0
  151. package/dist/xlsx/component.d.ts +8 -0
  152. package/dist/xlsx/dialogs/comments-list.d.ts +4 -0
  153. package/dist/xlsx/dialogs/help-dialogs.d.ts +1 -1
  154. package/dist/xlsx/editor-core.d.ts +3 -0
  155. package/dist/xlsx/element-api.d.ts +19 -1
  156. package/dist/xlsx/events.d.ts +4 -1
  157. package/dist/xlsx/grid/remote-layer.d.ts +3 -0
  158. package/dist/xlsx/grid/sparkline.d.ts +3 -0
  159. package/dist/xlsx/grid/styles.d.ts +1 -1
  160. package/dist/xlsx/index.d.ts +1 -0
  161. package/dist/xlsx/ribbon-actions.d.ts +21 -0
  162. package/dist/xlsx/shell-commands.d.ts +1 -1
  163. package/dist/xlsx/title-bar.d.ts +4 -2
  164. package/dist/xlsx.js +712 -90
  165. package/package.json +3 -3
  166. package/dist/pptx/web-components/status-bar-styles.d.ts +0 -3
  167. package/dist/pptx/web-components/status-bar-styles.d.ts.map +0 -1
  168. package/dist/pptx/web-components/title-bar-styles.d.ts +0 -7
  169. package/dist/pptx/web-components/title-bar-styles.d.ts.map +0 -1
package/dist/docx.js CHANGED
@@ -1,13 +1,14 @@
1
- import { defineSmartArt } from './chunk-XDUYS4KK.js';
2
- import { shadcnBridge } from './chunk-X7RINDJQ.js';
3
- import { createRibbonOverflow, defineRibbon, defineDialog, defineSearchField, defineSwitch, defineTitleBar, defineBackstage, defineStatusBar, defineZoomSlider, defineContextMenu, runKeyTips, assignKeyTips } from './chunk-T3HB5LMH.js';
1
+ import { defineSmartArt } from './chunk-Y2E22JVO.js';
2
+ import { shadcnBridge } from './chunk-JAJFLFAV.js';
3
+ import { createRibbonOverflow, defineRibbon, defineRuler, defineCommentsPane, defineDialog, defineSearchField, defineSwitch, defineTitleBar, defineBackstage, defineStatusBar, defineZoomSlider, defineContextMenu, runKeyTips, assignKeyTips } from './chunk-7FNDOWTX.js';
4
4
  import { registerIcon } from './chunk-BOX43CZD.js';
5
- import './chunk-OXKWNNNJ.js';
6
- import './chunk-ZV2Z4IWH.js';
7
- import './chunk-JFJXBYRD.js';
8
- 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, 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';
5
+ import './chunk-VUB44CAJ.js';
6
+ import './chunk-YK2DPYMU.js';
7
+ import './chunk-XNCWB2X6.js';
8
+ import { normalizeLocale, SUPPORTED_OFFICE_LOCALES, interpolate } from 'ooxml-core/i18n';
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';
9
10
  import { Schema, DOMSerializer, Fragment } from 'prosemirror-model';
10
- 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';
11
12
  export { CollaborationAuthority, CollaborationClient, RIBBON_ACTION_IDS, RIBBON_ACTION_LABELS, createCollaborationIdGenerator, darkTheme, isRibbonActionId, lightTheme, normalizeRibbonActions, repairCollaborativeDocumentIds, themeToCssVars } from 'ooxml-core/docx/ui';
12
13
  import { parseOmml, convertOmmlToLatex, convertOmmlToMathMl } from 'ooxml-core/math';
13
14
  import { PluginKey, EditorState, Plugin, NodeSelection, TextSelection, Selection } from 'prosemirror-state';
@@ -1266,6 +1267,7 @@ var deRibbon = {
1266
1267
  Reply: "Antworten",
1267
1268
  Resolve: "L\xF6sen",
1268
1269
  Reopen: "Erneut \xF6ffnen",
1270
+ Resolved: "Gel\xF6st",
1269
1271
  Delete: "L\xF6schen",
1270
1272
  "No comments": "Noch keine Kommentare.",
1271
1273
  Tracking: "Nachverfolgung",
@@ -1926,6 +1928,7 @@ var enRibbon = {
1926
1928
  Reply: "Reply",
1927
1929
  Resolve: "Resolve",
1928
1930
  Reopen: "Reopen",
1931
+ Resolved: "Resolved",
1929
1932
  Delete: "Delete",
1930
1933
  "No comments": "No comments yet.",
1931
1934
  Tracking: "Tracking",
@@ -2586,6 +2589,7 @@ var esRibbon = {
2586
2589
  Reply: "Responder",
2587
2590
  Resolve: "Resolver",
2588
2591
  Reopen: "Reabrir",
2592
+ Resolved: "Resuelto",
2589
2593
  Delete: "Eliminar",
2590
2594
  "No comments": "A\xFAn no hay comentarios.",
2591
2595
  Tracking: "Seguimiento",
@@ -3246,6 +3250,7 @@ var frRibbon = {
3246
3250
  Reply: "R\xE9pondre",
3247
3251
  Resolve: "R\xE9soudre",
3248
3252
  Reopen: "Rouvrir",
3253
+ Resolved: "R\xE9solu",
3249
3254
  Delete: "Supprimer",
3250
3255
  "No comments": "Aucun commentaire pour le moment.",
3251
3256
  Tracking: "Suivi",
@@ -3906,6 +3911,7 @@ var zhCNRibbon = {
3906
3911
  Reply: "\u56DE\u590D",
3907
3912
  Resolve: "\u89E3\u51B3",
3908
3913
  Reopen: "\u91CD\u65B0\u6253\u5F00",
3914
+ Resolved: "\u5DF2\u89E3\u51B3",
3909
3915
  Delete: "\u5220\u9664",
3910
3916
  "No comments": "\u6682\u65E0\u6279\u6CE8\u3002",
3911
3917
  Tracking: "\u4FEE\u8BA2",
@@ -3949,30 +3955,17 @@ var zhCN = {
3949
3955
 
3950
3956
  // src/docx/localization-strings.ts
3951
3957
  var strings = { en, fr, de, es, "zh-CN": zhCN };
3952
- var EDITOR_LOCALES = ["en", "fr", "de", "es", "zh-CN"];
3958
+ var EDITOR_LOCALES = SUPPORTED_OFFICE_LOCALES;
3953
3959
 
3954
3960
  // src/docx/localization.ts
3955
3961
  function normalizeEditorLocale(value) {
3956
- const parts = (value ?? "").trim().toLowerCase().split(/[-_]/);
3957
- switch (parts[0]) {
3958
- case "fr":
3959
- case "de":
3960
- case "es":
3961
- return parts[0];
3962
- case "zh":
3963
- return parts.some((part) => ["hant", "tw", "hk", "mo"].includes(part)) ? "en" : "zh-CN";
3964
- default:
3965
- return "en";
3966
- }
3962
+ return normalizeLocale(value, EDITOR_LOCALES, "en");
3967
3963
  }
3968
3964
  function translate(locale, key2) {
3969
3965
  return strings[locale][key2] ?? strings.en[key2] ?? key2;
3970
3966
  }
3971
3967
  function translateTemplate(locale, key2, values2) {
3972
- return translate(locale, key2).replace(
3973
- /\{(\w+)\}/g,
3974
- (match, name) => name in values2 ? String(values2[name]) : match
3975
- );
3968
+ return interpolate(translate(locale, key2), values2);
3976
3969
  }
3977
3970
  function translateDynamic(locale, text) {
3978
3971
  if (locale === "en") return text;
@@ -4073,8 +4066,18 @@ function localizeElement(root, locale) {
4073
4066
  }
4074
4067
  }
4075
4068
  }
4069
+ var controlCache = /* @__PURE__ */ new WeakMap();
4076
4070
  function findLocalizedControl(root, label) {
4077
- return root.querySelector(`[aria-label="${label}"], [data-localearialabel="${label}"]`);
4071
+ let cache = controlCache.get(root);
4072
+ const cached = cache?.get(label);
4073
+ if (cached?.isConnected && root.contains(cached) && (cached.getAttribute("aria-label") === label || cached.dataset.localearialabel === label))
4074
+ return cached;
4075
+ const found = root.querySelector(`[aria-label="${label}"], [data-localearialabel="${label}"]`);
4076
+ if (found) {
4077
+ if (!cache) controlCache.set(root, cache = /* @__PURE__ */ new Map());
4078
+ cache.set(label, found);
4079
+ }
4080
+ return found;
4078
4081
  }
4079
4082
 
4080
4083
  // src/docx/shell-labels.ts
@@ -4360,9 +4363,9 @@ var schema = new Schema({
4360
4363
  }
4361
4364
  const body = [
4362
4365
  "tbody",
4363
- ...rows.map((row4) => [
4366
+ ...rows.map((row3) => [
4364
4367
  "tr",
4365
- ...row4.map((cell) => ["td", cell.text])
4368
+ ...row3.map((cell) => ["td", cell.text])
4366
4369
  ])
4367
4370
  ];
4368
4371
  return ["table", { class: "dve-nested-preview", contenteditable: "false" }, body];
@@ -4378,12 +4381,12 @@ function cellKey(cell) {
4378
4381
  function tableNode(block, paragraphNode2, tableStyles) {
4379
4382
  const columnCount = Math.max(
4380
4383
  1,
4381
- ...block.rows.map((row4) => row4.reduce((sum, cell) => sum + (cell.gridSpan ?? 1), 0))
4384
+ ...block.rows.map((row3) => row3.reduce((sum, cell) => sum + (cell.gridSpan ?? 1), 0))
4382
4385
  );
4383
- const rows = block.rows.map((row4, rowIndex) => {
4386
+ const rows = block.rows.map((row3, rowIndex) => {
4384
4387
  const cells = [];
4385
4388
  let gridColumn = 0;
4386
- row4.forEach((cell, columnIndex) => {
4389
+ row3.forEach((cell, columnIndex) => {
4387
4390
  const column = gridColumn;
4388
4391
  gridColumn += cell.gridSpan ?? 1;
4389
4392
  if (cell.verticalMerge === "continue") return;
@@ -4458,19 +4461,19 @@ function tableNode(block, paragraphNode2, tableStyles) {
4458
4461
  }
4459
4462
  function tableFormattingFromNode(node) {
4460
4463
  const rowProperties = [];
4461
- node.forEach((row4) => rowProperties.push(structuredClone(row4.attrs.properties ?? {})));
4464
+ node.forEach((row3) => rowProperties.push(structuredClone(row3.attrs.properties ?? {})));
4462
4465
  return {
4463
- rowProperties: rowProperties.some((row4) => Object.keys(row4).length) ? rowProperties : void 0,
4466
+ rowProperties: rowProperties.some((row3) => Object.keys(row3).length) ? rowProperties : void 0,
4464
4467
  cellMargins: typeof node.attrs.cellMargins === "string" ? JSON.parse(node.attrs.cellMargins) : void 0
4465
4468
  };
4466
4469
  }
4467
4470
  function convertSimpleTable(node, convertParagraph, prior) {
4468
4471
  const priorCells = /* @__PURE__ */ new Map();
4469
- for (const row4 of prior?.rows ?? []) for (const cell of row4) priorCells.set(cellKey(cell), cell);
4472
+ for (const row3 of prior?.rows ?? []) for (const cell of row3) priorCells.set(cellKey(cell), cell);
4470
4473
  const rows = [];
4471
- node.forEach((row4) => {
4474
+ node.forEach((row3) => {
4472
4475
  const cells = [];
4473
- row4.forEach((cell) => {
4476
+ row3.forEach((cell) => {
4474
4477
  const paragraphs = [];
4475
4478
  cell.forEach((paragraph2) => {
4476
4479
  if (paragraph2.type.name === "paragraph") paragraphs.push(convertParagraph(paragraph2));
@@ -4504,9 +4507,9 @@ function convertSimpleTable(node, convertParagraph, prior) {
4504
4507
  function convertMergedTable(node, prior, convertParagraph) {
4505
4508
  const updated = structuredClone(prior);
4506
4509
  const cellByKey = /* @__PURE__ */ new Map();
4507
- for (const row4 of updated.rows) for (const cell of row4) cellByKey.set(cellKey(cell), cell);
4510
+ for (const row3 of updated.rows) for (const cell of row3) cellByKey.set(cellKey(cell), cell);
4508
4511
  node.forEach(
4509
- (row4) => row4.forEach((cellNode) => {
4512
+ (row3) => row3.forEach((cellNode) => {
4510
4513
  const target = cellByKey.get(String(cellNode.attrs.sourceCellKey || ""));
4511
4514
  if (!target) return;
4512
4515
  const paragraphs = [];
@@ -4563,14 +4566,14 @@ function sectionBreaksPlugin() {
4563
4566
  const json = state.doc.attrs.sections;
4564
4567
  const sections = typeof json === "string" ? JSON.parse(json) : [];
4565
4568
  if (sections.length < 2) return null;
4566
- const labels2 = /* @__PURE__ */ new Map();
4569
+ const labels3 = /* @__PURE__ */ new Map();
4567
4570
  sections.slice(0, -1).forEach((section3, index) => {
4568
4571
  const following = sections[index + 1];
4569
- if (following) labels2.set(section3.endsAtBlockId, BREAK_LABEL[following.type]);
4572
+ if (following) labels3.set(section3.endsAtBlockId, BREAK_LABEL[following.type]);
4570
4573
  });
4571
4574
  const decorations2 = [];
4572
4575
  state.doc.forEach((node, offset) => {
4573
- const label = labels2.get(String(node.attrs.id));
4576
+ const label = labels3.get(String(node.attrs.id));
4574
4577
  if (label)
4575
4578
  decorations2.push(
4576
4579
  Decoration.node(offset, offset + node.nodeSize, {
@@ -4584,8 +4587,8 @@ function sectionBreaksPlugin() {
4584
4587
  }
4585
4588
  });
4586
4589
  }
4587
- function paragraphNode(paragraph2, labels2, noteNumber) {
4588
- const label = labels2.get(paragraph2.id);
4590
+ function paragraphNode(paragraph2, labels3, noteNumber) {
4591
+ const label = labels3.get(paragraph2.id);
4589
4592
  const children = paragraph2.runs.flatMap((run) => runToInlineNodes(run, noteNumber));
4590
4593
  return schema.node(
4591
4594
  "paragraph",
@@ -4601,7 +4604,7 @@ function paragraphNode(paragraph2, labels2, noteNumber) {
4601
4604
  );
4602
4605
  }
4603
4606
  function modelToDoc(model) {
4604
- const labels2 = computeListLabels(model);
4607
+ const labels3 = computeListLabels(model);
4605
4608
  const footnoteOrder = numberNotesInOrder(model.blocks, "footnote");
4606
4609
  const endnoteOrder = numberNotesInOrder(model.blocks, "endnote");
4607
4610
  const noteNumber = (kind, id) => {
@@ -4610,10 +4613,10 @@ function modelToDoc(model) {
4610
4613
  return { number, label: formatNoteNumber(number, format) };
4611
4614
  };
4612
4615
  const blocks = model.blocks.map((block) => {
4613
- if (block.type === "paragraph") return paragraphNode(block, labels2, noteNumber);
4616
+ if (block.type === "paragraph") return paragraphNode(block, labels3, noteNumber);
4614
4617
  return tableNode(
4615
4618
  block,
4616
- (paragraph2) => paragraphNode(paragraph2, labels2, noteNumber),
4619
+ (paragraph2) => paragraphNode(paragraph2, labels3, noteNumber),
4617
4620
  model.tableStyles
4618
4621
  );
4619
4622
  });
@@ -4678,7 +4681,7 @@ function docToModel(doc, prior) {
4678
4681
  if (block.type === "paragraph") remember(block);
4679
4682
  else {
4680
4683
  priorTables.set(block.id, block);
4681
- for (const row4 of block.rows) for (const cell of row4) cell.paragraphs.forEach(remember);
4684
+ for (const row3 of block.rows) for (const cell of row3) cell.paragraphs.forEach(remember);
4682
4685
  }
4683
4686
  }
4684
4687
  const convertParagraph = (node) => {
@@ -4980,10 +4983,10 @@ var DOCX_EDITOR_EVENTS = [
4980
4983
  function on(target, name, listener) {
4981
4984
  target.addEventListener(name, (event) => listener(event));
4982
4985
  }
4983
- function emit(target, name, detail, options = {}) {
4986
+ function emit(target, name, detail2, options = {}) {
4984
4987
  return target.dispatchEvent(
4985
4988
  new CustomEvent(name, {
4986
- detail,
4989
+ detail: detail2,
4987
4990
  bubbles: true,
4988
4991
  composed: true,
4989
4992
  ...options
@@ -5447,7 +5450,7 @@ function openColorGridPopover(anchor, choose, options = {}) {
5447
5450
  grid(
5448
5451
  ...THEME.map(([hex, name]) => swatch(hex, name)),
5449
5452
  ...[0, 1, 2, 3, 4].flatMap(
5450
- (row4) => THEME.map(([, name], column) => swatch(shades[column][row4], name))
5453
+ (row3) => THEME.map(([, name], column) => swatch(shades[column][row3], name))
5451
5454
  )
5452
5455
  ),
5453
5456
  title("Standard Colors"),
@@ -5819,10 +5822,10 @@ function openGallery(anchor, control, kind, commands) {
5819
5822
  words.className = "gallery-words";
5820
5823
  words.append(name);
5821
5824
  if (look.detail) {
5822
- const detail = document.createElement("span");
5823
- detail.className = "gallery-detail";
5824
- detail.textContent = look.detail;
5825
- words.append(detail);
5825
+ const detail2 = document.createElement("span");
5826
+ detail2.className = "gallery-detail";
5827
+ detail2.textContent = look.detail;
5828
+ words.append(detail2);
5826
5829
  }
5827
5830
  item.append(look.thumb, words);
5828
5831
  item.addEventListener("mousedown", (event) => event.preventDefault());
@@ -6517,8 +6520,8 @@ var languageOptions = [
6517
6520
  ["hi-IN", "Hindi (India)"],
6518
6521
  ["ru-RU", "Russian (Russia)"]
6519
6522
  ];
6520
- function emit2(control, detail) {
6521
- emit(control, "ribbon-action", detail);
6523
+ function emit2(control, detail2) {
6524
+ emit(control, "ribbon-action", detail2);
6522
6525
  }
6523
6526
  function languageControl(label, key2) {
6524
6527
  const wrapper = document.createElement("label");
@@ -7850,15 +7853,15 @@ function runStylesPlugin(getModel, getMode = () => "all") {
7850
7853
  if (block.type.name !== "table") return;
7851
7854
  const table = tables.get(String(block.attrs.id));
7852
7855
  let columnCount = 1;
7853
- block.forEach((row4) => {
7856
+ block.forEach((row3) => {
7854
7857
  let width = 0;
7855
- row4.forEach((cell) => width += Number(cell.attrs.colspan) || 1);
7858
+ row3.forEach((cell) => width += Number(cell.attrs.colspan) || 1);
7856
7859
  columnCount = Math.max(columnCount, width);
7857
7860
  });
7858
- block.forEach((row4, rowOffset, rowIndex) => {
7861
+ block.forEach((row3, rowOffset, rowIndex) => {
7859
7862
  let column = 0;
7860
7863
  const rowStart = blockOffset + 1 + rowOffset + 1;
7861
- row4.forEach((cell, cellOffset) => {
7864
+ row3.forEach((cell, cellOffset) => {
7862
7865
  const tableStyleRun = table?.style ? resolveTableStyleFormatting(
7863
7866
  table.style,
7864
7867
  model.tableStyles,
@@ -9218,7 +9221,7 @@ function readCellFill(ctx, state, scope) {
9218
9221
  const fills = /* @__PURE__ */ new Set();
9219
9222
  const table = state.doc.nodeAt(ctx.tablePos);
9220
9223
  table?.forEach(
9221
- (row4, _offset, rowIndex) => row4.forEach((cell, _cellOffset, column) => {
9224
+ (row3, _offset, rowIndex) => row3.forEach((cell, _cellOffset, column) => {
9222
9225
  if (scope === "cell" && (rowIndex < ctx.rect.top || rowIndex > ctx.rect.bottom || column < ctx.rect.left || column > ctx.rect.right))
9223
9226
  return;
9224
9227
  const fill = cell.attrs.shadingFill;
@@ -9233,7 +9236,7 @@ function applyCellFill(tr, ctx, scope, fill) {
9233
9236
  const table = tr.doc.nodeAt(ctx.tablePos);
9234
9237
  if (!table) return;
9235
9238
  table.forEach(
9236
- (row4, rowOffset, rowIndex) => row4.forEach((cell, cellOffset, column) => {
9239
+ (row3, rowOffset, rowIndex) => row3.forEach((cell, cellOffset, column) => {
9237
9240
  if (scope === "cell" && (rowIndex < ctx.rect.top || rowIndex > ctx.rect.bottom || column < ctx.rect.left || column > ctx.rect.right))
9238
9241
  return;
9239
9242
  tr.setNodeMarkup(ctx.tablePos + 2 + rowOffset + cellOffset, void 0, {
@@ -9270,8 +9273,8 @@ function tableBorderContext(state) {
9270
9273
  if (table.attrs.structureEditable === false) return null;
9271
9274
  const tablePos = $from.before(depth);
9272
9275
  const cells = [];
9273
- table.forEach((row4, rowOffset, rowIndex) => {
9274
- row4.forEach((cell, cellOffset, column) => {
9276
+ table.forEach((row3, rowOffset, rowIndex) => {
9277
+ row3.forEach((cell, cellOffset, column) => {
9275
9278
  const pos = tablePos + 1 + rowOffset + 1 + cellOffset;
9276
9279
  if (Math.max(from2, pos + 1) <= Math.min(to, pos + cell.nodeSize - 1))
9277
9280
  cells.push({ pos, row: rowIndex, column, node: cell });
@@ -9295,11 +9298,11 @@ function tableBorderContext(state) {
9295
9298
  }
9296
9299
  function edgesOf(preset, rect) {
9297
9300
  const edges = [];
9298
- for (let row4 = rect.top; row4 <= rect.bottom; row4++)
9301
+ for (let row3 = rect.top; row3 <= rect.bottom; row3++)
9299
9302
  for (let column = rect.left; column <= rect.right; column++) {
9300
9303
  const outside = {
9301
- top: row4 === rect.top,
9302
- bottom: row4 === rect.bottom,
9304
+ top: row3 === rect.top,
9305
+ bottom: row3 === rect.bottom,
9303
9306
  left: column === rect.left,
9304
9307
  right: column === rect.right
9305
9308
  };
@@ -9307,13 +9310,13 @@ function edgesOf(preset, rect) {
9307
9310
  const isOutside = outside[side];
9308
9311
  const horizontal = side === "top" || side === "bottom";
9309
9312
  const wanted = preset === "all" || preset === "outside" && isOutside || preset === "insideH" && horizontal && !isOutside || preset === "insideV" && !horizontal && !isOutside || preset === side && isOutside;
9310
- if (wanted) edges.push({ row: row4, column, side });
9313
+ if (wanted) edges.push({ row: row3, column, side });
9311
9314
  }
9312
9315
  }
9313
9316
  return edges;
9314
9317
  }
9315
- var current = (ctx, state, row4, column) => {
9316
- const cell = state.doc.nodeAt(ctx.tablePos)?.child(row4).child(column);
9318
+ var current = (ctx, state, row3, column) => {
9319
+ const cell = state.doc.nodeAt(ctx.tablePos)?.child(row3).child(column);
9317
9320
  return parse2(cell?.attrs.borders);
9318
9321
  };
9319
9322
  function applyEdits(view, ctx, edits, shading) {
@@ -9338,9 +9341,9 @@ function applyEdits(view, ctx, edits, shading) {
9338
9341
  edit
9339
9342
  ]);
9340
9343
  let rowOffset = ctx.tablePos + 1;
9341
- table.forEach((row4, _offset, rowIndex) => {
9344
+ table.forEach((row3, _offset, rowIndex) => {
9342
9345
  let cellPos = rowOffset + 1;
9343
- row4.forEach((cell, _cellOffset, column) => {
9346
+ row3.forEach((cell, _cellOffset, column) => {
9344
9347
  const group3 = grouped.get(`${rowIndex}:${column}`);
9345
9348
  if (group3) {
9346
9349
  const visual = parse2(cell.attrs.borders);
@@ -9362,7 +9365,7 @@ function applyEdits(view, ctx, edits, shading) {
9362
9365
  }
9363
9366
  cellPos += cell.nodeSize;
9364
9367
  });
9365
- rowOffset += row4.nodeSize;
9368
+ rowOffset += row3.nodeSize;
9366
9369
  });
9367
9370
  if (shading) applyCellFill(tr, ctx, shading.scope, shading.fill);
9368
9371
  if (!tr.docChanged) return false;
@@ -9787,6 +9790,7 @@ function refreshFieldResults(tr, pageOf, captionsOnly = false) {
9787
9790
  const targets = bookmarkTargets(tr.doc);
9788
9791
  const changes = [];
9789
9792
  for (const run of fieldResultRanges(tr.doc)) {
9793
+ if (isFieldLocked(inlineNodeRun(schema.text("x", run.marks)))) continue;
9790
9794
  const match = REFERENCE.exec(String(run.mark.attrs.instr ?? ""));
9791
9795
  if (!match || !plainSwitches(match[3] ?? "")) continue;
9792
9796
  const target = targets.get((match[2] ?? "").replace(/^"|"$/g, ""));
@@ -9822,6 +9826,7 @@ function renumberCaptions(tr, label) {
9822
9826
  });
9823
9827
  for (let index = fields.length - 1; index >= 0; index--) {
9824
9828
  const { from: from2, to, node } = fields[index];
9829
+ if (isFieldLocked(inlineNodeRun(node))) continue;
9825
9830
  if (node.text !== String(index + 1))
9826
9831
  tr.replaceWith(from2, to, schema.text(String(index + 1), node.marks));
9827
9832
  }
@@ -10139,9 +10144,9 @@ function paragraphElement(paragraph2, values2) {
10139
10144
  function blockElement(block, values2) {
10140
10145
  if (block.type === "paragraph") return paragraphElement(block, values2);
10141
10146
  const table = document.createElement("table");
10142
- for (const row4 of block.rows) {
10147
+ for (const row3 of block.rows) {
10143
10148
  const tr = document.createElement("tr");
10144
- for (const cell of row4) {
10149
+ for (const cell of row3) {
10145
10150
  const td = document.createElement("td");
10146
10151
  if (cell.gridSpan && cell.gridSpan > 1) td.colSpan = cell.gridSpan;
10147
10152
  for (const paragraph2 of cell.paragraphs) td.append(paragraphElement(paragraph2, values2));
@@ -10160,7 +10165,7 @@ function renderHeaderFooter(content, values2, kind) {
10160
10165
  }
10161
10166
  function floatingPictures(content, page2, anchorTopPx, values2) {
10162
10167
  const paragraphs = content.blocks.flatMap(
10163
- (block) => block.type === "paragraph" ? [block] : block.rows.flatMap((row4) => row4.flatMap((cell) => cell.paragraphs))
10168
+ (block) => block.type === "paragraph" ? [block] : block.rows.flatMap((row3) => row3.flatMap((cell) => cell.paragraphs))
10164
10169
  );
10165
10170
  const column = { xPx: 0, widthPx: page2.widthPx - page2.marginLeftPx - page2.marginRightPx };
10166
10171
  return paragraphs.flatMap(
@@ -11038,10 +11043,10 @@ function tablePropertiesContext(state) {
11038
11043
  const rows = [];
11039
11044
  const cells = [];
11040
11045
  let pos = $from.start(depth);
11041
- table.forEach((row4, offset, index) => {
11046
+ table.forEach((row3, offset, index) => {
11042
11047
  if (index >= $from.index(depth) && index <= $to.index(depth))
11043
- rows.push({ pos: pos + offset, properties: row4.attrs.properties ?? {} });
11044
- row4.forEach((cell, cellOffset) => {
11048
+ rows.push({ pos: pos + offset, properties: row3.attrs.properties ?? {} });
11049
+ row3.forEach((cell, cellOffset) => {
11045
11050
  const cellPos = pos + offset + 1 + cellOffset;
11046
11051
  if (Math.max(state.selection.from, cellPos + 1) <= Math.min(state.selection.to, cellPos + cell.nodeSize - 1))
11047
11052
  cells.push({
@@ -11067,12 +11072,12 @@ function applyTableProperties(view, rowPatch, marginPatch, cellMarginPatch, cell
11067
11072
  if (!Object.keys(rowPatch).length && !Object.keys(marginPatch).length && cellMarginPatch === void 0 && cellAlignment === void 0)
11068
11073
  return true;
11069
11074
  const tr = closeHistory(view.state.tr);
11070
- for (const row4 of context2.rows) {
11071
- const node = tr.doc.nodeAt(row4.pos);
11072
- const properties = { ...row4.properties, ...rowPatch };
11075
+ for (const row3 of context2.rows) {
11076
+ const node = tr.doc.nodeAt(row3.pos);
11077
+ const properties = { ...row3.properties, ...rowPatch };
11073
11078
  for (const key2 of Object.keys(properties))
11074
11079
  if (properties[key2] === void 0) delete properties[key2];
11075
- tr.setNodeMarkup(row4.pos, void 0, {
11080
+ tr.setNodeMarkup(row3.pos, void 0, {
11076
11081
  ...node.attrs,
11077
11082
  properties,
11078
11083
  heightPx: properties.heightTwips ? properties.heightTwips / 15 : null
@@ -11232,7 +11237,7 @@ function createTablePropertiesDialog(viewOf) {
11232
11237
  element.replaceChildren(...content);
11233
11238
  localizeDialog(element, locale);
11234
11239
  const common = (read) => {
11235
- const values2 = context2.rows.map((row4) => read(row4.properties));
11240
+ const values2 = context2.rows.map((row3) => read(row3.properties));
11236
11241
  return values2.every((value) => value === values2[0]) ? values2[0] : null;
11237
11242
  };
11238
11243
  setTriState(
@@ -12340,13 +12345,13 @@ function syncFormatControls(toolbar, state) {
12340
12345
  });
12341
12346
  if (!found) addMarks(state.selection.$from.marks());
12342
12347
  }
12343
- const labels2 = {
12348
+ const labels3 = {
12344
12349
  bold: "Bold",
12345
12350
  italic: "Italic",
12346
12351
  underline: "Underline",
12347
12352
  strike: "Strikethrough"
12348
12353
  };
12349
- for (const [key2, label] of Object.entries(labels2)) {
12354
+ for (const [key2, label] of Object.entries(labels3)) {
12350
12355
  const values2 = marked.get(key2);
12351
12356
  findLocalizedControl(toolbar, label)?.setAttribute(
12352
12357
  "aria-pressed",
@@ -12968,7 +12973,7 @@ function paragraphStylesPlugin(getModel, getMode = () => "all") {
12968
12973
  state.doc.descendants((node) => {
12969
12974
  if (node.type.name === "paragraph") paragraphs.push(displayParagraph(node, mode).value);
12970
12975
  });
12971
- const labels2 = computeListLabels({ ...model, blocks: paragraphs });
12976
+ const labels3 = computeListLabels({ ...model, blocks: paragraphs });
12972
12977
  const decorations2 = [];
12973
12978
  state.doc.descendants((node, pos) => {
12974
12979
  if (node.type.name !== "paragraph") return;
@@ -12976,7 +12981,7 @@ function paragraphStylesPlugin(getModel, getMode = () => "all") {
12976
12981
  const paragraph2 = projected.value;
12977
12982
  const reset = mode === "original" && node.attrs.formatRevision && !projected.error ? `${ORIGINAL_PARAGRAPH_RESET};` : "";
12978
12983
  const effective = catalog ? resolveParagraphFormatting(paragraph2, catalog) : paragraph2;
12979
- const label = labels2.get(String(node.attrs.id));
12984
+ const label = labels3.get(String(node.attrs.id));
12980
12985
  const marker = listMarkerDisplay(
12981
12986
  node,
12982
12987
  { ...paragraph2, ...effective },
@@ -13019,8 +13024,8 @@ function context(view) {
13019
13024
  const table = $from.node(tableDepth);
13020
13025
  const width = table.childCount ? table.child(0).childCount : 0;
13021
13026
  if (!width || table.childCount < 1) return null;
13022
- for (let row4 = 0; row4 < table.childCount; row4++)
13023
- if (table.child(row4).childCount !== width) return null;
13027
+ for (let row3 = 0; row3 < table.childCount; row3++)
13028
+ if (table.child(row3).childCount !== width) return null;
13024
13029
  return {
13025
13030
  table,
13026
13031
  tablePos: $from.before(tableDepth),
@@ -13110,9 +13115,9 @@ function executeTableCommand(view, action) {
13110
13115
  view,
13111
13116
  ctx,
13112
13117
  rows.map(
13113
- (row4) => row4.copy(
13118
+ (row3) => row3.copy(
13114
13119
  Fragment.fromArray(
13115
- Array.from({ length: row4.childCount }, (_, index) => row4.child(index)).filter(
13120
+ Array.from({ length: row3.childCount }, (_, index) => row3.child(index)).filter(
13116
13121
  (_, index) => index !== ctx.columnIndex
13117
13122
  )
13118
13123
  )
@@ -13125,10 +13130,10 @@ function executeTableCommand(view, action) {
13125
13130
  replacedTable(
13126
13131
  view,
13127
13132
  ctx,
13128
- rows.map((row4) => {
13129
- const cells = Array.from({ length: row4.childCount }, (_, index) => row4.child(index));
13133
+ rows.map((row3) => {
13134
+ const cells = Array.from({ length: row3.childCount }, (_, index) => row3.child(index));
13130
13135
  cells.splice(at, 0, emptyCell(nextId));
13131
- return row4.copy(Fragment.fromArray(cells));
13136
+ return row3.copy(Fragment.fromArray(cells));
13132
13137
  })
13133
13138
  );
13134
13139
  return true;
@@ -13266,13 +13271,6 @@ function markerPositions(geometry) {
13266
13271
  right: geometry.pageWidth - geometry.marginRight - geometry.indentRight
13267
13272
  };
13268
13273
  }
13269
- function inchLabels(geometry) {
13270
- const labels2 = [];
13271
- const width = geometry.pageWidth - geometry.marginLeft - geometry.marginRight;
13272
- for (let inch = 1; inch * PX_PER_INCH < width; inch++)
13273
- labels2.push({ at: geometry.marginLeft + inch * PX_PER_INCH, text: String(inch) });
13274
- return labels2;
13275
- }
13276
13274
  function markerChange(marker, x, geometry) {
13277
13275
  const snap = (px2) => Math.round(px2 / SNAP_PX) * SNAP_PX;
13278
13276
  const inches3 = (px2) => Math.round(px2 / PX_PER_INCH * 1e3) / 1e3;
@@ -13299,87 +13297,52 @@ function markerChange(marker, x, geometry) {
13299
13297
  }
13300
13298
  var SNAP_PX = PX_PER_INCH / 16;
13301
13299
  var geometries = /* @__PURE__ */ new WeakMap();
13302
- function enableDragging(ruler, onChange) {
13303
- for (const name of ["first-line", "left", "right"]) {
13304
- const marker = ruler.querySelector(`.dve-ruler-marker-${name}`);
13305
- marker.addEventListener("pointerdown", (event) => {
13306
- const geometry = geometries.get(ruler);
13307
- if (!geometry || event.button !== 0) return;
13308
- event.preventDefault();
13309
- marker.setPointerCapture?.(event.pointerId);
13310
- const zoom = Number(ruler.style.getPropertyValue("--dve-zoom")) || 1;
13311
- const at = (e) => (e.clientX - ruler.getBoundingClientRect().left) / zoom;
13312
- const move = (e) => {
13313
- const preview = markerChange(name, at(e), geometry);
13314
- const shifted = { ...geometry };
13315
- if (preview.leftInches !== void 0) shifted.indentLeft = preview.leftInches * PX_PER_INCH;
13316
- if (preview.rightInches !== void 0)
13317
- shifted.indentRight = preview.rightInches * PX_PER_INCH;
13318
- if (preview.special)
13319
- shifted.firstLine = (preview.special === "hanging" ? -1 : 1) * (preview.specialInches ?? 0) * PX_PER_INCH;
13320
- paintMarkers(ruler, shifted);
13321
- };
13322
- const finish = (e) => {
13323
- marker.removeEventListener("pointermove", move);
13324
- marker.removeEventListener("pointerup", finish);
13325
- marker.removeEventListener("pointercancel", finish);
13326
- onChange(e.type === "pointerup" ? markerChange(name, at(e), geometry) : {});
13327
- };
13328
- marker.addEventListener("pointermove", move);
13329
- marker.addEventListener("pointerup", finish);
13330
- marker.addEventListener("pointercancel", finish);
13331
- });
13332
- }
13300
+ function previewGeometry(marker, x, geometry) {
13301
+ const preview = markerChange(marker, x, geometry);
13302
+ const shifted = { ...geometry };
13303
+ if (preview.leftInches !== void 0) shifted.indentLeft = preview.leftInches * PX_PER_INCH;
13304
+ if (preview.rightInches !== void 0) shifted.indentRight = preview.rightInches * PX_PER_INCH;
13305
+ if (preview.special)
13306
+ shifted.firstLine = (preview.special === "hanging" ? -1 : 1) * (preview.specialInches ?? 0) * PX_PER_INCH;
13307
+ return shifted;
13333
13308
  }
13334
13309
  function paintMarkers(ruler, geometry) {
13335
13310
  const positions = markerPositions(geometry);
13336
- const at = (name) => ruler.querySelector(`.dve-ruler-marker-${name}`);
13337
- at("first-line").style.left = `${positions.firstLine}px`;
13338
- at("left").style.left = `${positions.left}px`;
13339
- at("right").style.left = `${positions.right}px`;
13311
+ ruler.markers = [
13312
+ { name: "first-line", position: positions.firstLine, edge: "top" },
13313
+ { name: "left", position: positions.left },
13314
+ { name: "right", position: positions.right }
13315
+ ];
13340
13316
  }
13341
13317
  function createRuler(onChange) {
13342
- const ruler = document.createElement("div");
13318
+ defineRuler();
13319
+ const ruler = document.createElement("office-ui-ruler");
13343
13320
  ruler.className = "dve-ruler";
13344
- ruler.setAttribute("role", "img");
13345
- ruler.setAttribute("aria-label", "Ruler");
13346
- for (const name of ["margin-left", "margin-right", "labels"]) {
13347
- const part = document.createElement("div");
13348
- part.className = `dve-ruler-${name}`;
13349
- ruler.append(part);
13350
- }
13351
- for (const name of ["first-line", "left", "right"]) {
13352
- const marker = document.createElement("div");
13353
- marker.className = `dve-ruler-marker dve-ruler-marker-${name}`;
13354
- ruler.append(marker);
13355
- }
13356
- if (onChange) enableDragging(ruler, onChange);
13321
+ ruler.label = "Ruler";
13322
+ ruler.labelsWithinMargins = true;
13323
+ const detail2 = (event) => event.detail;
13324
+ const marker = (event) => detail2(event).name;
13325
+ ruler.addEventListener("ruler-marker-move", (event) => {
13326
+ const geometry = geometries.get(ruler);
13327
+ if (geometry)
13328
+ paintMarkers(ruler, previewGeometry(marker(event), detail2(event).position, geometry));
13329
+ });
13330
+ ruler.addEventListener("ruler-marker-commit", (event) => {
13331
+ const geometry = geometries.get(ruler);
13332
+ if (geometry) onChange?.(markerChange(marker(event), detail2(event).position, geometry));
13333
+ });
13334
+ ruler.addEventListener("ruler-marker-cancel", () => onChange?.({}));
13357
13335
  return ruler;
13358
13336
  }
13359
13337
  function updateRuler(ruler, geometry, zoom) {
13360
- const part = (name) => ruler.querySelector(`.dve-ruler-${name}`);
13361
- ruler.style.width = `${geometry.pageWidth}px`;
13362
- ruler.style.setProperty("--dve-zoom", String(zoom));
13363
- ruler.style.setProperty("--dve-ruler-origin", `${geometry.marginLeft}px`);
13364
- const left = part("margin-left");
13365
- left.style.width = `${geometry.marginLeft}px`;
13366
- const right = part("margin-right");
13367
- right.style.width = `${geometry.marginRight}px`;
13338
+ const element = ruler;
13368
13339
  geometries.set(ruler, geometry);
13369
- paintMarkers(ruler, geometry);
13370
- const labels2 = part("labels");
13371
- const wanted = inchLabels(geometry);
13372
- if (labels2.dataset.key !== JSON.stringify(wanted)) {
13373
- labels2.dataset.key = JSON.stringify(wanted);
13374
- labels2.replaceChildren(
13375
- ...wanted.map(({ at, text }) => {
13376
- const label = document.createElement("span");
13377
- label.textContent = text;
13378
- label.style.left = `${at}px`;
13379
- return label;
13380
- })
13381
- );
13382
- }
13340
+ element.extent = geometry.pageWidth;
13341
+ element.zoom = zoom;
13342
+ element.origin = geometry.marginLeft;
13343
+ element.marginStart = geometry.marginLeft;
13344
+ element.marginEnd = geometry.marginRight;
13345
+ paintMarkers(element, geometry);
13383
13346
  }
13384
13347
 
13385
13348
  // src/docx/ruler-sync.ts
@@ -13455,9 +13418,9 @@ function refreshEditorControls(toolbar, view, model, readOnly, collaboration, lo
13455
13418
  syncParagraphToggles(toolbar, view, model);
13456
13419
  syncContextualTabs(toolbar, state);
13457
13420
  syncRuler(toolbar, view, model);
13458
- const trackButton = toolbar.querySelector('[aria-label="Track changes"]');
13421
+ const trackButton = findLocalizedControl(toolbar, "Track changes");
13459
13422
  trackButton?.setAttribute("aria-pressed", String(Boolean(model.trackChanges)));
13460
- const commentsButton = toolbar.querySelector('[aria-label="Comments"]');
13423
+ const commentsButton = findLocalizedControl(toolbar, "Comments");
13461
13424
  commentsButton?.setAttribute("aria-pressed", String(commentsOpen));
13462
13425
  const changeAtCursor = hasChangeAtCursor(view);
13463
13426
  const anyChange = hasAnyChange(view);
@@ -13477,9 +13440,7 @@ function refreshEditorControls(toolbar, view, model, readOnly, collaboration, lo
13477
13440
  state.selection instanceof NodeSelection && state.selection.node.type.name === "image"
13478
13441
  ]
13479
13442
  ]) {
13480
- const control = toolbar.querySelector(
13481
- `[data-localearialabel="${label}"], [aria-label="${label}"]`
13482
- );
13443
+ const control = findLocalizedControl(toolbar, label);
13483
13444
  if (control) control.disabled = readOnly || !enabled;
13484
13445
  }
13485
13446
  }
@@ -14011,6 +13972,10 @@ function imageNodeView(cache, options = {}) {
14011
13972
  return (node, view, getPos) => {
14012
13973
  const diagram = parseDiagram(node.attrs.diagram);
14013
13974
  if (diagram) return smartArtNodeView(node, diagram, options.theme?.());
13975
+ if (node.attrs.chart) {
13976
+ const spec = chartNodeSpec(node, options.theme?.());
13977
+ return { dom: DOMSerializer.renderSpec(document, spec).dom, ignoreMutation: () => true };
13978
+ }
14014
13979
  const content = renderSpec(node);
14015
13980
  if (content.tagName !== "IMG") return { dom: content, ignoreMutation: () => true };
14016
13981
  const refresh = () => {
@@ -14350,7 +14315,7 @@ function refreshPreviewScaleWithFonts(element, text, formatting, family) {
14350
14315
  // src/docx/preview-run-styles.ts
14351
14316
  function stylePreviewRuns(element, block, model, serializer, mode = "all") {
14352
14317
  const measurer = scaleMeasurer();
14353
- const paragraphs = block.type === "paragraph" ? [block] : block.rows.flatMap((row4) => row4.flatMap((cell) => cell.paragraphs));
14318
+ const paragraphs = block.type === "paragraph" ? [block] : block.rows.flatMap((row3) => row3.flatMap((cell) => cell.paragraphs));
14354
14319
  const elements = block.type === "paragraph" ? [element] : [...element.querySelectorAll("p")];
14355
14320
  paragraphs.forEach((current2, index) => {
14356
14321
  const target = elements[index];
@@ -14427,10 +14392,10 @@ function blockNode(block) {
14427
14392
  return schema.node("paragraph", paragraphAttrs(block), children);
14428
14393
  }
14429
14394
  const rows = block.rows.map(
14430
- (row4) => schema.node(
14395
+ (row3) => schema.node(
14431
14396
  "tableRow",
14432
14397
  null,
14433
- row4.map(
14398
+ row3.map(
14434
14399
  (cell) => schema.node(
14435
14400
  "tableCell",
14436
14401
  null,
@@ -16070,8 +16035,8 @@ var InsertController = class {
16070
16035
  if (action.key === "figures")
16071
16036
  insertTableOfContents(view, this.host.model(), void 0, 3, action.label ?? "Figure");
16072
16037
  else if (action.key === "updateFigures") {
16073
- const labels2 = action.label ? [action.label] : ["Figure", "Table", "Equation"];
16074
- const updated = labels2.filter(
16038
+ const labels3 = action.label ? [action.label] : ["Figure", "Table", "Equation"];
16039
+ const updated = labels3.filter(
16075
16040
  (label) => updateTableOfContents(view, this.host.model(), void 0, label)
16076
16041
  );
16077
16042
  if (!updated.length)
@@ -16451,6 +16416,7 @@ var EditorCore = class {
16451
16416
  );
16452
16417
  const { searchPanel, printLayout, review, chrome, toolbar } = this.shell;
16453
16418
  searchPanel?.refresh();
16419
+ if (review?.commentsOpen) review.commentsPanel.refresh();
16454
16420
  if (this.pages.viewMode === "print") printLayout?.refreshCurrentPage();
16455
16421
  const status = refreshEditorControls(
16456
16422
  toolbar,
@@ -16509,7 +16475,7 @@ var ribbon_polish_default = "/* Ribbon polish: distinct pressed state and Word's
16509
16475
  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";
16510
16476
 
16511
16477
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/print.css?raw
16512
- 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";
16478
+ 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";
16513
16479
 
16514
16480
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/chrome-titlebar.css?raw
16515
16481
  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";
@@ -16521,7 +16487,7 @@ var backstage_default = "/* Backstage: the shared office-ui-backstage draws the
16521
16487
  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";
16522
16488
 
16523
16489
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/chrome-document.css?raw
16524
- 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";
16490
+ 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";
16525
16491
 
16526
16492
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/page-navigator.css?raw
16527
16493
  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";
@@ -16896,10 +16862,10 @@ function createSearchPanel(options, initialLocale = "en") {
16896
16862
 
16897
16863
  // src/docx/print-table.ts
16898
16864
  var cssBorder = (border) => border ? `${border.widthPx}px ${border.style} ${border.color}` : "";
16899
- function geometryOf(row4, index, widthPx) {
16900
- const given = row4.geometry?.[index];
16865
+ function geometryOf(row3, index, widthPx) {
16866
+ const given = row3.geometry?.[index];
16901
16867
  if (given) return given;
16902
- const share = widthPx / Math.max(1, row4.cells.length);
16868
+ const share = widthPx / Math.max(1, row3.cells.length);
16903
16869
  return {
16904
16870
  xPx: share * index,
16905
16871
  widthPx: share,
@@ -16914,31 +16880,31 @@ function renderTable(box2, columnWidthPx, renderParagraph) {
16914
16880
  table.style.top = `${box2.yPx}px`;
16915
16881
  table.style.height = `${box2.heightPx}px`;
16916
16882
  if (box2.xPx) table.style.left = `${box2.xPx}px`;
16917
- box2.rows.forEach((row4, rowIndex) => {
16883
+ box2.rows.forEach((row3, rowIndex) => {
16918
16884
  const rowEl = document.createElement("div");
16919
16885
  rowEl.className = "dve-print-row";
16920
- rowEl.style.top = `${row4.yPx}px`;
16921
- rowEl.style.height = `${row4.heightPx}px`;
16922
- if (row4.repeated) rowEl.dataset.repeated = "true";
16886
+ rowEl.style.top = `${row3.yPx}px`;
16887
+ rowEl.style.height = `${row3.heightPx}px`;
16888
+ if (row3.repeated) rowEl.dataset.repeated = "true";
16923
16889
  const lastRow = rowIndex === box2.rows.length - 1;
16924
- row4.cells.forEach((paragraphs, cellIndex) => {
16925
- const geometry = geometryOf(row4, cellIndex, columnWidthPx);
16890
+ row3.cells.forEach((paragraphs, cellIndex) => {
16891
+ const geometry = geometryOf(row3, cellIndex, columnWidthPx);
16926
16892
  const cell = document.createElement("div");
16927
16893
  cell.className = "dve-print-cell";
16928
16894
  Object.assign(cell.style, {
16929
16895
  left: `${geometry.xPx}px`,
16930
16896
  width: `${geometry.widthPx}px`,
16931
- height: `${row4.heightPx}px`
16897
+ height: `${row3.heightPx}px`
16932
16898
  });
16933
16899
  if (geometry.shading) cell.style.background = geometry.shading;
16934
16900
  const borders = geometry.borders;
16935
16901
  cell.style.borderTop = cssBorder(borders?.top);
16936
16902
  cell.style.borderLeft = cssBorder(borders?.left);
16937
- if (cellIndex === row4.cells.length - 1) cell.style.borderRight = cssBorder(borders?.right);
16903
+ if (cellIndex === row3.cells.length - 1) cell.style.borderRight = cssBorder(borders?.right);
16938
16904
  if (lastRow) cell.style.borderBottom = cssBorder(borders?.bottom);
16939
16905
  const content = document.createElement("div");
16940
16906
  content.className = "dve-print-cell-content";
16941
- const free = Math.max(0, row4.heightPx - geometry.contentHeightPx);
16907
+ const free = Math.max(0, row3.heightPx - geometry.contentHeightPx);
16942
16908
  const offset = geometry.verticalAlign === "center" ? free / 2 : geometry.verticalAlign === "bottom" ? free : 0;
16943
16909
  Object.assign(content.style, {
16944
16910
  left: `${geometry.paddingLeftPx}px`,
@@ -16960,7 +16926,7 @@ function lineNumberLabels(page2, settings, counter3, suppressed) {
16960
16926
  if (counter3.section === -1 || settings.restart === "newPage" || newSection && settings.restart === "newSection")
16961
16927
  counter3.next = settings.start;
16962
16928
  counter3.section = page2.sectionIndex;
16963
- const labels2 = [];
16929
+ const labels3 = [];
16964
16930
  const gap = (settings.distanceTwips ?? 360) / 15;
16965
16931
  for (const column of page2.columns)
16966
16932
  for (const block of column.blocks) {
@@ -16977,10 +16943,10 @@ function lineNumberLabels(page2, settings, counter3, suppressed) {
16977
16943
  height: `${line.heightPx}px`,
16978
16944
  lineHeight: `${line.heightPx}px`
16979
16945
  });
16980
- labels2.push(label);
16946
+ labels3.push(label);
16981
16947
  }
16982
16948
  }
16983
- return labels2;
16949
+ return labels3;
16984
16950
  }
16985
16951
  var POINT = 4 / 3;
16986
16952
  function pageBorderBox(page2, borders) {
@@ -17074,8 +17040,30 @@ function resolveFragmentClick(fragments, clientX) {
17074
17040
  return start + Math.round((end - start) * ratio);
17075
17041
  }
17076
17042
 
17077
- // src/docx/print-layout.ts
17043
+ // src/docx/print-picture.ts
17044
+ function chartElement(chart) {
17045
+ const element = document.createElement("div");
17046
+ element.dataset.docxChart = chart.svg ? "1" : "frame";
17047
+ const svg = chart.svg ? new DOMParser().parseFromString(chart.svg, "image/svg+xml").documentElement : void 0;
17048
+ if (svg && svg.localName === "svg") {
17049
+ element.classList.add("dve-print-chart");
17050
+ element.title = chart.label;
17051
+ element.append(document.importNode(svg, true));
17052
+ } else {
17053
+ element.classList.add("dve-print-picture-missing", "dve-print-chart-frame");
17054
+ element.textContent = chart.label;
17055
+ }
17056
+ return element;
17057
+ }
17078
17058
  function pictureElement(object, pictureUrl) {
17059
+ if (object.chart) {
17060
+ const element2 = chartElement(object.chart);
17061
+ element2.classList.add("dve-print-picture");
17062
+ element2.style.position = "absolute";
17063
+ element2.style.width = `${object.widthPx}px`;
17064
+ element2.style.height = `${object.heightPx}px`;
17065
+ return element2;
17066
+ }
17079
17067
  const url = object.partName ? pictureUrl?.(object.partName, object.contentType) : void 0;
17080
17068
  const element = document.createElement(url ? "img" : "div");
17081
17069
  if (url) {
@@ -17088,6 +17076,8 @@ function pictureElement(object, pictureUrl) {
17088
17076
  element.style.height = `${object.heightPx}px`;
17089
17077
  return element;
17090
17078
  }
17079
+
17080
+ // src/docx/print-layout.ts
17091
17081
  var LEADER_CHARACTERS = { dot: ".", hyphen: "-", middleDot: "\xB7" };
17092
17082
  function leaderElement(fragment) {
17093
17083
  const el = document.createElement("span");
@@ -17471,107 +17461,70 @@ function moveCursorToBlock(view, blockId, offset) {
17471
17461
  }
17472
17462
 
17473
17463
  // src/docx/comments-panel.ts
17474
- var styleText2 = `
17475
- .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}
17476
- .dve-comments-panel[hidden]{display:none}
17477
- .dve-comments-panel h2{margin:0;font-size:13px}
17478
- .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)}
17479
- .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}
17480
- .dve-comment-new button:disabled,.dve-comment-actions button:disabled{opacity:.5;cursor:default}
17481
- .dve-comment-thread{border:1px solid var(--line,#ddd);border-radius:4px;padding:7px 8px;display:flex;flex-direction:column;gap:4px}
17482
- .dve-comment-thread[data-resolved="true"]{opacity:.65}
17483
- .dve-comment-meta{display:flex;justify-content:space-between;gap:6px;color:var(--muted,#666);font-size:11px}
17484
- .dve-comment-text{white-space:pre-wrap}
17485
- .dve-comment-actions{display:flex;gap:5px;flex-wrap:wrap}
17486
- .dve-comment-reply{margin-left:12px;display:flex;flex-direction:column;gap:4px}
17487
- .dve-comment-empty{color:var(--muted,#666)}
17488
- `;
17489
- function row3(comment, indent, locale, options) {
17490
- const thread = document.createElement("div");
17491
- thread.className = "dve-comment-thread";
17492
- if (indent) thread.style.marginLeft = "14px";
17493
- thread.dataset.resolved = String(Boolean(comment.resolved));
17494
- const meta = document.createElement("div");
17495
- meta.className = "dve-comment-meta";
17496
- meta.append(
17497
- Object.assign(document.createElement("span"), { textContent: comment.author }),
17498
- Object.assign(document.createElement("span"), { textContent: comment.date ?? "" })
17499
- );
17500
- const text = document.createElement("p");
17501
- text.className = "dve-comment-text";
17502
- text.textContent = comment.text;
17503
- const actions = document.createElement("div");
17504
- const canEdit = options.canEdit?.() ?? true;
17505
- actions.className = "dve-comment-actions";
17506
- if (!comment.parentId) {
17507
- const resolve = document.createElement("button");
17508
- resolve.type = "button";
17509
- resolve.disabled = !canEdit;
17510
- resolve.textContent = translate(locale, comment.resolved ? "Reopen" : "Resolve");
17511
- resolve.addEventListener("click", () => options.onResolve(comment.id, !comment.resolved));
17512
- actions.append(resolve);
17513
- }
17514
- const del = document.createElement("button");
17515
- del.type = "button";
17516
- del.disabled = !canEdit;
17517
- del.textContent = translate(locale, "Delete");
17518
- del.addEventListener("click", () => options.onDelete(comment.id));
17519
- actions.append(del);
17520
- thread.append(meta, text, actions);
17521
- if (!comment.parentId) {
17522
- const replyForm = document.createElement("div");
17523
- replyForm.className = "dve-comment-reply";
17524
- const input = document.createElement("textarea");
17525
- input.disabled = !canEdit;
17526
- input.setAttribute("aria-label", translate(locale, "Reply"));
17527
- input.placeholder = translate(locale, "Reply");
17528
- const send = document.createElement("button");
17529
- send.type = "button";
17530
- send.disabled = !canEdit;
17531
- send.textContent = translate(locale, "Reply");
17532
- send.addEventListener("click", () => {
17533
- if (!input.value.trim()) return;
17534
- options.onReply(comment.id, input.value.trim());
17535
- input.value = "";
17536
- });
17537
- replyForm.append(input, send);
17538
- thread.append(replyForm);
17539
- }
17540
- return thread;
17464
+ function wordCommentThreads(comments) {
17465
+ const entry = (comment) => ({
17466
+ id: comment.id,
17467
+ author: comment.author,
17468
+ text: comment.text,
17469
+ ...comment.initials ? { initials: comment.initials } : {},
17470
+ ...comment.date ? { created: comment.date } : {}
17471
+ });
17472
+ return comments.filter((comment) => !comment.parentId).map((comment) => ({
17473
+ id: comment.id,
17474
+ resolved: Boolean(comment.resolved),
17475
+ comments: [
17476
+ entry(comment),
17477
+ ...comments.filter((reply) => reply.parentId === comment.id).map(entry)
17478
+ ]
17479
+ }));
17541
17480
  }
17481
+ function labels2(locale) {
17482
+ const t = (key2) => translate(locale, key2);
17483
+ return {
17484
+ heading: t("Comments"),
17485
+ list: t("Comments"),
17486
+ close: t("Close comments"),
17487
+ newComment: t("New comment"),
17488
+ add: t("Add comment"),
17489
+ reply: t("Reply"),
17490
+ resolve: t("Resolve"),
17491
+ reopen: t("Reopen"),
17492
+ resolved: t("Resolved"),
17493
+ delete: t("Delete"),
17494
+ empty: t("No comments")
17495
+ };
17496
+ }
17497
+ var detail = (event) => event.detail;
17542
17498
  function createCommentsPanel(options) {
17543
17499
  let locale = "en";
17544
- const panel = document.createElement("aside");
17500
+ defineCommentsPane();
17501
+ const panel = document.createElement("office-ui-comments-pane");
17545
17502
  panel.className = "dve-comments-panel";
17546
17503
  panel.setAttribute("role", "complementary");
17547
17504
  panel.setAttribute("aria-label", translate(locale, "Comments"));
17548
17505
  panel.hidden = true;
17549
- const style = document.createElement("style");
17550
- style.textContent = styleText2;
17551
- const heading2 = document.createElement("h2");
17552
- heading2.textContent = translate(locale, "Comments");
17553
- const closeButton = document.createElement("button");
17554
- closeButton.type = "button";
17555
- closeButton.textContent = translate(locale, "Close comments");
17556
- closeButton.setAttribute("aria-label", translate(locale, "Close comments"));
17557
- closeButton.addEventListener("click", () => close3());
17558
- const newForm = document.createElement("div");
17559
- newForm.className = "dve-comment-new";
17560
- const newInput = document.createElement("textarea");
17561
- newInput.setAttribute("aria-label", translate(locale, "New comment"));
17562
- newInput.placeholder = translate(locale, "New comment");
17563
- const addButton = document.createElement("button");
17564
- addButton.type = "button";
17565
- addButton.textContent = translate(locale, "Add comment");
17566
- addButton.addEventListener("click", () => {
17567
- if (!newInput.value.trim()) return;
17568
- options.onAdd(newInput.value.trim());
17569
- newInput.value = "";
17506
+ panel.closable = true;
17507
+ panel.classNames = { thread: "dve-comment-card", comment: "dve-comment-thread" };
17508
+ panel.labels = labels2(locale);
17509
+ panel.addEventListener("comment-add", (event) => {
17510
+ options.onAdd(detail(event).text);
17570
17511
  refresh();
17571
17512
  });
17572
- newForm.append(newInput, addButton);
17573
- const list = document.createElement("div");
17574
- panel.append(style, heading2, closeButton, newForm, list);
17513
+ panel.addEventListener(
17514
+ "comment-reply",
17515
+ (event) => options.onReply(detail(event).threadId, detail(event).text)
17516
+ );
17517
+ panel.addEventListener(
17518
+ "thread-resolve",
17519
+ (event) => options.onResolve(detail(event).threadId, true)
17520
+ );
17521
+ panel.addEventListener(
17522
+ "thread-reopen",
17523
+ (event) => options.onResolve(detail(event).threadId, false)
17524
+ );
17525
+ panel.addEventListener("comment-delete", (event) => options.onDelete(detail(event).commentId));
17526
+ panel.addEventListener("thread-select", (event) => options.onSelect?.(detail(event).threadId));
17527
+ panel.addEventListener("comments-close", () => close3());
17575
17528
  let isOpen = false;
17576
17529
  function close3() {
17577
17530
  isOpen = false;
@@ -17579,24 +17532,11 @@ function createCommentsPanel(options) {
17579
17532
  options.onClose?.();
17580
17533
  }
17581
17534
  function refresh() {
17582
- addButton.disabled = !options.canAdd();
17583
- const comments = options.getModel().comments ?? [];
17584
- list.replaceChildren();
17585
- const top = comments.filter((comment) => !comment.parentId);
17586
- if (!top.length) {
17587
- const empty = document.createElement("p");
17588
- empty.className = "dve-comment-empty";
17589
- empty.textContent = translate(locale, "No comments");
17590
- list.append(empty);
17591
- return;
17592
- }
17593
- for (const comment of top) {
17594
- list.append(row3(comment, false, locale, options));
17595
- for (const reply of comments.filter((item) => item.parentId === comment.id))
17596
- list.append(row3(reply, true, locale, options));
17597
- }
17535
+ panel.readOnly = !(options.canEdit?.() ?? true);
17536
+ panel.addDisabled = !options.canAdd();
17537
+ panel.activeThreadId = options.activeId?.() ?? null;
17538
+ panel.threads = wordCommentThreads(options.getModel().comments ?? []);
17598
17539
  }
17599
- localizeElement(panel, locale);
17600
17540
  refresh();
17601
17541
  return {
17602
17542
  element: panel,
@@ -17612,13 +17552,9 @@ function createCommentsPanel(options) {
17612
17552
  refresh,
17613
17553
  setLocale(value) {
17614
17554
  locale = normalizeEditorLocale(value);
17615
- heading2.textContent = translate(locale, "Comments");
17616
17555
  panel.setAttribute("aria-label", translate(locale, "Comments"));
17617
- closeButton.textContent = translate(locale, "Close comments");
17618
- closeButton.setAttribute("aria-label", translate(locale, "Close comments"));
17619
- newInput.setAttribute("aria-label", translate(locale, "New comment"));
17620
- newInput.placeholder = translate(locale, "New comment");
17621
- addButton.textContent = translate(locale, "Add comment");
17556
+ panel.labels = labels2(locale);
17557
+ panel.locale = locale;
17622
17558
  refresh();
17623
17559
  }
17624
17560
  };
@@ -17635,6 +17571,11 @@ var ReviewController = class {
17635
17571
  const view = host.getView();
17636
17572
  return Boolean(host.canEditComments() && view && !view.state.selection.empty);
17637
17573
  },
17574
+ activeId: () => {
17575
+ const view = host.getView();
17576
+ return view ? commentIdsAtSelection(view)[0] : void 0;
17577
+ },
17578
+ onSelect: (id) => this.goToAnchor(id),
17638
17579
  onAdd: (text) => this.addComment(text),
17639
17580
  onReply: (parentId, text) => {
17640
17581
  if (!host.canEditComments()) return;
@@ -17674,6 +17615,15 @@ var ReviewController = class {
17674
17615
  setLocale(locale) {
17675
17616
  this.commentsPanel.setLocale(locale);
17676
17617
  }
17618
+ /** Moves the caret to the start of a thread's anchored text (the pane keeps focus). */
17619
+ goToAnchor(id) {
17620
+ const view = this.host.getView();
17621
+ const anchor = view && commentAnchors(view).find((item) => item.id === id);
17622
+ if (!view || !anchor) return;
17623
+ view.dispatch(
17624
+ view.state.tr.setSelection(TextSelection.create(view.state.doc, anchor.from)).scrollIntoView()
17625
+ );
17626
+ }
17677
17627
  /** Removes a comment, its replies and its anchored range in one go. */
17678
17628
  deleteById(id) {
17679
17629
  if (!this.host.canEditComments()) return;
@@ -17879,9 +17829,9 @@ function renderOptions({ handlers, t, content }) {
17879
17829
  input.type = "checkbox";
17880
17830
  input.checked = current2[key2];
17881
17831
  input.addEventListener("change", () => handlers.setOption(key2, String(input.checked)));
17882
- const row4 = field2(label, input);
17883
- row4.classList.add("dve-backstage-toggle");
17884
- controls.push(row4);
17832
+ const row3 = field2(label, input);
17833
+ row3.classList.add("dve-backstage-toggle");
17834
+ controls.push(row3);
17885
17835
  }
17886
17836
  const note = document.createElement("p");
17887
17837
  note.className = "dve-backstage-muted";
@@ -17940,9 +17890,9 @@ var facts = (rows, t) => {
17940
17890
  for (const [label, value] of rows) {
17941
17891
  const term = document.createElement("dt");
17942
17892
  term.textContent = t(label);
17943
- const detail = document.createElement("dd");
17944
- detail.textContent = value;
17945
- list.append(term, detail);
17893
+ const detail2 = document.createElement("dd");
17894
+ detail2.textContent = value;
17895
+ list.append(term, detail2);
17946
17896
  }
17947
17897
  return list;
17948
17898
  };
@@ -18154,16 +18104,16 @@ function renderCustomize({ handlers, t, content }) {
18154
18104
  const id = ribbonControlId(control);
18155
18105
  if (!id || seen.has(id)) continue;
18156
18106
  seen.add(id);
18157
- const row4 = document.createElement("label");
18158
- row4.className = "dve-customize-row";
18107
+ const row3 = document.createElement("label");
18108
+ row3.className = "dve-customize-row";
18159
18109
  const input = document.createElement("input");
18160
18110
  input.type = "checkbox";
18161
18111
  input.checked = !hidden.has(id);
18162
18112
  input.addEventListener("change", commit);
18163
18113
  const text = document.createElement("span");
18164
18114
  text.textContent = control.getAttribute("aria-label") ?? id;
18165
- row4.append(input, text);
18166
- list.append(row4);
18115
+ row3.append(input, text);
18116
+ list.append(row3);
18167
18117
  boxes.push({ id, input });
18168
18118
  }
18169
18119
  if (list.children.length > 1) tabSection.append(list);
@@ -18837,25 +18787,25 @@ function openTablePicker(anchor, onPick, onClose) {
18837
18787
  const paint = () => {
18838
18788
  caption.textContent = translateTemplate(locale, "table.size", { columns, rows });
18839
18789
  cells.forEach((cell, index) => {
18840
- const row4 = Math.floor(index / PICKER_COLUMNS);
18790
+ const row3 = Math.floor(index / PICKER_COLUMNS);
18841
18791
  const column = index % PICKER_COLUMNS;
18842
- cell.classList.toggle("active", row4 < rows && column < columns);
18792
+ cell.classList.toggle("active", row3 < rows && column < columns);
18843
18793
  });
18844
18794
  };
18845
- for (let row4 = 0; row4 < PICKER_ROWS; row4++)
18795
+ for (let row3 = 0; row3 < PICKER_ROWS; row3++)
18846
18796
  for (let column = 0; column < PICKER_COLUMNS; column++) {
18847
18797
  const cell = document.createElement("div");
18848
18798
  cell.setAttribute("role", "gridcell");
18849
- cell.dataset.rows = String(row4 + 1);
18799
+ cell.dataset.rows = String(row3 + 1);
18850
18800
  cell.dataset.columns = String(column + 1);
18851
18801
  cell.addEventListener("mouseenter", () => {
18852
- rows = row4 + 1;
18802
+ rows = row3 + 1;
18853
18803
  columns = column + 1;
18854
18804
  paint();
18855
18805
  });
18856
18806
  cell.addEventListener("mousedown", (event) => event.preventDefault());
18857
18807
  cell.addEventListener("click", () => {
18858
- onPick(row4 + 1, column + 1);
18808
+ onPick(row3 + 1, column + 1);
18859
18809
  onClose();
18860
18810
  });
18861
18811
  cells.push(cell);
@@ -19418,9 +19368,9 @@ var PageNavigator = class {
19418
19368
  }
19419
19369
  const version = this.host.version();
19420
19370
  if (version !== this.built || this.thumbs.length !== status.total) this.rebuild(version);
19421
- const labels2 = `${locale}:${status.total}`;
19422
- if (labels2 !== this.labels) this.relabelThumbs(locale, status.total);
19423
- this.labels = labels2;
19371
+ const labels3 = `${locale}:${status.total}`;
19372
+ if (labels3 !== this.labels) this.relabelThumbs(locale, status.total);
19373
+ this.labels = labels3;
19424
19374
  this.mark(status.current);
19425
19375
  }
19426
19376
  relabelChrome(locale, active, ready) {
@@ -19890,7 +19840,7 @@ function createContextMenu(host) {
19890
19840
  element.state = {
19891
19841
  ...state,
19892
19842
  items: state.items.map(
19893
- (row4) => row4.id === "paste" ? { ...row4, disabled: true, title: denied } : row4
19843
+ (row3) => row3.id === "paste" ? { ...row3, disabled: true, title: denied } : row3
19894
19844
  )
19895
19845
  };
19896
19846
  });
@@ -19936,7 +19886,7 @@ function shortcutRows(registry, mac) {
19936
19886
  label: shortcut.label,
19937
19887
  keys: registry.keysFor(shortcut.id, mac).join(" / ")
19938
19888
  }));
19939
- return [...general, ...editorShortcutRows(mac)].filter((row4) => row4.keys);
19889
+ return [...general, ...editorShortcutRows(mac)].filter((row3) => row3.keys);
19940
19890
  }
19941
19891
  function createShortcutHelp(onClose) {
19942
19892
  const element = createDialogShell("", "dve-shortcut-help");
@@ -19976,11 +19926,11 @@ function createShortcutHelp(onClose) {
19976
19926
  head.append(cell);
19977
19927
  }
19978
19928
  const body = table.createTBody();
19979
- for (const row4 of rows) {
19929
+ for (const row3 of rows) {
19980
19930
  const tr = body.insertRow();
19981
- tr.insertCell().textContent = translate(locale, row4.label);
19931
+ tr.insertCell().textContent = translate(locale, row3.label);
19982
19932
  const kbd = document.createElement("kbd");
19983
- kbd.textContent = row4.keys;
19933
+ kbd.textContent = row3.keys;
19984
19934
  tr.insertCell().append(kbd);
19985
19935
  }
19986
19936
  setDialogOpen(element, true);