ooxml-ui 1.7.0 → 1.8.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 (143) hide show
  1. package/README.md +89 -36
  2. package/custom-elements.json +251 -4
  3. package/dist/chrome/ruler.d.ts +7 -1
  4. package/dist/chrome/ruler.d.ts.map +1 -1
  5. package/dist/chrome/task-pane.d.ts +2 -0
  6. package/dist/chrome/task-pane.d.ts.map +1 -1
  7. package/dist/chrome/title-bar.d.ts +2 -1
  8. package/dist/chrome/title-bar.d.ts.map +1 -1
  9. package/dist/{chunk-6UPGM3X2.js → chunk-7US5GCXF.js} +158 -153
  10. package/dist/{chunk-VAR6O7II.js → chunk-KF72ZA6V.js} +4 -2
  11. package/dist/{chunk-SCWCZSTE.js → chunk-O7APCA5N.js} +612 -69
  12. package/dist/chunk-W6AV3GHC.js +112 -0
  13. package/dist/controls.d.ts +8 -2
  14. package/dist/controls.d.ts.map +1 -1
  15. package/dist/controls.js +1 -1
  16. package/dist/dialog/dialog-footer.d.ts.map +1 -1
  17. package/dist/dialog/options-dialog.d.ts.map +1 -1
  18. package/dist/docx/editor-core.d.ts +3 -0
  19. package/dist/docx/editor-shell.d.ts +2 -0
  20. package/dist/docx/element-api.d.ts +7 -0
  21. package/dist/docx/events.d.ts +4 -1
  22. package/dist/docx/index.d.ts +1 -0
  23. package/dist/docx/ribbon-color-grid.d.ts +3 -4
  24. package/dist/docx.js +46 -78
  25. package/dist/edit-worker.js +52 -3
  26. package/dist/form/color-custom.d.ts +79 -0
  27. package/dist/form/color-custom.d.ts.map +1 -0
  28. package/dist/form/color-grid.d.ts +125 -0
  29. package/dist/form/color-grid.d.ts.map +1 -0
  30. package/dist/index.d.ts +2 -1
  31. package/dist/index.js +4 -3
  32. package/dist/menu/context-menu.d.ts.map +1 -1
  33. package/dist/menu/menu-button.d.ts +2 -1
  34. package/dist/menu/menu-button.d.ts.map +1 -1
  35. package/dist/notices/paste-options.d.ts.map +1 -1
  36. package/dist/notices/toasts.d.ts.map +1 -1
  37. package/dist/pptx/{chart-3d-view-scene-ERX2GRCD.mjs → chart-3d-view-scene-P6MAFEGL.mjs} +2 -2
  38. package/dist/pptx/{chart-3d-view-scene-55WDENSO.cjs → chart-3d-view-scene-V74F7ZOC.cjs} +38 -38
  39. package/dist/pptx/{chunk-G2YUKLRX.cjs → chunk-526IHNIH.cjs} +1 -1
  40. package/dist/pptx/{chunk-SVN6OBG4.mjs → chunk-DPOES4WM.mjs} +26 -11
  41. package/dist/pptx/{chunk-XGPLA2OY.cjs → chunk-GCS5KBMR.cjs} +481 -605
  42. package/dist/pptx/{chunk-RPRC2EG5.cjs → chunk-K3S2A64B.cjs} +13 -13
  43. package/dist/pptx/{chunk-RCTRRS6E.mjs → chunk-MCHPNO42.mjs} +264 -447
  44. package/dist/pptx/{chunk-AWQRQUPL.mjs → chunk-NAFUYAQP.mjs} +1 -1
  45. package/dist/pptx/{chunk-LCIXR7WE.cjs → chunk-VFPVEVF4.cjs} +26 -11
  46. package/dist/pptx/{chunk-TKATCPOK.mjs → chunk-ZAOYPCAM.mjs} +1 -1
  47. package/dist/pptx/dom/activex-controls-overlay.d.ts.map +1 -1
  48. package/dist/pptx/dom/elements/image.d.ts.map +1 -1
  49. package/dist/pptx/dom/elements/media.d.ts.map +1 -1
  50. package/dist/pptx/dom/elements/text-block.d.ts.map +1 -1
  51. package/dist/pptx/dom/elements/zoom.d.ts.map +1 -1
  52. package/dist/pptx/dom/index.cjs +252 -247
  53. package/dist/pptx/dom/index.mjs +11 -6
  54. package/dist/pptx/export/html2canvas-clone.cjs +2 -2
  55. package/dist/pptx/export/html2canvas-clone.mjs +1 -1
  56. package/dist/pptx/index.cjs +3059 -3023
  57. package/dist/pptx/index.mjs +4 -4
  58. package/dist/pptx/render/chart-combo-series.d.ts.map +1 -1
  59. package/dist/pptx/render/chart-combo-stock.cjs +3 -3
  60. package/dist/pptx/render/chart-combo-stock.mjs +1 -1
  61. package/dist/pptx/render/chart-marker-shape.d.ts.map +1 -1
  62. package/dist/pptx/render/chart-overlays.cjs +7 -7
  63. package/dist/pptx/render/chart-overlays.mjs +1 -1
  64. package/dist/pptx/render/chart-surface-treemap.cjs +4 -4
  65. package/dist/pptx/render/chart-surface-treemap.mjs +1 -1
  66. package/dist/pptx/render/chart-view-model.cjs +44 -44
  67. package/dist/pptx/render/chart-view-model.mjs +1 -1
  68. package/dist/pptx/render/chart-waterfall-map.cjs +6 -6
  69. package/dist/pptx/render/chart-waterfall-map.mjs +1 -1
  70. package/dist/pptx/render/connector-router-types.d.ts +4 -52
  71. package/dist/pptx/render/connector-router-types.d.ts.map +1 -1
  72. package/dist/pptx/render/connector-router.d.ts +4 -32
  73. package/dist/pptx/render/connector-router.d.ts.map +1 -1
  74. package/dist/pptx/render/index.d.ts +1 -0
  75. package/dist/pptx/render/index.d.ts.map +1 -1
  76. package/dist/pptx/render/ribbon-add-ins.d.ts +53 -0
  77. package/dist/pptx/render/ribbon-add-ins.d.ts.map +1 -0
  78. package/dist/pptx/web-components/index.d.ts +1 -0
  79. package/dist/pptx/web-components/index.d.ts.map +1 -1
  80. package/dist/pptx/web-components/ribbon-add-in.d.ts +20 -0
  81. package/dist/pptx/web-components/ribbon-add-in.d.ts.map +1 -0
  82. package/dist/ribbon/add-in-tabs.d.ts +36 -0
  83. package/dist/ribbon/group-overflow.d.ts +37 -0
  84. package/dist/ribbon/group-overflow.d.ts.map +1 -0
  85. package/dist/ribbon/ribbon-tabs.d.ts.map +1 -1
  86. package/dist/teams/app/index.d.ts +1 -1
  87. package/dist/teams.js +2 -2
  88. package/dist/visio/format-pane-fields.d.ts +42 -0
  89. package/dist/visio/format-pane-view.d.ts +44 -0
  90. package/dist/visio/index.d.ts +1 -0
  91. package/dist/visio/page-setup-action.d.ts +4 -0
  92. package/dist/visio/ribbon-action.d.ts +17 -6
  93. package/dist/visio/ribbon-change-shape.d.ts +17 -6
  94. package/dist/visio/ribbon-color-menu.d.ts +29 -0
  95. package/dist/visio/ribbon-inline-galleries.d.ts +20 -0
  96. package/dist/visio/ribbon-overflow.d.ts +7 -0
  97. package/dist/visio/ribbon-review.d.ts +5 -2
  98. package/dist/visio/ribbon-router.d.ts +3 -3
  99. package/dist/visio/ribbon-shape-styles.d.ts +4 -1
  100. package/dist/visio/ribbon-style-options.d.ts +4 -3
  101. package/dist/visio/shapes-document.d.ts +29 -0
  102. package/dist/visio/shapes-sections.d.ts +19 -5
  103. package/dist/visio/shapes-storage.d.ts +15 -0
  104. package/dist/visio/shapes-window.d.ts +7 -0
  105. package/dist/visio/stencil-catalog.d.ts +4 -0
  106. package/dist/visio/text-measurer.d.ts +25 -0
  107. package/dist/visio/viewer-auto-connect-parts.d.ts +12 -0
  108. package/dist/visio/viewer-auto-connect.d.ts +33 -0
  109. package/dist/visio/viewer-change-shape.d.ts +8 -4
  110. package/dist/visio/viewer-chrome.d.ts +3 -2
  111. package/dist/visio/viewer-color-menus.d.ts +34 -0
  112. package/dist/visio/viewer-commands.d.ts +4 -3
  113. package/dist/visio/viewer-connector-tool.d.ts +5 -3
  114. package/dist/visio/viewer-data-window.d.ts +5 -1
  115. package/dist/visio/viewer-draw-tool.d.ts +1 -11
  116. package/dist/visio/viewer-element.d.ts +8 -0
  117. package/dist/visio/viewer-format-pane.d.ts +26 -0
  118. package/dist/visio/viewer-guides.d.ts +3 -3
  119. package/dist/visio/viewer-layout-commands.d.ts +5 -1
  120. package/dist/visio/viewer-more-colors.d.ts +16 -0
  121. package/dist/visio/viewer-page-setup.d.ts +6 -0
  122. package/dist/visio/viewer-ruler-grid.d.ts +25 -0
  123. package/dist/visio/viewer-ruler.d.ts +11 -3
  124. package/dist/visio/viewer-snap-glue.d.ts +23 -0
  125. package/dist/visio/viewer-stencil.d.ts +4 -1
  126. package/dist/visio.js +6688 -5303
  127. package/dist/xlsx/component.d.ts +8 -0
  128. package/dist/xlsx/dialogs/format-cells/color-swatches.d.ts +4 -2
  129. package/dist/xlsx/dialogs/styles.d.ts +1 -1
  130. package/dist/xlsx/events.d.ts +4 -1
  131. package/dist/xlsx/index.d.ts +1 -0
  132. package/dist/xlsx/ribbon/color-grid.d.ts +25 -7
  133. package/dist/xlsx/ribbon/ribbon.d.ts +3 -0
  134. package/dist/xlsx.js +121 -163
  135. package/package.json +3 -2
  136. package/dist/pptx/render/connector-router-astar.d.ts +0 -24
  137. package/dist/pptx/render/connector-router-astar.d.ts.map +0 -1
  138. package/dist/pptx/render/connector-router-graph.d.ts +0 -38
  139. package/dist/pptx/render/connector-router-graph.d.ts.map +0 -1
  140. package/dist/visio/format-shape-dialog.d.ts +0 -21
  141. package/dist/visio/viewer-format-shape.d.ts +0 -16
  142. package/dist/visio/viewer-paint-dialog.d.ts +0 -28
  143. package/dist/visio/viewer-paint-properties.d.ts +0 -13
@@ -0,0 +1,112 @@
1
+ import { defineRibbonGroup, defineRibbonStack, defineButton, defineMenuItem, defineMenuButton } from './chunk-O7APCA5N.js';
2
+ import { acceptedRibbonAddIns, findRibbonAddInCommand, RIBBON_ADD_IN_EVENT } from 'ooxml-core/ribbon';
3
+ export { RIBBON_ADD_IN_EVENT } from 'ooxml-core/ribbon';
4
+
5
+ function defineRibbonAddInElements(registry) {
6
+ if (!registry) return;
7
+ for (const define of [
8
+ defineRibbonGroup,
9
+ defineRibbonStack,
10
+ defineButton,
11
+ defineMenuItem,
12
+ defineMenuButton
13
+ ])
14
+ define(registry);
15
+ }
16
+ var SMALL_ROWS = 3;
17
+ function button(doc, spec) {
18
+ const menu = !!spec.items?.length;
19
+ const el = doc.createElement(menu ? "office-ui-menu-button" : "office-ui-button");
20
+ if (!menu) el.setAttribute("command", spec.id);
21
+ el.dataset.addInCommand = spec.id;
22
+ el.setAttribute("label", spec.label);
23
+ el.setAttribute("title", spec.title ?? spec.label);
24
+ if (spec.icon) el.setAttribute("icon", spec.icon);
25
+ const small = spec.size === "small";
26
+ if (!menu) el.setAttribute("size", small ? "small" : "large");
27
+ else if (!small) el.setAttribute("variant", "stacked");
28
+ else el.style.setProperty("--office-target-size", "var(--office-control-height)");
29
+ if (spec.disabled) el.setAttribute("disabled", "");
30
+ for (const item of spec.items ?? []) {
31
+ const entry = doc.createElement("office-ui-menu-item");
32
+ entry.setAttribute("command", item.id);
33
+ entry.dataset.addInCommand = item.id;
34
+ entry.setAttribute("label", item.label);
35
+ if (item.title) entry.setAttribute("title", item.title);
36
+ if (item.icon) entry.setAttribute("icon", item.icon);
37
+ if (item.disabled) entry.setAttribute("disabled", "");
38
+ el.append(entry);
39
+ }
40
+ return el;
41
+ }
42
+ function group(doc, spec) {
43
+ const el = doc.createElement("office-ui-ribbon-group");
44
+ el.setAttribute("label", spec.label);
45
+ let column;
46
+ for (const command of spec.commands) {
47
+ if (command.size !== "small") {
48
+ column = void 0;
49
+ el.append(button(doc, command));
50
+ continue;
51
+ }
52
+ if (!column || column.childElementCount >= SMALL_ROWS) {
53
+ column = doc.createElement("office-ui-ribbon-stack");
54
+ el.append(column);
55
+ }
56
+ column.append(button(doc, command));
57
+ }
58
+ return el;
59
+ }
60
+ var ownTabs = (ribbon) => new Set(
61
+ [...ribbon.children].flatMap(
62
+ (child) => child instanceof HTMLElement && child.dataset.ribbonTab && !("addIn" in child.dataset) ? [child.dataset.ribbonTab] : []
63
+ )
64
+ );
65
+ var shown = /* @__PURE__ */ new WeakMap();
66
+ var addInPanels = (ribbon) => [...ribbon.children].filter(
67
+ (child) => child instanceof HTMLElement && "addIn" in child.dataset
68
+ );
69
+ function syncRibbonAddIns(ribbon, tabs, options = {}) {
70
+ const doc = ribbon.ownerDocument;
71
+ const accepted = acceptedRibbonAddIns(tabs, ownTabs(ribbon));
72
+ if (accepted.length) defineRibbonAddInElements(doc.defaultView?.customElements);
73
+ const ids = accepted.map((tab) => tab.id);
74
+ const look = JSON.stringify([options.panelClass ?? "", accepted]);
75
+ const current = new Map(accepted.map((tab) => [tab.id, tab]));
76
+ const existing = addInPanels(ribbon);
77
+ const before = shown.get(ribbon);
78
+ shown.set(ribbon, { look, tabs: current });
79
+ if (before?.look === look && existing.length === ids.length && existing.every((panel, index) => panel.dataset.ribbonTab === ids[index]))
80
+ return ids;
81
+ for (const panel of existing) panel.remove();
82
+ for (const tab of accepted) {
83
+ const panel = doc.createElement("div");
84
+ if (options.panelClass) panel.className = options.panelClass;
85
+ panel.id = `add-in-${tab.id}-panel`;
86
+ panel.dataset.addIn = "";
87
+ panel.dataset.ribbonTab = tab.id;
88
+ panel.dataset.label = tab.label;
89
+ if (tab.keytip) panel.dataset.tabKeytip = tab.keytip;
90
+ const groups = tab.groups.map((spec) => group(doc, spec));
91
+ panel.append(...options.wrap ? options.wrap(doc, tab, groups) : groups);
92
+ panel.addEventListener("office-command", (event) => {
93
+ event.stopPropagation();
94
+ const id = event.detail?.command;
95
+ const latest = shown.get(ribbon)?.tabs.get(tab.id);
96
+ const command = latest && findRibbonAddInCommand(latest, id);
97
+ if (!command) return;
98
+ command.run?.();
99
+ ribbon.dispatchEvent(
100
+ new CustomEvent(RIBBON_ADD_IN_EVENT, {
101
+ detail: { tab: tab.id, command: command.id },
102
+ bubbles: true,
103
+ composed: true
104
+ })
105
+ );
106
+ });
107
+ ribbon.append(panel);
108
+ }
109
+ return ids;
110
+ }
111
+
112
+ export { defineRibbonAddInElements, syncRibbonAddIns };
@@ -38,8 +38,12 @@ import { defineTaskPane } from './chrome/task-pane.js';
38
38
  import { defineTitleBar } from './chrome/title-bar.js';
39
39
  import { defineZoomSlider } from './form/zoom-slider.js';
40
40
  import { defineSymbolPicker } from './form/symbol-picker.js';
41
- export { defineAccount, defineDialogFooter, definePasteOptions, defineRadio, defineReadOnlyBanner, defineRibbonToggle, defineSearchField, defineToasts, defineBackstage, defineCommentsPane, defineFindBar, defineGallery, definePrintPreview, defineRibbon, defineRibbonActions, defineRuler, defineButton, defineCheckbox, defineCommandSearch, defineContextMenu, defineDialog, defineIcon, defineMenuButton, defineMenuItem, defineMenuSeparator, defineOptionsDialog, defineRibbonGroup, defineRibbonSection, defineRibbonStack, defineSelect, defineStatusBar, defineStatusItem, defineSwitch, defineTabStrip, defineTaskPane, defineTitleBar, defineToolbar, defineZoomSlider, defineSymbolPicker, };
41
+ import { defineColorGrid } from './form/color-grid.js';
42
+ export type { OfficeColorChange, OfficeColorChangeEvent, OfficeUiColorCustom, } from './form/color-custom.js';
43
+ import { defineColorCustom } from './form/color-custom.js';
44
+ export { defineAccount, defineDialogFooter, definePasteOptions, defineRadio, defineReadOnlyBanner, defineRibbonToggle, defineSearchField, defineToasts, defineBackstage, defineCommentsPane, defineFindBar, defineGallery, definePrintPreview, defineRibbon, defineRibbonActions, defineRuler, defineButton, defineCheckbox, defineCommandSearch, defineContextMenu, defineDialog, defineIcon, defineMenuButton, defineMenuItem, defineMenuSeparator, defineOptionsDialog, defineRibbonGroup, defineRibbonSection, defineRibbonStack, defineSelect, defineStatusBar, defineStatusItem, defineSwitch, defineTabStrip, defineTaskPane, defineTitleBar, defineToolbar, defineZoomSlider, defineSymbolPicker, defineColorGrid, defineColorCustom, };
42
45
  export { OFFICE_SYMBOLS, parseOfficeSymbolCode } from './form/symbol-picker.js';
46
+ export type { OfficeColorPick, OfficeColorPickEvent, OfficeColorSource, OfficeUiColorGrid, } from './form/color-grid.js';
43
47
  export type { OfficeCommandEvent } from './ribbon/button.js';
44
48
  export type { OfficeDialogCloseEvent, OfficeDialogCloseReason } from './dialog/dialog.js';
45
49
  export type { OfficeSelectOption } from './form/select.js';
@@ -56,6 +60,8 @@ export { assignKeyTips, runKeyTips } from './ribbon/keytip-run.js';
56
60
  export type { KeyTipTarget } from './ribbon/keytip-run.js';
57
61
  export { createRibbonOverflow } from './ribbon/overflow.js';
58
62
  export type { RibbonOverflow, RibbonOverflowOptions } from './ribbon/overflow.js';
63
+ export { attachRibbonGroupOverflow, fitRibbonGroups } from './ribbon/group-overflow.js';
64
+ export type { RibbonGroupOverflow, RibbonGroupOverflowOptions } from './ribbon/group-overflow.js';
59
65
  export type { OfficeRibbonSelectEvent } from './ribbon/ribbon-tabs.js';
60
66
  export type { OfficeRibbonActionsMode, OfficeRibbonModeEvent } from './ribbon/ribbon-actions.js';
61
67
  export type { OfficeRibbonCommandView, OfficeRibbonGroupView } from './ribbon/ribbon-section.js';
@@ -69,7 +75,7 @@ export type { OfficeReadOnlyBannerIntent, OfficeReadOnlyBannerState, } from './n
69
75
  export { clearOfficeProfile, DEFAULT_OFFICE_PROFILE, OFFICE_AVATAR_SWATCHES, OFFICE_PROFILE_STORAGE_KEY, profileInitials, readOfficeProfile, sanitizeOfficeProfile, writeOfficeProfile, type OfficeProfile, type OfficeProfileChangeEvent, } from './chrome/account-profile.js';
70
76
  export { clampOptionNumber, type OfficeOptionCategory, type OfficeOptionChoice, type OfficeOptionControl, type OfficeOptionSection, type OfficeOptionsChangeEvent, type OfficeOptionValue, type OfficeOptionValues, } from './dialog/options-dialog.js';
71
77
  /** Every control of this entry. */
72
- export declare const CONTROL_DEFINERS: readonly [import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer];
78
+ export declare const CONTROL_DEFINERS: readonly [import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer, import("./registry.js").Definer];
73
79
  /** Idempotent, SSR-safe (no-op without a DOM). */
74
80
  export declare function registerControls(registry?: CustomElementRegistry): void;
75
81
  //# sourceMappingURL=controls.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../src/controls.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../src/controls.ts"],"names":[],"mappings":"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"}
package/dist/controls.js CHANGED
@@ -1,4 +1,4 @@
1
- export { CONTROL_DEFINERS, DEFAULT_COMMENTS_LABELS, DEFAULT_OFFICE_PROFILE, EMPTY_MENU_STATE, OFFICE_AVATAR_SWATCHES, OFFICE_COLOR_SWATCHES, OFFICE_COLOR_SWATCH_HEXES, OFFICE_PROFILE_STORAGE_KEY, OFFICE_SYMBOLS, OFFICE_TITLE_BAR_SEARCH_LIMIT, OFFICE_TOAST_VISIBLE_LIMIT, assignKeyTips, attachKeyTips, clampFlyoutPosition, clampOptionNumber, clearOfficeProfile, commentInitials, createRibbonOverflow, defineAccount, defineBackstage, defineButton, defineCheckbox, defineCommandSearch, defineCommentsPane, defineContextMenu, defineDialog, defineDialogFooter, defineFindBar, defineGallery, defineIcon, defineMenuButton, defineMenuItem, defineMenuSeparator, defineOptionsDialog, definePasteOptions, definePrintPreview, defineRadio, defineReadOnlyBanner, defineRibbon, defineRibbonActions, defineRibbonGroup, defineRibbonSection, defineRibbonStack, defineRibbonToggle, defineRuler, defineSearchField, defineSelect, defineStatusBar, defineStatusItem, defineSwitch, defineSymbolPicker, defineTabStrip, defineTaskPane, defineTitleBar, defineToasts, defineToolbar, defineZoomSlider, formatCommentTime, nextEnabledIndex, parseOfficeSymbolCode, parseSvgPreview, profileInitials, readOfficeProfile, registerControls, rulerDivisions, runKeyTips, sanitizeOfficeProfile, typeAheadIndex, writeOfficeProfile } from './chunk-SCWCZSTE.js';
1
+ export { CONTROL_DEFINERS, DEFAULT_COMMENTS_LABELS, DEFAULT_OFFICE_PROFILE, EMPTY_MENU_STATE, OFFICE_AVATAR_SWATCHES, OFFICE_COLOR_SWATCHES, OFFICE_COLOR_SWATCH_HEXES, OFFICE_PROFILE_STORAGE_KEY, OFFICE_SYMBOLS, OFFICE_TITLE_BAR_SEARCH_LIMIT, OFFICE_TOAST_VISIBLE_LIMIT, assignKeyTips, attachKeyTips, attachRibbonGroupOverflow, clampFlyoutPosition, clampOptionNumber, clearOfficeProfile, commentInitials, createRibbonOverflow, defineAccount, defineBackstage, defineButton, defineCheckbox, defineColorCustom, defineColorGrid, defineCommandSearch, defineCommentsPane, defineContextMenu, defineDialog, defineDialogFooter, defineFindBar, defineGallery, defineIcon, defineMenuButton, defineMenuItem, defineMenuSeparator, defineOptionsDialog, definePasteOptions, definePrintPreview, defineRadio, defineReadOnlyBanner, defineRibbon, defineRibbonActions, defineRibbonGroup, defineRibbonSection, defineRibbonStack, defineRibbonToggle, defineRuler, defineSearchField, defineSelect, defineStatusBar, defineStatusItem, defineSwitch, defineSymbolPicker, defineTabStrip, defineTaskPane, defineTitleBar, defineToasts, defineToolbar, defineZoomSlider, fitRibbonGroups, formatCommentTime, nextEnabledIndex, parseOfficeSymbolCode, parseSvgPreview, profileInitials, readOfficeProfile, registerControls, rulerDivisions, runKeyTips, sanitizeOfficeProfile, typeAheadIndex, writeOfficeProfile } from './chunk-O7APCA5N.js';
2
2
  import './chunk-M6GF5ED2.js';
3
3
  import './chunk-L7JV5FVE.js';
4
4
  import './chunk-OGNNNTKI.js';
@@ -1 +1 @@
1
- {"version":3,"file":"dialog-footer.d.ts","sourceRoot":"","sources":["../../src/dialog/dialog-footer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAiB,MAAM,SAAS,CAAC;AAKvD,MAAM,MAAM,yBAAyB,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvF,MAAM,WAAW,wBAAwB;IACxC,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,2FAA2F;IAC3F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC7C;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;IACtD,MAAM,CAAC,YAAY,SAAkC;IACrD,MAAM,CAAC,YAAY,SAA0B;IAC7C,OAAgB,MAAM,4BAAsB;IAG5C,OAAO,CAAC,KAAK,CAA4C;IAEzD,IAAI,KAAK,IAAI,uBAAuB,CAEnC;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,uBAAuB,EAGvC;IAED,yFAAyF;IACzF,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE5B;IAED,OAAO,CAAC,OAAO;IAUf,UAAmB,MAAM,oCAqBxB;CACD;AAED,eAAO,MAAM,kBAAkB,+BAAiE,CAAC"}
1
+ {"version":3,"file":"dialog-footer.d.ts","sourceRoot":"","sources":["../../src/dialog/dialog-footer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAiB,MAAM,SAAS,CAAC;AAKvD,MAAM,MAAM,yBAAyB,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvF,MAAM,WAAW,wBAAwB;IACxC,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,2FAA2F;IAC3F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC7C;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;IACtD,MAAM,CAAC,YAAY,SAAkC;IACrD,MAAM,CAAC,YAAY,SAA0B;IAC7C,OAAgB,MAAM,4BAAsB;IAG5C,OAAO,CAAC,KAAK,CAA4C;IAEzD,IAAI,KAAK,IAAI,uBAAuB,CAEnC;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,uBAAuB,EAGvC;IAED,yFAAyF;IACzF,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE5B;IAED,OAAO,CAAC,OAAO;IAUf,UAAmB,MAAM,oCAsBxB;CACD;AAED,eAAO,MAAM,kBAAkB,+BAAiE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"options-dialog.d.ts","sourceRoot":"","sources":["../../src/dialog/options-dialog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"options-dialog.d.ts","sourceRoot":"","sources":["../../src/dialog/options-dialog.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { RibbonAddInTab } from '../ribbon/add-in-tabs.js';
1
2
  import { FormatDialogs } from './format-dialogs.js';
2
3
  import type { EditorState, Transaction } from 'prosemirror-state';
3
4
  import type { EditorView } from 'prosemirror-view';
@@ -42,6 +43,8 @@ export interface ShellParts {
42
43
  export declare class EditorCore {
43
44
  readonly element: HTMLElement;
44
45
  model: DocumentModel;
46
+ /** Tabs the host added after Word's own (`ribbonAddIns` of the element). */
47
+ ribbonAddIns: readonly RibbonAddInTab[];
45
48
  view?: EditorView | undefined;
46
49
  loaded?: LoadedDocument | undefined;
47
50
  loadGeneration: number;
@@ -9,3 +9,5 @@ export interface ShellApi {
9
9
  }
10
10
  /** Builds the shadow-DOM shell (ribbon, canvas, panels, chrome) once; later calls are no-ops. */
11
11
  export declare function buildShell(core: EditorCore, api: ShellApi): void;
12
+ /** Renders the host's add-in tabs (`ribbonAddIns`) after Word's own, once the ribbon exists. */
13
+ export declare function applyRibbonAddIns(core: EditorCore): void;
@@ -1,3 +1,4 @@
1
+ import type { RibbonAddInTab } from '../ribbon/add-in-tabs.js';
1
2
  import type { CollabSession } from 'ooxml-core/collab';
2
3
  import type { WordYjsOptions } from 'ooxml-core/docx/ui';
3
4
  import type { EditorCore } from './editor-core.js';
@@ -24,6 +25,12 @@ export declare abstract class DocxEditorApi extends HTMLElementBase {
24
25
  /** Shows the left rail of page thumbnails. Needs Print Layout; reflected to `show-thumbnails`. */
25
26
  get showThumbnails(): boolean;
26
27
  set showThumbnails(value: boolean);
28
+ /**
29
+ * Tabs a host adds after Word's own, as an Office add-in does. Each command runs its `run`
30
+ * callback and dispatches `office-ribbon-add-in` (`{ tab, command }`) from the editor.
31
+ */
32
+ get ribbonAddIns(): readonly RibbonAddInTab[];
33
+ set ribbonAddIns(value: readonly RibbonAddInTab[]);
27
34
  /** Hides the ribbon (the title bar and status bar stay). Default true; `show-toolbar="false"`. */
28
35
  get showToolbar(): boolean;
29
36
  set showToolbar(value: boolean);
@@ -1,4 +1,5 @@
1
1
  import type { DocumentModel } from 'ooxml-core/docx';
2
+ import type { RibbonAddInCommandDetail } from 'ooxml-core/ribbon';
2
3
  import type { StepBatch } from 'ooxml-core/docx/ui';
3
4
  import type { FileCommandDetail } from './file-commands.js';
4
5
  import type { PageChangeDetail } from './page-sync.js';
@@ -28,12 +29,14 @@ export interface DocxEditorEventMap {
28
29
  'presence-send': CustomEvent<PresenceMessage>;
29
30
  /** Local steps are pending; transport the batch to the collaboration authority. */
30
31
  'collaboration-send': CustomEvent<StepBatch>;
32
+ /** A command of a host tab (`ribbonAddIns`) was chosen. */
33
+ 'office-ribbon-add-in': CustomEvent<RibbonAddInCommandDetail>;
31
34
  }
32
35
  export type DocxEditorEventName = keyof DocxEditorEventMap;
33
36
  /** Detail payload type of the named event. */
34
37
  export type DocxEditorEventDetail<K extends DocxEditorEventName> = DocxEditorEventMap[K] extends CustomEvent<infer D> ? D : never;
35
38
  /** Runtime list of every event name; the `satisfies` check keeps it a subset of the map. */
36
- export declare const DOCX_EDITOR_EVENTS: readonly ["document-change", "document-error", "document-warning", "readonly-change", "ribbon-action", "ribbon-customize", "file-command", "page-change", "dirty-change", "presence-send", "collaboration-send"];
39
+ export declare const DOCX_EDITOR_EVENTS: readonly ["document-change", "document-error", "document-warning", "readonly-change", "ribbon-action", "ribbon-customize", "file-command", "page-change", "dirty-change", "presence-send", "collaboration-send", "office-ribbon-add-in"];
37
40
  /** Typed listener for plain elements (such as the ribbon) that are not a `<docx-editor>`. */
38
41
  export declare function on<K extends DocxEditorEventName>(target: EventTarget, name: K, listener: (event: DocxEditorEventMap[K]) => void): void;
39
42
  /**
@@ -22,3 +22,4 @@ export type { ReviewDisplayMode } from './review-display.js';
22
22
  export type { RevisionRange } from './review-commands.js';
23
23
  export { lightTheme, darkTheme, themeToCssVars } from 'ooxml-core/docx/ui';
24
24
  export type { EditorTheme, EditorThemeMode } from 'ooxml-core/docx/ui';
25
+ export { RIBBON_ADD_IN_EVENT, type OfficeRibbonAddInEvent, type RibbonAddInCommand, type RibbonAddInCommandDetail, type RibbonAddInGroup, type RibbonAddInTab, } from '../ribbon/add-in-tabs.js';
@@ -1,11 +1,10 @@
1
- /** The five variants under a theme colour, as Word's grid shows them (lighter, then darker). */
2
- export declare function themeShades(hex: string): string[];
3
1
  export interface ColorGridOptions {
4
2
  /** Label of the first row's "clear" command, or omitted when the property cannot be cleared. */
5
3
  noneLabel?: string;
6
4
  }
7
5
  /**
8
- * Word's colour picker: a no-colour row, a Theme Colors grid (ten columns, each a colour over five
9
- * variants), Standard Colors and More Colors (the browser's colour dialog).
6
+ * Word's colour picker on the shared `office-ui-color-grid`: a no-colour row, Theme Colors (ten
7
+ * columns, each a colour over the five variants Office derives from it), Standard Colors and More
8
+ * Colors (the browser's colour dialog). A choice is reported as `#rrggbb`, or `'none'`.
10
9
  */
11
10
  export declare function openColorGridPopover(anchor: HTMLElement, choose: (value: string) => void, options?: ColorGridOptions): void;
package/dist/docx.js CHANGED
@@ -1,6 +1,8 @@
1
+ import { syncRibbonAddIns } from './chunk-W6AV3GHC.js';
2
+ export { RIBBON_ADD_IN_EVENT } from './chunk-W6AV3GHC.js';
1
3
  import { defineSmartArt } from './chunk-PXIYHFZ5.js';
2
4
  import { shadcnBridge } from './chunk-BCH2ZLWI.js';
3
- import { createRibbonOverflow, defineRibbon, defineRuler, defineCommentsPane, defineDialog, defineSearchField, defineSwitch, defineTitleBar, defineRibbonActions, defineBackstage, defineStatusBar, defineZoomSlider, defineContextMenu, runKeyTips, assignKeyTips } from './chunk-SCWCZSTE.js';
5
+ import { createRibbonOverflow, defineRibbon, defineRuler, defineCommentsPane, defineDialog, defineSearchField, defineSwitch, defineTitleBar, defineRibbonActions, defineBackstage, defineStatusBar, defineZoomSlider, defineContextMenu, defineColorGrid, runKeyTips, assignKeyTips } from './chunk-O7APCA5N.js';
4
6
  import { registerIcon } from './chunk-M6GF5ED2.js';
5
7
  import './chunk-L7JV5FVE.js';
6
8
  import './chunk-OGNNNTKI.js';
@@ -4983,7 +4985,8 @@ var DOCX_EDITOR_EVENTS = [
4983
4985
  "page-change",
4984
4986
  "dirty-change",
4985
4987
  "presence-send",
4986
- "collaboration-send"
4988
+ "collaboration-send",
4989
+ "office-ribbon-add-in"
4987
4990
  ];
4988
4991
  function on(target, name, listener) {
4989
4992
  target.addEventListener(name, (event) => listener(event));
@@ -5386,93 +5389,36 @@ var STANDARD = [
5386
5389
  ["#002060", "Dark Blue"],
5387
5390
  ["#7030a0", "Purple"]
5388
5391
  ];
5389
- function mix(hex, target, amount) {
5390
- const channel = (at) => {
5391
- const value = parseInt(hex.slice(at, at + 2), 16);
5392
- return Math.round(value + (target - value) * amount).toString(16).padStart(2, "0");
5393
- };
5394
- return `#${channel(1)}${channel(3)}${channel(5)}`;
5395
- }
5396
- function themeShades(hex) {
5397
- if (hex === "#ffffff") return [0.05, 0.15, 0.25, 0.35, 0.5].map((n) => mix(hex, 0, n));
5398
- if (hex === "#000000") return [0.5, 0.35, 0.25, 0.15, 0.05].map((n) => mix(hex, 255, n));
5399
- return [
5400
- mix(hex, 255, 0.8),
5401
- mix(hex, 255, 0.6),
5402
- mix(hex, 255, 0.4),
5403
- mix(hex, 0, 0.25),
5404
- mix(hex, 0, 0.5)
5405
- ];
5406
- }
5407
5392
  function openColorGridPopover(anchor, choose, options = {}) {
5408
5393
  const locale = localeOf(anchor);
5409
5394
  const say = (text) => translate(locale, text);
5395
+ defineColorGrid();
5410
5396
  const pop = document.createElement("div");
5411
5397
  pop.className = "ribbon-popover color-grid";
5412
- pop.setAttribute("role", "menu");
5413
5398
  const pick = (value) => {
5414
5399
  closeRibbonPopover();
5415
5400
  choose(value);
5416
5401
  };
5417
- const swatch = (value, name) => {
5418
- const item = document.createElement("button");
5419
- item.type = "button";
5420
- item.setAttribute("role", "menuitem");
5421
- item.className = "swatch";
5422
- item.style.setProperty("--swatch", value);
5423
- item.setAttribute("aria-label", say(name));
5424
- item.title = say(name);
5425
- item.dataset.color = value;
5426
- item.addEventListener("mousedown", (event) => event.preventDefault());
5427
- item.addEventListener("click", () => pick(value));
5428
- return item;
5429
- };
5430
- const title = (text) => {
5431
- const el = document.createElement("div");
5432
- el.className = "color-grid-title";
5433
- el.textContent = say(text);
5434
- return el;
5435
- };
5436
- const grid = (...items) => {
5437
- const el = document.createElement("div");
5438
- el.className = "color-grid-cells";
5439
- el.append(...items);
5440
- return el;
5441
- };
5442
- if (options.noneLabel) {
5443
- const none = document.createElement("button");
5444
- none.type = "button";
5445
- none.setAttribute("role", "menuitem");
5446
- none.className = "color-grid-command";
5447
- none.textContent = say(options.noneLabel);
5448
- none.addEventListener("mousedown", (event) => event.preventDefault());
5449
- none.addEventListener("click", () => pick("none"));
5450
- pop.append(none);
5451
- }
5452
- const shades = THEME.map(([hex]) => themeShades(hex));
5453
- pop.append(
5454
- title("Theme Colors"),
5455
- grid(
5456
- ...THEME.map(([hex, name]) => swatch(hex, name)),
5457
- ...[0, 1, 2, 3, 4].flatMap(
5458
- (row3) => THEME.map(([, name], column) => swatch(shades[column][row3], name))
5459
- )
5460
- ),
5461
- title("Standard Colors"),
5462
- grid(...STANDARD.map(([hex, name]) => swatch(hex, name)))
5463
- );
5464
- const more = document.createElement("button");
5465
- more.type = "button";
5466
- more.setAttribute("role", "menuitem");
5467
- more.className = "color-grid-command";
5468
- more.textContent = say("More Colors\u2026");
5402
+ const grid = document.createElement("office-ui-color-grid");
5403
+ grid.themeColors = THEME.map(([hex]) => hex);
5404
+ grid.themeNames = THEME.map(([, name]) => say(name));
5405
+ grid.variantLabel = (column) => column;
5406
+ grid.standardColors = STANDARD.map(([hex, name]) => ({ hex, label: say(name) }));
5407
+ grid.themeHeading = say("Theme Colors");
5408
+ grid.standardHeading = say("Standard Colors");
5409
+ grid.moreLabel = say("More Colors\u2026");
5410
+ if (options.noneLabel) grid.noneLabel = say(options.noneLabel);
5469
5411
  const input = Object.assign(document.createElement("input"), { type: "color" });
5470
5412
  input.className = "color-grid-input";
5471
5413
  input.tabIndex = -1;
5472
5414
  input.addEventListener("change", () => pick(input.value));
5473
- more.addEventListener("mousedown", (event) => event.preventDefault());
5474
- more.addEventListener("click", () => input.click());
5475
- pop.append(more, input);
5415
+ grid.addEventListener(
5416
+ "office-color-pick",
5417
+ (event) => pick(event.detail.color)
5418
+ );
5419
+ grid.addEventListener("office-color-more", () => input.click());
5420
+ pop.addEventListener("mousedown", (event) => event.preventDefault());
5421
+ pop.append(grid, input);
5476
5422
  if (!mountPopover(anchor, pop, anchor)) return;
5477
5423
  const box2 = anchor.getBoundingClientRect();
5478
5424
  pop.style.left = `${Math.max(4, box2.left - 120)}px`;
@@ -7469,7 +7415,8 @@ function setRibbonLocale(root, value) {
7469
7415
  root.dataset.editorLocale = locale;
7470
7416
  localizeElement(root, locale);
7471
7417
  for (const panel of panelsOf(root))
7472
- panel.dataset.label = translate(locale, `tab.${panel.dataset.ribbonTab}`);
7418
+ if (!("addIn" in panel.dataset))
7419
+ panel.dataset.label = translate(locale, `tab.${panel.dataset.ribbonTab}`);
7473
7420
  root.setAttribute("file-label", translate(locale, "File"));
7474
7421
  root.setAttribute("collapse-label", translate(locale, "Collapse the ribbon"));
7475
7422
  syncSelectTitles(root);
@@ -16319,6 +16266,8 @@ var EditorCore = class {
16319
16266
  }
16320
16267
  element;
16321
16268
  model = createDocument();
16269
+ /** Tabs the host added after Word's own (`ribbonAddIns` of the element). */
16270
+ ribbonAddIns = [];
16322
16271
  view;
16323
16272
  loaded;
16324
16273
  loadGeneration = 0;
@@ -16471,7 +16420,7 @@ var ribbon_widgets_default = ".dve-keytip {\n position: absolute;\n bottom: -2px
16471
16420
  var ribbon_styles_group_default = "/* Styles group: gallery, previous/next/more strip, expanded gallery and pane. */\n.style-strip {\n display: flex;\n flex-direction: column;\n gap: 1px;\n width: 16px;\n}\n.ribbon-group .style-strip .style-strip-button {\n flex: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n min-width: 16px;\n height: 16px;\n min-height: 0;\n padding: 0;\n border-radius: 2px;\n}\n.ribbon-popover.styles-popover {\n display: block;\n max-height: min(70vh, 520px);\n max-width: 420px;\n overflow-y: auto;\n padding: 8px;\n}\n.styles-section-title {\n margin: 4px 2px 6px;\n color: var(--muted);\n font:\n 600 11px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.styles-grid {\n display: grid;\n grid-template-columns: repeat(4, 88px);\n gap: 4px;\n}\n.styles-popover .style-tile,\n.dve-styles-pane .style-tile {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n height: 50px;\n padding: 4px 2px;\n border: 1px solid #d5d8dc;\n background: #fff;\n color: #1f1f1f;\n cursor: pointer;\n}\n.styles-popover .style-tile[aria-pressed='true'],\n.dve-styles-pane .style-tile[aria-pressed='true'] {\n border-color: var(--blue);\n background: #e8f0fa;\n}\n.styles-popover .style-tile:hover:not(:disabled),\n.dve-styles-pane .style-tile:hover:not(:disabled) {\n border-color: #a8c4e6;\n background: #f3f7fc;\n}\n.styles-commands {\n display: grid;\n gap: 2px;\n margin-top: 8px;\n padding-top: 6px;\n border-top: 1px solid var(--line);\n}\n.styles-command {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border: 0;\n border-radius: 3px;\n background: none;\n color: var(--ink);\n font:\n 12px 'Segoe UI',\n Arial,\n sans-serif;\n text-align: left;\n cursor: pointer;\n}\n.styles-command:hover:not(:disabled) {\n background: var(--accent-soft);\n}\n.styles-command:disabled {\n opacity: 0.4;\n cursor: default;\n}\n.dve-styles-pane {\n flex: none;\n width: 260px;\n min-height: 0;\n overflow-y: auto;\n padding: 10px 12px;\n border-left: 1px solid var(--line);\n background: var(--surface);\n color: var(--ink);\n}\n.dve-styles-pane[hidden] {\n display: none;\n}\n.dve-styles-pane-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.dve-styles-pane h2 {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n}\n.dve-styles-pane h3 {\n margin: 14px 0 6px;\n color: var(--muted);\n font:\n 600 11px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.dve-styles-pane-header button {\n border: 0;\n background: none;\n color: var(--muted);\n font-size: 18px;\n cursor: pointer;\n}\n.dve-styles-pane-list {\n display: grid;\n gap: 4px;\n}\n.dve-styles-pane .style-tile {\n flex-direction: row;\n justify-content: space-between;\n height: 34px;\n padding: 2px 10px;\n}\n.dve-styles-pane .style-name {\n color: #555;\n}\n";
16472
16421
 
16473
16422
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/ribbon-popups.css?raw
16474
- var ribbon_popups_default = "/* Editing: a row-height command with a caret menu, and the Go To panel. */\n.ribbon-split-inline {\n display: flex;\n align-items: center;\n height: 22px;\n}\n.ribbon-group .ribbon-split-inline .ribbon-inline {\n flex: 1;\n width: auto;\n}\n.ribbon-menu.ribbon-menu-caret {\n flex: none;\n width: 18px;\n height: 22px;\n padding: 0;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: 0;\n}\n.ribbon-menu.ribbon-menu-caret > .ribbon-icon:last-of-type {\n margin-top: 0;\n}\n.ribbon-popover.go-to-panel {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 8px;\n width: 280px;\n padding: 10px;\n}\n.go-to-panel label {\n display: grid;\n gap: 4px;\n color: var(--muted);\n font:\n 11px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.go-to-panel select {\n height: 28px;\n border: 1px solid var(--line);\n border-radius: 3px;\n background: var(--surface);\n color: var(--ink);\n}\n.go-to-list {\n display: flex;\n flex-direction: column;\n max-height: 220px;\n overflow-y: auto;\n}\n.go-to-list button {\n overflow: hidden;\n padding: 5px 8px;\n border: 0;\n background: none;\n color: var(--ink);\n font:\n 13px 'Segoe UI',\n Arial,\n sans-serif;\n text-align: left;\n text-overflow: ellipsis;\n cursor: pointer;\n}\n.go-to-list button:hover,\n.go-to-list button:focus-visible {\n background: var(--accent-soft);\n}\n.go-to-list p {\n margin: 6px 8px;\n color: var(--muted);\n font-size: 12px;\n}\n\n/* Insert > Table size picker. */\n.ribbon-popover.table-picker {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 8px;\n width: 206px;\n padding: 10px;\n}\n.table-picker-caption {\n color: var(--ink);\n font:\n 12px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.table-picker-grid {\n display: grid;\n grid-template-columns: repeat(10, 18px);\n gap: 2px;\n outline: none;\n}\n.table-picker-grid:focus-visible {\n outline: 2px solid var(--blue);\n outline-offset: 2px;\n}\n.table-picker-grid [role='gridcell'] {\n width: 18px;\n height: 18px;\n border: 1px solid var(--line);\n background: var(--surface);\n cursor: pointer;\n}\n.table-picker-grid [role='gridcell'].active {\n border-color: var(--blue);\n background: color-mix(in srgb, var(--blue) 22%, transparent);\n}\n.table-picker-custom {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px;\n padding-top: 6px;\n border-top: 1px solid var(--line);\n}\n.table-picker-custom label {\n display: grid;\n gap: 2px;\n color: var(--muted);\n font:\n 11px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.table-picker-custom input {\n height: 24px;\n border: 1px solid var(--line);\n border-radius: 3px;\n background: var(--surface);\n color: var(--ink);\n}\n.table-picker-insert {\n grid-column: 1 / -1;\n height: 26px;\n border: 1px solid var(--line);\n border-radius: 3px;\n background: var(--surface);\n color: var(--ink);\n cursor: pointer;\n}\n.table-picker-insert:hover {\n background: var(--accent-soft);\n}\n\n/* Colour picker: Theme Colors (ten columns over five variants), Standard Colors, More Colors. */\n.ribbon-popover.color-grid {\n display: block;\n width: 236px;\n padding: 8px 10px;\n}\n.color-grid-title {\n margin: 6px 0 4px;\n color: var(--muted);\n font:\n 600 11px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.color-grid-cells {\n display: grid;\n grid-template-columns: repeat(10, 20px);\n gap: 2px 3px;\n}\n.color-grid .swatch {\n width: 20px;\n height: 20px;\n}\n.color-grid-command {\n display: block;\n width: 100%;\n margin: 2px 0;\n padding: 5px 6px;\n border: 0;\n border-radius: 3px;\n background: none;\n color: var(--ink);\n font:\n 12px 'Segoe UI',\n Arial,\n sans-serif;\n text-align: left;\n cursor: pointer;\n}\n.color-grid-command:hover,\n.color-grid-command:focus-visible {\n background: var(--accent-soft);\n}\n.color-grid-input {\n position: absolute;\n width: 0;\n height: 0;\n padding: 0;\n border: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n/* Layout galleries: page thumbnails with a name and detail, for Margins, Size, Orientation, Columns. */\n.ribbon-menu-gallery select.ribbon-menu-input {\n pointer-events: none;\n}\n.ribbon-popover.ribbon-gallery-menu {\n display: flex;\n flex-direction: column;\n gap: 0;\n min-width: 220px;\n max-height: min(70vh, 460px);\n overflow-y: auto;\n padding: 4px;\n}\n.ribbon-gallery-menu button {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 6px 10px;\n border: 1px solid transparent;\n border-radius: 3px;\n background: none;\n color: var(--ink);\n font:\n 12px 'Segoe UI',\n Arial,\n sans-serif;\n text-align: left;\n cursor: pointer;\n}\n.ribbon-gallery-menu button:hover,\n.ribbon-gallery-menu button:focus-visible {\n border-color: var(--line);\n background: var(--accent-soft);\n outline: none;\n}\n.ribbon-gallery-menu button[aria-checked='true'] {\n border-color: var(--blue);\n}\n.gallery-words {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.gallery-name {\n font-weight: 600;\n}\n.gallery-detail {\n color: var(--muted);\n font-size: 11px;\n}\n.gallery-thumb {\n flex: none;\n}\n.gallery-thumb .thumb-page {\n fill: #fff;\n stroke: #8a8886;\n stroke-width: 0.8;\n}\n.gallery-thumb .thumb-line {\n stroke: #a19f9d;\n stroke-width: 1.2;\n}\n\n/* Collapsed groups: a narrow ribbon folds its rightmost groups into one dropdown button each. */\n.ribbon-overflow-button {\n display: none !important;\n}\n.ribbon-group[data-collapsed] {\n width: auto !important;\n min-width: 0;\n max-width: none;\n flex-wrap: nowrap;\n}\n.ribbon-group[data-collapsed] > :not(.ribbon-overflow-button) {\n display: none !important;\n}\n.ribbon-group[data-collapsed] > .ribbon-overflow-button {\n display: flex !important;\n}\n.ribbon-group button.ribbon-overflow-button[aria-expanded='true'] {\n border-color: var(--line);\n background: var(--accent-soft);\n}\n.ribbon-popover.ribbon-overflow-panel {\n display: block;\n padding: 6px 8px 2px;\n}\n.ribbon-overflow-panel .ribbon-group {\n height: 84px;\n max-width: none;\n padding-right: 2px;\n border: 0;\n}\n.ribbon-group[data-collapsed]::after {\n display: none;\n}\n/* The Language group's tall stack of fields reads as one column inside its dropdown. */\n.ribbon-overflow-panel .ribbon-group.multilingual-controls {\n width: 300px !important;\n height: auto;\n max-height: min(70vh, 420px);\n flex-direction: column;\n flex-wrap: nowrap;\n align-items: stretch;\n padding-bottom: 20px;\n overflow-y: auto;\n}\n.gallery-thumb .thumb-edge-on {\n stroke: var(--ink);\n stroke-width: 1.6;\n}\n.gallery-thumb .thumb-edge-off {\n stroke: var(--muted);\n stroke-width: 1;\n stroke-dasharray: 1.5 1.5;\n}\n.gallery-thumb .thumb-line-dark {\n stroke: var(--ink);\n}\n.gallery-thumb .thumb-arrow {\n fill: none;\n stroke: var(--blue);\n stroke-width: 1.2;\n}\n.ribbon-gallery-menu .gallery-command {\n margin-top: 4px;\n padding-top: 8px;\n border-top: 1px solid var(--line);\n border-radius: 0;\n}\n";
16423
+ var ribbon_popups_default = "/* Editing: a row-height command with a caret menu, and the Go To panel. */\n.ribbon-split-inline {\n display: flex;\n align-items: center;\n height: 22px;\n}\n.ribbon-group .ribbon-split-inline .ribbon-inline {\n flex: 1;\n width: auto;\n}\n.ribbon-menu.ribbon-menu-caret {\n flex: none;\n width: 18px;\n height: 22px;\n padding: 0;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: 0;\n}\n.ribbon-menu.ribbon-menu-caret > .ribbon-icon:last-of-type {\n margin-top: 0;\n}\n.ribbon-popover.go-to-panel {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 8px;\n width: 280px;\n padding: 10px;\n}\n.go-to-panel label {\n display: grid;\n gap: 4px;\n color: var(--muted);\n font:\n 11px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.go-to-panel select {\n height: 28px;\n border: 1px solid var(--line);\n border-radius: 3px;\n background: var(--surface);\n color: var(--ink);\n}\n.go-to-list {\n display: flex;\n flex-direction: column;\n max-height: 220px;\n overflow-y: auto;\n}\n.go-to-list button {\n overflow: hidden;\n padding: 5px 8px;\n border: 0;\n background: none;\n color: var(--ink);\n font:\n 13px 'Segoe UI',\n Arial,\n sans-serif;\n text-align: left;\n text-overflow: ellipsis;\n cursor: pointer;\n}\n.go-to-list button:hover,\n.go-to-list button:focus-visible {\n background: var(--accent-soft);\n}\n.go-to-list p {\n margin: 6px 8px;\n color: var(--muted);\n font-size: 12px;\n}\n\n/* Insert > Table size picker. */\n.ribbon-popover.table-picker {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 8px;\n width: 206px;\n padding: 10px;\n}\n.table-picker-caption {\n color: var(--ink);\n font:\n 12px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.table-picker-grid {\n display: grid;\n grid-template-columns: repeat(10, 18px);\n gap: 2px;\n outline: none;\n}\n.table-picker-grid:focus-visible {\n outline: 2px solid var(--blue);\n outline-offset: 2px;\n}\n.table-picker-grid [role='gridcell'] {\n width: 18px;\n height: 18px;\n border: 1px solid var(--line);\n background: var(--surface);\n cursor: pointer;\n}\n.table-picker-grid [role='gridcell'].active {\n border-color: var(--blue);\n background: color-mix(in srgb, var(--blue) 22%, transparent);\n}\n.table-picker-custom {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px;\n padding-top: 6px;\n border-top: 1px solid var(--line);\n}\n.table-picker-custom label {\n display: grid;\n gap: 2px;\n color: var(--muted);\n font:\n 11px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.table-picker-custom input {\n height: 24px;\n border: 1px solid var(--line);\n border-radius: 3px;\n background: var(--surface);\n color: var(--ink);\n}\n.table-picker-insert {\n grid-column: 1 / -1;\n height: 26px;\n border: 1px solid var(--line);\n border-radius: 3px;\n background: var(--surface);\n color: var(--ink);\n cursor: pointer;\n}\n.table-picker-insert:hover {\n background: var(--accent-soft);\n}\n\n/* Colour picker: the shared office-ui-color-grid in a ribbon popover. */\n.ribbon-popover.color-grid {\n display: block;\n padding: 4px;\n}\n.color-grid-input {\n position: absolute;\n width: 0;\n height: 0;\n padding: 0;\n border: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n/* Layout galleries: page thumbnails with a name and detail, for Margins, Size, Orientation, Columns. */\n.ribbon-menu-gallery select.ribbon-menu-input {\n pointer-events: none;\n}\n.ribbon-popover.ribbon-gallery-menu {\n display: flex;\n flex-direction: column;\n gap: 0;\n min-width: 220px;\n max-height: min(70vh, 460px);\n overflow-y: auto;\n padding: 4px;\n}\n.ribbon-gallery-menu button {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 6px 10px;\n border: 1px solid transparent;\n border-radius: 3px;\n background: none;\n color: var(--ink);\n font:\n 12px 'Segoe UI',\n Arial,\n sans-serif;\n text-align: left;\n cursor: pointer;\n}\n.ribbon-gallery-menu button:hover,\n.ribbon-gallery-menu button:focus-visible {\n border-color: var(--line);\n background: var(--accent-soft);\n outline: none;\n}\n.ribbon-gallery-menu button[aria-checked='true'] {\n border-color: var(--blue);\n}\n.gallery-words {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.gallery-name {\n font-weight: 600;\n}\n.gallery-detail {\n color: var(--muted);\n font-size: 11px;\n}\n.gallery-thumb {\n flex: none;\n}\n.gallery-thumb .thumb-page {\n fill: #fff;\n stroke: #8a8886;\n stroke-width: 0.8;\n}\n.gallery-thumb .thumb-line {\n stroke: #a19f9d;\n stroke-width: 1.2;\n}\n\n/* Collapsed groups: a narrow ribbon folds its rightmost groups into one dropdown button each. */\n.ribbon-overflow-button {\n display: none !important;\n}\n.ribbon-group[data-collapsed] {\n width: auto !important;\n min-width: 0;\n max-width: none;\n flex-wrap: nowrap;\n}\n.ribbon-group[data-collapsed] > :not(.ribbon-overflow-button) {\n display: none !important;\n}\n.ribbon-group[data-collapsed] > .ribbon-overflow-button {\n display: flex !important;\n}\n.ribbon-group button.ribbon-overflow-button[aria-expanded='true'] {\n border-color: var(--line);\n background: var(--accent-soft);\n}\n.ribbon-popover.ribbon-overflow-panel {\n display: block;\n padding: 6px 8px 2px;\n}\n.ribbon-overflow-panel .ribbon-group {\n height: 84px;\n max-width: none;\n padding-right: 2px;\n border: 0;\n}\n.ribbon-group[data-collapsed]::after {\n display: none;\n}\n/* The Language group's tall stack of fields reads as one column inside its dropdown. */\n.ribbon-overflow-panel .ribbon-group.multilingual-controls {\n width: 300px !important;\n height: auto;\n max-height: min(70vh, 420px);\n flex-direction: column;\n flex-wrap: nowrap;\n align-items: stretch;\n padding-bottom: 20px;\n overflow-y: auto;\n}\n.gallery-thumb .thumb-edge-on {\n stroke: var(--ink);\n stroke-width: 1.6;\n}\n.gallery-thumb .thumb-edge-off {\n stroke: var(--muted);\n stroke-width: 1;\n stroke-dasharray: 1.5 1.5;\n}\n.gallery-thumb .thumb-line-dark {\n stroke: var(--ink);\n}\n.gallery-thumb .thumb-arrow {\n fill: none;\n stroke: var(--blue);\n stroke-width: 1.2;\n}\n.ribbon-gallery-menu .gallery-command {\n margin-top: 4px;\n padding-top: 8px;\n border-top: 1px solid var(--line);\n border-radius: 0;\n}\n";
16475
16424
 
16476
16425
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/docx/styles/ribbon-polish.css?raw
16477
16426
  var ribbon_polish_default = "/* Ribbon polish: distinct pressed state and Word's accent hues on command icons. Loaded last. */\n:host {\n --ribbon-accent-blue: #2b7cd3;\n --ribbon-accent-green: #2f9e5f;\n --ribbon-accent-red: #d13438;\n --ribbon-accent-orange: #d9822b;\n}\n@media (prefers-color-scheme: dark) {\n :host(:not([theme='light'])) {\n --ribbon-accent-blue: #5ea5f0;\n --ribbon-accent-green: #5cc98a;\n --ribbon-accent-red: #f07a7d;\n --ribbon-accent-orange: #f0a35e;\n }\n}\n:host([theme='dark']) {\n --ribbon-accent-blue: #5ea5f0;\n --ribbon-accent-green: #5cc98a;\n --ribbon-accent-red: #f07a7d;\n --ribbon-accent-orange: #f0a35e;\n}\n\n/* Pressed reads darker than hover, and pressing a control gives immediate feedback. */\n.ribbon-group button[aria-pressed='true'] {\n border-color: color-mix(in srgb, var(--blue) 45%, transparent);\n background: color-mix(in srgb, var(--blue) 20%, transparent);\n}\n.ribbon-group button[aria-pressed='true']:hover:not(:disabled) {\n background: color-mix(in srgb, var(--blue) 30%, transparent);\n}\n.ribbon-group button:active:not(:disabled),\n.ribbon-menu:active:not(:has(select:disabled)) {\n background: color-mix(in srgb, var(--blue) 28%, transparent);\n}\n\n/* Accent hues (buttons only; a disabled control keeps its 0.4 opacity). */\n.ribbon-icon[data-icon='table'],\n.ribbon-icon[data-icon='find'],\n.ribbon-icon[data-icon='replace'],\n.ribbon-icon[data-icon='link'],\n.ribbon-icon[data-icon='crossReference'],\n.ribbon-icon[data-icon='toc'],\n.ribbon-icon[data-icon='updateTable'],\n.ribbon-icon[data-icon='header'],\n.ribbon-icon[data-icon='footer'],\n.ribbon-icon[data-icon='pageNumber'],\n.ribbon-icon[data-icon='pageNumberIcon'],\n.ribbon-icon[data-icon='margins'],\n.ribbon-icon[data-icon='orientation'],\n.ribbon-icon[data-icon='pageSize'],\n.ribbon-icon[data-icon='columns'],\n.ribbon-icon[data-icon='select'],\n.ribbon-icon[data-icon='paste'],\n.ribbon-icon[data-icon='borders'],\n.ribbon-icon[data-icon='rowAbove'],\n.ribbon-icon[data-icon='rowBelow'],\n.ribbon-icon[data-icon='columnLeft'],\n.ribbon-icon[data-icon='columnRight'] {\n color: var(--ribbon-accent-blue);\n}\n.ribbon-icon[data-icon='picture'],\n.ribbon-icon[data-icon='formatPicture'],\n.ribbon-icon[data-icon='formatPainter'],\n.ribbon-icon[data-icon='accept'],\n.ribbon-icon[data-icon='acceptAll'],\n.ribbon-icon[data-icon='spelling'],\n.ribbon-icon[data-icon='readAloud'] {\n color: var(--ribbon-accent-green);\n}\n.ribbon-icon[data-icon='reject'],\n.ribbon-icon[data-icon='rejectAll'],\n.ribbon-icon[data-icon='deleteRow'],\n.ribbon-icon[data-icon='deleteColumn'],\n.ribbon-icon[data-icon='deleteTable'],\n.ribbon-icon[data-icon='deleteComment'],\n.ribbon-icon[data-icon='clear'] {\n color: var(--ribbon-accent-red);\n}\n.ribbon-icon[data-icon='comment'],\n.ribbon-icon[data-icon='comments'],\n.ribbon-icon[data-icon='bookmark'],\n.ribbon-icon[data-icon='caption'],\n.ribbon-icon[data-icon='footnote'],\n.ribbon-icon[data-icon='endnote'],\n.ribbon-icon[data-icon='coverPage'] {\n color: var(--ribbon-accent-orange);\n}\n\n/* Icons never shrink to make room for a two-line caption, so every large icon is the same size. */\n.ribbon-menu > .ribbon-icon,\n.ribbon-large > .ribbon-icon {\n flex: none;\n}\n\n/* A two-line caption plus the caret must still fit the dropdown command's box. */\n.ribbon-menu:not(.ribbon-menu-compact):not(.ribbon-menu-caret) {\n gap: 1px;\n height: 72px;\n line-height: 1.1;\n}\n.ribbon-menu:not(.ribbon-menu-compact):not(.ribbon-menu-caret) > .ribbon-icon:last-of-type {\n margin-top: -3px;\n}\n";
@@ -20250,12 +20199,20 @@ function buildShell(core, api) {
20250
20199
  if (core.pendingFileName) chrome.fileName = core.pendingFileName;
20251
20200
  root.append(style, frame);
20252
20201
  Object.assign(shell, { toolbar, canvas, paper });
20202
+ applyRibbonAddIns(core);
20253
20203
  chrome.setLocale(core.locale);
20254
20204
  applyViewOptions(core);
20255
20205
  attachEditorInteractions(core, frame);
20256
20206
  element.setAttribute("role", "region");
20257
20207
  applyShellLabels(element, paper, core.locale);
20258
20208
  }
20209
+ function applyRibbonAddIns(core) {
20210
+ const toolbar = core.shell.toolbar;
20211
+ if (!toolbar) return;
20212
+ const before = toolbar.querySelector("[data-add-in]");
20213
+ syncRibbonAddIns(toolbar, core.ribbonAddIns, { panelClass: "ribbon-panel" });
20214
+ if (toolbar.querySelector("[data-add-in]") !== before) refitRibbon(toolbar);
20215
+ }
20259
20216
  var key = new PluginKey("dve-tab-stops");
20260
20217
  var MAX_PASSES = 4;
20261
20218
  var stopsOf = (paragraph2) => (paragraph2.attrs.tabStops ?? []).map((stop) => ({
@@ -20663,6 +20620,17 @@ var DocxEditorApi = class extends HTMLElementBase {
20663
20620
  }
20664
20621
  reflectAttribute(this, "show-thumbnails", this.showThumbnails);
20665
20622
  }
20623
+ /**
20624
+ * Tabs a host adds after Word's own, as an Office add-in does. Each command runs its `run`
20625
+ * callback and dispatches `office-ribbon-add-in` (`{ tab, command }`) from the editor.
20626
+ */
20627
+ get ribbonAddIns() {
20628
+ return this.core.ribbonAddIns;
20629
+ }
20630
+ set ribbonAddIns(value) {
20631
+ this.core.ribbonAddIns = value ?? [];
20632
+ applyRibbonAddIns(this.core);
20633
+ }
20666
20634
  /** Hides the ribbon (the title bar and status bar stay). Default true; `show-toolbar="false"`. */
20667
20635
  get showToolbar() {
20668
20636
  return this.core.viewOptions.showToolbar;
@@ -1,14 +1,63 @@
1
1
  import { convertMetafileToSvgTree } from 'emf-converter';
2
- import { editVsdx, parseVsdx } from 'ooxml-core/visio';
2
+ import { editVsdx, parseVsdx, setVisioTextMeasurer } from 'ooxml-core/visio';
3
+
4
+ // src/visio/edit-worker.ts
5
+ var PROBE_PX = 1e3;
6
+ var PROBE = "mmmmmmmmmmlliWW@#0123456789";
7
+ var GENERIC = ["monospace", "serif"];
8
+ function createCanvasTextMeasurer(context) {
9
+ const installed = /* @__PURE__ */ new Map();
10
+ const face = (family, bold, italic, fallback) => `${italic ? "italic " : ""}${bold ? "bold " : ""}${PROBE_PX}px ${JSON.stringify(family)}${fallback ? `, ${fallback}` : ""}`;
11
+ const width = (font, text) => {
12
+ context.font = font;
13
+ if ("fontKerning" in context) context.fontKerning = "none";
14
+ return context.measureText(text).width;
15
+ };
16
+ const available = (family) => {
17
+ const key = family.toLowerCase();
18
+ const known = installed.get(key);
19
+ if (known !== void 0) return known;
20
+ const result = !/["\\]/.test(family) && GENERIC.some(
21
+ (generic) => width(face(family, false, false, generic), PROBE) !== width(`${PROBE_PX}px ${generic}`, PROBE)
22
+ ) && // Measuring the same in front of both fallbacks: the family itself drew the text.
23
+ width(face(family, false, false, "monospace"), PROBE) === width(face(family, false, false, "serif"), PROBE);
24
+ installed.set(key, result);
25
+ return result;
26
+ };
27
+ return {
28
+ tolerance: 0.01,
29
+ width(text, style) {
30
+ if (style.position || style.textCase || !available(style.fontFamily)) return void 0;
31
+ const measured = width(face(style.fontFamily, style.bold, style.italic), text);
32
+ if (!Number.isFinite(measured)) return void 0;
33
+ return measured / PROBE_PX * style.fontSize + (style.letterSpacing ?? 0) * Array.from(text).length;
34
+ }
35
+ };
36
+ }
37
+ function installBrowserTextMeasurer() {
38
+ let context = null;
39
+ try {
40
+ if (typeof OffscreenCanvas !== "undefined")
41
+ context = new OffscreenCanvas(1, 1).getContext("2d");
42
+ else if (typeof document !== "undefined")
43
+ context = document.createElement("canvas").getContext("2d");
44
+ } catch {
45
+ context = null;
46
+ }
47
+ if (!context) return false;
48
+ setVisioTextMeasurer(createCanvasTextMeasurer(context));
49
+ return true;
50
+ }
3
51
 
4
52
  // src/visio/edit-worker.ts
5
53
  var worker = self;
54
+ installBrowserTextMeasurer();
6
55
  worker.onmessage = async (event) => {
7
56
  if (event.origin && event.origin !== self.location.origin) return;
8
57
  try {
9
58
  const result = await editVsdx(event.data.bytes, event.data.edits);
10
- const document = await parseVsdx(result.bytes, { metafileConverter: convertMetafileToSvgTree });
11
- worker.postMessage({ ok: true, ...result, document }, [result.bytes.buffer]);
59
+ const document2 = await parseVsdx(result.bytes, { metafileConverter: convertMetafileToSvgTree });
60
+ worker.postMessage({ ok: true, ...result, document: document2 }, [result.bytes.buffer]);
12
61
  } catch (cause) {
13
62
  worker.postMessage({
14
63
  ok: false,