react-resize-demo 2.0.3 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +366 -0
- package/README.md +192 -117
- package/dist/core/virtualNode.js +2 -0
- package/dist/core/virtualNode.js.map +1 -0
- package/dist/esm/core/virtualNode.js +2 -0
- package/dist/esm/core/virtualNode.js.map +1 -0
- package/dist/esm/index.d.ts +7 -3
- package/dist/esm/index.js +1 -1
- package/dist/esm/strategies/basic/components/ResizeHandle/index.d.ts +25 -0
- package/dist/esm/strategies/basic/components/ResizeHandle/index.js +2 -0
- package/dist/esm/strategies/basic/components/ResizeHandle/index.js.map +1 -0
- package/dist/esm/{components → strategies/basic/components}/ResizePanel/index.d.ts +2 -1
- package/dist/esm/strategies/basic/components/ResizePanel/index.js +2 -0
- package/dist/esm/strategies/basic/components/ResizePanel/index.js.map +1 -0
- package/dist/{components → esm/strategies/basic/components}/ResizePanelGroup/index.d.ts +5 -3
- package/dist/esm/strategies/basic/components/ResizePanelGroup/index.js +2 -0
- package/dist/esm/strategies/basic/components/ResizePanelGroup/index.js.map +1 -0
- package/dist/esm/strategies/basic/context.d.ts +29 -0
- package/dist/esm/strategies/basic/context.js +2 -0
- package/dist/esm/strategies/basic/context.js.map +1 -0
- package/dist/esm/strategies/basic/resizeAble.js +2 -0
- package/dist/esm/strategies/basic/resizeAble.js.map +1 -0
- package/dist/esm/strategies/flex/components/ResizeHandleFlex/index.d.ts +25 -0
- package/dist/esm/strategies/flex/components/ResizeHandleFlex/index.js +2 -0
- package/dist/esm/strategies/flex/components/ResizeHandleFlex/index.js.map +1 -0
- package/dist/esm/strategies/flex/components/ResizePanelGroupFlex/index.d.ts +24 -0
- package/dist/esm/strategies/flex/components/ResizePanelGroupFlex/index.js +2 -0
- package/dist/esm/strategies/flex/components/ResizePanelGroupFlex/index.js.map +1 -0
- package/dist/esm/strategies/flex/resizeAble.js +2 -0
- package/dist/esm/strategies/flex/resizeAble.js.map +1 -0
- package/dist/esm/types/index.d.ts +32 -2
- package/dist/esm/types/index.js +2 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/utils/resizeHelpers.js +2 -0
- package/dist/esm/utils/resizeHelpers.js.map +1 -0
- package/dist/index.d.ts +7 -3
- package/dist/index.js +1 -1
- package/dist/strategies/basic/components/ResizeHandle/index.d.ts +25 -0
- package/dist/strategies/basic/components/ResizeHandle/index.js +2 -0
- package/dist/strategies/basic/components/ResizeHandle/index.js.map +1 -0
- package/dist/{components → strategies/basic/components}/ResizePanel/index.d.ts +2 -1
- package/dist/strategies/basic/components/ResizePanel/index.js +2 -0
- package/dist/strategies/basic/components/ResizePanel/index.js.map +1 -0
- package/dist/{esm → strategies/basic}/components/ResizePanelGroup/index.d.ts +5 -3
- package/dist/strategies/basic/components/ResizePanelGroup/index.js +2 -0
- package/dist/strategies/basic/components/ResizePanelGroup/index.js.map +1 -0
- package/dist/strategies/basic/context.d.ts +29 -0
- package/dist/strategies/basic/context.js +2 -0
- package/dist/strategies/basic/context.js.map +1 -0
- package/dist/strategies/basic/resizeAble.js +2 -0
- package/dist/strategies/basic/resizeAble.js.map +1 -0
- package/dist/strategies/flex/components/ResizeHandleFlex/index.d.ts +25 -0
- package/dist/strategies/flex/components/ResizeHandleFlex/index.js +2 -0
- package/dist/strategies/flex/components/ResizeHandleFlex/index.js.map +1 -0
- package/dist/strategies/flex/components/ResizePanelGroupFlex/index.d.ts +24 -0
- package/dist/strategies/flex/components/ResizePanelGroupFlex/index.js +2 -0
- package/dist/strategies/flex/components/ResizePanelGroupFlex/index.js.map +1 -0
- package/dist/strategies/flex/resizeAble.js +2 -0
- package/dist/strategies/flex/resizeAble.js.map +1 -0
- package/dist/types/index.d.ts +32 -2
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/resizeHelpers.js +2 -0
- package/dist/utils/resizeHelpers.js.map +1 -0
- package/package.json +165 -134
- package/dist/components/ResizeHandle/index.js +0 -2
- package/dist/components/ResizeHandle/index.js.map +0 -1
- package/dist/components/ResizePanel/index.js +0 -2
- package/dist/components/ResizePanel/index.js.map +0 -1
- package/dist/components/ResizePanelGroup/index.js +0 -2
- package/dist/components/ResizePanelGroup/index.js.map +0 -1
- package/dist/components/shared/context.js +0 -2
- package/dist/components/shared/context.js.map +0 -1
- package/dist/esm/components/ResizeHandle/index.js +0 -2
- package/dist/esm/components/ResizeHandle/index.js.map +0 -1
- package/dist/esm/components/ResizePanel/index.js +0 -2
- package/dist/esm/components/ResizePanel/index.js.map +0 -1
- package/dist/esm/components/ResizePanelGroup/index.js +0 -2
- package/dist/esm/components/ResizePanelGroup/index.js.map +0 -1
- package/dist/esm/components/shared/context.js +0 -2
- package/dist/esm/components/shared/context.js.map +0 -1
- package/dist/esm/utils/resizeAble.js +0 -2
- package/dist/esm/utils/resizeAble.js.map +0 -1
- package/dist/esm/utils/virtualNode.js +0 -2
- package/dist/esm/utils/virtualNode.js.map +0 -1
- package/dist/utils/resizeAble.js +0 -2
- package/dist/utils/resizeAble.js.map +0 -1
- package/dist/utils/virtualNode.js +0 -2
- package/dist/utils/virtualNode.js.map +0 -1
package/README.md
CHANGED
|
@@ -6,13 +6,17 @@
|
|
|
6
6
|
|
|
7
7
|
## ✨ 特性
|
|
8
8
|
|
|
9
|
+
- ✅ **多种策略**:提供 2 种 resize 策略(Basic、Flex),适应不同场景
|
|
9
10
|
- ✅ **双向布局**:支持水平和垂直方向的布局
|
|
10
11
|
- ✅ **拖拽调整**:可拖拽调整相邻面板的宽度/高度
|
|
12
|
+
- ✅ **自定义拖拽器**:支持完全自定义拖拽器的外观和交互效果
|
|
11
13
|
- ✅ **最小尺寸**:支持设置面板最小尺寸限制
|
|
12
14
|
- ✅ **级联调整**:当面板达到最小值时,自动从相邻面板获取空间
|
|
13
15
|
- ✅ **虚拟化拖拽**:支持虚拟节点模式,拖拽时创建虚拟框架,提升性能
|
|
16
|
+
- ✅ **性能优化**:RAF 优化、基于位置的计算、面板变化通知、自动冻结等多项性能优化
|
|
17
|
+
- ✅ **可配置化**:Flex 策略支持自定义计算参数,适应特殊场景
|
|
14
18
|
- ✅ **TypeScript**:完整的 TypeScript 类型支持
|
|
15
|
-
- ✅
|
|
19
|
+
- ✅ **模块化架构**:按策略分类的清晰目录结构,支持按需导入
|
|
16
20
|
- ✅ **Tree-shaking**:支持 Tree-shaking,减少打包体积
|
|
17
21
|
- ✅ **代码压缩**:自动压缩代码,优化打包体积
|
|
18
22
|
|
|
@@ -28,44 +32,53 @@ pnpm add react-resize-demo
|
|
|
28
32
|
|
|
29
33
|
## 🚀 快速开始
|
|
30
34
|
|
|
31
|
-
###
|
|
35
|
+
### 基础用法(推荐使用 Flex 策略)
|
|
32
36
|
|
|
33
37
|
```tsx
|
|
34
|
-
import {
|
|
38
|
+
import { ResizePanelGroupFlex, ResizePanelFlex } from 'react-resize-demo';
|
|
35
39
|
|
|
36
40
|
function App() {
|
|
37
41
|
return (
|
|
38
42
|
<div style={{ width: '100%', height: '500px' }}>
|
|
39
|
-
<
|
|
40
|
-
<
|
|
43
|
+
<ResizePanelGroupFlex direction="horizontal">
|
|
44
|
+
<ResizePanelFlex minSize={100}>
|
|
41
45
|
<div>Panel 1</div>
|
|
42
|
-
</
|
|
43
|
-
<
|
|
46
|
+
</ResizePanelFlex>
|
|
47
|
+
<ResizePanelFlex minSize={200}>
|
|
44
48
|
<div>Panel 2</div>
|
|
45
|
-
</
|
|
46
|
-
<
|
|
49
|
+
</ResizePanelFlex>
|
|
50
|
+
<ResizePanelFlex minSize={300}>
|
|
47
51
|
<div>Panel 3</div>
|
|
48
|
-
</
|
|
49
|
-
</
|
|
52
|
+
</ResizePanelFlex>
|
|
53
|
+
</ResizePanelGroupFlex>
|
|
50
54
|
</div>
|
|
51
55
|
);
|
|
52
56
|
}
|
|
53
57
|
```
|
|
54
58
|
|
|
59
|
+
### 其他策略
|
|
60
|
+
|
|
61
|
+
项目提供 2 种策略,可根据场景选择:
|
|
62
|
+
|
|
63
|
+
- **Basic 策略**:适合面板数量较少的简单场景
|
|
64
|
+
- **Flex 策略**:适合需要精确控制占比的场景(**推荐**)
|
|
65
|
+
|
|
66
|
+
详细对比请查看 [策略对比文档](./docs/STRATEGY_COMPARISON.md)
|
|
67
|
+
|
|
55
68
|
### 垂直布局
|
|
56
69
|
|
|
57
70
|
```tsx
|
|
58
|
-
<
|
|
59
|
-
<
|
|
71
|
+
<ResizePanelGroupFlex direction="vertical" style={{ height: '500px' }}>
|
|
72
|
+
<ResizePanelFlex minSize={100}>
|
|
60
73
|
<div>顶部面板</div>
|
|
61
|
-
</
|
|
62
|
-
<
|
|
74
|
+
</ResizePanelFlex>
|
|
75
|
+
<ResizePanelFlex minSize={200}>
|
|
63
76
|
<div>中间面板</div>
|
|
64
|
-
</
|
|
65
|
-
<
|
|
77
|
+
</ResizePanelFlex>
|
|
78
|
+
<ResizePanelFlex minSize={100}>
|
|
66
79
|
<div>底部面板</div>
|
|
67
|
-
</
|
|
68
|
-
</
|
|
80
|
+
</ResizePanelFlex>
|
|
81
|
+
</ResizePanelGroupFlex>
|
|
69
82
|
```
|
|
70
83
|
|
|
71
84
|
### 虚拟化模式
|
|
@@ -74,17 +87,17 @@ function App() {
|
|
|
74
87
|
|
|
75
88
|
```tsx
|
|
76
89
|
// 启用虚拟化(使用默认样式)
|
|
77
|
-
<
|
|
78
|
-
<
|
|
90
|
+
<ResizePanelGroupFlex virtual={true}>
|
|
91
|
+
<ResizePanelFlex minSize={100}>
|
|
79
92
|
<div>Panel 1</div>
|
|
80
|
-
</
|
|
81
|
-
<
|
|
93
|
+
</ResizePanelFlex>
|
|
94
|
+
<ResizePanelFlex minSize={200}>
|
|
82
95
|
<div>Panel 2</div>
|
|
83
|
-
</
|
|
84
|
-
</
|
|
96
|
+
</ResizePanelFlex>
|
|
97
|
+
</ResizePanelGroupFlex>
|
|
85
98
|
|
|
86
|
-
//
|
|
87
|
-
<
|
|
99
|
+
// 启用虚拟化 + 面板变化通知(推荐)
|
|
100
|
+
<ResizePanelGroupFlex
|
|
88
101
|
virtual={true}
|
|
89
102
|
virtualConfig={{
|
|
90
103
|
style: {
|
|
@@ -94,14 +107,80 @@ function App() {
|
|
|
94
107
|
},
|
|
95
108
|
className: 'custom-virtual-node'
|
|
96
109
|
}}
|
|
110
|
+
onPanelsChange={(changedIndices) => {
|
|
111
|
+
console.log('变化的面板:', Array.from(changedIndices));
|
|
112
|
+
// 只重新渲染变化的面板,提升性能
|
|
113
|
+
}}
|
|
114
|
+
>
|
|
115
|
+
<ResizePanelFlex minSize={100}>
|
|
116
|
+
<div>Panel 1</div>
|
|
117
|
+
</ResizePanelFlex>
|
|
118
|
+
<ResizePanelFlex minSize={200}>
|
|
119
|
+
<div>Panel 2</div>
|
|
120
|
+
</ResizePanelFlex>
|
|
121
|
+
</ResizePanelGroupFlex>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 自定义拖拽器
|
|
125
|
+
|
|
126
|
+
所有策略都支持通过 `renderHandle` prop 自定义拖拽器的外观和内容:
|
|
127
|
+
|
|
128
|
+
```tsx
|
|
129
|
+
<ResizePanelGroupFlex
|
|
130
|
+
renderHandle={({ prePanelIndex, nextPanelIndex, direction, isResizing }) => (
|
|
131
|
+
<div
|
|
132
|
+
className="custom-resize-handle"
|
|
133
|
+
style={{
|
|
134
|
+
width: '100%',
|
|
135
|
+
height: '100%',
|
|
136
|
+
backgroundColor: isResizing ? '#0066cc' : '#cccccc',
|
|
137
|
+
display: 'flex',
|
|
138
|
+
alignItems: 'center',
|
|
139
|
+
justifyContent: 'center',
|
|
140
|
+
transition: 'background-color 0.2s',
|
|
141
|
+
}}
|
|
142
|
+
>
|
|
143
|
+
<div style={{ fontSize: '12px', color: '#fff' }}>||</div>
|
|
144
|
+
</div>
|
|
145
|
+
)}
|
|
146
|
+
>
|
|
147
|
+
<ResizePanelFlex minSize={100}>
|
|
148
|
+
<div>Panel 1</div>
|
|
149
|
+
</ResizePanelFlex>
|
|
150
|
+
<ResizePanelFlex minSize={200}>
|
|
151
|
+
<div>Panel 2</div>
|
|
152
|
+
</ResizePanelFlex>
|
|
153
|
+
</ResizePanelGroupFlex>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**参数说明**:
|
|
157
|
+
- `prePanelIndex`: 前一个面板的索引
|
|
158
|
+
- `nextPanelIndex`: 后一个面板的索引
|
|
159
|
+
- `direction`: 布局方向('horizontal' | 'vertical')
|
|
160
|
+
- `isResizing`: 是否正在拖拽(可用于动态改变样式)
|
|
161
|
+
|
|
162
|
+
### 高级配置(Flex 策略)
|
|
163
|
+
|
|
164
|
+
对于 Flex 策略,你可以通过 `flexConfig` 自定义计算参数,以适应特殊场景:
|
|
165
|
+
|
|
166
|
+
```tsx
|
|
167
|
+
<ResizePanelGroupFlex
|
|
168
|
+
flexConfig={{
|
|
169
|
+
minDeltaThreshold: 0.2, // 自定义最小拖拽变化阈值
|
|
170
|
+
sizeChangeThreshold: 0.15, // 自定义尺寸变化阈值
|
|
171
|
+
growChangeThreshold: 0.0002, // 自定义 grow 值变化阈值
|
|
172
|
+
growNormalizeBase: 200, // 自定义归一化基数
|
|
173
|
+
growPrecisionMultiplier: 2000, // 自定义精度倍数
|
|
174
|
+
flexGrowPrecisionMultiplier: 200, // 自定义 flex-grow 精度
|
|
175
|
+
}}
|
|
97
176
|
>
|
|
98
|
-
<
|
|
177
|
+
<ResizePanelFlex minSize={100}>
|
|
99
178
|
<div>Panel 1</div>
|
|
100
|
-
</
|
|
101
|
-
<
|
|
179
|
+
</ResizePanelFlex>
|
|
180
|
+
<ResizePanelFlex minSize={200}>
|
|
102
181
|
<div>Panel 2</div>
|
|
103
|
-
</
|
|
104
|
-
</
|
|
182
|
+
</ResizePanelFlex>
|
|
183
|
+
</ResizePanelGroupFlex>
|
|
105
184
|
```
|
|
106
185
|
|
|
107
186
|
### 按需导入
|
|
@@ -110,17 +189,13 @@ function App() {
|
|
|
110
189
|
|
|
111
190
|
```tsx
|
|
112
191
|
// 从主入口导入(推荐)
|
|
113
|
-
import {
|
|
192
|
+
import { ResizePanelGroupFlex, ResizePanelFlex } from 'react-resize-demo';
|
|
114
193
|
|
|
115
194
|
// 按需导入组件
|
|
116
|
-
import {
|
|
117
|
-
import { ResizablePanel } from 'react-resize-demo/components/ResizePanel';
|
|
118
|
-
|
|
119
|
-
// 导入工具函数
|
|
120
|
-
import { ResizeAbleCore } from 'react-resize-demo/utils';
|
|
195
|
+
import { ResizePanelGroupFlex } from 'react-resize-demo/components';
|
|
121
196
|
|
|
122
197
|
// 导入类型
|
|
123
|
-
import type { VirtualConfig, ResizeDirection } from 'react-resize-demo/types';
|
|
198
|
+
import type { VirtualConfig, ResizeDirection, FlexStrategyConfig } from 'react-resize-demo/types';
|
|
124
199
|
```
|
|
125
200
|
|
|
126
201
|
## 🎮 运行 Demo
|
|
@@ -161,9 +236,9 @@ npm run demo
|
|
|
161
236
|
|
|
162
237
|
## 📖 API 文档
|
|
163
238
|
|
|
164
|
-
###
|
|
239
|
+
### ResizePanelGroupFlex(推荐)
|
|
165
240
|
|
|
166
|
-
面板组容器组件,用于包裹多个 `
|
|
241
|
+
面板组容器组件,用于包裹多个 `ResizePanelFlex`。
|
|
167
242
|
|
|
168
243
|
| 属性 | 类型 | 默认值 | 说明 |
|
|
169
244
|
|------|------|--------|------|
|
|
@@ -171,7 +246,10 @@ npm run demo
|
|
|
171
246
|
| virtual | `boolean` | `false` | 是否启用虚拟化模式 |
|
|
172
247
|
| virtualConfig | `VirtualConfig` | `{}` | 虚拟化配置(仅在 virtual=true 时生效) |
|
|
173
248
|
| style | `React.CSSProperties` | - | 自定义样式 |
|
|
174
|
-
|
|
|
249
|
+
| onPanelsChange | `(changedIndices: Set<number>) => void` | - | 面板变化回调,用于性能优化 |
|
|
250
|
+
| flexConfig | `FlexStrategyConfig` | - | Flex 策略配置(高级用法) |
|
|
251
|
+
| renderHandle | `(props: ResizeHandleRenderProps) => React.ReactNode` | - | 自定义拖拽器渲染函数 |
|
|
252
|
+
| children | `React.ReactNode` | - | 子元素(通常是多个 ResizePanelFlexLinked) |
|
|
175
253
|
|
|
176
254
|
#### VirtualConfig
|
|
177
255
|
|
|
@@ -183,66 +261,44 @@ npm run demo
|
|
|
183
261
|
| style | `React.CSSProperties` | - | 虚拟节点的自定义样式 |
|
|
184
262
|
| className | `string` | - | 虚拟节点的自定义类名 |
|
|
185
263
|
|
|
186
|
-
|
|
264
|
+
#### ResizeHandleRenderProps(自定义拖拽器参数)
|
|
265
|
+
|
|
266
|
+
自定义拖拽器渲染函数的参数类型:
|
|
267
|
+
|
|
268
|
+
| 属性 | 类型 | 说明 |
|
|
269
|
+
|------|------|------|
|
|
270
|
+
| prePanelIndex | `number` | 前一个面板的索引 |
|
|
271
|
+
| nextPanelIndex | `number` | 后一个面板的索引 |
|
|
272
|
+
| direction | `'horizontal' \| 'vertical'` | 布局方向 |
|
|
273
|
+
| isResizing | `boolean` | 是否正在拖拽(可用于动态改变样式) |
|
|
274
|
+
|
|
275
|
+
#### FlexStrategyConfig(高级配置)
|
|
276
|
+
|
|
277
|
+
Flex 策略的计算参数配置,用于精细调整计算行为:
|
|
278
|
+
|
|
279
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
280
|
+
|------|------|--------|------|
|
|
281
|
+
| minDeltaThreshold | `number` | `0.1` | 最小拖拽变化阈值(像素),小于此值的变化将被忽略 |
|
|
282
|
+
| sizeChangeThreshold | `number` | `0.1` | 尺寸变化误差阈值(像素),用于判断面板尺寸是否发生变化 |
|
|
283
|
+
| growChangeThreshold | `number` | `0.0001` | flex-grow 值变化阈值,用于判断 grow 值是否发生变化 |
|
|
284
|
+
| growNormalizeBase | `number` | `100` | grow 值归一化基数,用于计算初始 grow 值 |
|
|
285
|
+
| growPrecisionMultiplier | `number` | `1000` | grow 值精度倍数,用于保留小数位数(1000 表示保留3位小数) |
|
|
286
|
+
| flexGrowPrecisionMultiplier | `number` | `100` | flex-grow 精度倍数,用于设置 flex-grow 时的精度(100 表示保留2位小数) |
|
|
287
|
+
|
|
288
|
+
### ResizePanelFlex
|
|
187
289
|
|
|
188
290
|
可调整大小的面板组件。
|
|
189
291
|
|
|
190
292
|
| 属性 | 类型 | 默认值 | 说明 |
|
|
191
293
|
|------|------|--------|------|
|
|
192
294
|
| minSize | `number` | `100` | 面板最小尺寸(像素) |
|
|
193
|
-
| onResize | `(width: number) => void` | - | 面板尺寸变化时的回调函数 |
|
|
194
295
|
| children | `React.ReactNode` | - | 面板内容 |
|
|
195
296
|
|
|
196
|
-
### Context & Hooks
|
|
197
|
-
|
|
198
|
-
```tsx
|
|
199
|
-
import { ResizableContext, useResizableContext } from 'react-resize-demo';
|
|
200
|
-
|
|
201
|
-
// 在组件内部使用
|
|
202
|
-
const {
|
|
203
|
-
panelCount,
|
|
204
|
-
registerPanel,
|
|
205
|
-
unregisterPanel,
|
|
206
|
-
getPanelInfo,
|
|
207
|
-
direction,
|
|
208
|
-
virtualConfig
|
|
209
|
-
} = useResizableContext();
|
|
210
|
-
```
|
|
211
|
-
|
|
212
297
|
## 🏗️ 项目结构
|
|
213
298
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
│ ├── components/ # 组件目录
|
|
218
|
-
│ │ ├── ResizePanelGroup/ # 容器组件
|
|
219
|
-
│ │ │ └── index.tsx
|
|
220
|
-
│ │ ├── ResizePanel/ # 面板组件
|
|
221
|
-
│ │ │ └── index.tsx
|
|
222
|
-
│ │ ├── ResizeHandle/ # 拖拽手柄组件
|
|
223
|
-
│ │ │ └── index.tsx
|
|
224
|
-
│ │ ├── shared/ # 共享资源
|
|
225
|
-
│ │ │ └── context.tsx # Context 定义
|
|
226
|
-
│ │ └── index.tsx # 组件统一导出
|
|
227
|
-
│ ├── utils/ # 工具函数
|
|
228
|
-
│ │ ├── resizeAble.ts # 拖拽调整核心类
|
|
229
|
-
│ │ ├── virtualNode.ts # 虚拟节点管理模块
|
|
230
|
-
│ │ └── index.ts # 工具函数导出
|
|
231
|
-
│ ├── types/ # 类型定义
|
|
232
|
-
│ │ └── index.ts # 所有类型定义
|
|
233
|
-
│ └── index.ts # 主入口文件
|
|
234
|
-
├── demo/ # 本地测试Demo
|
|
235
|
-
│ ├── App.tsx # Demo应用
|
|
236
|
-
│ └── ...
|
|
237
|
-
├── dist/ # 构建输出目录
|
|
238
|
-
│ ├── index.js # CJS 主入口
|
|
239
|
-
│ ├── esm/ # ESM 模块
|
|
240
|
-
│ ├── components/ # CJS 组件
|
|
241
|
-
│ ├── utils/ # CJS 工具
|
|
242
|
-
│ └── types/ # 类型定义
|
|
243
|
-
├── rollup.config.mjs # Rollup构建配置
|
|
244
|
-
└── package.json # 项目配置
|
|
245
|
-
```
|
|
299
|
+
项目采用模块化架构,按策略分类组织代码,支持按需导入和 Tree-shaking。核心功能包括面板管理、虚拟节点管理、节流优化等工具模块,所有策略共享这些核心工具。
|
|
300
|
+
|
|
301
|
+
详细的项目结构说明请查看 [PROJECT_STRUCTURE.md](./PROJECT_STRUCTURE.md)
|
|
246
302
|
|
|
247
303
|
## 🔧 开发
|
|
248
304
|
|
|
@@ -294,55 +350,74 @@ npm run build:watch
|
|
|
294
350
|
|
|
295
351
|
## 💡 工作原理
|
|
296
352
|
|
|
297
|
-
|
|
298
|
-
- **向右拖拽**:扩大左侧面板,缩小右侧面板(如果右侧面板达到最小值,继续从后续面板获取空间)
|
|
299
|
-
- **向左拖拽**:缩小左侧面板,扩大右侧面板(如果左侧面板达到最小值,继续从前面面板获取空间)
|
|
300
|
-
|
|
301
|
-
拖拽器会自动插入到相邻面板之间,无需手动添加。
|
|
353
|
+
组件通过拖拽器来调整相邻面板的尺寸。拖拽器会自动插入到相邻面板之间,无需手动添加。
|
|
302
354
|
|
|
303
|
-
|
|
355
|
+
**拖拽行为**:
|
|
356
|
+
- **向右拖拽**:扩大左侧面板,缩小右侧面板。如果右侧面板达到最小值,会自动从后续面板获取空间(级联调整)
|
|
357
|
+
- **向左拖拽**:缩小左侧面板,扩大右侧面板。如果左侧面板达到最小值,会自动从前面面板获取空间(级联调整)
|
|
304
358
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
2. **拖拽中**:只更新虚拟节点的尺寸和位置,真实节点保持不变
|
|
308
|
-
3. **拖拽结束**:将虚拟节点的最终尺寸应用到真实节点,然后清理所有虚拟节点
|
|
359
|
+
**虚拟化模式**:
|
|
360
|
+
当启用虚拟化模式时,拖拽过程中会创建虚拟节点框架来显示调整效果,真实节点保持不变。拖拽结束后再将最终尺寸应用到真实节点。这种方式可以显著提升性能,特别是在处理复杂内容的面板时。
|
|
309
361
|
|
|
310
|
-
|
|
311
|
-
-
|
|
312
|
-
-
|
|
313
|
-
-
|
|
362
|
+
**性能优化机制**:
|
|
363
|
+
- 使用 `requestAnimationFrame` 与浏览器渲染同步,每帧计算一次
|
|
364
|
+
- 基于初始状态计算,避免累积误差
|
|
365
|
+
- 只更新变化的面板,未变化的面板自动冻结
|
|
366
|
+
- 支持面板变化通知,只重新渲染变化的面板
|
|
314
367
|
|
|
315
368
|
## 🔄 迁移指南
|
|
316
369
|
|
|
317
|
-
### 从
|
|
370
|
+
### 从 2.x 升级到 3.0
|
|
318
371
|
|
|
319
|
-
|
|
372
|
+
3.0 版本引入了策略分类架构,推荐使用 Flex 策略:
|
|
320
373
|
|
|
321
374
|
```tsx
|
|
322
|
-
//
|
|
323
|
-
import {
|
|
375
|
+
// 2.x 版本(仍然可用,向后兼容)
|
|
376
|
+
import { ResizePanelGroup, ResizePanel } from 'react-resize-demo';
|
|
324
377
|
|
|
325
|
-
//
|
|
326
|
-
import {
|
|
378
|
+
// 3.0 版本(推荐)
|
|
379
|
+
import { ResizePanelGroupFlex, ResizePanelFlex } from 'react-resize-demo';
|
|
327
380
|
```
|
|
328
381
|
|
|
329
382
|
### 新功能
|
|
330
383
|
|
|
331
|
-
|
|
384
|
+
3.0 版本新增了多种策略和性能优化:
|
|
332
385
|
|
|
333
386
|
```tsx
|
|
334
|
-
//
|
|
335
|
-
import {
|
|
336
|
-
|
|
387
|
+
// 使用 Flex 策略(推荐,性能最佳)
|
|
388
|
+
import { ResizePanelGroupFlex, ResizePanelFlex } from 'react-resize-demo';
|
|
389
|
+
|
|
390
|
+
// 启用面板变化通知(性能优化)
|
|
391
|
+
<ResizePanelGroupFlex
|
|
392
|
+
onPanelsChange={(changedIndices) => {
|
|
393
|
+
// 只重新渲染变化的面板
|
|
394
|
+
}}
|
|
395
|
+
>
|
|
396
|
+
{/* ... */}
|
|
397
|
+
</ResizePanelGroupFlex>
|
|
337
398
|
```
|
|
338
399
|
|
|
400
|
+
详细迁移指南请查看 [策略对比文档](./docs/STRATEGY_COMPARISON.md)
|
|
401
|
+
|
|
339
402
|
## 📝 版本历史
|
|
340
403
|
|
|
341
404
|
查看 [CHANGELOG.md](./CHANGELOG.md) 了解详细的版本变更历史。
|
|
342
405
|
|
|
343
406
|
## ⚡ 性能优化
|
|
344
407
|
|
|
345
|
-
|
|
408
|
+
项目经过多轮性能优化,从初始版本的 30-40 FPS 提升到当前的 50-55 FPS:
|
|
409
|
+
|
|
410
|
+
- **RAF 优化**:与浏览器渲染同步,每帧计算一次,减少 DOM 操作 50-70%,降低 CPU 占用 30-50%
|
|
411
|
+
- **基于位置的计算**:一次性计算所有面板位置,解决快速拖拽时的位置偏移问题
|
|
412
|
+
- **虚拟化拖拽**:拖拽过程中不操作真实 DOM,减少重排和重绘
|
|
413
|
+
- **面板变化通知**:只重新渲染变化的面板,减少 React 渲染 70%
|
|
414
|
+
- **自动冻结**:自动冻结未变化面板,减少布局计算 85%
|
|
415
|
+
|
|
416
|
+
详细优化时间线和性能对比请查看:
|
|
417
|
+
- [性能优化时间线](./docs/PERFORMANCE_TIMELINE.md)
|
|
418
|
+
- [构建优化文档](./OPTIMIZATION.md)
|
|
419
|
+
- [节流优化文档](./docs/THROTTLE_OPTIMIZATION.md)
|
|
420
|
+
- [面板变化通知文档](./docs/PANEL_CHANGE_NOTIFICATION.md)
|
|
346
421
|
|
|
347
422
|
## 📄 License
|
|
348
423
|
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=class{constructor(){Object.defineProperty(this,"virtualNodes",{enumerable:!0,configurable:!0,writable:!0,value:new Map})}createVirtualNode(t,e={},i="horizontal"){if(!t||!t.parentElement)return null;this.virtualNodes.has(t)&&this.removeVirtualNode(t);const a=window.getComputedStyle(t),o=t.style.flex||a.flex||"1",l=t.getBoundingClientRect(),s=t.parentElement.getBoundingClientRect(),n=l.top-s.top+(t.parentElement.scrollTop||0),r=l.left-s.left+(t.parentElement.scrollLeft||0),d=t.cloneNode(!1);d.style.cssText=`\n flex: ${o};\n margin: ${a.margin};\n padding: ${a.padding};\n border: ${a.border};\n box-sizing: ${a.boxSizing};\n pointer-events: none;\n z-index: 10000;\n opacity: 0.8;\n background-color: ${a.backgroundColor||"rgba(0, 123, 255, 0.1)"};\n overflow: hidden;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.3);\n min-width: ${a.minWidth};\n min-height: ${a.minHeight};\n width: ${a.width};\n height: ${a.height};\n `,e.style&&Object.assign(d.style,e.style),e.className&&(d.className=e.className);const p=t.style.opacity,g=t.style.position,u=t.style.zIndex,y=t.style.top,h=t.style.left,c=t.style.display,f="horizontal"===i?t.offsetWidth:t.offsetHeight;return t.dataset.startSize=String(f),t.style.position="absolute",t.style.top=`${n}px`,t.style.left=`${r}px`,t.style.opacity=p||"0.3",t.style.zIndex="1",t.style.pointerEvents="none",t.dataset.originalOpacity=p||"",t.dataset.originalPosition=g||"",t.dataset.originalZIndex=u||"",t.dataset.originalTop=y||"",t.dataset.originalLeft=h||"",t.dataset.originalDisplay=c||"",t.parentElement.insertBefore(d,t),this.virtualNodes.set(t,d),d}updateVirtualNode(t,e,i){const a=this.virtualNodes.get(t);if(!a)return;const o="horizontal"===i?"width":"height";a.style[o]=`${e}px`}updateVirtualNodePosition(t,e,i){const a=this.virtualNodes.get(t);if(!a)return;const o="horizontal"===i?"left":"top";a.style[o]=`${e}px`}updateVirtualNodeFlexGrow(t,e,i){const a=this.virtualNodes.get(t);if(!a)return;const o=Math.max(0,Math.round(100*e)/100);a.style.flex=`${o} 1 0`}removeVirtualNode(t){const e=this.virtualNodes.get(t);e&&(void 0!==t.dataset.originalOpacity&&(t.style.opacity=t.dataset.originalOpacity,delete t.dataset.originalOpacity),void 0!==t.dataset.originalPosition&&(t.style.position=t.dataset.originalPosition,delete t.dataset.originalPosition),void 0!==t.dataset.originalZIndex&&(t.style.zIndex=t.dataset.originalZIndex,delete t.dataset.originalZIndex),void 0!==t.dataset.originalTop&&(t.style.top=t.dataset.originalTop,delete t.dataset.originalTop),void 0!==t.dataset.originalLeft&&(t.style.left=t.dataset.originalLeft,delete t.dataset.originalLeft),void 0!==t.dataset.originalDisplay&&(t.style.display=t.dataset.originalDisplay,delete t.dataset.originalDisplay),void 0!==t.dataset.startSize&&delete t.dataset.startSize,t.style.pointerEvents="",e.parentElement&&e.parentElement.removeChild(e),this.virtualNodes.delete(t))}applyToRealNode(t,e,i){const a="horizontal"===i?"width":"height";t.style[a]=`${e}px`}removeAllVirtualNodes(){Array.from(this.virtualNodes.keys()).forEach(t=>{this.removeVirtualNode(t)}),this.virtualNodes.clear()}hasVirtualNode(t){return this.virtualNodes.has(t)}getVirtualNode(t){return this.virtualNodes.get(t)||null}destroy(){this.removeAllVirtualNodes()}};
|
|
2
|
+
//# sourceMappingURL=virtualNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtualNode.js","sources":["../../src/core/virtualNode.ts"],"sourcesContent":[null],"names":["constructor","Object","defineProperty","this","value","Map","createVirtualNode","originalEl","config","direction","parentElement","virtualNodes","has","removeVirtualNode","computedStyle","window","getComputedStyle","originalFlex","style","flex","rect","getBoundingClientRect","parentRect","top","scrollTop","left","scrollLeft","virtualEl","cloneNode","cssText","margin","padding","border","boxSizing","backgroundColor","minWidth","minHeight","width","height","assign","className","originalOpacity","opacity","originalPosition","position","originalZIndex","zIndex","originalTop","originalLeft","originalDisplay","display","startSize","offsetWidth","offsetHeight","dataset","String","pointerEvents","insertBefore","set","updateVirtualNode","size","get","sizeProperty","updateVirtualNodePosition","newPosition","positionProperty","updateVirtualNodeFlexGrow","grow","_direction","roundedGrow","Math","max","round","undefined","removeChild","delete","applyToRealNode","finalSize","removeAllVirtualNodes","Array","from","keys","forEach","clear","hasVirtualNode","getVirtualNode","destroy"],"mappings":"oFAOA,MAAA,WAAAA,GACYC,OAAAC,eAAAC,KAAA,eAAA,2CAA8CC,MAAA,IAAIC,KA+O9D,CAvOI,iBAAAC,CAAkBC,EAAyBC,EAA4B,CAAA,EAAIC,EAA6B,cACpG,IAAKF,IAAeA,EAAWG,cAC3B,OAAO,KAIPP,KAAKQ,aAAaC,IAAIL,IACtBJ,KAAKU,kBAAkBN,GAI3B,MAAMO,EAAgBC,OAAOC,iBAAiBT,GACxCU,EAAeV,EAAWW,MAAMC,MAAQL,EAAcK,MAAQ,IAC9DC,EAAOb,EAAWc,wBAClBC,EAAaf,EAAWG,cAAcW,wBAGtCE,EAAMH,EAAKG,IAAMD,EAAWC,KAAOhB,EAAWG,cAAcc,WAAa,GACzEC,EAAOL,EAAKK,KAAOH,EAAWG,MAAQlB,EAAWG,cAAcgB,YAAc,GAG7EC,EAAYpB,EAAWqB,WAAU,GAGvCD,EAAUT,MAAMW,QAAU,uBACdZ,2BACEH,EAAcgB,iCACbhB,EAAciB,iCACfjB,EAAckB,oCACVlB,EAAcmB,wIAIRnB,EAAcoB,iBAAmB,+IAGxCpB,EAAcqB,sCACbrB,EAAcsB,kCACnBtB,EAAcuB,+BACbvB,EAAcwB,oBAIxB9B,EAAOU,OACPjB,OAAOsC,OAAOZ,EAAUT,MAAOV,EAAOU,OAItCV,EAAOgC,YACPb,EAAUa,UAAYhC,EAAOgC,WAKjC,MAAMC,EAAkBlC,EAAWW,MAAMwB,QACnCC,EAAmBpC,EAAWW,MAAM0B,SACpCC,EAAiBtC,EAAWW,MAAM4B,OAClCC,EAAcxC,EAAWW,MAAMK,IAC/ByB,EAAezC,EAAWW,MAAMO,KAChCwB,EAAkB1C,EAAWW,MAAMgC,QAGnCC,EAA0B,eAAd1C,EAA6BF,EAAW6C,YAAc7C,EAAW8C,aA0BnF,OAzBA9C,EAAW+C,QAAQH,UAAYI,OAAOJ,GAItC5C,EAAWW,MAAM0B,SAAW,WAC5BrC,EAAWW,MAAMK,IAAM,GAAGA,MAC1BhB,EAAWW,MAAMO,KAAO,GAAGA,MAC3BlB,EAAWW,MAAMwB,QAAUD,GAAmB,MAC9ClC,EAAWW,MAAM4B,OAAS,IAC1BvC,EAAWW,MAAMsC,cAAgB,OAGjCjD,EAAW+C,QAAQb,gBAAkBA,GAAmB,GACxDlC,EAAW+C,QAAQX,iBAAmBA,GAAoB,GAC1DpC,EAAW+C,QAAQT,eAAiBA,GAAkB,GACtDtC,EAAW+C,QAAQP,YAAcA,GAAe,GAChDxC,EAAW+C,QAAQN,aAAeA,GAAgB,GAClDzC,EAAW+C,QAAQL,gBAAkBA,GAAmB,GAGxD1C,EAAWG,cAAc+C,aAAa9B,EAAWpB,GAGjDJ,KAAKQ,aAAa+C,IAAInD,EAAYoB,GAE3BA,CACX,CAQA,iBAAAgC,CAAkBpD,EAAyBqD,EAAcnD,GACrD,MAAMkB,EAAYxB,KAAKQ,aAAakD,IAAItD,GACxC,IAAKoB,EAAW,OAEhB,MAAMmC,EAA6B,eAAdrD,EAA6B,QAAU,SAC5DkB,EAAUT,MAAM4C,GAAgB,GAAGF,KACvC,CAQA,yBAAAG,CAA0BxD,EAAyByD,EAAqBvD,GACpE,MAAMkB,EAAYxB,KAAKQ,aAAakD,IAAItD,GACxC,IAAKoB,EAAW,OAEhB,MAAMsC,EAAiC,eAAdxD,EAA6B,OAAS,MAC/DkB,EAAUT,MAAM+C,GAAoB,GAAGD,KAC3C,CASA,yBAAAE,CAA0B3D,EAAyB4D,EAAcC,GAC7D,MAAMzC,EAAYxB,KAAKQ,aAAakD,IAAItD,GACxC,IAAKoB,EAAW,OAGhB,MAAM0C,EAAcC,KAAKC,IAAI,EAAGD,KAAKE,MAAa,IAAPL,GAAc,KAIzDxC,EAAUT,MAAMC,KAAO,GAAGkD,OAC9B,CAMA,iBAAAxD,CAAkBN,GACd,MAAMoB,EAAYxB,KAAKQ,aAAakD,IAAItD,GACnCoB,SAGsC8C,IAAvClE,EAAW+C,QAAQb,kBACnBlC,EAAWW,MAAMwB,QAAUnC,EAAW+C,QAAQb,uBACvClC,EAAW+C,QAAQb,sBAEcgC,IAAxClE,EAAW+C,QAAQX,mBACnBpC,EAAWW,MAAM0B,SAAWrC,EAAW+C,QAAQX,wBACxCpC,EAAW+C,QAAQX,uBAEY8B,IAAtClE,EAAW+C,QAAQT,iBACnBtC,EAAWW,MAAM4B,OAASvC,EAAW+C,QAAQT,sBACtCtC,EAAW+C,QAAQT,qBAES4B,IAAnClE,EAAW+C,QAAQP,cACnBxC,EAAWW,MAAMK,IAAMhB,EAAW+C,QAAQP,mBACnCxC,EAAW+C,QAAQP,kBAEU0B,IAApClE,EAAW+C,QAAQN,eACnBzC,EAAWW,MAAMO,KAAOlB,EAAW+C,QAAQN,oBACpCzC,EAAW+C,QAAQN,mBAEayB,IAAvClE,EAAW+C,QAAQL,kBACnB1C,EAAWW,MAAMgC,QAAU3C,EAAW+C,QAAQL,uBACvC1C,EAAW+C,QAAQL,sBAEOwB,IAAjClE,EAAW+C,QAAQH,kBACZ5C,EAAW+C,QAAQH,UAE9B5C,EAAWW,MAAMsC,cAAgB,GAG7B7B,EAAUjB,eACViB,EAAUjB,cAAcgE,YAAY/C,GAIxCxB,KAAKQ,aAAagE,OAAOpE,GAC7B,CAQA,eAAAqE,CAAgBrE,EAAyBsE,EAAmBpE,GACxD,MAAMqD,EAA6B,eAAdrD,EAA6B,QAAU,SAC5DF,EAAWW,MAAM4C,GAAgB,GAAGe,KACxC,CAKA,qBAAAC,GAC0BC,MAAMC,KAAK7E,KAAKQ,aAAasE,QACrCC,QAAQ3E,IAClBJ,KAAKU,kBAAkBN,KAE3BJ,KAAKQ,aAAawE,OACtB,CAOA,cAAAC,CAAe7E,GACX,OAAOJ,KAAKQ,aAAaC,IAAIL,EACjC,CAOA,cAAA8E,CAAe9E,GACX,OAAOJ,KAAKQ,aAAakD,IAAItD,IAAe,IAChD,CAKA,OAAA+E,GACInF,KAAK2E,uBACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
class t{constructor(){Object.defineProperty(this,"virtualNodes",{enumerable:!0,configurable:!0,writable:!0,value:new Map})}createVirtualNode(t,e={},i="horizontal"){if(!t||!t.parentElement)return null;this.virtualNodes.has(t)&&this.removeVirtualNode(t);const a=window.getComputedStyle(t),o=t.style.flex||a.flex||"1",l=t.getBoundingClientRect(),s=t.parentElement.getBoundingClientRect(),n=l.top-s.top+(t.parentElement.scrollTop||0),r=l.left-s.left+(t.parentElement.scrollLeft||0),d=t.cloneNode(!1);d.style.cssText=`\n flex: ${o};\n margin: ${a.margin};\n padding: ${a.padding};\n border: ${a.border};\n box-sizing: ${a.boxSizing};\n pointer-events: none;\n z-index: 10000;\n opacity: 0.8;\n background-color: ${a.backgroundColor||"rgba(0, 123, 255, 0.1)"};\n overflow: hidden;\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.3);\n min-width: ${a.minWidth};\n min-height: ${a.minHeight};\n width: ${a.width};\n height: ${a.height};\n `,e.style&&Object.assign(d.style,e.style),e.className&&(d.className=e.className);const g=t.style.opacity,p=t.style.position,h=t.style.zIndex,y=t.style.top,u=t.style.left,c=t.style.display,f="horizontal"===i?t.offsetWidth:t.offsetHeight;return t.dataset.startSize=String(f),t.style.position="absolute",t.style.top=`${n}px`,t.style.left=`${r}px`,t.style.opacity=g||"0.3",t.style.zIndex="1",t.style.pointerEvents="none",t.dataset.originalOpacity=g||"",t.dataset.originalPosition=p||"",t.dataset.originalZIndex=h||"",t.dataset.originalTop=y||"",t.dataset.originalLeft=u||"",t.dataset.originalDisplay=c||"",t.parentElement.insertBefore(d,t),this.virtualNodes.set(t,d),d}updateVirtualNode(t,e,i){const a=this.virtualNodes.get(t);if(!a)return;const o="horizontal"===i?"width":"height";a.style[o]=`${e}px`}updateVirtualNodePosition(t,e,i){const a=this.virtualNodes.get(t);if(!a)return;const o="horizontal"===i?"left":"top";a.style[o]=`${e}px`}updateVirtualNodeFlexGrow(t,e,i){const a=this.virtualNodes.get(t);if(!a)return;const o=Math.max(0,Math.round(100*e)/100);a.style.flex=`${o} 1 0`}removeVirtualNode(t){const e=this.virtualNodes.get(t);e&&(void 0!==t.dataset.originalOpacity&&(t.style.opacity=t.dataset.originalOpacity,delete t.dataset.originalOpacity),void 0!==t.dataset.originalPosition&&(t.style.position=t.dataset.originalPosition,delete t.dataset.originalPosition),void 0!==t.dataset.originalZIndex&&(t.style.zIndex=t.dataset.originalZIndex,delete t.dataset.originalZIndex),void 0!==t.dataset.originalTop&&(t.style.top=t.dataset.originalTop,delete t.dataset.originalTop),void 0!==t.dataset.originalLeft&&(t.style.left=t.dataset.originalLeft,delete t.dataset.originalLeft),void 0!==t.dataset.originalDisplay&&(t.style.display=t.dataset.originalDisplay,delete t.dataset.originalDisplay),void 0!==t.dataset.startSize&&delete t.dataset.startSize,t.style.pointerEvents="",e.parentElement&&e.parentElement.removeChild(e),this.virtualNodes.delete(t))}applyToRealNode(t,e,i){const a="horizontal"===i?"width":"height";t.style[a]=`${e}px`}removeAllVirtualNodes(){Array.from(this.virtualNodes.keys()).forEach(t=>{this.removeVirtualNode(t)}),this.virtualNodes.clear()}hasVirtualNode(t){return this.virtualNodes.has(t)}getVirtualNode(t){return this.virtualNodes.get(t)||null}destroy(){this.removeAllVirtualNodes()}}export{t as default};
|
|
2
|
+
//# sourceMappingURL=virtualNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtualNode.js","sources":["../../../src/core/virtualNode.ts"],"sourcesContent":[null],"names":["VirtualNodeManager","constructor","Object","defineProperty","this","value","Map","createVirtualNode","originalEl","config","direction","parentElement","virtualNodes","has","removeVirtualNode","computedStyle","window","getComputedStyle","originalFlex","style","flex","rect","getBoundingClientRect","parentRect","top","scrollTop","left","scrollLeft","virtualEl","cloneNode","cssText","margin","padding","border","boxSizing","backgroundColor","minWidth","minHeight","width","height","assign","className","originalOpacity","opacity","originalPosition","position","originalZIndex","zIndex","originalTop","originalLeft","originalDisplay","display","startSize","offsetWidth","offsetHeight","dataset","String","pointerEvents","insertBefore","set","updateVirtualNode","size","get","sizeProperty","updateVirtualNodePosition","newPosition","positionProperty","updateVirtualNodeFlexGrow","grow","_direction","roundedGrow","Math","max","round","undefined","removeChild","delete","applyToRealNode","finalSize","removeAllVirtualNodes","Array","from","keys","forEach","clear","hasVirtualNode","getVirtualNode","destroy"],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
export { ResizePanelGroup as ResizablePanelGroup, ResizePanelGroup as ResizeablePanelGroup } from './components/ResizePanelGroup/index.js';
|
|
2
|
-
export { ResizePanel as ResizablePanel, ResizePanel as ResizeablePanel } from './components/ResizePanel/index.js';
|
|
3
|
-
export {
|
|
1
|
+
export { ResizePanelGroup as ResizablePanelGroup, ResizePanelGroup, ResizePanelGroupProps, ResizePanelGroup as ResizeablePanelGroup } from './strategies/basic/components/ResizePanelGroup/index.js';
|
|
2
|
+
export { ResizePanel as ResizablePanel, ResizePanel, ResizePanelProps, ResizePanel as ResizeablePanel } from './strategies/basic/components/ResizePanel/index.js';
|
|
3
|
+
export { ResizeHandle, ResizeHandleProps } from './strategies/basic/components/ResizeHandle/index.js';
|
|
4
|
+
export { ResizableContext, ResizableContextValue, useResizableContext } from './strategies/basic/context.js';
|
|
5
|
+
export { ResizePanelGroupFlex, ResizePanelGroupFlexProps } from './strategies/flex/components/ResizePanelGroupFlex/index.js';
|
|
6
|
+
export { ResizeHandleFlex, ResizeHandleFlexProps } from './strategies/flex/components/ResizeHandleFlex/index.js';
|
|
7
|
+
export { OptimizationStrategy, PanelInfo, ResizeAbleCoreOptions, ResizeDirection, VirtualConfig, VirtualNodeConfig } from './types/index.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{ResizePanelGroup as ResizablePanelGroup,ResizePanelGroup as ResizeablePanelGroup}from"./components/ResizePanelGroup/index.js";export{ResizePanel as ResizablePanel,ResizePanel as ResizeablePanel}from"./components/ResizePanel/index.js";
|
|
1
|
+
export{ResizePanelGroup as ResizablePanelGroup,ResizePanelGroup,ResizePanelGroup as ResizeablePanelGroup}from"./strategies/basic/components/ResizePanelGroup/index.js";export{ResizePanel as ResizablePanel,ResizePanel,ResizePanel as ResizeablePanel}from"./strategies/basic/components/ResizePanel/index.js";export{ResizeHandle}from"./strategies/basic/components/ResizeHandle/index.js";export{ResizePanelGroupFlex}from"./strategies/flex/components/ResizePanelGroupFlex/index.js";export{ResizeHandleFlex}from"./strategies/flex/components/ResizeHandleFlex/index.js";export{ResizableContext,useResizableContext}from"./strategies/basic/context.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ResizeDirection } from '../../../../types/index.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 拖拽手柄组件(常规策略)
|
|
6
|
+
* 负责处理面板之间的拖拽调整功能
|
|
7
|
+
* 使用 ResizeAbleCore(常规策略)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
interface ResizeHandleRenderProps {
|
|
11
|
+
prePanelIndex: number;
|
|
12
|
+
nextPanelIndex: number;
|
|
13
|
+
direction: ResizeDirection;
|
|
14
|
+
isResizing?: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface ResizeHandleProps {
|
|
17
|
+
prePanelIndex: number;
|
|
18
|
+
nextPanelIndex: number;
|
|
19
|
+
direction: ResizeDirection;
|
|
20
|
+
renderHandle?: (props: ResizeHandleRenderProps) => React.ReactNode;
|
|
21
|
+
}
|
|
22
|
+
declare const ResizeHandle: React.FC<ResizeHandleProps>;
|
|
23
|
+
|
|
24
|
+
export { ResizeHandle };
|
|
25
|
+
export type { ResizeHandleProps, ResizeHandleRenderProps };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsx as e}from"react/jsx-runtime";import{useRef as n,useState as t,useEffect as r}from"react";import l from"../../resizeAble.js";import{useResizableContext as o}from"../../context.js";const i=({prePanelIndex:i,nextPanelIndex:u,direction:a,renderHandle:c})=>{const s=n(null),d=n(null),{getPanelInfo:m,panelCount:p,virtualConfig:f}=o(),[x,v]=t(!1);r(()=>{if(!s.current)return;const e=m(i),n=m(u);if(!e||!n)return;const t=s.current?"horizontal"===a?s.current.offsetWidth:s.current.offsetHeight:10;d.current=new l({prePanelEl:e.panelEl,nextPanelEl:n.panelEl,getPanelInfo:m,prePanelIndex:i,nextPanelIndex:u,direction:a,virtualEnabled:f.enabled||!1,virtualConfig:{style:f.style,className:f.className},handleSize:t});const r=s.current;if(!r)return;let o=!1,c=0,p=0,x=null;const z=e=>{e.preventDefault(),e.stopPropagation(),o=!0,v(!0),c="horizontal"===a?e.clientX:e.clientY,p=0,null!==x&&(cancelAnimationFrame(x),x=null),d.current&&d.current.startResize()},h=()=>{o&&d.current?(d.current.onResize(p),x=null):x=null},E=e=>{if(!o||!d.current)return;const n="horizontal"===a?e.clientX:e.clientY;p=n-c,null===x&&(x=requestAnimationFrame(h))},P=()=>{o&&d.current&&(null!==x&&(cancelAnimationFrame(x),x=null),d.current.onResize(p),o=!1,v(!1),d.current.endResize())};return r.addEventListener("mousedown",z),document.addEventListener("mousemove",E),document.addEventListener("mouseup",P),()=>{r.removeEventListener("mousedown",z),document.removeEventListener("mousemove",E),document.removeEventListener("mouseup",P),null!==x&&(cancelAnimationFrame(x),x=null),d.current&&(d.current.destroy(),d.current=null)}},[i,u,a,m,p,f]);const z="horizontal"===a,h=c?c({prePanelIndex:i,nextPanelIndex:u,direction:a,isResizing:x}):null;return e("div",{ref:s,style:{position:"relative",width:z?"10px":"100%",height:z?"100%":"10px",backgroundColor:c?"transparent":"#000",cursor:z?"ew-resize":"ns-resize",zIndex:1e3,flexShrink:0,display:"flex",alignItems:"center",justifyContent:"center"},children:h})};export{i as ResizeHandle};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../src/strategies/basic/components/ResizeHandle/index.tsx"],"sourcesContent":[null],"names":["ResizeHandle","prePanelIndex","nextPanelIndex","direction","renderHandle","handleRef","useRef","coreInstanceRef","getPanelInfo","panelCount","virtualConfig","useResizableContext","isResizing","setIsResizing","useState","useEffect","current","prePanelInfo","nextPanelInfo","handleSize","offsetWidth","offsetHeight","ResizeAbleCore","prePanelEl","panelEl","nextPanelEl","virtualEnabled","enabled","style","className","handleEl","startPos","currentDelta","rafId","startResize","e","preventDefault","stopPropagation","clientX","clientY","cancelAnimationFrame","updatePanelsWithRAF","onResize","onResizeMove","currentPos","requestAnimationFrame","endResize","addEventListener","document","removeEventListener","destroy","isHorizontal","handleContent","_jsx","ref","position","width","height","backgroundColor","cursor","zIndex","flexShrink","display","alignItems","justifyContent","children"],"mappings":"8LAwBO,MAAMA,EAA4C,EACrDC,gBACAC,iBACAC,YACAC,mBAEA,MAAMC,EAAYC,EAAuB,MACnCC,EAAkBD,EAAmD,OACrEE,aAAEA,EAAYC,WAAEA,EAAUC,cAAEA,GAAkBC,KAC7CC,EAAYC,GAAiBC,GAAS,GAE7CC,EAAU,KACN,IAAKV,EAAUW,QACX,OAIJ,MAAMC,EAAeT,EAAaP,GAC5BiB,EAAgBV,EAAaN,GACnC,IAAIe,IAAiBC,EAEjB,OAIJ,MAAMC,EAAad,EAAUW,QACR,eAAdb,EACGE,EAAUW,QAAQI,YAClBf,EAAUW,QAAQK,aACQ,GAGpCd,EAAgBS,QAAU,IAAIM,EAAe,CACzCC,WAAYN,EAAaO,QACzBC,YAAaP,EAAcM,QAC3BhB,eACAP,gBACAC,iBACAC,YACAuB,eAAgBhB,EAAciB,UAAW,EACzCjB,cAAe,CACXkB,MAAOlB,EAAckB,MACrBC,UAAWnB,EAAcmB,WAE7BV,eAIJ,MAAMW,EAAWzB,EAAUW,QAC3B,IAAKc,EAAU,OAEf,IAAIlB,GAAa,EACbmB,EAAW,EACXC,EAAe,EACfC,EAAuB,KAE3B,MAAMC,EAAeC,IACjBA,EAAEC,iBACFD,EAAEE,kBACFzB,GAAa,EACbC,GAAc,GACdkB,EAAyB,eAAd5B,EAA6BgC,EAAEG,QAAUH,EAAEI,QACtDP,EAAe,EACD,OAAVC,IACAO,qBAAqBP,GACrBA,EAAQ,MAER1B,EAAgBS,SAChBT,EAAgBS,QAAQkB,eAU1BO,EAAsB,KACnB7B,GAAeL,EAAgBS,SAQpCT,EAAgBS,QAAQ0B,SAASV,GAEjCC,EAAQ,MATJA,EAAQ,MAYVU,EAAgBR,IAClB,IAAIvB,IAAeL,EAAgBS,QAAS,OAC5C,MAAM4B,EAA2B,eAAdzC,EAA6BgC,EAAEG,QAAUH,EAAEI,QAE9DP,EAAeY,EAAab,EAId,OAAVE,IACAA,EAAQY,sBAAsBJ,KAIhCK,EAAY,KACXlC,GAAcL,EAAgBS,UAEf,OAAViB,IACAO,qBAAqBP,GACrBA,EAAQ,MAGZ1B,EAAgBS,QAAQ0B,SAASV,GACjCpB,GAAa,EACbC,GAAc,GACdN,EAAgBS,QAAQ8B,cAQhC,OAJAhB,EAASiB,iBAAiB,YAAab,GACvCc,SAASD,iBAAiB,YAAaJ,GACvCK,SAASD,iBAAiB,UAAWD,GAE9B,KAEHhB,EAASmB,oBAAoB,YAAaf,GAC1Cc,SAASC,oBAAoB,YAAaN,GAC1CK,SAASC,oBAAoB,UAAWH,GAG1B,OAAVb,IACAO,qBAAqBP,GACrBA,EAAQ,MAIT1B,EAAgBS,UACfT,EAAgBS,QAAQkC,UACxB3C,EAAgBS,QAAU,QAGnC,CAACf,EAAeC,EAAgBC,EAAWK,EAAcC,EAAYC,IAExE,MAAMyC,EAA6B,eAAdhD,EAGfiD,EAAgBhD,EAAeA,EAAa,CAC9CH,gBACAC,iBACAC,YACAS,eACC,KAEL,OACIyC,EAAA,MAAA,CACIC,IAAKjD,EACLuB,MAAO,CACH2B,SAAU,WACVC,MAAOL,EAAe,OAAS,OAC/BM,OAAQN,EAAe,OAAS,OAChCO,gBAAiBtD,EAAe,cAAgB,OAChDuD,OAAQR,EAAe,YAAc,YACrCS,OAAQ,IACRC,WAAY,EACZC,QAAS,OACTC,WAAY,SACZC,eAAgB,UACnBC,SAEAb"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsx as r}from"react/jsx-runtime";import{useRef as e,useEffect as t}from"react";import{useResizableContext as i}from"../../context.js";const n=({children:n,minSize:o=100})=>{const c=e(null),d=e(-1),{registerPanel:l,unregisterPanel:h,direction:m}=i();return t(()=>{if(!c.current)return;const r=c.current;return d.current=l(r,o),()=>{h(r)}},[o,l,h]),r("div",{ref:c,style:{flex:1,minWidth:"horizontal"===m?o:void 0,minHeight:"vertical"===m?o:void 0,width:"auto",overflow:"hidden",position:"relative"},children:r("div",{style:{height:"100%",padding:16},children:n})})};export{n as ResizePanel};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../src/strategies/basic/components/ResizePanel/index.tsx"],"sourcesContent":[null],"names":["ResizePanel","children","minSize","panelRef","useRef","panelIndexRef","registerPanel","unregisterPanel","direction","useResizableContext","useEffect","current","panelEl","_jsx","ref","style","flex","minWidth","undefined","minHeight","width","overflow","position","height","padding"],"mappings":"6IAcO,MAAMA,EAA0C,EACnDC,WACAC,UAAU,QAGV,MAAMC,EAAWC,EAAuB,MAClCC,EAAgBD,OAChBE,cAAEA,EAAaC,gBAAEA,EAAeC,UAAEA,GAAcC,IAWtD,OATAC,EAAU,KACN,IAAIP,EAASQ,QAAS,OACtB,MAAMC,EAAUT,EAASQ,QAEzB,OADAN,EAAcM,QAAUL,EAAcM,EAASV,GACxC,KACHK,EAAgBK,KAErB,CAACV,EAASI,EAAeC,IAGxBM,EAAA,MAAA,CACIC,IAAKX,EACLY,MAAO,CACHC,KAAM,EACNC,SAAwB,eAAdT,EAA6BN,OAAUgB,EACjDC,UAAyB,aAAdX,EAA2BN,OAAUgB,EAChDE,MAAO,OACPC,SAAU,SACVC,SAAU,YACbrB,SAEDY,SAAKE,MAAO,CAACQ,OAAQ,OAAQC,QAAS,IAAGvB,SACpCA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { ResizeHandleRenderProps } from '../ResizeHandle/index.js';
|
|
3
|
+
import { ResizeDirection, VirtualConfig } from '../../../../types/index.js';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
6
|
+
* 可调整大小的面板组容器组件(常规策略)
|
|
7
|
+
* 使用数组存储面板信息,适合面板数量较少的场景
|
|
7
8
|
*/
|
|
8
9
|
|
|
9
10
|
interface ResizePanelGroupProps {
|
|
@@ -12,6 +13,7 @@ interface ResizePanelGroupProps {
|
|
|
12
13
|
virtual?: boolean;
|
|
13
14
|
virtualConfig?: VirtualConfig;
|
|
14
15
|
style?: React.CSSProperties;
|
|
16
|
+
renderHandle?: (props: ResizeHandleRenderProps) => React.ReactNode;
|
|
15
17
|
}
|
|
16
18
|
declare const ResizePanelGroup: React.FC<ResizePanelGroupProps>;
|
|
17
19
|
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsx as e}from"react/jsx-runtime";import r,{useRef as n,useState as t,useCallback as l}from"react";import{ResizableContext as i}from"../../context.js";import{ResizeHandle as o}from"../ResizeHandle/index.js";const u=({children:u,direction:c="horizontal",style:a,virtual:d=!1,virtualConfig:s={},renderHandle:h})=>{const f=n([]),p=n(new Map),[g,m]=t(0),x=l((e,r)=>{const n=p.current.get(e);if(void 0!==n)return f.current[n]={panelEl:e,minSize:r},n;let t=-1;for(let e=0;e<f.current.length;e++)if(!f.current[e]){t=e;break}return-1===t?(t=f.current.length,f.current.push({panelEl:e,minSize:r})):f.current[t]={panelEl:e,minSize:r},p.current.set(e,t),m(f.current.filter(e=>null!=e).length),t},[]),v=l(e=>{const r=p.current.get(e);void 0!==r&&(f.current[r]=null,p.current.delete(e),m(f.current.filter(e=>null!=e).length))},[]),P=l(e=>{if(e<0||e>=f.current.length)return null;const r=f.current[e];return r&&r.panelEl?r:null},[]),z=l(e=>p.current.get(e)??-1,[]),E=r.Children.toArray(u),I=[];E.forEach((r,n)=>{I.push(r),n<E.length-1&&I.push(e(o,{prePanelIndex:n,nextPanelIndex:n+1,direction:c,renderHandle:h},`handle-${n}`))});const y={enabled:d,...s},C={panelCount:g,registerPanel:x,unregisterPanel:v,getPanelInfo:P,getPanelIndex:z,direction:c,panelInfos:f.current.filter(e=>null!=e),virtualConfig:y};return e(i.Provider,{value:C,children:e("div",{style:{display:"flex",flexDirection:"horizontal"===c?"row":"column",height:"100%",position:"relative",...a},children:I})})};export{u as ResizePanelGroup};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../src/strategies/basic/components/ResizePanelGroup/index.tsx"],"sourcesContent":[null],"names":["ResizePanelGroup","children","direction","style","virtual","virtualConfig","renderHandle","panelInfosRef","useRef","elementToIndexMapRef","Map","panelCount","setPanelCount","useState","registerPanel","useCallback","panelEl","minSize","existingIndex","current","get","undefined","index","i","length","push","set","filter","p","unregisterPanel","delete","getPanelInfo","info","getPanelIndex","childrenArray","React","Children","toArray","panelsWithHandles","forEach","child","_jsx","ResizeHandle","prePanelIndex","nextPanelIndex","mergedVirtualConfig","enabled","contextValue","panelInfos","ResizableContext","Provider","value","display","flexDirection","height","position"],"mappings":"qNAkBO,MAAMA,EAAoD,EAC7DC,WACAC,YAAY,aACZC,QACAC,WAAU,EACVC,gBAAgB,CAAA,EAChBC,mBAKA,MAAMC,EAAgBC,EAA6B,IAC7CC,EAAuBD,EAAiC,IAAIE,MAC3DC,EAAYC,GAAiBC,EAAS,GAEvCC,EAAgBC,EAAY,CAACC,EAAsBC,KAErD,MAAMC,EAAgBT,EAAqBU,QAAQC,IAAIJ,GACvD,QAAsBK,IAAlBH,EAGA,OADAX,EAAcY,QAAQD,GAAiB,CAAEF,UAASC,WAC3CC,EAIX,IAAII,GAAQ,EACZ,IAAK,IAAIC,EAAI,EAAGA,EAAIhB,EAAcY,QAAQK,OAAQD,IAC9C,IAAKhB,EAAcY,QAAQI,GAAI,CAC3BD,EAAQC,EACR,KACJ,CAcJ,OAXc,IAAVD,GAEAA,EAAQf,EAAcY,QAAQK,OAC9BjB,EAAcY,QAAQM,KAAK,CAAET,UAASC,aAGtCV,EAAcY,QAAQG,GAAS,CAAEN,UAASC,WAG9CR,EAAqBU,QAAQO,IAAIV,EAASM,GAC1CV,EAAcL,EAAcY,QAAQQ,OAAOC,GAAKA,SAA+BJ,QACxEF,GACR,IAEGO,EAAkBd,EAAaC,IACjC,MAAMM,EAAQb,EAAqBU,QAAQC,IAAIJ,QACjCK,IAAVC,IAGAf,EAAcY,QAAQG,GAAS,KAC/Bb,EAAqBU,QAAQW,OAAOd,GACpCJ,EAAcL,EAAcY,QAAQQ,OAAOC,GAAKA,SAA+BJ,UAEpF,IAEGO,EAAehB,EAAaO,IAC9B,GAAIA,EAAQ,GAAKA,GAASf,EAAcY,QAAQK,OAC5C,OAAO,KAEX,MAAMQ,EAAOzB,EAAcY,QAAQG,GAEnC,OAAQU,GAAQA,EAAKhB,QAAWgB,EAAO,MACxC,IAEGC,EAAgBlB,EAAaC,GACxBP,EAAqBU,QAAQC,IAAIJ,KAAY,EACrD,IAEGkB,EAAgBC,EAAMC,SAASC,QAAQpC,GACvCqC,EAAuC,GAE7CJ,EAAcK,QAAQ,CAACC,EAAOlB,KAC1BgB,EAAkBb,KAAKe,GAGnBlB,EAAQY,EAAcV,OAAS,GAC/Bc,EAAkBb,KACdgB,EAACC,EAAY,CAETC,cAAerB,EACfsB,eAAgBtB,EAAQ,EACxBpB,UAAWA,EACXI,aAAcA,GAJT,UAAUgB,QAW/B,MAAMuB,EAAqC,CACvCC,QAAS1C,KACNC,GAGD0C,EAAsC,CACxCpC,WAAYA,EACZG,gBACAe,kBACAE,eACAE,gBACA/B,YACA8C,WAAYzC,EAAcY,QAAQQ,OAAOC,GAAKA,SAC9CvB,cAAewC,GAGnB,OACIJ,EAACQ,EAAiBC,SAAQ,CAACC,MAAOJ,EAAY9C,SAC1CwC,EAAA,MAAA,CAAKtC,MAAO,CACJiD,QAAS,OACTC,cAA6B,eAAdnD,EAA6B,MAAQ,SACpDoD,OAAQ,OACRC,SAAU,cACPpD,GACVF,SACIqC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PanelInfo, ResizeDirection, VirtualConfig, FlexStrategyConfig } from '../../types/index.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Resizable Context 接口定义(常规策略)
|
|
6
|
+
*/
|
|
7
|
+
interface ResizableContextValue {
|
|
8
|
+
panelCount: number;
|
|
9
|
+
registerPanel: (panelEl: HTMLElement, minSize: number) => number;
|
|
10
|
+
unregisterPanel: (panelEl: HTMLElement) => void;
|
|
11
|
+
getPanelInfo: (index: number) => PanelInfo | null;
|
|
12
|
+
getPanelIndex: (panelEl: HTMLElement) => number;
|
|
13
|
+
direction: ResizeDirection;
|
|
14
|
+
panelInfos: PanelInfo[];
|
|
15
|
+
virtualConfig: VirtualConfig;
|
|
16
|
+
onPanelsChange?: (changedIndices: Set<number>) => void;
|
|
17
|
+
flexConfig?: FlexStrategyConfig;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resizable Context
|
|
21
|
+
*/
|
|
22
|
+
declare const ResizableContext: React.Context<ResizableContextValue>;
|
|
23
|
+
/**
|
|
24
|
+
* 使用 Resizable Context 的 Hook
|
|
25
|
+
*/
|
|
26
|
+
declare const useResizableContext: () => ResizableContextValue;
|
|
27
|
+
|
|
28
|
+
export { ResizableContext, useResizableContext };
|
|
29
|
+
export type { ResizableContextValue };
|