@a3s-lab/office 0.21.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COLLABORATION_ROADMAP.md +1 -1
- package/README.md +88 -274
- package/dist/0~6090.js +2 -0
- package/dist/0~spreadsheet-editor.js +489 -87
- package/dist/internal/features/work/editors/spreadsheet-command-catalog.d.ts +56 -0
- package/dist/internal/features/work/editors/spreadsheet-command-controller.d.ts +4 -0
- package/dist/internal/features/work/editors/spreadsheet-copy-from-above-command.d.ts +3 -0
- package/dist/internal/features/work/editors/spreadsheet-copy-from-above.d.ts +18 -0
- package/dist/internal/features/work/editors/spreadsheet-date-time-command.d.ts +14 -0
- package/dist/internal/features/work/editors/spreadsheet-date-time-ribbon.d.ts +8 -0
- package/dist/office-kernel.wasm +0 -0
- package/dist/styles.css +35 -0
- package/docs/latest/en/browser-editor-architecture.md +16 -16
- package/package.json +8 -1
|
@@ -364,6 +364,34 @@ export declare const spreadsheetCommandCatalog: {
|
|
|
364
364
|
readonly group: "number";
|
|
365
365
|
};
|
|
366
366
|
};
|
|
367
|
+
readonly insertCurrentDate: {
|
|
368
|
+
readonly id: "number.insertCurrentDate";
|
|
369
|
+
readonly label: "插入当前日期";
|
|
370
|
+
readonly location: {
|
|
371
|
+
readonly area: "ribbon";
|
|
372
|
+
readonly tab: "home";
|
|
373
|
+
readonly group: "number";
|
|
374
|
+
};
|
|
375
|
+
readonly shortcut: {
|
|
376
|
+
readonly label: "Ctrl+;";
|
|
377
|
+
readonly aria: "Control+;";
|
|
378
|
+
readonly editor: readonly ["Control-;"];
|
|
379
|
+
};
|
|
380
|
+
};
|
|
381
|
+
readonly insertCurrentTime: {
|
|
382
|
+
readonly id: "number.insertCurrentTime";
|
|
383
|
+
readonly label: "插入当前时间";
|
|
384
|
+
readonly location: {
|
|
385
|
+
readonly area: "ribbon";
|
|
386
|
+
readonly tab: "home";
|
|
387
|
+
readonly group: "number";
|
|
388
|
+
};
|
|
389
|
+
readonly shortcut: {
|
|
390
|
+
readonly label: "Ctrl+Shift+;";
|
|
391
|
+
readonly aria: "Control+Shift+;";
|
|
392
|
+
readonly editor: readonly ["Control-Shift-;"];
|
|
393
|
+
};
|
|
394
|
+
};
|
|
367
395
|
readonly formatCells: {
|
|
368
396
|
readonly id: "number.formatCells";
|
|
369
397
|
readonly label: "设置单元格格式";
|
|
@@ -824,6 +852,34 @@ export declare const spreadsheetCommandCatalog: {
|
|
|
824
852
|
readonly group: "editing";
|
|
825
853
|
};
|
|
826
854
|
};
|
|
855
|
+
readonly copyFormulaFromAbove: {
|
|
856
|
+
readonly id: "editing.copyFormulaFromAbove";
|
|
857
|
+
readonly label: "复制上方公式";
|
|
858
|
+
readonly location: {
|
|
859
|
+
readonly area: "ribbon";
|
|
860
|
+
readonly tab: "home";
|
|
861
|
+
readonly group: "editing";
|
|
862
|
+
};
|
|
863
|
+
readonly shortcut: {
|
|
864
|
+
readonly label: "Ctrl+'";
|
|
865
|
+
readonly aria: "Control+'";
|
|
866
|
+
readonly editor: readonly ["Control-'"];
|
|
867
|
+
};
|
|
868
|
+
};
|
|
869
|
+
readonly copyValueFromAbove: {
|
|
870
|
+
readonly id: "editing.copyValueFromAbove";
|
|
871
|
+
readonly label: "复制上方值";
|
|
872
|
+
readonly location: {
|
|
873
|
+
readonly area: "ribbon";
|
|
874
|
+
readonly tab: "home";
|
|
875
|
+
readonly group: "editing";
|
|
876
|
+
};
|
|
877
|
+
readonly shortcut: {
|
|
878
|
+
readonly label: "Ctrl+Shift+'";
|
|
879
|
+
readonly aria: "Control+Shift+'";
|
|
880
|
+
readonly editor: readonly ["Control-Shift-'"];
|
|
881
|
+
};
|
|
882
|
+
};
|
|
827
883
|
readonly clearAll: {
|
|
828
884
|
readonly id: "editing.clearAll";
|
|
829
885
|
readonly label: "清除全部";
|
|
@@ -10,7 +10,9 @@ import type { SpreadsheetCellFormatRequest } from './spreadsheet-cell-format';
|
|
|
10
10
|
import type { SpreadsheetCellRange } from './spreadsheet-cell-range';
|
|
11
11
|
import type { SpreadsheetCellStyleChoice } from './spreadsheet-cell-style';
|
|
12
12
|
import type { SpreadsheetCellFillDirection } from './spreadsheet-cell-fill';
|
|
13
|
+
import type { SpreadsheetCopyFromAboveKind } from './spreadsheet-copy-from-above';
|
|
13
14
|
import { type SpreadsheetFontSizeDirection } from './spreadsheet-font-size-command';
|
|
15
|
+
import { type SpreadsheetDateTimeKind } from './spreadsheet-date-time-command';
|
|
14
16
|
import type { SpreadsheetDataValidationRequest, SpreadsheetDataValidationTarget } from './spreadsheet-data-validation';
|
|
15
17
|
import { type SpreadsheetCellMergeCommand } from './spreadsheet-cell-merge';
|
|
16
18
|
import type { SpreadsheetFormatPainterMode } from './spreadsheet-format-painter';
|
|
@@ -161,6 +163,7 @@ export interface SpreadsheetEditorCommands {
|
|
|
161
163
|
applyTable: (request: SpreadsheetTableRequest) => boolean;
|
|
162
164
|
cancelFormatPainter: () => boolean;
|
|
163
165
|
clearSelectedCells: (mode?: SpreadsheetCellClearMode) => boolean;
|
|
166
|
+
copyCellFromAbove: (kind: SpreadsheetCopyFromAboveKind) => boolean;
|
|
164
167
|
copySelection: () => boolean;
|
|
165
168
|
cutSelection: () => boolean;
|
|
166
169
|
deleteSelectedStructure: (axis: SpreadsheetStructureAxis) => boolean;
|
|
@@ -169,6 +172,7 @@ export interface SpreadsheetEditorCommands {
|
|
|
169
172
|
fillSelectedCells: (direction: SpreadsheetCellFillDirection) => boolean;
|
|
170
173
|
hideSheet: (sheetId: string) => boolean;
|
|
171
174
|
insertSelectedStructure: (axis: SpreadsheetStructureAxis, position: SpreadsheetStructureInsertPosition) => boolean;
|
|
175
|
+
insertCurrentDateTime: (kind: SpreadsheetDateTimeKind) => boolean;
|
|
172
176
|
mergeSelectedCells: (command: SpreadsheetCellMergeCommand) => boolean;
|
|
173
177
|
moveSheet: (sheetId: string, direction: SpreadsheetSheetMoveDirection) => boolean;
|
|
174
178
|
moveSelection: (move: SpreadsheetSelectionMove, extend: boolean) => boolean;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type OfficeEditorExtension } from './office-editor-extension';
|
|
2
|
+
import type { SpreadsheetCommandContext, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
|
|
3
|
+
export declare function createSpreadsheetCopyFromAboveExtension(): OfficeEditorExtension<SpreadsheetCommandContext, SpreadsheetEditorCommands>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { WorkSpreadsheetSheet } from '../work-types';
|
|
2
|
+
import type { SpreadsheetCellRange } from './spreadsheet-cell-range';
|
|
3
|
+
export type SpreadsheetCopyFromAboveKind = 'formula' | 'value';
|
|
4
|
+
export type SpreadsheetCopyFromAboveValue = boolean | number | string | null;
|
|
5
|
+
export interface SpreadsheetCopyFromAbovePlan {
|
|
6
|
+
formulaBarValue: SpreadsheetCopyFromAboveValue | '';
|
|
7
|
+
kind: SpreadsheetCopyFromAboveKind;
|
|
8
|
+
source: {
|
|
9
|
+
row: number;
|
|
10
|
+
column: number;
|
|
11
|
+
};
|
|
12
|
+
targetRange: SpreadsheetCellRange;
|
|
13
|
+
value: SpreadsheetCopyFromAboveValue;
|
|
14
|
+
}
|
|
15
|
+
export declare function planSpreadsheetCopyFromAbove(sheet: WorkSpreadsheetSheet | undefined, target: {
|
|
16
|
+
row: number;
|
|
17
|
+
column: number;
|
|
18
|
+
}, kind: SpreadsheetCopyFromAboveKind): SpreadsheetCopyFromAbovePlan | null;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Cell } from '@fortune-sheet/core';
|
|
2
|
+
import type { SpreadsheetCommandContext, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
|
|
3
|
+
import { type OfficeEditorExtension } from './office-editor-extension';
|
|
4
|
+
export type SpreadsheetDateTimeKind = 'date' | 'time';
|
|
5
|
+
export interface SpreadsheetDateTimeEntry {
|
|
6
|
+
format: NonNullable<Cell['ct']> & {
|
|
7
|
+
fa: string;
|
|
8
|
+
t: string;
|
|
9
|
+
};
|
|
10
|
+
formulaBarValue: string;
|
|
11
|
+
value: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function spreadsheetDateTimeEntry(kind: SpreadsheetDateTimeKind, now: Date): SpreadsheetDateTimeEntry | null;
|
|
14
|
+
export declare function createSpreadsheetDateTimeExtension(): OfficeEditorExtension<SpreadsheetCommandContext, SpreadsheetEditorCommands>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SpreadsheetEditorCanCommands, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
|
|
2
|
+
type SpreadsheetDateTimeCanCommands = Pick<SpreadsheetEditorCanCommands, 'insertCurrentDateTime'>;
|
|
3
|
+
type SpreadsheetDateTimeCommands = Pick<SpreadsheetEditorCommands, 'insertCurrentDateTime'>;
|
|
4
|
+
export declare function SpreadsheetDateTimeMenu({ can, commands, }: {
|
|
5
|
+
can: SpreadsheetDateTimeCanCommands;
|
|
6
|
+
commands: SpreadsheetDateTimeCommands;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
export {};
|
package/dist/office-kernel.wasm
CHANGED
|
Binary file
|
package/dist/styles.css
CHANGED
|
@@ -13885,6 +13885,41 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
|
|
|
13885
13885
|
min-width: 94px;
|
|
13886
13886
|
}
|
|
13887
13887
|
|
|
13888
|
+
.work-spreadsheet-number-format-stack {
|
|
13889
|
+
flex-direction: column;
|
|
13890
|
+
flex: 0 0 94px;
|
|
13891
|
+
gap: 2px;
|
|
13892
|
+
width: 94px;
|
|
13893
|
+
height: 51px;
|
|
13894
|
+
display: flex;
|
|
13895
|
+
}
|
|
13896
|
+
|
|
13897
|
+
.work-spreadsheet-number-format-stack > .work-spreadsheet-ribbon-menu-root {
|
|
13898
|
+
width: 94px;
|
|
13899
|
+
min-width: 0;
|
|
13900
|
+
}
|
|
13901
|
+
|
|
13902
|
+
.work-office-ribbon .work-office-toolbar .work-spreadsheet-number-format-stack .work-spreadsheet-date-time-trigger.with-label {
|
|
13903
|
+
flex-direction: row;
|
|
13904
|
+
justify-content: flex-start;
|
|
13905
|
+
gap: 4px;
|
|
13906
|
+
width: 94px;
|
|
13907
|
+
min-width: 94px;
|
|
13908
|
+
height: 21px;
|
|
13909
|
+
padding: 0 6px;
|
|
13910
|
+
}
|
|
13911
|
+
|
|
13912
|
+
.work-office-ribbon .work-office-toolbar .work-spreadsheet-number-format-stack .work-spreadsheet-date-time-trigger.with-label > svg {
|
|
13913
|
+
width: 14px;
|
|
13914
|
+
height: 14px;
|
|
13915
|
+
}
|
|
13916
|
+
|
|
13917
|
+
.work-office-ribbon .work-office-toolbar .work-spreadsheet-number-format-stack .work-spreadsheet-date-time-trigger.with-label > span {
|
|
13918
|
+
max-width: 66px;
|
|
13919
|
+
font-size: 9px;
|
|
13920
|
+
line-height: 11px;
|
|
13921
|
+
}
|
|
13922
|
+
|
|
13888
13923
|
.work-spreadsheet-workbook-panel {
|
|
13889
13924
|
z-index: 8;
|
|
13890
13925
|
border-left: 1px solid var(--a3s-line);
|
|
@@ -47,17 +47,17 @@ model:
|
|
|
47
47
|
and compacts low-priority, then normal-priority groups before exposing group
|
|
48
48
|
paging. It can remain collapsed; activating a tab temporarily overlays that
|
|
49
49
|
tab's commands without moving the document, and an outside pointer action
|
|
50
|
-
returns to the compact row. Writer routes its catalogued
|
|
50
|
+
returns to the compact row. Writer routes its catalogued Traditional Office font-size,
|
|
51
51
|
alignment, line-spacing, heading, spelling, field-refresh, comment, and
|
|
52
52
|
track-changes shortcuts only while the document surface owns the event. The
|
|
53
|
-
status route uses the same catalog for
|
|
53
|
+
status route uses the same catalog for Traditional Office word count, opening live page,
|
|
54
54
|
word, character, and paragraph details from either `Ctrl+Shift+G` or the
|
|
55
|
-
visible count. Its local formatting clipboard powers
|
|
55
|
+
visible count. Its local formatting clipboard powers Traditional Office copy-format and
|
|
56
56
|
paste-format shortcuts
|
|
57
57
|
plus a one-shot format painter without requiring browser clipboard access;
|
|
58
58
|
paste replaces only direct character and paragraph formatting, preserving
|
|
59
59
|
links, comments, and revision semantics in one document transaction.
|
|
60
|
-
Header and footer TipTap surfaces register the same
|
|
60
|
+
Header and footer TipTap surfaces register the same Traditional Office alignment and
|
|
61
61
|
copy-format shortcuts. Cross-surface paste retains compatible marks and
|
|
62
62
|
paragraph attributes while falling back from unsupported heading nodes.
|
|
63
63
|
Writer orders Insert commands as Pages, Table, Illustrations, Links, Header
|
|
@@ -105,11 +105,11 @@ model:
|
|
|
105
105
|
page metrics and scroll viewport. Picture, Table, and Header and Footer tabs
|
|
106
106
|
carry explicit contextual semantics and disappear with their selection. The
|
|
107
107
|
Spreadsheet shell now uses the same responsive ribbon contract with its own
|
|
108
|
-
command catalog and workbook semantics. It keeps the
|
|
108
|
+
command catalog and workbook semantics. It keeps the Traditional Office tab order, places
|
|
109
109
|
Conditional Formatting under Home and Styles, exposes real sorting under
|
|
110
110
|
Data, and owns F9 workbook recalculation in the root-scoped keyboard
|
|
111
111
|
controller. Paste, Cut, and Copy live in the first Home group; both button
|
|
112
|
-
clicks and
|
|
112
|
+
clicks and Traditional Office shortcuts cross one clipboard command port before using the
|
|
113
113
|
permission-resilient browser/local clipboard implementation. Paste Special
|
|
114
114
|
extends that port with a versioned rich snapshot and a pure bounded planner
|
|
115
115
|
instead of delegating mutation to rendered vendor controls. Quick All,
|
|
@@ -136,7 +136,7 @@ model:
|
|
|
136
136
|
`Alt+ArrowDown`. The Fortune adapter only exposes the header trigger and
|
|
137
137
|
value menu, adding dialog, checkbox, focus-restoration, and keyboard
|
|
138
138
|
semantics without making vendor DOM text the command contract. Freeze Panes
|
|
139
|
-
also stays controlled: a pure model translates the current
|
|
139
|
+
also stays controlled: a pure model translates the current Traditional Office cell into
|
|
140
140
|
rows above and columns left or applies top-row and first-column presets, a
|
|
141
141
|
typed View command performs one immutable workbook update, and the native
|
|
142
142
|
Fortune/XLSX frozen-pane model remains the render and serialization
|
|
@@ -300,7 +300,7 @@ focus restoration.
|
|
|
300
300
|
| --- | --- | --- | --- |
|
|
301
301
|
| Document | One TipTap/ProseMirror body tree retained across editing and read-only preview, controlled TipTap header/footer surfaces with direct paper-margin editing and a contextual ribbon, one typography and page-chrome baseline across editing, preview, and PDF surfaces, a persistent typed heading-navigation pane with active-selection tracking, filtering and collapsible keyboard traversal, host-owned selected-text menus with full document context and range-mapped async commands, responsive and keyboard-operated paragraph-style and list galleries, typed bullet and numbering commands with restart/continue/start controls, typed physical-page and section-page descriptors, repeated first/default/even page chrome, a versioned structured model with an HTML compatibility representation, prefix-reused visual-line measurement and pages, page decorations, page-aware horizontal and vertical rulers for page margins, paragraph indents and typed tab stops, structured list-item pagination, explicit paragraph and list-item direction, compact spacing and pagination controls, typed inline/square/tight/through/top-and-bottom/no-wrap image layout and floating-image drawing layers, imported style-inherited paragraph properties, structured inline tabs, and theme-aware run font/size/color/background import | Worker plus resumable Rust/WASM flow pagination and Rustybuzz shaping across CSS-matched registered text runs; the same live result remains mounted in read-only preview and is consumed by bounded browser PDF capture, including eligible list paragraphs, Unicode bidi level segmentation, ordered per-grapheme font fallback, packaged Latin/CJK/Arabic/Hebrew faces, and structured left-to-right tabs, with explicit DOM and JavaScript fallbacks for text affected by supported floats | Language-complete font substitution, complete Word style and numbering coverage, locale-complete and bidirectional tabs, arbitrary floating-object geometry and non-image drawing layers, complex table flow, searchable/vector PDF output, and loss-preserving OOXML package state |
|
|
302
302
|
| Markdown | TipTap visual editing with a resizable source-and-preview split view by default, source-aware ribbon formatting and shortcuts, bounded source-native history with coalesced typing and selection restoration, host-defined selection menus across both editing surfaces, GFM tables, strikethrough, autolinks and nested task lists, controlled source state, coalesced preview rebuilds, proportional pane scrolling, keyboard-adjustable pane sizing, a flat measure-bounded reading surface, optional visual or source-only views, and a full-workspace Source/Preview switch on phones | No kernel required for normal editing | CommonMark differential fixtures, multi-megabyte profiling, and an off-main-thread parser boundary when measurements justify it |
|
|
303
|
-
| Spreadsheet | Fortune Sheet grid integrated with the shared Office shell,
|
|
303
|
+
| Spreadsheet | Fortune Sheet grid integrated with the shared Office shell, an Office-oriented command catalog and tab order, quick-access Undo and Redo, a priority-aware adaptive and collapsible ribbon with temporary tab expansion, Home and Styles Conditional Formatting, Home and Cells row/column insertion and deletion through the shared typed structure commands, Home and Alignment Merge and Center plus Merge Cells, Merge Across, Unmerge Cells, and Unmerge and Fill through one native-model-backed controlled batch per intent and the Traditional Office `Ctrl+M` shortcut, Home and Font native strikethrough through the same typed formatting command and Traditional Office `Cmd/Ctrl+5`, Home and Editing Clear All, Formats, Contents, Comments, and Hyperlinks with Delete/Backspace mapped to content-only clearing and merge geometry retained, Data sorting and AutoFilter with bounded current-region discovery, controlled filter state, Traditional Office toggle and header-menu shortcuts, and accessible vendor menu semantics, View and Window Freeze Panes with Traditional Office current-cell, top-row, first-column, and unfreeze patterns backed by controlled state and native XLSX frozen panes, Formulas and F9 workbook recalculation, an executable Home clipboard group with permission-resilient Paste, Cut, and Copy plus an Office-style one-shot and locked Format Painter for bounded cross-sheet native-style patterns, shared grid/formula/footer visual tokens and one spreadsheet accent across selection, sheet tabs, menus, and zoom, an A3S-owned accessible single-row workbook footer for creation, activation, rename, duplicate, color, hide, reorder, delete, selection status, and zoom, a resize-observed worksheet viewport that keeps the active tab and its touch action visible across desktop, compact, and phone-width changes, one cell/worksheet context-menu surface whose displayed accelerators remain executable while the menu owns focus, Arrow/Home/End tab navigation plus Shift+F10 and native context-menu access, typed editing and calculation command ports, A3S-owned deterministic Arrow, Enter, Tab, Home, PageUp/PageDown, extended-selection, row, column, and all-cells keyboard commands, selection-preserving focus restoration across controlled workbook remounts and F2/Escape editing transitions, Cmd/Ctrl formatting, undo/redo, clear, a permission-resilient editor-local clipboard fallback, Shift+F11 sheet creation, and Ctrl/Cmd+PageUp/PageDown sheet-navigation shortcuts, direct font-family, horizontal/vertical-alignment, text-wrap, general/number/percent, and decimal-place controls backed by native cell-style keys, live count/sum/average selection summaries, operation-driven sparse-workbook projection, guarded controlled-value remounts that reject stale engine callbacks, and no-history result patches with cell-scoped Fortune fallback | Versioned, cancellable Worker/Rust-WASM calculation sessions using the shared bounded Rust formula parser, retained formula ASTs, incremental forward/reverse dependency graphs, dirty-subgraph recalculation, cross-sheet references, and a dynamically loaded JavaScript fallback | A3S-owned virtual grid, moving replacement projection off the main thread, broader Excel formula semantics, A3S-owned custom number-format evaluation, and print layout |
|
|
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
|
|
|
@@ -635,7 +635,7 @@ The current browser-kernel slice collects contiguous geometry-affecting text
|
|
|
635
635
|
runs from eligible paragraphs. Each run carries an ordered registered font
|
|
636
636
|
stack, size, line height, letter spacing, ligature, and kerning behavior. Font
|
|
637
637
|
families and normal/italic styles remain exact; numeric weights follow the CSS
|
|
638
|
-
Fonts matching order so
|
|
638
|
+
Fonts matching order so Office-style values such as 680 or 730 select a registered
|
|
639
639
|
700 face. When a family has only one normal-style weight, the same face
|
|
640
640
|
provides deterministic metrics for browser-synthesized bold text. The kernel
|
|
641
641
|
selects a face for each grapheme, joins adjacent selections that use the same
|
|
@@ -816,13 +816,13 @@ numbering settings. Reversed lists, per-item `value` overrides, native Word
|
|
|
816
816
|
list-identity continuation, arbitrary multilevel templates, and loss-preserving
|
|
817
817
|
custom numbering formats remain later fidelity gates.
|
|
818
818
|
|
|
819
|
-
The declared direct-formatting layout slice now has a real
|
|
819
|
+
The declared direct-formatting layout slice now has a real Traditional Office Writer reference
|
|
820
820
|
gate. Its deterministic A4 fixture uses installed Arial runs, explicit OOXML
|
|
821
821
|
paragraph spacing, a fixed centered table, direct cell fills and borders, and
|
|
822
822
|
physical cell margins. Automatic `w:line` values retain their original OOXML
|
|
823
|
-
multiples for export while the browser applies the measured
|
|
823
|
+
multiples for export while the browser applies the measured Traditional Office single-line
|
|
824
824
|
font metric; imported tables no longer receive editor-only block margins. The
|
|
825
|
-
Windows parity workflow exports the same fixture through
|
|
825
|
+
Windows parity workflow exports the same fixture through Traditional Office, captures both
|
|
826
826
|
794 by 1123 CSS-pixel pages, and rejects page-size, landmark, or bounded pixel
|
|
827
827
|
differences. Language-complete font substitution, variable font axes, the
|
|
828
828
|
remaining character and table style properties, non-image floating-object
|
|
@@ -1181,7 +1181,7 @@ Migration to browser-native OOXML is staged:
|
|
|
1181
1181
|
editing surfaces.
|
|
1182
1182
|
|
|
1183
1183
|
Each stage needs compatibility fixtures, deterministic layout goldens, large
|
|
1184
|
-
document performance budgets, and real Microsoft Office and
|
|
1184
|
+
document performance budgets, and real Microsoft Office and Traditional Office
|
|
1185
1185
|
interoperability evidence before it can be described as fidelity-complete.
|
|
1186
1186
|
|
|
1187
1187
|
## Delivery roadmap
|
|
@@ -1225,7 +1225,7 @@ bundle regression.
|
|
|
1225
1225
|
|
|
1226
1226
|
Exit criteria: deterministic layout goldens for the supported feature set;
|
|
1227
1227
|
incremental reflow does not rebuild unaffected pages; DOCX fixtures round-trip
|
|
1228
|
-
through Microsoft Word and
|
|
1228
|
+
through Microsoft Word and Traditional Office without losing unsupported package parts.
|
|
1229
1229
|
|
|
1230
1230
|
### Stage 3: spreadsheet calculation and virtualization
|
|
1231
1231
|
|
|
@@ -1355,7 +1355,7 @@ window.
|
|
|
1355
1355
|
Exit criteria: object drag and resize stay interactive on complex slides;
|
|
1356
1356
|
partial rich-text formatting survives PPTX round trips; masters, layouts,
|
|
1357
1357
|
themes, tables, charts, links, and notes have compatibility fixtures for
|
|
1358
|
-
PowerPoint and
|
|
1358
|
+
PowerPoint and Traditional Office.
|
|
1359
1359
|
|
|
1360
1360
|
### Stage 5: PDF product surface
|
|
1361
1361
|
|
|
@@ -1415,7 +1415,7 @@ page window rather than the complete file.
|
|
|
1415
1415
|
CLI, MCP server, and Skill.
|
|
1416
1416
|
|
|
1417
1417
|
Exit criteria: import-edit-export fixtures show semantic and package-level
|
|
1418
|
-
round-trip evidence in Microsoft Office and
|
|
1418
|
+
round-trip evidence in Microsoft Office and Traditional Office; unsupported content is
|
|
1419
1419
|
retained or rejected explicitly, never silently discarded.
|
|
1420
1420
|
|
|
1421
1421
|
## Performance gates
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@a3s-lab/office",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "Open-source collaborative browser editors for documents, Markdown, spreadsheets, presentations, and PDFs.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"office",
|
|
@@ -88,6 +88,8 @@
|
|
|
88
88
|
"playground:typecheck": "tsc --noEmit -p playground/tsconfig.json",
|
|
89
89
|
"playground:visual": "playwright test --config playwright.config.ts",
|
|
90
90
|
"playground:visual:spreadsheet-data-validation": "playwright test visual-tests/spreadsheet-data-validation.functional.spec.ts --config playwright.config.ts",
|
|
91
|
+
"playground:visual:spreadsheet-date-time": "playwright test visual-tests/spreadsheet-date-time.functional.spec.ts --config playwright.config.ts",
|
|
92
|
+
"playground:visual:spreadsheet-copy-from-above": "playwright test visual-tests/spreadsheet-copy-from-above.functional.spec.ts --config playwright.config.ts",
|
|
91
93
|
"playground:visual:spreadsheet-diagonal-borders": "playwright test visual-tests/spreadsheet-diagonal-borders.functional.spec.ts --config playwright.config.ts",
|
|
92
94
|
"playground:visual:spreadsheet-font-colors-shortcuts": "playwright test visual-tests/spreadsheet-font-colors-shortcuts.functional.spec.ts --config playwright.config.ts",
|
|
93
95
|
"playground:visual:spreadsheet-hyperlink": "playwright test visual-tests/spreadsheet-hyperlink.functional.spec.ts --config playwright.config.ts",
|
|
@@ -160,6 +162,10 @@
|
|
|
160
162
|
"test:e2e:spreadsheet-data-validation:check": "a3s-test check tests/e2e/spreadsheet-data-validation.acl --json",
|
|
161
163
|
"test:e2e:spreadsheet-diagonal-borders": "a3s-test run tests/e2e/spreadsheet-diagonal-borders.acl --json",
|
|
162
164
|
"test:e2e:spreadsheet-diagonal-borders:check": "a3s-test check tests/e2e/spreadsheet-diagonal-borders.acl --json",
|
|
165
|
+
"test:e2e:spreadsheet-date-time": "a3s-test run tests/e2e/spreadsheet-date-time.acl --json",
|
|
166
|
+
"test:e2e:spreadsheet-date-time:check": "a3s-test check tests/e2e/spreadsheet-date-time.acl --json",
|
|
167
|
+
"test:e2e:spreadsheet-copy-from-above": "A3S_TEST_SUITE=tests/e2e/spreadsheet-copy-from-above.acl bash scripts/run-a3s-test-web-gate.sh",
|
|
168
|
+
"test:e2e:spreadsheet-copy-from-above:check": "a3s-test check tests/e2e/spreadsheet-copy-from-above.acl --json",
|
|
163
169
|
"test:e2e:spreadsheet-hyperlink": "a3s-test run tests/e2e/spreadsheet-hyperlink.acl --json",
|
|
164
170
|
"test:e2e:spreadsheet-hyperlink:check": "a3s-test check tests/e2e/spreadsheet-hyperlink.acl --json",
|
|
165
171
|
"test:e2e:spreadsheet-maximum-sparse": "a3s-test run tests/e2e/spreadsheet-maximum-sparse.acl --json",
|
|
@@ -179,6 +185,7 @@
|
|
|
179
185
|
"test:e2e:writer-status": "a3s-test run tests/e2e/word-status-bar.acl --json",
|
|
180
186
|
"test:e2e:writer-status:check": "a3s-test check tests/e2e/word-status-bar.acl --json",
|
|
181
187
|
"test:wps-layout": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/test-wps-layout-parity.ps1",
|
|
188
|
+
"test:office-layout": "bun run test:wps-layout",
|
|
182
189
|
"test:watch": "rstest --watch",
|
|
183
190
|
"typecheck": "tsc --noEmit"
|
|
184
191
|
},
|