Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
174 changes: 94 additions & 80 deletions src/runtime/components/elements/Avatar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,102 +8,116 @@
</span>
</template>

<script setup lang="ts">
import { ref, computed, watch } from 'vue'
<script lang="ts">
import { defineComponent, ref, computed, watch } from 'vue'
import type { PropType } from 'vue'
import { defu } from 'defu'
import { classNames } from '../../utils'
import $appConfig from '#build/app.config'
import { useAppConfig } from '#imports'

const props = defineProps({
src: {
type: [String, Boolean],
default: null
},
alt: {
type: String,
default: null
},
text: {
type: String,
default: null
},
size: {
type: String,
default: 'md',
validator (value: string) {
return Object.keys($appConfig.ui.avatar.size).includes(value)
}
},
chipVariant: {
type: String,
default: null,
validator (value: string) {
return Object.keys($appConfig.ui.avatar.chip.variant).includes(value)
}
},
chipPosition: {
type: String,
default: 'top-right',
validator (value: string) {
return Object.keys($appConfig.ui.avatar.chip.position).includes(value)
const appConfig = useAppConfig()

export default defineComponent({
props: {
src: {
type: [String, Boolean],
default: null
},
alt: {
type: String,
default: null
},
text: {
type: String,
default: null
},
size: {
type: String,
default: 'md',
validator (value: string) {
return Object.keys(appConfig.ui.avatar.size).includes(value)
}
},
chipVariant: {
type: String,
default: null,
validator (value: string) {
return Object.keys(appConfig.ui.avatar.chip.variant).includes(value)
}
},
chipPosition: {
type: String,
default: 'top-right',
validator (value: string) {
return Object.keys(appConfig.ui.avatar.chip.position).includes(value)
}
},
ui: {
type: Object as PropType<Partial<typeof appConfig.ui.avatar>>,
default: () => appConfig.ui.avatar
}
},
ui: {
type: Object as PropType<Partial<typeof $appConfig.ui.avatar>>,
default: () => $appConfig.ui.avatar
}
})
setup (props) {
const ui = computed<Partial<typeof appConfig.ui.avatar>>(() => defu({}, props.ui, appConfig.ui.avatar))

const appConfig = useAppConfig()
const ui = computed<Partial<typeof appConfig.ui.avatar>>(() => defu({}, props.ui, appConfig.ui.avatar))
const wrapperClass = computed(() => {
return classNames(
ui.value.wrapper,
ui.value.background,
ui.value.rounded,
ui.value.size[props.size]
)
})

const wrapperClass = computed(() => {
return classNames(
ui.value.wrapper,
ui.value.background,
ui.value.rounded,
ui.value.size[props.size]
)
})
const avatarClass = computed(() => {
return classNames(
ui.value.rounded,
ui.value.size[props.size]
)
})

const avatarClass = computed(() => {
return classNames(
ui.value.rounded,
ui.value.size[props.size]
)
})
const chipClass = computed(() => {
return classNames(
ui.value.chip.base,
ui.value.chip.variant[props.chipVariant],
ui.value.chip.position[props.chipPosition],
ui.value.chip.size[props.size]
)
})

const chipClass = computed(() => {
return classNames(
ui.value.chip.base,
ui.value.chip.variant[props.chipVariant],
ui.value.chip.position[props.chipPosition],
ui.value.chip.size[props.size]
)
})
const url = computed(() => {
if (typeof props.src === 'boolean') {
return null
}
return props.src
})

const url = computed(() => {
if (typeof props.src === 'boolean') {
return null
}
return props.src
})
const placeholder = computed(() => {
return (props.alt || '').split(' ').map(word => word.charAt(0)).join('').substring(0, 2)
})

const placeholder = computed(() => {
return (props.alt || '').split(' ').map(word => word.charAt(0)).join('').substring(0, 2)
})
const error = ref(false)

const error = ref(false)
watch(() => props.src, () => {
if (error.value) {
error.value = false
}
})

watch(() => props.src, () => {
if (error.value) {
error.value = false
function onError () {
error.value = true
}

return {
wrapperClass,
avatarClass,
chipClass,
url,
placeholder,
error,
onError
}
}
})

function onError () {
error.value = true
}
</script>
11 changes: 5 additions & 6 deletions src/runtime/components/elements/AvatarGroup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,29 @@ import type { PropType } from 'vue'
import { defu } from 'defu'
import { classNames } from '../../utils'
import Avatar from './Avatar.vue'
import $appConfig from '#build/app.config'
import { defineNuxtComponent, useAppConfig } from '#imports'

const appConfig = useAppConfig()

export default defineNuxtComponent({
props: {
size: {
type: String,
default: null,
validator (value: string) {
return Object.keys($appConfig.ui.avatar.size).includes(value)
return Object.keys(appConfig.ui.avatar.size).includes(value)
}
},
max: {
type: Number,
default: null
},
ui: {
type: Object as PropType<Partial<typeof $appConfig.ui.avatarGroup>>,
default: () => $appConfig.ui.avatarGroup
type: Object as PropType<Partial<typeof appConfig.ui.avatarGroup>>,
default: () => appConfig.ui.avatarGroup
}
},
setup (props, { slots }) {
const appConfig = useAppConfig()

const ui = computed<Partial<typeof appConfig.ui.avatarGroup>>(() => defu({}, props.ui, appConfig.ui.avatarGroup))

const children = computed(() => {
Expand Down
75 changes: 41 additions & 34 deletions src/runtime/components/elements/Badge.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,49 +4,56 @@
</span>
</template>

<script setup lang="ts">
import { computed } from 'vue'
<script lang="ts">
import { computed, defineComponent } from 'vue'
import type { PropType } from 'vue'
import { defu } from 'defu'
import { classNames } from '../../utils'
import $appConfig from '#build/app.config'
import { useAppConfig } from '#imports'

const props = defineProps({
size: {
type: String,
default: 'md',
validator (value: string) {
return Object.keys($appConfig.ui.badge.size).includes(value)
const appConfig = useAppConfig()

export default defineComponent({
props: {
size: {
type: String,
default: 'md',
validator (value: string) {
return Object.keys(appConfig.ui.badge.size).includes(value)
}
},
variant: {
type: String,
default: 'primary',
validator (value: string) {
return Object.keys(appConfig.ui.badge.variant).includes(value)
}
},
label: {
type: String,
default: null
},
ui: {
type: Object as PropType<Partial<typeof appConfig.ui.badge>>,
default: () => appConfig.ui.badge
}
},
variant: {
type: String,
default: 'primary',
validator (value: string) {
return Object.keys($appConfig.ui.badge.variant).includes(value)
setup (props) {
const ui = computed<Partial<typeof appConfig.ui.badge>>(() => defu({}, props.ui, appConfig.ui.badge))

const badgeClass = computed(() => {
return classNames(
ui.value.base,
ui.value.rounded,
ui.value.size[props.size],
ui.value.variant[props.variant]
)
})

return {
badgeClass
}
},
label: {
type: String,
default: null
},
ui: {
type: Object as PropType<Partial<typeof $appConfig.ui.badge>>,
default: () => $appConfig.ui.badge
}
})

const appConfig = useAppConfig()

const ui = computed<Partial<typeof appConfig.ui.badge>>(() => defu({}, props.ui, appConfig.ui.badge))

const badgeClass = computed(() => {
return classNames(
ui.value.base,
ui.value.rounded,
ui.value.size[props.size],
ui.value.variant[props.variant]
)
})
</script>
Loading