@soyfri/shared-library 1.5.0 → 2.0.0-beta.1

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 (284) hide show
  1. package/build.js +75 -38
  2. package/dist/components/ActionMenu/ActionMenu.cjs +107 -0
  3. package/dist/components/ActionMenu/ActionMenu.cjs.map +1 -0
  4. package/dist/components/ActionMenu/ActionMenu.d.ts +60 -0
  5. package/dist/components/ActionMenu/ActionMenu.js +107 -0
  6. package/dist/components/ActionMenu/ActionMenu.js.map +1 -0
  7. package/dist/components/ActionMenu/index.d.ts +2 -0
  8. package/dist/components/ActionMenu.d.ts +6 -0
  9. package/dist/components/AppBar/AppBar.cjs +346 -0
  10. package/dist/components/AppBar/AppBar.cjs.map +1 -0
  11. package/dist/components/AppBar/AppBar.d.ts +55 -0
  12. package/dist/components/AppBar/AppBar.js +346 -0
  13. package/dist/components/AppBar/AppBar.js.map +1 -0
  14. package/dist/components/AppBar/AppBar.sx.d.ts +12 -0
  15. package/dist/components/AppBar/AppBarBrand.d.ts +31 -0
  16. package/dist/components/AppBar/AppBarContext.d.ts +18 -0
  17. package/dist/components/AppBar/AppBarMenuToggle.d.ts +39 -0
  18. package/dist/components/AppBar/AppBarUserMenu.d.ts +65 -0
  19. package/dist/components/AppBar/index.d.ts +12 -0
  20. package/dist/components/AppBar.d.ts +6 -0
  21. package/dist/components/Autocomplete/Autocomplete.cjs +259 -54
  22. package/dist/components/Autocomplete/Autocomplete.cjs.map +1 -1
  23. package/dist/components/Autocomplete/Autocomplete.d.ts +64 -9
  24. package/dist/components/Autocomplete/Autocomplete.definitions.d.ts +6 -0
  25. package/dist/components/Autocomplete/Autocomplete.helpers.d.ts +18 -0
  26. package/dist/components/Autocomplete/Autocomplete.js +261 -56
  27. package/dist/components/Autocomplete/Autocomplete.js.map +1 -1
  28. package/dist/components/Autocomplete/Autocomplete.sx.d.ts +7 -0
  29. package/dist/components/Autocomplete/Autocomplete.types.d.ts +1 -0
  30. package/dist/components/Autocomplete/_parts/AutocompleteChips.d.ts +19 -0
  31. package/dist/components/Autocomplete/_parts/AutocompleteLoader.d.ts +9 -0
  32. package/dist/components/Autocomplete/_parts/AutocompleteOption.d.ts +19 -0
  33. package/dist/components/Autocomplete/index.d.ts +2 -1
  34. package/dist/components/Autocomplete.d.ts +4 -0
  35. package/dist/components/Avatar/Avatar.cjs +116 -79
  36. package/dist/components/Avatar/Avatar.cjs.map +1 -1
  37. package/dist/components/Avatar/Avatar.d.ts +16 -2
  38. package/dist/components/Avatar/Avatar.definitions.d.ts +11 -0
  39. package/dist/components/Avatar/Avatar.js +117 -80
  40. package/dist/components/Avatar/Avatar.js.map +1 -1
  41. package/dist/components/Card/Card.cjs +168 -9
  42. package/dist/components/Card/Card.cjs.map +1 -1
  43. package/dist/components/Card/Card.d.ts +78 -8
  44. package/dist/components/Card/Card.js +170 -11
  45. package/dist/components/Card/Card.js.map +1 -1
  46. package/dist/components/Card/Card.sx.d.ts +17 -0
  47. package/dist/components/Card/index.d.ts +4 -1
  48. package/dist/components/Card.d.ts +4 -0
  49. package/dist/components/DatePicker/DatePicker.cjs +201 -3
  50. package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
  51. package/dist/components/DatePicker/DatePicker.d.ts +47 -9
  52. package/dist/components/DatePicker/DatePicker.definitions.d.ts +1 -0
  53. package/dist/components/DatePicker/DatePicker.helpers.d.ts +7 -0
  54. package/dist/components/DatePicker/DatePicker.js +200 -2
  55. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  56. package/dist/components/DatePicker/DatePicker.sx.d.ts +9 -0
  57. package/dist/components/DatePicker/DatePicker.types.d.ts +1 -0
  58. package/dist/components/DatePicker/index.d.ts +2 -1
  59. package/dist/components/DatePicker.d.ts +4 -0
  60. package/dist/components/DateTimePicker/DateTimePicker.cjs +152 -138
  61. package/dist/components/DateTimePicker/DateTimePicker.cjs.map +1 -1
  62. package/dist/components/DateTimePicker/DateTimePicker.d.ts +46 -9
  63. package/dist/components/DateTimePicker/DateTimePicker.definitions.d.ts +1 -0
  64. package/dist/components/DateTimePicker/DateTimePicker.helpers.d.ts +11 -0
  65. package/dist/components/DateTimePicker/DateTimePicker.js +152 -138
  66. package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
  67. package/dist/components/DateTimePicker/DateTimePicker.sx.d.ts +7 -0
  68. package/dist/components/DateTimePicker/DateTimePicker.types.d.ts +1 -0
  69. package/dist/components/DateTimePicker/index.d.ts +2 -1
  70. package/dist/components/DateTimePicker.d.ts +4 -0
  71. package/dist/components/Drawer/Drawer.cjs +271 -0
  72. package/dist/components/Drawer/Drawer.cjs.map +1 -0
  73. package/dist/components/Drawer/Drawer.d.ts +51 -0
  74. package/dist/components/Drawer/Drawer.js +271 -0
  75. package/dist/components/Drawer/Drawer.js.map +1 -0
  76. package/dist/components/Drawer/Drawer.sx.d.ts +23 -0
  77. package/dist/components/Drawer/DrawerContext.d.ts +18 -0
  78. package/dist/components/Drawer/DrawerItem.d.ts +35 -0
  79. package/dist/components/Drawer/index.d.ts +6 -0
  80. package/dist/components/Drawer.d.ts +6 -0
  81. package/dist/components/Icon/Icon.cjs +44 -3
  82. package/dist/components/Icon/Icon.cjs.map +1 -1
  83. package/dist/components/Icon/Icon.d.ts +34 -1
  84. package/dist/components/Icon/Icon.js +44 -3
  85. package/dist/components/Icon/Icon.js.map +1 -1
  86. package/dist/components/Input/Input.cjs +173 -3
  87. package/dist/components/Input/Input.cjs.map +1 -1
  88. package/dist/components/Input/Input.d.ts +20 -15
  89. package/dist/components/Input/Input.definitions.d.ts +5 -2
  90. package/dist/components/Input/Input.helpers.d.ts +14 -0
  91. package/dist/components/Input/Input.js +172 -2
  92. package/dist/components/Input/Input.js.map +1 -1
  93. package/dist/components/Input/Input.sx.d.ts +8 -0
  94. package/dist/components/Input/Input.types.d.ts +1 -0
  95. package/dist/components/Input/index.d.ts +2 -1
  96. package/dist/components/Input.d.ts +4 -0
  97. package/dist/components/InputGroup/InputGroup.cjs +104 -91
  98. package/dist/components/InputGroup/InputGroup.cjs.map +1 -1
  99. package/dist/components/InputGroup/InputGroup.d.ts +37 -1
  100. package/dist/components/InputGroup/InputGroup.definitions.d.ts +6 -0
  101. package/dist/components/InputGroup/InputGroup.js +106 -93
  102. package/dist/components/InputGroup/InputGroup.js.map +1 -1
  103. package/dist/components/Modal/Modal.cjs +226 -116
  104. package/dist/components/Modal/Modal.cjs.map +1 -1
  105. package/dist/components/Modal/Modal.d.ts +38 -2
  106. package/dist/components/Modal/Modal.js +227 -117
  107. package/dist/components/Modal/Modal.js.map +1 -1
  108. package/dist/components/Modal/ModalFooter.d.ts +9 -1
  109. package/dist/components/Modal/index.d.ts +5 -0
  110. package/dist/components/PageLoader/PageLoader.cjs +61 -0
  111. package/dist/components/PageLoader/PageLoader.cjs.map +1 -0
  112. package/dist/components/PageLoader/PageLoader.d.ts +38 -0
  113. package/dist/components/PageLoader/PageLoader.js +61 -0
  114. package/dist/components/PageLoader/PageLoader.js.map +1 -0
  115. package/dist/components/PageLoader/index.d.ts +2 -0
  116. package/dist/components/PageLoader.d.ts +6 -0
  117. package/dist/components/ScrollTopButton/ScrollTopButton.cjs +79 -0
  118. package/dist/components/ScrollTopButton/ScrollTopButton.cjs.map +1 -0
  119. package/dist/components/ScrollTopButton/ScrollTopButton.d.ts +48 -0
  120. package/dist/components/ScrollTopButton/ScrollTopButton.js +79 -0
  121. package/dist/components/ScrollTopButton/ScrollTopButton.js.map +1 -0
  122. package/dist/components/ScrollTopButton/index.d.ts +4 -0
  123. package/dist/components/ScrollTopButton/scrollToTop.d.ts +29 -0
  124. package/dist/components/ScrollTopButton.d.ts +6 -0
  125. package/dist/components/Select/Select.cjs +446 -4
  126. package/dist/components/Select/Select.cjs.map +1 -1
  127. package/dist/components/Select/Select.d.ts +33 -13
  128. package/dist/components/Select/Select.definitions.d.ts +3 -0
  129. package/dist/components/Select/Select.helpers.d.ts +28 -0
  130. package/dist/components/Select/Select.js +445 -3
  131. package/dist/components/Select/Select.js.map +1 -1
  132. package/dist/components/Select/Select.sx.d.ts +7 -0
  133. package/dist/components/Select/Select.types.d.ts +1 -0
  134. package/dist/components/Select/_parts/SelectMenuItem.d.ts +20 -0
  135. package/dist/components/Select/_parts/SelectSearchHeader.d.ts +15 -0
  136. package/dist/components/Select/_parts/SelectValue.d.ts +22 -0
  137. package/dist/components/Select/index.d.ts +2 -1
  138. package/dist/components/Select.d.ts +4 -0
  139. package/dist/components/Stat/Stat.cjs +1 -1
  140. package/dist/components/Stat/Stat.js +1 -1
  141. package/dist/components/Stepper/Stepper.cjs +4 -1
  142. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  143. package/dist/components/Stepper/Stepper.d.ts +5 -0
  144. package/dist/components/Stepper/Stepper.js +4 -1
  145. package/dist/components/Stepper/Stepper.js.map +1 -1
  146. package/dist/components/_shared/formField.sx.d.ts +33 -0
  147. package/dist/components/_shared/resolvePreset.d.ts +18 -0
  148. package/dist/formField.sx-CQ1mbk9M.cjs +76 -0
  149. package/dist/formField.sx-CQ1mbk9M.cjs.map +1 -0
  150. package/dist/formField.sx-DfVbMe0V.js +77 -0
  151. package/dist/formField.sx-DfVbMe0V.js.map +1 -0
  152. package/dist/hooks/Wizard/Wizard.cjs +7 -0
  153. package/dist/hooks/Wizard/Wizard.cjs.map +1 -0
  154. package/dist/hooks/Wizard/Wizard.js +7 -0
  155. package/dist/hooks/Wizard/Wizard.js.map +1 -0
  156. package/dist/hooks/Wizard/WizardContext.d.ts +67 -0
  157. package/dist/hooks/Wizard/index.d.ts +3 -0
  158. package/dist/hooks/Wizard/useWizard.d.ts +9 -0
  159. package/dist/hooks/Wizard.d.ts +2 -0
  160. package/dist/index.cjs +99 -1
  161. package/dist/index.cjs.map +1 -1
  162. package/dist/index.d.ts +3 -0
  163. package/dist/index.js +31 -2
  164. package/dist/index.js.map +1 -1
  165. package/dist/mui.d.ts +5 -0
  166. package/dist/resolvePreset-B-IB0ehH.js +15 -0
  167. package/dist/resolvePreset-B-IB0ehH.js.map +1 -0
  168. package/dist/resolvePreset-CT3kU-K2.cjs +14 -0
  169. package/dist/resolvePreset-CT3kU-K2.cjs.map +1 -0
  170. package/dist/styles.css +3 -112
  171. package/dist/theme/componentStyles.d.ts +32 -0
  172. package/dist/theme/tokens.d.ts +28 -0
  173. package/dist/useWizard-CWdIxZzX.cjs +94 -0
  174. package/dist/useWizard-CWdIxZzX.cjs.map +1 -0
  175. package/dist/useWizard-CWq--C3o.js +95 -0
  176. package/dist/useWizard-CWq--C3o.js.map +1 -0
  177. package/package.json +1 -1
  178. package/src/components/ActionMenu/ActionMenu.stories.tsx +230 -0
  179. package/src/components/ActionMenu/ActionMenu.tsx +174 -0
  180. package/src/components/ActionMenu/index.ts +2 -0
  181. package/src/components/AppBar/AppBar.stories.tsx +272 -0
  182. package/src/components/AppBar/AppBar.sx.ts +32 -0
  183. package/src/components/AppBar/AppBar.tsx +123 -0
  184. package/src/components/AppBar/AppBarBrand.tsx +120 -0
  185. package/src/components/AppBar/AppBarContext.ts +25 -0
  186. package/src/components/AppBar/AppBarMenuToggle.tsx +90 -0
  187. package/src/components/AppBar/AppBarUserMenu.tsx +217 -0
  188. package/src/components/AppBar/index.ts +25 -0
  189. package/src/components/Autocomplete/Autocomplete.definitions.ts +223 -0
  190. package/src/components/Autocomplete/Autocomplete.helpers.ts +60 -0
  191. package/src/components/Autocomplete/Autocomplete.stories.tsx +363 -2
  192. package/src/components/Autocomplete/Autocomplete.sx.ts +30 -0
  193. package/src/components/Autocomplete/Autocomplete.tsx +312 -90
  194. package/src/components/Autocomplete/Autocomplete.types.ts +13 -0
  195. package/src/components/Autocomplete/_parts/AutocompleteChips.tsx +55 -0
  196. package/src/components/Autocomplete/_parts/AutocompleteLoader.tsx +17 -0
  197. package/src/components/Autocomplete/_parts/AutocompleteOption.tsx +31 -0
  198. package/src/components/Autocomplete/index.ts +12 -1
  199. package/src/components/Avatar/Avatar.definitions.ts +162 -0
  200. package/src/components/Avatar/Avatar.stories.tsx +205 -1
  201. package/src/components/Avatar/Avatar.tsx +166 -103
  202. package/src/components/Card/Card.stories.tsx +205 -16
  203. package/src/components/Card/Card.sx.ts +104 -0
  204. package/src/components/Card/Card.tsx +191 -35
  205. package/src/components/Card/index.ts +9 -1
  206. package/src/components/DatePicker/DatePicker.definitions.ts +24 -1
  207. package/src/components/DatePicker/DatePicker.helpers.ts +24 -0
  208. package/src/components/DatePicker/DatePicker.stories.tsx +29 -2
  209. package/src/components/DatePicker/DatePicker.sx.ts +33 -0
  210. package/src/components/DatePicker/DatePicker.tsx +163 -139
  211. package/src/components/DatePicker/DatePicker.types.ts +10 -0
  212. package/src/components/DatePicker/index.ts +9 -1
  213. package/src/components/DateTimePicker/DateTimePicker.definitions.ts +24 -0
  214. package/src/components/DateTimePicker/DateTimePicker.helpers.ts +38 -0
  215. package/src/components/DateTimePicker/DateTimePicker.stories.tsx +29 -1
  216. package/src/components/DateTimePicker/DateTimePicker.sx.ts +30 -0
  217. package/src/components/DateTimePicker/DateTimePicker.tsx +200 -166
  218. package/src/components/DateTimePicker/DateTimePicker.types.ts +10 -0
  219. package/src/components/DateTimePicker/index.ts +9 -1
  220. package/src/components/Drawer/Drawer.stories.tsx +270 -0
  221. package/src/components/Drawer/Drawer.sx.ts +106 -0
  222. package/src/components/Drawer/Drawer.tsx +214 -0
  223. package/src/components/Drawer/DrawerContext.ts +26 -0
  224. package/src/components/Drawer/DrawerItem.tsx +110 -0
  225. package/src/components/Drawer/index.ts +10 -0
  226. package/src/components/Flyout/Flyout.stories.tsx +26 -18
  227. package/src/components/Icon/Icon.stories.tsx +68 -1
  228. package/src/components/Icon/Icon.tsx +87 -6
  229. package/src/components/Input/Input.definitions.ts +74 -2
  230. package/src/components/Input/Input.helpers.ts +49 -0
  231. package/src/components/Input/Input.stories.tsx +116 -4
  232. package/src/components/Input/Input.sx.ts +42 -0
  233. package/src/components/Input/Input.tsx +117 -162
  234. package/src/components/Input/Input.types.ts +10 -0
  235. package/src/components/Input/index.ts +9 -1
  236. package/src/components/InputGroup/InputGroup.definitions.ts +158 -0
  237. package/src/components/InputGroup/InputGroup.stories.tsx +159 -28
  238. package/src/components/InputGroup/InputGroup.tsx +159 -116
  239. package/src/components/Modal/Modal.stories.tsx +434 -6
  240. package/src/components/Modal/Modal.tsx +303 -121
  241. package/src/components/Modal/ModalFooter.tsx +22 -12
  242. package/src/components/Modal/index.ts +6 -1
  243. package/src/components/PageLoader/PageLoader.stories.tsx +217 -0
  244. package/src/components/PageLoader/PageLoader.tsx +96 -0
  245. package/src/components/PageLoader/index.ts +2 -0
  246. package/src/components/ScrollTopButton/ScrollTopButton.stories.tsx +158 -0
  247. package/src/components/ScrollTopButton/ScrollTopButton.tsx +135 -0
  248. package/src/components/ScrollTopButton/index.ts +8 -0
  249. package/src/components/ScrollTopButton/scrollToTop.ts +37 -0
  250. package/src/components/Select/Select.definitions.ts +114 -0
  251. package/src/components/Select/Select.helpers.ts +71 -0
  252. package/src/components/Select/Select.stories.tsx +126 -8
  253. package/src/components/Select/Select.sx.ts +14 -0
  254. package/src/components/Select/Select.tsx +246 -285
  255. package/src/components/Select/Select.types.ts +15 -0
  256. package/src/components/Select/_parts/SelectMenuItem.tsx +40 -0
  257. package/src/components/Select/_parts/SelectSearchHeader.tsx +51 -0
  258. package/src/components/Select/_parts/SelectValue.tsx +96 -0
  259. package/src/components/Select/index.ts +14 -1
  260. package/src/components/Stepper/Stepper.tsx +17 -1
  261. package/src/components/Tooltip/Tooltip.stories.tsx +15 -3
  262. package/src/components/_shared/formField.sx.ts +118 -0
  263. package/src/components/_shared/resolvePreset.ts +35 -0
  264. package/src/hooks/Wizard/Wizard.stories.tsx +301 -0
  265. package/src/hooks/Wizard/WizardContext.tsx +166 -0
  266. package/src/hooks/Wizard/index.ts +6 -0
  267. package/src/hooks/Wizard/useWizard.ts +13 -0
  268. package/src/index.ts +17 -1
  269. package/src/mui.ts +44 -0
  270. package/src/theme/componentStyles.ts +47 -0
  271. package/src/theme/tokens.ts +43 -0
  272. package/dist/DatePicker-BSNboVhN.js +0 -201
  273. package/dist/DatePicker-BSNboVhN.js.map +0 -1
  274. package/dist/DatePicker-BoqxWAhj.cjs +0 -200
  275. package/dist/DatePicker-BoqxWAhj.cjs.map +0 -1
  276. package/dist/Input-DFHs7cJ_.js +0 -171
  277. package/dist/Input-DFHs7cJ_.js.map +0 -1
  278. package/dist/Input-c8MwNNPg.cjs +0 -170
  279. package/dist/Input-c8MwNNPg.cjs.map +0 -1
  280. package/dist/Select-BO2N56sm.cjs +0 -411
  281. package/dist/Select-BO2N56sm.cjs.map +0 -1
  282. package/dist/Select-BcLkyHSE.js +0 -412
  283. package/dist/Select-BcLkyHSE.js.map +0 -1
  284. package/dist/index.css +0 -3
@@ -20,107 +20,144 @@ var __spreadValues = (a, b) => {
20
20
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
21
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
22
22
  const jsxRuntime = require("react/jsx-runtime");
23
+ const React = require("react");
23
24
  const material = require("@mui/material");
24
25
  const AccountCircleIcon = require("@mui/icons-material/AccountCircle");
25
- const React = require("react");
26
- const sizes = {
27
- sm: {
28
- avatar: { width: 35, height: 35, borderWidth: 3, marginTop: ".5rem" },
29
- icon: { width: 42, height: 42, marginTop: ".5rem", fontSize: 42 },
30
- badge: { width: 35, height: 35, borderWidth: 3, marginTop: ".5rem", fontSize: 16 }
31
- },
32
- xl: {
33
- avatar: { width: 105, height: 105, borderWidth: 10, marginTop: "0" },
34
- icon: { width: 126, height: 126, marginTop: "0", fontSize: 126 },
35
- badge: { width: 105, height: 105, borderWidth: 10, marginTop: "0", fontSize: 64 }
26
+ const sizeMap = {
27
+ sm: { px: 32, border: 2, font: 14, overlap: 8 },
28
+ md: { px: 40, border: 2, font: 16, overlap: 10 },
29
+ lg: { px: 56, border: 3, font: 22, overlap: 14 },
30
+ xl: { px: 96, border: 4, font: 36, overlap: 20 }
31
+ };
32
+ const resolveSize = (size) => {
33
+ if (typeof size === "number") {
34
+ return {
35
+ px: size,
36
+ border: Math.max(2, Math.round(size * 0.05)),
37
+ font: Math.round(size * 0.4),
38
+ overlap: Math.round(size * 0.25)
39
+ };
36
40
  }
41
+ return sizeMap[size];
42
+ };
43
+ const mergeSx = (base, extra) => {
44
+ if (!extra) return base;
45
+ const baseArr = Array.isArray(base) ? base : [base];
46
+ const extraArr = Array.isArray(extra) ? extra : [extra];
47
+ return [...baseArr, ...extraArr];
37
48
  };
38
49
  const Avatar = ({
39
50
  items,
40
51
  type,
41
52
  displayedAvatars = 4,
42
53
  size = "sm",
43
- trustUrls = false,
44
54
  showText = true,
45
- showTooltip = false
55
+ showTooltip = false,
56
+ sx,
57
+ avatarSx,
58
+ className,
59
+ overlap
46
60
  }) => {
61
+ var _a;
47
62
  const [errorIndex, setErrorIndex] = React.useState(/* @__PURE__ */ new Set());
48
63
  const handleImageError = (index) => {
49
- setErrorIndex((prev) => new Set(prev).add(index));
64
+ setErrorIndex((prev) => {
65
+ const next = new Set(prev);
66
+ next.add(index);
67
+ return next;
68
+ });
50
69
  };
51
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "avatar-container", className: "flex items-center leading-2 h-full w-full", children: [
52
- items.slice(0, displayedAvatars).map((item, i) => {
53
- const commonStyle = {
54
- zIndex: displayedAvatars - i,
55
- marginLeft: i > 0 ? -22 : 0
56
- };
57
- const style = sizes[size];
58
- const imgSrc = trustUrls ? item.imageUrl : item.imageUrl;
59
- const showFallbackIcon = !item.imageUrl && !item.badge || errorIndex.has(i) && !item.badge;
60
- const showBadge = item.badge && !item.imageUrl || item.badge && errorIndex.has(i);
61
- const content = /* @__PURE__ */ jsxRuntime.jsxs("span", { "data-testid": "avatar", style: commonStyle, children: [
62
- item.imageUrl && !errorIndex.has(i) ? /* @__PURE__ */ jsxRuntime.jsx(
63
- "img",
64
- {
65
- "data-testid": "image",
66
- alt: item.text || "User avatar",
67
- src: imgSrc,
68
- onError: () => handleImageError(i),
69
- style: __spreadProps(__spreadValues({}, style.avatar), {
70
- color: item.color || "#667688",
71
- border: `${style.avatar.borderWidth}px solid white`,
72
- borderRadius: "9999px",
73
- marginTop: style.avatar.marginTop
74
- })
75
- }
76
- ) : showFallbackIcon ? /* @__PURE__ */ jsxRuntime.jsx(
70
+ if (!items || items.length === 0) {
71
+ return null;
72
+ }
73
+ const s = resolveSize(size);
74
+ const effectiveOverlap = overlap != null ? overlap : s.overlap;
75
+ const visibleItems = items.slice(0, displayedAvatars);
76
+ const baseAvatarSx = {
77
+ width: s.px,
78
+ height: s.px,
79
+ fontSize: s.font,
80
+ fontWeight: 700,
81
+ border: (theme) => `${s.border}px solid ${theme.palette.background.paper}`,
82
+ boxSizing: "content-box"
83
+ };
84
+ const renderSingleAvatar = (item, i) => {
85
+ var _a2, _b;
86
+ const hasImage = !!item.imageUrl && !errorIndex.has(i);
87
+ const showBadgeFallback = !!item.badge;
88
+ const itemSx = __spreadProps(__spreadValues({
89
+ bgcolor: (_a2 = item.backgroundColor) != null ? _a2 : "action.selected",
90
+ color: (_b = item.color) != null ? _b : "text.secondary"
91
+ }, i > 0 && { marginLeft: `-${effectiveOverlap}px` }), {
92
+ zIndex: visibleItems.length - i
93
+ });
94
+ const finalSx = mergeSx(mergeSx(baseAvatarSx, itemSx), avatarSx);
95
+ const avatarEl = /* @__PURE__ */ jsxRuntime.jsx(
96
+ material.Avatar,
97
+ {
98
+ "data-testid": "avatar",
99
+ alt: item.text || "User avatar",
100
+ src: hasImage ? item.imageUrl : void 0,
101
+ imgProps: {
102
+ "data-testid": "image",
103
+ onError: () => handleImageError(i)
104
+ },
105
+ sx: finalSx,
106
+ children: !hasImage && showBadgeFallback ? /* @__PURE__ */ jsxRuntime.jsx("span", { "data-testid": "badge", "aria-label": item.text, children: item.badge }) : !hasImage ? /* @__PURE__ */ jsxRuntime.jsx(
77
107
  AccountCircleIcon,
78
108
  {
79
109
  "data-testid": "icon",
80
110
  "aria-label": item.text,
81
- sx: __spreadProps(__spreadValues({}, style.icon), {
82
- fontSize: style.icon.fontSize,
83
- marginTop: style.icon.marginTop,
84
- borderRadius: "9999px",
85
- backgroundColor: "#fff",
86
- color: item.color || "#667688"
87
- })
111
+ sx: { width: "100%", height: "100%" }
88
112
  }
89
- ) : null,
90
- showBadge && /* @__PURE__ */ jsxRuntime.jsx(
91
- "span",
113
+ ) : null
114
+ }
115
+ );
116
+ if (showTooltip && item.text) {
117
+ return /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: item.text, children: avatarEl }, i);
118
+ }
119
+ return /* @__PURE__ */ jsxRuntime.jsx(React.Fragment, { children: avatarEl }, i);
120
+ };
121
+ return /* @__PURE__ */ jsxRuntime.jsxs(
122
+ material.Box,
123
+ {
124
+ "data-testid": "avatar-container",
125
+ className,
126
+ sx: mergeSx(
127
+ {
128
+ display: "flex",
129
+ alignItems: "center",
130
+ lineHeight: 1,
131
+ width: "fit-content"
132
+ },
133
+ sx
134
+ ),
135
+ children: [
136
+ /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { display: "flex", alignItems: "center" }, children: visibleItems.map((item, i) => renderSingleAvatar(item, i)) }),
137
+ showText && ((_a = items[0]) == null ? void 0 : _a.text) && /* @__PURE__ */ jsxRuntime.jsxs(
138
+ material.Typography,
92
139
  {
93
- "data-testid": "badge",
94
- "aria-label": item.text,
95
- style: __spreadProps(__spreadValues({}, style.badge), {
96
- display: "inline-block",
97
- backgroundColor: item.backgroundColor || "#c8d5e9",
98
- color: item.color || "#667688",
99
- fontWeight: 700,
100
- textAlign: "center",
101
- borderRadius: "9999px",
102
- border: `${style.badge.borderWidth}px solid white`,
103
- lineHeight: style.badge.height,
104
- fontSize: style.badge.fontSize,
105
- marginTop: style.badge.marginTop,
106
- marginBottom: style.badge.marginTop
107
- }),
108
- children: item.badge
140
+ "data-testid": "text",
141
+ variant: "caption",
142
+ sx: {
143
+ ml: 1,
144
+ fontSize: "0.75rem",
145
+ fontWeight: 400,
146
+ color: "text.primary"
147
+ },
148
+ children: [
149
+ type && items.length === 1 && /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { component: "span", "data-testid": "type", sx: { mr: 0.5 }, children: [
150
+ type,
151
+ ":"
152
+ ] }),
153
+ items[0].text,
154
+ items.length > 1 && ` +${items.length - 1}`
155
+ ]
109
156
  }
110
157
  )
111
- ] }, i);
112
- return showTooltip && item.text ? /* @__PURE__ */ jsxRuntime.jsx(material.Tooltip, { title: item.text, children: content }, i) : content;
113
- }),
114
- showText && /* @__PURE__ */ jsxRuntime.jsxs("span", { "data-testid": "text", className: "ml-2 text-xs font-normal", children: [
115
- type && items.length === 1 && /* @__PURE__ */ jsxRuntime.jsxs("span", { "data-testid": "type", children: [
116
- type,
117
- ": "
118
- ] }),
119
- items[0].text,
120
- " ",
121
- items.length > 2 && `+${items.length - 1}`
122
- ] })
123
- ] });
158
+ ]
159
+ }
160
+ );
124
161
  };
125
162
  exports.Avatar = Avatar;
126
163
  //# sourceMappingURL=Avatar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.cjs","sources":["../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import { Avatar as MuiAvatar, Tooltip } from '@mui/material';\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\nimport React, { useState } from 'react';\n\nexport interface AvatarItem {\n text?: string;\n imageUrl?: string;\n badge?: string;\n color?: string;\n backgroundColor?: string;\n}\n\nexport interface AvatarProps {\n type?: string;\n items: AvatarItem[];\n displayedAvatars?: number;\n size?: 'sm' | 'xl';\n trustUrls?: boolean;\n showText?: boolean;\n showTooltip?: boolean;\n}\n\nconst sizes = {\n sm: {\n avatar: { width: 35, height: 35, borderWidth: 3, marginTop: '.5rem' },\n icon: { width: 42, height: 42, marginTop: '.5rem', fontSize: 42 },\n badge: { width: 35, height: 35, borderWidth: 3, marginTop: '.5rem', fontSize: 16 },\n },\n xl: {\n avatar: { width: 105, height: 105, borderWidth: 10, marginTop: '0' },\n icon: { width: 126, height: 126, marginTop: '0', fontSize: 126 },\n badge: { width: 105, height: 105, borderWidth: 10, marginTop: '0', fontSize: 64 },\n },\n};\n\nexport const Avatar: React.FC<AvatarProps> = ({\n items,\n type,\n displayedAvatars = 4,\n size = 'sm',\n trustUrls = false,\n showText = true,\n showTooltip = false,\n}) => {\n const [errorIndex, setErrorIndex] = useState<Set<number>>(new Set());\n\n const handleImageError = (index: number) => {\n setErrorIndex((prev) => new Set(prev).add(index));\n };\n\n return (\n <div data-testid=\"avatar-container\" className=\"flex items-center leading-2 h-full w-full\">\n {items.slice(0, displayedAvatars).map((item, i) => {\n const commonStyle = {\n zIndex: displayedAvatars - i,\n marginLeft: i > 0 ? -22 : 0,\n };\n\n const style = sizes[size];\n\n const imgSrc = trustUrls ? item.imageUrl : item.imageUrl;\n\n const showFallbackIcon = (!item.imageUrl && !item.badge) || (errorIndex.has(i) && !item.badge);\n const showBadge = (item.badge && !item.imageUrl) || (item.badge && errorIndex.has(i));\n\n const content = (\n <span key={i} data-testid=\"avatar\" style={commonStyle}>\n {item.imageUrl && !errorIndex.has(i) ? (\n <img\n data-testid=\"image\"\n alt={item.text || 'User avatar'}\n src={imgSrc}\n onError={() => handleImageError(i)}\n style={{\n ...style.avatar,\n color: item.color || '#667688',\n border: `${style.avatar.borderWidth}px solid white`,\n borderRadius: '9999px',\n marginTop: style.avatar.marginTop,\n }}\n />\n ) : showFallbackIcon ? (\n <AccountCircleIcon\n data-testid=\"icon\"\n aria-label={item.text}\n sx={{\n ...style.icon,\n fontSize: style.icon.fontSize,\n marginTop: style.icon.marginTop,\n borderRadius: '9999px',\n backgroundColor: '#fff',\n color: item.color || '#667688',\n }}\n />\n ) : null}\n\n {showBadge && (\n <span\n data-testid=\"badge\"\n aria-label={item.text}\n style={{\n ...style.badge,\n display: 'inline-block',\n backgroundColor: item.backgroundColor || '#c8d5e9',\n color: item.color || '#667688',\n fontWeight: 700,\n textAlign: 'center',\n borderRadius: '9999px',\n border: `${style.badge.borderWidth}px solid white`,\n lineHeight: style.badge.height,\n fontSize: style.badge.fontSize,\n marginTop: style.badge.marginTop,\n marginBottom: style.badge.marginTop,\n }}\n >\n {item.badge}\n </span>\n )}\n </span>\n );\n\n return showTooltip && item.text ? (\n <Tooltip key={i} title={item.text}>\n {content}\n </Tooltip>\n ) : (\n content\n );\n })}\n\n {showText && (\n <span data-testid=\"text\" className=\"ml-2 text-xs font-normal\">\n {type && items.length === 1 && (\n <span data-testid=\"type\">{type}: </span>\n )}\n {items[0].text} {items.length > 2 && `+${items.length - 1}`}\n </span>\n )}\n </div>\n );\n};\n\nexport default Avatar;"],"names":["useState","jsxs","jsx","Tooltip"],"mappings":"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"}
1
+ {"version":3,"file":"Avatar.cjs","sources":["../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Avatar as MuiAvatar,\n Box,\n Tooltip,\n Typography,\n type SxProps,\n type Theme,\n} from '@mui/material';\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\n\nexport interface AvatarItem {\n text?: string;\n imageUrl?: string;\n badge?: string;\n color?: string;\n backgroundColor?: string;\n}\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl' | number;\n\nexport interface AvatarProps {\n type?: string;\n items: AvatarItem[];\n displayedAvatars?: number;\n size?: AvatarSize;\n showText?: boolean;\n showTooltip?: boolean;\n /**\n * sx aplicado al contenedor raíz.\n */\n sx?: SxProps<Theme>;\n /**\n * sx aplicado a cada MuiAvatar individual (se mergea sobre los defaults).\n */\n avatarSx?: SxProps<Theme>;\n className?: string;\n /**\n * Overlap (px) entre avatares cuando hay varios. Default depende del tamaño.\n */\n overlap?: number;\n}\n\n// Escala alineada con la escala de MUI (sm=32, md=40, lg=56, xl=96) con borde\n// proporcional para el efecto stacked.\nconst sizeMap: Record<\n Exclude<AvatarSize, number>,\n { px: number; border: number; font: number; overlap: number }\n> = {\n sm: { px: 32, border: 2, font: 14, overlap: 8 },\n md: { px: 40, border: 2, font: 16, overlap: 10 },\n lg: { px: 56, border: 3, font: 22, overlap: 14 },\n xl: { px: 96, border: 4, font: 36, overlap: 20 },\n};\n\nconst resolveSize = (size: AvatarSize) => {\n if (typeof size === 'number') {\n return {\n px: size,\n border: Math.max(2, Math.round(size * 0.05)),\n font: Math.round(size * 0.4),\n overlap: Math.round(size * 0.25),\n };\n }\n return sizeMap[size];\n};\n\nconst mergeSx = (base: SxProps<Theme>, extra?: SxProps<Theme>): SxProps<Theme> => {\n if (!extra) return base;\n const baseArr = Array.isArray(base) ? base : [base];\n const extraArr = Array.isArray(extra) ? extra : [extra];\n return [...baseArr, ...extraArr] as SxProps<Theme>;\n};\n\nexport const Avatar: React.FC<AvatarProps> = ({\n items,\n type,\n displayedAvatars = 4,\n size = 'sm',\n showText = true,\n showTooltip = false,\n sx,\n avatarSx,\n className,\n overlap,\n}) => {\n const [errorIndex, setErrorIndex] = useState<Set<number>>(new Set());\n\n const handleImageError = (index: number) => {\n setErrorIndex((prev) => {\n const next = new Set(prev);\n next.add(index);\n return next;\n });\n };\n\n if (!items || items.length === 0) {\n return null;\n }\n\n const s = resolveSize(size);\n const effectiveOverlap = overlap ?? s.overlap;\n const visibleItems = items.slice(0, displayedAvatars);\n\n const baseAvatarSx: SxProps<Theme> = {\n width: s.px,\n height: s.px,\n fontSize: s.font,\n fontWeight: 700,\n border: (theme) => `${s.border}px solid ${theme.palette.background.paper}`,\n boxSizing: 'content-box',\n };\n\n const renderSingleAvatar = (item: AvatarItem, i: number) => {\n const hasImage = !!item.imageUrl && !errorIndex.has(i);\n const showBadgeFallback = !!item.badge;\n\n // Defaults tirando al theme; item.color / item.backgroundColor tienen prioridad.\n const itemSx: SxProps<Theme> = {\n bgcolor: item.backgroundColor ?? 'action.selected',\n color: item.color ?? 'text.secondary',\n // Stacking manual: margen negativo al segundo avatar en adelante.\n ...(i > 0 && { marginLeft: `-${effectiveOverlap}px` }),\n zIndex: visibleItems.length - i,\n };\n\n const finalSx = mergeSx(mergeSx(baseAvatarSx, itemSx), avatarSx);\n\n const avatarEl = (\n <MuiAvatar\n data-testid=\"avatar\"\n alt={item.text || 'User avatar'}\n src={hasImage ? item.imageUrl : undefined}\n imgProps={{\n 'data-testid': 'image',\n onError: () => handleImageError(i),\n } as React.ImgHTMLAttributes<HTMLImageElement>}\n sx={finalSx}\n >\n {!hasImage && showBadgeFallback ? (\n <span data-testid=\"badge\" aria-label={item.text}>\n {item.badge}\n </span>\n ) : !hasImage ? (\n <AccountCircleIcon\n data-testid=\"icon\"\n aria-label={item.text}\n sx={{ width: '100%', height: '100%' }}\n />\n ) : null}\n </MuiAvatar>\n );\n\n if (showTooltip && item.text) {\n return (\n <Tooltip key={i} title={item.text}>\n {avatarEl}\n </Tooltip>\n );\n }\n return <React.Fragment key={i}>{avatarEl}</React.Fragment>;\n };\n\n return (\n <Box\n data-testid=\"avatar-container\"\n className={className}\n sx={mergeSx(\n {\n display: 'flex',\n alignItems: 'center',\n lineHeight: 1,\n width: 'fit-content',\n },\n sx,\n )}\n >\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n {visibleItems.map((item, i) => renderSingleAvatar(item, i))}\n </Box>\n\n {showText && items[0]?.text && (\n <Typography\n data-testid=\"text\"\n variant=\"caption\"\n sx={{\n ml: 1,\n fontSize: '0.75rem',\n fontWeight: 400,\n color: 'text.primary',\n }}\n >\n {type && items.length === 1 && (\n <Box component=\"span\" data-testid=\"type\" sx={{ mr: 0.5 }}>\n {type}:\n </Box>\n )}\n {items[0].text}\n {items.length > 1 && ` +${items.length - 1}`}\n </Typography>\n )}\n </Box>\n );\n};\n\nexport default Avatar;\n"],"names":["useState","_a","jsx","MuiAvatar","Tooltip","jsxs","Box","Typography"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { default as React } from 'react';
2
+ import { SxProps, Theme } from '@mui/material';
2
3
  export interface AvatarItem {
3
4
  text?: string;
4
5
  imageUrl?: string;
@@ -6,14 +7,27 @@ export interface AvatarItem {
6
7
  color?: string;
7
8
  backgroundColor?: string;
8
9
  }
10
+ export type AvatarSize = 'sm' | 'md' | 'lg' | 'xl' | number;
9
11
  export interface AvatarProps {
10
12
  type?: string;
11
13
  items: AvatarItem[];
12
14
  displayedAvatars?: number;
13
- size?: 'sm' | 'xl';
14
- trustUrls?: boolean;
15
+ size?: AvatarSize;
15
16
  showText?: boolean;
16
17
  showTooltip?: boolean;
18
+ /**
19
+ * sx aplicado al contenedor raíz.
20
+ */
21
+ sx?: SxProps<Theme>;
22
+ /**
23
+ * sx aplicado a cada MuiAvatar individual (se mergea sobre los defaults).
24
+ */
25
+ avatarSx?: SxProps<Theme>;
26
+ className?: string;
27
+ /**
28
+ * Overlap (px) entre avatares cuando hay varios. Default depende del tamaño.
29
+ */
30
+ overlap?: number;
17
31
  }
18
32
  export declare const Avatar: React.FC<AvatarProps>;
19
33
  export default Avatar;
@@ -0,0 +1,11 @@
1
+ export declare const DefaultAvatarDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const DefaultAvatarExample = () => (\n <Avatar\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=1' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=2' },\n ]}\n />\n);\n";
2
+ export declare const WithTypeAndTextDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const WithTypeAndTextExample = () => (\n <Avatar\n type=\"Owner\"\n items={[{ text: 'Maria', imageUrl: 'https://i.pravatar.cc/150?img=5' }]}\n showText\n />\n);\n";
3
+ export declare const WithBadgesAndTooltipDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const WithBadgesAndTooltipExample = () => (\n <Avatar\n showTooltip\n items={[\n { text: 'John D.', badge: 'JD', backgroundColor: '#EF5350', color: '#fff' },\n { text: 'Alice B.', badge: 'AB', backgroundColor: '#AB47BC', color: '#fff' },\n ]}\n />\n);\n";
4
+ export declare const SizeSmallDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const SizeSmallExample = () => (\n <Avatar\n size=\"sm\"\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=11' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=12' },\n { text: 'User Three', imageUrl: 'https://i.pravatar.cc/150?img=13' },\n ]}\n />\n);\n";
5
+ export declare const SizeMediumDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const SizeMediumExample = () => (\n <Avatar\n size=\"md\"\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=21' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=22' },\n { text: 'User Three', imageUrl: 'https://i.pravatar.cc/150?img=23' },\n ]}\n />\n);\n";
6
+ export declare const SizeLargeDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const SizeLargeExample = () => (\n <Avatar\n size=\"lg\"\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=31' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=32' },\n ]}\n />\n);\n";
7
+ export declare const SizeExtraLargeDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const SizeExtraLargeExample = () => (\n <Avatar\n size=\"xl\"\n items={[{ text: 'Maria', imageUrl: 'https://i.pravatar.cc/150?img=5' }]}\n showText={false}\n />\n);\n";
8
+ export declare const NumericSizeDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const NumericSizeExample = () => (\n <Avatar\n size={72}\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=41' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=42' },\n ]}\n showText={false}\n />\n);\n";
9
+ export declare const FallbackIconDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const FallbackIconExample = () => (\n <Avatar\n items={[\n { text: 'Without image' },\n { text: 'Broken image', imageUrl: 'https://example.invalid/broken.png' },\n ]}\n showTooltip\n />\n);\n";
10
+ export declare const DisplayedAvatarsLimitDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const DisplayedAvatarsLimitExample = () => (\n <Avatar\n displayedAvatars={3}\n items={[\n { text: 'User 1', imageUrl: 'https://i.pravatar.cc/150?img=51' },\n { text: 'User 2', imageUrl: 'https://i.pravatar.cc/150?img=52' },\n { text: 'User 3', imageUrl: 'https://i.pravatar.cc/150?img=53' },\n { text: 'User 4', imageUrl: 'https://i.pravatar.cc/150?img=54' },\n { text: 'User 5', imageUrl: 'https://i.pravatar.cc/150?img=55' },\n ]}\n />\n);\n";
11
+ export declare const CustomStylingDefinition = "\nimport { Avatar } from './Avatar';\n\nexport const CustomStylingExample = () => (\n <Avatar\n size=\"md\"\n items={[\n { text: 'User One', imageUrl: 'https://i.pravatar.cc/150?img=61' },\n { text: 'User Two', imageUrl: 'https://i.pravatar.cc/150?img=62' },\n ]}\n sx={{\n p: 1,\n borderRadius: 2,\n bgcolor: 'action.hover',\n }}\n avatarSx={{\n border: (theme) => '3px solid ' + theme.palette.primary.main,\n }}\n />\n);\n";
@@ -18,107 +18,144 @@ var __spreadValues = (a, b) => {
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
20
  import { jsxs, jsx } from "react/jsx-runtime";
21
- import { Tooltip } from "@mui/material";
21
+ import React__default, { useState } from "react";
22
+ import { Box, Typography, Avatar as Avatar$1, Tooltip } from "@mui/material";
22
23
  import AccountCircleIcon from "@mui/icons-material/AccountCircle";
23
- import { useState } from "react";
24
- const sizes = {
25
- sm: {
26
- avatar: { width: 35, height: 35, borderWidth: 3, marginTop: ".5rem" },
27
- icon: { width: 42, height: 42, marginTop: ".5rem", fontSize: 42 },
28
- badge: { width: 35, height: 35, borderWidth: 3, marginTop: ".5rem", fontSize: 16 }
29
- },
30
- xl: {
31
- avatar: { width: 105, height: 105, borderWidth: 10, marginTop: "0" },
32
- icon: { width: 126, height: 126, marginTop: "0", fontSize: 126 },
33
- badge: { width: 105, height: 105, borderWidth: 10, marginTop: "0", fontSize: 64 }
24
+ const sizeMap = {
25
+ sm: { px: 32, border: 2, font: 14, overlap: 8 },
26
+ md: { px: 40, border: 2, font: 16, overlap: 10 },
27
+ lg: { px: 56, border: 3, font: 22, overlap: 14 },
28
+ xl: { px: 96, border: 4, font: 36, overlap: 20 }
29
+ };
30
+ const resolveSize = (size) => {
31
+ if (typeof size === "number") {
32
+ return {
33
+ px: size,
34
+ border: Math.max(2, Math.round(size * 0.05)),
35
+ font: Math.round(size * 0.4),
36
+ overlap: Math.round(size * 0.25)
37
+ };
34
38
  }
39
+ return sizeMap[size];
40
+ };
41
+ const mergeSx = (base, extra) => {
42
+ if (!extra) return base;
43
+ const baseArr = Array.isArray(base) ? base : [base];
44
+ const extraArr = Array.isArray(extra) ? extra : [extra];
45
+ return [...baseArr, ...extraArr];
35
46
  };
36
47
  const Avatar = ({
37
48
  items,
38
49
  type,
39
50
  displayedAvatars = 4,
40
51
  size = "sm",
41
- trustUrls = false,
42
52
  showText = true,
43
- showTooltip = false
53
+ showTooltip = false,
54
+ sx,
55
+ avatarSx,
56
+ className,
57
+ overlap
44
58
  }) => {
59
+ var _a;
45
60
  const [errorIndex, setErrorIndex] = useState(/* @__PURE__ */ new Set());
46
61
  const handleImageError = (index) => {
47
- setErrorIndex((prev) => new Set(prev).add(index));
62
+ setErrorIndex((prev) => {
63
+ const next = new Set(prev);
64
+ next.add(index);
65
+ return next;
66
+ });
48
67
  };
49
- return /* @__PURE__ */ jsxs("div", { "data-testid": "avatar-container", className: "flex items-center leading-2 h-full w-full", children: [
50
- items.slice(0, displayedAvatars).map((item, i) => {
51
- const commonStyle = {
52
- zIndex: displayedAvatars - i,
53
- marginLeft: i > 0 ? -22 : 0
54
- };
55
- const style = sizes[size];
56
- const imgSrc = trustUrls ? item.imageUrl : item.imageUrl;
57
- const showFallbackIcon = !item.imageUrl && !item.badge || errorIndex.has(i) && !item.badge;
58
- const showBadge = item.badge && !item.imageUrl || item.badge && errorIndex.has(i);
59
- const content = /* @__PURE__ */ jsxs("span", { "data-testid": "avatar", style: commonStyle, children: [
60
- item.imageUrl && !errorIndex.has(i) ? /* @__PURE__ */ jsx(
61
- "img",
62
- {
63
- "data-testid": "image",
64
- alt: item.text || "User avatar",
65
- src: imgSrc,
66
- onError: () => handleImageError(i),
67
- style: __spreadProps(__spreadValues({}, style.avatar), {
68
- color: item.color || "#667688",
69
- border: `${style.avatar.borderWidth}px solid white`,
70
- borderRadius: "9999px",
71
- marginTop: style.avatar.marginTop
72
- })
73
- }
74
- ) : showFallbackIcon ? /* @__PURE__ */ jsx(
68
+ if (!items || items.length === 0) {
69
+ return null;
70
+ }
71
+ const s = resolveSize(size);
72
+ const effectiveOverlap = overlap != null ? overlap : s.overlap;
73
+ const visibleItems = items.slice(0, displayedAvatars);
74
+ const baseAvatarSx = {
75
+ width: s.px,
76
+ height: s.px,
77
+ fontSize: s.font,
78
+ fontWeight: 700,
79
+ border: (theme) => `${s.border}px solid ${theme.palette.background.paper}`,
80
+ boxSizing: "content-box"
81
+ };
82
+ const renderSingleAvatar = (item, i) => {
83
+ var _a2, _b;
84
+ const hasImage = !!item.imageUrl && !errorIndex.has(i);
85
+ const showBadgeFallback = !!item.badge;
86
+ const itemSx = __spreadProps(__spreadValues({
87
+ bgcolor: (_a2 = item.backgroundColor) != null ? _a2 : "action.selected",
88
+ color: (_b = item.color) != null ? _b : "text.secondary"
89
+ }, i > 0 && { marginLeft: `-${effectiveOverlap}px` }), {
90
+ zIndex: visibleItems.length - i
91
+ });
92
+ const finalSx = mergeSx(mergeSx(baseAvatarSx, itemSx), avatarSx);
93
+ const avatarEl = /* @__PURE__ */ jsx(
94
+ Avatar$1,
95
+ {
96
+ "data-testid": "avatar",
97
+ alt: item.text || "User avatar",
98
+ src: hasImage ? item.imageUrl : void 0,
99
+ imgProps: {
100
+ "data-testid": "image",
101
+ onError: () => handleImageError(i)
102
+ },
103
+ sx: finalSx,
104
+ children: !hasImage && showBadgeFallback ? /* @__PURE__ */ jsx("span", { "data-testid": "badge", "aria-label": item.text, children: item.badge }) : !hasImage ? /* @__PURE__ */ jsx(
75
105
  AccountCircleIcon,
76
106
  {
77
107
  "data-testid": "icon",
78
108
  "aria-label": item.text,
79
- sx: __spreadProps(__spreadValues({}, style.icon), {
80
- fontSize: style.icon.fontSize,
81
- marginTop: style.icon.marginTop,
82
- borderRadius: "9999px",
83
- backgroundColor: "#fff",
84
- color: item.color || "#667688"
85
- })
109
+ sx: { width: "100%", height: "100%" }
86
110
  }
87
- ) : null,
88
- showBadge && /* @__PURE__ */ jsx(
89
- "span",
111
+ ) : null
112
+ }
113
+ );
114
+ if (showTooltip && item.text) {
115
+ return /* @__PURE__ */ jsx(Tooltip, { title: item.text, children: avatarEl }, i);
116
+ }
117
+ return /* @__PURE__ */ jsx(React__default.Fragment, { children: avatarEl }, i);
118
+ };
119
+ return /* @__PURE__ */ jsxs(
120
+ Box,
121
+ {
122
+ "data-testid": "avatar-container",
123
+ className,
124
+ sx: mergeSx(
125
+ {
126
+ display: "flex",
127
+ alignItems: "center",
128
+ lineHeight: 1,
129
+ width: "fit-content"
130
+ },
131
+ sx
132
+ ),
133
+ children: [
134
+ /* @__PURE__ */ jsx(Box, { sx: { display: "flex", alignItems: "center" }, children: visibleItems.map((item, i) => renderSingleAvatar(item, i)) }),
135
+ showText && ((_a = items[0]) == null ? void 0 : _a.text) && /* @__PURE__ */ jsxs(
136
+ Typography,
90
137
  {
91
- "data-testid": "badge",
92
- "aria-label": item.text,
93
- style: __spreadProps(__spreadValues({}, style.badge), {
94
- display: "inline-block",
95
- backgroundColor: item.backgroundColor || "#c8d5e9",
96
- color: item.color || "#667688",
97
- fontWeight: 700,
98
- textAlign: "center",
99
- borderRadius: "9999px",
100
- border: `${style.badge.borderWidth}px solid white`,
101
- lineHeight: style.badge.height,
102
- fontSize: style.badge.fontSize,
103
- marginTop: style.badge.marginTop,
104
- marginBottom: style.badge.marginTop
105
- }),
106
- children: item.badge
138
+ "data-testid": "text",
139
+ variant: "caption",
140
+ sx: {
141
+ ml: 1,
142
+ fontSize: "0.75rem",
143
+ fontWeight: 400,
144
+ color: "text.primary"
145
+ },
146
+ children: [
147
+ type && items.length === 1 && /* @__PURE__ */ jsxs(Box, { component: "span", "data-testid": "type", sx: { mr: 0.5 }, children: [
148
+ type,
149
+ ":"
150
+ ] }),
151
+ items[0].text,
152
+ items.length > 1 && ` +${items.length - 1}`
153
+ ]
107
154
  }
108
155
  )
109
- ] }, i);
110
- return showTooltip && item.text ? /* @__PURE__ */ jsx(Tooltip, { title: item.text, children: content }, i) : content;
111
- }),
112
- showText && /* @__PURE__ */ jsxs("span", { "data-testid": "text", className: "ml-2 text-xs font-normal", children: [
113
- type && items.length === 1 && /* @__PURE__ */ jsxs("span", { "data-testid": "type", children: [
114
- type,
115
- ": "
116
- ] }),
117
- items[0].text,
118
- " ",
119
- items.length > 2 && `+${items.length - 1}`
120
- ] })
121
- ] });
156
+ ]
157
+ }
158
+ );
122
159
  };
123
160
  export {
124
161
  Avatar