xiaodao-spreader 0.1.35 → 0.1.37
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 +87 -2
- package/README.md +87 -2
- package/dist/style.css +1 -1
- package/dist/types/components/spreader/components/data-validation-input-message.vue.d.ts +8 -8
- package/dist/types/components/spreader/components/dropdown.vue.d.ts +4 -1
- package/dist/types/components/spreader/components/pickers/border-picker.vue.d.ts +3 -0
- package/dist/types/components/spreader/components/pickers/calc-picker.vue.d.ts +2 -0
- package/dist/types/components/spreader/components/pickers/color-picker.vue.d.ts +3 -0
- package/dist/types/components/spreader/components/pickers/conditional-format-menu.vue.d.ts +9 -1
- package/dist/types/components/spreader/components/pickers/data-validation-alert.vue.d.ts +2 -2
- package/dist/types/components/spreader/components/pickers/data-validation-dialog.vue.d.ts +4 -4
- package/dist/types/components/spreader/components/pickers/data-validation-dropdown.vue.d.ts +12 -10
- package/dist/types/components/spreader/components/pickers/filter-popup.vue.d.ts +2 -0
- package/dist/types/components/spreader/components/pickers/merge-picker.vue.d.ts +3 -0
- package/dist/types/components/spreader/components/pickers/outline-picker.vue.d.ts +32 -0
- package/dist/types/components/spreader/components/pickers/sort-picker.vue.d.ts +3 -0
- package/dist/types/components/spreader/components/spreader.vue.d.ts +43 -0
- package/dist/types/components/spreader/components/tabbar.vue.d.ts +2 -0
- package/dist/types/components/spreader/components/toolbar.vue.d.ts +29 -0
- package/dist/types/components/spreader/composables/core-state.d.ts +41 -1
- package/dist/types/components/spreader/composables/interactions.d.ts +10 -0
- package/dist/types/components/spreader/composables/useFloatMenuPosition.d.ts +39 -0
- package/dist/types/components/spreader/core/autofill.d.ts +11 -2
- package/dist/types/components/spreader/core/constants.d.ts +2 -0
- package/dist/types/components/spreader/core/outline-core.d.ts +64 -0
- package/dist/types/components/spreader/core/types.d.ts +24 -0
- package/dist/types/components/spreader/core/utils.d.ts +20 -0
- package/dist/xiaodao-spreader.es.js +8597 -7810
- package/dist/xiaodao-spreader.umd.js +9 -9
- package/package.json +1 -1
|
@@ -20,6 +20,8 @@ type __VLS_Props = {
|
|
|
20
20
|
triggerIcon?: string;
|
|
21
21
|
/** 触发器左侧图标旁的固定文本标签(溢出菜单中显示) */
|
|
22
22
|
triggerLabel?: string;
|
|
23
|
+
/** 边界基准元素(通常是表格容器 wrapper):菜单不得越出其可视区,见 getFloatBounds */
|
|
24
|
+
boundaryEl?: HTMLElement | null;
|
|
23
25
|
};
|
|
24
26
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
25
27
|
"update:modelValue": (v: string | number) => void;
|
|
@@ -30,10 +32,10 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
30
32
|
onChange?: ((v: string | number) => any) | undefined;
|
|
31
33
|
"onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
|
|
32
34
|
}>, {
|
|
35
|
+
title: string;
|
|
33
36
|
width: string | number;
|
|
34
37
|
menuWidth: string | number;
|
|
35
38
|
visibleCount: number;
|
|
36
|
-
title: string;
|
|
37
39
|
modelOpen: boolean;
|
|
38
40
|
hideTrigger: boolean;
|
|
39
41
|
align: "left" | "right";
|
|
@@ -43,6 +45,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
43
45
|
searchPlaceholder: string;
|
|
44
46
|
triggerIcon: string;
|
|
45
47
|
triggerLabel: string;
|
|
48
|
+
boundaryEl: HTMLElement | null;
|
|
46
49
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
47
50
|
rootRef: HTMLDivElement;
|
|
48
51
|
menuRef: HTMLDivElement;
|
|
@@ -4,6 +4,8 @@ type __VLS_Props = {
|
|
|
4
4
|
locale?: string;
|
|
5
5
|
currentBorder?: BorderType;
|
|
6
6
|
triggerEl?: HTMLElement | null;
|
|
7
|
+
/** 边界基准元素(通常是表格容器 wrapper):菜单不得越出其可视区,见 getFloatBounds */
|
|
8
|
+
boundaryEl?: HTMLElement | null;
|
|
7
9
|
};
|
|
8
10
|
declare function openMenu(): void;
|
|
9
11
|
declare function close(): void;
|
|
@@ -20,6 +22,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
|
20
22
|
}>, {
|
|
21
23
|
modelOpen: boolean;
|
|
22
24
|
triggerEl: HTMLElement | null;
|
|
25
|
+
boundaryEl: HTMLElement | null;
|
|
23
26
|
locale: string;
|
|
24
27
|
currentBorder: BorderType;
|
|
25
28
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
@@ -4,6 +4,8 @@ type __VLS_Props = {
|
|
|
4
4
|
locale?: string;
|
|
5
5
|
triggerEl?: HTMLElement | null;
|
|
6
6
|
disabled?: boolean;
|
|
7
|
+
/** 边界基准元素(通常是表格容器 wrapper):菜单不得越出其可视区,见 getFloatBounds */
|
|
8
|
+
boundaryEl?: HTMLElement | null;
|
|
7
9
|
};
|
|
8
10
|
declare function openMenu(): void;
|
|
9
11
|
declare function close(): void;
|
|
@@ -4,6 +4,8 @@ type __VLS_Props = {
|
|
|
4
4
|
currentColor?: string;
|
|
5
5
|
locale?: string;
|
|
6
6
|
triggerEl?: HTMLElement | null;
|
|
7
|
+
/** 边界基准元素(通常是表格容器 wrapper):菜单不得越出其可视区,见 getFloatBounds */
|
|
8
|
+
boundaryEl?: HTMLElement | null;
|
|
7
9
|
};
|
|
8
10
|
declare function openMenu(): void;
|
|
9
11
|
declare function close(): void;
|
|
@@ -22,6 +24,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
|
22
24
|
}>, {
|
|
23
25
|
modelOpen: boolean;
|
|
24
26
|
triggerEl: HTMLElement | null;
|
|
27
|
+
boundaryEl: HTMLElement | null;
|
|
25
28
|
currentColor: string;
|
|
26
29
|
colorKey: string;
|
|
27
30
|
locale: string;
|
|
@@ -2,18 +2,26 @@ type __VLS_Props = {
|
|
|
2
2
|
locale: string;
|
|
3
3
|
hasSelection: boolean;
|
|
4
4
|
themeVars?: Record<string, string>;
|
|
5
|
+
/** 边界基准元素(通常是表格容器 wrapper):菜单不得越出其可视区,见 getFloatBounds */
|
|
6
|
+
boundaryEl?: HTMLElement | null;
|
|
7
|
+
/** 受控展开状态:由 toolbar 的 coordToolbarMenu 协调器统一管理(同一时刻仅一个下拉打开) */
|
|
8
|
+
modelOpen?: boolean;
|
|
5
9
|
};
|
|
6
10
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
7
11
|
preset: (type: string) => void;
|
|
8
12
|
"new-rule": () => void;
|
|
9
13
|
manage: () => void;
|
|
10
14
|
clear: (scope: "sheet" | "selection") => void;
|
|
15
|
+
"update:modelOpen": (v: boolean) => void;
|
|
11
16
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
17
|
+
"onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
|
|
18
|
+
onClear?: ((scope: "sheet" | "selection") => any) | undefined;
|
|
12
19
|
onPreset?: ((type: string) => any) | undefined;
|
|
13
20
|
"onNew-rule"?: (() => any) | undefined;
|
|
14
21
|
onManage?: (() => any) | undefined;
|
|
15
|
-
onClear?: ((scope: "sheet" | "selection") => any) | undefined;
|
|
16
22
|
}>, {
|
|
23
|
+
modelOpen: boolean;
|
|
24
|
+
boundaryEl: HTMLElement | null;
|
|
17
25
|
themeVars: Record<string, string>;
|
|
18
26
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
19
27
|
rootRef: HTMLDivElement;
|
|
@@ -2,8 +2,8 @@ import type { DataValidationSeverity } from '../../core/types';
|
|
|
2
2
|
type __VLS_Props = {
|
|
3
3
|
locale: string;
|
|
4
4
|
severity: DataValidationSeverity;
|
|
5
|
-
title
|
|
6
|
-
message
|
|
5
|
+
title?: string;
|
|
6
|
+
message?: string;
|
|
7
7
|
themeVars?: Record<string, string>;
|
|
8
8
|
};
|
|
9
9
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
@@ -6,10 +6,10 @@ type __VLS_Props = {
|
|
|
6
6
|
defaultRangeText?: string;
|
|
7
7
|
themeVars?: Record<string, string>;
|
|
8
8
|
};
|
|
9
|
-
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
10
|
+
save: (rule: DataValidationRule) => void;
|
|
11
|
+
cancel: () => void;
|
|
12
|
+
clear: () => void;
|
|
13
13
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
14
14
|
onCancel?: (() => any) | undefined;
|
|
15
15
|
onClear?: (() => any) | undefined;
|
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
type __VLS_Props = {
|
|
2
|
-
items
|
|
2
|
+
items?: string[];
|
|
3
3
|
/** 当前单元格原始值(用于标记已选项) */
|
|
4
|
-
current
|
|
5
|
-
locale
|
|
4
|
+
current?: string;
|
|
5
|
+
locale?: string;
|
|
6
6
|
/** 锚点单元格在视口中的位置与尺寸(client 坐标) */
|
|
7
|
-
x
|
|
8
|
-
y
|
|
9
|
-
width
|
|
10
|
-
height
|
|
7
|
+
x?: number;
|
|
8
|
+
y?: number;
|
|
9
|
+
width?: number;
|
|
10
|
+
height?: number;
|
|
11
|
+
/** 边界基准元素(通常是表格容器 wrapper):下拉不得越出其可视区,见 getFloatBounds */
|
|
12
|
+
boundaryEl?: HTMLElement | null;
|
|
11
13
|
};
|
|
12
14
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
13
|
-
close: () => any;
|
|
14
15
|
select: (value: string) => any;
|
|
16
|
+
close: () => any;
|
|
15
17
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
16
|
-
onClose?: (() => any) | undefined;
|
|
17
18
|
onSelect?: ((value: string) => any) | undefined;
|
|
19
|
+
onClose?: (() => any) | undefined;
|
|
18
20
|
}>, {
|
|
19
21
|
y: number;
|
|
20
22
|
width: number;
|
|
21
23
|
current: string;
|
|
22
|
-
locale: string;
|
|
23
24
|
x: number;
|
|
25
|
+
locale: string;
|
|
24
26
|
height: number;
|
|
25
27
|
items: string[];
|
|
26
28
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
@@ -19,6 +19,8 @@ type __VLS_Props = {
|
|
|
19
19
|
hasBlank: boolean;
|
|
20
20
|
};
|
|
21
21
|
close: () => void;
|
|
22
|
+
/** 边界基准元素(通常是表格容器 wrapper):弹窗不得越出其可视区,见 getFloatBounds */
|
|
23
|
+
boundaryEl?: HTMLElement | null;
|
|
22
24
|
};
|
|
23
25
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
24
26
|
locale: string;
|
|
@@ -3,6 +3,8 @@ type __VLS_Props = {
|
|
|
3
3
|
modelOpen?: boolean;
|
|
4
4
|
locale?: string;
|
|
5
5
|
triggerEl?: HTMLElement | null;
|
|
6
|
+
/** 边界基准元素(通常是表格容器 wrapper):菜单不得越出其可视区,见 getFloatBounds */
|
|
7
|
+
boundaryEl?: HTMLElement | null;
|
|
6
8
|
};
|
|
7
9
|
declare function openMenu(): void;
|
|
8
10
|
declare function close(): void;
|
|
@@ -19,6 +21,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
|
19
21
|
}>, {
|
|
20
22
|
modelOpen: boolean;
|
|
21
23
|
triggerEl: HTMLElement | null;
|
|
24
|
+
boundaryEl: HTMLElement | null;
|
|
22
25
|
locale: string;
|
|
23
26
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
24
27
|
rootRef: HTMLDivElement;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
modelOpen?: boolean;
|
|
3
|
+
locale?: string;
|
|
4
|
+
triggerEl?: HTMLElement | null;
|
|
5
|
+
/** 边界基准元素(通常是表格容器 wrapper):菜单不得越出其可视区,见 bounds() */
|
|
6
|
+
boundaryEl?: HTMLElement | null;
|
|
7
|
+
/** 当前选区轴:'rows'=选中整行,'cols'=选中整列,null=未选中行/列(按钮置灰)。菜单项直接作用于该轴,不再弹「行/列」子菜单。 */
|
|
8
|
+
axis?: 'rows' | 'cols' | null;
|
|
9
|
+
};
|
|
10
|
+
declare function openMenu(): void;
|
|
11
|
+
declare function close(): void;
|
|
12
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
13
|
+
open: import("vue").Ref<boolean, boolean>;
|
|
14
|
+
openMenu: typeof openMenu;
|
|
15
|
+
close: typeof close;
|
|
16
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
17
|
+
"update:modelOpen": (v: boolean) => any;
|
|
18
|
+
action: (v: string) => any;
|
|
19
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
20
|
+
"onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
|
|
21
|
+
onAction?: ((v: string) => any) | undefined;
|
|
22
|
+
}>, {
|
|
23
|
+
modelOpen: boolean;
|
|
24
|
+
triggerEl: HTMLElement | null;
|
|
25
|
+
boundaryEl: HTMLElement | null;
|
|
26
|
+
locale: string;
|
|
27
|
+
axis: "rows" | "cols" | null;
|
|
28
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
29
|
+
rootRef: HTMLDivElement;
|
|
30
|
+
menuRef: HTMLDivElement;
|
|
31
|
+
}, HTMLDivElement>;
|
|
32
|
+
export default _default;
|
|
@@ -4,6 +4,8 @@ type __VLS_Props = {
|
|
|
4
4
|
locale?: string;
|
|
5
5
|
currentSort?: SortOrder;
|
|
6
6
|
triggerEl?: HTMLElement | null;
|
|
7
|
+
/** 边界基准元素(通常是表格容器 wrapper):菜单不得越出其可视区,见 getFloatBounds */
|
|
8
|
+
boundaryEl?: HTMLElement | null;
|
|
7
9
|
};
|
|
8
10
|
declare function openMenu(): void;
|
|
9
11
|
declare function close(): void;
|
|
@@ -20,6 +22,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
|
20
22
|
}>, {
|
|
21
23
|
modelOpen: boolean;
|
|
22
24
|
triggerEl: HTMLElement | null;
|
|
25
|
+
boundaryEl: HTMLElement | null;
|
|
23
26
|
locale: string;
|
|
24
27
|
currentSort: SortOrder;
|
|
25
28
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
@@ -47,6 +47,8 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
47
47
|
sortMenuOpen: boolean;
|
|
48
48
|
cachedSortOrder: import("@/components/spreader/core/sort-core.ts").SortOrder;
|
|
49
49
|
canSort: boolean;
|
|
50
|
+
outlineMenuOpen: boolean;
|
|
51
|
+
outlineAxis?: "rows" | "cols" | null | undefined;
|
|
50
52
|
canFilter: boolean;
|
|
51
53
|
filterActive: boolean;
|
|
52
54
|
selHAlign: string;
|
|
@@ -56,6 +58,12 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
56
58
|
vAlignOptions: import("../core/constants").FontOption[];
|
|
57
59
|
mergeMenuOpen: boolean;
|
|
58
60
|
calcMenuOpen: boolean;
|
|
61
|
+
cfMenuOpen: boolean;
|
|
62
|
+
freezeMenuOpen: boolean;
|
|
63
|
+
fontMenuOpen: boolean;
|
|
64
|
+
hAlignMenuOpen: boolean;
|
|
65
|
+
vAlignMenuOpen: boolean;
|
|
66
|
+
numFmtMenuOpen: boolean;
|
|
59
67
|
isSingleCell: boolean;
|
|
60
68
|
hasFreeze: boolean;
|
|
61
69
|
freezePanesDisabled: boolean;
|
|
@@ -64,6 +72,7 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
64
72
|
nfOptions: import("../core/number-format").NFOption[];
|
|
65
73
|
canIncreaseDecimals: boolean;
|
|
66
74
|
canDecreaseDecimals: boolean;
|
|
75
|
+
boundaryEl?: HTMLElement | null | undefined;
|
|
67
76
|
}> & Readonly<{
|
|
68
77
|
onUndo?: (() => any) | undefined;
|
|
69
78
|
onRedo?: (() => any) | undefined;
|
|
@@ -103,14 +112,22 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
103
112
|
"onNumber-format-change"?: ((v: string) => any) | undefined;
|
|
104
113
|
"onFreeze-change"?: ((v: string) => any) | undefined;
|
|
105
114
|
"onCf-preset"?: ((v: string) => any) | undefined;
|
|
115
|
+
"onOutline-action"?: ((v: string) => any) | undefined;
|
|
106
116
|
"onFont-size-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
|
|
107
117
|
"onUpdate:font-size-menu-open"?: ((v: boolean) => any) | undefined;
|
|
108
118
|
"onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
109
119
|
"onUpdate:fill-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
110
120
|
"onUpdate:border-menu-open"?: ((v: boolean) => any) | undefined;
|
|
111
121
|
"onUpdate:sort-menu-open"?: ((v: boolean) => any) | undefined;
|
|
122
|
+
"onUpdate:outline-menu-open"?: ((v: boolean) => any) | undefined;
|
|
112
123
|
"onUpdate:merge-menu-open"?: ((v: boolean) => any) | undefined;
|
|
113
124
|
"onUpdate:calc-menu-open"?: ((v: boolean) => any) | undefined;
|
|
125
|
+
"onUpdate:cf-menu-open"?: ((v: boolean) => any) | undefined;
|
|
126
|
+
"onUpdate:freeze-menu-open"?: ((v: boolean) => any) | undefined;
|
|
127
|
+
"onUpdate:font-menu-open"?: ((v: boolean) => any) | undefined;
|
|
128
|
+
"onUpdate:h-align-menu-open"?: ((v: boolean) => any) | undefined;
|
|
129
|
+
"onUpdate:v-align-menu-open"?: ((v: boolean) => any) | undefined;
|
|
130
|
+
"onUpdate:num-fmt-menu-open"?: ((v: boolean) => any) | undefined;
|
|
114
131
|
"onBorder-change"?: ((v: import("@/components/spreader/components/pickers/border-picker.vue").BorderType) => any) | undefined;
|
|
115
132
|
"onSort-change"?: ((v: import("@/components/spreader/core/sort-core.ts").SortOrder) => any) | undefined;
|
|
116
133
|
"onMerge-change"?: ((v: import("../core/constants").MergeType) => any) | undefined;
|
|
@@ -156,14 +173,22 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
156
173
|
"number-format-change": (v: string) => void;
|
|
157
174
|
"freeze-change": (v: string) => void;
|
|
158
175
|
"cf-preset": (v: string) => void;
|
|
176
|
+
"outline-action": (v: string) => void;
|
|
159
177
|
"font-size-keydown": (ev: KeyboardEvent) => void;
|
|
160
178
|
"update:font-size-menu-open": (v: boolean) => void;
|
|
161
179
|
"update:text-color-menu-open": (v: boolean) => void;
|
|
162
180
|
"update:fill-color-menu-open": (v: boolean) => void;
|
|
163
181
|
"update:border-menu-open": (v: boolean) => void;
|
|
164
182
|
"update:sort-menu-open": (v: boolean) => void;
|
|
183
|
+
"update:outline-menu-open": (v: boolean) => void;
|
|
165
184
|
"update:merge-menu-open": (v: boolean) => void;
|
|
166
185
|
"update:calc-menu-open": (v: boolean) => void;
|
|
186
|
+
"update:cf-menu-open": (v: boolean) => void;
|
|
187
|
+
"update:freeze-menu-open": (v: boolean) => void;
|
|
188
|
+
"update:font-menu-open": (v: boolean) => void;
|
|
189
|
+
"update:h-align-menu-open": (v: boolean) => void;
|
|
190
|
+
"update:v-align-menu-open": (v: boolean) => void;
|
|
191
|
+
"update:num-fmt-menu-open": (v: boolean) => void;
|
|
167
192
|
"border-change": (v: import("@/components/spreader/components/pickers/border-picker.vue").BorderType) => void;
|
|
168
193
|
"sort-change": (v: import("@/components/spreader/core/sort-core.ts").SortOrder) => void;
|
|
169
194
|
"merge-change": (v: import("../core/constants").MergeType) => void;
|
|
@@ -177,6 +202,7 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
177
202
|
mergeArrowRef: HTMLButtonElement;
|
|
178
203
|
calcArrowRef: HTMLButtonElement;
|
|
179
204
|
sortArrowRef: HTMLButtonElement;
|
|
205
|
+
outlineArrowRef: HTMLButtonElement;
|
|
180
206
|
moreBtnEl: HTMLButtonElement;
|
|
181
207
|
overflowMenuEl: HTMLDivElement;
|
|
182
208
|
}, any, import("vue").ComponentProvideOptions, {
|
|
@@ -213,6 +239,8 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
213
239
|
sortMenuOpen: boolean;
|
|
214
240
|
cachedSortOrder: import("@/components/spreader/core/sort-core.ts").SortOrder;
|
|
215
241
|
canSort: boolean;
|
|
242
|
+
outlineMenuOpen: boolean;
|
|
243
|
+
outlineAxis?: "rows" | "cols" | null | undefined;
|
|
216
244
|
canFilter: boolean;
|
|
217
245
|
filterActive: boolean;
|
|
218
246
|
selHAlign: string;
|
|
@@ -222,6 +250,12 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
222
250
|
vAlignOptions: import("../core/constants").FontOption[];
|
|
223
251
|
mergeMenuOpen: boolean;
|
|
224
252
|
calcMenuOpen: boolean;
|
|
253
|
+
cfMenuOpen: boolean;
|
|
254
|
+
freezeMenuOpen: boolean;
|
|
255
|
+
fontMenuOpen: boolean;
|
|
256
|
+
hAlignMenuOpen: boolean;
|
|
257
|
+
vAlignMenuOpen: boolean;
|
|
258
|
+
numFmtMenuOpen: boolean;
|
|
225
259
|
isSingleCell: boolean;
|
|
226
260
|
hasFreeze: boolean;
|
|
227
261
|
freezePanesDisabled: boolean;
|
|
@@ -230,6 +264,7 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
230
264
|
nfOptions: import("../core/number-format").NFOption[];
|
|
231
265
|
canIncreaseDecimals: boolean;
|
|
232
266
|
canDecreaseDecimals: boolean;
|
|
267
|
+
boundaryEl?: HTMLElement | null | undefined;
|
|
233
268
|
}> & Readonly<{
|
|
234
269
|
onUndo?: (() => any) | undefined;
|
|
235
270
|
onRedo?: (() => any) | undefined;
|
|
@@ -269,14 +304,22 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
269
304
|
"onNumber-format-change"?: ((v: string) => any) | undefined;
|
|
270
305
|
"onFreeze-change"?: ((v: string) => any) | undefined;
|
|
271
306
|
"onCf-preset"?: ((v: string) => any) | undefined;
|
|
307
|
+
"onOutline-action"?: ((v: string) => any) | undefined;
|
|
272
308
|
"onFont-size-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
|
|
273
309
|
"onUpdate:font-size-menu-open"?: ((v: boolean) => any) | undefined;
|
|
274
310
|
"onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
275
311
|
"onUpdate:fill-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
276
312
|
"onUpdate:border-menu-open"?: ((v: boolean) => any) | undefined;
|
|
277
313
|
"onUpdate:sort-menu-open"?: ((v: boolean) => any) | undefined;
|
|
314
|
+
"onUpdate:outline-menu-open"?: ((v: boolean) => any) | undefined;
|
|
278
315
|
"onUpdate:merge-menu-open"?: ((v: boolean) => any) | undefined;
|
|
279
316
|
"onUpdate:calc-menu-open"?: ((v: boolean) => any) | undefined;
|
|
317
|
+
"onUpdate:cf-menu-open"?: ((v: boolean) => any) | undefined;
|
|
318
|
+
"onUpdate:freeze-menu-open"?: ((v: boolean) => any) | undefined;
|
|
319
|
+
"onUpdate:font-menu-open"?: ((v: boolean) => any) | undefined;
|
|
320
|
+
"onUpdate:h-align-menu-open"?: ((v: boolean) => any) | undefined;
|
|
321
|
+
"onUpdate:v-align-menu-open"?: ((v: boolean) => any) | undefined;
|
|
322
|
+
"onUpdate:num-fmt-menu-open"?: ((v: boolean) => any) | undefined;
|
|
280
323
|
"onBorder-change"?: ((v: import("@/components/spreader/components/pickers/border-picker.vue").BorderType) => any) | undefined;
|
|
281
324
|
"onSort-change"?: ((v: import("@/components/spreader/core/sort-core.ts").SortOrder) => any) | undefined;
|
|
282
325
|
"onMerge-change"?: ((v: import("../core/constants").MergeType) => any) | undefined;
|
|
@@ -5,6 +5,8 @@ type __VLS_Props = {
|
|
|
5
5
|
activeSheetIndex: number;
|
|
6
6
|
renTab: number | null;
|
|
7
7
|
renTabVal: string;
|
|
8
|
+
/** 边界基准元素(通常是表格容器 wrapper):列表菜单不得越出其可视区,见 getFloatBounds */
|
|
9
|
+
boundaryEl?: HTMLElement | null;
|
|
8
10
|
};
|
|
9
11
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
10
12
|
"tab-click": (i: number) => void;
|
|
@@ -30,6 +30,9 @@ type __VLS_Props = {
|
|
|
30
30
|
sortMenuOpen: boolean;
|
|
31
31
|
cachedSortOrder: SortOrder;
|
|
32
32
|
canSort: boolean;
|
|
33
|
+
outlineMenuOpen: boolean;
|
|
34
|
+
/** 当前选区轴:'rows'=选中整行,'cols'=选中整列,null=未选中行/列。决定「分组」按钮是否可用(置灰提示先选行/列) */
|
|
35
|
+
outlineAxis?: 'rows' | 'cols' | null;
|
|
33
36
|
/** 工具栏「筛选」按钮是否可用(单选合并单元格且无筛选态时禁用) */
|
|
34
37
|
canFilter: boolean;
|
|
35
38
|
/** 当前 worksheet 是否已启用筛选 */
|
|
@@ -41,6 +44,12 @@ type __VLS_Props = {
|
|
|
41
44
|
vAlignOptions: FontOption[];
|
|
42
45
|
mergeMenuOpen: boolean;
|
|
43
46
|
calcMenuOpen: boolean;
|
|
47
|
+
cfMenuOpen: boolean;
|
|
48
|
+
freezeMenuOpen: boolean;
|
|
49
|
+
fontMenuOpen: boolean;
|
|
50
|
+
hAlignMenuOpen: boolean;
|
|
51
|
+
vAlignMenuOpen: boolean;
|
|
52
|
+
numFmtMenuOpen: boolean;
|
|
44
53
|
isSingleCell: boolean;
|
|
45
54
|
/** 当前 worksheet 是否已有冻结行或列 */
|
|
46
55
|
hasFreeze: boolean;
|
|
@@ -51,6 +60,9 @@ type __VLS_Props = {
|
|
|
51
60
|
nfOptions: NFOption[];
|
|
52
61
|
canIncreaseDecimals: boolean;
|
|
53
62
|
canDecreaseDecimals: boolean;
|
|
63
|
+
/** 边界基准元素(通常是表格容器 wrapper):弹出菜单不得越出其可视区。
|
|
64
|
+
* 组件嵌入宿主 Vue 页面时必需——否则菜单会越界盖住宿主内容。缺省时退化为纯视口判定。 */
|
|
65
|
+
boundaryEl?: HTMLElement | null;
|
|
54
66
|
};
|
|
55
67
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
56
68
|
closeOverflow: typeof closeOverflow;
|
|
@@ -93,14 +105,22 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
|
93
105
|
"number-format-change": (v: string) => void;
|
|
94
106
|
"freeze-change": (v: string) => void;
|
|
95
107
|
"cf-preset": (v: string) => void;
|
|
108
|
+
"outline-action": (v: string) => void;
|
|
96
109
|
"font-size-keydown": (ev: KeyboardEvent) => void;
|
|
97
110
|
"update:font-size-menu-open": (v: boolean) => void;
|
|
98
111
|
"update:text-color-menu-open": (v: boolean) => void;
|
|
99
112
|
"update:fill-color-menu-open": (v: boolean) => void;
|
|
100
113
|
"update:border-menu-open": (v: boolean) => void;
|
|
101
114
|
"update:sort-menu-open": (v: boolean) => void;
|
|
115
|
+
"update:outline-menu-open": (v: boolean) => void;
|
|
102
116
|
"update:merge-menu-open": (v: boolean) => void;
|
|
103
117
|
"update:calc-menu-open": (v: boolean) => void;
|
|
118
|
+
"update:cf-menu-open": (v: boolean) => void;
|
|
119
|
+
"update:freeze-menu-open": (v: boolean) => void;
|
|
120
|
+
"update:font-menu-open": (v: boolean) => void;
|
|
121
|
+
"update:h-align-menu-open": (v: boolean) => void;
|
|
122
|
+
"update:v-align-menu-open": (v: boolean) => void;
|
|
123
|
+
"update:num-fmt-menu-open": (v: boolean) => void;
|
|
104
124
|
"border-change": (v: BorderType) => void;
|
|
105
125
|
"sort-change": (v: SortOrder) => void;
|
|
106
126
|
"merge-change": (v: MergeType) => void;
|
|
@@ -144,14 +164,22 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
|
144
164
|
"onNumber-format-change"?: ((v: string) => any) | undefined;
|
|
145
165
|
"onFreeze-change"?: ((v: string) => any) | undefined;
|
|
146
166
|
"onCf-preset"?: ((v: string) => any) | undefined;
|
|
167
|
+
"onOutline-action"?: ((v: string) => any) | undefined;
|
|
147
168
|
"onFont-size-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
|
|
148
169
|
"onUpdate:font-size-menu-open"?: ((v: boolean) => any) | undefined;
|
|
149
170
|
"onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
150
171
|
"onUpdate:fill-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
151
172
|
"onUpdate:border-menu-open"?: ((v: boolean) => any) | undefined;
|
|
152
173
|
"onUpdate:sort-menu-open"?: ((v: boolean) => any) | undefined;
|
|
174
|
+
"onUpdate:outline-menu-open"?: ((v: boolean) => any) | undefined;
|
|
153
175
|
"onUpdate:merge-menu-open"?: ((v: boolean) => any) | undefined;
|
|
154
176
|
"onUpdate:calc-menu-open"?: ((v: boolean) => any) | undefined;
|
|
177
|
+
"onUpdate:cf-menu-open"?: ((v: boolean) => any) | undefined;
|
|
178
|
+
"onUpdate:freeze-menu-open"?: ((v: boolean) => any) | undefined;
|
|
179
|
+
"onUpdate:font-menu-open"?: ((v: boolean) => any) | undefined;
|
|
180
|
+
"onUpdate:h-align-menu-open"?: ((v: boolean) => any) | undefined;
|
|
181
|
+
"onUpdate:v-align-menu-open"?: ((v: boolean) => any) | undefined;
|
|
182
|
+
"onUpdate:num-fmt-menu-open"?: ((v: boolean) => any) | undefined;
|
|
155
183
|
"onBorder-change"?: ((v: BorderType) => any) | undefined;
|
|
156
184
|
"onSort-change"?: ((v: SortOrder) => any) | undefined;
|
|
157
185
|
"onMerge-change"?: ((v: MergeType) => any) | undefined;
|
|
@@ -165,6 +193,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
|
165
193
|
mergeArrowRef: HTMLButtonElement;
|
|
166
194
|
calcArrowRef: HTMLButtonElement;
|
|
167
195
|
sortArrowRef: HTMLButtonElement;
|
|
196
|
+
outlineArrowRef: HTMLButtonElement;
|
|
168
197
|
moreBtnEl: HTMLButtonElement;
|
|
169
198
|
overflowMenuEl: HTMLDivElement;
|
|
170
199
|
}, any>;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type ComputedRef, type Ref } from 'vue';
|
|
2
2
|
import { FormulaDeps } from '../core/formula';
|
|
3
|
-
import type { CellCoord, CellData, CellStyle, SelectionRange, BorderStyle, BorderSide, FreezePane, ViewportRegion, SheetFilter, FilterColumn, ConditionalFormattingRule, ConditionalFormattingFormat, DataValidationRule, DataValidationResult, DataValidationSeverity } from '../core/types';
|
|
3
|
+
import type { CellCoord, CellData, CellStyle, SelectionRange, BorderStyle, BorderSide, FreezePane, ViewportRegion, SheetFilter, FilterColumn, ConditionalFormattingRule, ConditionalFormattingFormat, DataValidationRule, DataValidationResult, DataValidationSeverity, DimensionOutline } from '../core/types';
|
|
4
4
|
import { type FilterCandidates } from '../core/filter-core';
|
|
5
|
+
import { type OutlineValidationResult } from '../core/outline-core';
|
|
5
6
|
/** 选区触发方式,影响「合并单元格是否扩大选区」。
|
|
6
7
|
* - 'cell':单元格点击/拖动(默认)→ 保持现有 expandSelectionForMerges 行为
|
|
7
8
|
* - 'row' :行头点击/拖动 → Excel 风格「穿透」合并,选区矩形保持用户点击的行范围
|
|
@@ -102,6 +103,45 @@ export interface CoreState {
|
|
|
102
103
|
getVisibleRowCount: () => number;
|
|
103
104
|
getVisibleRowAt: (index: number) => number;
|
|
104
105
|
getVisibleRowIndex: (row: number) => number;
|
|
106
|
+
/** 当前工作表行分组集合(稳定 ID,展开/折叠状态) */
|
|
107
|
+
getRowOutlines: () => DimensionOutline[];
|
|
108
|
+
/** 当前工作表列分组集合 */
|
|
109
|
+
getColumnOutlines: () => DimensionOutline[];
|
|
110
|
+
/** 在某组上创建分组;返回是否成功(失败给出提示码) */
|
|
111
|
+
addRowGroup: (start: number, end: number) => OutlineValidationResult;
|
|
112
|
+
addColumnGroup: (start: number, end: number) => OutlineValidationResult;
|
|
113
|
+
/** 取消组合:完整覆盖某个分组才允许 Ungroup,返回是否成功 */
|
|
114
|
+
removeOutline: (id: string) => boolean;
|
|
115
|
+
clearRowGroups: () => void;
|
|
116
|
+
clearColumnGroups: () => void;
|
|
117
|
+
clearAllOutlines: () => void;
|
|
118
|
+
/** 设置分组折叠状态(一次一个视图状态操作,不影响结构) */
|
|
119
|
+
setOutlineCollapsed: (id: string, collapsed: boolean, silent?: boolean) => void;
|
|
120
|
+
toggleOutline: (id: string) => void;
|
|
121
|
+
/** 当前最大分组层级(0 = 无分组) */
|
|
122
|
+
getOutlineLevel: (axis: 'row' | 'column') => number;
|
|
123
|
+
/** Outline gutter 总尺寸:无分组为 0;否则 = 等级控件条 + 层级数×单级宽度。axis='row' → 左侧 gutter 宽,axis='column' → 顶部 gutter 高 */
|
|
124
|
+
getOutlineGutterSize: (axis: 'row' | 'column') => number;
|
|
125
|
+
/** 逻辑行/列当前所处的分组层级(0 = 不在任何分组内) */
|
|
126
|
+
getRowOutlineLevel: (row: number) => number;
|
|
127
|
+
getColumnOutlineLevel: (col: number) => number;
|
|
128
|
+
/** 逻辑行/列当前是否被折叠分组隐藏 */
|
|
129
|
+
isRowCollapsed: (row: number) => boolean;
|
|
130
|
+
isColumnCollapsed: (col: number) => boolean;
|
|
131
|
+
/** 逻辑行列是否可见(Filter + Outline 组合) */
|
|
132
|
+
isRowVisible: (row: number) => boolean;
|
|
133
|
+
isColumnVisible: (col: number) => boolean;
|
|
134
|
+
/** 列是否隐藏(当前仅由列分组折叠决定) */
|
|
135
|
+
isColHidden: (col: number) => boolean;
|
|
136
|
+
/** 逻辑列宽(折叠列返回 0,供布局/命中测试使用) */
|
|
137
|
+
getColWidth: (c: number) => number;
|
|
138
|
+
/** outline 引擎注入:行列增删后的结构调整(由 sheets-ops 调用) */
|
|
139
|
+
adjustOutlinesForInsertRows: (index: number, count: number) => void;
|
|
140
|
+
adjustOutlinesForDeleteRows: (index: number, count: number) => void;
|
|
141
|
+
adjustOutlinesForInsertCols: (index: number, count: number) => void;
|
|
142
|
+
adjustOutlinesForDeleteCols: (index: number, count: number) => void;
|
|
143
|
+
/** 设置当前工作表的分组集合(加载/撤销恢复等受控场景;同时重算层级) */
|
|
144
|
+
syncOutlines: (rowOutlines: DimensionOutline[] | undefined, columnOutlines: DimensionOutline[] | undefined) => void;
|
|
105
145
|
/** 基于真实行高/列宽计算冻结区域尺寸 */
|
|
106
146
|
getFrozenMetrics: () => {
|
|
107
147
|
frozenRowsHeight: number;
|
|
@@ -83,6 +83,16 @@ export interface InteractionsState {
|
|
|
83
83
|
onDimBlur: () => void;
|
|
84
84
|
applyDimPanel: () => void;
|
|
85
85
|
closeDimPanel: () => void;
|
|
86
|
+
outlineGroupRows: () => boolean;
|
|
87
|
+
outlineGroupCols: () => boolean;
|
|
88
|
+
outlineUngroupRows: () => boolean;
|
|
89
|
+
outlineUngroupCols: () => boolean;
|
|
90
|
+
outlineExpandRows: () => void;
|
|
91
|
+
outlineCollapseRows: () => void;
|
|
92
|
+
outlineExpandCols: () => void;
|
|
93
|
+
outlineCollapseCols: () => void;
|
|
94
|
+
/** 分组校验提示:由宿主注入的应用内对话框;未注入时回退 window.alert */
|
|
95
|
+
showOutlineAlert?: (message: string) => void;
|
|
86
96
|
editInputStyle: ComputedRef<Record<string, string | number | undefined>>;
|
|
87
97
|
hScrollbarW: ComputedRef<number>;
|
|
88
98
|
vScrollbarH: ComputedRef<number>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface FloatMenuPosition {
|
|
2
|
+
/** fixed 定位:右缘(px),与 trigger 右缘对齐后夹回有效右边界 */
|
|
3
|
+
right?: number;
|
|
4
|
+
/** fixed 定位:左缘(px)。默认不使用,仅当右缘锚定不可用时的兜底 */
|
|
5
|
+
left?: number;
|
|
6
|
+
/** fixed 定位:上缘(px) */
|
|
7
|
+
top: number;
|
|
8
|
+
/** 是否向上翻向弹出(trigger 下方放不下且上方有空间) */
|
|
9
|
+
up: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 主弹出菜单(工具栏下拉框:条件格式 / 分组等)的统一定位逻辑。
|
|
13
|
+
*
|
|
14
|
+
* 与 conditional-format-menu.vue 原实现完全同构,抽出来让所有工具栏下拉框复用同一套,
|
|
15
|
+
* 不再各写一套:
|
|
16
|
+
* - 右缘锚定 trigger 右缘(Math.min(r.right, b.right) 夹回有效右边界),top 先落 trigger 下缘 +4;
|
|
17
|
+
* - 传入 menuEl(已挂载、可量高度)后,按「容器∩视口」有效区做上下翻向 + 夹紧:
|
|
18
|
+
* 下方放得下就向下;下方放不下但上方有空间就向上;两边都放不下→夹紧贴顶/贴底兜底。
|
|
19
|
+
* 夹紧下界取 min(b.top + 8, trigger 下缘 + 4):工具栏按钮在 boundaryEl(表格容器)之上,
|
|
20
|
+
* 此时 b.top + 8 落在按钮下方,若仍以它为下界会把菜单硬推离按钮数十像素(主栏下拉整体下移),
|
|
21
|
+
* 故下界不得高于「紧贴 trigger 下方」这一理想位置。
|
|
22
|
+
*
|
|
23
|
+
* 调用约定(与 cf-menu 一致):先 place(trigger, boundary) 做初始下落放置,
|
|
24
|
+
* 再于 nextTick 后 place(trigger, boundary, menuEl) 量高翻向。
|
|
25
|
+
*/
|
|
26
|
+
export declare function useFloatMenuPosition(): {
|
|
27
|
+
pos: import("vue").Ref<{
|
|
28
|
+
right?: number | undefined;
|
|
29
|
+
left?: number | undefined;
|
|
30
|
+
top: number;
|
|
31
|
+
up: boolean;
|
|
32
|
+
}, FloatMenuPosition | {
|
|
33
|
+
right?: number | undefined;
|
|
34
|
+
left?: number | undefined;
|
|
35
|
+
top: number;
|
|
36
|
+
up: boolean;
|
|
37
|
+
}>;
|
|
38
|
+
place: (triggerEl: HTMLElement, boundaryEl: HTMLElement | null | undefined, menuEl?: HTMLElement | null) => void;
|
|
39
|
+
};
|
|
@@ -104,12 +104,21 @@ export declare function computeTargetRange(sourceRange: SelectionRange, draggedC
|
|
|
104
104
|
* 平移公式引用以适配目标单元格($ 绝对引用由 shiftFormulaRefs 处理)。
|
|
105
105
|
*/
|
|
106
106
|
export declare function translateFormulaForTarget(sourceFormula: string, sourceCell: CellCoord, targetCell: CellCoord, colCount: number, rowCount: number, colToLabelFn: (col: number) => string): string;
|
|
107
|
+
/** 合并兼容性校验结果:
|
|
108
|
+
* - 'ok':兼容;
|
|
109
|
+
* - 'source-overlap':源区域与某合并格部分相交(既非完全包含也非不相交);
|
|
110
|
+
* - 'target-merge-size':目标区域命中的合并格跨距不一致(对齐 Excel「要执行此操作,所有合并单元格必须大小相同」)。
|
|
111
|
+
*/
|
|
112
|
+
export type MergeCompatibilityResult = {
|
|
113
|
+
ok: boolean;
|
|
114
|
+
reason: 'ok' | 'source-overlap' | 'target-merge-size';
|
|
115
|
+
};
|
|
107
116
|
/**
|
|
108
117
|
* 校验源/目标区域与已有合并的兼容性:
|
|
109
118
|
* - 源区域不能与任何 merge 部分相交(要么完全包含,要么不相交);
|
|
110
|
-
* -
|
|
119
|
+
* - 目标区域与「未被源完全包含」的 merge 相交时,要求这些 merge 行/列跨距全部一致。
|
|
111
120
|
*/
|
|
112
|
-
export declare function validateMergeCompatibility(sourceRange: SelectionRange, targetRange: SelectionRange, merges: Record<string, SelectionRange>):
|
|
121
|
+
export declare function validateMergeCompatibility(sourceRange: SelectionRange, targetRange: SelectionRange, merges: Record<string, SelectionRange>): MergeCompatibilityResult;
|
|
113
122
|
/**
|
|
114
123
|
* 自动填充核心:根据源/目标区域与方向生成填充增量(纯函数,不 mutate sheet)。
|
|
115
124
|
* - down/right:正向延伸;up/left:反向延伸。
|
|
@@ -13,6 +13,8 @@ export declare const SCROLL_STEP = 50;
|
|
|
13
13
|
export declare const FILL_HANDLE_SIZE = 6;
|
|
14
14
|
export declare const FILL_HANDLE_HIT_PADDING = 4;
|
|
15
15
|
export declare const UNDO_MAX = 50;
|
|
16
|
+
export declare const OUTLINE_PANEL = 16;
|
|
17
|
+
export declare const OUTLINE_GUTTER = 15;
|
|
16
18
|
export declare const i18n: Record<string, Record<string, string>>;
|
|
17
19
|
export declare function t(locale: string, key: string): string;
|
|
18
20
|
export declare const DEFAULT_FONT_FAMILY = "-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Microsoft YaHei\", sans-serif";
|