@a3s-lab/office 0.14.0 → 0.16.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 (46) hide show
  1. package/COLLABORATION_ROADMAP.md +15 -5
  2. package/README.md +34 -1
  3. package/dist/0~6090.js +7 -8
  4. package/dist/0~spreadsheet-editor.js +6869 -3427
  5. package/dist/0~work-office-diagnostics.js +1 -1
  6. package/dist/{4476.js → 2180.js} +404 -35
  7. package/dist/4104.js +698 -41
  8. package/dist/5184.js +1 -1
  9. package/dist/8715.js +156 -156
  10. package/dist/core.js +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/internal/collaboration/office-spreadsheet-collaboration-records.d.ts +2 -0
  13. package/dist/internal/collaboration/office-spreadsheet-collaboration-validation-support.d.ts +6 -0
  14. package/dist/internal/features/work/editors/spreadsheet-auto-filter.d.ts +1 -0
  15. package/dist/internal/features/work/editors/spreadsheet-command-catalog.d.ts +44 -1
  16. package/dist/internal/features/work/editors/spreadsheet-command-controller.d.ts +28 -0
  17. package/dist/internal/features/work/editors/spreadsheet-data-validation-command.d.ts +3 -0
  18. package/dist/internal/features/work/editors/spreadsheet-data-validation-dialog.d.ts +9 -0
  19. package/dist/internal/features/work/editors/spreadsheet-data-validation.d.ts +50 -0
  20. package/dist/internal/features/work/editors/spreadsheet-editor-ribbon.d.ts +4 -2
  21. package/dist/internal/features/work/editors/spreadsheet-editor-support.d.ts +1 -0
  22. package/dist/internal/features/work/editors/spreadsheet-hyperlink-command.d.ts +3 -0
  23. package/dist/internal/features/work/editors/spreadsheet-hyperlink-dialog.d.ts +9 -0
  24. package/dist/internal/features/work/editors/spreadsheet-hyperlink.d.ts +44 -0
  25. package/dist/internal/features/work/editors/spreadsheet-table-command.d.ts +3 -0
  26. package/dist/internal/features/work/editors/spreadsheet-table-conversion.d.ts +7 -0
  27. package/dist/internal/features/work/editors/spreadsheet-table-dialog.d.ts +8 -0
  28. package/dist/internal/features/work/editors/spreadsheet-table-limits.d.ts +1 -0
  29. package/dist/internal/features/work/editors/spreadsheet-table-reconciliation.d.ts +21 -0
  30. package/dist/internal/features/work/editors/spreadsheet-table-render.d.ts +16 -0
  31. package/dist/internal/features/work/editors/spreadsheet-table-ribbon.d.ts +8 -0
  32. package/dist/internal/features/work/editors/spreadsheet-table-style.d.ts +31 -0
  33. package/dist/internal/features/work/editors/spreadsheet-table.d.ts +55 -0
  34. package/dist/internal/features/work/editors/use-spreadsheet-data-validation.d.ts +23 -0
  35. package/dist/internal/features/work/editors/use-spreadsheet-hyperlink.d.ts +24 -0
  36. package/dist/internal/features/work/editors/use-spreadsheet-table.d.ts +23 -0
  37. package/dist/internal/features/work/work-spreadsheet-data-validation.d.ts +2 -0
  38. package/dist/internal/features/work/work-types.d.ts +100 -0
  39. package/dist/internal/features/work/work-xlsx-interop.d.ts +2 -0
  40. package/dist/internal/features/work/work-xlsx-table-filters.d.ts +3 -0
  41. package/dist/internal/features/work/work-xlsx-tables.d.ts +4 -0
  42. package/dist/office-kernel.wasm +0 -0
  43. package/dist/styles.css +486 -0
  44. package/dist/work-spreadsheet-package-scan.worker.js +3 -2
  45. package/docs/latest/en/browser-editor-architecture.md +43 -0
  46. package/package.json +12 -3
package/dist/styles.css CHANGED
@@ -15925,6 +15925,303 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
15925
15925
  }
15926
15926
  }
15927
15927
 
15928
+ .work-spreadsheet-data-validation-dialog {
15929
+ --work-office-control-accent: var(--work-spreadsheet-accent, #159469);
15930
+ width: min(640px, 100%);
15931
+ }
15932
+
15933
+ .work-spreadsheet-data-validation-dialog form {
15934
+ gap: 18px;
15935
+ display: grid;
15936
+ }
15937
+
15938
+ .work-spreadsheet-data-validation-dialog section {
15939
+ gap: 12px;
15940
+ min-width: 0;
15941
+ display: grid;
15942
+ }
15943
+
15944
+ .work-spreadsheet-data-validation-dialog section + section {
15945
+ border-top: 1px solid var(--a3s-line);
15946
+ padding-top: 16px;
15947
+ }
15948
+
15949
+ .work-spreadsheet-data-validation-dialog h3 {
15950
+ color: var(--a3s-ink);
15951
+ margin: 0;
15952
+ font-size: 12px;
15953
+ font-weight: 650;
15954
+ }
15955
+
15956
+ .work-spreadsheet-data-validation-scope {
15957
+ background: var(--a3s-panel-soft);
15958
+ border-radius: 8px;
15959
+ grid-template-columns: 32px minmax(0, 1fr);
15960
+ align-items: center;
15961
+ gap: 10px;
15962
+ min-width: 0;
15963
+ padding: 9px 11px;
15964
+ display: grid;
15965
+ }
15966
+
15967
+ .work-spreadsheet-data-validation-scope > span {
15968
+ background: color-mix(in srgb,
15969
+ var(--work-spreadsheet-accent, #159469) 11%,
15970
+ var(--a3s-panel));
15971
+ width: 32px;
15972
+ height: 32px;
15973
+ color: var(--work-spreadsheet-accent, #159469);
15974
+ border-radius: 7px;
15975
+ place-items: center;
15976
+ display: grid;
15977
+ }
15978
+
15979
+ .work-spreadsheet-data-validation-scope > div {
15980
+ gap: 2px;
15981
+ min-width: 0;
15982
+ display: grid;
15983
+ }
15984
+
15985
+ .work-spreadsheet-data-validation-scope strong, .work-spreadsheet-data-validation-scope small {
15986
+ text-overflow: ellipsis;
15987
+ white-space: nowrap;
15988
+ overflow: hidden;
15989
+ }
15990
+
15991
+ .work-spreadsheet-data-validation-scope strong {
15992
+ color: var(--a3s-ink);
15993
+ font-size: 11px;
15994
+ font-weight: 650;
15995
+ }
15996
+
15997
+ .work-spreadsheet-data-validation-scope small {
15998
+ color: var(--a3s-muted);
15999
+ font-size: 10px;
16000
+ }
16001
+
16002
+ .work-spreadsheet-data-validation-mixed {
16003
+ color: color-mix(in srgb, var(--a3s-ink) 74%, #9a6900);
16004
+ margin: -6px 0 0;
16005
+ font-size: 11px;
16006
+ line-height: 1.45;
16007
+ }
16008
+
16009
+ .work-spreadsheet-data-validation-section-heading {
16010
+ color: var(--work-spreadsheet-accent, #159469);
16011
+ align-items: center;
16012
+ gap: 7px;
16013
+ display: flex;
16014
+ }
16015
+
16016
+ .work-spreadsheet-data-validation-condition-grid, .work-spreadsheet-data-validation-values.two {
16017
+ grid-template-columns: repeat(2, minmax(0, 1fr));
16018
+ gap: 10px;
16019
+ display: grid;
16020
+ }
16021
+
16022
+ .work-spreadsheet-data-validation-values {
16023
+ gap: 8px;
16024
+ min-width: 0;
16025
+ display: grid;
16026
+ }
16027
+
16028
+ .work-spreadsheet-data-validation-inline-error {
16029
+ color: var(--a3s-danger, #c23535);
16030
+ grid-column: 1 / -1;
16031
+ font-size: 10px;
16032
+ }
16033
+
16034
+ .work-spreadsheet-data-validation-behavior {
16035
+ grid-template-columns: repeat(2, minmax(0, 1fr));
16036
+ gap: 8px;
16037
+ display: grid;
16038
+ }
16039
+
16040
+ .work-spreadsheet-data-validation-behavior .work-office-checkbox {
16041
+ min-height: 40px;
16042
+ padding: 8px 10px;
16043
+ }
16044
+
16045
+ .work-spreadsheet-data-validation-dialog textarea {
16046
+ resize: vertical;
16047
+ min-height: 70px;
16048
+ }
16049
+
16050
+ .work-spreadsheet-data-validation-error {
16051
+ color: var(--a3s-danger, #c23535);
16052
+ margin: 0;
16053
+ font-size: 11px;
16054
+ }
16055
+
16056
+ .work-spreadsheet-data-validation-remove {
16057
+ margin-right: auto;
16058
+ }
16059
+
16060
+ @media (width <= 560px) {
16061
+ .work-spreadsheet-data-validation-condition-grid, .work-spreadsheet-data-validation-values.two, .work-spreadsheet-data-validation-behavior {
16062
+ grid-template-columns: minmax(0, 1fr);
16063
+ }
16064
+ }
16065
+
16066
+ .work-spreadsheet-hyperlink-dialog {
16067
+ --work-office-control-accent: var(--work-spreadsheet-accent, #159469);
16068
+ width: min(610px, 100%);
16069
+ }
16070
+
16071
+ .work-spreadsheet-hyperlink-dialog form {
16072
+ gap: 18px;
16073
+ display: grid;
16074
+ }
16075
+
16076
+ .work-spreadsheet-hyperlink-types {
16077
+ border: 0;
16078
+ min-width: 0;
16079
+ margin: 0;
16080
+ padding: 0;
16081
+ }
16082
+
16083
+ .work-spreadsheet-hyperlink-types > legend {
16084
+ color: var(--a3s-muted);
16085
+ margin-bottom: 8px;
16086
+ font-size: 12px;
16087
+ font-weight: 600;
16088
+ }
16089
+
16090
+ .work-spreadsheet-hyperlink-types > div {
16091
+ grid-template-columns: repeat(3, minmax(0, 1fr));
16092
+ gap: 7px;
16093
+ display: grid;
16094
+ }
16095
+
16096
+ .work-spreadsheet-hyperlink-types label {
16097
+ border: 1px solid var(--a3s-line);
16098
+ background: var(--a3s-panel);
16099
+ min-width: 0;
16100
+ min-height: 62px;
16101
+ color: var(--a3s-muted);
16102
+ cursor: pointer;
16103
+ border-radius: 8px;
16104
+ grid-template-columns: 20px minmax(0, 1fr);
16105
+ align-items: center;
16106
+ gap: 8px;
16107
+ padding: 9px 10px;
16108
+ display: grid;
16109
+ position: relative;
16110
+ }
16111
+
16112
+ .work-spreadsheet-hyperlink-types label:hover {
16113
+ border-color: color-mix(in srgb,
16114
+ var(--work-spreadsheet-accent, #159469) 42%,
16115
+ var(--a3s-line));
16116
+ }
16117
+
16118
+ .work-spreadsheet-hyperlink-types label.selected {
16119
+ border-color: color-mix(in srgb,
16120
+ var(--work-spreadsheet-accent, #159469) 58%,
16121
+ var(--a3s-line));
16122
+ background: color-mix(in srgb,
16123
+ var(--work-spreadsheet-accent, #159469) 8%,
16124
+ var(--a3s-panel));
16125
+ color: var(--work-spreadsheet-accent, #159469);
16126
+ }
16127
+
16128
+ .work-spreadsheet-hyperlink-types label:has(input:focus-visible) {
16129
+ outline: 2px solid
16130
+ color-mix(in srgb, var(--work-spreadsheet-accent, #159469) 38%, transparent);
16131
+ outline-offset: 2px;
16132
+ }
16133
+
16134
+ .work-spreadsheet-hyperlink-types input {
16135
+ opacity: 0;
16136
+ width: 1px;
16137
+ height: 1px;
16138
+ position: absolute;
16139
+ }
16140
+
16141
+ .work-spreadsheet-hyperlink-types label > span {
16142
+ gap: 1px;
16143
+ min-width: 0;
16144
+ display: grid;
16145
+ }
16146
+
16147
+ .work-spreadsheet-hyperlink-types strong, .work-spreadsheet-hyperlink-types small {
16148
+ text-overflow: ellipsis;
16149
+ white-space: nowrap;
16150
+ overflow: hidden;
16151
+ }
16152
+
16153
+ .work-spreadsheet-hyperlink-types strong {
16154
+ color: var(--a3s-ink);
16155
+ font-size: 11px;
16156
+ font-weight: 650;
16157
+ }
16158
+
16159
+ .work-spreadsheet-hyperlink-types small {
16160
+ color: var(--a3s-muted);
16161
+ font-size: 9px;
16162
+ }
16163
+
16164
+ .work-spreadsheet-hyperlink-preview {
16165
+ background: var(--a3s-panel-soft);
16166
+ border-radius: 8px;
16167
+ grid-template-columns: 30px minmax(0, 1fr);
16168
+ align-items: center;
16169
+ gap: 10px;
16170
+ min-width: 0;
16171
+ min-height: 56px;
16172
+ padding: 9px 11px;
16173
+ display: grid;
16174
+ }
16175
+
16176
+ .work-spreadsheet-hyperlink-preview > span {
16177
+ background: color-mix(in srgb,
16178
+ var(--work-spreadsheet-accent, #159469) 11%,
16179
+ var(--a3s-panel));
16180
+ width: 30px;
16181
+ height: 30px;
16182
+ color: var(--work-spreadsheet-accent, #159469);
16183
+ border-radius: 7px;
16184
+ place-items: center;
16185
+ display: grid;
16186
+ }
16187
+
16188
+ .work-spreadsheet-hyperlink-preview > div {
16189
+ gap: 1px;
16190
+ min-width: 0;
16191
+ display: grid;
16192
+ }
16193
+
16194
+ .work-spreadsheet-hyperlink-preview strong, .work-spreadsheet-hyperlink-preview small {
16195
+ text-overflow: ellipsis;
16196
+ white-space: nowrap;
16197
+ overflow: hidden;
16198
+ }
16199
+
16200
+ .work-spreadsheet-hyperlink-preview strong {
16201
+ color: var(--a3s-ink);
16202
+ font-size: 11px;
16203
+ font-weight: 650;
16204
+ }
16205
+
16206
+ .work-spreadsheet-hyperlink-preview small {
16207
+ color: var(--a3s-muted);
16208
+ font-size: 10px;
16209
+ }
16210
+
16211
+ .work-spreadsheet-hyperlink-remove {
16212
+ margin-right: auto;
16213
+ }
16214
+
16215
+ @media (width <= 560px) {
16216
+ .work-spreadsheet-hyperlink-types > div {
16217
+ grid-template-columns: minmax(0, 1fr);
16218
+ }
16219
+
16220
+ .work-spreadsheet-hyperlink-types label {
16221
+ min-height: 50px;
16222
+ }
16223
+ }
16224
+
15928
16225
  .work-spreadsheet-paste-special-dialog {
15929
16226
  --work-office-control-accent: var(--work-spreadsheet-accent, #159469);
15930
16227
  width: min(660px, 100%);
@@ -16139,6 +16436,195 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
16139
16436
  }
16140
16437
  }
16141
16438
 
16439
+ .work-spreadsheet-table-dialog {
16440
+ --work-office-control-accent: var(--work-spreadsheet-accent, #159469);
16441
+ width: min(480px, 100%);
16442
+ }
16443
+
16444
+ .work-spreadsheet-table-dialog form {
16445
+ gap: 16px;
16446
+ display: grid;
16447
+ }
16448
+
16449
+ .work-spreadsheet-table-scope {
16450
+ background: var(--a3s-panel-soft);
16451
+ border-radius: 8px;
16452
+ grid-template-columns: 34px minmax(0, 1fr);
16453
+ align-items: center;
16454
+ gap: 10px;
16455
+ padding: 10px 12px;
16456
+ display: grid;
16457
+ }
16458
+
16459
+ .work-spreadsheet-table-scope > span {
16460
+ background: color-mix(in srgb,
16461
+ var(--work-spreadsheet-accent, #159469) 11%,
16462
+ var(--a3s-panel));
16463
+ width: 34px;
16464
+ height: 34px;
16465
+ color: var(--work-spreadsheet-accent, #159469);
16466
+ border-radius: 7px;
16467
+ place-items: center;
16468
+ display: grid;
16469
+ }
16470
+
16471
+ .work-spreadsheet-table-scope > div {
16472
+ gap: 2px;
16473
+ min-width: 0;
16474
+ display: grid;
16475
+ }
16476
+
16477
+ .work-spreadsheet-table-scope strong, .work-spreadsheet-table-scope small {
16478
+ text-overflow: ellipsis;
16479
+ white-space: nowrap;
16480
+ overflow: hidden;
16481
+ }
16482
+
16483
+ .work-spreadsheet-table-scope strong {
16484
+ color: var(--a3s-ink);
16485
+ font-size: 12px;
16486
+ font-weight: 650;
16487
+ }
16488
+
16489
+ .work-spreadsheet-table-scope small {
16490
+ color: var(--a3s-muted);
16491
+ font-size: 10px;
16492
+ }
16493
+
16494
+ .work-spreadsheet-table-dialog .work-office-checkbox {
16495
+ min-height: 38px;
16496
+ padding: 8px 10px;
16497
+ }
16498
+
16499
+ .work-spreadsheet-table-name {
16500
+ align-content: center;
16501
+ gap: 3px;
16502
+ width: 132px;
16503
+ padding: 2px 5px;
16504
+ display: grid;
16505
+ }
16506
+
16507
+ .work-spreadsheet-table-name > span {
16508
+ color: var(--a3s-muted);
16509
+ font-size: 9px;
16510
+ line-height: 1;
16511
+ }
16512
+
16513
+ .work-spreadsheet-table-name > input {
16514
+ border: 1px solid var(--a3s-line-strong);
16515
+ background: var(--a3s-panel);
16516
+ width: 100%;
16517
+ height: 27px;
16518
+ color: var(--a3s-ink);
16519
+ border-radius: 5px;
16520
+ padding: 0 8px;
16521
+ font-size: 11px;
16522
+ }
16523
+
16524
+ .work-spreadsheet-table-style-root {
16525
+ display: flex;
16526
+ }
16527
+
16528
+ .work-office-ribbon .work-spreadsheet-table-style-trigger {
16529
+ min-width: 76px;
16530
+ }
16531
+
16532
+ .work-spreadsheet-table-style-preview {
16533
+ background: #fff;
16534
+ border: 1px solid #0f172a29;
16535
+ border-radius: 3px;
16536
+ grid-template-rows: 8px 1fr 1fr;
16537
+ width: 48px;
16538
+ height: 28px;
16539
+ display: grid;
16540
+ overflow: hidden;
16541
+ }
16542
+
16543
+ .work-spreadsheet-table-style-preview > i {
16544
+ min-height: 0;
16545
+ display: block;
16546
+ }
16547
+
16548
+ .work-spreadsheet-table-style-menu {
16549
+ border: 1px solid var(--a3s-overlay-border);
16550
+ border-radius: var(--a3s-overlay-radius);
16551
+ background: var(--a3s-overlay-surface);
16552
+ width: min(464px, 100vw - 24px);
16553
+ max-height: min(520px, 100vh - 32px);
16554
+ box-shadow: var(--a3s-shadow-soft);
16555
+ padding: 10px;
16556
+ overflow: auto;
16557
+ }
16558
+
16559
+ .work-spreadsheet-table-style-family {
16560
+ border: 0;
16561
+ gap: 6px;
16562
+ min-inline-size: 0;
16563
+ margin: 0;
16564
+ padding: 0;
16565
+ display: grid;
16566
+ }
16567
+
16568
+ .work-spreadsheet-table-style-family + .work-spreadsheet-table-style-family {
16569
+ border-top: 1px solid var(--a3s-line);
16570
+ margin-top: 10px;
16571
+ padding-top: 9px;
16572
+ }
16573
+
16574
+ .work-spreadsheet-table-style-family > span {
16575
+ color: var(--a3s-muted);
16576
+ font-size: 10px;
16577
+ font-weight: 650;
16578
+ }
16579
+
16580
+ .work-spreadsheet-table-style-family > div {
16581
+ grid-template-columns: repeat(7, minmax(0, 1fr));
16582
+ gap: 4px;
16583
+ display: grid;
16584
+ }
16585
+
16586
+ .work-spreadsheet-table-style-family button {
16587
+ cursor: pointer;
16588
+ background: none;
16589
+ border: 1px solid #0000;
16590
+ border-radius: 5px;
16591
+ place-items: center;
16592
+ min-width: 0;
16593
+ height: 38px;
16594
+ padding: 4px;
16595
+ display: grid;
16596
+ }
16597
+
16598
+ .work-spreadsheet-table-style-family button:hover, .work-spreadsheet-table-style-family button:focus-visible, .work-spreadsheet-table-style-family button[aria-checked="true"] {
16599
+ border-color: color-mix(in srgb,
16600
+ var(--work-spreadsheet-accent, #159469) 46%,
16601
+ var(--a3s-line));
16602
+ background: color-mix(in srgb,
16603
+ var(--work-spreadsheet-accent, #159469) 8%,
16604
+ var(--a3s-panel));
16605
+ }
16606
+
16607
+ .work-spreadsheet-table-style-family button:focus-visible {
16608
+ outline: 2px solid
16609
+ color-mix(in srgb, var(--work-spreadsheet-accent, #159469) 66%, white);
16610
+ outline-offset: 1px;
16611
+ }
16612
+
16613
+ @media (width <= 620px) {
16614
+ .work-spreadsheet-table-name {
16615
+ width: 104px;
16616
+ }
16617
+
16618
+ .work-spreadsheet-table-style-menu {
16619
+ width: min(356px, 100vw - 16px);
16620
+ padding: 8px;
16621
+ }
16622
+
16623
+ .work-spreadsheet-table-style-family > div {
16624
+ grid-template-columns: repeat(5, minmax(0, 1fr));
16625
+ }
16626
+ }
16627
+
16142
16628
  .work-spreadsheet-chart-manager {
16143
16629
  border: 0;
16144
16630
  grid-template-columns: minmax(180px, 230px) minmax(720px, 1fr);
@@ -3996,7 +3996,8 @@ https://github.com/nodeca/pako/blob/main/LICENSE
3996
3996
  'printOptions',
3997
3997
  'headerFooter',
3998
3998
  'pageSetUpPr',
3999
- 'drawing'
3999
+ 'drawing',
4000
+ 'tableParts'
4000
4001
  ]);
4001
4002
  const DIAGNOSTIC_WORKSHEET_ELEMENTS = new Set([
4002
4003
  'conditionalFormatting',
@@ -4011,7 +4012,7 @@ https://github.com/nodeca/pako/blob/main/LICENSE
4011
4012
  'rowBreaks',
4012
4013
  'colBreaks'
4013
4014
  ]);
4014
- const WORKSHEET_SCAN_PATTERN = /<(?:[A-Za-z_][\w.-]*:)?(?:(cols|f|pane|dataValidation|conditionalFormatting|sheetProtection|protectedRange|rowBreaks|colBreaks|pageSetup|pageMargins|printOptions|headerFooter|pageSetUpPr|drawing)(?=[\s/>])|(row)(?=[\s/>])[^>]*\s(?:collapsed|customFormat|customHeight|hidden|ht|outlineLevel|thickBot|thickTop)\s*=|(c)(?=[\s/>])[^>]*\ss\s*=)/g;
4015
+ const WORKSHEET_SCAN_PATTERN = /<(?:[A-Za-z_][\w.-]*:)?(?:(cols|f|pane|dataValidation|conditionalFormatting|sheetProtection|protectedRange|rowBreaks|colBreaks|pageSetup|pageMargins|printOptions|headerFooter|pageSetUpPr|drawing|tableParts)(?=[\s/>])|(row)(?=[\s/>])[^>]*\s(?:collapsed|customFormat|customHeight|hidden|ht|outlineLevel|thickBot|thickTop)\s*=|(c)(?=[\s/>])[^>]*\ss\s*=)/g;
4015
4016
  function scanXlsxWorksheetXml(source) {
4016
4017
  let hasDirectCellStyles = false;
4017
4018
  let hasDiagnosticFeatures = false;
@@ -304,6 +304,21 @@ focus restoration.
304
304
  | Presentation | Scene canvas with ordered typed multi-selection, persistent nested browser groups, native PPTX group-node export, exact keyboard-accessible table-dimension insertion, native slide/object context actions with optional AI actions, a separate object/content editing state, one on-demand TipTap instance, collective move/scale/nudge/clipboard/delete/layer commands, selection-bound alignment and distribution, typed group/ungroup commands, one typed dispatcher for ribbon commands, editor-scoped shortcuts with post-command selection focus, direct beginning/current-slide playback with fullscreen fallback, frame-coalesced transactional move/resize previews that commit once on pointer release, two-level thumbnail node and scene windowing, and a phone stage that top-aligns the primary canvas while retaining one readable slide indicator beside view and zoom controls | Revisioned, cancellable Worker/Rust-WASM slide-relative alignment and object-set snapping with typed visual guides and a JavaScript fallback | Arbitrary rotated or reflected PPTX group transforms, connectors, theme resolution, text fitting, kernel-owned thumbnail layout, and slide serialization |
305
305
  | PDF | PDFium-backed page rendering with an A3S-owned responsive toolbar, a scrollable page-thumbnail rail with active-page synchronization and bounded bitmap/DOM windowing, a focus-contained phone page drawer, and typed capability controllers for navigation, zoom, search, basic annotations, annotation color, opacity, compatible stroke-width defaults and selection updates, history, and save; page and search drafts cancel without accidental commands, shortcuts remain scoped to the PDF root, and compact widths retain page status while exposing search-result traversal, navigation, zoom, and history through the keyboard-operated overflow menu | PDFium WebAssembly | Forms, redaction review, page organization, and reopen fixtures |
306
306
 
307
+ Spreadsheet Tables/ListObjects remain part of the controlled workbook model,
308
+ not a formatting sidecar. The active cell selects the contextual Table Design
309
+ ribbon; creation, design, structure reconciliation, conversion, collaboration,
310
+ and XLSX import/export all read the same stable ID, range, column, filter, and
311
+ style record. Table presentation is resolved inside Fortune's existing
312
+ visible-cell Canvas callbacks. A row-cached resolver inspects only tables that
313
+ can intersect the cell being painted, and conditional formatting remains the
314
+ higher-priority visual layer. Ordinary style changes therefore do not stamp or
315
+ allocate cells. Convert to Range is the deliberate boundary where the selected
316
+ appearance becomes native cell fills, emphasis, and borders; a bounded
317
+ footprint check switches large matrix projections to sparse `celldata` before
318
+ materialization. Fortune row/column operations are reconciled back into table
319
+ ranges, column identities, filter offsets, and canonical header cells, while
320
+ merge and worksheet AutoFilter commands reject intersecting ownership.
321
+
307
322
  The table is a fidelity statement, not a marketing capability list. The
308
323
  current Document path shapes text-flow paragraphs in Rust/WASM when every
309
324
  explicit CSS family resolves to an exact registered face. Each run may carry up
@@ -391,6 +406,16 @@ scroll range. A cumulative geometry index and binary search map the viewport
391
406
  to its exact leaves. `Ctrl+Home`, `Ctrl+End`, and the macOS equivalents operate
392
407
  on model positions first and never depend on mounted DOM.
393
408
 
409
+ CSS `content-visibility: auto` is not the production long-document boundary.
410
+ It can skip browser layout and paint for an off-screen subtree, but the
411
+ ProseMirror nodes, descendant DOM, JavaScript projection work, mutation and
412
+ selection bookkeeping, and accessibility tree still exist. The production
413
+ NodeView window instead omits descendant DOM and page-sheet DOM while retaining
414
+ model-authoritative positions, indexed geometry, and semantic previews only
415
+ for the visible leaves. `content-visibility` remains useful as a measured
416
+ benchmark mode where a surface owns ordinary DOM, but it cannot replace model
417
+ windowing or visible-range Canvas painting.
418
+
394
419
  Pagination reads the canonical JSON payloads of lazy chunks without hydrating
395
420
  them into ProseMirror. A text edit reuses the measured block and page prefix
396
421
  before the first changed position, locates the current page with a binary
@@ -1228,6 +1253,16 @@ is still Fortune Sheet. The A3S-owned virtual viewport, moving initial and
1228
1253
  replacement projection off the main thread, complete formula semantics, kernel
1229
1254
  number formatting, and print pagination remain open work in this stage.
1230
1255
 
1256
+ The native table slice is also implemented at this stage. Insert Table creates
1257
+ one bounded semantic ListObject, the contextual design surface selects among
1258
+ 60 built-in OOXML styles, visible cells receive render-time Canvas styling,
1259
+ row/column operations reconcile table structure, and Convert to Range
1260
+ materializes appearance through a sparse-safe path. XLSX table parts,
1261
+ relationships, content types, styles, and supported filters round-trip, while
1262
+ Yjs uses ordered ID-keyed records and creation claims for two-client
1263
+ convergence. Structured-reference calculation, calculated columns, complete
1264
+ totals authoring, slicers, and external/query tables remain open gates.
1265
+
1231
1266
  Exit criteria: scrolling and selection do not scale with total row count;
1232
1267
  incremental recalculation touches only affected dependency subgraphs; XLSX
1233
1268
  fixtures preserve formulas, styles, names, validation, conditional formatting,
@@ -1421,6 +1456,14 @@ runner polling backoff is therefore excluded from the load time.
1421
1456
  | DOCX table, 100,000 rows × 3 columns | 0.813 s (0.810–0.814) | 1.747 s (1.739–1.749), 2,381 pages | 96 ms (88–144) |
1422
1457
  | XLSX table, 100,000 rows × 10 columns, 1 million populated cells | 0.480 s (0.474–0.494) | n/a | No task ≥50 ms in any of five runs |
1423
1458
 
1459
+ The XLSX row above is a rectangular one-million-cell data fixture, not a
1460
+ semantic `WorkSpreadsheetTable`/OOXML ListObject benchmark. It proves the
1461
+ plain-workbook import and visible-range Canvas path; it must not be used to
1462
+ claim that structured-reference calculation, calculated columns, totals,
1463
+ filters, or table conversion have the same profile. A dedicated large
1464
+ ListObject matrix remains required before publishing table-specific load,
1465
+ mutation, conversion, and export budgets.
1466
+
1424
1467
  The median text phases were 121.6 ms for the complete import, 76.1 ms inside
1425
1468
  the Worker, and 56.6 ms for Worker parsing. The table phases were 462.6 ms,
1426
1469
  377.6 ms, and 311.6 ms respectively; the already mounted editor applied that
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a3s-lab/office",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "description": "Open-source collaborative browser editors for documents, Markdown, spreadsheets, presentations, and PDFs.",
5
5
  "keywords": [
6
6
  "office",
@@ -87,7 +87,10 @@
87
87
  "playground:preview": "rsbuild preview --config playground/rsbuild.config.ts --host 127.0.0.1 --port 4175 --strict-port",
88
88
  "playground:typecheck": "tsc --noEmit -p playground/tsconfig.json",
89
89
  "playground:visual": "playwright test --config playwright.config.ts",
90
+ "playground:visual:spreadsheet-data-validation": "playwright test visual-tests/spreadsheet-data-validation.functional.spec.ts --config playwright.config.ts",
91
+ "playground:visual:spreadsheet-hyperlink": "playwright test visual-tests/spreadsheet-hyperlink.functional.spec.ts --config playwright.config.ts",
90
92
  "playground:visual:spreadsheet-ribbon": "playwright test visual-tests/spreadsheet-ribbon.functional.spec.ts --config playwright.config.ts",
93
+ "playground:visual:spreadsheet-table": "playwright test visual-tests/spreadsheet-table.functional.spec.ts --config playwright.config.ts",
91
94
  "playground:visual:update": "playwright test --config playwright.config.ts --update-snapshots",
92
95
  "performance:fixtures": "bun .a3s-test/performance/generate-fixtures.ts",
93
96
  "performance:large-document-edits": "bun .a3s-test/performance/generate-fixtures.ts --documents-only && bun .a3s-test/performance/benchmark-document-edit.ts http://127.0.0.1:4175/ 3",
@@ -97,8 +100,8 @@
97
100
  "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",
98
101
  "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",
99
102
  "test": "rstest",
100
- "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/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",
101
- "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/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",
103
+ "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",
104
+ "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",
102
105
  "test:e2e:fixtures": "bun scripts/create-e2e-fixtures.ts",
103
106
  "test:e2e:large-documents": "bun .a3s-test/performance/generate-fixtures.ts --documents-only && a3s-test run tests/e2e/word-large-document-windowing.acl --json",
104
107
  "test:e2e:large-documents:check": "a3s-test check tests/e2e/word-large-document-windowing.acl --json",
@@ -132,6 +135,8 @@
132
135
  "test:e2e:spreadsheet-ribbon:check": "a3s-test check tests/e2e/spreadsheet-ribbon-alignment.acl --json",
133
136
  "test:e2e:spreadsheet-cell-style": "a3s-test run tests/e2e/spreadsheet-cell-style.acl --json",
134
137
  "test:e2e:spreadsheet-cell-style:check": "a3s-test check tests/e2e/spreadsheet-cell-style.acl --json",
138
+ "test:e2e:spreadsheet-table": "a3s-test run tests/e2e/spreadsheet-table.acl --json",
139
+ "test:e2e:spreadsheet-table:check": "a3s-test check tests/e2e/spreadsheet-table.acl --json",
135
140
  "test:e2e:spreadsheet-cell-fill": "a3s-test run tests/e2e/spreadsheet-cell-fill.acl --json",
136
141
  "test:e2e:spreadsheet-cell-fill:check": "a3s-test check tests/e2e/spreadsheet-cell-fill.acl --json",
137
142
  "test:e2e:spreadsheet-auto-sum": "a3s-test run tests/e2e/spreadsheet-auto-sum.acl --json",
@@ -140,6 +145,10 @@
140
145
  "test:e2e:spreadsheet-paste-special:check": "a3s-test check tests/e2e/spreadsheet-paste-special.acl --json",
141
146
  "test:e2e:spreadsheet-go-to": "a3s-test run tests/e2e/spreadsheet-go-to.acl --json",
142
147
  "test:e2e:spreadsheet-go-to:check": "a3s-test check tests/e2e/spreadsheet-go-to.acl --json",
148
+ "test:e2e:spreadsheet-data-validation": "a3s-test run tests/e2e/spreadsheet-data-validation.acl --json",
149
+ "test:e2e:spreadsheet-data-validation:check": "a3s-test check tests/e2e/spreadsheet-data-validation.acl --json",
150
+ "test:e2e:spreadsheet-hyperlink": "a3s-test run tests/e2e/spreadsheet-hyperlink.acl --json",
151
+ "test:e2e:spreadsheet-hyperlink:check": "a3s-test check tests/e2e/spreadsheet-hyperlink.acl --json",
143
152
  "test:e2e:spreadsheet-maximum-sparse": "a3s-test run tests/e2e/spreadsheet-maximum-sparse.acl --json",
144
153
  "test:e2e:spreadsheet-maximum-sparse:check": "a3s-test check tests/e2e/spreadsheet-maximum-sparse.acl --json",
145
154
  "test:e2e:spreadsheet-large": "bun .a3s-test/performance/generate-fixtures.ts --spreadsheets-only && a3s-test run tests/e2e/spreadsheet-large-controlled-editing.acl --json",