@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.
Files changed (68) hide show
  1. package/dist/cjs/components/Icons/collection/ConnectionIcon.js +9 -17
  2. package/dist/cjs/components/Icons/collection/ConnectionIcon.js.map +1 -1
  3. package/dist/cjs/components/Icons/collection/ShapesIcon.js +61 -0
  4. package/dist/cjs/components/Icons/collection/ShapesIcon.js.map +1 -0
  5. package/dist/cjs/components/Icons/collection/index.js +7 -0
  6. package/dist/cjs/components/Icons/collection/index.js.map +1 -1
  7. package/dist/cjs/components/StackedCard/StackedCard.js +103 -19
  8. package/dist/cjs/components/StackedCard/StackedCard.js.map +1 -1
  9. package/dist/cjs/components/StackedCard/Styles.js +23 -18
  10. package/dist/cjs/components/StackedCard/Styles.js.map +1 -1
  11. package/dist/cjs/components/StackedCard/index.js +22 -0
  12. package/dist/cjs/components/StackedCard/index.js.map +1 -1
  13. package/dist/cjs/components/StackedCard/resizePolicy.js +238 -0
  14. package/dist/cjs/components/StackedCard/resizePolicy.js.map +1 -0
  15. package/dist/cjs/components/StackedCard/resizePolicy.test.js +474 -0
  16. package/dist/cjs/components/StackedCard/resizePolicy.test.js.map +1 -0
  17. package/dist/cjs/components/StackedCard/useStackedCardResize.js +145 -0
  18. package/dist/cjs/components/StackedCard/useStackedCardResize.js.map +1 -0
  19. package/dist/cjs/presentation/stackedCard/content/LinkCard.js +35 -22
  20. package/dist/cjs/presentation/stackedCard/content/LinkCard.js.map +1 -1
  21. package/dist/esm/components/Icons/collection/ConnectionIcon.d.ts.map +1 -1
  22. package/dist/esm/components/Icons/collection/ConnectionIcon.js +9 -17
  23. package/dist/esm/components/Icons/collection/ConnectionIcon.js.map +1 -1
  24. package/dist/esm/components/Icons/collection/ShapesIcon.d.ts +32 -0
  25. package/dist/esm/components/Icons/collection/ShapesIcon.d.ts.map +1 -0
  26. package/dist/esm/components/Icons/collection/ShapesIcon.js +54 -0
  27. package/dist/esm/components/Icons/collection/ShapesIcon.js.map +1 -0
  28. package/dist/esm/components/Icons/collection/index.d.ts +1 -0
  29. package/dist/esm/components/Icons/collection/index.d.ts.map +1 -1
  30. package/dist/esm/components/Icons/collection/index.js +1 -0
  31. package/dist/esm/components/Icons/collection/index.js.map +1 -1
  32. package/dist/esm/components/StackedCard/StackedCard.d.ts +44 -3
  33. package/dist/esm/components/StackedCard/StackedCard.d.ts.map +1 -1
  34. package/dist/esm/components/StackedCard/StackedCard.js +102 -19
  35. package/dist/esm/components/StackedCard/StackedCard.js.map +1 -1
  36. package/dist/esm/components/StackedCard/Styles.d.ts +4 -1
  37. package/dist/esm/components/StackedCard/Styles.d.ts.map +1 -1
  38. package/dist/esm/components/StackedCard/Styles.js +23 -18
  39. package/dist/esm/components/StackedCard/Styles.js.map +1 -1
  40. package/dist/esm/components/StackedCard/index.d.ts +2 -0
  41. package/dist/esm/components/StackedCard/index.d.ts.map +1 -1
  42. package/dist/esm/components/StackedCard/index.js +2 -0
  43. package/dist/esm/components/StackedCard/index.js.map +1 -1
  44. package/dist/esm/components/StackedCard/resizePolicy.d.ts +111 -0
  45. package/dist/esm/components/StackedCard/resizePolicy.d.ts.map +1 -0
  46. package/dist/esm/{presentation/stackedCard → components/StackedCard}/resizePolicy.js +93 -48
  47. package/dist/esm/components/StackedCard/resizePolicy.js.map +1 -0
  48. package/dist/esm/components/StackedCard/resizePolicy.test.d.ts +2 -0
  49. package/dist/esm/components/StackedCard/resizePolicy.test.d.ts.map +1 -0
  50. package/dist/esm/components/StackedCard/resizePolicy.test.js +470 -0
  51. package/dist/esm/components/StackedCard/resizePolicy.test.js.map +1 -0
  52. package/dist/esm/components/StackedCard/useStackedCardResize.d.ts +62 -0
  53. package/dist/esm/components/StackedCard/useStackedCardResize.d.ts.map +1 -0
  54. package/dist/esm/components/StackedCard/useStackedCardResize.js +137 -0
  55. package/dist/esm/components/StackedCard/useStackedCardResize.js.map +1 -0
  56. package/dist/esm/presentation/stackedCard/content/LinkCard.d.ts.map +1 -1
  57. package/dist/esm/presentation/stackedCard/content/LinkCard.js +35 -20
  58. package/dist/esm/presentation/stackedCard/content/LinkCard.js.map +1 -1
  59. package/dist/index.js +989 -482
  60. package/dist/index.js.map +1 -1
  61. package/dist/index.min.js +1 -1
  62. package/dist/index.min.js.map +1 -1
  63. package/package.json +1 -1
  64. package/dist/cjs/presentation/stackedCard/resizePolicy.js +0 -183
  65. package/dist/cjs/presentation/stackedCard/resizePolicy.js.map +0 -1
  66. package/dist/esm/presentation/stackedCard/resizePolicy.d.ts +0 -97
  67. package/dist/esm/presentation/stackedCard/resizePolicy.d.ts.map +0 -1
  68. 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"}