verstak 0.24.268 → 0.24.270
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/build/dist/source/html/DraggableArea.view.d.ts +11 -0
- package/build/dist/source/html/DraggableArea.view.js +37 -0
- package/build/dist/source/html/El.d.ts +67 -31
- package/build/dist/source/html/El.js +460 -232
- package/build/dist/source/html/ElUtils.d.ts +1 -0
- package/build/dist/source/html/ElUtils.js +3 -0
- package/build/dist/source/html/Elements.d.ts +18 -4
- package/build/dist/source/html/Elements.js +172 -15
- package/build/dist/source/html/HtmlDriver.d.ts +2 -2
- package/build/dist/source/html/HtmlDriver.js +2 -2
- package/build/dist/source/html/HtmlElements.js +174 -174
- package/build/dist/source/html/Sizes.d.ts +37 -0
- package/build/dist/source/html/Sizes.js +139 -0
- package/build/dist/source/html/SplitViewMath.d.ts +18 -0
- package/build/dist/source/html/SplitViewMath.js +256 -0
- package/build/dist/source/html/api.d.ts +1 -0
- package/build/dist/source/html/api.js +1 -0
- package/build/dist/source/html/sensors/PointerSensor.js +4 -0
- package/package.json +2 -2
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { ElLayoutInfo, InitialElLayoutInfo, SplitView } from "./El.js";
|
|
2
|
+
import { clamp } from "./ElUtils.js";
|
|
3
|
+
import { Drivers, isSplitViewPartition } from "./Elements.js";
|
|
4
|
+
export function relayoutUsingSplitter(splitViewNode, deltaPx, index, initialSizesPx, priorities) {
|
|
5
|
+
var _a, _b, _c, _d;
|
|
6
|
+
if (priorities === undefined) {
|
|
7
|
+
priorities = getPrioritiesForSplitter(index + 1, initialSizesPx.length);
|
|
8
|
+
}
|
|
9
|
+
const containerSizePx = splitViewNode.element.splitView === SplitView.horizontal
|
|
10
|
+
? (_b = (_a = splitViewNode.element.layoutInfo) === null || _a === void 0 ? void 0 : _a.containerSizeXpx) !== null && _b !== void 0 ? _b : 0
|
|
11
|
+
: (_d = (_c = splitViewNode.element.layoutInfo) === null || _c === void 0 ? void 0 : _c.containerSizeYpx) !== null && _d !== void 0 ? _d : 0;
|
|
12
|
+
console.log(`(splitter) delta = ${deltaPx}, container = ${containerSizePx}, size = ${initialSizesPx.reduce((p, c) => p + c.sizePx, 0)}, index = ${index}`);
|
|
13
|
+
resizeUsingDelta(splitViewNode, containerSizePx, deltaPx, index + 1, priorities, initialSizesPx, true);
|
|
14
|
+
layout(splitViewNode);
|
|
15
|
+
}
|
|
16
|
+
export function relayout(splitViewNode, priorities, sizesPx) {
|
|
17
|
+
var _a, _b, _c, _d;
|
|
18
|
+
const containerSizePx = splitViewNode.element.splitView === SplitView.horizontal
|
|
19
|
+
? (_b = (_a = splitViewNode.element.layoutInfo) === null || _a === void 0 ? void 0 : _a.containerSizeXpx) !== null && _b !== void 0 ? _b : 0
|
|
20
|
+
: (_d = (_c = splitViewNode.element.layoutInfo) === null || _c === void 0 ? void 0 : _c.containerSizeYpx) !== null && _d !== void 0 ? _d : 0;
|
|
21
|
+
const deltaPx = containerSizePx - sizesPx.reduce((p, c) => p + c.sizePx, 0);
|
|
22
|
+
console.log(`(relayout) delta = ${deltaPx}px, container = ${containerSizePx}px, priorities = ${priorities.map(x => `0x${x.toString(2)}`).join(",")}`);
|
|
23
|
+
resizeUsingDelta(splitViewNode, containerSizePx, deltaPx, sizesPx.length, priorities, sizesPx);
|
|
24
|
+
layout(splitViewNode);
|
|
25
|
+
}
|
|
26
|
+
export function resizeUsingDelta(splitViewNode, containerSizePx, deltaPx, index, priorities, sizesPx, force = false) {
|
|
27
|
+
var _a, _b, _c, _d;
|
|
28
|
+
const isHorizontal = splitViewNode.element.splitView === SplitView.horizontal;
|
|
29
|
+
if (sizesPx.length > 0 && deltaPx !== 0) {
|
|
30
|
+
let minBeforeDeltaPx = 0;
|
|
31
|
+
let maxBeforeDeltaPx = 0;
|
|
32
|
+
for (let i = 0; i < index; i++) {
|
|
33
|
+
const size = isHorizontal ? sizesPx[i].node.element.widthPx : sizesPx[i].node.element.heightPx;
|
|
34
|
+
minBeforeDeltaPx += size.minPx - sizesPx[i].sizePx;
|
|
35
|
+
maxBeforeDeltaPx += size.maxPx - sizesPx[i].sizePx;
|
|
36
|
+
}
|
|
37
|
+
const hasAfter = index < sizesPx.length;
|
|
38
|
+
let minAfterDeltaPx = hasAfter ? 0 : Number.NEGATIVE_INFINITY;
|
|
39
|
+
let maxAfterDeltaPx = hasAfter ? 0 : Number.POSITIVE_INFINITY;
|
|
40
|
+
for (let i = index; i < sizesPx.length; i++) {
|
|
41
|
+
const size = isHorizontal ? sizesPx[i].node.element.widthPx : sizesPx[i].node.element.heightPx;
|
|
42
|
+
minAfterDeltaPx += sizesPx[i].sizePx - size.maxPx;
|
|
43
|
+
maxAfterDeltaPx += sizesPx[i].sizePx - size.minPx;
|
|
44
|
+
}
|
|
45
|
+
const minDeltaPx = Math.max(minBeforeDeltaPx, minAfterDeltaPx);
|
|
46
|
+
const maxDeltaPx = Math.min(maxBeforeDeltaPx, maxAfterDeltaPx);
|
|
47
|
+
const clampedDeltaPx = clamp(deltaPx, minDeltaPx, maxDeltaPx);
|
|
48
|
+
console.log(`%c${sizesPx.map((x, i) => {
|
|
49
|
+
const size = isHorizontal ? x.node.element.widthPx : x.node.element.heightPx;
|
|
50
|
+
return `${i}: ${size.minPx}..${x.sizePx}..${size.maxPx} (px)`;
|
|
51
|
+
}).join("\n")}`, "color: orangered");
|
|
52
|
+
console.log(`[${Array.from({ length: index }).map((x, i) => i).join(",")} | ${Array.from({ length: Math.max(0, sizesPx.length - index) }).map((x, i) => index + i).join(",")}] min = ${minDeltaPx.toFixed(2)} (${minBeforeDeltaPx.toFixed(2)}, ${minAfterDeltaPx.toFixed(2)}), ${deltaPx.toFixed(2)} -> ${clampedDeltaPx.toFixed(2)}, max = ${maxDeltaPx.toFixed(2)} (${maxBeforeDeltaPx.toFixed(2)}, ${maxAfterDeltaPx.toFixed(2)})`);
|
|
53
|
+
if (clampedDeltaPx !== 0) {
|
|
54
|
+
const res = 1 / devicePixelRatio;
|
|
55
|
+
let lastGrowingElementIndex = undefined;
|
|
56
|
+
if (index > 0) {
|
|
57
|
+
let runningReminderPx = 0;
|
|
58
|
+
let beforeDeltaPx = clampedDeltaPx;
|
|
59
|
+
for (let priority = 0; priority < priorities.length; priority++) {
|
|
60
|
+
const vector = priorities[priority];
|
|
61
|
+
let fractionCount = getFractionCount(isHorizontal, sizesPx.map(x => x.node), vector, index, force);
|
|
62
|
+
do {
|
|
63
|
+
const fractionSizePx = getFractionSizePx(beforeDeltaPx, fractionCount);
|
|
64
|
+
fractionCount = 0;
|
|
65
|
+
for (const i of indexes(vector, index)) {
|
|
66
|
+
const child = sizesPx[i].node;
|
|
67
|
+
const initialSizePx = sizesPx[i].sizePx;
|
|
68
|
+
const g = isHorizontal ? ((_a = child.element.stretchingStrengthX) !== null && _a !== void 0 ? _a : 0) : ((_b = child.element.stretchingStrengthY) !== null && _b !== void 0 ? _b : 0);
|
|
69
|
+
const growth = g > 0 ? g : (force ? 1 : 0);
|
|
70
|
+
if (growth > 0)
|
|
71
|
+
lastGrowingElementIndex = i;
|
|
72
|
+
const appendagePx = growth * fractionSizePx;
|
|
73
|
+
const newSizePx = initialSizePx + appendagePx;
|
|
74
|
+
let flooredNewSizePx = Math.floor(newSizePx * devicePixelRatio) / devicePixelRatio;
|
|
75
|
+
runningReminderPx += newSizePx - flooredNewSizePx;
|
|
76
|
+
if (runningReminderPx >= res) {
|
|
77
|
+
runningReminderPx -= res;
|
|
78
|
+
flooredNewSizePx += res;
|
|
79
|
+
}
|
|
80
|
+
const size = isHorizontal ? sizesPx[i].node.element.widthPx : sizesPx[i].node.element.heightPx;
|
|
81
|
+
const sizePx = clamp(flooredNewSizePx, size.minPx, size.maxPx);
|
|
82
|
+
console.log(`[${i}]: min = ${size.minPx}, max = ${size.maxPx}, growth = ${growth}, flooredNewSizePx = ${flooredNewSizePx}, size = ${sizePx} px`);
|
|
83
|
+
beforeDeltaPx -= sizePx - initialSizePx;
|
|
84
|
+
sizesPx[i].sizePx = sizePx;
|
|
85
|
+
if (sizesPx[i].sizePx > size.minPx && sizesPx[i].sizePx < size.maxPx) {
|
|
86
|
+
fractionCount += growth;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
} while (beforeDeltaPx > 0 && fractionCount > 0 && Math.abs(beforeDeltaPx) >= devicePixelRatio);
|
|
90
|
+
if (Math.abs(beforeDeltaPx) < devicePixelRatio) {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (hasAfter) {
|
|
95
|
+
let runningReminderPx = 0;
|
|
96
|
+
let afterDeltaPx = clampedDeltaPx;
|
|
97
|
+
for (let priority = 0; priority < priorities.length; priority++) {
|
|
98
|
+
const vector = priorities[priority];
|
|
99
|
+
let fractionCount = getFractionCount(isHorizontal, sizesPx.map(x => x.node), vector, -index, force);
|
|
100
|
+
do {
|
|
101
|
+
const fractionSizePx = getFractionSizePx(afterDeltaPx, fractionCount);
|
|
102
|
+
fractionCount = 0;
|
|
103
|
+
for (const i of indexes(vector, -index)) {
|
|
104
|
+
const child = sizesPx[i].node;
|
|
105
|
+
const initialSizePx = sizesPx[i].sizePx;
|
|
106
|
+
const g = isHorizontal ? ((_c = child.element.stretchingStrengthX) !== null && _c !== void 0 ? _c : 0) : ((_d = child.element.stretchingStrengthY) !== null && _d !== void 0 ? _d : 0);
|
|
107
|
+
const growth = g > 0 ? g : (force ? 1 : 0);
|
|
108
|
+
if (growth > 0)
|
|
109
|
+
lastGrowingElementIndex = i;
|
|
110
|
+
const appendagePx = growth * fractionSizePx;
|
|
111
|
+
const newSizePx = initialSizePx - appendagePx;
|
|
112
|
+
let flooredNewSizePx = Math.floor(newSizePx * devicePixelRatio) / devicePixelRatio;
|
|
113
|
+
runningReminderPx += newSizePx - flooredNewSizePx;
|
|
114
|
+
if (runningReminderPx >= res) {
|
|
115
|
+
runningReminderPx -= res;
|
|
116
|
+
flooredNewSizePx += res;
|
|
117
|
+
}
|
|
118
|
+
const size = isHorizontal ? sizesPx[i].node.element.widthPx : sizesPx[i].node.element.heightPx;
|
|
119
|
+
const sizePx = clamp(flooredNewSizePx, size.minPx, size.maxPx);
|
|
120
|
+
afterDeltaPx += sizePx - initialSizePx;
|
|
121
|
+
sizesPx[i].sizePx = sizePx;
|
|
122
|
+
if (sizesPx[i].sizePx > size.minPx && sizesPx[i].sizePx < size.maxPx) {
|
|
123
|
+
fractionCount += growth;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
} while (afterDeltaPx > 0 && fractionCount > 0 && Math.abs(containerSizePx - sizesPx.reduce((p, c) => p + c.sizePx, 0)) >= devicePixelRatio);
|
|
127
|
+
if (Math.abs(containerSizePx - sizesPx.reduce((p, c) => p + c.sizePx, 0)) < devicePixelRatio) {
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (lastGrowingElementIndex !== undefined) {
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
for (let i = 0; i < sizesPx.length; i++) {
|
|
138
|
+
const el = sizesPx[i].node.element;
|
|
139
|
+
if (el.layoutInfo === undefined)
|
|
140
|
+
el.layoutInfo = new ElLayoutInfo(InitialElLayoutInfo);
|
|
141
|
+
el.layoutInfo.effectiveSizePx = sizesPx[i].sizePx;
|
|
142
|
+
console.log(`[${i}]: set size = ${sizesPx[i].sizePx}px`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export function layout(splitViewNode) {
|
|
146
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
147
|
+
const isHorizontal = splitViewNode.element.splitView === SplitView.horizontal;
|
|
148
|
+
let posPx = 0;
|
|
149
|
+
const sizesPx = [];
|
|
150
|
+
const offsetXpx = (_b = (_a = splitViewNode.element.layoutInfo) === null || _a === void 0 ? void 0 : _a.offsetXpx) !== null && _b !== void 0 ? _b : 0;
|
|
151
|
+
const offsetYpx = (_d = (_c = splitViewNode.element.layoutInfo) === null || _c === void 0 ? void 0 : _c.offsetYpx) !== null && _d !== void 0 ? _d : 0;
|
|
152
|
+
for (const item of splitViewNode.children.items()) {
|
|
153
|
+
const child = item.instance;
|
|
154
|
+
if (isSplitViewPartition(child.driver)) {
|
|
155
|
+
const el = child.element;
|
|
156
|
+
if (el.native !== undefined) {
|
|
157
|
+
posPx += (_f = (_e = el.layoutInfo) === null || _e === void 0 ? void 0 : _e.effectiveSizePx) !== null && _f !== void 0 ? _f : 0;
|
|
158
|
+
sizesPx.push((_h = (_g = el.layoutInfo) === null || _g === void 0 ? void 0 : _g.effectiveSizePx) !== null && _h !== void 0 ? _h : 0);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (child.driver === Drivers.splitter) {
|
|
162
|
+
const el = child.element;
|
|
163
|
+
if (el.native !== undefined) {
|
|
164
|
+
if (isHorizontal)
|
|
165
|
+
el.style.left = `${offsetXpx + posPx}px`;
|
|
166
|
+
else
|
|
167
|
+
el.style.top = `${offsetYpx + posPx}px`;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const wrapper = (_j = splitViewNode.children.firstMergedItem()) === null || _j === void 0 ? void 0 : _j.instance;
|
|
172
|
+
if (wrapper !== undefined) {
|
|
173
|
+
if (isHorizontal)
|
|
174
|
+
wrapper.element.style.gridTemplateColumns = sizesPx.map(x => `${x}px`).join(" ");
|
|
175
|
+
else
|
|
176
|
+
wrapper.element.style.gridTemplateRows = sizesPx.map(x => `${x}px`).join(" ");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export function getPrioritiesForSplitter(index, size) {
|
|
180
|
+
const result = [];
|
|
181
|
+
let i = index - 1;
|
|
182
|
+
let j = index;
|
|
183
|
+
while (i >= 0 || j < size) {
|
|
184
|
+
if (i >= 0 && j < size) {
|
|
185
|
+
result.push((1 << i--) | (1 << j++));
|
|
186
|
+
}
|
|
187
|
+
else if (i >= 0) {
|
|
188
|
+
result.push(1 << i--);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
result.push(1 << j++);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
export function getPrioritiesForSizeChanging(item, children) {
|
|
197
|
+
const result = [];
|
|
198
|
+
let i = 0;
|
|
199
|
+
let changedItemIndex = -1;
|
|
200
|
+
for (const child of children.items()) {
|
|
201
|
+
if (isSplitViewPartition(child.instance.driver)) {
|
|
202
|
+
if (child !== item)
|
|
203
|
+
result.push(1 << i);
|
|
204
|
+
else
|
|
205
|
+
changedItemIndex = i;
|
|
206
|
+
i++;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (changedItemIndex !== -1)
|
|
210
|
+
result.push(1 << changedItemIndex);
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
export function getPrioritiesForEmptySpaceDistribution(children) {
|
|
214
|
+
let result = 0;
|
|
215
|
+
let i = 0;
|
|
216
|
+
for (const child of children.items()) {
|
|
217
|
+
if (isSplitViewPartition(child.instance.driver))
|
|
218
|
+
result |= 1 << i++;
|
|
219
|
+
}
|
|
220
|
+
return [result];
|
|
221
|
+
}
|
|
222
|
+
function getFractionCount(isHorizontal, children, vector, index, force = false) {
|
|
223
|
+
var _a;
|
|
224
|
+
let result = 0;
|
|
225
|
+
for (const i of indexes(vector, index)) {
|
|
226
|
+
const growth = (_a = (isHorizontal ? children[i].element.stretchingStrengthX : children[i].element.stretchingStrengthY)) !== null && _a !== void 0 ? _a : 0;
|
|
227
|
+
result += growth > 0 ? growth : (force ? 1 : 0);
|
|
228
|
+
}
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
231
|
+
function getFractionSizePx(spacePx, fractionCount) {
|
|
232
|
+
return fractionCount > 0 ? spacePx / fractionCount : 0;
|
|
233
|
+
}
|
|
234
|
+
function* indexes(vector, index) {
|
|
235
|
+
let i = 0;
|
|
236
|
+
if (index < 0) {
|
|
237
|
+
i = -index;
|
|
238
|
+
vector >>>= i;
|
|
239
|
+
while (vector > 0) {
|
|
240
|
+
if (vector & 1) {
|
|
241
|
+
yield i;
|
|
242
|
+
}
|
|
243
|
+
vector >>>= 1;
|
|
244
|
+
i++;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
while (i < index) {
|
|
249
|
+
if (vector & 1) {
|
|
250
|
+
yield i;
|
|
251
|
+
}
|
|
252
|
+
vector >>>= 1;
|
|
253
|
+
i++;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
@@ -5,6 +5,7 @@ export * from "./HtmlElements.js";
|
|
|
5
5
|
export * from "./HtmlApiExt.js";
|
|
6
6
|
export * from "./Elements.js";
|
|
7
7
|
export * from "./Handlers.js";
|
|
8
|
+
export * from "./Sizes.js";
|
|
8
9
|
export * from "./sensors/Sensor.js";
|
|
9
10
|
export * from "./sensors/PointerSensor.js";
|
|
10
11
|
export * from "./sensors/BasePointerSensor.js";
|
|
@@ -5,6 +5,7 @@ export * from "./HtmlElements.js";
|
|
|
5
5
|
export * from "./HtmlApiExt.js";
|
|
6
6
|
export * from "./Elements.js";
|
|
7
7
|
export * from "./Handlers.js";
|
|
8
|
+
export * from "./Sizes.js";
|
|
8
9
|
export * from "./sensors/Sensor.js";
|
|
9
10
|
export * from "./sensors/PointerSensor.js";
|
|
10
11
|
export * from "./sensors/BasePointerSensor.js";
|
|
@@ -64,6 +64,8 @@ export class PointerSensor extends BasePointerSensor {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
onPointerDown(e) {
|
|
67
|
+
var _a;
|
|
68
|
+
(_a = this.sourceElement) === null || _a === void 0 ? void 0 : _a.setPointerCapture(e.pointerId);
|
|
67
69
|
const button = extractPointerButton(e);
|
|
68
70
|
if (!this.dragStarted && this.clickable === undefined &&
|
|
69
71
|
(button === PointerButton.left || button === PointerButton.right)) {
|
|
@@ -97,6 +99,8 @@ export class PointerSensor extends BasePointerSensor {
|
|
|
97
99
|
}
|
|
98
100
|
}
|
|
99
101
|
onPointerUp(e) {
|
|
102
|
+
var _a;
|
|
103
|
+
(_a = this.sourceElement) === null || _a === void 0 ? void 0 : _a.releasePointerCapture(e.pointerId);
|
|
100
104
|
if (this.draggingOver) {
|
|
101
105
|
this.drop(e);
|
|
102
106
|
this.finishDragging();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "verstak",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.270",
|
|
4
4
|
"description": "Verstak - Front-End Library",
|
|
5
5
|
"publisher": "Nezaboodka Software",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"homepage": "https://github.com/nezaboodka/verstak/blob/master/README.md#readme",
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"reactronic": "^0.24.
|
|
34
|
+
"reactronic": "^0.24.270"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "20.11.17",
|