react-resize-demo 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,76 @@
1
+ # Changelog
2
+
3
+ 所有重要的项目变更都会记录在此文件中。
4
+
5
+ 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
6
+ 版本号遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。
7
+
8
+ ## [1.0.3] - 2026-01-09
9
+
10
+ ### 新增
11
+ - ✨ 添加虚拟化拖拽功能
12
+ - 支持虚拟化模式,拖拽时创建虚拟节点框架,拖拽结束后再应用到真实节点
13
+ - 虚拟化模式下,拖拽过程中只更新虚拟节点尺寸,不影响真实节点,提升性能
14
+ - 支持自定义虚拟节点样式和类名
15
+ - 默认关闭虚拟化,保持向后兼容
16
+
17
+ ### 改进
18
+ - 🔧 优化虚拟节点位置计算逻辑
19
+ - 修复虚拟节点位置计算,确保虚拟节点边框正确对应真实节点边框位置
20
+ - 在位置计算中考虑拖拽器(ResizeHandle)的宽度/高度
21
+ - 修复最后一个面板位置计算错误的问题
22
+
23
+ ### 技术改进
24
+ - 🏗️ 模块化虚拟节点管理
25
+ - 创建独立的 `VirtualNodeManager` 类管理虚拟节点的创建、更新、销毁
26
+ - 虚拟节点逻辑完全模块化,便于维护和扩展
27
+ - 优化虚拟节点创建性能,只复制必要的 DOM 结构
28
+
29
+ ## [1.0.2] - 2025-01-08
30
+
31
+ ### 修复
32
+ - 修复了垂直布局时无法正常调整的问题
33
+ - 将面板命名从 left/right 改为 pre/next,使代码更通用,适用于水平和垂直两种布局方向
34
+ - 修复了垂直布局时错误地设置 width 的问题,现在根据 direction 动态设置 width 或 height
35
+ - 水平布局:pre 为左侧面板,next 为右侧面板,调整 width
36
+ - 垂直布局:pre 为上方面板,next 为下方面板,调整 height
37
+
38
+ ### 重构
39
+ - 重构了核心类 `ResizeAbleCore` 的命名体系
40
+ - `leftPanelEl/rightPanelEl` → `prePanelEl/nextPanelEl`
41
+ - `leftPanelIndex/rightPanelIndex` → `prePanelIndex/nextPanelIndex`
42
+ - `adjustPanelsRight/adjustPanelsLeft` → `adjustPanelsNext/adjustPanelsPre`
43
+ - 更新了 `ResizeHandle` 组件的 props 命名
44
+ - `leftPanelIndex/rightPanelIndex` → `prePanelIndex/nextPanelIndex`
45
+
46
+ ## [1.0.1] - 2025-01-08
47
+
48
+ ### 修复
49
+ - 修复了向左拖拽时调整逻辑错误的问题
50
+ - 之前错误地从后续面板获取空间,现在正确地从前面面板获取空间
51
+ - 实现了正确的"依次后延"效果
52
+ - 修复了拖拽器初始化时序问题
53
+ - 解决了 `ResizeHandle` 组件在面板注册完成前执行导致无法获取面板信息的问题
54
+ - 通过添加 `panelCount` 状态跟踪和依赖检查来确保面板已注册后再初始化拖拽器
55
+
56
+ ### 改进
57
+ - 重构了拖拽器与面板的耦合关系
58
+ - 将拖拽器从面板内部解耦,作为独立组件插入到面板之间
59
+ - 拖拽器现在只负责检测移动轨迹,根据方向调整相邻面板的宽度
60
+ - 实现了拖拽器和选项卡的完全解耦
61
+
62
+ ### 技术改进
63
+ - 优化了 Context 更新机制,使用 `useState` 跟踪面板数量变化
64
+ - 改进了类型定义,修复了 TypeScript 类型错误
65
+ - 优化了依赖项管理,避免不必要的重新渲染
66
+
67
+ ## [1.0.0] - 初始版本
68
+
69
+ ### 新增
70
+ - 初始发布
71
+ - 实现了可调整大小的面板组件 `ResizeablePanel` 和 `ResizeablePanelGroup`
72
+ - 支持水平和垂直方向的布局
73
+ - 支持设置面板最小尺寸
74
+ - 支持拖拽调整相邻面板的宽度/高度
75
+ - 实现了级联调整:当面板达到最小值时,自动从相邻面板获取空间
76
+
package/README.md ADDED
@@ -0,0 +1,257 @@
1
+ # react-resize-demo
2
+
3
+ 一个 React 可调整大小面板组件库,支持水平和垂直方向的布局调整。
4
+
5
+ ## 特性
6
+
7
+ - ✅ 支持水平和垂直方向的布局
8
+ - ✅ 可拖拽调整相邻面板的宽度/高度
9
+ - ✅ 支持设置面板最小尺寸
10
+ - ✅ 级联调整:当面板达到最小值时,自动从相邻面板获取空间
11
+ - ✅ 拖拽器与面板完全解耦,灵活可扩展
12
+ - ✅ **虚拟化拖拽**:支持虚拟节点模式,拖拽时创建虚拟框架,提升性能
13
+ - ✅ TypeScript 支持
14
+
15
+ ## 安装
16
+
17
+ ```bash
18
+ npm install react-resize-demo
19
+ ```
20
+
21
+ ## 使用
22
+
23
+ ```tsx
24
+ import { ResizeablePanelGroup, ResizeablePanel } from 'react-resize-demo';
25
+
26
+ function App() {
27
+ return (
28
+ <div style={{ width: '100%', height: '500px' }}>
29
+ <ResizeablePanelGroup direction="horizontal">
30
+ <ResizeablePanel minSize={100} onResize={(width) => console.log(width)}>
31
+ <div>Panel 1</div>
32
+ </ResizeablePanel>
33
+ <ResizeablePanel minSize={200}>
34
+ <div>Panel 2</div>
35
+ </ResizeablePanel>
36
+ <ResizeablePanel minSize={300}>
37
+ <div>Panel 3</div>
38
+ </ResizeablePanel>
39
+ </ResizeablePanelGroup>
40
+ </div>
41
+ );
42
+ }
43
+ ```
44
+
45
+ ### 垂直布局
46
+
47
+ ```tsx
48
+ <ResizeablePanelGroup direction="vertical" style={{ height: '500px' }}>
49
+ <ResizeablePanel minSize={100}>
50
+ <div>顶部面板</div>
51
+ </ResizeablePanel>
52
+ <ResizeablePanel minSize={200}>
53
+ <div>中间面板</div>
54
+ </ResizeablePanel>
55
+ <ResizeablePanel minSize={100}>
56
+ <div>底部面板</div>
57
+ </ResizeablePanel>
58
+ </ResizeablePanelGroup>
59
+ ```
60
+
61
+ ### 虚拟化模式
62
+
63
+ 虚拟化模式可以在拖拽时创建虚拟节点框架,拖拽过程中只更新虚拟节点,拖拽结束后再应用到真实节点。这可以提升性能,特别是在处理复杂内容的面板时。
64
+
65
+ ```tsx
66
+ // 启用虚拟化(使用默认样式)
67
+ <ResizeablePanelGroup virtual={true}>
68
+ <ResizeablePanel minSize={100}>
69
+ <div>Panel 1</div>
70
+ </ResizeablePanel>
71
+ <ResizeablePanel minSize={200}>
72
+ <div>Panel 2</div>
73
+ </ResizeablePanel>
74
+ </ResizeablePanelGroup>
75
+
76
+ // 启用虚拟化(自定义样式)
77
+ <ResizeablePanelGroup
78
+ virtual={true}
79
+ virtualConfig={{
80
+ style: {
81
+ opacity: 0.5,
82
+ border: '2px dashed blue',
83
+ backgroundColor: 'rgba(0, 123, 255, 0.1)'
84
+ },
85
+ className: 'custom-virtual-node'
86
+ }}
87
+ >
88
+ <ResizeablePanel minSize={100}>
89
+ <div>Panel 1</div>
90
+ </ResizeablePanel>
91
+ <ResizeablePanel minSize={200}>
92
+ <div>Panel 2</div>
93
+ </ResizeablePanel>
94
+ </ResizeablePanelGroup>
95
+ ```
96
+
97
+ ## API
98
+
99
+ ### ResizeablePanelGroup
100
+
101
+ 面板组容器组件,用于包裹多个 `ResizeablePanel`。
102
+
103
+ | 属性 | 类型 | 默认值 | 说明 |
104
+ |------|------|--------|------|
105
+ | direction | `'horizontal' \| 'vertical'` | `'horizontal'` | 布局方向 |
106
+ | virtual | `boolean` | `false` | 是否启用虚拟化模式 |
107
+ | virtualConfig | `VirtualConfig` | `{}` | 虚拟化配置(仅在 virtual=true 时生效) |
108
+ | style | `React.CSSProperties` | - | 自定义样式 |
109
+
110
+ #### VirtualConfig
111
+
112
+ 虚拟化配置对象:
113
+
114
+ | 属性 | 类型 | 默认值 | 说明 |
115
+ |------|------|--------|------|
116
+ | enabled | `boolean` | `false` | 是否启用虚拟化(通常通过 `virtual` prop 设置) |
117
+ | style | `React.CSSProperties` | - | 虚拟节点的自定义样式 |
118
+ | className | `string` | - | 虚拟节点的自定义类名 |
119
+
120
+ ### ResizeablePanel
121
+
122
+ 可调整大小的面板组件。
123
+
124
+ | 属性 | 类型 | 默认值 | 说明 |
125
+ |------|------|--------|------|
126
+ | minSize | `number` | `100` | 面板最小尺寸(像素) |
127
+ | onResize | `(width: number) => void` | - | 面板尺寸变化时的回调函数 |
128
+ | children | `React.ReactNode` | - | 面板内容 |
129
+
130
+ ## 开发
131
+
132
+ ### 安装依赖
133
+
134
+ ```bash
135
+ npm install
136
+ ```
137
+
138
+ ### 构建库
139
+
140
+ ```bash
141
+ npm run build
142
+ ```
143
+
144
+ ### 运行本地Demo
145
+
146
+ ```bash
147
+ npm run demo
148
+ ```
149
+
150
+ 这将启动一个开发服务器,你可以在浏览器中查看和测试组件。
151
+
152
+ ### 构建Demo
153
+
154
+ ```bash
155
+ npm run demo:build
156
+ ```
157
+
158
+ ## 工作原理
159
+
160
+ 组件通过拖拽器(ResizeHandle)来调整相邻面板的尺寸:
161
+ - **向右拖拽**:扩大左侧面板,缩小右侧面板(如果右侧面板达到最小值,继续从后续面板获取空间)
162
+ - **向左拖拽**:缩小左侧面板,扩大右侧面板(如果左侧面板达到最小值,继续从前面面板获取空间)
163
+
164
+ 拖拽器会自动插入到相邻面板之间,无需手动添加。
165
+
166
+ ### 虚拟化模式
167
+
168
+ 当启用虚拟化模式(`virtual={true}`)时:
169
+ 1. **拖拽开始**:为所有相关面板创建虚拟节点框架,虚拟节点覆盖在原节点上
170
+ 2. **拖拽中**:只更新虚拟节点的尺寸和位置,真实节点保持不变
171
+ 3. **拖拽结束**:将虚拟节点的最终尺寸应用到真实节点,然后清理所有虚拟节点
172
+
173
+ 这种模式可以:
174
+ - 提升性能:拖拽过程中不操作真实 DOM,减少重排和重绘
175
+ - 提供视觉反馈:虚拟节点可以有不同的样式(如半透明、虚线边框等)
176
+ - 适用于复杂内容:当面板内容复杂时,虚拟化可以避免拖拽时的性能问题
177
+
178
+ ## 项目结构
179
+
180
+ ```
181
+ react-resize-demo/
182
+ ├── src/ # 源代码目录
183
+ │ ├── components/ # 组件目录
184
+ │ │ ├── ResizePanel/ # 可调整大小面板组件
185
+ │ │ └── ExampleComponent/ # 示例组件
186
+ │ ├── core/ # 核心逻辑
187
+ │ │ ├── resizeAble.js # 拖拽调整核心类
188
+ │ │ └── virtualNode.js # 虚拟节点管理模块
189
+ │ ├── utils/ # 工具函数
190
+ │ ├── types/ # 类型定义
191
+ │ └── index.ts # 入口文件
192
+ ├── demo/ # 本地测试Demo
193
+ │ ├── App.tsx # Demo应用
194
+ │ ├── main.tsx # Demo入口
195
+ │ └── index.html # HTML模板
196
+ ├── dist/ # 构建输出目录
197
+ ├── rollup.config.mjs # Rollup构建配置
198
+ ├── vite.config.ts # Vite库构建配置
199
+ ├── vite.demo.config.ts # Vite Demo配置
200
+ ├── CHANGELOG.md # 变更日志
201
+ └── package.json # 项目配置
202
+ ```
203
+
204
+ ## 开发
205
+
206
+ ### 安装依赖
207
+
208
+ ```bash
209
+ npm install
210
+ ```
211
+
212
+ ### 构建库
213
+
214
+ ```bash
215
+ npm run build
216
+ ```
217
+
218
+ ### 运行本地Demo
219
+
220
+ ```bash
221
+ npm run demo
222
+ ```
223
+
224
+ 这将启动一个开发服务器,你可以在浏览器中查看和测试组件。
225
+
226
+ ### 构建Demo
227
+
228
+ ```bash
229
+ npm run demo:build
230
+ ```
231
+
232
+ ### 类型检查
233
+
234
+ ```bash
235
+ npm run type-check
236
+ ```
237
+
238
+ ### 代码检查
239
+
240
+ ```bash
241
+ npm run lint
242
+ ```
243
+
244
+ ## 版本历史
245
+
246
+ 查看 [CHANGELOG.md](./CHANGELOG.md) 了解详细的版本变更历史。
247
+
248
+ ## 发布到npm
249
+
250
+ 1. 确保代码已构建:`npm run build`
251
+ 2. 更新版本号:`npm version patch|minor|major`
252
+ 3. 发布:`npm publish`
253
+
254
+ ## License
255
+
256
+ MIT
257
+
@@ -0,0 +1,8 @@
1
+ export declare const ResizeHandle: ({ onResizeStart, onResize, onResizeEnd, direction, style, }: {
2
+ onResizeStart: any;
3
+ onResize: any;
4
+ onResizeEnd: any;
5
+ direction?: string | undefined;
6
+ style: any;
7
+ }) => import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ResizeHandle/index.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,GAAI;;;;;;CAM5B,4CA6DA,CAAC"}
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ export interface VirtualConfig {
3
+ enabled?: boolean;
4
+ style?: React.CSSProperties;
5
+ className?: string;
6
+ }
7
+ export declare const ResizeablePanelGroup: React.FC<{
8
+ children: React.ReactNode;
9
+ direction?: 'horizontal' | 'vertical';
10
+ virtual?: boolean;
11
+ virtualConfig?: VirtualConfig;
12
+ style?: React.CSSProperties;
13
+ }>;
14
+ export declare const ResizeablePanel: React.FC<{
15
+ children: React.ReactNode;
16
+ minSize?: number;
17
+ onResize?: (width: number) => void;
18
+ }>;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ResizePanel/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAS7D,MAAM,WAAW,aAAa;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAsBD,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC/B,CA+EA,CAAA;AAGD,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,CAmCA,CAAA"}
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+
3
+ interface VirtualConfig {
4
+ enabled?: boolean;
5
+ style?: React.CSSProperties;
6
+ className?: string;
7
+ }
8
+ declare const ResizeablePanelGroup: React.FC<{
9
+ children: React.ReactNode;
10
+ direction?: 'horizontal' | 'vertical';
11
+ virtual?: boolean;
12
+ virtualConfig?: VirtualConfig;
13
+ style?: React.CSSProperties;
14
+ }>;
15
+ declare const ResizeablePanel: React.FC<{
16
+ children: React.ReactNode;
17
+ minSize?: number;
18
+ onResize?: (width: number) => void;
19
+ }>;
20
+
21
+ export { ResizeablePanel, ResizeablePanelGroup };
22
+ export type { VirtualConfig };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACjF,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC"}