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.
Files changed (201) hide show
  1. package/lib/src/core-components/src/components/AlertBanner/AlertBanner.d.ts +4 -0
  2. package/lib/src/core-components/src/components/AlertBanner/AlertBanner.d.ts.map +1 -0
  3. package/lib/src/core-components/src/components/AlertBanner/AlertBanner.js +45 -0
  4. package/lib/src/core-components/src/components/AlertBanner/elements.d.ts +27 -0
  5. package/lib/src/core-components/src/components/AlertBanner/elements.d.ts.map +1 -0
  6. package/lib/src/core-components/src/components/AlertBanner/elements.js +233 -0
  7. package/lib/src/core-components/src/components/AlertBanner/index.d.ts +3 -0
  8. package/lib/src/core-components/src/components/AlertBanner/index.d.ts.map +1 -0
  9. package/lib/src/core-components/src/components/AlertBanner/index.js +2 -0
  10. package/lib/src/core-components/src/components/AlertBanner/types.d.ts +46 -0
  11. package/lib/src/core-components/src/components/AlertBanner/types.d.ts.map +1 -0
  12. package/lib/src/core-components/src/components/AlertBanner/types.js +10 -0
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. package/lib/src/core-components/src/components/Badge/Badge.d.ts +33 -33
  19. package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.d.ts +28 -0
  20. package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -0
  21. package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.js +83 -0
  22. package/lib/src/core-components/src/components/Breadcrumb/elements.d.ts +44 -0
  23. package/lib/src/core-components/src/components/Breadcrumb/elements.d.ts.map +1 -0
  24. package/lib/src/core-components/src/components/Breadcrumb/elements.js +370 -0
  25. package/lib/src/core-components/src/components/Breadcrumb/index.d.ts +4 -0
  26. package/lib/src/core-components/src/components/Breadcrumb/index.d.ts.map +1 -0
  27. package/lib/src/core-components/src/components/Breadcrumb/index.js +3 -0
  28. package/lib/src/core-components/src/components/Breadcrumb/types.d.ts +14 -0
  29. package/lib/src/core-components/src/components/Breadcrumb/types.d.ts.map +1 -0
  30. package/lib/src/core-components/src/components/Breadcrumb/types.js +3 -0
  31. package/lib/src/core-components/src/components/Button/Button.spec.js +1 -1
  32. package/lib/src/core-components/src/components/Button/button.component.js +1 -1
  33. package/lib/src/core-components/src/components/Chip/Chip.d.ts +5 -0
  34. package/lib/src/core-components/src/components/Chip/Chip.d.ts.map +1 -0
  35. package/lib/src/core-components/src/components/Chip/Chip.js +64 -0
  36. package/lib/src/core-components/src/components/Chip/elements.d.ts +27 -0
  37. package/lib/src/core-components/src/components/Chip/elements.d.ts.map +1 -0
  38. package/lib/src/core-components/src/components/Chip/elements.js +253 -0
  39. package/lib/src/core-components/src/components/Chip/index.d.ts +3 -0
  40. package/lib/src/core-components/src/components/Chip/index.d.ts.map +1 -0
  41. package/lib/src/core-components/src/components/Chip/index.js +2 -0
  42. package/lib/src/core-components/src/components/Chip/types.d.ts +54 -0
  43. package/lib/src/core-components/src/components/Chip/types.d.ts.map +1 -0
  44. package/lib/src/core-components/src/components/Chip/types.js +4 -0
  45. package/lib/src/core-components/src/components/Divider/Divider.d.ts +4 -0
  46. package/lib/src/core-components/src/components/Divider/Divider.d.ts.map +1 -0
  47. package/lib/src/core-components/src/components/Divider/Divider.js +25 -0
  48. package/lib/src/core-components/src/components/Divider/elements.d.ts +22 -0
  49. package/lib/src/core-components/src/components/Divider/elements.d.ts.map +1 -0
  50. package/lib/src/core-components/src/components/Divider/elements.js +103 -0
  51. package/lib/src/core-components/src/components/Divider/index.d.ts +3 -0
  52. package/lib/src/core-components/src/components/Divider/index.d.ts.map +1 -0
  53. package/lib/src/core-components/src/components/Divider/index.js +2 -0
  54. package/lib/src/core-components/src/components/Divider/types.d.ts +30 -0
  55. package/lib/src/core-components/src/components/Divider/types.d.ts.map +1 -0
  56. package/lib/src/core-components/src/components/Divider/types.js +4 -0
  57. package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.d.ts +6 -0
  58. package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.d.ts.map +1 -0
  59. package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.js +147 -0
  60. package/lib/src/core-components/src/components/DynamicGrid/GridContainer.d.ts +12 -0
  61. package/lib/src/core-components/src/components/DynamicGrid/GridContainer.d.ts.map +1 -0
  62. package/lib/src/core-components/src/components/DynamicGrid/GridContainer.js +89 -0
  63. package/lib/src/core-components/src/components/DynamicGrid/elements.d.ts +49 -0
  64. package/lib/src/core-components/src/components/DynamicGrid/elements.d.ts.map +1 -0
  65. package/lib/src/core-components/src/components/DynamicGrid/elements.js +409 -0
  66. package/lib/src/core-components/src/components/DynamicGrid/index.d.ts +4 -0
  67. package/lib/src/core-components/src/components/DynamicGrid/index.d.ts.map +1 -0
  68. package/lib/src/core-components/src/components/DynamicGrid/index.js +3 -0
  69. package/lib/src/core-components/src/components/DynamicGrid/types.d.ts +173 -0
  70. package/lib/src/core-components/src/components/DynamicGrid/types.d.ts.map +1 -0
  71. package/lib/src/core-components/src/components/DynamicGrid/types.js +28 -0
  72. package/lib/src/core-components/src/components/DynamicGrid/utils.d.ts +65 -0
  73. package/lib/src/core-components/src/components/DynamicGrid/utils.d.ts.map +1 -0
  74. package/lib/src/core-components/src/components/DynamicGrid/utils.js +193 -0
  75. package/lib/src/core-components/src/components/FormField/FormField.d.ts +1 -1
  76. package/lib/src/core-components/src/components/Icon/Icon.js +1 -1
  77. package/lib/src/core-components/src/components/Masonry/Masonry.d.ts +7 -0
  78. package/lib/src/core-components/src/components/Masonry/Masonry.d.ts.map +1 -0
  79. package/lib/src/core-components/src/components/Masonry/Masonry.js +73 -0
  80. package/lib/src/core-components/src/components/Masonry/elements.d.ts +31 -0
  81. package/lib/src/core-components/src/components/Masonry/elements.d.ts.map +1 -0
  82. package/lib/src/core-components/src/components/Masonry/elements.js +122 -0
  83. package/lib/src/core-components/src/components/Masonry/hooks.d.ts +21 -0
  84. package/lib/src/core-components/src/components/Masonry/hooks.d.ts.map +1 -0
  85. package/lib/src/core-components/src/components/Masonry/hooks.js +100 -0
  86. package/lib/src/core-components/src/components/Masonry/index.d.ts +4 -0
  87. package/lib/src/core-components/src/components/Masonry/index.d.ts.map +1 -0
  88. package/lib/src/core-components/src/components/Masonry/index.js +3 -0
  89. package/lib/src/core-components/src/components/Masonry/types.d.ts +117 -0
  90. package/lib/src/core-components/src/components/Masonry/types.d.ts.map +1 -0
  91. package/lib/src/core-components/src/components/Masonry/types.js +1 -0
  92. package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.d.ts +3 -3
  93. package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.d.ts.map +1 -1
  94. package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.js +1 -1
  95. package/lib/src/core-components/src/components/Picker/color-picker-modal/color-picker-modal.component.js +1 -1
  96. package/lib/src/core-components/src/components/Skeleton/Skeleton.d.ts +8 -0
  97. package/lib/src/core-components/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  98. package/lib/src/core-components/src/components/Skeleton/Skeleton.js +51 -0
  99. package/lib/src/core-components/src/components/Skeleton/elements.d.ts +33 -0
  100. package/lib/src/core-components/src/components/Skeleton/elements.d.ts.map +1 -0
  101. package/lib/src/core-components/src/components/Skeleton/elements.js +238 -0
  102. package/lib/src/core-components/src/components/Skeleton/index.d.ts +3 -0
  103. package/lib/src/core-components/src/components/Skeleton/index.d.ts.map +1 -0
  104. package/lib/src/core-components/src/components/Skeleton/index.js +2 -0
  105. package/lib/src/core-components/src/components/Skeleton/types.d.ts +80 -0
  106. package/lib/src/core-components/src/components/Skeleton/types.d.ts.map +1 -0
  107. package/lib/src/core-components/src/components/Skeleton/types.js +4 -0
  108. package/lib/src/core-components/src/components/SpeedDial/SpeedDial.d.ts +4 -0
  109. package/lib/src/core-components/src/components/SpeedDial/SpeedDial.d.ts.map +1 -0
  110. package/lib/src/core-components/src/components/SpeedDial/SpeedDial.js +128 -0
  111. package/lib/src/core-components/src/components/SpeedDial/elements.d.ts +57 -0
  112. package/lib/src/core-components/src/components/SpeedDial/elements.d.ts.map +1 -0
  113. package/lib/src/core-components/src/components/SpeedDial/elements.js +299 -0
  114. package/lib/src/core-components/src/components/SpeedDial/index.d.ts +3 -0
  115. package/lib/src/core-components/src/components/SpeedDial/index.d.ts.map +1 -0
  116. package/lib/src/core-components/src/components/SpeedDial/index.js +2 -0
  117. package/lib/src/core-components/src/components/SpeedDial/types.d.ts +149 -0
  118. package/lib/src/core-components/src/components/SpeedDial/types.d.ts.map +1 -0
  119. package/lib/src/core-components/src/components/SpeedDial/types.js +3 -0
  120. package/lib/src/core-components/src/components/Switch/Switch.d.ts +4 -0
  121. package/lib/src/core-components/src/components/Switch/Switch.d.ts.map +1 -0
  122. package/lib/src/core-components/src/components/Switch/Switch.js +26 -0
  123. package/lib/src/core-components/src/components/Switch/elements.d.ts +33 -0
  124. package/lib/src/core-components/src/components/Switch/elements.d.ts.map +1 -0
  125. package/lib/src/core-components/src/components/Switch/elements.js +167 -0
  126. package/lib/src/core-components/src/components/Switch/index.d.ts +3 -0
  127. package/lib/src/core-components/src/components/Switch/index.d.ts.map +1 -0
  128. package/lib/src/core-components/src/components/Switch/index.js +2 -0
  129. package/lib/src/core-components/src/components/Switch/types.d.ts +32 -0
  130. package/lib/src/core-components/src/components/Switch/types.d.ts.map +1 -0
  131. package/lib/src/core-components/src/components/Switch/types.js +3 -0
  132. package/lib/src/core-components/src/components/Table/Table.d.ts +7 -0
  133. package/lib/src/core-components/src/components/Table/Table.d.ts.map +1 -0
  134. package/lib/src/core-components/src/components/Table/Table.js +357 -0
  135. package/lib/src/core-components/src/components/Table/elements.d.ts +89 -0
  136. package/lib/src/core-components/src/components/Table/elements.d.ts.map +1 -0
  137. package/lib/src/core-components/src/components/Table/elements.js +604 -0
  138. package/lib/src/core-components/src/components/Table/filters.d.ts +23 -0
  139. package/lib/src/core-components/src/components/Table/filters.d.ts.map +1 -0
  140. package/lib/src/core-components/src/components/Table/filters.js +181 -0
  141. package/lib/src/core-components/src/components/Table/hooks.d.ts +107 -0
  142. package/lib/src/core-components/src/components/Table/hooks.d.ts.map +1 -0
  143. package/lib/src/core-components/src/components/Table/hooks.js +451 -0
  144. package/lib/src/core-components/src/components/Table/index.d.ts +5 -0
  145. package/lib/src/core-components/src/components/Table/index.d.ts.map +1 -0
  146. package/lib/src/core-components/src/components/Table/index.js +4 -0
  147. package/lib/src/core-components/src/components/Table/types.d.ts +358 -0
  148. package/lib/src/core-components/src/components/Table/types.d.ts.map +1 -0
  149. package/lib/src/core-components/src/components/Table/types.js +1 -0
  150. package/lib/src/core-components/src/components/Toast/Toast.d.ts +5 -0
  151. package/lib/src/core-components/src/components/Toast/Toast.d.ts.map +1 -0
  152. package/lib/src/core-components/src/components/Toast/Toast.js +50 -0
  153. package/lib/src/core-components/src/components/Toast/elements.d.ts +28 -0
  154. package/lib/src/core-components/src/components/Toast/elements.d.ts.map +1 -0
  155. package/lib/src/core-components/src/components/Toast/elements.js +272 -0
  156. package/lib/src/core-components/src/components/Toast/index.d.ts +3 -0
  157. package/lib/src/core-components/src/components/Toast/index.d.ts.map +1 -0
  158. package/lib/src/core-components/src/components/Toast/index.js +2 -0
  159. package/lib/src/core-components/src/components/Toast/types.d.ts +52 -0
  160. package/lib/src/core-components/src/components/Toast/types.d.ts.map +1 -0
  161. package/lib/src/core-components/src/components/Toast/types.js +9 -0
  162. package/lib/src/core-components/src/components/Tooltip/Tooltip.d.ts +7 -0
  163. package/lib/src/core-components/src/components/Tooltip/Tooltip.d.ts.map +1 -0
  164. package/lib/src/core-components/src/components/Tooltip/Tooltip.js +200 -0
  165. package/lib/src/core-components/src/components/Tooltip/elements.d.ts +19 -0
  166. package/lib/src/core-components/src/components/Tooltip/elements.d.ts.map +1 -0
  167. package/lib/src/core-components/src/components/Tooltip/elements.js +195 -0
  168. package/lib/src/core-components/src/components/Tooltip/index.d.ts +3 -0
  169. package/lib/src/core-components/src/components/Tooltip/index.d.ts.map +1 -0
  170. package/lib/src/core-components/src/components/Tooltip/index.js +2 -0
  171. package/lib/src/core-components/src/components/Tooltip/types.d.ts +81 -17
  172. package/lib/src/core-components/src/components/Tooltip/types.d.ts.map +1 -1
  173. package/lib/src/core-components/src/components/Tooltip/types.js +17 -1
  174. package/lib/src/core-components/src/components/Tooltip/utils.d.ts +26 -0
  175. package/lib/src/core-components/src/components/Tooltip/utils.d.ts.map +1 -0
  176. package/lib/src/core-components/src/components/Tooltip/utils.js +140 -0
  177. package/lib/src/core-components/src/components/TreeSelect/TreeSelect.d.ts +5 -0
  178. package/lib/src/core-components/src/components/TreeSelect/TreeSelect.d.ts.map +1 -0
  179. package/lib/src/core-components/src/components/TreeSelect/TreeSelect.js +303 -0
  180. package/lib/src/core-components/src/components/TreeSelect/elements.d.ts +74 -0
  181. package/lib/src/core-components/src/components/TreeSelect/elements.d.ts.map +1 -0
  182. package/lib/src/core-components/src/components/TreeSelect/elements.js +494 -0
  183. package/lib/src/core-components/src/components/TreeSelect/hooks.d.ts +57 -0
  184. package/lib/src/core-components/src/components/TreeSelect/hooks.d.ts.map +1 -0
  185. package/lib/src/core-components/src/components/TreeSelect/hooks.js +252 -0
  186. package/lib/src/core-components/src/components/TreeSelect/index.d.ts +4 -0
  187. package/lib/src/core-components/src/components/TreeSelect/index.d.ts.map +1 -0
  188. package/lib/src/core-components/src/components/TreeSelect/index.js +3 -0
  189. package/lib/src/core-components/src/components/TreeSelect/types.d.ts +205 -0
  190. package/lib/src/core-components/src/components/TreeSelect/types.d.ts.map +1 -0
  191. package/lib/src/core-components/src/components/TreeSelect/types.js +1 -0
  192. package/lib/src/core-components/src/components/index.d.ts +13 -1
  193. package/lib/src/core-components/src/components/index.d.ts.map +1 -1
  194. package/lib/src/core-components/src/components/index.js +14 -1
  195. package/lib/src/core-components/src/core-components/CoreButton/CoreButton.d.ts +2 -2
  196. package/lib/src/core-components/src/tc.global.css +13 -3
  197. package/lib/src/core-components/src/tc.module.css +2 -2
  198. package/package.json +1 -1
  199. package/lib/src/core-components/src/components/Tooltip/tooltip.component.d.ts +0 -29
  200. package/lib/src/core-components/src/components/Tooltip/tooltip.component.d.ts.map +0 -1
  201. 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<HTMLInputElement | HTMLTextAreaElement>>;
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/tooltip.component';
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,4 @@
1
+ export { Masonry, MasonryImageComponent as MasonryImage } from './Masonry';
2
+ export * from './types';
3
+ export { useResponsiveValue, useColumnDistribution, useImageLoading } from './hooks';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ export { Masonry, MasonryImageComponent as MasonryImage } from './Masonry';
2
+ export * from './types';
3
+ export { useResponsiveValue, useColumnDistribution, useImageLoading } from './hooks';