@activecollab/components 2.0.371 → 2.0.373
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/dist/cjs/components/Icons/collection/ConnectionIcon.js +9 -17
- package/dist/cjs/components/Icons/collection/ConnectionIcon.js.map +1 -1
- package/dist/cjs/components/Icons/collection/ShapesIcon.js +61 -0
- package/dist/cjs/components/Icons/collection/ShapesIcon.js.map +1 -0
- package/dist/cjs/components/Icons/collection/index.js +7 -0
- package/dist/cjs/components/Icons/collection/index.js.map +1 -1
- package/dist/cjs/components/StackedCard/StackedCard.js +103 -19
- package/dist/cjs/components/StackedCard/StackedCard.js.map +1 -1
- package/dist/cjs/components/StackedCard/Styles.js +23 -18
- package/dist/cjs/components/StackedCard/Styles.js.map +1 -1
- package/dist/cjs/components/StackedCard/index.js +22 -0
- package/dist/cjs/components/StackedCard/index.js.map +1 -1
- package/dist/cjs/components/StackedCard/resizePolicy.js +238 -0
- package/dist/cjs/components/StackedCard/resizePolicy.js.map +1 -0
- package/dist/cjs/components/StackedCard/resizePolicy.test.js +474 -0
- package/dist/cjs/components/StackedCard/resizePolicy.test.js.map +1 -0
- package/dist/cjs/components/StackedCard/useStackedCardResize.js +145 -0
- package/dist/cjs/components/StackedCard/useStackedCardResize.js.map +1 -0
- package/dist/cjs/presentation/stackedCard/content/LinkCard.js +35 -22
- package/dist/cjs/presentation/stackedCard/content/LinkCard.js.map +1 -1
- package/dist/esm/components/Icons/collection/ConnectionIcon.d.ts.map +1 -1
- package/dist/esm/components/Icons/collection/ConnectionIcon.js +9 -17
- package/dist/esm/components/Icons/collection/ConnectionIcon.js.map +1 -1
- package/dist/esm/components/Icons/collection/ShapesIcon.d.ts +32 -0
- package/dist/esm/components/Icons/collection/ShapesIcon.d.ts.map +1 -0
- package/dist/esm/components/Icons/collection/ShapesIcon.js +54 -0
- package/dist/esm/components/Icons/collection/ShapesIcon.js.map +1 -0
- package/dist/esm/components/Icons/collection/index.d.ts +1 -0
- package/dist/esm/components/Icons/collection/index.d.ts.map +1 -1
- package/dist/esm/components/Icons/collection/index.js +1 -0
- package/dist/esm/components/Icons/collection/index.js.map +1 -1
- package/dist/esm/components/StackedCard/StackedCard.d.ts +44 -3
- package/dist/esm/components/StackedCard/StackedCard.d.ts.map +1 -1
- package/dist/esm/components/StackedCard/StackedCard.js +102 -19
- package/dist/esm/components/StackedCard/StackedCard.js.map +1 -1
- package/dist/esm/components/StackedCard/Styles.d.ts +4 -1
- package/dist/esm/components/StackedCard/Styles.d.ts.map +1 -1
- package/dist/esm/components/StackedCard/Styles.js +23 -18
- package/dist/esm/components/StackedCard/Styles.js.map +1 -1
- package/dist/esm/components/StackedCard/index.d.ts +2 -0
- package/dist/esm/components/StackedCard/index.d.ts.map +1 -1
- package/dist/esm/components/StackedCard/index.js +2 -0
- package/dist/esm/components/StackedCard/index.js.map +1 -1
- package/dist/esm/components/StackedCard/resizePolicy.d.ts +111 -0
- package/dist/esm/components/StackedCard/resizePolicy.d.ts.map +1 -0
- package/dist/esm/{presentation/stackedCard → components/StackedCard}/resizePolicy.js +93 -48
- package/dist/esm/components/StackedCard/resizePolicy.js.map +1 -0
- package/dist/esm/components/StackedCard/resizePolicy.test.d.ts +2 -0
- package/dist/esm/components/StackedCard/resizePolicy.test.d.ts.map +1 -0
- package/dist/esm/components/StackedCard/resizePolicy.test.js +470 -0
- package/dist/esm/components/StackedCard/resizePolicy.test.js.map +1 -0
- package/dist/esm/components/StackedCard/useStackedCardResize.d.ts +62 -0
- package/dist/esm/components/StackedCard/useStackedCardResize.d.ts.map +1 -0
- package/dist/esm/components/StackedCard/useStackedCardResize.js +137 -0
- package/dist/esm/components/StackedCard/useStackedCardResize.js.map +1 -0
- package/dist/esm/presentation/stackedCard/content/LinkCard.d.ts.map +1 -1
- package/dist/esm/presentation/stackedCard/content/LinkCard.js +35 -20
- package/dist/esm/presentation/stackedCard/content/LinkCard.js.map +1 -1
- package/dist/index.js +989 -482
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/presentation/stackedCard/resizePolicy.js +0 -183
- package/dist/cjs/presentation/stackedCard/resizePolicy.js.map +0 -1
- package/dist/esm/presentation/stackedCard/resizePolicy.d.ts +0 -97
- package/dist/esm/presentation/stackedCard/resizePolicy.d.ts.map +0 -1
- package/dist/esm/presentation/stackedCard/resizePolicy.js.map +0 -1
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
+
import { DEFAULT_KEYBOARD_STEP, RESIZE_KEYS, SHIFT_STEP_MULTIPLIER, applyResize, clamp, effectiveBounds, isResizeKey, keyboardResize, makeStart, measurePercent, snap } from "./resizePolicy";
|
|
3
|
+
const FREE = {
|
|
4
|
+
proportional: false
|
|
5
|
+
};
|
|
6
|
+
const start = function (w, h, minW, minH) {
|
|
7
|
+
if (minW === void 0) {
|
|
8
|
+
minW = 0;
|
|
9
|
+
}
|
|
10
|
+
if (minH === void 0) {
|
|
11
|
+
minH = 0;
|
|
12
|
+
}
|
|
13
|
+
return makeStart({
|
|
14
|
+
w,
|
|
15
|
+
h
|
|
16
|
+
}, {
|
|
17
|
+
w: minW,
|
|
18
|
+
h: minH
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
describe("clamp / snap", () => {
|
|
22
|
+
it("clamps to the floor and, when given, the ceiling", () => {
|
|
23
|
+
expect(clamp(5, 10)).toBe(10);
|
|
24
|
+
expect(clamp(50, 10, 20)).toBe(20);
|
|
25
|
+
expect(clamp(15, 10, 20)).toBe(15);
|
|
26
|
+
});
|
|
27
|
+
it("treats a missing ceiling as unbounded", () => {
|
|
28
|
+
expect(clamp(1e9, 10)).toBe(1e9);
|
|
29
|
+
});
|
|
30
|
+
it("snaps to the nearest multiple, and passes through without a step", () => {
|
|
31
|
+
expect(snap(217, 8)).toBe(216);
|
|
32
|
+
expect(snap(220, 8)).toBe(224);
|
|
33
|
+
expect(snap(217)).toBe(217);
|
|
34
|
+
expect(snap(217, 0)).toBe(217);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("effectiveBounds", () => {
|
|
38
|
+
it("floors the policy minimum with the content minimum", () => {
|
|
39
|
+
const bounds = effectiveBounds({
|
|
40
|
+
minW: 96,
|
|
41
|
+
minH: 40,
|
|
42
|
+
proportional: false
|
|
43
|
+
}, {
|
|
44
|
+
w: 160,
|
|
45
|
+
h: 72
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// The content wins on both axes here: a card may not be crushed below it.
|
|
49
|
+
expect(bounds.wMin).toBe(160);
|
|
50
|
+
expect(bounds.hMin).toBe(72);
|
|
51
|
+
});
|
|
52
|
+
it("keeps the policy minimum when it is the higher of the two", () => {
|
|
53
|
+
const bounds = effectiveBounds({
|
|
54
|
+
minW: 200,
|
|
55
|
+
proportional: false
|
|
56
|
+
}, {
|
|
57
|
+
w: 160,
|
|
58
|
+
h: 0
|
|
59
|
+
});
|
|
60
|
+
expect(bounds.wMin).toBe(200);
|
|
61
|
+
});
|
|
62
|
+
it("reports an unset maximum as unbounded", () => {
|
|
63
|
+
const bounds = effectiveBounds(FREE, {
|
|
64
|
+
w: 0,
|
|
65
|
+
h: 0
|
|
66
|
+
});
|
|
67
|
+
expect(bounds.wMax).toBe(Number.POSITIVE_INFINITY);
|
|
68
|
+
expect(bounds.hMax).toBe(Number.POSITIVE_INFINITY);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe("applyResize — bounds", () => {
|
|
72
|
+
it("stops at minW", () => {
|
|
73
|
+
const policy = {
|
|
74
|
+
minW: 180,
|
|
75
|
+
proportional: false
|
|
76
|
+
};
|
|
77
|
+
expect(applyResize(start(300, 200), {
|
|
78
|
+
dx: -500,
|
|
79
|
+
dy: 0
|
|
80
|
+
}, policy).w).toBe(180);
|
|
81
|
+
});
|
|
82
|
+
it("stops at maxW", () => {
|
|
83
|
+
const policy = {
|
|
84
|
+
maxW: 420,
|
|
85
|
+
proportional: false
|
|
86
|
+
};
|
|
87
|
+
expect(applyResize(start(300, 200), {
|
|
88
|
+
dx: +500,
|
|
89
|
+
dy: 0
|
|
90
|
+
}, policy).w).toBe(420);
|
|
91
|
+
});
|
|
92
|
+
it("stops at minH", () => {
|
|
93
|
+
const policy = {
|
|
94
|
+
minH: 120,
|
|
95
|
+
proportional: false
|
|
96
|
+
};
|
|
97
|
+
expect(applyResize(start(300, 200), {
|
|
98
|
+
dx: 0,
|
|
99
|
+
dy: -500
|
|
100
|
+
}, policy).h).toBe(120);
|
|
101
|
+
});
|
|
102
|
+
it("stops at maxH", () => {
|
|
103
|
+
const policy = {
|
|
104
|
+
maxH: 540,
|
|
105
|
+
proportional: false
|
|
106
|
+
};
|
|
107
|
+
expect(applyResize(start(300, 200), {
|
|
108
|
+
dx: 0,
|
|
109
|
+
dy: +500
|
|
110
|
+
}, policy).h).toBe(540);
|
|
111
|
+
});
|
|
112
|
+
it("leaves an unset bound unbounded", () => {
|
|
113
|
+
// No maxW at all: a huge delta is applied in full.
|
|
114
|
+
expect(applyResize(start(300, 200), {
|
|
115
|
+
dx: +5000,
|
|
116
|
+
dy: 0
|
|
117
|
+
}, FREE).w).toBe(5300);
|
|
118
|
+
// No minW either, so the floor is 0 rather than some implied width.
|
|
119
|
+
expect(applyResize(start(300, 200), {
|
|
120
|
+
dx: -5000,
|
|
121
|
+
dy: 0
|
|
122
|
+
}, FREE).w).toBe(0);
|
|
123
|
+
});
|
|
124
|
+
it("lets the content minimum override a lower policy minimum", () => {
|
|
125
|
+
const policy = {
|
|
126
|
+
minW: 96,
|
|
127
|
+
proportional: false
|
|
128
|
+
};
|
|
129
|
+
const measured = makeStart({
|
|
130
|
+
w: 300,
|
|
131
|
+
h: 200
|
|
132
|
+
}, {
|
|
133
|
+
w: 160,
|
|
134
|
+
h: 0
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// 96 is the policy floor, but the content needs 160 — the higher wins.
|
|
138
|
+
expect(applyResize(measured, {
|
|
139
|
+
dx: -500,
|
|
140
|
+
dy: 0
|
|
141
|
+
}, policy).w).toBe(160);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe("applyResize — proportional", () => {
|
|
145
|
+
/* The worked example from the spec: a proportional policy meeting a bound
|
|
146
|
+
must not distort the ratio — the binding axis stops both. */
|
|
147
|
+
const policy = {
|
|
148
|
+
minW: 96,
|
|
149
|
+
maxW: 620,
|
|
150
|
+
minH: 72,
|
|
151
|
+
maxH: 540,
|
|
152
|
+
proportional: true,
|
|
153
|
+
step: 8
|
|
154
|
+
};
|
|
155
|
+
const proportionalStart = makeStart({
|
|
156
|
+
w: 300,
|
|
157
|
+
h: 200
|
|
158
|
+
}, {
|
|
159
|
+
w: 96,
|
|
160
|
+
h: 72
|
|
161
|
+
});
|
|
162
|
+
it("holds the ratio when the WIDTH axis binds at the maximum", () => {
|
|
163
|
+
// scaleMax = min(620/300, 540/200) = 2.066 → width binds
|
|
164
|
+
expect(applyResize(proportionalStart, {
|
|
165
|
+
dx: +400,
|
|
166
|
+
dy: 0
|
|
167
|
+
}, policy)).toEqual({
|
|
168
|
+
w: 620,
|
|
169
|
+
h: 413
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
it("holds the ratio when the HEIGHT axis binds at the minimum", () => {
|
|
173
|
+
// scaleMin = max(96/300, 72/200) = 0.36 → height binds
|
|
174
|
+
expect(applyResize(proportionalStart, {
|
|
175
|
+
dx: -400,
|
|
176
|
+
dy: 0
|
|
177
|
+
}, policy)).toEqual({
|
|
178
|
+
w: 108,
|
|
179
|
+
h: 72
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
it("drives the scale from whichever axis the corner moved further", () => {
|
|
183
|
+
const free = {
|
|
184
|
+
proportional: true
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
// A purely vertical drag scales the width too, so the corner is not
|
|
188
|
+
// width-biased: +100 on a 200-tall card is a 1.5× scale.
|
|
189
|
+
expect(applyResize(start(300, 200), {
|
|
190
|
+
dx: 0,
|
|
191
|
+
dy: +100
|
|
192
|
+
}, free)).toEqual({
|
|
193
|
+
w: 450,
|
|
194
|
+
h: 300
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
it("lets the grid yield rather than break the ratio at a bound", () => {
|
|
198
|
+
// Snapping 108 to the 8px grid would give 112 — above the binding minimum.
|
|
199
|
+
// The bound is a hard stop, so the card sits exactly on it instead.
|
|
200
|
+
const result = applyResize(proportionalStart, {
|
|
201
|
+
dx: -400,
|
|
202
|
+
dy: 0
|
|
203
|
+
}, policy);
|
|
204
|
+
expect(result.w % 8).not.toBe(0);
|
|
205
|
+
expect(result.w).toBe(108);
|
|
206
|
+
});
|
|
207
|
+
it("still snaps to the grid away from any bound", () => {
|
|
208
|
+
const result = applyResize(proportionalStart, {
|
|
209
|
+
dx: +37,
|
|
210
|
+
dy: 0
|
|
211
|
+
}, policy);
|
|
212
|
+
|
|
213
|
+
// 337 snaps to 336, and the height follows the same scale.
|
|
214
|
+
expect(result).toEqual({
|
|
215
|
+
w: 336,
|
|
216
|
+
h: 224
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
it("falls back to free-form when a side has no length to form a ratio", () => {
|
|
220
|
+
// Width-only cards park a placeholder height; the ratio math must not
|
|
221
|
+
// divide by zero.
|
|
222
|
+
const result = applyResize(makeStart({
|
|
223
|
+
w: 300,
|
|
224
|
+
h: 0
|
|
225
|
+
}, {
|
|
226
|
+
w: 0,
|
|
227
|
+
h: 0
|
|
228
|
+
}), {
|
|
229
|
+
dx: +40,
|
|
230
|
+
dy: +40
|
|
231
|
+
}, {
|
|
232
|
+
proportional: true
|
|
233
|
+
});
|
|
234
|
+
expect(result.w).toBe(340);
|
|
235
|
+
expect(Number.isNaN(result.h)).toBe(false);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
describe("applyResize — shift to constrain", () => {
|
|
239
|
+
it("locks the ratio for one gesture on a free-form policy", () => {
|
|
240
|
+
const result = applyResize(start(300, 200), {
|
|
241
|
+
dx: +150,
|
|
242
|
+
dy: 0
|
|
243
|
+
}, FREE, {
|
|
244
|
+
constrain: true
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// 1.5× on both axes, from a purely horizontal drag.
|
|
248
|
+
expect(result).toEqual({
|
|
249
|
+
w: 450,
|
|
250
|
+
h: 300
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
it("leaves the axes independent without it", () => {
|
|
254
|
+
expect(applyResize(start(300, 200), {
|
|
255
|
+
dx: +150,
|
|
256
|
+
dy: 0
|
|
257
|
+
}, FREE)).toEqual({
|
|
258
|
+
w: 450,
|
|
259
|
+
h: 200
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
it("changes nothing on a policy that is already proportional", () => {
|
|
263
|
+
const policy = {
|
|
264
|
+
proportional: true
|
|
265
|
+
};
|
|
266
|
+
const delta = {
|
|
267
|
+
dx: +150,
|
|
268
|
+
dy: 0
|
|
269
|
+
};
|
|
270
|
+
expect(applyResize(start(300, 200), delta, policy, {
|
|
271
|
+
constrain: true
|
|
272
|
+
})).toEqual(applyResize(start(300, 200), delta, policy));
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
describe("applyResize — width-only axis", () => {
|
|
276
|
+
/* The worked example from the spec: an auto-height card ignores the vertical
|
|
277
|
+
component entirely. */
|
|
278
|
+
it("ignores the vertical component and holds the height", () => {
|
|
279
|
+
const policy = {
|
|
280
|
+
minW: 180,
|
|
281
|
+
maxW: 420,
|
|
282
|
+
proportional: false,
|
|
283
|
+
step: 8
|
|
284
|
+
};
|
|
285
|
+
const result = applyResize(makeStart({
|
|
286
|
+
w: 180,
|
|
287
|
+
h: 240
|
|
288
|
+
}, {
|
|
289
|
+
w: 180,
|
|
290
|
+
h: 0
|
|
291
|
+
}), {
|
|
292
|
+
dx: +37,
|
|
293
|
+
dy: +200
|
|
294
|
+
}, policy, {
|
|
295
|
+
axis: "width"
|
|
296
|
+
});
|
|
297
|
+
expect(result).toEqual({
|
|
298
|
+
w: 216,
|
|
299
|
+
h: 240
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
it("still lets the height follow the ratio in proportional mode", () => {
|
|
303
|
+
// `axis: "width"` drops the pointer's vertical INPUT; it does not turn a
|
|
304
|
+
// proportional card into a free-form one.
|
|
305
|
+
const result = applyResize(start(300, 200), {
|
|
306
|
+
dx: +150,
|
|
307
|
+
dy: +999
|
|
308
|
+
}, {
|
|
309
|
+
proportional: true
|
|
310
|
+
}, {
|
|
311
|
+
axis: "width"
|
|
312
|
+
});
|
|
313
|
+
expect(result).toEqual({
|
|
314
|
+
w: 450,
|
|
315
|
+
h: 300
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
describe("keyboardResize", () => {
|
|
320
|
+
const policy = {
|
|
321
|
+
minW: 180,
|
|
322
|
+
maxW: 420,
|
|
323
|
+
minH: 120,
|
|
324
|
+
maxH: 400,
|
|
325
|
+
proportional: false
|
|
326
|
+
};
|
|
327
|
+
const contentMin = {
|
|
328
|
+
w: 180,
|
|
329
|
+
h: 120
|
|
330
|
+
};
|
|
331
|
+
const size = {
|
|
332
|
+
w: 300,
|
|
333
|
+
h: 200
|
|
334
|
+
};
|
|
335
|
+
it("nudges by the default step when the policy has none", () => {
|
|
336
|
+
var _keyboardResize, _keyboardResize2, _keyboardResize3, _keyboardResize4;
|
|
337
|
+
expect((_keyboardResize = keyboardResize("ArrowRight", size, policy, contentMin)) == null ? void 0 : _keyboardResize.w).toBe(300 + DEFAULT_KEYBOARD_STEP);
|
|
338
|
+
expect((_keyboardResize2 = keyboardResize("ArrowLeft", size, policy, contentMin)) == null ? void 0 : _keyboardResize2.w).toBe(300 - DEFAULT_KEYBOARD_STEP);
|
|
339
|
+
expect((_keyboardResize3 = keyboardResize("ArrowDown", size, policy, contentMin)) == null ? void 0 : _keyboardResize3.h).toBe(200 + DEFAULT_KEYBOARD_STEP);
|
|
340
|
+
expect((_keyboardResize4 = keyboardResize("ArrowUp", size, policy, contentMin)) == null ? void 0 : _keyboardResize4.h).toBe(200 - DEFAULT_KEYBOARD_STEP);
|
|
341
|
+
});
|
|
342
|
+
it("nudges by the policy step when there is one", () => {
|
|
343
|
+
var _keyboardResize5;
|
|
344
|
+
expect((_keyboardResize5 = keyboardResize("ArrowRight", size, _extends({}, policy, {
|
|
345
|
+
step: 20
|
|
346
|
+
}), contentMin)) == null ? void 0 : _keyboardResize5.w).toBe(320);
|
|
347
|
+
});
|
|
348
|
+
it("makes Shift a coarse nudge", () => {
|
|
349
|
+
var _keyboardResize6;
|
|
350
|
+
expect((_keyboardResize6 = keyboardResize("ArrowRight", size, policy, contentMin, {
|
|
351
|
+
shiftKey: true
|
|
352
|
+
})) == null ? void 0 : _keyboardResize6.w).toBe(300 + DEFAULT_KEYBOARD_STEP * SHIFT_STEP_MULTIPLIER);
|
|
353
|
+
});
|
|
354
|
+
it("clamps a nudge exactly like the pointer does", () => {
|
|
355
|
+
var _keyboardResize7;
|
|
356
|
+
expect((_keyboardResize7 = keyboardResize("ArrowLeft", {
|
|
357
|
+
w: 184,
|
|
358
|
+
h: 200
|
|
359
|
+
}, policy, contentMin, {
|
|
360
|
+
shiftKey: true
|
|
361
|
+
})) == null ? void 0 : _keyboardResize7.w).toBe(180);
|
|
362
|
+
});
|
|
363
|
+
it("jumps to the minimum on Home and the maximum on End", () => {
|
|
364
|
+
expect(keyboardResize("Home", size, policy, contentMin)).toEqual({
|
|
365
|
+
w: 180,
|
|
366
|
+
h: 120
|
|
367
|
+
});
|
|
368
|
+
expect(keyboardResize("End", size, policy, contentMin)).toEqual({
|
|
369
|
+
w: 420,
|
|
370
|
+
h: 400
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
it("leaves an axis with no maximum where it is on End", () => {
|
|
374
|
+
const unbounded = {
|
|
375
|
+
minW: 180,
|
|
376
|
+
maxW: 420,
|
|
377
|
+
proportional: false
|
|
378
|
+
};
|
|
379
|
+
expect(keyboardResize("End", size, unbounded, {
|
|
380
|
+
w: 180,
|
|
381
|
+
h: 0
|
|
382
|
+
})).toEqual({
|
|
383
|
+
w: 420,
|
|
384
|
+
h: 200
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
it("leaves an axis with no minimum where it is on Home", () => {
|
|
388
|
+
// Nobody asked for a floor on either axis, so Home has nothing to jump to —
|
|
389
|
+
// it must not collapse the card to zero.
|
|
390
|
+
expect(keyboardResize("Home", size, FREE, {
|
|
391
|
+
w: 0,
|
|
392
|
+
h: 0
|
|
393
|
+
})).toEqual(size);
|
|
394
|
+
});
|
|
395
|
+
it("ignores the vertical keys on a width-only card", () => {
|
|
396
|
+
expect(keyboardResize("ArrowUp", size, policy, contentMin, {
|
|
397
|
+
axis: "width"
|
|
398
|
+
})).toBeNull();
|
|
399
|
+
expect(keyboardResize("ArrowDown", size, policy, contentMin, {
|
|
400
|
+
axis: "width"
|
|
401
|
+
})).toBeNull();
|
|
402
|
+
});
|
|
403
|
+
it("holds the height on a width-only Home and End", () => {
|
|
404
|
+
expect(keyboardResize("Home", size, policy, contentMin, {
|
|
405
|
+
axis: "width"
|
|
406
|
+
})).toEqual({
|
|
407
|
+
w: 180,
|
|
408
|
+
h: 200
|
|
409
|
+
});
|
|
410
|
+
expect(keyboardResize("End", size, policy, contentMin, {
|
|
411
|
+
axis: "width"
|
|
412
|
+
})).toEqual({
|
|
413
|
+
w: 420,
|
|
414
|
+
h: 200
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
it("returns null for a key it does not own", () => {
|
|
418
|
+
expect(keyboardResize("Enter", size, policy, contentMin)).toBeNull();
|
|
419
|
+
expect(keyboardResize("a", size, policy, contentMin)).toBeNull();
|
|
420
|
+
});
|
|
421
|
+
});
|
|
422
|
+
describe("isResizeKey", () => {
|
|
423
|
+
it("owns the arrows plus Home and End, and nothing else", () => {
|
|
424
|
+
RESIZE_KEYS.forEach(key => expect(isResizeKey(key)).toBe(true));
|
|
425
|
+
expect(isResizeKey("Enter")).toBe(false);
|
|
426
|
+
expect(isResizeKey("Tab")).toBe(false);
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
describe("measurePercent", () => {
|
|
430
|
+
const policy = {
|
|
431
|
+
minW: 200,
|
|
432
|
+
maxW: 400,
|
|
433
|
+
proportional: false
|
|
434
|
+
};
|
|
435
|
+
const contentMin = {
|
|
436
|
+
w: 0,
|
|
437
|
+
h: 0
|
|
438
|
+
};
|
|
439
|
+
it("reports the width axis as a percent of its allowed range", () => {
|
|
440
|
+
expect(measurePercent({
|
|
441
|
+
w: 200,
|
|
442
|
+
h: 0
|
|
443
|
+
}, policy, contentMin)).toBe(0);
|
|
444
|
+
expect(measurePercent({
|
|
445
|
+
w: 300,
|
|
446
|
+
h: 0
|
|
447
|
+
}, policy, contentMin)).toBe(50);
|
|
448
|
+
expect(measurePercent({
|
|
449
|
+
w: 400,
|
|
450
|
+
h: 0
|
|
451
|
+
}, policy, contentMin)).toBe(100);
|
|
452
|
+
});
|
|
453
|
+
it("stays inside 0–100 for a size outside the bounds", () => {
|
|
454
|
+
expect(measurePercent({
|
|
455
|
+
w: 40,
|
|
456
|
+
h: 0
|
|
457
|
+
}, policy, contentMin)).toBe(0);
|
|
458
|
+
expect(measurePercent({
|
|
459
|
+
w: 900,
|
|
460
|
+
h: 0
|
|
461
|
+
}, policy, contentMin)).toBe(100);
|
|
462
|
+
});
|
|
463
|
+
it("reports 0 when the range is not finite", () => {
|
|
464
|
+
expect(measurePercent({
|
|
465
|
+
w: 300,
|
|
466
|
+
h: 0
|
|
467
|
+
}, FREE, contentMin)).toBe(0);
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
//# sourceMappingURL=resizePolicy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resizePolicy.test.js","names":["DEFAULT_KEYBOARD_STEP","RESIZE_KEYS","SHIFT_STEP_MULTIPLIER","applyResize","clamp","effectiveBounds","isResizeKey","keyboardResize","makeStart","measurePercent","snap","FREE","proportional","start","w","h","minW","minH","describe","it","expect","toBe","bounds","wMin","hMin","wMax","Number","POSITIVE_INFINITY","hMax","policy","dx","dy","maxW","maxH","measured","step","proportionalStart","toEqual","free","result","not","isNaN","constrain","delta","axis","contentMin","size","_keyboardResize","_keyboardResize2","_keyboardResize3","_keyboardResize4","_keyboardResize5","_extends","_keyboardResize6","shiftKey","_keyboardResize7","unbounded","toBeNull","forEach","key"],"sources":["../../../../src/components/StackedCard/resizePolicy.test.ts"],"sourcesContent":["import {\n DEFAULT_KEYBOARD_STEP,\n RESIZE_KEYS,\n SHIFT_STEP_MULTIPLIER,\n StackedCardResizePolicy,\n applyResize,\n clamp,\n effectiveBounds,\n isResizeKey,\n keyboardResize,\n makeStart,\n measurePercent,\n snap,\n} from \"./resizePolicy\";\n\nconst FREE: StackedCardResizePolicy = { proportional: false };\n\nconst start = (w: number, h: number, minW = 0, minH = 0) =>\n makeStart({ w, h }, { w: minW, h: minH });\n\ndescribe(\"clamp / snap\", () => {\n it(\"clamps to the floor and, when given, the ceiling\", () => {\n expect(clamp(5, 10)).toBe(10);\n expect(clamp(50, 10, 20)).toBe(20);\n expect(clamp(15, 10, 20)).toBe(15);\n });\n\n it(\"treats a missing ceiling as unbounded\", () => {\n expect(clamp(1e9, 10)).toBe(1e9);\n });\n\n it(\"snaps to the nearest multiple, and passes through without a step\", () => {\n expect(snap(217, 8)).toBe(216);\n expect(snap(220, 8)).toBe(224);\n expect(snap(217)).toBe(217);\n expect(snap(217, 0)).toBe(217);\n });\n});\n\ndescribe(\"effectiveBounds\", () => {\n it(\"floors the policy minimum with the content minimum\", () => {\n const bounds = effectiveBounds(\n { minW: 96, minH: 40, proportional: false },\n { w: 160, h: 72 }\n );\n\n // The content wins on both axes here: a card may not be crushed below it.\n expect(bounds.wMin).toBe(160);\n expect(bounds.hMin).toBe(72);\n });\n\n it(\"keeps the policy minimum when it is the higher of the two\", () => {\n const bounds = effectiveBounds(\n { minW: 200, proportional: false },\n { w: 160, h: 0 }\n );\n\n expect(bounds.wMin).toBe(200);\n });\n\n it(\"reports an unset maximum as unbounded\", () => {\n const bounds = effectiveBounds(FREE, { w: 0, h: 0 });\n\n expect(bounds.wMax).toBe(Number.POSITIVE_INFINITY);\n expect(bounds.hMax).toBe(Number.POSITIVE_INFINITY);\n });\n});\n\ndescribe(\"applyResize — bounds\", () => {\n it(\"stops at minW\", () => {\n const policy: StackedCardResizePolicy = { minW: 180, proportional: false };\n\n expect(applyResize(start(300, 200), { dx: -500, dy: 0 }, policy).w).toBe(\n 180\n );\n });\n\n it(\"stops at maxW\", () => {\n const policy: StackedCardResizePolicy = { maxW: 420, proportional: false };\n\n expect(applyResize(start(300, 200), { dx: +500, dy: 0 }, policy).w).toBe(\n 420\n );\n });\n\n it(\"stops at minH\", () => {\n const policy: StackedCardResizePolicy = { minH: 120, proportional: false };\n\n expect(applyResize(start(300, 200), { dx: 0, dy: -500 }, policy).h).toBe(\n 120\n );\n });\n\n it(\"stops at maxH\", () => {\n const policy: StackedCardResizePolicy = { maxH: 540, proportional: false };\n\n expect(applyResize(start(300, 200), { dx: 0, dy: +500 }, policy).h).toBe(\n 540\n );\n });\n\n it(\"leaves an unset bound unbounded\", () => {\n // No maxW at all: a huge delta is applied in full.\n expect(applyResize(start(300, 200), { dx: +5000, dy: 0 }, FREE).w).toBe(\n 5300\n );\n // No minW either, so the floor is 0 rather than some implied width.\n expect(applyResize(start(300, 200), { dx: -5000, dy: 0 }, FREE).w).toBe(0);\n });\n\n it(\"lets the content minimum override a lower policy minimum\", () => {\n const policy: StackedCardResizePolicy = { minW: 96, proportional: false };\n const measured = makeStart({ w: 300, h: 200 }, { w: 160, h: 0 });\n\n // 96 is the policy floor, but the content needs 160 — the higher wins.\n expect(applyResize(measured, { dx: -500, dy: 0 }, policy).w).toBe(160);\n });\n});\n\ndescribe(\"applyResize — proportional\", () => {\n /* The worked example from the spec: a proportional policy meeting a bound\n must not distort the ratio — the binding axis stops both. */\n const policy: StackedCardResizePolicy = {\n minW: 96,\n maxW: 620,\n minH: 72,\n maxH: 540,\n proportional: true,\n step: 8,\n };\n const proportionalStart = makeStart({ w: 300, h: 200 }, { w: 96, h: 72 });\n\n it(\"holds the ratio when the WIDTH axis binds at the maximum\", () => {\n // scaleMax = min(620/300, 540/200) = 2.066 → width binds\n expect(applyResize(proportionalStart, { dx: +400, dy: 0 }, policy)).toEqual(\n {\n w: 620,\n h: 413,\n }\n );\n });\n\n it(\"holds the ratio when the HEIGHT axis binds at the minimum\", () => {\n // scaleMin = max(96/300, 72/200) = 0.36 → height binds\n expect(applyResize(proportionalStart, { dx: -400, dy: 0 }, policy)).toEqual(\n {\n w: 108,\n h: 72,\n }\n );\n });\n\n it(\"drives the scale from whichever axis the corner moved further\", () => {\n const free: StackedCardResizePolicy = { proportional: true };\n\n // A purely vertical drag scales the width too, so the corner is not\n // width-biased: +100 on a 200-tall card is a 1.5× scale.\n expect(applyResize(start(300, 200), { dx: 0, dy: +100 }, free)).toEqual({\n w: 450,\n h: 300,\n });\n });\n\n it(\"lets the grid yield rather than break the ratio at a bound\", () => {\n // Snapping 108 to the 8px grid would give 112 — above the binding minimum.\n // The bound is a hard stop, so the card sits exactly on it instead.\n const result = applyResize(proportionalStart, { dx: -400, dy: 0 }, policy);\n\n expect(result.w % 8).not.toBe(0);\n expect(result.w).toBe(108);\n });\n\n it(\"still snaps to the grid away from any bound\", () => {\n const result = applyResize(proportionalStart, { dx: +37, dy: 0 }, policy);\n\n // 337 snaps to 336, and the height follows the same scale.\n expect(result).toEqual({ w: 336, h: 224 });\n });\n\n it(\"falls back to free-form when a side has no length to form a ratio\", () => {\n // Width-only cards park a placeholder height; the ratio math must not\n // divide by zero.\n const result = applyResize(\n makeStart({ w: 300, h: 0 }, { w: 0, h: 0 }),\n { dx: +40, dy: +40 },\n { proportional: true }\n );\n\n expect(result.w).toBe(340);\n expect(Number.isNaN(result.h)).toBe(false);\n });\n});\n\ndescribe(\"applyResize — shift to constrain\", () => {\n it(\"locks the ratio for one gesture on a free-form policy\", () => {\n const result = applyResize(start(300, 200), { dx: +150, dy: 0 }, FREE, {\n constrain: true,\n });\n\n // 1.5× on both axes, from a purely horizontal drag.\n expect(result).toEqual({ w: 450, h: 300 });\n });\n\n it(\"leaves the axes independent without it\", () => {\n expect(applyResize(start(300, 200), { dx: +150, dy: 0 }, FREE)).toEqual({\n w: 450,\n h: 200,\n });\n });\n\n it(\"changes nothing on a policy that is already proportional\", () => {\n const policy: StackedCardResizePolicy = { proportional: true };\n const delta = { dx: +150, dy: 0 };\n\n expect(\n applyResize(start(300, 200), delta, policy, { constrain: true })\n ).toEqual(applyResize(start(300, 200), delta, policy));\n });\n});\n\ndescribe(\"applyResize — width-only axis\", () => {\n /* The worked example from the spec: an auto-height card ignores the vertical\n component entirely. */\n it(\"ignores the vertical component and holds the height\", () => {\n const policy: StackedCardResizePolicy = {\n minW: 180,\n maxW: 420,\n proportional: false,\n step: 8,\n };\n\n const result = applyResize(\n makeStart({ w: 180, h: 240 }, { w: 180, h: 0 }),\n { dx: +37, dy: +200 },\n policy,\n { axis: \"width\" }\n );\n\n expect(result).toEqual({ w: 216, h: 240 });\n });\n\n it(\"still lets the height follow the ratio in proportional mode\", () => {\n // `axis: \"width\"` drops the pointer's vertical INPUT; it does not turn a\n // proportional card into a free-form one.\n const result = applyResize(\n start(300, 200),\n { dx: +150, dy: +999 },\n { proportional: true },\n { axis: \"width\" }\n );\n\n expect(result).toEqual({ w: 450, h: 300 });\n });\n});\n\ndescribe(\"keyboardResize\", () => {\n const policy: StackedCardResizePolicy = {\n minW: 180,\n maxW: 420,\n minH: 120,\n maxH: 400,\n proportional: false,\n };\n const contentMin = { w: 180, h: 120 };\n const size = { w: 300, h: 200 };\n\n it(\"nudges by the default step when the policy has none\", () => {\n expect(keyboardResize(\"ArrowRight\", size, policy, contentMin)?.w).toBe(\n 300 + DEFAULT_KEYBOARD_STEP\n );\n expect(keyboardResize(\"ArrowLeft\", size, policy, contentMin)?.w).toBe(\n 300 - DEFAULT_KEYBOARD_STEP\n );\n expect(keyboardResize(\"ArrowDown\", size, policy, contentMin)?.h).toBe(\n 200 + DEFAULT_KEYBOARD_STEP\n );\n expect(keyboardResize(\"ArrowUp\", size, policy, contentMin)?.h).toBe(\n 200 - DEFAULT_KEYBOARD_STEP\n );\n });\n\n it(\"nudges by the policy step when there is one\", () => {\n expect(\n keyboardResize(\"ArrowRight\", size, { ...policy, step: 20 }, contentMin)?.w\n ).toBe(320);\n });\n\n it(\"makes Shift a coarse nudge\", () => {\n expect(\n keyboardResize(\"ArrowRight\", size, policy, contentMin, {\n shiftKey: true,\n })?.w\n ).toBe(300 + DEFAULT_KEYBOARD_STEP * SHIFT_STEP_MULTIPLIER);\n });\n\n it(\"clamps a nudge exactly like the pointer does\", () => {\n expect(\n keyboardResize(\"ArrowLeft\", { w: 184, h: 200 }, policy, contentMin, {\n shiftKey: true,\n })?.w\n ).toBe(180);\n });\n\n it(\"jumps to the minimum on Home and the maximum on End\", () => {\n expect(keyboardResize(\"Home\", size, policy, contentMin)).toEqual({\n w: 180,\n h: 120,\n });\n expect(keyboardResize(\"End\", size, policy, contentMin)).toEqual({\n w: 420,\n h: 400,\n });\n });\n\n it(\"leaves an axis with no maximum where it is on End\", () => {\n const unbounded: StackedCardResizePolicy = {\n minW: 180,\n maxW: 420,\n proportional: false,\n };\n\n expect(keyboardResize(\"End\", size, unbounded, { w: 180, h: 0 })).toEqual({\n w: 420,\n h: 200,\n });\n });\n\n it(\"leaves an axis with no minimum where it is on Home\", () => {\n // Nobody asked for a floor on either axis, so Home has nothing to jump to —\n // it must not collapse the card to zero.\n expect(keyboardResize(\"Home\", size, FREE, { w: 0, h: 0 })).toEqual(size);\n });\n\n it(\"ignores the vertical keys on a width-only card\", () => {\n expect(\n keyboardResize(\"ArrowUp\", size, policy, contentMin, { axis: \"width\" })\n ).toBeNull();\n expect(\n keyboardResize(\"ArrowDown\", size, policy, contentMin, { axis: \"width\" })\n ).toBeNull();\n });\n\n it(\"holds the height on a width-only Home and End\", () => {\n expect(\n keyboardResize(\"Home\", size, policy, contentMin, { axis: \"width\" })\n ).toEqual({ w: 180, h: 200 });\n expect(\n keyboardResize(\"End\", size, policy, contentMin, { axis: \"width\" })\n ).toEqual({ w: 420, h: 200 });\n });\n\n it(\"returns null for a key it does not own\", () => {\n expect(keyboardResize(\"Enter\", size, policy, contentMin)).toBeNull();\n expect(keyboardResize(\"a\", size, policy, contentMin)).toBeNull();\n });\n});\n\ndescribe(\"isResizeKey\", () => {\n it(\"owns the arrows plus Home and End, and nothing else\", () => {\n RESIZE_KEYS.forEach((key) => expect(isResizeKey(key)).toBe(true));\n expect(isResizeKey(\"Enter\")).toBe(false);\n expect(isResizeKey(\"Tab\")).toBe(false);\n });\n});\n\ndescribe(\"measurePercent\", () => {\n const policy: StackedCardResizePolicy = {\n minW: 200,\n maxW: 400,\n proportional: false,\n };\n const contentMin = { w: 0, h: 0 };\n\n it(\"reports the width axis as a percent of its allowed range\", () => {\n expect(measurePercent({ w: 200, h: 0 }, policy, contentMin)).toBe(0);\n expect(measurePercent({ w: 300, h: 0 }, policy, contentMin)).toBe(50);\n expect(measurePercent({ w: 400, h: 0 }, policy, contentMin)).toBe(100);\n });\n\n it(\"stays inside 0–100 for a size outside the bounds\", () => {\n expect(measurePercent({ w: 40, h: 0 }, policy, contentMin)).toBe(0);\n expect(measurePercent({ w: 900, h: 0 }, policy, contentMin)).toBe(100);\n });\n\n it(\"reports 0 when the range is not finite\", () => {\n expect(measurePercent({ w: 300, h: 0 }, FREE, contentMin)).toBe(0);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { StackedCardContentMin, StackedCardResizeAxis, StackedCardResizePolicy, StackedCardResizeSource, StackedCardSize } from "./resizePolicy";
|
|
3
|
+
/**
|
|
4
|
+
* The one place pointer and keyboard input meet the resize policy.
|
|
5
|
+
*
|
|
6
|
+
* `StackedCard`'s built-in grip reports raw deltas and knows no policy — enough
|
|
7
|
+
* for a host that just tracks a width. This hook is the full contract: it
|
|
8
|
+
* captures the gesture start, funnels both inputs through the pure policy in
|
|
9
|
+
* `resizePolicy.ts`, streams preview events and fires exactly ONE commit per
|
|
10
|
+
* gesture. It returns the props to spread on the grip, including the live
|
|
11
|
+
* separator ARIA.
|
|
12
|
+
*
|
|
13
|
+
* Preview versus commit (spec §7e): the continuous stream is live feedback
|
|
14
|
+
* only. A host creates an undo entry on the COMMIT, never on a preview — and a
|
|
15
|
+
* gesture that never changed the size commits nothing at all, so a bare click
|
|
16
|
+
* on the grip is not a change.
|
|
17
|
+
*
|
|
18
|
+
* The hook never touches the card's content: the intrinsic minimum is read
|
|
19
|
+
* through `contentMin`, which may be a getter so a card that measures its own
|
|
20
|
+
* footer can answer at the moment it is asked.
|
|
21
|
+
*/
|
|
22
|
+
export interface UseStackedCardResizeArgs {
|
|
23
|
+
/** The card's current size, owned by the host. */
|
|
24
|
+
size: StackedCardSize;
|
|
25
|
+
policy: StackedCardResizePolicy;
|
|
26
|
+
/** Id of the element the grip resizes — becomes `aria-controls`. */
|
|
27
|
+
cardId: string;
|
|
28
|
+
/** The card's intrinsic minimum; a getter is read at the moment it is needed. */
|
|
29
|
+
contentMin: StackedCardContentMin | (() => StackedCardContentMin);
|
|
30
|
+
/** `width` locks the vertical axis (auto-height cards). Defaults to `both`. */
|
|
31
|
+
axis?: StackedCardResizeAxis;
|
|
32
|
+
/**
|
|
33
|
+
* Pointer deltas are divided by this before they reach the policy, so a grip
|
|
34
|
+
* inside a zoomed canvas tracks the cursor exactly. Keyboard nudges are
|
|
35
|
+
* already in the host's units and pass straight through. Defaults to 1.
|
|
36
|
+
*/
|
|
37
|
+
scale?: number;
|
|
38
|
+
/** Accessible name for the grip. Defaults to "Resize card". */
|
|
39
|
+
label?: string;
|
|
40
|
+
/** Live feedback during the gesture. Never an undoable change. */
|
|
41
|
+
onResize: (next: StackedCardSize, source: StackedCardResizeSource) => void;
|
|
42
|
+
/** Fires once per gesture, and only if the size actually changed. */
|
|
43
|
+
onResizeCommit: (final: StackedCardSize, source: StackedCardResizeSource) => void;
|
|
44
|
+
}
|
|
45
|
+
/** The props to spread on the grip — `StackedCard`'s `resizeHandleProps`. */
|
|
46
|
+
export interface StackedCardResizeHandleProps {
|
|
47
|
+
role: "separator";
|
|
48
|
+
tabIndex: 0;
|
|
49
|
+
"aria-label": string;
|
|
50
|
+
"aria-controls": string;
|
|
51
|
+
"aria-valuemin": number;
|
|
52
|
+
"aria-valuemax": number;
|
|
53
|
+
"aria-valuenow": number;
|
|
54
|
+
onPointerDown: (e: React.PointerEvent) => void;
|
|
55
|
+
onPointerMove: (e: React.PointerEvent) => void;
|
|
56
|
+
onPointerUp: (e: React.PointerEvent) => void;
|
|
57
|
+
onLostPointerCapture: (e: React.PointerEvent) => void;
|
|
58
|
+
onKeyDown: (e: React.KeyboardEvent) => void;
|
|
59
|
+
onKeyUp: (e: React.KeyboardEvent) => void;
|
|
60
|
+
}
|
|
61
|
+
export declare const useStackedCardResize: ({ size, policy, cardId, contentMin, axis, scale, label, onResize, onResizeCommit, }: UseStackedCardResizeArgs) => StackedCardResizeHandleProps;
|
|
62
|
+
//# sourceMappingURL=useStackedCardResize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStackedCardResize.d.ts","sourceRoot":"","sources":["../../../../src/components/StackedCard/useStackedCardResize.ts"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EAEvB,eAAe,EAMhB,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,wBAAwB;IACvC,kDAAkD;IAClD,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,uBAAuB,CAAC;IAChC,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,UAAU,EAAE,qBAAqB,GAAG,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAClE,+EAA+E;IAC/E,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAC3E,qEAAqE;IACrE,cAAc,EAAE,CACd,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,uBAAuB,KAC5B,IAAI,CAAC;CACX;AAED,6EAA6E;AAC7E,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,CAAC,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;IAC/C,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;IAC/C,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;IAC7C,oBAAoB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;IACtD,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;CAC3C;AAKD,eAAO,MAAM,oBAAoB,GAAI,qFAUlC,wBAAwB,KAAG,4BA6H7B,CAAC"}
|