@1337exp/taoui 1.11.6 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/components/TaoButton.vue","../src/components/TaoBlock.vue","../src/formField.ts","../src/components/TaoInput.vue","../src/components/TaoInputGroup.vue","../src/components/TaoInputNumber.vue","../src/components/TaoQuantity.vue","../src/components/TaoCard.vue","../src/focusTrap.ts","../src/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>\r\ndefineOptions({ name: 'TaoButton' });\r\n\r\ninterface Props {\r\n type?: 'button' | 'submit' | 'reset';\r\n size?: 'small' | 'medium' | 'large';\r\n variant?: 'primary' | 'secondary' | 'ghost' | 'text' | 'danger';\r\n /** Красит кнопку: danger / success / warning / info. Не вместо variant. */\r\n tone?: 'danger' | 'success' | 'warning' | 'info' | '';\r\n disabled?: boolean;\r\n loading?: boolean;\r\n block?: boolean;\r\n icon?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: 'button',\r\n size: 'medium',\r\n variant: 'primary',\r\n tone: '',\r\n disabled: false,\r\n loading: false,\r\n block: false,\r\n icon: '',\r\n});\r\n\r\nconst emit = defineEmits(['click']);\r\n\r\nfunction handleClick(event: MouseEvent) {\r\n if (!props.disabled && !props.loading) {\r\n emit('click', event);\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <button\r\n class=\"tao-button\"\r\n :class=\"[\r\n `tao-button--${size}`,\r\n `tao-button--${variant}`,\r\n {\r\n 'tao-button--disabled': disabled,\r\n 'tao-button--loading': loading,\r\n 'tao-button--block': block,\r\n 'tao-button--icon': !!icon,\r\n [`tao-button--tone-${tone}`]: !!tone,\r\n },\r\n ]\"\r\n :type=\"type\"\r\n :disabled=\"disabled || loading\"\r\n @click=\"handleClick\"\r\n >\r\n <span v-if=\"loading\" class=\"tao-button__loader\"></span>\r\n <span v-if=\"icon\" class=\"tao-button__icon\">{{ icon }}</span>\r\n <span class=\"tao-button__content\"><slot /></span>\r\n </button>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--tao-space-2);\r\n\r\n border: none;\r\n border-radius: var(--tao-radius-control);\r\n cursor: pointer;\r\n font-family: inherit;\r\n font-weight: 500;\r\n transition: var(--tao-transition-base);\r\n position: relative;\r\n}\r\n\r\n.tao-button:active:not(.tao-button--text) {\r\n transform: translateY(1px);\r\n}\r\n\r\n.tao-button:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-button--small {\r\n padding: var(--tao-space-1) var(--tao-space-3);\r\n font-size: var(--tao-font-size-xs);\r\n height: 26px;\r\n}\r\n\r\n.tao-button--medium {\r\n padding: var(--tao-space-2) var(--tao-space-4);\r\n font-size: var(--tao-font-size-md);\r\n height: 30px;\r\n}\r\n\r\n.tao-button--large {\r\n padding: var(--tao-space-2) var(--tao-space-6);\r\n font-size: var(--tao-font-size-lg);\r\n height: 38px;\r\n}\r\n\r\n.tao-button--primary {\r\n background-color: var(--tao-color-accent);\r\n color: var(--tao-color-on-accent);\r\n}\r\n\r\n.tao-button--primary:hover:not(.tao-button--disabled) {\r\n background-color: var(--tao-color-accent-hover);\r\n}\r\n\r\n.tao-button--secondary {\r\n background-color: var(--tao-color-surface-sunken);\r\n color: var(--tao-color-text);\r\n border: 1px solid var(--tao-color-border-strong);\r\n}\r\n\r\n.tao-button--secondary:hover:not(.tao-button--disabled) {\r\n background-color: var(--tao-color-surface-hover);\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-button--ghost {\r\n background-color: transparent;\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-button--ghost:hover:not(.tao-button--disabled) {\r\n background-color: var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-button--text {\r\n height: auto;\r\n padding: 2px 4px;\r\n background: transparent;\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-button--text.tao-button--small,\r\n.tao-button--text.tao-button--medium,\r\n.tao-button--text.tao-button--large {\r\n height: auto;\r\n padding: 2px 4px;\r\n}\r\n\r\n.tao-button--text:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-accent-hover);\r\n background-color: var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-button--danger {\r\n background-color: var(--tao-color-danger);\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-button--danger:hover:not(.tao-button--disabled) {\r\n background-color: var(--tao-color-danger-hover);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-danger,\r\n.tao-button--text.tao-button--tone-danger {\r\n color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-danger:hover:not(.tao-button--disabled),\r\n.tao-button--text.tao-button--tone-danger:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-danger-hover);\r\n background-color: var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-success,\r\n.tao-button--text.tao-button--tone-success {\r\n color: var(--tao-color-success);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-success:hover:not(.tao-button--disabled),\r\n.tao-button--text.tao-button--tone-success:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-success-hover);\r\n background-color: var(--tao-color-success-subtle);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-warning,\r\n.tao-button--text.tao-button--tone-warning {\r\n color: var(--tao-color-warning);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-warning:hover:not(.tao-button--disabled),\r\n.tao-button--text.tao-button--tone-warning:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-warning-hover);\r\n background-color: var(--tao-color-warning-subtle);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-info,\r\n.tao-button--text.tao-button--tone-info {\r\n color: var(--tao-color-info);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-info:hover:not(.tao-button--disabled),\r\n.tao-button--text.tao-button--tone-info:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-info-hover);\r\n background-color: var(--tao-color-info-subtle);\r\n}\r\n\r\n.tao-button--secondary.tao-button--tone-danger {\r\n color: var(--tao-color-danger);\r\n border-color: color-mix(in srgb, var(--tao-color-danger) 40%, transparent);\r\n}\r\n\r\n.tao-button--secondary.tao-button--tone-danger:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-danger-hover);\r\n background-color: var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-button--primary.tao-button--tone-danger,\r\n.tao-button--danger.tao-button--tone-danger {\r\n background-color: var(--tao-color-danger);\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-button--primary.tao-button--tone-danger:hover:not(.tao-button--disabled),\r\n.tao-button--danger.tao-button--tone-danger:hover:not(.tao-button--disabled) {\r\n background-color: var(--tao-color-danger-hover);\r\n}\r\n\r\n.tao-button--disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-button--block {\r\n width: 100%;\r\n}\r\n\r\n.tao-button--loading .tao-button__content {\r\n opacity: 0;\r\n}\r\n\r\n.tao-button__loader {\r\n position: absolute;\r\n width: 16px;\r\n height: 16px;\r\n border: 2px solid color-mix(in srgb, currentColor 15%, transparent);\r\n border-top-color: currentColor;\r\n border-radius: var(--tao-radius-full);\r\n animation: tao-spin 0.8s linear infinite;\r\n}\r\n\r\n.tao-button__icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n@keyframes tao-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoBlock' });\r\n\r\ninterface Props {\r\n padding?: number | number[];\r\n radius?: number;\r\n shadow?: boolean;\r\n hover?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n padding: 16,\r\n radius: 8,\r\n shadow: true,\r\n hover: false,\r\n});\r\n\r\nconst paddingStyle = computed(() => {\r\n if (Array.isArray(props.padding)) {\r\n return {\r\n padding: `${props.padding.map(p => `${p}px`).join(' ')}`\r\n };\r\n }\r\n return { padding: `${props.padding}px` };\r\n});\r\n\r\nconst radiusStyle = computed(() => ({\r\n borderRadius: `${props.radius}px`\r\n}));\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-block\"\r\n :class=\"{ 'tao-block--shadow': shadow, 'tao-block--hover': hover }\"\r\n :style=\"[paddingStyle, radiusStyle]\"\r\n >\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-block {\r\n background: var(--tao-color-surface);\r\n color: var(--tao-color-text);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-block--shadow {\r\n box-shadow: var(--tao-shadow-panel);\r\n}\r\n\r\n.tao-block--hover {\r\n cursor: pointer;\r\n}\r\n\r\n.tao-block--hover:hover {\r\n box-shadow: var(--tao-shadow-md);\r\n}\r\n</style>\r\n","import type { ComputedRef, InjectionKey } from 'vue';\r\n\r\nexport interface TaoFormFieldContext {\r\n id: string;\r\n invalid: ComputedRef<boolean>;\r\n describedBy: ComputedRef<string | undefined>;\r\n}\r\n\r\nexport const formFieldKey: InjectionKey<TaoFormFieldContext> = Symbol('taoFormField');\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoInput' });\r\n\r\ninterface Props {\r\n modelValue?: string | number;\r\n type?: 'text' | 'password' | 'email' | 'number' | 'tel';\r\n placeholder?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n errorMessage?: string;\r\n label?: string;\r\n id?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n type: 'text',\r\n placeholder: '',\r\n disabled: false,\r\n error: false,\r\n errorMessage: '',\r\n label: '',\r\n});\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => props.id || field?.id || localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\nconst focused = ref(false);\r\n\r\nconst emit = defineEmits(['update:modelValue', 'blur', 'focus']);\r\n\r\nfunction handleInput(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n emit('update:modelValue', target.value);\r\n}\r\n\r\nfunction handleBlur(event: FocusEvent) {\r\n focused.value = false;\r\n emit('blur', event);\r\n}\r\n\r\nfunction handleFocus(event: FocusEvent) {\r\n focused.value = true;\r\n emit('focus', event);\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-input-wrapper\">\r\n <label v-if=\"label && !field\" class=\"tao-input__label\" :for=\"controlId\">{{ label }}</label>\r\n <div\r\n class=\"tao-input-shell\"\r\n :class=\"{\r\n 'tao-input-shell--focused': focused,\r\n 'tao-input-shell--invalid': invalid,\r\n 'tao-input-shell--disabled': disabled,\r\n 'tao-input-shell--prefix': $slots.prefix,\r\n 'tao-input-shell--suffix': $slots.suffix,\r\n }\"\r\n >\r\n <span v-if=\"$slots.prefix\" class=\"tao-input__affix tao-input__affix--prefix\">\r\n <slot name=\"prefix\" />\r\n </span>\r\n <input\r\n :id=\"controlId\"\r\n class=\"tao-input\"\r\n :class=\"{ 'tao-input--error': invalid }\"\r\n :type=\"type\"\r\n :value=\"modelValue\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n @input=\"handleInput\"\r\n @blur=\"handleBlur\"\r\n @focus=\"handleFocus\"\r\n />\r\n <span v-if=\"$slots.suffix\" class=\"tao-input__affix tao-input__affix--suffix\">\r\n <slot name=\"suffix\" />\r\n </span>\r\n </div>\r\n <span v-if=\"error && errorMessage\" class=\"tao-input__error\">{{ errorMessage }}</span>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-input-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n width: 100%;\r\n}\r\n\r\n.tao-input__label {\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text);\r\n font-weight: 500;\r\n}\r\n\r\n.tao-input-shell {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n min-width: 0;\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-input {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n width: 100%;\r\n margin: 0;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border: none;\r\n border-radius: inherit;\r\n background: transparent;\r\n color: inherit;\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n line-height: 1.25;\r\n}\r\n\r\n.tao-input-shell--prefix .tao-input {\r\n padding-left: 0;\r\n}\r\n\r\n.tao-input-shell--suffix .tao-input {\r\n padding-right: 0;\r\n}\r\n\r\n.tao-input::placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-input:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-input-shell--focused {\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-input-shell--disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n color: var(--tao-color-input-disabled-text);\r\n background: var(--tao-color-input-disabled-bg);\r\n}\r\n\r\n.tao-input:disabled {\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-input-shell--invalid {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-input-shell--invalid.tao-input-shell--focused {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-input__affix {\r\n display: inline-flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n gap: var(--tao-space-1);\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 600;\r\n line-height: 1;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-input__affix--prefix {\r\n padding-left: var(--tao-space-3);\r\n padding-right: var(--tao-space-2);\r\n}\r\n\r\n.tao-input__affix--suffix {\r\n padding-right: var(--tao-space-3);\r\n padding-left: var(--tao-space-2);\r\n}\r\n\r\n.tao-input__affix :deep(svg) {\r\n display: block;\r\n width: 16px;\r\n height: 16px;\r\n}\r\n\r\n.tao-input__affix :deep(button) {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n background: transparent;\r\n color: inherit;\r\n font: inherit;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-input__affix :deep(button:hover) {\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-input__affix :deep(button:focus-visible) {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-input__error {\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { ref } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoInputGroup' });\r\n\r\nconst focused = ref(false);\r\n\r\nfunction onFocusIn() {\r\n focused.value = true;\r\n}\r\n\r\nfunction onFocusOut(event: FocusEvent) {\r\n const root = event.currentTarget as HTMLElement;\r\n const next = event.relatedTarget as Node | null;\r\n if (!next || !root.contains(next)) {\r\n focused.value = false;\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-input-group\"\r\n :class=\"{ 'tao-input-group--focused': focused }\"\r\n role=\"group\"\r\n @focusin=\"onFocusIn\"\r\n @focusout=\"onFocusOut\"\r\n >\r\n <div v-if=\"$slots.before\" class=\"tao-input-group__addon tao-input-group__addon--before\">\r\n <slot name=\"before\" />\r\n </div>\r\n <div class=\"tao-input-group__field\">\r\n <slot />\r\n </div>\r\n <div v-if=\"$slots.after\" class=\"tao-input-group__addon tao-input-group__addon--after\">\r\n <slot name=\"after\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-input-group {\r\n display: flex;\r\n align-items: stretch;\r\n width: 100%;\r\n min-width: 0;\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-input-group--focused {\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-input-group:has(.tao-input-shell--invalid) {\r\n box-shadow: none;\r\n}\r\n\r\n.tao-input-group--focused:has(.tao-input-shell--invalid) {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-input-group__field {\r\n display: flex;\r\n flex: 1 1 auto;\r\n align-items: stretch;\r\n align-self: stretch;\r\n min-width: 0;\r\n}\r\n\r\n.tao-input-group__field :deep(.tao-input-wrapper) {\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n align-self: stretch;\r\n min-width: 0;\r\n gap: 0;\r\n}\r\n\r\n.tao-input-group__field :deep(.tao-input-shell) {\r\n flex: 1 1 auto;\r\n align-self: stretch;\r\n border-radius: 0;\r\n box-shadow: none;\r\n}\r\n\r\n.tao-input-group__field :deep(.tao-input) {\r\n align-self: stretch;\r\n line-height: 1.25;\r\n}\r\n\r\n.tao-input-group__addon {\r\n display: flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n align-self: stretch;\r\n padding: 0 var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n background: var(--tao-color-surface-sunken);\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 600;\r\n line-height: 1;\r\n white-space: nowrap;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-input-group__addon--before {\r\n border-right: 0;\r\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\r\n}\r\n\r\n.tao-input-group__addon--after {\r\n border-left: 0;\r\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\r\n}\r\n\r\n.tao-input-group__field:not(:first-child) :deep(.tao-input-shell) {\r\n border-left: 0;\r\n}\r\n\r\n.tao-input-group__field:not(:last-child) :deep(.tao-input-shell) {\r\n border-right: 0;\r\n}\r\n\r\n.tao-input-group__field:first-child :deep(.tao-input-shell) {\r\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\r\n}\r\n\r\n.tao-input-group__field:last-child :deep(.tao-input-shell) {\r\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\r\n}\r\n\r\n.tao-input-group__field:only-child :deep(.tao-input-shell) {\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-input-group--focused .tao-input-group__addon,\r\n.tao-input-group--focused :deep(.tao-input-shell) {\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-input-group:has(.tao-input-shell--invalid) .tao-input-group__addon,\r\n.tao-input-group:has(.tao-input-shell--invalid) :deep(.tao-input-shell) {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-input-group__addon:has(.tao-button) {\r\n padding: 0;\r\n background: transparent;\r\n}\r\n\r\n.tao-input-group__addon :deep(.tao-button) {\r\n align-self: stretch;\r\n height: auto;\r\n border: none;\r\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\r\n}\r\n\r\n.tao-input-group__addon--before :deep(.tao-button) {\r\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\r\n}\r\n\r\n.tao-input-group__addon :deep(.tao-button:focus-visible) {\r\n outline-offset: -2px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoInputNumber' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: number | null;\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n precision?: number;\r\n disabled?: boolean;\r\n placeholder?: string;\r\n controls?: boolean;\r\n incrementLabel?: string;\r\n decrementLabel?: string;\r\n }>(),\r\n {\r\n modelValue: null,\r\n step: 1,\r\n disabled: false,\r\n placeholder: '',\r\n controls: true,\r\n incrementLabel: 'Увеличить',\r\n decrementLabel: 'Уменьшить',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number | null];\r\n blur: [event: FocusEvent];\r\n focus: [event: FocusEvent];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst focused = ref(false);\r\nconst draft = ref(toDraft(props.modelValue));\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n if (!focused.value) {\r\n draft.value = toDraft(value);\r\n }\r\n },\r\n);\r\n\r\nfunction decimalsOf(value: number) {\r\n const text = String(value);\r\n const dot = text.indexOf('.');\r\n return dot === -1 ? 0 : text.length - dot - 1;\r\n}\r\n\r\nfunction roundTo(value: number) {\r\n const digits = props.precision ?? decimalsOf(props.step);\r\n if (digits <= 0) {\r\n return Math.round(value);\r\n }\r\n const factor = 10 ** digits;\r\n return Math.round(value * factor) / factor;\r\n}\r\n\r\nfunction clamp(value: number) {\r\n let next = roundTo(value);\r\n if (props.min !== undefined && next < props.min) {\r\n next = props.min;\r\n }\r\n if (props.max !== undefined && next > props.max) {\r\n next = props.max;\r\n }\r\n return roundTo(next);\r\n}\r\n\r\nfunction toDraft(value: number | null | undefined) {\r\n if (value === null || value === undefined || Number.isNaN(value)) {\r\n return '';\r\n }\r\n return String(value);\r\n}\r\n\r\nfunction parseDraft(text: string): number | null | 'incomplete' {\r\n const trimmed = text.trim().replace(',', '.');\r\n if (trimmed === '') {\r\n return null;\r\n }\r\n if (trimmed === '-' || trimmed === '.' || trimmed === '-.') {\r\n return 'incomplete';\r\n }\r\n const parsed = Number(trimmed);\r\n if (!Number.isFinite(parsed)) {\r\n return 'incomplete';\r\n }\r\n return parsed;\r\n}\r\n\r\nfunction isAllowed(text: string) {\r\n return /^-?\\d*([.,]\\d*)?$/.test(text);\r\n}\r\n\r\nfunction commit(value: number | null) {\r\n const next = value === null ? null : clamp(value);\r\n emit('update:modelValue', next);\r\n if (!focused.value) {\r\n draft.value = toDraft(next);\r\n }\r\n}\r\n\r\nfunction bump(direction: 1 | -1) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n const base = props.modelValue ?? 0;\r\n commit(base + direction * props.step);\r\n}\r\n\r\nfunction onInput(event: Event) {\r\n const text = (event.target as HTMLInputElement).value;\r\n if (!isAllowed(text)) {\r\n return;\r\n }\r\n draft.value = text;\r\n const parsed = parseDraft(text);\r\n if (parsed !== 'incomplete') {\r\n emit('update:modelValue', parsed === null ? null : clamp(parsed));\r\n }\r\n}\r\n\r\nfunction onFocus(event: FocusEvent) {\r\n focused.value = true;\r\n emit('focus', event);\r\n}\r\n\r\nfunction onBlur(event: FocusEvent) {\r\n focused.value = false;\r\n const parsed = parseDraft(draft.value);\r\n commit(parsed === 'incomplete' ? null : parsed);\r\n emit('blur', event);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n bump(1);\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n bump(-1);\r\n }\r\n}\r\n\r\nconst atMin = computed(() => props.min !== undefined && (props.modelValue ?? 0) <= props.min);\r\nconst atMax = computed(() => props.max !== undefined && (props.modelValue ?? 0) >= props.max);\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-input-number\" :class=\"{ 'tao-input-number--invalid': invalid, 'tao-input-number--controls': controls }\">\r\n <input\r\n :id=\"controlId\"\r\n class=\"tao-input-number__input\"\r\n type=\"text\"\r\n inputmode=\"decimal\"\r\n role=\"spinbutton\"\r\n :value=\"draft\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :aria-valuenow=\"modelValue ?? undefined\"\r\n :aria-valuemin=\"min\"\r\n :aria-valuemax=\"max\"\r\n autocomplete=\"off\"\r\n @input=\"onInput\"\r\n @focus=\"onFocus\"\r\n @blur=\"onBlur\"\r\n @keydown=\"onKeydown\"\r\n />\r\n <div v-if=\"controls\" class=\"tao-input-number__steppers\">\r\n <button\r\n type=\"button\"\r\n class=\"tao-input-number__step\"\r\n :aria-label=\"incrementLabel\"\r\n tabindex=\"-1\"\r\n :disabled=\"disabled || atMax\"\r\n @click=\"bump(1)\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"increment-icon\">+</slot>\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"tao-input-number__step\"\r\n :aria-label=\"decrementLabel\"\r\n tabindex=\"-1\"\r\n :disabled=\"disabled || atMin\"\r\n @click=\"bump(-1)\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"decrement-icon\">−</slot>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-input-number {\r\n position: relative;\r\n display: flex;\r\n width: 100%;\r\n}\r\n\r\n.tao-input-number__input {\r\n width: 100%;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n font-variant-numeric: tabular-nums;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-input-number--controls .tao-input-number__input {\r\n padding-right: 34px;\r\n}\r\n\r\n.tao-input-number__input::placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-input-number__input:focus {\r\n outline: none;\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-input-number__input:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n color: var(--tao-color-input-disabled-text);\r\n background: var(--tao-color-input-disabled-bg);\r\n}\r\n\r\n.tao-input-number--invalid .tao-input-number__input {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-input-number--invalid .tao-input-number__input:focus {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-input-number__steppers {\r\n position: absolute;\r\n top: 1px;\r\n right: 1px;\r\n bottom: 1px;\r\n display: flex;\r\n flex-direction: column;\r\n width: 28px;\r\n border-left: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-input-number__step {\r\n flex: 1;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n background: transparent;\r\n color: var(--tao-color-text-muted);\r\n font: inherit;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-input-number__step + .tao-input-number__step {\r\n border-top: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-input-number__step:hover:not(:disabled) {\r\n color: var(--tao-color-text-strong);\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-input-number__step:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: -2px;\r\n}\r\n\r\n.tao-input-number__step:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.4;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport type { TaoQuantityChangeSource } from '../quantity';\r\n\r\ndefineOptions({ name: 'TaoQuantity' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: number;\r\n min?: number;\r\n max?: number;\r\n disabled?: boolean;\r\n /** Minus stays enabled at min and still emits `dec` — parent can remove the line. */\r\n allowRemove?: boolean;\r\n /** Clamp to max on blur and when the incoming value is above stock. */\r\n forceMaxLimit?: boolean;\r\n decrementLabel?: string;\r\n removeLabel?: string;\r\n incrementLabel?: string;\r\n }>(),\r\n {\r\n modelValue: 1,\r\n min: 1,\r\n disabled: false,\r\n allowRemove: true,\r\n forceMaxLimit: true,\r\n decrementLabel: 'Уменьшить',\r\n removeLabel: 'Убрать',\r\n incrementLabel: 'Увеличить',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number];\r\n change: [value: number, source: TaoQuantityChangeSource];\r\n dec: [value: number];\r\n inc: [value: number];\r\n blur: [value: number];\r\n focus: [event: FocusEvent];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst focused = ref(false);\r\nconst draft = ref(String(props.modelValue));\r\n\r\nconst ceiling = computed(() => (props.max === undefined ? Number.POSITIVE_INFINITY : props.max));\r\n\r\nfunction toInt(value: unknown) {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return Math.trunc(value);\r\n }\r\n const parsed = parseInt(String(value ?? ''), 10);\r\n return Number.isFinite(parsed) ? parsed : props.min;\r\n}\r\n\r\nfunction clampQty(value: number) {\r\n let next = Math.max(value, props.min);\r\n if (props.forceMaxLimit && props.max !== undefined) {\r\n next = Math.min(next, props.max);\r\n }\r\n return next;\r\n}\r\n\r\nfunction commit(value: number, source: TaoQuantityChangeSource) {\r\n const next = clampQty(value);\r\n if (next !== props.modelValue) {\r\n emit('update:modelValue', next);\r\n emit('change', next, source);\r\n }\r\n draft.value = String(next);\r\n return next;\r\n}\r\n\r\nwatch(\r\n () => [props.modelValue, props.min, props.max, props.forceMaxLimit] as const,\r\n () => {\r\n const next = clampQty(toInt(props.modelValue));\r\n if (next !== props.modelValue) {\r\n emit('update:modelValue', next);\r\n emit('change', next, 'input');\r\n }\r\n if (!focused.value) {\r\n draft.value = String(next);\r\n }\r\n },\r\n { immediate: true },\r\n);\r\n\r\nfunction onDec() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n let next = props.modelValue;\r\n if (props.modelValue > props.min) {\r\n next = props.modelValue > ceiling.value ? ceiling.value : clampQty(props.modelValue - 1);\r\n commit(next, 'dec');\r\n }\r\n emit('dec', next);\r\n}\r\n\r\nfunction onInc() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n let next = props.modelValue;\r\n if (props.modelValue < ceiling.value) {\r\n next = clampQty(props.modelValue + 1);\r\n commit(next, 'inc');\r\n }\r\n emit('inc', next);\r\n}\r\n\r\nfunction onInput(event: Event) {\r\n const text = (event.target as HTMLInputElement).value;\r\n if (!/^\\d*$/.test(text)) {\r\n return;\r\n }\r\n draft.value = text;\r\n if (text === '') {\r\n return;\r\n }\r\n commit(toInt(text), 'input');\r\n}\r\n\r\nfunction onFocus(event: FocusEvent) {\r\n focused.value = true;\r\n emit('focus', event);\r\n}\r\n\r\nfunction onBlur() {\r\n focused.value = false;\r\n const next = commit(draft.value === '' ? props.min : toInt(draft.value), 'input');\r\n draft.value = String(next);\r\n emit('blur', next);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n onInc();\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n onDec();\r\n }\r\n}\r\n\r\nconst atMin = computed(() => props.modelValue <= props.min);\r\nconst atMax = computed(() => props.modelValue >= ceiling.value);\r\nconst minusDisabled = computed(() => props.disabled || (!props.allowRemove && atMin.value));\r\nconst plusDisabled = computed(() => props.disabled || atMax.value);\r\nconst minusLabel = computed(() => (atMin.value && props.allowRemove ? props.removeLabel : props.decrementLabel));\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-quantity\"\r\n :class=\"{\r\n 'tao-quantity--invalid': invalid,\r\n 'tao-quantity--focused': focused,\r\n 'tao-quantity--disabled': disabled,\r\n }\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"tao-quantity__btn tao-quantity__btn--dec\"\r\n :aria-label=\"minusLabel\"\r\n :disabled=\"minusDisabled\"\r\n @click=\"onDec\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"decrement-icon\">−</slot>\r\n </span>\r\n </button>\r\n <input\r\n :id=\"controlId\"\r\n class=\"tao-quantity__input\"\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n autocomplete=\"off\"\r\n role=\"spinbutton\"\r\n :value=\"draft\"\r\n :disabled=\"disabled\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :aria-valuenow=\"modelValue\"\r\n :aria-valuemin=\"min\"\r\n :aria-valuemax=\"max\"\r\n @input=\"onInput\"\r\n @focus=\"onFocus\"\r\n @blur=\"onBlur\"\r\n @keydown=\"onKeydown\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"tao-quantity__btn tao-quantity__btn--inc\"\r\n :aria-label=\"incrementLabel\"\r\n :disabled=\"plusDisabled\"\r\n @click=\"onInc\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"increment-icon\">+</slot>\r\n </span>\r\n </button>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-quantity {\r\n display: inline-flex;\r\n width: 100%;\r\n min-width: 148px;\r\n isolation: isolate;\r\n}\r\n\r\n.tao-quantity__btn,\r\n.tao-quantity__input {\r\n height: 36px;\r\n margin: 0;\r\n border: 1px solid var(--tao-color-border-strong);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n font-family: inherit;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-quantity__btn {\r\n flex: 0 0 50px;\r\n width: 50px;\r\n padding: 0;\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-md);\r\n font-weight: 800;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-quantity__btn--dec {\r\n border-right: 0;\r\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\r\n}\r\n\r\n.tao-quantity__btn--inc {\r\n border-left: 0;\r\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\r\n}\r\n\r\n.tao-quantity__btn:hover:not(:disabled) {\r\n z-index: 1;\r\n color: var(--tao-color-accent);\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-quantity__btn:focus-visible {\r\n z-index: 2;\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: -2px;\r\n}\r\n\r\n.tao-quantity__btn:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.4;\r\n}\r\n\r\n.tao-quantity__input {\r\n z-index: 0;\r\n flex: 1 1 auto;\r\n min-width: 30px;\r\n padding: 0 var(--tao-space-2);\r\n border-right: 0;\r\n border-left: 0;\r\n text-align: center;\r\n font-size: var(--tao-font-size-md);\r\n font-weight: 700;\r\n font-variant-numeric: tabular-nums;\r\n}\r\n\r\n.tao-quantity__input:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-quantity--focused .tao-quantity__btn,\r\n.tao-quantity--focused .tao-quantity__input {\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-quantity--focused {\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-quantity__input:disabled {\r\n color: var(--tao-color-input-disabled-text);\r\n background: var(--tao-color-input-disabled-bg);\r\n}\r\n\r\n.tao-quantity--disabled .tao-quantity__btn {\r\n background: var(--tao-color-input-disabled-bg);\r\n}\r\n\r\n.tao-quantity--invalid .tao-quantity__btn,\r\n.tao-quantity--invalid .tao-quantity__input {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-quantity--invalid.tao-quantity--focused {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, useSlots } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoCard' });\r\n\r\ninterface Props {\r\n padding?: number | number[];\r\n radius?: number;\r\n shadow?: boolean;\r\n shadowBottomOnly?: boolean;\r\n hover?: boolean;\r\n active?: boolean;\r\n overflow?: boolean;\r\n /** Плитка: без отступа и без тени, cover/body тянутся на ячейку. */\r\n flush?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n padding: 20,\r\n radius: 8,\r\n shadow: true,\r\n shadowBottomOnly: false,\r\n hover: false,\r\n active: false,\r\n overflow: false,\r\n flush: false,\r\n});\r\n\r\nconst slots = useSlots();\r\n\r\nconst hasContent = computed(\r\n () =>\r\n Boolean(slots.headerTitle) ||\r\n Boolean(slots.header) ||\r\n Boolean(slots.headerSecondary) ||\r\n Boolean(slots.title) ||\r\n Boolean(slots.sub) ||\r\n Boolean(slots.default) ||\r\n Boolean(slots.footer),\r\n);\r\n\r\nconst coverOnly = computed(() => Boolean(slots.cover) && !hasContent.value);\r\n\r\nconst paddingStyle = computed(() => {\r\n if (props.flush) {\r\n return { padding: '0' };\r\n }\r\n if (Array.isArray(props.padding)) {\r\n return { padding: `${props.padding.map((p) => `${p}px`).join(' ')}` };\r\n }\r\n return { padding: `${props.padding}px` };\r\n});\r\n\r\nconst radiusStyle = computed(() => ({ borderRadius: `${props.radius}px` }));\r\nconst showPanelShadow = computed(() => props.shadow && !props.shadowBottomOnly && !props.flush);\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-card\"\r\n :class=\"{\r\n 'tao-card--shadow': showPanelShadow,\r\n 'tao-card--shadow-bottom': shadowBottomOnly,\r\n 'tao-card--hover': hover,\r\n 'tao-card--active': active,\r\n 'tao-card--overflow': overflow,\r\n 'tao-card--flush': flush,\r\n 'tao-card--cover-only': coverOnly,\r\n }\"\r\n :style=\"radiusStyle\"\r\n >\r\n <div v-if=\"$slots.cover\" class=\"tao-card__cover\">\r\n <slot name=\"cover\" />\r\n <div v-if=\"$slots.overlay\" class=\"tao-card__overlay\">\r\n <slot name=\"overlay\" />\r\n </div>\r\n </div>\r\n <div v-else-if=\"$slots.overlay\" class=\"tao-card__overlay\">\r\n <slot name=\"overlay\" />\r\n </div>\r\n\r\n <div v-if=\"hasContent\" class=\"tao-card__content\" :style=\"paddingStyle\">\r\n <h2 v-if=\"$slots.headerTitle\" class=\"tao-card__header-title\">\r\n <slot name=\"headerTitle\" />\r\n </h2>\r\n\r\n <div v-if=\"$slots.header || $slots.headerSecondary\" class=\"tao-card__header\" :class=\"{ 'tao-card__header--between': $slots.headerSecondary }\">\r\n <span><slot name=\"header\" /></span>\r\n <span v-if=\"$slots.headerSecondary\"><slot name=\"headerSecondary\" /></span>\r\n </div>\r\n\r\n <div v-if=\"$slots.title || $slots.sub\" class=\"tao-card__title-block\">\r\n <h2 v-if=\"$slots.title\" class=\"tao-card__title\"><slot name=\"title\" /></h2>\r\n <div v-if=\"$slots.sub\" class=\"tao-card__sub\"><slot name=\"sub\" /></div>\r\n </div>\r\n\r\n <div v-if=\"$slots.default\" class=\"tao-card__body\"><slot /></div>\r\n\r\n <div v-if=\"$slots.footer\" class=\"tao-card__footer\"><slot name=\"footer\" /></div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-card {\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 100%;\r\n min-height: 0;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-card--overflow {\r\n overflow: visible;\r\n}\r\n\r\n.tao-card:not(.tao-card--overflow) {\r\n overflow: hidden;\r\n}\r\n\r\n.tao-card--shadow {\r\n box-shadow: var(--tao-shadow-panel);\r\n}\r\n\r\n.tao-card--shadow-bottom {\r\n box-shadow: 0 1px 0 0 var(--tao-color-border-strong);\r\n}\r\n\r\n.tao-card--hover {\r\n cursor: pointer;\r\n}\r\n\r\n.tao-card--hover:hover,\r\n.tao-card--hover.tao-card--active {\r\n box-shadow: 0 0 0 1px var(--tao-color-accent), var(--tao-shadow-lg);\r\n}\r\n\r\n.tao-card__cover {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.tao-card--cover-only .tao-card__cover {\r\n flex: 1 1 auto;\r\n min-height: 0;\r\n}\r\n\r\n.tao-card--cover-only .tao-card__cover > :deep(img) {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n}\r\n\r\n.tao-card__overlay {\r\n position: absolute;\r\n inset: 0;\r\n pointer-events: none;\r\n}\r\n\r\n.tao-card__content {\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n gap: var(--tao-space-3);\r\n min-height: 0;\r\n}\r\n\r\n.tao-card--flush .tao-card__content {\r\n padding: 0;\r\n}\r\n\r\n.tao-card__header-title {\r\n margin: 0 0 var(--tao-space-5);\r\n font-weight: 500;\r\n text-align: center;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-card__header {\r\n margin-top: -6px;\r\n padding: 2px 0 var(--tao-space-2);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 700;\r\n}\r\n\r\n.tao-card__header--between {\r\n display: flex;\r\n justify-content: space-between;\r\n}\r\n\r\n.tao-card__title {\r\n margin: 0 0 2px;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-card__sub {\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-card__body {\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n min-height: 0;\r\n font-size: var(--tao-font-size-md);\r\n}\r\n\r\n.tao-card__footer {\r\n margin-top: auto;\r\n}\r\n</style>\r\n","const FOCUSABLE =\r\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\r\n\r\nexport function getFocusable(root: HTMLElement) {\r\n return [...root.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(\r\n (el) => el.getClientRects().length > 0 || el === document.activeElement,\r\n );\r\n}\r\n\r\nexport function trapTab(event: KeyboardEvent, root: HTMLElement) {\r\n if (event.key !== 'Tab') {\r\n return;\r\n }\r\n\r\n const items = getFocusable(root);\r\n if (!items.length) {\r\n event.preventDefault();\r\n root.focus();\r\n return;\r\n }\r\n\r\n const first = items[0];\r\n const last = items[items.length - 1];\r\n\r\n if (event.shiftKey && document.activeElement === first) {\r\n event.preventDefault();\r\n last.focus();\r\n return;\r\n }\r\n\r\n if (!event.shiftKey && document.activeElement === last) {\r\n event.preventDefault();\r\n first.focus();\r\n }\r\n}\r\n","let locks = 0;\r\nlet previousOverflow = '';\r\n\r\nexport function isBrowser() {\r\n return typeof document !== 'undefined';\r\n}\r\n\r\nexport function lockBodyScroll() {\r\n if (!isBrowser()) {\r\n return;\r\n }\r\n\r\n if (locks === 0) {\r\n previousOverflow = document.body.style.overflow;\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n locks += 1;\r\n}\r\n\r\nexport function unlockBodyScroll() {\r\n if (!isBrowser() || locks === 0) {\r\n return;\r\n }\r\n\r\n locks -= 1;\r\n if (locks === 0) {\r\n document.body.style.overflow = previousOverflow;\r\n previousOverflow = '';\r\n }\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\r\nimport { getFocusable, trapTab } from '../focusTrap';\r\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\r\n\r\ndefineOptions({ name: 'TaoModal' });\r\n\r\ninterface Props {\r\n modelValue: boolean;\r\n title?: string;\r\n closable?: boolean;\r\n closeLabel?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n title: '',\r\n closable: true,\r\n closeLabel: 'Закрыть',\r\n});\r\n\r\nconst emit = defineEmits(['update:modelValue', 'close']);\r\n\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst titleId = useId();\r\nlet previousFocus: HTMLElement | null = null;\r\nlet scrollHeld = false;\r\nlet pointerDownOnOverlay = false;\r\n\r\nfunction close() {\r\n if (!props.closable) {\r\n return;\r\n }\r\n emit('update:modelValue', false);\r\n emit('close');\r\n}\r\n\r\nfunction holdScroll() {\r\n if (scrollHeld || !isBrowser()) {\r\n return;\r\n }\r\n lockBodyScroll();\r\n scrollHeld = true;\r\n}\r\n\r\nfunction releaseScroll() {\r\n if (!scrollHeld) {\r\n return;\r\n }\r\n unlockBodyScroll();\r\n scrollHeld = false;\r\n}\r\n\r\nfunction restoreFocus() {\r\n previousFocus?.focus?.();\r\n previousFocus = null;\r\n}\r\n\r\nasync function focusPanel() {\r\n await nextTick();\r\n const panel = panelRef.value;\r\n if (!panel) {\r\n return;\r\n }\r\n const first = getFocusable(panel)[0];\r\n (first ?? panel).focus();\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n if (!props.closable) {\r\n return;\r\n }\r\n event.preventDefault();\r\n close();\r\n return;\r\n }\r\n\r\n if (panelRef.value) {\r\n trapTab(event, panelRef.value);\r\n }\r\n}\r\n\r\nfunction onOverlayPointerDown(event: PointerEvent) {\r\n pointerDownOnOverlay = event.target === event.currentTarget;\r\n}\r\n\r\nfunction onOverlayPointerUp(event: PointerEvent) {\r\n if (pointerDownOnOverlay && event.target === event.currentTarget) {\r\n close();\r\n }\r\n pointerDownOnOverlay = false;\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (isOpen) => {\r\n if (!isBrowser()) {\r\n return;\r\n }\r\n\r\n if (isOpen) {\r\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\r\n holdScroll();\r\n void focusPanel();\r\n return;\r\n }\r\n releaseScroll();\r\n restoreFocus();\r\n },\r\n { immediate: true },\r\n);\r\n\r\nonBeforeUnmount(() => {\r\n releaseScroll();\r\n restoreFocus();\r\n});\r\n</script>\r\n\r\n<template>\r\n <Teleport to=\"body\">\r\n <Transition name=\"tao-modal-fade\">\r\n <div\r\n v-if=\"modelValue\"\r\n class=\"tao-modal-overlay\"\r\n @pointerdown=\"onOverlayPointerDown\"\r\n @pointerup=\"onOverlayPointerUp\"\r\n @keydown=\"onKeydown\"\r\n >\r\n <div\r\n ref=\"panelRef\"\r\n class=\"tao-modal\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n :aria-labelledby=\"title ? titleId : undefined\"\r\n tabindex=\"-1\"\r\n >\r\n <div v-if=\"title || $slots.header || closable\" class=\"tao-modal__header\">\r\n <slot name=\"header\">\r\n <h2 v-if=\"title\" :id=\"titleId\" class=\"tao-modal__title\">{{ title }}</h2>\r\n <span v-else></span>\r\n </slot>\r\n <button\r\n v-if=\"closable\"\r\n type=\"button\"\r\n class=\"tao-modal__close\"\r\n :aria-label=\"closeLabel\"\r\n @click=\"close\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"close-icon\">&times;</slot>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"tao-modal__content\">\r\n <slot />\r\n </div>\r\n <div v-if=\"$slots.footer\" class=\"tao-modal__footer\">\r\n <slot name=\"footer\" />\r\n </div>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-modal-overlay {\r\n position: fixed;\r\n inset: 0;\r\n background: var(--tao-color-overlay);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 1000;\r\n padding: var(--tao-space-5);\r\n}\r\n\r\n.tao-modal {\r\n background: var(--tao-color-surface-raised);\r\n border-radius: var(--tao-radius-panel);\r\n max-width: 500px;\r\n width: 100%;\r\n max-height: 90vh;\r\n overflow-y: auto;\r\n box-shadow: var(--tao-shadow-overlay);\r\n}\r\n\r\n.tao-modal:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-modal:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-modal__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--tao-space-4) var(--tao-space-5);\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-modal__title {\r\n margin: 0;\r\n font-size: var(--tao-font-size-xl);\r\n font-weight: 600;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-modal__close {\r\n background: none;\r\n border: none;\r\n font-size: 24px;\r\n color: var(--tao-color-text);\r\n cursor: pointer;\r\n padding: 0;\r\n line-height: 1;\r\n}\r\n\r\n.tao-modal__close:hover {\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-modal__close:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-modal__content {\r\n padding: var(--tao-space-5);\r\n}\r\n\r\n.tao-modal__footer {\r\n padding: var(--tao-space-4) var(--tao-space-5);\r\n border-top: 1px solid var(--tao-color-border);\r\n display: flex;\r\n gap: var(--tao-space-3);\r\n justify-content: flex-end;\r\n}\r\n\r\n.tao-modal-fade-enter-active,\r\n.tao-modal-fade-leave-active {\r\n transition: opacity var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-modal-fade-enter-from,\r\n.tao-modal-fade-leave-to {\r\n opacity: 0;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, nextTick, useId } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoTabs' });\r\n\r\ninterface Tab {\r\n key: string;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n tabs: Tab[];\r\n modelValue: string;\r\n /** Выравнивание вкладок по горизонтали (CSS justify-content). */\r\n justify?: string;\r\n }>(),\r\n {\r\n justify: '',\r\n },\r\n);\r\n\r\nconst emit = defineEmits(['update:modelValue']);\r\nconst uid = useId();\r\n\r\nconst enabledTabs = computed(() => props.tabs.filter((tab) => !tab.disabled));\r\n\r\nfunction tabId(key: string) {\r\n return `${uid}-${key}`;\r\n}\r\n\r\nfunction panelId(key: string) {\r\n return `${uid}-panel-${key}`;\r\n}\r\n\r\nfunction selectTab(key: string, focus = false) {\r\n const tab = props.tabs.find((item) => item.key === key);\r\n if (tab && !tab.disabled) {\r\n emit('update:modelValue', key);\r\n if (focus) {\r\n void nextTick(() => document.getElementById(tabId(key))?.focus());\r\n }\r\n }\r\n}\r\n\r\nfunction move(delta: number) {\r\n const enabled = enabledTabs.value;\r\n if (!enabled.length) {\r\n return;\r\n }\r\n const current = enabled.findIndex((tab) => tab.key === props.modelValue);\r\n const next = enabled[(current + delta + enabled.length) % enabled.length];\r\n selectTab(next.key, true);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n move(1);\r\n return;\r\n }\r\n if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n move(-1);\r\n return;\r\n }\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n selectTab(enabledTabs.value[0]?.key ?? props.modelValue, true);\r\n return;\r\n }\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n const last = enabledTabs.value[enabledTabs.value.length - 1];\r\n selectTab(last?.key ?? props.modelValue, true);\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-tabs\">\r\n <div class=\"tao-tabs__list\" :style=\"{ justifyContent: justify || undefined }\" role=\"tablist\" @keydown=\"onKeydown\">\r\n <button\r\n v-for=\"tab in tabs\"\r\n :key=\"tab.key\"\r\n type=\"button\"\r\n class=\"tao-tabs__tab\"\r\n role=\"tab\"\r\n :id=\"tabId(tab.key)\"\r\n :aria-selected=\"tab.key === modelValue\"\r\n :aria-controls=\"panelId(tab.key)\"\r\n :tabindex=\"tab.key === modelValue ? 0 : -1\"\r\n :disabled=\"tab.disabled\"\r\n @click=\"selectTab(tab.key)\"\r\n >\r\n <slot v-if=\"$slots.label\" name=\"label\" :text=\"tab.label\" :value=\"tab.key\" />\r\n <template v-else>{{ tab.label }}</template>\r\n </button>\r\n </div>\r\n <div\r\n class=\"tao-tabs__content\"\r\n role=\"tabpanel\"\r\n :id=\"panelId(modelValue)\"\r\n :aria-labelledby=\"tabId(modelValue)\"\r\n >\r\n <slot :active-tab=\"modelValue\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-tabs {\r\n width: 100%;\r\n}\r\n\r\n.tao-tabs__list {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--tao-space-1);\r\n margin: 0;\r\n padding: 0;\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-tabs__tab {\r\n margin-bottom: -1px;\r\n padding: var(--tao-space-2) var(--tao-space-4);\r\n border: none;\r\n border-bottom: 2px solid transparent;\r\n background: transparent;\r\n color: var(--tao-color-text-subtle);\r\n font: inherit;\r\n font-size: var(--tao-font-size-md);\r\n font-weight: 500;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-tabs__tab:hover:not(:disabled) {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-tabs__tab[aria-selected='true'] {\r\n color: var(--tao-color-accent);\r\n border-bottom-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-tabs__tab[aria-selected='true']:hover:not(:disabled) {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-tabs__tab:disabled {\r\n cursor: not-allowed;\r\n color: var(--tao-color-text-disabled);\r\n}\r\n\r\n.tao-tabs__tab:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n border-radius: var(--tao-radius-control) var(--tao-radius-control) 0 0;\r\n}\r\n\r\n.tao-tabs__content {\r\n padding: var(--tao-space-4) 0 0;\r\n color: var(--tao-color-text);\r\n}\r\n</style>\r\n","/**\r\n * Win / скриншот / Alt-Tab часто глотают mouseleave и pointerup —\r\n * жест или hover остаются «нажатыми». Слушатель дергает callback,\r\n * когда окно реально теряет фокус.\r\n */\r\nexport function listenFocusLoss(onLoss: () => void) {\r\n function onVisibilityChange() {\r\n if (document.hidden) {\r\n onLoss();\r\n }\r\n }\r\n\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n window.addEventListener('blur', onLoss);\r\n window.addEventListener('pagehide', onLoss);\r\n\r\n return () => {\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n window.removeEventListener('blur', onLoss);\r\n window.removeEventListener('pagehide', onLoss);\r\n };\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\r\nimport { listenFocusLoss } from '../focusLoss';\r\n\r\ndefineOptions({ name: 'TaoTooltip' });\r\n\r\ntype TaoTooltipPosition = 'top' | 'bottom' | 'left' | 'right';\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n content: string;\r\n position?: TaoTooltipPosition;\r\n }>(),\r\n {\r\n position: 'top',\r\n },\r\n);\r\n\r\nconst wrapperRef = ref<HTMLElement | null>(null);\r\nconst tooltipRef = ref<HTMLElement | null>(null);\r\nconst showTooltip = ref(false);\r\nconst placed = ref<TaoTooltipPosition>(props.position);\r\nconst panelStyle = ref<Record<string, string>>({ visibility: 'hidden' });\r\nconst arrowStyle = ref<Record<string, string>>({});\r\n\r\nconst opposite: Record<TaoTooltipPosition, TaoTooltipPosition> = {\r\n top: 'bottom',\r\n bottom: 'top',\r\n left: 'right',\r\n right: 'left',\r\n};\r\n\r\nfunction hide() {\r\n showTooltip.value = false;\r\n}\r\n\r\nfunction show() {\r\n showTooltip.value = true;\r\n}\r\n\r\nfunction updatePosition() {\r\n const trigger = wrapperRef.value;\r\n const tip = tooltipRef.value;\r\n if (!trigger || !tip) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const width = tip.offsetWidth;\r\n const height = tip.offsetHeight;\r\n const gap = 8;\r\n const pad = 8;\r\n const viewW = window.innerWidth;\r\n const viewH = window.innerHeight;\r\n const space = {\r\n bottom: viewH - rect.bottom - gap - pad,\r\n top: rect.top - gap - pad,\r\n right: viewW - rect.right - gap - pad,\r\n left: rect.left - gap - pad,\r\n };\r\n\r\n let side = props.position;\r\n const need = side === 'top' || side === 'bottom' ? height : width;\r\n if (space[side] < need && space[opposite[side]] > space[side]) {\r\n side = opposite[side];\r\n }\r\n\r\n const cx = rect.left + rect.width / 2;\r\n const cy = rect.top + rect.height / 2;\r\n let top = 0;\r\n let left = 0;\r\n\r\n if (side === 'bottom') {\r\n top = rect.bottom + gap;\r\n left = cx - width / 2;\r\n } else if (side === 'top') {\r\n top = rect.top - height - gap;\r\n left = cx - width / 2;\r\n } else if (side === 'right') {\r\n top = cy - height / 2;\r\n left = rect.right + gap;\r\n } else {\r\n top = cy - height / 2;\r\n left = rect.left - width - gap;\r\n }\r\n\r\n if (left + width > viewW - pad) {\r\n left = viewW - pad - width;\r\n }\r\n if (left < pad) {\r\n left = pad;\r\n }\r\n if (top + height > viewH - pad) {\r\n top = viewH - pad - height;\r\n }\r\n if (top < pad) {\r\n top = pad;\r\n }\r\n\r\n const arrowPad = 10;\r\n if (side === 'top' || side === 'bottom') {\r\n const x = Math.min(width - arrowPad, Math.max(arrowPad, cx - left));\r\n arrowStyle.value = { left: `${x}px`, top: '' };\r\n } else {\r\n const y = Math.min(height - arrowPad, Math.max(arrowPad, cy - top));\r\n arrowStyle.value = { top: `${y}px`, left: '' };\r\n }\r\n\r\n placed.value = side;\r\n panelStyle.value = { top: `${top}px`, left: `${left}px`, visibility: 'visible' };\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (showTooltip.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(showTooltip, async (isOpen) => {\r\n if (isOpen) {\r\n await nextTick();\r\n updatePosition();\r\n requestAnimationFrame(() => updatePosition());\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n\r\nwatch(\r\n () => props.position,\r\n () => {\r\n if (showTooltip.value) {\r\n updatePosition();\r\n }\r\n },\r\n);\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(hide);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n stopFocusLoss?.();\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"wrapperRef\"\r\n class=\"tao-tooltip-wrapper\"\r\n @mouseenter=\"show\"\r\n @mouseleave=\"hide\"\r\n @focusin=\"show\"\r\n @focusout=\"hide\"\r\n >\r\n <slot />\r\n <Teleport to=\"body\">\r\n <Transition name=\"tao-tooltip-fade\">\r\n <div\r\n v-if=\"showTooltip\"\r\n ref=\"tooltipRef\"\r\n class=\"tao-tooltip\"\r\n :class=\"`tao-tooltip--${placed}`\"\r\n role=\"tooltip\"\r\n :style=\"panelStyle\"\r\n >\r\n {{ content }}\r\n <span class=\"tao-tooltip__arrow\" :style=\"arrowStyle\" aria-hidden=\"true\"></span>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.tao-tooltip {\r\n z-index: 1060;\r\n position: fixed;\r\n box-sizing: border-box;\r\n width: max-content;\r\n max-width: min(280px, calc(100vw - 16px));\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text-strong);\r\n font-size: var(--tao-font-size-xs);\r\n font-family: var(--tao-font-family);\r\n line-height: 1.3;\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-lg);\r\n pointer-events: none;\r\n}\r\n\r\n.tao-tooltip__arrow {\r\n position: absolute;\r\n width: 8px;\r\n height: 8px;\r\n background: var(--tao-color-surface-raised);\r\n}\r\n\r\n.tao-tooltip--top .tao-tooltip__arrow {\r\n top: 100%;\r\n margin-top: -4px;\r\n transform: translateX(-50%) rotate(45deg);\r\n}\r\n\r\n.tao-tooltip--bottom .tao-tooltip__arrow {\r\n bottom: 100%;\r\n margin-bottom: -4px;\r\n transform: translateX(-50%) rotate(45deg);\r\n}\r\n\r\n.tao-tooltip--left .tao-tooltip__arrow {\r\n left: 100%;\r\n margin-left: -4px;\r\n transform: translateY(-50%) rotate(45deg);\r\n}\r\n\r\n.tao-tooltip--right .tao-tooltip__arrow {\r\n right: 100%;\r\n margin-right: -4px;\r\n transform: translateY(-50%) rotate(45deg);\r\n}\r\n\r\n.tao-tooltip-fade-enter-active,\r\n.tao-tooltip-fade-leave-active {\r\n transition:\r\n opacity var(--tao-duration-base) var(--tao-ease-base),\r\n transform var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-tooltip--top.tao-tooltip-fade-enter-from,\r\n.tao-tooltip--top.tao-tooltip-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(4px);\r\n}\r\n\r\n.tao-tooltip--bottom.tao-tooltip-fade-enter-from,\r\n.tao-tooltip--bottom.tao-tooltip-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(-4px);\r\n}\r\n\r\n.tao-tooltip--left.tao-tooltip-fade-enter-from,\r\n.tao-tooltip--left.tao-tooltip-fade-leave-to {\r\n opacity: 0;\r\n transform: translateX(4px);\r\n}\r\n\r\n.tao-tooltip--right.tao-tooltip-fade-enter-from,\r\n.tao-tooltip--right.tao-tooltip-fade-leave-to {\r\n opacity: 0;\r\n transform: translateX(-4px);\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-tooltip-wrapper {\r\n display: inline-block;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoPopover' });\r\n\r\ntype TaoPopoverPosition = 'top' | 'bottom' | 'left' | 'right';\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: boolean;\r\n position?: TaoPopoverPosition;\r\n disabled?: boolean;\r\n }>(),\r\n {\r\n modelValue: undefined,\r\n position: 'bottom',\r\n disabled: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: boolean];\r\n change: [value: boolean];\r\n}>();\r\n\r\nconst triggerRef = ref<HTMLElement | null>(null);\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst internal = ref(false);\r\nconst panelStyle = ref({ top: '0px', left: '0px' });\r\nconst isControlled = computed(() => props.modelValue !== undefined);\r\nconst open = computed(() => (isControlled.value ? Boolean(props.modelValue) : internal.value));\r\n\r\nfunction setOpen(next: boolean) {\r\n if (props.disabled && next) {\r\n return;\r\n }\r\n\r\n if (!isControlled.value) {\r\n internal.value = next;\r\n }\r\n emit('update:modelValue', next);\r\n emit('change', next);\r\n}\r\n\r\nfunction toggle() {\r\n void applyOpen(!open.value);\r\n}\r\n\r\nfunction close() {\r\n void applyOpen(false);\r\n}\r\n\r\nfunction bindDismiss() {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n document.addEventListener('keydown', onDocumentKey);\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n}\r\n\r\nfunction unbindDismiss() {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n document.removeEventListener('keydown', onDocumentKey);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n}\r\n\r\nfunction applyOpen(next: boolean) {\r\n setOpen(next);\r\n}\r\n\r\nfunction focusTrigger() {\r\n const root = triggerRef.value;\r\n const focusable = root?.querySelector<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n (focusable ?? root)?.focus?.();\r\n}\r\n\r\nfunction updatePosition() {\r\n const trigger = triggerRef.value;\r\n const panel = panelRef.value;\r\n if (typeof window === 'undefined' || !trigger || !panel) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const width = panel.offsetWidth;\r\n const height = panel.offsetHeight;\r\n const gap = 4;\r\n const pad = 8;\r\n const viewW = window.innerWidth;\r\n const viewH = window.innerHeight;\r\n\r\n const space = {\r\n bottom: viewH - rect.bottom - gap - pad,\r\n top: rect.top - gap - pad,\r\n right: viewW - rect.right - gap - pad,\r\n left: rect.left - gap - pad,\r\n };\r\n const opposite: Record<TaoPopoverPosition, TaoPopoverPosition> = {\r\n bottom: 'top',\r\n top: 'bottom',\r\n left: 'right',\r\n right: 'left',\r\n };\r\n\r\n let side = props.position;\r\n const need = side === 'top' || side === 'bottom' ? height : width;\r\n if (space[side] < need && space[opposite[side]] > space[side]) {\r\n side = opposite[side];\r\n }\r\n\r\n let top = 0;\r\n let left = 0;\r\n if (side === 'bottom') {\r\n top = rect.bottom + gap;\r\n left = rect.left;\r\n } else if (side === 'top') {\r\n top = rect.top - height - gap;\r\n left = rect.left;\r\n } else if (side === 'right') {\r\n top = rect.top;\r\n left = rect.right + gap;\r\n } else {\r\n top = rect.top;\r\n left = rect.left - width - gap;\r\n }\r\n\r\n if (left + width > viewW - pad) {\r\n left = viewW - pad - width;\r\n }\r\n if (left < pad) {\r\n left = pad;\r\n }\r\n if (top + height > viewH - pad) {\r\n top = viewH - pad - height;\r\n }\r\n if (top < pad) {\r\n top = pad;\r\n }\r\n\r\n panelStyle.value = { top: `${top}px`, left: `${left}px` };\r\n}\r\n\r\nfunction onTriggerClick() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n toggle();\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n if (triggerRef.value?.contains(target) || panelRef.value?.contains(target)) {\r\n return;\r\n }\r\n close();\r\n}\r\n\r\nfunction onDocumentKey(event: KeyboardEvent) {\r\n if (event.key !== 'Escape') {\r\n return;\r\n }\r\n event.preventDefault();\r\n close();\r\n focusTrigger();\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (open.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(\r\n open,\r\n (isOpen) => {\r\n if (isOpen) {\r\n bindDismiss();\r\n void nextTick(() => {\r\n updatePosition();\r\n panelRef.value?.focus();\r\n });\r\n return;\r\n }\r\n\r\n unbindDismiss();\r\n },\r\n { immediate: true },\r\n);\r\n\r\nonBeforeUnmount(() => {\r\n unbindDismiss();\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-popover\">\r\n <div ref=\"triggerRef\" class=\"tao-popover__trigger\" @click=\"onTriggerClick\">\r\n <slot name=\"trigger\" :open=\"open\" :toggle=\"toggle\" />\r\n </div>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"open\"\r\n ref=\"panelRef\"\r\n class=\"tao-popover__panel\"\r\n role=\"dialog\"\r\n tabindex=\"-1\"\r\n :style=\"panelStyle\"\r\n >\r\n <slot />\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.tao-popover__panel {\r\n z-index: 1050;\r\n position: fixed;\r\n min-width: 200px;\r\n max-width: min(360px, calc(100vw - 16px));\r\n padding: var(--tao-space-3);\r\n overflow: auto;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-overlay);\r\n}\r\n\r\n.tao-popover__panel:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-popover__panel:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-popover {\r\n display: inline-block;\r\n}\r\n\r\n.tao-popover__trigger {\r\n display: inline-block;\r\n}\r\n</style>\r\n","import type { ComputedRef, InjectionKey } from 'vue';\r\n\r\nexport type TaoSpoilerName = string | number;\r\n\r\nexport interface TaoSpoilerGroupContext {\r\n model: ComputedRef<TaoSpoilerName | null | undefined>;\r\n setOpen: (name: TaoSpoilerName | null) => void;\r\n}\r\n\r\nexport const spoilerGroupKey: InjectionKey<TaoSpoilerGroupContext> = Symbol('taoSpoilerGroup');\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId } from 'vue';\r\nimport { spoilerGroupKey } from '../spoiler';\r\n\r\ndefineOptions({ name: 'TaoSpoiler' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n title?: string;\r\n defaultOpen?: boolean;\r\n modelValue?: boolean;\r\n /** Ключ панели в `TaoSpoilerGroup`. Без группы не используется. */\r\n name?: string | number;\r\n }>(),\r\n {\r\n title: '',\r\n defaultOpen: false,\r\n modelValue: undefined,\r\n name: undefined,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: boolean];\r\n}>();\r\n\r\nconst panelId = useId();\r\nconst internal = ref(props.defaultOpen);\r\nconst group = inject(spoilerGroupKey, null);\r\nconst inGroup = computed(() => group !== null && props.name !== undefined && props.name !== '');\r\nconst isControlled = computed(() => props.modelValue !== undefined);\r\nconst isOpen = computed(() => {\r\n if (inGroup.value) {\r\n return group!.model.value === props.name;\r\n }\r\n return isControlled.value ? Boolean(props.modelValue) : internal.value;\r\n});\r\n\r\nfunction toggle() {\r\n if (inGroup.value) {\r\n group!.setOpen(isOpen.value ? null : (props.name as string | number));\r\n return;\r\n }\r\n\r\n const next = !isOpen.value;\r\n if (!isControlled.value) {\r\n internal.value = next;\r\n }\r\n emit('update:modelValue', next);\r\n}\r\n\r\nfunction onBeforeEnter(el: Element) {\r\n (el as HTMLElement).style.height = '0';\r\n}\r\n\r\nfunction onEnter(el: Element) {\r\n const element = el as HTMLElement;\r\n requestAnimationFrame(() => {\r\n element.style.height = `${element.scrollHeight}px`;\r\n });\r\n}\r\n\r\nfunction onAfterEnter(el: Element) {\r\n (el as HTMLElement).style.height = 'auto';\r\n}\r\n\r\nfunction onLeave(el: Element) {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n requestAnimationFrame(() => {\r\n element.style.height = '0';\r\n });\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-spoiler\">\r\n <button\r\n type=\"button\"\r\n class=\"tao-spoiler__header\"\r\n :aria-expanded=\"isOpen\"\r\n :aria-controls=\"panelId\"\r\n @click=\"toggle\"\r\n >\r\n <span class=\"tao-spoiler__icon\" :class=\"{ 'tao-spoiler__icon--open': isOpen }\">▶</span>\r\n <span v-if=\"title || $slots.title\" class=\"tao-spoiler__title\">\r\n <slot name=\"title\">{{ title }}</slot>\r\n </span>\r\n </button>\r\n <Transition\r\n name=\"tao-spoiler-slide\"\r\n @before-enter=\"onBeforeEnter\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n >\r\n <div v-if=\"isOpen\" :id=\"panelId\" class=\"tao-spoiler__content\">\r\n <div class=\"tao-spoiler__content-inner\">\r\n <slot />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-spoiler {\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-panel);\r\n overflow: hidden;\r\n}\r\n\r\n.tao-spoiler__header {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n min-height: 40px;\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n background: var(--tao-color-surface-sunken);\r\n border: none;\r\n cursor: pointer;\r\n text-align: left;\r\n}\r\n\r\n.tao-spoiler__header:hover {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-spoiler__icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n width: 1em;\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-accent);\r\n transition: transform var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-spoiler__icon--open {\r\n transform: rotate(90deg);\r\n}\r\n\r\n.tao-spoiler__title {\r\n font-weight: 500;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-spoiler__content {\r\n overflow: hidden;\r\n}\r\n\r\n.tao-spoiler-slide-enter-active,\r\n.tao-spoiler-slide-leave-active {\r\n transition: height var(--tao-duration-slow) var(--tao-ease-base);\r\n overflow: hidden;\r\n}\r\n\r\n.tao-spoiler__content-inner {\r\n padding: var(--tao-space-4);\r\n background: var(--tao-color-surface);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, provide, ref } from 'vue';\r\nimport { spoilerGroupKey, type TaoSpoilerName } from '../spoiler';\r\n\r\ndefineOptions({ name: 'TaoSpoilerGroup' });\r\n\r\nconst props = defineProps<{\r\n modelValue?: TaoSpoilerName | null;\r\n}>();\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoSpoilerName | null];\r\n change: [value: TaoSpoilerName | null];\r\n}>();\r\n\r\nconst isControlled = computed(() => props.modelValue !== undefined);\r\nconst internal = ref<TaoSpoilerName | null>(null);\r\nconst model = computed(() => (isControlled.value ? props.modelValue : internal.value));\r\n\r\nfunction setOpen(name: TaoSpoilerName | null) {\r\n if (!isControlled.value) {\r\n internal.value = name;\r\n }\r\n emit('update:modelValue', name);\r\n emit('change', name);\r\n}\r\n\r\nprovide(spoilerGroupKey, {\r\n model,\r\n setOpen,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-spoiler-group\">\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-spoiler-group {\r\n overflow: hidden;\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-panel);\r\n}\r\n\r\n.tao-spoiler-group :deep(.tao-spoiler) {\r\n border: none;\r\n border-radius: 0;\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-spoiler-group :deep(.tao-spoiler:last-child) {\r\n border-bottom: none;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoCopy' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n text: string;\r\n successMessage?: string;\r\n copyLabel?: string;\r\n /** Показать подсказку над кнопкой после копирования. */\r\n tip?: boolean;\r\n }>(),\r\n {\r\n successMessage: 'Скопировано!',\r\n copyLabel: 'Копировать',\r\n tip: true,\r\n },\r\n);\r\n\r\nconst copied = ref(false);\r\nconst triggerRef = ref<HTMLElement | null>(null);\r\nconst tipRef = ref<HTMLElement | null>(null);\r\nconst tipStyle = ref({ top: '0px', left: '0px' });\r\n\r\nlet hideTimer = 0;\r\nlet visibleObserver: IntersectionObserver | null = null;\r\n\r\nfunction hideTip() {\r\n copied.value = false;\r\n window.clearTimeout(hideTimer);\r\n hideTimer = 0;\r\n}\r\n\r\nfunction updateTipPosition() {\r\n const trigger = triggerRef.value;\r\n const tip = tipRef.value;\r\n if (!trigger || !tip) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n if (rect.width === 0 && rect.height === 0) {\r\n hideTip();\r\n return;\r\n }\r\n\r\n const gap = 8;\r\n const pad = 8;\r\n const width = tip.offsetWidth;\r\n const height = tip.offsetHeight;\r\n let left = rect.left + rect.width / 2 - width / 2;\r\n let top = rect.top - height - gap;\r\n\r\n if (left < pad) {\r\n left = pad;\r\n }\r\n if (left + width > window.innerWidth - pad) {\r\n left = window.innerWidth - pad - width;\r\n }\r\n if (top < pad) {\r\n top = rect.bottom + gap;\r\n }\r\n\r\n tipStyle.value = { top: `${top}px`, left: `${left}px` };\r\n}\r\n\r\nfunction bindTipGuards() {\r\n window.addEventListener('scroll', updateTipPosition, true);\r\n window.addEventListener('resize', updateTipPosition);\r\n}\r\n\r\nfunction unbindTipGuards() {\r\n window.removeEventListener('scroll', updateTipPosition, true);\r\n window.removeEventListener('resize', updateTipPosition);\r\n}\r\n\r\nasync function copy() {\r\n try {\r\n await navigator.clipboard.writeText(props.text);\r\n copied.value = true;\r\n window.clearTimeout(hideTimer);\r\n hideTimer = window.setTimeout(hideTip, 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n hideTip();\r\n }\r\n}\r\n\r\nwatch(copied, async (isCopied) => {\r\n if (!isCopied || !props.tip) {\r\n unbindTipGuards();\r\n return;\r\n }\r\n\r\n await nextTick();\r\n await nextTick();\r\n updateTipPosition();\r\n bindTipGuards();\r\n});\r\n\r\nonMounted(() => {\r\n visibleObserver = new IntersectionObserver((entries) => {\r\n if (entries.some((entry) => !entry.isIntersecting)) {\r\n hideTip();\r\n }\r\n });\r\n if (triggerRef.value) {\r\n visibleObserver.observe(triggerRef.value);\r\n }\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n hideTip();\r\n unbindTipGuards();\r\n visibleObserver?.disconnect();\r\n visibleObserver = null;\r\n});\r\n</script>\r\n\r\n<template>\r\n <span ref=\"triggerRef\" class=\"tao-copy\" :class=\"{ 'tao-copy--button': !$slots.default }\">\r\n <slot :copy=\"copy\" :copied=\"copied\">\r\n <button\r\n type=\"button\"\r\n class=\"tao-copy__button\"\r\n :class=\"{ 'tao-copy__button--copied': copied }\"\r\n :aria-label=\"copied ? successMessage : copyLabel\"\r\n @click=\"copy\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\r\n <rect\r\n x=\"8\"\r\n y=\"7\"\r\n width=\"12\"\r\n height=\"14\"\r\n rx=\"2\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M16 7V5a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h2\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n />\r\n </svg>\r\n </button>\r\n </slot>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"copied && tip && successMessage\"\r\n ref=\"tipRef\"\r\n class=\"tao-copy__tip\"\r\n role=\"status\"\r\n :style=\"tipStyle\"\r\n >\r\n {{ successMessage }}\r\n </div>\r\n </Teleport>\r\n </span>\r\n</template>\r\n\r\n<style>\r\n.tao-copy__tip {\r\n z-index: 1060;\r\n position: fixed;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n overflow: visible;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text-strong);\r\n font-size: var(--tao-font-size-xs);\r\n font-family: var(--tao-font-family);\r\n line-height: 1.3;\r\n white-space: nowrap;\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-lg);\r\n pointer-events: none;\r\n}\r\n\r\n.tao-copy__tip::after {\r\n content: '';\r\n position: absolute;\r\n top: 100%;\r\n left: 50%;\r\n width: 8px;\r\n height: 8px;\r\n margin-top: -4px;\r\n margin-left: -4px;\r\n background: var(--tao-color-surface-raised);\r\n transform: rotate(45deg);\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-copy {\r\n display: inline-flex;\r\n align-items: center;\r\n}\r\n\r\n.tao-copy--button {\r\n vertical-align: middle;\r\n}\r\n\r\n.tao-copy__button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n border-radius: var(--tao-radius-control);\r\n background: transparent;\r\n color: var(--tao-color-text-muted);\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-copy__button svg {\r\n display: block;\r\n}\r\n\r\n.tao-copy__button:hover {\r\n color: var(--tao-color-accent);\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-copy__button--copied {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-copy__button:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoContainer' });\r\n\r\ninterface Props {\r\n size?: 'wide' | 'slim' | 'ultra-slim';\r\n /** \"свободно\" болтается в разметке, без авто-центровки по горизонтали */\r\n free?: boolean;\r\n}\r\n\r\nwithDefaults(defineProps<Props>(), {\r\n size: 'wide',\r\n free: false,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-container\" :class=\"[`tao-container--${size}`, { 'tao-container--center': !free }]\">\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-container {\r\n width: 100%;\r\n}\r\n\r\n.tao-container--center {\r\n margin: 0 auto;\r\n}\r\n\r\n.tao-container--wide {\r\n max-width: 1120px;\r\n}\r\n\r\n.tao-container--slim {\r\n max-width: 500px;\r\n}\r\n\r\n.tao-container--ultra-slim {\r\n max-width: 400px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoFlex' });\r\n\r\ninterface Props {\r\n tag?: string;\r\n justify?: 'flex-start' | 'flex-end' | 'center' | 'normal' | 'space-between' | 'space-around' | 'space-evenly';\r\n align?: 'stretch' | 'flex-start' | 'center' | 'flex-end' | 'baseline';\r\n direction?: 'row' | 'row-reverse' | 'column' | 'column-reverse';\r\n wrap?: 'nowrap' | 'wrap' | 'wrap-reverse';\r\n gap?: string;\r\n}\r\n\r\nwithDefaults(defineProps<Props>(), {\r\n tag: 'div',\r\n justify: 'flex-start',\r\n align: 'stretch',\r\n direction: 'row',\r\n wrap: 'nowrap',\r\n gap: '0px',\r\n});\r\n</script>\r\n\r\n<template>\r\n <component\r\n :is=\"tag\"\r\n :style=\"{\r\n display: 'flex',\r\n justifyContent: justify,\r\n alignItems: align,\r\n flexDirection: direction,\r\n flexWrap: wrap,\r\n gap: gap,\r\n }\"\r\n >\r\n <slot />\r\n </component>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoSpace' });\r\n\r\ninterface Props {\r\n block?: boolean;\r\n expand?: boolean;\r\n vertical?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n block: false,\r\n expand: false,\r\n vertical: false,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-space\"\r\n :class=\"{ 'tao-space--vertical': props.vertical }\"\r\n :style=\"[props.block ? 'display: flex; flex-wrap: initial;' : '', props.expand ? 'width: 100%' : '']\"\r\n >\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-space {\r\n display: inline-flex;\r\n flex-wrap: wrap;\r\n column-gap: var(--tao-space-2);\r\n row-gap: var(--tao-space-2);\r\n}\r\n\r\n.tao-space--vertical {\r\n flex-direction: column;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoGrid' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Минимальная ширина плитки (auto-fill). Каталог. Игнорируется, если задан cols. */\r\n min?: string;\r\n /** Фиксированное число колонок (bento). 0 — режим min. */\r\n cols?: number;\r\n gap?: string;\r\n }>(),\r\n {\r\n min: '220px',\r\n cols: 0,\r\n gap: 'var(--tao-space-4)',\r\n },\r\n);\r\n\r\nconst isFixed = computed(() => props.cols > 0);\r\n\r\nconst gridStyle = computed(() => ({\r\n '--tao-grid-min': props.min,\r\n '--tao-grid-cols': isFixed.value ? String(props.cols) : undefined,\r\n '--tao-grid-gap': props.gap,\r\n}));\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-grid\"\r\n :class=\"{ 'tao-grid--fixed': isFixed }\"\r\n :style=\"gridStyle\"\r\n >\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-grid {\r\n container-type: inline-size;\r\n display: grid;\r\n grid-template-columns: repeat(\r\n auto-fill,\r\n minmax(min(100%, var(--tao-grid-min, 220px)), 1fr)\r\n );\r\n gap: var(--tao-grid-gap, var(--tao-space-4));\r\n}\r\n\r\n.tao-grid--fixed {\r\n grid-template-columns: repeat(var(--tao-grid-cols), minmax(0, 1fr));\r\n}\r\n\r\n@container (max-width: 560px) {\r\n .tao-grid--fixed {\r\n grid-template-columns: minmax(0, 1fr);\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoGridItem' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Сколько колонок занять. Для bento (`cols`), не для каталога (`min`). */\r\n col?: number;\r\n row?: number;\r\n }>(),\r\n {\r\n col: 1,\r\n row: 1,\r\n },\r\n);\r\n\r\nconst itemStyle = computed(() => ({\r\n '--tao-grid-col': String(Math.max(1, props.col)),\r\n '--tao-grid-row': String(Math.max(1, props.row)),\r\n}));\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-grid-item\" :style=\"itemStyle\">\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-grid-item {\r\n display: flex;\r\n flex-direction: column;\r\n min-width: 0;\r\n min-height: 0;\r\n grid-column: span var(--tao-grid-col, 1);\r\n grid-row: span var(--tao-grid-row, 1);\r\n}\r\n\r\n.tao-grid-item > * {\r\n flex: 1 1 auto;\r\n min-height: 0;\r\n width: 100%;\r\n}\r\n\r\n@container (max-width: 560px) {\r\n .tao-grid-item {\r\n grid-column: span 1;\r\n grid-row: span 1;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\r\nimport { listenFocusLoss } from '../focusLoss';\r\nimport type { TaoSplitDirection, TaoSplitUnit } from '../split';\r\n\r\ndefineOptions({ name: 'TaoSplit' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: number;\r\n direction?: TaoSplitDirection;\r\n unit?: TaoSplitUnit;\r\n min?: number;\r\n max?: number;\r\n minEnd?: number;\r\n resizable?: boolean;\r\n step?: number;\r\n }>(),\r\n {\r\n modelValue: 50,\r\n direction: 'row',\r\n unit: '%',\r\n min: 0,\r\n minEnd: 0,\r\n resizable: true,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number];\r\n}>();\r\n\r\nconst rootRef = ref<HTMLElement | null>(null);\r\nconst handleRef = ref<HTMLElement | null>(null);\r\nconst startPx = ref(0);\r\nconst available = ref(0);\r\nconst isDragging = ref(false);\r\n\r\nconst size = ref(props.modelValue);\r\n\r\nconst isRow = computed(() => props.direction === 'row');\r\nconst stepValue = computed(() => props.step ?? (props.unit === '%' ? 1 : 8));\r\nconst ariaOrientation = computed(() => (isRow.value ? 'vertical' : 'horizontal'));\r\n\r\nlet dragPointer = -1;\r\nlet dragStartPx = 0;\r\nlet dragStartCoord = 0;\r\nlet savedBodyCursor = '';\r\nlet savedHtmlCursor = '';\r\nlet savedUserSelect = '';\r\nlet resizeObserver: ResizeObserver | null = null;\r\nlet stopFocusLoss: (() => void) | undefined;\r\n\r\nfunction axisSize(el: HTMLElement) {\r\n const rect = el.getBoundingClientRect();\r\n return isRow.value ? rect.width : rect.height;\r\n}\r\n\r\nfunction measureAvailable() {\r\n if (!rootRef.value || !handleRef.value) {\r\n return 0;\r\n }\r\n return Math.max(0, axisSize(rootRef.value) - axisSize(handleRef.value));\r\n}\r\n\r\nfunction toPx(value: number, avail: number) {\r\n if (avail <= 0) {\r\n return 0;\r\n }\r\n return props.unit === '%' ? (value / 100) * avail : value;\r\n}\r\n\r\nfunction fromPx(px: number, avail: number) {\r\n if (props.unit === '%') {\r\n if (avail <= 0) {\r\n return 0;\r\n }\r\n return Math.round((px / avail) * 10000) / 100;\r\n }\r\n return Math.round(px);\r\n}\r\n\r\nfunction valuesEqual(a: number, b: number) {\r\n if (props.unit === '%') {\r\n return Math.abs(a - b) < 0.005;\r\n }\r\n return Math.round(a) === Math.round(b);\r\n}\r\n\r\nfunction clampStartPx(desiredPx: number, avail: number) {\r\n if (avail <= 0) {\r\n return 0;\r\n }\r\n\r\n const minStartPx = toPx(props.min, avail);\r\n const minEndPx = toPx(props.minEnd, avail);\r\n const maxStartPx = props.max != null ? toPx(props.max, avail) : Infinity;\r\n\r\n if (minStartPx + minEndPx > avail) {\r\n return Math.min(Math.max(desiredPx, 0), avail);\r\n }\r\n\r\n const lo = minStartPx;\r\n const hi = Math.min(maxStartPx, avail - minEndPx);\r\n return Math.min(Math.max(desiredPx, lo), Math.max(lo, hi));\r\n}\r\n\r\nfunction commit(next: number) {\r\n if (valuesEqual(next, size.value)) {\r\n size.value = next;\r\n return;\r\n }\r\n size.value = next;\r\n emit('update:modelValue', next);\r\n}\r\n\r\nfunction applyLayout(emitIfChanged: boolean) {\r\n const avail = measureAvailable();\r\n available.value = avail;\r\n const clamped = clampStartPx(toPx(size.value, avail), avail);\r\n startPx.value = clamped;\r\n const next = fromPx(clamped, avail);\r\n if (emitIfChanged) {\r\n commit(next);\r\n }\r\n}\r\n\r\nfunction isRtl() {\r\n return !!rootRef.value && getComputedStyle(rootRef.value).direction === 'rtl';\r\n}\r\n\r\nfunction applyDragCursor() {\r\n savedBodyCursor = document.body.style.cursor;\r\n savedHtmlCursor = document.documentElement.style.cursor;\r\n savedUserSelect = document.body.style.userSelect;\r\n const cursor = isRow.value ? 'col-resize' : 'row-resize';\r\n document.body.style.cursor = cursor;\r\n document.documentElement.style.cursor = cursor;\r\n document.body.style.userSelect = 'none';\r\n}\r\n\r\nfunction restoreDragCursor() {\r\n document.body.style.cursor = savedBodyCursor;\r\n document.documentElement.style.cursor = savedHtmlCursor;\r\n document.body.style.userSelect = savedUserSelect;\r\n}\r\n\r\nfunction releaseDragCapture() {\r\n const el = handleRef.value;\r\n const id = dragPointer;\r\n if (!el || id === -1) {\r\n return;\r\n }\r\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\r\n return;\r\n }\r\n try {\r\n el.releasePointerCapture(id);\r\n } catch {\r\n /* already released by the browser */\r\n }\r\n}\r\n\r\nfunction endDrag() {\r\n if (!isDragging.value) {\r\n return;\r\n }\r\n isDragging.value = false;\r\n releaseDragCapture();\r\n dragPointer = -1;\r\n restoreDragCursor();\r\n applyLayout(true);\r\n}\r\n\r\nfunction setStartFromDelta(delta: number) {\r\n const avail = measureAvailable();\r\n available.value = avail;\r\n const nextPx = clampStartPx(dragStartPx + delta, avail);\r\n startPx.value = nextPx;\r\n commit(fromPx(nextPx, avail));\r\n}\r\n\r\nfunction onPointerDown(event: PointerEvent) {\r\n if (!props.resizable || event.button !== 0 || !handleRef.value) {\r\n return;\r\n }\r\n\r\n dragPointer = event.pointerId;\r\n isDragging.value = true;\r\n dragStartPx = startPx.value;\r\n dragStartCoord = isRow.value ? event.clientX : event.clientY;\r\n applyDragCursor();\r\n event.preventDefault();\r\n try {\r\n handleRef.value.setPointerCapture(event.pointerId);\r\n } catch {\r\n /* untrusted events / capture already gone */\r\n }\r\n}\r\n\r\nfunction onPointerMove(event: PointerEvent) {\r\n if (!isDragging.value || event.pointerId !== dragPointer) {\r\n return;\r\n }\r\n const coord = isRow.value ? event.clientX : event.clientY;\r\n let delta = coord - dragStartCoord;\r\n if (isRow.value && isRtl()) {\r\n delta = -delta;\r\n }\r\n setStartFromDelta(delta);\r\n}\r\n\r\nfunction onPointerEnd(event: PointerEvent) {\r\n if (!isDragging.value) {\r\n return;\r\n }\r\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\r\n return;\r\n }\r\n endDrag();\r\n}\r\n\r\nfunction onLostPointerCapture() {\r\n endDrag();\r\n}\r\n\r\nfunction ariaMax() {\r\n const avail = available.value;\r\n if (avail <= 0) {\r\n return props.max ?? (props.unit === '%' ? 100 - props.minEnd : 0);\r\n }\r\n const maxByEnd = fromPx(Math.max(0, avail - toPx(props.minEnd, avail)), avail);\r\n if (props.max == null) {\r\n return maxByEnd;\r\n }\r\n return Math.min(props.max, maxByEnd);\r\n}\r\n\r\nconst ariaValueMin = computed(() => props.min);\r\nconst ariaValueMax = computed(() => ariaMax());\r\nconst ariaValueNow = computed(() => size.value);\r\nconst ariaValueText = computed(() => (props.unit === '%' ? `${size.value}%` : `${Math.round(size.value)}px`));\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (!props.resizable) {\r\n return;\r\n }\r\n\r\n const avail = measureAvailable();\r\n available.value = avail;\r\n\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n const nextPx = clampStartPx(toPx(props.min, avail), avail);\r\n startPx.value = nextPx;\r\n commit(fromPx(nextPx, avail));\r\n return;\r\n }\r\n\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n const nextPx = clampStartPx(toPx(ariaMax(), avail), avail);\r\n startPx.value = nextPx;\r\n commit(fromPx(nextPx, avail));\r\n return;\r\n }\r\n\r\n const primary =\r\n (isRow.value && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) ||\r\n (!isRow.value && (event.key === 'ArrowUp' || event.key === 'ArrowDown'));\r\n const secondary =\r\n (isRow.value && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) ||\r\n (!isRow.value && (event.key === 'ArrowLeft' || event.key === 'ArrowRight'));\r\n\r\n if (!primary && !secondary) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n let dir = event.key === 'ArrowRight' || event.key === 'ArrowDown' ? 1 : -1;\r\n if (isRow.value && isRtl() && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {\r\n dir = -dir;\r\n }\r\n\r\n const nextModel = size.value + dir * stepValue.value;\r\n const nextPx = clampStartPx(toPx(nextModel, avail), avail);\r\n startPx.value = nextPx;\r\n commit(fromPx(nextPx, avail));\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n value => {\r\n if (isDragging.value) {\r\n return;\r\n }\r\n if (!valuesEqual(value, size.value)) {\r\n size.value = value;\r\n applyLayout(false);\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => [props.unit, props.direction, props.min, props.max, props.minEnd, props.resizable] as const,\r\n () => {\r\n if (!isDragging.value) {\r\n applyLayout(true);\r\n }\r\n },\r\n);\r\n\r\nonMounted(() => {\r\n applyLayout(false);\r\n resizeObserver = new ResizeObserver(() => {\r\n if (isDragging.value) {\r\n return;\r\n }\r\n applyLayout(true);\r\n });\r\n if (rootRef.value) {\r\n resizeObserver.observe(rootRef.value);\r\n }\r\n stopFocusLoss = listenFocusLoss(endDrag);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n endDrag();\r\n resizeObserver?.disconnect();\r\n resizeObserver = null;\r\n stopFocusLoss?.();\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"rootRef\"\r\n class=\"tao-split\"\r\n :class=\"[\r\n `tao-split--${direction}`,\r\n {\r\n 'tao-split--fixed': !resizable,\r\n 'tao-split--dragging': isDragging,\r\n },\r\n ]\"\r\n :style=\"{ '--tao-split-start': `${startPx}px` }\"\r\n >\r\n <div class=\"tao-split__pane tao-split__pane--start\">\r\n <slot name=\"start\" />\r\n </div>\r\n <div\r\n ref=\"handleRef\"\r\n class=\"tao-split__handle\"\r\n role=\"separator\"\r\n :aria-orientation=\"ariaOrientation\"\r\n :aria-valuemin=\"ariaValueMin\"\r\n :aria-valuemax=\"ariaValueMax\"\r\n :aria-valuenow=\"ariaValueNow\"\r\n :aria-valuetext=\"ariaValueText\"\r\n :aria-disabled=\"resizable ? undefined : true\"\r\n :tabindex=\"resizable ? 0 : -1\"\r\n @pointerdown=\"onPointerDown\"\r\n @pointermove=\"onPointerMove\"\r\n @pointerup=\"onPointerEnd\"\r\n @pointercancel=\"onPointerEnd\"\r\n @lostpointercapture=\"onLostPointerCapture\"\r\n @keydown=\"onKeydown\"\r\n @dragstart.prevent\r\n />\r\n <div class=\"tao-split__pane tao-split__pane--end\">\r\n <slot name=\"end\" />\r\n </div>\r\n <div v-if=\"isDragging\" class=\"tao-split__shield\" />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-split {\r\n --tao-split-gutter: 8px;\r\n --tao-split-line: 1px;\r\n --tao-split-start: 50%;\r\n\r\n position: relative;\r\n display: flex;\r\n width: 100%;\r\n height: 100%;\r\n min-width: 0;\r\n min-height: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.tao-split--row {\r\n flex-direction: row;\r\n}\r\n\r\n.tao-split--column {\r\n flex-direction: column;\r\n}\r\n\r\n.tao-split__pane {\r\n min-width: 0;\r\n min-height: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.tao-split__pane--start {\r\n flex: 0 0 var(--tao-split-start);\r\n}\r\n\r\n.tao-split__pane--end {\r\n flex: 1 1 0%;\r\n}\r\n\r\n.tao-split__pane > :deep(.tao-split) {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.tao-split__handle {\r\n position: relative;\r\n flex: 0 0 var(--tao-split-gutter);\r\n z-index: 1;\r\n touch-action: none;\r\n user-select: none;\r\n background: transparent;\r\n}\r\n\r\n.tao-split--row > .tao-split__handle {\r\n cursor: col-resize;\r\n}\r\n\r\n.tao-split--column > .tao-split__handle {\r\n cursor: row-resize;\r\n}\r\n\r\n.tao-split--fixed > .tao-split__handle {\r\n cursor: default;\r\n}\r\n\r\n.tao-split__handle::before {\r\n content: '';\r\n position: absolute;\r\n background: var(--tao-color-border);\r\n pointer-events: none;\r\n}\r\n\r\n.tao-split--row > .tao-split__handle::before {\r\n top: 0;\r\n bottom: 0;\r\n left: 50%;\r\n width: var(--tao-split-line);\r\n transform: translateX(-50%);\r\n}\r\n\r\n.tao-split--column > .tao-split__handle::before {\r\n right: 0;\r\n left: 0;\r\n top: 50%;\r\n height: var(--tao-split-line);\r\n transform: translateY(-50%);\r\n}\r\n\r\n.tao-split__handle:hover::before,\r\n.tao-split__handle:focus-visible::before,\r\n.tao-split--dragging > .tao-split__handle::before {\r\n background: var(--tao-color-accent);\r\n}\r\n\r\n.tao-split--fixed > .tao-split__handle:hover::before {\r\n background: var(--tao-color-border);\r\n}\r\n\r\n.tao-split__handle:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-split__handle:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: -2px;\r\n}\r\n\r\n.tao-split__shield {\r\n position: absolute;\r\n inset: 0;\r\n z-index: 2;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoIcon' });\r\n\r\ninterface Props {\r\n name: string;\r\n margin?: string;\r\n size?: number;\r\n invert?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n margin: '0px',\r\n});\r\n</script>\r\n\r\n<template>\r\n <span class=\"tao-icon\">\r\n <slot name=\"prefix\" />\r\n <i\r\n class=\"tao-icon__value\"\r\n :class=\"[`icon-${props.name}`, { 'tao-icon__value--invert': props.invert }]\"\r\n :style=\"props.size ? `font-size: ${props.size}px` : ''\"\r\n />\r\n <slot name=\"postfix\" />\r\n </span>\r\n</template>\r\n\r\n<style scoped>\r\n/**\r\n * TaoIcon рендерит класс icon-<name> и полагается на внешний icon-шрифт,\r\n * который нужно подключить в проекте самостоятельно — библиотека Tao\r\n * его не поставляет. Это осознанное соглашение (см. README).\r\n */\r\n.tao-icon {\r\n display: inline-flex;\r\n}\r\n\r\n.tao-icon__value {\r\n margin: v-bind('props.margin');\r\n}\r\n\r\n.tao-icon__value--invert {\r\n filter: invert();\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoLoader' });\r\n\r\ninterface Props {\r\n color?: string;\r\n size?: number | string;\r\n inline?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n color: 'var(--tao-color-accent)',\r\n size: 80,\r\n inline: false,\r\n});\r\n\r\nconst normalizedSize = computed(() => {\r\n if (typeof props.size === 'number') {\r\n return `${props.size}px`;\r\n }\r\n return props.size;\r\n});\r\n\r\nconst dotSizeNumber = computed(() => {\r\n const baseSize = typeof props.size === 'number' ? props.size : parseInt(props.size, 10) || 80;\r\n return baseSize * 0.1625;\r\n});\r\n\r\nconst dotSize = computed(() => `${dotSizeNumber.value}px`);\r\n\r\nconst positions = computed(() => {\r\n const baseSize = typeof props.size === 'number' ? props.size : parseInt(props.size, 10) || 80;\r\n return {\r\n first: `${baseSize * 0.1}px`,\r\n third: `${baseSize * 0.4}px`,\r\n fourth: `${baseSize * 0.7}px`,\r\n animationDistance: `${baseSize * 0.3}px`,\r\n };\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-loader\" :class=\"{ 'tao-loader--inline': props.inline }\">\r\n <div\r\n class=\"tao-loader__ellipsis\"\r\n :style=\"{ width: normalizedSize, height: dotSize, marginLeft: `-${dotSizeNumber / 2}px` }\"\r\n >\r\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\r\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\r\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\r\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-loader {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n text-align: center;\r\n}\r\n\r\n.tao-loader--inline {\r\n display: inline-block;\r\n width: 30px;\r\n}\r\n\r\n.tao-loader__ellipsis {\r\n display: block;\r\n position: relative;\r\n}\r\n\r\n.tao-loader__ellipsis div {\r\n position: absolute;\r\n top: 0;\r\n border-radius: var(--tao-radius-full);\r\n animation-timing-function: cubic-bezier(0, 1, 1, 0);\r\n}\r\n\r\n.tao-loader__ellipsis div:nth-child(1) {\r\n left: v-bind('positions.first');\r\n animation: tao-loader-grow 0.6s infinite;\r\n}\r\n\r\n.tao-loader__ellipsis div:nth-child(2) {\r\n left: v-bind('positions.first');\r\n animation: tao-loader-move 0.6s infinite;\r\n}\r\n\r\n.tao-loader__ellipsis div:nth-child(3) {\r\n left: v-bind('positions.third');\r\n animation: tao-loader-move 0.6s infinite;\r\n}\r\n\r\n.tao-loader__ellipsis div:nth-child(4) {\r\n left: v-bind('positions.fourth');\r\n animation: tao-loader-shrink 0.6s infinite;\r\n}\r\n\r\n@keyframes tao-loader-grow {\r\n 0% { transform: scale(0); }\r\n 100% { transform: scale(1); }\r\n}\r\n\r\n@keyframes tao-loader-shrink {\r\n 0% { transform: scale(1); }\r\n 100% { transform: scale(0); }\r\n}\r\n\r\n@keyframes tao-loader-move {\r\n 0% { transform: translate(0, 0); }\r\n 100% { transform: translate(v-bind('positions.animationDistance'), 0); }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, watch } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoImage' });\r\n\r\ninterface Props {\r\n src: string;\r\n alt?: string;\r\n pixelated?: boolean;\r\n /** Нативный `loading=\"lazy\"`. По умолчанию выкл — как обычный `<img>`. */\r\n lazy?: boolean;\r\n placeholderText?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n src: '',\r\n alt: '',\r\n pixelated: false,\r\n lazy: false,\r\n placeholderText: 'No image available',\r\n});\r\n\r\nconst emit = defineEmits(['load', 'error']);\r\n\r\nconst isLoaded = ref(false);\r\nconst hasError = ref(false);\r\n\r\nfunction handleLoad() {\r\n isLoaded.value = true;\r\n hasError.value = false;\r\n emit('load');\r\n}\r\n\r\nfunction handleError() {\r\n isLoaded.value = false;\r\n hasError.value = true;\r\n emit('error');\r\n}\r\n\r\nwatch(() => props.src, () => {\r\n isLoaded.value = false;\r\n hasError.value = false;\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-image\">\r\n <img\r\n v-if=\"src && !hasError\"\r\n :class=\"{ 'tao-image__img--hidden': !isLoaded, 'tao-image__img--pixelated': props.pixelated }\"\r\n :src=\"src\"\r\n :alt=\"alt\"\r\n :loading=\"lazy ? 'lazy' : 'eager'\"\r\n decoding=\"async\"\r\n draggable=\"false\"\r\n @load=\"handleLoad\"\r\n @error=\"handleError\"\r\n />\r\n <template v-if=\"!src || hasError\">\r\n <slot>\r\n <div class=\"tao-image__placeholder\">{{ placeholderText }}</div>\r\n </slot>\r\n </template>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-image {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n user-select: none;\r\n}\r\n\r\n.tao-image img {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n transition: opacity var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-image__img--hidden {\r\n opacity: 0;\r\n}\r\n\r\n.tao-image__img--pixelated {\r\n image-rendering: optimizeSpeed;\r\n image-rendering: -moz-crisp-edges;\r\n image-rendering: -o-crisp-edges;\r\n image-rendering: -webkit-optimize-contrast;\r\n image-rendering: pixelated;\r\n image-rendering: optimize-contrast;\r\n -ms-interpolation-mode: nearest-neighbor;\r\n}\r\n\r\n.tao-image__placeholder {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n font-size: var(--tao-font-size-sm);\r\n font-family: var(--tao-font-family);\r\n letter-spacing: 0.01rem;\r\n text-align: center;\r\n color: var(--tao-color-text-muted);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoCheckbox' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value?: boolean;\r\n modelValue?: boolean;\r\n label?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n /** Частично выбран: черта вместо квадрата. Клик ставит checked — indeterminate снимает родитель. */\r\n indeterminate?: boolean;\r\n }>(),\r\n {\r\n value: undefined,\r\n modelValue: undefined,\r\n label: '',\r\n disabled: false,\r\n error: false,\r\n indeterminate: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: boolean];\r\n change: [value: boolean];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst isChecked = computed({\r\n get: () => {\r\n if (props.modelValue !== undefined) {\r\n return props.modelValue;\r\n }\r\n return Boolean(props.value);\r\n },\r\n set: (next) => {\r\n emit('update:modelValue', next);\r\n emit('change', next);\r\n },\r\n});\r\n\r\nfunction onInputChange(event: Event) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n const target = event.target as HTMLInputElement;\r\n isChecked.value = target.checked;\r\n}\r\n\r\nconst inputRef = ref<HTMLInputElement | null>(null);\r\n\r\nwatch(\r\n [inputRef, isChecked, () => props.indeterminate],\r\n () => {\r\n const el = inputRef.value;\r\n if (!el) {\r\n return;\r\n }\r\n el.checked = isChecked.value;\r\n el.indeterminate = Boolean(props.indeterminate);\r\n },\r\n { flush: 'post' },\r\n);\r\n</script>\r\n\r\n<template>\r\n <label class=\"tao-checkbox\" :class=\"{ 'tao-checkbox--disabled': disabled }\" :for=\"controlId\">\r\n <slot name=\"pre\" :text=\"label\" />\r\n\r\n <input\r\n :id=\"controlId\"\r\n ref=\"inputRef\"\r\n class=\"tao-checkbox__input tao-sr-only\"\r\n type=\"checkbox\"\r\n :checked=\"isChecked\"\r\n :disabled=\"disabled\"\r\n :aria-checked=\"indeterminate ? 'mixed' : undefined\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n @change=\"onInputChange\"\r\n />\r\n\r\n <span class=\"tao-checkbox__box\"></span>\r\n <span v-if=\"label\" class=\"tao-checkbox__label\">{{ label }}</span>\r\n <span v-else class=\"tao-checkbox__label\"><slot /></span>\r\n\r\n <slot name=\"post\" :text=\"label\" />\r\n </label>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-checkbox {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n cursor: pointer;\r\n user-select: none;\r\n font-size: var(--tao-font-size-lg);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-checkbox__box {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n pointer-events: none;\r\n background-color: var(--tao-color-surface-raised);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-sm);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-checkbox__box::after {\r\n content: '';\r\n display: block;\r\n width: 12px;\r\n height: 12px;\r\n background-color: transparent;\r\n border-radius: 2px;\r\n transform: scale(0);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-checkbox__label {\r\n font-size: var(--tao-font-size-sm);\r\n white-space: nowrap;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-checkbox--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n.tao-checkbox__input:checked + .tao-checkbox__box,\r\n.tao-checkbox__input:indeterminate + .tao-checkbox__box {\r\n border-color: var(--tao-color-accent);\r\n background-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-checkbox__input:checked + .tao-checkbox__box::after {\r\n background-color: var(--tao-color-on-accent);\r\n transform: scale(1);\r\n}\r\n\r\n.tao-checkbox__input:indeterminate + .tao-checkbox__box::after {\r\n width: 10px;\r\n height: 2px;\r\n border-radius: 1px;\r\n background-color: var(--tao-color-on-accent);\r\n transform: scale(1);\r\n}\r\n\r\n.tao-checkbox__input:focus-visible + .tao-checkbox__box {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.tao-checkbox__input[aria-invalid='true'] + .tao-checkbox__box {\r\n border-color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, useSlots } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoTag' });\r\n\r\ninterface Props {\r\n type?: 'neutral' | 'success' | 'danger' | 'error' | 'warning' | 'info' | '';\r\n color?: string;\r\n background?: string;\r\n borderColor?: string;\r\n pointer?: boolean;\r\n closable?: boolean;\r\n closeLabel?: string;\r\n /** Без рамки, заливка остаётся. Высота как у обычного тега. */\r\n flat?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: '',\r\n pointer: false,\r\n closable: false,\r\n closeLabel: 'Убрать',\r\n flat: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n close: [event: MouseEvent];\r\n}>();\r\n\r\nconst slots = useSlots();\r\nconst tone = computed(() => (props.type === 'error' ? 'danger' : props.type));\r\nconst style = computed(() => ({\r\n color: props.color || '',\r\n background: props.background || '',\r\n 'border-color': props.flat ? 'transparent' : props.borderColor || '',\r\n}));\r\n\r\nfunction onClose(event: MouseEvent) {\r\n emit('close', event);\r\n}\r\n</script>\r\n\r\n<template>\r\n <span\r\n class=\"tao-tag\"\r\n :class=\"[\r\n tone ? `tao-tag--${tone}` : '',\r\n {\r\n 'tao-tag--pointer': pointer,\r\n 'tao-tag--closable': closable,\r\n 'tao-tag--prefix': Boolean(slots.prefix),\r\n 'tao-tag--flat': flat,\r\n },\r\n ]\"\r\n :style=\"style\"\r\n >\r\n <span v-if=\"$slots.prefix\" class=\"tao-tag__prefix\">\r\n <slot name=\"prefix\" />\r\n </span>\r\n <span class=\"tao-tag__text\"><slot /></span>\r\n <button\r\n v-if=\"closable\"\r\n type=\"button\"\r\n class=\"tao-tag__close\"\r\n :aria-label=\"closeLabel\"\r\n @click.stop=\"onClose\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"close-icon\">✕</slot>\r\n </span>\r\n </button>\r\n </span>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-tag {\r\n box-sizing: border-box;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n max-width: 100%;\r\n height: auto;\r\n margin: 0;\r\n padding: 1px var(--tao-space-2);\r\n vertical-align: middle;\r\n white-space: nowrap;\r\n text-align: start;\r\n font-size: var(--tao-font-size-xs);\r\n line-height: 1.25;\r\n color: var(--tao-color-accent);\r\n background: var(--tao-color-accent-subtle);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-sm);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-tag--pointer {\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.tao-tag--prefix {\r\n padding-block: 2px;\r\n padding-inline-start: 3px;\r\n}\r\n\r\n.tao-tag--closable {\r\n padding-inline-end: 2px;\r\n}\r\n\r\n.tao-tag__prefix {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.tao-tag__prefix :deep(.tao-avatar) {\r\n display: block;\r\n}\r\n\r\n.tao-tag__text {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.tao-tag__close {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n border-radius: var(--tao-radius-full);\r\n background: transparent;\r\n color: currentColor;\r\n opacity: 0.72;\r\n font-family: inherit;\r\n font-size: 11px;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-tag__close:hover {\r\n opacity: 1;\r\n background: color-mix(in srgb, currentColor 14%, transparent);\r\n}\r\n\r\n.tao-tag__close:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.tao-tag--neutral {\r\n color: var(--tao-color-text);\r\n background: var(--tao-color-surface-sunken);\r\n border-color: var(--tao-color-border-strong);\r\n}\r\n\r\n.tao-tag--success {\r\n color: var(--tao-color-success);\r\n background: color-mix(in srgb, var(--tao-color-success) 12%, transparent);\r\n border-color: color-mix(in srgb, var(--tao-color-success) 30%, transparent);\r\n}\r\n\r\n.tao-tag--danger,\r\n.tao-tag--error {\r\n color: var(--tao-color-danger);\r\n background: var(--tao-color-danger-subtle);\r\n border-color: color-mix(in srgb, var(--tao-color-danger) 30%, transparent);\r\n}\r\n\r\n.tao-tag--warning {\r\n color: var(--tao-color-warning);\r\n background: var(--tao-color-warning-subtle);\r\n border-color: color-mix(in srgb, var(--tao-color-warning) 30%, transparent);\r\n}\r\n\r\n.tao-tag--info {\r\n color: var(--tao-color-info);\r\n background: var(--tao-color-info-subtle);\r\n border-color: color-mix(in srgb, var(--tao-color-info) 30%, transparent);\r\n}\r\n\r\n.tao-tag--flat,\r\n.tao-tag--flat.tao-tag--neutral,\r\n.tao-tag--flat.tao-tag--success,\r\n.tao-tag--flat.tao-tag--danger,\r\n.tao-tag--flat.tao-tag--error,\r\n.tao-tag--flat.tao-tag--warning,\r\n.tao-tag--flat.tao-tag--info {\r\n border-color: transparent;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, useSlots } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoDivider' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** `solid` — обычная линия. `dashed` — пунктир. `colored` — акцент. `gap` — пустой отступ. */\r\n variant?: 'solid' | 'dashed' | 'colored' | 'gap';\r\n size?: 'small' | 'medium' | 'large' | 'big';\r\n /** Подпись посередине. Не меняет стиль линии — для этого `variant`. */\r\n text?: string;\r\n /** Плавные края линии. У `gap` ничего не делает. */\r\n fade?: boolean;\r\n }>(),\r\n {\r\n variant: 'solid',\r\n size: 'medium',\r\n text: '',\r\n fade: false,\r\n },\r\n);\r\n\r\nconst slots = useSlots();\r\nconst gapSize = computed(() => (props.size === 'big' ? 'large' : props.size));\r\nconst hasLabel = computed(() => Boolean(props.text) || Boolean(slots.default));\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-divider\"\r\n :class=\"[\r\n `tao-divider--${variant}`,\r\n {\r\n 'tao-divider--labeled': hasLabel,\r\n 'tao-divider--fade': fade && variant !== 'gap',\r\n [`tao-divider--gap-${gapSize}`]: variant === 'gap',\r\n },\r\n ]\"\r\n :role=\"variant === 'gap' && !hasLabel ? undefined : 'separator'\"\r\n :aria-hidden=\"variant === 'gap' && !hasLabel ? true : undefined\"\r\n >\r\n <span\r\n v-if=\"variant !== 'gap'\"\r\n class=\"tao-divider__line\"\r\n :class=\"{ 'tao-divider__line--start': hasLabel }\"\r\n />\r\n <span v-if=\"hasLabel\" class=\"tao-divider__text\">\r\n <slot>{{ text }}</slot>\r\n </span>\r\n <span\r\n v-if=\"variant !== 'gap' && hasLabel\"\r\n class=\"tao-divider__line tao-divider__line--end\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-divider {\r\n margin: var(--tao-space-5) 0;\r\n}\r\n\r\n.tao-divider--labeled {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.tao-divider__line {\r\n box-sizing: content-box;\r\n display: block;\r\n height: 0;\r\n min-width: 0;\r\n}\r\n\r\n.tao-divider--labeled .tao-divider__line {\r\n flex: 1;\r\n}\r\n\r\n.tao-divider:not(.tao-divider--labeled) .tao-divider__line {\r\n width: 100%;\r\n}\r\n\r\n.tao-divider__text {\r\n margin: 0 var(--tao-space-4);\r\n font-size: var(--tao-font-size-xs);\r\n font-weight: 500;\r\n line-height: 1;\r\n white-space: nowrap;\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-divider--labeled:not(.tao-divider--gap) .tao-divider__text {\r\n height: 1px;\r\n display: flex;\r\n align-items: center;\r\n overflow: visible;\r\n}\r\n\r\n.tao-divider--solid .tao-divider__line,\r\n.tao-divider--dashed .tao-divider__line {\r\n opacity: 0.2;\r\n}\r\n\r\n.tao-divider--solid .tao-divider__line {\r\n border-top: 1px solid var(--tao-gray-300);\r\n}\r\n\r\n.tao-divider--dashed .tao-divider__line {\r\n border-top: 1px dashed var(--tao-gray-300);\r\n}\r\n\r\n.tao-divider--colored .tao-divider__line {\r\n height: 1px;\r\n background: var(--tao-color-accent);\r\n}\r\n\r\n.tao-divider--colored.tao-divider--fade:not(.tao-divider--labeled) .tao-divider__line {\r\n background: linear-gradient(to right, transparent, var(--tao-color-accent), transparent);\r\n}\r\n\r\n.tao-divider--colored.tao-divider--fade.tao-divider--labeled .tao-divider__line--start {\r\n background: linear-gradient(to right, transparent, var(--tao-color-accent));\r\n}\r\n\r\n.tao-divider--colored.tao-divider--fade.tao-divider--labeled .tao-divider__line--end {\r\n background: linear-gradient(to left, transparent, var(--tao-color-accent));\r\n}\r\n\r\n.tao-divider--fade:not(.tao-divider--colored):not(.tao-divider--labeled) .tao-divider__line {\r\n mask: linear-gradient(90deg, transparent 0%, black 20%, black 80%, transparent 100%);\r\n}\r\n\r\n.tao-divider--fade:not(.tao-divider--colored) .tao-divider__line--start {\r\n mask: linear-gradient(90deg, transparent 0%, black 30%);\r\n}\r\n\r\n.tao-divider--fade:not(.tao-divider--colored) .tao-divider__line--end {\r\n mask: linear-gradient(90deg, black 70%, transparent 100%);\r\n}\r\n\r\n.tao-divider--gap {\r\n margin: 0;\r\n}\r\n\r\n.tao-divider--gap:not(.tao-divider--labeled) {\r\n height: 40px;\r\n}\r\n\r\n.tao-divider--gap-small:not(.tao-divider--labeled) {\r\n height: 20px;\r\n}\r\n\r\n.tao-divider--gap-large:not(.tao-divider--labeled),\r\n.tao-divider--gap-big:not(.tao-divider--labeled) {\r\n height: 60px;\r\n}\r\n\r\n.tao-divider--gap.tao-divider--labeled {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 40px;\r\n}\r\n\r\n.tao-divider--gap-small.tao-divider--labeled {\r\n min-height: 20px;\r\n}\r\n\r\n.tao-divider--gap-large.tao-divider--labeled,\r\n.tao-divider--gap-big.tao-divider--labeled {\r\n min-height: 60px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoFieldset' });\r\n\r\nwithDefaults(\r\n defineProps<{\r\n legend?: string;\r\n /** Подпись на верхней рамке. */\r\n align?: 'start' | 'center' | 'end';\r\n }>(),\r\n {\r\n legend: '',\r\n align: 'start',\r\n },\r\n);\r\n</script>\r\n\r\n<template>\r\n <fieldset class=\"tao-fieldset\" :class=\"`tao-fieldset--${align}`\">\r\n <legend v-if=\"legend || $slots.legend\" class=\"tao-fieldset__legend\">\r\n <slot name=\"legend\">{{ legend }}</slot>\r\n </legend>\r\n <div class=\"tao-fieldset__body\">\r\n <slot />\r\n </div>\r\n </fieldset>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-fieldset {\r\n margin: 0;\r\n min-width: 0;\r\n padding: 0 var(--tao-space-4) var(--tao-space-4);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-panel);\r\n color: var(--tao-color-text);\r\n background: transparent;\r\n}\r\n\r\n.tao-fieldset__legend {\r\n padding: 0 var(--tao-space-2);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 500;\r\n color: var(--tao-color-text);\r\n background: var(--tao-color-bg);\r\n}\r\n\r\n.tao-fieldset--start .tao-fieldset__legend {\r\n margin-inline-start: var(--tao-space-2);\r\n}\r\n\r\n.tao-fieldset--center .tao-fieldset__legend {\r\n margin-inline: auto;\r\n}\r\n\r\n.tao-fieldset--end .tao-fieldset__legend {\r\n margin-inline-start: auto;\r\n margin-inline-end: var(--tao-space-2);\r\n}\r\n\r\n.tao-fieldset__body {\r\n padding-top: var(--tao-space-3);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoAnimatedBorder' });\r\n\r\ninterface Props {\r\n borderWidth?: number;\r\n speed?: number;\r\n /** Радиус размытия glow-эффекта позади рамки, px. Работает только при light. */\r\n glow?: number;\r\n /** Добавляет мягкое свечение вокруг рамки. По умолчанию выключено —\r\n * компонент остаётся именно рамкой (переливается только контур),\r\n * без \"света\", выходящего за её пределы. */\r\n light?: boolean;\r\n}\r\n\r\nwithDefaults(defineProps<Props>(), {\r\n borderWidth: 3,\r\n speed: 6,\r\n glow: 16,\r\n light: false,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-animated-border\"\r\n :class=\"{ 'tao-animated-border--light': light }\"\r\n :style=\"{\r\n '--tao-animated-border-width': `${borderWidth}px`,\r\n '--tao-animated-border-speed': `${speed}s`,\r\n '--tao-animated-border-glow': `${glow}px`,\r\n }\"\r\n >\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-animated-border {\r\n background: var(--tao-color-surface-raised);\r\n position: relative;\r\n z-index: 0;\r\n border-radius: var(--tao-animated-border-width);\r\n}\r\n\r\n/* Размытая копия рамки позади — даёт эффект свечения (glow).\r\n Рендерится только при light: по умолчанию компонент — просто\r\n переливающийся контур, без сияния, выходящего за его пределы. */\r\n.tao-animated-border--light::before {\r\n content: '';\r\n position: absolute;\r\n inset: calc(-1 * var(--tao-animated-border-width));\r\n background: linear-gradient(60deg, #f79533, #f37055, #ef4e7b, #a166ab, #5073b8, #1098ad, #07b39b, #6fba82);\r\n background-size: 300% 300%;\r\n border-radius: calc(2 * var(--tao-animated-border-width));\r\n filter: blur(var(--tao-animated-border-glow));\r\n opacity: 0.65;\r\n z-index: -2;\r\n animation: tao-animated-border-gradient var(--tao-animated-border-speed) ease alternate infinite;\r\n}\r\n\r\n/* Сама рамка: заливка на всю область, но CSS mask вырезает внутреннюю\r\n часть — остаётся только полоса шириной borderWidth по периметру,\r\n поэтому получается контур, а не закрашенный прямоугольник. */\r\n.tao-animated-border::after {\r\n content: '';\r\n position: absolute;\r\n inset: calc(-1 * var(--tao-animated-border-width));\r\n background: linear-gradient(60deg, #f79533, #f37055, #ef4e7b, #a166ab, #5073b8, #1098ad, #07b39b, #6fba82);\r\n background-size: 300% 300%;\r\n border-radius: calc(2 * var(--tao-animated-border-width));\r\n padding: var(--tao-animated-border-width);\r\n -webkit-mask:\r\n linear-gradient(#000 0 0) content-box,\r\n linear-gradient(#000 0 0);\r\n -webkit-mask-composite: xor;\r\n mask:\r\n linear-gradient(#000 0 0) content-box,\r\n linear-gradient(#000 0 0);\r\n mask-composite: exclude;\r\n z-index: -1;\r\n animation: tao-animated-border-gradient var(--tao-animated-border-speed) ease alternate infinite;\r\n}\r\n\r\n@keyframes tao-animated-border-gradient {\r\n 0% {\r\n background-position: 0% 50%;\r\n }\r\n 50% {\r\n background-position: 100% 50%;\r\n }\r\n 100% {\r\n background-position: 0% 50%;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onMounted, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoTextarea' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n placeholder?: string;\r\n spellcheck?: boolean;\r\n autocomplete?: string;\r\n minlength?: number;\r\n maxlength?: number;\r\n disabled?: boolean;\r\n noSpace?: boolean;\r\n dummy?: boolean;\r\n rows?: number;\r\n resize?: boolean;\r\n modelValue?: string;\r\n noBorder?: boolean;\r\n noBackground?: boolean;\r\n autoFocus?: boolean;\r\n borderInverse?: boolean;\r\n textCenter?: boolean;\r\n submitOnEnter?: boolean;\r\n error?: boolean;\r\n id?: string;\r\n /** Показать «введено / максимум» под полем. Имеет смысл вместе с `maxlength`. */\r\n count?: boolean;\r\n }>(),\r\n {\r\n placeholder: '',\r\n spellcheck: true,\r\n autocomplete: '',\r\n minlength: 0,\r\n maxlength: undefined,\r\n disabled: false,\r\n noSpace: false,\r\n dummy: false,\r\n rows: 3,\r\n resize: true,\r\n modelValue: '',\r\n noBorder: false,\r\n noBackground: false,\r\n autoFocus: false,\r\n borderInverse: false,\r\n textCenter: false,\r\n submitOnEnter: false,\r\n error: false,\r\n count: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits(['update:modelValue', 'change', 'focus', 'blur', 'keydown']);\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => props.id || field?.id || localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst counterId = computed(() => `${controlId.value}-count`);\r\nconst describedBy = computed(() => {\r\n const ids = [field?.describedBy.value, props.count ? counterId.value : undefined].filter(Boolean);\r\n return ids.length ? ids.join(' ') : undefined;\r\n});\r\n\r\nconst currentLength = computed(() => String(props.modelValue ?? '').length);\r\nconst countLabel = computed(() => {\r\n if (props.maxlength != null && props.maxlength > 0) {\r\n return `${currentLength.value} / ${props.maxlength}`;\r\n }\r\n return String(currentLength.value);\r\n});\r\nconst atLimit = computed(\r\n () => props.maxlength != null && props.maxlength > 0 && currentLength.value >= props.maxlength,\r\n);\r\n\r\nconst textareaRef = ref<HTMLTextAreaElement | null>(null);\r\n\r\nfunction onInput(e: Event) {\r\n const target = e.target as HTMLTextAreaElement;\r\n emit('update:modelValue', target.value);\r\n autoResize();\r\n}\r\n\r\nfunction onChange(e: Event) {\r\n emit('change', (e.target as HTMLTextAreaElement).value);\r\n}\r\n\r\nfunction onFocus(e: FocusEvent) {\r\n emit('focus', e);\r\n}\r\n\r\nfunction onBlur(e: FocusEvent) {\r\n emit('blur', e);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n emit('keydown', event);\r\n\r\n if (props.submitOnEnter && event.key === 'Enter' && !event.shiftKey) {\r\n textareaRef.value?.blur();\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (props.noSpace && event.key === ' ') {\r\n event.preventDefault();\r\n }\r\n}\r\n\r\nfunction autoResize() {\r\n const textarea = textareaRef.value;\r\n if (!textarea) {\r\n return;\r\n }\r\n\r\n textarea.style.height = 'auto';\r\n textarea.style.height = `${Math.min(textarea.scrollHeight, 500)}px`;\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n () => {\r\n nextTick(autoResize);\r\n },\r\n);\r\n\r\nonMounted(() => {\r\n if (props.autoFocus) {\r\n textareaRef.value?.focus();\r\n }\r\n nextTick(autoResize);\r\n});\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"dummy\" class=\"tao-textarea tao-textarea--dummy\">{{ modelValue }}</span>\r\n <div v-else class=\"tao-textarea-wrap\">\r\n <textarea\r\n :id=\"controlId\"\r\n ref=\"textareaRef\"\r\n class=\"tao-textarea\"\r\n :class=\"{\r\n 'tao-textarea--inverse': borderInverse,\r\n 'tao-textarea--center': textCenter,\r\n 'tao-textarea--no-border': noBorder,\r\n 'tao-textarea--no-background': noBackground,\r\n 'tao-textarea--no-resize': !resize,\r\n 'tao-textarea--invalid': invalid,\r\n }\"\r\n :placeholder=\"placeholder\"\r\n :spellcheck=\"spellcheck\"\r\n :autocomplete=\"autocomplete\"\r\n :minlength=\"minlength\"\r\n :maxlength=\"maxlength\"\r\n :disabled=\"disabled\"\r\n :rows=\"rows\"\r\n :value=\"modelValue\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n draggable=\"false\"\r\n @input=\"onInput\"\r\n @change=\"onChange\"\r\n @focus=\"onFocus\"\r\n @blur=\"onBlur\"\r\n @keydown=\"onKeydown\"\r\n ></textarea>\r\n <span\r\n v-if=\"count\"\r\n :id=\"counterId\"\r\n class=\"tao-textarea__count\"\r\n :class=\"{ 'tao-textarea__count--limit': atLimit }\"\r\n >{{ countLabel }}</span>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-textarea-wrap {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n width: 100%;\r\n}\r\n\r\n.tao-textarea {\r\n width: 100%;\r\n min-height: 31px;\r\n height: auto;\r\n padding: var(--tao-space-2);\r\n font-size: var(--tao-font-size-sm);\r\n font-family: var(--tao-font-family);\r\n letter-spacing: 0.01rem;\r\n line-height: 1.4;\r\n border: none;\r\n border-left: 4px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-sm);\r\n background-color: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n outline: none;\r\n resize: vertical;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-textarea::placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-textarea:focus {\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-textarea--invalid {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-textarea--inverse {\r\n border-left: none;\r\n border-right: 4px solid var(--tao-color-border-strong);\r\n}\r\n\r\n.tao-textarea--center {\r\n text-align: center;\r\n}\r\n\r\n.tao-textarea--no-border {\r\n border: none;\r\n}\r\n\r\n.tao-textarea--no-background {\r\n background-color: transparent;\r\n}\r\n\r\n.tao-textarea--no-resize {\r\n resize: none;\r\n}\r\n\r\n.tao-textarea--dummy {\r\n display: block;\r\n min-height: 31px;\r\n height: auto;\r\n border-color: var(--tao-color-danger);\r\n white-space: pre-wrap;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.tao-textarea__count {\r\n align-self: flex-end;\r\n font-size: var(--tao-font-size-xs);\r\n line-height: 1;\r\n color: var(--tao-color-text-muted);\r\n font-variant-numeric: tabular-nums;\r\n user-select: none;\r\n}\r\n\r\n.tao-textarea__count--limit {\r\n color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, reactive, onBeforeMount, onBeforeUnmount } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoScrollTop' });\r\n\r\ninterface Props {\r\n size?: number;\r\n right?: string | number;\r\n bottom?: string | number;\r\n zIndex?: number;\r\n boundary?: number;\r\n hasOutline?: boolean;\r\n tabindex?: number;\r\n ariaLabel?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n size: 40,\r\n right: 24,\r\n bottom: 24,\r\n zIndex: 1000,\r\n boundary: 300,\r\n hasOutline: true,\r\n tabindex: 0,\r\n ariaLabel: 'Наверх',\r\n});\r\n\r\nconst RIPPLE_DURATION = 750;\r\nconst fmtProp = (value: number | string, unit = 'px') => (typeof value === 'number' ? value + unit : value);\r\n\r\nlet prevPos = 0;\r\nlet activeBack = false;\r\n\r\nconst mainStyle = reactive({\r\n width: fmtProp(props.size),\r\n height: fmtProp(props.size),\r\n right: fmtProp(props.right),\r\n bottom: fmtProp(props.bottom),\r\n zIndex: props.zIndex,\r\n});\r\n\r\nconst rippleStyle = reactive({\r\n top: fmtProp(-1 * props.size),\r\n left: fmtProp(-1 * props.size),\r\n width: '200%',\r\n height: '200%',\r\n});\r\n\r\nconst isActive = ref(false);\r\nconst isRippleActive = ref(false);\r\n\r\nfunction getScrollValue() {\r\n if (typeof window.pageYOffset !== 'undefined') {\r\n return window.pageYOffset;\r\n }\r\n if (typeof document.compatMode !== 'undefined' && document.compatMode !== 'BackCompat') {\r\n return document.documentElement.scrollTop;\r\n }\r\n return document.body.scrollTop;\r\n}\r\n\r\nfunction goToTop() {\r\n const c = getScrollValue();\r\n if (c > 0) {\r\n window.requestAnimationFrame(goToTop);\r\n window.scrollTo(0, c - Math.max(10, c / 8));\r\n }\r\n}\r\n\r\nfunction onScroll() {\r\n const pY = getScrollValue();\r\n const tooFar = pY > props.boundary;\r\n const goBack = prevPos > pY;\r\n\r\n if (activeBack) {\r\n if (!goBack && pY - prevPos > 15) {\r\n activeBack = false;\r\n }\r\n } else {\r\n activeBack = prevPos - pY >= 20;\r\n if (activeBack && pY - props.boundary < 150) {\r\n activeBack = false;\r\n }\r\n }\r\n\r\n prevPos = pY;\r\n isActive.value = tooFar && activeBack;\r\n}\r\n\r\nfunction onClick(e: MouseEvent) {\r\n if (!isRippleActive.value) {\r\n const elTarget = e.currentTarget as HTMLElement;\r\n if (elTarget) {\r\n const rect = elTarget.getBoundingClientRect();\r\n const top = e.clientY - rect.top;\r\n const left = e.clientX - rect.left;\r\n rippleStyle.top = fmtProp(top - props.size);\r\n rippleStyle.left = fmtProp(left - props.size);\r\n }\r\n\r\n isRippleActive.value = true;\r\n setTimeout(() => {\r\n isRippleActive.value = false;\r\n }, RIPPLE_DURATION);\r\n }\r\n\r\n goToTop();\r\n}\r\n\r\nonBeforeMount(() => {\r\n window.addEventListener('scroll', onScroll);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('scroll', onScroll);\r\n});\r\n</script>\r\n\r\n<template>\r\n <Transition name=\"tao-scroll-top-fade\">\r\n <button\r\n v-if=\"isActive\"\r\n type=\"button\"\r\n :style=\"mainStyle\"\r\n :tabindex=\"props.tabindex\"\r\n class=\"tao-scroll-top\"\r\n :class=\"{ 'tao-scroll-top--no-outline': !props.hasOutline }\"\r\n :aria-label=\"props.ariaLabel\"\r\n @click.prevent=\"onClick\"\r\n >\r\n <div class=\"tao-scroll-top__content\">\r\n <div :class=\"{ 'tao-scroll-top__ripple--active': isRippleActive }\" :style=\"rippleStyle\" class=\"tao-scroll-top__ripple\" />\r\n <slot>\r\n <svg class=\"tao-scroll-top__icon\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M12 6l-7 7 1.4 1.4L12 8.8l5.6 5.6L19 13z\" />\r\n </svg>\r\n </slot>\r\n </div>\r\n </button>\r\n </Transition>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-scroll-top {\r\n overflow: hidden;\r\n position: fixed;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 0;\r\n cursor: pointer;\r\n color: var(--tao-color-on-accent);\r\n background-color: var(--tao-color-accent);\r\n border: none;\r\n border-radius: var(--tao-radius-full);\r\n box-shadow: var(--tao-shadow-md);\r\n user-select: none;\r\n}\r\n\r\n.tao-scroll-top:hover {\r\n background-color: var(--tao-color-accent-hover);\r\n}\r\n\r\n.tao-scroll-top--no-outline {\r\n outline: none;\r\n}\r\n\r\n.tao-scroll-top__content {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.tao-scroll-top__icon {\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n.tao-scroll-top__ripple {\r\n position: absolute;\r\n border-radius: var(--tao-radius-full);\r\n background-color: var(--tao-color-accent-subtle-hover);\r\n transform: scale(0);\r\n opacity: 0;\r\n pointer-events: none;\r\n}\r\n\r\n.tao-scroll-top__ripple--active {\r\n animation: tao-scroll-top-ripple 0.75s ease-out;\r\n}\r\n\r\n.tao-scroll-top-fade-enter-active,\r\n.tao-scroll-top-fade-leave-active {\r\n transition: opacity var(--tao-duration-base) var(--tao-ease-base),\r\n transform var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-scroll-top-fade-enter-from,\r\n.tao-scroll-top-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(40px);\r\n}\r\n\r\n@keyframes tao-scroll-top-ripple {\r\n from {\r\n opacity: 1;\r\n }\r\n to {\r\n transform: scale(2);\r\n opacity: 0;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, useSlots } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoProgress' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n minWidth?: number;\r\n maxWidth?: number;\r\n /** @deprecated используйте minWidth */\r\n min?: number;\r\n /** @deprecated используйте maxWidth */\r\n max?: number;\r\n progress?: number;\r\n height?: number;\r\n /** `true` / `top` — по центру над полосой, `right` — справа. Если есть `#right`, процент справа в скобках. `false` — скрыть. */\r\n showPercentage?: boolean | 'top' | 'right';\r\n animated?: boolean;\r\n }>(),\r\n {\r\n minWidth: undefined,\r\n maxWidth: undefined,\r\n min: undefined,\r\n max: undefined,\r\n progress: 0,\r\n height: 8,\r\n showPercentage: true,\r\n animated: true,\r\n },\r\n);\r\n\r\nconst slots = useSlots();\r\nconst minW = computed(() => props.minWidth ?? props.min ?? 200);\r\nconst maxW = computed(() => props.maxWidth ?? props.max ?? 400);\r\nconst hasRight = computed(() => Boolean(slots.right));\r\nconst percentPlace = computed((): 'top' | 'right' | null => {\r\n if (!props.showPercentage) {\r\n return null;\r\n }\r\n return props.showPercentage === 'right' ? 'right' : 'top';\r\n});\r\nconst showOverPercent = computed(() => percentPlace.value === 'top');\r\nconst showEndPercent = computed(() => percentPlace.value === 'right');\r\nconst endPercentLabel = computed(() =>\r\n hasRight.value ? `(${props.progress}%)` : `${props.progress}%`,\r\n);\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-progress\">\r\n <div\r\n class=\"tao-progress__container\"\r\n :class=\"{ 'tao-progress__container--over': showOverPercent }\"\r\n :style=\"{ minWidth: `${minW}px`, maxWidth: `${maxW}px` }\"\r\n >\r\n <div v-if=\"$slots.left\" class=\"tao-progress__side\">\r\n <slot name=\"left\" />\r\n </div>\r\n\r\n <div class=\"tao-progress__main\">\r\n <span v-if=\"showOverPercent\" class=\"tao-progress__percentage\">{{ progress }}%</span>\r\n <div class=\"tao-progress__track\" :style=\"{ height: `${height}px` }\">\r\n <div\r\n class=\"tao-progress__fill\"\r\n :class=\"{ 'tao-progress__fill--animated': animated }\"\r\n :style=\"{ width: `${progress}%` }\"\r\n ></div>\r\n </div>\r\n </div>\r\n\r\n <div v-if=\"$slots.right || showEndPercent\" class=\"tao-progress__side\">\r\n <slot name=\"right\" />\r\n <span v-if=\"showEndPercent\" class=\"tao-progress__percentage\">{{ endPercentLabel }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-progress {\r\n width: 100%;\r\n}\r\n\r\n.tao-progress__container {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-3);\r\n width: 100%;\r\n}\r\n\r\n.tao-progress__container--over {\r\n align-items: flex-end;\r\n}\r\n\r\n.tao-progress__main {\r\n flex: 1;\r\n min-width: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n}\r\n\r\n.tao-progress__track {\r\n width: 100%;\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-sm);\r\n background-color: var(--tao-color-surface-sunken);\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n\r\n.tao-progress__fill {\r\n height: 100%;\r\n border-radius: var(--tao-radius-sm);\r\n transition: width var(--tao-duration-slow) var(--tao-ease-base);\r\n background: var(--tao-color-accent);\r\n}\r\n\r\n.tao-progress__side {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: baseline;\r\n gap: var(--tao-space-1);\r\n font-size: var(--tao-font-size-xs);\r\n font-variant-numeric: tabular-nums;\r\n line-height: 1;\r\n white-space: nowrap;\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-progress__percentage {\r\n font-weight: 600;\r\n font-variant-numeric: tabular-nums;\r\n font-size: var(--tao-font-size-xs);\r\n line-height: 1;\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-progress__main > .tao-progress__percentage {\r\n width: 100%;\r\n text-align: center;\r\n}\r\n\r\n.tao-progress__fill--animated {\r\n background: linear-gradient(\r\n 90deg,\r\n var(--tao-color-accent) 0%,\r\n var(--tao-color-accent-hover) 50%,\r\n var(--tao-color-accent) 100%\r\n );\r\n background-size: 200% 100%;\r\n animation: tao-progress-shimmer 2s infinite;\r\n}\r\n\r\n@keyframes tao-progress-shimmer {\r\n 0% { background-position: -200% 0; }\r\n 100% { background-position: 200% 0; }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, onBeforeUnmount, onMounted, ref, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { listenFocusLoss } from '../focusLoss';\r\n\r\ndefineOptions({ name: 'TaoSlider' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n showValue?: boolean;\r\n placeholder?: string;\r\n modelValue: number | string;\r\n disabled?: boolean;\r\n /** `medium` — форм-контрол. `small` — тонкий трек (seek, громкость). */\r\n size?: 'small' | 'medium';\r\n /** Шаг изменения значения при прокрутке колёсика мыши. 0 — отключено. */\r\n wheel?: number;\r\n }>(),\r\n {\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n showValue: false,\r\n placeholder: '',\r\n disabled: false,\r\n size: 'medium',\r\n wheel: 0,\r\n },\r\n);\r\n\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nfunction packModelValue(value: number): string | number {\r\n return typeof props.modelValue === 'string' ? `${value}` : value;\r\n}\r\n\r\nfunction unpackModelValue(): number {\r\n const raw = typeof props.modelValue === 'string' ? parseFloat(props.modelValue) : props.modelValue;\r\n return Number.isFinite(raw) ? raw : props.min;\r\n}\r\n\r\nconst current = computed(() => unpackModelValue());\r\n\r\nconst trackRef = ref<HTMLElement | null>(null);\r\nconst isDragging = ref(false);\r\nlet dragPointer = -1;\r\n\r\nconst shadowInputRef = ref<HTMLInputElement | null>(null);\r\nconst shadowModel = ref('0');\r\nconst showShadowModel = ref(false);\r\n\r\nconst progressPercent = computed(() => {\r\n const range = props.max - props.min;\r\n if (range <= 0) {\r\n return 0;\r\n }\r\n return ((current.value - props.min) / range) * 100;\r\n});\r\n\r\nfunction clampValue(v: number) {\r\n return Math.min(Math.max(v, props.min), props.max);\r\n}\r\n\r\nfunction commit(value: number) {\r\n emit('update:modelValue', packModelValue(clampValue(value)));\r\n}\r\n\r\nfunction calculateValue(event: PointerEvent): number {\r\n if (!trackRef.value) {\r\n return props.min;\r\n }\r\n\r\n const rect = trackRef.value.getBoundingClientRect();\r\n const x = Math.min(Math.max(event.clientX - rect.left, 0), rect.width);\r\n const ratio = rect.width ? x / rect.width : 0;\r\n\r\n const v = props.min + ratio * (props.max - props.min);\r\n return clampValue(Math.round((v - props.min) / props.step) * props.step + props.min);\r\n}\r\n\r\nfunction releaseDragCapture() {\r\n const el = trackRef.value;\r\n const id = dragPointer;\r\n if (!el || id === -1) {\r\n return;\r\n }\r\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\r\n return;\r\n }\r\n try {\r\n el.releasePointerCapture(id);\r\n } catch {\r\n /* already released by the browser */\r\n }\r\n}\r\n\r\nfunction endDrag() {\r\n if (!isDragging.value) {\r\n return;\r\n }\r\n isDragging.value = false;\r\n releaseDragCapture();\r\n dragPointer = -1;\r\n}\r\n\r\nfunction onPointerDown(event: PointerEvent) {\r\n if (props.disabled || showShadowModel.value || event.button !== 0 || !trackRef.value) {\r\n return;\r\n }\r\n\r\n dragPointer = event.pointerId;\r\n isDragging.value = true;\r\n commit(calculateValue(event));\r\n event.preventDefault();\r\n try {\r\n trackRef.value.setPointerCapture(event.pointerId);\r\n } catch {\r\n /* untrusted events / capture already gone */\r\n }\r\n}\r\n\r\nfunction onPointerMove(event: PointerEvent) {\r\n if (!isDragging.value || event.pointerId !== dragPointer) {\r\n return;\r\n }\r\n commit(calculateValue(event));\r\n}\r\n\r\nfunction onPointerEnd(event: PointerEvent) {\r\n if (!isDragging.value) {\r\n return;\r\n }\r\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\r\n return;\r\n }\r\n endDrag();\r\n}\r\n\r\nfunction onLostPointerCapture() {\r\n endDrag();\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (props.disabled || showShadowModel.value) {\r\n return;\r\n }\r\n\r\n const keys: Record<string, number> = {\r\n ArrowLeft: -props.step,\r\n ArrowDown: -props.step,\r\n ArrowRight: props.step,\r\n ArrowUp: props.step,\r\n PageDown: -props.step * 10,\r\n PageUp: props.step * 10,\r\n };\r\n\r\n if (event.key in keys) {\r\n event.preventDefault();\r\n commit(current.value + keys[event.key]!);\r\n return;\r\n }\r\n\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n commit(props.min);\r\n return;\r\n }\r\n\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n commit(props.max);\r\n }\r\n}\r\n\r\nfunction onWheel(event: WheelEvent) {\r\n if (props.disabled || props.wheel <= 0 || showShadowModel.value) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const delta = event.deltaY < 0 ? props.wheel : -props.wheel;\r\n commit(current.value + delta);\r\n}\r\n\r\nfunction onBlurShadowModel() {\r\n if (shadowModel.value) {\r\n const newValue = packModelValue(clampValue(parseFloat(shadowModel.value) || 0));\r\n shadowModel.value = `${newValue}`;\r\n emit('update:modelValue', newValue);\r\n }\r\n showShadowModel.value = false;\r\n}\r\n\r\nfunction onShadowKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Enter') {\r\n shadowInputRef.value?.blur();\r\n }\r\n}\r\n\r\nfunction onContextMenu() {\r\n if (props.disabled || !props.showValue) {\r\n return;\r\n }\r\n shadowModel.value = `${props.modelValue}`;\r\n showShadowModel.value = true;\r\n requestAnimationFrame(() => shadowInputRef.value?.focus());\r\n}\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\n\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(endDrag);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n endDrag();\r\n stopFocusLoss?.();\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n :id=\"controlId\"\r\n ref=\"trackRef\"\r\n class=\"tao-slider\"\r\n :class=\"[\r\n `tao-slider--${size}`,\r\n { 'tao-slider--show-value': showValue, 'tao-slider--disabled': disabled },\r\n ]\"\r\n role=\"slider\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n :aria-valuemin=\"min\"\r\n :aria-valuemax=\"max\"\r\n :aria-valuenow=\"current\"\r\n :aria-disabled=\"disabled || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n @contextmenu.prevent=\"onContextMenu\"\r\n @pointerdown=\"onPointerDown\"\r\n @pointermove=\"onPointerMove\"\r\n @pointerup=\"onPointerEnd\"\r\n @pointercancel=\"onPointerEnd\"\r\n @lostpointercapture=\"onLostPointerCapture\"\r\n @keydown=\"onKeydown\"\r\n @wheel=\"onWheel\"\r\n >\r\n <div class=\"tao-slider__track\"></div>\r\n <div class=\"tao-slider__fill\" :style=\"{ width: `${progressPercent}%` }\"></div>\r\n <div class=\"tao-slider__thumb\" :style=\"{ left: `${progressPercent}%` }\"></div>\r\n\r\n <input\r\n v-if=\"showShadowModel\"\r\n ref=\"shadowInputRef\"\r\n v-model=\"shadowModel\"\r\n type=\"number\"\r\n inputmode=\"numeric\"\r\n :placeholder=\"placeholder\"\r\n class=\"tao-slider__shadow-input\"\r\n @blur=\"onBlurShadowModel\"\r\n @keydown=\"onShadowKeydown\"\r\n @pointerdown.stop\r\n />\r\n <div v-else-if=\"showValue\" class=\"tao-slider__value\">\r\n <slot name=\"pre-value\" />{{ modelValue }}<slot name=\"post-value\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-slider {\r\n --tao-slider-hit: 14px;\r\n --tao-slider-track: var(--tao-slider-hit);\r\n --tao-slider-thumb: 20px;\r\n\r\n position: relative;\r\n width: 100%;\r\n height: var(--tao-slider-hit);\r\n cursor: pointer;\r\n user-select: none;\r\n touch-action: none;\r\n}\r\n\r\n.tao-slider:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-slider:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 4px;\r\n border-radius: var(--tao-radius-sm);\r\n}\r\n\r\n.tao-slider--show-value {\r\n --tao-slider-hit: 20px;\r\n}\r\n\r\n/* Тонкий трек, hit-area шире картинки — seek / громкость. */\r\n.tao-slider--small {\r\n --tao-slider-hit: 16px;\r\n --tao-slider-track: 4px;\r\n --tao-slider-thumb: 12px;\r\n}\r\n\r\n.tao-slider--small.tao-slider--show-value {\r\n --tao-slider-hit: 20px;\r\n}\r\n\r\n.tao-slider--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n.tao-slider--disabled .tao-slider__thumb {\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-slider__track,\r\n.tao-slider__fill {\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n height: var(--tao-slider-track);\r\n border-radius: var(--tao-radius-sm);\r\n transform: translateY(-50%);\r\n}\r\n\r\n.tao-slider__track {\r\n width: 100%;\r\n background-color: var(--tao-color-surface-sunken);\r\n}\r\n\r\n.tao-slider__fill {\r\n background-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-slider--small .tao-slider__track,\r\n.tao-slider--small .tao-slider__fill {\r\n border-radius: var(--tao-radius-full);\r\n}\r\n\r\n.tao-slider__thumb {\r\n position: absolute;\r\n top: 50%;\r\n width: var(--tao-slider-thumb);\r\n height: var(--tao-slider-thumb);\r\n background-color: var(--tao-color-accent);\r\n border: 2px solid var(--tao-color-surface-sunken);\r\n border-radius: var(--tao-radius-full);\r\n transform: translate(-50%, -50%);\r\n cursor: grab;\r\n}\r\n\r\n.tao-slider__thumb:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.tao-slider__value,\r\n.tao-slider__shadow-input {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 900;\r\n letter-spacing: 0.05em;\r\n}\r\n\r\n.tao-slider__value {\r\n color: var(--tao-color-text-strong);\r\n text-shadow: -1px -1px 0 var(--tao-color-bg), 1px -1px 0 var(--tao-color-bg),\r\n -1px 1px 0 var(--tao-color-bg), 1px 1px 0 var(--tao-color-bg);\r\n}\r\n\r\n.tao-slider__shadow-input {\r\n text-align: center;\r\n border: none;\r\n background: transparent;\r\n color: var(--tao-color-text-strong);\r\n font-family: inherit;\r\n outline: none;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { onBeforeUnmount, onMounted, ref } from 'vue';\r\nimport { listenFocusLoss } from '../focusLoss';\r\n\r\ndefineOptions({ name: 'TaoFileDrop' });\r\n\r\ninterface Props {\r\n /** Текущий список файлов — компонент сам не хранит состояние\r\n * количества файлов, оно всегда отражает то, что передал родитель.\r\n * Это и даёт возможность подтверждения: родитель решает, когда\r\n * именно менять modelValue (сразу или после ответа в модалке). */\r\n modelValue?: File[];\r\n size?: 'small' | 'medium' | 'large';\r\n accept?: string;\r\n multiple?: boolean;\r\n showClear?: boolean;\r\n clearLabel?: string;\r\n /** Шаблон aria для крестика файла. `{name}` — имя файла. */\r\n removeLabel?: string;\r\n formatSize?: (bytes: number) => string;\r\n /** Имена выбранных файлов под зоной. Снять файл — сразу в `v-model`. */\r\n list?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: () => [],\r\n size: 'medium',\r\n accept: '*',\r\n multiple: false,\r\n showClear: false,\r\n clearLabel: 'Очистить файлы',\r\n removeLabel: 'Убрать «{name}»',\r\n list: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [files: File[]];\r\n files: [files: File[]];\r\n /** Запрос на очистку — компонент НЕ очищает себя сам. Родитель решает:\r\n * очистить сразу (emit → v-model = []) или сперва показать модалку\r\n * подтверждения и очистить только после ответа пользователя. */\r\n 'clear-request': [];\r\n}>();\r\n\r\nconst isDragging = ref(false);\r\nconst fileInput = ref<HTMLInputElement | null>(null);\r\n\r\nfunction sameFile(a: File, b: File) {\r\n return a.name === b.name && a.size === b.size && a.lastModified === b.lastModified;\r\n}\r\n\r\nfunction acceptTokens(accept: string) {\r\n return accept\r\n .split(',')\r\n .map((token) => token.trim().toLowerCase())\r\n .filter(Boolean);\r\n}\r\n\r\nfunction fileMatchesAccept(file: File, accept: string) {\r\n const tokens = acceptTokens(accept);\r\n if (!tokens.length || tokens.includes('*') || tokens.includes('*/*')) {\r\n return true;\r\n }\r\n\r\n const name = file.name.toLowerCase();\r\n const mime = (file.type || '').toLowerCase();\r\n const dot = name.lastIndexOf('.');\r\n const ext = dot >= 0 ? name.slice(dot) : '';\r\n\r\n return tokens.some((token) => {\r\n if (token.startsWith('.')) {\r\n return ext === token;\r\n }\r\n if (token.endsWith('/*')) {\r\n return mime.startsWith(token.slice(0, -1));\r\n }\r\n return mime === token;\r\n });\r\n}\r\n\r\nfunction commit(files: File[]) {\r\n emit('update:modelValue', files);\r\n emit('files', files);\r\n}\r\n\r\nfunction handleDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n isDragging.value = true;\r\n}\r\n\r\nfunction handleDragLeave() {\r\n isDragging.value = false;\r\n}\r\n\r\nfunction handleDrop(event: DragEvent) {\r\n event.preventDefault();\r\n isDragging.value = false;\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n processFiles(files);\r\n }\r\n}\r\n\r\nfunction handleFileSelect(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n processFiles(input.files);\r\n }\r\n}\r\n\r\nfunction requestClear() {\r\n emit('clear-request');\r\n}\r\n\r\nfunction removeAt(index: number) {\r\n commit(props.modelValue.filter((_, item) => item !== index));\r\n}\r\n\r\nfunction resetInput() {\r\n const el = fileInput.value;\r\n if (el) {\r\n el.type = 'text';\r\n el.type = 'file';\r\n }\r\n}\r\n\r\nfunction processFiles(fileList: FileList) {\r\n const incoming = Array.from(fileList).filter((file) => fileMatchesAccept(file, props.accept));\r\n if (!incoming.length) {\r\n resetInput();\r\n return;\r\n }\r\n\r\n let result: File[];\r\n if (!props.multiple) {\r\n result = [incoming[0]!];\r\n } else {\r\n result = [...props.modelValue];\r\n for (const file of incoming) {\r\n if (!result.some((item) => sameFile(item, file))) {\r\n result.push(file);\r\n }\r\n }\r\n }\r\n\r\n commit(result);\r\n resetInput();\r\n}\r\n\r\nfunction defaultFormatSize(bytes: number) {\r\n if (bytes < 1024) {\r\n return `${bytes} Б`;\r\n }\r\n const kb = bytes / 1024;\r\n if (kb < 1024) {\r\n const value = kb < 10 ? kb.toFixed(1) : String(Math.round(kb));\r\n return `${value.replace('.', ',')} КБ`;\r\n }\r\n const mb = kb / 1024;\r\n const value = mb < 10 ? mb.toFixed(1) : String(Math.round(mb));\r\n return `${value.replace('.', ',')} МБ`;\r\n}\r\n\r\nfunction sizeLabel(bytes: number) {\r\n return props.formatSize ? props.formatSize(bytes) : defaultFormatSize(bytes);\r\n}\r\n\r\nfunction fileKey(file: File, index: number) {\r\n return `${file.name}-${file.size}-${file.lastModified}-${index}`;\r\n}\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(() => {\r\n isDragging.value = false;\r\n });\r\n});\r\nonBeforeUnmount(() => stopFocusLoss?.());\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-file-drop\">\r\n <div class=\"tao-file-drop__row\">\r\n <button\r\n v-if=\"showClear && modelValue.length\"\r\n type=\"button\"\r\n class=\"tao-file-drop__clear\"\r\n :aria-label=\"clearLabel\"\r\n @click=\"requestClear\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"clear-icon\">✕</slot>\r\n </span>\r\n </button>\r\n\r\n <label\r\n class=\"tao-file-drop__zone\"\r\n :class=\"[`tao-file-drop__zone--${size}`, { 'tao-file-drop__zone--dragging': isDragging }]\"\r\n @dragover=\"handleDragOver\"\r\n @dragleave=\"handleDragLeave\"\r\n @drop=\"handleDrop\"\r\n >\r\n <slot>Перетащите файл сюда или нажмите, чтобы выбрать</slot>\r\n\r\n <input\r\n ref=\"fileInput\"\r\n class=\"tao-sr-only\"\r\n type=\"file\"\r\n :accept=\"accept\"\r\n :multiple=\"multiple\"\r\n @change=\"handleFileSelect\"\r\n @click.stop\r\n />\r\n </label>\r\n </div>\r\n\r\n <ul v-if=\"list && modelValue.length\" class=\"tao-file-drop__list\">\r\n <li v-for=\"(file, index) in modelValue\" :key=\"fileKey(file, index)\" class=\"tao-file-drop__file\">\r\n <span class=\"tao-file-drop__name\">{{ file.name }}</span>\r\n <span class=\"tao-file-drop__meta\">{{ sizeLabel(file.size) }}</span>\r\n <button\r\n type=\"button\"\r\n class=\"tao-file-drop__remove\"\r\n :aria-label=\"removeLabel.replace('{name}', file.name)\"\r\n @click=\"removeAt(index)\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"remove-icon\">✕</slot>\r\n </span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-file-drop {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-2);\r\n user-select: none;\r\n}\r\n\r\n.tao-file-drop__row {\r\n display: flex;\r\n gap: var(--tao-space-3);\r\n}\r\n\r\n.tao-file-drop__clear {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 55px;\r\n text-align: center;\r\n border: 2px dashed var(--tao-color-danger);\r\n border-radius: var(--tao-radius-panel);\r\n color: var(--tao-color-danger);\r\n background-color: var(--tao-color-danger-subtle);\r\n cursor: pointer;\r\n font-family: inherit;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-file-drop__clear:hover {\r\n background-color: color-mix(in srgb, var(--tao-color-danger) 22%, transparent);\r\n}\r\n\r\n.tao-file-drop__zone {\r\n flex-grow: 1;\r\n font-size: var(--tao-font-size-sm);\r\n font-family: var(--tao-font-family);\r\n letter-spacing: 0.01rem;\r\n text-align: center;\r\n color: var(--tao-color-text-muted);\r\n border: 2px dashed var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-panel);\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-file-drop__zone:hover,\r\n.tao-file-drop__zone:focus-within {\r\n background-color: var(--tao-color-accent-subtle);\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-file-drop__zone--dragging {\r\n border-color: var(--tao-color-text-strong);\r\n background-color: var(--tao-color-surface-sunken);\r\n}\r\n\r\n.tao-file-drop__zone--small {\r\n padding: var(--tao-space-5) var(--tao-space-4);\r\n}\r\n\r\n.tao-file-drop__zone--medium {\r\n padding: var(--tao-space-8) var(--tao-space-5);\r\n}\r\n\r\n.tao-file-drop__zone--large {\r\n padding: var(--tao-space-10) var(--tao-space-6);\r\n}\r\n\r\n.tao-file-drop__list {\r\n margin: 0;\r\n padding: 0;\r\n overflow: hidden;\r\n list-style: none;\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-file-drop__file {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n min-width: 0;\r\n min-height: 36px;\r\n padding: 0 var(--tao-space-2) 0 var(--tao-space-3);\r\n border-bottom: 1px solid var(--tao-color-border);\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-file-drop__file:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.tao-file-drop__name {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n overflow: hidden;\r\n font-size: var(--tao-font-size-sm);\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n user-select: text;\r\n}\r\n\r\n.tao-file-drop__meta {\r\n flex-shrink: 0;\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-file-drop__remove {\r\n flex-shrink: 0;\r\n width: 28px;\r\n height: 28px;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n border-radius: var(--tao-radius-sm);\r\n background: none;\r\n color: var(--tao-color-text-muted);\r\n font: inherit;\r\n font-size: var(--tao-font-size-sm);\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-file-drop__remove:hover {\r\n color: var(--tao-color-danger);\r\n background: var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-file-drop__remove:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, onMounted, reactive, ref } from 'vue';\r\nimport type { TaoDropdownAction } from '../dropdown';\r\n\r\ndefineOptions({ name: 'TaoDropdownMenu' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n actions?: TaoDropdownAction[];\r\n menuLabel?: string;\r\n }>(),\r\n {\r\n actions: () => [],\r\n menuLabel: 'Меню',\r\n },\r\n);\r\n\r\nconst emit = defineEmits(['selected']);\r\n\r\nconst menuRef = ref<HTMLElement | null>(null);\r\nconst listRef = ref<HTMLElement | null>(null);\r\nconst triggerRef = ref<HTMLButtonElement | null>(null);\r\nconst isOpen = ref(false);\r\nconst activeIndex = ref(0);\r\nconst listPosition = reactive({ top: '0', left: '0' });\r\n\r\nfunction updatePosition() {\r\n const trigger = triggerRef.value;\r\n const list = listRef.value;\r\n if (!trigger || !list || !isOpen.value) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const listWidth = list.offsetWidth;\r\n const listHeight = list.offsetHeight;\r\n let left = rect.right - listWidth;\r\n let top = rect.bottom + 4;\r\n\r\n if (left < 8) {\r\n left = rect.left;\r\n }\r\n if (left + listWidth > window.innerWidth - 8) {\r\n left = Math.max(8, window.innerWidth - listWidth - 8);\r\n }\r\n if (top + listHeight > window.innerHeight - 8 && rect.top > listHeight) {\r\n top = rect.top - listHeight - 4;\r\n }\r\n\r\n listPosition.top = `${top}px`;\r\n listPosition.left = `${left}px`;\r\n}\r\n\r\nasync function setOpen(next: boolean) {\r\n isOpen.value = next;\r\n if (!next) {\r\n return;\r\n }\r\n activeIndex.value = 0;\r\n await nextTick();\r\n updatePosition();\r\n listRef.value?.focus();\r\n}\r\n\r\nfunction toggleMenu() {\r\n void setOpen(!isOpen.value);\r\n}\r\n\r\nfunction closeMenu() {\r\n if (!isOpen.value) {\r\n return;\r\n }\r\n isOpen.value = false;\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction emitAction(id: string) {\r\n isOpen.value = false;\r\n emit('selected', id);\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n if (menuRef.value?.contains(target) || listRef.value?.contains(target)) {\r\n return;\r\n }\r\n isOpen.value = false;\r\n}\r\n\r\nfunction onWinScroll() {\r\n if (isOpen.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nfunction onListKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n closeMenu();\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n if (!props.actions.length) {\r\n return;\r\n }\r\n activeIndex.value = (activeIndex.value + 1) % props.actions.length;\r\n return;\r\n }\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n if (!props.actions.length) {\r\n return;\r\n }\r\n activeIndex.value = (activeIndex.value - 1 + props.actions.length) % props.actions.length;\r\n return;\r\n }\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n const action = props.actions[activeIndex.value];\r\n if (action) {\r\n emitAction(action.id);\r\n }\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n window.addEventListener('scroll', onWinScroll, true);\r\n window.addEventListener('resize', updatePosition);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('scroll', onWinScroll, true);\r\n window.removeEventListener('resize', updatePosition);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div ref=\"menuRef\" class=\"tao-dropdown-menu\">\r\n <button\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n class=\"tao-dropdown-menu__button\"\r\n aria-haspopup=\"menu\"\r\n :aria-expanded=\"isOpen\"\r\n :aria-label=\"$slots.button ? undefined : menuLabel\"\r\n @click=\"toggleMenu\"\r\n >\r\n <slot v-if=\"$slots.button\" name=\"button\" />\r\n <span v-else aria-hidden=\"true\">\r\n <slot name=\"icon\">⋮</slot>\r\n </span>\r\n </button>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"isOpen\"\r\n ref=\"listRef\"\r\n class=\"tao-dropdown-menu__list\"\r\n role=\"menu\"\r\n tabindex=\"-1\"\r\n :style=\"listPosition\"\r\n @keydown=\"onListKeydown\"\r\n >\r\n <button\r\n v-for=\"(action, index) in actions\"\r\n :key=\"action.id\"\r\n type=\"button\"\r\n class=\"tao-dropdown-menu__item\"\r\n :class=\"{ 'tao-dropdown-menu__item--active': index === activeIndex }\"\r\n role=\"menuitem\"\r\n @click=\"emitAction(action.id)\"\r\n @mouseenter=\"activeIndex = index\"\r\n >\r\n <slot v-if=\"$slots.item\" name=\"item\" :id=\"action.id\" :ico=\"action.ico\" :text=\"action.name\" />\r\n <span v-else>{{ action.name }}</span>\r\n </button>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.tao-dropdown-menu__list {\r\n z-index: 1050;\r\n position: fixed;\r\n min-width: 120px;\r\n display: flex;\r\n flex-direction: column;\r\n font-size: var(--tao-font-size-md);\r\n color: var(--tao-color-text);\r\n background-color: var(--tao-color-surface-raised);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-md);\r\n}\r\n\r\n.tao-dropdown-menu__list:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-dropdown-menu__list .tao-dropdown-menu__item {\r\n position: relative;\r\n padding: var(--tao-space-2) var(--tao-space-4);\r\n border: none;\r\n border-radius: 0;\r\n background: none;\r\n color: inherit;\r\n font: inherit;\r\n text-align: left;\r\n white-space: nowrap;\r\n cursor: pointer;\r\n user-select: none;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-dropdown-menu__list .tao-dropdown-menu__item:not(:last-child)::after {\r\n content: '';\r\n position: absolute;\r\n right: var(--tao-space-2);\r\n bottom: 0;\r\n left: var(--tao-space-2);\r\n height: 1px;\r\n background: var(--tao-color-border);\r\n pointer-events: none;\r\n}\r\n\r\n.tao-dropdown-menu__list .tao-dropdown-menu__item:hover,\r\n.tao-dropdown-menu__list .tao-dropdown-menu__item--active {\r\n color: var(--tao-color-accent);\r\n background-color: var(--tao-color-surface-hover);\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-dropdown-menu {\r\n position: relative;\r\n display: inline-block;\r\n}\r\n\r\n.tao-dropdown-menu__button {\r\n padding: var(--tao-space-2);\r\n color: var(--tao-color-text);\r\n border: none;\r\n border-radius: var(--tao-radius-control);\r\n background: none;\r\n cursor: pointer;\r\n user-select: none;\r\n font: inherit;\r\n line-height: 1;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-dropdown-menu__button:hover {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-dropdown-menu__button:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoPinCode' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n length: number;\r\n hidden?: boolean;\r\n placeholder?: string;\r\n modelValue?: string;\r\n numbersOnly?: boolean;\r\n /** `focus` — клик сбрасывает ячейку и все справа (неверный код, набор заново).\r\n * `input` — цифра остаётся, пока не введут новую. */\r\n clearOn?: 'focus' | 'input';\r\n }>(),\r\n {\r\n hidden: false,\r\n placeholder: '',\r\n modelValue: '',\r\n numbersOnly: false,\r\n clearOn: 'focus',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string];\r\n change: [value: string];\r\n complete: [value: string];\r\n active: [el: HTMLInputElement | null, index: number];\r\n blur: [];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst numbers = ref<string[]>([]);\r\nconst inputRefs = ref<(HTMLInputElement | null)[]>([]);\r\nconst activeNumber = ref(-1);\r\n\r\nfunction acceptChar(ch: string): string {\r\n if (!ch) {\r\n return '';\r\n }\r\n if (props.numbersOnly && !/^[0-9]$/.test(ch)) {\r\n return '';\r\n }\r\n return ch;\r\n}\r\n\r\nfunction cellsFromModel(value: string): string[] {\r\n const raw = value ?? '';\r\n return Array.from({ length: props.length }, (_, index) => acceptChar(raw[index] ?? ''));\r\n}\r\n\r\nfunction serialize(): string {\r\n return numbers.value.join('');\r\n}\r\n\r\nfunction emitChange() {\r\n const next = serialize();\r\n if (next !== (props.modelValue ?? '')) {\r\n emit('update:modelValue', next);\r\n emit('change', next);\r\n }\r\n}\r\n\r\nfunction firstEmptyIndex(): number {\r\n const index = numbers.value.findIndex((cell) => !cell);\r\n return index === -1 ? numbers.value.length : index;\r\n}\r\n\r\nfunction focusCell(index: number) {\r\n inputRefs.value[index]?.focus();\r\n}\r\n\r\nfunction isFilled(): boolean {\r\n return numbers.value.length === props.length && numbers.value.every((cell) => cell !== '');\r\n}\r\n\r\nfunction applyChars(index: number, raw: string) {\r\n const chars = [...raw].map((ch) => acceptChar(ch)).filter(Boolean);\r\n if (!chars.length) {\r\n return;\r\n }\r\n\r\n numbers.value = [...numbers.value];\r\n let cursor = index;\r\n for (const ch of chars) {\r\n if (cursor >= props.length) {\r\n break;\r\n }\r\n numbers.value[cursor] = ch;\r\n cursor += 1;\r\n }\r\n emitChange();\r\n\r\n if (isFilled()) {\r\n inputRefs.value[index]?.blur();\r\n emit('complete', serialize());\r\n return;\r\n }\r\n\r\n if (cursor < props.length) {\r\n focusCell(cursor);\r\n }\r\n}\r\n\r\nfunction mutation(v: string, index: number) {\r\n if (v.length > 1) {\r\n applyChars(index, v);\r\n return;\r\n }\r\n\r\n const next = acceptChar(v);\r\n\r\n if (props.numbersOnly && v && !next) {\r\n const el = inputRefs.value[index];\r\n if (el) {\r\n el.value = numbers.value[index] ?? '';\r\n }\r\n return;\r\n }\r\n\r\n numbers.value = [...numbers.value];\r\n numbers.value[index] = next;\r\n emitChange();\r\n\r\n if (!next) {\r\n return;\r\n }\r\n\r\n if (isFilled()) {\r\n inputRefs.value[index]?.blur();\r\n emit('complete', serialize());\r\n return;\r\n }\r\n\r\n const nextEmpty = numbers.value.findIndex((cell, cellIndex) => cellIndex > index && !cell);\r\n const target = nextEmpty !== -1 ? nextEmpty : index + 1;\r\n if (target < props.length) {\r\n focusCell(target);\r\n }\r\n}\r\n\r\nfunction onPaste(event: ClipboardEvent, index: number) {\r\n const text = event.clipboardData?.getData('text') ?? '';\r\n if (!text) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n applyChars(index, text);\r\n}\r\n\r\nfunction onFocus(index: number) {\r\n if (props.clearOn === 'input') {\r\n const firstEmpty = firstEmptyIndex();\r\n if (firstEmpty < props.length && index > firstEmpty) {\r\n focusCell(firstEmpty);\r\n return;\r\n }\r\n\r\n activeNumber.value = index;\r\n emit('active', inputRefs.value[index] ?? null, index);\r\n requestAnimationFrame(() => inputRefs.value[index]?.select());\r\n return;\r\n }\r\n\r\n numbers.value = numbers.value.map((cell, cellIndex) => (cellIndex >= index ? '' : cell));\r\n activeNumber.value = index;\r\n emitChange();\r\n emit('active', inputRefs.value[index] ?? null, index);\r\n}\r\n\r\nfunction onChange(e: Event, index: number) {\r\n mutation((e.target as HTMLInputElement).value, index);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent, index: number) {\r\n if (event.key !== 'Backspace') {\r\n return;\r\n }\r\n\r\n if (numbers.value[index]) {\r\n return;\r\n }\r\n\r\n if (index > 0) {\r\n event.preventDefault();\r\n numbers.value = [...numbers.value];\r\n numbers.value[index - 1] = '';\r\n focusCell(index - 1);\r\n activeNumber.value = index - 1;\r\n emitChange();\r\n }\r\n}\r\n\r\nfunction onBlur() {\r\n requestAnimationFrame(() => {\r\n const active = document.activeElement;\r\n if (!inputRefs.value.includes(active as HTMLInputElement | null)) {\r\n activeNumber.value = -1;\r\n emit('blur');\r\n }\r\n });\r\n}\r\n\r\nwatch(\r\n () => [props.modelValue, props.length, props.numbersOnly] as const,\r\n () => {\r\n const next = cellsFromModel(props.modelValue ?? '');\r\n if (next.join('') !== numbers.value.join('') || next.length !== numbers.value.length) {\r\n numbers.value = next;\r\n }\r\n },\r\n { immediate: true },\r\n);\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-pin-code\"\r\n role=\"group\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n >\r\n <input\r\n v-for=\"(num, index) of numbers\"\r\n :id=\"index === 0 ? controlId : undefined\"\r\n :key=\"index\"\r\n :ref=\"(el) => (inputRefs[index] = el as HTMLInputElement)\"\r\n class=\"tao-pin-code__value\"\r\n :class=\"{\r\n 'tao-pin-code__value--active': activeNumber === index,\r\n 'tao-pin-code__value--invalid': invalid,\r\n }\"\r\n :value=\"num\"\r\n :placeholder=\"placeholder\"\r\n :type=\"hidden ? 'password' : 'text'\"\r\n :inputmode=\"numbersOnly ? 'numeric' : 'text'\"\r\n :pattern=\"numbersOnly ? '[0-9]' : undefined\"\r\n autocomplete=\"one-time-code\"\r\n :maxlength=\"index === 0 ? length : 1\"\r\n @input=\"onChange($event, index)\"\r\n @paste=\"onPaste($event, index)\"\r\n @keydown=\"onKeydown($event, index)\"\r\n @focus=\"onFocus(index)\"\r\n @blur=\"onBlur\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-pin-code {\r\n display: inline-flex;\r\n user-select: none;\r\n}\r\n\r\n.tao-pin-code__value {\r\n width: 50px;\r\n height: 56px;\r\n margin: 2px;\r\n border: 3px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-md);\r\n font-size: 21px;\r\n font-weight: 500;\r\n font-family: inherit;\r\n text-align: center;\r\n letter-spacing: 0;\r\n color: var(--tao-color-accent);\r\n background: var(--tao-color-input-bg);\r\n transition: var(--tao-transition-base);\r\n cursor: text;\r\n outline: none;\r\n}\r\n\r\n.tao-pin-code__value--active,\r\n.tao-pin-code__value:focus {\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-pin-code__value--invalid {\r\n border-color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, getCurrentInstance } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoLink' });\r\n\r\ninterface Props {\r\n to?: string | Record<string, unknown>;\r\n asNewTab?: boolean;\r\n private?: boolean;\r\n exactPath?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n to: undefined,\r\n asNewTab: false,\r\n private: false,\r\n exactPath: false,\r\n});\r\n\r\nconst globals = getCurrentInstance()?.appContext.components ?? {};\r\n\r\n// NuxtLink (Nuxt) → RouterLink (vue-router) → <a>.\r\n// Nuxt первым: это обёртка над RouterLink с prefetch.\r\n// Ищем в глобальном реестре, а не через resolveComponent — иначе Vue\r\n// пишет warning, если Nuxt/vue-router в проекте нет.\r\nconst linkKind = globals.NuxtLink ? 'nuxt' : globals.RouterLink ? 'router' : 'a';\r\nconst linkComponent =\r\n linkKind === 'nuxt' ? globals.NuxtLink : linkKind === 'router' ? globals.RouterLink : 'a';\r\n\r\nconst linkProps = computed(() => {\r\n const target = props.asNewTab ? '_blank' : undefined;\r\n const rel = (props.private && 'noopener noreferrer') || (props.asNewTab && 'noopener') || undefined;\r\n\r\n if (linkKind === 'a') {\r\n return {\r\n href: typeof props.to === 'string' ? props.to : undefined,\r\n target,\r\n rel,\r\n };\r\n }\r\n\r\n return {\r\n to: props.to,\r\n target,\r\n rel,\r\n ...(linkKind === 'nuxt' ? { exactPath: props.exactPath } : {}),\r\n };\r\n});\r\n</script>\r\n\r\n<template>\r\n <component :is=\"linkComponent\" v-bind=\"linkProps\" draggable=\"false\">\r\n <slot />\r\n </component>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, provide, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoFormField' });\r\n\r\nconst props = defineProps<{\r\n label?: string;\r\n hint?: string;\r\n error?: string;\r\n}>();\r\n\r\nconst id = useId();\r\nconst hintId = `${id}-hint`;\r\nconst errorId = `${id}-error`;\r\nconst labelId = `${id}-label`;\r\nconst invalid = computed(() => Boolean(props.error));\r\nconst describedBy = computed(() => {\r\n if (props.error) {\r\n return errorId;\r\n }\r\n\r\n if (props.hint) {\r\n return hintId;\r\n }\r\n\r\n return undefined;\r\n});\r\n\r\nprovide(formFieldKey, {\r\n id,\r\n invalid,\r\n describedBy,\r\n});\r\n\r\nfunction onLabelClick() {\r\n const target = document.getElementById(id);\r\n if (\r\n target instanceof HTMLInputElement ||\r\n target instanceof HTMLButtonElement ||\r\n target instanceof HTMLSelectElement ||\r\n target instanceof HTMLTextAreaElement\r\n ) {\r\n return;\r\n }\r\n\r\n const scope = target ?? document.getElementById(labelId)?.parentElement;\r\n scope\r\n ?.querySelector<HTMLElement>(\r\n 'input:not([disabled]), button:not([disabled]), textarea:not([disabled]), select:not([disabled])',\r\n )\r\n ?.focus();\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-form-field\" :class=\"{ 'tao-form-field--invalid': invalid }\">\r\n <label v-if=\"label\" :id=\"labelId\" class=\"tao-form-field__label\" :for=\"id\" @click=\"onLabelClick\">{{ label }}</label>\r\n <slot />\r\n <p v-if=\"error\" :id=\"errorId\" class=\"tao-form-field__error\">{{ error }}</p>\r\n <p v-else-if=\"hint\" :id=\"hintId\" class=\"tao-form-field__hint\">{{ hint }}</p>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-form-field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n width: 100%;\r\n}\r\n\r\n.tao-form-field__label {\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text);\r\n font-weight: 500;\r\n}\r\n\r\n.tao-form-field__hint {\r\n margin: 0;\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-form-field__error {\r\n margin: 0;\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport type { TaoSelectOption } from '../select';\r\n\r\ndefineOptions({ name: 'TaoSelect' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | number | null;\r\n options?: TaoSelectOption[];\r\n placeholder?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n clearText?: string;\r\n }>(),\r\n {\r\n modelValue: null,\r\n options: () => [],\r\n placeholder: 'Выберите',\r\n disabled: false,\r\n error: false,\r\n clearText: 'Очистить',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number | null];\r\n change: [value: string | number | null];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst listId = `${localId}-list`;\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst open = ref(false);\r\nconst activeIndex = ref(-1);\r\nconst triggerRef = ref<HTMLButtonElement | null>(null);\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst listRef = ref<HTMLElement | null>(null);\r\nconst listStyle = ref({ top: '0px', left: '0px', width: '0px' });\r\n\r\nconst selected = computed(() => props.options.find((option) => option.value === props.modelValue) ?? null);\r\nconst enabledIndexes = computed(() =>\r\n props.options.map((option, index) => (option.disabled ? -1 : index)).filter((index) => index >= 0),\r\n);\r\n\r\nfunction updatePosition() {\r\n const trigger = triggerRef.value;\r\n const panel = panelRef.value;\r\n\r\n if (!trigger || !panel) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const panelHeight = panel.offsetHeight;\r\n const panelWidth = panel.offsetWidth || rect.width;\r\n const gap = 4;\r\n const pad = 8;\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\r\n const maxLeft = Math.max(pad, window.innerWidth - panelWidth - pad);\r\n const left = Math.min(Math.max(rect.left, pad), maxLeft);\r\n\r\n listStyle.value = {\r\n top: `${openUp ? rect.top - panelHeight - gap : rect.bottom + gap}px`,\r\n left: `${left}px`,\r\n width: `${rect.width}px`,\r\n };\r\n}\r\n\r\nasync function setOpen(next: boolean) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n open.value = next;\r\n\r\n if (!next) {\r\n return;\r\n }\r\n\r\n const selectedIndex = props.options.findIndex((option) => option.value === props.modelValue);\r\n activeIndex.value =\r\n selectedIndex >= 0 && enabledIndexes.value.includes(selectedIndex)\r\n ? selectedIndex\r\n : (enabledIndexes.value[0] ?? -1);\r\n await nextTick();\r\n updatePosition();\r\n listRef.value?.focus();\r\n scrollActiveIntoView();\r\n}\r\n\r\nfunction toggle() {\r\n void setOpen(!open.value);\r\n}\r\n\r\nfunction close() {\r\n open.value = false;\r\n}\r\n\r\nfunction selectOption(option: TaoSelectOption) {\r\n if (option.disabled) {\r\n return;\r\n }\r\n\r\n emit('update:modelValue', option.value);\r\n emit('change', option.value);\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction clear() {\r\n emit('update:modelValue', null);\r\n emit('change', null);\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction moveActive(delta: number) {\r\n const enabled = enabledIndexes.value;\r\n\r\n if (!enabled.length) {\r\n return;\r\n }\r\n\r\n const currentPos = enabled.indexOf(activeIndex.value);\r\n const nextPos = currentPos < 0 ? 0 : (currentPos + delta + enabled.length) % enabled.length;\r\n activeIndex.value = enabled[nextPos];\r\n scrollActiveIntoView();\r\n}\r\n\r\nfunction scrollActiveIntoView() {\r\n const list = listRef.value;\r\n\r\n if (!list || activeIndex.value < 0) {\r\n return;\r\n }\r\n\r\n const option = list.querySelector<HTMLElement>(`[data-tao-select-index=\"${activeIndex.value}\"]`);\r\n option?.scrollIntoView({ block: 'nearest' });\r\n}\r\n\r\nfunction onTriggerKeydown(event: KeyboardEvent) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n if ((event.key === 'Backspace' || event.key === 'Delete') && selected.value) {\r\n event.preventDefault();\r\n clear();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n void setOpen(true);\r\n }\r\n}\r\n\r\nfunction onListKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n close();\r\n triggerRef.value?.focus();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n moveActive(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n moveActive(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n activeIndex.value = enabledIndexes.value[0] ?? -1;\r\n scrollActiveIntoView();\r\n return;\r\n }\r\n\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n activeIndex.value = enabledIndexes.value[enabledIndexes.value.length - 1] ?? -1;\r\n scrollActiveIntoView();\r\n return;\r\n }\r\n\r\n if (event.key === 'Backspace' || event.key === 'Delete') {\r\n if (selected.value) {\r\n event.preventDefault();\r\n clear();\r\n }\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n const option = props.options[activeIndex.value];\r\n\r\n if (option) {\r\n selectOption(option);\r\n }\r\n }\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n\r\n if (triggerRef.value?.contains(target) || panelRef.value?.contains(target)) {\r\n return;\r\n }\r\n\r\n close();\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (open.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(open, (isOpen) => {\r\n if (isOpen) {\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-select\" :class=\"{ 'tao-select--open': open, 'tao-select--invalid': invalid }\">\r\n <button\r\n :id=\"controlId\"\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n class=\"tao-select__trigger\"\r\n :class=\"{ 'tao-select__trigger--placeholder': !selected }\"\r\n role=\"combobox\"\r\n :aria-expanded=\"open\"\r\n aria-haspopup=\"listbox\"\r\n :aria-controls=\"listId\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :disabled=\"disabled\"\r\n @click=\"toggle\"\r\n @keydown=\"onTriggerKeydown\"\r\n >\r\n <span class=\"tao-select__value\">{{ selected?.label ?? placeholder }}</span>\r\n <span\r\n class=\"tao-select__chevron\"\r\n :class=\"{ 'tao-select__chevron--custom': $slots.chevron }\"\r\n aria-hidden=\"true\"\r\n >\r\n <slot name=\"chevron\" />\r\n </span>\r\n </button>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"open\"\r\n ref=\"panelRef\"\r\n class=\"tao-select__panel\"\r\n :style=\"listStyle\"\r\n >\r\n <ul\r\n :id=\"listId\"\r\n ref=\"listRef\"\r\n class=\"tao-select__list\"\r\n role=\"listbox\"\r\n tabindex=\"-1\"\r\n :aria-activedescendant=\"activeIndex >= 0 ? `${listId}-opt-${activeIndex}` : undefined\"\r\n @keydown=\"onListKeydown\"\r\n >\r\n <li\r\n v-for=\"(option, index) in options\"\r\n :id=\"`${listId}-opt-${index}`\"\r\n :key=\"String(option.value)\"\r\n class=\"tao-select__option\"\r\n :class=\"{\r\n 'tao-select__option--active': index === activeIndex,\r\n 'tao-select__option--selected': option.value === modelValue,\r\n 'tao-select__option--disabled': option.disabled,\r\n }\"\r\n role=\"option\"\r\n :aria-selected=\"option.value === modelValue\"\r\n :aria-disabled=\"option.disabled || undefined\"\r\n :data-tao-select-index=\"index\"\r\n @mousedown.prevent\r\n @click=\"selectOption(option)\"\r\n @mouseenter=\"!option.disabled && (activeIndex = index)\"\r\n >\r\n {{ option.label }}\r\n </li>\r\n </ul>\r\n <button\r\n v-if=\"selected\"\r\n type=\"button\"\r\n class=\"tao-select__clear\"\r\n @mousedown.prevent\r\n @click=\"clear\"\r\n >\r\n <slot name=\"clear\">{{ clearText }}</slot>\r\n </button>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.tao-select__panel {\r\n z-index: 1050;\r\n position: fixed;\r\n overflow: hidden;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-overlay);\r\n}\r\n\r\n.tao-select__list {\r\n margin: 0;\r\n padding: var(--tao-space-1);\r\n max-height: 240px;\r\n overflow: auto;\r\n list-style: none;\r\n}\r\n\r\n.tao-select__list:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-select__clear {\r\n display: block;\r\n width: 100%;\r\n margin: 0;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border: none;\r\n border-top: 1px solid var(--tao-color-border);\r\n background: none;\r\n color: var(--tao-color-text-muted);\r\n font: inherit;\r\n font-size: var(--tao-font-size-sm);\r\n text-align: left;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-select__clear:hover {\r\n color: var(--tao-color-accent);\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-select__option {\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border-radius: var(--tao-radius-sm);\r\n font-size: var(--tao-font-size-md);\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.tao-select__option--active,\r\n.tao-select__option:hover:not(.tao-select__option--disabled) {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-select__option--selected {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-select__option--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-select {\r\n width: 100%;\r\n}\r\n\r\n.tao-select__trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n min-height: 36px;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n text-align: left;\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-select__trigger--placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-select__trigger:focus {\r\n outline: none;\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-select--invalid .tao-select__trigger {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-select--invalid .tao-select__trigger:focus {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-select__trigger:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-select__value {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-select__chevron {\r\n flex-shrink: 0;\r\n width: 0;\r\n height: 0;\r\n border-left: 4px solid transparent;\r\n border-right: 4px solid transparent;\r\n border-top: 5px solid currentColor;\r\n opacity: 0.6;\r\n transition: transform var(--tao-duration-fast) var(--tao-ease-base);\r\n}\r\n\r\n.tao-select--open .tao-select__chevron {\r\n transform: rotate(180deg);\r\n}\r\n\r\n.tao-select__chevron--custom {\r\n display: inline-flex;\r\n width: auto;\r\n height: auto;\r\n border: none;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { listenFocusLoss } from '../focusLoss';\r\nimport type { TaoSelectOption } from '../select';\r\n\r\ndefineOptions({ name: 'TaoCombobox' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | number | null;\r\n options?: TaoSelectOption[];\r\n placeholder?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n emptyText?: string;\r\n clearText?: string;\r\n /** Можно оставить то, чего нет в списке. */\r\n allowCreate?: boolean;\r\n }>(),\r\n {\r\n modelValue: null,\r\n options: () => [],\r\n placeholder: 'Начните вводить',\r\n disabled: false,\r\n error: false,\r\n emptyText: 'Ничего не найдено',\r\n clearText: 'Очистить',\r\n allowCreate: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number | null];\r\n change: [value: string | number | null];\r\n /** Новое значение, которого не было в `options`. Список сам не трогаем — его дополняет родитель. */\r\n create: [value: string];\r\n}>();\r\n\r\ntype ComboRow = { kind: 'option'; option: TaoSelectOption } | { kind: 'create'; text: string };\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst listId = `${localId}-list`;\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst open = ref(false);\r\nconst focused = ref(false);\r\nconst picking = ref(false);\r\nconst skipFocusOpen = ref(false);\r\nconst query = ref('');\r\nconst activeIndex = ref(-1);\r\nconst fieldRef = ref<HTMLElement | null>(null);\r\nconst inputRef = ref<HTMLInputElement | null>(null);\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst listRef = ref<HTMLElement | null>(null);\r\nconst listStyle = ref({ top: '0px', left: '0px', width: '0px' });\r\n\r\nconst selected = computed((): TaoSelectOption | null => {\r\n const found = props.options.find((option) => option.value === props.modelValue);\r\n if (found) {\r\n return found;\r\n }\r\n if (props.modelValue === null || props.modelValue === undefined || props.modelValue === '') {\r\n return null;\r\n }\r\n return { value: props.modelValue, label: String(props.modelValue) };\r\n});\r\n\r\nconst needle = computed(() => query.value.trim().toLowerCase());\r\n\r\nconst filtered = computed(() => {\r\n if (!needle.value) {\r\n return props.options;\r\n }\r\n return props.options.filter((option) => option.label.toLowerCase().includes(needle.value));\r\n});\r\n\r\nconst canCreate = computed(() => {\r\n const text = query.value.trim();\r\n if (!props.allowCreate || !text) {\r\n return false;\r\n }\r\n return !props.options.some((option) => option.label.toLowerCase() === text.toLowerCase());\r\n});\r\n\r\nconst rows = computed((): ComboRow[] => {\r\n const next: ComboRow[] = filtered.value.map((option) => ({ kind: 'option', option }));\r\n if (canCreate.value) {\r\n next.push({ kind: 'create', text: query.value.trim() });\r\n }\r\n return next;\r\n});\r\n\r\nconst enabledIndexes = computed(() =>\r\n rows.value\r\n .map((row, index) => (row.kind === 'option' && row.option.disabled ? -1 : index))\r\n .filter((index) => index >= 0),\r\n);\r\n\r\nconst activeId = computed(() => (activeIndex.value >= 0 ? `${listId}-row-${activeIndex.value}` : undefined));\r\n\r\nfunction syncQueryFromModel() {\r\n query.value = selected.value?.label ?? '';\r\n}\r\n\r\nfunction updatePosition() {\r\n const trigger = fieldRef.value;\r\n const panel = panelRef.value;\r\n\r\n if (!trigger || !panel) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const panelHeight = panel.offsetHeight;\r\n const panelWidth = panel.offsetWidth || rect.width;\r\n const gap = 4;\r\n const pad = 8;\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\r\n const maxLeft = Math.max(pad, window.innerWidth - panelWidth - pad);\r\n const left = Math.min(Math.max(rect.left, pad), maxLeft);\r\n\r\n listStyle.value = {\r\n top: `${openUp ? rect.top - panelHeight - gap : rect.bottom + gap}px`,\r\n left: `${left}px`,\r\n width: `${rect.width}px`,\r\n };\r\n}\r\n\r\nfunction resetActive() {\r\n const selectedIndex = rows.value.findIndex(\r\n (row) => row.kind === 'option' && row.option.value === props.modelValue,\r\n );\r\n if (selectedIndex >= 0 && enabledIndexes.value.includes(selectedIndex)) {\r\n activeIndex.value = selectedIndex;\r\n return;\r\n }\r\n activeIndex.value = enabledIndexes.value[0] ?? -1;\r\n}\r\n\r\nasync function setOpen(next: boolean) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n open.value = next;\r\n\r\n if (!next) {\r\n return;\r\n }\r\n\r\n resetActive();\r\n await nextTick();\r\n updatePosition();\r\n scrollActiveIntoView();\r\n}\r\n\r\nfunction emitValue(value: string | number | null) {\r\n emit('update:modelValue', value);\r\n emit('change', value);\r\n}\r\n\r\nfunction keepFocusQuiet() {\r\n skipFocusOpen.value = true;\r\n picking.value = false;\r\n inputRef.value?.focus();\r\n}\r\n\r\nfunction commitCreated(value: string) {\r\n emitValue(value);\r\n emit('create', value);\r\n query.value = value;\r\n open.value = false;\r\n keepFocusQuiet();\r\n}\r\n\r\nfunction selectOption(option: TaoSelectOption) {\r\n if (option.disabled) {\r\n return;\r\n }\r\n\r\n emitValue(option.value);\r\n query.value = option.label;\r\n open.value = false;\r\n keepFocusQuiet();\r\n}\r\n\r\nfunction createFromQuery(text: string) {\r\n const value = text.trim();\r\n if (!value) {\r\n return;\r\n }\r\n\r\n const exact = props.options.find(\r\n (option) => !option.disabled && option.label.toLowerCase() === value.toLowerCase(),\r\n );\r\n if (exact) {\r\n selectOption(exact);\r\n return;\r\n }\r\n\r\n if (!props.allowCreate) {\r\n return;\r\n }\r\n\r\n commitCreated(value);\r\n}\r\n\r\nfunction clear() {\r\n emitValue(null);\r\n query.value = '';\r\n open.value = false;\r\n inputRef.value?.focus();\r\n}\r\n\r\nfunction revertQuery() {\r\n syncQueryFromModel();\r\n}\r\n\r\nfunction closeAndRevert() {\r\n open.value = false;\r\n revertQuery();\r\n}\r\n\r\nfunction closeAndCommit() {\r\n open.value = false;\r\n const text = query.value.trim();\r\n if (!text) {\r\n revertQuery();\r\n return;\r\n }\r\n\r\n const exact = props.options.find(\r\n (option) => !option.disabled && option.label.toLowerCase() === text.toLowerCase(),\r\n );\r\n if (exact) {\r\n emitValue(exact.value);\r\n query.value = exact.label;\r\n return;\r\n }\r\n\r\n if (props.allowCreate) {\r\n emitValue(text);\r\n emit('create', text);\r\n query.value = text;\r\n return;\r\n }\r\n\r\n revertQuery();\r\n}\r\n\r\nfunction moveActive(delta: number) {\r\n const enabled = enabledIndexes.value;\r\n if (!enabled.length) {\r\n return;\r\n }\r\n\r\n const currentPos = enabled.indexOf(activeIndex.value);\r\n const nextPos = currentPos < 0 ? 0 : (currentPos + delta + enabled.length) % enabled.length;\r\n activeIndex.value = enabled[nextPos];\r\n scrollActiveIntoView();\r\n}\r\n\r\nfunction scrollActiveIntoView() {\r\n const list = listRef.value;\r\n if (!list || activeIndex.value < 0) {\r\n return;\r\n }\r\n\r\n const option = list.querySelector<HTMLElement>(`[data-tao-combobox-index=\"${activeIndex.value}\"]`);\r\n option?.scrollIntoView({ block: 'nearest' });\r\n}\r\n\r\nfunction onFieldMouseDown(event: MouseEvent) {\r\n if (props.disabled || event.button !== 0) {\r\n return;\r\n }\r\n\r\n const onInput = event.target === inputRef.value;\r\n if (onInput) {\r\n if (focused.value && !open.value) {\r\n void setOpen(true);\r\n }\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n if (open.value) {\r\n open.value = false;\r\n return;\r\n }\r\n\r\n inputRef.value?.focus();\r\n void setOpen(true);\r\n}\r\n\r\nfunction onInput() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n void setOpen(true);\r\n resetActive();\r\n}\r\n\r\nfunction onFocus() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n focused.value = true;\r\n if (skipFocusOpen.value) {\r\n skipFocusOpen.value = false;\r\n return;\r\n }\r\n void setOpen(true);\r\n nextTick(() => inputRef.value?.select());\r\n}\r\n\r\nfunction markPicking() {\r\n picking.value = true;\r\n}\r\n\r\nfunction onBlur() {\r\n focused.value = false;\r\n window.setTimeout(() => {\r\n if (picking.value) {\r\n picking.value = false;\r\n return;\r\n }\r\n if (fieldRef.value?.contains(document.activeElement) || panelRef.value?.contains(document.activeElement)) {\r\n return;\r\n }\r\n if (props.allowCreate) {\r\n closeAndCommit();\r\n return;\r\n }\r\n closeAndRevert();\r\n }, 0);\r\n}\r\n\r\nfunction activateRow(row: ComboRow) {\r\n if (row.kind === 'create') {\r\n createFromQuery(row.text);\r\n return;\r\n }\r\n selectOption(row.option);\r\n}\r\n\r\nfunction onInputKeydown(event: KeyboardEvent) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n closeAndRevert();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n if (!open.value) {\r\n void setOpen(true);\r\n return;\r\n }\r\n moveActive(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n if (!open.value) {\r\n void setOpen(true);\r\n return;\r\n }\r\n moveActive(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter') {\r\n event.preventDefault();\r\n if (!open.value) {\r\n void setOpen(true);\r\n return;\r\n }\r\n const row = rows.value[activeIndex.value];\r\n if (row) {\r\n activateRow(row);\r\n return;\r\n }\r\n if (props.allowCreate) {\r\n createFromQuery(query.value);\r\n }\r\n }\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n if (fieldRef.value?.contains(target) || panelRef.value?.contains(target)) {\r\n return;\r\n }\r\n\r\n if (props.allowCreate) {\r\n closeAndCommit();\r\n return;\r\n }\r\n closeAndRevert();\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (open.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n () => {\r\n if (!focused.value) {\r\n syncQueryFromModel();\r\n }\r\n },\r\n { immediate: true },\r\n);\r\n\r\nwatch(rows, () => {\r\n if (!open.value) {\r\n return;\r\n }\r\n if (!enabledIndexes.value.includes(activeIndex.value)) {\r\n activeIndex.value = enabledIndexes.value[0] ?? -1;\r\n }\r\n});\r\n\r\nwatch(open, (isOpen) => {\r\n if (isOpen) {\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(() => {\r\n picking.value = false;\r\n });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n stopFocusLoss?.();\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-combobox\"\r\n :class=\"{\r\n 'tao-combobox--open': open,\r\n 'tao-combobox--invalid': invalid,\r\n 'tao-combobox--disabled': disabled,\r\n }\"\r\n >\r\n <div ref=\"fieldRef\" class=\"tao-combobox__field\" @mousedown=\"onFieldMouseDown\">\r\n <input\r\n :id=\"controlId\"\r\n ref=\"inputRef\"\r\n class=\"tao-combobox__input\"\r\n type=\"text\"\r\n role=\"combobox\"\r\n autocomplete=\"off\"\r\n aria-autocomplete=\"list\"\r\n aria-haspopup=\"listbox\"\r\n :aria-expanded=\"open\"\r\n :aria-controls=\"listId\"\r\n :aria-activedescendant=\"open ? activeId : undefined\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :disabled=\"disabled\"\r\n :placeholder=\"placeholder\"\r\n :value=\"query\"\r\n @input=\"query = ($event.target as HTMLInputElement).value; onInput()\"\r\n @focus=\"onFocus\"\r\n @blur=\"onBlur\"\r\n @keydown=\"onInputKeydown\"\r\n />\r\n <span\r\n class=\"tao-combobox__chevron\"\r\n :class=\"{ 'tao-combobox__chevron--custom': $slots.chevron }\"\r\n aria-hidden=\"true\"\r\n >\r\n <slot name=\"chevron\" />\r\n </span>\r\n </div>\r\n\r\n <Teleport to=\"body\">\r\n <div v-if=\"open\" ref=\"panelRef\" class=\"tao-combobox__panel\" :style=\"listStyle\">\r\n <ul :id=\"listId\" ref=\"listRef\" class=\"tao-combobox__list\" role=\"listbox\">\r\n <li v-if=\"!rows.length\" class=\"tao-combobox__empty\">\r\n <slot name=\"empty\">{{ emptyText }}</slot>\r\n </li>\r\n <li\r\n v-for=\"(row, index) in rows\"\r\n :id=\"`${listId}-row-${index}`\"\r\n :key=\"row.kind === 'create' ? 'create' : String(row.option.value)\"\r\n class=\"tao-combobox__option\"\r\n :class=\"{\r\n 'tao-combobox__option--active': index === activeIndex,\r\n 'tao-combobox__option--selected':\r\n row.kind === 'option' && row.option.value === modelValue,\r\n 'tao-combobox__option--disabled': row.kind === 'option' && row.option.disabled,\r\n 'tao-combobox__option--create': row.kind === 'create',\r\n }\"\r\n role=\"option\"\r\n :aria-selected=\"row.kind === 'option' && row.option.value === modelValue\"\r\n :aria-disabled=\"row.kind === 'option' && row.option.disabled ? true : undefined\"\r\n :data-tao-combobox-index=\"index\"\r\n @mousedown.prevent=\"markPicking\"\r\n @click=\"activateRow(row)\"\r\n @mouseenter=\"!(row.kind === 'option' && row.option.disabled) && (activeIndex = index)\"\r\n >\r\n <template v-if=\"row.kind === 'create'\">\r\n <slot name=\"create\" :text=\"row.text\">Добавить «{{ row.text }}»</slot>\r\n </template>\r\n <template v-else>{{ row.option.label }}</template>\r\n </li>\r\n </ul>\r\n <button\r\n v-if=\"selected\"\r\n type=\"button\"\r\n class=\"tao-combobox__clear\"\r\n @mousedown.prevent=\"markPicking\"\r\n @click=\"clear\"\r\n >\r\n <slot name=\"clear\">{{ clearText }}</slot>\r\n </button>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.tao-combobox__panel {\r\n z-index: 1050;\r\n position: fixed;\r\n overflow: hidden;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-overlay);\r\n}\r\n\r\n.tao-combobox__list {\r\n margin: 0;\r\n padding: var(--tao-space-1);\r\n max-height: 240px;\r\n overflow: auto;\r\n list-style: none;\r\n}\r\n\r\n.tao-combobox__empty {\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-sm);\r\n}\r\n\r\n.tao-combobox__clear {\r\n display: block;\r\n width: 100%;\r\n margin: 0;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border: none;\r\n border-top: 1px solid var(--tao-color-border);\r\n background: none;\r\n color: var(--tao-color-text-muted);\r\n font: inherit;\r\n font-size: var(--tao-font-size-sm);\r\n text-align: left;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-combobox__clear:hover {\r\n color: var(--tao-color-accent);\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-combobox__option {\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border-radius: var(--tao-radius-sm);\r\n font-size: var(--tao-font-size-md);\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.tao-combobox__option--active,\r\n.tao-combobox__option:hover:not(.tao-combobox__option--disabled) {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-combobox__option--selected {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-combobox__option--create {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-combobox__option--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-combobox {\r\n width: 100%;\r\n}\r\n\r\n.tao-combobox__field {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n min-height: 36px;\r\n padding: 0 var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-combobox__field:focus-within {\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-combobox--invalid .tao-combobox__field {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-combobox--invalid .tao-combobox__field:focus-within {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-combobox__input {\r\n flex: 1;\r\n min-width: 0;\r\n height: 34px;\r\n padding: 0;\r\n border: none;\r\n background: transparent;\r\n color: inherit;\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n outline: none;\r\n}\r\n\r\n.tao-combobox__input::placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-combobox__input:disabled {\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-combobox--disabled .tao-combobox__field {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-combobox__chevron {\r\n flex-shrink: 0;\r\n width: 0;\r\n height: 0;\r\n border-left: 4px solid transparent;\r\n border-right: 4px solid transparent;\r\n border-top: 5px solid currentColor;\r\n opacity: 0.6;\r\n pointer-events: none;\r\n transition: transform var(--tao-duration-fast) var(--tao-ease-base);\r\n}\r\n\r\n.tao-combobox--open .tao-combobox__chevron {\r\n transform: rotate(180deg);\r\n}\r\n\r\n.tao-combobox__chevron--custom {\r\n display: inline-flex;\r\n width: auto;\r\n height: auto;\r\n border: none;\r\n}\r\n</style>\r\n","export interface TaoDateParts {\r\n y: number;\r\n m: number;\r\n d: number;\r\n}\r\n\r\nexport interface TaoDateCell {\r\n iso: string;\r\n day: number;\r\n currentMonth: boolean;\r\n}\r\n\r\nexport interface TaoDateRangeValue {\r\n start: string;\r\n end: string;\r\n}\r\n\r\nconst ISO_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\r\n\r\nexport function formatTaoDateIso(parts: TaoDateParts): string {\r\n return `${String(parts.y).padStart(4, '0')}-${String(parts.m).padStart(2, '0')}-${String(parts.d).padStart(2, '0')}`;\r\n}\r\n\r\nexport function parseTaoDate(value: string | null | undefined): TaoDateParts | null {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const match = ISO_DATE.exec(value);\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n const y = Number(match[1]);\r\n const m = Number(match[2]);\r\n const d = Number(match[3]);\r\n const date = new Date(y, m - 1, d);\r\n\r\n if (date.getFullYear() !== y || date.getMonth() !== m - 1 || date.getDate() !== d) {\r\n return null;\r\n }\r\n\r\n return { y, m, d };\r\n}\r\n\r\nexport function todayTaoDate(): string {\r\n const now = new Date();\r\n return formatTaoDateIso({ y: now.getFullYear(), m: now.getMonth() + 1, d: now.getDate() });\r\n}\r\n\r\nexport function shiftTaoDate(iso: string, days: number): string {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return iso;\r\n }\r\n\r\n const date = new Date(parts.y, parts.m - 1, parts.d + days);\r\n return formatTaoDateIso({ y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate() });\r\n}\r\n\r\nexport function shiftTaoMonth(iso: string, months: number): string {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return iso;\r\n }\r\n\r\n const monthStart = new Date(parts.y, parts.m - 1 + months, 1);\r\n const y = monthStart.getFullYear();\r\n const m = monthStart.getMonth() + 1;\r\n const lastDay = new Date(y, m, 0).getDate();\r\n return formatTaoDateIso({ y, m, d: Math.min(parts.d, lastDay) });\r\n}\r\n\r\nexport function clampTaoDateCursor(iso: string, min?: string, max?: string): string {\r\n if (isTaoDateInRange(iso, min, max)) {\r\n return iso;\r\n }\r\n\r\n if (min && parseTaoDate(min) && iso < min) {\r\n return min;\r\n }\r\n\r\n if (max && parseTaoDate(max) && iso > max) {\r\n return max;\r\n }\r\n\r\n return iso;\r\n}\r\n\r\nexport function isTaoDateInRange(iso: string, min?: string, max?: string): boolean {\r\n if (!parseTaoDate(iso)) {\r\n return false;\r\n }\r\n\r\n if (min && parseTaoDate(min) && iso < min) {\r\n return false;\r\n }\r\n\r\n if (max && parseTaoDate(max) && iso > max) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function formatTaoDateLabel(iso: string, locale = 'ru-RU'): string {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return '';\r\n }\r\n\r\n return new Date(parts.y, parts.m - 1, parts.d).toLocaleDateString(locale, {\r\n day: 'numeric',\r\n month: 'long',\r\n year: 'numeric',\r\n });\r\n}\r\n\r\nexport function sortTaoDateRange(a: string, b: string): TaoDateRangeValue {\r\n return a <= b ? { start: a, end: b } : { start: b, end: a };\r\n}\r\n\r\nexport function parseTaoDateRange(value: TaoDateRangeValue | null | undefined): TaoDateRangeValue | null {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const start = parseTaoDate(value.start);\r\n const end = parseTaoDate(value.end);\r\n if (!start || !end) {\r\n return null;\r\n }\r\n\r\n return sortTaoDateRange(formatTaoDateIso(start), formatTaoDateIso(end));\r\n}\r\n\r\nexport function formatTaoDateRangeLabel(start: string, end: string, locale = 'ru-RU'): string {\r\n const fromParts = parseTaoDate(start);\r\n const toParts = parseTaoDate(end);\r\n if (!fromParts || !toParts) {\r\n return '';\r\n }\r\n\r\n if (start === end) {\r\n return formatTaoDateLabel(start, locale);\r\n }\r\n\r\n const from = new Date(fromParts.y, fromParts.m - 1, fromParts.d).toLocaleDateString(locale, {\r\n day: 'numeric',\r\n month: 'long',\r\n ...(fromParts.y === toParts.y ? {} : { year: 'numeric' }),\r\n });\r\n\r\n return `${from} — ${formatTaoDateLabel(end, locale)}`;\r\n}\r\n\r\nexport function formatTaoMonthLabel(year: number, month: number, locale = 'ru-RU'): string {\r\n const label = new Date(year, month - 1, 1).toLocaleDateString(locale, {\r\n month: 'long',\r\n year: 'numeric',\r\n });\r\n return label.charAt(0).toUpperCase() + label.slice(1);\r\n}\r\n\r\nexport function taoDateWeekdayIndex(iso: string): number {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return 0;\r\n }\r\n\r\n return (new Date(parts.y, parts.m - 1, parts.d).getDay() + 6) % 7;\r\n}\r\n\r\nexport function taoWeekdayLabels(locale = 'ru-RU'): string[] {\r\n return Array.from({ length: 7 }, (_, index) => {\r\n const label = new Date(2026, 0, 5 + index).toLocaleDateString(locale, { weekday: 'short' });\r\n return label.replace(/\\.$/, '');\r\n });\r\n}\r\n\r\n/** Monday-first 6×7 grid so the popup height stays stable. */\r\nexport function buildTaoDateGrid(year: number, month: number): TaoDateCell[] {\r\n const first = new Date(year, month - 1, 1);\r\n const mondayOffset = (first.getDay() + 6) % 7;\r\n const start = new Date(year, month - 1, 1 - mondayOffset);\r\n\r\n return Array.from({ length: 42 }, (_, index) => {\r\n const date = new Date(start.getFullYear(), start.getMonth(), start.getDate() + index);\r\n return {\r\n iso: formatTaoDateIso({ y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate() }),\r\n day: date.getDate(),\r\n currentMonth: date.getMonth() === month - 1,\r\n };\r\n });\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport {\r\n buildTaoDateGrid,\r\n formatTaoDateIso,\r\n formatTaoDateLabel,\r\n formatTaoMonthLabel,\r\n isTaoDateInRange,\r\n parseTaoDate,\r\n shiftTaoDate,\r\n shiftTaoMonth,\r\n clampTaoDateCursor,\r\n taoDateWeekdayIndex,\r\n taoWeekdayLabels,\r\n todayTaoDate,\r\n} from '../date';\r\nimport '../styles/date-popup.css';\r\n\r\ndefineOptions({ name: 'TaoDate' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | null;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n min?: string;\r\n max?: string;\r\n locale?: string;\r\n todayText?: string;\r\n clearText?: string;\r\n prevMonthLabel?: string;\r\n nextMonthLabel?: string;\r\n }>(),\r\n {\r\n modelValue: null,\r\n placeholder: 'Дата',\r\n disabled: false,\r\n error: false,\r\n min: undefined,\r\n max: undefined,\r\n locale: 'ru-RU',\r\n todayText: 'Сегодня',\r\n clearText: 'Очистить',\r\n prevMonthLabel: 'Предыдущий месяц',\r\n nextMonthLabel: 'Следующий месяц',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | null];\r\n change: [value: string | null];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst gridId = `${localId}-grid`;\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst open = ref(false);\r\nconst viewYear = ref(2026);\r\nconst viewMonth = ref(1);\r\nconst cursorIso = ref(todayTaoDate());\r\nconst triggerRef = ref<HTMLButtonElement | null>(null);\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst panelStyle = ref({ top: '0px', left: '0px' });\r\n\r\nconst valueIso = computed(() => {\r\n const parsed = parseTaoDate(props.modelValue);\r\n return parsed ? formatTaoDateIso(parsed) : null;\r\n});\r\nconst displayLabel = computed(() => (valueIso.value ? formatTaoDateLabel(valueIso.value, props.locale) : ''));\r\nconst weekdays = computed(() => taoWeekdayLabels(props.locale));\r\nconst monthLabel = computed(() => formatTaoMonthLabel(viewYear.value, viewMonth.value, props.locale));\r\nconst cells = computed(() => buildTaoDateGrid(viewYear.value, viewMonth.value));\r\nconst todayIso = computed(() => todayTaoDate());\r\nconst todayEnabled = computed(() => isTaoDateInRange(todayIso.value, props.min, props.max));\r\n\r\nfunction syncViewFrom(iso: string) {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return;\r\n }\r\n\r\n viewYear.value = parts.y;\r\n viewMonth.value = parts.m;\r\n cursorIso.value = iso;\r\n}\r\n\r\nfunction updatePosition() {\r\n const trigger = triggerRef.value;\r\n const panel = panelRef.value;\r\n if (!trigger || !panel) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const height = panel.offsetHeight;\r\n const width = panel.offsetWidth;\r\n const gap = 4;\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const openUp = spaceBelow < height && rect.top > spaceBelow;\r\n const left = Math.min(rect.left, Math.max(8, window.innerWidth - width - 8));\r\n\r\n panelStyle.value = {\r\n top: `${openUp ? rect.top - height - gap : rect.bottom + gap}px`,\r\n left: `${Math.max(8, left)}px`,\r\n };\r\n}\r\n\r\nasync function setOpen(next: boolean) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n open.value = next;\r\n if (!next) {\r\n return;\r\n }\r\n\r\n syncViewFrom(clampTaoDateCursor(valueIso.value ?? todayIso.value, props.min, props.max));\r\n await nextTick();\r\n updatePosition();\r\n panelRef.value?.focus();\r\n}\r\n\r\nfunction toggle() {\r\n void setOpen(!open.value);\r\n}\r\n\r\nfunction close() {\r\n open.value = false;\r\n}\r\n\r\nfunction selectDay(iso: string) {\r\n if (!isTaoDateInRange(iso, props.min, props.max)) {\r\n return;\r\n }\r\n\r\n emit('update:modelValue', iso);\r\n emit('change', iso);\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction clear() {\r\n emit('update:modelValue', null);\r\n emit('change', null);\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction goMonth(delta: number) {\r\n cursorIso.value = clampTaoDateCursor(shiftTaoMonth(cursorIso.value, delta), props.min, props.max);\r\n syncViewFrom(cursorIso.value);\r\n void nextTick(updatePosition);\r\n}\r\n\r\nfunction moveCursor(days: number) {\r\n const next = shiftTaoDate(cursorIso.value, days);\r\n cursorIso.value = isTaoDateInRange(next, props.min, props.max)\r\n ? next\r\n : clampTaoDateCursor(next, props.min, props.max);\r\n syncViewFrom(cursorIso.value);\r\n void nextTick(updatePosition);\r\n}\r\n\r\nfunction onTriggerKeydown(event: KeyboardEvent) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n void setOpen(true);\r\n }\r\n}\r\n\r\nfunction onPanelKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n close();\r\n triggerRef.value?.focus();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowLeft') {\r\n event.preventDefault();\r\n moveCursor(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n event.preventDefault();\r\n moveCursor(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n moveCursor(-7);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n moveCursor(7);\r\n return;\r\n }\r\n\r\n if (event.key === 'PageUp') {\r\n event.preventDefault();\r\n goMonth(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'PageDown') {\r\n event.preventDefault();\r\n goMonth(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n moveCursor(-taoDateWeekdayIndex(cursorIso.value));\r\n return;\r\n }\r\n\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n moveCursor(6 - taoDateWeekdayIndex(cursorIso.value));\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n selectDay(cursorIso.value);\r\n }\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n if (triggerRef.value?.contains(target) || panelRef.value?.contains(target)) {\r\n return;\r\n }\r\n\r\n close();\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (open.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(open, (isOpen) => {\r\n if (isOpen) {\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-date\" :class=\"{ 'tao-date--open': open, 'tao-date--invalid': invalid }\">\r\n <button\r\n :id=\"controlId\"\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n class=\"tao-date__trigger\"\r\n :class=\"{ 'tao-date__trigger--placeholder': !valueIso }\"\r\n role=\"combobox\"\r\n :aria-expanded=\"open\"\r\n aria-haspopup=\"dialog\"\r\n :aria-controls=\"gridId\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :disabled=\"disabled\"\r\n @click=\"toggle\"\r\n @keydown=\"onTriggerKeydown\"\r\n >\r\n <span class=\"tao-date__value\">{{ displayLabel || placeholder }}</span>\r\n <span class=\"tao-date__icon\" aria-hidden=\"true\">\r\n <slot name=\"icon\">\r\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" focusable=\"false\">\r\n <rect\r\n x=\"2\"\r\n y=\"3\"\r\n width=\"12\"\r\n height=\"11\"\r\n rx=\"1.5\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.4\"\r\n />\r\n <path d=\"M5 1.5v3M11 1.5v3M2 6.5h12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"open\"\r\n :id=\"gridId\"\r\n ref=\"panelRef\"\r\n class=\"tao-date__panel\"\r\n role=\"dialog\"\r\n :aria-label=\"monthLabel\"\r\n tabindex=\"-1\"\r\n :style=\"panelStyle\"\r\n @keydown=\"onPanelKeydown\"\r\n >\r\n <div class=\"tao-date__header\">\r\n <button type=\"button\" class=\"tao-date__nav\" :aria-label=\"prevMonthLabel\" @click=\"goMonth(-1)\">\r\n <span aria-hidden=\"true\">\r\n <slot name=\"prev-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M14.5 5 8 12l6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n <p class=\"tao-date__month\">{{ monthLabel }}</p>\r\n <button type=\"button\" class=\"tao-date__nav\" :aria-label=\"nextMonthLabel\" @click=\"goMonth(1)\">\r\n <span aria-hidden=\"true\">\r\n <slot name=\"next-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M9.5 5 16 12l-6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"tao-date__weekdays\" aria-hidden=\"true\">\r\n <span v-for=\"day in weekdays\" :key=\"day\">{{ day }}</span>\r\n </div>\r\n\r\n <div class=\"tao-date__grid\" role=\"grid\">\r\n <button\r\n v-for=\"cell in cells\"\r\n :key=\"cell.iso\"\r\n type=\"button\"\r\n class=\"tao-date__day\"\r\n :class=\"{\r\n 'tao-date__day--outside': !cell.currentMonth,\r\n 'tao-date__day--today': cell.iso === todayIso,\r\n 'tao-date__day--selected': cell.iso === valueIso,\r\n 'tao-date__day--cursor': cell.iso === cursorIso,\r\n 'tao-date__day--disabled': !isTaoDateInRange(cell.iso, min, max),\r\n }\"\r\n role=\"gridcell\"\r\n :aria-label=\"formatTaoDateLabel(cell.iso, locale)\"\r\n :aria-selected=\"cell.iso === valueIso\"\r\n :disabled=\"!isTaoDateInRange(cell.iso, min, max)\"\r\n @mousedown.prevent\r\n @click=\"selectDay(cell.iso)\"\r\n >\r\n {{ cell.day }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"tao-date__footer\">\r\n <button type=\"button\" class=\"tao-date__link\" :disabled=\"!todayEnabled\" @click=\"selectDay(todayIso)\">\r\n <slot name=\"today\">{{ todayText }}</slot>\r\n </button>\r\n <button v-if=\"valueIso\" type=\"button\" class=\"tao-date__link\" @click=\"clear\">\r\n <slot name=\"clear\">{{ clearText }}</slot>\r\n </button>\r\n </div>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-date {\r\n width: 100%;\r\n}\r\n\r\n.tao-date__trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n min-height: 36px;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n text-align: left;\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-date__trigger--placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-date__trigger:focus {\r\n outline: none;\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-date--invalid .tao-date__trigger {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-date--invalid .tao-date__trigger:focus {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-date__trigger:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-date__value {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-date__icon {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n opacity: 0.7;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { listenFocusLoss } from '../focusLoss';\r\nimport {\r\n buildTaoDateGrid,\r\n formatTaoDateLabel,\r\n formatTaoDateRangeLabel,\r\n formatTaoMonthLabel,\r\n isTaoDateInRange,\r\n parseTaoDate,\r\n parseTaoDateRange,\r\n shiftTaoDate,\r\n shiftTaoMonth,\r\n clampTaoDateCursor,\r\n sortTaoDateRange,\r\n taoDateWeekdayIndex,\r\n taoWeekdayLabels,\r\n todayTaoDate,\r\n type TaoDateRangeValue,\r\n} from '../date';\r\nimport '../styles/date-popup.css';\r\n\r\ndefineOptions({ name: 'TaoDateRange' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TaoDateRangeValue | null;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n min?: string;\r\n max?: string;\r\n locale?: string;\r\n todayText?: string;\r\n clearText?: string;\r\n prevMonthLabel?: string;\r\n nextMonthLabel?: string;\r\n }>(),\r\n {\r\n modelValue: null,\r\n placeholder: 'Период',\r\n disabled: false,\r\n error: false,\r\n min: undefined,\r\n max: undefined,\r\n locale: 'ru-RU',\r\n todayText: 'Сегодня',\r\n clearText: 'Очистить',\r\n prevMonthLabel: 'Предыдущий месяц',\r\n nextMonthLabel: 'Следующий месяц',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoDateRangeValue | null];\r\n change: [value: TaoDateRangeValue | null];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst gridId = `${localId}-grid`;\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst open = ref(false);\r\nconst viewYear = ref(2026);\r\nconst viewMonth = ref(1);\r\nconst cursorIso = ref(todayTaoDate());\r\nconst draftStart = ref<string | null>(null);\r\nconst hoverIso = ref<string | null>(null);\r\nconst triggerRef = ref<HTMLButtonElement | null>(null);\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst panelStyle = ref({ top: '0px', left: '0px' });\r\n\r\nconst committed = computed(() => parseTaoDateRange(props.modelValue));\r\nconst highlight = computed(() => {\r\n if (draftStart.value) {\r\n return sortTaoDateRange(draftStart.value, hoverIso.value ?? cursorIso.value ?? draftStart.value);\r\n }\r\n\r\n return committed.value;\r\n});\r\nconst displayLabel = computed(() =>\r\n committed.value ? formatTaoDateRangeLabel(committed.value.start, committed.value.end, props.locale) : '',\r\n);\r\nconst weekdays = computed(() => taoWeekdayLabels(props.locale));\r\nconst monthLabel = computed(() => formatTaoMonthLabel(viewYear.value, viewMonth.value, props.locale));\r\nconst cells = computed(() => buildTaoDateGrid(viewYear.value, viewMonth.value));\r\nconst todayIso = computed(() => todayTaoDate());\r\nconst todayEnabled = computed(() => isTaoDateInRange(todayIso.value, props.min, props.max));\r\n\r\nfunction daySelected(iso: string) {\r\n return Boolean(highlight.value && (iso === highlight.value.start || iso === highlight.value.end));\r\n}\r\n\r\nfunction dayInRange(iso: string) {\r\n return Boolean(highlight.value && iso > highlight.value.start && iso < highlight.value.end);\r\n}\r\n\r\nfunction syncViewFrom(iso: string) {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return;\r\n }\r\n\r\n viewYear.value = parts.y;\r\n viewMonth.value = parts.m;\r\n cursorIso.value = iso;\r\n}\r\n\r\nfunction updatePosition() {\r\n const trigger = triggerRef.value;\r\n const panel = panelRef.value;\r\n if (!trigger || !panel) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const height = panel.offsetHeight;\r\n const width = panel.offsetWidth;\r\n const gap = 4;\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const openUp = spaceBelow < height && rect.top > spaceBelow;\r\n const left = Math.min(rect.left, Math.max(8, window.innerWidth - width - 8));\r\n\r\n panelStyle.value = {\r\n top: `${openUp ? rect.top - height - gap : rect.bottom + gap}px`,\r\n left: `${Math.max(8, left)}px`,\r\n };\r\n}\r\n\r\nasync function setOpen(next: boolean) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n open.value = next;\r\n if (!next) {\r\n return;\r\n }\r\n\r\n draftStart.value = null;\r\n hoverIso.value = null;\r\n syncViewFrom(clampTaoDateCursor(committed.value?.start ?? todayIso.value, props.min, props.max));\r\n await nextTick();\r\n updatePosition();\r\n panelRef.value?.focus();\r\n}\r\n\r\nfunction toggle() {\r\n void setOpen(!open.value);\r\n}\r\n\r\nfunction close() {\r\n open.value = false;\r\n}\r\n\r\nfunction commitRange(range: TaoDateRangeValue) {\r\n emit('update:modelValue', range);\r\n emit('change', range);\r\n draftStart.value = null;\r\n hoverIso.value = null;\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction selectDay(iso: string) {\r\n if (!isTaoDateInRange(iso, props.min, props.max)) {\r\n return;\r\n }\r\n\r\n if (!draftStart.value) {\r\n draftStart.value = iso;\r\n hoverIso.value = iso;\r\n cursorIso.value = iso;\r\n return;\r\n }\r\n\r\n commitRange(sortTaoDateRange(draftStart.value, iso));\r\n}\r\n\r\nfunction selectToday() {\r\n if (!todayEnabled.value) {\r\n return;\r\n }\r\n\r\n commitRange({ start: todayIso.value, end: todayIso.value });\r\n}\r\n\r\nfunction clear() {\r\n emit('update:modelValue', null);\r\n emit('change', null);\r\n draftStart.value = null;\r\n hoverIso.value = null;\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction goMonth(delta: number) {\r\n hoverIso.value = null;\r\n cursorIso.value = clampTaoDateCursor(shiftTaoMonth(cursorIso.value, delta), props.min, props.max);\r\n syncViewFrom(cursorIso.value);\r\n void nextTick(updatePosition);\r\n}\r\n\r\nfunction moveCursor(days: number) {\r\n hoverIso.value = null;\r\n const next = shiftTaoDate(cursorIso.value, days);\r\n cursorIso.value = isTaoDateInRange(next, props.min, props.max)\r\n ? next\r\n : clampTaoDateCursor(next, props.min, props.max);\r\n syncViewFrom(cursorIso.value);\r\n void nextTick(updatePosition);\r\n}\r\n\r\nfunction onDayEnter(iso: string) {\r\n if (!isTaoDateInRange(iso, props.min, props.max)) {\r\n return;\r\n }\r\n\r\n hoverIso.value = iso;\r\n}\r\n\r\nfunction onGridLeave() {\r\n hoverIso.value = null;\r\n}\r\n\r\nfunction onTriggerKeydown(event: KeyboardEvent) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n void setOpen(true);\r\n }\r\n}\r\n\r\nfunction onPanelKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n close();\r\n triggerRef.value?.focus();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowLeft') {\r\n event.preventDefault();\r\n moveCursor(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n event.preventDefault();\r\n moveCursor(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n moveCursor(-7);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n moveCursor(7);\r\n return;\r\n }\r\n\r\n if (event.key === 'PageUp') {\r\n event.preventDefault();\r\n goMonth(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'PageDown') {\r\n event.preventDefault();\r\n goMonth(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n moveCursor(-taoDateWeekdayIndex(cursorIso.value));\r\n return;\r\n }\r\n\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n moveCursor(6 - taoDateWeekdayIndex(cursorIso.value));\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n selectDay(cursorIso.value);\r\n }\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n if (triggerRef.value?.contains(target) || panelRef.value?.contains(target)) {\r\n return;\r\n }\r\n\r\n close();\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (open.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(open, (isOpen) => {\r\n if (isOpen) {\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n return;\r\n }\r\n\r\n draftStart.value = null;\r\n hoverIso.value = null;\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(() => {\r\n hoverIso.value = null;\r\n });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n stopFocusLoss?.();\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-date-range\" :class=\"{ 'tao-date-range--open': open, 'tao-date-range--invalid': invalid }\">\r\n <button\r\n :id=\"controlId\"\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n class=\"tao-date-range__trigger\"\r\n :class=\"{ 'tao-date-range__trigger--placeholder': !committed }\"\r\n role=\"combobox\"\r\n :aria-expanded=\"open\"\r\n aria-haspopup=\"dialog\"\r\n :aria-controls=\"gridId\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :disabled=\"disabled\"\r\n @click=\"toggle\"\r\n @keydown=\"onTriggerKeydown\"\r\n >\r\n <span class=\"tao-date-range__value\">{{ displayLabel || placeholder }}</span>\r\n <span class=\"tao-date-range__icon\" aria-hidden=\"true\">\r\n <slot name=\"icon\">\r\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" focusable=\"false\">\r\n <rect\r\n x=\"2\"\r\n y=\"3\"\r\n width=\"12\"\r\n height=\"11\"\r\n rx=\"1.5\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.4\"\r\n />\r\n <path d=\"M5 1.5v3M11 1.5v3M2 6.5h12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"open\"\r\n :id=\"gridId\"\r\n ref=\"panelRef\"\r\n class=\"tao-date__panel\"\r\n role=\"dialog\"\r\n :aria-label=\"monthLabel\"\r\n tabindex=\"-1\"\r\n :style=\"panelStyle\"\r\n @keydown=\"onPanelKeydown\"\r\n >\r\n <div class=\"tao-date__header\">\r\n <button type=\"button\" class=\"tao-date__nav\" :aria-label=\"prevMonthLabel\" @click=\"goMonth(-1)\">\r\n <span aria-hidden=\"true\">\r\n <slot name=\"prev-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M14.5 5 8 12l6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n <p class=\"tao-date__month\">{{ monthLabel }}</p>\r\n <button type=\"button\" class=\"tao-date__nav\" :aria-label=\"nextMonthLabel\" @click=\"goMonth(1)\">\r\n <span aria-hidden=\"true\">\r\n <slot name=\"next-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M9.5 5 16 12l-6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"tao-date__weekdays\" aria-hidden=\"true\">\r\n <span v-for=\"day in weekdays\" :key=\"day\">{{ day }}</span>\r\n </div>\r\n\r\n <div class=\"tao-date__grid\" role=\"grid\" @mouseleave=\"onGridLeave\">\r\n <button\r\n v-for=\"cell in cells\"\r\n :key=\"cell.iso\"\r\n type=\"button\"\r\n class=\"tao-date__day\"\r\n :class=\"{\r\n 'tao-date__day--outside': !cell.currentMonth,\r\n 'tao-date__day--today': cell.iso === todayIso,\r\n 'tao-date__day--selected': daySelected(cell.iso),\r\n 'tao-date__day--in-range': dayInRange(cell.iso),\r\n 'tao-date__day--range-start': highlight?.start === cell.iso,\r\n 'tao-date__day--range-end': highlight?.end === cell.iso,\r\n 'tao-date__day--cursor': cell.iso === cursorIso,\r\n 'tao-date__day--disabled': !isTaoDateInRange(cell.iso, min, max),\r\n }\"\r\n role=\"gridcell\"\r\n :aria-label=\"formatTaoDateLabel(cell.iso, locale)\"\r\n :aria-selected=\"daySelected(cell.iso)\"\r\n :disabled=\"!isTaoDateInRange(cell.iso, min, max)\"\r\n @mousedown.prevent\r\n @mouseenter=\"onDayEnter(cell.iso)\"\r\n @click=\"selectDay(cell.iso)\"\r\n >\r\n {{ cell.day }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"tao-date__footer\">\r\n <button type=\"button\" class=\"tao-date__link\" :disabled=\"!todayEnabled\" @click=\"selectToday\">\r\n <slot name=\"today\">{{ todayText }}</slot>\r\n </button>\r\n <button v-if=\"committed\" type=\"button\" class=\"tao-date__link\" @click=\"clear\">\r\n <slot name=\"clear\">{{ clearText }}</slot>\r\n </button>\r\n </div>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-date-range {\r\n width: 100%;\r\n}\r\n\r\n.tao-date-range__trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n min-height: 36px;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n text-align: left;\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-date-range__trigger--placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-date-range__trigger:focus {\r\n outline: none;\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-date-range--invalid .tao-date-range__trigger {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-date-range--invalid .tao-date-range__trigger:focus {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-date-range__trigger:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-date-range__value {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-date-range__icon {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n opacity: 0.7;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoSwitch' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: boolean;\r\n label?: string;\r\n disabled?: boolean;\r\n }>(),\r\n {\r\n modelValue: false,\r\n label: '',\r\n disabled: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: boolean];\r\n change: [value: boolean];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nfunction toggle() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n const next = !props.modelValue;\r\n emit('update:modelValue', next);\r\n emit('change', next);\r\n}\r\n</script>\r\n\r\n<template>\r\n <label class=\"tao-switch\" :class=\"{ 'tao-switch--disabled': disabled, 'tao-switch--on': modelValue, 'tao-switch--invalid': invalid }\" :for=\"controlId\">\r\n <input\r\n :id=\"controlId\"\r\n class=\"tao-switch__input\"\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n :checked=\"modelValue\"\r\n :disabled=\"disabled\"\r\n :aria-checked=\"modelValue\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n @change=\"toggle\"\r\n />\r\n <span class=\"tao-switch__track\" aria-hidden=\"true\">\r\n <span class=\"tao-switch__thumb\"></span>\r\n </span>\r\n <span v-if=\"label\" class=\"tao-switch__label\">{{ label }}</span>\r\n <span v-else-if=\"$slots.default\" class=\"tao-switch__label\"><slot /></span>\r\n </label>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-switch {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n cursor: pointer;\r\n user-select: none;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-switch__input {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.tao-switch__track {\r\n position: relative;\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n width: 36px;\r\n height: 20px;\r\n padding: 2px;\r\n pointer-events: none;\r\n background: var(--tao-color-surface-sunken);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-full);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-switch__thumb {\r\n width: 14px;\r\n height: 14px;\r\n background: var(--tao-color-text-muted);\r\n border-radius: var(--tao-radius-full);\r\n transform: translateX(0);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-switch--on .tao-switch__track {\r\n background: var(--tao-color-accent);\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-switch--on .tao-switch__thumb {\r\n background: var(--tao-color-on-accent);\r\n transform: translateX(16px);\r\n}\r\n\r\n.tao-switch__input:focus-visible + .tao-switch__track {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-switch__label {\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-switch--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n.tao-switch--invalid .tao-switch__track {\r\n border-color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","import type { ComputedRef, InjectionKey } from 'vue';\r\n\r\nexport type TaoRadioValue = string | number | boolean;\r\n\r\nexport interface TaoRadioGroupContext {\r\n name: ComputedRef<string>;\r\n model: ComputedRef<TaoRadioValue | undefined>;\r\n disabled: ComputedRef<boolean>;\r\n setValue: (value: TaoRadioValue) => void;\r\n}\r\n\r\nexport const radioGroupKey: InjectionKey<TaoRadioGroupContext> = Symbol('taoRadioGroup');\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { radioGroupKey, type TaoRadioValue } from '../radio';\r\n\r\ndefineOptions({ name: 'TaoRadio' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value: TaoRadioValue;\r\n modelValue?: TaoRadioValue;\r\n name?: string;\r\n label?: string;\r\n disabled?: boolean;\r\n }>(),\r\n {\r\n label: '',\r\n disabled: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoRadioValue];\r\n change: [value: TaoRadioValue];\r\n}>();\r\n\r\nconst group = inject(radioGroupKey, null);\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => (group ? localId : (field?.id ?? localId)));\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => (group ? undefined : field?.describedBy.value));\r\n\r\nconst isDisabled = computed(() => props.disabled || Boolean(group?.disabled.value));\r\nconst inputName = computed(() => group?.name.value ?? props.name);\r\nconst isChecked = computed(() => {\r\n const current = group ? group.model.value : props.modelValue;\r\n return current === props.value;\r\n});\r\n\r\nfunction onChange() {\r\n if (isDisabled.value) {\r\n return;\r\n }\r\n\r\n if (group) {\r\n group.setValue(props.value);\r\n return;\r\n }\r\n\r\n emit('update:modelValue', props.value);\r\n emit('change', props.value);\r\n}\r\n</script>\r\n\r\n<template>\r\n <label class=\"tao-radio\" :class=\"{ 'tao-radio--disabled': isDisabled, 'tao-radio--invalid': invalid && !group }\" :for=\"controlId\">\r\n <input\r\n :id=\"controlId\"\r\n class=\"tao-radio__input\"\r\n type=\"radio\"\r\n :name=\"inputName\"\r\n :value=\"String(value)\"\r\n :checked=\"isChecked\"\r\n :disabled=\"isDisabled\"\r\n :aria-invalid=\"(!group && invalid) || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n @change=\"onChange\"\r\n />\r\n <span class=\"tao-radio__dot\" aria-hidden=\"true\"></span>\r\n <span v-if=\"label\" class=\"tao-radio__label\">{{ label }}</span>\r\n <span v-else class=\"tao-radio__label\"><slot /></span>\r\n </label>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-radio {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n cursor: pointer;\r\n user-select: none;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-radio__input {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.tao-radio__dot {\r\n position: relative;\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n pointer-events: none;\r\n background: var(--tao-color-surface-raised);\r\n border: 2px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-full);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-radio__dot::after {\r\n content: '';\r\n width: 8px;\r\n height: 8px;\r\n background: transparent;\r\n border-radius: var(--tao-radius-full);\r\n transform: scale(0);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-radio__input:checked + .tao-radio__dot {\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-radio__input:checked + .tao-radio__dot::after {\r\n background: var(--tao-color-accent);\r\n transform: scale(1);\r\n}\r\n\r\n.tao-radio__input:focus-visible + .tao-radio__dot {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.tao-radio__label {\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-radio--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n.tao-radio--invalid .tao-radio__dot {\r\n border-color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, provide, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { radioGroupKey, type TaoRadioValue } from '../radio';\r\n\r\ndefineOptions({ name: 'TaoRadioGroup' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TaoRadioValue;\r\n name?: string;\r\n legend?: string;\r\n disabled?: boolean;\r\n direction?: 'row' | 'column';\r\n }>(),\r\n {\r\n disabled: false,\r\n direction: 'row',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoRadioValue];\r\n change: [value: TaoRadioValue];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst autoName = useId();\r\nconst groupName = computed(() => props.name || autoName);\r\nconst model = computed(() => props.modelValue);\r\nconst groupDisabled = computed(() => props.disabled);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\nconst labelledBy = computed(() => (props.legend || !field ? undefined : `${field.id}-label`));\r\n\r\nfunction setValue(value: TaoRadioValue) {\r\n emit('update:modelValue', value);\r\n emit('change', value);\r\n}\r\n\r\nprovide(radioGroupKey, {\r\n name: groupName,\r\n model,\r\n disabled: groupDisabled,\r\n setValue,\r\n});\r\n</script>\r\n\r\n<template>\r\n <fieldset\r\n :id=\"field?.id\"\r\n class=\"tao-radio-group\"\r\n :class=\"[`tao-radio-group--${direction}`, { 'tao-radio-group--invalid': invalid }]\"\r\n :disabled=\"disabled\"\r\n :aria-describedby=\"describedBy\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-labelledby=\"labelledBy\"\r\n >\r\n <legend v-if=\"legend\" class=\"tao-radio-group__legend\">{{ legend }}</legend>\r\n <slot />\r\n </fieldset>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-radio-group {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--tao-space-3) var(--tao-space-4);\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n min-width: 0;\r\n}\r\n\r\n.tao-radio-group--column {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n}\r\n\r\n.tao-radio-group__legend {\r\n padding: 0;\r\n margin-bottom: var(--tao-space-2);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 500;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-radio-group--invalid :deep(.tao-radio__dot) {\r\n border-color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","import type { ComputedRef, InjectionKey } from 'vue';\r\nimport type { TaoRadioValue } from './radio';\r\n\r\nexport type TaoSegmentedSize = 'small' | 'medium' | 'large';\r\n\r\nexport interface TaoSegmentedContext {\r\n name: ComputedRef<string>;\r\n model: ComputedRef<TaoRadioValue | undefined>;\r\n disabled: ComputedRef<boolean>;\r\n size: ComputedRef<TaoSegmentedSize>;\r\n setValue: (value: TaoRadioValue) => void;\r\n}\r\n\r\nexport const segmentedKey: InjectionKey<TaoSegmentedContext> = Symbol('taoSegmented');\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, provide, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { type TaoRadioValue } from '../radio';\r\nimport { segmentedKey, type TaoSegmentedSize } from '../segmented';\r\n\r\ndefineOptions({ name: 'TaoSegmented' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TaoRadioValue;\r\n name?: string;\r\n legend?: string;\r\n disabled?: boolean;\r\n size?: TaoSegmentedSize;\r\n block?: boolean;\r\n }>(),\r\n {\r\n disabled: false,\r\n size: 'medium',\r\n block: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoRadioValue];\r\n change: [value: TaoRadioValue];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst autoName = useId();\r\nconst groupName = computed(() => props.name || autoName);\r\nconst model = computed(() => props.modelValue);\r\nconst groupDisabled = computed(() => props.disabled);\r\nconst groupSize = computed(() => props.size);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst trackRef = ref<HTMLElement | null>(null);\r\nconst thumbStyle = ref<Record<string, string>>({ opacity: '0' });\r\nlet resizeObserver: ResizeObserver | null = null;\r\nlet mutationObserver: MutationObserver | null = null;\r\n\r\nfunction setValue(value: TaoRadioValue) {\r\n emit('update:modelValue', value);\r\n emit('change', value);\r\n}\r\n\r\nfunction updateThumb() {\r\n const track = trackRef.value;\r\n if (!track) {\r\n return;\r\n }\r\n\r\n const selected = track.querySelector<HTMLElement>('.tao-segmented-option--checked');\r\n if (!selected) {\r\n if (thumbStyle.value.opacity !== '0') {\r\n thumbStyle.value = { opacity: '0' };\r\n }\r\n return;\r\n }\r\n\r\n const trackBox = track.getBoundingClientRect();\r\n const optionBox = selected.getBoundingClientRect();\r\n const next = {\r\n width: `${optionBox.width}px`,\r\n height: `${optionBox.height}px`,\r\n transform: `translate(${optionBox.left - trackBox.left - track.clientLeft}px, ${optionBox.top - trackBox.top - track.clientTop}px)`,\r\n opacity: '1',\r\n };\r\n\r\n const prev = thumbStyle.value;\r\n if (\r\n prev.width === next.width &&\r\n prev.height === next.height &&\r\n prev.transform === next.transform &&\r\n prev.opacity === next.opacity\r\n ) {\r\n return;\r\n }\r\n\r\n thumbStyle.value = next;\r\n}\r\n\r\nprovide(segmentedKey, {\r\n name: groupName,\r\n model,\r\n disabled: groupDisabled,\r\n size: groupSize,\r\n setValue,\r\n});\r\n\r\nonMounted(() => {\r\n const track = trackRef.value;\r\n void nextTick(updateThumb);\r\n\r\n if (!track) {\r\n return;\r\n }\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n resizeObserver = new ResizeObserver(() => updateThumb());\r\n resizeObserver.observe(track);\r\n }\r\n\r\n mutationObserver = new MutationObserver(() => updateThumb());\r\n mutationObserver.observe(track, {\r\n subtree: true,\r\n childList: true,\r\n attributes: true,\r\n attributeFilter: ['class'],\r\n });\r\n});\r\n\r\nwatch(\r\n () => [props.modelValue, props.size, props.block, props.disabled] as const,\r\n () => {\r\n void nextTick(updateThumb);\r\n },\r\n);\r\n\r\nonBeforeUnmount(() => {\r\n resizeObserver?.disconnect();\r\n resizeObserver = null;\r\n mutationObserver?.disconnect();\r\n mutationObserver = null;\r\n});\r\n</script>\r\n\r\n<template>\r\n <fieldset\r\n class=\"tao-segmented\"\r\n :class=\"[\r\n `tao-segmented--${size}`,\r\n {\r\n 'tao-segmented--block': block,\r\n 'tao-segmented--disabled': disabled,\r\n 'tao-segmented--invalid': invalid,\r\n },\r\n ]\"\r\n :disabled=\"disabled\"\r\n :aria-describedby=\"describedBy\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-labelledby=\"legend ? undefined : (field ? `${field.id}-label` : undefined)\"\r\n :id=\"field?.id\"\r\n >\r\n <legend v-if=\"legend\" class=\"tao-segmented__legend\">{{ legend }}</legend>\r\n <div ref=\"trackRef\" class=\"tao-segmented__track\">\r\n <div class=\"tao-segmented__thumb\" :style=\"thumbStyle\" aria-hidden=\"true\"></div>\r\n <slot />\r\n </div>\r\n </fieldset>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-segmented {\r\n display: inline-flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n min-width: 0;\r\n vertical-align: top;\r\n}\r\n\r\n.tao-segmented--block {\r\n display: flex;\r\n width: 100%;\r\n align-items: stretch;\r\n}\r\n\r\n.tao-segmented__legend {\r\n padding: 0;\r\n margin-bottom: var(--tao-space-2);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 500;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-segmented__track {\r\n position: relative;\r\n display: inline-flex;\r\n flex-wrap: nowrap;\r\n align-items: stretch;\r\n max-width: 100%;\r\n padding: 2px;\r\n overflow: hidden;\r\n background: var(--tao-color-surface-sunken);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-segmented--block .tao-segmented__track {\r\n display: flex;\r\n width: 100%;\r\n}\r\n\r\n.tao-segmented--block .tao-segmented__track > :deep(.tao-segmented-option) {\r\n flex: 1 1 0;\r\n min-width: 0;\r\n}\r\n\r\n.tao-segmented--block .tao-segmented__track > :deep(.tao-segmented-option__label) {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.tao-segmented__thumb {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 0;\r\n background: var(--tao-color-surface-raised);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: calc(var(--tao-radius-control) - 1px);\r\n box-shadow: var(--tao-shadow-sm);\r\n pointer-events: none;\r\n transition:\r\n transform var(--tao-duration-base) var(--tao-ease-base),\r\n width var(--tao-duration-base) var(--tao-ease-base),\r\n height var(--tao-duration-base) var(--tao-ease-base),\r\n opacity var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-segmented--invalid .tao-segmented__track {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-segmented--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .tao-segmented__thumb {\r\n transition: none;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, useId, useSlots } from 'vue';\r\nimport { type TaoRadioValue } from '../radio';\r\nimport { segmentedKey } from '../segmented';\r\n\r\ndefineOptions({ name: 'TaoSegmentedOption' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value: TaoRadioValue;\r\n modelValue?: TaoRadioValue;\r\n name?: string;\r\n label?: string;\r\n icon?: string;\r\n count?: number | string;\r\n disabled?: boolean;\r\n ariaLabel?: string;\r\n }>(),\r\n {\r\n label: '',\r\n icon: '',\r\n disabled: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoRadioValue];\r\n change: [value: TaoRadioValue];\r\n}>();\r\n\r\nconst group = inject(segmentedKey, null);\r\nconst slots = useSlots();\r\nconst localId = useId();\r\n\r\nconst isDisabled = computed(() => props.disabled || Boolean(group?.disabled.value));\r\nconst inputName = computed(() => group?.name.value ?? props.name);\r\nconst size = computed(() => group?.size.value ?? 'medium');\r\nconst isChecked = computed(() => {\r\n const current = group ? group.model.value : props.modelValue;\r\n return current === props.value;\r\n});\r\n\r\nconst hasLabel = computed(() => Boolean(props.label || slots.default));\r\nconst isIconOnly = computed(() => Boolean((props.icon || slots.icon) && !hasLabel.value));\r\n\r\nconst countLabel = computed(() => {\r\n if (props.count === undefined || props.count === null || props.count === '') {\r\n return '';\r\n }\r\n\r\n if (typeof props.count === 'number') {\r\n if (props.count > 99) {\r\n return '99+';\r\n }\r\n\r\n return String(props.count);\r\n }\r\n\r\n return String(props.count);\r\n});\r\n\r\nfunction onChange() {\r\n if (isDisabled.value) {\r\n return;\r\n }\r\n\r\n if (group) {\r\n group.setValue(props.value);\r\n return;\r\n }\r\n\r\n emit('update:modelValue', props.value);\r\n emit('change', props.value);\r\n}\r\n</script>\r\n\r\n<template>\r\n <label\r\n class=\"tao-segmented-option\"\r\n :class=\"[\r\n `tao-segmented-option--${size}`,\r\n {\r\n 'tao-segmented-option--checked': isChecked,\r\n 'tao-segmented-option--disabled': props.disabled,\r\n 'tao-segmented-option--icon-only': isIconOnly,\r\n },\r\n ]\"\r\n :for=\"localId\"\r\n >\r\n <input\r\n :id=\"localId\"\r\n class=\"tao-segmented-option__input\"\r\n type=\"radio\"\r\n :name=\"inputName\"\r\n :value=\"String(value)\"\r\n :checked=\"isChecked\"\r\n :disabled=\"isDisabled\"\r\n :aria-label=\"ariaLabel\"\r\n @change=\"onChange\"\r\n />\r\n <span class=\"tao-segmented-option__face\">\r\n <span v-if=\"icon || $slots.icon\" class=\"tao-segmented-option__icon\" aria-hidden=\"true\">\r\n <slot name=\"icon\">{{ icon }}</slot>\r\n </span>\r\n <span v-if=\"hasLabel\" class=\"tao-segmented-option__label\">\r\n <slot>{{ label }}</slot>\r\n </span>\r\n <span v-else-if=\"ariaLabel\" class=\"tao-segmented-option__sr\">{{ ariaLabel }}</span>\r\n <span v-if=\"countLabel\" class=\"tao-segmented-option__count\">{{ countLabel }}</span>\r\n </span>\r\n </label>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-segmented-option {\r\n position: relative;\r\n z-index: 1;\r\n display: inline-flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n min-width: 0;\r\n cursor: pointer;\r\n user-select: none;\r\n color: var(--tao-color-text-subtle);\r\n}\r\n\r\n.tao-segmented-option__face {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--tao-space-1);\r\n width: 100%;\r\n border-radius: calc(var(--tao-radius-control) - 1px);\r\n font-family: inherit;\r\n font-weight: 500;\r\n line-height: 1.25;\r\n white-space: nowrap;\r\n transition:\r\n color var(--tao-duration-base) var(--tao-ease-base),\r\n background var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-segmented-option--small .tao-segmented-option__face {\r\n min-height: 20px;\r\n padding: 0 var(--tao-space-2);\r\n font-size: var(--tao-font-size-xs);\r\n}\r\n\r\n.tao-segmented-option--medium .tao-segmented-option__face {\r\n min-height: 24px;\r\n padding: 0 var(--tao-space-3);\r\n font-size: var(--tao-font-size-sm);\r\n}\r\n\r\n.tao-segmented-option--large .tao-segmented-option__face {\r\n min-height: 32px;\r\n padding: 0 var(--tao-space-4);\r\n font-size: var(--tao-font-size-md);\r\n}\r\n\r\n.tao-segmented-option--icon-only.tao-segmented-option--small .tao-segmented-option__face {\r\n min-width: 20px;\r\n padding: 0;\r\n}\r\n\r\n.tao-segmented-option--icon-only.tao-segmented-option--medium .tao-segmented-option__face {\r\n min-width: 24px;\r\n padding: 0;\r\n}\r\n\r\n.tao-segmented-option--icon-only.tao-segmented-option--large .tao-segmented-option__face {\r\n min-width: 32px;\r\n padding: 0;\r\n}\r\n\r\n.tao-segmented-option__icon {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n line-height: 1;\r\n}\r\n\r\n.tao-segmented-option__label {\r\n min-width: 0;\r\n line-height: 1.25;\r\n}\r\n\r\n.tao-segmented-option__count {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 1.15em;\r\n height: 1.15em;\r\n padding: 0 4px;\r\n border-radius: var(--tao-radius-full);\r\n background: var(--tao-color-accent-subtle);\r\n color: var(--tao-color-accent);\r\n font-size: 10px;\r\n font-weight: 700;\r\n line-height: 1;\r\n}\r\n\r\n.tao-segmented-option:hover:not(.tao-segmented-option--disabled):not(.tao-segmented-option--checked) {\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-segmented-option--checked {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-segmented-option--checked .tao-segmented-option__count {\r\n background: color-mix(in srgb, var(--tao-color-accent) 22%, transparent);\r\n}\r\n\r\n.tao-segmented-option--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.55;\r\n}\r\n\r\n.tao-segmented-option__input {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.tao-segmented-option__sr {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.tao-segmented-option__input:focus-visible + .tao-segmented-option__face {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: -2px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\ndefineOptions({ name: 'TaoAlert' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n type?: 'success' | 'error' | 'danger' | 'warning' | 'info' | 'neutral';\r\n title?: string;\r\n closable?: boolean;\r\n closeLabel?: string;\r\n }>(),\r\n {\r\n type: 'info',\r\n title: '',\r\n closable: false,\r\n closeLabel: 'Закрыть',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n close: [];\r\n}>();\r\n\r\nconst tone = computed(() => (props.type === 'danger' ? 'error' : props.type));\r\nconst live = computed(() => (tone.value === 'error' || tone.value === 'warning' ? 'assertive' : 'polite'));\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-alert\"\r\n :class=\"`tao-alert--${tone}`\"\r\n :role=\"tone === 'error' ? 'alert' : 'status'\"\r\n :aria-live=\"live\"\r\n >\r\n <div class=\"tao-alert__body\">\r\n <strong v-if=\"title\" class=\"tao-alert__title\">{{ title }}</strong>\r\n <p v-if=\"$slots.default\" class=\"tao-alert__message\"><slot /></p>\r\n </div>\r\n <button\r\n v-if=\"closable\"\r\n type=\"button\"\r\n class=\"tao-alert__close\"\r\n :aria-label=\"closeLabel\"\r\n @click=\"emit('close')\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"close-icon\">&times;</slot>\r\n </span>\r\n </button>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-alert {\r\n --tao-alert-tone: var(--tao-color-info);\r\n\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--tao-space-3);\r\n width: 100%;\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n background: color-mix(in srgb, var(--tao-alert-tone) 10%, var(--tao-color-surface-raised));\r\n color: var(--tao-color-text);\r\n border: 1px solid color-mix(in srgb, var(--tao-alert-tone) 35%, var(--tao-color-border));\r\n border-radius: var(--tao-radius-panel);\r\n}\r\n\r\n.tao-alert--success {\r\n --tao-alert-tone: var(--tao-color-success);\r\n}\r\n\r\n.tao-alert--error,\r\n.tao-alert--danger {\r\n --tao-alert-tone: var(--tao-color-danger);\r\n}\r\n\r\n.tao-alert--warning {\r\n --tao-alert-tone: var(--tao-color-warning);\r\n}\r\n\r\n.tao-alert--info {\r\n --tao-alert-tone: var(--tao-color-info);\r\n}\r\n\r\n.tao-alert--neutral {\r\n --tao-alert-tone: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-alert__body {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n min-width: 0;\r\n flex: 1;\r\n}\r\n\r\n.tao-alert__title {\r\n font-size: var(--tao-font-size-md);\r\n font-weight: 600;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-alert__message {\r\n margin: 0;\r\n font-size: var(--tao-font-size-sm);\r\n line-height: 1.45;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-alert__close {\r\n flex-shrink: 0;\r\n margin: calc(-1 * var(--tao-space-1)) calc(-1 * var(--tao-space-2)) 0 0;\r\n padding: 0;\r\n border: none;\r\n background: none;\r\n color: var(--tao-color-text-muted);\r\n font-size: 20px;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-alert__close:hover {\r\n color: var(--tao-color-text-strong);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\nimport TaoLoader from './TaoLoader.vue';\r\nimport type { TaoTableColumn, TaoTableSort } from '../table';\r\n\r\ndefineOptions({ name: 'TaoTable' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n columns: TaoTableColumn[];\r\n rows?: Record<string, unknown>[];\r\n rowKey?: string | ((row: Record<string, unknown>, index: number) => string | number);\r\n loading?: boolean;\r\n emptyText?: string;\r\n /** Зебра. `true` / `odd` — с первой строки, `even` — со второй. */\r\n striped?: boolean | 'odd' | 'even';\r\n compact?: boolean;\r\n hover?: boolean;\r\n /** Подсветка шапки. */\r\n head?: boolean;\r\n /** Горизонтальные линии между рядами. */\r\n lines?: boolean;\r\n sticky?: boolean;\r\n maxHeight?: string;\r\n clickable?: boolean;\r\n sort?: TaoTableSort | null;\r\n caption?: string;\r\n }>(),\r\n {\r\n rows: () => [],\r\n rowKey: 'id',\r\n loading: false,\r\n emptyText: 'Нет данных',\r\n striped: false,\r\n compact: false,\r\n hover: true,\r\n head: true,\r\n lines: true,\r\n sticky: false,\r\n maxHeight: '',\r\n clickable: false,\r\n sort: null,\r\n caption: '',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:sort': [value: TaoTableSort | null];\r\n sort: [value: TaoTableSort | null];\r\n 'row-click': [row: Record<string, unknown>, index: number];\r\n}>();\r\n\r\nconst colCount = computed(() => Math.max(props.columns.length, 1));\r\nconst isEmpty = computed(() => !props.rows.length && !props.loading);\r\nconst stripeFrom = computed(() => {\r\n if (props.striped === 'even') {\r\n return 'even';\r\n }\r\n if (props.striped === 'odd' || props.striped === true) {\r\n return 'odd';\r\n }\r\n return null;\r\n});\r\n\r\nfunction columnWidth(column: TaoTableColumn) {\r\n if (column.width == null) {\r\n return undefined;\r\n }\r\n return typeof column.width === 'number' ? `${column.width}px` : column.width;\r\n}\r\n\r\nfunction cellValue(row: Record<string, unknown>, column: TaoTableColumn) {\r\n if (column.value) {\r\n return column.value(row);\r\n }\r\n return row[column.key];\r\n}\r\n\r\nfunction rowId(row: Record<string, unknown>, index: number) {\r\n if (typeof props.rowKey === 'function') {\r\n return props.rowKey(row, index);\r\n }\r\n const key = row[props.rowKey];\r\n return key == null ? index : String(key);\r\n}\r\n\r\nfunction sortDir(column: TaoTableColumn) {\r\n if (!props.sort || props.sort.key !== column.key) {\r\n return null;\r\n }\r\n return props.sort.dir;\r\n}\r\n\r\nfunction toggleSort(column: TaoTableColumn) {\r\n if (!column.sortable) {\r\n return;\r\n }\r\n\r\n const current = sortDir(column);\r\n const next: TaoTableSort | null =\r\n current == null ? { key: column.key, dir: 'asc' } : current === 'asc' ? { key: column.key, dir: 'desc' } : null;\r\n\r\n emit('update:sort', next);\r\n emit('sort', next);\r\n}\r\n\r\nfunction onRowClick(row: Record<string, unknown>, index: number) {\r\n if (!props.clickable) {\r\n return;\r\n }\r\n emit('row-click', row, index);\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-table-wrap\"\r\n :class=\"{\r\n 'tao-table-wrap--sticky': sticky,\r\n 'tao-table-wrap--loading': loading,\r\n }\"\r\n :style=\"maxHeight ? { maxHeight } : undefined\"\r\n >\r\n <table\r\n class=\"tao-table\"\r\n :class=\"{\r\n 'tao-table--striped': stripeFrom === 'odd',\r\n 'tao-table--striped-even': stripeFrom === 'even',\r\n 'tao-table--compact': compact,\r\n 'tao-table--hover': hover,\r\n 'tao-table--head': head,\r\n 'tao-table--lines': lines,\r\n 'tao-table--clickable': clickable,\r\n 'tao-table--sticky': sticky,\r\n }\"\r\n >\r\n <caption v-if=\"caption\">{{ caption }}</caption>\r\n <thead>\r\n <tr>\r\n <th\r\n v-for=\"column in columns\"\r\n :key=\"column.key\"\r\n :style=\"{ width: columnWidth(column), textAlign: column.align || 'left' }\"\r\n scope=\"col\"\r\n :aria-sort=\"\r\n column.sortable\r\n ? sortDir(column) === 'asc'\r\n ? 'ascending'\r\n : sortDir(column) === 'desc'\r\n ? 'descending'\r\n : 'none'\r\n : undefined\r\n \"\r\n >\r\n <button\r\n v-if=\"column.sortable\"\r\n type=\"button\"\r\n class=\"tao-table__sort-btn\"\r\n @click=\"toggleSort(column)\"\r\n >\r\n <span>{{ column.label }}</span>\r\n <span\r\n class=\"tao-table__sorter\"\r\n :class=\"{\r\n 'tao-table__sorter--asc': sortDir(column) === 'asc',\r\n 'tao-table__sorter--desc': sortDir(column) === 'desc',\r\n }\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n <span v-else>{{ column.label }}</span>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr v-if=\"isEmpty\">\r\n <td class=\"tao-table__empty\" :colspan=\"colCount\">\r\n <slot name=\"empty\">{{ emptyText }}</slot>\r\n </td>\r\n </tr>\r\n <tr\r\n v-for=\"(row, index) in rows\"\r\n :key=\"rowId(row, index)\"\r\n @click=\"onRowClick(row, index)\"\r\n >\r\n <td\r\n v-for=\"column in columns\"\r\n :key=\"column.key\"\r\n :style=\"{ textAlign: column.align || 'left' }\"\r\n >\r\n <slot\r\n :name=\"`cell-${column.key}`\"\r\n :row=\"row\"\r\n :column=\"column\"\r\n :value=\"cellValue(row, column)\"\r\n :index=\"index\"\r\n >\r\n <slot name=\"cell\" :row=\"row\" :column=\"column\" :value=\"cellValue(row, column)\" :index=\"index\">\r\n {{ cellValue(row, column) }}\r\n </slot>\r\n </slot>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <div v-if=\"loading\" class=\"tao-table__loading\" aria-busy=\"true\">\r\n <slot name=\"loading\">\r\n <TaoLoader :size=\"36\" />\r\n </slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-table-wrap {\r\n position: relative;\r\n width: 100%;\r\n overflow: auto;\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-panel);\r\n background: var(--tao-color-surface);\r\n}\r\n\r\n.tao-table-wrap--loading {\r\n min-height: 120px;\r\n}\r\n\r\n.tao-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n font-size: var(--tao-font-size-md);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-table caption {\r\n caption-side: top;\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n text-align: left;\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-table th,\r\n.tao-table td {\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n vertical-align: middle;\r\n}\r\n\r\n.tao-table--lines th,\r\n.tao-table--lines td {\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-table--compact th,\r\n.tao-table--compact td {\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n font-size: var(--tao-font-size-sm);\r\n}\r\n\r\n.tao-table th {\r\n font-weight: 600;\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text-muted);\r\n white-space: nowrap;\r\n text-align: left;\r\n}\r\n\r\n.tao-table--head th {\r\n background: var(--tao-color-surface-raised);\r\n}\r\n\r\n.tao-table--sticky thead th {\r\n position: sticky;\r\n top: 0;\r\n z-index: 1;\r\n background: var(--tao-color-surface);\r\n}\r\n\r\n.tao-table--sticky.tao-table--head thead th {\r\n background: var(--tao-color-surface-raised);\r\n}\r\n\r\n.tao-table--lines tbody tr:last-child td {\r\n border-bottom: none;\r\n}\r\n\r\n.tao-table--striped tbody tr:nth-child(odd) td {\r\n background: var(--tao-color-surface-sunken);\r\n}\r\n\r\n.tao-table--striped-even tbody tr:nth-child(even) td {\r\n background: var(--tao-color-surface-sunken);\r\n}\r\n\r\n.tao-table--hover tbody tr:hover td {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-table--clickable tbody tr {\r\n cursor: pointer;\r\n}\r\n\r\n.tao-table__sort-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n margin: 0;\r\n padding: 0;\r\n border: 0;\r\n background: none;\r\n color: inherit;\r\n font: inherit;\r\n font-weight: 600;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-table__sort-btn:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-table__sorter {\r\n position: relative;\r\n width: 8px;\r\n height: 12px;\r\n opacity: 0.35;\r\n}\r\n\r\n.tao-table__sorter::before,\r\n.tao-table__sorter::after {\r\n content: '';\r\n position: absolute;\r\n left: 0;\r\n border-left: 4px solid transparent;\r\n border-right: 4px solid transparent;\r\n}\r\n\r\n.tao-table__sorter::before {\r\n top: 0;\r\n border-bottom: 4px solid currentColor;\r\n}\r\n\r\n.tao-table__sorter::after {\r\n bottom: 0;\r\n border-top: 4px solid currentColor;\r\n}\r\n\r\n.tao-table__sorter--asc,\r\n.tao-table__sorter--desc {\r\n opacity: 1;\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-table__sorter--asc::after,\r\n.tao-table__sorter--desc::before {\r\n opacity: 0.25;\r\n}\r\n\r\n.tao-table__empty {\r\n padding: var(--tao-space-8) var(--tao-space-4);\r\n text-align: center;\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-table__loading {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: color-mix(in srgb, var(--tao-color-surface) 72%, transparent);\r\n}\r\n</style>\r\n","export type TaoPaginationItem =\r\n | { type: 'page'; page: number }\r\n | { type: 'ellipsis'; id: 'left' | 'right' };\r\n\r\nexport function buildPaginationItems(\r\n page: number,\r\n pageCount: number,\r\n siblingCount = 1,\r\n): TaoPaginationItem[] {\r\n if (pageCount <= 0) {\r\n return [];\r\n }\r\n\r\n if (pageCount <= 7) {\r\n return Array.from({ length: pageCount }, (_, index) => ({ type: 'page' as const, page: index + 1 }));\r\n }\r\n\r\n const current = Math.min(Math.max(page, 1), pageCount);\r\n const siblings = Math.max(0, siblingCount);\r\n const left = Math.max(2, current - siblings);\r\n const right = Math.min(pageCount - 1, current + siblings);\r\n const items: TaoPaginationItem[] = [{ type: 'page', page: 1 }];\r\n\r\n if (left > 2) {\r\n items.push({ type: 'ellipsis', id: 'left' });\r\n }\r\n\r\n for (let next = left; next <= right; next += 1) {\r\n items.push({ type: 'page', page: next });\r\n }\r\n\r\n if (right < pageCount - 1) {\r\n items.push({ type: 'ellipsis', id: 'right' });\r\n }\r\n\r\n items.push({ type: 'page', page: pageCount });\r\n return items;\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { computed, watch } from 'vue';\r\nimport { buildPaginationItems } from '../pagination';\r\n\r\ndefineOptions({ name: 'TaoPagination' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n page?: number;\r\n total?: number;\r\n pageSize?: number;\r\n siblingCount?: number;\r\n disabled?: boolean;\r\n showTotal?: boolean;\r\n size?: 'small' | 'medium';\r\n /** Click ellipsis to skip this many pages. 0 keeps … decorative. */\r\n jump?: number;\r\n ariaLabel?: string;\r\n prevLabel?: string;\r\n nextLabel?: string;\r\n /** `{page}` — номер страницы. */\r\n pageLabel?: string;\r\n /** `{n}` — сколько страниц перескакивает «…». */\r\n jumpPrevLabel?: string;\r\n jumpNextLabel?: string;\r\n }>(),\r\n {\r\n page: 1,\r\n total: 0,\r\n pageSize: 10,\r\n siblingCount: 1,\r\n disabled: false,\r\n showTotal: true,\r\n size: 'medium',\r\n jump: 5,\r\n ariaLabel: 'Пагинация',\r\n prevLabel: 'Назад',\r\n nextLabel: 'Вперёд',\r\n pageLabel: 'Страница {page}',\r\n jumpPrevLabel: 'Назад на {n} страниц',\r\n jumpNextLabel: 'Вперёд на {n} страниц',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:page': [value: number];\r\n change: [value: number];\r\n}>();\r\n\r\nconst pageCount = computed(() => Math.max(1, Math.ceil(Math.max(props.total, 0) / Math.max(props.pageSize, 1))));\r\nconst current = computed(() => Math.min(Math.max(props.page, 1), pageCount.value));\r\nconst items = computed(() => buildPaginationItems(current.value, pageCount.value, props.siblingCount));\r\n\r\nconst from = computed(() => (props.total === 0 ? 0 : (current.value - 1) * props.pageSize + 1));\r\nconst to = computed(() => Math.min(current.value * props.pageSize, props.total));\r\n\r\nwatch(\r\n () => [props.page, pageCount.value] as const,\r\n ([page, count]) => {\r\n if (page > count || page < 1) {\r\n goTo(page);\r\n }\r\n },\r\n { immediate: true },\r\n);\r\n\r\nfunction goTo(next: number) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n const page = Math.min(Math.max(next, 1), pageCount.value);\r\n if (page === props.page) {\r\n return;\r\n }\r\n\r\n emit('update:page', page);\r\n emit('change', page);\r\n}\r\n</script>\r\n\r\n<template>\r\n <nav class=\"tao-pagination\" :class=\"`tao-pagination--${size}`\" :aria-label=\"ariaLabel\">\r\n <p v-if=\"showTotal\" class=\"tao-pagination__total\">\r\n <slot name=\"total\" :from=\"from\" :to=\"to\" :total=\"total\">\r\n <template v-if=\"total === 0\">0 из 0</template>\r\n <template v-else>{{ from }}–{{ to }} из {{ total }}</template>\r\n </slot>\r\n </p>\r\n\r\n <div class=\"tao-pagination__pages\">\r\n <button\r\n type=\"button\"\r\n class=\"tao-pagination__btn\"\r\n :aria-label=\"prevLabel\"\r\n :disabled=\"disabled || current <= 1\"\r\n @click=\"goTo(current - 1)\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"prev-icon\">‹</slot>\r\n </span>\r\n </button>\r\n\r\n <template v-for=\"item in items\" :key=\"item.type === 'page' ? item.page : item.id\">\r\n <button\r\n v-if=\"item.type === 'ellipsis' && jump > 0\"\r\n type=\"button\"\r\n class=\"tao-pagination__btn tao-pagination__btn--jump\"\r\n :aria-label=\"item.id === 'left' ? jumpPrevLabel.replace('{n}', String(jump)) : jumpNextLabel.replace('{n}', String(jump))\"\r\n :disabled=\"disabled\"\r\n @click=\"goTo(item.id === 'left' ? current - jump : current + jump)\"\r\n >\r\n …\r\n </button>\r\n <span v-else-if=\"item.type === 'ellipsis'\" class=\"tao-pagination__ellipsis\" aria-hidden=\"true\">…</span>\r\n <button\r\n v-else\r\n type=\"button\"\r\n class=\"tao-pagination__btn\"\r\n :class=\"{ 'tao-pagination__btn--current': item.page === current }\"\r\n :aria-current=\"item.page === current ? 'page' : undefined\"\r\n :aria-label=\"pageLabel.replace('{page}', String(item.page))\"\r\n :disabled=\"disabled\"\r\n @click=\"goTo(item.page)\"\r\n >\r\n {{ item.page }}\r\n </button>\r\n </template>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"tao-pagination__btn\"\r\n :aria-label=\"nextLabel\"\r\n :disabled=\"disabled || current >= pageCount\"\r\n @click=\"goTo(current + 1)\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"next-icon\">›</slot>\r\n </span>\r\n </button>\r\n </div>\r\n </nav>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-pagination {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--tao-space-3);\r\n width: 100%;\r\n}\r\n\r\n.tao-pagination__total {\r\n margin: 0;\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-pagination__pages {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: var(--tao-space-1);\r\n}\r\n\r\n.tao-pagination__btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 36px;\r\n height: 36px;\r\n padding: 0 var(--tao-space-2);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-surface-sunken);\r\n color: var(--tao-color-text);\r\n font-family: inherit;\r\n font-size: var(--tao-font-size-md);\r\n line-height: 1;\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-pagination--small .tao-pagination__btn {\r\n min-width: 28px;\r\n height: 28px;\r\n font-size: var(--tao-font-size-xs);\r\n}\r\n\r\n.tao-pagination__btn:hover:not(:disabled) {\r\n background: var(--tao-color-surface-hover);\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-pagination__btn:focus-visible {\r\n outline: none;\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-pagination__btn--current {\r\n background: var(--tao-color-accent);\r\n border-color: var(--tao-color-accent);\r\n color: var(--tao-color-on-accent);\r\n}\r\n\r\n.tao-pagination__btn--current:hover:not(:disabled) {\r\n background: var(--tao-color-accent-hover);\r\n color: var(--tao-color-on-accent);\r\n}\r\n\r\n.tao-pagination__btn--jump {\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-pagination__btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-pagination__ellipsis {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 24px;\r\n color: var(--tao-color-text-muted);\r\n user-select: none;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoEmpty' });\r\n\r\nwithDefaults(\r\n defineProps<{\r\n title?: string;\r\n }>(),\r\n {\r\n title: 'Ничего нет',\r\n },\r\n);\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-empty\">\r\n <div v-if=\"$slots.icon\" class=\"tao-empty__icon\">\r\n <slot name=\"icon\" />\r\n </div>\r\n <p v-if=\"title\" class=\"tao-empty__title\">{{ title }}</p>\r\n <p v-if=\"$slots.default\" class=\"tao-empty__text\"><slot /></p>\r\n <div v-if=\"$slots.action\" class=\"tao-empty__action\">\r\n <slot name=\"action\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--tao-space-2);\r\n padding: var(--tao-space-8) var(--tao-space-4);\r\n text-align: center;\r\n}\r\n\r\n.tao-empty__icon {\r\n color: var(--tao-color-text-muted);\r\n font-size: 32px;\r\n line-height: 1;\r\n}\r\n\r\n.tao-empty__title {\r\n margin: 0;\r\n font-size: var(--tao-font-size-lg);\r\n font-weight: 600;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-empty__text {\r\n margin: 0;\r\n max-width: 36ch;\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text-muted);\r\n line-height: 1.5;\r\n}\r\n\r\n.tao-empty__action {\r\n margin-top: var(--tao-space-2);\r\n}\r\n</style>\r\n","import type { ComputedRef, InjectionKey } from 'vue';\r\n\r\nexport type TaoListSize = 'small' | 'medium' | 'large';\r\n\r\nexport interface TaoListContext {\r\n size: ComputedRef<TaoListSize>;\r\n}\r\n\r\nexport const taoListKey: InjectionKey<TaoListContext> = Symbol('taoList');\r\n","<script lang=\"ts\" setup>\r\nimport { computed, provide } from 'vue';\r\nimport { taoListKey, type TaoListSize } from '../list';\r\n\r\ndefineOptions({ name: 'TaoList' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n size?: TaoListSize;\r\n /** Рамка, как у списка файлов. */\r\n bordered?: boolean;\r\n /** Линии между строками. */\r\n divided?: boolean;\r\n /** Скролл, если строки не влезают. Число — пиксели. */\r\n maxHeight?: number | string;\r\n /** Показать `#empty` вместо строк. */\r\n empty?: boolean;\r\n ariaLabel?: string;\r\n }>(),\r\n {\r\n size: 'medium',\r\n bordered: true,\r\n divided: true,\r\n empty: false,\r\n ariaLabel: '',\r\n },\r\n);\r\n\r\nconst size = computed(() => props.size);\r\nprovide(taoListKey, { size });\r\n\r\nconst listStyle = computed(() => {\r\n if (props.maxHeight === undefined || props.maxHeight === '') {\r\n return undefined;\r\n }\r\n const value = typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight;\r\n return { maxHeight: value };\r\n});\r\n</script>\r\n\r\n<template>\r\n <ul\r\n class=\"tao-list\"\r\n :class=\"[\r\n `tao-list--${size}`,\r\n {\r\n 'tao-list--bordered': bordered,\r\n 'tao-list--divided': divided,\r\n 'tao-list--plain': !bordered,\r\n 'tao-list--empty': empty,\r\n 'tao-list--scroll': Boolean(maxHeight),\r\n },\r\n ]\"\r\n :style=\"listStyle\"\r\n :aria-label=\"ariaLabel || undefined\"\r\n >\r\n <li v-if=\"empty\" class=\"tao-list__empty\">\r\n <slot name=\"empty\">Ничего нет</slot>\r\n </li>\r\n <slot v-else />\r\n </ul>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-list {\r\n box-sizing: border-box;\r\n width: 100%;\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-list--bordered {\r\n overflow: hidden;\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-list--plain {\r\n padding: var(--tao-space-1);\r\n background: transparent;\r\n}\r\n\r\n.tao-list--scroll {\r\n overflow: auto;\r\n}\r\n\r\n.tao-list--divided :deep(.tao-list-item:not(:last-child)) {\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-list--plain :deep(.tao-list-item) {\r\n border-radius: var(--tao-radius-sm);\r\n}\r\n\r\n.tao-list__empty {\r\n margin: 0;\r\n padding: var(--tao-space-3);\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-sm);\r\n line-height: 1.45;\r\n text-align: center;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, useSlots } from 'vue';\r\nimport { taoListKey, type TaoListSize } from '../list';\r\n\r\ndefineOptions({ name: 'TaoListItem' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n title?: string;\r\n description?: string;\r\n selected?: boolean;\r\n disabled?: boolean;\r\n /** Подсветка без selected — курсор / клавиатура. */\r\n active?: boolean;\r\n /** Строка-кнопка: Enter/Space, курсор pointer. */\r\n clickable?: boolean;\r\n size?: TaoListSize;\r\n /** `#action` всегда на виду, не только по ховеру. */\r\n actionAlways?: boolean;\r\n }>(),\r\n {\r\n title: '',\r\n description: '',\r\n selected: false,\r\n disabled: false,\r\n active: false,\r\n clickable: false,\r\n actionAlways: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n click: [event: MouseEvent];\r\n}>();\r\n\r\nconst slots = useSlots();\r\nconst list = inject(taoListKey, null);\r\n\r\nconst sizeClass = computed(() => {\r\n const size: TaoListSize = props.size ?? list?.size.value ?? 'medium';\r\n if (size === 'small') {\r\n return 's';\r\n }\r\n if (size === 'large') {\r\n return 'l';\r\n }\r\n return 'm';\r\n});\r\n\r\nconst hasAction = computed(() => Boolean(slots.action));\r\nconst hasPrefix = computed(() => Boolean(slots.prefix));\r\nconst hasSuffix = computed(() => Boolean(slots.suffix));\r\nconst hasDescription = computed(() => Boolean(props.description || slots.description));\r\n\r\nfunction onHitClick(event: MouseEvent) {\r\n if (props.disabled || !props.clickable) {\r\n return;\r\n }\r\n emit('click', event);\r\n}\r\n</script>\r\n\r\n<template>\r\n <li\r\n class=\"tao-list-item\"\r\n :class=\"[\r\n `tao-list-item--${sizeClass}`,\r\n {\r\n 'tao-list-item--selected': selected,\r\n 'tao-list-item--disabled': disabled,\r\n 'tao-list-item--active': active,\r\n 'tao-list-item--clickable': clickable,\r\n 'tao-list-item--has-action': hasAction,\r\n 'tao-list-item--action-always': actionAlways,\r\n },\r\n ]\"\r\n :aria-current=\"!clickable && selected ? 'true' : undefined\"\r\n :aria-disabled=\"disabled || undefined\"\r\n >\r\n <component\r\n :is=\"clickable ? 'button' : 'div'\"\r\n class=\"tao-list-item__hit\"\r\n :type=\"clickable ? 'button' : undefined\"\r\n :disabled=\"clickable ? disabled : undefined\"\r\n :aria-current=\"clickable && selected ? 'true' : undefined\"\r\n @click=\"onHitClick\"\r\n >\r\n <span v-if=\"hasPrefix\" class=\"tao-list-item__prefix\">\r\n <slot name=\"prefix\" />\r\n </span>\r\n <span class=\"tao-list-item__text\">\r\n <span class=\"tao-list-item__title\">\r\n <slot>{{ title }}</slot>\r\n </span>\r\n <span v-if=\"hasDescription\" class=\"tao-list-item__description\">\r\n <slot name=\"description\">{{ description }}</slot>\r\n </span>\r\n </span>\r\n <span v-if=\"hasSuffix\" class=\"tao-list-item__suffix\">\r\n <slot name=\"suffix\" />\r\n </span>\r\n </component>\r\n <div\r\n v-if=\"hasAction\"\r\n class=\"tao-list-item__action\"\r\n @click.stop\r\n @keydown.stop\r\n >\r\n <slot name=\"action\" />\r\n </div>\r\n </li>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-list-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-1);\r\n min-width: 0;\r\n color: var(--tao-color-text);\r\n transition: background var(--tao-duration-fast) var(--tao-ease-base);\r\n}\r\n\r\n.tao-list-item--s {\r\n min-height: 32px;\r\n padding: 0 var(--tao-space-1) 0 var(--tao-space-2);\r\n}\r\n\r\n.tao-list-item--m {\r\n min-height: 36px;\r\n padding: 0 var(--tao-space-2) 0 var(--tao-space-3);\r\n}\r\n\r\n.tao-list-item--l {\r\n min-height: 48px;\r\n padding: var(--tao-space-1) var(--tao-space-2) var(--tao-space-1) var(--tao-space-3);\r\n}\r\n\r\n.tao-list-item:hover:not(.tao-list-item--disabled),\r\n.tao-list-item--active:not(.tao-list-item--disabled) {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-list-item--selected {\r\n background: var(--tao-color-accent-subtle);\r\n}\r\n\r\n.tao-list-item--selected:hover:not(.tao-list-item--disabled),\r\n.tao-list-item--selected.tao-list-item--active:not(.tao-list-item--disabled) {\r\n background: var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-list-item--disabled {\r\n opacity: 0.5;\r\n}\r\n\r\n.tao-list-item__hit {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n margin: 0;\r\n padding: var(--tao-space-2) 0;\r\n border: none;\r\n background: none;\r\n color: inherit;\r\n font: inherit;\r\n text-align: left;\r\n}\r\n\r\n.tao-list-item--s .tao-list-item__hit {\r\n padding: var(--tao-space-1) 0;\r\n gap: var(--tao-space-2);\r\n}\r\n\r\n.tao-list-item--l .tao-list-item__hit {\r\n padding: var(--tao-space-2) 0;\r\n}\r\n\r\nbutton.tao-list-item__hit {\r\n cursor: pointer;\r\n}\r\n\r\nbutton.tao-list-item__hit:disabled {\r\n cursor: not-allowed;\r\n}\r\n\r\nbutton.tao-list-item__hit:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: -2px;\r\n}\r\n\r\n.tao-list-item__prefix {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-list-item__prefix :deep(.tao-avatar) {\r\n display: block;\r\n}\r\n\r\n.tao-list-item__text {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1px;\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n}\r\n\r\n.tao-list-item__title {\r\n min-width: 0;\r\n overflow: hidden;\r\n font-size: var(--tao-font-size-md);\r\n line-height: 1.3;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-list-item--s .tao-list-item__title {\r\n font-size: var(--tao-font-size-sm);\r\n}\r\n\r\n.tao-list-item--selected .tao-list-item__title {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-list-item--clickable .tao-list-item__title {\r\n user-select: none;\r\n}\r\n\r\n.tao-list-item__description {\r\n min-width: 0;\r\n overflow: hidden;\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-xs);\r\n line-height: 1.3;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-list-item__suffix {\r\n flex-shrink: 0;\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-xs);\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-list-item__action {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n@media (hover: hover) {\r\n .tao-list-item--has-action:not(.tao-list-item--action-always) .tao-list-item__action {\r\n opacity: 0;\r\n }\r\n\r\n .tao-list-item--has-action:not(.tao-list-item--action-always):hover .tao-list-item__action,\r\n .tao-list-item--has-action:not(.tao-list-item--action-always):focus-within .tao-list-item__action {\r\n opacity: 1;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoSkeleton' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n variant?: 'text' | 'title' | 'circle' | 'rect';\r\n lines?: number;\r\n width?: string;\r\n height?: string;\r\n }>(),\r\n {\r\n variant: 'text',\r\n lines: 1,\r\n width: '',\r\n height: '',\r\n },\r\n);\r\n\r\nconst count = computed(() => Math.max(1, props.lines));\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-skeleton-group\" :aria-hidden=\"true\">\r\n <span\r\n v-for=\"index in count\"\r\n :key=\"index\"\r\n class=\"tao-skeleton\"\r\n :class=\"`tao-skeleton--${variant}`\"\r\n :style=\"{ width: width || undefined, height: height || undefined }\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-skeleton-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n}\r\n\r\n.tao-skeleton {\r\n display: block;\r\n background: var(--tao-color-surface-sunken);\r\n border-radius: var(--tao-radius-control);\r\n animation: tao-skeleton-pulse 1.2s var(--tao-ease-base) infinite;\r\n}\r\n\r\n.tao-skeleton--text {\r\n height: 12px;\r\n width: 100%;\r\n}\r\n\r\n.tao-skeleton--text:last-child:not(:only-child) {\r\n width: 72%;\r\n}\r\n\r\n.tao-skeleton--title {\r\n height: 20px;\r\n width: 40%;\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-skeleton--circle {\r\n width: 40px;\r\n height: 40px;\r\n border-radius: var(--tao-radius-full);\r\n}\r\n\r\n.tao-skeleton--rect {\r\n width: 100%;\r\n height: 80px;\r\n border-radius: var(--tao-radius-panel);\r\n}\r\n\r\n@keyframes tao-skeleton-pulse {\r\n 0%,\r\n 100% {\r\n opacity: 0.55;\r\n }\r\n 50% {\r\n opacity: 1;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\r\nimport { getFocusable, trapTab } from '../focusTrap';\r\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\r\n\r\ndefineOptions({ name: 'TaoDrawer' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue: boolean;\r\n title?: string;\r\n side?: 'left' | 'right';\r\n closable?: boolean;\r\n closeLabel?: string;\r\n }>(),\r\n {\r\n title: '',\r\n side: 'right',\r\n closable: true,\r\n closeLabel: 'Закрыть',\r\n },\r\n);\r\n\r\nconst emit = defineEmits(['update:modelValue', 'close']);\r\n\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst titleId = useId();\r\nlet previousFocus: HTMLElement | null = null;\r\nlet scrollHeld = false;\r\n\r\nfunction close() {\r\n if (!props.closable) {\r\n return;\r\n }\r\n emit('update:modelValue', false);\r\n emit('close');\r\n}\r\n\r\nfunction holdScroll() {\r\n if (scrollHeld || !isBrowser()) {\r\n return;\r\n }\r\n lockBodyScroll();\r\n scrollHeld = true;\r\n}\r\n\r\nfunction releaseScroll() {\r\n if (!scrollHeld) {\r\n return;\r\n }\r\n unlockBodyScroll();\r\n scrollHeld = false;\r\n}\r\n\r\nfunction restoreFocus() {\r\n previousFocus?.focus?.();\r\n previousFocus = null;\r\n}\r\n\r\nasync function focusPanel() {\r\n await nextTick();\r\n const panel = panelRef.value;\r\n if (!panel) {\r\n return;\r\n }\r\n const first = getFocusable(panel)[0];\r\n (first ?? panel).focus();\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n if (!props.closable) {\r\n return;\r\n }\r\n event.preventDefault();\r\n close();\r\n return;\r\n }\r\n if (panelRef.value) {\r\n trapTab(event, panelRef.value);\r\n }\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (isOpen) => {\r\n if (!isBrowser()) {\r\n return;\r\n }\r\n\r\n if (isOpen) {\r\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\r\n holdScroll();\r\n void focusPanel();\r\n return;\r\n }\r\n releaseScroll();\r\n restoreFocus();\r\n },\r\n { immediate: true },\r\n);\r\n\r\nonBeforeUnmount(() => {\r\n releaseScroll();\r\n restoreFocus();\r\n});\r\n</script>\r\n\r\n<template>\r\n <Teleport to=\"body\">\r\n <Transition :name=\"`tao-drawer-${side}`\">\r\n <div v-if=\"modelValue\" class=\"tao-drawer\" :class=\"`tao-drawer--${side}`\" @keydown=\"onKeydown\">\r\n <div class=\"tao-drawer__overlay\" @click=\"close\"></div>\r\n <aside\r\n ref=\"panelRef\"\r\n class=\"tao-drawer__panel\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n :aria-labelledby=\"title ? titleId : undefined\"\r\n tabindex=\"-1\"\r\n >\r\n <div v-if=\"title || closable\" class=\"tao-drawer__header\">\r\n <h2 v-if=\"title\" :id=\"titleId\" class=\"tao-drawer__title\">{{ title }}</h2>\r\n <span v-else></span>\r\n <button\r\n v-if=\"closable\"\r\n type=\"button\"\r\n class=\"tao-drawer__close\"\r\n :aria-label=\"closeLabel\"\r\n @click=\"close\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"close-icon\">&times;</slot>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"tao-drawer__content\">\r\n <slot />\r\n </div>\r\n <div v-if=\"$slots.footer\" class=\"tao-drawer__footer\">\r\n <slot name=\"footer\" />\r\n </div>\r\n </aside>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-drawer {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 1000;\r\n display: flex;\r\n}\r\n\r\n.tao-drawer--right {\r\n justify-content: flex-end;\r\n}\r\n\r\n.tao-drawer--left {\r\n justify-content: flex-start;\r\n}\r\n\r\n.tao-drawer__overlay {\r\n position: absolute;\r\n inset: 0;\r\n background: var(--tao-color-overlay);\r\n}\r\n\r\n.tao-drawer__panel {\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n width: min(360px, 100%);\r\n height: 100%;\r\n background: var(--tao-color-surface-raised);\r\n box-shadow: var(--tao-shadow-overlay);\r\n}\r\n\r\n.tao-drawer__panel:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-drawer__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--tao-space-3);\r\n padding: var(--tao-space-4);\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-drawer__title {\r\n margin: 0;\r\n font-size: var(--tao-font-size-lg);\r\n font-weight: 600;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-drawer__close {\r\n background: none;\r\n border: none;\r\n padding: 0;\r\n font-size: 24px;\r\n line-height: 1;\r\n color: var(--tao-color-text);\r\n cursor: pointer;\r\n}\r\n\r\n.tao-drawer__close:hover {\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-drawer__close:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-drawer__content {\r\n flex: 1;\r\n min-height: 0;\r\n overflow: auto;\r\n padding: var(--tao-space-4);\r\n}\r\n\r\n.tao-drawer__footer {\r\n padding: var(--tao-space-4);\r\n border-top: 1px solid var(--tao-color-border);\r\n display: flex;\r\n gap: var(--tao-space-3);\r\n justify-content: flex-end;\r\n}\r\n\r\n.tao-drawer-right-enter-active,\r\n.tao-drawer-right-leave-active,\r\n.tao-drawer-left-enter-active,\r\n.tao-drawer-left-leave-active {\r\n transition: opacity var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-drawer-right-enter-active .tao-drawer__panel,\r\n.tao-drawer-right-leave-active .tao-drawer__panel,\r\n.tao-drawer-left-enter-active .tao-drawer__panel,\r\n.tao-drawer-left-leave-active .tao-drawer__panel {\r\n transition: transform var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-drawer-right-enter-from,\r\n.tao-drawer-right-leave-to,\r\n.tao-drawer-left-enter-from,\r\n.tao-drawer-left-leave-to {\r\n opacity: 0;\r\n}\r\n\r\n.tao-drawer-right-enter-from .tao-drawer__panel,\r\n.tao-drawer-right-leave-to .tao-drawer__panel {\r\n transform: translateX(100%);\r\n}\r\n\r\n.tao-drawer-left-enter-from .tao-drawer__panel,\r\n.tao-drawer-left-leave-to .tao-drawer__panel {\r\n transform: translateX(-100%);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, ref, watch } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoAvatar' });\r\n\r\ntype TaoAvatarDot = 'success' | 'danger' | 'warning' | 'info' | 'neutral' | 'error';\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n src?: string;\r\n name?: string;\r\n alt?: string;\r\n size?: 'small' | 'medium' | 'large' | 's' | 'm' | 'l';\r\n /** Точка статуса. `true` = success (в сети). */\r\n dot?: boolean | TaoAvatarDot;\r\n /** Счётчик в углу. 0 и пустое не рисуются, больше 99 — «99+». */\r\n count?: number | string;\r\n fallbackLabel?: string;\r\n /** `{count}` — число в бейдже. */\r\n notificationsLabel?: string;\r\n dotLabels?: Partial<Record<Exclude<TaoAvatarDot, 'error'>, string>>;\r\n }>(),\r\n {\r\n src: '',\r\n name: '',\r\n alt: '',\r\n size: 'medium',\r\n dot: false,\r\n count: undefined,\r\n fallbackLabel: 'Аватар',\r\n notificationsLabel: '{count} уведомлений',\r\n dotLabels: () => ({}),\r\n },\r\n);\r\n\r\nconst sizeClass = computed(() => {\r\n if (props.size === 'small' || props.size === 's') {\r\n return 's';\r\n }\r\n if (props.size === 'large' || props.size === 'l') {\r\n return 'l';\r\n }\r\n return 'm';\r\n});\r\n\r\nconst initials = computed(() => {\r\n const parts = props.name.trim().split(/\\s+/).filter(Boolean);\r\n if (!parts.length) {\r\n return '';\r\n }\r\n if (parts.length === 1) {\r\n return parts[0].slice(0, 2).toUpperCase();\r\n }\r\n return `${parts[0][0] ?? ''}${parts[1][0] ?? ''}`.toUpperCase();\r\n});\r\n\r\nconst dotTone = computed((): Exclude<TaoAvatarDot, 'error'> | null => {\r\n if (!props.dot) {\r\n return null;\r\n }\r\n if (props.dot === true) {\r\n return 'success';\r\n }\r\n return props.dot === 'error' ? 'danger' : props.dot;\r\n});\r\n\r\nconst badge = computed(() => {\r\n if (props.count === undefined || props.count === '') {\r\n return '';\r\n }\r\n const numeric = typeof props.count === 'number' ? props.count : Number(props.count);\r\n if (Number.isFinite(numeric)) {\r\n if (numeric <= 0) {\r\n return '';\r\n }\r\n return numeric > 99 ? '99+' : String(numeric);\r\n }\r\n return String(props.count);\r\n});\r\n\r\nconst defaultDotLabel: Record<Exclude<TaoAvatarDot, 'error'>, string> = {\r\n success: 'в сети',\r\n danger: 'занят',\r\n warning: 'отошёл',\r\n info: 'статус',\r\n neutral: 'не в сети',\r\n};\r\n\r\nconst label = computed(() => {\r\n const base = props.alt || props.name || props.fallbackLabel;\r\n const extra: string[] = [];\r\n if (dotTone.value) {\r\n extra.push(props.dotLabels[dotTone.value] ?? defaultDotLabel[dotTone.value]);\r\n }\r\n if (badge.value) {\r\n extra.push(props.notificationsLabel.replace('{count}', badge.value));\r\n }\r\n return extra.length ? `${base}, ${extra.join(', ')}` : base;\r\n});\r\n\r\nconst imgFailed = ref(false);\r\nconst showImage = computed(() => Boolean(props.src) && !imgFailed.value);\r\n\r\nwatch(\r\n () => props.src,\r\n () => {\r\n imgFailed.value = false;\r\n },\r\n);\r\n\r\nfunction onImgError() {\r\n imgFailed.value = true;\r\n}\r\n</script>\r\n\r\n<template>\r\n <span class=\"tao-avatar\" :class=\"`tao-avatar--${sizeClass}`\" :title=\"label\">\r\n <span class=\"tao-avatar__face\">\r\n <img v-if=\"showImage\" class=\"tao-avatar__img\" :src=\"src\" :alt=\"label\" @error=\"onImgError\" />\r\n <span v-else class=\"tao-avatar__fallback\" :aria-label=\"label\">{{ initials || '?' }}</span>\r\n </span>\r\n <span\r\n v-if=\"dotTone\"\r\n class=\"tao-avatar__dot\"\r\n :class=\"`tao-avatar__dot--${dotTone}`\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n <span v-if=\"badge\" class=\"tao-avatar__badge\" aria-hidden=\"true\">{{ badge }}</span>\r\n </span>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-avatar {\r\n position: relative;\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n user-select: none;\r\n}\r\n\r\n.tao-avatar__face {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n overflow: hidden;\r\n width: 100%;\r\n height: 100%;\r\n background: var(--tao-color-accent-subtle);\r\n color: var(--tao-color-accent);\r\n border-radius: var(--tao-radius-full);\r\n font-weight: 600;\r\n line-height: 1;\r\n}\r\n\r\n.tao-avatar--s {\r\n width: 24px;\r\n height: 24px;\r\n font-size: 10px;\r\n}\r\n\r\n.tao-avatar--m {\r\n width: 32px;\r\n height: 32px;\r\n font-size: var(--tao-font-size-xs);\r\n}\r\n\r\n.tao-avatar--l {\r\n width: 48px;\r\n height: 48px;\r\n font-size: var(--tao-font-size-md);\r\n}\r\n\r\n.tao-avatar__img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n}\r\n\r\n.tao-avatar__fallback {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.tao-avatar__dot {\r\n position: absolute;\r\n right: -1px;\r\n bottom: -1px;\r\n box-sizing: border-box;\r\n border: 2px solid var(--tao-color-bg);\r\n border-radius: var(--tao-radius-full);\r\n background: var(--tao-color-success);\r\n}\r\n\r\n.tao-avatar--s .tao-avatar__dot {\r\n width: 8px;\r\n height: 8px;\r\n border-width: 1px;\r\n}\r\n\r\n.tao-avatar--m .tao-avatar__dot {\r\n width: 10px;\r\n height: 10px;\r\n}\r\n\r\n.tao-avatar--l .tao-avatar__dot {\r\n width: 12px;\r\n height: 12px;\r\n}\r\n\r\n.tao-avatar__dot--success {\r\n background: var(--tao-color-success);\r\n}\r\n\r\n.tao-avatar__dot--danger {\r\n background: var(--tao-color-danger);\r\n}\r\n\r\n.tao-avatar__dot--warning {\r\n background: var(--tao-color-warning);\r\n}\r\n\r\n.tao-avatar__dot--info {\r\n background: var(--tao-color-info);\r\n}\r\n\r\n.tao-avatar__dot--neutral {\r\n background: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-avatar__badge {\r\n position: absolute;\r\n top: -6px;\r\n right: -6px;\r\n z-index: 1;\r\n box-sizing: border-box;\r\n min-width: 16px;\r\n height: 16px;\r\n padding: 0 4px;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: 2px solid var(--tao-color-bg);\r\n border-radius: var(--tao-radius-full);\r\n background: var(--tao-color-danger);\r\n color: var(--tao-color-text-strong);\r\n font-size: 10px;\r\n font-weight: 700;\r\n line-height: 1;\r\n}\r\n\r\n.tao-avatar--s .tao-avatar__badge {\r\n top: -5px;\r\n right: -5px;\r\n min-width: 14px;\r\n height: 14px;\r\n padding: 0 3px;\r\n font-size: 9px;\r\n}\r\n\r\n.tao-avatar--l .tao-avatar__badge {\r\n min-width: 18px;\r\n height: 18px;\r\n font-size: 11px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport TaoLink from './TaoLink.vue';\r\nimport type { TaoBreadcrumbItem } from '../breadcrumb';\r\n\r\ndefineOptions({ name: 'TaoBreadcrumb' });\r\n\r\nwithDefaults(\r\n defineProps<{\r\n items: TaoBreadcrumbItem[];\r\n ariaLabel?: string;\r\n }>(),\r\n {\r\n ariaLabel: 'Хлебные крошки',\r\n },\r\n);\r\n</script>\r\n\r\n<template>\r\n <nav class=\"tao-breadcrumb\" :aria-label=\"ariaLabel\">\r\n <ol class=\"tao-breadcrumb__list\">\r\n <li v-for=\"(item, index) in items\" :key=\"`${item.label}-${index}`\" class=\"tao-breadcrumb__item\">\r\n <span v-if=\"index > 0\" class=\"tao-breadcrumb__sep\" aria-hidden=\"true\">/</span>\r\n <span v-if=\"index === items.length - 1\" class=\"tao-breadcrumb__current\" aria-current=\"page\">\r\n {{ item.label }}\r\n </span>\r\n <TaoLink v-else-if=\"item.to\" class=\"tao-breadcrumb__link\" :to=\"item.to\">{{ item.label }}</TaoLink>\r\n <span v-else class=\"tao-breadcrumb__link\">{{ item.label }}</span>\r\n </li>\r\n </ol>\r\n </nav>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-breadcrumb__list {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: var(--tao-space-1);\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n font-size: var(--tao-font-size-sm);\r\n}\r\n\r\n.tao-breadcrumb__item {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--tao-space-1);\r\n}\r\n\r\n.tao-breadcrumb__sep {\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-breadcrumb__link {\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-breadcrumb__current {\r\n color: var(--tao-color-text);\r\n font-weight: 500;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoCounter' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value?: number;\r\n maxDigits?: number;\r\n }>(),\r\n {\r\n value: 0,\r\n maxDigits: 9,\r\n },\r\n);\r\n\r\ntype Slot = {\r\n value: string;\r\n isSpace: boolean;\r\n isLeadingZero: boolean;\r\n key: string;\r\n};\r\n\r\nfunction formatDigits(num: number, minDigits: number) {\r\n const abs = Math.abs(Math.trunc(num));\r\n return abs.toString().padStart(Math.max(1, minDigits), '0').replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\r\n}\r\n\r\nconst slots = computed(() => {\r\n const formatted = formatDigits(props.value, props.maxDigits);\r\n const significant = Math.abs(Math.trunc(props.value)).toString();\r\n const leadingZeros = Math.max(0, props.maxDigits - significant.length);\r\n const result: Slot[] = [];\r\n let digitCount = 0;\r\n\r\n if (props.value < 0) {\r\n result.push({\r\n value: '−',\r\n isSpace: false,\r\n isLeadingZero: false,\r\n key: 'sign',\r\n });\r\n }\r\n\r\n for (let index = 0; index < formatted.length; index += 1) {\r\n const char = formatted[index] ?? '';\r\n if (char === ' ') {\r\n result.push({\r\n value: ' ',\r\n isSpace: true,\r\n isLeadingZero: false,\r\n key: `space-${index}`,\r\n });\r\n continue;\r\n }\r\n\r\n result.push({\r\n value: char,\r\n isSpace: false,\r\n isLeadingZero: digitCount < leadingZeros,\r\n key: `${index}-${char}`,\r\n });\r\n digitCount += 1;\r\n }\r\n\r\n return result;\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-counter\" role=\"img\" :aria-label=\"String(value)\">\r\n <div class=\"tao-counter__row\" aria-hidden=\"true\">\r\n <div\r\n v-for=\"(slot, index) in slots\"\r\n :key=\"`${index}-${slot.isSpace ? 'gap' : 'd'}`\"\r\n class=\"tao-counter__slot\"\r\n :class=\"{ 'tao-counter__slot--space': slot.isSpace }\"\r\n >\r\n <TransitionGroup name=\"tao-digit\">\r\n <span\r\n v-if=\"!slot.isSpace\"\r\n :key=\"slot.key\"\r\n class=\"tao-counter__digit\"\r\n :class=\"{ 'tao-counter__digit--muted': slot.isLeadingZero }\"\r\n >\r\n {{ slot.value }}\r\n </span>\r\n </TransitionGroup>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-counter {\r\n display: inline-flex;\r\n color: var(--tao-color-accent);\r\n font-size: 28px;\r\n font-weight: 700;\r\n font-variant-numeric: tabular-nums;\r\n line-height: 1;\r\n}\r\n\r\n.tao-counter__row {\r\n display: inline-flex;\r\n gap: 3px;\r\n}\r\n\r\n.tao-counter__slot {\r\n position: relative;\r\n overflow: hidden;\r\n width: 1.15em;\r\n height: 1.55em;\r\n border-radius: var(--tao-radius-sm);\r\n background: var(--tao-color-surface-sunken);\r\n}\r\n\r\n.tao-counter__slot--space {\r\n width: 0.28em;\r\n background: transparent;\r\n}\r\n\r\n.tao-counter__digit {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.tao-counter__digit--muted {\r\n color: var(--tao-color-text-muted);\r\n opacity: 0.45;\r\n}\r\n\r\n.tao-digit-enter-from {\r\n transform: translateY(100%) rotateX(-90deg);\r\n filter: blur(8px);\r\n opacity: 0;\r\n}\r\n\r\n.tao-digit-leave-to {\r\n transform: translateY(-100%) rotateX(90deg);\r\n filter: blur(8px);\r\n opacity: 0;\r\n}\r\n\r\n.tao-digit-enter-active,\r\n.tao-digit-leave-active {\r\n transition:\r\n transform var(--tao-duration-slow) cubic-bezier(0.68, -0.55, 0.265, 1.55),\r\n filter var(--tao-duration-slow) var(--tao-ease-base),\r\n opacity var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n@media (max-width: 450px) {\r\n .tao-counter {\r\n font-size: 22px;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, onUpdated, ref, watch } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoCarousel' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: number;\r\n peek?: number;\r\n /** How many slides fit in the viewport. 5 = product strip. 1 = one card. */\r\n perView?: number;\r\n controls?: boolean;\r\n /** Interval in ms. 0 — off. Pauses on hover, keyboard focus, drag, and reduced motion. */\r\n autoplay?: number;\r\n loop?: boolean;\r\n /** Pips under the track: one per snap. Inactive are dots, the current one stretches into a pill. */\r\n dots?: boolean;\r\n ariaLabel?: string;\r\n prevLabel?: string;\r\n nextLabel?: string;\r\n dotsLabel?: string;\r\n /** `{n}` и `{count}` — текущий слайд и всего. */\r\n slideLabel?: string;\r\n }>(),\r\n {\r\n modelValue: 0,\r\n peek: 0,\r\n perView: 1,\r\n controls: true,\r\n autoplay: 0,\r\n loop: false,\r\n dots: false,\r\n ariaLabel: 'Лента',\r\n prevLabel: 'Назад',\r\n nextLabel: 'Вперёд',\r\n dotsLabel: 'Слайды',\r\n slideLabel: 'Слайд {n} из {count}',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number];\r\n change: [value: number];\r\n}>();\r\n\r\ndefineSlots<{\r\n default(): unknown;\r\n prev(props: { disabled: boolean; go: () => void }): unknown;\r\n next(props: { disabled: boolean; go: () => void }): unknown;\r\n 'prev-icon'(): unknown;\r\n 'next-icon'(): unknown;\r\n dots(props: { index: number; count: number; go: (next: number) => void }): unknown;\r\n dot(props: { active: boolean; index: number; go: () => void }): unknown;\r\n}>();\r\n\r\nconst track = ref<HTMLElement | null>(null);\r\nconst index = ref(props.modelValue);\r\nconst count = ref(0);\r\nconst dragging = ref(false);\r\nconst hoverPaused = ref(false);\r\nconst focusPaused = ref(false);\r\n\r\nlet dragStartX = 0;\r\nlet dragStartScroll = 0;\r\nlet dragMoved = 0;\r\nlet dragPointer = -1;\r\nlet scrollFrame = 0;\r\nlet focusFrame = 0;\r\nlet autoplayTimer = 0;\r\n\r\nconst step = computed(() => Math.max(1, Math.round(props.perView)));\r\nconst lastIndex = computed(() => Math.max(count.value - step.value, 0));\r\nconst atStart = computed(() => !props.loop && index.value <= 0);\r\nconst atEnd = computed(() => !props.loop && index.value >= lastIndex.value);\r\nconst snapCount = computed(() => (count.value <= 0 ? 0 : lastIndex.value + 1));\r\nconst showControls = computed(() => props.controls && count.value > step.value);\r\nconst showDots = computed(() => props.dots && snapCount.value > 1);\r\n\r\nconst trackStyle = computed(() => ({\r\n '--tao-carousel-peek': `${Math.max(props.peek, 0)}px`,\r\n '--tao-carousel-per-view': String(step.value),\r\n}));\r\n\r\nfunction prefersReducedMotion() {\r\n return typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n}\r\n\r\nfunction metrics() {\r\n const el = track.value;\r\n if (!el || el.children.length === 0) {\r\n return { width: 0, gap: 0, total: 0 };\r\n }\r\n\r\n const styles = getComputedStyle(el);\r\n const gap = Number.parseFloat(styles.columnGap || styles.gap) || 0;\r\n const width = (el.children[0] as HTMLElement).getBoundingClientRect().width;\r\n return { width, gap, total: el.children.length };\r\n}\r\n\r\nfunction nearestIndex(scrollLeft?: number) {\r\n const { width, gap, total } = metrics();\r\n if (width <= 0 || total <= 0) {\r\n return 0;\r\n }\r\n\r\n const left = scrollLeft ?? track.value?.scrollLeft ?? 0;\r\n const last = Math.max(total - step.value, 0);\r\n return Math.min(Math.max(Math.round(left / (width + gap)), 0), last);\r\n}\r\n\r\nfunction setIndex(next: number) {\r\n if (next === index.value) {\r\n return;\r\n }\r\n\r\n index.value = next;\r\n emit('update:modelValue', next);\r\n emit('change', next);\r\n}\r\n\r\nfunction refreshCount() {\r\n count.value = track.value?.children.length ?? 0;\r\n}\r\n\r\nfunction goPrev() {\r\n goTo(index.value - step.value);\r\n}\r\n\r\nfunction goNext() {\r\n goTo(index.value + step.value);\r\n}\r\n\r\nfunction goTo(next: number, instant = false) {\r\n const el = track.value;\r\n const { width, gap, total } = metrics();\r\n if (!el || width <= 0 || total <= 0) {\r\n return;\r\n }\r\n\r\n const last = Math.max(total - step.value, 0);\r\n let page = next;\r\n let wrapping = false;\r\n if (props.loop && total > step.value) {\r\n if (page > last) {\r\n page = 0;\r\n wrapping = true;\r\n } else if (page < 0) {\r\n page = last;\r\n wrapping = true;\r\n }\r\n } else {\r\n page = Math.min(Math.max(next, 0), last);\r\n }\r\n\r\n el.scrollTo({\r\n left: page * (width + gap),\r\n behavior: prefersReducedMotion() || dragging.value || wrapping || instant ? 'auto' : 'smooth',\r\n });\r\n setIndex(page);\r\n}\r\n\r\nfunction stopAutoplay() {\r\n window.clearInterval(autoplayTimer);\r\n autoplayTimer = 0;\r\n}\r\n\r\nfunction canAutoplay() {\r\n return (\r\n props.autoplay > 0 &&\r\n count.value > step.value &&\r\n !hoverPaused.value &&\r\n !focusPaused.value &&\r\n !dragging.value &&\r\n typeof document !== 'undefined' &&\r\n !document.hidden &&\r\n !prefersReducedMotion() &&\r\n (props.loop || index.value < lastIndex.value)\r\n );\r\n}\r\n\r\nfunction tickAutoplay() {\r\n if (!canAutoplay()) {\r\n stopAutoplay();\r\n return;\r\n }\r\n\r\n goTo(index.value + step.value);\r\n}\r\n\r\nfunction syncAutoplay() {\r\n stopAutoplay();\r\n if (!canAutoplay()) {\r\n return;\r\n }\r\n\r\n autoplayTimer = window.setInterval(tickAutoplay, props.autoplay);\r\n}\r\n\r\nfunction onMouseEnter() {\r\n hoverPaused.value = true;\r\n stopAutoplay();\r\n}\r\n\r\nfunction onMouseLeave() {\r\n hoverPaused.value = false;\r\n syncAutoplay();\r\n}\r\n\r\nfunction hasKeyboardFocus(root: HTMLElement) {\r\n const active = document.activeElement;\r\n if (!(active instanceof HTMLElement) || !root.contains(active)) {\r\n return false;\r\n }\r\n\r\n try {\r\n return active.matches(':focus-visible');\r\n } catch {\r\n return true;\r\n }\r\n}\r\n\r\nfunction scheduleFocusPause(event: FocusEvent) {\r\n const root = event.currentTarget as HTMLElement;\r\n cancelAnimationFrame(focusFrame);\r\n focusFrame = requestAnimationFrame(() => {\r\n if (!track.value) {\r\n return;\r\n }\r\n\r\n const next = hasKeyboardFocus(root);\r\n focusPaused.value = next;\r\n if (next) {\r\n stopAutoplay();\r\n return;\r\n }\r\n\r\n syncAutoplay();\r\n });\r\n}\r\n\r\nfunction onScroll() {\r\n if (dragging.value) {\r\n return;\r\n }\r\n\r\n cancelAnimationFrame(scrollFrame);\r\n scrollFrame = requestAnimationFrame(() => {\r\n const next = nearestIndex();\r\n const { width, gap } = metrics();\r\n const el = track.value;\r\n if (el && width > 0 && el.scrollLeft - next * (width + gap) > (width + gap) / 2) {\r\n goTo(next, true);\r\n return;\r\n }\r\n setIndex(next);\r\n });\r\n}\r\n\r\nfunction releaseDragCapture() {\r\n const el = track.value;\r\n const id = dragPointer;\r\n if (!el || id === -1) {\r\n return;\r\n }\r\n\r\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\r\n return;\r\n }\r\n\r\n try {\r\n el.releasePointerCapture(id);\r\n } catch {\r\n /* already released by the browser */\r\n }\r\n}\r\n\r\nfunction endDrag(keepClickGuard = false) {\r\n if (!dragging.value) {\r\n return;\r\n }\r\n\r\n dragging.value = false;\r\n releaseDragCapture();\r\n dragPointer = -1;\r\n if (!keepClickGuard) {\r\n dragMoved = 0;\r\n }\r\n\r\n if (track.value) {\r\n goTo(nearestIndex(), true);\r\n }\r\n syncAutoplay();\r\n}\r\n\r\nfunction onPointerDown(event: PointerEvent) {\r\n if (event.pointerType !== 'mouse' || event.button !== 0 || !track.value) {\r\n return;\r\n }\r\n\r\n dragPointer = event.pointerId;\r\n dragStartX = event.clientX;\r\n dragStartScroll = track.value.scrollLeft;\r\n dragMoved = 0;\r\n dragging.value = true;\r\n try {\r\n track.value.setPointerCapture(event.pointerId);\r\n } catch {\r\n /* untrusted events / capture already gone */\r\n }\r\n}\r\n\r\nfunction onPointerMove(event: PointerEvent) {\r\n if (!dragging.value || event.pointerId !== dragPointer || !track.value) {\r\n return;\r\n }\r\n\r\n const dx = event.clientX - dragStartX;\r\n dragMoved = Math.abs(dx);\r\n track.value.scrollLeft = dragStartScroll - dx;\r\n}\r\n\r\nfunction onPointerEnd(event: PointerEvent) {\r\n if (!dragging.value) {\r\n return;\r\n }\r\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\r\n return;\r\n }\r\n\r\n endDrag(true);\r\n}\r\n\r\nfunction onLostPointerCapture() {\r\n endDrag();\r\n}\r\n\r\nfunction onWindowBlur() {\r\n endDrag();\r\n hoverPaused.value = false;\r\n syncAutoplay();\r\n}\r\n\r\nfunction onVisibilityChange() {\r\n if (document.hidden) {\r\n endDrag();\r\n hoverPaused.value = false;\r\n }\r\n syncAutoplay();\r\n}\r\n\r\nfunction onClickCapture(event: MouseEvent) {\r\n if (dragMoved > 6) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n dragMoved = 0;\r\n }\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'ArrowLeft') {\r\n event.preventDefault();\r\n goPrev();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n event.preventDefault();\r\n goNext();\r\n }\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n if (value !== index.value) {\r\n goTo(value);\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => [props.autoplay, props.loop, count.value, dragging.value, index.value] as const,\r\n () => syncAutoplay(),\r\n);\r\n\r\nonMounted(() => {\r\n refreshCount();\r\n nextTick(() => {\r\n goTo(props.modelValue);\r\n syncAutoplay();\r\n });\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n window.addEventListener('blur', onWindowBlur);\r\n window.addEventListener('pagehide', onWindowBlur);\r\n});\r\n\r\nonUpdated(refreshCount);\r\n\r\nonBeforeUnmount(() => {\r\n endDrag();\r\n cancelAnimationFrame(scrollFrame);\r\n cancelAnimationFrame(focusFrame);\r\n stopAutoplay();\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n window.removeEventListener('blur', onWindowBlur);\r\n window.removeEventListener('pagehide', onWindowBlur);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-carousel\"\r\n :style=\"trackStyle\"\r\n @mouseenter=\"onMouseEnter\"\r\n @mouseleave=\"onMouseLeave\"\r\n @focusin=\"scheduleFocusPause\"\r\n @focusout=\"scheduleFocusPause\"\r\n >\r\n <div class=\"tao-carousel__row\">\r\n <slot name=\"prev\" :disabled=\"atStart\" :go=\"goPrev\">\r\n <button\r\n v-if=\"showControls\"\r\n type=\"button\"\r\n class=\"tao-carousel__nav\"\r\n :aria-label=\"prevLabel\"\r\n :disabled=\"atStart\"\r\n @click=\"goPrev\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"prev-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M14.5 5 8 12l6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n </slot>\r\n\r\n <div\r\n ref=\"track\"\r\n class=\"tao-carousel__track\"\r\n :class=\"{ 'tao-carousel__track--dragging': dragging }\"\r\n role=\"region\"\r\n :aria-label=\"ariaLabel\"\r\n tabindex=\"0\"\r\n @scroll=\"onScroll\"\r\n @keydown=\"onKeydown\"\r\n @pointerdown=\"onPointerDown\"\r\n @pointermove=\"onPointerMove\"\r\n @pointerup=\"onPointerEnd\"\r\n @pointercancel=\"onPointerEnd\"\r\n @lostpointercapture=\"onLostPointerCapture\"\r\n @click.capture=\"onClickCapture\"\r\n >\r\n <slot />\r\n </div>\r\n\r\n <slot name=\"next\" :disabled=\"atEnd\" :go=\"goNext\">\r\n <button\r\n v-if=\"showControls\"\r\n type=\"button\"\r\n class=\"tao-carousel__nav\"\r\n :aria-label=\"nextLabel\"\r\n :disabled=\"atEnd\"\r\n @click=\"goNext\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"next-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M9.5 5 16 12l-6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n </slot>\r\n </div>\r\n\r\n <slot name=\"dots\" :index=\"index\" :count=\"snapCount\" :go=\"goTo\">\r\n <div v-if=\"showDots\" class=\"tao-carousel__dots\" role=\"group\" :aria-label=\"dotsLabel\">\r\n <button\r\n v-for=\"n in snapCount\"\r\n :key=\"n\"\r\n type=\"button\"\r\n class=\"tao-carousel__dot\"\r\n :class=\"{ 'tao-carousel__dot--active': n - 1 === index }\"\r\n :aria-label=\"slideLabel.replace('{n}', String(n)).replace('{count}', String(snapCount))\"\r\n :aria-current=\"n - 1 === index ? 'true' : undefined\"\r\n @click=\"goTo(n - 1)\"\r\n >\r\n <slot name=\"dot\" :active=\"n - 1 === index\" :index=\"n - 1\" :go=\"() => goTo(n - 1)\">\r\n <span class=\"tao-carousel__pip\" />\r\n </slot>\r\n </button>\r\n </div>\r\n </slot>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-carousel {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n}\r\n\r\n.tao-carousel__row {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n}\r\n\r\n.tao-carousel__track {\r\n display: flex;\r\n flex: 1 1 auto;\r\n gap: var(--tao-space-3);\r\n min-width: 0;\r\n overflow-x: auto;\r\n overscroll-behavior-x: contain;\r\n scroll-snap-type: x mandatory;\r\n scroll-padding-inline: 0;\r\n scrollbar-width: none;\r\n user-select: none;\r\n touch-action: pan-x;\r\n cursor: grab;\r\n}\r\n\r\n.tao-carousel__track::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.tao-carousel__track--dragging {\r\n scroll-snap-type: none;\r\n cursor: grabbing;\r\n}\r\n\r\n.tao-carousel__track:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-carousel__track > :deep(*) {\r\n box-sizing: border-box;\r\n flex: 0 0 auto;\r\n width: max(\r\n 96px,\r\n calc(\r\n (100% - var(--tao-carousel-peek, 0px) - (var(--tao-carousel-per-view, 1) - 1) * var(--tao-space-3)) /\r\n var(--tao-carousel-per-view, 1)\r\n )\r\n );\r\n min-width: 0;\r\n scroll-snap-align: start;\r\n}\r\n\r\n.tao-carousel__nav {\r\n display: inline-flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n height: 36px;\r\n margin: 0;\r\n padding: 0;\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-full);\r\n background: var(--tao-color-surface-sunken);\r\n color: var(--tao-color-text);\r\n font: inherit;\r\n font-size: 0;\r\n line-height: 0;\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-carousel__nav svg {\r\n display: block;\r\n}\r\n\r\n.tao-carousel__nav:hover:not(:disabled) {\r\n background: var(--tao-color-surface-hover);\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-carousel__nav:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-carousel__nav:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-carousel__dots {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 2px;\r\n}\r\n\r\n.tao-carousel__dot {\r\n display: inline-flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n margin: 0;\r\n padding: 0;\r\n border: 0;\r\n background: transparent;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-carousel__pip {\r\n display: block;\r\n width: 6px;\r\n height: 6px;\r\n border-radius: var(--tao-radius-full);\r\n background: var(--tao-color-border-strong);\r\n transition: width var(--tao-duration-base) var(--tao-ease-base), background var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-carousel__dot--active .tao-carousel__pip {\r\n width: 18px;\r\n background: var(--tao-color-accent);\r\n}\r\n\r\n.tao-carousel__dot:hover:not(.tao-carousel__dot--active) .tao-carousel__pip {\r\n background: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-carousel__dot:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n border-radius: var(--tao-radius-full);\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .tao-carousel__track {\r\n scroll-behavior: auto;\r\n }\r\n\r\n .tao-carousel__pip {\r\n transition: none;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport type { TaoStageItem, TaoStageStatus } from '../stage';\r\n\r\ndefineOptions({ name: 'TaoStages' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n items?: TaoStageItem[];\r\n vertical?: boolean;\r\n ariaLabel?: string;\r\n statusLabels?: Partial<Record<TaoStageStatus, string>>;\r\n }>(),\r\n {\r\n items: () => [],\r\n vertical: true,\r\n ariaLabel: 'Стадии',\r\n statusLabels: () => ({}),\r\n },\r\n);\r\n\r\ndefineSlots<{\r\n default(props: { item: TaoStageItem; index: number; status: TaoStageStatus }): unknown;\r\n icon(props: { item: TaoStageItem; index: number; status: TaoStageStatus }): unknown;\r\n}>();\r\n\r\nconst fallbackStatusText: Record<TaoStageStatus, string> = {\r\n wait: 'ожидание',\r\n work: 'в работе',\r\n ok: 'готово',\r\n bad: 'ошибка',\r\n};\r\n\r\nfunction statusOf(item: TaoStageItem): TaoStageStatus {\r\n if (item.status === 'danger') {\r\n return 'bad';\r\n }\r\n return item.status ?? 'wait';\r\n}\r\n\r\nfunction itemLabel(item: TaoStageItem): string {\r\n const status = statusOf(item);\r\n return `${item.label ?? item.key}, ${props.statusLabels[status] ?? fallbackStatusText[status]}`;\r\n}\r\n</script>\r\n\r\n<template>\r\n <ul\r\n class=\"tao-stages\"\r\n :class=\"{ 'tao-stages--horizontal': !props.vertical }\"\r\n :aria-label=\"ariaLabel\"\r\n >\r\n <li\r\n v-for=\"(item, index) in items\"\r\n :key=\"item.key\"\r\n class=\"tao-stages__item\"\r\n :class=\"`tao-stages__item--${statusOf(item)}`\"\r\n :aria-label=\"itemLabel(item)\"\r\n >\r\n <span class=\"tao-stages__ico\" aria-hidden=\"true\">\r\n <slot name=\"icon\" :item=\"item\" :index=\"index\" :status=\"statusOf(item)\">\r\n <svg v-if=\"statusOf(item) === 'ok'\" class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M3.5 8.5 6.5 11.5 12.5 4.5\"\r\n />\r\n </svg>\r\n <svg v-else-if=\"statusOf(item) === 'bad'\" class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.8\"\r\n stroke-linecap=\"round\"\r\n d=\"M4.5 4.5 11.5 11.5M11.5 4.5 4.5 11.5\"\r\n />\r\n </svg>\r\n <svg v-else-if=\"statusOf(item) === 'work'\" class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\r\n <circle cx=\"8\" cy=\"8\" r=\"5.2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-dasharray=\"20 10\" stroke-linecap=\"round\" />\r\n </svg>\r\n <svg v-else class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\r\n <circle cx=\"8\" cy=\"8\" r=\"5.2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n </svg>\r\n </slot>\r\n </span>\r\n <span class=\"tao-stages__label\">\r\n <slot :item=\"item\" :index=\"index\" :status=\"statusOf(item)\">{{ item.label ?? item.key }}</slot>\r\n </span>\r\n </li>\r\n </ul>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-stages {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-2);\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-stages--horizontal {\r\n flex-direction: row;\r\n flex-wrap: wrap;\r\n column-gap: var(--tao-space-4);\r\n}\r\n\r\n.tao-stages__item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n min-width: 0;\r\n}\r\n\r\n.tao-stages__ico {\r\n display: inline-flex;\r\n flex: 0 0 auto;\r\n color: inherit;\r\n}\r\n\r\n.tao-stages__mark {\r\n display: block;\r\n}\r\n\r\n.tao-stages__label {\r\n min-width: 0;\r\n}\r\n\r\n.tao-stages__item--wait {\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-stages__item--work .tao-stages__ico {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-stages__item--ok .tao-stages__ico {\r\n color: var(--tao-color-success);\r\n}\r\n\r\n.tao-stages__item--bad .tao-stages__ico {\r\n color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-stages__item--work .tao-stages__mark {\r\n animation: tao-stages-spin 1.1s linear infinite;\r\n}\r\n\r\n@keyframes tao-stages-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .tao-stages__item--work .tao-stages__mark {\r\n animation: none;\r\n }\r\n}\r\n</style>\r\n","import { computed, ref } from 'vue';\r\nimport type { TaoToastDefaults, TaoToastPosition, TaoToastRecord } from './types';\r\n\r\nexport const TOAST_POSITIONS: TaoToastPosition[] = [\r\n 'topRight',\r\n 'topLeft',\r\n 'topCenter',\r\n 'bottomRight',\r\n 'bottomLeft',\r\n 'bottomCenter',\r\n 'center',\r\n];\r\n\r\nexport const toastDefaults: TaoToastDefaults = {\r\n position: 'topCenter',\r\n timeout: 3000,\r\n closable: true,\r\n progress: true,\r\n closeLabel: 'Закрыть уведомление',\r\n};\r\n\r\nexport const toasts = ref<TaoToastRecord[]>([]);\r\n\r\nexport const toastsByPosition = computed(() => {\r\n const grouped = {} as Record<TaoToastPosition, TaoToastRecord[]>;\r\n\r\n for (const position of TOAST_POSITIONS) {\r\n grouped[position] = [];\r\n }\r\n\r\n for (const toast of toasts.value) {\r\n grouped[toast.position].push(toast);\r\n }\r\n\r\n return grouped;\r\n});\r\n\r\nexport function configureToastDefaults(partial: Partial<TaoToastDefaults>) {\r\n Object.assign(toastDefaults, partial);\r\n}\r\n\r\nexport function addToast(record: TaoToastRecord) {\r\n if (record.displayMode === 'once' && record.dedupeId) {\r\n const exists = toasts.value.some((item) => item.dedupeId === record.dedupeId);\r\n if (exists) {\r\n return;\r\n }\r\n }\r\n\r\n if (record.displayMode === 'replace' && record.dedupeId) {\r\n toasts.value = toasts.value.filter((item) => item.dedupeId !== record.dedupeId);\r\n }\r\n\r\n toasts.value = [...toasts.value, record];\r\n}\r\n\r\nexport function removeToast(id: string) {\r\n const item = toasts.value.find((toast) => toast.id === id);\r\n if (!item) {\r\n return;\r\n }\r\n\r\n toasts.value = toasts.value.filter((toast) => toast.id !== id);\r\n item.onClosed?.();\r\n}\r\n\r\nexport function dismissToasts(id?: string) {\r\n if (id) {\r\n removeToast(id);\r\n return;\r\n }\r\n\r\n const items = toasts.value;\r\n toasts.value = [];\r\n items.forEach((item) => item.onClosed?.());\r\n}\r\n\r\nlet viewportMounts = 0;\r\n\r\nexport function registerToastViewport() {\r\n viewportMounts += 1;\r\n}\r\n\r\nexport function unregisterToastViewport() {\r\n viewportMounts = Math.max(0, viewportMounts - 1);\r\n}\r\n\r\nexport function hasToastViewport() {\r\n if (viewportMounts > 0) {\r\n return true;\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n return Boolean(document.querySelector('[data-tao-toast-viewport]'));\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { onBeforeUnmount, onMounted, ref } from 'vue';\r\nimport TaoButton from './TaoButton.vue';\r\nimport TaoIcon from './TaoIcon.vue';\r\nimport { listenFocusLoss } from '../focusLoss';\r\nimport { removeToast, toastDefaults } from '../toast/store';\r\nimport type { TaoToastRecord } from '../toast/types';\r\n\r\ndefineOptions({ name: 'TaoToastItem' });\r\n\r\nconst props = defineProps<{\r\n toast: TaoToastRecord;\r\n}>();\r\n\r\nconst paused = ref(false);\r\nlet remaining = props.toast.timeout;\r\nlet startedAt = 0;\r\nlet timer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nfunction clearTimer() {\r\n if (timer !== null) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n}\r\n\r\nfunction startTimer() {\r\n if (!props.toast.timeout) {\r\n return;\r\n }\r\n\r\n startedAt = Date.now();\r\n clearTimer();\r\n timer = setTimeout(() => removeToast(props.toast.id), remaining);\r\n}\r\n\r\nfunction pause() {\r\n if (paused.value || !props.toast.timeout) {\r\n return;\r\n }\r\n\r\n remaining = Math.max(0, remaining - (Date.now() - startedAt));\r\n paused.value = true;\r\n clearTimer();\r\n}\r\n\r\nfunction resume() {\r\n if (!paused.value || !props.toast.timeout) {\r\n return;\r\n }\r\n\r\n paused.value = false;\r\n startTimer();\r\n}\r\n\r\nfunction close() {\r\n clearTimer();\r\n removeToast(props.toast.id);\r\n}\r\n\r\nfunction runAction(onClick: () => void) {\r\n onClick();\r\n close();\r\n}\r\n\r\nstartTimer();\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(resume);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n stopFocusLoss?.();\r\n clearTimer();\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-toast\"\r\n :class=\"[`tao-toast--${toast.type}`, { 'tao-toast--paused': paused }]\"\r\n :role=\"toast.type === 'error' || toast.type === 'danger' || toast.type === 'warning' ? 'alert' : 'status'\"\r\n aria-live=\"polite\"\r\n @mouseenter=\"pause\"\r\n @mouseleave=\"resume\"\r\n >\r\n <span class=\"tao-toast__accent\" aria-hidden=\"true\"></span>\r\n\r\n <span class=\"tao-toast__icon\" aria-hidden=\"true\">\r\n <TaoIcon v-if=\"toast.icon\" :name=\"toast.icon\" :size=\"18\" />\r\n <svg v-else-if=\"toast.type === 'success'\" viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\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\" />\r\n </svg>\r\n <svg v-else-if=\"toast.type === 'error' || toast.type === 'danger'\" viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <path d=\"M7 7l6 6M13 7l-6 6\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\r\n </svg>\r\n <svg v-else-if=\"toast.type === 'warning'\" viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\r\n <path d=\"M10 3.5 17.5 16.5H2.5L10 3.5Z\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\" />\r\n <path d=\"M10 8.2v4.2\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\r\n <circle cx=\"10\" cy=\"14.4\" r=\"0.8\" fill=\"currentColor\" />\r\n </svg>\r\n <svg v-else viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <path d=\"M10 9v5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\r\n <circle cx=\"10\" cy=\"6.4\" r=\"0.8\" fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n\r\n <div class=\"tao-toast__body\">\r\n <strong v-if=\"toast.title\" class=\"tao-toast__title\">{{ toast.title }}</strong>\r\n <p v-if=\"toast.message\" class=\"tao-toast__message\">{{ toast.message }}</p>\r\n <div v-if=\"toast.actions.length\" class=\"tao-toast__actions\">\r\n <TaoButton\r\n v-for=\"action in toast.actions\"\r\n :key=\"action.label\"\r\n size=\"small\"\r\n variant=\"secondary\"\r\n @click=\"runAction(action.onClick)\"\r\n >\r\n {{ action.label }}\r\n </TaoButton>\r\n </div>\r\n </div>\r\n\r\n <button\r\n v-if=\"toast.closable\"\r\n type=\"button\"\r\n class=\"tao-toast__close\"\r\n :aria-label=\"toastDefaults.closeLabel\"\r\n @click=\"close\"\r\n >\r\n &times;\r\n </button>\r\n\r\n <span\r\n v-if=\"toast.progress && toast.timeout\"\r\n class=\"tao-toast__progress\"\r\n :style=\"{ animationDuration: `${toast.timeout}ms` }\"\r\n ></span>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-toast {\r\n --tao-toast-tone: var(--tao-color-accent);\r\n\r\n position: relative;\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--tao-space-3);\r\n width: min(470px, calc(100vw - 32px));\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n overflow: hidden;\r\n background: color-mix(in srgb, var(--tao-toast-tone) 8%, var(--tao-color-surface-raised));\r\n color: var(--tao-color-text);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-panel);\r\n box-shadow: var(--tao-shadow-overlay);\r\n pointer-events: auto;\r\n}\r\n\r\n.tao-toast--success {\r\n --tao-toast-tone: var(--tao-color-success);\r\n}\r\n\r\n.tao-toast--error,\r\n.tao-toast--danger {\r\n --tao-toast-tone: var(--tao-color-danger);\r\n}\r\n\r\n.tao-toast--warning {\r\n --tao-toast-tone: var(--tao-color-warning);\r\n}\r\n\r\n.tao-toast--info {\r\n --tao-toast-tone: var(--tao-color-info);\r\n}\r\n\r\n.tao-toast__accent {\r\n position: absolute;\r\n inset: 0 auto 0 0;\r\n width: 3px;\r\n background: var(--tao-toast-tone);\r\n}\r\n\r\n.tao-toast__icon {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n margin-top: 1px;\r\n color: var(--tao-toast-tone);\r\n}\r\n\r\n.tao-toast__body {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n min-width: 0;\r\n flex: 1;\r\n padding-right: var(--tao-space-4);\r\n}\r\n\r\n.tao-toast__title {\r\n font-size: var(--tao-font-size-md);\r\n font-weight: 600;\r\n color: var(--tao-color-text-strong);\r\n line-height: 1.3;\r\n}\r\n\r\n.tao-toast__message {\r\n margin: 0;\r\n font-size: var(--tao-font-size-sm);\r\n line-height: 1.45;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-toast__actions {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--tao-space-2);\r\n margin-top: var(--tao-space-1);\r\n}\r\n\r\n.tao-toast__close {\r\n position: absolute;\r\n top: var(--tao-space-1);\r\n right: var(--tao-space-2);\r\n padding: 0;\r\n border: none;\r\n background: none;\r\n color: var(--tao-color-text-muted);\r\n font-size: 20px;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-toast__close:hover {\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-toast__progress {\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n height: 2px;\r\n transform-origin: left center;\r\n background: var(--tao-toast-tone);\r\n animation-name: tao-toast-progress;\r\n animation-timing-function: linear;\r\n animation-fill-mode: forwards;\r\n}\r\n\r\n.tao-toast--paused .tao-toast__progress {\r\n animation-play-state: paused;\r\n}\r\n\r\n@keyframes tao-toast-progress {\r\n from {\r\n transform: scaleX(1);\r\n }\r\n to {\r\n transform: scaleX(0);\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { onBeforeUnmount, onMounted } from 'vue';\r\nimport TaoToastItem from './TaoToastItem.vue';\r\nimport { registerToastViewport, toastsByPosition, TOAST_POSITIONS, unregisterToastViewport } from '../toast/store';\r\nimport type { TaoToastPosition } from '../toast/types';\r\n\r\ndefineOptions({ name: 'TaoToastViewport' });\r\n\r\nonMounted(() => {\r\n registerToastViewport();\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n unregisterToastViewport();\r\n});\r\n\r\nfunction enterName(position: TaoToastPosition) {\r\n if (position === 'center') {\r\n return 'tao-toast-center';\r\n }\r\n\r\n if (position.startsWith('top')) {\r\n return 'tao-toast-top';\r\n }\r\n\r\n return 'tao-toast-bottom';\r\n}\r\n</script>\r\n\r\n<template>\r\n <Teleport to=\"body\">\r\n <div\r\n v-for=\"position in TOAST_POSITIONS\"\r\n :key=\"position\"\r\n class=\"tao-toast-viewport\"\r\n :class=\"`tao-toast-viewport--${position}`\"\r\n data-tao-toast-viewport\r\n >\r\n <TransitionGroup :name=\"enterName(position)\" tag=\"div\" class=\"tao-toast-viewport__stack\">\r\n <div v-for=\"item in toastsByPosition[position]\" :key=\"item.id\" class=\"tao-toast-slot\">\r\n <div class=\"tao-toast-slot__inner\">\r\n <TaoToastItem :toast=\"item\" />\r\n </div>\r\n </div>\r\n </TransitionGroup>\r\n </div>\r\n </Teleport>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-toast-viewport {\r\n position: fixed;\r\n z-index: 1100;\r\n display: flex;\r\n pointer-events: none;\r\n padding: var(--tao-space-4);\r\n}\r\n\r\n.tao-toast-viewport__stack {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n}\r\n\r\n.tao-toast-slot {\r\n display: grid;\r\n grid-template-rows: 1fr;\r\n}\r\n\r\n.tao-toast-slot__inner {\r\n min-height: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.tao-toast-viewport--topRight {\r\n top: 0;\r\n right: 0;\r\n align-items: flex-end;\r\n}\r\n\r\n.tao-toast-viewport--topLeft {\r\n top: 0;\r\n left: 0;\r\n align-items: flex-start;\r\n}\r\n\r\n.tao-toast-viewport--topCenter {\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n justify-content: center;\r\n}\r\n\r\n.tao-toast-viewport--bottomRight {\r\n right: 0;\r\n bottom: 0;\r\n align-items: flex-end;\r\n}\r\n\r\n.tao-toast-viewport--bottomRight .tao-toast-viewport__stack,\r\n.tao-toast-viewport--bottomLeft .tao-toast-viewport__stack,\r\n.tao-toast-viewport--bottomCenter .tao-toast-viewport__stack {\r\n flex-direction: column-reverse;\r\n}\r\n\r\n.tao-toast-viewport--bottomLeft {\r\n left: 0;\r\n bottom: 0;\r\n align-items: flex-start;\r\n}\r\n\r\n.tao-toast-viewport--bottomCenter {\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n justify-content: center;\r\n}\r\n\r\n.tao-toast-viewport--center {\r\n inset: 0;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n\r\n.tao-toast-top-enter-active,\r\n.tao-toast-bottom-enter-active,\r\n.tao-toast-center-enter-active {\r\n animation: tao-toast-bounce-in var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-toast-top-leave-active,\r\n.tao-toast-bottom-leave-active,\r\n.tao-toast-center-leave-active {\r\n pointer-events: none;\r\n overflow: hidden;\r\n transition: grid-template-rows var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-toast-top-leave-from,\r\n.tao-toast-bottom-leave-from,\r\n.tao-toast-center-leave-from {\r\n grid-template-rows: 1fr;\r\n}\r\n\r\n.tao-toast-top-leave-to,\r\n.tao-toast-bottom-leave-to,\r\n.tao-toast-center-leave-to {\r\n grid-template-rows: 0fr;\r\n}\r\n\r\n.tao-toast-top-leave-active .tao-toast-slot__inner,\r\n.tao-toast-center-leave-active .tao-toast-slot__inner {\r\n animation: tao-toast-fade-out-up var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-toast-bottom-leave-active .tao-toast-slot__inner {\r\n animation: tao-toast-fade-out-down var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n@keyframes tao-toast-bounce-in {\r\n 0% {\r\n opacity: 0;\r\n transform: translateY(18px) scale(0.96);\r\n }\r\n 60% {\r\n opacity: 1;\r\n transform: translateY(-4px) scale(1.02);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n}\r\n\r\n@keyframes tao-toast-fade-out-up {\r\n to {\r\n opacity: 0;\r\n transform: translateY(-8px) scale(0.98);\r\n }\r\n}\r\n\r\n@keyframes tao-toast-fade-out-down {\r\n to {\r\n opacity: 0;\r\n transform: translateY(8px) scale(0.98);\r\n }\r\n}\r\n</style>\r\n","import { ref } from 'vue';\r\nimport type { TaoConfirmDefaults, TaoConfirmRecord } from './types';\r\n\r\nexport const confirmDefaults: TaoConfirmDefaults = {\r\n ok: 'ОК',\r\n cancel: 'Отмена',\r\n};\r\n\r\nexport const currentConfirm = ref<TaoConfirmRecord | null>(null);\r\n\r\nconst queue: TaoConfirmRecord[] = [];\r\n\r\nexport function configureConfirmDefaults(partial: Partial<TaoConfirmDefaults>) {\r\n Object.assign(confirmDefaults, partial);\r\n}\r\n\r\nfunction pump() {\r\n if (currentConfirm.value) {\r\n return;\r\n }\r\n\r\n currentConfirm.value = queue.shift() ?? null;\r\n}\r\n\r\nexport function enqueueConfirm(record: TaoConfirmRecord) {\r\n queue.push(record);\r\n pump();\r\n}\r\n\r\nexport function resolveConfirm(value: boolean) {\r\n const item = currentConfirm.value;\r\n if (!item) {\r\n return;\r\n }\r\n\r\n currentConfirm.value = null;\r\n item.resolve(value);\r\n pump();\r\n}\r\n\r\nlet viewportMounts = 0;\r\n\r\nexport function registerConfirmHost() {\r\n viewportMounts += 1;\r\n}\r\n\r\nexport function unregisterConfirmHost() {\r\n viewportMounts = Math.max(0, viewportMounts - 1);\r\n}\r\n\r\nexport function hasConfirmHost() {\r\n if (viewportMounts > 0) {\r\n return true;\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n return Boolean(document.querySelector('[data-tao-confirm-host]'));\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\r\nimport TaoButton from './TaoButton.vue';\r\nimport { currentConfirm, registerConfirmHost, resolveConfirm, unregisterConfirmHost } from '../confirm/store';\r\nimport { trapTab } from '../focusTrap';\r\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\r\n\r\ndefineOptions({ name: 'TaoConfirmHost' });\r\n\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nlet previousFocus: HTMLElement | null = null;\r\nlet scrollHeld = false;\r\n\r\nonMounted(() => {\r\n registerConfirmHost();\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n releaseScroll();\r\n unregisterConfirmHost();\r\n});\r\n\r\nwatch(\r\n () => currentConfirm.value?.id,\r\n async (id) => {\r\n if (!id) {\r\n releaseScroll();\r\n restoreFocus();\r\n return;\r\n }\r\n\r\n if (!isBrowser()) {\r\n return;\r\n }\r\n\r\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\r\n holdScroll();\r\n await nextTick();\r\n queryButton(currentConfirm.value?.danger ? 'cancel' : 'ok')?.focus();\r\n },\r\n);\r\n\r\nfunction queryButton(which: 'ok' | 'cancel') {\r\n return panelRef.value?.querySelector<HTMLButtonElement>(`[data-tao-confirm-${which}]`) ?? null;\r\n}\r\n\r\nfunction holdScroll() {\r\n if (scrollHeld || !isBrowser()) {\r\n return;\r\n }\r\n lockBodyScroll();\r\n scrollHeld = true;\r\n}\r\n\r\nfunction releaseScroll() {\r\n if (!scrollHeld) {\r\n return;\r\n }\r\n unlockBodyScroll();\r\n scrollHeld = false;\r\n}\r\n\r\nfunction restoreFocus() {\r\n previousFocus?.focus?.();\r\n previousFocus = null;\r\n}\r\n\r\nfunction answer(value: boolean) {\r\n resolveConfirm(value);\r\n}\r\n\r\nfunction onOverlayClick() {\r\n answer(false);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n answer(false);\r\n return;\r\n }\r\n\r\n if (panelRef.value) {\r\n trapTab(event, panelRef.value);\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <Teleport to=\"body\">\r\n <Transition name=\"tao-confirm\">\r\n <div\r\n v-if=\"currentConfirm\"\r\n class=\"tao-confirm\"\r\n data-tao-confirm-host\r\n @keydown=\"onKeydown\"\r\n >\r\n <div class=\"tao-confirm__overlay\" @click=\"onOverlayClick\"></div>\r\n\r\n <div\r\n ref=\"panelRef\"\r\n class=\"tao-confirm__panel\"\r\n :class=\"{ 'tao-confirm__panel--danger': currentConfirm.danger }\"\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n :aria-labelledby=\"currentConfirm.title ? 'tao-confirm-title' : undefined\"\r\n :aria-describedby=\"currentConfirm.message ? 'tao-confirm-message' : undefined\"\r\n tabindex=\"-1\"\r\n >\r\n <span class=\"tao-confirm__accent\" aria-hidden=\"true\"></span>\r\n\r\n <span class=\"tao-confirm__icon\" aria-hidden=\"true\">\r\n <svg v-if=\"currentConfirm.danger\" viewBox=\"0 0 20 20\" width=\"22\" height=\"22\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <path d=\"M7 7l6 6M13 7l-6 6\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\r\n </svg>\r\n <svg v-else viewBox=\"0 0 20 20\" width=\"22\" height=\"22\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <path d=\"M10 9v5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\r\n <circle cx=\"10\" cy=\"6.4\" r=\"0.8\" fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n\r\n <div class=\"tao-confirm__body\">\r\n <h2 v-if=\"currentConfirm.title\" id=\"tao-confirm-title\" class=\"tao-confirm__title\">\r\n {{ currentConfirm.title }}\r\n </h2>\r\n <p v-if=\"currentConfirm.message\" id=\"tao-confirm-message\" class=\"tao-confirm__message\">\r\n {{ currentConfirm.message }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"tao-confirm__actions\">\r\n <TaoButton data-tao-confirm-cancel variant=\"secondary\" @click=\"answer(false)\">\r\n {{ currentConfirm.cancelLabel }}\r\n </TaoButton>\r\n <TaoButton\r\n data-tao-confirm-ok\r\n :variant=\"currentConfirm.danger ? 'danger' : 'primary'\"\r\n @click=\"answer(true)\"\r\n >\r\n {{ currentConfirm.okLabel }}\r\n </TaoButton>\r\n </div>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-confirm {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 1200;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--tao-space-5);\r\n}\r\n\r\n.tao-confirm__overlay {\r\n position: absolute;\r\n inset: 0;\r\n background: var(--tao-color-overlay);\r\n}\r\n\r\n.tao-confirm__panel {\r\n --tao-confirm-tone: var(--tao-color-warning);\r\n\r\n position: relative;\r\n z-index: 1;\r\n display: grid;\r\n grid-template-columns: auto 1fr;\r\n grid-template-areas:\r\n \"icon body\"\r\n \"actions actions\";\r\n gap: var(--tao-space-3) var(--tao-space-4);\r\n width: min(420px, 100%);\r\n padding: var(--tao-space-5);\r\n background: color-mix(in srgb, var(--tao-confirm-tone) 8%, var(--tao-color-surface-raised));\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-panel);\r\n box-shadow: var(--tao-shadow-overlay);\r\n outline: none;\r\n}\r\n\r\n.tao-confirm__panel--danger {\r\n --tao-confirm-tone: var(--tao-color-danger);\r\n}\r\n\r\n.tao-confirm__accent {\r\n position: absolute;\r\n inset: 0 auto 0 0;\r\n width: 3px;\r\n background: var(--tao-confirm-tone);\r\n}\r\n\r\n.tao-confirm__icon {\r\n grid-area: icon;\r\n display: inline-flex;\r\n margin-top: 2px;\r\n color: var(--tao-confirm-tone);\r\n}\r\n\r\n.tao-confirm__body {\r\n grid-area: body;\r\n min-width: 0;\r\n}\r\n\r\n.tao-confirm__title {\r\n margin: 0;\r\n font-size: var(--tao-font-size-lg);\r\n font-weight: 600;\r\n line-height: 1.3;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-confirm__message {\r\n margin: var(--tao-space-2) 0 0;\r\n font-size: var(--tao-font-size-md);\r\n line-height: 1.45;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-confirm__actions {\r\n grid-area: actions;\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: var(--tao-space-3);\r\n margin-top: var(--tao-space-1);\r\n}\r\n\r\n.tao-confirm-enter-active .tao-confirm__overlay,\r\n.tao-confirm-leave-active .tao-confirm__overlay {\r\n transition: opacity var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-confirm-enter-from .tao-confirm__overlay,\r\n.tao-confirm-leave-to .tao-confirm__overlay {\r\n opacity: 0;\r\n}\r\n\r\n.tao-confirm-enter-active .tao-confirm__panel {\r\n animation: tao-confirm-bounce-in var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-confirm-leave-active .tao-confirm__panel {\r\n animation: tao-confirm-fade-out var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n@keyframes tao-confirm-bounce-in {\r\n 0% {\r\n opacity: 0;\r\n transform: translateY(18px) scale(0.96);\r\n }\r\n 60% {\r\n opacity: 1;\r\n transform: translateY(-4px) scale(1.02);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n}\r\n\r\n@keyframes tao-confirm-fade-out {\r\n to {\r\n opacity: 0;\r\n transform: translateY(10px);\r\n }\r\n}\r\n</style>\r\n","import { createApp } from 'vue';\r\nimport TaoToastViewport from '../components/TaoToastViewport.vue';\r\nimport { addToast, configureToastDefaults, dismissToasts, hasToastViewport, toastDefaults } from './store';\r\nimport type {\r\n TaoToastAction,\r\n TaoToastDefaults,\r\n TaoToastDisplayMode,\r\n TaoToastPosition,\r\n TaoToastRecord,\r\n TaoToastShortcutOptions,\r\n TaoToastType,\r\n} from './types';\r\n\r\nexport type {\r\n TaoToastAction,\r\n TaoToastDefaults,\r\n TaoToastDisplayMode,\r\n TaoToastPosition,\r\n TaoToastRecord,\r\n TaoToastShortcutOptions,\r\n TaoToastType,\r\n};\r\n\r\nconst TYPE_TIMEOUT: Record<TaoToastType, number> = {\r\n success: 3000,\r\n error: 5000,\r\n danger: 5000,\r\n warning: 4000,\r\n info: 3000,\r\n neutral: 2500,\r\n};\r\n\r\ninterface Draft {\r\n type: TaoToastType;\r\n title: string;\r\n message: string;\r\n icon: string;\r\n timeout: number;\r\n position: TaoToastPosition;\r\n closable: boolean;\r\n progress: boolean;\r\n displayMode?: TaoToastDisplayMode;\r\n dedupeId?: string;\r\n actions: TaoToastAction[];\r\n onClosed?: () => void;\r\n}\r\n\r\nfunction isClient() {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\nfunction nextToastId() {\r\n return `tao-toast-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\r\n}\r\n\r\nlet hostedApp: ReturnType<typeof createApp> | null = null;\r\n\r\nfunction ensureToastViewport() {\r\n if (!isClient() || hasToastViewport()) {\r\n return;\r\n }\r\n\r\n const host = document.createElement('div');\r\n host.setAttribute('data-tao-toast-host', '');\r\n document.body.appendChild(host);\r\n hostedApp = createApp(TaoToastViewport);\r\n hostedApp.mount(host);\r\n}\r\n\r\nfunction flushDraft(draft: Draft) {\r\n if (!isClient()) {\r\n return;\r\n }\r\n\r\n if (!draft.title && !draft.message) {\r\n return;\r\n }\r\n\r\n const dedupeId =\r\n draft.dedupeId ??\r\n (draft.displayMode ? `${draft.type}:${draft.title}:${draft.message}` : undefined);\r\n\r\n ensureToastViewport();\r\n\r\n addToast({\r\n id: nextToastId(),\r\n type: draft.type,\r\n title: draft.title,\r\n message: draft.message,\r\n icon: draft.icon,\r\n timeout: draft.timeout,\r\n position: draft.position,\r\n closable: draft.closable,\r\n progress: draft.progress,\r\n displayMode: draft.displayMode,\r\n dedupeId,\r\n actions: draft.actions,\r\n onClosed: draft.onClosed,\r\n });\r\n}\r\n\r\nfunction createDraft(): Draft {\r\n return {\r\n type: 'info',\r\n title: '',\r\n message: '',\r\n icon: '',\r\n timeout: toastDefaults.timeout,\r\n position: toastDefaults.position,\r\n closable: toastDefaults.closable,\r\n progress: toastDefaults.progress,\r\n actions: [],\r\n };\r\n}\r\n\r\nexport interface TaoToastBuilder {\r\n success(): TaoToastBuilder;\r\n error(): TaoToastBuilder;\r\n danger(): TaoToastBuilder;\r\n warning(): TaoToastBuilder;\r\n info(): TaoToastBuilder;\r\n show(): TaoToastBuilder;\r\n short(): TaoToastBuilder;\r\n timeout(ms: number): TaoToastBuilder;\r\n title(value: string): TaoToastBuilder;\r\n message(value: string): TaoToastBuilder;\r\n icon(name: string): TaoToastBuilder;\r\n position(value: TaoToastPosition): TaoToastBuilder;\r\n byCenter(): TaoToastBuilder;\r\n byTopLeft(): TaoToastBuilder;\r\n byTopRight(): TaoToastBuilder;\r\n byTopCenter(): TaoToastBuilder;\r\n byBottomLeft(): TaoToastBuilder;\r\n byBottomRight(): TaoToastBuilder;\r\n byBottomCenter(): TaoToastBuilder;\r\n closable(value?: boolean): TaoToastBuilder;\r\n progress(value?: boolean): TaoToastBuilder;\r\n id(value: string): TaoToastBuilder;\r\n once(): TaoToastBuilder;\r\n replace(): TaoToastBuilder;\r\n action(label: string, onClick: () => void): TaoToastBuilder;\r\n onClosed(fn: () => void): TaoToastBuilder;\r\n}\r\n\r\nfunction createBuilder(): TaoToastBuilder {\r\n const draft = createDraft();\r\n\r\n const ctx: TaoToastBuilder = {\r\n success() {\r\n draft.type = 'success';\r\n draft.timeout = TYPE_TIMEOUT.success;\r\n return ctx;\r\n },\r\n error() {\r\n draft.type = 'error';\r\n draft.timeout = TYPE_TIMEOUT.error;\r\n return ctx;\r\n },\r\n danger() {\r\n draft.type = 'danger';\r\n draft.timeout = TYPE_TIMEOUT.danger;\r\n return ctx;\r\n },\r\n warning() {\r\n draft.type = 'warning';\r\n draft.timeout = TYPE_TIMEOUT.warning;\r\n return ctx;\r\n },\r\n info() {\r\n draft.type = 'info';\r\n draft.timeout = TYPE_TIMEOUT.info;\r\n return ctx;\r\n },\r\n show() {\r\n draft.type = 'neutral';\r\n draft.timeout = TYPE_TIMEOUT.neutral;\r\n return ctx;\r\n },\r\n short() {\r\n draft.timeout = 1000;\r\n return ctx;\r\n },\r\n timeout(ms: number) {\r\n draft.timeout = ms;\r\n return ctx;\r\n },\r\n title(value: string) {\r\n draft.title = value;\r\n return ctx;\r\n },\r\n message(value: string) {\r\n draft.message = String(value);\r\n return ctx;\r\n },\r\n icon(name: string) {\r\n draft.icon = name;\r\n return ctx;\r\n },\r\n position(value: TaoToastPosition) {\r\n draft.position = value;\r\n return ctx;\r\n },\r\n byCenter() {\r\n draft.position = 'center';\r\n return ctx;\r\n },\r\n byTopLeft() {\r\n draft.position = 'topLeft';\r\n return ctx;\r\n },\r\n byTopRight() {\r\n draft.position = 'topRight';\r\n return ctx;\r\n },\r\n byTopCenter() {\r\n draft.position = 'topCenter';\r\n return ctx;\r\n },\r\n byBottomLeft() {\r\n draft.position = 'bottomLeft';\r\n return ctx;\r\n },\r\n byBottomRight() {\r\n draft.position = 'bottomRight';\r\n return ctx;\r\n },\r\n byBottomCenter() {\r\n draft.position = 'bottomCenter';\r\n return ctx;\r\n },\r\n closable(value = true) {\r\n draft.closable = value;\r\n return ctx;\r\n },\r\n progress(value = true) {\r\n draft.progress = value;\r\n return ctx;\r\n },\r\n id(value: string) {\r\n draft.dedupeId = value;\r\n return ctx;\r\n },\r\n once() {\r\n draft.displayMode = 'once';\r\n return ctx;\r\n },\r\n replace() {\r\n draft.displayMode = 'replace';\r\n return ctx;\r\n },\r\n action(label: string, onClick: () => void) {\r\n draft.actions = [...draft.actions, { label, onClick }];\r\n return ctx;\r\n },\r\n onClosed(fn: () => void) {\r\n draft.onClosed = fn;\r\n return ctx;\r\n },\r\n };\r\n\r\n // Тот самый flush: цепочка успевает собрать params в текущем тике.\r\n setTimeout(() => flushDraft(draft), 0);\r\n\r\n return ctx;\r\n}\r\n\r\nfunction shortcut(type: TaoToastType, message: string, options?: TaoToastShortcutOptions) {\r\n const builder = createBuilder();\r\n\r\n if (type === 'neutral') {\r\n builder.show();\r\n } else {\r\n builder[type]();\r\n }\r\n\r\n builder.message(message);\r\n\r\n if (options?.title) {\r\n builder.title(options.title);\r\n }\r\n if (options?.timeout !== undefined) {\r\n builder.timeout(options.timeout);\r\n }\r\n if (options?.position) {\r\n builder.position(options.position);\r\n }\r\n if (options?.icon) {\r\n builder.icon(options.icon);\r\n }\r\n if (options?.closable !== undefined) {\r\n builder.closable(options.closable);\r\n }\r\n if (options?.progress !== undefined) {\r\n builder.progress(options.progress);\r\n }\r\n if (options?.id) {\r\n builder.id(options.id);\r\n }\r\n if (options?.once) {\r\n builder.once();\r\n }\r\n if (options?.replace) {\r\n builder.replace();\r\n }\r\n if (options?.actions) {\r\n options.actions.forEach((action) => builder.action(action.label, action.onClick));\r\n }\r\n if (options?.onClosed) {\r\n builder.onClosed(options.onClosed);\r\n }\r\n\r\n return builder;\r\n}\r\n\r\nexport interface TaoToastApi {\r\n (): TaoToastBuilder;\r\n success(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n error(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n danger(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n warning(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n info(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n show(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n defaults(partial: Partial<TaoToastDefaults>): TaoToastApi;\r\n byTopCenter(): TaoToastApi;\r\n byTopLeft(): TaoToastApi;\r\n byBottomLeft(): TaoToastApi;\r\n byBottomRight(): TaoToastApi;\r\n dismiss(id?: string): void;\r\n}\r\n\r\nexport const toast: TaoToastApi = Object.assign(createBuilder, {\r\n success(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('success', message, options);\r\n },\r\n error(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('error', message, options);\r\n },\r\n danger(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('danger', message, options);\r\n },\r\n warning(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('warning', message, options);\r\n },\r\n info(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('info', message, options);\r\n },\r\n show(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('neutral', message, options);\r\n },\r\n defaults(partial: Partial<TaoToastDefaults>) {\r\n configureToastDefaults(partial);\r\n return toast;\r\n },\r\n byTopCenter() {\r\n configureToastDefaults({ position: 'topCenter' });\r\n return toast;\r\n },\r\n byTopLeft() {\r\n configureToastDefaults({ position: 'topLeft' });\r\n return toast;\r\n },\r\n byBottomLeft() {\r\n configureToastDefaults({ position: 'bottomLeft' });\r\n return toast;\r\n },\r\n byBottomRight() {\r\n configureToastDefaults({ position: 'bottomRight' });\r\n return toast;\r\n },\r\n dismiss(id?: string) {\r\n dismissToasts(id);\r\n },\r\n});\r\n","import { createApp } from 'vue';\r\nimport TaoConfirmHost from '../components/TaoConfirmHost.vue';\r\nimport {\r\n configureConfirmDefaults,\r\n confirmDefaults,\r\n enqueueConfirm,\r\n hasConfirmHost,\r\n resolveConfirm,\r\n} from './store';\r\nimport type { TaoConfirmDefaults, TaoConfirmShortcutOptions } from './types';\r\n\r\nexport type { TaoConfirmDefaults, TaoConfirmRecord, TaoConfirmShortcutOptions } from './types';\r\n\r\ninterface Draft {\r\n title: string;\r\n message: string;\r\n okLabel: string;\r\n cancelLabel: string;\r\n danger: boolean;\r\n}\r\n\r\nfunction isClient() {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\nfunction nextConfirmId() {\r\n return `tao-confirm-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\r\n}\r\n\r\nlet hostedApp: ReturnType<typeof createApp> | null = null;\r\n\r\nfunction ensureConfirmHost() {\r\n if (!isClient() || hasConfirmHost()) {\r\n return;\r\n }\r\n\r\n const host = document.createElement('div');\r\n host.setAttribute('data-tao-confirm-root', '');\r\n document.body.appendChild(host);\r\n hostedApp = createApp(TaoConfirmHost);\r\n hostedApp.mount(host);\r\n}\r\n\r\nfunction createDraft(): Draft {\r\n return {\r\n title: '',\r\n message: '',\r\n okLabel: confirmDefaults.ok,\r\n cancelLabel: confirmDefaults.cancel,\r\n danger: false,\r\n };\r\n}\r\n\r\nexport interface TaoConfirmBuilder extends PromiseLike<boolean> {\r\n title(value: string): TaoConfirmBuilder;\r\n message(value: string): TaoConfirmBuilder;\r\n ok(label: string): TaoConfirmBuilder;\r\n cancel(label: string): TaoConfirmBuilder;\r\n danger(value?: boolean): TaoConfirmBuilder;\r\n}\r\n\r\nfunction createBuilder(): TaoConfirmBuilder {\r\n const draft = createDraft();\r\n let settle: (value: boolean) => void = () => undefined;\r\n const promise = new Promise<boolean>((resolve) => {\r\n settle = resolve;\r\n });\r\n\r\n const ctx: TaoConfirmBuilder = {\r\n title(value: string) {\r\n draft.title = value;\r\n return ctx;\r\n },\r\n message(value: string) {\r\n draft.message = String(value);\r\n return ctx;\r\n },\r\n ok(label: string) {\r\n draft.okLabel = label;\r\n return ctx;\r\n },\r\n cancel(label: string) {\r\n draft.cancelLabel = label;\r\n return ctx;\r\n },\r\n danger(value = true) {\r\n draft.danger = value;\r\n return ctx;\r\n },\r\n then(onFulfilled, onRejected) {\r\n return promise.then(onFulfilled, onRejected);\r\n },\r\n };\r\n\r\n // Тот же flush, что у toast: цепочка собирает params, тик позже — показ.\r\n setTimeout(() => {\r\n if (!isClient() || (!draft.title && !draft.message)) {\r\n settle(false);\r\n return;\r\n }\r\n\r\n ensureConfirmHost();\r\n enqueueConfirm({\r\n id: nextConfirmId(),\r\n title: draft.title,\r\n message: draft.message,\r\n okLabel: draft.okLabel,\r\n cancelLabel: draft.cancelLabel,\r\n danger: draft.danger,\r\n resolve: settle,\r\n });\r\n }, 0);\r\n\r\n return ctx;\r\n}\r\n\r\nfunction applyOptions(builder: TaoConfirmBuilder, options?: TaoConfirmShortcutOptions) {\r\n if (!options) {\r\n return builder;\r\n }\r\n\r\n if (options.message) {\r\n builder.message(options.message);\r\n }\r\n if (options.ok) {\r\n builder.ok(options.ok);\r\n }\r\n if (options.cancel) {\r\n builder.cancel(options.cancel);\r\n }\r\n if (options.danger) {\r\n builder.danger(true);\r\n }\r\n\r\n return builder;\r\n}\r\n\r\nexport interface TaoConfirmApi {\r\n (): TaoConfirmBuilder;\r\n (title: string, options?: TaoConfirmShortcutOptions): TaoConfirmBuilder;\r\n defaults(partial: Partial<TaoConfirmDefaults>): TaoConfirmApi;\r\n dismiss(): void;\r\n}\r\n\r\nfunction confirmFn(title?: string, options?: TaoConfirmShortcutOptions): TaoConfirmBuilder {\r\n const builder = createBuilder();\r\n\r\n if (title) {\r\n builder.title(title);\r\n }\r\n\r\n return applyOptions(builder, options);\r\n}\r\n\r\nexport const confirm: TaoConfirmApi = Object.assign(confirmFn, {\r\n defaults(partial: Partial<TaoConfirmDefaults>) {\r\n configureConfirmDefaults(partial);\r\n return confirm;\r\n },\r\n dismiss() {\r\n resolveConfirm(false);\r\n },\r\n});\r\n","import type { Plugin } from 'vue';\r\nimport TaoButton from './components/TaoButton.vue';\r\nimport TaoBlock from './components/TaoBlock.vue';\r\nimport TaoInput from './components/TaoInput.vue';\r\nimport TaoInputGroup from './components/TaoInputGroup.vue';\r\nimport TaoInputNumber from './components/TaoInputNumber.vue';\r\nimport TaoQuantity from './components/TaoQuantity.vue';\r\nimport TaoCard from './components/TaoCard.vue';\r\nimport TaoModal from './components/TaoModal.vue';\r\nimport TaoTabs from './components/TaoTabs.vue';\r\nimport TaoTooltip from './components/TaoTooltip.vue';\r\nimport TaoPopover from './components/TaoPopover.vue';\r\nimport TaoSpoiler from './components/TaoSpoiler.vue';\r\nimport TaoSpoilerGroup from './components/TaoSpoilerGroup.vue';\r\nimport TaoCopy from './components/TaoCopy.vue';\r\nimport TaoContainer from './components/TaoContainer.vue';\r\nimport TaoFlex from './components/TaoFlex.vue';\r\nimport TaoSpace from './components/TaoSpace.vue';\r\nimport TaoGrid from './components/TaoGrid.vue';\r\nimport TaoGridItem from './components/TaoGridItem.vue';\r\nimport TaoSplit from './components/TaoSplit.vue';\r\nimport TaoIcon from './components/TaoIcon.vue';\r\nimport TaoLoader from './components/TaoLoader.vue';\r\nimport TaoImage from './components/TaoImage.vue';\r\nimport TaoCheckbox from './components/TaoCheckbox.vue';\r\nimport TaoTag from './components/TaoTag.vue';\r\nimport TaoDivider from './components/TaoDivider.vue';\r\nimport TaoFieldset from './components/TaoFieldset.vue';\r\nimport TaoAnimatedBorder from './components/TaoAnimatedBorder.vue';\r\nimport TaoTextarea from './components/TaoTextarea.vue';\r\nimport TaoScrollTop from './components/TaoScrollTop.vue';\r\nimport TaoProgress from './components/TaoProgress.vue';\r\nimport TaoSlider from './components/TaoSlider.vue';\r\nimport TaoFileDrop from './components/TaoFileDrop.vue';\r\nimport TaoDropdownMenu from './components/TaoDropdownMenu.vue';\r\nimport TaoPinCode from './components/TaoPinCode.vue';\r\nimport TaoLink from './components/TaoLink.vue';\r\nimport TaoFormField from './components/TaoFormField.vue';\r\nimport TaoSelect from './components/TaoSelect.vue';\r\nimport TaoCombobox from './components/TaoCombobox.vue';\r\nimport TaoDate from './components/TaoDate.vue';\r\nimport TaoDateRange from './components/TaoDateRange.vue';\r\nimport TaoSwitch from './components/TaoSwitch.vue';\r\nimport TaoRadio from './components/TaoRadio.vue';\r\nimport TaoRadioGroup from './components/TaoRadioGroup.vue';\r\nimport TaoSegmented from './components/TaoSegmented.vue';\r\nimport TaoSegmentedOption from './components/TaoSegmentedOption.vue';\r\nimport TaoAlert from './components/TaoAlert.vue';\r\nimport TaoTable from './components/TaoTable.vue';\r\nimport TaoPagination from './components/TaoPagination.vue';\r\nimport TaoEmpty from './components/TaoEmpty.vue';\r\nimport TaoList from './components/TaoList.vue';\r\nimport TaoListItem from './components/TaoListItem.vue';\r\nimport TaoSkeleton from './components/TaoSkeleton.vue';\r\nimport TaoDrawer from './components/TaoDrawer.vue';\r\nimport TaoAvatar from './components/TaoAvatar.vue';\r\nimport TaoBreadcrumb from './components/TaoBreadcrumb.vue';\r\nimport TaoCounter from './components/TaoCounter.vue';\r\nimport TaoCarousel from './components/TaoCarousel.vue';\r\nimport TaoStages from './components/TaoStages.vue';\r\nimport TaoToastViewport from './components/TaoToastViewport.vue';\r\nimport TaoConfirmHost from './components/TaoConfirmHost.vue';\r\nimport { toast } from './toast';\r\nimport { confirm } from './confirm';\r\n\r\n// Импорт нужен только для того, чтобы Vite подхватил CSS в сборку\r\n// styles.css. Сам JS-бандл эти стили в рантайме НЕ применяет —\r\n// подключи '@1337exp/taoui/styles.css' самостоятельно (см. README), чтобы\r\n// иметь явный контроль над темизацией.\r\nimport './styles/index.css';\r\n\r\nconst components = [\r\n TaoButton,\r\n TaoBlock,\r\n TaoInput,\r\n TaoInputGroup,\r\n TaoInputNumber,\r\n TaoQuantity,\r\n TaoCard,\r\n TaoModal,\r\n TaoTabs,\r\n TaoTooltip,\r\n TaoPopover,\r\n TaoSpoiler,\r\n TaoSpoilerGroup,\r\n TaoCopy,\r\n TaoContainer,\r\n TaoFlex,\r\n TaoSpace,\r\n TaoGrid,\r\n TaoGridItem,\r\n TaoSplit,\r\n TaoIcon,\r\n TaoLoader,\r\n TaoImage,\r\n TaoCheckbox,\r\n TaoTag,\r\n TaoDivider,\r\n TaoFieldset,\r\n TaoAnimatedBorder,\r\n TaoTextarea,\r\n TaoScrollTop,\r\n TaoProgress,\r\n TaoSlider,\r\n TaoFileDrop,\r\n TaoDropdownMenu,\r\n TaoPinCode,\r\n TaoLink,\r\n TaoFormField,\r\n TaoSelect,\r\n TaoCombobox,\r\n TaoDate,\r\n TaoDateRange,\r\n TaoSwitch,\r\n TaoRadio,\r\n TaoRadioGroup,\r\n TaoSegmented,\r\n TaoSegmentedOption,\r\n TaoAlert,\r\n TaoTable,\r\n TaoPagination,\r\n TaoEmpty,\r\n TaoList,\r\n TaoListItem,\r\n TaoSkeleton,\r\n TaoDrawer,\r\n TaoAvatar,\r\n TaoBreadcrumb,\r\n TaoCounter,\r\n TaoCarousel,\r\n TaoStages,\r\n TaoToastViewport,\r\n TaoConfirmHost,\r\n];\r\n\r\nexport const TaoUI: Plugin = {\r\n install(app) {\r\n components.forEach(component => {\r\n app.component(component.name!, component);\r\n });\r\n },\r\n};\r\n\r\nexport {\r\n TaoButton,\r\n TaoBlock,\r\n TaoInput,\r\n TaoInputGroup,\r\n TaoInputNumber,\r\n TaoQuantity,\r\n TaoCard,\r\n TaoModal,\r\n TaoTabs,\r\n TaoTooltip,\r\n TaoPopover,\r\n TaoSpoiler,\r\n TaoSpoilerGroup,\r\n TaoCopy,\r\n TaoContainer,\r\n TaoFlex,\r\n TaoSpace,\r\n TaoGrid,\r\n TaoGridItem,\r\n TaoSplit,\r\n TaoIcon,\r\n TaoLoader,\r\n TaoImage,\r\n TaoCheckbox,\r\n TaoTag,\r\n TaoDivider,\r\n TaoFieldset,\r\n TaoAnimatedBorder,\r\n TaoTextarea,\r\n TaoScrollTop,\r\n TaoProgress,\r\n TaoSlider,\r\n TaoFileDrop,\r\n TaoDropdownMenu,\r\n TaoPinCode,\r\n TaoLink,\r\n TaoFormField,\r\n TaoSelect,\r\n TaoCombobox,\r\n TaoDate,\r\n TaoDateRange,\r\n TaoSwitch,\r\n TaoRadio,\r\n TaoRadioGroup,\r\n TaoSegmented,\r\n TaoSegmentedOption,\r\n TaoAlert,\r\n TaoTable,\r\n TaoPagination,\r\n TaoEmpty,\r\n TaoList,\r\n TaoListItem,\r\n TaoSkeleton,\r\n TaoDrawer,\r\n TaoAvatar,\r\n TaoBreadcrumb,\r\n TaoCounter,\r\n TaoCarousel,\r\n TaoStages,\r\n TaoToastViewport,\r\n TaoConfirmHost,\r\n toast,\r\n confirm,\r\n};\r\n\r\nexport type {\r\n TaoToastAction,\r\n TaoToastApi,\r\n TaoToastBuilder,\r\n TaoToastDefaults,\r\n TaoToastDisplayMode,\r\n TaoToastPosition,\r\n TaoToastRecord,\r\n TaoToastShortcutOptions,\r\n TaoToastType,\r\n} from './toast';\r\n\r\nexport type {\r\n TaoConfirmApi,\r\n TaoConfirmBuilder,\r\n TaoConfirmDefaults,\r\n TaoConfirmRecord,\r\n TaoConfirmShortcutOptions,\r\n} from './confirm';\r\n\r\nexport {\r\n parseTaoDate,\r\n parseTaoDateRange,\r\n formatTaoDateIso,\r\n todayTaoDate,\r\n formatTaoDateLabel,\r\n formatTaoDateRangeLabel,\r\n} from './date';\r\nexport type { TaoSelectOption } from './select';\r\nexport type { TaoDateCell, TaoDateParts, TaoDateRangeValue } from './date';\r\nexport type { TaoRadioValue } from './radio';\r\nexport type { TaoSegmentedSize } from './segmented';\r\nexport type { TaoSpoilerName } from './spoiler';\r\nexport type { TaoFormFieldContext } from './formField';\r\nexport type { TaoTableAlign, TaoTableColumn, TaoTableSort } from './table';\r\nexport type { TaoPaginationItem } from './pagination';\r\nexport type { TaoBreadcrumbItem } from './breadcrumb';\r\nexport type { TaoDropdownAction } from './dropdown';\r\nexport type { TaoQuantityChangeSource } from './quantity';\r\nexport type { TaoStageItem, TaoStageStatus } from './stage';\r\nexport type { TaoSplitDirection, TaoSplitUnit } from './split';\r\nexport type { TaoListSize } from './list';\r\n\r\nexport default TaoUI;\r\n"],"names":["_createElementBlock","_openBlock","_hoisted_2","_hoisted_3","_toDisplayString","_createElementVNode","_hoisted_4","_renderSlot","computed","_normalizeClass","_normalizeStyle","inject","useId","ref","_hoisted_1","_unref","$slots","_hoisted_5","_hoisted_6","watch","useSlots","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","nextTick","onBeforeUnmount","_createBlock","_Teleport","_createVNode","_Transition","_Fragment","_renderList","_createTextVNode","onMounted","provide","_resolveDynamicComponent","nextPx","reactive","onBeforeMount","value","getCurrentInstance","_mergeProps","onInput","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","TaoLink","_TransitionGroup","onUpdated","toast","viewportMounts","isClient","hostedApp","createApp","createDraft","createBuilder","TaoFlex"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/components/TaoButton.vue","../src/components/TaoBlock.vue","../src/formField.ts","../src/components/TaoInput.vue","../src/components/TaoInputGroup.vue","../src/components/TaoInputNumber.vue","../src/components/TaoQuantity.vue","../src/components/TaoCard.vue","../src/focusTrap.ts","../src/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>\r\ndefineOptions({ name: 'TaoButton' });\r\n\r\ninterface Props {\r\n type?: 'button' | 'submit' | 'reset';\r\n size?: 'small' | 'medium' | 'large';\r\n variant?: 'primary' | 'secondary' | 'ghost' | 'text' | 'danger';\r\n /** Красит кнопку: danger / success / warning / info. Не вместо variant. */\r\n tone?: 'danger' | 'success' | 'warning' | 'info' | '';\r\n disabled?: boolean;\r\n loading?: boolean;\r\n block?: boolean;\r\n icon?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: 'button',\r\n size: 'medium',\r\n variant: 'primary',\r\n tone: '',\r\n disabled: false,\r\n loading: false,\r\n block: false,\r\n icon: '',\r\n});\r\n\r\nconst emit = defineEmits(['click']);\r\n\r\nfunction handleClick(event: MouseEvent) {\r\n if (!props.disabled && !props.loading) {\r\n emit('click', event);\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <button\r\n class=\"tao-button\"\r\n :class=\"[\r\n `tao-button--${size}`,\r\n `tao-button--${variant}`,\r\n {\r\n 'tao-button--disabled': disabled,\r\n 'tao-button--loading': loading,\r\n 'tao-button--block': block,\r\n 'tao-button--icon': !!icon,\r\n [`tao-button--tone-${tone}`]: !!tone,\r\n },\r\n ]\"\r\n :type=\"type\"\r\n :disabled=\"disabled || loading\"\r\n @click=\"handleClick\"\r\n >\r\n <span v-if=\"loading\" class=\"tao-button__loader\"></span>\r\n <span v-if=\"icon\" class=\"tao-button__icon\">{{ icon }}</span>\r\n <span class=\"tao-button__content\"><slot /></span>\r\n </button>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--tao-space-2);\r\n\r\n border: none;\r\n border-radius: var(--tao-radius-control);\r\n cursor: pointer;\r\n font-family: inherit;\r\n font-weight: 500;\r\n transition: var(--tao-transition-base);\r\n position: relative;\r\n}\r\n\r\n.tao-button:active:not(.tao-button--text) {\r\n transform: translateY(1px);\r\n}\r\n\r\n.tao-button:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-button--small {\r\n padding: var(--tao-space-1) var(--tao-space-3);\r\n font-size: var(--tao-font-size-xs);\r\n height: var(--tao-control-height-small);\r\n}\r\n\r\n.tao-button--medium {\r\n padding: var(--tao-space-2) var(--tao-space-4);\r\n font-size: var(--tao-font-size-md);\r\n height: var(--tao-control-height-medium);\r\n}\r\n\r\n.tao-button--large {\r\n padding: var(--tao-space-2) var(--tao-space-6);\r\n font-size: var(--tao-font-size-lg);\r\n height: var(--tao-control-height-large);\r\n}\r\n\r\n.tao-button--primary {\r\n background-color: var(--tao-color-accent);\r\n color: var(--tao-color-on-accent);\r\n}\r\n\r\n.tao-button--primary:hover:not(.tao-button--disabled) {\r\n background-color: var(--tao-color-accent-hover);\r\n}\r\n\r\n.tao-button--secondary {\r\n background-color: var(--tao-color-surface-sunken);\r\n color: var(--tao-color-text);\r\n border: 1px solid var(--tao-color-border-strong);\r\n}\r\n\r\n.tao-button--secondary:hover:not(.tao-button--disabled) {\r\n background-color: var(--tao-color-surface-hover);\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-button--ghost {\r\n background-color: transparent;\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-button--ghost:hover:not(.tao-button--disabled) {\r\n background-color: var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-button--text {\r\n height: auto;\r\n padding: 2px 4px;\r\n background: transparent;\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-button--text.tao-button--small,\r\n.tao-button--text.tao-button--medium,\r\n.tao-button--text.tao-button--large {\r\n height: auto;\r\n padding: 2px 4px;\r\n}\r\n\r\n.tao-button--text:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-accent-hover);\r\n background-color: var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-button--danger {\r\n background-color: var(--tao-color-danger);\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-button--danger:hover:not(.tao-button--disabled) {\r\n background-color: var(--tao-color-danger-hover);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-danger,\r\n.tao-button--text.tao-button--tone-danger {\r\n color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-danger:hover:not(.tao-button--disabled),\r\n.tao-button--text.tao-button--tone-danger:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-danger-hover);\r\n background-color: var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-success,\r\n.tao-button--text.tao-button--tone-success {\r\n color: var(--tao-color-success);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-success:hover:not(.tao-button--disabled),\r\n.tao-button--text.tao-button--tone-success:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-success-hover);\r\n background-color: var(--tao-color-success-subtle);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-warning,\r\n.tao-button--text.tao-button--tone-warning {\r\n color: var(--tao-color-warning);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-warning:hover:not(.tao-button--disabled),\r\n.tao-button--text.tao-button--tone-warning:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-warning-hover);\r\n background-color: var(--tao-color-warning-subtle);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-info,\r\n.tao-button--text.tao-button--tone-info {\r\n color: var(--tao-color-info);\r\n}\r\n\r\n.tao-button--ghost.tao-button--tone-info:hover:not(.tao-button--disabled),\r\n.tao-button--text.tao-button--tone-info:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-info-hover);\r\n background-color: var(--tao-color-info-subtle);\r\n}\r\n\r\n.tao-button--secondary.tao-button--tone-danger {\r\n color: var(--tao-color-danger);\r\n border-color: color-mix(in srgb, var(--tao-color-danger) 40%, transparent);\r\n}\r\n\r\n.tao-button--secondary.tao-button--tone-danger:hover:not(.tao-button--disabled) {\r\n color: var(--tao-color-danger-hover);\r\n background-color: var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-button--primary.tao-button--tone-danger,\r\n.tao-button--danger.tao-button--tone-danger {\r\n background-color: var(--tao-color-danger);\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-button--primary.tao-button--tone-danger:hover:not(.tao-button--disabled),\r\n.tao-button--danger.tao-button--tone-danger:hover:not(.tao-button--disabled) {\r\n background-color: var(--tao-color-danger-hover);\r\n}\r\n\r\n.tao-button--disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-button--block {\r\n width: 100%;\r\n}\r\n\r\n.tao-button--loading .tao-button__content {\r\n opacity: 0;\r\n}\r\n\r\n.tao-button__loader {\r\n position: absolute;\r\n width: 16px;\r\n height: 16px;\r\n border: 2px solid color-mix(in srgb, currentColor 15%, transparent);\r\n border-top-color: currentColor;\r\n border-radius: var(--tao-radius-full);\r\n animation: tao-spin 0.8s linear infinite;\r\n}\r\n\r\n.tao-button__icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n@keyframes tao-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoBlock' });\r\n\r\ninterface Props {\r\n padding?: number | number[];\r\n radius?: number;\r\n shadow?: boolean;\r\n hover?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n padding: 16,\r\n radius: 8,\r\n shadow: true,\r\n hover: false,\r\n});\r\n\r\nconst paddingStyle = computed(() => {\r\n if (Array.isArray(props.padding)) {\r\n return {\r\n padding: `${props.padding.map(p => `${p}px`).join(' ')}`\r\n };\r\n }\r\n return { padding: `${props.padding}px` };\r\n});\r\n\r\nconst radiusStyle = computed(() => ({\r\n borderRadius: `${props.radius}px`\r\n}));\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-block\"\r\n :class=\"{ 'tao-block--shadow': shadow, 'tao-block--hover': hover }\"\r\n :style=\"[paddingStyle, radiusStyle]\"\r\n >\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-block {\r\n background: var(--tao-color-surface);\r\n color: var(--tao-color-text);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-block--shadow {\r\n box-shadow: var(--tao-shadow-panel);\r\n}\r\n\r\n.tao-block--hover {\r\n cursor: pointer;\r\n}\r\n\r\n.tao-block--hover:hover {\r\n box-shadow: var(--tao-shadow-md);\r\n}\r\n</style>\r\n","import type { ComputedRef, InjectionKey } from 'vue';\r\n\r\nexport interface TaoFormFieldContext {\r\n id: string;\r\n invalid: ComputedRef<boolean>;\r\n describedBy: ComputedRef<string | undefined>;\r\n}\r\n\r\nexport const formFieldKey: InjectionKey<TaoFormFieldContext> = Symbol('taoFormField');\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoInput' });\r\n\r\ninterface Props {\r\n modelValue?: string | number;\r\n type?: 'text' | 'password' | 'email' | 'number' | 'tel';\r\n placeholder?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n errorMessage?: string;\r\n label?: string;\r\n id?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n type: 'text',\r\n placeholder: '',\r\n disabled: false,\r\n error: false,\r\n errorMessage: '',\r\n label: '',\r\n});\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => props.id || field?.id || localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\nconst focused = ref(false);\r\n\r\nconst emit = defineEmits(['update:modelValue', 'blur', 'focus']);\r\n\r\nfunction handleInput(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n emit('update:modelValue', target.value);\r\n}\r\n\r\nfunction handleBlur(event: FocusEvent) {\r\n focused.value = false;\r\n emit('blur', event);\r\n}\r\n\r\nfunction handleFocus(event: FocusEvent) {\r\n focused.value = true;\r\n emit('focus', event);\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-input-wrapper\">\r\n <label v-if=\"label && !field\" class=\"tao-input__label\" :for=\"controlId\">{{ label }}</label>\r\n <div\r\n class=\"tao-input-shell\"\r\n :class=\"{\r\n 'tao-input-shell--focused': focused,\r\n 'tao-input-shell--invalid': invalid,\r\n 'tao-input-shell--disabled': disabled,\r\n 'tao-input-shell--prefix': $slots.prefix,\r\n 'tao-input-shell--suffix': $slots.suffix,\r\n }\"\r\n >\r\n <span v-if=\"$slots.prefix\" class=\"tao-input__affix tao-input__affix--prefix\">\r\n <slot name=\"prefix\" />\r\n </span>\r\n <input\r\n :id=\"controlId\"\r\n class=\"tao-input\"\r\n :class=\"{ 'tao-input--error': invalid }\"\r\n :type=\"type\"\r\n :value=\"modelValue\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n @input=\"handleInput\"\r\n @blur=\"handleBlur\"\r\n @focus=\"handleFocus\"\r\n />\r\n <span v-if=\"$slots.suffix\" class=\"tao-input__affix tao-input__affix--suffix\">\r\n <slot name=\"suffix\" />\r\n </span>\r\n </div>\r\n <span v-if=\"error && errorMessage\" class=\"tao-input__error\">{{ errorMessage }}</span>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-input-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n width: 100%;\r\n}\r\n\r\n.tao-input__label {\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text);\r\n font-weight: 500;\r\n}\r\n\r\n.tao-input-shell {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n min-width: 0;\r\n min-height: var(--tao-field-height);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-input {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n width: 100%;\r\n margin: 0;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border: none;\r\n border-radius: inherit;\r\n background: transparent;\r\n color: inherit;\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n line-height: 1.25;\r\n}\r\n\r\n.tao-input-shell--prefix .tao-input {\r\n padding-left: 0;\r\n}\r\n\r\n.tao-input-shell--suffix .tao-input {\r\n padding-right: 0;\r\n}\r\n\r\n.tao-input::placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-input:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-input-shell--focused {\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-input-shell--disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n color: var(--tao-color-input-disabled-text);\r\n background: var(--tao-color-input-disabled-bg);\r\n}\r\n\r\n.tao-input:disabled {\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-input-shell--invalid {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-input-shell--invalid.tao-input-shell--focused {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-input__affix {\r\n display: inline-flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n gap: var(--tao-space-1);\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 600;\r\n line-height: 1;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-input__affix--prefix {\r\n padding-left: var(--tao-space-3);\r\n padding-right: var(--tao-space-2);\r\n}\r\n\r\n.tao-input__affix--suffix {\r\n padding-right: var(--tao-space-3);\r\n padding-left: var(--tao-space-2);\r\n}\r\n\r\n.tao-input__affix :deep(svg) {\r\n display: block;\r\n width: 16px;\r\n height: 16px;\r\n}\r\n\r\n.tao-input__affix :deep(button) {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n background: transparent;\r\n color: inherit;\r\n font: inherit;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-input__affix :deep(button:hover) {\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-input__affix :deep(button:focus-visible) {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-input__error {\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { ref } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoInputGroup' });\r\n\r\nconst focused = ref(false);\r\n\r\nfunction onFocusIn() {\r\n focused.value = true;\r\n}\r\n\r\nfunction onFocusOut(event: FocusEvent) {\r\n const root = event.currentTarget as HTMLElement;\r\n const next = event.relatedTarget as Node | null;\r\n if (!next || !root.contains(next)) {\r\n focused.value = false;\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-input-group\"\r\n :class=\"{ 'tao-input-group--focused': focused }\"\r\n role=\"group\"\r\n @focusin=\"onFocusIn\"\r\n @focusout=\"onFocusOut\"\r\n >\r\n <div v-if=\"$slots.before\" class=\"tao-input-group__addon tao-input-group__addon--before\">\r\n <slot name=\"before\" />\r\n </div>\r\n <div class=\"tao-input-group__field\">\r\n <slot />\r\n </div>\r\n <div v-if=\"$slots.after\" class=\"tao-input-group__addon tao-input-group__addon--after\">\r\n <slot name=\"after\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-input-group {\r\n display: flex;\r\n align-items: stretch;\r\n width: 100%;\r\n min-width: 0;\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-input-group--focused {\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-input-group:has(.tao-input-shell--invalid) {\r\n box-shadow: none;\r\n}\r\n\r\n.tao-input-group--focused:has(.tao-input-shell--invalid) {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-input-group__field {\r\n display: flex;\r\n flex: 1 1 auto;\r\n align-items: stretch;\r\n align-self: stretch;\r\n min-width: 0;\r\n}\r\n\r\n.tao-input-group__field :deep(.tao-input-wrapper) {\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n align-self: stretch;\r\n min-width: 0;\r\n gap: 0;\r\n}\r\n\r\n.tao-input-group__field :deep(.tao-input-shell) {\r\n flex: 1 1 auto;\r\n align-self: stretch;\r\n border-radius: 0;\r\n box-shadow: none;\r\n}\r\n\r\n.tao-input-group__field :deep(.tao-input) {\r\n align-self: stretch;\r\n line-height: 1.25;\r\n}\r\n\r\n.tao-input-group__addon {\r\n display: flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n align-self: stretch;\r\n padding: 0 var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n background: var(--tao-color-surface-sunken);\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 600;\r\n line-height: 1;\r\n white-space: nowrap;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-input-group__addon--before {\r\n border-right: 0;\r\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\r\n}\r\n\r\n.tao-input-group__addon--after {\r\n border-left: 0;\r\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\r\n}\r\n\r\n.tao-input-group__field:not(:first-child) :deep(.tao-input-shell) {\r\n border-left: 0;\r\n}\r\n\r\n.tao-input-group__field:not(:last-child) :deep(.tao-input-shell) {\r\n border-right: 0;\r\n}\r\n\r\n.tao-input-group__field:first-child :deep(.tao-input-shell) {\r\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\r\n}\r\n\r\n.tao-input-group__field:last-child :deep(.tao-input-shell) {\r\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\r\n}\r\n\r\n.tao-input-group__field:only-child :deep(.tao-input-shell) {\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-input-group--focused .tao-input-group__addon,\r\n.tao-input-group--focused :deep(.tao-input-shell) {\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-input-group:has(.tao-input-shell--invalid) .tao-input-group__addon,\r\n.tao-input-group:has(.tao-input-shell--invalid) :deep(.tao-input-shell) {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-input-group__addon:has(.tao-button) {\r\n padding: 0;\r\n background: transparent;\r\n}\r\n\r\n.tao-input-group__addon :deep(.tao-button) {\r\n align-self: stretch;\r\n height: auto;\r\n border: none;\r\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\r\n}\r\n\r\n.tao-input-group__addon--before :deep(.tao-button) {\r\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\r\n}\r\n\r\n.tao-input-group__addon :deep(.tao-button:focus-visible) {\r\n outline-offset: -2px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoInputNumber' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: number | null;\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n precision?: number;\r\n disabled?: boolean;\r\n placeholder?: string;\r\n controls?: boolean;\r\n incrementLabel?: string;\r\n decrementLabel?: string;\r\n }>(),\r\n {\r\n modelValue: null,\r\n step: 1,\r\n disabled: false,\r\n placeholder: '',\r\n controls: true,\r\n incrementLabel: 'Увеличить',\r\n decrementLabel: 'Уменьшить',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number | null];\r\n /**\r\n * The user finished an edit: blur, Enter, ± button, arrow key. Fires once per action (typing emits only update:modelValue),\r\n * so forms can save or push an undo step here. / Правка закончена: blur, Enter, кнопка ±, стрелка. Один раз на действие\r\n * (при наборе уходит только update:modelValue): здесь удобно сохранять или делать шаг отмены.\r\n */\r\n commit: [value: number | null];\r\n blur: [event: FocusEvent];\r\n focus: [event: FocusEvent];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst focused = ref(false);\r\nconst draft = ref(toDraft(props.modelValue));\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n if (!focused.value) {\r\n draft.value = toDraft(value);\r\n }\r\n },\r\n);\r\n\r\nfunction decimalsOf(value: number) {\r\n const text = String(value);\r\n const dot = text.indexOf('.');\r\n return dot === -1 ? 0 : text.length - dot - 1;\r\n}\r\n\r\nfunction roundTo(value: number) {\r\n const digits = props.precision ?? decimalsOf(props.step);\r\n if (digits <= 0) {\r\n return Math.round(value);\r\n }\r\n const factor = 10 ** digits;\r\n return Math.round(value * factor) / factor;\r\n}\r\n\r\nfunction clamp(value: number) {\r\n let next = roundTo(value);\r\n if (props.min !== undefined && next < props.min) {\r\n next = props.min;\r\n }\r\n if (props.max !== undefined && next > props.max) {\r\n next = props.max;\r\n }\r\n return roundTo(next);\r\n}\r\n\r\nfunction toDraft(value: number | null | undefined) {\r\n if (value === null || value === undefined || Number.isNaN(value)) {\r\n return '';\r\n }\r\n return String(value);\r\n}\r\n\r\nfunction parseDraft(text: string): number | null | 'incomplete' {\r\n const trimmed = text.trim().replace(',', '.');\r\n if (trimmed === '') {\r\n return null;\r\n }\r\n if (trimmed === '-' || trimmed === '.' || trimmed === '-.') {\r\n return 'incomplete';\r\n }\r\n const parsed = Number(trimmed);\r\n if (!Number.isFinite(parsed)) {\r\n return 'incomplete';\r\n }\r\n return parsed;\r\n}\r\n\r\nfunction isAllowed(text: string) {\r\n return /^-?\\d*([.,]\\d*)?$/.test(text);\r\n}\r\n\r\n/** Applies a finished value: normalises, emits update:modelValue and commit. / Применяет готовое значение. */\r\nfunction commit(value: number | null) {\r\n const next = value === null ? null : clamp(value);\r\n emit('update:modelValue', next);\r\n draft.value = toDraft(next);\r\n emit('commit', next);\r\n}\r\n\r\nfunction bump(direction: 1 | -1) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n const base = props.modelValue ?? 0;\r\n commit(base + direction * props.step);\r\n}\r\n\r\nfunction onInput(event: Event) {\r\n const text = (event.target as HTMLInputElement).value;\r\n if (!isAllowed(text)) {\r\n return;\r\n }\r\n draft.value = text;\r\n const parsed = parseDraft(text);\r\n if (parsed !== 'incomplete') {\r\n emit('update:modelValue', parsed === null ? null : clamp(parsed));\r\n }\r\n}\r\n\r\nfunction onFocus(event: FocusEvent) {\r\n focused.value = true;\r\n emit('focus', event);\r\n}\r\n\r\nfunction onBlur(event: FocusEvent) {\r\n focused.value = false;\r\n const parsed = parseDraft(draft.value);\r\n commit(parsed === 'incomplete' ? null : parsed);\r\n emit('blur', event);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Enter') {\r\n const parsed = parseDraft(draft.value);\r\n commit(parsed === 'incomplete' ? null : parsed);\r\n return;\r\n }\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n bump(1);\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n bump(-1);\r\n }\r\n}\r\n\r\nconst atMin = computed(() => props.min !== undefined && (props.modelValue ?? 0) <= props.min);\r\nconst atMax = computed(() => props.max !== undefined && (props.modelValue ?? 0) >= props.max);\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-input-number\" :class=\"{ 'tao-input-number--invalid': invalid, 'tao-input-number--controls': controls }\">\r\n <input\r\n :id=\"controlId\"\r\n class=\"tao-input-number__input\"\r\n type=\"text\"\r\n inputmode=\"decimal\"\r\n role=\"spinbutton\"\r\n :value=\"draft\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :aria-valuenow=\"modelValue ?? undefined\"\r\n :aria-valuemin=\"min\"\r\n :aria-valuemax=\"max\"\r\n autocomplete=\"off\"\r\n @input=\"onInput\"\r\n @focus=\"onFocus\"\r\n @blur=\"onBlur\"\r\n @keydown=\"onKeydown\"\r\n />\r\n <div v-if=\"controls\" class=\"tao-input-number__steppers\">\r\n <button\r\n type=\"button\"\r\n class=\"tao-input-number__step\"\r\n :aria-label=\"incrementLabel\"\r\n tabindex=\"-1\"\r\n :disabled=\"disabled || atMax\"\r\n @click=\"bump(1)\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"increment-icon\">+</slot>\r\n </span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"tao-input-number__step\"\r\n :aria-label=\"decrementLabel\"\r\n tabindex=\"-1\"\r\n :disabled=\"disabled || atMin\"\r\n @click=\"bump(-1)\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"decrement-icon\">−</slot>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-input-number {\r\n position: relative;\r\n display: flex;\r\n width: 100%;\r\n}\r\n\r\n.tao-input-number__input {\r\n width: 100%;\r\n height: var(--tao-field-height);\r\n padding: 0 var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n font-variant-numeric: tabular-nums;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-input-number--controls .tao-input-number__input {\r\n padding-right: 34px;\r\n}\r\n\r\n.tao-input-number__input::placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-input-number__input:focus {\r\n outline: none;\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-input-number__input:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n color: var(--tao-color-input-disabled-text);\r\n background: var(--tao-color-input-disabled-bg);\r\n}\r\n\r\n.tao-input-number--invalid .tao-input-number__input {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-input-number--invalid .tao-input-number__input:focus {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-input-number__steppers {\r\n position: absolute;\r\n top: 1px;\r\n right: 1px;\r\n bottom: 1px;\r\n display: flex;\r\n flex-direction: column;\r\n width: 28px;\r\n border-left: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-input-number__step {\r\n flex: 1;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n background: transparent;\r\n color: var(--tao-color-text-muted);\r\n font: inherit;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-input-number__step + .tao-input-number__step {\r\n border-top: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-input-number__step:hover:not(:disabled) {\r\n color: var(--tao-color-text-strong);\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-input-number__step:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: -2px;\r\n}\r\n\r\n.tao-input-number__step:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.4;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport type { TaoQuantityChangeSource } from '../quantity';\r\n\r\ndefineOptions({ name: 'TaoQuantity' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: number;\r\n min?: number;\r\n max?: number;\r\n disabled?: boolean;\r\n /** Minus stays enabled at min and still emits `dec` — parent can remove the line. */\r\n allowRemove?: boolean;\r\n /** Clamp to max on blur and when the incoming value is above stock. */\r\n forceMaxLimit?: boolean;\r\n decrementLabel?: string;\r\n removeLabel?: string;\r\n incrementLabel?: string;\r\n }>(),\r\n {\r\n modelValue: 1,\r\n min: 1,\r\n disabled: false,\r\n allowRemove: true,\r\n forceMaxLimit: true,\r\n decrementLabel: 'Уменьшить',\r\n removeLabel: 'Убрать',\r\n incrementLabel: 'Увеличить',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number];\r\n change: [value: number, source: TaoQuantityChangeSource];\r\n dec: [value: number];\r\n inc: [value: number];\r\n blur: [value: number];\r\n focus: [event: FocusEvent];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst focused = ref(false);\r\nconst draft = ref(String(props.modelValue));\r\n\r\nconst ceiling = computed(() => (props.max === undefined ? Number.POSITIVE_INFINITY : props.max));\r\n\r\nfunction toInt(value: unknown) {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return Math.trunc(value);\r\n }\r\n const parsed = parseInt(String(value ?? ''), 10);\r\n return Number.isFinite(parsed) ? parsed : props.min;\r\n}\r\n\r\nfunction clampQty(value: number) {\r\n let next = Math.max(value, props.min);\r\n if (props.forceMaxLimit && props.max !== undefined) {\r\n next = Math.min(next, props.max);\r\n }\r\n return next;\r\n}\r\n\r\nfunction commit(value: number, source: TaoQuantityChangeSource) {\r\n const next = clampQty(value);\r\n if (next !== props.modelValue) {\r\n emit('update:modelValue', next);\r\n emit('change', next, source);\r\n }\r\n draft.value = String(next);\r\n return next;\r\n}\r\n\r\nwatch(\r\n () => [props.modelValue, props.min, props.max, props.forceMaxLimit] as const,\r\n () => {\r\n const next = clampQty(toInt(props.modelValue));\r\n if (next !== props.modelValue) {\r\n emit('update:modelValue', next);\r\n emit('change', next, 'input');\r\n }\r\n if (!focused.value) {\r\n draft.value = String(next);\r\n }\r\n },\r\n { immediate: true },\r\n);\r\n\r\nfunction onDec() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n let next = props.modelValue;\r\n if (props.modelValue > props.min) {\r\n next = props.modelValue > ceiling.value ? ceiling.value : clampQty(props.modelValue - 1);\r\n commit(next, 'dec');\r\n }\r\n emit('dec', next);\r\n}\r\n\r\nfunction onInc() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n let next = props.modelValue;\r\n if (props.modelValue < ceiling.value) {\r\n next = clampQty(props.modelValue + 1);\r\n commit(next, 'inc');\r\n }\r\n emit('inc', next);\r\n}\r\n\r\nfunction onInput(event: Event) {\r\n const text = (event.target as HTMLInputElement).value;\r\n if (!/^\\d*$/.test(text)) {\r\n return;\r\n }\r\n draft.value = text;\r\n if (text === '') {\r\n return;\r\n }\r\n commit(toInt(text), 'input');\r\n}\r\n\r\nfunction onFocus(event: FocusEvent) {\r\n focused.value = true;\r\n emit('focus', event);\r\n}\r\n\r\nfunction onBlur() {\r\n focused.value = false;\r\n const next = commit(draft.value === '' ? props.min : toInt(draft.value), 'input');\r\n draft.value = String(next);\r\n emit('blur', next);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n onInc();\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n onDec();\r\n }\r\n}\r\n\r\nconst atMin = computed(() => props.modelValue <= props.min);\r\nconst atMax = computed(() => props.modelValue >= ceiling.value);\r\nconst minusDisabled = computed(() => props.disabled || (!props.allowRemove && atMin.value));\r\nconst plusDisabled = computed(() => props.disabled || atMax.value);\r\nconst minusLabel = computed(() => (atMin.value && props.allowRemove ? props.removeLabel : props.decrementLabel));\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-quantity\"\r\n :class=\"{\r\n 'tao-quantity--invalid': invalid,\r\n 'tao-quantity--focused': focused,\r\n 'tao-quantity--disabled': disabled,\r\n }\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"tao-quantity__btn tao-quantity__btn--dec\"\r\n :aria-label=\"minusLabel\"\r\n :disabled=\"minusDisabled\"\r\n @click=\"onDec\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"decrement-icon\">−</slot>\r\n </span>\r\n </button>\r\n <input\r\n :id=\"controlId\"\r\n class=\"tao-quantity__input\"\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n pattern=\"[0-9]*\"\r\n autocomplete=\"off\"\r\n role=\"spinbutton\"\r\n :value=\"draft\"\r\n :disabled=\"disabled\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :aria-valuenow=\"modelValue\"\r\n :aria-valuemin=\"min\"\r\n :aria-valuemax=\"max\"\r\n @input=\"onInput\"\r\n @focus=\"onFocus\"\r\n @blur=\"onBlur\"\r\n @keydown=\"onKeydown\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"tao-quantity__btn tao-quantity__btn--inc\"\r\n :aria-label=\"incrementLabel\"\r\n :disabled=\"plusDisabled\"\r\n @click=\"onInc\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"increment-icon\">+</slot>\r\n </span>\r\n </button>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-quantity {\r\n display: inline-flex;\r\n width: 100%;\r\n min-width: 148px;\r\n isolation: isolate;\r\n}\r\n\r\n.tao-quantity__btn,\r\n.tao-quantity__input {\r\n height: var(--tao-field-height);\r\n margin: 0;\r\n border: 1px solid var(--tao-color-border-strong);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n font-family: inherit;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-quantity__btn {\r\n flex: 0 0 50px;\r\n width: 50px;\r\n padding: 0;\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-md);\r\n font-weight: 800;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-quantity__btn--dec {\r\n border-right: 0;\r\n border-radius: var(--tao-radius-control) 0 0 var(--tao-radius-control);\r\n}\r\n\r\n.tao-quantity__btn--inc {\r\n border-left: 0;\r\n border-radius: 0 var(--tao-radius-control) var(--tao-radius-control) 0;\r\n}\r\n\r\n.tao-quantity__btn:hover:not(:disabled) {\r\n z-index: 1;\r\n color: var(--tao-color-accent);\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-quantity__btn:focus-visible {\r\n z-index: 2;\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: -2px;\r\n}\r\n\r\n.tao-quantity__btn:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.4;\r\n}\r\n\r\n.tao-quantity__input {\r\n z-index: 0;\r\n flex: 1 1 auto;\r\n min-width: 30px;\r\n padding: 0 var(--tao-space-2);\r\n border-right: 0;\r\n border-left: 0;\r\n text-align: center;\r\n font-size: var(--tao-font-size-md);\r\n font-weight: 700;\r\n font-variant-numeric: tabular-nums;\r\n}\r\n\r\n.tao-quantity__input:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-quantity--focused .tao-quantity__btn,\r\n.tao-quantity--focused .tao-quantity__input {\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-quantity--focused {\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-quantity__input:disabled {\r\n color: var(--tao-color-input-disabled-text);\r\n background: var(--tao-color-input-disabled-bg);\r\n}\r\n\r\n.tao-quantity--disabled .tao-quantity__btn {\r\n background: var(--tao-color-input-disabled-bg);\r\n}\r\n\r\n.tao-quantity--invalid .tao-quantity__btn,\r\n.tao-quantity--invalid .tao-quantity__input {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-quantity--invalid.tao-quantity--focused {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, useSlots } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoCard' });\r\n\r\ninterface Props {\r\n padding?: number | number[];\r\n radius?: number;\r\n shadow?: boolean;\r\n shadowBottomOnly?: boolean;\r\n hover?: boolean;\r\n active?: boolean;\r\n overflow?: boolean;\r\n /** Плитка: без отступа и без тени, cover/body тянутся на ячейку. */\r\n flush?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n padding: 20,\r\n radius: 8,\r\n shadow: true,\r\n shadowBottomOnly: false,\r\n hover: false,\r\n active: false,\r\n overflow: false,\r\n flush: false,\r\n});\r\n\r\nconst slots = useSlots();\r\n\r\nconst hasContent = computed(\r\n () =>\r\n Boolean(slots.headerTitle) ||\r\n Boolean(slots.header) ||\r\n Boolean(slots.headerSecondary) ||\r\n Boolean(slots.title) ||\r\n Boolean(slots.sub) ||\r\n Boolean(slots.default) ||\r\n Boolean(slots.footer),\r\n);\r\n\r\nconst coverOnly = computed(() => Boolean(slots.cover) && !hasContent.value);\r\n\r\nconst paddingStyle = computed(() => {\r\n if (props.flush) {\r\n return { padding: '0' };\r\n }\r\n if (Array.isArray(props.padding)) {\r\n return { padding: `${props.padding.map((p) => `${p}px`).join(' ')}` };\r\n }\r\n return { padding: `${props.padding}px` };\r\n});\r\n\r\nconst radiusStyle = computed(() => ({ borderRadius: `${props.radius}px` }));\r\nconst showPanelShadow = computed(() => props.shadow && !props.shadowBottomOnly && !props.flush);\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-card\"\r\n :class=\"{\r\n 'tao-card--shadow': showPanelShadow,\r\n 'tao-card--shadow-bottom': shadowBottomOnly,\r\n 'tao-card--hover': hover,\r\n 'tao-card--active': active,\r\n 'tao-card--overflow': overflow,\r\n 'tao-card--flush': flush,\r\n 'tao-card--cover-only': coverOnly,\r\n }\"\r\n :style=\"radiusStyle\"\r\n >\r\n <div v-if=\"$slots.cover\" class=\"tao-card__cover\">\r\n <slot name=\"cover\" />\r\n <div v-if=\"$slots.overlay\" class=\"tao-card__overlay\">\r\n <slot name=\"overlay\" />\r\n </div>\r\n </div>\r\n <div v-else-if=\"$slots.overlay\" class=\"tao-card__overlay\">\r\n <slot name=\"overlay\" />\r\n </div>\r\n\r\n <div v-if=\"hasContent\" class=\"tao-card__content\" :style=\"paddingStyle\">\r\n <h2 v-if=\"$slots.headerTitle\" class=\"tao-card__header-title\">\r\n <slot name=\"headerTitle\" />\r\n </h2>\r\n\r\n <div v-if=\"$slots.header || $slots.headerSecondary\" class=\"tao-card__header\" :class=\"{ 'tao-card__header--between': $slots.headerSecondary }\">\r\n <span><slot name=\"header\" /></span>\r\n <span v-if=\"$slots.headerSecondary\"><slot name=\"headerSecondary\" /></span>\r\n </div>\r\n\r\n <div v-if=\"$slots.title || $slots.sub\" class=\"tao-card__title-block\">\r\n <h2 v-if=\"$slots.title\" class=\"tao-card__title\"><slot name=\"title\" /></h2>\r\n <div v-if=\"$slots.sub\" class=\"tao-card__sub\"><slot name=\"sub\" /></div>\r\n </div>\r\n\r\n <div v-if=\"$slots.default\" class=\"tao-card__body\"><slot /></div>\r\n\r\n <div v-if=\"$slots.footer\" class=\"tao-card__footer\"><slot name=\"footer\" /></div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-card {\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 100%;\r\n min-height: 0;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-card--overflow {\r\n overflow: visible;\r\n}\r\n\r\n.tao-card:not(.tao-card--overflow) {\r\n overflow: hidden;\r\n}\r\n\r\n.tao-card--shadow {\r\n box-shadow: var(--tao-shadow-panel);\r\n}\r\n\r\n.tao-card--shadow-bottom {\r\n box-shadow: 0 1px 0 0 var(--tao-color-border-strong);\r\n}\r\n\r\n.tao-card--hover {\r\n cursor: pointer;\r\n}\r\n\r\n.tao-card--hover:hover,\r\n.tao-card--hover.tao-card--active {\r\n box-shadow: 0 0 0 1px var(--tao-color-accent), var(--tao-shadow-lg);\r\n}\r\n\r\n.tao-card__cover {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.tao-card--cover-only .tao-card__cover {\r\n flex: 1 1 auto;\r\n min-height: 0;\r\n}\r\n\r\n.tao-card--cover-only .tao-card__cover > :deep(img) {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n}\r\n\r\n.tao-card__overlay {\r\n position: absolute;\r\n inset: 0;\r\n pointer-events: none;\r\n}\r\n\r\n.tao-card__content {\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n gap: var(--tao-space-3);\r\n min-height: 0;\r\n}\r\n\r\n.tao-card--flush .tao-card__content {\r\n padding: 0;\r\n}\r\n\r\n.tao-card__header-title {\r\n margin: 0 0 var(--tao-space-5);\r\n font-weight: 500;\r\n text-align: center;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-card__header {\r\n margin-top: -6px;\r\n padding: 2px 0 var(--tao-space-2);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 700;\r\n}\r\n\r\n.tao-card__header--between {\r\n display: flex;\r\n justify-content: space-between;\r\n}\r\n\r\n.tao-card__title {\r\n margin: 0 0 2px;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-card__sub {\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-card__body {\r\n display: flex;\r\n flex: 1 1 auto;\r\n flex-direction: column;\r\n min-height: 0;\r\n font-size: var(--tao-font-size-md);\r\n}\r\n\r\n.tao-card__footer {\r\n margin-top: auto;\r\n}\r\n</style>\r\n","const FOCUSABLE =\r\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\r\n\r\nexport function getFocusable(root: HTMLElement) {\r\n return [...root.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(\r\n (el) => el.getClientRects().length > 0 || el === document.activeElement,\r\n );\r\n}\r\n\r\nexport function trapTab(event: KeyboardEvent, root: HTMLElement) {\r\n if (event.key !== 'Tab') {\r\n return;\r\n }\r\n\r\n const items = getFocusable(root);\r\n if (!items.length) {\r\n event.preventDefault();\r\n root.focus();\r\n return;\r\n }\r\n\r\n const first = items[0];\r\n const last = items[items.length - 1];\r\n\r\n if (event.shiftKey && document.activeElement === first) {\r\n event.preventDefault();\r\n last.focus();\r\n return;\r\n }\r\n\r\n if (!event.shiftKey && document.activeElement === last) {\r\n event.preventDefault();\r\n first.focus();\r\n }\r\n}\r\n","let locks = 0;\r\nlet previousOverflow = '';\r\n\r\nexport function isBrowser() {\r\n return typeof document !== 'undefined';\r\n}\r\n\r\nexport function lockBodyScroll() {\r\n if (!isBrowser()) {\r\n return;\r\n }\r\n\r\n if (locks === 0) {\r\n previousOverflow = document.body.style.overflow;\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n locks += 1;\r\n}\r\n\r\nexport function unlockBodyScroll() {\r\n if (!isBrowser() || locks === 0) {\r\n return;\r\n }\r\n\r\n locks -= 1;\r\n if (locks === 0) {\r\n document.body.style.overflow = previousOverflow;\r\n previousOverflow = '';\r\n }\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\r\nimport { getFocusable, trapTab } from '../focusTrap';\r\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\r\n\r\ndefineOptions({ name: 'TaoModal' });\r\n\r\ninterface Props {\r\n modelValue: boolean;\r\n title?: string;\r\n closable?: boolean;\r\n closeLabel?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n title: '',\r\n closable: true,\r\n closeLabel: 'Закрыть',\r\n});\r\n\r\nconst emit = defineEmits(['update:modelValue', 'close']);\r\n\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst titleId = useId();\r\nlet previousFocus: HTMLElement | null = null;\r\nlet scrollHeld = false;\r\nlet pointerDownOnOverlay = false;\r\n\r\nfunction close() {\r\n if (!props.closable) {\r\n return;\r\n }\r\n emit('update:modelValue', false);\r\n emit('close');\r\n}\r\n\r\nfunction holdScroll() {\r\n if (scrollHeld || !isBrowser()) {\r\n return;\r\n }\r\n lockBodyScroll();\r\n scrollHeld = true;\r\n}\r\n\r\nfunction releaseScroll() {\r\n if (!scrollHeld) {\r\n return;\r\n }\r\n unlockBodyScroll();\r\n scrollHeld = false;\r\n}\r\n\r\nfunction restoreFocus() {\r\n previousFocus?.focus?.();\r\n previousFocus = null;\r\n}\r\n\r\nasync function focusPanel() {\r\n await nextTick();\r\n const panel = panelRef.value;\r\n if (!panel) {\r\n return;\r\n }\r\n const first = getFocusable(panel)[0];\r\n (first ?? panel).focus();\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n if (!props.closable) {\r\n return;\r\n }\r\n event.preventDefault();\r\n close();\r\n return;\r\n }\r\n\r\n if (panelRef.value) {\r\n trapTab(event, panelRef.value);\r\n }\r\n}\r\n\r\nfunction onOverlayPointerDown(event: PointerEvent) {\r\n pointerDownOnOverlay = event.target === event.currentTarget;\r\n}\r\n\r\nfunction onOverlayPointerUp(event: PointerEvent) {\r\n if (pointerDownOnOverlay && event.target === event.currentTarget) {\r\n close();\r\n }\r\n pointerDownOnOverlay = false;\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (isOpen) => {\r\n if (!isBrowser()) {\r\n return;\r\n }\r\n\r\n if (isOpen) {\r\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\r\n holdScroll();\r\n void focusPanel();\r\n return;\r\n }\r\n releaseScroll();\r\n restoreFocus();\r\n },\r\n { immediate: true },\r\n);\r\n\r\nonBeforeUnmount(() => {\r\n releaseScroll();\r\n restoreFocus();\r\n});\r\n</script>\r\n\r\n<template>\r\n <Teleport to=\"body\">\r\n <Transition name=\"tao-modal-fade\">\r\n <div\r\n v-if=\"modelValue\"\r\n class=\"tao-modal-overlay\"\r\n @pointerdown=\"onOverlayPointerDown\"\r\n @pointerup=\"onOverlayPointerUp\"\r\n @keydown=\"onKeydown\"\r\n >\r\n <div\r\n ref=\"panelRef\"\r\n class=\"tao-modal\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n :aria-labelledby=\"title ? titleId : undefined\"\r\n tabindex=\"-1\"\r\n >\r\n <div v-if=\"title || $slots.header || closable\" class=\"tao-modal__header\">\r\n <slot name=\"header\">\r\n <h2 v-if=\"title\" :id=\"titleId\" class=\"tao-modal__title\">{{ title }}</h2>\r\n <span v-else></span>\r\n </slot>\r\n <button\r\n v-if=\"closable\"\r\n type=\"button\"\r\n class=\"tao-modal__close\"\r\n :aria-label=\"closeLabel\"\r\n @click=\"close\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"close-icon\">&times;</slot>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"tao-modal__content\">\r\n <slot />\r\n </div>\r\n <div v-if=\"$slots.footer\" class=\"tao-modal__footer\">\r\n <slot name=\"footer\" />\r\n </div>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-modal-overlay {\r\n position: fixed;\r\n inset: 0;\r\n background: var(--tao-color-overlay);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 1000;\r\n padding: var(--tao-space-5);\r\n}\r\n\r\n.tao-modal {\r\n background: var(--tao-color-surface-raised);\r\n border-radius: var(--tao-radius-panel);\r\n max-width: 500px;\r\n width: 100%;\r\n max-height: 90vh;\r\n overflow-y: auto;\r\n box-shadow: var(--tao-shadow-overlay);\r\n}\r\n\r\n.tao-modal:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-modal:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-modal__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--tao-space-4) var(--tao-space-5);\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-modal__title {\r\n margin: 0;\r\n font-size: var(--tao-font-size-xl);\r\n font-weight: 600;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-modal__close {\r\n background: none;\r\n border: none;\r\n font-size: 24px;\r\n color: var(--tao-color-text);\r\n cursor: pointer;\r\n padding: 0;\r\n line-height: 1;\r\n}\r\n\r\n.tao-modal__close:hover {\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-modal__close:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-modal__content {\r\n padding: var(--tao-space-5);\r\n}\r\n\r\n.tao-modal__footer {\r\n padding: var(--tao-space-4) var(--tao-space-5);\r\n border-top: 1px solid var(--tao-color-border);\r\n display: flex;\r\n gap: var(--tao-space-3);\r\n justify-content: flex-end;\r\n}\r\n\r\n.tao-modal-fade-enter-active,\r\n.tao-modal-fade-leave-active {\r\n transition: opacity var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-modal-fade-enter-from,\r\n.tao-modal-fade-leave-to {\r\n opacity: 0;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, nextTick, useId } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoTabs' });\r\n\r\ninterface Tab {\r\n key: string;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n tabs: Tab[];\r\n modelValue: string;\r\n /** Выравнивание вкладок по горизонтали (CSS justify-content). */\r\n justify?: string;\r\n }>(),\r\n {\r\n justify: '',\r\n },\r\n);\r\n\r\nconst emit = defineEmits(['update:modelValue']);\r\nconst uid = useId();\r\n\r\nconst enabledTabs = computed(() => props.tabs.filter((tab) => !tab.disabled));\r\n\r\nfunction tabId(key: string) {\r\n return `${uid}-${key}`;\r\n}\r\n\r\nfunction panelId(key: string) {\r\n return `${uid}-panel-${key}`;\r\n}\r\n\r\nfunction selectTab(key: string, focus = false) {\r\n const tab = props.tabs.find((item) => item.key === key);\r\n if (tab && !tab.disabled) {\r\n emit('update:modelValue', key);\r\n if (focus) {\r\n void nextTick(() => document.getElementById(tabId(key))?.focus());\r\n }\r\n }\r\n}\r\n\r\nfunction move(delta: number) {\r\n const enabled = enabledTabs.value;\r\n if (!enabled.length) {\r\n return;\r\n }\r\n const current = enabled.findIndex((tab) => tab.key === props.modelValue);\r\n const next = enabled[(current + delta + enabled.length) % enabled.length];\r\n selectTab(next.key, true);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n move(1);\r\n return;\r\n }\r\n if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n move(-1);\r\n return;\r\n }\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n selectTab(enabledTabs.value[0]?.key ?? props.modelValue, true);\r\n return;\r\n }\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n const last = enabledTabs.value[enabledTabs.value.length - 1];\r\n selectTab(last?.key ?? props.modelValue, true);\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-tabs\">\r\n <div class=\"tao-tabs__list\" :style=\"{ justifyContent: justify || undefined }\" role=\"tablist\" @keydown=\"onKeydown\">\r\n <button\r\n v-for=\"tab in tabs\"\r\n :key=\"tab.key\"\r\n type=\"button\"\r\n class=\"tao-tabs__tab\"\r\n role=\"tab\"\r\n :id=\"tabId(tab.key)\"\r\n :aria-selected=\"tab.key === modelValue\"\r\n :aria-controls=\"panelId(tab.key)\"\r\n :tabindex=\"tab.key === modelValue ? 0 : -1\"\r\n :disabled=\"tab.disabled\"\r\n @click=\"selectTab(tab.key)\"\r\n >\r\n <slot v-if=\"$slots.label\" name=\"label\" :text=\"tab.label\" :value=\"tab.key\" />\r\n <template v-else>{{ tab.label }}</template>\r\n </button>\r\n </div>\r\n <div\r\n class=\"tao-tabs__content\"\r\n role=\"tabpanel\"\r\n :id=\"panelId(modelValue)\"\r\n :aria-labelledby=\"tabId(modelValue)\"\r\n >\r\n <slot :active-tab=\"modelValue\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-tabs {\r\n width: 100%;\r\n}\r\n\r\n.tao-tabs__list {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--tao-space-1);\r\n margin: 0;\r\n padding: 0;\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-tabs__tab {\r\n margin-bottom: -1px;\r\n padding: var(--tao-space-2) var(--tao-space-4);\r\n border: none;\r\n border-bottom: 2px solid transparent;\r\n background: transparent;\r\n color: var(--tao-color-text-subtle);\r\n font: inherit;\r\n font-size: var(--tao-font-size-md);\r\n font-weight: 500;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-tabs__tab:hover:not(:disabled) {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-tabs__tab[aria-selected='true'] {\r\n color: var(--tao-color-accent);\r\n border-bottom-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-tabs__tab[aria-selected='true']:hover:not(:disabled) {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-tabs__tab:disabled {\r\n cursor: not-allowed;\r\n color: var(--tao-color-text-disabled);\r\n}\r\n\r\n.tao-tabs__tab:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n border-radius: var(--tao-radius-control) var(--tao-radius-control) 0 0;\r\n}\r\n\r\n.tao-tabs__content {\r\n padding: var(--tao-space-4) 0 0;\r\n color: var(--tao-color-text);\r\n}\r\n</style>\r\n","/**\r\n * Win / скриншот / Alt-Tab часто глотают mouseleave и pointerup —\r\n * жест или hover остаются «нажатыми». Слушатель дергает callback,\r\n * когда окно реально теряет фокус.\r\n */\r\nexport function listenFocusLoss(onLoss: () => void) {\r\n function onVisibilityChange() {\r\n if (document.hidden) {\r\n onLoss();\r\n }\r\n }\r\n\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n window.addEventListener('blur', onLoss);\r\n window.addEventListener('pagehide', onLoss);\r\n\r\n return () => {\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n window.removeEventListener('blur', onLoss);\r\n window.removeEventListener('pagehide', onLoss);\r\n };\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\r\nimport { listenFocusLoss } from '../focusLoss';\r\n\r\ndefineOptions({ name: 'TaoTooltip' });\r\n\r\ntype TaoTooltipPosition = 'top' | 'bottom' | 'left' | 'right';\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n content: string;\r\n position?: TaoTooltipPosition;\r\n }>(),\r\n {\r\n position: 'top',\r\n },\r\n);\r\n\r\nconst wrapperRef = ref<HTMLElement | null>(null);\r\nconst tooltipRef = ref<HTMLElement | null>(null);\r\nconst showTooltip = ref(false);\r\nconst placed = ref<TaoTooltipPosition>(props.position);\r\nconst panelStyle = ref<Record<string, string>>({ visibility: 'hidden' });\r\nconst arrowStyle = ref<Record<string, string>>({});\r\n\r\nconst opposite: Record<TaoTooltipPosition, TaoTooltipPosition> = {\r\n top: 'bottom',\r\n bottom: 'top',\r\n left: 'right',\r\n right: 'left',\r\n};\r\n\r\nfunction hide() {\r\n showTooltip.value = false;\r\n}\r\n\r\nfunction show() {\r\n showTooltip.value = true;\r\n}\r\n\r\nfunction updatePosition() {\r\n const trigger = wrapperRef.value;\r\n const tip = tooltipRef.value;\r\n if (!trigger || !tip) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const width = tip.offsetWidth;\r\n const height = tip.offsetHeight;\r\n const gap = 8;\r\n const pad = 8;\r\n const viewW = window.innerWidth;\r\n const viewH = window.innerHeight;\r\n const space = {\r\n bottom: viewH - rect.bottom - gap - pad,\r\n top: rect.top - gap - pad,\r\n right: viewW - rect.right - gap - pad,\r\n left: rect.left - gap - pad,\r\n };\r\n\r\n let side = props.position;\r\n const need = side === 'top' || side === 'bottom' ? height : width;\r\n if (space[side] < need && space[opposite[side]] > space[side]) {\r\n side = opposite[side];\r\n }\r\n\r\n const cx = rect.left + rect.width / 2;\r\n const cy = rect.top + rect.height / 2;\r\n let top = 0;\r\n let left = 0;\r\n\r\n if (side === 'bottom') {\r\n top = rect.bottom + gap;\r\n left = cx - width / 2;\r\n } else if (side === 'top') {\r\n top = rect.top - height - gap;\r\n left = cx - width / 2;\r\n } else if (side === 'right') {\r\n top = cy - height / 2;\r\n left = rect.right + gap;\r\n } else {\r\n top = cy - height / 2;\r\n left = rect.left - width - gap;\r\n }\r\n\r\n if (left + width > viewW - pad) {\r\n left = viewW - pad - width;\r\n }\r\n if (left < pad) {\r\n left = pad;\r\n }\r\n if (top + height > viewH - pad) {\r\n top = viewH - pad - height;\r\n }\r\n if (top < pad) {\r\n top = pad;\r\n }\r\n\r\n const arrowPad = 10;\r\n if (side === 'top' || side === 'bottom') {\r\n const x = Math.min(width - arrowPad, Math.max(arrowPad, cx - left));\r\n arrowStyle.value = { left: `${x}px`, top: '' };\r\n } else {\r\n const y = Math.min(height - arrowPad, Math.max(arrowPad, cy - top));\r\n arrowStyle.value = { top: `${y}px`, left: '' };\r\n }\r\n\r\n placed.value = side;\r\n panelStyle.value = { top: `${top}px`, left: `${left}px`, visibility: 'visible' };\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (showTooltip.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(showTooltip, async (isOpen) => {\r\n if (isOpen) {\r\n await nextTick();\r\n updatePosition();\r\n requestAnimationFrame(() => updatePosition());\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n\r\nwatch(\r\n () => props.position,\r\n () => {\r\n if (showTooltip.value) {\r\n updatePosition();\r\n }\r\n },\r\n);\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(hide);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n stopFocusLoss?.();\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"wrapperRef\"\r\n class=\"tao-tooltip-wrapper\"\r\n @mouseenter=\"show\"\r\n @mouseleave=\"hide\"\r\n @focusin=\"show\"\r\n @focusout=\"hide\"\r\n >\r\n <slot />\r\n <Teleport to=\"body\">\r\n <Transition name=\"tao-tooltip-fade\">\r\n <div\r\n v-if=\"showTooltip\"\r\n ref=\"tooltipRef\"\r\n class=\"tao-tooltip\"\r\n :class=\"`tao-tooltip--${placed}`\"\r\n role=\"tooltip\"\r\n :style=\"panelStyle\"\r\n >\r\n {{ content }}\r\n <span class=\"tao-tooltip__arrow\" :style=\"arrowStyle\" aria-hidden=\"true\"></span>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.tao-tooltip {\r\n z-index: 1060;\r\n position: fixed;\r\n box-sizing: border-box;\r\n width: max-content;\r\n max-width: min(280px, calc(100vw - 16px));\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text-strong);\r\n font-size: var(--tao-font-size-xs);\r\n font-family: var(--tao-font-family);\r\n line-height: 1.3;\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-lg);\r\n pointer-events: none;\r\n}\r\n\r\n.tao-tooltip__arrow {\r\n position: absolute;\r\n width: 8px;\r\n height: 8px;\r\n background: var(--tao-color-surface-raised);\r\n}\r\n\r\n.tao-tooltip--top .tao-tooltip__arrow {\r\n top: 100%;\r\n margin-top: -4px;\r\n transform: translateX(-50%) rotate(45deg);\r\n}\r\n\r\n.tao-tooltip--bottom .tao-tooltip__arrow {\r\n bottom: 100%;\r\n margin-bottom: -4px;\r\n transform: translateX(-50%) rotate(45deg);\r\n}\r\n\r\n.tao-tooltip--left .tao-tooltip__arrow {\r\n left: 100%;\r\n margin-left: -4px;\r\n transform: translateY(-50%) rotate(45deg);\r\n}\r\n\r\n.tao-tooltip--right .tao-tooltip__arrow {\r\n right: 100%;\r\n margin-right: -4px;\r\n transform: translateY(-50%) rotate(45deg);\r\n}\r\n\r\n.tao-tooltip-fade-enter-active,\r\n.tao-tooltip-fade-leave-active {\r\n transition:\r\n opacity var(--tao-duration-base) var(--tao-ease-base),\r\n transform var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-tooltip--top.tao-tooltip-fade-enter-from,\r\n.tao-tooltip--top.tao-tooltip-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(4px);\r\n}\r\n\r\n.tao-tooltip--bottom.tao-tooltip-fade-enter-from,\r\n.tao-tooltip--bottom.tao-tooltip-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(-4px);\r\n}\r\n\r\n.tao-tooltip--left.tao-tooltip-fade-enter-from,\r\n.tao-tooltip--left.tao-tooltip-fade-leave-to {\r\n opacity: 0;\r\n transform: translateX(4px);\r\n}\r\n\r\n.tao-tooltip--right.tao-tooltip-fade-enter-from,\r\n.tao-tooltip--right.tao-tooltip-fade-leave-to {\r\n opacity: 0;\r\n transform: translateX(-4px);\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-tooltip-wrapper {\r\n display: inline-block;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoPopover' });\r\n\r\ntype TaoPopoverPosition = 'top' | 'bottom' | 'left' | 'right';\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: boolean;\r\n position?: TaoPopoverPosition;\r\n disabled?: boolean;\r\n }>(),\r\n {\r\n modelValue: undefined,\r\n position: 'bottom',\r\n disabled: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: boolean];\r\n change: [value: boolean];\r\n}>();\r\n\r\nconst triggerRef = ref<HTMLElement | null>(null);\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst internal = ref(false);\r\nconst panelStyle = ref({ top: '0px', left: '0px' });\r\nconst isControlled = computed(() => props.modelValue !== undefined);\r\nconst open = computed(() => (isControlled.value ? Boolean(props.modelValue) : internal.value));\r\n\r\nfunction setOpen(next: boolean) {\r\n if (props.disabled && next) {\r\n return;\r\n }\r\n\r\n if (!isControlled.value) {\r\n internal.value = next;\r\n }\r\n emit('update:modelValue', next);\r\n emit('change', next);\r\n}\r\n\r\nfunction toggle() {\r\n void applyOpen(!open.value);\r\n}\r\n\r\nfunction close() {\r\n void applyOpen(false);\r\n}\r\n\r\nfunction bindDismiss() {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n document.addEventListener('keydown', onDocumentKey);\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n}\r\n\r\nfunction unbindDismiss() {\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n document.removeEventListener('keydown', onDocumentKey);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n}\r\n\r\nfunction applyOpen(next: boolean) {\r\n setOpen(next);\r\n}\r\n\r\nfunction focusTrigger() {\r\n const root = triggerRef.value;\r\n const focusable = root?.querySelector<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n (focusable ?? root)?.focus?.();\r\n}\r\n\r\nfunction updatePosition() {\r\n const trigger = triggerRef.value;\r\n const panel = panelRef.value;\r\n if (typeof window === 'undefined' || !trigger || !panel) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const width = panel.offsetWidth;\r\n const height = panel.offsetHeight;\r\n const gap = 4;\r\n const pad = 8;\r\n const viewW = window.innerWidth;\r\n const viewH = window.innerHeight;\r\n\r\n const space = {\r\n bottom: viewH - rect.bottom - gap - pad,\r\n top: rect.top - gap - pad,\r\n right: viewW - rect.right - gap - pad,\r\n left: rect.left - gap - pad,\r\n };\r\n const opposite: Record<TaoPopoverPosition, TaoPopoverPosition> = {\r\n bottom: 'top',\r\n top: 'bottom',\r\n left: 'right',\r\n right: 'left',\r\n };\r\n\r\n let side = props.position;\r\n const need = side === 'top' || side === 'bottom' ? height : width;\r\n if (space[side] < need && space[opposite[side]] > space[side]) {\r\n side = opposite[side];\r\n }\r\n\r\n let top = 0;\r\n let left = 0;\r\n if (side === 'bottom') {\r\n top = rect.bottom + gap;\r\n left = rect.left;\r\n } else if (side === 'top') {\r\n top = rect.top - height - gap;\r\n left = rect.left;\r\n } else if (side === 'right') {\r\n top = rect.top;\r\n left = rect.right + gap;\r\n } else {\r\n top = rect.top;\r\n left = rect.left - width - gap;\r\n }\r\n\r\n if (left + width > viewW - pad) {\r\n left = viewW - pad - width;\r\n }\r\n if (left < pad) {\r\n left = pad;\r\n }\r\n if (top + height > viewH - pad) {\r\n top = viewH - pad - height;\r\n }\r\n if (top < pad) {\r\n top = pad;\r\n }\r\n\r\n panelStyle.value = { top: `${top}px`, left: `${left}px` };\r\n}\r\n\r\nfunction onTriggerClick() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n toggle();\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n if (triggerRef.value?.contains(target) || panelRef.value?.contains(target)) {\r\n return;\r\n }\r\n close();\r\n}\r\n\r\nfunction onDocumentKey(event: KeyboardEvent) {\r\n if (event.key !== 'Escape') {\r\n return;\r\n }\r\n event.preventDefault();\r\n close();\r\n focusTrigger();\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (open.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(\r\n open,\r\n (isOpen) => {\r\n if (isOpen) {\r\n bindDismiss();\r\n void nextTick(() => {\r\n updatePosition();\r\n panelRef.value?.focus();\r\n });\r\n return;\r\n }\r\n\r\n unbindDismiss();\r\n },\r\n { immediate: true },\r\n);\r\n\r\nonBeforeUnmount(() => {\r\n unbindDismiss();\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-popover\">\r\n <div ref=\"triggerRef\" class=\"tao-popover__trigger\" @click=\"onTriggerClick\">\r\n <slot name=\"trigger\" :open=\"open\" :toggle=\"toggle\" />\r\n </div>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"open\"\r\n ref=\"panelRef\"\r\n class=\"tao-popover__panel\"\r\n role=\"dialog\"\r\n tabindex=\"-1\"\r\n :style=\"panelStyle\"\r\n >\r\n <slot />\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.tao-popover__panel {\r\n z-index: 1050;\r\n position: fixed;\r\n min-width: 200px;\r\n max-width: min(360px, calc(100vw - 16px));\r\n padding: var(--tao-space-3);\r\n overflow: auto;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-overlay);\r\n}\r\n\r\n.tao-popover__panel:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-popover__panel:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-popover {\r\n display: inline-block;\r\n}\r\n\r\n.tao-popover__trigger {\r\n display: inline-block;\r\n}\r\n</style>\r\n","import type { ComputedRef, InjectionKey } from 'vue';\r\n\r\nexport type TaoSpoilerName = string | number;\r\n\r\nexport interface TaoSpoilerGroupContext {\r\n model: ComputedRef<TaoSpoilerName | null | undefined>;\r\n setOpen: (name: TaoSpoilerName | null) => void;\r\n}\r\n\r\nexport const spoilerGroupKey: InjectionKey<TaoSpoilerGroupContext> = Symbol('taoSpoilerGroup');\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId } from 'vue';\r\nimport { spoilerGroupKey } from '../spoiler';\r\n\r\ndefineOptions({ name: 'TaoSpoiler' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n title?: string;\r\n defaultOpen?: boolean;\r\n modelValue?: boolean;\r\n /** Ключ панели в `TaoSpoilerGroup`. Без группы не используется. */\r\n name?: string | number;\r\n }>(),\r\n {\r\n title: '',\r\n defaultOpen: false,\r\n modelValue: undefined,\r\n name: undefined,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: boolean];\r\n}>();\r\n\r\nconst panelId = useId();\r\nconst internal = ref(props.defaultOpen);\r\nconst group = inject(spoilerGroupKey, null);\r\nconst inGroup = computed(() => group !== null && props.name !== undefined && props.name !== '');\r\nconst isControlled = computed(() => props.modelValue !== undefined);\r\nconst isOpen = computed(() => {\r\n if (inGroup.value) {\r\n return group!.model.value === props.name;\r\n }\r\n return isControlled.value ? Boolean(props.modelValue) : internal.value;\r\n});\r\n\r\nfunction toggle() {\r\n if (inGroup.value) {\r\n group!.setOpen(isOpen.value ? null : (props.name as string | number));\r\n return;\r\n }\r\n\r\n const next = !isOpen.value;\r\n if (!isControlled.value) {\r\n internal.value = next;\r\n }\r\n emit('update:modelValue', next);\r\n}\r\n\r\nfunction onBeforeEnter(el: Element) {\r\n (el as HTMLElement).style.height = '0';\r\n}\r\n\r\nfunction onEnter(el: Element) {\r\n const element = el as HTMLElement;\r\n requestAnimationFrame(() => {\r\n element.style.height = `${element.scrollHeight}px`;\r\n });\r\n}\r\n\r\nfunction onAfterEnter(el: Element) {\r\n (el as HTMLElement).style.height = 'auto';\r\n}\r\n\r\nfunction onLeave(el: Element) {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n requestAnimationFrame(() => {\r\n element.style.height = '0';\r\n });\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-spoiler\">\r\n <button\r\n type=\"button\"\r\n class=\"tao-spoiler__header\"\r\n :aria-expanded=\"isOpen\"\r\n :aria-controls=\"panelId\"\r\n @click=\"toggle\"\r\n >\r\n <span class=\"tao-spoiler__icon\" :class=\"{ 'tao-spoiler__icon--open': isOpen }\">▶</span>\r\n <span v-if=\"title || $slots.title\" class=\"tao-spoiler__title\">\r\n <slot name=\"title\">{{ title }}</slot>\r\n </span>\r\n </button>\r\n <Transition\r\n name=\"tao-spoiler-slide\"\r\n @before-enter=\"onBeforeEnter\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n >\r\n <div v-if=\"isOpen\" :id=\"panelId\" class=\"tao-spoiler__content\">\r\n <div class=\"tao-spoiler__content-inner\">\r\n <slot />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-spoiler {\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-panel);\r\n overflow: hidden;\r\n}\r\n\r\n.tao-spoiler__header {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n min-height: 40px;\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n background: var(--tao-color-surface-sunken);\r\n border: none;\r\n cursor: pointer;\r\n text-align: left;\r\n}\r\n\r\n.tao-spoiler__header:hover {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-spoiler__icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n width: 1em;\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-accent);\r\n transition: transform var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-spoiler__icon--open {\r\n transform: rotate(90deg);\r\n}\r\n\r\n.tao-spoiler__title {\r\n font-weight: 500;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-spoiler__content {\r\n overflow: hidden;\r\n}\r\n\r\n.tao-spoiler-slide-enter-active,\r\n.tao-spoiler-slide-leave-active {\r\n transition: height var(--tao-duration-slow) var(--tao-ease-base);\r\n overflow: hidden;\r\n}\r\n\r\n.tao-spoiler__content-inner {\r\n padding: var(--tao-space-4);\r\n background: var(--tao-color-surface);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, provide, ref } from 'vue';\r\nimport { spoilerGroupKey, type TaoSpoilerName } from '../spoiler';\r\n\r\ndefineOptions({ name: 'TaoSpoilerGroup' });\r\n\r\nconst props = defineProps<{\r\n modelValue?: TaoSpoilerName | null;\r\n}>();\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoSpoilerName | null];\r\n change: [value: TaoSpoilerName | null];\r\n}>();\r\n\r\nconst isControlled = computed(() => props.modelValue !== undefined);\r\nconst internal = ref<TaoSpoilerName | null>(null);\r\nconst model = computed(() => (isControlled.value ? props.modelValue : internal.value));\r\n\r\nfunction setOpen(name: TaoSpoilerName | null) {\r\n if (!isControlled.value) {\r\n internal.value = name;\r\n }\r\n emit('update:modelValue', name);\r\n emit('change', name);\r\n}\r\n\r\nprovide(spoilerGroupKey, {\r\n model,\r\n setOpen,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-spoiler-group\">\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-spoiler-group {\r\n overflow: hidden;\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-panel);\r\n}\r\n\r\n.tao-spoiler-group :deep(.tao-spoiler) {\r\n border: none;\r\n border-radius: 0;\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-spoiler-group :deep(.tao-spoiler:last-child) {\r\n border-bottom: none;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoCopy' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n text: string;\r\n successMessage?: string;\r\n copyLabel?: string;\r\n /** Показать подсказку над кнопкой после копирования. */\r\n tip?: boolean;\r\n }>(),\r\n {\r\n successMessage: 'Скопировано!',\r\n copyLabel: 'Копировать',\r\n tip: true,\r\n },\r\n);\r\n\r\nconst copied = ref(false);\r\nconst triggerRef = ref<HTMLElement | null>(null);\r\nconst tipRef = ref<HTMLElement | null>(null);\r\nconst tipStyle = ref({ top: '0px', left: '0px' });\r\n\r\nlet hideTimer = 0;\r\nlet visibleObserver: IntersectionObserver | null = null;\r\n\r\nfunction hideTip() {\r\n copied.value = false;\r\n window.clearTimeout(hideTimer);\r\n hideTimer = 0;\r\n}\r\n\r\nfunction updateTipPosition() {\r\n const trigger = triggerRef.value;\r\n const tip = tipRef.value;\r\n if (!trigger || !tip) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n if (rect.width === 0 && rect.height === 0) {\r\n hideTip();\r\n return;\r\n }\r\n\r\n const gap = 8;\r\n const pad = 8;\r\n const width = tip.offsetWidth;\r\n const height = tip.offsetHeight;\r\n let left = rect.left + rect.width / 2 - width / 2;\r\n let top = rect.top - height - gap;\r\n\r\n if (left < pad) {\r\n left = pad;\r\n }\r\n if (left + width > window.innerWidth - pad) {\r\n left = window.innerWidth - pad - width;\r\n }\r\n if (top < pad) {\r\n top = rect.bottom + gap;\r\n }\r\n\r\n tipStyle.value = { top: `${top}px`, left: `${left}px` };\r\n}\r\n\r\nfunction bindTipGuards() {\r\n window.addEventListener('scroll', updateTipPosition, true);\r\n window.addEventListener('resize', updateTipPosition);\r\n}\r\n\r\nfunction unbindTipGuards() {\r\n window.removeEventListener('scroll', updateTipPosition, true);\r\n window.removeEventListener('resize', updateTipPosition);\r\n}\r\n\r\nasync function copy() {\r\n try {\r\n await navigator.clipboard.writeText(props.text);\r\n copied.value = true;\r\n window.clearTimeout(hideTimer);\r\n hideTimer = window.setTimeout(hideTip, 2000);\r\n } catch (err) {\r\n console.error('Failed to copy:', err);\r\n hideTip();\r\n }\r\n}\r\n\r\nwatch(copied, async (isCopied) => {\r\n if (!isCopied || !props.tip) {\r\n unbindTipGuards();\r\n return;\r\n }\r\n\r\n await nextTick();\r\n await nextTick();\r\n updateTipPosition();\r\n bindTipGuards();\r\n});\r\n\r\nonMounted(() => {\r\n visibleObserver = new IntersectionObserver((entries) => {\r\n if (entries.some((entry) => !entry.isIntersecting)) {\r\n hideTip();\r\n }\r\n });\r\n if (triggerRef.value) {\r\n visibleObserver.observe(triggerRef.value);\r\n }\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n hideTip();\r\n unbindTipGuards();\r\n visibleObserver?.disconnect();\r\n visibleObserver = null;\r\n});\r\n</script>\r\n\r\n<template>\r\n <span ref=\"triggerRef\" class=\"tao-copy\" :class=\"{ 'tao-copy--button': !$slots.default }\">\r\n <slot :copy=\"copy\" :copied=\"copied\">\r\n <button\r\n type=\"button\"\r\n class=\"tao-copy__button\"\r\n :class=\"{ 'tao-copy__button--copied': copied }\"\r\n :aria-label=\"copied ? successMessage : copyLabel\"\r\n @click=\"copy\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\r\n <rect\r\n x=\"8\"\r\n y=\"7\"\r\n width=\"12\"\r\n height=\"14\"\r\n rx=\"2\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n />\r\n <path\r\n d=\"M16 7V5a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h2\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n />\r\n </svg>\r\n </button>\r\n </slot>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"copied && tip && successMessage\"\r\n ref=\"tipRef\"\r\n class=\"tao-copy__tip\"\r\n role=\"status\"\r\n :style=\"tipStyle\"\r\n >\r\n {{ successMessage }}\r\n </div>\r\n </Teleport>\r\n </span>\r\n</template>\r\n\r\n<style>\r\n.tao-copy__tip {\r\n z-index: 1060;\r\n position: fixed;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n overflow: visible;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text-strong);\r\n font-size: var(--tao-font-size-xs);\r\n font-family: var(--tao-font-family);\r\n line-height: 1.3;\r\n white-space: nowrap;\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-lg);\r\n pointer-events: none;\r\n}\r\n\r\n.tao-copy__tip::after {\r\n content: '';\r\n position: absolute;\r\n top: 100%;\r\n left: 50%;\r\n width: 8px;\r\n height: 8px;\r\n margin-top: -4px;\r\n margin-left: -4px;\r\n background: var(--tao-color-surface-raised);\r\n transform: rotate(45deg);\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-copy {\r\n display: inline-flex;\r\n align-items: center;\r\n}\r\n\r\n.tao-copy--button {\r\n vertical-align: middle;\r\n}\r\n\r\n.tao-copy__button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n border-radius: var(--tao-radius-control);\r\n background: transparent;\r\n color: var(--tao-color-text-muted);\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-copy__button svg {\r\n display: block;\r\n}\r\n\r\n.tao-copy__button:hover {\r\n color: var(--tao-color-accent);\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-copy__button--copied {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-copy__button:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoContainer' });\r\n\r\ninterface Props {\r\n size?: 'wide' | 'slim' | 'ultra-slim';\r\n /** \"свободно\" болтается в разметке, без авто-центровки по горизонтали */\r\n free?: boolean;\r\n}\r\n\r\nwithDefaults(defineProps<Props>(), {\r\n size: 'wide',\r\n free: false,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-container\" :class=\"[`tao-container--${size}`, { 'tao-container--center': !free }]\">\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-container {\r\n width: 100%;\r\n}\r\n\r\n.tao-container--center {\r\n margin: 0 auto;\r\n}\r\n\r\n.tao-container--wide {\r\n max-width: 1120px;\r\n}\r\n\r\n.tao-container--slim {\r\n max-width: 500px;\r\n}\r\n\r\n.tao-container--ultra-slim {\r\n max-width: 400px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoFlex' });\r\n\r\ninterface Props {\r\n tag?: string;\r\n justify?: 'flex-start' | 'flex-end' | 'center' | 'normal' | 'space-between' | 'space-around' | 'space-evenly';\r\n align?: 'stretch' | 'flex-start' | 'center' | 'flex-end' | 'baseline';\r\n direction?: 'row' | 'row-reverse' | 'column' | 'column-reverse';\r\n wrap?: 'nowrap' | 'wrap' | 'wrap-reverse';\r\n gap?: string;\r\n}\r\n\r\nwithDefaults(defineProps<Props>(), {\r\n tag: 'div',\r\n justify: 'flex-start',\r\n align: 'stretch',\r\n direction: 'row',\r\n wrap: 'nowrap',\r\n gap: '0px',\r\n});\r\n</script>\r\n\r\n<template>\r\n <component\r\n :is=\"tag\"\r\n :style=\"{\r\n display: 'flex',\r\n justifyContent: justify,\r\n alignItems: align,\r\n flexDirection: direction,\r\n flexWrap: wrap,\r\n gap: gap,\r\n }\"\r\n >\r\n <slot />\r\n </component>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoSpace' });\r\n\r\ninterface Props {\r\n block?: boolean;\r\n expand?: boolean;\r\n vertical?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n block: false,\r\n expand: false,\r\n vertical: false,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-space\"\r\n :class=\"{ 'tao-space--vertical': props.vertical }\"\r\n :style=\"[props.block ? 'display: flex; flex-wrap: initial;' : '', props.expand ? 'width: 100%' : '']\"\r\n >\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-space {\r\n display: inline-flex;\r\n flex-wrap: wrap;\r\n column-gap: var(--tao-space-2);\r\n row-gap: var(--tao-space-2);\r\n}\r\n\r\n.tao-space--vertical {\r\n flex-direction: column;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoGrid' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Минимальная ширина плитки (auto-fill). Каталог. Игнорируется, если задан cols. */\r\n min?: string;\r\n /** Фиксированное число колонок (bento). 0 — режим min. */\r\n cols?: number;\r\n gap?: string;\r\n }>(),\r\n {\r\n min: '220px',\r\n cols: 0,\r\n gap: 'var(--tao-space-4)',\r\n },\r\n);\r\n\r\nconst isFixed = computed(() => props.cols > 0);\r\n\r\nconst gridStyle = computed(() => ({\r\n '--tao-grid-min': props.min,\r\n '--tao-grid-cols': isFixed.value ? String(props.cols) : undefined,\r\n '--tao-grid-gap': props.gap,\r\n}));\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-grid\"\r\n :class=\"{ 'tao-grid--fixed': isFixed }\"\r\n :style=\"gridStyle\"\r\n >\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-grid {\r\n container-type: inline-size;\r\n display: grid;\r\n grid-template-columns: repeat(\r\n auto-fill,\r\n minmax(min(100%, var(--tao-grid-min, 220px)), 1fr)\r\n );\r\n gap: var(--tao-grid-gap, var(--tao-space-4));\r\n}\r\n\r\n.tao-grid--fixed {\r\n grid-template-columns: repeat(var(--tao-grid-cols), minmax(0, 1fr));\r\n}\r\n\r\n@container (max-width: 560px) {\r\n .tao-grid--fixed {\r\n grid-template-columns: minmax(0, 1fr);\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoGridItem' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Сколько колонок занять. Для bento (`cols`), не для каталога (`min`). */\r\n col?: number;\r\n row?: number;\r\n }>(),\r\n {\r\n col: 1,\r\n row: 1,\r\n },\r\n);\r\n\r\nconst itemStyle = computed(() => ({\r\n '--tao-grid-col': String(Math.max(1, props.col)),\r\n '--tao-grid-row': String(Math.max(1, props.row)),\r\n}));\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-grid-item\" :style=\"itemStyle\">\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-grid-item {\r\n display: flex;\r\n flex-direction: column;\r\n min-width: 0;\r\n min-height: 0;\r\n grid-column: span var(--tao-grid-col, 1);\r\n grid-row: span var(--tao-grid-row, 1);\r\n}\r\n\r\n.tao-grid-item > * {\r\n flex: 1 1 auto;\r\n min-height: 0;\r\n width: 100%;\r\n}\r\n\r\n@container (max-width: 560px) {\r\n .tao-grid-item {\r\n grid-column: span 1;\r\n grid-row: span 1;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\r\nimport { listenFocusLoss } from '../focusLoss';\r\nimport type { TaoSplitDirection, TaoSplitUnit } from '../split';\r\n\r\ndefineOptions({ name: 'TaoSplit' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: number;\r\n direction?: TaoSplitDirection;\r\n unit?: TaoSplitUnit;\r\n min?: number;\r\n max?: number;\r\n minEnd?: number;\r\n resizable?: boolean;\r\n step?: number;\r\n }>(),\r\n {\r\n modelValue: 50,\r\n direction: 'row',\r\n unit: '%',\r\n min: 0,\r\n minEnd: 0,\r\n resizable: true,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number];\r\n}>();\r\n\r\nconst rootRef = ref<HTMLElement | null>(null);\r\nconst handleRef = ref<HTMLElement | null>(null);\r\nconst startPx = ref(0);\r\nconst available = ref(0);\r\nconst isDragging = ref(false);\r\n\r\nconst size = ref(props.modelValue);\r\n\r\nconst isRow = computed(() => props.direction === 'row');\r\nconst stepValue = computed(() => props.step ?? (props.unit === '%' ? 1 : 8));\r\nconst ariaOrientation = computed(() => (isRow.value ? 'vertical' : 'horizontal'));\r\n\r\nlet dragPointer = -1;\r\nlet dragStartPx = 0;\r\nlet dragStartCoord = 0;\r\nlet savedBodyCursor = '';\r\nlet savedHtmlCursor = '';\r\nlet savedUserSelect = '';\r\nlet resizeObserver: ResizeObserver | null = null;\r\nlet stopFocusLoss: (() => void) | undefined;\r\n\r\nfunction axisSize(el: HTMLElement) {\r\n const rect = el.getBoundingClientRect();\r\n return isRow.value ? rect.width : rect.height;\r\n}\r\n\r\nfunction measureAvailable() {\r\n if (!rootRef.value || !handleRef.value) {\r\n return 0;\r\n }\r\n return Math.max(0, axisSize(rootRef.value) - axisSize(handleRef.value));\r\n}\r\n\r\nfunction toPx(value: number, avail: number) {\r\n if (avail <= 0) {\r\n return 0;\r\n }\r\n return props.unit === '%' ? (value / 100) * avail : value;\r\n}\r\n\r\nfunction fromPx(px: number, avail: number) {\r\n if (props.unit === '%') {\r\n if (avail <= 0) {\r\n return 0;\r\n }\r\n return Math.round((px / avail) * 10000) / 100;\r\n }\r\n return Math.round(px);\r\n}\r\n\r\nfunction valuesEqual(a: number, b: number) {\r\n if (props.unit === '%') {\r\n return Math.abs(a - b) < 0.005;\r\n }\r\n return Math.round(a) === Math.round(b);\r\n}\r\n\r\nfunction clampStartPx(desiredPx: number, avail: number) {\r\n if (avail <= 0) {\r\n return 0;\r\n }\r\n\r\n const minStartPx = toPx(props.min, avail);\r\n const minEndPx = toPx(props.minEnd, avail);\r\n const maxStartPx = props.max != null ? toPx(props.max, avail) : Infinity;\r\n\r\n if (minStartPx + minEndPx > avail) {\r\n return Math.min(Math.max(desiredPx, 0), avail);\r\n }\r\n\r\n const lo = minStartPx;\r\n const hi = Math.min(maxStartPx, avail - minEndPx);\r\n return Math.min(Math.max(desiredPx, lo), Math.max(lo, hi));\r\n}\r\n\r\nfunction commit(next: number) {\r\n if (valuesEqual(next, size.value)) {\r\n size.value = next;\r\n return;\r\n }\r\n size.value = next;\r\n emit('update:modelValue', next);\r\n}\r\n\r\nfunction applyLayout(emitIfChanged: boolean) {\r\n const avail = measureAvailable();\r\n available.value = avail;\r\n const clamped = clampStartPx(toPx(size.value, avail), avail);\r\n startPx.value = clamped;\r\n const next = fromPx(clamped, avail);\r\n if (emitIfChanged) {\r\n commit(next);\r\n }\r\n}\r\n\r\nfunction isRtl() {\r\n return !!rootRef.value && getComputedStyle(rootRef.value).direction === 'rtl';\r\n}\r\n\r\nfunction applyDragCursor() {\r\n savedBodyCursor = document.body.style.cursor;\r\n savedHtmlCursor = document.documentElement.style.cursor;\r\n savedUserSelect = document.body.style.userSelect;\r\n const cursor = isRow.value ? 'col-resize' : 'row-resize';\r\n document.body.style.cursor = cursor;\r\n document.documentElement.style.cursor = cursor;\r\n document.body.style.userSelect = 'none';\r\n}\r\n\r\nfunction restoreDragCursor() {\r\n document.body.style.cursor = savedBodyCursor;\r\n document.documentElement.style.cursor = savedHtmlCursor;\r\n document.body.style.userSelect = savedUserSelect;\r\n}\r\n\r\nfunction releaseDragCapture() {\r\n const el = handleRef.value;\r\n const id = dragPointer;\r\n if (!el || id === -1) {\r\n return;\r\n }\r\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\r\n return;\r\n }\r\n try {\r\n el.releasePointerCapture(id);\r\n } catch {\r\n /* already released by the browser */\r\n }\r\n}\r\n\r\nfunction endDrag() {\r\n if (!isDragging.value) {\r\n return;\r\n }\r\n isDragging.value = false;\r\n releaseDragCapture();\r\n dragPointer = -1;\r\n restoreDragCursor();\r\n applyLayout(true);\r\n}\r\n\r\nfunction setStartFromDelta(delta: number) {\r\n const avail = measureAvailable();\r\n available.value = avail;\r\n const nextPx = clampStartPx(dragStartPx + delta, avail);\r\n startPx.value = nextPx;\r\n commit(fromPx(nextPx, avail));\r\n}\r\n\r\nfunction onPointerDown(event: PointerEvent) {\r\n if (!props.resizable || event.button !== 0 || !handleRef.value) {\r\n return;\r\n }\r\n\r\n dragPointer = event.pointerId;\r\n isDragging.value = true;\r\n dragStartPx = startPx.value;\r\n dragStartCoord = isRow.value ? event.clientX : event.clientY;\r\n applyDragCursor();\r\n event.preventDefault();\r\n try {\r\n handleRef.value.setPointerCapture(event.pointerId);\r\n } catch {\r\n /* untrusted events / capture already gone */\r\n }\r\n}\r\n\r\nfunction onPointerMove(event: PointerEvent) {\r\n if (!isDragging.value || event.pointerId !== dragPointer) {\r\n return;\r\n }\r\n const coord = isRow.value ? event.clientX : event.clientY;\r\n let delta = coord - dragStartCoord;\r\n if (isRow.value && isRtl()) {\r\n delta = -delta;\r\n }\r\n setStartFromDelta(delta);\r\n}\r\n\r\nfunction onPointerEnd(event: PointerEvent) {\r\n if (!isDragging.value) {\r\n return;\r\n }\r\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\r\n return;\r\n }\r\n endDrag();\r\n}\r\n\r\nfunction onLostPointerCapture() {\r\n endDrag();\r\n}\r\n\r\nfunction ariaMax() {\r\n const avail = available.value;\r\n if (avail <= 0) {\r\n return props.max ?? (props.unit === '%' ? 100 - props.minEnd : 0);\r\n }\r\n const maxByEnd = fromPx(Math.max(0, avail - toPx(props.minEnd, avail)), avail);\r\n if (props.max == null) {\r\n return maxByEnd;\r\n }\r\n return Math.min(props.max, maxByEnd);\r\n}\r\n\r\nconst ariaValueMin = computed(() => props.min);\r\nconst ariaValueMax = computed(() => ariaMax());\r\nconst ariaValueNow = computed(() => size.value);\r\nconst ariaValueText = computed(() => (props.unit === '%' ? `${size.value}%` : `${Math.round(size.value)}px`));\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (!props.resizable) {\r\n return;\r\n }\r\n\r\n const avail = measureAvailable();\r\n available.value = avail;\r\n\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n const nextPx = clampStartPx(toPx(props.min, avail), avail);\r\n startPx.value = nextPx;\r\n commit(fromPx(nextPx, avail));\r\n return;\r\n }\r\n\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n const nextPx = clampStartPx(toPx(ariaMax(), avail), avail);\r\n startPx.value = nextPx;\r\n commit(fromPx(nextPx, avail));\r\n return;\r\n }\r\n\r\n const primary =\r\n (isRow.value && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) ||\r\n (!isRow.value && (event.key === 'ArrowUp' || event.key === 'ArrowDown'));\r\n const secondary =\r\n (isRow.value && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) ||\r\n (!isRow.value && (event.key === 'ArrowLeft' || event.key === 'ArrowRight'));\r\n\r\n if (!primary && !secondary) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n let dir = event.key === 'ArrowRight' || event.key === 'ArrowDown' ? 1 : -1;\r\n if (isRow.value && isRtl() && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {\r\n dir = -dir;\r\n }\r\n\r\n const nextModel = size.value + dir * stepValue.value;\r\n const nextPx = clampStartPx(toPx(nextModel, avail), avail);\r\n startPx.value = nextPx;\r\n commit(fromPx(nextPx, avail));\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n value => {\r\n if (isDragging.value) {\r\n return;\r\n }\r\n if (!valuesEqual(value, size.value)) {\r\n size.value = value;\r\n applyLayout(false);\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => [props.unit, props.direction, props.min, props.max, props.minEnd, props.resizable] as const,\r\n () => {\r\n if (!isDragging.value) {\r\n applyLayout(true);\r\n }\r\n },\r\n);\r\n\r\nonMounted(() => {\r\n applyLayout(false);\r\n resizeObserver = new ResizeObserver(() => {\r\n if (isDragging.value) {\r\n return;\r\n }\r\n applyLayout(true);\r\n });\r\n if (rootRef.value) {\r\n resizeObserver.observe(rootRef.value);\r\n }\r\n stopFocusLoss = listenFocusLoss(endDrag);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n endDrag();\r\n resizeObserver?.disconnect();\r\n resizeObserver = null;\r\n stopFocusLoss?.();\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"rootRef\"\r\n class=\"tao-split\"\r\n :class=\"[\r\n `tao-split--${direction}`,\r\n {\r\n 'tao-split--fixed': !resizable,\r\n 'tao-split--dragging': isDragging,\r\n },\r\n ]\"\r\n :style=\"{ '--tao-split-start': `${startPx}px` }\"\r\n >\r\n <div class=\"tao-split__pane tao-split__pane--start\">\r\n <slot name=\"start\" />\r\n </div>\r\n <div\r\n ref=\"handleRef\"\r\n class=\"tao-split__handle\"\r\n role=\"separator\"\r\n :aria-orientation=\"ariaOrientation\"\r\n :aria-valuemin=\"ariaValueMin\"\r\n :aria-valuemax=\"ariaValueMax\"\r\n :aria-valuenow=\"ariaValueNow\"\r\n :aria-valuetext=\"ariaValueText\"\r\n :aria-disabled=\"resizable ? undefined : true\"\r\n :tabindex=\"resizable ? 0 : -1\"\r\n @pointerdown=\"onPointerDown\"\r\n @pointermove=\"onPointerMove\"\r\n @pointerup=\"onPointerEnd\"\r\n @pointercancel=\"onPointerEnd\"\r\n @lostpointercapture=\"onLostPointerCapture\"\r\n @keydown=\"onKeydown\"\r\n @dragstart.prevent\r\n />\r\n <div class=\"tao-split__pane tao-split__pane--end\">\r\n <slot name=\"end\" />\r\n </div>\r\n <div v-if=\"isDragging\" class=\"tao-split__shield\" />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-split {\r\n --tao-split-gutter: 8px;\r\n --tao-split-line: 1px;\r\n --tao-split-start: 50%;\r\n\r\n position: relative;\r\n display: flex;\r\n width: 100%;\r\n height: 100%;\r\n min-width: 0;\r\n min-height: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.tao-split--row {\r\n flex-direction: row;\r\n}\r\n\r\n.tao-split--column {\r\n flex-direction: column;\r\n}\r\n\r\n.tao-split__pane {\r\n min-width: 0;\r\n min-height: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.tao-split__pane--start {\r\n flex: 0 0 var(--tao-split-start);\r\n}\r\n\r\n.tao-split__pane--end {\r\n flex: 1 1 0%;\r\n}\r\n\r\n.tao-split__pane > :deep(.tao-split) {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.tao-split__handle {\r\n position: relative;\r\n flex: 0 0 var(--tao-split-gutter);\r\n z-index: 1;\r\n touch-action: none;\r\n user-select: none;\r\n background: transparent;\r\n}\r\n\r\n.tao-split--row > .tao-split__handle {\r\n cursor: col-resize;\r\n}\r\n\r\n.tao-split--column > .tao-split__handle {\r\n cursor: row-resize;\r\n}\r\n\r\n.tao-split--fixed > .tao-split__handle {\r\n cursor: default;\r\n}\r\n\r\n.tao-split__handle::before {\r\n content: '';\r\n position: absolute;\r\n background: var(--tao-color-border);\r\n pointer-events: none;\r\n}\r\n\r\n.tao-split--row > .tao-split__handle::before {\r\n top: 0;\r\n bottom: 0;\r\n left: 50%;\r\n width: var(--tao-split-line);\r\n transform: translateX(-50%);\r\n}\r\n\r\n.tao-split--column > .tao-split__handle::before {\r\n right: 0;\r\n left: 0;\r\n top: 50%;\r\n height: var(--tao-split-line);\r\n transform: translateY(-50%);\r\n}\r\n\r\n.tao-split__handle:hover::before,\r\n.tao-split__handle:focus-visible::before,\r\n.tao-split--dragging > .tao-split__handle::before {\r\n background: var(--tao-color-accent);\r\n}\r\n\r\n.tao-split--fixed > .tao-split__handle:hover::before {\r\n background: var(--tao-color-border);\r\n}\r\n\r\n.tao-split__handle:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-split__handle:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: -2px;\r\n}\r\n\r\n.tao-split__shield {\r\n position: absolute;\r\n inset: 0;\r\n z-index: 2;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoIcon' });\r\n\r\ninterface Props {\r\n name: string;\r\n margin?: string;\r\n size?: number;\r\n invert?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n margin: '0px',\r\n});\r\n</script>\r\n\r\n<template>\r\n <span class=\"tao-icon\">\r\n <slot name=\"prefix\" />\r\n <i\r\n class=\"tao-icon__value\"\r\n :class=\"[`icon-${props.name}`, { 'tao-icon__value--invert': props.invert }]\"\r\n :style=\"props.size ? `font-size: ${props.size}px` : ''\"\r\n />\r\n <slot name=\"postfix\" />\r\n </span>\r\n</template>\r\n\r\n<style scoped>\r\n/**\r\n * TaoIcon рендерит класс icon-<name> и полагается на внешний icon-шрифт,\r\n * который нужно подключить в проекте самостоятельно — библиотека Tao\r\n * его не поставляет. Это осознанное соглашение (см. README).\r\n */\r\n.tao-icon {\r\n display: inline-flex;\r\n}\r\n\r\n.tao-icon__value {\r\n margin: v-bind('props.margin');\r\n}\r\n\r\n.tao-icon__value--invert {\r\n filter: invert();\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoLoader' });\r\n\r\ninterface Props {\r\n color?: string;\r\n size?: number | string;\r\n inline?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n color: 'var(--tao-color-accent)',\r\n size: 80,\r\n inline: false,\r\n});\r\n\r\nconst normalizedSize = computed(() => {\r\n if (typeof props.size === 'number') {\r\n return `${props.size}px`;\r\n }\r\n return props.size;\r\n});\r\n\r\nconst dotSizeNumber = computed(() => {\r\n const baseSize = typeof props.size === 'number' ? props.size : parseInt(props.size, 10) || 80;\r\n return baseSize * 0.1625;\r\n});\r\n\r\nconst dotSize = computed(() => `${dotSizeNumber.value}px`);\r\n\r\nconst positions = computed(() => {\r\n const baseSize = typeof props.size === 'number' ? props.size : parseInt(props.size, 10) || 80;\r\n return {\r\n first: `${baseSize * 0.1}px`,\r\n third: `${baseSize * 0.4}px`,\r\n fourth: `${baseSize * 0.7}px`,\r\n animationDistance: `${baseSize * 0.3}px`,\r\n };\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-loader\" :class=\"{ 'tao-loader--inline': props.inline }\">\r\n <div\r\n class=\"tao-loader__ellipsis\"\r\n :style=\"{ width: normalizedSize, height: dotSize, marginLeft: `-${dotSizeNumber / 2}px` }\"\r\n >\r\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\r\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\r\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\r\n <div :style=\"{ background: props.color, width: dotSize, height: dotSize }\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-loader {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n text-align: center;\r\n}\r\n\r\n.tao-loader--inline {\r\n display: inline-block;\r\n width: 30px;\r\n}\r\n\r\n.tao-loader__ellipsis {\r\n display: block;\r\n position: relative;\r\n}\r\n\r\n.tao-loader__ellipsis div {\r\n position: absolute;\r\n top: 0;\r\n border-radius: var(--tao-radius-full);\r\n animation-timing-function: cubic-bezier(0, 1, 1, 0);\r\n}\r\n\r\n.tao-loader__ellipsis div:nth-child(1) {\r\n left: v-bind('positions.first');\r\n animation: tao-loader-grow 0.6s infinite;\r\n}\r\n\r\n.tao-loader__ellipsis div:nth-child(2) {\r\n left: v-bind('positions.first');\r\n animation: tao-loader-move 0.6s infinite;\r\n}\r\n\r\n.tao-loader__ellipsis div:nth-child(3) {\r\n left: v-bind('positions.third');\r\n animation: tao-loader-move 0.6s infinite;\r\n}\r\n\r\n.tao-loader__ellipsis div:nth-child(4) {\r\n left: v-bind('positions.fourth');\r\n animation: tao-loader-shrink 0.6s infinite;\r\n}\r\n\r\n@keyframes tao-loader-grow {\r\n 0% { transform: scale(0); }\r\n 100% { transform: scale(1); }\r\n}\r\n\r\n@keyframes tao-loader-shrink {\r\n 0% { transform: scale(1); }\r\n 100% { transform: scale(0); }\r\n}\r\n\r\n@keyframes tao-loader-move {\r\n 0% { transform: translate(0, 0); }\r\n 100% { transform: translate(v-bind('positions.animationDistance'), 0); }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, watch } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoImage' });\r\n\r\ninterface Props {\r\n src: string;\r\n alt?: string;\r\n pixelated?: boolean;\r\n /** Нативный `loading=\"lazy\"`. По умолчанию выкл — как обычный `<img>`. */\r\n lazy?: boolean;\r\n placeholderText?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n src: '',\r\n alt: '',\r\n pixelated: false,\r\n lazy: false,\r\n placeholderText: 'No image available',\r\n});\r\n\r\nconst emit = defineEmits(['load', 'error']);\r\n\r\nconst isLoaded = ref(false);\r\nconst hasError = ref(false);\r\n\r\nfunction handleLoad() {\r\n isLoaded.value = true;\r\n hasError.value = false;\r\n emit('load');\r\n}\r\n\r\nfunction handleError() {\r\n isLoaded.value = false;\r\n hasError.value = true;\r\n emit('error');\r\n}\r\n\r\nwatch(() => props.src, () => {\r\n isLoaded.value = false;\r\n hasError.value = false;\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-image\">\r\n <img\r\n v-if=\"src && !hasError\"\r\n :class=\"{ 'tao-image__img--hidden': !isLoaded, 'tao-image__img--pixelated': props.pixelated }\"\r\n :src=\"src\"\r\n :alt=\"alt\"\r\n :loading=\"lazy ? 'lazy' : 'eager'\"\r\n decoding=\"async\"\r\n draggable=\"false\"\r\n @load=\"handleLoad\"\r\n @error=\"handleError\"\r\n />\r\n <template v-if=\"!src || hasError\">\r\n <slot>\r\n <div class=\"tao-image__placeholder\">{{ placeholderText }}</div>\r\n </slot>\r\n </template>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-image {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n user-select: none;\r\n}\r\n\r\n.tao-image img {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n transition: opacity var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-image__img--hidden {\r\n opacity: 0;\r\n}\r\n\r\n.tao-image__img--pixelated {\r\n image-rendering: optimizeSpeed;\r\n image-rendering: -moz-crisp-edges;\r\n image-rendering: -o-crisp-edges;\r\n image-rendering: -webkit-optimize-contrast;\r\n image-rendering: pixelated;\r\n image-rendering: optimize-contrast;\r\n -ms-interpolation-mode: nearest-neighbor;\r\n}\r\n\r\n.tao-image__placeholder {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n font-size: var(--tao-font-size-sm);\r\n font-family: var(--tao-font-family);\r\n letter-spacing: 0.01rem;\r\n text-align: center;\r\n color: var(--tao-color-text-muted);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoCheckbox' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value?: boolean;\r\n modelValue?: boolean;\r\n label?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n /** Частично выбран: черта вместо квадрата. Клик ставит checked — indeterminate снимает родитель. */\r\n indeterminate?: boolean;\r\n }>(),\r\n {\r\n value: undefined,\r\n modelValue: undefined,\r\n label: '',\r\n disabled: false,\r\n error: false,\r\n indeterminate: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: boolean];\r\n change: [value: boolean];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst isChecked = computed({\r\n get: () => {\r\n if (props.modelValue !== undefined) {\r\n return props.modelValue;\r\n }\r\n return Boolean(props.value);\r\n },\r\n set: (next) => {\r\n emit('update:modelValue', next);\r\n emit('change', next);\r\n },\r\n});\r\n\r\nfunction onInputChange(event: Event) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n const target = event.target as HTMLInputElement;\r\n isChecked.value = target.checked;\r\n}\r\n\r\nconst inputRef = ref<HTMLInputElement | null>(null);\r\n\r\nwatch(\r\n [inputRef, isChecked, () => props.indeterminate],\r\n () => {\r\n const el = inputRef.value;\r\n if (!el) {\r\n return;\r\n }\r\n el.checked = isChecked.value;\r\n el.indeterminate = Boolean(props.indeterminate);\r\n },\r\n { flush: 'post' },\r\n);\r\n</script>\r\n\r\n<template>\r\n <label class=\"tao-checkbox\" :class=\"{ 'tao-checkbox--disabled': disabled }\" :for=\"controlId\">\r\n <slot name=\"pre\" :text=\"label\" />\r\n\r\n <input\r\n :id=\"controlId\"\r\n ref=\"inputRef\"\r\n class=\"tao-checkbox__input tao-sr-only\"\r\n type=\"checkbox\"\r\n :checked=\"isChecked\"\r\n :disabled=\"disabled\"\r\n :aria-checked=\"indeterminate ? 'mixed' : undefined\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n @change=\"onInputChange\"\r\n />\r\n\r\n <span class=\"tao-checkbox__box\"></span>\r\n <span v-if=\"label\" class=\"tao-checkbox__label\">{{ label }}</span>\r\n <span v-else class=\"tao-checkbox__label\"><slot /></span>\r\n\r\n <slot name=\"post\" :text=\"label\" />\r\n </label>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-checkbox {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n cursor: pointer;\r\n user-select: none;\r\n font-size: var(--tao-font-size-lg);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-checkbox__box {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n pointer-events: none;\r\n background-color: var(--tao-color-surface-raised);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-sm);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-checkbox__box::after {\r\n content: '';\r\n display: block;\r\n width: 12px;\r\n height: 12px;\r\n background-color: transparent;\r\n border-radius: 2px;\r\n transform: scale(0);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-checkbox__label {\r\n font-size: var(--tao-font-size-sm);\r\n white-space: nowrap;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-checkbox--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n.tao-checkbox__input:checked + .tao-checkbox__box,\r\n.tao-checkbox__input:indeterminate + .tao-checkbox__box {\r\n border-color: var(--tao-color-accent);\r\n background-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-checkbox__input:checked + .tao-checkbox__box::after {\r\n background-color: var(--tao-color-on-accent);\r\n transform: scale(1);\r\n}\r\n\r\n.tao-checkbox__input:indeterminate + .tao-checkbox__box::after {\r\n width: 10px;\r\n height: 2px;\r\n border-radius: 1px;\r\n background-color: var(--tao-color-on-accent);\r\n transform: scale(1);\r\n}\r\n\r\n.tao-checkbox__input:focus-visible + .tao-checkbox__box {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.tao-checkbox__input[aria-invalid='true'] + .tao-checkbox__box {\r\n border-color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, useSlots } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoTag' });\r\n\r\ninterface Props {\r\n type?: 'neutral' | 'success' | 'danger' | 'error' | 'warning' | 'info' | '';\r\n color?: string;\r\n background?: string;\r\n borderColor?: string;\r\n pointer?: boolean;\r\n closable?: boolean;\r\n closeLabel?: string;\r\n /** Без рамки, заливка остаётся. Высота как у обычного тега. */\r\n flat?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: '',\r\n pointer: false,\r\n closable: false,\r\n closeLabel: 'Убрать',\r\n flat: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n close: [event: MouseEvent];\r\n}>();\r\n\r\nconst slots = useSlots();\r\nconst tone = computed(() => (props.type === 'error' ? 'danger' : props.type));\r\nconst style = computed(() => ({\r\n color: props.color || '',\r\n background: props.background || '',\r\n 'border-color': props.flat ? 'transparent' : props.borderColor || '',\r\n}));\r\n\r\nfunction onClose(event: MouseEvent) {\r\n emit('close', event);\r\n}\r\n</script>\r\n\r\n<template>\r\n <span\r\n class=\"tao-tag\"\r\n :class=\"[\r\n tone ? `tao-tag--${tone}` : '',\r\n {\r\n 'tao-tag--pointer': pointer,\r\n 'tao-tag--closable': closable,\r\n 'tao-tag--prefix': Boolean(slots.prefix),\r\n 'tao-tag--flat': flat,\r\n },\r\n ]\"\r\n :style=\"style\"\r\n >\r\n <span v-if=\"$slots.prefix\" class=\"tao-tag__prefix\">\r\n <slot name=\"prefix\" />\r\n </span>\r\n <span class=\"tao-tag__text\"><slot /></span>\r\n <button\r\n v-if=\"closable\"\r\n type=\"button\"\r\n class=\"tao-tag__close\"\r\n :aria-label=\"closeLabel\"\r\n @click.stop=\"onClose\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"close-icon\">✕</slot>\r\n </span>\r\n </button>\r\n </span>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-tag {\r\n box-sizing: border-box;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n max-width: 100%;\r\n height: auto;\r\n margin: 0;\r\n padding: 1px var(--tao-space-2);\r\n vertical-align: middle;\r\n white-space: nowrap;\r\n text-align: start;\r\n font-size: var(--tao-font-size-xs);\r\n line-height: 1.25;\r\n color: var(--tao-color-accent);\r\n background: var(--tao-color-accent-subtle);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-sm);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-tag--pointer {\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.tao-tag--prefix {\r\n padding-block: 2px;\r\n padding-inline-start: 3px;\r\n}\r\n\r\n.tao-tag--closable {\r\n padding-inline-end: 2px;\r\n}\r\n\r\n.tao-tag__prefix {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.tao-tag__prefix :deep(.tao-avatar) {\r\n display: block;\r\n}\r\n\r\n.tao-tag__text {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.tao-tag__close {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n border-radius: var(--tao-radius-full);\r\n background: transparent;\r\n color: currentColor;\r\n opacity: 0.72;\r\n font-family: inherit;\r\n font-size: 11px;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-tag__close:hover {\r\n opacity: 1;\r\n background: color-mix(in srgb, currentColor 14%, transparent);\r\n}\r\n\r\n.tao-tag__close:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.tao-tag--neutral {\r\n color: var(--tao-color-text);\r\n background: var(--tao-color-surface-sunken);\r\n border-color: var(--tao-color-border-strong);\r\n}\r\n\r\n.tao-tag--success {\r\n color: var(--tao-color-success);\r\n background: color-mix(in srgb, var(--tao-color-success) 12%, transparent);\r\n border-color: color-mix(in srgb, var(--tao-color-success) 30%, transparent);\r\n}\r\n\r\n.tao-tag--danger,\r\n.tao-tag--error {\r\n color: var(--tao-color-danger);\r\n background: var(--tao-color-danger-subtle);\r\n border-color: color-mix(in srgb, var(--tao-color-danger) 30%, transparent);\r\n}\r\n\r\n.tao-tag--warning {\r\n color: var(--tao-color-warning);\r\n background: var(--tao-color-warning-subtle);\r\n border-color: color-mix(in srgb, var(--tao-color-warning) 30%, transparent);\r\n}\r\n\r\n.tao-tag--info {\r\n color: var(--tao-color-info);\r\n background: var(--tao-color-info-subtle);\r\n border-color: color-mix(in srgb, var(--tao-color-info) 30%, transparent);\r\n}\r\n\r\n.tao-tag--flat,\r\n.tao-tag--flat.tao-tag--neutral,\r\n.tao-tag--flat.tao-tag--success,\r\n.tao-tag--flat.tao-tag--danger,\r\n.tao-tag--flat.tao-tag--error,\r\n.tao-tag--flat.tao-tag--warning,\r\n.tao-tag--flat.tao-tag--info {\r\n border-color: transparent;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, useSlots } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoDivider' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** `solid` — обычная линия. `dashed` — пунктир. `colored` — акцент. `gap` — пустой отступ. */\r\n variant?: 'solid' | 'dashed' | 'colored' | 'gap';\r\n size?: 'small' | 'medium' | 'large' | 'big';\r\n /** Подпись посередине. Не меняет стиль линии — для этого `variant`. */\r\n text?: string;\r\n /** Плавные края линии. У `gap` ничего не делает. */\r\n fade?: boolean;\r\n }>(),\r\n {\r\n variant: 'solid',\r\n size: 'medium',\r\n text: '',\r\n fade: false,\r\n },\r\n);\r\n\r\nconst slots = useSlots();\r\nconst gapSize = computed(() => (props.size === 'big' ? 'large' : props.size));\r\nconst hasLabel = computed(() => Boolean(props.text) || Boolean(slots.default));\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-divider\"\r\n :class=\"[\r\n `tao-divider--${variant}`,\r\n {\r\n 'tao-divider--labeled': hasLabel,\r\n 'tao-divider--fade': fade && variant !== 'gap',\r\n [`tao-divider--gap-${gapSize}`]: variant === 'gap',\r\n },\r\n ]\"\r\n :role=\"variant === 'gap' && !hasLabel ? undefined : 'separator'\"\r\n :aria-hidden=\"variant === 'gap' && !hasLabel ? true : undefined\"\r\n >\r\n <span\r\n v-if=\"variant !== 'gap'\"\r\n class=\"tao-divider__line\"\r\n :class=\"{ 'tao-divider__line--start': hasLabel }\"\r\n />\r\n <span v-if=\"hasLabel\" class=\"tao-divider__text\">\r\n <slot>{{ text }}</slot>\r\n </span>\r\n <span\r\n v-if=\"variant !== 'gap' && hasLabel\"\r\n class=\"tao-divider__line tao-divider__line--end\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-divider {\r\n margin: var(--tao-space-5) 0;\r\n}\r\n\r\n.tao-divider--labeled {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.tao-divider__line {\r\n box-sizing: content-box;\r\n display: block;\r\n height: 0;\r\n min-width: 0;\r\n}\r\n\r\n.tao-divider--labeled .tao-divider__line {\r\n flex: 1;\r\n}\r\n\r\n.tao-divider:not(.tao-divider--labeled) .tao-divider__line {\r\n width: 100%;\r\n}\r\n\r\n.tao-divider__text {\r\n margin: 0 var(--tao-space-4);\r\n font-size: var(--tao-font-size-xs);\r\n font-weight: 500;\r\n line-height: 1;\r\n white-space: nowrap;\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-divider--labeled:not(.tao-divider--gap) .tao-divider__text {\r\n height: 1px;\r\n display: flex;\r\n align-items: center;\r\n overflow: visible;\r\n}\r\n\r\n.tao-divider--solid .tao-divider__line,\r\n.tao-divider--dashed .tao-divider__line {\r\n opacity: 0.2;\r\n}\r\n\r\n.tao-divider--solid .tao-divider__line {\r\n border-top: 1px solid var(--tao-gray-300);\r\n}\r\n\r\n.tao-divider--dashed .tao-divider__line {\r\n border-top: 1px dashed var(--tao-gray-300);\r\n}\r\n\r\n.tao-divider--colored .tao-divider__line {\r\n height: 1px;\r\n background: var(--tao-color-accent);\r\n}\r\n\r\n.tao-divider--colored.tao-divider--fade:not(.tao-divider--labeled) .tao-divider__line {\r\n background: linear-gradient(to right, transparent, var(--tao-color-accent), transparent);\r\n}\r\n\r\n.tao-divider--colored.tao-divider--fade.tao-divider--labeled .tao-divider__line--start {\r\n background: linear-gradient(to right, transparent, var(--tao-color-accent));\r\n}\r\n\r\n.tao-divider--colored.tao-divider--fade.tao-divider--labeled .tao-divider__line--end {\r\n background: linear-gradient(to left, transparent, var(--tao-color-accent));\r\n}\r\n\r\n.tao-divider--fade:not(.tao-divider--colored):not(.tao-divider--labeled) .tao-divider__line {\r\n mask: linear-gradient(90deg, transparent 0%, black 20%, black 80%, transparent 100%);\r\n}\r\n\r\n.tao-divider--fade:not(.tao-divider--colored) .tao-divider__line--start {\r\n mask: linear-gradient(90deg, transparent 0%, black 30%);\r\n}\r\n\r\n.tao-divider--fade:not(.tao-divider--colored) .tao-divider__line--end {\r\n mask: linear-gradient(90deg, black 70%, transparent 100%);\r\n}\r\n\r\n.tao-divider--gap {\r\n margin: 0;\r\n}\r\n\r\n.tao-divider--gap:not(.tao-divider--labeled) {\r\n height: 40px;\r\n}\r\n\r\n.tao-divider--gap-small:not(.tao-divider--labeled) {\r\n height: 20px;\r\n}\r\n\r\n.tao-divider--gap-large:not(.tao-divider--labeled),\r\n.tao-divider--gap-big:not(.tao-divider--labeled) {\r\n height: 60px;\r\n}\r\n\r\n.tao-divider--gap.tao-divider--labeled {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 40px;\r\n}\r\n\r\n.tao-divider--gap-small.tao-divider--labeled {\r\n min-height: 20px;\r\n}\r\n\r\n.tao-divider--gap-large.tao-divider--labeled,\r\n.tao-divider--gap-big.tao-divider--labeled {\r\n min-height: 60px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoFieldset' });\r\n\r\nwithDefaults(\r\n defineProps<{\r\n legend?: string;\r\n /** Подпись на верхней рамке. */\r\n align?: 'start' | 'center' | 'end';\r\n }>(),\r\n {\r\n legend: '',\r\n align: 'start',\r\n },\r\n);\r\n</script>\r\n\r\n<template>\r\n <fieldset class=\"tao-fieldset\" :class=\"`tao-fieldset--${align}`\">\r\n <legend v-if=\"legend || $slots.legend\" class=\"tao-fieldset__legend\">\r\n <slot name=\"legend\">{{ legend }}</slot>\r\n </legend>\r\n <div class=\"tao-fieldset__body\">\r\n <slot />\r\n </div>\r\n </fieldset>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-fieldset {\r\n margin: 0;\r\n min-width: 0;\r\n padding: 0 var(--tao-space-4) var(--tao-space-4);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-panel);\r\n color: var(--tao-color-text);\r\n background: transparent;\r\n}\r\n\r\n.tao-fieldset__legend {\r\n padding: 0 var(--tao-space-2);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 500;\r\n color: var(--tao-color-text);\r\n background: var(--tao-color-bg);\r\n}\r\n\r\n.tao-fieldset--start .tao-fieldset__legend {\r\n margin-inline-start: var(--tao-space-2);\r\n}\r\n\r\n.tao-fieldset--center .tao-fieldset__legend {\r\n margin-inline: auto;\r\n}\r\n\r\n.tao-fieldset--end .tao-fieldset__legend {\r\n margin-inline-start: auto;\r\n margin-inline-end: var(--tao-space-2);\r\n}\r\n\r\n.tao-fieldset__body {\r\n padding-top: var(--tao-space-3);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoAnimatedBorder' });\r\n\r\ninterface Props {\r\n borderWidth?: number;\r\n speed?: number;\r\n /** Радиус размытия glow-эффекта позади рамки, px. Работает только при light. */\r\n glow?: number;\r\n /** Добавляет мягкое свечение вокруг рамки. По умолчанию выключено —\r\n * компонент остаётся именно рамкой (переливается только контур),\r\n * без \"света\", выходящего за её пределы. */\r\n light?: boolean;\r\n}\r\n\r\nwithDefaults(defineProps<Props>(), {\r\n borderWidth: 3,\r\n speed: 6,\r\n glow: 16,\r\n light: false,\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-animated-border\"\r\n :class=\"{ 'tao-animated-border--light': light }\"\r\n :style=\"{\r\n '--tao-animated-border-width': `${borderWidth}px`,\r\n '--tao-animated-border-speed': `${speed}s`,\r\n '--tao-animated-border-glow': `${glow}px`,\r\n }\"\r\n >\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-animated-border {\r\n background: var(--tao-color-surface-raised);\r\n position: relative;\r\n z-index: 0;\r\n border-radius: var(--tao-animated-border-width);\r\n}\r\n\r\n/* Размытая копия рамки позади — даёт эффект свечения (glow).\r\n Рендерится только при light: по умолчанию компонент — просто\r\n переливающийся контур, без сияния, выходящего за его пределы. */\r\n.tao-animated-border--light::before {\r\n content: '';\r\n position: absolute;\r\n inset: calc(-1 * var(--tao-animated-border-width));\r\n background: linear-gradient(60deg, #f79533, #f37055, #ef4e7b, #a166ab, #5073b8, #1098ad, #07b39b, #6fba82);\r\n background-size: 300% 300%;\r\n border-radius: calc(2 * var(--tao-animated-border-width));\r\n filter: blur(var(--tao-animated-border-glow));\r\n opacity: 0.65;\r\n z-index: -2;\r\n animation: tao-animated-border-gradient var(--tao-animated-border-speed) ease alternate infinite;\r\n}\r\n\r\n/* Сама рамка: заливка на всю область, но CSS mask вырезает внутреннюю\r\n часть — остаётся только полоса шириной borderWidth по периметру,\r\n поэтому получается контур, а не закрашенный прямоугольник. */\r\n.tao-animated-border::after {\r\n content: '';\r\n position: absolute;\r\n inset: calc(-1 * var(--tao-animated-border-width));\r\n background: linear-gradient(60deg, #f79533, #f37055, #ef4e7b, #a166ab, #5073b8, #1098ad, #07b39b, #6fba82);\r\n background-size: 300% 300%;\r\n border-radius: calc(2 * var(--tao-animated-border-width));\r\n padding: var(--tao-animated-border-width);\r\n -webkit-mask:\r\n linear-gradient(#000 0 0) content-box,\r\n linear-gradient(#000 0 0);\r\n -webkit-mask-composite: xor;\r\n mask:\r\n linear-gradient(#000 0 0) content-box,\r\n linear-gradient(#000 0 0);\r\n mask-composite: exclude;\r\n z-index: -1;\r\n animation: tao-animated-border-gradient var(--tao-animated-border-speed) ease alternate infinite;\r\n}\r\n\r\n@keyframes tao-animated-border-gradient {\r\n 0% {\r\n background-position: 0% 50%;\r\n }\r\n 50% {\r\n background-position: 100% 50%;\r\n }\r\n 100% {\r\n background-position: 0% 50%;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onMounted, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoTextarea' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n placeholder?: string;\r\n spellcheck?: boolean;\r\n autocomplete?: string;\r\n minlength?: number;\r\n maxlength?: number;\r\n disabled?: boolean;\r\n noSpace?: boolean;\r\n dummy?: boolean;\r\n rows?: number;\r\n resize?: boolean;\r\n modelValue?: string;\r\n noBorder?: boolean;\r\n noBackground?: boolean;\r\n autoFocus?: boolean;\r\n borderInverse?: boolean;\r\n textCenter?: boolean;\r\n submitOnEnter?: boolean;\r\n error?: boolean;\r\n id?: string;\r\n /** Показать «введено / максимум» под полем. Имеет смысл вместе с `maxlength`. */\r\n count?: boolean;\r\n }>(),\r\n {\r\n placeholder: '',\r\n spellcheck: true,\r\n autocomplete: '',\r\n minlength: 0,\r\n maxlength: undefined,\r\n disabled: false,\r\n noSpace: false,\r\n dummy: false,\r\n rows: 3,\r\n resize: true,\r\n modelValue: '',\r\n noBorder: false,\r\n noBackground: false,\r\n autoFocus: false,\r\n borderInverse: false,\r\n textCenter: false,\r\n submitOnEnter: false,\r\n error: false,\r\n count: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits(['update:modelValue', 'change', 'focus', 'blur', 'keydown']);\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => props.id || field?.id || localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst counterId = computed(() => `${controlId.value}-count`);\r\nconst describedBy = computed(() => {\r\n const ids = [field?.describedBy.value, props.count ? counterId.value : undefined].filter(Boolean);\r\n return ids.length ? ids.join(' ') : undefined;\r\n});\r\n\r\nconst currentLength = computed(() => String(props.modelValue ?? '').length);\r\nconst countLabel = computed(() => {\r\n if (props.maxlength != null && props.maxlength > 0) {\r\n return `${currentLength.value} / ${props.maxlength}`;\r\n }\r\n return String(currentLength.value);\r\n});\r\nconst atLimit = computed(\r\n () => props.maxlength != null && props.maxlength > 0 && currentLength.value >= props.maxlength,\r\n);\r\n\r\nconst textareaRef = ref<HTMLTextAreaElement | null>(null);\r\n\r\nfunction onInput(e: Event) {\r\n const target = e.target as HTMLTextAreaElement;\r\n emit('update:modelValue', target.value);\r\n autoResize();\r\n}\r\n\r\nfunction onChange(e: Event) {\r\n emit('change', (e.target as HTMLTextAreaElement).value);\r\n}\r\n\r\nfunction onFocus(e: FocusEvent) {\r\n emit('focus', e);\r\n}\r\n\r\nfunction onBlur(e: FocusEvent) {\r\n emit('blur', e);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n emit('keydown', event);\r\n\r\n if (props.submitOnEnter && event.key === 'Enter' && !event.shiftKey) {\r\n textareaRef.value?.blur();\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (props.noSpace && event.key === ' ') {\r\n event.preventDefault();\r\n }\r\n}\r\n\r\nfunction autoResize() {\r\n const textarea = textareaRef.value;\r\n if (!textarea) {\r\n return;\r\n }\r\n\r\n textarea.style.height = 'auto';\r\n textarea.style.height = `${Math.min(textarea.scrollHeight, 500)}px`;\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n () => {\r\n nextTick(autoResize);\r\n },\r\n);\r\n\r\nonMounted(() => {\r\n if (props.autoFocus) {\r\n textareaRef.value?.focus();\r\n }\r\n nextTick(autoResize);\r\n});\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"dummy\" class=\"tao-textarea tao-textarea--dummy\">{{ modelValue }}</span>\r\n <div v-else class=\"tao-textarea-wrap\">\r\n <textarea\r\n :id=\"controlId\"\r\n ref=\"textareaRef\"\r\n class=\"tao-textarea\"\r\n :class=\"{\r\n 'tao-textarea--inverse': borderInverse,\r\n 'tao-textarea--center': textCenter,\r\n 'tao-textarea--no-border': noBorder,\r\n 'tao-textarea--no-background': noBackground,\r\n 'tao-textarea--no-resize': !resize,\r\n 'tao-textarea--invalid': invalid,\r\n }\"\r\n :placeholder=\"placeholder\"\r\n :spellcheck=\"spellcheck\"\r\n :autocomplete=\"autocomplete\"\r\n :minlength=\"minlength\"\r\n :maxlength=\"maxlength\"\r\n :disabled=\"disabled\"\r\n :rows=\"rows\"\r\n :value=\"modelValue\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n draggable=\"false\"\r\n @input=\"onInput\"\r\n @change=\"onChange\"\r\n @focus=\"onFocus\"\r\n @blur=\"onBlur\"\r\n @keydown=\"onKeydown\"\r\n ></textarea>\r\n <span\r\n v-if=\"count\"\r\n :id=\"counterId\"\r\n class=\"tao-textarea__count\"\r\n :class=\"{ 'tao-textarea__count--limit': atLimit }\"\r\n >{{ countLabel }}</span>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-textarea-wrap {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n width: 100%;\r\n}\r\n\r\n.tao-textarea {\r\n width: 100%;\r\n min-height: 31px;\r\n height: auto;\r\n padding: var(--tao-space-2);\r\n font-size: var(--tao-font-size-sm);\r\n font-family: var(--tao-font-family);\r\n letter-spacing: 0.01rem;\r\n line-height: 1.4;\r\n border: none;\r\n border-left: 4px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-sm);\r\n background-color: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n outline: none;\r\n resize: vertical;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-textarea::placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-textarea:focus {\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-textarea--invalid {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-textarea--inverse {\r\n border-left: none;\r\n border-right: 4px solid var(--tao-color-border-strong);\r\n}\r\n\r\n.tao-textarea--center {\r\n text-align: center;\r\n}\r\n\r\n.tao-textarea--no-border {\r\n border: none;\r\n}\r\n\r\n.tao-textarea--no-background {\r\n background-color: transparent;\r\n}\r\n\r\n.tao-textarea--no-resize {\r\n resize: none;\r\n}\r\n\r\n.tao-textarea--dummy {\r\n display: block;\r\n min-height: 31px;\r\n height: auto;\r\n border-color: var(--tao-color-danger);\r\n white-space: pre-wrap;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.tao-textarea__count {\r\n align-self: flex-end;\r\n font-size: var(--tao-font-size-xs);\r\n line-height: 1;\r\n color: var(--tao-color-text-muted);\r\n font-variant-numeric: tabular-nums;\r\n user-select: none;\r\n}\r\n\r\n.tao-textarea__count--limit {\r\n color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, reactive, onBeforeMount, onBeforeUnmount } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoScrollTop' });\r\n\r\ninterface Props {\r\n size?: number;\r\n right?: string | number;\r\n bottom?: string | number;\r\n zIndex?: number;\r\n boundary?: number;\r\n hasOutline?: boolean;\r\n tabindex?: number;\r\n ariaLabel?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n size: 40,\r\n right: 24,\r\n bottom: 24,\r\n zIndex: 1000,\r\n boundary: 300,\r\n hasOutline: true,\r\n tabindex: 0,\r\n ariaLabel: 'Наверх',\r\n});\r\n\r\nconst RIPPLE_DURATION = 750;\r\nconst fmtProp = (value: number | string, unit = 'px') => (typeof value === 'number' ? value + unit : value);\r\n\r\nlet prevPos = 0;\r\nlet activeBack = false;\r\n\r\nconst mainStyle = reactive({\r\n width: fmtProp(props.size),\r\n height: fmtProp(props.size),\r\n right: fmtProp(props.right),\r\n bottom: fmtProp(props.bottom),\r\n zIndex: props.zIndex,\r\n});\r\n\r\nconst rippleStyle = reactive({\r\n top: fmtProp(-1 * props.size),\r\n left: fmtProp(-1 * props.size),\r\n width: '200%',\r\n height: '200%',\r\n});\r\n\r\nconst isActive = ref(false);\r\nconst isRippleActive = ref(false);\r\n\r\nfunction getScrollValue() {\r\n if (typeof window.pageYOffset !== 'undefined') {\r\n return window.pageYOffset;\r\n }\r\n if (typeof document.compatMode !== 'undefined' && document.compatMode !== 'BackCompat') {\r\n return document.documentElement.scrollTop;\r\n }\r\n return document.body.scrollTop;\r\n}\r\n\r\nfunction goToTop() {\r\n const c = getScrollValue();\r\n if (c > 0) {\r\n window.requestAnimationFrame(goToTop);\r\n window.scrollTo(0, c - Math.max(10, c / 8));\r\n }\r\n}\r\n\r\nfunction onScroll() {\r\n const pY = getScrollValue();\r\n const tooFar = pY > props.boundary;\r\n const goBack = prevPos > pY;\r\n\r\n if (activeBack) {\r\n if (!goBack && pY - prevPos > 15) {\r\n activeBack = false;\r\n }\r\n } else {\r\n activeBack = prevPos - pY >= 20;\r\n if (activeBack && pY - props.boundary < 150) {\r\n activeBack = false;\r\n }\r\n }\r\n\r\n prevPos = pY;\r\n isActive.value = tooFar && activeBack;\r\n}\r\n\r\nfunction onClick(e: MouseEvent) {\r\n if (!isRippleActive.value) {\r\n const elTarget = e.currentTarget as HTMLElement;\r\n if (elTarget) {\r\n const rect = elTarget.getBoundingClientRect();\r\n const top = e.clientY - rect.top;\r\n const left = e.clientX - rect.left;\r\n rippleStyle.top = fmtProp(top - props.size);\r\n rippleStyle.left = fmtProp(left - props.size);\r\n }\r\n\r\n isRippleActive.value = true;\r\n setTimeout(() => {\r\n isRippleActive.value = false;\r\n }, RIPPLE_DURATION);\r\n }\r\n\r\n goToTop();\r\n}\r\n\r\nonBeforeMount(() => {\r\n window.addEventListener('scroll', onScroll);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('scroll', onScroll);\r\n});\r\n</script>\r\n\r\n<template>\r\n <Transition name=\"tao-scroll-top-fade\">\r\n <button\r\n v-if=\"isActive\"\r\n type=\"button\"\r\n :style=\"mainStyle\"\r\n :tabindex=\"props.tabindex\"\r\n class=\"tao-scroll-top\"\r\n :class=\"{ 'tao-scroll-top--no-outline': !props.hasOutline }\"\r\n :aria-label=\"props.ariaLabel\"\r\n @click.prevent=\"onClick\"\r\n >\r\n <div class=\"tao-scroll-top__content\">\r\n <div :class=\"{ 'tao-scroll-top__ripple--active': isRippleActive }\" :style=\"rippleStyle\" class=\"tao-scroll-top__ripple\" />\r\n <slot>\r\n <svg class=\"tao-scroll-top__icon\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M12 6l-7 7 1.4 1.4L12 8.8l5.6 5.6L19 13z\" />\r\n </svg>\r\n </slot>\r\n </div>\r\n </button>\r\n </Transition>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-scroll-top {\r\n overflow: hidden;\r\n position: fixed;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 0;\r\n cursor: pointer;\r\n color: var(--tao-color-on-accent);\r\n background-color: var(--tao-color-accent);\r\n border: none;\r\n border-radius: var(--tao-radius-full);\r\n box-shadow: var(--tao-shadow-md);\r\n user-select: none;\r\n}\r\n\r\n.tao-scroll-top:hover {\r\n background-color: var(--tao-color-accent-hover);\r\n}\r\n\r\n.tao-scroll-top--no-outline {\r\n outline: none;\r\n}\r\n\r\n.tao-scroll-top__content {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.tao-scroll-top__icon {\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n.tao-scroll-top__ripple {\r\n position: absolute;\r\n border-radius: var(--tao-radius-full);\r\n background-color: var(--tao-color-accent-subtle-hover);\r\n transform: scale(0);\r\n opacity: 0;\r\n pointer-events: none;\r\n}\r\n\r\n.tao-scroll-top__ripple--active {\r\n animation: tao-scroll-top-ripple 0.75s ease-out;\r\n}\r\n\r\n.tao-scroll-top-fade-enter-active,\r\n.tao-scroll-top-fade-leave-active {\r\n transition: opacity var(--tao-duration-base) var(--tao-ease-base),\r\n transform var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-scroll-top-fade-enter-from,\r\n.tao-scroll-top-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(40px);\r\n}\r\n\r\n@keyframes tao-scroll-top-ripple {\r\n from {\r\n opacity: 1;\r\n }\r\n to {\r\n transform: scale(2);\r\n opacity: 0;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, useSlots } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoProgress' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n minWidth?: number;\r\n maxWidth?: number;\r\n /** @deprecated используйте minWidth */\r\n min?: number;\r\n /** @deprecated используйте maxWidth */\r\n max?: number;\r\n progress?: number;\r\n height?: number;\r\n /** `true` / `top` — по центру над полосой, `right` — справа. Если есть `#right`, процент справа в скобках. `false` — скрыть. */\r\n showPercentage?: boolean | 'top' | 'right';\r\n animated?: boolean;\r\n }>(),\r\n {\r\n minWidth: undefined,\r\n maxWidth: undefined,\r\n min: undefined,\r\n max: undefined,\r\n progress: 0,\r\n height: 8,\r\n showPercentage: true,\r\n animated: true,\r\n },\r\n);\r\n\r\nconst slots = useSlots();\r\nconst minW = computed(() => props.minWidth ?? props.min ?? 200);\r\nconst maxW = computed(() => props.maxWidth ?? props.max ?? 400);\r\nconst hasRight = computed(() => Boolean(slots.right));\r\nconst percentPlace = computed((): 'top' | 'right' | null => {\r\n if (!props.showPercentage) {\r\n return null;\r\n }\r\n return props.showPercentage === 'right' ? 'right' : 'top';\r\n});\r\nconst showOverPercent = computed(() => percentPlace.value === 'top');\r\nconst showEndPercent = computed(() => percentPlace.value === 'right');\r\nconst endPercentLabel = computed(() =>\r\n hasRight.value ? `(${props.progress}%)` : `${props.progress}%`,\r\n);\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-progress\">\r\n <div\r\n class=\"tao-progress__container\"\r\n :class=\"{ 'tao-progress__container--over': showOverPercent }\"\r\n :style=\"{ minWidth: `${minW}px`, maxWidth: `${maxW}px` }\"\r\n >\r\n <div v-if=\"$slots.left\" class=\"tao-progress__side\">\r\n <slot name=\"left\" />\r\n </div>\r\n\r\n <div class=\"tao-progress__main\">\r\n <span v-if=\"showOverPercent\" class=\"tao-progress__percentage\">{{ progress }}%</span>\r\n <div class=\"tao-progress__track\" :style=\"{ height: `${height}px` }\">\r\n <div\r\n class=\"tao-progress__fill\"\r\n :class=\"{ 'tao-progress__fill--animated': animated }\"\r\n :style=\"{ width: `${progress}%` }\"\r\n ></div>\r\n </div>\r\n </div>\r\n\r\n <div v-if=\"$slots.right || showEndPercent\" class=\"tao-progress__side\">\r\n <slot name=\"right\" />\r\n <span v-if=\"showEndPercent\" class=\"tao-progress__percentage\">{{ endPercentLabel }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-progress {\r\n width: 100%;\r\n}\r\n\r\n.tao-progress__container {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-3);\r\n width: 100%;\r\n}\r\n\r\n.tao-progress__container--over {\r\n align-items: flex-end;\r\n}\r\n\r\n.tao-progress__main {\r\n flex: 1;\r\n min-width: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n}\r\n\r\n.tao-progress__track {\r\n width: 100%;\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-sm);\r\n background-color: var(--tao-color-surface-sunken);\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n\r\n.tao-progress__fill {\r\n height: 100%;\r\n border-radius: var(--tao-radius-sm);\r\n transition: width var(--tao-duration-slow) var(--tao-ease-base);\r\n background: var(--tao-color-accent);\r\n}\r\n\r\n.tao-progress__side {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: baseline;\r\n gap: var(--tao-space-1);\r\n font-size: var(--tao-font-size-xs);\r\n font-variant-numeric: tabular-nums;\r\n line-height: 1;\r\n white-space: nowrap;\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-progress__percentage {\r\n font-weight: 600;\r\n font-variant-numeric: tabular-nums;\r\n font-size: var(--tao-font-size-xs);\r\n line-height: 1;\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-progress__main > .tao-progress__percentage {\r\n width: 100%;\r\n text-align: center;\r\n}\r\n\r\n.tao-progress__fill--animated {\r\n background: linear-gradient(\r\n 90deg,\r\n var(--tao-color-accent) 0%,\r\n var(--tao-color-accent-hover) 50%,\r\n var(--tao-color-accent) 100%\r\n );\r\n background-size: 200% 100%;\r\n animation: tao-progress-shimmer 2s infinite;\r\n}\r\n\r\n@keyframes tao-progress-shimmer {\r\n 0% { background-position: -200% 0; }\r\n 100% { background-position: 200% 0; }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, onBeforeUnmount, onMounted, ref, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { listenFocusLoss } from '../focusLoss';\r\n\r\ndefineOptions({ name: 'TaoSlider' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n showValue?: boolean;\r\n placeholder?: string;\r\n modelValue: number | string;\r\n disabled?: boolean;\r\n /** `medium` — форм-контрол. `small` — тонкий трек (seek, громкость). */\r\n size?: 'small' | 'medium';\r\n /** Шаг изменения значения при прокрутке колёсика мыши. 0 — отключено. */\r\n wheel?: number;\r\n }>(),\r\n {\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n showValue: false,\r\n placeholder: '',\r\n disabled: false,\r\n size: 'medium',\r\n wheel: 0,\r\n },\r\n);\r\n\r\nconst emit = defineEmits(['update:modelValue']);\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nfunction packModelValue(value: number): string | number {\r\n return typeof props.modelValue === 'string' ? `${value}` : value;\r\n}\r\n\r\nfunction unpackModelValue(): number {\r\n const raw = typeof props.modelValue === 'string' ? parseFloat(props.modelValue) : props.modelValue;\r\n return Number.isFinite(raw) ? raw : props.min;\r\n}\r\n\r\nconst current = computed(() => unpackModelValue());\r\n\r\nconst trackRef = ref<HTMLElement | null>(null);\r\nconst isDragging = ref(false);\r\nlet dragPointer = -1;\r\n\r\nconst shadowInputRef = ref<HTMLInputElement | null>(null);\r\nconst shadowModel = ref('0');\r\nconst showShadowModel = ref(false);\r\n\r\nconst progressPercent = computed(() => {\r\n const range = props.max - props.min;\r\n if (range <= 0) {\r\n return 0;\r\n }\r\n return ((current.value - props.min) / range) * 100;\r\n});\r\n\r\nfunction clampValue(v: number) {\r\n return Math.min(Math.max(v, props.min), props.max);\r\n}\r\n\r\nfunction commit(value: number) {\r\n emit('update:modelValue', packModelValue(clampValue(value)));\r\n}\r\n\r\nfunction calculateValue(event: PointerEvent): number {\r\n if (!trackRef.value) {\r\n return props.min;\r\n }\r\n\r\n const rect = trackRef.value.getBoundingClientRect();\r\n const x = Math.min(Math.max(event.clientX - rect.left, 0), rect.width);\r\n const ratio = rect.width ? x / rect.width : 0;\r\n\r\n const v = props.min + ratio * (props.max - props.min);\r\n return clampValue(Math.round((v - props.min) / props.step) * props.step + props.min);\r\n}\r\n\r\nfunction releaseDragCapture() {\r\n const el = trackRef.value;\r\n const id = dragPointer;\r\n if (!el || id === -1) {\r\n return;\r\n }\r\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\r\n return;\r\n }\r\n try {\r\n el.releasePointerCapture(id);\r\n } catch {\r\n /* already released by the browser */\r\n }\r\n}\r\n\r\nfunction endDrag() {\r\n if (!isDragging.value) {\r\n return;\r\n }\r\n isDragging.value = false;\r\n releaseDragCapture();\r\n dragPointer = -1;\r\n}\r\n\r\nfunction onPointerDown(event: PointerEvent) {\r\n if (props.disabled || showShadowModel.value || event.button !== 0 || !trackRef.value) {\r\n return;\r\n }\r\n\r\n dragPointer = event.pointerId;\r\n isDragging.value = true;\r\n commit(calculateValue(event));\r\n event.preventDefault();\r\n try {\r\n trackRef.value.setPointerCapture(event.pointerId);\r\n } catch {\r\n /* untrusted events / capture already gone */\r\n }\r\n}\r\n\r\nfunction onPointerMove(event: PointerEvent) {\r\n if (!isDragging.value || event.pointerId !== dragPointer) {\r\n return;\r\n }\r\n commit(calculateValue(event));\r\n}\r\n\r\nfunction onPointerEnd(event: PointerEvent) {\r\n if (!isDragging.value) {\r\n return;\r\n }\r\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\r\n return;\r\n }\r\n endDrag();\r\n}\r\n\r\nfunction onLostPointerCapture() {\r\n endDrag();\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (props.disabled || showShadowModel.value) {\r\n return;\r\n }\r\n\r\n const keys: Record<string, number> = {\r\n ArrowLeft: -props.step,\r\n ArrowDown: -props.step,\r\n ArrowRight: props.step,\r\n ArrowUp: props.step,\r\n PageDown: -props.step * 10,\r\n PageUp: props.step * 10,\r\n };\r\n\r\n if (event.key in keys) {\r\n event.preventDefault();\r\n commit(current.value + keys[event.key]!);\r\n return;\r\n }\r\n\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n commit(props.min);\r\n return;\r\n }\r\n\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n commit(props.max);\r\n }\r\n}\r\n\r\nfunction onWheel(event: WheelEvent) {\r\n if (props.disabled || props.wheel <= 0 || showShadowModel.value) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const delta = event.deltaY < 0 ? props.wheel : -props.wheel;\r\n commit(current.value + delta);\r\n}\r\n\r\nfunction onBlurShadowModel() {\r\n if (shadowModel.value) {\r\n const newValue = packModelValue(clampValue(parseFloat(shadowModel.value) || 0));\r\n shadowModel.value = `${newValue}`;\r\n emit('update:modelValue', newValue);\r\n }\r\n showShadowModel.value = false;\r\n}\r\n\r\nfunction onShadowKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Enter') {\r\n shadowInputRef.value?.blur();\r\n }\r\n}\r\n\r\nfunction onContextMenu() {\r\n if (props.disabled || !props.showValue) {\r\n return;\r\n }\r\n shadowModel.value = `${props.modelValue}`;\r\n showShadowModel.value = true;\r\n requestAnimationFrame(() => shadowInputRef.value?.focus());\r\n}\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\n\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(endDrag);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n endDrag();\r\n stopFocusLoss?.();\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n :id=\"controlId\"\r\n ref=\"trackRef\"\r\n class=\"tao-slider\"\r\n :class=\"[\r\n `tao-slider--${size}`,\r\n { 'tao-slider--show-value': showValue, 'tao-slider--disabled': disabled },\r\n ]\"\r\n role=\"slider\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n :aria-valuemin=\"min\"\r\n :aria-valuemax=\"max\"\r\n :aria-valuenow=\"current\"\r\n :aria-disabled=\"disabled || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n @contextmenu.prevent=\"onContextMenu\"\r\n @pointerdown=\"onPointerDown\"\r\n @pointermove=\"onPointerMove\"\r\n @pointerup=\"onPointerEnd\"\r\n @pointercancel=\"onPointerEnd\"\r\n @lostpointercapture=\"onLostPointerCapture\"\r\n @keydown=\"onKeydown\"\r\n @wheel=\"onWheel\"\r\n >\r\n <div class=\"tao-slider__track\"></div>\r\n <div class=\"tao-slider__fill\" :style=\"{ width: `${progressPercent}%` }\"></div>\r\n <div class=\"tao-slider__thumb\" :style=\"{ left: `${progressPercent}%` }\"></div>\r\n\r\n <input\r\n v-if=\"showShadowModel\"\r\n ref=\"shadowInputRef\"\r\n v-model=\"shadowModel\"\r\n type=\"number\"\r\n inputmode=\"numeric\"\r\n :placeholder=\"placeholder\"\r\n class=\"tao-slider__shadow-input\"\r\n @blur=\"onBlurShadowModel\"\r\n @keydown=\"onShadowKeydown\"\r\n @pointerdown.stop\r\n />\r\n <div v-else-if=\"showValue\" class=\"tao-slider__value\">\r\n <slot name=\"pre-value\" />{{ modelValue }}<slot name=\"post-value\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-slider {\r\n --tao-slider-hit: 14px;\r\n --tao-slider-track: var(--tao-slider-hit);\r\n --tao-slider-thumb: 20px;\r\n\r\n position: relative;\r\n width: 100%;\r\n height: var(--tao-slider-hit);\r\n cursor: pointer;\r\n user-select: none;\r\n touch-action: none;\r\n}\r\n\r\n.tao-slider:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-slider:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 4px;\r\n border-radius: var(--tao-radius-sm);\r\n}\r\n\r\n.tao-slider--show-value {\r\n --tao-slider-hit: 20px;\r\n}\r\n\r\n/* Тонкий трек, hit-area шире картинки — seek / громкость. */\r\n.tao-slider--small {\r\n --tao-slider-hit: 16px;\r\n --tao-slider-track: 4px;\r\n --tao-slider-thumb: 12px;\r\n}\r\n\r\n.tao-slider--small.tao-slider--show-value {\r\n --tao-slider-hit: 20px;\r\n}\r\n\r\n.tao-slider--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n.tao-slider--disabled .tao-slider__thumb {\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-slider__track,\r\n.tao-slider__fill {\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n height: var(--tao-slider-track);\r\n border-radius: var(--tao-radius-sm);\r\n transform: translateY(-50%);\r\n}\r\n\r\n.tao-slider__track {\r\n width: 100%;\r\n background-color: var(--tao-color-surface-sunken);\r\n}\r\n\r\n.tao-slider__fill {\r\n background-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-slider--small .tao-slider__track,\r\n.tao-slider--small .tao-slider__fill {\r\n border-radius: var(--tao-radius-full);\r\n}\r\n\r\n.tao-slider__thumb {\r\n position: absolute;\r\n top: 50%;\r\n width: var(--tao-slider-thumb);\r\n height: var(--tao-slider-thumb);\r\n background-color: var(--tao-color-accent);\r\n border: 2px solid var(--tao-color-surface-sunken);\r\n border-radius: var(--tao-radius-full);\r\n transform: translate(-50%, -50%);\r\n cursor: grab;\r\n}\r\n\r\n.tao-slider__thumb:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.tao-slider__value,\r\n.tao-slider__shadow-input {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 900;\r\n letter-spacing: 0.05em;\r\n}\r\n\r\n.tao-slider__value {\r\n color: var(--tao-color-text-strong);\r\n text-shadow: -1px -1px 0 var(--tao-color-bg), 1px -1px 0 var(--tao-color-bg),\r\n -1px 1px 0 var(--tao-color-bg), 1px 1px 0 var(--tao-color-bg);\r\n}\r\n\r\n.tao-slider__shadow-input {\r\n text-align: center;\r\n border: none;\r\n background: transparent;\r\n color: var(--tao-color-text-strong);\r\n font-family: inherit;\r\n outline: none;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { onBeforeUnmount, onMounted, ref } from 'vue';\r\nimport { listenFocusLoss } from '../focusLoss';\r\n\r\ndefineOptions({ name: 'TaoFileDrop' });\r\n\r\ninterface Props {\r\n /** Текущий список файлов — компонент сам не хранит состояние\r\n * количества файлов, оно всегда отражает то, что передал родитель.\r\n * Это и даёт возможность подтверждения: родитель решает, когда\r\n * именно менять modelValue (сразу или после ответа в модалке). */\r\n modelValue?: File[];\r\n size?: 'small' | 'medium' | 'large';\r\n accept?: string;\r\n multiple?: boolean;\r\n showClear?: boolean;\r\n clearLabel?: string;\r\n /** Шаблон aria для крестика файла. `{name}` — имя файла. */\r\n removeLabel?: string;\r\n formatSize?: (bytes: number) => string;\r\n /** Имена выбранных файлов под зоной. Снять файл — сразу в `v-model`. */\r\n list?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: () => [],\r\n size: 'medium',\r\n accept: '*',\r\n multiple: false,\r\n showClear: false,\r\n clearLabel: 'Очистить файлы',\r\n removeLabel: 'Убрать «{name}»',\r\n list: true,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [files: File[]];\r\n files: [files: File[]];\r\n /** Запрос на очистку — компонент НЕ очищает себя сам. Родитель решает:\r\n * очистить сразу (emit → v-model = []) или сперва показать модалку\r\n * подтверждения и очистить только после ответа пользователя. */\r\n 'clear-request': [];\r\n}>();\r\n\r\nconst isDragging = ref(false);\r\nconst fileInput = ref<HTMLInputElement | null>(null);\r\n\r\nfunction sameFile(a: File, b: File) {\r\n return a.name === b.name && a.size === b.size && a.lastModified === b.lastModified;\r\n}\r\n\r\nfunction acceptTokens(accept: string) {\r\n return accept\r\n .split(',')\r\n .map((token) => token.trim().toLowerCase())\r\n .filter(Boolean);\r\n}\r\n\r\nfunction fileMatchesAccept(file: File, accept: string) {\r\n const tokens = acceptTokens(accept);\r\n if (!tokens.length || tokens.includes('*') || tokens.includes('*/*')) {\r\n return true;\r\n }\r\n\r\n const name = file.name.toLowerCase();\r\n const mime = (file.type || '').toLowerCase();\r\n const dot = name.lastIndexOf('.');\r\n const ext = dot >= 0 ? name.slice(dot) : '';\r\n\r\n return tokens.some((token) => {\r\n if (token.startsWith('.')) {\r\n return ext === token;\r\n }\r\n if (token.endsWith('/*')) {\r\n return mime.startsWith(token.slice(0, -1));\r\n }\r\n return mime === token;\r\n });\r\n}\r\n\r\nfunction commit(files: File[]) {\r\n emit('update:modelValue', files);\r\n emit('files', files);\r\n}\r\n\r\nfunction handleDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n isDragging.value = true;\r\n}\r\n\r\nfunction handleDragLeave() {\r\n isDragging.value = false;\r\n}\r\n\r\nfunction handleDrop(event: DragEvent) {\r\n event.preventDefault();\r\n isDragging.value = false;\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n processFiles(files);\r\n }\r\n}\r\n\r\nfunction handleFileSelect(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n processFiles(input.files);\r\n }\r\n}\r\n\r\nfunction requestClear() {\r\n emit('clear-request');\r\n}\r\n\r\nfunction removeAt(index: number) {\r\n commit(props.modelValue.filter((_, item) => item !== index));\r\n}\r\n\r\nfunction resetInput() {\r\n const el = fileInput.value;\r\n if (el) {\r\n el.type = 'text';\r\n el.type = 'file';\r\n }\r\n}\r\n\r\nfunction processFiles(fileList: FileList) {\r\n const incoming = Array.from(fileList).filter((file) => fileMatchesAccept(file, props.accept));\r\n if (!incoming.length) {\r\n resetInput();\r\n return;\r\n }\r\n\r\n let result: File[];\r\n if (!props.multiple) {\r\n result = [incoming[0]!];\r\n } else {\r\n result = [...props.modelValue];\r\n for (const file of incoming) {\r\n if (!result.some((item) => sameFile(item, file))) {\r\n result.push(file);\r\n }\r\n }\r\n }\r\n\r\n commit(result);\r\n resetInput();\r\n}\r\n\r\nfunction defaultFormatSize(bytes: number) {\r\n if (bytes < 1024) {\r\n return `${bytes} Б`;\r\n }\r\n const kb = bytes / 1024;\r\n if (kb < 1024) {\r\n const value = kb < 10 ? kb.toFixed(1) : String(Math.round(kb));\r\n return `${value.replace('.', ',')} КБ`;\r\n }\r\n const mb = kb / 1024;\r\n const value = mb < 10 ? mb.toFixed(1) : String(Math.round(mb));\r\n return `${value.replace('.', ',')} МБ`;\r\n}\r\n\r\nfunction sizeLabel(bytes: number) {\r\n return props.formatSize ? props.formatSize(bytes) : defaultFormatSize(bytes);\r\n}\r\n\r\nfunction fileKey(file: File, index: number) {\r\n return `${file.name}-${file.size}-${file.lastModified}-${index}`;\r\n}\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(() => {\r\n isDragging.value = false;\r\n });\r\n});\r\nonBeforeUnmount(() => stopFocusLoss?.());\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-file-drop\">\r\n <div class=\"tao-file-drop__row\">\r\n <button\r\n v-if=\"showClear && modelValue.length\"\r\n type=\"button\"\r\n class=\"tao-file-drop__clear\"\r\n :aria-label=\"clearLabel\"\r\n @click=\"requestClear\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"clear-icon\">✕</slot>\r\n </span>\r\n </button>\r\n\r\n <label\r\n class=\"tao-file-drop__zone\"\r\n :class=\"[`tao-file-drop__zone--${size}`, { 'tao-file-drop__zone--dragging': isDragging }]\"\r\n @dragover=\"handleDragOver\"\r\n @dragleave=\"handleDragLeave\"\r\n @drop=\"handleDrop\"\r\n >\r\n <slot>Перетащите файл сюда или нажмите, чтобы выбрать</slot>\r\n\r\n <input\r\n ref=\"fileInput\"\r\n class=\"tao-sr-only\"\r\n type=\"file\"\r\n :accept=\"accept\"\r\n :multiple=\"multiple\"\r\n @change=\"handleFileSelect\"\r\n @click.stop\r\n />\r\n </label>\r\n </div>\r\n\r\n <ul v-if=\"list && modelValue.length\" class=\"tao-file-drop__list\">\r\n <li v-for=\"(file, index) in modelValue\" :key=\"fileKey(file, index)\" class=\"tao-file-drop__file\">\r\n <span class=\"tao-file-drop__name\">{{ file.name }}</span>\r\n <span class=\"tao-file-drop__meta\">{{ sizeLabel(file.size) }}</span>\r\n <button\r\n type=\"button\"\r\n class=\"tao-file-drop__remove\"\r\n :aria-label=\"removeLabel.replace('{name}', file.name)\"\r\n @click=\"removeAt(index)\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"remove-icon\">✕</slot>\r\n </span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-file-drop {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-2);\r\n user-select: none;\r\n}\r\n\r\n.tao-file-drop__row {\r\n display: flex;\r\n gap: var(--tao-space-3);\r\n}\r\n\r\n.tao-file-drop__clear {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 55px;\r\n text-align: center;\r\n border: 2px dashed var(--tao-color-danger);\r\n border-radius: var(--tao-radius-panel);\r\n color: var(--tao-color-danger);\r\n background-color: var(--tao-color-danger-subtle);\r\n cursor: pointer;\r\n font-family: inherit;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-file-drop__clear:hover {\r\n background-color: color-mix(in srgb, var(--tao-color-danger) 22%, transparent);\r\n}\r\n\r\n.tao-file-drop__zone {\r\n flex-grow: 1;\r\n font-size: var(--tao-font-size-sm);\r\n font-family: var(--tao-font-family);\r\n letter-spacing: 0.01rem;\r\n text-align: center;\r\n color: var(--tao-color-text-muted);\r\n border: 2px dashed var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-panel);\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-file-drop__zone:hover,\r\n.tao-file-drop__zone:focus-within {\r\n background-color: var(--tao-color-accent-subtle);\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-file-drop__zone--dragging {\r\n border-color: var(--tao-color-text-strong);\r\n background-color: var(--tao-color-surface-sunken);\r\n}\r\n\r\n.tao-file-drop__zone--small {\r\n padding: var(--tao-space-5) var(--tao-space-4);\r\n}\r\n\r\n.tao-file-drop__zone--medium {\r\n padding: var(--tao-space-8) var(--tao-space-5);\r\n}\r\n\r\n.tao-file-drop__zone--large {\r\n padding: var(--tao-space-10) var(--tao-space-6);\r\n}\r\n\r\n.tao-file-drop__list {\r\n margin: 0;\r\n padding: 0;\r\n overflow: hidden;\r\n list-style: none;\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-file-drop__file {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n min-width: 0;\r\n min-height: 36px;\r\n padding: 0 var(--tao-space-2) 0 var(--tao-space-3);\r\n border-bottom: 1px solid var(--tao-color-border);\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-file-drop__file:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.tao-file-drop__name {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n overflow: hidden;\r\n font-size: var(--tao-font-size-sm);\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n user-select: text;\r\n}\r\n\r\n.tao-file-drop__meta {\r\n flex-shrink: 0;\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-file-drop__remove {\r\n flex-shrink: 0;\r\n width: 28px;\r\n height: 28px;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n border-radius: var(--tao-radius-sm);\r\n background: none;\r\n color: var(--tao-color-text-muted);\r\n font: inherit;\r\n font-size: var(--tao-font-size-sm);\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-file-drop__remove:hover {\r\n color: var(--tao-color-danger);\r\n background: var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-file-drop__remove:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, onMounted, reactive, ref } from 'vue';\r\nimport type { TaoDropdownAction } from '../dropdown';\r\n\r\ndefineOptions({ name: 'TaoDropdownMenu' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n actions?: TaoDropdownAction[];\r\n menuLabel?: string;\r\n }>(),\r\n {\r\n actions: () => [],\r\n menuLabel: 'Меню',\r\n },\r\n);\r\n\r\nconst emit = defineEmits(['selected']);\r\n\r\nconst menuRef = ref<HTMLElement | null>(null);\r\nconst listRef = ref<HTMLElement | null>(null);\r\nconst triggerRef = ref<HTMLButtonElement | null>(null);\r\nconst isOpen = ref(false);\r\nconst activeIndex = ref(0);\r\nconst listPosition = reactive({ top: '0', left: '0' });\r\n\r\nfunction updatePosition() {\r\n const trigger = triggerRef.value;\r\n const list = listRef.value;\r\n if (!trigger || !list || !isOpen.value) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const listWidth = list.offsetWidth;\r\n const listHeight = list.offsetHeight;\r\n let left = rect.right - listWidth;\r\n let top = rect.bottom + 4;\r\n\r\n if (left < 8) {\r\n left = rect.left;\r\n }\r\n if (left + listWidth > window.innerWidth - 8) {\r\n left = Math.max(8, window.innerWidth - listWidth - 8);\r\n }\r\n if (top + listHeight > window.innerHeight - 8 && rect.top > listHeight) {\r\n top = rect.top - listHeight - 4;\r\n }\r\n\r\n listPosition.top = `${top}px`;\r\n listPosition.left = `${left}px`;\r\n}\r\n\r\nasync function setOpen(next: boolean) {\r\n isOpen.value = next;\r\n if (!next) {\r\n return;\r\n }\r\n activeIndex.value = 0;\r\n await nextTick();\r\n updatePosition();\r\n listRef.value?.focus();\r\n}\r\n\r\nfunction toggleMenu() {\r\n void setOpen(!isOpen.value);\r\n}\r\n\r\nfunction closeMenu() {\r\n if (!isOpen.value) {\r\n return;\r\n }\r\n isOpen.value = false;\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction emitAction(id: string) {\r\n isOpen.value = false;\r\n emit('selected', id);\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n if (menuRef.value?.contains(target) || listRef.value?.contains(target)) {\r\n return;\r\n }\r\n isOpen.value = false;\r\n}\r\n\r\nfunction onWinScroll() {\r\n if (isOpen.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nfunction onListKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n closeMenu();\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n if (!props.actions.length) {\r\n return;\r\n }\r\n activeIndex.value = (activeIndex.value + 1) % props.actions.length;\r\n return;\r\n }\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n if (!props.actions.length) {\r\n return;\r\n }\r\n activeIndex.value = (activeIndex.value - 1 + props.actions.length) % props.actions.length;\r\n return;\r\n }\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n const action = props.actions[activeIndex.value];\r\n if (action) {\r\n emitAction(action.id);\r\n }\r\n }\r\n}\r\n\r\nonMounted(() => {\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n window.addEventListener('scroll', onWinScroll, true);\r\n window.addEventListener('resize', updatePosition);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('scroll', onWinScroll, true);\r\n window.removeEventListener('resize', updatePosition);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div ref=\"menuRef\" class=\"tao-dropdown-menu\">\r\n <button\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n class=\"tao-dropdown-menu__button\"\r\n aria-haspopup=\"menu\"\r\n :aria-expanded=\"isOpen\"\r\n :aria-label=\"$slots.button ? undefined : menuLabel\"\r\n @click=\"toggleMenu\"\r\n >\r\n <slot v-if=\"$slots.button\" name=\"button\" />\r\n <span v-else aria-hidden=\"true\">\r\n <slot name=\"icon\">⋮</slot>\r\n </span>\r\n </button>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"isOpen\"\r\n ref=\"listRef\"\r\n class=\"tao-dropdown-menu__list\"\r\n role=\"menu\"\r\n tabindex=\"-1\"\r\n :style=\"listPosition\"\r\n @keydown=\"onListKeydown\"\r\n >\r\n <button\r\n v-for=\"(action, index) in actions\"\r\n :key=\"action.id\"\r\n type=\"button\"\r\n class=\"tao-dropdown-menu__item\"\r\n :class=\"{ 'tao-dropdown-menu__item--active': index === activeIndex }\"\r\n role=\"menuitem\"\r\n @click=\"emitAction(action.id)\"\r\n @mouseenter=\"activeIndex = index\"\r\n >\r\n <slot v-if=\"$slots.item\" name=\"item\" :id=\"action.id\" :ico=\"action.ico\" :text=\"action.name\" />\r\n <span v-else>{{ action.name }}</span>\r\n </button>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.tao-dropdown-menu__list {\r\n z-index: 1050;\r\n position: fixed;\r\n min-width: 120px;\r\n display: flex;\r\n flex-direction: column;\r\n font-size: var(--tao-font-size-md);\r\n color: var(--tao-color-text);\r\n background-color: var(--tao-color-surface-raised);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-md);\r\n}\r\n\r\n.tao-dropdown-menu__list:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-dropdown-menu__list .tao-dropdown-menu__item {\r\n position: relative;\r\n padding: var(--tao-space-2) var(--tao-space-4);\r\n border: none;\r\n border-radius: 0;\r\n background: none;\r\n color: inherit;\r\n font: inherit;\r\n text-align: left;\r\n white-space: nowrap;\r\n cursor: pointer;\r\n user-select: none;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-dropdown-menu__list .tao-dropdown-menu__item:not(:last-child)::after {\r\n content: '';\r\n position: absolute;\r\n right: var(--tao-space-2);\r\n bottom: 0;\r\n left: var(--tao-space-2);\r\n height: 1px;\r\n background: var(--tao-color-border);\r\n pointer-events: none;\r\n}\r\n\r\n.tao-dropdown-menu__list .tao-dropdown-menu__item:hover,\r\n.tao-dropdown-menu__list .tao-dropdown-menu__item--active {\r\n color: var(--tao-color-accent);\r\n background-color: var(--tao-color-surface-hover);\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-dropdown-menu {\r\n position: relative;\r\n display: inline-block;\r\n}\r\n\r\n.tao-dropdown-menu__button {\r\n padding: var(--tao-space-2);\r\n color: var(--tao-color-text);\r\n border: none;\r\n border-radius: var(--tao-radius-control);\r\n background: none;\r\n cursor: pointer;\r\n user-select: none;\r\n font: inherit;\r\n line-height: 1;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-dropdown-menu__button:hover {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-dropdown-menu__button:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoPinCode' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n length: number;\r\n hidden?: boolean;\r\n placeholder?: string;\r\n modelValue?: string;\r\n numbersOnly?: boolean;\r\n /** `focus` — клик сбрасывает ячейку и все справа (неверный код, набор заново).\r\n * `input` — цифра остаётся, пока не введут новую. */\r\n clearOn?: 'focus' | 'input';\r\n }>(),\r\n {\r\n hidden: false,\r\n placeholder: '',\r\n modelValue: '',\r\n numbersOnly: false,\r\n clearOn: 'focus',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string];\r\n change: [value: string];\r\n complete: [value: string];\r\n active: [el: HTMLInputElement | null, index: number];\r\n blur: [];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst numbers = ref<string[]>([]);\r\nconst inputRefs = ref<(HTMLInputElement | null)[]>([]);\r\nconst activeNumber = ref(-1);\r\n\r\nfunction acceptChar(ch: string): string {\r\n if (!ch) {\r\n return '';\r\n }\r\n if (props.numbersOnly && !/^[0-9]$/.test(ch)) {\r\n return '';\r\n }\r\n return ch;\r\n}\r\n\r\nfunction cellsFromModel(value: string): string[] {\r\n const raw = value ?? '';\r\n return Array.from({ length: props.length }, (_, index) => acceptChar(raw[index] ?? ''));\r\n}\r\n\r\nfunction serialize(): string {\r\n return numbers.value.join('');\r\n}\r\n\r\nfunction emitChange() {\r\n const next = serialize();\r\n if (next !== (props.modelValue ?? '')) {\r\n emit('update:modelValue', next);\r\n emit('change', next);\r\n }\r\n}\r\n\r\nfunction firstEmptyIndex(): number {\r\n const index = numbers.value.findIndex((cell) => !cell);\r\n return index === -1 ? numbers.value.length : index;\r\n}\r\n\r\nfunction focusCell(index: number) {\r\n inputRefs.value[index]?.focus();\r\n}\r\n\r\nfunction isFilled(): boolean {\r\n return numbers.value.length === props.length && numbers.value.every((cell) => cell !== '');\r\n}\r\n\r\nfunction applyChars(index: number, raw: string) {\r\n const chars = [...raw].map((ch) => acceptChar(ch)).filter(Boolean);\r\n if (!chars.length) {\r\n return;\r\n }\r\n\r\n numbers.value = [...numbers.value];\r\n let cursor = index;\r\n for (const ch of chars) {\r\n if (cursor >= props.length) {\r\n break;\r\n }\r\n numbers.value[cursor] = ch;\r\n cursor += 1;\r\n }\r\n emitChange();\r\n\r\n if (isFilled()) {\r\n inputRefs.value[index]?.blur();\r\n emit('complete', serialize());\r\n return;\r\n }\r\n\r\n if (cursor < props.length) {\r\n focusCell(cursor);\r\n }\r\n}\r\n\r\nfunction mutation(v: string, index: number) {\r\n if (v.length > 1) {\r\n applyChars(index, v);\r\n return;\r\n }\r\n\r\n const next = acceptChar(v);\r\n\r\n if (props.numbersOnly && v && !next) {\r\n const el = inputRefs.value[index];\r\n if (el) {\r\n el.value = numbers.value[index] ?? '';\r\n }\r\n return;\r\n }\r\n\r\n numbers.value = [...numbers.value];\r\n numbers.value[index] = next;\r\n emitChange();\r\n\r\n if (!next) {\r\n return;\r\n }\r\n\r\n if (isFilled()) {\r\n inputRefs.value[index]?.blur();\r\n emit('complete', serialize());\r\n return;\r\n }\r\n\r\n const nextEmpty = numbers.value.findIndex((cell, cellIndex) => cellIndex > index && !cell);\r\n const target = nextEmpty !== -1 ? nextEmpty : index + 1;\r\n if (target < props.length) {\r\n focusCell(target);\r\n }\r\n}\r\n\r\nfunction onPaste(event: ClipboardEvent, index: number) {\r\n const text = event.clipboardData?.getData('text') ?? '';\r\n if (!text) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n applyChars(index, text);\r\n}\r\n\r\nfunction onFocus(index: number) {\r\n if (props.clearOn === 'input') {\r\n const firstEmpty = firstEmptyIndex();\r\n if (firstEmpty < props.length && index > firstEmpty) {\r\n focusCell(firstEmpty);\r\n return;\r\n }\r\n\r\n activeNumber.value = index;\r\n emit('active', inputRefs.value[index] ?? null, index);\r\n requestAnimationFrame(() => inputRefs.value[index]?.select());\r\n return;\r\n }\r\n\r\n numbers.value = numbers.value.map((cell, cellIndex) => (cellIndex >= index ? '' : cell));\r\n activeNumber.value = index;\r\n emitChange();\r\n emit('active', inputRefs.value[index] ?? null, index);\r\n}\r\n\r\nfunction onChange(e: Event, index: number) {\r\n mutation((e.target as HTMLInputElement).value, index);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent, index: number) {\r\n if (event.key !== 'Backspace') {\r\n return;\r\n }\r\n\r\n if (numbers.value[index]) {\r\n return;\r\n }\r\n\r\n if (index > 0) {\r\n event.preventDefault();\r\n numbers.value = [...numbers.value];\r\n numbers.value[index - 1] = '';\r\n focusCell(index - 1);\r\n activeNumber.value = index - 1;\r\n emitChange();\r\n }\r\n}\r\n\r\nfunction onBlur() {\r\n requestAnimationFrame(() => {\r\n const active = document.activeElement;\r\n if (!inputRefs.value.includes(active as HTMLInputElement | null)) {\r\n activeNumber.value = -1;\r\n emit('blur');\r\n }\r\n });\r\n}\r\n\r\nwatch(\r\n () => [props.modelValue, props.length, props.numbersOnly] as const,\r\n () => {\r\n const next = cellsFromModel(props.modelValue ?? '');\r\n if (next.join('') !== numbers.value.join('') || next.length !== numbers.value.length) {\r\n numbers.value = next;\r\n }\r\n },\r\n { immediate: true },\r\n);\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-pin-code\"\r\n role=\"group\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n >\r\n <input\r\n v-for=\"(num, index) of numbers\"\r\n :id=\"index === 0 ? controlId : undefined\"\r\n :key=\"index\"\r\n :ref=\"(el) => (inputRefs[index] = el as HTMLInputElement)\"\r\n class=\"tao-pin-code__value\"\r\n :class=\"{\r\n 'tao-pin-code__value--active': activeNumber === index,\r\n 'tao-pin-code__value--invalid': invalid,\r\n }\"\r\n :value=\"num\"\r\n :placeholder=\"placeholder\"\r\n :type=\"hidden ? 'password' : 'text'\"\r\n :inputmode=\"numbersOnly ? 'numeric' : 'text'\"\r\n :pattern=\"numbersOnly ? '[0-9]' : undefined\"\r\n autocomplete=\"one-time-code\"\r\n :maxlength=\"index === 0 ? length : 1\"\r\n @input=\"onChange($event, index)\"\r\n @paste=\"onPaste($event, index)\"\r\n @keydown=\"onKeydown($event, index)\"\r\n @focus=\"onFocus(index)\"\r\n @blur=\"onBlur\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-pin-code {\r\n display: inline-flex;\r\n user-select: none;\r\n}\r\n\r\n.tao-pin-code__value {\r\n width: 50px;\r\n height: 56px;\r\n margin: 2px;\r\n border: 3px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-md);\r\n font-size: 21px;\r\n font-weight: 500;\r\n font-family: inherit;\r\n text-align: center;\r\n letter-spacing: 0;\r\n color: var(--tao-color-accent);\r\n background: var(--tao-color-input-bg);\r\n transition: var(--tao-transition-base);\r\n cursor: text;\r\n outline: none;\r\n}\r\n\r\n.tao-pin-code__value--active,\r\n.tao-pin-code__value:focus {\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-pin-code__value--invalid {\r\n border-color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, getCurrentInstance } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoLink' });\r\n\r\ninterface Props {\r\n to?: string | Record<string, unknown>;\r\n asNewTab?: boolean;\r\n private?: boolean;\r\n exactPath?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n to: undefined,\r\n asNewTab: false,\r\n private: false,\r\n exactPath: false,\r\n});\r\n\r\nconst globals = getCurrentInstance()?.appContext.components ?? {};\r\n\r\n// NuxtLink (Nuxt) → RouterLink (vue-router) → <a>.\r\n// Nuxt первым: это обёртка над RouterLink с prefetch.\r\n// Ищем в глобальном реестре, а не через resolveComponent — иначе Vue\r\n// пишет warning, если Nuxt/vue-router в проекте нет.\r\nconst linkKind = globals.NuxtLink ? 'nuxt' : globals.RouterLink ? 'router' : 'a';\r\nconst linkComponent =\r\n linkKind === 'nuxt' ? globals.NuxtLink : linkKind === 'router' ? globals.RouterLink : 'a';\r\n\r\nconst linkProps = computed(() => {\r\n const target = props.asNewTab ? '_blank' : undefined;\r\n const rel = (props.private && 'noopener noreferrer') || (props.asNewTab && 'noopener') || undefined;\r\n\r\n if (linkKind === 'a') {\r\n return {\r\n href: typeof props.to === 'string' ? props.to : undefined,\r\n target,\r\n rel,\r\n };\r\n }\r\n\r\n return {\r\n to: props.to,\r\n target,\r\n rel,\r\n ...(linkKind === 'nuxt' ? { exactPath: props.exactPath } : {}),\r\n };\r\n});\r\n</script>\r\n\r\n<template>\r\n <component :is=\"linkComponent\" v-bind=\"linkProps\" draggable=\"false\">\r\n <slot />\r\n </component>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, provide, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoFormField' });\r\n\r\nconst props = defineProps<{\r\n label?: string;\r\n hint?: string;\r\n error?: string;\r\n}>();\r\n\r\nconst id = useId();\r\nconst hintId = `${id}-hint`;\r\nconst errorId = `${id}-error`;\r\nconst labelId = `${id}-label`;\r\nconst invalid = computed(() => Boolean(props.error));\r\nconst describedBy = computed(() => {\r\n if (props.error) {\r\n return errorId;\r\n }\r\n\r\n if (props.hint) {\r\n return hintId;\r\n }\r\n\r\n return undefined;\r\n});\r\n\r\nprovide(formFieldKey, {\r\n id,\r\n invalid,\r\n describedBy,\r\n});\r\n\r\nfunction onLabelClick() {\r\n const target = document.getElementById(id);\r\n if (\r\n target instanceof HTMLInputElement ||\r\n target instanceof HTMLButtonElement ||\r\n target instanceof HTMLSelectElement ||\r\n target instanceof HTMLTextAreaElement\r\n ) {\r\n return;\r\n }\r\n\r\n const scope = target ?? document.getElementById(labelId)?.parentElement;\r\n scope\r\n ?.querySelector<HTMLElement>(\r\n 'input:not([disabled]), button:not([disabled]), textarea:not([disabled]), select:not([disabled])',\r\n )\r\n ?.focus();\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-form-field\" :class=\"{ 'tao-form-field--invalid': invalid }\">\r\n <label v-if=\"label\" :id=\"labelId\" class=\"tao-form-field__label\" :for=\"id\" @click=\"onLabelClick\">{{ label }}</label>\r\n <slot />\r\n <p v-if=\"error\" :id=\"errorId\" class=\"tao-form-field__error\">{{ error }}</p>\r\n <p v-else-if=\"hint\" :id=\"hintId\" class=\"tao-form-field__hint\">{{ hint }}</p>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-form-field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n width: 100%;\r\n}\r\n\r\n.tao-form-field__label {\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text);\r\n font-weight: 500;\r\n}\r\n\r\n.tao-form-field__hint {\r\n margin: 0;\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-form-field__error {\r\n margin: 0;\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport type { TaoSelectOption } from '../select';\r\n\r\ndefineOptions({ name: 'TaoSelect' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | number | null;\r\n options?: TaoSelectOption[];\r\n placeholder?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n /** Label of the clear row in the list. Slot `#clear` replaces it (icon, markup). / Подпись пункта сброса; слот `#clear` заменяет её (иконка, разметка). */\r\n clearText?: string;\r\n /**\r\n * Whether the value can be cleared: shows the clear row and enables Delete / Backspace.\r\n * Turn off when null is not a valid value (grid step, sort order).\r\n * Можно ли очистить значение: показывает пункт сброса и включает Delete / Backspace.\r\n * Выключайте, когда null не допустим (шаг сетки, порядок сортировки).\r\n */\r\n clearable?: boolean;\r\n /** Control size, same scale as TaoButton. / Размер контрола, шкала как у TaoButton. */\r\n size?: 'small' | 'medium' | 'large';\r\n }>(),\r\n {\r\n modelValue: null,\r\n options: () => [],\r\n placeholder: 'Выберите',\r\n disabled: false,\r\n error: false,\r\n clearText: 'Очистить',\r\n clearable: true,\r\n size: 'medium',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number | null];\r\n change: [value: string | number | null];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst listId = `${localId}-list`;\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst open = ref(false);\r\nconst activeIndex = ref(-1);\r\nconst triggerRef = ref<HTMLButtonElement | null>(null);\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst listRef = ref<HTMLElement | null>(null);\r\nconst listStyle = ref({ top: '0px', left: '0px', width: '0px' });\r\n\r\nconst selected = computed(() => props.options.find((option) => option.value === props.modelValue) ?? null);\r\nconst enabledIndexes = computed(() =>\r\n props.options.map((option, index) => (option.disabled ? -1 : index)).filter((index) => index >= 0),\r\n);\r\n\r\nfunction updatePosition() {\r\n const trigger = triggerRef.value;\r\n const panel = panelRef.value;\r\n\r\n if (!trigger || !panel) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const panelHeight = panel.offsetHeight;\r\n const panelWidth = panel.offsetWidth || rect.width;\r\n const gap = 4;\r\n const pad = 8;\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\r\n const maxLeft = Math.max(pad, window.innerWidth - panelWidth - pad);\r\n const left = Math.min(Math.max(rect.left, pad), maxLeft);\r\n\r\n listStyle.value = {\r\n top: `${openUp ? rect.top - panelHeight - gap : rect.bottom + gap}px`,\r\n left: `${left}px`,\r\n width: `${rect.width}px`,\r\n };\r\n}\r\n\r\nasync function setOpen(next: boolean) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n open.value = next;\r\n\r\n if (!next) {\r\n return;\r\n }\r\n\r\n const selectedIndex = props.options.findIndex((option) => option.value === props.modelValue);\r\n activeIndex.value =\r\n selectedIndex >= 0 && enabledIndexes.value.includes(selectedIndex)\r\n ? selectedIndex\r\n : (enabledIndexes.value[0] ?? -1);\r\n await nextTick();\r\n updatePosition();\r\n listRef.value?.focus();\r\n scrollActiveIntoView();\r\n}\r\n\r\nfunction toggle() {\r\n void setOpen(!open.value);\r\n}\r\n\r\nfunction close() {\r\n open.value = false;\r\n}\r\n\r\nfunction selectOption(option: TaoSelectOption) {\r\n if (option.disabled) {\r\n return;\r\n }\r\n\r\n emit('update:modelValue', option.value);\r\n emit('change', option.value);\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction clear() {\r\n emit('update:modelValue', null);\r\n emit('change', null);\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction moveActive(delta: number) {\r\n const enabled = enabledIndexes.value;\r\n\r\n if (!enabled.length) {\r\n return;\r\n }\r\n\r\n const currentPos = enabled.indexOf(activeIndex.value);\r\n const nextPos = currentPos < 0 ? 0 : (currentPos + delta + enabled.length) % enabled.length;\r\n activeIndex.value = enabled[nextPos];\r\n scrollActiveIntoView();\r\n}\r\n\r\nfunction scrollActiveIntoView() {\r\n const list = listRef.value;\r\n\r\n if (!list || activeIndex.value < 0) {\r\n return;\r\n }\r\n\r\n const option = list.querySelector<HTMLElement>(`[data-tao-select-index=\"${activeIndex.value}\"]`);\r\n option?.scrollIntoView({ block: 'nearest' });\r\n}\r\n\r\nfunction onTriggerKeydown(event: KeyboardEvent) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n if ((event.key === 'Backspace' || event.key === 'Delete') && selected.value && props.clearable) {\r\n event.preventDefault();\r\n clear();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n void setOpen(true);\r\n }\r\n}\r\n\r\nfunction onListKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n close();\r\n triggerRef.value?.focus();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n moveActive(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n moveActive(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n activeIndex.value = enabledIndexes.value[0] ?? -1;\r\n scrollActiveIntoView();\r\n return;\r\n }\r\n\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n activeIndex.value = enabledIndexes.value[enabledIndexes.value.length - 1] ?? -1;\r\n scrollActiveIntoView();\r\n return;\r\n }\r\n\r\n if (event.key === 'Backspace' || event.key === 'Delete') {\r\n if (selected.value && props.clearable) {\r\n event.preventDefault();\r\n clear();\r\n }\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n const option = props.options[activeIndex.value];\r\n\r\n if (option) {\r\n selectOption(option);\r\n }\r\n }\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n\r\n if (triggerRef.value?.contains(target) || panelRef.value?.contains(target)) {\r\n return;\r\n }\r\n\r\n close();\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (open.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(open, (isOpen) => {\r\n if (isOpen) {\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-select\" :class=\"[`tao-select--${size}`, { 'tao-select--open': open, 'tao-select--invalid': invalid }]\">\r\n <button\r\n :id=\"controlId\"\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n class=\"tao-select__trigger\"\r\n :class=\"{ 'tao-select__trigger--placeholder': !selected }\"\r\n role=\"combobox\"\r\n :aria-expanded=\"open\"\r\n aria-haspopup=\"listbox\"\r\n :aria-controls=\"listId\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :disabled=\"disabled\"\r\n @click=\"toggle\"\r\n @keydown=\"onTriggerKeydown\"\r\n >\r\n <span class=\"tao-select__value\">{{ selected?.label ?? placeholder }}</span>\r\n <span\r\n class=\"tao-select__chevron\"\r\n :class=\"{ 'tao-select__chevron--custom': $slots.chevron }\"\r\n aria-hidden=\"true\"\r\n >\r\n <slot name=\"chevron\" />\r\n </span>\r\n </button>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"open\"\r\n ref=\"panelRef\"\r\n class=\"tao-select__panel\"\r\n :class=\"`tao-select__panel--${size}`\"\r\n :style=\"listStyle\"\r\n >\r\n <ul\r\n :id=\"listId\"\r\n ref=\"listRef\"\r\n class=\"tao-select__list\"\r\n role=\"listbox\"\r\n tabindex=\"-1\"\r\n :aria-activedescendant=\"activeIndex >= 0 ? `${listId}-opt-${activeIndex}` : undefined\"\r\n @keydown=\"onListKeydown\"\r\n >\r\n <li\r\n v-for=\"(option, index) in options\"\r\n :id=\"`${listId}-opt-${index}`\"\r\n :key=\"String(option.value)\"\r\n class=\"tao-select__option\"\r\n :class=\"{\r\n 'tao-select__option--active': index === activeIndex,\r\n 'tao-select__option--selected': option.value === modelValue,\r\n 'tao-select__option--disabled': option.disabled,\r\n }\"\r\n role=\"option\"\r\n :aria-selected=\"option.value === modelValue\"\r\n :aria-disabled=\"option.disabled || undefined\"\r\n :data-tao-select-index=\"index\"\r\n @mousedown.prevent\r\n @click=\"selectOption(option)\"\r\n @mouseenter=\"!option.disabled && (activeIndex = index)\"\r\n >\r\n {{ option.label }}\r\n </li>\r\n </ul>\r\n <button\r\n v-if=\"clearable && selected\"\r\n type=\"button\"\r\n class=\"tao-select__clear\"\r\n @mousedown.prevent\r\n @click=\"clear\"\r\n >\r\n <slot name=\"clear\">{{ clearText }}</slot>\r\n </button>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.tao-select__panel {\r\n z-index: 1050;\r\n position: fixed;\r\n overflow: hidden;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-overlay);\r\n}\r\n\r\n.tao-select__list {\r\n margin: 0;\r\n padding: var(--tao-space-1);\r\n max-height: 240px;\r\n overflow: auto;\r\n list-style: none;\r\n}\r\n\r\n.tao-select__list:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-select__clear {\r\n display: block;\r\n width: 100%;\r\n margin: 0;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border: none;\r\n border-top: 1px solid var(--tao-color-border);\r\n background: none;\r\n color: var(--tao-color-text-muted);\r\n font: inherit;\r\n font-size: var(--tao-font-size-sm);\r\n text-align: left;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-select__clear:hover {\r\n color: var(--tao-color-accent);\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-select__option {\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border-radius: var(--tao-radius-sm);\r\n font-size: var(--tao-font-size-md);\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.tao-select__option--active,\r\n.tao-select__option:hover:not(.tao-select__option--disabled) {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-select__option--selected {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-select__option--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* Sizes of the teleported panel follow the control / Размеры панели (она телепортирована) следуют размеру контрола */\r\n.tao-select__panel--small .tao-select__option,\r\n.tao-select__panel--small .tao-select__clear {\r\n padding: var(--tao-space-1) var(--tao-space-2);\r\n font-size: var(--tao-font-size-xs);\r\n}\r\n\r\n.tao-select__panel--large .tao-select__option,\r\n.tao-select__panel--large .tao-select__clear {\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n font-size: var(--tao-font-size-lg);\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-select {\r\n width: 100%;\r\n}\r\n\r\n.tao-select__trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n height: var(--tao-field-height);\r\n padding: 0 var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n text-align: left;\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-select--small .tao-select__trigger {\r\n /* same height as TaoButton small / как у TaoButton small */\r\n height: var(--tao-control-height-small);\r\n min-height: 0;\r\n padding: 0 var(--tao-space-2);\r\n font-size: var(--tao-font-size-xs);\r\n}\r\n\r\n.tao-select--large .tao-select__trigger {\r\n height: var(--tao-control-height-large);\r\n min-height: 0;\r\n padding: 0 var(--tao-space-4);\r\n font-size: var(--tao-font-size-lg);\r\n}\r\n\r\n.tao-select__trigger--placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-select__trigger:focus {\r\n outline: none;\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-select--invalid .tao-select__trigger {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-select--invalid .tao-select__trigger:focus {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-select__trigger:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-select__value {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-select__chevron {\r\n flex-shrink: 0;\r\n width: 0;\r\n height: 0;\r\n border-left: 4px solid transparent;\r\n border-right: 4px solid transparent;\r\n border-top: 5px solid currentColor;\r\n opacity: 0.6;\r\n transition: transform var(--tao-duration-fast) var(--tao-ease-base);\r\n}\r\n\r\n.tao-select--open .tao-select__chevron {\r\n transform: rotate(180deg);\r\n}\r\n\r\n.tao-select__chevron--custom {\r\n display: inline-flex;\r\n width: auto;\r\n height: auto;\r\n border: none;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { listenFocusLoss } from '../focusLoss';\r\nimport type { TaoSelectOption } from '../select';\r\n\r\ndefineOptions({ name: 'TaoCombobox' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | number | null;\r\n options?: TaoSelectOption[];\r\n placeholder?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n emptyText?: string;\r\n /** Label of the clear row in the list. Slot `#clear` replaces it (icon, markup). / Подпись пункта сброса; слот `#clear` заменяет её (иконка, разметка). */\r\n clearText?: string;\r\n /** Whether the value can be cleared: shows the clear row. Turn off when null is not valid. / Можно ли очистить значение: показывает пункт сброса. Выключайте, когда null не допустим. */\r\n clearable?: boolean;\r\n /** Control size, same scale as TaoButton and TaoSelect. / Размер контрола, шкала как у TaoButton и TaoSelect. */\r\n size?: 'small' | 'medium' | 'large';\r\n /** Можно оставить то, чего нет в списке. */\r\n allowCreate?: boolean;\r\n }>(),\r\n {\r\n modelValue: null,\r\n options: () => [],\r\n placeholder: 'Начните вводить',\r\n disabled: false,\r\n error: false,\r\n emptyText: 'Ничего не найдено',\r\n clearText: 'Очистить',\r\n clearable: true,\r\n size: 'medium',\r\n allowCreate: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number | null];\r\n change: [value: string | number | null];\r\n /** Новое значение, которого не было в `options`. Список сам не трогаем — его дополняет родитель. */\r\n create: [value: string];\r\n}>();\r\n\r\ntype ComboRow = { kind: 'option'; option: TaoSelectOption } | { kind: 'create'; text: string };\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst listId = `${localId}-list`;\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst open = ref(false);\r\nconst focused = ref(false);\r\nconst picking = ref(false);\r\nconst skipFocusOpen = ref(false);\r\nconst query = ref('');\r\nconst activeIndex = ref(-1);\r\nconst fieldRef = ref<HTMLElement | null>(null);\r\nconst inputRef = ref<HTMLInputElement | null>(null);\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst listRef = ref<HTMLElement | null>(null);\r\nconst listStyle = ref({ top: '0px', left: '0px', width: '0px' });\r\n\r\nconst selected = computed((): TaoSelectOption | null => {\r\n const found = props.options.find((option) => option.value === props.modelValue);\r\n if (found) {\r\n return found;\r\n }\r\n if (props.modelValue === null || props.modelValue === undefined || props.modelValue === '') {\r\n return null;\r\n }\r\n return { value: props.modelValue, label: String(props.modelValue) };\r\n});\r\n\r\nconst needle = computed(() => query.value.trim().toLowerCase());\r\n\r\nconst filtered = computed(() => {\r\n if (!needle.value) {\r\n return props.options;\r\n }\r\n return props.options.filter((option) => option.label.toLowerCase().includes(needle.value));\r\n});\r\n\r\nconst canCreate = computed(() => {\r\n const text = query.value.trim();\r\n if (!props.allowCreate || !text) {\r\n return false;\r\n }\r\n return !props.options.some((option) => option.label.toLowerCase() === text.toLowerCase());\r\n});\r\n\r\nconst rows = computed((): ComboRow[] => {\r\n const next: ComboRow[] = filtered.value.map((option) => ({ kind: 'option', option }));\r\n if (canCreate.value) {\r\n next.push({ kind: 'create', text: query.value.trim() });\r\n }\r\n return next;\r\n});\r\n\r\nconst enabledIndexes = computed(() =>\r\n rows.value\r\n .map((row, index) => (row.kind === 'option' && row.option.disabled ? -1 : index))\r\n .filter((index) => index >= 0),\r\n);\r\n\r\nconst activeId = computed(() => (activeIndex.value >= 0 ? `${listId}-row-${activeIndex.value}` : undefined));\r\n\r\nfunction syncQueryFromModel() {\r\n query.value = selected.value?.label ?? '';\r\n}\r\n\r\nfunction updatePosition() {\r\n const trigger = fieldRef.value;\r\n const panel = panelRef.value;\r\n\r\n if (!trigger || !panel) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const panelHeight = panel.offsetHeight;\r\n const panelWidth = panel.offsetWidth || rect.width;\r\n const gap = 4;\r\n const pad = 8;\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const openUp = spaceBelow < panelHeight && rect.top > spaceBelow;\r\n const maxLeft = Math.max(pad, window.innerWidth - panelWidth - pad);\r\n const left = Math.min(Math.max(rect.left, pad), maxLeft);\r\n\r\n listStyle.value = {\r\n top: `${openUp ? rect.top - panelHeight - gap : rect.bottom + gap}px`,\r\n left: `${left}px`,\r\n width: `${rect.width}px`,\r\n };\r\n}\r\n\r\nfunction resetActive() {\r\n const selectedIndex = rows.value.findIndex(\r\n (row) => row.kind === 'option' && row.option.value === props.modelValue,\r\n );\r\n if (selectedIndex >= 0 && enabledIndexes.value.includes(selectedIndex)) {\r\n activeIndex.value = selectedIndex;\r\n return;\r\n }\r\n activeIndex.value = enabledIndexes.value[0] ?? -1;\r\n}\r\n\r\nasync function setOpen(next: boolean) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n open.value = next;\r\n\r\n if (!next) {\r\n return;\r\n }\r\n\r\n resetActive();\r\n await nextTick();\r\n updatePosition();\r\n scrollActiveIntoView();\r\n}\r\n\r\nfunction emitValue(value: string | number | null) {\r\n emit('update:modelValue', value);\r\n emit('change', value);\r\n}\r\n\r\nfunction keepFocusQuiet() {\r\n skipFocusOpen.value = true;\r\n picking.value = false;\r\n inputRef.value?.focus();\r\n}\r\n\r\nfunction commitCreated(value: string) {\r\n emitValue(value);\r\n emit('create', value);\r\n query.value = value;\r\n open.value = false;\r\n keepFocusQuiet();\r\n}\r\n\r\nfunction selectOption(option: TaoSelectOption) {\r\n if (option.disabled) {\r\n return;\r\n }\r\n\r\n emitValue(option.value);\r\n query.value = option.label;\r\n open.value = false;\r\n keepFocusQuiet();\r\n}\r\n\r\nfunction createFromQuery(text: string) {\r\n const value = text.trim();\r\n if (!value) {\r\n return;\r\n }\r\n\r\n const exact = props.options.find(\r\n (option) => !option.disabled && option.label.toLowerCase() === value.toLowerCase(),\r\n );\r\n if (exact) {\r\n selectOption(exact);\r\n return;\r\n }\r\n\r\n if (!props.allowCreate) {\r\n return;\r\n }\r\n\r\n commitCreated(value);\r\n}\r\n\r\nfunction clear() {\r\n emitValue(null);\r\n query.value = '';\r\n open.value = false;\r\n inputRef.value?.focus();\r\n}\r\n\r\nfunction revertQuery() {\r\n syncQueryFromModel();\r\n}\r\n\r\nfunction closeAndRevert() {\r\n open.value = false;\r\n revertQuery();\r\n}\r\n\r\nfunction closeAndCommit() {\r\n open.value = false;\r\n const text = query.value.trim();\r\n if (!text) {\r\n revertQuery();\r\n return;\r\n }\r\n\r\n const exact = props.options.find(\r\n (option) => !option.disabled && option.label.toLowerCase() === text.toLowerCase(),\r\n );\r\n if (exact) {\r\n emitValue(exact.value);\r\n query.value = exact.label;\r\n return;\r\n }\r\n\r\n if (props.allowCreate) {\r\n emitValue(text);\r\n emit('create', text);\r\n query.value = text;\r\n return;\r\n }\r\n\r\n revertQuery();\r\n}\r\n\r\nfunction moveActive(delta: number) {\r\n const enabled = enabledIndexes.value;\r\n if (!enabled.length) {\r\n return;\r\n }\r\n\r\n const currentPos = enabled.indexOf(activeIndex.value);\r\n const nextPos = currentPos < 0 ? 0 : (currentPos + delta + enabled.length) % enabled.length;\r\n activeIndex.value = enabled[nextPos];\r\n scrollActiveIntoView();\r\n}\r\n\r\nfunction scrollActiveIntoView() {\r\n const list = listRef.value;\r\n if (!list || activeIndex.value < 0) {\r\n return;\r\n }\r\n\r\n const option = list.querySelector<HTMLElement>(`[data-tao-combobox-index=\"${activeIndex.value}\"]`);\r\n option?.scrollIntoView({ block: 'nearest' });\r\n}\r\n\r\nfunction onFieldMouseDown(event: MouseEvent) {\r\n if (props.disabled || event.button !== 0) {\r\n return;\r\n }\r\n\r\n const onInput = event.target === inputRef.value;\r\n if (onInput) {\r\n if (focused.value && !open.value) {\r\n void setOpen(true);\r\n }\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n if (open.value) {\r\n open.value = false;\r\n return;\r\n }\r\n\r\n inputRef.value?.focus();\r\n void setOpen(true);\r\n}\r\n\r\nfunction onInput() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n void setOpen(true);\r\n resetActive();\r\n}\r\n\r\nfunction onFocus() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n focused.value = true;\r\n if (skipFocusOpen.value) {\r\n skipFocusOpen.value = false;\r\n return;\r\n }\r\n void setOpen(true);\r\n nextTick(() => inputRef.value?.select());\r\n}\r\n\r\nfunction markPicking() {\r\n picking.value = true;\r\n}\r\n\r\nfunction onBlur() {\r\n focused.value = false;\r\n window.setTimeout(() => {\r\n if (picking.value) {\r\n picking.value = false;\r\n return;\r\n }\r\n if (fieldRef.value?.contains(document.activeElement) || panelRef.value?.contains(document.activeElement)) {\r\n return;\r\n }\r\n if (props.allowCreate) {\r\n closeAndCommit();\r\n return;\r\n }\r\n closeAndRevert();\r\n }, 0);\r\n}\r\n\r\nfunction activateRow(row: ComboRow) {\r\n if (row.kind === 'create') {\r\n createFromQuery(row.text);\r\n return;\r\n }\r\n selectOption(row.option);\r\n}\r\n\r\nfunction onInputKeydown(event: KeyboardEvent) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n closeAndRevert();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n if (!open.value) {\r\n void setOpen(true);\r\n return;\r\n }\r\n moveActive(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n if (!open.value) {\r\n void setOpen(true);\r\n return;\r\n }\r\n moveActive(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter') {\r\n event.preventDefault();\r\n if (!open.value) {\r\n void setOpen(true);\r\n return;\r\n }\r\n const row = rows.value[activeIndex.value];\r\n if (row) {\r\n activateRow(row);\r\n return;\r\n }\r\n if (props.allowCreate) {\r\n createFromQuery(query.value);\r\n }\r\n }\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n if (fieldRef.value?.contains(target) || panelRef.value?.contains(target)) {\r\n return;\r\n }\r\n\r\n if (props.allowCreate) {\r\n closeAndCommit();\r\n return;\r\n }\r\n closeAndRevert();\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (open.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n () => {\r\n if (!focused.value) {\r\n syncQueryFromModel();\r\n }\r\n },\r\n { immediate: true },\r\n);\r\n\r\nwatch(rows, () => {\r\n if (!open.value) {\r\n return;\r\n }\r\n if (!enabledIndexes.value.includes(activeIndex.value)) {\r\n activeIndex.value = enabledIndexes.value[0] ?? -1;\r\n }\r\n});\r\n\r\nwatch(open, (isOpen) => {\r\n if (isOpen) {\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(() => {\r\n picking.value = false;\r\n });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n stopFocusLoss?.();\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-combobox\"\r\n :class=\"[\r\n `tao-combobox--${size}`,\r\n {\r\n 'tao-combobox--open': open,\r\n 'tao-combobox--invalid': invalid,\r\n 'tao-combobox--disabled': disabled,\r\n },\r\n ]\"\r\n >\r\n <div ref=\"fieldRef\" class=\"tao-combobox__field\" @mousedown=\"onFieldMouseDown\">\r\n <input\r\n :id=\"controlId\"\r\n ref=\"inputRef\"\r\n class=\"tao-combobox__input\"\r\n type=\"text\"\r\n role=\"combobox\"\r\n autocomplete=\"off\"\r\n aria-autocomplete=\"list\"\r\n aria-haspopup=\"listbox\"\r\n :aria-expanded=\"open\"\r\n :aria-controls=\"listId\"\r\n :aria-activedescendant=\"open ? activeId : undefined\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :disabled=\"disabled\"\r\n :placeholder=\"placeholder\"\r\n :value=\"query\"\r\n @input=\"query = ($event.target as HTMLInputElement).value; onInput()\"\r\n @focus=\"onFocus\"\r\n @blur=\"onBlur\"\r\n @keydown=\"onInputKeydown\"\r\n />\r\n <span\r\n class=\"tao-combobox__chevron\"\r\n :class=\"{ 'tao-combobox__chevron--custom': $slots.chevron }\"\r\n aria-hidden=\"true\"\r\n >\r\n <slot name=\"chevron\" />\r\n </span>\r\n </div>\r\n\r\n <Teleport to=\"body\">\r\n <div v-if=\"open\" ref=\"panelRef\" class=\"tao-combobox__panel\" :class=\"`tao-combobox__panel--${size}`\" :style=\"listStyle\">\r\n <ul :id=\"listId\" ref=\"listRef\" class=\"tao-combobox__list\" role=\"listbox\">\r\n <li v-if=\"!rows.length\" class=\"tao-combobox__empty\">\r\n <slot name=\"empty\">{{ emptyText }}</slot>\r\n </li>\r\n <li\r\n v-for=\"(row, index) in rows\"\r\n :id=\"`${listId}-row-${index}`\"\r\n :key=\"row.kind === 'create' ? 'create' : String(row.option.value)\"\r\n class=\"tao-combobox__option\"\r\n :class=\"{\r\n 'tao-combobox__option--active': index === activeIndex,\r\n 'tao-combobox__option--selected':\r\n row.kind === 'option' && row.option.value === modelValue,\r\n 'tao-combobox__option--disabled': row.kind === 'option' && row.option.disabled,\r\n 'tao-combobox__option--create': row.kind === 'create',\r\n }\"\r\n role=\"option\"\r\n :aria-selected=\"row.kind === 'option' && row.option.value === modelValue\"\r\n :aria-disabled=\"row.kind === 'option' && row.option.disabled ? true : undefined\"\r\n :data-tao-combobox-index=\"index\"\r\n @mousedown.prevent=\"markPicking\"\r\n @click=\"activateRow(row)\"\r\n @mouseenter=\"!(row.kind === 'option' && row.option.disabled) && (activeIndex = index)\"\r\n >\r\n <template v-if=\"row.kind === 'create'\">\r\n <slot name=\"create\" :text=\"row.text\">Добавить «{{ row.text }}»</slot>\r\n </template>\r\n <template v-else>{{ row.option.label }}</template>\r\n </li>\r\n </ul>\r\n <button\r\n v-if=\"clearable && selected\"\r\n type=\"button\"\r\n class=\"tao-combobox__clear\"\r\n @mousedown.prevent=\"markPicking\"\r\n @click=\"clear\"\r\n >\r\n <slot name=\"clear\">{{ clearText }}</slot>\r\n </button>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.tao-combobox__panel {\r\n z-index: 1050;\r\n position: fixed;\r\n overflow: hidden;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n box-shadow: var(--tao-shadow-overlay);\r\n}\r\n\r\n.tao-combobox__list {\r\n margin: 0;\r\n padding: var(--tao-space-1);\r\n max-height: 240px;\r\n overflow: auto;\r\n list-style: none;\r\n}\r\n\r\n.tao-combobox__empty {\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-sm);\r\n}\r\n\r\n.tao-combobox__clear {\r\n display: block;\r\n width: 100%;\r\n margin: 0;\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border: none;\r\n border-top: 1px solid var(--tao-color-border);\r\n background: none;\r\n color: var(--tao-color-text-muted);\r\n font: inherit;\r\n font-size: var(--tao-font-size-sm);\r\n text-align: left;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-combobox__clear:hover {\r\n color: var(--tao-color-accent);\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-combobox__option {\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n border-radius: var(--tao-radius-sm);\r\n font-size: var(--tao-font-size-md);\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.tao-combobox__option--active,\r\n.tao-combobox__option:hover:not(.tao-combobox__option--disabled) {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-combobox__option--selected {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-combobox__option--create {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-combobox__option--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* Sizes of the teleported panel follow the control / Размеры панели (она телепортирована) следуют размеру контрола */\r\n.tao-combobox__panel--small .tao-combobox__option,\r\n.tao-combobox__panel--small .tao-combobox__clear,\r\n.tao-combobox__panel--small .tao-combobox__empty {\r\n padding: var(--tao-space-1) var(--tao-space-2);\r\n font-size: var(--tao-font-size-xs);\r\n}\r\n\r\n.tao-combobox__panel--large .tao-combobox__option,\r\n.tao-combobox__panel--large .tao-combobox__clear,\r\n.tao-combobox__panel--large .tao-combobox__empty {\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n font-size: var(--tao-font-size-lg);\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.tao-combobox {\r\n width: 100%;\r\n}\r\n\r\n.tao-combobox__field {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n height: var(--tao-field-height);\r\n padding: 0 var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-combobox--small .tao-combobox__field {\r\n /* same height as TaoButton small / как у TaoButton small */\r\n height: var(--tao-control-height-small);\r\n min-height: 0;\r\n padding: 0 var(--tao-space-2);\r\n}\r\n\r\n.tao-combobox--small .tao-combobox__input {\r\n height: 24px;\r\n font-size: var(--tao-font-size-xs);\r\n}\r\n\r\n.tao-combobox--large .tao-combobox__field {\r\n height: var(--tao-control-height-large);\r\n min-height: 0;\r\n padding: 0 var(--tao-space-4);\r\n}\r\n\r\n.tao-combobox--large .tao-combobox__input {\r\n height: 42px;\r\n font-size: var(--tao-font-size-lg);\r\n}\r\n\r\n.tao-combobox__field:focus-within {\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-combobox--invalid .tao-combobox__field {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-combobox--invalid .tao-combobox__field:focus-within {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-combobox__input {\r\n flex: 1;\r\n min-width: 0;\r\n height: 34px;\r\n padding: 0;\r\n border: none;\r\n background: transparent;\r\n color: inherit;\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n outline: none;\r\n}\r\n\r\n.tao-combobox__input::placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-combobox__input:disabled {\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-combobox--disabled .tao-combobox__field {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-combobox__chevron {\r\n flex-shrink: 0;\r\n width: 0;\r\n height: 0;\r\n border-left: 4px solid transparent;\r\n border-right: 4px solid transparent;\r\n border-top: 5px solid currentColor;\r\n opacity: 0.6;\r\n pointer-events: none;\r\n transition: transform var(--tao-duration-fast) var(--tao-ease-base);\r\n}\r\n\r\n.tao-combobox--open .tao-combobox__chevron {\r\n transform: rotate(180deg);\r\n}\r\n\r\n.tao-combobox__chevron--custom {\r\n display: inline-flex;\r\n width: auto;\r\n height: auto;\r\n border: none;\r\n}\r\n</style>\r\n","export interface TaoDateParts {\r\n y: number;\r\n m: number;\r\n d: number;\r\n}\r\n\r\nexport interface TaoDateCell {\r\n iso: string;\r\n day: number;\r\n currentMonth: boolean;\r\n}\r\n\r\nexport interface TaoDateRangeValue {\r\n start: string;\r\n end: string;\r\n}\r\n\r\nconst ISO_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\r\n\r\nexport function formatTaoDateIso(parts: TaoDateParts): string {\r\n return `${String(parts.y).padStart(4, '0')}-${String(parts.m).padStart(2, '0')}-${String(parts.d).padStart(2, '0')}`;\r\n}\r\n\r\nexport function parseTaoDate(value: string | null | undefined): TaoDateParts | null {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const match = ISO_DATE.exec(value);\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n const y = Number(match[1]);\r\n const m = Number(match[2]);\r\n const d = Number(match[3]);\r\n const date = new Date(y, m - 1, d);\r\n\r\n if (date.getFullYear() !== y || date.getMonth() !== m - 1 || date.getDate() !== d) {\r\n return null;\r\n }\r\n\r\n return { y, m, d };\r\n}\r\n\r\nexport function todayTaoDate(): string {\r\n const now = new Date();\r\n return formatTaoDateIso({ y: now.getFullYear(), m: now.getMonth() + 1, d: now.getDate() });\r\n}\r\n\r\nexport function shiftTaoDate(iso: string, days: number): string {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return iso;\r\n }\r\n\r\n const date = new Date(parts.y, parts.m - 1, parts.d + days);\r\n return formatTaoDateIso({ y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate() });\r\n}\r\n\r\nexport function shiftTaoMonth(iso: string, months: number): string {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return iso;\r\n }\r\n\r\n const monthStart = new Date(parts.y, parts.m - 1 + months, 1);\r\n const y = monthStart.getFullYear();\r\n const m = monthStart.getMonth() + 1;\r\n const lastDay = new Date(y, m, 0).getDate();\r\n return formatTaoDateIso({ y, m, d: Math.min(parts.d, lastDay) });\r\n}\r\n\r\nexport function clampTaoDateCursor(iso: string, min?: string, max?: string): string {\r\n if (isTaoDateInRange(iso, min, max)) {\r\n return iso;\r\n }\r\n\r\n if (min && parseTaoDate(min) && iso < min) {\r\n return min;\r\n }\r\n\r\n if (max && parseTaoDate(max) && iso > max) {\r\n return max;\r\n }\r\n\r\n return iso;\r\n}\r\n\r\nexport function isTaoDateInRange(iso: string, min?: string, max?: string): boolean {\r\n if (!parseTaoDate(iso)) {\r\n return false;\r\n }\r\n\r\n if (min && parseTaoDate(min) && iso < min) {\r\n return false;\r\n }\r\n\r\n if (max && parseTaoDate(max) && iso > max) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function formatTaoDateLabel(iso: string, locale = 'ru-RU'): string {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return '';\r\n }\r\n\r\n return new Date(parts.y, parts.m - 1, parts.d).toLocaleDateString(locale, {\r\n day: 'numeric',\r\n month: 'long',\r\n year: 'numeric',\r\n });\r\n}\r\n\r\nexport function sortTaoDateRange(a: string, b: string): TaoDateRangeValue {\r\n return a <= b ? { start: a, end: b } : { start: b, end: a };\r\n}\r\n\r\nexport function parseTaoDateRange(value: TaoDateRangeValue | null | undefined): TaoDateRangeValue | null {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const start = parseTaoDate(value.start);\r\n const end = parseTaoDate(value.end);\r\n if (!start || !end) {\r\n return null;\r\n }\r\n\r\n return sortTaoDateRange(formatTaoDateIso(start), formatTaoDateIso(end));\r\n}\r\n\r\nexport function formatTaoDateRangeLabel(start: string, end: string, locale = 'ru-RU'): string {\r\n const fromParts = parseTaoDate(start);\r\n const toParts = parseTaoDate(end);\r\n if (!fromParts || !toParts) {\r\n return '';\r\n }\r\n\r\n if (start === end) {\r\n return formatTaoDateLabel(start, locale);\r\n }\r\n\r\n const from = new Date(fromParts.y, fromParts.m - 1, fromParts.d).toLocaleDateString(locale, {\r\n day: 'numeric',\r\n month: 'long',\r\n ...(fromParts.y === toParts.y ? {} : { year: 'numeric' }),\r\n });\r\n\r\n return `${from} — ${formatTaoDateLabel(end, locale)}`;\r\n}\r\n\r\nexport function formatTaoMonthLabel(year: number, month: number, locale = 'ru-RU'): string {\r\n const label = new Date(year, month - 1, 1).toLocaleDateString(locale, {\r\n month: 'long',\r\n year: 'numeric',\r\n });\r\n return label.charAt(0).toUpperCase() + label.slice(1);\r\n}\r\n\r\nexport function taoDateWeekdayIndex(iso: string): number {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return 0;\r\n }\r\n\r\n return (new Date(parts.y, parts.m - 1, parts.d).getDay() + 6) % 7;\r\n}\r\n\r\nexport function taoWeekdayLabels(locale = 'ru-RU'): string[] {\r\n return Array.from({ length: 7 }, (_, index) => {\r\n const label = new Date(2026, 0, 5 + index).toLocaleDateString(locale, { weekday: 'short' });\r\n return label.replace(/\\.$/, '');\r\n });\r\n}\r\n\r\n/** Monday-first 6×7 grid so the popup height stays stable. */\r\nexport function buildTaoDateGrid(year: number, month: number): TaoDateCell[] {\r\n const first = new Date(year, month - 1, 1);\r\n const mondayOffset = (first.getDay() + 6) % 7;\r\n const start = new Date(year, month - 1, 1 - mondayOffset);\r\n\r\n return Array.from({ length: 42 }, (_, index) => {\r\n const date = new Date(start.getFullYear(), start.getMonth(), start.getDate() + index);\r\n return {\r\n iso: formatTaoDateIso({ y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate() }),\r\n day: date.getDate(),\r\n currentMonth: date.getMonth() === month - 1,\r\n };\r\n });\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport {\r\n buildTaoDateGrid,\r\n formatTaoDateIso,\r\n formatTaoDateLabel,\r\n formatTaoMonthLabel,\r\n isTaoDateInRange,\r\n parseTaoDate,\r\n shiftTaoDate,\r\n shiftTaoMonth,\r\n clampTaoDateCursor,\r\n taoDateWeekdayIndex,\r\n taoWeekdayLabels,\r\n todayTaoDate,\r\n} from '../date';\r\nimport '../styles/date-popup.css';\r\n\r\ndefineOptions({ name: 'TaoDate' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | null;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n min?: string;\r\n max?: string;\r\n locale?: string;\r\n todayText?: string;\r\n clearText?: string;\r\n prevMonthLabel?: string;\r\n nextMonthLabel?: string;\r\n }>(),\r\n {\r\n modelValue: null,\r\n placeholder: 'Дата',\r\n disabled: false,\r\n error: false,\r\n min: undefined,\r\n max: undefined,\r\n locale: 'ru-RU',\r\n todayText: 'Сегодня',\r\n clearText: 'Очистить',\r\n prevMonthLabel: 'Предыдущий месяц',\r\n nextMonthLabel: 'Следующий месяц',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | null];\r\n change: [value: string | null];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst gridId = `${localId}-grid`;\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst open = ref(false);\r\nconst viewYear = ref(2026);\r\nconst viewMonth = ref(1);\r\nconst cursorIso = ref(todayTaoDate());\r\nconst triggerRef = ref<HTMLButtonElement | null>(null);\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst panelStyle = ref({ top: '0px', left: '0px' });\r\n\r\nconst valueIso = computed(() => {\r\n const parsed = parseTaoDate(props.modelValue);\r\n return parsed ? formatTaoDateIso(parsed) : null;\r\n});\r\nconst displayLabel = computed(() => (valueIso.value ? formatTaoDateLabel(valueIso.value, props.locale) : ''));\r\nconst weekdays = computed(() => taoWeekdayLabels(props.locale));\r\nconst monthLabel = computed(() => formatTaoMonthLabel(viewYear.value, viewMonth.value, props.locale));\r\nconst cells = computed(() => buildTaoDateGrid(viewYear.value, viewMonth.value));\r\nconst todayIso = computed(() => todayTaoDate());\r\nconst todayEnabled = computed(() => isTaoDateInRange(todayIso.value, props.min, props.max));\r\n\r\nfunction syncViewFrom(iso: string) {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return;\r\n }\r\n\r\n viewYear.value = parts.y;\r\n viewMonth.value = parts.m;\r\n cursorIso.value = iso;\r\n}\r\n\r\nfunction updatePosition() {\r\n const trigger = triggerRef.value;\r\n const panel = panelRef.value;\r\n if (!trigger || !panel) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const height = panel.offsetHeight;\r\n const width = panel.offsetWidth;\r\n const gap = 4;\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const openUp = spaceBelow < height && rect.top > spaceBelow;\r\n const left = Math.min(rect.left, Math.max(8, window.innerWidth - width - 8));\r\n\r\n panelStyle.value = {\r\n top: `${openUp ? rect.top - height - gap : rect.bottom + gap}px`,\r\n left: `${Math.max(8, left)}px`,\r\n };\r\n}\r\n\r\nasync function setOpen(next: boolean) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n open.value = next;\r\n if (!next) {\r\n return;\r\n }\r\n\r\n syncViewFrom(clampTaoDateCursor(valueIso.value ?? todayIso.value, props.min, props.max));\r\n await nextTick();\r\n updatePosition();\r\n panelRef.value?.focus();\r\n}\r\n\r\nfunction toggle() {\r\n void setOpen(!open.value);\r\n}\r\n\r\nfunction close() {\r\n open.value = false;\r\n}\r\n\r\nfunction selectDay(iso: string) {\r\n if (!isTaoDateInRange(iso, props.min, props.max)) {\r\n return;\r\n }\r\n\r\n emit('update:modelValue', iso);\r\n emit('change', iso);\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction clear() {\r\n emit('update:modelValue', null);\r\n emit('change', null);\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction goMonth(delta: number) {\r\n cursorIso.value = clampTaoDateCursor(shiftTaoMonth(cursorIso.value, delta), props.min, props.max);\r\n syncViewFrom(cursorIso.value);\r\n void nextTick(updatePosition);\r\n}\r\n\r\nfunction moveCursor(days: number) {\r\n const next = shiftTaoDate(cursorIso.value, days);\r\n cursorIso.value = isTaoDateInRange(next, props.min, props.max)\r\n ? next\r\n : clampTaoDateCursor(next, props.min, props.max);\r\n syncViewFrom(cursorIso.value);\r\n void nextTick(updatePosition);\r\n}\r\n\r\nfunction onTriggerKeydown(event: KeyboardEvent) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n void setOpen(true);\r\n }\r\n}\r\n\r\nfunction onPanelKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n close();\r\n triggerRef.value?.focus();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowLeft') {\r\n event.preventDefault();\r\n moveCursor(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n event.preventDefault();\r\n moveCursor(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n moveCursor(-7);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n moveCursor(7);\r\n return;\r\n }\r\n\r\n if (event.key === 'PageUp') {\r\n event.preventDefault();\r\n goMonth(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'PageDown') {\r\n event.preventDefault();\r\n goMonth(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n moveCursor(-taoDateWeekdayIndex(cursorIso.value));\r\n return;\r\n }\r\n\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n moveCursor(6 - taoDateWeekdayIndex(cursorIso.value));\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n selectDay(cursorIso.value);\r\n }\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n if (triggerRef.value?.contains(target) || panelRef.value?.contains(target)) {\r\n return;\r\n }\r\n\r\n close();\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (open.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(open, (isOpen) => {\r\n if (isOpen) {\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-date\" :class=\"{ 'tao-date--open': open, 'tao-date--invalid': invalid }\">\r\n <button\r\n :id=\"controlId\"\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n class=\"tao-date__trigger\"\r\n :class=\"{ 'tao-date__trigger--placeholder': !valueIso }\"\r\n role=\"combobox\"\r\n :aria-expanded=\"open\"\r\n aria-haspopup=\"dialog\"\r\n :aria-controls=\"gridId\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :disabled=\"disabled\"\r\n @click=\"toggle\"\r\n @keydown=\"onTriggerKeydown\"\r\n >\r\n <span class=\"tao-date__value\">{{ displayLabel || placeholder }}</span>\r\n <span class=\"tao-date__icon\" aria-hidden=\"true\">\r\n <slot name=\"icon\">\r\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" focusable=\"false\">\r\n <rect\r\n x=\"2\"\r\n y=\"3\"\r\n width=\"12\"\r\n height=\"11\"\r\n rx=\"1.5\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.4\"\r\n />\r\n <path d=\"M5 1.5v3M11 1.5v3M2 6.5h12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"open\"\r\n :id=\"gridId\"\r\n ref=\"panelRef\"\r\n class=\"tao-date__panel\"\r\n role=\"dialog\"\r\n :aria-label=\"monthLabel\"\r\n tabindex=\"-1\"\r\n :style=\"panelStyle\"\r\n @keydown=\"onPanelKeydown\"\r\n >\r\n <div class=\"tao-date__header\">\r\n <button type=\"button\" class=\"tao-date__nav\" :aria-label=\"prevMonthLabel\" @click=\"goMonth(-1)\">\r\n <span aria-hidden=\"true\">\r\n <slot name=\"prev-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M14.5 5 8 12l6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n <p class=\"tao-date__month\">{{ monthLabel }}</p>\r\n <button type=\"button\" class=\"tao-date__nav\" :aria-label=\"nextMonthLabel\" @click=\"goMonth(1)\">\r\n <span aria-hidden=\"true\">\r\n <slot name=\"next-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M9.5 5 16 12l-6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"tao-date__weekdays\" aria-hidden=\"true\">\r\n <span v-for=\"day in weekdays\" :key=\"day\">{{ day }}</span>\r\n </div>\r\n\r\n <div class=\"tao-date__grid\" role=\"grid\">\r\n <button\r\n v-for=\"cell in cells\"\r\n :key=\"cell.iso\"\r\n type=\"button\"\r\n class=\"tao-date__day\"\r\n :class=\"{\r\n 'tao-date__day--outside': !cell.currentMonth,\r\n 'tao-date__day--today': cell.iso === todayIso,\r\n 'tao-date__day--selected': cell.iso === valueIso,\r\n 'tao-date__day--cursor': cell.iso === cursorIso,\r\n 'tao-date__day--disabled': !isTaoDateInRange(cell.iso, min, max),\r\n }\"\r\n role=\"gridcell\"\r\n :aria-label=\"formatTaoDateLabel(cell.iso, locale)\"\r\n :aria-selected=\"cell.iso === valueIso\"\r\n :disabled=\"!isTaoDateInRange(cell.iso, min, max)\"\r\n @mousedown.prevent\r\n @click=\"selectDay(cell.iso)\"\r\n >\r\n {{ cell.day }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"tao-date__footer\">\r\n <button type=\"button\" class=\"tao-date__link\" :disabled=\"!todayEnabled\" @click=\"selectDay(todayIso)\">\r\n <slot name=\"today\">{{ todayText }}</slot>\r\n </button>\r\n <button v-if=\"valueIso\" type=\"button\" class=\"tao-date__link\" @click=\"clear\">\r\n <slot name=\"clear\">{{ clearText }}</slot>\r\n </button>\r\n </div>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-date {\r\n width: 100%;\r\n}\r\n\r\n.tao-date__trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n height: var(--tao-field-height);\r\n padding: 0 var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n text-align: left;\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-date__trigger--placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-date__trigger:focus {\r\n outline: none;\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-date--invalid .tao-date__trigger {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-date--invalid .tao-date__trigger:focus {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-date__trigger:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-date__value {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-date__icon {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n opacity: 0.7;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { listenFocusLoss } from '../focusLoss';\r\nimport {\r\n buildTaoDateGrid,\r\n formatTaoDateLabel,\r\n formatTaoDateRangeLabel,\r\n formatTaoMonthLabel,\r\n isTaoDateInRange,\r\n parseTaoDate,\r\n parseTaoDateRange,\r\n shiftTaoDate,\r\n shiftTaoMonth,\r\n clampTaoDateCursor,\r\n sortTaoDateRange,\r\n taoDateWeekdayIndex,\r\n taoWeekdayLabels,\r\n todayTaoDate,\r\n type TaoDateRangeValue,\r\n} from '../date';\r\nimport '../styles/date-popup.css';\r\n\r\ndefineOptions({ name: 'TaoDateRange' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TaoDateRangeValue | null;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n min?: string;\r\n max?: string;\r\n locale?: string;\r\n todayText?: string;\r\n clearText?: string;\r\n prevMonthLabel?: string;\r\n nextMonthLabel?: string;\r\n }>(),\r\n {\r\n modelValue: null,\r\n placeholder: 'Период',\r\n disabled: false,\r\n error: false,\r\n min: undefined,\r\n max: undefined,\r\n locale: 'ru-RU',\r\n todayText: 'Сегодня',\r\n clearText: 'Очистить',\r\n prevMonthLabel: 'Предыдущий месяц',\r\n nextMonthLabel: 'Следующий месяц',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoDateRangeValue | null];\r\n change: [value: TaoDateRangeValue | null];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst gridId = `${localId}-grid`;\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => props.error || Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst open = ref(false);\r\nconst viewYear = ref(2026);\r\nconst viewMonth = ref(1);\r\nconst cursorIso = ref(todayTaoDate());\r\nconst draftStart = ref<string | null>(null);\r\nconst hoverIso = ref<string | null>(null);\r\nconst triggerRef = ref<HTMLButtonElement | null>(null);\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst panelStyle = ref({ top: '0px', left: '0px' });\r\n\r\nconst committed = computed(() => parseTaoDateRange(props.modelValue));\r\nconst highlight = computed(() => {\r\n if (draftStart.value) {\r\n return sortTaoDateRange(draftStart.value, hoverIso.value ?? cursorIso.value ?? draftStart.value);\r\n }\r\n\r\n return committed.value;\r\n});\r\nconst displayLabel = computed(() =>\r\n committed.value ? formatTaoDateRangeLabel(committed.value.start, committed.value.end, props.locale) : '',\r\n);\r\nconst weekdays = computed(() => taoWeekdayLabels(props.locale));\r\nconst monthLabel = computed(() => formatTaoMonthLabel(viewYear.value, viewMonth.value, props.locale));\r\nconst cells = computed(() => buildTaoDateGrid(viewYear.value, viewMonth.value));\r\nconst todayIso = computed(() => todayTaoDate());\r\nconst todayEnabled = computed(() => isTaoDateInRange(todayIso.value, props.min, props.max));\r\n\r\nfunction daySelected(iso: string) {\r\n return Boolean(highlight.value && (iso === highlight.value.start || iso === highlight.value.end));\r\n}\r\n\r\nfunction dayInRange(iso: string) {\r\n return Boolean(highlight.value && iso > highlight.value.start && iso < highlight.value.end);\r\n}\r\n\r\nfunction syncViewFrom(iso: string) {\r\n const parts = parseTaoDate(iso);\r\n if (!parts) {\r\n return;\r\n }\r\n\r\n viewYear.value = parts.y;\r\n viewMonth.value = parts.m;\r\n cursorIso.value = iso;\r\n}\r\n\r\nfunction updatePosition() {\r\n const trigger = triggerRef.value;\r\n const panel = panelRef.value;\r\n if (!trigger || !panel) {\r\n return;\r\n }\r\n\r\n const rect = trigger.getBoundingClientRect();\r\n const height = panel.offsetHeight;\r\n const width = panel.offsetWidth;\r\n const gap = 4;\r\n const spaceBelow = window.innerHeight - rect.bottom - gap;\r\n const openUp = spaceBelow < height && rect.top > spaceBelow;\r\n const left = Math.min(rect.left, Math.max(8, window.innerWidth - width - 8));\r\n\r\n panelStyle.value = {\r\n top: `${openUp ? rect.top - height - gap : rect.bottom + gap}px`,\r\n left: `${Math.max(8, left)}px`,\r\n };\r\n}\r\n\r\nasync function setOpen(next: boolean) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n open.value = next;\r\n if (!next) {\r\n return;\r\n }\r\n\r\n draftStart.value = null;\r\n hoverIso.value = null;\r\n syncViewFrom(clampTaoDateCursor(committed.value?.start ?? todayIso.value, props.min, props.max));\r\n await nextTick();\r\n updatePosition();\r\n panelRef.value?.focus();\r\n}\r\n\r\nfunction toggle() {\r\n void setOpen(!open.value);\r\n}\r\n\r\nfunction close() {\r\n open.value = false;\r\n}\r\n\r\nfunction commitRange(range: TaoDateRangeValue) {\r\n emit('update:modelValue', range);\r\n emit('change', range);\r\n draftStart.value = null;\r\n hoverIso.value = null;\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction selectDay(iso: string) {\r\n if (!isTaoDateInRange(iso, props.min, props.max)) {\r\n return;\r\n }\r\n\r\n if (!draftStart.value) {\r\n draftStart.value = iso;\r\n hoverIso.value = iso;\r\n cursorIso.value = iso;\r\n return;\r\n }\r\n\r\n commitRange(sortTaoDateRange(draftStart.value, iso));\r\n}\r\n\r\nfunction selectToday() {\r\n if (!todayEnabled.value) {\r\n return;\r\n }\r\n\r\n commitRange({ start: todayIso.value, end: todayIso.value });\r\n}\r\n\r\nfunction clear() {\r\n emit('update:modelValue', null);\r\n emit('change', null);\r\n draftStart.value = null;\r\n hoverIso.value = null;\r\n close();\r\n triggerRef.value?.focus();\r\n}\r\n\r\nfunction goMonth(delta: number) {\r\n hoverIso.value = null;\r\n cursorIso.value = clampTaoDateCursor(shiftTaoMonth(cursorIso.value, delta), props.min, props.max);\r\n syncViewFrom(cursorIso.value);\r\n void nextTick(updatePosition);\r\n}\r\n\r\nfunction moveCursor(days: number) {\r\n hoverIso.value = null;\r\n const next = shiftTaoDate(cursorIso.value, days);\r\n cursorIso.value = isTaoDateInRange(next, props.min, props.max)\r\n ? next\r\n : clampTaoDateCursor(next, props.min, props.max);\r\n syncViewFrom(cursorIso.value);\r\n void nextTick(updatePosition);\r\n}\r\n\r\nfunction onDayEnter(iso: string) {\r\n if (!isTaoDateInRange(iso, props.min, props.max)) {\r\n return;\r\n }\r\n\r\n hoverIso.value = iso;\r\n}\r\n\r\nfunction onGridLeave() {\r\n hoverIso.value = null;\r\n}\r\n\r\nfunction onTriggerKeydown(event: KeyboardEvent) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n void setOpen(true);\r\n }\r\n}\r\n\r\nfunction onPanelKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n close();\r\n triggerRef.value?.focus();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowLeft') {\r\n event.preventDefault();\r\n moveCursor(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n event.preventDefault();\r\n moveCursor(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n moveCursor(-7);\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n moveCursor(7);\r\n return;\r\n }\r\n\r\n if (event.key === 'PageUp') {\r\n event.preventDefault();\r\n goMonth(-1);\r\n return;\r\n }\r\n\r\n if (event.key === 'PageDown') {\r\n event.preventDefault();\r\n goMonth(1);\r\n return;\r\n }\r\n\r\n if (event.key === 'Home') {\r\n event.preventDefault();\r\n moveCursor(-taoDateWeekdayIndex(cursorIso.value));\r\n return;\r\n }\r\n\r\n if (event.key === 'End') {\r\n event.preventDefault();\r\n moveCursor(6 - taoDateWeekdayIndex(cursorIso.value));\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n selectDay(cursorIso.value);\r\n }\r\n}\r\n\r\nfunction onDocumentPointer(event: PointerEvent) {\r\n const target = event.target as Node;\r\n if (triggerRef.value?.contains(target) || panelRef.value?.contains(target)) {\r\n return;\r\n }\r\n\r\n close();\r\n}\r\n\r\nfunction onViewportChange() {\r\n if (open.value) {\r\n updatePosition();\r\n }\r\n}\r\n\r\nwatch(open, (isOpen) => {\r\n if (isOpen) {\r\n document.addEventListener('pointerdown', onDocumentPointer);\r\n window.addEventListener('resize', onViewportChange);\r\n window.addEventListener('scroll', onViewportChange, true);\r\n return;\r\n }\r\n\r\n draftStart.value = null;\r\n hoverIso.value = null;\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(() => {\r\n hoverIso.value = null;\r\n });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n stopFocusLoss?.();\r\n document.removeEventListener('pointerdown', onDocumentPointer);\r\n window.removeEventListener('resize', onViewportChange);\r\n window.removeEventListener('scroll', onViewportChange, true);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-date-range\" :class=\"{ 'tao-date-range--open': open, 'tao-date-range--invalid': invalid }\">\r\n <button\r\n :id=\"controlId\"\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n class=\"tao-date-range__trigger\"\r\n :class=\"{ 'tao-date-range__trigger--placeholder': !committed }\"\r\n role=\"combobox\"\r\n :aria-expanded=\"open\"\r\n aria-haspopup=\"dialog\"\r\n :aria-controls=\"gridId\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :disabled=\"disabled\"\r\n @click=\"toggle\"\r\n @keydown=\"onTriggerKeydown\"\r\n >\r\n <span class=\"tao-date-range__value\">{{ displayLabel || placeholder }}</span>\r\n <span class=\"tao-date-range__icon\" aria-hidden=\"true\">\r\n <slot name=\"icon\">\r\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" focusable=\"false\">\r\n <rect\r\n x=\"2\"\r\n y=\"3\"\r\n width=\"12\"\r\n height=\"11\"\r\n rx=\"1.5\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.4\"\r\n />\r\n <path d=\"M5 1.5v3M11 1.5v3M2 6.5h12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"open\"\r\n :id=\"gridId\"\r\n ref=\"panelRef\"\r\n class=\"tao-date__panel\"\r\n role=\"dialog\"\r\n :aria-label=\"monthLabel\"\r\n tabindex=\"-1\"\r\n :style=\"panelStyle\"\r\n @keydown=\"onPanelKeydown\"\r\n >\r\n <div class=\"tao-date__header\">\r\n <button type=\"button\" class=\"tao-date__nav\" :aria-label=\"prevMonthLabel\" @click=\"goMonth(-1)\">\r\n <span aria-hidden=\"true\">\r\n <slot name=\"prev-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M14.5 5 8 12l6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n <p class=\"tao-date__month\">{{ monthLabel }}</p>\r\n <button type=\"button\" class=\"tao-date__nav\" :aria-label=\"nextMonthLabel\" @click=\"goMonth(1)\">\r\n <span aria-hidden=\"true\">\r\n <slot name=\"next-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M9.5 5 16 12l-6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"tao-date__weekdays\" aria-hidden=\"true\">\r\n <span v-for=\"day in weekdays\" :key=\"day\">{{ day }}</span>\r\n </div>\r\n\r\n <div class=\"tao-date__grid\" role=\"grid\" @mouseleave=\"onGridLeave\">\r\n <button\r\n v-for=\"cell in cells\"\r\n :key=\"cell.iso\"\r\n type=\"button\"\r\n class=\"tao-date__day\"\r\n :class=\"{\r\n 'tao-date__day--outside': !cell.currentMonth,\r\n 'tao-date__day--today': cell.iso === todayIso,\r\n 'tao-date__day--selected': daySelected(cell.iso),\r\n 'tao-date__day--in-range': dayInRange(cell.iso),\r\n 'tao-date__day--range-start': highlight?.start === cell.iso,\r\n 'tao-date__day--range-end': highlight?.end === cell.iso,\r\n 'tao-date__day--cursor': cell.iso === cursorIso,\r\n 'tao-date__day--disabled': !isTaoDateInRange(cell.iso, min, max),\r\n }\"\r\n role=\"gridcell\"\r\n :aria-label=\"formatTaoDateLabel(cell.iso, locale)\"\r\n :aria-selected=\"daySelected(cell.iso)\"\r\n :disabled=\"!isTaoDateInRange(cell.iso, min, max)\"\r\n @mousedown.prevent\r\n @mouseenter=\"onDayEnter(cell.iso)\"\r\n @click=\"selectDay(cell.iso)\"\r\n >\r\n {{ cell.day }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"tao-date__footer\">\r\n <button type=\"button\" class=\"tao-date__link\" :disabled=\"!todayEnabled\" @click=\"selectToday\">\r\n <slot name=\"today\">{{ todayText }}</slot>\r\n </button>\r\n <button v-if=\"committed\" type=\"button\" class=\"tao-date__link\" @click=\"clear\">\r\n <slot name=\"clear\">{{ clearText }}</slot>\r\n </button>\r\n </div>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-date-range {\r\n width: 100%;\r\n}\r\n\r\n.tao-date-range__trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n height: var(--tao-field-height);\r\n padding: 0 var(--tao-space-3);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-input-bg);\r\n color: var(--tao-color-input-text);\r\n font-size: var(--tao-font-size-md);\r\n font-family: inherit;\r\n text-align: left;\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-date-range__trigger--placeholder {\r\n color: var(--tao-color-input-placeholder);\r\n}\r\n\r\n.tao-date-range__trigger:focus {\r\n outline: none;\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-date-range--invalid .tao-date-range__trigger {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-date-range--invalid .tao-date-range__trigger:focus {\r\n box-shadow: 0 0 0 2px var(--tao-color-danger-subtle);\r\n}\r\n\r\n.tao-date-range__trigger:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-date-range__value {\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-date-range__icon {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n opacity: 0.7;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\n\r\ndefineOptions({ name: 'TaoSwitch' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: boolean;\r\n label?: string;\r\n disabled?: boolean;\r\n }>(),\r\n {\r\n modelValue: false,\r\n label: '',\r\n disabled: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: boolean];\r\n change: [value: boolean];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => field?.id ?? localId);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nfunction toggle() {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n const next = !props.modelValue;\r\n emit('update:modelValue', next);\r\n emit('change', next);\r\n}\r\n</script>\r\n\r\n<template>\r\n <label class=\"tao-switch\" :class=\"{ 'tao-switch--disabled': disabled, 'tao-switch--on': modelValue, 'tao-switch--invalid': invalid }\" :for=\"controlId\">\r\n <input\r\n :id=\"controlId\"\r\n class=\"tao-switch__input\"\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n :checked=\"modelValue\"\r\n :disabled=\"disabled\"\r\n :aria-checked=\"modelValue\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n @change=\"toggle\"\r\n />\r\n <span class=\"tao-switch__track\" aria-hidden=\"true\">\r\n <span class=\"tao-switch__thumb\"></span>\r\n </span>\r\n <span v-if=\"label\" class=\"tao-switch__label\">{{ label }}</span>\r\n <span v-else-if=\"$slots.default\" class=\"tao-switch__label\"><slot /></span>\r\n </label>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-switch {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n cursor: pointer;\r\n user-select: none;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-switch__input {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.tao-switch__track {\r\n position: relative;\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n width: 36px;\r\n height: 20px;\r\n padding: 2px;\r\n pointer-events: none;\r\n background: var(--tao-color-surface-sunken);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-full);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-switch__thumb {\r\n width: 14px;\r\n height: 14px;\r\n background: var(--tao-color-text-muted);\r\n border-radius: var(--tao-radius-full);\r\n transform: translateX(0);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-switch--on .tao-switch__track {\r\n background: var(--tao-color-accent);\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-switch--on .tao-switch__thumb {\r\n background: var(--tao-color-on-accent);\r\n transform: translateX(16px);\r\n}\r\n\r\n.tao-switch__input:focus-visible + .tao-switch__track {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-switch__label {\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-switch--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n.tao-switch--invalid .tao-switch__track {\r\n border-color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","import type { ComputedRef, InjectionKey } from 'vue';\r\n\r\nexport type TaoRadioValue = string | number | boolean;\r\n\r\nexport interface TaoRadioGroupContext {\r\n name: ComputedRef<string>;\r\n model: ComputedRef<TaoRadioValue | undefined>;\r\n disabled: ComputedRef<boolean>;\r\n setValue: (value: TaoRadioValue) => void;\r\n}\r\n\r\nexport const radioGroupKey: InjectionKey<TaoRadioGroupContext> = Symbol('taoRadioGroup');\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { radioGroupKey, type TaoRadioValue } from '../radio';\r\n\r\ndefineOptions({ name: 'TaoRadio' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value: TaoRadioValue;\r\n modelValue?: TaoRadioValue;\r\n name?: string;\r\n label?: string;\r\n disabled?: boolean;\r\n }>(),\r\n {\r\n label: '',\r\n disabled: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoRadioValue];\r\n change: [value: TaoRadioValue];\r\n}>();\r\n\r\nconst group = inject(radioGroupKey, null);\r\nconst field = inject(formFieldKey, null);\r\nconst localId = useId();\r\nconst controlId = computed(() => (group ? localId : (field?.id ?? localId)));\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => (group ? undefined : field?.describedBy.value));\r\n\r\nconst isDisabled = computed(() => props.disabled || Boolean(group?.disabled.value));\r\nconst inputName = computed(() => group?.name.value ?? props.name);\r\nconst isChecked = computed(() => {\r\n const current = group ? group.model.value : props.modelValue;\r\n return current === props.value;\r\n});\r\n\r\nfunction onChange() {\r\n if (isDisabled.value) {\r\n return;\r\n }\r\n\r\n if (group) {\r\n group.setValue(props.value);\r\n return;\r\n }\r\n\r\n emit('update:modelValue', props.value);\r\n emit('change', props.value);\r\n}\r\n</script>\r\n\r\n<template>\r\n <label class=\"tao-radio\" :class=\"{ 'tao-radio--disabled': isDisabled, 'tao-radio--invalid': invalid && !group }\" :for=\"controlId\">\r\n <input\r\n :id=\"controlId\"\r\n class=\"tao-radio__input\"\r\n type=\"radio\"\r\n :name=\"inputName\"\r\n :value=\"String(value)\"\r\n :checked=\"isChecked\"\r\n :disabled=\"isDisabled\"\r\n :aria-invalid=\"(!group && invalid) || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n @change=\"onChange\"\r\n />\r\n <span class=\"tao-radio__dot\" aria-hidden=\"true\"></span>\r\n <span v-if=\"label\" class=\"tao-radio__label\">{{ label }}</span>\r\n <span v-else class=\"tao-radio__label\"><slot /></span>\r\n </label>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-radio {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n cursor: pointer;\r\n user-select: none;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-radio__input {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.tao-radio__dot {\r\n position: relative;\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n pointer-events: none;\r\n background: var(--tao-color-surface-raised);\r\n border: 2px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-full);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-radio__dot::after {\r\n content: '';\r\n width: 8px;\r\n height: 8px;\r\n background: transparent;\r\n border-radius: var(--tao-radius-full);\r\n transform: scale(0);\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-radio__input:checked + .tao-radio__dot {\r\n border-color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-radio__input:checked + .tao-radio__dot::after {\r\n background: var(--tao-color-accent);\r\n transform: scale(1);\r\n}\r\n\r\n.tao-radio__input:focus-visible + .tao-radio__dot {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 1px;\r\n}\r\n\r\n.tao-radio__label {\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-radio--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n.tao-radio--invalid .tao-radio__dot {\r\n border-color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, provide, useId } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { radioGroupKey, type TaoRadioValue } from '../radio';\r\n\r\ndefineOptions({ name: 'TaoRadioGroup' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TaoRadioValue;\r\n name?: string;\r\n legend?: string;\r\n disabled?: boolean;\r\n direction?: 'row' | 'column';\r\n }>(),\r\n {\r\n disabled: false,\r\n direction: 'row',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoRadioValue];\r\n change: [value: TaoRadioValue];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst autoName = useId();\r\nconst groupName = computed(() => props.name || autoName);\r\nconst model = computed(() => props.modelValue);\r\nconst groupDisabled = computed(() => props.disabled);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\nconst labelledBy = computed(() => (props.legend || !field ? undefined : `${field.id}-label`));\r\n\r\nfunction setValue(value: TaoRadioValue) {\r\n emit('update:modelValue', value);\r\n emit('change', value);\r\n}\r\n\r\nprovide(radioGroupKey, {\r\n name: groupName,\r\n model,\r\n disabled: groupDisabled,\r\n setValue,\r\n});\r\n</script>\r\n\r\n<template>\r\n <fieldset\r\n :id=\"field?.id\"\r\n class=\"tao-radio-group\"\r\n :class=\"[`tao-radio-group--${direction}`, { 'tao-radio-group--invalid': invalid }]\"\r\n :disabled=\"disabled\"\r\n :aria-describedby=\"describedBy\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-labelledby=\"labelledBy\"\r\n >\r\n <legend v-if=\"legend\" class=\"tao-radio-group__legend\">{{ legend }}</legend>\r\n <slot />\r\n </fieldset>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-radio-group {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--tao-space-3) var(--tao-space-4);\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n min-width: 0;\r\n}\r\n\r\n.tao-radio-group--column {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n}\r\n\r\n.tao-radio-group__legend {\r\n padding: 0;\r\n margin-bottom: var(--tao-space-2);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 500;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-radio-group--invalid :deep(.tao-radio__dot) {\r\n border-color: var(--tao-color-danger);\r\n}\r\n</style>\r\n","import type { ComputedRef, InjectionKey } from 'vue';\r\nimport type { TaoRadioValue } from './radio';\r\n\r\nexport type TaoSegmentedSize = 'small' | 'medium' | 'large';\r\n\r\nexport interface TaoSegmentedContext {\r\n name: ComputedRef<string>;\r\n model: ComputedRef<TaoRadioValue | undefined>;\r\n disabled: ComputedRef<boolean>;\r\n size: ComputedRef<TaoSegmentedSize>;\r\n setValue: (value: TaoRadioValue) => void;\r\n}\r\n\r\nexport const segmentedKey: InjectionKey<TaoSegmentedContext> = Symbol('taoSegmented');\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, nextTick, onBeforeUnmount, onMounted, provide, ref, useId, watch } from 'vue';\r\nimport { formFieldKey } from '../formField';\r\nimport { type TaoRadioValue } from '../radio';\r\nimport { segmentedKey, type TaoSegmentedSize } from '../segmented';\r\n\r\ndefineOptions({ name: 'TaoSegmented' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TaoRadioValue;\r\n name?: string;\r\n legend?: string;\r\n disabled?: boolean;\r\n size?: TaoSegmentedSize;\r\n block?: boolean;\r\n }>(),\r\n {\r\n disabled: false,\r\n size: 'medium',\r\n block: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoRadioValue];\r\n change: [value: TaoRadioValue];\r\n}>();\r\n\r\nconst field = inject(formFieldKey, null);\r\nconst autoName = useId();\r\nconst groupName = computed(() => props.name || autoName);\r\nconst model = computed(() => props.modelValue);\r\nconst groupDisabled = computed(() => props.disabled);\r\nconst groupSize = computed(() => props.size);\r\nconst invalid = computed(() => Boolean(field?.invalid.value));\r\nconst describedBy = computed(() => field?.describedBy.value);\r\n\r\nconst trackRef = ref<HTMLElement | null>(null);\r\nconst thumbStyle = ref<Record<string, string>>({ opacity: '0' });\r\nlet resizeObserver: ResizeObserver | null = null;\r\nlet mutationObserver: MutationObserver | null = null;\r\n\r\nfunction setValue(value: TaoRadioValue) {\r\n emit('update:modelValue', value);\r\n emit('change', value);\r\n}\r\n\r\nfunction updateThumb() {\r\n const track = trackRef.value;\r\n if (!track) {\r\n return;\r\n }\r\n\r\n const selected = track.querySelector<HTMLElement>('.tao-segmented-option--checked');\r\n if (!selected) {\r\n if (thumbStyle.value.opacity !== '0') {\r\n thumbStyle.value = { opacity: '0' };\r\n }\r\n return;\r\n }\r\n\r\n const trackBox = track.getBoundingClientRect();\r\n const optionBox = selected.getBoundingClientRect();\r\n const next = {\r\n width: `${optionBox.width}px`,\r\n height: `${optionBox.height}px`,\r\n transform: `translate(${optionBox.left - trackBox.left - track.clientLeft}px, ${optionBox.top - trackBox.top - track.clientTop}px)`,\r\n opacity: '1',\r\n };\r\n\r\n const prev = thumbStyle.value;\r\n if (\r\n prev.width === next.width &&\r\n prev.height === next.height &&\r\n prev.transform === next.transform &&\r\n prev.opacity === next.opacity\r\n ) {\r\n return;\r\n }\r\n\r\n thumbStyle.value = next;\r\n}\r\n\r\nprovide(segmentedKey, {\r\n name: groupName,\r\n model,\r\n disabled: groupDisabled,\r\n size: groupSize,\r\n setValue,\r\n});\r\n\r\nonMounted(() => {\r\n const track = trackRef.value;\r\n void nextTick(updateThumb);\r\n\r\n if (!track) {\r\n return;\r\n }\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n resizeObserver = new ResizeObserver(() => updateThumb());\r\n resizeObserver.observe(track);\r\n }\r\n\r\n mutationObserver = new MutationObserver(() => updateThumb());\r\n mutationObserver.observe(track, {\r\n subtree: true,\r\n childList: true,\r\n attributes: true,\r\n attributeFilter: ['class'],\r\n });\r\n});\r\n\r\nwatch(\r\n () => [props.modelValue, props.size, props.block, props.disabled] as const,\r\n () => {\r\n void nextTick(updateThumb);\r\n },\r\n);\r\n\r\nonBeforeUnmount(() => {\r\n resizeObserver?.disconnect();\r\n resizeObserver = null;\r\n mutationObserver?.disconnect();\r\n mutationObserver = null;\r\n});\r\n</script>\r\n\r\n<template>\r\n <fieldset\r\n class=\"tao-segmented\"\r\n :class=\"[\r\n `tao-segmented--${size}`,\r\n {\r\n 'tao-segmented--block': block,\r\n 'tao-segmented--disabled': disabled,\r\n 'tao-segmented--invalid': invalid,\r\n },\r\n ]\"\r\n :disabled=\"disabled\"\r\n :aria-describedby=\"describedBy\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-labelledby=\"legend ? undefined : (field ? `${field.id}-label` : undefined)\"\r\n :id=\"field?.id\"\r\n >\r\n <legend v-if=\"legend\" class=\"tao-segmented__legend\">{{ legend }}</legend>\r\n <div ref=\"trackRef\" class=\"tao-segmented__track\">\r\n <div class=\"tao-segmented__thumb\" :style=\"thumbStyle\" aria-hidden=\"true\"></div>\r\n <slot />\r\n </div>\r\n </fieldset>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-segmented {\r\n display: inline-flex;\r\n flex-direction: column;\r\n align-items: flex-start;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n min-width: 0;\r\n vertical-align: top;\r\n}\r\n\r\n.tao-segmented--block {\r\n display: flex;\r\n width: 100%;\r\n align-items: stretch;\r\n}\r\n\r\n.tao-segmented__legend {\r\n padding: 0;\r\n margin-bottom: var(--tao-space-2);\r\n font-size: var(--tao-font-size-sm);\r\n font-weight: 500;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-segmented__track {\r\n position: relative;\r\n display: inline-flex;\r\n flex-wrap: nowrap;\r\n align-items: stretch;\r\n max-width: 100%;\r\n padding: 2px;\r\n overflow: hidden;\r\n background: var(--tao-color-surface-sunken);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-segmented--block .tao-segmented__track {\r\n display: flex;\r\n width: 100%;\r\n}\r\n\r\n.tao-segmented--block .tao-segmented__track > :deep(.tao-segmented-option) {\r\n flex: 1 1 0;\r\n min-width: 0;\r\n}\r\n\r\n.tao-segmented--block .tao-segmented__track > :deep(.tao-segmented-option__label) {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.tao-segmented__thumb {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n z-index: 0;\r\n background: var(--tao-color-surface-raised);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: calc(var(--tao-radius-control) - 1px);\r\n box-shadow: var(--tao-shadow-sm);\r\n pointer-events: none;\r\n transition:\r\n transform var(--tao-duration-base) var(--tao-ease-base),\r\n width var(--tao-duration-base) var(--tao-ease-base),\r\n height var(--tao-duration-base) var(--tao-ease-base),\r\n opacity var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-segmented--invalid .tao-segmented__track {\r\n border-color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-segmented--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .tao-segmented__thumb {\r\n transition: none;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, useId, useSlots } from 'vue';\r\nimport { type TaoRadioValue } from '../radio';\r\nimport { segmentedKey } from '../segmented';\r\n\r\ndefineOptions({ name: 'TaoSegmentedOption' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value: TaoRadioValue;\r\n modelValue?: TaoRadioValue;\r\n name?: string;\r\n label?: string;\r\n icon?: string;\r\n count?: number | string;\r\n disabled?: boolean;\r\n ariaLabel?: string;\r\n }>(),\r\n {\r\n label: '',\r\n icon: '',\r\n disabled: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TaoRadioValue];\r\n change: [value: TaoRadioValue];\r\n}>();\r\n\r\nconst group = inject(segmentedKey, null);\r\nconst slots = useSlots();\r\nconst localId = useId();\r\n\r\nconst isDisabled = computed(() => props.disabled || Boolean(group?.disabled.value));\r\nconst inputName = computed(() => group?.name.value ?? props.name);\r\nconst size = computed(() => group?.size.value ?? 'medium');\r\nconst isChecked = computed(() => {\r\n const current = group ? group.model.value : props.modelValue;\r\n return current === props.value;\r\n});\r\n\r\nconst hasLabel = computed(() => Boolean(props.label || slots.default));\r\nconst isIconOnly = computed(() => Boolean((props.icon || slots.icon) && !hasLabel.value));\r\n\r\nconst countLabel = computed(() => {\r\n if (props.count === undefined || props.count === null || props.count === '') {\r\n return '';\r\n }\r\n\r\n if (typeof props.count === 'number') {\r\n if (props.count > 99) {\r\n return '99+';\r\n }\r\n\r\n return String(props.count);\r\n }\r\n\r\n return String(props.count);\r\n});\r\n\r\nfunction onChange() {\r\n if (isDisabled.value) {\r\n return;\r\n }\r\n\r\n if (group) {\r\n group.setValue(props.value);\r\n return;\r\n }\r\n\r\n emit('update:modelValue', props.value);\r\n emit('change', props.value);\r\n}\r\n</script>\r\n\r\n<template>\r\n <label\r\n class=\"tao-segmented-option\"\r\n :class=\"[\r\n `tao-segmented-option--${size}`,\r\n {\r\n 'tao-segmented-option--checked': isChecked,\r\n 'tao-segmented-option--disabled': props.disabled,\r\n 'tao-segmented-option--icon-only': isIconOnly,\r\n },\r\n ]\"\r\n :for=\"localId\"\r\n >\r\n <input\r\n :id=\"localId\"\r\n class=\"tao-segmented-option__input\"\r\n type=\"radio\"\r\n :name=\"inputName\"\r\n :value=\"String(value)\"\r\n :checked=\"isChecked\"\r\n :disabled=\"isDisabled\"\r\n :aria-label=\"ariaLabel\"\r\n @change=\"onChange\"\r\n />\r\n <span class=\"tao-segmented-option__face\">\r\n <span v-if=\"icon || $slots.icon\" class=\"tao-segmented-option__icon\" aria-hidden=\"true\">\r\n <slot name=\"icon\">{{ icon }}</slot>\r\n </span>\r\n <span v-if=\"hasLabel\" class=\"tao-segmented-option__label\">\r\n <slot>{{ label }}</slot>\r\n </span>\r\n <span v-else-if=\"ariaLabel\" class=\"tao-segmented-option__sr\">{{ ariaLabel }}</span>\r\n <span v-if=\"countLabel\" class=\"tao-segmented-option__count\">{{ countLabel }}</span>\r\n </span>\r\n </label>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-segmented-option {\r\n position: relative;\r\n z-index: 1;\r\n display: inline-flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n min-width: 0;\r\n cursor: pointer;\r\n user-select: none;\r\n color: var(--tao-color-text-subtle);\r\n}\r\n\r\n.tao-segmented-option__face {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--tao-space-1);\r\n width: 100%;\r\n border-radius: calc(var(--tao-radius-control) - 1px);\r\n font-family: inherit;\r\n font-weight: 500;\r\n line-height: 1.25;\r\n white-space: nowrap;\r\n transition:\r\n color var(--tao-duration-base) var(--tao-ease-base),\r\n background var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-segmented-option--small .tao-segmented-option__face {\r\n /* the track adds 6px: padding 2 + border 1 on each side / дорожка добавляет 6px */\r\n min-height: calc(var(--tao-control-height-small) - 6px);\r\n padding: 0 var(--tao-space-2);\r\n font-size: var(--tao-font-size-xs);\r\n}\r\n\r\n.tao-segmented-option--medium .tao-segmented-option__face {\r\n min-height: calc(var(--tao-control-height-medium) - 6px);\r\n padding: 0 var(--tao-space-3);\r\n font-size: var(--tao-font-size-sm);\r\n}\r\n\r\n.tao-segmented-option--large .tao-segmented-option__face {\r\n min-height: calc(var(--tao-control-height-large) - 6px);\r\n padding: 0 var(--tao-space-4);\r\n font-size: var(--tao-font-size-md);\r\n}\r\n\r\n.tao-segmented-option--icon-only.tao-segmented-option--small .tao-segmented-option__face {\r\n min-width: 20px;\r\n padding: 0;\r\n}\r\n\r\n.tao-segmented-option--icon-only.tao-segmented-option--medium .tao-segmented-option__face {\r\n min-width: 24px;\r\n padding: 0;\r\n}\r\n\r\n.tao-segmented-option--icon-only.tao-segmented-option--large .tao-segmented-option__face {\r\n min-width: 32px;\r\n padding: 0;\r\n}\r\n\r\n.tao-segmented-option__icon {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n line-height: 1;\r\n}\r\n\r\n.tao-segmented-option__label {\r\n min-width: 0;\r\n line-height: 1.25;\r\n}\r\n\r\n.tao-segmented-option__count {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 1.15em;\r\n height: 1.15em;\r\n padding: 0 4px;\r\n border-radius: var(--tao-radius-full);\r\n background: var(--tao-color-accent-subtle);\r\n color: var(--tao-color-accent);\r\n font-size: 10px;\r\n font-weight: 700;\r\n line-height: 1;\r\n}\r\n\r\n.tao-segmented-option:hover:not(.tao-segmented-option--disabled):not(.tao-segmented-option--checked) {\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-segmented-option--checked {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-segmented-option--checked .tao-segmented-option__count {\r\n background: color-mix(in srgb, var(--tao-color-accent) 22%, transparent);\r\n}\r\n\r\n.tao-segmented-option--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.55;\r\n}\r\n\r\n.tao-segmented-option__input {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.tao-segmented-option__sr {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n.tao-segmented-option__input:focus-visible + .tao-segmented-option__face {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: -2px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\ndefineOptions({ name: 'TaoAlert' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n type?: 'success' | 'error' | 'danger' | 'warning' | 'info' | 'neutral';\r\n title?: string;\r\n closable?: boolean;\r\n closeLabel?: string;\r\n }>(),\r\n {\r\n type: 'info',\r\n title: '',\r\n closable: false,\r\n closeLabel: 'Закрыть',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n close: [];\r\n}>();\r\n\r\nconst tone = computed(() => (props.type === 'danger' ? 'error' : props.type));\r\nconst live = computed(() => (tone.value === 'error' || tone.value === 'warning' ? 'assertive' : 'polite'));\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-alert\"\r\n :class=\"`tao-alert--${tone}`\"\r\n :role=\"tone === 'error' ? 'alert' : 'status'\"\r\n :aria-live=\"live\"\r\n >\r\n <div class=\"tao-alert__body\">\r\n <strong v-if=\"title\" class=\"tao-alert__title\">{{ title }}</strong>\r\n <p v-if=\"$slots.default\" class=\"tao-alert__message\"><slot /></p>\r\n </div>\r\n <button\r\n v-if=\"closable\"\r\n type=\"button\"\r\n class=\"tao-alert__close\"\r\n :aria-label=\"closeLabel\"\r\n @click=\"emit('close')\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"close-icon\">&times;</slot>\r\n </span>\r\n </button>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-alert {\r\n --tao-alert-tone: var(--tao-color-info);\r\n\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--tao-space-3);\r\n width: 100%;\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n background: color-mix(in srgb, var(--tao-alert-tone) 10%, var(--tao-color-surface-raised));\r\n color: var(--tao-color-text);\r\n border: 1px solid color-mix(in srgb, var(--tao-alert-tone) 35%, var(--tao-color-border));\r\n border-radius: var(--tao-radius-panel);\r\n}\r\n\r\n.tao-alert--success {\r\n --tao-alert-tone: var(--tao-color-success);\r\n}\r\n\r\n.tao-alert--error,\r\n.tao-alert--danger {\r\n --tao-alert-tone: var(--tao-color-danger);\r\n}\r\n\r\n.tao-alert--warning {\r\n --tao-alert-tone: var(--tao-color-warning);\r\n}\r\n\r\n.tao-alert--info {\r\n --tao-alert-tone: var(--tao-color-info);\r\n}\r\n\r\n.tao-alert--neutral {\r\n --tao-alert-tone: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-alert__body {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n min-width: 0;\r\n flex: 1;\r\n}\r\n\r\n.tao-alert__title {\r\n font-size: var(--tao-font-size-md);\r\n font-weight: 600;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-alert__message {\r\n margin: 0;\r\n font-size: var(--tao-font-size-sm);\r\n line-height: 1.45;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-alert__close {\r\n flex-shrink: 0;\r\n margin: calc(-1 * var(--tao-space-1)) calc(-1 * var(--tao-space-2)) 0 0;\r\n padding: 0;\r\n border: none;\r\n background: none;\r\n color: var(--tao-color-text-muted);\r\n font-size: 20px;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-alert__close:hover {\r\n color: var(--tao-color-text-strong);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\nimport TaoLoader from './TaoLoader.vue';\r\nimport type { TaoTableColumn, TaoTableSort } from '../table';\r\n\r\ndefineOptions({ name: 'TaoTable' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n columns: TaoTableColumn[];\r\n rows?: Record<string, unknown>[];\r\n rowKey?: string | ((row: Record<string, unknown>, index: number) => string | number);\r\n loading?: boolean;\r\n emptyText?: string;\r\n /** Зебра. `true` / `odd` — с первой строки, `even` — со второй. */\r\n striped?: boolean | 'odd' | 'even';\r\n compact?: boolean;\r\n hover?: boolean;\r\n /** Подсветка шапки. */\r\n head?: boolean;\r\n /** Горизонтальные линии между рядами. */\r\n lines?: boolean;\r\n sticky?: boolean;\r\n maxHeight?: string;\r\n clickable?: boolean;\r\n sort?: TaoTableSort | null;\r\n caption?: string;\r\n }>(),\r\n {\r\n rows: () => [],\r\n rowKey: 'id',\r\n loading: false,\r\n emptyText: 'Нет данных',\r\n striped: false,\r\n compact: false,\r\n hover: true,\r\n head: true,\r\n lines: true,\r\n sticky: false,\r\n maxHeight: '',\r\n clickable: false,\r\n sort: null,\r\n caption: '',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:sort': [value: TaoTableSort | null];\r\n sort: [value: TaoTableSort | null];\r\n 'row-click': [row: Record<string, unknown>, index: number];\r\n}>();\r\n\r\nconst colCount = computed(() => Math.max(props.columns.length, 1));\r\nconst isEmpty = computed(() => !props.rows.length && !props.loading);\r\nconst stripeFrom = computed(() => {\r\n if (props.striped === 'even') {\r\n return 'even';\r\n }\r\n if (props.striped === 'odd' || props.striped === true) {\r\n return 'odd';\r\n }\r\n return null;\r\n});\r\n\r\nfunction columnWidth(column: TaoTableColumn) {\r\n if (column.width == null) {\r\n return undefined;\r\n }\r\n return typeof column.width === 'number' ? `${column.width}px` : column.width;\r\n}\r\n\r\nfunction cellValue(row: Record<string, unknown>, column: TaoTableColumn) {\r\n if (column.value) {\r\n return column.value(row);\r\n }\r\n return row[column.key];\r\n}\r\n\r\nfunction rowId(row: Record<string, unknown>, index: number) {\r\n if (typeof props.rowKey === 'function') {\r\n return props.rowKey(row, index);\r\n }\r\n const key = row[props.rowKey];\r\n return key == null ? index : String(key);\r\n}\r\n\r\nfunction sortDir(column: TaoTableColumn) {\r\n if (!props.sort || props.sort.key !== column.key) {\r\n return null;\r\n }\r\n return props.sort.dir;\r\n}\r\n\r\nfunction toggleSort(column: TaoTableColumn) {\r\n if (!column.sortable) {\r\n return;\r\n }\r\n\r\n const current = sortDir(column);\r\n const next: TaoTableSort | null =\r\n current == null ? { key: column.key, dir: 'asc' } : current === 'asc' ? { key: column.key, dir: 'desc' } : null;\r\n\r\n emit('update:sort', next);\r\n emit('sort', next);\r\n}\r\n\r\nfunction onRowClick(row: Record<string, unknown>, index: number) {\r\n if (!props.clickable) {\r\n return;\r\n }\r\n emit('row-click', row, index);\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-table-wrap\"\r\n :class=\"{\r\n 'tao-table-wrap--sticky': sticky,\r\n 'tao-table-wrap--loading': loading,\r\n }\"\r\n :style=\"maxHeight ? { maxHeight } : undefined\"\r\n >\r\n <table\r\n class=\"tao-table\"\r\n :class=\"{\r\n 'tao-table--striped': stripeFrom === 'odd',\r\n 'tao-table--striped-even': stripeFrom === 'even',\r\n 'tao-table--compact': compact,\r\n 'tao-table--hover': hover,\r\n 'tao-table--head': head,\r\n 'tao-table--lines': lines,\r\n 'tao-table--clickable': clickable,\r\n 'tao-table--sticky': sticky,\r\n }\"\r\n >\r\n <caption v-if=\"caption\">{{ caption }}</caption>\r\n <thead>\r\n <tr>\r\n <th\r\n v-for=\"column in columns\"\r\n :key=\"column.key\"\r\n :style=\"{ width: columnWidth(column), textAlign: column.align || 'left' }\"\r\n scope=\"col\"\r\n :aria-sort=\"\r\n column.sortable\r\n ? sortDir(column) === 'asc'\r\n ? 'ascending'\r\n : sortDir(column) === 'desc'\r\n ? 'descending'\r\n : 'none'\r\n : undefined\r\n \"\r\n >\r\n <button\r\n v-if=\"column.sortable\"\r\n type=\"button\"\r\n class=\"tao-table__sort-btn\"\r\n @click=\"toggleSort(column)\"\r\n >\r\n <span>{{ column.label }}</span>\r\n <span\r\n class=\"tao-table__sorter\"\r\n :class=\"{\r\n 'tao-table__sorter--asc': sortDir(column) === 'asc',\r\n 'tao-table__sorter--desc': sortDir(column) === 'desc',\r\n }\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n <span v-else>{{ column.label }}</span>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr v-if=\"isEmpty\">\r\n <td class=\"tao-table__empty\" :colspan=\"colCount\">\r\n <slot name=\"empty\">{{ emptyText }}</slot>\r\n </td>\r\n </tr>\r\n <tr\r\n v-for=\"(row, index) in rows\"\r\n :key=\"rowId(row, index)\"\r\n @click=\"onRowClick(row, index)\"\r\n >\r\n <td\r\n v-for=\"column in columns\"\r\n :key=\"column.key\"\r\n :style=\"{ textAlign: column.align || 'left' }\"\r\n >\r\n <slot\r\n :name=\"`cell-${column.key}`\"\r\n :row=\"row\"\r\n :column=\"column\"\r\n :value=\"cellValue(row, column)\"\r\n :index=\"index\"\r\n >\r\n <slot name=\"cell\" :row=\"row\" :column=\"column\" :value=\"cellValue(row, column)\" :index=\"index\">\r\n {{ cellValue(row, column) }}\r\n </slot>\r\n </slot>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <div v-if=\"loading\" class=\"tao-table__loading\" aria-busy=\"true\">\r\n <slot name=\"loading\">\r\n <TaoLoader :size=\"36\" />\r\n </slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-table-wrap {\r\n position: relative;\r\n width: 100%;\r\n overflow: auto;\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-panel);\r\n background: var(--tao-color-surface);\r\n}\r\n\r\n.tao-table-wrap--loading {\r\n min-height: 120px;\r\n}\r\n\r\n.tao-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n font-size: var(--tao-font-size-md);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-table caption {\r\n caption-side: top;\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n text-align: left;\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-table th,\r\n.tao-table td {\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n vertical-align: middle;\r\n}\r\n\r\n.tao-table--lines th,\r\n.tao-table--lines td {\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-table--compact th,\r\n.tao-table--compact td {\r\n padding: var(--tao-space-2) var(--tao-space-3);\r\n font-size: var(--tao-font-size-sm);\r\n}\r\n\r\n.tao-table th {\r\n font-weight: 600;\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text-muted);\r\n white-space: nowrap;\r\n text-align: left;\r\n}\r\n\r\n.tao-table--head th {\r\n background: var(--tao-color-surface-raised);\r\n}\r\n\r\n.tao-table--sticky thead th {\r\n position: sticky;\r\n top: 0;\r\n z-index: 1;\r\n background: var(--tao-color-surface);\r\n}\r\n\r\n.tao-table--sticky.tao-table--head thead th {\r\n background: var(--tao-color-surface-raised);\r\n}\r\n\r\n.tao-table--lines tbody tr:last-child td {\r\n border-bottom: none;\r\n}\r\n\r\n.tao-table--striped tbody tr:nth-child(odd) td {\r\n background: var(--tao-color-surface-sunken);\r\n}\r\n\r\n.tao-table--striped-even tbody tr:nth-child(even) td {\r\n background: var(--tao-color-surface-sunken);\r\n}\r\n\r\n.tao-table--hover tbody tr:hover td {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-table--clickable tbody tr {\r\n cursor: pointer;\r\n}\r\n\r\n.tao-table__sort-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n margin: 0;\r\n padding: 0;\r\n border: 0;\r\n background: none;\r\n color: inherit;\r\n font: inherit;\r\n font-weight: 600;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-table__sort-btn:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-table__sorter {\r\n position: relative;\r\n width: 8px;\r\n height: 12px;\r\n opacity: 0.35;\r\n}\r\n\r\n.tao-table__sorter::before,\r\n.tao-table__sorter::after {\r\n content: '';\r\n position: absolute;\r\n left: 0;\r\n border-left: 4px solid transparent;\r\n border-right: 4px solid transparent;\r\n}\r\n\r\n.tao-table__sorter::before {\r\n top: 0;\r\n border-bottom: 4px solid currentColor;\r\n}\r\n\r\n.tao-table__sorter::after {\r\n bottom: 0;\r\n border-top: 4px solid currentColor;\r\n}\r\n\r\n.tao-table__sorter--asc,\r\n.tao-table__sorter--desc {\r\n opacity: 1;\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-table__sorter--asc::after,\r\n.tao-table__sorter--desc::before {\r\n opacity: 0.25;\r\n}\r\n\r\n.tao-table__empty {\r\n padding: var(--tao-space-8) var(--tao-space-4);\r\n text-align: center;\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-table__loading {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: color-mix(in srgb, var(--tao-color-surface) 72%, transparent);\r\n}\r\n</style>\r\n","export type TaoPaginationItem =\r\n | { type: 'page'; page: number }\r\n | { type: 'ellipsis'; id: 'left' | 'right' };\r\n\r\nexport function buildPaginationItems(\r\n page: number,\r\n pageCount: number,\r\n siblingCount = 1,\r\n): TaoPaginationItem[] {\r\n if (pageCount <= 0) {\r\n return [];\r\n }\r\n\r\n if (pageCount <= 7) {\r\n return Array.from({ length: pageCount }, (_, index) => ({ type: 'page' as const, page: index + 1 }));\r\n }\r\n\r\n const current = Math.min(Math.max(page, 1), pageCount);\r\n const siblings = Math.max(0, siblingCount);\r\n const left = Math.max(2, current - siblings);\r\n const right = Math.min(pageCount - 1, current + siblings);\r\n const items: TaoPaginationItem[] = [{ type: 'page', page: 1 }];\r\n\r\n if (left > 2) {\r\n items.push({ type: 'ellipsis', id: 'left' });\r\n }\r\n\r\n for (let next = left; next <= right; next += 1) {\r\n items.push({ type: 'page', page: next });\r\n }\r\n\r\n if (right < pageCount - 1) {\r\n items.push({ type: 'ellipsis', id: 'right' });\r\n }\r\n\r\n items.push({ type: 'page', page: pageCount });\r\n return items;\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { computed, watch } from 'vue';\r\nimport { buildPaginationItems } from '../pagination';\r\n\r\ndefineOptions({ name: 'TaoPagination' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n page?: number;\r\n total?: number;\r\n pageSize?: number;\r\n siblingCount?: number;\r\n disabled?: boolean;\r\n showTotal?: boolean;\r\n size?: 'small' | 'medium';\r\n /** Click ellipsis to skip this many pages. 0 keeps … decorative. */\r\n jump?: number;\r\n ariaLabel?: string;\r\n prevLabel?: string;\r\n nextLabel?: string;\r\n /** `{page}` — номер страницы. */\r\n pageLabel?: string;\r\n /** `{n}` — сколько страниц перескакивает «…». */\r\n jumpPrevLabel?: string;\r\n jumpNextLabel?: string;\r\n }>(),\r\n {\r\n page: 1,\r\n total: 0,\r\n pageSize: 10,\r\n siblingCount: 1,\r\n disabled: false,\r\n showTotal: true,\r\n size: 'medium',\r\n jump: 5,\r\n ariaLabel: 'Пагинация',\r\n prevLabel: 'Назад',\r\n nextLabel: 'Вперёд',\r\n pageLabel: 'Страница {page}',\r\n jumpPrevLabel: 'Назад на {n} страниц',\r\n jumpNextLabel: 'Вперёд на {n} страниц',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:page': [value: number];\r\n change: [value: number];\r\n}>();\r\n\r\nconst pageCount = computed(() => Math.max(1, Math.ceil(Math.max(props.total, 0) / Math.max(props.pageSize, 1))));\r\nconst current = computed(() => Math.min(Math.max(props.page, 1), pageCount.value));\r\nconst items = computed(() => buildPaginationItems(current.value, pageCount.value, props.siblingCount));\r\n\r\nconst from = computed(() => (props.total === 0 ? 0 : (current.value - 1) * props.pageSize + 1));\r\nconst to = computed(() => Math.min(current.value * props.pageSize, props.total));\r\n\r\nwatch(\r\n () => [props.page, pageCount.value] as const,\r\n ([page, count]) => {\r\n if (page > count || page < 1) {\r\n goTo(page);\r\n }\r\n },\r\n { immediate: true },\r\n);\r\n\r\nfunction goTo(next: number) {\r\n if (props.disabled) {\r\n return;\r\n }\r\n\r\n const page = Math.min(Math.max(next, 1), pageCount.value);\r\n if (page === props.page) {\r\n return;\r\n }\r\n\r\n emit('update:page', page);\r\n emit('change', page);\r\n}\r\n</script>\r\n\r\n<template>\r\n <nav class=\"tao-pagination\" :class=\"`tao-pagination--${size}`\" :aria-label=\"ariaLabel\">\r\n <p v-if=\"showTotal\" class=\"tao-pagination__total\">\r\n <slot name=\"total\" :from=\"from\" :to=\"to\" :total=\"total\">\r\n <template v-if=\"total === 0\">0 из 0</template>\r\n <template v-else>{{ from }}–{{ to }} из {{ total }}</template>\r\n </slot>\r\n </p>\r\n\r\n <div class=\"tao-pagination__pages\">\r\n <button\r\n type=\"button\"\r\n class=\"tao-pagination__btn\"\r\n :aria-label=\"prevLabel\"\r\n :disabled=\"disabled || current <= 1\"\r\n @click=\"goTo(current - 1)\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"prev-icon\">‹</slot>\r\n </span>\r\n </button>\r\n\r\n <template v-for=\"item in items\" :key=\"item.type === 'page' ? item.page : item.id\">\r\n <button\r\n v-if=\"item.type === 'ellipsis' && jump > 0\"\r\n type=\"button\"\r\n class=\"tao-pagination__btn tao-pagination__btn--jump\"\r\n :aria-label=\"item.id === 'left' ? jumpPrevLabel.replace('{n}', String(jump)) : jumpNextLabel.replace('{n}', String(jump))\"\r\n :disabled=\"disabled\"\r\n @click=\"goTo(item.id === 'left' ? current - jump : current + jump)\"\r\n >\r\n …\r\n </button>\r\n <span v-else-if=\"item.type === 'ellipsis'\" class=\"tao-pagination__ellipsis\" aria-hidden=\"true\">…</span>\r\n <button\r\n v-else\r\n type=\"button\"\r\n class=\"tao-pagination__btn\"\r\n :class=\"{ 'tao-pagination__btn--current': item.page === current }\"\r\n :aria-current=\"item.page === current ? 'page' : undefined\"\r\n :aria-label=\"pageLabel.replace('{page}', String(item.page))\"\r\n :disabled=\"disabled\"\r\n @click=\"goTo(item.page)\"\r\n >\r\n {{ item.page }}\r\n </button>\r\n </template>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"tao-pagination__btn\"\r\n :aria-label=\"nextLabel\"\r\n :disabled=\"disabled || current >= pageCount\"\r\n @click=\"goTo(current + 1)\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"next-icon\">›</slot>\r\n </span>\r\n </button>\r\n </div>\r\n </nav>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-pagination {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--tao-space-3);\r\n width: 100%;\r\n}\r\n\r\n.tao-pagination__total {\r\n margin: 0;\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-pagination__pages {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: var(--tao-space-1);\r\n}\r\n\r\n.tao-pagination__btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 36px;\r\n height: 36px;\r\n padding: 0 var(--tao-space-2);\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-control);\r\n background: var(--tao-color-surface-sunken);\r\n color: var(--tao-color-text);\r\n font-family: inherit;\r\n font-size: var(--tao-font-size-md);\r\n line-height: 1;\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-pagination--small .tao-pagination__btn {\r\n min-width: 28px;\r\n height: 28px;\r\n font-size: var(--tao-font-size-xs);\r\n}\r\n\r\n.tao-pagination__btn:hover:not(:disabled) {\r\n background: var(--tao-color-surface-hover);\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-pagination__btn:focus-visible {\r\n outline: none;\r\n border-color: var(--tao-color-accent);\r\n box-shadow: 0 0 0 2px var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-pagination__btn--current {\r\n background: var(--tao-color-accent);\r\n border-color: var(--tao-color-accent);\r\n color: var(--tao-color-on-accent);\r\n}\r\n\r\n.tao-pagination__btn--current:hover:not(:disabled) {\r\n background: var(--tao-color-accent-hover);\r\n color: var(--tao-color-on-accent);\r\n}\r\n\r\n.tao-pagination__btn--jump {\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-pagination__btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-pagination__ellipsis {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 24px;\r\n color: var(--tao-color-text-muted);\r\n user-select: none;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({ name: 'TaoEmpty' });\r\n\r\nwithDefaults(\r\n defineProps<{\r\n title?: string;\r\n }>(),\r\n {\r\n title: 'Ничего нет',\r\n },\r\n);\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-empty\">\r\n <div v-if=\"$slots.icon\" class=\"tao-empty__icon\">\r\n <slot name=\"icon\" />\r\n </div>\r\n <p v-if=\"title\" class=\"tao-empty__title\">{{ title }}</p>\r\n <p v-if=\"$slots.default\" class=\"tao-empty__text\"><slot /></p>\r\n <div v-if=\"$slots.action\" class=\"tao-empty__action\">\r\n <slot name=\"action\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--tao-space-2);\r\n padding: var(--tao-space-8) var(--tao-space-4);\r\n text-align: center;\r\n}\r\n\r\n.tao-empty__icon {\r\n color: var(--tao-color-text-muted);\r\n font-size: 32px;\r\n line-height: 1;\r\n}\r\n\r\n.tao-empty__title {\r\n margin: 0;\r\n font-size: var(--tao-font-size-lg);\r\n font-weight: 600;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-empty__text {\r\n margin: 0;\r\n max-width: 36ch;\r\n font-size: var(--tao-font-size-sm);\r\n color: var(--tao-color-text-muted);\r\n line-height: 1.5;\r\n}\r\n\r\n.tao-empty__action {\r\n margin-top: var(--tao-space-2);\r\n}\r\n</style>\r\n","import type { ComputedRef, InjectionKey } from 'vue';\r\n\r\nexport type TaoListSize = 'small' | 'medium' | 'large';\r\n\r\nexport interface TaoListContext {\r\n size: ComputedRef<TaoListSize>;\r\n}\r\n\r\nexport const taoListKey: InjectionKey<TaoListContext> = Symbol('taoList');\r\n","<script lang=\"ts\" setup>\r\nimport { computed, provide } from 'vue';\r\nimport { taoListKey, type TaoListSize } from '../list';\r\n\r\ndefineOptions({ name: 'TaoList' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n size?: TaoListSize;\r\n /** Рамка, как у списка файлов. */\r\n bordered?: boolean;\r\n /** Линии между строками. */\r\n divided?: boolean;\r\n /** Скролл, если строки не влезают. Число — пиксели. */\r\n maxHeight?: number | string;\r\n /** Показать `#empty` вместо строк. */\r\n empty?: boolean;\r\n ariaLabel?: string;\r\n }>(),\r\n {\r\n size: 'medium',\r\n bordered: true,\r\n divided: true,\r\n empty: false,\r\n ariaLabel: '',\r\n },\r\n);\r\n\r\nconst size = computed(() => props.size);\r\nprovide(taoListKey, { size });\r\n\r\nconst listStyle = computed(() => {\r\n if (props.maxHeight === undefined || props.maxHeight === '') {\r\n return undefined;\r\n }\r\n const value = typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight;\r\n return { maxHeight: value };\r\n});\r\n</script>\r\n\r\n<template>\r\n <ul\r\n class=\"tao-list\"\r\n :class=\"[\r\n `tao-list--${size}`,\r\n {\r\n 'tao-list--bordered': bordered,\r\n 'tao-list--divided': divided,\r\n 'tao-list--plain': !bordered,\r\n 'tao-list--empty': empty,\r\n 'tao-list--scroll': Boolean(maxHeight),\r\n },\r\n ]\"\r\n :style=\"listStyle\"\r\n :aria-label=\"ariaLabel || undefined\"\r\n >\r\n <li v-if=\"empty\" class=\"tao-list__empty\">\r\n <slot name=\"empty\">Ничего нет</slot>\r\n </li>\r\n <slot v-else />\r\n </ul>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-list {\r\n box-sizing: border-box;\r\n width: 100%;\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n background: var(--tao-color-surface-raised);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-list--bordered {\r\n overflow: hidden;\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-list--plain {\r\n padding: var(--tao-space-1);\r\n background: transparent;\r\n}\r\n\r\n.tao-list--scroll {\r\n overflow: auto;\r\n}\r\n\r\n.tao-list--divided :deep(.tao-list-item:not(:last-child)) {\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-list--plain :deep(.tao-list-item) {\r\n border-radius: var(--tao-radius-sm);\r\n}\r\n\r\n.tao-list__empty {\r\n margin: 0;\r\n padding: var(--tao-space-3);\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-sm);\r\n line-height: 1.45;\r\n text-align: center;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, inject, useSlots } from 'vue';\r\nimport { taoListKey, type TaoListSize } from '../list';\r\n\r\ndefineOptions({ name: 'TaoListItem' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n title?: string;\r\n description?: string;\r\n selected?: boolean;\r\n disabled?: boolean;\r\n /** Подсветка без selected — курсор / клавиатура. */\r\n active?: boolean;\r\n /** Строка-кнопка: Enter/Space, курсор pointer. */\r\n clickable?: boolean;\r\n size?: TaoListSize;\r\n /** `#action` всегда на виду, не только по ховеру. */\r\n actionAlways?: boolean;\r\n }>(),\r\n {\r\n title: '',\r\n description: '',\r\n selected: false,\r\n disabled: false,\r\n active: false,\r\n clickable: false,\r\n actionAlways: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n click: [event: MouseEvent];\r\n}>();\r\n\r\nconst slots = useSlots();\r\nconst list = inject(taoListKey, null);\r\n\r\nconst sizeClass = computed(() => {\r\n const size: TaoListSize = props.size ?? list?.size.value ?? 'medium';\r\n if (size === 'small') {\r\n return 's';\r\n }\r\n if (size === 'large') {\r\n return 'l';\r\n }\r\n return 'm';\r\n});\r\n\r\nconst hasAction = computed(() => Boolean(slots.action));\r\nconst hasPrefix = computed(() => Boolean(slots.prefix));\r\nconst hasSuffix = computed(() => Boolean(slots.suffix));\r\nconst hasDescription = computed(() => Boolean(props.description || slots.description));\r\n\r\nfunction onHitClick(event: MouseEvent) {\r\n if (props.disabled || !props.clickable) {\r\n return;\r\n }\r\n emit('click', event);\r\n}\r\n</script>\r\n\r\n<template>\r\n <li\r\n class=\"tao-list-item\"\r\n :class=\"[\r\n `tao-list-item--${sizeClass}`,\r\n {\r\n 'tao-list-item--selected': selected,\r\n 'tao-list-item--disabled': disabled,\r\n 'tao-list-item--active': active,\r\n 'tao-list-item--clickable': clickable,\r\n 'tao-list-item--has-action': hasAction,\r\n 'tao-list-item--action-always': actionAlways,\r\n },\r\n ]\"\r\n :aria-current=\"!clickable && selected ? 'true' : undefined\"\r\n :aria-disabled=\"disabled || undefined\"\r\n >\r\n <component\r\n :is=\"clickable ? 'button' : 'div'\"\r\n class=\"tao-list-item__hit\"\r\n :type=\"clickable ? 'button' : undefined\"\r\n :disabled=\"clickable ? disabled : undefined\"\r\n :aria-current=\"clickable && selected ? 'true' : undefined\"\r\n @click=\"onHitClick\"\r\n >\r\n <span v-if=\"hasPrefix\" class=\"tao-list-item__prefix\">\r\n <slot name=\"prefix\" />\r\n </span>\r\n <span class=\"tao-list-item__text\">\r\n <span class=\"tao-list-item__title\">\r\n <slot>{{ title }}</slot>\r\n </span>\r\n <span v-if=\"hasDescription\" class=\"tao-list-item__description\">\r\n <slot name=\"description\">{{ description }}</slot>\r\n </span>\r\n </span>\r\n <span v-if=\"hasSuffix\" class=\"tao-list-item__suffix\">\r\n <slot name=\"suffix\" />\r\n </span>\r\n </component>\r\n <div\r\n v-if=\"hasAction\"\r\n class=\"tao-list-item__action\"\r\n @click.stop\r\n @keydown.stop\r\n >\r\n <slot name=\"action\" />\r\n </div>\r\n </li>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-list-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-1);\r\n min-width: 0;\r\n color: var(--tao-color-text);\r\n transition: background var(--tao-duration-fast) var(--tao-ease-base);\r\n}\r\n\r\n.tao-list-item--s {\r\n min-height: 32px;\r\n padding: 0 var(--tao-space-1) 0 var(--tao-space-2);\r\n}\r\n\r\n.tao-list-item--m {\r\n min-height: 36px;\r\n padding: 0 var(--tao-space-2) 0 var(--tao-space-3);\r\n}\r\n\r\n.tao-list-item--l {\r\n min-height: 48px;\r\n padding: var(--tao-space-1) var(--tao-space-2) var(--tao-space-1) var(--tao-space-3);\r\n}\r\n\r\n.tao-list-item:hover:not(.tao-list-item--disabled),\r\n.tao-list-item--active:not(.tao-list-item--disabled) {\r\n background: var(--tao-color-surface-hover);\r\n}\r\n\r\n.tao-list-item--selected {\r\n background: var(--tao-color-accent-subtle);\r\n}\r\n\r\n.tao-list-item--selected:hover:not(.tao-list-item--disabled),\r\n.tao-list-item--selected.tao-list-item--active:not(.tao-list-item--disabled) {\r\n background: var(--tao-color-accent-subtle-hover);\r\n}\r\n\r\n.tao-list-item--disabled {\r\n opacity: 0.5;\r\n}\r\n\r\n.tao-list-item__hit {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n margin: 0;\r\n padding: var(--tao-space-2) 0;\r\n border: none;\r\n background: none;\r\n color: inherit;\r\n font: inherit;\r\n text-align: left;\r\n}\r\n\r\n.tao-list-item--s .tao-list-item__hit {\r\n padding: var(--tao-space-1) 0;\r\n gap: var(--tao-space-2);\r\n}\r\n\r\n.tao-list-item--l .tao-list-item__hit {\r\n padding: var(--tao-space-2) 0;\r\n}\r\n\r\nbutton.tao-list-item__hit {\r\n cursor: pointer;\r\n}\r\n\r\nbutton.tao-list-item__hit:disabled {\r\n cursor: not-allowed;\r\n}\r\n\r\nbutton.tao-list-item__hit:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: -2px;\r\n}\r\n\r\n.tao-list-item__prefix {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-list-item__prefix :deep(.tao-avatar) {\r\n display: block;\r\n}\r\n\r\n.tao-list-item__text {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1px;\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n}\r\n\r\n.tao-list-item__title {\r\n min-width: 0;\r\n overflow: hidden;\r\n font-size: var(--tao-font-size-md);\r\n line-height: 1.3;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-list-item--s .tao-list-item__title {\r\n font-size: var(--tao-font-size-sm);\r\n}\r\n\r\n.tao-list-item--selected .tao-list-item__title {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-list-item--clickable .tao-list-item__title {\r\n user-select: none;\r\n}\r\n\r\n.tao-list-item__description {\r\n min-width: 0;\r\n overflow: hidden;\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-xs);\r\n line-height: 1.3;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-list-item__suffix {\r\n flex-shrink: 0;\r\n color: var(--tao-color-text-muted);\r\n font-size: var(--tao-font-size-xs);\r\n white-space: nowrap;\r\n}\r\n\r\n.tao-list-item__action {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n@media (hover: hover) {\r\n .tao-list-item--has-action:not(.tao-list-item--action-always) .tao-list-item__action {\r\n opacity: 0;\r\n }\r\n\r\n .tao-list-item--has-action:not(.tao-list-item--action-always):hover .tao-list-item__action,\r\n .tao-list-item--has-action:not(.tao-list-item--action-always):focus-within .tao-list-item__action {\r\n opacity: 1;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoSkeleton' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n variant?: 'text' | 'title' | 'circle' | 'rect';\r\n lines?: number;\r\n width?: string;\r\n height?: string;\r\n }>(),\r\n {\r\n variant: 'text',\r\n lines: 1,\r\n width: '',\r\n height: '',\r\n },\r\n);\r\n\r\nconst count = computed(() => Math.max(1, props.lines));\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-skeleton-group\" :aria-hidden=\"true\">\r\n <span\r\n v-for=\"index in count\"\r\n :key=\"index\"\r\n class=\"tao-skeleton\"\r\n :class=\"`tao-skeleton--${variant}`\"\r\n :style=\"{ width: width || undefined, height: height || undefined }\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-skeleton-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n}\r\n\r\n.tao-skeleton {\r\n display: block;\r\n background: var(--tao-color-surface-sunken);\r\n border-radius: var(--tao-radius-control);\r\n animation: tao-skeleton-pulse 1.2s var(--tao-ease-base) infinite;\r\n}\r\n\r\n.tao-skeleton--text {\r\n height: 12px;\r\n width: 100%;\r\n}\r\n\r\n.tao-skeleton--text:last-child:not(:only-child) {\r\n width: 72%;\r\n}\r\n\r\n.tao-skeleton--title {\r\n height: 20px;\r\n width: 40%;\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-skeleton--circle {\r\n width: 40px;\r\n height: 40px;\r\n border-radius: var(--tao-radius-full);\r\n}\r\n\r\n.tao-skeleton--rect {\r\n width: 100%;\r\n height: 80px;\r\n border-radius: var(--tao-radius-panel);\r\n}\r\n\r\n@keyframes tao-skeleton-pulse {\r\n 0%,\r\n 100% {\r\n opacity: 0.55;\r\n }\r\n 50% {\r\n opacity: 1;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, ref, useId, watch } from 'vue';\r\nimport { getFocusable, trapTab } from '../focusTrap';\r\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\r\n\r\ndefineOptions({ name: 'TaoDrawer' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue: boolean;\r\n title?: string;\r\n side?: 'left' | 'right';\r\n closable?: boolean;\r\n closeLabel?: string;\r\n }>(),\r\n {\r\n title: '',\r\n side: 'right',\r\n closable: true,\r\n closeLabel: 'Закрыть',\r\n },\r\n);\r\n\r\nconst emit = defineEmits(['update:modelValue', 'close']);\r\n\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nconst titleId = useId();\r\nlet previousFocus: HTMLElement | null = null;\r\nlet scrollHeld = false;\r\n\r\nfunction close() {\r\n if (!props.closable) {\r\n return;\r\n }\r\n emit('update:modelValue', false);\r\n emit('close');\r\n}\r\n\r\nfunction holdScroll() {\r\n if (scrollHeld || !isBrowser()) {\r\n return;\r\n }\r\n lockBodyScroll();\r\n scrollHeld = true;\r\n}\r\n\r\nfunction releaseScroll() {\r\n if (!scrollHeld) {\r\n return;\r\n }\r\n unlockBodyScroll();\r\n scrollHeld = false;\r\n}\r\n\r\nfunction restoreFocus() {\r\n previousFocus?.focus?.();\r\n previousFocus = null;\r\n}\r\n\r\nasync function focusPanel() {\r\n await nextTick();\r\n const panel = panelRef.value;\r\n if (!panel) {\r\n return;\r\n }\r\n const first = getFocusable(panel)[0];\r\n (first ?? panel).focus();\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n if (!props.closable) {\r\n return;\r\n }\r\n event.preventDefault();\r\n close();\r\n return;\r\n }\r\n if (panelRef.value) {\r\n trapTab(event, panelRef.value);\r\n }\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (isOpen) => {\r\n if (!isBrowser()) {\r\n return;\r\n }\r\n\r\n if (isOpen) {\r\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\r\n holdScroll();\r\n void focusPanel();\r\n return;\r\n }\r\n releaseScroll();\r\n restoreFocus();\r\n },\r\n { immediate: true },\r\n);\r\n\r\nonBeforeUnmount(() => {\r\n releaseScroll();\r\n restoreFocus();\r\n});\r\n</script>\r\n\r\n<template>\r\n <Teleport to=\"body\">\r\n <Transition :name=\"`tao-drawer-${side}`\">\r\n <div v-if=\"modelValue\" class=\"tao-drawer\" :class=\"`tao-drawer--${side}`\" @keydown=\"onKeydown\">\r\n <div class=\"tao-drawer__overlay\" @click=\"close\"></div>\r\n <aside\r\n ref=\"panelRef\"\r\n class=\"tao-drawer__panel\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n :aria-labelledby=\"title ? titleId : undefined\"\r\n tabindex=\"-1\"\r\n >\r\n <div v-if=\"title || closable\" class=\"tao-drawer__header\">\r\n <h2 v-if=\"title\" :id=\"titleId\" class=\"tao-drawer__title\">{{ title }}</h2>\r\n <span v-else></span>\r\n <button\r\n v-if=\"closable\"\r\n type=\"button\"\r\n class=\"tao-drawer__close\"\r\n :aria-label=\"closeLabel\"\r\n @click=\"close\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"close-icon\">&times;</slot>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"tao-drawer__content\">\r\n <slot />\r\n </div>\r\n <div v-if=\"$slots.footer\" class=\"tao-drawer__footer\">\r\n <slot name=\"footer\" />\r\n </div>\r\n </aside>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-drawer {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 1000;\r\n display: flex;\r\n}\r\n\r\n.tao-drawer--right {\r\n justify-content: flex-end;\r\n}\r\n\r\n.tao-drawer--left {\r\n justify-content: flex-start;\r\n}\r\n\r\n.tao-drawer__overlay {\r\n position: absolute;\r\n inset: 0;\r\n background: var(--tao-color-overlay);\r\n}\r\n\r\n.tao-drawer__panel {\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n width: min(360px, 100%);\r\n height: 100%;\r\n background: var(--tao-color-surface-raised);\r\n box-shadow: var(--tao-shadow-overlay);\r\n}\r\n\r\n.tao-drawer__panel:focus {\r\n outline: none;\r\n}\r\n\r\n.tao-drawer__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--tao-space-3);\r\n padding: var(--tao-space-4);\r\n border-bottom: 1px solid var(--tao-color-border);\r\n}\r\n\r\n.tao-drawer__title {\r\n margin: 0;\r\n font-size: var(--tao-font-size-lg);\r\n font-weight: 600;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-drawer__close {\r\n background: none;\r\n border: none;\r\n padding: 0;\r\n font-size: 24px;\r\n line-height: 1;\r\n color: var(--tao-color-text);\r\n cursor: pointer;\r\n}\r\n\r\n.tao-drawer__close:hover {\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-drawer__close:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n border-radius: var(--tao-radius-control);\r\n}\r\n\r\n.tao-drawer__content {\r\n flex: 1;\r\n min-height: 0;\r\n overflow: auto;\r\n padding: var(--tao-space-4);\r\n}\r\n\r\n.tao-drawer__footer {\r\n padding: var(--tao-space-4);\r\n border-top: 1px solid var(--tao-color-border);\r\n display: flex;\r\n gap: var(--tao-space-3);\r\n justify-content: flex-end;\r\n}\r\n\r\n.tao-drawer-right-enter-active,\r\n.tao-drawer-right-leave-active,\r\n.tao-drawer-left-enter-active,\r\n.tao-drawer-left-leave-active {\r\n transition: opacity var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-drawer-right-enter-active .tao-drawer__panel,\r\n.tao-drawer-right-leave-active .tao-drawer__panel,\r\n.tao-drawer-left-enter-active .tao-drawer__panel,\r\n.tao-drawer-left-leave-active .tao-drawer__panel {\r\n transition: transform var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-drawer-right-enter-from,\r\n.tao-drawer-right-leave-to,\r\n.tao-drawer-left-enter-from,\r\n.tao-drawer-left-leave-to {\r\n opacity: 0;\r\n}\r\n\r\n.tao-drawer-right-enter-from .tao-drawer__panel,\r\n.tao-drawer-right-leave-to .tao-drawer__panel {\r\n transform: translateX(100%);\r\n}\r\n\r\n.tao-drawer-left-enter-from .tao-drawer__panel,\r\n.tao-drawer-left-leave-to .tao-drawer__panel {\r\n transform: translateX(-100%);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, ref, watch } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoAvatar' });\r\n\r\ntype TaoAvatarDot = 'success' | 'danger' | 'warning' | 'info' | 'neutral' | 'error';\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n src?: string;\r\n name?: string;\r\n alt?: string;\r\n size?: 'small' | 'medium' | 'large' | 's' | 'm' | 'l';\r\n /** Точка статуса. `true` = success (в сети). */\r\n dot?: boolean | TaoAvatarDot;\r\n /** Счётчик в углу. 0 и пустое не рисуются, больше 99 — «99+». */\r\n count?: number | string;\r\n fallbackLabel?: string;\r\n /** `{count}` — число в бейдже. */\r\n notificationsLabel?: string;\r\n dotLabels?: Partial<Record<Exclude<TaoAvatarDot, 'error'>, string>>;\r\n }>(),\r\n {\r\n src: '',\r\n name: '',\r\n alt: '',\r\n size: 'medium',\r\n dot: false,\r\n count: undefined,\r\n fallbackLabel: 'Аватар',\r\n notificationsLabel: '{count} уведомлений',\r\n dotLabels: () => ({}),\r\n },\r\n);\r\n\r\nconst sizeClass = computed(() => {\r\n if (props.size === 'small' || props.size === 's') {\r\n return 's';\r\n }\r\n if (props.size === 'large' || props.size === 'l') {\r\n return 'l';\r\n }\r\n return 'm';\r\n});\r\n\r\nconst initials = computed(() => {\r\n const parts = props.name.trim().split(/\\s+/).filter(Boolean);\r\n if (!parts.length) {\r\n return '';\r\n }\r\n if (parts.length === 1) {\r\n return parts[0].slice(0, 2).toUpperCase();\r\n }\r\n return `${parts[0][0] ?? ''}${parts[1][0] ?? ''}`.toUpperCase();\r\n});\r\n\r\nconst dotTone = computed((): Exclude<TaoAvatarDot, 'error'> | null => {\r\n if (!props.dot) {\r\n return null;\r\n }\r\n if (props.dot === true) {\r\n return 'success';\r\n }\r\n return props.dot === 'error' ? 'danger' : props.dot;\r\n});\r\n\r\nconst badge = computed(() => {\r\n if (props.count === undefined || props.count === '') {\r\n return '';\r\n }\r\n const numeric = typeof props.count === 'number' ? props.count : Number(props.count);\r\n if (Number.isFinite(numeric)) {\r\n if (numeric <= 0) {\r\n return '';\r\n }\r\n return numeric > 99 ? '99+' : String(numeric);\r\n }\r\n return String(props.count);\r\n});\r\n\r\nconst defaultDotLabel: Record<Exclude<TaoAvatarDot, 'error'>, string> = {\r\n success: 'в сети',\r\n danger: 'занят',\r\n warning: 'отошёл',\r\n info: 'статус',\r\n neutral: 'не в сети',\r\n};\r\n\r\nconst label = computed(() => {\r\n const base = props.alt || props.name || props.fallbackLabel;\r\n const extra: string[] = [];\r\n if (dotTone.value) {\r\n extra.push(props.dotLabels[dotTone.value] ?? defaultDotLabel[dotTone.value]);\r\n }\r\n if (badge.value) {\r\n extra.push(props.notificationsLabel.replace('{count}', badge.value));\r\n }\r\n return extra.length ? `${base}, ${extra.join(', ')}` : base;\r\n});\r\n\r\nconst imgFailed = ref(false);\r\nconst showImage = computed(() => Boolean(props.src) && !imgFailed.value);\r\n\r\nwatch(\r\n () => props.src,\r\n () => {\r\n imgFailed.value = false;\r\n },\r\n);\r\n\r\nfunction onImgError() {\r\n imgFailed.value = true;\r\n}\r\n</script>\r\n\r\n<template>\r\n <span class=\"tao-avatar\" :class=\"`tao-avatar--${sizeClass}`\" :title=\"label\">\r\n <span class=\"tao-avatar__face\">\r\n <img v-if=\"showImage\" class=\"tao-avatar__img\" :src=\"src\" :alt=\"label\" @error=\"onImgError\" />\r\n <span v-else class=\"tao-avatar__fallback\" :aria-label=\"label\">{{ initials || '?' }}</span>\r\n </span>\r\n <span\r\n v-if=\"dotTone\"\r\n class=\"tao-avatar__dot\"\r\n :class=\"`tao-avatar__dot--${dotTone}`\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n <span v-if=\"badge\" class=\"tao-avatar__badge\" aria-hidden=\"true\">{{ badge }}</span>\r\n </span>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-avatar {\r\n position: relative;\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n user-select: none;\r\n}\r\n\r\n.tao-avatar__face {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n overflow: hidden;\r\n width: 100%;\r\n height: 100%;\r\n background: var(--tao-color-accent-subtle);\r\n color: var(--tao-color-accent);\r\n border-radius: var(--tao-radius-full);\r\n font-weight: 600;\r\n line-height: 1;\r\n}\r\n\r\n.tao-avatar--s {\r\n width: 24px;\r\n height: 24px;\r\n font-size: 10px;\r\n}\r\n\r\n.tao-avatar--m {\r\n width: 32px;\r\n height: 32px;\r\n font-size: var(--tao-font-size-xs);\r\n}\r\n\r\n.tao-avatar--l {\r\n width: 48px;\r\n height: 48px;\r\n font-size: var(--tao-font-size-md);\r\n}\r\n\r\n.tao-avatar__img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n}\r\n\r\n.tao-avatar__fallback {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.tao-avatar__dot {\r\n position: absolute;\r\n right: -1px;\r\n bottom: -1px;\r\n box-sizing: border-box;\r\n border: 2px solid var(--tao-color-bg);\r\n border-radius: var(--tao-radius-full);\r\n background: var(--tao-color-success);\r\n}\r\n\r\n.tao-avatar--s .tao-avatar__dot {\r\n width: 8px;\r\n height: 8px;\r\n border-width: 1px;\r\n}\r\n\r\n.tao-avatar--m .tao-avatar__dot {\r\n width: 10px;\r\n height: 10px;\r\n}\r\n\r\n.tao-avatar--l .tao-avatar__dot {\r\n width: 12px;\r\n height: 12px;\r\n}\r\n\r\n.tao-avatar__dot--success {\r\n background: var(--tao-color-success);\r\n}\r\n\r\n.tao-avatar__dot--danger {\r\n background: var(--tao-color-danger);\r\n}\r\n\r\n.tao-avatar__dot--warning {\r\n background: var(--tao-color-warning);\r\n}\r\n\r\n.tao-avatar__dot--info {\r\n background: var(--tao-color-info);\r\n}\r\n\r\n.tao-avatar__dot--neutral {\r\n background: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-avatar__badge {\r\n position: absolute;\r\n top: -6px;\r\n right: -6px;\r\n z-index: 1;\r\n box-sizing: border-box;\r\n min-width: 16px;\r\n height: 16px;\r\n padding: 0 4px;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: 2px solid var(--tao-color-bg);\r\n border-radius: var(--tao-radius-full);\r\n background: var(--tao-color-danger);\r\n color: var(--tao-color-text-strong);\r\n font-size: 10px;\r\n font-weight: 700;\r\n line-height: 1;\r\n}\r\n\r\n.tao-avatar--s .tao-avatar__badge {\r\n top: -5px;\r\n right: -5px;\r\n min-width: 14px;\r\n height: 14px;\r\n padding: 0 3px;\r\n font-size: 9px;\r\n}\r\n\r\n.tao-avatar--l .tao-avatar__badge {\r\n min-width: 18px;\r\n height: 18px;\r\n font-size: 11px;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport TaoLink from './TaoLink.vue';\r\nimport type { TaoBreadcrumbItem } from '../breadcrumb';\r\n\r\ndefineOptions({ name: 'TaoBreadcrumb' });\r\n\r\nwithDefaults(\r\n defineProps<{\r\n items: TaoBreadcrumbItem[];\r\n ariaLabel?: string;\r\n }>(),\r\n {\r\n ariaLabel: 'Хлебные крошки',\r\n },\r\n);\r\n</script>\r\n\r\n<template>\r\n <nav class=\"tao-breadcrumb\" :aria-label=\"ariaLabel\">\r\n <ol class=\"tao-breadcrumb__list\">\r\n <li v-for=\"(item, index) in items\" :key=\"`${item.label}-${index}`\" class=\"tao-breadcrumb__item\">\r\n <span v-if=\"index > 0\" class=\"tao-breadcrumb__sep\" aria-hidden=\"true\">/</span>\r\n <span v-if=\"index === items.length - 1\" class=\"tao-breadcrumb__current\" aria-current=\"page\">\r\n {{ item.label }}\r\n </span>\r\n <TaoLink v-else-if=\"item.to\" class=\"tao-breadcrumb__link\" :to=\"item.to\">{{ item.label }}</TaoLink>\r\n <span v-else class=\"tao-breadcrumb__link\">{{ item.label }}</span>\r\n </li>\r\n </ol>\r\n </nav>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-breadcrumb__list {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: var(--tao-space-1);\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n font-size: var(--tao-font-size-sm);\r\n}\r\n\r\n.tao-breadcrumb__item {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--tao-space-1);\r\n}\r\n\r\n.tao-breadcrumb__sep {\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-breadcrumb__link {\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-breadcrumb__current {\r\n color: var(--tao-color-text);\r\n font-weight: 500;\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoCounter' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value?: number;\r\n maxDigits?: number;\r\n }>(),\r\n {\r\n value: 0,\r\n maxDigits: 9,\r\n },\r\n);\r\n\r\ntype Slot = {\r\n value: string;\r\n isSpace: boolean;\r\n isLeadingZero: boolean;\r\n key: string;\r\n};\r\n\r\nfunction formatDigits(num: number, minDigits: number) {\r\n const abs = Math.abs(Math.trunc(num));\r\n return abs.toString().padStart(Math.max(1, minDigits), '0').replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\r\n}\r\n\r\nconst slots = computed(() => {\r\n const formatted = formatDigits(props.value, props.maxDigits);\r\n const significant = Math.abs(Math.trunc(props.value)).toString();\r\n const leadingZeros = Math.max(0, props.maxDigits - significant.length);\r\n const result: Slot[] = [];\r\n let digitCount = 0;\r\n\r\n if (props.value < 0) {\r\n result.push({\r\n value: '−',\r\n isSpace: false,\r\n isLeadingZero: false,\r\n key: 'sign',\r\n });\r\n }\r\n\r\n for (let index = 0; index < formatted.length; index += 1) {\r\n const char = formatted[index] ?? '';\r\n if (char === ' ') {\r\n result.push({\r\n value: ' ',\r\n isSpace: true,\r\n isLeadingZero: false,\r\n key: `space-${index}`,\r\n });\r\n continue;\r\n }\r\n\r\n result.push({\r\n value: char,\r\n isSpace: false,\r\n isLeadingZero: digitCount < leadingZeros,\r\n key: `${index}-${char}`,\r\n });\r\n digitCount += 1;\r\n }\r\n\r\n return result;\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"tao-counter\" role=\"img\" :aria-label=\"String(value)\">\r\n <div class=\"tao-counter__row\" aria-hidden=\"true\">\r\n <div\r\n v-for=\"(slot, index) in slots\"\r\n :key=\"`${index}-${slot.isSpace ? 'gap' : 'd'}`\"\r\n class=\"tao-counter__slot\"\r\n :class=\"{ 'tao-counter__slot--space': slot.isSpace }\"\r\n >\r\n <TransitionGroup name=\"tao-digit\">\r\n <span\r\n v-if=\"!slot.isSpace\"\r\n :key=\"slot.key\"\r\n class=\"tao-counter__digit\"\r\n :class=\"{ 'tao-counter__digit--muted': slot.isLeadingZero }\"\r\n >\r\n {{ slot.value }}\r\n </span>\r\n </TransitionGroup>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-counter {\r\n display: inline-flex;\r\n color: var(--tao-color-accent);\r\n font-size: 28px;\r\n font-weight: 700;\r\n font-variant-numeric: tabular-nums;\r\n line-height: 1;\r\n}\r\n\r\n.tao-counter__row {\r\n display: inline-flex;\r\n gap: 3px;\r\n}\r\n\r\n.tao-counter__slot {\r\n position: relative;\r\n overflow: hidden;\r\n width: 1.15em;\r\n height: 1.55em;\r\n border-radius: var(--tao-radius-sm);\r\n background: var(--tao-color-surface-sunken);\r\n}\r\n\r\n.tao-counter__slot--space {\r\n width: 0.28em;\r\n background: transparent;\r\n}\r\n\r\n.tao-counter__digit {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.tao-counter__digit--muted {\r\n color: var(--tao-color-text-muted);\r\n opacity: 0.45;\r\n}\r\n\r\n.tao-digit-enter-from {\r\n transform: translateY(100%) rotateX(-90deg);\r\n filter: blur(8px);\r\n opacity: 0;\r\n}\r\n\r\n.tao-digit-leave-to {\r\n transform: translateY(-100%) rotateX(90deg);\r\n filter: blur(8px);\r\n opacity: 0;\r\n}\r\n\r\n.tao-digit-enter-active,\r\n.tao-digit-leave-active {\r\n transition:\r\n transform var(--tao-duration-slow) cubic-bezier(0.68, -0.55, 0.265, 1.55),\r\n filter var(--tao-duration-slow) var(--tao-ease-base),\r\n opacity var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n@media (max-width: 450px) {\r\n .tao-counter {\r\n font-size: 22px;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, onUpdated, ref, watch } from 'vue';\r\n\r\ndefineOptions({ name: 'TaoCarousel' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: number;\r\n peek?: number;\r\n /** How many slides fit in the viewport. 5 = product strip. 1 = one card. */\r\n perView?: number;\r\n controls?: boolean;\r\n /** Interval in ms. 0 — off. Pauses on hover, keyboard focus, drag, and reduced motion. */\r\n autoplay?: number;\r\n loop?: boolean;\r\n /** Pips under the track: one per snap. Inactive are dots, the current one stretches into a pill. */\r\n dots?: boolean;\r\n ariaLabel?: string;\r\n prevLabel?: string;\r\n nextLabel?: string;\r\n dotsLabel?: string;\r\n /** `{n}` и `{count}` — текущий слайд и всего. */\r\n slideLabel?: string;\r\n }>(),\r\n {\r\n modelValue: 0,\r\n peek: 0,\r\n perView: 1,\r\n controls: true,\r\n autoplay: 0,\r\n loop: false,\r\n dots: false,\r\n ariaLabel: 'Лента',\r\n prevLabel: 'Назад',\r\n nextLabel: 'Вперёд',\r\n dotsLabel: 'Слайды',\r\n slideLabel: 'Слайд {n} из {count}',\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number];\r\n change: [value: number];\r\n}>();\r\n\r\ndefineSlots<{\r\n default(): unknown;\r\n prev(props: { disabled: boolean; go: () => void }): unknown;\r\n next(props: { disabled: boolean; go: () => void }): unknown;\r\n 'prev-icon'(): unknown;\r\n 'next-icon'(): unknown;\r\n dots(props: { index: number; count: number; go: (next: number) => void }): unknown;\r\n dot(props: { active: boolean; index: number; go: () => void }): unknown;\r\n}>();\r\n\r\nconst track = ref<HTMLElement | null>(null);\r\nconst index = ref(props.modelValue);\r\nconst count = ref(0);\r\nconst dragging = ref(false);\r\nconst hoverPaused = ref(false);\r\nconst focusPaused = ref(false);\r\n\r\nlet dragStartX = 0;\r\nlet dragStartScroll = 0;\r\nlet dragMoved = 0;\r\nlet dragPointer = -1;\r\nlet scrollFrame = 0;\r\nlet focusFrame = 0;\r\nlet autoplayTimer = 0;\r\n\r\nconst step = computed(() => Math.max(1, Math.round(props.perView)));\r\nconst lastIndex = computed(() => Math.max(count.value - step.value, 0));\r\nconst atStart = computed(() => !props.loop && index.value <= 0);\r\nconst atEnd = computed(() => !props.loop && index.value >= lastIndex.value);\r\nconst snapCount = computed(() => (count.value <= 0 ? 0 : lastIndex.value + 1));\r\nconst showControls = computed(() => props.controls && count.value > step.value);\r\nconst showDots = computed(() => props.dots && snapCount.value > 1);\r\n\r\nconst trackStyle = computed(() => ({\r\n '--tao-carousel-peek': `${Math.max(props.peek, 0)}px`,\r\n '--tao-carousel-per-view': String(step.value),\r\n}));\r\n\r\nfunction prefersReducedMotion() {\r\n return typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n}\r\n\r\nfunction metrics() {\r\n const el = track.value;\r\n if (!el || el.children.length === 0) {\r\n return { width: 0, gap: 0, total: 0 };\r\n }\r\n\r\n const styles = getComputedStyle(el);\r\n const gap = Number.parseFloat(styles.columnGap || styles.gap) || 0;\r\n const width = (el.children[0] as HTMLElement).getBoundingClientRect().width;\r\n return { width, gap, total: el.children.length };\r\n}\r\n\r\nfunction nearestIndex(scrollLeft?: number) {\r\n const { width, gap, total } = metrics();\r\n if (width <= 0 || total <= 0) {\r\n return 0;\r\n }\r\n\r\n const left = scrollLeft ?? track.value?.scrollLeft ?? 0;\r\n const last = Math.max(total - step.value, 0);\r\n return Math.min(Math.max(Math.round(left / (width + gap)), 0), last);\r\n}\r\n\r\nfunction setIndex(next: number) {\r\n if (next === index.value) {\r\n return;\r\n }\r\n\r\n index.value = next;\r\n emit('update:modelValue', next);\r\n emit('change', next);\r\n}\r\n\r\nfunction refreshCount() {\r\n count.value = track.value?.children.length ?? 0;\r\n}\r\n\r\nfunction goPrev() {\r\n goTo(index.value - step.value);\r\n}\r\n\r\nfunction goNext() {\r\n goTo(index.value + step.value);\r\n}\r\n\r\nfunction goTo(next: number, instant = false) {\r\n const el = track.value;\r\n const { width, gap, total } = metrics();\r\n if (!el || width <= 0 || total <= 0) {\r\n return;\r\n }\r\n\r\n const last = Math.max(total - step.value, 0);\r\n let page = next;\r\n let wrapping = false;\r\n if (props.loop && total > step.value) {\r\n if (page > last) {\r\n page = 0;\r\n wrapping = true;\r\n } else if (page < 0) {\r\n page = last;\r\n wrapping = true;\r\n }\r\n } else {\r\n page = Math.min(Math.max(next, 0), last);\r\n }\r\n\r\n el.scrollTo({\r\n left: page * (width + gap),\r\n behavior: prefersReducedMotion() || dragging.value || wrapping || instant ? 'auto' : 'smooth',\r\n });\r\n setIndex(page);\r\n}\r\n\r\nfunction stopAutoplay() {\r\n window.clearInterval(autoplayTimer);\r\n autoplayTimer = 0;\r\n}\r\n\r\nfunction canAutoplay() {\r\n return (\r\n props.autoplay > 0 &&\r\n count.value > step.value &&\r\n !hoverPaused.value &&\r\n !focusPaused.value &&\r\n !dragging.value &&\r\n typeof document !== 'undefined' &&\r\n !document.hidden &&\r\n !prefersReducedMotion() &&\r\n (props.loop || index.value < lastIndex.value)\r\n );\r\n}\r\n\r\nfunction tickAutoplay() {\r\n if (!canAutoplay()) {\r\n stopAutoplay();\r\n return;\r\n }\r\n\r\n goTo(index.value + step.value);\r\n}\r\n\r\nfunction syncAutoplay() {\r\n stopAutoplay();\r\n if (!canAutoplay()) {\r\n return;\r\n }\r\n\r\n autoplayTimer = window.setInterval(tickAutoplay, props.autoplay);\r\n}\r\n\r\nfunction onMouseEnter() {\r\n hoverPaused.value = true;\r\n stopAutoplay();\r\n}\r\n\r\nfunction onMouseLeave() {\r\n hoverPaused.value = false;\r\n syncAutoplay();\r\n}\r\n\r\nfunction hasKeyboardFocus(root: HTMLElement) {\r\n const active = document.activeElement;\r\n if (!(active instanceof HTMLElement) || !root.contains(active)) {\r\n return false;\r\n }\r\n\r\n try {\r\n return active.matches(':focus-visible');\r\n } catch {\r\n return true;\r\n }\r\n}\r\n\r\nfunction scheduleFocusPause(event: FocusEvent) {\r\n const root = event.currentTarget as HTMLElement;\r\n cancelAnimationFrame(focusFrame);\r\n focusFrame = requestAnimationFrame(() => {\r\n if (!track.value) {\r\n return;\r\n }\r\n\r\n const next = hasKeyboardFocus(root);\r\n focusPaused.value = next;\r\n if (next) {\r\n stopAutoplay();\r\n return;\r\n }\r\n\r\n syncAutoplay();\r\n });\r\n}\r\n\r\nfunction onScroll() {\r\n if (dragging.value) {\r\n return;\r\n }\r\n\r\n cancelAnimationFrame(scrollFrame);\r\n scrollFrame = requestAnimationFrame(() => {\r\n const next = nearestIndex();\r\n const { width, gap } = metrics();\r\n const el = track.value;\r\n if (el && width > 0 && el.scrollLeft - next * (width + gap) > (width + gap) / 2) {\r\n goTo(next, true);\r\n return;\r\n }\r\n setIndex(next);\r\n });\r\n}\r\n\r\nfunction releaseDragCapture() {\r\n const el = track.value;\r\n const id = dragPointer;\r\n if (!el || id === -1) {\r\n return;\r\n }\r\n\r\n if (typeof el.hasPointerCapture === 'function' && !el.hasPointerCapture(id)) {\r\n return;\r\n }\r\n\r\n try {\r\n el.releasePointerCapture(id);\r\n } catch {\r\n /* already released by the browser */\r\n }\r\n}\r\n\r\nfunction endDrag(keepClickGuard = false) {\r\n if (!dragging.value) {\r\n return;\r\n }\r\n\r\n dragging.value = false;\r\n releaseDragCapture();\r\n dragPointer = -1;\r\n if (!keepClickGuard) {\r\n dragMoved = 0;\r\n }\r\n\r\n if (track.value) {\r\n goTo(nearestIndex(), true);\r\n }\r\n syncAutoplay();\r\n}\r\n\r\nfunction onPointerDown(event: PointerEvent) {\r\n if (event.pointerType !== 'mouse' || event.button !== 0 || !track.value) {\r\n return;\r\n }\r\n\r\n dragPointer = event.pointerId;\r\n dragStartX = event.clientX;\r\n dragStartScroll = track.value.scrollLeft;\r\n dragMoved = 0;\r\n dragging.value = true;\r\n try {\r\n track.value.setPointerCapture(event.pointerId);\r\n } catch {\r\n /* untrusted events / capture already gone */\r\n }\r\n}\r\n\r\nfunction onPointerMove(event: PointerEvent) {\r\n if (!dragging.value || event.pointerId !== dragPointer || !track.value) {\r\n return;\r\n }\r\n\r\n const dx = event.clientX - dragStartX;\r\n dragMoved = Math.abs(dx);\r\n track.value.scrollLeft = dragStartScroll - dx;\r\n}\r\n\r\nfunction onPointerEnd(event: PointerEvent) {\r\n if (!dragging.value) {\r\n return;\r\n }\r\n if (dragPointer !== -1 && event.pointerId !== dragPointer) {\r\n return;\r\n }\r\n\r\n endDrag(true);\r\n}\r\n\r\nfunction onLostPointerCapture() {\r\n endDrag();\r\n}\r\n\r\nfunction onWindowBlur() {\r\n endDrag();\r\n hoverPaused.value = false;\r\n syncAutoplay();\r\n}\r\n\r\nfunction onVisibilityChange() {\r\n if (document.hidden) {\r\n endDrag();\r\n hoverPaused.value = false;\r\n }\r\n syncAutoplay();\r\n}\r\n\r\nfunction onClickCapture(event: MouseEvent) {\r\n if (dragMoved > 6) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n dragMoved = 0;\r\n }\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'ArrowLeft') {\r\n event.preventDefault();\r\n goPrev();\r\n return;\r\n }\r\n\r\n if (event.key === 'ArrowRight') {\r\n event.preventDefault();\r\n goNext();\r\n }\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n if (value !== index.value) {\r\n goTo(value);\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n () => [props.autoplay, props.loop, count.value, dragging.value, index.value] as const,\r\n () => syncAutoplay(),\r\n);\r\n\r\nonMounted(() => {\r\n refreshCount();\r\n nextTick(() => {\r\n goTo(props.modelValue);\r\n syncAutoplay();\r\n });\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n window.addEventListener('blur', onWindowBlur);\r\n window.addEventListener('pagehide', onWindowBlur);\r\n});\r\n\r\nonUpdated(refreshCount);\r\n\r\nonBeforeUnmount(() => {\r\n endDrag();\r\n cancelAnimationFrame(scrollFrame);\r\n cancelAnimationFrame(focusFrame);\r\n stopAutoplay();\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n window.removeEventListener('blur', onWindowBlur);\r\n window.removeEventListener('pagehide', onWindowBlur);\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-carousel\"\r\n :style=\"trackStyle\"\r\n @mouseenter=\"onMouseEnter\"\r\n @mouseleave=\"onMouseLeave\"\r\n @focusin=\"scheduleFocusPause\"\r\n @focusout=\"scheduleFocusPause\"\r\n >\r\n <div class=\"tao-carousel__row\">\r\n <slot name=\"prev\" :disabled=\"atStart\" :go=\"goPrev\">\r\n <button\r\n v-if=\"showControls\"\r\n type=\"button\"\r\n class=\"tao-carousel__nav\"\r\n :aria-label=\"prevLabel\"\r\n :disabled=\"atStart\"\r\n @click=\"goPrev\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"prev-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M14.5 5 8 12l6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n </slot>\r\n\r\n <div\r\n ref=\"track\"\r\n class=\"tao-carousel__track\"\r\n :class=\"{ 'tao-carousel__track--dragging': dragging }\"\r\n role=\"region\"\r\n :aria-label=\"ariaLabel\"\r\n tabindex=\"0\"\r\n @scroll=\"onScroll\"\r\n @keydown=\"onKeydown\"\r\n @pointerdown=\"onPointerDown\"\r\n @pointermove=\"onPointerMove\"\r\n @pointerup=\"onPointerEnd\"\r\n @pointercancel=\"onPointerEnd\"\r\n @lostpointercapture=\"onLostPointerCapture\"\r\n @click.capture=\"onClickCapture\"\r\n >\r\n <slot />\r\n </div>\r\n\r\n <slot name=\"next\" :disabled=\"atEnd\" :go=\"goNext\">\r\n <button\r\n v-if=\"showControls\"\r\n type=\"button\"\r\n class=\"tao-carousel__nav\"\r\n :aria-label=\"nextLabel\"\r\n :disabled=\"atEnd\"\r\n @click=\"goNext\"\r\n >\r\n <span aria-hidden=\"true\">\r\n <slot name=\"next-icon\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" focusable=\"false\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M9.5 5 16 12l-6.5 7\"\r\n />\r\n </svg>\r\n </slot>\r\n </span>\r\n </button>\r\n </slot>\r\n </div>\r\n\r\n <slot name=\"dots\" :index=\"index\" :count=\"snapCount\" :go=\"goTo\">\r\n <div v-if=\"showDots\" class=\"tao-carousel__dots\" role=\"group\" :aria-label=\"dotsLabel\">\r\n <button\r\n v-for=\"n in snapCount\"\r\n :key=\"n\"\r\n type=\"button\"\r\n class=\"tao-carousel__dot\"\r\n :class=\"{ 'tao-carousel__dot--active': n - 1 === index }\"\r\n :aria-label=\"slideLabel.replace('{n}', String(n)).replace('{count}', String(snapCount))\"\r\n :aria-current=\"n - 1 === index ? 'true' : undefined\"\r\n @click=\"goTo(n - 1)\"\r\n >\r\n <slot name=\"dot\" :active=\"n - 1 === index\" :index=\"n - 1\" :go=\"() => goTo(n - 1)\">\r\n <span class=\"tao-carousel__pip\" />\r\n </slot>\r\n </button>\r\n </div>\r\n </slot>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-carousel {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n}\r\n\r\n.tao-carousel__row {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n}\r\n\r\n.tao-carousel__track {\r\n display: flex;\r\n flex: 1 1 auto;\r\n gap: var(--tao-space-3);\r\n min-width: 0;\r\n overflow-x: auto;\r\n overscroll-behavior-x: contain;\r\n scroll-snap-type: x mandatory;\r\n scroll-padding-inline: 0;\r\n scrollbar-width: none;\r\n user-select: none;\r\n touch-action: pan-x;\r\n cursor: grab;\r\n}\r\n\r\n.tao-carousel__track::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.tao-carousel__track--dragging {\r\n scroll-snap-type: none;\r\n cursor: grabbing;\r\n}\r\n\r\n.tao-carousel__track:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-carousel__track > :deep(*) {\r\n box-sizing: border-box;\r\n flex: 0 0 auto;\r\n width: max(\r\n 96px,\r\n calc(\r\n (100% - var(--tao-carousel-peek, 0px) - (var(--tao-carousel-per-view, 1) - 1) * var(--tao-space-3)) /\r\n var(--tao-carousel-per-view, 1)\r\n )\r\n );\r\n min-width: 0;\r\n scroll-snap-align: start;\r\n}\r\n\r\n.tao-carousel__nav {\r\n display: inline-flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n height: 36px;\r\n margin: 0;\r\n padding: 0;\r\n border: 1px solid var(--tao-color-border-strong);\r\n border-radius: var(--tao-radius-full);\r\n background: var(--tao-color-surface-sunken);\r\n color: var(--tao-color-text);\r\n font: inherit;\r\n font-size: 0;\r\n line-height: 0;\r\n cursor: pointer;\r\n transition: var(--tao-transition-base);\r\n}\r\n\r\n.tao-carousel__nav svg {\r\n display: block;\r\n}\r\n\r\n.tao-carousel__nav:hover:not(:disabled) {\r\n background: var(--tao-color-surface-hover);\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-carousel__nav:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n}\r\n\r\n.tao-carousel__nav:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.tao-carousel__dots {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 2px;\r\n}\r\n\r\n.tao-carousel__dot {\r\n display: inline-flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n margin: 0;\r\n padding: 0;\r\n border: 0;\r\n background: transparent;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-carousel__pip {\r\n display: block;\r\n width: 6px;\r\n height: 6px;\r\n border-radius: var(--tao-radius-full);\r\n background: var(--tao-color-border-strong);\r\n transition: width var(--tao-duration-base) var(--tao-ease-base), background var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-carousel__dot--active .tao-carousel__pip {\r\n width: 18px;\r\n background: var(--tao-color-accent);\r\n}\r\n\r\n.tao-carousel__dot:hover:not(.tao-carousel__dot--active) .tao-carousel__pip {\r\n background: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-carousel__dot:focus-visible {\r\n outline: 2px solid var(--tao-color-accent);\r\n outline-offset: 2px;\r\n border-radius: var(--tao-radius-full);\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .tao-carousel__track {\r\n scroll-behavior: auto;\r\n }\r\n\r\n .tao-carousel__pip {\r\n transition: none;\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport type { TaoStageItem, TaoStageStatus } from '../stage';\r\n\r\ndefineOptions({ name: 'TaoStages' });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n items?: TaoStageItem[];\r\n vertical?: boolean;\r\n ariaLabel?: string;\r\n statusLabels?: Partial<Record<TaoStageStatus, string>>;\r\n }>(),\r\n {\r\n items: () => [],\r\n vertical: true,\r\n ariaLabel: 'Стадии',\r\n statusLabels: () => ({}),\r\n },\r\n);\r\n\r\ndefineSlots<{\r\n default(props: { item: TaoStageItem; index: number; status: TaoStageStatus }): unknown;\r\n icon(props: { item: TaoStageItem; index: number; status: TaoStageStatus }): unknown;\r\n}>();\r\n\r\nconst fallbackStatusText: Record<TaoStageStatus, string> = {\r\n wait: 'ожидание',\r\n work: 'в работе',\r\n ok: 'готово',\r\n bad: 'ошибка',\r\n};\r\n\r\nfunction statusOf(item: TaoStageItem): TaoStageStatus {\r\n if (item.status === 'danger') {\r\n return 'bad';\r\n }\r\n return item.status ?? 'wait';\r\n}\r\n\r\nfunction itemLabel(item: TaoStageItem): string {\r\n const status = statusOf(item);\r\n return `${item.label ?? item.key}, ${props.statusLabels[status] ?? fallbackStatusText[status]}`;\r\n}\r\n</script>\r\n\r\n<template>\r\n <ul\r\n class=\"tao-stages\"\r\n :class=\"{ 'tao-stages--horizontal': !props.vertical }\"\r\n :aria-label=\"ariaLabel\"\r\n >\r\n <li\r\n v-for=\"(item, index) in items\"\r\n :key=\"item.key\"\r\n class=\"tao-stages__item\"\r\n :class=\"`tao-stages__item--${statusOf(item)}`\"\r\n :aria-label=\"itemLabel(item)\"\r\n >\r\n <span class=\"tao-stages__ico\" aria-hidden=\"true\">\r\n <slot name=\"icon\" :item=\"item\" :index=\"index\" :status=\"statusOf(item)\">\r\n <svg v-if=\"statusOf(item) === 'ok'\" class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n d=\"M3.5 8.5 6.5 11.5 12.5 4.5\"\r\n />\r\n </svg>\r\n <svg v-else-if=\"statusOf(item) === 'bad'\" class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\r\n <path\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.8\"\r\n stroke-linecap=\"round\"\r\n d=\"M4.5 4.5 11.5 11.5M11.5 4.5 4.5 11.5\"\r\n />\r\n </svg>\r\n <svg v-else-if=\"statusOf(item) === 'work'\" class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\r\n <circle cx=\"8\" cy=\"8\" r=\"5.2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-dasharray=\"20 10\" stroke-linecap=\"round\" />\r\n </svg>\r\n <svg v-else class=\"tao-stages__mark\" viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\r\n <circle cx=\"8\" cy=\"8\" r=\"5.2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n </svg>\r\n </slot>\r\n </span>\r\n <span class=\"tao-stages__label\">\r\n <slot :item=\"item\" :index=\"index\" :status=\"statusOf(item)\">{{ item.label ?? item.key }}</slot>\r\n </span>\r\n </li>\r\n </ul>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-stages {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-2);\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n font-size: var(--tao-font-size-xs);\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-stages--horizontal {\r\n flex-direction: row;\r\n flex-wrap: wrap;\r\n column-gap: var(--tao-space-4);\r\n}\r\n\r\n.tao-stages__item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--tao-space-2);\r\n min-width: 0;\r\n}\r\n\r\n.tao-stages__ico {\r\n display: inline-flex;\r\n flex: 0 0 auto;\r\n color: inherit;\r\n}\r\n\r\n.tao-stages__mark {\r\n display: block;\r\n}\r\n\r\n.tao-stages__label {\r\n min-width: 0;\r\n}\r\n\r\n.tao-stages__item--wait {\r\n color: var(--tao-color-text-muted);\r\n}\r\n\r\n.tao-stages__item--work .tao-stages__ico {\r\n color: var(--tao-color-accent);\r\n}\r\n\r\n.tao-stages__item--ok .tao-stages__ico {\r\n color: var(--tao-color-success);\r\n}\r\n\r\n.tao-stages__item--bad .tao-stages__ico {\r\n color: var(--tao-color-danger);\r\n}\r\n\r\n.tao-stages__item--work .tao-stages__mark {\r\n animation: tao-stages-spin 1.1s linear infinite;\r\n}\r\n\r\n@keyframes tao-stages-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .tao-stages__item--work .tao-stages__mark {\r\n animation: none;\r\n }\r\n}\r\n</style>\r\n","import { computed, ref } from 'vue';\r\nimport type { TaoToastDefaults, TaoToastPosition, TaoToastRecord } from './types';\r\n\r\nexport const TOAST_POSITIONS: TaoToastPosition[] = [\r\n 'topRight',\r\n 'topLeft',\r\n 'topCenter',\r\n 'bottomRight',\r\n 'bottomLeft',\r\n 'bottomCenter',\r\n 'center',\r\n];\r\n\r\nexport const toastDefaults: TaoToastDefaults = {\r\n position: 'topCenter',\r\n timeout: 3000,\r\n closable: true,\r\n progress: true,\r\n closeLabel: 'Закрыть уведомление',\r\n};\r\n\r\nexport const toasts = ref<TaoToastRecord[]>([]);\r\n\r\nexport const toastsByPosition = computed(() => {\r\n const grouped = {} as Record<TaoToastPosition, TaoToastRecord[]>;\r\n\r\n for (const position of TOAST_POSITIONS) {\r\n grouped[position] = [];\r\n }\r\n\r\n for (const toast of toasts.value) {\r\n grouped[toast.position].push(toast);\r\n }\r\n\r\n return grouped;\r\n});\r\n\r\nexport function configureToastDefaults(partial: Partial<TaoToastDefaults>) {\r\n Object.assign(toastDefaults, partial);\r\n}\r\n\r\nexport function addToast(record: TaoToastRecord) {\r\n if (record.displayMode === 'once' && record.dedupeId) {\r\n const exists = toasts.value.some((item) => item.dedupeId === record.dedupeId);\r\n if (exists) {\r\n return;\r\n }\r\n }\r\n\r\n if (record.displayMode === 'replace' && record.dedupeId) {\r\n toasts.value = toasts.value.filter((item) => item.dedupeId !== record.dedupeId);\r\n }\r\n\r\n toasts.value = [...toasts.value, record];\r\n}\r\n\r\nexport function removeToast(id: string) {\r\n const item = toasts.value.find((toast) => toast.id === id);\r\n if (!item) {\r\n return;\r\n }\r\n\r\n toasts.value = toasts.value.filter((toast) => toast.id !== id);\r\n item.onClosed?.();\r\n}\r\n\r\nexport function dismissToasts(id?: string) {\r\n if (id) {\r\n removeToast(id);\r\n return;\r\n }\r\n\r\n const items = toasts.value;\r\n toasts.value = [];\r\n items.forEach((item) => item.onClosed?.());\r\n}\r\n\r\nlet viewportMounts = 0;\r\n\r\nexport function registerToastViewport() {\r\n viewportMounts += 1;\r\n}\r\n\r\nexport function unregisterToastViewport() {\r\n viewportMounts = Math.max(0, viewportMounts - 1);\r\n}\r\n\r\nexport function hasToastViewport() {\r\n if (viewportMounts > 0) {\r\n return true;\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n return Boolean(document.querySelector('[data-tao-toast-viewport]'));\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { onBeforeUnmount, onMounted, ref } from 'vue';\r\nimport TaoButton from './TaoButton.vue';\r\nimport TaoIcon from './TaoIcon.vue';\r\nimport { listenFocusLoss } from '../focusLoss';\r\nimport { removeToast, toastDefaults } from '../toast/store';\r\nimport type { TaoToastRecord } from '../toast/types';\r\n\r\ndefineOptions({ name: 'TaoToastItem' });\r\n\r\nconst props = defineProps<{\r\n toast: TaoToastRecord;\r\n}>();\r\n\r\nconst paused = ref(false);\r\nlet remaining = props.toast.timeout;\r\nlet startedAt = 0;\r\nlet timer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nfunction clearTimer() {\r\n if (timer !== null) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n}\r\n\r\nfunction startTimer() {\r\n if (!props.toast.timeout) {\r\n return;\r\n }\r\n\r\n startedAt = Date.now();\r\n clearTimer();\r\n timer = setTimeout(() => removeToast(props.toast.id), remaining);\r\n}\r\n\r\nfunction pause() {\r\n if (paused.value || !props.toast.timeout) {\r\n return;\r\n }\r\n\r\n remaining = Math.max(0, remaining - (Date.now() - startedAt));\r\n paused.value = true;\r\n clearTimer();\r\n}\r\n\r\nfunction resume() {\r\n if (!paused.value || !props.toast.timeout) {\r\n return;\r\n }\r\n\r\n paused.value = false;\r\n startTimer();\r\n}\r\n\r\nfunction close() {\r\n clearTimer();\r\n removeToast(props.toast.id);\r\n}\r\n\r\nfunction runAction(onClick: () => void) {\r\n onClick();\r\n close();\r\n}\r\n\r\nstartTimer();\r\n\r\nlet stopFocusLoss: (() => void) | undefined;\r\nonMounted(() => {\r\n stopFocusLoss = listenFocusLoss(resume);\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n stopFocusLoss?.();\r\n clearTimer();\r\n});\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"tao-toast\"\r\n :class=\"[`tao-toast--${toast.type}`, { 'tao-toast--paused': paused }]\"\r\n :role=\"toast.type === 'error' || toast.type === 'danger' || toast.type === 'warning' ? 'alert' : 'status'\"\r\n aria-live=\"polite\"\r\n @mouseenter=\"pause\"\r\n @mouseleave=\"resume\"\r\n >\r\n <span class=\"tao-toast__accent\" aria-hidden=\"true\"></span>\r\n\r\n <span class=\"tao-toast__icon\" aria-hidden=\"true\">\r\n <TaoIcon v-if=\"toast.icon\" :name=\"toast.icon\" :size=\"18\" />\r\n <svg v-else-if=\"toast.type === 'success'\" viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\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\" />\r\n </svg>\r\n <svg v-else-if=\"toast.type === 'error' || toast.type === 'danger'\" viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <path d=\"M7 7l6 6M13 7l-6 6\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\r\n </svg>\r\n <svg v-else-if=\"toast.type === 'warning'\" viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\r\n <path d=\"M10 3.5 17.5 16.5H2.5L10 3.5Z\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\" />\r\n <path d=\"M10 8.2v4.2\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\r\n <circle cx=\"10\" cy=\"14.4\" r=\"0.8\" fill=\"currentColor\" />\r\n </svg>\r\n <svg v-else viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <path d=\"M10 9v5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\r\n <circle cx=\"10\" cy=\"6.4\" r=\"0.8\" fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n\r\n <div class=\"tao-toast__body\">\r\n <strong v-if=\"toast.title\" class=\"tao-toast__title\">{{ toast.title }}</strong>\r\n <p v-if=\"toast.message\" class=\"tao-toast__message\">{{ toast.message }}</p>\r\n <div v-if=\"toast.actions.length\" class=\"tao-toast__actions\">\r\n <TaoButton\r\n v-for=\"action in toast.actions\"\r\n :key=\"action.label\"\r\n size=\"small\"\r\n variant=\"secondary\"\r\n @click=\"runAction(action.onClick)\"\r\n >\r\n {{ action.label }}\r\n </TaoButton>\r\n </div>\r\n </div>\r\n\r\n <button\r\n v-if=\"toast.closable\"\r\n type=\"button\"\r\n class=\"tao-toast__close\"\r\n :aria-label=\"toastDefaults.closeLabel\"\r\n @click=\"close\"\r\n >\r\n &times;\r\n </button>\r\n\r\n <span\r\n v-if=\"toast.progress && toast.timeout\"\r\n class=\"tao-toast__progress\"\r\n :style=\"{ animationDuration: `${toast.timeout}ms` }\"\r\n ></span>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-toast {\r\n --tao-toast-tone: var(--tao-color-accent);\r\n\r\n position: relative;\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--tao-space-3);\r\n width: min(470px, calc(100vw - 32px));\r\n padding: var(--tao-space-3) var(--tao-space-4);\r\n overflow: hidden;\r\n background: color-mix(in srgb, var(--tao-toast-tone) 8%, var(--tao-color-surface-raised));\r\n color: var(--tao-color-text);\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-panel);\r\n box-shadow: var(--tao-shadow-overlay);\r\n pointer-events: auto;\r\n}\r\n\r\n.tao-toast--success {\r\n --tao-toast-tone: var(--tao-color-success);\r\n}\r\n\r\n.tao-toast--error,\r\n.tao-toast--danger {\r\n --tao-toast-tone: var(--tao-color-danger);\r\n}\r\n\r\n.tao-toast--warning {\r\n --tao-toast-tone: var(--tao-color-warning);\r\n}\r\n\r\n.tao-toast--info {\r\n --tao-toast-tone: var(--tao-color-info);\r\n}\r\n\r\n.tao-toast__accent {\r\n position: absolute;\r\n inset: 0 auto 0 0;\r\n width: 3px;\r\n background: var(--tao-toast-tone);\r\n}\r\n\r\n.tao-toast__icon {\r\n display: inline-flex;\r\n flex-shrink: 0;\r\n margin-top: 1px;\r\n color: var(--tao-toast-tone);\r\n}\r\n\r\n.tao-toast__body {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-1);\r\n min-width: 0;\r\n flex: 1;\r\n padding-right: var(--tao-space-4);\r\n}\r\n\r\n.tao-toast__title {\r\n font-size: var(--tao-font-size-md);\r\n font-weight: 600;\r\n color: var(--tao-color-text-strong);\r\n line-height: 1.3;\r\n}\r\n\r\n.tao-toast__message {\r\n margin: 0;\r\n font-size: var(--tao-font-size-sm);\r\n line-height: 1.45;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-toast__actions {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--tao-space-2);\r\n margin-top: var(--tao-space-1);\r\n}\r\n\r\n.tao-toast__close {\r\n position: absolute;\r\n top: var(--tao-space-1);\r\n right: var(--tao-space-2);\r\n padding: 0;\r\n border: none;\r\n background: none;\r\n color: var(--tao-color-text-muted);\r\n font-size: 20px;\r\n line-height: 1;\r\n cursor: pointer;\r\n}\r\n\r\n.tao-toast__close:hover {\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-toast__progress {\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n height: 2px;\r\n transform-origin: left center;\r\n background: var(--tao-toast-tone);\r\n animation-name: tao-toast-progress;\r\n animation-timing-function: linear;\r\n animation-fill-mode: forwards;\r\n}\r\n\r\n.tao-toast--paused .tao-toast__progress {\r\n animation-play-state: paused;\r\n}\r\n\r\n@keyframes tao-toast-progress {\r\n from {\r\n transform: scaleX(1);\r\n }\r\n to {\r\n transform: scaleX(0);\r\n }\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { onBeforeUnmount, onMounted } from 'vue';\r\nimport TaoToastItem from './TaoToastItem.vue';\r\nimport { registerToastViewport, toastsByPosition, TOAST_POSITIONS, unregisterToastViewport } from '../toast/store';\r\nimport type { TaoToastPosition } from '../toast/types';\r\n\r\ndefineOptions({ name: 'TaoToastViewport' });\r\n\r\nonMounted(() => {\r\n registerToastViewport();\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n unregisterToastViewport();\r\n});\r\n\r\nfunction enterName(position: TaoToastPosition) {\r\n if (position === 'center') {\r\n return 'tao-toast-center';\r\n }\r\n\r\n if (position.startsWith('top')) {\r\n return 'tao-toast-top';\r\n }\r\n\r\n return 'tao-toast-bottom';\r\n}\r\n</script>\r\n\r\n<template>\r\n <Teleport to=\"body\">\r\n <div\r\n v-for=\"position in TOAST_POSITIONS\"\r\n :key=\"position\"\r\n class=\"tao-toast-viewport\"\r\n :class=\"`tao-toast-viewport--${position}`\"\r\n data-tao-toast-viewport\r\n >\r\n <TransitionGroup :name=\"enterName(position)\" tag=\"div\" class=\"tao-toast-viewport__stack\">\r\n <div v-for=\"item in toastsByPosition[position]\" :key=\"item.id\" class=\"tao-toast-slot\">\r\n <div class=\"tao-toast-slot__inner\">\r\n <TaoToastItem :toast=\"item\" />\r\n </div>\r\n </div>\r\n </TransitionGroup>\r\n </div>\r\n </Teleport>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-toast-viewport {\r\n position: fixed;\r\n z-index: 1100;\r\n display: flex;\r\n pointer-events: none;\r\n padding: var(--tao-space-4);\r\n}\r\n\r\n.tao-toast-viewport__stack {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--tao-space-2);\r\n width: 100%;\r\n}\r\n\r\n.tao-toast-slot {\r\n display: grid;\r\n grid-template-rows: 1fr;\r\n}\r\n\r\n.tao-toast-slot__inner {\r\n min-height: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.tao-toast-viewport--topRight {\r\n top: 0;\r\n right: 0;\r\n align-items: flex-end;\r\n}\r\n\r\n.tao-toast-viewport--topLeft {\r\n top: 0;\r\n left: 0;\r\n align-items: flex-start;\r\n}\r\n\r\n.tao-toast-viewport--topCenter {\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n justify-content: center;\r\n}\r\n\r\n.tao-toast-viewport--bottomRight {\r\n right: 0;\r\n bottom: 0;\r\n align-items: flex-end;\r\n}\r\n\r\n.tao-toast-viewport--bottomRight .tao-toast-viewport__stack,\r\n.tao-toast-viewport--bottomLeft .tao-toast-viewport__stack,\r\n.tao-toast-viewport--bottomCenter .tao-toast-viewport__stack {\r\n flex-direction: column-reverse;\r\n}\r\n\r\n.tao-toast-viewport--bottomLeft {\r\n left: 0;\r\n bottom: 0;\r\n align-items: flex-start;\r\n}\r\n\r\n.tao-toast-viewport--bottomCenter {\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n justify-content: center;\r\n}\r\n\r\n.tao-toast-viewport--center {\r\n inset: 0;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n\r\n.tao-toast-top-enter-active,\r\n.tao-toast-bottom-enter-active,\r\n.tao-toast-center-enter-active {\r\n animation: tao-toast-bounce-in var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-toast-top-leave-active,\r\n.tao-toast-bottom-leave-active,\r\n.tao-toast-center-leave-active {\r\n pointer-events: none;\r\n overflow: hidden;\r\n transition: grid-template-rows var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-toast-top-leave-from,\r\n.tao-toast-bottom-leave-from,\r\n.tao-toast-center-leave-from {\r\n grid-template-rows: 1fr;\r\n}\r\n\r\n.tao-toast-top-leave-to,\r\n.tao-toast-bottom-leave-to,\r\n.tao-toast-center-leave-to {\r\n grid-template-rows: 0fr;\r\n}\r\n\r\n.tao-toast-top-leave-active .tao-toast-slot__inner,\r\n.tao-toast-center-leave-active .tao-toast-slot__inner {\r\n animation: tao-toast-fade-out-up var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-toast-bottom-leave-active .tao-toast-slot__inner {\r\n animation: tao-toast-fade-out-down var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n@keyframes tao-toast-bounce-in {\r\n 0% {\r\n opacity: 0;\r\n transform: translateY(18px) scale(0.96);\r\n }\r\n 60% {\r\n opacity: 1;\r\n transform: translateY(-4px) scale(1.02);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n}\r\n\r\n@keyframes tao-toast-fade-out-up {\r\n to {\r\n opacity: 0;\r\n transform: translateY(-8px) scale(0.98);\r\n }\r\n}\r\n\r\n@keyframes tao-toast-fade-out-down {\r\n to {\r\n opacity: 0;\r\n transform: translateY(8px) scale(0.98);\r\n }\r\n}\r\n</style>\r\n","import { ref } from 'vue';\r\nimport type { TaoConfirmDefaults, TaoConfirmRecord } from './types';\r\n\r\nexport const confirmDefaults: TaoConfirmDefaults = {\r\n ok: 'ОК',\r\n cancel: 'Отмена',\r\n};\r\n\r\nexport const currentConfirm = ref<TaoConfirmRecord | null>(null);\r\n\r\nconst queue: TaoConfirmRecord[] = [];\r\n\r\nexport function configureConfirmDefaults(partial: Partial<TaoConfirmDefaults>) {\r\n Object.assign(confirmDefaults, partial);\r\n}\r\n\r\nfunction pump() {\r\n if (currentConfirm.value) {\r\n return;\r\n }\r\n\r\n currentConfirm.value = queue.shift() ?? null;\r\n}\r\n\r\nexport function enqueueConfirm(record: TaoConfirmRecord) {\r\n queue.push(record);\r\n pump();\r\n}\r\n\r\nexport function resolveConfirm(value: boolean) {\r\n const item = currentConfirm.value;\r\n if (!item) {\r\n return;\r\n }\r\n\r\n currentConfirm.value = null;\r\n item.resolve(value);\r\n pump();\r\n}\r\n\r\nlet viewportMounts = 0;\r\n\r\nexport function registerConfirmHost() {\r\n viewportMounts += 1;\r\n}\r\n\r\nexport function unregisterConfirmHost() {\r\n viewportMounts = Math.max(0, viewportMounts - 1);\r\n}\r\n\r\nexport function hasConfirmHost() {\r\n if (viewportMounts > 0) {\r\n return true;\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n return Boolean(document.querySelector('[data-tao-confirm-host]'));\r\n}\r\n","<script lang=\"ts\" setup>\r\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue';\r\nimport TaoButton from './TaoButton.vue';\r\nimport { currentConfirm, registerConfirmHost, resolveConfirm, unregisterConfirmHost } from '../confirm/store';\r\nimport { trapTab } from '../focusTrap';\r\nimport { isBrowser, lockBodyScroll, unlockBodyScroll } from '../bodyScroll';\r\n\r\ndefineOptions({ name: 'TaoConfirmHost' });\r\n\r\nconst panelRef = ref<HTMLElement | null>(null);\r\nlet previousFocus: HTMLElement | null = null;\r\nlet scrollHeld = false;\r\n\r\nonMounted(() => {\r\n registerConfirmHost();\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n releaseScroll();\r\n unregisterConfirmHost();\r\n});\r\n\r\nwatch(\r\n () => currentConfirm.value?.id,\r\n async (id) => {\r\n if (!id) {\r\n releaseScroll();\r\n restoreFocus();\r\n return;\r\n }\r\n\r\n if (!isBrowser()) {\r\n return;\r\n }\r\n\r\n previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;\r\n holdScroll();\r\n await nextTick();\r\n queryButton(currentConfirm.value?.danger ? 'cancel' : 'ok')?.focus();\r\n },\r\n);\r\n\r\nfunction queryButton(which: 'ok' | 'cancel') {\r\n return panelRef.value?.querySelector<HTMLButtonElement>(`[data-tao-confirm-${which}]`) ?? null;\r\n}\r\n\r\nfunction holdScroll() {\r\n if (scrollHeld || !isBrowser()) {\r\n return;\r\n }\r\n lockBodyScroll();\r\n scrollHeld = true;\r\n}\r\n\r\nfunction releaseScroll() {\r\n if (!scrollHeld) {\r\n return;\r\n }\r\n unlockBodyScroll();\r\n scrollHeld = false;\r\n}\r\n\r\nfunction restoreFocus() {\r\n previousFocus?.focus?.();\r\n previousFocus = null;\r\n}\r\n\r\nfunction answer(value: boolean) {\r\n resolveConfirm(value);\r\n}\r\n\r\nfunction onOverlayClick() {\r\n answer(false);\r\n}\r\n\r\nfunction onKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n answer(false);\r\n return;\r\n }\r\n\r\n if (panelRef.value) {\r\n trapTab(event, panelRef.value);\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <Teleport to=\"body\">\r\n <Transition name=\"tao-confirm\">\r\n <div\r\n v-if=\"currentConfirm\"\r\n class=\"tao-confirm\"\r\n data-tao-confirm-host\r\n @keydown=\"onKeydown\"\r\n >\r\n <div class=\"tao-confirm__overlay\" @click=\"onOverlayClick\"></div>\r\n\r\n <div\r\n ref=\"panelRef\"\r\n class=\"tao-confirm__panel\"\r\n :class=\"{ 'tao-confirm__panel--danger': currentConfirm.danger }\"\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n :aria-labelledby=\"currentConfirm.title ? 'tao-confirm-title' : undefined\"\r\n :aria-describedby=\"currentConfirm.message ? 'tao-confirm-message' : undefined\"\r\n tabindex=\"-1\"\r\n >\r\n <span class=\"tao-confirm__accent\" aria-hidden=\"true\"></span>\r\n\r\n <span class=\"tao-confirm__icon\" aria-hidden=\"true\">\r\n <svg v-if=\"currentConfirm.danger\" viewBox=\"0 0 20 20\" width=\"22\" height=\"22\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <path d=\"M7 7l6 6M13 7l-6 6\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\r\n </svg>\r\n <svg v-else viewBox=\"0 0 20 20\" width=\"22\" height=\"22\" fill=\"none\">\r\n <circle cx=\"10\" cy=\"10\" r=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.6\" />\r\n <path d=\"M10 9v5\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" />\r\n <circle cx=\"10\" cy=\"6.4\" r=\"0.8\" fill=\"currentColor\" />\r\n </svg>\r\n </span>\r\n\r\n <div class=\"tao-confirm__body\">\r\n <h2 v-if=\"currentConfirm.title\" id=\"tao-confirm-title\" class=\"tao-confirm__title\">\r\n {{ currentConfirm.title }}\r\n </h2>\r\n <p v-if=\"currentConfirm.message\" id=\"tao-confirm-message\" class=\"tao-confirm__message\">\r\n {{ currentConfirm.message }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"tao-confirm__actions\">\r\n <TaoButton data-tao-confirm-cancel variant=\"secondary\" @click=\"answer(false)\">\r\n {{ currentConfirm.cancelLabel }}\r\n </TaoButton>\r\n <TaoButton\r\n data-tao-confirm-ok\r\n :variant=\"currentConfirm.danger ? 'danger' : 'primary'\"\r\n @click=\"answer(true)\"\r\n >\r\n {{ currentConfirm.okLabel }}\r\n </TaoButton>\r\n </div>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n</template>\r\n\r\n<style scoped>\r\n.tao-confirm {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 1200;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--tao-space-5);\r\n}\r\n\r\n.tao-confirm__overlay {\r\n position: absolute;\r\n inset: 0;\r\n background: var(--tao-color-overlay);\r\n}\r\n\r\n.tao-confirm__panel {\r\n --tao-confirm-tone: var(--tao-color-warning);\r\n\r\n position: relative;\r\n z-index: 1;\r\n display: grid;\r\n grid-template-columns: auto 1fr;\r\n grid-template-areas:\r\n \"icon body\"\r\n \"actions actions\";\r\n gap: var(--tao-space-3) var(--tao-space-4);\r\n width: min(420px, 100%);\r\n padding: var(--tao-space-5);\r\n background: color-mix(in srgb, var(--tao-confirm-tone) 8%, var(--tao-color-surface-raised));\r\n border: 1px solid var(--tao-color-border);\r\n border-radius: var(--tao-radius-panel);\r\n box-shadow: var(--tao-shadow-overlay);\r\n outline: none;\r\n}\r\n\r\n.tao-confirm__panel--danger {\r\n --tao-confirm-tone: var(--tao-color-danger);\r\n}\r\n\r\n.tao-confirm__accent {\r\n position: absolute;\r\n inset: 0 auto 0 0;\r\n width: 3px;\r\n background: var(--tao-confirm-tone);\r\n}\r\n\r\n.tao-confirm__icon {\r\n grid-area: icon;\r\n display: inline-flex;\r\n margin-top: 2px;\r\n color: var(--tao-confirm-tone);\r\n}\r\n\r\n.tao-confirm__body {\r\n grid-area: body;\r\n min-width: 0;\r\n}\r\n\r\n.tao-confirm__title {\r\n margin: 0;\r\n font-size: var(--tao-font-size-lg);\r\n font-weight: 600;\r\n line-height: 1.3;\r\n color: var(--tao-color-text-strong);\r\n}\r\n\r\n.tao-confirm__message {\r\n margin: var(--tao-space-2) 0 0;\r\n font-size: var(--tao-font-size-md);\r\n line-height: 1.45;\r\n color: var(--tao-color-text);\r\n}\r\n\r\n.tao-confirm__actions {\r\n grid-area: actions;\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: var(--tao-space-3);\r\n margin-top: var(--tao-space-1);\r\n}\r\n\r\n.tao-confirm-enter-active .tao-confirm__overlay,\r\n.tao-confirm-leave-active .tao-confirm__overlay {\r\n transition: opacity var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n.tao-confirm-enter-from .tao-confirm__overlay,\r\n.tao-confirm-leave-to .tao-confirm__overlay {\r\n opacity: 0;\r\n}\r\n\r\n.tao-confirm-enter-active .tao-confirm__panel {\r\n animation: tao-confirm-bounce-in var(--tao-duration-slow) var(--tao-ease-base);\r\n}\r\n\r\n.tao-confirm-leave-active .tao-confirm__panel {\r\n animation: tao-confirm-fade-out var(--tao-duration-base) var(--tao-ease-base);\r\n}\r\n\r\n@keyframes tao-confirm-bounce-in {\r\n 0% {\r\n opacity: 0;\r\n transform: translateY(18px) scale(0.96);\r\n }\r\n 60% {\r\n opacity: 1;\r\n transform: translateY(-4px) scale(1.02);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n}\r\n\r\n@keyframes tao-confirm-fade-out {\r\n to {\r\n opacity: 0;\r\n transform: translateY(10px);\r\n }\r\n}\r\n</style>\r\n","import { createApp } from 'vue';\r\nimport TaoToastViewport from '../components/TaoToastViewport.vue';\r\nimport { addToast, configureToastDefaults, dismissToasts, hasToastViewport, toastDefaults } from './store';\r\nimport type {\r\n TaoToastAction,\r\n TaoToastDefaults,\r\n TaoToastDisplayMode,\r\n TaoToastPosition,\r\n TaoToastRecord,\r\n TaoToastShortcutOptions,\r\n TaoToastType,\r\n} from './types';\r\n\r\nexport type {\r\n TaoToastAction,\r\n TaoToastDefaults,\r\n TaoToastDisplayMode,\r\n TaoToastPosition,\r\n TaoToastRecord,\r\n TaoToastShortcutOptions,\r\n TaoToastType,\r\n};\r\n\r\nconst TYPE_TIMEOUT: Record<TaoToastType, number> = {\r\n success: 3000,\r\n error: 5000,\r\n danger: 5000,\r\n warning: 4000,\r\n info: 3000,\r\n neutral: 2500,\r\n};\r\n\r\ninterface Draft {\r\n type: TaoToastType;\r\n title: string;\r\n message: string;\r\n icon: string;\r\n timeout: number;\r\n position: TaoToastPosition;\r\n closable: boolean;\r\n progress: boolean;\r\n displayMode?: TaoToastDisplayMode;\r\n dedupeId?: string;\r\n actions: TaoToastAction[];\r\n onClosed?: () => void;\r\n}\r\n\r\nfunction isClient() {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\nfunction nextToastId() {\r\n return `tao-toast-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\r\n}\r\n\r\nlet hostedApp: ReturnType<typeof createApp> | null = null;\r\n\r\nfunction ensureToastViewport() {\r\n if (!isClient() || hasToastViewport()) {\r\n return;\r\n }\r\n\r\n const host = document.createElement('div');\r\n host.setAttribute('data-tao-toast-host', '');\r\n document.body.appendChild(host);\r\n hostedApp = createApp(TaoToastViewport);\r\n hostedApp.mount(host);\r\n}\r\n\r\nfunction flushDraft(draft: Draft) {\r\n if (!isClient()) {\r\n return;\r\n }\r\n\r\n if (!draft.title && !draft.message) {\r\n return;\r\n }\r\n\r\n const dedupeId =\r\n draft.dedupeId ??\r\n (draft.displayMode ? `${draft.type}:${draft.title}:${draft.message}` : undefined);\r\n\r\n ensureToastViewport();\r\n\r\n addToast({\r\n id: nextToastId(),\r\n type: draft.type,\r\n title: draft.title,\r\n message: draft.message,\r\n icon: draft.icon,\r\n timeout: draft.timeout,\r\n position: draft.position,\r\n closable: draft.closable,\r\n progress: draft.progress,\r\n displayMode: draft.displayMode,\r\n dedupeId,\r\n actions: draft.actions,\r\n onClosed: draft.onClosed,\r\n });\r\n}\r\n\r\nfunction createDraft(): Draft {\r\n return {\r\n type: 'info',\r\n title: '',\r\n message: '',\r\n icon: '',\r\n timeout: toastDefaults.timeout,\r\n position: toastDefaults.position,\r\n closable: toastDefaults.closable,\r\n progress: toastDefaults.progress,\r\n actions: [],\r\n };\r\n}\r\n\r\nexport interface TaoToastBuilder {\r\n success(): TaoToastBuilder;\r\n error(): TaoToastBuilder;\r\n danger(): TaoToastBuilder;\r\n warning(): TaoToastBuilder;\r\n info(): TaoToastBuilder;\r\n show(): TaoToastBuilder;\r\n short(): TaoToastBuilder;\r\n timeout(ms: number): TaoToastBuilder;\r\n title(value: string): TaoToastBuilder;\r\n message(value: string): TaoToastBuilder;\r\n icon(name: string): TaoToastBuilder;\r\n position(value: TaoToastPosition): TaoToastBuilder;\r\n byCenter(): TaoToastBuilder;\r\n byTopLeft(): TaoToastBuilder;\r\n byTopRight(): TaoToastBuilder;\r\n byTopCenter(): TaoToastBuilder;\r\n byBottomLeft(): TaoToastBuilder;\r\n byBottomRight(): TaoToastBuilder;\r\n byBottomCenter(): TaoToastBuilder;\r\n closable(value?: boolean): TaoToastBuilder;\r\n progress(value?: boolean): TaoToastBuilder;\r\n id(value: string): TaoToastBuilder;\r\n once(): TaoToastBuilder;\r\n replace(): TaoToastBuilder;\r\n action(label: string, onClick: () => void): TaoToastBuilder;\r\n onClosed(fn: () => void): TaoToastBuilder;\r\n}\r\n\r\nfunction createBuilder(): TaoToastBuilder {\r\n const draft = createDraft();\r\n\r\n const ctx: TaoToastBuilder = {\r\n success() {\r\n draft.type = 'success';\r\n draft.timeout = TYPE_TIMEOUT.success;\r\n return ctx;\r\n },\r\n error() {\r\n draft.type = 'error';\r\n draft.timeout = TYPE_TIMEOUT.error;\r\n return ctx;\r\n },\r\n danger() {\r\n draft.type = 'danger';\r\n draft.timeout = TYPE_TIMEOUT.danger;\r\n return ctx;\r\n },\r\n warning() {\r\n draft.type = 'warning';\r\n draft.timeout = TYPE_TIMEOUT.warning;\r\n return ctx;\r\n },\r\n info() {\r\n draft.type = 'info';\r\n draft.timeout = TYPE_TIMEOUT.info;\r\n return ctx;\r\n },\r\n show() {\r\n draft.type = 'neutral';\r\n draft.timeout = TYPE_TIMEOUT.neutral;\r\n return ctx;\r\n },\r\n short() {\r\n draft.timeout = 1000;\r\n return ctx;\r\n },\r\n timeout(ms: number) {\r\n draft.timeout = ms;\r\n return ctx;\r\n },\r\n title(value: string) {\r\n draft.title = value;\r\n return ctx;\r\n },\r\n message(value: string) {\r\n draft.message = String(value);\r\n return ctx;\r\n },\r\n icon(name: string) {\r\n draft.icon = name;\r\n return ctx;\r\n },\r\n position(value: TaoToastPosition) {\r\n draft.position = value;\r\n return ctx;\r\n },\r\n byCenter() {\r\n draft.position = 'center';\r\n return ctx;\r\n },\r\n byTopLeft() {\r\n draft.position = 'topLeft';\r\n return ctx;\r\n },\r\n byTopRight() {\r\n draft.position = 'topRight';\r\n return ctx;\r\n },\r\n byTopCenter() {\r\n draft.position = 'topCenter';\r\n return ctx;\r\n },\r\n byBottomLeft() {\r\n draft.position = 'bottomLeft';\r\n return ctx;\r\n },\r\n byBottomRight() {\r\n draft.position = 'bottomRight';\r\n return ctx;\r\n },\r\n byBottomCenter() {\r\n draft.position = 'bottomCenter';\r\n return ctx;\r\n },\r\n closable(value = true) {\r\n draft.closable = value;\r\n return ctx;\r\n },\r\n progress(value = true) {\r\n draft.progress = value;\r\n return ctx;\r\n },\r\n id(value: string) {\r\n draft.dedupeId = value;\r\n return ctx;\r\n },\r\n once() {\r\n draft.displayMode = 'once';\r\n return ctx;\r\n },\r\n replace() {\r\n draft.displayMode = 'replace';\r\n return ctx;\r\n },\r\n action(label: string, onClick: () => void) {\r\n draft.actions = [...draft.actions, { label, onClick }];\r\n return ctx;\r\n },\r\n onClosed(fn: () => void) {\r\n draft.onClosed = fn;\r\n return ctx;\r\n },\r\n };\r\n\r\n // Тот самый flush: цепочка успевает собрать params в текущем тике.\r\n setTimeout(() => flushDraft(draft), 0);\r\n\r\n return ctx;\r\n}\r\n\r\nfunction shortcut(type: TaoToastType, message: string, options?: TaoToastShortcutOptions) {\r\n const builder = createBuilder();\r\n\r\n if (type === 'neutral') {\r\n builder.show();\r\n } else {\r\n builder[type]();\r\n }\r\n\r\n builder.message(message);\r\n\r\n if (options?.title) {\r\n builder.title(options.title);\r\n }\r\n if (options?.timeout !== undefined) {\r\n builder.timeout(options.timeout);\r\n }\r\n if (options?.position) {\r\n builder.position(options.position);\r\n }\r\n if (options?.icon) {\r\n builder.icon(options.icon);\r\n }\r\n if (options?.closable !== undefined) {\r\n builder.closable(options.closable);\r\n }\r\n if (options?.progress !== undefined) {\r\n builder.progress(options.progress);\r\n }\r\n if (options?.id) {\r\n builder.id(options.id);\r\n }\r\n if (options?.once) {\r\n builder.once();\r\n }\r\n if (options?.replace) {\r\n builder.replace();\r\n }\r\n if (options?.actions) {\r\n options.actions.forEach((action) => builder.action(action.label, action.onClick));\r\n }\r\n if (options?.onClosed) {\r\n builder.onClosed(options.onClosed);\r\n }\r\n\r\n return builder;\r\n}\r\n\r\nexport interface TaoToastApi {\r\n (): TaoToastBuilder;\r\n success(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n error(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n danger(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n warning(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n info(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n show(message: string, options?: TaoToastShortcutOptions): TaoToastBuilder;\r\n defaults(partial: Partial<TaoToastDefaults>): TaoToastApi;\r\n byTopCenter(): TaoToastApi;\r\n byTopLeft(): TaoToastApi;\r\n byBottomLeft(): TaoToastApi;\r\n byBottomRight(): TaoToastApi;\r\n dismiss(id?: string): void;\r\n}\r\n\r\nexport const toast: TaoToastApi = Object.assign(createBuilder, {\r\n success(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('success', message, options);\r\n },\r\n error(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('error', message, options);\r\n },\r\n danger(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('danger', message, options);\r\n },\r\n warning(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('warning', message, options);\r\n },\r\n info(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('info', message, options);\r\n },\r\n show(message: string, options?: TaoToastShortcutOptions) {\r\n return shortcut('neutral', message, options);\r\n },\r\n defaults(partial: Partial<TaoToastDefaults>) {\r\n configureToastDefaults(partial);\r\n return toast;\r\n },\r\n byTopCenter() {\r\n configureToastDefaults({ position: 'topCenter' });\r\n return toast;\r\n },\r\n byTopLeft() {\r\n configureToastDefaults({ position: 'topLeft' });\r\n return toast;\r\n },\r\n byBottomLeft() {\r\n configureToastDefaults({ position: 'bottomLeft' });\r\n return toast;\r\n },\r\n byBottomRight() {\r\n configureToastDefaults({ position: 'bottomRight' });\r\n return toast;\r\n },\r\n dismiss(id?: string) {\r\n dismissToasts(id);\r\n },\r\n});\r\n","import { createApp } from 'vue';\r\nimport TaoConfirmHost from '../components/TaoConfirmHost.vue';\r\nimport {\r\n configureConfirmDefaults,\r\n confirmDefaults,\r\n enqueueConfirm,\r\n hasConfirmHost,\r\n resolveConfirm,\r\n} from './store';\r\nimport type { TaoConfirmDefaults, TaoConfirmShortcutOptions } from './types';\r\n\r\nexport type { TaoConfirmDefaults, TaoConfirmRecord, TaoConfirmShortcutOptions } from './types';\r\n\r\ninterface Draft {\r\n title: string;\r\n message: string;\r\n okLabel: string;\r\n cancelLabel: string;\r\n danger: boolean;\r\n}\r\n\r\nfunction isClient() {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\nfunction nextConfirmId() {\r\n return `tao-confirm-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\r\n}\r\n\r\nlet hostedApp: ReturnType<typeof createApp> | null = null;\r\n\r\nfunction ensureConfirmHost() {\r\n if (!isClient() || hasConfirmHost()) {\r\n return;\r\n }\r\n\r\n const host = document.createElement('div');\r\n host.setAttribute('data-tao-confirm-root', '');\r\n document.body.appendChild(host);\r\n hostedApp = createApp(TaoConfirmHost);\r\n hostedApp.mount(host);\r\n}\r\n\r\nfunction createDraft(): Draft {\r\n return {\r\n title: '',\r\n message: '',\r\n okLabel: confirmDefaults.ok,\r\n cancelLabel: confirmDefaults.cancel,\r\n danger: false,\r\n };\r\n}\r\n\r\nexport interface TaoConfirmBuilder extends PromiseLike<boolean> {\r\n title(value: string): TaoConfirmBuilder;\r\n message(value: string): TaoConfirmBuilder;\r\n ok(label: string): TaoConfirmBuilder;\r\n cancel(label: string): TaoConfirmBuilder;\r\n danger(value?: boolean): TaoConfirmBuilder;\r\n}\r\n\r\nfunction createBuilder(): TaoConfirmBuilder {\r\n const draft = createDraft();\r\n let settle: (value: boolean) => void = () => undefined;\r\n const promise = new Promise<boolean>((resolve) => {\r\n settle = resolve;\r\n });\r\n\r\n const ctx: TaoConfirmBuilder = {\r\n title(value: string) {\r\n draft.title = value;\r\n return ctx;\r\n },\r\n message(value: string) {\r\n draft.message = String(value);\r\n return ctx;\r\n },\r\n ok(label: string) {\r\n draft.okLabel = label;\r\n return ctx;\r\n },\r\n cancel(label: string) {\r\n draft.cancelLabel = label;\r\n return ctx;\r\n },\r\n danger(value = true) {\r\n draft.danger = value;\r\n return ctx;\r\n },\r\n then(onFulfilled, onRejected) {\r\n return promise.then(onFulfilled, onRejected);\r\n },\r\n };\r\n\r\n // Тот же flush, что у toast: цепочка собирает params, тик позже — показ.\r\n setTimeout(() => {\r\n if (!isClient() || (!draft.title && !draft.message)) {\r\n settle(false);\r\n return;\r\n }\r\n\r\n ensureConfirmHost();\r\n enqueueConfirm({\r\n id: nextConfirmId(),\r\n title: draft.title,\r\n message: draft.message,\r\n okLabel: draft.okLabel,\r\n cancelLabel: draft.cancelLabel,\r\n danger: draft.danger,\r\n resolve: settle,\r\n });\r\n }, 0);\r\n\r\n return ctx;\r\n}\r\n\r\nfunction applyOptions(builder: TaoConfirmBuilder, options?: TaoConfirmShortcutOptions) {\r\n if (!options) {\r\n return builder;\r\n }\r\n\r\n if (options.message) {\r\n builder.message(options.message);\r\n }\r\n if (options.ok) {\r\n builder.ok(options.ok);\r\n }\r\n if (options.cancel) {\r\n builder.cancel(options.cancel);\r\n }\r\n if (options.danger) {\r\n builder.danger(true);\r\n }\r\n\r\n return builder;\r\n}\r\n\r\nexport interface TaoConfirmApi {\r\n (): TaoConfirmBuilder;\r\n (title: string, options?: TaoConfirmShortcutOptions): TaoConfirmBuilder;\r\n defaults(partial: Partial<TaoConfirmDefaults>): TaoConfirmApi;\r\n dismiss(): void;\r\n}\r\n\r\nfunction confirmFn(title?: string, options?: TaoConfirmShortcutOptions): TaoConfirmBuilder {\r\n const builder = createBuilder();\r\n\r\n if (title) {\r\n builder.title(title);\r\n }\r\n\r\n return applyOptions(builder, options);\r\n}\r\n\r\nexport const confirm: TaoConfirmApi = Object.assign(confirmFn, {\r\n defaults(partial: Partial<TaoConfirmDefaults>) {\r\n configureConfirmDefaults(partial);\r\n return confirm;\r\n },\r\n dismiss() {\r\n resolveConfirm(false);\r\n },\r\n});\r\n","import type { Plugin } from 'vue';\r\nimport TaoButton from './components/TaoButton.vue';\r\nimport TaoBlock from './components/TaoBlock.vue';\r\nimport TaoInput from './components/TaoInput.vue';\r\nimport TaoInputGroup from './components/TaoInputGroup.vue';\r\nimport TaoInputNumber from './components/TaoInputNumber.vue';\r\nimport TaoQuantity from './components/TaoQuantity.vue';\r\nimport TaoCard from './components/TaoCard.vue';\r\nimport TaoModal from './components/TaoModal.vue';\r\nimport TaoTabs from './components/TaoTabs.vue';\r\nimport TaoTooltip from './components/TaoTooltip.vue';\r\nimport TaoPopover from './components/TaoPopover.vue';\r\nimport TaoSpoiler from './components/TaoSpoiler.vue';\r\nimport TaoSpoilerGroup from './components/TaoSpoilerGroup.vue';\r\nimport TaoCopy from './components/TaoCopy.vue';\r\nimport TaoContainer from './components/TaoContainer.vue';\r\nimport TaoFlex from './components/TaoFlex.vue';\r\nimport TaoSpace from './components/TaoSpace.vue';\r\nimport TaoGrid from './components/TaoGrid.vue';\r\nimport TaoGridItem from './components/TaoGridItem.vue';\r\nimport TaoSplit from './components/TaoSplit.vue';\r\nimport TaoIcon from './components/TaoIcon.vue';\r\nimport TaoLoader from './components/TaoLoader.vue';\r\nimport TaoImage from './components/TaoImage.vue';\r\nimport TaoCheckbox from './components/TaoCheckbox.vue';\r\nimport TaoTag from './components/TaoTag.vue';\r\nimport TaoDivider from './components/TaoDivider.vue';\r\nimport TaoFieldset from './components/TaoFieldset.vue';\r\nimport TaoAnimatedBorder from './components/TaoAnimatedBorder.vue';\r\nimport TaoTextarea from './components/TaoTextarea.vue';\r\nimport TaoScrollTop from './components/TaoScrollTop.vue';\r\nimport TaoProgress from './components/TaoProgress.vue';\r\nimport TaoSlider from './components/TaoSlider.vue';\r\nimport TaoFileDrop from './components/TaoFileDrop.vue';\r\nimport TaoDropdownMenu from './components/TaoDropdownMenu.vue';\r\nimport TaoPinCode from './components/TaoPinCode.vue';\r\nimport TaoLink from './components/TaoLink.vue';\r\nimport TaoFormField from './components/TaoFormField.vue';\r\nimport TaoSelect from './components/TaoSelect.vue';\r\nimport TaoCombobox from './components/TaoCombobox.vue';\r\nimport TaoDate from './components/TaoDate.vue';\r\nimport TaoDateRange from './components/TaoDateRange.vue';\r\nimport TaoSwitch from './components/TaoSwitch.vue';\r\nimport TaoRadio from './components/TaoRadio.vue';\r\nimport TaoRadioGroup from './components/TaoRadioGroup.vue';\r\nimport TaoSegmented from './components/TaoSegmented.vue';\r\nimport TaoSegmentedOption from './components/TaoSegmentedOption.vue';\r\nimport TaoAlert from './components/TaoAlert.vue';\r\nimport TaoTable from './components/TaoTable.vue';\r\nimport TaoPagination from './components/TaoPagination.vue';\r\nimport TaoEmpty from './components/TaoEmpty.vue';\r\nimport TaoList from './components/TaoList.vue';\r\nimport TaoListItem from './components/TaoListItem.vue';\r\nimport TaoSkeleton from './components/TaoSkeleton.vue';\r\nimport TaoDrawer from './components/TaoDrawer.vue';\r\nimport TaoAvatar from './components/TaoAvatar.vue';\r\nimport TaoBreadcrumb from './components/TaoBreadcrumb.vue';\r\nimport TaoCounter from './components/TaoCounter.vue';\r\nimport TaoCarousel from './components/TaoCarousel.vue';\r\nimport TaoStages from './components/TaoStages.vue';\r\nimport TaoToastViewport from './components/TaoToastViewport.vue';\r\nimport TaoConfirmHost from './components/TaoConfirmHost.vue';\r\nimport { toast } from './toast';\r\nimport { confirm } from './confirm';\r\n\r\n// Импорт нужен только для того, чтобы Vite подхватил CSS в сборку\r\n// styles.css. Сам JS-бандл эти стили в рантайме НЕ применяет —\r\n// подключи '@1337exp/taoui/styles.css' самостоятельно (см. README), чтобы\r\n// иметь явный контроль над темизацией.\r\nimport './styles/index.css';\r\n\r\nconst components = [\r\n TaoButton,\r\n TaoBlock,\r\n TaoInput,\r\n TaoInputGroup,\r\n TaoInputNumber,\r\n TaoQuantity,\r\n TaoCard,\r\n TaoModal,\r\n TaoTabs,\r\n TaoTooltip,\r\n TaoPopover,\r\n TaoSpoiler,\r\n TaoSpoilerGroup,\r\n TaoCopy,\r\n TaoContainer,\r\n TaoFlex,\r\n TaoSpace,\r\n TaoGrid,\r\n TaoGridItem,\r\n TaoSplit,\r\n TaoIcon,\r\n TaoLoader,\r\n TaoImage,\r\n TaoCheckbox,\r\n TaoTag,\r\n TaoDivider,\r\n TaoFieldset,\r\n TaoAnimatedBorder,\r\n TaoTextarea,\r\n TaoScrollTop,\r\n TaoProgress,\r\n TaoSlider,\r\n TaoFileDrop,\r\n TaoDropdownMenu,\r\n TaoPinCode,\r\n TaoLink,\r\n TaoFormField,\r\n TaoSelect,\r\n TaoCombobox,\r\n TaoDate,\r\n TaoDateRange,\r\n TaoSwitch,\r\n TaoRadio,\r\n TaoRadioGroup,\r\n TaoSegmented,\r\n TaoSegmentedOption,\r\n TaoAlert,\r\n TaoTable,\r\n TaoPagination,\r\n TaoEmpty,\r\n TaoList,\r\n TaoListItem,\r\n TaoSkeleton,\r\n TaoDrawer,\r\n TaoAvatar,\r\n TaoBreadcrumb,\r\n TaoCounter,\r\n TaoCarousel,\r\n TaoStages,\r\n TaoToastViewport,\r\n TaoConfirmHost,\r\n];\r\n\r\nexport const TaoUI: Plugin = {\r\n install(app) {\r\n components.forEach(component => {\r\n app.component(component.name!, component);\r\n });\r\n },\r\n};\r\n\r\nexport {\r\n TaoButton,\r\n TaoBlock,\r\n TaoInput,\r\n TaoInputGroup,\r\n TaoInputNumber,\r\n TaoQuantity,\r\n TaoCard,\r\n TaoModal,\r\n TaoTabs,\r\n TaoTooltip,\r\n TaoPopover,\r\n TaoSpoiler,\r\n TaoSpoilerGroup,\r\n TaoCopy,\r\n TaoContainer,\r\n TaoFlex,\r\n TaoSpace,\r\n TaoGrid,\r\n TaoGridItem,\r\n TaoSplit,\r\n TaoIcon,\r\n TaoLoader,\r\n TaoImage,\r\n TaoCheckbox,\r\n TaoTag,\r\n TaoDivider,\r\n TaoFieldset,\r\n TaoAnimatedBorder,\r\n TaoTextarea,\r\n TaoScrollTop,\r\n TaoProgress,\r\n TaoSlider,\r\n TaoFileDrop,\r\n TaoDropdownMenu,\r\n TaoPinCode,\r\n TaoLink,\r\n TaoFormField,\r\n TaoSelect,\r\n TaoCombobox,\r\n TaoDate,\r\n TaoDateRange,\r\n TaoSwitch,\r\n TaoRadio,\r\n TaoRadioGroup,\r\n TaoSegmented,\r\n TaoSegmentedOption,\r\n TaoAlert,\r\n TaoTable,\r\n TaoPagination,\r\n TaoEmpty,\r\n TaoList,\r\n TaoListItem,\r\n TaoSkeleton,\r\n TaoDrawer,\r\n TaoAvatar,\r\n TaoBreadcrumb,\r\n TaoCounter,\r\n TaoCarousel,\r\n TaoStages,\r\n TaoToastViewport,\r\n TaoConfirmHost,\r\n toast,\r\n confirm,\r\n};\r\n\r\nexport type {\r\n TaoToastAction,\r\n TaoToastApi,\r\n TaoToastBuilder,\r\n TaoToastDefaults,\r\n TaoToastDisplayMode,\r\n TaoToastPosition,\r\n TaoToastRecord,\r\n TaoToastShortcutOptions,\r\n TaoToastType,\r\n} from './toast';\r\n\r\nexport type {\r\n TaoConfirmApi,\r\n TaoConfirmBuilder,\r\n TaoConfirmDefaults,\r\n TaoConfirmRecord,\r\n TaoConfirmShortcutOptions,\r\n} from './confirm';\r\n\r\nexport {\r\n parseTaoDate,\r\n parseTaoDateRange,\r\n formatTaoDateIso,\r\n todayTaoDate,\r\n formatTaoDateLabel,\r\n formatTaoDateRangeLabel,\r\n} from './date';\r\nexport type { TaoSelectOption } from './select';\r\nexport type { TaoDateCell, TaoDateParts, TaoDateRangeValue } from './date';\r\nexport type { TaoRadioValue } from './radio';\r\nexport type { TaoSegmentedSize } from './segmented';\r\nexport type { TaoSpoilerName } from './spoiler';\r\nexport type { TaoFormFieldContext } from './formField';\r\nexport type { TaoTableAlign, TaoTableColumn, TaoTableSort } from './table';\r\nexport type { TaoPaginationItem } from './pagination';\r\nexport type { TaoBreadcrumbItem } from './breadcrumb';\r\nexport type { TaoDropdownAction } from './dropdown';\r\nexport type { TaoQuantityChangeSource } from './quantity';\r\nexport type { TaoStageItem, TaoStageStatus } from './stage';\r\nexport type { TaoSplitDirection, TaoSplitUnit } from './split';\r\nexport type { TaoListSize } from './list';\r\n\r\nexport default TaoUI;\r\n"],"names":["_createElementBlock","_openBlock","_hoisted_2","_hoisted_3","_toDisplayString","_createElementVNode","_hoisted_4","_renderSlot","computed","_normalizeClass","_normalizeStyle","inject","useId","ref","_hoisted_1","_unref","$slots","_hoisted_5","_hoisted_6","watch","useSlots","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","nextTick","onBeforeUnmount","_createBlock","_Teleport","_createVNode","_Transition","_Fragment","_renderList","_createTextVNode","onMounted","provide","_resolveDynamicComponent","nextPx","reactive","onBeforeMount","value","getCurrentInstance","_mergeProps","onInput","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","TaoLink","_TransitionGroup","onUpdated","toast","viewportMounts","isClient","hostedApp","createApp","createDraft","createBuilder","TaoFlex"],"mappings":"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"}