@1337exp/taoui 1.11.3 → 1.11.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +119 -99
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +9 -9
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/components/TaoButton.vue","../src/components/TaoBlock.vue","../src/formField.ts","../src/components/TaoInput.vue","../src/components/TaoInputGroup.vue","../src/components/TaoInputNumber.vue","../src/components/TaoQuantity.vue","../src/components/TaoCard.vue","../src/focusTrap.ts","../src/bodyScroll.ts","../src/components/TaoModal.vue","../src/components/TaoTabs.vue","../src/focusLoss.ts","../src/components/TaoTooltip.vue","../src/components/TaoPopover.vue","../src/spoiler.ts","../src/components/TaoSpoiler.vue","../src/components/TaoSpoilerGroup.vue","../src/components/TaoCopy.vue","../src/components/TaoContainer.vue","../src/components/TaoFlex.vue","../src/components/TaoSpace.vue","../src/components/TaoGrid.vue","../src/components/TaoGridItem.vue","../src/components/TaoSplit.vue","../src/components/TaoIcon.vue","../src/components/TaoLoader.vue","../src/components/TaoImage.vue","../src/components/TaoCheckbox.vue","../src/components/TaoTag.vue","../src/components/TaoDivider.vue","../src/components/TaoFieldset.vue","../src/components/TaoAnimatedBorder.vue","../src/components/TaoTextarea.vue","../src/components/TaoScrollTop.vue","../src/components/TaoProgress.vue","../src/components/TaoSlider.vue","../src/components/TaoFileDrop.vue","../src/components/TaoDropdownMenu.vue","../src/components/TaoPinCode.vue","../src/components/TaoLink.vue","../src/components/TaoFormField.vue","../src/components/TaoSelect.vue","../src/components/TaoCombobox.vue","../src/date.ts","../src/components/TaoDate.vue","../src/components/TaoDateRange.vue","../src/components/TaoSwitch.vue","../src/radio.ts","../src/components/TaoRadio.vue","../src/components/TaoRadioGroup.vue","../src/segmented.ts","../src/components/TaoSegmented.vue","../src/components/TaoSegmentedOption.vue","../src/components/TaoAlert.vue","../src/components/TaoTable.vue","../src/pagination.ts","../src/components/TaoPagination.vue","../src/components/TaoEmpty.vue","../src/list.ts","../src/components/TaoList.vue","../src/components/TaoListItem.vue","../src/components/TaoSkeleton.vue","../src/components/TaoDrawer.vue","../src/components/TaoAvatar.vue","../src/components/TaoBreadcrumb.vue","../src/components/TaoCounter.vue","../src/components/TaoCarousel.vue","../src/components/TaoStages.vue","../src/toast/store.ts","../src/components/TaoToastItem.vue","../src/components/TaoToastViewport.vue","../src/confirm/store.ts","../src/components/TaoConfirmHost.vue","../src/toast/index.ts","../src/confirm/index.ts","../src/index.ts"],"sourcesContent":["<script lang=\"ts\" setup>\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\">×</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 = defineProps<{\r\n tabs: Tab[];\r\n modelValue: string;\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\" 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: 2px 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\">×</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\">×</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 ×\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","_normalizeClass","_normalizeStyle","_hoisted_1","_unref","$slots","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_createBlock","_Teleport","_createVNode","_Transition","_Fragment","_renderList","_createTextVNode","_resolveDynamicComponent","nextPx","value","_mergeProps","onInput","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","TaoLink","_TransitionGroup","toast","viewportMounts","isClient","hostedApp","createDraft","createBuilder","TaoFlex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/components/TaoButton.vue","../src/components/TaoBlock.vue","../src/formField.ts","../src/components/TaoInput.vue","../src/components/TaoInputGroup.vue","../src/components/TaoInputNumber.vue","../src/components/TaoQuantity.vue","../src/components/TaoCard.vue","../src/focusTrap.ts","../src/bodyScroll.ts","../src/components/TaoModal.vue","../src/components/TaoTabs.vue","../src/focusLoss.ts","../src/components/TaoTooltip.vue","../src/components/TaoPopover.vue","../src/spoiler.ts","../src/components/TaoSpoiler.vue","../src/components/TaoSpoilerGroup.vue","../src/components/TaoCopy.vue","../src/components/TaoContainer.vue","../src/components/TaoFlex.vue","../src/components/TaoSpace.vue","../src/components/TaoGrid.vue","../src/components/TaoGridItem.vue","../src/components/TaoSplit.vue","../src/components/TaoIcon.vue","../src/components/TaoLoader.vue","../src/components/TaoImage.vue","../src/components/TaoCheckbox.vue","../src/components/TaoTag.vue","../src/components/TaoDivider.vue","../src/components/TaoFieldset.vue","../src/components/TaoAnimatedBorder.vue","../src/components/TaoTextarea.vue","../src/components/TaoScrollTop.vue","../src/components/TaoProgress.vue","../src/components/TaoSlider.vue","../src/components/TaoFileDrop.vue","../src/components/TaoDropdownMenu.vue","../src/components/TaoPinCode.vue","../src/components/TaoLink.vue","../src/components/TaoFormField.vue","../src/components/TaoSelect.vue","../src/components/TaoCombobox.vue","../src/date.ts","../src/components/TaoDate.vue","../src/components/TaoDateRange.vue","../src/components/TaoSwitch.vue","../src/radio.ts","../src/components/TaoRadio.vue","../src/components/TaoRadioGroup.vue","../src/segmented.ts","../src/components/TaoSegmented.vue","../src/components/TaoSegmentedOption.vue","../src/components/TaoAlert.vue","../src/components/TaoTable.vue","../src/pagination.ts","../src/components/TaoPagination.vue","../src/components/TaoEmpty.vue","../src/list.ts","../src/components/TaoList.vue","../src/components/TaoListItem.vue","../src/components/TaoSkeleton.vue","../src/components/TaoDrawer.vue","../src/components/TaoAvatar.vue","../src/components/TaoBreadcrumb.vue","../src/components/TaoCounter.vue","../src/components/TaoCarousel.vue","../src/components/TaoStages.vue","../src/toast/store.ts","../src/components/TaoToastItem.vue","../src/components/TaoToastViewport.vue","../src/confirm/store.ts","../src/components/TaoConfirmHost.vue","../src/toast/index.ts","../src/confirm/index.ts","../src/index.ts"],"sourcesContent":["<script lang=\"ts\" setup>\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\">×</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\" 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: 2px 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\">×</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\">×</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 ×\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","_normalizeClass","_normalizeStyle","_hoisted_1","_unref","$slots","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_createBlock","_Teleport","_createVNode","_Transition","_Fragment","_renderList","_createTextVNode","_resolveDynamicComponent","nextPx","value","_mergeProps","onInput","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","TaoLink","_TransitionGroup","toast","viewportMounts","isClient","hostedApp","createDraft","createBuilder","TaoFlex"],"mappings":"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"}
|