verstak 0.24.270 → 0.24.272

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 (28) hide show
  1. package/build/dist/source/html/El.d.ts +56 -25
  2. package/build/dist/source/html/El.js +197 -117
  3. package/build/dist/source/html/ElUtils.d.ts +14 -0
  4. package/build/dist/source/html/ElUtils.js +38 -9
  5. package/build/dist/source/html/Elements.js +124 -68
  6. package/build/dist/source/html/Handlers.d.ts +1 -1
  7. package/build/dist/source/html/Handlers.js +2 -0
  8. package/build/dist/source/html/SplitViewMath.d.ts +15 -6
  9. package/build/dist/source/html/SplitViewMath.js +195 -128
  10. package/build/dist/source/html/api.d.ts +1 -0
  11. package/build/dist/source/html/api.js +1 -0
  12. package/build/dist/source/html/sensors/BasePointerSensor.d.ts +1 -2
  13. package/build/dist/source/html/sensors/BasePointerSensor.js +2 -2
  14. package/build/dist/source/html/sensors/ButtonSensor.d.ts +1 -2
  15. package/build/dist/source/html/sensors/ButtonSensor.js +2 -2
  16. package/build/dist/source/html/sensors/DataForSensor.d.ts +1 -0
  17. package/build/dist/source/html/sensors/DataForSensor.js +3 -3
  18. package/build/dist/source/html/sensors/FocusSensor.js +1 -1
  19. package/build/dist/source/html/sensors/HtmlDragSensor.d.ts +1 -2
  20. package/build/dist/source/html/sensors/HtmlDragSensor.js +2 -2
  21. package/build/dist/source/html/sensors/HtmlElementSensor.d.ts +1 -2
  22. package/build/dist/source/html/sensors/HtmlElementSensor.js +1 -6
  23. package/build/dist/source/html/sensors/HtmlSensors.js +3 -3
  24. package/build/dist/source/html/sensors/KeyboardSensor.d.ts +1 -0
  25. package/build/dist/source/html/sensors/KeyboardSensor.js +5 -0
  26. package/build/dist/source/html/sensors/PointerSensor.d.ts +1 -2
  27. package/build/dist/source/html/sensors/PointerSensor.js +2 -2
  28. package/package.json +1 -1
@@ -1,31 +1,49 @@
1
- import { ElLayoutInfo, InitialElLayoutInfo, SplitView } from "./El.js";
2
- import { clamp } from "./ElUtils.js";
1
+ import { ElLayoutInfo, InitialElLayoutInfo, Direction } from "./El.js";
3
2
  import { Drivers, isSplitViewPartition } from "./Elements.js";
3
+ import { clamp } from "./ElUtils.js";
4
+ const DEBUG = false;
5
+ const eps = 0.0001;
6
+ export function equal(a, b) {
7
+ return Math.abs(a - b) <= eps;
8
+ }
9
+ export function less(a, b) {
10
+ return b - a > eps;
11
+ }
12
+ export function greater(a, b) {
13
+ return a - b > eps;
14
+ }
4
15
  export function relayoutUsingSplitter(splitViewNode, deltaPx, index, initialSizesPx, priorities) {
5
16
  var _a, _b, _c, _d;
6
17
  if (priorities === undefined) {
7
18
  priorities = getPrioritiesForSplitter(index + 1, initialSizesPx.length);
8
19
  }
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);
20
+ const containerSizePx = splitViewNode.element.splitView === Direction.horizontal
21
+ ? (_b = (_a = splitViewNode.element.layoutInfo) === null || _a === void 0 ? void 0 : _a.contentSizeXpx) !== null && _b !== void 0 ? _b : 0
22
+ : (_d = (_c = splitViewNode.element.layoutInfo) === null || _c === void 0 ? void 0 : _c.contentSizeYpx) !== null && _d !== void 0 ? _d : 0;
23
+ DEBUG && console.log(`(splitter) delta = ${deltaPx}, container = ${containerSizePx}, size = ${initialSizesPx.reduce((p, c) => p + c.sizePx, 0)}, index = ${index}`);
24
+ resizeUsingDelta(splitViewNode, deltaPx, index + 1, priorities, initialSizesPx, true);
14
25
  layout(splitViewNode);
15
26
  }
16
- export function relayout(splitViewNode, priorities, sizesPx) {
27
+ export function relayout(splitViewNode, priorities, manuallyResizablePriorities, sizesPx) {
17
28
  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);
29
+ const containerSizePx = splitViewNode.element.splitView === Direction.horizontal
30
+ ? (_b = (_a = splitViewNode.element.layoutInfo) === null || _a === void 0 ? void 0 : _a.contentSizeXpx) !== null && _b !== void 0 ? _b : 0
31
+ : (_d = (_c = splitViewNode.element.layoutInfo) === null || _c === void 0 ? void 0 : _c.contentSizeYpx) !== null && _d !== void 0 ? _d : 0;
32
+ const totalSizePx = sizesPx.reduce((p, c) => p + c.sizePx, 0);
33
+ let deltaPx = containerSizePx - totalSizePx;
34
+ DEBUG && console.log(printPriorities(priorities, manuallyResizablePriorities), "color: grey", "color:", "color: grey", "color:");
35
+ DEBUG && console.log(`(relayout) ∆ = ${n(deltaPx)}px, container = ${n(containerSizePx)}px, total = ${totalSizePx}`);
36
+ deltaPx = resizeUsingDelta(splitViewNode, deltaPx, sizesPx.length, priorities, sizesPx);
37
+ DEBUG && console.log(`(relayout) ~∆ = ${n(deltaPx)}, container = ${n(containerSizePx, 3)}px, total = ${n(sizesPx.reduce((p, c) => p + c.sizePx, 0), 3)}px`);
38
+ if (deltaPx < -(1 / devicePixelRatio)) {
39
+ DEBUG && console.log(`%c${deltaPx}px`, "color: lime");
40
+ resizeUsingDelta(splitViewNode, deltaPx, sizesPx.length, manuallyResizablePriorities, sizesPx, true);
41
+ }
24
42
  layout(splitViewNode);
25
43
  }
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;
44
+ export function resizeUsingDelta(splitViewNode, deltaPx, index, priorities, sizesPx, force = false) {
45
+ const isHorizontal = splitViewNode.element.splitView === Direction.horizontal;
46
+ let beforeDeltaPx = 0;
29
47
  if (sizesPx.length > 0 && deltaPx !== 0) {
30
48
  let minBeforeDeltaPx = 0;
31
49
  let maxBeforeDeltaPx = 0;
@@ -45,93 +63,16 @@ export function resizeUsingDelta(splitViewNode, containerSizePx, deltaPx, index,
45
63
  const minDeltaPx = Math.max(minBeforeDeltaPx, minAfterDeltaPx);
46
64
  const maxDeltaPx = Math.min(maxBeforeDeltaPx, maxAfterDeltaPx);
47
65
  const clampedDeltaPx = clamp(deltaPx, minDeltaPx, maxDeltaPx);
48
- console.log(`%c${sizesPx.map((x, i) => {
66
+ DEBUG && console.log(`%c${sizesPx.map((x, i) => {
49
67
  const size = isHorizontal ? x.node.element.widthPx : x.node.element.heightPx;
50
68
  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)})`);
69
+ }).join("\n")}`, "color: skyblue");
70
+ DEBUG && console.log(`[%c${Array.from({ length: index }).map((x, i) => i).join(",")}%c | %c${Array.from({ length: Math.max(0, sizesPx.length - index) }).map((x, i) => index + i).join(",")}%c]\n∆ = ${n(minDeltaPx)}px..${n(deltaPx)}px -> %c${n(clampedDeltaPx)}px%c..${n(maxDeltaPx)}px`, "color: #00BB00", "color:", "color: orange", "color:", "color: yellow", "color:");
53
71
  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
- }
72
+ if (index > 0)
73
+ beforeDeltaPx = distribute(1, clampedDeltaPx, index, priorities, sizesPx, isHorizontal, force);
74
+ if (hasAfter)
75
+ distribute(-1, clampedDeltaPx, index, priorities, sizesPx, isHorizontal, force);
135
76
  }
136
77
  }
137
78
  for (let i = 0; i < sizesPx.length; i++) {
@@ -139,28 +80,58 @@ export function resizeUsingDelta(splitViewNode, containerSizePx, deltaPx, index,
139
80
  if (el.layoutInfo === undefined)
140
81
  el.layoutInfo = new ElLayoutInfo(InitialElLayoutInfo);
141
82
  el.layoutInfo.effectiveSizePx = sizesPx[i].sizePx;
142
- console.log(`[${i}]: set size = ${sizesPx[i].sizePx}px`);
83
+ DEBUG && console.log(`[${i}]: set size = ${n(sizesPx[i].sizePx)}px`);
143
84
  }
85
+ return beforeDeltaPx;
144
86
  }
145
87
  export function layout(splitViewNode) {
146
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
147
- const isHorizontal = splitViewNode.element.splitView === SplitView.horizontal;
88
+ var _a, _b, _c, _d, _e, _f, _g, _h;
89
+ const isHorizontal = splitViewNode.element.splitView === Direction.horizontal;
148
90
  let posPx = 0;
91
+ let shrinkBefore = false;
92
+ let growBefore = false;
93
+ let isSplitterEnabled = false;
149
94
  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;
95
+ const layoutInfo = splitViewNode.element.layoutInfo;
96
+ const offsetXpx = (_a = layoutInfo === null || layoutInfo === void 0 ? void 0 : layoutInfo.offsetXpx) !== null && _a !== void 0 ? _a : 0;
97
+ const offsetYpx = (_b = layoutInfo === null || layoutInfo === void 0 ? void 0 : layoutInfo.offsetYpx) !== null && _b !== void 0 ? _b : 0;
152
98
  for (const item of splitViewNode.children.items()) {
153
99
  const child = item.instance;
154
100
  if (isSplitViewPartition(child.driver)) {
155
101
  const el = child.element;
156
102
  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);
103
+ const current = item;
104
+ const sizePx = isHorizontal ? el.widthPx : el.heightPx;
105
+ const effectiveSizePx = (_d = (_c = el.layoutInfo) === null || _c === void 0 ? void 0 : _c.effectiveSizePx) !== null && _d !== void 0 ? _d : 0;
106
+ posPx += effectiveSizePx;
107
+ sizesPx.push(effectiveSizePx);
108
+ el.native.setAttribute("rx-max", equal(effectiveSizePx, sizePx.maxPx) ? "true" : "false");
109
+ el.native.setAttribute("rx-min", equal(effectiveSizePx, sizePx.minPx) ? "true" : "false");
110
+ shrinkBefore || (shrinkBefore = greater(effectiveSizePx - sizePx.minPx, 0));
111
+ growBefore || (growBefore = greater(sizePx.maxPx - effectiveSizePx, 0));
112
+ let shrinkAfter = false;
113
+ let growAfter = false;
114
+ for (const item of splitViewNode.children.items(current)) {
115
+ const child = item.instance;
116
+ if (isSplitViewPartition(child.driver)) {
117
+ const el = child.element;
118
+ if (el.native !== undefined) {
119
+ const sizePx = isHorizontal ? el.widthPx : el.heightPx;
120
+ const effectiveSizePx = (_f = (_e = el.layoutInfo) === null || _e === void 0 ? void 0 : _e.effectiveSizePx) !== null && _f !== void 0 ? _f : 0;
121
+ shrinkAfter || (shrinkAfter = greater(effectiveSizePx - sizePx.minPx, 0));
122
+ growAfter || (growAfter = greater(sizePx.maxPx - effectiveSizePx, 0));
123
+ isSplitterEnabled = growBefore && shrinkAfter || growAfter && shrinkBefore;
124
+ if (isSplitterEnabled)
125
+ break;
126
+ }
127
+ }
128
+ }
159
129
  }
160
130
  }
161
131
  else if (child.driver === Drivers.splitter) {
162
132
  const el = child.element;
163
133
  if (el.native !== undefined) {
134
+ el.style.display = isSplitterEnabled ? "block" : "none";
164
135
  if (isHorizontal)
165
136
  el.style.left = `${offsetXpx + posPx}px`;
166
137
  else
@@ -168,12 +139,23 @@ export function layout(splitViewNode) {
168
139
  }
169
140
  }
170
141
  }
171
- const wrapper = (_j = splitViewNode.children.firstMergedItem()) === null || _j === void 0 ? void 0 : _j.instance;
142
+ const containerSizePx = (_g = (isHorizontal ? layoutInfo === null || layoutInfo === void 0 ? void 0 : layoutInfo.contentSizeXpx : layoutInfo === null || layoutInfo === void 0 ? void 0 : layoutInfo.contentSizeYpx)) !== null && _g !== void 0 ? _g : 0;
143
+ const isOverflowing = greater(posPx, containerSizePx);
144
+ const wrapper = (_h = splitViewNode.children.firstMergedItem()) === null || _h === void 0 ? void 0 : _h.instance;
172
145
  if (wrapper !== undefined) {
173
146
  if (isHorizontal)
174
147
  wrapper.element.style.gridTemplateColumns = sizesPx.map(x => `${x}px`).join(" ");
175
148
  else
176
149
  wrapper.element.style.gridTemplateRows = sizesPx.map(x => `${x}px`).join(" ");
150
+ if (isOverflowing) {
151
+ if (isHorizontal)
152
+ wrapper.element.style.overflow = "scroll hidden";
153
+ else
154
+ wrapper.element.style.overflow = "hidden scroll";
155
+ }
156
+ else {
157
+ wrapper.element.style.overflow = "hidden";
158
+ }
177
159
  }
178
160
  }
179
161
  export function getPrioritiesForSplitter(index, size) {
@@ -193,37 +175,56 @@ export function getPrioritiesForSplitter(index, size) {
193
175
  }
194
176
  return result;
195
177
  }
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);
178
+ export function getPrioritiesForSizeChanging(isHorizontal, children, indexes) {
179
+ var _a, _b;
180
+ const resizable = [];
181
+ const manuallyResizable = [];
182
+ const items = Array.from(children.items()).filter(x => isSplitViewPartition(x.instance.driver));
183
+ for (let i = items.length - 1; i >= 0; i--) {
184
+ const item = items[i];
185
+ const el = item.instance.element;
186
+ const strength = (_a = (isHorizontal ? el.stretchingStrengthX : el.stretchingStrengthY)) !== null && _a !== void 0 ? _a : 1;
187
+ if (!indexes.includes(i)) {
188
+ if (strength > 0)
189
+ resizable.push(1 << i);
204
190
  else
205
- changedItemIndex = i;
206
- i++;
191
+ manuallyResizable.push(1 << i);
207
192
  }
208
193
  }
209
- if (changedItemIndex !== -1)
210
- result.push(1 << changedItemIndex);
211
- return result;
194
+ for (const i of indexes) {
195
+ const item = items[i];
196
+ const el = item.instance.element;
197
+ const strength = (_b = (isHorizontal ? el.stretchingStrengthX : el.stretchingStrengthY)) !== null && _b !== void 0 ? _b : 1;
198
+ if (strength > 0)
199
+ resizable.push(1 << i);
200
+ else
201
+ manuallyResizable.push(1 << i);
202
+ }
203
+ return { resizable, manuallyResizable };
212
204
  }
213
- export function getPrioritiesForEmptySpaceDistribution(children) {
214
- let result = 0;
205
+ export function getPrioritiesForEmptySpaceDistribution(isHorizontal, children) {
206
+ var _a;
207
+ let r = 0;
208
+ let mr = 0;
215
209
  let i = 0;
216
210
  for (const child of children.items()) {
217
- if (isSplitViewPartition(child.instance.driver))
218
- result |= 1 << i++;
211
+ if (isSplitViewPartition(child.instance.driver)) {
212
+ const el = child.instance.element;
213
+ const strength = (_a = (isHorizontal ? el.stretchingStrengthX : el.stretchingStrengthY)) !== null && _a !== void 0 ? _a : 1;
214
+ if (strength > 0)
215
+ r |= 1 << i;
216
+ else
217
+ mr |= 1 << i;
218
+ i++;
219
+ }
219
220
  }
220
- return [result];
221
+ return { resizable: [r], manuallyResizable: [mr] };
221
222
  }
222
223
  function getFractionCount(isHorizontal, children, vector, index, force = false) {
223
224
  var _a;
224
225
  let result = 0;
225
226
  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
+ const growth = (_a = (isHorizontal ? children[i].element.stretchingStrengthX : children[i].element.stretchingStrengthY)) !== null && _a !== void 0 ? _a : 1;
227
228
  result += growth > 0 ? growth : (force ? 1 : 0);
228
229
  }
229
230
  return result;
@@ -254,3 +255,69 @@ function* indexes(vector, index) {
254
255
  }
255
256
  }
256
257
  }
258
+ function n(value, fractionDigits = 2) {
259
+ return value === 0 ? "0" : value.toFixed(fractionDigits);
260
+ }
261
+ function distribute(sign, deltaPx, index, priorities, sizesPx, isHorizontal, force) {
262
+ var _a, _b;
263
+ for (let priority = 0; priority < priorities.length; priority++) {
264
+ const vector = priorities[priority];
265
+ let fractionCount = getFractionCount(isHorizontal, sizesPx.map(x => x.node), vector, sign * index, force);
266
+ do {
267
+ const fractionSizePx = getFractionSizePx(deltaPx, fractionCount);
268
+ fractionCount = 0;
269
+ for (const i of indexes(vector, sign * index)) {
270
+ const child = sizesPx[i].node;
271
+ const initialSizePx = sizesPx[i].sizePx;
272
+ const strength = isHorizontal ? ((_a = child.element.stretchingStrengthX) !== null && _a !== void 0 ? _a : 1) : ((_b = child.element.stretchingStrengthY) !== null && _b !== void 0 ? _b : 1);
273
+ const growth = strength > 0 ? strength : (force ? 1 : 0);
274
+ const newSizePx = initialSizePx + sign * (growth * fractionSizePx);
275
+ const size = isHorizontal ? sizesPx[i].node.element.widthPx : sizesPx[i].node.element.heightPx;
276
+ const sizePx = clamp(newSizePx, size.minPx, size.maxPx);
277
+ deltaPx = deltaPx - sign * (sizePx - initialSizePx);
278
+ sizesPx[i].sizePx = sizePx;
279
+ if (sizesPx[i].sizePx > size.minPx && sizesPx[i].sizePx < size.maxPx) {
280
+ fractionCount += growth;
281
+ }
282
+ }
283
+ } while (Math.abs(deltaPx) > eps && fractionCount > 0);
284
+ if (Math.abs(deltaPx) <= eps) {
285
+ break;
286
+ }
287
+ }
288
+ return deltaPx;
289
+ }
290
+ function printPriorities(priorities, manuallyResizablePriorities) {
291
+ let text = "";
292
+ if (priorities.length > 0) {
293
+ text += `Automatically Resizable:\n%c(${priorities.map(x => `0x${x.toString(2)}`).join(", ")})%c\n`;
294
+ for (let i = 0; i < priorities.length; i++) {
295
+ let vector = priorities[i];
296
+ const parts = [];
297
+ let j = 0;
298
+ while (vector) {
299
+ if (vector & 1)
300
+ parts.push(j);
301
+ j++;
302
+ vector >>= 1;
303
+ }
304
+ text += `${i}: ${parts.join(", ")}\n`;
305
+ }
306
+ }
307
+ if (manuallyResizablePriorities.length > 0) {
308
+ text += `Manually Resizable:\n%c(${manuallyResizablePriorities.map(x => `0x${x.toString(2)}`).join(", ")})%c\n`;
309
+ for (let i = 0; i < manuallyResizablePriorities.length; i++) {
310
+ let vector = manuallyResizablePriorities[i];
311
+ const parts = [];
312
+ let j = 0;
313
+ while (vector) {
314
+ if (vector & 1)
315
+ parts.push(j);
316
+ j++;
317
+ vector >>= 1;
318
+ }
319
+ text += `${i}: ${parts.join(", ")}\n`;
320
+ }
321
+ }
322
+ return text;
323
+ }
@@ -6,6 +6,7 @@ export * from "./HtmlApiExt.js";
6
6
  export * from "./Elements.js";
7
7
  export * from "./Handlers.js";
8
8
  export * from "./Sizes.js";
9
+ export * from "./SplitViewMath.js";
9
10
  export * from "./sensors/Sensor.js";
10
11
  export * from "./sensors/PointerSensor.js";
11
12
  export * from "./sensors/BasePointerSensor.js";
@@ -6,6 +6,7 @@ export * from "./HtmlApiExt.js";
6
6
  export * from "./Elements.js";
7
7
  export * from "./Handlers.js";
8
8
  export * from "./Sizes.js";
9
+ export * from "./SplitViewMath.js";
9
10
  export * from "./sensors/Sensor.js";
10
11
  export * from "./sensors/PointerSensor.js";
11
12
  export * from "./sensors/BasePointerSensor.js";
@@ -1,4 +1,3 @@
1
- import { FocusSensor } from "./FocusSensor.js";
2
1
  import { HtmlElementSensor } from "./HtmlElementSensor.js";
3
2
  import { KeyboardModifiers } from "./KeyboardSensor.js";
4
3
  import { WindowSensor } from "./WindowSensor.js";
@@ -12,7 +11,7 @@ export declare class BasePointerSensor extends HtmlElementSensor {
12
11
  positionX: number;
13
12
  positionY: number;
14
13
  modifiers: KeyboardModifiers;
15
- constructor(element: HTMLElement | SVGElement, focusSensor?: FocusSensor, windowSensor?: WindowSensor);
14
+ constructor(element: HTMLElement | SVGElement, windowSensor?: WindowSensor);
16
15
  }
17
16
  export declare function extractPointerButton(e: MouseEvent): PointerButton;
18
17
  export declare function isPointerButtonDown(button: PointerButton, buttonsMask: number): boolean;
@@ -8,8 +8,8 @@ export var PointerButton;
8
8
  PointerButton[PointerButton["middle"] = 4] = "middle";
9
9
  })(PointerButton || (PointerButton = {}));
10
10
  export class BasePointerSensor extends HtmlElementSensor {
11
- constructor(element, focusSensor, windowSensor) {
12
- super(element, focusSensor, windowSensor);
11
+ constructor(element, windowSensor) {
12
+ super(element, windowSensor);
13
13
  this.positionX = Infinity;
14
14
  this.positionY = Infinity;
15
15
  this.modifiers = KeyboardModifiers.none;
@@ -1,5 +1,4 @@
1
1
  import { PointerButton, BasePointerSensor } from "./BasePointerSensor.js";
2
- import { FocusSensor } from "./FocusSensor.js";
3
2
  import { WindowSensor } from "./WindowSensor.js";
4
3
  export declare enum ButtonState {
5
4
  pressed = 0,
@@ -15,7 +14,7 @@ export declare class ButtonSensor extends BasePointerSensor {
15
14
  selectedX: number;
16
15
  selectedY: number;
17
16
  selected: boolean;
18
- constructor(element: HTMLElement | SVGElement, focusSensor: FocusSensor, windowSensor: WindowSensor);
17
+ constructor(element: HTMLElement | SVGElement, windowSensor: WindowSensor);
19
18
  listen(enabled?: boolean): void;
20
19
  protected onPointerDown(e: PointerEvent): void;
21
20
  protected onPointerMove(e: PointerEvent): void;
@@ -19,8 +19,8 @@ export var ButtonState;
19
19
  ButtonState[ButtonState["released"] = 3] = "released";
20
20
  })(ButtonState || (ButtonState = {}));
21
21
  export class ButtonSensor extends BasePointerSensor {
22
- constructor(element, focusSensor, windowSensor) {
23
- super(element, focusSensor, windowSensor);
22
+ constructor(element, windowSensor) {
23
+ super(element, windowSensor);
24
24
  this.state = ButtonState.released;
25
25
  this.pointerButton = PointerButton.none;
26
26
  this.originData = undefined;
@@ -2,6 +2,7 @@ export type DataForSensor = {
2
2
  context?: unknown;
3
3
  window?: unknown;
4
4
  focus?: unknown;
5
+ catchChildrenFocus?: boolean;
5
6
  hover?: unknown;
6
7
  keyboard?: unknown;
7
8
  click?: unknown;
@@ -43,8 +43,8 @@ export function grabElementDataList(targetPath, sym, payloadKey, existing, ignor
43
43
  if (candidateData !== undefined) {
44
44
  if (!ignoreWindow) {
45
45
  if (window === undefined)
46
- window = candidateData["window"];
47
- else if (window !== candidateData["window"])
46
+ window = candidateData.window;
47
+ else if (window !== candidateData.window)
48
48
  break;
49
49
  }
50
50
  payload = candidateData[payloadKey];
@@ -62,7 +62,7 @@ export function grabElementDataList(targetPath, sym, payloadKey, existing, ignor
62
62
  }
63
63
  }
64
64
  }
65
- if (activeData === undefined && predicate(candidate)) {
65
+ if (payloadKey === "focus" && activeData === undefined && (predicate(candidate) || (candidateData === null || candidateData === void 0 ? void 0 : candidateData.catchChildrenFocus))) {
66
66
  activeData = payload;
67
67
  }
68
68
  i++;
@@ -13,7 +13,7 @@ import { grabElementDataList, SymDataForSensor } from "./DataForSensor.js";
13
13
  import { HtmlElementSensor } from "./HtmlElementSensor.js";
14
14
  export class FocusSensor extends HtmlElementSensor {
15
15
  constructor(element, windowSensor) {
16
- super(element, undefined, windowSensor);
16
+ super(element, windowSensor);
17
17
  this.activeData = undefined;
18
18
  this.oldActiveData = undefined;
19
19
  this.contextElementDataList = [];
@@ -1,4 +1,3 @@
1
- import { FocusSensor } from "./FocusSensor.js";
2
1
  import { HtmlElementSensor } from "./HtmlElementSensor.js";
3
2
  import { KeyboardModifiers } from "./KeyboardSensor.js";
4
3
  import { WindowSensor } from "./WindowSensor.js";
@@ -33,7 +32,7 @@ export declare class HtmlDragSensor extends HtmlElementSensor {
33
32
  immediatePositionX: number;
34
33
  immediatePositionY: number;
35
34
  immediateModifiers: KeyboardModifiers;
36
- constructor(element: HTMLElement | SVGElement, focusSensor: FocusSensor, windowSensor: WindowSensor);
35
+ constructor(element: HTMLElement | SVGElement, windowSensor: WindowSensor);
37
36
  getData(format: string): unknown;
38
37
  setData(format: string, value: unknown): void;
39
38
  clearData(format?: string): void;
@@ -12,8 +12,8 @@ import { findTargetElementData, SymDataForSensor } from "./DataForSensor.js";
12
12
  import { HtmlElementSensor } from "./HtmlElementSensor.js";
13
13
  import { extractModifierKeys, KeyboardModifiers } from "./KeyboardSensor.js";
14
14
  export class HtmlDragSensor extends HtmlElementSensor {
15
- constructor(element, focusSensor, windowSensor) {
16
- super(element, focusSensor, windowSensor);
15
+ constructor(element, windowSensor) {
16
+ super(element, windowSensor);
17
17
  this.draggable = undefined;
18
18
  this.dragSource = undefined;
19
19
  this.dragTarget = undefined;
@@ -3,11 +3,10 @@ import { Sensor } from "./Sensor.js";
3
3
  import { WindowSensor } from "./WindowSensor.js";
4
4
  export declare class HtmlElementSensor extends Sensor {
5
5
  readonly sourceElement: HTMLElement | SVGElement;
6
- readonly focusSensor?: any;
7
6
  readonly windowSensor?: WindowSensor;
8
7
  preventDefault: boolean;
9
8
  stopPropagation: boolean;
10
- constructor(sourceElement: HTMLElement | SVGElement, focusSensor?: any, windowSensor?: WindowSensor);
9
+ constructor(sourceElement: HTMLElement | SVGElement, windowSensor?: WindowSensor);
11
10
  protected getDefaultSensorData(): DataForSensor;
12
11
  protected setPreventDefaultAndStopPropagation(e: Event): void;
13
12
  }
@@ -12,10 +12,9 @@ import { SymDataForSensor } from "./DataForSensor.js";
12
12
  import { Sensor } from "./Sensor.js";
13
13
  import { WindowSensor } from "./WindowSensor.js";
14
14
  export class HtmlElementSensor extends Sensor {
15
- constructor(sourceElement, focusSensor, windowSensor) {
15
+ constructor(sourceElement, windowSensor) {
16
16
  super();
17
17
  this.sourceElement = sourceElement;
18
- this.focusSensor = focusSensor;
19
18
  this.windowSensor = windowSensor;
20
19
  this.preventDefault = false;
21
20
  this.stopPropagation = false;
@@ -38,10 +37,6 @@ __decorate([
38
37
  raw,
39
38
  __metadata("design:type", Object)
40
39
  ], HtmlElementSensor.prototype, "sourceElement", void 0);
41
- __decorate([
42
- raw,
43
- __metadata("design:type", Object)
44
- ], HtmlElementSensor.prototype, "focusSensor", void 0);
45
40
  __decorate([
46
41
  raw,
47
42
  __metadata("design:type", WindowSensor)
@@ -58,21 +58,21 @@ export class HtmlSensors {
58
58
  }
59
59
  get htmlDrag() {
60
60
  if (this._htmlDrag === undefined) {
61
- this._htmlDrag = new HtmlDragSensor(this._element, this.focus, this.window);
61
+ this._htmlDrag = new HtmlDragSensor(this._element, this.window);
62
62
  this._htmlDrag.listen();
63
63
  }
64
64
  return this._htmlDrag;
65
65
  }
66
66
  get button() {
67
67
  if (this._button === undefined) {
68
- this._button = new ButtonSensor(this._element, this.focus, this.window);
68
+ this._button = new ButtonSensor(this._element, this.window);
69
69
  this._button.listen();
70
70
  }
71
71
  return this._button;
72
72
  }
73
73
  get pointer() {
74
74
  if (this._pointer === undefined) {
75
- this._pointer = new PointerSensor(this._element, this.focus, this.window);
75
+ this._pointer = new PointerSensor(this._element, this.window);
76
76
  this._pointer.listen();
77
77
  }
78
78
  return this._pointer;
@@ -25,6 +25,7 @@ export declare class KeyboardSensor extends HtmlElementSensor {
25
25
  reset(): void;
26
26
  protected onKeyDown(e: KeyboardEvent): void;
27
27
  protected onKeyUp(e: KeyboardEvent): void;
28
+ protected doWindowBlur(e: FocusEvent): void;
28
29
  protected keyDown(e: KeyboardEvent): void;
29
30
  protected keyUp(e: KeyboardEvent): void;
30
31
  protected updateSensorData(e: KeyboardEvent): void;
@@ -40,10 +40,12 @@ export class KeyboardSensor extends HtmlElementSensor {
40
40
  if (enabled) {
41
41
  element.addEventListener("keydown", this.onKeyDown.bind(this), { capture: true });
42
42
  element.addEventListener("keyup", this.onKeyUp.bind(this), { capture: true });
43
+ window.addEventListener("blur", this.doWindowBlur.bind(this), { capture: true });
43
44
  }
44
45
  else {
45
46
  element.removeEventListener("keydown", this.onKeyDown.bind(this), { capture: true });
46
47
  element.removeEventListener("keyup", this.onKeyUp.bind(this), { capture: true });
48
+ window.removeEventListener("blur", this.doWindowBlur.bind(this), { capture: true });
47
49
  }
48
50
  }
49
51
  reset() {
@@ -61,6 +63,9 @@ export class KeyboardSensor extends HtmlElementSensor {
61
63
  this.keyUp(e);
62
64
  this.setPreventDefaultAndStopPropagation(e);
63
65
  }
66
+ doWindowBlur(e) {
67
+ this.reset();
68
+ }
64
69
  keyDown(e) {
65
70
  this.updateSensorData(e);
66
71
  this.up = "";