11import Vue from '../../utils/vue'
22import { getComponentConfig } from '../../utils/config'
3- import { isNumber , isString , isUndefinedOrNull } from '../../utils/inspect'
3+ import { isNumber , isString } from '../../utils/inspect'
44import { toFloat } from '../../utils/number'
55import { omit } from '../../utils/object'
66import { pluckProps } from '../../utils/props'
@@ -15,17 +15,13 @@ import normalizeSlotMixin from '../../mixins/normalize-slot'
1515const NAME = 'BAvatar'
1616const CLASS_NAME = 'b-avatar'
1717
18+ const SIZES = [ 'sm' , null , 'lg' ]
19+
1820const RX_NUMBER = / ^ [ 0 - 9 ] * \. ? [ 0 - 9 ] + $ /
1921
2022const FONT_SIZE_SCALE = 0.4
2123const BADGE_FONT_SIZE_SCALE = FONT_SIZE_SCALE * 0.7
2224
23- const DEFAULT_SIZES = {
24- sm : '1.5em' ,
25- md : '2.5em' ,
26- lg : '3.5em'
27- }
28-
2925// --- Props ---
3026const linkProps = omit ( BLinkProps , [ 'active' , 'event' , 'routerTag' ] )
3127
@@ -99,18 +95,10 @@ const props = {
9995
10096// --- Utility methods ---
10197export const computeSize = value => {
102- // Default to `md` size when `null`, or parse to
103- // number when value is a float-like string
104- value =
105- isUndefinedOrNull ( value ) || value === ''
106- ? 'md'
107- : isString ( value ) && RX_NUMBER . test ( value )
108- ? toFloat ( value , 0 )
109- : value
98+ // Parse to number when value is a float-like string
99+ value = isString ( value ) && RX_NUMBER . test ( value ) ? toFloat ( value , 0 ) : value
110100 // Convert all numbers to pixel values
111- // Handle default sizes when `sm`, `md` or `lg`
112- // Or use value as is
113- return isNumber ( value ) ? `${ value } px` : DEFAULT_SIZES [ value ] || value
101+ return isNumber ( value ) ? `${ value } px` : value || null
114102}
115103
116104// --- Main component ---
@@ -130,36 +118,35 @@ export const BAvatar = /*#__PURE__*/ Vue.extend({
130118 computed : {
131119 computedSize ( ) {
132120 // Always use the avatar group size
133- return computeSize ( this . bvAvatarGroup ? this . bvAvatarGroup . size : this . size )
121+ const { bvAvatarGroup } = this
122+ return computeSize ( bvAvatarGroup ? bvAvatarGroup . size : this . size )
134123 } ,
135124 computedVariant ( ) {
136- // Prefer avatar-group variant if provided
137- const avatarGroup = this . bvAvatarGroup
138- return avatarGroup && avatarGroup . variant ? avatarGroup . variant : this . variant
125+ const { bvAvatarGroup } = this
126+ return bvAvatarGroup && bvAvatarGroup . variant ? bvAvatarGroup . variant : this . variant
139127 } ,
140128 computedRounded ( ) {
141- const avatarGroup = this . bvAvatarGroup
142- const square = avatarGroup && avatarGroup . square ? true : this . square
143- const rounded = avatarGroup && avatarGroup . rounded ? avatarGroup . rounded : this . rounded
129+ const { bvAvatarGroup } = this
130+ const square = bvAvatarGroup && bvAvatarGroup . square ? true : this . square
131+ const rounded = bvAvatarGroup && bvAvatarGroup . rounded ? bvAvatarGroup . rounded : this . rounded
144132 return square ? '0' : rounded === '' ? true : rounded || 'circle'
145133 } ,
146134 fontStyle ( ) {
147- let fontSize = this . computedSize
148- fontSize = fontSize ? `calc(${ fontSize } * ${ FONT_SIZE_SCALE } )` : null
135+ const { computedSize : size } = this
136+ const fontSize = SIZES . indexOf ( size ) === - 1 ? `calc(${ size } * ${ FONT_SIZE_SCALE } )` : null
149137 return fontSize ? { fontSize } : { }
150138 } ,
151139 marginStyle ( ) {
152- const avatarGroup = this . bvAvatarGroup
153- const overlapScale = avatarGroup ? avatarGroup . overlapScale : 0
154- const size = this . computedSize
140+ const { computedSize : size , bvAvatarGroup } = this
141+ const overlapScale = bvAvatarGroup ? bvAvatarGroup . overlapScale : 0
155142 const value = size && overlapScale ? `calc(${ size } * -${ overlapScale } )` : null
156143 return value ? { marginLeft : value , marginRight : value } : { }
157144 } ,
158145 badgeStyle ( ) {
159146 const { computedSize : size , badgeTop, badgeLeft, badgeOffset } = this
160147 const offset = badgeOffset || '0px'
161148 return {
162- fontSize : size ? `calc(${ size } * ${ BADGE_FONT_SIZE_SCALE } )` : null ,
149+ fontSize : SIZES . indexOf ( size ) === - 1 ? `calc(${ size } * ${ BADGE_FONT_SIZE_SCALE } )` : null ,
163150 top : badgeTop ? offset : null ,
164151 bottom : badgeTop ? null : offset ,
165152 left : badgeLeft ? offset : null ,
@@ -246,6 +233,8 @@ export const BAvatar = /*#__PURE__*/ Vue.extend({
246233 const componentData = {
247234 staticClass : CLASS_NAME ,
248235 class : {
236+ // Apply size class
237+ [ `${ CLASS_NAME } -${ size } ` ] : size && SIZES . indexOf ( size ) !== - 1 ,
249238 // We use badge styles for theme variants when not rendering `BButton`
250239 [ `badge-${ variant } ` ] : ! button && variant ,
251240 // Rounding/Square
@@ -254,7 +243,7 @@ export const BAvatar = /*#__PURE__*/ Vue.extend({
254243 // Other classes
255244 disabled
256245 } ,
257- style : { width : size , height : size , ... marginStyle } ,
246+ style : { ... marginStyle , width : size , height : size } ,
258247 attrs : { 'aria-label' : ariaLabel || null } ,
259248 props : button ? { variant, disabled, type } : link ? pluckProps ( linkProps , this ) : { } ,
260249 on : button || link ? { click : this . onClick } : { }
0 commit comments