react-resize-demo 2.0.2 → 3.0.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 (141) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/README.md +119 -65
  3. package/dist/core/PanelManager.js +2 -0
  4. package/dist/core/PanelManager.js.map +1 -0
  5. package/dist/core/virtualNode.js +2 -0
  6. package/dist/core/virtualNode.js.map +1 -0
  7. package/dist/esm/core/PanelManager.js +2 -0
  8. package/dist/esm/core/PanelManager.js.map +1 -0
  9. package/dist/esm/core/virtualNode.js +2 -0
  10. package/dist/esm/core/virtualNode.js.map +1 -0
  11. package/dist/esm/index.d.ts +14 -3
  12. package/dist/esm/index.js +1 -5
  13. package/dist/esm/index.js.map +1 -1
  14. package/dist/esm/strategies/basic/components/ResizeHandle/index.d.ts +18 -0
  15. package/dist/esm/strategies/basic/components/ResizeHandle/index.js +2 -0
  16. package/dist/esm/strategies/basic/components/ResizeHandle/index.js.map +1 -0
  17. package/dist/{components → esm/strategies/basic/components}/ResizePanel/index.d.ts +2 -1
  18. package/dist/esm/strategies/basic/components/ResizePanel/index.js +2 -0
  19. package/dist/esm/strategies/basic/components/ResizePanel/index.js.map +1 -0
  20. package/dist/{components → esm/strategies/basic/components}/ResizePanelGroup/index.d.ts +3 -3
  21. package/dist/esm/strategies/basic/components/ResizePanelGroup/index.js +2 -0
  22. package/dist/esm/strategies/basic/components/ResizePanelGroup/index.js.map +1 -0
  23. package/dist/esm/strategies/basic/context.d.ts +28 -0
  24. package/dist/esm/strategies/basic/context.js +2 -0
  25. package/dist/esm/strategies/basic/context.js.map +1 -0
  26. package/dist/esm/strategies/basic/resizeAble.js +2 -0
  27. package/dist/esm/strategies/basic/resizeAble.js.map +1 -0
  28. package/dist/esm/strategies/flex/components/ResizeHandleFlex/index.d.ts +18 -0
  29. package/dist/esm/strategies/flex/components/ResizeHandleFlex/index.js +2 -0
  30. package/dist/esm/strategies/flex/components/ResizeHandleFlex/index.js.map +1 -0
  31. package/dist/esm/strategies/flex/components/ResizePanelGroupFlex/index.d.ts +21 -0
  32. package/dist/esm/strategies/flex/components/ResizePanelGroupFlex/index.js +2 -0
  33. package/dist/esm/strategies/flex/components/ResizePanelGroupFlex/index.js.map +1 -0
  34. package/dist/esm/strategies/flex/resizeAble.js +2 -0
  35. package/dist/esm/strategies/flex/resizeAble.js.map +1 -0
  36. package/dist/esm/strategies/flex-linked/components/ResizeHandleFlexLinked/index.d.ts +17 -0
  37. package/dist/esm/strategies/flex-linked/components/ResizeHandleFlexLinked/index.js +2 -0
  38. package/dist/esm/strategies/flex-linked/components/ResizeHandleFlexLinked/index.js.map +1 -0
  39. package/dist/esm/strategies/flex-linked/components/ResizePanelFlexLinked/index.d.ts +17 -0
  40. package/dist/esm/strategies/flex-linked/components/ResizePanelFlexLinked/index.js +2 -0
  41. package/dist/esm/strategies/flex-linked/components/ResizePanelFlexLinked/index.js.map +1 -0
  42. package/dist/esm/strategies/flex-linked/components/ResizePanelGroupFlexLinked/index.d.ts +20 -0
  43. package/dist/esm/strategies/flex-linked/components/ResizePanelGroupFlexLinked/index.js +2 -0
  44. package/dist/esm/strategies/flex-linked/components/ResizePanelGroupFlexLinked/index.js.map +1 -0
  45. package/dist/esm/strategies/flex-linked/context.js +2 -0
  46. package/dist/esm/strategies/flex-linked/context.js.map +1 -0
  47. package/dist/esm/strategies/flex-linked/resizeAble.js +2 -0
  48. package/dist/esm/strategies/flex-linked/resizeAble.js.map +1 -0
  49. package/dist/esm/strategies/linked/components/ResizeHandleLinked/index.d.ts +18 -0
  50. package/dist/esm/strategies/linked/components/ResizeHandleLinked/index.js +2 -0
  51. package/dist/esm/strategies/linked/components/ResizeHandleLinked/index.js.map +1 -0
  52. package/dist/esm/strategies/linked/components/ResizePanelGroupLinked/index.d.ts +19 -0
  53. package/dist/esm/strategies/linked/components/ResizePanelGroupLinked/index.js +2 -0
  54. package/dist/esm/strategies/linked/components/ResizePanelGroupLinked/index.js.map +1 -0
  55. package/dist/esm/strategies/linked/components/ResizePanelLinked/index.d.ts +17 -0
  56. package/dist/esm/strategies/linked/components/ResizePanelLinked/index.js +2 -0
  57. package/dist/esm/strategies/linked/components/ResizePanelLinked/index.js.map +1 -0
  58. package/dist/esm/strategies/linked/context.d.ts +29 -0
  59. package/dist/esm/strategies/linked/context.js +2 -0
  60. package/dist/esm/strategies/linked/context.js.map +1 -0
  61. package/dist/esm/strategies/linked/resizeAble.js +2 -0
  62. package/dist/esm/strategies/linked/resizeAble.js.map +1 -0
  63. package/dist/esm/types/index.d.ts +36 -2
  64. package/dist/index.d.ts +14 -3
  65. package/dist/index.js +1 -14
  66. package/dist/index.js.map +1 -1
  67. package/dist/strategies/basic/components/ResizeHandle/index.d.ts +18 -0
  68. package/dist/strategies/basic/components/ResizeHandle/index.js +2 -0
  69. package/dist/strategies/basic/components/ResizeHandle/index.js.map +1 -0
  70. package/dist/{esm → strategies/basic}/components/ResizePanel/index.d.ts +2 -1
  71. package/dist/strategies/basic/components/ResizePanel/index.js +2 -0
  72. package/dist/strategies/basic/components/ResizePanel/index.js.map +1 -0
  73. package/dist/{esm → strategies/basic}/components/ResizePanelGroup/index.d.ts +3 -3
  74. package/dist/strategies/basic/components/ResizePanelGroup/index.js +2 -0
  75. package/dist/strategies/basic/components/ResizePanelGroup/index.js.map +1 -0
  76. package/dist/strategies/basic/context.d.ts +28 -0
  77. package/dist/strategies/basic/context.js +2 -0
  78. package/dist/strategies/basic/context.js.map +1 -0
  79. package/dist/strategies/basic/resizeAble.js +2 -0
  80. package/dist/strategies/basic/resizeAble.js.map +1 -0
  81. package/dist/strategies/flex/components/ResizeHandleFlex/index.d.ts +18 -0
  82. package/dist/strategies/flex/components/ResizeHandleFlex/index.js +2 -0
  83. package/dist/strategies/flex/components/ResizeHandleFlex/index.js.map +1 -0
  84. package/dist/strategies/flex/components/ResizePanelGroupFlex/index.d.ts +21 -0
  85. package/dist/strategies/flex/components/ResizePanelGroupFlex/index.js +2 -0
  86. package/dist/strategies/flex/components/ResizePanelGroupFlex/index.js.map +1 -0
  87. package/dist/strategies/flex/resizeAble.js +2 -0
  88. package/dist/strategies/flex/resizeAble.js.map +1 -0
  89. package/dist/strategies/flex-linked/components/ResizeHandleFlexLinked/index.d.ts +17 -0
  90. package/dist/strategies/flex-linked/components/ResizeHandleFlexLinked/index.js +2 -0
  91. package/dist/strategies/flex-linked/components/ResizeHandleFlexLinked/index.js.map +1 -0
  92. package/dist/strategies/flex-linked/components/ResizePanelFlexLinked/index.d.ts +17 -0
  93. package/dist/strategies/flex-linked/components/ResizePanelFlexLinked/index.js +2 -0
  94. package/dist/strategies/flex-linked/components/ResizePanelFlexLinked/index.js.map +1 -0
  95. package/dist/strategies/flex-linked/components/ResizePanelGroupFlexLinked/index.d.ts +20 -0
  96. package/dist/strategies/flex-linked/components/ResizePanelGroupFlexLinked/index.js +2 -0
  97. package/dist/strategies/flex-linked/components/ResizePanelGroupFlexLinked/index.js.map +1 -0
  98. package/dist/strategies/flex-linked/context.js +2 -0
  99. package/dist/strategies/flex-linked/context.js.map +1 -0
  100. package/dist/strategies/flex-linked/resizeAble.js +2 -0
  101. package/dist/strategies/flex-linked/resizeAble.js.map +1 -0
  102. package/dist/strategies/linked/components/ResizeHandleLinked/index.d.ts +18 -0
  103. package/dist/strategies/linked/components/ResizeHandleLinked/index.js +2 -0
  104. package/dist/strategies/linked/components/ResizeHandleLinked/index.js.map +1 -0
  105. package/dist/strategies/linked/components/ResizePanelGroupLinked/index.d.ts +19 -0
  106. package/dist/strategies/linked/components/ResizePanelGroupLinked/index.js +2 -0
  107. package/dist/strategies/linked/components/ResizePanelGroupLinked/index.js.map +1 -0
  108. package/dist/strategies/linked/components/ResizePanelLinked/index.d.ts +17 -0
  109. package/dist/strategies/linked/components/ResizePanelLinked/index.js +2 -0
  110. package/dist/strategies/linked/components/ResizePanelLinked/index.js.map +1 -0
  111. package/dist/strategies/linked/context.d.ts +29 -0
  112. package/dist/strategies/linked/context.js +2 -0
  113. package/dist/strategies/linked/context.js.map +1 -0
  114. package/dist/strategies/linked/resizeAble.js +2 -0
  115. package/dist/strategies/linked/resizeAble.js.map +1 -0
  116. package/dist/types/index.d.ts +36 -2
  117. package/package.json +165 -134
  118. package/dist/components/ResizeHandle/index.js +0 -92
  119. package/dist/components/ResizeHandle/index.js.map +0 -1
  120. package/dist/components/ResizePanel/index.js +0 -33
  121. package/dist/components/ResizePanel/index.js.map +0 -1
  122. package/dist/components/ResizePanelGroup/index.js +0 -61
  123. package/dist/components/ResizePanelGroup/index.js.map +0 -1
  124. package/dist/components/shared/context.js +0 -35
  125. package/dist/components/shared/context.js.map +0 -1
  126. package/dist/esm/components/ResizeHandle/index.js +0 -90
  127. package/dist/esm/components/ResizeHandle/index.js.map +0 -1
  128. package/dist/esm/components/ResizePanel/index.js +0 -31
  129. package/dist/esm/components/ResizePanel/index.js.map +0 -1
  130. package/dist/esm/components/ResizePanelGroup/index.js +0 -59
  131. package/dist/esm/components/ResizePanelGroup/index.js.map +0 -1
  132. package/dist/esm/components/shared/context.js +0 -32
  133. package/dist/esm/components/shared/context.js.map +0 -1
  134. package/dist/esm/utils/resizeAble.js +0 -427
  135. package/dist/esm/utils/resizeAble.js.map +0 -1
  136. package/dist/esm/utils/virtualNode.js +0 -164
  137. package/dist/esm/utils/virtualNode.js.map +0 -1
  138. package/dist/utils/resizeAble.js +0 -431
  139. package/dist/utils/resizeAble.js.map +0 -1
  140. package/dist/utils/virtualNode.js +0 -168
  141. package/dist/utils/virtualNode.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,136 @@
5
5
  格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
6
6
  版本号遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。
7
7
 
8
+ ## [3.0.0] - 2026-01-10
9
+
10
+ ### 🎉 重大版本更新
11
+
12
+ 这是一个重大版本更新,引入了策略分类架构、性能优化和完整的文档体系。
13
+
14
+ ### ✨ 新增
15
+
16
+ - **策略分类架构**
17
+ - 重构为按策略分类的目录结构(`src/strategies/`)
18
+ - 提供 4 种 resize 策略:
19
+ - **Basic 策略**:适合面板数量 < 10 的简单场景
20
+ - **Linked 策略**:适合面板数量 ≥ 10 的场景
21
+ - **Flex 策略**:适合需要精确控制占比的场景
22
+ - **Flex-Linked 策略**:适合大量面板 + 精确控制的场景(**推荐**)
23
+
24
+ - **性能优化**
25
+ - **节流优化**:使用 `requestAnimationFrame` 节流,减少 DOM 操作 50-70%
26
+ - **面板变化通知**:通过 `onPanelsChange` 回调,只重新渲染变化的面板
27
+ - **自动冻结**:自动冻结未变化面板,减少布局计算 85%
28
+ - **链表优化**:大量面板场景下性能提升 42.9%
29
+
30
+ - **核心工具模块化**
31
+ - 新增 `src/core/` 目录,存放所有策略共享的核心工具
32
+ - `PanelManager.ts`:面板管理器(链表策略使用)
33
+ - `virtualNode.ts`:虚拟节点管理
34
+ - `throttle.ts`:节流工具
35
+
36
+ - **完整文档体系**
37
+ - [策略对比文档](./docs/STRATEGY_COMPARISON.md):详细对比 4 种策略
38
+ - [性能优化时间线](./docs/PERFORMANCE_TIMELINE.md):记录所有性能优化措施
39
+ - [节流优化文档](./docs/THROTTLE_OPTIMIZATION.md):节流优化详细说明
40
+ - [面板变化通知文档](./docs/PANEL_CHANGE_NOTIFICATION.md):面板变化通知机制
41
+
42
+ ### 🔄 变更
43
+
44
+ - **项目结构重构**
45
+ - 从单一组件结构重构为按策略分类的结构
46
+ - `src/components/` → `src/strategies/{strategy}/components/`
47
+ - `src/utils/` → `src/core/`(核心工具)+ `src/strategies/{strategy}/`(策略特定)
48
+
49
+ - **构建产物结构**
50
+ ```
51
+ dist/
52
+ ├── index.js # CJS 主入口
53
+ ├── strategies/ # 策略目录
54
+ │ ├── basic/
55
+ │ ├── linked/
56
+ │ ├── flex/
57
+ │ └── flex-linked/
58
+ ├── core/ # 核心工具
59
+ │ ├── PanelManager.js
60
+ │ ├── virtualNode.js
61
+ │ └── throttle.js
62
+ └── esm/ # ESM 模块
63
+ ```
64
+
65
+ - **移除废弃策略**
66
+ - 移除了 `ResizeAbleCoreOptimized` 和相关的 `Optimized` 组件
67
+ - 统一使用 `Flex-Linked` 策略作为最终版本
68
+
69
+ - **构建优化**
70
+ - 构建前自动清空 `dist` 目录
71
+ - 更新 `package.json` 的 `exports` 字段,支持策略和核心工具的导出路径
72
+
73
+ ### 🔧 改进
74
+
75
+ - **性能提升**
76
+ - FPS 从 30-40 提升到 50-55(+66.7%)
77
+ - CPU 占用从 80-100% 降低到 40-60%(-50%)
78
+ - DOM 操作减少 60-70%
79
+ - React 渲染优化 85%
80
+
81
+ - **代码质量**
82
+ - 修复了最小尺寸限制的 bug(Flex-Linked 策略)
83
+ - 优化了面板变化检测逻辑
84
+ - 改进了链表遍历性能
85
+
86
+ - **开发体验**
87
+ - 更清晰的策略分类,便于维护和扩展
88
+ - 完整的文档体系,便于理解和使用
89
+ - 详细的性能对比和优化建议
90
+
91
+ ### 📝 向后兼容
92
+
93
+ - 保留了 Basic 策略的组件导出(`ResizePanelGroup`、`ResizePanel`、`ResizeHandle`)
94
+ - 保留了旧的导出名称(`ResizablePanelGroup`、`ResizeablePanelGroup` 等)
95
+ - 主入口导入方式保持不变
96
+
97
+ ### 🚨 破坏性变更
98
+
99
+ - 如果直接导入子模块路径,需要更新导入路径
100
+ - `Optimized` 相关组件已移除,请使用 `Flex-Linked` 策略替代
101
+ - 内部 API 结构发生变化,但公共 API 保持兼容
102
+
103
+ ### 📚 文档
104
+
105
+ - 新增策略对比文档,帮助选择最适合的策略
106
+ - 新增性能优化时间线,记录所有优化措施
107
+ - 更新所有文档以反映新的目录结构
108
+ - 更新 README,添加策略说明和性能优化介绍
109
+
110
+ ## [2.0.3] - 2026-01-10
111
+
112
+ ### 🚀 性能优化
113
+
114
+ - **代码压缩**
115
+ - 集成 `@rollup/plugin-terser` 进行代码压缩
116
+ - 自动移除 debugger 语句和注释
117
+ - 变量名压缩,减小打包体积
118
+ - 保留 source map 支持调试
119
+
120
+ - **Tree-shaking 增强**
121
+ - 配置更激进的 tree-shaking 策略
122
+ - 使用 `smallest` 预设优化未使用代码移除
123
+ - 优化代码生成,使用 const 绑定提升 tree-shaking 效果
124
+ - 确保按需导入时只打包实际使用的代码
125
+
126
+ ### 📦 构建优化
127
+
128
+ - **打包配置优化**
129
+ - 参考 Ant Design 的打包实践优化配置
130
+ - 确保所有模块都正确支持 tree-shaking
131
+ - 优化构建产物结构
132
+
133
+ ### 📚 文档
134
+
135
+ - 新增 `OPTIMIZATION.md` 文档,详细记录性能优化项
136
+ - 更新项目结构规范文档
137
+
8
138
  ## [2.0.0] - 2026-01-10
9
139
 
10
140
  ### 🎉 重大版本更新
package/README.md CHANGED
@@ -6,14 +6,17 @@
6
6
 
7
7
  ## ✨ 特性
8
8
 
9
+ - ✅ **多种策略**:提供 4 种 resize 策略(Basic、Linked、Flex、Flex-Linked),适应不同场景
9
10
  - ✅ **双向布局**:支持水平和垂直方向的布局
10
11
  - ✅ **拖拽调整**:可拖拽调整相邻面板的宽度/高度
11
12
  - ✅ **最小尺寸**:支持设置面板最小尺寸限制
12
13
  - ✅ **级联调整**:当面板达到最小值时,自动从相邻面板获取空间
13
14
  - ✅ **虚拟化拖拽**:支持虚拟节点模式,拖拽时创建虚拟框架,提升性能
15
+ - ✅ **性能优化**:节流优化、面板变化通知、自动冻结等多项性能优化
14
16
  - ✅ **TypeScript**:完整的 TypeScript 类型支持
15
- - ✅ **模块化架构**:清晰的目录结构,支持按需导入
17
+ - ✅ **模块化架构**:按策略分类的清晰目录结构,支持按需导入
16
18
  - ✅ **Tree-shaking**:支持 Tree-shaking,减少打包体积
19
+ - ✅ **代码压缩**:自动压缩代码,优化打包体积
17
20
 
18
21
  ## 📦 安装
19
22
 
@@ -27,44 +30,55 @@ pnpm add react-resize-demo
27
30
 
28
31
  ## 🚀 快速开始
29
32
 
30
- ### 基础用法
33
+ ### 基础用法(推荐使用 Flex-Linked 策略)
31
34
 
32
35
  ```tsx
33
- import { ResizablePanelGroup, ResizablePanel } from 'react-resize-demo';
36
+ import { ResizePanelGroupFlexLinked, ResizePanelFlexLinked } from 'react-resize-demo';
34
37
 
35
38
  function App() {
36
39
  return (
37
40
  <div style={{ width: '100%', height: '500px' }}>
38
- <ResizablePanelGroup direction="horizontal">
39
- <ResizablePanel minSize={100}>
41
+ <ResizePanelGroupFlexLinked direction="horizontal">
42
+ <ResizePanelFlexLinked minSize={100}>
40
43
  <div>Panel 1</div>
41
- </ResizablePanel>
42
- <ResizablePanel minSize={200}>
44
+ </ResizePanelFlexLinked>
45
+ <ResizePanelFlexLinked minSize={200}>
43
46
  <div>Panel 2</div>
44
- </ResizablePanel>
45
- <ResizablePanel minSize={300}>
47
+ </ResizePanelFlexLinked>
48
+ <ResizePanelFlexLinked minSize={300}>
46
49
  <div>Panel 3</div>
47
- </ResizablePanel>
48
- </ResizablePanelGroup>
50
+ </ResizePanelFlexLinked>
51
+ </ResizePanelGroupFlexLinked>
49
52
  </div>
50
53
  );
51
54
  }
52
55
  ```
53
56
 
57
+ ### 其他策略
58
+
59
+ 项目提供 4 种策略,可根据场景选择:
60
+
61
+ - **Basic 策略**:适合面板数量 < 10 的简单场景
62
+ - **Linked 策略**:适合面板数量 ≥ 10 的场景
63
+ - **Flex 策略**:适合需要精确控制占比的场景
64
+ - **Flex-Linked 策略**:适合大量面板 + 精确控制的场景(**推荐**)
65
+
66
+ 详细对比请查看 [策略对比文档](./docs/STRATEGY_COMPARISON.md)
67
+
54
68
  ### 垂直布局
55
69
 
56
70
  ```tsx
57
- <ResizablePanelGroup direction="vertical" style={{ height: '500px' }}>
58
- <ResizablePanel minSize={100}>
71
+ <ResizePanelGroupFlexLinked direction="vertical" style={{ height: '500px' }}>
72
+ <ResizePanelFlexLinked minSize={100}>
59
73
  <div>顶部面板</div>
60
- </ResizablePanel>
61
- <ResizablePanel minSize={200}>
74
+ </ResizePanelFlexLinked>
75
+ <ResizePanelFlexLinked minSize={200}>
62
76
  <div>中间面板</div>
63
- </ResizablePanel>
64
- <ResizablePanel minSize={100}>
77
+ </ResizePanelFlexLinked>
78
+ <ResizePanelFlexLinked minSize={100}>
65
79
  <div>底部面板</div>
66
- </ResizablePanel>
67
- </ResizablePanelGroup>
80
+ </ResizePanelFlexLinked>
81
+ </ResizePanelGroupFlexLinked>
68
82
  ```
69
83
 
70
84
  ### 虚拟化模式
@@ -73,17 +87,17 @@ function App() {
73
87
 
74
88
  ```tsx
75
89
  // 启用虚拟化(使用默认样式)
76
- <ResizablePanelGroup virtual={true}>
77
- <ResizablePanel minSize={100}>
90
+ <ResizePanelGroupFlexLinked virtual={true}>
91
+ <ResizePanelFlexLinked minSize={100}>
78
92
  <div>Panel 1</div>
79
- </ResizablePanel>
80
- <ResizablePanel minSize={200}>
93
+ </ResizePanelFlexLinked>
94
+ <ResizePanelFlexLinked minSize={200}>
81
95
  <div>Panel 2</div>
82
- </ResizablePanel>
83
- </ResizablePanelGroup>
96
+ </ResizePanelFlexLinked>
97
+ </ResizePanelGroupFlexLinked>
84
98
 
85
- // 启用虚拟化(自定义样式)
86
- <ResizablePanelGroup
99
+ // 启用虚拟化 + 面板变化通知(推荐)
100
+ <ResizePanelGroupFlexLinked
87
101
  virtual={true}
88
102
  virtualConfig={{
89
103
  style: {
@@ -93,14 +107,18 @@ function App() {
93
107
  },
94
108
  className: 'custom-virtual-node'
95
109
  }}
110
+ onPanelsChange={(changedIndices) => {
111
+ console.log('变化的面板:', Array.from(changedIndices));
112
+ // 只重新渲染变化的面板,提升性能
113
+ }}
96
114
  >
97
- <ResizablePanel minSize={100}>
115
+ <ResizePanelFlexLinked minSize={100}>
98
116
  <div>Panel 1</div>
99
- </ResizablePanel>
100
- <ResizablePanel minSize={200}>
117
+ </ResizePanelFlexLinked>
118
+ <ResizePanelFlexLinked minSize={200}>
101
119
  <div>Panel 2</div>
102
- </ResizablePanel>
103
- </ResizablePanelGroup>
120
+ </ResizePanelFlexLinked>
121
+ </ResizePanelGroupFlexLinked>
104
122
  ```
105
123
 
106
124
  ### 按需导入
@@ -109,14 +127,17 @@ function App() {
109
127
 
110
128
  ```tsx
111
129
  // 从主入口导入(推荐)
112
- import { ResizablePanelGroup, ResizablePanel } from 'react-resize-demo';
130
+ import { ResizePanelGroupFlexLinked, ResizePanelFlexLinked } from 'react-resize-demo';
113
131
 
114
132
  // 按需导入组件
115
- import { ResizablePanelGroup } from 'react-resize-demo/components/ResizePanelGroup';
116
- import { ResizablePanel } from 'react-resize-demo/components/ResizePanel';
133
+ import { ResizePanelGroupFlexLinked } from 'react-resize-demo/components';
134
+ import { ResizePanelFlexLinked } from 'react-resize-demo/components';
135
+
136
+ // 策略特定导入(高级用法)
137
+ import { ResizePanelGroupFlexLinked } from 'react-resize-demo/strategies/flex-linked/components/ResizePanelGroupFlexLinked';
117
138
 
118
- // 导入工具函数
119
- import { ResizeAbleCore } from 'react-resize-demo/utils';
139
+ // 导入核心工具
140
+ import { PanelManager } from 'react-resize-demo/core/PanelManager';
120
141
 
121
142
  // 导入类型
122
143
  import type { VirtualConfig, ResizeDirection } from 'react-resize-demo/types';
@@ -213,36 +234,43 @@ const {
213
234
  ```
214
235
  react-resize-demo/
215
236
  ├── src/ # 源代码目录
216
- │ ├── components/ # 组件目录
217
- │ │ ├── ResizePanelGroup/ # 容器组件
218
- │ │ │ └── index.tsx
219
- │ │ ├── ResizePanel/ # 面板组件
220
- │ │ │ └── index.tsx
221
- │ │ ├── ResizeHandle/ # 拖拽手柄组件
222
- │ │ │ └── index.tsx
223
- │ │ ├── shared/ # 共享资源
224
- │ │ └── context.tsx # Context 定义
225
- │ │ └── index.tsx # 组件统一导出
226
- │ ├── utils/ # 工具函数
227
- │ │ ├── resizeAble.ts # 拖拽调整核心类
228
- ├── virtualNode.ts # 虚拟节点管理模块
229
- │ │ └── index.ts # 工具函数导出
237
+ │ ├── strategies/ # 策略目录(按策略分类)
238
+ │ │ ├── basic/ # Basic 策略
239
+ │ │ │ ├── components/
240
+ │ │ ├── context.tsx
241
+ │ │ │ └── resizeAble.ts
242
+ │ │ ├── linked/ # Linked 策略
243
+ │ │ ├── flex/ # Flex 策略
244
+ │ │ └── flex-linked/ # Flex-Linked 策略(推荐)
245
+ ├── core/ # 核心工具(所有策略共享)
246
+ │ │ ├── PanelManager.ts
247
+ ├── virtualNode.ts
248
+ │ │ └── throttle.ts
249
+ │ ├── components/ # 组件统一导出
250
+ │ │ └── index.tsx
230
251
  │ ├── types/ # 类型定义
231
- │ │ └── index.ts # 所有类型定义
252
+ │ │ └── index.ts
232
253
  │ └── index.ts # 主入口文件
233
254
  ├── demo/ # 本地测试Demo
234
- │ ├── App.tsx # Demo应用
255
+ │ ├── StrategyComparison.tsx # 策略对比演示
235
256
  │ └── ...
257
+ ├── docs/ # 文档目录
258
+ │ ├── STRATEGY_COMPARISON.md # 策略对比文档
259
+ │ ├── PERFORMANCE_TIMELINE.md # 性能优化时间线
260
+ │ ├── THROTTLE_OPTIMIZATION.md # 节流优化文档
261
+ │ └── PANEL_CHANGE_NOTIFICATION.md # 面板变化通知文档
236
262
  ├── dist/ # 构建输出目录
237
263
  │ ├── index.js # CJS 主入口
238
264
  │ ├── esm/ # ESM 模块
239
- │ ├── components/ # CJS 组件
240
- │ ├── utils/ # CJS 工具
265
+ │ ├── strategies/ # 策略目录
266
+ │ ├── core/ # 核心工具
241
267
  │ └── types/ # 类型定义
242
268
  ├── rollup.config.mjs # Rollup构建配置
243
269
  └── package.json # 项目配置
244
270
  ```
245
271
 
272
+ 详细的项目结构说明请查看 [PROJECT_STRUCTURE.md](./PROJECT_STRUCTURE.md)
273
+
246
274
  ## 🔧 开发
247
275
 
248
276
  ### 安装依赖
@@ -313,32 +341,58 @@ npm run build:watch
313
341
 
314
342
  ## 🔄 迁移指南
315
343
 
316
- ### 从 1.x 升级到 2.0
344
+ ### 从 2.x 升级到 3.0
317
345
 
318
- 2.0 版本保持了向后兼容,现有代码无需修改即可使用:
346
+ 3.0 版本引入了策略分类架构,推荐使用 Flex-Linked 策略:
319
347
 
320
348
  ```tsx
321
- // 仍然可用(向后兼容)
322
- import { ResizeablePanelGroup, ResizeablePanel } from 'react-resize-demo';
349
+ // 2.x 版本(仍然可用,向后兼容)
350
+ import { ResizePanelGroup, ResizePanel } from 'react-resize-demo';
323
351
 
324
- // 推荐使用新的正确拼写
325
- import { ResizablePanelGroup, ResizablePanel } from 'react-resize-demo';
352
+ // 3.0 版本(推荐)
353
+ import { ResizePanelGroupFlexLinked, ResizePanelFlexLinked } from 'react-resize-demo';
326
354
  ```
327
355
 
328
356
  ### 新功能
329
357
 
330
- 如果你想要使用新的分层导入功能:
358
+ 3.0 版本新增了多种策略和性能优化:
331
359
 
332
360
  ```tsx
333
- // 按需导入,更好的 Tree-shaking
334
- import { ResizablePanelGroup } from 'react-resize-demo/components/ResizePanelGroup';
335
- import { ResizablePanel } from 'react-resize-demo/components/ResizePanel';
361
+ // 使用 Flex-Linked 策略(推荐,性能最佳)
362
+ import { ResizePanelGroupFlexLinked, ResizePanelFlexLinked } from 'react-resize-demo';
363
+
364
+ // 启用面板变化通知(性能优化)
365
+ <ResizePanelGroupFlexLinked
366
+ onPanelsChange={(changedIndices) => {
367
+ // 只重新渲染变化的面板
368
+ }}
369
+ >
370
+ {/* ... */}
371
+ </ResizePanelGroupFlexLinked>
336
372
  ```
337
373
 
374
+ 详细迁移指南请查看 [策略对比文档](./docs/STRATEGY_COMPARISON.md)
375
+
338
376
  ## 📝 版本历史
339
377
 
340
378
  查看 [CHANGELOG.md](./CHANGELOG.md) 了解详细的版本变更历史。
341
379
 
380
+ ## ⚡ 性能优化
381
+
382
+ 项目经过多轮性能优化,从初始版本的 30-40 FPS 提升到当前的 50-55 FPS:
383
+
384
+ - **节流优化**:使用 `requestAnimationFrame` 节流,减少 DOM 操作 50-70%
385
+ - **虚拟化拖拽**:拖拽过程中不操作真实 DOM,减少重排和重绘
386
+ - **面板变化通知**:只重新渲染变化的面板,减少 React 渲染 70%
387
+ - **自动冻结**:自动冻结未变化面板,减少布局计算 85%
388
+ - **链表优化**:大量面板场景下性能提升 42.9%
389
+
390
+ 详细优化时间线和性能对比请查看:
391
+ - [性能优化时间线](./docs/PERFORMANCE_TIMELINE.md)
392
+ - [构建优化文档](./OPTIMIZATION.md)
393
+ - [节流优化文档](./docs/THROTTLE_OPTIMIZATION.md)
394
+ - [面板变化通知文档](./docs/PANEL_CHANGE_NOTIFICATION.md)
395
+
342
396
  ## 📄 License
343
397
 
344
398
  MIT
@@ -0,0 +1,2 @@
1
+ "use strict";exports.PanelManager=class{constructor(){Object.defineProperty(this,"indexMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"elementMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"head",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"tail",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"nextIndex",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"freeIndices",{enumerable:!0,configurable:!0,writable:!0,value:[]})}register(e,t){const n=this.elementMap.get(e);if(n)return n.info={panelEl:e,minSize:t},n.index;let i;this.freeIndices.length>0?(this.freeIndices.sort((e,t)=>e-t),i=this.freeIndices[0]<this.nextIndex?this.freeIndices.shift():this.nextIndex++):i=this.nextIndex++;const l={index:i,info:{panelEl:e,minSize:t},prev:this.tail,next:null};return this.tail?this.tail.next=l:this.head=l,this.tail=l,this.indexMap.set(i,l),this.elementMap.set(e,l),i}unregister(e){const t=this.elementMap.get(e);t&&(t.prev?t.prev.next=t.next:this.head=t.next,t.next?t.next.prev=t.prev:this.tail=t.prev,this.freeIndices.push(t.index),this.indexMap.delete(t.index),this.elementMap.delete(e))}getByIndex(e){return this.indexMap.get(e)?.info||null}getIndex(e){return this.elementMap.get(e)?.index||-1}getPrev(e){return e.prev||null}getNext(e){return e.next||null}getHead(){return this.head||null}getTail(){return this.tail||null}getNodeByElement(e){return this.elementMap.get(e)||null}getNodeByIndex(e){return this.indexMap.get(e)||null}getAllPanels(){const e=[];let t=this.head;for(;t;)e.push(t.info),t=t.next;return e}getAllPanelElements(){const e=[];let t=this.head;for(;t;)e.push(t.info.panelEl),t=t.next;return e}getCount(){return this.indexMap.size}clear(){this.indexMap.clear(),this.elementMap.clear(),this.head=null,this.tail=null,this.nextIndex=0,this.freeIndices=[]}forEach(e){let t=this.head,n=0;for(;t;)e(t,n),t=t.next,n++}};
2
+ //# sourceMappingURL=PanelManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelManager.js","sources":["../../src/core/PanelManager.ts"],"sourcesContent":[null],"names":["constructor","Object","defineProperty","this","value","Map","register","panelEl","minSize","existingNode","elementMap","get","info","index","freeIndices","length","sort","a","b","nextIndex","shift","node","prev","tail","next","head","indexMap","set","unregister","push","delete","getByIndex","getIndex","getPrev","getNext","getHead","getTail","getNodeByElement","getNodeByIndex","getAllPanels","panels","current","getAllPanelElements","elements","getCount","size","clear","forEach","callback"],"mappings":"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"}
@@ -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 e{constructor(){Object.defineProperty(this,"indexMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"elementMap",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"head",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"tail",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"nextIndex",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"freeIndices",{enumerable:!0,configurable:!0,writable:!0,value:[]})}register(e,t){const n=this.elementMap.get(e);if(n)return n.info={panelEl:e,minSize:t},n.index;let i;this.freeIndices.length>0?(this.freeIndices.sort((e,t)=>e-t),i=this.freeIndices[0]<this.nextIndex?this.freeIndices.shift():this.nextIndex++):i=this.nextIndex++;const l={index:i,info:{panelEl:e,minSize:t},prev:this.tail,next:null};return this.tail?this.tail.next=l:this.head=l,this.tail=l,this.indexMap.set(i,l),this.elementMap.set(e,l),i}unregister(e){const t=this.elementMap.get(e);t&&(t.prev?t.prev.next=t.next:this.head=t.next,t.next?t.next.prev=t.prev:this.tail=t.prev,this.freeIndices.push(t.index),this.indexMap.delete(t.index),this.elementMap.delete(e))}getByIndex(e){return this.indexMap.get(e)?.info||null}getIndex(e){return this.elementMap.get(e)?.index||-1}getPrev(e){return e.prev||null}getNext(e){return e.next||null}getHead(){return this.head||null}getTail(){return this.tail||null}getNodeByElement(e){return this.elementMap.get(e)||null}getNodeByIndex(e){return this.indexMap.get(e)||null}getAllPanels(){const e=[];let t=this.head;for(;t;)e.push(t.info),t=t.next;return e}getAllPanelElements(){const e=[];let t=this.head;for(;t;)e.push(t.info.panelEl),t=t.next;return e}getCount(){return this.indexMap.size}clear(){this.indexMap.clear(),this.elementMap.clear(),this.head=null,this.tail=null,this.nextIndex=0,this.freeIndices=[]}forEach(e){let t=this.head,n=0;for(;t;)e(t,n),t=t.next,n++}}export{e as PanelManager};
2
+ //# sourceMappingURL=PanelManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelManager.js","sources":["../../../src/core/PanelManager.ts"],"sourcesContent":[null],"names":["PanelManager","constructor","Object","defineProperty","this","value","Map","register","panelEl","minSize","existingNode","elementMap","get","info","index","freeIndices","length","sort","a","b","nextIndex","shift","node","prev","tail","next","head","indexMap","set","unregister","push","delete","getByIndex","getIndex","getPrev","getNext","getHead","getTail","getNodeByElement","getNodeByIndex","getAllPanels","panels","current","getAllPanelElements","elements","getCount","size","clear","forEach","callback"],"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":"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"}
@@ -1,3 +1,14 @@
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 { ResizePanelGroupLinked, ResizePanelGroupLinkedProps } from './strategies/linked/components/ResizePanelGroupLinked/index.js';
6
+ export { ResizePanelLinked, ResizePanelLinkedProps } from './strategies/linked/components/ResizePanelLinked/index.js';
7
+ export { ResizeHandleLinked, ResizeHandleLinkedProps } from './strategies/linked/components/ResizeHandleLinked/index.js';
8
+ export { ResizableContextLinked, ResizableContextLinkedValue, useResizableContextLinked } from './strategies/linked/context.js';
9
+ export { ResizePanelGroupFlex, ResizePanelGroupFlexProps } from './strategies/flex/components/ResizePanelGroupFlex/index.js';
10
+ export { ResizeHandleFlex, ResizeHandleFlexProps } from './strategies/flex/components/ResizeHandleFlex/index.js';
11
+ export { ResizePanelGroupFlexLinked, ResizePanelGroupFlexLinkedProps } from './strategies/flex-linked/components/ResizePanelGroupFlexLinked/index.js';
12
+ export { ResizePanelFlexLinked, ResizePanelFlexLinkedProps } from './strategies/flex-linked/components/ResizePanelFlexLinked/index.js';
13
+ export { ResizeHandleFlexLinked, ResizeHandleFlexLinkedProps } from './strategies/flex-linked/components/ResizeHandleFlexLinked/index.js';
14
+ export { OptimizationStrategy, PanelInfo, PanelNode, ResizeAbleCoreLinkedOptions, ResizeAbleCoreOptions, ResizeDirection, VirtualConfig, VirtualNodeConfig } from './types/index.js';
package/dist/esm/index.js CHANGED
@@ -1,6 +1,2 @@
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
- import 'react/jsx-runtime';
4
- import 'react';
5
- import './components/shared/context.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{ResizePanelGroupLinked}from"./strategies/linked/components/ResizePanelGroupLinked/index.js";export{ResizePanelLinked}from"./strategies/linked/components/ResizePanelLinked/index.js";export{ResizeHandleLinked}from"./strategies/linked/components/ResizeHandleLinked/index.js";export{ResizePanelGroupFlex}from"./strategies/flex/components/ResizePanelGroupFlex/index.js";export{ResizeHandleFlex}from"./strategies/flex/components/ResizeHandleFlex/index.js";export{ResizePanelGroupFlexLinked}from"./strategies/flex-linked/components/ResizePanelGroupFlexLinked/index.js";export{ResizePanelFlexLinked}from"./strategies/flex-linked/components/ResizePanelFlexLinked/index.js";export{ResizeHandleFlexLinked}from"./strategies/flex-linked/components/ResizeHandleFlexLinked/index.js";export{ResizableContext,useResizableContext}from"./strategies/basic/context.js";export{ResizableContextLinked,useResizableContextLinked}from"./strategies/linked/context.js";
6
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { ResizeDirection } from '../../../../types/index.js';
3
+
4
+ /**
5
+ * 拖拽手柄组件(常规策略)
6
+ * 负责处理面板之间的拖拽调整功能
7
+ * 使用 ResizeAbleCore(常规策略)
8
+ */
9
+
10
+ interface ResizeHandleProps {
11
+ prePanelIndex: number;
12
+ nextPanelIndex: number;
13
+ direction: ResizeDirection;
14
+ }
15
+ declare const ResizeHandle: React.FC<ResizeHandleProps>;
16
+
17
+ export { ResizeHandle };
18
+ export type { ResizeHandleProps };
@@ -0,0 +1,2 @@
1
+ import{jsx as e}from"react/jsx-runtime";import{useRef as n,useEffect as t}from"react";import r from"../../resizeAble.js";import{useResizableContext as o}from"../../context.js";const i=({prePanelIndex:i,nextPanelIndex:l,direction:s})=>{const u=n(null),c=n(null),{getPanelInfo:a,panelCount:d,virtualConfig:m}=o();t(()=>{if(!u.current)return;const e=a(i),n=a(l);if(!e||!n)return;const t=u.current?"horizontal"===s?u.current.offsetWidth:u.current.offsetHeight:10;c.current=new r({prePanelEl:e.panelEl,nextPanelEl:n.panelEl,getPanelInfo:a,prePanelIndex:i,nextPanelIndex:l,direction:s,virtualEnabled:m.enabled||!1,virtualConfig:{style:m.style,className:m.className},handleSize:t});const o=u.current;if(!o)return;let d=!1,f=0;const p=e=>{e.preventDefault(),e.stopPropagation(),d=!0,f="horizontal"===s?e.clientX:e.clientY,c.current&&c.current.startResize()},v=e=>{if(!d||!c.current)return;const n=("horizontal"===s?e.clientX:e.clientY)-f;c.current.onResize(n)},x=()=>{d&&c.current&&(d=!1,c.current.endResize())};return o.addEventListener("mousedown",p),document.addEventListener("mousemove",v),document.addEventListener("mouseup",x),()=>{o.removeEventListener("mousedown",p),document.removeEventListener("mousemove",v),document.removeEventListener("mouseup",x),c.current&&(c.current.destroy(),c.current=null)}},[i,l,s,a,d,m]);const f="horizontal"===s;return e("div",{ref:u,style:{position:"relative",width:f?"10px":"100%",height:f?"100%":"10px",backgroundColor:"#000",cursor:f?"ew-resize":"ns-resize",zIndex:1e3,flexShrink:0}})};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","handleRef","useRef","coreInstanceRef","getPanelInfo","panelCount","virtualConfig","useResizableContext","useEffect","current","prePanelInfo","nextPanelInfo","handleSize","offsetWidth","offsetHeight","ResizeAbleCore","prePanelEl","panelEl","nextPanelEl","virtualEnabled","enabled","style","className","handleEl","isResizing","startPos","startResize","e","preventDefault","stopPropagation","clientX","clientY","onResizeMove","delta","onResize","endResize","addEventListener","document","removeEventListener","destroy","isHorizontal","_jsx","ref","position","width","height","backgroundColor","cursor","zIndex","flexShrink"],"mappings":"gLAgBO,MAAMA,EAA4C,EACrDC,gBACAC,iBACAC,gBAEA,MAAMC,EAAYC,EAAuB,MACnCC,EAAkBD,EAAmD,OACrEE,aAAEA,EAAYC,WAAEA,EAAUC,cAAEA,GAAkBC,IAEpDC,EAAU,KACN,IAAKP,EAAUQ,QACX,OAIJ,MAAMC,EAAeN,EAAaN,GAC5Ba,EAAgBP,EAAaL,GACnC,IAAIW,IAAiBC,EAEjB,OAIJ,MAAMC,EAAaX,EAAUQ,QACR,eAAdT,EACGC,EAAUQ,QAAQI,YAClBZ,EAAUQ,QAAQK,aACQ,GAGpCX,EAAgBM,QAAU,IAAIM,EAAe,CACzCC,WAAYN,EAAaO,QACzBC,YAAaP,EAAcM,QAC3Bb,eACAN,gBACAC,iBACAC,YACAmB,eAAgBb,EAAcc,UAAW,EACzCd,cAAe,CACXe,MAAOf,EAAce,MACrBC,UAAWhB,EAAcgB,WAE7BV,eAIJ,MAAMW,EAAWtB,EAAUQ,QAC3B,IAAKc,EAAU,OAEf,IAAIC,GAAa,EACbC,EAAW,EAEf,MAAMC,EAAeC,IACjBA,EAAEC,iBACFD,EAAEE,kBACFL,GAAa,EACbC,EAAyB,eAAdzB,EAA6B2B,EAAEG,QAAUH,EAAEI,QAClD5B,EAAgBM,SAChBN,EAAgBM,QAAQiB,eAI1BM,EAAgBL,IAClB,IAAIH,IAAerB,EAAgBM,QAAS,OAC5C,MACMwB,GAD2B,eAAdjC,EAA6B2B,EAAEG,QAAUH,EAAEI,SACnCN,EAE3BtB,EAAgBM,QAAQyB,SAASD,IAG/BE,EAAY,KACXX,GAAcrB,EAAgBM,UAC7Be,GAAa,EACbrB,EAAgBM,QAAQ0B,cAQhC,OAJAZ,EAASa,iBAAiB,YAAaV,GACvCW,SAASD,iBAAiB,YAAaJ,GACvCK,SAASD,iBAAiB,UAAWD,GAE9B,KACHZ,EAASe,oBAAoB,YAAaZ,GAC1CW,SAASC,oBAAoB,YAAaN,GAC1CK,SAASC,oBAAoB,UAAWH,GACrChC,EAAgBM,UACfN,EAAgBM,QAAQ8B,UACxBpC,EAAgBM,QAAU,QAGnC,CAACX,EAAeC,EAAgBC,EAAWI,EAAcC,EAAYC,IAExE,MAAMkC,EAA6B,eAAdxC,EACrB,OACIyC,EAAA,MAAA,CACIC,IAAKzC,EACLoB,MAAO,CACHsB,SAAU,WACVC,MAAOJ,EAAe,OAAS,OAC/BK,OAAQL,EAAe,OAAS,OAChCM,gBAAiB,OACjBC,OAAQP,EAAe,YAAc,YACrCQ,OAAQ,IACRC,WAAY"}
@@ -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,9 @@
1
1
  import React from 'react';
2
- import { ResizeDirection, VirtualConfig } from '../../types/index.js';
2
+ import { ResizeDirection, VirtualConfig } from '../../../../types/index.js';
3
3
 
4
4
  /**
5
- * 可调整大小的面板组容器组件
6
- * 负责管理多个面板的布局和拖拽手柄的插入
5
+ * 可调整大小的面板组容器组件(常规策略)
6
+ * 使用数组存储面板信息,适合面板数量较少的场景
7
7
  */
8
8
 
9
9
  interface ResizePanelGroupProps {
@@ -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:s=!1,virtualConfig:d={}})=>{const h=n([]),f=n(new Map),[p,g]=t(0),m=l((e,r)=>{const n=f.current.get(e);if(void 0!==n)return h.current[n]={panelEl:e,minSize:r},n;let t=-1;for(let e=0;e<h.current.length;e++)if(!h.current[e]){t=e;break}return-1===t?(t=h.current.length,h.current.push({panelEl:e,minSize:r})):h.current[t]={panelEl:e,minSize:r},f.current.set(e,t),g(h.current.filter(e=>null!=e).length),t},[]),x=l(e=>{const r=f.current.get(e);void 0!==r&&(h.current[r]=null,f.current.delete(e),g(h.current.filter(e=>null!=e).length))},[]),v=l(e=>{if(e<0||e>=h.current.length)return null;const r=h.current[e];return r&&r.panelEl?r:null},[]),P=l(e=>f.current.get(e)??-1,[]),z=r.Children.toArray(u),E=[];z.forEach((r,n)=>{E.push(r),n<z.length-1&&E.push(e(o,{prePanelIndex:n,nextPanelIndex:n+1,direction:c},`handle-${n}`))});const I={enabled:s,...d},y={panelCount:p,registerPanel:m,unregisterPanel:x,getPanelInfo:v,getPanelIndex:P,direction:c,panelInfos:h.current.filter(e=>null!=e),virtualConfig:I};return e(i.Provider,{value:y,children:e("div",{style:{display:"flex",flexDirection:"horizontal"===c?"row":"column",height:"100%",position:"relative",...a},children:E})})};export{u as ResizePanelGroup};
2
+ //# sourceMappingURL=index.js.map