@a3s-lab/office 0.7.2 → 0.8.0

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 (28) hide show
  1. package/COLLABORATION_ROADMAP.md +81 -26
  2. package/README.md +48 -4
  3. package/dist/0~document-editor.js +414 -247
  4. package/dist/8928.js +689 -49
  5. package/dist/9787.js +14 -4
  6. package/dist/core.d.ts +2 -2
  7. package/dist/internal/collaboration/office-collaboration.d.ts +4 -2
  8. package/dist/internal/collaboration/office-document-collaboration-change-decisions.d.ts +7 -0
  9. package/dist/internal/collaboration/office-document-collaboration-claims.d.ts +2 -1
  10. package/dist/internal/collaboration/office-document-collaboration-comment-permissions.d.ts +3 -0
  11. package/dist/internal/collaboration/office-document-collaboration-sidecars.d.ts +3 -1
  12. package/dist/internal/collaboration/office-document-collaboration-suggestions.d.ts +6 -0
  13. package/dist/internal/collaboration/office-document-collaboration.d.ts +6 -2
  14. package/dist/internal/features/work/editors/document-changes-panel.d.ts +7 -1
  15. package/dist/internal/features/work/editors/document-comment-composer.d.ts +1 -0
  16. package/dist/internal/features/work/editors/document-comments-panel.d.ts +3 -1
  17. package/dist/internal/features/work/editors/document-selection-toolbar.d.ts +2 -1
  18. package/dist/internal/features/work/editors/document-toolbar.d.ts +5 -1
  19. package/dist/internal/features/work/editors/use-document-comments.d.ts +6 -1
  20. package/dist/internal/features/work/work-document-changes.d.ts +5 -2
  21. package/dist/internal/features/work/work-document-comments.d.ts +5 -1
  22. package/dist/internal/features/work/work-document-extensions.d.ts +1 -0
  23. package/dist/internal/features/work/work-document-paragraph-identity.d.ts +1 -0
  24. package/dist/internal/features/work/work-document-table-row-identity.d.ts +5 -1
  25. package/dist/internal/features/work/work-types.d.ts +22 -0
  26. package/dist/office-kernel.wasm +0 -0
  27. package/dist/styles.css +76 -0
  28. package/package.json +12 -3
package/dist/9787.js CHANGED
@@ -52,9 +52,9 @@ class WorkOfficeCollaborationSessionImpl {
52
52
  operationId: void 0 === operationId ? void 0 : normalizedIdentifier(operationId, 'operation ID')
53
53
  });
54
54
  }
55
- transact(operation, origin = this.localOrigin) {
55
+ transact(operation, origin = this.localOrigin, scope = 'content') {
56
56
  this.ensureActive();
57
- assertWorkOfficeCollaborationEditable(this);
57
+ assertWorkOfficeCollaborationWritable(this, scope);
58
58
  assertWorkOfficeCollaborationOrigin(origin);
59
59
  let result;
60
60
  this.document.transact((transaction)=>{
@@ -132,8 +132,18 @@ function registerWorkOfficeCollaborationInitializer(session) {
132
132
  ]);
133
133
  }
134
134
  function assertWorkOfficeCollaborationEditable(session) {
135
+ assertWorkOfficeCollaborationWritable(session, 'content');
136
+ }
137
+ function assertWorkOfficeCollaborationWritable(session, scope) {
138
+ const normalizedScope = normalizedMutationScope(scope);
135
139
  if ('edit' === session.mode) return;
136
- throw new WorkOfficeCollaborationError('office.collaboration.permission_denied', `The '${session.mode}' collaboration mode cannot modify canonical content.`);
140
+ if ('comment' === session.mode && 'document' === session.kind && 'document-comment' === normalizedScope) return;
141
+ if ('suggest' === session.mode && 'document' === session.kind && session.actor && 'document-suggestion' === normalizedScope) return;
142
+ throw new WorkOfficeCollaborationError('office.collaboration.permission_denied', 'document-comment' === normalizedScope ? `The '${session.mode}' collaboration mode cannot modify Document review records.` : 'document-suggestion' === normalizedScope ? `The '${session.mode}' collaboration mode cannot create Document suggestions.` : `The '${session.mode}' collaboration mode cannot modify canonical content.`);
143
+ }
144
+ function normalizedMutationScope(value) {
145
+ if ('content' === value || 'document-comment' === value || 'document-suggestion' === value) return value;
146
+ throw new WorkOfficeCollaborationError('office.collaboration.mutation_scope_invalid', `The collaboration mutation scope '${String(value)}' is invalid.`);
137
147
  }
138
148
  function assertSessionMetadata(session) {
139
149
  readWorkOfficeCollaborationMetadata(session);
@@ -206,4 +216,4 @@ function normalizedRootSuffix(value) {
206
216
  function isWorkArtifactKind(value) {
207
217
  return 'document' === value || 'markdown' === value || 'spreadsheet' === value || 'presentation' === value || 'pdf' === value;
208
218
  }
209
- export { WORK_OFFICE_COLLABORATION_NAMESPACE as OFFICE_COLLABORATION_NAMESPACE, WORK_OFFICE_COLLABORATION_PROTOCOL as OFFICE_COLLABORATION_PROTOCOL, WorkOfficeCollaborationError as OfficeCollaborationError, assertWorkOfficeCollaborationEditable, assertWorkOfficeCollaborationOrigin, createWorkOfficeCollaborationSession as createOfficeCollaborationSession, initializeWorkOfficeCollaborationMetadata, markWorkOfficeCollaborationInitialized, readWorkOfficeCollaborationMetadata as readOfficeCollaborationMetadata, registerWorkOfficeCollaborationInitializer };
219
+ export { WORK_OFFICE_COLLABORATION_NAMESPACE as OFFICE_COLLABORATION_NAMESPACE, WORK_OFFICE_COLLABORATION_PROTOCOL as OFFICE_COLLABORATION_PROTOCOL, WorkOfficeCollaborationError as OfficeCollaborationError, assertWorkOfficeCollaborationEditable, assertWorkOfficeCollaborationOrigin, assertWorkOfficeCollaborationWritable, createWorkOfficeCollaborationSession as createOfficeCollaborationSession, initializeWorkOfficeCollaborationMetadata, markWorkOfficeCollaborationInitialized, readWorkOfficeCollaborationMetadata as readOfficeCollaborationMetadata, registerWorkOfficeCollaborationInitializer };
package/dist/core.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- export type { WorkOfficeCollaborationActor as OfficeCollaborationActor, WorkOfficeCollaborationActorKind as OfficeCollaborationActorKind, WorkOfficeCollaborationAwareness as OfficeCollaborationAwareness, WorkOfficeCollaborationErrorCode as OfficeCollaborationErrorCode, WorkOfficeCollaborationMetadata as OfficeCollaborationMetadata, WorkOfficeCollaborationMode as OfficeCollaborationMode, WorkOfficeCollaborationOrigin as OfficeCollaborationOrigin, WorkOfficeCollaborationOriginKind as OfficeCollaborationOriginKind, WorkOfficeCollaborationSession as OfficeCollaborationSession, WorkOfficeCollaborationSessionOptions as OfficeCollaborationSessionOptions, } from './internal/collaboration/office-collaboration';
1
+ export type { WorkOfficeCollaborationActor as OfficeCollaborationActor, WorkOfficeCollaborationActorKind as OfficeCollaborationActorKind, WorkOfficeCollaborationAwareness as OfficeCollaborationAwareness, WorkOfficeCollaborationErrorCode as OfficeCollaborationErrorCode, WorkOfficeCollaborationMetadata as OfficeCollaborationMetadata, WorkOfficeCollaborationMode as OfficeCollaborationMode, WorkOfficeCollaborationMutationScope as OfficeCollaborationMutationScope, WorkOfficeCollaborationOrigin as OfficeCollaborationOrigin, WorkOfficeCollaborationOriginKind as OfficeCollaborationOriginKind, WorkOfficeCollaborationSession as OfficeCollaborationSession, WorkOfficeCollaborationSessionOptions as OfficeCollaborationSessionOptions, } from './internal/collaboration/office-collaboration';
2
2
  export { createWorkOfficeCollaborationSession as createOfficeCollaborationSession, readWorkOfficeCollaborationMetadata as readOfficeCollaborationMetadata, WORK_OFFICE_COLLABORATION_NAMESPACE as OFFICE_COLLABORATION_NAMESPACE, WORK_OFFICE_COLLABORATION_PROTOCOL as OFFICE_COLLABORATION_PROTOCOL, WORK_OFFICE_COLLABORATION_VERSION as OFFICE_COLLABORATION_VERSION, WorkOfficeCollaborationError as OfficeCollaborationError, } from './internal/collaboration/office-collaboration';
3
3
  export type { WorkOfficeCollaborationParticipant as OfficeCollaborationParticipant, WorkOfficeCollaborationPresence as OfficeCollaborationPresence, WorkOfficeCollaborationPresenceActivity as OfficeCollaborationPresenceActivity, WorkOfficeCollaborationPresenceActor as OfficeCollaborationPresenceActor, WorkOfficeCollaborationPresenceLocation as OfficeCollaborationPresenceLocation, WorkOfficeCollaborationPresenceSnapshot as OfficeCollaborationPresenceSnapshot, WorkOfficeCollaborationPresenceState as OfficeCollaborationPresenceState, WorkOfficeCollaborationPresenceUpdate as OfficeCollaborationPresenceUpdate, WorkOfficeDocumentPresenceLocation as OfficeDocumentPresenceLocation, WorkOfficeMarkdownPresenceLocation as OfficeMarkdownPresenceLocation, WorkOfficePdfPresenceLocation as OfficePdfPresenceLocation, WorkOfficePresentationPresenceLocation as OfficePresentationPresenceLocation, WorkOfficeSpreadsheetPresenceCell as OfficeSpreadsheetPresenceCell, WorkOfficeSpreadsheetPresenceLocation as OfficeSpreadsheetPresenceLocation, WorkOfficeSpreadsheetPresenceRange as OfficeSpreadsheetPresenceRange, WorkOfficeTextPresenceLocation as OfficeTextPresenceLocation, } from './internal/collaboration/office-collaboration-presence';
4
4
  export { createWorkOfficeCollaborationPresence as createOfficeCollaborationPresence, WORK_OFFICE_COLLABORATION_PRESENCE_FIELD as OFFICE_COLLABORATION_PRESENCE_FIELD, } from './internal/collaboration/office-collaboration-presence';
5
5
  export type { WorkOfficeCollaborationTransport as OfficeCollaborationTransport, WorkOfficeCollaborationTransportBinding as OfficeCollaborationTransportBinding, WorkOfficeCollaborationTransportBindingOptions as OfficeCollaborationTransportBindingOptions, WorkOfficeCollaborationTransportMessage as OfficeCollaborationTransportMessage, WorkOfficeCollaborationTransportMessageType as OfficeCollaborationTransportMessageType, } from './internal/collaboration/office-collaboration-transport';
6
6
  export { createWorkOfficeCollaborationTransportBinding as createOfficeCollaborationTransportBinding, WORK_OFFICE_COLLABORATION_DEFAULT_MAX_TRANSPORT_PAYLOAD_BYTES as OFFICE_COLLABORATION_DEFAULT_MAX_TRANSPORT_PAYLOAD_BYTES, WORK_OFFICE_COLLABORATION_MAX_TRANSPORT_PAYLOAD_BYTES as OFFICE_COLLABORATION_MAX_TRANSPORT_PAYLOAD_BYTES, } from './internal/collaboration/office-collaboration-transport';
7
- export type { WorkOfficeDocumentCollaborationBinding as OfficeDocumentCollaborationBinding, WorkOfficeDocumentCollaborationBindingOptions as OfficeDocumentCollaborationBindingOptions, WorkOfficeDocumentCollaborationChange as OfficeDocumentCollaborationChange, } from './internal/collaboration/office-document-collaboration';
7
+ export type { WorkOfficeDocumentCollaborationBinding as OfficeDocumentCollaborationBinding, WorkOfficeDocumentCollaborationBindingOptions as OfficeDocumentCollaborationBindingOptions, WorkOfficeDocumentCollaborationChange as OfficeDocumentCollaborationChange, WorkOfficeDocumentChangeDecisionOptions as OfficeDocumentChangeDecisionOptions, } from './internal/collaboration/office-document-collaboration';
8
8
  export { createWorkOfficeDocumentCollaborationBinding as createOfficeDocumentCollaborationBinding, initializeWorkOfficeDocumentCollaboration as initializeOfficeDocumentCollaboration, readWorkOfficeDocumentCollaboration as readOfficeDocumentCollaboration, workOfficeDocumentCollaborationFragment as officeDocumentCollaborationFragment, } from './internal/collaboration/office-document-collaboration';
9
9
  export type { WorkOfficeMarkdownCollaborationBinding as OfficeMarkdownCollaborationBinding, WorkOfficeMarkdownCollaborationBindingOptions as OfficeMarkdownCollaborationBindingOptions, WorkOfficeMarkdownCollaborationChange as OfficeMarkdownCollaborationChange, } from './internal/collaboration/office-markdown-collaboration';
10
10
  export { createWorkOfficeMarkdownCollaborationBinding as createOfficeMarkdownCollaborationBinding, initializeWorkOfficeMarkdownCollaboration as initializeOfficeMarkdownCollaboration, readWorkOfficeMarkdownCollaboration as readOfficeMarkdownCollaboration, replaceWorkOfficeMarkdownCollaboration as replaceOfficeMarkdownCollaboration, } from './internal/collaboration/office-markdown-collaboration';
@@ -13,6 +13,7 @@ export interface WorkOfficeCollaborationActor {
13
13
  kind?: WorkOfficeCollaborationActorKind;
14
14
  }
15
15
  export type WorkOfficeCollaborationOriginKind = 'bootstrap' | 'editor' | 'agent' | 'import' | 'system';
16
+ export type WorkOfficeCollaborationMutationScope = 'content' | 'document-comment' | 'document-suggestion';
16
17
  export interface WorkOfficeCollaborationOrigin {
17
18
  readonly protocol: typeof WORK_OFFICE_COLLABORATION_PROTOCOL;
18
19
  readonly kind: WorkOfficeCollaborationOriginKind;
@@ -68,10 +69,10 @@ export interface WorkOfficeCollaborationSession {
68
69
  metadata(): WorkOfficeCollaborationMetadata | null;
69
70
  rootName(suffix: string): string;
70
71
  createOrigin(kind: WorkOfficeCollaborationOriginKind, operationId?: string): WorkOfficeCollaborationOrigin;
71
- transact<T>(operation: (transaction: Y.Transaction) => T, origin?: WorkOfficeCollaborationOrigin): T;
72
+ transact<T>(operation: (transaction: Y.Transaction) => T, origin?: WorkOfficeCollaborationOrigin, scope?: WorkOfficeCollaborationMutationScope): T;
72
73
  destroy(): void;
73
74
  }
74
- export type WorkOfficeCollaborationErrorCode = 'office.collaboration.actor_invalid' | 'office.collaboration.artifact_mismatch' | 'office.collaboration.binding_destroyed' | 'office.collaboration.bootstrap_ambiguous' | 'office.collaboration.bootstrap_invalid' | 'office.collaboration.content_invalid' | 'office.collaboration.identifier_invalid' | 'office.collaboration.kind_invalid' | 'office.collaboration.kind_mismatch' | 'office.collaboration.metadata_invalid' | 'office.collaboration.metadata_missing' | 'office.collaboration.mode_invalid' | 'office.collaboration.namespace_invalid' | 'office.collaboration.not_initialized' | 'office.collaboration.origin_invalid' | 'office.collaboration.permission_denied' | 'office.collaboration.presence_conflict' | 'office.collaboration.presence_invalid' | 'office.collaboration.presence_unavailable' | 'office.collaboration.root_invalid' | 'office.collaboration.session_destroyed' | 'office.collaboration.transport_identity_mismatch' | 'office.collaboration.transport_invalid' | 'office.collaboration.transport_message_invalid' | 'office.collaboration.transport_message_too_large';
75
+ export type WorkOfficeCollaborationErrorCode = 'office.collaboration.actor_invalid' | 'office.collaboration.artifact_mismatch' | 'office.collaboration.binding_destroyed' | 'office.collaboration.bootstrap_ambiguous' | 'office.collaboration.bootstrap_invalid' | 'office.collaboration.content_invalid' | 'office.collaboration.identifier_invalid' | 'office.collaboration.kind_invalid' | 'office.collaboration.kind_mismatch' | 'office.collaboration.metadata_invalid' | 'office.collaboration.metadata_missing' | 'office.collaboration.mode_invalid' | 'office.collaboration.mutation_scope_invalid' | 'office.collaboration.namespace_invalid' | 'office.collaboration.not_initialized' | 'office.collaboration.origin_invalid' | 'office.collaboration.permission_denied' | 'office.collaboration.presence_conflict' | 'office.collaboration.presence_invalid' | 'office.collaboration.presence_unavailable' | 'office.collaboration.root_invalid' | 'office.collaboration.session_destroyed' | 'office.collaboration.transport_identity_mismatch' | 'office.collaboration.transport_invalid' | 'office.collaboration.transport_message_invalid' | 'office.collaboration.transport_message_too_large';
75
76
  export declare class WorkOfficeCollaborationError extends Error {
76
77
  readonly code: WorkOfficeCollaborationErrorCode;
77
78
  constructor(code: WorkOfficeCollaborationErrorCode, message: string);
@@ -82,4 +83,5 @@ export declare function initializeWorkOfficeCollaborationMetadata(session: WorkO
82
83
  export declare function markWorkOfficeCollaborationInitialized(session: WorkOfficeCollaborationSession): void;
83
84
  export declare function registerWorkOfficeCollaborationInitializer(session: WorkOfficeCollaborationSession): void;
84
85
  export declare function assertWorkOfficeCollaborationEditable(session: WorkOfficeCollaborationSession): void;
86
+ export declare function assertWorkOfficeCollaborationWritable(session: WorkOfficeCollaborationSession, scope: WorkOfficeCollaborationMutationScope): void;
85
87
  export declare function assertWorkOfficeCollaborationOrigin(origin: WorkOfficeCollaborationOrigin): void;
@@ -0,0 +1,7 @@
1
+ import * as Y from 'yjs';
2
+ import type { WorkDocumentChangeDecision } from '../features/work/work-types';
3
+ export declare function validatedWorkOfficeDocumentChangeDecisions(value: unknown): WorkDocumentChangeDecision[];
4
+ export declare function initializeWorkOfficeDocumentChangeDecisions(records: Y.Map<unknown>, order: Y.Array<string>, decisions: WorkDocumentChangeDecision[]): void;
5
+ export declare function readWorkOfficeDocumentChangeDecisions(records: Y.Map<unknown>, order: Y.Array<string>): WorkDocumentChangeDecision[];
6
+ export declare function patchWorkOfficeDocumentChangeDecisions(records: Y.Map<unknown>, order: Y.Array<string>, previous: WorkDocumentChangeDecision[], next: WorkDocumentChangeDecision[]): void;
7
+ export declare function assertWorkOfficeDocumentChangeDecisionConflicts(previous: WorkDocumentChangeDecision[], next: WorkDocumentChangeDecision[], shared: WorkDocumentChangeDecision[]): void;
@@ -1,6 +1,7 @@
1
1
  import type * as Y from 'yjs';
2
- import type { WorkDocumentBibliography, WorkDocumentComment } from '../features/work/work-types';
2
+ import type { WorkDocumentBibliography, WorkDocumentChangeDecision, WorkDocumentComment } from '../features/work/work-types';
3
3
  interface ClaimableDocumentSidecars {
4
+ changeDecisions?: WorkDocumentChangeDecision[];
4
5
  comments?: WorkDocumentComment[];
5
6
  bibliography?: WorkDocumentBibliography;
6
7
  }
@@ -0,0 +1,3 @@
1
+ import type { WorkDocumentComment } from '../features/work/work-types';
2
+ import { type WorkOfficeCollaborationSession } from './office-collaboration';
3
+ export declare function assertWorkOfficeDocumentCommentMutationAllowed(session: WorkOfficeCollaborationSession, previous: readonly WorkDocumentComment[], next: readonly WorkDocumentComment[]): void;
@@ -1,9 +1,10 @@
1
1
  import type * as Y from 'yjs';
2
- import type { WorkDocumentBibliography, WorkDocumentComment, WorkDocumentContent } from '../features/work/work-types';
2
+ import type { WorkDocumentBibliography, WorkDocumentChangeDecision, WorkDocumentComment, WorkDocumentContent } from '../features/work/work-types';
3
3
  import { type WorkOfficeCollaborationOrigin, type WorkOfficeCollaborationSession } from './office-collaboration';
4
4
  export interface WorkOfficeDocumentSidecars {
5
5
  pageColor?: string;
6
6
  trackChanges?: boolean;
7
+ changeDecisions?: WorkDocumentChangeDecision[];
7
8
  comments?: WorkDocumentComment[];
8
9
  bibliography?: WorkDocumentBibliography;
9
10
  }
@@ -12,5 +13,6 @@ export declare function initializeWorkOfficeDocumentSidecars(session: WorkOffice
12
13
  export declare function readWorkOfficeDocumentSidecars(session: WorkOfficeCollaborationSession): WorkOfficeDocumentSidecars;
13
14
  export declare function updateWorkOfficeDocumentSidecars(session: WorkOfficeCollaborationSession, previous: WorkDocumentContent, next: WorkDocumentContent, origin: WorkOfficeCollaborationOrigin): boolean;
14
15
  export declare function workOfficeDocumentSidecarUndoScope(session: WorkOfficeCollaborationSession): Array<Y.Map<unknown> | Y.Array<string>>;
16
+ export declare function workOfficeDocumentDecisionRootsChanged(session: WorkOfficeCollaborationSession, transaction: Y.Transaction): boolean;
15
17
  export declare function workOfficeDocumentSidecarsChanged(session: WorkOfficeCollaborationSession, transaction: Y.Transaction): boolean;
16
18
  export declare function validatedWorkOfficeDocumentSidecars(content: WorkDocumentContent): WorkOfficeDocumentSidecars;
@@ -0,0 +1,6 @@
1
+ import type { Transaction } from '@tiptap/pm/state';
2
+ import type { WorkDocumentChange } from '../features/work/work-document-changes';
3
+ import type { WorkDocumentChangeDecision, WorkDocumentChangeDecisionAction } from '../features/work/work-types';
4
+ import type { WorkOfficeCollaborationSession } from './office-collaboration';
5
+ export declare function workOfficeDocumentSuggestionTransactionAllowed(session: WorkOfficeCollaborationSession, transaction: Transaction): boolean;
6
+ export declare function createWorkOfficeDocumentChangeDecisions(session: WorkOfficeCollaborationSession, changes: readonly WorkDocumentChange[], decision: WorkDocumentChangeDecisionAction, decidedAt?: string): WorkDocumentChangeDecision[];
@@ -1,7 +1,7 @@
1
- import { type Extensions } from '@tiptap/core';
1
+ import { type Editor, type Extensions } from '@tiptap/core';
2
2
  import * as Y from 'yjs';
3
3
  import { createWorkDocumentExtensions } from '../features/work/work-document-extensions';
4
- import type { WorkDocumentContent, WorkDocumentNode } from '../features/work/work-types';
4
+ import type { WorkDocumentChangeDecisionAction, WorkDocumentContent, WorkDocumentNode } from '../features/work/work-types';
5
5
  import { type WorkOfficeCollaborationOrigin, type WorkOfficeCollaborationSession } from './office-collaboration';
6
6
  export interface WorkOfficeDocumentCollaborationBindingOptions {
7
7
  /**
@@ -19,12 +19,16 @@ export interface WorkOfficeDocumentCollaborationChange {
19
19
  local: boolean;
20
20
  origin: unknown;
21
21
  }
22
+ export interface WorkOfficeDocumentChangeDecisionOptions {
23
+ decidedAt?: string;
24
+ }
22
25
  export interface WorkOfficeDocumentCollaborationBinding {
23
26
  readonly extensions: Extensions;
24
27
  readonly fragment: Y.XmlFragment;
25
28
  readonly origin: WorkOfficeCollaborationOrigin;
26
29
  content(): WorkDocumentContent;
27
30
  updateSidecars(previous: WorkDocumentContent, next: WorkDocumentContent): boolean;
31
+ decideChanges(editor: Editor, changeIds: readonly string[], decision: WorkDocumentChangeDecisionAction, options?: WorkOfficeDocumentChangeDecisionOptions): boolean;
28
32
  canUndo(): boolean;
29
33
  canRedo(): boolean;
30
34
  undo(): boolean;
@@ -1,9 +1,15 @@
1
1
  import type { Editor } from '@tiptap/core';
2
2
  import type { WorkDocumentChange } from '../work-document-changes';
3
- export declare function DocumentChangesPanel({ editor, changes, trackChanges, onTrackChangesChange, onClose, }: {
3
+ import type { WorkDocumentChangeDecision } from '../work-types';
4
+ type DocumentChangeDecision = 'accept' | 'reject';
5
+ export declare function DocumentChangesPanel({ editor, changes, decisions, trackChanges, suggestionOnly, onDecideChanges, onTrackChangesChange, onClose, }: {
4
6
  editor: Editor;
5
7
  changes: WorkDocumentChange[];
8
+ decisions?: WorkDocumentChangeDecision[];
6
9
  trackChanges: boolean;
10
+ suggestionOnly?: boolean;
11
+ onDecideChanges?: (changes: readonly WorkDocumentChange[], decision: DocumentChangeDecision) => boolean;
7
12
  onTrackChangesChange: (enabled: boolean) => void;
8
13
  onClose: () => void;
9
14
  }): import("react").JSX.Element;
15
+ export {};
@@ -5,6 +5,7 @@ export interface DocumentCommentDraft {
5
5
  anchorText: string;
6
6
  }
7
7
  export declare const DocumentCommentComposer: import("react").ForwardRefExoticComponent<{
8
+ author?: string;
8
9
  draft: DocumentCommentDraft;
9
10
  top: number;
10
11
  onCancel: () => void;
@@ -2,10 +2,12 @@ import type { Editor } from '@tiptap/core';
2
2
  import { type RefObject } from 'react';
3
3
  import { type WorkDocumentCommentView } from '../work-document-comments';
4
4
  import { type DocumentCommentDraft } from './document-comment-composer';
5
- export declare function DocumentCommentsPanel({ editor, comments, draft, surfaceRef, onReply, onToggleResolved, onDelete, onCancelDraft, onSubmitDraft, onClose, onDirtyChange, }: {
5
+ export declare function DocumentCommentsPanel({ editor, comments, canDelete, draft, draftAuthor, surfaceRef, onReply, onToggleResolved, onDelete, onCancelDraft, onSubmitDraft, onClose, onDirtyChange, }: {
6
6
  editor: Editor;
7
7
  comments: WorkDocumentCommentView[];
8
+ canDelete?: (id: string) => boolean;
8
9
  draft: DocumentCommentDraft | null;
10
+ draftAuthor?: string;
9
11
  surfaceRef: RefObject<HTMLDivElement | null>;
10
12
  onReply: (id: string, text: string) => void;
11
13
  onToggleResolved: (id: string) => void;
@@ -1,8 +1,9 @@
1
1
  import type { Editor } from '@tiptap/core';
2
2
  import type { WorkDocumentLayoutFont } from '../work-document-fonts';
3
- export declare function DocumentSelectionToolbar({ editor, canInsertComment, layoutFonts, onInsertComment, }: {
3
+ export declare function DocumentSelectionToolbar({ editor, canInsertComment, layoutFonts, onInsertComment, reviewOnly, }: {
4
4
  editor: Editor;
5
5
  canInsertComment: boolean;
6
6
  layoutFonts?: readonly WorkDocumentLayoutFont[];
7
7
  onInsertComment: () => void;
8
+ reviewOnly?: boolean;
8
9
  }): import("react").JSX.Element;
@@ -1,5 +1,6 @@
1
1
  import type { Editor } from '@tiptap/core';
2
2
  import type { WorkDocumentCaptionKind } from '../work-document-captions';
3
+ import { type WorkDocumentChange } from '../work-document-changes';
3
4
  import type { WorkDocumentFieldKind } from '../work-document-fields';
4
5
  import type { WorkDocumentLayoutFont } from '../work-document-fonts';
5
6
  import type { WorkDocumentNoteKind } from '../work-document-notes';
@@ -14,6 +15,8 @@ export type DocumentViewMode = 'page' | 'web';
14
15
  interface DocumentToolbarProps {
15
16
  editor: Editor;
16
17
  defaultRibbonCollapsed?: boolean;
18
+ reviewOnly?: boolean;
19
+ suggestionOnly?: boolean;
17
20
  history?: {
18
21
  canRedo: boolean;
19
22
  canUndo: boolean;
@@ -70,8 +73,9 @@ interface DocumentToolbarProps {
70
73
  onRibbonTabChange?: (tab: DocumentRibbonTabId) => boolean | undefined | Promise<boolean | undefined>;
71
74
  onToggleTrackChanges: () => void;
72
75
  onToggleChanges: () => void;
76
+ onDecideChange?: (change: WorkDocumentChange, decision: 'accept' | 'reject') => boolean;
73
77
  onOpenWordCount: () => void;
74
78
  onOpenFindReplace: (mode: DocumentFindReplaceMode) => void;
75
79
  }
76
- export declare function DocumentToolbar({ editor, defaultRibbonCollapsed, history, layoutOpen, layout, layoutFonts, navigationOpen, pageColor, showPageNumbers, showRulers, spellcheckEnabled, viewMode, zoom, pageChromeEditor, pageChromeEditingPart, pageChromeShowPageNumber, onRequestImage, onPageChromeEditingPartChange, onClosePageChrome, onTogglePageChromePageNumber, onToggleLayout, onLayoutChange, onOpenLayout, onToggleNavigation, onTogglePageNumbers, onToggleRulers, onPageColorChange, onToggleSpellcheck, onViewModeChange, onZoomChange, onZoomFit, onInsertSection, onInsertNote, onInsertCaption, onInsertCrossReference, citationsOpen, citationSourceCount, onToggleCitations, onInsertField, onRefreshFields, canInsertComment, onInsertComment, commentsOpen, commentCount, onToggleComments, trackChanges, changesOpen, changeCount, findReplaceMode, fileActions, onRibbonTabChange, onToggleTrackChanges, onToggleChanges, onOpenWordCount, onOpenFindReplace, }: DocumentToolbarProps): import("react").JSX.Element;
80
+ export declare function DocumentToolbar({ editor, defaultRibbonCollapsed, reviewOnly, suggestionOnly, history, layoutOpen, layout, layoutFonts, navigationOpen, pageColor, showPageNumbers, showRulers, spellcheckEnabled, viewMode, zoom, pageChromeEditor, pageChromeEditingPart, pageChromeShowPageNumber, onRequestImage, onPageChromeEditingPartChange, onClosePageChrome, onTogglePageChromePageNumber, onToggleLayout, onLayoutChange, onOpenLayout, onToggleNavigation, onTogglePageNumbers, onToggleRulers, onPageColorChange, onToggleSpellcheck, onViewModeChange, onZoomChange, onZoomFit, onInsertSection, onInsertNote, onInsertCaption, onInsertCrossReference, citationsOpen, citationSourceCount, onToggleCitations, onInsertField, onRefreshFields, canInsertComment, onInsertComment, commentsOpen, commentCount, onToggleComments, trackChanges, changesOpen, changeCount, findReplaceMode, fileActions, onRibbonTabChange, onToggleTrackChanges, onToggleChanges, onDecideChange, onOpenWordCount, onOpenFindReplace, }: DocumentToolbarProps): import("react").JSX.Element;
77
81
  export {};
@@ -1,8 +1,10 @@
1
1
  import type { Editor } from '@tiptap/core';
2
+ import type { WorkOfficeCollaborationActor } from '../../../collaboration/office-collaboration';
2
3
  import { type WorkDocumentCommentView } from '../work-document-comments';
3
4
  import type { WorkDocumentContent } from '../work-types';
4
5
  import type { DocumentCommentDraft } from './document-comment-composer';
5
6
  export interface DocumentCommentsController {
7
+ canDeleteComment: (id: string) => boolean;
6
8
  canInsert: boolean;
7
9
  close: () => void;
8
10
  closeDraft: (restoreEditorFocus?: boolean) => void;
@@ -17,10 +19,13 @@ export interface DocumentCommentsController {
17
19
  toggleOpen: () => void;
18
20
  toggleResolved: (id: string) => void;
19
21
  }
20
- export declare function useDocumentComments({ contentRef, editor, onBeforeDraft, }: {
22
+ export declare function useDocumentComments({ actor, contentRef, deleteOwnOnly, editor, enabled, onBeforeDraft, }: {
23
+ actor?: WorkOfficeCollaborationActor;
21
24
  contentRef: {
22
25
  current: WorkDocumentContent;
23
26
  };
27
+ deleteOwnOnly?: boolean;
24
28
  editor: Editor | null;
29
+ enabled?: boolean;
25
30
  onBeforeDraft?: () => void;
26
31
  }): DocumentCommentsController;
@@ -1,8 +1,10 @@
1
1
  import { Mark } from '@tiptap/core';
2
2
  import { type Node as ProseMirrorNode } from '@tiptap/pm/model';
3
- export type WorkDocumentChangeKind = 'insertion' | 'deletion';
3
+ import type { WorkDocumentChangeKind } from './work-types';
4
+ export type { WorkDocumentChangeKind } from './work-types';
4
5
  export interface WorkDocumentChangeIdentity {
5
6
  id: string;
7
+ actorId?: string;
6
8
  author: string;
7
9
  date: string;
8
10
  }
@@ -22,8 +24,10 @@ declare module '@tiptap/core' {
22
24
  documentChange: {
23
25
  acceptAllDocumentChanges: () => ReturnType;
24
26
  acceptDocumentChange: (id: string) => ReturnType;
27
+ acceptDocumentChanges: (ids: readonly string[]) => ReturnType;
25
28
  rejectAllDocumentChanges: () => ReturnType;
26
29
  rejectDocumentChange: (id: string) => ReturnType;
30
+ rejectDocumentChanges: (ids: readonly string[]) => ReturnType;
27
31
  replaceDocumentTextWithTrackedChange: (from: number, to: number, text: string) => ReturnType;
28
32
  setDocumentTrackChanges: (enabled: boolean) => ReturnType;
29
33
  toggleDocumentTrackChanges: () => ReturnType;
@@ -32,4 +36,3 @@ declare module '@tiptap/core' {
32
36
  }
33
37
  export declare const DocumentChange: Mark<DocumentChangeOptions, any>;
34
38
  export declare function collectDocumentChanges(document: ProseMirrorNode): WorkDocumentChange[];
35
- export {};
@@ -7,7 +7,11 @@ export interface WorkDocumentCommentAnchor {
7
7
  to: number;
8
8
  anchorText: string;
9
9
  }
10
- export interface WorkDocumentCommentView extends WorkDocumentComment, WorkDocumentCommentAnchor {
10
+ export interface WorkDocumentCommentView extends WorkDocumentComment {
11
+ from: number | null;
12
+ to: number | null;
13
+ anchorText: string;
14
+ detached: boolean;
11
15
  }
12
16
  export interface WorkDocumentCommentRange {
13
17
  from: number;
@@ -8,5 +8,6 @@ export interface WorkDocumentExtensionOptions {
8
8
  createChange?: (kind: WorkDocumentChangeKind) => WorkDocumentChangeIdentity;
9
9
  onContentChange?: (content: WorkDocumentContent) => void;
10
10
  onTrackingChange?: (enabled: boolean) => void;
11
+ rotateTrackedTextIdentities?: () => boolean;
11
12
  }
12
13
  export declare function createWorkDocumentExtensions(options?: WorkDocumentExtensionOptions): Extensions;
@@ -11,6 +11,7 @@ export interface WorkDocumentParagraphIdentityRegistry {
11
11
  paragraphIds: Set<string>;
12
12
  }
13
13
  interface DocumentParagraphIdentityOptions {
14
+ rotateTextId: () => boolean;
14
15
  types: string[];
15
16
  }
16
17
  export declare const DOCUMENT_PARAGRAPH_ID_ATTRIBUTE = "data-office-paragraph-id";
@@ -9,7 +9,11 @@ export interface WorkDocumentTableRowIdentitySource {
9
9
  }
10
10
  export declare const DOCUMENT_TABLE_ROW_ID_ATTRIBUTE = "data-office-row-id";
11
11
  export declare const DOCUMENT_TABLE_ROW_TEXT_ID_ATTRIBUTE = "data-office-row-text-id";
12
- export declare const DocumentTableRowIdentity: Extension<any, any>;
12
+ interface DocumentTableRowIdentityOptions {
13
+ rotateTextId: () => boolean;
14
+ }
15
+ export declare const DocumentTableRowIdentity: Extension<DocumentTableRowIdentityOptions, any>;
13
16
  export declare function normalizeDocumentTableRowIdentity(source: WorkDocumentTableRowIdentitySource): WorkDocumentTableRowIdentity | null;
14
17
  export declare function documentTableRowIdentityFromElement(element: Element): WorkDocumentTableRowIdentity | null;
15
18
  export declare function applyDocumentTableRowIdentityToElement(element: Element, source: WorkDocumentTableRowIdentitySource): WorkDocumentTableRowIdentity | null;
19
+ export {};
@@ -102,9 +102,29 @@ export interface WorkDocumentContent {
102
102
  pageGeometry?: WorkDocumentPageGeometry;
103
103
  paperSource?: WorkDocumentPaperSource;
104
104
  trackChanges?: boolean;
105
+ changeDecisions?: WorkDocumentChangeDecision[];
105
106
  comments?: WorkDocumentComment[];
106
107
  bibliography?: WorkDocumentBibliography;
107
108
  }
109
+ export type WorkDocumentChangeKind = 'insertion' | 'deletion';
110
+ export type WorkDocumentChangeDecisionAction = 'accept' | 'reject';
111
+ /**
112
+ * Immutable audit record created when an editor accepts or rejects one
113
+ * collaborative tracked change.
114
+ */
115
+ export interface WorkDocumentChangeDecision {
116
+ id: string;
117
+ changeId: string;
118
+ changeKind: WorkDocumentChangeKind;
119
+ suggestedByActorId?: string;
120
+ suggestedBy: string;
121
+ suggestedAt: string;
122
+ text: string;
123
+ decision: WorkDocumentChangeDecisionAction;
124
+ decidedByActorId?: string;
125
+ decidedBy: string;
126
+ decidedAt: string;
127
+ }
108
128
  export interface WorkMarkdownContent {
109
129
  type: 'markdown';
110
130
  markdown: string;
@@ -148,12 +168,14 @@ export interface WorkDocumentBibliography {
148
168
  }
149
169
  export interface WorkDocumentCommentReply {
150
170
  id: string;
171
+ actorId?: string;
151
172
  author: string;
152
173
  date: string;
153
174
  text: string;
154
175
  }
155
176
  export interface WorkDocumentComment {
156
177
  id: string;
178
+ actorId?: string;
157
179
  author: string;
158
180
  date: string;
159
181
  text: string;
Binary file
package/dist/styles.css CHANGED
@@ -8742,6 +8742,10 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
8742
8742
  opacity: .64;
8743
8743
  }
8744
8744
 
8745
+ .work-document-comment-track > .work-document-comment-card.detached {
8746
+ border-left-color: var(--a3s-faint);
8747
+ }
8748
+
8745
8749
  .work-document-comment-draft-item, .work-document-comment-empty-item {
8746
8750
  display: contents;
8747
8751
  }
@@ -8860,10 +8864,17 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
8860
8864
  color: var(--a3s-faint);
8861
8865
  text-overflow: ellipsis;
8862
8866
  white-space: nowrap;
8867
+ align-items: center;
8868
+ gap: 4px;
8863
8869
  font-size: 8px;
8870
+ display: flex;
8864
8871
  overflow: hidden;
8865
8872
  }
8866
8873
 
8874
+ .work-document-comment-card.detached .work-document-comment-quote {
8875
+ color: var(--a3s-amber, #9a6700);
8876
+ }
8877
+
8867
8878
  .work-document-comment-thread {
8868
8879
  gap: 5px;
8869
8880
  padding-left: 38px;
@@ -11956,6 +11967,71 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
11956
11967
  grid-column: 2;
11957
11968
  }
11958
11969
 
11970
+ .work-document-change-decisions {
11971
+ border-top: 1px solid var(--a3s-line);
11972
+ background: var(--a3s-panel-soft);
11973
+ flex: none;
11974
+ gap: 7px;
11975
+ padding: 9px 10px 10px;
11976
+ display: grid;
11977
+ }
11978
+
11979
+ .work-document-change-decisions > header {
11980
+ color: var(--a3s-muted);
11981
+ justify-content: space-between;
11982
+ align-items: center;
11983
+ font-size: 10px;
11984
+ display: flex;
11985
+ }
11986
+
11987
+ .work-document-change-decisions > header strong {
11988
+ color: var(--a3s-ink);
11989
+ font-size: 11px;
11990
+ }
11991
+
11992
+ .work-document-change-decisions > ol {
11993
+ gap: 6px;
11994
+ max-height: 168px;
11995
+ margin: 0;
11996
+ padding: 0;
11997
+ list-style: none;
11998
+ display: grid;
11999
+ overflow: auto;
12000
+ }
12001
+
12002
+ .work-document-change-decisions li {
12003
+ border: 1px solid var(--a3s-line);
12004
+ background: var(--a3s-bg);
12005
+ border-radius: 6px;
12006
+ grid-template-columns: auto minmax(0, 1fr);
12007
+ gap: 3px 8px;
12008
+ padding: 7px 8px;
12009
+ display: grid;
12010
+ }
12011
+
12012
+ .work-document-change-decisions li > span {
12013
+ color: #267048;
12014
+ font-size: 9px;
12015
+ font-weight: 650;
12016
+ }
12017
+
12018
+ .work-document-change-decisions li[data-document-change-decision="reject"] > span {
12019
+ color: var(--a3s-red);
12020
+ }
12021
+
12022
+ .work-document-change-decisions li > strong {
12023
+ text-overflow: ellipsis;
12024
+ white-space: nowrap;
12025
+ font-size: 9px;
12026
+ overflow: hidden;
12027
+ }
12028
+
12029
+ .work-document-change-decisions li > small {
12030
+ color: var(--a3s-faint);
12031
+ grid-column: 2;
12032
+ font-size: 8px;
12033
+ }
12034
+
11959
12035
  .work-document-citations-panel.work-document-task-pane {
11960
12036
  max-height: none;
11961
12037
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a3s-lab/office",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "Open-source collaborative browser editors for documents, Markdown, spreadsheets, presentations, and PDFs.",
5
5
  "keywords": [
6
6
  "office",
@@ -90,15 +90,21 @@
90
90
  "playground:visual:spreadsheet-ribbon": "playwright test visual-tests/spreadsheet-ribbon.functional.spec.ts --config playwright.config.ts",
91
91
  "playground:visual:update": "playwright test --config playwright.config.ts --update-snapshots",
92
92
  "test": "rstest",
93
- "test:e2e": "bun run test:e2e:fixtures && a3s-test run tests/e2e/word-page-color.acl --json && a3s-test run tests/e2e/word-page-setup-phone.acl --json && a3s-test run tests/e2e/word-paragraph-layout-phone.acl --json && a3s-test run tests/e2e/word-list-formatting-phone.acl --json && a3s-test run tests/e2e/word-font-picker-phone.acl --json && a3s-test run tests/e2e/word-comments-drawer.acl --json && a3s-test run tests/e2e/word-comment-windowing.acl --json && a3s-test run tests/e2e/word-citations-phone.acl --json && a3s-test run tests/e2e/word-navigation-search.acl --json && a3s-test run tests/e2e/word-navigation-windowing.acl --json && a3s-test run tests/e2e/word-find-replace-phone.acl --json && a3s-test run tests/e2e/word-page-navigation.acl --json && a3s-test run tests/e2e/word-page-windowing.acl --json && a3s-test run tests/e2e/word-ai-question.acl --json && a3s-test run tests/e2e/word-picture-insert.acl --json && a3s-test run tests/e2e/word-picture-alt-text-phone.acl --json && a3s-test run tests/e2e/word-track-changes-phone.acl --json && a3s-test run tests/e2e/word-review-conflict-phone.acl --json && a3s-test run tests/e2e/word-revision-windowing.acl --json && a3s-test run tests/e2e/word-table-phone.acl --json && a3s-test run tests/e2e/word-table-borders.acl --json && a3s-test run tests/e2e/word-theme-table.acl --json && a3s-test run tests/e2e/word-styled-table.acl --json && a3s-test run tests/e2e/word-multi-page-table.acl --json && a3s-test run tests/e2e/word-cross-reference-phone.acl --json && a3s-test run tests/e2e/word-bookmark-links-phone.acl --json && a3s-test run tests/e2e/word-notes-phone.acl --json && a3s-test run tests/e2e/word-fields-phone.acl --json && a3s-test run tests/e2e/spreadsheet-phone-rename.acl --json && a3s-test run tests/e2e/spreadsheet-phone-find.acl --json && a3s-test run tests/e2e/spreadsheet-phone-context-menu.acl --json && a3s-test run tests/e2e/spreadsheet-phone-task-pane.acl --json && a3s-test run tests/e2e/presentation-cut-paste-focus.acl --json && a3s-test run tests/e2e/presentation-presenter-view.acl --json && a3s-test run tests/e2e/presentation-phone-chart-pane.acl --json && a3s-test run tests/e2e/presentation-phone-comments.acl --json && a3s-test run tests/e2e/pdf-thumbnail-keyboard.acl --json && a3s-test run tests/e2e/pdf-page-drawer-phone.acl --json && a3s-test run tests/e2e/markdown-phone-modes.acl --json && a3s-test run tests/e2e/office-sidebar-breakpoint.acl --json && a3s-test run tests/e2e/office-docs-navigation.acl --json && a3s-test run tests/e2e/collaboration-playground-entry.acl --json && a3s-test run tests/e2e/collaboration-participants.acl --json && a3s-test run tests/e2e/collaboration-pdf-annotations.acl --json && a3s-test run tests/e2e/collaboration-spreadsheet-cells.acl --json && a3s-test run tests/e2e/collaboration-presentation-elements.acl --json",
94
- "test:e2e:check": "bun run test:e2e:fixtures && a3s-test check tests/e2e/word-page-color.acl --json && a3s-test check tests/e2e/word-page-setup-phone.acl --json && a3s-test check tests/e2e/word-paragraph-layout-phone.acl --json && a3s-test check tests/e2e/word-list-formatting-phone.acl --json && a3s-test check tests/e2e/word-font-picker-phone.acl --json && a3s-test check tests/e2e/word-comments-drawer.acl --json && a3s-test check tests/e2e/word-comment-windowing.acl --json && a3s-test check tests/e2e/word-citations-phone.acl --json && a3s-test check tests/e2e/word-navigation-search.acl --json && a3s-test check tests/e2e/word-navigation-windowing.acl --json && a3s-test check tests/e2e/word-find-replace-phone.acl --json && a3s-test check tests/e2e/word-page-navigation.acl --json && a3s-test check tests/e2e/word-page-windowing.acl --json && a3s-test check tests/e2e/word-ai-question.acl --json && a3s-test check tests/e2e/word-picture-insert.acl --json && a3s-test check tests/e2e/word-picture-alt-text-phone.acl --json && a3s-test check tests/e2e/word-track-changes-phone.acl --json && a3s-test check tests/e2e/word-review-conflict-phone.acl --json && a3s-test check tests/e2e/word-revision-windowing.acl --json && a3s-test check tests/e2e/word-table-phone.acl --json && a3s-test check tests/e2e/word-table-borders.acl --json && a3s-test check tests/e2e/word-theme-table.acl --json && a3s-test check tests/e2e/word-styled-table.acl --json && a3s-test check tests/e2e/word-multi-page-table.acl --json && a3s-test check tests/e2e/word-cross-reference-phone.acl --json && a3s-test check tests/e2e/word-bookmark-links-phone.acl --json && a3s-test check tests/e2e/word-notes-phone.acl --json && a3s-test check tests/e2e/word-fields-phone.acl --json && a3s-test check tests/e2e/spreadsheet-phone-rename.acl --json && a3s-test check tests/e2e/spreadsheet-phone-find.acl --json && a3s-test check tests/e2e/spreadsheet-phone-context-menu.acl --json && a3s-test check tests/e2e/spreadsheet-phone-task-pane.acl --json && a3s-test check tests/e2e/presentation-cut-paste-focus.acl --json && a3s-test check tests/e2e/presentation-presenter-view.acl --json && a3s-test check tests/e2e/presentation-phone-chart-pane.acl --json && a3s-test check tests/e2e/presentation-phone-comments.acl --json && a3s-test check tests/e2e/pdf-thumbnail-keyboard.acl --json && a3s-test check tests/e2e/pdf-page-drawer-phone.acl --json && a3s-test check tests/e2e/markdown-phone-modes.acl --json && a3s-test check tests/e2e/office-sidebar-breakpoint.acl --json && a3s-test check tests/e2e/office-docs-navigation.acl --json && a3s-test check tests/e2e/collaboration-playground-entry.acl --json && a3s-test check tests/e2e/collaboration-participants.acl --json && a3s-test check tests/e2e/collaboration-pdf-annotations.acl --json && a3s-test check tests/e2e/collaboration-spreadsheet-cells.acl --json && a3s-test check tests/e2e/collaboration-presentation-elements.acl --json",
93
+ "test:e2e": "bun run test:e2e:fixtures && a3s-test run tests/e2e/word-page-color.acl --json && a3s-test run tests/e2e/word-page-setup-phone.acl --json && a3s-test run tests/e2e/word-paragraph-layout-phone.acl --json && a3s-test run tests/e2e/word-list-formatting-phone.acl --json && a3s-test run tests/e2e/word-font-picker-phone.acl --json && a3s-test run tests/e2e/word-comments-drawer.acl --json && a3s-test run tests/e2e/word-comment-windowing.acl --json && a3s-test run tests/e2e/word-citations-phone.acl --json && a3s-test run tests/e2e/word-navigation-search.acl --json && a3s-test run tests/e2e/word-navigation-windowing.acl --json && a3s-test run tests/e2e/word-find-replace-phone.acl --json && a3s-test run tests/e2e/word-page-navigation.acl --json && a3s-test run tests/e2e/word-page-windowing.acl --json && a3s-test run tests/e2e/word-ai-question.acl --json && a3s-test run tests/e2e/word-picture-insert.acl --json && a3s-test run tests/e2e/word-picture-alt-text-phone.acl --json && a3s-test run tests/e2e/word-track-changes-phone.acl --json && a3s-test run tests/e2e/word-review-conflict-phone.acl --json && a3s-test run tests/e2e/word-revision-windowing.acl --json && a3s-test run tests/e2e/word-table-phone.acl --json && a3s-test run tests/e2e/word-table-borders.acl --json && a3s-test run tests/e2e/word-theme-table.acl --json && a3s-test run tests/e2e/word-styled-table.acl --json && a3s-test run tests/e2e/word-multi-page-table.acl --json && a3s-test run tests/e2e/word-cross-reference-phone.acl --json && a3s-test run tests/e2e/word-bookmark-links-phone.acl --json && a3s-test run tests/e2e/word-notes-phone.acl --json && a3s-test run tests/e2e/word-fields-phone.acl --json && a3s-test run tests/e2e/spreadsheet-phone-rename.acl --json && a3s-test run tests/e2e/spreadsheet-phone-find.acl --json && a3s-test run tests/e2e/spreadsheet-phone-context-menu.acl --json && a3s-test run tests/e2e/spreadsheet-phone-task-pane.acl --json && a3s-test run tests/e2e/presentation-cut-paste-focus.acl --json && a3s-test run tests/e2e/presentation-presenter-view.acl --json && a3s-test run tests/e2e/presentation-phone-chart-pane.acl --json && a3s-test run tests/e2e/presentation-phone-comments.acl --json && a3s-test run tests/e2e/pdf-thumbnail-keyboard.acl --json && a3s-test run tests/e2e/pdf-page-drawer-phone.acl --json && a3s-test run tests/e2e/markdown-phone-modes.acl --json && a3s-test run tests/e2e/office-sidebar-breakpoint.acl --json && a3s-test run tests/e2e/office-docs-navigation.acl --json && a3s-test run tests/e2e/collaboration-playground-entry.acl --json && a3s-test run tests/e2e/collaboration-document-comments.acl --command-timeout-ms 120000 --json && a3s-test run tests/e2e/collaboration-document-suggestions.acl --command-timeout-ms 120000 --json && a3s-test run tests/e2e/collaboration-participants.acl --json && a3s-test run tests/e2e/collaboration-pdf-annotations.acl --json && a3s-test run tests/e2e/collaboration-spreadsheet-cells.acl --json && a3s-test run tests/e2e/collaboration-presentation-elements.acl --json",
94
+ "test:e2e:check": "bun run test:e2e:fixtures && a3s-test check tests/e2e/word-page-color.acl --json && a3s-test check tests/e2e/word-page-setup-phone.acl --json && a3s-test check tests/e2e/word-paragraph-layout-phone.acl --json && a3s-test check tests/e2e/word-list-formatting-phone.acl --json && a3s-test check tests/e2e/word-font-picker-phone.acl --json && a3s-test check tests/e2e/word-comments-drawer.acl --json && a3s-test check tests/e2e/word-comment-windowing.acl --json && a3s-test check tests/e2e/word-citations-phone.acl --json && a3s-test check tests/e2e/word-navigation-search.acl --json && a3s-test check tests/e2e/word-navigation-windowing.acl --json && a3s-test check tests/e2e/word-find-replace-phone.acl --json && a3s-test check tests/e2e/word-page-navigation.acl --json && a3s-test check tests/e2e/word-page-windowing.acl --json && a3s-test check tests/e2e/word-ai-question.acl --json && a3s-test check tests/e2e/word-picture-insert.acl --json && a3s-test check tests/e2e/word-picture-alt-text-phone.acl --json && a3s-test check tests/e2e/word-track-changes-phone.acl --json && a3s-test check tests/e2e/word-review-conflict-phone.acl --json && a3s-test check tests/e2e/word-revision-windowing.acl --json && a3s-test check tests/e2e/word-table-phone.acl --json && a3s-test check tests/e2e/word-table-borders.acl --json && a3s-test check tests/e2e/word-theme-table.acl --json && a3s-test check tests/e2e/word-styled-table.acl --json && a3s-test check tests/e2e/word-multi-page-table.acl --json && a3s-test check tests/e2e/word-cross-reference-phone.acl --json && a3s-test check tests/e2e/word-bookmark-links-phone.acl --json && a3s-test check tests/e2e/word-notes-phone.acl --json && a3s-test check tests/e2e/word-fields-phone.acl --json && a3s-test check tests/e2e/spreadsheet-phone-rename.acl --json && a3s-test check tests/e2e/spreadsheet-phone-find.acl --json && a3s-test check tests/e2e/spreadsheet-phone-context-menu.acl --json && a3s-test check tests/e2e/spreadsheet-phone-task-pane.acl --json && a3s-test check tests/e2e/presentation-cut-paste-focus.acl --json && a3s-test check tests/e2e/presentation-presenter-view.acl --json && a3s-test check tests/e2e/presentation-phone-chart-pane.acl --json && a3s-test check tests/e2e/presentation-phone-comments.acl --json && a3s-test check tests/e2e/pdf-thumbnail-keyboard.acl --json && a3s-test check tests/e2e/pdf-page-drawer-phone.acl --json && a3s-test check tests/e2e/markdown-phone-modes.acl --json && a3s-test check tests/e2e/office-sidebar-breakpoint.acl --json && a3s-test check tests/e2e/office-docs-navigation.acl --json && a3s-test check tests/e2e/collaboration-playground-entry.acl --json && a3s-test check tests/e2e/collaboration-document-comments.acl --json && a3s-test check tests/e2e/collaboration-document-suggestions.acl --json && a3s-test check tests/e2e/collaboration-participants.acl --json && a3s-test check tests/e2e/collaboration-pdf-annotations.acl --json && a3s-test check tests/e2e/collaboration-spreadsheet-cells.acl --json && a3s-test check tests/e2e/collaboration-presentation-elements.acl --json",
95
95
  "test:e2e:fixtures": "bun scripts/create-e2e-fixtures.ts",
96
96
  "test:e2e:initial-focus": "a3s-test run tests/e2e/office-editor-initial-focus.acl --json",
97
97
  "test:e2e:initial-focus:check": "a3s-test check tests/e2e/office-editor-initial-focus.acl --json",
98
+ "test:e2e:docs": "a3s-test run tests/e2e/office-docs-navigation.acl --json",
99
+ "test:e2e:docs:check": "a3s-test check tests/e2e/office-docs-navigation.acl --json",
98
100
  "test:e2e:collaboration-participants": "a3s-test run tests/e2e/collaboration-participants.acl --json",
99
101
  "test:e2e:collaboration-participants:check": "a3s-test check tests/e2e/collaboration-participants.acl --json",
100
102
  "test:e2e:collaboration-playground": "a3s-test run tests/e2e/collaboration-playground-entry.acl --json",
101
103
  "test:e2e:collaboration-playground:check": "a3s-test check tests/e2e/collaboration-playground-entry.acl --json",
104
+ "test:e2e:collaboration-document-comments": "a3s-test run tests/e2e/collaboration-document-comments.acl --command-timeout-ms 120000 --json",
105
+ "test:e2e:collaboration-document-comments:check": "a3s-test check tests/e2e/collaboration-document-comments.acl --json",
106
+ "test:e2e:collaboration-document-suggestions": "a3s-test run tests/e2e/collaboration-document-suggestions.acl --command-timeout-ms 120000 --json",
107
+ "test:e2e:collaboration-document-suggestions:check": "a3s-test check tests/e2e/collaboration-document-suggestions.acl --json",
102
108
  "test:e2e:collaboration-pdf-annotations": "a3s-test run tests/e2e/collaboration-pdf-annotations.acl --json",
103
109
  "test:e2e:collaboration-pdf-annotations:check": "a3s-test check tests/e2e/collaboration-pdf-annotations.acl --json",
104
110
  "test:e2e:collaboration-spreadsheet-cells": "a3s-test run tests/e2e/collaboration-spreadsheet-cells.acl --json",
@@ -175,7 +181,10 @@
175
181
  },
176
182
  "devDependencies": {
177
183
  "@biomejs/biome": "2.4.15",
184
+ "@fontsource-variable/geist": "^5.3.0",
185
+ "@fontsource-variable/geist-mono": "^5.3.0",
178
186
  "@rspress/core": "^2.0.17",
187
+ "@rspress/shared": "2.0.19",
179
188
  "@playwright/test": "1.61.1",
180
189
  "@rsbuild/core": "^2.1.5",
181
190
  "@rsbuild/plugin-react": "^2.1.0",