ooxml-ui 1.6.2 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.md +90 -37
  2. package/custom-elements.json +303 -4
  3. package/dist/chrome/ruler.d.ts +7 -1
  4. package/dist/chrome/ruler.d.ts.map +1 -1
  5. package/dist/chrome/status-bar.d.ts.map +1 -1
  6. package/dist/chrome/tab-strip.d.ts +3 -1
  7. package/dist/chrome/tab-strip.d.ts.map +1 -1
  8. package/dist/chrome/task-pane.d.ts +29 -0
  9. package/dist/chrome/task-pane.d.ts.map +1 -0
  10. package/dist/chrome/title-bar.d.ts +2 -1
  11. package/dist/chrome/title-bar.d.ts.map +1 -1
  12. package/dist/{chunk-QAIVGTQZ.js → chunk-7US5GCXF.js} +158 -153
  13. package/dist/{chunk-Z7CS3UUK.js → chunk-KF72ZA6V.js} +5 -2
  14. package/dist/{chunk-QHAE6Y5B.js → chunk-O7APCA5N.js} +680 -98
  15. package/dist/chunk-W6AV3GHC.js +112 -0
  16. package/dist/controls.d.ts +9 -2
  17. package/dist/controls.d.ts.map +1 -1
  18. package/dist/controls.js +1 -1
  19. package/dist/dialog/dialog-footer.d.ts.map +1 -1
  20. package/dist/dialog/options-dialog.d.ts.map +1 -1
  21. package/dist/docx/editor-core.d.ts +3 -0
  22. package/dist/docx/editor-shell.d.ts +2 -0
  23. package/dist/docx/element-api.d.ts +7 -0
  24. package/dist/docx/events.d.ts +4 -1
  25. package/dist/docx/index.d.ts +1 -0
  26. package/dist/docx/ribbon-color-grid.d.ts +3 -4
  27. package/dist/docx.js +46 -78
  28. package/dist/edit-worker.js +52 -3
  29. package/dist/form/color-custom.d.ts +79 -0
  30. package/dist/form/color-custom.d.ts.map +1 -0
  31. package/dist/form/color-grid.d.ts +125 -0
  32. package/dist/form/color-grid.d.ts.map +1 -0
  33. package/dist/index.d.ts +2 -1
  34. package/dist/index.js +4 -3
  35. package/dist/menu/context-menu.d.ts.map +1 -1
  36. package/dist/menu/menu-button.d.ts +2 -1
  37. package/dist/menu/menu-button.d.ts.map +1 -1
  38. package/dist/notices/paste-options.d.ts.map +1 -1
  39. package/dist/notices/toasts.d.ts.map +1 -1
  40. package/dist/pptx/{chart-3d-view-scene-ERX2GRCD.mjs → chart-3d-view-scene-P6MAFEGL.mjs} +2 -2
  41. package/dist/pptx/{chart-3d-view-scene-55WDENSO.cjs → chart-3d-view-scene-V74F7ZOC.cjs} +38 -38
  42. package/dist/pptx/{chunk-G2YUKLRX.cjs → chunk-526IHNIH.cjs} +1 -1
  43. package/dist/pptx/{chunk-SVN6OBG4.mjs → chunk-DPOES4WM.mjs} +26 -11
  44. package/dist/pptx/{chunk-BLAJIEXA.cjs → chunk-GCS5KBMR.cjs} +511 -653
  45. package/dist/pptx/{chunk-RPRC2EG5.cjs → chunk-K3S2A64B.cjs} +13 -13
  46. package/dist/pptx/{chunk-E55NU4BF.mjs → chunk-MCHPNO42.mjs} +289 -493
  47. package/dist/pptx/{chunk-AWQRQUPL.mjs → chunk-NAFUYAQP.mjs} +1 -1
  48. package/dist/pptx/{chunk-LCIXR7WE.cjs → chunk-VFPVEVF4.cjs} +26 -11
  49. package/dist/pptx/{chunk-TKATCPOK.mjs → chunk-ZAOYPCAM.mjs} +1 -1
  50. package/dist/pptx/dom/activex-controls-overlay.d.ts.map +1 -1
  51. package/dist/pptx/dom/elements/image.d.ts.map +1 -1
  52. package/dist/pptx/dom/elements/media.d.ts.map +1 -1
  53. package/dist/pptx/dom/elements/text-block.d.ts.map +1 -1
  54. package/dist/pptx/dom/elements/zoom.d.ts.map +1 -1
  55. package/dist/pptx/dom/index.cjs +252 -247
  56. package/dist/pptx/dom/index.mjs +11 -6
  57. package/dist/pptx/export/html2canvas-clone.cjs +2 -2
  58. package/dist/pptx/export/html2canvas-clone.mjs +1 -1
  59. package/dist/pptx/index.cjs +3059 -3023
  60. package/dist/pptx/index.mjs +4 -4
  61. package/dist/pptx/render/chart-combo-series.d.ts.map +1 -1
  62. package/dist/pptx/render/chart-combo-stock.cjs +3 -3
  63. package/dist/pptx/render/chart-combo-stock.mjs +1 -1
  64. package/dist/pptx/render/chart-marker-shape.d.ts.map +1 -1
  65. package/dist/pptx/render/chart-overlays.cjs +7 -7
  66. package/dist/pptx/render/chart-overlays.mjs +1 -1
  67. package/dist/pptx/render/chart-surface-treemap.cjs +4 -4
  68. package/dist/pptx/render/chart-surface-treemap.mjs +1 -1
  69. package/dist/pptx/render/chart-view-model.cjs +44 -44
  70. package/dist/pptx/render/chart-view-model.mjs +1 -1
  71. package/dist/pptx/render/chart-waterfall-map.cjs +6 -6
  72. package/dist/pptx/render/chart-waterfall-map.mjs +1 -1
  73. package/dist/pptx/render/connector-router-types.d.ts +4 -52
  74. package/dist/pptx/render/connector-router-types.d.ts.map +1 -1
  75. package/dist/pptx/render/connector-router.d.ts +4 -32
  76. package/dist/pptx/render/connector-router.d.ts.map +1 -1
  77. package/dist/pptx/render/editor-keymap-arrows.d.ts +0 -7
  78. package/dist/pptx/render/editor-keymap-arrows.d.ts.map +1 -1
  79. package/dist/pptx/render/element-interaction.d.ts +2 -6
  80. package/dist/pptx/render/element-interaction.d.ts.map +1 -1
  81. package/dist/pptx/render/index.d.ts +1 -0
  82. package/dist/pptx/render/index.d.ts.map +1 -1
  83. package/dist/pptx/render/ribbon-add-ins.d.ts +53 -0
  84. package/dist/pptx/render/ribbon-add-ins.d.ts.map +1 -0
  85. package/dist/pptx/web-components/index.d.ts +1 -0
  86. package/dist/pptx/web-components/index.d.ts.map +1 -1
  87. package/dist/pptx/web-components/ribbon-add-in.d.ts +20 -0
  88. package/dist/pptx/web-components/ribbon-add-in.d.ts.map +1 -0
  89. package/dist/ribbon/add-in-tabs.d.ts +36 -0
  90. package/dist/ribbon/group-overflow.d.ts +37 -0
  91. package/dist/ribbon/group-overflow.d.ts.map +1 -0
  92. package/dist/ribbon/ribbon-tabs.d.ts.map +1 -1
  93. package/dist/teams/app/index.d.ts +1 -1
  94. package/dist/teams.js +2 -2
  95. package/dist/visio/format-pane-fields.d.ts +42 -0
  96. package/dist/visio/format-pane-view.d.ts +44 -0
  97. package/dist/visio/index.d.ts +1 -0
  98. package/dist/visio/page-setup-action.d.ts +4 -0
  99. package/dist/visio/ribbon-action.d.ts +20 -7
  100. package/dist/visio/ribbon-change-shape.d.ts +17 -6
  101. package/dist/visio/ribbon-color-menu.d.ts +29 -0
  102. package/dist/visio/ribbon-inline-galleries.d.ts +20 -0
  103. package/dist/visio/ribbon-overflow.d.ts +7 -0
  104. package/dist/visio/ribbon-review.d.ts +5 -2
  105. package/dist/visio/ribbon-router.d.ts +3 -3
  106. package/dist/visio/ribbon-shape-styles.d.ts +4 -1
  107. package/dist/visio/ribbon-style-options.d.ts +4 -3
  108. package/dist/visio/ribbon.d.ts +2 -2
  109. package/dist/visio/shapes-document.d.ts +29 -0
  110. package/dist/visio/shapes-sections.d.ts +19 -5
  111. package/dist/visio/shapes-storage.d.ts +15 -0
  112. package/dist/visio/shapes-window.d.ts +9 -2
  113. package/dist/visio/status-bar.d.ts +7 -4
  114. package/dist/visio/stencil-catalog.d.ts +4 -0
  115. package/dist/visio/styles/theme.d.ts +1 -1
  116. package/dist/visio/styles.d.ts +1 -1
  117. package/dist/visio/text-measurer.d.ts +25 -0
  118. package/dist/visio/title-bar.d.ts +9 -0
  119. package/dist/visio/viewer-auto-connect-parts.d.ts +12 -0
  120. package/dist/visio/viewer-auto-connect.d.ts +33 -0
  121. package/dist/visio/viewer-backstage.d.ts +2 -1
  122. package/dist/visio/viewer-canvas.d.ts +1 -1
  123. package/dist/visio/viewer-change-shape.d.ts +8 -4
  124. package/dist/visio/viewer-chrome.d.ts +13 -5
  125. package/dist/visio/viewer-color-menus.d.ts +34 -0
  126. package/dist/visio/viewer-commands.d.ts +4 -1
  127. package/dist/visio/viewer-connector-tool.d.ts +5 -3
  128. package/dist/visio/viewer-data-window.d.ts +5 -1
  129. package/dist/visio/viewer-draw-tool.d.ts +1 -11
  130. package/dist/visio/viewer-element.d.ts +16 -0
  131. package/dist/visio/viewer-format-pane.d.ts +26 -0
  132. package/dist/visio/viewer-guides.d.ts +7 -4
  133. package/dist/visio/viewer-inline-text.d.ts +31 -0
  134. package/dist/visio/viewer-input.d.ts +5 -1
  135. package/dist/visio/viewer-layer-properties.d.ts +18 -0
  136. package/dist/visio/viewer-layout-commands.d.ts +8 -2
  137. package/dist/visio/viewer-more-colors.d.ts +16 -0
  138. package/dist/visio/viewer-options.d.ts +18 -4
  139. package/dist/visio/viewer-page-setup.d.ts +6 -0
  140. package/dist/visio/viewer-ruler-grid.d.ts +25 -0
  141. package/dist/visio/viewer-ruler.d.ts +11 -3
  142. package/dist/visio/viewer-snap-glue.d.ts +23 -0
  143. package/dist/visio/viewer-stencil.d.ts +4 -1
  144. package/dist/visio.js +7595 -5944
  145. package/dist/xlsx/component.d.ts +8 -0
  146. package/dist/xlsx/dialogs/format-cells/color-swatches.d.ts +4 -2
  147. package/dist/xlsx/dialogs/styles.d.ts +1 -1
  148. package/dist/xlsx/events.d.ts +4 -1
  149. package/dist/xlsx/index.d.ts +1 -0
  150. package/dist/xlsx/ribbon/color-grid.d.ts +25 -7
  151. package/dist/xlsx/ribbon/ribbon.d.ts +3 -0
  152. package/dist/xlsx.js +121 -163
  153. package/package.json +3 -2
  154. package/dist/pptx/render/connector-router-astar.d.ts +0 -24
  155. package/dist/pptx/render/connector-router-astar.d.ts.map +0 -1
  156. package/dist/pptx/render/connector-router-graph.d.ts +0 -38
  157. package/dist/pptx/render/connector-router-graph.d.ts.map +0 -1
  158. package/dist/visio/format-shape-dialog.d.ts +0 -21
  159. package/dist/visio/viewer-edit-controls.d.ts +0 -12
  160. package/dist/visio/viewer-format-shape.d.ts +0 -16
  161. package/dist/visio/viewer-geometry-controls.d.ts +0 -14
  162. package/dist/visio/viewer-layer-controls.d.ts +0 -5
  163. package/dist/visio/viewer-paint-dialog.d.ts +0 -28
  164. package/dist/visio/viewer-paint-properties.d.ts +0 -13
package/dist/xlsx.js CHANGED
@@ -1,17 +1,19 @@
1
- import './chunk-Z7CS3UUK.js';
1
+ import './chunk-KF72ZA6V.js';
2
+ import { syncRibbonAddIns } from './chunk-W6AV3GHC.js';
3
+ export { RIBBON_ADD_IN_EVENT } from './chunk-W6AV3GHC.js';
2
4
  import { defineSmartArt } from './chunk-PXIYHFZ5.js';
3
- import { withExtension, saveExtension, downloadBytes, emit, emitEvent, blobFor, announceFileCommand, pickFile } from './chunk-QAIVGTQZ.js';
4
- export { XLSX_EDITOR_EVENTS } from './chunk-QAIVGTQZ.js';
5
+ import { withExtension, saveExtension, downloadBytes, emit, emitEvent, blobFor, announceFileCommand, pickFile } from './chunk-7US5GCXF.js';
6
+ export { XLSX_EDITOR_EVENTS } from './chunk-7US5GCXF.js';
5
7
  import './chunk-SNV6YKPC.js';
6
8
  import { shadcnBridge } from './chunk-BCH2ZLWI.js';
7
- import { range_control_default, createRibbonOverflow, defineBackstage, defineRibbon, defineRibbonActions, defineTitleBar, defineStatusBar, defineZoomSlider, rangeControl, defineDialog, runKeyTips, assignKeyTips, defineCheckbox, defineGallery, defineContextMenu, defineCommentsPane, parseSvgPreview } from './chunk-QHAE6Y5B.js';
9
+ import { range_control_default, createRibbonOverflow, defineBackstage, defineRibbon, defineRibbonActions, defineTitleBar, defineStatusBar, defineZoomSlider, rangeControl, defineDialog, runKeyTips, assignKeyTips, defineCheckbox, defineGallery, defineColorGrid, defineContextMenu, defineCommentsPane, parseSvgPreview } from './chunk-O7APCA5N.js';
8
10
  import { getIcon, registerIcon } from './chunk-M6GF5ED2.js';
9
11
  import { definePresence } from './chunk-L7JV5FVE.js';
10
12
  import { withTokens } from './chunk-OGNNNTKI.js';
11
13
  import './chunk-SPNWHKSR.js';
12
14
  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, 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
15
  export { EDITOR_LOCALES, THEME_KEYS, normalizeEditorLocale, registerRibbonTabs, themeToCssVars, darkTheme as xlsxDarkTheme, lightTheme as xlsxLightTheme } from 'ooxml-core/xlsx/ui';
14
- import { createWorksheet, createEditSession, approximateMeasure, createWorkbook, MAX_ROW, MAX_COL, chartView, createRefEvaluator, chartBarSpacing, CHART_FILL_PARTS, selectionStats, formatSelectionStat, formatRange, chartSeriesTransparencyPatch, chartSeriesTransparency, chartSeriesGradientPatch, chartSeriesSolidFillPatch, chartSeriesFillPatch, chartWithElementFills, chartElementTransparencyPatch, chartElementTransparency, chartElementGradientPatch, chartElementSolidFillPatch, chartElementFillPatch, chartElementFill, usedRange, chartGradientStopTransparency, createGridMetrics, mergeView, cellView, DEFAULT_THEME, resolveColor, nextSheetName, FUNCTION_CATALOG, mergeAt, visibleCells, getCell, cellInputText, closeParens, isFormulaText, parseCellInput, referenceTarget, formatAddress, 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, validateDefinedName, parseAddress, styleAt, parseRange, rangesIntersect, chartColorScheme, coloredReferences, syntaxParams, activeParam, columnLabel, THEME_SLOTS, normalizeRange, currentRegion, autoFitColumnWidth, validateSheetName, dateToSerial, IMAGE_EXTENSIONS, verifySheetPassword, verifyWorkbookPassword, sheetByName, quoteSheetName, serialToDate, BUILTIN_NUMBER_FORMATS, pixelsToColumnWidth, validateTableName } from 'ooxml-core/xlsx';
16
+ import { createWorksheet, createEditSession, approximateMeasure, createWorkbook, MAX_ROW, MAX_COL, chartView, createRefEvaluator, chartBarSpacing, CHART_FILL_PARTS, selectionStats, formatSelectionStat, formatRange, chartSeriesTransparencyPatch, chartSeriesTransparency, chartSeriesGradientPatch, chartSeriesSolidFillPatch, chartSeriesFillPatch, chartWithElementFills, chartElementTransparencyPatch, chartElementTransparency, chartElementGradientPatch, chartElementSolidFillPatch, chartElementFillPatch, chartElementFill, usedRange, chartGradientStopTransparency, createGridMetrics, mergeView, cellView, resolveColor, DEFAULT_THEME, nextSheetName, FUNCTION_CATALOG, mergeAt, visibleCells, getCell, cellInputText, closeParens, isFormulaText, parseCellInput, referenceTarget, formatAddress, 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, validateDefinedName, parseAddress, styleAt, parseRange, rangesIntersect, chartColorScheme, coloredReferences, syntaxParams, activeParam, columnLabel, THEME_SLOTS, normalizeRange, currentRegion, autoFitColumnWidth, validateSheetName, dateToSerial, IMAGE_EXTENSIONS, verifySheetPassword, verifyWorkbookPassword, sheetByName, quoteSheetName, serialToDate, BUILTIN_NUMBER_FORMATS, pixelsToColumnWidth, validateTableName } from 'ooxml-core/xlsx';
15
17
  import { hyperlinkPolicy } from 'ooxml-core/opc';
16
18
  import { resolveChartGradient, sortGradientStops, withChartGradientDirection, buildChartGradientDef, chartGradientMarkup, CHART_COLOR_PALETTES, chartPaletteColors } from 'ooxml-core/chart';
17
19
  import { render } from 'lit';
@@ -24,7 +26,7 @@ var shell_default = "/* Frame, title bar and status bar. Mirrors docx-viewer's c
24
26
  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";
25
27
 
26
28
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/xlsx/theme/popups.css?raw
27
- 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: Automatic, Theme Colors (ten columns over five tints), Standard Colors, More. */\n.ribbon-popover.color-grid {\n display: block;\n width: 236px;\n padding: 8px 10px;\n}\n.color-grid-title {\n margin: 6px 0 4px;\n color: var(--muted);\n font-weight: 600;\n font-size: 11px;\n}\n.color-grid-cells {\n display: grid;\n grid-template-columns: repeat(10, 20px);\n gap: 2px 3px;\n}\n.color-grid .swatch {\n width: 20px;\n height: 20px;\n padding: 0;\n border: 1px solid var(--line);\n border-radius: 2px;\n background: var(--swatch);\n cursor: pointer;\n}\n.color-grid .swatch:hover,\n.color-grid .swatch:focus-visible {\n outline: 2px solid var(--xl);\n outline-offset: 1px;\n}\n.color-grid-command {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n margin: 2px 0;\n padding: 5px 6px;\n border: 0;\n border-radius: 3px;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n.color-grid-command:hover,\n.color-grid-command:focus-visible {\n background: var(--accent-soft);\n}\n.color-grid-input {\n position: absolute;\n width: 0;\n height: 0;\n padding: 0;\n border: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n/* 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";
29
+ 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";
28
30
 
29
31
  // raw-css:/home/runner/work/ooxml/ooxml/src/ui/src/xlsx/theme/backstage.css?raw
30
32
  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";
@@ -1299,7 +1301,7 @@ var DIALOG_CSS = `
1299
1301
  border: 1px solid var(--xve-border, #c8c6c4); background: var(--xve-secondary, #fff); color: inherit; font: inherit; }
1300
1302
  .xve-btn:hover:not(:disabled) { background: var(--xve-accent, #f3f2f1); }
1301
1303
  .xve-btn:focus-visible, .xve-input:focus-visible, .xve-tab:focus-visible, .xve-listbox:focus-visible,
1302
- .xve-swatch:focus-visible, .xve-tile:focus-visible { outline: 2px solid var(--xve-ring, #217346); outline-offset: 1px; }
1304
+ .xve-tile:focus-visible { outline: 2px solid var(--xve-ring, #217346); outline-offset: 1px; }
1303
1305
  .xve-btn-primary { background: var(--xve-primary, #217346); color: var(--xve-primary-foreground, #fff);
1304
1306
  border-color: var(--xve-primary, #217346); }
1305
1307
  .xve-btn-primary:hover:not(:disabled) { background: var(--xve-primary, #1b5e38); filter: brightness(.95); }
@@ -1329,9 +1331,6 @@ textarea.xve-input { resize: vertical; }
1329
1331
  .xve-option[aria-selected="true"] { background: var(--xve-selection, #cce8d6); color: inherit; }
1330
1332
  .xve-sample { min-height: 40px; display: flex; align-items: center; justify-content: center; padding: 6px;
1331
1333
  border: 1px solid var(--xve-border, #e1dfdd); background: var(--xve-sheet-bg, #fff); color: #000; overflow: hidden; }
1332
- .xve-swatches { display: grid; grid-template-columns: repeat(10, 18px); gap: 3px; }
1333
- .xve-swatch { width: 18px; height: 18px; border: 1px solid #c8c6c4; padding: 0; cursor: pointer; border-radius: 2px; }
1334
- .xve-swatch[aria-pressed="true"] { outline: 2px solid var(--xve-primary, #217346); outline-offset: 1px; }
1335
1334
  .xve-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(84px, 1fr)); gap: 6px; }
1336
1335
  .xve-tile { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 6px; cursor: pointer;
1337
1336
  border: 1px solid var(--xve-border, #e1dfdd); border-radius: var(--xve-radius, 4px); background: transparent; color: inherit; font: inherit; }
@@ -2073,23 +2072,17 @@ function openList(anchor, items2, current, choose, options = {}) {
2073
2072
 
2074
2073
  // src/xlsx/ribbon/color-grid.ts
2075
2074
  var THEME_COLUMNS = [
2076
- [0, "Background 1"],
2077
- [1, "Text 1"],
2078
- [2, "Background 2"],
2079
- [3, "Text 2"],
2080
- [4, "Accent 1"],
2081
- [5, "Accent 2"],
2082
- [6, "Accent 3"],
2083
- [7, "Accent 4"],
2084
- [8, "Accent 5"],
2085
- [9, "Accent 6"]
2075
+ "Background 1",
2076
+ "Text 1",
2077
+ "Background 2",
2078
+ "Text 2",
2079
+ "Accent 1",
2080
+ "Accent 2",
2081
+ "Accent 3",
2082
+ "Accent 4",
2083
+ "Accent 5",
2084
+ "Accent 6"
2086
2085
  ];
2087
- function themeTints(slot) {
2088
- if (slot === 0) return [-0.05, -0.15, -0.25, -0.35, -0.5];
2089
- if (slot === 1) return [0.5, 0.35, 0.25, 0.15, 0.05];
2090
- if (slot === 2) return [-0.1, -0.25, -0.5, -0.75, -0.9];
2091
- return [0.8, 0.6, 0.4, -0.25, -0.5];
2092
- }
2093
2086
  var STANDARD_COLORS = [
2094
2087
  ["C00000", "Dark Red"],
2095
2088
  ["FF0000", "Red"],
@@ -2102,170 +2095,101 @@ var STANDARD_COLORS = [
2102
2095
  ["002060", "Dark Blue"],
2103
2096
  ["7030A0", "Purple"]
2104
2097
  ];
2105
- var tintName = (tint, t) => tint > 0 ? t("Lighter {percent}%", { percent: Math.round(tint * 100) }) : t("Darker {percent}%", { percent: Math.round(-tint * 100) });
2106
2098
  function cssColor(color, theme = DEFAULT_THEME) {
2107
2099
  return resolveColor(color, theme) ?? "transparent";
2108
2100
  }
2101
+ var hex = (css) => {
2102
+ const digits = css?.replace(/^#/, "").slice(-6);
2103
+ return digits && /^[0-9a-f]{6}$/i.test(digits) ? `#${digits.toLowerCase()}` : void 0;
2104
+ };
2105
+ function excelColorGrid(doc, theme, t, options = {}) {
2106
+ defineColorGrid();
2107
+ const grid = doc.createElement("office-ui-color-grid");
2108
+ grid.themeColors = THEME_COLUMNS.map((_, slot) => hex(resolveColor({ theme: slot }, theme)));
2109
+ grid.themeNames = THEME_COLUMNS.map((name) => t(name));
2110
+ grid.variantLabel = (column, variant) => `${column}, ${t(variant.kind === "lighter" ? "Lighter {percent}%" : "Darker {percent}%", {
2111
+ percent: variant.percent
2112
+ })}`;
2113
+ grid.standardColors = STANDARD_COLORS.map(([rgb, name]) => ({
2114
+ hex: `#${rgb.toLowerCase()}`,
2115
+ label: t(name)
2116
+ }));
2117
+ grid.themeHeading = t("Theme Colors");
2118
+ grid.standardHeading = t("Standard Colors");
2119
+ if (options.label) grid.label = options.label;
2120
+ if (options.noneLabel) grid.automaticLabel = t(options.noneLabel);
2121
+ if (options.moreLabel) grid.moreLabel = t(options.moreLabel);
2122
+ return grid;
2123
+ }
2124
+ function pickedExcelColor(pick, alpha = false) {
2125
+ if (pick.source === "automatic" || pick.source === "none") return void 0;
2126
+ if (pick.source === "theme" && pick.theme) {
2127
+ const variant = pick.theme.variant;
2128
+ const tint = variant ? (variant.kind === "lighter" ? 1 : -1) * (variant.percent / 100) : 0;
2129
+ return tint ? { theme: pick.theme.column, tint } : { theme: pick.theme.column };
2130
+ }
2131
+ const rgb = pick.color.slice(1).toUpperCase();
2132
+ return { rgb: alpha ? `FF${rgb}` : rgb };
2133
+ }
2134
+ function excelGridValue(color, theme) {
2135
+ return (color ? hex(resolveColor(color, theme)) : void 0) ?? "automatic";
2136
+ }
2109
2137
  function openColorGrid(anchor, choose, options) {
2110
- const { t } = options;
2111
2138
  const theme = options.theme ?? DEFAULT_THEME;
2112
2139
  const doc = anchor.ownerDocument;
2113
2140
  const pop = doc.createElement("div");
2114
2141
  pop.className = "ribbon-popover color-grid";
2115
- pop.setAttribute("role", "menu");
2116
2142
  const pick = (color) => {
2117
2143
  closeRibbonPopover();
2118
2144
  choose(color);
2119
2145
  };
2120
- const swatch = (color, name) => {
2121
- const item = doc.createElement("button");
2122
- item.type = "button";
2123
- item.setAttribute("role", "menuitem");
2124
- item.className = "swatch";
2125
- item.style.setProperty("--swatch", cssColor(color, theme));
2126
- item.setAttribute("aria-label", name);
2127
- item.title = name;
2128
- item.addEventListener("mousedown", (event) => event.preventDefault());
2129
- item.addEventListener("click", () => pick(color));
2130
- return item;
2131
- };
2132
- const title = (text3) => {
2133
- const el3 = doc.createElement("div");
2134
- el3.className = "color-grid-title";
2135
- el3.textContent = t(text3);
2136
- return el3;
2137
- };
2138
- const cells = (items2) => {
2139
- const el3 = doc.createElement("div");
2140
- el3.className = "color-grid-cells";
2141
- el3.append(...items2);
2142
- return el3;
2143
- };
2144
- const command = (text3, run) => {
2145
- const button2 = doc.createElement("button");
2146
- button2.type = "button";
2147
- button2.setAttribute("role", "menuitem");
2148
- button2.className = "color-grid-command";
2149
- button2.textContent = text3;
2150
- button2.addEventListener("mousedown", (event) => event.preventDefault());
2151
- button2.addEventListener("click", run);
2152
- return button2;
2153
- };
2154
- if (options.automaticLabel) pop.append(command(t(options.automaticLabel), () => pick(void 0)));
2155
- const top = THEME_COLUMNS.map(([slot, name]) => swatch({ theme: slot }, t(name)));
2156
- const rows = [0, 1, 2, 3, 4].flatMap(
2157
- (row2) => THEME_COLUMNS.map(([slot, name]) => {
2158
- const tint = themeTints(slot)[row2] ?? 0;
2159
- return swatch({ theme: slot, tint }, `${t(name)}, ${tintName(tint, t)}`);
2160
- })
2161
- );
2162
- pop.append(
2163
- title("Theme Colors"),
2164
- cells([...top, ...rows]),
2165
- title("Standard Colors"),
2166
- cells(STANDARD_COLORS.map(([rgb, name]) => swatch({ rgb }, t(name))))
2167
- );
2146
+ const grid = excelColorGrid(doc, theme, options.t, {
2147
+ ...options.automaticLabel ? { noneLabel: options.automaticLabel } : {},
2148
+ moreLabel: "More Colors..."
2149
+ });
2168
2150
  const input = doc.createElement("input");
2169
2151
  input.type = "color";
2170
2152
  input.className = "color-grid-input";
2171
2153
  input.tabIndex = -1;
2172
2154
  input.addEventListener("change", () => pick({ rgb: input.value.slice(1).toUpperCase() }));
2173
- pop.append(
2174
- command(t("More Colors..."), () => input.click()),
2175
- input
2155
+ grid.addEventListener(
2156
+ "office-color-pick",
2157
+ (event) => pick(pickedExcelColor(event.detail))
2176
2158
  );
2177
- arrowNavigation(pop, '[role="menuitem"]');
2159
+ grid.addEventListener("office-color-more", () => input.click());
2160
+ pop.addEventListener("mousedown", (event) => event.preventDefault());
2161
+ pop.append(grid, input);
2178
2162
  if (!mountPopover(anchor, pop)) return;
2179
- pop.querySelector('[role="menuitem"]')?.focus();
2163
+ grid.focus();
2180
2164
  }
2181
2165
 
2182
2166
  // src/xlsx/dialogs/format-cells/color-swatches.ts
2183
- var THEME_NAMES = [
2184
- [0, "Background 1"],
2185
- [1, "Text 1"],
2186
- [2, "Background 2"],
2187
- [3, "Text 2"],
2188
- [4, "Accent 1"],
2189
- [5, "Accent 2"],
2190
- [6, "Accent 3"],
2191
- [7, "Accent 4"],
2192
- [8, "Accent 5"],
2193
- [9, "Accent 6"]
2194
- ];
2195
- var colorKey = (color) => color ? JSON.stringify([
2196
- color.rgb?.slice(-6).toUpperCase(),
2197
- color.theme,
2198
- color.tint,
2199
- color.indexed,
2200
- color.auto
2201
- ]) : "none";
2202
2167
  function swatchGrid(ctx, label, noneLabel, initial, onChange) {
2203
2168
  const theme = ctx.workbook()?.theme ?? { colors: [], majorFont: "", minorFont: "" };
2204
- const wrapper = el(ctx, "div", "xve-swatch-picker");
2205
- wrapper.setAttribute("role", "group");
2206
- wrapper.setAttribute("aria-label", ctx.t(label));
2169
+ const grid = excelColorGrid(ctx.host.ownerDocument, theme, ctx.t, {
2170
+ noneLabel,
2171
+ label: ctx.t(label)
2172
+ });
2173
+ grid.classList.add("xve-swatch-picker");
2207
2174
  let current = initial;
2208
- const buttons = [];
2209
2175
  const paint = () => {
2210
- const key = colorKey(current);
2211
- for (const { button: button2, color } of buttons)
2212
- button2.setAttribute("aria-pressed", String(colorKey(color) === key));
2176
+ grid.value = excelGridValue(current, theme);
2213
2177
  };
2214
- const choose = (color) => {
2215
- current = color;
2178
+ grid.addEventListener("office-color-pick", (event) => {
2179
+ event.stopPropagation();
2180
+ current = pickedExcelColor(event.detail, true);
2216
2181
  paint();
2217
- onChange?.(color);
2218
- };
2219
- const none = el(ctx, "button", "xve-btn xve-swatch-none");
2220
- none.type = "button";
2221
- none.textContent = ctx.t(noneLabel);
2222
- none.addEventListener("click", () => choose(void 0));
2223
- buttons.push({ button: none, color: void 0 });
2224
- const swatch = (color, name) => {
2225
- const b = el(ctx, "button", "xve-swatch");
2226
- b.type = "button";
2227
- b.style.background = resolveColor(color, theme) ?? "transparent";
2228
- b.setAttribute("aria-label", name);
2229
- b.title = name;
2230
- b.addEventListener("click", () => choose(color));
2231
- buttons.push({ button: b, color });
2232
- return b;
2233
- };
2234
- const tintName2 = (tint) => tint > 0 ? ctx.t("Lighter {percent}%", { percent: Math.round(tint * 100) }) : ctx.t("Darker {percent}%", { percent: Math.round(-tint * 100) });
2235
- const themeGrid = el(ctx, "div", "xve-swatches");
2236
- for (const [slot, name] of THEME_NAMES) themeGrid.append(swatch({ theme: slot }, ctx.t(name)));
2237
- for (let row2 = 0; row2 < 5; row2++)
2238
- for (const [slot, name] of THEME_NAMES) {
2239
- const tint = themeTints(slot)[row2] ?? 0;
2240
- themeGrid.append(swatch({ theme: slot, tint }, `${ctx.t(name)}, ${tintName2(tint)}`));
2241
- }
2242
- const standard = el(ctx, "div", "xve-swatches");
2243
- for (const [rgb, name] of STANDARD_COLORS)
2244
- standard.append(swatch({ rgb: `FF${rgb}` }, ctx.t(name)));
2245
- const cap = (key) => {
2246
- const d = el(ctx, "div", "xve-note");
2247
- d.textContent = ctx.t(key);
2248
- return d;
2249
- };
2250
- wrapper.append(none, cap("Theme Colors"), themeGrid, cap("Standard Colors"), standard);
2251
- wrapper.addEventListener("keydown", (event) => {
2252
- const list = buttons.map((b) => b.button);
2253
- const index = list.indexOf(event.target);
2254
- if (index < 0) return;
2255
- const delta = { ArrowRight: 1, ArrowLeft: -1, ArrowDown: 10, ArrowUp: -10 }[event.key];
2256
- if (!delta) return;
2257
- event.preventDefault();
2258
- const next = index === 0 ? delta > 0 ? 1 : 0 : Math.max(0, Math.min(list.length - 1, index + delta));
2259
- list[next]?.focus();
2182
+ onChange?.(current);
2260
2183
  });
2261
2184
  paint();
2262
2185
  return {
2263
- element: wrapper,
2186
+ element: grid,
2264
2187
  value: () => current,
2265
2188
  set(color) {
2266
2189
  current = color;
2267
2190
  paint();
2268
- }
2191
+ },
2192
+ focus: () => grid.focus()
2269
2193
  };
2270
2194
  }
2271
2195
 
@@ -2989,7 +2913,7 @@ function openTabColorDialog(ctx) {
2989
2913
  name: "tab-color",
2990
2914
  heading: "Tab Color",
2991
2915
  body: grid.element,
2992
- opened: () => grid.element.querySelector('[aria-pressed="true"]')?.focus(),
2916
+ opened: () => grid.focus(),
2993
2917
  submit: () => {
2994
2918
  const color = grid.value();
2995
2919
  session.setTabColor(index, color);
@@ -4908,7 +4832,7 @@ var TYPES2 = [
4908
4832
  ["percentile", "Percentile"],
4909
4833
  ["formula", "Formula"]
4910
4834
  ];
4911
- var hex = (c, fallback) => `#${(c?.rgb ?? fallback).slice(-6)}`;
4835
+ var hex2 = (c, fallback) => `#${(c?.rgb ?? fallback).slice(-6)}`;
4912
4836
  var argb = (css) => ({ rgb: `FF${css.replace("#", "").toUpperCase()}` });
4913
4837
  function point(ctx, label, types, initial, color) {
4914
4838
  const type = select(
@@ -4947,7 +4871,7 @@ var loadPoint = (p, cfvo, color) => {
4947
4871
  p.value.value = cfvo.value ?? "";
4948
4872
  p.type.dispatchEvent(new Event("change"));
4949
4873
  }
4950
- if (color) p.color.value = hex(color, "000000");
4874
+ if (color) p.color.value = hex2(color, "000000");
4951
4875
  };
4952
4876
  function valuesPanel(ctx) {
4953
4877
  const style = select(
@@ -5048,7 +4972,7 @@ function valuesPanel(ctx) {
5048
4972
  style.value = "dataBar";
5049
4973
  loadPoint(min, rule.min);
5050
4974
  loadPoint(max, rule.max);
5051
- bar.value = hex(rule.color, "638EC6");
4975
+ bar.value = hex2(rule.color, "638EC6");
5052
4976
  } else if (rule.type === "iconSet") {
5053
4977
  style.value = "iconSet";
5054
4978
  iconSet.value = rule.iconSet;
@@ -13918,7 +13842,9 @@ var visibleSheetIndices = (workbook) => workbook.sheets.flatMap((sheet, index) =
13918
13842
  function renderTabs(doc, strip, options) {
13919
13843
  const { workbook, active: active2, focusable } = options;
13920
13844
  const previous = /* @__PURE__ */ new Map();
13921
- for (const node of [...strip.children].filter((node2) => node2.classList.contains("xst-tab")))
13845
+ for (const node of [...strip.children].filter(
13846
+ (node2) => node2.classList.contains("xst-tab")
13847
+ ))
13922
13848
  if (node.dataset.sheet !== void 0) previous.set(node.dataset.sheet, node);
13923
13849
  const tabs2 = visibleSheetIndices(workbook).map((index) => {
13924
13850
  const sheet = workbook.sheets[index];
@@ -14395,7 +14321,9 @@ function showTabKeyTips(root, select2) {
14395
14321
  active?.();
14396
14322
  const file = root.fileButton();
14397
14323
  const targets = file ? [{ key: "F", element: file, activate: () => file.click() }] : [];
14398
- for (const panel3 of [...root.children].filter((node) => node.classList.contains("ribbon-panel"))) {
14324
+ for (const panel3 of [...root.children].filter(
14325
+ (node) => node.classList.contains("ribbon-panel")
14326
+ )) {
14399
14327
  const id = panel3.dataset.tab ?? "";
14400
14328
  const tab = tabButton(root, id);
14401
14329
  if (!tab || isTabHidden(panel3)) continue;
@@ -14442,7 +14370,9 @@ function applyRibbonVisibility(root, isHidden) {
14442
14370
  stack.toggleAttribute(HIDDEN, empty(stack));
14443
14371
  for (const group of root.querySelectorAll(".ribbon-group"))
14444
14372
  group.toggleAttribute(HIDDEN, empty(group));
14445
- for (const panel3 of [...root.children].filter((node) => node.classList.contains("ribbon-panel")))
14373
+ for (const panel3 of [...root.children].filter(
14374
+ (node) => node.classList.contains("ribbon-panel")
14375
+ ))
14446
14376
  setTabHidden(root, panel3.dataset.tab ?? "", "custom", empty(panel3));
14447
14377
  }
14448
14378
 
@@ -14530,7 +14460,13 @@ function createRibbon(ctx, handlers) {
14530
14460
  let tabs2 = [];
14531
14461
  let stopOverflow = () => {
14532
14462
  };
14533
- const panels = () => [...[...root.children].filter((node) => node.classList.contains("ribbon-panel"))];
14463
+ let addIns = [];
14464
+ const syncAddIns = () => syncRibbonAddIns(root, addIns, { panelClass: "ribbon-panel" });
14465
+ const panels = () => [
14466
+ ...[...root.children].filter(
14467
+ (node) => node.classList.contains("ribbon-panel")
14468
+ )
14469
+ ];
14534
14470
  const panelFor = (id) => panels().find((panel3) => panel3.dataset.tab === id);
14535
14471
  const select2 = (id) => {
14536
14472
  const panel3 = panelFor(id);
@@ -14566,6 +14502,7 @@ function createRibbon(ctx, handlers) {
14566
14502
  }
14567
14503
  root.append(panel3);
14568
14504
  }
14505
+ syncAddIns();
14569
14506
  refresh();
14570
14507
  stopOverflow = attachRibbonOverflow(root);
14571
14508
  };
@@ -14589,6 +14526,14 @@ function createRibbon(ctx, handlers) {
14589
14526
  refresh,
14590
14527
  rebuild: build,
14591
14528
  selectTab: select2,
14529
+ setAddIns: (next) => {
14530
+ addIns = next;
14531
+ const before = root.querySelector("[data-add-in]");
14532
+ syncAddIns();
14533
+ if (root.querySelector("[data-add-in]") === before) return;
14534
+ stopOverflow();
14535
+ stopOverflow = attachRibbonOverflow(root);
14536
+ },
14592
14537
  activeTab: () => root.selected || void 0,
14593
14538
  showKeyTips: () => {
14594
14539
  root.focusTab();
@@ -16017,11 +15962,13 @@ var XlsxEditorElement = class extends XlsxEditorApi {
16017
15962
  return XLSX_EDITOR_ATTRIBUTES;
16018
15963
  }
16019
15964
  shell;
15965
+ addIns = [];
16020
15966
  connectedCallback() {
16021
15967
  if (this.shell) return;
16022
15968
  this.shell = buildShell(this.core);
16023
15969
  this.chrome = this.shell.chrome;
16024
15970
  this.openShare = () => this.shell?.backstage.open("share");
15971
+ if (this.addIns.length) this.shell.ribbon.setAddIns(this.addIns);
16025
15972
  this.core.requestRender();
16026
15973
  }
16027
15974
  attributeChangedCallback(name, _old, value) {
@@ -16103,6 +16050,17 @@ var XlsxEditorElement = class extends XlsxEditorApi {
16103
16050
  this.core.hiddenActions = [...value ?? []];
16104
16051
  this.core.requestRender();
16105
16052
  }
16053
+ /**
16054
+ * Tabs a host adds after Excel's own, as an Office add-in does. Each command runs its `run`
16055
+ * callback and dispatches `office-ribbon-add-in` (`{ tab, command }`) from the editor.
16056
+ */
16057
+ get ribbonAddIns() {
16058
+ return this.addIns;
16059
+ }
16060
+ set ribbonAddIns(value) {
16061
+ this.addIns = value ?? [];
16062
+ this.shell?.ribbon.setAddIns(this.addIns);
16063
+ }
16106
16064
  /** The open workbook model, or null. Assigning one shows it with a fresh undo history. */
16107
16065
  get workbook() {
16108
16066
  return this.core.workbook ?? null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ooxml-ui",
3
- "version": "1.6.2",
3
+ "version": "1.8.0",
4
4
  "description": "Shared, format-neutral web components and styles for the Office viewers (Word, PowerPoint, Excel)",
5
5
  "keywords": [
6
6
  "custom-elements",
@@ -146,7 +146,7 @@
146
146
  "dompurify": "^3.4.16",
147
147
  "emf-converter": "4.11.2",
148
148
  "lit": "^3.3.3",
149
- "ooxml-core": "^1.6.2",
149
+ "ooxml-core": "^1.8.0",
150
150
  "opentype.js": "^2.0.0",
151
151
  "prosemirror-collab": "^1.3.1",
152
152
  "prosemirror-commands": "^1.7.2",
@@ -166,6 +166,7 @@
166
166
  "@types/three": "^0.186.0",
167
167
  "ai": "^7.0.127",
168
168
  "fake-indexeddb": "^6.2.5",
169
+ "happy-dom": "^20.14.5",
169
170
  "jsdom": "^30.1.2",
170
171
  "jszip": "^3.10.2",
171
172
  "three": "^0.186.1",
@@ -1,24 +0,0 @@
1
- /**
2
- * A*-based orthogonal path search and path simplification.
3
- *
4
- * Pure (no framework imports). Deterministic - no Math.random / Date.
5
- */
6
- import type { RouterPoint, RouterRect } from './connector-router-types.js';
7
- /**
8
- * Run A* over the navigation graph to find the shortest orthogonal path from
9
- * `start` to `end` that avoids all `inflated` obstacle rectangles.
10
- *
11
- * Returns an array of waypoints (possibly including intermediate bend points
12
- * when L-shaped edges are taken). Falls back to `[start, end]` when no path is
13
- * found within {@link MAX_ASTAR_ITERATIONS}.
14
- */
15
- export declare function aStarOrthogonal(nodes: ReadonlyArray<RouterPoint>, start: RouterPoint, end: RouterPoint, inflated: ReadonlyArray<RouterRect>): RouterPoint[];
16
- /**
17
- * Remove collinear intermediate waypoints from a path.
18
- *
19
- * A waypoint is dropped when the previous and next waypoints are collinear on
20
- * both axes with it (three consecutive collinear points). Every directional
21
- * change is preserved.
22
- */
23
- export declare function simplifyPath(points: ReadonlyArray<RouterPoint>): RouterPoint[];
24
- //# sourceMappingURL=connector-router-astar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connector-router-astar.d.ts","sourceRoot":"","sources":["../../../src/pptx/render/connector-router-astar.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAKxE;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,EACjC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,GACjC,WAAW,EAAE,CAkKf;AAMD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,WAAW,EAAE,CAuB9E"}
@@ -1,38 +0,0 @@
1
- /**
2
- * Graph-building helpers for the orthogonal connector router.
3
- *
4
- * Provides geometry primitives, collision detection, and navigation-graph
5
- * construction used by the A* search. Pure (no framework imports).
6
- */
7
- import type { RouterPoint, RouterRect } from './connector-router-types.js';
8
- export { PADDING_DEFAULT } from './connector-router-types.js';
9
- /** Expand a rect by `pad` pixels on every side. Returns a new rect. */
10
- export declare function inflateRect(r: RouterRect, pad: number): RouterRect;
11
- /** Return true when point `p` lies inside (or on the border of) `r`. */
12
- export declare function pointInRect(p: RouterPoint, r: RouterRect): boolean;
13
- /**
14
- * Return true when the axis-aligned segment `a→b` intersects rectangle `r`.
15
- *
16
- * Only horizontal and vertical segments are handled exactly; diagonal segments
17
- * are treated as intersecting (safe / conservative fallback).
18
- */
19
- export declare function segmentIntersectsRect(a: RouterPoint, b: RouterPoint, r: RouterRect): boolean;
20
- /**
21
- * Return true when the direct segment `start→end` is clear of all inflated
22
- * obstacle rectangles.
23
- */
24
- export declare function directPathClear(start: RouterPoint, end: RouterPoint, inflated: ReadonlyArray<RouterRect>): boolean;
25
- /** Manhattan-distance heuristic for A*. */
26
- export declare function heuristic(a: RouterPoint, b: RouterPoint): number;
27
- /** Stable string key for a point (rounded to nearest pixel). Used as Map keys. */
28
- export declare function pointKey(p: RouterPoint): string;
29
- /**
30
- * Build the set of candidate navigation nodes for A*:
31
- * - Start and end points.
32
- * - Corners of each inflated obstacle (with a small clearance margin).
33
- * - Orthogonal projections of every node onto start/end rows and columns.
34
- *
35
- * Nodes that fall inside an obstacle or outside the canvas are discarded.
36
- */
37
- export declare function buildGraphNodes(start: RouterPoint, end: RouterPoint, inflated: ReadonlyArray<RouterRect>, canvasWidth: number, canvasHeight: number): RouterPoint[];
38
- //# sourceMappingURL=connector-router-graph.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connector-router-graph.d.ts","sourceRoot":"","sources":["../../../src/pptx/render/connector-router-graph.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAM3D,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAOlE;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAElE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAyB5F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,GACjC,OAAO,CAOT;AAED,2CAA2C;AAC3C,wBAAgB,SAAS,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,CAEhE;AAED,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAE/C;AAMD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EACnC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAClB,WAAW,EAAE,CAqDf"}
@@ -1,21 +0,0 @@
1
- import type { PaintButton, PaintDialog, PaintInput } from './viewer-paint-dialog.js';
2
- /** Format Shape fields: Visio's Fill, Line and Effects sections over the format-shape edit. */
3
- export declare const FORMAT_SHAPE_FIELDS: {
4
- readonly Fill: readonly [readonly ['fillColor', 'Color', 'color'], readonly ['fillTransparency', 'Transparency (%)', 'percent']];
5
- readonly Line: readonly [readonly ['lineColor', 'Color', 'color'], readonly ['lineWeight', 'Width (pt)', 'points'], readonly ['linePattern', 'Dash type', 'pattern'], readonly ['lineTransparency', 'Transparency (%)', 'percent']];
6
- readonly Effects: readonly [readonly ['shadow', 'Shadow', 'shadow'], readonly ['glowSize', 'Glow size (pt)', 'points'], readonly ['glowColor', 'Glow color', 'color'], readonly ['glowTransparency', 'Glow transparency (%)', 'percent'], readonly ['softEdges', 'Soft edges size (pt)', 'points'], readonly ['reflectionSize', 'Reflection size (%)', 'percent'], readonly ['reflectionTransparency', 'Reflection transparency (%)', 'percent'], readonly ['reflectionDistance', 'Reflection distance (pt)', 'points'], readonly ['reflectionBlur', 'Reflection blur (pt)', 'points']];
7
- };
8
- type Section = keyof typeof FORMAT_SHAPE_FIELDS;
9
- export type FormatShapeField = (typeof FORMAT_SHAPE_FIELDS)[Section][number][0];
10
- export type FormatShapeKind = (typeof FORMAT_SHAPE_FIELDS)[Section][number][2];
11
- export declare const FORMAT_SHAPE_UNSUPPORTED = "Arrows, gradients, bevel and 3-D rotation are not available in this pane: arrowheads have no edit command yet, and bevel and 3-D rotation need a 3-D renderer.";
12
- /** The Format Shape dialog, built from shared `office-ui-*` controls. */
13
- export declare function createFormatShapeDialog(doc: Document): {
14
- dialog: PaintDialog;
15
- fields: Map<"fillColor" | "fillTransparency" | "glowColor" | "glowSize" | "glowTransparency" | "lineColor" | "linePattern" | "lineTransparency" | "lineWeight" | "reflectionBlur" | "reflectionDistance" | "reflectionSize" | "reflectionTransparency" | "shadow" | "softEdges", PaintInput>;
16
- kinds: Map<"fillColor" | "fillTransparency" | "glowColor" | "glowSize" | "glowTransparency" | "lineColor" | "linePattern" | "lineTransparency" | "lineWeight" | "reflectionBlur" | "reflectionDistance" | "reflectionSize" | "reflectionTransparency" | "shadow" | "softEdges", "color" | "pattern" | "percent" | "points" | "shadow">;
17
- error: HTMLParagraphElement;
18
- apply: PaintButton;
19
- cancel: PaintButton;
20
- };
21
- export {};