@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.
- package/README.md +252 -0
- package/dist/index.cjs +1745 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1635 -0
- package/dist/index.mjs +1742 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles.css +1476 -0
- package/package.json +57 -0
- package/src/styles/base.css +59 -0
- package/src/styles/index.css +9 -0
- package/src/styles/primitives.css +73 -0
- package/src/styles/semantic.css +72 -0
- package/src/styles/themes/light.css +51 -0
- package/src/styles/variables.css +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","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\">×</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 & 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","_normalizeClass","_normalizeStyle","_hoisted_1","$slots","_hoisted_5","_hoisted_6","_createBlock","_Teleport","_createVNode","_Transition","_withModifiers","_Fragment","_renderList","_resolveDynamicComponent","_mergeProps","TaoFlex","TaoLink"],"mappings":"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"}
|