@1337exp/taoui 1.4.0 → 1.6.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","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/focusLoss.ts","../src/components/TaoTooltip.vue","../src/components/TaoPopover.vue","../src/spoiler.ts","../src/components/TaoSpoiler.vue","../src/components/TaoSpoilerGroup.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/TaoFieldset.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/components/TaoCombobox.vue","../src/date.ts","../src/components/TaoDate.vue","../src/components/TaoDateRange.vue","../src/components/TaoSwitch.vue","../src/radio.ts","../src/components/TaoRadio.vue","../src/components/TaoRadioGroup.vue","../src/segmented.ts","../src/components/TaoSegmented.vue","../src/components/TaoSegmentedOption.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: 26px;\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: 30px;\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: 38px;\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\ndefineOptions({ name: 'TaoBlock' });\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 && !field\" 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\ndefineOptions({ name: 'TaoCard' });\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 || closable\" class=\"tao-modal__header\">\n <slot name=\"header\">\n <h2 v-if=\"title\" :id=\"titleId\" class=\"tao-modal__title\">{{ title }}</h2>\n <span v-else></span>\n </slot>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"tao-modal__close\"\n aria-label=\"Закрыть\"\n @click=\"close\"\n >\n &times;\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","/**\n * Win / скриншот / Alt-Tab часто глотают mouseleave и pointerup —\n * жест или hover остаются «нажатыми». Слушатель дергает callback,\n * когда окно реально теряет фокус.\n */\nexport function listenFocusLoss(onLoss: () => void) {\n function onVisibilityChange() {\n if (document.hidden) {\n onLoss();\n }\n }\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n window.addEventListener('blur', onLoss);\n window.addEventListener('pagehide', onLoss);\n\n return () => {\n document.removeEventListener('visibilitychange', onVisibilityChange);\n window.removeEventListener('blur', onLoss);\n window.removeEventListener('pagehide', onLoss);\n };\n}\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { listenFocusLoss } from '../focusLoss';\n\ndefineOptions({ name: 'TaoTooltip' });\n\ntype TaoTooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\nconst props = withDefaults(\n defineProps<{\n content: string;\n position?: TaoTooltipPosition;\n }>(),\n {\n position: 'top',\n },\n);\n\nconst wrapperRef = ref<HTMLElement | null>(null);\nconst tooltipRef = ref<HTMLElement | null>(null);\nconst showTooltip = ref(false);\nconst placed = ref<TaoTooltipPosition>(props.position);\nconst panelStyle = ref<Record<string, string>>({ visibility: 'hidden' });\nconst arrowStyle = ref<Record<string, string>>({});\n\nconst opposite: Record<TaoTooltipPosition, TaoTooltipPosition> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nfunction hide() {\n showTooltip.value = false;\n}\n\nfunction show() {\n showTooltip.value = true;\n}\n\nfunction updatePosition() {\n const trigger = wrapperRef.value;\n const tip = tooltipRef.value;\n if (!trigger || !tip) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const width = tip.offsetWidth;\n const height = tip.offsetHeight;\n const gap = 8;\n const pad = 8;\n const viewW = window.innerWidth;\n const viewH = window.innerHeight;\n const space = {\n bottom: viewH - rect.bottom - gap - pad,\n top: rect.top - gap - pad,\n right: viewW - rect.right - gap - pad,\n left: rect.left - gap - pad,\n };\n\n let side = props.position;\n const need = side === 'top' || side === 'bottom' ? height : width;\n if (space[side] < need && space[opposite[side]] > space[side]) {\n side = opposite[side];\n }\n\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n let top = 0;\n let left = 0;\n\n if (side === 'bottom') {\n top = rect.bottom + gap;\n left = cx - width / 2;\n } else if (side === 'top') {\n top = rect.top - height - gap;\n left = cx - width / 2;\n } else if (side === 'right') {\n top = cy - height / 2;\n left = rect.right + gap;\n } else {\n top = cy - height / 2;\n left = rect.left - width - gap;\n }\n\n if (left + width > viewW - pad) {\n left = viewW - pad - width;\n }\n if (left < pad) {\n left = pad;\n }\n if (top + height > viewH - pad) {\n top = viewH - pad - height;\n }\n if (top < pad) {\n top = pad;\n }\n\n const arrowPad = 10;\n if (side === 'top' || side === 'bottom') {\n const x = Math.min(width - arrowPad, Math.max(arrowPad, cx - left));\n arrowStyle.value = { left: `${x}px`, top: '' };\n } else {\n const y = Math.min(height - arrowPad, Math.max(arrowPad, cy - top));\n arrowStyle.value = { top: `${y}px`, left: '' };\n }\n\n placed.value = side;\n panelStyle.value = { top: `${top}px`, left: `${left}px`, visibility: 'visible' };\n}\n\nfunction onViewportChange() {\n if (showTooltip.value) {\n updatePosition();\n }\n}\n\nwatch(showTooltip, async (isOpen) => {\n if (isOpen) {\n await nextTick();\n updatePosition();\n requestAnimationFrame(() => updatePosition());\n window.addEventListener('resize', onViewportChange);\n window.addEventListener('scroll', onViewportChange, true);\n return;\n }\n\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n\nwatch(\n () => props.position,\n () => {\n if (showTooltip.value) {\n updatePosition();\n }\n },\n);\n\nlet stopFocusLoss: (() => void) | undefined;\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(hide);\n});\n\nonBeforeUnmount(() => {\n stopFocusLoss?.();\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n</script>\n\n<template>\n <div\n ref=\"wrapperRef\"\n class=\"tao-tooltip-wrapper\"\n @mouseenter=\"show\"\n @mouseleave=\"hide\"\n @focusin=\"show\"\n @focusout=\"hide\"\n >\n <slot />\n <Teleport to=\"body\">\n <Transition name=\"tao-tooltip-fade\">\n <div\n v-if=\"showTooltip\"\n ref=\"tooltipRef\"\n class=\"tao-tooltip\"\n :class=\"`tao-tooltip--${placed}`\"\n role=\"tooltip\"\n :style=\"panelStyle\"\n >\n {{ content }}\n <span class=\"tao-tooltip__arrow\" :style=\"arrowStyle\" aria-hidden=\"true\"></span>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-tooltip {\n z-index: 1060;\n position: fixed;\n box-sizing: border-box;\n width: max-content;\n max-width: min(280px, calc(100vw - 16px));\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 font-family: var(--tao-font-family);\n line-height: 1.3;\n border-radius: var(--tao-radius-control);\n box-shadow: var(--tao-shadow-lg);\n pointer-events: none;\n}\n\n.tao-tooltip__arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background: var(--tao-color-surface-raised);\n}\n\n.tao-tooltip--top .tao-tooltip__arrow {\n top: 100%;\n margin-top: -4px;\n transform: translateX(-50%) rotate(45deg);\n}\n\n.tao-tooltip--bottom .tao-tooltip__arrow {\n bottom: 100%;\n margin-bottom: -4px;\n transform: translateX(-50%) rotate(45deg);\n}\n\n.tao-tooltip--left .tao-tooltip__arrow {\n left: 100%;\n margin-left: -4px;\n transform: translateY(-50%) rotate(45deg);\n}\n\n.tao-tooltip--right .tao-tooltip__arrow {\n right: 100%;\n margin-right: -4px;\n transform: translateY(-50%) rotate(45deg);\n}\n\n.tao-tooltip-fade-enter-active,\n.tao-tooltip-fade-leave-active {\n transition:\n opacity var(--tao-duration-base) var(--tao-ease-base),\n transform var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-tooltip--top.tao-tooltip-fade-enter-from,\n.tao-tooltip--top.tao-tooltip-fade-leave-to {\n opacity: 0;\n transform: 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: 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: 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: translateX(-4px);\n}\n</style>\n\n<style scoped>\n.tao-tooltip-wrapper {\n display: inline-block;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\n\ndefineOptions({ name: 'TaoPopover' });\n\ntype TaoPopoverPosition = 'top' | 'bottom' | 'left' | 'right';\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: boolean;\n position?: TaoPopoverPosition;\n disabled?: boolean;\n }>(),\n {\n modelValue: undefined,\n position: 'bottom',\n disabled: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean];\n change: [value: boolean];\n}>();\n\nconst triggerRef = ref<HTMLElement | null>(null);\nconst panelRef = ref<HTMLElement | null>(null);\nconst internal = ref(false);\nconst panelStyle = ref({ top: '0px', left: '0px' });\nconst isControlled = computed(() => props.modelValue !== undefined);\nconst open = computed(() => (isControlled.value ? Boolean(props.modelValue) : internal.value));\n\nfunction setOpen(next: boolean) {\n if (props.disabled && next) {\n return;\n }\n\n if (!isControlled.value) {\n internal.value = next;\n }\n emit('update:modelValue', next);\n emit('change', next);\n}\n\nfunction toggle() {\n void applyOpen(!open.value);\n}\n\nfunction close() {\n void applyOpen(false);\n}\n\nasync function applyOpen(next: boolean) {\n setOpen(next);\n if (!next) {\n return;\n }\n\n await nextTick();\n updatePosition();\n panelRef.value?.focus();\n}\n\nfunction focusTrigger() {\n const root = triggerRef.value;\n const focusable = root?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n (focusable ?? root)?.focus?.();\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 width = panel.offsetWidth;\n const height = panel.offsetHeight;\n const gap = 4;\n const pad = 8;\n const viewW = window.innerWidth;\n const viewH = window.innerHeight;\n\n const space = {\n bottom: viewH - rect.bottom - gap - pad,\n top: rect.top - gap - pad,\n right: viewW - rect.right - gap - pad,\n left: rect.left - gap - pad,\n };\n const opposite: Record<TaoPopoverPosition, TaoPopoverPosition> = {\n bottom: 'top',\n top: 'bottom',\n left: 'right',\n right: 'left',\n };\n\n let side = props.position;\n const need = side === 'top' || side === 'bottom' ? height : width;\n if (space[side] < need && space[opposite[side]] > space[side]) {\n side = opposite[side];\n }\n\n let top = 0;\n let left = 0;\n if (side === 'bottom') {\n top = rect.bottom + gap;\n left = rect.left;\n } else if (side === 'top') {\n top = rect.top - height - gap;\n left = rect.left;\n } else if (side === 'right') {\n top = rect.top;\n left = rect.right + gap;\n } else {\n top = rect.top;\n left = rect.left - width - gap;\n }\n\n if (left + width > viewW - pad) {\n left = viewW - pad - width;\n }\n if (left < pad) {\n left = pad;\n }\n if (top + height > viewH - pad) {\n top = viewH - pad - height;\n }\n if (top < pad) {\n top = pad;\n }\n\n panelStyle.value = { top: `${top}px`, left: `${left}px` };\n}\n\nfunction onTriggerClick() {\n if (props.disabled) {\n return;\n }\n toggle();\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 close();\n}\n\nfunction onDocumentKey(event: KeyboardEvent) {\n if (event.key !== 'Escape') {\n return;\n }\n event.preventDefault();\n close();\n focusTrigger();\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 document.addEventListener('keydown', onDocumentKey);\n window.addEventListener('resize', onViewportChange);\n window.addEventListener('scroll', onViewportChange, true);\n return;\n }\n\n document.removeEventListener('pointerdown', onDocumentPointer);\n document.removeEventListener('keydown', onDocumentKey);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointer);\n document.removeEventListener('keydown', onDocumentKey);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n</script>\n\n<template>\n <div class=\"tao-popover\">\n <div ref=\"triggerRef\" class=\"tao-popover__trigger\" @click=\"onTriggerClick\">\n <slot name=\"trigger\" :open=\"open\" :toggle=\"toggle\" />\n </div>\n\n <Teleport to=\"body\">\n <div\n v-if=\"open\"\n ref=\"panelRef\"\n class=\"tao-popover__panel\"\n role=\"dialog\"\n tabindex=\"-1\"\n :style=\"panelStyle\"\n >\n <slot />\n </div>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-popover__panel {\n z-index: 1050;\n position: fixed;\n min-width: 200px;\n max-width: min(360px, calc(100vw - 16px));\n padding: var(--tao-space-3);\n overflow: auto;\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-popover__panel:focus {\n outline: none;\n}\n\n.tao-popover__panel:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n</style>\n\n<style scoped>\n.tao-popover {\n display: inline-block;\n}\n\n.tao-popover__trigger {\n display: inline-block;\n}\n</style>\n","import type { ComputedRef, InjectionKey } from 'vue';\n\nexport type TaoSpoilerName = string | number;\n\nexport interface TaoSpoilerGroupContext {\n model: ComputedRef<TaoSpoilerName | null | undefined>;\n setOpen: (name: TaoSpoilerName | null) => void;\n}\n\nexport const spoilerGroupKey: InjectionKey<TaoSpoilerGroupContext> = Symbol('taoSpoilerGroup');\n","<script lang=\"ts\" setup>\nimport { computed, inject, ref, useId } from 'vue';\nimport { spoilerGroupKey } from '../spoiler';\n\ndefineOptions({ name: 'TaoSpoiler' });\n\nconst props = withDefaults(\n defineProps<{\n title?: string;\n defaultOpen?: boolean;\n modelValue?: boolean;\n /** Ключ панели в `TaoSpoilerGroup`. Без группы не используется. */\n name?: string | number;\n }>(),\n {\n title: '',\n defaultOpen: false,\n modelValue: undefined,\n name: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean];\n}>();\n\nconst panelId = useId();\nconst internal = ref(props.defaultOpen);\nconst group = inject(spoilerGroupKey, null);\nconst inGroup = computed(() => group !== null && props.name !== undefined && props.name !== '');\nconst isControlled = computed(() => props.modelValue !== undefined);\nconst isOpen = computed(() => {\n if (inGroup.value) {\n return group!.model.value === props.name;\n }\n return isControlled.value ? Boolean(props.modelValue) : internal.value;\n});\n\nfunction toggle() {\n if (inGroup.value) {\n group!.setOpen(isOpen.value ? null : (props.name as string | number));\n return;\n }\n\n const next = !isOpen.value;\n if (!isControlled.value) {\n internal.value = next;\n }\n emit('update:modelValue', next);\n}\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\n type=\"button\"\n class=\"tao-spoiler__header\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"panelId\"\n @click=\"toggle\"\n >\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\" :id=\"panelId\" 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 { computed, provide } from 'vue';\nimport { spoilerGroupKey, type TaoSpoilerName } from '../spoiler';\n\ndefineOptions({ name: 'TaoSpoilerGroup' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TaoSpoilerName | null;\n }>(),\n {\n modelValue: null,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoSpoilerName | null];\n change: [value: TaoSpoilerName | null];\n}>();\n\nconst model = computed(() => props.modelValue);\n\nfunction setOpen(name: TaoSpoilerName | null) {\n emit('update:modelValue', name);\n emit('change', name);\n}\n\nprovide(spoilerGroupKey, {\n model,\n setOpen,\n});\n</script>\n\n<template>\n <div class=\"tao-spoiler-group\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-spoiler-group {\n overflow: hidden;\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-panel);\n}\n\n.tao-spoiler-group :deep(.tao-spoiler) {\n border: none;\n border-radius: 0;\n border-bottom: 1px solid var(--tao-color-border);\n}\n\n.tao-spoiler-group :deep(.tao-spoiler:last-child) {\n border-bottom: none;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\ndefineOptions({ name: 'TaoCopy' });\n\nconst props = withDefaults(\n defineProps<{\n text: string;\n successMessage?: string;\n /** Показать подсказку над кнопкой после копирования. */\n tip?: boolean;\n }>(),\n {\n successMessage: 'Скопировано!',\n tip: true,\n },\n);\n\nconst copied = ref(false);\nconst triggerRef = ref<HTMLElement | null>(null);\nconst tipRef = ref<HTMLElement | null>(null);\nconst tipStyle = ref({ top: '0px', left: '0px' });\n\nlet hideTimer = 0;\nlet visibleObserver: IntersectionObserver | null = null;\n\nfunction hideTip() {\n copied.value = false;\n window.clearTimeout(hideTimer);\n hideTimer = 0;\n}\n\nfunction updateTipPosition() {\n const trigger = triggerRef.value;\n const tip = tipRef.value;\n if (!trigger || !tip) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n hideTip();\n return;\n }\n\n const gap = 8;\n const pad = 8;\n const width = tip.offsetWidth;\n const height = tip.offsetHeight;\n let left = rect.left + rect.width / 2 - width / 2;\n let top = rect.top - height - gap;\n\n if (left < pad) {\n left = pad;\n }\n if (left + width > window.innerWidth - pad) {\n left = window.innerWidth - pad - width;\n }\n if (top < pad) {\n top = rect.bottom + gap;\n }\n\n tipStyle.value = { top: `${top}px`, left: `${left}px` };\n}\n\nfunction bindTipGuards() {\n window.addEventListener('scroll', updateTipPosition, true);\n window.addEventListener('resize', updateTipPosition);\n}\n\nfunction unbindTipGuards() {\n window.removeEventListener('scroll', updateTipPosition, true);\n window.removeEventListener('resize', updateTipPosition);\n}\n\nasync function copy() {\n try {\n await navigator.clipboard.writeText(props.text);\n copied.value = true;\n window.clearTimeout(hideTimer);\n hideTimer = window.setTimeout(hideTip, 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n hideTip();\n }\n}\n\nwatch(copied, async (isCopied) => {\n if (!isCopied || !props.tip) {\n unbindTipGuards();\n return;\n }\n\n await nextTick();\n await nextTick();\n updateTipPosition();\n bindTipGuards();\n});\n\nonMounted(() => {\n visibleObserver = new IntersectionObserver((entries) => {\n if (entries.some((entry) => !entry.isIntersecting)) {\n hideTip();\n }\n });\n if (triggerRef.value) {\n visibleObserver.observe(triggerRef.value);\n }\n});\n\nonBeforeUnmount(() => {\n hideTip();\n unbindTipGuards();\n visibleObserver?.disconnect();\n visibleObserver = null;\n});\n</script>\n\n<template>\n <span ref=\"triggerRef\" class=\"tao-copy\">\n <slot :copy=\"copy\" :copied=\"copied\">\n <button\n type=\"button\"\n class=\"tao-copy__button\"\n :class=\"{ 'tao-copy__button--copied': copied }\"\n :aria-label=\"copied ? successMessage : 'Копировать'\"\n @click=\"copy\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <rect\n x=\"8\"\n y=\"7\"\n width=\"12\"\n height=\"14\"\n rx=\"2\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n />\n <path\n d=\"M16 7V5a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h2\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n />\n </svg>\n </button>\n </slot>\n\n <Teleport to=\"body\">\n <div\n v-if=\"copied && tip && successMessage\"\n ref=\"tipRef\"\n class=\"tao-copy__tip\"\n role=\"status\"\n :style=\"tipStyle\"\n >\n {{ successMessage }}\n </div>\n </Teleport>\n </span>\n</template>\n\n<style>\n.tao-copy__tip {\n z-index: 1060;\n position: fixed;\n padding: var(--tao-space-2) var(--tao-space-3);\n overflow: visible;\n background: var(--tao-color-surface-raised);\n color: var(--tao-color-text-strong);\n font-size: var(--tao-font-size-xs);\n font-family: var(--tao-font-family);\n line-height: 1.3;\n white-space: nowrap;\n border-radius: var(--tao-radius-control);\n box-shadow: var(--tao-shadow-lg);\n pointer-events: none;\n}\n\n.tao-copy__tip::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n width: 8px;\n height: 8px;\n margin-top: -4px;\n margin-left: -4px;\n background: var(--tao-color-surface-raised);\n transform: rotate(45deg);\n}\n</style>\n\n<style scoped>\n.tao-copy {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n}\n\n.tao-copy__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n margin: 0;\n padding: 0;\n border: none;\n border-radius: var(--tao-radius-control);\n background: transparent;\n color: var(--tao-color-text-muted);\n cursor: pointer;\n transition: var(--tao-transition-base);\n}\n\n.tao-copy__button svg {\n display: block;\n}\n\n.tao-copy__button:hover {\n color: var(--tao-color-accent);\n background: var(--tao-color-surface-hover);\n}\n\n.tao-copy__button--copied {\n color: var(--tao-color-accent);\n}\n\n.tao-copy__button:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n</style>\n","<script lang=\"ts\" setup>\ndefineOptions({ name: 'TaoContainer' });\n\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>\ndefineOptions({ name: 'TaoFlex' });\n\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>\ndefineOptions({ name: 'TaoSpace' });\n\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>\ndefineOptions({ name: 'TaoIcon' });\n\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\ndefineOptions({ name: 'TaoLoader' });\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\ndefineOptions({ name: 'TaoImage' });\n\ninterface Props {\n src: string;\n alt?: string;\n pixelated?: boolean;\n /** Нативный `loading=\"lazy\"`. По умолчанию выкл — как обычный `<img>`. */\n lazy?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n src: '',\n alt: '',\n pixelated: false,\n lazy: 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 :loading=\"lazy ? 'lazy' : 'eager'\"\n decoding=\"async\"\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, inject, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\n\ndefineOptions({ name: 'TaoCheckbox' });\n\nconst props = withDefaults(\n defineProps<{\n value?: boolean;\n modelValue?: boolean;\n label?: string;\n disabled?: boolean;\n error?: boolean;\n /** Частично выбран: черта вместо квадрата. Клик ставит checked — indeterminate снимает родитель. */\n indeterminate?: boolean;\n }>(),\n {\n value: undefined,\n modelValue: undefined,\n label: '',\n disabled: false,\n error: false,\n indeterminate: 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);\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\n\nconst isChecked = computed({\n get: () => {\n if (props.modelValue !== undefined) {\n return props.modelValue;\n }\n return Boolean(props.value);\n },\n set: (next) => {\n emit('update:modelValue', next);\n emit('change', next);\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\nconst inputRef = ref<HTMLInputElement | null>(null);\n\nwatch(\n [inputRef, isChecked, () => props.indeterminate],\n () => {\n const el = inputRef.value;\n if (!el) {\n return;\n }\n el.checked = isChecked.value;\n el.indeterminate = Boolean(props.indeterminate);\n },\n { flush: 'post' },\n);\n</script>\n\n<template>\n <label class=\"tao-checkbox\" :class=\"{ 'tao-checkbox--disabled': disabled }\" :for=\"controlId\">\n <slot name=\"pre\" :text=\"label\" />\n\n <input\n :id=\"controlId\"\n ref=\"inputRef\"\n class=\"tao-checkbox__input tao-sr-only\"\n type=\"checkbox\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :aria-checked=\"indeterminate ? 'mixed' : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n @change=\"onInputChange\"\n />\n\n <span class=\"tao-checkbox__box\"></span>\n <span v-if=\"label\" class=\"tao-checkbox__label\">{{ label }}</span>\n <span v-else class=\"tao-checkbox__label\"><slot /></span>\n\n <slot name=\"post\" :text=\"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.tao-checkbox__input:indeterminate + .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:indeterminate + .tao-checkbox__box::after {\n width: 10px;\n height: 2px;\n border-radius: 1px;\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\n.tao-checkbox__input[aria-invalid='true'] + .tao-checkbox__box {\n border-color: var(--tao-color-danger);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, useSlots } from 'vue';\n\ndefineOptions({ name: 'TaoTag' });\n\ninterface Props {\n type?: 'neutral' | 'success' | 'danger' | 'error' | 'warning' | 'info' | '';\n color?: string;\n background?: string;\n borderColor?: string;\n pointer?: boolean;\n closable?: boolean;\n closeLabel?: string;\n /** Без рамки, заливка остаётся. Высота как у обычного тега. */\n flat?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: '',\n pointer: false,\n closable: false,\n closeLabel: 'Убрать',\n flat: false,\n});\n\nconst emit = defineEmits<{\n close: [event: MouseEvent];\n}>();\n\nconst slots = useSlots();\nconst tone = computed(() => (props.type === 'error' ? 'danger' : props.type));\nconst style = computed(() => ({\n color: props.color || '',\n background: props.background || '',\n 'border-color': props.flat ? 'transparent' : props.borderColor || '',\n}));\n\nfunction onClose(event: MouseEvent) {\n emit('close', event);\n}\n</script>\n\n<template>\n <span\n class=\"tao-tag\"\n :class=\"[\n tone ? `tao-tag--${tone}` : '',\n {\n 'tao-tag--pointer': pointer,\n 'tao-tag--closable': closable,\n 'tao-tag--prefix': Boolean(slots.prefix),\n 'tao-tag--flat': flat,\n },\n ]\"\n :style=\"style\"\n >\n <span v-if=\"$slots.prefix\" class=\"tao-tag__prefix\">\n <slot name=\"prefix\" />\n </span>\n <span class=\"tao-tag__text\"><slot /></span>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"tao-tag__close\"\n :aria-label=\"closeLabel\"\n @click.stop=\"onClose\"\n >\n ✕\n </button>\n </span>\n</template>\n\n<style scoped>\n.tao-tag {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n max-width: 100%;\n height: auto;\n margin: 0;\n padding: 1px var(--tao-space-2);\n vertical-align: middle;\n white-space: nowrap;\n text-align: start;\n line-height: 1.25;\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--prefix {\n padding-block: 2px;\n padding-inline-start: 3px;\n}\n\n.tao-tag--closable {\n padding-inline-end: 2px;\n}\n\n.tao-tag__prefix {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n}\n\n.tao-tag__prefix :deep(.tao-avatar) {\n display: block;\n}\n\n.tao-tag__text {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tao-tag__close {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n margin: 0;\n padding: 0;\n border: none;\n border-radius: var(--tao-radius-full);\n background: transparent;\n color: currentColor;\n opacity: 0.72;\n font-family: inherit;\n font-size: 11px;\n line-height: 1;\n cursor: pointer;\n}\n\n.tao-tag__close:hover {\n opacity: 1;\n background: color-mix(in srgb, currentColor 14%, transparent);\n}\n\n.tao-tag__close:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 1px;\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.tao-tag--error {\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\n.tao-tag--flat,\n.tao-tag--flat.tao-tag--neutral,\n.tao-tag--flat.tao-tag--success,\n.tao-tag--flat.tao-tag--danger,\n.tao-tag--flat.tao-tag--error,\n.tao-tag--flat.tao-tag--warning,\n.tao-tag--flat.tao-tag--info {\n border-color: transparent;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'TaoDivider' });\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'gap' | 'line' | 'text';\n size?: 'small' | 'medium' | 'large' | 'big';\n }>(),\n {\n variant: 'line',\n size: 'medium',\n },\n);\n\nconst gapSize = computed(() => (props.size === 'big' ? 'large' : props.size));\n</script>\n\n<template>\n <div v-if=\"variant === 'gap'\" class=\"tao-divider-gap\" :class=\"`tao-divider-gap--${gapSize}`\"></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--large,\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>\ndefineOptions({ name: 'TaoFieldset' });\n\nwithDefaults(\n defineProps<{\n legend?: string;\n /** Подпись на верхней рамке. */\n align?: 'start' | 'center' | 'end';\n }>(),\n {\n legend: '',\n align: 'start',\n },\n);\n</script>\n\n<template>\n <fieldset class=\"tao-fieldset\" :class=\"`tao-fieldset--${align}`\">\n <legend v-if=\"legend || $slots.legend\" class=\"tao-fieldset__legend\">\n <slot name=\"legend\">{{ legend }}</slot>\n </legend>\n <div class=\"tao-fieldset__body\">\n <slot />\n </div>\n </fieldset>\n</template>\n\n<style scoped>\n.tao-fieldset {\n margin: 0;\n min-width: 0;\n padding: 0 var(--tao-space-4) var(--tao-space-4);\n border: 1px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-panel);\n color: var(--tao-color-text);\n background: transparent;\n}\n\n.tao-fieldset__legend {\n padding: 0 var(--tao-space-2);\n font-size: var(--tao-font-size-sm);\n font-weight: 500;\n color: var(--tao-color-text);\n background: var(--tao-color-bg);\n}\n\n.tao-fieldset--start .tao-fieldset__legend {\n margin-inline-start: var(--tao-space-2);\n}\n\n.tao-fieldset--center .tao-fieldset__legend {\n margin-inline: auto;\n}\n\n.tao-fieldset--end .tao-fieldset__legend {\n margin-inline-start: auto;\n margin-inline-end: var(--tao-space-2);\n}\n\n.tao-fieldset__body {\n padding-top: var(--tao-space-3);\n}\n</style>\n","<script lang=\"ts\" setup>\ndefineOptions({ name: 'TaoAnimatedBorder' });\n\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 { computed, inject, nextTick, onMounted, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\n\ndefineOptions({ name: 'TaoTextarea' });\n\nconst props = withDefaults(\n defineProps<{\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 modelValue?: string;\n noBorder?: boolean;\n noBackground?: boolean;\n autoFocus?: boolean;\n borderInverse?: boolean;\n textCenter?: boolean;\n submitOnEnter?: boolean;\n error?: boolean;\n id?: string;\n /** Показать «введено / максимум» под полем. Имеет смысл вместе с `maxlength`. */\n count?: boolean;\n }>(),\n {\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 noBorder: false,\n noBackground: false,\n autoFocus: false,\n borderInverse: false,\n textCenter: false,\n submitOnEnter: false,\n error: false,\n count: false,\n },\n);\n\nconst emit = defineEmits(['update:modelValue', 'change', 'focus', 'blur', 'keydown']);\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 counterId = computed(() => `${controlId.value}-count`);\nconst describedBy = computed(() => {\n const ids = [field?.describedBy.value, props.count ? counterId.value : undefined].filter(Boolean);\n return ids.length ? ids.join(' ') : undefined;\n});\n\nconst currentLength = computed(() => String(props.modelValue ?? '').length);\nconst countLabel = computed(() => {\n if (props.maxlength != null && props.maxlength > 0) {\n return `${currentLength.value} / ${props.maxlength}`;\n }\n return String(currentLength.value);\n});\nconst atLimit = computed(\n () => props.maxlength != null && props.maxlength > 0 && currentLength.value >= props.maxlength,\n);\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\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(\n () => props.modelValue,\n () => {\n nextTick(autoResize);\n },\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=\"dummy\" class=\"tao-textarea tao-textarea--dummy\">{{ modelValue }}</span>\n <div v-else class=\"tao-textarea-wrap\">\n <textarea\n :id=\"controlId\"\n ref=\"textareaRef\"\n class=\"tao-textarea\"\n :class=\"{\n 'tao-textarea--inverse': borderInverse,\n 'tao-textarea--center': textCenter,\n 'tao-textarea--no-border': noBorder,\n 'tao-textarea--no-background': noBackground,\n 'tao-textarea--no-resize': !resize,\n 'tao-textarea--invalid': invalid,\n }\"\n :placeholder=\"placeholder\"\n :spellcheck=\"spellcheck\"\n :autocomplete=\"autocomplete\"\n :minlength=\"minlength\"\n :maxlength=\"maxlength\"\n :disabled=\"disabled\"\n :rows=\"rows\"\n :value=\"modelValue\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n draggable=\"false\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown=\"onKeydown\"\n ></textarea>\n <span\n v-if=\"count\"\n :id=\"counterId\"\n class=\"tao-textarea__count\"\n :class=\"{ 'tao-textarea__count--limit': atLimit }\"\n >{{ countLabel }}</span>\n </div>\n</template>\n\n<style scoped>\n.tao-textarea-wrap {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-1);\n width: 100%;\n}\n\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--invalid {\n border-color: var(--tao-color-danger);\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\n.tao-textarea__count {\n align-self: flex-end;\n font-size: var(--tao-font-size-xs);\n line-height: 1;\n color: var(--tao-color-text-muted);\n font-variant-numeric: tabular-nums;\n user-select: none;\n}\n\n.tao-textarea__count--limit {\n color: var(--tao-color-danger);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, reactive, onBeforeMount, onBeforeUnmount } from 'vue';\n\ndefineOptions({ name: 'TaoScrollTop' });\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 type=\"button\"\n :style=\"mainStyle\"\n :tabindex=\"props.tabindex\"\n class=\"tao-scroll-top\"\n :class=\"{ 'tao-scroll-top--no-outline': !props.hasOutline }\"\n aria-label=\"Наверх\"\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>\nimport { computed, useSlots } from 'vue';\n\ndefineOptions({ name: 'TaoProgress' });\n\nconst props = withDefaults(\n defineProps<{\n minWidth?: number;\n maxWidth?: number;\n /** @deprecated используйте minWidth */\n min?: number;\n /** @deprecated используйте maxWidth */\n max?: number;\n progress?: number;\n height?: number;\n /** `true` / `top` — по центру над полосой, `right` — справа. Если есть `#right`, процент справа в скобках. `false` — скрыть. */\n showPercentage?: boolean | 'top' | 'right';\n animated?: boolean;\n }>(),\n {\n minWidth: undefined,\n maxWidth: undefined,\n min: undefined,\n max: undefined,\n progress: 0,\n height: 8,\n showPercentage: true,\n animated: true,\n },\n);\n\nconst slots = useSlots();\nconst minW = computed(() => props.minWidth ?? props.min ?? 200);\nconst maxW = computed(() => props.maxWidth ?? props.max ?? 400);\nconst hasRight = computed(() => Boolean(slots.right));\nconst percentPlace = computed((): 'top' | 'right' | null => {\n if (!props.showPercentage) {\n return null;\n }\n return props.showPercentage === 'right' ? 'right' : 'top';\n});\nconst showOverPercent = computed(() => percentPlace.value === 'top');\nconst showEndPercent = computed(() => percentPlace.value === 'right');\nconst endPercentLabel = computed(() =>\n hasRight.value ? `(${props.progress}%)` : `${props.progress}%`,\n);\n</script>\n\n<template>\n <div class=\"tao-progress\">\n <div\n class=\"tao-progress__container\"\n :class=\"{ 'tao-progress__container--over': showOverPercent }\"\n :style=\"{ minWidth: `${minW}px`, maxWidth: `${maxW}px` }\"\n >\n <div v-if=\"$slots.left\" class=\"tao-progress__side\">\n <slot name=\"left\" />\n </div>\n\n <div class=\"tao-progress__main\">\n <span v-if=\"showOverPercent\" class=\"tao-progress__percentage\">{{ progress }}%</span>\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 </div>\n\n <div v-if=\"$slots.right || showEndPercent\" class=\"tao-progress__side\">\n <slot name=\"right\" />\n <span v-if=\"showEndPercent\" class=\"tao-progress__percentage\">{{ endPercentLabel }}</span>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-progress {\n width: 100%;\n}\n\n.tao-progress__container {\n display: flex;\n align-items: center;\n gap: var(--tao-space-3);\n width: 100%;\n}\n\n.tao-progress__container--over {\n align-items: flex-end;\n}\n\n.tao-progress__main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-1);\n}\n\n.tao-progress__track {\n width: 100%;\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 display: inline-flex;\n flex-shrink: 0;\n align-items: baseline;\n gap: var(--tao-space-1);\n font-size: var(--tao-font-size-xs);\n font-variant-numeric: tabular-nums;\n line-height: 1;\n white-space: nowrap;\n color: var(--tao-color-text-muted);\n}\n\n.tao-progress__percentage {\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n font-size: var(--tao-font-size-xs);\n line-height: 1;\n color: var(--tao-color-text-muted);\n}\n\n.tao-progress__main > .tao-progress__percentage {\n width: 100%;\n text-align: center;\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 { computed, inject, onBeforeUnmount, onMounted, ref, useId } from 'vue';\nimport { formFieldKey } from '../formField';\nimport { listenFocusLoss } from '../focusLoss';\n\ndefineOptions({ name: 'TaoSlider' });\n\nconst props = withDefaults(\n defineProps<{\n min?: number;\n max?: number;\n step?: number;\n showValue?: boolean;\n placeholder?: string;\n modelValue: number | string;\n disabled?: boolean;\n /** `medium` — форм-контрол. `small` — тонкий трек (seek, громкость). */\n size?: 'small' | 'medium';\n }>(),\n {\n min: 0,\n max: 100,\n step: 1,\n showValue: false,\n placeholder: '',\n disabled: false,\n size: 'medium',\n },\n);\n\nconst emit = defineEmits(['update:modelValue']);\n\nconst field = inject(formFieldKey, null);\nconst localId = useId();\nconst controlId = computed(() => field?.id ?? localId);\nconst describedBy = computed(() => field?.describedBy.value);\n\nfunction packModelValue(value: number): string | number {\n return typeof props.modelValue === 'string' ? `${value}` : value;\n}\n\nfunction unpackModelValue(): number {\n const raw = typeof props.modelValue === 'string' ? parseFloat(props.modelValue) : props.modelValue;\n return Number.isFinite(raw) ? raw : props.min;\n}\n\nconst current = computed(() => unpackModelValue());\n\nconst trackRef = ref<HTMLElement | null>(null);\nconst isDragging = ref(false);\nlet dragPointer = -1;\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 if (range <= 0) {\n return 0;\n }\n return ((current.value - props.min) / range) * 100;\n});\n\nfunction clampValue(v: number) {\n return Math.min(Math.max(v, props.min), props.max);\n}\n\nfunction commit(value: number) {\n emit('update:modelValue', packModelValue(clampValue(value)));\n}\n\nfunction calculateValue(event: PointerEvent): number {\n if (!trackRef.value) {\n return props.min;\n }\n\n const rect = trackRef.value.getBoundingClientRect();\n const x = Math.min(Math.max(event.clientX - rect.left, 0), rect.width);\n const ratio = rect.width ? x / rect.width : 0;\n\n const v = props.min + ratio * (props.max - props.min);\n return clampValue(Math.round((v - props.min) / props.step) * props.step + props.min);\n}\n\nfunction releaseDragCapture() {\n const el = trackRef.value;\n const id = dragPointer;\n if (!el || id === -1) {\n return;\n }\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\n return;\n }\n try {\n el.releasePointerCapture(id);\n } catch {\n /* already released by the browser */\n }\n}\n\nfunction endDrag() {\n if (!isDragging.value) {\n return;\n }\n isDragging.value = false;\n releaseDragCapture();\n dragPointer = -1;\n}\n\nfunction onPointerDown(event: PointerEvent) {\n if (props.disabled || showShadowModel.value || event.button !== 0 || !trackRef.value) {\n return;\n }\n\n dragPointer = event.pointerId;\n isDragging.value = true;\n commit(calculateValue(event));\n event.preventDefault();\n try {\n trackRef.value.setPointerCapture(event.pointerId);\n } catch {\n /* untrusted events / capture already gone */\n }\n}\n\nfunction onPointerMove(event: PointerEvent) {\n if (!isDragging.value || event.pointerId !== dragPointer) {\n return;\n }\n commit(calculateValue(event));\n}\n\nfunction onPointerEnd(event: PointerEvent) {\n if (!isDragging.value) {\n return;\n }\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\n return;\n }\n endDrag();\n}\n\nfunction onLostPointerCapture() {\n endDrag();\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (props.disabled || showShadowModel.value) {\n return;\n }\n\n const keys: Record<string, number> = {\n ArrowLeft: -props.step,\n ArrowDown: -props.step,\n ArrowRight: props.step,\n ArrowUp: props.step,\n PageDown: -props.step * 10,\n PageUp: props.step * 10,\n };\n\n if (event.key in keys) {\n event.preventDefault();\n commit(current.value + keys[event.key]!);\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n commit(props.min);\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n commit(props.max);\n }\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.disabled || !props.showValue) {\n return;\n }\n shadowModel.value = `${props.modelValue}`;\n showShadowModel.value = true;\n requestAnimationFrame(() => shadowInputRef.value?.focus());\n}\n\nlet stopFocusLoss: (() => void) | undefined;\n\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(endDrag);\n});\n\nonBeforeUnmount(() => {\n endDrag();\n stopFocusLoss?.();\n});\n</script>\n\n<template>\n <div\n :id=\"controlId\"\n ref=\"trackRef\"\n class=\"tao-slider\"\n :class=\"[\n `tao-slider--${size}`,\n { 'tao-slider--show-value': showValue, 'tao-slider--disabled': disabled },\n ]\"\n role=\"slider\"\n :tabindex=\"disabled ? -1 : 0\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"current\"\n :aria-disabled=\"disabled || undefined\"\n :aria-describedby=\"describedBy\"\n @contextmenu.prevent=\"onContextMenu\"\n @pointerdown=\"onPointerDown\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerEnd\"\n @pointercancel=\"onPointerEnd\"\n @lostpointercapture=\"onLostPointerCapture\"\n @keydown=\"onKeydown\"\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 @pointerdown.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 --tao-slider-hit: 14px;\n --tao-slider-track: var(--tao-slider-hit);\n --tao-slider-thumb: 20px;\n\n position: relative;\n width: 100%;\n height: var(--tao-slider-hit);\n cursor: pointer;\n user-select: none;\n touch-action: none;\n}\n\n.tao-slider:focus {\n outline: none;\n}\n\n.tao-slider:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 4px;\n border-radius: var(--tao-radius-sm);\n}\n\n.tao-slider--show-value {\n --tao-slider-hit: 20px;\n}\n\n/* Тонкий трек, hit-area шире картинки — seek / громкость. */\n.tao-slider--small {\n --tao-slider-hit: 16px;\n --tao-slider-track: 4px;\n --tao-slider-thumb: 12px;\n}\n\n.tao-slider--small.tao-slider--show-value {\n --tao-slider-hit: 20px;\n}\n\n.tao-slider--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.tao-slider--disabled .tao-slider__thumb {\n cursor: not-allowed;\n}\n\n.tao-slider__track,\n.tao-slider__fill {\n position: absolute;\n top: 50%;\n left: 0;\n height: var(--tao-slider-track);\n border-radius: var(--tao-radius-sm);\n transform: translateY(-50%);\n}\n\n.tao-slider__track {\n width: 100%;\n background-color: var(--tao-color-surface-sunken);\n}\n\n.tao-slider__fill {\n background-color: var(--tao-color-accent);\n}\n\n.tao-slider--small .tao-slider__track,\n.tao-slider--small .tao-slider__fill {\n border-radius: var(--tao-radius-full);\n}\n\n.tao-slider__thumb {\n position: absolute;\n top: 50%;\n width: var(--tao-slider-thumb);\n height: var(--tao-slider-thumb);\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 { onBeforeUnmount, onMounted, ref } from 'vue';\nimport { listenFocusLoss } from '../focusLoss';\n\ndefineOptions({ name: 'TaoFileDrop' });\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 /** Имена выбранных файлов под зоной. Снять файл — сразу в `v-model`. */\n list?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: () => [],\n size: 'medium',\n accept: '*',\n multiple: false,\n showClear: false,\n list: true,\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 sameFile(a: File, b: File) {\n return a.name === b.name && a.size === b.size && a.lastModified === b.lastModified;\n}\n\nfunction commit(files: File[]) {\n emit('update:modelValue', files);\n emit('files', files);\n}\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 removeAt(index: number) {\n commit(props.modelValue.filter((_, item) => item !== index));\n}\n\nfunction processFiles(fileList: FileList) {\n const incoming = Array.from(fileList);\n if (!incoming.length) {\n return;\n }\n\n let result: File[];\n if (!props.multiple) {\n result = [incoming[0]!];\n } else {\n result = [...props.modelValue];\n for (const file of incoming) {\n if (!result.some((item) => sameFile(item, file))) {\n result.push(file);\n }\n }\n }\n\n commit(result);\n\n const el = fileInput.value;\n if (el) {\n el.type = 'text';\n el.type = 'file';\n }\n}\n\nfunction formatSize(bytes: number) {\n if (bytes < 1024) {\n return `${bytes} Б`;\n }\n const kb = bytes / 1024;\n if (kb < 1024) {\n const value = kb < 10 ? kb.toFixed(1) : String(Math.round(kb));\n return `${value.replace('.', ',')} КБ`;\n }\n const mb = kb / 1024;\n const value = mb < 10 ? mb.toFixed(1) : String(Math.round(mb));\n return `${value.replace('.', ',')} МБ`;\n}\n\nfunction fileKey(file: File, index: number) {\n return `${file.name}-${file.size}-${file.lastModified}-${index}`;\n}\n\nlet stopFocusLoss: (() => void) | undefined;\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(() => {\n isDragging.value = false;\n });\n});\nonBeforeUnmount(() => stopFocusLoss?.());\n\n</script>\n\n<template>\n <div class=\"tao-file-drop\">\n <div class=\"tao-file-drop__row\">\n <button\n v-if=\"showClear && modelValue.length\"\n type=\"button\"\n class=\"tao-file-drop__clear\"\n aria-label=\"Очистить файлы\"\n @click=\"requestClear\"\n >\n ✕\n </button>\n\n <label\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 >\n <slot>Перетащите файл сюда или нажмите, чтобы выбрать</slot>\n\n <input\n ref=\"fileInput\"\n class=\"tao-sr-only\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n @change=\"handleFileSelect\"\n @click.stop\n />\n </label>\n </div>\n\n <ul v-if=\"list && modelValue.length\" class=\"tao-file-drop__list\">\n <li v-for=\"(file, index) in modelValue\" :key=\"fileKey(file, index)\" class=\"tao-file-drop__file\">\n <span class=\"tao-file-drop__name\">{{ file.name }}</span>\n <span class=\"tao-file-drop__meta\">{{ formatSize(file.size) }}</span>\n <button\n type=\"button\"\n class=\"tao-file-drop__remove\"\n :aria-label=\"`Убрать «${file.name}»`\"\n @click=\"removeAt(index)\"\n >\n ✕\n </button>\n </li>\n </ul>\n </div>\n</template>\n\n<style scoped>\n.tao-file-drop {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-2);\n user-select: none;\n}\n\n.tao-file-drop__row {\n display: flex;\n gap: var(--tao-space-3);\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.tao-file-drop__zone:focus-within {\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\n.tao-file-drop__list {\n margin: 0;\n padding: 0;\n overflow: hidden;\n list-style: none;\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-control);\n}\n\n.tao-file-drop__file {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n min-width: 0;\n min-height: 36px;\n padding: 0 var(--tao-space-2) 0 var(--tao-space-3);\n border-bottom: 1px solid var(--tao-color-border);\n background: var(--tao-color-surface-raised);\n color: var(--tao-color-text);\n}\n\n.tao-file-drop__file:last-child {\n border-bottom: none;\n}\n\n.tao-file-drop__name {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n font-size: var(--tao-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: text;\n}\n\n.tao-file-drop__meta {\n flex-shrink: 0;\n font-size: var(--tao-font-size-xs);\n color: var(--tao-color-text-muted);\n}\n\n.tao-file-drop__remove {\n flex-shrink: 0;\n width: 28px;\n height: 28px;\n margin: 0;\n padding: 0;\n border: none;\n border-radius: var(--tao-radius-sm);\n background: none;\n color: var(--tao-color-text-muted);\n font: inherit;\n font-size: var(--tao-font-size-sm);\n line-height: 1;\n cursor: pointer;\n}\n\n.tao-file-drop__remove:hover {\n color: var(--tao-color-danger);\n background: var(--tao-color-danger-subtle);\n}\n\n.tao-file-drop__remove:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, onMounted, reactive, ref } from 'vue';\nimport type { TaoDropdownAction } from '../dropdown';\n\ndefineOptions({ name: 'TaoDropdownMenu' });\n\nconst props = withDefaults(\n defineProps<{\n actions?: TaoDropdownAction[];\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 { computed, inject, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\n\ndefineOptions({ name: 'TaoPinCode' });\n\nconst props = withDefaults(\n defineProps<{\n length: number;\n hidden?: boolean;\n placeholder?: string;\n modelValue?: string;\n numbersOnly?: boolean;\n /** `focus` — клик сбрасывает ячейку и все справа (неверный код, набор заново).\n * `input` — цифра остаётся, пока не введут новую. */\n clearOn?: 'focus' | 'input';\n }>(),\n {\n hidden: false,\n placeholder: '',\n modelValue: '',\n numbersOnly: false,\n clearOn: 'focus',\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n change: [value: string];\n complete: [value: string];\n active: [el: HTMLInputElement | null, index: number];\n blur: [];\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 numbers = ref<string[]>([]);\nconst inputRefs = ref<(HTMLInputElement | null)[]>([]);\nconst activeNumber = ref(-1);\n\nfunction acceptChar(ch: string): string {\n if (!ch) {\n return '';\n }\n if (props.numbersOnly && !/^[0-9]$/.test(ch)) {\n return '';\n }\n return ch;\n}\n\nfunction cellsFromModel(value: string): string[] {\n const raw = value ?? '';\n return Array.from({ length: props.length }, (_, index) => acceptChar(raw[index] ?? ''));\n}\n\nfunction serialize(): string {\n return numbers.value.join('');\n}\n\nfunction emitChange() {\n const next = serialize();\n if (next !== (props.modelValue ?? '')) {\n emit('update:modelValue', next);\n emit('change', next);\n }\n}\n\nfunction firstEmptyIndex(): number {\n const index = numbers.value.findIndex((cell) => !cell);\n return index === -1 ? numbers.value.length : index;\n}\n\nfunction focusCell(index: number) {\n inputRefs.value[index]?.focus();\n}\n\nfunction isFilled(): boolean {\n return numbers.value.length === props.length && numbers.value.every((cell) => cell !== '');\n}\n\nfunction mutation(v: string, index: number) {\n const char = v.length > 1 ? (v[v.length - 1] ?? '') : v;\n const next = acceptChar(char);\n\n if (props.numbersOnly && char && !next) {\n return;\n }\n\n numbers.value = [...numbers.value];\n numbers.value[index] = next;\n emitChange();\n\n if (!next) {\n return;\n }\n\n if (isFilled()) {\n inputRefs.value[index]?.blur();\n emit('complete', serialize());\n return;\n }\n\n const nextEmpty = numbers.value.findIndex((cell, cellIndex) => cellIndex > index && !cell);\n const target = nextEmpty !== -1 ? nextEmpty : index + 1;\n if (target < props.length) {\n focusCell(target);\n }\n}\n\nfunction onFocus(index: number) {\n if (props.clearOn === 'input') {\n const firstEmpty = firstEmptyIndex();\n if (firstEmpty < props.length && index > firstEmpty) {\n focusCell(firstEmpty);\n return;\n }\n\n activeNumber.value = index;\n emit('active', inputRefs.value[index] ?? null, index);\n requestAnimationFrame(() => inputRefs.value[index]?.select());\n return;\n }\n\n numbers.value = numbers.value.map((cell, cellIndex) => (cellIndex >= index ? '' : cell));\n activeNumber.value = index;\n emitChange();\n emit('active', inputRefs.value[index] ?? null, index);\n}\n\nfunction onChange(e: Event, index: number) {\n mutation((e.target as HTMLInputElement).value, index);\n}\n\nfunction onKeydown(event: KeyboardEvent, index: number) {\n if (event.key !== 'Backspace') {\n return;\n }\n\n if (numbers.value[index]) {\n return;\n }\n\n if (index > 0) {\n event.preventDefault();\n numbers.value = [...numbers.value];\n numbers.value[index - 1] = '';\n focusCell(index - 1);\n activeNumber.value = index - 1;\n emitChange();\n }\n}\n\nfunction onBlur() {\n requestAnimationFrame(() => {\n const active = document.activeElement;\n if (!inputRefs.value.includes(active as HTMLInputElement | null)) {\n activeNumber.value = -1;\n emit('blur');\n }\n });\n}\n\nwatch(\n () => [props.modelValue, props.length, props.numbersOnly] as const,\n () => {\n const next = cellsFromModel(props.modelValue ?? '');\n if (next.join('') !== numbers.value.join('') || next.length !== numbers.value.length) {\n numbers.value = next;\n }\n },\n { immediate: true },\n);\n</script>\n\n<template>\n <div\n class=\"tao-pin-code\"\n role=\"group\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n >\n <input\n v-for=\"(num, index) of numbers\"\n :id=\"index === 0 ? controlId : undefined\"\n :key=\"index\"\n :ref=\"(el) => (inputRefs[index] = el as HTMLInputElement)\"\n class=\"tao-pin-code__value\"\n :class=\"{\n 'tao-pin-code__value--active': activeNumber === index,\n 'tao-pin-code__value--invalid': invalid,\n }\"\n :value=\"num\"\n :placeholder=\"placeholder\"\n :type=\"hidden ? 'password' : 'text'\"\n :inputmode=\"numbersOnly ? 'numeric' : 'text'\"\n :pattern=\"numbersOnly ? '[0-9]' : undefined\"\n autocomplete=\"one-time-code\"\n maxlength=\"1\"\n @input=\"onChange($event, index)\"\n @keydown=\"onKeydown($event, index)\"\n @focus=\"onFocus(index)\"\n @blur=\"onBlur\"\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.tao-pin-code__value:focus {\n border-color: var(--tao-color-accent);\n}\n\n.tao-pin-code__value--invalid {\n border-color: var(--tao-color-danger);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, getCurrentInstance } from 'vue';\n\ndefineOptions({ name: 'TaoLink' });\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\nconst globals = getCurrentInstance()?.appContext.components ?? {};\n\n// NuxtLink (Nuxt) → RouterLink (vue-router) → <a>.\n// Nuxt первым: это обёртка над RouterLink с prefetch.\n// Ищем в глобальном реестре, а не через resolveComponent — иначе Vue\n// пишет warning, если Nuxt/vue-router в проекте нет.\nconst linkKind = globals.NuxtLink ? 'nuxt' : globals.RouterLink ? 'router' : 'a';\nconst linkComponent =\n linkKind === 'nuxt' ? globals.NuxtLink : linkKind === 'router' ? globals.RouterLink : 'a';\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 (linkKind === '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 ...(linkKind === 'nuxt' ? { 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 | null];\n change: [value: string | number | null];\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 panelRef = ref<HTMLElement | 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 panel = panelRef.value;\n\n if (!trigger || !panel) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const panelHeight = panel.offsetHeight;\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom - gap;\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\n\n listStyle.value = {\n top: `${openUp ? rect.top - panelHeight - 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 clear() {\n emit('update:modelValue', null);\n emit('change', null);\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 === 'Backspace' || event.key === 'Delete') && selected.value) {\n event.preventDefault();\n clear();\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 === 'Backspace' || event.key === 'Delete') {\n if (selected.value) {\n event.preventDefault();\n clear();\n }\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) || 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-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 <div\n v-if=\"open\"\n ref=\"panelRef\"\n class=\"tao-select__panel\"\n :style=\"listStyle\"\n >\n <ul\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 @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 <button\n v-if=\"selected\"\n type=\"button\"\n class=\"tao-select__clear\"\n @mousedown.prevent\n @click=\"clear\"\n >\n Очистить\n </button>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-select__panel {\n z-index: 1050;\n position: fixed;\n overflow: hidden;\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__list {\n margin: 0;\n padding: var(--tao-space-1);\n max-height: 240px;\n overflow: auto;\n list-style: none;\n}\n\n.tao-select__list:focus {\n outline: none;\n}\n\n.tao-select__clear {\n display: block;\n width: 100%;\n margin: 0;\n padding: var(--tao-space-2) var(--tao-space-3);\n border: none;\n border-top: 1px solid var(--tao-color-border);\n background: none;\n color: var(--tao-color-text-muted);\n font: inherit;\n font-size: var(--tao-font-size-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.tao-select__clear:hover {\n color: var(--tao-color-accent);\n background: var(--tao-color-surface-hover);\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","<script lang=\"ts\" setup>\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\nimport { listenFocusLoss } from '../focusLoss';\nimport type { TaoSelectOption } from '../select';\n\ndefineOptions({ name: 'TaoCombobox' });\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 allowCreate?: boolean;\n }>(),\n {\n modelValue: null,\n options: () => [],\n placeholder: 'Начните вводить',\n disabled: false,\n error: false,\n allowCreate: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n change: [value: string | number | null];\n /** Новое значение, которого не было в `options`. Список сам не трогаем — его дополняет родитель. */\n create: [value: string];\n}>();\n\ntype ComboRow = { kind: 'option'; option: TaoSelectOption } | { kind: 'create'; text: string };\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 focused = ref(false);\nconst picking = ref(false);\nconst skipFocusOpen = ref(false);\nconst query = ref('');\nconst activeIndex = ref(-1);\nconst fieldRef = ref<HTMLElement | null>(null);\nconst inputRef = ref<HTMLInputElement | null>(null);\nconst panelRef = ref<HTMLElement | null>(null);\nconst listRef = ref<HTMLElement | null>(null);\nconst listStyle = ref({ top: '0px', left: '0px', width: '0px' });\n\nconst selected = computed((): TaoSelectOption | null => {\n const found = props.options.find((option) => option.value === props.modelValue);\n if (found) {\n return found;\n }\n if (props.modelValue === null || props.modelValue === undefined || props.modelValue === '') {\n return null;\n }\n return { value: props.modelValue, label: String(props.modelValue) };\n});\n\nconst needle = computed(() => query.value.trim().toLowerCase());\n\nconst filtered = computed(() => {\n if (!needle.value) {\n return props.options;\n }\n return props.options.filter((option) => option.label.toLowerCase().includes(needle.value));\n});\n\nconst canCreate = computed(() => {\n const text = query.value.trim();\n if (!props.allowCreate || !text) {\n return false;\n }\n return !props.options.some((option) => option.label.toLowerCase() === text.toLowerCase());\n});\n\nconst rows = computed((): ComboRow[] => {\n const next: ComboRow[] = filtered.value.map((option) => ({ kind: 'option', option }));\n if (canCreate.value) {\n next.push({ kind: 'create', text: query.value.trim() });\n }\n return next;\n});\n\nconst enabledIndexes = computed(() =>\n rows.value\n .map((row, index) => (row.kind === 'option' && row.option.disabled ? -1 : index))\n .filter((index) => index >= 0),\n);\n\nconst activeId = computed(() => (activeIndex.value >= 0 ? `${listId}-row-${activeIndex.value}` : undefined));\n\nfunction syncQueryFromModel() {\n query.value = selected.value?.label ?? '';\n}\n\nfunction updatePosition() {\n const trigger = fieldRef.value;\n const panel = panelRef.value;\n\n if (!trigger || !panel) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const panelHeight = panel.offsetHeight;\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom - gap;\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\n\n listStyle.value = {\n top: `${openUp ? rect.top - panelHeight - gap : rect.bottom + gap}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nfunction resetActive() {\n const selectedIndex = rows.value.findIndex(\n (row) => row.kind === 'option' && row.option.value === props.modelValue,\n );\n if (selectedIndex >= 0 && enabledIndexes.value.includes(selectedIndex)) {\n activeIndex.value = selectedIndex;\n return;\n }\n activeIndex.value = enabledIndexes.value[0] ?? -1;\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 resetActive();\n await nextTick();\n updatePosition();\n scrollActiveIntoView();\n}\n\nfunction emitValue(value: string | number | null) {\n emit('update:modelValue', value);\n emit('change', value);\n}\n\nfunction keepFocusQuiet() {\n skipFocusOpen.value = true;\n picking.value = false;\n inputRef.value?.focus();\n}\n\nfunction commitCreated(value: string) {\n emitValue(value);\n emit('create', value);\n query.value = value;\n open.value = false;\n keepFocusQuiet();\n}\n\nfunction selectOption(option: TaoSelectOption) {\n if (option.disabled) {\n return;\n }\n\n emitValue(option.value);\n query.value = option.label;\n open.value = false;\n keepFocusQuiet();\n}\n\nfunction createFromQuery(text: string) {\n const value = text.trim();\n if (!value) {\n return;\n }\n\n const exact = props.options.find(\n (option) => !option.disabled && option.label.toLowerCase() === value.toLowerCase(),\n );\n if (exact) {\n selectOption(exact);\n return;\n }\n\n if (!props.allowCreate) {\n return;\n }\n\n commitCreated(value);\n}\n\nfunction clear() {\n emitValue(null);\n query.value = '';\n open.value = false;\n inputRef.value?.focus();\n}\n\nfunction revertQuery() {\n syncQueryFromModel();\n}\n\nfunction closeAndRevert() {\n open.value = false;\n revertQuery();\n}\n\nfunction closeAndCommit() {\n open.value = false;\n const text = query.value.trim();\n if (!text) {\n revertQuery();\n return;\n }\n\n const exact = props.options.find(\n (option) => !option.disabled && option.label.toLowerCase() === text.toLowerCase(),\n );\n if (exact) {\n emitValue(exact.value);\n query.value = exact.label;\n return;\n }\n\n if (props.allowCreate) {\n emitValue(text);\n emit('create', text);\n query.value = text;\n return;\n }\n\n revertQuery();\n}\n\nfunction moveActive(delta: number) {\n const enabled = enabledIndexes.value;\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 if (!list || activeIndex.value < 0) {\n return;\n }\n\n const option = list.querySelector<HTMLElement>(`[data-tao-combobox-index=\"${activeIndex.value}\"]`);\n option?.scrollIntoView({ block: 'nearest' });\n}\n\nfunction onFieldMouseDown(event: MouseEvent) {\n if (props.disabled || event.button !== 0) {\n return;\n }\n\n const onInput = event.target === inputRef.value;\n if (onInput) {\n if (focused.value && !open.value) {\n void setOpen(true);\n }\n return;\n }\n\n event.preventDefault();\n if (open.value) {\n open.value = false;\n return;\n }\n\n inputRef.value?.focus();\n void setOpen(true);\n}\n\nfunction onInput() {\n if (props.disabled) {\n return;\n }\n\n void setOpen(true);\n resetActive();\n}\n\nfunction onFocus() {\n if (props.disabled) {\n return;\n }\n\n focused.value = true;\n if (skipFocusOpen.value) {\n skipFocusOpen.value = false;\n return;\n }\n void setOpen(true);\n nextTick(() => inputRef.value?.select());\n}\n\nfunction markPicking() {\n picking.value = true;\n}\n\nfunction onBlur() {\n focused.value = false;\n window.setTimeout(() => {\n if (picking.value) {\n picking.value = false;\n return;\n }\n if (fieldRef.value?.contains(document.activeElement) || panelRef.value?.contains(document.activeElement)) {\n return;\n }\n if (props.allowCreate) {\n closeAndCommit();\n return;\n }\n closeAndRevert();\n }, 0);\n}\n\nfunction activateRow(row: ComboRow) {\n if (row.kind === 'create') {\n createFromQuery(row.text);\n return;\n }\n selectOption(row.option);\n}\n\nfunction onInputKeydown(event: KeyboardEvent) {\n if (props.disabled) {\n return;\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n closeAndRevert();\n return;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (!open.value) {\n void setOpen(true);\n return;\n }\n moveActive(1);\n return;\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (!open.value) {\n void setOpen(true);\n return;\n }\n moveActive(-1);\n return;\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n if (!open.value) {\n void setOpen(true);\n return;\n }\n const row = rows.value[activeIndex.value];\n if (row) {\n activateRow(row);\n return;\n }\n if (props.allowCreate) {\n createFromQuery(query.value);\n }\n }\n}\n\nfunction onDocumentPointer(event: PointerEvent) {\n const target = event.target as Node;\n if (fieldRef.value?.contains(target) || panelRef.value?.contains(target)) {\n return;\n }\n\n if (props.allowCreate) {\n closeAndCommit();\n return;\n }\n closeAndRevert();\n}\n\nfunction onViewportChange() {\n if (open.value) {\n updatePosition();\n }\n}\n\nwatch(\n () => props.modelValue,\n () => {\n if (!focused.value) {\n syncQueryFromModel();\n }\n },\n { immediate: true },\n);\n\nwatch(rows, () => {\n if (!open.value) {\n return;\n }\n if (!enabledIndexes.value.includes(activeIndex.value)) {\n activeIndex.value = enabledIndexes.value[0] ?? -1;\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\nlet stopFocusLoss: (() => void) | undefined;\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(() => {\n picking.value = false;\n });\n});\n\nonBeforeUnmount(() => {\n stopFocusLoss?.();\n document.removeEventListener('pointerdown', onDocumentPointer);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n</script>\n\n<template>\n <div\n class=\"tao-combobox\"\n :class=\"{\n 'tao-combobox--open': open,\n 'tao-combobox--invalid': invalid,\n 'tao-combobox--disabled': disabled,\n }\"\n >\n <div ref=\"fieldRef\" class=\"tao-combobox__field\" @mousedown=\"onFieldMouseDown\">\n <input\n :id=\"controlId\"\n ref=\"inputRef\"\n class=\"tao-combobox__input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n :aria-expanded=\"open\"\n :aria-controls=\"listId\"\n :aria-activedescendant=\"open ? activeId : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :value=\"query\"\n @input=\"query = ($event.target as HTMLInputElement).value; onInput()\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown=\"onInputKeydown\"\n />\n <span class=\"tao-combobox__chevron\" aria-hidden=\"true\"></span>\n </div>\n\n <Teleport to=\"body\">\n <div v-if=\"open\" ref=\"panelRef\" class=\"tao-combobox__panel\" :style=\"listStyle\">\n <ul :id=\"listId\" ref=\"listRef\" class=\"tao-combobox__list\" role=\"listbox\">\n <li v-if=\"!rows.length\" class=\"tao-combobox__empty\">Ничего не найдено</li>\n <li\n v-for=\"(row, index) in rows\"\n :id=\"`${listId}-row-${index}`\"\n :key=\"row.kind === 'create' ? 'create' : String(row.option.value)\"\n class=\"tao-combobox__option\"\n :class=\"{\n 'tao-combobox__option--active': index === activeIndex,\n 'tao-combobox__option--selected':\n row.kind === 'option' && row.option.value === modelValue,\n 'tao-combobox__option--disabled': row.kind === 'option' && row.option.disabled,\n 'tao-combobox__option--create': row.kind === 'create',\n }\"\n role=\"option\"\n :aria-selected=\"row.kind === 'option' && row.option.value === modelValue\"\n :aria-disabled=\"row.kind === 'option' && row.option.disabled ? true : undefined\"\n :data-tao-combobox-index=\"index\"\n @mousedown.prevent=\"markPicking\"\n @click=\"activateRow(row)\"\n @mouseenter=\"!(row.kind === 'option' && row.option.disabled) && (activeIndex = index)\"\n >\n <template v-if=\"row.kind === 'create'\">Добавить «{{ row.text }}»</template>\n <template v-else>{{ row.option.label }}</template>\n </li>\n </ul>\n <button\n v-if=\"selected\"\n type=\"button\"\n class=\"tao-combobox__clear\"\n @mousedown.prevent=\"markPicking\"\n >\n Очистить\n </button>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-combobox__panel {\n z-index: 1050;\n position: fixed;\n overflow: hidden;\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-combobox__list {\n margin: 0;\n padding: var(--tao-space-1);\n max-height: 240px;\n overflow: auto;\n list-style: none;\n}\n\n.tao-combobox__empty {\n padding: var(--tao-space-2) var(--tao-space-3);\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-sm);\n}\n\n.tao-combobox__clear {\n display: block;\n width: 100%;\n margin: 0;\n padding: var(--tao-space-2) var(--tao-space-3);\n border: none;\n border-top: 1px solid var(--tao-color-border);\n background: none;\n color: var(--tao-color-text-muted);\n font: inherit;\n font-size: var(--tao-font-size-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.tao-combobox__clear:hover {\n color: var(--tao-color-accent);\n background: var(--tao-color-surface-hover);\n}\n\n.tao-combobox__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-combobox__option--active,\n.tao-combobox__option:hover:not(.tao-combobox__option--disabled) {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-combobox__option--selected {\n color: var(--tao-color-accent);\n}\n\n.tao-combobox__option--create {\n color: var(--tao-color-accent);\n}\n\n.tao-combobox__option--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n</style>\n\n<style scoped>\n.tao-combobox {\n width: 100%;\n}\n\n.tao-combobox__field {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n width: 100%;\n min-height: 36px;\n padding: 0 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 transition: var(--tao-transition-base);\n}\n\n.tao-combobox__field:focus-within {\n border-color: var(--tao-color-accent);\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\n}\n\n.tao-combobox--invalid .tao-combobox__field {\n border-color: var(--tao-color-danger);\n}\n\n.tao-combobox--invalid .tao-combobox__field:focus-within {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\n}\n\n.tao-combobox__input {\n flex: 1;\n min-width: 0;\n height: 34px;\n padding: 0;\n border: none;\n background: transparent;\n color: inherit;\n font-size: var(--tao-font-size-md);\n font-family: inherit;\n outline: none;\n}\n\n.tao-combobox__input::placeholder {\n color: var(--tao-color-input-placeholder);\n}\n\n.tao-combobox__input:disabled {\n cursor: not-allowed;\n}\n\n.tao-combobox--disabled .tao-combobox__field {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.tao-combobox__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 pointer-events: none;\n transition: transform var(--tao-duration-fast) var(--tao-ease-base);\n}\n\n.tao-combobox--open .tao-combobox__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\nexport interface TaoDateRangeValue {\n start: string;\n end: string;\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 sortTaoDateRange(a: string, b: string): TaoDateRangeValue {\n return a <= b ? { start: a, end: b } : { start: b, end: a };\n}\n\nexport function parseTaoDateRange(value: TaoDateRangeValue | null | undefined): TaoDateRangeValue | null {\n if (!value) {\n return null;\n }\n\n const start = parseTaoDate(value.start);\n const end = parseTaoDate(value.end);\n if (!start || !end) {\n return null;\n }\n\n return sortTaoDateRange(formatTaoDateIso(start), formatTaoDateIso(end));\n}\n\nexport function formatTaoDateRangeLabel(start: string, end: string, locale = 'ru-RU'): string {\n const fromParts = parseTaoDate(start);\n const toParts = parseTaoDate(end);\n if (!fromParts || !toParts) {\n return '';\n }\n\n if (start === end) {\n return formatTaoDateLabel(start, locale);\n }\n\n const from = new Date(fromParts.y, fromParts.m - 1, fromParts.d).toLocaleDateString(locale, {\n day: 'numeric',\n month: 'long',\n ...(fromParts.y === toParts.y ? {} : { year: 'numeric' }),\n });\n\n return `${from} — ${formatTaoDateLabel(end, locale)}`;\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';\nimport '../styles/date-popup.css';\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-label=\"formatTaoDateLabel(cell.iso, locale)\"\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 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, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\nimport { listenFocusLoss } from '../focusLoss';\nimport {\n buildTaoDateGrid,\n formatTaoDateLabel,\n formatTaoDateRangeLabel,\n formatTaoMonthLabel,\n isTaoDateInRange,\n parseTaoDate,\n parseTaoDateRange,\n shiftTaoDate,\n shiftTaoMonth,\n sortTaoDateRange,\n taoDateWeekdayIndex,\n taoWeekdayLabels,\n todayTaoDate,\n type TaoDateRangeValue,\n} from '../date';\nimport '../styles/date-popup.css';\n\ndefineOptions({ name: 'TaoDateRange' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TaoDateRangeValue | 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: TaoDateRangeValue | null];\n change: [value: TaoDateRangeValue | 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 draftStart = ref<string | null>(null);\nconst hoverIso = ref<string | null>(null);\nconst triggerRef = ref<HTMLButtonElement | null>(null);\nconst panelRef = ref<HTMLElement | null>(null);\nconst panelStyle = ref({ top: '0px', left: '0px' });\n\nconst committed = computed(() => parseTaoDateRange(props.modelValue));\nconst highlight = computed(() => {\n if (draftStart.value) {\n return sortTaoDateRange(draftStart.value, hoverIso.value ?? cursorIso.value ?? draftStart.value);\n }\n\n return committed.value;\n});\nconst displayLabel = computed(() =>\n committed.value ? formatTaoDateRangeLabel(committed.value.start, committed.value.end, props.locale) : '',\n);\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 daySelected(iso: string) {\n return Boolean(highlight.value && (iso === highlight.value.start || iso === highlight.value.end));\n}\n\nfunction dayInRange(iso: string) {\n return Boolean(highlight.value && iso > highlight.value.start && iso < highlight.value.end);\n}\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 draftStart.value = null;\n hoverIso.value = null;\n syncViewFrom(committed.value?.start ?? 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 commitRange(range: TaoDateRangeValue) {\n emit('update:modelValue', range);\n emit('change', range);\n draftStart.value = null;\n hoverIso.value = null;\n close();\n triggerRef.value?.focus();\n}\n\nfunction selectDay(iso: string) {\n if (!isTaoDateInRange(iso, props.min, props.max)) {\n return;\n }\n\n if (!draftStart.value) {\n draftStart.value = iso;\n hoverIso.value = iso;\n cursorIso.value = iso;\n return;\n }\n\n commitRange(sortTaoDateRange(draftStart.value, iso));\n}\n\nfunction selectToday() {\n if (!todayEnabled.value) {\n return;\n }\n\n commitRange({ start: todayIso.value, end: todayIso.value });\n}\n\nfunction clear() {\n emit('update:modelValue', null);\n emit('change', null);\n draftStart.value = null;\n hoverIso.value = null;\n close();\n triggerRef.value?.focus();\n}\n\nfunction goMonth(delta: number) {\n hoverIso.value = null;\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 hoverIso.value = null;\n cursorIso.value = shiftTaoDate(cursorIso.value, days);\n syncViewFrom(cursorIso.value);\n void nextTick(updatePosition);\n}\n\nfunction onDayEnter(iso: string) {\n if (!isTaoDateInRange(iso, props.min, props.max)) {\n return;\n }\n\n hoverIso.value = iso;\n}\n\nfunction onGridLeave() {\n hoverIso.value = null;\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 draftStart.value = null;\n hoverIso.value = null;\n document.removeEventListener('pointerdown', onDocumentPointer);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n\nlet stopFocusLoss: (() => void) | undefined;\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(() => {\n hoverIso.value = null;\n });\n});\n\nonBeforeUnmount(() => {\n stopFocusLoss?.();\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-range\" :class=\"{ 'tao-date-range--open': open, 'tao-date-range--invalid': invalid }\">\n <button\n :id=\"controlId\"\n ref=\"triggerRef\"\n type=\"button\"\n class=\"tao-date-range__trigger\"\n :class=\"{ 'tao-date-range__trigger--placeholder': !committed }\"\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-range__value\">{{ displayLabel || placeholder }}</span>\n <svg class=\"tao-date-range__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\" @mouseleave=\"onGridLeave\">\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': daySelected(cell.iso),\n 'tao-date__day--in-range': dayInRange(cell.iso),\n 'tao-date__day--range-start': highlight?.start === cell.iso,\n 'tao-date__day--range-end': highlight?.end === cell.iso,\n 'tao-date__day--cursor': cell.iso === cursorIso,\n 'tao-date__day--disabled': !isTaoDateInRange(cell.iso, min, max),\n }\"\n role=\"gridcell\"\n :aria-label=\"formatTaoDateLabel(cell.iso, locale)\"\n :aria-selected=\"daySelected(cell.iso)\"\n :disabled=\"!isTaoDateInRange(cell.iso, min, max)\"\n @mousedown.prevent\n @mouseenter=\"onDayEnter(cell.iso)\"\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=\"selectToday\">\n Сегодня\n </button>\n <button v-if=\"committed\" type=\"button\" class=\"tao-date__link\" @click=\"clear\">Очистить</button>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style scoped>\n.tao-date-range {\n width: 100%;\n}\n\n.tao-date-range__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-range__trigger--placeholder {\n color: var(--tao-color-input-placeholder);\n}\n\n.tao-date-range__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-range--invalid .tao-date-range__trigger {\n border-color: var(--tao-color-danger);\n}\n\n.tao-date-range--invalid .tao-date-range__trigger:focus {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\n}\n\n.tao-date-range__trigger:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.tao-date-range__value {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tao-date-range__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","import type { ComputedRef, InjectionKey } from 'vue';\nimport type { TaoRadioValue } from './radio';\n\nexport type TaoSegmentedSize = 'small' | 'medium' | 'large';\n\nexport interface TaoSegmentedContext {\n name: ComputedRef<string>;\n model: ComputedRef<TaoRadioValue | undefined>;\n disabled: ComputedRef<boolean>;\n size: ComputedRef<TaoSegmentedSize>;\n setValue: (value: TaoRadioValue) => void;\n}\n\nexport const segmentedKey: InjectionKey<TaoSegmentedContext> = Symbol('taoSegmented');\n","<script lang=\"ts\" setup>\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, provide, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\nimport { type TaoRadioValue } from '../radio';\nimport { segmentedKey, type TaoSegmentedSize } from '../segmented';\n\ndefineOptions({ name: 'TaoSegmented' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TaoRadioValue;\n name?: string;\n legend?: string;\n disabled?: boolean;\n size?: TaoSegmentedSize;\n block?: boolean;\n }>(),\n {\n disabled: false,\n size: 'medium',\n block: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoRadioValue];\n change: [value: TaoRadioValue];\n}>();\n\nconst field = inject(formFieldKey, null);\nconst autoName = useId();\nconst groupName = computed(() => props.name || autoName);\nconst model = computed(() => props.modelValue);\nconst groupDisabled = computed(() => props.disabled);\nconst groupSize = computed(() => props.size);\nconst invalid = computed(() => Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\n\nconst trackRef = ref<HTMLElement | null>(null);\nconst thumbStyle = ref<Record<string, string>>({ opacity: '0' });\nlet resizeObserver: ResizeObserver | null = null;\nlet mutationObserver: MutationObserver | null = null;\n\nfunction setValue(value: TaoRadioValue) {\n emit('update:modelValue', value);\n emit('change', value);\n}\n\nfunction updateThumb() {\n const track = trackRef.value;\n if (!track) {\n return;\n }\n\n const selected = track.querySelector<HTMLElement>('.tao-segmented-option--checked');\n if (!selected) {\n if (thumbStyle.value.opacity !== '0') {\n thumbStyle.value = { opacity: '0' };\n }\n return;\n }\n\n const trackBox = track.getBoundingClientRect();\n const optionBox = selected.getBoundingClientRect();\n const next = {\n width: `${optionBox.width}px`,\n height: `${optionBox.height}px`,\n transform: `translate(${optionBox.left - trackBox.left - track.clientLeft}px, ${optionBox.top - trackBox.top - track.clientTop}px)`,\n opacity: '1',\n };\n\n const prev = thumbStyle.value;\n if (\n prev.width === next.width &&\n prev.height === next.height &&\n prev.transform === next.transform &&\n prev.opacity === next.opacity\n ) {\n return;\n }\n\n thumbStyle.value = next;\n}\n\nprovide(segmentedKey, {\n name: groupName,\n model,\n disabled: groupDisabled,\n size: groupSize,\n setValue,\n});\n\nonMounted(() => {\n const track = trackRef.value;\n void nextTick(updateThumb);\n\n if (!track) {\n return;\n }\n\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => updateThumb());\n resizeObserver.observe(track);\n }\n\n mutationObserver = new MutationObserver(() => updateThumb());\n mutationObserver.observe(track, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['class'],\n });\n});\n\nwatch(\n () => [props.modelValue, props.size, props.block, props.disabled] as const,\n () => {\n void nextTick(updateThumb);\n },\n);\n\nonBeforeUnmount(() => {\n resizeObserver?.disconnect();\n resizeObserver = null;\n mutationObserver?.disconnect();\n mutationObserver = null;\n});\n</script>\n\n<template>\n <fieldset\n class=\"tao-segmented\"\n :class=\"[\n `tao-segmented--${size}`,\n {\n 'tao-segmented--block': block,\n 'tao-segmented--disabled': disabled,\n 'tao-segmented--invalid': invalid,\n },\n ]\"\n :disabled=\"disabled\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n >\n <legend v-if=\"legend\" class=\"tao-segmented__legend\">{{ legend }}</legend>\n <div ref=\"trackRef\" class=\"tao-segmented__track\">\n <div class=\"tao-segmented__thumb\" :style=\"thumbStyle\" aria-hidden=\"true\"></div>\n <slot />\n </div>\n </fieldset>\n</template>\n\n<style scoped>\n.tao-segmented {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n margin: 0;\n padding: 0;\n border: none;\n min-width: 0;\n vertical-align: top;\n}\n\n.tao-segmented--block {\n display: flex;\n width: 100%;\n align-items: stretch;\n}\n\n.tao-segmented__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\n.tao-segmented__track {\n position: relative;\n display: inline-flex;\n flex-wrap: nowrap;\n align-items: stretch;\n max-width: 100%;\n padding: 2px;\n overflow: hidden;\n background: var(--tao-color-surface-sunken);\n border: 1px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-control);\n}\n\n.tao-segmented--block .tao-segmented__track {\n display: flex;\n width: 100%;\n}\n\n.tao-segmented--block .tao-segmented__track > :deep(.tao-segmented-option) {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.tao-segmented--block .tao-segmented__track > :deep(.tao-segmented-option__label) {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tao-segmented__thumb {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: var(--tao-color-surface-raised);\n border: 1px solid var(--tao-color-border);\n border-radius: calc(var(--tao-radius-control) - 1px);\n box-shadow: var(--tao-shadow-sm);\n pointer-events: none;\n transition:\n transform var(--tao-duration-base) var(--tao-ease-base),\n width var(--tao-duration-base) var(--tao-ease-base),\n height var(--tao-duration-base) var(--tao-ease-base),\n opacity var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-segmented--invalid .tao-segmented__track {\n border-color: var(--tao-color-danger);\n}\n\n.tao-segmented--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .tao-segmented__thumb {\n transition: none;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useId, useSlots } from 'vue';\nimport { type TaoRadioValue } from '../radio';\nimport { segmentedKey } from '../segmented';\n\ndefineOptions({ name: 'TaoSegmentedOption' });\n\nconst props = withDefaults(\n defineProps<{\n value: TaoRadioValue;\n modelValue?: TaoRadioValue;\n name?: string;\n label?: string;\n icon?: string;\n count?: number | string;\n disabled?: boolean;\n ariaLabel?: string;\n }>(),\n {\n label: '',\n icon: '',\n disabled: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoRadioValue];\n change: [value: TaoRadioValue];\n}>();\n\nconst group = inject(segmentedKey, null);\nconst slots = useSlots();\nconst localId = useId();\n\nconst isDisabled = computed(() => props.disabled || Boolean(group?.disabled.value));\nconst inputName = computed(() => group?.name.value ?? props.name);\nconst size = computed(() => group?.size.value ?? 'medium');\nconst isChecked = computed(() => {\n const current = group ? group.model.value : props.modelValue;\n return current === props.value;\n});\n\nconst hasLabel = computed(() => Boolean(props.label || slots.default));\nconst isIconOnly = computed(() => Boolean((props.icon || slots.icon) && !hasLabel.value));\n\nconst countLabel = computed(() => {\n if (props.count === undefined || props.count === null || props.count === '') {\n return '';\n }\n\n if (typeof props.count === 'number') {\n if (props.count > 99) {\n return '99+';\n }\n\n return String(props.count);\n }\n\n return String(props.count);\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\n class=\"tao-segmented-option\"\n :class=\"[\n `tao-segmented-option--${size}`,\n {\n 'tao-segmented-option--checked': isChecked,\n 'tao-segmented-option--disabled': props.disabled,\n 'tao-segmented-option--icon-only': isIconOnly,\n },\n ]\"\n :for=\"localId\"\n >\n <input\n :id=\"localId\"\n class=\"tao-segmented-option__input\"\n type=\"radio\"\n :name=\"inputName\"\n :value=\"String(value)\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled\"\n :aria-label=\"ariaLabel\"\n @change=\"onChange\"\n />\n <span class=\"tao-segmented-option__face\">\n <span v-if=\"icon || $slots.icon\" class=\"tao-segmented-option__icon\" aria-hidden=\"true\">\n <slot name=\"icon\">{{ icon }}</slot>\n </span>\n <span v-if=\"hasLabel\" class=\"tao-segmented-option__label\">\n <slot>{{ label }}</slot>\n </span>\n <span v-else-if=\"ariaLabel\" class=\"tao-segmented-option__sr\">{{ ariaLabel }}</span>\n <span v-if=\"countLabel\" class=\"tao-segmented-option__count\">{{ countLabel }}</span>\n </span>\n </label>\n</template>\n\n<style scoped>\n.tao-segmented-option {\n position: relative;\n z-index: 1;\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n min-width: 0;\n cursor: pointer;\n user-select: none;\n color: var(--tao-color-text-muted);\n}\n\n.tao-segmented-option__face {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--tao-space-1);\n width: 100%;\n border-radius: calc(var(--tao-radius-control) - 1px);\n font-family: inherit;\n font-weight: 500;\n line-height: 1.25;\n white-space: nowrap;\n transition:\n color var(--tao-duration-base) var(--tao-ease-base),\n background var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-segmented-option--small .tao-segmented-option__face {\n min-height: 20px;\n padding: 0 var(--tao-space-2);\n font-size: var(--tao-font-size-xs);\n}\n\n.tao-segmented-option--medium .tao-segmented-option__face {\n min-height: 24px;\n padding: 0 var(--tao-space-3);\n font-size: var(--tao-font-size-sm);\n}\n\n.tao-segmented-option--large .tao-segmented-option__face {\n min-height: 32px;\n padding: 0 var(--tao-space-4);\n font-size: var(--tao-font-size-md);\n}\n\n.tao-segmented-option--icon-only.tao-segmented-option--small .tao-segmented-option__face {\n min-width: 20px;\n padding: 0;\n}\n\n.tao-segmented-option--icon-only.tao-segmented-option--medium .tao-segmented-option__face {\n min-width: 24px;\n padding: 0;\n}\n\n.tao-segmented-option--icon-only.tao-segmented-option--large .tao-segmented-option__face {\n min-width: 32px;\n padding: 0;\n}\n\n.tao-segmented-option__icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n line-height: 1;\n}\n\n.tao-segmented-option__label {\n min-width: 0;\n line-height: 1.25;\n}\n\n.tao-segmented-option__count {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n min-width: 1.15em;\n height: 1.15em;\n padding: 0 4px;\n border-radius: var(--tao-radius-full);\n background: var(--tao-color-accent-subtle);\n color: var(--tao-color-accent);\n font-size: 10px;\n font-weight: 700;\n line-height: 1;\n}\n\n.tao-segmented-option:hover:not(.tao-segmented-option--disabled):not(.tao-segmented-option--checked) {\n color: var(--tao-color-text);\n}\n\n.tao-segmented-option--checked {\n color: var(--tao-color-accent);\n}\n\n.tao-segmented-option--checked .tao-segmented-option__count {\n background: color-mix(in srgb, var(--tao-color-accent) 22%, transparent);\n}\n\n.tao-segmented-option--disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.tao-segmented-option__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-segmented-option__sr {\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-segmented-option__input:focus-visible + .tao-segmented-option__face {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: -2px;\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' | 'danger' | '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 tone = computed(() => (props.type === 'danger' ? 'error' : props.type));\nconst live = computed(() => (tone.value === 'error' || tone.value === 'warning' ? 'assertive' : 'polite'));\n</script>\n\n<template>\n <div\n class=\"tao-alert\"\n :class=\"`tao-alert--${tone}`\"\n :role=\"tone === '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 &times;\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--danger {\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 &times;\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\ntype TaoAvatarDot = 'success' | 'danger' | 'warning' | 'info' | 'neutral' | 'error';\n\nconst props = withDefaults(\n defineProps<{\n src?: string;\n name?: string;\n alt?: string;\n size?: 'small' | 'medium' | 'large' | 's' | 'm' | 'l';\n /** Точка статуса. `true` = success (в сети). */\n dot?: boolean | TaoAvatarDot;\n /** Счётчик в углу. 0 и пустое не рисуются, больше 99 — «99+». */\n count?: number | string;\n }>(),\n {\n src: '',\n name: '',\n alt: '',\n size: 'medium',\n dot: false,\n count: undefined,\n },\n);\n\nconst sizeClass = computed(() => {\n if (props.size === 'small' || props.size === 's') {\n return 's';\n }\n if (props.size === 'large' || props.size === 'l') {\n return 'l';\n }\n return 'm';\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 dotTone = computed((): Exclude<TaoAvatarDot, 'error'> | null => {\n if (!props.dot) {\n return null;\n }\n if (props.dot === true) {\n return 'success';\n }\n return props.dot === 'error' ? 'danger' : props.dot;\n});\n\nconst badge = computed(() => {\n if (props.count === undefined || props.count === '') {\n return '';\n }\n const numeric = typeof props.count === 'number' ? props.count : Number(props.count);\n if (Number.isFinite(numeric)) {\n if (numeric <= 0) {\n return '';\n }\n return numeric > 99 ? '99+' : String(numeric);\n }\n return String(props.count);\n});\n\nconst dotLabel: Record<Exclude<TaoAvatarDot, 'error'>, string> = {\n success: 'в сети',\n danger: 'занят',\n warning: 'отошёл',\n info: 'статус',\n neutral: 'не в сети',\n};\n\nconst label = computed(() => {\n const base = props.alt || props.name || 'Аватар';\n const extra: string[] = [];\n if (dotTone.value) {\n extra.push(dotLabel[dotTone.value]);\n }\n if (badge.value) {\n extra.push(`${badge.value} уведомлений`);\n }\n return extra.length ? `${base}, ${extra.join(', ')}` : base;\n});\n</script>\n\n<template>\n <span class=\"tao-avatar\" :class=\"`tao-avatar--${sizeClass}`\" :title=\"label\">\n <span class=\"tao-avatar__face\">\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 <span\n v-if=\"dotTone\"\n class=\"tao-avatar__dot\"\n :class=\"`tao-avatar__dot--${dotTone}`\"\n aria-hidden=\"true\"\n ></span>\n <span v-if=\"badge\" class=\"tao-avatar__badge\" aria-hidden=\"true\">{{ badge }}</span>\n </span>\n</template>\n\n<style scoped>\n.tao-avatar {\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n user-select: none;\n}\n\n.tao-avatar__face {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n width: 100%;\n height: 100%;\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}\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\n.tao-avatar__dot {\n position: absolute;\n right: -1px;\n bottom: -1px;\n box-sizing: border-box;\n border: 2px solid var(--tao-color-bg);\n border-radius: var(--tao-radius-full);\n background: var(--tao-color-success);\n}\n\n.tao-avatar--s .tao-avatar__dot {\n width: 8px;\n height: 8px;\n border-width: 1px;\n}\n\n.tao-avatar--m .tao-avatar__dot {\n width: 10px;\n height: 10px;\n}\n\n.tao-avatar--l .tao-avatar__dot {\n width: 12px;\n height: 12px;\n}\n\n.tao-avatar__dot--success {\n background: var(--tao-color-success);\n}\n\n.tao-avatar__dot--danger {\n background: var(--tao-color-danger);\n}\n\n.tao-avatar__dot--warning {\n background: var(--tao-color-warning);\n}\n\n.tao-avatar__dot--info {\n background: var(--tao-color-info);\n}\n\n.tao-avatar__dot--neutral {\n background: var(--tao-color-text-muted);\n}\n\n.tao-avatar__badge {\n position: absolute;\n top: -6px;\n right: -6px;\n z-index: 1;\n box-sizing: border-box;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--tao-color-bg);\n border-radius: var(--tao-radius-full);\n background: var(--tao-color-danger);\n color: var(--tao-color-text-strong);\n font-size: 10px;\n font-weight: 700;\n line-height: 1;\n}\n\n.tao-avatar--s .tao-avatar__badge {\n top: -5px;\n right: -5px;\n min-width: 14px;\n height: 14px;\n padding: 0 3px;\n font-size: 9px;\n}\n\n.tao-avatar--l .tao-avatar__badge {\n min-width: 18px;\n height: 18px;\n font-size: 11px;\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, instant = false) {\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 || instant ? '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 releaseDragCapture() {\n const el = track.value;\n const id = dragPointer;\n if (!el || id === -1) {\n return;\n }\n\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\n return;\n }\n\n try {\n el.releasePointerCapture(id);\n } catch {\n /* already released by the browser */\n }\n}\n\nfunction endDrag(keepClickGuard = false) {\n if (!dragging.value) {\n return;\n }\n\n dragging.value = false;\n releaseDragCapture();\n dragPointer = -1;\n if (!keepClickGuard) {\n dragMoved = 0;\n }\n\n if (track.value) {\n goTo(nearestIndex(), true);\n }\n syncAutoplay();\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 try {\n track.value.setPointerCapture(event.pointerId);\n } catch {\n /* untrusted events / capture already gone */\n }\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 onPointerEnd(event: PointerEvent) {\n if (!dragging.value) {\n return;\n }\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\n return;\n }\n\n endDrag(true);\n}\n\nfunction onLostPointerCapture() {\n endDrag();\n}\n\nfunction onWindowBlur() {\n endDrag();\n hoverPaused.value = false;\n syncAutoplay();\n}\n\nfunction onVisibilityChange() {\n if (document.hidden) {\n endDrag();\n hoverPaused.value = false;\n }\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', onVisibilityChange);\n window.addEventListener('blur', onWindowBlur);\n window.addEventListener('pagehide', onWindowBlur);\n});\n\nonUpdated(refreshCount);\n\nonBeforeUnmount(() => {\n endDrag();\n cancelAnimationFrame(scrollFrame);\n stopAutoplay();\n document.removeEventListener('visibilitychange', onVisibilityChange);\n window.removeEventListener('blur', onWindowBlur);\n window.removeEventListener('pagehide', onWindowBlur);\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=\"onPointerEnd\"\n @pointercancel=\"onPointerEnd\"\n @lostpointercapture=\"onLostPointerCapture\"\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 if (item.status === 'danger') {\n return 'bad';\n }\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, onMounted, ref } from 'vue';\nimport TaoButton from './TaoButton.vue';\nimport TaoIcon from './TaoIcon.vue';\nimport { listenFocusLoss } from '../focusLoss';\nimport { removeToast } from '../toast/store';\nimport type { TaoToastRecord } from '../toast/types';\n\ndefineOptions({ name: 'TaoToastItem' });\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\nlet stopFocusLoss: (() => void) | undefined;\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(resume);\n});\n\nonBeforeUnmount(() => {\n stopFocusLoss?.();\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 === 'danger' || 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' || toast.type === 'danger'\" 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 &times;\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--danger {\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 danger: 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 danger(): 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 danger() {\n draft.type = 'danger';\n draft.timeout = TYPE_TIMEOUT.danger;\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 danger(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 danger(message: string, options?: TaoToastShortcutOptions) {\n return shortcut('danger', 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 TaoPopover from './components/TaoPopover.vue';\nimport TaoSpoiler from './components/TaoSpoiler.vue';\nimport TaoSpoilerGroup from './components/TaoSpoilerGroup.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 TaoFieldset from './components/TaoFieldset.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 TaoCombobox from './components/TaoCombobox.vue';\nimport TaoDate from './components/TaoDate.vue';\nimport TaoDateRange from './components/TaoDateRange.vue';\nimport TaoSwitch from './components/TaoSwitch.vue';\nimport TaoRadio from './components/TaoRadio.vue';\nimport TaoRadioGroup from './components/TaoRadioGroup.vue';\nimport TaoSegmented from './components/TaoSegmented.vue';\nimport TaoSegmentedOption from './components/TaoSegmentedOption.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// подключи '@1337exp/taoui/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 TaoPopover,\n TaoSpoiler,\n TaoSpoilerGroup,\n TaoCopy,\n TaoContainer,\n TaoFlex,\n TaoSpace,\n TaoIcon,\n TaoLoader,\n TaoImage,\n TaoCheckbox,\n TaoTag,\n TaoDivider,\n TaoFieldset,\n TaoAnimatedBorder,\n TaoTextarea,\n TaoScrollTop,\n TaoProgress,\n TaoSlider,\n TaoFileDrop,\n TaoDropdownMenu,\n TaoPinCode,\n TaoLink,\n TaoFormField,\n TaoSelect,\n TaoCombobox,\n TaoDate,\n TaoDateRange,\n TaoSwitch,\n TaoRadio,\n TaoRadioGroup,\n TaoSegmented,\n TaoSegmentedOption,\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 TaoPopover,\n TaoSpoiler,\n TaoSpoilerGroup,\n TaoCopy,\n TaoContainer,\n TaoFlex,\n TaoSpace,\n TaoIcon,\n TaoLoader,\n TaoImage,\n TaoCheckbox,\n TaoTag,\n TaoDivider,\n TaoFieldset,\n TaoAnimatedBorder,\n TaoTextarea,\n TaoScrollTop,\n TaoProgress,\n TaoSlider,\n TaoFileDrop,\n TaoDropdownMenu,\n TaoPinCode,\n TaoLink,\n TaoFormField,\n TaoSelect,\n TaoCombobox,\n TaoDate,\n TaoDateRange,\n TaoSwitch,\n TaoRadio,\n TaoRadioGroup,\n TaoSegmented,\n TaoSegmentedOption,\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 {\n parseTaoDate,\n parseTaoDateRange,\n formatTaoDateIso,\n todayTaoDate,\n formatTaoDateLabel,\n formatTaoDateRangeLabel,\n} from './date';\nexport type { TaoSelectOption } from './select';\nexport type { TaoDateCell, TaoDateParts, TaoDateRangeValue } from './date';\nexport type { TaoRadioValue } from './radio';\nexport type { TaoSegmentedSize } from './segmented';\nexport type { TaoSpoilerName } from './spoiler';\nexport type { TaoFormFieldContext } from './formField';\nexport type { TaoTableAlign, TaoTableColumn, TaoTableSort } from './table';\nexport type { TaoPaginationItem } from './pagination';\nexport type { TaoBreadcrumbItem } from './breadcrumb';\nexport type { TaoDropdownAction } from './dropdown';\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","computed","_normalizeClass","_normalizeStyle","inject","useId","ref","_hoisted_1","_unref","$slots","_hoisted_5","_hoisted_6","watch","_hoisted_7","_hoisted_8","nextTick","onBeforeUnmount","_createBlock","_Teleport","_createVNode","_Transition","_Fragment","_renderList","_createTextVNode","onMounted","provide","_resolveDynamicComponent","useSlots","reactive","onBeforeMount","value","getCurrentInstance","_mergeProps","onInput","_hoisted_9","_hoisted_10","TaoLink","_TransitionGroup","onUpdated","toast","viewportMounts","isClient","hostedApp","createApp","createDraft","createBuilder","TaoFlex"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","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/focusLoss.ts","../src/components/TaoTooltip.vue","../src/components/TaoPopover.vue","../src/spoiler.ts","../src/components/TaoSpoiler.vue","../src/components/TaoSpoilerGroup.vue","../src/components/TaoCopy.vue","../src/components/TaoContainer.vue","../src/components/TaoFlex.vue","../src/components/TaoSpace.vue","../src/components/TaoSplit.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/TaoFieldset.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/components/TaoCombobox.vue","../src/date.ts","../src/components/TaoDate.vue","../src/components/TaoDateRange.vue","../src/components/TaoSwitch.vue","../src/radio.ts","../src/components/TaoRadio.vue","../src/components/TaoRadioGroup.vue","../src/segmented.ts","../src/components/TaoSegmented.vue","../src/components/TaoSegmentedOption.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' | 'text' | 'danger';\n /** Красит кнопку: danger / success / warning / info. Не вместо variant. */\n tone?: 'danger' | 'success' | 'warning' | 'info' | '';\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 tone: '',\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 [`tao-button--tone-${tone}`]: !!tone,\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:not(.tao-button--text) {\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: 26px;\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: 30px;\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: 38px;\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--text {\n height: auto;\n padding: 2px 4px;\n background: transparent;\n color: var(--tao-color-accent);\n}\n\n.tao-button--text.tao-button--small,\n.tao-button--text.tao-button--medium,\n.tao-button--text.tao-button--large {\n height: auto;\n padding: 2px 4px;\n}\n\n.tao-button--text:hover:not(.tao-button--disabled) {\n color: var(--tao-color-accent-hover);\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--ghost.tao-button--tone-danger,\n.tao-button--text.tao-button--tone-danger {\n color: var(--tao-color-danger);\n}\n\n.tao-button--ghost.tao-button--tone-danger:hover:not(.tao-button--disabled),\n.tao-button--text.tao-button--tone-danger:hover:not(.tao-button--disabled) {\n color: var(--tao-color-danger-hover);\n background-color: var(--tao-color-danger-subtle);\n}\n\n.tao-button--ghost.tao-button--tone-success,\n.tao-button--text.tao-button--tone-success {\n color: var(--tao-color-success);\n}\n\n.tao-button--ghost.tao-button--tone-success:hover:not(.tao-button--disabled),\n.tao-button--text.tao-button--tone-success:hover:not(.tao-button--disabled) {\n color: var(--tao-color-success-hover);\n background-color: var(--tao-color-success-subtle);\n}\n\n.tao-button--ghost.tao-button--tone-warning,\n.tao-button--text.tao-button--tone-warning {\n color: var(--tao-color-warning);\n}\n\n.tao-button--ghost.tao-button--tone-warning:hover:not(.tao-button--disabled),\n.tao-button--text.tao-button--tone-warning:hover:not(.tao-button--disabled) {\n color: var(--tao-color-warning-hover);\n background-color: var(--tao-color-warning-subtle);\n}\n\n.tao-button--ghost.tao-button--tone-info,\n.tao-button--text.tao-button--tone-info {\n color: var(--tao-color-info);\n}\n\n.tao-button--ghost.tao-button--tone-info:hover:not(.tao-button--disabled),\n.tao-button--text.tao-button--tone-info:hover:not(.tao-button--disabled) {\n color: var(--tao-color-info-hover);\n background-color: var(--tao-color-info-subtle);\n}\n\n.tao-button--secondary.tao-button--tone-danger {\n color: var(--tao-color-danger);\n border-color: color-mix(in srgb, var(--tao-color-danger) 40%, transparent);\n}\n\n.tao-button--secondary.tao-button--tone-danger:hover:not(.tao-button--disabled) {\n color: var(--tao-color-danger-hover);\n background-color: var(--tao-color-danger-subtle);\n}\n\n.tao-button--primary.tao-button--tone-danger,\n.tao-button--danger.tao-button--tone-danger {\n background-color: var(--tao-color-danger);\n color: var(--tao-color-text-strong);\n}\n\n.tao-button--primary.tao-button--tone-danger:hover:not(.tao-button--disabled),\n.tao-button--danger.tao-button--tone-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\ndefineOptions({ name: 'TaoBlock' });\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 && !field\" 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 incrementLabel?: string;\n decrementLabel?: string;\n }>(),\n {\n modelValue: null,\n step: 1,\n disabled: false,\n placeholder: '',\n controls: true,\n incrementLabel: 'Увеличить',\n decrementLabel: 'Уменьшить',\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=\"incrementLabel\"\n tabindex=\"-1\"\n :disabled=\"disabled || atMax\"\n @click=\"bump(1)\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"increment-icon\">+</slot>\n </span>\n </button>\n <button\n type=\"button\"\n class=\"tao-input-number__step\"\n :aria-label=\"decrementLabel\"\n tabindex=\"-1\"\n :disabled=\"disabled || atMin\"\n @click=\"bump(-1)\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"decrement-icon\">−</slot>\n </span>\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 decrementLabel?: string;\n removeLabel?: string;\n incrementLabel?: string;\n }>(),\n {\n modelValue: 1,\n min: 1,\n disabled: false,\n allowRemove: true,\n forceMaxLimit: true,\n decrementLabel: 'Уменьшить',\n removeLabel: 'Убрать',\n incrementLabel: 'Увеличить',\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 ? props.removeLabel : props.decrementLabel));\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 <span aria-hidden=\"true\">\n <slot name=\"decrement-icon\">−</slot>\n </span>\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=\"incrementLabel\"\n :disabled=\"plusDisabled\"\n @click=\"onInc\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"increment-icon\">+</slot>\n </span>\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\ndefineOptions({ name: 'TaoCard' });\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 closeLabel?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: '',\n closable: true,\n closeLabel: 'Закрыть',\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 || closable\" class=\"tao-modal__header\">\n <slot name=\"header\">\n <h2 v-if=\"title\" :id=\"titleId\" class=\"tao-modal__title\">{{ title }}</h2>\n <span v-else></span>\n </slot>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"tao-modal__close\"\n :aria-label=\"closeLabel\"\n @click=\"close\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"close-icon\">&times;</slot>\n </span>\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","/**\n * Win / скриншот / Alt-Tab часто глотают mouseleave и pointerup —\n * жест или hover остаются «нажатыми». Слушатель дергает callback,\n * когда окно реально теряет фокус.\n */\nexport function listenFocusLoss(onLoss: () => void) {\n function onVisibilityChange() {\n if (document.hidden) {\n onLoss();\n }\n }\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n window.addEventListener('blur', onLoss);\n window.addEventListener('pagehide', onLoss);\n\n return () => {\n document.removeEventListener('visibilitychange', onVisibilityChange);\n window.removeEventListener('blur', onLoss);\n window.removeEventListener('pagehide', onLoss);\n };\n}\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { listenFocusLoss } from '../focusLoss';\n\ndefineOptions({ name: 'TaoTooltip' });\n\ntype TaoTooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\nconst props = withDefaults(\n defineProps<{\n content: string;\n position?: TaoTooltipPosition;\n }>(),\n {\n position: 'top',\n },\n);\n\nconst wrapperRef = ref<HTMLElement | null>(null);\nconst tooltipRef = ref<HTMLElement | null>(null);\nconst showTooltip = ref(false);\nconst placed = ref<TaoTooltipPosition>(props.position);\nconst panelStyle = ref<Record<string, string>>({ visibility: 'hidden' });\nconst arrowStyle = ref<Record<string, string>>({});\n\nconst opposite: Record<TaoTooltipPosition, TaoTooltipPosition> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nfunction hide() {\n showTooltip.value = false;\n}\n\nfunction show() {\n showTooltip.value = true;\n}\n\nfunction updatePosition() {\n const trigger = wrapperRef.value;\n const tip = tooltipRef.value;\n if (!trigger || !tip) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const width = tip.offsetWidth;\n const height = tip.offsetHeight;\n const gap = 8;\n const pad = 8;\n const viewW = window.innerWidth;\n const viewH = window.innerHeight;\n const space = {\n bottom: viewH - rect.bottom - gap - pad,\n top: rect.top - gap - pad,\n right: viewW - rect.right - gap - pad,\n left: rect.left - gap - pad,\n };\n\n let side = props.position;\n const need = side === 'top' || side === 'bottom' ? height : width;\n if (space[side] < need && space[opposite[side]] > space[side]) {\n side = opposite[side];\n }\n\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n let top = 0;\n let left = 0;\n\n if (side === 'bottom') {\n top = rect.bottom + gap;\n left = cx - width / 2;\n } else if (side === 'top') {\n top = rect.top - height - gap;\n left = cx - width / 2;\n } else if (side === 'right') {\n top = cy - height / 2;\n left = rect.right + gap;\n } else {\n top = cy - height / 2;\n left = rect.left - width - gap;\n }\n\n if (left + width > viewW - pad) {\n left = viewW - pad - width;\n }\n if (left < pad) {\n left = pad;\n }\n if (top + height > viewH - pad) {\n top = viewH - pad - height;\n }\n if (top < pad) {\n top = pad;\n }\n\n const arrowPad = 10;\n if (side === 'top' || side === 'bottom') {\n const x = Math.min(width - arrowPad, Math.max(arrowPad, cx - left));\n arrowStyle.value = { left: `${x}px`, top: '' };\n } else {\n const y = Math.min(height - arrowPad, Math.max(arrowPad, cy - top));\n arrowStyle.value = { top: `${y}px`, left: '' };\n }\n\n placed.value = side;\n panelStyle.value = { top: `${top}px`, left: `${left}px`, visibility: 'visible' };\n}\n\nfunction onViewportChange() {\n if (showTooltip.value) {\n updatePosition();\n }\n}\n\nwatch(showTooltip, async (isOpen) => {\n if (isOpen) {\n await nextTick();\n updatePosition();\n requestAnimationFrame(() => updatePosition());\n window.addEventListener('resize', onViewportChange);\n window.addEventListener('scroll', onViewportChange, true);\n return;\n }\n\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n\nwatch(\n () => props.position,\n () => {\n if (showTooltip.value) {\n updatePosition();\n }\n },\n);\n\nlet stopFocusLoss: (() => void) | undefined;\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(hide);\n});\n\nonBeforeUnmount(() => {\n stopFocusLoss?.();\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n</script>\n\n<template>\n <div\n ref=\"wrapperRef\"\n class=\"tao-tooltip-wrapper\"\n @mouseenter=\"show\"\n @mouseleave=\"hide\"\n @focusin=\"show\"\n @focusout=\"hide\"\n >\n <slot />\n <Teleport to=\"body\">\n <Transition name=\"tao-tooltip-fade\">\n <div\n v-if=\"showTooltip\"\n ref=\"tooltipRef\"\n class=\"tao-tooltip\"\n :class=\"`tao-tooltip--${placed}`\"\n role=\"tooltip\"\n :style=\"panelStyle\"\n >\n {{ content }}\n <span class=\"tao-tooltip__arrow\" :style=\"arrowStyle\" aria-hidden=\"true\"></span>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-tooltip {\n z-index: 1060;\n position: fixed;\n box-sizing: border-box;\n width: max-content;\n max-width: min(280px, calc(100vw - 16px));\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 font-family: var(--tao-font-family);\n line-height: 1.3;\n border-radius: var(--tao-radius-control);\n box-shadow: var(--tao-shadow-lg);\n pointer-events: none;\n}\n\n.tao-tooltip__arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background: var(--tao-color-surface-raised);\n}\n\n.tao-tooltip--top .tao-tooltip__arrow {\n top: 100%;\n margin-top: -4px;\n transform: translateX(-50%) rotate(45deg);\n}\n\n.tao-tooltip--bottom .tao-tooltip__arrow {\n bottom: 100%;\n margin-bottom: -4px;\n transform: translateX(-50%) rotate(45deg);\n}\n\n.tao-tooltip--left .tao-tooltip__arrow {\n left: 100%;\n margin-left: -4px;\n transform: translateY(-50%) rotate(45deg);\n}\n\n.tao-tooltip--right .tao-tooltip__arrow {\n right: 100%;\n margin-right: -4px;\n transform: translateY(-50%) rotate(45deg);\n}\n\n.tao-tooltip-fade-enter-active,\n.tao-tooltip-fade-leave-active {\n transition:\n opacity var(--tao-duration-base) var(--tao-ease-base),\n transform var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-tooltip--top.tao-tooltip-fade-enter-from,\n.tao-tooltip--top.tao-tooltip-fade-leave-to {\n opacity: 0;\n transform: 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: 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: 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: translateX(-4px);\n}\n</style>\n\n<style scoped>\n.tao-tooltip-wrapper {\n display: inline-block;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\n\ndefineOptions({ name: 'TaoPopover' });\n\ntype TaoPopoverPosition = 'top' | 'bottom' | 'left' | 'right';\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: boolean;\n position?: TaoPopoverPosition;\n disabled?: boolean;\n }>(),\n {\n modelValue: undefined,\n position: 'bottom',\n disabled: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean];\n change: [value: boolean];\n}>();\n\nconst triggerRef = ref<HTMLElement | null>(null);\nconst panelRef = ref<HTMLElement | null>(null);\nconst internal = ref(false);\nconst panelStyle = ref({ top: '0px', left: '0px' });\nconst isControlled = computed(() => props.modelValue !== undefined);\nconst open = computed(() => (isControlled.value ? Boolean(props.modelValue) : internal.value));\n\nfunction setOpen(next: boolean) {\n if (props.disabled && next) {\n return;\n }\n\n if (!isControlled.value) {\n internal.value = next;\n }\n emit('update:modelValue', next);\n emit('change', next);\n}\n\nfunction toggle() {\n void applyOpen(!open.value);\n}\n\nfunction close() {\n void applyOpen(false);\n}\n\nasync function applyOpen(next: boolean) {\n setOpen(next);\n if (!next) {\n return;\n }\n\n await nextTick();\n updatePosition();\n panelRef.value?.focus();\n}\n\nfunction focusTrigger() {\n const root = triggerRef.value;\n const focusable = root?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n (focusable ?? root)?.focus?.();\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 width = panel.offsetWidth;\n const height = panel.offsetHeight;\n const gap = 4;\n const pad = 8;\n const viewW = window.innerWidth;\n const viewH = window.innerHeight;\n\n const space = {\n bottom: viewH - rect.bottom - gap - pad,\n top: rect.top - gap - pad,\n right: viewW - rect.right - gap - pad,\n left: rect.left - gap - pad,\n };\n const opposite: Record<TaoPopoverPosition, TaoPopoverPosition> = {\n bottom: 'top',\n top: 'bottom',\n left: 'right',\n right: 'left',\n };\n\n let side = props.position;\n const need = side === 'top' || side === 'bottom' ? height : width;\n if (space[side] < need && space[opposite[side]] > space[side]) {\n side = opposite[side];\n }\n\n let top = 0;\n let left = 0;\n if (side === 'bottom') {\n top = rect.bottom + gap;\n left = rect.left;\n } else if (side === 'top') {\n top = rect.top - height - gap;\n left = rect.left;\n } else if (side === 'right') {\n top = rect.top;\n left = rect.right + gap;\n } else {\n top = rect.top;\n left = rect.left - width - gap;\n }\n\n if (left + width > viewW - pad) {\n left = viewW - pad - width;\n }\n if (left < pad) {\n left = pad;\n }\n if (top + height > viewH - pad) {\n top = viewH - pad - height;\n }\n if (top < pad) {\n top = pad;\n }\n\n panelStyle.value = { top: `${top}px`, left: `${left}px` };\n}\n\nfunction onTriggerClick() {\n if (props.disabled) {\n return;\n }\n toggle();\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 close();\n}\n\nfunction onDocumentKey(event: KeyboardEvent) {\n if (event.key !== 'Escape') {\n return;\n }\n event.preventDefault();\n close();\n focusTrigger();\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 document.addEventListener('keydown', onDocumentKey);\n window.addEventListener('resize', onViewportChange);\n window.addEventListener('scroll', onViewportChange, true);\n return;\n }\n\n document.removeEventListener('pointerdown', onDocumentPointer);\n document.removeEventListener('keydown', onDocumentKey);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onDocumentPointer);\n document.removeEventListener('keydown', onDocumentKey);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n</script>\n\n<template>\n <div class=\"tao-popover\">\n <div ref=\"triggerRef\" class=\"tao-popover__trigger\" @click=\"onTriggerClick\">\n <slot name=\"trigger\" :open=\"open\" :toggle=\"toggle\" />\n </div>\n\n <Teleport to=\"body\">\n <div\n v-if=\"open\"\n ref=\"panelRef\"\n class=\"tao-popover__panel\"\n role=\"dialog\"\n tabindex=\"-1\"\n :style=\"panelStyle\"\n >\n <slot />\n </div>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-popover__panel {\n z-index: 1050;\n position: fixed;\n min-width: 200px;\n max-width: min(360px, calc(100vw - 16px));\n padding: var(--tao-space-3);\n overflow: auto;\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-popover__panel:focus {\n outline: none;\n}\n\n.tao-popover__panel:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n</style>\n\n<style scoped>\n.tao-popover {\n display: inline-block;\n}\n\n.tao-popover__trigger {\n display: inline-block;\n}\n</style>\n","import type { ComputedRef, InjectionKey } from 'vue';\n\nexport type TaoSpoilerName = string | number;\n\nexport interface TaoSpoilerGroupContext {\n model: ComputedRef<TaoSpoilerName | null | undefined>;\n setOpen: (name: TaoSpoilerName | null) => void;\n}\n\nexport const spoilerGroupKey: InjectionKey<TaoSpoilerGroupContext> = Symbol('taoSpoilerGroup');\n","<script lang=\"ts\" setup>\nimport { computed, inject, ref, useId } from 'vue';\nimport { spoilerGroupKey } from '../spoiler';\n\ndefineOptions({ name: 'TaoSpoiler' });\n\nconst props = withDefaults(\n defineProps<{\n title?: string;\n defaultOpen?: boolean;\n modelValue?: boolean;\n /** Ключ панели в `TaoSpoilerGroup`. Без группы не используется. */\n name?: string | number;\n }>(),\n {\n title: '',\n defaultOpen: false,\n modelValue: undefined,\n name: undefined,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean];\n}>();\n\nconst panelId = useId();\nconst internal = ref(props.defaultOpen);\nconst group = inject(spoilerGroupKey, null);\nconst inGroup = computed(() => group !== null && props.name !== undefined && props.name !== '');\nconst isControlled = computed(() => props.modelValue !== undefined);\nconst isOpen = computed(() => {\n if (inGroup.value) {\n return group!.model.value === props.name;\n }\n return isControlled.value ? Boolean(props.modelValue) : internal.value;\n});\n\nfunction toggle() {\n if (inGroup.value) {\n group!.setOpen(isOpen.value ? null : (props.name as string | number));\n return;\n }\n\n const next = !isOpen.value;\n if (!isControlled.value) {\n internal.value = next;\n }\n emit('update:modelValue', next);\n}\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\n type=\"button\"\n class=\"tao-spoiler__header\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"panelId\"\n @click=\"toggle\"\n >\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\" :id=\"panelId\" 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 { computed, provide } from 'vue';\nimport { spoilerGroupKey, type TaoSpoilerName } from '../spoiler';\n\ndefineOptions({ name: 'TaoSpoilerGroup' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TaoSpoilerName | null;\n }>(),\n {\n modelValue: null,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoSpoilerName | null];\n change: [value: TaoSpoilerName | null];\n}>();\n\nconst model = computed(() => props.modelValue);\n\nfunction setOpen(name: TaoSpoilerName | null) {\n emit('update:modelValue', name);\n emit('change', name);\n}\n\nprovide(spoilerGroupKey, {\n model,\n setOpen,\n});\n</script>\n\n<template>\n <div class=\"tao-spoiler-group\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-spoiler-group {\n overflow: hidden;\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-panel);\n}\n\n.tao-spoiler-group :deep(.tao-spoiler) {\n border: none;\n border-radius: 0;\n border-bottom: 1px solid var(--tao-color-border);\n}\n\n.tao-spoiler-group :deep(.tao-spoiler:last-child) {\n border-bottom: none;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\ndefineOptions({ name: 'TaoCopy' });\n\nconst props = withDefaults(\n defineProps<{\n text: string;\n successMessage?: string;\n copyLabel?: string;\n /** Показать подсказку над кнопкой после копирования. */\n tip?: boolean;\n }>(),\n {\n successMessage: 'Скопировано!',\n copyLabel: 'Копировать',\n tip: true,\n },\n);\n\nconst copied = ref(false);\nconst triggerRef = ref<HTMLElement | null>(null);\nconst tipRef = ref<HTMLElement | null>(null);\nconst tipStyle = ref({ top: '0px', left: '0px' });\n\nlet hideTimer = 0;\nlet visibleObserver: IntersectionObserver | null = null;\n\nfunction hideTip() {\n copied.value = false;\n window.clearTimeout(hideTimer);\n hideTimer = 0;\n}\n\nfunction updateTipPosition() {\n const trigger = triggerRef.value;\n const tip = tipRef.value;\n if (!trigger || !tip) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n hideTip();\n return;\n }\n\n const gap = 8;\n const pad = 8;\n const width = tip.offsetWidth;\n const height = tip.offsetHeight;\n let left = rect.left + rect.width / 2 - width / 2;\n let top = rect.top - height - gap;\n\n if (left < pad) {\n left = pad;\n }\n if (left + width > window.innerWidth - pad) {\n left = window.innerWidth - pad - width;\n }\n if (top < pad) {\n top = rect.bottom + gap;\n }\n\n tipStyle.value = { top: `${top}px`, left: `${left}px` };\n}\n\nfunction bindTipGuards() {\n window.addEventListener('scroll', updateTipPosition, true);\n window.addEventListener('resize', updateTipPosition);\n}\n\nfunction unbindTipGuards() {\n window.removeEventListener('scroll', updateTipPosition, true);\n window.removeEventListener('resize', updateTipPosition);\n}\n\nasync function copy() {\n try {\n await navigator.clipboard.writeText(props.text);\n copied.value = true;\n window.clearTimeout(hideTimer);\n hideTimer = window.setTimeout(hideTip, 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n hideTip();\n }\n}\n\nwatch(copied, async (isCopied) => {\n if (!isCopied || !props.tip) {\n unbindTipGuards();\n return;\n }\n\n await nextTick();\n await nextTick();\n updateTipPosition();\n bindTipGuards();\n});\n\nonMounted(() => {\n visibleObserver = new IntersectionObserver((entries) => {\n if (entries.some((entry) => !entry.isIntersecting)) {\n hideTip();\n }\n });\n if (triggerRef.value) {\n visibleObserver.observe(triggerRef.value);\n }\n});\n\nonBeforeUnmount(() => {\n hideTip();\n unbindTipGuards();\n visibleObserver?.disconnect();\n visibleObserver = null;\n});\n</script>\n\n<template>\n <span ref=\"triggerRef\" class=\"tao-copy\">\n <slot :copy=\"copy\" :copied=\"copied\">\n <button\n type=\"button\"\n class=\"tao-copy__button\"\n :class=\"{ 'tao-copy__button--copied': copied }\"\n :aria-label=\"copied ? successMessage : copyLabel\"\n @click=\"copy\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <rect\n x=\"8\"\n y=\"7\"\n width=\"12\"\n height=\"14\"\n rx=\"2\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n />\n <path\n d=\"M16 7V5a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h2\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n />\n </svg>\n </button>\n </slot>\n\n <Teleport to=\"body\">\n <div\n v-if=\"copied && tip && successMessage\"\n ref=\"tipRef\"\n class=\"tao-copy__tip\"\n role=\"status\"\n :style=\"tipStyle\"\n >\n {{ successMessage }}\n </div>\n </Teleport>\n </span>\n</template>\n\n<style>\n.tao-copy__tip {\n z-index: 1060;\n position: fixed;\n padding: var(--tao-space-2) var(--tao-space-3);\n overflow: visible;\n background: var(--tao-color-surface-raised);\n color: var(--tao-color-text-strong);\n font-size: var(--tao-font-size-xs);\n font-family: var(--tao-font-family);\n line-height: 1.3;\n white-space: nowrap;\n border-radius: var(--tao-radius-control);\n box-shadow: var(--tao-shadow-lg);\n pointer-events: none;\n}\n\n.tao-copy__tip::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n width: 8px;\n height: 8px;\n margin-top: -4px;\n margin-left: -4px;\n background: var(--tao-color-surface-raised);\n transform: rotate(45deg);\n}\n</style>\n\n<style scoped>\n.tao-copy {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n}\n\n.tao-copy__button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n margin: 0;\n padding: 0;\n border: none;\n border-radius: var(--tao-radius-control);\n background: transparent;\n color: var(--tao-color-text-muted);\n cursor: pointer;\n transition: var(--tao-transition-base);\n}\n\n.tao-copy__button svg {\n display: block;\n}\n\n.tao-copy__button:hover {\n color: var(--tao-color-accent);\n background: var(--tao-color-surface-hover);\n}\n\n.tao-copy__button--copied {\n color: var(--tao-color-accent);\n}\n\n.tao-copy__button:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n</style>\n","<script lang=\"ts\" setup>\ndefineOptions({ name: 'TaoContainer' });\n\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>\ndefineOptions({ name: 'TaoFlex' });\n\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>\ndefineOptions({ name: 'TaoSpace' });\n\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>\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { listenFocusLoss } from '../focusLoss';\nimport type { TaoSplitDirection, TaoSplitUnit } from '../split';\n\ndefineOptions({ name: 'TaoSplit' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: number;\n direction?: TaoSplitDirection;\n unit?: TaoSplitUnit;\n min?: number;\n max?: number;\n minEnd?: number;\n resizable?: boolean;\n step?: number;\n }>(),\n {\n modelValue: 50,\n direction: 'row',\n unit: '%',\n min: 0,\n minEnd: 0,\n resizable: true,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number];\n}>();\n\nconst rootRef = ref<HTMLElement | null>(null);\nconst handleRef = ref<HTMLElement | null>(null);\nconst startPx = ref(0);\nconst available = ref(0);\nconst isDragging = ref(false);\n\nconst size = ref(props.modelValue);\n\nconst isRow = computed(() => props.direction === 'row');\nconst stepValue = computed(() => props.step ?? (props.unit === '%' ? 1 : 8));\nconst ariaOrientation = computed(() => (isRow.value ? 'vertical' : 'horizontal'));\n\nlet dragPointer = -1;\nlet dragStartPx = 0;\nlet dragStartCoord = 0;\nlet savedBodyCursor = '';\nlet savedHtmlCursor = '';\nlet savedUserSelect = '';\nlet resizeObserver: ResizeObserver | null = null;\nlet stopFocusLoss: (() => void) | undefined;\n\nfunction axisSize(el: HTMLElement) {\n const rect = el.getBoundingClientRect();\n return isRow.value ? rect.width : rect.height;\n}\n\nfunction measureAvailable() {\n if (!rootRef.value || !handleRef.value) {\n return 0;\n }\n return Math.max(0, axisSize(rootRef.value) - axisSize(handleRef.value));\n}\n\nfunction toPx(value: number, avail: number) {\n if (avail <= 0) {\n return 0;\n }\n return props.unit === '%' ? (value / 100) * avail : value;\n}\n\nfunction fromPx(px: number, avail: number) {\n if (props.unit === '%') {\n if (avail <= 0) {\n return 0;\n }\n return Math.round((px / avail) * 10000) / 100;\n }\n return Math.round(px);\n}\n\nfunction valuesEqual(a: number, b: number) {\n if (props.unit === '%') {\n return Math.abs(a - b) < 0.005;\n }\n return Math.round(a) === Math.round(b);\n}\n\nfunction clampStartPx(desiredPx: number, avail: number) {\n if (avail <= 0) {\n return 0;\n }\n\n const minStartPx = toPx(props.min, avail);\n const minEndPx = toPx(props.minEnd, avail);\n const maxStartPx = props.max != null ? toPx(props.max, avail) : Infinity;\n\n if (minStartPx + minEndPx > avail) {\n return Math.min(Math.max(desiredPx, 0), avail);\n }\n\n const lo = minStartPx;\n const hi = Math.min(maxStartPx, avail - minEndPx);\n return Math.min(Math.max(desiredPx, lo), Math.max(lo, hi));\n}\n\nfunction commit(next: number) {\n if (valuesEqual(next, size.value)) {\n size.value = next;\n return;\n }\n size.value = next;\n emit('update:modelValue', next);\n}\n\nfunction applyLayout(emitIfChanged: boolean) {\n const avail = measureAvailable();\n available.value = avail;\n const clamped = clampStartPx(toPx(size.value, avail), avail);\n startPx.value = clamped;\n const next = fromPx(clamped, avail);\n if (emitIfChanged) {\n commit(next);\n }\n}\n\nfunction isRtl() {\n return !!rootRef.value && getComputedStyle(rootRef.value).direction === 'rtl';\n}\n\nfunction applyDragCursor() {\n savedBodyCursor = document.body.style.cursor;\n savedHtmlCursor = document.documentElement.style.cursor;\n savedUserSelect = document.body.style.userSelect;\n const cursor = isRow.value ? 'col-resize' : 'row-resize';\n document.body.style.cursor = cursor;\n document.documentElement.style.cursor = cursor;\n document.body.style.userSelect = 'none';\n}\n\nfunction restoreDragCursor() {\n document.body.style.cursor = savedBodyCursor;\n document.documentElement.style.cursor = savedHtmlCursor;\n document.body.style.userSelect = savedUserSelect;\n}\n\nfunction releaseDragCapture() {\n const el = handleRef.value;\n const id = dragPointer;\n if (!el || id === -1) {\n return;\n }\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\n return;\n }\n try {\n el.releasePointerCapture(id);\n } catch {\n /* already released by the browser */\n }\n}\n\nfunction endDrag() {\n if (!isDragging.value) {\n return;\n }\n isDragging.value = false;\n releaseDragCapture();\n dragPointer = -1;\n restoreDragCursor();\n applyLayout(true);\n}\n\nfunction setStartFromDelta(delta: number) {\n const avail = measureAvailable();\n available.value = avail;\n const nextPx = clampStartPx(dragStartPx + delta, avail);\n startPx.value = nextPx;\n commit(fromPx(nextPx, avail));\n}\n\nfunction onPointerDown(event: PointerEvent) {\n if (!props.resizable || event.button !== 0 || !handleRef.value) {\n return;\n }\n\n dragPointer = event.pointerId;\n isDragging.value = true;\n dragStartPx = startPx.value;\n dragStartCoord = isRow.value ? event.clientX : event.clientY;\n applyDragCursor();\n event.preventDefault();\n try {\n handleRef.value.setPointerCapture(event.pointerId);\n } catch {\n /* untrusted events / capture already gone */\n }\n}\n\nfunction onPointerMove(event: PointerEvent) {\n if (!isDragging.value || event.pointerId !== dragPointer) {\n return;\n }\n const coord = isRow.value ? event.clientX : event.clientY;\n let delta = coord - dragStartCoord;\n if (isRow.value && isRtl()) {\n delta = -delta;\n }\n setStartFromDelta(delta);\n}\n\nfunction onPointerEnd(event: PointerEvent) {\n if (!isDragging.value) {\n return;\n }\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\n return;\n }\n endDrag();\n}\n\nfunction onLostPointerCapture() {\n endDrag();\n}\n\nfunction ariaMax() {\n const avail = available.value;\n if (avail <= 0) {\n return props.max ?? (props.unit === '%' ? 100 - props.minEnd : 0);\n }\n const maxByEnd = fromPx(Math.max(0, avail - toPx(props.minEnd, avail)), avail);\n if (props.max == null) {\n return maxByEnd;\n }\n return Math.min(props.max, maxByEnd);\n}\n\nconst ariaValueMin = computed(() => props.min);\nconst ariaValueMax = computed(() => ariaMax());\nconst ariaValueNow = computed(() => size.value);\nconst ariaValueText = computed(() => (props.unit === '%' ? `${size.value}%` : `${Math.round(size.value)}px`));\n\nfunction onKeydown(event: KeyboardEvent) {\n if (!props.resizable) {\n return;\n }\n\n const avail = measureAvailable();\n available.value = avail;\n\n if (event.key === 'Home') {\n event.preventDefault();\n const nextPx = clampStartPx(toPx(props.min, avail), avail);\n startPx.value = nextPx;\n commit(fromPx(nextPx, avail));\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n const nextPx = clampStartPx(toPx(ariaMax(), avail), avail);\n startPx.value = nextPx;\n commit(fromPx(nextPx, avail));\n return;\n }\n\n const primary =\n (isRow.value && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) ||\n (!isRow.value && (event.key === 'ArrowUp' || event.key === 'ArrowDown'));\n const secondary =\n (isRow.value && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) ||\n (!isRow.value && (event.key === 'ArrowLeft' || event.key === 'ArrowRight'));\n\n if (!primary && !secondary) {\n return;\n }\n\n event.preventDefault();\n let dir = event.key === 'ArrowRight' || event.key === 'ArrowDown' ? 1 : -1;\n if (isRow.value && isRtl() && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {\n dir = -dir;\n }\n\n const nextModel = size.value + dir * stepValue.value;\n const nextPx = clampStartPx(toPx(nextModel, avail), avail);\n startPx.value = nextPx;\n commit(fromPx(nextPx, avail));\n}\n\nwatch(\n () => props.modelValue,\n value => {\n if (isDragging.value) {\n return;\n }\n if (!valuesEqual(value, size.value)) {\n size.value = value;\n applyLayout(false);\n }\n },\n);\n\nwatch(\n () => [props.unit, props.direction, props.min, props.max, props.minEnd, props.resizable] as const,\n () => {\n if (!isDragging.value) {\n applyLayout(true);\n }\n },\n);\n\nonMounted(() => {\n applyLayout(false);\n resizeObserver = new ResizeObserver(() => {\n if (isDragging.value) {\n return;\n }\n applyLayout(true);\n });\n if (rootRef.value) {\n resizeObserver.observe(rootRef.value);\n }\n stopFocusLoss = listenFocusLoss(endDrag);\n});\n\nonBeforeUnmount(() => {\n endDrag();\n resizeObserver?.disconnect();\n resizeObserver = null;\n stopFocusLoss?.();\n});\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n class=\"tao-split\"\n :class=\"[\n `tao-split--${direction}`,\n {\n 'tao-split--fixed': !resizable,\n 'tao-split--dragging': isDragging,\n },\n ]\"\n :style=\"{ '--tao-split-start': `${startPx}px` }\"\n >\n <div class=\"tao-split__pane tao-split__pane--start\">\n <slot name=\"start\" />\n </div>\n <div\n ref=\"handleRef\"\n class=\"tao-split__handle\"\n role=\"separator\"\n :aria-orientation=\"ariaOrientation\"\n :aria-valuemin=\"ariaValueMin\"\n :aria-valuemax=\"ariaValueMax\"\n :aria-valuenow=\"ariaValueNow\"\n :aria-valuetext=\"ariaValueText\"\n :aria-disabled=\"resizable ? undefined : true\"\n :tabindex=\"resizable ? 0 : -1\"\n @pointerdown=\"onPointerDown\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerEnd\"\n @pointercancel=\"onPointerEnd\"\n @lostpointercapture=\"onLostPointerCapture\"\n @keydown=\"onKeydown\"\n @dragstart.prevent\n />\n <div class=\"tao-split__pane tao-split__pane--end\">\n <slot name=\"end\" />\n </div>\n <div v-if=\"isDragging\" class=\"tao-split__shield\" />\n </div>\n</template>\n\n<style scoped>\n.tao-split {\n --tao-split-gutter: 8px;\n --tao-split-line: 1px;\n --tao-split-start: 50%;\n\n position: relative;\n display: flex;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n}\n\n.tao-split--row {\n flex-direction: row;\n}\n\n.tao-split--column {\n flex-direction: column;\n}\n\n.tao-split__pane {\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n}\n\n.tao-split__pane--start {\n flex: 0 0 var(--tao-split-start);\n}\n\n.tao-split__pane--end {\n flex: 1 1 0%;\n}\n\n.tao-split__pane > :deep(.tao-split) {\n width: 100%;\n height: 100%;\n}\n\n.tao-split__handle {\n position: relative;\n flex: 0 0 var(--tao-split-gutter);\n z-index: 1;\n touch-action: none;\n user-select: none;\n background: transparent;\n}\n\n.tao-split--row > .tao-split__handle {\n cursor: col-resize;\n}\n\n.tao-split--column > .tao-split__handle {\n cursor: row-resize;\n}\n\n.tao-split--fixed > .tao-split__handle {\n cursor: default;\n}\n\n.tao-split__handle::before {\n content: '';\n position: absolute;\n background: var(--tao-color-border);\n pointer-events: none;\n}\n\n.tao-split--row > .tao-split__handle::before {\n top: 0;\n bottom: 0;\n left: 50%;\n width: var(--tao-split-line);\n transform: translateX(-50%);\n}\n\n.tao-split--column > .tao-split__handle::before {\n right: 0;\n left: 0;\n top: 50%;\n height: var(--tao-split-line);\n transform: translateY(-50%);\n}\n\n.tao-split__handle:hover::before,\n.tao-split__handle:focus-visible::before,\n.tao-split--dragging > .tao-split__handle::before {\n background: var(--tao-color-accent);\n}\n\n.tao-split--fixed > .tao-split__handle:hover::before {\n background: var(--tao-color-border);\n}\n\n.tao-split__handle:focus {\n outline: none;\n}\n\n.tao-split__handle:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: -2px;\n}\n\n.tao-split__shield {\n position: absolute;\n inset: 0;\n z-index: 2;\n}\n</style>\n","<script lang=\"ts\" setup>\ndefineOptions({ name: 'TaoIcon' });\n\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\ndefineOptions({ name: 'TaoLoader' });\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\ndefineOptions({ name: 'TaoImage' });\n\ninterface Props {\n src: string;\n alt?: string;\n pixelated?: boolean;\n /** Нативный `loading=\"lazy\"`. По умолчанию выкл — как обычный `<img>`. */\n lazy?: boolean;\n placeholderText?: string;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n src: '',\n alt: '',\n pixelated: false,\n lazy: false,\n placeholderText: 'No image available',\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 :loading=\"lazy ? 'lazy' : 'eager'\"\n decoding=\"async\"\n draggable=\"false\"\n @load=\"handleLoad\"\n @error=\"handleError\"\n />\n </template>\n <template v-else>\n <slot>\n <div class=\"tao-image__placeholder\">{{ placeholderText }}</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, inject, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\n\ndefineOptions({ name: 'TaoCheckbox' });\n\nconst props = withDefaults(\n defineProps<{\n value?: boolean;\n modelValue?: boolean;\n label?: string;\n disabled?: boolean;\n error?: boolean;\n /** Частично выбран: черта вместо квадрата. Клик ставит checked — indeterminate снимает родитель. */\n indeterminate?: boolean;\n }>(),\n {\n value: undefined,\n modelValue: undefined,\n label: '',\n disabled: false,\n error: false,\n indeterminate: 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);\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\n\nconst isChecked = computed({\n get: () => {\n if (props.modelValue !== undefined) {\n return props.modelValue;\n }\n return Boolean(props.value);\n },\n set: (next) => {\n emit('update:modelValue', next);\n emit('change', next);\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\nconst inputRef = ref<HTMLInputElement | null>(null);\n\nwatch(\n [inputRef, isChecked, () => props.indeterminate],\n () => {\n const el = inputRef.value;\n if (!el) {\n return;\n }\n el.checked = isChecked.value;\n el.indeterminate = Boolean(props.indeterminate);\n },\n { flush: 'post' },\n);\n</script>\n\n<template>\n <label class=\"tao-checkbox\" :class=\"{ 'tao-checkbox--disabled': disabled }\" :for=\"controlId\">\n <slot name=\"pre\" :text=\"label\" />\n\n <input\n :id=\"controlId\"\n ref=\"inputRef\"\n class=\"tao-checkbox__input tao-sr-only\"\n type=\"checkbox\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :aria-checked=\"indeterminate ? 'mixed' : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n @change=\"onInputChange\"\n />\n\n <span class=\"tao-checkbox__box\"></span>\n <span v-if=\"label\" class=\"tao-checkbox__label\">{{ label }}</span>\n <span v-else class=\"tao-checkbox__label\"><slot /></span>\n\n <slot name=\"post\" :text=\"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.tao-checkbox__input:indeterminate + .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:indeterminate + .tao-checkbox__box::after {\n width: 10px;\n height: 2px;\n border-radius: 1px;\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\n.tao-checkbox__input[aria-invalid='true'] + .tao-checkbox__box {\n border-color: var(--tao-color-danger);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, useSlots } from 'vue';\n\ndefineOptions({ name: 'TaoTag' });\n\ninterface Props {\n type?: 'neutral' | 'success' | 'danger' | 'error' | 'warning' | 'info' | '';\n color?: string;\n background?: string;\n borderColor?: string;\n pointer?: boolean;\n closable?: boolean;\n closeLabel?: string;\n /** Без рамки, заливка остаётся. Высота как у обычного тега. */\n flat?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: '',\n pointer: false,\n closable: false,\n closeLabel: 'Убрать',\n flat: false,\n});\n\nconst emit = defineEmits<{\n close: [event: MouseEvent];\n}>();\n\nconst slots = useSlots();\nconst tone = computed(() => (props.type === 'error' ? 'danger' : props.type));\nconst style = computed(() => ({\n color: props.color || '',\n background: props.background || '',\n 'border-color': props.flat ? 'transparent' : props.borderColor || '',\n}));\n\nfunction onClose(event: MouseEvent) {\n emit('close', event);\n}\n</script>\n\n<template>\n <span\n class=\"tao-tag\"\n :class=\"[\n tone ? `tao-tag--${tone}` : '',\n {\n 'tao-tag--pointer': pointer,\n 'tao-tag--closable': closable,\n 'tao-tag--prefix': Boolean(slots.prefix),\n 'tao-tag--flat': flat,\n },\n ]\"\n :style=\"style\"\n >\n <span v-if=\"$slots.prefix\" class=\"tao-tag__prefix\">\n <slot name=\"prefix\" />\n </span>\n <span class=\"tao-tag__text\"><slot /></span>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"tao-tag__close\"\n :aria-label=\"closeLabel\"\n @click.stop=\"onClose\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"close-icon\">✕</slot>\n </span>\n </button>\n </span>\n</template>\n\n<style scoped>\n.tao-tag {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n max-width: 100%;\n height: auto;\n margin: 0;\n padding: 1px var(--tao-space-2);\n vertical-align: middle;\n white-space: nowrap;\n text-align: start;\n line-height: 1.25;\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--prefix {\n padding-block: 2px;\n padding-inline-start: 3px;\n}\n\n.tao-tag--closable {\n padding-inline-end: 2px;\n}\n\n.tao-tag__prefix {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n}\n\n.tao-tag__prefix :deep(.tao-avatar) {\n display: block;\n}\n\n.tao-tag__text {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tao-tag__close {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n margin: 0;\n padding: 0;\n border: none;\n border-radius: var(--tao-radius-full);\n background: transparent;\n color: currentColor;\n opacity: 0.72;\n font-family: inherit;\n font-size: 11px;\n line-height: 1;\n cursor: pointer;\n}\n\n.tao-tag__close:hover {\n opacity: 1;\n background: color-mix(in srgb, currentColor 14%, transparent);\n}\n\n.tao-tag__close:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 1px;\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.tao-tag--error {\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\n.tao-tag--flat,\n.tao-tag--flat.tao-tag--neutral,\n.tao-tag--flat.tao-tag--success,\n.tao-tag--flat.tao-tag--danger,\n.tao-tag--flat.tao-tag--error,\n.tao-tag--flat.tao-tag--warning,\n.tao-tag--flat.tao-tag--info {\n border-color: transparent;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'TaoDivider' });\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'gap' | 'line' | 'text';\n size?: 'small' | 'medium' | 'large' | 'big';\n }>(),\n {\n variant: 'line',\n size: 'medium',\n },\n);\n\nconst gapSize = computed(() => (props.size === 'big' ? 'large' : props.size));\n</script>\n\n<template>\n <div v-if=\"variant === 'gap'\" class=\"tao-divider-gap\" :class=\"`tao-divider-gap--${gapSize}`\"></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--large,\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>\ndefineOptions({ name: 'TaoFieldset' });\n\nwithDefaults(\n defineProps<{\n legend?: string;\n /** Подпись на верхней рамке. */\n align?: 'start' | 'center' | 'end';\n }>(),\n {\n legend: '',\n align: 'start',\n },\n);\n</script>\n\n<template>\n <fieldset class=\"tao-fieldset\" :class=\"`tao-fieldset--${align}`\">\n <legend v-if=\"legend || $slots.legend\" class=\"tao-fieldset__legend\">\n <slot name=\"legend\">{{ legend }}</slot>\n </legend>\n <div class=\"tao-fieldset__body\">\n <slot />\n </div>\n </fieldset>\n</template>\n\n<style scoped>\n.tao-fieldset {\n margin: 0;\n min-width: 0;\n padding: 0 var(--tao-space-4) var(--tao-space-4);\n border: 1px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-panel);\n color: var(--tao-color-text);\n background: transparent;\n}\n\n.tao-fieldset__legend {\n padding: 0 var(--tao-space-2);\n font-size: var(--tao-font-size-sm);\n font-weight: 500;\n color: var(--tao-color-text);\n background: var(--tao-color-bg);\n}\n\n.tao-fieldset--start .tao-fieldset__legend {\n margin-inline-start: var(--tao-space-2);\n}\n\n.tao-fieldset--center .tao-fieldset__legend {\n margin-inline: auto;\n}\n\n.tao-fieldset--end .tao-fieldset__legend {\n margin-inline-start: auto;\n margin-inline-end: var(--tao-space-2);\n}\n\n.tao-fieldset__body {\n padding-top: var(--tao-space-3);\n}\n</style>\n","<script lang=\"ts\" setup>\ndefineOptions({ name: 'TaoAnimatedBorder' });\n\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 { computed, inject, nextTick, onMounted, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\n\ndefineOptions({ name: 'TaoTextarea' });\n\nconst props = withDefaults(\n defineProps<{\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 modelValue?: string;\n noBorder?: boolean;\n noBackground?: boolean;\n autoFocus?: boolean;\n borderInverse?: boolean;\n textCenter?: boolean;\n submitOnEnter?: boolean;\n error?: boolean;\n id?: string;\n /** Показать «введено / максимум» под полем. Имеет смысл вместе с `maxlength`. */\n count?: boolean;\n }>(),\n {\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 noBorder: false,\n noBackground: false,\n autoFocus: false,\n borderInverse: false,\n textCenter: false,\n submitOnEnter: false,\n error: false,\n count: false,\n },\n);\n\nconst emit = defineEmits(['update:modelValue', 'change', 'focus', 'blur', 'keydown']);\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 counterId = computed(() => `${controlId.value}-count`);\nconst describedBy = computed(() => {\n const ids = [field?.describedBy.value, props.count ? counterId.value : undefined].filter(Boolean);\n return ids.length ? ids.join(' ') : undefined;\n});\n\nconst currentLength = computed(() => String(props.modelValue ?? '').length);\nconst countLabel = computed(() => {\n if (props.maxlength != null && props.maxlength > 0) {\n return `${currentLength.value} / ${props.maxlength}`;\n }\n return String(currentLength.value);\n});\nconst atLimit = computed(\n () => props.maxlength != null && props.maxlength > 0 && currentLength.value >= props.maxlength,\n);\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\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(\n () => props.modelValue,\n () => {\n nextTick(autoResize);\n },\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=\"dummy\" class=\"tao-textarea tao-textarea--dummy\">{{ modelValue }}</span>\n <div v-else class=\"tao-textarea-wrap\">\n <textarea\n :id=\"controlId\"\n ref=\"textareaRef\"\n class=\"tao-textarea\"\n :class=\"{\n 'tao-textarea--inverse': borderInverse,\n 'tao-textarea--center': textCenter,\n 'tao-textarea--no-border': noBorder,\n 'tao-textarea--no-background': noBackground,\n 'tao-textarea--no-resize': !resize,\n 'tao-textarea--invalid': invalid,\n }\"\n :placeholder=\"placeholder\"\n :spellcheck=\"spellcheck\"\n :autocomplete=\"autocomplete\"\n :minlength=\"minlength\"\n :maxlength=\"maxlength\"\n :disabled=\"disabled\"\n :rows=\"rows\"\n :value=\"modelValue\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n draggable=\"false\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown=\"onKeydown\"\n ></textarea>\n <span\n v-if=\"count\"\n :id=\"counterId\"\n class=\"tao-textarea__count\"\n :class=\"{ 'tao-textarea__count--limit': atLimit }\"\n >{{ countLabel }}</span>\n </div>\n</template>\n\n<style scoped>\n.tao-textarea-wrap {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-1);\n width: 100%;\n}\n\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--invalid {\n border-color: var(--tao-color-danger);\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\n.tao-textarea__count {\n align-self: flex-end;\n font-size: var(--tao-font-size-xs);\n line-height: 1;\n color: var(--tao-color-text-muted);\n font-variant-numeric: tabular-nums;\n user-select: none;\n}\n\n.tao-textarea__count--limit {\n color: var(--tao-color-danger);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, reactive, onBeforeMount, onBeforeUnmount } from 'vue';\n\ndefineOptions({ name: 'TaoScrollTop' });\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 ariaLabel?: string;\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 ariaLabel: 'Наверх',\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 type=\"button\"\n :style=\"mainStyle\"\n :tabindex=\"props.tabindex\"\n class=\"tao-scroll-top\"\n :class=\"{ 'tao-scroll-top--no-outline': !props.hasOutline }\"\n :aria-label=\"props.ariaLabel\"\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>\nimport { computed, useSlots } from 'vue';\n\ndefineOptions({ name: 'TaoProgress' });\n\nconst props = withDefaults(\n defineProps<{\n minWidth?: number;\n maxWidth?: number;\n /** @deprecated используйте minWidth */\n min?: number;\n /** @deprecated используйте maxWidth */\n max?: number;\n progress?: number;\n height?: number;\n /** `true` / `top` — по центру над полосой, `right` — справа. Если есть `#right`, процент справа в скобках. `false` — скрыть. */\n showPercentage?: boolean | 'top' | 'right';\n animated?: boolean;\n }>(),\n {\n minWidth: undefined,\n maxWidth: undefined,\n min: undefined,\n max: undefined,\n progress: 0,\n height: 8,\n showPercentage: true,\n animated: true,\n },\n);\n\nconst slots = useSlots();\nconst minW = computed(() => props.minWidth ?? props.min ?? 200);\nconst maxW = computed(() => props.maxWidth ?? props.max ?? 400);\nconst hasRight = computed(() => Boolean(slots.right));\nconst percentPlace = computed((): 'top' | 'right' | null => {\n if (!props.showPercentage) {\n return null;\n }\n return props.showPercentage === 'right' ? 'right' : 'top';\n});\nconst showOverPercent = computed(() => percentPlace.value === 'top');\nconst showEndPercent = computed(() => percentPlace.value === 'right');\nconst endPercentLabel = computed(() =>\n hasRight.value ? `(${props.progress}%)` : `${props.progress}%`,\n);\n</script>\n\n<template>\n <div class=\"tao-progress\">\n <div\n class=\"tao-progress__container\"\n :class=\"{ 'tao-progress__container--over': showOverPercent }\"\n :style=\"{ minWidth: `${minW}px`, maxWidth: `${maxW}px` }\"\n >\n <div v-if=\"$slots.left\" class=\"tao-progress__side\">\n <slot name=\"left\" />\n </div>\n\n <div class=\"tao-progress__main\">\n <span v-if=\"showOverPercent\" class=\"tao-progress__percentage\">{{ progress }}%</span>\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 </div>\n\n <div v-if=\"$slots.right || showEndPercent\" class=\"tao-progress__side\">\n <slot name=\"right\" />\n <span v-if=\"showEndPercent\" class=\"tao-progress__percentage\">{{ endPercentLabel }}</span>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.tao-progress {\n width: 100%;\n}\n\n.tao-progress__container {\n display: flex;\n align-items: center;\n gap: var(--tao-space-3);\n width: 100%;\n}\n\n.tao-progress__container--over {\n align-items: flex-end;\n}\n\n.tao-progress__main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-1);\n}\n\n.tao-progress__track {\n width: 100%;\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 display: inline-flex;\n flex-shrink: 0;\n align-items: baseline;\n gap: var(--tao-space-1);\n font-size: var(--tao-font-size-xs);\n font-variant-numeric: tabular-nums;\n line-height: 1;\n white-space: nowrap;\n color: var(--tao-color-text-muted);\n}\n\n.tao-progress__percentage {\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n font-size: var(--tao-font-size-xs);\n line-height: 1;\n color: var(--tao-color-text-muted);\n}\n\n.tao-progress__main > .tao-progress__percentage {\n width: 100%;\n text-align: center;\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 { computed, inject, onBeforeUnmount, onMounted, ref, useId } from 'vue';\nimport { formFieldKey } from '../formField';\nimport { listenFocusLoss } from '../focusLoss';\n\ndefineOptions({ name: 'TaoSlider' });\n\nconst props = withDefaults(\n defineProps<{\n min?: number;\n max?: number;\n step?: number;\n showValue?: boolean;\n placeholder?: string;\n modelValue: number | string;\n disabled?: boolean;\n /** `medium` — форм-контрол. `small` — тонкий трек (seek, громкость). */\n size?: 'small' | 'medium';\n }>(),\n {\n min: 0,\n max: 100,\n step: 1,\n showValue: false,\n placeholder: '',\n disabled: false,\n size: 'medium',\n },\n);\n\nconst emit = defineEmits(['update:modelValue']);\n\nconst field = inject(formFieldKey, null);\nconst localId = useId();\nconst controlId = computed(() => field?.id ?? localId);\nconst describedBy = computed(() => field?.describedBy.value);\n\nfunction packModelValue(value: number): string | number {\n return typeof props.modelValue === 'string' ? `${value}` : value;\n}\n\nfunction unpackModelValue(): number {\n const raw = typeof props.modelValue === 'string' ? parseFloat(props.modelValue) : props.modelValue;\n return Number.isFinite(raw) ? raw : props.min;\n}\n\nconst current = computed(() => unpackModelValue());\n\nconst trackRef = ref<HTMLElement | null>(null);\nconst isDragging = ref(false);\nlet dragPointer = -1;\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 if (range <= 0) {\n return 0;\n }\n return ((current.value - props.min) / range) * 100;\n});\n\nfunction clampValue(v: number) {\n return Math.min(Math.max(v, props.min), props.max);\n}\n\nfunction commit(value: number) {\n emit('update:modelValue', packModelValue(clampValue(value)));\n}\n\nfunction calculateValue(event: PointerEvent): number {\n if (!trackRef.value) {\n return props.min;\n }\n\n const rect = trackRef.value.getBoundingClientRect();\n const x = Math.min(Math.max(event.clientX - rect.left, 0), rect.width);\n const ratio = rect.width ? x / rect.width : 0;\n\n const v = props.min + ratio * (props.max - props.min);\n return clampValue(Math.round((v - props.min) / props.step) * props.step + props.min);\n}\n\nfunction releaseDragCapture() {\n const el = trackRef.value;\n const id = dragPointer;\n if (!el || id === -1) {\n return;\n }\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\n return;\n }\n try {\n el.releasePointerCapture(id);\n } catch {\n /* already released by the browser */\n }\n}\n\nfunction endDrag() {\n if (!isDragging.value) {\n return;\n }\n isDragging.value = false;\n releaseDragCapture();\n dragPointer = -1;\n}\n\nfunction onPointerDown(event: PointerEvent) {\n if (props.disabled || showShadowModel.value || event.button !== 0 || !trackRef.value) {\n return;\n }\n\n dragPointer = event.pointerId;\n isDragging.value = true;\n commit(calculateValue(event));\n event.preventDefault();\n try {\n trackRef.value.setPointerCapture(event.pointerId);\n } catch {\n /* untrusted events / capture already gone */\n }\n}\n\nfunction onPointerMove(event: PointerEvent) {\n if (!isDragging.value || event.pointerId !== dragPointer) {\n return;\n }\n commit(calculateValue(event));\n}\n\nfunction onPointerEnd(event: PointerEvent) {\n if (!isDragging.value) {\n return;\n }\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\n return;\n }\n endDrag();\n}\n\nfunction onLostPointerCapture() {\n endDrag();\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (props.disabled || showShadowModel.value) {\n return;\n }\n\n const keys: Record<string, number> = {\n ArrowLeft: -props.step,\n ArrowDown: -props.step,\n ArrowRight: props.step,\n ArrowUp: props.step,\n PageDown: -props.step * 10,\n PageUp: props.step * 10,\n };\n\n if (event.key in keys) {\n event.preventDefault();\n commit(current.value + keys[event.key]!);\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n commit(props.min);\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n commit(props.max);\n }\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.disabled || !props.showValue) {\n return;\n }\n shadowModel.value = `${props.modelValue}`;\n showShadowModel.value = true;\n requestAnimationFrame(() => shadowInputRef.value?.focus());\n}\n\nlet stopFocusLoss: (() => void) | undefined;\n\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(endDrag);\n});\n\nonBeforeUnmount(() => {\n endDrag();\n stopFocusLoss?.();\n});\n</script>\n\n<template>\n <div\n :id=\"controlId\"\n ref=\"trackRef\"\n class=\"tao-slider\"\n :class=\"[\n `tao-slider--${size}`,\n { 'tao-slider--show-value': showValue, 'tao-slider--disabled': disabled },\n ]\"\n role=\"slider\"\n :tabindex=\"disabled ? -1 : 0\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"current\"\n :aria-disabled=\"disabled || undefined\"\n :aria-describedby=\"describedBy\"\n @contextmenu.prevent=\"onContextMenu\"\n @pointerdown=\"onPointerDown\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerEnd\"\n @pointercancel=\"onPointerEnd\"\n @lostpointercapture=\"onLostPointerCapture\"\n @keydown=\"onKeydown\"\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 @pointerdown.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 --tao-slider-hit: 14px;\n --tao-slider-track: var(--tao-slider-hit);\n --tao-slider-thumb: 20px;\n\n position: relative;\n width: 100%;\n height: var(--tao-slider-hit);\n cursor: pointer;\n user-select: none;\n touch-action: none;\n}\n\n.tao-slider:focus {\n outline: none;\n}\n\n.tao-slider:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 4px;\n border-radius: var(--tao-radius-sm);\n}\n\n.tao-slider--show-value {\n --tao-slider-hit: 20px;\n}\n\n/* Тонкий трек, hit-area шире картинки — seek / громкость. */\n.tao-slider--small {\n --tao-slider-hit: 16px;\n --tao-slider-track: 4px;\n --tao-slider-thumb: 12px;\n}\n\n.tao-slider--small.tao-slider--show-value {\n --tao-slider-hit: 20px;\n}\n\n.tao-slider--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.tao-slider--disabled .tao-slider__thumb {\n cursor: not-allowed;\n}\n\n.tao-slider__track,\n.tao-slider__fill {\n position: absolute;\n top: 50%;\n left: 0;\n height: var(--tao-slider-track);\n border-radius: var(--tao-radius-sm);\n transform: translateY(-50%);\n}\n\n.tao-slider__track {\n width: 100%;\n background-color: var(--tao-color-surface-sunken);\n}\n\n.tao-slider__fill {\n background-color: var(--tao-color-accent);\n}\n\n.tao-slider--small .tao-slider__track,\n.tao-slider--small .tao-slider__fill {\n border-radius: var(--tao-radius-full);\n}\n\n.tao-slider__thumb {\n position: absolute;\n top: 50%;\n width: var(--tao-slider-thumb);\n height: var(--tao-slider-thumb);\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 { onBeforeUnmount, onMounted, ref } from 'vue';\nimport { listenFocusLoss } from '../focusLoss';\n\ndefineOptions({ name: 'TaoFileDrop' });\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 clearLabel?: string;\n /** Шаблон aria для крестика файла. `{name}` — имя файла. */\n removeLabel?: string;\n formatSize?: (bytes: number) => string;\n /** Имена выбранных файлов под зоной. Снять файл — сразу в `v-model`. */\n list?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: () => [],\n size: 'medium',\n accept: '*',\n multiple: false,\n showClear: false,\n clearLabel: 'Очистить файлы',\n removeLabel: 'Убрать «{name}»',\n list: true,\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 sameFile(a: File, b: File) {\n return a.name === b.name && a.size === b.size && a.lastModified === b.lastModified;\n}\n\nfunction commit(files: File[]) {\n emit('update:modelValue', files);\n emit('files', files);\n}\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 removeAt(index: number) {\n commit(props.modelValue.filter((_, item) => item !== index));\n}\n\nfunction processFiles(fileList: FileList) {\n const incoming = Array.from(fileList);\n if (!incoming.length) {\n return;\n }\n\n let result: File[];\n if (!props.multiple) {\n result = [incoming[0]!];\n } else {\n result = [...props.modelValue];\n for (const file of incoming) {\n if (!result.some((item) => sameFile(item, file))) {\n result.push(file);\n }\n }\n }\n\n commit(result);\n\n const el = fileInput.value;\n if (el) {\n el.type = 'text';\n el.type = 'file';\n }\n}\n\nfunction defaultFormatSize(bytes: number) {\n if (bytes < 1024) {\n return `${bytes} Б`;\n }\n const kb = bytes / 1024;\n if (kb < 1024) {\n const value = kb < 10 ? kb.toFixed(1) : String(Math.round(kb));\n return `${value.replace('.', ',')} КБ`;\n }\n const mb = kb / 1024;\n const value = mb < 10 ? mb.toFixed(1) : String(Math.round(mb));\n return `${value.replace('.', ',')} МБ`;\n}\n\nfunction sizeLabel(bytes: number) {\n return props.formatSize ? props.formatSize(bytes) : defaultFormatSize(bytes);\n}\n\nfunction fileKey(file: File, index: number) {\n return `${file.name}-${file.size}-${file.lastModified}-${index}`;\n}\n\nlet stopFocusLoss: (() => void) | undefined;\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(() => {\n isDragging.value = false;\n });\n});\nonBeforeUnmount(() => stopFocusLoss?.());\n\n</script>\n\n<template>\n <div class=\"tao-file-drop\">\n <div class=\"tao-file-drop__row\">\n <button\n v-if=\"showClear && modelValue.length\"\n type=\"button\"\n class=\"tao-file-drop__clear\"\n :aria-label=\"clearLabel\"\n @click=\"requestClear\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"clear-icon\">✕</slot>\n </span>\n </button>\n\n <label\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 >\n <slot>Перетащите файл сюда или нажмите, чтобы выбрать</slot>\n\n <input\n ref=\"fileInput\"\n class=\"tao-sr-only\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n @change=\"handleFileSelect\"\n @click.stop\n />\n </label>\n </div>\n\n <ul v-if=\"list && modelValue.length\" class=\"tao-file-drop__list\">\n <li v-for=\"(file, index) in modelValue\" :key=\"fileKey(file, index)\" class=\"tao-file-drop__file\">\n <span class=\"tao-file-drop__name\">{{ file.name }}</span>\n <span class=\"tao-file-drop__meta\">{{ sizeLabel(file.size) }}</span>\n <button\n type=\"button\"\n class=\"tao-file-drop__remove\"\n :aria-label=\"removeLabel.replace('{name}', file.name)\"\n @click=\"removeAt(index)\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"remove-icon\">✕</slot>\n </span>\n </button>\n </li>\n </ul>\n </div>\n</template>\n\n<style scoped>\n.tao-file-drop {\n display: flex;\n flex-direction: column;\n gap: var(--tao-space-2);\n user-select: none;\n}\n\n.tao-file-drop__row {\n display: flex;\n gap: var(--tao-space-3);\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.tao-file-drop__zone:focus-within {\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\n.tao-file-drop__list {\n margin: 0;\n padding: 0;\n overflow: hidden;\n list-style: none;\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-control);\n}\n\n.tao-file-drop__file {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n min-width: 0;\n min-height: 36px;\n padding: 0 var(--tao-space-2) 0 var(--tao-space-3);\n border-bottom: 1px solid var(--tao-color-border);\n background: var(--tao-color-surface-raised);\n color: var(--tao-color-text);\n}\n\n.tao-file-drop__file:last-child {\n border-bottom: none;\n}\n\n.tao-file-drop__name {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n font-size: var(--tao-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: text;\n}\n\n.tao-file-drop__meta {\n flex-shrink: 0;\n font-size: var(--tao-font-size-xs);\n color: var(--tao-color-text-muted);\n}\n\n.tao-file-drop__remove {\n flex-shrink: 0;\n width: 28px;\n height: 28px;\n margin: 0;\n padding: 0;\n border: none;\n border-radius: var(--tao-radius-sm);\n background: none;\n color: var(--tao-color-text-muted);\n font: inherit;\n font-size: var(--tao-font-size-sm);\n line-height: 1;\n cursor: pointer;\n}\n\n.tao-file-drop__remove:hover {\n color: var(--tao-color-danger);\n background: var(--tao-color-danger-subtle);\n}\n\n.tao-file-drop__remove:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: 2px;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, onMounted, reactive, ref } from 'vue';\nimport type { TaoDropdownAction } from '../dropdown';\n\ndefineOptions({ name: 'TaoDropdownMenu' });\n\nconst props = withDefaults(\n defineProps<{\n actions?: TaoDropdownAction[];\n menuLabel?: string;\n }>(),\n {\n actions: () => [],\n menuLabel: 'Меню',\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=\"menuLabel\">\n <span aria-hidden=\"true\">\n <slot name=\"icon\">⋮</slot>\n </span>\n </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 { computed, inject, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\n\ndefineOptions({ name: 'TaoPinCode' });\n\nconst props = withDefaults(\n defineProps<{\n length: number;\n hidden?: boolean;\n placeholder?: string;\n modelValue?: string;\n numbersOnly?: boolean;\n /** `focus` — клик сбрасывает ячейку и все справа (неверный код, набор заново).\n * `input` — цифра остаётся, пока не введут новую. */\n clearOn?: 'focus' | 'input';\n }>(),\n {\n hidden: false,\n placeholder: '',\n modelValue: '',\n numbersOnly: false,\n clearOn: 'focus',\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n change: [value: string];\n complete: [value: string];\n active: [el: HTMLInputElement | null, index: number];\n blur: [];\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 numbers = ref<string[]>([]);\nconst inputRefs = ref<(HTMLInputElement | null)[]>([]);\nconst activeNumber = ref(-1);\n\nfunction acceptChar(ch: string): string {\n if (!ch) {\n return '';\n }\n if (props.numbersOnly && !/^[0-9]$/.test(ch)) {\n return '';\n }\n return ch;\n}\n\nfunction cellsFromModel(value: string): string[] {\n const raw = value ?? '';\n return Array.from({ length: props.length }, (_, index) => acceptChar(raw[index] ?? ''));\n}\n\nfunction serialize(): string {\n return numbers.value.join('');\n}\n\nfunction emitChange() {\n const next = serialize();\n if (next !== (props.modelValue ?? '')) {\n emit('update:modelValue', next);\n emit('change', next);\n }\n}\n\nfunction firstEmptyIndex(): number {\n const index = numbers.value.findIndex((cell) => !cell);\n return index === -1 ? numbers.value.length : index;\n}\n\nfunction focusCell(index: number) {\n inputRefs.value[index]?.focus();\n}\n\nfunction isFilled(): boolean {\n return numbers.value.length === props.length && numbers.value.every((cell) => cell !== '');\n}\n\nfunction mutation(v: string, index: number) {\n const char = v.length > 1 ? (v[v.length - 1] ?? '') : v;\n const next = acceptChar(char);\n\n if (props.numbersOnly && char && !next) {\n return;\n }\n\n numbers.value = [...numbers.value];\n numbers.value[index] = next;\n emitChange();\n\n if (!next) {\n return;\n }\n\n if (isFilled()) {\n inputRefs.value[index]?.blur();\n emit('complete', serialize());\n return;\n }\n\n const nextEmpty = numbers.value.findIndex((cell, cellIndex) => cellIndex > index && !cell);\n const target = nextEmpty !== -1 ? nextEmpty : index + 1;\n if (target < props.length) {\n focusCell(target);\n }\n}\n\nfunction onFocus(index: number) {\n if (props.clearOn === 'input') {\n const firstEmpty = firstEmptyIndex();\n if (firstEmpty < props.length && index > firstEmpty) {\n focusCell(firstEmpty);\n return;\n }\n\n activeNumber.value = index;\n emit('active', inputRefs.value[index] ?? null, index);\n requestAnimationFrame(() => inputRefs.value[index]?.select());\n return;\n }\n\n numbers.value = numbers.value.map((cell, cellIndex) => (cellIndex >= index ? '' : cell));\n activeNumber.value = index;\n emitChange();\n emit('active', inputRefs.value[index] ?? null, index);\n}\n\nfunction onChange(e: Event, index: number) {\n mutation((e.target as HTMLInputElement).value, index);\n}\n\nfunction onKeydown(event: KeyboardEvent, index: number) {\n if (event.key !== 'Backspace') {\n return;\n }\n\n if (numbers.value[index]) {\n return;\n }\n\n if (index > 0) {\n event.preventDefault();\n numbers.value = [...numbers.value];\n numbers.value[index - 1] = '';\n focusCell(index - 1);\n activeNumber.value = index - 1;\n emitChange();\n }\n}\n\nfunction onBlur() {\n requestAnimationFrame(() => {\n const active = document.activeElement;\n if (!inputRefs.value.includes(active as HTMLInputElement | null)) {\n activeNumber.value = -1;\n emit('blur');\n }\n });\n}\n\nwatch(\n () => [props.modelValue, props.length, props.numbersOnly] as const,\n () => {\n const next = cellsFromModel(props.modelValue ?? '');\n if (next.join('') !== numbers.value.join('') || next.length !== numbers.value.length) {\n numbers.value = next;\n }\n },\n { immediate: true },\n);\n</script>\n\n<template>\n <div\n class=\"tao-pin-code\"\n role=\"group\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n >\n <input\n v-for=\"(num, index) of numbers\"\n :id=\"index === 0 ? controlId : undefined\"\n :key=\"index\"\n :ref=\"(el) => (inputRefs[index] = el as HTMLInputElement)\"\n class=\"tao-pin-code__value\"\n :class=\"{\n 'tao-pin-code__value--active': activeNumber === index,\n 'tao-pin-code__value--invalid': invalid,\n }\"\n :value=\"num\"\n :placeholder=\"placeholder\"\n :type=\"hidden ? 'password' : 'text'\"\n :inputmode=\"numbersOnly ? 'numeric' : 'text'\"\n :pattern=\"numbersOnly ? '[0-9]' : undefined\"\n autocomplete=\"one-time-code\"\n maxlength=\"1\"\n @input=\"onChange($event, index)\"\n @keydown=\"onKeydown($event, index)\"\n @focus=\"onFocus(index)\"\n @blur=\"onBlur\"\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.tao-pin-code__value:focus {\n border-color: var(--tao-color-accent);\n}\n\n.tao-pin-code__value--invalid {\n border-color: var(--tao-color-danger);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, getCurrentInstance } from 'vue';\n\ndefineOptions({ name: 'TaoLink' });\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\nconst globals = getCurrentInstance()?.appContext.components ?? {};\n\n// NuxtLink (Nuxt) → RouterLink (vue-router) → <a>.\n// Nuxt первым: это обёртка над RouterLink с prefetch.\n// Ищем в глобальном реестре, а не через resolveComponent — иначе Vue\n// пишет warning, если Nuxt/vue-router в проекте нет.\nconst linkKind = globals.NuxtLink ? 'nuxt' : globals.RouterLink ? 'router' : 'a';\nconst linkComponent =\n linkKind === 'nuxt' ? globals.NuxtLink : linkKind === 'router' ? globals.RouterLink : 'a';\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 (linkKind === '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 ...(linkKind === 'nuxt' ? { 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 clearText?: string;\n }>(),\n {\n modelValue: null,\n options: () => [],\n placeholder: 'Выберите',\n disabled: false,\n error: false,\n clearText: 'Очистить',\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n change: [value: string | number | null];\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 panelRef = ref<HTMLElement | 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 panel = panelRef.value;\n\n if (!trigger || !panel) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const panelHeight = panel.offsetHeight;\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom - gap;\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\n\n listStyle.value = {\n top: `${openUp ? rect.top - panelHeight - 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 clear() {\n emit('update:modelValue', null);\n emit('change', null);\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 === 'Backspace' || event.key === 'Delete') && selected.value) {\n event.preventDefault();\n clear();\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 === 'Backspace' || event.key === 'Delete') {\n if (selected.value) {\n event.preventDefault();\n clear();\n }\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) || 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-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\n class=\"tao-select__chevron\"\n :class=\"{ 'tao-select__chevron--custom': $slots.chevron }\"\n aria-hidden=\"true\"\n >\n <slot name=\"chevron\" />\n </span>\n </button>\n\n <Teleport to=\"body\">\n <div\n v-if=\"open\"\n ref=\"panelRef\"\n class=\"tao-select__panel\"\n :style=\"listStyle\"\n >\n <ul\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 @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 <button\n v-if=\"selected\"\n type=\"button\"\n class=\"tao-select__clear\"\n @mousedown.prevent\n @click=\"clear\"\n >\n <slot name=\"clear\">{{ clearText }}</slot>\n </button>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-select__panel {\n z-index: 1050;\n position: fixed;\n overflow: hidden;\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__list {\n margin: 0;\n padding: var(--tao-space-1);\n max-height: 240px;\n overflow: auto;\n list-style: none;\n}\n\n.tao-select__list:focus {\n outline: none;\n}\n\n.tao-select__clear {\n display: block;\n width: 100%;\n margin: 0;\n padding: var(--tao-space-2) var(--tao-space-3);\n border: none;\n border-top: 1px solid var(--tao-color-border);\n background: none;\n color: var(--tao-color-text-muted);\n font: inherit;\n font-size: var(--tao-font-size-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.tao-select__clear:hover {\n color: var(--tao-color-accent);\n background: var(--tao-color-surface-hover);\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\n.tao-select__chevron--custom {\n display: inline-flex;\n width: auto;\n height: auto;\n border: none;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\nimport { listenFocusLoss } from '../focusLoss';\nimport type { TaoSelectOption } from '../select';\n\ndefineOptions({ name: 'TaoCombobox' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string | number | null;\n options?: TaoSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n emptyText?: string;\n clearText?: string;\n /** Можно оставить то, чего нет в списке. */\n allowCreate?: boolean;\n }>(),\n {\n modelValue: null,\n options: () => [],\n placeholder: 'Начните вводить',\n disabled: false,\n error: false,\n emptyText: 'Ничего не найдено',\n clearText: 'Очистить',\n allowCreate: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n change: [value: string | number | null];\n /** Новое значение, которого не было в `options`. Список сам не трогаем — его дополняет родитель. */\n create: [value: string];\n}>();\n\ntype ComboRow = { kind: 'option'; option: TaoSelectOption } | { kind: 'create'; text: string };\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 focused = ref(false);\nconst picking = ref(false);\nconst skipFocusOpen = ref(false);\nconst query = ref('');\nconst activeIndex = ref(-1);\nconst fieldRef = ref<HTMLElement | null>(null);\nconst inputRef = ref<HTMLInputElement | null>(null);\nconst panelRef = ref<HTMLElement | null>(null);\nconst listRef = ref<HTMLElement | null>(null);\nconst listStyle = ref({ top: '0px', left: '0px', width: '0px' });\n\nconst selected = computed((): TaoSelectOption | null => {\n const found = props.options.find((option) => option.value === props.modelValue);\n if (found) {\n return found;\n }\n if (props.modelValue === null || props.modelValue === undefined || props.modelValue === '') {\n return null;\n }\n return { value: props.modelValue, label: String(props.modelValue) };\n});\n\nconst needle = computed(() => query.value.trim().toLowerCase());\n\nconst filtered = computed(() => {\n if (!needle.value) {\n return props.options;\n }\n return props.options.filter((option) => option.label.toLowerCase().includes(needle.value));\n});\n\nconst canCreate = computed(() => {\n const text = query.value.trim();\n if (!props.allowCreate || !text) {\n return false;\n }\n return !props.options.some((option) => option.label.toLowerCase() === text.toLowerCase());\n});\n\nconst rows = computed((): ComboRow[] => {\n const next: ComboRow[] = filtered.value.map((option) => ({ kind: 'option', option }));\n if (canCreate.value) {\n next.push({ kind: 'create', text: query.value.trim() });\n }\n return next;\n});\n\nconst enabledIndexes = computed(() =>\n rows.value\n .map((row, index) => (row.kind === 'option' && row.option.disabled ? -1 : index))\n .filter((index) => index >= 0),\n);\n\nconst activeId = computed(() => (activeIndex.value >= 0 ? `${listId}-row-${activeIndex.value}` : undefined));\n\nfunction syncQueryFromModel() {\n query.value = selected.value?.label ?? '';\n}\n\nfunction updatePosition() {\n const trigger = fieldRef.value;\n const panel = panelRef.value;\n\n if (!trigger || !panel) {\n return;\n }\n\n const rect = trigger.getBoundingClientRect();\n const panelHeight = panel.offsetHeight;\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom - gap;\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\n\n listStyle.value = {\n top: `${openUp ? rect.top - panelHeight - gap : rect.bottom + gap}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nfunction resetActive() {\n const selectedIndex = rows.value.findIndex(\n (row) => row.kind === 'option' && row.option.value === props.modelValue,\n );\n if (selectedIndex >= 0 && enabledIndexes.value.includes(selectedIndex)) {\n activeIndex.value = selectedIndex;\n return;\n }\n activeIndex.value = enabledIndexes.value[0] ?? -1;\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 resetActive();\n await nextTick();\n updatePosition();\n scrollActiveIntoView();\n}\n\nfunction emitValue(value: string | number | null) {\n emit('update:modelValue', value);\n emit('change', value);\n}\n\nfunction keepFocusQuiet() {\n skipFocusOpen.value = true;\n picking.value = false;\n inputRef.value?.focus();\n}\n\nfunction commitCreated(value: string) {\n emitValue(value);\n emit('create', value);\n query.value = value;\n open.value = false;\n keepFocusQuiet();\n}\n\nfunction selectOption(option: TaoSelectOption) {\n if (option.disabled) {\n return;\n }\n\n emitValue(option.value);\n query.value = option.label;\n open.value = false;\n keepFocusQuiet();\n}\n\nfunction createFromQuery(text: string) {\n const value = text.trim();\n if (!value) {\n return;\n }\n\n const exact = props.options.find(\n (option) => !option.disabled && option.label.toLowerCase() === value.toLowerCase(),\n );\n if (exact) {\n selectOption(exact);\n return;\n }\n\n if (!props.allowCreate) {\n return;\n }\n\n commitCreated(value);\n}\n\nfunction clear() {\n emitValue(null);\n query.value = '';\n open.value = false;\n inputRef.value?.focus();\n}\n\nfunction revertQuery() {\n syncQueryFromModel();\n}\n\nfunction closeAndRevert() {\n open.value = false;\n revertQuery();\n}\n\nfunction closeAndCommit() {\n open.value = false;\n const text = query.value.trim();\n if (!text) {\n revertQuery();\n return;\n }\n\n const exact = props.options.find(\n (option) => !option.disabled && option.label.toLowerCase() === text.toLowerCase(),\n );\n if (exact) {\n emitValue(exact.value);\n query.value = exact.label;\n return;\n }\n\n if (props.allowCreate) {\n emitValue(text);\n emit('create', text);\n query.value = text;\n return;\n }\n\n revertQuery();\n}\n\nfunction moveActive(delta: number) {\n const enabled = enabledIndexes.value;\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 if (!list || activeIndex.value < 0) {\n return;\n }\n\n const option = list.querySelector<HTMLElement>(`[data-tao-combobox-index=\"${activeIndex.value}\"]`);\n option?.scrollIntoView({ block: 'nearest' });\n}\n\nfunction onFieldMouseDown(event: MouseEvent) {\n if (props.disabled || event.button !== 0) {\n return;\n }\n\n const onInput = event.target === inputRef.value;\n if (onInput) {\n if (focused.value && !open.value) {\n void setOpen(true);\n }\n return;\n }\n\n event.preventDefault();\n if (open.value) {\n open.value = false;\n return;\n }\n\n inputRef.value?.focus();\n void setOpen(true);\n}\n\nfunction onInput() {\n if (props.disabled) {\n return;\n }\n\n void setOpen(true);\n resetActive();\n}\n\nfunction onFocus() {\n if (props.disabled) {\n return;\n }\n\n focused.value = true;\n if (skipFocusOpen.value) {\n skipFocusOpen.value = false;\n return;\n }\n void setOpen(true);\n nextTick(() => inputRef.value?.select());\n}\n\nfunction markPicking() {\n picking.value = true;\n}\n\nfunction onBlur() {\n focused.value = false;\n window.setTimeout(() => {\n if (picking.value) {\n picking.value = false;\n return;\n }\n if (fieldRef.value?.contains(document.activeElement) || panelRef.value?.contains(document.activeElement)) {\n return;\n }\n if (props.allowCreate) {\n closeAndCommit();\n return;\n }\n closeAndRevert();\n }, 0);\n}\n\nfunction activateRow(row: ComboRow) {\n if (row.kind === 'create') {\n createFromQuery(row.text);\n return;\n }\n selectOption(row.option);\n}\n\nfunction onInputKeydown(event: KeyboardEvent) {\n if (props.disabled) {\n return;\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n closeAndRevert();\n return;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (!open.value) {\n void setOpen(true);\n return;\n }\n moveActive(1);\n return;\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (!open.value) {\n void setOpen(true);\n return;\n }\n moveActive(-1);\n return;\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n if (!open.value) {\n void setOpen(true);\n return;\n }\n const row = rows.value[activeIndex.value];\n if (row) {\n activateRow(row);\n return;\n }\n if (props.allowCreate) {\n createFromQuery(query.value);\n }\n }\n}\n\nfunction onDocumentPointer(event: PointerEvent) {\n const target = event.target as Node;\n if (fieldRef.value?.contains(target) || panelRef.value?.contains(target)) {\n return;\n }\n\n if (props.allowCreate) {\n closeAndCommit();\n return;\n }\n closeAndRevert();\n}\n\nfunction onViewportChange() {\n if (open.value) {\n updatePosition();\n }\n}\n\nwatch(\n () => props.modelValue,\n () => {\n if (!focused.value) {\n syncQueryFromModel();\n }\n },\n { immediate: true },\n);\n\nwatch(rows, () => {\n if (!open.value) {\n return;\n }\n if (!enabledIndexes.value.includes(activeIndex.value)) {\n activeIndex.value = enabledIndexes.value[0] ?? -1;\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\nlet stopFocusLoss: (() => void) | undefined;\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(() => {\n picking.value = false;\n });\n});\n\nonBeforeUnmount(() => {\n stopFocusLoss?.();\n document.removeEventListener('pointerdown', onDocumentPointer);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n</script>\n\n<template>\n <div\n class=\"tao-combobox\"\n :class=\"{\n 'tao-combobox--open': open,\n 'tao-combobox--invalid': invalid,\n 'tao-combobox--disabled': disabled,\n }\"\n >\n <div ref=\"fieldRef\" class=\"tao-combobox__field\" @mousedown=\"onFieldMouseDown\">\n <input\n :id=\"controlId\"\n ref=\"inputRef\"\n class=\"tao-combobox__input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n :aria-expanded=\"open\"\n :aria-controls=\"listId\"\n :aria-activedescendant=\"open ? activeId : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :value=\"query\"\n @input=\"query = ($event.target as HTMLInputElement).value; onInput()\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown=\"onInputKeydown\"\n />\n <span\n class=\"tao-combobox__chevron\"\n :class=\"{ 'tao-combobox__chevron--custom': $slots.chevron }\"\n aria-hidden=\"true\"\n >\n <slot name=\"chevron\" />\n </span>\n </div>\n\n <Teleport to=\"body\">\n <div v-if=\"open\" ref=\"panelRef\" class=\"tao-combobox__panel\" :style=\"listStyle\">\n <ul :id=\"listId\" ref=\"listRef\" class=\"tao-combobox__list\" role=\"listbox\">\n <li v-if=\"!rows.length\" class=\"tao-combobox__empty\">\n <slot name=\"empty\">{{ emptyText }}</slot>\n </li>\n <li\n v-for=\"(row, index) in rows\"\n :id=\"`${listId}-row-${index}`\"\n :key=\"row.kind === 'create' ? 'create' : String(row.option.value)\"\n class=\"tao-combobox__option\"\n :class=\"{\n 'tao-combobox__option--active': index === activeIndex,\n 'tao-combobox__option--selected':\n row.kind === 'option' && row.option.value === modelValue,\n 'tao-combobox__option--disabled': row.kind === 'option' && row.option.disabled,\n 'tao-combobox__option--create': row.kind === 'create',\n }\"\n role=\"option\"\n :aria-selected=\"row.kind === 'option' && row.option.value === modelValue\"\n :aria-disabled=\"row.kind === 'option' && row.option.disabled ? true : undefined\"\n :data-tao-combobox-index=\"index\"\n @mousedown.prevent=\"markPicking\"\n @click=\"activateRow(row)\"\n @mouseenter=\"!(row.kind === 'option' && row.option.disabled) && (activeIndex = index)\"\n >\n <template v-if=\"row.kind === 'create'\">\n <slot name=\"create\" :text=\"row.text\">Добавить «{{ row.text }}»</slot>\n </template>\n <template v-else>{{ row.option.label }}</template>\n </li>\n </ul>\n <button\n v-if=\"selected\"\n type=\"button\"\n class=\"tao-combobox__clear\"\n @mousedown.prevent=\"markPicking\"\n >\n <slot name=\"clear\">{{ clearText }}</slot>\n </button>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style>\n.tao-combobox__panel {\n z-index: 1050;\n position: fixed;\n overflow: hidden;\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-combobox__list {\n margin: 0;\n padding: var(--tao-space-1);\n max-height: 240px;\n overflow: auto;\n list-style: none;\n}\n\n.tao-combobox__empty {\n padding: var(--tao-space-2) var(--tao-space-3);\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-sm);\n}\n\n.tao-combobox__clear {\n display: block;\n width: 100%;\n margin: 0;\n padding: var(--tao-space-2) var(--tao-space-3);\n border: none;\n border-top: 1px solid var(--tao-color-border);\n background: none;\n color: var(--tao-color-text-muted);\n font: inherit;\n font-size: var(--tao-font-size-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.tao-combobox__clear:hover {\n color: var(--tao-color-accent);\n background: var(--tao-color-surface-hover);\n}\n\n.tao-combobox__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-combobox__option--active,\n.tao-combobox__option:hover:not(.tao-combobox__option--disabled) {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-combobox__option--selected {\n color: var(--tao-color-accent);\n}\n\n.tao-combobox__option--create {\n color: var(--tao-color-accent);\n}\n\n.tao-combobox__option--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n</style>\n\n<style scoped>\n.tao-combobox {\n width: 100%;\n}\n\n.tao-combobox__field {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n width: 100%;\n min-height: 36px;\n padding: 0 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 transition: var(--tao-transition-base);\n}\n\n.tao-combobox__field:focus-within {\n border-color: var(--tao-color-accent);\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\n}\n\n.tao-combobox--invalid .tao-combobox__field {\n border-color: var(--tao-color-danger);\n}\n\n.tao-combobox--invalid .tao-combobox__field:focus-within {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\n}\n\n.tao-combobox__input {\n flex: 1;\n min-width: 0;\n height: 34px;\n padding: 0;\n border: none;\n background: transparent;\n color: inherit;\n font-size: var(--tao-font-size-md);\n font-family: inherit;\n outline: none;\n}\n\n.tao-combobox__input::placeholder {\n color: var(--tao-color-input-placeholder);\n}\n\n.tao-combobox__input:disabled {\n cursor: not-allowed;\n}\n\n.tao-combobox--disabled .tao-combobox__field {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.tao-combobox__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 pointer-events: none;\n transition: transform var(--tao-duration-fast) var(--tao-ease-base);\n}\n\n.tao-combobox--open .tao-combobox__chevron {\n transform: rotate(180deg);\n}\n\n.tao-combobox__chevron--custom {\n display: inline-flex;\n width: auto;\n height: auto;\n border: none;\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\nexport interface TaoDateRangeValue {\n start: string;\n end: string;\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 sortTaoDateRange(a: string, b: string): TaoDateRangeValue {\n return a <= b ? { start: a, end: b } : { start: b, end: a };\n}\n\nexport function parseTaoDateRange(value: TaoDateRangeValue | null | undefined): TaoDateRangeValue | null {\n if (!value) {\n return null;\n }\n\n const start = parseTaoDate(value.start);\n const end = parseTaoDate(value.end);\n if (!start || !end) {\n return null;\n }\n\n return sortTaoDateRange(formatTaoDateIso(start), formatTaoDateIso(end));\n}\n\nexport function formatTaoDateRangeLabel(start: string, end: string, locale = 'ru-RU'): string {\n const fromParts = parseTaoDate(start);\n const toParts = parseTaoDate(end);\n if (!fromParts || !toParts) {\n return '';\n }\n\n if (start === end) {\n return formatTaoDateLabel(start, locale);\n }\n\n const from = new Date(fromParts.y, fromParts.m - 1, fromParts.d).toLocaleDateString(locale, {\n day: 'numeric',\n month: 'long',\n ...(fromParts.y === toParts.y ? {} : { year: 'numeric' }),\n });\n\n return `${from} — ${formatTaoDateLabel(end, locale)}`;\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';\nimport '../styles/date-popup.css';\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 todayText?: string;\n clearText?: string;\n prevMonthLabel?: string;\n nextMonthLabel?: 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 todayText: 'Сегодня',\n clearText: 'Очистить',\n prevMonthLabel: 'Предыдущий месяц',\n nextMonthLabel: 'Следующий месяц',\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 <span class=\"tao-date__icon\" aria-hidden=\"true\">\n <slot name=\"icon\">\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" 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 </slot>\n </span>\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=\"prevMonthLabel\" @click=\"goMonth(-1)\">\n <span aria-hidden=\"true\">\n <slot name=\"prev-icon\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" 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 </slot>\n </span>\n </button>\n <p class=\"tao-date__month\">{{ monthLabel }}</p>\n <button type=\"button\" class=\"tao-date__nav\" :aria-label=\"nextMonthLabel\" @click=\"goMonth(1)\">\n <span aria-hidden=\"true\">\n <slot name=\"next-icon\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" 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 </slot>\n </span>\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-label=\"formatTaoDateLabel(cell.iso, locale)\"\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 <slot name=\"today\">{{ todayText }}</slot>\n </button>\n <button v-if=\"valueIso\" type=\"button\" class=\"tao-date__link\" @click=\"clear\">\n <slot name=\"clear\">{{ clearText }}</slot>\n </button>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\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 display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n opacity: 0.7;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\nimport { listenFocusLoss } from '../focusLoss';\nimport {\n buildTaoDateGrid,\n formatTaoDateLabel,\n formatTaoDateRangeLabel,\n formatTaoMonthLabel,\n isTaoDateInRange,\n parseTaoDate,\n parseTaoDateRange,\n shiftTaoDate,\n shiftTaoMonth,\n sortTaoDateRange,\n taoDateWeekdayIndex,\n taoWeekdayLabels,\n todayTaoDate,\n type TaoDateRangeValue,\n} from '../date';\nimport '../styles/date-popup.css';\n\ndefineOptions({ name: 'TaoDateRange' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TaoDateRangeValue | null;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n min?: string;\n max?: string;\n locale?: string;\n todayText?: string;\n clearText?: string;\n prevMonthLabel?: string;\n nextMonthLabel?: 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 todayText: 'Сегодня',\n clearText: 'Очистить',\n prevMonthLabel: 'Предыдущий месяц',\n nextMonthLabel: 'Следующий месяц',\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoDateRangeValue | null];\n change: [value: TaoDateRangeValue | 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 draftStart = ref<string | null>(null);\nconst hoverIso = ref<string | null>(null);\nconst triggerRef = ref<HTMLButtonElement | null>(null);\nconst panelRef = ref<HTMLElement | null>(null);\nconst panelStyle = ref({ top: '0px', left: '0px' });\n\nconst committed = computed(() => parseTaoDateRange(props.modelValue));\nconst highlight = computed(() => {\n if (draftStart.value) {\n return sortTaoDateRange(draftStart.value, hoverIso.value ?? cursorIso.value ?? draftStart.value);\n }\n\n return committed.value;\n});\nconst displayLabel = computed(() =>\n committed.value ? formatTaoDateRangeLabel(committed.value.start, committed.value.end, props.locale) : '',\n);\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 daySelected(iso: string) {\n return Boolean(highlight.value && (iso === highlight.value.start || iso === highlight.value.end));\n}\n\nfunction dayInRange(iso: string) {\n return Boolean(highlight.value && iso > highlight.value.start && iso < highlight.value.end);\n}\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 draftStart.value = null;\n hoverIso.value = null;\n syncViewFrom(committed.value?.start ?? 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 commitRange(range: TaoDateRangeValue) {\n emit('update:modelValue', range);\n emit('change', range);\n draftStart.value = null;\n hoverIso.value = null;\n close();\n triggerRef.value?.focus();\n}\n\nfunction selectDay(iso: string) {\n if (!isTaoDateInRange(iso, props.min, props.max)) {\n return;\n }\n\n if (!draftStart.value) {\n draftStart.value = iso;\n hoverIso.value = iso;\n cursorIso.value = iso;\n return;\n }\n\n commitRange(sortTaoDateRange(draftStart.value, iso));\n}\n\nfunction selectToday() {\n if (!todayEnabled.value) {\n return;\n }\n\n commitRange({ start: todayIso.value, end: todayIso.value });\n}\n\nfunction clear() {\n emit('update:modelValue', null);\n emit('change', null);\n draftStart.value = null;\n hoverIso.value = null;\n close();\n triggerRef.value?.focus();\n}\n\nfunction goMonth(delta: number) {\n hoverIso.value = null;\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 hoverIso.value = null;\n cursorIso.value = shiftTaoDate(cursorIso.value, days);\n syncViewFrom(cursorIso.value);\n void nextTick(updatePosition);\n}\n\nfunction onDayEnter(iso: string) {\n if (!isTaoDateInRange(iso, props.min, props.max)) {\n return;\n }\n\n hoverIso.value = iso;\n}\n\nfunction onGridLeave() {\n hoverIso.value = null;\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 draftStart.value = null;\n hoverIso.value = null;\n document.removeEventListener('pointerdown', onDocumentPointer);\n window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('scroll', onViewportChange, true);\n});\n\nlet stopFocusLoss: (() => void) | undefined;\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(() => {\n hoverIso.value = null;\n });\n});\n\nonBeforeUnmount(() => {\n stopFocusLoss?.();\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-range\" :class=\"{ 'tao-date-range--open': open, 'tao-date-range--invalid': invalid }\">\n <button\n :id=\"controlId\"\n ref=\"triggerRef\"\n type=\"button\"\n class=\"tao-date-range__trigger\"\n :class=\"{ 'tao-date-range__trigger--placeholder': !committed }\"\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-range__value\">{{ displayLabel || placeholder }}</span>\n <span class=\"tao-date-range__icon\" aria-hidden=\"true\">\n <slot name=\"icon\">\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" 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 </slot>\n </span>\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=\"prevMonthLabel\" @click=\"goMonth(-1)\">\n <span aria-hidden=\"true\">\n <slot name=\"prev-icon\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" 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 </slot>\n </span>\n </button>\n <p class=\"tao-date__month\">{{ monthLabel }}</p>\n <button type=\"button\" class=\"tao-date__nav\" :aria-label=\"nextMonthLabel\" @click=\"goMonth(1)\">\n <span aria-hidden=\"true\">\n <slot name=\"next-icon\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" 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 </slot>\n </span>\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\" @mouseleave=\"onGridLeave\">\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': daySelected(cell.iso),\n 'tao-date__day--in-range': dayInRange(cell.iso),\n 'tao-date__day--range-start': highlight?.start === cell.iso,\n 'tao-date__day--range-end': highlight?.end === cell.iso,\n 'tao-date__day--cursor': cell.iso === cursorIso,\n 'tao-date__day--disabled': !isTaoDateInRange(cell.iso, min, max),\n }\"\n role=\"gridcell\"\n :aria-label=\"formatTaoDateLabel(cell.iso, locale)\"\n :aria-selected=\"daySelected(cell.iso)\"\n :disabled=\"!isTaoDateInRange(cell.iso, min, max)\"\n @mousedown.prevent\n @mouseenter=\"onDayEnter(cell.iso)\"\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=\"selectToday\">\n <slot name=\"today\">{{ todayText }}</slot>\n </button>\n <button v-if=\"committed\" type=\"button\" class=\"tao-date__link\" @click=\"clear\">\n <slot name=\"clear\">{{ clearText }}</slot>\n </button>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style scoped>\n.tao-date-range {\n width: 100%;\n}\n\n.tao-date-range__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-range__trigger--placeholder {\n color: var(--tao-color-input-placeholder);\n}\n\n.tao-date-range__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-range--invalid .tao-date-range__trigger {\n border-color: var(--tao-color-danger);\n}\n\n.tao-date-range--invalid .tao-date-range__trigger:focus {\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\n}\n\n.tao-date-range__trigger:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.tao-date-range__value {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tao-date-range__icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\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","import type { ComputedRef, InjectionKey } from 'vue';\nimport type { TaoRadioValue } from './radio';\n\nexport type TaoSegmentedSize = 'small' | 'medium' | 'large';\n\nexport interface TaoSegmentedContext {\n name: ComputedRef<string>;\n model: ComputedRef<TaoRadioValue | undefined>;\n disabled: ComputedRef<boolean>;\n size: ComputedRef<TaoSegmentedSize>;\n setValue: (value: TaoRadioValue) => void;\n}\n\nexport const segmentedKey: InjectionKey<TaoSegmentedContext> = Symbol('taoSegmented');\n","<script lang=\"ts\" setup>\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, provide, ref, useId, watch } from 'vue';\nimport { formFieldKey } from '../formField';\nimport { type TaoRadioValue } from '../radio';\nimport { segmentedKey, type TaoSegmentedSize } from '../segmented';\n\ndefineOptions({ name: 'TaoSegmented' });\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TaoRadioValue;\n name?: string;\n legend?: string;\n disabled?: boolean;\n size?: TaoSegmentedSize;\n block?: boolean;\n }>(),\n {\n disabled: false,\n size: 'medium',\n block: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoRadioValue];\n change: [value: TaoRadioValue];\n}>();\n\nconst field = inject(formFieldKey, null);\nconst autoName = useId();\nconst groupName = computed(() => props.name || autoName);\nconst model = computed(() => props.modelValue);\nconst groupDisabled = computed(() => props.disabled);\nconst groupSize = computed(() => props.size);\nconst invalid = computed(() => Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\n\nconst trackRef = ref<HTMLElement | null>(null);\nconst thumbStyle = ref<Record<string, string>>({ opacity: '0' });\nlet resizeObserver: ResizeObserver | null = null;\nlet mutationObserver: MutationObserver | null = null;\n\nfunction setValue(value: TaoRadioValue) {\n emit('update:modelValue', value);\n emit('change', value);\n}\n\nfunction updateThumb() {\n const track = trackRef.value;\n if (!track) {\n return;\n }\n\n const selected = track.querySelector<HTMLElement>('.tao-segmented-option--checked');\n if (!selected) {\n if (thumbStyle.value.opacity !== '0') {\n thumbStyle.value = { opacity: '0' };\n }\n return;\n }\n\n const trackBox = track.getBoundingClientRect();\n const optionBox = selected.getBoundingClientRect();\n const next = {\n width: `${optionBox.width}px`,\n height: `${optionBox.height}px`,\n transform: `translate(${optionBox.left - trackBox.left - track.clientLeft}px, ${optionBox.top - trackBox.top - track.clientTop}px)`,\n opacity: '1',\n };\n\n const prev = thumbStyle.value;\n if (\n prev.width === next.width &&\n prev.height === next.height &&\n prev.transform === next.transform &&\n prev.opacity === next.opacity\n ) {\n return;\n }\n\n thumbStyle.value = next;\n}\n\nprovide(segmentedKey, {\n name: groupName,\n model,\n disabled: groupDisabled,\n size: groupSize,\n setValue,\n});\n\nonMounted(() => {\n const track = trackRef.value;\n void nextTick(updateThumb);\n\n if (!track) {\n return;\n }\n\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => updateThumb());\n resizeObserver.observe(track);\n }\n\n mutationObserver = new MutationObserver(() => updateThumb());\n mutationObserver.observe(track, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['class'],\n });\n});\n\nwatch(\n () => [props.modelValue, props.size, props.block, props.disabled] as const,\n () => {\n void nextTick(updateThumb);\n },\n);\n\nonBeforeUnmount(() => {\n resizeObserver?.disconnect();\n resizeObserver = null;\n mutationObserver?.disconnect();\n mutationObserver = null;\n});\n</script>\n\n<template>\n <fieldset\n class=\"tao-segmented\"\n :class=\"[\n `tao-segmented--${size}`,\n {\n 'tao-segmented--block': block,\n 'tao-segmented--disabled': disabled,\n 'tao-segmented--invalid': invalid,\n },\n ]\"\n :disabled=\"disabled\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n >\n <legend v-if=\"legend\" class=\"tao-segmented__legend\">{{ legend }}</legend>\n <div ref=\"trackRef\" class=\"tao-segmented__track\">\n <div class=\"tao-segmented__thumb\" :style=\"thumbStyle\" aria-hidden=\"true\"></div>\n <slot />\n </div>\n </fieldset>\n</template>\n\n<style scoped>\n.tao-segmented {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n margin: 0;\n padding: 0;\n border: none;\n min-width: 0;\n vertical-align: top;\n}\n\n.tao-segmented--block {\n display: flex;\n width: 100%;\n align-items: stretch;\n}\n\n.tao-segmented__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\n.tao-segmented__track {\n position: relative;\n display: inline-flex;\n flex-wrap: nowrap;\n align-items: stretch;\n max-width: 100%;\n padding: 2px;\n overflow: hidden;\n background: var(--tao-color-surface-sunken);\n border: 1px solid var(--tao-color-border-strong);\n border-radius: var(--tao-radius-control);\n}\n\n.tao-segmented--block .tao-segmented__track {\n display: flex;\n width: 100%;\n}\n\n.tao-segmented--block .tao-segmented__track > :deep(.tao-segmented-option) {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.tao-segmented--block .tao-segmented__track > :deep(.tao-segmented-option__label) {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tao-segmented__thumb {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n background: var(--tao-color-surface-raised);\n border: 1px solid var(--tao-color-border);\n border-radius: calc(var(--tao-radius-control) - 1px);\n box-shadow: var(--tao-shadow-sm);\n pointer-events: none;\n transition:\n transform var(--tao-duration-base) var(--tao-ease-base),\n width var(--tao-duration-base) var(--tao-ease-base),\n height var(--tao-duration-base) var(--tao-ease-base),\n opacity var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-segmented--invalid .tao-segmented__track {\n border-color: var(--tao-color-danger);\n}\n\n.tao-segmented--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .tao-segmented__thumb {\n transition: none;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useId, useSlots } from 'vue';\nimport { type TaoRadioValue } from '../radio';\nimport { segmentedKey } from '../segmented';\n\ndefineOptions({ name: 'TaoSegmentedOption' });\n\nconst props = withDefaults(\n defineProps<{\n value: TaoRadioValue;\n modelValue?: TaoRadioValue;\n name?: string;\n label?: string;\n icon?: string;\n count?: number | string;\n disabled?: boolean;\n ariaLabel?: string;\n }>(),\n {\n label: '',\n icon: '',\n disabled: false,\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoRadioValue];\n change: [value: TaoRadioValue];\n}>();\n\nconst group = inject(segmentedKey, null);\nconst slots = useSlots();\nconst localId = useId();\n\nconst isDisabled = computed(() => props.disabled || Boolean(group?.disabled.value));\nconst inputName = computed(() => group?.name.value ?? props.name);\nconst size = computed(() => group?.size.value ?? 'medium');\nconst isChecked = computed(() => {\n const current = group ? group.model.value : props.modelValue;\n return current === props.value;\n});\n\nconst hasLabel = computed(() => Boolean(props.label || slots.default));\nconst isIconOnly = computed(() => Boolean((props.icon || slots.icon) && !hasLabel.value));\n\nconst countLabel = computed(() => {\n if (props.count === undefined || props.count === null || props.count === '') {\n return '';\n }\n\n if (typeof props.count === 'number') {\n if (props.count > 99) {\n return '99+';\n }\n\n return String(props.count);\n }\n\n return String(props.count);\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\n class=\"tao-segmented-option\"\n :class=\"[\n `tao-segmented-option--${size}`,\n {\n 'tao-segmented-option--checked': isChecked,\n 'tao-segmented-option--disabled': props.disabled,\n 'tao-segmented-option--icon-only': isIconOnly,\n },\n ]\"\n :for=\"localId\"\n >\n <input\n :id=\"localId\"\n class=\"tao-segmented-option__input\"\n type=\"radio\"\n :name=\"inputName\"\n :value=\"String(value)\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled\"\n :aria-label=\"ariaLabel\"\n @change=\"onChange\"\n />\n <span class=\"tao-segmented-option__face\">\n <span v-if=\"icon || $slots.icon\" class=\"tao-segmented-option__icon\" aria-hidden=\"true\">\n <slot name=\"icon\">{{ icon }}</slot>\n </span>\n <span v-if=\"hasLabel\" class=\"tao-segmented-option__label\">\n <slot>{{ label }}</slot>\n </span>\n <span v-else-if=\"ariaLabel\" class=\"tao-segmented-option__sr\">{{ ariaLabel }}</span>\n <span v-if=\"countLabel\" class=\"tao-segmented-option__count\">{{ countLabel }}</span>\n </span>\n </label>\n</template>\n\n<style scoped>\n.tao-segmented-option {\n position: relative;\n z-index: 1;\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n min-width: 0;\n cursor: pointer;\n user-select: none;\n color: var(--tao-color-text-muted);\n}\n\n.tao-segmented-option__face {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--tao-space-1);\n width: 100%;\n border-radius: calc(var(--tao-radius-control) - 1px);\n font-family: inherit;\n font-weight: 500;\n line-height: 1.25;\n white-space: nowrap;\n transition:\n color var(--tao-duration-base) var(--tao-ease-base),\n background var(--tao-duration-base) var(--tao-ease-base);\n}\n\n.tao-segmented-option--small .tao-segmented-option__face {\n min-height: 20px;\n padding: 0 var(--tao-space-2);\n font-size: var(--tao-font-size-xs);\n}\n\n.tao-segmented-option--medium .tao-segmented-option__face {\n min-height: 24px;\n padding: 0 var(--tao-space-3);\n font-size: var(--tao-font-size-sm);\n}\n\n.tao-segmented-option--large .tao-segmented-option__face {\n min-height: 32px;\n padding: 0 var(--tao-space-4);\n font-size: var(--tao-font-size-md);\n}\n\n.tao-segmented-option--icon-only.tao-segmented-option--small .tao-segmented-option__face {\n min-width: 20px;\n padding: 0;\n}\n\n.tao-segmented-option--icon-only.tao-segmented-option--medium .tao-segmented-option__face {\n min-width: 24px;\n padding: 0;\n}\n\n.tao-segmented-option--icon-only.tao-segmented-option--large .tao-segmented-option__face {\n min-width: 32px;\n padding: 0;\n}\n\n.tao-segmented-option__icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n line-height: 1;\n}\n\n.tao-segmented-option__label {\n min-width: 0;\n line-height: 1.25;\n}\n\n.tao-segmented-option__count {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n min-width: 1.15em;\n height: 1.15em;\n padding: 0 4px;\n border-radius: var(--tao-radius-full);\n background: var(--tao-color-accent-subtle);\n color: var(--tao-color-accent);\n font-size: 10px;\n font-weight: 700;\n line-height: 1;\n}\n\n.tao-segmented-option:hover:not(.tao-segmented-option--disabled):not(.tao-segmented-option--checked) {\n color: var(--tao-color-text);\n}\n\n.tao-segmented-option--checked {\n color: var(--tao-color-accent);\n}\n\n.tao-segmented-option--checked .tao-segmented-option__count {\n background: color-mix(in srgb, var(--tao-color-accent) 22%, transparent);\n}\n\n.tao-segmented-option--disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.tao-segmented-option__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-segmented-option__sr {\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-segmented-option__input:focus-visible + .tao-segmented-option__face {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: -2px;\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' | 'danger' | 'warning' | 'info' | 'neutral';\n title?: string;\n closable?: boolean;\n closeLabel?: string;\n }>(),\n {\n type: 'info',\n title: '',\n closable: false,\n closeLabel: 'Закрыть',\n },\n);\n\nconst emit = defineEmits<{\n close: [];\n}>();\n\nconst tone = computed(() => (props.type === 'danger' ? 'error' : props.type));\nconst live = computed(() => (tone.value === 'error' || tone.value === 'warning' ? 'assertive' : 'polite'));\n</script>\n\n<template>\n <div\n class=\"tao-alert\"\n :class=\"`tao-alert--${tone}`\"\n :role=\"tone === '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=\"closeLabel\"\n @click=\"emit('close')\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"close-icon\">&times;</slot>\n </span>\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--danger {\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 prevLabel?: string;\n nextLabel?: string;\n /** `{page}` — номер страницы. */\n pageLabel?: string;\n /** `{n}` — сколько страниц перескакивает «…». */\n jumpPrevLabel?: string;\n jumpNextLabel?: 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 prevLabel: 'Назад',\n nextLabel: 'Вперёд',\n pageLabel: 'Страница {page}',\n jumpPrevLabel: 'Назад на {n} страниц',\n jumpNextLabel: 'Вперёд на {n} страниц',\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 <slot name=\"total\" :from=\"from\" :to=\"to\" :total=\"total\">\n <template v-if=\"total === 0\">0 из 0</template>\n <template v-else>{{ from }}–{{ to }} из {{ total }}</template>\n </slot>\n </p>\n\n <div class=\"tao-pagination__pages\">\n <button\n type=\"button\"\n class=\"tao-pagination__btn\"\n :aria-label=\"prevLabel\"\n :disabled=\"disabled || current <= 1\"\n @click=\"goTo(current - 1)\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"prev-icon\">‹</slot>\n </span>\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' ? jumpPrevLabel.replace('{n}', String(jump)) : jumpNextLabel.replace('{n}', String(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=\"pageLabel.replace('{page}', String(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=\"nextLabel\"\n :disabled=\"disabled || current >= pageCount\"\n @click=\"goTo(current + 1)\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"next-icon\">›</slot>\n </span>\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 closeLabel?: string;\n }>(),\n {\n title: '',\n side: 'right',\n closable: true,\n closeLabel: 'Закрыть',\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=\"closeLabel\"\n @click=\"close\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"close-icon\">&times;</slot>\n </span>\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\ntype TaoAvatarDot = 'success' | 'danger' | 'warning' | 'info' | 'neutral' | 'error';\n\nconst props = withDefaults(\n defineProps<{\n src?: string;\n name?: string;\n alt?: string;\n size?: 'small' | 'medium' | 'large' | 's' | 'm' | 'l';\n /** Точка статуса. `true` = success (в сети). */\n dot?: boolean | TaoAvatarDot;\n /** Счётчик в углу. 0 и пустое не рисуются, больше 99 — «99+». */\n count?: number | string;\n fallbackLabel?: string;\n /** `{count}` — число в бейдже. */\n notificationsLabel?: string;\n dotLabels?: Partial<Record<Exclude<TaoAvatarDot, 'error'>, string>>;\n }>(),\n {\n src: '',\n name: '',\n alt: '',\n size: 'medium',\n dot: false,\n count: undefined,\n fallbackLabel: 'Аватар',\n notificationsLabel: '{count} уведомлений',\n dotLabels: () => ({}),\n },\n);\n\nconst sizeClass = computed(() => {\n if (props.size === 'small' || props.size === 's') {\n return 's';\n }\n if (props.size === 'large' || props.size === 'l') {\n return 'l';\n }\n return 'm';\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 dotTone = computed((): Exclude<TaoAvatarDot, 'error'> | null => {\n if (!props.dot) {\n return null;\n }\n if (props.dot === true) {\n return 'success';\n }\n return props.dot === 'error' ? 'danger' : props.dot;\n});\n\nconst badge = computed(() => {\n if (props.count === undefined || props.count === '') {\n return '';\n }\n const numeric = typeof props.count === 'number' ? props.count : Number(props.count);\n if (Number.isFinite(numeric)) {\n if (numeric <= 0) {\n return '';\n }\n return numeric > 99 ? '99+' : String(numeric);\n }\n return String(props.count);\n});\n\nconst defaultDotLabel: Record<Exclude<TaoAvatarDot, 'error'>, string> = {\n success: 'в сети',\n danger: 'занят',\n warning: 'отошёл',\n info: 'статус',\n neutral: 'не в сети',\n};\n\nconst label = computed(() => {\n const base = props.alt || props.name || props.fallbackLabel;\n const extra: string[] = [];\n if (dotTone.value) {\n extra.push(props.dotLabels[dotTone.value] ?? defaultDotLabel[dotTone.value]);\n }\n if (badge.value) {\n extra.push(props.notificationsLabel.replace('{count}', badge.value));\n }\n return extra.length ? `${base}, ${extra.join(', ')}` : base;\n});\n</script>\n\n<template>\n <span class=\"tao-avatar\" :class=\"`tao-avatar--${sizeClass}`\" :title=\"label\">\n <span class=\"tao-avatar__face\">\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 <span\n v-if=\"dotTone\"\n class=\"tao-avatar__dot\"\n :class=\"`tao-avatar__dot--${dotTone}`\"\n aria-hidden=\"true\"\n ></span>\n <span v-if=\"badge\" class=\"tao-avatar__badge\" aria-hidden=\"true\">{{ badge }}</span>\n </span>\n</template>\n\n<style scoped>\n.tao-avatar {\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n user-select: none;\n}\n\n.tao-avatar__face {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n width: 100%;\n height: 100%;\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}\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\n.tao-avatar__dot {\n position: absolute;\n right: -1px;\n bottom: -1px;\n box-sizing: border-box;\n border: 2px solid var(--tao-color-bg);\n border-radius: var(--tao-radius-full);\n background: var(--tao-color-success);\n}\n\n.tao-avatar--s .tao-avatar__dot {\n width: 8px;\n height: 8px;\n border-width: 1px;\n}\n\n.tao-avatar--m .tao-avatar__dot {\n width: 10px;\n height: 10px;\n}\n\n.tao-avatar--l .tao-avatar__dot {\n width: 12px;\n height: 12px;\n}\n\n.tao-avatar__dot--success {\n background: var(--tao-color-success);\n}\n\n.tao-avatar__dot--danger {\n background: var(--tao-color-danger);\n}\n\n.tao-avatar__dot--warning {\n background: var(--tao-color-warning);\n}\n\n.tao-avatar__dot--info {\n background: var(--tao-color-info);\n}\n\n.tao-avatar__dot--neutral {\n background: var(--tao-color-text-muted);\n}\n\n.tao-avatar__badge {\n position: absolute;\n top: -6px;\n right: -6px;\n z-index: 1;\n box-sizing: border-box;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--tao-color-bg);\n border-radius: var(--tao-radius-full);\n background: var(--tao-color-danger);\n color: var(--tao-color-text-strong);\n font-size: 10px;\n font-weight: 700;\n line-height: 1;\n}\n\n.tao-avatar--s .tao-avatar__badge {\n top: -5px;\n right: -5px;\n min-width: 14px;\n height: 14px;\n padding: 0 3px;\n font-size: 9px;\n}\n\n.tao-avatar--l .tao-avatar__badge {\n min-width: 18px;\n height: 18px;\n font-size: 11px;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport TaoLink from './TaoLink.vue';\nimport type { TaoBreadcrumbItem } from '../breadcrumb';\n\ndefineOptions({ name: 'TaoBreadcrumb' });\n\nwithDefaults(\n defineProps<{\n items: TaoBreadcrumbItem[];\n ariaLabel?: string;\n }>(),\n {\n ariaLabel: 'Хлебные крошки',\n },\n);\n</script>\n\n<template>\n <nav class=\"tao-breadcrumb\" :aria-label=\"ariaLabel\">\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 prevLabel?: string;\n nextLabel?: string;\n dotsLabel?: string;\n /** `{n}` и `{count}` — текущий слайд и всего. */\n slideLabel?: 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 prevLabel: 'Назад',\n nextLabel: 'Вперёд',\n dotsLabel: 'Слайды',\n slideLabel: 'Слайд {n} из {count}',\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 'prev-icon'(): unknown;\n 'next-icon'(): 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, instant = false) {\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 || instant ? '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 releaseDragCapture() {\n const el = track.value;\n const id = dragPointer;\n if (!el || id === -1) {\n return;\n }\n\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\n return;\n }\n\n try {\n el.releasePointerCapture(id);\n } catch {\n /* already released by the browser */\n }\n}\n\nfunction endDrag(keepClickGuard = false) {\n if (!dragging.value) {\n return;\n }\n\n dragging.value = false;\n releaseDragCapture();\n dragPointer = -1;\n if (!keepClickGuard) {\n dragMoved = 0;\n }\n\n if (track.value) {\n goTo(nearestIndex(), true);\n }\n syncAutoplay();\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 try {\n track.value.setPointerCapture(event.pointerId);\n } catch {\n /* untrusted events / capture already gone */\n }\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 onPointerEnd(event: PointerEvent) {\n if (!dragging.value) {\n return;\n }\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\n return;\n }\n\n endDrag(true);\n}\n\nfunction onLostPointerCapture() {\n endDrag();\n}\n\nfunction onWindowBlur() {\n endDrag();\n hoverPaused.value = false;\n syncAutoplay();\n}\n\nfunction onVisibilityChange() {\n if (document.hidden) {\n endDrag();\n hoverPaused.value = false;\n }\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', onVisibilityChange);\n window.addEventListener('blur', onWindowBlur);\n window.addEventListener('pagehide', onWindowBlur);\n});\n\nonUpdated(refreshCount);\n\nonBeforeUnmount(() => {\n endDrag();\n cancelAnimationFrame(scrollFrame);\n stopAutoplay();\n document.removeEventListener('visibilitychange', onVisibilityChange);\n window.removeEventListener('blur', onWindowBlur);\n window.removeEventListener('pagehide', onWindowBlur);\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=\"prevLabel\"\n :disabled=\"atStart\"\n @click=\"goPrev\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"prev-icon\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" 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 </slot>\n </span>\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=\"onPointerEnd\"\n @pointercancel=\"onPointerEnd\"\n @lostpointercapture=\"onLostPointerCapture\"\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=\"nextLabel\"\n :disabled=\"atEnd\"\n @click=\"goNext\"\n >\n <span aria-hidden=\"true\">\n <slot name=\"next-icon\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" 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 </slot>\n </span>\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=\"dotsLabel\">\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=\"slideLabel.replace('{n}', String(n)).replace('{count}', String(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 statusLabels?: Partial<Record<TaoStageStatus, string>>;\n }>(),\n {\n items: () => [],\n vertical: true,\n ariaLabel: 'Стадии',\n statusLabels: () => ({}),\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 fallbackStatusText: Record<TaoStageStatus, string> = {\n wait: 'ожидание',\n work: 'в работе',\n ok: 'готово',\n bad: 'ошибка',\n};\n\nfunction statusOf(item: TaoStageItem): TaoStageStatus {\n if (item.status === 'danger') {\n return 'bad';\n }\n return item.status ?? 'wait';\n}\n\nfunction itemLabel(item: TaoStageItem): string {\n const status = statusOf(item);\n return `${item.label ?? item.key}, ${props.statusLabels[status] ?? fallbackStatusText[status]}`;\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 closeLabel: 'Закрыть уведомление',\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, onMounted, ref } from 'vue';\nimport TaoButton from './TaoButton.vue';\nimport TaoIcon from './TaoIcon.vue';\nimport { listenFocusLoss } from '../focusLoss';\nimport { removeToast, toastDefaults } from '../toast/store';\nimport type { TaoToastRecord } from '../toast/types';\n\ndefineOptions({ name: 'TaoToastItem' });\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\nlet stopFocusLoss: (() => void) | undefined;\nonMounted(() => {\n stopFocusLoss = listenFocusLoss(resume);\n});\n\nonBeforeUnmount(() => {\n stopFocusLoss?.();\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 === 'danger' || 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' || toast.type === 'danger'\" 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=\"toastDefaults.closeLabel\"\n @click=\"close\"\n >\n &times;\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--danger {\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 danger: 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 danger(): 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 danger() {\n draft.type = 'danger';\n draft.timeout = TYPE_TIMEOUT.danger;\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 danger(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 danger(message: string, options?: TaoToastShortcutOptions) {\n return shortcut('danger', 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 TaoPopover from './components/TaoPopover.vue';\nimport TaoSpoiler from './components/TaoSpoiler.vue';\nimport TaoSpoilerGroup from './components/TaoSpoilerGroup.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 TaoSplit from './components/TaoSplit.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 TaoFieldset from './components/TaoFieldset.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 TaoCombobox from './components/TaoCombobox.vue';\nimport TaoDate from './components/TaoDate.vue';\nimport TaoDateRange from './components/TaoDateRange.vue';\nimport TaoSwitch from './components/TaoSwitch.vue';\nimport TaoRadio from './components/TaoRadio.vue';\nimport TaoRadioGroup from './components/TaoRadioGroup.vue';\nimport TaoSegmented from './components/TaoSegmented.vue';\nimport TaoSegmentedOption from './components/TaoSegmentedOption.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// подключи '@1337exp/taoui/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 TaoPopover,\n TaoSpoiler,\n TaoSpoilerGroup,\n TaoCopy,\n TaoContainer,\n TaoFlex,\n TaoSpace,\n TaoSplit,\n TaoIcon,\n TaoLoader,\n TaoImage,\n TaoCheckbox,\n TaoTag,\n TaoDivider,\n TaoFieldset,\n TaoAnimatedBorder,\n TaoTextarea,\n TaoScrollTop,\n TaoProgress,\n TaoSlider,\n TaoFileDrop,\n TaoDropdownMenu,\n TaoPinCode,\n TaoLink,\n TaoFormField,\n TaoSelect,\n TaoCombobox,\n TaoDate,\n TaoDateRange,\n TaoSwitch,\n TaoRadio,\n TaoRadioGroup,\n TaoSegmented,\n TaoSegmentedOption,\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 TaoPopover,\n TaoSpoiler,\n TaoSpoilerGroup,\n TaoCopy,\n TaoContainer,\n TaoFlex,\n TaoSpace,\n TaoSplit,\n TaoIcon,\n TaoLoader,\n TaoImage,\n TaoCheckbox,\n TaoTag,\n TaoDivider,\n TaoFieldset,\n TaoAnimatedBorder,\n TaoTextarea,\n TaoScrollTop,\n TaoProgress,\n TaoSlider,\n TaoFileDrop,\n TaoDropdownMenu,\n TaoPinCode,\n TaoLink,\n TaoFormField,\n TaoSelect,\n TaoCombobox,\n TaoDate,\n TaoDateRange,\n TaoSwitch,\n TaoRadio,\n TaoRadioGroup,\n TaoSegmented,\n TaoSegmentedOption,\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 {\n parseTaoDate,\n parseTaoDateRange,\n formatTaoDateIso,\n todayTaoDate,\n formatTaoDateLabel,\n formatTaoDateRangeLabel,\n} from './date';\nexport type { TaoSelectOption } from './select';\nexport type { TaoDateCell, TaoDateParts, TaoDateRangeValue } from './date';\nexport type { TaoRadioValue } from './radio';\nexport type { TaoSegmentedSize } from './segmented';\nexport type { TaoSpoilerName } from './spoiler';\nexport type { TaoFormFieldContext } from './formField';\nexport type { TaoTableAlign, TaoTableColumn, TaoTableSort } from './table';\nexport type { TaoPaginationItem } from './pagination';\nexport type { TaoBreadcrumbItem } from './breadcrumb';\nexport type { TaoDropdownAction } from './dropdown';\nexport type { TaoQuantityChangeSource } from './quantity';\nexport type { TaoStageItem, TaoStageStatus } from './stage';\nexport type { TaoSplitDirection, TaoSplitUnit } from './split';\n\nexport default TaoUI;\n"],"names":["_createElementBlock","_openBlock","_hoisted_2","_hoisted_3","_toDisplayString","_createElementVNode","_hoisted_4","_renderSlot","computed","_normalizeClass","_normalizeStyle","inject","useId","ref","_hoisted_1","_unref","$slots","_hoisted_5","_hoisted_6","watch","_hoisted_7","_hoisted_8","nextTick","onBeforeUnmount","_createBlock","_Teleport","_createVNode","_Transition","_Fragment","_renderList","_createTextVNode","onMounted","provide","_resolveDynamicComponent","nextPx","useSlots","reactive","onBeforeMount","value","_hoisted_10","getCurrentInstance","_mergeProps","onInput","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","TaoLink","_TransitionGroup","onUpdated","toast","viewportMounts","isClient","hostedApp","createApp","createDraft","createBuilder","TaoFlex"],"mappings":"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"}