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.
@@ -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.268",
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.265"
34
+ "reactronic": "^0.24.270"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "20.11.17",