@a3s-lab/office 0.36.0 → 0.37.1

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 (59) hide show
  1. package/README.md +18 -6
  2. package/dist/0~3557.js +2 -1
  3. package/dist/0~3635.js +4 -1
  4. package/dist/0~7048.js +93 -1
  5. package/dist/0~9073.js +7 -2
  6. package/dist/0~presentation-editor.js +45 -9
  7. package/dist/0~spreadsheet-editor.js +20321 -16966
  8. package/dist/4121.js +1942 -1939
  9. package/dist/{3266.js → 5416.js} +1504 -20
  10. package/dist/9333.js +1 -1
  11. package/dist/core.d.ts +1 -0
  12. package/dist/core.js +141 -28
  13. package/dist/index.js +1 -1
  14. package/dist/internal/features/work/editors/office-shortcuts.d.ts +1 -0
  15. package/dist/internal/features/work/editors/spreadsheet-auto-filter-command.d.ts +3 -0
  16. package/dist/internal/features/work/editors/spreadsheet-auto-filter-condition-dialog-model.d.ts +27 -0
  17. package/dist/internal/features/work/editors/spreadsheet-auto-filter-condition-dialog.d.ts +17 -0
  18. package/dist/internal/features/work/editors/spreadsheet-auto-filter-menu.d.ts +10 -0
  19. package/dist/internal/features/work/editors/spreadsheet-auto-filter.d.ts +16 -4
  20. package/dist/internal/features/work/editors/spreadsheet-cell-range.d.ts +1 -0
  21. package/dist/internal/features/work/editors/spreadsheet-command-catalog.d.ts +9 -0
  22. package/dist/internal/features/work/editors/spreadsheet-command-controller.d.ts +13 -1
  23. package/dist/internal/features/work/editors/spreadsheet-current-region.d.ts +12 -0
  24. package/dist/internal/features/work/editors/spreadsheet-editor.d.ts +3 -0
  25. package/dist/internal/features/work/editors/spreadsheet-sort-appearance.d.ts +45 -0
  26. package/dist/internal/features/work/editors/spreadsheet-sort-collation.d.ts +8 -0
  27. package/dist/internal/features/work/editors/spreadsheet-sort-command.d.ts +3 -0
  28. package/dist/internal/features/work/editors/spreadsheet-sort-custom-list-editor.d.ts +8 -0
  29. package/dist/internal/features/work/editors/spreadsheet-sort-custom-list-store.d.ts +13 -0
  30. package/dist/internal/features/work/editors/spreadsheet-sort-custom-list.d.ts +26 -0
  31. package/dist/internal/features/work/editors/spreadsheet-sort-dialog.d.ts +9 -0
  32. package/dist/internal/features/work/editors/spreadsheet-sort-matrix.d.ts +4 -0
  33. package/dist/internal/features/work/editors/spreadsheet-sort-options-dialog.d.ts +7 -0
  34. package/dist/internal/features/work/editors/spreadsheet-sort-order-controls.d.ts +16 -0
  35. package/dist/internal/features/work/editors/spreadsheet-sort-range-dialog.d.ts +7 -0
  36. package/dist/internal/features/work/editors/spreadsheet-sort.d.ts +138 -0
  37. package/dist/internal/features/work/editors/spreadsheet-table-totals.d.ts +39 -0
  38. package/dist/internal/features/work/editors/spreadsheet-table.d.ts +11 -1
  39. package/dist/internal/features/work/editors/use-spreadsheet-auto-filter.d.ts +12 -3
  40. package/dist/internal/features/work/editors/use-spreadsheet-sort.d.ts +26 -0
  41. package/dist/internal/features/work/editors/work-office-chrome.d.ts +3 -0
  42. package/dist/internal/features/work/work-spreadsheet-auto-filter.d.ts +14 -0
  43. package/dist/internal/features/work/work-spreadsheet-dynamic-filter.d.ts +7 -0
  44. package/dist/internal/features/work/work-spreadsheet-filter-contract.d.ts +3 -0
  45. package/dist/internal/features/work/work-spreadsheet-wildcard.d.ts +7 -0
  46. package/dist/internal/features/work/work-types.d.ts +45 -7
  47. package/dist/internal/features/work/work-xlsx-interop.d.ts +2 -1
  48. package/dist/internal/features/work/work-xlsx-table-filters.d.ts +3 -1
  49. package/dist/internal/kernel/office-kernel-spreadsheet-fallback-formula.d.ts +11 -0
  50. package/dist/office-kernel.wasm +0 -0
  51. package/dist/office-kernel.worker.js +93 -1
  52. package/dist/styles.css +789 -145
  53. package/dist/vue.d.ts +3 -1
  54. package/dist/vue.js +2 -0
  55. package/dist/web-component.d.ts +3 -1
  56. package/dist/web-component.js +9 -0
  57. package/dist/work-spreadsheet-package-scan.worker.js +2 -1
  58. package/docs/latest/en/browser-editor-architecture.md +136 -2
  59. package/package.json +24 -1
package/dist/vue.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { Extensions } from '@tiptap/core';
2
2
  import { type PropType } from 'vue';
3
- import type { DocumentContent, DocumentReviewConflictEvent, EditorAgentRequest, GetDocumentSelectionMenuItems, GetMarkdownSelectionMenuItems, MarkdownContent, OfficeCollaborationPresence, OfficeCollaborationSession, PdfCollaborationContent, PdfPageOrganizationExport, PresentationContent, SpreadsheetContent } from './core';
3
+ import type { DocumentContent, DocumentReviewConflictEvent, EditorAgentRequest, GetDocumentSelectionMenuItems, GetMarkdownSelectionMenuItems, MarkdownContent, OfficeCollaborationPresence, OfficeCollaborationSession, PdfCollaborationContent, PdfPageOrganizationExport, PresentationContent, SpreadsheetContent, SpreadsheetSortCustomListStore } from './core';
4
4
  import type { OfficeTheme } from './office-surface';
5
5
  import { type DocumentLayoutFont, type OfficeFileAction, type PdfEvidenceOverlay, type PdfEvidenceRegion } from './react';
6
6
  export declare const DocumentEditor: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
@@ -165,6 +165,7 @@ export declare const SpreadsheetEditor: import("vue").DefineComponent<import("vu
165
165
  type: BooleanConstructor;
166
166
  };
167
167
  saveStatus: StringConstructor;
168
+ sortCustomListStore: PropType<SpreadsheetSortCustomListStore>;
168
169
  theme: {
169
170
  readonly default: "system";
170
171
  readonly type: PropType<OfficeTheme>;
@@ -192,6 +193,7 @@ export declare const SpreadsheetEditor: import("vue").DefineComponent<import("vu
192
193
  type: BooleanConstructor;
193
194
  };
194
195
  saveStatus: StringConstructor;
196
+ sortCustomListStore: PropType<SpreadsheetSortCustomListStore>;
195
197
  theme: {
196
198
  readonly default: "system";
197
199
  readonly type: PropType<OfficeTheme>;
package/dist/vue.js CHANGED
@@ -152,6 +152,7 @@ const SpreadsheetEditor = defineComponent({
152
152
  type: Boolean
153
153
  },
154
154
  saveStatus: String,
155
+ sortCustomListStore: Object,
155
156
  theme: themeProp
156
157
  },
157
158
  emits: {
@@ -173,6 +174,7 @@ const SpreadsheetEditor = defineComponent({
173
174
  },
174
175
  preview: props.preview,
175
176
  saveStatus: props.saveStatus,
177
+ sortCustomListStore: props.sortCustomListStore,
176
178
  theme: props.theme
177
179
  }));
178
180
  }
@@ -1,6 +1,6 @@
1
1
  import type { Extensions } from '@tiptap/core';
2
2
  import { type ReactNode } from 'react';
3
- import type { DocumentContent, EditorAgentRequest, GetDocumentSelectionMenuItems, GetMarkdownSelectionMenuItems, MarkdownContent, OfficeCollaborationPresence, OfficeCollaborationSession, PdfCollaborationContent, PdfPageOrganizationExport, PresentationContent, SpreadsheetContent } from './core';
3
+ import type { DocumentContent, EditorAgentRequest, GetDocumentSelectionMenuItems, GetMarkdownSelectionMenuItems, MarkdownContent, OfficeCollaborationPresence, OfficeCollaborationSession, PdfCollaborationContent, PdfPageOrganizationExport, PresentationContent, SpreadsheetContent, SpreadsheetSortCustomListStore } from './core';
4
4
  import type { OfficeTheme } from './office-surface';
5
5
  import { type DocumentLayoutFont, type OfficeFileAction, type PdfEvidenceOverlay } from './react';
6
6
  declare const HTMLElementBase: {
@@ -68,6 +68,8 @@ export declare class A3SSpreadsheetEditorElement extends A3SContentEditorElement
68
68
  get collaboration(): OfficeCollaborationSession | undefined;
69
69
  set collaboration(value: OfficeCollaborationSession | undefined);
70
70
  set kernelWasmUrl(value: string | undefined);
71
+ get sortCustomListStore(): SpreadsheetSortCustomListStore | undefined;
72
+ set sortCustomListStore(value: SpreadsheetSortCustomListStore | undefined);
71
73
  protected editorNode(): ReactNode;
72
74
  }
73
75
  export declare class A3SPresentationEditorElement extends A3SContentEditorElement<PresentationContent> {
@@ -223,6 +223,7 @@ class A3SMarkdownEditorElement extends A3SContentEditorElement {
223
223
  }
224
224
  class A3SSpreadsheetEditorElement extends A3SContentEditorElement {
225
225
  #collaboration;
226
+ #sortCustomListStore;
226
227
  static get observedAttributes() {
227
228
  return [
228
229
  'kernel-wasm-url',
@@ -245,6 +246,13 @@ class A3SSpreadsheetEditorElement extends A3SContentEditorElement {
245
246
  if (void 0 === value) this.removeAttribute('kernel-wasm-url');
246
247
  else this.setAttribute('kernel-wasm-url', value);
247
248
  }
249
+ get sortCustomListStore() {
250
+ return this.#sortCustomListStore;
251
+ }
252
+ set sortCustomListStore(value) {
253
+ this.#sortCustomListStore = value;
254
+ this.requestRender();
255
+ }
248
256
  editorNode() {
249
257
  if (!this.content) return missingContent('spreadsheet', this.theme);
250
258
  return /*#__PURE__*/ createElement(SpreadsheetEditor, {
@@ -257,6 +265,7 @@ class A3SSpreadsheetEditorElement extends A3SContentEditorElement {
257
265
  onChange: (content)=>this.changeContent(content),
258
266
  preview: this.preview,
259
267
  saveStatus: this.saveStatus,
268
+ sortCustomListStore: this.sortCustomListStore,
260
269
  theme: this.theme
261
270
  });
262
271
  }
@@ -3985,6 +3985,7 @@ https://github.com/nodeca/pako/blob/main/LICENSE
3985
3985
  }
3986
3986
  const IMPORTED_WORKSHEET_ELEMENTS = new Set([
3987
3987
  'pane',
3988
+ 'autoFilter',
3988
3989
  'dataValidation',
3989
3990
  'conditionalFormatting',
3990
3991
  'sheetProtection',
@@ -4012,7 +4013,7 @@ https://github.com/nodeca/pako/blob/main/LICENSE
4012
4013
  'rowBreaks',
4013
4014
  'colBreaks'
4014
4015
  ]);
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*=|(r)(?=[\s/>]))/g;
4016
+ const WORKSHEET_SCAN_PATTERN = /<(?:[A-Za-z_][\w.-]*:)?(?:(cols|f|pane|autoFilter|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*=|(r)(?=[\s/>]))/g;
4016
4017
  function scanXlsxWorksheetXml(source) {
4017
4018
  let hasDirectCellStyles = false;
4018
4019
  let hasDiagnosticFeatures = false;
@@ -1430,8 +1430,142 @@ formulas authored on data rows and totals/header/data selectors. A consistent
1430
1430
  current-row rule is persisted in the table metadata and fills only empty cells
1431
1431
  in newly inserted body rows; manual values and conflicting formulas fail closed.
1432
1432
  Dense and sparse sheet representations use the same path, and native XLSX
1433
- `<calculatedColumnFormula>` metadata round-trips. Complete totals-row
1434
- authoring, slicers, and external/query tables remain open gates.
1433
+ `<calculatedColumnFormula>` metadata round-trips. Native totals-row authoring
1434
+ now extends the same model: Table Design controls the row and each column's
1435
+ label, aggregate, or custom formula; native aggregates map to filter-aware
1436
+ `SUBTOTAL` codes; generated cells are reconciled after direct edits, row/column
1437
+ changes, and table renames; and `totalsRowFunction`, `totalsRowLabel`, and
1438
+ `totalsRowFormula` survive XLSX and Yjs round trips. Occupied, merged,
1439
+ protected, overlapping, AutoFilter, unsafe, external, and over-budget targets
1440
+ fail closed. Slicers and external/query tables remain open gates.
1441
+
1442
+ Value-based multi-key Custom Sort is now owned by a separate
1443
+ `spreadsheetSort` editor extension rather than the row/column structure
1444
+ extension. The command freezes one continuous selection, derives a header
1445
+ candidate, and validates up to 64 unique keys before cloning and stably sorting
1446
+ complete cell rows or columns. A nested Traditional Office-compatible Sort Options dialog
1447
+ selects top-to-bottom column keys or left-to-right row keys; the latter disables
1448
+ header retention because every selected column moves. The same normalized
1449
+ options select Simplified Chinese pinyin or stroke collation and optional case
1450
+ sensitivity. A key is a closed union
1451
+ of ascending/descending value order, an explicit custom sequence, or an
1452
+ effective cell-color, font-color, or conditional-icon target with axis-aware
1453
+ first/last placement. The
1454
+ `spreadsheet-sort-custom-list` model owns
1455
+ normalization, duplicate and size guards, seven immutable month/weekday lists,
1456
+ and rank matching; the validated request clones custom entries so command
1457
+ execution has no dependency on mutable UI state. The browser adapters own a
1458
+ bounded user-list registry and never writes preferences into controlled
1459
+ workbook content. Without a store it remains scoped to the mounted session.
1460
+ The optional typed `SpreadsheetSortCustomListStore` synchronously loads and
1461
+ saves canonical lists through a host-selected local backend. The provided
1462
+ `LocalStorageSpreadsheetSortCustomListStore` accepts an injected Storage
1463
+ object, uses a versioned key, and validates, deduplicates, and caps reads at 32
1464
+ lists. Corrupt reads fail closed; a rejected write visibly downgrades the new
1465
+ list to session scope. A stored list precedes an identical request-carried
1466
+ session copy so persistence identity remains stable. The separate
1467
+ `spreadsheet-sort-appearance` model snapshots direct native styles plus
1468
+ calculated conditional-format output, preserves no-fill/automatic identities,
1469
+ and declines to flatten native patterns or gradients into one color. The
1470
+ command reconstructs that snapshot from controlled sheet state and the live
1471
+ range immediately before execution, then validates its shape and target
1472
+ identities. The `spreadsheet-sort-collation` boundary compiles one local
1473
+ `Intl.Collator` per request, keeps numeric text lexical, behavior-probes the
1474
+ requested order instead of trusting runtime-specific resolved labels, and fails
1475
+ closed when that order is unavailable. A direction-neutral matrix engine transposes only its bounded item
1476
+ view, then uses one stable comparator for both orientations. Relative formula
1477
+ references are translated along the moved row or column axis with the same
1478
+ bounded reference engine used by Paste Special, while absolute references stay
1479
+ fixed.
1480
+ One accepted operation crosses the Fortune boundary as one range write and one
1481
+ controlled Undo record. Table, worksheet-AutoFilter, hyperlink-map,
1482
+ imported-formula-metadata, and border-sidecar intersections fail closed because
1483
+ those models still own coordinates outside the cell matrix. Moving large sorts,
1484
+ large aggregate/rank scans, remaining advanced filter predicates, full custom-list preference
1485
+ management, and structural sidecar reconciliation into the Worker/WASM kernel
1486
+ remains Stage 3 work.
1487
+ Direct host focus of the native grid now enters the same bounded focus observer
1488
+ used by ribbon commands. If a controlled workbook update replaces the focused
1489
+ Fortune overlay, focus transfers to its connected replacement; deliberate
1490
+ pointer, Tab, or active text-editor movement still cancels restoration.
1491
+
1492
+ Worksheet AutoFilter conditions now have a separate A3S-owned model and typed
1493
+ `spreadsheetAutoFilter` command extension. A versioned condition payload lives
1494
+ inside each Fortune filter column only as the grid projection; the controlled
1495
+ sheet, absolute header column, exact filter range, and editable state are
1496
+ reauthenticated before mutation. The pure evaluator reads dense or sparse cells
1497
+ and derives one hidden-row set per column. Their union drives Fortune row
1498
+ visibility, while an explicit overlap marker keeps independently hidden rows
1499
+ separate when a criterion is replaced or removed. This gives one source of
1500
+ truth for multi-column ownership instead of inferring provenance from the
1501
+ combined `config.rowhidden` map.
1502
+
1503
+ Same-column custom conditions use a separate fixed pair inside the closed
1504
+ filter union. Each item is a nonrecursive single-value predicate and the pair
1505
+ has one explicit AND/OR discriminator. The evaluator composes exactly two
1506
+ matchers, collaboration validation rejects any nested or differently sized
1507
+ condition array, and the dialog cannot attach a second condition to range,
1508
+ blank, Top/Bottom, or dynamic families.
1509
+
1510
+ Wildcard expressions are two additional nonrecursive custom-condition
1511
+ variants, so existing equality and other text operands remain literal. A pure
1512
+ compiler tokenizes `*`, `?`, and `~` once per criterion, normalizes literal
1513
+ segments and cell text with NFKC plus the existing locale-pinned lowercase
1514
+ folding, and evaluates the token sequence without executing or interpolating
1515
+ user text. The same 32,767-character operand ceiling is enforced by the dialog,
1516
+ model, command, and collaboration boundaries. Literal-only spans use ordered
1517
+ substring search; long fixed-width candidate scans switch to a bounded bitset
1518
+ matcher instead of quadratically rescanning late mismatches.
1519
+
1520
+ Top/Bottom criteria take a separate aggregate path before the per-cell matcher.
1521
+ The evaluator gathers finite numeric values from the filter column, converts a
1522
+ percentage to `ceil(n * percent / 100)` items, sorts in the requested direction,
1523
+ and uses the selected boundary as a comparison threshold. Every equal boundary
1524
+ value remains visible, while text, Boolean, blank, and nonfinite cells do not
1525
+ enter the ranking domain. Dense and sparse cell readers share this path, and
1526
+ the resulting hidden-row set remains one independently owned column entry.
1527
+
1528
+ Dynamic criteria use a separate pure compiler with an explicit local-clock
1529
+ context. Above/below-average consumes the column as an iterable, calculates one
1530
+ finite numeric mean, and returns a strict matcher without retaining the column.
1531
+ Date families compile one inclusive-start/exclusive-end serial interval and do
1532
+ not pre-read the column. They accept imported `Date` objects or finite numeric
1533
+ cells explicitly marked `ct.t='d'`, recover SheetJS local-date serials across
1534
+ time zones, reject the fictional serial 60, and never classify an unformatted
1535
+ number as a date. Relative weeks begin on Sunday; calendar month and quarter
1536
+ families classify independently of year. Column profiling is cached per
1537
+ immutable sheet and keeps typed dates out of numeric rank actions. The editor
1538
+ uses the current local clock, while model tests inject a deterministic clock.
1539
+ The controlled model still normalizes dates to the 1900 system; source-level
1540
+ 1904 retention remains an explicit import boundary.
1541
+
1542
+ The same closed `WorkSpreadsheetFilterCriteria` union now serves worksheet and
1543
+ table native OOXML. Package scan and import read only the worksheet root's
1544
+ direct `<autoFilter>` child, hydrate supported criteria, and retain imported
1545
+ unsupported typed criteria without pretending to evaluate them. Export patches
1546
+ the generated worksheet element with native `<filterColumn>` children. General
1547
+ two-item `<customFilters and="1|0">` groups, arbitrary positive/negative
1548
+ wildcard expressions, negative prefix/suffix forms, and
1549
+ `<top10 top="..." percent="..." val="..."/>` criteria round-trip through the
1550
+ shared worksheet/table path. Imported native dynamic filters are recomputed
1551
+ from current cells and emitted as native `<dynamicFilter>` elements. Canonical
1552
+ edge-star patterns still normalize to
1553
+ the narrower contains, begins-with, or ends-with variants. The
1554
+ React adapter owns only vendor-menu discovery, the accessible condition dialog,
1555
+ short-lived selection preservation, and focus restoration; unsafe vendor sort
1556
+ items are not exposed because they bypass typed sort and structural guards.
1557
+
1558
+ Partial-range planning is a separate controlled concern. The shared
1559
+ `spreadsheet-current-region` model reads dense `data` and sparse `celldata`
1560
+ without materializing worksheet dimensions, so AutoFilter and Sort cannot
1561
+ derive different bounds. The command layer creates exact and expanded
1562
+ candidates and evaluates mutation and structural guards independently. The
1563
+ React adapter owns only the accessible warning/custom-dialog transition and a
1564
+ short-lived authorization containing the frozen sort request plus its original
1565
+ selection. The command accepts an expanded destination only while the live
1566
+ selection still matches that origin; stale host state therefore fails closed.
1567
+ The header heuristic likewise reads raw non-formula text instead of formatted
1568
+ display strings, keeping numeric and formula result rows in the data body.
1435
1569
 
1436
1570
  Exit criteria: scrolling and selection do not scale with total row count;
1437
1571
  incremental recalculation touches only affected dependency subgraphs; XLSX
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a3s-lab/office",
3
- "version": "0.36.0",
3
+ "version": "0.37.1",
4
4
  "description": "Open-source collaborative browser editors for documents, Markdown, spreadsheets, presentations, and PDFs.",
5
5
  "keywords": [
6
6
  "office",
@@ -104,6 +104,12 @@
104
104
  "playground:visual:spreadsheet-data-validation": "playwright test visual-tests/spreadsheet-data-validation.functional.spec.ts --config playwright.config.ts",
105
105
  "playground:visual:spreadsheet-date-time": "playwright test visual-tests/spreadsheet-date-time.functional.spec.ts --config playwright.config.ts",
106
106
  "playground:visual:spreadsheet-copy-from-above": "playwright test visual-tests/spreadsheet-copy-from-above.functional.spec.ts --config playwright.config.ts",
107
+ "playground:visual:spreadsheet-custom-sort": "playwright test visual-tests/spreadsheet-custom-sort.functional.spec.ts --config playwright.config.ts",
108
+ "playground:visual:spreadsheet-custom-list-sort": "playwright test visual-tests/spreadsheet-custom-list-sort.functional.spec.ts --config playwright.config.ts",
109
+ "playground:visual:spreadsheet-appearance-sort": "playwright test visual-tests/spreadsheet-appearance-sort.functional.spec.ts --config playwright.config.ts",
110
+ "playground:visual:spreadsheet-row-sort": "playwright test visual-tests/spreadsheet-row-sort.functional.spec.ts --config playwright.config.ts",
111
+ "playground:visual:spreadsheet-text-sort": "playwright test visual-tests/spreadsheet-text-sort.functional.spec.ts --config playwright.config.ts",
112
+ "playground:visual:spreadsheet-sort-range": "playwright test visual-tests/spreadsheet-sort-range.functional.spec.ts --config playwright.config.ts",
107
113
  "playground:visual:spreadsheet-font-dialog-shortcuts": "playwright test visual-tests/spreadsheet-font-dialog-shortcuts.functional.spec.ts --config playwright.config.ts",
108
114
  "playground:visual:spreadsheet-diagonal-borders": "playwright test visual-tests/spreadsheet-diagonal-borders.functional.spec.ts --config playwright.config.ts",
109
115
  "playground:visual:spreadsheet-font-colors-shortcuts": "playwright test visual-tests/spreadsheet-font-colors-shortcuts.functional.spec.ts --config playwright.config.ts",
@@ -114,6 +120,7 @@
114
120
  "playground:visual:spreadsheet-rich-text": "playwright test visual-tests/spreadsheet-rich-text.functional.spec.ts --config playwright.config.ts",
115
121
  "playground:visual:spreadsheet-underline": "playwright test visual-tests/spreadsheet-underline.functional.spec.ts --config playwright.config.ts",
116
122
  "playground:visual:spreadsheet-table": "playwright test visual-tests/spreadsheet-table.functional.spec.ts --config playwright.config.ts",
123
+ "playground:visual:spreadsheet-table-totals": "playwright test visual-tests/spreadsheet-table-totals.functional.spec.ts --config playwright.config.ts",
117
124
  "playground:visual:presentation-animation": "playwright test visual-tests/presentation-animation.functional.spec.ts --config playwright.config.ts",
118
125
  "playground:visual:pdf-page-organization": "playwright test visual-tests/pdf-page-organization.functional.spec.ts --config playwright.config.ts",
119
126
  "playground:visual:update": "playwright test --config playwright.config.ts --update-snapshots",
@@ -136,6 +143,8 @@
136
143
  "test:e2e:pdf-page-organization:check": "a3s-test check tests/e2e/pdf-page-organization.acl --json",
137
144
  "test:e2e:presentation-animation": "A3S_TEST_SUITE=tests/e2e/presentation-animation.acl bash scripts/run-a3s-test-web-gate.sh",
138
145
  "test:e2e:presentation-animation:check": "a3s-test check tests/e2e/presentation-animation.acl --json",
146
+ "test:e2e:presentation-chinese-ime": "A3S_TEST_SUITE=tests/e2e/presentation-chinese-ime.acl bash scripts/run-a3s-test-web-gate.sh",
147
+ "test:e2e:presentation-chinese-ime:check": "a3s-test check tests/e2e/presentation-chinese-ime.acl --json",
139
148
  "test:e2e:large-presentation": "bun .a3s-test/performance/generate-fixtures.ts --presentations-only && a3s-test run tests/e2e/presentation-large-windowing.acl --json",
140
149
  "test:e2e:large-presentation:check": "a3s-test check tests/e2e/presentation-large-windowing.acl --json",
141
150
  "test:e2e:initial-focus": "a3s-test run tests/e2e/office-editor-initial-focus.acl --json",
@@ -178,6 +187,20 @@
178
187
  "test:e2e:spreadsheet-underline-styles:check": "a3s-test check tests/e2e/spreadsheet-underline-styles.acl --json",
179
188
  "test:e2e:spreadsheet-table": "a3s-test run tests/e2e/spreadsheet-table.acl --json",
180
189
  "test:e2e:spreadsheet-table:check": "a3s-test check tests/e2e/spreadsheet-table.acl --json",
190
+ "test:e2e:spreadsheet-table-totals": "a3s-test run tests/e2e/spreadsheet-table-totals.acl --json",
191
+ "test:e2e:spreadsheet-table-totals:check": "a3s-test check tests/e2e/spreadsheet-table-totals.acl --json",
192
+ "test:e2e:spreadsheet-custom-sort": "A3S_TEST_SUITE=tests/e2e/spreadsheet-custom-sort.acl bash scripts/run-a3s-test-web-gate.sh",
193
+ "test:e2e:spreadsheet-custom-sort:check": "a3s-test check tests/e2e/spreadsheet-custom-sort.acl --json",
194
+ "test:e2e:spreadsheet-custom-list-sort": "A3S_TEST_SUITE=tests/e2e/spreadsheet-custom-list-sort.acl bash scripts/run-a3s-test-web-gate.sh",
195
+ "test:e2e:spreadsheet-custom-list-sort:check": "a3s-test check tests/e2e/spreadsheet-custom-list-sort.acl --json",
196
+ "test:e2e:spreadsheet-appearance-sort": "A3S_TEST_SUITE=tests/e2e/spreadsheet-appearance-sort.acl bash scripts/run-a3s-test-web-gate.sh",
197
+ "test:e2e:spreadsheet-appearance-sort:check": "a3s-test check tests/e2e/spreadsheet-appearance-sort.acl --json",
198
+ "test:e2e:spreadsheet-row-sort": "A3S_TEST_SUITE=tests/e2e/spreadsheet-row-sort.acl bash scripts/run-a3s-test-web-gate.sh",
199
+ "test:e2e:spreadsheet-row-sort:check": "a3s-test check tests/e2e/spreadsheet-row-sort.acl --json",
200
+ "test:e2e:spreadsheet-text-sort": "A3S_TEST_SUITE=tests/e2e/spreadsheet-text-sort.acl bash scripts/run-a3s-test-web-gate.sh",
201
+ "test:e2e:spreadsheet-text-sort:check": "a3s-test check tests/e2e/spreadsheet-text-sort.acl --json",
202
+ "test:e2e:spreadsheet-sort-range": "A3S_TEST_SUITE=tests/e2e/spreadsheet-sort-range.acl bash scripts/run-a3s-test-web-gate.sh",
203
+ "test:e2e:spreadsheet-sort-range:check": "a3s-test check tests/e2e/spreadsheet-sort-range.acl --json",
181
204
  "test:e2e:spreadsheet-cell-fill": "a3s-test run tests/e2e/spreadsheet-cell-fill.acl --json",
182
205
  "test:e2e:spreadsheet-cell-fill:check": "a3s-test check tests/e2e/spreadsheet-cell-fill.acl --json",
183
206
  "test:e2e:spreadsheet-auto-sum": "a3s-test run tests/e2e/spreadsheet-auto-sum.acl --json",