@1337exp/taoui 1.0.0

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":"index.cjs","sources":["../src/components/TaoButton.vue","../src/components/TaoBlock.vue","../src/components/TaoInput.vue","../src/components/TaoCard.vue","../src/components/TaoModal.vue","../src/components/TaoTabs.vue","../src/components/TaoTooltip.vue","../src/components/TaoSpoiler.vue","../src/components/TaoCopy.vue","../src/components/TaoContainer.vue","../src/components/TaoFlex.vue","../src/components/TaoSpace.vue","../src/components/TaoIcon.vue","../src/components/TaoLoader.vue","../src/components/TaoImage.vue","../src/components/TaoCheckbox.vue","../src/components/TaoTag.vue","../src/components/TaoDivider.vue","../src/components/TaoAnimatedBorder.vue","../src/components/TaoTextarea.vue","../src/components/TaoScrollTop.vue","../src/components/TaoProgress.vue","../src/components/TaoSlider.vue","../src/components/TaoFileDrop.vue","../src/components/TaoDropdownMenu.vue","../src/components/TaoPinCode.vue","../src/components/TaoLink.vue","../src/index.ts"],"sourcesContent":["<script lang=\"ts\" setup>\ninterface Props {\n type?: 'button' | 'submit' | 'reset';\n size?: 'small' | 'medium' | 'large';\n variant?: 'primary' | 'secondary' | 'ghost' | 'danger';\n disabled?: boolean;\n loading?: boolean;\n block?: boolean;\n icon?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'button',\n size: 'medium',\n variant: 'primary',\n disabled: false,\n loading: false,\n block: false,\n icon: '',\n});\n\nconst emit = defineEmits(['click']);\n\nfunction handleClick(event: MouseEvent) {\n if (!props.disabled && !props.loading) {\n emit('click', event);\n }\n}\n</script>\n\n<template>\n <button\n class=\"tao-button\"\n :class=\"[\n `tao-button--${size}`,\n `tao-button--${variant}`,\n {\n 'tao-button--disabled': disabled,\n 'tao-button--loading': loading,\n 'tao-button--block': block,\n 'tao-button--icon': !!icon,\n },\n ]\"\n :type=\"type\"\n :disabled=\"disabled || loading\"\n @click=\"handleClick\"\n >\n <span v-if=\"loading\" class=\"tao-button__loader\"></span>\n <span v-if=\"icon\" class=\"tao-button__icon\">{{ icon }}</span>\n <span class=\"tao-button__content\"><slot /></span>\n </button>\n</template>\n\n<style scoped>\n.tao-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--tao-space-2);\n\n border: none;\n border-radius: var(--tao-radius-control);\n cursor: pointer;\n font-family: inherit;\n font-weight: 500;\n transition: var(--tao-transition-base);\n position: relative;\n}\n\n.tao-button:active {\n transform: translateY(1px);\n}\n\n.tao-button--small {\n padding: var(--tao-space-1) var(--tao-space-3);\n font-size: var(--tao-font-size-xs);\n height: 28px;\n}\n\n.tao-button--medium {\n padding: var(--tao-space-2) var(--tao-space-4);\n font-size: var(--tao-font-size-md);\n height: 36px;\n}\n\n.tao-button--large {\n padding: var(--tao-space-2) var(--tao-space-6);\n font-size: var(--tao-font-size-lg);\n height: 44px;\n}\n\n.tao-button--primary {\n background-color: var(--tao-color-accent);\n color: var(--tao-color-on-accent);\n}\n\n.tao-button--primary:hover:not(.tao-button--disabled) {\n background-color: var(--tao-color-accent-hover);\n}\n\n.tao-button--secondary {\n background-color: var(--tao-color-surface-sunken);\n color: var(--tao-color-text);\n border: 1px solid var(--tao-color-border-strong);\n}\n\n.tao-button--secondary:hover:not(.tao-button--disabled) {\n background-color: var(--tao-color-surface-hover);\n color: var(--tao-color-text-strong);\n}\n\n.tao-button--ghost {\n background-color: transparent;\n color: var(--tao-color-accent);\n}\n\n.tao-button--ghost:hover:not(.tao-button--disabled) {\n background-color: var(--tao-color-accent-subtle-hover);\n}\n\n.tao-button--danger {\n background-color: var(--tao-color-danger);\n color: var(--tao-color-text-strong);\n}\n\n.tao-button--danger:hover:not(.tao-button--disabled) {\n background-color: var(--tao-color-danger-hover);\n}\n\n.tao-button--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.tao-button--block {\n width: 100%;\n}\n\n.tao-button--loading .tao-button__content {\n opacity: 0;\n}\n\n.tao-button__loader {\n position: absolute;\n width: 16px;\n height: 16px;\n border: 2px solid color-mix(in srgb, currentColor 15%, transparent);\n border-top-color: currentColor;\n border-radius: var(--tao-radius-full);\n animation: tao-spin 0.8s linear infinite;\n}\n\n.tao-button__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n@keyframes tao-spin {\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ninterface Props {\n padding?: number | number[];\n radius?: number;\n shadow?: boolean;\n hover?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n padding: 16,\n radius: 8,\n shadow: true,\n hover: false,\n});\n\nconst paddingStyle = computed(() => {\n if (Array.isArray(props.padding)) {\n return {\n padding: `${props.padding.map(p => `${p}px`).join(' ')}`\n };\n }\n return { padding: `${props.padding}px` };\n});\n\nconst radiusStyle = computed(() => ({\n borderRadius: `${props.radius}px`\n}));\n</script>\n\n<template>\n <div\n class=\"tao-block\"\n :class=\"{ 'tao-block--shadow': shadow, 'tao-block--hover': hover }\"\n :style=\"[paddingStyle, radiusStyle]\"\n >\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-block {\n background: var(--tao-color-surface);\n color: var(--tao-color-text);\n transition: var(--tao-transition-base);\n}\n\n.tao-block--shadow {\n box-shadow: var(--tao-shadow-panel);\n}\n\n.tao-block--hover {\n cursor: pointer;\n}\n\n.tao-block--hover:hover {\n box-shadow: var(--tao-shadow-md);\n}\n</style>\n","<script lang=\"ts\" setup>\ninterface Props {\n modelValue: string | number;\n type?: 'text' | 'password' | 'email' | 'number' | 'tel';\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n errorMessage?: string;\n label?: string;\n}\n\nwithDefaults(defineProps<Props>(), {\n type: 'text',\n placeholder: '',\n disabled: false,\n error: false,\n errorMessage: '',\n label: '',\n});\n\nconst emit = defineEmits(['update:modelValue', 'blur', 'focus']);\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLInputElement;\n emit('update:modelValue', target.value);\n}\n\nfunction handleBlur(event: FocusEvent) {\n emit('blur', event);\n}\n\nfunction handleFocus(event: FocusEvent) {\n emit('focus', event);\n}\n</script>\n\n<template>\n <div class=\"tao-input-wrapper\">\n <label v-if=\"label\" class=\"tao-input__label\">{{ label }}</label>\n <input\n class=\"tao-input\"\n :class=\"{ 'tao-input--error': error }\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n @input=\"handleInput\"\n @blur=\"handleBlur\"\n @focus=\"handleFocus\"\n />\n <span v-if=\"error && errorMessage\" class=\"tao-input__error\">{{ errorMessage }}</span>\n </div>\n</template>\n\n<style scoped>\n.tao-input-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-1);\n width: 100%;\n}\n\n.tao-input__label {\n font-size: var(--tao-font-size-sm);\n color: var(--tao-color-text);\n font-weight: 500;\n}\n\n.tao-input {\n padding: var(--tao-space-2) var(--tao-space-3);\n border: 1px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-control);\n background: var(--tao-color-input-bg);\n color: var(--tao-color-input-text);\n font-size: var(--tao-font-size-md);\n font-family: inherit;\n transition: var(--tao-transition-base);\n}\n\n.tao-input::placeholder {\n color: var(--tao-color-input-placeholder);\n}\n\n.tao-input:focus {\n outline: none;\n border-color: var(--tao-color-accent);\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\n}\n\n.tao-input:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n color: var(--tao-color-input-disabled-text);\n background: var(--tao-color-input-disabled-bg);\n}\n\n.tao-input--error {\n border-color: var(--tao-color-danger);\n}\n\n.tao-input--error:focus {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\n}\n\n.tao-input__error {\n font-size: var(--tao-font-size-xs);\n color: var(--tao-color-danger);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ninterface Props {\n padding?: number | number[];\n radius?: number;\n shadow?: boolean;\n shadowBottomOnly?: boolean;\n hover?: boolean;\n active?: boolean;\n overflow?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n padding: 20,\n radius: 8,\n shadow: true,\n shadowBottomOnly: false,\n hover: false,\n active: false,\n overflow: false,\n});\n\nconst paddingStyle = computed(() => {\n if (Array.isArray(props.padding)) {\n return { padding: `${props.padding.map((p) => `${p}px`).join(' ')}` };\n }\n return { padding: `${props.padding}px` };\n});\n\nconst radiusStyle = computed(() => ({ borderRadius: `${props.radius}px` }));\n</script>\n\n<template>\n <div\n class=\"tao-card\"\n :class=\"{\n 'tao-card--shadow': shadow && !shadowBottomOnly,\n 'tao-card--shadow-bottom': shadowBottomOnly,\n 'tao-card--hover': hover,\n 'tao-card--active': active,\n 'tao-card--overflow': overflow,\n }\"\n :style=\"radiusStyle\"\n >\n <div v-if=\"$slots.cover\" class=\"tao-card__cover\">\n <slot name=\"cover\" />\n </div>\n\n <div class=\"tao-card__content\" :style=\"paddingStyle\">\n <h2 v-if=\"$slots.headerTitle\" class=\"tao-card__header-title\">\n <slot name=\"headerTitle\" />\n </h2>\n\n <div v-if=\"$slots.header || $slots.headerSecondary\" class=\"tao-card__header\" :class=\"{ 'tao-card__header--between': $slots.headerSecondary }\">\n <span><slot name=\"header\" /></span>\n <span v-if=\"$slots.headerSecondary\"><slot name=\"headerSecondary\" /></span>\n </div>\n\n <div v-if=\"$slots.title || $slots.sub\" class=\"tao-card__title-block\">\n <h2 v-if=\"$slots.title\" class=\"tao-card__title\"><slot name=\"title\" /></h2>\n <div v-if=\"$slots.sub\" class=\"tao-card__sub\"><slot name=\"sub\" /></div>\n </div>\n\n <div v-if=\"$slots.default\" class=\"tao-card__body\"><slot /></div>\n\n <div v-if=\"$slots.footer\" class=\"tao-card__footer\"><slot name=\"footer\" /></div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-card {\n width: 100%;\n background: var(--tao-color-surface-raised);\n color: var(--tao-color-text);\n transition: var(--tao-transition-base);\n}\n\n.tao-card--overflow {\n overflow: visible;\n}\n\n.tao-card:not(.tao-card--overflow) {\n overflow: hidden;\n}\n\n.tao-card--shadow {\n box-shadow: var(--tao-shadow-panel);\n}\n\n.tao-card--shadow-bottom {\n box-shadow: 0 1px 0 0 var(--tao-color-border-strong);\n}\n\n.tao-card--hover {\n cursor: pointer;\n}\n\n.tao-card--hover:hover,\n.tao-card--hover.tao-card--active {\n box-shadow: 0 0 0 1px var(--tao-color-accent), var(--tao-shadow-lg);\n}\n\n.tao-card__cover {\n overflow: hidden;\n}\n\n.tao-card__content {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-3);\n}\n\n.tao-card__header-title {\n margin: 0 0 var(--tao-space-5);\n font-weight: 500;\n text-align: center;\n color: var(--tao-color-text-strong);\n}\n\n.tao-card__header {\n margin-top: -6px;\n padding: 2px 0 var(--tao-space-2);\n font-size: var(--tao-font-size-sm);\n font-weight: 700;\n}\n\n.tao-card__header--between {\n display: flex;\n justify-content: space-between;\n}\n\n.tao-card__title {\n margin: 0 0 2px;\n color: var(--tao-color-text-strong);\n}\n\n.tao-card__sub {\n font-size: var(--tao-font-size-xs);\n color: var(--tao-color-text-muted);\n}\n\n.tao-card__body {\n font-size: var(--tao-font-size-md);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { watch, onBeforeUnmount } from 'vue';\n\ninterface Props {\n modelValue: boolean;\n title?: string;\n closable?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: '',\n closable: true,\n});\n\nconst emit = defineEmits(['update:modelValue', 'close']);\n\nfunction close() {\n emit('update:modelValue', false);\n emit('close');\n}\n\n// Блокируем скролл страницы за модалкой, пока она открыта. Скролл\n// самого контента модалки не трогаем — он остаётся на .tao-modal\n// (overflow-y: auto) и работает независимо.\nlet previousOverflow = '';\n\nfunction lockBodyScroll() {\n previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n}\n\nfunction unlockBodyScroll() {\n document.body.style.overflow = previousOverflow;\n}\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (isOpen) {\n lockBodyScroll();\n } else {\n unlockBodyScroll();\n }\n },\n { immediate: true }\n);\n\nonBeforeUnmount(() => {\n if (props.modelValue) {\n unlockBodyScroll();\n }\n});\n</script>\n\n<template>\n <Teleport to=\"body\">\n <Transition name=\"tao-modal-fade\">\n <div v-if=\"modelValue\" class=\"tao-modal-overlay\" @click.self=\"closable && close()\">\n <div class=\"tao-modal\">\n <div v-if=\"title || $slots.header\" class=\"tao-modal__header\">\n <slot name=\"header\">\n <h2 class=\"tao-modal__title\">{{ title }}</h2>\n </slot>\n <button v-if=\"closable\" class=\"tao-modal__close\" @click=\"close\">&times;</button>\n </div>\n <div class=\"tao-modal__content\">\n <slot />\n </div>\n <div v-if=\"$slots.footer\" class=\"tao-modal__footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style scoped>\n.tao-modal-overlay {\n position: fixed;\n inset: 0;\n background: var(--tao-color-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: var(--tao-space-5);\n}\n\n.tao-modal {\n background: var(--tao-color-surface-raised);\n border-radius: var(--tao-radius-panel);\n max-width: 500px;\n width: 100%;\n max-height: 90vh;\n overflow-y: auto;\n box-shadow: var(--tao-shadow-overlay);\n}\n\n.tao-modal__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--tao-space-4) var(--tao-space-5);\n border-bottom: 1px solid var(--tao-color-border);\n}\n\n.tao-modal__title {\n margin: 0;\n font-size: var(--tao-font-size-xl);\n font-weight: 600;\n color: var(--tao-color-text-strong);\n}\n\n.tao-modal__close {\n background: none;\n border: none;\n font-size: 24px;\n color: var(--tao-color-text);\n cursor: pointer;\n padding: 0;\n line-height: 1;\n}\n\n.tao-modal__close:hover {\n color: var(--tao-color-text-strong);\n}\n\n.tao-modal__content {\n padding: var(--tao-space-5);\n}\n\n.tao-modal__footer {\n padding: var(--tao-space-4) var(--tao-space-5);\n border-top: 1px solid var(--tao-color-border);\n display: flex;\n gap: var(--tao-space-3);\n justify-content: flex-end;\n}\n\n.tao-modal-fade-enter-active,\n.tao-modal-fade-leave-active {\n transition: opacity var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-modal-fade-enter-from,\n.tao-modal-fade-leave-to {\n opacity: 0;\n}\n</style>\n","<script lang=\"ts\" setup>\ninterface Tab {\n key: string;\n label: string;\n disabled?: boolean;\n}\n\ninterface Props {\n tabs: Tab[];\n modelValue: string;\n}\n\nconst props = defineProps<Props>();\nconst emit = defineEmits(['update:modelValue']);\n\nfunction selectTab(key: string) {\n const tab = props.tabs.find((t) => t.key === key);\n if (tab && !tab.disabled) {\n emit('update:modelValue', key);\n }\n}\n</script>\n\n<template>\n <div class=\"tao-tabs\">\n <ul class=\"tao-tabs__list\">\n <li\n v-for=\"tab in tabs\"\n :key=\"tab.key\"\n :class=\"{ active: tab.key === modelValue, disabled: tab.disabled }\"\n @click=\"selectTab(tab.key)\"\n >\n <a v-if=\"$slots.label\">\n <slot name=\"label\" :text=\"tab.label\" :value=\"tab.key\" />\n </a>\n <a v-else>{{ tab.label }}</a>\n </li>\n </ul>\n <div class=\"tao-tabs__content\">\n <slot :active-tab=\"modelValue\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-tabs {\n width: 100%;\n max-width: 600px;\n border-radius: var(--tao-radius-panel);\n overflow: hidden;\n border: 1px solid var(--tao-color-border);\n border-top: 0;\n box-shadow: var(--tao-shadow-sm);\n}\n\n.tao-tabs__list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n background: var(--tao-color-surface-sunken);\n user-select: none;\n}\n\n.tao-tabs__list li {\n flex: 1;\n text-align: center;\n padding: var(--tao-space-3) 0;\n cursor: pointer;\n transition: background-color var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-tabs__list li a {\n color: var(--tao-color-text);\n font-size: var(--tao-font-size-md);\n font-weight: 500;\n text-decoration: none;\n display: block;\n}\n\n.tao-tabs__list li.active {\n background: var(--tao-color-accent);\n}\n\n.tao-tabs__list li.active a {\n color: var(--tao-color-on-accent);\n}\n\n.tao-tabs__list li.disabled {\n cursor: not-allowed;\n background: var(--tao-color-surface);\n}\n\n.tao-tabs__list li.disabled a {\n color: var(--tao-color-text-disabled);\n}\n\n.tao-tabs__list li:hover:not(.active, .disabled) {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-tabs__list li:hover:not(.active, .disabled) a {\n color: var(--tao-color-text-strong);\n}\n\n.tao-tabs__content {\n min-height: 200px;\n max-height: 350px;\n padding: var(--tao-space-5);\n overflow: auto;\n background: var(--tao-color-surface);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref } from 'vue';\n\ninterface Props {\n content: string;\n position?: 'top' | 'bottom' | 'left' | 'right';\n}\n\nwithDefaults(defineProps<Props>(), {\n position: 'top',\n});\n\nconst showTooltip = ref(false);\n</script>\n\n<template>\n <div\n class=\"tao-tooltip-wrapper\"\n @mouseenter=\"showTooltip = true\"\n @mouseleave=\"showTooltip = false\"\n >\n <slot />\n <Transition name=\"tao-tooltip-fade\">\n <div v-if=\"showTooltip\" class=\"tao-tooltip\" :class=\"[`tao-tooltip--${position}`]\">\n {{ content }}\n </div>\n </Transition>\n </div>\n</template>\n\n<style scoped>\n.tao-tooltip-wrapper {\n position: relative;\n display: inline-block;\n}\n\n.tao-tooltip {\n position: absolute;\n padding: var(--tao-space-2) var(--tao-space-3);\n background: var(--tao-color-surface-raised);\n color: var(--tao-color-text-strong);\n font-size: var(--tao-font-size-xs);\n border-radius: var(--tao-radius-control);\n white-space: nowrap;\n z-index: 1000;\n box-shadow: var(--tao-shadow-lg);\n /* Тултип — не интерактивный элемент: не должен перехватывать\n курсор и мешать mouseleave на wrapper'е (иначе при наведении\n на сам тултип он \"залипает\" и не скрывается). */\n pointer-events: none;\n}\n\n.tao-tooltip::after {\n content: '';\n position: absolute;\n width: 8px;\n height: 8px;\n background: var(--tao-color-surface-raised);\n transform: rotate(45deg);\n}\n\n.tao-tooltip--top {\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-bottom: var(--tao-space-2);\n}\n\n.tao-tooltip--top::after {\n top: 100%;\n left: 50%;\n margin-top: -4px;\n margin-left: -4px;\n}\n\n.tao-tooltip--bottom {\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-top: var(--tao-space-2);\n}\n\n.tao-tooltip--bottom::after {\n bottom: 100%;\n left: 50%;\n margin-bottom: -4px;\n margin-left: -4px;\n}\n\n.tao-tooltip--left {\n right: 100%;\n top: 50%;\n transform: translateY(-50%);\n margin-right: var(--tao-space-2);\n}\n\n.tao-tooltip--left::after {\n right: 0;\n top: 50%;\n margin-top: -4px;\n margin-right: -4px;\n}\n\n.tao-tooltip--right {\n left: 100%;\n top: 50%;\n transform: translateY(-50%);\n margin-left: var(--tao-space-2);\n}\n\n.tao-tooltip--right::after {\n left: 0;\n top: 50%;\n margin-top: -4px;\n margin-left: -4px;\n}\n\n.tao-tooltip-fade-enter-active,\n.tao-tooltip-fade-leave-active {\n transition: opacity var(--tao-duration-base) var(--tao-ease-base),\n transform var(--tao-duration-base) var(--tao-ease-base);\n}\n\n/* Анимация въезда/выезда сдвигается по нормали к своей стороне,\n поверх базового центрирующего transform каждой позиции — иначе\n общий translateX(-50%) конфликтует с left/right, где центрирование\n идёт по вертикали (translateY(-50%)), и блок \"убегает\" в сторону. */\n.tao-tooltip--top.tao-tooltip-fade-enter-from,\n.tao-tooltip--top.tao-tooltip-fade-leave-to {\n opacity: 0;\n transform: translateX(-50%) translateY(4px);\n}\n\n.tao-tooltip--bottom.tao-tooltip-fade-enter-from,\n.tao-tooltip--bottom.tao-tooltip-fade-leave-to {\n opacity: 0;\n transform: translateX(-50%) translateY(-4px);\n}\n\n.tao-tooltip--left.tao-tooltip-fade-enter-from,\n.tao-tooltip--left.tao-tooltip-fade-leave-to {\n opacity: 0;\n transform: translateY(-50%) translateX(4px);\n}\n\n.tao-tooltip--right.tao-tooltip-fade-enter-from,\n.tao-tooltip--right.tao-tooltip-fade-leave-to {\n opacity: 0;\n transform: translateY(-50%) translateX(-4px);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref } from 'vue';\n\ninterface Props {\n title?: string;\n defaultOpen?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: '',\n defaultOpen: false,\n});\n\nconst isOpen = ref(props.defaultOpen);\n\nfunction toggle() {\n isOpen.value = !isOpen.value;\n}\n// Анимируем реальную высоту через scrollHeight (а не угаданный\n// max-height), но overflow/padding держим на статичном внутреннем\n// блоке — так browser не пересчитывает text-layout на каждый кадр\n// перехода, и сворачивание не \"зависает\" перед последним рывком.\nfunction onBeforeEnter(el: Element) {\n (el as HTMLElement).style.height = '0';\n}\n\nfunction onEnter(el: Element) {\n const element = el as HTMLElement;\n requestAnimationFrame(() => {\n element.style.height = `${element.scrollHeight}px`;\n });\n}\n\nfunction onAfterEnter(el: Element) {\n (el as HTMLElement).style.height = 'auto';\n}\n\nfunction onLeave(el: Element) {\n const element = el as HTMLElement;\n element.style.height = `${element.scrollHeight}px`;\n requestAnimationFrame(() => {\n element.style.height = '0';\n });\n}\n</script>\n\n<template>\n <div class=\"tao-spoiler\">\n <button class=\"tao-spoiler__header\" @click=\"toggle\">\n <span class=\"tao-spoiler__icon\" :class=\"{ 'tao-spoiler__icon--open': isOpen }\">▶</span>\n <span v-if=\"title || $slots.title\" class=\"tao-spoiler__title\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n </button>\n <Transition\n name=\"tao-spoiler-slide\"\n @before-enter=\"onBeforeEnter\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\"\n >\n <div v-if=\"isOpen\" class=\"tao-spoiler__content\">\n <div class=\"tao-spoiler__content-inner\">\n <slot />\n </div>\n </div>\n </Transition>\n </div>\n</template>\n\n<style scoped>\n.tao-spoiler {\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-panel);\n overflow: hidden;\n}\n\n.tao-spoiler__header {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n width: 100%;\n min-height: 40px;\n padding: var(--tao-space-3) var(--tao-space-4);\n background: var(--tao-color-surface-sunken);\n border: none;\n cursor: pointer;\n text-align: left;\n}\n\n.tao-spoiler__header:hover {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-spoiler__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1em;\n font-size: var(--tao-font-size-xs);\n color: var(--tao-color-accent);\n transition: transform var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-spoiler__icon--open {\n transform: rotate(90deg);\n}\n\n.tao-spoiler__title {\n font-weight: 500;\n color: var(--tao-color-text);\n}\n\n.tao-spoiler__content {\n overflow: hidden;\n}\n\n.tao-spoiler-slide-enter-active,\n.tao-spoiler-slide-leave-active {\n transition: height var(--tao-duration-slow) var(--tao-ease-base);\n overflow: hidden;\n}\n\n.tao-spoiler__content-inner {\n padding: var(--tao-space-4);\n background: var(--tao-color-surface);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref } from 'vue';\n\ninterface Props {\n text: string;\n successMessage?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n successMessage: 'Скопировано!',\n});\n\nconst copied = ref(false);\nlet timeoutId: ReturnType<typeof setTimeout>;\n\nasync function copy() {\n try {\n await navigator.clipboard.writeText(props.text);\n copied.value = true;\n\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n copied.value = false;\n }, 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n}\n</script>\n\n<template>\n <div class=\"tao-copy\">\n <slot :copy=\"copy\" :copied=\"copied\">\n <button class=\"tao-copy__button\" @click=\"copy\" :class=\"{ 'tao-copy__button--copied': copied }\">\n {{ copied ? successMessage : 'Копировать' }}\n </button>\n </slot>\n </div>\n</template>\n\n<style scoped>\n.tao-copy {\n display: inline-block;\n}\n\n.tao-copy__button {\n padding: var(--tao-space-2) var(--tao-space-3);\n background: var(--tao-color-surface-sunken);\n border: 1px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-control);\n color: var(--tao-color-text);\n font-size: var(--tao-font-size-sm);\n font-family: inherit;\n cursor: pointer;\n transition: var(--tao-transition-base);\n}\n\n.tao-copy__button:hover {\n background: var(--tao-color-surface-hover);\n border-color: var(--tao-color-accent);\n color: var(--tao-color-accent);\n}\n\n.tao-copy__button--copied {\n background: var(--tao-color-accent);\n border-color: var(--tao-color-accent);\n color: var(--tao-color-on-accent);\n}\n</style>\n","<script lang=\"ts\" setup>\ninterface Props {\n size?: 'wide' | 'slim' | 'ultra-slim';\n /** \"свободно\" болтается в разметке, без авто-центровки по горизонтали */\n free?: boolean;\n}\n\nwithDefaults(defineProps<Props>(), {\n size: 'wide',\n free: false,\n});\n</script>\n\n<template>\n <div class=\"tao-container\" :class=\"[`tao-container--${size}`, { 'tao-container--center': !free }]\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-container {\n width: 100%;\n}\n\n.tao-container--center {\n margin: 0 auto;\n}\n\n.tao-container--slim {\n max-width: 500px;\n}\n\n.tao-container--ultra-slim {\n max-width: 400px;\n}\n</style>\n","<script lang=\"ts\" setup>\ninterface Props {\n tag?: string;\n justify?: 'flex-start' | 'flex-end' | 'center' | 'normal' | 'space-between' | 'space-around' | 'space-evenly';\n align?: 'stretch' | 'flex-start' | 'center' | 'flex-end' | 'baseline';\n direction?: 'row' | 'row-reverse' | 'column' | 'column-reverse';\n wrap?: 'nowrap' | 'wrap' | 'wrap-reverse';\n gap?: string;\n}\n\nwithDefaults(defineProps<Props>(), {\n tag: 'div',\n justify: 'flex-start',\n align: 'stretch',\n direction: 'row',\n wrap: 'nowrap',\n gap: '0px',\n});\n</script>\n\n<template>\n <component\n :is=\"tag\"\n :style=\"{\n display: 'flex',\n justifyContent: justify,\n alignItems: align,\n flexDirection: direction,\n flexWrap: wrap,\n gap: gap,\n }\"\n >\n <slot />\n </component>\n</template>\n","<script lang=\"ts\" setup>\ninterface Props {\n block?: boolean;\n expand?: boolean;\n vertical?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n block: false,\n expand: false,\n vertical: false,\n});\n</script>\n\n<template>\n <div\n class=\"tao-space\"\n :class=\"{ 'tao-space--vertical': props.vertical }\"\n :style=\"[props.block ? 'display: flex; flex-wrap: initial;' : '', props.expand ? 'width: 100%' : '']\"\n >\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-space {\n display: inline-flex;\n flex-wrap: wrap;\n column-gap: var(--tao-space-2);\n row-gap: var(--tao-space-2);\n}\n\n.tao-space--vertical {\n flex-direction: column;\n}\n</style>\n","<script lang=\"ts\" setup>\ninterface Props {\n name: string;\n margin?: string;\n size?: number;\n invert?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n margin: '0px',\n});\n</script>\n\n<template>\n <span class=\"tao-icon\">\n <slot name=\"prefix\" />\n <i\n class=\"tao-icon__value\"\n :class=\"[`icon-${props.name}`, { 'tao-icon__value--invert': props.invert }]\"\n :style=\"props.size ? `font-size: ${props.size}px` : ''\"\n />\n <slot name=\"postfix\" />\n </span>\n</template>\n\n<style scoped>\n/**\n * TaoIcon рендерит класс icon-<name> и полагается на внешний icon-шрифт,\n * который нужно подключить в проекте самостоятельно — библиотека Tao\n * его не поставляет. Это осознанное соглашение (см. README).\n */\n.tao-icon {\n display: inline-flex;\n}\n\n.tao-icon__value {\n margin: v-bind('props.margin');\n}\n\n.tao-icon__value--invert {\n filter: invert();\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ninterface Props {\n color?: string;\n size?: number | string;\n inline?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n color: 'var(--tao-color-accent)',\n size: 80,\n inline: false,\n});\n\nconst normalizedSize = computed(() => {\n if (typeof props.size === 'number') {\n return `${props.size}px`;\n }\n return props.size;\n});\n\nconst dotSizeNumber = computed(() => {\n const baseSize = typeof props.size === 'number' ? props.size : parseInt(props.size, 10) || 80;\n return baseSize * 0.1625;\n});\n\nconst dotSize = computed(() => `${dotSizeNumber.value}px`);\n\nconst positions = computed(() => {\n const baseSize = typeof props.size === 'number' ? props.size : parseInt(props.size, 10) || 80;\n return {\n first: `${baseSize * 0.1}px`,\n third: `${baseSize * 0.4}px`,\n fourth: `${baseSize * 0.7}px`,\n animationDistance: `${baseSize * 0.3}px`,\n };\n});\n</script>\n\n<template>\n <div class=\"tao-loader\" :class=\"{ 'tao-loader--inline': props.inline }\">\n <div\n class=\"tao-loader__ellipsis\"\n :style=\"{ width: normalizedSize, height: dotSize, marginLeft: `-${dotSizeNumber / 2}px` }\"\n >\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-loader {\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n}\n\n.tao-loader--inline {\n display: inline-block;\n width: 30px;\n}\n\n.tao-loader__ellipsis {\n display: block;\n position: relative;\n}\n\n.tao-loader__ellipsis div {\n position: absolute;\n top: 0;\n border-radius: var(--tao-radius-full);\n animation-timing-function: cubic-bezier(0, 1, 1, 0);\n}\n\n.tao-loader__ellipsis div:nth-child(1) {\n left: v-bind('positions.first');\n animation: tao-loader-grow 0.6s infinite;\n}\n\n.tao-loader__ellipsis div:nth-child(2) {\n left: v-bind('positions.first');\n animation: tao-loader-move 0.6s infinite;\n}\n\n.tao-loader__ellipsis div:nth-child(3) {\n left: v-bind('positions.third');\n animation: tao-loader-move 0.6s infinite;\n}\n\n.tao-loader__ellipsis div:nth-child(4) {\n left: v-bind('positions.fourth');\n animation: tao-loader-shrink 0.6s infinite;\n}\n\n@keyframes tao-loader-grow {\n 0% { transform: scale(0); }\n 100% { transform: scale(1); }\n}\n\n@keyframes tao-loader-shrink {\n 0% { transform: scale(1); }\n 100% { transform: scale(0); }\n}\n\n@keyframes tao-loader-move {\n 0% { transform: translate(0, 0); }\n 100% { transform: translate(v-bind('positions.animationDistance'), 0); }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, watch } from 'vue';\n\ninterface Props {\n src: string;\n alt?: string;\n pixelated?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n src: '',\n alt: '',\n pixelated: false,\n});\n\nconst emit = defineEmits(['load', 'error']);\n\nconst isLoaded = ref(false);\n\nfunction handleLoad() {\n isLoaded.value = true;\n emit('load');\n}\n\nfunction handleError() {\n isLoaded.value = false;\n emit('error');\n}\n\nwatch(() => props.src, () => {\n isLoaded.value = false;\n});\n</script>\n\n<template>\n <div class=\"tao-image\">\n <template v-if=\"src\">\n <img\n :class=\"{ 'tao-image__img--hidden': !isLoaded, 'tao-image__img--pixelated': props.pixelated }\"\n :src=\"src\"\n :alt=\"alt\"\n draggable=\"false\"\n @load=\"handleLoad\"\n @error=\"handleError\"\n />\n </template>\n <template v-else>\n <slot>\n <div class=\"tao-image__placeholder\">No image available</div>\n </slot>\n </template>\n </div>\n</template>\n\n<style scoped>\n.tao-image {\n position: relative;\n display: inline-block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n user-select: none;\n}\n\n.tao-image img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n transition: opacity var(--tao-duration-slow) var(--tao-ease-base);\n}\n\n.tao-image__img--hidden {\n opacity: 0;\n}\n\n.tao-image__img--pixelated {\n image-rendering: optimizeSpeed;\n image-rendering: -moz-crisp-edges;\n image-rendering: -o-crisp-edges;\n image-rendering: -webkit-optimize-contrast;\n image-rendering: pixelated;\n image-rendering: optimize-contrast;\n -ms-interpolation-mode: nearest-neighbor;\n}\n\n.tao-image__placeholder {\n font-size: var(--tao-font-size-sm);\n font-family: var(--tao-font-family);\n letter-spacing: 0.01rem;\n text-align: center;\n color: var(--tao-color-text-muted);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ninterface Props {\n value?: boolean;\n modelValue?: boolean;\n label?: string;\n disabled?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n value: undefined,\n modelValue: undefined,\n label: '',\n disabled: false,\n});\n\nconst emit = defineEmits(['update:modelValue', 'change']);\n\nconst isChecked = computed({\n get: () => {\n if (props.modelValue !== undefined) {\n return props.modelValue;\n }\n return props.value;\n },\n set: (value) => {\n if (props.modelValue !== undefined) {\n emit('update:modelValue', value);\n }\n emit('change', value);\n },\n});\n\nfunction onInputChange(event: Event) {\n if (props.disabled) {\n return;\n }\n const target = event.target as HTMLInputElement;\n isChecked.value = target.checked;\n}\n</script>\n\n<template>\n <label class=\"tao-checkbox\" :class=\"{ 'tao-checkbox--disabled': props.disabled }\">\n <slot name=\"pre\" :text=\"props.label\" />\n\n <input\n class=\"tao-checkbox__input\"\n type=\"checkbox\"\n :checked=\"isChecked\"\n :disabled=\"props.disabled\"\n @change=\"onInputChange\"\n />\n\n <span class=\"tao-checkbox__box\"></span>\n <span v-if=\"props.label\" class=\"tao-checkbox__label\">{{ props.label }}</span>\n <span v-else class=\"tao-checkbox__label\"><slot /></span>\n\n <slot name=\"post\" :text=\"props.label\" />\n </label>\n</template>\n\n<style scoped>\n.tao-checkbox {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n cursor: pointer;\n user-select: none;\n font-size: var(--tao-font-size-lg);\n color: var(--tao-color-text);\n}\n\n.tao-checkbox__input {\n display: none;\n}\n\n.tao-checkbox__box {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n background-color: var(--tao-color-surface-raised);\n border: 2px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-sm);\n transition: var(--tao-transition-base);\n}\n\n.tao-checkbox__box::after {\n content: '';\n display: block;\n width: 12px;\n height: 12px;\n background-color: transparent;\n border-radius: 2px;\n transform: scale(0);\n transition: var(--tao-transition-base);\n}\n\n.tao-checkbox__label {\n font-size: var(--tao-font-size-sm);\n white-space: nowrap;\n color: var(--tao-color-text-muted);\n}\n\n.tao-checkbox--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.tao-checkbox__input:checked + .tao-checkbox__box {\n border-color: var(--tao-color-accent);\n background-color: var(--tao-color-accent);\n}\n\n.tao-checkbox__input:checked + .tao-checkbox__box::after {\n background-color: var(--tao-color-on-accent);\n transform: scale(1);\n}\n\n.tao-checkbox__input:focus-visible + .tao-checkbox__box {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 1px;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ninterface Props {\n type?: 'neutral' | 'success' | 'danger' | '';\n color?: string;\n background?: string;\n borderColor?: string;\n pointer?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: '',\n pointer: false,\n});\n\nconst style = computed(() => ({\n color: props.color || '',\n background: props.background || '',\n 'border-color': props.borderColor || '',\n}));\n</script>\n\n<template>\n <div\n class=\"tao-tag\"\n :class=\"[props.pointer && 'tao-tag--pointer', props.type ? `tao-tag--${props.type}` : '']\"\n :style=\"style\"\n >\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-tag {\n box-sizing: border-box;\n display: inline-block;\n height: auto;\n margin: 0;\n padding-inline: var(--tao-space-2);\n white-space: nowrap;\n text-align: start;\n color: var(--tao-color-accent);\n background: var(--tao-color-accent-subtle);\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-sm);\n transition: var(--tao-transition-base);\n}\n\n.tao-tag--pointer {\n cursor: pointer;\n user-select: none;\n}\n\n.tao-tag--neutral {\n color: var(--tao-color-text);\n background: var(--tao-color-surface-sunken);\n border-color: var(--tao-color-border-strong);\n}\n\n.tao-tag--success {\n color: var(--tao-color-success);\n background: color-mix(in srgb, var(--tao-color-success) 12%, transparent);\n border-color: color-mix(in srgb, var(--tao-color-success) 30%, transparent);\n}\n\n.tao-tag--danger {\n color: var(--tao-color-danger);\n background: var(--tao-color-danger-subtle);\n border-color: color-mix(in srgb, var(--tao-color-danger) 30%, transparent);\n}\n</style>\n","<script lang=\"ts\" setup>\ninterface Props {\n variant?: 'gap' | 'line' | 'text';\n size?: 'small' | 'medium' | 'big';\n}\n\nwithDefaults(defineProps<Props>(), {\n variant: 'line',\n size: 'medium',\n});\n</script>\n\n<template>\n <div v-if=\"variant === 'gap'\" class=\"tao-divider-gap\" :class=\"`tao-divider-gap--${size}`\"></div>\n\n <div v-else-if=\"variant === 'text'\" class=\"tao-divider-text\">\n <span class=\"tao-divider-text__line tao-divider-text__line--left\"></span>\n <span class=\"tao-divider-text__value\"><slot /></span>\n <span class=\"tao-divider-text__line tao-divider-text__line--right\"></span>\n </div>\n\n <div v-else class=\"tao-divider-line\"></div>\n</template>\n\n<style scoped>\n/* variant=\"gap\" — пустой отступ заданной высоты, без линии */\n.tao-divider-gap {\n height: 40px;\n}\n\n.tao-divider-gap--small {\n height: 20px;\n}\n\n.tao-divider-gap--big {\n height: 60px;\n}\n\n/* variant=\"text\" — линия с текстом посередине, затухающая по краям */\n.tao-divider-text {\n display: flex;\n align-items: center;\n margin: var(--tao-space-5) 0;\n padding: 0 var(--tao-space-4);\n opacity: 0.3;\n}\n\n.tao-divider-text__line {\n flex: 1;\n height: 1px;\n border-top: 1px dashed var(--tao-color-border-strong);\n}\n\n.tao-divider-text__line--left {\n mask: linear-gradient(90deg, transparent 0%, black 30%);\n}\n\n.tao-divider-text__line--right {\n mask: linear-gradient(90deg, black 70%, transparent 100%);\n}\n\n.tao-divider-text__value {\n padding: 0 var(--tao-space-4);\n font-size: var(--tao-font-size-xs);\n font-weight: 500;\n white-space: nowrap;\n color: var(--tao-color-text-muted);\n}\n\n/* variant=\"line\" (по умолчанию) — тонкая линия с акцентным свечением по центру */\n.tao-divider-line {\n position: relative;\n width: 100%;\n height: 1px;\n margin: var(--tao-space-5) auto;\n}\n\n.tao-divider-line::before {\n content: '';\n position: absolute;\n top: 0;\n left: 5%;\n right: 5%;\n width: 90%;\n height: 1px;\n background-image: linear-gradient(to right, transparent, var(--tao-color-accent), transparent);\n}\n</style>\n","<script lang=\"ts\" setup>\ninterface Props {\n borderWidth?: number;\n speed?: number;\n /** Радиус размытия glow-эффекта позади рамки, px. Работает только при light. */\n glow?: number;\n /** Добавляет мягкое свечение вокруг рамки. По умолчанию выключено —\n * компонент остаётся именно рамкой (переливается только контур),\n * без \"света\", выходящего за её пределы. */\n light?: boolean;\n}\n\nwithDefaults(defineProps<Props>(), {\n borderWidth: 3,\n speed: 6,\n glow: 16,\n light: false,\n});\n</script>\n\n<template>\n <div\n class=\"tao-animated-border\"\n :class=\"{ 'tao-animated-border--light': light }\"\n :style=\"{\n '--tao-animated-border-width': `${borderWidth}px`,\n '--tao-animated-border-speed': `${speed}s`,\n '--tao-animated-border-glow': `${glow}px`,\n }\"\n >\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-animated-border {\n background: var(--tao-color-surface-raised);\n position: relative;\n z-index: 0;\n border-radius: var(--tao-animated-border-width);\n}\n\n/* Размытая копия рамки позади — даёт эффект свечения (glow).\n Рендерится только при light: по умолчанию компонент — просто\n переливающийся контур, без сияния, выходящего за его пределы. */\n.tao-animated-border--light::before {\n content: '';\n position: absolute;\n inset: calc(-1 * var(--tao-animated-border-width));\n background: linear-gradient(60deg, #f79533, #f37055, #ef4e7b, #a166ab, #5073b8, #1098ad, #07b39b, #6fba82);\n background-size: 300% 300%;\n border-radius: calc(2 * var(--tao-animated-border-width));\n filter: blur(var(--tao-animated-border-glow));\n opacity: 0.65;\n z-index: -2;\n animation: tao-animated-border-gradient var(--tao-animated-border-speed) ease alternate infinite;\n}\n\n/* Сама рамка: заливка на всю область, но CSS mask вырезает внутреннюю\n часть — остаётся только полоса шириной borderWidth по периметру,\n поэтому получается контур, а не закрашенный прямоугольник. */\n.tao-animated-border::after {\n content: '';\n position: absolute;\n inset: calc(-1 * var(--tao-animated-border-width));\n background: linear-gradient(60deg, #f79533, #f37055, #ef4e7b, #a166ab, #5073b8, #1098ad, #07b39b, #6fba82);\n background-size: 300% 300%;\n border-radius: calc(2 * var(--tao-animated-border-width));\n padding: var(--tao-animated-border-width);\n -webkit-mask:\n linear-gradient(#000 0 0) content-box,\n linear-gradient(#000 0 0);\n -webkit-mask-composite: xor;\n mask:\n linear-gradient(#000 0 0) content-box,\n linear-gradient(#000 0 0);\n mask-composite: exclude;\n z-index: -1;\n animation: tao-animated-border-gradient var(--tao-animated-border-speed) ease alternate infinite;\n}\n\n@keyframes tao-animated-border-gradient {\n 0% {\n background-position: 0% 50%;\n }\n 50% {\n background-position: 100% 50%;\n }\n 100% {\n background-position: 0% 50%;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, watch, nextTick, onMounted } from 'vue';\n\ninterface Props {\n placeholder?: string;\n spellcheck?: boolean;\n autocomplete?: string;\n minlength?: number;\n maxlength?: number;\n disabled?: boolean;\n noSpace?: boolean;\n dummy?: boolean;\n rows?: number;\n resize?: boolean;\n\n modelValue?: string;\n\n noBorder?: boolean;\n noBackground?: boolean;\n autoFocus?: boolean;\n borderInverse?: boolean;\n textCenter?: boolean;\n submitOnEnter?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n placeholder: '',\n spellcheck: true,\n autocomplete: '',\n minlength: 0,\n maxlength: undefined,\n disabled: false,\n noSpace: false,\n dummy: false,\n rows: 3,\n resize: true,\n modelValue: '',\n\n noBorder: false,\n noBackground: false,\n autoFocus: false,\n borderInverse: false,\n textCenter: false,\n submitOnEnter: false,\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'focus', 'blur', 'keydown']);\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null);\n\nfunction onInput(e: Event) {\n const target = e.target as HTMLTextAreaElement;\n emit('update:modelValue', target.value);\n autoResize();\n}\n\nfunction onChange(e: Event) {\n emit('change', (e.target as HTMLTextAreaElement).value);\n}\n\nfunction onFocus(e: FocusEvent) {\n emit('focus', e);\n}\n\nfunction onBlur(e: FocusEvent) {\n emit('blur', e);\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n emit('keydown', event);\n\n if (props.submitOnEnter && event.key === 'Enter' && !event.shiftKey) {\n textareaRef.value?.blur();\n event.preventDefault();\n return;\n }\n\n if (props.noSpace && event.key === ' ') {\n event.preventDefault();\n }\n}\n\n// Автоматическая подгонка высоты под содержимое\nfunction autoResize() {\n const textarea = textareaRef.value;\n if (!textarea) {\n return;\n }\n\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.min(textarea.scrollHeight, 500)}px`;\n}\n\nwatch(() => props.modelValue, () => {\n nextTick(autoResize);\n});\n\nonMounted(() => {\n if (props.autoFocus) {\n textareaRef.value?.focus();\n }\n nextTick(autoResize);\n});\n</script>\n\n<template>\n <span v-if=\"props.dummy\" class=\"tao-textarea tao-textarea--dummy\">{{ props.modelValue }}</span>\n <textarea\n v-else\n ref=\"textareaRef\"\n class=\"tao-textarea\"\n :class=\"{\n 'tao-textarea--inverse': props.borderInverse,\n 'tao-textarea--center': props.textCenter,\n 'tao-textarea--no-border': props.noBorder,\n 'tao-textarea--no-background': props.noBackground,\n 'tao-textarea--no-resize': !props.resize,\n }\"\n :placeholder=\"props.placeholder\"\n :spellcheck=\"props.spellcheck\"\n :autocomplete=\"props.autocomplete\"\n :minlength=\"props.minlength\"\n :maxlength=\"props.maxlength\"\n :disabled=\"props.disabled\"\n :rows=\"props.rows\"\n :value=\"props.modelValue\"\n draggable=\"false\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown=\"onKeydown\"\n ></textarea>\n</template>\n\n<style scoped>\n.tao-textarea {\n width: 100%;\n min-height: 31px;\n height: auto;\n padding: var(--tao-space-2);\n font-size: var(--tao-font-size-sm);\n font-family: var(--tao-font-family);\n letter-spacing: 0.01rem;\n line-height: 1.4;\n border: none;\n border-left: 4px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-sm);\n background-color: var(--tao-color-input-bg);\n color: var(--tao-color-input-text);\n outline: none;\n resize: vertical;\n transition: var(--tao-transition-base);\n}\n\n.tao-textarea::placeholder {\n color: var(--tao-color-input-placeholder);\n}\n\n.tao-textarea:focus {\n border-color: var(--tao-color-accent);\n}\n\n.tao-textarea--inverse {\n border-left: none;\n border-right: 4px solid var(--tao-color-border-strong);\n}\n\n.tao-textarea--center {\n text-align: center;\n}\n\n.tao-textarea--no-border {\n border: none;\n}\n\n.tao-textarea--no-background {\n background-color: transparent;\n}\n\n.tao-textarea--no-resize {\n resize: none;\n}\n\n.tao-textarea--dummy {\n display: block;\n min-height: 31px;\n height: auto;\n border-color: var(--tao-color-danger);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, reactive, onBeforeMount, onBeforeUnmount } from 'vue';\n\ninterface Props {\n size?: number;\n right?: string | number;\n bottom?: string | number;\n zIndex?: number;\n boundary?: number;\n hasOutline?: boolean;\n tabindex?: number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 40,\n right: 24,\n bottom: 24,\n zIndex: 1000,\n boundary: 300,\n hasOutline: true,\n tabindex: 0,\n});\n\nconst RIPPLE_DURATION = 750;\nconst fmtProp = (value: number | string, unit = 'px') => (typeof value === 'number' ? value + unit : value);\n\nlet prevPos = 0;\nlet activeBack = false;\n\nconst mainStyle = reactive({\n width: fmtProp(props.size),\n height: fmtProp(props.size),\n right: fmtProp(props.right),\n bottom: fmtProp(props.bottom),\n zIndex: props.zIndex,\n});\n\nconst rippleStyle = reactive({\n top: fmtProp(-1 * props.size),\n left: fmtProp(-1 * props.size),\n width: '200%',\n height: '200%',\n});\n\nconst isActive = ref(false);\nconst isRippleActive = ref(false);\n\nfunction getScrollValue() {\n if (typeof window.pageYOffset !== 'undefined') {\n return window.pageYOffset;\n }\n if (typeof document.compatMode !== 'undefined' && document.compatMode !== 'BackCompat') {\n return document.documentElement.scrollTop;\n }\n return document.body.scrollTop;\n}\n\nfunction goToTop() {\n const c = getScrollValue();\n if (c > 0) {\n window.requestAnimationFrame(goToTop);\n window.scrollTo(0, c - Math.max(10, c / 8));\n }\n}\n\nfunction onScroll() {\n const pY = getScrollValue();\n const tooFar = pY > props.boundary;\n const goBack = prevPos > pY;\n\n if (activeBack) {\n if (!goBack && pY - prevPos > 15) {\n activeBack = false;\n }\n } else {\n activeBack = prevPos - pY >= 20;\n if (activeBack && pY - props.boundary < 150) {\n activeBack = false;\n }\n }\n\n prevPos = pY;\n isActive.value = tooFar && activeBack;\n}\n\nfunction onClick(e: MouseEvent) {\n if (!isRippleActive.value) {\n const elTarget = e.currentTarget as HTMLElement;\n if (elTarget) {\n const rect = elTarget.getBoundingClientRect();\n const top = e.clientY - rect.top;\n const left = e.clientX - rect.left;\n rippleStyle.top = fmtProp(top - props.size);\n rippleStyle.left = fmtProp(left - props.size);\n }\n\n isRippleActive.value = true;\n setTimeout(() => {\n isRippleActive.value = false;\n }, RIPPLE_DURATION);\n }\n\n goToTop();\n}\n\nonBeforeMount(() => {\n window.addEventListener('scroll', onScroll);\n});\n\nonBeforeUnmount(() => {\n window.removeEventListener('scroll', onScroll);\n});\n</script>\n\n<template>\n <Transition name=\"tao-scroll-top-fade\">\n <button\n v-if=\"isActive\"\n :style=\"mainStyle\"\n :tabindex=\"props.tabindex\"\n class=\"tao-scroll-top\"\n :class=\"{ 'tao-scroll-top--no-outline': !props.hasOutline }\"\n aria-label=\"Scroll to top\"\n @click.prevent=\"onClick\"\n >\n <div class=\"tao-scroll-top__content\">\n <div :class=\"{ 'tao-scroll-top__ripple--active': isRippleActive }\" :style=\"rippleStyle\" class=\"tao-scroll-top__ripple\" />\n <slot>\n <svg class=\"tao-scroll-top__icon\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\n <path d=\"M12 6l-7 7 1.4 1.4L12 8.8l5.6 5.6L19 13z\" />\n </svg>\n </slot>\n </div>\n </button>\n </Transition>\n</template>\n\n<style scoped>\n.tao-scroll-top {\n overflow: hidden;\n position: fixed;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n cursor: pointer;\n color: var(--tao-color-on-accent);\n background-color: var(--tao-color-accent);\n border: none;\n border-radius: var(--tao-radius-full);\n box-shadow: var(--tao-shadow-md);\n user-select: none;\n}\n\n.tao-scroll-top:hover {\n background-color: var(--tao-color-accent-hover);\n}\n\n.tao-scroll-top--no-outline {\n outline: none;\n}\n\n.tao-scroll-top__content {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.tao-scroll-top__icon {\n position: relative;\n z-index: 1;\n}\n\n.tao-scroll-top__ripple {\n position: absolute;\n border-radius: var(--tao-radius-full);\n background-color: var(--tao-color-accent-subtle-hover);\n transform: scale(0);\n opacity: 0;\n pointer-events: none;\n}\n\n.tao-scroll-top__ripple--active {\n animation: tao-scroll-top-ripple 0.75s ease-out;\n}\n\n.tao-scroll-top-fade-enter-active,\n.tao-scroll-top-fade-leave-active {\n transition: opacity var(--tao-duration-base) var(--tao-ease-base),\n transform var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-scroll-top-fade-enter-from,\n.tao-scroll-top-fade-leave-to {\n opacity: 0;\n transform: translateY(40px);\n}\n\n@keyframes tao-scroll-top-ripple {\n from {\n opacity: 1;\n }\n to {\n transform: scale(2);\n opacity: 0;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\ninterface Props {\n min?: number;\n max?: number;\n progress?: number;\n height?: number;\n showPercentage?: boolean;\n animated?: boolean;\n}\n\nwithDefaults(defineProps<Props>(), {\n min: 200,\n max: 400,\n progress: 0,\n height: 8,\n showPercentage: false,\n animated: true,\n});\n</script>\n\n<template>\n <div class=\"tao-progress\">\n <div class=\"tao-progress__container\" :style=\"{ minWidth: `${min}px`, maxWidth: `${max}px` }\">\n <div v-if=\"$slots.left\" class=\"tao-progress__side\">\n <slot name=\"left\" />\n </div>\n\n <div class=\"tao-progress__track\" :style=\"{ height: `${height}px` }\">\n <div\n class=\"tao-progress__fill\"\n :class=\"{ 'tao-progress__fill--animated': animated }\"\n :style=\"{ width: `${progress}%` }\"\n ></div>\n </div>\n\n <div class=\"tao-progress__side\">\n <span v-if=\"showPercentage\" class=\"tao-progress__percentage\">{{ progress }}%</span>\n <slot name=\"right\" />\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-progress {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n}\n\n.tao-progress__container {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--tao-space-3);\n width: 100%;\n}\n\n.tao-progress__track {\n flex: 1;\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-sm);\n background-color: var(--tao-color-surface-sunken);\n overflow: hidden;\n position: relative;\n}\n\n.tao-progress__fill {\n height: 100%;\n border-radius: var(--tao-radius-sm);\n transition: width var(--tao-duration-slow) var(--tao-ease-base);\n background: var(--tao-color-accent);\n}\n\n.tao-progress__side {\n min-width: 40px;\n font-family: 'Monaco', 'Consolas', monospace;\n font-size: var(--tao-font-size-xs);\n font-weight: bold;\n text-align: center;\n color: var(--tao-color-text);\n}\n\n.tao-progress__percentage {\n position: absolute;\n top: -12px;\n left: 50%;\n transform: translateX(-50%);\n color: var(--tao-color-text-muted);\n}\n\n.tao-progress__fill--animated {\n background: linear-gradient(\n 90deg,\n var(--tao-color-accent) 0%,\n var(--tao-color-accent-hover) 50%,\n var(--tao-color-accent) 100%\n );\n background-size: 200% 100%;\n animation: tao-progress-shimmer 2s infinite;\n}\n\n@keyframes tao-progress-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, onBeforeUnmount } from 'vue';\n\ninterface Props {\n min?: number;\n max?: number;\n step?: number;\n showValue?: boolean;\n placeholder?: string;\n modelValue: number | string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n min: 0,\n max: 100,\n step: 1,\n showValue: false,\n placeholder: '',\n});\n\nconst emit = defineEmits(['update:modelValue']);\n\nfunction packModelValue(value: number): string | number {\n return typeof props.modelValue === 'string' ? `${value}` : value;\n}\n\nfunction unpackModelValue(): number {\n return typeof props.modelValue === 'string' ? parseFloat(props.modelValue) : props.modelValue;\n}\n\nconst trackRef = ref<HTMLElement | null>(null);\nconst isDragging = ref(false);\n\nconst shadowInputRef = ref<HTMLInputElement | null>(null);\nconst shadowModel = ref('0');\nconst showShadowModel = ref(false);\n\nconst progressPercent = computed(() => {\n const range = props.max - props.min;\n return ((unpackModelValue() - props.min) / range) * 100;\n});\n\nfunction clampValue(v: number) {\n return Math.min(Math.max(v, props.min), props.max);\n}\n\nfunction calculateValue(event: MouseEvent | TouchEvent): number {\n if (!trackRef.value) {\n return props.min;\n }\n\n const rect = trackRef.value.getBoundingClientRect();\n const clientX = 'touches' in event ? event.touches[0]!.clientX : event.clientX;\n const x = Math.min(Math.max(clientX - rect.left, 0), rect.width);\n const ratio = x / rect.width;\n\n const v = Math.round(props.min + ratio * (props.max - props.min));\n return clampValue(Math.round((v - props.min) / props.step) * props.step + props.min);\n}\n\nfunction handleMove(event: MouseEvent | TouchEvent) {\n emit('update:modelValue', packModelValue(calculateValue(event)));\n}\n\nfunction onMouseUp(event: MouseEvent | TouchEvent) {\n const evBtn = 'touches' in event ? undefined : event.button;\n if ((typeof evBtn !== 'undefined' && evBtn !== 0) || showShadowModel.value) {\n return;\n }\n isDragging.value = false;\n}\n\nfunction onMouseDown(event: MouseEvent | TouchEvent) {\n const evBtn = 'touches' in event ? undefined : event.button;\n if ((typeof evBtn !== 'undefined' && evBtn !== 0) || showShadowModel.value) {\n return;\n }\n\n isDragging.value = true;\n handleMove(event);\n event.preventDefault();\n}\n\nfunction onMouseMove(event: MouseEvent | TouchEvent) {\n if (!isDragging.value) {\n return;\n }\n handleMove(event);\n}\n\nfunction onBlurShadowModel() {\n if (shadowModel.value) {\n const newValue = packModelValue(clampValue(parseFloat(shadowModel.value) || 0));\n shadowModel.value = `${newValue}`;\n emit('update:modelValue', newValue);\n }\n showShadowModel.value = false;\n}\n\nfunction onShadowKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter') {\n shadowInputRef.value?.blur();\n }\n}\n\nfunction onContextMenu() {\n if (props.showValue) {\n shadowModel.value = `${props.modelValue}`;\n showShadowModel.value = true;\n // ждём рендера инпута перед фокусом\n requestAnimationFrame(() => shadowInputRef.value?.focus());\n }\n}\n\nonMounted(() => {\n window.addEventListener('mouseleave', onMouseUp);\n window.addEventListener('mouseup', onMouseUp);\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('touchend', onMouseUp);\n window.addEventListener('touchmove', onMouseMove);\n});\n\nonBeforeUnmount(() => {\n window.removeEventListener('mouseleave', onMouseUp);\n window.removeEventListener('mouseup', onMouseUp);\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('touchend', onMouseUp);\n window.removeEventListener('touchmove', onMouseMove);\n});\n</script>\n\n<template>\n <div\n ref=\"trackRef\"\n class=\"tao-slider\"\n :class=\"{ 'tao-slider--show-value': showValue }\"\n @contextmenu.prevent=\"onContextMenu\"\n @mousedown=\"onMouseDown\"\n @touchstart=\"onMouseDown\"\n >\n <div class=\"tao-slider__track\"></div>\n <div class=\"tao-slider__fill\" :style=\"{ width: `${progressPercent}%` }\"></div>\n <div class=\"tao-slider__thumb\" :style=\"{ left: `${progressPercent}%` }\"></div>\n\n <input\n v-if=\"showShadowModel\"\n ref=\"shadowInputRef\"\n v-model=\"shadowModel\"\n type=\"number\"\n inputmode=\"numeric\"\n :placeholder=\"placeholder\"\n class=\"tao-slider__shadow-input\"\n @blur=\"onBlurShadowModel\"\n @keydown=\"onShadowKeydown\"\n @mousedown.stop\n />\n <div v-else-if=\"showValue\" class=\"tao-slider__value\">\n <slot name=\"pre-value\" />{{ modelValue }}<slot name=\"post-value\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-slider {\n position: relative;\n width: 100%;\n height: 14px;\n cursor: pointer;\n user-select: none;\n}\n\n.tao-slider--show-value {\n height: 20px;\n}\n\n.tao-slider__track {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border-radius: var(--tao-radius-sm);\n background-color: var(--tao-color-surface-sunken);\n}\n\n.tao-slider__fill {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background-color: var(--tao-color-accent);\n border-radius: var(--tao-radius-sm);\n}\n\n.tao-slider__thumb {\n position: absolute;\n top: 50%;\n width: 20px;\n height: 20px;\n background-color: var(--tao-color-accent);\n border: 2px solid var(--tao-color-surface-sunken);\n border-radius: var(--tao-radius-full);\n transform: translate(-50%, -50%);\n cursor: grab;\n}\n\n.tao-slider__thumb:active {\n cursor: grabbing;\n}\n\n.tao-slider__value,\n.tao-slider__shadow-input {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n font-size: var(--tao-font-size-sm);\n font-weight: 900;\n letter-spacing: 0.05em;\n}\n\n.tao-slider__value {\n color: var(--tao-color-text-strong);\n text-shadow: -1px -1px 0 var(--tao-color-bg), 1px -1px 0 var(--tao-color-bg),\n -1px 1px 0 var(--tao-color-bg), 1px 1px 0 var(--tao-color-bg);\n}\n\n.tao-slider__shadow-input {\n text-align: center;\n border: none;\n background: transparent;\n color: var(--tao-color-text-strong);\n font-family: inherit;\n outline: none;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref } from 'vue';\n\ninterface Props {\n /** Текущий список файлов — компонент сам не хранит состояние\n * количества файлов, оно всегда отражает то, что передал родитель.\n * Это и даёт возможность подтверждения: родитель решает, когда\n * именно менять modelValue (сразу или после ответа в модалке). */\n modelValue?: File[];\n size?: 'small' | 'medium' | 'large';\n accept?: string;\n multiple?: boolean;\n showClear?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: () => [],\n size: 'medium',\n accept: '*',\n multiple: false,\n showClear: false,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [files: File[]];\n files: [files: File[]];\n /** Запрос на очистку — компонент НЕ очищает себя сам. Родитель решает:\n * очистить сразу (emit → v-model = []) или сперва показать модалку\n * подтверждения и очистить только после ответа пользователя. */\n 'clear-request': [];\n}>();\n\nconst isDragging = ref(false);\nconst fileInput = ref<HTMLInputElement | null>(null);\n\nfunction handleDragOver(event: DragEvent) {\n event.preventDefault();\n isDragging.value = true;\n}\n\nfunction handleDragLeave() {\n isDragging.value = false;\n}\n\nfunction handleDrop(event: DragEvent) {\n event.preventDefault();\n isDragging.value = false;\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n processFiles(files);\n }\n}\n\nfunction handleFileSelect(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n processFiles(input.files);\n }\n}\n\nfunction requestClear() {\n emit('clear-request');\n}\n\nfunction triggerFileInput() {\n fileInput.value?.click();\n}\n\nfunction processFiles(fileList: FileList) {\n const files = Array.from(fileList);\n const result = !props.multiple && files.length > 1 ? [files[0]!] : files;\n\n emit('update:modelValue', result);\n emit('files', result);\n\n // сбрасываем input, чтобы повторный выбор того же файла тоже сработал\n const el = fileInput.value;\n if (el) {\n el.type = 'text';\n el.type = 'file';\n }\n}\n</script>\n\n<template>\n <div class=\"tao-file-drop\">\n <button\n v-if=\"showClear && modelValue.length\"\n type=\"button\"\n class=\"tao-file-drop__clear\"\n @click=\"requestClear\"\n >\n ✕\n </button>\n\n <div\n class=\"tao-file-drop__zone\"\n :class=\"[`tao-file-drop__zone--${size}`, { 'tao-file-drop__zone--dragging': isDragging }]\"\n @dragover=\"handleDragOver\"\n @dragleave=\"handleDragLeave\"\n @drop=\"handleDrop\"\n @click=\"triggerFileInput\"\n >\n <slot>Drag &amp; drop your file(s) here or click to select</slot>\n\n <input\n ref=\"fileInput\"\n type=\"file\"\n hidden\n :accept=\"accept\"\n :multiple=\"multiple\"\n @change=\"handleFileSelect\"\n />\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-file-drop {\n display: flex;\n gap: var(--tao-space-3);\n user-select: none;\n}\n\n.tao-file-drop__clear {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 55px;\n text-align: center;\n border: 2px dashed var(--tao-color-danger);\n border-radius: var(--tao-radius-panel);\n color: var(--tao-color-danger);\n background-color: var(--tao-color-danger-subtle);\n cursor: pointer;\n font-family: inherit;\n transition: var(--tao-transition-base);\n}\n\n.tao-file-drop__clear:hover {\n background-color: color-mix(in srgb, var(--tao-color-danger) 22%, transparent);\n}\n\n.tao-file-drop__zone {\n flex-grow: 1;\n font-size: var(--tao-font-size-sm);\n font-family: var(--tao-font-family);\n letter-spacing: 0.01rem;\n text-align: center;\n color: var(--tao-color-text-muted);\n border: 2px dashed var(--tao-color-border-strong);\n border-radius: var(--tao-radius-panel);\n cursor: pointer;\n transition: var(--tao-transition-base);\n}\n\n.tao-file-drop__zone:hover {\n background-color: var(--tao-color-accent-subtle);\n border-color: var(--tao-color-accent);\n}\n\n.tao-file-drop__zone--dragging {\n border-color: var(--tao-color-text-strong);\n background-color: var(--tao-color-surface-sunken);\n}\n\n.tao-file-drop__zone--small {\n padding: var(--tao-space-5) var(--tao-space-4);\n}\n\n.tao-file-drop__zone--medium {\n padding: var(--tao-space-8) var(--tao-space-5);\n}\n\n.tao-file-drop__zone--large {\n padding: var(--tao-space-10) var(--tao-space-6);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, reactive, onMounted, onUnmounted } from 'vue';\n\ninterface Action {\n id: string;\n name: string;\n ico?: string;\n}\n\ninterface Props {\n actions?: Action[];\n}\n\nwithDefaults(defineProps<Props>(), {\n actions: () => [],\n});\n\nconst emit = defineEmits(['selected']);\n\nlet animationFrameId = 0;\n\nconst menuRef = ref<HTMLElement | null>(null);\nconst listRef = ref<HTMLElement | null>(null);\nconst isOpen = ref(false);\n\nconst listPosition = reactive({ top: '0', left: '0' });\n\nfunction updatePosition() {\n const elMenu = menuRef.value;\n const elList = listRef.value;\n\n if (elMenu && elList && isOpen.value) {\n const rect = elMenu.getBoundingClientRect();\n const rectList = elList.getBoundingClientRect();\n\n let px = rect.right;\n let py = rect.top;\n\n if (px + rectList.width > window.innerWidth) {\n px = rect.left - rectList.width;\n }\n if (py + rectList.height > window.innerHeight) {\n py = rect.bottom - rectList.height;\n }\n\n listPosition.top = `${py + window.scrollY}px`;\n listPosition.left = `${px}px`;\n }\n}\n\nfunction toggleMenu() {\n isOpen.value = !isOpen.value;\n\n if (isOpen.value) {\n animationFrameId = requestAnimationFrame(function render() {\n updatePosition();\n animationFrameId = requestAnimationFrame(render);\n });\n } else {\n cancelAnimationFrame(animationFrameId);\n }\n}\n\nfunction closeMenu(event: MouseEvent) {\n if (menuRef.value && !menuRef.value.contains(event.target as Node)) {\n isOpen.value = false;\n }\n}\n\nfunction emitAction(id: string) {\n isOpen.value = false;\n emit('selected', id);\n}\n\nfunction onWinScroll() {\n isOpen.value = false;\n}\n\nonMounted(() => {\n document.addEventListener('click', closeMenu);\n window.addEventListener('scroll', onWinScroll);\n});\n\nonUnmounted(() => {\n document.removeEventListener('click', closeMenu);\n window.removeEventListener('scroll', onWinScroll);\n cancelAnimationFrame(animationFrameId);\n});\n</script>\n\n<template>\n <div ref=\"menuRef\" class=\"tao-dropdown-menu\">\n <div class=\"tao-dropdown-menu__button\" @click=\"toggleMenu\">\n <slot v-if=\"$slots.button\" name=\"button\" />\n <span v-else>⋮</span>\n </div>\n\n <Teleport to=\"body\">\n <div\n v-if=\"isOpen\"\n ref=\"listRef\"\n class=\"tao-dropdown-menu__list\"\n :style=\"listPosition\"\n >\n <div\n v-for=\"action in actions\"\n :key=\"action.id\"\n class=\"tao-dropdown-menu__item\"\n @click=\"emitAction(action.id)\"\n >\n <slot v-if=\"$slots.item\" name=\"item\" :id=\"action.id\" :ico=\"action.ico\" :text=\"action.name\" />\n <span v-else>{{ action.name }}</span>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style>\n/* .tao-dropdown-menu__list телепортируется в body, поэтому не может\n быть scoped — стилизуем его глобально, но с уникальным неймспейсом. */\n.tao-dropdown-menu__list {\n z-index: 999999;\n position: absolute;\n top: 100%;\n min-width: 120px;\n display: flex;\n flex-direction: column;\n font-size: var(--tao-font-size-md);\n color: var(--tao-color-text);\n background-color: var(--tao-color-surface-raised);\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-control);\n box-shadow: var(--tao-shadow-md);\n}\n\n.tao-dropdown-menu__list .tao-dropdown-menu__item {\n padding: var(--tao-space-2) var(--tao-space-4);\n border: none;\n border-radius: var(--tao-radius-sm);\n background: none;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition: var(--tao-transition-base);\n}\n\n.tao-dropdown-menu__list .tao-dropdown-menu__item:not(:last-child) {\n border-bottom: 1px solid var(--tao-color-border);\n}\n\n.tao-dropdown-menu__list .tao-dropdown-menu__item:hover {\n color: var(--tao-color-accent);\n background-color: var(--tao-color-surface-hover);\n}\n</style>\n\n<style scoped>\n.tao-dropdown-menu {\n position: relative;\n display: inline-block;\n}\n\n.tao-dropdown-menu__button {\n padding: var(--tao-space-2);\n color: var(--tao-color-text);\n border: none;\n border-radius: var(--tao-radius-control);\n background: none;\n cursor: pointer;\n user-select: none;\n transition: var(--tao-transition-base);\n}\n\n.tao-dropdown-menu__button:hover {\n background: var(--tao-color-surface-hover);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, watch } from 'vue';\n\ninterface Props {\n length: number;\n hidden?: boolean;\n placeholder?: string;\n modelValue: string;\n /** Разрешать вводить только цифры 0-9, всё остальное отбрасывается на лету */\n numbersOnly?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n hidden: false,\n placeholder: '',\n numbersOnly: false,\n});\n\nconst emit = defineEmits(['update:modelValue', 'change', 'active', 'blur']);\n\nlet lastPinCode = NaN;\n\nconst numbers = ref<string[]>([]);\nconst inputRefs = ref<(HTMLInputElement | null)[]>([]);\nconst activeNumber = ref(-1);\n\nfunction emitChange() {\n const s = numbers.value.map((e) => (e ? e : '0')).join('');\n const curPinCode = parseFloat(s);\n\n if (lastPinCode !== curPinCode) {\n lastPinCode = curPinCode;\n emit('change', curPinCode);\n }\n\n emit('update:modelValue', s);\n}\n\nfunction emitBlur() {\n activeNumber.value = -1;\n emit('blur');\n}\n\nfunction init() {\n numbers.value = [...Array(props.length)].map(() => '');\n inputRefs.value = [];\n activeNumber.value = -1;\n}\n\nfunction mutation(v: string, index: number) {\n numbers.value = [...numbers.value];\n\n if (v.length > 1) {\n v = v[v.length - 1] ?? '';\n }\n\n if (props.numbersOnly && v && !/^[0-9]$/.test(v)) {\n // символ не цифра — не принимаем, оставляем поле как было\n numbers.value[index] = numbers.value[index] ?? '';\n return;\n }\n\n numbers.value[index] = v;\n\n const getNextIdx = () => {\n if (numbers.value.length >= index + 1) {\n return numbers.value.findIndex((e) => e === '');\n }\n return index + 1;\n };\n\n const nextIndex = getNextIdx();\n\n if (nextIndex !== -1 && !numbers.value[nextIndex]) {\n const el = inputRefs.value[nextIndex];\n if (el) {\n el.focus();\n } else {\n inputRefs.value[index]?.blur();\n emitBlur();\n }\n } else {\n inputRefs.value[index]?.blur();\n emitBlur();\n }\n\n emitChange();\n}\n\nfunction onFocus(index: number) {\n numbers.value = [...numbers.value];\n numbers.value[index] = '';\n\n activeNumber.value = index;\n\n emitChange();\n emit('active', inputRefs.value[index], index);\n}\n\nfunction onChange(e: Event, index: number) {\n const v = (e.target as HTMLInputElement).value;\n mutation(v, index);\n}\n\nfunction onKeydown(event: KeyboardEvent, index: number) {\n if (event.key !== 'Backspace') {\n return;\n }\n\n // Если в текущем поле уже пусто — Backspace не с чего стирать здесь,\n // поэтому переходим на предыдущее поле и стираем его тоже. Так\n // backspace ведёт себя как в большинстве нативных pin-code вводов\n // (SMS-коды и т.п.): удерживая клавишу, можно стереть весь код.\n if (!numbers.value[index] && index > 0) {\n event.preventDefault();\n\n numbers.value = [...numbers.value];\n numbers.value[index - 1] = '';\n\n const prevEl = inputRefs.value[index - 1];\n prevEl?.focus();\n activeNumber.value = index - 1;\n\n emitChange();\n }\n}\n\nwatch(() => props.modelValue, (v: string) => {\n if (!v.length) {\n init();\n emitChange();\n }\n});\n\ninit();\n</script>\n\n<template>\n <div class=\"tao-pin-code\">\n <input\n v-for=\"(num, index) of numbers\"\n :key=\"index\"\n :ref=\"(el) => (inputRefs[index] = el as HTMLInputElement)\"\n class=\"tao-pin-code__value\"\n :class=\"{ 'tao-pin-code__value--active': activeNumber === index }\"\n :value=\"num\"\n :placeholder=\"placeholder\"\n :type=\"hidden ? 'password' : 'text'\"\n :inputmode=\"numbersOnly ? 'numeric' : 'text'\"\n :pattern=\"numbersOnly ? '[0-9]' : undefined\"\n maxlength=\"1\"\n @input=\"onChange($event, index)\"\n @keydown=\"onKeydown($event, index)\"\n @focus=\"onFocus(index)\"\n />\n </div>\n</template>\n\n<style scoped>\n.tao-pin-code {\n display: inline-flex;\n user-select: none;\n}\n\n.tao-pin-code__value {\n width: 50px;\n height: 56px;\n margin: 2px;\n border: 3px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-md);\n font-size: 21px;\n font-weight: 500;\n font-family: inherit;\n text-align: center;\n letter-spacing: 0;\n color: var(--tao-color-accent);\n background: var(--tao-color-input-bg);\n transition: var(--tao-transition-base);\n cursor: text;\n outline: none;\n}\n\n.tao-pin-code__value--active {\n border-color: var(--tao-color-accent);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue';\n\ninterface Props {\n to?: string | Record<string, unknown>;\n asNewTab?: boolean;\n private?: boolean;\n exactPath?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n to: undefined,\n asNewTab: false,\n private: false,\n exactPath: false,\n});\n\n// В Nuxt-проекте <NuxtLink> зарегистрирован глобально и resolveComponent\n// его находит — тогда используем клиентский роутинг. Вне Nuxt (или если\n// компонент не найден) резолвится строкой — тогда рендерим обычный <a>.\n// Так TaoLink работает и в Nuxt, и в чистом Vue без доп. настройки.\nconst linkComponent = computed(() => {\n const resolved = resolveComponent('NuxtLink');\n return typeof resolved === 'string' ? 'a' : resolved;\n});\n\nconst linkProps = computed(() => {\n const target = props.asNewTab ? '_blank' : undefined;\n const rel = (props.private && 'noopener noreferrer') || (props.asNewTab && 'noopener') || undefined;\n\n if (linkComponent.value === 'a') {\n return {\n href: typeof props.to === 'string' ? props.to : undefined,\n target,\n rel,\n };\n }\n\n return {\n to: props.to,\n target,\n rel,\n exactPath: props.exactPath,\n };\n});\n</script>\n\n<template>\n <component :is=\"linkComponent\" v-bind=\"linkProps\" draggable=\"false\">\n <slot />\n </component>\n</template>\n","import type { Plugin } from 'vue';\nimport TaoButton from './components/TaoButton.vue';\nimport TaoBlock from './components/TaoBlock.vue';\nimport TaoInput from './components/TaoInput.vue';\nimport TaoCard from './components/TaoCard.vue';\nimport TaoModal from './components/TaoModal.vue';\nimport TaoTabs from './components/TaoTabs.vue';\nimport TaoTooltip from './components/TaoTooltip.vue';\nimport TaoSpoiler from './components/TaoSpoiler.vue';\nimport TaoCopy from './components/TaoCopy.vue';\nimport TaoContainer from './components/TaoContainer.vue';\nimport TaoFlex from './components/TaoFlex.vue';\nimport TaoSpace from './components/TaoSpace.vue';\nimport TaoIcon from './components/TaoIcon.vue';\nimport TaoLoader from './components/TaoLoader.vue';\nimport TaoImage from './components/TaoImage.vue';\nimport TaoCheckbox from './components/TaoCheckbox.vue';\nimport TaoTag from './components/TaoTag.vue';\nimport TaoDivider from './components/TaoDivider.vue';\nimport TaoAnimatedBorder from './components/TaoAnimatedBorder.vue';\nimport TaoTextarea from './components/TaoTextarea.vue';\nimport TaoScrollTop from './components/TaoScrollTop.vue';\nimport TaoProgress from './components/TaoProgress.vue';\nimport TaoSlider from './components/TaoSlider.vue';\nimport TaoFileDrop from './components/TaoFileDrop.vue';\nimport TaoDropdownMenu from './components/TaoDropdownMenu.vue';\nimport TaoPinCode from './components/TaoPinCode.vue';\nimport TaoLink from './components/TaoLink.vue';\n\n// Импорт нужен только для того, чтобы Vite подхватил CSS в сборку\n// styles.css. Сам JS-бандл эти стили в рантайме НЕ применяет —\n// подключи '@tao/ui/styles.css' самостоятельно (см. README), чтобы\n// иметь явный контроль над темизацией.\nimport './styles/index.css';\n\nconst components = [\n TaoButton,\n TaoBlock,\n TaoInput,\n TaoCard,\n TaoModal,\n TaoTabs,\n TaoTooltip,\n TaoSpoiler,\n TaoCopy,\n TaoContainer,\n TaoFlex,\n TaoSpace,\n TaoIcon,\n TaoLoader,\n TaoImage,\n TaoCheckbox,\n TaoTag,\n TaoDivider,\n TaoAnimatedBorder,\n TaoTextarea,\n TaoScrollTop,\n TaoProgress,\n TaoSlider,\n TaoFileDrop,\n TaoDropdownMenu,\n TaoPinCode,\n TaoLink,\n];\n\nexport const TaoUI: Plugin = {\n install(app) {\n components.forEach(component => {\n app.component(component.name!, component);\n });\n },\n};\n\nexport {\n TaoButton,\n TaoBlock,\n TaoInput,\n TaoCard,\n TaoModal,\n TaoTabs,\n TaoTooltip,\n TaoSpoiler,\n TaoCopy,\n TaoContainer,\n TaoFlex,\n TaoSpace,\n TaoIcon,\n TaoLoader,\n TaoImage,\n TaoCheckbox,\n TaoTag,\n TaoDivider,\n TaoAnimatedBorder,\n TaoTextarea,\n TaoScrollTop,\n TaoProgress,\n TaoSlider,\n TaoFileDrop,\n TaoDropdownMenu,\n TaoPinCode,\n TaoLink,\n};\n\nexport default TaoUI;\n"],"names":["_createElementBlock","_openBlock","_hoisted_2","_hoisted_3","_toDisplayString","_createElementVNode","_hoisted_4","_renderSlot","computed","_normalizeClass","_normalizeStyle","_hoisted_1","$slots","_hoisted_5","_hoisted_6","watch","onBeforeUnmount","_createBlock","_Teleport","_createVNode","_Transition","_withModifiers","_Fragment","_renderList","ref","_resolveDynamicComponent","nextTick","onMounted","reactive","onBeforeMount","onUnmounted","resolveComponent","_mergeProps","TaoFlex","TaoLink"],"mappings":"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"}