@instructure/ui-avatar 8.49.1-snapshot-7 → 8.49.1-snapshot-9

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
@@ -3,9 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- ## [8.49.1-snapshot-7](https://github.com/instructure/instructure-ui/compare/v8.49.0...v8.49.1-snapshot-7) (2023-12-05)
6
+ ## [8.49.1-snapshot-9](https://github.com/instructure/instructure-ui/compare/v8.49.0...v8.49.1-snapshot-9) (2023-12-05)
7
7
 
8
- **Note:** Version bump only for package @instructure/ui-avatar
8
+
9
+ ### Features
10
+
11
+ * **ui-avatar:** add showBorder prop to Avatar ([693ea76](https://github.com/instructure/instructure-ui/commit/693ea767282824272360fbdbcea57ad5152fbd0a))
9
12
 
10
13
 
11
14
 
@@ -36,6 +36,9 @@ export default {
36
36
  if (props.color !== 'default' && props.size !== 'medium') {
37
37
  return true;
38
38
  }
39
+ if (props.src && props.showBorder === 'never' || !props.src && props.showBorder === 'always') {
40
+ return true;
41
+ }
39
42
  if (props.renderIcon && props.src) {
40
43
  return true;
41
44
  }
@@ -136,6 +136,7 @@ let Avatar = (_dec = withStyle(generateStyle, generateComponentTheme), _dec2 = t
136
136
  size: 'medium',
137
137
  color: 'default',
138
138
  hasInverseColor: false,
139
+ showBorder: 'auto',
139
140
  shape: 'circle',
140
141
  display: 'inline-block',
141
142
  onImageLoaded: _event => {}
@@ -31,6 +31,7 @@ const propTypes = {
31
31
  size: PropTypes.oneOf(['auto', 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large']),
32
32
  color: PropTypes.oneOf(['default', 'shamrock', 'barney', 'crimson', 'fire', 'licorice', 'ash']),
33
33
  hasInverseColor: PropTypes.bool,
34
+ showBorder: PropTypes.oneOf(['auto', 'always', 'never']),
34
35
  shape: PropTypes.oneOf(['circle', 'rectangle']),
35
36
  margin: ThemeablePropTypes.spacing,
36
37
  display: PropTypes.oneOf(['inline-block', 'block']),
@@ -39,5 +40,5 @@ const propTypes = {
39
40
  elementRef: PropTypes.func,
40
41
  renderIcon: PropTypes.oneOfType([PropTypes.node, PropTypes.func])
41
42
  };
42
- const allowedProps = ['name', 'src', 'alt', 'size', 'color', 'hasInverseColor', 'shape', 'margin', 'display', 'onImageLoaded', 'as', 'elementRef', 'renderIcon'];
43
+ const allowedProps = ['name', 'src', 'alt', 'size', 'color', 'hasInverseColor', 'shape', 'margin', 'display', 'onImageLoaded', 'as', 'elementRef', 'renderIcon', 'showBorder'];
43
44
  export { propTypes, allowedProps };
@@ -37,7 +37,8 @@ const generateStyle = (componentTheme, props, state) => {
37
37
  color = props.color,
38
38
  hasInverseColor = props.hasInverseColor,
39
39
  shape = props.shape,
40
- src = props.src;
40
+ src = props.src,
41
+ showBorder = props.showBorder;
41
42
  const loaded = state.loaded;
42
43
  const sizeStyles = {
43
44
  auto: {
@@ -109,21 +110,26 @@ const generateStyle = (componentTheme, props, state) => {
109
110
  overflow: 'hidden',
110
111
  lineHeight: 0,
111
112
  textAlign: 'center',
113
+ borderStyle: 'solid',
114
+ borderColor: componentTheme.borderColor,
112
115
  ...sizeStyles[size],
113
116
  ...variantStyles[shape],
114
117
  ...(loaded ? {
115
118
  backgroundImage: `url('${src}')`,
116
- border: 0,
119
+ ...(showBorder !== 'always' && {
120
+ border: 0
121
+ }),
117
122
  boxShadow: `inset 0 0 ${componentTheme.boxShadowBlur} 0 ${componentTheme.boxShadowColor}`
118
123
  } : {
119
124
  backgroundImage: void 0,
120
- borderStyle: 'solid',
121
- borderColor: componentTheme.borderColor,
122
125
  ...(hasInverseColor && {
123
126
  border: 0,
124
127
  padding: sizeStyles[size].borderWidth,
125
128
  backgroundClip: 'border-box'
126
129
  })
130
+ }),
131
+ ...(showBorder === 'never' && {
132
+ border: 0
127
133
  })
128
134
  },
129
135
  initials: {
@@ -42,6 +42,9 @@ var _default = exports.default = {
42
42
  if (props.color !== 'default' && props.size !== 'medium') {
43
43
  return true;
44
44
  }
45
+ if (props.src && props.showBorder === 'never' || !props.src && props.showBorder === 'always') {
46
+ return true;
47
+ }
45
48
  if (props.renderIcon && props.src) {
46
49
  return true;
47
50
  }
@@ -143,6 +143,7 @@ let Avatar = exports.Avatar = (_dec = (0, _emotion.withStyle)(_styles.default, _
143
143
  size: 'medium',
144
144
  color: 'default',
145
145
  hasInverseColor: false,
146
+ showBorder: 'auto',
146
147
  shape: 'circle',
147
148
  display: 'inline-block',
148
149
  onImageLoaded: _event => {}
@@ -38,6 +38,7 @@ const propTypes = exports.propTypes = {
38
38
  size: _propTypes.default.oneOf(['auto', 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large']),
39
39
  color: _propTypes.default.oneOf(['default', 'shamrock', 'barney', 'crimson', 'fire', 'licorice', 'ash']),
40
40
  hasInverseColor: _propTypes.default.bool,
41
+ showBorder: _propTypes.default.oneOf(['auto', 'always', 'never']),
41
42
  shape: _propTypes.default.oneOf(['circle', 'rectangle']),
42
43
  margin: _emotion.ThemeablePropTypes.spacing,
43
44
  display: _propTypes.default.oneOf(['inline-block', 'block']),
@@ -46,4 +47,4 @@ const propTypes = exports.propTypes = {
46
47
  elementRef: _propTypes.default.func,
47
48
  renderIcon: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.func])
48
49
  };
49
- const allowedProps = exports.allowedProps = ['name', 'src', 'alt', 'size', 'color', 'hasInverseColor', 'shape', 'margin', 'display', 'onImageLoaded', 'as', 'elementRef', 'renderIcon'];
50
+ const allowedProps = exports.allowedProps = ['name', 'src', 'alt', 'size', 'color', 'hasInverseColor', 'shape', 'margin', 'display', 'onImageLoaded', 'as', 'elementRef', 'renderIcon', 'showBorder'];
@@ -43,7 +43,8 @@ const generateStyle = (componentTheme, props, state) => {
43
43
  color = props.color,
44
44
  hasInverseColor = props.hasInverseColor,
45
45
  shape = props.shape,
46
- src = props.src;
46
+ src = props.src,
47
+ showBorder = props.showBorder;
47
48
  const loaded = state.loaded;
48
49
  const sizeStyles = {
49
50
  auto: {
@@ -115,21 +116,26 @@ const generateStyle = (componentTheme, props, state) => {
115
116
  overflow: 'hidden',
116
117
  lineHeight: 0,
117
118
  textAlign: 'center',
119
+ borderStyle: 'solid',
120
+ borderColor: componentTheme.borderColor,
118
121
  ...sizeStyles[size],
119
122
  ...variantStyles[shape],
120
123
  ...(loaded ? {
121
124
  backgroundImage: `url('${src}')`,
122
- border: 0,
125
+ ...(showBorder !== 'always' && {
126
+ border: 0
127
+ }),
123
128
  boxShadow: `inset 0 0 ${componentTheme.boxShadowBlur} 0 ${componentTheme.boxShadowColor}`
124
129
  } : {
125
130
  backgroundImage: void 0,
126
- borderStyle: 'solid',
127
- borderColor: componentTheme.borderColor,
128
131
  ...(hasInverseColor && {
129
132
  border: 0,
130
133
  padding: sizeStyles[size].borderWidth,
131
134
  backgroundClip: 'border-box'
132
135
  })
136
+ }),
137
+ ...(showBorder === 'never' && {
138
+ border: 0
133
139
  })
134
140
  },
135
141
  initials: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/ui-avatar",
3
- "version": "8.49.1-snapshot-7",
3
+ "version": "8.49.1-snapshot-9",
4
4
  "description": "An image or letters that represents a user.",
5
5
  "author": "Instructure, Inc. Engineering and Product Design",
6
6
  "module": "./es/index.js",
@@ -24,22 +24,22 @@
24
24
  "license": "MIT",
25
25
  "dependencies": {
26
26
  "@babel/runtime": "^7.23.2",
27
- "@instructure/console": "8.49.1-snapshot-7",
28
- "@instructure/emotion": "8.49.1-snapshot-7",
29
- "@instructure/shared-types": "8.49.1-snapshot-7",
30
- "@instructure/ui-icons": "8.49.1-snapshot-7",
31
- "@instructure/ui-react-utils": "8.49.1-snapshot-7",
32
- "@instructure/ui-testable": "8.49.1-snapshot-7",
33
- "@instructure/ui-view": "8.49.1-snapshot-7",
27
+ "@instructure/console": "8.49.1-snapshot-9",
28
+ "@instructure/emotion": "8.49.1-snapshot-9",
29
+ "@instructure/shared-types": "8.49.1-snapshot-9",
30
+ "@instructure/ui-icons": "8.49.1-snapshot-9",
31
+ "@instructure/ui-react-utils": "8.49.1-snapshot-9",
32
+ "@instructure/ui-testable": "8.49.1-snapshot-9",
33
+ "@instructure/ui-view": "8.49.1-snapshot-9",
34
34
  "prop-types": "^15.8.1"
35
35
  },
36
36
  "devDependencies": {
37
- "@instructure/ui-axe-check": "8.49.1-snapshot-7",
38
- "@instructure/ui-babel-preset": "8.49.1-snapshot-7",
39
- "@instructure/ui-color-utils": "8.49.1-snapshot-7",
40
- "@instructure/ui-test-locator": "8.49.1-snapshot-7",
41
- "@instructure/ui-test-utils": "8.49.1-snapshot-7",
42
- "@instructure/ui-themes": "8.49.1-snapshot-7",
37
+ "@instructure/ui-axe-check": "8.49.1-snapshot-9",
38
+ "@instructure/ui-babel-preset": "8.49.1-snapshot-9",
39
+ "@instructure/ui-color-utils": "8.49.1-snapshot-9",
40
+ "@instructure/ui-test-locator": "8.49.1-snapshot-9",
41
+ "@instructure/ui-test-utils": "8.49.1-snapshot-9",
42
+ "@instructure/ui-themes": "8.49.1-snapshot-9",
43
43
  "@testing-library/jest-dom": "^6.1.4",
44
44
  "@testing-library/react": "^14.0.0"
45
45
  },
@@ -136,6 +136,20 @@ example: true
136
136
  </div>
137
137
  ```
138
138
 
139
+ ### Border
140
+
141
+ By default only avatars without an image have borders but you can force it to `always` or `never` show with the `showBorder` prop however you should only use it rarely in very specific occasions (e.g. displaying an avatar in the [SideNavBar](/#SideNavBar))
142
+
143
+ ```js
144
+ ---
145
+ example: true
146
+ ---
147
+ <div>
148
+ <Avatar name="Sarah Robinson" src={avatarSquare} margin="0 small 0 0" showBorder="always"/>
149
+ <Avatar name="Sarah Robinson" renderIcon={<IconGroupLine />} margin="0 small 0 0" showBorder="never"/>
150
+ </div>
151
+ ```
152
+
139
153
  ### Guidelines
140
154
 
141
155
  ```js
@@ -44,6 +44,13 @@ export default {
44
44
  return true
45
45
  }
46
46
 
47
+ if (
48
+ (props.src && props.showBorder === 'never') ||
49
+ (!props.src && props.showBorder === 'always')
50
+ ) {
51
+ return true
52
+ }
53
+
47
54
  if (props.renderIcon && props.src) {
48
55
  return true
49
56
  }
@@ -53,6 +53,7 @@ class Avatar extends Component<AvatarProps, AvatarState> {
53
53
  size: 'medium',
54
54
  color: 'default',
55
55
  hasInverseColor: false,
56
+ showBorder: 'auto',
56
57
  shape: 'circle',
57
58
  display: 'inline-block',
58
59
  onImageLoaded: (_event: SyntheticEvent) => {}
@@ -74,6 +74,10 @@ type AvatarOwnProps = {
74
74
  * In inverse color mode the background and text/icon colors are inverted
75
75
  */
76
76
  hasInverseColor?: boolean
77
+ /**
78
+ * `auto` only shows a border when there is no source image. This prop can force to always or never show that border.
79
+ */
80
+ showBorder?: 'auto' | 'always' | 'never'
77
81
  shape: 'circle' | 'rectangle'
78
82
  display: 'inline-block' | 'block'
79
83
  /**
@@ -140,6 +144,7 @@ const propTypes: PropValidators<PropKeys> = {
140
144
  'ash'
141
145
  ]),
142
146
  hasInverseColor: PropTypes.bool,
147
+ showBorder: PropTypes.oneOf(['auto', 'always', 'never']),
143
148
  shape: PropTypes.oneOf(['circle', 'rectangle']),
144
149
  margin: ThemeablePropTypes.spacing,
145
150
  display: PropTypes.oneOf(['inline-block', 'block']),
@@ -162,7 +167,8 @@ const allowedProps: AllowedPropKeys = [
162
167
  'onImageLoaded',
163
168
  'as',
164
169
  'elementRef',
165
- 'renderIcon'
170
+ 'renderIcon',
171
+ 'showBorder'
166
172
  ]
167
173
 
168
174
  export type { AvatarProps, AvatarStyle }
@@ -40,7 +40,7 @@ const generateStyle = (
40
40
  props: AvatarProps,
41
41
  state: AvatarState
42
42
  ): AvatarStyle => {
43
- const { size, color, hasInverseColor, shape, src } = props
43
+ const { size, color, hasInverseColor, shape, src, showBorder } = props
44
44
  const { loaded } = state
45
45
 
46
46
  const sizeStyles = {
@@ -121,24 +121,29 @@ const generateStyle = (
121
121
  overflow: 'hidden',
122
122
  lineHeight: 0,
123
123
  textAlign: 'center',
124
+ borderStyle: 'solid',
125
+ borderColor: componentTheme.borderColor,
124
126
  ...sizeStyles[size],
125
127
  ...variantStyles[shape],
126
128
  ...(loaded
127
129
  ? {
128
130
  backgroundImage: `url('${src}')`,
129
- border: 0,
131
+ ...(showBorder !== 'always' && {
132
+ border: 0
133
+ }),
130
134
  boxShadow: `inset 0 0 ${componentTheme.boxShadowBlur} 0 ${componentTheme.boxShadowColor}`
131
135
  }
132
136
  : {
133
137
  backgroundImage: undefined,
134
- borderStyle: 'solid',
135
- borderColor: componentTheme.borderColor,
136
138
  ...(hasInverseColor && {
137
139
  border: 0,
138
140
  padding: sizeStyles[size].borderWidth,
139
141
  backgroundClip: 'border-box'
140
142
  })
141
- })
143
+ }),
144
+ ...(showBorder === 'never' && {
145
+ border: 0
146
+ })
142
147
  },
143
148
  initials: {
144
149
  label: 'avatar__initials',