ooxml-ui 1.12.2 → 1.13.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 (156) hide show
  1. package/custom-elements.json +19 -4
  2. package/dist/chrome/status-layout.d.ts +23 -0
  3. package/dist/{chunk-GI3WX6LZ.js → chunk-3XST4F6J.js} +1 -1
  4. package/dist/{chunk-S6ZXU442.js → chunk-7E3HU7RL.js} +1 -1
  5. package/dist/{chunk-PXIYHFZ5.js → chunk-ANPFMQ6E.js} +1 -1
  6. package/dist/{chunk-FUQYUUIQ.js → chunk-BFPHRWEB.js} +356 -99
  7. package/dist/{chunk-OGNNNTKI.js → chunk-CWBSXK7P.js} +1 -1
  8. package/dist/{chunk-3H5NR32A.js → chunk-D7JPVAYS.js} +319 -202
  9. package/dist/{chunk-NLJVBHLG.js → chunk-EL2A3BDM.js} +5 -5
  10. package/dist/{chunk-L7JV5FVE.js → chunk-KNC2UEUR.js} +1 -1
  11. package/dist/{chunk-SPNWHKSR.js → chunk-LD3K2RDN.js} +7 -5
  12. package/dist/chunk-UBBC5FH7.js +31 -0
  13. package/dist/{chunk-HZSYGNNB.js → chunk-VRVFLYGI.js} +1 -0
  14. package/dist/controls.d.ts +2 -1
  15. package/dist/controls.d.ts.map +1 -1
  16. package/dist/controls.js +4 -4
  17. package/dist/dialog/options-categories.d.ts +39 -0
  18. package/dist/dialog/options-categories.d.ts.map +1 -0
  19. package/dist/dialog/options-controls.d.ts +49 -0
  20. package/dist/dialog/options-controls.d.ts.map +1 -0
  21. package/dist/dialog/options-dialog.d.ts +35 -41
  22. package/dist/dialog/options-dialog.d.ts.map +1 -1
  23. package/dist/docx/auto-fit.d.ts +10 -0
  24. package/dist/docx/backstage-customize.d.ts +7 -0
  25. package/dist/docx/backstage-options.d.ts +13 -3
  26. package/dist/docx/backstage-pages.d.ts +0 -6
  27. package/dist/docx/backstage.d.ts +3 -0
  28. package/dist/docx/canvas-click.d.ts +7 -0
  29. package/dist/docx/locales/en-app.d.ts +1 -0
  30. package/dist/docx/locales/en.d.ts +5 -0
  31. package/dist/docx/locales/options.d.ts +11 -0
  32. package/dist/docx/localization-strings.d.ts +5 -0
  33. package/dist/docx/page-controller.d.ts +17 -3
  34. package/dist/docx/print-editing.d.ts +2 -0
  35. package/dist/docx/print-layout-view.d.ts +2 -0
  36. package/dist/docx/status-bar.d.ts +1 -1
  37. package/dist/docx.js +531 -218
  38. package/dist/form/color-swatches.d.ts +8 -5
  39. package/dist/form/color-swatches.d.ts.map +1 -1
  40. package/dist/index.js +10 -10
  41. package/dist/pptx/{chunk-5AD3V3PA.mjs → chunk-CB2DZVKL.mjs} +127 -1
  42. package/dist/pptx/{chunk-4EHNTVSN.mjs → chunk-DZUSNYRA.mjs} +1310 -216
  43. package/dist/pptx/{chunk-Y7CDPPMZ.cjs → chunk-J3GEBMYK.cjs} +127 -1
  44. package/dist/pptx/{chunk-LMZK4UNY.cjs → chunk-J4HVGXPW.cjs} +1333 -213
  45. package/dist/pptx/dom/elements/table.d.ts.map +1 -1
  46. package/dist/pptx/dom/index.cjs +209 -206
  47. package/dist/pptx/dom/index.mjs +8 -5
  48. package/dist/pptx/dom/load-presentation.d.ts +3 -1
  49. package/dist/pptx/dom/load-presentation.d.ts.map +1 -1
  50. package/dist/pptx/dom/slide-stage.d.ts +3 -1
  51. package/dist/pptx/dom/slide-stage.d.ts.map +1 -1
  52. package/dist/pptx/dom/types.d.ts +6 -1
  53. package/dist/pptx/dom/types.d.ts.map +1 -1
  54. package/dist/pptx/i18n/index.cjs +6 -6
  55. package/dist/pptx/i18n/index.mjs +1 -1
  56. package/dist/pptx/i18n/translations-en-galleries-data.d.ts.map +1 -1
  57. package/dist/pptx/i18n/translations-en-table-layout.d.ts +3 -0
  58. package/dist/pptx/i18n/translations-en-table-layout.d.ts.map +1 -0
  59. package/dist/pptx/i18n/translations-en.d.ts.map +1 -1
  60. package/dist/pptx/index.cjs +2838 -2758
  61. package/dist/pptx/index.mjs +2 -2
  62. package/dist/pptx/render/action-buttons.d.ts +2 -0
  63. package/dist/pptx/render/action-buttons.d.ts.map +1 -1
  64. package/dist/pptx/render/comment-navigation.d.ts +51 -0
  65. package/dist/pptx/render/comment-navigation.d.ts.map +1 -0
  66. package/dist/pptx/render/customization/ribbon-control-catalog-tail.d.ts +61 -0
  67. package/dist/pptx/render/customization/ribbon-control-catalog-tail.d.ts.map +1 -1
  68. package/dist/pptx/render/customization/ribbon-control-catalog.d.ts +61 -0
  69. package/dist/pptx/render/customization/ribbon-control-catalog.d.ts.map +1 -1
  70. package/dist/pptx/render/index.d.ts +2 -0
  71. package/dist/pptx/render/index.d.ts.map +1 -1
  72. package/dist/pptx/render/review-comment-commands.d.ts +42 -0
  73. package/dist/pptx/render/review-comment-commands.d.ts.map +1 -0
  74. package/dist/pptx/render/ribbon-galleries/gallery-placements.d.ts.map +1 -1
  75. package/dist/pptx/render/ribbon-galleries/gallery-registry.d.ts.map +1 -1
  76. package/dist/pptx/render/ribbon-galleries/gallery-types.d.ts +17 -1
  77. package/dist/pptx/render/ribbon-galleries/gallery-types.d.ts.map +1 -1
  78. package/dist/pptx/render/ribbon-galleries/gallery-view.d.ts.map +1 -1
  79. package/dist/pptx/render/ribbon-galleries/index.d.ts +2 -0
  80. package/dist/pptx/render/ribbon-galleries/index.d.ts.map +1 -1
  81. package/dist/pptx/render/ribbon-galleries/shape-styles-gallery.d.ts.map +1 -1
  82. package/dist/pptx/render/ribbon-galleries/table-layout-commands.d.ts +7 -0
  83. package/dist/pptx/render/ribbon-galleries/table-layout-commands.d.ts.map +1 -0
  84. package/dist/pptx/render/ribbon-galleries/table-layout-ops.d.ts +64 -0
  85. package/dist/pptx/render/ribbon-galleries/table-layout-ops.d.ts.map +1 -0
  86. package/dist/pptx/render/ribbon-galleries/table-style-tile-svg.d.ts +7 -3
  87. package/dist/pptx/render/ribbon-galleries/table-style-tile-svg.d.ts.map +1 -1
  88. package/dist/pptx/render/ribbon-galleries/table-styles-gallery.d.ts.map +1 -1
  89. package/dist/pptx/render/ribbon-galleries/table-text-direction-gallery.d.ts +3 -0
  90. package/dist/pptx/render/ribbon-galleries/table-text-direction-gallery.d.ts.map +1 -0
  91. package/dist/pptx/render/ribbon-galleries/theme-colors-gallery.d.ts.map +1 -1
  92. package/dist/pptx/render/ribbon-galleries/theme-fonts-gallery.d.ts.map +1 -1
  93. package/dist/pptx/render/ribbon-home-families-objects.d.ts.map +1 -1
  94. package/dist/pptx/render/ribbon-home-spec.d.ts +10 -6
  95. package/dist/pptx/render/ribbon-home-spec.d.ts.map +1 -1
  96. package/dist/pptx/render/ribbon-review-commands.d.ts +7 -0
  97. package/dist/pptx/render/ribbon-review-commands.d.ts.map +1 -1
  98. package/dist/pptx/render/shape-quick-styles.d.ts +6 -0
  99. package/dist/pptx/render/shape-quick-styles.d.ts.map +1 -1
  100. package/dist/pptx/render/table-style-borders.d.ts.map +1 -1
  101. package/dist/pptx/render/table-style-builtins-data.d.ts +7 -1
  102. package/dist/pptx/render/table-style-builtins-data.d.ts.map +1 -1
  103. package/dist/pptx/render/table-style-scheme.d.ts +2 -0
  104. package/dist/pptx/render/table-style-scheme.d.ts.map +1 -1
  105. package/dist/pptx/render/table-style-theme-refs.d.ts +16 -0
  106. package/dist/pptx/render/table-style-theme-refs.d.ts.map +1 -0
  107. package/dist/pptx/render/table-style.d.ts +7 -1
  108. package/dist/pptx/render/table-style.d.ts.map +1 -1
  109. package/dist/pptx/render/theme-color-swatches.d.ts +1 -1
  110. package/dist/pptx/render/theme-color-swatches.d.ts.map +1 -1
  111. package/dist/pptx/render/toolbar-actions.d.ts +1 -1
  112. package/dist/pptx/render/toolbar-actions.d.ts.map +1 -1
  113. package/dist/pptx/web-components/ribbon-draw-view.d.ts.map +1 -1
  114. package/dist/pptx/web-components/ribbon-home-colour.d.ts.map +1 -1
  115. package/dist/pptx/web-components/ribbon-insert-view.d.ts.map +1 -1
  116. package/dist/presence.js +3 -3
  117. package/dist/{presentation-preview-VIIU7E2S.js → presentation-preview-HVKJ3KJN.js} +1 -1
  118. package/dist/ribbon/auto-collapse.d.ts +8 -0
  119. package/dist/ribbon/auto-collapse.d.ts.map +1 -0
  120. package/dist/ribbon/group-overflow.d.ts +7 -0
  121. package/dist/ribbon/group-overflow.d.ts.map +1 -1
  122. package/dist/ribbon/overflow.d.ts +7 -0
  123. package/dist/ribbon/overflow.d.ts.map +1 -1
  124. package/dist/ribbon/ribbon-tabs.d.ts +5 -0
  125. package/dist/ribbon/ribbon-tabs.d.ts.map +1 -1
  126. package/dist/ribbon/scroll-more.d.ts +17 -0
  127. package/dist/ribbon/scroll-more.d.ts.map +1 -0
  128. package/dist/smartart.js +3 -3
  129. package/dist/teams/app/activity.d.ts +5 -0
  130. package/dist/teams/app/pinned-bar.d.ts +24 -0
  131. package/dist/teams/app/profile-menu.d.ts +18 -1
  132. package/dist/teams/app/teams-app.d.ts +8 -3
  133. package/dist/teams/app-rail.d.ts +3 -1
  134. package/dist/teams/avatar.d.ts +2 -2
  135. package/dist/teams/chat-list.d.ts +10 -2
  136. package/dist/teams.js +7 -7
  137. package/dist/theme.js +2 -2
  138. package/dist/tokens.d.ts +7 -5
  139. package/dist/tokens.d.ts.map +1 -1
  140. package/dist/visio/viewer-gesture-state.d.ts +54 -0
  141. package/dist/visio/viewer-options-categories.d.ts +8 -0
  142. package/dist/visio/viewer-options.d.ts +3 -7
  143. package/dist/visio/viewer-touch-gestures.d.ts +17 -0
  144. package/dist/visio/viewer-touch-hit.d.ts +3 -0
  145. package/dist/visio/viewer-touch-long-press.d.ts +13 -0
  146. package/dist/visio/viewer-touch-math.d.ts +44 -0
  147. package/dist/visio.js +319 -149
  148. package/dist/xlsx/backstage/index.d.ts +3 -0
  149. package/dist/xlsx/backstage/options-customize.d.ts +7 -0
  150. package/dist/xlsx/backstage/options-dialog.d.ts +13 -0
  151. package/dist/xlsx/ribbon/ribbon.d.ts +1 -1
  152. package/dist/xlsx/status-bar.d.ts +1 -1
  153. package/dist/xlsx.js +282 -172
  154. package/package.json +2 -2
  155. package/dist/teams/app/navigation-drawer.d.ts +0 -26
  156. package/dist/xlsx/backstage/pages-options.d.ts +0 -7
package/dist/xlsx.js CHANGED
@@ -1,18 +1,19 @@
1
+ import { statusLayout, watchStatusWidth } from './chunk-UBBC5FH7.js';
1
2
  import { trackPointerGesture } from './chunk-GSXOZCAN.js';
2
- import './chunk-NLJVBHLG.js';
3
- import { syncRibbonAddIns } from './chunk-GI3WX6LZ.js';
4
- export { RIBBON_ADD_IN_EVENT } from './chunk-GI3WX6LZ.js';
5
- import { defineSmartArt } from './chunk-PXIYHFZ5.js';
6
- import { withExtension, saveExtension, downloadBytes, emit, emitEvent, blobFor, announceFileCommand, pickFile } from './chunk-3H5NR32A.js';
7
- export { XLSX_EDITOR_EVENTS } from './chunk-3H5NR32A.js';
8
- import './chunk-HZSYGNNB.js';
9
- import { shadcnBridge } from './chunk-S6ZXU442.js';
10
- import { range_control_default, createRibbonOverflow, defineBackstage, defineRibbon, defineRibbonActions, defineTitleBar, defineStatusBar, defineZoomSlider, rangeControl, defineDialog, runKeyTips, assignKeyTips, defineCheckbox, defineGallery, defineColorGrid, defineContextMenu, defineCommentsPane, parseSvgPreview } from './chunk-FUQYUUIQ.js';
3
+ import './chunk-EL2A3BDM.js';
4
+ import { syncRibbonAddIns } from './chunk-3XST4F6J.js';
5
+ export { RIBBON_ADD_IN_EVENT } from './chunk-3XST4F6J.js';
6
+ import { defineSmartArt } from './chunk-ANPFMQ6E.js';
7
+ import { withExtension, saveExtension, downloadBytes, emit, emitEvent, blobFor, announceFileCommand, pickFile } from './chunk-D7JPVAYS.js';
8
+ export { XLSX_EDITOR_EVENTS } from './chunk-D7JPVAYS.js';
9
+ import './chunk-VRVFLYGI.js';
10
+ import { shadcnBridge } from './chunk-7E3HU7RL.js';
11
+ import { range_control_default, createRibbonOverflow, defineBackstage, defineRibbon, defineRibbonActions, defineTitleBar, defineStatusBar, defineZoomSlider, defineOptionsDialog, rangeControl, defineDialog, optionsLabels, runKeyTips, assignKeyTips, userInterfaceSection, personalizeSection, optionText, unavailableControl, unavailableCategory, defineGallery, defineColorGrid, defineContextMenu, defineCommentsPane, parseSvgPreview } from './chunk-BFPHRWEB.js';
11
12
  import { getIcon, registerIcon } from './chunk-M6GF5ED2.js';
12
- import { definePresence } from './chunk-L7JV5FVE.js';
13
- import { withTokens } from './chunk-OGNNNTKI.js';
14
- import './chunk-SPNWHKSR.js';
15
- import { SPECIAL_CODES, FRACTION_CODES, AUTOSUM_FUNCTIONS, themeToCssVars, lightTheme, darkTheme, ICON_ACCENTS, ICON_PATHS, normalizeThemeMode, applyThemeColors, parseSelectionRef, selectionRef, normalizeEditorLocale, DirtyState, createCommandRegistry, createDialogRegistry, activeRef, createSelectionModel, SheetSelections, translator, initialSelection, sheetBaseName, historyOf, onRibbonTabsChange, activeChart, editChart, ribbonTabs, isTabHidden, selectTab, setTabHidden, tabButton, searchCommands, formatNumber, TEMPLATES, createTemplateWorkbook, isMenuSeparator, registerRibbonTabs, installFormatPainter, SHEET_ICONS, clipboardCommands, fontCommands, alignmentCommands, numberCommands, cellCommands, editingCommands, pageLayoutCommands, pageBreakCommands, formulaCommands, dataCommands, contextualCommands, reviewTab, viewTab, helpTab, editBridge, CellViewCache, QUADRANTS, columnHeaderHeight, rowHeaderWidth, GridGeometry, cellRange, scrollToReveal, buildItems, fitNumber, cssFont, clampAddress, selectCell, movingEnd, extendSelection, moveWithinSelection, rowsRange, colsRange, ALL_RANGE, tabMenu, editing, icon, DATA_BAR_COLORS, dataBarRule, COLOR_SCALES, colorScaleRule, iconSetRule, target, tableAt, viewing, activeTable, numberFormatOptions, FONT_NAMES, FONT_SIZES, BORDER_PRESETS, ORIENTATIONS, ACCOUNTING_FORMATS, themePaletteItems, MARGIN_PRESETS, PAPER_SIZES, FUNCTION_MENUS, MORE_FUNCTION_CATEGORIES, functionsIn, isSingleCell, spanRange, selectionCellCount, addRange, activeStyle, selectSpecial, insertFunctionCall, guessHeader, regionOf, HIGHLIGHT_STYLES, ICON_SETS, TABLE_STYLES, tableStylePreview, resolveNameBox, absoluteReference, nameForRange, fillPaint, iconSvg, colSelected, rowSelected, rowHeaderMenu, columnHeaderMenu, cellMenu, recentFunctions, evaluateRef, buildChart, detectCategory, CATEGORIES, TIME_CODES, DATE_CODES, DEFAULT_OPTIONS, cellStyleItems, textDecoration, justify, alignItems, textAlign, hasBorders, edgeCss, diagonalSvg, SYMBOLS, buildCode, UNSET, dxfCss, negativeCodes, iconCount, iconThresholds, rowsOf, colsOf } from 'ooxml-core/xlsx/ui';
13
+ import { definePresence } from './chunk-KNC2UEUR.js';
14
+ import { withTokens } from './chunk-CWBSXK7P.js';
15
+ import './chunk-LD3K2RDN.js';
16
+ import { SPECIAL_CODES, FRACTION_CODES, translate, AUTOSUM_FUNCTIONS, themeToCssVars, lightTheme, darkTheme, ICON_ACCENTS, ICON_PATHS, normalizeEditorLocale, normalizeThemeMode, applyThemeColors, parseSelectionRef, selectionRef, DirtyState, createCommandRegistry, createDialogRegistry, activeRef, createSelectionModel, SheetSelections, translator, initialSelection, sheetBaseName, historyOf, onRibbonTabsChange, activeChart, editChart, ribbonTabs, isTabHidden, selectTab, setTabHidden, tabButton, searchCommands, formatNumber, TEMPLATES, createTemplateWorkbook, isMenuSeparator, registerRibbonTabs, installFormatPainter, SHEET_ICONS, clipboardCommands, fontCommands, alignmentCommands, numberCommands, cellCommands, editingCommands, pageLayoutCommands, pageBreakCommands, formulaCommands, dataCommands, contextualCommands, reviewTab, viewTab, helpTab, editBridge, CellViewCache, QUADRANTS, columnHeaderHeight, rowHeaderWidth, GridGeometry, cellRange, scrollToReveal, buildItems, fitNumber, cssFont, clampAddress, selectCell, movingEnd, extendSelection, moveWithinSelection, rowsRange, colsRange, ALL_RANGE, tabMenu, editing, icon, DATA_BAR_COLORS, dataBarRule, COLOR_SCALES, colorScaleRule, iconSetRule, target, tableAt, viewing, activeTable, numberFormatOptions, FONT_NAMES, FONT_SIZES, BORDER_PRESETS, ORIENTATIONS, ACCOUNTING_FORMATS, themePaletteItems, MARGIN_PRESETS, PAPER_SIZES, FUNCTION_MENUS, MORE_FUNCTION_CATEGORIES, functionsIn, isSingleCell, spanRange, selectionCellCount, addRange, activeStyle, selectSpecial, insertFunctionCall, guessHeader, regionOf, HIGHLIGHT_STYLES, ICON_SETS, TABLE_STYLES, tableStylePreview, resolveNameBox, absoluteReference, nameForRange, fillPaint, iconSvg, colSelected, rowSelected, rowHeaderMenu, columnHeaderMenu, cellMenu, recentFunctions, evaluateRef, buildChart, detectCategory, CATEGORIES, TIME_CODES, DATE_CODES, DEFAULT_OPTIONS, cellStyleItems, textDecoration, justify, alignItems, textAlign, hasBorders, edgeCss, diagonalSvg, SYMBOLS, buildCode, UNSET, dxfCss, negativeCodes, iconCount, iconThresholds, rowsOf, colsOf } from 'ooxml-core/xlsx/ui';
16
17
  export { EDITOR_LOCALES, THEME_KEYS, normalizeEditorLocale, registerRibbonTabs, themeToCssVars, darkTheme as xlsxDarkTheme, lightTheme as xlsxLightTheme } from 'ooxml-core/xlsx/ui';
17
18
  import { createWorksheet, createEditSession, approximateMeasure, createWorkbook, MAX_ROW, MAX_COL, chartView, createRefEvaluator, chartBarSpacing, CHART_FILL_PARTS, selectionStats, formatSelectionStat, printRange, formatRange, chartSeriesTransparencyPatch, chartSeriesTransparency, chartSeriesGradientPatch, chartSeriesSolidFillPatch, chartSeriesFillPatch, chartWithElementFills, chartElementTransparencyPatch, chartElementTransparency, chartElementGradientPatch, chartElementSolidFillPatch, chartElementFillPatch, chartElementFill, chartGradientStopTransparency, paginateWorksheet, resolveColor, DEFAULT_THEME, pageHeaderFooter, createGridMetrics, createPrintMergeIndex, formatAddress, cellView, renderHeaderFooterRuns, nextSheetName, FUNCTION_CATALOG, mergeAt, visibleCells, getCell, cellInputText, closeParens, isFormulaText, parseCellInput, referenceTarget, navigate, anchorToPixelBox, renderChartSvg, pixelBoxToAnchor, listValidationOptions, validationAt, getValue, resolvePasteOptions, DEFAULT_COL_WIDTH, nameAtCaret, functionMatches, callAtCaret, splice, acceptsReference, translateFormula, isCellError, layoutRemoteSelections, parseHtmlTable, toggleAbsolute, rangeContains, formatValue, isDateFormat, pictureAnchorAt, selectedSparklineGroups, pivotTableAt, validateDefinedName, usedRange, parseAddress, parseRange, styleAt, rangesIntersect, chartColorScheme, coloredReferences, syntaxParams, activeParam, columnLabel, THEME_SLOTS, normalizeRange, currentRegion, autoFitColumnWidth, validateSheetName, dateToSerial, IMAGE_EXTENSIONS, verifySheetPassword, verifyWorkbookPassword, sheetByName, quoteSheetName, pivotSourceData, printTitles, formatPrintTitleSpan, parsePrintTitleSpan, pivotPageItems, pivotPageItemLabel, serialToDate, BUILTIN_NUMBER_FORMATS, pixelsToColumnWidth, validateTableName } from 'ooxml-core/xlsx';
18
19
  import { hyperlinkPolicy } from 'ooxml-core/opc';
@@ -22,7 +23,7 @@ import { RECT_GRADIENT_DIRECTIONS, OFFICE_GRADIENT_PRESETS, officeGradientPreset
22
23
  import { applyResize, applyDragDelta } from 'ooxml-core/geometry';
23
24
 
24
25
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/xlsx/theme/shell.css?raw
25
- var shell_default = "/* Frame, title bar and status bar. Mirrors docx-viewer's chrome (styles/base.css,\n chrome-titlebar.css, status-dialogs.css) with --xve-* tokens. */\n:host {\n --xl: var(--xve-primary);\n --xl-strong: color-mix(in srgb, var(--xve-primary) 70%, #000);\n --xl-soft: color-mix(in srgb, var(--xve-primary) 12%, transparent);\n --accent-soft: var(--xl-soft);\n --ink: var(--xve-foreground);\n --muted: var(--xve-muted-foreground);\n --line: var(--xve-border);\n --surface: var(--xve-card);\n --chrome: var(--xve-background);\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n min-height: 0;\n color: var(--ink);\n font:\n 13px/1.35 'Segoe UI',\n Arial,\n sans-serif;\n}\n.xve-frame {\n position: relative;\n display: flex;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n min-height: 0;\n min-width: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--surface);\n}\n:focus-visible {\n outline: 2px solid var(--xve-ring);\n outline-offset: 1px;\n}\n[hidden],\n[data-xve-hidden] {\n display: none !important;\n}\n.xve-icon {\n flex: none;\n}\n.xve-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 28px;\n padding: 0 6px;\n border: 0;\n border-radius: 4px;\n background: none;\n color: inherit;\n font: inherit;\n cursor: pointer;\n}\n.xve-icon-button:hover:not(:disabled),\n.xve-icon-button[aria-pressed='true'] {\n background: var(--xl-soft);\n}\n.xve-icon-button:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* Workspace: formula bar, grid and sheet tabs between the ribbon and the status bar. */\n.xve-workspace {\n position: relative;\n display: flex;\n flex: 1;\n min-height: 0;\n min-width: 0;\n flex-direction: column;\n background: var(--xve-sheet-bg);\n}\n.xve-formula-row {\n flex: none;\n min-width: 0;\n border-bottom: 1px solid var(--line);\n background: var(--surface);\n}\n.xve-grid-host {\n position: relative;\n display: flex;\n flex: 1;\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n background: var(--xve-sheet-bg);\n color-scheme: light;\n}\n.xve-grid-host > * {\n flex: 1;\n min-width: 0;\n}\n.xve-tabs-row {\n flex: none;\n min-width: 0;\n border-top: 1px solid var(--line);\n background: var(--chrome);\n}\n.xve-empty {\n position: absolute;\n z-index: 5;\n inset: 0;\n display: grid;\n place-items: center;\n color: var(--muted);\n background: var(--chrome);\n}\n:host([show-formula-bar='false']) .xve-formula-row,\n:host([show-toolbar='false']) .xve-ribbon {\n display: none;\n}\n\n/* Title bar: drawn by the shared office-ui-title-bar; the mark, background and borders come from its tokens. */\n.xve-titlebar {\n display: block;\n flex: none;\n --office-title-bar-background: var(--chrome);\n --office-title-bar-foreground: var(--ink);\n --office-title-bar-border: var(--line);\n --office-title-bar-mark-background: var(--xl);\n --office-title-bar-mark-foreground: var(--xve-primary-foreground);\n}\n\n/* Status bar: drawn by the shared office-ui-status-bar; this places it and styles the slotted stats. */\n.xve-status {\n display: block;\n flex: none;\n min-width: 0;\n border-top: 1px solid var(--line);\n}\n.xve-status-stats {\n margin-inline-end: 10px;\n overflow: hidden;\n color: var(--ink);\n font-size: 11px;\n white-space: nowrap;\n}\n\n@media (max-width: 760px) {\n .xve-status-stats {\n display: none;\n }\n}\n";
26
+ var shell_default = "/* Frame, title bar and status bar. Mirrors docx-viewer's chrome (styles/base.css,\n chrome-titlebar.css, status-dialogs.css) with --xve-* tokens. */\n:host {\n --xl: var(--xve-primary);\n --xl-strong: color-mix(in srgb, var(--xve-primary) 70%, #000);\n --xl-soft: color-mix(in srgb, var(--xve-primary) 12%, transparent);\n --accent-soft: var(--xl-soft);\n --ink: var(--xve-foreground);\n --muted: var(--xve-muted-foreground);\n --line: var(--xve-border);\n --surface: var(--xve-card);\n --chrome: var(--xve-background);\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n min-height: 0;\n color: var(--ink);\n font:\n 13px/1.35 'Segoe UI',\n Arial,\n sans-serif;\n}\n.xve-frame {\n position: relative;\n display: flex;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n min-height: 0;\n min-width: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--surface);\n}\n:focus-visible {\n outline: 2px solid var(--xve-ring);\n outline-offset: 1px;\n}\n[hidden],\n[data-xve-hidden] {\n display: none !important;\n}\n.xve-icon {\n flex: none;\n}\n.xve-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 28px;\n padding: 0 6px;\n border: 0;\n border-radius: 4px;\n background: none;\n color: inherit;\n font: inherit;\n cursor: pointer;\n}\n.xve-icon-button:hover:not(:disabled),\n.xve-icon-button[aria-pressed='true'] {\n background: var(--xl-soft);\n}\n.xve-icon-button:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n/* Workspace: formula bar, grid and sheet tabs between the ribbon and the status bar. */\n.xve-workspace {\n position: relative;\n display: flex;\n flex: 1;\n min-height: 0;\n min-width: 0;\n flex-direction: column;\n background: var(--xve-sheet-bg);\n}\n.xve-formula-row {\n flex: none;\n min-width: 0;\n border-bottom: 1px solid var(--line);\n background: var(--surface);\n}\n.xve-grid-host {\n position: relative;\n display: flex;\n flex: 1;\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n background: var(--xve-sheet-bg);\n color-scheme: light;\n}\n.xve-grid-host > * {\n flex: 1;\n min-width: 0;\n}\n.xve-tabs-row {\n flex: none;\n min-width: 0;\n border-top: 1px solid var(--line);\n background: var(--chrome);\n}\n.xve-empty {\n position: absolute;\n z-index: 5;\n inset: 0;\n display: grid;\n place-items: center;\n color: var(--muted);\n background: var(--chrome);\n}\n:host([show-formula-bar='false']) .xve-formula-row,\n:host([show-toolbar='false']) .xve-ribbon {\n display: none;\n}\n\n/* Title bar: drawn by the shared office-ui-title-bar; the mark, background and borders come from its tokens. */\n.xve-titlebar {\n display: block;\n flex: none;\n --office-title-bar-background: var(--chrome);\n --office-title-bar-foreground: var(--ink);\n --office-title-bar-border: var(--line);\n --office-title-bar-mark-background: var(--xl);\n --office-title-bar-mark-foreground: var(--xve-primary-foreground);\n}\n\n/* Status bar: drawn by the shared office-ui-status-bar; this places it and styles the slotted stats. */\n.xve-status {\n display: block;\n flex: none;\n min-width: 0;\n border-top: 1px solid var(--line);\n}\n.xve-status-stats {\n margin-inline-end: 10px;\n min-width: 0;\n overflow: hidden;\n color: var(--ink);\n font-size: 11px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n";
26
27
 
27
28
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/xlsx/theme/ribbon.css?raw
28
29
  var ribbon_default = "/* Ribbon: tabs, panels, groups and controls. Mirrors docx-viewer's styles/ribbon*.css. */\n.xve-ribbon-gallery[data-office-gallery] .trigger {\n flex-direction: column;\n justify-content: center;\n min-width: 56px;\n height: 78px;\n white-space: normal;\n text-align: center;\n}\n.xve-ribbon-gallery[data-office-gallery] .trigger > svg {\n width: 28px;\n height: 28px;\n}\n.xve-ribbon-gallery[data-office-gallery] .trigger > span:not([aria-hidden]) {\n max-width: 56px;\n}\n.xve-ribbon {\n position: relative;\n display: flex;\n flex: none;\n min-width: 0;\n flex-direction: column;\n background: var(--surface);\n border-bottom: 1px solid var(--line);\n}\n/* The tab row, File button and collapse button are the shared office-ui-ribbon; these colour it. */\n.xve-ribbon {\n --office-ribbon-contextual: #0f7b6c;\n}\n.xve-ribbon::part(file) {\n font-weight: 600;\n}\n.ribbon-panel {\n display: flex;\n flex: none;\n box-sizing: border-box;\n height: 104px;\n min-width: 0;\n align-items: stretch;\n gap: 4px;\n padding: 6px 10px 4px;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: thin;\n}\n.ribbon-group {\n position: relative;\n display: flex;\n flex: 0 0 auto;\n align-items: flex-start;\n min-width: 0;\n gap: 2px;\n padding: 2px 10px 18px 2px;\n border-right: 1px solid var(--line);\n}\n.ribbon-group:last-child {\n border: 0;\n}\n.ribbon-group::after {\n position: absolute;\n right: 0;\n bottom: 2px;\n left: 0;\n color: var(--muted);\n font-size: 10px;\n line-height: 1.1;\n text-align: center;\n white-space: nowrap;\n content: attr(data-caption);\n}\n.ribbon-caption-sizer {\n position: absolute;\n visibility: hidden;\n font-size: 10px;\n white-space: nowrap;\n}\n.ribbon-stack {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n}\n.ribbon-stack > .ribbon-stack {\n flex-direction: row;\n align-items: center;\n}\n.ribbon-separator {\n align-self: stretch;\n width: 1px;\n margin: 2px 3px;\n background: var(--line);\n}\n.ribbon-stack > .ribbon-separator {\n width: auto;\n height: 1px;\n}\n.ribbon-stack > .ribbon-stack > .ribbon-separator {\n width: 1px;\n height: 20px;\n}\n\n/* Buttons */\n.ribbon-group button {\n flex: none;\n min-width: 28px;\n height: 28px;\n max-width: 100%;\n padding: 0 4px;\n overflow: hidden;\n border: 1px solid transparent;\n border-radius: 4px;\n background: transparent;\n color: var(--ink);\n font:\n 400 12px 'Segoe UI',\n Arial,\n sans-serif;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n}\n.ribbon-group button:hover:not(:disabled) {\n border-color: var(--line);\n background: var(--accent-soft);\n}\n.ribbon-group button[aria-pressed='true'],\n.ribbon-group button[aria-expanded='true'] {\n border-color: color-mix(in srgb, var(--xl) 45%, transparent);\n background: color-mix(in srgb, var(--xl) 20%, transparent);\n}\n.ribbon-group button:active:not(:disabled) {\n background: color-mix(in srgb, var(--xl) 28%, transparent);\n}\n.ribbon-group button:focus-visible {\n outline: 2px solid var(--xl);\n outline-offset: -2px;\n}\n.ribbon-group button:disabled,\n.ribbon-group input:disabled {\n opacity: 0.4;\n cursor: default;\n}\n.ribbon-group button.ribbon-small {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n height: 24px;\n padding: 0 3px;\n}\n.ribbon-group button.ribbon-small.ribbon-labelled {\n justify-content: flex-start;\n padding: 0 6px 0 4px;\n}\n.ribbon-group button.ribbon-large {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n gap: 2px;\n width: auto;\n min-width: 48px;\n height: 76px;\n padding: 3px 3px 2px;\n font-size: 11px;\n line-height: 1.15;\n white-space: normal;\n text-align: center;\n}\n.ribbon-large > .ribbon-icon:last-child:not(:first-child) {\n margin-top: auto;\n}\n.ribbon-large > span,\n.ribbon-caption {\n /* Two balanced lines (see ribbon/caption.ts); the button grows to the widest. */\n white-space: pre;\n}\n.ribbon-icon {\n flex: none;\n}\n.ribbon-icon[data-icon$='-caret'],\n.ribbon-icon[data-icon='caret'] {\n opacity: 0.8;\n}\n\n/* Split buttons: a main half and a caret that opens a menu or the colour grid. */\n.ribbon-split {\n display: inline-flex;\n align-items: stretch;\n}\n.ribbon-split.ribbon-split-large {\n flex-direction: column;\n}\n.ribbon-group .ribbon-split > button:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.ribbon-group .ribbon-split > .ribbon-caret {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n min-width: 14px;\n padding: 0;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.ribbon-group .ribbon-split-large > button:first-child {\n height: 46px;\n border-radius: 4px 4px 0 0;\n}\n.ribbon-group .ribbon-split-large > .ribbon-caret {\n width: auto;\n height: 26px;\n border-radius: 0 0 4px 4px;\n font-size: 11px;\n flex-direction: column;\n gap: 0;\n}\n.ribbon-color {\n position: relative;\n}\n.ribbon-group button.ribbon-color::after {\n position: absolute;\n right: 4px;\n bottom: 2px;\n left: 4px;\n height: 3px;\n background: var(--bar, transparent);\n outline: 1px solid var(--line);\n content: '';\n}\n\n/* Editable combo boxes (font name and size) and plain selects. */\n.ribbon-combo {\n display: inline-flex;\n align-items: stretch;\n height: 24px;\n border: 1px solid var(--line);\n border-radius: 3px;\n background: var(--surface);\n}\n.ribbon-combo:focus-within {\n border-color: var(--xl);\n outline: 1px solid var(--xl);\n}\n.ribbon-combo input {\n flex: 1;\n min-width: 0;\n padding: 0 6px;\n border: 0;\n background: transparent;\n color: var(--ink);\n font:\n 12px 'Segoe UI',\n Arial,\n sans-serif;\n outline: none;\n}\n.ribbon-group .ribbon-combo .ribbon-caret {\n width: 18px;\n min-width: 18px;\n height: 100%;\n padding: 0;\n border: 0;\n border-radius: 0;\n}\n\n/* Plain drop-downs (Number Format) and gallery previews. */\n.ribbon-group select.ribbon-select {\n height: 24px;\n padding: 0 6px;\n border: 1px solid var(--line);\n border-radius: 3px;\n background: var(--surface);\n color: var(--ink);\n font:\n 12px 'Segoe UI',\n Arial,\n sans-serif;\n text-overflow: ellipsis;\n}\n.ribbon-group select.ribbon-select:focus-visible {\n outline: 2px solid var(--xl);\n outline-offset: -1px;\n}\n.ribbon-gallery-preview {\n display: block;\n height: 36px;\n margin-bottom: 3px;\n border: 1px solid var(--line);\n border-radius: 2px;\n background: #fff;\n color: #1f1f1f;\n font-size: 11px;\n line-height: 36px;\n text-align: center;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.ribbon-gallery-preview > svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n/* Dialog launcher: the corner arrow of a group. */\n.ribbon-group button.ribbon-launcher {\n position: absolute;\n right: 2px;\n bottom: 0;\n z-index: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n min-width: 14px;\n height: 14px;\n padding: 0;\n color: var(--muted);\n}\n\n/* Collapsed groups: a narrow ribbon folds its rightmost groups into one dropdown each. */\n.ribbon-group > .ribbon-overflow-button {\n display: none;\n}\n.ribbon-group[data-collapsed] {\n padding-right: 4px;\n}\n.ribbon-group[data-collapsed] > :not(.ribbon-overflow-button) {\n display: none !important;\n}\n.ribbon-group[data-collapsed] > button.ribbon-overflow-button {\n display: flex;\n}\n.ribbon-group[data-collapsed]::after {\n display: none;\n}\n.ribbon-overflow-panel .ribbon-group {\n height: 84px;\n padding-right: 2px;\n border: 0;\n}\n\n/* KeyTips */\n.xve-keytip {\n position: absolute;\n bottom: -2px;\n left: 50%;\n z-index: 70;\n min-width: 16px;\n padding: 1px 4px;\n border: 1px solid var(--line);\n border-radius: 3px;\n background: #1f1f1f;\n color: #fff;\n font:\n 600 11px/14px 'Segoe UI',\n Arial,\n sans-serif;\n text-align: center;\n pointer-events: none;\n transform: translateX(-50%);\n}\n.xve-keytip-command {\n position: fixed;\n bottom: auto;\n}\n\n/* Accent hues on command icons, as in Office. */\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.ribbon-icon[data-accent='blue'] {\n color: var(--ribbon-accent-blue);\n}\n.ribbon-icon[data-accent='green'] {\n color: var(--ribbon-accent-green);\n}\n.ribbon-icon[data-accent='red'] {\n color: var(--ribbon-accent-red);\n}\n.ribbon-icon[data-accent='orange'] {\n color: var(--ribbon-accent-orange);\n}\n";
@@ -34,7 +35,7 @@ var ribbon_parity_default = ".xve-cell-styles[mode='inline'] .strip {\n display:
34
35
  var popups_default = "/* Floating surfaces: ribbon popovers, menus, the colour grid, Tell me, toasts and the shell dialogs. */\n.ribbon-popover {\n position: fixed;\n z-index: 1000;\n box-sizing: border-box;\n padding: 4px;\n border: 1px solid var(--line);\n border-radius: 6px;\n background: var(--xve-popover);\n box-shadow: 0 6px 20px rgb(0 0 0 / 0.18);\n color: var(--xve-popover-foreground);\n font:\n 12px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.ribbon-popover.ribbon-menu-list,\n.ribbon-popover.ribbon-list {\n display: flex;\n min-width: 180px;\n max-height: min(70vh, 420px);\n flex-direction: column;\n overflow-y: auto;\n}\n.ribbon-menu-list [role='menuitem'],\n.ribbon-menu-list [role='menuitemcheckbox'],\n.ribbon-list [role='option'] {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 5px 12px 5px 8px;\n border: 0;\n border-radius: 3px;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n white-space: nowrap;\n cursor: pointer;\n}\n.ribbon-menu-list [role^='menuitem']:hover:not(:disabled),\n.ribbon-menu-list [role^='menuitem']:focus-visible,\n.ribbon-list [role='option']:hover,\n.ribbon-list [role='option']:focus-visible {\n background: var(--accent-soft);\n outline: none;\n}\n.ribbon-menu-list [role^='menuitem']:disabled {\n opacity: 0.45;\n cursor: default;\n}\n.ribbon-menu-list [aria-checked='true'] {\n font-weight: 600;\n}\n.ribbon-menu-list .ribbon-menu-icon {\n display: inline-flex;\n width: 16px;\n}\n.ribbon-menu-list .ribbon-menu-shortcut {\n margin-left: auto;\n padding-left: 18px;\n color: var(--muted);\n}\n.ribbon-menu-list [role='separator'] {\n height: 1px;\n margin: 4px 2px;\n background: var(--line);\n}\n.ribbon-list [aria-selected='true'] {\n color: var(--xl);\n font-weight: 600;\n}\n.ribbon-popover.ribbon-gallery-menu {\n display: grid;\n grid-template-columns: repeat(4, 96px);\n gap: 4px;\n max-height: min(70vh, 420px);\n overflow-y: auto;\n}\n.ribbon-gallery-menu button {\n padding: 4px;\n border: 1px solid transparent;\n border-radius: 3px;\n background: none;\n color: inherit;\n font: inherit;\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\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/* Toasts */\n.xve-toasts {\n position: absolute;\n z-index: 90;\n right: 16px;\n bottom: 40px;\n display: flex;\n max-width: min(420px, calc(100% - 32px));\n flex-direction: column;\n gap: 8px;\n pointer-events: none;\n}\n.xve-toast {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 10px 12px;\n border: 1px solid var(--line);\n border-left: 4px solid var(--xl);\n border-radius: 6px;\n background: var(--xve-popover);\n box-shadow: 0 8px 24px #0003;\n color: var(--xve-popover-foreground);\n pointer-events: auto;\n}\n.xve-toast[data-kind='warning'] {\n border-left-color: #b7791f;\n}\n.xve-toast[data-kind='error'] {\n border-left-color: var(--xve-destructive);\n}\n.xve-toast-text {\n flex: 1;\n}\n\n/* Shell dialogs (shortcut help, prompts) */\n.xve-dialog {\n position: absolute;\n z-index: 85;\n top: 120px;\n left: 50%;\n display: grid;\n box-sizing: border-box;\n width: min(440px, calc(100% - 32px));\n gap: 10px;\n padding: 18px 20px;\n border: 1px solid var(--line);\n border-radius: 8px;\n background: var(--xve-popover);\n box-shadow: 0 12px 32px #0003;\n color: var(--ink);\n transform: translateX(-50%);\n}\n.xve-dialog h2 {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n}\n.xve-dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 6px;\n}\n.xve-dialog-actions button {\n min-height: 30px;\n padding: 0 14px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: var(--surface);\n color: var(--ink);\n font: inherit;\n cursor: pointer;\n}\n.xve-dialog-actions .xve-dialog-primary {\n border-color: var(--xl);\n background: var(--xl);\n color: var(--xve-primary-foreground);\n}\n.xve-shortcut-help {\n width: min(620px, calc(100% - 32px));\n max-height: calc(100% - 160px);\n overflow: auto;\n}\n.xve-shortcut-help p {\n margin: 0;\n color: var(--muted);\n font-size: 12px;\n}\n.xve-shortcut-help table {\n width: 100%;\n border-collapse: collapse;\n}\n.xve-shortcut-help th,\n.xve-shortcut-help td {\n padding: 5px 8px;\n border-bottom: 1px solid var(--line);\n text-align: left;\n vertical-align: top;\n}\n.xve-shortcut-help th {\n color: var(--muted);\n font-size: 12px;\n font-weight: 600;\n}\n.xve-shortcut-help kbd {\n padding: 1px 6px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: var(--surface);\n font:\n 12px/1.4 ui-monospace,\n Consolas,\n monospace;\n white-space: nowrap;\n}\n";
35
36
 
36
37
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/xlsx/theme/backstage.css?raw
37
- var backstage_default = "/* File backstage: the shared office-ui-backstage draws the navigation; these style the page content.\n The nav colours come from its tokens. */\n.xve-backstage {\n z-index: 40;\n --office-background: var(--surface);\n --office-backstage-nav-background: var(--xl);\n --office-backstage-nav-foreground: var(--xve-primary-foreground);\n}\n.xve-backstage-content {\n overflow: auto;\n padding: 28px 40px;\n color: var(--ink);\n}\n.xve-backstage-content h2 {\n margin: 0 0 20px;\n font-size: 30px;\n font-weight: 300;\n}\n.xve-backstage-content h3 {\n margin: 24px 0 10px;\n font-size: 15px;\n font-weight: 600;\n}\n.xve-backstage-title {\n margin: 0 0 4px;\n font-size: 26px;\n font-weight: 400;\n overflow-wrap: anywhere;\n}\n.xve-backstage-muted {\n color: var(--muted);\n}\n.xve-backstage-facts {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n gap: 6px 24px;\n margin: 0;\n}\n.xve-backstage-facts dt {\n color: var(--muted);\n}\n.xve-backstage-facts dd {\n margin: 0;\n overflow-wrap: anywhere;\n}\n.xve-compatibility-notes {\n display: grid;\n gap: 8px;\n max-width: 760px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.xve-compatibility-notes li {\n display: flex;\n gap: 8px;\n padding: 10px 12px;\n border: 1px solid var(--line);\n border-radius: 6px;\n line-height: 1.45;\n}\n.xve-compatibility-notes .xve-icon {\n margin-top: 2px;\n color: #b7791f;\n}\n.xve-backstage-columns {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 300px;\n gap: 40px;\n align-items: start;\n}\n.xve-backstage-properties {\n padding: 4px 0 0 24px;\n border-left: 1px solid var(--line);\n}\n.xve-backstage-properties h3 {\n margin-top: 0;\n}\n.xve-backstage-tiles {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n}\n.xve-backstage-tile {\n display: inline-flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: none;\n color: var(--ink);\n font: inherit;\n cursor: pointer;\n}\n.xve-backstage-tile:hover {\n border-color: var(--line);\n background: var(--xl-soft);\n}\n.xve-backstage-tile-preview {\n display: block;\n width: 150px;\n height: 112px;\n border: 1px solid var(--line);\n background-color: #fff;\n background-image:\n linear-gradient(#e1e1e1 1px, transparent 1px),\n linear-gradient(90deg, #e1e1e1 1px, transparent 1px);\n background-size: 30px 14px;\n box-shadow: 0 1px 3px #0002;\n}\n.xve-backstage-tile-preview[data-template]::before {\n display: block;\n height: 14px;\n background: var(--xl);\n content: '';\n opacity: 0.85;\n}\n.xve-backstage-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 24px;\n max-width: 760px;\n margin-bottom: 12px;\n padding: 14px 18px;\n border: 1px solid var(--line);\n border-radius: 6px;\n}\n.xve-backstage-card h3 {\n margin: 0 0 4px;\n}\n.xve-backstage-card p {\n margin: 0;\n}\n.xve-backstage-primary {\n padding: 8px 18px;\n border: 0;\n border-radius: 4px;\n background: var(--xl);\n color: var(--xve-primary-foreground);\n font: inherit;\n cursor: pointer;\n white-space: nowrap;\n}\n.xve-backstage-field {\n display: grid;\n gap: 4px;\n max-width: 420px;\n margin-bottom: 14px;\n color: var(--muted);\n font-size: 12px;\n}\n.xve-backstage-field input,\n.xve-backstage-field select {\n height: 32px;\n padding: 0 8px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: var(--surface);\n color: var(--ink);\n font:\n 14px 'Segoe UI',\n Arial,\n sans-serif;\n}\n.xve-backstage-check {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 10px;\n}\n.xve-customize-group {\n margin: 0 0 8px;\n padding: 6px 10px 8px;\n border: 1px solid var(--line);\n border-radius: 4px;\n}\n.xve-customize-group legend {\n padding: 0 4px;\n color: var(--muted);\n font-size: 12px;\n}\n.xve-customize-row {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 180px;\n padding: 2px 8px 2px 0;\n font-size: 13px;\n}\n@media (max-width: 760px) {\n .xve-backstage-content {\n padding: 20px;\n }\n .xve-backstage-columns {\n grid-template-columns: minmax(0, 1fr);\n }\n .xve-backstage-properties {\n padding-left: 0;\n border-left: 0;\n }\n}\n";
38
+ var backstage_default = "/* File backstage: the shared office-ui-backstage draws the navigation; these style the page content.\n The nav colours come from its tokens. */\n.xve-backstage {\n z-index: 40;\n --office-background: var(--surface);\n --office-backstage-nav-background: var(--xl);\n --office-backstage-nav-foreground: var(--xve-primary-foreground);\n}\n.xve-backstage-content {\n overflow: auto;\n padding: 28px 40px;\n color: var(--ink);\n}\n.xve-backstage-content h2 {\n margin: 0 0 20px;\n font-size: 30px;\n font-weight: 300;\n}\n.xve-backstage-content h3 {\n margin: 24px 0 10px;\n font-size: 15px;\n font-weight: 600;\n}\n.xve-backstage-title {\n margin: 0 0 4px;\n font-size: 26px;\n font-weight: 400;\n overflow-wrap: anywhere;\n}\n.xve-backstage-muted {\n color: var(--muted);\n}\n.xve-backstage-facts {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n gap: 6px 24px;\n margin: 0;\n}\n.xve-backstage-facts dt {\n color: var(--muted);\n}\n.xve-backstage-facts dd {\n margin: 0;\n overflow-wrap: anywhere;\n}\n.xve-compatibility-notes {\n display: grid;\n gap: 8px;\n max-width: 760px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.xve-compatibility-notes li {\n display: flex;\n gap: 8px;\n padding: 10px 12px;\n border: 1px solid var(--line);\n border-radius: 6px;\n line-height: 1.45;\n}\n.xve-compatibility-notes .xve-icon {\n margin-top: 2px;\n color: #b7791f;\n}\n.xve-backstage-columns {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 300px;\n gap: 40px;\n align-items: start;\n}\n.xve-backstage-properties {\n padding: 4px 0 0 24px;\n border-left: 1px solid var(--line);\n}\n.xve-backstage-properties h3 {\n margin-top: 0;\n}\n.xve-backstage-tiles {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n}\n.xve-backstage-tile {\n display: inline-flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: none;\n color: var(--ink);\n font: inherit;\n cursor: pointer;\n}\n.xve-backstage-tile:hover {\n border-color: var(--line);\n background: var(--xl-soft);\n}\n.xve-backstage-tile-preview {\n display: block;\n width: 150px;\n height: 112px;\n border: 1px solid var(--line);\n background-color: #fff;\n background-image:\n linear-gradient(#e1e1e1 1px, transparent 1px),\n linear-gradient(90deg, #e1e1e1 1px, transparent 1px);\n background-size: 30px 14px;\n box-shadow: 0 1px 3px #0002;\n}\n.xve-backstage-tile-preview[data-template]::before {\n display: block;\n height: 14px;\n background: var(--xl);\n content: '';\n opacity: 0.85;\n}\n.xve-backstage-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 24px;\n max-width: 760px;\n margin-bottom: 12px;\n padding: 14px 18px;\n border: 1px solid var(--line);\n border-radius: 6px;\n}\n.xve-backstage-card h3 {\n margin: 0 0 4px;\n}\n.xve-backstage-card p {\n margin: 0;\n}\n.xve-backstage-primary {\n padding: 8px 18px;\n border: 0;\n border-radius: 4px;\n background: var(--xl);\n color: var(--xve-primary-foreground);\n font: inherit;\n cursor: pointer;\n white-space: nowrap;\n}\n.xve-backstage-field {\n display: grid;\n gap: 4px;\n max-width: 420px;\n margin-bottom: 14px;\n color: var(--muted);\n font-size: 12px;\n}\n.xve-backstage-field input,\n.xve-backstage-field select {\n height: 32px;\n padding: 0 8px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: var(--surface);\n color: var(--ink);\n font:\n 14px 'Segoe UI',\n Arial,\n sans-serif;\n}\n/* File > Options > Customize Ribbon, shown in the shared Options dialog. */\n.xve-options-note {\n margin: 0 0 8px;\n color: var(--muted);\n font-size: 11px;\n}\n.xve-options-action {\n margin: 0 0 8px;\n padding: 6px 11px;\n border: 1px solid var(--line);\n border-radius: 4px;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: 12px;\n cursor: pointer;\n}\n.xve-options h3 {\n margin: 14px 0 4px;\n padding-bottom: 2px;\n border-bottom: 1px solid var(--line);\n color: var(--muted);\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n}\n.xve-customize-group {\n margin: 0 0 8px;\n padding: 6px 10px 8px;\n border: 1px solid var(--line);\n border-radius: 4px;\n}\n.xve-customize-group legend {\n padding: 0 4px;\n color: var(--muted);\n font-size: 11px;\n}\n.xve-customize-row {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 180px;\n padding: 2px 8px 2px 0;\n font-size: 12px;\n}\n@media (max-width: 760px) {\n .xve-backstage-content {\n padding: 20px;\n }\n .xve-backstage-columns {\n grid-template-columns: minmax(0, 1fr);\n }\n .xve-backstage-properties {\n padding-left: 0;\n border-left: 0;\n }\n}\n";
38
39
 
39
40
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/xlsx/theme/chart-series.css?raw
40
41
  var chart_series_default = ".xve-canvas-row {\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n}\n.xve-chart-series-pane {\n box-sizing: border-box;\n width: 300px;\n max-width: 45%;\n flex: none;\n overflow: auto;\n border-left: 1px solid var(--line);\n background: var(--surface);\n}\n.xve-chart-series-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 12px 12px 18px;\n border-bottom: 1px solid var(--line);\n}\n.xve-chart-series-header h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 400;\n}\n.xve-chart-series-body,\n.xve-chart-series-pane > .xve-note {\n margin: 0;\n padding: 18px;\n}\n.xve-chart-series-body h3 {\n margin: 0 0 20px;\n font-size: 13px;\n font-weight: 600;\n}\n.xve-chart-series-body .xve-field {\n display: grid;\n grid-template-columns: 1fr 70px 12px;\n align-items: center;\n gap: 6px;\n margin: 14px 0;\n}\n.xve-chart-series-body .xve-input-number {\n box-sizing: border-box;\n width: 70px;\n min-width: 0;\n}\n.xve-chart-series-range .office-range-control {\n box-sizing: border-box;\n width: 100%;\n margin: 0 0 8px;\n}\n.xve-chart-series-fill {\n margin-top: 20px;\n padding-top: 18px;\n border-top: 1px solid var(--line);\n}\n.xve-chart-series-body .xve-field:has(select),\n.xve-chart-series-body .xve-field:has(.xve-chart-series-color),\n.xve-chart-series-body .xve-field:has(office-ui-gallery) {\n grid-template-columns: 1fr minmax(100px, 1fr);\n}\n.xve-chart-series-body office-ui-gallery .trigger {\n box-sizing: border-box;\n width: 100%;\n white-space: normal;\n}\n.xve-chart-series-color {\n height: 28px;\n background: var(--series-fill);\n border: 1px solid var(--line);\n cursor: pointer;\n}\n.xve-chart-series-color:disabled {\n opacity: 0.5;\n cursor: default;\n}\n.xve-chart-series-gradient {\n margin-top: 18px;\n}\n.xve-chart-gradient-buttons {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n}\n.xve-chart-gradient-selector {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.xve-chart-gradient-selector .office-gradient-stop-track {\n flex: 1;\n min-width: 0;\n}\n.xve-chart-gradient-buttons .xve-button {\n width: 26px;\n height: 28px;\n padding: 0;\n font-size: 18px;\n}\n";
@@ -719,122 +720,6 @@ function renderExport(page) {
719
720
  )
720
721
  );
721
722
  }
722
- var LANGUAGES = [
723
- ["en", "English"],
724
- ["fr", "Fran\xE7ais"],
725
- ["de", "Deutsch"],
726
- ["es", "Espa\xF1ol"],
727
- ["zh-CN", "\u7B80\u4F53\u4E2D\u6587"]
728
- ];
729
- var DEFAULT_ITERATIONS = 100;
730
- var DEFAULT_MAX_CHANGE = 1e-3;
731
- function iterationControls(page, current) {
732
- const { t, host, doc } = page;
733
- defineCheckbox(doc.defaultView?.customElements);
734
- const toggle = doc.createElement("office-ui-checkbox");
735
- toggle.setAttribute("aria-label", t("Enable iterative calculation"));
736
- toggle.checked = Boolean(current);
737
- const row2 = doc.createElement("div");
738
- row2.className = "xve-backstage-check";
739
- const text3 = doc.createElement("span");
740
- text3.textContent = t("Enable iterative calculation");
741
- row2.append(toggle, text3);
742
- text3.addEventListener("click", () => toggle.click());
743
- const number = (value, min, step2) => {
744
- const input = doc.createElement("input");
745
- input.type = "number";
746
- input.min = String(min);
747
- input.step = step2;
748
- input.value = String(value);
749
- input.disabled = !current;
750
- return input;
751
- };
752
- const count = number(current?.count ?? DEFAULT_ITERATIONS, 1, "1");
753
- const delta = number(current?.delta ?? DEFAULT_MAX_CHANGE, 0, "any");
754
- const apply = () => {
755
- count.disabled = delta.disabled = !toggle.checked;
756
- host.setOption(
757
- "iteration",
758
- toggle.checked ? {
759
- count: Number(count.value) || DEFAULT_ITERATIONS,
760
- delta: delta.value === "" ? DEFAULT_MAX_CHANGE : Number(delta.value)
761
- } : void 0
762
- );
763
- };
764
- toggle.addEventListener("change", apply);
765
- count.addEventListener("change", apply);
766
- delta.addEventListener("change", apply);
767
- return [
768
- row2,
769
- labelled(page, t("Maximum iterations"), count),
770
- labelled(page, t("Maximum change"), delta),
771
- paragraph(
772
- page,
773
- t(
774
- "Circular references are recalculated up to the maximum iterations, stopping once no cell changes by more than the maximum change."
775
- ),
776
- "xve-backstage-muted"
777
- )
778
- ];
779
- }
780
- function renderOptions(page) {
781
- const { t, host, doc } = page;
782
- const current = host.options();
783
- const language = doc.createElement("select");
784
- for (const [value, label] of LANGUAGES) language.append(new Option(label, value));
785
- language.value = current.locale;
786
- language.addEventListener("change", () => host.setOption("locale", language.value));
787
- const theme = doc.createElement("select");
788
- for (const [value, label] of [
789
- ["auto", "Automatic"],
790
- ["light", "Light"],
791
- ["dark", "Dark"]
792
- ])
793
- theme.append(new Option(t(label), value));
794
- theme.value = current.theme === "light" || current.theme === "dark" ? current.theme : "auto";
795
- theme.addEventListener("change", () => host.setOption("theme", theme.value));
796
- const author = doc.createElement("input");
797
- author.type = "text";
798
- author.value = current.author;
799
- author.addEventListener("change", () => host.setOption("author", author.value));
800
- const calculation = doc.createElement("select");
801
- calculation.append(new Option(t("Automatic"), "automatic"), new Option(t("Manual"), "manual"));
802
- calculation.value = current.calculation;
803
- calculation.addEventListener(
804
- "change",
805
- () => host.setOption("calculation", calculation.value === "manual" ? "manual" : "automatic")
806
- );
807
- const iteration = iterationControls(page, current.iteration);
808
- const r1c1 = doc.createElement("label");
809
- r1c1.className = "xve-backstage-check";
810
- const box = doc.createElement("input");
811
- box.type = "checkbox";
812
- box.disabled = true;
813
- const text3 = doc.createElement("span");
814
- text3.textContent = t("R1C1 reference style (not available)");
815
- r1c1.append(box, text3);
816
- page.content.replaceChildren(
817
- heading(page, t("Options")),
818
- heading(page, t("General"), "h3"),
819
- labelled(page, t("Display language"), language),
820
- labelled(page, t("Theme"), theme),
821
- labelled(page, t("Author name"), author),
822
- heading(page, t("Formulas"), "h3"),
823
- labelled(page, t("Workbook calculation"), calculation),
824
- paragraph(
825
- page,
826
- t("Manual: formulas recalculate when you press F9 (Calculate Now)."),
827
- "xve-backstage-muted"
828
- ),
829
- ...iteration,
830
- r1c1,
831
- paragraph(
832
- page,
833
- t("Options apply to this editor and are not stored between sessions."),
834
- "xve-backstage-muted"
835
- )
836
- );
837
- }
838
723
  function commandsOf(control) {
839
724
  switch (control.kind) {
840
725
  case "stack":
@@ -852,9 +737,9 @@ function commandsOf(control) {
852
737
  return [control.command];
853
738
  }
854
739
  }
855
- function renderCustomize(page) {
856
- const { t, host, doc } = page;
857
- const { commands } = host.ctx;
740
+ function renderCustomizeRibbon(pane, host) {
741
+ const { t, commands } = host.ctx;
742
+ const doc = pane.ownerDocument;
858
743
  const hidden = new Set(host.hiddenActions());
859
744
  const boxes = [];
860
745
  const commit = () => host.setHiddenActions(boxes.filter((box) => !box.input.checked).map((box) => box.id));
@@ -862,7 +747,9 @@ function renderCustomize(page) {
862
747
  const sections = [];
863
748
  for (const tab of ribbonTabs()) {
864
749
  const section = doc.createElement("section");
865
- section.append(heading(page, t(tab.label), "h3"));
750
+ const title = doc.createElement("h3");
751
+ title.textContent = t(tab.label);
752
+ section.append(title);
866
753
  for (const group of tab.groups) {
867
754
  const fieldset2 = doc.createElement("fieldset");
868
755
  fieldset2.className = "xve-customize-group";
@@ -889,16 +776,234 @@ function renderCustomize(page) {
889
776
  }
890
777
  if (section.childElementCount > 1) sections.push(section);
891
778
  }
892
- const reset = primary(page, t("Reset all customizations"), () => {
779
+ const note = doc.createElement("p");
780
+ note.className = "xve-options-note";
781
+ note.textContent = t("Choose which commands the ribbon shows.");
782
+ const reset = doc.createElement("button");
783
+ reset.type = "button";
784
+ reset.className = "xve-options-action";
785
+ reset.textContent = t("Reset all customizations");
786
+ reset.addEventListener("click", () => {
893
787
  for (const box of boxes) box.input.checked = true;
894
788
  commit();
895
789
  });
896
- page.content.replaceChildren(
897
- heading(page, t("Customize Ribbon")),
898
- paragraph(page, t("Choose which commands the ribbon shows."), "xve-backstage-muted"),
899
- reset,
900
- ...sections
901
- );
790
+ pane.replaceChildren(note, reset, ...sections);
791
+ }
792
+
793
+ // src/xlsx/backstage/options-dialog.ts
794
+ var LANGUAGES = [
795
+ ["en", "English"],
796
+ ["fr", "Fran\xE7ais"],
797
+ ["de", "Deutsch"],
798
+ ["es", "Espa\xF1ol"],
799
+ ["zh-CN", "\u7B80\u4F53\u4E2D\u6587"]
800
+ ];
801
+ var DEFAULT_ITERATIONS = 100;
802
+ var DEFAULT_MAX_CHANGE = 1e-3;
803
+ var DIRECT_KEYS = ["locale", "theme", "author", "calculation"];
804
+ var ITERATION_KEYS = ["iterate", "iterationCount", "iterationDelta"];
805
+ function excelCategories(context) {
806
+ const { t } = context;
807
+ return [
808
+ {
809
+ id: "general",
810
+ label: t("General"),
811
+ description: optionText(context, "General options for working with {product}."),
812
+ sections: [
813
+ userInterfaceSection(context),
814
+ personalizeSection(
815
+ context,
816
+ [
817
+ { kind: "text", key: "author", label: t("User name"), maxLength: 64 },
818
+ {
819
+ kind: "select",
820
+ key: "theme",
821
+ label: t("Office Theme"),
822
+ choices: [
823
+ { value: "auto", label: t("Automatic") },
824
+ { value: "light", label: t("Light") },
825
+ { value: "dark", label: t("Dark") }
826
+ ]
827
+ }
828
+ ],
829
+ t("Options apply to this editor and are not stored between sessions.")
830
+ )
831
+ ]
832
+ },
833
+ {
834
+ id: "formulas",
835
+ label: t("Formulas"),
836
+ description: t(
837
+ "Change options related to formula calculation, performance, and error handling."
838
+ ),
839
+ sections: [
840
+ {
841
+ id: "calculation",
842
+ title: t("Calculation options"),
843
+ controls: [
844
+ {
845
+ kind: "select",
846
+ key: "calculation",
847
+ label: t("Workbook calculation"),
848
+ info: t("Manual: formulas recalculate when you press F9 (Calculate Now)."),
849
+ choices: [
850
+ { value: "automatic", label: t("Automatic") },
851
+ { value: "manual", label: t("Manual") }
852
+ ]
853
+ },
854
+ {
855
+ kind: "toggle",
856
+ key: "iterate",
857
+ label: t("Enable iterative calculation"),
858
+ info: t(
859
+ "Circular references are recalculated up to the maximum iterations, stopping once no cell changes by more than the maximum change."
860
+ )
861
+ },
862
+ {
863
+ kind: "number",
864
+ key: "iterationCount",
865
+ label: t("Maximum iterations"),
866
+ min: 1,
867
+ max: 32767,
868
+ indent: true,
869
+ enabledBy: "iterate"
870
+ },
871
+ {
872
+ kind: "number",
873
+ key: "iterationDelta",
874
+ label: t("Maximum change"),
875
+ min: 0,
876
+ max: 1e3,
877
+ step: 1e-3,
878
+ indent: true,
879
+ enabledBy: "iterate"
880
+ }
881
+ ]
882
+ },
883
+ {
884
+ id: "working",
885
+ title: t("Working with formulas"),
886
+ controls: [
887
+ unavailableControl(
888
+ context,
889
+ { kind: "toggle", key: "r1c1", label: t("R1C1 reference style") },
890
+ "Not available yet. Only A1 references are supported."
891
+ )
892
+ ]
893
+ }
894
+ ]
895
+ },
896
+ {
897
+ id: "data",
898
+ label: t("Data"),
899
+ description: t("Change settings for importing and analyzing data."),
900
+ sections: [],
901
+ disabled: t("Not available yet. Data import and query settings are not supported.")
902
+ },
903
+ unavailableCategory(context, "proofing"),
904
+ unavailableCategory(context, "save"),
905
+ {
906
+ id: "language",
907
+ label: t("Language"),
908
+ description: t("Set the Office Language Preferences."),
909
+ sections: [
910
+ {
911
+ id: "display-language",
912
+ title: t("Office display language"),
913
+ description: t("Choose the language for menus, buttons and messages."),
914
+ controls: [
915
+ {
916
+ kind: "select",
917
+ key: "locale",
918
+ label: t("Display language"),
919
+ choices: LANGUAGES.map(([value, label]) => ({ value, label }))
920
+ }
921
+ ]
922
+ }
923
+ ]
924
+ },
925
+ unavailableCategory(context, "accessibility"),
926
+ unavailableCategory(context, "advanced"),
927
+ {
928
+ id: "ribbon",
929
+ label: t("Customize Ribbon"),
930
+ description: t("Customize the Ribbon and keyboard shortcuts."),
931
+ sections: [],
932
+ custom: true
933
+ },
934
+ unavailableCategory(context, "qat"),
935
+ unavailableCategory(context, "addins"),
936
+ unavailableCategory(context, "trust")
937
+ ];
938
+ }
939
+ function dialogValues(host) {
940
+ const current = host.options();
941
+ return {
942
+ locale: current.locale,
943
+ theme: current.theme === "light" || current.theme === "dark" ? current.theme : "auto",
944
+ author: current.author,
945
+ calculation: current.calculation,
946
+ iterate: Boolean(current.iteration),
947
+ iterationCount: current.iteration?.count ?? DEFAULT_ITERATIONS,
948
+ iterationDelta: current.iteration?.delta ?? DEFAULT_MAX_CHANGE
949
+ };
950
+ }
951
+ function iterationOf(values) {
952
+ if (values.iterate !== true) return void 0;
953
+ return {
954
+ count: Number(values.iterationCount) || DEFAULT_ITERATIONS,
955
+ delta: Number(values.iterationDelta)
956
+ };
957
+ }
958
+ function createExcelOptions(host) {
959
+ const { ctx } = host;
960
+ const doc = ctx.host.ownerDocument;
961
+ defineOptionsDialog();
962
+ const element = doc.createElement("office-ui-options-dialog");
963
+ element.className = "xve-options";
964
+ const ribbon = doc.createElement("div");
965
+ ribbon.slot = "pane-ribbon";
966
+ element.append(ribbon);
967
+ const context = { product: "Excel", t: (text3) => ctx.t(text3) };
968
+ let hiddenOnOpen = [];
969
+ const build = () => {
970
+ element.setAttribute("heading", ctx.t("Options"));
971
+ element.labels = optionsLabels(context);
972
+ element.categories = excelCategories(context);
973
+ element.values = dialogValues(host);
974
+ element.defaults = {
975
+ theme: "auto",
976
+ calculation: "automatic",
977
+ iterate: false,
978
+ iterationCount: DEFAULT_ITERATIONS,
979
+ iterationDelta: DEFAULT_MAX_CHANGE
980
+ };
981
+ };
982
+ element.addEventListener("office-options-change", (event) => {
983
+ const { values, changed } = event.detail;
984
+ for (const key of DIRECT_KEYS)
985
+ if (changed.includes(key)) host.setOption(key, String(values[key]));
986
+ if (changed.some((key) => ITERATION_KEYS.includes(key)))
987
+ host.setOption("iteration", iterationOf(values));
988
+ build();
989
+ });
990
+ element.addEventListener("office-options-cancel", () => {
991
+ if (hiddenOnOpen.join() !== host.hiddenActions().join())
992
+ host.setHiddenActions([...hiddenOnOpen]);
993
+ });
994
+ for (const name of ["office-options-change", "office-options-cancel"])
995
+ element.addEventListener(name, () => setTimeout(() => host.close(), 0));
996
+ return {
997
+ element,
998
+ show(category = "general") {
999
+ build();
1000
+ hiddenOnOpen = [...host.hiddenActions()];
1001
+ renderCustomizeRibbon(ribbon, host);
1002
+ element.category = category;
1003
+ element.show();
1004
+ },
1005
+ relocalize: build
1006
+ };
902
1007
  }
903
1008
 
904
1009
  // src/xlsx/backstage/pages-share.ts
@@ -999,9 +1104,7 @@ var PAGES = [
999
1104
  ["saveAs", "Save As"],
1000
1105
  ["print", "Print"],
1001
1106
  ["share", "Share"],
1002
- ["export", "Export"],
1003
- ["options", "Options"],
1004
- ["customize", "Customize Ribbon"]
1107
+ ["export", "Export"]
1005
1108
  ];
1006
1109
  var RENDERERS = {
1007
1110
  info: renderInfo,
@@ -1010,9 +1113,7 @@ var RENDERERS = {
1010
1113
  saveAs: renderSaveAs,
1011
1114
  print: renderPrint,
1012
1115
  share: renderShare,
1013
- export: renderExport,
1014
- options: renderOptions,
1015
- customize: renderCustomize
1116
+ export: renderExport
1016
1117
  };
1017
1118
  function createBackstage(host) {
1018
1119
  const { ctx } = host;
@@ -1031,26 +1132,23 @@ function createBackstage(host) {
1031
1132
  element.append(content);
1032
1133
  }
1033
1134
  let current = "info";
1034
- const pageHost = {
1035
- ...host,
1036
- ctx,
1037
- setOption(key, value) {
1038
- host.setOption(key, value);
1039
- queueMicrotask(() => {
1040
- if (element.open) show(current);
1041
- });
1042
- }
1043
- };
1135
+ const options = createExcelOptions(host);
1044
1136
  const show = (page) => {
1045
1137
  current = page;
1046
- RENDERERS[page]({ host: pageHost, content: contents.get(page), t: ctx.t, doc });
1138
+ RENDERERS[page]({ host, content: contents.get(page), t: ctx.t, doc });
1139
+ };
1140
+ const showOptions = (category) => {
1141
+ if (element.open) element.close();
1142
+ host.close();
1143
+ options.show(category);
1047
1144
  };
1048
1145
  element.addEventListener("office-backstage-select", (event) => {
1049
1146
  const id = event.detail.id;
1050
1147
  if (id === "save") {
1051
1148
  host.close();
1052
1149
  host.fileCommand("save");
1053
- } else if (contents.has(id)) show(id);
1150
+ } else if (id === "options") showOptions();
1151
+ else if (contents.has(id)) show(id);
1054
1152
  });
1055
1153
  element.addEventListener("office-backstage-close", (event) => {
1056
1154
  if (event.detail.reason !== "api") host.close();
@@ -1064,7 +1162,7 @@ function createBackstage(host) {
1064
1162
  ...group ? { group } : {}
1065
1163
  });
1066
1164
  const label = new Map(PAGES);
1067
- const page = (id, group) => item(id, label.get(id), group);
1165
+ const page = (id) => item(id, label.get(id));
1068
1166
  element.items = [
1069
1167
  page("info"),
1070
1168
  page("new"),
@@ -1074,15 +1172,20 @@ function createBackstage(host) {
1074
1172
  page("print"),
1075
1173
  page("share"),
1076
1174
  page("export"),
1077
- page("options", "footer"),
1078
- page("customize", "footer")
1175
+ item("options", "Options", "footer")
1079
1176
  ];
1177
+ options.relocalize();
1080
1178
  if (element.open) show(current);
1081
1179
  };
1082
1180
  relocalize();
1083
1181
  return {
1084
1182
  element,
1183
+ optionsDialog: options.element,
1085
1184
  open(page = "info") {
1185
+ if (page === "options" || page === "customize") {
1186
+ showOptions(page === "customize" ? "ribbon" : void 0);
1187
+ return;
1188
+ }
1086
1189
  show(page);
1087
1190
  element.show(page);
1088
1191
  },
@@ -2803,7 +2906,7 @@ function numberTab(init) {
2803
2906
  list.select(options.code);
2804
2907
  return [text(ctx, label, "xve-field-label"), list.element];
2805
2908
  };
2806
- const renderOptions2 = () => {
2909
+ const renderOptions = () => {
2807
2910
  const parts = [];
2808
2911
  negatives = void 0;
2809
2912
  if (["number", "currency", "accounting", "percentage", "scientific"].includes(category))
@@ -2889,12 +2992,12 @@ function numberTab(init) {
2889
2992
  category = value;
2890
2993
  options.code = category === "custom" ? previous : LISTS[category]?.[0] ?? options.code;
2891
2994
  dirty = true;
2892
- renderOptions2();
2995
+ renderOptions();
2893
2996
  update();
2894
2997
  });
2895
2998
  categories.setItems(CATEGORIES.map(([id, label]) => [id, ctx.t(label)]));
2896
2999
  categories.select(category);
2897
- renderOptions2();
3000
+ renderOptions();
2898
3001
  update();
2899
3002
  ready = true;
2900
3003
  const sampleBox = el(ctx, "div");
@@ -3617,8 +3720,7 @@ function renderSharedGallery(scope, control, command) {
3617
3720
  });
3618
3721
  return gallery;
3619
3722
  }
3620
-
3621
- // src/xlsx/ribbon/overflow.ts
3723
+ var localeOf = (panel3) => normalizeEditorLocale(panel3.closest("[data-editor-locale]")?.dataset.editorLocale);
3622
3724
  var GROUP_ICONS = {
3623
3725
  Clipboard: "paste",
3624
3726
  Font: "fontColor",
@@ -3653,6 +3755,7 @@ var GROUP_ICONS = {
3653
3755
  };
3654
3756
  var overflow = createRibbonOverflow({
3655
3757
  icon: ribbonIcon,
3758
+ moreLabel: (panel3) => translate(localeOf(panel3), "More"),
3656
3759
  groupIcons: GROUP_ICONS,
3657
3760
  fallbackIcon: "select",
3658
3761
  ribbon: ".xve-ribbon",
@@ -15615,6 +15718,7 @@ function createRibbon(ctx, handlers) {
15615
15718
  closeRibbonPopover();
15616
15719
  scope = { ctx, doc, updates: [], isHidden: handlers.isHidden };
15617
15720
  tabs2 = [...ribbonTabs()];
15721
+ root.dataset.editorLocale = normalizeEditorLocale(ctx.locale());
15618
15722
  root.setAttribute("aria-label", ctx.t("Ribbon"));
15619
15723
  root.setAttribute("label", ctx.t("Ribbon tabs"));
15620
15724
  root.setAttribute("file-label", ctx.t("File"));
@@ -15882,7 +15986,7 @@ function cellMode(ctx) {
15882
15986
  if (mode && mode in MODE_LABELS) return mode;
15883
15987
  return grid?.isEditing() ? "edit" : "ready";
15884
15988
  }
15885
- function statisticsText(ctx, shown2) {
15989
+ function statisticsText(ctx, shown2, limit = Infinity) {
15886
15990
  const workbook = ctx.workbook();
15887
15991
  const selection = ctx.selection.get();
15888
15992
  if (!workbook?.sheets?.[selection.sheet]?.rows) return "";
@@ -15897,7 +16001,7 @@ function statisticsText(ctx, shown2) {
15897
16001
  const text3 = key === "count" || key === "numericCount" ? formatNumber(locale, value) : formatSelectionStat(workbook, stats, value);
15898
16002
  parts.push(`${ctx.t(STAT_LABELS[key])}: ${text3}`);
15899
16003
  }
15900
- return parts.join(" ");
16004
+ return parts.slice(0, limit).join(" ");
15901
16005
  }
15902
16006
  function createStatusBar(ctx, handlers) {
15903
16007
  defineStatusBar();
@@ -15932,6 +16036,7 @@ function createStatusBar(ctx, handlers) {
15932
16036
  slider.setAttribute("min", String(ZOOM_MIN));
15933
16037
  slider.setAttribute("max", String(ZOOM_MAX));
15934
16038
  element.append(stats, slider);
16039
+ let layout = statusLayout(0);
15935
16040
  const zoom = () => ctx.grid()?.zoom() ?? 100;
15936
16041
  slider.addEventListener("input", () => handlers.setZoom(slider.value));
15937
16042
  element.addEventListener("office-status-activate", (event) => {
@@ -15951,7 +16056,7 @@ function createStatusBar(ctx, handlers) {
15951
16056
  toggles: [
15952
16057
  { id: "notes", icon: "warning", label: notesText, text: notesText, hidden: count === 0 }
15953
16058
  ],
15954
- views: [
16059
+ views: !layout.views ? false : [
15955
16060
  { id: "normal", icon: "normalView", label: ctx.t("Normal"), pressed: true },
15956
16061
  {
15957
16062
  id: "pageLayout",
@@ -15970,7 +16075,7 @@ function createStatusBar(ctx, handlers) {
15970
16075
  };
15971
16076
  const refresh = () => {
15972
16077
  render3();
15973
- stats.textContent = statisticsText(ctx, shown2);
16078
+ stats.textContent = statisticsText(ctx, shown2, layout.stats);
15974
16079
  slider.value = zoom();
15975
16080
  };
15976
16081
  const relocalize = () => {
@@ -15981,6 +16086,10 @@ function createStatusBar(ctx, handlers) {
15981
16086
  refresh();
15982
16087
  };
15983
16088
  relocalize();
16089
+ watchStatusWidth(element, (width) => {
16090
+ layout = statusLayout(width);
16091
+ refresh();
16092
+ });
15984
16093
  return { element, refresh, relocalize };
15985
16094
  }
15986
16095
  var SAVE_STATE_TEXT = {
@@ -16265,6 +16374,7 @@ function buildShell(core) {
16265
16374
  canvasRow,
16266
16375
  statusBar.element,
16267
16376
  backstage.element,
16377
+ backstage.optionsDialog,
16268
16378
  help.element,
16269
16379
  toaster.element
16270
16380
  );