@use 'sass:list'; @use 'iro-sass/src/index' as iro; @use '../functions' as fn; $sizes: 'xs' 'sm' 'lg' 'xl' 'xxl' 'xxxl'; @mixin status($size: ()) { @include iro.bem-elem('status') { inline-size: fn.dim(list.join($size, --indicator-size)); block-size: fn.dim(list.join($size, --indicator-size)); @include iro.bem-next-elem('content') { mask-image: radial-gradient( circle calc(.5 * fn.dim(list.join($size, --indicator-size)) + fn.dim(--indicator-spacing)) at calc(100% - .5 * fn.dim(list.join($size, --indicator-size))) calc(100% - .5 * fn.dim(list.join($size, --indicator-size))), transparent 95%, #fff ); } } } @include iro.props-namespace('avatar') { @include iro.props-store(( --dims: ( --size: fn.global-dim(--size --500), --font-size: fn.global-dim(--font-size --100), --indicator-size: fn.global-dim(--size --150), --indicator-spacing: fn.global-dim(--size --40), --rounding: 25%, --xxxl: ( --size: fn.global-dim(--size --1600), --font-size: fn.global-dim(--font-size --800), --indicator-size: fn.global-dim(--size --400), ), --xxl: ( --size: fn.global-dim(--size --1200), --font-size: fn.global-dim(--font-size --600), --indicator-size: fn.global-dim(--size --300), ), --xl: ( --size: fn.global-dim(--size --800), --font-size: fn.global-dim(--font-size --300), --indicator-size: fn.global-dim(--size --225), ), --lg: ( --size: fn.global-dim(--size --650), --font-size: fn.global-dim(--font-size --200), --indicator-size: fn.global-dim(--size --175), ), --sm: ( --size: fn.global-dim(--size --375), --font-size: fn.global-dim(--font-size --75), --indicator-size: fn.global-dim(--size --125), ), --xs: ( --size: fn.global-dim(--size --250), --font-size: fn.global-dim(--font-size --50), --indicator-size: fn.global-dim(--size --100), ), --key-focus: ( --border: fn.global-dim(--key-focus --border), --border-offset: fn.global-dim(--key-focus --border-offset), --outline: fn.global-dim(--key-focus --outline), ), ), --colors: ( --h: 354, --s: 44%, --l: 45%, --key-focus: ( --border: fn.global-color(--focus --border), --outline: fn.global-color(--focus --outline), ), ), )); @include iro.bem-object(iro.props-namespace()) { display: inline-block; position: relative; border-radius: fn.dim(--rounding); font-size: fn.dim(--font-size); font-style: normal; vertical-align: .05em; &::after { content: ''; display: none; position: absolute; z-index: 1; inset: calc(-1 * fn.dim(--key-focus --border-offset)); border: fn.dim(--key-focus --border-offset) solid transparent; border-radius: fn.dim(--rounding); outline: fn.color(--key-focus --border) solid fn.dim(--key-focus --border); box-shadow: 0 0 0 calc(fn.dim(--key-focus --border) + fn.dim(--key-focus --outline)) fn.color(--key-focus --outline); pointer-events: none; } @include iro.bem-elem('status') { position: absolute; inset-inline-end: 0; inset-block-end: 0; } @include status; @include iro.bem-elem('content') { display: block; inline-size: fn.dim(--size); block-size: fn.dim(--size); border-radius: fn.dim(--rounding); line-height: fn.dim(--size); text-align: center; object-fit: cover; object-position: center center; } @include iro.bem-modifier('circle') { border-radius: 100%; &::after { border-radius: 100%; } @include iro.bem-elem('content') { border-radius: 100%; } } @include iro.bem-modifier('placeholder') { @include iro.bem-elem('content') { background-color: hsl(0, 0%, fn.color(--l)); } } @include iro.bem-modifier('colored') { @include iro.bem-elem('content') { background-color: hsl(fn.color(--h), fn.color(--s), fn.color(--l)); color: #fff; } } @each $size in $sizes { @include iro.bem-modifier($size) { font-size: fn.dim(--#{$size} --font-size); @include status(--#{$size}); @include iro.bem-elem('content') { inline-size: fn.dim(--#{$size} --size); block-size: fn.dim(--#{$size} --size); line-height: fn.dim(--#{$size} --size); } } } &:focus-visible { &::after { display: block; } } } }