superdoc 2.22.1-next.2 → 2.23.0-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.
@@ -5090,8 +5090,12 @@ function selectionBlockRange(selection) {
5090
5090
  */
5091
5091
  function selectionBlockIds(selection) {
5092
5092
  const ids = [];
5093
+ const seen = /* @__PURE__ */ new Set();
5093
5094
  const push = (id) => {
5094
- if (typeof id === "string" && id.length > 0 && !ids.includes(id)) ids.push(id);
5095
+ if (typeof id === "string" && id.length > 0 && !seen.has(id)) {
5096
+ seen.add(id);
5097
+ ids.push(id);
5098
+ }
5095
5099
  };
5096
5100
  const target = selection.target;
5097
5101
  const segments = target && Array.isArray(target.segments) ? target.segments : [];
@@ -5089,8 +5089,12 @@ function selectionBlockRange(selection) {
5089
5089
  */
5090
5090
  function selectionBlockIds(selection) {
5091
5091
  const ids = [];
5092
+ const seen = /* @__PURE__ */ new Set();
5092
5093
  const push = (id) => {
5093
- if (typeof id === "string" && id.length > 0 && !ids.includes(id)) ids.push(id);
5094
+ if (typeof id === "string" && id.length > 0 && !seen.has(id)) {
5095
+ seen.add(id);
5096
+ ids.push(id);
5097
+ }
5094
5098
  };
5095
5099
  const target = selection.target;
5096
5100
  const segments = target && Array.isArray(target.segments) ? target.segments : [];
@@ -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.22.1-next.2",
22
+ superdocVersion: "2.23.0-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.22.1-next.2",
21
+ superdocVersion: "2.23.0-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
@@ -31,6 +31,7 @@ import { BlocksAdapter, BlocksApi } from './blocks/blocks.js';
31
31
  import { TableLocator, TableMutationResult, TablesConvertFromTextInput, TablesMoveInput, TablesSplitInput, TablesConvertToTextInput, TablesSetLayoutInput, TablesInsertRowInput, TablesDeleteRowInput, TablesMoveRowInput, TablesSetRowHeightInput, TablesDistributeRowsInput, TablesSetRowOptionsInput, TablesInsertColumnInput, TablesDeleteColumnInput, TablesMoveColumnInput, TablesSetColumnWidthInput, TablesDistributeColumnsInput, TablesInsertCellInput, TablesDeleteCellInput, TablesMergeCellsInput, TablesUnmergeCellsInput, TablesSplitCellInput, TablesSetCellPropertiesInput, TablesSetCellTextInput, TablesSortInput, TablesSetAltTextInput, TablesSetStyleInput, TablesClearStyleInput, TablesSetStyleOptionInput, TablesSetBorderInput, TablesClearBorderInput, TablesApplyBorderPresetInput, TablesSetShadingInput, TablesClearShadingInput, TablesSetTablePaddingInput, TablesSetCellPaddingInput, TablesSetCellSpacingInput, TablesClearCellSpacingInput, TablesApplyStyleInput, TablesSetBordersInput, TablesSetTableOptionsInput, TablesApplyPresetInput, TablesGetInput, TablesGetOutput, TablesGetCellsInput, TablesGetCellsOutput, TablesGetPropertiesInput, TablesGetPropertiesOutput, TablesGetStylesInput, TablesGetStylesOutput, TablesSetDefaultStyleInput, TablesClearDefaultStyleInput } from './types/table-operations.types.js';
32
32
  import { TrackChangesAdapter, TrackChangesApi } from './track-changes/track-changes.js';
33
33
  import { MutationOptions, RichContentMutationOptions, WriteAdapter } from './write/write.js';
34
+ import { OperationCancellation } from './write/operation-cancellation.js';
34
35
  import { SelectionMutationAdapter } from './selection-mutation.js';
35
36
  import { CapabilitiesAdapter, DocumentApiCapabilities, OperationCapabilityResolveInput, OperationCapabilityResolveResult } from './capabilities/capabilities.js';
36
37
  import { SDHtmlMarkdownSupportCheckInput, SDHtmlMarkdownSupportCheckResult } from './capabilities/html-markdown-support.js';
@@ -105,6 +106,8 @@ export type { GetHtmlAdapter, GetHtmlInput } from './get-html/get-html.js';
105
106
  export type { InfoAdapter, InfoInput } from './info/info.js';
106
107
  export type { ExtractAdapter, ExtractInput } from './extract/extract.js';
107
108
  export type { WriteAdapter, WriteRequest, RichContentMutationOptions } from './write/write.js';
109
+ export type { OperationCancellation, OperationCancellationCode } from './write/operation-cancellation.js';
110
+ export { OperationCancellationError, assertOperationCanStart, indeterminateOperation, splitOperationCancellation, } from './write/operation-cancellation.js';
108
111
  export type { FormatInlineAliasApi, FormatInlineAliasInput, FormatBoldInput, FormatItalicInput, FormatRangeInput, FormatUnderlineInput, FormatStrikethroughInput, StyleApplyInput, StyleApplyOptions, } from './format/format.js';
109
112
  export type { InlineRunPatch, InlineRunPatchKey, InlinePropertyStorage, InlinePropertyType, InlinePropertyCarrier, InlinePropertyRegistryEntry, UnderlinePatch, ShadingPatch, BorderPatch, FitTextPatch, LangPatch, RFontsPatch, EastAsianLayoutPatch, StylisticSetPatch, } from './format/inline-run-patch.js';
110
113
  export { INLINE_PROPERTY_REGISTRY, INLINE_PROPERTY_KEY_SET, INLINE_PROPERTY_BY_KEY, INLINE_PROPERTY_KEYS_BY_STORAGE, validateInlineRunPatch, buildInlineRunPatchSchema, } from './format/inline-run-patch.js';
@@ -251,7 +254,11 @@ export interface QueryApi {
251
254
  }
252
255
  export interface MutationsApi {
253
256
  preview(input: MutationsPreviewInput): Promise<MutationsPreviewOutput>;
254
- apply(input: MutationsApplyInput): Promise<PlanReceipt>;
257
+ /**
258
+ * Apply an atomic plan. `options` is host-side cancellation and is not part
259
+ * of the plan payload.
260
+ */
261
+ apply(input: MutationsApplyInput, options?: OperationCancellation): Promise<PlanReceipt>;
255
262
  }
256
263
  export interface RangesApi {
257
264
  resolve(input: ResolveRangeInput): ResolveRangeOutput;
@@ -323,8 +330,9 @@ export interface DocumentApiSurface {
323
330
  /**
324
331
  * Extract all document content with stable IDs for RAG pipelines.
325
332
  * Returns blocks with full text, comments, and tracked changes.
333
+ * `options` cancels or deadlines the browser call. It is not an extract filter.
326
334
  */
327
- extract(input: ExtractInput): ExtractResult;
335
+ extract(input: ExtractInput, options?: OperationCancellation): ExtractResult;
328
336
  /**
329
337
  * Clear all document body content, leaving a single empty paragraph.
330
338
  */
@@ -337,7 +345,7 @@ export interface DocumentApiSurface {
337
345
  * Insert content at a target location.
338
346
  * If target is omitted, inserts at the end of the document.
339
347
  */
340
- insert(input: InsertInput, options?: RichContentMutationOptions): SDMutationReceipt;
348
+ insert(input: InsertInput, options?: RichContentMutationOptions & OperationCancellation): SDMutationReceipt;
341
349
  /**
342
350
  * Replace text at a target range.
343
351
  */
@@ -4,6 +4,7 @@ import { SDInsertInput } from '../types/structural-input.js';
4
4
  import { StoryLocator } from '../types/story.types.js';
5
5
  import { BlockNodeAddress } from '../types/base.js';
6
6
  import { Placement } from '../types/placement.js';
7
+ import { OperationCancellation } from '../write/operation-cancellation.js';
7
8
  import { SelectionMutationAdapter } from '../selection-mutation.js';
8
9
  /** Content format for the text insert operation payload. */
9
10
  export type InsertContentType = 'text' | 'markdown' | 'html';
@@ -70,5 +71,5 @@ export declare function validateInsertInput(input: unknown): asserts input is In
70
71
  * @param options - Optional mutation options (changeMode, dryRun, expectedRevision).
71
72
  * @returns Receipt indicating success/failure and mutation metadata.
72
73
  */
73
- export declare function executeInsert(selectionAdapter: SelectionMutationAdapter, writeAdapter: WriteAdapter, input: InsertInput, options?: RichContentMutationOptions): SDMutationReceipt;
74
+ export declare function executeInsert(selectionAdapter: SelectionMutationAdapter, writeAdapter: WriteAdapter, input: InsertInput, options?: RichContentMutationOptions & OperationCancellation): SDMutationReceipt;
74
75
  export {};
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Host-side cancellation for browser `insert`, `mutations.apply`, and `extract`.
3
+ *
4
+ * `signal` and `timeoutMs` stay on the caller side. They are not serialized
5
+ * into the worker. An already-aborted signal or a `timeoutMs` of 0 finishes
6
+ * as {@link OperationCancellationError} `CANCELLED` before dispatch and does
7
+ * not change the document. Aborting after the worker has started the command
8
+ * does not roll it back: the call rejects as `INDETERMINATE` so the caller
9
+ * stops waiting, and must read the document before deciding whether to retry.
10
+ * Replacing the document or closing the editor also settles as `INDETERMINATE`.
11
+ */
12
+ export interface OperationCancellation {
13
+ /** Abort before dispatch, or ask the host to cancel a command that has not started. */
14
+ signal?: AbortSignal;
15
+ /**
16
+ * Milliseconds from the call. `0` is already expired and does not dispatch.
17
+ * A positive deadline uses the same outcome rules as `signal`.
18
+ */
19
+ timeoutMs?: number;
20
+ }
21
+ export type OperationCancellationCode = 'CANCELLED' | 'INDETERMINATE';
22
+ /**
23
+ * Machine-readable outcome for a cancellation that did not return the
24
+ * operation's normal receipt.
25
+ *
26
+ * `CANCELLED` means the command did not start and the document is unchanged.
27
+ * Retrying that same call is safe. `INDETERMINATE` means the call cannot
28
+ * prove whether a mutation committed. Read the current document before
29
+ * retrying. A resolved receipt means the work committed; do not retry it.
30
+ */
31
+ export declare class OperationCancellationError extends Error {
32
+ readonly code: OperationCancellationCode;
33
+ readonly details?: {
34
+ cause?: string;
35
+ };
36
+ constructor(code: OperationCancellationCode, message: string, details?: {
37
+ cause?: string;
38
+ });
39
+ }
40
+ export declare function cancelledBeforeDispatch(): OperationCancellationError;
41
+ export declare function indeterminateOperation(cause: 'replaced' | 'disposed' | 'in-flight'): OperationCancellationError;
42
+ /**
43
+ * Reject a call that is already cancelled or whose deadline has already
44
+ * expired. Returns without effect when the caller did not ask for control.
45
+ */
46
+ export declare function assertOperationCanStart(options?: OperationCancellation): void;
47
+ /**
48
+ * Separate host-only cancellation fields from a value that will be
49
+ * structured-cloned into the worker. `AbortSignal` cannot cross that boundary.
50
+ */
51
+ export declare function splitOperationCancellation(value: unknown): {
52
+ cancellation?: OperationCancellation;
53
+ rest: unknown;
54
+ };
@@ -568,6 +568,8 @@ declare function incrementalLayoutComplete(previousBlocks: FlowBlock[], _previou
568
568
  fontCapabilities?: FontMeasureCapabilities;
569
569
  }, warmStart?: {
570
570
  footnoteReserveSeed?: FootnoteReserveSeed | null;
571
+ /** Per-open-document diagnostic lifetime, including cold relayouts. */
572
+ footnoteWarningOwner?: object;
571
573
  /** Host proved the authoritative note projection bundle was retained exactly. */
572
574
  noteMeasurePlaneRetainedExact?: true;
573
575
  /** Host proved this seed is an exact, geometry-equivalent subset of the current note plane. */
@@ -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-MSiU8Kg0.cjs");
2
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-CbiiPcgr.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-DmGX1w-i.es.js";
1
+ import { t as createSuperDocUI } from "../chunks/create-super-doc-ui-DHW9Toxn.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-MSiU8Kg0.cjs");
2
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-CbiiPcgr.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-DmGX1w-i.es.js";
1
+ import { t as createSuperDocUI } from "../chunks/create-super-doc-ui-DHW9Toxn.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-MSiU8Kg0.cjs");
2
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-CbiiPcgr.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-DmGX1w-i.es.js";
1
+ import { a as BUILT_IN_COMMAND_IDS, t as createSuperDocUI, u as shallowEqual } from "../chunks/create-super-doc-ui-DHW9Toxn.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-99399849] {
2343
+ .superdoc[data-v-3a8081b4] {
2344
2344
  display: flex;
2345
2345
  position: relative;
2346
2346
  }
2347
- .right-sidebar[data-v-99399849] {
2347
+ .right-sidebar[data-v-3a8081b4] {
2348
2348
  min-width: 320px;
2349
2349
  height: 100%;
2350
2350
  }
2351
- .floating-comments[data-v-99399849] {
2351
+ .floating-comments[data-v-3a8081b4] {
2352
2352
  min-width: 300px;
2353
2353
  width: 300px;
2354
2354
  height: 100%;
2355
2355
  overflow: visible;
2356
2356
  }
2357
- .superdoc__layers[data-v-99399849] {
2357
+ .superdoc__layers[data-v-3a8081b4] {
2358
2358
  height: 100%;
2359
2359
  position: relative;
2360
2360
  box-sizing: border-box;
2361
2361
  }
2362
- .superdoc__document[data-v-99399849] {
2362
+ .superdoc__document[data-v-3a8081b4] {
2363
2363
  width: 100%;
2364
2364
  position: relative;
2365
2365
  }
2366
- .superdoc__sub-document[data-v-99399849] {
2366
+ .superdoc__sub-document[data-v-3a8081b4] {
2367
2367
  width: 100%;
2368
2368
  position: relative;
2369
2369
  }
2370
- .superdoc__selection-layer[data-v-99399849] {
2370
+ .superdoc__selection-layer[data-v-3a8081b4] {
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-99399849] {
2381
+ .superdoc__whiteboard-layer[data-v-3a8081b4] {
2382
2382
  z-index: 4;
2383
2383
  }
2384
- .superdoc__temp-selection[data-v-99399849] {
2384
+ .superdoc__temp-selection[data-v-3a8081b4] {
2385
2385
  position: absolute;
2386
2386
  }
2387
- .superdoc__right-sidebar[data-v-99399849] {
2387
+ .superdoc__right-sidebar[data-v-3a8081b4] {
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-99399849] {
2395
+ .superdoc__compact-comment-popover[data-v-3a8081b4] {
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-99399849] {
2404
+ .tools[data-v-3a8081b4] {
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-99399849] {
2411
+ .tools-item[data-v-3a8081b4] {
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-99399849] {
2422
+ .tools-item i[data-v-3a8081b4] {
2423
2423
  cursor: pointer;
2424
2424
  }
2425
- .superdoc__tools-icon[data-v-99399849] {
2425
+ .superdoc__tools-icon[data-v-3a8081b4] {
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-99399849] {
2440
+ .superdoc .superdoc__layers[data-v-3a8081b4] {
2441
2441
  margin: 0;
2442
2442
  border: 0 !important;
2443
2443
  box-shadow: none;
2444
2444
  }
2445
- .superdoc__sub-document[data-v-99399849] {
2445
+ .superdoc__sub-document[data-v-3a8081b4] {
2446
2446
  max-width: 100%;
2447
2447
  }
2448
- .superdoc__right-sidebar[data-v-99399849] {
2448
+ .superdoc__right-sidebar[data-v-3a8081b4] {
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-99399849] {
2455
+ .ai-writer-container[data-v-3a8081b4] {
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-99399849] {
2471
+ .ai-tool > svg[data-v-3a8081b4] {
2472
2472
  fill: transparent;
2473
2473
  }
2474
- .ai-tool[data-v-99399849]::before {
2474
+ .ai-tool[data-v-3a8081b4]::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-99399849]:hover::before {
2495
+ .ai-tool[data-v-3a8081b4]:hover::before {
2496
2496
  filter: brightness(1.3);
2497
2497
  }
2498
2498
 
@@ -2340,34 +2340,34 @@ img[data-v-c95b2073] {
2340
2340
  pointer-events: auto;
2341
2341
  }
2342
2342
 
2343
- .superdoc[data-v-99399849] {
2343
+ .superdoc[data-v-3a8081b4] {
2344
2344
  display: flex;
2345
2345
  position: relative;
2346
2346
  }
2347
- .right-sidebar[data-v-99399849] {
2347
+ .right-sidebar[data-v-3a8081b4] {
2348
2348
  min-width: 320px;
2349
2349
  height: 100%;
2350
2350
  }
2351
- .floating-comments[data-v-99399849] {
2351
+ .floating-comments[data-v-3a8081b4] {
2352
2352
  min-width: 300px;
2353
2353
  width: 300px;
2354
2354
  height: 100%;
2355
2355
  overflow: visible;
2356
2356
  }
2357
- .superdoc__layers[data-v-99399849] {
2357
+ .superdoc__layers[data-v-3a8081b4] {
2358
2358
  height: 100%;
2359
2359
  position: relative;
2360
2360
  box-sizing: border-box;
2361
2361
  }
2362
- .superdoc__document[data-v-99399849] {
2362
+ .superdoc__document[data-v-3a8081b4] {
2363
2363
  width: 100%;
2364
2364
  position: relative;
2365
2365
  }
2366
- .superdoc__sub-document[data-v-99399849] {
2366
+ .superdoc__sub-document[data-v-3a8081b4] {
2367
2367
  width: 100%;
2368
2368
  position: relative;
2369
2369
  }
2370
- .superdoc__selection-layer[data-v-99399849] {
2370
+ .superdoc__selection-layer[data-v-3a8081b4] {
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-99399849] {
2381
+ .superdoc__whiteboard-layer[data-v-3a8081b4] {
2382
2382
  z-index: 4;
2383
2383
  }
2384
- .superdoc__temp-selection[data-v-99399849] {
2384
+ .superdoc__temp-selection[data-v-3a8081b4] {
2385
2385
  position: absolute;
2386
2386
  }
2387
- .superdoc__right-sidebar[data-v-99399849] {
2387
+ .superdoc__right-sidebar[data-v-3a8081b4] {
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-99399849] {
2395
+ .superdoc__compact-comment-popover[data-v-3a8081b4] {
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-99399849] {
2404
+ .tools[data-v-3a8081b4] {
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-99399849] {
2411
+ .tools-item[data-v-3a8081b4] {
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-99399849] {
2422
+ .tools-item i[data-v-3a8081b4] {
2423
2423
  cursor: pointer;
2424
2424
  }
2425
- .superdoc__tools-icon[data-v-99399849] {
2425
+ .superdoc__tools-icon[data-v-3a8081b4] {
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-99399849] {
2440
+ .superdoc .superdoc__layers[data-v-3a8081b4] {
2441
2441
  margin: 0;
2442
2442
  border: 0 !important;
2443
2443
  box-shadow: none;
2444
2444
  }
2445
- .superdoc__sub-document[data-v-99399849] {
2445
+ .superdoc__sub-document[data-v-3a8081b4] {
2446
2446
  max-width: 100%;
2447
2447
  }
2448
- .superdoc__right-sidebar[data-v-99399849] {
2448
+ .superdoc__right-sidebar[data-v-3a8081b4] {
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-99399849] {
2455
+ .ai-writer-container[data-v-3a8081b4] {
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-99399849] {
2471
+ .ai-tool > svg[data-v-3a8081b4] {
2472
2472
  fill: transparent;
2473
2473
  }
2474
- .ai-tool[data-v-99399849]::before {
2474
+ .ai-tool[data-v-3a8081b4]::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-99399849]:hover::before {
2495
+ .ai-tool[data-v-3a8081b4]:hover::before {
2496
2496
  filter: brightness(1.3);
2497
2497
  }
2498
2498
 
@@ -10,6 +10,7 @@ export const PERMISSIONS: Readonly<{
10
10
  UPLOAD_VERSION: "UPLOAD_VERSION";
11
11
  VERSION_HISTORY: "VERSION_HISTORY";
12
12
  }>;
13
+ export function createTrackedChangePermissionResolver(superdoc: any): (payload?: {}) => any;
13
14
  export function isAllowed(permission: string, role: string, isInternal: boolean, context?: {
14
15
  comment?: object | null | undefined;
15
16
  superdoc?: object | null | undefined;