mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2025-12-13 07:46:06 +00:00
extended avatar component
This commit is contained in:
parent
a1bc604dd9
commit
46e01c5596
@ -2,26 +2,91 @@
|
|||||||
<div
|
<div
|
||||||
class="ds-avatar"
|
class="ds-avatar"
|
||||||
:style="styles">
|
:style="styles">
|
||||||
<img :src="image">
|
<img
|
||||||
|
v-if="!error"
|
||||||
|
:src="image"
|
||||||
|
@error="onError">
|
||||||
|
<ds-flex
|
||||||
|
v-if="!hasImage || error"
|
||||||
|
style="height: 100%">
|
||||||
|
<ds-flex-item center>
|
||||||
|
<template v-if="isAnonymus">
|
||||||
|
<ds-icon name="eye-slash" />
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
{{ userInitials }}
|
||||||
|
</template>
|
||||||
|
</ds-flex-item>
|
||||||
|
</ds-flex>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import helpers from './lib/helpers.js'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DsAvatar',
|
name: 'DsAvatar',
|
||||||
props: {
|
props: {
|
||||||
|
backgroundColor: { type: String, default: null },
|
||||||
|
name: { type: String, default: 'Anonymus' },
|
||||||
size: { type: [Number, String], default: '32px' },
|
size: { type: [Number, String], default: '32px' },
|
||||||
image: { type: String, required: true }
|
image: { type: String, default: null }
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
error: false
|
||||||
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
isAnonymus() {
|
||||||
|
return !this.name || this.name.toLowerCase() === 'anonymus'
|
||||||
|
},
|
||||||
styles() {
|
styles() {
|
||||||
let size = this.size
|
let size = this.size
|
||||||
if (Number.isInteger(Number(size))) {
|
if (Number.isInteger(Number(size))) {
|
||||||
size = `${size}px`
|
size = `${size}px`
|
||||||
}
|
}
|
||||||
|
const nummericSize = Number.parseInt(size)
|
||||||
return {
|
return {
|
||||||
width: size,
|
width: size,
|
||||||
height: size
|
height: size,
|
||||||
|
backgroundColor: this.hasImage ? 'white' : this.background,
|
||||||
|
fontSize: Math.floor(nummericSize / 2.5) + 'px',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
color: this.fontColor
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hasImage() {
|
||||||
|
return Boolean(this.image) && !this.error
|
||||||
|
},
|
||||||
|
userInitials() {
|
||||||
|
return helpers.initials(this.name)
|
||||||
|
},
|
||||||
|
background() {
|
||||||
|
return (
|
||||||
|
this.backgroundColor ||
|
||||||
|
helpers.randomBackgroundColor(
|
||||||
|
this.name.length,
|
||||||
|
helpers.backgroundColors
|
||||||
|
)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
fontColor() {
|
||||||
|
return this.color || helpers.lightenColor(this.background, 200)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onError() {
|
||||||
|
this.error = true
|
||||||
|
},
|
||||||
|
updateSize() {
|
||||||
|
if (this.hasImage) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
this.size = this.$refs.avatar.getBoundingClientRect().width
|
||||||
|
} catch (err) {
|
||||||
|
// nothing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,13 +1,39 @@
|
|||||||
## Basic usage
|
## Basic usage
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<ds-avatar image="https://s3.amazonaws.com/uifaces/faces/twitter/lisovsky/128.jpg" />
|
<ds-avatar
|
||||||
|
name="Hans Alba"
|
||||||
|
image="https://s3.amazonaws.com/uifaces/faces/twitter/lisovsky/128.jpg" />
|
||||||
```
|
```
|
||||||
|
|
||||||
## Size
|
## Size
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<ds-avatar
|
<ds-avatar
|
||||||
|
name="Hans"
|
||||||
image="https://s3.amazonaws.com/uifaces/faces/twitter/lisovsky/128.jpg"
|
image="https://s3.amazonaws.com/uifaces/faces/twitter/lisovsky/128.jpg"
|
||||||
size="60px" />
|
size="60px" />
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Without Image
|
||||||
|
|
||||||
|
```html
|
||||||
|
<ds-avatar
|
||||||
|
name="Peter Sommerfield"
|
||||||
|
:image="null" />
|
||||||
|
```
|
||||||
|
|
||||||
|
## Broken Image
|
||||||
|
|
||||||
|
```html
|
||||||
|
<ds-avatar
|
||||||
|
name="Tim Hollofield"
|
||||||
|
image="http://not-valid-image-link##.org/image-does-not-exist.jpg" />
|
||||||
|
```
|
||||||
|
|
||||||
|
## Anonymus
|
||||||
|
|
||||||
|
```html
|
||||||
|
<ds-avatar
|
||||||
|
image="http://not-valid-image-link##.org/image-does-not-exist.jpg" />
|
||||||
|
```
|
||||||
|
|||||||
@ -0,0 +1,65 @@
|
|||||||
|
export default {
|
||||||
|
backgroundColors: [
|
||||||
|
'#295E87',
|
||||||
|
'#007D93',
|
||||||
|
'#933D86',
|
||||||
|
'#005093',
|
||||||
|
'#4A5580',
|
||||||
|
'#0067A5',
|
||||||
|
'#007D93',
|
||||||
|
'#007A70',
|
||||||
|
'#008F6D',
|
||||||
|
'#008255',
|
||||||
|
'#43913A',
|
||||||
|
'#C61A6A',
|
||||||
|
'#15A748',
|
||||||
|
'#007FBA',
|
||||||
|
'#008AC4',
|
||||||
|
'#E1B424',
|
||||||
|
'#00753C',
|
||||||
|
'#B42554',
|
||||||
|
'#4F3B68',
|
||||||
|
'#EB8B2D',
|
||||||
|
'#DC3E2A',
|
||||||
|
'#A7BE33',
|
||||||
|
'#DF542A',
|
||||||
|
'#00A3DA',
|
||||||
|
'#84BF41'
|
||||||
|
],
|
||||||
|
|
||||||
|
initials(name) {
|
||||||
|
let un = name || 'Anonymus'
|
||||||
|
let parts = un.split(/[ -]/)
|
||||||
|
let initials = ''
|
||||||
|
for (var i = 0; i < parts.length; i++) {
|
||||||
|
initials += parts[i].charAt(0)
|
||||||
|
}
|
||||||
|
if (initials.length > 3 && initials.search(/[A-Z]/) !== -1) {
|
||||||
|
initials = initials.replace(/[a-z]+/g, '')
|
||||||
|
}
|
||||||
|
initials = initials.substr(0, 3).toUpperCase()
|
||||||
|
return initials
|
||||||
|
},
|
||||||
|
randomBackgroundColor(seed, colors) {
|
||||||
|
return colors[seed % colors.length]
|
||||||
|
},
|
||||||
|
lightenColor(hex, amt) {
|
||||||
|
// From https://css-tricks.com/snippets/javascript/lighten-darken-color/
|
||||||
|
var usePound = false
|
||||||
|
if (hex[0] === '#') {
|
||||||
|
hex = hex.slice(1)
|
||||||
|
usePound = true
|
||||||
|
}
|
||||||
|
var num = parseInt(hex, 16)
|
||||||
|
var r = (num >> 16) + amt
|
||||||
|
if (r > 255) r = 255
|
||||||
|
else if (r < 0) r = 0
|
||||||
|
var b = ((num >> 8) & 0x00ff) + amt
|
||||||
|
if (b > 255) b = 255
|
||||||
|
else if (b < 0) b = 0
|
||||||
|
var g = (num & 0x0000ff) + amt
|
||||||
|
if (g > 255) g = 255
|
||||||
|
else if (g < 0) g = 0
|
||||||
|
return (usePound ? '#' : '') + (g | (b << 8) | (r << 16)).toString(16)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,9 +3,11 @@
|
|||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
padding-top: 0.1em;
|
||||||
margin-right: $space-xx-small;
|
margin-right: $space-xx-small;
|
||||||
min-height: 22px;
|
min-height: 22px;
|
||||||
min-width: 22px;
|
min-width: 22px;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
&::after {
|
&::after {
|
||||||
content: '';
|
content: '';
|
||||||
@ -26,4 +28,8 @@
|
|||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
object-position: center;
|
object-position: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ds-icon {
|
||||||
|
margin-top: -0.2em;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user