@1337exp/taoui 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.ru.md +1 -1
- package/dist/index.cjs +18 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +19 -3
- package/dist/index.mjs +18 -4
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +65 -52
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/components/TaoButton.vue","../src/components/TaoBlock.vue","../src/formField.ts","../src/components/TaoInput.vue","../src/components/TaoInputGroup.vue","../src/components/TaoInputNumber.vue","../src/components/TaoQuantity.vue","../src/components/TaoCard.vue","../src/focusTrap.ts","../src/bodyScroll.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/TaoGrid.vue","../src/components/TaoGridItem.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/list.ts","../src/components/TaoList.vue","../src/components/TaoListItem.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","let locks = 0;\nlet previousOverflow = '';\n\nexport function isBrowser() {\n return typeof document !== 'undefined';\n}\n\nexport function lockBodyScroll() {\n if (!isBrowser()) {\n return;\n }\n\n if (locks === 0) {\n previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n locks += 1;\n}\n\nexport function unlockBodyScroll() {\n if (!isBrowser() || locks === 0) {\n return;\n }\n\n locks -= 1;\n if (locks === 0) {\n document.body.style.overflow = previousOverflow;\n previousOverflow = '';\n }\n}\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\nimport { getFocusable, trapTab } from '../focusTrap';\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\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 previousFocus: HTMLElement | null = null;\nlet scrollHeld = false;\n\nfunction close() {\n if (!props.closable) {\n return;\n }\n emit('update:modelValue', false);\n emit('close');\n}\n\nfunction holdScroll() {\n if (scrollHeld || !isBrowser()) {\n return;\n }\n lockBodyScroll();\n scrollHeld = true;\n}\n\nfunction releaseScroll() {\n if (!scrollHeld) {\n return;\n }\n unlockBodyScroll();\n scrollHeld = 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 if (!props.closable) {\n return;\n }\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 (!isBrowser()) {\n return;\n }\n\n if (isOpen) {\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n holdScroll();\n void focusPanel();\n return;\n }\n releaseScroll();\n restoreFocus();\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n releaseScroll();\n restoreFocus();\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\">×</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\nfunction bindDismiss() {\n if (typeof document === 'undefined') {\n return;\n }\n\n document.addEventListener('pointerdown', onDocumentPointer);\n document.addEventListener('keydown', onDocumentKey);\n window.addEventListener('resize', onViewportChange);\n window.addEventListener('scroll', onViewportChange, true);\n}\n\nfunction unbindDismiss() {\n if (typeof document === 'undefined') {\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\nfunction applyOpen(next: boolean) {\n setOpen(next);\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 (typeof window === 'undefined' || !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(\n open,\n (isOpen) => {\n if (isOpen) {\n bindDismiss();\n void nextTick(() => {\n updatePosition();\n panelRef.value?.focus();\n });\n return;\n }\n\n unbindDismiss();\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n unbindDismiss();\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, ref } from 'vue';\nimport { spoilerGroupKey, type TaoSpoilerName } from '../spoiler';\n\ndefineOptions({ name: 'TaoSpoilerGroup' });\n\nconst props = defineProps<{\n modelValue?: TaoSpoilerName | null;\n}>();\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoSpoilerName | null];\n change: [value: TaoSpoilerName | null];\n}>();\n\nconst isControlled = computed(() => props.modelValue !== undefined);\nconst internal = ref<TaoSpoilerName | null>(null);\nconst model = computed(() => (isControlled.value ? props.modelValue : internal.value));\n\nfunction setOpen(name: TaoSpoilerName | null) {\n if (!isControlled.value) {\n internal.value = name;\n }\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 } from 'vue';\n\ndefineOptions({ name: 'TaoGrid' });\n\nconst props = withDefaults(\n defineProps<{\n /** Минимальная ширина плитки (auto-fill). Каталог. Игнорируется, если задан cols. */\n min?: string;\n /** Фиксированное число колонок (bento). 0 — режим min. */\n cols?: number;\n gap?: string;\n }>(),\n {\n min: '220px',\n cols: 0,\n gap: 'var(--tao-space-4)',\n },\n);\n\nconst isFixed = computed(() => props.cols > 0);\n\nconst gridStyle = computed(() => ({\n '--tao-grid-min': props.min,\n '--tao-grid-cols': isFixed.value ? String(props.cols) : undefined,\n '--tao-grid-gap': props.gap,\n}));\n</script>\n\n<template>\n <div\n class=\"tao-grid\"\n :class=\"{ 'tao-grid--fixed': isFixed }\"\n :style=\"gridStyle\"\n >\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-grid {\n container-type: inline-size;\n display: grid;\n grid-template-columns: repeat(\n auto-fill,\n minmax(min(100%, var(--tao-grid-min, 220px)), 1fr)\n );\n gap: var(--tao-grid-gap, var(--tao-space-4));\n}\n\n.tao-grid--fixed {\n grid-template-columns: repeat(var(--tao-grid-cols), minmax(0, 1fr));\n}\n\n@container (max-width: 560px) {\n .tao-grid--fixed {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'TaoGridItem' });\n\nconst props = withDefaults(\n defineProps<{\n /** Сколько колонок занять. Для bento (`cols`), не для каталога (`min`). */\n col?: number;\n row?: number;\n }>(),\n {\n col: 1,\n row: 1,\n },\n);\n\nconst itemStyle = computed(() => ({\n '--tao-grid-col': String(Math.max(1, props.col)),\n '--tao-grid-row': String(Math.max(1, props.row)),\n}));\n</script>\n\n<template>\n <div class=\"tao-grid-item\" :style=\"itemStyle\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-grid-item {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n grid-column: span var(--tao-grid-col, 1);\n grid-row: span var(--tao-grid-row, 1);\n}\n\n.tao-grid-item > * {\n flex: 1 1 auto;\n min-height: 0;\n width: 100%;\n}\n\n@container (max-width: 560px) {\n .tao-grid-item {\n grid-column: span 1;\n grid-row: span 1;\n }\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);\nconst hasError = ref(false);\n\nfunction handleLoad() {\n isLoaded.value = true;\n hasError.value = false;\n emit('load');\n}\n\nfunction handleError() {\n isLoaded.value = false;\n hasError.value = true;\n emit('error');\n}\n\nwatch(() => props.src, () => {\n isLoaded.value = false;\n hasError.value = false;\n});\n</script>\n\n<template>\n <div class=\"tao-image\">\n <img\n v-if=\"src && !hasError\"\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 v-if=\"!src || hasError\">\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 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-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, useSlots } from 'vue';\n\ndefineOptions({ name: 'TaoDivider' });\n\nconst props = withDefaults(\n defineProps<{\n /** `solid` — обычная линия. `dashed` — пунктир. `colored` — акцент. `gap` — пустой отступ. */\n variant?: 'solid' | 'dashed' | 'colored' | 'gap';\n size?: 'small' | 'medium' | 'large' | 'big';\n /** Подпись посередине. Не меняет стиль линии — для этого `variant`. */\n text?: string;\n /** Плавные края линии. У `gap` ничего не делает. */\n fade?: boolean;\n }>(),\n {\n variant: 'solid',\n size: 'medium',\n text: '',\n fade: false,\n },\n);\n\nconst slots = useSlots();\nconst gapSize = computed(() => (props.size === 'big' ? 'large' : props.size));\nconst hasLabel = computed(() => Boolean(props.text) || Boolean(slots.default));\n</script>\n\n<template>\n <div\n class=\"tao-divider\"\n :class=\"[\n `tao-divider--${variant}`,\n {\n 'tao-divider--labeled': hasLabel,\n 'tao-divider--fade': fade && variant !== 'gap',\n [`tao-divider--gap-${gapSize}`]: variant === 'gap',\n },\n ]\"\n :role=\"variant === 'gap' && !hasLabel ? undefined : 'separator'\"\n :aria-hidden=\"variant === 'gap' && !hasLabel ? true : undefined\"\n >\n <span\n v-if=\"variant !== 'gap'\"\n class=\"tao-divider__line\"\n :class=\"{ 'tao-divider__line--start': hasLabel }\"\n />\n <span v-if=\"hasLabel\" class=\"tao-divider__text\">\n <slot>{{ text }}</slot>\n </span>\n <span\n v-if=\"variant !== 'gap' && hasLabel\"\n class=\"tao-divider__line tao-divider__line--end\"\n />\n </div>\n</template>\n\n<style scoped>\n.tao-divider {\n margin: var(--tao-space-5) 0;\n}\n\n.tao-divider--labeled {\n display: flex;\n align-items: center;\n}\n\n.tao-divider__line {\n box-sizing: content-box;\n display: block;\n height: 0;\n min-width: 0;\n}\n\n.tao-divider--labeled .tao-divider__line {\n flex: 1;\n}\n\n.tao-divider:not(.tao-divider--labeled) .tao-divider__line {\n width: 100%;\n}\n\n.tao-divider__text {\n margin: 0 var(--tao-space-4);\n font-size: var(--tao-font-size-xs);\n font-weight: 500;\n line-height: 1;\n white-space: nowrap;\n color: var(--tao-color-text-muted);\n}\n\n.tao-divider--labeled:not(.tao-divider--gap) .tao-divider__text {\n height: 1px;\n display: flex;\n align-items: center;\n overflow: visible;\n}\n\n.tao-divider--solid .tao-divider__line {\n border-top: 1px solid var(--tao-color-border);\n}\n\n.tao-divider--dashed .tao-divider__line {\n border-top: 1px dashed var(--tao-color-border-strong);\n opacity: 0.45;\n}\n\n.tao-divider--colored .tao-divider__line {\n height: 1px;\n background: var(--tao-color-accent);\n}\n\n.tao-divider--colored.tao-divider--fade:not(.tao-divider--labeled) .tao-divider__line {\n background: linear-gradient(to right, transparent, var(--tao-color-accent), transparent);\n}\n\n.tao-divider--colored.tao-divider--fade.tao-divider--labeled .tao-divider__line--start {\n background: linear-gradient(to right, transparent, var(--tao-color-accent));\n}\n\n.tao-divider--colored.tao-divider--fade.tao-divider--labeled .tao-divider__line--end {\n background: linear-gradient(to left, transparent, var(--tao-color-accent));\n}\n\n.tao-divider--fade:not(.tao-divider--colored):not(.tao-divider--labeled) .tao-divider__line {\n mask: linear-gradient(90deg, transparent 0%, black 20%, black 80%, transparent 100%);\n}\n\n.tao-divider--fade:not(.tao-divider--colored) .tao-divider__line--start {\n mask: linear-gradient(90deg, transparent 0%, black 30%);\n}\n\n.tao-divider--fade:not(.tao-divider--colored) .tao-divider__line--end {\n mask: linear-gradient(90deg, black 70%, transparent 100%);\n}\n\n.tao-divider--gap {\n margin: 0;\n}\n\n.tao-divider--gap:not(.tao-divider--labeled) {\n height: 40px;\n}\n\n.tao-divider--gap-small:not(.tao-divider--labeled) {\n height: 20px;\n}\n\n.tao-divider--gap-large:not(.tao-divider--labeled),\n.tao-divider--gap-big:not(.tao-divider--labeled) {\n height: 60px;\n}\n\n.tao-divider--gap.tao-divider--labeled {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 40px;\n}\n\n.tao-divider--gap-small.tao-divider--labeled {\n min-height: 20px;\n}\n\n.tao-divider--gap-large.tao-divider--labeled,\n.tao-divider--gap-big.tao-divider--labeled {\n min-height: 60px;\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 acceptTokens(accept: string) {\n return accept\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean);\n}\n\nfunction fileMatchesAccept(file: File, accept: string) {\n const tokens = acceptTokens(accept);\n if (!tokens.length || tokens.includes('*') || tokens.includes('*/*')) {\n return true;\n }\n\n const name = file.name.toLowerCase();\n const mime = (file.type || '').toLowerCase();\n const dot = name.lastIndexOf('.');\n const ext = dot >= 0 ? name.slice(dot) : '';\n\n return tokens.some((token) => {\n if (token.startsWith('.')) {\n return ext === token;\n }\n if (token.endsWith('/*')) {\n return mime.startsWith(token.slice(0, -1));\n }\n return mime === token;\n });\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 resetInput() {\n const el = fileInput.value;\n if (el) {\n el.type = 'text';\n el.type = 'file';\n }\n}\n\nfunction processFiles(fileList: FileList) {\n const incoming = Array.from(fileList).filter((file) => fileMatchesAccept(file, props.accept));\n if (!incoming.length) {\n resetInput();\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 resetInput();\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 :aria-label=\"$slots.button ? undefined : menuLabel\"\n @click=\"toggleMenu\"\n >\n <slot v-if=\"$slots.button\" name=\"button\" />\n <span v-else aria-hidden=\"true\">\n <slot name=\"icon\">⋮</slot>\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 position: relative;\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)::after {\n content: '';\n position: absolute;\n right: var(--tao-space-2);\n bottom: 0;\n left: var(--tao-space-2);\n height: 1px;\n background: var(--tao-color-border);\n pointer-events: none;\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 applyChars(index: number, raw: string) {\n const chars = [...raw].map((ch) => acceptChar(ch)).filter(Boolean);\n if (!chars.length) {\n return;\n }\n\n numbers.value = [...numbers.value];\n let cursor = index;\n for (const ch of chars) {\n if (cursor >= props.length) {\n break;\n }\n numbers.value[cursor] = ch;\n cursor += 1;\n }\n emitChange();\n\n if (isFilled()) {\n inputRefs.value[index]?.blur();\n emit('complete', serialize());\n return;\n }\n\n if (cursor < props.length) {\n focusCell(cursor);\n }\n}\n\nfunction mutation(v: string, index: number) {\n if (v.length > 1) {\n applyChars(index, v);\n return;\n }\n\n const next = acceptChar(v);\n\n if (props.numbersOnly && v && !next) {\n const el = inputRefs.value[index];\n if (el) {\n el.value = numbers.value[index] ?? '';\n }\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 onPaste(event: ClipboardEvent, index: number) {\n const text = event.clipboardData?.getData('text') ?? '';\n if (!text) {\n return;\n }\n\n event.preventDefault();\n applyChars(index, text);\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=\"index === 0 ? length : 1\"\n @input=\"onChange($event, index)\"\n @paste=\"onPaste($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 labelId = `${id}-label`;\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\nfunction onLabelClick() {\n const target = document.getElementById(id);\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLButtonElement ||\n target instanceof HTMLSelectElement ||\n target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n\n const scope = target ?? document.getElementById(labelId)?.parentElement;\n scope\n ?.querySelector<HTMLElement>(\n 'input:not([disabled]), button:not([disabled]), textarea:not([disabled]), select:not([disabled])',\n )\n ?.focus();\n}\n</script>\n\n<template>\n <div class=\"tao-form-field\" :class=\"{ 'tao-form-field--invalid': invalid }\">\n <label v-if=\"label\" :id=\"labelId\" class=\"tao-form-field__label\" :for=\"id\" @click=\"onLabelClick\">{{ 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 panelWidth = panel.offsetWidth || rect.width;\n const gap = 4;\n const pad = 8;\n const spaceBelow = window.innerHeight - rect.bottom - gap;\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\n const maxLeft = Math.max(pad, window.innerWidth - panelWidth - pad);\n const left = Math.min(Math.max(rect.left, pad), maxLeft);\n\n listStyle.value = {\n top: `${openUp ? rect.top - panelHeight - gap : rect.bottom + gap}px`,\n left: `${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 =\n selectedIndex >= 0 && enabledIndexes.value.includes(selectedIndex)\n ? selectedIndex\n : (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 panelWidth = panel.offsetWidth || rect.width;\n const gap = 4;\n const pad = 8;\n const spaceBelow = window.innerHeight - rect.bottom - gap;\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\n const maxLeft = Math.max(pad, window.innerWidth - panelWidth - pad);\n const left = Math.min(Math.max(rect.left, pad), maxLeft);\n\n listStyle.value = {\n top: `${openUp ? rect.top - panelHeight - gap : rect.bottom + gap}px`,\n left: `${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 @click=\"clear\"\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 monthStart = new Date(parts.y, parts.m - 1 + months, 1);\n const y = monthStart.getFullYear();\n const m = monthStart.getMonth() + 1;\n const lastDay = new Date(y, m, 0).getDate();\n return formatTaoDateIso({ y, m, d: Math.min(parts.d, lastDay) });\n}\n\nexport function clampTaoDateCursor(iso: string, min?: string, max?: string): string {\n if (isTaoDateInRange(iso, min, max)) {\n return iso;\n }\n\n if (min && parseTaoDate(min) && iso < min) {\n return min;\n }\n\n if (max && parseTaoDate(max) && iso > max) {\n return max;\n }\n\n return iso;\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 clampTaoDateCursor,\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(clampTaoDateCursor(valueIso.value ?? todayIso.value, props.min, props.max));\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 cursorIso.value = clampTaoDateCursor(shiftTaoMonth(cursorIso.value, delta), props.min, props.max);\n syncViewFrom(cursorIso.value);\n void nextTick(updatePosition);\n}\n\nfunction moveCursor(days: number) {\n const next = shiftTaoDate(cursorIso.value, days);\n cursorIso.value = isTaoDateInRange(next, props.min, props.max)\n ? next\n : clampTaoDateCursor(next, props.min, props.max);\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 clampTaoDateCursor,\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(clampTaoDateCursor(committed.value?.start ?? todayIso.value, props.min, props.max));\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 cursorIso.value = clampTaoDateCursor(shiftTaoMonth(cursorIso.value, delta), props.min, props.max);\n syncViewFrom(cursorIso.value);\n void nextTick(updatePosition);\n}\n\nfunction moveCursor(days: number) {\n hoverIso.value = null;\n const next = shiftTaoDate(cursorIso.value, days);\n cursorIso.value = isTaoDateInRange(next, props.min, props.max)\n ? next\n : clampTaoDateCursor(next, props.min, props.max);\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);\nconst invalid = computed(() => Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\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, 'tao-switch--invalid': invalid }\" :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 :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\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\n.tao-switch--invalid .tao-switch__track {\n border-color: var(--tao-color-danger);\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 { formFieldKey } from '../formField';\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 field = inject(formFieldKey, null);\nconst localId = useId();\nconst controlId = computed(() => (group ? localId : (field?.id ?? localId)));\nconst invalid = computed(() => Boolean(field?.invalid.value));\nconst describedBy = computed(() => (group ? undefined : field?.describedBy.value));\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, 'tao-radio--invalid': invalid && !group }\" :for=\"controlId\">\n <input\n :id=\"controlId\"\n class=\"tao-radio__input\"\n type=\"radio\"\n :name=\"inputName\"\n :value=\"String(value)\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled\"\n :aria-invalid=\"(!group && invalid) || undefined\"\n :aria-describedby=\"describedBy\"\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\n.tao-radio--invalid .tao-radio__dot {\n border-color: var(--tao-color-danger);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, provide, useId } from 'vue';\nimport { formFieldKey } from '../formField';\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 field = inject(formFieldKey, null);\nconst autoName = useId();\nconst groupName = computed(() => props.name || autoName);\nconst model = computed(() => props.modelValue);\nconst groupDisabled = computed(() => props.disabled);\nconst invalid = computed(() => Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\nconst labelledBy = computed(() => (props.legend || !field ? undefined : `${field.id}-label`));\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\n :id=\"field?.id\"\n class=\"tao-radio-group\"\n :class=\"[`tao-radio-group--${direction}`, { 'tao-radio-group--invalid': invalid }]\"\n :disabled=\"disabled\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n :aria-labelledby=\"labelledBy\"\n >\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\n.tao-radio-group--invalid :deep(.tao-radio__dot) {\n border-color: var(--tao-color-danger);\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 :aria-labelledby=\"legend ? undefined : (field ? `${field.id}-label` : undefined)\"\n :id=\"field?.id\"\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\">×</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(\n () => [props.page, pageCount.value] as const,\n ([page, count]) => {\n if (page > count || page < 1) {\n goTo(page);\n }\n },\n { immediate: true },\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","import type { ComputedRef, InjectionKey } from 'vue';\n\nexport type TaoListSize = 'small' | 'medium' | 'large';\n\nexport interface TaoListContext {\n size: ComputedRef<TaoListSize>;\n}\n\nexport const taoListKey: InjectionKey<TaoListContext> = Symbol('taoList');\n","<script lang=\"ts\" setup>\nimport { computed, provide } from 'vue';\nimport { taoListKey, type TaoListSize } from '../list';\n\ndefineOptions({ name: 'TaoList' });\n\nconst props = withDefaults(\n defineProps<{\n size?: TaoListSize;\n /** Рамка, как у списка файлов. */\n bordered?: boolean;\n /** Линии между строками. */\n divided?: boolean;\n /** Скролл, если строки не влезают. Число — пиксели. */\n maxHeight?: number | string;\n /** Показать `#empty` вместо строк. */\n empty?: boolean;\n ariaLabel?: string;\n }>(),\n {\n size: 'medium',\n bordered: true,\n divided: true,\n empty: false,\n ariaLabel: '',\n },\n);\n\nconst size = computed(() => props.size);\nprovide(taoListKey, { size });\n\nconst listStyle = computed(() => {\n if (props.maxHeight === undefined || props.maxHeight === '') {\n return undefined;\n }\n const value = typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight;\n return { maxHeight: value };\n});\n</script>\n\n<template>\n <ul\n class=\"tao-list\"\n :class=\"[\n `tao-list--${size}`,\n {\n 'tao-list--bordered': bordered,\n 'tao-list--divided': divided,\n 'tao-list--plain': !bordered,\n 'tao-list--empty': empty,\n 'tao-list--scroll': Boolean(maxHeight),\n },\n ]\"\n :style=\"listStyle\"\n :aria-label=\"ariaLabel || undefined\"\n >\n <li v-if=\"empty\" class=\"tao-list__empty\">\n <slot name=\"empty\">Ничего нет</slot>\n </li>\n <slot v-else />\n </ul>\n</template>\n\n<style scoped>\n.tao-list {\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n padding: 0;\n list-style: none;\n background: var(--tao-color-surface-raised);\n color: var(--tao-color-text);\n}\n\n.tao-list--bordered {\n overflow: hidden;\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-control);\n}\n\n.tao-list--plain {\n padding: var(--tao-space-1);\n background: transparent;\n}\n\n.tao-list--scroll {\n overflow: auto;\n}\n\n.tao-list--divided :deep(.tao-list-item:not(:last-child)) {\n border-bottom: 1px solid var(--tao-color-border);\n}\n\n.tao-list--plain :deep(.tao-list-item) {\n border-radius: var(--tao-radius-sm);\n}\n\n.tao-list__empty {\n margin: 0;\n padding: var(--tao-space-3);\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-sm);\n line-height: 1.45;\n text-align: center;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useSlots } from 'vue';\nimport { taoListKey, type TaoListSize } from '../list';\n\ndefineOptions({ name: 'TaoListItem' });\n\nconst props = withDefaults(\n defineProps<{\n title?: string;\n description?: string;\n selected?: boolean;\n disabled?: boolean;\n /** Подсветка без selected — курсор / клавиатура. */\n active?: boolean;\n /** Строка-кнопка: Enter/Space, курсор pointer. */\n clickable?: boolean;\n size?: TaoListSize;\n /** `#action` всегда на виду, не только по ховеру. */\n actionAlways?: boolean;\n }>(),\n {\n title: '',\n description: '',\n selected: false,\n disabled: false,\n active: false,\n clickable: false,\n actionAlways: false,\n },\n);\n\nconst emit = defineEmits<{\n click: [event: MouseEvent];\n}>();\n\nconst slots = useSlots();\nconst list = inject(taoListKey, null);\n\nconst sizeClass = computed(() => {\n const size: TaoListSize = props.size ?? list?.size.value ?? 'medium';\n if (size === 'small') {\n return 's';\n }\n if (size === 'large') {\n return 'l';\n }\n return 'm';\n});\n\nconst hasAction = computed(() => Boolean(slots.action));\nconst hasPrefix = computed(() => Boolean(slots.prefix));\nconst hasSuffix = computed(() => Boolean(slots.suffix));\nconst hasDescription = computed(() => Boolean(props.description || slots.description));\n\nfunction onHitClick(event: MouseEvent) {\n if (props.disabled || !props.clickable) {\n return;\n }\n emit('click', event);\n}\n</script>\n\n<template>\n <li\n class=\"tao-list-item\"\n :class=\"[\n `tao-list-item--${sizeClass}`,\n {\n 'tao-list-item--selected': selected,\n 'tao-list-item--disabled': disabled,\n 'tao-list-item--active': active,\n 'tao-list-item--clickable': clickable,\n 'tao-list-item--has-action': hasAction,\n 'tao-list-item--action-always': actionAlways,\n },\n ]\"\n :aria-current=\"!clickable && selected ? 'true' : undefined\"\n :aria-disabled=\"disabled || undefined\"\n >\n <component\n :is=\"clickable ? 'button' : 'div'\"\n class=\"tao-list-item__hit\"\n :type=\"clickable ? 'button' : undefined\"\n :disabled=\"clickable ? disabled : undefined\"\n :aria-current=\"clickable && selected ? 'true' : undefined\"\n @click=\"onHitClick\"\n >\n <span v-if=\"hasPrefix\" class=\"tao-list-item__prefix\">\n <slot name=\"prefix\" />\n </span>\n <span class=\"tao-list-item__text\">\n <span class=\"tao-list-item__title\">\n <slot>{{ title }}</slot>\n </span>\n <span v-if=\"hasDescription\" class=\"tao-list-item__description\">\n <slot name=\"description\">{{ description }}</slot>\n </span>\n </span>\n <span v-if=\"hasSuffix\" class=\"tao-list-item__suffix\">\n <slot name=\"suffix\" />\n </span>\n </component>\n <div\n v-if=\"hasAction\"\n class=\"tao-list-item__action\"\n @click.stop\n @keydown.stop\n >\n <slot name=\"action\" />\n </div>\n </li>\n</template>\n\n<style scoped>\n.tao-list-item {\n display: flex;\n align-items: center;\n gap: var(--tao-space-1);\n min-width: 0;\n color: var(--tao-color-text);\n transition: background var(--tao-duration-fast) var(--tao-ease-base);\n}\n\n.tao-list-item--s {\n min-height: 32px;\n padding: 0 var(--tao-space-1) 0 var(--tao-space-2);\n}\n\n.tao-list-item--m {\n min-height: 36px;\n padding: 0 var(--tao-space-2) 0 var(--tao-space-3);\n}\n\n.tao-list-item--l {\n min-height: 48px;\n padding: var(--tao-space-1) var(--tao-space-2) var(--tao-space-1) var(--tao-space-3);\n}\n\n.tao-list-item:hover:not(.tao-list-item--disabled),\n.tao-list-item--active:not(.tao-list-item--disabled) {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-list-item--selected {\n background: var(--tao-color-accent-subtle);\n}\n\n.tao-list-item--selected:hover:not(.tao-list-item--disabled),\n.tao-list-item--selected.tao-list-item--active:not(.tao-list-item--disabled) {\n background: var(--tao-color-accent-subtle-hover);\n}\n\n.tao-list-item--disabled {\n opacity: 0.5;\n}\n\n.tao-list-item__hit {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n flex: 1 1 auto;\n min-width: 0;\n margin: 0;\n padding: var(--tao-space-2) 0;\n border: none;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n}\n\n.tao-list-item--s .tao-list-item__hit {\n padding: var(--tao-space-1) 0;\n gap: var(--tao-space-2);\n}\n\n.tao-list-item--l .tao-list-item__hit {\n padding: var(--tao-space-2) 0;\n}\n\nbutton.tao-list-item__hit {\n cursor: pointer;\n}\n\nbutton.tao-list-item__hit:disabled {\n cursor: not-allowed;\n}\n\nbutton.tao-list-item__hit:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: -2px;\n}\n\n.tao-list-item__prefix {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n color: var(--tao-color-text-muted);\n}\n\n.tao-list-item__prefix :deep(.tao-avatar) {\n display: block;\n}\n\n.tao-list-item__text {\n display: flex;\n flex-direction: column;\n gap: 1px;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.tao-list-item__title {\n min-width: 0;\n overflow: hidden;\n font-size: var(--tao-font-size-md);\n line-height: 1.3;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tao-list-item--s .tao-list-item__title {\n font-size: var(--tao-font-size-sm);\n}\n\n.tao-list-item--selected .tao-list-item__title {\n color: var(--tao-color-accent);\n}\n\n.tao-list-item--clickable .tao-list-item__title {\n user-select: none;\n}\n\n.tao-list-item__description {\n min-width: 0;\n overflow: hidden;\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-xs);\n line-height: 1.3;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tao-list-item__suffix {\n flex-shrink: 0;\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-xs);\n white-space: nowrap;\n}\n\n.tao-list-item__action {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n}\n\n@media (hover: hover) {\n .tao-list-item--has-action:not(.tao-list-item--action-always) .tao-list-item__action {\n opacity: 0;\n }\n\n .tao-list-item--has-action:not(.tao-list-item--action-always):hover .tao-list-item__action,\n .tao-list-item--has-action:not(.tao-list-item--action-always):focus-within .tao-list-item__action {\n opacity: 1;\n }\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';\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\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 previousFocus: HTMLElement | null = null;\nlet scrollHeld = false;\n\nfunction close() {\n if (!props.closable) {\n return;\n }\n emit('update:modelValue', false);\n emit('close');\n}\n\nfunction holdScroll() {\n if (scrollHeld || !isBrowser()) {\n return;\n }\n lockBodyScroll();\n scrollHeld = true;\n}\n\nfunction releaseScroll() {\n if (!scrollHeld) {\n return;\n }\n unlockBodyScroll();\n scrollHeld = 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 if (!props.closable) {\n return;\n }\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 (!isBrowser()) {\n return;\n }\n\n if (isOpen) {\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n holdScroll();\n void focusPanel();\n return;\n }\n releaseScroll();\n restoreFocus();\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n releaseScroll();\n restoreFocus();\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\">×</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, ref, watch } 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\nconst imgFailed = ref(false);\nconst showImage = computed(() => Boolean(props.src) && !imgFailed.value);\n\nwatch(\n () => props.src,\n () => {\n imgFailed.value = false;\n },\n);\n\nfunction onImgError() {\n imgFailed.value = true;\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=\"showImage\" class=\"tao-avatar__img\" :src=\"src\" :alt=\"label\" @error=\"onImgError\" />\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 const last = Math.max(total - step.value, 0);\n return Math.min(Math.max(Math.round(left / (width + gap)), 0), last);\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 (props.loop || index.value < lastIndex.value)\n );\n}\n\nfunction tickAutoplay() {\n if (!canAutoplay()) {\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 const next = nearestIndex();\n const { width, gap } = metrics();\n const el = track.value;\n if (el && width > 0 && el.scrollLeft - next * (width + gap) > (width + gap) / 2) {\n goTo(next, true);\n return;\n }\n setIndex(next);\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, index.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 ×\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';\nimport { trapTab } from '../focusTrap';\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\n\ndefineOptions({ name: 'TaoConfirmHost' });\n\nconst panelRef = ref<HTMLElement | null>(null);\nlet previousFocus: HTMLElement | null = null;\nlet scrollHeld = false;\n\nonMounted(() => {\n registerConfirmHost();\n});\n\nonBeforeUnmount(() => {\n releaseScroll();\n unregisterConfirmHost();\n});\n\nwatch(\n () => currentConfirm.value?.id,\n async (id) => {\n if (!id) {\n releaseScroll();\n restoreFocus();\n return;\n }\n\n if (!isBrowser()) {\n return;\n }\n\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n holdScroll();\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 holdScroll() {\n if (scrollHeld || !isBrowser()) {\n return;\n }\n lockBodyScroll();\n scrollHeld = true;\n}\n\nfunction releaseScroll() {\n if (!scrollHeld) {\n return;\n }\n unlockBodyScroll();\n scrollHeld = 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 (panelRef.value) {\n trapTab(event, panelRef.value);\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 TaoGrid from './components/TaoGrid.vue';\nimport TaoGridItem from './components/TaoGridItem.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 TaoList from './components/TaoList.vue';\nimport TaoListItem from './components/TaoListItem.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 TaoGrid,\n TaoGridItem,\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 TaoList,\n TaoListItem,\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 TaoGrid,\n TaoGridItem,\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 TaoList,\n TaoListItem,\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';\nexport type { TaoListSize } from './list';\n\nexport default TaoUI;\n"],"names":["_createElementBlock","_openBlock","_hoisted_2","_hoisted_3","_toDisplayString","_createElementVNode","_hoisted_4","_renderSlot","_normalizeClass","_normalizeStyle","_hoisted_1","_unref","$slots","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_createBlock","_Teleport","_createVNode","_Transition","_Fragment","_renderList","_createTextVNode","_resolveDynamicComponent","nextPx","value","_hoisted_10","_mergeProps","onInput","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","TaoLink","_TransitionGroup","toast","viewportMounts","isClient","hostedApp","createDraft","createBuilder","TaoFlex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/components/TaoButton.vue","../src/components/TaoBlock.vue","../src/formField.ts","../src/components/TaoInput.vue","../src/components/TaoInputGroup.vue","../src/components/TaoInputNumber.vue","../src/components/TaoQuantity.vue","../src/components/TaoCard.vue","../src/focusTrap.ts","../src/bodyScroll.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/TaoGrid.vue","../src/components/TaoGridItem.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/list.ts","../src/components/TaoList.vue","../src/components/TaoListItem.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","let locks = 0;\nlet previousOverflow = '';\n\nexport function isBrowser() {\n return typeof document !== 'undefined';\n}\n\nexport function lockBodyScroll() {\n if (!isBrowser()) {\n return;\n }\n\n if (locks === 0) {\n previousOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n locks += 1;\n}\n\nexport function unlockBodyScroll() {\n if (!isBrowser() || locks === 0) {\n return;\n }\n\n locks -= 1;\n if (locks === 0) {\n document.body.style.overflow = previousOverflow;\n previousOverflow = '';\n }\n}\n","<script lang=\"ts\" setup>\nimport { nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\nimport { getFocusable, trapTab } from '../focusTrap';\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\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 previousFocus: HTMLElement | null = null;\nlet scrollHeld = false;\n\nfunction close() {\n if (!props.closable) {\n return;\n }\n emit('update:modelValue', false);\n emit('close');\n}\n\nfunction holdScroll() {\n if (scrollHeld || !isBrowser()) {\n return;\n }\n lockBodyScroll();\n scrollHeld = true;\n}\n\nfunction releaseScroll() {\n if (!scrollHeld) {\n return;\n }\n unlockBodyScroll();\n scrollHeld = 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 if (!props.closable) {\n return;\n }\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 (!isBrowser()) {\n return;\n }\n\n if (isOpen) {\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n holdScroll();\n void focusPanel();\n return;\n }\n releaseScroll();\n restoreFocus();\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n releaseScroll();\n restoreFocus();\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\">×</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\nfunction bindDismiss() {\n if (typeof document === 'undefined') {\n return;\n }\n\n document.addEventListener('pointerdown', onDocumentPointer);\n document.addEventListener('keydown', onDocumentKey);\n window.addEventListener('resize', onViewportChange);\n window.addEventListener('scroll', onViewportChange, true);\n}\n\nfunction unbindDismiss() {\n if (typeof document === 'undefined') {\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\nfunction applyOpen(next: boolean) {\n setOpen(next);\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 (typeof window === 'undefined' || !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(\n open,\n (isOpen) => {\n if (isOpen) {\n bindDismiss();\n void nextTick(() => {\n updatePosition();\n panelRef.value?.focus();\n });\n return;\n }\n\n unbindDismiss();\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n unbindDismiss();\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, ref } from 'vue';\nimport { spoilerGroupKey, type TaoSpoilerName } from '../spoiler';\n\ndefineOptions({ name: 'TaoSpoilerGroup' });\n\nconst props = defineProps<{\n modelValue?: TaoSpoilerName | null;\n}>();\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TaoSpoilerName | null];\n change: [value: TaoSpoilerName | null];\n}>();\n\nconst isControlled = computed(() => props.modelValue !== undefined);\nconst internal = ref<TaoSpoilerName | null>(null);\nconst model = computed(() => (isControlled.value ? props.modelValue : internal.value));\n\nfunction setOpen(name: TaoSpoilerName | null) {\n if (!isControlled.value) {\n internal.value = name;\n }\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 } from 'vue';\n\ndefineOptions({ name: 'TaoGrid' });\n\nconst props = withDefaults(\n defineProps<{\n /** Минимальная ширина плитки (auto-fill). Каталог. Игнорируется, если задан cols. */\n min?: string;\n /** Фиксированное число колонок (bento). 0 — режим min. */\n cols?: number;\n gap?: string;\n }>(),\n {\n min: '220px',\n cols: 0,\n gap: 'var(--tao-space-4)',\n },\n);\n\nconst isFixed = computed(() => props.cols > 0);\n\nconst gridStyle = computed(() => ({\n '--tao-grid-min': props.min,\n '--tao-grid-cols': isFixed.value ? String(props.cols) : undefined,\n '--tao-grid-gap': props.gap,\n}));\n</script>\n\n<template>\n <div\n class=\"tao-grid\"\n :class=\"{ 'tao-grid--fixed': isFixed }\"\n :style=\"gridStyle\"\n >\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-grid {\n container-type: inline-size;\n display: grid;\n grid-template-columns: repeat(\n auto-fill,\n minmax(min(100%, var(--tao-grid-min, 220px)), 1fr)\n );\n gap: var(--tao-grid-gap, var(--tao-space-4));\n}\n\n.tao-grid--fixed {\n grid-template-columns: repeat(var(--tao-grid-cols), minmax(0, 1fr));\n}\n\n@container (max-width: 560px) {\n .tao-grid--fixed {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'TaoGridItem' });\n\nconst props = withDefaults(\n defineProps<{\n /** Сколько колонок занять. Для bento (`cols`), не для каталога (`min`). */\n col?: number;\n row?: number;\n }>(),\n {\n col: 1,\n row: 1,\n },\n);\n\nconst itemStyle = computed(() => ({\n '--tao-grid-col': String(Math.max(1, props.col)),\n '--tao-grid-row': String(Math.max(1, props.row)),\n}));\n</script>\n\n<template>\n <div class=\"tao-grid-item\" :style=\"itemStyle\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.tao-grid-item {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n grid-column: span var(--tao-grid-col, 1);\n grid-row: span var(--tao-grid-row, 1);\n}\n\n.tao-grid-item > * {\n flex: 1 1 auto;\n min-height: 0;\n width: 100%;\n}\n\n@container (max-width: 560px) {\n .tao-grid-item {\n grid-column: span 1;\n grid-row: span 1;\n }\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);\nconst hasError = ref(false);\n\nfunction handleLoad() {\n isLoaded.value = true;\n hasError.value = false;\n emit('load');\n}\n\nfunction handleError() {\n isLoaded.value = false;\n hasError.value = true;\n emit('error');\n}\n\nwatch(() => props.src, () => {\n isLoaded.value = false;\n hasError.value = false;\n});\n</script>\n\n<template>\n <div class=\"tao-image\">\n <img\n v-if=\"src && !hasError\"\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 v-if=\"!src || hasError\">\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 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-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 font-size: var(--tao-font-size-xs);\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, useSlots } from 'vue';\n\ndefineOptions({ name: 'TaoDivider' });\n\nconst props = withDefaults(\n defineProps<{\n /** `solid` — обычная линия. `dashed` — пунктир. `colored` — акцент. `gap` — пустой отступ. */\n variant?: 'solid' | 'dashed' | 'colored' | 'gap';\n size?: 'small' | 'medium' | 'large' | 'big';\n /** Подпись посередине. Не меняет стиль линии — для этого `variant`. */\n text?: string;\n /** Плавные края линии. У `gap` ничего не делает. */\n fade?: boolean;\n }>(),\n {\n variant: 'solid',\n size: 'medium',\n text: '',\n fade: false,\n },\n);\n\nconst slots = useSlots();\nconst gapSize = computed(() => (props.size === 'big' ? 'large' : props.size));\nconst hasLabel = computed(() => Boolean(props.text) || Boolean(slots.default));\n</script>\n\n<template>\n <div\n class=\"tao-divider\"\n :class=\"[\n `tao-divider--${variant}`,\n {\n 'tao-divider--labeled': hasLabel,\n 'tao-divider--fade': fade && variant !== 'gap',\n [`tao-divider--gap-${gapSize}`]: variant === 'gap',\n },\n ]\"\n :role=\"variant === 'gap' && !hasLabel ? undefined : 'separator'\"\n :aria-hidden=\"variant === 'gap' && !hasLabel ? true : undefined\"\n >\n <span\n v-if=\"variant !== 'gap'\"\n class=\"tao-divider__line\"\n :class=\"{ 'tao-divider__line--start': hasLabel }\"\n />\n <span v-if=\"hasLabel\" class=\"tao-divider__text\">\n <slot>{{ text }}</slot>\n </span>\n <span\n v-if=\"variant !== 'gap' && hasLabel\"\n class=\"tao-divider__line tao-divider__line--end\"\n />\n </div>\n</template>\n\n<style scoped>\n.tao-divider {\n margin: var(--tao-space-5) 0;\n}\n\n.tao-divider--labeled {\n display: flex;\n align-items: center;\n}\n\n.tao-divider__line {\n box-sizing: content-box;\n display: block;\n height: 0;\n min-width: 0;\n}\n\n.tao-divider--labeled .tao-divider__line {\n flex: 1;\n}\n\n.tao-divider:not(.tao-divider--labeled) .tao-divider__line {\n width: 100%;\n}\n\n.tao-divider__text {\n margin: 0 var(--tao-space-4);\n font-size: var(--tao-font-size-xs);\n font-weight: 500;\n line-height: 1;\n white-space: nowrap;\n color: var(--tao-color-text-muted);\n}\n\n.tao-divider--labeled:not(.tao-divider--gap) .tao-divider__text {\n height: 1px;\n display: flex;\n align-items: center;\n overflow: visible;\n}\n\n.tao-divider--solid .tao-divider__line {\n border-top: 1px solid var(--tao-color-border);\n}\n\n.tao-divider--dashed .tao-divider__line {\n border-top: 1px dashed var(--tao-color-border-strong);\n opacity: 0.45;\n}\n\n.tao-divider--colored .tao-divider__line {\n height: 1px;\n background: var(--tao-color-accent);\n}\n\n.tao-divider--colored.tao-divider--fade:not(.tao-divider--labeled) .tao-divider__line {\n background: linear-gradient(to right, transparent, var(--tao-color-accent), transparent);\n}\n\n.tao-divider--colored.tao-divider--fade.tao-divider--labeled .tao-divider__line--start {\n background: linear-gradient(to right, transparent, var(--tao-color-accent));\n}\n\n.tao-divider--colored.tao-divider--fade.tao-divider--labeled .tao-divider__line--end {\n background: linear-gradient(to left, transparent, var(--tao-color-accent));\n}\n\n.tao-divider--fade:not(.tao-divider--colored):not(.tao-divider--labeled) .tao-divider__line {\n mask: linear-gradient(90deg, transparent 0%, black 20%, black 80%, transparent 100%);\n}\n\n.tao-divider--fade:not(.tao-divider--colored) .tao-divider__line--start {\n mask: linear-gradient(90deg, transparent 0%, black 30%);\n}\n\n.tao-divider--fade:not(.tao-divider--colored) .tao-divider__line--end {\n mask: linear-gradient(90deg, black 70%, transparent 100%);\n}\n\n.tao-divider--gap {\n margin: 0;\n}\n\n.tao-divider--gap:not(.tao-divider--labeled) {\n height: 40px;\n}\n\n.tao-divider--gap-small:not(.tao-divider--labeled) {\n height: 20px;\n}\n\n.tao-divider--gap-large:not(.tao-divider--labeled),\n.tao-divider--gap-big:not(.tao-divider--labeled) {\n height: 60px;\n}\n\n.tao-divider--gap.tao-divider--labeled {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 40px;\n}\n\n.tao-divider--gap-small.tao-divider--labeled {\n min-height: 20px;\n}\n\n.tao-divider--gap-large.tao-divider--labeled,\n.tao-divider--gap-big.tao-divider--labeled {\n min-height: 60px;\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 acceptTokens(accept: string) {\n return accept\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean);\n}\n\nfunction fileMatchesAccept(file: File, accept: string) {\n const tokens = acceptTokens(accept);\n if (!tokens.length || tokens.includes('*') || tokens.includes('*/*')) {\n return true;\n }\n\n const name = file.name.toLowerCase();\n const mime = (file.type || '').toLowerCase();\n const dot = name.lastIndexOf('.');\n const ext = dot >= 0 ? name.slice(dot) : '';\n\n return tokens.some((token) => {\n if (token.startsWith('.')) {\n return ext === token;\n }\n if (token.endsWith('/*')) {\n return mime.startsWith(token.slice(0, -1));\n }\n return mime === token;\n });\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 resetInput() {\n const el = fileInput.value;\n if (el) {\n el.type = 'text';\n el.type = 'file';\n }\n}\n\nfunction processFiles(fileList: FileList) {\n const incoming = Array.from(fileList).filter((file) => fileMatchesAccept(file, props.accept));\n if (!incoming.length) {\n resetInput();\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 resetInput();\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 :aria-label=\"$slots.button ? undefined : menuLabel\"\n @click=\"toggleMenu\"\n >\n <slot v-if=\"$slots.button\" name=\"button\" />\n <span v-else aria-hidden=\"true\">\n <slot name=\"icon\">⋮</slot>\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 position: relative;\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)::after {\n content: '';\n position: absolute;\n right: var(--tao-space-2);\n bottom: 0;\n left: var(--tao-space-2);\n height: 1px;\n background: var(--tao-color-border);\n pointer-events: none;\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 applyChars(index: number, raw: string) {\n const chars = [...raw].map((ch) => acceptChar(ch)).filter(Boolean);\n if (!chars.length) {\n return;\n }\n\n numbers.value = [...numbers.value];\n let cursor = index;\n for (const ch of chars) {\n if (cursor >= props.length) {\n break;\n }\n numbers.value[cursor] = ch;\n cursor += 1;\n }\n emitChange();\n\n if (isFilled()) {\n inputRefs.value[index]?.blur();\n emit('complete', serialize());\n return;\n }\n\n if (cursor < props.length) {\n focusCell(cursor);\n }\n}\n\nfunction mutation(v: string, index: number) {\n if (v.length > 1) {\n applyChars(index, v);\n return;\n }\n\n const next = acceptChar(v);\n\n if (props.numbersOnly && v && !next) {\n const el = inputRefs.value[index];\n if (el) {\n el.value = numbers.value[index] ?? '';\n }\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 onPaste(event: ClipboardEvent, index: number) {\n const text = event.clipboardData?.getData('text') ?? '';\n if (!text) {\n return;\n }\n\n event.preventDefault();\n applyChars(index, text);\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=\"index === 0 ? length : 1\"\n @input=\"onChange($event, index)\"\n @paste=\"onPaste($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 labelId = `${id}-label`;\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\nfunction onLabelClick() {\n const target = document.getElementById(id);\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLButtonElement ||\n target instanceof HTMLSelectElement ||\n target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n\n const scope = target ?? document.getElementById(labelId)?.parentElement;\n scope\n ?.querySelector<HTMLElement>(\n 'input:not([disabled]), button:not([disabled]), textarea:not([disabled]), select:not([disabled])',\n )\n ?.focus();\n}\n</script>\n\n<template>\n <div class=\"tao-form-field\" :class=\"{ 'tao-form-field--invalid': invalid }\">\n <label v-if=\"label\" :id=\"labelId\" class=\"tao-form-field__label\" :for=\"id\" @click=\"onLabelClick\">{{ 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 panelWidth = panel.offsetWidth || rect.width;\n const gap = 4;\n const pad = 8;\n const spaceBelow = window.innerHeight - rect.bottom - gap;\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\n const maxLeft = Math.max(pad, window.innerWidth - panelWidth - pad);\n const left = Math.min(Math.max(rect.left, pad), maxLeft);\n\n listStyle.value = {\n top: `${openUp ? rect.top - panelHeight - gap : rect.bottom + gap}px`,\n left: `${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 =\n selectedIndex >= 0 && enabledIndexes.value.includes(selectedIndex)\n ? selectedIndex\n : (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 panelWidth = panel.offsetWidth || rect.width;\n const gap = 4;\n const pad = 8;\n const spaceBelow = window.innerHeight - rect.bottom - gap;\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\n const maxLeft = Math.max(pad, window.innerWidth - panelWidth - pad);\n const left = Math.min(Math.max(rect.left, pad), maxLeft);\n\n listStyle.value = {\n top: `${openUp ? rect.top - panelHeight - gap : rect.bottom + gap}px`,\n left: `${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 @click=\"clear\"\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 monthStart = new Date(parts.y, parts.m - 1 + months, 1);\n const y = monthStart.getFullYear();\n const m = monthStart.getMonth() + 1;\n const lastDay = new Date(y, m, 0).getDate();\n return formatTaoDateIso({ y, m, d: Math.min(parts.d, lastDay) });\n}\n\nexport function clampTaoDateCursor(iso: string, min?: string, max?: string): string {\n if (isTaoDateInRange(iso, min, max)) {\n return iso;\n }\n\n if (min && parseTaoDate(min) && iso < min) {\n return min;\n }\n\n if (max && parseTaoDate(max) && iso > max) {\n return max;\n }\n\n return iso;\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 clampTaoDateCursor,\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(clampTaoDateCursor(valueIso.value ?? todayIso.value, props.min, props.max));\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 cursorIso.value = clampTaoDateCursor(shiftTaoMonth(cursorIso.value, delta), props.min, props.max);\n syncViewFrom(cursorIso.value);\n void nextTick(updatePosition);\n}\n\nfunction moveCursor(days: number) {\n const next = shiftTaoDate(cursorIso.value, days);\n cursorIso.value = isTaoDateInRange(next, props.min, props.max)\n ? next\n : clampTaoDateCursor(next, props.min, props.max);\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 clampTaoDateCursor,\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(clampTaoDateCursor(committed.value?.start ?? todayIso.value, props.min, props.max));\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 cursorIso.value = clampTaoDateCursor(shiftTaoMonth(cursorIso.value, delta), props.min, props.max);\n syncViewFrom(cursorIso.value);\n void nextTick(updatePosition);\n}\n\nfunction moveCursor(days: number) {\n hoverIso.value = null;\n const next = shiftTaoDate(cursorIso.value, days);\n cursorIso.value = isTaoDateInRange(next, props.min, props.max)\n ? next\n : clampTaoDateCursor(next, props.min, props.max);\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);\nconst invalid = computed(() => Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\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, 'tao-switch--invalid': invalid }\" :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 :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\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\n.tao-switch--invalid .tao-switch__track {\n border-color: var(--tao-color-danger);\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 { formFieldKey } from '../formField';\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 field = inject(formFieldKey, null);\nconst localId = useId();\nconst controlId = computed(() => (group ? localId : (field?.id ?? localId)));\nconst invalid = computed(() => Boolean(field?.invalid.value));\nconst describedBy = computed(() => (group ? undefined : field?.describedBy.value));\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, 'tao-radio--invalid': invalid && !group }\" :for=\"controlId\">\n <input\n :id=\"controlId\"\n class=\"tao-radio__input\"\n type=\"radio\"\n :name=\"inputName\"\n :value=\"String(value)\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled\"\n :aria-invalid=\"(!group && invalid) || undefined\"\n :aria-describedby=\"describedBy\"\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\n.tao-radio--invalid .tao-radio__dot {\n border-color: var(--tao-color-danger);\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, provide, useId } from 'vue';\nimport { formFieldKey } from '../formField';\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 field = inject(formFieldKey, null);\nconst autoName = useId();\nconst groupName = computed(() => props.name || autoName);\nconst model = computed(() => props.modelValue);\nconst groupDisabled = computed(() => props.disabled);\nconst invalid = computed(() => Boolean(field?.invalid.value));\nconst describedBy = computed(() => field?.describedBy.value);\nconst labelledBy = computed(() => (props.legend || !field ? undefined : `${field.id}-label`));\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\n :id=\"field?.id\"\n class=\"tao-radio-group\"\n :class=\"[`tao-radio-group--${direction}`, { 'tao-radio-group--invalid': invalid }]\"\n :disabled=\"disabled\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"invalid || undefined\"\n :aria-labelledby=\"labelledBy\"\n >\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\n.tao-radio-group--invalid :deep(.tao-radio__dot) {\n border-color: var(--tao-color-danger);\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 :aria-labelledby=\"legend ? undefined : (field ? `${field.id}-label` : undefined)\"\n :id=\"field?.id\"\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\">×</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 /** Зебра. `true` / `odd` — с первой строки, `even` — со второй. */\n striped?: boolean | 'odd' | 'even';\n compact?: boolean;\n hover?: boolean;\n /** Подсветка шапки. */\n head?: boolean;\n /** Горизонтальные линии между рядами. */\n lines?: 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 head: true,\n lines: 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);\nconst stripeFrom = computed(() => {\n if (props.striped === 'even') {\n return 'even';\n }\n if (props.striped === 'odd' || props.striped === true) {\n return 'odd';\n }\n return null;\n});\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': stripeFrom === 'odd',\n 'tao-table--striped-even': stripeFrom === 'even',\n 'tao-table--compact': compact,\n 'tao-table--hover': hover,\n 'tao-table--head': head,\n 'tao-table--lines': lines,\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 vertical-align: middle;\n}\n\n.tao-table--lines th,\n.tao-table--lines td {\n border-bottom: 1px solid var(--tao-color-border);\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 white-space: nowrap;\n text-align: left;\n}\n\n.tao-table--head th {\n background: var(--tao-color-surface-raised);\n}\n\n.tao-table--sticky thead th {\n position: sticky;\n top: 0;\n z-index: 1;\n background: var(--tao-color-surface);\n}\n\n.tao-table--sticky.tao-table--head thead th {\n background: var(--tao-color-surface-raised);\n}\n\n.tao-table--lines tbody tr:last-child td {\n border-bottom: none;\n}\n\n.tao-table--striped tbody tr:nth-child(odd) td {\n background: var(--tao-color-surface-sunken);\n}\n\n.tao-table--striped-even 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(\n () => [props.page, pageCount.value] as const,\n ([page, count]) => {\n if (page > count || page < 1) {\n goTo(page);\n }\n },\n { immediate: true },\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","import type { ComputedRef, InjectionKey } from 'vue';\n\nexport type TaoListSize = 'small' | 'medium' | 'large';\n\nexport interface TaoListContext {\n size: ComputedRef<TaoListSize>;\n}\n\nexport const taoListKey: InjectionKey<TaoListContext> = Symbol('taoList');\n","<script lang=\"ts\" setup>\nimport { computed, provide } from 'vue';\nimport { taoListKey, type TaoListSize } from '../list';\n\ndefineOptions({ name: 'TaoList' });\n\nconst props = withDefaults(\n defineProps<{\n size?: TaoListSize;\n /** Рамка, как у списка файлов. */\n bordered?: boolean;\n /** Линии между строками. */\n divided?: boolean;\n /** Скролл, если строки не влезают. Число — пиксели. */\n maxHeight?: number | string;\n /** Показать `#empty` вместо строк. */\n empty?: boolean;\n ariaLabel?: string;\n }>(),\n {\n size: 'medium',\n bordered: true,\n divided: true,\n empty: false,\n ariaLabel: '',\n },\n);\n\nconst size = computed(() => props.size);\nprovide(taoListKey, { size });\n\nconst listStyle = computed(() => {\n if (props.maxHeight === undefined || props.maxHeight === '') {\n return undefined;\n }\n const value = typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight;\n return { maxHeight: value };\n});\n</script>\n\n<template>\n <ul\n class=\"tao-list\"\n :class=\"[\n `tao-list--${size}`,\n {\n 'tao-list--bordered': bordered,\n 'tao-list--divided': divided,\n 'tao-list--plain': !bordered,\n 'tao-list--empty': empty,\n 'tao-list--scroll': Boolean(maxHeight),\n },\n ]\"\n :style=\"listStyle\"\n :aria-label=\"ariaLabel || undefined\"\n >\n <li v-if=\"empty\" class=\"tao-list__empty\">\n <slot name=\"empty\">Ничего нет</slot>\n </li>\n <slot v-else />\n </ul>\n</template>\n\n<style scoped>\n.tao-list {\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n padding: 0;\n list-style: none;\n background: var(--tao-color-surface-raised);\n color: var(--tao-color-text);\n}\n\n.tao-list--bordered {\n overflow: hidden;\n border: 1px solid var(--tao-color-border);\n border-radius: var(--tao-radius-control);\n}\n\n.tao-list--plain {\n padding: var(--tao-space-1);\n background: transparent;\n}\n\n.tao-list--scroll {\n overflow: auto;\n}\n\n.tao-list--divided :deep(.tao-list-item:not(:last-child)) {\n border-bottom: 1px solid var(--tao-color-border);\n}\n\n.tao-list--plain :deep(.tao-list-item) {\n border-radius: var(--tao-radius-sm);\n}\n\n.tao-list__empty {\n margin: 0;\n padding: var(--tao-space-3);\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-sm);\n line-height: 1.45;\n text-align: center;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, inject, useSlots } from 'vue';\nimport { taoListKey, type TaoListSize } from '../list';\n\ndefineOptions({ name: 'TaoListItem' });\n\nconst props = withDefaults(\n defineProps<{\n title?: string;\n description?: string;\n selected?: boolean;\n disabled?: boolean;\n /** Подсветка без selected — курсор / клавиатура. */\n active?: boolean;\n /** Строка-кнопка: Enter/Space, курсор pointer. */\n clickable?: boolean;\n size?: TaoListSize;\n /** `#action` всегда на виду, не только по ховеру. */\n actionAlways?: boolean;\n }>(),\n {\n title: '',\n description: '',\n selected: false,\n disabled: false,\n active: false,\n clickable: false,\n actionAlways: false,\n },\n);\n\nconst emit = defineEmits<{\n click: [event: MouseEvent];\n}>();\n\nconst slots = useSlots();\nconst list = inject(taoListKey, null);\n\nconst sizeClass = computed(() => {\n const size: TaoListSize = props.size ?? list?.size.value ?? 'medium';\n if (size === 'small') {\n return 's';\n }\n if (size === 'large') {\n return 'l';\n }\n return 'm';\n});\n\nconst hasAction = computed(() => Boolean(slots.action));\nconst hasPrefix = computed(() => Boolean(slots.prefix));\nconst hasSuffix = computed(() => Boolean(slots.suffix));\nconst hasDescription = computed(() => Boolean(props.description || slots.description));\n\nfunction onHitClick(event: MouseEvent) {\n if (props.disabled || !props.clickable) {\n return;\n }\n emit('click', event);\n}\n</script>\n\n<template>\n <li\n class=\"tao-list-item\"\n :class=\"[\n `tao-list-item--${sizeClass}`,\n {\n 'tao-list-item--selected': selected,\n 'tao-list-item--disabled': disabled,\n 'tao-list-item--active': active,\n 'tao-list-item--clickable': clickable,\n 'tao-list-item--has-action': hasAction,\n 'tao-list-item--action-always': actionAlways,\n },\n ]\"\n :aria-current=\"!clickable && selected ? 'true' : undefined\"\n :aria-disabled=\"disabled || undefined\"\n >\n <component\n :is=\"clickable ? 'button' : 'div'\"\n class=\"tao-list-item__hit\"\n :type=\"clickable ? 'button' : undefined\"\n :disabled=\"clickable ? disabled : undefined\"\n :aria-current=\"clickable && selected ? 'true' : undefined\"\n @click=\"onHitClick\"\n >\n <span v-if=\"hasPrefix\" class=\"tao-list-item__prefix\">\n <slot name=\"prefix\" />\n </span>\n <span class=\"tao-list-item__text\">\n <span class=\"tao-list-item__title\">\n <slot>{{ title }}</slot>\n </span>\n <span v-if=\"hasDescription\" class=\"tao-list-item__description\">\n <slot name=\"description\">{{ description }}</slot>\n </span>\n </span>\n <span v-if=\"hasSuffix\" class=\"tao-list-item__suffix\">\n <slot name=\"suffix\" />\n </span>\n </component>\n <div\n v-if=\"hasAction\"\n class=\"tao-list-item__action\"\n @click.stop\n @keydown.stop\n >\n <slot name=\"action\" />\n </div>\n </li>\n</template>\n\n<style scoped>\n.tao-list-item {\n display: flex;\n align-items: center;\n gap: var(--tao-space-1);\n min-width: 0;\n color: var(--tao-color-text);\n transition: background var(--tao-duration-fast) var(--tao-ease-base);\n}\n\n.tao-list-item--s {\n min-height: 32px;\n padding: 0 var(--tao-space-1) 0 var(--tao-space-2);\n}\n\n.tao-list-item--m {\n min-height: 36px;\n padding: 0 var(--tao-space-2) 0 var(--tao-space-3);\n}\n\n.tao-list-item--l {\n min-height: 48px;\n padding: var(--tao-space-1) var(--tao-space-2) var(--tao-space-1) var(--tao-space-3);\n}\n\n.tao-list-item:hover:not(.tao-list-item--disabled),\n.tao-list-item--active:not(.tao-list-item--disabled) {\n background: var(--tao-color-surface-hover);\n}\n\n.tao-list-item--selected {\n background: var(--tao-color-accent-subtle);\n}\n\n.tao-list-item--selected:hover:not(.tao-list-item--disabled),\n.tao-list-item--selected.tao-list-item--active:not(.tao-list-item--disabled) {\n background: var(--tao-color-accent-subtle-hover);\n}\n\n.tao-list-item--disabled {\n opacity: 0.5;\n}\n\n.tao-list-item__hit {\n display: flex;\n align-items: center;\n gap: var(--tao-space-2);\n flex: 1 1 auto;\n min-width: 0;\n margin: 0;\n padding: var(--tao-space-2) 0;\n border: none;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n}\n\n.tao-list-item--s .tao-list-item__hit {\n padding: var(--tao-space-1) 0;\n gap: var(--tao-space-2);\n}\n\n.tao-list-item--l .tao-list-item__hit {\n padding: var(--tao-space-2) 0;\n}\n\nbutton.tao-list-item__hit {\n cursor: pointer;\n}\n\nbutton.tao-list-item__hit:disabled {\n cursor: not-allowed;\n}\n\nbutton.tao-list-item__hit:focus-visible {\n outline: 2px solid var(--tao-color-accent);\n outline-offset: -2px;\n}\n\n.tao-list-item__prefix {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n color: var(--tao-color-text-muted);\n}\n\n.tao-list-item__prefix :deep(.tao-avatar) {\n display: block;\n}\n\n.tao-list-item__text {\n display: flex;\n flex-direction: column;\n gap: 1px;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.tao-list-item__title {\n min-width: 0;\n overflow: hidden;\n font-size: var(--tao-font-size-md);\n line-height: 1.3;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tao-list-item--s .tao-list-item__title {\n font-size: var(--tao-font-size-sm);\n}\n\n.tao-list-item--selected .tao-list-item__title {\n color: var(--tao-color-accent);\n}\n\n.tao-list-item--clickable .tao-list-item__title {\n user-select: none;\n}\n\n.tao-list-item__description {\n min-width: 0;\n overflow: hidden;\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-xs);\n line-height: 1.3;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tao-list-item__suffix {\n flex-shrink: 0;\n color: var(--tao-color-text-muted);\n font-size: var(--tao-font-size-xs);\n white-space: nowrap;\n}\n\n.tao-list-item__action {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n}\n\n@media (hover: hover) {\n .tao-list-item--has-action:not(.tao-list-item--action-always) .tao-list-item__action {\n opacity: 0;\n }\n\n .tao-list-item--has-action:not(.tao-list-item--action-always):hover .tao-list-item__action,\n .tao-list-item--has-action:not(.tao-list-item--action-always):focus-within .tao-list-item__action {\n opacity: 1;\n }\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';\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\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 previousFocus: HTMLElement | null = null;\nlet scrollHeld = false;\n\nfunction close() {\n if (!props.closable) {\n return;\n }\n emit('update:modelValue', false);\n emit('close');\n}\n\nfunction holdScroll() {\n if (scrollHeld || !isBrowser()) {\n return;\n }\n lockBodyScroll();\n scrollHeld = true;\n}\n\nfunction releaseScroll() {\n if (!scrollHeld) {\n return;\n }\n unlockBodyScroll();\n scrollHeld = 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 if (!props.closable) {\n return;\n }\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 (!isBrowser()) {\n return;\n }\n\n if (isOpen) {\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n holdScroll();\n void focusPanel();\n return;\n }\n releaseScroll();\n restoreFocus();\n },\n { immediate: true },\n);\n\nonBeforeUnmount(() => {\n releaseScroll();\n restoreFocus();\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\">×</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, ref, watch } 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\nconst imgFailed = ref(false);\nconst showImage = computed(() => Boolean(props.src) && !imgFailed.value);\n\nwatch(\n () => props.src,\n () => {\n imgFailed.value = false;\n },\n);\n\nfunction onImgError() {\n imgFailed.value = true;\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=\"showImage\" class=\"tao-avatar__img\" :src=\"src\" :alt=\"label\" @error=\"onImgError\" />\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 const last = Math.max(total - step.value, 0);\n return Math.min(Math.max(Math.round(left / (width + gap)), 0), last);\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 (props.loop || index.value < lastIndex.value)\n );\n}\n\nfunction tickAutoplay() {\n if (!canAutoplay()) {\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 const next = nearestIndex();\n const { width, gap } = metrics();\n const el = track.value;\n if (el && width > 0 && el.scrollLeft - next * (width + gap) > (width + gap) / 2) {\n goTo(next, true);\n return;\n }\n setIndex(next);\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, index.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 ×\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';\nimport { trapTab } from '../focusTrap';\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\n\ndefineOptions({ name: 'TaoConfirmHost' });\n\nconst panelRef = ref<HTMLElement | null>(null);\nlet previousFocus: HTMLElement | null = null;\nlet scrollHeld = false;\n\nonMounted(() => {\n registerConfirmHost();\n});\n\nonBeforeUnmount(() => {\n releaseScroll();\n unregisterConfirmHost();\n});\n\nwatch(\n () => currentConfirm.value?.id,\n async (id) => {\n if (!id) {\n releaseScroll();\n restoreFocus();\n return;\n }\n\n if (!isBrowser()) {\n return;\n }\n\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n holdScroll();\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 holdScroll() {\n if (scrollHeld || !isBrowser()) {\n return;\n }\n lockBodyScroll();\n scrollHeld = true;\n}\n\nfunction releaseScroll() {\n if (!scrollHeld) {\n return;\n }\n unlockBodyScroll();\n scrollHeld = 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 (panelRef.value) {\n trapTab(event, panelRef.value);\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 TaoGrid from './components/TaoGrid.vue';\nimport TaoGridItem from './components/TaoGridItem.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 TaoList from './components/TaoList.vue';\nimport TaoListItem from './components/TaoListItem.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 TaoGrid,\n TaoGridItem,\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 TaoList,\n TaoListItem,\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 TaoGrid,\n TaoGridItem,\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 TaoList,\n TaoListItem,\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';\nexport type { TaoListSize } from './list';\n\nexport default TaoUI;\n"],"names":["_createElementBlock","_openBlock","_hoisted_2","_hoisted_3","_toDisplayString","_createElementVNode","_hoisted_4","_renderSlot","_normalizeClass","_normalizeStyle","_hoisted_1","_unref","$slots","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_createBlock","_Teleport","_createVNode","_Transition","_Fragment","_renderList","_createTextVNode","_resolveDynamicComponent","nextPx","value","_hoisted_10","_mergeProps","onInput","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","TaoLink","_TransitionGroup","toast","viewportMounts","isClient","hostedApp","createDraft","createBuilder","TaoFlex"],"mappings":"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"}
|