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.
- package/README.ZH.md +459 -0
- package/README.md +409 -44
- package/dist/style.css +1 -1
- package/dist/types/components/spreader/{dropdown.vue.d.ts → components/dropdown.vue.d.ts} +7 -5
- package/dist/types/components/spreader/{borderPicker.vue.d.ts → components/pickers/borderPicker.vue.d.ts} +3 -0
- package/dist/types/components/spreader/{colorPicker.vue.d.ts → components/pickers/colorPicker.vue.d.ts} +6 -4
- package/dist/types/components/spreader/components/pickers/mergePicker.vue.d.ts +27 -0
- package/dist/types/components/spreader/{spreader.vue.d.ts → components/spreadsheet.vue.d.ts} +2 -8
- package/dist/types/components/spreader/{tabbar.vue.d.ts → components/tabbar.vue.d.ts} +11 -11
- package/dist/types/components/spreader/components/toolbar.vue.d.ts +111 -0
- package/dist/types/components/spreader/composables/borders-merge.d.ts +48 -0
- package/dist/types/components/spreader/composables/core-state.d.ts +98 -0
- package/dist/types/components/spreader/composables/interactions.d.ts +87 -0
- package/dist/types/components/spreader/composables/sheets-ops.d.ts +45 -0
- package/dist/types/components/spreader/composables/undo-styles.d.ts +86 -0
- package/dist/types/components/spreader/{constants.d.ts → core/constants.d.ts} +7 -0
- package/dist/types/components/spreader/{types.d.ts → core/types.d.ts} +2 -0
- package/dist/types/components/spreader/index.d.ts +8 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/xiaodao-spreader.es.js +3439 -2617
- package/dist/xiaodao-spreader.umd.js +9 -9
- package/package.json +2 -1
- package/dist/types/components/spreader/toolbar.vue.d.ts +0 -44
- /package/dist/types/components/spreader/{formula.d.ts → core/formula.d.ts} +0 -0
- /package/dist/types/components/spreader/{theme.d.ts → core/theme.d.ts} +0 -0
- /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) =>
|
|
15
|
-
change: (v: string) =>
|
|
16
|
-
"update:modelOpen": (v: boolean) =>
|
|
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;
|
package/dist/types/components/spreader/{spreader.vue.d.ts → components/spreadsheet.vue.d.ts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SheetModelData } from '
|
|
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 '
|
|
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) =>
|
|
11
|
-
"tab-dblclick": (i: number) =>
|
|
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
|
-
}) =>
|
|
16
|
-
"tab-rename-input": (v: string) =>
|
|
17
|
-
"tab-rename-keydown": (ev: KeyboardEvent) =>
|
|
18
|
-
"tab-rename-commit": () =>
|
|
19
|
-
"
|
|
20
|
-
"
|
|
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';
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Spreader from './components/spreader
|
|
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
|
|
4
|
+
export type { CellCoord, SelectionRange, CellData, Range, SpreadsheetOptions, SpreadsheetData, SheetModelData, SheetState, UndoSnapshot, ContextMenuItem, ThemeColors, Point, } from './components/spreader';
|