xiaodao-spreader 0.1.4 → 0.1.6

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 (26) hide show
  1. package/README.ZH.md +459 -0
  2. package/README.md +409 -44
  3. package/dist/style.css +1 -1
  4. package/dist/types/components/spreader/{dropdown.vue.d.ts → components/dropdown.vue.d.ts} +7 -5
  5. package/dist/types/components/spreader/{borderPicker.vue.d.ts → components/pickers/borderPicker.vue.d.ts} +3 -0
  6. package/dist/types/components/spreader/{colorPicker.vue.d.ts → components/pickers/colorPicker.vue.d.ts} +6 -4
  7. package/dist/types/components/spreader/components/pickers/mergePicker.vue.d.ts +27 -0
  8. package/dist/types/components/spreader/{spreader.vue.d.ts → components/spreadsheet.vue.d.ts} +2 -8
  9. package/dist/types/components/spreader/{tabbar.vue.d.ts → components/tabbar.vue.d.ts} +11 -11
  10. package/dist/types/components/spreader/components/toolbar.vue.d.ts +111 -0
  11. package/dist/types/components/spreader/composables/borders-merge.d.ts +48 -0
  12. package/dist/types/components/spreader/composables/core-state.d.ts +98 -0
  13. package/dist/types/components/spreader/composables/interactions.d.ts +87 -0
  14. package/dist/types/components/spreader/composables/sheets-ops.d.ts +45 -0
  15. package/dist/types/components/spreader/composables/undo-styles.d.ts +86 -0
  16. package/dist/types/components/spreader/{constants.d.ts → core/constants.d.ts} +7 -0
  17. package/dist/types/components/spreader/{types.d.ts → core/types.d.ts} +2 -0
  18. package/dist/types/components/spreader/index.d.ts +8 -0
  19. package/dist/types/index.d.ts +2 -2
  20. package/dist/xiaodao-spreader.es.js +3439 -2617
  21. package/dist/xiaodao-spreader.umd.js +9 -9
  22. package/package.json +2 -1
  23. package/dist/types/components/spreader/toolbar.vue.d.ts +0 -44
  24. /package/dist/types/components/spreader/{formula.d.ts → core/formula.d.ts} +0 -0
  25. /package/dist/types/components/spreader/{theme.d.ts → core/theme.d.ts} +0 -0
  26. /package/dist/types/components/spreader/{utils.d.ts → core/utils.d.ts} +0 -0
@@ -3,6 +3,7 @@ type __VLS_Props = {
3
3
  colorKey?: string;
4
4
  currentColor?: string;
5
5
  locale?: string;
6
+ triggerEl?: HTMLElement | null;
6
7
  };
7
8
  declare function openMenu(): void;
8
9
  declare function close(): void;
@@ -10,16 +11,17 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
10
11
  open: import("vue").Ref<boolean, boolean>;
11
12
  openMenu: typeof openMenu;
12
13
  close: typeof close;
13
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
14
- "update:modelValue": (v: string) => any;
15
- change: (v: string) => any;
16
- "update:modelOpen": (v: boolean) => any;
14
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
15
+ "update:modelValue": (v: string) => void;
16
+ change: (v: string) => void;
17
+ "update:modelOpen": (v: boolean) => void;
17
18
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
18
19
  "onUpdate:modelValue"?: ((v: string) => any) | undefined;
19
20
  onChange?: ((v: string) => any) | undefined;
20
21
  "onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
21
22
  }>, {
22
23
  modelOpen: boolean;
24
+ triggerEl: HTMLElement | null;
23
25
  currentColor: string;
24
26
  colorKey: string;
25
27
  locale: string;
@@ -0,0 +1,27 @@
1
+ import { type MergeType } from '../../core/constants';
2
+ type __VLS_Props = {
3
+ modelOpen?: boolean;
4
+ locale?: string;
5
+ triggerEl?: HTMLElement | null;
6
+ };
7
+ declare function openMenu(): void;
8
+ declare function close(): void;
9
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {
10
+ open: import("vue").Ref<boolean, boolean>;
11
+ openMenu: typeof openMenu;
12
+ close: typeof close;
13
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
14
+ change: (v: MergeType) => any;
15
+ "update:modelOpen": (v: boolean) => any;
16
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
17
+ onChange?: ((v: MergeType) => any) | undefined;
18
+ "onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
19
+ }>, {
20
+ modelOpen: boolean;
21
+ triggerEl: HTMLElement | null;
22
+ locale: string;
23
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
24
+ rootRef: HTMLDivElement;
25
+ menuRef: HTMLDivElement;
26
+ }, HTMLDivElement>;
27
+ export default _default;
@@ -1,4 +1,4 @@
1
- import type { SheetModelData } from './types';
1
+ import type { SheetModelData } from '../core/types';
2
2
  type __VLS_Props = {
3
3
  rowCount?: number;
4
4
  colCount?: number;
@@ -19,11 +19,5 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
19
19
  rowCount: number;
20
20
  colCount: number;
21
21
  theme: "light" | "dark";
22
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
23
- formulaBarRef: HTMLInputElement;
24
- wrapperRef: HTMLDivElement;
25
- canvasRef: HTMLCanvasElement;
26
- editInputRef: HTMLTextAreaElement;
27
- dimInputRef: HTMLInputElement;
28
- }, HTMLDivElement>;
22
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, HTMLDivElement>;
29
23
  export default _default;
@@ -1,4 +1,4 @@
1
- import type { SheetState } from './types';
1
+ import type { SheetState } from '../core/types';
2
2
  type __VLS_Props = {
3
3
  locale: string;
4
4
  sheets: SheetState[];
@@ -6,18 +6,18 @@ type __VLS_Props = {
6
6
  renTab: number | null;
7
7
  renTabVal: string;
8
8
  };
9
- declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
10
- "tab-click": (i: number) => any;
11
- "tab-dblclick": (i: number) => any;
9
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
10
+ "tab-click": (i: number) => void;
11
+ "tab-dblclick": (i: number) => void;
12
12
  "tab-contextmenu": (payload: {
13
13
  ev: MouseEvent;
14
14
  i: number;
15
- }) => any;
16
- "tab-rename-input": (v: string) => any;
17
- "tab-rename-keydown": (ev: KeyboardEvent) => any;
18
- "tab-rename-commit": () => any;
19
- "tabbar-contextmenu": (ev: MouseEvent) => any;
20
- "add-sheet": () => any;
15
+ }) => void;
16
+ "tab-rename-input": (v: string) => void;
17
+ "tab-rename-keydown": (ev: KeyboardEvent) => void;
18
+ "tab-rename-commit": () => void;
19
+ "add-sheet": () => void;
20
+ "tabbar-contextmenu": (ev: MouseEvent) => void;
21
21
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
22
22
  "onTab-click"?: ((i: number) => any) | undefined;
23
23
  "onTab-dblclick"?: ((i: number) => any) | undefined;
@@ -28,7 +28,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
28
28
  "onTab-rename-input"?: ((v: string) => any) | undefined;
29
29
  "onTab-rename-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
30
30
  "onTab-rename-commit"?: (() => any) | undefined;
31
- "onTabbar-contextmenu"?: ((ev: MouseEvent) => any) | undefined;
32
31
  "onAdd-sheet"?: (() => any) | undefined;
32
+ "onTabbar-contextmenu"?: ((ev: MouseEvent) => any) | undefined;
33
33
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, HTMLDivElement>;
34
34
  export default _default;
@@ -0,0 +1,111 @@
1
+ import type { FontOption, MergeType } from '../core/constants';
2
+ import { type BorderType } from './pickers/borderPicker.vue';
3
+ type __VLS_Props = {
4
+ locale: string;
5
+ canUndo: boolean;
6
+ canRedo: boolean;
7
+ paintFmtActive: boolean;
8
+ hasSelection: boolean;
9
+ fontFamilyOptions: FontOption[];
10
+ fontSizeOptions: FontOption[];
11
+ selFontFamily: string | number;
12
+ selFontSize: number;
13
+ fontSizeInput: string;
14
+ fontSizeMenuOpen: boolean;
15
+ selFontWeight: boolean;
16
+ selFontStyle: boolean;
17
+ selUnderline: boolean;
18
+ selStrikethrough: boolean;
19
+ selTextColor: string;
20
+ textColorMenuOpen: boolean;
21
+ selFillColor: string;
22
+ fillColorMenuOpen: boolean;
23
+ cachedTextColor: string;
24
+ cachedFillColor: string;
25
+ borderMenuOpen: boolean;
26
+ cachedBorder: BorderType;
27
+ selHAlign: string;
28
+ selVAlign: string;
29
+ selWrap: boolean;
30
+ hAlignOptions: FontOption[];
31
+ vAlignOptions: FontOption[];
32
+ mergeMenuOpen: boolean;
33
+ themeVars?: Record<string, string>;
34
+ };
35
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
36
+ undo: () => void;
37
+ redo: () => void;
38
+ "paint-format": () => void;
39
+ "clear-format": () => void;
40
+ "font-size-blur": () => void;
41
+ "font-size-toggle": () => void;
42
+ "font-size-step-up": () => void;
43
+ "font-size-step-down": () => void;
44
+ "bold-toggle": () => void;
45
+ "italic-toggle": () => void;
46
+ "underline-toggle": () => void;
47
+ "strikethrough-toggle": () => void;
48
+ "apply-text-color": () => void;
49
+ "apply-fill-color": () => void;
50
+ "apply-border": () => void;
51
+ "wrap-toggle": () => void;
52
+ "apply-merge": () => void;
53
+ "font-family-change": (v: string | number) => void;
54
+ "font-size-change": (v: string | number) => void;
55
+ "h-align-change": (v: string | number) => void;
56
+ "v-align-change": (v: string | number) => void;
57
+ "font-size-input": (v: string) => void;
58
+ "text-color-change": (v: string) => void;
59
+ "fill-color-change": (v: string) => void;
60
+ "font-size-keydown": (ev: KeyboardEvent) => void;
61
+ "update:font-size-menu-open": (v: boolean) => void;
62
+ "update:text-color-menu-open": (v: boolean) => void;
63
+ "update:fill-color-menu-open": (v: boolean) => void;
64
+ "update:border-menu-open": (v: boolean) => void;
65
+ "update:merge-menu-open": (v: boolean) => void;
66
+ "border-change": (v: BorderType) => void;
67
+ "merge-change": (v: MergeType) => void;
68
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
69
+ onUndo?: (() => any) | undefined;
70
+ onRedo?: (() => any) | undefined;
71
+ "onPaint-format"?: (() => any) | undefined;
72
+ "onClear-format"?: (() => any) | undefined;
73
+ "onFont-size-blur"?: (() => any) | undefined;
74
+ "onFont-size-toggle"?: (() => any) | undefined;
75
+ "onFont-size-step-up"?: (() => any) | undefined;
76
+ "onFont-size-step-down"?: (() => any) | undefined;
77
+ "onBold-toggle"?: (() => any) | undefined;
78
+ "onItalic-toggle"?: (() => any) | undefined;
79
+ "onUnderline-toggle"?: (() => any) | undefined;
80
+ "onStrikethrough-toggle"?: (() => any) | undefined;
81
+ "onApply-text-color"?: (() => any) | undefined;
82
+ "onApply-fill-color"?: (() => any) | undefined;
83
+ "onApply-border"?: (() => any) | undefined;
84
+ "onWrap-toggle"?: (() => any) | undefined;
85
+ "onApply-merge"?: (() => any) | undefined;
86
+ "onFont-family-change"?: ((v: string | number) => any) | undefined;
87
+ "onFont-size-change"?: ((v: string | number) => any) | undefined;
88
+ "onH-align-change"?: ((v: string | number) => any) | undefined;
89
+ "onV-align-change"?: ((v: string | number) => any) | undefined;
90
+ "onFont-size-input"?: ((v: string) => any) | undefined;
91
+ "onText-color-change"?: ((v: string) => any) | undefined;
92
+ "onFill-color-change"?: ((v: string) => any) | undefined;
93
+ "onFont-size-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
94
+ "onUpdate:font-size-menu-open"?: ((v: boolean) => any) | undefined;
95
+ "onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
96
+ "onUpdate:fill-color-menu-open"?: ((v: boolean) => any) | undefined;
97
+ "onUpdate:border-menu-open"?: ((v: boolean) => any) | undefined;
98
+ "onUpdate:merge-menu-open"?: ((v: boolean) => any) | undefined;
99
+ "onBorder-change"?: ((v: BorderType) => any) | undefined;
100
+ "onMerge-change"?: ((v: MergeType) => any) | undefined;
101
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
102
+ rootEl: HTMLDivElement;
103
+ fontSizeArrowRef: HTMLButtonElement;
104
+ textColorArrowRef: HTMLButtonElement;
105
+ fillColorArrowRef: HTMLButtonElement;
106
+ borderArrowRef: HTMLButtonElement;
107
+ mergeArrowRef: HTMLButtonElement;
108
+ moreBtnEl: HTMLButtonElement;
109
+ overflowMenuEl: HTMLDivElement;
110
+ }, any>;
111
+ export default _default;
@@ -0,0 +1,48 @@
1
+ import { type Ref } from 'vue';
2
+ import type { CoreState } from './core-state';
3
+ import type { UndoStylesState } from './undo-styles';
4
+ import type { BorderType } from '../components/pickers/borderPicker.vue';
5
+ import type { MergeType } from '../core/constants';
6
+ import type { SelectionRange } from '../core/types';
7
+ export interface BordersMergeState {
8
+ cachedBorder: Ref<BorderType>;
9
+ borderMenuOpen: Ref<boolean>;
10
+ BORDER_COLOR: string;
11
+ borderTypeToWidths: (bt: BorderType, col: number, row: number, sel: SelectionRange) => {
12
+ top: number;
13
+ bottom: number;
14
+ left: number;
15
+ right: number;
16
+ };
17
+ onBorderChange: (bt: BorderType) => void;
18
+ setCellBorderSide: (col: number, row: number, side: 'Top' | 'Bottom' | 'Left' | 'Right', width: number, clearZero: boolean) => void;
19
+ syncCellBorders: (col: number, row: number) => void;
20
+ applyBorderToCell: (col: number, row: number, w: {
21
+ top: number;
22
+ bottom: number;
23
+ left: number;
24
+ right: number;
25
+ }, clearZero?: boolean) => void;
26
+ applyCachedBorder: () => void;
27
+ cellBorderWidth: (col: number, row: number, side: 'Top' | 'Bottom' | 'Left' | 'Right') => number;
28
+ mergeMenuOpen: Ref<boolean>;
29
+ onMergeMenuToggle: (v: boolean) => void;
30
+ removeOverlappingMerges: (sC: number, sR: number, eC: number, eR: number) => void;
31
+ mergeAndCenter: () => void;
32
+ mergeAcross: () => void;
33
+ mergeCells: () => void;
34
+ unmergeCells: () => void;
35
+ onApplyMerge: () => void;
36
+ onMergeChange: (v: MergeType) => void;
37
+ copySourceRange: SelectionRange | null;
38
+ copySourceStyles: (Record<string, unknown> | null)[][];
39
+ captureStyles: (cS: number, cE: number, rS: number, rE: number) => void;
40
+ setCellWithStyle: (c: number, r: number, val: string, style: Record<string, unknown> | null) => void;
41
+ copyToClipboard: () => void;
42
+ copyRowCol: () => void;
43
+ pasteFromClipboard: () => Promise<void>;
44
+ cutSelected: () => void;
45
+ clearSelected: () => void;
46
+ sumSelected: () => void;
47
+ }
48
+ export declare function createBordersMerge(s: CoreState, us: UndoStylesState): BordersMergeState;
@@ -0,0 +1,98 @@
1
+ import { type ComputedRef, type Ref } from 'vue';
2
+ import { FormulaDeps } from '../core/formula';
3
+ import type { CellCoord, CellData, SelectionRange } from '../core/types';
4
+ export interface CoreState {
5
+ props: {
6
+ rowCount: number;
7
+ colCount: number;
8
+ width?: number | string;
9
+ height?: number | string;
10
+ theme?: 'light' | 'dark';
11
+ locale?: string;
12
+ };
13
+ locale: ComputedRef<string>;
14
+ colCount: number;
15
+ rowCount: number;
16
+ cells: Record<string, CellData>;
17
+ merges: Record<string, SelectionRange>;
18
+ formulaDeps: FormulaDeps;
19
+ selection: Ref<SelectionRange | null>;
20
+ activeCell: Ref<CellCoord>;
21
+ editingCell: Ref<CellCoord | null>;
22
+ editValue: Ref<string>;
23
+ colWidths: Ref<number[]>;
24
+ rowHeights: Ref<(number | undefined)[]>;
25
+ scrollX: Ref<number>;
26
+ scrollY: Ref<number>;
27
+ BASE_CELL_VPAD: number;
28
+ fontMetricsCache: Map<string, {
29
+ ascent: number;
30
+ descent: number;
31
+ }>;
32
+ fontMetricsCanvas: HTMLCanvasElement | null;
33
+ measureFontMetrics: (family: string, size: number, weight: string, style: string) => {
34
+ ascent: number;
35
+ descent: number;
36
+ };
37
+ _getFontMetricsForCell: (c: number, r: number) => {
38
+ ascent: number;
39
+ descent: number;
40
+ };
41
+ getWrappedLines: (ctx: CanvasRenderingContext2D, text: string, maxWidth: number, wrap: boolean) => string[];
42
+ cellFontSize: (c: number, r: number) => number;
43
+ colPositions: ComputedRef<number[]>;
44
+ getRowHeight: (r: number) => number;
45
+ _isAutoRow: (r: number) => boolean;
46
+ rowPositions: ComputedRef<number[]>;
47
+ totalWidth: ComputedRef<number>;
48
+ totalHeight: ComputedRef<number>;
49
+ selectCell: (c: number, r: number) => void;
50
+ selectRange: (sC: number, sR: number, eC: number, eR: number) => void;
51
+ selectAll: () => void;
52
+ isSelected: (c: number, r: number) => boolean;
53
+ cellKey: (c: number, r: number) => string;
54
+ delCell: (k: string) => void;
55
+ findMerge: (c: number, r: number) => {
56
+ range: SelectionRange;
57
+ anchor: string;
58
+ } | null;
59
+ _isMergeAnchor: (c: number, r: number) => boolean;
60
+ _mergedSpan: (c: number, r: number) => {
61
+ w: number;
62
+ h: number;
63
+ };
64
+ expandSelectionForMerges: (sC: number, sR: number, eC: number, eR: number) => SelectionRange;
65
+ getCellRaw: (c: number, r: number) => string;
66
+ getCellValue: (c: number, r: number) => string;
67
+ setCellValue: (c: number, r: number, v: string | null | undefined) => void;
68
+ clearCellsInRange: (cS: number, cE: number, rS: number, rE: number) => void;
69
+ startEdit: (initialValue?: string) => void;
70
+ commitEdit: () => void;
71
+ cancelEdit: () => void;
72
+ moveActive: (dC: number, dR: number) => void;
73
+ ensureVisible: (c: number, r: number) => void;
74
+ hitCol: (x: number) => number;
75
+ hitRow: (y: number) => number;
76
+ saveUndo?: () => void;
77
+ scheduleRender?: () => void;
78
+ emitModelData?: () => void;
79
+ syncCellBorders?: (col: number, row: number) => void;
80
+ viewSize?: {
81
+ w: number;
82
+ h: number;
83
+ };
84
+ clampScroll?: (sx: number | null, sy: number | null) => void;
85
+ }
86
+ export declare function createCoreState(rawProps: {
87
+ rowCount?: number;
88
+ colCount?: number;
89
+ width?: number | string;
90
+ height?: number | string;
91
+ theme?: 'light' | 'dark';
92
+ locale?: string;
93
+ }, defaults: {
94
+ rowCount: number;
95
+ colCount: number;
96
+ theme: 'light' | 'dark';
97
+ locale: string;
98
+ }): CoreState;
@@ -0,0 +1,87 @@
1
+ import { type Ref, type ComputedRef } from 'vue';
2
+ import type { CoreState } from './core-state';
3
+ import type { UndoStylesState } from './undo-styles';
4
+ import type { BordersMergeState } from './borders-merge';
5
+ import type { SheetsOpsState } from './sheets-ops';
6
+ import type { ContextMenuItem } from '../core/types';
7
+ export interface InteractionsState {
8
+ scheduleRender: () => void;
9
+ render: () => void;
10
+ activeCellLabel: ComputedRef<string>;
11
+ formulaBarDisplay: ComputedRef<string>;
12
+ onFormulaBarFocus: () => void;
13
+ onFormulaBarInput: (e: Event) => void;
14
+ onFormulaBarKeydown: (e: KeyboardEvent) => void;
15
+ onFormulaBarBlur: () => void;
16
+ renTab: Ref<number | null>;
17
+ renTabVal: Ref<string>;
18
+ onTabClick: (i: number) => void;
19
+ onTabDblClick: (i: number) => void;
20
+ commitTabRename: () => void;
21
+ cclTabRename: () => void;
22
+ onTabRenameKd: (e: KeyboardEvent) => void;
23
+ ctxMenu: Ref<{
24
+ x: number;
25
+ y: number;
26
+ items: ContextMenuItem[];
27
+ } | null>;
28
+ ctxSubmenuLeft: Ref<boolean>;
29
+ onCtxItemEnter: (e: MouseEvent, item: ContextMenuItem) => void;
30
+ onTabCtxMenu: (e: MouseEvent, i: number) => void;
31
+ onTabBarCtx: (e: MouseEvent) => void;
32
+ onCornerCtx: (e: MouseEvent) => void;
33
+ onRowHdrCtx: (e: MouseEvent, row: number) => void;
34
+ onColHdrCtx: (e: MouseEvent, col: number) => void;
35
+ onCellCtx: (e: MouseEvent, c: number, r: number) => void;
36
+ dimInputRef: Ref<HTMLInputElement | null>;
37
+ dimPanel: Ref<{
38
+ type: 'row' | 'col';
39
+ x: number;
40
+ y: number;
41
+ value: string;
42
+ error: string;
43
+ } | null>;
44
+ openDimPanel: (type: 'row' | 'col', x: number, y: number) => void;
45
+ onDimInput: (e: Event) => void;
46
+ onDimKeydown: (e: KeyboardEvent) => void;
47
+ onDimBlur: () => void;
48
+ applyDimPanel: () => void;
49
+ closeDimPanel: () => void;
50
+ editInputStyle: ComputedRef<Record<string, string | number | undefined>>;
51
+ hScrollbarW: ComputedRef<number>;
52
+ vScrollbarH: ComputedRef<number>;
53
+ hTrackW: ComputedRef<number>;
54
+ vTrackH: ComputedRef<number>;
55
+ hThumbW: ComputedRef<number>;
56
+ hThumbL: ComputedRef<number>;
57
+ vThumbH: ComputedRef<number>;
58
+ vThumbT: ComputedRef<number>;
59
+ onVStart: (e: MouseEvent) => void;
60
+ onHStart: (e: MouseEvent) => void;
61
+ onSbMove: (e: MouseEvent) => void;
62
+ onSbUp: () => void;
63
+ onVTrk: (e: MouseEvent) => void;
64
+ onHTrk: (e: MouseEvent) => void;
65
+ onMouseDown: (e: MouseEvent) => void;
66
+ onMouseMove: (e: MouseEvent) => void;
67
+ onMouseUp: (e: MouseEvent) => void;
68
+ onMouseLeave: () => void;
69
+ onCanvasCtx: (e: MouseEvent) => void;
70
+ onDblClick: (e: MouseEvent) => void;
71
+ onWheel: (e: WheelEvent) => void;
72
+ onTouchStart: (e: TouchEvent) => void;
73
+ onTouchMove: (e: TouchEvent) => void;
74
+ onTouchEnd: () => void;
75
+ onKeydown: (e: KeyboardEvent) => void;
76
+ onEditInput: (e: Event) => void;
77
+ onEditCompositionStart: () => void;
78
+ onEditCompositionEnd: (e: CompositionEvent) => void;
79
+ onEditKd: (e: KeyboardEvent) => void;
80
+ onEditPaste: (e: ClipboardEvent) => void;
81
+ onEditBlur: () => void;
82
+ applySize: () => void;
83
+ setupLifecycle: () => void;
84
+ }
85
+ export declare function createInteractions(s: CoreState, us: UndoStylesState, bm: BordersMergeState, so: SheetsOpsState, lastEmittedDataRef: {
86
+ value: string;
87
+ }): InteractionsState;
@@ -0,0 +1,45 @@
1
+ import { type Ref, type ComputedRef } from 'vue';
2
+ import type { ThemeColors, SheetState, SheetModelData } from '../core/types';
3
+ import type { CoreState } from './core-state';
4
+ import type { UndoStylesState } from './undo-styles';
5
+ export interface SheetsOpsState {
6
+ deleteRows: (rS: number, rE: number) => void;
7
+ insertRows: (rS: number, rE: number) => void;
8
+ insertCols: (cS: number, cE: number) => void;
9
+ deleteCols: (cS: number, cE: number) => void;
10
+ sheets: Ref<SheetState[]>;
11
+ activeSheetIndex: Ref<number>;
12
+ saveSheet: () => void;
13
+ loadSheet: (i: number) => void;
14
+ switchSheet: (i: number) => void;
15
+ addSheet: (n?: string) => number;
16
+ removeSheet: (i: number) => number;
17
+ renameSheet: (i: number, n: string) => void;
18
+ dupSheet: (i: number) => number;
19
+ moveSheet: (i: number, d: number) => void;
20
+ sheetCount: ComputedRef<number>;
21
+ mkSheet: (name: string) => SheetState;
22
+ emitModelData: () => void;
23
+ scheduleOptEmit: () => void;
24
+ themeColors: ComputedRef<ThemeColors>;
25
+ outerStyle: ComputedRef<Record<string, string>>;
26
+ toolbarThemeVars: ComputedRef<Record<string, string>>;
27
+ wrapperRef: Ref<HTMLDivElement | null>;
28
+ canvasRef: Ref<HTMLCanvasElement | null>;
29
+ editInputRef: Ref<HTMLTextAreaElement | null>;
30
+ formulaBarRef: Ref<HTMLInputElement | null>;
31
+ viewSize: {
32
+ w: number;
33
+ h: number;
34
+ };
35
+ maxScrollX: ComputedRef<number>;
36
+ maxScrollY: ComputedRef<number>;
37
+ clampScroll: (sx: number | null, sy: number | null) => void;
38
+ canFocusHiddenEditor: () => boolean;
39
+ focusEditInput: (selectAllText?: boolean) => void;
40
+ onCanvasFocus: () => void;
41
+ resetRowHeight: () => void;
42
+ resetColWidth: () => void;
43
+ modelData: Ref<SheetModelData[]>;
44
+ }
45
+ export declare function createSheetsOps(s: CoreState, us: UndoStylesState, rawModelData: Ref<SheetModelData[]>, _applySizeCallback?: () => void): SheetsOpsState;
@@ -0,0 +1,86 @@
1
+ import { type ComputedRef, type Ref } from 'vue';
2
+ import type { FontOption } from '../core/constants';
3
+ import type { CoreState } from './core-state';
4
+ import type { CellData, SheetState } from '../core/types';
5
+ export interface UndoStylesState {
6
+ undoStack: Ref<UndoSnap[]>;
7
+ redoStack: Ref<UndoSnap[]>;
8
+ cloneCells: (src: Record<string, CellData>) => Record<string, CellData>;
9
+ takeSnap: () => UndoSnap;
10
+ restoreSnap: (s: UndoSnap) => void;
11
+ saveUndo: () => void;
12
+ undo: () => void;
13
+ redo: () => void;
14
+ canUndo: ComputedRef<boolean>;
15
+ canRedo: ComputedRef<boolean>;
16
+ hasSelection: ComputedRef<boolean>;
17
+ paintFmt: Ref<{
18
+ styles: Record<string, Record<string, unknown> | null>;
19
+ } | null>;
20
+ onPaintFormat: () => void;
21
+ applyPaintFormat: () => void;
22
+ clearFormat: () => void;
23
+ fontFamilyOptions: ComputedRef<FontOption[]>;
24
+ fontSizeOptions: ComputedRef<FontOption[]>;
25
+ FONT_FAMILY_MIXED: string;
26
+ selFontFamily: ComputedRef<string>;
27
+ selFontSize: ComputedRef<number>;
28
+ applyStyleToSelection: (prop: string, value: unknown) => void;
29
+ onFontFamilyChange: (v: string | number) => void;
30
+ onFontSizeChange: (v: string | number) => void;
31
+ hAlignOptions: ComputedRef<FontOption[]>;
32
+ vAlignOptions: ComputedRef<FontOption[]>;
33
+ selHAlign: ComputedRef<string>;
34
+ selVAlign: ComputedRef<string>;
35
+ selWrap: ComputedRef<boolean>;
36
+ onHAlignChange: (v: string | number) => void;
37
+ onVAlignChange: (v: string | number) => void;
38
+ onWrapToggle: () => void;
39
+ fontSizeInput: Ref<string>;
40
+ fontSizeMenuOpen: Ref<boolean>;
41
+ onFontSizeInput: (raw: string) => void;
42
+ onFontSizeBlur: () => void;
43
+ onFontSizeKeydown: (e: KeyboardEvent) => void;
44
+ toggleFontSizeMenu: (e?: MouseEvent) => void;
45
+ onFontSizeStepUp: () => void;
46
+ onFontSizeStepDown: () => void;
47
+ selFontWeight: ComputedRef<boolean>;
48
+ selFontStyle: ComputedRef<boolean>;
49
+ selUnderline: ComputedRef<boolean>;
50
+ selStrikethrough: ComputedRef<boolean>;
51
+ toggleFontWeight: () => void;
52
+ toggleFontStyle: () => void;
53
+ toggleUnderline: () => void;
54
+ toggleStrikethrough: () => void;
55
+ cachedTextColor: Ref<string>;
56
+ cachedFillColor: Ref<string>;
57
+ textColorMenuOpen: Ref<boolean>;
58
+ fillColorMenuOpen: Ref<boolean>;
59
+ _toggleTextColorMenu: () => void;
60
+ _toggleFillColorMenu: () => void;
61
+ onBorderMenuToggle: (v: boolean) => void;
62
+ onTextColorChange: (v: string) => void;
63
+ onFillColorChange: (v: string) => void;
64
+ applyCachedTextColor: () => void;
65
+ applyCachedFillColor: () => void;
66
+ selTextColor: ComputedRef<string>;
67
+ selFillColor: ComputedRef<string>;
68
+ borderMenuOpen?: Ref<boolean>;
69
+ mergeMenuOpen?: Ref<boolean>;
70
+ }
71
+ interface UndoSnap {
72
+ sheets: SheetState[];
73
+ activeSheetIndex: number;
74
+ }
75
+ export declare function createUndoStyles(s: CoreState, sheetsCtx: {
76
+ sheets: Ref<SheetState[]>;
77
+ activeSheetIndex: Ref<number>;
78
+ saveSheet: () => void;
79
+ loadSheet: (i: number) => void;
80
+ mkSheet: (name: string) => SheetState;
81
+ }): UndoStylesState;
82
+ export declare function bindMenuRefs(us: UndoStylesState, refs: {
83
+ borderMenuOpen?: Ref<boolean>;
84
+ mergeMenuOpen?: Ref<boolean>;
85
+ }): void;
86
+ export {};
@@ -31,5 +31,12 @@ export interface AlignOption {
31
31
  export declare const H_ALIGN_OPTIONS: AlignOption[];
32
32
  export declare const V_ALIGN_OPTIONS: AlignOption[];
33
33
  export declare const WRAP_ICON = "<svg viewBox=\"0 0 1024 1024\" fill=\"currentColor\"><path d=\"M896 179.2a38.4 38.4 0 0 0-76.8 0v665.6a38.4 38.4 0 0 0 76.8 0v-665.6zM204.8 281.6A38.4 38.4 0 0 0 204.8 358.4h179.2a38.4 38.4 0 0 0 0-76.8H204.8zM550.4 281.6a38.4 38.4 0 0 0 0 76.8h51.2c35.328 0 64 28.672 64 64v179.2c0 35.328-28.672 64-64 64H246.272l36.864-36.864a38.4 38.4 0 1 0-54.272-54.272l-102.4 102.4a38.4 38.4 0 0 0 0 54.272l102.4 102.4a38.4 38.4 0 0 0 54.272-54.272l-36.864-36.864h355.328a140.8 140.8 0 0 0 140.8-140.8v-179.2a140.8 140.8 0 0 0-140.8-140.8h-51.2z\" /></svg>";
34
+ export type MergeType = 'mergeCenter' | 'mergeAcross' | 'mergeCells' | 'unmergeCells';
35
+ export interface MergeOption {
36
+ key: MergeType;
37
+ labelKey: string;
38
+ icon: string;
39
+ }
40
+ export declare const MERGE_OPTIONS: MergeOption[];
34
41
  export declare const lightTheme: ThemeColors;
35
42
  export declare const darkTheme: ThemeColors;
@@ -34,6 +34,7 @@ export interface SheetModelData {
34
34
  value: string;
35
35
  style?: Record<string, unknown>;
36
36
  }>;
37
+ merges?: Record<string, SelectionRange>;
37
38
  colWidths?: Record<number, number>;
38
39
  rowHeights?: Record<number, number>;
39
40
  }
@@ -41,6 +42,7 @@ export interface SheetState {
41
42
  id: string;
42
43
  name: string;
43
44
  cells: Record<string, CellData>;
45
+ merges: Record<string, SelectionRange>;
44
46
  selection: SelectionRange | null;
45
47
  activeCell: CellCoord;
46
48
  scrollX: number;
@@ -0,0 +1,8 @@
1
+ export { default } from './components/spreadsheet.vue';
2
+ export { default as Spreader } from './components/spreadsheet.vue';
3
+ export * from './core/types';
4
+ export * from './core/constants';
5
+ export * from './core/utils';
6
+ export * from './core/formula';
7
+ export * from './core/theme';
8
+ export type { BorderType } from './components/pickers/borderPicker.vue';
@@ -1,4 +1,4 @@
1
- import Spreader from './components/spreader/spreader.vue';
1
+ import Spreader from './components/spreader';
2
2
  export default Spreader;
3
3
  export { Spreader };
4
- export type { CellCoord, SelectionRange, CellData, Range, SpreadsheetOptions, SpreadsheetData, SheetModelData, SheetState, UndoSnapshot, ContextMenuItem, ThemeColors, Point, } from './components/spreader/types';
4
+ export type { CellCoord, SelectionRange, CellData, Range, SpreadsheetOptions, SpreadsheetData, SheetModelData, SheetState, UndoSnapshot, ContextMenuItem, ThemeColors, Point, } from './components/spreader';