superdoc 2.24.0-next.10 → 2.24.0-next.12

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 (29) hide show
  1. package/dist/collaboration-upgrade-engine.cjs +1 -1
  2. package/dist/collaboration-upgrade-engine.es.js +1 -1
  3. package/dist/document-api/src/contract/command-catalog.d.ts +1 -1
  4. package/dist/document-api/src/contract/operation-definitions.d.ts +19 -1
  5. package/dist/document-api/src/get/get.d.ts +2 -1
  6. package/dist/document-api/src/index.d.ts +9 -6
  7. package/dist/document-api/src/inline-semantics/token-sets.d.ts +11 -0
  8. package/dist/document-api/src/styles/apply.d.ts +5 -0
  9. package/dist/document-api/src/styles/catalog.d.ts +40 -19
  10. package/dist/document-api/src/styles/create.d.ts +160 -0
  11. package/dist/document-api/src/styles/index.d.ts +8 -4
  12. package/dist/document-api/src/styles/registry.d.ts +34 -2
  13. package/dist/document-api/src/styles/schema.d.ts +24 -5
  14. package/dist/document-api/src/styles/theme.d.ts +32 -0
  15. package/dist/document-api/src/styles/validation.d.ts +11 -2
  16. package/dist/document-api/src/templates/apply.d.ts +13 -15
  17. package/dist/document-api/src/types/fragment.d.ts +3 -0
  18. package/dist/document-api/src/types/query-match.types.d.ts +43 -5
  19. package/dist/document-api/src/types/sd-props.d.ts +54 -14
  20. package/dist/document-api/src/types/sd-styles.d.ts +58 -3
  21. package/dist/style.css +22 -22
  22. package/dist/style.layered.css +22 -22
  23. package/dist/superdoc/src/core/editor-runtime/v2/v2-session-shortcut-routes.d.ts +2 -0
  24. package/dist/superdoc.cjs +11 -8
  25. package/dist/superdoc.es.js +11 -8
  26. package/dist-cdn/style.layered.css +1 -1
  27. package/dist-cdn/superdoc.min.css +1 -1
  28. package/dist-cdn/superdoc.min.js +18 -18
  29. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- import { ValueSchema, StylesChannel } from './registry.js';
1
+ import { ValueSchema, StylesChannel, StylesScope } from './registry.js';
2
2
  /**
3
3
  * Validates a value against a ValueSchema AST node.
4
4
  *
@@ -35,4 +35,13 @@ export type PatchKeyClassification = {
35
35
  * nesting conditionals across excluded-key maps, allowed-key sets, and
36
36
  * cross-channel lookups.
37
37
  */
38
- export declare function classifyPatchKey(key: string, channel: StylesChannel): PatchKeyClassification;
38
+ export declare function classifyPatchKey(key: string, channel: StylesChannel, scope?: StylesScope): PatchKeyClassification;
39
+ /**
40
+ * Validates the keys and values of a patch object against one channel.
41
+ *
42
+ * Shared by `styles.apply` (scope `docDefaults`) and `styles.create` (scope
43
+ * `style`); `field` names the caller's own input path so the error points at
44
+ * `patch` or at `run` / `paragraph` rather than at whichever one happened to
45
+ * write this code.
46
+ */
47
+ export declare function validatePatchObject(patch: Record<string, unknown>, channel: StylesChannel, scope: StylesScope, field: string): void;
@@ -3,19 +3,17 @@
3
3
  *
4
4
  * Adopts a source DOCX's template **style system and reusable template assets**
5
5
  * onto the currently open document while preserving the open document's
6
- * body/story content (`word/document.xml` is never replaced). This is template
7
- * adoption, not a blind substrate transplant. The adoption semantics are:
6
+ * body/story content. Source body content is never copied; `word/document.xml`
7
+ * is rewritten only to adopt section defaults. The adoption semantics are:
8
8
  *
9
9
  * - `styles`: source-authoritative overlap. For a `styleId` defined in both
10
10
  * documents the source definition wins **in place** under the original id
11
11
  * (no `*-tmpl` rename). The source `w:docDefaults` and `w:latentStyles`
12
- * singletons replace the target's. Source-only styles are imported; target-only
13
- * styles still required by preserved content are retained.
14
- * - `numbering`: reconciled as a dependency graph (not a flat append / blind
15
- * replace). The `w:num`/`w:abstractNum` graph required by imported
16
- * numbering-bearing styles is imported, colliding ids are remapped
17
- * deterministically, and references are rewritten coherently in both
18
- * `numbering.xml` and `styles.xml`.
12
+ * singletons replace the target's. Source-only styles are imported; all
13
+ * target-only styles are retained.
14
+ * - `numbering`: every source `w:abstractNum`/`w:num` is appended. Colliding
15
+ * ids are remapped deterministically, and imported styles are rewritten to
16
+ * the remapped ids. Re-applying the same source appends the definitions again.
19
17
  * - `settings`: bounded reconciliation — layout/style-affecting settings (e.g.
20
18
  * default tab stop) are adopted; identity/workflow settings (`rsid*`, `docId`,
21
19
  * protection/revision state, `attachedTemplate`) are preserved.
@@ -24,7 +22,8 @@
24
22
  * imported as reusable template assets (even ones the page-1 governing
25
23
  * section does not reference), together with their `.rels` and transitive
26
24
  * media closure; colliding part names / relationship ids / media names are
27
- * reallocated and references rewritten consistently.
25
+ * reallocated and references rewritten consistently. Re-applying the same
26
+ * source imports the parts again under new names.
28
27
  * - `sectionDefaults`: the source `w:sectPr` that governs page 1 is adopted as
29
28
  * the current document's active/final section-default model. On multi-section
30
29
  * targets, its header/footer visibility model (`headerReference`,
@@ -32,11 +31,10 @@
32
31
  * sections without overwriting their own page geometry. Intermediate / later
33
32
  * source sections are not imported.
34
33
  *
35
- * Selected non-body package sidecars (`customXml`, `docProps/custom.xml`,
36
- * comments, notes, people, keymap customizations, and `settings.xml.rels`) are
37
- * imported when present so reconstructed content can reuse the source package
38
- * substrate faithfully. Source body content, glossary, signatures, embeddings,
39
- * and body media remain out of scope and are reported, never applied.
34
+ * Other source parts are never applied. `customXml` is reported as an
35
+ * out-of-scope skipped scope. `customXml`, `docProps`, comments, notes, people,
36
+ * glossary, signatures, embeddings, and body media are reported in
37
+ * `unsupportedItems`.
40
38
  *
41
39
  * Engine-agnostic contract + execution entry point. No ProseMirror/converter imports.
42
40
  */
@@ -2,6 +2,7 @@ import { SDContentNode } from './sd-nodes.js';
2
2
  import { SDStyles, SDDocDefaults, SDTheme } from './sd-styles.js';
3
3
  import { SDNumberingCatalog, SDSection, SDReferenceCatalogs, SDAnnotations } from './sd-sections.js';
4
4
  import { SDDocumentMeta } from './sd-props.js';
5
+ import { SDDiagnostic } from './sd-contract.js';
5
6
  /** Structural content payload for insert and replace operations. */
6
7
  export type SDFragment = SDContentNode | SDContentNode[];
7
8
  export interface SDDocument {
@@ -15,6 +16,8 @@ export interface SDDocument {
15
16
  referenceCatalogs?: SDReferenceCatalogs;
16
17
  annotations?: SDAnnotations;
17
18
  metadata?: SDDocumentMeta;
19
+ /** Missing, malformed or fallback package parts, and read options not honored yet. */
20
+ diagnostics?: SDDiagnostic[];
18
21
  }
19
22
  export declare const SD_CONTENT_NODE_KINDS: readonly ["paragraph", "heading", "list", "table", "toc", "index", "bibliography", "tableOfAuthorities", "break", "horizontalRule", "sectionBreak", "sectPr", "image", "drawing", "sdt", "customXml", "altChunk", "math", "field"];
20
23
  export type SDContentNodeKind = (typeof SD_CONTENT_NODE_KINDS)[number];
@@ -4,6 +4,7 @@ import { TextSelector, NodeSelector } from './query.js';
4
4
  import { DiscoveryItem, DiscoveryResult } from './discovery.js';
5
5
  import { InlineToggleDirective } from './style-policy.types.js';
6
6
  import { StoryLocator } from './story.types.js';
7
+ import { StyleCatalogPreviewSources } from '../styles/catalog.js';
7
8
  export type CardinalityRequirement = 'any' | 'first' | 'exactlyOne' | 'all';
8
9
  /** Maximum total length for a match snippet (D11). */
9
10
  export declare const SNIPPET_MAX_LENGTH = 500;
@@ -27,12 +28,32 @@ export interface MatchDirectStyles {
27
28
  underline: InlineToggleDirective;
28
29
  strike: InlineToggleDirective;
29
30
  }
30
- /** Effective visual states: what the user sees after style cascade resolution. */
31
+ /**
32
+ * Where an effective font or color came from: set as a literal value, or a
33
+ * theme reference (with tint/shade). Same vocabulary as catalog preview sources.
34
+ */
35
+ export type MatchEffectiveSources = StyleCatalogPreviewSources;
36
+ /**
37
+ * Effective visual states: what the user sees after style cascade resolution
38
+ * (direct run formatting, character style, paragraph style chain, table style,
39
+ * document defaults, theme). The optional values are present when the cascade
40
+ * resolved them; `meta.effectiveResolved` says whether it ran.
41
+ */
31
42
  export interface MatchEffectiveStyles {
32
43
  bold: boolean;
33
44
  italic: boolean;
34
45
  underline: boolean;
35
46
  strike: boolean;
47
+ /** 6-digit lowercase hex with `#` prefix. Theme colors are resolved, tint/shade applied. */
48
+ color?: string;
49
+ /** 6-digit lowercase hex with `#` prefix. */
50
+ highlight?: string;
51
+ /** Latin-track font family. Theme fonts are resolved to the theme's typeface. */
52
+ fontFamily?: string;
53
+ /** Font size in points, rounded to 1 decimal place. */
54
+ fontSizePt?: number;
55
+ /** Origin of `fontFamily` and `color`. A value without a source is absent. */
56
+ sources?: MatchEffectiveSources;
36
57
  }
37
58
  /**
38
59
  * Two-layer inline style state for a single run.
@@ -171,16 +192,33 @@ export type QueryMatchItem = DiscoveryItem<QueryMatchDomain>;
171
192
  export type TextMatchItem = DiscoveryItem<TextMatchDomain>;
172
193
  /** Node match item (blocks.length === 0). */
173
194
  export type NodeMatchItem = DiscoveryItem<NodeMatchDomain>;
195
+ /**
196
+ * Why `styles.effective` could not be fully resolved for a match result.
197
+ *
198
+ * - `tracked-view-unresolved`: tracked-view matches (`includeDeletedText`) are not cascade-resolved.
199
+ * - `theme-fallback`: a theme font or color came from the default Office theme because the
200
+ * document's theme part or color scheme is missing or unreadable.
201
+ * - `style-parts-unavailable`: the document's style parts were not loaded, so styles were not applied.
202
+ * - `run-projection-unavailable`: the matched text could not be split into runs.
203
+ */
204
+ export type QueryMatchDiagnosticCode = 'tracked-view-unresolved' | 'theme-fallback' | 'style-parts-unavailable' | 'run-projection-unavailable';
205
+ export interface QueryMatchDiagnostic {
206
+ code: QueryMatchDiagnosticCode;
207
+ message: string;
208
+ }
174
209
  /**
175
210
  * Metadata for `query.match`: always present on the output envelope.
176
211
  *
177
- * - `effectiveResolved: true`: converter context was available; `styles.effective`
178
- * on every run reflects full cascade resolution.
179
- * - `effectiveResolved: false`: converter context was unavailable (headless/non-DOCX);
180
- * `styles.effective` is derived from `direct` only.
212
+ * - `effectiveResolved: true`: `styles.effective` on every run reflects full
213
+ * style cascade and theme resolution.
214
+ * - `effectiveResolved: false`: at least one run was not fully resolved, or the
215
+ * engine derives `styles.effective` from `direct` only. `diagnostics`, when
216
+ * present, says why.
181
217
  */
182
218
  export interface QueryMatchMeta {
183
219
  effectiveResolved: boolean;
220
+ /** Reasons the result is not fully resolved. Absent when there are none. */
221
+ diagnostics?: QueryMatchDiagnostic[];
184
222
  }
185
223
  export interface QueryMatchInput {
186
224
  /** Selector for query.match. Text selectors may opt into deleted tracked text via `includeDeletedText`. */
@@ -1,10 +1,4 @@
1
- /**
2
- * SDM/1 property models: run, paragraph, table, list, image, drawing props.
3
- *
4
- * These define the direct formatting ("authored") property bags carried by
5
- * style-bearing nodes. Resolved/provenance fields are separate concerns
6
- * populated at read time by the style-engine.
7
- */
1
+ import { ST_HIGHLIGHT_VALUES } from '../inline-semantics/token-sets.js';
8
2
  export type SDThemeFontRef = 'majorAscii' | 'majorHAnsi' | 'majorEastAsia' | 'majorBidi' | 'minorAscii' | 'minorHAnsi' | 'minorEastAsia' | 'minorBidi';
9
3
  export interface SDRunFonts {
10
4
  ascii?: string;
@@ -34,7 +28,7 @@ export type SDColorRef = {
34
28
  } | {
35
29
  model: 'auto';
36
30
  };
37
- export type SDHighlightColor = 'black' | 'blue' | 'cyan' | 'green' | 'magenta' | 'red' | 'yellow' | 'white' | 'darkBlue' | 'darkCyan' | 'darkGreen' | 'darkMagenta' | 'darkRed' | 'darkYellow' | 'darkGray' | 'lightGray' | 'none';
31
+ export type SDHighlightColor = (typeof ST_HIGHLIGHT_VALUES)[number];
38
32
  export type SDUnderlineStyle = 'none' | 'single' | 'words' | 'double' | 'thick' | 'dotted' | 'dottedHeavy' | 'dash' | 'dashedHeavy' | 'dashLong' | 'dashLongHeavy' | 'dotDash' | 'dashDotHeavy' | 'dotDotDash' | 'dashDotDotHeavy' | 'wave' | 'wavyHeavy' | 'wavyDouble';
39
33
  export interface SDUnderline {
40
34
  style?: SDUnderlineStyle;
@@ -47,7 +41,9 @@ export interface SDShading {
47
41
  }
48
42
  export interface SDRunBorder {
49
43
  style?: string;
44
+ /** Line width in points. */
50
45
  width?: number;
46
+ /** Spacing from the content in points. */
51
47
  space?: number;
52
48
  color?: SDColorRef;
53
49
  frame?: boolean;
@@ -186,10 +182,31 @@ export type SDTableWidth = {
186
182
  } | {
187
183
  kind: 'none';
188
184
  };
185
+ /** Table border lines; `width` and `space` in points. */
186
+ export interface SDTableBorders {
187
+ top?: SDRunBorder;
188
+ right?: SDRunBorder;
189
+ bottom?: SDRunBorder;
190
+ left?: SDRunBorder;
191
+ start?: SDRunBorder;
192
+ end?: SDRunBorder;
193
+ insideH?: SDRunBorder;
194
+ insideV?: SDRunBorder;
195
+ }
196
+ /** Cell padding in points. */
197
+ export interface SDCellPadding {
198
+ top?: number;
199
+ right?: number;
200
+ bottom?: number;
201
+ left?: number;
202
+ start?: number;
203
+ end?: number;
204
+ }
189
205
  export interface SDTableProps {
190
206
  width?: SDTableWidth;
191
207
  layout?: 'fixed' | 'autofit';
192
208
  alignment?: 'left' | 'center' | 'right' | 'inside' | 'outside';
209
+ /** Normalized CSS-like edge borders retained for document and fragment compatibility. */
193
210
  borders?: {
194
211
  top?: string;
195
212
  right?: string;
@@ -198,28 +215,51 @@ export interface SDTableProps {
198
215
  insideH?: string;
199
216
  insideV?: string;
200
217
  };
218
+ /** Leading-edge indent in points. */
219
+ indent?: number;
220
+ /** Spacing between cells in points. */
221
+ cellSpacing?: number;
222
+ /** Default cell padding in points. */
223
+ cellPadding?: SDCellPadding;
224
+ shading?: SDShading;
225
+ /** Right-to-left visual column order (`w:bidiVisual`). */
226
+ bidiVisual?: boolean;
227
+ }
228
+ /** Table formatting authored on a table style. Borders are structured lines, not strings. */
229
+ export interface SDTableStyleProps extends Omit<SDTableProps, 'borders'> {
230
+ borders?: SDTableBorders;
201
231
  }
202
232
  export interface SDRowProps {
203
233
  /** Minimum row height in points. */
204
234
  minHeight?: number;
205
235
  cantSplit?: boolean;
236
+ /** Repeat this row as a header row on each page (`w:tblHeader`). */
237
+ repeatHeader?: boolean;
238
+ }
239
+ /** Cell border lines; `width` and `space` in points. */
240
+ export interface SDCellBorders extends SDTableBorders {
241
+ /** Diagonal from top-left to bottom-right. */
242
+ tl2br?: SDRunBorder;
243
+ /** Diagonal from top-right to bottom-left. */
244
+ tr2bl?: SDRunBorder;
206
245
  }
207
246
  export interface SDCellProps {
208
247
  verticalAlign?: 'top' | 'center' | 'bottom';
209
248
  shading?: SDColorRef;
210
249
  /** Cell padding in points. */
211
- padding?: {
212
- top?: number;
213
- right?: number;
214
- bottom?: number;
215
- left?: number;
216
- };
250
+ padding?: SDCellPadding;
251
+ /** Normalized CSS-like edge borders, such as `'single 1pt #000000'` or `'none'`. */
217
252
  borders?: {
218
253
  top?: string;
219
254
  right?: string;
220
255
  bottom?: string;
221
256
  left?: string;
222
257
  };
258
+ noWrap?: boolean;
259
+ }
260
+ /** Cell formatting authored on a table style. Borders are structured lines, not strings. */
261
+ export interface SDTableStyleCellProps extends Omit<SDCellProps, 'borders'> {
262
+ borders?: SDCellBorders;
223
263
  }
224
264
  export interface SDImageProps {
225
265
  alignment?: 'left' | 'center' | 'right';
@@ -1,20 +1,69 @@
1
- import { SDRunProps, SDParagraphProps, SDTableProps, SDThemeColorName } from './sd-props.js';
1
+ import { SDParagraphProps, SDRowProps, SDRunProps, SDTableProps, SDTableStyleProps, SDTableStyleCellProps, SDThemeColorName } from './sd-props.js';
2
+ import { SDResolvedProvenance } from './sd-objects.js';
2
3
  export interface SDStyleBase<TProps> {
3
4
  name?: string;
4
5
  basedOn?: string;
5
6
  next?: string;
6
7
  linked?: string;
8
+ /** Properties authored on this style, with theme references left raw. */
7
9
  props?: TProps;
10
+ /** Cascaded values (basedOn chain, docDefaults, theme). Present with `includeResolved`. */
11
+ resolved?: Partial<TProps>;
12
+ /** Where each resolved value came from. Present with `includeProvenance`. */
13
+ provenance?: SDResolvedProvenance<TProps>;
14
+ }
15
+ export interface SDParagraphStyleDef extends SDStyleBase<SDParagraphProps> {
16
+ /** Run properties authored on this paragraph style (`w:rPr`). */
17
+ runProps?: SDRunProps;
18
+ /** Cascaded run values for text in this paragraph style. Present with `includeResolved`. */
19
+ resolvedRun?: Partial<SDRunProps>;
20
+ /** Where each resolved run value came from. Present with `includeProvenance`. */
21
+ runProvenance?: SDResolvedProvenance<SDRunProps>;
8
22
  }
9
- export type SDParagraphStyleDef = SDStyleBase<SDParagraphProps>;
10
23
  export type SDCharacterStyleDef = SDStyleBase<SDRunProps>;
11
- export type SDTableStyleDef = SDStyleBase<SDTableProps>;
24
+ /** Table regions that a table style can format conditionally (`w:tblStylePr/@w:type`). */
25
+ export type SDTableStyleRegion = 'wholeTable' | 'firstRow' | 'lastRow' | 'firstCol' | 'lastCol' | 'band1Vert' | 'band2Vert' | 'band1Horz' | 'band2Horz' | 'neCell' | 'nwCell' | 'seCell' | 'swCell';
26
+ /** Formatting a table style applies to one region, as authored. */
27
+ export interface SDTableStyleFormatting {
28
+ table?: SDTableStyleProps;
29
+ row?: SDRowProps;
30
+ cell?: SDTableStyleCellProps;
31
+ paragraph?: SDParagraphProps;
32
+ run?: SDRunProps;
33
+ }
34
+ export interface SDTableStyleDef extends SDStyleBase<SDTableStyleProps> {
35
+ /** Row defaults (`w:trPr`). */
36
+ rowProps?: SDRowProps;
37
+ /** Cell defaults (`w:tcPr`). */
38
+ cellProps?: SDTableStyleCellProps;
39
+ /** Paragraph formatting for text in the table (`w:pPr`). */
40
+ paragraphProps?: SDParagraphProps;
41
+ /** Run formatting for text in the table (`w:rPr`). */
42
+ runProps?: SDRunProps;
43
+ /**
44
+ * Conditional formatting per table region (`w:tblStylePr`), as authored.
45
+ * `resolved` / `provenance` cover table-level props only; regions are not cascaded.
46
+ */
47
+ conditional?: Partial<Record<SDTableStyleRegion, SDTableStyleFormatting>>;
48
+ /** Rows per horizontal band (`w:tblStyleRowBandSize`). */
49
+ rowBandSize?: number;
50
+ /** Columns per vertical band (`w:tblStyleColBandSize`). */
51
+ columnBandSize?: number;
52
+ }
12
53
  export interface SDStyles {
13
54
  paragraph?: Record<string, SDParagraphStyleDef>;
14
55
  character?: Record<string, SDCharacterStyleDef>;
15
56
  table?: Record<string, SDTableStyleDef>;
16
57
  }
58
+ /** Theme color roles that `w:clrSchemeMapping` maps onto theme color slots. */
59
+ export type SDThemeColorRole = 'bg1' | 't1' | 'bg2' | 't2' | 'accent1' | 'accent2' | 'accent3' | 'accent4' | 'accent5' | 'accent6' | 'hyperlink' | 'followedHyperlink';
17
60
  export interface SDTheme {
61
+ /**
62
+ * `document` when read from the package theme part; `fallback` when the part is
63
+ * missing or unreadable and the default Office theme stands in (see diagnostics).
64
+ */
65
+ source?: 'document' | 'fallback';
66
+ /** Six-digit hex colors without `#`, matching `SDColorRef` rgb values. */
18
67
  colorScheme: Record<SDThemeColorName, string>;
19
68
  fontScheme?: {
20
69
  major?: {
@@ -28,9 +77,15 @@ export interface SDTheme {
28
77
  complexScript?: string;
29
78
  };
30
79
  };
80
+ /** From `w:settings/w:clrSchemeMapping`; absent when the document declares none. */
81
+ colorSchemeMapping?: Partial<Record<SDThemeColorRole, SDThemeColorName>>;
31
82
  }
32
83
  export interface SDDocDefaults {
33
84
  run?: SDRunProps;
34
85
  paragraph?: SDParagraphProps;
35
86
  table?: SDTableProps;
87
+ /** `run` with theme references resolved. Present with `includeResolved`. */
88
+ resolvedRun?: Partial<SDRunProps>;
89
+ /** `paragraph` with theme references resolved. Present with `includeResolved`. */
90
+ resolvedParagraph?: Partial<SDParagraphProps>;
36
91
  }
package/dist/style.css CHANGED
@@ -2348,34 +2348,34 @@ img[data-v-c95b2073] {
2348
2348
  pointer-events: auto;
2349
2349
  }
2350
2350
 
2351
- .superdoc[data-v-f53aafe0] {
2351
+ .superdoc[data-v-38ecd481] {
2352
2352
  display: flex;
2353
2353
  position: relative;
2354
2354
  }
2355
- .right-sidebar[data-v-f53aafe0] {
2355
+ .right-sidebar[data-v-38ecd481] {
2356
2356
  min-width: 320px;
2357
2357
  height: 100%;
2358
2358
  }
2359
- .floating-comments[data-v-f53aafe0] {
2359
+ .floating-comments[data-v-38ecd481] {
2360
2360
  min-width: 300px;
2361
2361
  width: 300px;
2362
2362
  height: 100%;
2363
2363
  overflow: visible;
2364
2364
  }
2365
- .superdoc__layers[data-v-f53aafe0] {
2365
+ .superdoc__layers[data-v-38ecd481] {
2366
2366
  height: 100%;
2367
2367
  position: relative;
2368
2368
  box-sizing: border-box;
2369
2369
  }
2370
- .superdoc__document[data-v-f53aafe0] {
2370
+ .superdoc__document[data-v-38ecd481] {
2371
2371
  width: 100%;
2372
2372
  position: relative;
2373
2373
  }
2374
- .superdoc__sub-document[data-v-f53aafe0] {
2374
+ .superdoc__sub-document[data-v-38ecd481] {
2375
2375
  width: 100%;
2376
2376
  position: relative;
2377
2377
  }
2378
- .superdoc__selection-layer[data-v-f53aafe0] {
2378
+ .superdoc__selection-layer[data-v-38ecd481] {
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-f53aafe0] {
2389
+ .superdoc__whiteboard-layer[data-v-38ecd481] {
2390
2390
  z-index: 4;
2391
2391
  }
2392
- .superdoc__temp-selection[data-v-f53aafe0] {
2392
+ .superdoc__temp-selection[data-v-38ecd481] {
2393
2393
  position: absolute;
2394
2394
  }
2395
- .superdoc__right-sidebar[data-v-f53aafe0] {
2395
+ .superdoc__right-sidebar[data-v-38ecd481] {
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-f53aafe0] {
2403
+ .superdoc__compact-comment-popover[data-v-38ecd481] {
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-f53aafe0] {
2412
+ .tools[data-v-38ecd481] {
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-f53aafe0] {
2419
+ .tools-item[data-v-38ecd481] {
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-f53aafe0] {
2430
+ .tools-item i[data-v-38ecd481] {
2431
2431
  cursor: pointer;
2432
2432
  }
2433
- .superdoc__tools-icon[data-v-f53aafe0] {
2433
+ .superdoc__tools-icon[data-v-38ecd481] {
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-f53aafe0] {
2448
+ .superdoc .superdoc__layers[data-v-38ecd481] {
2449
2449
  margin: 0;
2450
2450
  border: 0 !important;
2451
2451
  box-shadow: none;
2452
2452
  }
2453
- .superdoc__sub-document[data-v-f53aafe0] {
2453
+ .superdoc__sub-document[data-v-38ecd481] {
2454
2454
  max-width: 100%;
2455
2455
  }
2456
- .superdoc__right-sidebar[data-v-f53aafe0] {
2456
+ .superdoc__right-sidebar[data-v-38ecd481] {
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-f53aafe0] {
2463
+ .ai-writer-container[data-v-38ecd481] {
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-f53aafe0] {
2479
+ .ai-tool > svg[data-v-38ecd481] {
2480
2480
  fill: transparent;
2481
2481
  }
2482
- .ai-tool[data-v-f53aafe0]::before {
2482
+ .ai-tool[data-v-38ecd481]::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-f53aafe0]:hover::before {
2503
+ .ai-tool[data-v-38ecd481]:hover::before {
2504
2504
  filter: brightness(1.3);
2505
2505
  }
2506
2506
 
@@ -2348,34 +2348,34 @@ img[data-v-c95b2073] {
2348
2348
  pointer-events: auto;
2349
2349
  }
2350
2350
 
2351
- .superdoc[data-v-f53aafe0] {
2351
+ .superdoc[data-v-38ecd481] {
2352
2352
  display: flex;
2353
2353
  position: relative;
2354
2354
  }
2355
- .right-sidebar[data-v-f53aafe0] {
2355
+ .right-sidebar[data-v-38ecd481] {
2356
2356
  min-width: 320px;
2357
2357
  height: 100%;
2358
2358
  }
2359
- .floating-comments[data-v-f53aafe0] {
2359
+ .floating-comments[data-v-38ecd481] {
2360
2360
  min-width: 300px;
2361
2361
  width: 300px;
2362
2362
  height: 100%;
2363
2363
  overflow: visible;
2364
2364
  }
2365
- .superdoc__layers[data-v-f53aafe0] {
2365
+ .superdoc__layers[data-v-38ecd481] {
2366
2366
  height: 100%;
2367
2367
  position: relative;
2368
2368
  box-sizing: border-box;
2369
2369
  }
2370
- .superdoc__document[data-v-f53aafe0] {
2370
+ .superdoc__document[data-v-38ecd481] {
2371
2371
  width: 100%;
2372
2372
  position: relative;
2373
2373
  }
2374
- .superdoc__sub-document[data-v-f53aafe0] {
2374
+ .superdoc__sub-document[data-v-38ecd481] {
2375
2375
  width: 100%;
2376
2376
  position: relative;
2377
2377
  }
2378
- .superdoc__selection-layer[data-v-f53aafe0] {
2378
+ .superdoc__selection-layer[data-v-38ecd481] {
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-f53aafe0] {
2389
+ .superdoc__whiteboard-layer[data-v-38ecd481] {
2390
2390
  z-index: 4;
2391
2391
  }
2392
- .superdoc__temp-selection[data-v-f53aafe0] {
2392
+ .superdoc__temp-selection[data-v-38ecd481] {
2393
2393
  position: absolute;
2394
2394
  }
2395
- .superdoc__right-sidebar[data-v-f53aafe0] {
2395
+ .superdoc__right-sidebar[data-v-38ecd481] {
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-f53aafe0] {
2403
+ .superdoc__compact-comment-popover[data-v-38ecd481] {
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-f53aafe0] {
2412
+ .tools[data-v-38ecd481] {
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-f53aafe0] {
2419
+ .tools-item[data-v-38ecd481] {
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-f53aafe0] {
2430
+ .tools-item i[data-v-38ecd481] {
2431
2431
  cursor: pointer;
2432
2432
  }
2433
- .superdoc__tools-icon[data-v-f53aafe0] {
2433
+ .superdoc__tools-icon[data-v-38ecd481] {
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-f53aafe0] {
2448
+ .superdoc .superdoc__layers[data-v-38ecd481] {
2449
2449
  margin: 0;
2450
2450
  border: 0 !important;
2451
2451
  box-shadow: none;
2452
2452
  }
2453
- .superdoc__sub-document[data-v-f53aafe0] {
2453
+ .superdoc__sub-document[data-v-38ecd481] {
2454
2454
  max-width: 100%;
2455
2455
  }
2456
- .superdoc__right-sidebar[data-v-f53aafe0] {
2456
+ .superdoc__right-sidebar[data-v-38ecd481] {
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-f53aafe0] {
2463
+ .ai-writer-container[data-v-38ecd481] {
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-f53aafe0] {
2479
+ .ai-tool > svg[data-v-38ecd481] {
2480
2480
  fill: transparent;
2481
2481
  }
2482
- .ai-tool[data-v-f53aafe0]::before {
2482
+ .ai-tool[data-v-38ecd481]::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-f53aafe0]:hover::before {
2503
+ .ai-tool[data-v-38ecd481]:hover::before {
2504
2504
  filter: brightness(1.3);
2505
2505
  }
2506
2506