superdoc 2.0.0-next.27 → 2.0.0-next.28

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 (32) hide show
  1. package/dist/chunks/{create-super-doc-ui-Dvl3EZsv.es.js → create-super-doc-ui-BlnUCtrx.es.js} +171 -51
  2. package/dist/chunks/{create-super-doc-ui-pYMthdDn.cjs → create-super-doc-ui-CZBUMdjl.cjs} +171 -51
  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/contract/operation-definitions.d.ts +1 -1
  6. package/dist/document-api/src/track-changes/track-changes.d.ts +6 -2
  7. package/dist/document-api/src/types/clipboard.d.ts +5 -1
  8. package/dist/document-api/src/types/table-operations.types.d.ts +6 -4
  9. package/dist/document-api/src/types/track-changes.types.d.ts +15 -0
  10. package/dist/layout-engine/contracts/src/incremental-dependency.d.ts +10 -0
  11. package/dist/layout-engine/contracts/src/index.d.ts +38 -0
  12. package/dist/layout-engine/layout-bridge/src/incrementalLayout.d.ts +23 -1
  13. package/dist/layout-engine/layout-engine/src/index.d.ts +17 -0
  14. package/dist/layout-engine/layout-engine/src/paginator.d.ts +16 -0
  15. package/dist/layout-engine/layout-engine/src/paragraph-layout-eligibility.d.ts +1 -4
  16. package/dist/public/ui-react.cjs +1 -1
  17. package/dist/public/ui-react.es.js +1 -1
  18. package/dist/public/ui.cjs +1 -1
  19. package/dist/public/ui.es.js +1 -1
  20. package/dist/style.css +82 -63
  21. package/dist/style.layered.css +82 -63
  22. package/dist/superdoc/src/core/types/index.d.ts +7 -0
  23. package/dist/superdoc/src/public/ui/reasons.d.ts +8 -0
  24. package/dist/superdoc/src/stores/comments-store.d.ts +9 -9
  25. package/dist/superdoc/src/stores/helpers/floating-comment-instances.d.ts +2 -10
  26. package/dist/superdoc/src/stores/superdoc-store.d.ts +27 -27
  27. package/dist/superdoc.cjs +137 -29
  28. package/dist/superdoc.es.js +137 -29
  29. package/dist-cdn/style.layered.css +1 -1
  30. package/dist-cdn/superdoc.min.css +1 -1
  31. package/dist-cdn/superdoc.min.js +37 -37
  32. package/package.json +1 -1
@@ -1749,6 +1749,11 @@ export type ListBlock = {
1749
1749
  sourceAnchor?: SourceAnchor;
1750
1750
  };
1751
1751
  export type FlowBlock = ParagraphBlock | ImageBlock | DrawingBlock | ListBlock | TableBlock | SectionBreakBlock | PageBreakBlock | ColumnBreakBlock;
1752
+ export declare const isReviewableSectionBoundaryMarkerBlock: (block: FlowBlock | null | undefined) => boolean;
1753
+ /** Shared eligibility for paragraphs the layout loop deliberately omits. */
1754
+ export declare const shouldSkipParagraphDuringLayout: (blocks: FlowBlock[], index: number) => boolean;
1755
+ /** True only for block kinds that produce an addressable layout fragment. */
1756
+ export declare const doesFlowBlockProduceLayoutFragment: (blocks: FlowBlock[], index: number) => boolean;
1752
1757
  export type ColumnLayout = {
1753
1758
  count: number;
1754
1759
  gap: number;
@@ -2355,6 +2360,36 @@ export type HeaderFooterLayout = {
2355
2360
  renderHeight?: number;
2356
2361
  pages: HeaderFooterPage[];
2357
2362
  };
2363
+ /**
2364
+ * Engine-owned paginator state immediately before a top-level paragraph.
2365
+ * Incremental layout may resume from this state only after independently
2366
+ * proving that every preceding fragment on the page is stable.
2367
+ */
2368
+ export type LayoutBlockResumeCheckpoint = {
2369
+ blockId: BlockId;
2370
+ pageIndex: number;
2371
+ prefixFragmentCount: number;
2372
+ cursorY: number;
2373
+ maxCursorY: number;
2374
+ columnIndex: number;
2375
+ trailingSpacing: number;
2376
+ lastParagraphStyleId?: string;
2377
+ lastParagraphContextualSpacing: boolean;
2378
+ lastParagraphBorderHash?: string;
2379
+ constraintBoundaries: readonly {
2380
+ y: number;
2381
+ columns: ColumnLayout;
2382
+ }[];
2383
+ activeConstraintIndex: number;
2384
+ footnoteDemandThisPage: number;
2385
+ footnoteRefsThisPage: number;
2386
+ footnoteAnchorsThisPage: readonly {
2387
+ pmPos: number;
2388
+ refId: string;
2389
+ fullHeight: number;
2390
+ firstLineHeight: number;
2391
+ }[];
2392
+ };
2358
2393
  /** Final layout output ready for painting. */
2359
2394
  export type Layout = {
2360
2395
  pageSize: {
@@ -2380,6 +2415,8 @@ export type Layout = {
2380
2415
  * from DOM-derived positions back to the current ProseMirror document state.
2381
2416
  */
2382
2417
  layoutEpoch?: number;
2418
+ /** Exact paragraph-boundary resume sidecar; never inferred from painted geometry. */
2419
+ blockResumeCheckpoints?: ReadonlyMap<BlockId, LayoutBlockResumeCheckpoint>;
2383
2420
  };
2384
2421
  export type WrapTextMode = 'bothSides' | 'left' | 'right' | 'largest';
2385
2422
  export type WrapExclusion = {
@@ -2402,4 +2439,5 @@ export declare const extractHeaderFooterSpace: (margins?: PageMargins | null) =>
2402
2439
  export type { ResolvedLayout, ResolvedPage, ResolvedPaintItem, ResolvedGroupItem, ResolvedFragmentItem, ResolvedParagraphContent, ResolvedTextLineItem, ResolvedDropCapItem, ResolvedListMarkerItem, ResolvedTableItem, ResolvedImageItem, ResolvedDrawingItem, ResolvedHeaderFooterPage, ResolvedHeaderFooterLayout, } from './resolved-layout.js';
2403
2440
  export { isResolvedTableItem, isResolvedImageItem, isResolvedDrawingItem } from './resolved-layout.js';
2404
2441
  export { expandRunsForInlineNewlines, isEmptyInlineSdtPlaceholderRun, isEmptySdtPlaceholderRun, sliceRunsForLine, } from './run-helpers.js';
2442
+ export { PAGE_CHECKPOINT_DEPENDENCY_CLASSES, areValidPageCheckpointDependencyClasses, type PageCheckpointDependencyClass, } from './incremental-dependency.js';
2405
2443
  export * as Engines from './engines/index.js';
@@ -1,4 +1,4 @@
1
- import { FlowBlock, Layout, Measure, HeaderFooterLayout, ParagraphBlock, ParagraphMeasure } from '../../contracts/src/index.js';
1
+ import { PageCheckpointDependencyClass, FlowBlock, Layout, Measure, HeaderFooterLayout, ParagraphBlock, ParagraphMeasure } from '../../contracts/src/index.js';
2
2
  import { FontMeasureContext } from '../../../shared/font-system/src/index.js';
3
3
  import { LayoutOptions, HeaderFooterConstraints } from '../../layout-engine/src/index.js';
4
4
  import { computeDirtyRegions } from './diff.js';
@@ -33,10 +33,18 @@ export type HeaderFooterLayoutResult = {
33
33
  */
34
34
  export type FootnoteReserveSeed = {
35
35
  reserves: number[];
36
+ /** Sparse page indexes that held a reserve, ledger, or injected note slice. */
37
+ notePageIndexes?: number[];
36
38
  separatorSpacingBefore: number | undefined;
37
39
  fontSignature: string;
38
40
  measurementWidth: number;
39
41
  measurementHeight: number;
42
+ /** Exact note block objects retained by the host's authoritative note-bundle proof. */
43
+ noteBlocksByBlockId?: Map<string, FlowBlock>;
44
+ /** Measures paired with `noteBlocksByBlockId`; object identity is revalidated before reuse. */
45
+ noteMeasuresByBlockId?: Map<string, Measure>;
46
+ noteBodyHeightById?: Map<string, number>;
47
+ noteFirstLineHeightById?: Map<string, number>;
40
48
  };
41
49
  export type IncrementalLayoutResult = {
42
50
  layout: Layout;
@@ -165,6 +173,12 @@ type IncrementalPaginationProofBase = {
165
173
  blockIdsUnchanged: true;
166
174
  blockIdsUnique: true;
167
175
  renderInputsUnchanged: true;
176
+ /** The retained dependency scan proved that no body or furniture PAGE_REF token exists. */
177
+ pageReferencesAbsent: boolean;
178
+ pageReferenceDependencyClosure?: {
179
+ referenceBlockIds: readonly string[];
180
+ targetBookmarkIds: readonly string[];
181
+ };
168
182
  };
169
183
  export type IncrementalPaginationProof = IncrementalPaginationProofBase & ({
170
184
  profile: 'single-section-local-text';
@@ -181,6 +195,12 @@ export type IncrementalPaginationProof = IncrementalPaginationProofBase & ({
181
195
  profile: 'page-checkpoint-local-text';
182
196
  globalDependenciesAbsent: false;
183
197
  globalDependenciesFencedByPageCheckpoint: true;
198
+ admittedDependencyClasses: readonly PageCheckpointDependencyClass[];
199
+ localKeepDependencyClosure?: {
200
+ checkpointPageIndex: number;
201
+ checkpointBlockId: string | null;
202
+ predecessorBlockId: string | null;
203
+ };
184
204
  /**
185
205
  * SD-3772 D1: the host proved (via the shared
186
206
  * `hasGenuinelyUnequalExplicitColumnWidths` predicate) that no
@@ -269,6 +289,8 @@ export declare function incrementalLayout(previousBlocks: FlowBlock[], _previous
269
289
  previousFontSignature?: string;
270
290
  }, warmStart?: {
271
291
  footnoteReserveSeed?: FootnoteReserveSeed | null;
292
+ /** Host proved the authoritative note projection bundle was retained exactly. */
293
+ noteMeasurePlaneRetainedExact?: true;
272
294
  }, layoutReuse?: IncrementalLayoutReuseOptions, measureReuseProof?: IncrementalMeasureReuseProof, execution?: IncrementalLayoutExecutionControl): Promise<IncrementalLayoutResult>;
273
295
  /**
274
296
  * Normalizes a margin value, using a fallback for undefined or non-finite values.
@@ -1,4 +1,5 @@
1
1
  import { ColumnLayout, FlowBlock, HeaderFooterLayout, Layout, Measure, Page, ParagraphBlock, ParagraphMeasure, SectionMetadata, FlowMode, DocumentBackground } from '../../contracts/src/index.js';
2
+ import { PageState, ConstraintBoundary } from './paginator.js';
2
3
  type PageSize = {
3
4
  w: number;
4
5
  h: number;
@@ -197,6 +198,22 @@ export type LayoutOptions = {
197
198
  };
198
199
  /** Resolved active column layout at the resumed boundary. */
199
200
  activeColumns?: ColumnLayout;
201
+ /** Engine-authored exact state for a paragraph boundary inside the first emitted page. */
202
+ initialPageState?: {
203
+ prefixFragments: readonly Page['fragments'][number][];
204
+ cursorY: number;
205
+ maxCursorY: number;
206
+ columnIndex: number;
207
+ trailingSpacing: number;
208
+ lastParagraphStyleId?: string;
209
+ lastParagraphContextualSpacing: boolean;
210
+ lastParagraphBorderHash?: string;
211
+ constraintBoundaries: readonly ConstraintBoundary[];
212
+ activeConstraintIndex: number;
213
+ footnoteDemandThisPage: number;
214
+ footnoteRefsThisPage: number;
215
+ footnoteAnchorsThisPage: readonly PageState['footnoteAnchorsThisPage'][number][];
216
+ };
200
217
  };
201
218
  /**
202
219
  * Optional page-boundary stop callback. Called after a page has completed
@@ -73,6 +73,22 @@ export type PaginatorOptions = {
73
73
  h: number;
74
74
  };
75
75
  getActiveColumns(): ColumnLayout;
76
+ /** Exact first-page state from an engine-authored paragraph checkpoint. */
77
+ initialPageState?: {
78
+ prefixFragments: readonly Page['fragments'][number][];
79
+ cursorY: number;
80
+ maxCursorY: number;
81
+ columnIndex: number;
82
+ trailingSpacing: number;
83
+ lastParagraphStyleId?: string;
84
+ lastParagraphContextualSpacing: boolean;
85
+ lastParagraphBorderHash?: string;
86
+ constraintBoundaries: readonly ConstraintBoundary[];
87
+ activeConstraintIndex: number;
88
+ footnoteDemandThisPage: number;
89
+ footnoteRefsThisPage: number;
90
+ footnoteAnchorsThisPage: readonly PageState['footnoteAnchorsThisPage'][number][];
91
+ };
76
92
  pageNumberOffset?: number;
77
93
  createPage(number: number, pageMargins: PageMargins, pageSizeOverride?: {
78
94
  w: number;
@@ -1,4 +1 @@
1
- import { FlowBlock } from '../../contracts/src/index.js';
2
- export declare const isReviewableSectionBoundaryMarkerBlock: (block: FlowBlock | null | undefined) => boolean;
3
- /** Paragraphs omitted by the main layout loop must not receive anchored objects. */
4
- export declare const shouldSkipParagraphDuringLayout: (blocks: FlowBlock[], index: number) => boolean;
1
+ export { isReviewableSectionBoundaryMarkerBlock, shouldSkipParagraphDuringLayout } from '../../contracts/src/index.js';
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("../chunks/rolldown-runtime-_dR15c8t.cjs");
3
- const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-pYMthdDn.cjs");
3
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-CZBUMdjl.cjs");
4
4
  let react = require("react");
5
5
  var SuperDocUIContext = (0, react.createContext)(null);
6
6
  function SuperDocUIProvider(props) {
@@ -1,4 +1,4 @@
1
- import { t as createSuperDocUI } from "../chunks/create-super-doc-ui-Dvl3EZsv.es.js";
1
+ import { t as createSuperDocUI } from "../chunks/create-super-doc-ui-BlnUCtrx.es.js";
2
2
  import { createContext, createElement, useCallback, useContext, useEffect, useRef, useState } from "react";
3
3
  var SuperDocUIContext = createContext(null);
4
4
  function SuperDocUIProvider(props) {
@@ -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-pYMthdDn.cjs");
2
+ const require_create_super_doc_ui = require("../chunks/create-super-doc-ui-CZBUMdjl.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 { n as BUILT_IN_COMMAND_IDS, r as shallowEqual, t as createSuperDocUI } from "../chunks/create-super-doc-ui-Dvl3EZsv.es.js";
1
+ import { n as BUILT_IN_COMMAND_IDS, r as shallowEqual, t as createSuperDocUI } from "../chunks/create-super-doc-ui-BlnUCtrx.es.js";
2
2
  export { BUILT_IN_COMMAND_IDS, createSuperDocUI, shallowEqual };
package/dist/style.css CHANGED
@@ -960,7 +960,7 @@ img[data-v-c95b2073] {
960
960
  box-shadow: 0 0 0 2px rgba(79, 124, 255, 0.16);
961
961
  }
962
962
 
963
- .comments-dialog[data-v-67a03ee2] {
963
+ .comments-dialog[data-v-35236c9c] {
964
964
  display: flex;
965
965
  flex-direction: column;
966
966
  padding: var(--sd-ui-comments-card-padding, 16px);
@@ -979,73 +979,73 @@ img[data-v-c95b2073] {
979
979
  overflow-wrap: break-word;
980
980
  word-break: break-word;
981
981
  }
982
- .comments-dialog[data-v-67a03ee2]:not(.is-active) {
982
+ .comments-dialog[data-v-35236c9c]:not(.is-active) {
983
983
  cursor: pointer;
984
984
  }
985
- .comments-dialog[data-v-67a03ee2]:not(.is-active):not(.is-resolved):hover {
985
+ .comments-dialog[data-v-35236c9c]:not(.is-active):not(.is-resolved):hover {
986
986
  background-color: var(--sd-ui-comments-card-hover-bg, #f3f6fd);
987
987
  }
988
- .comments-dialog[data-v-67a03ee2]:not(.is-resolved):hover .overflow-menu {
988
+ .comments-dialog[data-v-35236c9c]:not(.is-resolved):hover .overflow-menu {
989
989
  opacity: 1;
990
990
  pointer-events: auto;
991
991
  }
992
- .comments-dialog.is-active[data-v-67a03ee2] {
992
+ .comments-dialog.is-active[data-v-35236c9c] {
993
993
  background-color: var(--sd-ui-comments-card-active-bg, #ffffff);
994
994
  border-color: var(--sd-ui-comments-card-active-border, #e0e0e0);
995
995
  box-shadow: var(--sd-ui-comments-card-shadow, 0px 4px 12px 0px rgba(50, 50, 50, 0.15));
996
996
  z-index: 10;
997
997
  }
998
- .comments-dialog.is-resolved[data-v-67a03ee2] {
998
+ .comments-dialog.is-resolved[data-v-35236c9c] {
999
999
  background-color: var(--sd-ui-comments-card-resolved-bg, #f0f0f0);
1000
1000
  }
1001
- .comment-separator[data-v-67a03ee2] {
1001
+ .comment-separator[data-v-35236c9c] {
1002
1002
  background-color: var(--sd-ui-comments-separator, #e0e0e0);
1003
1003
  height: 1px;
1004
1004
  width: 100%;
1005
1005
  margin: 10px 0;
1006
1006
  }
1007
- .comment[data-v-67a03ee2] {
1007
+ .comment[data-v-35236c9c] {
1008
1008
  font-size: var(--sd-ui-comments-body-size, 14px);
1009
1009
  line-height: 1.5;
1010
1010
  color: var(--sd-ui-comments-body-text, #212121);
1011
1011
  margin: 4px 0 0 0;
1012
1012
  }
1013
- .comment[data-v-67a03ee2] p {
1013
+ .comment[data-v-35236c9c] p {
1014
1014
  margin: 0;
1015
1015
  }
1016
- .tracked-change[data-v-67a03ee2] {
1016
+ .tracked-change[data-v-35236c9c] {
1017
1017
  font-size: var(--sd-ui-comments-body-size, 14px);
1018
1018
  line-height: 1.5;
1019
1019
  color: var(--sd-ui-comments-body-text, #212121);
1020
1020
  margin: 4px 0 0 0;
1021
1021
  }
1022
- .change-type[data-v-67a03ee2] {
1022
+ .change-type[data-v-35236c9c] {
1023
1023
  color: var(--sd-ui-comments-body-text, #212121);
1024
1024
  }
1025
- .tracked-change-text[data-v-67a03ee2] {
1025
+ .tracked-change-text[data-v-35236c9c] {
1026
1026
  color: var(--sd-ui-comments-body-text, #212121);
1027
1027
  }
1028
- .tracked-change-text.is-deleted[data-v-67a03ee2] {
1028
+ .tracked-change-text.is-deleted[data-v-35236c9c] {
1029
1029
  color: var(--sd-ui-comments-delete-text, #cb0e47);
1030
1030
  }
1031
- .tracked-change-text.is-inserted[data-v-67a03ee2] {
1031
+ .tracked-change-text.is-inserted[data-v-35236c9c] {
1032
1032
  color: var(--sd-ui-comments-insert-text, #1f6feb);
1033
1033
  font-weight: 500;
1034
1034
  }
1035
- .tracked-change[data-track-change-semantic-color-key='move-from'] .tracked-change-text.is-deleted[data-v-67a03ee2] {
1035
+ .tracked-change[data-track-change-semantic-color-key='move-from'] .tracked-change-text.is-deleted[data-v-35236c9c] {
1036
1036
  color: var(--sd-ui-comments-move-from-text, #00853d);
1037
1037
  }
1038
- .tracked-change[data-track-change-semantic-color-key='move-to'] .tracked-change-text.is-inserted[data-v-67a03ee2] {
1038
+ .tracked-change[data-track-change-semantic-color-key='move-to'] .tracked-change-text.is-inserted[data-v-35236c9c] {
1039
1039
  color: var(--sd-ui-comments-move-to-text, #00853d);
1040
1040
  }
1041
- .tracked-change-detail-lines[data-v-67a03ee2] {
1041
+ .tracked-change-detail-lines[data-v-35236c9c] {
1042
1042
  margin-top: 4px;
1043
1043
  }
1044
- .tracked-change-detail-line[data-v-67a03ee2] {
1044
+ .tracked-change-detail-line[data-v-35236c9c] {
1045
1045
  font-size: 12px;
1046
1046
  line-height: 1.4;
1047
1047
  }
1048
- .tracked-change-image-preview[data-v-67a03ee2] {
1048
+ .tracked-change-image-preview[data-v-35236c9c] {
1049
1049
  display: inline-flex;
1050
1050
  align-items: center;
1051
1051
  justify-content: center;
@@ -1056,7 +1056,7 @@ img[data-v-c95b2073] {
1056
1056
  max-width: 96px;
1057
1057
  max-height: 96px;
1058
1058
  }
1059
- .tracked-change-image-preview__image[data-v-67a03ee2] {
1059
+ .tracked-change-image-preview__image[data-v-35236c9c] {
1060
1060
  display: block;
1061
1061
  width: auto;
1062
1062
  height: auto;
@@ -1065,8 +1065,27 @@ img[data-v-c95b2073] {
1065
1065
  object-fit: contain;
1066
1066
  }
1067
1067
 
1068
+ /* ── Failed tracked-change decision alert (SD-3772 §6) ── */
1069
+ .tracked-change-decision-alert[data-v-35236c9c] {
1070
+ display: flex;
1071
+ align-items: center;
1072
+ justify-content: space-between;
1073
+ gap: 8px;
1074
+ margin-top: 8px;
1075
+ padding: 8px 10px;
1076
+ border-radius: 8px;
1077
+ border: 1px solid var(--sd-ui-comments-alert-border, #f0b4b4);
1078
+ background-color: var(--sd-ui-comments-alert-bg, #fdf3f3);
1079
+ color: var(--sd-ui-comments-alert-text, #a4262c);
1080
+ font-size: var(--sd-ui-comments-body-size, 14px);
1081
+ line-height: 1.4;
1082
+ }
1083
+ .tracked-change-decision-alert__retry[data-v-35236c9c] {
1084
+ flex-shrink: 0;
1085
+ }
1086
+
1068
1087
  /* ── Resolved badge ── */
1069
- .resolved-badge[data-v-67a03ee2] {
1088
+ .resolved-badge[data-v-35236c9c] {
1070
1089
  display: inline-flex;
1071
1090
  align-items: center;
1072
1091
  gap: 4px;
@@ -1075,26 +1094,26 @@ img[data-v-c95b2073] {
1075
1094
  color: var(--sd-ui-comments-resolved-text, #00853d);
1076
1095
  margin-bottom: 4px;
1077
1096
  }
1078
- .resolved-badge__icon[data-v-67a03ee2] {
1097
+ .resolved-badge__icon[data-v-35236c9c] {
1079
1098
  display: inline-flex;
1080
1099
  width: 12px;
1081
1100
  height: 12px;
1082
1101
  }
1083
- .resolved-badge__icon[data-v-67a03ee2] svg {
1102
+ .resolved-badge__icon[data-v-35236c9c] svg {
1084
1103
  width: 100%;
1085
1104
  height: 100%;
1086
1105
  fill: currentColor;
1087
1106
  }
1088
1107
 
1089
1108
  /* ── Text truncation ── */
1090
- .comment.is-truncated[data-v-67a03ee2],
1091
- .tracked-change.is-truncated[data-v-67a03ee2] {
1109
+ .comment.is-truncated[data-v-35236c9c],
1110
+ .tracked-change.is-truncated[data-v-35236c9c] {
1092
1111
  display: -webkit-box;
1093
1112
  -webkit-line-clamp: 3;
1094
1113
  -webkit-box-orient: vertical;
1095
1114
  overflow: hidden;
1096
1115
  }
1097
- .show-more-toggle[data-v-67a03ee2] {
1116
+ .show-more-toggle[data-v-35236c9c] {
1098
1117
  font-size: 12px;
1099
1118
  color: var(--sd-ui-action, #1355ff);
1100
1119
  cursor: pointer;
@@ -1102,12 +1121,12 @@ img[data-v-c95b2073] {
1102
1121
  margin-top: 4px;
1103
1122
  user-select: none;
1104
1123
  }
1105
- .show-more-toggle[data-v-67a03ee2]:hover {
1124
+ .show-more-toggle[data-v-35236c9c]:hover {
1106
1125
  text-decoration: underline;
1107
1126
  }
1108
1127
 
1109
1128
  /* ── Thread collapse ── */
1110
- .collapsed-replies[data-v-67a03ee2] {
1129
+ .collapsed-replies[data-v-35236c9c] {
1111
1130
  display: flex;
1112
1131
  align-items: center;
1113
1132
  gap: 6px;
@@ -1118,24 +1137,24 @@ img[data-v-c95b2073] {
1118
1137
  cursor: pointer;
1119
1138
  user-select: none;
1120
1139
  }
1121
- .collapsed-replies[data-v-67a03ee2]:hover {
1140
+ .collapsed-replies[data-v-35236c9c]:hover {
1122
1141
  text-decoration: underline;
1123
1142
  }
1124
- .collapsed-avatars[data-v-67a03ee2] {
1143
+ .collapsed-avatars[data-v-35236c9c] {
1125
1144
  display: flex;
1126
1145
  }
1127
- .collapsed-avatars .mini-avatar[data-v-67a03ee2] {
1146
+ .collapsed-avatars .mini-avatar[data-v-35236c9c] {
1128
1147
  --sd-comment-avatar-size: 20px;
1129
1148
  --sd-comment-avatar-font-size: 8px;
1130
1149
  margin-left: -4px;
1131
1150
  border: 2px solid var(--sd-ui-comments-card-active-bg, #ffffff);
1132
1151
  }
1133
- .collapsed-avatars .mini-avatar[data-v-67a03ee2]:first-child {
1152
+ .collapsed-avatars .mini-avatar[data-v-35236c9c]:first-child {
1134
1153
  margin-left: 0;
1135
1154
  }
1136
1155
 
1137
1156
  /* ── New comment input ── */
1138
- .new-comment-input-wrapper[data-v-67a03ee2] {
1157
+ .new-comment-input-wrapper[data-v-35236c9c] {
1139
1158
  border: 1.5px solid var(--sd-ui-comments-input-border, #dbdbdb);
1140
1159
  border-radius: 12px;
1141
1160
  padding: 8.5px 10.5px;
@@ -1144,17 +1163,17 @@ img[data-v-c95b2073] {
1144
1163
  max-height: 150px;
1145
1164
  overflow-y: auto;
1146
1165
  }
1147
- .new-comment-input-wrapper[data-v-67a03ee2]:focus-within {
1166
+ .new-comment-input-wrapper[data-v-35236c9c]:focus-within {
1148
1167
  border-color: var(--sd-ui-comments-input-focus-border, #4f7cff);
1149
1168
  box-shadow: 0 0 0 2px rgba(79, 124, 255, 0.16);
1150
1169
  }
1151
- .new-comment-input-wrapper[data-v-67a03ee2] .comment-entry {
1170
+ .new-comment-input-wrapper[data-v-35236c9c] .comment-entry {
1152
1171
  border-radius: 0;
1153
1172
  }
1154
- .new-comment-input-wrapper[data-v-67a03ee2] .input-section {
1173
+ .new-comment-input-wrapper[data-v-35236c9c] .input-section {
1155
1174
  margin: 0;
1156
1175
  }
1157
- .new-comment-input-wrapper[data-v-67a03ee2] .superdoc-field {
1176
+ .new-comment-input-wrapper[data-v-35236c9c] .superdoc-field {
1158
1177
  font-size: 14px;
1159
1178
  line-height: 20px;
1160
1179
  border: none;
@@ -1165,18 +1184,18 @@ img[data-v-c95b2073] {
1165
1184
  max-height: 132px;
1166
1185
  resize: none;
1167
1186
  }
1168
- .new-comment-input-wrapper[data-v-67a03ee2] .superdoc-field:focus,
1169
- .new-comment-input-wrapper[data-v-67a03ee2] .superdoc-field:active {
1187
+ .new-comment-input-wrapper[data-v-35236c9c] .superdoc-field:focus,
1188
+ .new-comment-input-wrapper[data-v-35236c9c] .superdoc-field:active {
1170
1189
  border: none;
1171
1190
  box-shadow: none;
1172
1191
  outline: none;
1173
1192
  }
1174
- .new-comment-input-wrapper[data-v-67a03ee2] .sd-editor-placeholder::before {
1193
+ .new-comment-input-wrapper[data-v-35236c9c] .sd-editor-placeholder::before {
1175
1194
  content: 'Comment or add others with @';
1176
1195
  }
1177
1196
 
1178
1197
  /* ── Reply pill & expanded input ── */
1179
- .reply-pill[data-v-67a03ee2] {
1198
+ .reply-pill[data-v-35236c9c] {
1180
1199
  padding: 8.5px 10.5px;
1181
1200
  border: 1.5px solid transparent;
1182
1201
  border-radius: 9999px;
@@ -1187,13 +1206,13 @@ img[data-v-c95b2073] {
1187
1206
  cursor: text;
1188
1207
  transition: background 150ms ease;
1189
1208
  }
1190
- .reply-pill[data-v-67a03ee2]:hover {
1209
+ .reply-pill[data-v-35236c9c]:hover {
1191
1210
  background: var(--sd-color-gray-200, #f2f2f2);
1192
1211
  }
1193
- .reply-expanded[data-v-67a03ee2] {
1212
+ .reply-expanded[data-v-35236c9c] {
1194
1213
  margin-top: 10px;
1195
1214
  }
1196
- .reply-input-wrapper[data-v-67a03ee2] {
1215
+ .reply-input-wrapper[data-v-35236c9c] {
1197
1216
  border: 1.5px solid var(--sd-ui-comments-input-border, #dbdbdb);
1198
1217
  border-radius: 12px;
1199
1218
  padding: 8.5px 10.5px;
@@ -1201,17 +1220,17 @@ img[data-v-c95b2073] {
1201
1220
  max-height: 150px;
1202
1221
  overflow-y: auto;
1203
1222
  }
1204
- .reply-input-wrapper[data-v-67a03ee2]:focus-within {
1223
+ .reply-input-wrapper[data-v-35236c9c]:focus-within {
1205
1224
  border-color: var(--sd-ui-comments-input-focus-border, #4f7cff);
1206
1225
  box-shadow: 0 0 0 2px rgba(79, 124, 255, 0.16);
1207
1226
  }
1208
- .reply-input-wrapper[data-v-67a03ee2] .comment-entry {
1227
+ .reply-input-wrapper[data-v-35236c9c] .comment-entry {
1209
1228
  border-radius: 0;
1210
1229
  }
1211
- .reply-input-wrapper[data-v-67a03ee2] .input-section {
1230
+ .reply-input-wrapper[data-v-35236c9c] .input-section {
1212
1231
  margin: 0;
1213
1232
  }
1214
- .reply-input-wrapper[data-v-67a03ee2] .superdoc-field {
1233
+ .reply-input-wrapper[data-v-35236c9c] .superdoc-field {
1215
1234
  font-size: 14px;
1216
1235
  line-height: 20px;
1217
1236
  border: none;
@@ -1222,23 +1241,23 @@ img[data-v-c95b2073] {
1222
1241
  max-height: 132px;
1223
1242
  resize: none;
1224
1243
  }
1225
- .reply-input-wrapper[data-v-67a03ee2] .superdoc-field:focus,
1226
- .reply-input-wrapper[data-v-67a03ee2] .superdoc-field:active {
1244
+ .reply-input-wrapper[data-v-35236c9c] .superdoc-field:focus,
1245
+ .reply-input-wrapper[data-v-35236c9c] .superdoc-field:active {
1227
1246
  border: none;
1228
1247
  box-shadow: none;
1229
1248
  outline: none;
1230
1249
  }
1231
- .reply-input-wrapper[data-v-67a03ee2] .sd-editor-placeholder::before {
1250
+ .reply-input-wrapper[data-v-35236c9c] .sd-editor-placeholder::before {
1232
1251
  content: 'Reply or add others with @';
1233
1252
  }
1234
- .reply-actions[data-v-67a03ee2] {
1253
+ .reply-actions[data-v-35236c9c] {
1235
1254
  display: flex;
1236
1255
  justify-content: flex-end;
1237
1256
  align-items: center;
1238
1257
  gap: 16px;
1239
1258
  margin-top: 8px;
1240
1259
  }
1241
- .reply-btn-cancel[data-v-67a03ee2] {
1260
+ .reply-btn-cancel[data-v-35236c9c] {
1242
1261
  background: none;
1243
1262
  border: none;
1244
1263
  font-size: 13px;
@@ -1249,10 +1268,10 @@ img[data-v-c95b2073] {
1249
1268
  font-family: inherit;
1250
1269
  transition: color 150ms;
1251
1270
  }
1252
- .reply-btn-cancel[data-v-67a03ee2]:hover {
1271
+ .reply-btn-cancel[data-v-35236c9c]:hover {
1253
1272
  color: var(--sd-ui-text, #212121);
1254
1273
  }
1255
- .reply-btn-primary[data-v-67a03ee2] {
1274
+ .reply-btn-primary[data-v-35236c9c] {
1256
1275
  background: var(--sd-ui-action, #1355ff);
1257
1276
  border: none;
1258
1277
  font-size: 13px;
@@ -1264,19 +1283,19 @@ img[data-v-c95b2073] {
1264
1283
  font-family: inherit;
1265
1284
  transition: background 150ms;
1266
1285
  }
1267
- .reply-btn-primary[data-v-67a03ee2]:hover {
1286
+ .reply-btn-primary[data-v-35236c9c]:hover {
1268
1287
  background: var(--sd-ui-action-hover, #0f44cc);
1269
1288
  }
1270
- .reply-btn-primary.sd-is-disabled[data-v-67a03ee2] {
1289
+ .reply-btn-primary.sd-is-disabled[data-v-35236c9c] {
1271
1290
  background: var(--sd-color-gray-400, #dbdbdb);
1272
1291
  color: var(--sd-color-gray-600, #888888);
1273
1292
  cursor: default;
1274
1293
  pointer-events: none;
1275
1294
  }
1276
- .existing-internal-input[data-v-67a03ee2] {
1295
+ .existing-internal-input[data-v-35236c9c] {
1277
1296
  margin-bottom: 10px;
1278
1297
  }
1279
- .sd-internal-dropdown[data-v-67a03ee2] {
1298
+ .sd-internal-dropdown[data-v-35236c9c] {
1280
1299
  display: inline-block;
1281
1300
  }
1282
1301
 
@@ -1324,24 +1343,24 @@ img[data-v-c95b2073] {
1324
1343
  background-color: #1355ff7f;
1325
1344
  }
1326
1345
 
1327
- .comment-placeholder[data-v-7bf85652] {
1346
+ .comment-placeholder[data-v-3672b976] {
1328
1347
  position: absolute;
1329
1348
  width: 300px;
1330
1349
  transition: top 0.3s ease;
1331
1350
  }
1332
- .floating-comment[data-v-7bf85652] {
1351
+ .floating-comment[data-v-3672b976] {
1333
1352
  position: relative;
1334
1353
  display: block;
1335
1354
  min-width: 300px;
1336
1355
  }
1337
- .sidebar-container[data-v-7bf85652] {
1356
+ .sidebar-container[data-v-3672b976] {
1338
1357
  position: absolute;
1339
1358
  width: 300px;
1340
1359
  min-height: 300px;
1341
1360
  transition: transform 0.3s ease;
1342
1361
  will-change: transform;
1343
1362
  }
1344
- .section-wrapper[data-v-7bf85652] {
1363
+ .section-wrapper[data-v-3672b976] {
1345
1364
  position: relative;
1346
1365
  min-height: 100%;
1347
1366
  width: 300px;