Skip to content

Commit 6ac13c4

Browse files
authored
feat: implement resize-handle workspace (#252)
1 parent d03ef7a commit 6ac13c4

File tree

22 files changed

+1047
-194
lines changed

22 files changed

+1047
-194
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Click on one of the links to access the documentation of the package:
3838
- [@jolly-pixel/voxel.renderer](./packages/voxel-renderer) - Voxel Engine and Renderer
3939
- [@jolly-pixel/pixel-draw.renderer](./packages/pixel-draw-renderer) - Pixel Art draw renderer
4040
- [@jolly-pixel/fs-tree](./packages/fs-tree) - Robust, stylable tree view widget for HTML5 apps with drag'n'drop support
41+
- [@jolly-pixel/resize-handle](./packages/resize-handle) - Robust resize handles / splitters for your HTML5 apps and websites
4142

4243
These packages are available in the Node Package Repository and can be easily installed with [npm](https://docs.npmjs.com/getting-started/what-is-npm) or [yarn](https://yarnpkg.com).
4344
```bash

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"packages/mcp-server",
2222
"packages/fs-tree",
2323
"packages/fs-tree-backend",
24+
"packages/resize-handle",
2425
"packages/voxel-renderer",
2526
"packages/pixel-draw-renderer",
2627
"packages/editors/voxel-map",

packages/editors/texture/index.html

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727
</style>
2828

2929
<jolly-model-editor-left-panel></jolly-model-editor-left-panel>
30-
<jolly-resizer name="leftPanel-threejs"></jolly-resizer>
3130
<section id="threeRenderer"></section>
32-
<jolly-resizer name="threejs-rightPanel"></jolly-resizer>
3331
<jolly-model-editor-right-panel></jolly-model-editor-right-panel>
3432
<jolly-popup-manager></jolly-popup-manager>
3533

packages/editors/texture/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"@jolly-pixel/engine": "2.5.0",
1919
"@jolly-pixel/fs-tree": "1.0.0",
2020
"@jolly-pixel/pixel-draw.renderer": "1.0.0",
21+
"@jolly-pixel/resize-handle": "1.0.0",
2122
"@jolly-pixel/runtime": "3.3.0",
2223
"lit": "3.3.2",
2324
"three": "0.182.0"

packages/editors/texture/public/main.css

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,20 @@ nav {
2929
padding: 10px;
3030
}
3131

32-
.resizer {
32+
.resize-handle {
33+
flex-shrink: 0;
34+
}
35+
36+
.resize-handle.left,
37+
.resize-handle.right {
3338
width: 5px;
3439
background: #aaa;
3540
cursor: col-resize;
36-
height: 100%;
41+
}
42+
43+
html.handle-dragging.vertical {
44+
cursor: col-resize !important;
45+
user-select: none;
3746
}
3847

3948
#container {

packages/editors/texture/src/components/Resizer.ts

Lines changed: 0 additions & 58 deletions
This file was deleted.

packages/editors/texture/src/index.ts

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1+
// Import Third-party Dependencies
2+
import { ResizeHandle } from "@jolly-pixel/resize-handle";
3+
14
// Import Internal Dependencies
25
import ThreeSceneManager from "./three/ThreeSceneManager.ts";
36
import "./components/LeftPanel.ts";
47
import "./components/RightPanel.ts";
58
import "./components/PopupManager.ts";
69
import "./components/popups/index.ts";
7-
import "./components/Resizer.ts";
810

9-
const kBody = document.querySelector("body") as HTMLBodyElement;
1011
const leftPanel = document.querySelector("jolly-model-editor-left-panel") as HTMLElement;
1112
const rightPanel = document.querySelector("jolly-model-editor-right-panel") as HTMLElement;
1213
const popupManager = document.querySelector("jolly-popup-manager") as HTMLElement;
@@ -34,53 +35,56 @@ requestAnimationFrame(function updateLoop() {
3435
requestAnimationFrame(updateLoop);
3536
});
3637

37-
kBody.addEventListener("resizer", (e: Event) => {
38-
const customEvent = e as CustomEvent;
39-
const { delta, name } = customEvent.detail;
40-
41-
function triggerManagerResize() {
42-
threeSceneManager.onResize();
38+
function triggerManagerResize() {
39+
threeSceneManager.onResize();
4340

44-
// Essayer d'abord via le getSharedCanvasManager
45-
const sharedManager = (leftPanel as any).getSharedCanvasManager?.();
46-
if (sharedManager) {
47-
sharedManager.onResize();
48-
}
49-
// Sinon, essayer via activeComponent
50-
else {
51-
const activeComponent = (leftPanel as any).getActiveComponent();
52-
if (activeComponent && activeComponent.canvasManagerInstance) {
53-
activeComponent.canvasManagerInstance.onResize();
54-
}
41+
const sharedManager = (leftPanel as any).getSharedCanvasManager?.();
42+
if (sharedManager) {
43+
sharedManager.onResize();
44+
}
45+
else {
46+
const activeComponent = (leftPanel as any).getActiveComponent();
47+
if (activeComponent && activeComponent.canvasManagerInstance) {
48+
activeComponent.canvasManagerInstance.onResize();
5549
}
5650
}
51+
}
5752

58-
if (name === "leftPanel-threejs") {
59-
const leftWidth = parseInt(getComputedStyle(leftPanel).width, 10);
60-
const sectionWidth = parseInt(getComputedStyle(kSection).width, 10);
61-
const newLeftWidth = leftWidth + delta;
62-
const newSectionWidth = sectionWidth - delta;
53+
// direction "left" → handle div inserted AFTER leftPanel (between leftPanel and threeRenderer)
54+
// dragging right → leftPanel.style.width increases
55+
const leftResizeHandle = new ResizeHandle(leftPanel, { direction: "left" });
6356

64-
if (newSectionWidth >= kMinWidth) {
65-
leftPanel.style.width = `${newLeftWidth}px`;
66-
triggerManagerResize();
67-
}
57+
leftResizeHandle.addEventListener("drag", () => {
58+
const sectionWidth = kSection.getBoundingClientRect().width;
59+
60+
if (sectionWidth < kMinWidth) {
61+
const excess = kMinWidth - sectionWidth;
62+
leftPanel.style.width = `${parseInt(getComputedStyle(leftPanel).width, 10) - excess}px`;
6863
}
69-
else if (name === "threejs-rightPanel") {
70-
const rightWidth = parseInt(getComputedStyle(rightPanel).width, 10);
71-
const sectionWidth = parseInt(getComputedStyle(kSection).width, 10);
72-
const newRightWidth = rightWidth - delta;
73-
const newSectionWidth = sectionWidth + delta;
74-
75-
if (newSectionWidth >= kMinWidth && newRightWidth >= kMinWidth) {
76-
rightPanel.style.width = `${newRightWidth}px`;
77-
triggerManagerResize();
78-
}
64+
65+
triggerManagerResize();
66+
});
67+
68+
// direction "right" → handle div inserted BEFORE rightPanel (between threeRenderer and rightPanel)
69+
// dragging left → rightPanel.style.width increases
70+
const rightResizeHandle = new ResizeHandle(rightPanel, { direction: "right" });
71+
72+
rightResizeHandle.addEventListener("drag", () => {
73+
const sectionWidth = kSection.getBoundingClientRect().width;
74+
const rightWidth = parseInt(getComputedStyle(rightPanel).width, 10);
75+
76+
if (sectionWidth < kMinWidth) {
77+
const excess = kMinWidth - sectionWidth;
78+
rightPanel.style.width = `${rightWidth - excess}px`;
79+
}
80+
else if (rightWidth < kMinWidth) {
81+
rightPanel.style.width = `${kMinWidth}px`;
7982
}
83+
84+
triggerManagerResize();
8085
});
8186

8287
rightPanel.addEventListener("addcube", (e: any) => {
8388
const { name } = e.detail;
8489
threeSceneManager.createCube(name);
8590
});
86-

packages/editors/voxel-map/index.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
<body>
1212
<editor-sidebar id="sidebar"></editor-sidebar>
13-
<div id="resize-handle"></div>
1413
<div id="game-container">
1514
<canvas tabindex="-1"></canvas>
1615
</div>

packages/editors/voxel-map/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"dependencies": {
2929
"@jolly-pixel/engine": "^2.0.0",
3030
"@jolly-pixel/fs-tree": "^1.0.0",
31+
"@jolly-pixel/resize-handle": "1.0.0",
3132
"@jolly-pixel/runtime": "^3.0.0",
3233
"@jolly-pixel/voxel.renderer": "1.4.0",
3334
"lit": "3.3.2",

packages/editors/voxel-map/public/main.css

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,31 @@ body {
2020

2121
editor-sidebar {
2222
flex-shrink: 0;
23+
min-width: 200px;
24+
max-width: 600px;
2325
}
2426

25-
#resize-handle {
27+
.resize-handle.left {
2628
width: 4px;
2729
flex-shrink: 0;
2830
background: #1a2228;
2931
cursor: col-resize;
3032
transition: background 0.15s;
3133
}
3234

33-
#resize-handle:hover,
34-
#resize-handle.dragging {
35+
.resize-handle.left:hover,
36+
html.handle-dragging.vertical .resize-handle.left {
3537
background: #4488ff;
3638
}
3739

40+
html.handle-dragging.vertical {
41+
cursor: col-resize;
42+
}
43+
44+
html.handle-dragging.vertical * {
45+
user-select: none;
46+
}
47+
3848
#game-container {
3949
flex: 1;
4050
position: relative;

0 commit comments

Comments
 (0)