@a-type/ui 1.1.2 → 1.1.4
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/card/Card.stories.js +7 -3
- package/dist/cjs/components/card/Card.stories.js.map +1 -1
- package/dist/cjs/components/icon/generated/IconSpritesheet.js +1 -1
- package/dist/cjs/components/icon/generated/IconSpritesheet.js.map +1 -1
- package/dist/cjs/components/icon/generated/iconNames.d.ts +1 -1
- package/dist/cjs/components/icon/generated/iconNames.js +1 -0
- package/dist/cjs/components/icon/generated/iconNames.js.map +1 -1
- package/dist/cjs/components/masonry/masonry.d.ts +3 -0
- package/dist/cjs/components/masonry/masonry.js +55 -9
- package/dist/cjs/components/masonry/masonry.js.map +1 -1
- package/dist/cjs/components/masonry/masonry.stories.d.ts +1 -0
- package/dist/cjs/components/masonry/masonry.stories.js +18 -4
- package/dist/cjs/components/masonry/masonry.stories.js.map +1 -1
- package/dist/cjs/components/numberStepper/NumberStepper.d.ts +3 -1
- package/dist/cjs/components/numberStepper/NumberStepper.js +7 -3
- package/dist/cjs/components/numberStepper/NumberStepper.js.map +1 -1
- package/dist/esm/components/card/Card.stories.js +7 -3
- package/dist/esm/components/card/Card.stories.js.map +1 -1
- package/dist/esm/components/icon/generated/IconSpritesheet.js +1 -1
- package/dist/esm/components/icon/generated/IconSpritesheet.js.map +1 -1
- package/dist/esm/components/icon/generated/iconNames.d.ts +1 -1
- package/dist/esm/components/icon/generated/iconNames.js +1 -0
- package/dist/esm/components/icon/generated/iconNames.js.map +1 -1
- package/dist/esm/components/masonry/masonry.d.ts +3 -0
- package/dist/esm/components/masonry/masonry.js +53 -8
- package/dist/esm/components/masonry/masonry.js.map +1 -1
- package/dist/esm/components/masonry/masonry.stories.d.ts +1 -0
- package/dist/esm/components/masonry/masonry.stories.js +17 -3
- package/dist/esm/components/masonry/masonry.stories.js.map +1 -1
- package/dist/esm/components/numberStepper/NumberStepper.d.ts +3 -1
- package/dist/esm/components/numberStepper/NumberStepper.js +7 -3
- package/dist/esm/components/numberStepper/NumberStepper.js.map +1 -1
- package/package.json +1 -1
- package/src/components/card/Card.stories.tsx +32 -7
- package/src/components/icon/generated/IconSpritesheet.tsx +6 -0
- package/src/components/icon/generated/iconNames.ts +1 -0
- package/src/components/masonry/masonry.stories.tsx +30 -9
- package/src/components/masonry/masonry.tsx +62 -10
- package/src/components/numberStepper/NumberStepper.tsx +12 -2
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// @unocss-include
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { debounce } from '@a-type/utils';
|
|
3
4
|
import { useEffect, useRef, useState } from 'react';
|
|
4
5
|
class MasonryLayout {
|
|
5
6
|
constructor(config) {
|
|
@@ -25,6 +26,7 @@ class MasonryLayout {
|
|
|
25
26
|
node.style.setProperty('position', 'absolute');
|
|
26
27
|
// hide until laid out
|
|
27
28
|
node.style.setProperty('visibility', 'hidden');
|
|
29
|
+
this.childSizeObserver.observe(node);
|
|
28
30
|
}
|
|
29
31
|
});
|
|
30
32
|
this.updateFromContainerSize(container.offsetWidth);
|
|
@@ -66,21 +68,39 @@ class MasonryLayout {
|
|
|
66
68
|
this.handleContainerMutation = (entries) => {
|
|
67
69
|
for (const entry of entries) {
|
|
68
70
|
entry.addedNodes.forEach((node) => {
|
|
71
|
+
var _a;
|
|
69
72
|
if (node instanceof HTMLElement) {
|
|
70
73
|
node.style.setProperty('position', 'absolute');
|
|
71
74
|
// hide until laid out
|
|
72
75
|
node.style.setProperty('visibility', 'hidden');
|
|
76
|
+
(_a = this.childSizeObserver) === null || _a === void 0 ? void 0 : _a.observe(node);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
entry.removedNodes.forEach((node) => {
|
|
80
|
+
var _a;
|
|
81
|
+
if (node instanceof HTMLElement) {
|
|
82
|
+
(_a = this.childSizeObserver) === null || _a === void 0 ? void 0 : _a.unobserve(node);
|
|
73
83
|
}
|
|
74
84
|
});
|
|
75
85
|
}
|
|
76
86
|
// TODO: why is this timeout necessary?
|
|
77
87
|
setTimeout(this.relayout, 100);
|
|
78
88
|
};
|
|
79
|
-
this.
|
|
89
|
+
this.handleChildResize = (entries) => {
|
|
90
|
+
// only worry about height changes
|
|
91
|
+
for (const entry of entries) {
|
|
92
|
+
const lastSeenHeight = entry.target.getAttribute('data-last-height');
|
|
93
|
+
const currentHeight = entry.contentRect.height;
|
|
94
|
+
entry.target.setAttribute('data-last-height', currentHeight.toString());
|
|
95
|
+
if (lastSeenHeight && lastSeenHeight !== currentHeight.toString()) {
|
|
96
|
+
this.relayout();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
this.relayout = debounce(() => {
|
|
80
101
|
if (!this.container) {
|
|
81
102
|
return;
|
|
82
103
|
}
|
|
83
|
-
console.log('relayout');
|
|
84
104
|
const tracks = new Array(this.columns).fill(0);
|
|
85
105
|
const gap = this.config.gap;
|
|
86
106
|
// percentage-based width and x position so that items automatically
|
|
@@ -90,27 +110,49 @@ class MasonryLayout {
|
|
|
90
110
|
const columnPercentageWidth = (pixelColumnWidthMinusGap / this.container.offsetWidth) * 100;
|
|
91
111
|
const gapPercentageWidth = (gap / this.container.offsetWidth) * 100;
|
|
92
112
|
const children = Array.from(this.container.children);
|
|
93
|
-
children.forEach((child) => {
|
|
94
|
-
|
|
113
|
+
children.forEach((child, index) => {
|
|
114
|
+
let itemTrackSpan = parseInt(child.getAttribute('data-span') || '1');
|
|
115
|
+
if (isNaN(itemTrackSpan) || itemTrackSpan < 1) {
|
|
116
|
+
itemTrackSpan = 1;
|
|
117
|
+
}
|
|
118
|
+
if (itemTrackSpan > this.columns) {
|
|
119
|
+
itemTrackSpan = this.columns;
|
|
120
|
+
}
|
|
121
|
+
const trackIndex = pickTrack(tracks, itemTrackSpan);
|
|
122
|
+
const affectedTracks = tracks.slice(trackIndex, trackIndex + itemTrackSpan);
|
|
95
123
|
const x = (columnPercentageWidth + gapPercentageWidth) * trackIndex;
|
|
96
|
-
const y =
|
|
97
|
-
const width = columnPercentageWidth
|
|
124
|
+
const y = Math.max(...affectedTracks);
|
|
125
|
+
const width = columnPercentageWidth * itemTrackSpan +
|
|
126
|
+
gapPercentageWidth * (itemTrackSpan - 1);
|
|
98
127
|
child.style.setProperty('position', 'absolute');
|
|
99
128
|
child.style.setProperty('visibility', 'visible');
|
|
100
129
|
child.style.setProperty('width', `${width}%`);
|
|
101
130
|
child.style.setProperty('left', `${x}%`);
|
|
102
131
|
child.style.setProperty('top', `${y}px`);
|
|
132
|
+
child.style.setProperty('z-index', index.toString());
|
|
103
133
|
requestAnimationFrame(() => {
|
|
104
134
|
child.classList.add('transition-all');
|
|
105
135
|
});
|
|
106
|
-
|
|
136
|
+
for (let i = 0; i < itemTrackSpan; i++) {
|
|
137
|
+
tracks[trackIndex + i] = y + child.offsetHeight + gap;
|
|
138
|
+
}
|
|
107
139
|
});
|
|
108
140
|
this.container.style.setProperty('height', `${Math.max(...tracks)}px`);
|
|
109
|
-
};
|
|
141
|
+
}, 100);
|
|
110
142
|
this.columns =
|
|
111
143
|
typeof config.columns === 'function' ? config.columns(0) : config.columns;
|
|
144
|
+
this.childSizeObserver = new ResizeObserver(this.handleChildResize);
|
|
112
145
|
}
|
|
113
146
|
}
|
|
147
|
+
function pickTrack(tracks, trackSpan) {
|
|
148
|
+
const subTracks = tracks.slice(0, tracks.length - trackSpan + 1);
|
|
149
|
+
const min = Math.min(...subTracks);
|
|
150
|
+
const index = subTracks.indexOf(min);
|
|
151
|
+
if (index === -1) {
|
|
152
|
+
return 0;
|
|
153
|
+
}
|
|
154
|
+
return index;
|
|
155
|
+
}
|
|
114
156
|
const initialStyle = {
|
|
115
157
|
height: 0,
|
|
116
158
|
position: 'relative',
|
|
@@ -130,4 +172,7 @@ export function Masonry({ className, children, columns = 3, gap = 16, }) {
|
|
|
130
172
|
}, [layout, ref]);
|
|
131
173
|
return (_jsx("div", Object.assign({ ref: ref, style: initialStyle, className: className }, { children: children })));
|
|
132
174
|
}
|
|
175
|
+
export function masonrySpan(span) {
|
|
176
|
+
return { 'data-span': span };
|
|
177
|
+
}
|
|
133
178
|
//# sourceMappingURL=masonry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masonry.js","sourceRoot":"","sources":["../../../../src/components/masonry/masonry.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA4B,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAO9E,MAAM,aAAa;
|
|
1
|
+
{"version":3,"file":"masonry.js","sourceRoot":"","sources":["../../../../src/components/masonry/masonry.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAA4B,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAO9E,MAAM,aAAa;IASlB,YAAoB,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;QARvC,4BAAuB,GAA0B,IAAI,CAAC;QACtD,8BAAyB,GAA4B,IAAI,CAAC;QAG1D,cAAS,GAAuB,IAAI,CAAC;QAErC,YAAO,GAAW,CAAC,CAAC;QAQ5B,WAAM,GAAG,CAAC,SAAsB,EAAE,EAAE;;YACnC,MAAA,IAAI,CAAC,uBAAuB,0CAAE,UAAU,EAAE,CAAC;YAC3C,MAAA,IAAI,CAAC,yBAAyB,0CAAE,UAAU,EAAE,CAAC;YAE7C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAE3B,IAAI,CAAC,uBAAuB,GAAG,IAAI,cAAc,CAChD,IAAI,CAAC,qBAAqB,CAC1B,CAAC;YACF,IAAI,CAAC,yBAAyB,GAAG,IAAI,gBAAgB,CACpD,IAAI,CAAC,uBAAuB,CAC5B,CAAC;YACF,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEvE,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACpD,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAClD,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YACrD,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACrC,IAAI,IAAI,YAAY,WAAW,EAAE;oBAChC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;oBAC/C,sBAAsB;oBACtB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;oBAC/C,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iBACrC;YACF,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAEpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEhB,OAAO,GAAG,EAAE;;gBACX,MAAA,IAAI,CAAC,uBAAuB,0CAAE,UAAU,EAAE,CAAC;gBAC3C,MAAA,IAAI,CAAC,yBAAyB,0CAAE,UAAU,EAAE,CAAC;gBAC7C,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBAC3C,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBAC3C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACvB,CAAC,CAAC;QACH,CAAC,CAAC;QAEF,iBAAY,GAAG,CAAC,MAA2B,EAAE,EAAE;;YAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAClD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,uCAAuC;YACvC,IACC,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,WAAW,mCAAI,CAAC,CAAC;gBAC/D,UAAU,EACT;gBACD,IAAI,CAAC,QAAQ,EAAE,CAAC;aAChB;QACF,CAAC,CAAC;QAEM,0BAAqB,GAAG,CAAC,OAA8B,EAAE,EAAE;YAClE,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC;YACpD,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;QAC9C,CAAC,CAAC;QAEM,4BAAuB,GAAG,CAAC,cAAsB,EAAE,EAAE;YAC5D,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE;gBAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBACrD,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,EAAE;oBAC9B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;oBACxB,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,OAAO,IAAI,CAAC;iBACZ;aACD;YACD,OAAO,KAAK,CAAC;QACd,CAAC,CAAC;QAEM,4BAAuB,GAAG,CAAC,OAAyB,EAAE,EAAE;YAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;gBAC5B,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;;oBACjC,IAAI,IAAI,YAAY,WAAW,EAAE;wBAChC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;wBAC/C,sBAAsB;wBACtB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;wBAE/C,MAAA,IAAI,CAAC,iBAAiB,0CAAE,OAAO,CAAC,IAAI,CAAC,CAAC;qBACtC;gBACF,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;;oBACnC,IAAI,IAAI,YAAY,WAAW,EAAE;wBAChC,MAAA,IAAI,CAAC,iBAAiB,0CAAE,SAAS,CAAC,IAAI,CAAC,CAAC;qBACxC;gBACF,CAAC,CAAC,CAAC;aACH;YACD,uCAAuC;YACvC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC,CAAC;QAEM,sBAAiB,GAAG,CAAC,OAA8B,EAAE,EAAE;YAC9D,kCAAkC;YAClC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;gBAC5B,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;gBACrE,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;gBAC/C,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACxE,IAAI,cAAc,IAAI,cAAc,KAAK,aAAa,CAAC,QAAQ,EAAE,EAAE;oBAClE,IAAI,CAAC,QAAQ,EAAE,CAAC;iBAChB;aACD;QACF,CAAC,CAAC;QAEM,aAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACpB,OAAO;aACP;YAED,MAAM,MAAM,GAAa,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAC5B,oEAAoE;YACpE,qEAAqE;YACrE,gBAAgB;YAChB,MAAM,wBAAwB,GAC7B,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YACxE,MAAM,qBAAqB,GAC1B,CAAC,wBAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;YAC/D,MAAM,kBAAkB,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;YAEpE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAkB,CAAC;YACtE,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACjC,IAAI,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;gBACrE,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE;oBAC9C,aAAa,GAAG,CAAC,CAAC;iBAClB;gBACD,IAAI,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE;oBACjC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;iBAC7B;gBAED,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;gBACpD,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAClC,UAAU,EACV,UAAU,GAAG,aAAa,CAC1B,CAAC;gBACF,MAAM,CAAC,GAAG,CAAC,qBAAqB,GAAG,kBAAkB,CAAC,GAAG,UAAU,CAAC;gBACpE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;gBACtC,MAAM,KAAK,GACV,qBAAqB,GAAG,aAAa;oBACrC,kBAAkB,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;gBAC1C,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAChD,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;gBACjD,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;gBAC9C,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACrD,qBAAqB,CAAC,GAAG,EAAE;oBAC1B,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;gBACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;oBACvC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;iBACtD;YACF,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC,EAAE,GAAG,CAAC,CAAC;QA7JP,IAAI,CAAC,OAAO;YACX,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAC3E,IAAI,CAAC,iBAAiB,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACrE,CAAC;CA2JD;AAED,SAAS,SAAS,CAAC,MAAgB,EAAE,SAAiB;IACrD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;QACjB,OAAO,CAAC,CAAC;KACT;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AASD,MAAM,YAAY,GAAkB;IACnC,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,QAAQ;IAClB,UAAU,EAAE,QAAQ;CACpB,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,EACvB,SAAS,EACT,QAAQ,EACR,OAAO,GAAG,CAAC,EACX,GAAG,GAAG,EAAE,GACM;IACd,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACrE,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,GAAG,CAAC,OAAO,EAAE;YAChB,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAClC;IACF,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAElB,OAAO,CACN,4BAAK,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,gBACtD,QAAQ,IACJ,CACN,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -10,13 +10,27 @@ const meta = {
|
|
|
10
10
|
},
|
|
11
11
|
};
|
|
12
12
|
export default meta;
|
|
13
|
-
const
|
|
13
|
+
const content = (spans) => Array.from({ length: 100 }, (_, i) => {
|
|
14
14
|
const size = 100 + Math.floor(Math.random() * 100);
|
|
15
|
-
|
|
15
|
+
let span = undefined;
|
|
16
|
+
if (spans) {
|
|
17
|
+
if (Math.random() < 0.1) {
|
|
18
|
+
span = 2;
|
|
19
|
+
}
|
|
20
|
+
else if (Math.random() < 0.03) {
|
|
21
|
+
span = 3;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return (_jsx("div", Object.assign({ className: "bg-gray-5 rounded-lg", style: { height: size }, "data-span": span }, { children: size }), i));
|
|
16
25
|
});
|
|
17
26
|
export const Default = {
|
|
18
27
|
render(props) {
|
|
19
|
-
return _jsx(Masonry, Object.assign({}, props, { children:
|
|
28
|
+
return _jsx(Masonry, Object.assign({}, props, { children: content() }));
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
export const WithSpan = {
|
|
32
|
+
render(props) {
|
|
33
|
+
return _jsx(Masonry, Object.assign({}, props, { children: content(true) }));
|
|
20
34
|
},
|
|
21
35
|
};
|
|
22
36
|
//# sourceMappingURL=masonry.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masonry.stories.js","sourceRoot":"","sources":["../../../../src/components/masonry/masonry.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,IAAI,GAAG;IACZ,KAAK,EAAE,SAAS;IAChB,SAAS,EAAE,OAAO;IAClB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE;QACX,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC5B;CAC8B,CAAC;AAEjC,eAAe,IAAI,CAAC;AAIpB,MAAM,
|
|
1
|
+
{"version":3,"file":"masonry.stories.js","sourceRoot":"","sources":["../../../../src/components/masonry/masonry.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,IAAI,GAAG;IACZ,KAAK,EAAE,SAAS;IAChB,SAAS,EAAE,OAAO;IAClB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE;QACX,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC5B;CAC8B,CAAC;AAEjC,eAAe,IAAI,CAAC;AAIpB,MAAM,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CACnC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IACpC,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IACnD,IAAI,IAAI,GAAG,SAAS,CAAC;IACrB,IAAI,KAAK,EAAE;QACV,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;YACxB,IAAI,GAAG,CAAC,CAAC;SACT;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE;YAChC,IAAI,GAAG,CAAC,CAAC;SACT;KACD;IAED,OAAO,CACN,4BAEC,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,eACZ,IAAI,gBAEd,IAAI,KALA,CAAC,CAMD,CACN,CAAC;AACH,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,OAAO,GAAU;IAC7B,MAAM,CAAC,KAAK;QACX,OAAO,KAAC,OAAO,oBAAK,KAAK,cAAG,OAAO,EAAE,IAAW,CAAC;IAClD,CAAC;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAU;IAC9B,MAAM,CAAC,KAAK;QACX,OAAO,KAAC,OAAO,oBAAK,KAAK,cAAG,OAAO,CAAC,IAAI,CAAC,IAAW,CAAC;IACtD,CAAC;CACD,CAAC"}
|
|
@@ -8,5 +8,7 @@ export interface NumberStepperProps {
|
|
|
8
8
|
renderValue?: (value: number) => ReactNode;
|
|
9
9
|
className?: string;
|
|
10
10
|
disabled?: boolean;
|
|
11
|
+
min?: number;
|
|
12
|
+
max?: number;
|
|
11
13
|
}
|
|
12
|
-
export declare function NumberStepper({ value, onChange, highlightChange, steps, increment: incrementAmount, renderValue, className, disabled, ...rest }: NumberStepperProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export declare function NumberStepper({ value, onChange, highlightChange, steps, increment: incrementAmount, renderValue, className, disabled, min, max, ...rest }: NumberStepperProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -17,7 +17,7 @@ import classNames from 'clsx';
|
|
|
17
17
|
import { Button } from '../button.js';
|
|
18
18
|
export function NumberStepper(_a) {
|
|
19
19
|
var _b;
|
|
20
|
-
var { value, onChange, highlightChange, steps, increment: incrementAmount = 1, renderValue = fractionToText, className, disabled } = _a, rest = __rest(_a, ["value", "onChange", "highlightChange", "steps", "increment", "renderValue", "className", "disabled"]);
|
|
20
|
+
var { value, onChange, highlightChange, steps, increment: incrementAmount = 1, renderValue = fractionToText, className, disabled, min, max } = _a, rest = __rest(_a, ["value", "onChange", "highlightChange", "steps", "increment", "renderValue", "className", "disabled", "min", "max"]);
|
|
21
21
|
const index = (_b = steps === null || steps === void 0 ? void 0 : steps.indexOf(value)) !== null && _b !== void 0 ? _b : 0;
|
|
22
22
|
const increment = () => {
|
|
23
23
|
if (steps) {
|
|
@@ -41,8 +41,12 @@ export function NumberStepper(_a) {
|
|
|
41
41
|
onChange(value - incrementAmount);
|
|
42
42
|
}
|
|
43
43
|
};
|
|
44
|
-
const canIncrement = !disabled &&
|
|
45
|
-
|
|
44
|
+
const canIncrement = !disabled &&
|
|
45
|
+
(steps ? index < steps.length - 1 : true) &&
|
|
46
|
+
(max === undefined || value < max);
|
|
47
|
+
const canDecrement = !disabled &&
|
|
48
|
+
(steps ? index > 0 : true) &&
|
|
49
|
+
(min === undefined || value > min);
|
|
46
50
|
return (_jsxs("div", Object.assign({ className: classNames('layer-components:flex layer-components:items-center layer-components:border-default layer-components:rounded-full layer-components:overflow-hidden layer-components:w-min-content layer-components:flex-shrink-0 layer-components:bg-white layer-components:shadow-sm', disabled &&
|
|
47
51
|
'layer-variants:border-gray-dark-blend layer-variants:bg-transparent layer-variants:shadow-none', {
|
|
48
52
|
'layer-variants:bg-accent-wash layer-variants:color-black': !!highlightChange && value !== 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberStepper.js","sourceRoot":"","sources":["../../../../src/components/numberStepper/NumberStepper.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,UAAU,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"NumberStepper.js","sourceRoot":"","sources":["../../../../src/components/numberStepper/NumberStepper.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,UAAU,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAetC,MAAM,UAAU,aAAa,CAAC,EAYT;;QAZS,EAC7B,KAAK,EACL,QAAQ,EACR,eAAe,EACf,KAAK,EACL,SAAS,EAAE,eAAe,GAAG,CAAC,EAC9B,WAAW,GAAG,cAAc,EAC5B,SAAS,EACT,QAAQ,EACR,GAAG,EACH,GAAG,OAEiB,EADjB,IAAI,cAXsB,oHAY7B,CADO;IAEP,MAAM,KAAK,GAAG,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,CAAC,KAAK,CAAC,mCAAI,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAG,GAAG,EAAE;QACtB,IAAI,KAAK,EAAE;YACV,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,OAAO;aACP;YACD,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;SAC3B;aAAM;YACN,QAAQ,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC;SAClC;IACF,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE;QACtB,IAAI,KAAK,EAAE;YACV,IAAI,KAAK,KAAK,CAAC,EAAE;gBAChB,OAAO;aACP;YACD,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;SAC3B;aAAM;YACN,QAAQ,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC;SAClC;IACF,CAAC,CAAC;IAEF,MAAM,YAAY,GACjB,CAAC,QAAQ;QACT,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzC,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC;IACpC,MAAM,YAAY,GACjB,CAAC,QAAQ;QACT,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1B,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC;IAEpC,OAAO,CACN,6BACC,SAAS,EAAE,UAAU,CACpB,iIAAiI,EACjI,QAAQ;YACP,oEAAoE,EACrE;YACC,6CAA6C,EAC5C,CAAC,CAAC,eAAe,IAAI,KAAK,KAAK,CAAC;SACjC,EACD,SAAS,CACT,IACG,IAAI,eAER,KAAC,MAAM,kBAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,YAAY,gBAChE,KAAC,SAAS,KAAG,IACL,EACT,4BAAK,SAAS,EAAC,oBAAoB,gBAAE,WAAW,CAAC,KAAK,CAAC,IAAO,EAC9D,KAAC,MAAM,kBAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,YAAY,gBAChE,KAAC,QAAQ,KAAG,IACJ,KACJ,CACN,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -167,10 +167,20 @@ export const Grid: Story = {
|
|
|
167
167
|
);
|
|
168
168
|
const remove = (index: number) =>
|
|
169
169
|
setSizes((v) => v.filter((_, i) => i !== index));
|
|
170
|
+
const resize = (index: number) =>
|
|
171
|
+
setSizes((v) => {
|
|
172
|
+
const size = 50 + Math.floor(Math.random() * 300);
|
|
173
|
+
return v.map((s, i) => (i === index ? size : s));
|
|
174
|
+
});
|
|
170
175
|
return (
|
|
171
176
|
<Card.Grid>
|
|
172
177
|
{sizes.map((size, i) => (
|
|
173
|
-
<GridCard
|
|
178
|
+
<GridCard
|
|
179
|
+
key={i}
|
|
180
|
+
size={size}
|
|
181
|
+
remove={() => remove(i)}
|
|
182
|
+
resize={() => resize(i)}
|
|
183
|
+
/>
|
|
174
184
|
))}
|
|
175
185
|
</Card.Grid>
|
|
176
186
|
);
|
|
@@ -197,17 +207,32 @@ export const GridCompact: Story = {
|
|
|
197
207
|
},
|
|
198
208
|
};
|
|
199
209
|
|
|
200
|
-
function GridCard({
|
|
210
|
+
function GridCard({
|
|
211
|
+
size,
|
|
212
|
+
remove,
|
|
213
|
+
resize,
|
|
214
|
+
}: {
|
|
215
|
+
size: number;
|
|
216
|
+
remove: () => void;
|
|
217
|
+
resize?: () => void;
|
|
218
|
+
}) {
|
|
201
219
|
return (
|
|
202
220
|
<CardRoot style={{ height: size }}>
|
|
203
221
|
<CardMain>
|
|
204
222
|
<CardTitle>{size}</CardTitle>
|
|
205
223
|
</CardMain>
|
|
206
|
-
<
|
|
207
|
-
<
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
224
|
+
<CardFooter>
|
|
225
|
+
<CardActions>
|
|
226
|
+
<Button size="small" onClick={remove}>
|
|
227
|
+
Delete
|
|
228
|
+
</Button>
|
|
229
|
+
{resize && (
|
|
230
|
+
<Button size="small" onClick={resize}>
|
|
231
|
+
Resize
|
|
232
|
+
</Button>
|
|
233
|
+
)}
|
|
234
|
+
</CardActions>
|
|
235
|
+
</CardFooter>
|
|
211
236
|
</CardRoot>
|
|
212
237
|
);
|
|
213
238
|
}
|
|
@@ -859,6 +859,12 @@ export const IconSpritesheet = (props: any) => (
|
|
|
859
859
|
fill="currentColor"
|
|
860
860
|
/>
|
|
861
861
|
</symbol>
|
|
862
|
+
<symbol id="icon-lightbulb" viewBox="0 0 15 15">
|
|
863
|
+
<path
|
|
864
|
+
d="M9.00001 9C10 8 9.88256 8.11747 10.5 7.5C13.0001 5 10.5564 1 7.50001 1C4.44367 1 2 4.5 4.50002 7.5C5.05906 8.17084 5 8 6.00001 9M9.00001 9H6.00001M9.00001 9C9.00001 9.24467 9.00001 9.5492 9.00001 9.86966M6.00001 9C6.00001 9.49274 6 10.3806 6 11M9.00001 9.86966L6 11M9.00001 9.86966C9.00001 10.2903 9.00001 10.7383 9.00001 11.1144M6 11C6 11.6377 6.00001 12 6.00001 12C6.00001 12 6.02576 12.1115 6.10733 12.2601M9.00001 11.1144C9.00001 11.623 9.00001 12 9.00001 12C9.00001 12 8.76924 13 7.50001 13C6.65469 13 6.27 12.5564 6.10733 12.2601M9.00001 11.1144C7.87035 11.5618 7.23699 11.8127 6.10733 12.2601M7.5 8.5V6.5M7.5 6.5C7.5 6.5 6.1754 6.21854 6 5.5C5.80355 4.6952 6.67158 3.99999 7.50001 4C8.32844 4.00001 9.17805 4.69094 9 5.5C8.84443 6.20693 7.5 6.5 7.5 6.5Z"
|
|
865
|
+
stroke="currentColor"
|
|
866
|
+
/>
|
|
867
|
+
</symbol>
|
|
862
868
|
</defs>
|
|
863
869
|
</svg>
|
|
864
870
|
);
|
|
@@ -14,17 +14,38 @@ export default meta;
|
|
|
14
14
|
|
|
15
15
|
type Story = StoryObj<typeof Masonry>;
|
|
16
16
|
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
})
|
|
17
|
+
const content = (spans?: boolean) =>
|
|
18
|
+
Array.from({ length: 100 }, (_, i) => {
|
|
19
|
+
const size = 100 + Math.floor(Math.random() * 100);
|
|
20
|
+
let span = undefined;
|
|
21
|
+
if (spans) {
|
|
22
|
+
if (Math.random() < 0.1) {
|
|
23
|
+
span = 2;
|
|
24
|
+
} else if (Math.random() < 0.03) {
|
|
25
|
+
span = 3;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<div
|
|
31
|
+
key={i}
|
|
32
|
+
className="bg-gray-5 rounded-lg"
|
|
33
|
+
style={{ height: size }}
|
|
34
|
+
data-span={span}
|
|
35
|
+
>
|
|
36
|
+
{size}
|
|
37
|
+
</div>
|
|
38
|
+
);
|
|
39
|
+
});
|
|
25
40
|
|
|
26
41
|
export const Default: Story = {
|
|
27
42
|
render(props) {
|
|
28
|
-
return <Masonry {...props}>{
|
|
43
|
+
return <Masonry {...props}>{content()}</Masonry>;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const WithSpan: Story = {
|
|
48
|
+
render(props) {
|
|
49
|
+
return <Masonry {...props}>{content(true)}</Masonry>;
|
|
29
50
|
},
|
|
30
51
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { debounce } from '@a-type/utils';
|
|
1
2
|
import { CSSProperties, ReactNode, useEffect, useRef, useState } from 'react';
|
|
2
3
|
|
|
3
4
|
interface MasonryLayoutConfig {
|
|
@@ -8,6 +9,7 @@ interface MasonryLayoutConfig {
|
|
|
8
9
|
class MasonryLayout {
|
|
9
10
|
private containerResizeObserver: ResizeObserver | null = null;
|
|
10
11
|
private containerMutationObserver: MutationObserver | null = null;
|
|
12
|
+
private childSizeObserver: ResizeObserver;
|
|
11
13
|
|
|
12
14
|
private container: HTMLElement | null = null;
|
|
13
15
|
|
|
@@ -16,6 +18,7 @@ class MasonryLayout {
|
|
|
16
18
|
constructor(private config: MasonryLayoutConfig) {
|
|
17
19
|
this.columns =
|
|
18
20
|
typeof config.columns === 'function' ? config.columns(0) : config.columns;
|
|
21
|
+
this.childSizeObserver = new ResizeObserver(this.handleChildResize);
|
|
19
22
|
}
|
|
20
23
|
|
|
21
24
|
attach = (container: HTMLElement) => {
|
|
@@ -41,6 +44,7 @@ class MasonryLayout {
|
|
|
41
44
|
node.style.setProperty('position', 'absolute');
|
|
42
45
|
// hide until laid out
|
|
43
46
|
node.style.setProperty('visibility', 'hidden');
|
|
47
|
+
this.childSizeObserver.observe(node);
|
|
44
48
|
}
|
|
45
49
|
});
|
|
46
50
|
|
|
@@ -93,6 +97,13 @@ class MasonryLayout {
|
|
|
93
97
|
node.style.setProperty('position', 'absolute');
|
|
94
98
|
// hide until laid out
|
|
95
99
|
node.style.setProperty('visibility', 'hidden');
|
|
100
|
+
|
|
101
|
+
this.childSizeObserver?.observe(node);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
entry.removedNodes.forEach((node) => {
|
|
105
|
+
if (node instanceof HTMLElement) {
|
|
106
|
+
this.childSizeObserver?.unobserve(node);
|
|
96
107
|
}
|
|
97
108
|
});
|
|
98
109
|
}
|
|
@@ -100,14 +111,24 @@ class MasonryLayout {
|
|
|
100
111
|
setTimeout(this.relayout, 100);
|
|
101
112
|
};
|
|
102
113
|
|
|
103
|
-
private
|
|
114
|
+
private handleChildResize = (entries: ResizeObserverEntry[]) => {
|
|
115
|
+
// only worry about height changes
|
|
116
|
+
for (const entry of entries) {
|
|
117
|
+
const lastSeenHeight = entry.target.getAttribute('data-last-height');
|
|
118
|
+
const currentHeight = entry.contentRect.height;
|
|
119
|
+
entry.target.setAttribute('data-last-height', currentHeight.toString());
|
|
120
|
+
if (lastSeenHeight && lastSeenHeight !== currentHeight.toString()) {
|
|
121
|
+
this.relayout();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
private relayout = debounce(() => {
|
|
104
127
|
if (!this.container) {
|
|
105
128
|
return;
|
|
106
129
|
}
|
|
107
130
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const tracks = new Array(this.columns).fill(0);
|
|
131
|
+
const tracks: number[] = new Array(this.columns).fill(0);
|
|
111
132
|
const gap = this.config.gap;
|
|
112
133
|
// percentage-based width and x position so that items automatically
|
|
113
134
|
// layout correctly when the container is resized (as long as columns
|
|
@@ -119,23 +140,50 @@ class MasonryLayout {
|
|
|
119
140
|
const gapPercentageWidth = (gap / this.container.offsetWidth) * 100;
|
|
120
141
|
|
|
121
142
|
const children = Array.from(this.container.children) as HTMLElement[];
|
|
122
|
-
children.forEach((child) => {
|
|
123
|
-
|
|
143
|
+
children.forEach((child, index) => {
|
|
144
|
+
let itemTrackSpan = parseInt(child.getAttribute('data-span') || '1');
|
|
145
|
+
if (isNaN(itemTrackSpan) || itemTrackSpan < 1) {
|
|
146
|
+
itemTrackSpan = 1;
|
|
147
|
+
}
|
|
148
|
+
if (itemTrackSpan > this.columns) {
|
|
149
|
+
itemTrackSpan = this.columns;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const trackIndex = pickTrack(tracks, itemTrackSpan);
|
|
153
|
+
const affectedTracks = tracks.slice(
|
|
154
|
+
trackIndex,
|
|
155
|
+
trackIndex + itemTrackSpan,
|
|
156
|
+
);
|
|
124
157
|
const x = (columnPercentageWidth + gapPercentageWidth) * trackIndex;
|
|
125
|
-
const y =
|
|
126
|
-
const width =
|
|
158
|
+
const y = Math.max(...affectedTracks);
|
|
159
|
+
const width =
|
|
160
|
+
columnPercentageWidth * itemTrackSpan +
|
|
161
|
+
gapPercentageWidth * (itemTrackSpan - 1);
|
|
127
162
|
child.style.setProperty('position', 'absolute');
|
|
128
163
|
child.style.setProperty('visibility', 'visible');
|
|
129
164
|
child.style.setProperty('width', `${width}%`);
|
|
130
165
|
child.style.setProperty('left', `${x}%`);
|
|
131
166
|
child.style.setProperty('top', `${y}px`);
|
|
167
|
+
child.style.setProperty('z-index', index.toString());
|
|
132
168
|
requestAnimationFrame(() => {
|
|
133
169
|
child.classList.add('transition-all');
|
|
134
170
|
});
|
|
135
|
-
|
|
171
|
+
for (let i = 0; i < itemTrackSpan; i++) {
|
|
172
|
+
tracks[trackIndex + i] = y + child.offsetHeight + gap;
|
|
173
|
+
}
|
|
136
174
|
});
|
|
137
175
|
this.container.style.setProperty('height', `${Math.max(...tracks)}px`);
|
|
138
|
-
};
|
|
176
|
+
}, 100);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function pickTrack(tracks: number[], trackSpan: number) {
|
|
180
|
+
const subTracks = tracks.slice(0, tracks.length - trackSpan + 1);
|
|
181
|
+
const min = Math.min(...subTracks);
|
|
182
|
+
const index = subTracks.indexOf(min);
|
|
183
|
+
if (index === -1) {
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
return index;
|
|
139
187
|
}
|
|
140
188
|
|
|
141
189
|
export interface MasonryProps {
|
|
@@ -175,3 +223,7 @@ export function Masonry({
|
|
|
175
223
|
</div>
|
|
176
224
|
);
|
|
177
225
|
}
|
|
226
|
+
|
|
227
|
+
export function masonrySpan(span: number) {
|
|
228
|
+
return { 'data-span': span };
|
|
229
|
+
}
|
|
@@ -13,6 +13,8 @@ export interface NumberStepperProps {
|
|
|
13
13
|
renderValue?: (value: number) => ReactNode;
|
|
14
14
|
className?: string;
|
|
15
15
|
disabled?: boolean;
|
|
16
|
+
min?: number;
|
|
17
|
+
max?: number;
|
|
16
18
|
}
|
|
17
19
|
|
|
18
20
|
export function NumberStepper({
|
|
@@ -24,6 +26,8 @@ export function NumberStepper({
|
|
|
24
26
|
renderValue = fractionToText,
|
|
25
27
|
className,
|
|
26
28
|
disabled,
|
|
29
|
+
min,
|
|
30
|
+
max,
|
|
27
31
|
...rest
|
|
28
32
|
}: NumberStepperProps) {
|
|
29
33
|
const index = steps?.indexOf(value) ?? 0;
|
|
@@ -50,8 +54,14 @@ export function NumberStepper({
|
|
|
50
54
|
}
|
|
51
55
|
};
|
|
52
56
|
|
|
53
|
-
const canIncrement =
|
|
54
|
-
|
|
57
|
+
const canIncrement =
|
|
58
|
+
!disabled &&
|
|
59
|
+
(steps ? index < steps.length - 1 : true) &&
|
|
60
|
+
(max === undefined || value < max);
|
|
61
|
+
const canDecrement =
|
|
62
|
+
!disabled &&
|
|
63
|
+
(steps ? index > 0 : true) &&
|
|
64
|
+
(min === undefined || value > min);
|
|
55
65
|
|
|
56
66
|
return (
|
|
57
67
|
<div
|