react-restyle-components 0.4.22 → 0.4.24
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/lib/src/core-components/src/components/AlertBanner/AlertBanner.d.ts +4 -0
- package/lib/src/core-components/src/components/AlertBanner/AlertBanner.d.ts.map +1 -0
- package/lib/src/core-components/src/components/AlertBanner/AlertBanner.js +45 -0
- package/lib/src/core-components/src/components/AlertBanner/elements.d.ts +27 -0
- package/lib/src/core-components/src/components/AlertBanner/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/AlertBanner/elements.js +233 -0
- package/lib/src/core-components/src/components/AlertBanner/index.d.ts +3 -0
- package/lib/src/core-components/src/components/AlertBanner/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/AlertBanner/index.js +2 -0
- package/lib/src/core-components/src/components/AlertBanner/types.d.ts +46 -0
- package/lib/src/core-components/src/components/AlertBanner/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/AlertBanner/types.js +10 -0
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multi-select-selected-top-display/auto-complete-filter-multi-select-selected-top-display.component.d.ts.map +1 -1
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multi-select-selected-top-display/auto-complete-filter-multi-select-selected-top-display.component.js +40 -3
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multiple-select-multiple-fields-display/auto-complete-filter-multiple-select-multiple-fields-display.component.d.ts +1 -1
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multiple-select-multiple-fields-display/auto-complete-filter-multiple-select-multiple-fields-display.component.d.ts.map +1 -1
- package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multiple-select-multiple-fields-display/auto-complete-filter-multiple-select-multiple-fields-display.component.js +26 -1
- package/lib/src/core-components/src/components/Badge/Badge.d.ts +33 -33
- package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.d.ts +28 -0
- package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.js +83 -0
- package/lib/src/core-components/src/components/Breadcrumb/elements.d.ts +44 -0
- package/lib/src/core-components/src/components/Breadcrumb/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Breadcrumb/elements.js +370 -0
- package/lib/src/core-components/src/components/Breadcrumb/index.d.ts +4 -0
- package/lib/src/core-components/src/components/Breadcrumb/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Breadcrumb/index.js +3 -0
- package/lib/src/core-components/src/components/Breadcrumb/types.d.ts +14 -0
- package/lib/src/core-components/src/components/Breadcrumb/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Breadcrumb/types.js +3 -0
- package/lib/src/core-components/src/components/Button/Button.spec.js +1 -1
- package/lib/src/core-components/src/components/Button/button.component.js +1 -1
- package/lib/src/core-components/src/components/Chip/Chip.d.ts +5 -0
- package/lib/src/core-components/src/components/Chip/Chip.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Chip/Chip.js +64 -0
- package/lib/src/core-components/src/components/Chip/elements.d.ts +27 -0
- package/lib/src/core-components/src/components/Chip/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Chip/elements.js +253 -0
- package/lib/src/core-components/src/components/Chip/index.d.ts +3 -0
- package/lib/src/core-components/src/components/Chip/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Chip/index.js +2 -0
- package/lib/src/core-components/src/components/Chip/types.d.ts +54 -0
- package/lib/src/core-components/src/components/Chip/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Chip/types.js +4 -0
- package/lib/src/core-components/src/components/Divider/Divider.d.ts +4 -0
- package/lib/src/core-components/src/components/Divider/Divider.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Divider/Divider.js +25 -0
- package/lib/src/core-components/src/components/Divider/elements.d.ts +22 -0
- package/lib/src/core-components/src/components/Divider/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Divider/elements.js +103 -0
- package/lib/src/core-components/src/components/Divider/index.d.ts +3 -0
- package/lib/src/core-components/src/components/Divider/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Divider/index.js +2 -0
- package/lib/src/core-components/src/components/Divider/types.d.ts +30 -0
- package/lib/src/core-components/src/components/Divider/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Divider/types.js +4 -0
- package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.d.ts +6 -0
- package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.d.ts.map +1 -0
- package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.js +147 -0
- package/lib/src/core-components/src/components/DynamicGrid/GridContainer.d.ts +12 -0
- package/lib/src/core-components/src/components/DynamicGrid/GridContainer.d.ts.map +1 -0
- package/lib/src/core-components/src/components/DynamicGrid/GridContainer.js +89 -0
- package/lib/src/core-components/src/components/DynamicGrid/elements.d.ts +49 -0
- package/lib/src/core-components/src/components/DynamicGrid/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/DynamicGrid/elements.js +409 -0
- package/lib/src/core-components/src/components/DynamicGrid/index.d.ts +4 -0
- package/lib/src/core-components/src/components/DynamicGrid/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/DynamicGrid/index.js +3 -0
- package/lib/src/core-components/src/components/DynamicGrid/types.d.ts +173 -0
- package/lib/src/core-components/src/components/DynamicGrid/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/DynamicGrid/types.js +28 -0
- package/lib/src/core-components/src/components/DynamicGrid/utils.d.ts +65 -0
- package/lib/src/core-components/src/components/DynamicGrid/utils.d.ts.map +1 -0
- package/lib/src/core-components/src/components/DynamicGrid/utils.js +193 -0
- package/lib/src/core-components/src/components/FormField/FormField.d.ts +1 -1
- package/lib/src/core-components/src/components/Icon/Icon.js +1 -1
- package/lib/src/core-components/src/components/Masonry/Masonry.d.ts +7 -0
- package/lib/src/core-components/src/components/Masonry/Masonry.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Masonry/Masonry.js +73 -0
- package/lib/src/core-components/src/components/Masonry/elements.d.ts +31 -0
- package/lib/src/core-components/src/components/Masonry/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Masonry/elements.js +122 -0
- package/lib/src/core-components/src/components/Masonry/hooks.d.ts +21 -0
- package/lib/src/core-components/src/components/Masonry/hooks.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Masonry/hooks.js +100 -0
- package/lib/src/core-components/src/components/Masonry/index.d.ts +4 -0
- package/lib/src/core-components/src/components/Masonry/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Masonry/index.js +3 -0
- package/lib/src/core-components/src/components/Masonry/types.d.ts +117 -0
- package/lib/src/core-components/src/components/Masonry/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Masonry/types.js +1 -0
- package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.d.ts +3 -3
- package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.d.ts.map +1 -1
- package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.js +1 -1
- package/lib/src/core-components/src/components/Picker/color-picker-modal/color-picker-modal.component.js +1 -1
- package/lib/src/core-components/src/components/Skeleton/Skeleton.d.ts +8 -0
- package/lib/src/core-components/src/components/Skeleton/Skeleton.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Skeleton/Skeleton.js +51 -0
- package/lib/src/core-components/src/components/Skeleton/elements.d.ts +33 -0
- package/lib/src/core-components/src/components/Skeleton/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Skeleton/elements.js +238 -0
- package/lib/src/core-components/src/components/Skeleton/index.d.ts +3 -0
- package/lib/src/core-components/src/components/Skeleton/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Skeleton/index.js +2 -0
- package/lib/src/core-components/src/components/Skeleton/types.d.ts +80 -0
- package/lib/src/core-components/src/components/Skeleton/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Skeleton/types.js +4 -0
- package/lib/src/core-components/src/components/SpeedDial/SpeedDial.d.ts +4 -0
- package/lib/src/core-components/src/components/SpeedDial/SpeedDial.d.ts.map +1 -0
- package/lib/src/core-components/src/components/SpeedDial/SpeedDial.js +128 -0
- package/lib/src/core-components/src/components/SpeedDial/elements.d.ts +57 -0
- package/lib/src/core-components/src/components/SpeedDial/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/SpeedDial/elements.js +299 -0
- package/lib/src/core-components/src/components/SpeedDial/index.d.ts +3 -0
- package/lib/src/core-components/src/components/SpeedDial/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/SpeedDial/index.js +2 -0
- package/lib/src/core-components/src/components/SpeedDial/types.d.ts +149 -0
- package/lib/src/core-components/src/components/SpeedDial/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/SpeedDial/types.js +3 -0
- package/lib/src/core-components/src/components/Switch/Switch.d.ts +4 -0
- package/lib/src/core-components/src/components/Switch/Switch.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Switch/Switch.js +26 -0
- package/lib/src/core-components/src/components/Switch/elements.d.ts +33 -0
- package/lib/src/core-components/src/components/Switch/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Switch/elements.js +167 -0
- package/lib/src/core-components/src/components/Switch/index.d.ts +3 -0
- package/lib/src/core-components/src/components/Switch/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Switch/index.js +2 -0
- package/lib/src/core-components/src/components/Switch/types.d.ts +32 -0
- package/lib/src/core-components/src/components/Switch/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Switch/types.js +3 -0
- package/lib/src/core-components/src/components/Table/Table.d.ts +7 -0
- package/lib/src/core-components/src/components/Table/Table.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Table/Table.js +357 -0
- package/lib/src/core-components/src/components/Table/elements.d.ts +89 -0
- package/lib/src/core-components/src/components/Table/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Table/elements.js +604 -0
- package/lib/src/core-components/src/components/Table/filters.d.ts +23 -0
- package/lib/src/core-components/src/components/Table/filters.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Table/filters.js +181 -0
- package/lib/src/core-components/src/components/Table/hooks.d.ts +107 -0
- package/lib/src/core-components/src/components/Table/hooks.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Table/hooks.js +451 -0
- package/lib/src/core-components/src/components/Table/index.d.ts +5 -0
- package/lib/src/core-components/src/components/Table/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Table/index.js +4 -0
- package/lib/src/core-components/src/components/Table/types.d.ts +358 -0
- package/lib/src/core-components/src/components/Table/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Table/types.js +1 -0
- package/lib/src/core-components/src/components/Toast/Toast.d.ts +5 -0
- package/lib/src/core-components/src/components/Toast/Toast.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Toast/Toast.js +50 -0
- package/lib/src/core-components/src/components/Toast/elements.d.ts +28 -0
- package/lib/src/core-components/src/components/Toast/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Toast/elements.js +272 -0
- package/lib/src/core-components/src/components/Toast/index.d.ts +3 -0
- package/lib/src/core-components/src/components/Toast/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Toast/index.js +2 -0
- package/lib/src/core-components/src/components/Toast/types.d.ts +52 -0
- package/lib/src/core-components/src/components/Toast/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Toast/types.js +9 -0
- package/lib/src/core-components/src/components/Tooltip/Tooltip.d.ts +7 -0
- package/lib/src/core-components/src/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Tooltip/Tooltip.js +200 -0
- package/lib/src/core-components/src/components/Tooltip/elements.d.ts +19 -0
- package/lib/src/core-components/src/components/Tooltip/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Tooltip/elements.js +195 -0
- package/lib/src/core-components/src/components/Tooltip/index.d.ts +3 -0
- package/lib/src/core-components/src/components/Tooltip/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Tooltip/index.js +2 -0
- package/lib/src/core-components/src/components/Tooltip/types.d.ts +81 -17
- package/lib/src/core-components/src/components/Tooltip/types.d.ts.map +1 -1
- package/lib/src/core-components/src/components/Tooltip/types.js +17 -1
- package/lib/src/core-components/src/components/Tooltip/utils.d.ts +26 -0
- package/lib/src/core-components/src/components/Tooltip/utils.d.ts.map +1 -0
- package/lib/src/core-components/src/components/Tooltip/utils.js +140 -0
- package/lib/src/core-components/src/components/TreeSelect/TreeSelect.d.ts +5 -0
- package/lib/src/core-components/src/components/TreeSelect/TreeSelect.d.ts.map +1 -0
- package/lib/src/core-components/src/components/TreeSelect/TreeSelect.js +303 -0
- package/lib/src/core-components/src/components/TreeSelect/elements.d.ts +74 -0
- package/lib/src/core-components/src/components/TreeSelect/elements.d.ts.map +1 -0
- package/lib/src/core-components/src/components/TreeSelect/elements.js +494 -0
- package/lib/src/core-components/src/components/TreeSelect/hooks.d.ts +57 -0
- package/lib/src/core-components/src/components/TreeSelect/hooks.d.ts.map +1 -0
- package/lib/src/core-components/src/components/TreeSelect/hooks.js +252 -0
- package/lib/src/core-components/src/components/TreeSelect/index.d.ts +4 -0
- package/lib/src/core-components/src/components/TreeSelect/index.d.ts.map +1 -0
- package/lib/src/core-components/src/components/TreeSelect/index.js +3 -0
- package/lib/src/core-components/src/components/TreeSelect/types.d.ts +205 -0
- package/lib/src/core-components/src/components/TreeSelect/types.d.ts.map +1 -0
- package/lib/src/core-components/src/components/TreeSelect/types.js +1 -0
- package/lib/src/core-components/src/components/index.d.ts +13 -1
- package/lib/src/core-components/src/components/index.d.ts.map +1 -1
- package/lib/src/core-components/src/components/index.js +14 -1
- package/lib/src/core-components/src/core-components/CoreButton/CoreButton.d.ts +2 -2
- package/lib/src/core-components/src/tc.global.css +13 -3
- package/lib/src/core-components/src/tc.module.css +2 -2
- package/package.json +1 -1
- package/lib/src/core-components/src/components/Tooltip/tooltip.component.d.ts +0 -29
- package/lib/src/core-components/src/components/Tooltip/tooltip.component.d.ts.map +0 -1
- package/lib/src/core-components/src/components/Tooltip/tooltip.component.js +0 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../src/core-components/src/components/DynamicGrid/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,SAAS,EAAmC,MAAM,OAAO,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,OAAO,EACP,aAAa,EAGb,YAAY,EACb,MAAM,SAAS,CAAC;AAYjB;;GAEG;AACH,eAAO,MAAM,OAAO,OAAQ,MAAM,KAAG,MAAiB,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,OAAO,QAAS,MAAM,KAAG,MAAkB,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,WAAW,QAAS,OAAO,GAAG,aAAa,KAAG,MAK1D,CAAC;AAEF;;GAEG;AACH,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,eAAO,MAAM,WAAW,qEAOrB,iBAAiB,KAAG,MAetB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,sBACZ,iBAAiB,eACvB,MAAM,KAClB,MAuBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,QAAO,MAiBjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,QACtB,UAAU,WAAW,CAAC,oBACT,MAAM,UAAU,MAAM,KAAK,IAAI,KAChD,IAuBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAC9B,UAAU,WAAW,CAAC,WAClB,YAAY,KACpB,IA8BF,CAAC;AAEF;;GAEG;AACH,UAAU,yBAAyB;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,mBAAmB,QACzB,UAAU,WAAW,CAAC,aAChB,MAAM,WACR,MAAM,KACd,yBA6DF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,aAAc,MAAM,SAAS,KAAG,MAIxD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,QAAO,MACiB,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { gapSizeValues, gapSizes, } from './types';
|
|
3
|
+
// Breakpoint values in pixels
|
|
4
|
+
const BREAKPOINTS = {
|
|
5
|
+
xs: 0,
|
|
6
|
+
sm: 375,
|
|
7
|
+
md: 768,
|
|
8
|
+
lg: 1024,
|
|
9
|
+
xl: 1280,
|
|
10
|
+
'2xl': 1440,
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Convert pixels to rem
|
|
14
|
+
*/
|
|
15
|
+
export const pxToRem = (px) => px / 16;
|
|
16
|
+
/**
|
|
17
|
+
* Convert rem to pixels
|
|
18
|
+
*/
|
|
19
|
+
export const remToPx = (rem) => rem * 16;
|
|
20
|
+
/**
|
|
21
|
+
* Get gap value from GapSize or LegacyGapSize
|
|
22
|
+
*/
|
|
23
|
+
export const getGapValue = (gap) => {
|
|
24
|
+
if (typeof gap === 'number') {
|
|
25
|
+
return gapSizes[gap] || gapSizes[1];
|
|
26
|
+
}
|
|
27
|
+
return gapSizeValues[gap] || gapSizeValues.md;
|
|
28
|
+
};
|
|
29
|
+
const moduloColumns = (columns, modulo) => Math.floor(columns / modulo) * modulo;
|
|
30
|
+
export const calcColumns = ({ minWidth, elementWidth, gap, modulo, maxColumns, scrollHint = 0, }) => {
|
|
31
|
+
if (elementWidth === 0)
|
|
32
|
+
return 1;
|
|
33
|
+
const gapSize = parseFloat(gap);
|
|
34
|
+
const elementWidthInRem = pxToRem(elementWidth);
|
|
35
|
+
const columns = Math.min(Math.floor((elementWidthInRem + gapSize - minWidth * scrollHint) /
|
|
36
|
+
(minWidth + gapSize)), maxColumns);
|
|
37
|
+
return Math.max(1, moduloColumns(columns, modulo));
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Get responsive columns based on window width
|
|
41
|
+
*/
|
|
42
|
+
export const getResponsiveColumns = (responsiveColumns, windowWidth) => {
|
|
43
|
+
let columns = 1;
|
|
44
|
+
if (responsiveColumns.xs !== undefined && windowWidth >= BREAKPOINTS.xs) {
|
|
45
|
+
columns = responsiveColumns.xs;
|
|
46
|
+
}
|
|
47
|
+
if (responsiveColumns.sm !== undefined && windowWidth >= BREAKPOINTS.sm) {
|
|
48
|
+
columns = responsiveColumns.sm;
|
|
49
|
+
}
|
|
50
|
+
if (responsiveColumns.md !== undefined && windowWidth >= BREAKPOINTS.md) {
|
|
51
|
+
columns = responsiveColumns.md;
|
|
52
|
+
}
|
|
53
|
+
if (responsiveColumns.lg !== undefined && windowWidth >= BREAKPOINTS.lg) {
|
|
54
|
+
columns = responsiveColumns.lg;
|
|
55
|
+
}
|
|
56
|
+
if (responsiveColumns.xl !== undefined && windowWidth >= BREAKPOINTS.xl) {
|
|
57
|
+
columns = responsiveColumns.xl;
|
|
58
|
+
}
|
|
59
|
+
if (responsiveColumns['2xl'] !== undefined && windowWidth >= BREAKPOINTS['2xl']) {
|
|
60
|
+
columns = responsiveColumns['2xl'];
|
|
61
|
+
}
|
|
62
|
+
return columns;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Hook to get current window width
|
|
66
|
+
*/
|
|
67
|
+
export const useWindowWidth = () => {
|
|
68
|
+
const [width, setWidth] = useState(typeof window !== 'undefined' ? window.innerWidth : 1024);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (typeof window === 'undefined')
|
|
71
|
+
return;
|
|
72
|
+
const handleResize = () => {
|
|
73
|
+
setWidth(window.innerWidth);
|
|
74
|
+
};
|
|
75
|
+
window.addEventListener('resize', handleResize);
|
|
76
|
+
return () => window.removeEventListener('resize', handleResize);
|
|
77
|
+
}, []);
|
|
78
|
+
return width;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Hook to observe element resize
|
|
82
|
+
*/
|
|
83
|
+
export const useElementResize = (ref, callback) => {
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
const element = ref.current;
|
|
86
|
+
if (!element)
|
|
87
|
+
return;
|
|
88
|
+
// Initial size
|
|
89
|
+
callback(element.clientWidth, element.clientHeight);
|
|
90
|
+
if (!window.ResizeObserver)
|
|
91
|
+
return;
|
|
92
|
+
const observer = new ResizeObserver((entries) => {
|
|
93
|
+
window.requestAnimationFrame(() => {
|
|
94
|
+
const entry = entries[0];
|
|
95
|
+
if (entry) {
|
|
96
|
+
callback(entry.contentRect.width, entry.contentRect.height);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
observer.observe(element);
|
|
101
|
+
return () => observer.disconnect();
|
|
102
|
+
}, [ref, callback]);
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Hook to handle keyboard focus scrolling in scroll mode
|
|
106
|
+
*/
|
|
107
|
+
export const useScrollToKeyboardFocus = (ref, scroll) => {
|
|
108
|
+
const scrollToFocused = useCallback((keyboardEvent) => {
|
|
109
|
+
const { target } = keyboardEvent;
|
|
110
|
+
if (target instanceof HTMLElement &&
|
|
111
|
+
scroll?.enabled &&
|
|
112
|
+
keyboardEvent.key === 'Tab') {
|
|
113
|
+
target.scrollIntoView({
|
|
114
|
+
inline: 'center',
|
|
115
|
+
block: 'nearest',
|
|
116
|
+
behavior: scroll.smoothScroll !== false ? 'smooth' : 'auto',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}, [scroll]);
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
const element = ref.current;
|
|
122
|
+
if (!element)
|
|
123
|
+
return;
|
|
124
|
+
element.addEventListener('keyup', scrollToFocused);
|
|
125
|
+
return () => {
|
|
126
|
+
element.removeEventListener('keyup', scrollToFocused);
|
|
127
|
+
};
|
|
128
|
+
}, [scrollToFocused, ref]);
|
|
129
|
+
};
|
|
130
|
+
export const useScrollNavigation = (ref, itemCount, columns) => {
|
|
131
|
+
const [scrollState, setScrollState] = useState({
|
|
132
|
+
canScrollLeft: false,
|
|
133
|
+
canScrollRight: true,
|
|
134
|
+
currentPage: 0,
|
|
135
|
+
});
|
|
136
|
+
const totalPages = Math.ceil(itemCount / columns);
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
const element = ref.current;
|
|
139
|
+
if (!element)
|
|
140
|
+
return;
|
|
141
|
+
const handleScroll = () => {
|
|
142
|
+
const { scrollLeft, scrollWidth, clientWidth } = element;
|
|
143
|
+
const canScrollLeft = scrollLeft > 0;
|
|
144
|
+
const canScrollRight = scrollLeft + clientWidth < scrollWidth - 1;
|
|
145
|
+
const currentPage = Math.round(scrollLeft / clientWidth);
|
|
146
|
+
setScrollState({ canScrollLeft, canScrollRight, currentPage });
|
|
147
|
+
};
|
|
148
|
+
element.addEventListener('scroll', handleScroll);
|
|
149
|
+
handleScroll(); // Initial check
|
|
150
|
+
return () => element.removeEventListener('scroll', handleScroll);
|
|
151
|
+
}, [ref]);
|
|
152
|
+
const scrollTo = useCallback((index) => {
|
|
153
|
+
const element = ref.current;
|
|
154
|
+
if (!element)
|
|
155
|
+
return;
|
|
156
|
+
const { clientWidth } = element;
|
|
157
|
+
element.scrollTo({
|
|
158
|
+
left: index * clientWidth,
|
|
159
|
+
behavior: 'smooth',
|
|
160
|
+
});
|
|
161
|
+
}, [ref]);
|
|
162
|
+
const scrollLeft = useCallback(() => {
|
|
163
|
+
if (scrollState.currentPage > 0) {
|
|
164
|
+
scrollTo(scrollState.currentPage - 1);
|
|
165
|
+
}
|
|
166
|
+
}, [scrollState.currentPage, scrollTo]);
|
|
167
|
+
const scrollRight = useCallback(() => {
|
|
168
|
+
if (scrollState.currentPage < totalPages - 1) {
|
|
169
|
+
scrollTo(scrollState.currentPage + 1);
|
|
170
|
+
}
|
|
171
|
+
}, [scrollState.currentPage, totalPages, scrollTo]);
|
|
172
|
+
return {
|
|
173
|
+
...scrollState,
|
|
174
|
+
totalPages,
|
|
175
|
+
scrollTo,
|
|
176
|
+
scrollLeft,
|
|
177
|
+
scrollRight,
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* Get item count from children
|
|
182
|
+
*/
|
|
183
|
+
export const getItemCount = (children) => {
|
|
184
|
+
if (!children)
|
|
185
|
+
return 0;
|
|
186
|
+
if (Array.isArray(children))
|
|
187
|
+
return children.filter(Boolean).length;
|
|
188
|
+
return 1;
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* Generate unique ID for accessibility
|
|
192
|
+
*/
|
|
193
|
+
export const generateGridId = () => `grid-${Math.random().toString(36).substr(2, 9)}`;
|
|
@@ -114,5 +114,5 @@ type TextareaSpecificProps = {
|
|
|
114
114
|
export interface FormFieldProps extends BaseFormFieldProps, SafeHTMLAttributes, FieldEventHandlers, Partial<InputSpecificProps>, Partial<TextareaSpecificProps> {
|
|
115
115
|
[key: string]: any;
|
|
116
116
|
}
|
|
117
|
-
export declare const FormField: React.ForwardRefExoticComponent<Omit<FormFieldProps, "ref"> & React.RefAttributes<
|
|
117
|
+
export declare const FormField: React.ForwardRefExoticComponent<Omit<FormFieldProps, "ref"> & React.RefAttributes<HTMLTextAreaElement | HTMLInputElement>>;
|
|
118
118
|
//# sourceMappingURL=FormField.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { Suspense } from 'react';
|
|
3
3
|
import _ from 'lodash';
|
|
4
|
-
import { Tooltip } from '../Tooltip
|
|
4
|
+
import { Tooltip } from '../Tooltip';
|
|
5
5
|
import loadable from '@loadable/component';
|
|
6
6
|
import s from '../../tc.module.css';
|
|
7
7
|
import { cn } from '../../utils';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { MasonryProps, MasonryItem, MasonryImageProps } from './types';
|
|
3
|
+
export declare const Masonry: <T extends MasonryItem>(props: MasonryProps<T> & {
|
|
4
|
+
ref?: React.ForwardedRef<HTMLDivElement> | undefined;
|
|
5
|
+
}) => React.ReactElement;
|
|
6
|
+
export declare const MasonryImageComponent: React.ForwardRefExoticComponent<MasonryImageProps & React.RefAttributes<HTMLImageElement>>;
|
|
7
|
+
//# sourceMappingURL=Masonry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Masonry.d.ts","sourceRoot":"","sources":["../../../../../../src/core-components/src/components/Masonry/Masonry.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAqD,MAAM,OAAO,CAAC;AAY1E,OAAO,EAAC,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAarE,eAAO,MAAM,OAAO;;MAyJf,MAAM,YAAY,CAAC;AAMxB,eAAO,MAAM,qBAAqB,4FA2CjC,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef, useCallback, useState, useEffect } from 'react';
|
|
4
|
+
import { MasonryContainer, MasonryColumn, MasonryItemWrapper, MasonryImage, ImagePlaceholder, EmptyState, MasonryCard, MasonryCardContent, } from './elements';
|
|
5
|
+
import { useResponsiveValue, useColumnDistribution, useImageLoading } from './hooks';
|
|
6
|
+
// Default empty icon
|
|
7
|
+
const EmptyIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [_jsx("rect", { x: "3", y: "3", width: "7", height: "7", rx: "1" }), _jsx("rect", { x: "14", y: "3", width: "7", height: "7", rx: "1" }), _jsx("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" }), _jsx("rect", { x: "14", y: "14", width: "7", height: "7", rx: "1" })] }));
|
|
8
|
+
export const Masonry = forwardRef(function MasonryComponent(props, ref) {
|
|
9
|
+
const { items, columns = 3, gutter = 16, renderItem, sequential = false, animationDuration = 300, animated = true, staggerDelay = 50, classNames = {}, styles = {}, className, style, onImageLoad, onLayoutComplete, minItemHeight, loadingPlaceholder, emptyState, } = props;
|
|
10
|
+
// Get responsive values
|
|
11
|
+
const columnCount = useResponsiveValue(columns, 3);
|
|
12
|
+
const gutterSize = useResponsiveValue(gutter, 16);
|
|
13
|
+
// Distribute items into columns
|
|
14
|
+
const columnData = useColumnDistribution(items, columnCount, sequential);
|
|
15
|
+
// Image loading state
|
|
16
|
+
const { setLoading, isLoading } = useImageLoading();
|
|
17
|
+
// Track global item index for stagger animation
|
|
18
|
+
let globalIndex = 0;
|
|
19
|
+
// Layout complete callback
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (items.length > 0) {
|
|
22
|
+
const timeout = setTimeout(() => {
|
|
23
|
+
onLayoutComplete?.();
|
|
24
|
+
}, animationDuration + staggerDelay * items.length);
|
|
25
|
+
return () => clearTimeout(timeout);
|
|
26
|
+
}
|
|
27
|
+
}, [items, animationDuration, staggerDelay, onLayoutComplete]);
|
|
28
|
+
// Handle image load
|
|
29
|
+
const handleImageLoad = useCallback((item, e) => {
|
|
30
|
+
const img = e.currentTarget;
|
|
31
|
+
setLoading(item.id, false);
|
|
32
|
+
onImageLoad?.(item, img.naturalWidth, img.naturalHeight);
|
|
33
|
+
}, [setLoading, onImageLoad]);
|
|
34
|
+
// Default render function
|
|
35
|
+
const defaultRenderItem = useCallback((item, index, columnIndex) => {
|
|
36
|
+
if (item.src) {
|
|
37
|
+
// Image item
|
|
38
|
+
return (_jsxs(MasonryCard, { "$borderRadius": 8, children: [isLoading(item.id) && (_jsx(ImagePlaceholder, { "$height": item.height, "$borderRadius": 8 })), _jsx(MasonryImage, { src: item.src, alt: item.alt || '', "$objectFit": "cover", "$borderRadius": 0, "$isLoading": isLoading(item.id), onLoad: (e) => handleImageLoad(item, e), onError: () => setLoading(item.id, false) }), item.content && (_jsx(MasonryCardContent, { children: item.content }))] }));
|
|
39
|
+
}
|
|
40
|
+
// Content item
|
|
41
|
+
if (item.content) {
|
|
42
|
+
return item.content;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}, [isLoading, handleImageLoad, setLoading]);
|
|
46
|
+
// Use custom render or default
|
|
47
|
+
const render = renderItem || defaultRenderItem;
|
|
48
|
+
// Empty state
|
|
49
|
+
if (items.length === 0) {
|
|
50
|
+
return (_jsx(EmptyState, { className: classNames.root, style: styles.root, children: emptyState || (_jsxs(_Fragment, { children: [_jsx(EmptyIcon, {}), _jsx("span", { children: "No items to display" })] })) }));
|
|
51
|
+
}
|
|
52
|
+
return (_jsx(MasonryContainer, { ref: ref, "$gutter": gutterSize, className: className || classNames.root, style: { ...styles.root, ...style }, role: "grid", "aria-label": "Masonry layout", children: columnData.map((columnItems, columnIndex) => (_jsx(MasonryColumn, { "$gutter": gutterSize, "$columnCount": columnCount, className: classNames.column, style: styles.column, role: "gridcell", children: columnItems.map((item, itemIndex) => {
|
|
53
|
+
const currentGlobalIndex = globalIndex++;
|
|
54
|
+
return (_jsx(MasonryItemWrapper, { "$animated": animated, "$animationDuration": animationDuration, "$staggerIndex": currentGlobalIndex, "$staggerDelay": staggerDelay, "$minHeight": minItemHeight, className: classNames.item, style: styles.item, children: render(item, itemIndex, columnIndex) }, item.id));
|
|
55
|
+
}) }, columnIndex))) }));
|
|
56
|
+
});
|
|
57
|
+
// Display name
|
|
58
|
+
Masonry.displayName = 'Masonry';
|
|
59
|
+
// MasonryImage component for standalone use
|
|
60
|
+
export const MasonryImageComponent = forwardRef(function MasonryImageComponent(props, ref) {
|
|
61
|
+
const { src, alt = '', className, style, onLoad, onError, objectFit = 'cover', borderRadius = 8, } = props;
|
|
62
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
63
|
+
const handleLoad = (e) => {
|
|
64
|
+
setIsLoading(false);
|
|
65
|
+
onLoad?.(e);
|
|
66
|
+
};
|
|
67
|
+
const handleError = (e) => {
|
|
68
|
+
setIsLoading(false);
|
|
69
|
+
onError?.(e);
|
|
70
|
+
};
|
|
71
|
+
return (_jsxs(_Fragment, { children: [isLoading && _jsx(ImagePlaceholder, { "$borderRadius": borderRadius }), _jsx(MasonryImage, { ref: ref, src: src, alt: alt, className: className, style: style, "$objectFit": objectFit, "$borderRadius": borderRadius, "$isLoading": isLoading, onLoad: handleLoad, onError: handleError })] }));
|
|
72
|
+
});
|
|
73
|
+
MasonryImageComponent.displayName = 'MasonryImage';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export declare const MasonryContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
|
|
3
|
+
$gutter: number;
|
|
4
|
+
}>> & string;
|
|
5
|
+
export declare const MasonryColumn: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
|
|
6
|
+
$gutter: number;
|
|
7
|
+
$columnCount: number;
|
|
8
|
+
}>> & string;
|
|
9
|
+
export declare const MasonryItemWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
|
|
10
|
+
$animated: boolean;
|
|
11
|
+
$animationDuration: number;
|
|
12
|
+
$staggerIndex: number;
|
|
13
|
+
$staggerDelay: number;
|
|
14
|
+
$minHeight?: number | undefined;
|
|
15
|
+
}>> & string;
|
|
16
|
+
export declare const MasonryImage: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, {
|
|
17
|
+
$objectFit: string;
|
|
18
|
+
$borderRadius: string | number;
|
|
19
|
+
$isLoading: boolean;
|
|
20
|
+
}>> & string;
|
|
21
|
+
export declare const ImagePlaceholder: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
|
|
22
|
+
$height?: string | number | undefined;
|
|
23
|
+
$borderRadius: string | number;
|
|
24
|
+
}>> & string;
|
|
25
|
+
export declare const EmptyState: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
|
|
26
|
+
export declare const MasonryCard: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
|
|
27
|
+
$borderRadius: string | number;
|
|
28
|
+
}>> & string;
|
|
29
|
+
export declare const MasonryCardImage: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, never>> & string;
|
|
30
|
+
export declare const MasonryCardContent: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
|
|
31
|
+
//# sourceMappingURL=elements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../../../../../../src/core-components/src/components/Masonry/elements.tsx"],"names":[],"mappings":";AAyBA,eAAO,MAAM,gBAAgB;aAClB,MAAM;YAMhB,CAAC;AAEF,eAAO,MAAM,aAAa;aACf,MAAM;kBACD,MAAM;YAOrB,CAAC;AAEF,eAAO,MAAM,kBAAkB;eAClB,OAAO;wBACE,MAAM;mBACX,MAAM;mBACN,MAAM;;YA2BtB,CAAC;AAEF,eAAO,MAAM,YAAY;gBACX,MAAM;mBACH,MAAM,GAAG,MAAM;gBAClB,OAAO;YAepB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;mBAEZ,MAAM,GAAG,MAAM;YAe/B,CAAC;AAEF,eAAO,MAAM,UAAU,6NAgBtB,CAAC;AAGF,eAAO,MAAM,WAAW;mBACP,MAAM,GAAG,MAAM;YAa/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,oOAI5B,CAAC;AAEF,eAAO,MAAM,kBAAkB,6NAE9B,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { styled, css, keyframes } from 'styled-components';
|
|
2
|
+
import { tokens } from '../../utils/designTokens';
|
|
3
|
+
// Animations
|
|
4
|
+
const fadeIn = keyframes `
|
|
5
|
+
from {
|
|
6
|
+
opacity: 0;
|
|
7
|
+
transform: translateY(10px);
|
|
8
|
+
}
|
|
9
|
+
to {
|
|
10
|
+
opacity: 1;
|
|
11
|
+
transform: translateY(0);
|
|
12
|
+
}
|
|
13
|
+
`;
|
|
14
|
+
const shimmer = keyframes `
|
|
15
|
+
0% {
|
|
16
|
+
background-position: -200% 0;
|
|
17
|
+
}
|
|
18
|
+
100% {
|
|
19
|
+
background-position: 200% 0;
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
export const MasonryContainer = styled.div `
|
|
23
|
+
display: flex;
|
|
24
|
+
width: 100%;
|
|
25
|
+
box-sizing: border-box;
|
|
26
|
+
gap: ${({ $gutter }) => $gutter}px;
|
|
27
|
+
`;
|
|
28
|
+
export const MasonryColumn = styled.div `
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
flex: 1;
|
|
32
|
+
min-width: 0;
|
|
33
|
+
gap: ${({ $gutter }) => $gutter}px;
|
|
34
|
+
`;
|
|
35
|
+
export const MasonryItemWrapper = styled.div `
|
|
36
|
+
width: 100%;
|
|
37
|
+
box-sizing: border-box;
|
|
38
|
+
overflow: hidden;
|
|
39
|
+
|
|
40
|
+
${({ $minHeight }) => $minHeight &&
|
|
41
|
+
css `
|
|
42
|
+
min-height: ${$minHeight}px;
|
|
43
|
+
`}
|
|
44
|
+
|
|
45
|
+
/* Animation */
|
|
46
|
+
${({ $animated, $animationDuration, $staggerIndex, $staggerDelay }) => $animated &&
|
|
47
|
+
css `
|
|
48
|
+
opacity: 0;
|
|
49
|
+
animation: ${fadeIn} ${$animationDuration}ms ease-out forwards;
|
|
50
|
+
animation-delay: ${$staggerIndex * $staggerDelay}ms;
|
|
51
|
+
`}
|
|
52
|
+
|
|
53
|
+
/* Reduce motion */
|
|
54
|
+
@media (prefers-reduced-motion: reduce) {
|
|
55
|
+
animation: none;
|
|
56
|
+
opacity: 1;
|
|
57
|
+
}
|
|
58
|
+
`;
|
|
59
|
+
export const MasonryImage = styled.img `
|
|
60
|
+
width: 100%;
|
|
61
|
+
height: auto;
|
|
62
|
+
display: block;
|
|
63
|
+
object-fit: ${({ $objectFit }) => $objectFit};
|
|
64
|
+
border-radius: ${({ $borderRadius }) => typeof $borderRadius === 'number' ? `${$borderRadius}px` : $borderRadius};
|
|
65
|
+
transition: opacity 0.3s ease;
|
|
66
|
+
|
|
67
|
+
${({ $isLoading }) => $isLoading &&
|
|
68
|
+
css `
|
|
69
|
+
opacity: 0;
|
|
70
|
+
`}
|
|
71
|
+
`;
|
|
72
|
+
export const ImagePlaceholder = styled.div `
|
|
73
|
+
width: 100%;
|
|
74
|
+
height: ${({ $height }) => $height ? (typeof $height === 'number' ? `${$height}px` : $height) : '200px'};
|
|
75
|
+
background: linear-gradient(
|
|
76
|
+
90deg,
|
|
77
|
+
${tokens.surface || '#f0f0f0'} 25%,
|
|
78
|
+
${tokens.outlineSoft || '#e5e5e5'} 50%,
|
|
79
|
+
${tokens.surface || '#f0f0f0'} 75%
|
|
80
|
+
);
|
|
81
|
+
background-size: 400% 100%;
|
|
82
|
+
animation: ${shimmer} 1.5s ease-in-out infinite;
|
|
83
|
+
border-radius: ${({ $borderRadius }) => typeof $borderRadius === 'number' ? `${$borderRadius}px` : $borderRadius};
|
|
84
|
+
`;
|
|
85
|
+
export const EmptyState = styled.div `
|
|
86
|
+
display: flex;
|
|
87
|
+
flex-direction: column;
|
|
88
|
+
align-items: center;
|
|
89
|
+
justify-content: center;
|
|
90
|
+
padding: 48px 24px;
|
|
91
|
+
text-align: center;
|
|
92
|
+
color: ${tokens.onSurface ? `${tokens.onSurface}80` : '#6b7280'};
|
|
93
|
+
font-size: 14px;
|
|
94
|
+
|
|
95
|
+
svg {
|
|
96
|
+
width: 48px;
|
|
97
|
+
height: 48px;
|
|
98
|
+
margin-bottom: 16px;
|
|
99
|
+
opacity: 0.5;
|
|
100
|
+
}
|
|
101
|
+
`;
|
|
102
|
+
// Card style for default item rendering
|
|
103
|
+
export const MasonryCard = styled.div `
|
|
104
|
+
background: white;
|
|
105
|
+
border-radius: ${({ $borderRadius }) => typeof $borderRadius === 'number' ? `${$borderRadius}px` : $borderRadius};
|
|
106
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
107
|
+
overflow: hidden;
|
|
108
|
+
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
|
109
|
+
|
|
110
|
+
&:hover {
|
|
111
|
+
transform: translateY(-2px);
|
|
112
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06);
|
|
113
|
+
}
|
|
114
|
+
`;
|
|
115
|
+
export const MasonryCardImage = styled.img `
|
|
116
|
+
width: 100%;
|
|
117
|
+
height: auto;
|
|
118
|
+
display: block;
|
|
119
|
+
`;
|
|
120
|
+
export const MasonryCardContent = styled.div `
|
|
121
|
+
padding: 12px 16px;
|
|
122
|
+
`;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { MasonryBreakpoints } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Hook to get responsive value based on current viewport width
|
|
4
|
+
*/
|
|
5
|
+
export declare function useResponsiveValue<T extends number>(value: T | MasonryBreakpoints, defaultValue: T): T;
|
|
6
|
+
/**
|
|
7
|
+
* Hook to distribute items into columns
|
|
8
|
+
*/
|
|
9
|
+
export declare function useColumnDistribution<T extends {
|
|
10
|
+
id: string | number;
|
|
11
|
+
column?: number;
|
|
12
|
+
}>(items: T[], columnCount: number, sequential?: boolean): T[][];
|
|
13
|
+
/**
|
|
14
|
+
* Hook to track image loading states
|
|
15
|
+
*/
|
|
16
|
+
export declare function useImageLoading(): {
|
|
17
|
+
setLoading: (id: string | number, isLoading: boolean) => void;
|
|
18
|
+
isLoading: (id: string | number) => boolean;
|
|
19
|
+
isLoaded: (id: string | number) => boolean;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../../../../src/core-components/src/components/Masonry/hooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAY3C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,KAAK,EAAE,CAAC,GAAG,kBAAkB,EAC7B,YAAY,EAAE,CAAC,GACd,CAAC,CAuBH;AAmBD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS;IAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAC,EACpF,KAAK,EAAE,CAAC,EAAE,EACV,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,OAAe,GAC1B,CAAC,EAAE,EAAE,CAmCP;AAED;;GAEG;AACH,wBAAgB,eAAe;qBAIO,MAAM,GAAG,MAAM,aAAa,OAAO;oBAOpC,MAAM,GAAG,MAAM;mBAIhB,MAAM,GAAG,MAAM;EAKlD"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback, useMemo } from 'react';
|
|
2
|
+
// Breakpoint values in pixels
|
|
3
|
+
const BREAKPOINT_VALUES = {
|
|
4
|
+
xs: 0,
|
|
5
|
+
sm: 640,
|
|
6
|
+
md: 768,
|
|
7
|
+
lg: 1024,
|
|
8
|
+
xl: 1280,
|
|
9
|
+
'2xl': 1536,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Hook to get responsive value based on current viewport width
|
|
13
|
+
*/
|
|
14
|
+
export function useResponsiveValue(value, defaultValue) {
|
|
15
|
+
const [currentValue, setCurrentValue] = useState(() => {
|
|
16
|
+
if (typeof value === 'number')
|
|
17
|
+
return value;
|
|
18
|
+
return getResponsiveValue(value, defaultValue, typeof window !== 'undefined' ? window.innerWidth : 1024);
|
|
19
|
+
});
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (typeof value === 'number') {
|
|
22
|
+
setCurrentValue(value);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const handleResize = () => {
|
|
26
|
+
const width = window.innerWidth;
|
|
27
|
+
setCurrentValue(getResponsiveValue(value, defaultValue, width));
|
|
28
|
+
};
|
|
29
|
+
handleResize();
|
|
30
|
+
window.addEventListener('resize', handleResize);
|
|
31
|
+
return () => window.removeEventListener('resize', handleResize);
|
|
32
|
+
}, [value, defaultValue]);
|
|
33
|
+
return currentValue;
|
|
34
|
+
}
|
|
35
|
+
function getResponsiveValue(breakpoints, defaultValue, width) {
|
|
36
|
+
const sortedBreakpoints = Object.entries(BREAKPOINT_VALUES)
|
|
37
|
+
.sort(([, a], [, b]) => b - a);
|
|
38
|
+
for (const [key, breakpointWidth] of sortedBreakpoints) {
|
|
39
|
+
if (width >= breakpointWidth && breakpoints[key] !== undefined) {
|
|
40
|
+
return breakpoints[key];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return defaultValue;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Hook to distribute items into columns
|
|
47
|
+
*/
|
|
48
|
+
export function useColumnDistribution(items, columnCount, sequential = false) {
|
|
49
|
+
return useMemo(() => {
|
|
50
|
+
const columns = Array.from({ length: columnCount }, () => []);
|
|
51
|
+
if (sequential) {
|
|
52
|
+
// Sequential: place items in order, filling columns one by one
|
|
53
|
+
items.forEach((item, index) => {
|
|
54
|
+
const columnIndex = item.column !== undefined
|
|
55
|
+
? Math.min(item.column, columnCount - 1)
|
|
56
|
+
: index % columnCount;
|
|
57
|
+
columns[columnIndex].push(item);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Balanced: distribute items to shortest column
|
|
62
|
+
const columnHeights = Array(columnCount).fill(0);
|
|
63
|
+
items.forEach((item) => {
|
|
64
|
+
let targetColumn;
|
|
65
|
+
if (item.column !== undefined) {
|
|
66
|
+
// Respect specified column
|
|
67
|
+
targetColumn = Math.min(item.column, columnCount - 1);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Find shortest column
|
|
71
|
+
targetColumn = columnHeights.indexOf(Math.min(...columnHeights));
|
|
72
|
+
}
|
|
73
|
+
columns[targetColumn].push(item);
|
|
74
|
+
// Increment height (use 1 as placeholder, actual heights vary)
|
|
75
|
+
columnHeights[targetColumn]++;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return columns;
|
|
79
|
+
}, [items, columnCount, sequential]);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Hook to track image loading states
|
|
83
|
+
*/
|
|
84
|
+
export function useImageLoading() {
|
|
85
|
+
const [loadingStates, setLoadingStates] = useState({});
|
|
86
|
+
const [loadedImages, setLoadedImages] = useState(new Set());
|
|
87
|
+
const setLoading = useCallback((id, isLoading) => {
|
|
88
|
+
setLoadingStates(prev => ({ ...prev, [id]: isLoading }));
|
|
89
|
+
if (!isLoading) {
|
|
90
|
+
setLoadedImages(prev => new Set(prev).add(id));
|
|
91
|
+
}
|
|
92
|
+
}, []);
|
|
93
|
+
const isLoading = useCallback((id) => {
|
|
94
|
+
return loadingStates[id] ?? true;
|
|
95
|
+
}, [loadingStates]);
|
|
96
|
+
const isLoaded = useCallback((id) => {
|
|
97
|
+
return loadedImages.has(id);
|
|
98
|
+
}, [loadedImages]);
|
|
99
|
+
return { setLoading, isLoading, isLoaded };
|
|
100
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/core-components/src/components/Masonry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,qBAAqB,IAAI,YAAY,EAAC,MAAM,WAAW,CAAC;AACzE,cAAc,SAAS,CAAC;AACxB,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAAC,MAAM,SAAS,CAAC"}
|