@a3s-lab/office 0.30.0 → 0.32.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 (45) hide show
  1. package/README.md +25 -5
  2. package/dist/{0~7231.js → 0~4808.js} +190 -3
  3. package/dist/0~4980.js +1 -1
  4. package/dist/0~5050.js +10 -1
  5. package/dist/{0~7360.js → 0~7240.js} +245 -16
  6. package/dist/0~7614.js +1 -1
  7. package/dist/0~document-editor.js +1756 -178
  8. package/dist/0~spreadsheet-editor.js +2 -1
  9. package/dist/0~work-docx-export.js +215 -27
  10. package/dist/0~work-docx-import.js +27 -33
  11. package/dist/0~work-docx-large-document-import.js +1 -1
  12. package/dist/0~work-office-diagnostics.js +28 -7
  13. package/dist/0~work-pptx-import.js +1 -1
  14. package/dist/{1544.js → 3266.js} +17 -1862
  15. package/dist/4121.js +425 -11
  16. package/dist/4166.js +3848 -0
  17. package/dist/{6282.js → 4174.js} +812 -10
  18. package/dist/9333.js +1849 -0
  19. package/dist/core.js +5259 -4
  20. package/dist/index.js +3 -3
  21. package/dist/internal/features/work/editors/document-command-catalog.d.ts +27 -0
  22. package/dist/internal/features/work/editors/document-compare-dialog.d.ts +14 -0
  23. package/dist/internal/features/work/editors/document-dom-selection.d.ts +7 -0
  24. package/dist/internal/features/work/editors/document-editor-support.d.ts +1 -0
  25. package/dist/internal/features/work/editors/document-index-dialog.d.ts +10 -0
  26. package/dist/internal/features/work/editors/document-index-entry-dialog.d.ts +10 -0
  27. package/dist/internal/features/work/editors/document-references-ribbon.d.ts +19 -0
  28. package/dist/internal/features/work/editors/document-toolbar.d.ts +6 -1
  29. package/dist/internal/features/work/editors/use-document-comparison.d.ts +9 -0
  30. package/dist/internal/features/work/editors/use-document-insert-commands.d.ts +3 -0
  31. package/dist/internal/features/work/work-document-changes.d.ts +5 -0
  32. package/dist/internal/features/work/work-document-compare-diff.d.ts +38 -0
  33. package/dist/internal/features/work/work-document-compare-stability.d.ts +5 -0
  34. package/dist/internal/features/work/work-document-compare.d.ts +27 -0
  35. package/dist/internal/features/work/work-document-index-fields.d.ts +19 -0
  36. package/dist/internal/features/work/work-document-index-nodes.d.ts +32 -0
  37. package/dist/internal/features/work/work-document-index.d.ts +63 -0
  38. package/dist/internal/features/work/work-docx-import.d.ts +3 -1
  39. package/dist/internal/features/work/work-docx-index-export.d.ts +14 -0
  40. package/dist/internal/features/work/work-docx-index-import.d.ts +23 -0
  41. package/dist/office-kernel.wasm +0 -0
  42. package/dist/styles.css +490 -0
  43. package/docs/latest/en/browser-editor-architecture.md +37 -0
  44. package/package.json +9 -3
  45. package/dist/4104.js +0 -9336
package/dist/styles.css CHANGED
@@ -9930,6 +9930,200 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
9930
9930
  }
9931
9931
  }
9932
9932
 
9933
+ .work-document-compare-dialog {
9934
+ width: min(650px, 100%);
9935
+ }
9936
+
9937
+ .work-document-compare-dialog form {
9938
+ gap: 15px;
9939
+ display: grid;
9940
+ }
9941
+
9942
+ .work-document-compare-mode {
9943
+ border: 0;
9944
+ grid-template-columns: repeat(2, minmax(0, 1fr));
9945
+ gap: 10px;
9946
+ margin: 0;
9947
+ padding: 0;
9948
+ display: grid;
9949
+ }
9950
+
9951
+ .work-document-compare-mode > legend {
9952
+ color: var(--a3s-muted);
9953
+ margin-bottom: 8px;
9954
+ font-size: 11px;
9955
+ font-weight: 700;
9956
+ }
9957
+
9958
+ .work-document-compare-mode > label {
9959
+ cursor: pointer;
9960
+ min-width: 0;
9961
+ position: relative;
9962
+ }
9963
+
9964
+ .work-document-compare-mode input {
9965
+ opacity: 0;
9966
+ width: 1px;
9967
+ height: 1px;
9968
+ position: absolute;
9969
+ }
9970
+
9971
+ .work-document-compare-mode label > span {
9972
+ border: 1px solid var(--a3s-line);
9973
+ background: var(--a3s-panel);
9974
+ border-radius: 10px;
9975
+ grid-template-columns: auto minmax(0, 1fr);
9976
+ align-content: start;
9977
+ gap: 4px 9px;
9978
+ min-height: 94px;
9979
+ padding: 13px 14px;
9980
+ transition: border-color .14s, background-color .14s;
9981
+ display: grid;
9982
+ }
9983
+
9984
+ .work-document-compare-mode label:hover > span {
9985
+ border-color: var(--a3s-line-strong);
9986
+ background: var(--a3s-panel-soft);
9987
+ }
9988
+
9989
+ .work-document-compare-mode input:checked + span {
9990
+ border-color: var(--a3s-accent);
9991
+ background: color-mix(in srgb, var(--a3s-accent) 8%, var(--a3s-panel));
9992
+ }
9993
+
9994
+ .work-document-compare-mode input:focus-visible + span {
9995
+ outline: 2px solid var(--a3s-accent);
9996
+ outline-offset: 2px;
9997
+ }
9998
+
9999
+ .work-document-compare-mode svg {
10000
+ color: var(--a3s-accent);
10001
+ grid-row: 1 / span 2;
10002
+ }
10003
+
10004
+ .work-document-compare-mode strong {
10005
+ font-size: 13px;
10006
+ line-height: 1.2;
10007
+ }
10008
+
10009
+ .work-document-compare-mode small {
10010
+ color: var(--a3s-muted);
10011
+ font-size: 11px;
10012
+ line-height: 1.45;
10013
+ }
10014
+
10015
+ .work-document-compare-file {
10016
+ border: 1px dashed var(--a3s-line-strong);
10017
+ background: var(--a3s-panel-soft);
10018
+ width: 100%;
10019
+ min-height: 78px;
10020
+ color: var(--a3s-ink);
10021
+ text-align: left;
10022
+ cursor: pointer;
10023
+ border-radius: 10px;
10024
+ outline: 0;
10025
+ grid-template-columns: auto minmax(0, 1fr);
10026
+ align-items: center;
10027
+ gap: 12px;
10028
+ padding: 13px 15px;
10029
+ display: grid;
10030
+ }
10031
+
10032
+ .work-document-compare-file:hover:not(:disabled) {
10033
+ border-color: var(--a3s-accent);
10034
+ }
10035
+
10036
+ .work-document-compare-file:focus-visible {
10037
+ outline: 2px solid var(--a3s-accent);
10038
+ outline-offset: 2px;
10039
+ }
10040
+
10041
+ .work-document-compare-file:disabled {
10042
+ cursor: wait;
10043
+ opacity: .65;
10044
+ }
10045
+
10046
+ .work-document-compare-file > svg {
10047
+ color: var(--a3s-accent);
10048
+ }
10049
+
10050
+ .work-document-compare-file > span, .work-document-compare-author {
10051
+ gap: 4px;
10052
+ min-width: 0;
10053
+ display: grid;
10054
+ }
10055
+
10056
+ .work-document-compare-file strong {
10057
+ text-overflow: ellipsis;
10058
+ white-space: nowrap;
10059
+ font-size: 13px;
10060
+ overflow: hidden;
10061
+ }
10062
+
10063
+ .work-document-compare-file small, .work-document-compare-author small {
10064
+ color: var(--a3s-muted);
10065
+ font-size: 11px;
10066
+ line-height: 1.45;
10067
+ }
10068
+
10069
+ .work-document-compare-author > span {
10070
+ color: var(--a3s-muted);
10071
+ font-size: 11px;
10072
+ font-weight: 700;
10073
+ }
10074
+
10075
+ .work-document-compare-author .work-office-text-field {
10076
+ width: 100%;
10077
+ }
10078
+
10079
+ .work-document-compare-boundary, .work-document-compare-status, .work-document-compare-errors {
10080
+ border: 1px solid var(--a3s-line);
10081
+ border-radius: 9px;
10082
+ margin: 0;
10083
+ padding: 12px 14px;
10084
+ font-size: 11px;
10085
+ line-height: 1.5;
10086
+ }
10087
+
10088
+ .work-document-compare-boundary {
10089
+ background: var(--a3s-panel-soft);
10090
+ }
10091
+
10092
+ .work-document-compare-boundary > strong, .work-document-compare-errors > strong {
10093
+ font-size: 12px;
10094
+ }
10095
+
10096
+ .work-document-compare-boundary > p {
10097
+ color: var(--a3s-muted);
10098
+ margin: 3px 0 0;
10099
+ }
10100
+
10101
+ .work-document-compare-status {
10102
+ border-color: color-mix(in srgb, var(--a3s-green) 42%, var(--a3s-line));
10103
+ color: var(--a3s-green);
10104
+ }
10105
+
10106
+ .work-document-compare-errors {
10107
+ border-color: color-mix(in srgb, var(--a3s-red) 35%, var(--a3s-line));
10108
+ background: color-mix(in srgb, var(--a3s-red) 5%, var(--a3s-panel));
10109
+ color: var(--a3s-red);
10110
+ }
10111
+
10112
+ .work-document-compare-errors ul {
10113
+ margin: 5px 0 0;
10114
+ padding-left: 18px;
10115
+ }
10116
+
10117
+ @media (width <= 560px) {
10118
+ .work-document-compare-mode {
10119
+ grid-template-columns: minmax(0, 1fr);
10120
+ }
10121
+
10122
+ .work-document-compare-mode label > span {
10123
+ min-height: 0;
10124
+ }
10125
+ }
10126
+
9933
10127
  [data-office-character-position-half-points] {
9934
10128
  vertical-align: var(--work-document-character-position);
9935
10129
  }
@@ -12749,6 +12943,302 @@ sub [data-office-character-position-half-points], sup [data-office-character-pos
12749
12943
  }
12750
12944
  }
12751
12945
 
12946
+ .work-document-index-entry {
12947
+ border: 1px solid color-mix(in srgb, var(--a3s-blue) 34%, var(--a3s-line));
12948
+ background: color-mix(in srgb, var(--a3s-blue) 7%, var(--a3s-panel));
12949
+ max-width: min(260px, 80%);
12950
+ color: var(--a3s-ink);
12951
+ cursor: default;
12952
+ vertical-align: baseline;
12953
+ border-radius: 4px;
12954
+ align-items: baseline;
12955
+ gap: 5px;
12956
+ margin-inline: 3px;
12957
+ padding: 1px 5px;
12958
+ font-size: 9px;
12959
+ line-height: 1.45;
12960
+ display: inline-flex;
12961
+ }
12962
+
12963
+ .work-document-index-entry > span {
12964
+ color: color-mix(in srgb, var(--a3s-blue) 78%, var(--a3s-ink));
12965
+ white-space: nowrap;
12966
+ font-size: 8px;
12967
+ font-weight: 650;
12968
+ }
12969
+
12970
+ .work-document-index-entry > strong {
12971
+ text-overflow: ellipsis;
12972
+ white-space: nowrap;
12973
+ font-weight: 560;
12974
+ overflow: hidden;
12975
+ }
12976
+
12977
+ .work-document-index-entry.ProseMirror-selectednode {
12978
+ border-color: var(--a3s-blue);
12979
+ outline: 2px solid color-mix(in srgb, var(--a3s-blue) 22%, transparent);
12980
+ outline-offset: 1px;
12981
+ }
12982
+
12983
+ .work-document-index {
12984
+ box-sizing: border-box;
12985
+ border: 1px solid color-mix(in srgb, var(--a3s-line) 82%, #8aa7d8);
12986
+ background: color-mix(in srgb, var(--a3s-panel) 96%, #edf4ff);
12987
+ width: 100%;
12988
+ color: var(--a3s-ink);
12989
+ cursor: default;
12990
+ border-radius: 6px;
12991
+ margin: 14px 0 20px;
12992
+ padding: 14px 16px 16px;
12993
+ }
12994
+
12995
+ .work-document-index.ProseMirror-selectednode {
12996
+ border-color: var(--a3s-blue);
12997
+ outline: 2px solid color-mix(in srgb, var(--a3s-blue) 22%, transparent);
12998
+ outline-offset: 2px;
12999
+ }
13000
+
13001
+ .work-document-index-header {
13002
+ border-bottom: 1px solid var(--a3s-line);
13003
+ justify-content: space-between;
13004
+ align-items: baseline;
13005
+ gap: 12px;
13006
+ margin-bottom: 10px;
13007
+ padding-bottom: 7px;
13008
+ display: flex;
13009
+ }
13010
+
13011
+ .work-document-index-header strong {
13012
+ font-family: var(--a3s-font-display, inherit);
13013
+ letter-spacing: -.02em;
13014
+ font-size: 18px;
13015
+ font-weight: 680;
13016
+ }
13017
+
13018
+ .work-document-index-header span {
13019
+ color: var(--a3s-muted);
13020
+ font-variant-numeric: tabular-nums;
13021
+ font-size: 9px;
13022
+ }
13023
+
13024
+ .work-document-index-list {
13025
+ column-gap: 22px;
13026
+ margin: 0;
13027
+ padding: 0;
13028
+ list-style: none;
13029
+ }
13030
+
13031
+ .work-document-index[data-index-columns="2"] .work-document-index-list {
13032
+ column-count: 2;
13033
+ }
13034
+
13035
+ .work-document-index[data-index-columns="3"] .work-document-index-list {
13036
+ column-count: 3;
13037
+ }
13038
+
13039
+ .work-document-index[data-index-columns="4"] .work-document-index-list {
13040
+ column-count: 4;
13041
+ }
13042
+
13043
+ .work-document-index-list > li {
13044
+ break-inside: avoid;
13045
+ align-items: baseline;
13046
+ gap: 5px;
13047
+ min-width: 0;
13048
+ padding-block: 1px;
13049
+ font-size: 10px;
13050
+ line-height: 1.55;
13051
+ display: flex;
13052
+ }
13053
+
13054
+ .work-document-index-main, .work-document-index-sub {
13055
+ text-overflow: ellipsis;
13056
+ white-space: nowrap;
13057
+ overflow: hidden;
13058
+ }
13059
+
13060
+ .work-document-index-sub {
13061
+ color: color-mix(in srgb, var(--a3s-ink) 82%, var(--a3s-muted));
13062
+ padding-left: 12px;
13063
+ }
13064
+
13065
+ .work-document-index[data-index-format="run-in"] .work-document-index-sub {
13066
+ padding-left: 0;
13067
+ }
13068
+
13069
+ .work-document-index[data-index-format="run-in"] .work-document-index-sub:before {
13070
+ content: ", ";
13071
+ }
13072
+
13073
+ .work-document-index-list > li > i {
13074
+ border-bottom: 1px dotted
13075
+ color-mix(in srgb, var(--a3s-muted) 68%, transparent);
13076
+ flex: 20px;
13077
+ min-width: 10px;
13078
+ transform: translateY(-2px);
13079
+ }
13080
+
13081
+ .work-document-index[data-index-leader="dash"] .work-document-index-list > li > i {
13082
+ border-bottom-style: dashed;
13083
+ }
13084
+
13085
+ .work-document-index[data-index-leader="underline"] .work-document-index-list > li > i {
13086
+ border-bottom-style: solid;
13087
+ }
13088
+
13089
+ .work-document-index[data-index-leader="none"] .work-document-index-list > li > i, .work-document-index[data-index-right-align-page-numbers="false"] .work-document-index-list > li > i {
13090
+ border: 0;
13091
+ flex: 0 0 3px;
13092
+ min-width: 3px;
13093
+ }
13094
+
13095
+ .work-document-index-pages {
13096
+ font-variant-numeric: tabular-nums;
13097
+ flex: none;
13098
+ }
13099
+
13100
+ .work-document-index-pages a {
13101
+ color: inherit;
13102
+ text-decoration: none;
13103
+ }
13104
+
13105
+ .work-document-index-pages a:hover {
13106
+ color: var(--a3s-blue);
13107
+ text-decoration: underline;
13108
+ }
13109
+
13110
+ .work-document-index-pages a.bold {
13111
+ font-weight: 700;
13112
+ }
13113
+
13114
+ .work-document-index-pages a.italic {
13115
+ font-style: italic;
13116
+ }
13117
+
13118
+ .work-document-index-cross-reference, .work-document-index-empty {
13119
+ color: var(--a3s-muted);
13120
+ font-style: italic;
13121
+ }
13122
+
13123
+ .work-document-index-entry-dialog, .work-document-index-dialog {
13124
+ width: min(540px, 100%);
13125
+ }
13126
+
13127
+ .work-document-index-entry-dialog-fields, .work-document-index-dialog-grid {
13128
+ grid-template-columns: repeat(2, minmax(0, 1fr));
13129
+ gap: 10px;
13130
+ display: grid;
13131
+ }
13132
+
13133
+ .work-document-index-entry-dialog label, .work-document-index-dialog-field, .work-document-index-entry-dialog-mode {
13134
+ min-width: 0;
13135
+ color: var(--a3s-muted);
13136
+ gap: 6px;
13137
+ font-size: 10px;
13138
+ display: grid;
13139
+ }
13140
+
13141
+ .work-document-index-entry-dialog-mode, .work-document-index-dialog-options, .work-document-index-entry-dialog-page-style {
13142
+ border: 1px solid var(--a3s-line);
13143
+ background: var(--a3s-panel-soft);
13144
+ border-radius: 7px;
13145
+ margin-top: 14px;
13146
+ padding: 10px;
13147
+ }
13148
+
13149
+ .work-document-index-entry-dialog-page-style, .work-document-index-dialog-options {
13150
+ align-items: center;
13151
+ gap: 14px;
13152
+ display: flex;
13153
+ }
13154
+
13155
+ .work-document-index-entry-dialog-page-style > legend {
13156
+ color: var(--a3s-muted);
13157
+ padding-inline: 4px;
13158
+ font-size: 10px;
13159
+ }
13160
+
13161
+ .work-document-index-dialog-options > .work-document-index-dialog-field {
13162
+ min-width: 180px;
13163
+ margin-left: auto;
13164
+ }
13165
+
13166
+ .work-document-index-dialog .work-office-select {
13167
+ width: 100%;
13168
+ }
13169
+
13170
+ .work-document-index-dialog-preview {
13171
+ border: 1px solid var(--a3s-line);
13172
+ background: var(--a3s-bg);
13173
+ color: var(--a3s-ink);
13174
+ border-radius: 7px;
13175
+ gap: 5px;
13176
+ margin-top: 14px;
13177
+ padding: 14px;
13178
+ font-size: 10px;
13179
+ display: grid;
13180
+ }
13181
+
13182
+ .work-document-index-dialog-preview > legend {
13183
+ font-size: 14px;
13184
+ }
13185
+
13186
+ .work-document-index-dialog-preview > span {
13187
+ align-items: baseline;
13188
+ gap: 5px;
13189
+ display: flex;
13190
+ }
13191
+
13192
+ .work-document-index-dialog-preview > span.nested {
13193
+ padding-left: 16px;
13194
+ }
13195
+
13196
+ .work-document-index-dialog-preview[data-index-format="run-in"] > span.nested {
13197
+ padding-left: 0;
13198
+ }
13199
+
13200
+ .work-document-index-dialog-preview i {
13201
+ border-bottom: 1px dotted var(--a3s-muted);
13202
+ flex: 1;
13203
+ }
13204
+
13205
+ .work-document-index-dialog-preview[data-index-leader="dash"] i {
13206
+ border-bottom-style: dashed;
13207
+ }
13208
+
13209
+ .work-document-index-dialog-preview[data-index-leader="underline"] i {
13210
+ border-bottom-style: solid;
13211
+ }
13212
+
13213
+ .work-document-index-dialog-preview[data-index-leader="none"] i, .work-document-index-dialog-preview[data-index-right-align-page-numbers="false"] i {
13214
+ border: 0;
13215
+ flex: 0 0 5px;
13216
+ }
13217
+
13218
+ @media (width <= 560px) {
13219
+ .work-document-index {
13220
+ padding-inline: 12px;
13221
+ }
13222
+
13223
+ .work-document-index-list {
13224
+ column-count: 1 !important;
13225
+ }
13226
+
13227
+ .work-document-index-entry-dialog-fields, .work-document-index-dialog-grid {
13228
+ grid-template-columns: 1fr;
13229
+ }
13230
+
13231
+ .work-document-index-entry-dialog-page-style, .work-document-index-dialog-options {
13232
+ flex-direction: column;
13233
+ align-items: stretch;
13234
+ }
13235
+
13236
+ .work-document-index-dialog-options > .work-document-index-dialog-field {
13237
+ min-width: 0;
13238
+ margin-left: 0;
13239
+ }
13240
+ }
13241
+
12752
13242
  .work-document-equation {
12753
13243
  vertical-align: -.12em;
12754
13244
  border-radius: .2em;
@@ -109,6 +109,20 @@ model:
109
109
  then restores one typed block after paragraph identities are applied. Each
110
110
  imported TOC matches its cached rows independently, so repeated TOCs can
111
111
  target the same heading.
112
+ Native indexes use a separate inline `documentIndexEntry` atom and block
113
+ `documentIndex` atom. The inline node owns stable identity plus primary,
114
+ secondary, cross-reference, and page-emphasis intent; the block owns only
115
+ bounded options, generated rows, and truncation state. One collector walks
116
+ the canonical TipTap document, obtains pages from the existing field-context
117
+ resolver, groups normalized terms, and merges same-page markers while
118
+ retaining every target ID. Mark/edit and block insert/customize/refresh each
119
+ dispatch one transaction. DOCX export maps inline atoms to native
120
+ `w:fldSimple` `XE` fields, writes an `INDEX` content control through an
121
+ isolated marker collector/patcher, and emits cached `Index1`/`Index2` rows.
122
+ Import marks supported XE boundaries and removes supported INDEX controls
123
+ before Mammoth conversion, then reconstructs typed atoms and reconnects
124
+ cached page rows to matching marker identities. Unsupported switches and
125
+ malformed structures remain on the field diagnostic path.
112
126
  Page Layout keeps direct margin, orientation, paper,
113
127
  and equal-column presets in the ribbon; custom margins and advanced columns
114
128
  open the corresponding controlled Page Setup tab instead of duplicating a
@@ -269,6 +283,29 @@ DOCX import/export maps that model to strict or transitional `w:pPrChange`,
269
283
  while Yjs stores the same node attributes and immutable decision audit without a
270
284
  parallel transport model.
271
285
 
286
+ Document comparison is a pure planning boundary before the editor transaction.
287
+ The current and imported TipTap/ProseMirror trees remain immutable while a
288
+ deterministic weighted block alignment pairs related paragraphs and headings;
289
+ an LCS token diff then produces insertion and deletion marks, while exact mark
290
+ and paragraph-property snapshots produce character- and paragraph-formatting
291
+ revisions. Stable semantic signatures seed generated identities, so the same
292
+ inputs and options produce the same ordering and IDs. Only a fully admitted
293
+ plan replaces the mounted document, and that replacement is one transaction,
294
+ one controlled publication, and one Undo record.
295
+
296
+ Combine validates rather than guesses. It rejects every imported revision on
297
+ an immutable reviewed snapshot and compares the resulting semantic signature
298
+ with the current baseline. Only an exact match can transfer the reviewed inline
299
+ and formatting revisions while retaining current paragraph and section
300
+ identities. Existing current revisions, malformed review snapshots, structural
301
+ block revisions, layout mismatches, and changed complex objects leave the
302
+ mounted document untouched. Compare is bounded to 1,024 blocks per version,
303
+ 1,000,000 combined text characters, and about 1.1 million cells for block
304
+ alignment or any inline matrix. This planner currently runs on the main thread;
305
+ it does not claim a Worker or WASM diff path. The bounds and atomic commit keep
306
+ that synchronous work explicit until measured evidence justifies another
307
+ execution boundary.
308
+
272
309
  Selected document text has a typed host-owned context-menu boundary.
273
310
  `getSelectionMenuItems` receives an immutable snapshot containing the selected
274
311
  plain text and structured fragment, bounded adjacent text, synchronized HTML,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a3s-lab/office",
3
- "version": "0.30.0",
3
+ "version": "0.32.0",
4
4
  "description": "Open-source collaborative browser editors for documents, Markdown, spreadsheets, presentations, and PDFs.",
5
5
  "keywords": [
6
6
  "office",
@@ -88,6 +88,8 @@
88
88
  "playground:typecheck": "tsc --noEmit -p playground/tsconfig.json",
89
89
  "playground:visual": "playwright test --config playwright.config.ts",
90
90
  "playground:visual:document-emphasis": "playwright test visual-tests/document-emphasis.functional.spec.ts --config playwright.config.ts",
91
+ "playground:visual:document-index": "playwright test visual-tests/document-index.functional.spec.ts --config playwright.config.ts",
92
+ "playground:visual:document-comparison": "playwright test visual-tests/document-comparison.functional.spec.ts --config playwright.config.ts",
91
93
  "playground:visual:document-hidden-text": "playwright test visual-tests/document-hidden-text.functional.spec.ts --config playwright.config.ts",
92
94
  "playground:visual:document-legacy-text-effects": "playwright test visual-tests/document-legacy-text-effects.functional.spec.ts --config playwright.config.ts",
93
95
  "playground:visual:document-proofing-languages": "playwright test visual-tests/document-proofing-languages.functional.spec.ts --config playwright.config.ts",
@@ -121,8 +123,8 @@
121
123
  "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/ --runs 3 --timeout-ms 120000",
122
124
  "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/ --runs 3 --timeout-ms 120000 --modes default,content-visibility",
123
125
  "test": "rstest",
124
- "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-formatting-revision.acl --json && a3s-test run tests/e2e/word-paragraph-formatting-revision.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",
125
- "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-formatting-revision.acl --json && a3s-test check tests/e2e/word-paragraph-formatting-revision.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",
126
+ "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-formatting-revision.acl --json && a3s-test run tests/e2e/word-paragraph-formatting-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",
127
+ "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-formatting-revision.acl --json && a3s-test check tests/e2e/word-paragraph-formatting-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",
126
128
  "test:e2e:fixtures": "bun scripts/create-e2e-fixtures.ts",
127
129
  "test:e2e:large-documents": "bun .a3s-test/performance/generate-fixtures.ts --documents-only && a3s-test run tests/e2e/word-large-document-windowing.acl --json",
128
130
  "test:e2e:large-documents:check": "a3s-test check tests/e2e/word-large-document-windowing.acl --json",
@@ -210,6 +212,10 @@
210
212
  "test:e2e:writer-proofing-languages:check": "a3s-test check tests/e2e/word-proofing-languages.acl --json",
211
213
  "test:e2e:writer-table-of-contents": "A3S_TEST_SUITE=tests/e2e/word-table-of-contents.acl bash scripts/run-a3s-test-web-gate.sh",
212
214
  "test:e2e:writer-table-of-contents:check": "a3s-test check tests/e2e/word-table-of-contents.acl --json",
215
+ "test:e2e:writer-document-index": "A3S_TEST_SUITE=tests/e2e/word-document-index.acl bash scripts/run-a3s-test-web-gate.sh",
216
+ "test:e2e:writer-document-index:check": "a3s-test check tests/e2e/word-document-index.acl --json",
217
+ "test:e2e:writer-document-comparison": "A3S_TEST_SUITE=tests/e2e/word-document-comparison.acl bash scripts/run-a3s-test-web-gate.sh",
218
+ "test:e2e:writer-document-comparison:check": "a3s-test check tests/e2e/word-document-comparison.acl --json",
213
219
  "test:e2e:writer-run-border": "A3S_TEST_SUITE=tests/e2e/word-run-border.acl bash scripts/run-a3s-test-web-gate.sh",
214
220
  "test:e2e:writer-run-border:check": "a3s-test check tests/e2e/word-run-border.acl --json",
215
221
  "test:e2e:writer-run-shading": "A3S_TEST_SUITE=tests/e2e/word-run-shading.acl bash scripts/run-a3s-test-web-gate.sh",