@a3s-lab/office 0.13.1 → 0.14.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 (35) hide show
  1. package/README.md +28 -5
  2. package/dist/0~7048.js +14 -4
  3. package/dist/0~spreadsheet-editor.js +9329 -5294
  4. package/dist/internal/features/work/editors/office-checkbox.d.ts +3 -2
  5. package/dist/internal/features/work/editors/spreadsheet-auto-sum-command.d.ts +3 -0
  6. package/dist/internal/features/work/editors/spreadsheet-auto-sum.d.ts +19 -0
  7. package/dist/internal/features/work/editors/spreadsheet-cell-format-command.d.ts +3 -0
  8. package/dist/internal/features/work/editors/spreadsheet-cell-format.d.ts +36 -0
  9. package/dist/internal/features/work/editors/spreadsheet-cell-mutation-guard.d.ts +4 -0
  10. package/dist/internal/features/work/editors/spreadsheet-clipboard-shortcuts.d.ts +1 -0
  11. package/dist/internal/features/work/editors/spreadsheet-clipboard.d.ts +13 -0
  12. package/dist/internal/features/work/editors/spreadsheet-command-catalog.d.ts +119 -0
  13. package/dist/internal/features/work/editors/spreadsheet-command-controller.d.ts +38 -0
  14. package/dist/internal/features/work/editors/spreadsheet-context-menu.d.ts +5 -15
  15. package/dist/internal/features/work/editors/spreadsheet-editor-ribbon.d.ts +1 -2
  16. package/dist/internal/features/work/editors/spreadsheet-format-cells-dialog-model.d.ts +86 -0
  17. package/dist/internal/features/work/editors/spreadsheet-format-cells-dialog-panels.d.ts +15 -0
  18. package/dist/internal/features/work/editors/spreadsheet-format-cells-dialog.d.ts +8 -0
  19. package/dist/internal/features/work/editors/spreadsheet-go-to.d.ts +24 -0
  20. package/dist/internal/features/work/editors/spreadsheet-keyboard-navigation.d.ts +4 -0
  21. package/dist/internal/features/work/editors/spreadsheet-navigation-command.d.ts +3 -0
  22. package/dist/internal/features/work/editors/spreadsheet-number-format-command.d.ts +24 -0
  23. package/dist/internal/features/work/editors/spreadsheet-paste-special-cell.d.ts +17 -0
  24. package/dist/internal/features/work/editors/spreadsheet-paste-special-dialog.d.ts +9 -0
  25. package/dist/internal/features/work/editors/spreadsheet-paste-special-mode.d.ts +11 -0
  26. package/dist/internal/features/work/editors/spreadsheet-paste-special-plan.d.ts +4 -0
  27. package/dist/internal/features/work/editors/spreadsheet-paste-special-sheet.d.ts +23 -0
  28. package/dist/internal/features/work/editors/spreadsheet-paste-special-snapshot.d.ts +10 -0
  29. package/dist/internal/features/work/editors/spreadsheet-paste-special-types.d.ts +127 -0
  30. package/dist/internal/features/work/editors/spreadsheet-paste-special.d.ts +7 -0
  31. package/dist/internal/features/work/editors/use-spreadsheet-clipboard.d.ts +36 -0
  32. package/dist/office-kernel.wasm +0 -0
  33. package/dist/styles.css +548 -1
  34. package/docs/latest/en/browser-editor-architecture.md +12 -1
  35. package/package.json +9 -3
@@ -1,9 +1,10 @@
1
- import type { ReactNode } from 'react';
2
- export declare function OfficeCheckbox({ ariaLabel, checked, onCheckedChange, children, disabled, className, }: {
1
+ import { type ReactNode } from 'react';
2
+ export declare function OfficeCheckbox({ ariaLabel, checked, onCheckedChange, children, disabled, className, indeterminate, }: {
3
3
  ariaLabel: string;
4
4
  checked: boolean;
5
5
  onCheckedChange: (checked: boolean) => void;
6
6
  children: ReactNode;
7
7
  disabled?: boolean;
8
8
  className?: string;
9
+ indeterminate?: boolean;
9
10
  }): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SpreadsheetCommandContext, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
2
+ import { type OfficeEditorExtension } from './office-editor-extension';
3
+ export declare function createSpreadsheetAutoSumExtension(): OfficeEditorExtension<SpreadsheetCommandContext, SpreadsheetEditorCommands>;
@@ -0,0 +1,19 @@
1
+ import type { WorkSpreadsheetSheet } from '../work-types';
2
+ import { type SpreadsheetCellRange, type SpreadsheetCellRangeInput } from './spreadsheet-cell-range';
3
+ export declare const spreadsheetAutoSumMaximumTargets = 1000;
4
+ export type SpreadsheetAutoSumFunction = 'sum' | 'average' | 'count' | 'max' | 'min';
5
+ export interface SpreadsheetAutoSumWrite {
6
+ range: SpreadsheetCellRange;
7
+ values: string[][];
8
+ }
9
+ export interface SpreadsheetAutoSumPlan {
10
+ formulaBarValue: string;
11
+ function: SpreadsheetAutoSumFunction;
12
+ selection: SpreadsheetCellRange & {
13
+ row_focus: number;
14
+ column_focus: number;
15
+ };
16
+ targetCellCount: number;
17
+ writes: SpreadsheetAutoSumWrite[];
18
+ }
19
+ export declare function planSpreadsheetAutoSum(sheet: WorkSpreadsheetSheet | undefined, selection: SpreadsheetCellRangeInput, functionName: SpreadsheetAutoSumFunction): SpreadsheetAutoSumPlan | null;
@@ -0,0 +1,3 @@
1
+ import type { SpreadsheetCommandContext, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
2
+ import { type OfficeEditorExtension } from './office-editor-extension';
3
+ export declare function createSpreadsheetCellFormatExtension(): OfficeEditorExtension<SpreadsheetCommandContext, SpreadsheetEditorCommands>;
@@ -0,0 +1,36 @@
1
+ import type { Cell } from '@fortune-sheet/core';
2
+ import type { WorkSpreadsheetContent, WorkSpreadsheetSheet } from '../work-types';
3
+ import { type SpreadsheetCellBorderFormat } from './spreadsheet-cell-border';
4
+ import { type SpreadsheetCellRange } from './spreadsheet-cell-range';
5
+ export declare const MAX_SPREADSHEET_CELL_FORMAT_CELLS = 10000;
6
+ export type SpreadsheetHorizontalAlignment = 'general' | 'left' | 'center' | 'right';
7
+ export type SpreadsheetVerticalAlignment = 'top' | 'middle' | 'bottom';
8
+ export interface SpreadsheetCellFormatPatch {
9
+ numberFormat?: string;
10
+ horizontalAlignment?: SpreadsheetHorizontalAlignment;
11
+ verticalAlignment?: SpreadsheetVerticalAlignment;
12
+ wrapText?: boolean;
13
+ rotation?: number;
14
+ fontFamily?: string;
15
+ fontSize?: number;
16
+ fontColor?: string;
17
+ bold?: boolean;
18
+ italic?: boolean;
19
+ underline?: boolean;
20
+ strike?: boolean;
21
+ fillColor?: string | null;
22
+ borders?: readonly SpreadsheetCellBorderFormat[];
23
+ locked?: boolean;
24
+ hidden?: boolean;
25
+ }
26
+ export interface SpreadsheetCellFormatRequest {
27
+ sheetId: string;
28
+ range: SpreadsheetCellRange;
29
+ patch: SpreadsheetCellFormatPatch;
30
+ }
31
+ export declare function canApplySpreadsheetCellFormat(content: WorkSpreadsheetContent, request: SpreadsheetCellFormatRequest): boolean;
32
+ export declare function applySpreadsheetCellFormat(content: WorkSpreadsheetContent, request: SpreadsheetCellFormatRequest): WorkSpreadsheetContent | null;
33
+ export declare function spreadsheetCellProtectionAt(sheet: WorkSpreadsheetSheet, row: number, column: number, cell?: Cell | null | undefined): {
34
+ locked: boolean;
35
+ hidden: boolean;
36
+ };
@@ -0,0 +1,4 @@
1
+ import type { WorkSpreadsheetSheet } from '../work-types';
2
+ import { type SpreadsheetCellRange } from './spreadsheet-cell-range';
3
+ export declare function canMutateSpreadsheetCellRange(sheet: WorkSpreadsheetSheet | undefined, range: SpreadsheetCellRange): boolean;
4
+ export declare function canMutateSpreadsheetCellRanges(sheet: WorkSpreadsheetSheet | undefined, ranges: readonly SpreadsheetCellRange[]): boolean;
@@ -3,3 +3,4 @@ export interface SpreadsheetClipboardShortcutOptions {
3
3
  execute(): boolean;
4
4
  }
5
5
  export declare function runSpreadsheetClipboardShortcut(event: KeyboardEvent, canExecute: SpreadsheetClipboardShortcutOptions['canExecute'], execute: SpreadsheetClipboardShortcutOptions['execute']): boolean;
6
+ export declare function runSpreadsheetPasteSpecialShortcut(event: KeyboardEvent, canExecute: SpreadsheetClipboardShortcutOptions['canExecute'], execute: SpreadsheetClipboardShortcutOptions['execute']): boolean;
@@ -0,0 +1,13 @@
1
+ import { type SpreadsheetClipboardSnapshot } from './spreadsheet-paste-special';
2
+ export interface SpreadsheetClipboardPort {
3
+ readText(): Promise<string>;
4
+ writeText(value: string): Promise<void>;
5
+ }
6
+ export declare function parseSpreadsheetClipboardText(value: string): string[][];
7
+ export declare const browserSpreadsheetClipboard: SpreadsheetClipboardPort;
8
+ export declare function storeRichSpreadsheetClipboard(snapshot: SpreadsheetClipboardSnapshot): void;
9
+ export declare function spreadsheetClipboardSnapshotForText(plainText: string): SpreadsheetClipboardSnapshot | null;
10
+ export declare function clearRichSpreadsheetClipboard(): void;
11
+ export declare function readSpreadsheetClipboardText(readSystem: (() => Promise<string>) | undefined, readLocal: () => string, timeoutMs?: number, canReadSystem?: () => boolean | Promise<boolean>): Promise<string>;
12
+ export declare function writeSpreadsheetClipboardText(value: string, writeSystem: ((value: string) => Promise<void>) | undefined, writeLocal: (value: string) => void, timeoutMs?: number, onSystemWriteResult?: (succeeded: boolean) => void): Promise<void>;
13
+ export declare function copySpreadsheetSelection(clipboard: SpreadsheetClipboardPort, value: string, cut: boolean): Promise<boolean>;
@@ -80,6 +80,20 @@ export declare const spreadsheetCommandCatalog: {
80
80
  readonly editor: readonly ["Mod-v"];
81
81
  };
82
82
  };
83
+ readonly pasteSpecial: {
84
+ readonly id: "clipboard.pasteSpecial";
85
+ readonly label: "选择性粘贴";
86
+ readonly location: {
87
+ readonly area: "ribbon";
88
+ readonly tab: "home";
89
+ readonly group: "clipboard";
90
+ };
91
+ readonly shortcut: {
92
+ readonly label: "Cmd/Ctrl+Alt+V";
93
+ readonly aria: "Control+Alt+V Meta+Alt+V";
94
+ readonly editor: readonly ["Mod-Alt-v"];
95
+ };
96
+ };
83
97
  readonly cut: {
84
98
  readonly id: "clipboard.cut";
85
99
  readonly label: "剪切";
@@ -298,6 +312,38 @@ export declare const spreadsheetCommandCatalog: {
298
312
  readonly group: "number";
299
313
  };
300
314
  };
315
+ readonly decreaseDecimalPlaces: {
316
+ readonly id: "number.decreaseDecimalPlaces";
317
+ readonly label: "减少小数位";
318
+ readonly location: {
319
+ readonly area: "ribbon";
320
+ readonly tab: "home";
321
+ readonly group: "number";
322
+ };
323
+ };
324
+ readonly increaseDecimalPlaces: {
325
+ readonly id: "number.increaseDecimalPlaces";
326
+ readonly label: "增加小数位";
327
+ readonly location: {
328
+ readonly area: "ribbon";
329
+ readonly tab: "home";
330
+ readonly group: "number";
331
+ };
332
+ };
333
+ readonly formatCells: {
334
+ readonly id: "number.formatCells";
335
+ readonly label: "设置单元格格式";
336
+ readonly location: {
337
+ readonly area: "ribbon";
338
+ readonly tab: "home";
339
+ readonly group: "number";
340
+ };
341
+ readonly shortcut: {
342
+ readonly label: "Cmd/Ctrl+1";
343
+ readonly aria: "Control+1 Meta+1";
344
+ readonly editor: readonly ["Mod-1"];
345
+ };
346
+ };
301
347
  readonly borderTop: {
302
348
  readonly id: "font.borderTop";
303
349
  readonly label: "上框线";
@@ -519,6 +565,56 @@ export declare const spreadsheetCommandCatalog: {
519
565
  readonly group: "cells";
520
566
  };
521
567
  };
568
+ readonly autoSum: {
569
+ readonly id: "editing.autoSum";
570
+ readonly label: "自动求和";
571
+ readonly location: {
572
+ readonly area: "ribbon";
573
+ readonly tab: "home";
574
+ readonly group: "editing";
575
+ };
576
+ readonly shortcut: {
577
+ readonly label: "Alt+=";
578
+ readonly aria: "Alt+=";
579
+ readonly editor: readonly ["Alt-equal"];
580
+ };
581
+ };
582
+ readonly autoAverage: {
583
+ readonly id: "editing.autoAverage";
584
+ readonly label: "平均值";
585
+ readonly location: {
586
+ readonly area: "ribbon";
587
+ readonly tab: "home";
588
+ readonly group: "editing";
589
+ };
590
+ };
591
+ readonly autoCount: {
592
+ readonly id: "editing.autoCount";
593
+ readonly label: "计数";
594
+ readonly location: {
595
+ readonly area: "ribbon";
596
+ readonly tab: "home";
597
+ readonly group: "editing";
598
+ };
599
+ };
600
+ readonly autoMaximum: {
601
+ readonly id: "editing.autoMaximum";
602
+ readonly label: "最大值";
603
+ readonly location: {
604
+ readonly area: "ribbon";
605
+ readonly tab: "home";
606
+ readonly group: "editing";
607
+ };
608
+ };
609
+ readonly autoMinimum: {
610
+ readonly id: "editing.autoMinimum";
611
+ readonly label: "最小值";
612
+ readonly location: {
613
+ readonly area: "ribbon";
614
+ readonly tab: "home";
615
+ readonly group: "editing";
616
+ };
617
+ };
522
618
  readonly fillDown: {
523
619
  readonly id: "editing.fillDown";
524
620
  readonly label: "向下填充";
@@ -629,6 +725,29 @@ export declare const spreadsheetCommandCatalog: {
629
725
  readonly editor: readonly ["Mod-f"];
630
726
  };
631
727
  };
728
+ readonly findAndSelect: {
729
+ readonly id: "editing.findAndSelect";
730
+ readonly label: "查找和选择";
731
+ readonly location: {
732
+ readonly area: "ribbon";
733
+ readonly tab: "home";
734
+ readonly group: "editing";
735
+ };
736
+ };
737
+ readonly goTo: {
738
+ readonly id: "editing.goTo";
739
+ readonly label: "定位";
740
+ readonly location: {
741
+ readonly area: "ribbon";
742
+ readonly tab: "home";
743
+ readonly group: "editing";
744
+ };
745
+ readonly shortcut: {
746
+ readonly label: "Ctrl+G 或 F5";
747
+ readonly aria: "Control+G F5";
748
+ readonly editor: readonly ["Control-g", "F5"];
749
+ };
750
+ };
632
751
  readonly insertChart: {
633
752
  readonly id: "insert.chart";
634
753
  readonly label: "插入图表";
@@ -2,14 +2,19 @@ import type { Cell, Selection, Sheet } from '@fortune-sheet/core';
2
2
  import { type SpreadsheetGridSize } from '../spreadsheet-sparse';
3
3
  import type { WorkSpreadsheetContent } from '../work-types';
4
4
  import { type OfficeEditorCanCommands, type OfficeEditorExtension } from './office-editor-extension';
5
+ import type { SpreadsheetAutoSumFunction } from './spreadsheet-auto-sum';
5
6
  import { type SpreadsheetCellClearMode } from './spreadsheet-cell-clear';
6
7
  import type { SpreadsheetCellBorderFormat } from './spreadsheet-cell-border';
8
+ import type { SpreadsheetCellFormatRequest } from './spreadsheet-cell-format';
9
+ import type { SpreadsheetCellRange } from './spreadsheet-cell-range';
7
10
  import type { SpreadsheetCellStyleChoice } from './spreadsheet-cell-style';
8
11
  import type { SpreadsheetCellFillDirection } from './spreadsheet-cell-fill';
9
12
  import { type SpreadsheetCellMergeCommand } from './spreadsheet-cell-merge';
10
13
  import type { SpreadsheetFormatPainterMode } from './spreadsheet-format-painter';
11
14
  import { type SpreadsheetFreezePanePreset } from './spreadsheet-freeze-panes';
12
15
  import { type SpreadsheetKeyboardSelection, type SpreadsheetSelectionMove, type SpreadsheetSelectionScope } from './spreadsheet-keyboard-navigation';
16
+ import type { SpreadsheetPasteContent } from './spreadsheet-paste-special';
17
+ import { type SpreadsheetDecimalPlacesDirection } from './spreadsheet-number-format-command';
13
18
  import { type SpreadsheetSheetMoveDirection } from './spreadsheet-sheet-model';
14
19
  export interface SpreadsheetWorkbookCommandPort {
15
20
  autoFillCell: (copyRange: SpreadsheetCommandRange, applyRange: SpreadsheetCommandRange, direction: SpreadsheetCellFillDirection) => void;
@@ -75,10 +80,14 @@ export interface SpreadsheetHistoryCommandPort {
75
80
  export interface SpreadsheetClipboardCommandPort {
76
81
  canCopySelection: boolean;
77
82
  canCutSelection: boolean;
83
+ canOpenPasteSpecial: boolean;
78
84
  canPasteSelection: boolean;
85
+ canPasteSpecial: (content: SpreadsheetPasteContent) => boolean;
79
86
  copySelection: () => boolean;
80
87
  cutSelection: () => boolean;
88
+ openPasteSpecial: () => boolean;
81
89
  pasteSelection: () => boolean;
90
+ pasteSpecial: (content: SpreadsheetPasteContent) => boolean;
82
91
  }
83
92
  export interface SpreadsheetAutoFilterCommandPort {
84
93
  active: boolean;
@@ -95,6 +104,25 @@ export interface SpreadsheetFormatPainterCommandPort {
95
104
  applySelection: (target: SpreadsheetCommandSelection) => boolean;
96
105
  cancel: () => boolean;
97
106
  }
107
+ export interface SpreadsheetFormatCellsOpenRequest {
108
+ sheetId: string;
109
+ range: SpreadsheetCellRange;
110
+ activeCell: {
111
+ row: number;
112
+ column: number;
113
+ };
114
+ cells: (Cell | null)[][];
115
+ }
116
+ export interface SpreadsheetFormatCellsCommandPort {
117
+ canOpen: boolean;
118
+ open: (request: SpreadsheetFormatCellsOpenRequest) => boolean;
119
+ }
120
+ export interface SpreadsheetNavigationCommandPort {
121
+ canOpenFind: boolean;
122
+ canOpenGoTo: boolean;
123
+ openFind: () => boolean;
124
+ openGoTo: () => boolean;
125
+ }
98
126
  export interface SpreadsheetFormulaBarCommandPort {
99
127
  setValue: (value: unknown) => void;
100
128
  }
@@ -105,7 +133,10 @@ export interface SpreadsheetEditorCommands {
105
133
  activateSheet: (sheetId: string) => boolean;
106
134
  activateFormatPainter: (mode: SpreadsheetFormatPainterMode) => boolean;
107
135
  addSheet: () => boolean;
136
+ adjustDecimalPlaces: (direction: SpreadsheetDecimalPlacesDirection) => boolean;
108
137
  applyCellStyle: (preset: SpreadsheetCellStyleChoice) => boolean;
138
+ applyCellFormat: (request: SpreadsheetCellFormatRequest) => boolean;
139
+ applyAutoSum: (functionName: SpreadsheetAutoSumFunction) => boolean;
109
140
  applyFormatPainter: (target: SpreadsheetCommandSelection) => boolean;
110
141
  cancelFormatPainter: () => boolean;
111
142
  clearSelectedCells: (mode?: SpreadsheetCellClearMode) => boolean;
@@ -121,8 +152,13 @@ export interface SpreadsheetEditorCommands {
121
152
  moveSheet: (sheetId: string, direction: SpreadsheetSheetMoveDirection) => boolean;
122
153
  moveSelection: (move: SpreadsheetSelectionMove, extend: boolean) => boolean;
123
154
  openAutoFilterMenu: () => boolean;
155
+ openFind: () => boolean;
156
+ openFormatCells: () => boolean;
157
+ openGoTo: () => boolean;
158
+ openPasteSpecial: () => boolean;
124
159
  pasteCells: (values: readonly (readonly unknown[])[]) => boolean;
125
160
  pasteSelection: () => boolean;
161
+ pasteSpecial: (content: SpreadsheetPasteContent) => boolean;
126
162
  recalculateFormula: (scope: 'selection' | 'workbook') => boolean;
127
163
  renameSheet: (sheetId: string, name: string) => boolean;
128
164
  redo: () => boolean;
@@ -151,7 +187,9 @@ export interface SpreadsheetCommandContext {
151
187
  fallbackRange: SpreadsheetCommandRange;
152
188
  formulaBar: SpreadsheetFormulaBarCommandPort | null;
153
189
  formatPainter: SpreadsheetFormatPainterCommandPort;
190
+ formatCells: SpreadsheetFormatCellsCommandPort;
154
191
  history: SpreadsheetHistoryCommandPort | null;
192
+ navigation: SpreadsheetNavigationCommandPort;
155
193
  onChange: (content: WorkSpreadsheetContent) => void;
156
194
  selection: SpreadsheetCommandSelection | null;
157
195
  targetSheetGridSize?: SpreadsheetGridSize | null;
@@ -1,19 +1,14 @@
1
1
  import type { WorkspaceContextMenuItem } from '../../workspace/components/workspace-context-menu';
2
2
  import type { WorkSpreadsheetAgentSelection } from '../work-spreadsheet-agent-context';
3
3
  import type { SpreadsheetEditorCanCommands, SpreadsheetEditorCommands, SpreadsheetStructureAxis } from './spreadsheet-command-controller';
4
- type SpreadsheetContextCan = Pick<SpreadsheetEditorCanCommands, 'clearSelectedCells' | 'pasteCells'>;
5
- type SpreadsheetContextCommands = Pick<SpreadsheetEditorCommands, 'clearSelectedCells' | 'pasteCells'>;
4
+ type SpreadsheetContextCan = Pick<SpreadsheetEditorCanCommands, 'clearSelectedCells' | 'copySelection' | 'cutSelection' | 'openPasteSpecial' | 'pasteSelection'>;
5
+ type SpreadsheetContextCommands = Pick<SpreadsheetEditorCommands, 'clearSelectedCells' | 'copySelection' | 'cutSelection' | 'openPasteSpecial' | 'pasteSelection'>;
6
6
  type SpreadsheetStructureCan = Pick<SpreadsheetEditorCanCommands, 'deleteSelectedStructure' | 'insertSelectedStructure' | 'setSelectedStructureHidden' | 'setSelectedStructureSize' | 'sortSelectedCells'>;
7
7
  type SpreadsheetStructureCommands = Pick<SpreadsheetEditorCommands, 'deleteSelectedStructure' | 'insertSelectedStructure' | 'setSelectedStructureHidden' | 'setSelectedStructureSize' | 'sortSelectedCells'>;
8
8
  type SpreadsheetSortCan = Pick<SpreadsheetEditorCanCommands, 'sortSelectedCells'>;
9
9
  type SpreadsheetSortCommands = Pick<SpreadsheetEditorCommands, 'sortSelectedCells'>;
10
- export interface SpreadsheetClipboardPort {
11
- readText(): Promise<string>;
12
- writeText(value: string): Promise<void>;
13
- }
14
- export declare function spreadsheetCoreContextMenuItems({ can, clipboard, commands, selection, }: {
10
+ export declare function spreadsheetCoreContextMenuItems({ can, commands, selection, }: {
15
11
  can: SpreadsheetContextCan;
16
- clipboard?: SpreadsheetClipboardPort;
17
12
  commands: SpreadsheetContextCommands;
18
13
  selection: Pick<WorkSpreadsheetAgentSelection, 'clipboard' | 'reference'>;
19
14
  }): WorkspaceContextMenuItem[];
@@ -29,10 +24,5 @@ export declare function spreadsheetSortContextMenuItems({ can, commands, idSuffi
29
24
  idSuffix?: string;
30
25
  separatorBefore?: boolean;
31
26
  }): WorkspaceContextMenuItem[];
32
- export declare function parseSpreadsheetClipboardText(value: string): string[][];
33
- export declare const browserSpreadsheetClipboard: SpreadsheetClipboardPort;
34
- export declare function readSpreadsheetClipboardText(readSystem: (() => Promise<string>) | undefined, readLocal: () => string, timeoutMs?: number, canReadSystem?: () => boolean | Promise<boolean>): Promise<string>;
35
- export declare function writeSpreadsheetClipboardText(value: string, writeSystem: ((value: string) => Promise<void>) | undefined, writeLocal: (value: string) => void, timeoutMs?: number): Promise<void>;
36
- export declare function copySpreadsheetSelection(clipboard: SpreadsheetClipboardPort, value: string, cut: boolean): Promise<boolean>;
37
- export declare function pasteSpreadsheetSelection(clipboard: SpreadsheetClipboardPort, paste: SpreadsheetContextCommands['pasteCells']): Promise<void>;
38
- export {};
27
+ export { browserSpreadsheetClipboard, copySpreadsheetSelection, parseSpreadsheetClipboardText, readSpreadsheetClipboardText, writeSpreadsheetClipboardText, } from './spreadsheet-clipboard';
28
+ export type { SpreadsheetClipboardPort } from './spreadsheet-clipboard';
@@ -7,7 +7,7 @@ import type { SpreadsheetFormatPainterMode } from './spreadsheet-format-painter'
7
7
  import type { SpreadsheetWorkbookPanelView } from './spreadsheet-workbook-panel';
8
8
  import { type WorkOfficeFileAction } from './work-office-chrome';
9
9
  export type { SpreadsheetRibbonTabId } from './spreadsheet-command-catalog';
10
- export declare function SpreadsheetEditorRibbon({ activeTab, autoFilterActive, can, commands, content, fileActions, findOpen, formatPainterMode, freezePanesActive, freezePanesSelection, gridLinesVisible, panelId, onOpenFind, onTabChange, onTogglePanel, panel, toolbarCell, toolbarCellBorders, }: {
10
+ export declare function SpreadsheetEditorRibbon({ activeTab, autoFilterActive, can, commands, content, fileActions, findOpen, formatPainterMode, freezePanesActive, freezePanesSelection, gridLinesVisible, panelId, onTabChange, onTogglePanel, panel, toolbarCell, toolbarCellBorders, }: {
11
11
  activeTab: SpreadsheetRibbonTabId;
12
12
  autoFilterActive?: boolean;
13
13
  can: SpreadsheetEditorCanCommands;
@@ -20,7 +20,6 @@ export declare function SpreadsheetEditorRibbon({ activeTab, autoFilterActive, c
20
20
  freezePanesSelection?: Selection;
21
21
  gridLinesVisible: boolean;
22
22
  panelId: string;
23
- onOpenFind: () => void;
24
23
  onTabChange: (tab: SpreadsheetRibbonTabId) => void;
25
24
  onTogglePanel: (panel: SpreadsheetWorkbookPanelView, trigger: HTMLButtonElement) => void;
26
25
  panel: SpreadsheetWorkbookPanelView | null;
@@ -0,0 +1,86 @@
1
+ import type { Cell } from '@fortune-sheet/core';
2
+ import type { WorkSpreadsheetContent } from '../work-types';
3
+ import { type SpreadsheetCellBorderFormat, type SpreadsheetCellBorderStyle } from './spreadsheet-cell-border';
4
+ import { type SpreadsheetCellFormatPatch, type SpreadsheetHorizontalAlignment, type SpreadsheetVerticalAlignment } from './spreadsheet-cell-format';
5
+ import { type SpreadsheetCellRange } from './spreadsheet-cell-range';
6
+ export declare const spreadsheetFormatCellsTabs: readonly [{
7
+ readonly id: "number";
8
+ readonly label: "数字";
9
+ }, {
10
+ readonly id: "alignment";
11
+ readonly label: "对齐";
12
+ }, {
13
+ readonly id: "font";
14
+ readonly label: "字体";
15
+ }, {
16
+ readonly id: "border";
17
+ readonly label: "边框";
18
+ }, {
19
+ readonly id: "fill";
20
+ readonly label: "填充";
21
+ }, {
22
+ readonly id: "protection";
23
+ readonly label: "保护";
24
+ }];
25
+ export type SpreadsheetFormatCellsTabId = (typeof spreadsheetFormatCellsTabs)[number]['id'];
26
+ export interface SpreadsheetFormatCellsField<T> {
27
+ value: T;
28
+ mixed: boolean;
29
+ }
30
+ export interface SpreadsheetFormatCellsFields {
31
+ numberFormat: SpreadsheetFormatCellsField<string>;
32
+ horizontalAlignment: SpreadsheetFormatCellsField<SpreadsheetHorizontalAlignment>;
33
+ verticalAlignment: SpreadsheetFormatCellsField<SpreadsheetVerticalAlignment>;
34
+ wrapText: SpreadsheetFormatCellsField<boolean>;
35
+ rotation: SpreadsheetFormatCellsField<number>;
36
+ fontFamily: SpreadsheetFormatCellsField<string>;
37
+ fontSize: SpreadsheetFormatCellsField<number>;
38
+ fontColor: SpreadsheetFormatCellsField<string>;
39
+ bold: SpreadsheetFormatCellsField<boolean>;
40
+ italic: SpreadsheetFormatCellsField<boolean>;
41
+ underline: SpreadsheetFormatCellsField<boolean>;
42
+ strike: SpreadsheetFormatCellsField<boolean>;
43
+ fillColor: SpreadsheetFormatCellsField<string | null>;
44
+ borders: SpreadsheetFormatCellsField<readonly SpreadsheetCellBorderFormat[]>;
45
+ locked: SpreadsheetFormatCellsField<boolean>;
46
+ hidden: SpreadsheetFormatCellsField<boolean>;
47
+ }
48
+ export interface SpreadsheetFormatCellsDialogSource {
49
+ sheetId: string;
50
+ range: SpreadsheetCellRange;
51
+ activeCell: Cell | null;
52
+ fields: SpreadsheetFormatCellsFields;
53
+ }
54
+ export interface SpreadsheetFormatCellsDraft {
55
+ numberFormat: string;
56
+ horizontalAlignment: SpreadsheetHorizontalAlignment;
57
+ verticalAlignment: SpreadsheetVerticalAlignment;
58
+ wrapText: boolean;
59
+ rotation: number;
60
+ fontFamily: string;
61
+ fontSize: number;
62
+ fontColor: string;
63
+ bold: boolean;
64
+ italic: boolean;
65
+ underline: boolean;
66
+ strike: boolean;
67
+ fillColor: string | null;
68
+ borders: SpreadsheetCellBorderFormat[];
69
+ borderColor: string;
70
+ borderStyle: SpreadsheetCellBorderStyle;
71
+ locked: boolean;
72
+ hidden: boolean;
73
+ }
74
+ export type SpreadsheetFormatCellsTouched = Partial<Record<keyof SpreadsheetCellFormatPatch, true>>;
75
+ export interface SpreadsheetFormatCellsDraftErrors {
76
+ numberFormat?: string;
77
+ fontSize?: string;
78
+ rotation?: string;
79
+ }
80
+ export declare function createSpreadsheetFormatCellsDialogSource(content: WorkSpreadsheetContent, sheetId: string, rangeInput: SpreadsheetCellRange, cells: readonly (readonly (Cell | null)[])[], requestedActiveCell: {
81
+ row: number;
82
+ column: number;
83
+ }): SpreadsheetFormatCellsDialogSource | null;
84
+ export declare function createSpreadsheetFormatCellsDraft(source: SpreadsheetFormatCellsDialogSource): SpreadsheetFormatCellsDraft;
85
+ export declare function spreadsheetFormatCellsPatch(source: SpreadsheetFormatCellsDialogSource, draft: SpreadsheetFormatCellsDraft, touched: SpreadsheetFormatCellsTouched): SpreadsheetCellFormatPatch;
86
+ export declare function spreadsheetFormatCellsDraftErrors(draft: SpreadsheetFormatCellsDraft): SpreadsheetFormatCellsDraftErrors;
@@ -0,0 +1,15 @@
1
+ import type { Dispatch, SetStateAction } from 'react';
2
+ import type { SpreadsheetCellFormatPatch } from './spreadsheet-cell-format';
3
+ import type { SpreadsheetFormatCellsDialogSource, SpreadsheetFormatCellsDraft, SpreadsheetFormatCellsDraftErrors, SpreadsheetFormatCellsTabId, SpreadsheetFormatCellsTouched } from './spreadsheet-format-cells-dialog-model';
4
+ interface PanelProps {
5
+ activeTab: SpreadsheetFormatCellsTabId;
6
+ idBase: string;
7
+ source: SpreadsheetFormatCellsDialogSource;
8
+ draft: SpreadsheetFormatCellsDraft;
9
+ errors: SpreadsheetFormatCellsDraftErrors;
10
+ touched: SpreadsheetFormatCellsTouched;
11
+ setDraft: Dispatch<SetStateAction<SpreadsheetFormatCellsDraft>>;
12
+ touch: (field: keyof SpreadsheetCellFormatPatch) => void;
13
+ }
14
+ export declare function SpreadsheetFormatCellsPanel(props: PanelProps): import("react").JSX.Element;
15
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { SpreadsheetCellFormatPatch } from './spreadsheet-cell-format';
2
+ import { type SpreadsheetFormatCellsDialogSource } from './spreadsheet-format-cells-dialog-model';
3
+ export declare function SpreadsheetFormatCellsDialog({ source, restoreFocusTarget, onApply, onClose, }: {
4
+ source: SpreadsheetFormatCellsDialogSource;
5
+ restoreFocusTarget: () => HTMLElement | null;
6
+ onApply: (patch: SpreadsheetCellFormatPatch) => boolean;
7
+ onClose: () => void;
8
+ }): import("react").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import type { WorkSpreadsheetContent } from '../work-types';
2
+ import type { SpreadsheetCellRange } from './spreadsheet-cell-range';
3
+ export type SpreadsheetGoToErrorCode = 'ambiguous-name' | 'empty' | 'hidden-sheet' | 'invalid-reference' | 'multiple-ranges' | 'out-of-bounds' | 'sheet-not-found' | 'unsupported-name';
4
+ export interface SpreadsheetGoToTarget {
5
+ displayReference: string;
6
+ name?: string;
7
+ range: SpreadsheetCellRange;
8
+ selection: SpreadsheetCellRange & {
9
+ row_focus: number;
10
+ column_focus: number;
11
+ };
12
+ sheetId: string;
13
+ source: 'named-range' | 'reference';
14
+ }
15
+ export type SpreadsheetGoToResolution = {
16
+ ok: true;
17
+ target: SpreadsheetGoToTarget;
18
+ } | {
19
+ ok: false;
20
+ code: SpreadsheetGoToErrorCode;
21
+ message: string;
22
+ };
23
+ export declare function resolveSpreadsheetGoToTarget(content: WorkSpreadsheetContent, activeSheetId: string, input: string): SpreadsheetGoToResolution;
24
+ export declare function spreadsheetGoToValidationMessage(content: WorkSpreadsheetContent, activeSheetId: string, input: string): string | null;
@@ -16,3 +16,7 @@ export declare function spreadsheetSelectionContainsFocus(selection: Spreadsheet
16
16
  column: number;
17
17
  row: number;
18
18
  }): boolean;
19
+ export declare function spreadsheetSheetBounds(sheet: WorkSpreadsheetSheet): {
20
+ lastColumn: number;
21
+ lastRow: number;
22
+ };
@@ -0,0 +1,3 @@
1
+ import type { SpreadsheetCommandContext, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
2
+ import { type OfficeEditorExtension } from './office-editor-extension';
3
+ export declare function createSpreadsheetNavigationExtension(): OfficeEditorExtension<SpreadsheetCommandContext, SpreadsheetEditorCommands>;
@@ -0,0 +1,24 @@
1
+ import type { Cell } from '@fortune-sheet/core';
2
+ import type { WorkSpreadsheetContent } from '../work-types';
3
+ import { type SpreadsheetCellRange, type SpreadsheetCellRangeInput } from './spreadsheet-cell-range';
4
+ import type { SpreadsheetCommandContext, SpreadsheetEditorCommands } from './spreadsheet-command-controller';
5
+ import { type OfficeEditorExtension } from './office-editor-extension';
6
+ export type SpreadsheetDecimalPlacesDirection = 'decrease' | 'increase';
7
+ export declare const MAX_SPREADSHEET_DECIMAL_FORMAT_CELLS = 10000;
8
+ export interface SpreadsheetDecimalFormatApiCall {
9
+ name: 'setCellFormatByRange';
10
+ args: [
11
+ 'ct',
12
+ NonNullable<Cell['ct']> & {
13
+ fa: string;
14
+ t: string;
15
+ },
16
+ SpreadsheetCellRange,
17
+ {
18
+ id: string;
19
+ }
20
+ ];
21
+ }
22
+ export declare function createSpreadsheetNumberFormatExtension(): OfficeEditorExtension<SpreadsheetCommandContext, SpreadsheetEditorCommands>;
23
+ export declare function canAdjustSpreadsheetDecimalPlaces(content: WorkSpreadsheetContent, sheetId: string, range: SpreadsheetCellRangeInput, direction: SpreadsheetDecimalPlacesDirection): boolean;
24
+ export declare function spreadsheetDecimalFormatApiCalls(cells: readonly (readonly (Cell | null)[])[], range: SpreadsheetCellRangeInput, sheetId: string, direction: SpreadsheetDecimalPlacesDirection): SpreadsheetDecimalFormatApiCall[];
@@ -0,0 +1,17 @@
1
+ import type { Cell } from '@fortune-sheet/core';
2
+ import type { SpreadsheetClipboardCell, SpreadsheetPasteContent, SpreadsheetPasteOperation } from './spreadsheet-paste-special-types';
3
+ export declare const spreadsheetPasteCellInvalid: unique symbol;
4
+ export type SpreadsheetPasteCellResult = Cell | null | typeof spreadsheetPasteCellInvalid;
5
+ export declare function pasteSpreadsheetSpecialCell({ source, destination, content, operation, rowOffset, columnOffset, }: {
6
+ source: SpreadsheetClipboardCell;
7
+ destination: Cell | null | undefined;
8
+ content: SpreadsheetPasteContent;
9
+ operation: SpreadsheetPasteOperation;
10
+ rowOffset: number;
11
+ columnOffset: number;
12
+ }): SpreadsheetPasteCellResult;
13
+ export declare function spreadsheetClipboardCellIsBlank(source: SpreadsheetClipboardCell, content: SpreadsheetPasteContent): boolean;
14
+ export declare function spreadsheetPasteContentSupportsOperation(content: SpreadsheetPasteContent): boolean;
15
+ export declare function numericSpreadsheetCellValue(cell: Cell | null | undefined): number | null;
16
+ export declare function spreadsheetCellHasContent(cell: Cell | null | undefined): boolean;
17
+ export declare function translateSpreadsheetFormula(formula: string, rowOffset: number, columnOffset: number): string | null;
@@ -0,0 +1,9 @@
1
+ import { type SpreadsheetPasteSpecialOptions } from './spreadsheet-paste-special';
2
+ import type { SpreadsheetPasteSpecialDialogSource } from './use-spreadsheet-clipboard';
3
+ export declare function SpreadsheetPasteSpecialDialog({ source, restoreFocusTarget, onApply, onClose, onValidate, }: {
4
+ source: SpreadsheetPasteSpecialDialogSource;
5
+ restoreFocusTarget: () => HTMLElement | null;
6
+ onApply: (options: SpreadsheetPasteSpecialOptions) => boolean;
7
+ onClose: () => void;
8
+ onValidate: (options: SpreadsheetPasteSpecialOptions) => string | null;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import type { WorkSpreadsheetSheet } from '../work-types';
2
+ import type { SpreadsheetPasteContent } from './spreadsheet-paste-special-types';
3
+ export declare function pasteContentCopiesFormulas(content: SpreadsheetPasteContent): boolean;
4
+ export declare function pasteContentCopiesBorders(content: SpreadsheetPasteContent): boolean;
5
+ export declare function pasteContentCopiesMerges(content: SpreadsheetPasteContent): boolean;
6
+ export declare function pasteContentCopiesValidation(content: SpreadsheetPasteContent): boolean;
7
+ export declare function pasteContentCopiesHyperlinks(content: SpreadsheetPasteContent): boolean;
8
+ export declare function pasteContentCopiesProtection(content: SpreadsheetPasteContent): boolean;
9
+ export declare function columnsContainReadOnlyState(sheet: WorkSpreadsheetSheet, range: {
10
+ column: [number, number];
11
+ }): boolean;
@@ -0,0 +1,4 @@
1
+ import type { SpreadsheetCellRange } from './spreadsheet-cell-range';
2
+ import { type SpreadsheetClipboardSnapshot, type SpreadsheetPastePlan, type SpreadsheetPasteSource } from './spreadsheet-paste-special-types';
3
+ export declare function planSpreadsheetPaste(snapshot: SpreadsheetClipboardSnapshot, selection: SpreadsheetCellRange, transpose: boolean): SpreadsheetPastePlan | null;
4
+ export declare function spreadsheetPasteSourceAt(snapshot: SpreadsheetClipboardSnapshot, plan: SpreadsheetPastePlan, row: number, column: number, transpose: boolean): SpreadsheetPasteSource;