cozy-ui 121.1.0 → 121.1.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [121.1.1](https://github.com/cozy/cozy-ui/compare/v121.1.0...v121.1.1) (2025-03-17)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **Avatar:** Style wasn't correct ([932b3ec](https://github.com/cozy/cozy-ui/commit/932b3ec))
7
+
1
8
  # [121.1.0](https://github.com/cozy/cozy-ui/compare/v121.0.0...v121.1.0) (2025-03-17)
2
9
 
3
10
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cozy-ui",
3
- "version": "121.1.0",
3
+ "version": "121.1.1",
4
4
  "description": "Cozy apps UI SDK",
5
5
  "main": "./index.js",
6
6
  "bin": {
@@ -8,24 +8,41 @@ import { supportedColors } from 'cozy-ui/transpiled/react/Avatar/helpers'
8
8
  import Icon from 'cozy-ui/transpiled/react/Icon'
9
9
  import LinkIcon from "cozy-ui/transpiled/react/Icons/Link"
10
10
  import cozyLogo from '../../docs/cozy-logo_white_128.png'
11
+ import Variants from 'cozy-ui/docs/components/Variants'
11
12
 
12
13
  const sizes = ['xs', 's', 'm', 'l', 'xl']
14
+ const initialVariants = [{ disabled: false }]
13
15
 
14
16
  ;
15
17
 
16
- sizes.map(size => (
17
- <AvatarGroup className="u-mb-half" key={size} max={5} size={size}>
18
- <Avatar size={size} color={supportedColors[0]}>AB</Avatar>
19
- <Avatar size={size} color={supportedColors[1]}>BC</Avatar>
20
- <Avatar size={size} color={supportedColors[2]}><Icon icon={LinkIcon} /></Avatar>
21
- <Avatar size={size} src={cozyLogo} />
22
- <Avatar size={size} color={supportedColors[4]}>EF</Avatar>
23
- <Avatar size={size} color={supportedColors[5]}>FG</Avatar>
24
- </AvatarGroup>
25
- ))
18
+ <Variants initialVariants={initialVariants} screenshotAllVariants>
19
+ {variant => (
20
+ sizes.map(size => (
21
+ <div className="u-mb-half u-flex u-flex-items-center" key={size}>
22
+ <AvatarGroup style={{ zIndex: 2 }} max={4} size={size}>
23
+ <Avatar size={size} color={supportedColors[0]} disabled={variant.disabled}>AB</Avatar>
24
+ <Avatar size={size} color={supportedColors[1]} disabled={variant.disabled}>BC</Avatar>
25
+ <Avatar size={size} src={cozyLogo} disabled={variant.disabled} />
26
+ <Avatar size={size} color={supportedColors[4]} disabled={variant.disabled}>EF</Avatar>
27
+ <Avatar size={size} color={supportedColors[5]} disabled={variant.disabled}>FG</Avatar>
28
+ </AvatarGroup>
29
+ <Avatar
30
+ style={{ marginLeft: `-${spacingByAvatarSize[size]}px`, zIndex: 1 }}
31
+ size={size} color={supportedColors[2]}
32
+ color="none"
33
+ border
34
+ innerBorder
35
+ disabled={variant.disabled}
36
+ >
37
+ <Icon icon={LinkIcon} />
38
+ </Avatar>
39
+ </div>
40
+ ))
41
+ )}
42
+ </Variants>
26
43
  ```
27
44
 
28
- ### Mui
45
+ ### Solo
29
46
 
30
47
  ```jsx
31
48
  import cozyLogo from '../../docs/cozy-logo_white_128.png'
@@ -40,7 +57,7 @@ import Variants from 'cozy-ui/docs/components/Variants'
40
57
 
41
58
  const sizes = ['xs', 's', 'm', 'l', 'xl']
42
59
 
43
- const initialVariants = [{ disabled: false }]
60
+ const initialVariants = [{ disabled: false, border: false, innerBorder: false }]
44
61
 
45
62
  ;
46
63
 
@@ -51,20 +68,23 @@ const initialVariants = [{ disabled: false }]
51
68
  <div key={color} className="u-flex u-flex-items-center u-mb-half" style={{ gap: '0.5rem' }}>
52
69
  {sizes.map(size => (
53
70
  <React.Fragment key={size}>
54
- <Avatar size={size} color={color} disabled={variant.disabled} />
55
- <Avatar size={size} color={color} disabled={variant.disabled}>AB</Avatar>
56
- <Avatar size={size} color={color} disabled={variant.disabled}><Icon icon={LinkIcon} /></Avatar>
71
+ <Avatar size={size} color={color} disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder} />
72
+ <Avatar size={size} color={color} disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder}>AB</Avatar>
73
+ <Avatar size={size} color={color} disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder}><Icon icon={LinkIcon} /></Avatar>
57
74
  </React.Fragment>
58
75
  ))}
59
76
  </div>
60
77
  ))}
61
78
  <div className="u-flex u-flex-items-center u-mb-half" style={{ gap: '0.5rem' }}>
62
- {sizes.map(size => (
63
- <React.Fragment key={size}>
64
- <Avatar size={size} src={cozyLogo} disabled={variant.disabled} />
65
- <Avatar size={size} disabled={variant.disabled} />
66
- </React.Fragment>
67
- ))}
79
+ <Avatar src={cozyLogo} disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder} />
80
+ <Avatar color="none" src={cozyLogo} disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder} />
81
+ <Avatar color="sunrise" src={cozyLogo} disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder} />
82
+ <Avatar disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder} />
83
+ <Avatar color="none" disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder} />
84
+ <Avatar color="sunrise" disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder} />
85
+ <Avatar disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder}>AB</Avatar>
86
+ <Avatar color="none" disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder}>BC</Avatar>
87
+ <Avatar color="sunrise" disabled={variant.disabled} border={variant.border} innerBorder={variant.innerBorder}>CD</Avatar>
68
88
  </div>
69
89
  </>
70
90
  )}
@@ -40,6 +40,17 @@ export const colorMapping = {
40
40
  pluviophile: 'linear-gradient(136deg, #A1D6F4 14.84%, #52CEC2 96.03%)',
41
41
  cornflower: 'linear-gradient(135deg, #86D9D3 0%, #1CCFB4 100%)',
42
42
  paleGreen: 'linear-gradient(135deg, #E2FA17 0%, #75D8CB 100%)',
43
- moonBlue: 'linear-gradient(136deg, #6DCFFF 14.84%, #3D88F8 96.03%)',
44
- undefined: ''
43
+ moonBlue: 'linear-gradient(136deg, #6DCFFF 14.84%, #3D88F8 96.03%)'
44
+ }
45
+
46
+ const colors = Object.values(supportedColors).filter(Boolean)
47
+
48
+ const makeKey = (colors, name) =>
49
+ Array.from(name.toUpperCase())
50
+ .map(letter => letter.charCodeAt(0))
51
+ .reduce((sum, number) => sum + number, 0) % colors.length
52
+
53
+ export const nameToColor = (name = '') => {
54
+ const key = makeKey(colors, name)
55
+ return colors[key]
45
56
  }
@@ -3,7 +3,7 @@ import cx from 'classnames'
3
3
  import PropTypes from 'prop-types'
4
4
  import React from 'react'
5
5
 
6
- import { colorMapping } from './helpers'
6
+ import { colorMapping, supportedColors, nameToColor } from './helpers'
7
7
  import { makeStyles } from '../styles'
8
8
 
9
9
  const useStyles = makeStyles(theme => ({
@@ -13,13 +13,34 @@ const useStyles = makeStyles(theme => ({
13
13
  }
14
14
  }))
15
15
 
16
- const Avatar = ({ className, color, size, disabled, ...props }) => {
17
- const classes = useStyles({ color })
16
+ const Avatar = ({
17
+ className,
18
+ color,
19
+ size,
20
+ border,
21
+ innerBorder,
22
+ disabled,
23
+ ...props
24
+ }) => {
25
+ const defaultColor =
26
+ typeof props.children === 'string' ? nameToColor(props.children) : undefined
27
+ const classes = useStyles({
28
+ color:
29
+ color === 'none'
30
+ ? undefined
31
+ : supportedColors.includes(color)
32
+ ? color
33
+ : defaultColor
34
+ })
18
35
 
19
36
  return (
20
37
  <AvatarMui
21
38
  classes={classes}
22
- className={cx(className, `size-${size}`, { disabled: !!disabled })}
39
+ className={cx(className, `size-${size}`, {
40
+ disabled: !!disabled,
41
+ border: !!border,
42
+ innerBorder: !!innerBorder
43
+ })}
23
44
  {...props}
24
45
  />
25
46
  )
@@ -31,7 +52,7 @@ Avatar.propTypes = {
31
52
  PropTypes.oneOf(['xs', 's', 'm', 'l', 'xl']),
32
53
  PropTypes.number
33
54
  ]),
34
- color: PropTypes.string,
55
+ color: PropTypes.oneOf([...supportedColors, 'none']),
35
56
  disabled: PropTypes.bool
36
57
  }
37
58
 
@@ -701,6 +701,77 @@ export const makeLightNormalOverrides = theme => ({
701
701
  }
702
702
  }
703
703
  },
704
+ MuiAvatarGroup: {
705
+ avatar: {
706
+ border: `2px solid ${theme.palette.background.paper}`
707
+ }
708
+ },
709
+ MuiAvatar: {
710
+ root: {
711
+ fontWeight: 600,
712
+ '&.size': {
713
+ '&-xs': {
714
+ width: 16,
715
+ height: 16,
716
+ fontSize: 8,
717
+ '& svg': {
718
+ width: 8,
719
+ height: 8
720
+ }
721
+ },
722
+ '&-s': {
723
+ width: 24,
724
+ height: 24,
725
+ fontSize: 12,
726
+ '& svg': {
727
+ width: 12,
728
+ height: 12
729
+ }
730
+ },
731
+ '&-m': {
732
+ width: 32,
733
+ height: 32,
734
+ fontSize: 16,
735
+ '& svg': {
736
+ width: 16,
737
+ height: 16
738
+ }
739
+ },
740
+ '&-l': {
741
+ width: 48,
742
+ height: 48,
743
+ fontSize: 24,
744
+ '& svg': {
745
+ width: 24,
746
+ height: 24
747
+ }
748
+ },
749
+ '&-xl': {
750
+ width: 64,
751
+ height: 64,
752
+ fontSize: 32,
753
+ '& svg': {
754
+ width: 32,
755
+ height: 32
756
+ }
757
+ }
758
+ },
759
+ '&.disabled': {
760
+ color: theme.palette.primary.contrastText,
761
+ background: 'var(--silver)', // should be semantic but used legacy component color for now
762
+ '& img': {
763
+ filter: 'grayscale(1) brightness(2)',
764
+ opacity: 0.5
765
+ }
766
+ },
767
+ '&.border': {
768
+ border: `2px solid ${theme.palette.background.paper}`
769
+ },
770
+ '&.innerBorder': {
771
+ boxShadow: `inset 0px 0px 0px 1px ${theme.palette.border.main}`
772
+ }
773
+ }
774
+ },
704
775
  MuiCheckbox: {
705
776
  colorSecondary: {
706
777
  '&$checked': {
@@ -171,22 +171,23 @@ export const makeLightNormalTwakeOverrides = theme => {
171
171
  height: 56
172
172
  }
173
173
  },
174
+ MuiAvatarGroup: {
175
+ root: {
176
+ '& > div:last-child': {
177
+ boxShadow: `inset 0px 0px 0px 1px ${theme.palette.border.main}`
178
+ }
179
+ }
180
+ },
174
181
  MuiAvatar: {
175
182
  root: {
176
- fontWeight: 600,
177
183
  '&.size': {
178
184
  '&-xs': {
179
- width: 16,
180
- height: 16,
181
- fontSize: 8,
182
185
  '& svg': {
183
186
  width: 10,
184
187
  height: 10
185
188
  }
186
189
  },
187
190
  '&-s': {
188
- width: 24,
189
- height: 24,
190
191
  fontSize: 11,
191
192
  '& svg': {
192
193
  width: 16,
@@ -194,36 +195,23 @@ export const makeLightNormalTwakeOverrides = theme => {
194
195
  }
195
196
  },
196
197
  '&-m': {
197
- width: 32,
198
- height: 32,
199
- fontSize: 16,
200
198
  '& svg': {
201
199
  width: 20,
202
200
  height: 20
203
201
  }
204
202
  },
205
203
  '&-l': {
206
- width: 48,
207
- height: 48,
208
- fontSize: 24,
209
204
  '& svg': {
210
205
  width: 28,
211
206
  height: 28
212
207
  }
213
208
  },
214
209
  '&-xl': {
215
- width: 64,
216
- height: 64,
217
- fontSize: 32,
218
210
  '& svg': {
219
211
  width: 36,
220
212
  height: 36
221
213
  }
222
214
  }
223
- },
224
- '&.disabled': {
225
- color: theme.palette.primary.contrastText,
226
- background: theme.palette.action.disabledBackground
227
215
  }
228
216
  },
229
217
  colorDefault: {
@@ -30,5 +30,5 @@ export namespace colorMapping {
30
30
  const cornflower: string;
31
31
  const paleGreen: string;
32
32
  const moonBlue: string;
33
- const undefined: string;
34
33
  }
34
+ export function nameToColor(name?: string): string;
@@ -25,6 +25,20 @@ export var colorMapping = {
25
25
  pluviophile: 'linear-gradient(136deg, #A1D6F4 14.84%, #52CEC2 96.03%)',
26
26
  cornflower: 'linear-gradient(135deg, #86D9D3 0%, #1CCFB4 100%)',
27
27
  paleGreen: 'linear-gradient(135deg, #E2FA17 0%, #75D8CB 100%)',
28
- moonBlue: 'linear-gradient(136deg, #6DCFFF 14.84%, #3D88F8 96.03%)',
29
- undefined: ''
28
+ moonBlue: 'linear-gradient(136deg, #6DCFFF 14.84%, #3D88F8 96.03%)'
29
+ };
30
+ var colors = Object.values(supportedColors).filter(Boolean);
31
+
32
+ var makeKey = function makeKey(colors, name) {
33
+ return Array.from(name.toUpperCase()).map(function (letter) {
34
+ return letter.charCodeAt(0);
35
+ }).reduce(function (sum, number) {
36
+ return sum + number;
37
+ }, 0) % colors.length;
38
+ };
39
+
40
+ export var nameToColor = function nameToColor() {
41
+ var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
42
+ var key = makeKey(colors, name);
43
+ return colors[key];
30
44
  };
@@ -1,11 +1,12 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
1
2
  import _extends from "@babel/runtime/helpers/extends";
2
3
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
- var _excluded = ["className", "color", "size", "disabled"];
4
+ var _excluded = ["className", "color", "size", "border", "innerBorder", "disabled"];
4
5
  import AvatarMui from '@material-ui/core/Avatar';
5
6
  import cx from 'classnames';
6
7
  import PropTypes from 'prop-types';
7
8
  import React from 'react';
8
- import { colorMapping } from "cozy-ui/transpiled/react/Avatar/helpers";
9
+ import { colorMapping, supportedColors, nameToColor } from "cozy-ui/transpiled/react/Avatar/helpers";
9
10
  import { makeStyles } from "cozy-ui/transpiled/react/styles";
10
11
  var useStyles = makeStyles(function (theme) {
11
12
  return {
@@ -26,16 +27,21 @@ var Avatar = function Avatar(_ref3) {
26
27
  var className = _ref3.className,
27
28
  color = _ref3.color,
28
29
  size = _ref3.size,
30
+ border = _ref3.border,
31
+ innerBorder = _ref3.innerBorder,
29
32
  disabled = _ref3.disabled,
30
33
  props = _objectWithoutProperties(_ref3, _excluded);
31
34
 
35
+ var defaultColor = typeof props.children === 'string' ? nameToColor(props.children) : undefined;
32
36
  var classes = useStyles({
33
- color: color
37
+ color: color === 'none' ? undefined : supportedColors.includes(color) ? color : defaultColor
34
38
  });
35
39
  return /*#__PURE__*/React.createElement(AvatarMui, _extends({
36
40
  classes: classes,
37
41
  className: cx(className, "size-".concat(size), {
38
- disabled: !!disabled
42
+ disabled: !!disabled,
43
+ border: !!border,
44
+ innerBorder: !!innerBorder
39
45
  })
40
46
  }, props));
41
47
  };
@@ -43,7 +49,7 @@ var Avatar = function Avatar(_ref3) {
43
49
  Avatar.propTypes = {
44
50
  className: PropTypes.string,
45
51
  size: PropTypes.oneOfType([PropTypes.oneOf(['xs', 's', 'm', 'l', 'xl']), PropTypes.number]),
46
- color: PropTypes.string,
52
+ color: PropTypes.oneOf([].concat(_toConsumableArray(supportedColors), ['none'])),
47
53
  disabled: PropTypes.bool
48
54
  };
49
55
  Avatar.defaultProps = {
@@ -728,6 +728,77 @@ export function makeDarkInvertedOverrides(theme: any): {
728
728
  };
729
729
  };
730
730
  };
731
+ MuiAvatarGroup: {
732
+ avatar: {
733
+ border: string;
734
+ };
735
+ };
736
+ MuiAvatar: {
737
+ root: {
738
+ fontWeight: number;
739
+ '&.size': {
740
+ '&-xs': {
741
+ width: number;
742
+ height: number;
743
+ fontSize: number;
744
+ '& svg': {
745
+ width: number;
746
+ height: number;
747
+ };
748
+ };
749
+ '&-s': {
750
+ width: number;
751
+ height: number;
752
+ fontSize: number;
753
+ '& svg': {
754
+ width: number;
755
+ height: number;
756
+ };
757
+ };
758
+ '&-m': {
759
+ width: number;
760
+ height: number;
761
+ fontSize: number;
762
+ '& svg': {
763
+ width: number;
764
+ height: number;
765
+ };
766
+ };
767
+ '&-l': {
768
+ width: number;
769
+ height: number;
770
+ fontSize: number;
771
+ '& svg': {
772
+ width: number;
773
+ height: number;
774
+ };
775
+ };
776
+ '&-xl': {
777
+ width: number;
778
+ height: number;
779
+ fontSize: number;
780
+ '& svg': {
781
+ width: number;
782
+ height: number;
783
+ };
784
+ };
785
+ };
786
+ '&.disabled': {
787
+ color: any;
788
+ background: string;
789
+ '& img': {
790
+ filter: string;
791
+ opacity: number;
792
+ };
793
+ };
794
+ '&.border': {
795
+ border: string;
796
+ };
797
+ '&.innerBorder': {
798
+ boxShadow: string;
799
+ };
800
+ };
801
+ };
731
802
  MuiCheckbox: {
732
803
  colorSecondary: {
733
804
  '&$checked': {
@@ -728,6 +728,77 @@ export function makeDarkNormalOverrides(theme: any): {
728
728
  };
729
729
  };
730
730
  };
731
+ MuiAvatarGroup: {
732
+ avatar: {
733
+ border: string;
734
+ };
735
+ };
736
+ MuiAvatar: {
737
+ root: {
738
+ fontWeight: number;
739
+ '&.size': {
740
+ '&-xs': {
741
+ width: number;
742
+ height: number;
743
+ fontSize: number;
744
+ '& svg': {
745
+ width: number;
746
+ height: number;
747
+ };
748
+ };
749
+ '&-s': {
750
+ width: number;
751
+ height: number;
752
+ fontSize: number;
753
+ '& svg': {
754
+ width: number;
755
+ height: number;
756
+ };
757
+ };
758
+ '&-m': {
759
+ width: number;
760
+ height: number;
761
+ fontSize: number;
762
+ '& svg': {
763
+ width: number;
764
+ height: number;
765
+ };
766
+ };
767
+ '&-l': {
768
+ width: number;
769
+ height: number;
770
+ fontSize: number;
771
+ '& svg': {
772
+ width: number;
773
+ height: number;
774
+ };
775
+ };
776
+ '&-xl': {
777
+ width: number;
778
+ height: number;
779
+ fontSize: number;
780
+ '& svg': {
781
+ width: number;
782
+ height: number;
783
+ };
784
+ };
785
+ };
786
+ '&.disabled': {
787
+ color: any;
788
+ background: string;
789
+ '& img': {
790
+ filter: string;
791
+ opacity: number;
792
+ };
793
+ };
794
+ '&.border': {
795
+ border: string;
796
+ };
797
+ '&.innerBorder': {
798
+ boxShadow: string;
799
+ };
800
+ };
801
+ };
731
802
  MuiCheckbox: {
732
803
  colorSecondary: {
733
804
  '&$checked': {
@@ -728,6 +728,77 @@ export function makeLightInvertedOverrides(theme: any): {
728
728
  };
729
729
  };
730
730
  };
731
+ MuiAvatarGroup: {
732
+ avatar: {
733
+ border: string;
734
+ };
735
+ };
736
+ MuiAvatar: {
737
+ root: {
738
+ fontWeight: number;
739
+ '&.size': {
740
+ '&-xs': {
741
+ width: number;
742
+ height: number;
743
+ fontSize: number;
744
+ '& svg': {
745
+ width: number;
746
+ height: number;
747
+ };
748
+ };
749
+ '&-s': {
750
+ width: number;
751
+ height: number;
752
+ fontSize: number;
753
+ '& svg': {
754
+ width: number;
755
+ height: number;
756
+ };
757
+ };
758
+ '&-m': {
759
+ width: number;
760
+ height: number;
761
+ fontSize: number;
762
+ '& svg': {
763
+ width: number;
764
+ height: number;
765
+ };
766
+ };
767
+ '&-l': {
768
+ width: number;
769
+ height: number;
770
+ fontSize: number;
771
+ '& svg': {
772
+ width: number;
773
+ height: number;
774
+ };
775
+ };
776
+ '&-xl': {
777
+ width: number;
778
+ height: number;
779
+ fontSize: number;
780
+ '& svg': {
781
+ width: number;
782
+ height: number;
783
+ };
784
+ };
785
+ };
786
+ '&.disabled': {
787
+ color: any;
788
+ background: string;
789
+ '& img': {
790
+ filter: string;
791
+ opacity: number;
792
+ };
793
+ };
794
+ '&.border': {
795
+ border: string;
796
+ };
797
+ '&.innerBorder': {
798
+ boxShadow: string;
799
+ };
800
+ };
801
+ };
731
802
  MuiCheckbox: {
732
803
  colorSecondary: {
733
804
  '&$checked': {