ooxml-ui 1.12.3 → 1.14.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 (325) hide show
  1. package/custom-elements.json +395 -5
  2. package/dist/chrome/status-layout.d.ts +23 -0
  3. package/dist/{chunk-S6ZXU442.js → chunk-7E3HU7RL.js} +1 -1
  4. package/dist/{chunk-PXIYHFZ5.js → chunk-ANPFMQ6E.js} +1 -1
  5. package/dist/{chunk-UKXJLI3N.js → chunk-C3MXKNNK.js} +2431 -311
  6. package/dist/{chunk-MML6EKFH.js → chunk-C5F7454A.js} +5 -5
  7. package/dist/{chunk-OGNNNTKI.js → chunk-CWBSXK7P.js} +1 -1
  8. package/dist/{chunk-LHS5DYLT.js → chunk-DSQBXLMO.js} +1 -1
  9. package/dist/{chunk-L7JV5FVE.js → chunk-KNC2UEUR.js} +1 -1
  10. package/dist/{chunk-735S7V4M.js → chunk-LAVVSCRJ.js} +415 -116
  11. package/dist/{chunk-SPNWHKSR.js → chunk-LD3K2RDN.js} +7 -5
  12. package/dist/chunk-UBBC5FH7.js +31 -0
  13. package/dist/controls.d.ts +2 -1
  14. package/dist/controls.d.ts.map +1 -1
  15. package/dist/controls.js +4 -4
  16. package/dist/dialog/options-categories.d.ts +39 -0
  17. package/dist/dialog/options-categories.d.ts.map +1 -0
  18. package/dist/dialog/options-controls.d.ts +49 -0
  19. package/dist/dialog/options-controls.d.ts.map +1 -0
  20. package/dist/dialog/options-dialog.d.ts +76 -41
  21. package/dist/dialog/options-dialog.d.ts.map +1 -1
  22. package/dist/docx/auto-fit.d.ts +10 -0
  23. package/dist/docx/backstage-customize.d.ts +7 -0
  24. package/dist/docx/backstage-options.d.ts +13 -3
  25. package/dist/docx/backstage-pages.d.ts +0 -6
  26. package/dist/docx/backstage.d.ts +3 -0
  27. package/dist/docx/canvas-click.d.ts +7 -0
  28. package/dist/docx/content-control-calendar.d.ts +7 -0
  29. package/dist/docx/content-control-dialog.d.ts +7 -0
  30. package/dist/docx/content-control-view.d.ts +2 -0
  31. package/dist/docx/editor-core.d.ts +7 -0
  32. package/dist/docx/equation-commands.d.ts +17 -0
  33. package/dist/docx/equation-dialog.d.ts +7 -0
  34. package/dist/docx/format-dialogs.d.ts +1 -1
  35. package/dist/docx/insert-controller.d.ts +4 -0
  36. package/dist/docx/locales/en-app.d.ts +1 -0
  37. package/dist/docx/locales/en.d.ts +123 -0
  38. package/dist/docx/locales/objects.d.ts +37 -0
  39. package/dist/docx/locales/options.d.ts +11 -0
  40. package/dist/docx/locales/shapes.d.ts +101 -0
  41. package/dist/docx/localization-strings.d.ts +123 -0
  42. package/dist/docx/note-editor.d.ts +7 -1
  43. package/dist/docx/page-controller.d.ts +17 -3
  44. package/dist/docx/parts-controller.d.ts +27 -1
  45. package/dist/docx/print-caret-affinity.d.ts +15 -0
  46. package/dist/docx/print-editing-index.d.ts +1 -0
  47. package/dist/docx/print-editing.d.ts +4 -1
  48. package/dist/docx/print-float-geometry.d.ts +28 -0
  49. package/dist/docx/print-float-locate.d.ts +25 -0
  50. package/dist/docx/print-float-selection.d.ts +24 -0
  51. package/dist/docx/print-float-text.d.ts +8 -0
  52. package/dist/docx/print-keyboard-navigation.d.ts +4 -3
  53. package/dist/docx/print-layout-view.d.ts +8 -0
  54. package/dist/docx/print-layout.d.ts +1 -1
  55. package/dist/docx/print-note-editing.d.ts +47 -0
  56. package/dist/docx/print-page-window.d.ts +2 -1
  57. package/dist/docx/print-picture.d.ts +7 -0
  58. package/dist/docx/print-story-editing.d.ts +16 -0
  59. package/dist/docx/print-vertical-step.d.ts +7 -0
  60. package/dist/docx/ribbon-action.d.ts +15 -0
  61. package/dist/docx/ribbon-icons.d.ts +3 -0
  62. package/dist/docx/schema.d.ts +1 -1
  63. package/dist/docx/shape-commands.d.ts +40 -0
  64. package/dist/docx/shape-draw.d.ts +12 -0
  65. package/dist/docx/shape-format-ribbon.d.ts +4 -0
  66. package/dist/docx/shape-node-view.d.ts +4 -0
  67. package/dist/docx/shape-picker.d.ts +5 -0
  68. package/dist/docx/shape-text-dialog.d.ts +4 -0
  69. package/dist/docx/status-bar.d.ts +1 -1
  70. package/dist/docx/table-model-adapter.d.ts +1 -1
  71. package/dist/docx/table-navigation.d.ts +8 -0
  72. package/dist/docx.js +3578 -595
  73. package/dist/index.d.ts +1 -1
  74. package/dist/index.js +9 -9
  75. package/dist/pptx/{chart-3d-view-scene-MYQRQDNF.mjs → chart-3d-view-scene-BEAJCQIS.mjs} +2 -2
  76. package/dist/pptx/{chart-3d-view-scene-WX23DR2E.cjs → chart-3d-view-scene-CFUVOILD.cjs} +38 -38
  77. package/dist/pptx/{chunk-VFPVEVF4.cjs → chunk-2JTHIDMD.cjs} +173 -873
  78. package/dist/pptx/{chunk-ZN4T6CYA.cjs → chunk-4NBVWV6I.cjs} +134 -0
  79. package/dist/pptx/{chunk-TTX4TDHU.cjs → chunk-5DUBDWOU.cjs} +5580 -2709
  80. package/dist/pptx/{chunk-C5OJXCCB.cjs → chunk-5UGJC25J.cjs} +1 -1
  81. package/dist/pptx/{chunk-NAFUYAQP.mjs → chunk-DWUC6LZK.mjs} +1 -1
  82. package/dist/pptx/{chunk-5OMQM4GF.mjs → chunk-GUAP5VUN.mjs} +4799 -1979
  83. package/dist/pptx/{chunk-K3S2A64B.cjs → chunk-HULZNSHL.cjs} +13 -13
  84. package/dist/pptx/{chunk-FRB6BRVU.mjs → chunk-OJXPN2WX.mjs} +134 -0
  85. package/dist/pptx/{chunk-QCP2XYJW.mjs → chunk-P3YE5LT2.mjs} +1 -1
  86. package/dist/pptx/{chunk-DPOES4WM.mjs → chunk-VXKFXPCU.mjs} +116 -829
  87. package/dist/pptx/dom/index.cjs +253 -253
  88. package/dist/pptx/dom/index.mjs +8 -8
  89. package/dist/pptx/export/html2canvas-clone.cjs +2 -2
  90. package/dist/pptx/export/html2canvas-clone.mjs +1 -1
  91. package/dist/pptx/i18n/index.cjs +6 -6
  92. package/dist/pptx/i18n/index.mjs +1 -1
  93. package/dist/pptx/i18n/translations-en-table-layout.d.ts +3 -0
  94. package/dist/pptx/i18n/translations-en-table-layout.d.ts.map +1 -0
  95. package/dist/pptx/i18n/translations-en.d.ts.map +1 -1
  96. package/dist/pptx/index.cjs +3280 -3084
  97. package/dist/pptx/index.mjs +5 -5
  98. package/dist/pptx/render/chart-auto-title.d.ts +10 -15
  99. package/dist/pptx/render/chart-auto-title.d.ts.map +1 -1
  100. package/dist/pptx/render/chart-cartesian-bubbles.d.ts.map +1 -1
  101. package/dist/pptx/render/chart-combo-stock.cjs +3 -3
  102. package/dist/pptx/render/chart-combo-stock.mjs +1 -1
  103. package/dist/pptx/render/chart-data-label-text.d.ts +1 -1
  104. package/dist/pptx/render/chart-error-bars.d.ts.map +1 -1
  105. package/dist/pptx/render/chart-helpers.d.ts +3 -10
  106. package/dist/pptx/render/chart-helpers.d.ts.map +1 -1
  107. package/dist/pptx/render/chart-overlays-trendline-fit.d.ts +7 -9
  108. package/dist/pptx/render/chart-overlays-trendline-fit.d.ts.map +1 -1
  109. package/dist/pptx/render/chart-overlays.cjs +7 -7
  110. package/dist/pptx/render/chart-overlays.mjs +1 -1
  111. package/dist/pptx/render/chart-stock-candles.d.ts +0 -21
  112. package/dist/pptx/render/chart-stock-candles.d.ts.map +1 -1
  113. package/dist/pptx/render/chart-style-palette.d.ts +3 -28
  114. package/dist/pptx/render/chart-style-palette.d.ts.map +1 -1
  115. package/dist/pptx/render/chart-sunburst-hierarchy.d.ts +8 -28
  116. package/dist/pptx/render/chart-sunburst-hierarchy.d.ts.map +1 -1
  117. package/dist/pptx/render/chart-surface-treemap.cjs +4 -4
  118. package/dist/pptx/render/chart-surface-treemap.mjs +1 -1
  119. package/dist/pptx/render/chart-treemap-hierarchy.d.ts +7 -9
  120. package/dist/pptx/render/chart-treemap-hierarchy.d.ts.map +1 -1
  121. package/dist/pptx/render/chart-trendlines.d.ts +3 -17
  122. package/dist/pptx/render/chart-trendlines.d.ts.map +1 -1
  123. package/dist/pptx/render/chart-view-model-points.d.ts +2 -23
  124. package/dist/pptx/render/chart-view-model-points.d.ts.map +1 -1
  125. package/dist/pptx/render/chart-view-model.cjs +44 -44
  126. package/dist/pptx/render/chart-view-model.mjs +1 -1
  127. package/dist/pptx/render/chart-waterfall-map.cjs +6 -6
  128. package/dist/pptx/render/chart-waterfall-map.mjs +1 -1
  129. package/dist/pptx/render/comment-navigation.d.ts +51 -0
  130. package/dist/pptx/render/comment-navigation.d.ts.map +1 -0
  131. package/dist/pptx/render/customization/customization-catalog.d.ts +9 -2
  132. package/dist/pptx/render/customization/customization-catalog.d.ts.map +1 -1
  133. package/dist/pptx/render/customization/customization-controller.d.ts +9 -1
  134. package/dist/pptx/render/customization/customization-controller.d.ts.map +1 -1
  135. package/dist/pptx/render/customization/customization-descriptions.d.ts +5 -1
  136. package/dist/pptx/render/customization/customization-descriptions.d.ts.map +1 -1
  137. package/dist/pptx/render/customization/customization-entry-points.d.ts +46 -0
  138. package/dist/pptx/render/customization/customization-entry-points.d.ts.map +1 -0
  139. package/dist/pptx/render/customization/customization-reference.d.ts.map +1 -1
  140. package/dist/pptx/render/customization/customization-regions.d.ts +131 -0
  141. package/dist/pptx/render/customization/customization-regions.d.ts.map +1 -0
  142. package/dist/pptx/render/customization/customization-resolve-regions.d.ts +11 -0
  143. package/dist/pptx/render/customization/customization-resolve-regions.d.ts.map +1 -0
  144. package/dist/pptx/render/customization/customization-resolve.d.ts +21 -2
  145. package/dist/pptx/render/customization/customization-resolve.d.ts.map +1 -1
  146. package/dist/pptx/render/customization/customization-surfaces.d.ts +21 -0
  147. package/dist/pptx/render/customization/customization-surfaces.d.ts.map +1 -1
  148. package/dist/pptx/render/customization/customization-types.d.ts +28 -2
  149. package/dist/pptx/render/customization/customization-types.d.ts.map +1 -1
  150. package/dist/pptx/render/customization/index.d.ts +2 -0
  151. package/dist/pptx/render/customization/index.d.ts.map +1 -1
  152. package/dist/pptx/render/customization/ribbon-control-catalog-core.d.ts +34 -2
  153. package/dist/pptx/render/customization/ribbon-control-catalog-core.d.ts.map +1 -1
  154. package/dist/pptx/render/customization/ribbon-control-catalog-tail.d.ts +61 -0
  155. package/dist/pptx/render/customization/ribbon-control-catalog-tail.d.ts.map +1 -1
  156. package/dist/pptx/render/customization/ribbon-control-catalog.d.ts +95 -2
  157. package/dist/pptx/render/customization/ribbon-control-catalog.d.ts.map +1 -1
  158. package/dist/pptx/render/customization/ribbon-control-visibility.d.ts +6 -1
  159. package/dist/pptx/render/customization/ribbon-control-visibility.d.ts.map +1 -1
  160. package/dist/pptx/render/editor-chrome/ribbon-css.d.ts +1 -1
  161. package/dist/pptx/render/editor-chrome/ribbon-css.d.ts.map +1 -1
  162. package/dist/pptx/render/index.d.ts +3 -1
  163. package/dist/pptx/render/index.d.ts.map +1 -1
  164. package/dist/pptx/render/morph-plan.d.ts.map +1 -1
  165. package/dist/pptx/render/ole-actions.d.ts +5 -3
  166. package/dist/pptx/render/ole-actions.d.ts.map +1 -1
  167. package/dist/pptx/render/options/index.d.ts +2 -0
  168. package/dist/pptx/render/options/index.d.ts.map +1 -1
  169. package/dist/pptx/render/options/options-dialog-binding.d.ts +60 -0
  170. package/dist/pptx/render/options/options-dialog-binding.d.ts.map +1 -0
  171. package/dist/pptx/render/options/options-dialog-model.d.ts +35 -0
  172. package/dist/pptx/render/options/options-dialog-model.d.ts.map +1 -0
  173. package/dist/pptx/render/review-comment-commands.d.ts +42 -0
  174. package/dist/pptx/render/review-comment-commands.d.ts.map +1 -0
  175. package/dist/pptx/render/ribbon-galleries/gallery-placements.d.ts.map +1 -1
  176. package/dist/pptx/render/ribbon-galleries/gallery-registry.d.ts.map +1 -1
  177. package/dist/pptx/render/ribbon-galleries/gallery-types.d.ts +9 -1
  178. package/dist/pptx/render/ribbon-galleries/gallery-types.d.ts.map +1 -1
  179. package/dist/pptx/render/ribbon-galleries/index.d.ts +2 -0
  180. package/dist/pptx/render/ribbon-galleries/index.d.ts.map +1 -1
  181. package/dist/pptx/render/ribbon-galleries/table-layout-commands.d.ts +7 -0
  182. package/dist/pptx/render/ribbon-galleries/table-layout-commands.d.ts.map +1 -0
  183. package/dist/pptx/render/ribbon-galleries/table-layout-ops.d.ts +64 -0
  184. package/dist/pptx/render/ribbon-galleries/table-layout-ops.d.ts.map +1 -0
  185. package/dist/pptx/render/ribbon-galleries/table-text-direction-gallery.d.ts +3 -0
  186. package/dist/pptx/render/ribbon-galleries/table-text-direction-gallery.d.ts.map +1 -0
  187. package/dist/pptx/render/ribbon-insert-layout.d.ts +56 -0
  188. package/dist/pptx/render/ribbon-insert-layout.d.ts.map +1 -0
  189. package/dist/pptx/render/ribbon-insert-state.d.ts +42 -2
  190. package/dist/pptx/render/ribbon-insert-state.d.ts.map +1 -1
  191. package/dist/pptx/render/ribbon-review-commands.d.ts +7 -0
  192. package/dist/pptx/render/ribbon-review-commands.d.ts.map +1 -1
  193. package/dist/pptx/render/toolbar-actions.d.ts +1 -1
  194. package/dist/pptx/render/toolbar-actions.d.ts.map +1 -1
  195. package/dist/pptx/render/viewer-props-manifest.d.ts +54 -0
  196. package/dist/pptx/render/viewer-props-manifest.d.ts.map +1 -0
  197. package/dist/pptx/web-components/index.d.ts.map +1 -1
  198. package/dist/pptx/web-components/office-aliases.d.ts +13 -0
  199. package/dist/pptx/web-components/office-aliases.d.ts.map +1 -1
  200. package/dist/pptx/web-components/office-token-bridge.d.ts +1 -1
  201. package/dist/pptx/web-components/office-token-bridge.d.ts.map +1 -1
  202. package/dist/pptx/web-components/options-dialog.d.ts +7 -0
  203. package/dist/pptx/web-components/options-dialog.d.ts.map +1 -0
  204. package/dist/pptx/web-components/ribbon-insert-dom.d.ts +28 -1
  205. package/dist/pptx/web-components/ribbon-insert-dom.d.ts.map +1 -1
  206. package/dist/pptx/web-components/ribbon-insert-icons.d.ts.map +1 -1
  207. package/dist/pptx/web-components/ribbon-insert-styles.d.ts.map +1 -1
  208. package/dist/pptx/web-components/ribbon-insert-table-picker.d.ts +16 -0
  209. package/dist/pptx/web-components/ribbon-insert-table-picker.d.ts.map +1 -0
  210. package/dist/pptx/web-components/ribbon-insert-view.d.ts +2 -1
  211. package/dist/pptx/web-components/ribbon-insert-view.d.ts.map +1 -1
  212. package/dist/pptx/web-components/ribbon-overflow.d.ts.map +1 -1
  213. package/dist/presence.js +3 -3
  214. package/dist/ribbon/auto-collapse.d.ts +8 -0
  215. package/dist/ribbon/auto-collapse.d.ts.map +1 -0
  216. package/dist/ribbon/group-overflow.d.ts +7 -0
  217. package/dist/ribbon/group-overflow.d.ts.map +1 -1
  218. package/dist/ribbon/overflow.d.ts +7 -0
  219. package/dist/ribbon/overflow.d.ts.map +1 -1
  220. package/dist/ribbon/ribbon-tabs.d.ts +5 -0
  221. package/dist/ribbon/ribbon-tabs.d.ts.map +1 -1
  222. package/dist/ribbon/scroll-more.d.ts +17 -0
  223. package/dist/ribbon/scroll-more.d.ts.map +1 -0
  224. package/dist/smartart.js +3 -3
  225. package/dist/teams/activity-feed.d.ts +36 -0
  226. package/dist/teams/app/activity.d.ts +5 -0
  227. package/dist/teams/app/calendar-app.d.ts +2 -0
  228. package/dist/teams/app/chat-app.d.ts +11 -0
  229. package/dist/teams/app/chat-people-dialog.d.ts +38 -0
  230. package/dist/teams/app/controller.d.ts +3 -2
  231. package/dist/teams/app/dialog-base.d.ts +18 -0
  232. package/dist/teams/app/meeting-details.d.ts +63 -0
  233. package/dist/teams/app/meeting-dialog.d.ts +103 -0
  234. package/dist/teams/app/new-chat-dialog.d.ts +42 -0
  235. package/dist/teams/app/notify-delivery.d.ts +28 -0
  236. package/dist/teams/app/pinned-bar.d.ts +24 -0
  237. package/dist/teams/app/profile-menu.d.ts +18 -1
  238. package/dist/teams/app/settings-notifications.d.ts +9 -0
  239. package/dist/teams/app/store.d.ts +1 -1
  240. package/dist/teams/app/teams-app.d.ts +72 -5
  241. package/dist/teams/app/teams-settings.d.ts +5 -1
  242. package/dist/teams/app/thread-pane.d.ts +1 -1
  243. package/dist/teams/app-rail.d.ts +17 -3
  244. package/dist/teams/avatar.d.ts +2 -2
  245. package/dist/teams/base.d.ts +2 -0
  246. package/dist/teams/calendar-agenda.d.ts +30 -0
  247. package/dist/teams/calendar-view.d.ts +61 -0
  248. package/dist/teams/chat-composer.d.ts +32 -2
  249. package/dist/teams/chat-list.d.ts +41 -3
  250. package/dist/teams/chat-sidebar.d.ts +25 -0
  251. package/dist/teams/index.d.ts +6 -1
  252. package/dist/teams/people-picker.d.ts +37 -0
  253. package/dist/teams.js +6 -6
  254. package/dist/theme.js +2 -2
  255. package/dist/tokens.d.ts +7 -5
  256. package/dist/tokens.d.ts.map +1 -1
  257. package/dist/visio/locales/de-commands.d.ts +2 -0
  258. package/dist/visio/locales/de-text.d.ts +2 -0
  259. package/dist/visio/locales/en-commands.d.ts +2 -0
  260. package/dist/visio/locales/en-text.d.ts +2 -0
  261. package/dist/visio/locales/es-commands.d.ts +2 -0
  262. package/dist/visio/locales/es-text.d.ts +2 -0
  263. package/dist/visio/locales/fr-commands.d.ts +2 -0
  264. package/dist/visio/locales/fr-text.d.ts +2 -0
  265. package/dist/visio/locales/zh-CN-commands.d.ts +2 -0
  266. package/dist/visio/locales/zh-CN-text.d.ts +2 -0
  267. package/dist/visio/ribbon-home.d.ts +1 -1
  268. package/dist/visio/ribbon-locale.d.ts +11 -0
  269. package/dist/visio/ribbon-localize.d.ts +9 -0
  270. package/dist/visio/ribbon-tab-cue.d.ts +8 -0
  271. package/dist/visio/shapes-document.d.ts +5 -0
  272. package/dist/visio/shapes-files-ui.d.ts +13 -0
  273. package/dist/visio/shapes-master-list.d.ts +5 -0
  274. package/dist/visio/shapes-sections.d.ts +1 -4
  275. package/dist/visio/stencil-files.d.ts +36 -0
  276. package/dist/visio/styles.d.ts +1 -1
  277. package/dist/visio/viewer-chrome.d.ts +3 -3
  278. package/dist/visio/viewer-element.d.ts +2 -0
  279. package/dist/visio/viewer-gesture-state.d.ts +54 -0
  280. package/dist/visio/viewer-options-categories.d.ts +8 -0
  281. package/dist/visio/viewer-options.d.ts +3 -7
  282. package/dist/visio/viewer-touch-gestures.d.ts +17 -0
  283. package/dist/visio/viewer-touch-hit.d.ts +3 -0
  284. package/dist/visio/viewer-touch-long-press.d.ts +13 -0
  285. package/dist/visio/viewer-touch-math.d.ts +44 -0
  286. package/dist/visio.js +2425 -295
  287. package/dist/xlsx/backstage/index.d.ts +3 -0
  288. package/dist/xlsx/backstage/options-customize.d.ts +7 -0
  289. package/dist/xlsx/backstage/options-dialog.d.ts +13 -0
  290. package/dist/xlsx/commands/slicers.d.ts +9 -0
  291. package/dist/xlsx/commands/view.d.ts +3 -0
  292. package/dist/xlsx/dialogs/pivot-field-settings.d.ts +7 -0
  293. package/dist/xlsx/dialogs/pivot-group-dates.d.ts +6 -0
  294. package/dist/xlsx/dialogs/pivot-group.d.ts +3 -0
  295. package/dist/xlsx/dialogs/pivot-rows.d.ts +21 -0
  296. package/dist/xlsx/dialogs/pivot-values.d.ts +1 -1
  297. package/dist/xlsx/dialogs/scenario-manager.d.ts +2 -0
  298. package/dist/xlsx/dialogs/slicers.d.ts +9 -0
  299. package/dist/xlsx/dialogs/styles.d.ts +1 -1
  300. package/dist/xlsx/dialogs/what-if.d.ts +5 -0
  301. package/dist/xlsx/grid/page-break-layer.d.ts +3 -0
  302. package/dist/xlsx/grid/slicer.d.ts +22 -0
  303. package/dist/xlsx/grid/styles.d.ts +1 -1
  304. package/dist/xlsx/grid/timeline.d.ts +12 -0
  305. package/dist/xlsx/modules.d.ts +1 -0
  306. package/dist/xlsx/page-views/index.d.ts +7 -0
  307. package/dist/xlsx/page-views/page-layout-bands.d.ts +17 -0
  308. package/dist/xlsx/page-views/page-layout-css.d.ts +1 -0
  309. package/dist/xlsx/page-views/page-layout-editor.d.ts +21 -0
  310. package/dist/xlsx/page-views/page-layout-rulers.d.ts +3 -0
  311. package/dist/xlsx/page-views/page-layout-view.d.ts +8 -0
  312. package/dist/xlsx/print-pages.d.ts +7 -1
  313. package/dist/xlsx/ribbon/ribbon.d.ts +1 -1
  314. package/dist/xlsx/ribbon/tabs/contextual.d.ts +4 -0
  315. package/dist/xlsx/status-bar.d.ts +1 -1
  316. package/dist/xlsx.js +3015 -546
  317. package/package.json +2 -2
  318. package/dist/pptx/render/chart-number-format-pattern.d.ts +0 -35
  319. package/dist/pptx/render/chart-number-format-pattern.d.ts.map +0 -1
  320. package/dist/pptx/render/chart-number-format.d.ts +0 -21
  321. package/dist/pptx/render/chart-number-format.d.ts.map +0 -1
  322. package/dist/pptx/render/chart-waterfall-layout.d.ts +0 -20
  323. package/dist/pptx/render/chart-waterfall-layout.d.ts.map +0 -1
  324. package/dist/teams/app/navigation-drawer.d.ts +0 -26
  325. package/dist/xlsx/backstage/pages-options.d.ts +0 -7
@@ -1,7 +1,7 @@
1
1
  import { createIconSvg, paintIcon, getIcon } from './chunk-M6GF5ED2.js';
2
- import { initialsOf } from './chunk-L7JV5FVE.js';
3
- import { OfficeElement, controlStyles, definer, valueOn, flag, present, triState, withTokens, emit } from './chunk-OGNNNTKI.js';
4
- import { tok, OFFICE_TOKENS } from './chunk-SPNWHKSR.js';
2
+ import { initialsOf } from './chunk-KNC2UEUR.js';
3
+ import { OfficeElement, controlStyles, definer, valueOn, flag, present, triState, withTokens, emit } from './chunk-CWBSXK7P.js';
4
+ import { tok, OFFICE_TOKENS } from './chunk-LD3K2RDN.js';
5
5
  import { html, LitElement, nothing, render, svg } from 'lit';
6
6
  import { ifDefined } from 'lit/directives/if-defined.js';
7
7
  import { repeat } from 'lit/directives/repeat.js';
@@ -1496,8 +1496,14 @@ var OfficeUiPrintPreview = class extends OfficeElement {
1496
1496
  };
1497
1497
  var definePrintPreview = definer("office-ui-print-preview", () => OfficeUiPrintPreview);
1498
1498
 
1499
+ // src/ribbon/auto-collapse.ts
1500
+ var SHORT_VIEWPORT_MEDIA = "(max-height: 500px)";
1501
+ function resolveCollapsed(shortViewport, userChoice) {
1502
+ return userChoice ?? shortViewport;
1503
+ }
1504
+
1499
1505
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/ribbon/ribbon-tabs.css?raw
1500
- var ribbon_tabs_default = ":host {\n display: block;\n min-width: 0;\n}\n.head {\n display: flex;\n align-items: stretch;\n min-width: 0;\n border-bottom: var(--office-border-width) solid var(--office-border);\n}\n.file {\n flex: none;\n min-height: var(--office-ribbon-tab-height);\n margin: 0 var(--office-space-1) 0 0;\n padding: var(--office-space-1-5) var(--office-space-4);\n border: 0;\n border-radius: 0;\n background: var(--office-accent);\n color: var(--office-accent-foreground);\n font: inherit;\n font-size: var(--office-font-size);\n cursor: pointer;\n}\n.file:hover {\n background: var(--office-accent-hover);\n}\n.file[hidden] {\n display: none;\n}\n[role='tablist'] {\n display: flex;\n flex: 0 1 auto;\n align-items: stretch;\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n[role='tab'] {\n position: relative;\n flex: none;\n min-height: var(--office-ribbon-tab-height);\n padding: var(--office-space-1-5) var(--office-space-3);\n border: 0;\n border-radius: 0;\n background: transparent;\n color: var(--office-muted-foreground);\n font: inherit;\n font-size: var(--office-font-size);\n cursor: pointer;\n}\n[role='tab']:hover {\n color: var(--office-foreground);\n background: var(--office-surface);\n}\n[role='tab'][aria-selected='true'] {\n color: var(--office-accent);\n}\n[role='tab'][aria-selected='true']::after {\n content: '';\n position: absolute;\n inset: auto 0 0;\n height: var(--office-tab-indicator-width);\n background: var(--office-accent);\n}\n[role='tab'][data-contextual],\n[role='tab'][data-contextual][aria-selected='true'] {\n color: var(--office-ribbon-contextual);\n}\n[role='tab'][data-contextual][aria-selected='true']::after {\n background: var(--office-ribbon-contextual);\n}\n.file:focus-visible,\n[role='tab']:focus-visible {\n outline: var(--office-focus-width) solid var(--office-ring);\n outline-offset: calc(-1 * var(--office-focus-width));\n}\n::slotted([slot='search']) {\n align-self: center;\n}\n/* The auto start margin keeps the actions, and the collapse button after them, at the right end of\n the tab row even while the slot is empty. */\nslot[name='actions'] {\n display: flex;\n flex: none;\n align-items: center;\n gap: var(--office-space-1);\n margin-inline: auto var(--office-space-1);\n}\n\n.collapse {\n flex: none;\n align-self: center;\n width: var(--office-target-size);\n height: var(--office-target-size);\n margin-inline: 0 var(--office-space-1);\n padding: 0;\n border: 0;\n border-radius: var(--office-radius-sm);\n background: none;\n color: var(--office-muted-foreground);\n cursor: pointer;\n}\n.collapse[hidden] {\n display: none;\n}\n.collapse:hover {\n background: var(--office-surface);\n}\n.collapse:focus-visible {\n outline: var(--office-focus-width) solid var(--office-ring);\n}\n.collapse .glyph {\n width: var(--office-icon-size);\n height: var(--office-icon-size);\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n transform: rotate(90deg);\n}\n.collapse[aria-pressed='true'] .glyph {\n transform: rotate(-90deg);\n}\n:host([collapsed][peek]) {\n position: relative;\n}\n:host([collapsed][peek]) ::slotted([data-ribbon-tab]:not([hidden])) {\n position: absolute;\n inset: 100% 0 auto;\n z-index: 60;\n border-bottom: var(--office-border-width) solid var(--office-border);\n background: var(--office-background);\n box-shadow: var(--office-shadow);\n}\n\n@media (max-width: 760px), (pointer: coarse) {\n .file,\n [role='tab'] {\n min-height: var(--office-target-size-touch);\n }\n .file {\n min-width: var(--office-ribbon-file-min-width);\n }\n}\n@media (forced-colors: active) {\n .file {\n border: var(--office-border-width) solid ButtonText;\n }\n [role='tab'][aria-selected='true']::after {\n background: Highlight;\n }\n}\n";
1506
+ var ribbon_tabs_default = ":host {\n display: block;\n min-width: 0;\n}\n.head {\n display: flex;\n align-items: stretch;\n min-width: 0;\n border-bottom: var(--office-border-width) solid var(--office-border);\n}\n.file {\n flex: none;\n min-height: var(--office-ribbon-tab-height);\n margin: 0 var(--office-space-1) 0 0;\n padding: var(--office-space-1-5) var(--office-space-4);\n border: 0;\n border-radius: 0;\n background: var(--office-accent);\n color: var(--office-accent-foreground);\n font: inherit;\n font-size: var(--office-font-size);\n cursor: pointer;\n}\n.file:hover {\n background: var(--office-accent-hover);\n}\n.file[hidden] {\n display: none;\n}\n[role='tablist'] {\n display: flex;\n flex: 0 1 auto;\n align-items: stretch;\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: none;\n scroll-snap-type: x proximity;\n scroll-padding-inline: var(--office-space-4);\n overscroll-behavior-x: contain;\n -webkit-overflow-scrolling: touch;\n}\n[role='tablist']::-webkit-scrollbar {\n display: none;\n}\n[role='tab'] {\n scroll-snap-align: start;\n position: relative;\n flex: none;\n min-height: var(--office-ribbon-tab-height);\n padding: var(--office-space-1-5) var(--office-space-3);\n border: 0;\n border-radius: 0;\n background: transparent;\n color: var(--office-muted-foreground);\n font: inherit;\n font-size: var(--office-font-size);\n cursor: pointer;\n}\n[role='tab']:hover {\n color: var(--office-foreground);\n background: var(--office-surface);\n}\n[role='tab'][aria-selected='true'] {\n color: var(--office-accent);\n}\n[role='tab'][aria-selected='true']::after {\n content: '';\n position: absolute;\n inset: auto 0 0;\n height: var(--office-tab-indicator-width);\n background: var(--office-accent);\n}\n[role='tab'][data-contextual],\n[role='tab'][data-contextual][aria-selected='true'] {\n color: var(--office-ribbon-contextual);\n}\n[role='tab'][data-contextual][aria-selected='true']::after {\n background: var(--office-ribbon-contextual);\n}\n.file:focus-visible,\n[role='tab']:focus-visible {\n outline: var(--office-focus-width) solid var(--office-ring);\n outline-offset: calc(-1 * var(--office-focus-width));\n}\n::slotted([slot='search']) {\n align-self: center;\n}\n/* The auto start margin keeps the actions, and the collapse button after them, at the right end of\n the tab row even while the slot is empty. */\nslot[name='actions'] {\n display: flex;\n flex: none;\n align-items: center;\n gap: var(--office-space-1);\n margin-inline: auto var(--office-space-1);\n}\n\n.collapse {\n flex: none;\n align-self: center;\n width: var(--office-target-size);\n height: var(--office-target-size);\n margin-inline: 0 var(--office-space-1);\n padding: 0;\n border: 0;\n border-radius: var(--office-radius-sm);\n background: none;\n color: var(--office-muted-foreground);\n cursor: pointer;\n}\n.collapse[hidden] {\n display: none;\n}\n.collapse:hover {\n background: var(--office-surface);\n}\n.collapse:focus-visible {\n outline: var(--office-focus-width) solid var(--office-ring);\n}\n.collapse .glyph {\n width: var(--office-icon-size);\n height: var(--office-icon-size);\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n transform: rotate(90deg);\n}\n.collapse[aria-pressed='true'] .glyph {\n transform: rotate(-90deg);\n}\n:host([collapsed][peek]) {\n position: relative;\n}\n:host([collapsed][peek]) ::slotted([data-ribbon-tab]:not([hidden])) {\n position: absolute;\n inset: 100% 0 auto;\n z-index: 60;\n border-bottom: var(--office-border-width) solid var(--office-border);\n background: var(--office-background);\n box-shadow: var(--office-shadow);\n}\n\n@media (max-width: 760px), (pointer: coarse) {\n .file,\n [role='tab'] {\n min-height: var(--office-target-size-touch);\n }\n [role='tab'] {\n min-width: var(--office-target-size-touch);\n }\n}\n@media (pointer: coarse) {\n .collapse {\n width: var(--office-target-size-touch);\n height: var(--office-target-size-touch);\n }\n}\n@media (max-width: 760px), (pointer: coarse) {\n .file {\n min-width: var(--office-ribbon-file-min-width);\n }\n}\n/* A phone portrait row cannot hold the tabs and the actions: the tabs keep the first row (File and a\n scrolling tab strip) and the actions wrap under them. */\n@media (max-width: 520px) {\n .head {\n flex-wrap: wrap;\n }\n [role='tablist'] {\n flex: 1 1 12rem;\n }\n slot[name='actions'] {\n order: 2;\n }\n .collapse {\n order: 3;\n }\n}\n@media (forced-colors: active) {\n .file {\n border: var(--office-border-width) solid ButtonText;\n }\n [role='tab'][aria-selected='true']::after {\n background: Highlight;\n }\n}\n";
1501
1507
 
1502
1508
  // src/ribbon/ribbon-tabs.ts
1503
1509
  var OfficeUiRibbon = class extends OfficeElement {
@@ -1596,7 +1602,19 @@ var OfficeUiRibbon = class extends OfficeElement {
1596
1602
  };
1597
1603
  });
1598
1604
  }
1605
+ /** The user's own collapse choice; it wins over the automatic one on short viewports. */
1606
+ userCollapsed;
1607
+ shortQuery;
1608
+ /** Collapses to the tab row on a short viewport (phone landscape) unless the user chose. */
1609
+ applyAuto = () => {
1610
+ if (!this.collapsible) return;
1611
+ const next = resolveCollapsed(this.shortQuery?.matches ?? false, this.userCollapsed);
1612
+ if (next === this.collapsed) return;
1613
+ this.collapsed = next;
1614
+ this.peek = false;
1615
+ };
1599
1616
  setCollapsed(value) {
1617
+ this.userCollapsed = value;
1600
1618
  if (value === this.collapsed) return;
1601
1619
  this.collapsed = value;
1602
1620
  this.peek = false;
@@ -1617,6 +1635,7 @@ var OfficeUiRibbon = class extends OfficeElement {
1617
1635
  this.peek = false;
1618
1636
  }
1619
1637
  willUpdate(changed) {
1638
+ if (changed.has("collapsible")) this.applyAuto();
1620
1639
  if (changed.has("peek")) {
1621
1640
  const doc = this.ownerDocument;
1622
1641
  if (this.peek) doc.addEventListener("pointerdown", this.onOutside, true);
@@ -1656,6 +1675,9 @@ var OfficeUiRibbon = class extends OfficeElement {
1656
1675
  this.build();
1657
1676
  super.connectedCallback();
1658
1677
  this.addEventListener("keydown", this.onHostKey);
1678
+ this.shortQuery = this.ownerDocument.defaultView?.matchMedia?.(SHORT_VIEWPORT_MEDIA);
1679
+ this.shortQuery?.addEventListener("change", this.applyAuto);
1680
+ this.applyAuto();
1659
1681
  const Observer = this.ownerDocument.defaultView?.MutationObserver;
1660
1682
  this.watcher = Observer ? new Observer(() => this.build()) : void 0;
1661
1683
  this.watcher?.observe(this, {
@@ -1668,6 +1690,7 @@ var OfficeUiRibbon = class extends OfficeElement {
1668
1690
  super.disconnectedCallback();
1669
1691
  this.removeEventListener("keydown", this.onHostKey);
1670
1692
  this.watcher?.disconnect();
1693
+ this.shortQuery?.removeEventListener("change", this.applyAuto);
1671
1694
  this.ownerDocument.removeEventListener("pointerdown", this.onOutside, true);
1672
1695
  this.watcher = void 0;
1673
1696
  }
@@ -1677,6 +1700,14 @@ var OfficeUiRibbon = class extends OfficeElement {
1677
1700
  const hideAll = this.collapsed && !this.peek;
1678
1701
  for (const panel of this.panels())
1679
1702
  panel.hidden = hideAll || panel.dataset.ribbonTab !== selected;
1703
+ const active = this.tabButton(selected);
1704
+ const list = active?.parentElement;
1705
+ if (active && list && list.scrollWidth > list.clientWidth) {
1706
+ const tab = active.getBoundingClientRect();
1707
+ const view = list.getBoundingClientRect();
1708
+ if (tab.left < view.left) list.scrollLeft -= view.left - tab.left;
1709
+ else if (tab.right > view.right) list.scrollLeft += tab.right - view.right;
1710
+ }
1680
1711
  }
1681
1712
  render() {
1682
1713
  const selected = this.selected;
@@ -3772,39 +3803,123 @@ var OfficeUiMenuButton = class _OfficeUiMenuButton extends OfficeElement {
3772
3803
  }
3773
3804
  };
3774
3805
  var defineMenuButton = definer("office-ui-menu-button", () => OfficeUiMenuButton);
3775
-
3776
- // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/dialog/options-dialog.css?raw
3777
- var options_dialog_default = ":host {\n display: contents;\n}\noffice-ui-dialog {\n --office-dialog-width: var(--office-options-width);\n --office-dialog-max-width: var(--office-options-width);\n}\n.layout {\n display: grid;\n grid-template-columns: var(--office-options-nav-width) minmax(0, 1fr);\n gap: 0;\n min-height: var(--office-options-min-height);\n margin: calc(-1 * var(--office-space-4));\n}\nnav {\n display: flex;\n flex-direction: column;\n padding: var(--office-space-2) 0;\n border-inline-end: var(--office-border-width) solid var(--office-border);\n background: var(--office-surface);\n overflow: auto;\n}\nnav button {\n min-height: var(--office-options-row-height);\n padding: var(--office-space-1) var(--office-space-3-5);\n border: 0;\n border-radius: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: start;\n cursor: pointer;\n}\nnav button[aria-selected='true'] {\n background: var(--office-selected);\n font-weight: 600;\n box-shadow: inset var(--office-selection-bar-width) 0 0 var(--office-accent);\n}\nnav button:focus-visible {\n outline: var(--office-focus-width) solid var(--office-ring);\n outline-offset: calc(-1 * var(--office-focus-width));\n}\n[role='tabpanel'] {\n padding: var(--office-space-4) var(--office-space-5);\n overflow: auto;\n}\n.lead {\n margin: 0 0 var(--office-space-3);\n font-size: var(--office-font-size-md);\n}\n.unavailable {\n margin: 0 0 var(--office-space-3);\n color: var(--office-muted-foreground);\n}\nsection + section {\n margin-top: var(--office-space-4);\n}\nh3 {\n margin: 0 0 var(--office-space-2);\n padding-bottom: var(--office-space-1);\n border-bottom: var(--office-border-width) solid var(--office-border);\n font-size: var(--office-font-size);\n font-weight: 600;\n}\n.desc {\n margin: 0 0 var(--office-space-2);\n color: var(--office-muted-foreground);\n}\n.row {\n display: flex;\n align-items: center;\n gap: var(--office-space-2);\n min-height: var(--office-options-row-height);\n}\n.row.indent {\n padding-inline-start: var(--office-space-6);\n}\n.row.field > span:first-child {\n min-width: var(--office-options-label-width);\n}\n.row[data-disabled] {\n color: var(--office-muted-foreground);\n}\ninput[type='text'],\ninput[type='number'],\nselect {\n min-height: var(--office-input-height);\n box-sizing: border-box;\n font: inherit;\n border: var(--office-border-width) solid var(--office-border);\n border-radius: var(--office-radius-sm);\n background: var(--office-background);\n color: inherit;\n}\ninput[type='number'] {\n width: var(--office-options-number-width);\n}\n.info {\n display: inline-grid;\n place-items: center;\n width: var(--office-info-size);\n height: var(--office-info-size);\n border: var(--office-border-width) solid currentColor;\n border-radius: 50%;\n font-size: var(--office-font-size-2xs);\n color: var(--office-muted-foreground);\n cursor: help;\n}\n.actions {\n display: flex;\n gap: var(--office-space-2);\n}\n.actions button {\n min-width: var(--office-dialog-button-min-width);\n min-height: var(--office-control-height-md);\n font: inherit;\n cursor: pointer;\n}\n@media (max-width: 600px) {\n .layout {\n grid-template-columns: 1fr;\n }\n nav {\n flex-direction: row;\n border-inline-end: 0;\n border-bottom: var(--office-border-width) solid var(--office-border);\n }\n nav button {\n white-space: nowrap;\n }\n .row.field {\n flex-wrap: wrap;\n }\n}\n";
3778
-
3779
- // src/dialog/options-dialog.ts
3780
3806
  function clampOptionNumber(raw, min, max) {
3781
3807
  const parsed = Number(raw);
3782
3808
  return Number.isFinite(parsed) && raw.trim() !== "" ? Math.min(max, Math.max(min, parsed)) : void 0;
3783
3809
  }
3810
+ function optionRow(host, control) {
3811
+ const { draft } = host;
3812
+ const value = draft[control.key];
3813
+ const locked = Boolean(control.disabled) || control.enabledBy && draft[control.enabledBy] !== true;
3814
+ const disabled = Boolean(locked);
3815
+ const info = control.info ? html`<span class="info" title=${control.info} role="img" aria-label=${control.info}>i</span>` : "";
3816
+ const label = html`<span class="label">${control.label}${info}</span>`;
3817
+ let body;
3818
+ if (control.kind === "toggle")
3819
+ body = html`${label}<input
3820
+ type="checkbox"
3821
+ .checked=${value === true}
3822
+ ?disabled=${disabled}
3823
+ @change=${(event) => host.set(control.key, event.target.checked)}
3824
+ />`;
3825
+ else if (control.kind === "select") {
3826
+ const current = String(value ?? control.choices[0]?.value ?? "");
3827
+ body = html`${label}<select
3828
+ aria-label=${control.label}
3829
+ ?disabled=${disabled}
3830
+ @change=${(event) => host.set(control.key, event.target.value)}
3831
+ >
3832
+ ${control.choices.map(
3833
+ (choice) => html`<option value=${choice.value} .selected=${choice.value === current}
3834
+ >${choice.label}</option
3835
+ >`
3836
+ )}
3837
+ </select>`;
3838
+ } else if (control.kind === "number")
3839
+ body = html`${label}<span class="number"
3840
+ ><input
3841
+ type="number"
3842
+ min=${control.min}
3843
+ max=${control.max}
3844
+ step=${ifDefined(control.step ? String(control.step) : void 0)}
3845
+ aria-label=${control.label}
3846
+ .value=${value === void 0 ? "" : String(value)}
3847
+ ?disabled=${disabled}
3848
+ @change=${(event) => {
3849
+ const field = event.target;
3850
+ const next = clampOptionNumber(field.value, control.min, control.max);
3851
+ if (next === void 0) field.value = String(draft[control.key] ?? "");
3852
+ else {
3853
+ field.value = String(next);
3854
+ host.set(control.key, next);
3855
+ }
3856
+ }}
3857
+ />${control.unit ? html`<span class="unit">${control.unit}</span>` : ""}</span
3858
+ >`;
3859
+ else
3860
+ body = html`${label}<input
3861
+ type="text"
3862
+ maxlength=${ifDefined(control.maxLength ? String(control.maxLength) : void 0)}
3863
+ aria-label=${control.label}
3864
+ .value=${value === void 0 ? "" : String(value)}
3865
+ ?disabled=${disabled}
3866
+ @input=${(event) => host.set(control.key, event.target.value)}
3867
+ />`;
3868
+ return html`<label
3869
+ class="row${control.indent ? " indent" : ""}"
3870
+ data-key=${control.key}
3871
+ ?data-disabled=${disabled}
3872
+ title=${ifDefined(control.disabled)}
3873
+ >${body}</label
3874
+ >`;
3875
+ }
3876
+
3877
+ // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/dialog/options-dialog.css?raw
3878
+ var options_dialog_default = ":host {\n display: contents;\n}\noffice-ui-dialog {\n --office-dialog-width: var(--office-options-width);\n --office-dialog-max-width: var(--office-options-width);\n --office-dialog-max-height: 88vh;\n}\n.custom {\n max-height: calc(88vh - var(--office-options-chrome-height));\n overflow: auto;\n font-size: var(--office-font-size-sm);\n}\n.layout {\n display: grid;\n grid-template-columns: var(--office-options-nav-width) minmax(0, 1fr);\n height: var(--office-options-height);\n max-height: calc(88vh - var(--office-options-chrome-height));\n margin: calc(-1 * var(--office-space-4));\n font-size: var(--office-font-size-sm);\n}\nnav {\n display: flex;\n flex-direction: column;\n gap: var(--office-space-0);\n padding: var(--office-space-2);\n border-inline-end: var(--office-border-width) solid var(--office-border);\n overflow: auto;\n}\nnav button {\n padding: var(--office-space-2) var(--office-space-2-5);\n border: 0;\n border-radius: var(--office-radius);\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: start;\n white-space: nowrap;\n cursor: pointer;\n}\nnav button:hover {\n background: var(--office-selected);\n}\nnav button[aria-selected='true'] {\n background: color-mix(in srgb, var(--office-accent) 14%, transparent);\n color: var(--office-accent);\n font-weight: 600;\n}\nnav button:focus-visible {\n outline: var(--office-focus-width) solid var(--office-ring);\n outline-offset: calc(-1 * var(--office-focus-width));\n}\n[role='tabpanel'] {\n min-width: 0;\n padding: var(--office-space-3-5) var(--office-space-5);\n overflow: auto;\n}\n.lead {\n margin: 0 0 var(--office-space-3);\n font-weight: 600;\n}\n.unavailable {\n margin: 0 0 var(--office-space-3);\n color: var(--office-muted-foreground);\n}\nsection {\n margin: 0 0 var(--office-space-4);\n}\nh3 {\n margin: 0 0 var(--office-space-1);\n padding-bottom: var(--office-space-0);\n border-bottom: var(--office-border-width) solid var(--office-border);\n color: var(--office-muted-foreground);\n font-size: var(--office-font-size-2xs);\n font-weight: 700;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n}\n.desc {\n margin: 0 0 var(--office-space-2);\n color: var(--office-muted-foreground);\n font-size: var(--office-font-size-xs);\n}\n.row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--office-space-3);\n min-height: var(--office-options-row-height);\n padding: var(--office-space-0) 0;\n cursor: pointer;\n}\n.row.indent {\n padding-inline-start: var(--office-space-6);\n}\n.row[data-disabled] {\n color: var(--office-muted-foreground);\n cursor: default;\n}\n.label {\n display: inline-flex;\n align-items: center;\n gap: var(--office-space-1);\n min-width: 0;\n}\ninput[type='text'],\ninput[type='number'],\nselect {\n box-sizing: border-box;\n max-width: 55%;\n padding: var(--office-space-1) var(--office-space-1-5);\n border: var(--office-border-width) solid var(--office-field-border);\n border-radius: var(--office-field-radius);\n background: var(--office-field-background);\n color: var(--office-field-foreground);\n font: inherit;\n}\ninput[type='text']:focus-visible,\ninput[type='number']:focus-visible,\nselect:focus-visible {\n border-color: var(--office-field-border-focus);\n outline: var(--office-focus-width) solid var(--office-ring);\n outline-offset: calc(-1 * var(--office-focus-width));\n}\ninput[type='text'] {\n width: var(--office-options-text-width);\n}\ninput[type='number'] {\n width: var(--office-options-number-width);\n text-align: end;\n}\ninput:disabled,\nselect:disabled {\n opacity: 0.55;\n}\ninput[type='checkbox'] {\n flex: none;\n width: var(--office-options-check-size);\n height: var(--office-options-check-size);\n margin: 0;\n appearance: none;\n display: inline-grid;\n place-content: center;\n box-sizing: border-box;\n border: var(--office-border-width) solid var(--office-checkbox-border);\n border-radius: var(--office-checkbox-radius);\n background: var(--office-checkbox-background);\n cursor: inherit;\n}\ninput[type='checkbox']:checked {\n border-color: var(--office-checkbox-accent);\n background: var(--office-checkbox-accent);\n}\ninput[type='checkbox']:checked::after {\n content: '';\n width: calc(var(--office-options-check-size) * 0.7);\n height: calc(var(--office-options-check-size) * 0.7);\n background: var(--office-checkbox-accent-foreground);\n clip-path: polygon(14% 52%, 0 66%, 38% 100%, 100% 22%, 86% 8%, 38% 72%);\n}\ninput[type='checkbox']:focus-visible {\n outline: var(--office-focus-width) solid var(--office-ring);\n outline-offset: var(--office-focus-offset);\n}\n@media (forced-colors: active) {\n input[type='checkbox']:checked {\n background: Highlight;\n }\n input[type='checkbox']:checked::after {\n background: HighlightText;\n }\n}\n.number {\n display: inline-flex;\n align-items: center;\n gap: var(--office-space-1-5);\n}\n.unit {\n color: var(--office-muted-foreground);\n font-size: var(--office-font-size-xs);\n}\n.info {\n display: inline-grid;\n place-items: center;\n flex: none;\n width: var(--office-info-size);\n height: var(--office-info-size);\n border: var(--office-border-width) solid currentColor;\n border-radius: 50%;\n font-size: var(--office-font-size-3xs);\n font-style: normal;\n color: var(--office-accent);\n opacity: 0.75;\n cursor: help;\n}\n.actions {\n display: flex;\n flex: 1;\n justify-content: flex-end;\n gap: var(--office-space-2);\n}\n.actions button {\n min-width: var(--office-dialog-button-min-width);\n min-height: var(--office-control-height-md);\n padding: 0 var(--office-space-3);\n border: var(--office-border-width) solid var(--office-border);\n border-radius: var(--office-radius);\n background: var(--office-surface);\n color: inherit;\n font: inherit;\n font-size: var(--office-font-size-sm);\n cursor: pointer;\n}\n.actions button:hover {\n background: var(--office-selected);\n}\n.actions .primary {\n border-color: var(--office-accent);\n background: var(--office-accent);\n color: var(--office-accent-foreground);\n}\n.actions .primary:hover {\n background: var(--office-accent);\n filter: brightness(1.08);\n}\n@media (max-width: 767px) {\n .layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n nav {\n flex-direction: row;\n border-inline-end: 0;\n border-bottom: var(--office-border-width) solid var(--office-border);\n }\n nav button,\n .actions button {\n min-height: var(--office-target-size-touch);\n }\n .row {\n min-height: var(--office-target-size-touch);\n }\n input[type='text'],\n input[type='number'],\n select {\n min-height: var(--office-target-size-touch);\n }\n .actions {\n flex-wrap: wrap;\n }\n}\n@media (forced-colors: active) {\n nav button[aria-selected='true'] {\n outline: var(--office-border-width) solid Highlight;\n }\n}\n";
3879
+
3880
+ // src/dialog/options-dialog.ts
3881
+ var DEFAULT_LABELS = {
3882
+ ok: "OK",
3883
+ cancel: "Cancel",
3884
+ reset: "Reset all options",
3885
+ categories: "Categories",
3886
+ close: "Close"
3887
+ };
3784
3888
  var OfficeUiOptionsDialog = class extends OfficeElement {
3785
3889
  static styles = controlStyles(options_dialog_default);
3786
3890
  static properties = {
3787
3891
  open: flag,
3892
+ live: flag,
3893
+ customBody: { ...flag, attribute: "custom-body" },
3788
3894
  heading: { type: String },
3789
3895
  categories: { attribute: false },
3896
+ defaults: { attribute: false },
3897
+ labels: { attribute: false },
3790
3898
  // `values` keeps a private copy and `category` validates its id, so both have accessors.
3791
3899
  active: { state: true }
3792
3900
  };
3793
3901
  committed = {};
3794
- draft = {};
3902
+ draftValues = {};
3795
3903
  constructor() {
3796
3904
  super();
3797
3905
  this.open = false;
3906
+ this.live = false;
3907
+ this.customBody = false;
3798
3908
  this.heading = null;
3799
3909
  this.categories = [];
3910
+ this.defaults = null;
3911
+ this.labels = {};
3800
3912
  this.active = "";
3801
3913
  }
3914
+ get draft() {
3915
+ return this.draftValues;
3916
+ }
3802
3917
  get values() {
3803
3918
  return { ...this.committed };
3804
3919
  }
3805
3920
  set values(value) {
3806
3921
  this.committed = { ...value };
3807
- if (!present(this.open)) this.draft = { ...value };
3922
+ if (!present(this.open) || present(this.live)) this.draftValues = { ...value };
3808
3923
  this.requestUpdate("values");
3809
3924
  }
3810
3925
  /** The selected category id. */
@@ -3817,16 +3932,33 @@ var OfficeUiOptionsDialog = class extends OfficeElement {
3817
3932
  show() {
3818
3933
  this.open = true;
3819
3934
  }
3935
+ /** Closes without applying: the draft is dropped and `office-options-cancel` is emitted. */
3820
3936
  close() {
3937
+ const wasOpen = present(this.open);
3821
3938
  this.open = false;
3939
+ if (wasOpen) this.fire("office-options-cancel", {});
3822
3940
  }
3823
3941
  commit() {
3824
- const changed = Object.keys(this.draft).filter(
3825
- (key) => this.draft[key] !== this.committed[key]
3942
+ const changed = Object.keys(this.draftValues).filter(
3943
+ (key) => this.draftValues[key] !== this.committed[key]
3826
3944
  );
3827
- this.committed = { ...this.draft };
3945
+ this.committed = { ...this.draftValues };
3828
3946
  this.fire("office-options-change", { values: { ...this.committed }, changed });
3829
- this.close();
3947
+ this.open = false;
3948
+ }
3949
+ resetAll() {
3950
+ if (present(this.live)) {
3951
+ this.fire("office-options-reset", {});
3952
+ return;
3953
+ }
3954
+ this.draftValues = { ...this.draftValues, ...this.defaults };
3955
+ this.requestUpdate();
3956
+ }
3957
+ /** Panes the product slots in sit outside the dialog's own focus trap: let Tab walk through them. */
3958
+ onPaneKey(event) {
3959
+ if (event.key !== "Tab") return;
3960
+ const origin = event.composedPath()[0];
3961
+ if (origin instanceof Node && !this.renderRoot.contains(origin)) event.stopPropagation();
3830
3962
  }
3831
3963
  onNavKey(event) {
3832
3964
  const tabs = [...this.renderRoot.querySelectorAll('nav [role="tab"]')];
@@ -3838,76 +3970,37 @@ var OfficeUiOptionsDialog = class extends OfficeElement {
3838
3970
  this.category = target.dataset.category;
3839
3971
  this.renderRoot.querySelector('nav [aria-selected="true"]')?.focus();
3840
3972
  }
3973
+ /** Native controls and popups follow the theme: dark when `--office-background` is dark. */
3974
+ syncColorScheme() {
3975
+ const probe = this.ownerDocument.createElement("span");
3976
+ probe.style.cssText = "display:none;background-color:var(--office-background)";
3977
+ this.renderRoot.append(probe);
3978
+ const match = /\d+(\.\d+)?/g;
3979
+ let background = "";
3980
+ try {
3981
+ background = getComputedStyle(probe).backgroundColor;
3982
+ } catch {
3983
+ }
3984
+ probe.remove();
3985
+ if (!background) return;
3986
+ const [r = 255, g = 255, b = 255] = (background.match(match) ?? []).slice(0, 3).map(Number);
3987
+ this.style.colorScheme = 0.2126 * r + 0.7152 * g + 0.0722 * b < 128 ? "dark" : "light";
3988
+ }
3989
+ updated(changed) {
3990
+ if (changed.has("open") && present(this.open)) this.syncColorScheme();
3991
+ if (changed.has("active") && this.active)
3992
+ this.fire("office-options-category", { id: this.active });
3993
+ }
3841
3994
  willUpdate(changed) {
3842
3995
  if (!this.categories.some((category) => category.id === this.active))
3843
3996
  this.active = this.categories[0]?.id ?? "";
3844
- if (changed.has("open") && present(this.open)) this.draft = { ...this.committed };
3997
+ if (changed.has("open") && present(this.open)) this.draftValues = { ...this.committed };
3845
3998
  }
3846
3999
  set(key, next) {
3847
- this.draft[key] = next;
3848
- }
3849
- control(control) {
3850
- const value = this.draft[control.key];
3851
- const disabled = Boolean(control.disabled);
3852
- const info = control.info ? html`<span class="info" title=${control.info} role="img" aria-label=${control.info}
3853
- >i</span
3854
- >` : "";
3855
- let body;
3856
- if (control.kind === "toggle")
3857
- body = html`<input
3858
- type="checkbox"
3859
- .checked=${value === true}
3860
- ?disabled=${disabled}
3861
- @change=${(event) => this.set(control.key, event.target.checked)}
3862
- /><span>${control.label}</span>`;
3863
- else if (control.kind === "select") {
3864
- const current = String(value ?? control.choices[0]?.value ?? "");
3865
- body = html`<span>${control.label}</span
3866
- ><select
3867
- ?disabled=${disabled}
3868
- @change=${(event) => this.set(control.key, event.target.value)}
3869
- >
3870
- ${control.choices.map(
3871
- (choice) => html`<option value=${choice.value} ?selected=${choice.value === current}
3872
- >${choice.label}</option
3873
- >`
3874
- )}
3875
- </select>`;
3876
- } else if (control.kind === "number")
3877
- body = html`<span>${control.label}</span
3878
- ><input
3879
- type="number"
3880
- min=${control.min}
3881
- max=${control.max}
3882
- step=${ifDefined(control.step ? String(control.step) : void 0)}
3883
- .value=${value === void 0 ? "" : String(value)}
3884
- ?disabled=${disabled}
3885
- @change=${(event) => {
3886
- const field = event.target;
3887
- const next = clampOptionNumber(field.value, control.min, control.max);
3888
- if (next === void 0) field.value = String(this.draft[control.key] ?? "");
3889
- else {
3890
- field.value = String(next);
3891
- this.set(control.key, next);
3892
- }
3893
- }}
3894
- />${control.unit ? html`<span>${control.unit}</span>` : ""}`;
3895
- else
3896
- body = html`<span>${control.label}</span
3897
- ><input
3898
- type="text"
3899
- maxlength=${ifDefined(control.maxLength ? String(control.maxLength) : void 0)}
3900
- .value=${value === void 0 ? "" : String(value)}
3901
- ?disabled=${disabled}
3902
- @input=${(event) => this.set(control.key, event.target.value)}
3903
- />`;
3904
- return html`<label
3905
- class="row${control.indent ? " indent" : ""}${control.kind === "toggle" ? "" : " field"}"
3906
- data-key=${control.key}
3907
- ?data-disabled=${disabled}
3908
- title=${ifDefined(control.disabled)}
3909
- >${body}${info}</label
3910
- >`;
4000
+ this.draftValues[key] = next;
4001
+ if (present(this.live)) this.committed[key] = next;
4002
+ this.fire("office-option-input", { key, value: next });
4003
+ this.requestUpdate();
3911
4004
  }
3912
4005
  pane(category) {
3913
4006
  if (!category) return "";
@@ -3918,54 +4011,71 @@ var OfficeUiOptionsDialog = class extends OfficeElement {
3918
4011
  (section) => html`<section>
3919
4012
  <h3>${section.title}</h3>
3920
4013
  ${section.description ? html`<p class="desc">${section.description}</p>` : ""}
3921
- ${section.controls.map((control) => this.control(control))}
4014
+ ${section.controls.map((control) => optionRow(this, control))}
4015
+ ${section.slot ? html`<slot name=${section.slot}></slot>` : ""}
3922
4016
  </section>`
3923
4017
  )}
4018
+ ${category.custom ? html`<slot name="pane-${category.id}"></slot>` : ""}
3924
4019
  `;
3925
4020
  }
3926
4021
  render() {
3927
4022
  const category = this.categories.find((entry) => entry.id === this.active);
4023
+ const text = { ...DEFAULT_LABELS, ...this.labels };
3928
4024
  return html`
3929
4025
  <office-ui-dialog
3930
4026
  heading=${this.heading ?? "Options"}
4027
+ close-label=${text.close}
3931
4028
  ?open=${present(this.open)}
3932
4029
  @office-dialog-close=${(event) => {
3933
- if (!event.defaultPrevented) this.close();
4030
+ if (event.defaultPrevented) return;
4031
+ if (present(this.live)) this.commit();
4032
+ else this.close();
3934
4033
  }}
3935
4034
  >
3936
- <div class="layout">
3937
- <nav
3938
- role="tablist"
3939
- aria-orientation="vertical"
3940
- aria-label="Categories"
3941
- @keydown=${this.onNavKey}
3942
- >
3943
- ${this.categories.map(
4035
+ ${present(this.customBody) ? html`<div class="custom" @keydown=${this.onPaneKey}><slot name="body"></slot></div>` : this.layout(category, text)}
4036
+ </office-ui-dialog>
4037
+ `;
4038
+ }
4039
+ layout(category, text) {
4040
+ return html`
4041
+ <div class="layout">
4042
+ <nav
4043
+ role="tablist"
4044
+ aria-orientation="vertical"
4045
+ aria-label=${text.categories}
4046
+ @keydown=${this.onNavKey}
4047
+ >
4048
+ ${this.categories.map(
3944
4049
  (entry) => html`<button
3945
- type="button"
3946
- role="tab"
3947
- id="tab-${entry.id}"
3948
- data-category=${entry.id}
3949
- aria-controls="pane"
3950
- aria-selected=${String(entry.id === this.active)}
3951
- tabindex=${entry.id === this.active ? 0 : -1}
3952
- @click=${() => this.category = entry.id}
3953
- >${entry.label}</button
3954
- >`
4050
+ type="button"
4051
+ role="tab"
4052
+ id="tab-${entry.id}"
4053
+ data-category=${entry.id}
4054
+ aria-controls="pane"
4055
+ aria-selected=${String(entry.id === this.active)}
4056
+ tabindex=${entry.id === this.active ? 0 : -1}
4057
+ @click=${() => this.category = entry.id}
4058
+ >${entry.label}</button
4059
+ >`
3955
4060
  )}
3956
- </nav>
3957
- <div
3958
- role="tabpanel"
3959
- id="pane"
3960
- aria-labelledby=${ifDefined(category ? `tab-${category.id}` : void 0)}
3961
- >${this.pane(category)}</div
3962
- >
3963
- </div>
3964
- <div slot="footer" class="actions">
3965
- <button type="button" data-action="ok" @click=${this.commit}>OK</button>
3966
- <button type="button" data-action="cancel" @click=${this.close}>Cancel</button>
3967
- </div>
3968
- </office-ui-dialog>
4061
+ </nav>
4062
+ <div
4063
+ role="tabpanel"
4064
+ id="pane"
4065
+ @keydown=${this.onPaneKey}
4066
+ aria-labelledby=${ifDefined(category ? `tab-${category.id}` : void 0)}
4067
+ >${this.pane(category)}</div
4068
+ >
4069
+ </div>
4070
+ <div slot="footer" class="actions">
4071
+ ${this.defaults ? html`<button type="button" class="reset" data-action="reset" @click=${this.resetAll}>
4072
+ ${text.reset}
4073
+ </button>` : ""}
4074
+ <button type="button" data-action="cancel" @click=${this.close}>${text.cancel}</button>
4075
+ <button type="button" class="primary" data-action="ok" @click=${this.commit}>
4076
+ ${text.ok}
4077
+ </button>
4078
+ </div>
3969
4079
  `;
3970
4080
  }
3971
4081
  };
@@ -4430,7 +4540,7 @@ var OfficeUiSelect = class extends OfficeElement {
4430
4540
  var defineSelect = definer("office-ui-select", () => OfficeUiSelect);
4431
4541
 
4432
4542
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/chrome/status-bar.css?raw
4433
- var status_bar_default = ":host {\n display: flex;\n align-items: center;\n gap: var(--office-space-3);\n min-height: var(--office-status-bar-height);\n padding: 0 var(--office-space-2);\n font-size: var(--office-font-size-xs);\n background: var(--office-surface);\n color: var(--office-foreground);\n border-top: var(--office-border-width) solid var(--office-border);\n font-family: var(--office-font);\n}\n::slotted([slot='end']) {\n margin-inline-start: auto;\n}\n.bar {\n display: contents;\n}\n[hidden] {\n display: none !important;\n}\n:host([data-controlled]) {\n display: block;\n flex: none;\n padding: 0;\n gap: 0;\n}\n:host([data-controlled]) .bar {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--office-space-1);\n width: 100%;\n min-height: var(--office-status-bar-height);\n padding: var(--office-space-0) var(--office-space-2);\n color: var(--office-muted-foreground);\n}\n:host([data-controlled]) ::slotted([slot='end']) {\n margin-inline-start: 0;\n}\n.items {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n.item {\n flex: none;\n white-space: nowrap;\n}\n.item + .item::before {\n content: '';\n display: inline-block;\n width: var(--office-border-width);\n height: var(--office-space-3);\n margin: 0 var(--office-space-2);\n vertical-align: middle;\n background: var(--office-border);\n opacity: var(--office-status-bar-separator-opacity);\n}\n.item.saving {\n color: var(--office-warning);\n}\n.item.error {\n color: var(--office-danger);\n}\n.spacer {\n flex: 1;\n}\n.toggles,\n.group {\n display: flex;\n align-items: center;\n gap: var(--office-space-0);\n}\n.sep {\n flex: none;\n width: var(--office-border-width);\n height: var(--office-space-3);\n margin: 0 var(--office-space-0);\n background: var(--office-border);\n opacity: var(--office-status-bar-separator-opacity);\n}\n.bar button {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--office-space-1);\n min-width: var(--office-control-height-xs);\n min-height: var(--office-control-height-xs);\n padding: var(--office-space-1);\n border: 0;\n border-radius: var(--office-radius-sm);\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n touch-action: manipulation;\n}\n.bar button:hover {\n background: var(--office-selected);\n color: var(--office-foreground);\n}\n.bar button[aria-pressed='true'] {\n color: var(--office-accent);\n}\n.bar button:active {\n opacity: 0.8;\n}\n.bar button:focus-visible {\n outline: var(--office-focus-width) solid var(--office-ring);\n outline-offset: var(--office-focus-offset);\n}\n.bar svg {\n flex: none;\n width: var(--office-icon-size);\n height: var(--office-icon-size);\n fill: none;\n stroke: currentColor;\n stroke-width: var(--office-icon-stroke);\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n.toggle svg,\n.zoom-step svg {\n width: var(--office-icon-size-sm);\n height: var(--office-icon-size-sm);\n}\n.zoom-fit {\n min-width: var(--office-zoom-value-width);\n font-variant-numeric: tabular-nums;\n}\n@media (max-width: 767px) {\n .narrow-hide,\n .toggle .label {\n display: none !important;\n }\n}\n@media (pointer: coarse) {\n .bar button {\n min-width: var(--office-target-size-touch);\n min-height: var(--office-target-size-touch);\n }\n}\n@media (forced-colors: active) {\n :host {\n background: Canvas;\n color: CanvasText;\n border-top-color: CanvasText;\n }\n .bar button {\n color: ButtonText;\n }\n .bar button:hover {\n background: Highlight;\n color: HighlightText;\n }\n .bar button[aria-pressed='true'] {\n border: var(--office-border-width) solid Highlight;\n }\n .bar button:focus-visible {\n outline-color: Highlight;\n }\n .sep,\n .item + .item::before {\n background: CanvasText;\n }\n}\n";
4543
+ var status_bar_default = ":host {\n display: flex;\n align-items: center;\n gap: var(--office-space-3);\n min-height: var(--office-status-bar-height);\n padding: 0 var(--office-space-2);\n font-size: var(--office-font-size-xs);\n background: var(--office-surface);\n color: var(--office-foreground);\n border-top: var(--office-border-width) solid var(--office-border);\n font-family: var(--office-font);\n}\n::slotted([slot='end']) {\n margin-inline-start: auto;\n}\n.bar {\n display: contents;\n}\n[hidden] {\n display: none !important;\n}\n:host([data-controlled]) {\n display: block;\n flex: none;\n padding: 0;\n gap: 0;\n}\n:host([data-controlled]) .bar {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--office-space-1);\n width: 100%;\n min-height: var(--office-status-bar-height);\n padding: var(--office-space-0) var(--office-space-2);\n color: var(--office-muted-foreground);\n}\n:host([data-controlled]) ::slotted([slot='end']) {\n margin-inline-start: 0;\n}\n.items {\n display: flex;\n flex: 0 1 auto;\n align-items: center;\n min-width: 0;\n overflow: hidden;\n}\n.item {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n/* The page counter is the one text that stays whole. */\n.item[aria-live] {\n flex: none;\n}\n.item + .item::before {\n content: '';\n display: inline-block;\n width: var(--office-border-width);\n height: var(--office-space-3);\n margin: 0 var(--office-space-2);\n vertical-align: middle;\n background: var(--office-border);\n opacity: var(--office-status-bar-separator-opacity);\n}\n.item.saving {\n color: var(--office-warning);\n}\n.item.error {\n color: var(--office-danger);\n}\n.spacer {\n flex: 1;\n}\n.toggles,\n.group {\n display: flex;\n align-items: center;\n gap: var(--office-space-0);\n}\n.sep {\n flex: none;\n width: var(--office-border-width);\n height: var(--office-space-3);\n margin: 0 var(--office-space-0);\n background: var(--office-border);\n opacity: var(--office-status-bar-separator-opacity);\n}\n.bar button {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--office-space-1);\n min-width: var(--office-control-height-xs);\n min-height: var(--office-control-height-xs);\n padding: var(--office-space-1);\n border: 0;\n border-radius: var(--office-radius-sm);\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n touch-action: manipulation;\n}\n.bar button:hover {\n background: var(--office-selected);\n color: var(--office-foreground);\n}\n.bar button[aria-pressed='true'] {\n color: var(--office-accent);\n}\n.bar button:active {\n opacity: 0.8;\n}\n.bar button:focus-visible {\n outline: var(--office-focus-width) solid var(--office-ring);\n outline-offset: var(--office-focus-offset);\n}\n.bar svg {\n flex: none;\n width: var(--office-icon-size);\n height: var(--office-icon-size);\n fill: none;\n stroke: currentColor;\n stroke-width: var(--office-icon-stroke);\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n.toggle svg,\n.zoom-step svg {\n width: var(--office-icon-size-sm);\n height: var(--office-icon-size-sm);\n}\n.zoom-fit {\n min-width: var(--office-zoom-value-width);\n font-variant-numeric: tabular-nums;\n}\n@media (max-width: 767px) {\n .narrow-hide,\n .toggle .label {\n display: none !important;\n }\n}\n@media (pointer: coarse) {\n .bar button {\n min-width: var(--office-touch-target, 44px);\n min-height: var(--office-touch-target, 44px);\n }\n}\n@media (forced-colors: active) {\n :host {\n background: Canvas;\n color: CanvasText;\n border-top-color: CanvasText;\n }\n .bar button {\n color: ButtonText;\n }\n .bar button:hover {\n background: Highlight;\n color: HighlightText;\n }\n .bar button[aria-pressed='true'] {\n border: var(--office-border-width) solid Highlight;\n }\n .bar button:focus-visible {\n outline-color: Highlight;\n }\n .sep,\n .item + .item::before {\n background: CanvasText;\n }\n}\n";
4434
4544
 
4435
4545
  // src/chrome/status-bar.ts
4436
4546
  var OfficeUiStatusBar = class extends OfficeElement {
@@ -5958,6 +6068,43 @@ function runKeyTips(root, targets, onDone, className) {
5958
6068
  return stop;
5959
6069
  }
5960
6070
 
6071
+ // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/ribbon/scroll-more.css?raw
6072
+ var scroll_more_default = ".ribbon-scroll-more {\n position: sticky;\n right: 0;\n z-index: 2;\n flex: none;\n align-self: center;\n margin-left: auto;\n width: 28px;\n height: 40px;\n padding: 0;\n border: 1px solid var(--office-border, #c8c6c4);\n border-radius: 4px;\n background: var(--office-background, #fff);\n color: var(--office-foreground, #201f1e);\n font-size: 20px;\n line-height: 1;\n box-shadow: -6px 0 6px -2px rgb(0 0 0 / 12%);\n cursor: pointer;\n}\n\n@media (pointer: coarse) {\n .ribbon-scroll-more {\n width: var(--office-target-size-touch, 44px);\n height: var(--office-target-size-touch, 44px);\n }\n /* The ribbon grows to fit 44px targets instead of clipping them. */\n .ribbon-panel {\n height: auto !important;\n min-height: 104px;\n -webkit-overflow-scrolling: touch;\n }\n .ribbon-panel .ribbon-group button,\n .ribbon-panel .ribbon-group select,\n .ribbon-panel .ribbon-group input,\n .ribbon-panel .ribbon-group .ribbon-overflow-button {\n min-width: var(--office-target-size-touch, 44px);\n min-height: var(--office-target-size-touch, 44px);\n }\n}\n";
6073
+
6074
+ // src/ribbon/scroll-more.ts
6075
+ var STYLE_ID = "office-ui-ribbon-touch-style";
6076
+ var CLASS = "ribbon-scroll-more";
6077
+ function ensureRibbonTouchStyle(node) {
6078
+ const root = node.getRootNode();
6079
+ const doc = node.ownerDocument ?? node;
6080
+ const host = root instanceof ShadowRoot ? root : doc.head;
6081
+ if (!host || host.querySelector(`#${STYLE_ID}`)) return;
6082
+ const style = doc.createElement("style");
6083
+ style.id = STYLE_ID;
6084
+ style.textContent = scroll_more_default;
6085
+ host.append(style);
6086
+ }
6087
+ function syncScrollMore(panel, label = "More") {
6088
+ panel.querySelector(`:scope > .${CLASS}`)?.remove();
6089
+ if (panel.hidden || panel.scrollWidth <= panel.clientWidth + 1) return;
6090
+ ensureRibbonTouchStyle(panel);
6091
+ const doc = panel.ownerDocument;
6092
+ const text = typeof label === "function" ? label(panel) : label;
6093
+ const button = doc.createElement("button");
6094
+ button.type = "button";
6095
+ button.className = CLASS;
6096
+ button.setAttribute("aria-label", text);
6097
+ button.title = text;
6098
+ button.textContent = "\u203A";
6099
+ button.addEventListener("mousedown", (event) => event.preventDefault());
6100
+ button.addEventListener("click", () => {
6101
+ const end = panel.scrollWidth - panel.clientWidth - 2;
6102
+ const left = panel.scrollLeft >= end ? 0 : panel.scrollLeft + panel.clientWidth * 0.8;
6103
+ panel.scrollTo({ left, behavior: "smooth" });
6104
+ });
6105
+ panel.append(button);
6106
+ }
6107
+
5961
6108
  // src/ribbon/overflow.ts
5962
6109
  function createRibbonOverflow(options) {
5963
6110
  let closeOpen;
@@ -6043,6 +6190,8 @@ function createRibbonOverflow(options) {
6043
6190
  }
6044
6191
  function fitPanel(panel) {
6045
6192
  if (panel.hidden || !panel.clientWidth) return;
6193
+ ensureRibbonTouchStyle(panel);
6194
+ panel.querySelector(":scope > .ribbon-scroll-more")?.remove();
6046
6195
  if (closeOpen && panel.dataset.fittedWidth === String(panel.clientWidth)) return;
6047
6196
  panel.dataset.fittedWidth = String(panel.clientWidth);
6048
6197
  closeOpen?.();
@@ -6069,6 +6218,7 @@ function createRibbonOverflow(options) {
6069
6218
  button.title = label;
6070
6219
  group.setAttribute("data-collapsed", "");
6071
6220
  }
6221
+ syncScrollMore(panel, options.moreLabel);
6072
6222
  }
6073
6223
  const panelsOf2 = (root) => root.querySelectorAll(".ribbon-panel");
6074
6224
  return {
@@ -6080,7 +6230,32 @@ function createRibbonOverflow(options) {
6080
6230
  for (const entry of entries) fitPanel(entry.target);
6081
6231
  });
6082
6232
  for (const panel of panelsOf2(root)) observer.observe(panel);
6083
- return () => observer.disconnect();
6233
+ let frame = 0;
6234
+ const mutations = new MutationObserver(() => {
6235
+ if (frame) return;
6236
+ frame = requestAnimationFrame(() => {
6237
+ frame = 0;
6238
+ refitVisible();
6239
+ mutations.takeRecords();
6240
+ });
6241
+ });
6242
+ const refitVisible = () => {
6243
+ for (const panel of panelsOf2(root)) {
6244
+ if (panel.hidden || panel.querySelector('[aria-expanded="true"].ribbon-overflow-button'))
6245
+ continue;
6246
+ const more = panel.querySelector(":scope > .ribbon-scroll-more");
6247
+ const clipped = panel.scrollWidth - (more?.offsetWidth ?? 0) > panel.clientWidth + 1;
6248
+ const unfolded = panel.querySelector(":scope > .ribbon-group:not([data-collapsed])");
6249
+ if (clipped && unfolded) fitPanel(panel);
6250
+ }
6251
+ };
6252
+ for (const panel of panelsOf2(root))
6253
+ mutations.observe(panel, { childList: true, subtree: true });
6254
+ return () => {
6255
+ observer.disconnect();
6256
+ mutations.disconnect();
6257
+ if (frame) cancelAnimationFrame(frame);
6258
+ };
6084
6259
  },
6085
6260
  refit(root) {
6086
6261
  for (const panel of panelsOf2(root)) fitPanel(panel);
@@ -6104,6 +6279,7 @@ function fitRibbonGroups(panel, options = {}) {
6104
6279
  group.removeAttribute("data-open");
6105
6280
  group.removeAttribute("data-collapsed");
6106
6281
  }
6282
+ panel.querySelector(":scope > .ribbon-scroll-more")?.remove();
6107
6283
  const width = panel.ownerDocument.defaultView?.innerWidth ?? Number.POSITIVE_INFINITY;
6108
6284
  if (panel.hidden || width < (options.minWidth ?? 0)) return [];
6109
6285
  const overflows = () => panel.scrollWidth - panel.clientWidth > 1;
@@ -6116,6 +6292,7 @@ function fitRibbonGroups(panel, options = {}) {
6116
6292
  collapsed.push(group.getAttribute("label") ?? "");
6117
6293
  if (!overflows()) break;
6118
6294
  }
6295
+ syncScrollMore(panel, options.moreLabel);
6119
6296
  return collapsed;
6120
6297
  }
6121
6298
  function place(group) {
@@ -6225,6 +6402,128 @@ function attachRibbonGroupOverflow(ribbon, options = {}) {
6225
6402
  };
6226
6403
  }
6227
6404
 
6405
+ // src/dialog/options-categories.ts
6406
+ var UNAVAILABLE = {
6407
+ proofing: {
6408
+ id: "proofing",
6409
+ label: "Proofing",
6410
+ description: "Change how {product} corrects and formats your text.",
6411
+ reason: "Not available yet. Needs rich text formatting."
6412
+ },
6413
+ save: {
6414
+ id: "save",
6415
+ label: "Save",
6416
+ description: "Customize how documents are saved.",
6417
+ reason: "Not available yet. Documents are saved to this device; AutoRecover is not kept."
6418
+ },
6419
+ language: {
6420
+ id: "language",
6421
+ label: "Language",
6422
+ description: "Set the Office Language Preferences.",
6423
+ reason: "Not available yet. The display language is fixed."
6424
+ },
6425
+ accessibility: {
6426
+ id: "accessibility",
6427
+ label: "Accessibility",
6428
+ description: "Make {product} easier to work with.",
6429
+ reason: "Not available yet. There are no accessibility settings to change."
6430
+ },
6431
+ advanced: {
6432
+ id: "advanced",
6433
+ label: "Advanced",
6434
+ description: "Advanced options for working with {product}.",
6435
+ reason: "Not available yet. The editing behaviour is fixed."
6436
+ },
6437
+ ribbon: {
6438
+ id: "ribbon",
6439
+ label: "Customize Ribbon",
6440
+ description: "Customize the Ribbon and keyboard shortcuts.",
6441
+ reason: "Not available yet. The ribbon layout is fixed."
6442
+ },
6443
+ qat: {
6444
+ id: "qat",
6445
+ label: "Quick Access Toolbar",
6446
+ description: "Customize the Quick Access Toolbar.",
6447
+ reason: "Not available yet. The Quick Access Toolbar is fixed."
6448
+ },
6449
+ addins: {
6450
+ id: "add-ins",
6451
+ label: "Add-ins",
6452
+ description: "View and manage Microsoft Office Add-ins.",
6453
+ reason: "Not available. Add-ins and macros are never run."
6454
+ },
6455
+ trust: {
6456
+ id: "trust",
6457
+ label: "Trust Center",
6458
+ description: "Help keep your documents safe and your computer secure and healthy.",
6459
+ reason: "Not available. Documents stay local and active content is never run."
6460
+ }
6461
+ };
6462
+ function optionText(context, text) {
6463
+ return context.t(text).replace("{product}", context.product);
6464
+ }
6465
+ function unavailableCategory(context, kind, text = {}) {
6466
+ const entry = UNAVAILABLE[kind];
6467
+ return {
6468
+ id: entry.id,
6469
+ label: context.t(entry.label),
6470
+ description: optionText(context, text.description ?? entry.description),
6471
+ sections: [],
6472
+ disabled: optionText(context, text.reason ?? entry.reason)
6473
+ };
6474
+ }
6475
+ function unavailableControl(context, control, reason) {
6476
+ return { ...control, disabled: context.t(reason) };
6477
+ }
6478
+ function userInterfaceSection(context) {
6479
+ const { t } = context;
6480
+ return {
6481
+ id: "ui",
6482
+ title: t("User Interface options"),
6483
+ controls: [
6484
+ {
6485
+ kind: "toggle",
6486
+ key: "miniToolbar",
6487
+ label: t("Show Mini Toolbar on selection"),
6488
+ disabled: t("Not available yet. Needs rich text formatting.")
6489
+ },
6490
+ {
6491
+ kind: "toggle",
6492
+ key: "livePreview",
6493
+ label: t("Enable Live Preview"),
6494
+ disabled: t(
6495
+ "Not available yet. Styles are applied on click; hover previews are not drawn yet."
6496
+ )
6497
+ },
6498
+ {
6499
+ kind: "select",
6500
+ key: "screenTips",
6501
+ label: t("ScreenTip style"),
6502
+ choices: [{ value: "descriptions", label: t("Show feature descriptions in ScreenTips") }],
6503
+ disabled: t("Not available yet. ScreenTips always describe the command.")
6504
+ }
6505
+ ]
6506
+ };
6507
+ }
6508
+ function personalizeSection(context, controls, description) {
6509
+ return {
6510
+ id: "personalize",
6511
+ title: context.t("Personalize your copy of Microsoft Office"),
6512
+ ...description ? { description } : {},
6513
+ controls
6514
+ };
6515
+ }
6516
+ function optionsLabels(context) {
6517
+ const { t } = context;
6518
+ return {
6519
+ ok: t("OK"),
6520
+ cancel: t("Cancel"),
6521
+ reset: t("Reset all options"),
6522
+ categories: t("Categories"),
6523
+ close: t("Close")
6524
+ };
6525
+ }
6526
+
6228
6527
  // src/controls.ts
6229
6528
  var CONTROL_DEFINERS = [
6230
6529
  defineIcon,
@@ -6273,4 +6572,4 @@ function registerControls(registry) {
6273
6572
  for (const define of CONTROL_DEFINERS) define(registry);
6274
6573
  }
6275
6574
 
6276
- 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, glyph, nextEnabledIndex, parseOfficeSymbolCode, parseSvgPreview, profileInitials, rangeControl, range_control_default, readOfficeProfile, registerControls, rulerDivisions, runKeyTips, sanitizeOfficeProfile, typeAheadIndex, writeOfficeProfile };
6575
+ 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, glyph, nextEnabledIndex, optionText, optionsLabels, parseOfficeSymbolCode, parseSvgPreview, personalizeSection, profileInitials, rangeControl, range_control_default, readOfficeProfile, registerControls, rulerDivisions, runKeyTips, sanitizeOfficeProfile, typeAheadIndex, unavailableCategory, unavailableControl, userInterfaceSection, writeOfficeProfile };