# ZeenLink
Компонент ссылки
# Примеры:
Ссылки без иконок в дефолтной светлой теме
Ссылки без иконок в темной теме
Ссылки c иконками
Ссылки disabled
Ссылки кастомного цвета
# props
Название | Тип | Обязательный | По умолчанию | Описание |
---|---|---|---|---|
href | string | - | - | ссылка |
to | string или object | - | - | путь для router-link |
theme | string | - | light | доступны темы light и dark |
disabled | boolean | - | - | если true, то ссылке добавляется класс с модификатором disabled |
color | object | - | {} | объект с кастомными цветами (подробнее см.ниже) |
# Кастомные цвета в объекте color
Название | Тип | Обязательный | По умолчанию |
---|---|---|---|
linkLightColor | цвет ссылки и иконок в теме light | - | берет значение из темы ($link-light-color) |
linkLightHoverColor | цвет ссылки и иконок при ховере в теме light | - | берет значение из темы ($link-light-hover-color) |
linkLightClickColor | цвет ссылки и иконок при active в теме light | - | берет значение из темы ($link-light-click-color) |
linkDarkColor | цвет ссылки и иконок в теме dark | - | берет значение из темы ($link-dark-color) |
linkDarkHoverColor | цвет ссылки и иконок при ховере в теме dark | - | берет значение из темы ($link-dark-hover-color) |
linkDarkClickColor | цвет ссылки и иконок при active в теме dark | - | берет значение из темы ($link-dark-click-color) |
linkDisabledColor | цвет ссылки и иконок для состояния disabled | - | берет значение из темы ($link-disabled-color) |
# Иконки
Компонент имеет 2 именованных слота для иконок - rightIcon и leftIcon.
# Source Code - исходный код компонента
<template>
<component
:is="getElement"
:id="`zeen-link-${componentId}`"
class="zeen-link"
:class="{
[`zeen-link_them-${theme}`]: theme,
'zeen-link_disabled': disabled,
}"
:href="href"
:to="to"
v-on="$listeners"
v-bind="$attrs"
>
<slot name="leftIcon"></slot>
<slot></slot>
<slot name="rightIcon"></slot>
</component>
</template>
<script>
export default {
name: 'ZeenLink',
props: {
href: {
type: String,
default: null,
},
to: {
validator: (prop) => typeof prop === 'object' || typeof prop === 'string',
default: null,
},
theme: {
type: String,
default: 'light',
validator: (theme) => ['light', 'dark'].includes(theme),
},
disabled: {
type: Boolean,
required: false,
},
// необходимо для поддержки накста - в нем свой роутер линк
element: String,
},
computed: {
componentId() {
return this._uid
},
getElement() {
if (this.element) {
return this.element
}
if (this.to) {
return 'router-link'
} else {
return 'a'
}
},
isDarkTheme() {
return this.theme === 'dark'
},
},
}
</script>
<style lang="scss">
:root {
/* Размеры */
--link-size: var(--main-text-size, 16px);
/* Цвета */
--link-color: var(--main-color);
--link-hover-color: var(--main-hover-color);
--link-active-color: var(--main-active-color);
--link-disabled-color: var(--gray-2);
--link-dark-base-color: var(--main-light);
--link-dark-base-hover-color: var(--gray-1);
--link-dark-base-active-color: var(--gray-3);
--link-dark-base-disabled-color: var(--gray-1);
}
</style>
<style lang="scss" scoped>
.zeen-link {
--link-dark-color: var(--link-dark-base-color);
--link-dark-hover-color: var(--link-dark-base-hover-color);
--link-dark-active-color: var(--link-dark-base-active-color);
--link-dark-disabled-color: var(--link-dark-base-disabled-color);
&_them-dark {
--link-color: var(--link-dark-color);
--link-hover-color: var(--link-dark-hover-color);
--link-active-color: var(--link-dark-active-color);
--link-disabled-color: var(--link-dark-disabled-color);
}
position: relative;
justify-content: center;
align-items: center;
font-weight: 600;
font-size: var(--link-size);
line-height: 1.2;
text-align: center;
cursor: pointer;
transition: color 0.25s ease;
text-decoration: none;
font-family: inherit;
color: var(--link-color);
&,
&:focus,
&:visited {
text-decoration: none;
}
&:hover {
--link-color: var(--link-hover-color);
text-decoration: none;
}
&:active {
--link-color: var(--link-active-color);
text-decoration: none;
}
&_disabled {
--link-color: var(--link-disabled-color);
cursor: not-allowed;
pointer-events: none;
}
svg {
fill: currentColor;
}
}
</style>