superdoc 2.25.0-next.2 → 2.25.0-next.4

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 (55) hide show
  1. package/dist/chunks/{create-super-doc-ui-D8ss5E0J.cjs → create-super-doc-ui-C-oN_R2a.cjs} +19 -0
  2. package/dist/chunks/{create-super-doc-ui-3habU4hL.es.js → create-super-doc-ui-D5waZHl3.es.js} +19 -0
  3. package/dist/collaboration-upgrade-engine.cjs +1 -1
  4. package/dist/collaboration-upgrade-engine.es.js +1 -1
  5. package/dist/document-api/src/comments/comments.types.d.ts +2 -0
  6. package/dist/document-api/src/content-controls/content-controls.types.d.ts +4 -2
  7. package/dist/document-api/src/contract/operation-definitions.d.ts +1 -1
  8. package/dist/document-api/src/hyperlinks/hyperlinks.types.d.ts +9 -2
  9. package/dist/document-api/src/images/images.types.d.ts +3 -3
  10. package/dist/document-api/src/index.d.ts +1 -0
  11. package/dist/document-api/src/lists/lists.types.d.ts +11 -11
  12. package/dist/document-api/src/permission-ranges/permission-ranges.d.ts +9 -1
  13. package/dist/document-api/src/permission-ranges/permission-ranges.types.d.ts +17 -0
  14. package/dist/document-api/src/protection/protection.types.d.ts +2 -2
  15. package/dist/document-api/src/receipt-bridge.d.ts +3 -0
  16. package/dist/document-api/src/types/blocks.types.d.ts +2 -2
  17. package/dist/document-api/src/types/mutation-plan.types.d.ts +2 -2
  18. package/dist/document-api/src/types/receipt.d.ts +12 -0
  19. package/dist/document-api/src/types/sd-contract.d.ts +3 -0
  20. package/dist/document-api/src/types/track-changes.types.d.ts +8 -0
  21. package/dist/layout-engine/contracts/src/incremental-dependency.d.ts +2 -2
  22. package/dist/layout-engine/contracts/src/index.d.ts +4 -0
  23. package/dist/layout-engine/layout-bridge/src/font-metrics-cache.d.ts +2 -23
  24. package/dist/layout-engine/layout-bridge/src/incrementalLayout.d.ts +11 -4
  25. package/dist/layout-engine/layout-bridge/src/index.d.ts +2 -2
  26. package/dist/layout-engine/layout-bridge/src/measurement-environment.d.ts +12 -0
  27. package/dist/layout-engine/layout-bridge/src/resolveLiveCrossReferences.d.ts +1 -1
  28. package/dist/layout-engine/painters/dom/src/index.d.ts +4 -0
  29. package/dist/layout-engine/painters/dom/src/runs/text-run.d.ts +2 -17
  30. package/dist/layout-engine/painters/dom/src/runs/text-style-facts.d.ts +9 -0
  31. package/dist/layout-engine/painters/dom/src/runs/tracked-changes.d.ts +6 -9
  32. package/dist/layout-engine/painters/dom/src/styles.d.ts +21 -0
  33. package/dist/public/ui-react.cjs +1 -1
  34. package/dist/public/ui-react.es.js +1 -1
  35. package/dist/public/ui-vue.cjs +1 -1
  36. package/dist/public/ui-vue.es.js +1 -1
  37. package/dist/public/ui.cjs +1 -1
  38. package/dist/public/ui.es.js +1 -1
  39. package/dist/shared/font-system/src/registry.d.ts +5 -1
  40. package/dist/shared/font-system/src/resolver.d.ts +2 -0
  41. package/dist/style.css +27 -27
  42. package/dist/style.layered.css +27 -27
  43. package/dist/superdoc/src/core/types/index.d.ts +1 -1
  44. package/dist/superdoc/src/index.d.cts +2 -0
  45. package/dist/superdoc/src/index.d.ts +1 -0
  46. package/dist/superdoc/src/public/index.d.cts +8 -0
  47. package/dist/superdoc/src/public/index.d.ts +2 -0
  48. package/dist/superdoc/src/stores/comments-store.d.ts +7 -4
  49. package/dist/superdoc/src/stores/superdoc-store.d.ts +21 -12
  50. package/dist/superdoc.cjs +160 -14
  51. package/dist/superdoc.es.js +159 -15
  52. package/dist-cdn/style.layered.css +1 -1
  53. package/dist-cdn/superdoc.min.css +1 -1
  54. package/dist-cdn/superdoc.min.js +42 -42
  55. package/package.json +2 -2
@@ -2,6 +2,8 @@ import { Run, TextRun } from '../../../../contracts/src/index.js';
2
2
  import { FragmentRenderContext } from '../renderer.js';
3
3
  import { BROWSER_DEFAULT_FONT_SIZE } from '../styles.js';
4
4
  import { RunRenderContext, TrackedChangesRenderConfig } from './types.js';
5
+ import { ResolvePhysicalFont } from './text-style-facts.js';
6
+ export { underlineThicknessPx } from './text-style-facts.js';
5
7
  export type CheckboxGlyphs = {
6
8
  checked: string;
7
9
  unchecked: string;
@@ -10,23 +12,6 @@ export type CheckboxGlyphs = {
10
12
  export declare const checkboxGlyphs: (run: TextRun) => CheckboxGlyphs | null;
11
13
  /** Stamps the authored states needed to reflect an accepted checkbox toggle. */
12
14
  export declare const applyCheckboxGlyphMetadata: (element: HTMLElement, run: TextRun) => CheckboxGlyphs | null;
13
- /**
14
- * Underline thickness in px, scaled to font size. Shared by text runs
15
- * (`text-decoration-thickness`) and tab underlines (border width) so a run's
16
- * underline renders as a single uniform weight across text and tab characters,
17
- * matching Word, on any display density (SD-3330). The divisor approximates the
18
- * font's natural underline weight (≈ what `text-decoration-thickness: auto`
19
- * produces) while staying deterministic across platforms.
20
- *
21
- * Rounded to an integer px because CSS borders snap to integer device pixels
22
- * while `text-decoration-thickness` keeps fractional values; using an integer
23
- * makes the tab border and the text underline rasterize to the same line weight.
24
- */
25
- export declare const underlineThicknessPx: (fontSize: number) => number;
26
- type ResolvePhysicalFont = (cssFontFamily: string, face: {
27
- weight: '400' | '700';
28
- style: 'normal' | 'italic';
29
- }) => string;
30
15
  export declare const applyRunTypographyStyles: (element: HTMLElement, run: TextRun, resolvePhysical?: ResolvePhysicalFont) => void;
31
16
  /**
32
17
  * Applies run styling properties to a DOM element.
@@ -0,0 +1,9 @@
1
+ import { TextRun } from '../../../../contracts/src/index.js';
2
+ export type ResolvePhysicalFont = (family: string, face: {
3
+ weight: '400' | '700';
4
+ style: 'normal' | 'italic';
5
+ }) => string;
6
+ /** The same paint-ready typography is consumed by the DOM painter and worker sinks. */
7
+ export declare function resolveRunTypographyStyles(run: TextRun, resolvePhysical?: ResolvePhysicalFont): Record<string, string>;
8
+ export declare const underlineThicknessPx: (fontSize: number) => number;
9
+ export declare function resolveRunDecorationStyles(run: TextRun): Record<string, string>;
@@ -21,17 +21,9 @@ export declare const resolveTrackedChangeVisualColor: (layer: TrackedChangeMeta)
21
21
  * `colorWithAlpha` can safely extend (named/non-hex visual colors still set
22
22
  * border/text but never fabricate a derived background).
23
23
  */
24
+ export declare const resolveTrackedChangeColorVariables: (layer: TrackedChangeMeta) => Record<string, string>;
24
25
  export declare const applyTrackedChangeColorVariables: (elem: HTMLElement, layer: TrackedChangeMeta) => void;
25
26
  export declare const TRACK_CHANGE_MODIFIER_CLASS: Record<TrackedChangeKind, Record<TrackedChangesMode, string | undefined>>;
26
- /**
27
- * Stamps the semantic class + datasets for a tracked-change layer. Shared by
28
- * inline, row-level, and cell-level paint paths so the dataset/class vocabulary
29
- * stays identical. Only fields that are present are stamped; this never reads
30
- * or writes the author `color` dataset. The semantic datasets are namespaced
31
- * (`data-track-change-semantic-*`, `-type`, `-subtype`, `-target-kind`,
32
- * `-semantic-anchor-scope`) so they never collide with the existing author/
33
- * structural datasets even when row + cell metadata coexist.
34
- */
35
27
  export declare const applySemanticTrackedChangeMetadata: (elem: HTMLElement, meta: TrackedChangeMeta) => void;
36
28
  type TrackedChangeCarrier = Partial<Pick<TextRun, 'trackedChange' | 'trackedChanges'>>;
37
29
  type TrackedChangeDecoratable = Run | TrackedChangeCarrier;
@@ -86,5 +78,10 @@ export declare const applyRowTrackedChangeToCell: (elem: HTMLElement, meta: Trac
86
78
  * @param config - Tracked-changes mode/enabled (same source inline runs use).
87
79
  */
88
80
  export declare const applyCellTrackedChangeToCell: (elem: HTMLElement, meta: TrackedChangeMeta, config: TrackedChangesRenderConfig) => void;
81
+ export declare const resolveTrackedChangeDecorationFacts: (run: TrackedChangeDecoratable, config: TrackedChangesRenderConfig) => {
82
+ classes: string[];
83
+ style: Record<string, string>;
84
+ attributes: Record<string, string>;
85
+ };
89
86
  export declare const applyTrackedChangeDecorations: (elem: HTMLElement, run: TrackedChangeDecoratable, config: TrackedChangesRenderConfig) => void;
90
87
  export {};
@@ -31,6 +31,27 @@ export declare const fragmentStyles: Partial<CSSStyleDeclaration>;
31
31
  * element itself gets z-index for layering within the line (e.g. above tab leaders).
32
32
  */
33
33
  export declare const lineStyles: (lineHeight: number) => Partial<CSSStyleDeclaration>;
34
+ /** Default inline tracking paint values shared with non-DOM drawing consumers. */
35
+ export declare const INLINE_TRACKED_CHANGE_DEFAULTS: {
36
+ readonly insert: {
37
+ readonly border: "#1f6feb";
38
+ readonly background: "#1f6feb22";
39
+ readonly borderWidth: 1;
40
+ readonly strikeWidth: 0;
41
+ };
42
+ readonly delete: {
43
+ readonly border: "#cb0e47";
44
+ readonly background: "#cb0e4722";
45
+ readonly borderWidth: 1;
46
+ readonly strikeWidth: 2;
47
+ };
48
+ readonly format: {
49
+ readonly border: "gold";
50
+ readonly background: "transparent";
51
+ readonly borderWidth: 2;
52
+ readonly strikeWidth: 0;
53
+ };
54
+ };
34
55
  /** One document-scoped stylesheet the paint surface requires: head marker attribute + CSS payload. */
35
56
  export type SurfaceStylePreflightEntry = {
36
57
  markerAttribute: string;
@@ -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-D8ss5E0J.cjs");
2
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-C-oN_R2a.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-3habU4hL.es.js";
1
+ import { t as createSuperDocUI } from "../chunks/create-super-doc-ui-D5waZHl3.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-D8ss5E0J.cjs");
2
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-C-oN_R2a.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-3habU4hL.es.js";
1
+ import { t as createSuperDocUI } from "../chunks/create-super-doc-ui-D5waZHl3.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-D8ss5E0J.cjs");
2
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-C-oN_R2a.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-3habU4hL.es.js";
1
+ import { a as BUILT_IN_COMMAND_IDS, t as createSuperDocUI, u as shallowEqual } from "../chunks/create-super-doc-ui-D5waZHl3.es.js";
2
2
  export { BUILT_IN_COMMAND_IDS, createSuperDocUI, shallowEqual };
@@ -75,7 +75,9 @@ export declare class FontRegistry {
75
75
  * constructor: the family is recorded as `unloaded` and will resolve to
76
76
  * `fallback_used` when awaited.
77
77
  */
78
- register(descriptor: FontFaceDescriptor): RegisterFaceResult;
78
+ register(descriptor: FontFaceDescriptor, options?: {
79
+ preserveDescriptors?: boolean;
80
+ }): RegisterFaceResult;
79
81
  /** True if this registry created a managed face for the family. */
80
82
  isManaged(family: string): boolean;
81
83
  /**
@@ -126,6 +128,8 @@ export declare class FontRegistry {
126
128
  * Distinct from {@link isAvailable}, which asks whether a face is LOADED right now.
127
129
  */
128
130
  hasFace(family: string, weight: '400' | '700', style: 'normal' | 'italic'): boolean;
131
+ /** Face facts captured without retaining this registry or consulting later load state. */
132
+ snapshotFaces(): Pick<FontRegistry, 'hasFace' | 'getFaceStatus'>;
129
133
  /**
130
134
  * Synchronous availability check: is a real face for this family loaded and
131
135
  * usable in the set *right now*? Used by the gate's late-load handler to detect
@@ -124,6 +124,8 @@ export declare class FontResolver {
124
124
  * fonts must not leak into the next). Bumps {@link version} only if something was actually cleared.
125
125
  */
126
126
  reset(): void;
127
+ /** Immutable resolution owner for geometry retained with an already displayed scene. */
128
+ snapshot(): Pick<FontResolver, 'resolvePhysicalFamilyForFace' | 'signature'>;
127
129
  /** Monotonic version; bumps on every mapping change. A lightweight "did it change" signal. */
128
130
  get version(): number;
129
131
  /**
package/dist/style.css CHANGED
@@ -1899,28 +1899,28 @@ img[data-v-c95b2073] {
1899
1899
  background-color: #1355ff7f;
1900
1900
  }
1901
1901
 
1902
- .comment-placeholder[data-v-15b59a51] {
1902
+ .comment-placeholder[data-v-f0b1fd79] {
1903
1903
  position: absolute;
1904
1904
  width: 300px;
1905
1905
  transition: top 0.3s ease;
1906
1906
  }
1907
- .comment-placeholder.is-direct-decision-continuity-target[data-v-15b59a51] .overflow-menu {
1907
+ .comment-placeholder.is-direct-decision-continuity-target[data-v-f0b1fd79] .overflow-menu {
1908
1908
  opacity: 1;
1909
1909
  pointer-events: auto;
1910
1910
  }
1911
- .floating-comment[data-v-15b59a51] {
1911
+ .floating-comment[data-v-f0b1fd79] {
1912
1912
  position: relative;
1913
1913
  display: block;
1914
1914
  min-width: 300px;
1915
1915
  }
1916
- .sidebar-container[data-v-15b59a51] {
1916
+ .sidebar-container[data-v-f0b1fd79] {
1917
1917
  position: absolute;
1918
1918
  width: 300px;
1919
1919
  min-height: 300px;
1920
1920
  transition: transform 0.3s ease;
1921
1921
  will-change: transform;
1922
1922
  }
1923
- .section-wrapper[data-v-15b59a51] {
1923
+ .section-wrapper[data-v-f0b1fd79] {
1924
1924
  position: relative;
1925
1925
  min-height: 100%;
1926
1926
  width: 300px;
@@ -2348,34 +2348,34 @@ img[data-v-c95b2073] {
2348
2348
  pointer-events: auto;
2349
2349
  }
2350
2350
 
2351
- .superdoc[data-v-e8f59dd7] {
2351
+ .superdoc[data-v-c57da6ae] {
2352
2352
  display: flex;
2353
2353
  position: relative;
2354
2354
  }
2355
- .right-sidebar[data-v-e8f59dd7] {
2355
+ .right-sidebar[data-v-c57da6ae] {
2356
2356
  min-width: 320px;
2357
2357
  height: 100%;
2358
2358
  }
2359
- .floating-comments[data-v-e8f59dd7] {
2359
+ .floating-comments[data-v-c57da6ae] {
2360
2360
  min-width: 300px;
2361
2361
  width: 300px;
2362
2362
  height: 100%;
2363
2363
  overflow: visible;
2364
2364
  }
2365
- .superdoc__layers[data-v-e8f59dd7] {
2365
+ .superdoc__layers[data-v-c57da6ae] {
2366
2366
  height: 100%;
2367
2367
  position: relative;
2368
2368
  box-sizing: border-box;
2369
2369
  }
2370
- .superdoc__document[data-v-e8f59dd7] {
2370
+ .superdoc__document[data-v-c57da6ae] {
2371
2371
  width: 100%;
2372
2372
  position: relative;
2373
2373
  }
2374
- .superdoc__sub-document[data-v-e8f59dd7] {
2374
+ .superdoc__sub-document[data-v-c57da6ae] {
2375
2375
  width: 100%;
2376
2376
  position: relative;
2377
2377
  }
2378
- .superdoc__selection-layer[data-v-e8f59dd7] {
2378
+ .superdoc__selection-layer[data-v-c57da6ae] {
2379
2379
  position: absolute;
2380
2380
  min-width: 100%;
2381
2381
  min-height: 100%;
@@ -2386,13 +2386,13 @@ img[data-v-c95b2073] {
2386
2386
  /* SD-3497: PDF whiteboard overlay sits above the rendered PDF canvas but below
2387
2387
  the PDF comment anchors (z-index 6 in PdfCommentsLayer) so anchors stay
2388
2388
  clickable, and below the selection layer (z-index 10). */
2389
- .superdoc__whiteboard-layer[data-v-e8f59dd7] {
2389
+ .superdoc__whiteboard-layer[data-v-c57da6ae] {
2390
2390
  z-index: 4;
2391
2391
  }
2392
- .superdoc__temp-selection[data-v-e8f59dd7] {
2392
+ .superdoc__temp-selection[data-v-c57da6ae] {
2393
2393
  position: absolute;
2394
2394
  }
2395
- .superdoc__right-sidebar[data-v-e8f59dd7] {
2395
+ .superdoc__right-sidebar[data-v-c57da6ae] {
2396
2396
  width: 320px;
2397
2397
  min-width: 320px;
2398
2398
  padding: 0 10px;
@@ -2400,7 +2400,7 @@ img[data-v-c95b2073] {
2400
2400
  position: relative;
2401
2401
  z-index: 2;
2402
2402
  }
2403
- .superdoc__compact-comment-popover[data-v-e8f59dd7] {
2403
+ .superdoc__compact-comment-popover[data-v-c57da6ae] {
2404
2404
  position: absolute;
2405
2405
  top: 12px;
2406
2406
  right: 12px;
@@ -2409,14 +2409,14 @@ img[data-v-c95b2073] {
2409
2409
  }
2410
2410
 
2411
2411
  /* Tools styles */
2412
- .tools[data-v-e8f59dd7] {
2412
+ .tools[data-v-c57da6ae] {
2413
2413
  position: absolute;
2414
2414
  z-index: 3;
2415
2415
  display: flex;
2416
2416
  flex-direction: column;
2417
2417
  gap: var(--sd-ui-tools-gap, 6px);
2418
2418
  }
2419
- .tools-item[data-v-e8f59dd7] {
2419
+ .tools-item[data-v-c57da6ae] {
2420
2420
  display: flex;
2421
2421
  align-items: center;
2422
2422
  justify-content: center;
@@ -2427,10 +2427,10 @@ img[data-v-c95b2073] {
2427
2427
  cursor: pointer;
2428
2428
  position: relative;
2429
2429
  }
2430
- .tools-item i[data-v-e8f59dd7] {
2430
+ .tools-item i[data-v-c57da6ae] {
2431
2431
  cursor: pointer;
2432
2432
  }
2433
- .superdoc__tools-icon[data-v-e8f59dd7] {
2433
+ .superdoc__tools-icon[data-v-c57da6ae] {
2434
2434
  width: var(--sd-ui-tools-icon-size, 20px);
2435
2435
  height: var(--sd-ui-tools-icon-size, 20px);
2436
2436
  flex-shrink: 0;
@@ -2445,22 +2445,22 @@ img[data-v-c95b2073] {
2445
2445
 
2446
2446
  /* 834px is iPad screen size in portrait orientation */
2447
2447
  @media (max-width: 834px) {
2448
- .superdoc .superdoc__layers[data-v-e8f59dd7] {
2448
+ .superdoc .superdoc__layers[data-v-c57da6ae] {
2449
2449
  margin: 0;
2450
2450
  border: 0 !important;
2451
2451
  box-shadow: none;
2452
2452
  }
2453
- .superdoc__sub-document[data-v-e8f59dd7] {
2453
+ .superdoc__sub-document[data-v-c57da6ae] {
2454
2454
  max-width: 100%;
2455
2455
  }
2456
- .superdoc__right-sidebar[data-v-e8f59dd7] {
2456
+ .superdoc__right-sidebar[data-v-c57da6ae] {
2457
2457
  padding: 10px;
2458
2458
  position: relative;
2459
2459
  }
2460
2460
  }
2461
2461
 
2462
2462
  /* AI Writer styles */
2463
- .ai-writer-container[data-v-e8f59dd7] {
2463
+ .ai-writer-container[data-v-c57da6ae] {
2464
2464
  position: fixed;
2465
2465
  z-index: 1000;
2466
2466
  background: white;
@@ -2476,10 +2476,10 @@ img[data-v-c95b2073] {
2476
2476
  transform: translateY(-50%);
2477
2477
  z-index: 50;
2478
2478
  } */
2479
- .ai-tool > svg[data-v-e8f59dd7] {
2479
+ .ai-tool > svg[data-v-c57da6ae] {
2480
2480
  fill: transparent;
2481
2481
  }
2482
- .ai-tool[data-v-e8f59dd7]::before {
2482
+ .ai-tool[data-v-c57da6ae]::before {
2483
2483
  content: '';
2484
2484
  position: absolute;
2485
2485
  width: 20px;
@@ -2500,7 +2500,7 @@ img[data-v-c95b2073] {
2500
2500
  filter: brightness(1.2);
2501
2501
  transition: filter 0.2s ease;
2502
2502
  }
2503
- .ai-tool[data-v-e8f59dd7]:hover::before {
2503
+ .ai-tool[data-v-c57da6ae]:hover::before {
2504
2504
  filter: brightness(1.3);
2505
2505
  }
2506
2506
 
@@ -1899,28 +1899,28 @@ img[data-v-c95b2073] {
1899
1899
  background-color: #1355ff7f;
1900
1900
  }
1901
1901
 
1902
- .comment-placeholder[data-v-15b59a51] {
1902
+ .comment-placeholder[data-v-f0b1fd79] {
1903
1903
  position: absolute;
1904
1904
  width: 300px;
1905
1905
  transition: top 0.3s ease;
1906
1906
  }
1907
- .comment-placeholder.is-direct-decision-continuity-target[data-v-15b59a51] .overflow-menu {
1907
+ .comment-placeholder.is-direct-decision-continuity-target[data-v-f0b1fd79] .overflow-menu {
1908
1908
  opacity: 1;
1909
1909
  pointer-events: auto;
1910
1910
  }
1911
- .floating-comment[data-v-15b59a51] {
1911
+ .floating-comment[data-v-f0b1fd79] {
1912
1912
  position: relative;
1913
1913
  display: block;
1914
1914
  min-width: 300px;
1915
1915
  }
1916
- .sidebar-container[data-v-15b59a51] {
1916
+ .sidebar-container[data-v-f0b1fd79] {
1917
1917
  position: absolute;
1918
1918
  width: 300px;
1919
1919
  min-height: 300px;
1920
1920
  transition: transform 0.3s ease;
1921
1921
  will-change: transform;
1922
1922
  }
1923
- .section-wrapper[data-v-15b59a51] {
1923
+ .section-wrapper[data-v-f0b1fd79] {
1924
1924
  position: relative;
1925
1925
  min-height: 100%;
1926
1926
  width: 300px;
@@ -2348,34 +2348,34 @@ img[data-v-c95b2073] {
2348
2348
  pointer-events: auto;
2349
2349
  }
2350
2350
 
2351
- .superdoc[data-v-e8f59dd7] {
2351
+ .superdoc[data-v-c57da6ae] {
2352
2352
  display: flex;
2353
2353
  position: relative;
2354
2354
  }
2355
- .right-sidebar[data-v-e8f59dd7] {
2355
+ .right-sidebar[data-v-c57da6ae] {
2356
2356
  min-width: 320px;
2357
2357
  height: 100%;
2358
2358
  }
2359
- .floating-comments[data-v-e8f59dd7] {
2359
+ .floating-comments[data-v-c57da6ae] {
2360
2360
  min-width: 300px;
2361
2361
  width: 300px;
2362
2362
  height: 100%;
2363
2363
  overflow: visible;
2364
2364
  }
2365
- .superdoc__layers[data-v-e8f59dd7] {
2365
+ .superdoc__layers[data-v-c57da6ae] {
2366
2366
  height: 100%;
2367
2367
  position: relative;
2368
2368
  box-sizing: border-box;
2369
2369
  }
2370
- .superdoc__document[data-v-e8f59dd7] {
2370
+ .superdoc__document[data-v-c57da6ae] {
2371
2371
  width: 100%;
2372
2372
  position: relative;
2373
2373
  }
2374
- .superdoc__sub-document[data-v-e8f59dd7] {
2374
+ .superdoc__sub-document[data-v-c57da6ae] {
2375
2375
  width: 100%;
2376
2376
  position: relative;
2377
2377
  }
2378
- .superdoc__selection-layer[data-v-e8f59dd7] {
2378
+ .superdoc__selection-layer[data-v-c57da6ae] {
2379
2379
  position: absolute;
2380
2380
  min-width: 100%;
2381
2381
  min-height: 100%;
@@ -2386,13 +2386,13 @@ img[data-v-c95b2073] {
2386
2386
  /* SD-3497: PDF whiteboard overlay sits above the rendered PDF canvas but below
2387
2387
  the PDF comment anchors (z-index 6 in PdfCommentsLayer) so anchors stay
2388
2388
  clickable, and below the selection layer (z-index 10). */
2389
- .superdoc__whiteboard-layer[data-v-e8f59dd7] {
2389
+ .superdoc__whiteboard-layer[data-v-c57da6ae] {
2390
2390
  z-index: 4;
2391
2391
  }
2392
- .superdoc__temp-selection[data-v-e8f59dd7] {
2392
+ .superdoc__temp-selection[data-v-c57da6ae] {
2393
2393
  position: absolute;
2394
2394
  }
2395
- .superdoc__right-sidebar[data-v-e8f59dd7] {
2395
+ .superdoc__right-sidebar[data-v-c57da6ae] {
2396
2396
  width: 320px;
2397
2397
  min-width: 320px;
2398
2398
  padding: 0 10px;
@@ -2400,7 +2400,7 @@ img[data-v-c95b2073] {
2400
2400
  position: relative;
2401
2401
  z-index: 2;
2402
2402
  }
2403
- .superdoc__compact-comment-popover[data-v-e8f59dd7] {
2403
+ .superdoc__compact-comment-popover[data-v-c57da6ae] {
2404
2404
  position: absolute;
2405
2405
  top: 12px;
2406
2406
  right: 12px;
@@ -2409,14 +2409,14 @@ img[data-v-c95b2073] {
2409
2409
  }
2410
2410
 
2411
2411
  /* Tools styles */
2412
- .tools[data-v-e8f59dd7] {
2412
+ .tools[data-v-c57da6ae] {
2413
2413
  position: absolute;
2414
2414
  z-index: 3;
2415
2415
  display: flex;
2416
2416
  flex-direction: column;
2417
2417
  gap: var(--sd-ui-tools-gap, 6px);
2418
2418
  }
2419
- .tools-item[data-v-e8f59dd7] {
2419
+ .tools-item[data-v-c57da6ae] {
2420
2420
  display: flex;
2421
2421
  align-items: center;
2422
2422
  justify-content: center;
@@ -2427,10 +2427,10 @@ img[data-v-c95b2073] {
2427
2427
  cursor: pointer;
2428
2428
  position: relative;
2429
2429
  }
2430
- .tools-item i[data-v-e8f59dd7] {
2430
+ .tools-item i[data-v-c57da6ae] {
2431
2431
  cursor: pointer;
2432
2432
  }
2433
- .superdoc__tools-icon[data-v-e8f59dd7] {
2433
+ .superdoc__tools-icon[data-v-c57da6ae] {
2434
2434
  width: var(--sd-ui-tools-icon-size, 20px);
2435
2435
  height: var(--sd-ui-tools-icon-size, 20px);
2436
2436
  flex-shrink: 0;
@@ -2445,22 +2445,22 @@ img[data-v-c95b2073] {
2445
2445
 
2446
2446
  /* 834px is iPad screen size in portrait orientation */
2447
2447
  @media (max-width: 834px) {
2448
- .superdoc .superdoc__layers[data-v-e8f59dd7] {
2448
+ .superdoc .superdoc__layers[data-v-c57da6ae] {
2449
2449
  margin: 0;
2450
2450
  border: 0 !important;
2451
2451
  box-shadow: none;
2452
2452
  }
2453
- .superdoc__sub-document[data-v-e8f59dd7] {
2453
+ .superdoc__sub-document[data-v-c57da6ae] {
2454
2454
  max-width: 100%;
2455
2455
  }
2456
- .superdoc__right-sidebar[data-v-e8f59dd7] {
2456
+ .superdoc__right-sidebar[data-v-c57da6ae] {
2457
2457
  padding: 10px;
2458
2458
  position: relative;
2459
2459
  }
2460
2460
  }
2461
2461
 
2462
2462
  /* AI Writer styles */
2463
- .ai-writer-container[data-v-e8f59dd7] {
2463
+ .ai-writer-container[data-v-c57da6ae] {
2464
2464
  position: fixed;
2465
2465
  z-index: 1000;
2466
2466
  background: white;
@@ -2476,10 +2476,10 @@ img[data-v-c95b2073] {
2476
2476
  transform: translateY(-50%);
2477
2477
  z-index: 50;
2478
2478
  } */
2479
- .ai-tool > svg[data-v-e8f59dd7] {
2479
+ .ai-tool > svg[data-v-c57da6ae] {
2480
2480
  fill: transparent;
2481
2481
  }
2482
- .ai-tool[data-v-e8f59dd7]::before {
2482
+ .ai-tool[data-v-c57da6ae]::before {
2483
2483
  content: '';
2484
2484
  position: absolute;
2485
2485
  width: 20px;
@@ -2500,7 +2500,7 @@ img[data-v-c95b2073] {
2500
2500
  filter: brightness(1.2);
2501
2501
  transition: filter 0.2s ease;
2502
2502
  }
2503
- .ai-tool[data-v-e8f59dd7]:hover::before {
2503
+ .ai-tool[data-v-c57da6ae]:hover::before {
2504
2504
  filter: brightness(1.3);
2505
2505
  }
2506
2506
 
@@ -3920,7 +3920,7 @@ interface V2WorkerUrlsConfig {
3920
3920
  document?: string | URL;
3921
3921
  /** Collaboration-capable document worker used by v2 collaboration rooms. */
3922
3922
  collaboration?: string | URL;
3923
- /** Isolated review-index worker used for comments and tracked changes. */
3923
+ /** @deprecated Review processing runs in the document worker. Accepted for configuration compatibility. */
3924
3924
  reviewIndex?: string | URL;
3925
3925
  }
3926
3926
  export interface Config {
@@ -8,6 +8,8 @@ export declare const defineSuperDocExtension: typeof import('./index.js', { with
8
8
  export declare const DOCX: typeof import('./index.js', { with: { "resolution-mode": "import" } }).DOCX;
9
9
  export declare const getFileObject: typeof import('./index.js', { with: { "resolution-mode": "import" } }).getFileObject;
10
10
  export declare const HTML: typeof import('./index.js', { with: { "resolution-mode": "import" } }).HTML;
11
+ export declare const listPermissionRangeEditors: typeof import('./index.js', { with: { "resolution-mode": "import" } }).listPermissionRangeEditors;
11
12
  export declare const PDF: typeof import('./index.js', { with: { "resolution-mode": "import" } }).PDF;
13
+ export declare const resolvePermissionRangeEditor: typeof import('./index.js', { with: { "resolution-mode": "import" } }).resolvePermissionRangeEditor;
12
14
  export type SuperDoc = __Cjs_SuperDoc;
13
15
  export declare const SuperDoc: typeof import('./index.js', { with: { "resolution-mode": "import" } }).SuperDoc;
@@ -9,3 +9,4 @@ export { SuperDoc } from './core/SuperDoc.js';
9
9
  export { defineSuperDocExtension } from './core/extensions/index.js';
10
10
  export { BlankDOCX, getFileObject, compareVersions, DOCX, PDF, HTML };
11
11
  export { createTheme, buildTheme } from './core/theme/create-theme.js';
12
+ export { listPermissionRangeEditors, resolvePermissionRangeEditor } from '../../document-api/src/index.js';
@@ -101,6 +101,8 @@ import type { PasswordPromptContext as __Cjs_PasswordPromptContext } from './ind
101
101
  import type { PasswordPromptHandle as __Cjs_PasswordPromptHandle } from './index.js' with { "resolution-mode": "import" };
102
102
  import type { PasswordPromptRenderContext as __Cjs_PasswordPromptRenderContext } from './index.js' with { "resolution-mode": "import" };
103
103
  import type { PasswordPromptResolution as __Cjs_PasswordPromptResolution } from './index.js' with { "resolution-mode": "import" };
104
+ import type { PermissionRangeEditor as __Cjs_PermissionRangeEditor } from './index.js' with { "resolution-mode": "import" };
105
+ import type { PermissionRangeEditorResolution as __Cjs_PermissionRangeEditorResolution } from './index.js' with { "resolution-mode": "import" };
104
106
  import type { PermissionResolver as __Cjs_PermissionResolver } from './index.js' with { "resolution-mode": "import" };
105
107
  import type { PermissionResolverParams as __Cjs_PermissionResolverParams } from './index.js' with { "resolution-mode": "import" };
106
108
  import type { ResolvedFindReplaceTexts as __Cjs_ResolvedFindReplaceTexts } from './index.js' with { "resolution-mode": "import" };
@@ -114,6 +116,7 @@ import type { SearchMatch as __Cjs_SearchMatch } from './index.js' with { "resol
114
116
  import type { SearchStrings as __Cjs_SearchStrings } from './index.js' with { "resolution-mode": "import" };
115
117
  import type { SelectionHandle as __Cjs_SelectionHandle } from './index.js' with { "resolution-mode": "import" };
116
118
  import type { SelectionInfo as __Cjs_SelectionInfo } from './index.js' with { "resolution-mode": "import" };
119
+ import type { SetEditingRestrictionInput as __Cjs_SetEditingRestrictionInput } from './index.js' with { "resolution-mode": "import" };
117
120
  import type { StoryLocator as __Cjs_StoryLocator } from './index.js' with { "resolution-mode": "import" };
118
121
  import type { StructuredDocumentSource as __Cjs_StructuredDocumentSource } from './index.js' with { "resolution-mode": "import" };
119
122
  import type { SuperDoc as __Cjs_SuperDoc } from './index.js' with { "resolution-mode": "import" };
@@ -383,6 +386,7 @@ export type { __Cjs_LinkPopoverConfig as LinkPopoverConfig };
383
386
  export type { __Cjs_LinkPopoverContext as LinkPopoverContext };
384
387
  export type { __Cjs_LinkPopoverResolution as LinkPopoverResolution };
385
388
  export type { __Cjs_LinkPopoverResolver as LinkPopoverResolver };
389
+ export declare const listPermissionRangeEditors: typeof import('./index.js', { with: { "resolution-mode": "import" } }).listPermissionRangeEditors;
386
390
  export type { __Cjs_Modules as Modules };
387
391
  export type { __Cjs_NavigableAddress as NavigableAddress };
388
392
  export type { __Cjs_PasswordPromptAttemptResult as PasswordPromptAttemptResult };
@@ -392,10 +396,13 @@ export type { __Cjs_PasswordPromptHandle as PasswordPromptHandle };
392
396
  export type { __Cjs_PasswordPromptRenderContext as PasswordPromptRenderContext };
393
397
  export type { __Cjs_PasswordPromptResolution as PasswordPromptResolution };
394
398
  export declare const PDF: typeof import('./index.js', { with: { "resolution-mode": "import" } }).PDF;
399
+ export type { __Cjs_PermissionRangeEditor as PermissionRangeEditor };
400
+ export type { __Cjs_PermissionRangeEditorResolution as PermissionRangeEditorResolution };
395
401
  export type { __Cjs_PermissionResolver as PermissionResolver };
396
402
  export type { __Cjs_PermissionResolverParams as PermissionResolverParams };
397
403
  export type { __Cjs_ResolvedFindReplaceTexts as ResolvedFindReplaceTexts };
398
404
  export type { __Cjs_ResolvedPasswordPromptTexts as ResolvedPasswordPromptTexts };
405
+ export declare const resolvePermissionRangeEditor: typeof import('./index.js', { with: { "resolution-mode": "import" } }).resolvePermissionRangeEditor;
399
406
  export type { __Cjs_ResolveRangeOutput as ResolveRangeOutput };
400
407
  export type { __Cjs_RulerConfig as RulerConfig };
401
408
  export type { __Cjs_SdtRef as SdtRef };
@@ -405,6 +412,7 @@ export type { __Cjs_SearchMatch as SearchMatch };
405
412
  export type { __Cjs_SearchStrings as SearchStrings };
406
413
  export type { __Cjs_SelectionHandle as SelectionHandle };
407
414
  export type { __Cjs_SelectionInfo as SelectionInfo };
415
+ export type { __Cjs_SetEditingRestrictionInput as SetEditingRestrictionInput };
408
416
  export type { __Cjs_StoryLocator as StoryLocator };
409
417
  export type { __Cjs_StructuredDocumentSource as StructuredDocumentSource };
410
418
  export type SuperDoc = __Cjs_SuperDoc;
@@ -33,6 +33,8 @@ export type { DocumentApi } from '../../../document-api/src/index.js';
33
33
  export type { DiffApplyEligibility, DiffApplyEligibilityBlocker, DiffApplyEligibilityBlockerCode, DiffApplyModeEligibility, DiffApplyOperationReceipt, DiffApplyResult, DiffApplyReviewItem, DiffPayload, } from '../../../document-api/src/index.js';
34
34
  export type { DocumentMode } from '../core/types/index.js';
35
35
  export type { DocumentProtectionState } from '../../../document-api/src/index.js';
36
+ export { listPermissionRangeEditors, resolvePermissionRangeEditor } from '../../../document-api/src/index.js';
37
+ export type { PermissionRangeEditor, PermissionRangeEditorResolution, SetEditingRestrictionInput, } from '../../../document-api/src/index.js';
36
38
  export type { EntityAddress } from '../../../document-api/src/index.js';
37
39
  export type { EditorSurface } from '../core/types/index.js';
38
40
  export type { EditorTransactionEvent } from '../core/types/index.js';