superdoc 2.20.0 → 2.20.1-next.2

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.
@@ -4219,6 +4219,14 @@ function readCollapsedHostTrackChangeId(snapshot) {
4219
4219
  const focusId = focusVisual?.trackChangeId;
4220
4220
  return typeof anchorId === "string" && anchorId.length > 0 && anchorId === focusId ? anchorId : null;
4221
4221
  }
4222
+ function isNonCollapsedHostSelection(snapshot) {
4223
+ if (!snapshot || typeof snapshot !== "object") return false;
4224
+ const record = snapshot;
4225
+ const anchor = record.anchor;
4226
+ const focus = record.focus;
4227
+ if (typeof anchor?.blockId !== "string" || !anchor.blockId || typeof focus?.blockId !== "string" || !focus.blockId || !Number.isFinite(anchor.blockOffset) || !Number.isFinite(focus.blockOffset)) return false;
4228
+ return anchor.blockId !== focus.blockId || anchor.blockOffset !== focus.blockOffset || Number.isFinite(anchor.trackedBlockOffset) && Number.isFinite(focus.trackedBlockOffset) && anchor.trackedBlockOffset !== focus.trackedBlockOffset;
4229
+ }
4222
4230
  var trackedChangeIdContextCache = /* @__PURE__ */ new WeakMap();
4223
4231
  /**
4224
4232
  * Collect the raw source-provenance ids a tracked-change list item exposes,
@@ -6250,7 +6258,7 @@ function createSuperDocUI(options) {
6250
6258
  }
6251
6259
  if (pendingPostPaintSelectionRefresh) continue;
6252
6260
  selectionEpoch += 1;
6253
- seedCaretSelectionFromHost();
6261
+ refreshSelectionFromHost();
6254
6262
  recompute(paintCompleted ? "post-paint-selection" : "post-paint-selection-failed");
6255
6263
  }
6256
6264
  };
@@ -6647,8 +6655,9 @@ function createSuperDocUI(options) {
6647
6655
  * effective font resolved from it) on the next recompute, instead of serving
6648
6656
  * the previous selection until the worker `selection.current` round-trip lands
6649
6657
  * (SD-3652). Only a resolvable COLLAPSED CARET is seeded - a range's snapshot
6650
- * cannot be resolved synchronously in worker mode, so ranges defer to the async
6651
- * read (seeding an empty value would wrongly disable range-only commands). The
6658
+ * cannot be resolved synchronously in worker mode, so a new range starts an
6659
+ * authoritative async read without waiting for the input-idle gate (SD-5394).
6660
+ * Seeding an empty value would wrongly disable range-only commands. The
6652
6661
  * authoritative async read still overwrites marks/text/review overlap, but
6653
6662
  * foreground typing defers and coalesces that worker hop through the shared
6654
6663
  * retry gate. Previous marks are carried forward for toolbar continuity. A
@@ -6656,14 +6665,19 @@ function createSuperDocUI(options) {
6656
6665
  * same carrier, or while an active typing dispatch advances the same caret by
6657
6666
  * one code point. Pending work alone never carries review command context.
6658
6667
  */
6659
- const seedCaretSelectionFromHost = (hostSelectionSnapshot) => {
6668
+ const refreshSelectionFromHost = (hostSelectionSnapshot) => {
6669
+ const foreground = foregroundMutationState();
6670
+ if (isNonCollapsedHostSelection(hostSelectionSnapshot) && !(foreground && foreground.active > 0)) {
6671
+ pendingSelectionSeedValidationToken = null;
6672
+ issueAsyncRead("selection", selectionReadToken(), selectionCurrentRun, normalizeSelectionInfo);
6673
+ return;
6674
+ }
6660
6675
  const host = getHost();
6661
6676
  const read = host?.readLiveSelectionSyncSnapshot;
6662
6677
  if (typeof read !== "function") return;
6663
6678
  const seed = normalizeSelectionInfo(safeCall(() => read.call(host), null));
6664
6679
  if (!seed || !isCollapsedCaretSnapshot(seed)) return;
6665
6680
  const token = selectionReadToken();
6666
- const foreground = foregroundMutationState();
6667
6681
  const deferAuthoritativeRead = Boolean(foreground && (foreground.active > 0 || foreground.pending > 0));
6668
6682
  if (!deferAuthoritativeRead) {
6669
6683
  pendingSelectionSeedValidationToken = null;
@@ -8895,7 +8909,7 @@ function createSuperDocUI(options) {
8895
8909
  const unsubscribe = next.subscribe((snapshot) => {
8896
8910
  if (foregroundMutationActive() && caretSelectionNeedsProjectionPaint() && schedulePostPaintSelectionRefresh()) return;
8897
8911
  selectionEpoch += 1;
8898
- seedCaretSelectionFromHost(snapshot);
8912
+ refreshSelectionFromHost(snapshot);
8899
8913
  recompute("host-selection");
8900
8914
  });
8901
8915
  if (typeof unsubscribe === "function") detachHostSelection = unsubscribe;
@@ -4220,6 +4220,14 @@ function readCollapsedHostTrackChangeId(snapshot) {
4220
4220
  const focusId = focusVisual?.trackChangeId;
4221
4221
  return typeof anchorId === "string" && anchorId.length > 0 && anchorId === focusId ? anchorId : null;
4222
4222
  }
4223
+ function isNonCollapsedHostSelection(snapshot) {
4224
+ if (!snapshot || typeof snapshot !== "object") return false;
4225
+ const record = snapshot;
4226
+ const anchor = record.anchor;
4227
+ const focus = record.focus;
4228
+ if (typeof anchor?.blockId !== "string" || !anchor.blockId || typeof focus?.blockId !== "string" || !focus.blockId || !Number.isFinite(anchor.blockOffset) || !Number.isFinite(focus.blockOffset)) return false;
4229
+ return anchor.blockId !== focus.blockId || anchor.blockOffset !== focus.blockOffset || Number.isFinite(anchor.trackedBlockOffset) && Number.isFinite(focus.trackedBlockOffset) && anchor.trackedBlockOffset !== focus.trackedBlockOffset;
4230
+ }
4223
4231
  var trackedChangeIdContextCache = /* @__PURE__ */ new WeakMap();
4224
4232
  /**
4225
4233
  * Collect the raw source-provenance ids a tracked-change list item exposes,
@@ -6251,7 +6259,7 @@ function createSuperDocUI(options) {
6251
6259
  }
6252
6260
  if (pendingPostPaintSelectionRefresh) continue;
6253
6261
  selectionEpoch += 1;
6254
- seedCaretSelectionFromHost();
6262
+ refreshSelectionFromHost();
6255
6263
  recompute(paintCompleted ? "post-paint-selection" : "post-paint-selection-failed");
6256
6264
  }
6257
6265
  };
@@ -6648,8 +6656,9 @@ function createSuperDocUI(options) {
6648
6656
  * effective font resolved from it) on the next recompute, instead of serving
6649
6657
  * the previous selection until the worker `selection.current` round-trip lands
6650
6658
  * (SD-3652). Only a resolvable COLLAPSED CARET is seeded - a range's snapshot
6651
- * cannot be resolved synchronously in worker mode, so ranges defer to the async
6652
- * read (seeding an empty value would wrongly disable range-only commands). The
6659
+ * cannot be resolved synchronously in worker mode, so a new range starts an
6660
+ * authoritative async read without waiting for the input-idle gate (SD-5394).
6661
+ * Seeding an empty value would wrongly disable range-only commands. The
6653
6662
  * authoritative async read still overwrites marks/text/review overlap, but
6654
6663
  * foreground typing defers and coalesces that worker hop through the shared
6655
6664
  * retry gate. Previous marks are carried forward for toolbar continuity. A
@@ -6657,14 +6666,19 @@ function createSuperDocUI(options) {
6657
6666
  * same carrier, or while an active typing dispatch advances the same caret by
6658
6667
  * one code point. Pending work alone never carries review command context.
6659
6668
  */
6660
- const seedCaretSelectionFromHost = (hostSelectionSnapshot) => {
6669
+ const refreshSelectionFromHost = (hostSelectionSnapshot) => {
6670
+ const foreground = foregroundMutationState();
6671
+ if (isNonCollapsedHostSelection(hostSelectionSnapshot) && !(foreground && foreground.active > 0)) {
6672
+ pendingSelectionSeedValidationToken = null;
6673
+ issueAsyncRead("selection", selectionReadToken(), selectionCurrentRun, normalizeSelectionInfo);
6674
+ return;
6675
+ }
6661
6676
  const host = getHost();
6662
6677
  const read = host?.readLiveSelectionSyncSnapshot;
6663
6678
  if (typeof read !== "function") return;
6664
6679
  const seed = normalizeSelectionInfo(safeCall(() => read.call(host), null));
6665
6680
  if (!seed || !isCollapsedCaretSnapshot(seed)) return;
6666
6681
  const token = selectionReadToken();
6667
- const foreground = foregroundMutationState();
6668
6682
  const deferAuthoritativeRead = Boolean(foreground && (foreground.active > 0 || foreground.pending > 0));
6669
6683
  if (!deferAuthoritativeRead) {
6670
6684
  pendingSelectionSeedValidationToken = null;
@@ -8896,7 +8910,7 @@ function createSuperDocUI(options) {
8896
8910
  const unsubscribe = next.subscribe((snapshot) => {
8897
8911
  if (foregroundMutationActive() && caretSelectionNeedsProjectionPaint() && schedulePostPaintSelectionRefresh()) return;
8898
8912
  selectionEpoch += 1;
8899
- seedCaretSelectionFromHost(snapshot);
8913
+ refreshSelectionFromHost(snapshot);
8900
8914
  recompute("host-selection");
8901
8915
  });
8902
8916
  if (typeof unsubscribe === "function") detachHostSelection = unsubscribe;
@@ -19,7 +19,7 @@ var COLLABORATION_UPGRADE_ENGINE_MINIMUM_NODE_MAJOR = 20;
19
19
  var PRIVATE_ENGINE_INFO = (0, _superdoc_docx_engine_collaboration_upgrade_engine.getCollaborationUpgradeEngineInfo)();
20
20
  var ENGINE_INFO = Object.freeze({
21
21
  ...PRIVATE_ENGINE_INFO,
22
- superdocVersion: "2.20.0",
22
+ superdocVersion: "2.20.1-next.2",
23
23
  roomSchemaVersion: Object.freeze({ ...PRIVATE_ENGINE_INFO.roomSchemaVersion }),
24
24
  supportedBundleVersions: SUPPORTED_COLLABORATION_UPGRADE_BUNDLE_VERSIONS,
25
25
  supportedV1ReaderContractVersions: SUPPORTED_V1_READER_CONTRACT_VERSIONS
@@ -18,7 +18,7 @@ var COLLABORATION_UPGRADE_ENGINE_MINIMUM_NODE_MAJOR = 20;
18
18
  var PRIVATE_ENGINE_INFO = getCollaborationUpgradeEngineInfo$1();
19
19
  var ENGINE_INFO = Object.freeze({
20
20
  ...PRIVATE_ENGINE_INFO,
21
- superdocVersion: "2.20.0",
21
+ superdocVersion: "2.20.1-next.2",
22
22
  roomSchemaVersion: Object.freeze({ ...PRIVATE_ENGINE_INFO.roomSchemaVersion }),
23
23
  supportedBundleVersions: SUPPORTED_COLLABORATION_UPGRADE_BUNDLE_VERSIONS,
24
24
  supportedV1ReaderContractVersions: SUPPORTED_V1_READER_CONTRACT_VERSIONS
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-BQBQsjoe.cjs");
2
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-DFCfYEpW.cjs");
3
3
  const require_slice_source = require("../chunks/slice-source-CFaqq0Vo.cjs");
4
4
  let react = require("react");
5
5
  //#region src/public/ui/react.ts
@@ -1,4 +1,4 @@
1
- import { t as createSuperDocUI } from "../chunks/create-super-doc-ui-D5VrP4Dx.es.js";
1
+ import { t as createSuperDocUI } from "../chunks/create-super-doc-ui-B4_V1haj.es.js";
2
2
  import { t as toSliceSource } from "../chunks/slice-source-gfOhG2MW.es.js";
3
3
  import { createContext, createElement, useCallback, useContext, useEffect, useRef, useState } from "react";
4
4
  //#region src/public/ui/react.ts
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-BQBQsjoe.cjs");
2
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-DFCfYEpW.cjs");
3
3
  const require_slice_source = require("../chunks/slice-source-CFaqq0Vo.cjs");
4
4
  let superdoc_entry_vue = require("vue");
5
5
  //#region src/public/ui/vue.ts
@@ -1,4 +1,4 @@
1
- import { t as createSuperDocUI } from "../chunks/create-super-doc-ui-D5VrP4Dx.es.js";
1
+ import { t as createSuperDocUI } from "../chunks/create-super-doc-ui-B4_V1haj.es.js";
2
2
  import { t as toSliceSource } from "../chunks/slice-source-gfOhG2MW.es.js";
3
3
  import { computed, inject, onScopeDispose, provide, shallowRef, toRaw, toValue, watch } from "vue";
4
4
  //#region src/public/ui/vue.ts
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-BQBQsjoe.cjs");
2
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-DFCfYEpW.cjs");
3
3
  exports.BUILT_IN_COMMAND_IDS = require_create_super_doc_ui.BUILT_IN_COMMAND_IDS;
4
4
  exports.createSuperDocUI = require_create_super_doc_ui.createSuperDocUI;
5
5
  exports.shallowEqual = require_create_super_doc_ui.shallowEqual;
@@ -1,2 +1,2 @@
1
- import { a as BUILT_IN_COMMAND_IDS, t as createSuperDocUI, u as shallowEqual } from "../chunks/create-super-doc-ui-D5VrP4Dx.es.js";
1
+ import { a as BUILT_IN_COMMAND_IDS, t as createSuperDocUI, u as shallowEqual } from "../chunks/create-super-doc-ui-B4_V1haj.es.js";
2
2
  export { BUILT_IN_COMMAND_IDS, createSuperDocUI, shallowEqual };
package/dist/style.css CHANGED
@@ -2340,34 +2340,34 @@ img[data-v-c95b2073] {
2340
2340
  pointer-events: auto;
2341
2341
  }
2342
2342
 
2343
- .superdoc[data-v-7bbf01da] {
2343
+ .superdoc[data-v-e476c448] {
2344
2344
  display: flex;
2345
2345
  position: relative;
2346
2346
  }
2347
- .right-sidebar[data-v-7bbf01da] {
2347
+ .right-sidebar[data-v-e476c448] {
2348
2348
  min-width: 320px;
2349
2349
  height: 100%;
2350
2350
  }
2351
- .floating-comments[data-v-7bbf01da] {
2351
+ .floating-comments[data-v-e476c448] {
2352
2352
  min-width: 300px;
2353
2353
  width: 300px;
2354
2354
  height: 100%;
2355
2355
  overflow: visible;
2356
2356
  }
2357
- .superdoc__layers[data-v-7bbf01da] {
2357
+ .superdoc__layers[data-v-e476c448] {
2358
2358
  height: 100%;
2359
2359
  position: relative;
2360
2360
  box-sizing: border-box;
2361
2361
  }
2362
- .superdoc__document[data-v-7bbf01da] {
2362
+ .superdoc__document[data-v-e476c448] {
2363
2363
  width: 100%;
2364
2364
  position: relative;
2365
2365
  }
2366
- .superdoc__sub-document[data-v-7bbf01da] {
2366
+ .superdoc__sub-document[data-v-e476c448] {
2367
2367
  width: 100%;
2368
2368
  position: relative;
2369
2369
  }
2370
- .superdoc__selection-layer[data-v-7bbf01da] {
2370
+ .superdoc__selection-layer[data-v-e476c448] {
2371
2371
  position: absolute;
2372
2372
  min-width: 100%;
2373
2373
  min-height: 100%;
@@ -2378,13 +2378,13 @@ img[data-v-c95b2073] {
2378
2378
  /* SD-3497: PDF whiteboard overlay sits above the rendered PDF canvas but below
2379
2379
  the PDF comment anchors (z-index 6 in PdfCommentsLayer) so anchors stay
2380
2380
  clickable, and below the selection layer (z-index 10). */
2381
- .superdoc__whiteboard-layer[data-v-7bbf01da] {
2381
+ .superdoc__whiteboard-layer[data-v-e476c448] {
2382
2382
  z-index: 4;
2383
2383
  }
2384
- .superdoc__temp-selection[data-v-7bbf01da] {
2384
+ .superdoc__temp-selection[data-v-e476c448] {
2385
2385
  position: absolute;
2386
2386
  }
2387
- .superdoc__right-sidebar[data-v-7bbf01da] {
2387
+ .superdoc__right-sidebar[data-v-e476c448] {
2388
2388
  width: 320px;
2389
2389
  min-width: 320px;
2390
2390
  padding: 0 10px;
@@ -2392,7 +2392,7 @@ img[data-v-c95b2073] {
2392
2392
  position: relative;
2393
2393
  z-index: 2;
2394
2394
  }
2395
- .superdoc__compact-comment-popover[data-v-7bbf01da] {
2395
+ .superdoc__compact-comment-popover[data-v-e476c448] {
2396
2396
  position: absolute;
2397
2397
  top: 12px;
2398
2398
  right: 12px;
@@ -2401,14 +2401,14 @@ img[data-v-c95b2073] {
2401
2401
  }
2402
2402
 
2403
2403
  /* Tools styles */
2404
- .tools[data-v-7bbf01da] {
2404
+ .tools[data-v-e476c448] {
2405
2405
  position: absolute;
2406
2406
  z-index: 3;
2407
2407
  display: flex;
2408
2408
  flex-direction: column;
2409
2409
  gap: var(--sd-ui-tools-gap, 6px);
2410
2410
  }
2411
- .tools-item[data-v-7bbf01da] {
2411
+ .tools-item[data-v-e476c448] {
2412
2412
  display: flex;
2413
2413
  align-items: center;
2414
2414
  justify-content: center;
@@ -2419,10 +2419,10 @@ img[data-v-c95b2073] {
2419
2419
  cursor: pointer;
2420
2420
  position: relative;
2421
2421
  }
2422
- .tools-item i[data-v-7bbf01da] {
2422
+ .tools-item i[data-v-e476c448] {
2423
2423
  cursor: pointer;
2424
2424
  }
2425
- .superdoc__tools-icon[data-v-7bbf01da] {
2425
+ .superdoc__tools-icon[data-v-e476c448] {
2426
2426
  width: var(--sd-ui-tools-icon-size, 20px);
2427
2427
  height: var(--sd-ui-tools-icon-size, 20px);
2428
2428
  flex-shrink: 0;
@@ -2437,22 +2437,22 @@ img[data-v-c95b2073] {
2437
2437
 
2438
2438
  /* 834px is iPad screen size in portrait orientation */
2439
2439
  @media (max-width: 834px) {
2440
- .superdoc .superdoc__layers[data-v-7bbf01da] {
2440
+ .superdoc .superdoc__layers[data-v-e476c448] {
2441
2441
  margin: 0;
2442
2442
  border: 0 !important;
2443
2443
  box-shadow: none;
2444
2444
  }
2445
- .superdoc__sub-document[data-v-7bbf01da] {
2445
+ .superdoc__sub-document[data-v-e476c448] {
2446
2446
  max-width: 100%;
2447
2447
  }
2448
- .superdoc__right-sidebar[data-v-7bbf01da] {
2448
+ .superdoc__right-sidebar[data-v-e476c448] {
2449
2449
  padding: 10px;
2450
2450
  position: relative;
2451
2451
  }
2452
2452
  }
2453
2453
 
2454
2454
  /* AI Writer styles */
2455
- .ai-writer-container[data-v-7bbf01da] {
2455
+ .ai-writer-container[data-v-e476c448] {
2456
2456
  position: fixed;
2457
2457
  z-index: 1000;
2458
2458
  background: white;
@@ -2468,10 +2468,10 @@ img[data-v-c95b2073] {
2468
2468
  transform: translateY(-50%);
2469
2469
  z-index: 50;
2470
2470
  } */
2471
- .ai-tool > svg[data-v-7bbf01da] {
2471
+ .ai-tool > svg[data-v-e476c448] {
2472
2472
  fill: transparent;
2473
2473
  }
2474
- .ai-tool[data-v-7bbf01da]::before {
2474
+ .ai-tool[data-v-e476c448]::before {
2475
2475
  content: '';
2476
2476
  position: absolute;
2477
2477
  width: 20px;
@@ -2492,7 +2492,7 @@ img[data-v-c95b2073] {
2492
2492
  filter: brightness(1.2);
2493
2493
  transition: filter 0.2s ease;
2494
2494
  }
2495
- .ai-tool[data-v-7bbf01da]:hover::before {
2495
+ .ai-tool[data-v-e476c448]:hover::before {
2496
2496
  filter: brightness(1.3);
2497
2497
  }
2498
2498
 
@@ -3022,7 +3022,7 @@ img[data-v-c95b2073] {
3022
3022
  display: flex;
3023
3023
  }
3024
3024
 
3025
- .superdoc-toolbar[data-v-9418cc7d] {
3025
+ .superdoc-toolbar[data-v-0d00bc5b] {
3026
3026
  display: flex;
3027
3027
  width: 100%;
3028
3028
  justify-content: space-between;
@@ -3034,7 +3034,7 @@ img[data-v-c95b2073] {
3034
3034
  z-index: var(--sd-ui-toolbar-z-index, 10);
3035
3035
  }
3036
3036
  @media (max-width: 768px) {
3037
- .superdoc-toolbar[data-v-9418cc7d] {
3037
+ .superdoc-toolbar[data-v-0d00bc5b] {
3038
3038
  padding: 4px 10px;
3039
3039
  justify-content: inherit;
3040
3040
  }
@@ -2340,34 +2340,34 @@ img[data-v-c95b2073] {
2340
2340
  pointer-events: auto;
2341
2341
  }
2342
2342
 
2343
- .superdoc[data-v-7bbf01da] {
2343
+ .superdoc[data-v-e476c448] {
2344
2344
  display: flex;
2345
2345
  position: relative;
2346
2346
  }
2347
- .right-sidebar[data-v-7bbf01da] {
2347
+ .right-sidebar[data-v-e476c448] {
2348
2348
  min-width: 320px;
2349
2349
  height: 100%;
2350
2350
  }
2351
- .floating-comments[data-v-7bbf01da] {
2351
+ .floating-comments[data-v-e476c448] {
2352
2352
  min-width: 300px;
2353
2353
  width: 300px;
2354
2354
  height: 100%;
2355
2355
  overflow: visible;
2356
2356
  }
2357
- .superdoc__layers[data-v-7bbf01da] {
2357
+ .superdoc__layers[data-v-e476c448] {
2358
2358
  height: 100%;
2359
2359
  position: relative;
2360
2360
  box-sizing: border-box;
2361
2361
  }
2362
- .superdoc__document[data-v-7bbf01da] {
2362
+ .superdoc__document[data-v-e476c448] {
2363
2363
  width: 100%;
2364
2364
  position: relative;
2365
2365
  }
2366
- .superdoc__sub-document[data-v-7bbf01da] {
2366
+ .superdoc__sub-document[data-v-e476c448] {
2367
2367
  width: 100%;
2368
2368
  position: relative;
2369
2369
  }
2370
- .superdoc__selection-layer[data-v-7bbf01da] {
2370
+ .superdoc__selection-layer[data-v-e476c448] {
2371
2371
  position: absolute;
2372
2372
  min-width: 100%;
2373
2373
  min-height: 100%;
@@ -2378,13 +2378,13 @@ img[data-v-c95b2073] {
2378
2378
  /* SD-3497: PDF whiteboard overlay sits above the rendered PDF canvas but below
2379
2379
  the PDF comment anchors (z-index 6 in PdfCommentsLayer) so anchors stay
2380
2380
  clickable, and below the selection layer (z-index 10). */
2381
- .superdoc__whiteboard-layer[data-v-7bbf01da] {
2381
+ .superdoc__whiteboard-layer[data-v-e476c448] {
2382
2382
  z-index: 4;
2383
2383
  }
2384
- .superdoc__temp-selection[data-v-7bbf01da] {
2384
+ .superdoc__temp-selection[data-v-e476c448] {
2385
2385
  position: absolute;
2386
2386
  }
2387
- .superdoc__right-sidebar[data-v-7bbf01da] {
2387
+ .superdoc__right-sidebar[data-v-e476c448] {
2388
2388
  width: 320px;
2389
2389
  min-width: 320px;
2390
2390
  padding: 0 10px;
@@ -2392,7 +2392,7 @@ img[data-v-c95b2073] {
2392
2392
  position: relative;
2393
2393
  z-index: 2;
2394
2394
  }
2395
- .superdoc__compact-comment-popover[data-v-7bbf01da] {
2395
+ .superdoc__compact-comment-popover[data-v-e476c448] {
2396
2396
  position: absolute;
2397
2397
  top: 12px;
2398
2398
  right: 12px;
@@ -2401,14 +2401,14 @@ img[data-v-c95b2073] {
2401
2401
  }
2402
2402
 
2403
2403
  /* Tools styles */
2404
- .tools[data-v-7bbf01da] {
2404
+ .tools[data-v-e476c448] {
2405
2405
  position: absolute;
2406
2406
  z-index: 3;
2407
2407
  display: flex;
2408
2408
  flex-direction: column;
2409
2409
  gap: var(--sd-ui-tools-gap, 6px);
2410
2410
  }
2411
- .tools-item[data-v-7bbf01da] {
2411
+ .tools-item[data-v-e476c448] {
2412
2412
  display: flex;
2413
2413
  align-items: center;
2414
2414
  justify-content: center;
@@ -2419,10 +2419,10 @@ img[data-v-c95b2073] {
2419
2419
  cursor: pointer;
2420
2420
  position: relative;
2421
2421
  }
2422
- .tools-item i[data-v-7bbf01da] {
2422
+ .tools-item i[data-v-e476c448] {
2423
2423
  cursor: pointer;
2424
2424
  }
2425
- .superdoc__tools-icon[data-v-7bbf01da] {
2425
+ .superdoc__tools-icon[data-v-e476c448] {
2426
2426
  width: var(--sd-ui-tools-icon-size, 20px);
2427
2427
  height: var(--sd-ui-tools-icon-size, 20px);
2428
2428
  flex-shrink: 0;
@@ -2437,22 +2437,22 @@ img[data-v-c95b2073] {
2437
2437
 
2438
2438
  /* 834px is iPad screen size in portrait orientation */
2439
2439
  @media (max-width: 834px) {
2440
- .superdoc .superdoc__layers[data-v-7bbf01da] {
2440
+ .superdoc .superdoc__layers[data-v-e476c448] {
2441
2441
  margin: 0;
2442
2442
  border: 0 !important;
2443
2443
  box-shadow: none;
2444
2444
  }
2445
- .superdoc__sub-document[data-v-7bbf01da] {
2445
+ .superdoc__sub-document[data-v-e476c448] {
2446
2446
  max-width: 100%;
2447
2447
  }
2448
- .superdoc__right-sidebar[data-v-7bbf01da] {
2448
+ .superdoc__right-sidebar[data-v-e476c448] {
2449
2449
  padding: 10px;
2450
2450
  position: relative;
2451
2451
  }
2452
2452
  }
2453
2453
 
2454
2454
  /* AI Writer styles */
2455
- .ai-writer-container[data-v-7bbf01da] {
2455
+ .ai-writer-container[data-v-e476c448] {
2456
2456
  position: fixed;
2457
2457
  z-index: 1000;
2458
2458
  background: white;
@@ -2468,10 +2468,10 @@ img[data-v-c95b2073] {
2468
2468
  transform: translateY(-50%);
2469
2469
  z-index: 50;
2470
2470
  } */
2471
- .ai-tool > svg[data-v-7bbf01da] {
2471
+ .ai-tool > svg[data-v-e476c448] {
2472
2472
  fill: transparent;
2473
2473
  }
2474
- .ai-tool[data-v-7bbf01da]::before {
2474
+ .ai-tool[data-v-e476c448]::before {
2475
2475
  content: '';
2476
2476
  position: absolute;
2477
2477
  width: 20px;
@@ -2492,7 +2492,7 @@ img[data-v-c95b2073] {
2492
2492
  filter: brightness(1.2);
2493
2493
  transition: filter 0.2s ease;
2494
2494
  }
2495
- .ai-tool[data-v-7bbf01da]:hover::before {
2495
+ .ai-tool[data-v-e476c448]:hover::before {
2496
2496
  filter: brightness(1.3);
2497
2497
  }
2498
2498
 
@@ -3022,7 +3022,7 @@ img[data-v-c95b2073] {
3022
3022
  display: flex;
3023
3023
  }
3024
3024
 
3025
- .superdoc-toolbar[data-v-9418cc7d] {
3025
+ .superdoc-toolbar[data-v-0d00bc5b] {
3026
3026
  display: flex;
3027
3027
  width: 100%;
3028
3028
  justify-content: space-between;
@@ -3034,7 +3034,7 @@ img[data-v-c95b2073] {
3034
3034
  z-index: var(--sd-ui-toolbar-z-index, 10);
3035
3035
  }
3036
3036
  @media (max-width: 768px) {
3037
- .superdoc-toolbar[data-v-9418cc7d] {
3037
+ .superdoc-toolbar[data-v-0d00bc5b] {
3038
3038
  padding: 4px 10px;
3039
3039
  justify-content: inherit;
3040
3040
  }
@@ -3694,16 +3694,18 @@ export interface ToolbarConfig {
3694
3694
  * syntax resolves to nothing.
3695
3695
  */
3696
3696
  container?: string | HTMLElement;
3697
- /** Built-in controls to render by region. Controls keep their built-in order. Omit to use the default toolbar. */
3697
+ /** Built-in controls to render by region. Each region's controls render in the array order given. Omit to use the default toolbar. */
3698
3698
  items?: Readonly<Partial<Record<ToolbarRegion, readonly ToolbarItemId[]>>>;
3699
3699
  /**
3700
3700
  * Which groups render, or which items they contain.
3701
3701
  *
3702
3702
  * An array selects groups. The built-in layout still places them in its
3703
3703
  * left, center, and right regions, and always renders the center region.
3704
+ * Item order within each region stays the built-in order for this shape.
3704
3705
  *
3705
3706
  * An object maps each group to its toolbar item ids. Its keys choose the
3706
- * regions and its values form a grouped allowlist.
3707
+ * regions; its values form both the group's composition and the render
3708
+ * order of items within that region.
3707
3709
  * @deprecated replaceWith=`ui.toolbar.items` removeIn=v3.0
3708
3710
  */
3709
3711
  groups?: readonly string[] | Readonly<Record<string, readonly string[]>>;
@@ -9,7 +9,7 @@
9
9
  * callers share this one rule so the two cannot drift apart.
10
10
  */
11
11
  export function withLinkHref(attributes: any, href: any): any;
12
- export function makeDefaultItems({ superToolbar, toolbarIcons, toolbarTexts, toolbarFonts, hideButtons, availableWidth, role, isDev, configuredItemNames, excludedItemNames, additionalItems, }?: {
12
+ export function makeDefaultItems({ superToolbar, toolbarIcons, toolbarTexts, toolbarFonts, hideButtons, availableWidth, role, isDev, configuredItemNames, configuredItemOrder, excludedItemNames, additionalItems, }?: {
13
13
  isDev?: boolean | undefined;
14
14
  additionalItems?: never[] | undefined;
15
15
  }): {
@@ -166,6 +166,7 @@ export class BuiltInToolbar extends EventEmitter<string | symbol, any> {
166
166
  responsiveToContainer: boolean;
167
167
  mode: string;
168
168
  excludeItems: never[];
169
+ toolbarButtonsExclude: never[];
169
170
  groups: null;
170
171
  customButtons: never[];
171
172
  showFormattingMarksButton: boolean;