mediacube-ui-v2 0.0.15 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue-ClUN1lBG.js","sources":["../src/components/elements/McAvatar/McAvatar.vue","../src/components/elements/McBadge/McBadge.vue","../src/components/elements/McBottomLoader/McBottomLoader.vue","../src/components/elements/McSvgIcon/McSvgIcon.vue","../src/components/elements/McButton/McButton.vue","../src/components/elements/McChip/McChip.vue","../src/components/templates/McModal/McModalContainer.vue","../src/components/templates/McDrawer/McDrawer.vue","../src/components/templates/McDrawer/McDrawerContainer.vue","../src/components/elements/McTitle/McTitle.vue","../src/components/elements/McDatepicker/McDatepicker.vue","../src/components/patterns/McPreview/McPreview.vue","../src/components/elements/McDraggable/McDraggable.vue","../src/components/elements/McFieldCheckbox/McFieldCheckbox.vue","../src/components/elements/McFieldRadio/McFieldRadio.vue","../src/components/elements/McFieldRadioGroup/McFieldRadioGroup.vue","../src/components/elements/McFieldRange/McFieldRange.vue","../src/components/elements/McTooltip/McTooltip.vue","../src/components/elements/McFieldSelect/McFieldSelect.vue","../src/components/elements/McFieldText/McFieldText.vue","../src/components/elements/McFieldToggle/McFieldToggle.vue","../src/components/elements/McInfinityLoadingTrigger/McInfinityLoadingTrigger.vue","../src/components/elements/McNodata/McNoData.vue","../src/components/elements/McNotification/McNotification.vue","../src/components/elements/McProgress/McProgress.vue","../src/components/elements/McSeparator/McSeparator.vue","../src/components/elements/McSlideUpDown/McSlideUpDown.vue","../src/components/elements/McStack/McStack.vue","../src/components/patterns/McAccordion/McAccordion.vue","../src/components/patterns/McCell/McCell.vue","../src/components/patterns/McCollapse/McCollapse.vue","../src/components/patterns/McDropdown/McDropdownPanel.vue","../src/components/patterns/McDropdown/McDropdown.vue","../src/components/patterns/McGridRow/McGridRow.vue","../src/components/patterns/McGridCol/McGridCol.vue","../src/components/patterns/McFilter/McFilterChip/McFilterChip.vue","../src/components/patterns/McFilter/McFilterTags/McFilterTags.vue","../src/components/patterns/McFilter/McFilterTypeRange/McFilterTypeRange.vue","../src/components/patterns/McFilter/McFilterTypeDate/McFilterTypeDate.vue","../src/components/patterns/McFilter/McFilterTypeText/McFilterTypeText.vue","../src/components/patterns/McFilter/McFilterTypeRelation/McFilterTypeRelation.vue","../src/components/patterns/McFilter/McFilter.vue","../src/components/patterns/McOverlay/McOverlay.vue","../src/components/patterns/McSideBar/McSideBarTop/McSideBarTop.vue","../src/components/patterns/McSideBar/McSideBarButton/McSideBarButton.vue","../src/components/patterns/McSideBar/McSideBarCenter/McSideBarCenter.vue","../src/components/patterns/McSideBar/McSideBarBottom/McSideBarBottom.vue","../src/components/patterns/McSideBar/McSideBar.vue","../src/components/patterns/McTab/McTab.vue","../src/components/patterns/McWrapScroll/McWrapScroll.vue","../src/components/patterns/McTabs/McTabs.vue","../src/components/templates/McDrawer/McDrawerContentTemplate/McDrawerContentTemplate.vue","../src/components/templates/McModal/McModal.vue","../src/components/templates/McTable/McTableSort/McTableSort.vue","../src/components/templates/McTable/McTableSkeletonLoading/McTableSkeletonLoading.vue","../src/components/templates/McTable/McTable/McTable.vue","../src/components/templates/McTable/McTableCard/McTableCardHeader/McTableCardHeader.vue","../src/components/templates/McTable/McTableCard/McTableCard.vue","../src/components/templates/McTopBar/McTopBar.vue","../src/components/templates/McVirtualScroll/McVirtualScroll.vue"],"sourcesContent":["<script setup lang=\"ts\">\n//@ts-ignore\nimport defaultImage from '../../../assets/img/no_user.png'\nimport { computed, ref, watch } from 'vue'\nimport { AvatarSizes, type AvatarSizeTypes } from '@/types/styles/AvatarSizes'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport { Sizes } from '@/types/styles/Sizes'\nimport { Radiuses } from '@/types'\n\nconst props = defineProps({\n /**\n * Путь до изображения\n *\n */\n src: {\n type: String,\n default: defaultImage\n },\n /**\n * Отложенная подгрузка\n *\n */\n lazy: {\n type: Boolean,\n default: false\n },\n /**\n * Атрибут alt\n */\n alt: {\n type: String,\n default: ''\n },\n /**\n * Размеры\n */\n size: {\n type: String as () => AvatarSizeTypes,\n default: '300'\n },\n /**\n * Круглый\n *\n */\n rounded: {\n type: Boolean,\n default: false\n },\n /**\n * Цвет рамки\n *\n */\n borderColor: {\n type: String as () => ColorTypes,\n default: ''\n },\n /**\n * Цвет точки\n *\n */\n dotColor: {\n type: String as () => ColorTypes,\n default: ''\n },\n /**\n * Цвет точки\n *\n */\n shadow: {\n type: Boolean,\n default: false\n },\n /**\n * Перетаскивание изображения\n *\n */\n draggable: {\n type: Boolean,\n default: true\n }\n})\n\nconst style = ref<{ [key: string]: string }>({})\nconst wrapperStyle = ref<{ [key: string]: string }>({})\nconst hasStatus = computed((): boolean => !!props.borderColor || !!props.dotColor)\n\nconst classes = computed((): { [key: string]: boolean } => ({\n 'mc-avatar': true,\n 'mc-avatar--rounded': props.rounded,\n 'mc-avatar--bordered': !!props.borderColor,\n 'mc-avatar--shadow': props.shadow && !hasStatus.value,\n [`mc-avatar--size-${props.size}`]: !!props.size\n}))\n\nconst wrapperClasses = computed((): { [key: string]: boolean } => {\n return {\n 'mc-avatar__wrapper': true,\n 'mc-avatar__wrapper-status--shadow': !!props.shadow,\n [`mc-avatar__wrapper-status--size-${props.size}`]: !!props.size,\n 'mc-avatar__wrapper--has-dot': !!props.dotColor\n }\n})\n\nwatch(\n () => props.dotColor,\n () => {\n if (hasStatus.value) {\n if (props.dotColor) wrapperStyle.value['--mc-avatar-dot-color'] = Colors[props.dotColor]\n }\n },\n { immediate: true }\n)\n\nwatch(\n () => props.borderColor,\n () => {\n if (hasStatus.value) {\n if (props.borderColor) style.value['--mc-avatar-border-color'] = Colors[props.borderColor]\n }\n },\n { immediate: true }\n)\n\nwatch(\n () => props.size,\n () => {\n if (props.size) {\n style.value['--mc-avatar-avatar-size'] = AvatarSizes[props.size]\n if (+props.size < 500) {\n wrapperStyle.value['--mc-avatar-dot-size'] = Sizes['100']\n style.value['--mc-avatar-avatar-radius'] = Radiuses['50']\n }\n switch (+props.size) {\n case 500:\n case 600: {\n wrapperStyle.value['--mc-avatar-dot-size'] = Sizes['150']\n break\n }\n case 700:\n case 800:\n case 900:\n case 1000: {\n wrapperStyle.value['--mc-avatar-dot-size'] = Sizes['200']\n wrapperStyle.value['--mc-avatar-dot-border-width'] = '2px'\n break\n }\n }\n }\n },\n { immediate: true }\n)\nconst handleOnError = (e: Event): void => {\n if (!e.target) return\n //@ts-ignore\n e.target.src = defaultImage\n}\n</script>\n\n<template>\n <div :class=\"wrapperClasses\" :style=\"wrapperStyle\">\n <div :class=\"classes\" :style=\"style\">\n <img\n :src=\"props.src || defaultImage\"\n :alt=\"props.alt\"\n :draggable=\"props.draggable\"\n :lazy=\"props.lazy\"\n class=\"mc-avatar__img\"\n @onerror=\"handleOnError\"\n />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/durations' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/border-radius' as *;\n$color-borders: $token-colors;\n$dot-colors: $token-colors;\n\n.mc-avatar {\n $avatar-name: &;\n --mc-avatar-avatar-size: #{$size-300};\n --mc-avatar-border-color: initial;\n @include reset();\n position: relative;\n display: inline-block;\n width: var(--mc-avatar-avatar-size);\n height: var(--mc-avatar-avatar-size);\n min-width: var(--mc-avatar-avatar-size);\n border-radius: $radius-100;\n border: var(--mc-avatar-dot-border-width) solid $color-white;\n overflow: hidden;\n background-color: $color-hover-gray;\n transition: box-shadow $duration-s;\n &--bordered {\n border: 2px solid var(--mc-avatar-border-color);\n }\n &__img {\n width: 100%;\n height: 100%;\n }\n &--rounded {\n border-radius: $radius-circle;\n }\n\n &--shadow {\n &:hover,\n &:focus {\n box-shadow: 0 0 0 $space-100 $color-hover-gray;\n }\n }\n\n &:hover,\n &:focus {\n .mc-avatar {\n box-shadow: none;\n }\n }\n\n &--shadow {\n &:hover,\n &:focus {\n background-color: $color-hover-gray;\n box-shadow: 0 0 0 $space-50 $color-hover-gray;\n }\n }\n &__wrapper {\n --mc-avatar-dot-border-width: 1px;\n --mc-avatar-dot-size: #{$space-100};\n position: relative;\n width: max-content;\n height: max-content;\n border: none !important;\n &--has-dot {\n &::after {\n width: var(--mc-avatar-dot-size);\n height: var(--mc-avatar-dot-size);\n @include pseudo();\n left: 0;\n bottom: 0;\n background-color: var(--mc-avatar-dot-color);\n z-index: 2;\n border-radius: 50%;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport { computed } from 'vue'\n\ninterface ISetProperty {\n property?: string | undefined\n value?: string | undefined\n newColor?: ColorTypes\n}\n\nconst props = defineProps({\n /**\n * Дизайн:\n * `purple, purple-outline т.д.`\n */\n variation: {\n type: String as () => ColorTypes,\n default: 'purple'\n },\n /**\n * Вертикальная черта (в таблице, к примеру)\n */\n verticalLine: {\n type: Boolean,\n default: false\n },\n modern: {\n type: Boolean,\n default: false\n }\n})\n\nconst classes = computed((): { [key: string]: boolean } => ({\n 'mc-badge': true,\n 'mc-badge--vertical-line': props.verticalLine,\n 'mc-badge--modern': props.modern\n}))\n\nconst rootStyles = computed((): { [key: string]: string } => {\n const variation = `${props.variation}${props.modern ? '-modern' : ''}` as ColorTypes\n\n let style = {} as { [key: string]: string }\n const texts = variation.split('-')\n const currentStyle: string = texts[texts.length - 1]\n const color = (props.variation ? variation.replace(`-${currentStyle}`, '') : variation) as ColorTypes\n const setProperty = ({ property = '--mc-badge-color', value, newColor = color }: ISetProperty = {}) => {\n style[property] = value || newColor && Colors[newColor]\n }\n\n switch (currentStyle) {\n case 'outline': {\n setProperty()\n setProperty({ property: '--mc-badge-border-color' })\n setProperty({ property: '--mc-badge-background-color', newColor: 'white' as ColorTypes })\n setProperty({ property: '--mc-badge-background-opacity', value: '0.4' })\n break\n }\n case 'invert':\n case 'modern': {\n setProperty()\n setProperty({ property: '--mc-badge-background-color' })\n setProperty({ property: '--mc-badge-background-opacity', value: '0.1' })\n break\n }\n default: {\n const lightColors = [\n 'hover-gray',\n 'white',\n 'lighter-blue',\n 'lighter-purple',\n 'toxic',\n 'transparent'\n ] as ColorTypes[]\n lightColors.includes(variation) && setProperty({ newColor: 'black' })\n setProperty({ property: '--mc-badge-background-color', newColor: variation as ColorTypes })\n break\n }\n }\n return style\n})\n</script>\n\n<template>\n <div :class=\"classes\" :style=\"rootStyles\" v-bind=\"$attrs\">\n <div class=\"mc-badge__text\">\n <slot />\n </div>\n <div class=\"mc-badge__background\"></div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/letter-spacings' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/font-weights' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/border-radius' as *;\n.mc-badge {\n $block-name: &;\n --mc-badge-color: #{$color-white};\n --mc-badge-background-color: inherit;\n --mc-badge-background-opacity: initial;\n --mc-badge-border-color: #{$color-transparent};\n @include ellipsis(100%, inline-flex);\n align-items: center;\n color: var(--mc-badge-color);\n position: relative;\n font-family: $font-family-main;\n font-size: $font-size-100;\n line-height: $line-height-150;\n height: $line-height-200;\n font-weight: $font-weight-medium;\n text-transform: uppercase;\n letter-spacing: $letter-spacing-m;\n vertical-align: middle;\n padding: 2px $space-100;\n border-radius: $radius-50;\n &:before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n @include size(100%);\n background-color: var(--mc-badge-background-color);\n opacity: var(--mc-badge-background-opacity);\n border: 1px solid var(--mc-badge-border-color);\n border-radius: inherit;\n }\n &__text {\n z-index: 1;\n }\n &--modern {\n border-radius: $radius-50;\n }\n &--vertical-line {\n padding: 0;\n border-radius: 0;\n width: 5px;\n #{$block-name} {\n &__text {\n display: none;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nconst props = defineProps({\n center: {\n type: Boolean,\n default: false\n }\n})\n\nconst classes = computed(() => {\n return {\n 'mc-bottom-loader': true,\n 'mc-bottom-loader--center': props.center\n }\n})\n</script>\n\n<template>\n <section :class=\"classes\">\n <section class=\"mc-bottom-loader__spinner\"></section>\n </section>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/z-indexes' as *;\n.mc-bottom-loader {\n position: sticky;\n bottom: 0;\n width: 100%;\n height: 1px;\n background-color: transparent;\n z-index: $z-index-overlay;\n &::before {\n @include pseudo();\n position: absolute;\n top: auto;\n bottom: 0;\n left: 0;\n width: 100%;\n height: $space-700;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(to top, $color-bg-gray, rgba($color-bg-gray, 0));\n z-index: 11;\n }\n &__spinner {\n position: absolute;\n top: auto;\n bottom: calc(#{$space-350} - calc(#{$space-400} / 2));\n left: calc(50% - #{$space-200});\n transform: translateX(-50%);\n display: block;\n width: $space-300;\n height: $space-300;\n border: 2px solid $color-purple;\n border-left-color: transparent;\n border-radius: 50%;\n animation: rotate 1.5s infinite linear;\n z-index: $z-index-overlay;\n @keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n }\n\n &--center {\n top: calc(50% - #{$space-200});\n }\n}\n</style>\n","<script setup lang=\"ts\">\n//@ts-ignore\nimport iconsSpriteIcon from '../../../assets/iconsSprite.svg'\nimport { Sizes, type SizeTypes } from '@/types/styles/Sizes'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport { computed, type PropType } from 'vue'\nimport type { DirectionsUnion } from '@/types/IDirections'\nimport { type IconsListUnion } from '@/types/styles/Icons'\nimport { Directions } from '@/enums/ui/Directions'\n\nconst props = defineProps({\n /**\n * Путь к спрайту с иконками\n * */\n spritePath: {\n type: String,\n default: iconsSpriteIcon,\n validator(value: string): boolean {\n return !!value\n }\n },\n /**\n * Имя иконки\n */\n name: {\n type: String as () => IconsListUnion,\n required: true,\n },\n /**\n * Цвет иконки\n * (по токенам)\n */\n color: {\n type: String as () => ColorTypes,\n default: '',\n },\n /**\n * Размер\n */\n size: {\n type: String as () => SizeTypes,\n default: '250',\n },\n /**\n * Толщина линий 0-5 если нужно больше, нужно дописать список в стилях\n * stroke-width\n */\n weight: {\n type: Number as PropType<number>,\n default: 1.5,\n },\n /**\n * Отображение иконки,\n * если не найдена по имени\n * в 'name'\n */\n defaultName: {\n type: String as PropType<string>,\n default: '',\n },\n dir: {\n type: String as () => DirectionsUnion,\n default: Directions.Ltr,\n },\n})\n\nconst classes = computed((): { [key: string]: boolean } => ({\n 'mc-svg-icon': true,\n [`mc-svg-icon--dir-${props.dir}`]: !!props.dir,\n}))\n\nconst styles = computed((): { [key: string]: string } => ({\n ['--mc-svg-icon-size']: Sizes[props.size],\n ['--mc-svg-icon-weight']: String(props.weight)\n ?.replace('.', '')\n ?.split('')\n ?.join('.'),\n ['--mc-svg-icon-color']: props.color && Colors[props.color],\n}))\n</script>\n\n<template>\n <svg :class=\"classes\" :style=\"styles\">\n <use :xlink:href=\"`${props.spritePath}#${props.name}`\"></use>\n </svg>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/sizes' as *;\n.mc-svg-icon {\n --mc-svg-icon-size: #{$size-250};\n --mc-svg-icon-weight: 1.5;\n --mc-svg-icon-color: initial;\n @include reset();\n @include reset-text-indents();\n\n @include size(inherit);\n width: var(--mc-svg-icon-size);\n height: var(--mc-svg-icon-size);\n min-width: var(--mc-svg-icon-size);\n min-height: var(--mc-svg-icon-size);\n stroke-width: var(--mc-svg-icon-weight);\n color: var(--mc-svg-icon-color);\n use {\n stroke-width: var(--mc-svg-icon-weight);\n }\n &--dir {\n &-rtl {\n transform: scale(-1, 1);\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type PropType, ref } from 'vue'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport { FontWeights } from '@/types/styles/FontWeights'\nimport { useTooltip } from '@/composables/useTooltip'\nimport type { ITooltip, TooltipPositionsUnion } from '@/types/ITooltip'\nimport type { ButtonVariationUnion, IButtonStyleOptions } from '@/types/IButton'\nimport { TooltipPositions, TooltipSizes } from '@/enums/Tooltip'\nimport McSvgIcon from '../McSvgIcon/McSvgIcon.vue'\nimport type { ButtonSizeUnion, ButtonTypeUnion } from '@/types/IButton'\nimport type { HorizontalAlignmentUnion } from '@/types/styles/Alignment'\nimport type { WeightsUnion } from '@/types/styles/Weights'\nimport type { ColorsUnion } from '@/types/styles/Colors'\nimport type { FontWeightsUnion } from '@/types/styles/FontWeights'\nimport { ButtonModifiers } from '@/enums'\n\ninterface ElButtonTagBind {\n to?: string | null\n href?: string | null\n disabled: boolean\n rel: string\n type: ButtonTypeUnion\n tabindex: number | string | undefined | null\n}\n\nconst vTooltip = useTooltip()\n\nconst buttonTooltip = computed((): ITooltip => {\n let payload = {} as ITooltip\n if (props.tooltip) {\n payload = {\n content: props.tooltip,\n size: TooltipSizes.M,\n placement: props.tooltipPlacement || TooltipPositions.Top,\n }\n }\n return payload\n})\n\nconst props = defineProps({\n /**\n * Если нужна ссылка внутри приложения:\n */\n to: {\n type: String as PropType<string>,\n },\n /**\n * Если нужна обычная ссылка:\n * `https://mediacube.agency/`\n */\n href: {\n type: String as PropType<string>,\n },\n /**\n * По умолчанию ожидается использование в `Nuxt`\n *\n */\n nuxt: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Отключенное состояние\n *\n */\n disabled: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Дизэйблить не меняя внешнего вида\n *\n */\n inactive: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Индикация загрузки\n *\n */\n loading: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Индикация загрузки\n * вращением иконки\n */\n iconLoading: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Типы:\n * `button, submit, reset`\n */\n type: {\n type: String as () => ButtonTypeUnion,\n default: null\n },\n /**\n * Дизайн:\n * `purple, red, purple-outline, purple-invert, purple-flat и т.д.`\n */\n variation: {\n type: String as () => ButtonVariationUnion,\n default: 'purple'\n },\n /**\n * Размеры:\n * `xs, xs-compact, s, s-compact, m, m-compact, l, l-compact`\n */\n size: {\n type: String as () => ButtonSizeUnion,\n default: 'm'\n },\n /**\n * Тень\n *\n */\n shadow: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Круглая (применимо для *-compact size)\n *\n */\n rounded: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Закругленная\n *\n */\n semiRounded: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Позиция текста внутри кнопки:\n * `left, center, right`\n */\n textAlign: {\n type: String as () => HorizontalAlignmentUnion,\n default: 'center'\n },\n /**\n * На всю ширину\n *\n */\n fullWidth: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Если нужно активное состояние\n *\n */\n isActive: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * exact\n *\n */\n exact: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Заглавные буквы\n */\n uppercase: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Тег по умолчанию\n */\n defaultTag: {\n type: String as PropType<string>,\n default: 'button'\n },\n /**\n * Если нужен другой цвет при взаимодействии\n */\n secondaryColor: {\n type: String as () => ColorTypes,\n default: null\n },\n /**\n * Если нужна подчёркнутая ссылка\n */\n underlineLink: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Если нужен постоянный\n * фон у типа 'flat'\n */\n bgFlat: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Жирность шрифта:\n * `normal, medium, semi-bold`\n */\n weight: {\n type: String as () => WeightsUnion,\n default: 'semi-bold'\n },\n /**\n * Тултип при наличии\n */\n tooltip: {\n type: String as PropType<string>,\n default: null\n },\n tooltipPlacement: {\n type: String as () => TooltipPositionsUnion,\n default: null,\n },\n\n /**\n * Атрибут tabindex для главного элемента\n *\n */\n tabindex: {\n type: [String, Number]\n }\n})\n\nconst mcButton = ref(null)\nconst emit = defineEmits(['blur', 'click'])\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n [`mc-button--variation-${props.variation}`]: !!props.variation,\n [`mc-button--size-${props.size}`]: !!props.size,\n [`mc-button--text-align-${props.textAlign}`]: !!props.textAlign,\n 'mc-button--loading': !!props.loading,\n 'mc-button--icon-loading': !!props.iconLoading,\n 'mc-button--is-active': !!props.isActive,\n 'mc-button--disabled': !!props.disabled,\n 'mc-button--rounded': props.rounded && /-compact$/.test(props.size),\n 'mc-button--semi-rounded': !!props.semiRounded,\n 'mc-button--full-width': !!props.fullWidth,\n 'mc-button--uppercase': !!props.uppercase,\n 'mc-button--shadow': !!props.shadow,\n 'mc-button--secondary-color': !!props.secondaryColor,\n 'mc-button--underline-link': !!props.underlineLink,\n 'mc-button--bg-flat': !!props.bgFlat,\n [`mc-button--type-${buttonVariation.value.type}`]: !!buttonVariation.value.type,\n 'mc-button--inactive': !!props.inactive\n }\n})\n\nconst buttonVariation = computed((): IButtonStyleOptions => {\n const variation = props.variation\n const texts = variation.split('-')\n const currentStyle = texts[texts.length - 1]\n let color = variation.replace(`-${currentStyle}`, '')\n switch (currentStyle) {\n case ButtonModifiers.Link:\n case ButtonModifiers.Flat:\n case ButtonModifiers.Outline:\n case ButtonModifiers.Invert: {\n break\n }\n default: {\n color = variation\n break\n }\n }\n return {\n color: color as ColorTypes,\n type: currentStyle\n }\n})\n\nconst styles = computed((): { [key: string]: ColorsUnion | FontWeightsUnion | string | undefined } => {\n let hoverBrightness: string | undefined\n let textColor: ColorTypes | undefined\n switch (buttonVariation.value.type) {\n case ButtonModifiers.Link:\n case ButtonModifiers.Flat:\n case ButtonModifiers.Outline:\n case ButtonModifiers.Invert: {\n break\n }\n default: {\n switch (buttonVariation.value.color) {\n case 'yellow':\n case 'white': {\n hoverBrightness = '0.9'\n break\n }\n case 'toxic': {\n break\n }\n default: {\n textColor = 'white' as ColorTypes\n }\n }\n break\n }\n }\n\n return {\n '--mc-button-secondary-color': props.secondaryColor && Colors[props.secondaryColor],\n '--mc-button-background-color':\n props.variation && Colors[buttonVariation.value.color as ColorTypes],\n '--mc-button-font-weight': props.weight && FontWeights[props.weight],\n '--mc-button-hover-brightness': hoverBrightness,\n '--mc-button-text-color': textColor && Colors[textColor]\n }\n})\n\nconst tag = computed((): string => {\n if (props.to) {\n return props.nuxt ? 'nuxt-link' : 'router-link'\n } else if (props.href) {\n return 'a'\n }\n return props.defaultTag\n})\n\nconst isVariationLink = computed((): boolean => {\n return buttonVariation.value.type === ButtonModifiers.Link\n})\n\nconst tagBind = computed((): ElButtonTagBind => {\n let result:ElButtonTagBind = {\n to: props.to,\n href: props.href,\n disabled: false,\n rel: '',\n type: props.type,\n tabindex: props.tabindex\n }\n\n if (props.to) {\n delete result.href\n } else if (props.href) {\n delete result.to\n } else if (props.disabled || props.loading) {\n result.disabled = true\n }\n\n if (isVariationLink.value) result.rel = 'noreferrer'\n\n return result\n})\n\nconst handleBlur = (e: Event): void => {\n emit('blur', e)\n}\nconst handleClick = (e: Event): void => {\n emit('click', e)\n}\n</script>\n\n<template>\n <component\n v-tooltip=\"buttonTooltip\"\n :is=\"tag\"\n :ref=\"mcButton\"\n v-bind=\"{ ...tagBind }\"\n class=\"mc-button\"\n :class=\"classes\"\n :exact=\"exact\"\n :style=\"styles\"\n @blur=\"handleBlur\"\n @click=\"handleClick\"\n >\n <span v-if=\"$slots['icon-prepend']\" class=\"mc-button__prepend\">\n <!-- @slot Слот для вставки в начало -->\n <slot name=\"icon-prepend\" />\n </span>\n <span v-if=\"loading\" class=\"mc-button__loader\">\n <mc-svg-icon class=\"mc-button__loader-icon\" type=\"div\" name=\"loader\" />\n </span>\n <span v-if=\"$slots.default\" class=\"mc-button__text\">\n <!-- @slot Слот по умолчанию -->\n <slot />\n </span>\n <span v-if=\"$slots['icon-append']\" class=\"mc-button__append\">\n <!-- @slot Слот для вставки в конец -->\n <slot name=\"icon-append\" />\n </span>\n <div v-if=\"!isVariationLink\" class=\"mc-button__background\" />\n </component>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/styles/tooltip' as *;\n@use '../../../assets/tokens/durations' as *;\n@use '../../../assets/tokens/opacities' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/letter-spacings' as *;\n@use '../../../assets/tokens/animations' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/font-weights' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/media-queries' as *;\n@use '../../../assets/tokens/border-radius' as *;\n\n.mc-button {\n $block-name: &;\n @include reset();\n --mc-button-background-color: #{$color-transparent};\n --mc-button-font-weight: #{$font-weight-normal};\n --mc-button-text-color: #{$color-black};\n --mc-button-hover-brightness: 0.9;\n --mc-button-secondary-color: initial;\n position: relative;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n border: none;\n flex-wrap: nowrap;\n max-width: 100%;\n font-family: $font-family-main;\n border-radius: $radius-100;\n white-space: nowrap;\n user-select: none;\n text-decoration: none;\n text-transform: none;\n background: none;\n cursor: pointer;\n outline: 0;\n transition: all $duration-s;\n font-weight: var(--mc-button-font-weight);\n color: var(--mc-button-text-color);\n -webkit-appearance: none;\n -webkit-text-fill-color: currentColor;\n z-index: 0;\n\n &__loader {\n display: none;\n line-height: 0;\n @include align(true, true, absolute);\n top: unset;\n left: unset;\n transform: unset;\n z-index: 1;\n &-icon {\n animation: $animation-spinner;\n }\n }\n &__prepend,\n &__append {\n display: inline-flex;\n align-items: center;\n z-index: 1;\n }\n\n &__text {\n @include ellipsis($display: inline-block);\n @include layout-flex-fix();\n z-index: 1;\n &:empty {\n display: none;\n }\n }\n @mixin hoverMixin {\n @media #{$media-desktop} {\n &:hover {\n #{$block-name}__background {\n @content;\n }\n }\n }\n\n &:active {\n #{$block-name}__background {\n @content;\n }\n }\n }\n @include hoverMixin {\n filter: brightness(var(--mc-button-hover-brightness));\n }\n\n &--size {\n &-xxs {\n height: $size-300;\n padding: 0 $space-100;\n letter-spacing: normal;\n font-size: $font-size-200;\n line-height: $line-height-200;\n\n &-compact {\n @include size($size-300);\n padding: $space-50;\n .mc-svg-icon {\n @include size($size-200);\n }\n }\n .mc-svg-icon {\n @include size($size-200);\n }\n\n #{$block-name} {\n &__prepend {\n margin-inline-end: $space-50;\n }\n &__append {\n margin-inline-start: $space-50;\n }\n }\n }\n &-xs {\n height: $size-400;\n padding: 0 $space-150;\n letter-spacing: normal;\n font-size: $font-size-200;\n line-height: $line-height-200;\n\n &-compact {\n @include size($size-400);\n padding: 6px;\n .mc-svg-icon {\n @include size($size-250);\n }\n }\n .mc-svg-icon {\n @include size($size-250);\n }\n\n #{$block-name} {\n &__prepend {\n margin-inline-end: $space-50;\n }\n &__append {\n margin-inline-start: $space-50;\n }\n }\n }\n &-s {\n height: $size-500;\n padding: 0 $space-200;\n letter-spacing: normal;\n font-size: $font-size-200;\n line-height: $line-height-200;\n\n &-compact {\n @include size($size-500);\n padding: $space-150;\n .mc-svg-icon {\n @include size($size-250);\n }\n }\n .mc-svg-icon {\n @include size($size-250);\n }\n\n #{$block-name} {\n &__prepend {\n margin-inline-end: $space-50;\n }\n &__append {\n margin-inline-start: $space-50;\n }\n }\n }\n &-m {\n height: $size-500;\n padding: 0 $space-200;\n font-size: $font-size-200;\n line-height: $line-height-200;\n\n &-compact {\n @include size($size-500);\n padding: $space-100;\n .mc-svg-icon {\n @include size($size-300);\n }\n }\n .mc-svg-icon {\n @include size($size-300);\n }\n\n #{$block-name} {\n &__prepend {\n margin-inline-end: $space-50;\n }\n &__append {\n margin-inline-start: $space-50;\n }\n }\n }\n &-l {\n height: $size-600;\n padding: $space-150 $space-300;\n font-size: $font-size-200;\n line-height: $line-height-200;\n\n &-compact {\n @include size($size-600);\n padding: $space-150;\n .mc-svg-icon {\n @include size($size-300);\n }\n }\n .mc-svg-icon {\n @include size($size-300);\n }\n\n #{$block-name} {\n &__prepend {\n margin-inline-end: $space-100;\n }\n &__append {\n margin-inline-start: $space-100;\n }\n }\n }\n\n &-s,\n &-m,\n &-l {\n &-compact {\n #{$block-name} {\n &__prepend,\n &__append {\n margin: 0 !important;\n }\n }\n }\n }\n }\n\n &__background {\n position: absolute;\n top: 0;\n left: 0;\n @include size(100%);\n max-height: -webkit-fill-available;\n max-width: -webkit-fill-available;\n opacity: 1 !important;\n border: 1px solid $color-transparent;\n border-radius: inherit;\n background-color: var(--mc-button-background-color);\n transition: all $duration-s;\n }\n &--type {\n &-outline {\n color: var(--mc-button-background-color);\n #{$block-name}__background {\n opacity: 0.6 !important;\n background-color: $color-transparent;\n border-color: var(--mc-button-background-color);\n }\n @media #{$media-desktop} {\n &:hover {\n #{$block-name}__background {\n background-color: var(--mc-button-background-color);\n opacity: 0.2 !important;\n }\n }\n &:active {\n #{$block-name}__background {\n background-color: var(--mc-button-background-color);\n border: none;\n }\n }\n }\n }\n &-invert {\n color: var(--mc-button-background-color);\n #{$block-name} {\n &__background {\n opacity: 0.1 !important;\n }\n }\n @include hoverMixin {\n opacity: 0.2 !important;\n }\n }\n &-flat {\n color: var(--mc-button-background-color);\n #{$block-name}__background {\n opacity: 0 !important;\n }\n @include hoverMixin {\n opacity: 0.1 !important;\n }\n }\n &-link {\n color: var(--mc-button-background-color);\n padding: 0;\n @include size(auto);\n border: none;\n user-select: text;\n &#{$block-name}--size-l {\n line-height: $line-height-250;\n }\n &#{$block-name} {\n &--disabled {\n opacity: $opacity-disabled;\n background-color: transparent !important;\n color: var(--mc-button-background-color) !important;\n border-color: transparent !important;\n }\n }\n @media #{$media-desktop} {\n &:hover {\n filter: brightness(0.85);\n }\n }\n\n &:active {\n filter: brightness(0.85);\n }\n #{$block-name} {\n &__background {\n display: none;\n }\n }\n }\n }\n &--bg-flat {\n #{$block-name} {\n &__background {\n opacity: 0.1 !important;\n }\n }\n }\n &--shadow {\n box-shadow: 0 3px 10px var(--mc-button-background-color);\n }\n &--underline-link {\n #{$block-name}__text {\n text-decoration: underline !important;\n }\n }\n\n &--secondary-color {\n @media #{$media-desktop} {\n &:hover {\n color: var(--mc-button-secondary-color);\n }\n }\n &:active {\n color: var(--mc-button-secondary-color);\n }\n }\n\n &--uppercase {\n text-transform: uppercase;\n letter-spacing: $letter-spacing-m;\n }\n\n &--is-active,\n &.nuxt-link-active {\n color: $color-purple;\n background-color: transparent;\n border-color: transparent;\n pointer-events: none;\n }\n\n &--rounded {\n border-radius: $radius-circle;\n }\n\n &--semi-rounded {\n border-radius: 50px;\n }\n\n &--full-width {\n width: 100%;\n }\n\n &--text-align {\n &-left {\n justify-content: flex-start;\n }\n &-center {\n justify-content: center;\n }\n &-right {\n justify-content: flex-end;\n }\n }\n\n &--loading,\n &--icon-loading,\n &--disabled {\n pointer-events: none;\n }\n\n &--loading {\n #{$block-name} {\n &__loader {\n display: inline-block;\n }\n }\n\n > *:not(#{$block-name}__loader) {\n opacity: 0;\n }\n }\n &--icon-loading {\n #{$block-name} {\n &__append,\n &__prepend {\n .mc-svg-icon {\n animation: $animation-spinner;\n }\n }\n }\n #{$block-name}__loader {\n transform-origin: center center;\n animation: $animation-spinner;\n }\n }\n\n &--disabled {\n color: $color-outline-gray;\n cursor: not-allowed;\n #{$block-name} {\n &__background {\n background-color: $color-hover-gray;\n border-color: $color-hover-gray;\n }\n }\n }\n\n &--inactive {\n pointer-events: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McSvgIcon from '../McSvgIcon/McSvgIcon.vue'\nimport { computed, type PropType } from 'vue'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport type { ChipVariationUnion, IChipStyleOptions } from '@/types/IChip'\nimport { type ChipSizeUnion } from '@/types/IChip'\nimport type { ColorsUnion } from '@/types/styles/Colors'\nimport { ChipModifiers } from '@/enums'\n\nconst emit = defineEmits(['close', 'click'])\nconst props = defineProps({\n /**\n * Text content\n *\n */\n title: {\n type: [String, Number] as PropType<string | number>,\n default: '',\n },\n /**\n * Кнопка закрытия\n *\n */\n closable: {\n type: Boolean as PropType<boolean>,\n default: false,\n },\n /**\n * Дизайн:\n * `purple, purple-invert т.д.`\n */\n variation: {\n type: String as () => ChipVariationUnion,\n default: 'transparent',\n },\n /**\n * Счетчик\n *\n */\n counter: {\n type: [String, Number] as PropType<string | number>,\n default: null,\n },\n /**\n * Размер\n */\n size: {\n type: String as () => ChipSizeUnion,\n default: 'm',\n },\n /**\n * Если нужен\n * иной цвет текста\n */\n textColor: {\n type: String as () => ColorTypes,\n default: '',\n },\n})\n\nconst classes = computed((): { [key: string]: boolean } => ({\n [`mc-chip--variation-${chipOptions.value.variation}`]: !!props.variation,\n [`mc-chip--size-${props.size}`]: !!props.size,\n}))\n\nconst chipOptions = computed((): IChipStyleOptions => {\n const variationProps = props.variation?.split('-')\n const currentVariation = variationProps[variationProps.length - 1]\n let color\n let variation\n switch (currentVariation) {\n case ChipModifiers.Outline:\n case ChipModifiers.Invert: {\n variation = currentVariation\n color = props.variation.replace(`-${currentVariation}`, '')\n break\n }\n default: {\n variation = 'default'\n color = props.variation\n break\n }\n }\n return {\n color: color as ColorTypes,\n variation,\n }\n})\n\nconst styles = computed((): { [key: string]: ColorsUnion } => {\n const textColor = props.textColor || 'white'\n return {\n '--mc-chip-color': Colors[chipOptions.value.color as ColorTypes],\n '--mc-chip-text-color': Colors[textColor],\n }\n})\n\nconst handleCloseClick = (e: Event): void => {\n emit('close', e)\n}\nconst handleClick = (e: Event): void => {\n emit('click', e)\n}\n</script>\n\n<template>\n <section class=\"mc-chip\" tabindex=\"0\" :class=\"classes\" :style=\"styles\" @click=\"handleClick\">\n <div v-if=\"$slots.icon\" class=\"mc-chip__icon\">\n <!-- @slot Слот для иконки -->\n <slot name=\"icon\" />\n </div>\n <div v-if=\"title || $slots.default\" class=\"mc-chip__title\">\n <!-- @slot Слот для контента -->\n <slot>\n {{ title }}\n </slot>\n </div>\n <div v-if=\"counter || counter === 0\" class=\"mc-chip__counter\">\n {{ counter }}\n </div>\n <button v-if=\"closable\" class=\"mc-chip__button\" type=\"button\" @click.stop=\"handleCloseClick\">\n <!-- @slot Слот для пользовательской кнопки -->\n <slot name=\"button\">\n <mc-svg-icon size=\"200\" name=\"cancel\" />\n </slot>\n </button>\n </section>\n</template>\n\n<style lang=\"scss\">\n@use 'sass:color' as sasscolor;\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/durations' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/font-weights' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/sizes' as *;\n\n.mc-chip {\n $block-name: &;\n --mc-chip-text-color: #{$color-black};\n --mc-chip-color: #{$color-white};\n display: inline-flex;\n position: relative;\n align-items: center;\n color: var(--mc-chip-color);\n font-family: $font-family-main;\n font-size: $font-size-200;\n line-height: $line-height-200;\n max-width: 100%;\n border-radius: 100px;\n vertical-align: middle;\n outline: none;\n z-index: 0;\n flex-shrink: 0;\n overflow: visible;\n &:before {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n z-index: 0;\n @include size(100%);\n border-radius: inherit;\n background-color: var(--mc-chip-color);\n }\n > * {\n margin-right: $space-50;\n z-index: 1;\n }\n > *:first-child {\n margin-left: $space-50;\n }\n\n &--size {\n @mixin padding-x($space, $space-compact) {\n padding-right: $space;\n padding-left: $space;\n &-compact {\n padding-right: $space-compact;\n padding-left: $space-compact;\n }\n }\n &-m {\n @include padding-x($space-100, $space-50);\n &,\n &-compact {\n height: $size-400;\n }\n }\n &-s {\n @include padding-x($space-100, $space-50);\n &,\n &-compact {\n height: $size-300;\n }\n }\n &-xs {\n @include padding-x($space-50, 0);\n &,\n &-compact {\n height: $space-200;\n font-size: $font-size-100;\n line-height: $line-height-150;\n }\n }\n }\n &__icon {\n display: flex;\n justify-content: center;\n align-items: center;\n margin-left: 0;\n }\n &__title {\n @include ellipsis();\n @include layout-flex-fix();\n color: var(--mc-chip-text-color);\n &:empty {\n display: none;\n }\n }\n &__counter {\n flex: 0 0 auto;\n font-family: $font-family-main;\n font-size: $font-size-200;\n line-height: $line-height-200;\n color: $color-dark-gray;\n\n &:empty {\n display: none;\n }\n }\n &__button {\n @include size($size-200);\n position: relative;\n display: flex;\n flex: 0 0 auto;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin-right: 0;\n border-radius: 0;\n user-select: none;\n text-decoration: none;\n text-transform: none;\n background-color: transparent;\n background-image: none;\n cursor: pointer;\n outline: 0;\n border: none;\n transition: all $duration-s;\n flex-wrap: nowrap;\n -webkit-appearance: none;\n -webkit-text-fill-color: currentColor;\n color: $color-dark-gray;\n opacity: 0.2;\n\n &:hover {\n opacity: 1;\n color: $color-red;\n }\n\n &:active {\n color: sasscolor.adjust($color-red, $lightness: 15%);\n }\n }\n\n &--variation {\n &-default {\n #{$block-name} {\n &__button {\n color: var(--mc-chip-color);\n &:hover {\n opacity: 1;\n color: $color-white;\n }\n &:active {\n color: sasscolor.adjust($color-white, $lightness: 15%);\n }\n }\n &__title {\n color: var(--mc-chip-text-color);\n }\n &__counter {\n color: var(--mc-chip-text-color);\n opacity: 0.5;\n }\n }\n }\n &-outline {\n color: var(--mc-chip-color);\n border: 1px solid var(--mc-chip-color);\n &:before {\n display: none;\n }\n }\n &-invert {\n color: $color-black;\n &:before {\n background-color: var(--mc-chip-color);\n opacity: 0.15;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue'\nimport type { IModalServiceState, IModalState } from '@/types/IModal'\n\nconst props = defineProps({\n modalServiceState: {\n type: Object as PropType<IModalServiceState>,\n default: () => ({})\n },\n reactiveProps: {\n type: Object as () => { modals: IModalState[] },\n default: () => ({})\n }\n})\n\nconst containerStyle = computed((): { [key: string]: string | number } => ({\n zIndex: props.reactiveProps.modals.length ? 99 : -1,\n visibility: props.reactiveProps.modals.length ? 'visible' : 'hidden'\n}))\nconst closeModal = (value: IModalState) => {\n value.close()\n setTimeout(() => {\n if (props.reactiveProps.modals.every((d) => !d.modelValue)) {\n props.modalServiceState.closeServiceState()\n }\n }, 300)\n}\n</script>\n\n<template>\n <div class=\"mc-modal-container\" :style=\"containerStyle\">\n <div v-for=\"modal in props.reactiveProps.modals\" :key=\"modal.id\" @close=\"() => closeModal(modal)\">\n <component\n v-model=\"modal.modelValue\"\n :is=\"modal.component\"\n v-bind=\"modal.componentProps\"\n @closed=\"() => closeModal(modal)\"\n />\n </div>\n </div>\n</template>\n\n<style>\n.mc-modal-container {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n bottom: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { TransitionPresets, useTransition } from '@vueuse/core'\nimport { computed, type PropType, ref, watch } from 'vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport type { IconsListUnion } from '@/types/styles/Icons'\nimport type { DrawerPositionsUnion } from '@/types/IDrawer'\nimport { DrawerPositions } from '@/enums/Drawer'\n\nconst emit = defineEmits<{\n (e: 'toggle', value: boolean): void\n (e: 'open'): void\n (e: 'close'): void\n (e: 'update:modelValue', value: boolean): void\n}>()\nconst props = defineProps({\n modelValue: {\n type: Boolean,\n default: false\n },\n duration: {\n type: Number as PropType<number>,\n default: 300\n },\n position: {\n type: String as () => DrawerPositionsUnion,\n default: DrawerPositions.Right\n },\n /**\n * Нужна ли кнопка\n * закрытия в шапке\n */\n closeVisible: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n showOverlay: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Тип иконки\n * закрытия в шапке\n */\n iconClose: {\n type: String as () => IconsListUnion,\n default: 'close'\n },\n width: {\n type: Number as PropType<number>,\n default: 300\n }\n})\n\nconst overlayStartAnimationPosition = ref<number>(0)\nconst overlayEndAnimationPosition = ref<number>(100)\nconst isRightDrawerPosition = computed((): boolean => {\n return props.position === DrawerPositions.Right\n})\nconst drawerStartAnimationPosition = computed((): number => {\n return isRightDrawerPosition.value ? 100 : -100\n})\nconst drawerStartStaticPosition = computed((): { [key: string]: number } => {\n return {\n [isRightDrawerPosition.value ? DrawerPositions.Right : DrawerPositions.Left]: 0\n }\n})\n\nconst overlayStateNumber = ref<number>(overlayStartAnimationPosition.value)\nconst drawerStateNumber = ref<number>(drawerStartAnimationPosition.value)\n\nconst drawerNumber = useTransition(drawerStateNumber, {\n duration: props.duration,\n transition: TransitionPresets.easeOutQuart\n})\n\nconst drawerOverlayNumber = useTransition(overlayStateNumber, {\n duration: props.duration,\n transition: TransitionPresets.easeOutQuart\n})\n\nconst overlayStyle = computed((): { [key: string]: number | string } => {\n return {\n visibility: drawerOverlayNumber.value ? 'visible' : 'hidden',\n zIndex: drawerOverlayNumber.value ? 1 : -1\n }\n})\n\nconst drawerStyle = computed((): { [key: string]: number | string } => {\n return {\n transform: `translateX(${drawerNumber.value}%)`,\n width: `${props.width}px`,\n [props.position]: 0,\n ...drawerStartStaticPosition.value\n }\n})\n\nconst overlayClasses = computed((): { [key: string]: boolean } => {\n return {\n 'mc-drawer__overlay': true,\n 'mc-drawer__overlay--hidden': !props.showOverlay\n }\n})\n\nconst openDrawer = () => {\n overlayStateNumber.value = overlayEndAnimationPosition.value\n drawerStateNumber.value = overlayStateNumber.value === 0 ? 100 : 0\n if (!props.modelValue) {\n emit('update:modelValue', true)\n emit('open')\n }\n}\nconst closeDrawer = () => {\n overlayStateNumber.value = overlayStartAnimationPosition.value\n drawerStateNumber.value = overlayStateNumber.value === 0 ? (isRightDrawerPosition.value ? 100 : -100) : 0\n if (props.modelValue) {\n emit('update:modelValue', false)\n emit('close')\n }\n}\n\nconst handleOverlayClick = () => {\n if (!props.showOverlay) return\n closeDrawer()\n}\n\nwatch(\n () => props.modelValue,\n (value) => {\n value ? openDrawer() : closeDrawer()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"mc-drawer__wrapper\" :style=\"overlayStyle\">\n <div :class=\"overlayClasses\" :style=\"overlayStyle\" @click.stop=\"handleOverlayClick\" />\n <div class=\"mc-drawer\" :style=\"drawerStyle\" @click.stop>\n <slot />\n <button v-if=\"closeVisible\" type=\"button\" class=\"mc-drawer__btn-close\" @click.prevent=\"closeDrawer\">\n <mc-svg-icon class=\"mc-drawer__icon-close\" :name=\"iconClose\" />\n <mc-svg-icon class=\"mc-drawer__icon-close--small\" :name=\"iconClose\" size=\"200\" />\n </button>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/tokens/box-shadows' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/media-queries' as *;\n@use '../../../assets/styles/mixins' as *;\n.mc-drawer {\n $block-name: &;\n position: absolute;\n top: 0;\n bottom: 0;\n background: white;\n height: 100%;\n box-shadow: $shadow-s;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n z-index: 2;\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.15);\n display: flex;\n justify-content: flex-start;\n &--hidden {\n background: transparent;\n }\n }\n &__wrapper {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1;\n overflow: hidden;\n }\n &__btn-close {\n z-index: 1;\n padding: $space-100 !important;\n & {\n @include close-link();\n }\n & {\n @include position(absolute, $space-100 $space-100 null null);\n }\n & {\n @include reset-btn();\n }\n }\n &__icon-close {\n @include size($size-300);\n &--small {\n display: none;\n }\n }\n @media #{$media-query-m-down} {\n #{$block-name}__icon-close {\n display: none;\n &--small {\n display: block;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue'\nimport McDrawer from '@/components/templates/McDrawer/McDrawer.vue'\nimport type { IDrawerServiceState, IDrawerState } from '@/types/IDrawer'\n\nconst props = defineProps({\n drawerServiceState: {\n type: Object as PropType<IDrawerServiceState>,\n default: () => ({})\n },\n reactiveProps: {\n type: Object as () => { drawers: IDrawerState[] },\n default: () => ({})\n }\n})\n\nconst containerStyle = computed((): { [key: string]: string | number } => ({\n zIndex: props.reactiveProps.drawers.length ? 99 : -1,\n visibility: props.reactiveProps.drawers.length ? 'visible' : 'hidden'\n}))\nconst closeDrawer = (value: IDrawerState) => {\n value.close()\n setTimeout(() => {\n if (props.reactiveProps.drawers.every((d) => !d.modelValue)) {\n props.drawerServiceState.closeServiceState()\n }\n }, value?.drawerProps?.duration || 300)\n}\n</script>\n\n<template>\n <div class=\"mc-drawer-container\" :style=\"containerStyle\">\n <mc-drawer\n v-for=\"(drawer, i) in props.reactiveProps.drawers\"\n :key=\"drawer.id\"\n v-model=\"drawer.modelValue\"\n v-bind=\"drawer.drawerProps\"\n :show-overlay=\"i + 1 === props.reactiveProps.drawers.length\"\n @close=\"() => closeDrawer(drawer)\"\n >\n <component :is=\"drawer.component\" v-bind=\"drawer.componentProps\" @close-drawer=\"() => closeDrawer(drawer)\" />\n </mc-drawer>\n </div>\n</template>\n\n<style>\n.mc-drawer-container {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n bottom: 0;\n}\n</style>\n","<script setup lang=\"ts\">\n//@ts-ignore\n// import { sanitize } from 'isomorphic-dompurify'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport { type HorizontalAlignmentUnion } from '@/types/styles/Alignment'\nimport { LineHeights, type LineHeightTypes } from '@/types/styles/LineHeights'\nimport { type WeightsUnion } from '@/types/styles/Weights'\n\nimport { computed, type PropType, useAttrs } from 'vue'\nimport { FontWeights } from '@/types/styles/FontWeights'\nimport { adaptiveAdditionalProps, adaptivePropsParams, adaptivePropsSizes } from '@/utils/mcTitleAdaptiveProps'\nimport type { TitleVariationsUnion } from '@/types/ITitle'\nimport { useHelper } from '@/composables'\n\nconst helper = useHelper()\nconst attrs = useAttrs()\nconst props = defineProps({\n ...adaptiveAdditionalProps,\n /**\n * Уровень: `h1`, `h2`, `h3`, `h4`, `subtitle`, `body`, `overline`, `article`, 'info'.\n */\n variation: {\n type: String as () => TitleVariationsUnion,\n default: 'body'\n },\n /**\n * В одну строку с точками в конце, если не вмещается\n */\n ellipsis: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Если нужен другой тэг\n */\n tagName: {\n type: String as PropType<string>,\n default: 'div'\n },\n /**\n * Заглавные буквы\n */\n uppercase: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Цвет\n */\n color: {\n type: String as () => ColorTypes,\n default: 'black'\n },\n /**\n * Позиция текста:\n * `left, center, right`\n */\n textAlign: {\n type: String as () => HorizontalAlignmentUnion,\n default: 'left'\n },\n /**\n * Если нужна иная высота строки: `100`, `200`, `300` и т.д.\n */\n lineHeight: {\n type: String as () => LineHeightTypes,\n default: ''\n },\n /**\n * Толщина текста:\n * normal, medium, semi-bold\n */\n weight: {\n type: String as () => WeightsUnion,\n default: ''\n },\n /**\n * Если нужно указать свою\n * максимальную ширину\n */\n maxWidth: {\n type: String as PropType<string>,\n default: '100%'\n },\n preLine: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n nowrap: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n plainText: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * ** Analog v-html, component use DOMPurify**\n * */\n htmlData: {\n type: String as PropType<string>,\n default: ''\n }\n})\n\nconst id = computed(() => {\n return attrs.id as string\n})\n\nconst responsivePropsClasses = computed((): { [key: string]: boolean } => {\n const result: { [key: string]: any } = {}\n result[`mc-title--variation-${props.variation}`] = !!props.variation\n adaptivePropsParams.forEach((value) => {\n adaptivePropsSizes.forEach((size) => {\n //@ts-ignore\n const sizeValue: string | undefined | unknown = props[`${value}${helper.upperFirst(size)}`]\n result[`mc-title--${value}-${size}-${sizeValue}`] = !!sizeValue\n })\n })\n\n return result\n})\n\nconst classes = computed((): { [key: string]: boolean } => ({\n 'mc-title': true,\n ['mc-title--ellipsis']: props.ellipsis,\n [`mc-title--text-align-${props.textAlign}`]: !!props.textAlign,\n [`mc-title--pre-line`]: props.preLine,\n [`mc-title--nowrap`]: props.nowrap,\n 'mc-title--uppercase': props.uppercase,\n 'mc-title--line-height': !!props.lineHeight,\n 'mc-title--weight': !!props.weight,\n 'mc-title--plain-text': props.plainText,\n ...responsivePropsClasses.value\n}))\nconst style = computed((): { [key: string]: string } => {\n let style: { [key: string]: string } = {}\n if (props.color) style['--mc-title-color'] = Colors[props.color]\n if (props.weight) style['--mc-title-weight'] = FontWeights[props.weight]\n if (props.lineHeight) style['--mc-title-line-height'] = LineHeights[props.lineHeight]\n\n return style\n})\n\nconst contentStyle = computed((): { [key: string]: string } => ({\n 'max-width': props.maxWidth\n}))\n</script>\n\n<template>\n <div :class=\"classes\" :style=\"style\" :id=\"id\">\n <!-- @slot -->\n <slot name=\"icon-prepend\" />\n <div\n v-if=\"props.htmlData\"\n class=\"mc-title__text\"\n :style=\"contentStyle\"\n v-html=\"props.htmlData\"\n /> <!-- sanitize(props.htmlData) -->\n <div v-else class=\"mc-title__text\" :style=\"contentStyle\"><slot /></div>\n\n <!-- @slot -->\n <slot name=\"icon-append\" />\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/letter-spacings' as *;\n@use '../../../assets/tokens/font-weights' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/media-queries' as *;\n.mc-title {\n $block-name: &;\n --mc-title-color: initial;\n --mc-title-weight: initial;\n --mc-title-line-height: initial;\n color: var(--mc-title-color);\n font-family: $font-family-main;\n @mixin variations() {\n &-h1 {\n font-size: $font-size-700;\n line-height: $line-height-600;\n font-weight: $font-weight-semi-bold;\n #{$block-name}__text {\n max-width: 920px;\n }\n }\n &-h2 {\n font-size: $font-size-600;\n line-height: $line-height-500;\n font-weight: $font-weight-semi-bold;\n #{$block-name}__text {\n max-width: 820px;\n }\n }\n &-h3 {\n font-size: $font-size-500;\n line-height: $line-height-400;\n font-weight: $font-weight-semi-bold;\n #{$block-name}__text {\n max-width: 720px;\n }\n }\n &-h4 {\n font-size: $font-size-400;\n line-height: $line-height-300;\n font-weight: $font-weight-bold;\n #{$block-name}__text {\n max-width: 700px;\n }\n }\n\n &-subtitle {\n font-size: $font-size-300;\n line-height: $line-height-250;\n #{$block-name}__text {\n max-width: 640px;\n }\n }\n &-article {\n font-size: $font-size-200;\n line-height: $line-height-250;\n #{$block-name}__text {\n max-width: 536px;\n }\n }\n &-info {\n font-size: $font-size-300;\n line-height: $line-height-300;\n }\n &-body {\n font-size: $font-size-200;\n line-height: $line-height-200;\n #{$block-name}__text {\n max-width: 330px;\n }\n }\n &-overline {\n font-size: $font-size-100;\n line-height: $line-height-150;\n font-weight: $font-weight-medium;\n #{$block-name}__text {\n max-width: 330px;\n }\n }\n }\n\n margin-top: 0;\n margin-bottom: 0;\n display: inline-flex;\n max-width: 100%;\n width: 100%;\n text-decoration: none;\n //@include child-indent-right($space-50);\n\n &__text {\n padding-bottom: 1px; // fix overflow\n margin-bottom: -1px; // fix overflow\n }\n\n > *:not(:empty):not(:last-child) {\n margin-inline-end: $space-50;\n }\n\n .mc-svg-icon,\n .mc-button {\n @include reset-text-indents();\n }\n\n &--pre-line {\n #{$block-name}__text {\n white-space: pre-line !important;\n word-break: normal;\n }\n }\n\n &--nowrap {\n #{$block-name}__text {\n white-space: nowrap;\n }\n }\n\n &--variation {\n @include variations;\n }\n\n &--ellipsis {\n align-items: center;\n\n #{$block-name} {\n &__text {\n @include ellipsis($display: inline-block);\n @include layout-flex-fix();\n }\n }\n }\n\n &--uppercase {\n text-transform: uppercase;\n letter-spacing: $letter-spacing-m;\n }\n &--plain-text {\n #{$block-name} {\n &__text {\n unicode-bidi: plaintext;\n }\n }\n }\n\n &--text-align {\n &-left {\n justify-content: flex-start;\n text-align: start;\n }\n &-center {\n justify-content: center;\n text-align: center;\n }\n &-right {\n justify-content: flex-end;\n text-align: end;\n }\n }\n &--line-height {\n line-height: var(--mc-title-line-height);\n }\n &--weight {\n font-weight: var(--mc-title-weight);\n }\n @each $media, $value in $token-media-queries {\n @media #{$value} {\n &--variation-#{$media} {\n @include variations;\n }\n &--weight-#{$media} {\n &-normal {\n font-weight: $font-weight-normal;\n }\n &-medium {\n font-weight: $font-weight-medium;\n }\n &-semi-bold {\n font-weight: $font-weight-semi-bold;\n }\n &-bold {\n font-weight: $font-weight-bold;\n }\n }\n }\n }\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-weight: inherit;\n font-style: inherit;\n font-size: inherit;\n line-height: inherit;\n margin-block-start: 0;\n margin-block-end: 0;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, type PropType, reactive, ref, useAttrs, watch } from 'vue'\nimport {\n DatepickerFormat,\n DatepickerTypes,\n DayjsFormat,\n DatepickerOutputFormat,\n DatepickerFormatsVariations\n} from '@/enums/Datepicker'\nimport type { DatepickerFormatsObjectFormat, IDatepickerPlaceholders, IDatepickerPreset } from '@/types/IDatepicker'\nimport { type DatePickerValue, type DatepickerTypesUnion, type DatepickerFormatsObject } from '@/types/IDatepicker'\n//@ts-ignore\nimport { dayjs, dayjsLocales } from '../../../utils/dayjs.js'\nimport DatePicker, { type DatePickerMarker } from '@vuepic/vue-datepicker'\nimport '@vuepic/vue-datepicker/dist/main.css'\nimport McTitle from '../McTitle/McTitle.vue'\nimport McSvgIcon from '../McSvgIcon/McSvgIcon.vue'\nimport McButton from '../McButton/McButton.vue'\nimport { useFieldErrors } from '@/composables/useFieldErrors'\nimport { ButtonSize, TitleVariations, Weights } from '@/enums'\n\nconst attrs = useAttrs()\nconst emit = defineEmits(['update:modelValue'])\n\nconst props = defineProps({\n //@ts-ignore\n modelValue: {\n type: [String, Array] as PropType<DatePickerValue>\n },\n /**\n * Тип датапикера\n */\n type: {\n type: String as () => DatepickerTypesUnion,\n default: DatepickerTypes.DatePicker\n },\n /**\n * Заголовок поля:\n */\n title: {\n type: String as PropType<string>,\n default: ''\n },\n\n /**\n * Вспомогательный текст под инпутом:\n */\n helpText: {\n type: String as PropType<string>,\n default: ''\n },\n\n /**\n * Редактируемый инпут\n */\n editable: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n disabled: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n placeholder: {\n type: String as PropType<string>,\n default: null\n },\n\n /**\n * Name\n */\n name: {\n type: String as PropType<string>,\n required: true\n },\n\n /**\n * Локаль The locale code (ISO 639-1 + optional country code)\n */\n lang: {\n type: String as PropType<string>,\n default: 'en'\n },\n /**\n * Ошибки\n */\n errors: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n /**\n * Отдаваемая дата будет в формате ISO String\n */\n toIsoFormat: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Формат отдаваемой даты\n */\n placeholders: {\n type: Object as IDatepickerPlaceholders,\n default: () => ({\n week: 'Week',\n month: 'Month',\n quarter: 'Quarter',\n year: 'Year',\n confirm: 'Confirm'\n })\n },\n /**\n * Пресеты для быстрых периодов\n **/\n customPresets: {\n type: Array as PropType<IDatepickerPreset[]>,\n default: () => []\n },\n range: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Если значение true, то датапикер отображается в открытом виде\n */\n inline: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Дата, до которой все будет задизэйблено\n **/\n minDate: {\n type: [Date, String] as PropType<Date | string>\n },\n /**\n * Дата, после которой все будет задизэйблено\n **/\n maxDate: {\n type: [String, Date] as PropType<Date | string>\n },\n /**\n * Массив дат запрещенных к выбору / Метод которые проверяет каждую дату\n **/\n disabledDates: {\n type: [Array as PropType<Date[] | string[]>, Function]\n },\n /**\n * Массив дат разрешенных к выбору / Метод которые проверяет каждую дату\n * **/\n allowedDates: {\n type: [Array as PropType<Date[] | string[]>, Function]\n },\n /**\n * Функция проверяющая и устанавливающая доступно ли время для выбора\n * Params [String] date - текущая дата\n * return Boolean, где true - время заблокировано для выбора\n * **/\n disabledTime: {\n type: [Array as PropType<Date[] | string[]>, Function]\n },\n minWidth: {\n type: String as PropType<string>,\n default: '240px'\n },\n hours: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n minutes: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n seconds: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n timezone: {\n type: String as PropType<string>,\n default: dayjs.tz.guess()\n },\n useTimezone: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Показывать ли крестик очищения поля\n * */\n clearable: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n loading: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n setDefaultToday: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n markers: {\n type: Array as () => DatePickerMarker[],\n default: () => [] as DatePickerMarker[]\n }\n})\n\nconst fieldErrors = useFieldErrors(props.errors)\nconst pickDate = ref<DatePickerValue>(null)\nconst input = ref<InstanceType<typeof DatePicker> | null | any>(null)\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-date-picker--error': !!fieldErrors.errorText.value,\n 'mc-date-picker--disabled': props.disabled\n }\n})\n\nconst formats = reactive<DatepickerFormatsObject>({\n [DatepickerTypes.TimePicker]: {\n [DatepickerFormatsVariations.Picker]: DatepickerFormat.TimePicker,\n [DatepickerFormatsVariations.Dayjs]: DayjsFormat.TimePicker,\n [DatepickerFormatsVariations.Output]: DatepickerOutputFormat.TimePicker\n },\n [DatepickerTypes.DatePicker]: {\n [DatepickerFormatsVariations.Picker]: DatepickerFormat.DatePicker,\n [DatepickerFormatsVariations.Dayjs]: DayjsFormat.DatePicker,\n [DatepickerFormatsVariations.Output]: DatepickerOutputFormat.DatePicker\n },\n [DatepickerTypes.DateTimePicker]: {\n [DatepickerFormatsVariations.Picker]: DatepickerFormat.DateTimePicker,\n [DatepickerFormatsVariations.Dayjs]: DayjsFormat.DateTimePicker,\n [DatepickerFormatsVariations.Output]: DatepickerOutputFormat.DateTimePicker\n },\n [DatepickerTypes.WeekPicker]: {\n [DatepickerFormatsVariations.Picker]: DatepickerFormat.WeekPicker,\n [DatepickerFormatsVariations.Dayjs]: DayjsFormat.WeekPicker,\n [DatepickerFormatsVariations.Output]: DatepickerOutputFormat.WeekPicker\n },\n [DatepickerTypes.MonthPicker]: {\n [DatepickerFormatsVariations.Picker]: DatepickerFormat.MonthPicker,\n [DatepickerFormatsVariations.Dayjs]: DayjsFormat.MonthPicker,\n [DatepickerFormatsVariations.Output]: DatepickerOutputFormat.MonthPicker\n },\n [DatepickerTypes.YearPicker]: {\n [DatepickerFormatsVariations.Picker]: DatepickerFormat.YearPicker,\n [DatepickerFormatsVariations.Dayjs]: DayjsFormat.YearPicker,\n [DatepickerFormatsVariations.Output]: DatepickerOutputFormat.YearPicker\n }\n})\nconst computedType = computed((): DatepickerTypes => {\n return (props.type as DatepickerTypes) || DatepickerTypes.DatePicker\n})\nconst dateFormat = reactive<DatepickerFormatsObjectFormat>(formats[computedType.value])\n\nconst isTimePicker = computed((): boolean => {\n return computedType.value === DatepickerTypes.TimePicker\n})\nconst isDateTimePicker = computed((): boolean => {\n return computedType.value === DatepickerTypes.DateTimePicker\n})\nconst isWeekPicker = computed((): boolean => {\n return computedType.value === DatepickerTypes.WeekPicker\n})\nconst isMonthPicker = computed((): boolean => {\n return computedType.value === DatepickerTypes.MonthPicker\n})\nconst isYearPicker = computed((): boolean => {\n return computedType.value === DatepickerTypes.YearPicker\n})\nconst pickerType = computed((): Partial<Record<DatepickerTypes, boolean>> => {\n return {\n [DatepickerTypes.TimePicker]: computedType.value === DatepickerTypes.TimePicker,\n [DatepickerTypes.WeekPicker]: computedType.value === DatepickerTypes.WeekPicker,\n [DatepickerTypes.MonthPicker]: computedType.value === DatepickerTypes.MonthPicker,\n [DatepickerTypes.YearPicker]: computedType.value === DatepickerTypes.YearPicker\n }\n})\nconst isAutoApply = computed((): boolean => {\n return !isTimePicker.value && !isDateTimePicker.value && !isFooterVisible.value\n})\nconst weekNumbers = computed((): string | null => {\n return isWeekPicker.value ? 'local' : null\n})\nconst modelType = computed((): string => {\n return props.toIsoFormat && !props.useTimezone ? 'iso' : 'format'\n})\nconst hoursOptions = computed((): object => {\n return props.hours && props.hours.length ? { 'hour-options': props.hours } : {}\n})\nconst minutesOptions = computed((): object => {\n return props.minutes && props.minutes.length ? { 'minute-options': props.minutes } : {}\n})\nconst secondsOptions = computed((): object => {\n return props.seconds && props.seconds.length ? { 'second-options': props.seconds } : {}\n})\nconst isFooterVisible = computed((): boolean => {\n return (\n props.range &&\n (props.customPresets?.length || !!props.placeholders) &&\n !isTimePicker.value &&\n !isYearPicker.value &&\n !isMonthPicker.value\n )\n})\n\nonMounted(() => {\n init()\n})\n\nconst localValue = computed({\n get() {\n return getFormattedPickerDate(props.modelValue)\n },\n set(value) {\n if (!value) value = props.range ? [] : null\n const date = getFormattedOutputDate(value)\n fieldErrors.toggleErrorVisible()\n emit('update:modelValue', date)\n }\n})\n\nconst init = () => {\n props.setDefaultToday && handlePreselectToday()\n}\n\nconst handlerPreselectRange = (period: string[]): void => {\n const [start, end] = period\n input.value && (input.value.currentValue = dayjs ? [dayjs(start).toDate(), dayjs(end).toDate()] : period)\n}\n\n/**\n * Преселект при setDefaultToday = true\n * */\nconst handlePreselectToday = (): void => {\n if (isWeekPicker.value) return\n\n const hasValue = props.range\n ? localValue.value?.length && Array.isArray(localValue.value) && localValue.value.every((v) => dayjs(v).isValid())\n : //@ts-ignore\n dayjs(localValue.value).isValid()\n\n if (!hasValue) {\n let today = props.toIsoFormat\n ? dayjs().toISOString()\n : dayjs().format(dateFormat[DatepickerFormatsVariations.Output])\n localValue.value = props.range ? getFormattedPickerDate([today, today]) : getFormattedPickerDate(today)\n }\n}\n\n/**\n * Prepare dates for datepicker\n * */\nconst getFormattedPickerDate = (value: DatePickerValue): DatePickerValue => {\n if (isWeekPicker.value) return value\n let preparedValue = props.range ? (Array.isArray(value) ? value : []) : [value]\n if (!props.toIsoFormat) {\n preparedValue = preparedValue.map((pv) => dayjs(pv as string, dateFormat.output).format(dateFormat.dayjs))\n }\n\n const [start, end] = preparedValue\n return props.range ? ([start, end].filter(Boolean) as DatePickerValue) : start\n}\n\n/**\n * Prepare dates for output\n * */\nconst getFormattedOutputDate = (value: DatePickerValue): DatePickerValue => {\n if (isWeekPicker.value) return value\n let preparedValue = props.range ? (Array.isArray(value) ? value.map((pv) => String(pv)) : []) : [String(value)]\n if (!props.toIsoFormat) {\n preparedValue = preparedValue.map((pv) => dayjs(pv, dateFormat.dayjs).format(dateFormat.output))\n }\n\n const [start, end] = preparedValue.map((pv) => (pv === 'Invalid Date' ? null : pv))\n return props.range ? ([start, end].filter(Boolean) as DatePickerValue) : start\n}\n\nconst setLocale = async (): Promise<void> => {\n const locale = props.lang !== 'ar' && Object.keys(dayjsLocales).includes(props.lang) ? props.lang : 'en'\n //@ts-ignore\n await dayjsLocales[locale]?.()\n dayjs.locale(locale)\n}\n\nconst selectPeriod = (key: string) => {\n let start = dayjs()\n //@ts-ignore\n const end = pickDate.value ? dayjs(pickDate.value) : dayjs()\n switch (key) {\n case 'week':\n start = dayjs(end).subtract(7, 'days')\n break\n case 'month':\n start = dayjs(end).subtract(1, 'months')\n break\n case 'quarter':\n start = dayjs(end).subtract(3, 'months')\n break\n case 'year':\n start = dayjs(end).subtract(1, 'years')\n break\n }\n input.value.updateInternalModelValue([start.toDate(), end.toDate()])\n}\nconst handlePickDate = (date: DatePickerValue) => {\n pickDate.value = date\n}\n\nconst handleSubmit = () => {\n input.value.selectDate()\n input.value.closeMenu()\n}\n\nwatch(\n () => props.lang,\n () => {\n setLocale()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div ref=\"field\" class=\"mc-date-picker\" :class=\"classes\">\n <label v-if=\"$slots.header || !!props.title\" :for=\"name\" class=\"mc-date-picker__header\">\n <!-- @slot Слот для заголовка над инпутом -->\n <slot name=\"title\">\n <mc-title v-if=\"props.title\" :weight=\"Weights.Medium\">{{ props.title }}</mc-title>\n </slot>\n </label>\n <div class=\"mc-date-picker__inner\">\n <div class=\"mc-date-picker__input-wrapper\" :style=\"{ minWidth }\">\n <date-picker\n v-model=\"localValue\"\n ref=\"input\"\n :type=\"type\"\n v-bind=\"{\n ...attrs,\n ...pickerType,\n ...hoursOptions,\n ...minutesOptions,\n ...secondsOptions\n }\"\n class=\"mc-date-picker__date-picker\"\n :range=\"props.range\"\n :multi-calendars=\"props.range\"\n :month-change-on-scroll=\"false\"\n :timezone=\"timezone\"\n :format=\"dateFormat.picker\"\n :model-type=\"modelType\"\n :auto-apply=\"isAutoApply\"\n :partial-flow=\"isTimePicker || isDateTimePicker\"\n :enable-time-picker=\"isTimePicker || isDateTimePicker\"\n :clearable=\"clearable\"\n :inline=\"inline\"\n :locale=\"lang\"\n :markers=\"markers\"\n :action-row=\"{}\"\n :loading=\"loading\"\n :week-numbers=\"weekNumbers\"\n :placeholder=\"placeholder\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :disabled-dates=\"disabledDates\"\n :allowed-dates=\"allowedDates\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :disabled-times=\"disabledTime\"\n @range-start=\"handlePickDate\"\n >\n <!-- @slot Слот для вставки в футер попапа календаря -->\n <template v-if=\"isFooterVisible\" #action-row>\n <div class=\"mc-datepicker__footer-popup\">\n <div class=\"mc-datepicker__footer-popup-periods\">\n <template v-if=\"customPresets && customPresets.length\">\n <mc-button\n v-for=\"preset in customPresets\"\n :key=\"preset.title\"\n variation=\"black-link\"\n secondary-color=\"purple\"\n @click=\"handlerPreselectRange(preset.period)\"\n >\n {{ preset.title }}\n </mc-button>\n </template>\n <template v-else>\n <mc-button\n v-if=\"placeholders.week\"\n variation=\"black-link\"\n secondary-color=\"purple\"\n @click=\"selectPeriod('week')\"\n >\n {{ placeholders.week }}\n </mc-button>\n <mc-button\n v-if=\"placeholders.month\"\n variation=\"black-link\"\n secondary-color=\"purple\"\n @click=\"selectPeriod('month')\"\n >\n {{ placeholders.month }}\n </mc-button>\n <mc-button\n v-if=\"placeholders.quarter\"\n variation=\"black-link\"\n secondary-color=\"purple\"\n @click=\"selectPeriod('quarter')\"\n >\n {{ placeholders.quarter }}\n </mc-button>\n <mc-button\n v-if=\"placeholders.year\"\n variation=\"black-link\"\n secondary-color=\"purple\"\n @click=\"selectPeriod('year')\"\n >\n {{ placeholders.year }}\n </mc-button>\n </template>\n </div>\n <mc-button\n v-if=\"placeholders.confirm\"\n variation=\"purple-outline\"\n :size=\"ButtonSize.Xs\"\n @click=\"handleSubmit\"\n >\n {{ placeholders.confirm }}\n </mc-button>\n </div>\n </template>\n <template #input-icon>\n <mc-svg-icon name=\"calendar\" size=\"300\" :color=\"props.disabled ? 'outline-gray' : 'black'\" />\n </template>\n <template v-if=\"$slots.header\" #header>\n <div>\n <!-- @slot Слот для вставки в хедер попапа календаря -->\n <slot name=\"header\" />\n </div>\n </template>\n <template v-if=\"$slots.sidebar\" #sidebar>\n <div>\n <!-- @slot Слот для вставки в сайдбар попапа календаря -->\n <slot name=\"sidebar\" />\n </div>\n </template>\n <!-- @slot Слот для вставки пользовательской иконки календаря -->\n <template #icon-calendar>\n <mc-svg-icon class=\"mc-date-picker__icon\" name=\"calendar\" />\n </template>\n </date-picker>\n </div>\n </div>\n <div v-if=\"!!fieldErrors.errorText.value || !!props.helpText || !!$slots.bottom\" class=\"mc-date-picker__footer\">\n <mc-title v-if=\"!!fieldErrors.errorText.value\" tag-name=\"div\" color=\"red\" :variation=\"TitleVariations.Overline\">\n {{ fieldErrors.errorText.value }}\n </mc-title>\n <br v-if=\"!!fieldErrors.errorText.value && (!!props.helpText || !!$slots.bottom)\" />\n <!-- @slot Слот для доп. текста под инпутом -->\n <slot name=\"bottom\">\n <mc-title v-if=\"!!props.helpText\" tag-name=\"div\" :variation=\"TitleVariations.Overline\">\n {{ props.helpText }}\n </mc-title>\n </slot>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n//More info https://vue3datepicker.com/installation/\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/box-shadows' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/font-weights' as *;\n@use '../../../assets/tokens/media-queries' as *;\n@use '../../../assets/tokens/border-radius' as *;\n@use 'sass:color' as sasscolor;\n.mc-date-picker {\n $block-name: &;\n display: block;\n font-family: $font-family-main;\n &__header {\n @include reset-text-indents();\n display: block;\n margin-bottom: $space-100;\n &:empty {\n display: none;\n }\n }\n &__inner {\n display: flex;\n align-items: center;\n }\n &__input-wrapper {\n width: 100%;\n .dp__input {\n font-family: $font-family-main;\n font-size: $font-size-200;\n line-height: $line-height-200;\n height: $size-500;\n padding: $space-100 $space-300 $space-100 36px;\n border-color: $color-outline-gray;\n border-radius: $radius-100;\n cursor: pointer;\n color: $color-black;\n &:hover,\n &:focus {\n border-color: $color-purple;\n }\n &::placeholder {\n color: $color-gray;\n }\n }\n }\n &__footer {\n margin-top: $space-50;\n &:empty {\n display: none;\n }\n }\n .dp__input {\n font-family: $font-family-main;\n font-size: $font-size-200;\n line-height: $line-height-200;\n height: $size-500;\n padding: $space-100 $space-300 $space-100 36px;\n border-color: $color-outline-gray;\n border-radius: $radius-100;\n cursor: pointer;\n color: $color-black;\n &:hover,\n &:focus {\n border-color: $color-purple;\n }\n &::placeholder {\n color: $color-gray;\n }\n }\n\n &--error {\n .dp__input {\n border-color: $color-red !important;\n }\n }\n &--disabled {\n .dp__input {\n color: $color-outline-gray;\n cursor: not-allowed;\n background-color: $color-hover-gray;\n border-color: $color-outline-gray;\n box-shadow: none;\n &:hover,\n &:focus {\n border-color: $color-outline-gray;\n }\n }\n }\n // Input to top\n // Calendar below\n .dp + .dp {\n border-left: none;\n }\n .dp {\n width: 256px;\n padding: $space-200;\n font-size: $font-size-200;\n &--header-wrap {\n margin-bottom: $space-200;\n }\n &__month_year_wrap {\n justify-content: center;\n }\n &__month_year_select {\n font-size: $font-size-200;\n line-height: $line-height-200;\n font-weight: $font-weight-semi-bold;\n color: $color-black;\n width: max-content;\n height: auto;\n }\n &__input_icon {\n display: flex;\n align-items: center;\n justify-content: center;\n left: 8px;\n }\n &--clear-btn {\n margin-right: $space-100;\n svg {\n padding: 0;\n }\n &:hover {\n svg {\n color: $color-black;\n }\n }\n }\n &__calendar {\n &_item {\n flex-grow: unset;\n .dp {\n &__cell_inner {\n @include size($size-400);\n font-size: $font-size-200;\n line-height: $line-height-200;\n font-weight: $font-weight-normal;\n color: $color-black;\n border-radius: $radius-100;\n &:hover {\n color: $color-purple;\n background-color: sasscolor.scale($color-purple, $lightness: 80%);\n border-radius: $radius-100;\n }\n }\n &__cell_disabled {\n background-color: $color-hover-gray !important;\n border-radius: 0 !important;\n }\n &__cell_offset {\n color: $color-hover-gray;\n }\n &__range_between {\n color: $color-black;\n background-color: sasscolor.scale($color-purple, $lightness: 90%);\n border-radius: 0;\n }\n &__range_start,\n &__range_end,\n &__active_date {\n color: $color-white !important;\n background-color: $color-purple !important;\n border-color: $color-purple !important;\n }\n &__active_date {\n box-shadow: $shadow-s-purple;\n }\n &__today {\n color: $color-purple;\n border-color: transparent;\n border-radius: $radius-100;\n }\n }\n }\n &_header {\n &_item {\n @include size($space-400);\n font-size: $font-size-200;\n line-height: $line-height-200;\n font-weight: $font-weight-normal;\n color: $color-dark-gray;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n &_separator {\n display: none;\n }\n }\n &_row {\n margin: 0;\n }\n }\n &__btn {\n font-size: $font-size-200;\n line-height: $line-height-200;\n font-weight: $font-weight-semi-bold;\n background: transparent;\n &:hover {\n color: $color-purple;\n }\n }\n &__menu {\n border-radius: $radius-150;\n box-shadow: $shadow-s;\n z-index: 12222;\n border: transparent;\n padding: $space-200;\n &_inner {\n padding: 0;\n }\n }\n &__arrow_top,\n &__arrow_bottom,\n &__arrow_left,\n &__arrow_right {\n border: none;\n box-shadow: $shadow-s;\n z-index: -1;\n }\n &__action_row {\n padding: 0;\n margin: 0;\n .mc-datepicker__footer-popup {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n &-periods {\n display: flex;\n justify-content: space-between;\n align-items: center;\n @include child-indent-right($space-200);\n > * {\n @include child-indent-right($space-300);\n }\n .mc-button {\n @include child-indent-right($space-zero);\n }\n }\n }\n }\n }\n @at-root {\n html[dir='rtl'] {\n .mx-icon {\n &-double {\n &-right:after {\n left: $space-100;\n }\n &-left:before {\n left: -$space-100;\n }\n }\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { PreviewSizesUnion } from '@/types/IPreview'\n\nconst props = defineProps({\n /**\n * Размеры:\n * `s, m, l`\n */\n size: {\n type: String as () => PreviewSizesUnion,\n default: 'm'\n }\n})\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-preview': true,\n [`mc-preview--size-${props.size}`]: !!props.size\n }\n})\n</script>\n\n<template>\n <section :class=\"classes\">\n <div v-if=\"$slots.left\" class=\"mc-preview__left\">\n <!-- @slot Слот слева -->\n <slot name=\"left\" />\n </div>\n <div class=\"mc-preview__center\">\n <div class=\"mc-preview__top\">\n <!-- @slot Слот сверху -->\n <slot name=\"top\" />\n </div>\n <div v-if=\"$slots.bottom\" class=\"mc-preview__bottom\">\n <!-- @slot Слот внизу -->\n <slot name=\"bottom\" />\n </div>\n </div>\n <div v-if=\"$slots.right\" class=\"mc-preview__right\">\n <!-- @slot Слот справа -->\n <slot name=\"right\" />\n </div>\n </section>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/spacings' as *;\n.mc-preview {\n $block-name: &;\n display: flex;\n flex-wrap: nowrap;\n max-width: 100%;\n &__left {\n flex: 0 0 auto;\n &:empty {\n display: none;\n }\n }\n &__center {\n @include layout-flex-fix();\n flex: 1 1 auto;\n align-self: center;\n }\n &__top {\n &:empty {\n display: none;\n }\n }\n &__bottom {\n &:empty {\n display: none;\n }\n }\n &__right {\n flex: 0 0 auto;\n &:empty {\n display: none;\n }\n }\n @mixin previewIndents($indent, $bottom: '') {\n #{$block-name}__left {\n margin-inline-end: $indent;\n }\n #{$block-name}__right {\n margin-inline-start: $indent;\n }\n @if $bottom {\n #{$block-name}__bottom {\n margin-top: $bottom;\n }\n }\n }\n &--size {\n &-s {\n @include previewIndents($space-50);\n }\n &-m {\n @include previewIndents($space-100);\n }\n &-l {\n @include previewIndents($space-150, $space-50);\n }\n &-xl {\n @include previewIndents($space-200, $space-50);\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useDebounceFn, useDraggable, useLocalStorage, useSessionStorage } from '@vueuse/core'\nimport { computed, type PropType, ref, watch } from 'vue'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport McPreview from '@/components/patterns/McPreview/McPreview.vue'\nimport type { ColorsUnion } from '@/types/styles/Colors'\n\ninterface DraggableInitPayload {\n x: number\n y: number\n}\n\ntype CardIdType = string | number | undefined\ntype StorageTypeUnion = 'local' | 'session'\n\nconst localStorage = useLocalStorage('McDraggable', {})\nconst sessionStorage = useSessionStorage('McDraggable', {})\nconst draggable_el = ref<HTMLElement | null>(null)\nconst debounce = useDebounceFn((method) => {\n method()\n}, 100)\n\nconst props = defineProps({\n /**\n * Дизайн:\n * purple, red, orange и т.д.\n */\n variation: {\n type: String as () => ColorTypes,\n default: 'purple' as ColorTypes\n },\n initial: {\n type: Object as PropType<DraggableInitPayload>,\n default: () =>\n ({\n x: 0,\n y: 0\n }) as DraggableInitPayload\n },\n /**\n * Key for save position to storage (**required**, if savePosition = true)\n * */\n cardId: {\n type: [String, Number] as PropType<CardIdType>\n },\n savePosition: {\n type: Boolean,\n default: false\n },\n storageType: {\n type: String as PropType<StorageTypeUnion>,\n default: 'session'\n }\n})\n\nconst uniqueId = computed((): CardIdType => {\n return props.cardId\n})\n\nconst isSessionStorageType = computed((): boolean => {\n return props.storageType === ('session' as StorageTypeUnion)\n})\nconst isLocalStorageType = computed((): boolean => {\n return props.storageType === ('local' as StorageTypeUnion)\n})\nconst initialPositions = computed((): DraggableInitPayload => {\n let local_x = props.initial.x || 0\n let local_y = props.initial.y || 0\n\n if (props.savePosition && !uniqueId.value)\n console.warn('cardId prop required, if savePosition = true')\n\n if (!uniqueId.value || !props.savePosition) return { x: local_x, y: local_y }\n if (isSessionStorageType.value) {\n //@ts-ignore\n const { x, y } = sessionStorage.value[uniqueId.value] || ({} as DraggableInitPayload)\n local_x = x\n local_y = y\n }\n if (isLocalStorageType.value) {\n //@ts-ignore\n const { x, y } = localStorage.value[uniqueId.value] || ({} as DraggableInitPayload)\n local_x = x\n local_y = y\n }\n return { x: local_x || 0, y: local_y || 0 } as DraggableInitPayload\n})\n\nconst { x, y, style } = useDraggable(draggable_el, {\n initialValue: { x: initialPositions.value.x, y: initialPositions.value.y } as DraggableInitPayload\n})\n\nconst styles = computed((): { [key: string]: ColorsUnion | string } => {\n return {\n '--mc-draggable-color': Colors[props.variation]\n }\n})\n\nconst handleSavePosition = (): void => {\n if (!uniqueId.value) return\n if (isSessionStorageType.value) {\n sessionStorage.value = {\n ...sessionStorage.value,\n [uniqueId.value]: { x: x.value, y: y.value }\n }\n }\n if (isLocalStorageType.value) {\n localStorage.value = {\n ...localStorage.value,\n [uniqueId.value]: { x: x.value, y: y.value }\n }\n }\n}\n\nwatch(\n () => style.value,\n () => {\n if (!props.savePosition) return\n debounce(handleSavePosition)\n }\n)\n</script>\n\n<template>\n <div ref=\"draggable_el\" class=\"mc-draggable\" :style=\"style\" style=\"position: fixed\">\n <div class=\"mc-draggable__inner\" :style=\"styles\">\n <mc-preview>\n <template #left>\n <slot name=\"left\" />\n </template>\n <template #top>\n <slot name=\"top\" />\n </template>\n <template #bottom>\n <slot name=\"bottom\" />\n </template>\n <template #right>\n <slot name=\"right\" />\n </template>\n </mc-preview>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/media-queries' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/border-radius' as *;\n@use '../../../assets/tokens/font-families' as *;\n.mc-draggable {\n cursor: move;\n font-family: $font-family-main;\n &__inner {\n --mc-draggable-color: $color-purple;\n\n padding: $space-100 $space-150 $space-100 $space-200;\n min-height: $size-700;\n display: flex;\n align-items: center;\n position: relative;\n color: white;\n user-select: none;\n &:before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: var(--mc-draggable-color);\n border-radius: $radius-200;\n }\n\n .mc-preview {\n width: 100%;\n z-index: 1;\n &__top {\n margin-bottom: $space-50;\n }\n &__left {\n display: flex;\n align-items: center;\n margin-inline-end: $size-150;\n }\n &__right {\n display: flex;\n align-items: center;\n margin-inline-start: auto;\n padding-inline-start: $space-100;\n }\n }\n\n @media #{$media-query-m-down} {\n .mc-preview {\n flex-wrap: wrap;\n\n &__center {\n flex: 1;\n }\n &__right {\n width: 100%;\n padding-top: $space-100;\n padding-inline-start: $size-400 - 2;\n }\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport { useFieldErrors } from '@/composables/useFieldErrors'\nimport { computed, type PropType, useSlots } from 'vue'\nimport { Sizes, type SizeTypes } from '@/types/styles/Sizes'\nimport { Directions } from '@/enums/ui/Directions'\nimport type { SizesUnion } from '@/types/styles/Sizes'\nimport { TitleVariations, Weights } from '@/enums'\n\nconst emit = defineEmits(['update:modelValue'])\nconst slots = useSlots()\nconst props = defineProps({\n //@ts-ignore\n modelValue: {\n type: [Boolean, String, Number, Array as PropType<string[] | number[]>],\n validator(value: unknown, props: any): boolean {\n return props.multiple ? Array.isArray(value) : true\n }\n },\n /**\n * Name\n *\n */\n name: {\n type: String,\n default: null\n },\n /**\n * Выбранное значение\n *\n */\n checkedValue: {\n type: [String, Boolean, Number],\n default: true\n },\n /**\n * Невыбранное значение\n *\n */\n uncheckedValue: {\n type: [String, Boolean, Number],\n default: false\n },\n\n /**\n * Ошибки\n *\n */\n errors: {\n type: Array as PropType<string[]>,\n default: null\n },\n\n /**\n * Вспомогательный текст под инпутом:\n *\n */\n helpText: {\n type: String,\n default: null\n },\n\n /**\n * Подпись чекбокса:\n *\n */\n mainText: {\n type: String,\n default: null\n },\n\n /**\n * Заголовок поля:\n *\n */\n title: {\n type: String,\n default: null\n },\n\n /**\n * Отключенное состояние\n *\n */\n disabled: {\n type: Boolean,\n default: false\n },\n multiple: {\n type: Boolean,\n default: false\n },\n checkboxSize: {\n type: String as () => SizeTypes,\n default: '250'\n },\n\n /**\n * Атрибут tabindex для главного элемента\n *\n */\n tabindex: {\n type: [String, Number]\n },\n dir: {\n type: String as () => Directions,\n default: Directions.Ltr\n }\n})\n\nconst fieldErrors = useFieldErrors(props.errors)\n\nconst rtl = computed((): boolean => {\n return props.dir === Directions.Rtl\n})\n\nconst classes = computed((): { [key: string]: boolean } => ({\n 'mc-field-checkbox': true,\n 'mc-field-checkbox--error': props.errors,\n 'mc-field-checkbox--disabled': props.disabled,\n 'mc-field-checkbox--empty': !props.mainText && !slots.default,\n 'mc-field-checkbox--rtl': rtl.value\n}))\n\nconst styles = computed((): { [key: string]: SizesUnion | string } => ({\n '--mc-field-checkbox-size': Sizes[props.checkboxSize as SizeTypes]\n}))\n\nconst isChecked = computed((): boolean => {\n return props.multiple && props.modelValue\n ? props.modelValue.includes(props.checkedValue)\n : props.modelValue === props.checkedValue\n})\n\nconst inputProps = computed((): object => ({\n disabled: props.disabled,\n name: props.name,\n checked: isChecked.value,\n tabindex: props.tabindex,\n type: 'checkbox',\n class: 'mc-field-checkbox__input'\n}))\n\nconst handleChange = (e: Event): void => {\n fieldErrors.toggleErrorVisible()\n\n const payload =\n props.multiple && props.modelValue\n ? props.modelValue.includes(props.checkedValue)\n ? props.modelValue.filter((v: boolean) => v !== props.checkedValue)\n : [...props.modelValue, props.checkedValue]\n : //@ts-ignore\n e.target && e.target.checked\n ? props.checkedValue\n : props.uncheckedValue\n\n emit('update:modelValue', payload)\n}\n</script>\n\n<template>\n <div :dir=\"props.dir\" :class=\"classes\" :style=\"styles\">\n <div v-if=\"props.title || $slots.header\" class=\"mc-field-text__header\">\n <!-- @slot Слот заголовка -->\n <slot name=\"header\">\n <mc-title :weight=\"Weights.Medium\">{{ props.title }}</mc-title>\n </slot>\n </div>\n <div class=\"mc-field-checkbox__input-wrap\">\n <label class=\"mc-field-checkbox__name\">\n <mc-svg-icon\n class=\"mc-field-checkbox__icon\"\n :name=\"isChecked ? 'checkbox--checked' : 'checkbox'\"\n :color=\"isChecked ? 'purple' : 'gray'\"\n :size=\"props.checkboxSize\"\n />\n <input v-bind=\"inputProps\" @change=\"handleChange\" />\n <span v-if=\"props.mainText || $slots.default\" class=\"mc-field-checkbox__name-text\">\n <!-- @slot Слот для пользовательской подписи чекбокса -->\n <slot>\n <mc-title tag-name=\"div\">{{ props.mainText }}</mc-title>\n </slot>\n </span>\n </label>\n <div class=\"mc-field-checkbox__footer\">\n <mc-title\n v-if=\"fieldErrors.errorText.value\"\n tag-name=\"div\"\n color=\"red\"\n :variation=\"TitleVariations.Overline\"\n max-width=\"100%\"\n >\n {{ fieldErrors.errorText.value }}\n </mc-title>\n <br v-if=\"fieldErrors.errorText.value\" />\n <!-- @slot Слот доп. текста под чекбоксом -->\n <slot name=\"footer\">\n <mc-title\n v-if=\"props.helpText\"\n tag-name=\"div\"\n :variation=\"TitleVariations.Overline\"\n color=\"gray\"\n max-width=\"100%\"\n >\n {{ props.helpText }}\n </mc-title>\n </slot>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/font-families' as *;\n.mc-field-checkbox {\n $block-name: &;\n font-family: $font-family-main;\n position: relative;\n display: block;\n min-width: var(--mc-field-checkbox-size);\n min-height: var(--mc-field-checkbox-size);\n\n #{$block-name}__icon {\n width: var(--mc-field-checkbox-size);\n height: var(--mc-field-checkbox-size);\n }\n\n &__header {\n @include reset-text-indents();\n display: block;\n margin-bottom: $space-100;\n\n &:empty {\n display: none;\n }\n }\n\n &__name {\n @include reset();\n position: relative;\n line-height: $line-height-200;\n font-size: $font-size-200;\n display: flex;\n align-items: center;\n cursor: pointer;\n user-select: none;\n }\n\n &__icon {\n z-index: 1;\n &:hover {\n color: $color-purple;\n }\n }\n\n &__name-text {\n display: inline-block;\n margin-inline-start: $space-100;\n &:before {\n @include pseudo(none);\n @include size(var(--mc-field-checkbox-size));\n @include position(absolute, 0 null null 0);\n background-size: 100%;\n }\n\n .mc-button {\n display: inline;\n white-space: normal;\n vertical-align: top;\n margin-inline-start: 1px;\n\n &__text {\n white-space: normal;\n display: inline;\n }\n }\n }\n\n &__input {\n display: none;\n }\n\n &__footer {\n padding-inline-start: $space-250;\n margin-top: $space-50;\n &:empty {\n display: none;\n }\n }\n\n &--disabled {\n #{$block-name} {\n &__icon {\n color: $color-outline-gray;\n &:hover {\n color: $color-outline-gray;\n }\n }\n &__name-text {\n &:before {\n display: block;\n border-radius: 2px;\n background-color: $color-hover-gray;\n }\n }\n }\n }\n\n &--empty {\n #{$block-name} {\n &__footer,\n &__name {\n padding: 0;\n margin: 0;\n }\n }\n }\n\n &--rtl {\n direction: rtl;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McTitle from '../McTitle/McTitle.vue'\nimport McSvgIcon from '../McSvgIcon/McSvgIcon.vue'\nimport { computed, type PropType, useSlots, watch } from 'vue'\nimport { type ColorTypes } from '@/types/styles/Colors'\nimport type { SizeTypes } from '@/types/styles/Sizes'\nimport { useFieldErrors } from '@/composables/useFieldErrors'\nimport type { RadioVariationUnion } from '@/types/IRadio'\nimport { Directions } from '@/enums/ui/Directions'\nimport { type DirectionsUnion } from '@/types/IDirections'\nimport type { IconsListUnion } from '@/types/styles/Icons'\nimport { TitleVariations } from '@/enums'\n\nconst slots = useSlots()\nconst emit = defineEmits(['update:modelValue'])\nconst props = defineProps({\n /**\n * Значение\n */\n modelValue: {\n default: null\n },\n value: {\n default: null\n },\n /**\n * Name\n */\n name: {\n type: String,\n required: true\n },\n /**\n * Подпись радио:\n *\n */\n label: {\n type: [String, Number],\n default: null\n },\n /**\n * Вспомогательный текст под инпутом:\n *\n */\n helpText: {\n type: String,\n default: null\n },\n\n /**\n * Ошибки\n *\n */\n errors: {\n type: Array as PropType<string[]>,\n default: null\n },\n /**\n * Отключенное состояние\n *\n */\n disabled: {\n type: Boolean,\n default: false\n },\n\n /**\n * Атрибут tabindex для главного элемента\n *\n */\n tabindex: {\n type: [String, Number]\n },\n /**\n * Вариант активного состояния\n * circle - внутри круг\n * checkmark - внутри галочка\n * */\n variation: {\n type: String as () => RadioVariationUnion,\n default: 'circle'\n },\n /**\n * цвет\n */\n color: {\n type: String as () => ColorTypes,\n default: 'purple'\n },\n iconSize: {\n type: String as () => SizeTypes,\n default: '250'\n },\n dir: {\n type: String as () => DirectionsUnion,\n default: Directions.Ltr\n }\n})\nconst fieldErrors = useFieldErrors(props.errors)\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-field-radio-button--disabled': props.disabled,\n 'mc-field-radio-button--empty': !props.label && !slots.default,\n 'mc-field-radio-button--rtl': rtl.value\n }\n})\nconst rtl = computed((): boolean => {\n return props.dir === Directions.Rtl\n})\n\nconst activeIcon = computed((): IconsListUnion => {\n switch (props.variation) {\n case 'checkmark': {\n return 'check_circle_solid'\n }\n default: {\n return 'radio--checked'\n }\n }\n})\n\nconst iconColor = computed((): ColorTypes => {\n switch (true) {\n case props.disabled:\n return 'outline-gray'\n case inputProps.value.checked:\n return props.color as ColorTypes\n default:\n return 'gray'\n }\n})\n\nconst inputProps = computed((): { [key: string]: any } => {\n return {\n disabled: props.disabled,\n value: props.modelValue,\n name: props.name,\n checked: props.value && props.value === props.modelValue,\n tabindex: props.tabindex,\n class: 'mc-field-radio-button__input',\n type: 'radio'\n }\n})\n\nwatch(\n () => props.modelValue,\n () => {\n fieldErrors.toggleErrorVisible()\n }\n)\n\nconst handleChange = () => {\n emit('update:modelValue', props.value)\n}\n</script>\n\n<template>\n <label :dir=\"props.dir\" class=\"mc-field-radio-button\" :class=\"classes\">\n <input checked v-bind=\"inputProps\" @change=\"handleChange\" />\n <span class=\"mc-field-radio-button__icon_wrapper\">\n <mc-svg-icon\n :name=\"inputProps.checked ? activeIcon : 'circle'\"\n :color=\"iconColor\"\n :size=\"props.iconSize\"\n class=\"mc-field-radio-button__icon\"\n />\n </span>\n <span v-if=\"label || $slots.default\" class=\"mc-field-radio-button__text\">\n <!-- @slot Слот для пользовательской подписи радио -->\n <slot>\n <mc-title>{{ label }}</mc-title>\n </slot>\n <mc-title\n v-if=\"fieldErrors.errorText.value\"\n tag-name=\"div\"\n color=\"red\"\n :variation=\"TitleVariations.Overline\"\n max-width=\"100%\"\n >\n {{ fieldErrors.errorText.value }}\n </mc-title>\n <br v-if=\"fieldErrors.errorText.value\" />\n <!-- @slot -->\n <slot name=\"footer\">\n <mc-title\n v-if=\"props.helpText\"\n tag-name=\"div\"\n :variation=\"TitleVariations.Overline\"\n color=\"gray\"\n max-width=\"100%\"\n >\n {{ props.helpText }}\n </mc-title>\n </slot>\n </span>\n </label>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/border-radius' as *;\n.mc-field-radio-button {\n $block-name: &;\n font-family: $font-family-main;\n min-width: $size-250;\n min-height: $size-250;\n @include reset();\n position: relative;\n line-height: $line-height-200;\n font-size: $font-size-200;\n cursor: pointer;\n display: inline-flex;\n\n &__icon {\n &_wrapper {\n z-index: 1;\n margin-inline-end: $space-50;\n }\n }\n\n &__text {\n display: inline-block;\n margin: 2px 0;\n }\n\n &__input {\n display: none;\n }\n\n &--disabled {\n cursor: auto;\n\n #{$block-name}__input {\n & ~ #{$block-name}__icon_wrapper {\n .mc-svg-icon {\n border-radius: $radius-circle;\n background-color: $color-hover-gray;\n }\n }\n }\n }\n\n &--empty {\n padding: 0;\n margin: 0;\n }\n &--rtl {\n direction: rtl;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McFieldRadioButton from '../McFieldRadio/McFieldRadio.vue'\nimport McTitle from '../McTitle/McTitle.vue'\nimport { computed, type PropType } from 'vue'\nimport { useFieldErrors } from '@/composables/useFieldErrors'\nimport type { IRadioGroupOptions, IRadioGroupOption } from '@/types/IRadioGroup'\nimport { type DirectionsUnion } from '@/types/IDirections'\nimport { Directions } from '@/enums/ui/Directions'\nimport type { RadioGroupDirectionUnion } from '@/types/IRadioGroup'\nimport { RadioGroupDirection } from '@/enums/RadioGroup'\nimport type { RadioVariationUnion } from '@/types/IRadio'\nimport { TitleVariations } from '@/enums'\n\nconst emit = defineEmits(['update:modelValue', 'change'])\n//@ts-ignore\nconst props = defineProps({\n modelValue: [String, Number],\n /**\n * Объект или массив данных\n */\n options: {\n type: [Array as PropType<IRadioGroupOptions>],\n default: () => []\n },\n /**\n * Заголовок:\n *\n */\n title: {\n type: String,\n default: ''\n },\n /**\n * Вспомогательный текст под инпутом:\n *\n */\n helpText: {\n type: String,\n default: ''\n },\n /**\n * Ошибки\n *\n */\n errors: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n /**\n * Name\n */\n name: {\n type: String,\n required: true\n },\n /**\n * Отключенное состояние\n * всего списка\n */\n disabled: {\n type: Boolean,\n default: false\n },\n /**\n * Добавление пользовательского\n * класса к radio\n */\n radioClassName: {\n type: String,\n default: ''\n },\n /**\n * Направление списка\n * `column`, `row`\n */\n direction: {\n type: String as () => RadioGroupDirectionUnion,\n default: RadioGroupDirection.Column\n },\n dir: {\n type: String as () => DirectionsUnion,\n default: Directions.Ltr\n },\n /**\n * Вариант активного состояния\n * circle - внутри круг\n * checkmark - внутри галочка\n * */\n variation: {\n type: String as () => RadioVariationUnion,\n default: 'circle'\n }\n})\n\nconst fieldErrors = useFieldErrors(props.errors)\n\nconst computedOptions = computed((): object => {\n if (!props.options.length) return []\n return props.options.map((o: IRadioGroupOption, i: number) => {\n const optionData = typeof o === 'object' ? o : ({ label: o, value: o } as IRadioGroupOption)\n return {\n id: Date.now() + i,\n ...optionData,\n disabled: props.disabled || optionData.disabled,\n value: optionData.value,\n modelValue: props.modelValue,\n class: props.radioClassName,\n dir: props.dir,\n variation: props.variation\n }\n })\n})\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n [`mc-field-radio-group--direction-${props.direction}`]: !!props.direction\n }\n})\n\n/**\n * Событие по смене выбора\n * @property {event}\n */\nconst handleInput = (e: string | number): void => {\n fieldErrors.toggleErrorVisible()\n emit('update:modelValue', e)\n emit('change', e)\n}\n</script>\n\n<template>\n <div :dir=\"props.dir\" class=\"mc-field-radio-group\" :class=\"classes\">\n <div class=\"mc-field-radio-group__header\">\n <!-- @slot Слот заголовка -->\n <slot name=\"header\">\n <mc-title v-if=\"props.title\">{{ props.title }}</mc-title>\n </slot>\n </div>\n <div class=\"mc-field-radio-group__buttons\">\n <mc-field-radio-button\n v-for=\"radio in computedOptions\"\n :key=\"radio.id\"\n v-bind=\"radio\"\n :name=\"props.name\"\n @update:modelValue=\"handleInput\"\n />\n </div>\n <div v-if=\"fieldErrors.errorText.value || props.helpText || $slots.footer\" class=\"mc-field-radio-group__footer\">\n <mc-title\n v-if=\"fieldErrors.errorText.value\"\n tag-name=\"div\"\n color=\"red\"\n :variation=\"TitleVariations.Overline\"\n max-width=\"100%\"\n >\n {{ fieldErrors.errorText.value }}\n </mc-title>\n <br v-if=\"fieldErrors.errorText.value\" />\n <!-- @slot Слот доп. текста под инпутом -->\n <slot name=\"footer\">\n <mc-title\n v-if=\"props.helpText\"\n tag-name=\"div\"\n :variation=\"TitleVariations.Overline\"\n color=\"gray\"\n max-width=\"100%\"\n >\n {{ props.helpText }}\n </mc-title>\n </slot>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/line-heights' as *;\n.mc-field-radio-group {\n $block-name: &;\n\n &__header {\n @include reset-text-indents();\n display: block;\n margin-bottom: $space-100;\n\n &:empty {\n display: none;\n }\n }\n\n &__footer {\n line-height: $line-height-150;\n\n &:empty {\n display: none;\n }\n }\n\n &--direction {\n &-column {\n #{$block-name}__buttons {\n display: flex;\n flex-direction: column;\n @include child-indent-bottom($space-100);\n }\n }\n &-row {\n #{$block-name}__buttons {\n @include child-indent-right($space-100);\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport VueSlider from 'vue-3-slider-component'\nimport { computed, type PropType, reactive } from 'vue'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport type { TooltipPositionsUnion } from '@/types/ITooltip'\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport { useFieldErrors } from '@/composables/useFieldErrors'\nimport { TitleVariations, Weights } from '@/enums'\n\ntype RangeValue = string[] | number[] | number | string | null\n\nconst emit = defineEmits(['update:modelValue', 'dragging'])\nconst props = defineProps({\n /**\n * Значение\n */\n modelValue: {\n type: [Number, String, Array] as PropType<RangeValue>,\n required: true\n },\n /**\n * Мин. значение\n */\n min: {\n type: [String, Number] as PropType<number | string>,\n default: 0\n },\n /**\n * Макс. значение\n */\n max: {\n type: [String, Number] as PropType<number | string>,\n default: 100\n },\n /**\n * The interval between two values.\n */\n step: {\n type: [String, Number] as PropType<number | string>,\n default: 1\n },\n title: {\n type: String as PropType<string | null>,\n default: null\n },\n helpText: {\n type: String as PropType<string | null>,\n default: null\n },\n /**\n * Цвет слайдера\n */\n color: {\n type: String as () => ColorTypes,\n default: 'purple'\n },\n /**\n * Is it lazy to update the value.\n * Useful whenever you need to consume a high-loss operation\n */\n lazy: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Whether to disable the component.\n */\n disabled: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Control Tooltip display.\n * 'none' | 'always' | 'hover' | 'focus' | 'active'\n */\n tooltip: {\n type: String as PropType<string>,\n default: 'hover'\n },\n /**\n * The placement of the Tooltip.\n * 'top' | 'right' | 'bottom' | 'left'\n */\n tooltipPlacement: {\n type: String as () => TooltipPositionsUnion,\n default: 'top'\n },\n coloredTooltip: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n smooth: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n showLabels: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n errors: {\n type: Array as PropType<string[]>,\n default: () => []\n }\n})\n\nconst fieldErrors = useFieldErrors(props.errors)\n\nconst tooltipFormatter = (value: string): string => {\n //@ts-ignore\n if (Number(value) !== value) return value\n return ('' + value).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ')\n}\n\nconst computedValue = computed({\n get() {\n return props.modelValue\n },\n set(value) {\n handleInput(value)\n }\n})\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-range-slider': true,\n [`mc-range-slider--color-${props.color}`]: !!props.color,\n 'mc-range-slider--colored-tooltip': props.coloredTooltip\n }\n})\n\nconst styles = computed((): { [key: string]: string } => {\n return {\n '--mc-range-slider-color': Colors[props.color]\n }\n})\n\nconst sliderProps = reactive({\n style: styles.value,\n interval: +props.step,\n min: +props.min,\n max: +props.max,\n disabled: props.disabled,\n lazy: props.lazy,\n tooltip: props.tooltip,\n marks: props.showLabels,\n adsorb: !props.smooth,\n 'tooltip-placement': props.tooltipPlacement,\n 'tooltip-formatter': tooltipFormatter,\n 'dot-size': 20\n})\nconst handleInput = (value: RangeValue): void => {\n /**\n * Событие по изменению значения\n */\n emit('update:modelValue', value)\n}\n\nconst handleDrag = (value: RangeValue): void => {\n /**\n * Событие по изменению значения\n * (если нужно отслеживать value в ленивом режиме)\n */\n emit('dragging', value)\n}\n</script>\n\n<template>\n <div :class=\"classes\">\n <div class=\"mc-field-range__header\">\n <!-- @slot Слот заголовка -->\n <slot name=\"header\">\n <mc-title v-if=\"props.title\" :weight=\"Weights.Medium\">\n {{ props.title }}\n </mc-title>\n </slot>\n </div>\n <vue-slider v-model=\"computedValue\" v-bind=\"sliderProps\" @change=\"handleInput\" @dragging=\"handleDrag\" />\n <template v-if=\"(fieldErrors.errorText.value || props.helpText || $slots.footer) && props.showLabels\">\n <br />\n </template>\n <div v-if=\"fieldErrors.errorText.value || props.helpText || $slots.footer\" class=\"mc-field-range__footer\">\n <template v-if=\"fieldErrors.errorText.value\">\n <mc-title\n tag-name=\"div\"\n color=\"red\"\n :variation=\"TitleVariations.Overline\"\n class=\"mc-field-range__error-text\"\n :html-data=\"fieldErrors.errorText.value\"\n />\n <br />\n </template>\n <!-- @slot Слот доп. текста под инпутом -->\n <slot name=\"footer\">\n <mc-title\n v-if=\"props.helpText\"\n tag-name=\"div\"\n :variation=\"TitleVariations.Overline\"\n color=\"gray\"\n max-width=\"100%\"\n >\n {{ helpText }}\n </mc-title>\n </slot>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/box-shadows' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/font-families' as *;\n.mc-range-slider {\n $block-name: &;\n font-family: $font-family-main;\n --mc-range-slider-color: #{$color-purple};\n &__header {\n @include reset-text-indents();\n display: block;\n margin-bottom: $space-100;\n\n &:empty {\n display: none;\n }\n }\n &__footer {\n margin-top: $space-50;\n line-height: $line-height-150;\n\n &:empty {\n display: none;\n }\n }\n\n .vue-slider-dot-tooltip-inner {\n line-height: $line-height-200;\n font-size: $font-size-200;\n padding: $space-100 $space-150;\n background-color: $color-black;\n border-color: $color-black;\n }\n .vue-slider-process {\n background-color: var(--mc-range-slider-color);\n }\n\n .vue-slider-dot-handle-focus {\n box-shadow: $shadow-s;\n }\n .vue-slider-dot-handle {\n box-shadow: $shadow-s;\n &:hover {\n border: 2px solid var(--mc-range-slider-color);\n }\n &:active {\n border: 2px solid var(--mc-range-slider-color);\n }\n }\n &--colored-tooltip {\n .vue-slider-dot-tooltip-inner {\n background-color: var(--mc-range-slider-color);\n border-color: var(--mc-range-slider-color);\n padding: $space-100 $space-150;\n }\n }\n &.vue-slider {\n .vue-slider-rail {\n cursor: pointer;\n }\n &-disabled {\n .vue-slider-rail {\n cursor: auto;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport type { TooltipPositionsUnion, TooltipSizesUnion } from '@/types/ITooltip'\nimport { useTooltip } from '@/composables/useTooltip'\nimport { computed, type PropType } from 'vue'\nimport type { ITooltip } from '@/types/ITooltip'\nimport { TooltipPositions, TooltipSizes } from '@/enums/Tooltip'\n\nconst vTooltip = useTooltip()\n\nconst props = defineProps({\n /**\n * Текст подсказки:\n */\n content: {\n type: String as PropType<string>,\n required: true,\n },\n /**\n * Расположение:\n */\n placement: {\n type: String as () => TooltipPositionsUnion,\n default: TooltipPositions.Top,\n },\n /**\n * Цвет:\n */\n color: {\n type: String as () => ColorTypes,\n default: Colors.black,\n },\n /**\n * Цвет текста:\n */\n textColor: {\n type: String as () => ColorTypes,\n default: Colors.white,\n },\n /**\n * Максимальный размер\n */\n size: {\n type: String as () => TooltipSizesUnion,\n default: TooltipSizes.S,\n },\n /**\n * Всключить стрелку\n */\n arrowVisible: {\n type: Boolean as PropType<boolean>,\n default: true,\n },\n})\n\nconst tooltipProps = computed<ITooltip>((): ITooltip => {\n return {\n content: props.content,\n size: props.size,\n placement: props.placement,\n arrow: props.arrowVisible,\n color: props.color,\n textColor: props.textColor,\n } as ITooltip\n})\n</script>\n\n<template>\n <div v-tooltip=\"tooltipProps\" class=\"mc-tooltip-target\">\n <!-- @slot Слот для элемента, у которого будет всплывать тултип -->\n <slot />\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/tooltip' as *;\n@use '../../../assets/tokens/font-families' as *;\n\n.mc-tooltip-target {\n $block-name: &;\n max-width: 100%;\n width: max-content;\n font-family: $font-family-main;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type PropType, ref, watch } from 'vue'\nimport MultiSelect from 'vue-multiselect'\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport McAvatar from '@/components/elements/McAvatar/McAvatar.vue'\nimport McTooltip from '@/components/elements/McTooltip/McTooltip.vue'\nimport McPreview from '@/components/patterns/McPreview/McPreview.vue'\nimport type { ISelectGroupOptions, ISelectOption, ISelectOptions } from '@/types/ISelect'\nimport { type DirectionsUnion } from '@/types/IDirections'\nimport { Directions } from '@/enums/ui/Directions'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport { useFieldErrors } from '@/composables/useFieldErrors'\nimport type { IconsListUnion } from '@/types/styles/Icons'\nimport { SelectGroupKeys } from '@/enums/Select'\nimport type { SelectListDirectionsUnion } from '@/types/ISelect'\nimport { PreviewSizes, TitleVariations, TooltipPositions, Weights } from '@/enums'\n\nconst emit = defineEmits<{\n (e: 'original-input', value: ISelectOptions[]): void\n (e: 'tag', value: string): void\n (e: 'search-change', value: string): void\n (e: 'update:modelValue', value: string[] | number[] | string | number | null): void\n (e: 'handle-open'): void\n (e: 'handle-close'): void\n}>()\nconst props = defineProps({\n /**\n * Значение\n */\n modelValue: {\n type: [Array, String, Number] as PropType<string[] | number[] | string | number | null>\n },\n /**\n * Заголовок поля:\n *\n */\n title: {\n type: String as PropType<string>,\n default: null\n },\n\n /**\n * Вспомогательный текст под инпутом:\n *\n */\n helpText: {\n type: String as PropType<string>,\n default: null\n },\n /**\n * Массив элементов\n * выпадающего списка\n * [\n * {\n * name: String,\n * value: String | Number,\n * text: String - доступен, если optionWithPreview=true\n * icon: String - доступен, если optionWithPreview=true\n * }\n * ]\n */\n options: {\n type: Array as PropType<ISelectOptions | ISelectGroupOptions>,\n default: () => [] as ISelectOptions\n },\n /**\n * Выполняется ли поиск из списка\n * при вводе в инпут\n */\n searchable: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Множественный выбор\n */\n multiple: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Скрывать из списка\n * выбранные элементы\n */\n hideSelected: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Допустимо ли\n * пустое значение\n */\n allowEmpty: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Отключенное состояние\n */\n disabled: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Ссылка на аватар/картинку\n * в начале label\n */\n avatar: {\n type: String as PropType<string>,\n default: null\n },\n /**\n * Имя иконки\n * в начале label\n */\n icon: {\n type: String as () => IconsListUnion,\n default: null\n },\n /**\n * Цвет фона\n */\n backgroundColor: {\n type: String as () => ColorTypes,\n default: null\n },\n /**\n * placeholder\n */\n placeholder: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Направление открытия списка:\n * `above (top), below (bottom), auto`\n */\n openDirection: {\n type: String as () => SelectListDirectionsUnion,\n default: 'auto'\n },\n /**\n * Селект в режиме тэгирования, когда можно вводить свои значения и добавлять их в опции\n * */\n taggable: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Помечать в списке выбранные\n * элементы\n */\n showLabels: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Поиск по опциям\n * */\n internalSearch: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Ошибки\n */\n errors: {\n type: Array as PropType<string[]>,\n default: null\n },\n /**\n * Name\n */\n name: {\n type: String as PropType<string>,\n required: true\n },\n /**\n * Если нужен тултип\n * над элементами списка\n */\n optionsTooltip: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * При группировке опций, дает возвожность выбрать сразу группу\n * */\n groupSelect: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n required: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Если айтемам в селекте нужны превью с иконками и описанием\n */\n optionWithPreview: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n tabindex: {\n type: [String, Number],\n default: null\n },\n /**\n * Если нужно ограничить максимальную высоту блока с выбранными элементами\n */\n maxHeight: {\n type: String as PropType<string>,\n default: null\n },\n /**\n * Рендерить ли выпадающий список абсолютно, что бы помещался в ограниченном пространстве\n * */\n renderAbsoluteList: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Для какого языка селект\n */\n locale: {\n type: String as PropType<string>,\n default: null\n },\n /**\n * Текст для пустого селекта, когда неичего не найдено\n */\n noResultsText: {\n type: String as PropType<string>,\n default: 'No results'\n },\n /**\n * Показывать ли состояние лоадинга\n */\n loading: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n dir: {\n type: String as () => DirectionsUnion,\n default: Directions.Ltr\n },\n /**\n * На какое после смотреть что бы считать его заголовком строки\n * */\n titleField: {\n type: String as PropType<string>,\n default: 'name'\n },\n /**\n * На какое после смотреть что бы считать его значением строки\n * */\n valueField: {\n type: String as PropType<string>,\n default: 'value'\n }\n})\n\nconst fieldErrors = useFieldErrors(props.errors)\nconst searchValue = ref<string | null>(null)\nconst field_select_ref = ref<InstanceType<typeof MultiSelect> | null>(null)\nconst field_select_wrapper_ref = ref<InstanceType<typeof HTMLDivElement> | null>(null)\nconst local_options = ref<ISelectOptions>([])\n\nconst isGroupedOptions = computed((): boolean => {\n return props.options.some(\n (o) =>\n Object.prototype.hasOwnProperty.call(o, SelectGroupKeys.Label) &&\n Object.prototype.hasOwnProperty.call(o, SelectGroupKeys.Values) &&\n //@ts-ignore\n Array.isArray(o[SelectGroupKeys.Values])\n )\n})\nconst hasTitle = computed(() => {\n return !!props.title\n})\nconst hasPrepend = computed(() => {\n return props.avatar || props.icon\n})\nconst isValueMustBeArray = computed(() => {\n return props.multiple\n})\n\nconst tagBind = computed(() => {\n return {\n label: props.titleField,\n trackBy: props.valueField,\n loading: props.loading,\n options: computedOptions.value,\n searchable: props.searchable,\n showLabels: props.showLabels,\n multiple: props.multiple,\n hideSelected: props.hideSelected,\n allowEmpty: props.allowEmpty,\n openDirection: props.openDirection,\n id: props.name,\n taggable: props.taggable,\n tagPlaceholder: '',\n placeholder: props.placeholder,\n disabled: props.disabled,\n internalSearch: props.internalSearch,\n tabindex: +props.tabindex,\n groupSelect: props.groupSelect && props.multiple,\n ...(isGroupedOptions.value ? { groupLabel: SelectGroupKeys.Label } : {}),\n ...(isGroupedOptions.value ? { groupValues: SelectGroupKeys.Values } : {})\n }\n})\n\nconst computedOptions = computed((): ISelectOptions => {\n //@ts-ignore\n return !isGroupedOptions.value\n ? ([...props.options, ...local_options.value].filter(\n //@ts-ignore\n (v, i, a) => a.findIndex((afi: ISelectOption) => afi[props.valueField] === v[props.valueField]) === i\n ) as ISelectOptions)\n : props.options\n})\nconst rtl = computed((): boolean => {\n return props.dir === Directions.Rtl\n})\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-field-select': true,\n 'mc-field-select--error': !!fieldErrors.errorText.value,\n 'mc-field-select--disabled': props.disabled,\n [`mc-field-select--bg-${props.backgroundColor}`]: !!props.backgroundColor,\n 'mc-field-select--is-empty-options-list': isEmptyOptionsList.value || props.loading,\n 'mc-field-select--with-preview': props.optionWithPreview,\n 'mc-field-select--max-height': !!props.maxHeight,\n 'mc-field-select--rtl': rtl.value\n }\n})\nconst computedTitle = computed(() => {\n return `${props.title}${props.required ? ' *' : ''}`\n})\nconst styles = computed((): { [key: string]: string } => {\n const darkColors = ['gray', 'dark-gray', 'black']\n const lightColors = ['white']\n let placeHolderColor: ColorTypes = 'gray'\n let borderColor: ColorTypes = props.backgroundColor\n let backgroundColor: ColorTypes = props.backgroundColor\n let labelColor: ColorTypes = 'black'\n if (!props.backgroundColor || lightColors.includes(props.backgroundColor)) {\n borderColor = 'purple'\n }\n if (darkColors.includes(props.backgroundColor)) {\n labelColor = 'white'\n placeHolderColor = 'white'\n borderColor = 'black'\n }\n if (props.disabled && !props.backgroundColor) {\n backgroundColor = 'hover-gray'\n }\n return {\n '--mc-field-select-max-height': props.maxHeight,\n '--mc-field-select-color': backgroundColor && Colors[backgroundColor],\n '--mc-field-select-border-color': borderColor && Colors[borderColor],\n '--mc-field-select-label-color': Colors[labelColor],\n '--mc-field-select-placeholder-color': Colors[placeHolderColor]\n }\n})\n\nconst isEmptyOptionsList = computed((): boolean => {\n if ((props.hideSelected && !searchValue.value) || !props.options.length) {\n if (props.multiple) {\n if (isGroupedOptions.value) return false\n return Array.isArray(props.modelValue) && props.options.length === props.modelValue.length\n } else {\n return !!props.modelValue && computedOptions.value?.length === 1 && !searchValue.value\n }\n } else if (props.options.length === 0) return !props.options.length\n return false\n})\n\nconst computedModelValue = computed({\n get() {\n let preparedValue: any = isValueMustBeArray.value ? props.modelValue || [] : [props.modelValue].filter(Boolean)\n preparedValue = preparedValue.map((pv: string): ISelectOption => {\n //@ts-ignore\n const options = isGroupedOptions.value\n ? computedOptions.value.map((co) => co[SelectGroupKeys.Values]).flat()\n : computedOptions.value\n const item = options.find((co) => String(co[props.valueField]) === String(pv))\n return {\n [props.titleField]: item?.[props.titleField],\n [props.valueField]: item?.[props.valueField],\n text: item?.text,\n icon: item?.icon\n }\n })\n\n const [first] = preparedValue\n return isValueMustBeArray.value ? preparedValue : first\n },\n set(value) {\n let preparedValue = isValueMustBeArray.value ? (Array.isArray(value) ? value : []) : [value]\n preparedValue = preparedValue.filter(Boolean).map((v) => v[props.valueField])\n\n const [first] = preparedValue\n emitOriginalInput(value)\n emitInput(isValueMustBeArray.value ? preparedValue : first)\n }\n})\n\nconst actualizeSavedOptions = (): void => {\n //Фильтруем локальные опции и оставляем только те, значения которых выбраны в селекте\n local_options.value = local_options.value.filter((lo: ISelectOption) =>\n props.modelValue?.constructor === Array\n ? props.modelValue.map((v) => String(v)).includes(String(lo[props.valueField]))\n : String(lo[props.valueField]) === String(props.modelValue)\n )\n\n //Делаем Юник, что бы опции не повторялись\n local_options.value = local_options.value.filter(\n (v, i, a) => a.findIndex((afi) => String(afi[props.valueField]) === String(v[props.valueField])) === i\n )\n}\n\nconst handleTag = (value: string): void => {\n const preparedValue = { [props.titleField]: value, [props.valueField]: value }\n local_options.value.push(preparedValue)\n\n computedModelValue.value = isValueMustBeArray.value ? [...computedModelValue.value, preparedValue] : preparedValue\n /**\n * Событие по добавлению\n * тега в опции (по Enter)\n */\n emit('tag', value)\n}\n\nconst handleSearchChange = (value: string): void => {\n searchValue.value = value\n /**\n * Событие по вводу данных в инпут\n */\n emit('search-change', value)\n}\n\nconst emitInput = (value: number[] | string[] | number | string): void => {\n fieldErrors.toggleErrorVisible()\n /**\n * Событие инпута (выбранное значение)\n */\n emit('update:modelValue', value)\n}\nconst emitOriginalInput = (value: ISelectOptions[]): void => {\n /**\n * Истинное значение инпута\n */\n emit('original-input', value)\n}\n\nconst handleOpen = (): void => {\n emit('handle-open')\n}\nconst handleClose = (): void => {\n emit('handle-close')\n}\n\nwatch(\n () => props.options,\n (val) => {\n //Пушим все входящие опции в локальные опции\n local_options.value.push(...val)\n actualizeSavedOptions()\n },\n { immediate: true }\n)\n\nwatch(\n () => props.modelValue,\n () => {\n actualizeSavedOptions()\n },\n { immediate: true, deep: true }\n)\n</script>\n\n<template>\n <div ref=\"field_select_wrapper_ref\" :dir=\"dir\" :class=\"classes\" :style=\"styles\">\n <div class=\"mc-field-select__header\">\n <!-- @slot Слот заголовка -->\n <slot name=\"header\">\n <mc-title v-if=\"hasTitle\" max-width=\"100%\" :weight=\"Weights.Medium\">\n {{ computedTitle }}\n </mc-title>\n </slot>\n </div>\n <div class=\"mc-field-select__main\">\n <multi-select\n ref=\"field_select_ref\"\n v-model=\"computedModelValue\"\n v-bind=\"tagBind\"\n @tag=\"handleTag\"\n @search-change=\"handleSearchChange\"\n @open=\"handleOpen\"\n @close=\"handleClose\"\n >\n <template #singleLabel=\"{ option }\">\n <mc-preview v-if=\"props.optionWithPreview\" class=\"option__desc\" :size=\"PreviewSizes.L\">\n <template v-if=\"!!option.icon\" #left>\n <mc-svg-icon :name=\"option.icon\" size=\"400\" />\n </template>\n <template #top>\n <mc-title :weight=\"Weights.SemiBold\" :html-data=\"option[props.titleField]\" />\n </template>\n <!-- Слот для замены стандартной стрелки при выведенном превью -->\n <template #right>\n <!-- @slot -->\n <slot name=\"arrow\" />\n </template>\n <template v-if=\"!!option.text\" #bottom>\n <mc-title color=\"gray\">{{ option.text }}</mc-title>\n </template>\n </mc-preview>\n <div v-else class=\"mc-field-select__single-label\">\n <div v-if=\"hasPrepend\" class=\"mc-field-select__prepend\">\n <mc-avatar v-if=\"avatar\" :src=\"avatar\" />\n <mc-svg-icon v-else :name=\"props.icon\" />\n </div>\n <div\n class=\"mc-field-select__label-text\"\n :class=\"hasPrepend ? 'mc-field-select__label-text--indent-left' : ''\"\n >\n {{ option ? option[props.titleField] : placeholder }}\n </div>\n </div>\n </template>\n\n <template v-if=\"optionsTooltip || props.optionWithPreview\" #option=\"{ option }\">\n <mc-preview v-if=\"props.optionWithPreview\" class=\"option__desc\" :size=\"PreviewSizes.L\">\n <template v-if=\"!!option.icon\" #left>\n <mc-svg-icon :name=\"option.icon\" size=\"400\" />\n </template>\n <template #top>\n <mc-title :weight=\"Weights.SemiBold\" :html-data=\"option[props.titleField]\" />\n </template>\n <template v-if=\"!!option.text\" #bottom>\n <mc-title color=\"gray\">{{ option.text }}</mc-title>\n </template>\n </mc-preview>\n <mc-tooltip\n v-else\n class=\"mc-field-select__options-tooltip-target\"\n max-width=\"m\"\n color=\"black\"\n :placement=\"TooltipPositions.Top\"\n :content=\"option[props.titleField]\"\n >\n <span>{{ option[props.titleField] }}</span>\n </mc-tooltip>\n </template>\n <template #noResult>\n <!-- @slot Слот для текста, если ничего не найдено -->\n <slot name=\"noResult\">\n <span>{{ props.noResultsText }}</span>\n </slot>\n </template>\n </multi-select>\n </div>\n <div v-if=\"fieldErrors.errorText.value || props.helpText || $slots.footer\" class=\"mc-field-select__footer\">\n <mc-title\n v-if=\"fieldErrors.errorText.value\"\n tag-name=\"div\"\n color=\"red\"\n :variation=\"TitleVariations.Overline\"\n max-width=\"100%\"\n >\n {{ fieldErrors.errorText.value }}\n </mc-title>\n <br v-if=\"fieldErrors.errorText.value\" />\n <!-- @slot Слот доп. текста под инпутом -->\n <slot name=\"footer\">\n <mc-title\n v-if=\"props.helpText\"\n tag-name=\"div\"\n :variation=\"TitleVariations.Overline\"\n color=\"gray\"\n max-width=\"100%\"\n >\n {{ props.helpText }}\n </mc-title>\n </slot>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use 'vue-multiselect/dist/vue-multiselect.css' as *;\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/durations' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/box-shadows' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/font-weights' as *;\n@use '../../../assets/tokens/border-radius' as *;\n.mc-field-select {\n $block-name: &;\n --mc-field-select-color: initial;\n --mc-field-select-label-color: #{$color-black};\n --mc-field-select-border-color: initial;\n --mc-field-select-max-height: initial;\n --mc-field-select-placeholder-color: #{$color-gray};\n font-family: $font-family-main;\n @include custom-scroll($space-100);\n &__header {\n @include reset-text-indents();\n display: block;\n margin-bottom: $space-100;\n\n &:empty {\n display: none;\n }\n }\n &__footer {\n margin-top: $space-50;\n line-height: $line-height-150;\n &:empty {\n display: none;\n }\n }\n &__single-label {\n @include reset-text-indents();\n position: relative;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n @include child-indent-right($space-50);\n }\n &__prepend {\n position: absolute;\n }\n &__label-text {\n @include ellipsis();\n font-size: $font-size-200;\n line-height: $line-height-200;\n padding-inline-start: $space-50;\n color: var(--mc-field-select-label-color);\n &--indent-left {\n margin-inline-start: $space-300;\n }\n }\n .multiselect {\n &__placeholder {\n @include ellipsis();\n color: var(--mc-field-select-placeholder-color);\n font-size: $font-size-200;\n line-height: $line-height-200;\n margin-bottom: $space-150 - 1px;\n padding-top: $space-150 - 1px;\n padding-inline-start: $space-50;\n width: 100%;\n }\n &__single {\n font-size: $font-size-200;\n line-height: $line-height-200;\n padding-inline-start: $space-50;\n margin-bottom: $space-150 - 1px;\n margin-top: $space-150 - 1px;\n background-color: transparent;\n min-height: auto;\n @include input-placeholder() {\n color: $color-gray;\n }\n }\n &__input {\n padding-inline-start: $space-50;\n margin-bottom: $space-150 - 2px;\n padding-top: $space-150 - 1px;\n font-size: $font-size-200;\n line-height: $line-height-200;\n min-height: auto;\n background-color: $color-transparent;\n @include input-placeholder() {\n color: $color-gray;\n }\n }\n &__select {\n overflow: hidden;\n height: $space-350;\n width: $space-300;\n inset-inline-end: $space-100;\n top: 6px;\n padding: 0;\n z-index: 1;\n &::before {\n direction: ltr;\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-top: 5px solid var(--mc-field-select-label-color);\n }\n }\n &__tags {\n @include reset-text-indents();\n position: relative;\n border: 1px solid $color-outline-gray;\n border-radius: $radius-100 !important;\n padding: 0;\n padding-inline: $space-100 $space-500;\n overflow: hidden;\n text-align: start;\n &:hover {\n border-color: $color-purple;\n }\n &:before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n @include size(100%);\n background-color: var(--mc-field-select-color);\n opacity: 0.6;\n }\n }\n &__tags-wrap {\n position: relative;\n padding-top: 4px;\n padding-bottom: 3px;\n top: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: -1px;\n min-height: $size-500 - 2px;\n @include child-indent-right($space-100);\n }\n &__tag {\n display: inline-flex;\n align-items: center;\n height: $size-300;\n font-family: $font-family-main;\n margin-top: $space-50;\n margin-bottom: $space-50;\n margin-right: unset;\n background-color: $color-lighter-purple;\n color: $color-black;\n padding: $size-50 $size-50 $size-50 $size-100;\n border-radius: 100px;\n font-size: $font-size-200;\n line-height: $line-height-200;\n span {\n @include ellipsis();\n flex: 1 1 auto;\n //overflow: visible;\n }\n }\n &__tag-icon {\n @include size($size-200);\n position: relative;\n background-color: $color-purple;\n border-radius: $radius-circle;\n flex: 0 0 auto;\n margin-inline-start: $space-100;\n &:hover {\n background-color: $color-red;\n }\n &::after {\n @include align(true, true, absolute);\n top: 45%;\n color: $color-white;\n }\n }\n &__content {\n padding: $size-100;\n max-width: 100%;\n font-size: $font-size-200;\n line-height: $line-height-200;\n }\n &__content-wrapper {\n top: calc(100% + #{$size-100});\n border: none;\n border-radius: $radius-150;\n box-shadow: $shadow-s;\n transition: opacity $duration-s ease;\n overflow-y: auto;\n overflow-x: hidden;\n max-height: 300px;\n }\n &--above {\n .multiselect__content-wrapper {\n bottom: calc(100% + #{$size-100});\n top: auto;\n }\n }\n &__option {\n min-height: $size-500;\n display: flex;\n align-items: center;\n border-radius: $radius-100;\n padding: $space-150;\n span {\n @include ellipsis();\n }\n &--highlight {\n background-color: $color-hover-gray;\n color: $color-black;\n }\n &--selected {\n background-color: $color-lighter-purple !important;\n color: $color-black !important;\n font-weight: $font-weight-medium;\n }\n &--group.multiselect__option--disabled {\n background-color: $color-white !important;\n }\n }\n\n &--active {\n .multiselect {\n &__tags {\n border-color: var(--mc-field-select-border-color);\n &:before {\n background-color: $color-transparent;\n }\n }\n &__select {\n &::before {\n border-color: $color-purple $color-transparent $color-transparent;\n }\n }\n }\n }\n &__spinner {\n &:after,\n &:before {\n border-top-color: $color-purple;\n @include size($space-300);\n top: calc(50% - 8px);\n left: calc(50% - 3px);\n }\n }\n }\n\n &--error {\n .multiselect {\n &__tags {\n border-color: $color-red !important;\n }\n }\n }\n\n &--is-empty-options-list {\n .multiselect {\n &__content-wrapper {\n display: none !important;\n }\n }\n }\n\n &--disabled {\n cursor: not-allowed;\n .multiselect--disabled {\n opacity: 1;\n background: transparent;\n .multiselect {\n &__placeholder {\n color: $color-gray;\n }\n &__single {\n & #{$block-name}__label-text {\n color: $color-gray;\n }\n }\n &__select {\n background-color: transparent;\n &::before {\n border-color: $color-outline-gray transparent transparent;\n }\n }\n }\n }\n }\n\n &--with-preview {\n .mc-preview {\n align-items: center;\n }\n .multiselect {\n &__select {\n display: none;\n }\n &__tags {\n padding: 0;\n padding-inline: $space-100;\n cursor: pointer;\n border-color: $color-outline-light;\n }\n }\n }\n\n &--max-height {\n .multiselect {\n &__tags {\n max-height: var(--mc-field-select-max-height);\n overflow-y: auto;\n position: initial;\n }\n &__spinner {\n background: transparent;\n right: calc(#{$space-50} / 2);\n top: calc(#{$space-50} / 2);\n }\n }\n }\n\n &__options-tooltip-target {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &--rtl {\n direction: rtl;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { IMaskComponent, IMask } from 'vue-imask'\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport McTooltip from '@/components/elements/McTooltip/McTooltip.vue'\nimport { Spaces } from '@/types/styles/Spaces'\nimport { computed, onMounted, type PropType, ref, useAttrs, useSlots } from 'vue'\nimport type { DirectionsUnion } from '@/types/IDirections'\nimport { Directions } from '@/enums/ui/Directions'\nimport type { InputTypesUnion, InputValue } from '@/types/IInput'\nimport { useFieldErrors } from '@/composables/useFieldErrors'\nimport { InputTypes, Autocomplete } from '@/enums/Input'\nimport type { IconsListUnion } from '@/types/styles/Icons'\nimport { type ColorTypes } from '@/types/styles/Colors'\nimport { useTextareaAutosize } from '@vueuse/core'\nimport { ButtonSize, ButtonType, HorizontalAlignment, TitleVariations, Weights } from '@/enums'\n\nconst { textarea } = useTextareaAutosize()\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n (e: 'keydown', value: KeyboardEvent): void\n (e: 'copy', value: string): void\n}>()\nconst slots = useSlots()\nconst attrs = useAttrs()\nconst props = defineProps({\n /**\n * Значение\n *\n */\n modelValue: {\n type: [String, Number] as PropType<InputValue>,\n default: null\n },\n /**\n * Тип:\n * `textarea, textarea-autosize и\n * нативные как text, password, email и т.д.`\n *\n * кастомный num - разрешает ввод только цифр и дробных чисел, без ислчений ввиде буквы 'E'\n * кастомный int - разрешает ввод только целочисленных значений\n * кастомный amount_format - форматирует ввод числовых данных разделяя на разряды(1 000 000)\n * date - добавляет placeholder, маску и ограничения ввода\n * uppercase\\lowercase - форматирует текст согласну значению (верхний\\нижний регистр)\n * phone_number - добавляет '+' к номеру телефона при фокусе без возможности удалить его\n */\n type: {\n type: String as () => InputTypesUnion,\n default: InputTypes.Text\n },\n\n /**\n * Заголовок поля:\n *\n */\n title: {\n type: String as PropType<string>,\n default: null\n },\n\n /**\n * Маска поля:\n *\n * tokens - https://imask.js.org/guide.html\n *\n */\n mask: {\n type: String as PropType<string>,\n default: null\n },\n\n /**\n * Вспомогательный текст под инпутом:\n *\n */\n helpText: {\n type: String as PropType<string>,\n default: null\n },\n\n /**\n * Отключенное состояние\n *\n */\n disabled: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n\n /**\n * Ошибки\n *\n */\n errors: {\n type: Array as PropType<string[]>,\n default: null\n },\n\n /**\n * Placeholder\n *\n */\n placeholder: {\n type: String as PropType<string>,\n default: null\n },\n\n /**\n * Name\n *\n */\n name: {\n type: String as PropType<string>,\n required: true\n },\n /**\n * плейсхолдеры для короткого обозначения даты (для маски dd.mm.yyyy)\n * {\n * date: 'd',\n * month: 'm',\n * year: 'y',\n * }\n *\n */\n dateMaskPlaceholder: {\n type: Object,\n default: () => ({})\n },\n /**\n * Максимальная длина строки в инпуте\n *\n */\n maxLength: {\n type: Number as PropType<number>,\n default: null\n },\n\n /**\n * Состояние копирования\n *\n */\n copy: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n\n /**\n * Автокомплит введённого ранее текста: on, off\n *\n */\n autocomplete: {\n type: String as () => Autocomplete,\n default: Autocomplete.On\n },\n\n /**\n * только чтение текста\n *\n */\n readOnly: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n\n /**\n * Атрибут tabindex для главного элемента\n *\n */\n tabindex: {\n type: [String, Number]\n },\n\n /**\n * Tooltip для кнопка \"показать пароль\"\n *\n */\n passwordTooltip: {\n type: String as PropType<string>,\n default: 'Show/Hide'\n },\n\n /**\n * Tooltip для кнопка \"Скрыть пароль\", если не указывать, то будет аналогичен \"показать\"\n *\n */\n passwordHideTooltip: {\n type: String as PropType<string>,\n default: null\n },\n\n /**\n * Очищаем данные от маски на выходе\n */\n clearOutput: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n\n /**\n * Кастомные настройки для маски\n * См. https://imask.js.org/guide.html\n *\n * Например:\n * {\n * autofix: true,\n * blocks: {\n * d: {mask: IMask.MaskedRange, placeholderChar: 'd', from: 1, to: 31, maxLength: 2},\n * m: {mask: IMask.MaskedRange, placeholderChar: 'm', from: 1, to: 12, maxLength: 2},\n * Y: {mask: IMask.MaskedRange, placeholderChar: 'y', from: 1900, to: 2999, maxLength: 4}\n * }\n * }\n */\n maskOptions: {\n type: Object,\n default: null\n },\n required: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Для какого языка поле ввода\n */\n locale: {\n type: String as PropType<string>,\n default: null\n },\n /**\n * Мобильное ли разрешение\n * (Используется для триггера тултипа в кнопке с паролем)\n */\n isMobile: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Свойство на ограничение количества символов после точки для числовых типов (num || amount_format)\n */\n maxDecimals: {\n type: Number as PropType<number>,\n default: 2\n },\n dir: {\n type: String as () => DirectionsUnion,\n default: Directions.Ltr\n }\n})\n\nconst prependWidth = ref<number>(0)\nconst appendWidth = ref<number>(0)\nconst prettyType = ref<string>(props.type)\nconst fieldErrors = useFieldErrors(props.errors)\n\nconst isRtl = computed((): boolean => {\n return props.dir === Directions.Rtl\n})\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-field-text': true,\n 'mc-field-text--error': !!fieldErrors.errorText.value,\n 'mc-field-text--textarea': isTextarea.value,\n 'mc-field-text--textarea-autosize': isTextareaAutosize.value,\n 'mc-field-text--disabled': props.disabled,\n 'mc-field-text--copy': props.copy,\n 'mc-field-text--rtl': isRtl.value\n }\n})\nconst computedTitle = computed((): string => {\n return `${props.title}${props.required ? ' *' : ''}`\n})\nconst isDate = computed((): boolean => {\n return prettyType.value === InputTypes.Date\n})\nconst isMaskVisible = computed((): boolean => {\n return !!props.mask || !!props.maskOptions || isDate.value\n})\nconst isTextarea = computed((): boolean => {\n return props.type === InputTypes.Textarea\n})\nconst isTextareaAutosize = computed((): boolean => {\n return props.type === InputTypes.TextareaAutosize\n})\nconst isPassword = computed((): boolean => {\n return props.type === InputTypes.Password\n})\nconst isAmountFormat = computed((): boolean => {\n return props.type === InputTypes.AmountFormat\n})\nconst hasCharCounter = computed((): boolean => {\n return !!props.maxLength && (isTextarea.value || isTextareaAutosize.value)\n})\nconst isPasswordType = computed((): boolean => {\n return prettyType.value === InputTypes.Password\n})\nconst passwordIcon = computed((): IconsListUnion => {\n return isPasswordType.value ? 'visibility' : 'visibility_off'\n})\nconst charCounter = computed((): string | number => {\n return props.modelValue ? String(props.modelValue).length : 0\n})\nconst charCounterTitle = computed((): string => {\n return `${charCounter.value}/${props.maxLength}`\n})\nconst charCounterColor = computed((): ColorTypes => {\n return props.maxLength < +charCounter.value ? 'red' : 'dark-gray'\n})\nconst dateMask = computed((): object => {\n return {\n mask: Date,\n autofix: true,\n blocks: {\n d: {\n mask: IMask.MaskedRange,\n placeholderChar: props.dateMaskPlaceholder.date || 'd',\n from: 1,\n to: 31,\n maxLength: 2\n },\n m: {\n mask: IMask.MaskedRange,\n placeholderChar: props.dateMaskPlaceholder.month || 'm',\n from: 1,\n to: 12,\n maxLength: 2\n },\n Y: {\n mask: IMask.MaskedRange,\n placeholderChar: props.dateMaskPlaceholder.year || 'y',\n from: 1900,\n to: 2999,\n maxLength: 4\n }\n }\n }\n})\nconst maskInputAttrs = computed((): object => {\n return {\n ...inputAttrs.value,\n mask: props.mask,\n lazy: false,\n overwrite: false,\n unmask: props.clearOutput,\n definitions: {\n '#': /./\n },\n readonly: props.readOnly,\n maxlength: props.maxLength,\n type: 'tel',\n ...attrs,\n ...(props.maskOptions ?? {}),\n ...(isDate.value ? dateMask.value : {})\n }\n})\n\nconst computedValue = computed({\n get() {\n if (isAmountFormat.value && !isRtl.value) {\n return getAmountFormat(String(props.modelValue))\n } else return props.modelValue\n },\n set(value: string) {\n fieldErrors.toggleErrorVisible()\n emit('update:modelValue', value)\n }\n})\n\nconst handleInput = (e: Event): void => {\n computedValue.value = getPreparedInputValue(e) as string\n}\nconst inputAttrs = computed((): object => {\n return {\n style: inputStyles.value,\n placeholder: props.placeholder,\n disabled: props.disabled,\n name: props.name,\n id: props.name,\n autocomplete: props.autocomplete,\n tabindex: props.tabindex,\n ...attrs,\n class: ['mc-field-text__input', attrs.class || ''].join(' ')\n }\n})\nconst inputStyles = computed((): object => {\n const space = parseInt(Spaces['150'])\n let bottomStyle = {}\n if (isTextarea.value || isTextareaAutosize.value) {\n const spaceBottomToken = hasCharCounter.value ? '400' : '150'\n const spaceBottomValue = Spaces[spaceBottomToken]\n bottomStyle = { paddingBottom: `${+spaceBottomValue.replace('px', '') - 1}px` }\n }\n return {\n paddingInlineStart: prependWidth.value && `${prependWidth.value + space}px`,\n paddingInlineEnd: appendWidth.value && `${appendWidth.value + space}px`,\n ...(!isTextarea.value && !isTextareaAutosize.value ? { boxSizing: 'border-box' } : {}),\n ...bottomStyle\n }\n})\n\nonMounted(() => {\n calculatePadding()\n})\n\nconst setDecimalsLimit = (val: string): string => {\n if (val && props.maxDecimals) {\n const [integerPart, decimalPart] = val.split('.')\n if (decimalPart?.length > props.maxDecimals) {\n return `${integerPart}.${decimalPart.slice(0, props.maxDecimals)}`\n }\n }\n return val\n}\n/**\n * Remove leading zero from input if length > 1 && number isn't decimal\n * */\nconst removeLeadingZero = (val: string): string => {\n let result = val\n const [first_char] = val || []\n if (val.length > 1 && +first_char === 0 && val.indexOf('.') === -1) result = val.slice(1)\n return result\n}\nconst getPreparedInputValue = (e: Event): InputValue => {\n const target = e.target as HTMLInputElement\n let value: InputValue = isDate.value && target && target.value ? target.value?.substring(0, 10) : target.value\n let cursor_position: number = getCaretPos(target)?.start\n let prepared_value = formattedToNumber(value)\n\n switch (props.type) {\n case InputTypes.Num: {\n //eslint-disable-next-line\n let [num] = /-?\\d*[\\.]?\\d*/.exec(String(value)) || []\n num = setDecimalsLimit(num as string)\n num = removeLeadingZero(num)\n value = num\n target.value = num\n break\n }\n case InputTypes.Int: {\n let [int] = /-?\\d*/.exec(String(target.value)) || []\n int = removeLeadingZero(int as string)\n value = int\n target.value = int\n break\n }\n case InputTypes.AmountFormat: {\n value = setDecimalsLimit(value)\n value = removeLeadingZero(value)\n prepared_value = formattedToNumber(value)\n\n const float_value = parseFloat(prepared_value)\n const without_spaces_value = prepared_value.replace(/ /gm, '')\n\n value = prepared_value\n ? String(float_value) === without_spaces_value\n ? float_value\n : without_spaces_value || float_value || prepared_value\n : null\n const formatted_value = getAmountFormat(prepared_value)\n target.value = isRtl.value ? formatted_value.replace(/ /gm, '') : formatted_value\n const space_length = target.value?.slice(0, cursor_position).replace(/[^ ]/gm, '')?.length || 0\n setCaretPos(target, cursor_position + space_length, cursor_position + space_length)\n break\n }\n case InputTypes.Uppercase: {\n value = value?.toUpperCase()\n target.value = value\n setCaretPos(target, cursor_position, cursor_position)\n break\n }\n case InputTypes.Lowercase: {\n value = value?.toLowerCase()\n target.value = value\n setCaretPos(target, cursor_position, cursor_position)\n break\n }\n case InputTypes.Password:\n value = value?.replace(/ /gm, '')\n target.value = value\n setCaretPos(target, cursor_position, cursor_position)\n break\n case InputTypes.PhoneNumber:\n if (value.length === 0) value = '+'\n if (value.charAt(0) !== '+') value = '+' + value\n value = value.replace(/(?!^)\\D/g, '')\n target.value = value\n break\n }\n\n return value\n}\n\nconst prepareHandleKeyDown = (e: KeyboardEvent): void => {\n switch (props.type) {\n case InputTypes.AmountFormat:\n case InputTypes.Num: {\n if (e.key === '.' && typeof props.modelValue === 'string' && props.modelValue?.includes('.')) {\n e.preventDefault()\n }\n break\n }\n }\n emit('keydown', e)\n}\n\nconst formattedToNumber = (value: string): string => {\n if (!value) return value as string\n //eslint-disable-next-line\n const [first] = /-?\\d*[\\.]?\\d*/.exec(String(value)?.replace(/ /gm, '')?.trim()) || []\n\n return first as string\n}\n\nconst setCaretPos = (ctrl: HTMLInputElement, start: number, end: number): void => {\n if (ctrl.setSelectionRange) {\n ctrl.focus()\n ctrl.setSelectionRange(start, end)\n }\n}\n\nconst getCaretPos = (ctrl: HTMLInputElement) => {\n if (ctrl.selectionStart || ctrl.selectionStart === 0) {\n return { start: ctrl.selectionStart, end: ctrl.selectionEnd }\n } else {\n return { start: 0, end: 0 }\n }\n}\n\nconst getAmountFormat = (value: string): string => {\n const formatted_number = formattedToNumber(value)\n const has_fraction = !!String(formatted_number)?.match(/\\./)\n\n const [int, fraction] = String(formatted_number)\n //eslint-disable-next-line\n .replace(/[^\\d\\.-]/g, '')\n .replace(/\\B(?=(?:\\d{3})+(?!\\d))/g, ' ')\n .split('.')\n\n const formatted_values = [int, fraction?.replace(/ /gm, '') || '']\n if (has_fraction) {\n return formatted_values.join('.')\n }\n return formatted_values.filter((v) => !!v).join('.')\n}\n\nconst calculatePadding = (): void => {\n prependWidth.value = +calculateSlotPadding('prepend')\n appendWidth.value = +calculateSlotPadding('append')\n}\n\nconst calculateSlotPadding = (name: string): string => {\n const tokenSpace = parseInt(Spaces['50'])\n\n let result = slots[name]\n ? //@ts-ignore\n (slots[name] || []).reduce((acc) => {\n return acc + tokenSpace\n }, 0) + tokenSpace\n : tokenSpace\n\n if (name === 'prepend') return result\n\n /**\n * Также увеличиваем padding при наличии кнопки копирования и если тип password\n */\n\n const iconSpace = parseInt(Spaces['300'])\n\n result = result ? result + tokenSpace : tokenSpace\n props.copy && (result += iconSpace)\n isPassword.value && (result += iconSpace)\n return result\n}\n\nconst handlerCopy = (): void => {\n /**\n * Событие по кнопке копирования\n */\n emit('copy', props.modelValue as string)\n}\n\nconst togglePasswordVisibility = (): void => {\n prettyType.value = isPasswordType.value ? InputTypes.Text : InputTypes.Password\n}\n</script>\n\n<template>\n <div ref=\"field\" :dir=\"props.dir\" :class=\"classes\">\n <label :for=\"name\" class=\"mc-field-text__header\">\n <!-- @slot Слот заголовка -->\n <slot name=\"header\">\n <mc-title v-if=\"title\" max-width=\"100%\" :weight=\"Weights.Medium\">\n {{ computedTitle }}\n </mc-title>\n </slot>\n </label>\n <div class=\"mc-field-text__inner\">\n <div class=\"mc-field-text__main\">\n <div v-if=\"$slots.prepend\" class=\"mc-field-text__prepend\">\n <!-- @slot Слот в начале инпута -->\n <slot name=\"prepend\" />\n </div>\n <label class=\"mc-field-text__input-wrapper\">\n <textarea\n v-if=\"isTextarea\"\n :value=\"computedValue\"\n v-bind=\"inputAttrs\"\n :maxlength=\"maxLength\"\n rows=\"1\"\n @input=\"handleInput\"\n />\n <textarea\n v-else-if=\"isTextareaAutosize\"\n :value=\"computedValue\"\n ref=\"textarea\"\n v-bind=\"inputAttrs\"\n @input=\"handleInput\"\n />\n <template v-else>\n <!-- When possible, prefer to use input type=\"tel\" to avoid glitch on android devices -->\n <i-mask-component\n v-if=\"isMaskVisible\"\n :value=\"computedValue\"\n v-bind=\"maskInputAttrs\"\n @input=\"handleInput\"\n />\n <input\n v-else\n :value=\"computedValue\"\n ref=\"input\"\n v-bind=\"inputAttrs\"\n :type=\"prettyType\"\n :readonly=\"props.readOnly\"\n :maxlength=\"maxLength\"\n @keydown=\"prepareHandleKeyDown\"\n @input=\"handleInput\"\n />\n </template>\n </label>\n <div\n v-if=\"$slots.append || copy || isPassword\"\n class=\"mc-field-text__append\"\n :class=\"{ 'mc-field-text__append--indent-bottom': hasCharCounter }\"\n >\n <!-- @slot Слот в конце инпута -->\n <slot name=\"append\" />\n <mc-button v-if=\"copy\" variation=\"black-link\" :size=\"ButtonSize.MCompact\" @click.prevent=\"handlerCopy\">\n <template #icon-append>\n <mc-svg-icon name=\"copy\" />\n </template>\n </mc-button>\n <mc-tooltip\n v-if=\"isPassword\"\n :content=\"isPasswordType ? props.passwordTooltip : props.passwordHideTooltip || props.passwordTooltip\"\n >\n <mc-button\n variation=\"black-link\"\n :size=\"ButtonSize.MCompact\"\n tabindex=\"-1\"\n :type=\"ButtonType.Button\"\n @click.prevent=\"togglePasswordVisibility\"\n >\n <template #icon-append>\n <mc-svg-icon :name=\"passwordIcon\" />\n </template>\n </mc-button>\n </mc-tooltip>\n </div>\n <mc-title\n v-if=\"hasCharCounter\"\n class=\"mc-field-text__char-counter\"\n :variation=\"TitleVariations.Overline\"\n :text-align=\"HorizontalAlignment.Right\"\n :color=\"charCounterColor\"\n >\n {{ charCounterTitle }}\n </mc-title>\n </div>\n <div v-if=\"$slots.right\" class=\"mc-field-text__right\">\n <!-- @slot Слот справа инпута -->\n <slot name=\"right\" />\n </div>\n </div>\n <div v-if=\"fieldErrors.errorText.value || props.helpText || $slots.footer\" class=\"mc-field-text__footer\">\n <mc-title\n v-if=\"fieldErrors.errorText.value\"\n tag-name=\"div\"\n color=\"red\"\n :variation=\"TitleVariations.Overline\"\n class=\"mc-field-text__error-text\"\n :html-data=\"fieldErrors.errorText.value\"\n />\n <br v-if=\"fieldErrors.errorText.value\" />\n <!-- @slot Слот доп. текста под инпутом -->\n <slot name=\"footer\">\n <mc-title\n v-if=\"props.helpText\"\n tag-name=\"div\"\n :variation=\"TitleVariations.Overline\"\n color=\"gray\"\n max-width=\"100%\"\n >\n {{ props.helpText }}\n </mc-title>\n </slot>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/durations' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/border-radius' as *;\n.mc-field-text {\n $block-name: &;\n display: block;\n\n &__header {\n @include reset-text-indents();\n display: block;\n margin-bottom: $space-100;\n\n &:empty {\n display: none;\n }\n }\n\n &__inner {\n display: flex;\n align-items: center;\n }\n\n &__right {\n flex-shrink: 0;\n }\n\n &__main {\n position: relative;\n width: 100%;\n @include custom-scroll($space-50);\n }\n\n &__prepend,\n &__append {\n @include reset-text-indents();\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n\n &:empty {\n display: none;\n }\n\n @include child-indent-right($space-50);\n }\n\n &__prepend {\n inset-inline-start: 0;\n padding: $space-100 0;\n padding-inline: $space-100 $space-50;\n }\n\n &__append {\n inset-inline-end: $space-100;\n &--indent-bottom {\n padding-bottom: $space-400;\n }\n }\n\n &__char-counter {\n width: auto !important;\n position: absolute;\n inset-inline-end: $space-150;\n bottom: $space-150;\n background-color: $color-transparent;\n }\n\n &__input-wrapper {\n display: block;\n }\n\n &__input {\n font-family: $font-family-main;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n height: $size-500;\n margin: 0;\n border: 1px solid $color-outline-gray;\n border-radius: $radius-100;\n padding: $space-150 - 1px $space-150;\n line-height: $line-height-200;\n font-size: $font-size-200;\n background-color: $color-white;\n -moz-appearance: textfield;\n transition:\n background-color $duration-s ease,\n border-color $duration-s ease;\n color: $color-black;\n\n &:focus,\n &:hover {\n outline: 0;\n border-color: $color-purple;\n }\n\n &::-webkit-search-cancel-button,\n &::-webkit-search-decoration,\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n }\n\n @include input-placeholder() {\n color: $color-gray;\n }\n }\n\n &__footer {\n margin-top: $space-50;\n line-height: $line-height-150;\n\n &:empty {\n display: none;\n }\n }\n\n &--error {\n #{$block-name} {\n &__input {\n border-color: $color-red;\n }\n }\n }\n\n &--textarea {\n #{$block-name} {\n &__append,\n &__prepend {\n align-items: flex-start;\n }\n\n &__input {\n height: auto;\n min-height: 92px;\n resize: vertical;\n }\n }\n }\n\n &--textarea-autosize {\n #{$block-name} {\n &__input {\n height: auto;\n resize: vertical;\n }\n }\n }\n\n &--disabled {\n #{$block-name} {\n &__input {\n color: $color-gray;\n cursor: not-allowed;\n background-color: $color-hover-gray;\n border-color: $color-outline-gray;\n }\n }\n }\n\n &--copy {\n #{$block-name} {\n &__input {\n color: $color-dark-gray;\n background-color: $color-hover-gray;\n border-color: $color-outline-gray;\n }\n }\n }\n\n &--rtl {\n direction: rtl;\n input {\n direction: rtl;\n }\n }\n\n &__empty-tooltip {\n display: contents;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport { useFieldErrors } from '@/composables/useFieldErrors'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport { computed, type PropType } from 'vue'\nimport type { HorizontalAlignmentUnion } from '@/types/styles/Alignment'\nimport type { HorizontalAlignment } from '@/enums/ui/Alignment'\nimport { TitleVariations } from '@/enums'\n\nconst emit = defineEmits(['update:modelValue'])\nconst props = defineProps({\n /**\n * Значение\n *\n */\n modelValue: {\n type: [Boolean, String, Number] as PropType<boolean | string | number>,\n default: null\n },\n /**\n * Выбранное значение\n */\n checkedValue: {\n type: [Boolean, String, Number] as PropType<boolean | string | number>,\n default: true\n },\n /**\n * Невыбранное значение\n */\n uncheckedValue: {\n type: [Boolean, String, Number] as PropType<boolean | string | number>,\n default: false\n },\n /**\n * Изменение цвета текста\n * при переключении\n */\n coloredText: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Отключенное состояние\n */\n disabled: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Позиция текста\n * относительно переключателя\n */\n textPosition: {\n type: String as () => HorizontalAlignmentUnion,\n default: 'left'\n },\n /**\n * Активный цвет\n */\n color: {\n type: String as () => ColorTypes,\n default: 'purple' as ColorTypes\n },\n /**\n * Ошибки\n *\n */\n errors: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n /**\n * Атрибут tabindex для главного элемента\n */\n tabindex: {\n type: [String, Number] as PropType<string | number>\n }\n})\n\nconst fieldErrors = useFieldErrors(props.errors)\n\nconst _value = computed((): boolean => {\n return props.modelValue === props.checkedValue\n})\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-field-toggle': true,\n 'mc-field-toggle--checked': _value.value,\n 'mc-field-toggle--disabled': props.disabled,\n 'mc-field-toggle--colored-text': props.coloredText,\n [`mc-field-toggle--text-position-${props.textPosition as HorizontalAlignment}`]: !!props.textPosition\n }\n})\n\nconst styles = computed((): { [key: string]: string | undefined } => {\n let disabledColor: ColorTypes\n let saturateValue: string = 'initial'\n switch (props.color) {\n case 'purple' as ColorTypes: {\n disabledColor = 'light-purple' as ColorTypes\n break\n }\n default: {\n disabledColor = props.color\n saturateValue = '50%'\n }\n }\n return {\n '--mc-field-toggle-color': props.color && Colors[props.color],\n '--mc-field-toggle-disabled-color': disabledColor && Colors[disabledColor],\n '--mc-field-toggle-saturate-value': saturateValue\n }\n})\nconst inputProps = computed<object>(() => {\n return {\n checked: _value.value,\n disabled: props.disabled,\n tabindex: props.tabindex,\n class: 'mc-field-toggle__field',\n type: 'checkbox'\n }\n})\n\nconst change = (e: Event): void => {\n const target = e.target as HTMLInputElement\n const checked: boolean = target.checked\n fieldErrors.toggleErrorVisible()\n /**\n * Событие тоггла\n */\n emit('update:modelValue', checked ? props.checkedValue : props.uncheckedValue)\n}\n</script>\n\n<template>\n <div class=\"mc-field-toggle__content\">\n <label :class=\"classes\" :style=\"styles\">\n <span class=\"mc-field-toggle__text\">\n <!-- @slot Слот для тайтла тогглера -->\n <slot />\n </span>\n <span class=\"mc-field-toggle__wrapper\">\n <input v-bind=\"inputProps\" @input=\"change\" />\n <span class=\"mc-field-toggle__slider\"></span>\n </span>\n </label>\n <mc-title\n v-if=\"fieldErrors.errorText.value\"\n tag-name=\"div\"\n color=\"red\"\n :variation=\"TitleVariations.Overline\"\n max-width=\"100%\"\n >\n {{ fieldErrors.errorText.value }}\n </mc-title>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/durations' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/border-radius' as *;\n.mc-field-toggle {\n $block-name: &;\n $toggle-indent: calc(#{$space-50} / 2);\n font-family: $font-family-main;\n --mc-field-toggle-color: initial;\n --mc-field-disabled-color: initial;\n --mc-field-toggle-saturate-value: initial;\n display: flex;\n align-items: center;\n cursor: pointer;\n\n &__text {\n color: $color-black;\n transition: color $duration-m;\n line-height: $line-height-200;\n font-size: $font-size-200;\n margin-inline-end: $space-100;\n text-align: right;\n\n &:empty {\n margin-inline-end: 0;\n }\n }\n\n &--colored-text {\n #{$block-name}__text {\n color: $color-gray;\n }\n\n @at-root #{$block-name}--checked#{$block-name}--colored-text {\n #{$block-name}__text {\n color: $color-purple;\n }\n }\n @at-root #{$block-name}--disabled#{$block-name}--colored-text {\n #{$block-name}__text {\n color: $color-outline-gray;\n }\n }\n @at-root #{$block-name}--checked#{$block-name}--disabled#{$block-name}--colored-text {\n #{$block-name}__text {\n color: $color-light-purple;\n }\n }\n }\n\n &--text-position-right {\n #{$block-name}__text {\n order: 2;\n margin-inline: $space-100 0;\n text-align: left;\n }\n }\n &__content {\n @include child-indent-bottom($space-50);\n }\n\n &__wrapper {\n position: relative;\n display: inline-block;\n @include size($size-550, $size-250);\n flex-shrink: 0;\n & > #{$block-name}__field {\n opacity: 0;\n @include size(0);\n\n &:checked + #{$block-name}__slider {\n background-color: $color-purple;\n\n &:before {\n inset-inline-start: calc(#{$space-300} + #{$toggle-indent});\n }\n }\n }\n\n #{$block-name}__slider {\n @include position(absolute, 0 0 0 0);\n background-color: $color-gray;\n transition: $duration-m;\n border-radius: 100px;\n\n &::before {\n @include pseudo();\n @include size($size-200);\n @include position(null, null null $toggle-indent $toggle-indent);\n background-color: $color-white;\n transition: $duration-m;\n border-radius: $radius-circle;\n }\n }\n }\n\n &--disabled {\n cursor: auto;\n #{$block-name}__slider {\n background-color: $color-outline-gray !important;\n &::before {\n background-color: $color-hover-gray;\n }\n }\n }\n #{$block-name}__wrapper > #{$block-name}__field:checked + #{$block-name}__slider {\n background-color: var(--mc-field-toggle-color);\n }\n &#{$block-name}--disabled {\n &#{$block-name}--checked #{$block-name}__slider {\n background-color: var(--mc-field-toggle-disabled-color) !important;\n filter: saturate(var(--mc-field-toggle-saturate-value));\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { onMounted, watch, ref, onBeforeUnmount } from 'vue'\n\nconst emit = defineEmits(['loading', 'hide'])\nconst props = defineProps({\n /**\n * За какое расстояние(px) инициировать loading event\n * **/\n overlap: {\n type: Number,\n default: 100,\n },\n /**\n * Активен ли триггер\n * */\n active: {\n type: Boolean,\n default: false,\n },\n /**\n * Компонент в котором происходит скролл, указывается для большей точности\n * Дефолтно используется область видимости браузера для отслеживания появления компопнента\n * **/\n root: {\n type: String,\n default: null,\n },\n})\nconst observer = ref<IntersectionObserver | null>()\nconst el = ref<HTMLElement | null>()\nconst id = ref<string>(`indicator_${Date.now()}`)\n\nonMounted(() => {\n setObserver()\n})\n\nonBeforeUnmount(() => {\n clearAllListeners()\n})\n\nconst setObserver = (): void => {\n el.value = document.getElementById(id.value)\n // создаем IntersectionObserver - смотрит за тем когда элемент попадает во viewport\n observer.value = new IntersectionObserver(\n ([entry]) => {\n // если попадает во viewport делаем $emit\n if ((entry.intersectionRatio === 1 || entry.isIntersecting) && props.active) {\n return emit('loading')\n } else {\n return emit('hide')\n }\n },\n {\n ...(props.root ? { root: el.value?.closest(props.root) } : {}),\n rootMargin: `${props.overlap}px`,\n threshold: 0.1,\n },\n )\n // назначаем слушателя на observer\n el.value && observer.value.observe(el.value)\n}\n\nconst clearAllListeners = (): void => {\n observer.value && observer.value.disconnect()\n observer.value = null\n}\n\nwatch(() => props.active, (value): void => {\n clearAllListeners()\n if (value) {\n setObserver()\n }\n})\n</script>\n\n<template>\n <section class=\"el-infinity-loading__wrapper\">\n <div :id=\"id\" class=\"el-infinity-loading\"></div>\n </section>\n</template>\n\n<style lang=\"scss\">\n.el-infinity-loading {\n $block-name: &;\n height: 1px;\n width: 100%;\n z-index: 999999;\n user-select: none;\n pointer-events: none;\n background-color: transparent;\n &__wrapper {\n position: relative;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport { computed, type PropType } from 'vue'\nimport { HorizontalAlignment, TitleVariations, Weights } from '@/enums'\nimport type { IconsListUnion } from '@/types'\n//@ts-ignore\nimport noTableDataImg from '../../../assets/img/no_table_data.png'\n\nconst emit = defineEmits<{\n (e: 'click'): void\n}>()\n\nconst props = defineProps({\n img: {\n type: String as PropType<string>,\n default: noTableDataImg,\n },\n icon: {\n type: String as () => IconsListUnion,\n default: null\n },\n title: {\n type: String as PropType<string>,\n default: ''\n },\n text: {\n type: String as PropType<string>,\n default: ''\n },\n href: {\n type: String as PropType<string>,\n default: ''\n },\n btnName: {\n type: String as PropType<string>,\n default: ''\n },\n noAction: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n loading: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Вариант блока\n * small - стандартный, небольшие отступы\n * large - большие отступы (напр. для табов в админке) + немного меняются дефолтные шрифты тайтла\n * */\n variation: {\n type: String as PropType<'small' | 'large'>,\n default: 'small'\n }\n})\n\nconst btnAttrs = computed((): { [key: string]: boolean | string } => {\n return {\n class: 'mt-200',\n loading: props.loading,\n ...(props.href ? { href: props.href } : {})\n }\n})\n\nconst btnListeners = computed((): { [key: string]: Function } => {\n return !props.href\n ? {\n click: () => handleClick()\n }\n : {}\n})\n\nconst titleExtraProps = computed((): { [key: string]: string } => {\n return props.variation === 'large'\n ? {\n variation: TitleVariations.Subtitle,\n weight: Weights.SemiBold\n }\n : {}\n})\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-no-data': true,\n [`mc-no-data--variation-${props.variation}`]: !!props.variation\n }\n})\n\nconst handleClick = (): void => {\n emit('click')\n}\n</script>\n\n<template>\n <div class=\"mc-no-data__wrapper\">\n <section :class=\"classes\">\n <mc-svg-icon v-if=\"props.icon\" :weight=\"0.5\" :name=\"props.icon\" size=\"1000\" color=\"outline-gray\" />\n <img v-if=\"props.img\" :src=\"props.img\" alt=\"no_entity\" />\n <slot v-if=\"title || $slots.title\" name=\"title\">\n <mc-title\n v-if=\"props.title\"\n v-bind=\"titleExtraProps\"\n color=\"gray\"\n :text-align=\"HorizontalAlignment.Center\"\n :html-data=\"props.title\"\n />\n </slot>\n <div v-if=\"text || $slots.text\" class=\"mc-no-data__text\">\n <slot name=\"text\">\n <mc-title\n color=\"gray\"\n :variation=\"TitleVariations.Article\"\n :text-align=\"HorizontalAlignment.Center\"\n :html-data=\"text\"\n />\n </slot>\n </div>\n <div v-if=\"(btnName && !noAction) || $slots.action\" class=\"mc-no-data__actions\">\n <slot name=\"action\">\n <mc-button v-bind=\"btnAttrs\" v-on=\"btnListeners\">\n {{ btnName }}\n </mc-button>\n </slot>\n </div>\n </section>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/media-queries' as *;\n.mc-no-data {\n min-width: 100px;\n max-width: 100%;\n padding: 0 $space-200;\n width: 98%;\n text-align: center;\n @include child-indent-bottom($space-100);\n\n img {\n max-width: $size-1000;\n width: 100%;\n min-width: 0;\n margin-bottom: $space-150 !important;\n user-select: none;\n }\n\n &__text {\n a {\n color: $color-purple;\n text-decoration: none;\n }\n }\n\n &__wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex-grow: 1;\n padding: $space-200;\n width: 100%;\n height: 100%;\n @include align(true, true, absolute);\n\n @media #{$media-query-l} {\n padding: $space-300 $space-300 $space-400;\n }\n .mc-no-data {\n position: static;\n transform: none;\n }\n }\n\n &__actions {\n margin-top: $space-200;\n }\n\n &--variation {\n &-large {\n padding: $space-400;\n @include child-indent-bottom($space-150);\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport McPreview from '@/components/patterns/McPreview/McPreview.vue'\nimport { computed, type PropType } from 'vue'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport type { IconsListUnion } from '@/types/styles/Icons'\nimport { Weights } from '@/enums/ui/Weights'\n\n\nconst emit = defineEmits(['click'])\nconst props = defineProps({\n /**\n * Дизайн:\n * purple, red, orange и т.д.\n */\n variation: {\n type: String as () => ColorTypes,\n default: 'purple' as ColorTypes,\n },\n /**\n * Заголовок блока\n */\n title: {\n type: String as PropType<string>,\n },\n /**\n * Содержимое блока\n */\n content: {\n type: String as PropType<string>,\n default: null,\n },\n /**\n * Отобразить кнопку внтури блока\n */\n buttonVisible: {\n type: Boolean as PropType<boolean>,\n default: false,\n },\n /**\n * Текст кнопки\n */\n buttonText: {\n type: String as PropType<string>,\n default: '',\n },\n /**\n * Название иконки\n */\n iconName: {\n type: String as () => IconsListUnion,\n default: 'info' as IconsListUnion,\n },\n /**\n * Отображать иконку\n */\n iconVisible: {\n type: Boolean as PropType<boolean>,\n default: true,\n },\n})\n\nconst styles = computed((): { [key: string]: string } => {\n return {\n '--mc-notification-color': Colors[props.variation],\n }\n})\n\nconst handleClick = (e: Event):void => {\n /**\n * Событие клика по кнопке\n */\n emit('click', e)\n}\n</script>\n\n<template>\n <div class=\"mc-notification\" :style=\"styles\">\n <div class=\"mc-notification__inner\">\n <mc-preview>\n <template v-if=\"props.iconVisible && ($slots.left || props.iconName)\" #left>\n <!-- @slot Слот для иконки -->\n <slot name=\"left\">\n <mc-svg-icon :name=\"props.iconName\" size=\"300\" />\n </slot>\n </template>\n\n <template v-if=\"$slots.header || props.title\" #top>\n <!-- @slot Слот заголовка -->\n <slot name=\"header\">\n <mc-title\n v-if=\"props.title\"\n :color=\"props.variation\"\n :weight=\"Weights.SemiBold\"\n class=\"mc-notification__title\"\n >\n {{ props.title }}\n </mc-title>\n </slot>\n </template>\n\n <template v-if=\"props.content || $slots.default\" #bottom>\n <div class=\"mc-notification__text\">\n <!-- @slot Слот для контента -->\n <slot>\n <mc-title :color=\"props.variation\">{{ props.content }}</mc-title>\n </slot>\n </div>\n </template>\n\n <template v-if=\"$slots.right || props.buttonVisible\" #right>\n <!-- @slot Слот для кнопок -->\n <slot name=\"right\">\n <mc-button\n v-if=\"props.buttonVisible\"\n :variation=\"props.variation\"\n class=\"mc-notification__button\"\n @click=\"handleClick\"\n >\n {{ props.buttonText }}\n </mc-button>\n </slot>\n </template>\n </mc-preview>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/media-queries' as *;\n@use '../../../assets/tokens/border-radius' as *;\n.mc-notification {\n $block-name: &;\n --mc-notification-color: #{$color-orange};\n position: relative;\n background-color: $color-white;\n border-radius: $radius-150;\n overflow: hidden;\n &:before {\n content: '';\n @include position(absolute, 0 null null 0);\n display: block;\n height: 100%;\n width: $size-50;\n background-color: var(--mc-notification-color);\n }\n\n &__text {\n font-size: $font-size-200;\n line-height: $line-height-200;\n }\n\n #{$block-name}__text,\n #{$block-name}__title {\n filter: contrast(59%);\n }\n\n &__inner {\n padding: $space-100 $space-150 $space-100 $space-200;\n min-height: $size-700;\n display: flex;\n align-items: center;\n position: relative;\n color: var(--mc-notification-color);\n &:before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: var(--mc-notification-color);\n opacity: 0.1;\n }\n\n .mc-preview {\n width: 100%;\n z-index: 1;\n &__top {\n margin-bottom: $space-50;\n }\n &__left {\n display: flex;\n align-items: center;\n margin-inline-end: $size-150;\n }\n &__right {\n display: flex;\n align-items: center;\n margin-inline-start: auto;\n padding-inline-start: $space-100;\n }\n }\n\n @media #{$media-query-m-down} {\n .mc-preview {\n flex-wrap: wrap;\n\n &__center {\n flex: 1;\n }\n &__right {\n width: 100%;\n padding-top: $space-100;\n padding-inline-start: $size-400 - 2;\n }\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport { useFieldErrors } from '@/composables/useFieldErrors'\n\nconst props = defineProps({\n /**\n * Процент\n *\n */\n percent: {\n type: Number as PropType<number>,\n default: 0\n },\n /**\n * Число для отображения, если не укказано, используется процент\n *\n */\n amount: {\n type: [String, Number, Boolean] as PropType<string | number | boolean>,\n default: null\n },\n /**\n * Цвет\n *\n */\n color: {\n type: String as () => ColorTypes,\n default: 'dark-gray'\n },\n /**\n * Цвет текста\n *\n */\n helpTextColor: {\n type: String as () => ColorTypes,\n default: 'gray'\n },\n /**\n * Вспомогательный текст\n */\n helpText: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Ошибки\n */\n errors: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n /**\n * Поменять местами подписи\n */\n reverseHeaders: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Использовать моноширинный шрифт для percent и amount\n */\n monospaceNumbers: {\n type: Boolean as PropType<boolean>,\n default: false\n }\n})\n\nconst fieldErrors = useFieldErrors(props.errors)\nconst wrapperClasses = computed(() => ({\n 'mc-progress': true,\n 'mc-progress--error': fieldErrors.errorText.value\n}))\nconst topClasses = computed(() => ({\n 'mc-progress__top': true,\n 'mc-progress__top--reverse-headers': props.reverseHeaders\n}))\nconst percentClasses = computed(() => ({\n 'mc-progress__percent': true,\n 'mc-progress__percent--monospace': props.monospaceNumbers\n}))\nconst lineClasses = computed(() => ({\n 'mc-progress__line': true\n}))\nconst styles = computed((): { [key: string]: string } => {\n return {\n '--mc-progress-color': Colors[props.color]\n }\n})\nconst helpTextStyles = computed(() => {\n return {\n '--mc-progress-help-text-color': Colors[props.helpTextColor]\n }\n})\nconst lineStyles = computed(() => {\n return {\n width: `${fieldErrors.errorText.value ? 2 : Math.sign(props.percent) > 0 ? props.percent : 0}%`\n }\n})\nconst percentValue = computed(() => {\n if (fieldErrors.errorText.value) return 0\n return props.amount ?? `${props.percent}%`\n})\n</script>\n\n<template>\n <div :class=\"wrapperClasses\" :style=\"styles\">\n <div :class=\"topClasses\">\n <div :class=\"percentClasses\">\n {{ percentValue }}\n </div>\n <div v-if=\"props.helpText\" class=\"mc-progress__help-text\" :style=\"helpTextStyles\">\n {{ props.helpText }}\n </div>\n </div>\n <div class=\"mc-progress__wrapper-line\">\n <div :class=\"lineClasses\" :style=\"lineStyles\"></div>\n </div>\n <div v-if=\"fieldErrors.errorText.value\" class=\"mc-progress__errors-container\">\n {{ fieldErrors.errorText.value }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/tokens/border-radius' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/sizes' as *;\n.mc-progress {\n $block-name: &;\n --mc-progress-color: #{$color-dark-gray};\n --mc-progress-help-text-color: #{$color-gray};\n position: relative;\n width: 100%;\n font-family: $font-family-main;\n line-height: $line-height-200;\n font-size: $font-size-200;\n &__percent {\n flex-shrink: 0;\n color: var(--mc-progress-color);\n &--monospace {\n font-feature-settings: 'tnum';\n font-variant-numeric: tabular-nums;\n }\n }\n &--error {\n #{$block-name} {\n &__percent {\n color: $color-red;\n }\n &__line {\n background-color: $color-red;\n }\n }\n }\n\n &__top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: $space-100;\n &--reverse-headers {\n flex-direction: row-reverse;\n }\n }\n\n &__help-text {\n color: var(--mc-progress-help-text-color);\n }\n\n &__wrapper-line {\n height: $size-100;\n border-radius: $radius-100;\n background-color: $color-hover-gray;\n width: 100%;\n }\n\n &__line {\n height: 100%;\n border-radius: $radius-100;\n max-width: 100%;\n background-color: var(--mc-progress-color);\n }\n\n &__errors-container {\n margin-top: $space-150;\n color: $color-red;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport { Spaces, type SpaceTypes } from '@/types/styles/Spaces'\nimport type { ColorsUnion } from '@/types/styles/Colors'\nimport type { SpacesUnion } from '@/types/styles/Spaces'\n\nconst props = defineProps({\n /**\n * Толщина `s, m`\n */\n weight: {\n type: String as PropType<'s' | 'm'>,\n default: 's',\n },\n /**\n * Цвет (токены)\n */\n color: {\n type: String as () => ColorTypes,\n default: 'outline-gray',\n },\n /**\n * Отступ слева и справа: 50, 200... ...1000\n */\n indentX: {\n type: String as () => SpaceTypes,\n default: '',\n },\n /**\n * Отступ сверху и снизу: 50, 200... ...1000\n */\n indentY: {\n type: String as () => SpaceTypes,\n default: '',\n },\n /**\n * Отступ сверху: 50, 200... ...1000\n */\n indentTop: {\n type: String as () => SpaceTypes,\n default: '',\n },\n /**\n * Отступ снизу: 50, 200... ...1000\n */\n indentBottom: {\n type: String as () => SpaceTypes,\n default: '',\n },\n /**\n * Отступ слева: 50, 200... ...1000\n */\n indentLeft: {\n type: String as () => SpaceTypes,\n default: '',\n },\n /**\n * Отступ справа: 50, 200... ...1000\n */\n indentRight: {\n type: String as () => SpaceTypes,\n default: '',\n },\n})\n\nconst indents = computed((): { [key: string]: SpaceTypes } => ({\n top: props.indentTop || props.indentY,\n bottom: props.indentBottom || props.indentY,\n left: props.indentLeft || props.indentX,\n right: props.indentRight || props.indentX,\n}))\n\nconst classes = computed((): { [key: string]: boolean } => ({\n 'mc-separator': true,\n}))\n\nconst styles = computed((): { [key: string]: ColorsUnion | SpacesUnion | string } => {\n let style = {} as { [key: string]: ColorsUnion | SpacesUnion | string }\n if (props.color) style['--mc-separator-color'] = Colors[props.color]\n if (indents.value.top) style['--mc-separator-indent-top'] = Spaces[indents.value.top]\n if (indents.value.bottom) style['--mc-separator-indent-bottom'] = Spaces[indents.value.bottom]\n if (indents.value.left) style['--mc-separator-indent-left'] = Spaces[indents.value.left]\n if (indents.value.right) style['--mc-separator-indent-right'] = Spaces[indents.value.right]\n\n let weight: string | undefined\n switch (props.weight) {\n case 's': {\n weight = '1px'\n break\n }\n case 'm': {\n weight = '2px'\n }\n }\n if (weight) style['--mc-separator-weight'] = weight\n\n return style\n})\n</script>\n\n<template>\n <div :class=\"classes\" :style=\"styles\">\n <div class=\"mc-separator__wrapper\">\n <slot />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n.mc-separator {\n $block-name: &;\n --mc-separator-color: initial;\n --mc-separator-indent-top: initial;\n --mc-separator-indent-bottom: initial;\n --mc-separator-indent-left: initial;\n --mc-separator-indent-right: initial;\n --mc-separator-weight: initial;\n width: 100%;\n margin-top: var(--mc-separator-indent-top);\n margin-bottom: var(--mc-separator-indent-bottom);\n margin-inline-start: var(--mc-separator-indent-left);\n margin-inline-end: var(--mc-separator-indent-right);\n height: var(--mc-separator-weight);\n &__wrapper {\n @include size(100%);\n background-color: var(--mc-separator-color);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { onMounted, type PropType, ref, watch } from 'vue'\n\ninterface animationPayload {\n contentHeight: string | number\n}\n\nconst emit = defineEmits<{\n (e: 'slide-open-start', value: boolean): void\n (e: 'slide-close-start', value: boolean): void\n (e: 'slide-open-end', value: boolean): void\n (e: 'slide-close-end', value: boolean): void\n}>()\n\nconst props = defineProps({\n /*\n * Состояние\n */\n active: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /*\n * Продолжительность тоггла\n */\n duration: {\n type: Number as PropType<number>,\n default: 300\n },\n type: {\n type: String as PropType<string>,\n default: 'ease-out'\n },\n /*\n * Если нужен другой тег\n */\n tag: {\n type: String as PropType<string>,\n default: 'div'\n },\n /*\n * Применять ли атрибут hidden\n * к элементы при закрытии\n */\n useHidden: {\n type: Boolean as PropType<boolean>,\n default: true\n }\n})\n\nconst open = ref<boolean>(props.active)\nconst animation_in_progress = ref<boolean>(false)\nconst animation = ref<Animation | null>(null)\nconst container = ref<HTMLDivElement>()\n\nonMounted((): void => {\n init()\n})\n\nconst init = (): void => {\n if (container.value && !open.value) {\n container.value.style.height = '0'\n }\n}\n\nconst animate = (): void => {\n if (!container.value || animation_in_progress.value) return\n animation_in_progress.value = true\n // Получаем фактическую высоту содержимого\n const contentHeight = container.value.scrollHeight\n\n const payload = {\n contentHeight\n } as animationPayload\n\n // Отменяем предыдущую анимацию, если она была\n if (animation.value) {\n animation.value.cancel()\n }\n open.value ? handleClose(payload) : handleOpen(payload)\n}\n\nconst toggleOpenValue = (): void => {\n open.value = !open.value\n}\n\nconst handleClose = ({ contentHeight }: animationPayload) => {\n emit('slide-close-start', open.value)\n\n if (container.value) {\n animation.value = container.value.animate([{ height: `${contentHeight}px` }, { height: '0' }], {\n duration: props.duration,\n easing: props.type,\n fill: 'forwards'\n })\n animation.value.onfinish = () => {\n emit('slide-close-end', open.value)\n animation_in_progress.value = false\n toggleOpenValue()\n }\n }\n}\n\nconst handleOpen = ({ contentHeight }: animationPayload) => {\n emit('slide-open-start', open.value)\n\n if (container.value) {\n animation.value = container.value.animate([{ height: '0' }, { height: `${contentHeight}px` }], {\n duration: props.duration,\n easing: props.type,\n fill: 'forwards'\n })\n\n animation.value.onfinish = () => {\n emit('slide-open-end', open.value)\n animation_in_progress.value = false\n toggleOpenValue()\n }\n }\n}\n\nwatch(\n () => props.active,\n (): void => {\n animate()\n }\n)\n</script>\n\n<template>\n <component ref=\"container\" :is=\"props.tag\" class=\"mc-slide-up-down\">\n <slot />\n </component>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/tokens/font-families' as *;\n.mc-slide-up-down {\n overflow: hidden;\n font-family: $font-family-main;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, computed, h, useSlots, createApp, type PropType } from 'vue'\nimport { Spaces } from '@/types'\n\nconst props = defineProps({\n visibleCount: {\n type: Number as PropType<number>,\n default: Infinity\n },\n collapsed: {\n type: Boolean as PropType<boolean>,\n default: false\n }\n})\n\nconst slots = useSlots()\nconst container = ref<HTMLElement | null>(null)\nconst children =\n (slots.default && slots.default()[0].children?.length\n ? slots.default()[0].children\n : //@ts-ignore\n slots.default()) || []\n\n//@ts-ignore\nconst visibleChildren = ref<any[]>(children || [])\nconst hiddenCount = ref<number>(0)\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-stack': true,\n 'mc-stack--collapsed': props.collapsed\n }\n})\n\nonMounted(() => {\n const resizeObserver = new ResizeObserver(updateChildrenVisible)\n if (container.value) resizeObserver.observe(container.value)\n\n updateChildrenVisible()\n\n onUnmounted(() => {\n resizeObserver.disconnect()\n })\n})\n\nconst updateChildrenVisible = (): void => {\n if (!container.value) return\n\n let totalWidth = 0\n const visibleItems = []\n let itemCount = 0\n hiddenCount.value = 0\n\n const tempContainer = document.createElement('div')\n tempContainer.style.position = 'absolute'\n tempContainer.style.visibility = 'hidden'\n tempContainer.style.whiteSpace = 'nowrap'\n document.body.appendChild(tempContainer)\n\n //@ts-ignore\n for (const item of children) {\n const vnode = h(item)\n const itemNode = document.createElement('div')\n tempContainer.appendChild(itemNode)\n\n const app = createApp({ render: () => vnode })\n app.mount(itemNode)\n\n const itemWidth = props.collapsed\n ? itemNode.getBoundingClientRect().width + 6\n : itemNode.getBoundingClientRect().width\n app.unmount()\n itemNode.remove()\n\n const moreContentWidth = +Spaces['300'].replace('px', '')\n const itemIndent = props.collapsed ? -Spaces['200'].replace('px', '') : +Spaces['150'].replace('px', '')\n\n if (\n totalWidth + (itemWidth + itemIndent) <= container.value.clientWidth - moreContentWidth &&\n itemCount < props.visibleCount\n ) {\n totalWidth += itemWidth + itemIndent\n visibleItems.push(item)\n itemCount++\n } else {\n //@ts-ignore\n hiddenCount.value = children.length - visibleItems.length\n break\n }\n }\n document.body.removeChild(tempContainer)\n visibleChildren.value = visibleItems\n}\n</script>\n\n<template>\n <div ref=\"container\" :class=\"classes\">\n <div ref=\"content\" class=\"mc-stack__content\">\n <template v-for=\"(child, i) in visibleChildren\" :key=\"`mc-stack-item-${i}`\">\n <component :is=\"child\" />\n </template>\n <span v-if=\"hiddenCount > 0\" class=\"mc-stack__more-label\">+{{ hiddenCount }}</span>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/font-weights' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/styles/mixins' as *;\n.mc-stack {\n $block-name: &;\n overflow: hidden;\n white-space: nowrap;\n &__content {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n @include child-indent-right($space-150);\n }\n &--collapsed {\n #{$block-name}__content {\n @include child-indent-right(-#{$space-200});\n & > *:not(#{$block-name}__more-label) {\n border: 2px solid $color-white;\n }\n }\n #{$block-name}__more-label {\n margin-inline-start: $space-250;\n }\n }\n &__more-label {\n margin-inline-start: $space-50;\n white-space: nowrap;\n font-size: $font-size-200;\n line-height: $line-height-200;\n color: $color-gray;\n font-weight: $font-weight-semi-bold;\n font-family: $font-family-main;\n width: $space-300;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { type PropType, provide, ref } from 'vue'\nimport type { ICollapse, ICollapseEmitPayload } from '@/types/ICollapse'\nimport { useDebounceFn } from '@vueuse/core'\n\n/**\n * Работает с дочерними mc-collapse\n */\n\nconst debounceFn = useDebounceFn((method) => {\n method()\n}, 50)\n\nconst props = defineProps({\n isSingleOpen: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n defaultOpenIndex: {\n type: Number as PropType<number>\n }\n})\nconst collapses = ref<ICollapse[]>([])\n\nconst recalculateCollapses = ({ value, component }: ICollapseEmitPayload) => {\n if (!value) return\n\n collapses.value.forEach(collapse => {\n if (collapse.id !== component.id) {\n collapse.close()\n }\n })\n}\n\nconst handleTrigger = (event: string, { value, component }: ICollapseEmitPayload): void => {\n if (props.isSingleOpen) recalculateCollapses({ value, component })\n}\n\nconst selfRegisterCollapseMethod = (payload: ICollapse): void => {\n collapses.value.push(payload)\n const openIndex = props.defaultOpenIndex\n debounceFn(() => {\n if ((openIndex || openIndex === 0) && !!collapses.value[openIndex]) {\n collapses.value[openIndex].open()\n }\n })\n}\nprovide('selfRegisterCollapseMethod', selfRegisterCollapseMethod)\nprovide('accordionTriggerMethod', handleTrigger)\n</script>\n\n<template>\n <div class=\"mc-accordion\">\n <!-- @slot Слот для дочерних mc-collapse -->\n <slot />\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/tokens/font-families' as *;\n.mc-accordion {\n $block-name: &;\n font-family: $font-family-main;\n}\n</style>\n","<script setup lang=\"ts\">\nimport McTitle from '../../elements/McTitle/McTitle.vue'\nimport { computed, type PropType } from 'vue'\nimport { CellSizes } from '@/enums/Cell'\nimport type { CellSizesUnion } from '@/types/ICell'\nimport { TitleVariations } from '@/enums/Title'\nconst props = defineProps({\n /**\n * Заголовок\n */\n title: {\n type: String as PropType<string>,\n default: '',\n },\n /**\n * Размеры отступов: 's, m, l'\n */\n size: {\n type: String as () => CellSizesUnion,\n default: CellSizes.M,\n },\n /**\n * Заглавные буквы заголовка\n */\n uppercase: {\n type: Boolean as PropType<boolean>,\n default: true,\n },\n /**\n * Три точки\n */\n ellipsis: {\n type: Boolean as PropType<boolean>,\n default: true,\n }\n})\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n [`mc-cell--size-${props.size}`]: !!props.size\n }\n})\n</script>\n\n<template>\n <section class=\"mc-cell\" :class=\"classes\">\n <div class=\"mc-cell__title\">\n <!-- @slot Слот заголовка -->\n <slot name=\"title\">\n <mc-title :variation=\"TitleVariations.Overline\" :uppercase=\"props.uppercase\" :ellipsis=\"props.ellipsis\">\n {{ props.title }}\n </mc-title>\n </slot>\n </div>\n <div class=\"mc-cell__content\">\n <!-- @slot Слот контента -->\n <slot />\n </div>\n </section>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/font-families' as *;\n.mc-cell {\n $block-name: &;\n font-family: $font-family-main;\n\n &--size {\n &-s {\n #{$block-name}__content {\n margin-top: 0;\n }\n }\n\n &-m {\n #{$block-name}__content {\n margin-top: $space-50;\n }\n }\n\n &-l {\n #{$block-name}__content {\n margin-top: $space-100;\n }\n }\n }\n\n &__content {\n display: inline-flex;\n flex-direction: column;\n width: 100%;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport McSlideUpDown from '@/components/elements/McSlideUpDown/McSlideUpDown.vue'\nimport { computed, type PropType, ref, useSlots, watch, inject, onMounted } from 'vue'\nimport type { ICollapse, ICollapseEmitPayload } from '@/types/ICollapse'\nimport { useRandomNumber } from '@/composables/useRandomNumber'\n\nconst randomNumber = useRandomNumber()\nconst selfRegisterCollapseMethod: Function = inject('selfRegisterCollapseMethod', () => {})\nconst accordionTriggerMethod: Function = inject('accordionTriggerMethod', () => {})\n\nconst slots = useSlots()\nconst emit = defineEmits<{\n (e: 'toggle', value: ICollapseEmitPayload): void\n (e: 'open', value: ICollapseEmitPayload): void\n (e: 'close', value: ICollapseEmitPayload): void\n (e: 'collapse-open-start', value: ICollapseEmitPayload): void\n (e: 'collapse-open-end', value: ICollapseEmitPayload): void\n (e: 'collapse-close-start', value: ICollapseEmitPayload): void\n (e: 'collapse-close-end', value: ICollapseEmitPayload): void\n}>()\nconst props = defineProps({\n /*\n * Если нужно\n * отключённое состояние\n */\n isDisabled: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /*\n * Если нужен бордер\n */\n border: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Иконка состояния коллапса\n *\n */\n icon: {\n type: Boolean as PropType<boolean>,\n default: false\n }\n})\n\nconst id = ref<number>(randomNumber.timestamp(5))\nconst isCollapsed = ref<boolean>(false)\nconst animated = ref<boolean>(false)\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-collapse--is-open': isCollapsed.value,\n 'mc-collapse--is-disabled': props.isDisabled,\n 'mc-collapse--is-empty': isEmpty.value,\n 'mc-collapse--has-icon': props.icon,\n 'mc-collapse--border': props.border\n }\n})\nconst isEmpty = computed((): boolean => {\n return !slots.body\n})\n\nconst iCollapseParams = computed((): ICollapse => {\n return {\n isDisabled: props.isDisabled,\n border: props.border,\n icon: props.icon,\n id: id.value,\n isCollapsed: isCollapsed.value,\n open: open,\n close: close,\n toggle: toggle\n }\n})\n\nonMounted((): void => {\n if (selfRegisterCollapseMethod) {\n const payload: ICollapse = iCollapseParams.value\n\n selfRegisterCollapseMethod(payload)\n }\n})\n\nwatch(\n () => isCollapsed.value,\n (value: boolean): void => {\n /**\n * Событие тоггла\n */\n const payload: ICollapseEmitPayload = { value, component: iCollapseParams.value }\n emit('toggle', payload)\n value ? emit('open', payload) : emit('close', payload)\n if (accordionTriggerMethod) {\n accordionTriggerMethod(value ? 'open' : 'close', payload)\n }\n }\n)\nconst open = (): void => {\n if (props.isDisabled || animated.value) return\n isCollapsed.value = true\n}\nconst close = (): void => {\n if (props.isDisabled || animated.value) return\n isCollapsed.value = false\n}\nconst toggle = (): void => {\n if (props.isDisabled || animated.value) return\n isCollapsed.value = !isCollapsed.value\n}\nconst slideOpenStart = (value: boolean): void => {\n animated.value = true\n const payload: ICollapseEmitPayload = { value, component: iCollapseParams.value }\n /**\n * Событие перед началом открытия\n */\n emit('collapse-open-start', payload)\n}\nconst slideOpenEnd = (value: boolean): void => {\n animated.value = false\n const payload: ICollapseEmitPayload = { value, component: iCollapseParams.value }\n /**\n * Событие после открытия\n */\n emit('collapse-open-end', payload)\n}\nconst slideCloseStart = (value: boolean): void => {\n animated.value = true\n const payload: ICollapseEmitPayload = { value, component: iCollapseParams.value }\n /**\n * Событие перед началом закрытия\n */\n emit('collapse-close-start', payload)\n}\nconst slideCloseEnd = (value: boolean): void => {\n animated.value = false\n const payload: ICollapseEmitPayload = { value, component: iCollapseParams.value }\n /**\n * Событие после закрытия\n */\n emit('collapse-close-end', payload)\n}\n</script>\n\n<template>\n <section class=\"mc-collapse\" :class=\"classes\">\n <div class=\"mc-collapse__header\" tabindex=\"0\" @keyup.esc=\"close\">\n <mc-svg-icon\n v-if=\"icon && !isEmpty\"\n class=\"mc-collapse__icon\"\n name=\"arrow_drop_down\"\n :color=\"isDisabled ? 'outline-gray' : 'black'\"\n />\n <!-- @slot Слот для элемента по которому будет меняться состояние компонента -->\n <div v-if=\"slots.activator\" @click=\"toggle\">\n <slot name=\"activator\" />\n </div>\n <a v-if=\"slots.body\" class=\"mc-collapse__link\" href=\"#\" @click.prevent=\"toggle\" />\n </div>\n <mc-slide-up-down\n class=\"mc-collapse__body\"\n :active=\"isCollapsed\"\n :duration=\"300\"\n @slide-open-start=\"slideOpenStart\"\n @slide-open-end=\"slideOpenEnd\"\n @slide-close-start=\"slideCloseStart\"\n @slide-close-end=\"slideCloseEnd\"\n >\n <div class=\"mc-collapse__body-inner\">\n <!-- @slot Слот контента -->\n <slot name=\"body\" />\n </div>\n </mc-slide-up-down>\n <div v-if=\"slots.bottom\" class=\"mc-collapse__bottom\">\n <!-- @slot Общий нижний слот -->\n <slot name=\"bottom\" />\n </div>\n </section>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/durations' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/border-radius' as *;\n.mc-collapse {\n $block-name: &;\n\n &--border {\n border-radius: $radius-100;\n border: 1px solid $color-outline-gray;\n\n #{$block-name} {\n &__header {\n display: flex;\n padding: $space-100 $space-200;\n }\n }\n }\n\n &__link {\n display: block;\n @include position(absolute, 0);\n z-index: 1;\n }\n\n &__header {\n display: inline-flex;\n align-items: center;\n outline: none;\n cursor: pointer;\n position: relative;\n }\n\n &__icon {\n transition: all $duration-s;\n margin-inline: $space-50 $space-50;\n }\n\n &__body {\n #{$block-name} {\n border: none;\n border-radius: 0;\n border-bottom: 1px solid $color-outline-gray;\n\n &__header {\n padding-inline: $space-400 $space-200;\n }\n\n &__body {\n #{$block-name} {\n &__header {\n padding-inline-start: $space-800;\n }\n }\n }\n\n &:first-child {\n border-top: 1px solid $color-outline-gray;\n }\n\n &:last-child {\n border-bottom: none;\n }\n }\n }\n\n &__bottom {\n position: relative;\n }\n\n &--is-open {\n > #{$block-name} {\n &__header {\n #{$block-name} {\n &__icon {\n transform: rotate(180deg);\n }\n }\n }\n }\n }\n\n &--is-empty {\n #{$block-name} {\n &__header {\n cursor: default;\n &:hover {\n color: inherit;\n }\n }\n &__link {\n cursor: default;\n }\n }\n }\n\n &--is-disabled {\n #{$block-name} {\n &__header {\n cursor: not-allowed;\n color: $color-outline-gray;\n &:hover {\n color: $color-outline-gray;\n }\n }\n &__link {\n cursor: not-allowed;\n }\n }\n }\n\n &--has-icon {\n &#{$block-name}--is-empty {\n #{$block-name}__header {\n padding-inline-start: $space-400;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue'\n\nconst props = defineProps({\n maxHeight: {\n type: Number as PropType<number>,\n default: 300\n }\n})\n\nconst panelStyles = computed((): { [key: string]: string } => {\n return {\n '--panel-max-height': `${props.maxHeight}px`\n }\n})\n</script>\n\n<template>\n <section class=\"mc-dropdown-panel\" :style=\"panelStyles\">\n <!-- @slot Слот контента -->\n <slot />\n </section>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/box-shadows' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/font-weights' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/border-radius' as *;\n.mc-dropdown-panel {\n $block-name: &;\n --panel-max-height: 300px;\n\n font-family: $font-family-main;\n box-shadow: $shadow-s;\n border-radius: $radius-150;\n background-color: $color-white;\n padding: $space-100;\n max-width: 320px;\n max-height: var(--panel-max-height);\n display: flex;\n flex-direction: column;\n align-items: stretch;\n overflow-y: auto;\n @include hide-scrollbar();\n\n &:empty {\n display: none;\n }\n\n .mc-button {\n &--size-m {\n font-weight: $font-weight-medium;\n padding: $space-100;\n .mc-svg-icon {\n @include size($size-300);\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, type PropType, ref, watch } from 'vue'\nimport { useRoute } from 'vue-router'\nimport { useThrottleFn } from '@vueuse/core'\nimport McDropdownPanel from '@/components/patterns/McDropdown/McDropdownPanel.vue'\nimport type { DropdownListPositionsUnion, DropdownPositionsUnion } from '@/types/IDropdown'\nimport { DropdownListPositions, DropdownPositions } from '@/enums/Dropdown'\n\nconst throttle = useThrottleFn((method) => {\n method()\n}, 200)\n\nconst id = 'dropdown-element-id'\nconst localList_position = ref<string | null>(null)\nconst local_position = ref<string | null>(null)\nconst dropdown_body = ref<HTMLElement | null>(null)\nconst activator = ref<HTMLElement | null>(null)\nconst is_open = ref<boolean>(false)\nconst route = useRoute()\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void\n (e: 'select', value: any): void\n}>()\n\nconst props = defineProps({\n /**\n * Состояние видимости контента\n */\n modelValue: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n items: {\n type: Array as PropType<any[]>,\n default: () => []\n },\n /**\n * Выравнивание\n * контента: 'left', 'right', 'auto'\n */\n position: {\n type: String as () => DropdownPositionsUnion,\n default: DropdownPositions.Left\n },\n /**\n * Направление отображения\n * контента: 'top', 'bottom', 'auto'\n */\n listPosition: {\n type: String as () => DropdownListPositionsUnion,\n default: DropdownListPositions.Bottom\n },\n /**\n * Минимальная ширина выпадаюзего списка\n */\n listMinWidth: {\n type: String as PropType<string>,\n default: 'inherit'\n },\n /**\n * Минимальная ширина выпадаюзего списка\n */\n listMaxHeight: {\n type: Number as PropType<number>,\n default: 300\n },\n hideOnSelect: {\n type: Boolean as PropType<boolean>,\n default: true\n }\n})\n\nconst dropdownClasses = computed((): { [key: string]: boolean } => {\n return {\n [`mc-dropdown--position-${local_position.value}`]: !!local_position.value,\n [`mc-dropdown--list-position-${localList_position.value}`]: !!localList_position.value,\n ['mc-dropdown--is-open']: is_open.value\n }\n})\n\nconst dropdownStyles = computed((): { [key: string]: string | number } => {\n return {\n '--dropdown-body-min-width': props.listMinWidth\n }\n})\n\nonMounted((): void => {\n window.addEventListener('resize', throttledCalculateDropdownPosition)\n window.addEventListener('transitionrun', throttledCalculateDropdownPosition)\n})\n\nonBeforeUnmount((): void => {\n window.removeEventListener('resize', throttledCalculateDropdownPosition)\n window.removeEventListener('transitionrun', throttledCalculateDropdownPosition)\n})\n\nconst toggleDropdown = (): void => {\n setOpenState(!is_open.value)\n}\n\nconst handleClickOutside = (e: Event): void => {\n const target = e.target as HTMLElement\n if (is_open.value && !target.closest(`#${id}`)) closeDropdown()\n}\n\nconst closeDropdown = (): void => {\n setOpenState(false)\n}\n\nconst setOpenState = (payload: boolean): void => {\n is_open.value = payload\n emit('update:modelValue', payload)\n\n if (is_open.value) document.addEventListener('click', handleClickOutside)\n else document.removeEventListener('click', handleClickOutside)\n}\n\nconst handleItemClick = (payload: any): void => {\n emit('select', payload)\n if (props.hideOnSelect) closeDropdown()\n}\n\nconst calculateDropdownPosition = (): void => {\n if (!dropdown_body.value) return\n const rect = activator.value?.getBoundingClientRect()\n if (!rect) return\n const space_below: number = window.innerHeight - rect.bottom\n const space_left: number = window.innerWidth - rect.left\n const { offsetHeight: dropdown_height, offsetWidth: dropdown_width } = dropdown_body.value\n // Определяем направление отображения списка\n const auto_list_position: string =\n space_below < dropdown_height ? DropdownListPositions.Top : DropdownListPositions.Bottom\n const auto_position: string = space_left > dropdown_width ? DropdownPositions.Left : DropdownPositions.Right\n // Устанавливаем значения в зависимости от position\n localList_position.value = props.listPosition === DropdownListPositions.Auto ? auto_list_position : props.listPosition\n local_position.value = props.position === DropdownPositions.Auto ? auto_position : props.position\n}\n\nconst throttledCalculateDropdownPosition = () => throttle(() => calculateDropdownPosition())\n\nwatch(() => route, closeDropdown)\nwatch(\n () => props.modelValue,\n (val: boolean): void => {\n if (is_open.value !== val) setOpenState(val)\n\n nextTick((): void => {\n calculateDropdownPosition()\n })\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"mc-dropdown\" :id=\"id\" :class=\"dropdownClasses\" :style=\"dropdownStyles\">\n <div\n class=\"mc-dropdown__toggle\"\n ref=\"activator\"\n tabindex=\"0\"\n @keyup.esc=\"closeDropdown\"\n @click.prevent.stop=\"toggleDropdown\"\n >\n <!-- @slot активатора переключения состояния -->\n <slot name=\"activator\" />\n </div>\n <div ref=\"dropdown_body\" class=\"mc-dropdown__body\">\n <!-- @slot контента -->\n <mc-dropdown-panel :max-height=\"listMaxHeight\">\n <slot>\n <div\n v-for=\"(item, index) in items\"\n :key=\"`dropdown-list-item-${item.id || item.key || index}`\"\n class=\"mc-dropdown-panel__item\"\n @click=\"handleItemClick(item)\"\n >\n <slot name=\"item\" :item=\"item\"></slot>\n </div>\n </slot>\n </mc-dropdown-panel>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/z-indexes' as *;\n@use '../../../assets/tokens/durations' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use 'sass:color' as sasscolor;\n.mc-dropdown {\n $block-name: &;\n --dropdown-body-min-width: inherit;\n\n position: relative;\n display: inline-block;\n\n &__toggle {\n outline: none;\n @include reset-text-indents();\n .mc-svg-icon {\n transition: all $duration-s;\n }\n }\n\n &__body {\n @include position(absolute, null null null 0);\n z-index: $z-index-dropdown;\n height: 0;\n overflow: hidden;\n margin: 0;\n background-color: transparent;\n opacity: 0;\n visibility: hidden;\n min-width: var(--dropdown-body-min-width);\n transition:\n opacity $duration-s,\n transform $duration-s;\n\n .mc-button {\n &:not(.nuxt-link-active):not(.mc-button--is-active):not(.mc-button--variation-red-flat) {\n &:hover {\n background-color: sasscolor.scale($color-purple, $lightness: 90%);\n .mc-button__background {\n opacity: 0 !important;\n }\n }\n }\n }\n }\n\n &--list-position-top {\n #{$block-name} {\n &__body {\n bottom: 100%;\n margin-bottom: $space-100;\n }\n }\n }\n\n &--list-position-bottom {\n #{$block-name} {\n &__body {\n top: 100%;\n margin-top: $space-100;\n }\n }\n }\n\n &--is-open {\n #{$block-name} {\n &__body {\n height: auto;\n visibility: visible;\n overflow: visible;\n opacity: 1;\n }\n }\n\n #{$block-name} {\n &__toggle--rotate-icon {\n .rotate {\n position: relative;\n transform: rotate(180deg);\n }\n }\n }\n }\n\n &--position-right {\n #{$block-name} {\n &__body {\n inset-inline-start: auto;\n inset-inline-end: 0;\n }\n }\n }\n\n &--position-left {\n #{$block-name} {\n &__body {\n inset-inline-start: 0;\n inset-inline-end: auto;\n }\n }\n }\n .mc-dropdown-panel {\n &__item {\n & > * {\n width: 100%;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\nimport type { IGridGutters } from '@/types/IGrid'\nimport { ColumnAlignment, ColumnJustifyAlignment } from '@/enums/Grid'\nimport type { ColumnAlignmentUnion, ColumnJustifyAlignmentUnion } from '@/types/styles/Grid'\n\nconst props = defineProps({\n /**\n * Расстояние между колонками по горизонтали\n */\n gutterX: {\n type: Number,\n default: 0\n },\n\n /**\n * Расстояние между колонками по вертикали\n */\n gutterY: {\n type: Number,\n default: 0\n },\n\n /**\n * Выравнивание по горизонтали\n */\n justify: {\n type: String as () => ColumnJustifyAlignmentUnion,\n default: ColumnJustifyAlignment.Left\n },\n\n /**\n * Выравнивание по вертикали\n */\n align: {\n type: String as () => ColumnAlignmentUnion,\n default: ColumnAlignment.Top\n },\n\n /**\n * Автоматически тянущиеся колонки\n */\n stretch: {\n type: Boolean,\n default: false\n },\n\n /**\n * Перенос колонок\n */\n wrap: {\n type: Boolean,\n default: true\n }\n})\n\nprovide('provideData', { gutterX: props.gutterX, gutterY: props.gutterY } as IGridGutters)\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n [`mc-grid-row--justify-${props.justify}`]: !!props.justify,\n [`mc-grid-row--align-${props.align}`]: !!props.align,\n ['mc-grid-row--stretch']: !!props.stretch\n }\n})\n\nconst styles = computed((): { [key: string]: string | number } => {\n let result = {} as { [key: string]: string | number }\n\n if (props.gutterX !== 0) {\n result['margin-left'] = `${-props.gutterX / 2}px`\n result['margin-right'] = `${-props.gutterX / 2}px`\n }\n\n if (props.gutterY !== 0) {\n result['margin-top'] = `${-props.gutterY / 2}px`\n result['margin-bottom'] = `${-props.gutterY / 2}px`\n }\n\n if (props.wrap) {\n result['flex-wrap'] = 'wrap'\n }\n let justify\n switch (props.justify) {\n case 'left':\n justify = 'flex-start'\n break\n case 'right':\n justify = 'flex-end'\n break\n case 'center':\n justify = 'center'\n break\n case 'around':\n justify = 'space-around'\n break\n case 'between':\n justify = 'space-between'\n break\n }\n let align\n switch (props.align) {\n case 'top':\n align = 'flex-start'\n break\n case 'middle':\n align = 'center'\n break\n case 'bottom':\n align = 'flex-end'\n break\n case 'stretch':\n align = 'stretch'\n break\n }\n if (align) result['--mc-grid-row-align'] = align\n if (justify) result['--mc-grid-row-justify'] = justify\n\n return result\n})\n</script>\n\n<template>\n <div class=\"mc-grid-row\" :class=\"classes\" :style=\"styles\">\n <!-- @slot Слот для дочерних mc-grid-col -->\n <slot />\n </div>\n</template>\n\n<style lang=\"scss\">\n.mc-grid-row {\n $block-name: &;\n display: flex;\n flex-direction: row;\n justify-content: var(--mc-grid-row-justify);\n align-items: var(--mc-grid-row-align);\n &--stretch {\n > .mc-grid-col {\n flex: 1;\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { adaptiveAdditionalProps, adaptivePropsParams, adaptivePropsSizes } from '@/utils/mcGridColAdaptiveProps'\nimport { computed, inject } from 'vue'\nimport type { IGridGutters } from '@/types/IGrid'\nimport type { ColumnSpanUnion } from '@/types/styles/Grid'\nimport { useHelper } from '@/composables'\n\nconst helper = useHelper()\nconst provideData = inject('provideData', { gutterX: 0, gutterY: 0 } as IGridGutters)\n\nconst props = defineProps({\n ...adaptiveAdditionalProps,\n /**\n * Кол-во колонок (всего 12)\n */\n span: { type: [String as () => ColumnSpanUnion] },\n\n /**\n * Очерёдность\n */\n order: { type: Number },\n\n /**\n * Отступ (margin-left)\n */\n offset: { type: Number },\n\n /**\n * Отступ (left)\n */\n push: { type: Number },\n\n /**\n * Отступ (right)\n */\n pull: { type: Number },\n /**\n * Автоматически тянущаяся колонка\n * на всё свободное пространство\n */\n stretchSelf: {\n type: Boolean,\n default: false\n },\n\n /**\n * Основа флекса, которая является начальным размером элемента\n * (указывать с единицами измерения: px, %...)\n */\n basis: {\n type: String,\n default: 'auto'\n }\n})\n\nconst classes = computed((): { [key: string]: boolean } => {\n const list = {} as { [key: string]: boolean }\n adaptivePropsParams.forEach((value) => {\n //@ts-ignore\n list[`mc-grid-col--${value}-${props[value]}`] = !!props[value]\n adaptivePropsSizes.forEach((size) => {\n //@ts-ignore\n const sizeValue = props[`${value}${helper.upperFirst(size)}`]\n list[`mc-grid-col--${value}-${size}-${sizeValue}`] = !!sizeValue\n })\n })\n return list\n})\n\nconst styles = computed((): { [key: string]: string | number } => {\n let colStyle = {} as { [key: string]: string | number }\n\n if (provideData.gutterX !== 0) {\n colStyle['padding-left'] = `${provideData.gutterX / 2}px`\n colStyle['padding-right'] = `${provideData.gutterX / 2}px`\n }\n\n if (provideData.gutterY !== 0) {\n colStyle['padding-top'] = `${provideData.gutterY / 2}px`\n colStyle['padding-bottom'] = `${provideData.gutterY / 2}px`\n }\n\n if (props.stretchSelf) {\n colStyle['flex'] = `1 0 ${props.basis}`\n } else if (props.basis !== 'auto') {\n colStyle['flex'] = `0 0 ${props.basis}`\n }\n\n return props.order ? { ...colStyle, order: props.order } : colStyle\n})\n</script>\n\n<template>\n <div :class=\"classes\" :style=\"styles\" class=\"mc-grid-col\">\n <!-- @slot Слот контента -->\n <slot />\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '@/assets/styles/mixins' as *;\n@use '@/assets/tokens/media-queries' as *;\n.mc-grid-col {\n $block-name: &;\n box-sizing: border-box;\n $cols: 12;\n\n display: block;\n position: relative;\n max-width: 100%;\n\n @mixin generate-col($viewport: '') {\n @for $i from 1 through $cols {\n &--span#{$viewport}-#{$i} {\n flex: 0 0 calc((#{$i} / #{$cols}) * 100%);\n max-width: calc((#{$i} / #{$cols}) * 100%);\n }\n\n &--push#{$viewport}-#{$i} {\n inset-inline-start: calc((#{$i} / #{$cols}) * 100%);\n }\n\n &--pull#{$viewport}-#{$i} {\n inset-inline-end: calc((#{$i} / #{$cols}) * 100%);\n }\n\n &--offset#{$viewport}-#{$i} {\n margin-inline-start: calc((#{$i} / #{$cols}) * 100%);\n }\n\n &--order#{$viewport}-#{$i} {\n order: #{$i};\n }\n }\n }\n\n @include generate-col('');\n\n @media #{$media-query-xs} {\n @include generate-col('-xs');\n }\n\n @media #{$media-query-s} {\n @include generate-col('-s');\n }\n\n @media #{$media-query-m} {\n @include generate-col('-m');\n }\n\n @media #{$media-query-l} {\n @include generate-col('-l');\n }\n\n @media #{$media-query-xl} {\n @include generate-col('-xl');\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McChip from '@/components/elements/McChip/McChip.vue'\nimport { computed, type PropType } from 'vue'\nimport type { ChipVariationUnion } from '@/types'\nimport { ChipSize, Weights } from '@/enums'\nimport { type IFilterTag } from '@/types/IFilter'\n\nconst emit = defineEmits<{\n (e: 'close'): void\n}>()\n\nconst props = defineProps({\n /**\n * Объект тэга\n */\n tag: {\n type: Object as PropType<IFilterTag>,\n required: true\n },\n /**\n * Закрывающийся\n */\n closable: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Активный\n */\n isActive: {\n type: Boolean as PropType<boolean>,\n default: false\n }\n})\n\nconst computedCategory = computed((): string => {\n const append = props.tag.title ? ':' : ''\n return `${props.tag.categoryName}${append}`\n})\n\nconst computedVariation = computed((): ChipVariationUnion => {\n return props.closable ? 'purple-invert' : 'hover-gray'\n})\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-filter-chip': true,\n 'mc-filter-chip--closable': props.closable,\n 'mc-filter-chip--is-active': props.isActive\n }\n})\n\nconst handleChipClick = (e: Event): void => {\n e.stopPropagation()\n /**\n * Событие по закрытию тэга\n */\n emit('close')\n}\n</script>\n\n<template>\n <mc-chip\n :closable=\"closable\"\n :variation=\"computedVariation\"\n :class=\"classes\"\n :size=\"ChipSize.S\"\n @close=\"handleChipClick\"\n >\n <mc-title v-if=\"tag.categoryName\" :weight=\"Weights.SemiBold\">{{ computedCategory }}</mc-title\n >&nbsp;\n <mc-title v-if=\"tag.title\">{{ tag.title }}</mc-title>\n </mc-chip>\n</template>\n\n<style lang=\"scss\">\n@use 'sass:color' as sasscolor;\n@use '../../../../assets/tokens/spacings' as *;\n@use '../../../../assets/tokens/colors' as *;\n.mc-filter-chip {\n $block-name: &;\n border-radius: $space-50;\n &--closable {\n border-radius: $space-150;\n &:hover {\n cursor: pointer;\n background-color: sasscolor.scale($color-purple, $lightness: 60%);\n }\n }\n &--is-active {\n background-color: sasscolor.scale($color-purple, $lightness: 60%);\n }\n .mc-title {\n width: auto;\n }\n}\n</style>\n","<script setup lang=\"ts\">\n//@ts-ignore\nimport { dayjs } from '@/utils/dayjs'\n\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport McTooltip from '@/components/elements/McTooltip/McTooltip.vue'\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McGridRow from '@/components/patterns/McGridRow/McGridRow.vue'\nimport McGridCol from '@/components/patterns/McGridCol/McGridCol.vue'\nimport McFilterChip from '@/components/patterns/McFilter/McFilterChip/McFilterChip.vue'\nimport { computed, type PropType, ref, watch } from 'vue'\nimport { useRandomNumber } from '@/composables/useRandomNumber'\nimport { TooltipPositions, TooltipSizes } from '@/enums'\nimport { useHelper } from '@/composables/useHelper'\nimport { FilterRelations, FilterTypes } from '@/enums/Filter'\nimport type {\n FilterConditionName,\n IFilter,\n IFilterTag,\n IFilterPlaceholders,\n IFilterParsedValueFilterName,\n FilterMoreLessConditionName,\n RangeFilterValue,\n DateFilterValue\n} from '@/types/IFilter'\n\nconst helper = useHelper()\nconst randomNumber = useRandomNumber()\n\nconst emit = defineEmits<{\n (e: 'tag-click', value: IFilterTag): void\n (e: 'tag-change', value: IFilterParsedValueFilterName): void\n (e: 'clear'): void\n}>()\nconst props = defineProps({\n /**\n * Данные фильтра\n */\n modelValue: {\n type: Object as PropType<IFilterParsedValueFilterName>,\n default: () => ({})\n },\n /**\n * Типы фильтров\n */\n filters: {\n type: Array as PropType<IFilter[]>,\n required: true,\n default: () => []\n },\n /**\n * Переводы локализаций\n */\n placeholders: {\n type: Object as PropType<IFilterPlaceholders>,\n required: true\n },\n /**\n * Активный тэг\n */\n activeTag: {\n type: Object as PropType<IFilterTag | null>,\n default: () => ({})\n },\n useTimezone: {\n type: Boolean as PropType<boolean>,\n default: true\n }\n})\n\nconst simpleValues = ref<IFilterParsedValueFilterName>({})\nconst relationValues = ref<IFilterParsedValueFilterName>({})\nconst prettyActiveTag = ref<IFilterTag | null>(null)\n\nconst fastFilterTags = computed((): IFilterTag[] => {\n return simpleTags.value.filter((st) => st && st.type === FilterTypes.Fast)\n})\n\nconst tagsWithoutFast = computed(() => {\n return simpleTags.value.filter((st) => st && st.type !== FilterTypes.Fast)\n})\n\nconst simpleTags = computed((): IFilterTag[] => {\n const tags: IFilterTag[] = []\n !helper.isEmpty(simpleValues.value) &&\n Object.entries(simpleValues.value).forEach(([key, value]) => {\n const _key = key as string\n let _value = value as FilterConditionName\n\n const filter: IFilter = props.filters.find((f) => f.value === _key) || ({} as IFilter)\n if (filter && filter.type === FilterTypes.Fast) {\n tags.push({\n id: randomNumber.timestamp(5),\n categoryName: filter?.name,\n category: _key,\n type: FilterTypes.Fast\n } as IFilterTag)\n } else if (filter) {\n _value = value as FilterMoreLessConditionName\n const from = _value.more ? `${props.placeholders.from} ${getFormattedVal(_value.more, filter)}` : ''\n\n const to = _value.less\n ? `${props.placeholders.to} ${getFormattedVal(\n filter.type === FilterTypes.Date\n ? props.useTimezone\n ? dayjs(_value.less).subtract(1, 'days').format()\n : dayjs(_value.less).format()\n : _value.less,\n filter\n )}`\n : ''\n const space = from && to ? ' ' : ''\n const title = typeof value === 'object' ? `${from}${space}${to}`.toLowerCase() : value\n tags.push({\n id: randomNumber.timestamp(5),\n categoryName: filter?.name,\n title,\n value,\n category: _key\n } as IFilterTag)\n }\n })\n return tags\n})\n\nconst relationRows = computed((): IFilterTag[][] => {\n let tags: IFilterTag[][] = []\n\n if (!helper.isEmpty(relationValues.value)) {\n tags = Object.entries(relationValues.value).map(([relationKey, relationVal]) => {\n const _relationKey = relationKey as string\n const _relationVal = relationVal as IFilterParsedValueFilterName\n\n if (relationKey === FilterRelations.Exists) {\n const empties: IFilterTag[] = Object.keys(_relationVal).map((key) => {\n const filter = props.filters.find((f) => f.value === key)\n return {\n id: randomNumber.timestamp(5),\n categoryName: filter?.name,\n value: key,\n category: key,\n relationKey,\n closable: true\n } as IFilterTag\n })\n const head = {\n id: randomNumber.timestamp(5),\n categoryName: props.placeholders.actions.empty,\n relationKey: FilterRelations.Exists\n } as IFilterTag\n\n return [head, ...empties]\n }\n const values: IFilterTag[] = []\n Object.entries(_relationVal).forEach(([categoryKey, categoryVal]) => {\n const _categoryKey = categoryKey as string\n const _categoryVal = categoryVal as FilterConditionName\n\n const filter: IFilter = props.filters.find((f) => f.value === _categoryKey) || ({} as IFilter)\n Object.entries(_categoryVal).forEach(([key, val]) => {\n values.push({\n id: randomNumber.timestamp(5),\n categoryName: filter?.name,\n title: val,\n value: key,\n category: _categoryKey,\n relationKey,\n closable: true\n } as IFilterTag)\n })\n })\n const head = {\n id: randomNumber.timestamp(5),\n //@ts-ignore\n categoryName: props.placeholders.actions?.[_relationKey],\n relationKey\n } as IFilterTag\n\n return [head, ...values]\n })\n }\n return tags.filter((t) => t.length > 1)\n})\n\nconst hasButtonClear = computed(() => {\n return relationRows.value.length || simpleTags.value.length\n})\n\nconst splitTags = (value: FilterConditionName) => {\n simpleValues.value = {}\n relationValues.value = {}\n if (helper.isEmpty(value)) return\n addInitTags(value)\n}\n\nconst addInitTags = (parentVal: FilterConditionName, parentKey?: string) => {\n const relationKeys = [FilterRelations.Is, FilterRelations.IsNot, FilterRelations.Exists]\n\n for (let [key, val] of Object.entries(parentVal)) {\n if (relationKeys.includes(key as FilterRelations)) {\n relationValues.value[key] = {\n ...((relationValues.value[key] || {}) as object),\n ...(parentKey ? { [parentKey]: val } : {})\n } as FilterConditionName\n continue\n }\n if (val.constructor !== Object && parentKey) {\n simpleValues.value[parentKey] = parentVal\n continue\n }\n const filter = props.filters.find((f) => f.value === key)\n if (filter && filter.type === FilterTypes.Fast) {\n simpleValues.value[key] = { value: key } as FilterConditionName\n continue\n }\n val && addInitTags(val, key)\n }\n}\n\nconst onTagClick = (tag: IFilterTag) => {\n prettyActiveTag.value = helper.isEqual(prettyActiveTag.value, tag) ? null : tag\n /**\n * Событие по клику на тэг\n */\n emit('tag-click', tag)\n}\nconst onTagClose = (tag: IFilterTag, relationKey?: FilterRelations) => {\n const value = helper.cloneDeep(props.modelValue)\n switch (relationKey) {\n case FilterRelations.Exists:\n delete value[tag.category][relationKey]\n break\n case FilterRelations.Is:\n case FilterRelations.IsNot:\n //@ts-ignore\n delete value[tag.category][relationKey][tag.value]\n if (helper.isEmpty(value[tag.category][relationKey])) {\n delete value[tag.category][relationKey]\n }\n break\n default:\n delete value[tag.category]\n break\n }\n\n if (helper.isEmpty(value[tag.category])) {\n delete value[tag.category]\n }\n /**\n * Событие по изменению набора тэгов\n */\n emit('tag-change', value as IFilterParsedValueFilterName)\n}\n\nconst handleClear = () => {\n /**\n * Событие по очистке всех тэгов\n */\n emit('clear')\n}\n\nconst getFormattedVal = (val: RangeFilterValue | DateFilterValue, filter: IFilter) => {\n switch (filter.type) {\n case FilterTypes.Date:\n return dayjs(val).format('DD.MM.YYYY')\n case FilterTypes.Range:\n return getFormattedNum(val)\n default:\n return val\n }\n}\n\nconst getFormattedNum = (num: RangeFilterValue) => {\n return num\n}\n\nconst checkTagIsActive = (tag: IFilterTag) => {\n return helper.isEqual(prettyActiveTag.value, tag)\n}\n\nwatch(\n () => props.modelValue,\n (val) => {\n splitTags(val)\n },\n { deep: true, immediate: true }\n)\n\nwatch(\n () => props.activeTag,\n (val) => {\n prettyActiveTag.value = val\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div class=\"mc-filter-tags\">\n <mc-title>{{ props.placeholders.added_filters }}</mc-title>\n <div class=\"mc-filter-tags__body\">\n <div class=\"mc-filter-tags__body-left\">\n <mc-grid-row v-if=\"tagsWithoutFast.length\" :gutter-x=\"4\" :gutter-y=\"8\">\n <mc-grid-col v-for=\"tag in tagsWithoutFast\" :key=\"tag.id\">\n <mc-filter-chip\n :tag=\"tag\"\n :is-active=\"checkTagIsActive(tag)\"\n closable\n @click=\"() => onTagClick(tag)\"\n @close=\"() => onTagClose(tag)\"\n />\n </mc-grid-col>\n </mc-grid-row>\n <template v-if=\"relationRows.length\">\n <mc-grid-row v-for=\"(row, index) in relationRows\" :key=\"index\" :gutter-x=\"4\" :gutter-y=\"8\">\n <mc-grid-col v-for=\"tag in row\" :key=\"tag.id\">\n <mc-filter-chip\n :tag=\"tag\"\n :is-active=\"checkTagIsActive(tag)\"\n :closable=\"tag.closable\"\n @click=\"() => onTagClick(tag)\"\n @close=\"() => onTagClose(tag, row[0].relationKey)\"\n />\n </mc-grid-col>\n </mc-grid-row>\n </template>\n <mc-grid-row v-if=\"fastFilterTags.length\" :gutter-x=\"4\" :gutter-y=\"8\">\n <mc-grid-col v-for=\"tag in fastFilterTags\" :key=\"tag.id\">\n <mc-tooltip :content=\"tag.description || ''\" :placement=\"TooltipPositions.Top\" :size=\"TooltipSizes.S\">\n <mc-filter-chip :tag=\"tag\" closable @close=\"() => onTagClose(tag)\" />\n </mc-tooltip>\n </mc-grid-col>\n </mc-grid-row>\n </div>\n <div class=\"mc-filter-tags__body-right\">\n <mc-button v-if=\"hasButtonClear\" variation=\"dark-gray-outline\" @click=\"handleClear\">\n {{ placeholders.actions.clear }}\n </mc-button>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/styles/mixins' as *;\n@use '../../../../assets/tokens/spacings' as *;\n@use '../../../../assets/tokens/colors' as *;\n@use '../../../../assets/tokens/border-radius' as *;\n.mc-filter-tags {\n $block-name: &;\n @include child-indent-bottom($space-100);\n &__body {\n display: flex;\n justify-content: space-between;\n padding: $space-100;\n border: 1px solid $color-outline-gray;\n border-radius: $radius-100;\n background-color: $color-white;\n min-height: $space-500;\n &-left {\n flex-grow: 1;\n }\n &-right {\n margin-inline-start: $space-100;\n .mc-button {\n padding: $space-50 $space-150;\n height: $space-300;\n }\n }\n .mc-grid-row {\n &:not(:last-child) {\n margin-bottom: $space-50 !important;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McFieldText from '@/components/elements/McFieldText/McFieldText.vue'\nimport type { IFilterCondition, IFilterPlaceholders, IFilterRangeValue, IRangeFilter } from '@/types/IFilter.js'\nimport { computed, type PropType, ref, watch } from 'vue'\nimport { InputTypes } from '@/enums'\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: IFilterCondition): void\n}>()\nconst props = defineProps({\n /**\n * Значение\n */\n modelValue: {\n type: Object as PropType<IFilterRangeValue>,\n default: () => ({\n more: null,\n less: null\n } as IFilterRangeValue)\n },\n /**\n * Объект выбранного\n * фильтра\n */\n filter: {\n type: Object as PropType<IRangeFilter>,\n default: () => ({})\n },\n /**\n * Переводы локализаций\n */\n placeholders: {\n type: Object as PropType<IFilterPlaceholders>,\n required: true\n }\n})\n\nconst currentMore = ref<string | number | null>(null)\nconst currentLess = ref<string | number | null>(null)\n\nconst more = computed<string | number | null>({\n get() {\n return props.modelValue?.more\n },\n set(val) {\n currentMore.value = val || null\n emitValue()\n }\n})\n\nconst less = computed<string | number | null>({\n get() {\n return props.modelValue?.less\n },\n set(val) {\n currentLess.value = val || null\n emitValue()\n }\n})\n\nwatch(\n () => props.modelValue,\n (val: IFilterRangeValue): void => {\n if (val) {\n currentMore.value = props.modelValue.more || null\n currentLess.value = props.modelValue.less || null\n }\n },\n { deep: true }\n)\n\nconst hasValue = (val: string | number | null) => {\n return val || Number.isInteger(val)\n}\n\nconst emitValue = () => {\n const hasMore = hasValue(currentMore.value)\n const hasLess = hasValue(currentLess.value)\n const hasMin = props.filter.min && hasValue(props.filter.min)\n const hasMax = props.filter.max && hasValue(props.filter.max)\n\n let more = hasMore ? Number(currentMore.value) : null\n let less = hasLess ? Number(currentLess.value) : null\n\n if (props.filter.min && more && more < props.filter.min && hasMin) {\n more = props.filter.min\n }\n if (props.filter.max && less && less > props.filter.max && hasMax) {\n less = props.filter.max\n }\n if (props.filter.max && more && more > props.filter.max && hasMax) {\n more = props.filter.max\n }\n if (props.filter.min && less && less < props.filter.min && hasMin) {\n less = props.filter.min\n }\n const result: IFilterRangeValue = {\n more: more || null,\n less: less || null\n }\n currentLess.value = less\n currentMore.value = more\n\n /**\n * Событие по изменению интервала\n */\n emit('update:modelValue', { value: result })\n}\n</script>\n\n<template>\n <div class=\"mc-filter-type-range\">\n <mc-field-text\n v-model=\"more\"\n :placeholder=\"placeholders.from.toLowerCase()\"\n :type=\"InputTypes.AmountFormat\"\n name=\"range_more\"\n />\n <mc-field-text\n v-model=\"less\"\n :placeholder=\"placeholders.to.toLowerCase()\"\n :type=\"InputTypes.AmountFormat\"\n name=\"range_less\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/styles/mixins' as *;\n@use '../../../../assets/tokens/spacings' as *;\n.mc-filter-type-range {\n $block-name: &;\n display: flex;\n @include child-indent-right($space-100);\n .mc-field-text {\n width: 146px;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McDatepicker from '@/components/elements/McDatepicker/McDatepicker.vue'\nimport { computed, type PropType } from 'vue'\nimport type { IBaseFilter, IFilterCondition, IFilterDateValue } from '@/types/IFilter'\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: IFilterCondition): void\n}>()\nconst props = defineProps({\n /**\n * Значение\n */\n modelValue: {\n type: Object as PropType<IFilterDateValue>,\n default: () => ({}) as IFilterDateValue\n },\n /**\n * Объект выбранного\n * фильтра\n */\n filter: {\n type: Object as PropType<IBaseFilter>,\n default: () => ({})\n },\n /**\n * Переводы локализаций\n */\n placeholders: {\n type: Object,\n required: true\n },\n useTimezone: {\n type: Boolean as PropType<boolean>,\n default: true\n }\n})\n\nconst period = computed({\n get() {\n return props.modelValue ? [props.modelValue.more, props.modelValue.less] : []\n },\n set(val) {\n const period: IFilterDateValue = { more: val?.[0], less: val?.[1] }\n /**\n * Событие по изменению периода\n */\n emit('update:modelValue', { value: period })\n }\n})\n</script>\n\n<template>\n <mc-datepicker\n v-model=\"period\"\n :placeholders=\"placeholders.calendar\"\n :placeholder=\"filter.placeholder || placeholders.choose\"\n :use-timezone=\"props.useTimezone\"\n name=\"condition_dates\"\n class=\"mc-filter-type-date\"\n range\n />\n</template>\n\n<style lang=\"scss\">\n.mc-filter-type-date {\n $block-name: &;\n width: 300px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport McFieldText from '@/components/elements/McFieldText/McFieldText.vue'\nimport { computed, type PropType } from 'vue'\nimport type { FilterTextValue, IBaseFilter, IFilterCondition, IFilterPlaceholders } from '@/types'\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: IFilterCondition): void\n}>()\nconst props = defineProps({\n /**\n * Значение\n */\n modelValue: {\n type: [String, Number] as PropType<FilterTextValue>,\n default: null\n },\n /**\n * Объект выбранного\n * фильтра\n */\n filter: {\n type: Object as PropType<IBaseFilter>,\n default: () => ({})\n },\n /**\n * Переводы локализаций\n */\n placeholders: {\n type: Object as PropType<IFilterPlaceholders>,\n required: true\n }\n})\n\nconst text = computed({\n get(): FilterTextValue {\n return props.modelValue\n },\n set(val: FilterTextValue) {\n /**\n * Событие по изменению значения\n */\n emit('update:modelValue', { value: val })\n }\n})\n</script>\n\n<template>\n <mc-field-text\n v-model=\"text\"\n :placeholder=\"filter.placeholder || placeholders.enter\"\n class=\"mc-filter-type-text\"\n name=\"mc_filter_type_text\"\n />\n</template>\n\n<style lang=\"scss\">\n.mc-filter-type-text {\n $block-name: &;\n width: 300px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McFieldSelect from '@/components/elements/McFieldSelect/McFieldSelect.vue'\nimport McFieldText from '@/components/elements/McFieldText/McFieldText.vue'\nimport { computed, type PropType, ref, watch, nextTick } from 'vue'\nimport type {\n IFilterPlaceholders,\n FilterRelationValue,\n IRelationFilter,\n FilterOption,\n IFilterParsedValueFilter,\n FilterConditionValue,\n FilterRelationName,\n IFilterCondition\n} from '@/types'\nimport { FilterRelations } from '@/enums'\nimport { useHelper } from '@/composables/useHelper'\nimport { useDebounceFn } from '@vueuse/core'\n\nconst helper = useHelper()\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: IFilterCondition): void\n}>()\nconst props = defineProps({\n /**\n * Значение\n */\n modelValue: {\n type: Object as PropType<FilterRelationValue>,\n default: () => ({})\n },\n /**\n * Объект выбранного\n * фильтра\n */\n filter: {\n type: Object as PropType<IRelationFilter>,\n default: () => ({})\n },\n /**\n * Переводы локализаций\n */\n placeholders: {\n type: Object as PropType<IFilterPlaceholders>,\n required: true\n },\n /**\n * Текущее значение\n * добавленных фильтров\n */\n currentValues: {\n type: Object as PropType<IFilterParsedValueFilter>,\n default: () => ({})\n }\n})\nconst debounce = useDebounceFn((method) => {\n method()\n}, 100)\nconst relations = ref<FilterRelations[]>(Object.values(FilterRelations))\nconst relationType = ref<FilterRelations>(FilterRelations.Is)\nconst ajaxOptions = ref<FilterOption[]>([])\nconst loading = ref<boolean>(false)\n\nconst component = computed(() => {\n return props.filter.is_text ? McFieldText : McFieldSelect\n})\n\nconst computedPlaceholder = computed(() => {\n return props.filter.placeholder || props.filter.is_text ? props.placeholders.enter : props.placeholders.choose\n})\n\nconst isAjax = computed((): boolean => {\n return props.filter.getAjaxOptions?.constructor === Function\n})\n\nconst computedOptions = computed(() => {\n let options: FilterOption[] = isAjax.value ? ajaxOptions.value : props.filter.options || []\n\n if (props.currentValues[props.filter.value]) {\n const category: FilterConditionValue = props.currentValues[props.filter.value] || ({} as FilterRelationValue)\n\n let selected: FilterConditionValue[] = []\n for (let [key, val] of Object.entries(category)) {\n if (key === FilterRelations.Exists) {\n return []\n }\n selected = [...selected, ...(Array.isArray(val) ? val : [[val]])]\n }\n\n options = options.filter((o) => !selected.includes(String(o.value)))\n }\n\n return options\n})\n\nconst selectedOptionValue = computed<FilterRelationValue>({\n get() {\n let val: FilterConditionValue = props.modelValue\n if (val) {\n for (let [relationKey, relationVal] of Object.entries(props.modelValue)) {\n let _relationKey = relationKey as string\n let _relationVal = relationVal as string\n\n if (_relationKey === FilterRelations.Exists) {\n val = ''\n } else {\n val = _relationVal?.[0] || ''\n }\n }\n if (isAjax.value && val) {\n addAjaxOption(val as FilterRelationValue)\n }\n }\n return val as FilterRelationValue\n },\n set(val: FilterRelationValue) {\n if (relationType.value === FilterRelations.Exists) return\n setValue(val)\n }\n})\n\nconst changeRelationType = (relation: FilterRelations): void => {\n if (relationType.value === relation) return\n relationType.value = relation\n setValue(selectedOptionValue.value)\n}\nconst setAjaxOptions = async (value: string): Promise<void> => {\n loading.value = true\n ajaxOptions.value = props.filter.getAjaxOptions && (await props.filter.getAjaxOptions(value))\n loading.value = false\n}\n\nconst addAjaxOption = async (value: FilterRelationValue): Promise<void> => {\n const option = props.filter.getAjaxOne && (await props.filter.getAjaxOne(value))\n ajaxOptions.value = helper.uniqWith([...ajaxOptions.value, option], helper.isEqual)\n}\n\nconst handleSearchChange = (value: string | unknown): void => {\n if (!isAjax.value || !value) return\n debounce(() => setAjaxOptions(value as string))\n}\n\nconst setValue = (value: FilterRelationValue): void => {\n let currentValue: FilterRelationValue | null = null\n let currentValueName: FilterRelationName | null = null\n const hasVal = value || Number.isInteger(value)\n if (relationType.value !== FilterRelations.Exists && hasVal) {\n const name = props.filter.is_text\n ? value\n : computedOptions.value.find((o) => String(o.value) === String(value))?.name\n currentValue = { [relationType.value]: [String(value)] }\n currentValueName = { [relationType.value]: { [String(value)]: name } }\n }\n\n if (relationType.value === FilterRelations.Exists && !props.currentValues[props.filter.value]) {\n currentValue = { [FilterRelations.Exists]: 0 }\n currentValueName = { [FilterRelations.Exists]: null }\n }\n /**\n * Событие по изменению значения\n */\n\n const payload: IFilterCondition = {\n value: currentValue as FilterRelationValue,\n valueName: currentValueName as FilterRelationName\n }\n emit('update:modelValue', payload)\n}\n\nwatch(\n () => props.modelValue,\n (val): void => {\n if (val) {\n for (let relationKey of Object.keys(val)) {\n relationType.value = relationKey as FilterRelations\n }\n }\n },\n { immediate: true }\n)\n\nwatch(\n () => props.filter,\n (): void => {\n relationType.value = FilterRelations.Is\n nextTick(() => (ajaxOptions.value = []))\n }\n)\n</script>\n\n<template>\n <component\n :is=\"component\"\n v-model=\"selectedOptionValue as string\"\n :options=\"computedOptions\"\n :internal-search=\"!isAjax\"\n :placeholder=\"computedPlaceholder\"\n :loading=\"loading\"\n :disabled=\"relationType === FilterRelations.Exists\"\n hide-selected\n class=\"mc-filter-type-relation\"\n :name=\"`relation_${props.filter.type}`\"\n @search-change=\"handleSearchChange\"\n >\n <template #header>\n <div class=\"mc-filter-type-relation__header\">\n <mc-title>{{ placeholders.condition }}</mc-title>\n <div class=\"mc-filter-type-relation__buttons\">\n <mc-button\n v-for=\"relation in relations\"\n :key=\"relation\"\n :variation=\"relationType === relation ? 'purple' : 'dark-gray-outline'\"\n @click=\"() => changeRelationType(relation)\"\n >\n {{ placeholders.actions[`${relation === FilterRelations.Exists ? 'empty' : relation}`] }}\n </mc-button>\n </div>\n </div>\n </template>\n </component>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/styles/mixins' as *;\n@use '../../../../assets/tokens/spacings' as *;\n@use '../../../../assets/tokens/sizes' as *;\n.mc-filter-type-relation {\n $block-name: &;\n width: 300px;\n &__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: -$space-50;\n margin-top: -$space-50;\n }\n &__buttons {\n display: flex;\n @include child-indent-right($space-50);\n .mc-button {\n height: $size-300;\n padding: $space-50 $space-150;\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { Teleport } from 'vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McFieldSelect from '@/components/elements/McFieldSelect/McFieldSelect.vue'\nimport McFieldText from '@/components/elements/McFieldText/McFieldText.vue'\nimport McTooltip from '@/components/elements/McTooltip/McTooltip.vue'\nimport McFilterTags from '@/components/patterns/McFilter/McFilterTags/McFilterTags.vue'\nimport McFilterTypeRange from '@/components/patterns/McFilter/McFilterTypeRange/McFilterTypeRange.vue'\nimport McFilterTypeDate from '@/components/patterns/McFilter/McFilterTypeDate/McFilterTypeDate.vue'\nimport McFilterTypeText from '@/components/patterns/McFilter/McFilterTypeText/McFilterTypeText.vue'\nimport McFilterTypeRelation from '@/components/patterns/McFilter/McFilterTypeRelation/McFilterTypeRelation.vue'\nimport McChip from '@/components/elements/McChip/McChip.vue'\nimport { defaultPlaceholders } from '@/mocks/filterMocks'\n\nimport { computed, onBeforeUnmount, onMounted, type PropType, reactive, ref, watch, nextTick } from 'vue'\nimport type {\n ButtonVariationUnion,\n FilterConditionName,\n FilterConditionValue,\n IFastFilter,\n IFilter,\n IFilterCondition,\n IFilterParsedValue,\n IFilterParsedValueFilter,\n IFilterParsedValueFilterName,\n IFilterPlaceholders,\n IFilterPreset,\n IFilterValue,\n ISelectOption,\n FilterRelationValue,\n FilterRelationName,\n IFilterRelationTag,\n IFilterRangeValue,\n IFilterTag,\n IRelationFilter,\n IFilterDateValue,\n IBaseFilter,\n FilterTextValue,\n IRangeFilter\n} from '@/types'\nimport { useHelper } from '@/composables/useHelper'\nimport { ButtonSize, ChipSize, FilterRelations, FilterTypes, TooltipPositions, TooltipSizes } from '@/enums'\nimport { useLocalStorage } from '@vueuse/core'\nimport { UseEncodeDecode } from '@/composables/useEncodeDecode'\n\nconst helper = useHelper()\nconst emit = defineEmits<{\n (e: 'error', value: string): void\n (e: 'clear', value: string): void\n (e: 'delete-preset', value: string): void\n (e: 'update:modelValue', value: IFilterValue): void\n (e: 'confirm', value: IFilterValue): void\n}>()\nconst props = defineProps({\n /**\n * Имя фильтра\n * (для записи данных в стор)\n */\n name: {\n type: String as PropType<string>,\n required: true\n },\n /**\n * Значение фильтра\n */\n modelValue: {\n type: Object as PropType<IFilterValue>,\n required: true,\n default: () => ({ filter: null, filter_name: null })\n },\n /**\n * Типы фильтров\n */\n filters: {\n type: Array as PropType<IFilter[]>,\n required: true,\n default: () => []\n },\n /**\n * Лоадинг кнопки применить фильтр\n */\n buttonConfirmIsLoading: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Использовать ли teleport (для рендеринга вне компонента)\n * Если да то необходимо создать блок с id=\"filterTeleportTarget\" в который будет рендериться тело фильтра\n */\n useTeleport: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Доступен ли фильтр для открытия\n */\n disabledOpen: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Нужно ли учитывать часовой пояс при работе с фильтром типа Date\n * */\n useTimezone: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Переводы плейсхолеров и текстов\n */\n placeholders: {\n type: Object as PropType<Partial<IFilterPlaceholders>>,\n default: () => ({})\n }\n})\n\nconst isOpen = ref<boolean>(false)\n\n// текущие значения фильтра filter / filter_name\nconst currentValues = ref<IFilterParsedValueFilter>({})\nconst currentValuesName = ref<IFilterParsedValueFilterName>({})\n\n//временные значения, до нажатия на кнопку применить фильтр\nconst temporaryFilter = ref<IFilterParsedValueFilter>({})\nconst temporaryFilterName = ref<IFilterParsedValueFilterName>({})\n\n// текущие выбранные значения в типе фильтра\nconst currentCondition = ref<FilterConditionValue>({})\nconst currentConditionName = ref<FilterConditionName>({})\n\n// значение выбранного фильтра из списка фильтров\nconst selectedOptionFilter = ref<string | null>(null)\n\nconst activeTag = ref<IFilterRelationTag | null>(null)\n\nconst placeholders = reactive<IFilterPlaceholders>(helper.deepMerge(defaultPlaceholders, props.placeholders))\n\nconst isDisableConfirmButton = computed(() => {\n return helper.isEqual(computedModelValue.value.filter, currentValues.value)\n})\n\nconst newPresetName = ref<string>('')\nconst activePreset = ref<IFilterPreset | null>(null)\nconst temporaryActivePreset = ref<IFilterPreset | null>(null)\nconst filterLocalStorage = useLocalStorage<Record<string, IFilterPreset[]>>('mcFilterPresets', {})\nconst presets = ref<IFilterPreset[]>([])\n\nconst computedModelValue = computed({\n get(): IFilterParsedValue {\n const { filter = null, filter_name = null } = props.modelValue || {}\n\n return {\n filter: filter,\n filter_name: UseEncodeDecode.decode(filter_name)\n } as IFilterParsedValue\n },\n set(val: IFilterParsedValue) {\n const { filter = null, filter_name = {} } = val || {}\n\n const payload: IFilterValue = {\n filter: filter,\n filter_name: UseEncodeDecode.encode(filter_name)\n } as IFilterValue\n emit('update:modelValue', payload)\n }\n})\n\n// выбранный фильтр из списка фильтров\nconst currentFilter = computed((): IFilter => {\n return props.filters.find((f) => String(f.value) === String(selectedOptionFilter.value)) || ({} as IFilter)\n})\nconst isCurrentComponentIsRelation = computed((): boolean => {\n return currentFilter.value?.type === FilterTypes.Relation\n})\nconst isCurrentComponentIsDate = computed((): boolean => {\n return currentFilter.value?.type === FilterTypes.Date\n})\nconst isCurrentComponentIsText = computed((): boolean => {\n return currentFilter.value?.type === FilterTypes.Text\n})\nconst isCurrentComponentIsRange = computed((): boolean => {\n return currentFilter.value?.type === FilterTypes.Range\n})\n\n// отфильтрованные быстрые фильтры\nconst fastFilters = computed((): IFastFilter[] => {\n const selected = (currentValues.value && Object.keys(currentValues.value)) || []\n return props.filters.filter((f) => f.type === FilterTypes.Fast && !selected.includes(f.value)) as IFastFilter[]\n})\n\n// отфильтрованные фильтры кроме быстрых\nconst regularFilters = computed((): ISelectOption[] => {\n return props.filters.filter((f) => f.type !== FilterTypes.Fast)\n})\n\nconst visibilityToggleVariation = computed((): ButtonVariationUnion => {\n return isOpen.value || !isDisableConfirmButton.value ? 'purple-invert' : 'black-flat'\n})\n\n// видна ли кнопка добавить фильтр\nconst hasButtonAdd = computed((): boolean => {\n return (\n !helper.isEmpty(currentCondition.value) && !!currentFilter.value && currentFilter.value.type !== FilterTypes.Fast\n )\n})\n\n// задизэйблена ли кнопка создать, для пресетов\nconst buttonCreateIsDisable = computed((): boolean => {\n return !newPresetName.value.trim()\n})\n\nonMounted((): void => {\n updatePresets()\n window.addEventListener('storage', updatePresets)\n\n init()\n})\n\nonBeforeUnmount((): void => {\n window.removeEventListener('storage', updatePresets)\n})\n\nconst init = () => {\n temporaryFilter.value = computedModelValue.value.filter\n temporaryFilterName.value = computedModelValue.value.filter_name\n\n currentValues.value = computedModelValue.value.filter\n currentValuesName.value = computedModelValue.value.filter_name\n}\n\nconst updatePresets = (): void => {\n presets.value = filterLocalStorage.value[props.name] || ([] as IFilterPreset[])\n}\n\nconst handlerSetFastFilter = (tag: IFastFilter): void => {\n const { relation, value } = tag\n\n const filterValue = relation ? { [relation]: tag.default } : tag.default\n\n selectedOptionFilter.value = value\n handleConditionChange({ value: filterValue, valueName: tag.name })\n handleStoreTag()\n}\n\nconst handleConditionChange = ({ value, valueName }: IFilterCondition): void => {\n currentCondition.value = value\n currentConditionName.value = valueName || ''\n}\n\nconst handleStoreTag = (): void => {\n activeTag.value ? editTag() : addTag()\n}\n\nconst editTag = (): void => {\n switch (currentFilter.value?.type) {\n case FilterTypes.Relation: {\n editRelationValue()\n break\n }\n default: {\n addSimpleValue()\n break\n }\n }\n activeTag.value = null\n}\n\nconst addTag = (): void => {\n switch (currentFilter.value?.type) {\n case FilterTypes.Relation: {\n addRelationValue()\n break\n }\n default: {\n addSimpleValue()\n break\n }\n }\n activeTag.value = null\n}\n\nconst editRelationValue = (): void => {\n if (activeTag.value) {\n const tagRelationValue = activeTag.value.relationKey === FilterRelations.Exists ? [0] : [activeTag.value.value]\n const tagRelation = {\n [activeTag.value.category]: {\n [activeTag.value.relationKey as FilterRelations]: tagRelationValue\n }\n }\n\n const selectedRelation: IFilterParsedValueFilter = {\n [selectedOptionFilter.value as string]: helper.cloneDeep(currentCondition.value)\n }\n if (helper.isEqual(selectedRelation, tagRelation)) {\n /**\n * Событие по возникшей ошибке\n */\n emit('error', placeholders.messages.same_filter)\n return\n }\n }\n const { category, categoryName }: { category: FilterRelationValue; categoryName: FilterRelationName } =\n getCategoriesWithNewRelation()\n\n if (activeTag.value) {\n if (activeTag.value.relationKey === FilterRelations.Exists) {\n delete category[activeTag.value.relationKey]\n delete categoryName[activeTag.value.relationKey]\n } else {\n const numerableValues = category[activeTag.value.relationKey]\n const index = numerableValues?.indexOf(String(activeTag.value.value)) ?? -1\n if (index !== -1) {\n category?.[activeTag.value.relationKey]?.splice(index, 1)\n helper.isEmpty(category[activeTag.value.relationKey]) && delete category[activeTag.value.relationKey]\n delete categoryName?.[activeTag.value.relationKey]?.[activeTag.value.value]\n helper.isEmpty(categoryName[activeTag.value.relationKey]) && delete categoryName[activeTag.value.relationKey]\n }\n }\n }\n\n setFilterValues(category, categoryName)\n}\n\nconst addRelationValue = (): void => {\n const { category, categoryName } = getCategoriesWithNewRelation()\n setFilterValues(category, categoryName)\n}\n\nconst getCategoriesWithNewRelation = (): { category: FilterRelationValue; categoryName: FilterRelationName } => {\n const relationKeys = Object.keys(currentCondition.value) as FilterRelations[]\n const values = helper.cloneDeep(currentValues.value)\n const valuesName = helper.cloneDeep(currentValuesName.value)\n const selectedCategory: FilterRelationValue = values[selectedOptionFilter.value as string]\n const selectedCategoryName: FilterRelationName = valuesName[selectedOptionFilter.value as string]\n\n selectedCategory &&\n relationKeys.forEach((k) => {\n if (k === FilterRelations.Exists) {\n selectedCategory[FilterRelations.Exists] = 0\n selectedCategoryName[FilterRelations.Exists] = null\n } else {\n //@ts-ignore\n const conditionValue = currentCondition.value[k]\n //@ts-ignore\n const conditionName = currentConditionName.value[k]\n\n if (k in selectedCategory) {\n //@ts-ignore\n selectedCategory[k] = helper.uniqWith([...selectedCategory[k], ...conditionValue], helper.isEqual)\n selectedCategoryName[k] = {\n ...selectedCategoryName[k],\n ...conditionName\n }\n } else {\n selectedCategory[k] = conditionValue\n selectedCategoryName[k] = conditionName\n }\n }\n })\n return { category: selectedCategory, categoryName: selectedCategoryName }\n}\n\nconst setFilterValues = (val: FilterConditionValue, valName: FilterConditionName): void => {\n const newVal: IFilterParsedValueFilter = {\n ...currentValues.value,\n [selectedOptionFilter.value as string]: val || currentCondition.value\n }\n if (helper.isEqual(currentValues.value, newVal)) {\n /**\n * Событие по возникшей ошибке\n */\n emit('error', placeholders.messages.same_filter)\n return\n }\n currentValues.value = newVal\n currentValuesName.value = {\n ...currentValuesName.value,\n [selectedOptionFilter.value as string]: valName || currentConditionName.value\n }\n\n setEmptyCondition()\n}\n\nconst setEmptyCondition = (): void => {\n switch (currentFilter.value?.type) {\n case FilterTypes.Text:\n case FilterTypes.Relation:\n handleConditionChange({ value: '' })\n break\n case FilterTypes.Range:\n case FilterTypes.Date:\n handleConditionChange({ value: {} })\n break\n default:\n break\n }\n}\n\nconst addSimpleValue = (): void => {\n if (currentFilter.value?.type === FilterTypes.Range && Object.keys(currentCondition.value || {}).length === 2) {\n const _currentCondition = currentCondition.value as IFilterRangeValue\n if (_currentCondition.more && _currentCondition.less && _currentCondition.more > _currentCondition.less) {\n /**\n * Событие по возникшей ошибке\n */\n emit('error', placeholders.messages.more_than)\n return\n }\n }\n setFilterValues(currentCondition.value, currentCondition.value as FilterConditionName)\n}\n\nconst onTagsChange = (val: IFilterParsedValueFilterName): void => {\n activeTag.value = null\n if (helper.isEmpty(val)) {\n currentValues.value = {}\n currentValuesName.value = {}\n return\n }\n currentValuesName.value = helper.cloneDeep(val)\n setRelationsToArrayFormat(val)\n}\n\nconst handleClearAllTags = (): void => {\n temporaryFilter.value = {}\n temporaryFilterName.value = {}\n\n currentValues.value = {}\n currentValuesName.value = {}\n /**\n * Событие по очистке выбранных фильтров из поля\n */\n emit('clear', placeholders.messages.accidentally_cleared)\n}\n\nconst setRelationsToArrayFormat = (obj: IFilterParsedValueFilterName): void => {\n const newObj = helper.cloneDeep(obj)\n const relationKeys = [FilterRelations.Is, FilterRelations.IsNot]\n for (let [categoryKey, categoryVal] of Object.entries(obj)) {\n if (categoryVal.constructor === Object) {\n for (let [key, val] of Object.entries(categoryVal)) {\n if (relationKeys.includes(key as FilterRelations) && val?.constructor === Object) {\n newObj[categoryKey][key] = [...Object.keys(val)]\n }\n }\n }\n }\n currentValues.value = newObj\n}\n\nconst onTagClick = (tag: IFilterTag): void => {\n activeTag.value = (helper.isEqual(activeTag.value, tag) ? null : tag) as IFilterRelationTag\n if (!activeTag.value) {\n setEmptyCondition()\n return\n }\n let condition = null\n let conditionName = null\n if (tag.relationKey) {\n condition = {\n [tag.relationKey]: tag.relationKey === FilterRelations.Exists ? [0] : [String(tag.value)]\n }\n conditionName = {\n [tag.relationKey]: tag.relationKey === FilterRelations.Exists ? [0] : { [tag.value]: tag.title }\n }\n } else {\n condition = tag.value?.constructor === Object ? tag.value : String(tag.value)\n conditionName = tag.value\n }\n\n selectedOptionFilter.value = tag.category\n nextTick(() => {\n currentCondition.value = condition\n currentConditionName.value = conditionName\n })\n}\n\nconst handleConfirm = (): void => {\n /**\n * Событие по изменению значения фильтра\n */\n computedModelValue.value = {\n filter: currentValues.value,\n filter_name: currentValuesName.value\n } as IFilterParsedValue\n\n const payload: IFilterValue = {\n filter: currentValues.value,\n filter_name: UseEncodeDecode.encode(currentValuesName.value)\n } as IFilterValue\n\n emit('confirm', payload)\n}\n\n/**\n * PRESETS BELOW\n * */\n\nconst handlePresetMouseUp = (preset: IFilterPreset) => {\n if (activePreset.value && activePreset.value.name === preset.name) {\n activePreset.value = null\n currentValues.value = {}\n currentValuesName.value = {}\n } else {\n activePreset.value = preset\n currentValues.value = helper.cloneDeep(preset.filter)\n currentValuesName.value = helper.cloneDeep(preset.filter_name)\n }\n if (!isOpen.value) {\n handleConfirm()\n }\n}\n\nconst handleDeletePreset = (preset: IFilterPreset | null): void => {\n const filteredPresets = filterLocalStorage.value[props.name]?.filter((p) => preset && p.name !== preset.name)\n filterLocalStorage.value[props.name] = [...filteredPresets]\n temporaryActivePreset.value = helper.cloneDeep(activePreset.value)\n activePreset.value = null\n currentValues.value = {}\n currentValuesName.value = {}\n /**\n * Событие по удалению пресета\n */\n emit('delete-preset', placeholders.messages.accidentally_deleted)\n}\n\nconst handleCreatePreset = (): void => {\n if (\n filterLocalStorage.value[props.name] &&\n filterLocalStorage.value[props.name].find((p) => p.name?.trim() === newPresetName.value?.trim())\n ) {\n emit('error', placeholders.messages.same_preset_name)\n return\n }\n const preset: IFilterPreset = {\n name: newPresetName.value?.trim(),\n filter: helper.cloneDeep(currentValues.value),\n filter_name: helper.cloneDeep(currentValuesName.value)\n }\n\n const currentPreset = filterLocalStorage.value[props.name]\n if (currentPreset) {\n filterLocalStorage.value[props.name] = [preset, ...currentPreset]\n } else {\n filterLocalStorage.value[props.name] = [preset]\n }\n\n newPresetName.value = ''\n activePreset.value = { ...preset }\n}\n\nconst getPresetButtonVariation = (preset: IFilterPreset): ButtonVariationUnion => {\n return activePreset.value && activePreset.value.name === preset.name ? 'purple-invert' : 'gray-outline'\n}\n\nwatch(\n () => props.modelValue,\n (val: IFilterValue): void => {\n const filter_value: IFilterValue = val || {\n filter: null,\n filter_name: null\n }\n currentValues.value = { ...filter_value.filter }\n if (filter_value.filter_name) {\n try {\n currentValuesName.value = UseEncodeDecode.decode(filter_value.filter_name)\n } catch (e) {\n console.error(`Can't parse filters`)\n }\n }\n },\n { deep: true }\n)\n\nwatch(\n () => currentFilter.value,\n (): void => {\n handleConditionChange({ value: '' })\n },\n { deep: true }\n)\n\nwatch(\n () => currentValues.value,\n (): void => {\n if (activePreset.value) {\n const mappedPresets = filterLocalStorage.value[props.name].map((p) => {\n if (activePreset.value && p.name === activePreset.value.name) {\n return {\n name: p.name,\n filter: helper.cloneDeep(currentValues.value),\n filter_name: helper.cloneDeep(currentValuesName.value)\n }\n }\n return p\n })\n filterLocalStorage.value[props.name] = [...mappedPresets]\n }\n }\n)\n</script>\n\n<template>\n <div class=\"mc-filter\">\n <div class=\"mc-filter__header\">\n <mc-tooltip :content=\"placeholders.main_tooltip\" :placement=\"TooltipPositions.Top\" :size=\"TooltipSizes.S\">\n <mc-button\n :variation=\"visibilityToggleVariation\"\n :disabled=\"disabledOpen\"\n :bg-flat=\"isOpen\"\n :size=\"ButtonSize.MCompact\"\n @click=\"isOpen = !isOpen\"\n >\n <template #icon-prepend>\n <mc-svg-icon name=\"filter_list\" />\n </template>\n </mc-button>\n </mc-tooltip>\n <div v-if=\"presets\" class=\"mc-filter__presets\">\n <div class=\"mc-filter__presets-inner\">\n <mc-button\n v-for=\"preset in presets\"\n :key=\"preset.name\"\n :variation=\"getPresetButtonVariation(preset)\"\n secondary-color=\"purple\"\n @mouseup=\"() => handlePresetMouseUp(preset)\"\n >\n {{ preset.name }}\n </mc-button>\n </div>\n </div>\n </div>\n <component v-if=\"isOpen\" :is=\"useTeleport ? Teleport : 'div'\" to=\"#filterTeleportTarget\">\n <div class=\"mc-filter__body\">\n <div class=\"mc-filter__body-top\">\n <div class=\"mc-filter__body-top-left\">\n <mc-field-select\n v-model=\"selectedOptionFilter\"\n :title=\"placeholders.value\"\n :options=\"regularFilters\"\n :placeholder=\"placeholders.choose\"\n :hide-selected=\"false\"\n class=\"mc-filter__main-select\"\n name=\"filter_value_name\"\n />\n <template v-if=\"currentFilter\">\n <mc-filter-type-relation\n v-if=\"isCurrentComponentIsRelation\"\n :model-value=\"currentCondition as FilterRelationValue\"\n :filter=\"currentFilter as IRelationFilter\"\n :placeholders=\"placeholders\"\n :current-values=\"!activeTag ? currentValues : {}\"\n :use-timezone=\"props.useTimezone\"\n @update:modelValue=\"handleConditionChange\"\n />\n <mc-filter-type-date\n v-else-if=\"isCurrentComponentIsDate\"\n :model-value=\"currentCondition as IFilterDateValue\"\n :filter=\"currentFilter as IBaseFilter\"\n :placeholders=\"placeholders\"\n :current-values=\"!activeTag ? currentValues : {}\"\n :use-timezone=\"props.useTimezone\"\n @update:modelValue=\"handleConditionChange\"\n />\n <mc-filter-type-text\n v-else-if=\"isCurrentComponentIsText\"\n :model-value=\"currentCondition as FilterTextValue\"\n :filter=\"currentFilter as IBaseFilter\"\n :placeholders=\"placeholders\"\n :current-values=\"!activeTag ? currentValues : {}\"\n :use-timezone=\"props.useTimezone\"\n @update:modelValue=\"handleConditionChange\"\n />\n <mc-filter-type-range\n v-else-if=\"isCurrentComponentIsRange\"\n :model-value=\"currentCondition as IFilterRangeValue\"\n :filter=\"currentFilter as IRangeFilter\"\n :placeholders=\"placeholders\"\n :current-values=\"!activeTag ? currentValues : {}\"\n :use-timezone=\"props.useTimezone\"\n @update:modelValue=\"handleConditionChange\"\n />\n <mc-button v-if=\"hasButtonAdd\" variation=\"purple-outline\" @click=\"handleStoreTag\">\n {{ placeholders.actions[activeTag ? 'save' : 'add'] }}\n </mc-button>\n </template>\n </div>\n </div>\n <mc-filter-tags\n :model-value=\"currentValuesName\"\n :filters=\"filters\"\n :placeholders=\"placeholders\"\n :active-tag=\"activeTag\"\n :use-timezone=\"props.useTimezone\"\n @tag-change=\"(payload: IFilterParsedValueFilterName) => onTagsChange(payload)\"\n @tag-click=\"(payload: IFilterTag) => onTagClick(payload)\"\n @clear=\"handleClearAllTags\"\n />\n <section class=\"mc-filter__body-fast-tags-wrapper\">\n <mc-tooltip\n v-for=\"(tag, i) in fastFilters\"\n :key=\"i\"\n :content=\"tag.description || ''\"\n :placement=\"TooltipPositions.Top\"\n :size=\"TooltipSizes.S\"\n >\n <mc-chip variation=\"gray-outline\" text-color=\"black\" :size=\"ChipSize.S\" @click=\"handlerSetFastFilter(tag)\">\n {{ tag.name }}\n </mc-chip>\n </mc-tooltip>\n </section>\n <div class=\"mc-filter__body-bottom\">\n <div class=\"mc-filter__body-bottom-left\">\n <mc-button\n :disabled=\"isDisableConfirmButton\"\n :loading=\"buttonConfirmIsLoading\"\n :size=\"ButtonSize.S\"\n @click=\"handleConfirm\"\n >\n {{ placeholders.actions.confirm }}\n </mc-button>\n <mc-button\n v-if=\"activePreset\"\n variation=\"red-outline\"\n :size=\"ButtonSize.S\"\n @click=\"() => handleDeletePreset(activePreset)\"\n >\n {{ placeholders.actions.delete_preset }}\n <template #icon-append>\n <mc-svg-icon name=\"delete\" size=\"250\" color=\"red\" />\n </template>\n </mc-button>\n </div>\n <div class=\"mc-filter__body-bottom-right\">\n <mc-title class=\"mc-filter__preset-input-title\">\n {{ placeholders.create_preset }}\n <template #icon-append>\n <mc-tooltip\n :content=\"placeholders.enter_preset_tooltip\"\n :placement=\"TooltipPositions.Top\"\n :size=\"TooltipSizes.S\"\n >\n <mc-svg-icon name=\"help_solid\" size=\"250\" color=\"outline-gray\" />\n </mc-tooltip>\n </template>\n </mc-title>\n <mc-field-text\n v-model=\"newPresetName\"\n :placeholder=\"placeholders.enter_preset_name\"\n :max-length=\"20\"\n class=\"mc-filter__preset-input\"\n name=\"preset_name\"\n />\n <mc-button\n :disabled=\"buttonCreateIsDisable\"\n variation=\"purple-outline\"\n :size=\"ButtonSize.S\"\n @click=\"handleCreatePreset\"\n >\n {{ placeholders.actions.create }}\n </mc-button>\n </div>\n </div>\n </div>\n </component>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use 'sass:color' as sasscolor;\n\n.mc-filter {\n $block-name: &;\n flex-grow: 1;\n min-width: 0;\n &__header {\n display: flex;\n @include child-indent-right($space-100);\n }\n\n &__presets {\n position: relative;\n flex-grow: 1;\n min-width: 0;\n &::after {\n @include pseudo();\n @include position(null, 0 0 0 null);\n width: $size-1000;\n background: linear-gradient(90deg, hsla(0, 0%, 100%, 0) 0, $color-white);\n pointer-events: none;\n }\n\n &-inner {\n display: flex;\n flex-wrap: nowrap;\n overflow-x: auto;\n height: calc(#{$space-500} + 2px);\n @include child-indent-right($space-100);\n & {\n @include hide-scrollbar();\n }\n &::after {\n @include pseudo(block, static);\n min-width: $space-300;\n }\n }\n }\n\n &__body {\n padding: $space-200 $space-200 $space-300 $space-200;\n background-color: $color-hover-gray;\n @include child-indent-bottom($space-200);\n &-top {\n display: flex;\n @include child-indent-right($space-400);\n\n &-left,\n &-right {\n @include child-indent-right($space-100);\n }\n &-left {\n display: flex;\n align-items: flex-end;\n }\n }\n &-bottom {\n display: flex;\n align-items: center;\n justify-content: space-between;\n @include child-indent-right($space-400);\n\n &-left {\n > *:not(:first-child) {\n margin-inline-start: $space-200;\n }\n }\n &-right {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n @include child-indent-right($space-100);\n .mc-title,\n .mc-tooltip-target {\n display: inline-flex;\n align-items: center;\n }\n }\n .mc-button {\n &--disabled {\n opacity: 1;\n background-color: sasscolor.scale($color-dark-gray, $lightness: 80%);\n color: $color-dark-gray;\n border-color: sasscolor.scale($color-dark-gray, $lightness: 100%);\n .mc-button__background {\n display: none;\n }\n }\n }\n }\n &-fast-tags-wrapper {\n margin: -($space-50);\n & > .mc-tooltip-target {\n .mc-chip {\n cursor: pointer;\n margin: calc(#{$space-100} / 2) calc(#{$space-50} / 2);\n &:hover {\n background-color: $color-outline-gray;\n }\n }\n }\n }\n }\n &__main-select,\n &__preset-input {\n width: 270px;\n }\n &__preset-input-title {\n width: auto;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { Colors, type ColorTypes, Sizes, type SizeTypes } from '@/types'\nimport { computed } from 'vue'\n\nconst props = defineProps({\n size: {\n type: String as () => SizeTypes,\n default: '500'\n },\n backgroundColor: {\n type: String as () => ColorTypes,\n default: 'white'\n }\n})\nconst styles = computed((): { [key: string]: string } => {\n return {\n '--mc-overlay-color': props.backgroundColor && Colors[props.backgroundColor],\n '--mc-overlay-spinner-size': props.size && Sizes[props.size]\n }\n})\n</script>\n\n<template>\n <section ref=\"overlay\" class=\"mc-overlay\" :style=\"styles\">\n <div class=\"mc-overlay__background\" />\n <section class=\"mc-overlay__spinner\" />\n </section>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/tokens/z-indexes' as *;\n@use '../../../assets/tokens/colors' as *;\n.mc-overlay {\n $block-name: &;\n --mc-overlay-spinner-size: initial;\n --mc-overlay-color: initial;\n position: absolute;\n top: 0;\n inset-inline-start: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: $z-index-overlay;\n &__background {\n position: absolute;\n left: 0;\n right: 0;\n width: 100%;\n height: 100%;\n background-color: var(--mc-overlay-color);\n opacity: 0.85;\n }\n &__spinner {\n display: block;\n border: 2px solid $color-purple;\n border-inline-start-color: transparent;\n border-radius: 50%;\n animation: rotate 1.5s infinite linear;\n\n width: var(--mc-overlay-spinner-size);\n min-width: var(--mc-overlay-spinner-size);\n height: var(--mc-overlay-spinner-size);\n min-height: var(--mc-overlay-spinner-size);\n\n @keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McDropdown from '@/components/patterns/McDropdown/McDropdown.vue'\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport McPreview from '@/components/patterns/McPreview/McPreview.vue'\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport { computed, inject, type PropType, ref } from 'vue'\nimport { useHelper } from '@/composables/useHelper'\nimport { ButtonSize, DropdownPositions, HorizontalAlignment, SidebarTheme, TitleVariations, Weights } from '@/enums'\nimport type {\n ButtonVariationUnion,\n DropdownPositionsUnion,\n IconsListUnion,\n ISideBarApp,\n ISidebarThemeConfig,\n ISidebarThemeConfigProvide,\n TitleVariationsUnion\n} from '@/types'\nimport { defaultThemes } from '@/mocks/sidebar'\n\nconst helper = useHelper()\nconst provideData = inject<ISidebarThemeConfigProvide>('provideData', {} as ISidebarThemeConfigProvide)\nconst props = defineProps({\n /**\n * Меню приложений\n *\n */\n menuApps: {\n type: Array as PropType<ISideBarApp[]>,\n default: () => []\n },\n /**\n * Название сервиса\n *\n */\n logoTitle: {\n type: String as PropType<string>,\n default: 'Dashboard'\n },\n /**\n * Размер текста названия сервиса\n *\n */\n logoTitleVariation: {\n type: String as () => TitleVariationsUnion,\n default: TitleVariations.Subtitle\n },\n /**\n * Путь до изображения\n */\n logoSrc: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Имя иконки\n * заголовка\n */\n logoIcon: {\n type: String as () => IconsListUnion,\n default: ''\n },\n dropdownPosition: {\n type: String as () => DropdownPositionsUnion,\n default: DropdownPositions.Left\n },\n /**\n * Компактный вид\n */\n compact: {\n type: Boolean as PropType<boolean>,\n default: false\n }\n})\n\nconst dropIsOpen = ref<boolean>(false)\n\nconst themeConfig = computed((): ISidebarThemeConfig => {\n return provideData.currentThemeConfig || defaultThemes[SidebarTheme.Black]\n})\n\nconst computedMenuApps = computed((): ISideBarApp[] | null => {\n if (helper.isEmpty(props.menuApps)) return null\n return props.menuApps.filter((app) => !Object.prototype.hasOwnProperty.call(app, 'isVisible') || app.isVisible)\n})\n</script>\n\n<template>\n <div class=\"mc-side-bar-top\" :class=\"`mc-side-bar-top--theme-${themeConfig.dropdownActivator}`\">\n <mc-preview v-if=\"!computedMenuApps\">\n <template v-if=\"logoSrc\" #left>\n <img class=\"mc-side-bar-top__img\" :src=\"logoSrc\" width=\"24\" height=\"24\" :alt=\"logoTitle\" />\n </template>\n <template #top>\n <mc-title v-if=\"!compact\" :weight=\"Weights.SemiBold\" :variation=\"logoTitleVariation\">\n {{ logoTitle }}\n <template #icon-append>\n <slot name=\"title-append\" />\n </template>\n </mc-title>\n </template>\n </mc-preview>\n <mc-dropdown v-else v-model=\"dropIsOpen\" :position=\"dropdownPosition\" :items=\"computedMenuApps\">\n <template #activator>\n <mc-preview>\n <template #left>\n <img v-if=\"logoSrc\" class=\"mc-side-bar-top__img\" :src=\"logoSrc\" width=\"24\" height=\"24\" :alt=\"logoTitle\" />\n <mc-svg-icon v-else-if=\"logoIcon\" class=\"rotate\" :name=\"logoIcon\" />\n </template>\n <template #top>\n <mc-button\n :variation=\"`${themeConfig.dropdownActivator}-link` as ButtonVariationUnion\"\n :size=\"compact ? ButtonSize.LCompact : ButtonSize.L\"\n class=\"mc-side-bar-top__activator-btn\"\n >\n <mc-title v-if=\"!compact\" :weight=\"Weights.SemiBold\" :variation=\"logoTitleVariation\">\n {{ logoTitle }}\n <template #icon-append>\n <slot name=\"title-append\" />\n </template>\n </mc-title>\n <template #icon-append>\n <mc-svg-icon class=\"rotate\" name=\"arrow_drop_down\" color=\"gray\" />\n </template>\n </mc-button>\n </template>\n </mc-preview>\n </template>\n <template #item=\"{ item }\">\n <mc-button\n full-width\n :text-align=\"HorizontalAlignment.Left\"\n variation=\"black-flat\"\n :href=\"item.href\"\n :to=\"item.to\"\n :target=\"item.target\"\n :is-active=\"item.isActive\"\n :exact=\"item.exact\"\n >\n <template #icon-prepend>\n <mc-svg-icon v-if=\"item.icon\" :name=\"item.icon\" />\n <img v-else-if=\"item.image\" :src=\"item.image\" width=\"24\" height=\"24\" alt=\"service image\" />\n </template>\n {{ item.name }}\n </mc-button>\n </template>\n </mc-dropdown>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/styles/mixins' as *;\n@use '../../../../assets/tokens/spacings' as *;\n@use '../../../../assets/tokens/colors' as *;\n@use '../../../../assets/tokens/line-heights' as *;\n@use '../../../../assets/tokens/sizes' as *;\n@use '../../../../assets/tokens/font-sizes' as *;\n.mc-side-bar-top {\n $block-name: &;\n @include reset-text-indents();\n position: sticky;\n top: -($space-250);\n padding: $space-250 $space-100;\n background: $color-white;\n margin: -($space-250) (-($space-100)) $space-150 !important;\n z-index: 2;\n .mc-dropdown__toggle {\n &:hover {\n cursor: pointer;\n }\n .mc-preview__left {\n margin-inline-end: 0;\n }\n .mc-button {\n line-height: $line-height-250;\n &__text {\n margin-inline-start: $space-100;\n }\n &__append {\n margin-inline-start: 0;\n }\n .rotate {\n @include size($size-200);\n }\n }\n }\n &__img {\n margin-inline-start: $space-100;\n }\n &__activator-btn {\n font-size: $font-size-400;\n line-height: $line-height-300;\n }\n &--theme-white {\n background: $color-black;\n .mc-preview__top {\n .mc-title {\n color: $color-white;\n }\n }\n }\n &--theme-black {\n background: $color-white;\n .mc-preview__top {\n .mc-title {\n color: $color-black;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport McChip from '@/components/elements/McChip/McChip.vue'\nimport type { ButtonVariationUnion, ColorTypes, IconsListUnion, ISidebarThemeConfigProvide } from '@/types'\nimport { computed, inject, type PropType, useAttrs } from 'vue'\nimport { ButtonSize, HorizontalAlignment, SidebarTheme, TooltipPositions } from '@/enums'\nimport { defaultThemes } from '@/mocks/sidebar'\n\nconst attrs = useAttrs()\nconst provideData = inject<ISidebarThemeConfigProvide>('provideData', {} as ISidebarThemeConfigProvide)\nconst props = defineProps({\n /**\n * Если нужна ссылка внутри приложения:\n */\n to: {\n type: Object as PropType<string>,\n default: null\n },\n /**\n * Если нужна обычная ссылка:\n * `https://mcpay.io/`\n */\n href: {\n type: String as PropType<string>,\n default: null\n },\n /**\n * Если нужна иконка\n */\n icon: {\n type: String as () => IconsListUnion,\n default: ''\n },\n /**\n * Если нужен конкретный\n * цвет иконки\n */\n iconColor: {\n type: String as () => ColorTypes,\n default: 'currentColor'\n },\n /**\n * Тайтл кнопки\n */\n title: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Compact size\n */\n compact: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Дизайн:\n * `purple, red, purple-outline, purple-invert, purple-flat и т.д.`\n */\n variation: {\n type: String as () => ButtonVariationUnion\n },\n /**\n * Если нужен другой цвет при взаимодействии\n */\n secondaryColor: {\n type: String as () => ColorTypes\n },\n withTooltip: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n withIndicator: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n isActive: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Additional info\n */\n info: {\n type: [String, Number] as PropType<string | number | null>,\n default: ''\n },\n /**\n * Exact\n *\n */\n exact: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Отключенное состояние\n *\n */\n disabled: {\n type: Boolean as PropType<boolean>,\n default: false\n }\n})\n\nconst themeConfig = computed(() => {\n return provideData.currentThemeConfig || defaultThemes[SidebarTheme.Black]\n})\n\nconst classes = computed(() => {\n return {\n 'mc-side-bar-button': true,\n [`mc-side-bar--${themeConfig.value.mode || 'black'}__button`]: true,\n 'purple-hover': !props.secondaryColor && themeConfig.value.mainMenuLinks.variable === 'black-flat',\n //@ts-ignore\n [attrs.class]: !!attrs.class\n }\n})\n\nconst btnAttrs = computed(() => {\n return {\n ...attrs,\n variation: props.variation || themeConfig.value.mainMenuLinks.variable,\n secondaryColor: props.secondaryColor || themeConfig.value.mainMenuLinks.secondaryColor,\n textAlign: HorizontalAlignment.Left,\n fullWidth: true,\n size: props.compact ? ButtonSize.SCompact : ButtonSize.S,\n href: props.href,\n to: props.to,\n exact: props.exact,\n disabled: props.disabled,\n isActive: props.isActive,\n tooltip: props.compact && props.withTooltip ? props.title : '',\n tooltipPlacement: TooltipPositions.Right\n }\n})\n</script>\n\n<template>\n <mc-button v-bind=\"btnAttrs\" :class=\"classes\">\n <template #icon-prepend>\n <mc-svg-icon v-if=\"icon\" :fill=\"iconColor\" class=\"mc-side-bar-button__icon\" :name=\"icon\" />\n <span v-if=\"icon && compact && (info || withIndicator)\" class=\"mc-side-bar-button__dot\" />\n </template>\n <template v-if=\"!compact\">{{ title }}</template>\n <template v-if=\"!compact\" #icon-append>\n <mc-chip\n v-if=\"info || withIndicator\"\n variation=\"purple\"\n class=\"mc-side-bar-button__chip\"\n :class=\"{ indicator: withIndicator }\"\n >\n {{ withIndicator ? '' : info }}\n </mc-chip>\n </template>\n </mc-button>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/styles/mixins' as *;\n@use '../../../../assets/tokens/colors' as *;\n@use '../../../../assets/tokens/sizes' as *;\n@use '../../../../assets/tokens/spacings' as *;\n@use '../../../../assets/tokens/border-radius' as *;\n.mc-side-bar-button {\n $block-name: &;\n &__tooltip {\n width: 100%;\n }\n &__dot {\n @include position(absolute, $space-100 6px null null);\n @include size($size-100);\n background-color: $color-purple;\n border-radius: $radius-circle;\n }\n &__chip {\n &.indicator {\n margin: 6px;\n padding: 0 !important;\n width: $size-150;\n min-height: $size-150;\n }\n }\n &.mc-button {\n padding: $space-100;\n opacity: 1;\n height: auto;\n border-radius: $space-50;\n justify-content: flex-start;\n .mc-svg-icon {\n @include size($size-300);\n }\n &.purple-hover:hover {\n background-color: $color-lighter-purple;\n }\n\n .mc-button__text {\n margin-inline-end: $space-100;\n }\n .mc-button__prepend {\n margin-inline-end: $space-100;\n }\n .mc-button__append {\n margin-inline-start: auto;\n }\n .mc-chip {\n height: auto;\n padding: $space-50 $space-100;\n font-variant-numeric: tabular-nums;\n }\n }\n}\n.mc-side-bar {\n &--black__button {\n &.mc-button--is-active,\n &.mc-button.nuxt-link-active {\n color: $color-white;\n background-color: rgba(92, 102, 112, 0.4);\n pointer-events: auto;\n }\n }\n &--white__button {\n &.mc-button--is-active,\n &.mc-button.nuxt-link-active {\n color: $color-purple;\n background-color: $color-lighter-purple;\n pointer-events: auto;\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McSideBarButton from '@/components/patterns/McSideBar/McSideBarButton/McSideBarButton.vue'\nimport McSeparator from '@/components/elements/McSeparator/McSeparator.vue'\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport { useRandomNumber } from '@/composables/useRandomNumber'\nimport { computed, inject, nextTick, onBeforeMount, type PropType, ref, watch } from 'vue'\nimport { useRoute } from 'vue-router'\nimport type { ISideBarChatra, ISideBarMenuItem, ISideBarMenuItemEnrichment, ISidebarThemeConfigProvide } from '@/types'\nimport { ButtonSize, SidebarTheme } from '@/enums'\nimport McSlideUpDown from '@/components/elements/McSlideUpDown/McSlideUpDown.vue'\nimport { defaultThemes } from '@/mocks/sidebar'\n\nconst route = useRoute()\nconst randomNumber = useRandomNumber()\nconst provideData = inject<ISidebarThemeConfigProvide>('provideData', {} as ISidebarThemeConfigProvide)\nconst emit = defineEmits<{\n (e: 'open-side-bar'): void\n (e: 'handlerChatraClick'): void\n}>()\nconst props = defineProps({\n /**\n * Заголовок\n */\n title: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Центральное меню\n */\n menuMain: {\n type: Array as PropType<ISideBarMenuItem[]>,\n default: () => []\n },\n /**\n * Каунты для пунктов меню\n * вставляются в пункты с ключем 'count_key'\n *\n */\n counts: {\n type: Object as PropType<Record<string, number | null>>,\n default: () => ({})\n },\n /**\n * Id чатры\n *\n */\n chatraConfig: {\n type: Object as PropType<ISideBarChatra>,\n default: () => ({})\n },\n /**\n * Компактный вид\n */\n compact: {\n type: Boolean as PropType<boolean>,\n default: false\n }\n})\n\nconst loading = ref<boolean>(true)\nconst preparedMainMenu = ref<ISideBarMenuItemEnrichment[]>([])\n\nconst themeConfig = computed(() => {\n return provideData.currentThemeConfig || defaultThemes[SidebarTheme.Black]\n})\n\nonBeforeMount((): void => {\n setMainMenu()\n})\n\nwatch(\n () => props.menuMain,\n (): void => {\n setMainMenu()\n },\n { deep: true }\n)\nwatch(\n () => props.compact,\n (): void => {\n setMainMenu()\n }\n)\n\n// если переходим на роут с вложенным меню, открываем вложенное меню\nwatch(\n () => route,\n (newRoute, oldRoute): void => {\n loading.value = true\n if (oldRoute.path !== newRoute.path) {\n const target_route = preparedMainMenu.value.find(\n (r) => r.to === newRoute.path || r.menu?.find((childRoute) => childRoute.to === newRoute.path)\n )\n target_route?.menu && !props.compact && (target_route.open = true)\n }\n nextTick(() => {\n preparedMainMenu.value.forEach((mi) => {\n const exact_route = mi.to === newRoute.path\n const route_menu_match_new_route =\n mi.menu && mi.menu.some((mim) => mim.to?.match(newRoute?.path) || newRoute.path?.match(mim.to as string))\n if (!(exact_route || route_menu_match_new_route)) mi.open = false\n })\n loading.value = false\n })\n }\n)\n\nconst getMenuItemHeadClasses = (menuMainItem: ISideBarMenuItemEnrichment) => {\n return {\n open: menuMainItem.open,\n active: menuMainItem.active(),\n 'with-submenu': menuMainItem.menu && menuMainItem.menu.length,\n [`mc-side-bar--${themeConfig.value.mode || 'black'}__button`]: true,\n 'purple-hover': themeConfig.value.mainMenuLinks.variable === 'black-flat',\n [`mc-button--variation-${themeConfig.value.mainMenuLinks.variable}`]: !!themeConfig.value.mainMenuLinks.variable,\n ['mc-side-bar--black__button mc-button nuxt-link-active']:\n menuMainItem.menu && menuMainItem.menu.length && !menuMainItem.open && menuMainItem.active()\n }\n}\n\nconst handlerSidebarItemClick = () => {\n props.compact && emit('open-side-bar')\n}\n\n// заранее формируем меню один раз, так как компьютед излишен и во вторых нужна переменная \"open\" что бы ее тогглить\nconst setMainMenu = (): void => {\n loading.value = true\n preparedMainMenu.value = props.menuMain.map((i: ISideBarMenuItem) => {\n const active = () => {\n return (i.menu && i.menu.some((r) => route?.path?.match(r.to as string))) || !!route?.path?.match(i.to as string)\n }\n\n return {\n id: randomNumber.timestamp(5),\n ...i,\n active,\n indicator: () => i.menu && i.menu.some((r) => !!props.counts?.[r.count_key]),\n open: !props.compact && active()\n } as ISideBarMenuItemEnrichment\n })\n loading.value = false\n}\n</script>\n\n<template>\n <div class=\"mc-side-bar-center\">\n <mc-title v-if=\"title\" class=\"mc-side-bar-center__title\" :color=\"compact ? 'transparent' : 'dark-gray'\">\n {{ title }}\n </mc-title>\n <!-- v-show hides jumping with child menu opening after locale switch -->\n <div v-show=\"!loading\" v-if=\"preparedMainMenu && preparedMainMenu.length\" class=\"mc-side-bar-center__content\">\n <div\n v-for=\"menuMainItem in preparedMainMenu\"\n :key=\"menuMainItem.id\"\n :class=\"{ 'item-active': menuMainItem.active() }\"\n class=\"mc-side-bar-center__content-item item\"\n >\n <div class=\"item__head\" :class=\"getMenuItemHeadClasses(menuMainItem)\" @click=\"handlerSidebarItemClick\">\n <!-- TODO refactor info -->\n <mc-side-bar-button\n :info=\"\n !(menuMainItem.menu && !!menuMainItem.menu.length)\n ? menuMainItem.info || props.counts[menuMainItem.count_key] || null\n : null\n \"\n :href=\"menuMainItem.href\"\n :to=\"menuMainItem.to\"\n :icon=\"menuMainItem.icon\"\n :icon-color=\"menuMainItem.iconColor\"\n :title=\"menuMainItem.name\"\n :compact=\"compact\"\n :is-active=\"menuMainItem.active()\"\n :with-submenu=\"menuMainItem.menu && !!menuMainItem.menu.length\"\n :with-indicator=\"menuMainItem.indicator() && !menuMainItem.open\"\n with-tooltip\n class=\"item__head-button--no-hover\"\n />\n <mc-button\n v-if=\"menuMainItem.menu && menuMainItem.menu.length && !compact\"\n :variation=\"menuMainItem.active() ? 'white-link' : 'gray-link'\"\n :size=\"ButtonSize.MCompact\"\n class=\"item__head-arrow\"\n :class=\"{\n rotate: menuMainItem.active() ? menuMainItem.active() && menuMainItem.open : menuMainItem.open\n }\"\n @click=\"menuMainItem.open = !menuMainItem.open\"\n >\n <template #icon-prepend>\n <mc-svg-icon name=\"arrow_forward\" />\n </template>\n </mc-button>\n </div>\n <mc-slide-up-down\n v-if=\"menuMainItem.menu && menuMainItem.menu.length\"\n class=\"item__submenu\"\n :active=\"menuMainItem.active() ? menuMainItem.active() && menuMainItem.open : menuMainItem.open\"\n >\n <mc-side-bar-button\n v-for=\"(menuItem, i) in menuMainItem.menu\"\n :key=\"i\"\n :info=\"counts[menuItem.count_key]\"\n :href=\"menuItem.href\"\n :to=\"menuItem.to\"\n :icon=\"menuItem.icon\"\n :icon-color=\"menuItem.iconColor\"\n :title=\"menuItem.name\"\n :compact=\"compact\"\n with-tooltip\n />\n </mc-slide-up-down>\n </div>\n </div>\n <mc-separator\n v-if=\"chatraConfig.title\"\n color=\"dark-gray\"\n indent-top=\"150\"\n indent-bottom=\"150\"\n :indent-left=\"compact ? '50' : '100'\"\n :indent-right=\"compact ? '50' : '100'\"\n />\n <mc-side-bar-button\n v-if=\"chatraConfig.title\"\n icon=\"chat_messages\"\n :title=\"chatraConfig.title\"\n :compact=\"compact\"\n with-tooltip\n @click=\"emit('handlerChatraClick')\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/styles/mixins' as *;\n@use '../../../../assets/tokens/spacings' as *;\n@use '../../../../assets/tokens/colors' as *;\n.mc-side-bar-center {\n $block-name: &;\n margin-bottom: $space-150;\n &__title {\n margin: $space-100;\n }\n\n &__content {\n @include child-indent-bottom($space-50);\n .item {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n @include child-indent-bottom($space-50);\n &-active {\n .item__head.active:not(.with-submenu),\n .nuxt-link-exact-active {\n pointer-events: none;\n }\n }\n .with-submenu {\n pointer-events: all !important;\n .item__head {\n &-button--no-hover {\n .mc-button {\n background: none;\n }\n }\n }\n .mc-side-bar-button {\n &__tooltip {\n width: calc(100% - #{$space-250});\n .mc-button {\n &__text {\n margin-inline-end: $space-zero;\n }\n }\n }\n }\n }\n &__head {\n display: flex;\n align-items: center;\n border-radius: 4px;\n\n .mc-button {\n &__background {\n display: none;\n }\n }\n &:hover {\n background-color: rgba($color-gray, 0.1);\n }\n &-arrow {\n &.rotate {\n .mc-svg-icon {\n transform: rotate(90deg);\n }\n }\n .mc-svg-icon {\n transition: all 0.3s ease;\n }\n }\n &-button {\n &--no-hover {\n .mc-button {\n &:hover {\n background-color: unset;\n }\n }\n .mc-side-bar-button__with-submenu {\n background-color: unset;\n }\n &:hover {\n background-color: unset;\n }\n }\n }\n &.active {\n padding: 0;\n border-radius: 4px;\n border: none;\n &.open {\n background-color: unset;\n }\n }\n }\n &__submenu {\n overflow: hidden;\n transition: all 0.3s ease;\n @include child-indent-bottom($space-50);\n .mc-side-bar-button {\n padding-inline-start: $space-500;\n height: 42px;\n }\n &.open {\n max-height: 230px;\n }\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McSideBarButton from '@/components/patterns/McSideBar/McSideBarButton/McSideBarButton.vue'\nimport { computed, inject, type PropType } from 'vue'\nimport type { ButtonVariationUnion, ColorTypes, ISidebarThemeConfigProvide } from '@/types'\nimport { defaultThemes } from '@/mocks/sidebar'\nimport { SidebarTheme } from '@/enums'\n\nconst provideData = inject<ISidebarThemeConfigProvide>('provideData', {} as ISidebarThemeConfigProvide)\nconst emit = defineEmits<{\n (e: 'toggle-size', value: boolean): void\n}>()\nconst props = defineProps({\n /**\n * Текст кнопки\n * сворачивания меню\n */\n hideText: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Компактный вид\n */\n compact: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n hiddenMode: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n sidebarWidth: {\n type: String as PropType<string>,\n default: null\n }\n})\n\nconst themeConfig = computed(() => {\n return provideData.currentThemeConfig || defaultThemes[SidebarTheme.Black]\n})\n\nconst closeButtonProps = computed((): { variable: ButtonVariationUnion; secondaryColor: ColorTypes } => {\n return themeConfig.value?.closeButton\n})\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-side-bar-bottom--compact': props.compact\n }\n})\n\nconst messageStyles = computed((): { [key: string]: string } => {\n return {\n minWidth: props.sidebarWidth\n }\n})\n\nconst handleClick = (): void => {\n emit('toggle-size', !props.compact)\n}\n</script>\n\n<template>\n <div class=\"mc-side-bar-bottom\" :class=\"classes\">\n <div v-if=\"!compact && $slots['bottom-message']\" class=\"mc-side-bar-bottom__slot-message\" :style=\"messageStyles\">\n <slot name=\"bottom-message\" />\n </div>\n <mc-side-bar-button\n v-if=\"!hiddenMode\"\n class=\"mc-side-bar-bottom__hide-button\"\n icon=\"arrow_backward\"\n :title=\"hideText\"\n :compact=\"compact\"\n :variation=\"closeButtonProps.variable\"\n :secondary-color=\"closeButtonProps.secondaryColor\"\n @click.stop.prevent=\"handleClick\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/tokens/durations' as *;\n@use '../../../../assets/tokens/spacings' as *;\n.mc-side-bar-bottom {\n $block-name: &;\n\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n justify-content: flex-end;\n min-height: max-content;\n\n &__hide-button {\n .mc-side-bar-button__icon {\n transition: transform $duration-s;\n }\n }\n\n &--compact {\n #{$block-name}__hide-button {\n .mc-side-bar-button__icon {\n transform: rotate(180deg);\n }\n }\n }\n &__slot-message {\n margin-inline-start: -$space-100;\n margin-inline-end: -$space-100;\n padding-inline-start: $space-100;\n padding-inline-end: $space-100;\n & + * {\n margin-top: $space-500;\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, type PropType, provide, reactive, ref, watch } from 'vue'\nimport McSideBarTop from '@/components/patterns/McSideBar/McSideBarTop/McSideBarTop.vue'\nimport McSideBarCenter from '@/components/patterns/McSideBar/McSideBarCenter/McSideBarCenter.vue'\nimport McSideBarBottom from '@/components/patterns/McSideBar/McSideBarBottom/McSideBarBottom.vue'\nimport type {\n IconsListUnion,\n ISideBarApp,\n ISideBarChatra,\n ISideBarMenuItem,\n ISidebarThemeConfig,\n ISidebarThemeConfigProvide,\n TitleVariationsUnion\n} from '@/types'\nimport { defaultThemes } from '@/mocks/sidebar'\nimport { SidebarTheme, TitleVariations } from '@/enums'\n\nconst emit = defineEmits<{\n (e: 'absolute-mode', value: boolean): void\n (e: 'hidden-mode', value: boolean): void\n (e: 'compact', value: boolean): void\n (e: 'chatraClick'): void\n}>()\nconst props = defineProps({\n /**\n * Название сервиса\n *\n */\n logoTitle: {\n type: String as PropType<string>,\n default: 'Dashboard'\n },\n /**\n * Размер текста названия сервиса\n *\n */\n logoTitleVariation: {\n type: String as () => TitleVariationsUnion,\n default: TitleVariations.Subtitle\n },\n /**\n * Путь до изображения\n *\n */\n logoSrc: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Имя иконки\n * заголовка\n */\n logoIcon: {\n type: String as () => IconsListUnion,\n default: ''\n },\n /**\n * Заголовок\n * центрального блока\n */\n menuMainTitle: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Центральное меню\n *\n */\n menuMain: {\n type: Array as PropType<ISideBarMenuItem[]>,\n default: () => []\n },\n /**\n * Каунты для пунктов меню\n * вставляются в пункты с ключем 'count_key'\n *\n */\n counts: {\n type: Object as PropType<Record<string, number | null>>,\n default: () => ({})\n },\n /**\n * Меню приложений\n *\n */\n menuApps: {\n type: Array as PropType<ISideBarApp[]>,\n default: () => []\n },\n /**\n * Config чатры\n *\n */\n chatraConfig: {\n type: Object as PropType<ISideBarChatra>,\n default: () => ({})\n },\n /**\n * Текст кнопки\n * сворачивания меню\n */\n hideText: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Компактный вид\n */\n compact: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Цветовая схема\n */\n variable: {\n type: String as PropType<SidebarTheme>,\n default: SidebarTheme.Black\n },\n /**\n * Ширина сайдбара\n */\n width: {\n type: String as PropType<string>,\n default: '216px'\n },\n /**\n * Ширина компактного сайдбара\n */\n compactWidth: {\n type: String as PropType<string>,\n default: '56px'\n },\n /**\n * Брейкпоинт после которого\n * сайдбар становится абсолютным и появляется затемненный бэкдроп\n */\n absoluteBreakpoint: {\n type: Number as PropType<number>,\n default: null\n },\n /**\n * Брейкпоинт после которого\n * сайдбар полностью прячется\n */\n hiddenBreakpoint: {\n type: Number as PropType<number>,\n default: null\n }\n})\n\nconst is_hidden = ref<boolean>(false)\nconst pretty_compact = ref<boolean>(props.compact)\nconst has_compact_class = ref<boolean>(props.compact)\nconst window_width = ref<number>(0)\n\nconst sideBarClasses = computed((): { [key: string]: boolean } => {\n return {\n 'mc-side-bar--compact': has_compact_class.value,\n [currentThemeConfig.value.className]: true\n }\n})\n\nconst sideBarStyles = computed((): { [key: string]: string } => {\n return {\n overflow: `${is_hidden.value ? 'hidden' : 'visible'}`,\n width: has_compact_class.value ? props.compactWidth : props.width\n }\n})\n\nconst wrapperStyles = computed((): { [key: string]: string | undefined } => {\n const position =\n hiddenMode.value && has_compact_class.value\n ? {\n position: 'absolute',\n left: `-${props.compactWidth}`\n }\n : {}\n\n let width = {\n width: has_compact_class.value ? props.compactWidth : props.width\n }\n if (absoluteMode.value) {\n width.width = props.compactWidth\n }\n if (hiddenMode.value) {\n width.width = '0px'\n }\n return {\n ...width,\n ...position\n }\n})\n\nconst backdropClasses = computed((): { [key: string]: boolean } => {\n return {\n 'mc-side-bar-wrapper__backdrop--full-width':\n !has_compact_class.value && window_width.value < props.absoluteBreakpoint\n }\n})\n\nconst absoluteMode = computed((): boolean => {\n return !!props.absoluteBreakpoint && window_width.value < props.absoluteBreakpoint\n})\n\nconst hiddenMode = computed((): boolean => {\n return !!props.hiddenBreakpoint && window_width.value < props.hiddenBreakpoint\n})\n\nconst currentThemeConfig = computed((): ISidebarThemeConfig => {\n return sidebarThemeConfig.value[props.variable] || sidebarThemeConfig.value[SidebarTheme.Black]\n})\n\nconst sidebarThemeConfig = computed((): Record<SidebarTheme, ISidebarThemeConfig> => {\n return {\n black: defaultThemes.black,\n white: defaultThemes.white\n }\n})\n\nonMounted((): void => {\n if (props.absoluteBreakpoint || (props.hiddenBreakpoint && window)) {\n resize()\n window.addEventListener('resize', resize)\n }\n})\n\nonBeforeUnmount((): void => {\n window.removeEventListener('resize', resize)\n})\n\nconst handleToggleSize = (): void => {\n has_compact_class.value = !has_compact_class.value\n emit('compact', has_compact_class.value)\n}\n\nconst openSideBar = (): void => {\n has_compact_class.value = false\n emit('compact', has_compact_class.value)\n}\n\nconst resize = (): void => {\n window_width.value = window.innerWidth\n}\n\nwatch(\n () => has_compact_class.value,\n (value: boolean): void => {\n if (value) {\n setTimeout((): void => {\n pretty_compact.value = value\n }, 280)\n } else {\n pretty_compact.value = value\n }\n is_hidden.value = true\n setTimeout((): void => {\n is_hidden.value = false\n }, 280)\n }\n)\n\nwatch(\n () => props.compact,\n (value: boolean): void => {\n has_compact_class.value = value\n }\n)\n\nwatch(\n () => absoluteMode.value,\n (value: boolean): void => {\n emit('absolute-mode', value)\n },\n { immediate: true }\n)\n\nwatch(\n () => hiddenMode.value,\n (value: boolean): void => {\n emit('hidden-mode', value)\n },\n { immediate: true }\n)\n\nprovide('provideData', reactive<ISidebarThemeConfigProvide>({ currentThemeConfig: currentThemeConfig.value }))\n</script>\n\n<template>\n <article ref=\"sidebar-wrapper\" class=\"mc-side-bar-wrapper\" :style=\"wrapperStyles\">\n <section class=\"mc-side-bar-wrapper__backdrop\" :class=\"backdropClasses\" @click.stop.prevent=\"handleToggleSize\">\n <div ref=\"sidebar\" class=\"mc-side-bar\" :class=\"sideBarClasses\" :style=\"sideBarStyles\" @click.stop>\n <mc-side-bar-top\n :logo-title=\"logoTitle\"\n :logo-title-variation=\"logoTitleVariation\"\n :logo-src=\"logoSrc\"\n :logo-icon=\"logoIcon\"\n :compact=\"pretty_compact\"\n :menu-apps=\"menuApps\"\n >\n <template #title-append>\n <slot name=\"title-append\" />\n </template>\n </mc-side-bar-top>\n <section class=\"mc-side-bar__scrollable-container\">\n <mc-side-bar-center\n :title=\"menuMainTitle\"\n :menu-main=\"menuMain\"\n :counts=\"counts\"\n :chatra-config=\"chatraConfig\"\n :compact=\"pretty_compact\"\n @handlerChatraClick=\"emit('chatraClick')\"\n @open-side-bar=\"openSideBar\"\n />\n <mc-side-bar-bottom\n :hide-text=\"hideText\"\n :compact=\"pretty_compact\"\n :hidden-mode=\"hiddenMode\"\n :sidebar-width=\"width\"\n @toggle-size=\"handleToggleSize\"\n >\n <template #bottom-message>\n <slot name=\"bottom-message\" />\n </template>\n </mc-side-bar-bottom>\n </section>\n </div>\n </section>\n </article>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/colors' as *;\n.mc-side-bar {\n $block-name: &;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n padding: $space-250 $space-100 $space-400;\n transition: width 300ms ease;\n overflow-x: hidden;\n overflow-y: auto;\n @include child-indent-bottom($space-400);\n &--color-theme-black {\n background-color: $color-black;\n }\n &--color-theme-white {\n background-color: $color-white;\n border-inline-end: 1px solid $color-hover-gray;\n }\n &__scrollable-container {\n overflow-y: auto;\n overflow-x: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n @include hide-scrollbar;\n }\n &-wrapper {\n height: 100%;\n transition: width 300ms ease;\n &__backdrop {\n position: absolute;\n background-color: rgba($color-black, 0.6);\n z-index: 25;\n height: inherit;\n .mc-side-bar {\n height: inherit;\n }\n &--full-width {\n width: 100%;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type PropType, ref, inject, onMounted, useAttrs } from 'vue'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport type { ITab } from '@/types/ITabs'\nimport type { IRoute } from '@/types/IRoute'\nimport { type IconsListUnion } from '@/types/styles/Icons'\n\nconst selfRegisterTabToMcTabs: Function = inject('selfRegisterTabMethod', () => {})\nconst attrs = useAttrs()\nconst props = defineProps({\n /**\n * Если нужен иной фрагмент в url после #\n * (по умолчанию берётся из 'name')\n */\n id: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Имя таба (unique)\n */\n name: {\n type: String as PropType<string>,\n required: true,\n default: ''\n },\n /**\n * Вставка в начало имени таба\n * (не влияет на значение вставленное в url)\n */\n prefix: {\n type: String as PropType<string>,\n default: ''\n },\n /**\n * Вставка в конец имени таба\n * (не влияет на значение вставленное в url)\n */\n suffix: {\n type: String as PropType<string>,\n default: ''\n },\n appendCount: {\n type: Number as PropType<number>,\n default: null\n },\n appendCountColor: {\n type: String as () => ColorTypes,\n default: 'black'\n },\n /**\n * Отключенное состояние\n */\n isDisabled: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Виден ли таб\n */\n visible: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Классы иконки в начале\n */\n iconPrepend: {\n type: String as () => IconsListUnion,\n default: ''\n },\n /**\n * Классы иконки в конце\n */\n iconAppend: {\n type: String as () => IconsListUnion,\n default: ''\n },\n /**\n * Цвет иконки в начале\n */\n iconPrependColor: {\n type: String as () => ColorTypes,\n default: ''\n },\n /**\n * Цвет иконки в конце\n */\n iconAppendColor: {\n type: String as () => ColorTypes,\n default: ''\n },\n /**\n * Если нужна ссылка внутри приложения:\n * `{name: 'test', params: { id: test.id }}`\n */\n to: {\n type: Object as PropType<IRoute>,\n default: null\n },\n /**\n * Если нужна обычная ссылка:\n * `https://mediacube.agency/`\n */\n href: {\n type: String as PropType<string>,\n default: ''\n }\n})\n\nconst isActive = ref<boolean>(false)\nconst isVisible = ref<boolean>(true)\n\nconst computedId = computed((): string => {\n return props.id ? props.id : props.name.toLowerCase().replace(/ /g, '-')\n})\n\nconst hash = computed((): string => {\n return props.isDisabled ? '#' : `#${computedId.value}`\n})\n\nconst hasAppendCount = computed((): boolean => {\n return !!props.appendCount || props.appendCount === 0\n})\n\nconst appendCountStyles = computed((): string => {\n return `--mc-tab-append-count-color: ${Colors[props.appendCountColor]}`\n})\n\nconst computedTabName = computed((): string => {\n return [props.prefix, props.name, props.suffix].filter(Boolean).join('')\n})\n\nconst header = computed(() => {\n return props.visible ? computedTabName.value : ''\n})\n\nonMounted(() => {\n if (selfRegisterTabToMcTabs) {\n const payload: Partial<ITab> = {\n isActive: isActive.value,\n isVisible: isVisible.value,\n computedId: computedId.value,\n hash: hash.value,\n hasAppendCount: hasAppendCount.value,\n appendCountStyles: appendCountStyles.value,\n header: header.value,\n id: props.id,\n name: props.name,\n to: props.to,\n href: props.href,\n iconAppendColor: props.iconAppendColor,\n iconPrependColor: props.iconPrependColor,\n iconAppend: props.iconAppend,\n iconPrepend: props.iconPrepend,\n visible: props.visible,\n isDisabled: props.isDisabled,\n appendCountColor: props.appendCountColor,\n appendCount: props.appendCount,\n suffix: props.suffix,\n prefix: props.prefix,\n showTab,\n hideTab,\n onClick: attrs.onClick,\n ...attrs\n }\n selfRegisterTabToMcTabs(payload)\n }\n})\n\nconst showTab = () => {\n isActive.value = true\n}\nconst hideTab = () => {\n isActive.value = false\n}\n</script>\n\n<template>\n <section\n v-show=\"isActive\"\n :id=\"id\"\n :aria-hidden=\"!isActive\"\n class=\"tabs-component-panel\"\n role=\"tabpanel\"\n :href=\"href\"\n :to=\"to\"\n >\n <!-- @slot контента -->\n <slot v-if=\"visible\" />\n </section>\n</template>\n\n<style lang=\"scss\">\n.tabs-component-panel {\n $block-name: &;\n}\n.tabs-component-tab {\n &__tab {\n &-name-append-count {\n color: var(--mc-tab-append-count-color);\n }\n }\n a:empty {\n margin: 0;\n padding: 0;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McGridRow from '../../patterns/McGridRow/McGridRow.vue'\nimport { computed, onBeforeUnmount, onMounted, type PropType, reactive, ref } from 'vue'\nimport { Spaces, type SpaceTypes } from '@/types/styles/Spaces'\nimport type { SpacesUnion } from '@/types/styles/Spaces'\nimport type { ColumnJustifyAlignmentUnion } from '@/types/styles/Grid'\nimport { ColumnAlignment, ColumnJustifyAlignment } from '@/enums/Grid'\n\nconst emit = defineEmits(['content-scrolled'])\nconst props = defineProps({\n wrap: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n gutterY: {\n type: Number as PropType<number>,\n default: 0\n },\n gutterX: {\n type: Number as PropType<number>,\n default: 0\n },\n justify: {\n type: String as () => ColumnJustifyAlignmentUnion,\n default: ColumnJustifyAlignment.Left\n },\n scrollable: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n gutterBottom: {\n type: String as () => SpaceTypes,\n default: null\n },\n hasScroll: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n withBlur: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n moreSpace: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n rtl: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n scrollSpeed: {\n type: Number as PropType<number>,\n default: 1\n },\n tagName: {\n type: String as PropType<string>,\n default: 'div'\n }\n})\n\nconst drag_options = reactive({\n scroll_pos: 0,\n start_client_pos: 0,\n distance: 0,\n is_drag: false,\n mouse_is_down: false\n})\n\nconst show_left_blur = ref<boolean>(false)\nconst show_right_blur = ref<boolean>(false)\nconst observer = ref<MutationObserver | null>(null)\nconst scrollContainer = ref<HTMLElement | null>(null)\n\nconst containerProps = computed((): { [key: string]: string | number | boolean } => {\n return {\n wrap: props.wrap,\n align: ColumnAlignment.Top,\n gutterY: props.gutterY,\n gutterX: props.gutterX,\n justify: props.justify\n }\n})\n\nconst containerClasses = computed((): { [key: string]: boolean } => {\n return {\n 'mc-wrap-scroll': true,\n 'mc-wrap-scroll--scrollable': props.scrollable,\n 'mc-wrap-scroll--no-scrollbar': !props.hasScroll,\n 'mc-wrap-scroll--more-space': props.moreSpace\n }\n})\n\nconst containerStyles = computed((): { [key: string]: SpacesUnion } => {\n return {\n '--mc-wrap-scroll-bottom': Spaces[props.gutterBottom]\n }\n})\n\nconst wrapperClasses = computed(() => {\n return {\n [`mc-wrap-scroll__wrapper--left-blur`]: props.withBlur && show_left_blur.value,\n [`mc-wrap-scroll__wrapper--right-blur`]: props.withBlur && show_right_blur.value,\n [`mc-wrap-scroll__wrapper--more-space`]: props.moreSpace\n }\n})\n\nonMounted(() => {\n window.addEventListener('mousemove', onMouseMove)\n window.addEventListener('mouseup', onMouseUp)\n init()\n setTimeout(() => handlerScroll(), 10)\n})\n\nonBeforeUnmount(() => {\n window.removeEventListener('mousemove', onMouseMove)\n window.removeEventListener('mouseup', onMouseUp)\n scrollContainer.value && scrollContainer.value.removeEventListener('scroll', handlerScroll)\n observer.value && observer.value.disconnect()\n})\n\nconst init = () => {\n if (scrollContainer.value) {\n scrollContainer.value.addEventListener('scroll', handlerScroll)\n if (props.withBlur) createMutationObserver()\n }\n}\nconst handlerScroll = () => {\n emit('content-scrolled')\n if (!props.withBlur) return\n if (scrollContainer.value) {\n try {\n const container_width = Math.ceil(scrollContainer.value.getBoundingClientRect()?.width)\n const scroll_width = Math.ceil(scrollContainer.value.scrollWidth)\n const scroll_left = Math.ceil(scrollContainer.value.scrollLeft)\n // Левый блюр\n show_left_blur.value = props.rtl\n ? scroll_width > container_width && scroll_width - 10 > Math.abs(scroll_left) + container_width\n : !!scroll_left\n // Правый блюр\n show_right_blur.value = props.rtl\n ? Math.abs(scroll_left) > 1\n : scroll_width > container_width && scroll_width > Math.abs(scroll_left) + container_width\n } catch (e) {\n show_left_blur.value = false\n show_right_blur.value = false\n }\n }\n}\n\nconst createMutationObserver = () => {\n if (scrollContainer.value) {\n try {\n observer.value = new MutationObserver(handlerScroll)\n\n const config = {\n attributes: true,\n childList: true,\n subtree: true\n }\n observer.value.observe(scrollContainer.value, config)\n } catch (e) {\n console.error('Error when try to create observer in McWrapScroll')\n }\n } else console.error('Error when try to create observer in McWrapScroll')\n}\n\nconst onMouseDown = (e: MouseEvent) => {\n if (scrollContainer.value) {\n const dragOptions = drag_options\n dragOptions.start_client_pos = e.clientX\n dragOptions.mouse_is_down = true\n dragOptions.scroll_pos = scrollContainer.value.scrollLeft\n // // Удалить все выделения на странице, иначе скролл \"лагает\" если где то на странице есть выделение\n if (window.getSelection) {\n let sel = window.getSelection()\n sel?.removeAllRanges()\n }\n }\n}\n\nconst onMouseMove = (e: MouseEvent) => {\n if (scrollContainer.value) {\n const dragOptions = drag_options\n if (!dragOptions.mouse_is_down) return\n dragOptions.distance = e.clientX - dragOptions.start_client_pos\n if (Math.abs(dragOptions.distance) > 2 && !dragOptions.is_drag) {\n dragOptions.is_drag = true\n }\n if (dragOptions.is_drag) {\n scrollContainer.value.scrollTo({\n left: dragOptions.scroll_pos - dragOptions.distance * props.scrollSpeed\n })\n }\n // Math.abs(dragOptions.scroll_pos) && (dragOptions.scroll_pos = 0)\n }\n}\n\nconst onMouseUp = () => {\n drag_options.is_drag && (drag_options.is_drag = false)\n drag_options.mouse_is_down = false\n}\n</script>\n\n<template>\n <component :is=\"props.tagName\" :class=\"wrapperClasses\" class=\"mc-wrap-scroll__wrapper\">\n <div ref=\"scrollContainer\" :class=\"containerClasses\" :style=\"containerStyles\" @mousedown=\"onMouseDown\">\n <mc-grid-row\n v-bind=\"containerProps\"\n :style=\"{ 'pointer-events': drag_options.is_drag ? 'none' : 'auto' }\"\n class=\"mc-wrap-scroll__row\"\n >\n <slot />\n </mc-grid-row>\n </div>\n </component>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/font-families' as *;\n.mc-wrap-scroll {\n $block-name: &;\n $more-space-indent: $space-200;\n --mc-wrap-scroll-bottom: #{$space-zero};\n padding-bottom: var(--mc-wrap-scroll-bottom);\n margin-bottom: -(var(--mc-wrap-scroll-bottom));\n font-family: $font-family-main;\n &.mc-wrap-scroll--scrollable {\n overflow-x: auto;\n overflow-y: hidden;\n }\n &--more-space {\n padding: $more-space-indent;\n margin: -(#{$more-space-indent});\n }\n &.mc-wrap-scroll--no-scrollbar {\n @include hide-scrollbar();\n }\n &__wrapper {\n position: relative;\n overflow-x: hidden;\n @mixin blur-common-styles {\n @include pseudo();\n top: 0;\n bottom: 0;\n width: $space-500;\n z-index: 2;\n pointer-events: none;\n user-select: none;\n }\n @mixin right-blur {\n background: linear-gradient(to left, #{$color-bg-gray}, rgba($color-bg-gray, 0));\n }\n @mixin left-blur {\n background: linear-gradient(to right, #{$color-bg-gray}, rgba($color-bg-gray, 0));\n }\n &--more-space {\n padding: $more-space-indent;\n margin: -(#{$more-space-indent});\n &#{$block-name}__wrapper {\n &--left-blur {\n #{$block-name} {\n padding-inline-start: 0;\n margin-inline-start: 0;\n }\n &::before {\n top: $more-space-indent;\n bottom: $more-space-indent;\n inset-inline-start: $more-space-indent;\n @include left-blur;\n }\n }\n &--right-blur {\n #{$block-name} {\n padding-right: 0;\n margin-right: 0;\n }\n &::after {\n top: $more-space-indent;\n bottom: $more-space-indent;\n inset-inline-end: $more-space-indent;\n @include right-blur;\n }\n }\n }\n }\n &--left-blur {\n &::before {\n @include blur-common-styles;\n @include left-blur;\n inset-inline-start: 0;\n }\n }\n &--right-blur {\n &::after {\n @include blur-common-styles;\n @include right-blur;\n inset-inline-end: 0;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, onUpdated, type PropType, ref, watch, provide, nextTick } from 'vue'\nimport { Colors, type ColorTypes } from '@/types/styles/Colors'\nimport type { ColorsUnion } from '@/types/styles/Colors'\nimport { useRouter } from 'vue-router'\nimport McWrapScroll from '@/components/patterns/McWrapScroll/McWrapScroll.vue'\nimport type { ITab } from '@/types/ITabs'\nimport { type TabVariationUnion } from '@/types/ITabs'\nimport { TabVariations } from '@/enums/Tab'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n (e: 'tab-changed', value: { tab: ITab }): void\n (e: 'clicked', value: { tab: ITab }): void\n}>()\nconst router = useRouter()\nconst props = defineProps({\n modelValue: {\n type: String as PropType<string | null>,\n default: null\n },\n /**\n * Размеры табов:\n * `body, caption, overline`\n */\n tabVariation: {\n type: String as PropType<TabVariationUnion>,\n default: TabVariations.Captions\n },\n /**\n * Цвет текста табов\n */\n color: {\n type: String as () => ColorTypes,\n default: 'black'\n },\n /**\n * Цвет линии активного таба\n */\n accentColor: {\n type: String as () => ColorTypes,\n default: 'purple'\n },\n /**\n * Заглавные буквы\n * табов\n */\n uppercase: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Передаваемое состояние загрузки\n *\n * Нужно для метода switchingDisableTab\n * в случае, если состояние табов (active/disable)\n * задается динамически\n */\n loading: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Закрепленные табы\n *\n * Добавляет верхнее расстояние\n * для табов для правильного отображения\n */\n sticky: {\n type: Boolean as PropType<boolean>,\n default: false\n }\n})\n\nconst tabs = ref<ITab[]>([])\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-tabs': true,\n [`mc-tabs--tab-variation-${props.tabVariation}`]: !!props.tabVariation,\n 'mc-tabs--uppercase': !!props.uppercase,\n 'mc-tabs--sticky': !!props.sticky\n }\n})\n\nconst styles = computed((): { [key: string]: ColorsUnion } => {\n return {\n '--mc-tabs-color': Colors[props.color],\n '--mc-tabs-accent-color': Colors[props.accentColor]\n }\n})\n\nconst computedValue = computed<{ get: () => string | null; set: (val: string) => void }>({\n // @ts-ignore\n get(): string | null {\n return props.modelValue\n },\n set(value: string): void {\n emit('update:modelValue', value)\n }\n})\nconst activeVisibleTabs = computed((): ITab[] => {\n return tabs.value.filter((tab) => tab.visible && !tab.isDisabled)\n})\n\nonMounted(() => {\n handleCheckInitTab()\n})\nonUpdated(() => {\n setTimeout(() => {\n watchDisableTab()\n }, 10)\n})\n\nconst updateTabsState = (payload: string): void => {\n tabs.value.forEach((tab: ITab) => {\n tab.isActive = tab.computedId === payload\n tab.isActive ? tab.showTab() : tab.hideTab()\n })\n}\n\nconst selfRegisterTabMethod = (payload: ITab): void => {\n tabs.value.push(payload)\n}\n\nconst handleCheckInitTab = (): void => {\n let [tab]: ITab[] = activeVisibleTabs.value\n const preselectedTab: ITab | undefined = tabs.value.find((tab: ITab) => tab.computedId === props.modelValue)\n if (preselectedTab && !preselectedTab.isDisabled) {\n tab = preselectedTab\n }\n if (!tab) return\n\n handleSelectTab(tab)\n}\n\nconst handleEmitChange = (tab: ITab): void => {\n emit('tab-changed', { tab } as { tab: ITab })\n}\n\nconst watchDisableTab = (): void => {\n if (props.loading) return\n const activeTab: ITab | undefined = tabs.value?.find((tab) => tab.isActive)\n if (!activeTab?.isDisabled) return\n const [tab]: ITab[] = activeVisibleTabs.value\n handleSelectTab(tab)\n}\n\nconst handleSelectTab = (tab: ITab, event?: Event): void | undefined => {\n event?.preventDefault()\n if (tab.isDisabled) return\n if (tab.onClick && typeof tab.onClick === 'function') return tab.onClick(tab)\n if (tab.href) {\n window.open(tab.href, '_blank')\n return\n }\n if (tab.to && router) {\n router.push(tab.to)\n return\n }\n handleEmitChange(tab)\n updateTabsState(tab.computedId)\n //@ts-ignore\n computedValue.value = tab.computedId\n}\n\nwatch(\n () => props.loading,\n (val, oldVal): void => {\n if (!val && oldVal)\n nextTick(() => {\n handleCheckInitTab()\n })\n }\n)\nprovide('selfRegisterTabMethod', selfRegisterTabMethod)\n</script>\n\n<template>\n <div :class=\"classes\" :style=\"styles\">\n <div class=\"tabs-component\">\n <mc-wrap-scroll tag-name=\"ul\" role=\"tablist\" scrollable class=\"tabs-component-tabs\">\n <li\n v-for=\"(tab, i) in tabs\"\n v-show=\"tab.isVisible\"\n :key=\"i\"\n :class=\"{ 'is-active': tab.isActive, 'is-disabled': tab.isDisabled }\"\n class=\"tabs-component-tab\"\n role=\"presentation\"\n >\n <a\n :aria-controls=\"tab.hash\"\n :aria-selected=\"tab.isActive\"\n :href=\"tab.href || tab.hash || 'javascript:void(0)'\"\n class=\"tabs-component-tab-a\"\n role=\"tab\"\n @click=\"(e) => handleSelectTab(tab, e)\"\n >\n <span class=\"tabs-component-tab__tab-name\">\n <mc-svg-icon v-if=\"tab.iconPrepend\" :name=\"tab.iconPrepend\" :color=\"tab.iconPrependColor\" />\n <span>{{ tab.header }}</span>\n <mc-svg-icon v-if=\"tab.iconAppend\" :name=\"tab.iconAppend\" :color=\"tab.iconAppendColor\" />\n </span>\n </a>\n </li>\n </mc-wrap-scroll>\n <div class=\"tabs-component-panels\">\n <slot />\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/z-indexes' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/font-weights' as *;\n@use '../../../assets/tokens/spacings' as *;\n.mc-tabs {\n $block-name: &;\n\n @mixin border() {\n &::before {\n @include pseudo();\n @include position(absolute, auto 0 0 0);\n height: 1px;\n background-color: $color-hover-gray;\n }\n }\n\n &--tab-variation {\n &-body {\n .tabs-component-tab-a {\n font-size: $font-size-300;\n line-height: $line-height-250;\n }\n }\n &-caption {\n .tabs-component-tab-a {\n font-size: $font-size-200;\n line-height: $line-height-200;\n }\n }\n &-overline {\n .tabs-component-tab-a {\n font-size: $font-size-100;\n line-height: $line-height-150;\n font-weight: $font-weight-medium;\n }\n }\n }\n .tabs-component-tab-a {\n color: var(--mc-tabs-color);\n }\n\n .tabs-component-tab-a {\n &::after {\n background-color: var(--mc-tabs-accent-color);\n }\n &:hover {\n color: var(--mc-tabs-accent-color);\n }\n }\n .tabs-component-tab.is-active {\n .tabs-component-tab-a {\n color: var(--mc-tabs-accent-color);\n font-weight: $font-weight-semi-bold;\n }\n }\n\n &--uppercase {\n .tabs-component-tabs {\n text-transform: uppercase;\n }\n }\n\n &--sticky {\n overflow: scroll;\n\n .tabs-component-tabs {\n position: sticky !important;\n top: 0;\n z-index: $z-index-sticky;\n background-color: $color-white;\n }\n }\n\n .tabs-component-tabs {\n @include reset-text-indents();\n position: relative;\n padding-left: 0;\n margin-top: 0;\n list-style-type: none;\n height: $space-350;\n @include border();\n }\n\n .tabs-component-tab {\n position: relative;\n flex: 0 0 auto;\n &:first-child {\n .tabs-component-tab-a {\n margin-left: 0;\n }\n }\n &:last-child {\n .tabs-component-tab-a {\n margin-right: 0;\n }\n }\n\n &.is-active {\n .tabs-component-tab-a {\n &::after {\n left: 0;\n right: 0;\n opacity: 1;\n }\n }\n }\n &.is-disabled {\n .tabs-component-tab-a {\n cursor: not-allowed;\n color: $color-outline-gray;\n }\n }\n\n &__tab-name {\n display: flex;\n align-items: center;\n @include child-indent-right($space-50);\n &::after {\n display: block;\n content: attr(data-name);\n font-weight: $font-weight-semi-bold;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n }\n }\n &__icon {\n &-prepend {\n color: var(--mc-tab-icon-prepend-color);\n }\n &-append {\n color: var(--mc-tab-icon-append-color);\n }\n }\n }\n\n .tabs-component-tab-a {\n position: relative;\n display: inline-flex;\n font-family: $font-family-main;\n text-decoration: none;\n padding-bottom: $space-150;\n margin: 0 $space-150;\n cursor: pointer;\n\n @include child-indent-right($space-50);\n @include border();\n .las,\n .la {\n display: flex;\n align-items: center;\n }\n\n &::after {\n @include pseudo();\n @include position(null, null 50% 0 50%);\n opacity: 0;\n height: 2px;\n z-index: 1;\n transition:\n left 0.2s ease,\n right 0.2s ease,\n opacity 0.2s ease,\n color 0.2s ease;\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { TitleVariations } from '@/enums/Title'\nimport { Weights } from '@/enums/ui/Weights'\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport type { PropType } from 'vue'\n\nconst props = defineProps({\n /**\n * Заголовок\n */\n title: {\n type: String as PropType<string>,\n default: ''\n },\n titleEllipsis: {\n type: Boolean as PropType<boolean>,\n default: false\n }\n})\n</script>\n\n<template>\n <div class=\"mc-drawer-content-template\">\n <div v-if=\"$slots.title || props.title\" class=\"mc-drawer-content-template__header\">\n <!-- @slot Слот заголовка -->\n <slot name=\"title\">\n <mc-title :variation=\"TitleVariations.Subtitle\" :ellipsis=\"props.titleEllipsis\" :weight=\"Weights.SemiBold\">\n {{ props.title }}\n </mc-title>\n </slot>\n </div>\n <div class=\"mc-drawer-content-template__body\">\n <div class=\"mc-drawer-content-template__tint\"></div>\n <div class=\"mc-drawer-content-template__body-inner\">\n <!-- @slot Слот контента -->\n <slot />\n </div>\n </div>\n <div v-if=\"$slots.footer\" class=\"mc-drawer-content-template__footer\">\n <!-- @slot Слот футера -->\n <slot name=\"footer\" />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/styles/mixins' as *;\n@use '../../../../assets/tokens/spacings' as *;\n@use '../../../../assets/tokens/sizes' as *;\n@use '../../../../assets/tokens/colors' as *;\n@use '../../../../assets/tokens/font-families' as *;\n.mc-drawer-content-template {\n font-family: $font-family-main;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n &__header {\n padding: 18px $space-600 18px $space-200;\n border-bottom: 1px solid $color-hover-gray;\n }\n\n &__body {\n position: relative;\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n height: 100%;\n &-inner {\n max-height: 100%;\n height: 100%;\n overflow-y: auto;\n padding: $space-400 $space-200;\n box-sizing: border-box;\n }\n }\n &__footer {\n border-top: 1px solid $color-hover-gray;\n padding: $space-200 $space-200;\n }\n\n &__tint {\n @include position(absolute, 0 5px null 0);\n height: $size-400;\n background: linear-gradient(180deg, $color-white 0%, rgba(255, 255, 255, 0) 100%);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport { computed, nextTick, type PropType, reactive, ref, watch } from 'vue'\nimport { LineHeights, type LineHeightTypes, Sizes, type SizeTypes, Spaces, type SpaceTypes } from '@/types'\nimport { HorizontalAlignment } from '@/enums'\nimport { TransitionPresets, useTransition } from '@vueuse/core'\nimport { ModalVariation } from '@/enums/Modal'\n\nconst emit = defineEmits<{\n (e: 'before-open'): void\n (e: 'before-close'): void\n (e: 'opened'): void\n (e: 'closed'): void\n (e: 'back', value: Event): void\n (e: 'update:modelValue', value: boolean): void\n}>()\n\nconst props = defineProps({\n modelValue: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n name: {\n type: String as PropType<string>\n },\n /**\n * Максимальная ширина модального окна\n * */\n maxWidth: {\n type: Number as PropType<number>,\n default: 510\n },\n /**\n * Скорость анимации\n * */\n duration: {\n type: Number as PropType<number>,\n default: 200\n },\n /**\n * Показывать кнопку закрытия модали\n * */\n closeVisible: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n showOverlay: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Нужно ли закрывать попап\n * кликом вне окна\n */\n clickBackdropToClose: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Стрелка в хедере\n */\n arrowVisible: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Кастомное модальное окно\n */\n secondaryModal: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Должен ли контент внутри модалки скроллится с фиксированной шапкой и футером\n * Отключать, когда внутри есть селекты\n * */\n scrollableContent: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Показывать сепараторы у хедера и футера при скролле.\n */\n separators: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Выравнивание заголовка в шапке,\n * если centered добавляются отступы слева и справа, чтобы текст не наезжал на кнопки\n * centered || left || right\n * */\n headerAlign: {\n type: String as PropType<HorizontalAlignment>,\n default: 'center'\n },\n /**\n * Отступ от верхнего края модального окна до контента.\n * Для \"красивой\" обрезки картинки при скролле в ситуациях, когда нет хедера\n */\n topPadding: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Вариация модалки default || info\n * info модалки имеют меньшие размеры паддингов\n * */\n variation: {\n type: String as () => ModalVariation,\n default: 'default'\n }\n})\n\nconst modalTransitionState = ref<number>(0)\nconst modalTransition = useTransition(modalTransitionState, {\n duration: props.duration || 300,\n transition: TransitionPresets.easeOutQuart\n})\n\nconst mcModalBody = ref<HTMLElement | null>(null)\nconst modalInner = ref<HTMLElement | null>(null)\n\nconst data = reactive({\n scrolled_top: false,\n scrolled_bottom: false,\n resize_observer: {} as ResizeObserver,\n small_indents: false,\n can_shorten_modal: false,\n modal_params: {} as { [key: string]: string | number },\n indent: {\n regular: '400',\n small: '150'\n } as { [key: string]: SpaceTypes },\n footer: {\n button: {\n regular: '600',\n small: '500'\n } as { [key: string]: SizeTypes }\n },\n header: {\n title: {\n line_height: {\n regular: '300',\n small: '250'\n } as { [key: string]: LineHeightTypes }\n }\n }\n})\n\nconst classes = computed((): { [key: string]: boolean } => {\n return {\n 'mc-modal--arrow-visible': props.arrowVisible,\n 'mc-modal--scrolled-top': data.scrolled_top,\n 'mc-modal--scrolled-bottom': data.scrolled_bottom,\n 'mc-modal--scrollable': props.scrollableContent,\n 'mc-modal--top-padding': props.topPadding,\n 'mc-modal--small-indents': data.small_indents,\n [`mc-modal--variation-${props.variation}`]: !!props.variation,\n [`mc-modal--header-align-${props.headerAlign}`]: (props.closeVisible || props.arrowVisible) && !!props.headerAlign\n }\n})\n\nconst styles = computed((): { [key: string]: string | number } => {\n return {\n '--mc-modal-padding': Spaces[data.indent.regular],\n '--mc-modal-padding-small': Spaces[data.indent.small],\n '--mc-modal-header-line-height': LineHeights[data.header.title.line_height.regular],\n '--mc-modal-header-line-height-small': LineHeights[data.header.title.line_height.small],\n '--mc-modal-button-height': Sizes[data.footer.button.regular],\n '--mc-modal-button-height-small': Sizes[data.footer.button.small],\n '--mc-modal-max-width': `${props.maxWidth + 24}px`,\n '--mc-modal-state-number': modalTransition.value\n }\n})\n\n/**\n * Устанавливаем сепараторы, если есть скролл\n * @param {Boolean} scrolled - если метод вызван скроллом\n */\nconst calculateSeparators = (scrolled: boolean = true): void => {\n if (!scrolled) {\n data.scrolled_top = false\n data.scrolled_bottom = false\n data.small_indents = false\n }\n\n setTimeout(\n () => {\n if (mcModalBody.value) {\n const { scrollTop, scrollHeight, clientHeight } = mcModalBody.value\n // Сепаратор появится если высота скролла будет > 2px\n const offset = 2\n data.scrolled_top = scrollTop > offset\n data.small_indents = data.scrolled_top && data.can_shorten_modal\n data.scrolled_bottom = scrollTop + clientHeight < scrollHeight - offset\n }\n },\n scrolled ? 0 : 300\n )\n}\n\nconst handleBeforeClose = (): void => {\n /**\n * Событие перед закрытием\n * @property {Object}\n */\n emit('before-close')\n if (mcModalBody.value) {\n data.resize_observer && data.resize_observer.unobserve(mcModalBody.value)\n mcModalBody.value.removeEventListener('scroll', () => calculateSeparators())\n }\n}\n\nconst handleOpened = (): void => {\n if (props.separators) {\n getParams()\n if (mcModalBody.value) {\n mcModalBody.value.addEventListener('scroll', () => calculateSeparators(), {\n passive: true\n })\n data.resize_observer = new ResizeObserver(() => resizeHandler())\n data.resize_observer.observe(mcModalBody.value)\n }\n calculateSeparators()\n }\n\n /**\n * Событие после открытия\n * @property {Object}\n */\n emit('opened')\n}\n\nconst handleBack = (event: Event): void => {\n emit('back', event)\n}\n\nconst getParams = (): void => {\n try {\n if (modalInner.value) {\n Object.keys(styles.value).forEach((attr) => {\n //@ts-ignore\n const param = parseInt(getComputedStyle(modalInner.value)?.getPropertyValue(attr))\n param && (data.modal_params[attr] = param)\n })\n }\n } catch (e) {\n console.error(e)\n }\n}\n\nconst calculateIndents = (): void => {\n /* Если шапка уже маленькая, то отключаем при отключении сепаратора\n * Иначе смотрим, чтобы отступ был > чем убираемые отступы, т.к. нет смысла сжимать шапку, если <\n */\n const indentDifferences =\n (+data.modal_params?.['--mc-modal-padding'] - +data.modal_params?.['--mc-modal-padding-small']) * 3 +\n +data.modal_params?.['--mc-modal-padding-small']\n const lineHeightDifferences =\n +data.modal_params?.['--mc-modal-header-line-height'] - +data.modal_params?.['--mc-modal-header-line-height-small']\n const buttonDifferences =\n +data.modal_params?.['--mc-modal-button-height'] - +data.modal_params?.['--mc-modal-button-height-small']\n const sizeDifferences = indentDifferences + lineHeightDifferences + buttonDifferences\n if (!data.small_indents && mcModalBody.value) {\n data.can_shorten_modal = mcModalBody.value?.scrollHeight - mcModalBody.value?.clientHeight > sizeDifferences\n }\n}\n\nconst resizeHandler = (): void => {\n calculateIndents()\n calculateSeparators()\n}\n\nconst openModal = (): void => {\n modalTransitionState.value = 1\n emit('before-open')\n emit('update:modelValue', true)\n nextTick(() => handleOpened())\n}\nconst closeModal = (): void => {\n modalTransitionState.value = 0\n setTimeout(() => {\n handleBeforeClose()\n emit('update:modelValue', false)\n emit('closed')\n }, props.duration || 300)\n}\n\nconst handleOverlayClick = (): void => {\n if (!props.clickBackdropToClose) return\n closeModal()\n}\n\nwatch(\n () => props.modelValue,\n (value): void => {\n value ? openModal() : closeModal()\n },\n { immediate: true }\n)\n</script>\n\n<template>\n <div v-if=\"props.modelValue\" class=\"mc-modal__wrapper\">\n <div v-if=\"props.showOverlay\" class=\"mc-modal__overlay\" @click.stop=\"handleOverlayClick\" />\n <div class=\"mc-modal\" :class=\"classes\" :style=\"styles\">\n <div ref=\"modalInner\" class=\"mc-modal__inner\">\n <div v-if=\"$slots.title\" class=\"mc-modal__header\">\n <div class=\"mc-modal__title\">\n <!-- @slot Слот заголовка -->\n <slot name=\"title\" />\n </div>\n </div>\n <div ref=\"mcModalBody\" class=\"mc-modal__body\">\n <!-- @slot Слот контента -->\n <slot />\n </div>\n <!-- @slot Слот футера -->\n <div class=\"mc-modal__control\">\n <slot name=\"footer\" />\n <!-- Блок для телепорта в футер <Teleport to=\"#mcModalFooter\"> -->\n <div id=\"mcModalFooter\" />\n </div>\n </div>\n <button v-if=\"arrowVisible\" type=\"button\" class=\"mc-modal__btn-back\" @click.prevent=\"handleBack\">\n <mc-svg-icon name=\"arrow_leftward\" class=\"mc-modal__icon-back\" />\n </button>\n <button v-if=\"closeVisible\" type=\"button\" class=\"mc-modal__btn-close\" @click.prevent=\"closeModal\">\n <mc-svg-icon class=\"mc-modal__icon-close\" width=\"24\" height=\"24\" name=\"close\" />\n </button>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/z-indexes' as *;\n@use '../../../assets/tokens/durations' as *;\n@use '../../../assets/tokens/font-families' as *;\n@use '../../../assets/tokens/font-weights' as *;\n@use '../../../assets/tokens/font-sizes' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/sizes' as *;\n@use '../../../assets/tokens/line-heights' as *;\n@use '../../../assets/tokens/colors' as *;\n@use '../../../assets/tokens/media-queries' as *;\n@use '../../../assets/tokens/border-radius' as *;\n@use '../../../assets/tokens/box-shadows' as *;\n@use 'sass:color' as sasscolor;\n\n.mc-modal {\n $block-name: &;\n $border-color: #dee1e9;\n $box-shadow-color: #20008c28;\n $border-color: $color-hover-gray;\n --mc-modal-padding: #{$space-400};\n --mc-modal-padding-small: #{$space-150};\n --mc-modal-header-line-height: #{$line-height-300};\n --mc-modal-header-line-height-small: #{$line-height-250};\n --mc-modal-button-height: #{$size-600};\n --mc-modal-button-height-small: #{$size-500};\n --mc-modal-max-width: 510px;\n --mc-modal-state-number: 0;\n\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n opacity: var(--mc-modal-state-number);\n z-index: 2;\n\n @media #{$media-query-s} {\n --modal-scale: calc(var(--mc-modal-state-number) * 0.1 + 0.9);\n padding: 12px 0;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%) scale(var(--modal-scale));\n height: auto;\n max-height: 80%;\n max-width: var(--mc-modal-max-width);\n }\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba($color-black, 0.5);\n display: flex;\n justify-content: flex-start;\n &--hidden {\n background: transparent;\n }\n }\n &__wrapper {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1;\n overflow: hidden;\n }\n &__btn-close,\n &__btn-back {\n transition: $duration-s all;\n @include reset-btn();\n @include close-link();\n }\n &__btn-close {\n @include position(absolute, var(--mc-modal-padding) $space-200 null null);\n @media #{$media-query-s} {\n @include position(absolute, var(--mc-modal-padding) $space-600 null null);\n }\n }\n &__btn-back {\n @include position(absolute, var(--mc-modal-padding) null null $space-200);\n @media #{$media-query-s} {\n @include position(absolute, var(--mc-modal-padding) null null $space-600);\n }\n }\n &__icon-close {\n @include size($size-300);\n transition: color $duration-s;\n }\n &.overlay-fade-enter-active,\n &.overlay-fade-leave-active {\n .mc-modal__inner {\n transition: all $duration-s;\n transform: translate3d(0, 0, 0);\n }\n }\n &.overlay-fade-enter,\n &.overlay-fade-leave-active {\n .mc-modal__inner {\n transform: translate3d(0, -20px, 0);\n }\n }\n &.mc-modal--secondary {\n .mc-modal {\n &__inner {\n border-radius: $radius-400;\n box-shadow: 0 15px 30px $box-shadow-color;\n padding: $space-400;\n }\n &__btn-close,\n &__btn-back {\n top: 27px;\n }\n &__btn-close {\n inset-inline-end: $space-400;\n }\n &__btn-back {\n inset-inline-start: $space-400;\n }\n &__header {\n padding-bottom: 9px;\n border-bottom: 2px solid $border-color;\n margin-bottom: var(--mc-modal-padding);\n }\n &__control {\n display: flex;\n justify-content: space-between;\n align-items: center;\n .mc-button {\n border-radius: $radius-150;\n }\n }\n }\n }\n\n &__header {\n flex-shrink: 0;\n transition: $duration-s all;\n padding: var(--mc-modal-padding) $space-200 $space-350;\n border-color: $border-color;\n @media #{$media-query-s} {\n padding: $space-350;\n .mc-title {\n transition: $duration-s all;\n line-height: var(--mc-modal-header-line-height);\n }\n }\n &:has(#{$block-name}__title:empty) {\n display: none;\n & + #{$block-name}__body {\n padding-top: $space-400;\n }\n }\n }\n\n &__title {\n margin-top: 0;\n margin-bottom: 0;\n color: hsl(0, 0%, 13%);\n font-family: $font-family-main;\n }\n\n &__body {\n padding: $space-50 $space-200 $space-200;\n flex-grow: 1;\n min-height: 0;\n overflow-x: hidden;\n > *:only-child {\n min-height: 100%;\n }\n @media #{$media-query-s} {\n padding: $space-50 $space-400 $space-200;\n overflow: visible;\n }\n }\n &__inner {\n box-shadow: $shadow-s;\n background-color: $color-white;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n height: 100% !important;\n > *:first-child {\n padding-top: var(--mc-modal-padding);\n }\n > *:last-child {\n padding-bottom: var(--mc-modal-padding);\n }\n @media #{$media-query-s} {\n overflow: visible;\n /* прячет рандомный скроллбар при включении модалки */\n -ms-overflow-style: none;\n scrollbar-width: none;\n border-radius: $radius-100;\n margin: 0 $space-150;\n &::-webkit-scrollbar {\n display: none;\n }\n }\n }\n &--scrollable {\n overflow: hidden !important;\n #{$block-name} {\n &__body {\n overflow-y: auto;\n overflow-x: hidden;\n }\n &__inner {\n overflow-x: hidden;\n @media #{$media-query-s} {\n max-height: 80vh;\n }\n }\n }\n }\n &--header-align {\n &-center {\n #{$block-name} {\n &__header {\n padding-inline: $space-500;\n text-align: center;\n @media #{$media-query-s} {\n padding-inline: $space-700;\n }\n }\n }\n }\n &-left {\n #{$block-name} {\n &__header {\n padding-bottom: $space-150;\n }\n }\n }\n }\n &--small-indents {\n @media #{$media-query-s} {\n #{$block-name} {\n &__control {\n padding-block: var(--mc-modal-padding-small) !important;\n .mc-button {\n height: var(--mc-modal-button-height-small);\n }\n }\n &__header {\n padding-block: var(--mc-modal-padding-small) !important;\n .mc-title {\n font-weight: $font-weight-semi-bold;\n font-size: $font-size-300;\n line-height: var(--mc-modal-header-line-height-small);\n align-items: center;\n }\n }\n &__body {\n padding-bottom: $space-50;\n }\n &__btn {\n &-back,\n &-close {\n top: var(--mc-modal-padding-small) !important;\n }\n }\n }\n }\n }\n\n &--scrolled {\n $separator-border: 1px solid $border-color;\n &-top {\n #{$block-name} {\n &__header {\n border-bottom: $separator-border;\n }\n }\n }\n &-bottom {\n #{$block-name} {\n &__control:not(:empty) {\n border-top: $separator-border;\n }\n }\n }\n }\n &--top-padding {\n #{$block-name}__inner:before {\n content: '';\n height: $space-400;\n min-height: $space-400;\n }\n }\n &__control {\n flex-shrink: 0;\n display: flex;\n justify-content: center;\n padding: $space-200 $space-200 $space-400;\n transition: $duration-s all;\n @media #{$media-query-s} {\n padding: $space-200 $space-300 $space-400;\n }\n .mc-button {\n width: 100%;\n }\n @media #{$media-query-s} {\n .mc-button {\n min-width: 100px;\n height: var(--mc-modal-button-height);\n transition: $duration-s all;\n width: unset;\n }\n }\n &:empty {\n position: relative;\n padding: $space-350 0 0;\n }\n &:not(:empty) {\n border-color: $border-color;\n }\n }\n &:has(&__control:empty) {\n #{$block-name} {\n &__body {\n padding-bottom: $space-50;\n }\n }\n }\n &--variation {\n &-info {\n #{$block-name} {\n &__header {\n @media #{$media-query-s} {\n padding: $space-300 $space-300 $space-150;\n }\n }\n &__btn-close {\n @media #{$media-query-s} {\n top: $space-300;\n }\n }\n &__inner {\n & > *:first-child {\n @media #{$media-query-s} {\n padding-top: $space-300;\n }\n }\n & > *:last-child {\n @media #{$media-query-s} {\n padding-bottom: $space-300;\n }\n }\n }\n &__body {\n padding-bottom: $space-50;\n @media #{$media-query-s} {\n padding-inline: $space-300;\n }\n }\n &__control {\n padding-top: $space-250;\n @media #{$media-query-s} {\n padding-top: $space-150;\n }\n }\n }\n }\n }\n @at-root {\n html[dir='rtl'] {\n #{$block-name} {\n &__btn-back {\n transform: rotate(180deg);\n }\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport { computed, type PropType } from 'vue'\nimport type { ITableSort, ITableSortState } from '@/types/ITable'\n\nconst emit = defineEmits<{\n (e: 'change', value: ITableSort): void\n}>()\n\nconst props = defineProps({\n sort: {\n type: Object as PropType<ITableSort>,\n default: () => ({})\n },\n column: {\n type: String as PropType<string>,\n default: null\n }\n})\n\nconst isActive = computed((): boolean => {\n return props.column === props.sort.sort_column\n})\n\nconst sortState = computed((): ITableSortState => {\n switch (true) {\n case props.sort.sort_direction === 'asc' && isActive.value:\n return {\n direction: 'asc',\n next_direction: 'desc',\n icon: 'arrow_downward'\n }\n case props.sort.sort_direction === 'desc' && isActive.value:\n return {\n direction: 'desc',\n next_direction: 'asc',\n icon: 'arrow_upward'\n }\n default:\n return {\n direction: null,\n next_direction: 'asc',\n icon: 'arrow_up_down'\n }\n }\n})\n\nconst handleSortChange = () => {\n emit('change', {\n sort_column: props.column,\n sort_direction: sortState.value.next_direction\n })\n}\n</script>\n\n<template>\n <div class=\"mc-table-sort\" @click=\"handleSortChange\">\n <mc-svg-icon size=\"200\" :name=\"sortState.icon\" :color=\"isActive ? 'black' : 'gray'\" />\n </div>\n</template>\n\n<style lang=\"scss\">\n.mc-table-sort {\n cursor: pointer;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue'\nimport type { ITableColumnEnriched } from '@/types'\n\nconst props = defineProps({\n columns: {\n type: Array as PropType<ITableColumnEnriched[]>,\n required: true,\n default: () => [] as ITableColumnEnriched[]\n }\n})\n\nconst firstColsWidth = computed(() => {\n const [firstColumn] = props.columns\n return firstColumn.width\n})\n</script>\n\n<template>\n <section class=\"mc-table-skeleton-loading skeleton-load-wrapper\">\n <div\n v-for=\"(column, i) in props.columns\"\n :style=\"column.style\"\n class=\"mc-table-skeleton-loading__col\"\n :key=\"`skeleton-col__${i}`\"\n >\n <div v-for=\"(cell, cellI) in 36\" :key=\"`skeleton-cell-${cellI}`\" class=\"mc-table-skeleton-loading__cell\">\n <div v-if=\"!cellI\" class=\"mc-table-skeleton-loading__loader mc-table-skeleton-loading__loader--more-height\">\n <div class=\"mc-table-skeleton-loading__loader_line\"></div>\n </div>\n <div v-if=\"!i\" class=\"mc-table-skeleton-loading__loader\" :style=\"{ minWidth: `${firstColsWidth}px` }\">\n <div class=\"mc-table-skeleton-loading__loader_avatar\"></div>\n <div class=\"mc-table-skeleton-loading__loader_preview-content\">\n <div class=\"mc-table-skeleton-loading__loader_line\"></div>\n <div class=\"mc-table-skeleton-loading__loader_line\"></div>\n </div>\n </div>\n <div v-else class=\"mc-table-skeleton-loading__loader\">\n <div class=\"mc-table-skeleton-loading__loader_line\"></div>\n </div>\n </div>\n </div>\n </section>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/styles/mixins' as *;\n@use '../../../../assets/tokens/z-indexes' as *;\n@use '../../../../assets/tokens/colors' as *;\n@use '../../../../assets/tokens/spacings' as *;\n@use '../../../../assets/tokens/sizes' as *;\n@mixin gradient() {\n background: $color-hover-gray;\n background-image: -webkit-gradient(\n linear,\n left center,\n right center,\n from($color-hover-gray),\n color-stop(0.2, rgba($color-white, 0.5)),\n color-stop(0.4, $color-hover-gray),\n to($color-hover-gray)\n );\n background-image: -webkit-linear-gradient(\n left,\n $color-hover-gray 0%,\n rgba($color-white, 0.5) 20%,\n $color-hover-gray 40%,\n $color-hover-gray 100%\n );\n background-repeat: no-repeat;\n background-size: 800px 100%;\n animation: placeHolderShimmer 1s linear infinite forwards;\n border-radius: 10px;\n > * {\n background: transparent;\n position: relative;\n margin: 0 auto;\n width: 100%;\n overflow: hidden;\n &:after {\n content: '';\n position: absolute;\n border: 500px solid $color-white;\n width: 100%;\n }\n }\n}\n\n.mc-table-skeleton-loading {\n display: flex;\n overflow: hidden;\n max-width: 100%;\n width: 100%;\n position: absolute;\n height: 100%;\n z-index: $z-index-overlay;\n background-color: $color-white;\n user-select: none;\n //margin-top: calc(var(--mc-table-header-row-height) * -1);\n &__col {\n width: var(--mc-table-cell-width);\n max-width: var(--mc-table-cell-max-width);\n min-width: var(--mc-table-cell-min-width);\n }\n &__cell {\n height: var(--mc-table-row-height);\n }\n &__loader {\n width: 100%;\n display: flex;\n align-items: center;\n height: $space-500;\n padding: $space-100 $space-200;\n &_avatar {\n display: block;\n float: left;\n position: relative;\n height: $size-300;\n width: $size-300;\n min-width: $size-300;\n margin-inline-end: $space-50;\n @include gradient();\n }\n &_preview-content {\n display: flex;\n flex-direction: column;\n width: 100%;\n @include child-indent-bottom($space-50);\n }\n &_line {\n display: block;\n position: relative;\n height: $size-100;\n width: 100%;\n @include gradient();\n }\n &--more-height {\n .line {\n height: $size-150;\n width: 75%;\n min-width: 150px;\n }\n }\n\n @keyframes placeHolderShimmer {\n 0% {\n background-position: -468px 0;\n }\n 100% {\n background-position: 468px 0;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, defineAsyncComponent, onBeforeUnmount, onMounted, type PropType, reactive, ref, useSlots } from 'vue'\nimport { useHelper } from '@/composables/useHelper'\nimport { ChipSize, Weights } from '@/enums'\nimport {\n type ITableColumn,\n type ITableColumnEnriched,\n type ITableData,\n type ITableSort,\n type ITableTotals,\n type ITablePlaceholders,\n type TableCardState,\n type ITableCardProps\n} from '@/types/ITable'\nimport { TABLE } from '@/consts/table'\nimport McInfinityLoadingTrigger from '@/components/elements/McInfinityLoadingTrigger/McInfinityLoadingTrigger.vue'\nimport McTitle from '@/components/elements/McTitle/McTitle.vue'\nimport McChip from '@/components/elements/McChip/McChip.vue'\nimport McTableSort from '@/components/templates/McTable/McTableSort/McTableSort.vue'\nimport McTableSkeletonLoading from '@/components/templates/McTable/McTableSkeletonLoading/McTableSkeletonLoading.vue'\nimport McNoData from '@/components/elements/McNodata/McNoData.vue'\nconst McBottomLoader = defineAsyncComponent(() => import('@/components/elements/McBottomLoader/McBottomLoader.vue'))\nconst McOverlay = defineAsyncComponent(() => import('@/components/patterns/McOverlay/McOverlay.vue'))\nimport { useThrottleFn } from '@vueuse/core'\nimport type { IconsListUnion } from '@/types'\n//@ts-ignore\nimport noTableDataImg from '../../../../assets/img/no_table_data.png'\n\nconst defaultPlaceholders = {\n no_data: 'No data',\n loading: 'Loading...',\n all_loaded: 'All loaded',\n total: 'Total'\n} as ITablePlaceholders\n\nconst emit = defineEmits<{\n (e: 'loading'): void\n (e: 'row-click', value: any): void\n (e: 'sort', value: ITableSort): void\n (e: 'table-card-opened', value: TableCardState): void\n}>()\n\n/**\n * Слоты\n *\n * #header-cell - Заголовок колонки, каждая колонка\n * #`{column.field}-header-right` - Справа от заголовка колонки, именной слот, работает по имени колонки, что бы добавлять в конкретную колонку\n * #`{column.field}-total` - Тотал колонки, именной слот, работает по имени колонки, что бы добавлять в конкретную колонку\n * #column.field - Тело ячейки таблицы. Если не использовать слот, просто будут выводиться данные по названию поля\n * #`{column.field}-right` - Справа от контента колонки, именной слот, работает по имени колонки, что бы добавлять в конкретную колонку\n * №footer-cell - тотал колонки (строка внизу таблицы), каждая колонка\n * */\n\nconst helper = useHelper()\nconst slots = useSlots()\nconst props = defineProps({\n columns: {\n type: Array as PropType<ITableColumn[]>,\n required: true,\n default: () => [] as ITableColumn[]\n },\n data: {\n type: Array as PropType<ITableData>,\n required: true,\n default: () => []\n },\n /**\n * Тоталы таблицы (отображаются в футере), обьект ключи которого = поле field из массива колонок\n * */\n totals: {\n type: Object as PropType<ITableTotals<ITableColumn>>,\n default: () => ({})\n },\n sort: {\n type: Object as PropType<ITableSort>,\n default: () => ({})\n },\n /**\n * Фиксировать ли первую колонку таблицы\n * */\n fixedFirstColumn: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n /**\n * Фиксировать ли последнюю колонку таблицы\n * */\n fixedLastColumn: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Есть ли у таблицы еще данные, если true, при полном пролистывании таблицы вниз, будет вызываться метод @loading\n * */\n hasLoadMore: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n height: {\n type: [Number, String] as PropType<number | 'auto'>,\n default: 'auto'\n },\n /**\n * Высота строки в шапке\n * */\n headerRowHeight: {\n type: Number as PropType<number>,\n default: TABLE.defaultHeaderHeight\n },\n /**\n * Высота строки в теле таблицы\n * */\n rowHeight: {\n type: Number as PropType<number>,\n default: TABLE.defaultRowHeight\n },\n /**\n * Высота строки в подвале (строка с тоталами)\n * */\n footerRowHeight: {\n type: Number as PropType<number>,\n default: TABLE.defaultFooterRowHeight\n },\n /**\n * Отрисовка всей таблицы и полоса загрузки в каждой ячейке (скелетная загрузка)\n */\n skeletonLoading: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Лоадинг внизу таблицы\n * */\n bottomLoading: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Оверлей с затемнение на всю таблицу\n * */\n loading: {\n type: Boolean as PropType<boolean>,\n default: false\n },\n /**\n * Переводы плейсхолеров и текстов\n */\n placeholders: {\n type: Object as PropType<Partial<ITablePlaceholders>>,\n default: () => ({})\n },\n noDataIcon: {\n type: String as () => IconsListUnion,\n default: null\n },\n noDataImg: {\n type: String as PropType<string>,\n default: noTableDataImg\n },\n /**\n * Любые данные что бы передать их в карточку из таблицы\n * */\n toTableCardProps: {\n type: Object as PropType<Record<any, any>>,\n default: () => ({})\n }\n})\n\nconst openCardState = ref<TableCardState>({ state: false })\n\nconst mcTable = ref<null | HTMLElement>(null)\n\nconst hasData = computed((): boolean => {\n return !helper.isEmpty(props.data)\n})\nconst hasTotals = computed((): boolean => {\n return !helper.isEmpty(props.totals)\n})\nconst hasFixedColumn = computed((): boolean => {\n return props.fixedFirstColumn || props.fixedLastColumn\n})\nconst placeholders = reactive<ITablePlaceholders>(helper.deepMerge(defaultPlaceholders, props.placeholders))\n\nconst shadows = reactive({\n firstColHasShadow: false,\n lastColHasShadow: false\n})\n\nconst computedColumns = computed((): ITableColumnEnriched[] => {\n const [first] = props.columns\n return (openCardState.value.state ? [first] : props.columns).map((column, index) => {\n const fixedFirst = props.fixedFirstColumn && index === 0\n const fixedLast = props.fixedLastColumn && index === props.columns.length - 1\n\n return {\n ...column,\n fixedFirst,\n fixedLast,\n style: {\n ...(column.width\n ? {\n '--mc-table-cell-width': `${column.width}px`,\n '--mc-table-cell-max-width': `${column.width}px`,\n '--mc-table-cell-min-width': `${column.width}px`\n }\n : {\n '--mc-table-cell-min-width': column.minWidth && `${column.minWidth}px`,\n '--mc-table-cell-width': '100%'\n })\n }\n }\n })\n})\n\nconst computedHeaderColumns = computed((): ITableColumnEnriched[] => {\n return computedColumns.value.map((column) => ({\n ...column,\n class: {\n 'mc-table__table_header-cell': true,\n 'mc-table__table_header-cell--fixed-first': column.fixedFirst,\n 'mc-table__table_header-cell--fixed-last': column.fixedLast,\n 'mc-table__table_header-cell--shadow-first': column.fixedFirst && shadows.firstColHasShadow,\n 'mc-table__table_header-cell--shadow-last': column.fixedLast && shadows.lastColHasShadow\n }\n }))\n})\n\nconst computedBodyColumns = computed((): ITableColumnEnriched[] => {\n return computedColumns.value.map((column) => ({\n ...column,\n class: {\n 'mc-table__table_body-cell': true,\n 'mc-table__table_body-cell--fixed-first': column.fixedFirst,\n 'mc-table__table_body-cell--fixed-last': column.fixedLast,\n 'mc-table__table_body-cell--shadow-first': column.fixedFirst && shadows.firstColHasShadow,\n 'mc-table__table_body-cell--shadow-last': column.fixedLast && shadows.lastColHasShadow\n }\n }))\n})\n\nconst computedFooterColumns = computed((): ITableColumnEnriched[] => {\n return computedColumns.value.map((column) => ({\n ...column,\n class: {\n 'mc-table__table_footer-cell': true,\n 'mc-table__table_footer-cell--fixed-first': column.fixedFirst,\n 'mc-table__table_footer-cell--fixed-last': column.fixedLast,\n 'mc-table__table_footer-cell--shadow-first': column.fixedFirst && shadows.firstColHasShadow,\n 'mc-table__table_footer-cell--shadow-last': column.fixedLast && shadows.lastColHasShadow\n }\n }))\n})\n\nconst containerStyle = computed((): { [key: string]: string } => {\n return {\n '--mc-table-height': typeof props.height === 'number' ? `${props.height}px` : props.height,\n '--mc-table-header-row-height': helper.isNumber(props.headerRowHeight) ? `${props.headerRowHeight}px` : '40px',\n '--mc-table-row-height': helper.isNumber(props.rowHeight) ? `${props.rowHeight}px` : '40px',\n '--mc-table-footer-row-height': helper.isNumber(props.footerRowHeight) ? `${props.footerRowHeight}px` : '40px'\n }\n})\n\nconst computedTableCardProps = computed((): ITableCardProps => {\n return {\n tableColumns: props.columns,\n tableData: props.data,\n tableTotals: props.totals,\n tableSort: props.sort,\n tableHeaderRowHeight: props.headerRowHeight,\n tableFooterRowHeight: props.footerRowHeight,\n tableFixedFirstColumn: props.fixedFirstColumn,\n tableCardProps: props.toTableCardProps\n }\n})\n\nonMounted((): void => {\n addListeners()\n})\nonBeforeUnmount((): void => {\n removeListeners()\n})\n\nconst onBodyScroll = useThrottleFn((): void => {\n if (mcTable.value) {\n const { scrollLeft, scrollWidth, clientWidth } = mcTable.value\n const firstColShadow = props.fixedFirstColumn && scrollLeft > 0\n const lastColShadow = props.fixedLastColumn && scrollLeft + clientWidth < scrollWidth\n\n if (shadows.firstColHasShadow !== firstColShadow) shadows.firstColHasShadow = firstColShadow\n if (shadows.lastColHasShadow !== lastColShadow) shadows.lastColHasShadow = lastColShadow\n }\n}, 10)\n\nconst addListeners = (): void => {\n if (hasFixedColumn.value && mcTable.value) {\n onBodyScroll()\n mcTable.value.addEventListener('scroll', onBodyScroll)\n }\n}\nconst removeListeners = (): void => {\n if (hasFixedColumn.value && mcTable.value) mcTable.value.removeEventListener('scroll', onBodyScroll)\n}\n\nconst handleRowClick = (row: any): void => {\n emit('row-click', row)\n}\n\nconst handleSetCardState = (payload: TableCardState) => {\n openCardState.value = payload\n emit('table-card-opened', payload)\n}\n</script>\n\n<template>\n <div class=\"mc-table__container\" :style=\"containerStyle\">\n <div ref=\"mcTable\" class=\"mc-table\">\n <div class=\"mc-table__table\">\n <!-- HEADER -->\n <div class=\"mc-table__table_header\">\n <div class=\"mc-table__table_header-row\">\n <div v-for=\"(column, cI) in computedHeaderColumns\" :key=\"cI\" :class=\"column.class\" :style=\"column.style\">\n <div class=\"mc-table__table_header-cell_content\">\n <div class=\"mc-table__table_header-cell_content-left\">\n <mc-table-sort\n v-if=\"column.sortable\"\n :column=\"column.field\"\n :sort=\"sort\"\n @change=\"(val) => emit('sort', val)\"\n />\n <!-- slot для колонки хедера -->\n <slot name=\"header-cell\" :column=\"column\" :cellIndex=\"cI\">\n <mc-title :text-align=\"column.align\" :weight=\"Weights.SemiBold\" pre-line\n >{{ column.header }}\n </mc-title>\n </slot>\n </div>\n <div class=\"mc-table__table_header-cell_content-right\">\n <!-- slot справа от хедера колонки -->\n <slot :name=\"`${column.field}-header-right`\" :column=\"column\" :cellIndex=\"cI\" />\n <!-- slot для тотала (выводится в chip) -->\n <slot :name=\"`${column.field}-total`\" :column=\"column\" :cellIndex=\"cI\">\n <mc-chip\n v-if=\"column.total\"\n :title=\"column.total\"\n variation=\"hover-gray\"\n text-color=\"gray\"\n :size=\"ChipSize.S\"\n />\n </slot>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- BODY -->\n <div class=\"mc-table__table_body\">\n <!-- Отображение скелетной загрузки -->\n <mc-table-skeleton-loading v-if=\"props.skeletonLoading\" :columns=\"computedBodyColumns\" />\n <template v-if=\"hasData\">\n <div\n v-for=\"(row, rI) in data\"\n :key=\"rI\"\n class=\"mc-table__table_body-row\"\n :class=\"{ 'mc-table__table_body-row--active': String(openCardState.id) === String(row.id) }\"\n @click=\"() => handleRowClick(row)\"\n >\n <div v-for=\"(column, cI) in computedBodyColumns\" :key=\"cI\" :class=\"column.class\" :style=\"column.style\">\n <div class=\"mc-table__table_body-cell_content\">\n <div class=\"mc-table__table_body-cell_content-left\">\n <!-- slot для контента (по именем колонки) -->\n <slot\n :name=\"column.field\"\n :row=\"row\"\n :rowIndex=\"rI\"\n :column=\"column\"\n :cellIndex=\"cI\"\n :cellValue=\"row[column.field]\"\n >\n <mc-title :text-align=\"column.align\" ellipsis>{{ row[column.field] }}</mc-title>\n </slot>\n </div>\n <!-- slot срава от контента (по именем колонки + '-right') -->\n <div v-if=\"slots[`${column.field}-right`]\" class=\"mc-table__table_body-cell_content-right\">\n <slot :name=\"`${column.field}-right`\" />\n </div>\n </div>\n </div>\n </div>\n </template>\n <mc-infinity-loading-trigger :active=\"props.hasLoadMore\" @loading=\"emit('loading')\" />\n </div>\n\n <!-- FOOTER -->\n <div v-if=\"hasTotals\" class=\"mc-table__table_footer\">\n <div class=\"mc-table__table_footer-row\">\n <div v-for=\"(column, cI) in computedFooterColumns\" :key=\"cI\" :class=\"column.class\" :style=\"column.style\">\n <slot name=\"footer-cell\" :column=\"column\" :cellIndex=\"cI\" :cellValue=\"totals[column.field]\">\n <mc-title :text-align=\"column.align\" :weight=\"Weights.SemiBold\">\n {{ totals[column.field] }}\n </mc-title>\n </slot>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- slot для карточки, по дефолту будет вывлдить карточку из вложенного роута -->\n <slot v-bind=\"computedTableCardProps\" @setTableCardState=\"handleSetCardState\">\n <!-- место для рендера карточки, когда она находится по вложенному роуту -->\n <router-view v-bind=\"computedTableCardProps\" @setTableCardState=\"handleSetCardState\" />\n </slot>\n <mc-bottom-loader v-if=\"bottomLoading\" />\n <mc-overlay v-if=\"loading\" />\n <mc-no-data\n v-if=\"!hasData\"\n variation=\"small\"\n :title=\"placeholders.no_data\"\n :img=\"props.noDataImg\"\n :icon=\"props.noDataIcon\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/styles/mixins' as *;\n@use '../../../../assets/tokens/colors' as *;\n@use '../../../../assets/tokens/font-families' as *;\n@use '../../../../assets/tokens/font-weights' as *;\n@use '../../../../assets/tokens/font-sizes' as *;\n@use '../../../../assets/tokens/spacings' as *;\n@use '../../../../assets/tokens/sizes' as *;\n@use '../../../../assets/tokens/box-shadows' as *;\n@use '../../../../assets/tokens/z-indexes' as *;\n@use '../../../../assets/tokens/media-queries' as *;\n@mixin fixed-first {\n left: 0;\n z-index: $z-index-notification;\n border-right: var(--border-style);\n background-color: $color-white;\n}\n@mixin fixed-last {\n right: 0;\n z-index: $z-index-notification;\n background-color: $color-white;\n}\n@mixin fixed-classes {\n &--fixed-first {\n @include fixed-first;\n }\n &--fixed-last {\n @include fixed-last;\n }\n}\n@mixin shadow-classes {\n &--shadow-first {\n @include shadow-first;\n }\n &--shadow-last {\n @include shadow-last;\n }\n}\n@mixin shadow-first {\n border-right-color: $color-transparent;\n &::after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n background: none;\n width: 1px;\n height: 100%;\n box-shadow: 5px 0 8px $color-black;\n pointer-events: none;\n }\n}\n@mixin shadow-last {\n border-left-color: $color-transparent;\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n background: none;\n width: 1px;\n height: 100%;\n box-shadow: -5px 0 8px $color-black;\n pointer-events: none;\n }\n}\n@mixin grow {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n}\n@mixin cell-alignment {\n display: flex;\n align-items: center;\n padding: 0 $space-200;\n}\n.mc-table {\n font-family: $font-family-main;\n overflow-y: auto;\n max-height: 100%;\n @include grow;\n * {\n box-sizing: border-box;\n }\n &__container {\n --border-style: 1px solid #{$color-hover-gray};\n --table-row-hover-background-color: #{$color-hover-gray};\n position: relative;\n overflow: hidden;\n font-size: $font-size-200;\n height: var(--mc-table-height);\n border: var(--border-style);\n @include grow;\n }\n &__table {\n @include grow;\n &_header {\n position: sticky;\n top: 0;\n z-index: $z-index-overlay;\n &-row {\n display: flex;\n flex-wrap: nowrap;\n height: var(--mc-table-header-row-height);\n }\n &-cell {\n position: sticky;\n text-align: left;\n top: 0;\n z-index: 10;\n width: var(--mc-table-cell-width);\n max-width: var(--mc-table-cell-max-width);\n min-width: var(--mc-table-cell-min-width);\n background-color: $color-white;\n border-bottom: var(--border-style);\n @include cell-alignment;\n @include fixed-classes;\n @include shadow-classes;\n &_content {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n &-left {\n display: flex;\n align-items: center;\n @include child-indent-right($space-50);\n }\n &-right {\n display: flex;\n align-items: center;\n @include child-indent-right($space-50);\n }\n }\n }\n }\n &_body {\n @include grow;\n $body: &;\n &-row {\n display: flex;\n flex-wrap: nowrap;\n height: var(--mc-table-row-height);\n cursor: pointer;\n &--active {\n #{$body}-cell {\n background-color: var(--table-row-hover-background-color);\n }\n }\n &:hover {\n #{$body}-cell {\n background-color: var(--table-row-hover-background-color);\n &_content-right {\n display: flex;\n }\n }\n }\n @media #{$media-mobile} {\n #{$body}-cell {\n &_content-right {\n display: flex;\n }\n }\n }\n }\n &-cell {\n position: sticky;\n z-index: 15;\n text-align: left;\n width: var(--mc-table-cell-width);\n max-width: var(--mc-table-cell-max-width);\n min-width: var(--mc-table-cell-min-width);\n @include cell-alignment;\n @include fixed-classes;\n @include shadow-classes;\n &_content {\n width: 100%;\n &-right {\n position: absolute;\n display: none;\n top: 0;\n right: 0;\n padding-right: $space-200;\n padding-left: $space-200;\n height: var(--mc-table-row-height);\n align-items: center;\n background: linear-gradient(90deg, rgba($color-hover-gray, 0.2) 0%, $color-hover-gray 60%);\n z-index: $z-index-notification;\n @include child-indent-right($space-50);\n }\n &-left {\n display: flex;\n align-items: center;\n @include child-indent-right($space-50);\n }\n }\n }\n }\n &_footer {\n position: sticky;\n bottom: 0;\n z-index: $z-index-notification;\n &-row {\n display: flex;\n flex-wrap: nowrap;\n height: var(--mc-table-footer-row-height);\n }\n &-cell {\n position: sticky;\n z-index: 15;\n text-align: left;\n width: var(--mc-table-cell-width);\n max-width: var(--mc-table-cell-max-width);\n min-width: var(--mc-table-cell-min-width);\n background-color: $color-white;\n border-top: var(--border-style);\n @include cell-alignment;\n @include fixed-classes;\n @include shadow-classes;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport { ButtonSize } from '@/enums'\nimport type { PropType } from 'vue'\n\nconst props = defineProps({\n buttonBackText: {\n type: String as PropType<string>,\n default: 'Back'\n },\n backTo: {\n type: String as PropType<string>,\n default: null\n }\n})\n</script>\n\n<template>\n <section class=\"mc-table-card-header\">\n <div class=\"mc-table-card-header__left\">\n <!-- @slot Слот контента -->\n <slot>\n <mc-button :to=\"props.backTo\" exact variation=\"purple-link\" :size=\"ButtonSize.Xs\">\n <template #icon-prepend>\n <mc-svg-icon name=\"arrow_backward\" />\n </template>\n {{ props.buttonBackText }}\n </mc-button>\n </slot>\n </div>\n <div class=\"mc-table-card-header__right\">\n <!-- @slot right -->\n <slot name=\"right\" />\n </div>\n </section>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../../assets/styles/mixins' as *;\n@use '../../../../../assets/tokens/colors' as *;\n@use '../../../../../assets/tokens/spacings' as *;\n.mc-table-card-header {\n $block-name: &;\n\n display: flex;\n flex-wrap: nowrap;\n background-color: $color-white;\n padding: 0;\n padding-inline: $space-150 $space-200;\n align-items: center;\n height: 100%;\n\n &__left,\n &__right {\n @include layout-flex-fix();\n display: flex;\n flex-wrap: nowrap;\n @include child-indent-right($space-200);\n\n &:empty {\n display: none;\n }\n }\n\n &__left {\n margin-inline-end: auto;\n }\n\n &__right {\n margin-inline-start: auto;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, type PropType, ref, useSlots, watch } from 'vue'\nimport {\n type ITableColumn,\n type ITableColumnWidth,\n type ITableData,\n type ITableSort,\n type ITableTotals,\n type TableCardState\n} from '@/types/ITable'\nimport { TABLE } from '@/consts/table'\nimport { useHelper } from '@/composables'\n\nconst slots = useSlots()\nconst emit = defineEmits<{\n (e: 'set-table-card-state', value: TableCardState): void\n (e: 'card-id-updated', value: TableCardState): void\n}>()\n\n/**\n * Если карточка исползуется как отдельная страница!\n * 1. Если карточка используется как рутовый узел страницы, то компонент McTableCard, автоматически получит все пропсы от таблицы\n * 2. Если карточка используется НЕ как рутовый узел, нужно принять в компоненте все пропсы как в карточке, и передать их в компонент McTableCard\n *\n * При использовании как описано в п1. Автоматически получит все пропсы от таблицы, так же будут доступны через slot-scope в дефолтном слоте.\n * */\nconst props = defineProps({\n /**\n * Обязательно что бы таблица правильно подсвечивала выбранную строку. Проверка будет по полю id\n * Если карточка используется как рутовый узел страницы, будет автоматически приходить router.params.id\n * */\n id: {\n type: [String, Number] as PropType<string | number>\n },\n tableColumns: {\n type: Array as PropType<ITableColumnWidth[]>,\n default: () => []\n },\n tableData: {\n type: Array as PropType<ITableData>,\n default: () => []\n },\n tableTotals: {\n type: Object as PropType<ITableTotals<ITableColumn>>,\n default: () => ({})\n },\n tableSort: {\n type: Object as PropType<ITableSort>,\n default: () => ({})\n },\n tableFixedFirstColumn: {\n type: Boolean as PropType<boolean>,\n default: true\n },\n tableHeaderRowHeight: {\n type: Number as PropType<number>,\n default: TABLE.defaultHeaderHeight\n },\n tableFooterRowHeight: {\n type: Number as PropType<number>,\n default: TABLE.defaultFooterRowHeight\n },\n tableCardProps: {\n type: Object as PropType<Record<any, any>>,\n default: () => ({})\n },\n footerBlur: {\n type: Boolean,\n default: false\n }\n})\n\nconst helper = useHelper()\n\nconst tableFirstColWidth = computed((): number => {\n const [first] = props.tableColumns\n return first?.width ? first.width : TABLE.defaultTableFirstColWidth\n})\n\nconst bodyEl = ref<HTMLElement | null>(null)\nconst body_scrolled_to_bottom = ref(true)\n\nconst computedFooterClasses = computed((): { [key: string]: boolean } => {\n return {\n 'mc-table-card__footer': !!slots.footer,\n 'mc-table-card__footer--with-blur': props.footerBlur && !body_scrolled_to_bottom.value\n }\n})\n\nconst cardStyle = computed((): { [key: string]: string } => {\n const borderCompensations = -1\n return {\n '--table-card-header-height': helper.isNumber(props.tableHeaderRowHeight)\n ? `${props.tableHeaderRowHeight + borderCompensations}px`\n : `${TABLE.defaultHeaderHeight}px`,\n '--table-card-footer-height': helper.isNumber(props.tableFooterRowHeight)\n ? `${props.tableFooterRowHeight + borderCompensations}px`\n : `${TABLE.defaultFooterRowHeight}px`,\n marginLeft: `${tableFirstColWidth.value}px`\n }\n})\n\nonMounted(() => {\n if (props.footerBlur) {\n initBlur()\n }\n handleEmitTableCardState({ state: true, id: props.id })\n})\n\nonBeforeUnmount(() => {\n bodyEl.value && bodyEl.value.removeEventListener('scroll', handlerScroll)\n handleEmitTableCardState({ state: false })\n})\n\nconst initBlur = () => {\n try {\n body_scrolled_to_bottom.value = false\n bodyEl.value && bodyEl.value.addEventListener('scroll', handlerScroll)\n } catch (e) {\n console.error(e)\n }\n}\n\nconst handlerScroll = () => {\n try {\n if (bodyEl.value) {\n const { offsetHeight, scrollTop, scrollHeight } = bodyEl.value\n body_scrolled_to_bottom.value = offsetHeight + scrollTop === scrollHeight\n }\n } catch (e) {\n body_scrolled_to_bottom.value = true\n console.error(e)\n }\n}\n\nconst handleEmitTableCardState = (payload: TableCardState) => {\n emit('set-table-card-state', payload)\n}\n\nwatch(\n () => props.footerBlur,\n (val) => {\n if (val) {\n initBlur()\n } else {\n bodyEl.value && bodyEl.value.removeEventListener('scroll', handlerScroll)\n }\n }\n)\nwatch(\n () => props.id,\n (id) => {\n const state: TableCardState = { state: true, id }\n handleEmitTableCardState(state)\n emit('card-id-updated', state)\n }\n)\n</script>\n\n<template>\n <div class=\"mc-table-card\" :style=\"cardStyle\">\n <div v-if=\"$slots.header\" class=\"mc-table-card__header\">\n <!-- @slot Слот заголовка -->\n <slot name=\"header\" />\n </div>\n <div ref=\"bodyEl\" class=\"mc-table-card__body\">\n <!-- @slot Слот контента -->\n <slot v-bind=\"props\" />\n </div>\n <div v-if=\"$slots.footer || footerBlur\" :class=\"computedFooterClasses\">\n <!-- @slot Слот футера -->\n <slot name=\"footer\" />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../../assets/styles/mixins' as *;\n@use '../../../../assets/tokens/colors' as *;\n@use '../../../../assets/tokens/spacings' as *;\n@use '../../../../assets/tokens/sizes' as *;\n@use '../../../../assets/tokens/z-indexes' as *;\n.mc-table-card {\n $block-name: &;\n\n --table-card-header-height: $size-500;\n --table-card-footer-height: $size-500;\n @include position(absolute, 0);\n z-index: $z-index-overlay;\n background-color: $color-white;\n border-inline-start: 1px solid $color-hover-gray;\n display: flex;\n flex-direction: column;\n @include custom-scroll();\n\n &__header {\n height: var(--table-card-header-height);\n border-bottom: 1px solid $color-hover-gray;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n }\n\n &__body {\n position: relative;\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n }\n\n &__footer {\n border-top: 1px solid $color-hover-gray;\n height: var(--table-card-footer-height);\n flex-shrink: 0;\n padding: 0 $space-200;\n display: flex;\n align-items: center;\n @include child-indent-right($space-150);\n &:empty {\n display: none;\n }\n &--with-blur {\n position: relative;\n &::after {\n @include pseudo;\n height: $space-900;\n background: linear-gradient(to top, $color-white, transparent);\n position: absolute;\n width: 100%;\n inset-inline-start: 0;\n bottom: 100%;\n pointer-events: none;\n }\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport McAvatar from '@/components/elements/McAvatar/McAvatar.vue'\nimport McButton from '@/components/elements/McButton/McButton.vue'\nimport McSvgIcon from '@/components/elements/McSvgIcon/McSvgIcon.vue'\nimport McSeparator from '@/components/elements/McSeparator/McSeparator.vue'\nimport McDropdown from '@/components/patterns/McDropdown/McDropdown.vue'\nimport { type PropType, ref } from 'vue'\nimport { ButtonSize, DropdownPositions, HorizontalAlignment } from '@/enums'\nimport type { IconsListUnion } from '@/types'\n\nconst props = defineProps({\n /**\n * Данные пользователя\n *\n */\n user: {\n type: Object as PropType<Record<string, any>>,\n default: () => ({})\n },\n /**\n * Меню языков\n *\n */\n menuLangs: {\n type: Array,\n default: () => []\n },\n /**\n * Локализация или текст по умолчанию\n *\n */\n defaultLang: {\n type: String as PropType<string>,\n default: 'Выберите язык'\n },\n /**\n * Текущая локализация\n *\n */\n currentLang: {\n type: String as PropType<string>,\n default: null\n }\n})\n\nconst menuLangsDD = ref<HTMLElement | null>(null)\nconst localesDropdownOpen = ref(false)\nconst userDropdownOpen = ref(false)\n</script>\n\n<template>\n <div class=\"mc-top-bar\">\n <div class=\"mc-top-bar__inner\">\n <div v-if=\"$slots.left\" class=\"mc-top-bar__left\">\n <slot name=\"left\" />\n </div>\n <div class=\"mc-top-bar__right\">\n <slot name=\"right\" />\n <mc-dropdown\n v-if=\"menuLangs && menuLangs.length\"\n ref=\"menuLangsDD\"\n :items=\"menuLangs\"\n v-model=\"localesDropdownOpen\"\n list-min-width=\"auto\"\n class=\"mc-top-bar__menu-langs\"\n >\n <template #activator>\n <mc-button variation=\"black-link\" uppercase>\n {{ currentLang || defaultLang }}\n <template #icon-append>\n <mc-svg-icon class=\"rotate\" name=\"arrow_drop_down\" />\n </template>\n </mc-button>\n </template>\n <template #item=\"{ item }\">\n <mc-button\n :to=\"item.to || item.href\"\n :exact=\"item.exact\"\n variation=\"black-flat\"\n :text-align=\"HorizontalAlignment.Left\"\n full-width\n >\n <template #icon-prepend>\n <mc-svg-icon :name=\"`flag_${item.name.toLowerCase()}` as IconsListUnion\" />\n </template>\n {{ item.name }}\n </mc-button>\n </template>\n </mc-dropdown>\n <slot name=\"user\">\n <mc-dropdown v-if=\"props.user\" v-model=\"userDropdownOpen\" :position=\"DropdownPositions.Right\">\n <template #activator>\n <mc-button variation=\"white-flat\" :size=\"ButtonSize.MCompact\">\n <template #icon-prepend>\n <mc-avatar :src=\"props.user.avatar\" rounded size=\"400\" />\n </template>\n </mc-button>\n </template>\n <slot name=\"user-dropdown-panel\" />\n </mc-dropdown>\n </slot>\n </div>\n </div>\n <mc-separator color=\"hover-gray\" indent-top=\"100\" />\n <slot name=\"bottom\" />\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../../../assets/styles/mixins' as *;\n@use '../../../assets/tokens/spacings' as *;\n@use '../../../assets/tokens/colors' as *;\n.mc-top-bar {\n $block-name: &;\n\n width: 100%;\n\n &__inner {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: $space-100 $space-150 0 $space-150;\n @include child-indent-right($space-100);\n }\n\n &__left,\n &__right {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n @include child-indent-right($space-100);\n }\n\n &__right {\n min-width: 0;\n flex: 1 1 auto;\n justify-content: flex-end;\n }\n &__menu-langs {\n .mc-svg-icon {\n svg {\n rect {\n stroke: $color-hover-gray;\n }\n }\n }\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, onMounted, nextTick, watch, type PropType, computed } from 'vue'\n\ninterface VisibleItem {\n key: number\n data: any\n index: number\n top: number\n}\n\nconst props = defineProps({\n /**\n * Массив данных для рендеринга\n * */\n items: {\n type: Array as PropType<any[]>,\n default: () => [],\n required: true\n },\n /**\n * Высота контейнера скролла\n * */\n containerHeight: {\n type: Number as PropType<number>,\n required: true\n },\n /**\n * Высота 1 элемента списка\n * */\n itemHeight: {\n type: Number as PropType<number>,\n default: 20,\n required: true\n },\n /**\n * Буфер для подгрузки дополнительных элементов вне видимой области\n * */\n buffer: {\n type: Number as PropType<number>,\n default: 1\n }\n})\n\nconst containerRef = ref<HTMLDivElement | null>(null)\nconst scrollTop = ref<number>(0)\nconst visibleItems = ref<VisibleItem[]>([])\nconst totalHeight = ref<number>(0)\n\nconst styles = computed((): { [key: string]: string } => {\n return {\n height: `${props.containerHeight}px`,\n overflowY: 'auto',\n position: 'relative'\n }\n})\n\nonMounted((): void => {\n calculateTotalHeight()\n nextTick(calculateVisibleItems)\n})\n\nconst calculateTotalHeight = (): void => {\n totalHeight.value = props.items.length * props.itemHeight\n}\n\nconst calculateVisibleItems = (): void => {\n const containerHeight = containerRef.value?.clientHeight || 0\n const startIndex = Math.floor(scrollTop.value / props.itemHeight)\n const endIndex = Math.min(props.items.length - 1, Math.floor((scrollTop.value + containerHeight) / props.itemHeight))\n const buffer = props.buffer || 5\n\n const result: VisibleItem[] = []\n for (let i = Math.max(0, startIndex - buffer); i <= Math.min(endIndex + buffer, props.items.length - 1); i++) {\n result.push({\n key: i,\n data: props.items[i],\n index: i,\n top: i * props.itemHeight\n } as VisibleItem)\n }\n visibleItems.value = result\n}\n\nconst onScroll = (): void => {\n scrollTop.value = containerRef.value?.scrollTop || 0\n requestAnimationFrame(calculateVisibleItems)\n}\n\nwatch(\n () => props.items,\n (): void => {\n calculateTotalHeight()\n nextTick(calculateVisibleItems)\n }\n)\n</script>\n\n<template>\n <div class=\"mc-virtual-scroll\" ref=\"containerRef\" @scroll=\"onScroll\" :style=\"styles\">\n <div\n v-for=\"item in visibleItems\"\n :key=\"`mc-virtual-scroll__item-${item.key}`\"\n class=\"mc-virtual-scroll__item\"\n :style=\"{ top: `${item.top}px` }\"\n >\n <slot name=\"item\" :item=\"item.data\" :index=\"item.index\"></slot>\n </div>\n\n <!-- Пустое пространство для скролла -->\n <div :style=\"{ height: `${totalHeight}px` }\"></div>\n </div>\n</template>\n\n<style lang=\"scss\">\n.mc-virtual-scroll {\n position: relative;\n overflow-y: auto;\n &__item {\n position: absolute;\n transition: all 0.3s ease;\n width: 100%;\n }\n}\n</style>\n"],"names":["style","x","y","adaptivePropsParams","adaptivePropsSizes","head","more","less","period","McFieldText","McFieldSelect","tab","McBottomLoader","McOverlay"],"mappings":"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"}