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.
Files changed (89) hide show
  1. package/CHANGELOG.md +366 -0
  2. package/README.md +192 -117
  3. package/dist/core/virtualNode.js +2 -0
  4. package/dist/core/virtualNode.js.map +1 -0
  5. package/dist/esm/core/virtualNode.js +2 -0
  6. package/dist/esm/core/virtualNode.js.map +1 -0
  7. package/dist/esm/index.d.ts +7 -3
  8. package/dist/esm/index.js +1 -1
  9. package/dist/esm/strategies/basic/components/ResizeHandle/index.d.ts +25 -0
  10. package/dist/esm/strategies/basic/components/ResizeHandle/index.js +2 -0
  11. package/dist/esm/strategies/basic/components/ResizeHandle/index.js.map +1 -0
  12. package/dist/esm/{components → strategies/basic/components}/ResizePanel/index.d.ts +2 -1
  13. package/dist/esm/strategies/basic/components/ResizePanel/index.js +2 -0
  14. package/dist/esm/strategies/basic/components/ResizePanel/index.js.map +1 -0
  15. package/dist/{components → esm/strategies/basic/components}/ResizePanelGroup/index.d.ts +5 -3
  16. package/dist/esm/strategies/basic/components/ResizePanelGroup/index.js +2 -0
  17. package/dist/esm/strategies/basic/components/ResizePanelGroup/index.js.map +1 -0
  18. package/dist/esm/strategies/basic/context.d.ts +29 -0
  19. package/dist/esm/strategies/basic/context.js +2 -0
  20. package/dist/esm/strategies/basic/context.js.map +1 -0
  21. package/dist/esm/strategies/basic/resizeAble.js +2 -0
  22. package/dist/esm/strategies/basic/resizeAble.js.map +1 -0
  23. package/dist/esm/strategies/flex/components/ResizeHandleFlex/index.d.ts +25 -0
  24. package/dist/esm/strategies/flex/components/ResizeHandleFlex/index.js +2 -0
  25. package/dist/esm/strategies/flex/components/ResizeHandleFlex/index.js.map +1 -0
  26. package/dist/esm/strategies/flex/components/ResizePanelGroupFlex/index.d.ts +24 -0
  27. package/dist/esm/strategies/flex/components/ResizePanelGroupFlex/index.js +2 -0
  28. package/dist/esm/strategies/flex/components/ResizePanelGroupFlex/index.js.map +1 -0
  29. package/dist/esm/strategies/flex/resizeAble.js +2 -0
  30. package/dist/esm/strategies/flex/resizeAble.js.map +1 -0
  31. package/dist/esm/types/index.d.ts +32 -2
  32. package/dist/esm/types/index.js +2 -0
  33. package/dist/esm/types/index.js.map +1 -0
  34. package/dist/esm/utils/resizeHelpers.js +2 -0
  35. package/dist/esm/utils/resizeHelpers.js.map +1 -0
  36. package/dist/index.d.ts +7 -3
  37. package/dist/index.js +1 -1
  38. package/dist/strategies/basic/components/ResizeHandle/index.d.ts +25 -0
  39. package/dist/strategies/basic/components/ResizeHandle/index.js +2 -0
  40. package/dist/strategies/basic/components/ResizeHandle/index.js.map +1 -0
  41. package/dist/{components → strategies/basic/components}/ResizePanel/index.d.ts +2 -1
  42. package/dist/strategies/basic/components/ResizePanel/index.js +2 -0
  43. package/dist/strategies/basic/components/ResizePanel/index.js.map +1 -0
  44. package/dist/{esm → strategies/basic}/components/ResizePanelGroup/index.d.ts +5 -3
  45. package/dist/strategies/basic/components/ResizePanelGroup/index.js +2 -0
  46. package/dist/strategies/basic/components/ResizePanelGroup/index.js.map +1 -0
  47. package/dist/strategies/basic/context.d.ts +29 -0
  48. package/dist/strategies/basic/context.js +2 -0
  49. package/dist/strategies/basic/context.js.map +1 -0
  50. package/dist/strategies/basic/resizeAble.js +2 -0
  51. package/dist/strategies/basic/resizeAble.js.map +1 -0
  52. package/dist/strategies/flex/components/ResizeHandleFlex/index.d.ts +25 -0
  53. package/dist/strategies/flex/components/ResizeHandleFlex/index.js +2 -0
  54. package/dist/strategies/flex/components/ResizeHandleFlex/index.js.map +1 -0
  55. package/dist/strategies/flex/components/ResizePanelGroupFlex/index.d.ts +24 -0
  56. package/dist/strategies/flex/components/ResizePanelGroupFlex/index.js +2 -0
  57. package/dist/strategies/flex/components/ResizePanelGroupFlex/index.js.map +1 -0
  58. package/dist/strategies/flex/resizeAble.js +2 -0
  59. package/dist/strategies/flex/resizeAble.js.map +1 -0
  60. package/dist/types/index.d.ts +32 -2
  61. package/dist/types/index.js +2 -0
  62. package/dist/types/index.js.map +1 -0
  63. package/dist/utils/resizeHelpers.js +2 -0
  64. package/dist/utils/resizeHelpers.js.map +1 -0
  65. package/package.json +165 -134
  66. package/dist/components/ResizeHandle/index.js +0 -2
  67. package/dist/components/ResizeHandle/index.js.map +0 -1
  68. package/dist/components/ResizePanel/index.js +0 -2
  69. package/dist/components/ResizePanel/index.js.map +0 -1
  70. package/dist/components/ResizePanelGroup/index.js +0 -2
  71. package/dist/components/ResizePanelGroup/index.js.map +0 -1
  72. package/dist/components/shared/context.js +0 -2
  73. package/dist/components/shared/context.js.map +0 -1
  74. package/dist/esm/components/ResizeHandle/index.js +0 -2
  75. package/dist/esm/components/ResizeHandle/index.js.map +0 -1
  76. package/dist/esm/components/ResizePanel/index.js +0 -2
  77. package/dist/esm/components/ResizePanel/index.js.map +0 -1
  78. package/dist/esm/components/ResizePanelGroup/index.js +0 -2
  79. package/dist/esm/components/ResizePanelGroup/index.js.map +0 -1
  80. package/dist/esm/components/shared/context.js +0 -2
  81. package/dist/esm/components/shared/context.js.map +0 -1
  82. package/dist/esm/utils/resizeAble.js +0 -2
  83. package/dist/esm/utils/resizeAble.js.map +0 -1
  84. package/dist/esm/utils/virtualNode.js +0 -2
  85. package/dist/esm/utils/virtualNode.js.map +0 -1
  86. package/dist/utils/resizeAble.js +0 -2
  87. package/dist/utils/resizeAble.js.map +0 -1
  88. package/dist/utils/virtualNode.js +0 -2
  89. 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 { ResizablePanelGroup, ResizablePanel } from 'react-resize-demo';
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
- <ResizablePanelGroup direction="horizontal">
40
- <ResizablePanel minSize={100}>
43
+ <ResizePanelGroupFlex direction="horizontal">
44
+ <ResizePanelFlex minSize={100}>
41
45
  <div>Panel 1</div>
42
- </ResizablePanel>
43
- <ResizablePanel minSize={200}>
46
+ </ResizePanelFlex>
47
+ <ResizePanelFlex minSize={200}>
44
48
  <div>Panel 2</div>
45
- </ResizablePanel>
46
- <ResizablePanel minSize={300}>
49
+ </ResizePanelFlex>
50
+ <ResizePanelFlex minSize={300}>
47
51
  <div>Panel 3</div>
48
- </ResizablePanel>
49
- </ResizablePanelGroup>
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
- <ResizablePanelGroup direction="vertical" style={{ height: '500px' }}>
59
- <ResizablePanel minSize={100}>
71
+ <ResizePanelGroupFlex direction="vertical" style={{ height: '500px' }}>
72
+ <ResizePanelFlex minSize={100}>
60
73
  <div>顶部面板</div>
61
- </ResizablePanel>
62
- <ResizablePanel minSize={200}>
74
+ </ResizePanelFlex>
75
+ <ResizePanelFlex minSize={200}>
63
76
  <div>中间面板</div>
64
- </ResizablePanel>
65
- <ResizablePanel minSize={100}>
77
+ </ResizePanelFlex>
78
+ <ResizePanelFlex minSize={100}>
66
79
  <div>底部面板</div>
67
- </ResizablePanel>
68
- </ResizablePanelGroup>
80
+ </ResizePanelFlex>
81
+ </ResizePanelGroupFlex>
69
82
  ```
70
83
 
71
84
  ### 虚拟化模式
@@ -74,17 +87,17 @@ function App() {
74
87
 
75
88
  ```tsx
76
89
  // 启用虚拟化(使用默认样式)
77
- <ResizablePanelGroup virtual={true}>
78
- <ResizablePanel minSize={100}>
90
+ <ResizePanelGroupFlex virtual={true}>
91
+ <ResizePanelFlex minSize={100}>
79
92
  <div>Panel 1</div>
80
- </ResizablePanel>
81
- <ResizablePanel minSize={200}>
93
+ </ResizePanelFlex>
94
+ <ResizePanelFlex minSize={200}>
82
95
  <div>Panel 2</div>
83
- </ResizablePanel>
84
- </ResizablePanelGroup>
96
+ </ResizePanelFlex>
97
+ </ResizePanelGroupFlex>
85
98
 
86
- // 启用虚拟化(自定义样式)
87
- <ResizablePanelGroup
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
- <ResizablePanel minSize={100}>
177
+ <ResizePanelFlex minSize={100}>
99
178
  <div>Panel 1</div>
100
- </ResizablePanel>
101
- <ResizablePanel minSize={200}>
179
+ </ResizePanelFlex>
180
+ <ResizePanelFlex minSize={200}>
102
181
  <div>Panel 2</div>
103
- </ResizablePanel>
104
- </ResizablePanelGroup>
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 { ResizablePanelGroup, ResizablePanel } from 'react-resize-demo';
192
+ import { ResizePanelGroupFlex, ResizePanelFlex } from 'react-resize-demo';
114
193
 
115
194
  // 按需导入组件
116
- import { ResizablePanelGroup } from 'react-resize-demo/components/ResizePanelGroup';
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
- ### ResizablePanelGroup
239
+ ### ResizePanelGroupFlex(推荐)
165
240
 
166
- 面板组容器组件,用于包裹多个 `ResizablePanel`。
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
- | children | `React.ReactNode` | - | 子元素(通常是多个 ResizablePanel) |
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
- ### ResizablePanel
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
- react-resize-demo/
216
- ├── src/ # 源代码目录
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
- 组件通过拖拽器(ResizeHandle)来调整相邻面板的尺寸:
298
- - **向右拖拽**:扩大左侧面板,缩小右侧面板(如果右侧面板达到最小值,继续从后续面板获取空间)
299
- - **向左拖拽**:缩小左侧面板,扩大右侧面板(如果左侧面板达到最小值,继续从前面面板获取空间)
300
-
301
- 拖拽器会自动插入到相邻面板之间,无需手动添加。
353
+ 组件通过拖拽器来调整相邻面板的尺寸。拖拽器会自动插入到相邻面板之间,无需手动添加。
302
354
 
303
- ### 虚拟化模式
355
+ **拖拽行为**:
356
+ - **向右拖拽**:扩大左侧面板,缩小右侧面板。如果右侧面板达到最小值,会自动从后续面板获取空间(级联调整)
357
+ - **向左拖拽**:缩小左侧面板,扩大右侧面板。如果左侧面板达到最小值,会自动从前面面板获取空间(级联调整)
304
358
 
305
- 当启用虚拟化模式(`virtual={true}`)时:
306
- 1. **拖拽开始**:为所有相关面板创建虚拟节点框架,虚拟节点覆盖在原节点上
307
- 2. **拖拽中**:只更新虚拟节点的尺寸和位置,真实节点保持不变
308
- 3. **拖拽结束**:将虚拟节点的最终尺寸应用到真实节点,然后清理所有虚拟节点
359
+ **虚拟化模式**:
360
+ 当启用虚拟化模式时,拖拽过程中会创建虚拟节点框架来显示调整效果,真实节点保持不变。拖拽结束后再将最终尺寸应用到真实节点。这种方式可以显著提升性能,特别是在处理复杂内容的面板时。
309
361
 
310
- 这种模式可以:
311
- - 提升性能:拖拽过程中不操作真实 DOM,减少重排和重绘
312
- - 提供视觉反馈:虚拟节点可以有不同的样式(如半透明、虚线边框等)
313
- - 适用于复杂内容:当面板内容复杂时,虚拟化可以避免拖拽时的性能问题
362
+ **性能优化机制**:
363
+ - 使用 `requestAnimationFrame` 与浏览器渲染同步,每帧计算一次
364
+ - 基于初始状态计算,避免累积误差
365
+ - 只更新变化的面板,未变化的面板自动冻结
366
+ - 支持面板变化通知,只重新渲染变化的面板
314
367
 
315
368
  ## 🔄 迁移指南
316
369
 
317
- ### 从 1.x 升级到 2.0
370
+ ### 从 2.x 升级到 3.0
318
371
 
319
- 2.0 版本保持了向后兼容,现有代码无需修改即可使用:
372
+ 3.0 版本引入了策略分类架构,推荐使用 Flex 策略:
320
373
 
321
374
  ```tsx
322
- // 仍然可用(向后兼容)
323
- import { ResizeablePanelGroup, ResizeablePanel } from 'react-resize-demo';
375
+ // 2.x 版本(仍然可用,向后兼容)
376
+ import { ResizePanelGroup, ResizePanel } from 'react-resize-demo';
324
377
 
325
- // 推荐使用新的正确拼写
326
- import { ResizablePanelGroup, ResizablePanel } from 'react-resize-demo';
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
- // 按需导入,更好的 Tree-shaking
335
- import { ResizablePanelGroup } from 'react-resize-demo/components/ResizePanelGroup';
336
- import { ResizablePanel } from 'react-resize-demo/components/ResizePanel';
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
- 查看 [OPTIMIZATION.md](./OPTIMIZATION.md) 了解详细的性能优化措施和配置。
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":"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"}
@@ -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":"AAOA,MAAMA,EAAN,WAAAC,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"}
@@ -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 { PanelInfo, ResizeAbleCoreOptions, ResizeDirection, VirtualConfig, VirtualNodeConfig } from './types/index.js';
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"}
@@ -1,8 +1,9 @@
1
1
  import React from 'react';
2
2
 
3
3
  /**
4
- * 可调整大小的面板组件
4
+ * 可调整大小的面板组件(常规策略)
5
5
  * 负责展示面板内容和管理面板的注册/注销
6
+ * 使用数组存储,适合面板数量较少的场景
6
7
  */
7
8
 
8
9
  interface ResizePanelProps {
@@ -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 { ResizeDirection, VirtualConfig } from '../../types/index.js';
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 };