@a3s-lab/office 0.48.0 → 0.49.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.
package/dist/styles.css CHANGED
@@ -7650,6 +7650,39 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
7650
7650
  min-width: 12px;
7651
7651
  }
7652
7652
 
7653
+ .work-document-selection-toolbar .work-document-underline-split-root > button, .work-document-selection-toolbar .work-document-strike-split-root > button {
7654
+ color: var(--a3s-muted);
7655
+ cursor: pointer;
7656
+ appearance: none;
7657
+ touch-action: manipulation;
7658
+ background: none;
7659
+ border: 1px solid #0000;
7660
+ flex: none;
7661
+ place-items: center;
7662
+ margin: 0;
7663
+ display: inline-grid;
7664
+ }
7665
+
7666
+ .work-document-selection-toolbar .work-document-underline-split-root > button:hover, .work-document-selection-toolbar .work-document-strike-split-root > button:hover {
7667
+ border-color: var(--a3s-line);
7668
+ background: var(--a3s-panel-soft);
7669
+ color: var(--a3s-ink);
7670
+ }
7671
+
7672
+ .work-document-selection-toolbar .work-document-underline-split-root > button[aria-pressed="true"], .work-document-selection-toolbar .work-document-strike-split-root > button[aria-pressed="true"] {
7673
+ border-color: color-mix(in srgb,
7674
+ var(--work-office-accent) 28%,
7675
+ var(--a3s-line));
7676
+ background: color-mix(in srgb,
7677
+ var(--work-office-accent) 11%,
7678
+ var(--a3s-panel));
7679
+ color: var(--work-office-accent);
7680
+ }
7681
+
7682
+ .work-document-selection-toolbar .work-document-underline-split-root > .work-document-underline-primary, .work-document-selection-toolbar .work-document-strike-split-root > .work-document-strike-primary, .work-document-selection-toolbar .work-document-underline-split-root > .work-document-underline-primary:hover, .work-document-selection-toolbar .work-document-strike-split-root > .work-document-strike-primary:hover, .work-document-selection-toolbar .work-document-underline-split-root > .work-document-underline-primary[aria-pressed="true"], .work-document-selection-toolbar .work-document-strike-split-root > .work-document-strike-primary[aria-pressed="true"] {
7683
+ border-right-color: #0000;
7684
+ }
7685
+
7653
7686
  .work-document-selection-toolbar > .work-document-underline-control {
7654
7687
  gap: 0;
7655
7688
  height: 28px;
@@ -9223,6 +9256,10 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
9223
9256
  border-left-color: #0f7b78;
9224
9257
  }
9225
9258
 
9259
+ .work-document-change-item.move {
9260
+ border-left-color: #b06a1f;
9261
+ }
9262
+
9226
9263
  .work-document-change-summary {
9227
9264
  min-width: 0;
9228
9265
  color: var(--a3s-ink);
@@ -9259,6 +9296,11 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
9259
9296
  background: #e5f5f3;
9260
9297
  }
9261
9298
 
9299
+ .work-document-change-list .work-document-change-item.move .work-document-change-summary > span {
9300
+ color: #8a4f0f;
9301
+ background: #fff3df;
9302
+ }
9303
+
9262
9304
  .work-document-change-summary strong {
9263
9305
  text-overflow: ellipsis;
9264
9306
  white-space: nowrap;
@@ -283,6 +283,14 @@ DOCX import/export maps that model to strict or transitional `w:pPrChange`,
283
283
  while Yjs stores the same node attributes and immutable decision audit without a
284
284
  parallel transport model.
285
285
 
286
+ Text-only move revisions are a paired inline concern rather than two unrelated
287
+ insert/delete cards. A `move` identity keeps explicit `from` and `to` roles;
288
+ review navigation targets the destination side, while accept or reject validates
289
+ and resolves both equal-text sides in one transaction. Native DOCX import/export
290
+ maps the pair to strict or transitional `w:moveFrom`/`w:moveTo`, and the Yjs
291
+ sidecar stores one immutable `changeKind: "move"` decision record for the
292
+ complete intent.
293
+
286
294
  Document comparison is a pure planning boundary before the editor transaction.
287
295
  The current and imported TipTap/ProseMirror trees remain immutable while a
288
296
  deterministic weighted block alignment pairs related paragraphs and headings;
@@ -291,7 +299,9 @@ and paragraph-property snapshots produce character- and paragraph-formatting
291
299
  revisions. Stable semantic signatures seed generated identities, so the same
292
300
  inputs and options produce the same ordering and IDs. Only a fully admitted
293
301
  plan replaces the mounted document, and that replacement is one transaction,
294
- one controlled publication, and one Undo record.
302
+ one controlled publication, and one Undo record. The planner does not infer
303
+ move pairs from arbitrary delete/insert similarities; native paired moves remain
304
+ reviewable when they already exist.
295
305
 
296
306
  Combine validates rather than guesses. It rejects every imported revision on
297
307
  an immutable reviewed snapshot and compares the resulting semantic signature
@@ -580,7 +590,9 @@ The public formatting fixture also exercises the non-windowed review boundary
580
590
  with independent character- and paragraph-formatting cards. Focused A3S Test
581
591
  suites reject each kind separately, verify that text and the other revision
582
592
  remain intact, and prove full paragraph alignment, indentation, spacing, and
583
- line-height restoration with clean browser diagnostics.
593
+ line-height restoration with clean browser diagnostics. Focused move fixtures
594
+ verify paired source/destination resolution, destination-only navigation,
595
+ immutable collaboration audit, and native DOCX reopen without marker leakage.
584
596
 
585
597
  Spreadsheet now uses a persistent browser Rust/WASM calculation session. The
586
598
  editor initializes it with a sparse workbook replacement, sends bounded cell
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a3s-lab/office",
3
- "version": "0.48.0",
3
+ "version": "0.49.0",
4
4
  "description": "Open-source collaborative browser editors for documents, Markdown, spreadsheets, presentations, and PDFs.",
5
5
  "keywords": [
6
6
  "office",
@@ -87,12 +87,14 @@
87
87
  "playground:preview": "rspress preview -c website/rspress.config.ts --host 127.0.0.1 --port 4175",
88
88
  "playground:typecheck": "tsc --noEmit -p playground/tsconfig.json",
89
89
  "playground:ime:webkit": "playwright test --config playwright.ime.config.ts",
90
+ "playground:testkit": "playwright test --config playwright.testkit.config.ts",
90
91
  "playground:visual": "playwright test --config playwright.config.ts",
91
92
  "playground:visual:docs-changelog": "playwright test visual-tests/docs-changelog.functional.spec.ts --config playwright.config.ts",
92
93
  "playground:visual:home": "playwright test visual-tests/playground-home.functional.spec.ts --config playwright.config.ts",
93
94
  "playground:visual:document-emphasis": "playwright test visual-tests/document-emphasis.functional.spec.ts --config playwright.config.ts",
94
95
  "playground:visual:document-index": "playwright test visual-tests/document-index.functional.spec.ts --config playwright.config.ts",
95
96
  "playground:visual:document-comparison": "playwright test visual-tests/document-comparison.functional.spec.ts --config playwright.config.ts",
97
+ "playground:visual:document-move-revision": "playwright test visual-tests/document-move-revision.functional.spec.ts --config playwright.config.ts",
96
98
  "playground:visual:document-hidden-text": "playwright test visual-tests/document-hidden-text.functional.spec.ts --config playwright.config.ts",
97
99
  "playground:visual:document-legacy-text-effects": "playwright test visual-tests/document-legacy-text-effects.functional.spec.ts --config playwright.config.ts",
98
100
  "playground:visual:document-proofing-languages": "playwright test visual-tests/document-proofing-languages.functional.spec.ts --config playwright.config.ts",
@@ -140,8 +142,12 @@
140
142
  "performance:pdf": "bun .a3s-test/performance/generate-fixtures.ts --pdf-only && bun .a3s-test/performance/benchmark-pdf.ts --url http://127.0.0.1:4175/playground/ --runs 3 --timeout-ms 120000",
141
143
  "performance:presentation": "bun .a3s-test/performance/generate-fixtures.ts --presentations-only && bun .a3s-test/performance/benchmark-presentation.ts --url http://127.0.0.1:4175/playground/ --runs 3 --timeout-ms 120000 --modes default,content-visibility",
142
144
  "test": "rstest",
143
- "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-text-box-phone.acl --json && a3s-test run tests/e2e/word-content-controls-phone.acl --json && a3s-test run tests/e2e/word-track-changes-phone.acl --json && a3s-test run tests/e2e/word-formatting-revision.acl --json && a3s-test run tests/e2e/word-paragraph-formatting-revision.acl --json && a3s-test run tests/e2e/word-numbering-revision.acl --json && a3s-test run tests/e2e/word-document-comparison.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/spreadsheet-maximum-sparse.acl --json && a3s-test run tests/e2e/spreadsheet-cell-style.acl --json && a3s-test run tests/e2e/spreadsheet-paste-special.acl --json && a3s-test run tests/e2e/spreadsheet-hyperlink.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",
144
- "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-text-box-phone.acl --json && a3s-test check tests/e2e/word-content-controls-phone.acl --json && a3s-test check tests/e2e/word-track-changes-phone.acl --json && a3s-test check tests/e2e/word-formatting-revision.acl --json && a3s-test check tests/e2e/word-paragraph-formatting-revision.acl --json && a3s-test check tests/e2e/word-numbering-revision.acl --json && a3s-test check tests/e2e/word-document-comparison.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/spreadsheet-maximum-sparse.acl --json && a3s-test check tests/e2e/spreadsheet-cell-style.acl --json && a3s-test check tests/e2e/spreadsheet-paste-special.acl --json && a3s-test check tests/e2e/spreadsheet-hyperlink.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",
145
+ "test:e2e": "bun run test:e2e:fixtures && A3S_TEST_SUITE=all bash scripts/run-a3s-test-web-gate.sh && bun run test:e2e:testkit",
146
+ "test:e2e:check": "bun run test:e2e:fixtures && bun scripts/check-a3s-test-suites.ts",
147
+ "test:e2e:testkit": "bash scripts/run-a3s-testkit-ui-gate.sh",
148
+ "test:e2e:testkit:check": "A3S_TEST_SUITE=office-testkit-ui.acl bun scripts/check-a3s-test-suites.ts",
149
+ "test:e2e:all": "bun run test:e2e",
150
+ "test:e2e:all:check": "bun run test:e2e:check",
145
151
  "test:e2e:writer-text-box": "bun run test:e2e:fixtures && A3S_TEST_SUITE=tests/e2e/word-text-box-phone.acl bash scripts/run-a3s-test-web-gate.sh",
146
152
  "test:e2e:writer-text-box:check": "a3s-test check tests/e2e/word-text-box-phone.acl --json",
147
153
  "test:e2e:writer-content-control": "bun run test:e2e:fixtures && A3S_TEST_SUITE=tests/e2e/word-content-controls-phone.acl bash scripts/run-a3s-test-web-gate.sh",
@@ -293,6 +299,8 @@
293
299
  "test:e2e:writer-formatting-revision:check": "a3s-test check tests/e2e/word-formatting-revision.acl --json",
294
300
  "test:e2e:writer-paragraph-formatting-revision": "a3s-test run tests/e2e/word-paragraph-formatting-revision.acl --json",
295
301
  "test:e2e:writer-paragraph-formatting-revision:check": "a3s-test check tests/e2e/word-paragraph-formatting-revision.acl --json",
302
+ "test:e2e:writer-move-revision": "a3s-test run tests/e2e/word-move-revision.acl --json",
303
+ "test:e2e:writer-move-revision:check": "a3s-test check tests/e2e/word-move-revision.acl --json",
296
304
  "test:e2e:writer-status": "a3s-test run tests/e2e/word-status-bar.acl --json",
297
305
  "test:e2e:writer-status:check": "a3s-test check tests/e2e/word-status-bar.acl --json",
298
306
  "test:wps-layout": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/test-wps-layout-parity.ps1",