@1337exp/taoui 1.0.2 → 1.1.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 +217 -4
- package/dist/index.cjs +4132 -248
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1729 -269
- package/dist/index.mjs +4134 -250
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +2088 -164
- package/package.json +1 -1
- package/src/styles/base.css +12 -0
- package/src/styles/primitives.css +8 -0
- package/src/styles/semantic.css +7 -0
- package/src/styles/themes/light.css +7 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/components/TaoButton.vue","../src/components/TaoBlock.vue","../src/formField.ts","../src/components/TaoInput.vue","../src/components/TaoInputGroup.vue","../src/components/TaoInputNumber.vue","../src/components/TaoQuantity.vue","../src/components/TaoCard.vue","../src/focusTrap.ts","../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/components/TaoFormField.vue","../src/components/TaoSelect.vue","../src/date.ts","../src/components/TaoDate.vue","../src/components/TaoSwitch.vue","../src/radio.ts","../src/components/TaoRadio.vue","../src/components/TaoRadioGroup.vue","../src/components/TaoAlert.vue","../src/components/TaoTable.vue","../src/pagination.ts","../src/components/TaoPagination.vue","../src/components/TaoEmpty.vue","../src/components/TaoSkeleton.vue","../src/components/TaoDrawer.vue","../src/components/TaoAvatar.vue","../src/components/TaoBreadcrumb.vue","../src/components/TaoCounter.vue","../src/components/TaoCarousel.vue","../src/components/TaoStages.vue","../src/toast/store.ts","../src/components/TaoToastItem.vue","../src/components/TaoToastViewport.vue","../src/confirm/store.ts","../src/components/TaoConfirmHost.vue","../src/toast/index.ts","../src/confirm/index.ts","../src/index.ts"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineOptions({ name: 'TaoButton' });\n\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:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\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","import type { ComputedRef, InjectionKey } from 'vue';\n\nexport interface TaoFormFieldContext {\n id: string;\n invalid: ComputedRef<boolean>;\n describedBy: ComputedRef<string | undefined>;\n}\n\nexport const formFieldKey: InjectionKey<TaoFormFieldContext> = Symbol('taoFormField');\n","<script lang=\"ts\" setup>\nimport { computed, inject, ref, useId } from 'vue';\nimport { formFieldKey } from '../formField';\n\ndefineOptions({ name: 'TaoInput' });\n\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 id?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n type: 'text',\n placeholder: '',\n disabled: false,\n error: false,\n errorMessage: '',\n label: '',\n});\n\nconst field = inject(formFieldKey, null);\nconst localId = useId();\nconst controlId = computed(() => props.id || field?.id || localId);\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\nconst focused = ref(false);\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 focused.value = false;\n emit('blur', event);\n}\n\nfunction handleFocus(event: FocusEvent) {\n focused.value = true;\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\" :for=\"controlId\">{{ label }}</label>\n <div\n class=\"tao-input-shell\"\n :class=\"{\n 'tao-input-shell--focused': focused,\n 'tao-input-shell--invalid': invalid,\n 'tao-input-shell--disabled': disabled,\n 'tao-input-shell--prefix': $slots.prefix,\n 'tao-input-shell--suffix': $slots.suffix,\n }\"\n >\n <span v-if=\"$slots.prefix\" class=\"tao-input__affix tao-input__affix--prefix\">\n <slot name=\"prefix\" />\n </span>\n <input\n :id=\"controlId\"\n class=\"tao-input\"\n :class=\"{ 'tao-input--error': invalid }\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n @input=\"handleInput\"\n @blur=\"handleBlur\"\n @focus=\"handleFocus\"\n />\n <span v-if=\"$slots.suffix\" class=\"tao-input__affix tao-input__affix--suffix\">\n <slot name=\"suffix\" />\n </span>\n </div>\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-shell {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\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 transition: var(--tao-transition-base);\n}\n\n.tao-input {\n flex: 1 1 auto;\n min-width: 0;\n width: 100%;\n margin: 0;\n padding: var(--tao-space-2) var(--tao-space-3);\n border: none;\n border-radius: inherit;\n background: transparent;\n color: inherit;\n font-size: var(--tao-font-size-md);\n font-family: inherit;\n line-height: 1.25;\n}\n\n.tao-input-shell--prefix .tao-input {\n padding-left: 0;\n}\n\n.tao-input-shell--suffix .tao-input {\n padding-right: 0;\n}\n\n.tao-input::placeholder {\n color: var(--tao-color-input-placeholder);\n}\n\n.tao-input:focus {\n outline: none;\n}\n\n.tao-input-shell--focused {\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-shell--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:disabled {\n cursor: not-allowed;\n}\n\n.tao-input-shell--invalid {\n border-color: var(--tao-color-danger);\n}\n\n.tao-input-shell--invalid.tao-input-shell--focused {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\n}\n\n.tao-input__affix {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n gap: var(--tao-space-1);\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-sm);\n font-weight: 600;\n line-height: 1;\n white-space: nowrap;\n}\n\n.tao-input__affix--prefix {\n padding-left: var(--tao-space-3);\n padding-right: var(--tao-space-2);\n}\n\n.tao-input__affix--suffix {\n padding-right: var(--tao-space-3);\n padding-left: var(--tao-space-2);\n}\n\n.tao-input__affix :deep(svg) {\n display: block;\n width: 16px;\n height: 16px;\n}\n\n.tao-input__affix :deep(button) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n padding: 0;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: 1;\n cursor: pointer;\n}\n\n.tao-input__affix :deep(button:hover) {\n color: var(--tao-color-text-strong);\n}\n\n.tao-input__affix :deep(button:focus-visible) {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\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 { ref } from 'vue';\n\ndefineOptions({ name: 'TaoInputGroup' });\n\nconst focused = ref(false);\n\nfunction onFocusIn() {\n focused.value = true;\n}\n\nfunction onFocusOut(event: FocusEvent) {\n const root = event.currentTarget as HTMLElement;\n const next = event.relatedTarget as Node | null;\n if (!next || !root.contains(next)) {\n focused.value = false;\n }\n}\n</script>\n\n<template>\n <div\n class=\"tao-input-group\"\n :class=\"{ 'tao-input-group--focused': focused }\"\n role=\"group\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <div v-if=\"$slots.before\" class=\"tao-input-group__addon tao-input-group__addon--before\">\n <slot name=\"before\" />\n </div>\n <div class=\"tao-input-group__field\">\n <slot />\n </div>\n <div v-if=\"$slots.after\" class=\"tao-input-group__addon tao-input-group__addon--after\">\n <slot name=\"after\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-input-group {\n display: flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n border-radius: var(--tao-radius-control);\n}\n\n.tao-input-group--focused {\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\n}\n\n.tao-input-group:has(.tao-input-shell--invalid) {\n box-shadow: none;\n}\n\n.tao-input-group--focused:has(.tao-input-shell--invalid) {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\n}\n\n.tao-input-group__field {\n display: flex;\n flex: 1 1 auto;\n align-items: stretch;\n align-self: stretch;\n min-width: 0;\n}\n\n.tao-input-group__field :deep(.tao-input-wrapper) {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n min-width: 0;\n gap: 0;\n}\n\n.tao-input-group__field :deep(.tao-input-shell) {\n flex: 1 1 auto;\n align-self: stretch;\n border-radius: 0;\n box-shadow: none;\n}\n\n.tao-input-group__field :deep(.tao-input) {\n align-self: stretch;\n line-height: 1.25;\n}\n\n.tao-input-group__addon {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n align-self: stretch;\n padding: 0 var(--tao-space-3);\n border: 1px solid var(--tao-color-border-strong);\n background: var(--tao-color-surface-sunken);\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-sm);\n font-weight: 600;\n line-height: 1;\n white-space: nowrap;\n transition: var(--tao-transition-base);\n}\n\n.tao-input-group__addon--before {\n border-right: 0;\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\n}\n\n.tao-input-group__addon--after {\n border-left: 0;\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\n}\n\n.tao-input-group__field:not(:first-child) :deep(.tao-input-shell) {\n border-left: 0;\n}\n\n.tao-input-group__field:not(:last-child) :deep(.tao-input-shell) {\n border-right: 0;\n}\n\n.tao-input-group__field:first-child :deep(.tao-input-shell) {\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\n}\n\n.tao-input-group__field:last-child :deep(.tao-input-shell) {\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\n}\n\n.tao-input-group__field:only-child :deep(.tao-input-shell) {\n border-radius: var(--tao-radius-control);\n}\n\n.tao-input-group--focused .tao-input-group__addon,\n.tao-input-group--focused :deep(.tao-input-shell) {\n border-color: var(--tao-color-accent);\n}\n\n.tao-input-group:has(.tao-input-shell--invalid) .tao-input-group__addon,\n.tao-input-group:has(.tao-input-shell--invalid) :deep(.tao-input-shell) {\n border-color: var(--tao-color-danger);\n}\n\n.tao-input-group__addon:has(.tao-button) {\n padding: 0;\n background: transparent;\n}\n\n.tao-input-group__addon :deep(.tao-button) {\n align-self: stretch;\n height: auto;\n border: none;\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\n}\n\n.tao-input-group__addon--before :deep(.tao-button) {\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\n}\n\n.tao-input-group__addon :deep(.tao-button:focus-visible) {\n outline-offset: -2px;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\n\ndefineOptions({ name: 'TaoInputNumber' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: number | null;\n min?: number;\n max?: number;\n step?: number;\n precision?: number;\n disabled?: boolean;\n placeholder?: string;\n controls?: boolean;\n }>(),\n {\n modelValue: null,\n step: 1,\n disabled: false,\n placeholder: '',\n controls: true,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number | null];\n blur: [event: FocusEvent];\n focus: [event: FocusEvent];\n}>();\n\nconst field = inject(formFieldKey, null);\nconst localId = useId();\nconst controlId = computed(() => field?.id ?? localId);\nconst invalid = computed(() => Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\n\nconst focused = ref(false);\nconst draft = ref(toDraft(props.modelValue));\n\nwatch(\n () => props.modelValue,\n (value) => {\n if (!focused.value) {\n draft.value = toDraft(value);\n }\n },\n);\n\nfunction decimalsOf(value: number) {\n const text = String(value);\n const dot = text.indexOf('.');\n return dot === -1 ? 0 : text.length - dot - 1;\n}\n\nfunction roundTo(value: number) {\n const digits = props.precision ?? decimalsOf(props.step);\n if (digits <= 0) {\n return Math.round(value);\n }\n const factor = 10 ** digits;\n return Math.round(value * factor) / factor;\n}\n\nfunction clamp(value: number) {\n let next = roundTo(value);\n if (props.min !== undefined && next < props.min) {\n next = props.min;\n }\n if (props.max !== undefined && next > props.max) {\n next = props.max;\n }\n return roundTo(next);\n}\n\nfunction toDraft(value: number | null | undefined) {\n if (value === null || value === undefined || Number.isNaN(value)) {\n return '';\n }\n return String(value);\n}\n\nfunction parseDraft(text: string): number | null | 'incomplete' {\n const trimmed = text.trim().replace(',', '.');\n if (trimmed === '') {\n return null;\n }\n if (trimmed === '-' || trimmed === '.' || trimmed === '-.') {\n return 'incomplete';\n }\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed)) {\n return 'incomplete';\n }\n return parsed;\n}\n\nfunction isAllowed(text: string) {\n return /^-?\\d*([.,]\\d*)?$/.test(text);\n}\n\nfunction commit(value: number | null) {\n const next = value === null ? null : clamp(value);\n emit('update:modelValue', next);\n if (!focused.value) {\n draft.value = toDraft(next);\n }\n}\n\nfunction bump(direction: 1 | -1) {\n if (props.disabled) {\n return;\n }\n const base = props.modelValue ?? 0;\n commit(base + direction * props.step);\n}\n\nfunction onInput(event: Event) {\n const text = (event.target as HTMLInputElement).value;\n if (!isAllowed(text)) {\n return;\n }\n draft.value = text;\n const parsed = parseDraft(text);\n if (parsed !== 'incomplete') {\n emit('update:modelValue', parsed === null ? null : clamp(parsed));\n }\n}\n\nfunction onFocus(event: FocusEvent) {\n focused.value = true;\n emit('focus', event);\n}\n\nfunction onBlur(event: FocusEvent) {\n focused.value = false;\n const parsed = parseDraft(draft.value);\n commit(parsed === 'incomplete' ? null : parsed);\n emit('blur', event);\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n bump(1);\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n bump(-1);\n }\n}\n\nconst atMin = computed(() => props.min !== undefined && (props.modelValue ?? 0) <= props.min);\nconst atMax = computed(() => props.max !== undefined && (props.modelValue ?? 0) >= props.max);\n</script>\n\n<template>\n <div class=\"tao-input-number\" :class=\"{ 'tao-input-number--invalid': invalid, 'tao-input-number--controls': controls }\">\n <input\n :id=\"controlId\"\n class=\"tao-input-number__input\"\n type=\"text\"\n inputmode=\"decimal\"\n role=\"spinbutton\"\n :value=\"draft\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :aria-valuenow=\"modelValue ?? undefined\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n autocomplete=\"off\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown=\"onKeydown\"\n />\n <div v-if=\"controls\" class=\"tao-input-number__steppers\">\n <button\n type=\"button\"\n class=\"tao-input-number__step\"\n aria-label=\"Увеличить\"\n tabindex=\"-1\"\n :disabled=\"disabled || atMax\"\n @click=\"bump(1)\"\n >\n +\n </button>\n <button\n type=\"button\"\n class=\"tao-input-number__step\"\n aria-label=\"Уменьшить\"\n tabindex=\"-1\"\n :disabled=\"disabled || atMin\"\n @click=\"bump(-1)\"\n >\n −\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-input-number {\n position: relative;\n display: flex;\n width: 100%;\n}\n\n.tao-input-number__input {\n width: 100%;\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 font-variant-numeric: tabular-nums;\n transition: var(--tao-transition-base);\n}\n\n.tao-input-number--controls .tao-input-number__input {\n padding-right: 34px;\n}\n\n.tao-input-number__input::placeholder {\n color: var(--tao-color-input-placeholder);\n}\n\n.tao-input-number__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-number__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-number--invalid .tao-input-number__input {\n border-color: var(--tao-color-danger);\n}\n\n.tao-input-number--invalid .tao-input-number__input:focus {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\n}\n\n.tao-input-number__steppers {\n position: absolute;\n top: 1px;\n right: 1px;\n bottom: 1px;\n display: flex;\n flex-direction: column;\n width: 28px;\n border-left: 1px solid var(--tao-color-border);\n}\n\n.tao-input-number__step {\n flex: 1;\n margin: 0;\n padding: 0;\n border: none;\n background: transparent;\n color: var(--tao-color-text-muted);\n font: inherit;\n line-height: 1;\n cursor: pointer;\n}\n\n.tao-input-number__step + .tao-input-number__step {\n border-top: 1px solid var(--tao-color-border);\n}\n\n.tao-input-number__step:hover:not(:disabled) {\n color: var(--tao-color-text-strong);\n background: var(--tao-color-surface-hover);\n}\n\n.tao-input-number__step:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: -2px;\n}\n\n.tao-input-number__step:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\nimport type { TaoQuantityChangeSource } from '../quantity';\n\ndefineOptions({ name: 'TaoQuantity' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: number;\n min?: number;\n max?: number;\n disabled?: boolean;\n /** Minus stays enabled at min and still emits `dec` — parent can remove the line. */\n allowRemove?: boolean;\n /** Clamp to max on blur and when the incoming value is above stock. */\n forceMaxLimit?: boolean;\n }>(),\n {\n modelValue: 1,\n min: 1,\n disabled: false,\n allowRemove: true,\n forceMaxLimit: true,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number];\n change: [value: number, source: TaoQuantityChangeSource];\n dec: [value: number];\n inc: [value: number];\n blur: [value: number];\n focus: [event: FocusEvent];\n}>();\n\nconst field = inject(formFieldKey, null);\nconst localId = useId();\nconst controlId = computed(() => field?.id ?? localId);\nconst invalid = computed(() => Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\n\nconst focused = ref(false);\nconst draft = ref(String(props.modelValue));\n\nconst ceiling = computed(() => (props.max === undefined ? Number.POSITIVE_INFINITY : props.max));\n\nfunction toInt(value: unknown) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return Math.trunc(value);\n }\n const parsed = parseInt(String(value ?? ''), 10);\n return Number.isFinite(parsed) ? parsed : props.min;\n}\n\nfunction clampQty(value: number) {\n let next = Math.max(value, props.min);\n if (props.forceMaxLimit && props.max !== undefined) {\n next = Math.min(next, props.max);\n }\n return next;\n}\n\nfunction commit(value: number, source: TaoQuantityChangeSource) {\n const next = clampQty(value);\n if (next !== props.modelValue) {\n emit('update:modelValue', next);\n emit('change', next, source);\n }\n draft.value = String(next);\n return next;\n}\n\nwatch(\n () => [props.modelValue, props.min, props.max, props.forceMaxLimit] as const,\n () => {\n const next = clampQty(toInt(props.modelValue));\n if (next !== props.modelValue) {\n emit('update:modelValue', next);\n emit('change', next, 'input');\n }\n if (!focused.value) {\n draft.value = String(next);\n }\n },\n { immediate: true },\n);\n\nfunction onDec() {\n if (props.disabled) {\n return;\n }\n let next = props.modelValue;\n if (props.modelValue > props.min) {\n next = props.modelValue > ceiling.value ? ceiling.value : clampQty(props.modelValue - 1);\n commit(next, 'dec');\n }\n emit('dec', next);\n}\n\nfunction onInc() {\n if (props.disabled) {\n return;\n }\n let next = props.modelValue;\n if (props.modelValue < ceiling.value) {\n next = clampQty(props.modelValue + 1);\n commit(next, 'inc');\n }\n emit('inc', next);\n}\n\nfunction onInput(event: Event) {\n const text = (event.target as HTMLInputElement).value;\n if (!/^\\d*$/.test(text)) {\n return;\n }\n draft.value = text;\n if (text === '') {\n return;\n }\n commit(toInt(text), 'input');\n}\n\nfunction onFocus(event: FocusEvent) {\n focused.value = true;\n emit('focus', event);\n}\n\nfunction onBlur() {\n focused.value = false;\n const next = commit(draft.value === '' ? props.min : toInt(draft.value), 'input');\n draft.value = String(next);\n emit('blur', next);\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n onInc();\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n onDec();\n }\n}\n\nconst atMin = computed(() => props.modelValue <= props.min);\nconst atMax = computed(() => props.modelValue >= ceiling.value);\nconst minusDisabled = computed(() => props.disabled || (!props.allowRemove && atMin.value));\nconst plusDisabled = computed(() => props.disabled || atMax.value);\nconst minusLabel = computed(() => (atMin.value && props.allowRemove ? 'Убрать' : 'Уменьшить'));\n</script>\n\n<template>\n <div\n class=\"tao-quantity\"\n :class=\"{\n 'tao-quantity--invalid': invalid,\n 'tao-quantity--focused': focused,\n 'tao-quantity--disabled': disabled,\n }\"\n >\n <button\n type=\"button\"\n class=\"tao-quantity__btn tao-quantity__btn--dec\"\n :aria-label=\"minusLabel\"\n :disabled=\"minusDisabled\"\n @click=\"onDec\"\n >\n −\n </button>\n <input\n :id=\"controlId\"\n class=\"tao-quantity__input\"\n type=\"text\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n autocomplete=\"off\"\n role=\"spinbutton\"\n :value=\"draft\"\n :disabled=\"disabled\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :aria-valuenow=\"modelValue\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown=\"onKeydown\"\n />\n <button\n type=\"button\"\n class=\"tao-quantity__btn tao-quantity__btn--inc\"\n aria-label=\"Увеличить\"\n :disabled=\"plusDisabled\"\n @click=\"onInc\"\n >\n +\n </button>\n </div>\n</template>\n\n<style scoped>\n.tao-quantity {\n display: inline-flex;\n width: 100%;\n min-width: 148px;\n isolation: isolate;\n}\n\n.tao-quantity__btn,\n.tao-quantity__input {\n height: 36px;\n margin: 0;\n border: 1px solid var(--tao-color-border-strong);\n background: var(--tao-color-input-bg);\n color: var(--tao-color-input-text);\n font-family: inherit;\n transition: var(--tao-transition-base);\n}\n\n.tao-quantity__btn {\n flex: 0 0 50px;\n width: 50px;\n padding: 0;\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-md);\n font-weight: 800;\n line-height: 1;\n cursor: pointer;\n}\n\n.tao-quantity__btn--dec {\n border-right: 0;\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\n}\n\n.tao-quantity__btn--inc {\n border-left: 0;\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\n}\n\n.tao-quantity__btn:hover:not(:disabled) {\n z-index: 1;\n color: var(--tao-color-accent);\n border-color: var(--tao-color-accent);\n}\n\n.tao-quantity__btn:focus-visible {\n z-index: 2;\n outline: 2px solid var(--tao-color-accent);\n outline-offset: -2px;\n}\n\n.tao-quantity__btn:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.tao-quantity__input {\n z-index: 0;\n flex: 1 1 auto;\n min-width: 30px;\n padding: 0 var(--tao-space-2);\n border-right: 0;\n border-left: 0;\n text-align: center;\n font-size: var(--tao-font-size-md);\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n}\n\n.tao-quantity__input:focus {\n outline: none;\n}\n\n.tao-quantity--focused .tao-quantity__btn,\n.tao-quantity--focused .tao-quantity__input {\n border-color: var(--tao-color-accent);\n}\n\n.tao-quantity--focused {\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\n border-radius: var(--tao-radius-control);\n}\n\n.tao-quantity__input:disabled {\n color: var(--tao-color-input-disabled-text);\n background: var(--tao-color-input-disabled-bg);\n}\n\n.tao-quantity--disabled .tao-quantity__btn {\n background: var(--tao-color-input-disabled-bg);\n}\n\n.tao-quantity--invalid .tao-quantity__btn,\n.tao-quantity--invalid .tao-quantity__input {\n border-color: var(--tao-color-danger);\n}\n\n.tao-quantity--invalid.tao-quantity--focused {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\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","const FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nexport function getFocusable(root: HTMLElement) {\n return [...root.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(\n (el) => el.getClientRects().length > 0 || el === document.activeElement,\n );\n}\n\nexport function trapTab(event: KeyboardEvent, root: HTMLElement) {\n if (event.key !== 'Tab') {\n return;\n }\n\n const items = getFocusable(root);\n if (!items.length) {\n event.preventDefault();\n root.focus();\n return;\n }\n\n const first = items[0];\n const last = items[items.length - 1];\n\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n return;\n }\n\n if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n}\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\nimport { getFocusable, trapTab } from '../focusTrap';\n\ndefineOptions({ name: 'TaoModal' });\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\nconst panelRef = ref<HTMLElement | null>(null);\nconst titleId = useId();\nlet previousOverflow = '';\nlet previousFocus: HTMLElement | null = null;\nlet scrollLocked = false;\n\nfunction close() {\n if (!props.closable) {\n return;\n }\n emit('update:modelValue', false);\n emit('close');\n}\n\nfunction lockBodyScroll() {\n if (scrollLocked) {\n return;\n }\n previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n scrollLocked = true;\n}\n\nfunction unlockBodyScroll() {\n if (!scrollLocked) {\n return;\n }\n document.body.style.overflow = previousOverflow;\n previousOverflow = '';\n scrollLocked = false;\n}\n\nfunction restoreFocus() {\n previousFocus?.focus?.();\n previousFocus = null;\n}\n\nasync function focusPanel() {\n await nextTick();\n const panel = panelRef.value;\n if (!panel) {\n return;\n }\n const first = getFocusable(panel)[0];\n (first ?? panel).focus();\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault();\n close();\n return;\n }\n\n if (panelRef.value) {\n trapTab(event, panelRef.value);\n }\n}\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (isOpen) {\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n lockBodyScroll();\n void focusPanel();\n return;\n }\n unlockBodyScroll();\n restoreFocus();\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n unlockBodyScroll();\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=\"close\" @keydown=\"onKeydown\">\n <div\n ref=\"panelRef\"\n class=\"tao-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"title ? titleId : undefined\"\n tabindex=\"-1\"\n >\n <div v-if=\"title || $slots.header\" class=\"tao-modal__header\">\n <slot name=\"header\">\n <h2 :id=\"titleId\" class=\"tao-modal__title\">{{ title }}</h2>\n </slot>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"tao-modal__close\"\n aria-label=\"Закрыть\"\n @click=\"close\"\n >\n ×\n </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:focus {\n outline: none;\n}\n\n.tao-modal:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\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__close:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n border-radius: var(--tao-radius-control);\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>\nimport { computed, nextTick, useId } from 'vue';\n\ndefineOptions({ name: 'TaoTabs' });\n\ninterface Tab {\n key: string;\n label: string;\n disabled?: boolean;\n}\n\nconst props = defineProps<{\n tabs: Tab[];\n modelValue: string;\n}>();\n\nconst emit = defineEmits(['update:modelValue']);\nconst uid = useId();\n\nconst enabledTabs = computed(() => props.tabs.filter((tab) => !tab.disabled));\n\nfunction tabId(key: string) {\n return `${uid}-${key}`;\n}\n\nfunction panelId(key: string) {\n return `${uid}-panel-${key}`;\n}\n\nfunction selectTab(key: string, focus = false) {\n const tab = props.tabs.find((item) => item.key === key);\n if (tab && !tab.disabled) {\n emit('update:modelValue', key);\n if (focus) {\n void nextTick(() => document.getElementById(tabId(key))?.focus());\n }\n }\n}\n\nfunction move(delta: number) {\n const enabled = enabledTabs.value;\n if (!enabled.length) {\n return;\n }\n const current = enabled.findIndex((tab) => tab.key === props.modelValue);\n const next = enabled[(current + delta + enabled.length) % enabled.length];\n selectTab(next.key, true);\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n event.preventDefault();\n move(1);\n return;\n }\n if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n event.preventDefault();\n move(-1);\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n selectTab(enabledTabs.value[0]?.key ?? props.modelValue, true);\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n const last = enabledTabs.value[enabledTabs.value.length - 1];\n selectTab(last?.key ?? props.modelValue, true);\n }\n}\n</script>\n\n<template>\n <div class=\"tao-tabs\">\n <div class=\"tao-tabs__list\" role=\"tablist\" @keydown=\"onKeydown\">\n <button\n v-for=\"tab in tabs\"\n :key=\"tab.key\"\n type=\"button\"\n class=\"tao-tabs__tab\"\n role=\"tab\"\n :id=\"tabId(tab.key)\"\n :aria-selected=\"tab.key === modelValue\"\n :aria-controls=\"panelId(tab.key)\"\n :tabindex=\"tab.key === modelValue ? 0 : -1\"\n :disabled=\"tab.disabled\"\n @click=\"selectTab(tab.key)\"\n >\n <slot v-if=\"$slots.label\" name=\"label\" :text=\"tab.label\" :value=\"tab.key\" />\n <template v-else>{{ tab.label }}</template>\n </button>\n </div>\n <div\n class=\"tao-tabs__content\"\n role=\"tabpanel\"\n :id=\"panelId(modelValue)\"\n :aria-labelledby=\"tabId(modelValue)\"\n >\n <slot :active-tab=\"modelValue\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-tabs {\n width: 100%;\n}\n\n.tao-tabs__list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--tao-space-1);\n margin: 0;\n padding: 0;\n border-bottom: 1px solid var(--tao-color-border);\n}\n\n.tao-tabs__tab {\n margin-bottom: -1px;\n padding: var(--tao-space-2) var(--tao-space-4);\n border: none;\n border-bottom: 2px solid transparent;\n background: transparent;\n color: var(--tao-color-text-muted);\n font: inherit;\n font-size: var(--tao-font-size-md);\n font-weight: 500;\n cursor: pointer;\n}\n\n.tao-tabs__tab:hover:not(:disabled) {\n color: var(--tao-color-text-strong);\n}\n\n.tao-tabs__tab[aria-selected='true'] {\n color: var(--tao-color-accent);\n border-bottom-color: var(--tao-color-accent);\n}\n\n.tao-tabs__tab:disabled {\n cursor: not-allowed;\n color: var(--tao-color-text-disabled);\n}\n\n.tao-tabs__tab:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n border-radius: var(--tao-radius-control) var(--tao-radius-control) 0 0;\n}\n\n.tao-tabs__content {\n padding: var(--tao-space-4) 0 0;\n color: var(--tao-color-text);\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 @focusin=\"showTooltip = true\"\n @focusout=\"showTooltip = false\"\n >\n <slot />\n <Transition name=\"tao-tooltip-fade\">\n <div v-if=\"showTooltip\" class=\"tao-tooltip\" :class=\"[`tao-tooltip--${position}`]\" role=\"tooltip\">\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--wide {\n max-width: 1120px;\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 tao-sr-only\"\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__box {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n pointer-events: none;\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' | 'warning' | 'info' | '';\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\n.tao-tag--warning {\n color: var(--tao-color-warning);\n background: var(--tao-color-warning-subtle);\n border-color: color-mix(in srgb, var(--tao-color-warning) 30%, transparent);\n}\n\n.tao-tag--info {\n color: var(--tao-color-info);\n background: var(--tao-color-info-subtle);\n border-color: color-mix(in srgb, var(--tao-color-info) 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>Перетащите файл сюда или нажмите, чтобы выбрать</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 { nextTick, onBeforeUnmount, onMounted, reactive, ref } from 'vue';\n\ndefineOptions({ name: 'TaoDropdownMenu' });\n\ninterface Action {\n id: string;\n name: string;\n ico?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n actions?: Action[];\n }>(),\n {\n actions: () => [],\n },\n);\n\nconst emit = defineEmits(['selected']);\n\nconst menuRef = ref<HTMLElement | null>(null);\nconst listRef = ref<HTMLElement | null>(null);\nconst triggerRef = ref<HTMLButtonElement | null>(null);\nconst isOpen = ref(false);\nconst activeIndex = ref(0);\nconst listPosition = reactive({ top: '0', left: '0' });\n\nfunction updatePosition() {\n const trigger = triggerRef.value;\n const list = listRef.value;\n if (!trigger || !list || !isOpen.value) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const listWidth = list.offsetWidth;\n const listHeight = list.offsetHeight;\n let left = rect.right - listWidth;\n let top = rect.bottom + 4;\n\n if (left < 8) {\n left = rect.left;\n }\n if (left + listWidth > window.innerWidth - 8) {\n left = Math.max(8, window.innerWidth - listWidth - 8);\n }\n if (top + listHeight > window.innerHeight - 8 && rect.top > listHeight) {\n top = rect.top - listHeight - 4;\n }\n\n listPosition.top = `${top}px`;\n listPosition.left = `${left}px`;\n}\n\nasync function setOpen(next: boolean) {\n isOpen.value = next;\n if (!next) {\n return;\n }\n activeIndex.value = 0;\n await nextTick();\n updatePosition();\n listRef.value?.focus();\n}\n\nfunction toggleMenu() {\n void setOpen(!isOpen.value);\n}\n\nfunction closeMenu() {\n if (!isOpen.value) {\n return;\n }\n isOpen.value = false;\n triggerRef.value?.focus();\n}\n\nfunction emitAction(id: string) {\n isOpen.value = false;\n emit('selected', id);\n triggerRef.value?.focus();\n}\n\nfunction onDocumentPointer(event: PointerEvent) {\n const target = event.target as Node;\n if (menuRef.value?.contains(target) || listRef.value?.contains(target)) {\n return;\n }\n isOpen.value = false;\n}\n\nfunction onWinScroll() {\n if (isOpen.value) {\n updatePosition();\n }\n}\n\nfunction onListKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault();\n closeMenu();\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (!props.actions.length) {\n return;\n }\n activeIndex.value = (activeIndex.value + 1) % props.actions.length;\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (!props.actions.length) {\n return;\n }\n activeIndex.value = (activeIndex.value - 1 + props.actions.length) % props.actions.length;\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const action = props.actions[activeIndex.value];\n if (action) {\n emitAction(action.id);\n }\n }\n}\n\nonMounted(() => {\n document.addEventListener('pointerdown', onDocumentPointer);\n window.addEventListener('scroll', onWinScroll, true);\n window.addEventListener('resize', updatePosition);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointer);\n window.removeEventListener('scroll', onWinScroll, true);\n window.removeEventListener('resize', updatePosition);\n});\n</script>\n\n<template>\n <div ref=\"menuRef\" class=\"tao-dropdown-menu\">\n <button\n ref=\"triggerRef\"\n type=\"button\"\n class=\"tao-dropdown-menu__button\"\n aria-haspopup=\"menu\"\n :aria-expanded=\"isOpen\"\n @click=\"toggleMenu\"\n >\n <slot v-if=\"$slots.button\" name=\"button\" />\n <span v-else aria-label=\"Меню\">⋮</span>\n </button>\n\n <Teleport to=\"body\">\n <div\n v-if=\"isOpen\"\n ref=\"listRef\"\n class=\"tao-dropdown-menu__list\"\n role=\"menu\"\n tabindex=\"-1\"\n :style=\"listPosition\"\n @keydown=\"onListKeydown\"\n >\n <button\n v-for=\"(action, index) in actions\"\n :key=\"action.id\"\n type=\"button\"\n class=\"tao-dropdown-menu__item\"\n :class=\"{ 'tao-dropdown-menu__item--active': index === activeIndex }\"\n role=\"menuitem\"\n @click=\"emitAction(action.id)\"\n @mouseenter=\"activeIndex = index\"\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 </button>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-dropdown-menu__list {\n z-index: 1050;\n position: fixed;\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:focus {\n outline: none;\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: 0;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\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.tao-dropdown-menu__list .tao-dropdown-menu__item--active {\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 font: inherit;\n line-height: 1;\n transition: var(--tao-transition-base);\n}\n\n.tao-dropdown-menu__button:hover {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-dropdown-menu__button:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\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","<script lang=\"ts\" setup>\nimport { computed, provide, useId } from 'vue';\nimport { formFieldKey } from '../formField';\n\ndefineOptions({ name: 'TaoFormField' });\n\nconst props = defineProps<{\n label?: string;\n hint?: string;\n error?: string;\n}>();\n\nconst id = useId();\nconst hintId = `${id}-hint`;\nconst errorId = `${id}-error`;\nconst invalid = computed(() => Boolean(props.error));\nconst describedBy = computed(() => {\n if (props.error) {\n return errorId;\n }\n\n if (props.hint) {\n return hintId;\n }\n\n return undefined;\n});\n\nprovide(formFieldKey, {\n id,\n invalid,\n describedBy,\n});\n</script>\n\n<template>\n <div class=\"tao-form-field\" :class=\"{ 'tao-form-field--invalid': invalid }\">\n <label v-if=\"label\" class=\"tao-form-field__label\" :for=\"id\">{{ label }}</label>\n <slot />\n <p v-if=\"error\" :id=\"errorId\" class=\"tao-form-field__error\">{{ error }}</p>\n <p v-else-if=\"hint\" :id=\"hintId\" class=\"tao-form-field__hint\">{{ hint }}</p>\n </div>\n</template>\n\n<style scoped>\n.tao-form-field {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-1);\n width: 100%;\n}\n\n.tao-form-field__label {\n font-size: var(--tao-font-size-sm);\n color: var(--tao-color-text);\n font-weight: 500;\n}\n\n.tao-form-field__hint {\n margin: 0;\n font-size: var(--tao-font-size-xs);\n color: var(--tao-color-text-muted);\n}\n\n.tao-form-field__error {\n margin: 0;\n font-size: var(--tao-font-size-xs);\n color: var(--tao-color-danger);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\nimport type { TaoSelectOption } from '../select';\n\ndefineOptions({ name: 'TaoSelect' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string | number | null;\n options?: TaoSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n }>(),\n {\n modelValue: null,\n options: () => [],\n placeholder: 'Выберите',\n disabled: false,\n error: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number];\n change: [value: string | number];\n}>();\n\nconst field = inject(formFieldKey, null);\nconst localId = useId();\nconst listId = `${localId}-list`;\nconst controlId = computed(() => field?.id ?? localId);\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\n\nconst open = ref(false);\nconst activeIndex = ref(-1);\nconst triggerRef = ref<HTMLButtonElement | null>(null);\nconst listRef = ref<HTMLElement | null>(null);\nconst listStyle = ref({ top: '0px', left: '0px', width: '0px' });\n\nconst selected = computed(() => props.options.find((option) => option.value === props.modelValue) ?? null);\nconst enabledIndexes = computed(() =>\n props.options.map((option, index) => (option.disabled ? -1 : index)).filter((index) => index >= 0),\n);\n\nfunction updatePosition() {\n const trigger = triggerRef.value;\n const list = listRef.value;\n\n if (!trigger || !list) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const listHeight = list.offsetHeight;\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom - gap;\n const openUp = spaceBelow < listHeight && rect.top > spaceBelow;\n\n listStyle.value = {\n top: `${openUp ? rect.top - listHeight - gap : rect.bottom + gap}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nasync function setOpen(next: boolean) {\n if (props.disabled) {\n return;\n }\n\n open.value = next;\n\n if (!next) {\n return;\n }\n\n const selectedIndex = props.options.findIndex((option) => option.value === props.modelValue);\n activeIndex.value = selectedIndex >= 0 ? selectedIndex : (enabledIndexes.value[0] ?? -1);\n await nextTick();\n updatePosition();\n listRef.value?.focus();\n scrollActiveIntoView();\n}\n\nfunction toggle() {\n void setOpen(!open.value);\n}\n\nfunction close() {\n open.value = false;\n}\n\nfunction selectOption(option: TaoSelectOption) {\n if (option.disabled) {\n return;\n }\n\n emit('update:modelValue', option.value);\n emit('change', option.value);\n close();\n triggerRef.value?.focus();\n}\n\nfunction moveActive(delta: number) {\n const enabled = enabledIndexes.value;\n\n if (!enabled.length) {\n return;\n }\n\n const currentPos = enabled.indexOf(activeIndex.value);\n const nextPos = currentPos < 0 ? 0 : (currentPos + delta + enabled.length) % enabled.length;\n activeIndex.value = enabled[nextPos];\n scrollActiveIntoView();\n}\n\nfunction scrollActiveIntoView() {\n const list = listRef.value;\n\n if (!list || activeIndex.value < 0) {\n return;\n }\n\n const option = list.querySelector<HTMLElement>(`[data-tao-select-index=\"${activeIndex.value}\"]`);\n option?.scrollIntoView({ block: 'nearest' });\n}\n\nfunction onTriggerKeydown(event: KeyboardEvent) {\n if (props.disabled) {\n return;\n }\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void setOpen(true);\n }\n}\n\nfunction onListKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault();\n close();\n triggerRef.value?.focus();\n return;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveActive(1);\n return;\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveActive(-1);\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n activeIndex.value = enabledIndexes.value[0] ?? -1;\n scrollActiveIntoView();\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n activeIndex.value = enabledIndexes.value[enabledIndexes.value.length - 1] ?? -1;\n scrollActiveIntoView();\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const option = props.options[activeIndex.value];\n\n if (option) {\n selectOption(option);\n }\n }\n}\n\nfunction onDocumentPointer(event: PointerEvent) {\n const target = event.target as Node;\n\n if (triggerRef.value?.contains(target) || listRef.value?.contains(target)) {\n return;\n }\n\n close();\n}\n\nfunction onViewportChange() {\n if (open.value) {\n updatePosition();\n }\n}\n\nwatch(open, (isOpen) => {\n if (isOpen) {\n document.addEventListener('pointerdown', onDocumentPointer);\n window.addEventListener('resize', onViewportChange);\n window.addEventListener('scroll', onViewportChange, true);\n return;\n }\n\n document.removeEventListener('pointerdown', onDocumentPointer);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointer);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n</script>\n\n<template>\n <div class=\"tao-select\" :class=\"{ 'tao-select--open': open, 'tao-select--invalid': invalid }\">\n <button\n :id=\"controlId\"\n ref=\"triggerRef\"\n type=\"button\"\n class=\"tao-select__trigger\"\n :class=\"{ 'tao-select__trigger--placeholder': !selected }\"\n role=\"combobox\"\n :aria-expanded=\"open\"\n aria-haspopup=\"listbox\"\n :aria-controls=\"listId\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :disabled=\"disabled\"\n @click=\"toggle\"\n @keydown=\"onTriggerKeydown\"\n >\n <span class=\"tao-select__value\">{{ selected?.label ?? placeholder }}</span>\n <span class=\"tao-select__chevron\" aria-hidden=\"true\"></span>\n </button>\n\n <Teleport to=\"body\">\n <ul\n v-if=\"open\"\n :id=\"listId\"\n ref=\"listRef\"\n class=\"tao-select__list\"\n role=\"listbox\"\n tabindex=\"-1\"\n :aria-activedescendant=\"activeIndex >= 0 ? `${listId}-opt-${activeIndex}` : undefined\"\n :style=\"listStyle\"\n @keydown=\"onListKeydown\"\n >\n <li\n v-for=\"(option, index) in options\"\n :id=\"`${listId}-opt-${index}`\"\n :key=\"String(option.value)\"\n class=\"tao-select__option\"\n :class=\"{\n 'tao-select__option--active': index === activeIndex,\n 'tao-select__option--selected': option.value === modelValue,\n 'tao-select__option--disabled': option.disabled,\n }\"\n role=\"option\"\n :aria-selected=\"option.value === modelValue\"\n :aria-disabled=\"option.disabled || undefined\"\n :data-tao-select-index=\"index\"\n @mousedown.prevent\n @click=\"selectOption(option)\"\n @mouseenter=\"!option.disabled && (activeIndex = index)\"\n >\n {{ option.label }}\n </li>\n </ul>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-select__list {\n z-index: 1050;\n position: fixed;\n margin: 0;\n padding: var(--tao-space-1);\n max-height: 240px;\n overflow: auto;\n list-style: none;\n background: var(--tao-color-surface-raised);\n color: var(--tao-color-text);\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-control);\n box-shadow: var(--tao-shadow-overlay);\n}\n\n.tao-select__option {\n padding: var(--tao-space-2) var(--tao-space-3);\n border-radius: var(--tao-radius-sm);\n font-size: var(--tao-font-size-md);\n cursor: pointer;\n user-select: none;\n}\n\n.tao-select__option--active,\n.tao-select__option:hover:not(.tao-select__option--disabled) {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-select__option--selected {\n color: var(--tao-color-accent);\n}\n\n.tao-select__option--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n</style>\n\n<style scoped>\n.tao-select {\n width: 100%;\n}\n\n.tao-select__trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tao-space-2);\n width: 100%;\n min-height: 36px;\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 text-align: left;\n cursor: pointer;\n transition: var(--tao-transition-base);\n}\n\n.tao-select__trigger--placeholder {\n color: var(--tao-color-input-placeholder);\n}\n\n.tao-select__trigger: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-select--invalid .tao-select__trigger {\n border-color: var(--tao-color-danger);\n}\n\n.tao-select--invalid .tao-select__trigger:focus {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\n}\n\n.tao-select__trigger:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.tao-select__value {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tao-select__chevron {\n flex-shrink: 0;\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 5px solid currentColor;\n opacity: 0.6;\n transition: transform var(--tao-duration-fast) var(--tao-ease-base);\n}\n\n.tao-select--open .tao-select__chevron {\n transform: rotate(180deg);\n}\n</style>\n","export interface TaoDateParts {\n y: number;\n m: number;\n d: number;\n}\n\nexport interface TaoDateCell {\n iso: string;\n day: number;\n currentMonth: boolean;\n}\n\nconst ISO_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport function formatTaoDateIso(parts: TaoDateParts): string {\n return `${String(parts.y).padStart(4, '0')}-${String(parts.m).padStart(2, '0')}-${String(parts.d).padStart(2, '0')}`;\n}\n\nexport function parseTaoDate(value: string | null | undefined): TaoDateParts | null {\n if (!value) {\n return null;\n }\n\n const match = ISO_DATE.exec(value);\n if (!match) {\n return null;\n }\n\n const y = Number(match[1]);\n const m = Number(match[2]);\n const d = Number(match[3]);\n const date = new Date(y, m - 1, d);\n\n if (date.getFullYear() !== y || date.getMonth() !== m - 1 || date.getDate() !== d) {\n return null;\n }\n\n return { y, m, d };\n}\n\nexport function todayTaoDate(): string {\n const now = new Date();\n return formatTaoDateIso({ y: now.getFullYear(), m: now.getMonth() + 1, d: now.getDate() });\n}\n\nexport function shiftTaoDate(iso: string, days: number): string {\n const parts = parseTaoDate(iso);\n if (!parts) {\n return iso;\n }\n\n const date = new Date(parts.y, parts.m - 1, parts.d + days);\n return formatTaoDateIso({ y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate() });\n}\n\nexport function shiftTaoMonth(iso: string, months: number): string {\n const parts = parseTaoDate(iso);\n if (!parts) {\n return iso;\n }\n\n const date = new Date(parts.y, parts.m - 1 + months, parts.d);\n return formatTaoDateIso({ y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate() });\n}\n\nexport function isTaoDateInRange(iso: string, min?: string, max?: string): boolean {\n if (!parseTaoDate(iso)) {\n return false;\n }\n\n if (min && parseTaoDate(min) && iso < min) {\n return false;\n }\n\n if (max && parseTaoDate(max) && iso > max) {\n return false;\n }\n\n return true;\n}\n\nexport function formatTaoDateLabel(iso: string, locale = 'ru-RU'): string {\n const parts = parseTaoDate(iso);\n if (!parts) {\n return '';\n }\n\n return new Date(parts.y, parts.m - 1, parts.d).toLocaleDateString(locale, {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n });\n}\n\nexport function formatTaoMonthLabel(year: number, month: number, locale = 'ru-RU'): string {\n const label = new Date(year, month - 1, 1).toLocaleDateString(locale, {\n month: 'long',\n year: 'numeric',\n });\n return label.charAt(0).toUpperCase() + label.slice(1);\n}\n\nexport function taoDateWeekdayIndex(iso: string): number {\n const parts = parseTaoDate(iso);\n if (!parts) {\n return 0;\n }\n\n return (new Date(parts.y, parts.m - 1, parts.d).getDay() + 6) % 7;\n}\n\nexport function taoWeekdayLabels(locale = 'ru-RU'): string[] {\n return Array.from({ length: 7 }, (_, index) => {\n const label = new Date(2026, 0, 5 + index).toLocaleDateString(locale, { weekday: 'short' });\n return label.replace(/\\.$/, '');\n });\n}\n\n/** Monday-first 6×7 grid so the popup height stays stable. */\nexport function buildTaoDateGrid(year: number, month: number): TaoDateCell[] {\n const first = new Date(year, month - 1, 1);\n const mondayOffset = (first.getDay() + 6) % 7;\n const start = new Date(year, month - 1, 1 - mondayOffset);\n\n return Array.from({ length: 42 }, (_, index) => {\n const date = new Date(start.getFullYear(), start.getMonth(), start.getDate() + index);\n return {\n iso: formatTaoDateIso({ y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate() }),\n day: date.getDate(),\n currentMonth: date.getMonth() === month - 1,\n };\n });\n}\n","<script lang=\"ts\" setup>\nimport { computed, inject, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\nimport {\n buildTaoDateGrid,\n formatTaoDateIso,\n formatTaoDateLabel,\n formatTaoMonthLabel,\n isTaoDateInRange,\n parseTaoDate,\n shiftTaoDate,\n shiftTaoMonth,\n taoDateWeekdayIndex,\n taoWeekdayLabels,\n todayTaoDate,\n} from '../date';\n\ndefineOptions({ name: 'TaoDate' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string | null;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n min?: string;\n max?: string;\n locale?: string;\n }>(),\n {\n modelValue: null,\n placeholder: 'Дата',\n disabled: false,\n error: false,\n min: undefined,\n max: undefined,\n locale: 'ru-RU',\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | null];\n change: [value: string | null];\n}>();\n\nconst field = inject(formFieldKey, null);\nconst localId = useId();\nconst gridId = `${localId}-grid`;\nconst controlId = computed(() => field?.id ?? localId);\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\n\nconst open = ref(false);\nconst viewYear = ref(2026);\nconst viewMonth = ref(1);\nconst cursorIso = ref(todayTaoDate());\nconst triggerRef = ref<HTMLButtonElement | null>(null);\nconst panelRef = ref<HTMLElement | null>(null);\nconst panelStyle = ref({ top: '0px', left: '0px' });\n\nconst valueIso = computed(() => {\n const parsed = parseTaoDate(props.modelValue);\n return parsed ? formatTaoDateIso(parsed) : null;\n});\nconst displayLabel = computed(() => (valueIso.value ? formatTaoDateLabel(valueIso.value, props.locale) : ''));\nconst weekdays = computed(() => taoWeekdayLabels(props.locale));\nconst monthLabel = computed(() => formatTaoMonthLabel(viewYear.value, viewMonth.value, props.locale));\nconst cells = computed(() => buildTaoDateGrid(viewYear.value, viewMonth.value));\nconst todayIso = computed(() => todayTaoDate());\nconst todayEnabled = computed(() => isTaoDateInRange(todayIso.value, props.min, props.max));\n\nfunction syncViewFrom(iso: string) {\n const parts = parseTaoDate(iso);\n if (!parts) {\n return;\n }\n\n viewYear.value = parts.y;\n viewMonth.value = parts.m;\n cursorIso.value = iso;\n}\n\nfunction updatePosition() {\n const trigger = triggerRef.value;\n const panel = panelRef.value;\n if (!trigger || !panel) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const height = panel.offsetHeight;\n const width = panel.offsetWidth;\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom - gap;\n const openUp = spaceBelow < height && rect.top > spaceBelow;\n const left = Math.min(rect.left, Math.max(8, window.innerWidth - width - 8));\n\n panelStyle.value = {\n top: `${openUp ? rect.top - height - gap : rect.bottom + gap}px`,\n left: `${Math.max(8, left)}px`,\n };\n}\n\nasync function setOpen(next: boolean) {\n if (props.disabled) {\n return;\n }\n\n open.value = next;\n if (!next) {\n return;\n }\n\n syncViewFrom(valueIso.value ?? todayIso.value);\n await nextTick();\n updatePosition();\n panelRef.value?.focus();\n}\n\nfunction toggle() {\n void setOpen(!open.value);\n}\n\nfunction close() {\n open.value = false;\n}\n\nfunction selectDay(iso: string) {\n if (!isTaoDateInRange(iso, props.min, props.max)) {\n return;\n }\n\n emit('update:modelValue', iso);\n emit('change', iso);\n close();\n triggerRef.value?.focus();\n}\n\nfunction clear() {\n emit('update:modelValue', null);\n emit('change', null);\n close();\n triggerRef.value?.focus();\n}\n\nfunction goMonth(delta: number) {\n const next = shiftTaoMonth(`${viewYear.value}-${String(viewMonth.value).padStart(2, '0')}-01`, delta);\n const parts = parseTaoDate(next);\n if (!parts) {\n return;\n }\n\n viewYear.value = parts.y;\n viewMonth.value = parts.m;\n cursorIso.value = shiftTaoMonth(cursorIso.value, delta);\n void nextTick(updatePosition);\n}\n\nfunction moveCursor(days: number) {\n cursorIso.value = shiftTaoDate(cursorIso.value, days);\n syncViewFrom(cursorIso.value);\n void nextTick(updatePosition);\n}\n\nfunction onTriggerKeydown(event: KeyboardEvent) {\n if (props.disabled) {\n return;\n }\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void setOpen(true);\n }\n}\n\nfunction onPanelKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault();\n close();\n triggerRef.value?.focus();\n return;\n }\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n moveCursor(-1);\n return;\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n moveCursor(1);\n return;\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveCursor(-7);\n return;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveCursor(7);\n return;\n }\n\n if (event.key === 'PageUp') {\n event.preventDefault();\n goMonth(-1);\n return;\n }\n\n if (event.key === 'PageDown') {\n event.preventDefault();\n goMonth(1);\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n moveCursor(-taoDateWeekdayIndex(cursorIso.value));\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n moveCursor(6 - taoDateWeekdayIndex(cursorIso.value));\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n selectDay(cursorIso.value);\n }\n}\n\nfunction onDocumentPointer(event: PointerEvent) {\n const target = event.target as Node;\n if (triggerRef.value?.contains(target) || panelRef.value?.contains(target)) {\n return;\n }\n\n close();\n}\n\nfunction onViewportChange() {\n if (open.value) {\n updatePosition();\n }\n}\n\nwatch(open, (isOpen) => {\n if (isOpen) {\n document.addEventListener('pointerdown', onDocumentPointer);\n window.addEventListener('resize', onViewportChange);\n window.addEventListener('scroll', onViewportChange, true);\n return;\n }\n\n document.removeEventListener('pointerdown', onDocumentPointer);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointer);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n</script>\n\n<template>\n <div class=\"tao-date\" :class=\"{ 'tao-date--open': open, 'tao-date--invalid': invalid }\">\n <button\n :id=\"controlId\"\n ref=\"triggerRef\"\n type=\"button\"\n class=\"tao-date__trigger\"\n :class=\"{ 'tao-date__trigger--placeholder': !valueIso }\"\n role=\"combobox\"\n :aria-expanded=\"open\"\n aria-haspopup=\"dialog\"\n :aria-controls=\"gridId\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :disabled=\"disabled\"\n @click=\"toggle\"\n @keydown=\"onTriggerKeydown\"\n >\n <span class=\"tao-date__value\">{{ displayLabel || placeholder }}</span>\n <svg class=\"tao-date__icon\" viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <rect\n x=\"2\"\n y=\"3\"\n width=\"12\"\n height=\"11\"\n rx=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n />\n <path d=\"M5 1.5v3M11 1.5v3M2 6.5h12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n </button>\n\n <Teleport to=\"body\">\n <div\n v-if=\"open\"\n :id=\"gridId\"\n ref=\"panelRef\"\n class=\"tao-date__panel\"\n role=\"dialog\"\n :aria-label=\"monthLabel\"\n tabindex=\"-1\"\n :style=\"panelStyle\"\n @keydown=\"onPanelKeydown\"\n >\n <div class=\"tao-date__header\">\n <button type=\"button\" class=\"tao-date__nav\" aria-label=\"Предыдущий месяц\" @click=\"goMonth(-1)\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M14.5 5 8 12l6.5 7\"\n />\n </svg>\n </button>\n <p class=\"tao-date__month\">{{ monthLabel }}</p>\n <button type=\"button\" class=\"tao-date__nav\" aria-label=\"Следующий месяц\" @click=\"goMonth(1)\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M9.5 5 16 12l-6.5 7\"\n />\n </svg>\n </button>\n </div>\n\n <div class=\"tao-date__weekdays\" aria-hidden=\"true\">\n <span v-for=\"day in weekdays\" :key=\"day\">{{ day }}</span>\n </div>\n\n <div class=\"tao-date__grid\" role=\"grid\">\n <button\n v-for=\"cell in cells\"\n :key=\"cell.iso\"\n type=\"button\"\n class=\"tao-date__day\"\n :class=\"{\n 'tao-date__day--outside': !cell.currentMonth,\n 'tao-date__day--today': cell.iso === todayIso,\n 'tao-date__day--selected': cell.iso === valueIso,\n 'tao-date__day--cursor': cell.iso === cursorIso,\n 'tao-date__day--disabled': !isTaoDateInRange(cell.iso, min, max),\n }\"\n role=\"gridcell\"\n :aria-selected=\"cell.iso === valueIso\"\n :disabled=\"!isTaoDateInRange(cell.iso, min, max)\"\n @mousedown.prevent\n @click=\"selectDay(cell.iso)\"\n >\n {{ cell.day }}\n </button>\n </div>\n\n <div class=\"tao-date__footer\">\n <button type=\"button\" class=\"tao-date__link\" :disabled=\"!todayEnabled\" @click=\"selectDay(todayIso)\">\n Сегодня\n </button>\n <button v-if=\"valueIso\" type=\"button\" class=\"tao-date__link\" @click=\"clear\">Очистить</button>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-date__panel {\n z-index: 1050;\n position: fixed;\n box-sizing: border-box;\n width: 280px;\n padding: var(--tao-space-3);\n background: var(--tao-color-surface-raised);\n color: var(--tao-color-text);\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-control);\n box-shadow: var(--tao-shadow-overlay);\n}\n\n.tao-date__header {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n margin-bottom: var(--tao-space-3);\n}\n\n.tao-date__month {\n flex: 1;\n margin: 0;\n font-size: var(--tao-font-size-md);\n font-weight: 600;\n text-align: center;\n color: var(--tao-color-text-strong);\n}\n\n.tao-date__nav {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n margin: 0;\n padding: 0;\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-full);\n background: var(--tao-color-surface-sunken);\n color: var(--tao-color-text);\n cursor: pointer;\n}\n\n.tao-date__nav svg {\n display: block;\n}\n\n.tao-date__nav:hover {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-date__nav:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n\n.tao-date__weekdays,\n.tao-date__grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n}\n\n.tao-date__weekdays {\n margin-bottom: var(--tao-space-1);\n}\n\n.tao-date__weekdays span {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 24px;\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-xs);\n text-transform: lowercase;\n}\n\n.tao-date__day {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n aspect-ratio: 1;\n margin: 0;\n padding: 0;\n border: 1px solid transparent;\n border-radius: var(--tao-radius-sm);\n background: transparent;\n color: var(--tao-color-text);\n font: inherit;\n font-size: var(--tao-font-size-sm);\n cursor: pointer;\n}\n\n.tao-date__day--outside {\n color: var(--tao-color-text-muted);\n opacity: 0.55;\n}\n\n.tao-date__day--today {\n border-color: var(--tao-color-accent);\n}\n\n.tao-date__day--selected {\n background: var(--tao-color-accent);\n color: var(--tao-color-text-on-accent);\n opacity: 1;\n}\n\n.tao-date__day--cursor:not(.tao-date__day--selected) {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-date__day:hover:not(:disabled):not(.tao-date__day--selected) {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-date__day:disabled {\n opacity: 0.35;\n cursor: not-allowed;\n}\n\n.tao-date__day:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 1px;\n}\n\n.tao-date__footer {\n display: flex;\n justify-content: space-between;\n gap: var(--tao-space-2);\n margin-top: var(--tao-space-3);\n}\n\n.tao-date__link {\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n color: var(--tao-color-accent);\n font: inherit;\n font-size: var(--tao-font-size-sm);\n cursor: pointer;\n}\n\n.tao-date__link:hover:not(:disabled) {\n color: var(--tao-color-accent-hover);\n}\n\n.tao-date__link:disabled {\n color: var(--tao-color-text-muted);\n cursor: not-allowed;\n}\n\n.tao-date__link:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n</style>\n\n<style scoped>\n.tao-date {\n width: 100%;\n}\n\n.tao-date__trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tao-space-2);\n width: 100%;\n min-height: 36px;\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 text-align: left;\n cursor: pointer;\n transition: var(--tao-transition-base);\n}\n\n.tao-date__trigger--placeholder {\n color: var(--tao-color-input-placeholder);\n}\n\n.tao-date__trigger: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-date--invalid .tao-date__trigger {\n border-color: var(--tao-color-danger);\n}\n\n.tao-date--invalid .tao-date__trigger:focus {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\n}\n\n.tao-date__trigger:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.tao-date__value {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tao-date__icon {\n flex-shrink: 0;\n opacity: 0.7;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useId } from 'vue';\nimport { formFieldKey } from '../formField';\n\ndefineOptions({ name: 'TaoSwitch' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: boolean;\n label?: string;\n disabled?: boolean;\n }>(),\n {\n modelValue: false,\n label: '',\n disabled: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean];\n change: [value: boolean];\n}>();\n\nconst field = inject(formFieldKey, null);\nconst localId = useId();\nconst controlId = computed(() => field?.id ?? localId);\n\nfunction toggle() {\n if (props.disabled) {\n return;\n }\n\n const next = !props.modelValue;\n emit('update:modelValue', next);\n emit('change', next);\n}\n</script>\n\n<template>\n <label class=\"tao-switch\" :class=\"{ 'tao-switch--disabled': disabled, 'tao-switch--on': modelValue }\" :for=\"controlId\">\n <input\n :id=\"controlId\"\n class=\"tao-switch__input\"\n type=\"checkbox\"\n role=\"switch\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n :aria-checked=\"modelValue\"\n @change=\"toggle\"\n />\n <span class=\"tao-switch__track\" aria-hidden=\"true\">\n <span class=\"tao-switch__thumb\"></span>\n </span>\n <span v-if=\"label\" class=\"tao-switch__label\">{{ label }}</span>\n <span v-else-if=\"$slots.default\" class=\"tao-switch__label\"><slot /></span>\n </label>\n</template>\n\n<style scoped>\n.tao-switch {\n display: inline-flex;\n align-items: center;\n gap: var(--tao-space-2);\n cursor: pointer;\n user-select: none;\n color: var(--tao-color-text);\n}\n\n.tao-switch__input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.tao-switch__track {\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n width: 36px;\n height: 20px;\n padding: 2px;\n pointer-events: none;\n background: var(--tao-color-surface-sunken);\n border: 1px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-full);\n transition: var(--tao-transition-base);\n}\n\n.tao-switch__thumb {\n width: 14px;\n height: 14px;\n background: var(--tao-color-text-muted);\n border-radius: var(--tao-radius-full);\n transform: translateX(0);\n transition: var(--tao-transition-base);\n}\n\n.tao-switch--on .tao-switch__track {\n background: var(--tao-color-accent);\n border-color: var(--tao-color-accent);\n}\n\n.tao-switch--on .tao-switch__thumb {\n background: var(--tao-color-on-accent);\n transform: translateX(16px);\n}\n\n.tao-switch__input:focus-visible + .tao-switch__track {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n\n.tao-switch__label {\n font-size: var(--tao-font-size-sm);\n color: var(--tao-color-text);\n}\n\n.tao-switch--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n</style>\n","import type { ComputedRef, InjectionKey } from 'vue';\n\nexport type TaoRadioValue = string | number | boolean;\n\nexport interface TaoRadioGroupContext {\n name: ComputedRef<string>;\n model: ComputedRef<TaoRadioValue | undefined>;\n disabled: ComputedRef<boolean>;\n setValue: (value: TaoRadioValue) => void;\n}\n\nexport const radioGroupKey: InjectionKey<TaoRadioGroupContext> = Symbol('taoRadioGroup');\n","<script lang=\"ts\" setup>\nimport { computed, inject, useId } from 'vue';\nimport { radioGroupKey, type TaoRadioValue } from '../radio';\n\ndefineOptions({ name: 'TaoRadio' });\n\nconst props = withDefaults(\n defineProps<{\n value: TaoRadioValue;\n modelValue?: TaoRadioValue;\n name?: string;\n label?: string;\n disabled?: boolean;\n }>(),\n {\n label: '',\n disabled: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoRadioValue];\n change: [value: TaoRadioValue];\n}>();\n\nconst group = inject(radioGroupKey, null);\nconst localId = useId();\n\nconst isDisabled = computed(() => props.disabled || Boolean(group?.disabled.value));\nconst inputName = computed(() => group?.name.value ?? props.name);\nconst isChecked = computed(() => {\n const current = group ? group.model.value : props.modelValue;\n return current === props.value;\n});\n\nfunction onChange() {\n if (isDisabled.value) {\n return;\n }\n\n if (group) {\n group.setValue(props.value);\n return;\n }\n\n emit('update:modelValue', props.value);\n emit('change', props.value);\n}\n</script>\n\n<template>\n <label class=\"tao-radio\" :class=\"{ 'tao-radio--disabled': isDisabled }\" :for=\"localId\">\n <input\n :id=\"localId\"\n class=\"tao-radio__input\"\n type=\"radio\"\n :name=\"inputName\"\n :value=\"String(value)\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled\"\n @change=\"onChange\"\n />\n <span class=\"tao-radio__dot\" aria-hidden=\"true\"></span>\n <span v-if=\"label\" class=\"tao-radio__label\">{{ label }}</span>\n <span v-else class=\"tao-radio__label\"><slot /></span>\n </label>\n</template>\n\n<style scoped>\n.tao-radio {\n display: inline-flex;\n align-items: center;\n gap: var(--tao-space-2);\n cursor: pointer;\n user-select: none;\n color: var(--tao-color-text);\n}\n\n.tao-radio__input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.tao-radio__dot {\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n pointer-events: none;\n background: var(--tao-color-surface-raised);\n border: 2px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-full);\n transition: var(--tao-transition-base);\n}\n\n.tao-radio__dot::after {\n content: '';\n width: 8px;\n height: 8px;\n background: transparent;\n border-radius: var(--tao-radius-full);\n transform: scale(0);\n transition: var(--tao-transition-base);\n}\n\n.tao-radio__input:checked + .tao-radio__dot {\n border-color: var(--tao-color-accent);\n}\n\n.tao-radio__input:checked + .tao-radio__dot::after {\n background: var(--tao-color-accent);\n transform: scale(1);\n}\n\n.tao-radio__input:focus-visible + .tao-radio__dot {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 1px;\n}\n\n.tao-radio__label {\n font-size: var(--tao-font-size-sm);\n color: var(--tao-color-text);\n}\n\n.tao-radio--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, provide, useId } from 'vue';\nimport { radioGroupKey, type TaoRadioValue } from '../radio';\n\ndefineOptions({ name: 'TaoRadioGroup' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TaoRadioValue;\n name?: string;\n legend?: string;\n disabled?: boolean;\n direction?: 'row' | 'column';\n }>(),\n {\n disabled: false,\n direction: 'row',\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoRadioValue];\n change: [value: TaoRadioValue];\n}>();\n\nconst autoName = useId();\nconst groupName = computed(() => props.name || autoName);\nconst model = computed(() => props.modelValue);\nconst groupDisabled = computed(() => props.disabled);\n\nfunction setValue(value: TaoRadioValue) {\n emit('update:modelValue', value);\n emit('change', value);\n}\n\nprovide(radioGroupKey, {\n name: groupName,\n model,\n disabled: groupDisabled,\n setValue,\n});\n</script>\n\n<template>\n <fieldset class=\"tao-radio-group\" :class=\"`tao-radio-group--${direction}`\" :disabled=\"disabled\">\n <legend v-if=\"legend\" class=\"tao-radio-group__legend\">{{ legend }}</legend>\n <slot />\n </fieldset>\n</template>\n\n<style scoped>\n.tao-radio-group {\n display: flex;\n flex-wrap: wrap;\n gap: var(--tao-space-3) var(--tao-space-4);\n margin: 0;\n padding: 0;\n border: none;\n min-width: 0;\n}\n\n.tao-radio-group--column {\n flex-direction: column;\n align-items: flex-start;\n}\n\n.tao-radio-group__legend {\n padding: 0;\n margin-bottom: var(--tao-space-2);\n font-size: var(--tao-font-size-sm);\n font-weight: 500;\n color: var(--tao-color-text);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\ndefineOptions({ name: 'TaoAlert' });\n\nconst props = withDefaults(\n defineProps<{\n type?: 'success' | 'error' | 'warning' | 'info' | 'neutral';\n title?: string;\n closable?: boolean;\n }>(),\n {\n type: 'info',\n title: '',\n closable: false,\n },\n);\n\nconst emit = defineEmits<{\n close: [];\n}>();\n\nconst live = computed(() => (props.type === 'error' || props.type === 'warning' ? 'assertive' : 'polite'));\n</script>\n\n<template>\n <div\n class=\"tao-alert\"\n :class=\"`tao-alert--${type}`\"\n :role=\"type === 'error' ? 'alert' : 'status'\"\n :aria-live=\"live\"\n >\n <div class=\"tao-alert__body\">\n <strong v-if=\"title\" class=\"tao-alert__title\">{{ title }}</strong>\n <p v-if=\"$slots.default\" class=\"tao-alert__message\"><slot /></p>\n </div>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"tao-alert__close\"\n aria-label=\"Закрыть\"\n @click=\"emit('close')\"\n >\n ×\n </button>\n </div>\n</template>\n\n<style scoped>\n.tao-alert {\n --tao-alert-tone: var(--tao-color-info);\n\n display: flex;\n align-items: flex-start;\n gap: var(--tao-space-3);\n width: 100%;\n padding: var(--tao-space-3) var(--tao-space-4);\n background: color-mix(in srgb, var(--tao-alert-tone) 10%, var(--tao-color-surface-raised));\n color: var(--tao-color-text);\n border: 1px solid color-mix(in srgb, var(--tao-alert-tone) 35%, var(--tao-color-border));\n border-radius: var(--tao-radius-panel);\n}\n\n.tao-alert--success {\n --tao-alert-tone: var(--tao-color-success);\n}\n\n.tao-alert--error {\n --tao-alert-tone: var(--tao-color-danger);\n}\n\n.tao-alert--warning {\n --tao-alert-tone: var(--tao-color-warning);\n}\n\n.tao-alert--info {\n --tao-alert-tone: var(--tao-color-info);\n}\n\n.tao-alert--neutral {\n --tao-alert-tone: var(--tao-color-text-muted);\n}\n\n.tao-alert__body {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-1);\n min-width: 0;\n flex: 1;\n}\n\n.tao-alert__title {\n font-size: var(--tao-font-size-md);\n font-weight: 600;\n color: var(--tao-color-text-strong);\n}\n\n.tao-alert__message {\n margin: 0;\n font-size: var(--tao-font-size-sm);\n line-height: 1.45;\n color: var(--tao-color-text);\n}\n\n.tao-alert__close {\n flex-shrink: 0;\n margin: calc(-1 * var(--tao-space-1)) calc(-1 * var(--tao-space-2)) 0 0;\n padding: 0;\n border: none;\n background: none;\n color: var(--tao-color-text-muted);\n font-size: 20px;\n line-height: 1;\n cursor: pointer;\n}\n\n.tao-alert__close:hover {\n color: var(--tao-color-text-strong);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport TaoLoader from './TaoLoader.vue';\nimport type { TaoTableColumn, TaoTableSort } from '../table';\n\ndefineOptions({ name: 'TaoTable' });\n\nconst props = withDefaults(\n defineProps<{\n columns: TaoTableColumn[];\n rows?: Record<string, unknown>[];\n rowKey?: string | ((row: Record<string, unknown>, index: number) => string | number);\n loading?: boolean;\n emptyText?: string;\n striped?: boolean;\n compact?: boolean;\n hover?: boolean;\n sticky?: boolean;\n maxHeight?: string;\n clickable?: boolean;\n sort?: TaoTableSort | null;\n caption?: string;\n }>(),\n {\n rows: () => [],\n rowKey: 'id',\n loading: false,\n emptyText: 'Нет данных',\n striped: false,\n compact: false,\n hover: true,\n sticky: false,\n maxHeight: '',\n clickable: false,\n sort: null,\n caption: '',\n },\n);\n\nconst emit = defineEmits<{\n 'update:sort': [value: TaoTableSort | null];\n sort: [value: TaoTableSort | null];\n 'row-click': [row: Record<string, unknown>, index: number];\n}>();\n\nconst colCount = computed(() => Math.max(props.columns.length, 1));\nconst isEmpty = computed(() => !props.rows.length && !props.loading);\n\nfunction columnWidth(column: TaoTableColumn) {\n if (column.width == null) {\n return undefined;\n }\n return typeof column.width === 'number' ? `${column.width}px` : column.width;\n}\n\nfunction cellValue(row: Record<string, unknown>, column: TaoTableColumn) {\n if (column.value) {\n return column.value(row);\n }\n return row[column.key];\n}\n\nfunction rowId(row: Record<string, unknown>, index: number) {\n if (typeof props.rowKey === 'function') {\n return props.rowKey(row, index);\n }\n const key = row[props.rowKey];\n return key == null ? index : String(key);\n}\n\nfunction sortDir(column: TaoTableColumn) {\n if (!props.sort || props.sort.key !== column.key) {\n return null;\n }\n return props.sort.dir;\n}\n\nfunction toggleSort(column: TaoTableColumn) {\n if (!column.sortable) {\n return;\n }\n\n const current = sortDir(column);\n const next: TaoTableSort | null =\n current == null ? { key: column.key, dir: 'asc' } : current === 'asc' ? { key: column.key, dir: 'desc' } : null;\n\n emit('update:sort', next);\n emit('sort', next);\n}\n\nfunction onRowClick(row: Record<string, unknown>, index: number) {\n if (!props.clickable) {\n return;\n }\n emit('row-click', row, index);\n}\n</script>\n\n<template>\n <div\n class=\"tao-table-wrap\"\n :class=\"{\n 'tao-table-wrap--sticky': sticky,\n 'tao-table-wrap--loading': loading,\n }\"\n :style=\"maxHeight ? { maxHeight } : undefined\"\n >\n <table\n class=\"tao-table\"\n :class=\"{\n 'tao-table--striped': striped,\n 'tao-table--compact': compact,\n 'tao-table--hover': hover,\n 'tao-table--clickable': clickable,\n 'tao-table--sticky': sticky,\n }\"\n >\n <caption v-if=\"caption\">{{ caption }}</caption>\n <thead>\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :style=\"{ width: columnWidth(column), textAlign: column.align || 'left' }\"\n scope=\"col\"\n :aria-sort=\"\n column.sortable\n ? sortDir(column) === 'asc'\n ? 'ascending'\n : sortDir(column) === 'desc'\n ? 'descending'\n : 'none'\n : undefined\n \"\n >\n <button\n v-if=\"column.sortable\"\n type=\"button\"\n class=\"tao-table__sort-btn\"\n @click=\"toggleSort(column)\"\n >\n <span>{{ column.label }}</span>\n <span\n class=\"tao-table__sorter\"\n :class=\"{\n 'tao-table__sorter--asc': sortDir(column) === 'asc',\n 'tao-table__sorter--desc': sortDir(column) === 'desc',\n }\"\n aria-hidden=\"true\"\n />\n </button>\n <span v-else>{{ column.label }}</span>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"isEmpty\">\n <td class=\"tao-table__empty\" :colspan=\"colCount\">\n <slot name=\"empty\">{{ emptyText }}</slot>\n </td>\n </tr>\n <tr\n v-for=\"(row, index) in rows\"\n :key=\"rowId(row, index)\"\n @click=\"onRowClick(row, index)\"\n >\n <td\n v-for=\"column in columns\"\n :key=\"column.key\"\n :style=\"{ textAlign: column.align || 'left' }\"\n >\n <slot\n :name=\"`cell-${column.key}`\"\n :row=\"row\"\n :column=\"column\"\n :value=\"cellValue(row, column)\"\n :index=\"index\"\n >\n <slot name=\"cell\" :row=\"row\" :column=\"column\" :value=\"cellValue(row, column)\" :index=\"index\">\n {{ cellValue(row, column) }}\n </slot>\n </slot>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div v-if=\"loading\" class=\"tao-table__loading\" aria-busy=\"true\">\n <slot name=\"loading\">\n <TaoLoader :size=\"36\" />\n </slot>\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-table-wrap {\n position: relative;\n width: 100%;\n overflow: auto;\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-panel);\n background: var(--tao-color-surface);\n}\n\n.tao-table-wrap--loading {\n min-height: 120px;\n}\n\n.tao-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--tao-font-size-md);\n color: var(--tao-color-text);\n}\n\n.tao-table caption {\n caption-side: top;\n padding: var(--tao-space-3) var(--tao-space-4);\n text-align: left;\n font-size: var(--tao-font-size-sm);\n color: var(--tao-color-text-muted);\n}\n\n.tao-table th,\n.tao-table td {\n padding: var(--tao-space-3) var(--tao-space-4);\n border-bottom: 1px solid var(--tao-color-border);\n vertical-align: middle;\n}\n\n.tao-table--compact th,\n.tao-table--compact td {\n padding: var(--tao-space-2) var(--tao-space-3);\n font-size: var(--tao-font-size-sm);\n}\n\n.tao-table th {\n font-weight: 600;\n font-size: var(--tao-font-size-sm);\n color: var(--tao-color-text-muted);\n background: var(--tao-color-surface-raised);\n white-space: nowrap;\n text-align: left;\n}\n\n.tao-table--sticky thead th {\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.tao-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.tao-table--striped tbody tr:nth-child(even) td {\n background: var(--tao-color-surface-sunken);\n}\n\n.tao-table--hover tbody tr:hover td {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-table--clickable tbody tr {\n cursor: pointer;\n}\n\n.tao-table__sort-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--tao-space-2);\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n color: inherit;\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n}\n\n.tao-table__sort-btn:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n border-radius: var(--tao-radius-control);\n}\n\n.tao-table__sorter {\n position: relative;\n width: 8px;\n height: 12px;\n opacity: 0.35;\n}\n\n.tao-table__sorter::before,\n.tao-table__sorter::after {\n content: '';\n position: absolute;\n left: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n}\n\n.tao-table__sorter::before {\n top: 0;\n border-bottom: 4px solid currentColor;\n}\n\n.tao-table__sorter::after {\n bottom: 0;\n border-top: 4px solid currentColor;\n}\n\n.tao-table__sorter--asc,\n.tao-table__sorter--desc {\n opacity: 1;\n color: var(--tao-color-accent);\n}\n\n.tao-table__sorter--asc::after,\n.tao-table__sorter--desc::before {\n opacity: 0.25;\n}\n\n.tao-table__empty {\n padding: var(--tao-space-8) var(--tao-space-4);\n text-align: center;\n color: var(--tao-color-text-muted);\n}\n\n.tao-table__loading {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--tao-color-surface) 72%, transparent);\n}\n</style>\n","export type TaoPaginationItem =\n | { type: 'page'; page: number }\n | { type: 'ellipsis'; id: 'left' | 'right' };\n\nexport function buildPaginationItems(\n page: number,\n pageCount: number,\n siblingCount = 1,\n): TaoPaginationItem[] {\n if (pageCount <= 0) {\n return [];\n }\n\n if (pageCount <= 7) {\n return Array.from({ length: pageCount }, (_, index) => ({ type: 'page' as const, page: index + 1 }));\n }\n\n const current = Math.min(Math.max(page, 1), pageCount);\n const siblings = Math.max(0, siblingCount);\n const left = Math.max(2, current - siblings);\n const right = Math.min(pageCount - 1, current + siblings);\n const items: TaoPaginationItem[] = [{ type: 'page', page: 1 }];\n\n if (left > 2) {\n items.push({ type: 'ellipsis', id: 'left' });\n }\n\n for (let next = left; next <= right; next += 1) {\n items.push({ type: 'page', page: next });\n }\n\n if (right < pageCount - 1) {\n items.push({ type: 'ellipsis', id: 'right' });\n }\n\n items.push({ type: 'page', page: pageCount });\n return items;\n}\n","<script lang=\"ts\" setup>\nimport { computed, watch } from 'vue';\nimport { buildPaginationItems } from '../pagination';\n\ndefineOptions({ name: 'TaoPagination' });\n\nconst props = withDefaults(\n defineProps<{\n page?: number;\n total?: number;\n pageSize?: number;\n siblingCount?: number;\n disabled?: boolean;\n showTotal?: boolean;\n size?: 'small' | 'medium';\n /** Click ellipsis to skip this many pages. 0 keeps … decorative. */\n jump?: number;\n ariaLabel?: string;\n }>(),\n {\n page: 1,\n total: 0,\n pageSize: 10,\n siblingCount: 1,\n disabled: false,\n showTotal: true,\n size: 'medium',\n jump: 5,\n ariaLabel: 'Пагинация',\n },\n);\n\nconst emit = defineEmits<{\n 'update:page': [value: number];\n change: [value: number];\n}>();\n\nconst pageCount = computed(() => Math.max(1, Math.ceil(Math.max(props.total, 0) / Math.max(props.pageSize, 1))));\nconst current = computed(() => Math.min(Math.max(props.page, 1), pageCount.value));\nconst items = computed(() => buildPaginationItems(current.value, pageCount.value, props.siblingCount));\n\nconst from = computed(() => (props.total === 0 ? 0 : (current.value - 1) * props.pageSize + 1));\nconst to = computed(() => Math.min(current.value * props.pageSize, props.total));\n\nwatch(pageCount, (count) => {\n if (props.page > count) {\n goTo(count);\n }\n});\n\nfunction goTo(next: number) {\n if (props.disabled) {\n return;\n }\n\n const page = Math.min(Math.max(next, 1), pageCount.value);\n if (page === props.page) {\n return;\n }\n\n emit('update:page', page);\n emit('change', page);\n}\n</script>\n\n<template>\n <nav class=\"tao-pagination\" :class=\"`tao-pagination--${size}`\" :aria-label=\"ariaLabel\">\n <p v-if=\"showTotal\" class=\"tao-pagination__total\">\n <template v-if=\"total === 0\">0 из 0</template>\n <template v-else>{{ from }}–{{ to }} из {{ total }}</template>\n </p>\n\n <div class=\"tao-pagination__pages\">\n <button\n type=\"button\"\n class=\"tao-pagination__btn\"\n aria-label=\"Назад\"\n :disabled=\"disabled || current <= 1\"\n @click=\"goTo(current - 1)\"\n >\n ‹\n </button>\n\n <template v-for=\"item in items\" :key=\"item.type === 'page' ? item.page : item.id\">\n <button\n v-if=\"item.type === 'ellipsis' && jump > 0\"\n type=\"button\"\n class=\"tao-pagination__btn tao-pagination__btn--jump\"\n :aria-label=\"item.id === 'left' ? `Назад на ${jump} страниц` : `Вперёд на ${jump} страниц`\"\n :disabled=\"disabled\"\n @click=\"goTo(item.id === 'left' ? current - jump : current + jump)\"\n >\n …\n </button>\n <span v-else-if=\"item.type === 'ellipsis'\" class=\"tao-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n <button\n v-else\n type=\"button\"\n class=\"tao-pagination__btn\"\n :class=\"{ 'tao-pagination__btn--current': item.page === current }\"\n :aria-current=\"item.page === current ? 'page' : undefined\"\n :aria-label=\"`Страница ${item.page}`\"\n :disabled=\"disabled\"\n @click=\"goTo(item.page)\"\n >\n {{ item.page }}\n </button>\n </template>\n\n <button\n type=\"button\"\n class=\"tao-pagination__btn\"\n aria-label=\"Вперёд\"\n :disabled=\"disabled || current >= pageCount\"\n @click=\"goTo(current + 1)\"\n >\n ›\n </button>\n </div>\n </nav>\n</template>\n\n<style scoped>\n.tao-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--tao-space-3);\n width: 100%;\n}\n\n.tao-pagination__total {\n margin: 0;\n font-size: var(--tao-font-size-sm);\n color: var(--tao-color-text-muted);\n}\n\n.tao-pagination__pages {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--tao-space-1);\n}\n\n.tao-pagination__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 36px;\n height: 36px;\n padding: 0 var(--tao-space-2);\n border: 1px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-control);\n background: var(--tao-color-surface-sunken);\n color: var(--tao-color-text);\n font-family: inherit;\n font-size: var(--tao-font-size-md);\n line-height: 1;\n cursor: pointer;\n transition: var(--tao-transition-base);\n}\n\n.tao-pagination--small .tao-pagination__btn {\n min-width: 28px;\n height: 28px;\n font-size: var(--tao-font-size-xs);\n}\n\n.tao-pagination__btn:hover:not(:disabled) {\n background: var(--tao-color-surface-hover);\n color: var(--tao-color-text-strong);\n}\n\n.tao-pagination__btn:focus-visible {\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-pagination__btn--current {\n background: var(--tao-color-accent);\n border-color: var(--tao-color-accent);\n color: var(--tao-color-on-accent);\n}\n\n.tao-pagination__btn--current:hover:not(:disabled) {\n background: var(--tao-color-accent-hover);\n color: var(--tao-color-on-accent);\n}\n\n.tao-pagination__btn--jump {\n color: var(--tao-color-text-muted);\n}\n\n.tao-pagination__btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.tao-pagination__ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n color: var(--tao-color-text-muted);\n user-select: none;\n}\n</style>\n","<script lang=\"ts\" setup>\ndefineOptions({ name: 'TaoEmpty' });\n\nwithDefaults(\n defineProps<{\n title?: string;\n }>(),\n {\n title: 'Ничего нет',\n },\n);\n</script>\n\n<template>\n <div class=\"tao-empty\">\n <div v-if=\"$slots.icon\" class=\"tao-empty__icon\">\n <slot name=\"icon\" />\n </div>\n <p v-if=\"title\" class=\"tao-empty__title\">{{ title }}</p>\n <p v-if=\"$slots.default\" class=\"tao-empty__text\"><slot /></p>\n <div v-if=\"$slots.action\" class=\"tao-empty__action\">\n <slot name=\"action\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--tao-space-2);\n padding: var(--tao-space-8) var(--tao-space-4);\n text-align: center;\n}\n\n.tao-empty__icon {\n color: var(--tao-color-text-muted);\n font-size: 32px;\n line-height: 1;\n}\n\n.tao-empty__title {\n margin: 0;\n font-size: var(--tao-font-size-lg);\n font-weight: 600;\n color: var(--tao-color-text-strong);\n}\n\n.tao-empty__text {\n margin: 0;\n max-width: 36ch;\n font-size: var(--tao-font-size-sm);\n color: var(--tao-color-text-muted);\n line-height: 1.5;\n}\n\n.tao-empty__action {\n margin-top: var(--tao-space-2);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'TaoSkeleton' });\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'text' | 'title' | 'circle' | 'rect';\n lines?: number;\n width?: string;\n height?: string;\n }>(),\n {\n variant: 'text',\n lines: 1,\n width: '',\n height: '',\n },\n);\n\nconst count = computed(() => Math.max(1, props.lines));\n</script>\n\n<template>\n <div class=\"tao-skeleton-group\" :aria-hidden=\"true\">\n <span\n v-for=\"index in count\"\n :key=\"index\"\n class=\"tao-skeleton\"\n :class=\"`tao-skeleton--${variant}`\"\n :style=\"{ width: width || undefined, height: height || undefined }\"\n />\n </div>\n</template>\n\n<style scoped>\n.tao-skeleton-group {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-2);\n width: 100%;\n}\n\n.tao-skeleton {\n display: block;\n background: var(--tao-color-surface-sunken);\n border-radius: var(--tao-radius-control);\n animation: tao-skeleton-pulse 1.2s var(--tao-ease-base) infinite;\n}\n\n.tao-skeleton--text {\n height: 12px;\n width: 100%;\n}\n\n.tao-skeleton--text:last-child:not(:only-child) {\n width: 72%;\n}\n\n.tao-skeleton--title {\n height: 20px;\n width: 40%;\n border-radius: var(--tao-radius-control);\n}\n\n.tao-skeleton--circle {\n width: 40px;\n height: 40px;\n border-radius: var(--tao-radius-full);\n}\n\n.tao-skeleton--rect {\n width: 100%;\n height: 80px;\n border-radius: var(--tao-radius-panel);\n}\n\n@keyframes tao-skeleton-pulse {\n 0%,\n 100% {\n opacity: 0.55;\n }\n 50% {\n opacity: 1;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\nimport { getFocusable, trapTab } from '../focusTrap';\n\ndefineOptions({ name: 'TaoDrawer' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean;\n title?: string;\n side?: 'left' | 'right';\n closable?: boolean;\n }>(),\n {\n title: '',\n side: 'right',\n closable: true,\n },\n);\n\nconst emit = defineEmits(['update:modelValue', 'close']);\n\nconst panelRef = ref<HTMLElement | null>(null);\nconst titleId = useId();\nlet previousOverflow = '';\nlet previousFocus: HTMLElement | null = null;\nlet scrollLocked = false;\n\nfunction close() {\n if (!props.closable) {\n return;\n }\n emit('update:modelValue', false);\n emit('close');\n}\n\nfunction lockBodyScroll() {\n if (scrollLocked) {\n return;\n }\n previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n scrollLocked = true;\n}\n\nfunction unlockBodyScroll() {\n if (!scrollLocked) {\n return;\n }\n document.body.style.overflow = previousOverflow;\n previousOverflow = '';\n scrollLocked = false;\n}\n\nfunction restoreFocus() {\n previousFocus?.focus?.();\n previousFocus = null;\n}\n\nasync function focusPanel() {\n await nextTick();\n const panel = panelRef.value;\n if (!panel) {\n return;\n }\n const first = getFocusable(panel)[0];\n (first ?? panel).focus();\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault();\n close();\n return;\n }\n if (panelRef.value) {\n trapTab(event, panelRef.value);\n }\n}\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (isOpen) {\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n lockBodyScroll();\n void focusPanel();\n return;\n }\n unlockBodyScroll();\n restoreFocus();\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n unlockBodyScroll();\n});\n</script>\n\n<template>\n <Teleport to=\"body\">\n <Transition :name=\"`tao-drawer-${side}`\">\n <div v-if=\"modelValue\" class=\"tao-drawer\" :class=\"`tao-drawer--${side}`\" @keydown=\"onKeydown\">\n <div class=\"tao-drawer__overlay\" @click=\"close\"></div>\n <aside\n ref=\"panelRef\"\n class=\"tao-drawer__panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"title ? titleId : undefined\"\n tabindex=\"-1\"\n >\n <div v-if=\"title || closable\" class=\"tao-drawer__header\">\n <h2 v-if=\"title\" :id=\"titleId\" class=\"tao-drawer__title\">{{ title }}</h2>\n <span v-else></span>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"tao-drawer__close\"\n aria-label=\"Закрыть\"\n @click=\"close\"\n >\n ×\n </button>\n </div>\n <div class=\"tao-drawer__content\">\n <slot />\n </div>\n <div v-if=\"$slots.footer\" class=\"tao-drawer__footer\">\n <slot name=\"footer\" />\n </div>\n </aside>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style scoped>\n.tao-drawer {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n}\n\n.tao-drawer--right {\n justify-content: flex-end;\n}\n\n.tao-drawer--left {\n justify-content: flex-start;\n}\n\n.tao-drawer__overlay {\n position: absolute;\n inset: 0;\n background: var(--tao-color-overlay);\n}\n\n.tao-drawer__panel {\n position: relative;\n display: flex;\n flex-direction: column;\n width: min(360px, 100%);\n height: 100%;\n background: var(--tao-color-surface-raised);\n box-shadow: var(--tao-shadow-overlay);\n}\n\n.tao-drawer__panel:focus {\n outline: none;\n}\n\n.tao-drawer__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tao-space-3);\n padding: var(--tao-space-4);\n border-bottom: 1px solid var(--tao-color-border);\n}\n\n.tao-drawer__title {\n margin: 0;\n font-size: var(--tao-font-size-lg);\n font-weight: 600;\n color: var(--tao-color-text-strong);\n}\n\n.tao-drawer__close {\n background: none;\n border: none;\n padding: 0;\n font-size: 24px;\n line-height: 1;\n color: var(--tao-color-text);\n cursor: pointer;\n}\n\n.tao-drawer__close:hover {\n color: var(--tao-color-text-strong);\n}\n\n.tao-drawer__close:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n border-radius: var(--tao-radius-control);\n}\n\n.tao-drawer__content {\n flex: 1;\n min-height: 0;\n overflow: auto;\n padding: var(--tao-space-4);\n}\n\n.tao-drawer__footer {\n padding: var(--tao-space-4);\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-drawer-right-enter-active,\n.tao-drawer-right-leave-active,\n.tao-drawer-left-enter-active,\n.tao-drawer-left-leave-active {\n transition: opacity var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-drawer-right-enter-active .tao-drawer__panel,\n.tao-drawer-right-leave-active .tao-drawer__panel,\n.tao-drawer-left-enter-active .tao-drawer__panel,\n.tao-drawer-left-leave-active .tao-drawer__panel {\n transition: transform var(--tao-duration-slow) var(--tao-ease-base);\n}\n\n.tao-drawer-right-enter-from,\n.tao-drawer-right-leave-to,\n.tao-drawer-left-enter-from,\n.tao-drawer-left-leave-to {\n opacity: 0;\n}\n\n.tao-drawer-right-enter-from .tao-drawer__panel,\n.tao-drawer-right-leave-to .tao-drawer__panel {\n transform: translateX(100%);\n}\n\n.tao-drawer-left-enter-from .tao-drawer__panel,\n.tao-drawer-left-leave-to .tao-drawer__panel {\n transform: translateX(-100%);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'TaoAvatar' });\n\nconst props = withDefaults(\n defineProps<{\n src?: string;\n name?: string;\n alt?: string;\n size?: 's' | 'm' | 'l';\n }>(),\n {\n src: '',\n name: '',\n alt: '',\n size: 'm',\n },\n);\n\nconst initials = computed(() => {\n const parts = props.name.trim().split(/\\s+/).filter(Boolean);\n if (!parts.length) {\n return '';\n }\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase();\n }\n return `${parts[0][0] ?? ''}${parts[1][0] ?? ''}`.toUpperCase();\n});\n\nconst label = computed(() => props.alt || props.name || 'Аватар');\n</script>\n\n<template>\n <span class=\"tao-avatar\" :class=\"`tao-avatar--${size}`\" :title=\"name || undefined\">\n <img v-if=\"src\" class=\"tao-avatar__img\" :src=\"src\" :alt=\"label\" />\n <span v-else class=\"tao-avatar__fallback\" :aria-label=\"label\">{{ initials || '?' }}</span>\n </span>\n</template>\n\n<style scoped>\n.tao-avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n flex-shrink: 0;\n background: var(--tao-color-accent-subtle);\n color: var(--tao-color-accent);\n border-radius: var(--tao-radius-full);\n font-weight: 600;\n line-height: 1;\n user-select: none;\n}\n\n.tao-avatar--s {\n width: 24px;\n height: 24px;\n font-size: 10px;\n}\n\n.tao-avatar--m {\n width: 32px;\n height: 32px;\n font-size: var(--tao-font-size-xs);\n}\n\n.tao-avatar--l {\n width: 48px;\n height: 48px;\n font-size: var(--tao-font-size-md);\n}\n\n.tao-avatar__img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.tao-avatar__fallback {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport TaoLink from './TaoLink.vue';\nimport type { TaoBreadcrumbItem } from '../breadcrumb';\n\ndefineOptions({ name: 'TaoBreadcrumb' });\n\ndefineProps<{\n items: TaoBreadcrumbItem[];\n}>();\n</script>\n\n<template>\n <nav class=\"tao-breadcrumb\" aria-label=\"Хлебные крошки\">\n <ol class=\"tao-breadcrumb__list\">\n <li v-for=\"(item, index) in items\" :key=\"`${item.label}-${index}`\" class=\"tao-breadcrumb__item\">\n <span v-if=\"index > 0\" class=\"tao-breadcrumb__sep\" aria-hidden=\"true\">/</span>\n <span v-if=\"index === items.length - 1\" class=\"tao-breadcrumb__current\" aria-current=\"page\">\n {{ item.label }}\n </span>\n <TaoLink v-else-if=\"item.to\" class=\"tao-breadcrumb__link\" :to=\"item.to\">{{ item.label }}</TaoLink>\n <span v-else class=\"tao-breadcrumb__link\">{{ item.label }}</span>\n </li>\n </ol>\n </nav>\n</template>\n\n<style scoped>\n.tao-breadcrumb__list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--tao-space-1);\n margin: 0;\n padding: 0;\n list-style: none;\n font-size: var(--tao-font-size-sm);\n}\n\n.tao-breadcrumb__item {\n display: inline-flex;\n align-items: center;\n gap: var(--tao-space-1);\n}\n\n.tao-breadcrumb__sep {\n color: var(--tao-color-text-muted);\n}\n\n.tao-breadcrumb__link {\n color: var(--tao-color-text-muted);\n}\n\n.tao-breadcrumb__current {\n color: var(--tao-color-text-strong);\n font-weight: 500;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'TaoCounter' });\n\nconst props = withDefaults(\n defineProps<{\n value?: number;\n maxDigits?: number;\n }>(),\n {\n value: 0,\n maxDigits: 9,\n },\n);\n\ntype Slot = {\n value: string;\n isSpace: boolean;\n isLeadingZero: boolean;\n key: string;\n};\n\nfunction formatDigits(num: number, minDigits: number) {\n const abs = Math.abs(Math.trunc(num));\n return abs.toString().padStart(Math.max(1, minDigits), '0').replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\n\nconst slots = computed(() => {\n const formatted = formatDigits(props.value, props.maxDigits);\n const significant = Math.abs(Math.trunc(props.value)).toString();\n const leadingZeros = Math.max(0, props.maxDigits - significant.length);\n const result: Slot[] = [];\n let digitCount = 0;\n\n if (props.value < 0) {\n result.push({\n value: '−',\n isSpace: false,\n isLeadingZero: false,\n key: 'sign',\n });\n }\n\n for (let index = 0; index < formatted.length; index += 1) {\n const char = formatted[index] ?? '';\n if (char === ' ') {\n result.push({\n value: ' ',\n isSpace: true,\n isLeadingZero: false,\n key: `space-${index}`,\n });\n continue;\n }\n\n result.push({\n value: char,\n isSpace: false,\n isLeadingZero: digitCount < leadingZeros,\n key: `${index}-${char}`,\n });\n digitCount += 1;\n }\n\n return result;\n});\n</script>\n\n<template>\n <div class=\"tao-counter\" role=\"img\" :aria-label=\"String(value)\">\n <div class=\"tao-counter__row\" aria-hidden=\"true\">\n <div\n v-for=\"(slot, index) in slots\"\n :key=\"`${index}-${slot.isSpace ? 'gap' : 'd'}`\"\n class=\"tao-counter__slot\"\n :class=\"{ 'tao-counter__slot--space': slot.isSpace }\"\n >\n <TransitionGroup name=\"tao-digit\">\n <span\n v-if=\"!slot.isSpace\"\n :key=\"slot.key\"\n class=\"tao-counter__digit\"\n :class=\"{ 'tao-counter__digit--muted': slot.isLeadingZero }\"\n >\n {{ slot.value }}\n </span>\n </TransitionGroup>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-counter {\n display: inline-flex;\n color: var(--tao-color-accent);\n font-size: 28px;\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n line-height: 1;\n}\n\n.tao-counter__row {\n display: inline-flex;\n gap: 3px;\n}\n\n.tao-counter__slot {\n position: relative;\n overflow: hidden;\n width: 1.15em;\n height: 1.55em;\n border-radius: var(--tao-radius-sm);\n background: var(--tao-color-surface-sunken);\n}\n\n.tao-counter__slot--space {\n width: 0.28em;\n background: transparent;\n}\n\n.tao-counter__digit {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.tao-counter__digit--muted {\n color: var(--tao-color-text-muted);\n opacity: 0.45;\n}\n\n.tao-digit-enter-from {\n transform: translateY(100%) rotateX(-90deg);\n filter: blur(8px);\n opacity: 0;\n}\n\n.tao-digit-leave-to {\n transform: translateY(-100%) rotateX(90deg);\n filter: blur(8px);\n opacity: 0;\n}\n\n.tao-digit-enter-active,\n.tao-digit-leave-active {\n transition:\n transform var(--tao-duration-slow) cubic-bezier(0.68, -0.55, 0.265, 1.55),\n filter var(--tao-duration-slow) var(--tao-ease-base),\n opacity var(--tao-duration-slow) var(--tao-ease-base);\n}\n\n@media (max-width: 450px) {\n .tao-counter {\n font-size: 22px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, nextTick, onBeforeUnmount, onMounted, onUpdated, ref, watch } from 'vue';\n\ndefineOptions({ name: 'TaoCarousel' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: number;\n peek?: number;\n /** How many slides fit in the viewport. 5 = product strip. 1 = one card. */\n perView?: number;\n controls?: boolean;\n /** Interval in ms. 0 — off. Pauses on hover, focus, drag, and reduced motion. */\n autoplay?: number;\n loop?: boolean;\n /** Pips under the track: one per snap. Inactive are dots, the current one stretches into a pill. */\n dots?: boolean;\n ariaLabel?: string;\n }>(),\n {\n modelValue: 0,\n peek: 0,\n perView: 1,\n controls: true,\n autoplay: 0,\n loop: false,\n dots: false,\n ariaLabel: 'Лента',\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number];\n change: [value: number];\n}>();\n\ndefineSlots<{\n default(): unknown;\n prev(props: { disabled: boolean; go: () => void }): unknown;\n next(props: { disabled: boolean; go: () => void }): unknown;\n dots(props: { index: number; count: number; go: (next: number) => void }): unknown;\n dot(props: { active: boolean; index: number; go: () => void }): unknown;\n}>();\n\nconst track = ref<HTMLElement | null>(null);\nconst index = ref(props.modelValue);\nconst count = ref(0);\nconst dragging = ref(false);\nconst hoverPaused = ref(false);\nconst focusPaused = ref(false);\n\nlet dragStartX = 0;\nlet dragStartScroll = 0;\nlet dragMoved = 0;\nlet dragPointer = -1;\nlet scrollFrame = 0;\nlet autoplayTimer = 0;\n\nconst step = computed(() => Math.max(1, Math.round(props.perView)));\nconst lastIndex = computed(() => Math.max(count.value - step.value, 0));\nconst atStart = computed(() => !props.loop && index.value <= 0);\nconst atEnd = computed(() => !props.loop && index.value >= lastIndex.value);\nconst snapCount = computed(() => (count.value <= 0 ? 0 : lastIndex.value + 1));\nconst showControls = computed(() => props.controls && count.value > step.value);\nconst showDots = computed(() => props.dots && snapCount.value > 1);\n\nconst trackStyle = computed(() => ({\n '--tao-carousel-peek': `${Math.max(props.peek, 0)}px`,\n '--tao-carousel-per-view': String(step.value),\n}));\n\nfunction prefersReducedMotion() {\n return typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\nfunction metrics() {\n const el = track.value;\n if (!el || el.children.length === 0) {\n return { width: 0, gap: 0, total: 0 };\n }\n\n const styles = getComputedStyle(el);\n const gap = Number.parseFloat(styles.columnGap || styles.gap) || 0;\n const width = (el.children[0] as HTMLElement).getBoundingClientRect().width;\n return { width, gap, total: el.children.length };\n}\n\nfunction nearestIndex(scrollLeft?: number) {\n const { width, gap, total } = metrics();\n if (width <= 0 || total <= 0) {\n return 0;\n }\n\n const left = scrollLeft ?? track.value?.scrollLeft ?? 0;\n return Math.min(Math.max(Math.round(left / (width + gap)), 0), total - 1);\n}\n\nfunction setIndex(next: number) {\n if (next === index.value) {\n return;\n }\n\n index.value = next;\n emit('update:modelValue', next);\n emit('change', next);\n}\n\nfunction refreshCount() {\n count.value = track.value?.children.length ?? 0;\n}\n\nfunction goPrev() {\n goTo(index.value - step.value);\n}\n\nfunction goNext() {\n goTo(index.value + step.value);\n}\n\nfunction goTo(next: number) {\n const el = track.value;\n const { width, gap, total } = metrics();\n if (!el || width <= 0 || total <= 0) {\n return;\n }\n\n const last = Math.max(total - step.value, 0);\n let page = next;\n let wrapping = false;\n if (props.loop && total > step.value) {\n if (page > last) {\n page = 0;\n wrapping = true;\n } else if (page < 0) {\n page = last;\n wrapping = true;\n }\n } else {\n page = Math.min(Math.max(next, 0), last);\n }\n\n el.scrollTo({\n left: page * (width + gap),\n behavior: prefersReducedMotion() || dragging.value || wrapping ? 'auto' : 'smooth',\n });\n setIndex(page);\n}\n\nfunction stopAutoplay() {\n window.clearInterval(autoplayTimer);\n autoplayTimer = 0;\n}\n\nfunction canAutoplay() {\n return (\n props.autoplay > 0 &&\n count.value > step.value &&\n !hoverPaused.value &&\n !focusPaused.value &&\n !dragging.value &&\n typeof document !== 'undefined' &&\n !document.hidden &&\n !prefersReducedMotion()\n );\n}\n\nfunction tickAutoplay() {\n if (!canAutoplay()) {\n return;\n }\n\n if (!props.loop && index.value >= lastIndex.value) {\n stopAutoplay();\n return;\n }\n\n goTo(index.value + step.value);\n}\n\nfunction syncAutoplay() {\n stopAutoplay();\n if (!canAutoplay()) {\n return;\n }\n\n autoplayTimer = window.setInterval(tickAutoplay, props.autoplay);\n}\n\nfunction onMouseEnter() {\n hoverPaused.value = true;\n stopAutoplay();\n}\n\nfunction onMouseLeave() {\n hoverPaused.value = false;\n syncAutoplay();\n}\n\nfunction onFocusIn() {\n focusPaused.value = true;\n stopAutoplay();\n}\n\nfunction onFocusOut(event: FocusEvent) {\n const root = event.currentTarget as HTMLElement;\n const next = event.relatedTarget as Node | null;\n if (next && root.contains(next)) {\n return;\n }\n\n focusPaused.value = false;\n syncAutoplay();\n}\n\nfunction onScroll() {\n if (dragging.value) {\n return;\n }\n\n cancelAnimationFrame(scrollFrame);\n scrollFrame = requestAnimationFrame(() => {\n setIndex(nearestIndex());\n });\n}\n\nfunction onPointerDown(event: PointerEvent) {\n if (event.pointerType !== 'mouse' || event.button !== 0 || !track.value) {\n return;\n }\n\n dragPointer = event.pointerId;\n dragStartX = event.clientX;\n dragStartScroll = track.value.scrollLeft;\n dragMoved = 0;\n dragging.value = true;\n track.value.setPointerCapture(event.pointerId);\n}\n\nfunction onPointerMove(event: PointerEvent) {\n if (!dragging.value || event.pointerId !== dragPointer || !track.value) {\n return;\n }\n\n const dx = event.clientX - dragStartX;\n dragMoved = Math.abs(dx);\n track.value.scrollLeft = dragStartScroll - dx;\n}\n\nfunction onPointerUp(event: PointerEvent) {\n if (!dragging.value || event.pointerId !== dragPointer) {\n return;\n }\n\n dragging.value = false;\n dragPointer = -1;\n goTo(nearestIndex());\n syncAutoplay();\n}\n\nfunction onClickCapture(event: MouseEvent) {\n if (dragMoved > 6) {\n event.preventDefault();\n event.stopPropagation();\n dragMoved = 0;\n }\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n goPrev();\n return;\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n goNext();\n }\n}\n\nwatch(\n () => props.modelValue,\n (value) => {\n if (value !== index.value) {\n goTo(value);\n }\n },\n);\n\nwatch(\n () => [props.autoplay, props.loop, count.value, dragging.value] as const,\n () => syncAutoplay(),\n);\n\nonMounted(() => {\n refreshCount();\n nextTick(() => {\n goTo(props.modelValue);\n syncAutoplay();\n });\n document.addEventListener('visibilitychange', syncAutoplay);\n});\n\nonUpdated(refreshCount);\n\nonBeforeUnmount(() => {\n cancelAnimationFrame(scrollFrame);\n stopAutoplay();\n document.removeEventListener('visibilitychange', syncAutoplay);\n});\n</script>\n\n<template>\n <div\n class=\"tao-carousel\"\n :style=\"trackStyle\"\n @mouseenter=\"onMouseEnter\"\n @mouseleave=\"onMouseLeave\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <div class=\"tao-carousel__row\">\n <slot name=\"prev\" :disabled=\"atStart\" :go=\"goPrev\">\n <button\n v-if=\"showControls\"\n type=\"button\"\n class=\"tao-carousel__nav\"\n aria-label=\"Назад\"\n :disabled=\"atStart\"\n @click=\"goPrev\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M14.5 5 8 12l6.5 7\"\n />\n </svg>\n </button>\n </slot>\n\n <div\n ref=\"track\"\n class=\"tao-carousel__track\"\n :class=\"{ 'tao-carousel__track--dragging': dragging }\"\n role=\"region\"\n :aria-label=\"ariaLabel\"\n tabindex=\"0\"\n @scroll=\"onScroll\"\n @keydown=\"onKeydown\"\n @pointerdown=\"onPointerDown\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerUp\"\n @pointercancel=\"onPointerUp\"\n @click.capture=\"onClickCapture\"\n >\n <slot />\n </div>\n\n <slot name=\"next\" :disabled=\"atEnd\" :go=\"goNext\">\n <button\n v-if=\"showControls\"\n type=\"button\"\n class=\"tao-carousel__nav\"\n aria-label=\"Вперёд\"\n :disabled=\"atEnd\"\n @click=\"goNext\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M9.5 5 16 12l-6.5 7\"\n />\n </svg>\n </button>\n </slot>\n </div>\n\n <slot name=\"dots\" :index=\"index\" :count=\"snapCount\" :go=\"goTo\">\n <div v-if=\"showDots\" class=\"tao-carousel__dots\" role=\"group\" aria-label=\"Слайды\">\n <button\n v-for=\"n in snapCount\"\n :key=\"n\"\n type=\"button\"\n class=\"tao-carousel__dot\"\n :class=\"{ 'tao-carousel__dot--active': n - 1 === index }\"\n :aria-label=\"`Слайд ${n} из ${snapCount}`\"\n :aria-current=\"n - 1 === index ? 'true' : undefined\"\n @click=\"goTo(n - 1)\"\n >\n <slot name=\"dot\" :active=\"n - 1 === index\" :index=\"n - 1\" :go=\"() => goTo(n - 1)\">\n <span class=\"tao-carousel__pip\" />\n </slot>\n </button>\n </div>\n </slot>\n </div>\n</template>\n\n<style scoped>\n.tao-carousel {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-2);\n width: 100%;\n}\n\n.tao-carousel__row {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n width: 100%;\n}\n\n.tao-carousel__track {\n display: flex;\n flex: 1 1 auto;\n gap: var(--tao-space-3);\n min-width: 0;\n overflow-x: auto;\n overscroll-behavior-x: contain;\n scroll-snap-type: x mandatory;\n scroll-padding-inline: 0;\n scrollbar-width: none;\n user-select: none;\n touch-action: pan-x;\n cursor: grab;\n}\n\n.tao-carousel__track::-webkit-scrollbar {\n display: none;\n}\n\n.tao-carousel__track--dragging {\n scroll-snap-type: none;\n cursor: grabbing;\n}\n\n.tao-carousel__track:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n\n.tao-carousel__track > :deep(*) {\n box-sizing: border-box;\n flex: 0 0 auto;\n width: max(\n 96px,\n calc(\n (100% - var(--tao-carousel-peek, 0px) - (var(--tao-carousel-per-view, 1) - 1) * var(--tao-space-3)) /\n var(--tao-carousel-per-view, 1)\n )\n );\n min-width: 0;\n scroll-snap-align: start;\n}\n\n.tao-carousel__nav {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n margin: 0;\n padding: 0;\n border: 1px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-full);\n background: var(--tao-color-surface-sunken);\n color: var(--tao-color-text);\n font: inherit;\n font-size: 0;\n line-height: 0;\n cursor: pointer;\n transition: var(--tao-transition-base);\n}\n\n.tao-carousel__nav svg {\n display: block;\n}\n\n.tao-carousel__nav:hover:not(:disabled) {\n background: var(--tao-color-surface-hover);\n color: var(--tao-color-text-strong);\n}\n\n.tao-carousel__nav:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n\n.tao-carousel__nav:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.tao-carousel__dots {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n gap: 2px;\n}\n\n.tao-carousel__dot {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.tao-carousel__pip {\n display: block;\n width: 6px;\n height: 6px;\n border-radius: var(--tao-radius-full);\n background: var(--tao-color-border-strong);\n transition: width var(--tao-duration-base) var(--tao-ease-base), background var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-carousel__dot--active .tao-carousel__pip {\n width: 18px;\n background: var(--tao-color-accent);\n}\n\n.tao-carousel__dot:hover:not(.tao-carousel__dot--active) .tao-carousel__pip {\n background: var(--tao-color-text-muted);\n}\n\n.tao-carousel__dot:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n border-radius: var(--tao-radius-full);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .tao-carousel__track {\n scroll-behavior: auto;\n }\n\n .tao-carousel__pip {\n transition: none;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport type { TaoStageItem, TaoStageStatus } from '../stage';\n\ndefineOptions({ name: 'TaoStages' });\n\nconst props = withDefaults(\n defineProps<{\n items?: TaoStageItem[];\n vertical?: boolean;\n ariaLabel?: string;\n }>(),\n {\n items: () => [],\n vertical: true,\n ariaLabel: 'Стадии',\n },\n);\n\ndefineSlots<{\n default(props: { item: TaoStageItem; index: number; status: TaoStageStatus }): unknown;\n icon(props: { item: TaoStageItem; index: number; status: TaoStageStatus }): unknown;\n}>();\n\nconst statusText: Record<TaoStageStatus, string> = {\n wait: 'ожидание',\n work: 'в работе',\n ok: 'готово',\n bad: 'ошибка',\n};\n\nfunction statusOf(item: TaoStageItem): TaoStageStatus {\n return item.status ?? 'wait';\n}\n\nfunction itemLabel(item: TaoStageItem): string {\n return `${item.label ?? item.key}, ${statusText[statusOf(item)]}`;\n}\n</script>\n\n<template>\n <ul\n class=\"tao-stages\"\n :class=\"{ 'tao-stages--horizontal': !props.vertical }\"\n :aria-label=\"ariaLabel\"\n >\n <li\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n class=\"tao-stages__item\"\n :class=\"`tao-stages__item--${statusOf(item)}`\"\n :aria-label=\"itemLabel(item)\"\n >\n <span class=\"tao-stages__ico\" aria-hidden=\"true\">\n <slot name=\"icon\" :item=\"item\" :index=\"index\" :status=\"statusOf(item)\">\n <svg v-if=\"statusOf(item) === 'ok'\" class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M3.5 8.5 6.5 11.5 12.5 4.5\"\n />\n </svg>\n <svg v-else-if=\"statusOf(item) === 'bad'\" class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n d=\"M4.5 4.5 11.5 11.5M11.5 4.5 4.5 11.5\"\n />\n </svg>\n <svg v-else-if=\"statusOf(item) === 'work'\" class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\n <circle cx=\"8\" cy=\"8\" r=\"5.2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-dasharray=\"20 10\" stroke-linecap=\"round\" />\n </svg>\n <svg v-else class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\n <circle cx=\"8\" cy=\"8\" r=\"5.2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n </svg>\n </slot>\n </span>\n <span class=\"tao-stages__label\">\n <slot :item=\"item\" :index=\"index\" :status=\"statusOf(item)\">{{ item.label ?? item.key }}</slot>\n </span>\n </li>\n </ul>\n</template>\n\n<style scoped>\n.tao-stages {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n font-size: var(--tao-font-size-xs);\n color: var(--tao-color-text);\n}\n\n.tao-stages--horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n column-gap: var(--tao-space-4);\n}\n\n.tao-stages__item {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n min-width: 0;\n}\n\n.tao-stages__ico {\n display: inline-flex;\n flex: 0 0 auto;\n color: inherit;\n}\n\n.tao-stages__mark {\n display: block;\n}\n\n.tao-stages__label {\n min-width: 0;\n}\n\n.tao-stages__item--wait {\n color: var(--tao-color-text-muted);\n}\n\n.tao-stages__item--work .tao-stages__ico {\n color: var(--tao-color-accent);\n}\n\n.tao-stages__item--ok .tao-stages__ico {\n color: var(--tao-color-success);\n}\n\n.tao-stages__item--bad .tao-stages__ico {\n color: var(--tao-color-danger);\n}\n\n.tao-stages__item--work .tao-stages__mark {\n animation: tao-stages-spin 1.1s linear infinite;\n}\n\n@keyframes tao-stages-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .tao-stages__item--work .tao-stages__mark {\n animation: none;\n }\n}\n</style>\n","import { computed, ref } from 'vue';\nimport type { TaoToastDefaults, TaoToastPosition, TaoToastRecord } from './types';\n\nexport const TOAST_POSITIONS: TaoToastPosition[] = [\n 'topRight',\n 'topLeft',\n 'topCenter',\n 'bottomRight',\n 'bottomLeft',\n 'bottomCenter',\n 'center',\n];\n\nexport const toastDefaults: TaoToastDefaults = {\n position: 'topCenter',\n timeout: 3000,\n closable: true,\n progress: true,\n};\n\nexport const toasts = ref<TaoToastRecord[]>([]);\n\nexport const toastsByPosition = computed(() => {\n const grouped = {} as Record<TaoToastPosition, TaoToastRecord[]>;\n\n for (const position of TOAST_POSITIONS) {\n grouped[position] = [];\n }\n\n for (const toast of toasts.value) {\n grouped[toast.position].push(toast);\n }\n\n return grouped;\n});\n\nexport function configureToastDefaults(partial: Partial<TaoToastDefaults>) {\n Object.assign(toastDefaults, partial);\n}\n\nexport function addToast(record: TaoToastRecord) {\n if (record.displayMode === 'once' && record.dedupeId) {\n const exists = toasts.value.some((item) => item.dedupeId === record.dedupeId);\n if (exists) {\n return;\n }\n }\n\n if (record.displayMode === 'replace' && record.dedupeId) {\n toasts.value = toasts.value.filter((item) => item.dedupeId !== record.dedupeId);\n }\n\n toasts.value = [...toasts.value, record];\n}\n\nexport function removeToast(id: string) {\n const item = toasts.value.find((toast) => toast.id === id);\n if (!item) {\n return;\n }\n\n toasts.value = toasts.value.filter((toast) => toast.id !== id);\n item.onClosed?.();\n}\n\nexport function dismissToasts(id?: string) {\n if (id) {\n removeToast(id);\n return;\n }\n\n const items = toasts.value;\n toasts.value = [];\n items.forEach((item) => item.onClosed?.());\n}\n\nlet viewportMounts = 0;\n\nexport function registerToastViewport() {\n viewportMounts += 1;\n}\n\nexport function unregisterToastViewport() {\n viewportMounts = Math.max(0, viewportMounts - 1);\n}\n\nexport function hasToastViewport() {\n if (viewportMounts > 0) {\n return true;\n }\n\n if (typeof document === 'undefined') {\n return false;\n }\n\n return Boolean(document.querySelector('[data-tao-toast-viewport]'));\n}\n","<script lang=\"ts\" setup>\nimport { onBeforeUnmount, ref } from 'vue';\nimport TaoButton from './TaoButton.vue';\nimport TaoIcon from './TaoIcon.vue';\nimport { removeToast } from '../toast/store';\nimport type { TaoToastRecord } from '../toast/types';\n\nconst props = defineProps<{\n toast: TaoToastRecord;\n}>();\n\nconst paused = ref(false);\nlet remaining = props.toast.timeout;\nlet startedAt = 0;\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nfunction clearTimer() {\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n}\n\nfunction startTimer() {\n if (!props.toast.timeout) {\n return;\n }\n\n startedAt = Date.now();\n clearTimer();\n timer = setTimeout(() => removeToast(props.toast.id), remaining);\n}\n\nfunction pause() {\n if (paused.value || !props.toast.timeout) {\n return;\n }\n\n remaining = Math.max(0, remaining - (Date.now() - startedAt));\n paused.value = true;\n clearTimer();\n}\n\nfunction resume() {\n if (!paused.value || !props.toast.timeout) {\n return;\n }\n\n paused.value = false;\n startTimer();\n}\n\nfunction close() {\n clearTimer();\n removeToast(props.toast.id);\n}\n\nfunction runAction(onClick: () => void) {\n onClick();\n close();\n}\n\nstartTimer();\n\nonBeforeUnmount(() => {\n clearTimer();\n});\n</script>\n\n<template>\n <div\n class=\"tao-toast\"\n :class=\"[`tao-toast--${toast.type}`, { 'tao-toast--paused': paused }]\"\n :role=\"toast.type === 'error' || toast.type === 'warning' ? 'alert' : 'status'\"\n aria-live=\"polite\"\n @mouseenter=\"pause\"\n @mouseleave=\"resume\"\n >\n <span class=\"tao-toast__accent\" aria-hidden=\"true\"></span>\n\n <span class=\"tao-toast__icon\" aria-hidden=\"true\">\n <TaoIcon v-if=\"toast.icon\" :name=\"toast.icon\" :size=\"18\" />\n <svg v-else-if=\"toast.type === 'success'\" viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M6 10.2 8.6 12.8 14 7.4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg v-else-if=\"toast.type === 'error'\" viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M7 7l6 6M13 7l-6 6\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n </svg>\n <svg v-else-if=\"toast.type === 'warning'\" viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\n <path d=\"M10 3.5 17.5 16.5H2.5L10 3.5Z\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\" />\n <path d=\"M10 8.2v4.2\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n <circle cx=\"10\" cy=\"14.4\" r=\"0.8\" fill=\"currentColor\" />\n </svg>\n <svg v-else viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M10 9v5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n <circle cx=\"10\" cy=\"6.4\" r=\"0.8\" fill=\"currentColor\" />\n </svg>\n </span>\n\n <div class=\"tao-toast__body\">\n <strong v-if=\"toast.title\" class=\"tao-toast__title\">{{ toast.title }}</strong>\n <p v-if=\"toast.message\" class=\"tao-toast__message\">{{ toast.message }}</p>\n <div v-if=\"toast.actions.length\" class=\"tao-toast__actions\">\n <TaoButton\n v-for=\"action in toast.actions\"\n :key=\"action.label\"\n size=\"small\"\n variant=\"secondary\"\n @click=\"runAction(action.onClick)\"\n >\n {{ action.label }}\n </TaoButton>\n </div>\n </div>\n\n <button\n v-if=\"toast.closable\"\n type=\"button\"\n class=\"tao-toast__close\"\n aria-label=\"Закрыть уведомление\"\n @click=\"close\"\n >\n ×\n </button>\n\n <span\n v-if=\"toast.progress && toast.timeout\"\n class=\"tao-toast__progress\"\n :style=\"{ animationDuration: `${toast.timeout}ms` }\"\n ></span>\n </div>\n</template>\n\n<style scoped>\n.tao-toast {\n --tao-toast-tone: var(--tao-color-accent);\n\n position: relative;\n display: flex;\n align-items: flex-start;\n gap: var(--tao-space-3);\n width: min(470px, calc(100vw - 32px));\n padding: var(--tao-space-3) var(--tao-space-4);\n overflow: hidden;\n background: color-mix(in srgb, var(--tao-toast-tone) 8%, var(--tao-color-surface-raised));\n color: var(--tao-color-text);\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-panel);\n box-shadow: var(--tao-shadow-overlay);\n pointer-events: auto;\n}\n\n.tao-toast--success {\n --tao-toast-tone: var(--tao-color-success);\n}\n\n.tao-toast--error {\n --tao-toast-tone: var(--tao-color-danger);\n}\n\n.tao-toast--warning {\n --tao-toast-tone: var(--tao-color-warning);\n}\n\n.tao-toast--info {\n --tao-toast-tone: var(--tao-color-info);\n}\n\n.tao-toast__accent {\n position: absolute;\n inset: 0 auto 0 0;\n width: 3px;\n background: var(--tao-toast-tone);\n}\n\n.tao-toast__icon {\n display: inline-flex;\n flex-shrink: 0;\n margin-top: 1px;\n color: var(--tao-toast-tone);\n}\n\n.tao-toast__body {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-1);\n min-width: 0;\n flex: 1;\n padding-right: var(--tao-space-4);\n}\n\n.tao-toast__title {\n font-size: var(--tao-font-size-md);\n font-weight: 600;\n color: var(--tao-color-text-strong);\n line-height: 1.3;\n}\n\n.tao-toast__message {\n margin: 0;\n font-size: var(--tao-font-size-sm);\n line-height: 1.45;\n color: var(--tao-color-text);\n}\n\n.tao-toast__actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--tao-space-2);\n margin-top: var(--tao-space-1);\n}\n\n.tao-toast__close {\n position: absolute;\n top: var(--tao-space-1);\n right: var(--tao-space-2);\n padding: 0;\n border: none;\n background: none;\n color: var(--tao-color-text-muted);\n font-size: 20px;\n line-height: 1;\n cursor: pointer;\n}\n\n.tao-toast__close:hover {\n color: var(--tao-color-text-strong);\n}\n\n.tao-toast__progress {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: 2px;\n transform-origin: left center;\n background: var(--tao-toast-tone);\n animation-name: tao-toast-progress;\n animation-timing-function: linear;\n animation-fill-mode: forwards;\n}\n\n.tao-toast--paused .tao-toast__progress {\n animation-play-state: paused;\n}\n\n@keyframes tao-toast-progress {\n from {\n transform: scaleX(1);\n }\n to {\n transform: scaleX(0);\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { onBeforeUnmount, onMounted } from 'vue';\nimport TaoToastItem from './TaoToastItem.vue';\nimport { registerToastViewport, toastsByPosition, TOAST_POSITIONS, unregisterToastViewport } from '../toast/store';\nimport type { TaoToastPosition } from '../toast/types';\n\ndefineOptions({ name: 'TaoToastViewport' });\n\nonMounted(() => {\n registerToastViewport();\n});\n\nonBeforeUnmount(() => {\n unregisterToastViewport();\n});\n\nfunction enterName(position: TaoToastPosition) {\n if (position === 'center') {\n return 'tao-toast-center';\n }\n\n if (position.startsWith('top')) {\n return 'tao-toast-top';\n }\n\n return 'tao-toast-bottom';\n}\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n v-for=\"position in TOAST_POSITIONS\"\n :key=\"position\"\n class=\"tao-toast-viewport\"\n :class=\"`tao-toast-viewport--${position}`\"\n data-tao-toast-viewport\n >\n <TransitionGroup :name=\"enterName(position)\" tag=\"div\" class=\"tao-toast-viewport__stack\">\n <div v-for=\"item in toastsByPosition[position]\" :key=\"item.id\" class=\"tao-toast-slot\">\n <div class=\"tao-toast-slot__inner\">\n <TaoToastItem :toast=\"item\" />\n </div>\n </div>\n </TransitionGroup>\n </div>\n </Teleport>\n</template>\n\n<style scoped>\n.tao-toast-viewport {\n position: fixed;\n z-index: 1100;\n display: flex;\n pointer-events: none;\n padding: var(--tao-space-4);\n}\n\n.tao-toast-viewport__stack {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-2);\n width: 100%;\n}\n\n.tao-toast-slot {\n display: grid;\n grid-template-rows: 1fr;\n}\n\n.tao-toast-slot__inner {\n min-height: 0;\n overflow: hidden;\n}\n\n.tao-toast-viewport--topRight {\n top: 0;\n right: 0;\n align-items: flex-end;\n}\n\n.tao-toast-viewport--topLeft {\n top: 0;\n left: 0;\n align-items: flex-start;\n}\n\n.tao-toast-viewport--topCenter {\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n}\n\n.tao-toast-viewport--bottomRight {\n right: 0;\n bottom: 0;\n align-items: flex-end;\n}\n\n.tao-toast-viewport--bottomRight .tao-toast-viewport__stack,\n.tao-toast-viewport--bottomLeft .tao-toast-viewport__stack,\n.tao-toast-viewport--bottomCenter .tao-toast-viewport__stack {\n flex-direction: column-reverse;\n}\n\n.tao-toast-viewport--bottomLeft {\n left: 0;\n bottom: 0;\n align-items: flex-start;\n}\n\n.tao-toast-viewport--bottomCenter {\n bottom: 0;\n left: 0;\n right: 0;\n justify-content: center;\n}\n\n.tao-toast-viewport--center {\n inset: 0;\n justify-content: center;\n align-items: center;\n}\n\n.tao-toast-top-enter-active,\n.tao-toast-bottom-enter-active,\n.tao-toast-center-enter-active {\n animation: tao-toast-bounce-in var(--tao-duration-slow) var(--tao-ease-base);\n}\n\n.tao-toast-top-leave-active,\n.tao-toast-bottom-leave-active,\n.tao-toast-center-leave-active {\n pointer-events: none;\n overflow: hidden;\n transition: grid-template-rows var(--tao-duration-slow) var(--tao-ease-base);\n}\n\n.tao-toast-top-leave-from,\n.tao-toast-bottom-leave-from,\n.tao-toast-center-leave-from {\n grid-template-rows: 1fr;\n}\n\n.tao-toast-top-leave-to,\n.tao-toast-bottom-leave-to,\n.tao-toast-center-leave-to {\n grid-template-rows: 0fr;\n}\n\n.tao-toast-top-leave-active .tao-toast-slot__inner,\n.tao-toast-center-leave-active .tao-toast-slot__inner {\n animation: tao-toast-fade-out-up var(--tao-duration-slow) var(--tao-ease-base);\n}\n\n.tao-toast-bottom-leave-active .tao-toast-slot__inner {\n animation: tao-toast-fade-out-down var(--tao-duration-slow) var(--tao-ease-base);\n}\n\n@keyframes tao-toast-bounce-in {\n 0% {\n opacity: 0;\n transform: translateY(18px) scale(0.96);\n }\n 60% {\n opacity: 1;\n transform: translateY(-4px) scale(1.02);\n }\n 100% {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes tao-toast-fade-out-up {\n to {\n opacity: 0;\n transform: translateY(-8px) scale(0.98);\n }\n}\n\n@keyframes tao-toast-fade-out-down {\n to {\n opacity: 0;\n transform: translateY(8px) scale(0.98);\n }\n}\n</style>\n","import { ref } from 'vue';\nimport type { TaoConfirmDefaults, TaoConfirmRecord } from './types';\n\nexport const confirmDefaults: TaoConfirmDefaults = {\n ok: 'ОК',\n cancel: 'Отмена',\n};\n\nexport const currentConfirm = ref<TaoConfirmRecord | null>(null);\n\nconst queue: TaoConfirmRecord[] = [];\n\nexport function configureConfirmDefaults(partial: Partial<TaoConfirmDefaults>) {\n Object.assign(confirmDefaults, partial);\n}\n\nfunction pump() {\n if (currentConfirm.value) {\n return;\n }\n\n currentConfirm.value = queue.shift() ?? null;\n}\n\nexport function enqueueConfirm(record: TaoConfirmRecord) {\n queue.push(record);\n pump();\n}\n\nexport function resolveConfirm(value: boolean) {\n const item = currentConfirm.value;\n if (!item) {\n return;\n }\n\n currentConfirm.value = null;\n item.resolve(value);\n pump();\n}\n\nlet viewportMounts = 0;\n\nexport function registerConfirmHost() {\n viewportMounts += 1;\n}\n\nexport function unregisterConfirmHost() {\n viewportMounts = Math.max(0, viewportMounts - 1);\n}\n\nexport function hasConfirmHost() {\n if (viewportMounts > 0) {\n return true;\n }\n\n if (typeof document === 'undefined') {\n return false;\n }\n\n return Boolean(document.querySelector('[data-tao-confirm-host]'));\n}\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport TaoButton from './TaoButton.vue';\nimport { currentConfirm, registerConfirmHost, resolveConfirm, unregisterConfirmHost } from '../confirm/store';\n\ndefineOptions({ name: 'TaoConfirmHost' });\n\nconst panelRef = ref<HTMLElement | null>(null);\nlet previousOverflow = '';\nlet previousFocus: HTMLElement | null = null;\nlet scrollLocked = false;\n\nonMounted(() => {\n registerConfirmHost();\n});\n\nonBeforeUnmount(() => {\n unlockBodyScroll();\n unregisterConfirmHost();\n});\n\nwatch(\n () => currentConfirm.value?.id,\n async (id) => {\n if (!id) {\n unlockBodyScroll();\n restoreFocus();\n return;\n }\n\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n lockBodyScroll();\n await nextTick();\n queryButton(currentConfirm.value?.danger ? 'cancel' : 'ok')?.focus();\n },\n);\n\nfunction queryButton(which: 'ok' | 'cancel') {\n return panelRef.value?.querySelector<HTMLButtonElement>(`[data-tao-confirm-${which}]`) ?? null;\n}\n\nfunction lockBodyScroll() {\n if (scrollLocked) {\n return;\n }\n\n previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n scrollLocked = true;\n}\n\nfunction unlockBodyScroll() {\n if (!scrollLocked) {\n return;\n }\n\n document.body.style.overflow = previousOverflow;\n previousOverflow = '';\n scrollLocked = false;\n}\n\nfunction restoreFocus() {\n previousFocus?.focus?.();\n previousFocus = null;\n}\n\nfunction answer(value: boolean) {\n resolveConfirm(value);\n}\n\nfunction onOverlayClick() {\n answer(false);\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n event.preventDefault();\n answer(false);\n return;\n }\n\n if (event.key !== 'Tab') {\n return;\n }\n\n const first = queryButton(currentConfirm.value?.danger ? 'cancel' : 'ok');\n const last = queryButton(currentConfirm.value?.danger ? 'ok' : 'cancel');\n if (!first || !last) {\n return;\n }\n\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n}\n</script>\n\n<template>\n <Teleport to=\"body\">\n <Transition name=\"tao-confirm\">\n <div\n v-if=\"currentConfirm\"\n class=\"tao-confirm\"\n data-tao-confirm-host\n @keydown=\"onKeydown\"\n >\n <div class=\"tao-confirm__overlay\" @click=\"onOverlayClick\"></div>\n\n <div\n ref=\"panelRef\"\n class=\"tao-confirm__panel\"\n :class=\"{ 'tao-confirm__panel--danger': currentConfirm.danger }\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"currentConfirm.title ? 'tao-confirm-title' : undefined\"\n :aria-describedby=\"currentConfirm.message ? 'tao-confirm-message' : undefined\"\n tabindex=\"-1\"\n >\n <span class=\"tao-confirm__accent\" aria-hidden=\"true\"></span>\n\n <span class=\"tao-confirm__icon\" aria-hidden=\"true\">\n <svg v-if=\"currentConfirm.danger\" viewBox=\"0 0 20 20\" width=\"22\" height=\"22\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M7 7l6 6M13 7l-6 6\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n </svg>\n <svg v-else viewBox=\"0 0 20 20\" width=\"22\" height=\"22\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\n <path d=\"M10 9v5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\n <circle cx=\"10\" cy=\"6.4\" r=\"0.8\" fill=\"currentColor\" />\n </svg>\n </span>\n\n <div class=\"tao-confirm__body\">\n <h2 v-if=\"currentConfirm.title\" id=\"tao-confirm-title\" class=\"tao-confirm__title\">\n {{ currentConfirm.title }}\n </h2>\n <p v-if=\"currentConfirm.message\" id=\"tao-confirm-message\" class=\"tao-confirm__message\">\n {{ currentConfirm.message }}\n </p>\n </div>\n\n <div class=\"tao-confirm__actions\">\n <TaoButton data-tao-confirm-cancel variant=\"secondary\" @click=\"answer(false)\">\n {{ currentConfirm.cancelLabel }}\n </TaoButton>\n <TaoButton\n data-tao-confirm-ok\n :variant=\"currentConfirm.danger ? 'danger' : 'primary'\"\n @click=\"answer(true)\"\n >\n {{ currentConfirm.okLabel }}\n </TaoButton>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style scoped>\n.tao-confirm {\n position: fixed;\n inset: 0;\n z-index: 1200;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--tao-space-5);\n}\n\n.tao-confirm__overlay {\n position: absolute;\n inset: 0;\n background: var(--tao-color-overlay);\n}\n\n.tao-confirm__panel {\n --tao-confirm-tone: var(--tao-color-warning);\n\n position: relative;\n z-index: 1;\n display: grid;\n grid-template-columns: auto 1fr;\n grid-template-areas:\n \"icon body\"\n \"actions actions\";\n gap: var(--tao-space-3) var(--tao-space-4);\n width: min(420px, 100%);\n padding: var(--tao-space-5);\n background: color-mix(in srgb, var(--tao-confirm-tone) 8%, var(--tao-color-surface-raised));\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-panel);\n box-shadow: var(--tao-shadow-overlay);\n outline: none;\n}\n\n.tao-confirm__panel--danger {\n --tao-confirm-tone: var(--tao-color-danger);\n}\n\n.tao-confirm__accent {\n position: absolute;\n inset: 0 auto 0 0;\n width: 3px;\n background: var(--tao-confirm-tone);\n}\n\n.tao-confirm__icon {\n grid-area: icon;\n display: inline-flex;\n margin-top: 2px;\n color: var(--tao-confirm-tone);\n}\n\n.tao-confirm__body {\n grid-area: body;\n min-width: 0;\n}\n\n.tao-confirm__title {\n margin: 0;\n font-size: var(--tao-font-size-lg);\n font-weight: 600;\n line-height: 1.3;\n color: var(--tao-color-text-strong);\n}\n\n.tao-confirm__message {\n margin: var(--tao-space-2) 0 0;\n font-size: var(--tao-font-size-md);\n line-height: 1.45;\n color: var(--tao-color-text);\n}\n\n.tao-confirm__actions {\n grid-area: actions;\n display: flex;\n justify-content: flex-end;\n gap: var(--tao-space-3);\n margin-top: var(--tao-space-1);\n}\n\n.tao-confirm-enter-active .tao-confirm__overlay,\n.tao-confirm-leave-active .tao-confirm__overlay {\n transition: opacity var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-confirm-enter-from .tao-confirm__overlay,\n.tao-confirm-leave-to .tao-confirm__overlay {\n opacity: 0;\n}\n\n.tao-confirm-enter-active .tao-confirm__panel {\n animation: tao-confirm-bounce-in var(--tao-duration-slow) var(--tao-ease-base);\n}\n\n.tao-confirm-leave-active .tao-confirm__panel {\n animation: tao-confirm-fade-out var(--tao-duration-base) var(--tao-ease-base);\n}\n\n@keyframes tao-confirm-bounce-in {\n 0% {\n opacity: 0;\n transform: translateY(18px) scale(0.96);\n }\n 60% {\n opacity: 1;\n transform: translateY(-4px) scale(1.02);\n }\n 100% {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes tao-confirm-fade-out {\n to {\n opacity: 0;\n transform: translateY(10px);\n }\n}\n</style>\n","import { createApp } from 'vue';\nimport TaoToastViewport from '../components/TaoToastViewport.vue';\nimport { addToast, configureToastDefaults, dismissToasts, hasToastViewport, toastDefaults } from './store';\nimport type {\n TaoToastAction,\n TaoToastDefaults,\n TaoToastDisplayMode,\n TaoToastPosition,\n TaoToastRecord,\n TaoToastShortcutOptions,\n TaoToastType,\n} from './types';\n\nexport type {\n TaoToastAction,\n TaoToastDefaults,\n TaoToastDisplayMode,\n TaoToastPosition,\n TaoToastRecord,\n TaoToastShortcutOptions,\n TaoToastType,\n};\n\nconst TYPE_TIMEOUT: Record<TaoToastType, number> = {\n success: 3000,\n error: 5000,\n warning: 4000,\n info: 3000,\n neutral: 2500,\n};\n\ninterface Draft {\n type: TaoToastType;\n title: string;\n message: string;\n icon: string;\n timeout: number;\n position: TaoToastPosition;\n closable: boolean;\n progress: boolean;\n displayMode?: TaoToastDisplayMode;\n dedupeId?: string;\n actions: TaoToastAction[];\n onClosed?: () => void;\n}\n\nfunction isClient() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction nextToastId() {\n return `tao-toast-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nlet hostedApp: ReturnType<typeof createApp> | null = null;\n\nfunction ensureToastViewport() {\n if (!isClient() || hasToastViewport()) {\n return;\n }\n\n const host = document.createElement('div');\n host.setAttribute('data-tao-toast-host', '');\n document.body.appendChild(host);\n hostedApp = createApp(TaoToastViewport);\n hostedApp.mount(host);\n}\n\nfunction flushDraft(draft: Draft) {\n if (!isClient()) {\n return;\n }\n\n if (!draft.title && !draft.message) {\n return;\n }\n\n const dedupeId =\n draft.dedupeId ??\n (draft.displayMode ? `${draft.type}:${draft.title}:${draft.message}` : undefined);\n\n ensureToastViewport();\n\n addToast({\n id: nextToastId(),\n type: draft.type,\n title: draft.title,\n message: draft.message,\n icon: draft.icon,\n timeout: draft.timeout,\n position: draft.position,\n closable: draft.closable,\n progress: draft.progress,\n displayMode: draft.displayMode,\n dedupeId,\n actions: draft.actions,\n onClosed: draft.onClosed,\n });\n}\n\nfunction createDraft(): Draft {\n return {\n type: 'info',\n title: '',\n message: '',\n icon: '',\n timeout: toastDefaults.timeout,\n position: toastDefaults.position,\n closable: toastDefaults.closable,\n progress: toastDefaults.progress,\n actions: [],\n };\n}\n\nexport interface TaoToastBuilder {\n success(): TaoToastBuilder;\n error(): TaoToastBuilder;\n warning(): TaoToastBuilder;\n info(): TaoToastBuilder;\n show(): TaoToastBuilder;\n short(): TaoToastBuilder;\n timeout(ms: number): TaoToastBuilder;\n title(value: string): TaoToastBuilder;\n message(value: string): TaoToastBuilder;\n icon(name: string): TaoToastBuilder;\n position(value: TaoToastPosition): TaoToastBuilder;\n byCenter(): TaoToastBuilder;\n byTopLeft(): TaoToastBuilder;\n byTopRight(): TaoToastBuilder;\n byTopCenter(): TaoToastBuilder;\n byBottomLeft(): TaoToastBuilder;\n byBottomRight(): TaoToastBuilder;\n byBottomCenter(): TaoToastBuilder;\n closable(value?: boolean): TaoToastBuilder;\n progress(value?: boolean): TaoToastBuilder;\n id(value: string): TaoToastBuilder;\n once(): TaoToastBuilder;\n replace(): TaoToastBuilder;\n action(label: string, onClick: () => void): TaoToastBuilder;\n onClosed(fn: () => void): TaoToastBuilder;\n}\n\nfunction createBuilder(): TaoToastBuilder {\n const draft = createDraft();\n\n const ctx: TaoToastBuilder = {\n success() {\n draft.type = 'success';\n draft.timeout = TYPE_TIMEOUT.success;\n return ctx;\n },\n error() {\n draft.type = 'error';\n draft.timeout = TYPE_TIMEOUT.error;\n return ctx;\n },\n warning() {\n draft.type = 'warning';\n draft.timeout = TYPE_TIMEOUT.warning;\n return ctx;\n },\n info() {\n draft.type = 'info';\n draft.timeout = TYPE_TIMEOUT.info;\n return ctx;\n },\n show() {\n draft.type = 'neutral';\n draft.timeout = TYPE_TIMEOUT.neutral;\n return ctx;\n },\n short() {\n draft.timeout = 1000;\n return ctx;\n },\n timeout(ms: number) {\n draft.timeout = ms;\n return ctx;\n },\n title(value: string) {\n draft.title = value;\n return ctx;\n },\n message(value: string) {\n draft.message = String(value);\n return ctx;\n },\n icon(name: string) {\n draft.icon = name;\n return ctx;\n },\n position(value: TaoToastPosition) {\n draft.position = value;\n return ctx;\n },\n byCenter() {\n draft.position = 'center';\n return ctx;\n },\n byTopLeft() {\n draft.position = 'topLeft';\n return ctx;\n },\n byTopRight() {\n draft.position = 'topRight';\n return ctx;\n },\n byTopCenter() {\n draft.position = 'topCenter';\n return ctx;\n },\n byBottomLeft() {\n draft.position = 'bottomLeft';\n return ctx;\n },\n byBottomRight() {\n draft.position = 'bottomRight';\n return ctx;\n },\n byBottomCenter() {\n draft.position = 'bottomCenter';\n return ctx;\n },\n closable(value = true) {\n draft.closable = value;\n return ctx;\n },\n progress(value = true) {\n draft.progress = value;\n return ctx;\n },\n id(value: string) {\n draft.dedupeId = value;\n return ctx;\n },\n once() {\n draft.displayMode = 'once';\n return ctx;\n },\n replace() {\n draft.displayMode = 'replace';\n return ctx;\n },\n action(label: string, onClick: () => void) {\n draft.actions = [...draft.actions, { label, onClick }];\n return ctx;\n },\n onClosed(fn: () => void) {\n draft.onClosed = fn;\n return ctx;\n },\n };\n\n // Тот самый flush: цепочка успевает собрать params в текущем тике.\n setTimeout(() => flushDraft(draft), 0);\n\n return ctx;\n}\n\nfunction shortcut(type: TaoToastType, message: string, options?: TaoToastShortcutOptions) {\n const builder = createBuilder();\n\n if (type === 'neutral') {\n builder.show();\n } else {\n builder[type]();\n }\n\n builder.message(message);\n\n if (options?.title) {\n builder.title(options.title);\n }\n if (options?.timeout !== undefined) {\n builder.timeout(options.timeout);\n }\n if (options?.position) {\n builder.position(options.position);\n }\n if (options?.icon) {\n builder.icon(options.icon);\n }\n if (options?.closable !== undefined) {\n builder.closable(options.closable);\n }\n if (options?.progress !== undefined) {\n builder.progress(options.progress);\n }\n if (options?.id) {\n builder.id(options.id);\n }\n if (options?.once) {\n builder.once();\n }\n if (options?.replace) {\n builder.replace();\n }\n if (options?.actions) {\n options.actions.forEach((action) => builder.action(action.label, action.onClick));\n }\n if (options?.onClosed) {\n builder.onClosed(options.onClosed);\n }\n\n return builder;\n}\n\nexport interface TaoToastApi {\n (): TaoToastBuilder;\n success(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\n error(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\n warning(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\n info(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\n show(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\n defaults(partial: Partial<TaoToastDefaults>): TaoToastApi;\n byTopCenter(): TaoToastApi;\n byTopLeft(): TaoToastApi;\n byBottomLeft(): TaoToastApi;\n byBottomRight(): TaoToastApi;\n dismiss(id?: string): void;\n}\n\nexport const toast: TaoToastApi = Object.assign(createBuilder, {\n success(message: string, options?: TaoToastShortcutOptions) {\n return shortcut('success', message, options);\n },\n error(message: string, options?: TaoToastShortcutOptions) {\n return shortcut('error', message, options);\n },\n warning(message: string, options?: TaoToastShortcutOptions) {\n return shortcut('warning', message, options);\n },\n info(message: string, options?: TaoToastShortcutOptions) {\n return shortcut('info', message, options);\n },\n show(message: string, options?: TaoToastShortcutOptions) {\n return shortcut('neutral', message, options);\n },\n defaults(partial: Partial<TaoToastDefaults>) {\n configureToastDefaults(partial);\n return toast;\n },\n byTopCenter() {\n configureToastDefaults({ position: 'topCenter' });\n return toast;\n },\n byTopLeft() {\n configureToastDefaults({ position: 'topLeft' });\n return toast;\n },\n byBottomLeft() {\n configureToastDefaults({ position: 'bottomLeft' });\n return toast;\n },\n byBottomRight() {\n configureToastDefaults({ position: 'bottomRight' });\n return toast;\n },\n dismiss(id?: string) {\n dismissToasts(id);\n },\n});\n","import { createApp } from 'vue';\nimport TaoConfirmHost from '../components/TaoConfirmHost.vue';\nimport {\n configureConfirmDefaults,\n confirmDefaults,\n enqueueConfirm,\n hasConfirmHost,\n resolveConfirm,\n} from './store';\nimport type { TaoConfirmDefaults, TaoConfirmShortcutOptions } from './types';\n\nexport type { TaoConfirmDefaults, TaoConfirmRecord, TaoConfirmShortcutOptions } from './types';\n\ninterface Draft {\n title: string;\n message: string;\n okLabel: string;\n cancelLabel: string;\n danger: boolean;\n}\n\nfunction isClient() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction nextConfirmId() {\n return `tao-confirm-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nlet hostedApp: ReturnType<typeof createApp> | null = null;\n\nfunction ensureConfirmHost() {\n if (!isClient() || hasConfirmHost()) {\n return;\n }\n\n const host = document.createElement('div');\n host.setAttribute('data-tao-confirm-root', '');\n document.body.appendChild(host);\n hostedApp = createApp(TaoConfirmHost);\n hostedApp.mount(host);\n}\n\nfunction createDraft(): Draft {\n return {\n title: '',\n message: '',\n okLabel: confirmDefaults.ok,\n cancelLabel: confirmDefaults.cancel,\n danger: false,\n };\n}\n\nexport interface TaoConfirmBuilder extends PromiseLike<boolean> {\n title(value: string): TaoConfirmBuilder;\n message(value: string): TaoConfirmBuilder;\n ok(label: string): TaoConfirmBuilder;\n cancel(label: string): TaoConfirmBuilder;\n danger(value?: boolean): TaoConfirmBuilder;\n}\n\nfunction createBuilder(): TaoConfirmBuilder {\n const draft = createDraft();\n let settle: (value: boolean) => void = () => undefined;\n const promise = new Promise<boolean>((resolve) => {\n settle = resolve;\n });\n\n const ctx: TaoConfirmBuilder = {\n title(value: string) {\n draft.title = value;\n return ctx;\n },\n message(value: string) {\n draft.message = String(value);\n return ctx;\n },\n ok(label: string) {\n draft.okLabel = label;\n return ctx;\n },\n cancel(label: string) {\n draft.cancelLabel = label;\n return ctx;\n },\n danger(value = true) {\n draft.danger = value;\n return ctx;\n },\n then(onFulfilled, onRejected) {\n return promise.then(onFulfilled, onRejected);\n },\n };\n\n // Тот же flush, что у toast: цепочка собирает params, тик позже — показ.\n setTimeout(() => {\n if (!isClient() || (!draft.title && !draft.message)) {\n settle(false);\n return;\n }\n\n ensureConfirmHost();\n enqueueConfirm({\n id: nextConfirmId(),\n title: draft.title,\n message: draft.message,\n okLabel: draft.okLabel,\n cancelLabel: draft.cancelLabel,\n danger: draft.danger,\n resolve: settle,\n });\n }, 0);\n\n return ctx;\n}\n\nfunction applyOptions(builder: TaoConfirmBuilder, options?: TaoConfirmShortcutOptions) {\n if (!options) {\n return builder;\n }\n\n if (options.message) {\n builder.message(options.message);\n }\n if (options.ok) {\n builder.ok(options.ok);\n }\n if (options.cancel) {\n builder.cancel(options.cancel);\n }\n if (options.danger) {\n builder.danger(true);\n }\n\n return builder;\n}\n\nexport interface TaoConfirmApi {\n (): TaoConfirmBuilder;\n (title: string, options?: TaoConfirmShortcutOptions): TaoConfirmBuilder;\n defaults(partial: Partial<TaoConfirmDefaults>): TaoConfirmApi;\n dismiss(): void;\n}\n\nfunction confirmFn(title?: string, options?: TaoConfirmShortcutOptions): TaoConfirmBuilder {\n const builder = createBuilder();\n\n if (title) {\n builder.title(title);\n }\n\n return applyOptions(builder, options);\n}\n\nexport const confirm: TaoConfirmApi = Object.assign(confirmFn, {\n defaults(partial: Partial<TaoConfirmDefaults>) {\n configureConfirmDefaults(partial);\n return confirm;\n },\n dismiss() {\n resolveConfirm(false);\n },\n});\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 TaoInputGroup from './components/TaoInputGroup.vue';\nimport TaoInputNumber from './components/TaoInputNumber.vue';\nimport TaoQuantity from './components/TaoQuantity.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';\nimport TaoFormField from './components/TaoFormField.vue';\nimport TaoSelect from './components/TaoSelect.vue';\nimport TaoDate from './components/TaoDate.vue';\nimport TaoSwitch from './components/TaoSwitch.vue';\nimport TaoRadio from './components/TaoRadio.vue';\nimport TaoRadioGroup from './components/TaoRadioGroup.vue';\nimport TaoAlert from './components/TaoAlert.vue';\nimport TaoTable from './components/TaoTable.vue';\nimport TaoPagination from './components/TaoPagination.vue';\nimport TaoEmpty from './components/TaoEmpty.vue';\nimport TaoSkeleton from './components/TaoSkeleton.vue';\nimport TaoDrawer from './components/TaoDrawer.vue';\nimport TaoAvatar from './components/TaoAvatar.vue';\nimport TaoBreadcrumb from './components/TaoBreadcrumb.vue';\nimport TaoCounter from './components/TaoCounter.vue';\nimport TaoCarousel from './components/TaoCarousel.vue';\nimport TaoStages from './components/TaoStages.vue';\nimport TaoToastViewport from './components/TaoToastViewport.vue';\nimport TaoConfirmHost from './components/TaoConfirmHost.vue';\nimport { toast } from './toast';\nimport { confirm } from './confirm';\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 TaoInputGroup,\n TaoInputNumber,\n TaoQuantity,\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 TaoFormField,\n TaoSelect,\n TaoDate,\n TaoSwitch,\n TaoRadio,\n TaoRadioGroup,\n TaoAlert,\n TaoTable,\n TaoPagination,\n TaoEmpty,\n TaoSkeleton,\n TaoDrawer,\n TaoAvatar,\n TaoBreadcrumb,\n TaoCounter,\n TaoCarousel,\n TaoStages,\n TaoToastViewport,\n TaoConfirmHost,\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 TaoInputGroup,\n TaoInputNumber,\n TaoQuantity,\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 TaoFormField,\n TaoSelect,\n TaoDate,\n TaoSwitch,\n TaoRadio,\n TaoRadioGroup,\n TaoAlert,\n TaoTable,\n TaoPagination,\n TaoEmpty,\n TaoSkeleton,\n TaoDrawer,\n TaoAvatar,\n TaoBreadcrumb,\n TaoCounter,\n TaoCarousel,\n TaoStages,\n TaoToastViewport,\n TaoConfirmHost,\n toast,\n confirm,\n};\n\nexport type {\n TaoToastAction,\n TaoToastApi,\n TaoToastBuilder,\n TaoToastDefaults,\n TaoToastDisplayMode,\n TaoToastPosition,\n TaoToastRecord,\n TaoToastShortcutOptions,\n TaoToastType,\n} from './toast';\n\nexport type {\n TaoConfirmApi,\n TaoConfirmBuilder,\n TaoConfirmDefaults,\n TaoConfirmRecord,\n TaoConfirmShortcutOptions,\n} from './confirm';\n\nexport { parseTaoDate, formatTaoDateIso, todayTaoDate, formatTaoDateLabel } from './date';\nexport type { TaoSelectOption } from './select';\nexport type { TaoDateCell, TaoDateParts } from './date';\nexport type { TaoRadioValue } from './radio';\nexport type { TaoFormFieldContext } from './formField';\nexport type { TaoTableAlign, TaoTableColumn, TaoTableSort } from './table';\nexport type { TaoPaginationItem } from './pagination';\nexport type { TaoBreadcrumbItem } from './breadcrumb';\nexport type { TaoQuantityChangeSource } from './quantity';\nexport type { TaoStageItem, TaoStageStatus } from './stage';\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","_hoisted_7","_hoisted_8","_createBlock","_Teleport","_createVNode","_Transition","_unref","_Fragment","_renderList","_createTextVNode","_resolveDynamicComponent","_mergeProps","_hoisted_9","_hoisted_10","TaoLink","_TransitionGroup","toast","viewportMounts","isClient","hostedApp","createDraft","createBuilder","TaoFlex"],"mappings":"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"}
|