@a3s-lab/office 0.15.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 (33) hide show
  1. package/COLLABORATION_ROADMAP.md +15 -5
  2. package/README.md +22 -1
  3. package/dist/0~6090.js +7 -8
  4. package/dist/0~spreadsheet-editor.js +2106 -438
  5. package/dist/2180.js +370 -34
  6. package/dist/4104.js +657 -22
  7. package/dist/5184.js +1 -1
  8. package/dist/8715.js +156 -156
  9. package/dist/internal/collaboration/office-spreadsheet-collaboration-records.d.ts +2 -0
  10. package/dist/internal/collaboration/office-spreadsheet-collaboration-validation-support.d.ts +6 -0
  11. package/dist/internal/features/work/editors/spreadsheet-auto-filter.d.ts +1 -0
  12. package/dist/internal/features/work/editors/spreadsheet-command-catalog.d.ts +21 -1
  13. package/dist/internal/features/work/editors/spreadsheet-command-controller.d.ts +10 -0
  14. package/dist/internal/features/work/editors/spreadsheet-editor-ribbon.d.ts +4 -2
  15. package/dist/internal/features/work/editors/spreadsheet-table-command.d.ts +3 -0
  16. package/dist/internal/features/work/editors/spreadsheet-table-conversion.d.ts +7 -0
  17. package/dist/internal/features/work/editors/spreadsheet-table-dialog.d.ts +8 -0
  18. package/dist/internal/features/work/editors/spreadsheet-table-limits.d.ts +1 -0
  19. package/dist/internal/features/work/editors/spreadsheet-table-reconciliation.d.ts +21 -0
  20. package/dist/internal/features/work/editors/spreadsheet-table-render.d.ts +16 -0
  21. package/dist/internal/features/work/editors/spreadsheet-table-ribbon.d.ts +8 -0
  22. package/dist/internal/features/work/editors/spreadsheet-table-style.d.ts +31 -0
  23. package/dist/internal/features/work/editors/spreadsheet-table.d.ts +55 -0
  24. package/dist/internal/features/work/editors/use-spreadsheet-table.d.ts +23 -0
  25. package/dist/internal/features/work/work-types.d.ts +100 -0
  26. package/dist/internal/features/work/work-xlsx-interop.d.ts +2 -0
  27. package/dist/internal/features/work/work-xlsx-table-filters.d.ts +3 -0
  28. package/dist/internal/features/work/work-xlsx-tables.d.ts +4 -0
  29. package/dist/office-kernel.wasm +0 -0
  30. package/dist/styles.css +189 -0
  31. package/dist/work-spreadsheet-package-scan.worker.js +3 -2
  32. package/docs/latest/en/browser-editor-architecture.md +43 -0
  33. package/package.json +4 -1
@@ -213,12 +213,112 @@ export interface WorkSpreadsheetDataValidationRange {
213
213
  ranges: WorkSpreadsheetCellRange[];
214
214
  item: WorkSpreadsheetDataValidationItem;
215
215
  }
216
+ export type WorkSpreadsheetTableStyle = {
217
+ family: 'none';
218
+ } | {
219
+ family: 'light';
220
+ number: number;
221
+ } | {
222
+ family: 'medium';
223
+ number: number;
224
+ } | {
225
+ family: 'dark';
226
+ number: number;
227
+ };
228
+ export interface WorkSpreadsheetTableColumn {
229
+ name: string;
230
+ }
231
+ export type WorkSpreadsheetDynamicFilter = 'above-average' | 'below-average' | 'tomorrow' | 'today' | 'yesterday' | 'next-week' | 'this-week' | 'last-week' | 'next-month' | 'this-month' | 'last-month' | 'next-quarter' | 'this-quarter' | 'last-quarter' | 'next-year' | 'this-year' | 'last-year' | 'year-to-date' | 'quarter-1' | 'quarter-2' | 'quarter-3' | 'quarter-4' | 'month-1' | 'month-2' | 'month-3' | 'month-4' | 'month-5' | 'month-6' | 'month-7' | 'month-8' | 'month-9' | 'month-10' | 'month-11' | 'month-12';
232
+ export type WorkSpreadsheetTableFilterCriteria = {
233
+ type: 'values';
234
+ values: string[];
235
+ includeBlanks: boolean;
236
+ } | {
237
+ type: 'equals';
238
+ value: string;
239
+ } | {
240
+ type: 'not-equals';
241
+ value: string;
242
+ } | {
243
+ type: 'contains';
244
+ value: string;
245
+ } | {
246
+ type: 'does-not-contain';
247
+ value: string;
248
+ } | {
249
+ type: 'begins-with';
250
+ value: string;
251
+ } | {
252
+ type: 'ends-with';
253
+ value: string;
254
+ } | {
255
+ type: 'greater-than';
256
+ value: string;
257
+ } | {
258
+ type: 'greater-than-or-equal';
259
+ value: string;
260
+ } | {
261
+ type: 'less-than';
262
+ value: string;
263
+ } | {
264
+ type: 'less-than-or-equal';
265
+ value: string;
266
+ } | {
267
+ type: 'between';
268
+ lower: string;
269
+ upper: string;
270
+ } | {
271
+ type: 'not-between';
272
+ lower: string;
273
+ upper: string;
274
+ } | {
275
+ type: 'blanks';
276
+ } | {
277
+ type: 'non-blanks';
278
+ } | {
279
+ type: 'top';
280
+ count: number;
281
+ } | {
282
+ type: 'top-percent';
283
+ percent: number;
284
+ } | {
285
+ type: 'bottom';
286
+ count: number;
287
+ } | {
288
+ type: 'bottom-percent';
289
+ percent: number;
290
+ } | {
291
+ type: 'dynamic';
292
+ kind: WorkSpreadsheetDynamicFilter;
293
+ };
294
+ export interface WorkSpreadsheetTableFilter {
295
+ column: number;
296
+ criteria: WorkSpreadsheetTableFilterCriteria;
297
+ }
298
+ export interface WorkSpreadsheetTable {
299
+ /** Stable browser-model identity. OOXML numeric identity is kept separately. */
300
+ id: string;
301
+ ooxmlId?: number;
302
+ name: string;
303
+ displayName?: string;
304
+ range: WorkSpreadsheetCellRange;
305
+ columns: WorkSpreadsheetTableColumn[];
306
+ filters: WorkSpreadsheetTableFilter[];
307
+ headerRow: boolean;
308
+ totalsRow: boolean;
309
+ style: WorkSpreadsheetTableStyle;
310
+ showFirstColumn: boolean;
311
+ showLastColumn: boolean;
312
+ showRowStripes: boolean;
313
+ showColumnStripes: boolean;
314
+ }
216
315
  export type WorkSpreadsheetSheet = Omit<Sheet, 'images'> & {
217
316
  images?: WorkSpreadsheetImage[];
218
317
  charts?: WorkSpreadsheetChart[];
219
318
  pivotTables?: WorkSpreadsheetPivotTable[];
220
319
  formulaMetadata?: WorkSpreadsheetFormulaMetadata;
221
320
  dataValidationRanges?: WorkSpreadsheetDataValidationRange[];
321
+ tables?: WorkSpreadsheetTable[];
222
322
  };
223
323
  export type WorkSpreadsheetPivotAggregation = 'sum' | 'count' | 'counta' | 'average' | 'max' | 'min' | 'product' | 'stdDev' | 'stdDevP' | 'var' | 'varP';
224
324
  export interface WorkSpreadsheetPivotValue {
@@ -9,6 +9,7 @@ import { type XlsxManualPageBreaks } from './work-xlsx-page-breaks';
9
9
  import { type XlsxPageSetup } from './work-xlsx-page-setup';
10
10
  import { type XlsxProtectionFeatures } from './work-xlsx-protection';
11
11
  import { type XlsxWorksheetXmlScan } from './work-xlsx-worksheet-scan';
12
+ import type { WorkSpreadsheetTable } from './work-types';
12
13
  type FrozenPane = NonNullable<Sheet['frozen']>;
13
14
  export interface XlsxDataValidation {
14
15
  references: string[];
@@ -24,6 +25,7 @@ export interface XlsxSheetFeatures {
24
25
  pageSetup?: XlsxPageSetup;
25
26
  images: XlsxWorksheetImage[];
26
27
  charts: XlsxWorksheetChart[];
28
+ tables: WorkSpreadsheetTable[];
27
29
  }
28
30
  export type FortuneDataValidationItem = WorkSpreadsheetDataValidationItem;
29
31
  export declare function readXlsxSheetFeatures(buffer: ArrayBuffer): Promise<Map<string, XlsxSheetFeatures>>;
@@ -0,0 +1,3 @@
1
+ import type { WorkSpreadsheetTableFilter } from './work-types';
2
+ export declare function readXlsxTableFilters(table: Document, width: number): WorkSpreadsheetTableFilter[];
3
+ export declare function xlsxTableAutoFilterXml(filters: readonly WorkSpreadsheetTableFilter[], rangeReference: string, totalsRow: boolean): string;
@@ -0,0 +1,4 @@
1
+ import { OoxmlPackage } from './work-ooxml-package';
2
+ import type { WorkSpreadsheetContent, WorkSpreadsheetTable } from './work-types';
3
+ export declare function readXlsxWorksheetTables(archive: OoxmlPackage, worksheetPart: string): Promise<WorkSpreadsheetTable[]>;
4
+ export declare function patchXlsxSpreadsheetTables(buffer: ArrayBuffer, content: WorkSpreadsheetContent): Promise<ArrayBuffer>;
Binary file
package/dist/styles.css CHANGED
@@ -16436,6 +16436,195 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
16436
16436
  }
16437
16437
  }
16438
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
+
16439
16628
  .work-spreadsheet-chart-manager {
16440
16629
  border: 0;
16441
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.15.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",
@@ -90,6 +90,7 @@
90
90
  "playground:visual:spreadsheet-data-validation": "playwright test visual-tests/spreadsheet-data-validation.functional.spec.ts --config playwright.config.ts",
91
91
  "playground:visual:spreadsheet-hyperlink": "playwright test visual-tests/spreadsheet-hyperlink.functional.spec.ts --config playwright.config.ts",
92
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",
93
94
  "playground:visual:update": "playwright test --config playwright.config.ts --update-snapshots",
94
95
  "performance:fixtures": "bun .a3s-test/performance/generate-fixtures.ts",
95
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",
@@ -134,6 +135,8 @@
134
135
  "test:e2e:spreadsheet-ribbon:check": "a3s-test check tests/e2e/spreadsheet-ribbon-alignment.acl --json",
135
136
  "test:e2e:spreadsheet-cell-style": "a3s-test run tests/e2e/spreadsheet-cell-style.acl --json",
136
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",
137
140
  "test:e2e:spreadsheet-cell-fill": "a3s-test run tests/e2e/spreadsheet-cell-fill.acl --json",
138
141
  "test:e2e:spreadsheet-cell-fill:check": "a3s-test check tests/e2e/spreadsheet-cell-fill.acl --json",
139
142
  "test:e2e:spreadsheet-auto-sum": "a3s-test run tests/e2e/spreadsheet-auto-sum.acl --json",