{"version":3,"file":"DMqAHOIq.js","sources":["../../../../types/plugins/yandex-metrika.ts","../../../../composables/useProductMetrics.ts","../../../../composables/useProductCounter.ts","../../../../components/Icons/IconIncrease.vue","../../../../components/Icons/IconDecrease.vue","../../../../components/App/AppCounter.vue","../../../../components/App/AppTooltip.vue","../../../../node_modules/vuetify/lib/components/VSlideGroup/helpers.mjs","../../../../node_modules/vuetify/lib/components/VSlideGroup/VSlideGroup.mjs","../../../../node_modules/vuetify/lib/components/VSlideGroup/VSlideGroupItem.mjs"],"sourcesContent":["export type Products = Product[]\n\nexport interface Product {\n id: string\n name: string\n price?: number | null\n brand?: string\n category: string\n variant: string\n quantity?: number | null\n}\n\nexport enum EcommerceEventName {\n ADD = 'add',\n PURCHASE = 'purchase',\n REMOVE = 'remove',\n DETAIL = 'detail',\n}\n\nexport interface YmPropTypes {\n main: () => void\n city: () => void\n}\n","/* Types */\nimport { Modification } from '@/types/api/api-v3/product'\nimport { EcommerceEventName } from '@/types/plugins/yandex-metrika'\n\n/* Utils */\nimport { mapEcommerceData } from '@/services/metrics/utils/ecommerce'\n\n/* Stores */\nimport { useCityStore } from '@/store/city/city'\n\n/* Комплексная отправка метрики добавления/удаления единиц продукта */\nexport const useSendMetricsOfProduct = (\n currentProduct?: Partial | null,\n) => {\n const { $metrics } = useNuxtApp()\n\n const route = useRoute()\n\n const cityStore = useCityStore()\n\n const currencyCode = computed(() => cityStore.currencyCode)\n\n const pushMetrics = (typeEvent: EcommerceEventName, quantity: number) => {\n if (!currentProduct) return\n\n const ecommerceData = mapEcommerceData(\n currentProduct,\n typeEvent,\n currencyCode.value || '',\n quantity,\n )\n\n $metrics?.eventAddProduct({ ym: ecommerceData })\n $metrics?.eventSendGoal({ mt: 'Basketcomplete' })\n\n window.carrotquest?.track('cart_added', {\n name: currentProduct.full_name,\n url: route.path + currentProduct.slug,\n amount: currentProduct.price,\n img: currentProduct.image,\n })\n }\n\n return { pushMetrics }\n}\n","import { computed, ref } from 'vue'\nimport { debounce } from 'throttle-debounce'\n\n/* Types */\nimport { Product, Modification } from '@/types/api/api-v3/product'\nimport { EcommerceEventName } from '@/types/plugins/yandex-metrika'\n\n/* Stores */\nimport { useBasketStore } from '@/store/basket/basket'\nimport { useBasketChangeStore } from '@/store/basket/basket-change'\nimport { useAppStore } from '~/store/app/app'\nimport { SnackbarType } from '~/store/app/app.types'\n\n/* Composables */\nimport { useSendMetricsOfProduct } from '@/composables/useProductMetrics'\n\nexport const useProductCounter = (\n productId: ComputedRef,\n currentProduct?: Partial | null,\n product?: Product,\n) => {\n const previousQuantity = ref(0)\n // Счетчик кликов без учета единиц продуктов в корзине\n const countClickedQuantity = ref(0)\n\n const appStore = useAppStore()\n const basketStore = useBasketStore()\n const basketChangeStore = useBasketChangeStore()\n\n const basketError = computed(() => basketStore.error)\n\n const quantitySelectedProducts = computed(() => {\n return basketChangeStore.getQuantitySelectedProducts(productId.value)\n })\n\n // Получаем общее количество модификаций в корзине в рамках одного товара\n const totalSelectedProductsQuantity = computed(() => {\n if (!product) return 0\n\n let totalCount = 0\n\n for (const { id } of product.modifications) {\n totalCount += basketChangeStore.getQuantitySelectedProducts(id)\n }\n\n return totalCount\n })\n\n const { pushMetrics } = useSendMetricsOfProduct(currentProduct)\n\n const setProductQuantity = (quantity: number) => {\n basketChangeStore.setQuantitySelectedProducts({\n index: productId.value,\n value: quantity,\n })\n }\n\n // Устанавливаем общее количество модификаций добавленных в корзину в рамках одного товара\n const setTotalProductsQuantity = () => {\n if (!product) return\n\n for (const { id } of product.modifications) {\n const value = basketStore.basketSelectedProducts[id]\n\n if (value === undefined) continue\n\n basketChangeStore.setQuantitySelectedProducts({\n index: id,\n value,\n })\n }\n }\n\n const changeQuantity = debounce(\n 300,\n async (quantity: number, eventType: EcommerceEventName) => {\n await basketStore.setProduct({\n product_id: productId.value,\n quantity,\n })\n\n // Отправляем метрику добавления/удаляения единиц продукта\n if (countClickedQuantity.value)\n pushMetrics(eventType, countClickedQuantity.value)\n\n // Сбрасываем счетчик кликов\n countClickedQuantity.value = 0\n\n // Если произошла ошибка, приводим кол- во товара к изначальному и выводим снекбар\n if (basketError.value) {\n setProductQuantity(previousQuantity.value)\n\n // Показываем снекбар с ошибкой\n appStore.showSnackbar({\n message: 'Что-то пошло не так',\n type: SnackbarType.MESSAGE,\n })\n }\n },\n )\n\n const decreaseQuantity = () => {\n if (quantitySelectedProducts.value === 0) return\n\n previousQuantity.value = quantitySelectedProducts.value\n\n const newQuantity = quantitySelectedProducts.value - 1\n\n countClickedQuantity.value += 1\n\n setProductQuantity(newQuantity)\n changeQuantity(newQuantity, EcommerceEventName.REMOVE)\n }\n\n const increaseQuantity = () => {\n previousQuantity.value = quantitySelectedProducts.value\n\n const newQuantity = quantitySelectedProducts.value + 1\n\n // Фиксируем кол-во кликов\n countClickedQuantity.value += 1\n\n setProductQuantity(newQuantity)\n changeQuantity(newQuantity, EcommerceEventName.ADD)\n }\n\n return {\n basketError,\n quantitySelectedProducts,\n totalSelectedProductsQuantity,\n setProductQuantity,\n setTotalProductsQuantity,\n decreaseQuantity,\n increaseQuantity,\n }\n}\n","\n\n\n","\n\n\n","\n\n\n\n\n","\n\n\n\n\n","export function bias(val) {\n const c = 0.501;\n const x = Math.abs(val);\n return Math.sign(val) * (x / ((1 / c - 2) * (1 - x) + 1));\n}\nexport function calculateUpdatedOffset(_ref) {\n let {\n selectedElement,\n containerSize,\n contentSize,\n isRtl,\n currentScrollOffset,\n isHorizontal\n } = _ref;\n const clientSize = isHorizontal ? selectedElement.clientWidth : selectedElement.clientHeight;\n const offsetStart = isHorizontal ? selectedElement.offsetLeft : selectedElement.offsetTop;\n const adjustedOffsetStart = isRtl && isHorizontal ? contentSize - offsetStart - clientSize : offsetStart;\n const totalSize = containerSize + currentScrollOffset;\n const itemOffset = clientSize + adjustedOffsetStart;\n const additionalOffset = clientSize * 0.4;\n if (adjustedOffsetStart <= currentScrollOffset) {\n currentScrollOffset = Math.max(adjustedOffsetStart - additionalOffset, 0);\n } else if (totalSize <= itemOffset) {\n currentScrollOffset = Math.min(currentScrollOffset - (totalSize - itemOffset - additionalOffset), contentSize - containerSize);\n }\n return currentScrollOffset;\n}\nexport function calculateCenteredOffset(_ref2) {\n let {\n selectedElement,\n containerSize,\n contentSize,\n isRtl,\n isHorizontal\n } = _ref2;\n const clientSize = isHorizontal ? selectedElement.clientWidth : selectedElement.clientHeight;\n const offsetStart = isHorizontal ? selectedElement.offsetLeft : selectedElement.offsetTop;\n const offsetCentered = isRtl && isHorizontal ? contentSize - offsetStart - clientSize / 2 - containerSize / 2 : offsetStart + clientSize / 2 - containerSize / 2;\n return Math.min(contentSize - containerSize, Math.max(0, offsetCentered));\n}\n//# sourceMappingURL=helpers.mjs.map","import { createVNode as _createVNode } from \"vue\";\n// Styles\nimport \"./VSlideGroup.css\";\n\n// Components\nimport { VFadeTransition } from \"../transitions/index.mjs\";\nimport { VIcon } from \"../VIcon/index.mjs\"; // Composables\nimport { makeComponentProps } from \"../../composables/component.mjs\";\nimport { makeDisplayProps, useDisplay } from \"../../composables/display.mjs\";\nimport { makeGroupProps, useGroup } from \"../../composables/group.mjs\";\nimport { IconValue } from \"../../composables/icons.mjs\";\nimport { useRtl } from \"../../composables/locale.mjs\";\nimport { useResizeObserver } from \"../../composables/resizeObserver.mjs\";\nimport { makeTagProps } from \"../../composables/tag.mjs\"; // Utilities\nimport { computed, shallowRef, watch } from 'vue';\nimport { bias, calculateCenteredOffset, calculateUpdatedOffset } from \"./helpers.mjs\";\nimport { clamp, focusableChildren, genericComponent, IN_BROWSER, propsFactory, useRender } from \"../../util/index.mjs\"; // Types\nexport const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');\nexport const makeVSlideGroupProps = propsFactory({\n centerActive: Boolean,\n direction: {\n type: String,\n default: 'horizontal'\n },\n symbol: {\n type: null,\n default: VSlideGroupSymbol\n },\n nextIcon: {\n type: IconValue,\n default: '$next'\n },\n prevIcon: {\n type: IconValue,\n default: '$prev'\n },\n showArrows: {\n type: [Boolean, String],\n validator: v => typeof v === 'boolean' || ['always', 'desktop', 'mobile'].includes(v)\n },\n ...makeComponentProps(),\n ...makeDisplayProps(),\n ...makeTagProps(),\n ...makeGroupProps({\n selectedClass: 'v-slide-group-item--active'\n })\n}, 'VSlideGroup');\nexport const VSlideGroup = genericComponent()({\n name: 'VSlideGroup',\n props: makeVSlideGroupProps(),\n emits: {\n 'update:modelValue': value => true\n },\n setup(props, _ref) {\n let {\n slots\n } = _ref;\n const {\n isRtl\n } = useRtl();\n const {\n displayClasses,\n mobile\n } = useDisplay(props);\n const group = useGroup(props, props.symbol);\n const isOverflowing = shallowRef(false);\n const scrollOffset = shallowRef(0);\n const containerSize = shallowRef(0);\n const contentSize = shallowRef(0);\n const isHorizontal = computed(() => props.direction === 'horizontal');\n const {\n resizeRef: containerRef,\n contentRect: containerRect\n } = useResizeObserver();\n const {\n resizeRef: contentRef,\n contentRect\n } = useResizeObserver();\n const firstSelectedIndex = computed(() => {\n if (!group.selected.value.length) return -1;\n return group.items.value.findIndex(item => item.id === group.selected.value[0]);\n });\n const lastSelectedIndex = computed(() => {\n if (!group.selected.value.length) return -1;\n return group.items.value.findIndex(item => item.id === group.selected.value[group.selected.value.length - 1]);\n });\n if (IN_BROWSER) {\n let frame = -1;\n watch(() => [group.selected.value, containerRect.value, contentRect.value, isHorizontal.value], () => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n if (containerRect.value && contentRect.value) {\n const sizeProperty = isHorizontal.value ? 'width' : 'height';\n containerSize.value = containerRect.value[sizeProperty];\n contentSize.value = contentRect.value[sizeProperty];\n isOverflowing.value = containerSize.value + 1 < contentSize.value;\n }\n if (firstSelectedIndex.value >= 0 && contentRef.value) {\n // TODO: Is this too naive? Should we store element references in group composable?\n const selectedElement = contentRef.value.children[lastSelectedIndex.value];\n if (firstSelectedIndex.value === 0 || !isOverflowing.value) {\n scrollOffset.value = 0;\n } else if (props.centerActive) {\n scrollOffset.value = calculateCenteredOffset({\n selectedElement,\n containerSize: containerSize.value,\n contentSize: contentSize.value,\n isRtl: isRtl.value,\n isHorizontal: isHorizontal.value\n });\n } else if (isOverflowing.value) {\n scrollOffset.value = calculateUpdatedOffset({\n selectedElement,\n containerSize: containerSize.value,\n contentSize: contentSize.value,\n isRtl: isRtl.value,\n currentScrollOffset: scrollOffset.value,\n isHorizontal: isHorizontal.value\n });\n }\n }\n });\n });\n }\n const disableTransition = shallowRef(false);\n let startTouch = 0;\n let startOffset = 0;\n function onTouchstart(e) {\n const sizeProperty = isHorizontal.value ? 'clientX' : 'clientY';\n const sign = isRtl.value && isHorizontal.value ? -1 : 1;\n startOffset = sign * scrollOffset.value;\n startTouch = e.touches[0][sizeProperty];\n disableTransition.value = true;\n }\n function onTouchmove(e) {\n if (!isOverflowing.value) return;\n const sizeProperty = isHorizontal.value ? 'clientX' : 'clientY';\n const sign = isRtl.value && isHorizontal.value ? -1 : 1;\n scrollOffset.value = sign * (startOffset + startTouch - e.touches[0][sizeProperty]);\n }\n function onTouchend(e) {\n const maxScrollOffset = contentSize.value - containerSize.value;\n if (scrollOffset.value < 0 || !isOverflowing.value) {\n scrollOffset.value = 0;\n } else if (scrollOffset.value >= maxScrollOffset) {\n scrollOffset.value = maxScrollOffset;\n }\n disableTransition.value = false;\n }\n function onScroll() {\n if (!containerRef.value) return;\n containerRef.value[isHorizontal.value ? 'scrollLeft' : 'scrollTop'] = 0;\n }\n const isFocused = shallowRef(false);\n function onFocusin(e) {\n isFocused.value = true;\n if (!isOverflowing.value || !contentRef.value) return;\n\n // Focused element is likely to be the root of an item, so a\n // breadth-first search will probably find it in the first iteration\n for (const el of e.composedPath()) {\n for (const item of contentRef.value.children) {\n if (item === el) {\n scrollOffset.value = calculateUpdatedOffset({\n selectedElement: item,\n containerSize: containerSize.value,\n contentSize: contentSize.value,\n isRtl: isRtl.value,\n currentScrollOffset: scrollOffset.value,\n isHorizontal: isHorizontal.value\n });\n return;\n }\n }\n }\n }\n function onFocusout(e) {\n isFocused.value = false;\n }\n function onFocus(e) {\n if (!isFocused.value && !(e.relatedTarget && contentRef.value?.contains(e.relatedTarget))) focus();\n }\n function onKeydown(e) {\n if (!contentRef.value) return;\n if (isHorizontal.value) {\n if (e.key === 'ArrowRight') {\n focus(isRtl.value ? 'prev' : 'next');\n } else if (e.key === 'ArrowLeft') {\n focus(isRtl.value ? 'next' : 'prev');\n }\n } else {\n if (e.key === 'ArrowDown') {\n focus('next');\n } else if (e.key === 'ArrowUp') {\n focus('prev');\n }\n }\n if (e.key === 'Home') {\n focus('first');\n } else if (e.key === 'End') {\n focus('last');\n }\n }\n function focus(location) {\n if (!contentRef.value) return;\n if (!location) {\n const focusable = focusableChildren(contentRef.value);\n focusable[0]?.focus();\n } else if (location === 'next') {\n const el = contentRef.value.querySelector(':focus')?.nextElementSibling;\n if (el) el.focus();else focus('first');\n } else if (location === 'prev') {\n const el = contentRef.value.querySelector(':focus')?.previousElementSibling;\n if (el) el.focus();else focus('last');\n } else if (location === 'first') {\n contentRef.value.firstElementChild?.focus();\n } else if (location === 'last') {\n contentRef.value.lastElementChild?.focus();\n }\n }\n function scrollTo(location) {\n const newAbsoluteOffset = scrollOffset.value + (location === 'prev' ? -1 : 1) * containerSize.value;\n scrollOffset.value = clamp(newAbsoluteOffset, 0, contentSize.value - containerSize.value);\n }\n const contentStyles = computed(() => {\n // This adds friction when scrolling the 'wrong' way when at max offset\n let scrollAmount = scrollOffset.value > contentSize.value - containerSize.value ? -(contentSize.value - containerSize.value) + bias(contentSize.value - containerSize.value - scrollOffset.value) : -scrollOffset.value;\n\n // This adds friction when scrolling the 'wrong' way when at min offset\n if (scrollOffset.value <= 0) {\n scrollAmount = bias(-scrollOffset.value);\n }\n const sign = isRtl.value && isHorizontal.value ? -1 : 1;\n return {\n transform: `translate${isHorizontal.value ? 'X' : 'Y'}(${sign * scrollAmount}px)`,\n transition: disableTransition.value ? 'none' : '',\n willChange: disableTransition.value ? 'transform' : ''\n };\n });\n const slotProps = computed(() => ({\n next: group.next,\n prev: group.prev,\n select: group.select,\n isSelected: group.isSelected\n }));\n const hasAffixes = computed(() => {\n switch (props.showArrows) {\n // Always show arrows on desktop & mobile\n case 'always':\n return true;\n\n // Always show arrows on desktop\n case 'desktop':\n return !mobile.value;\n\n // Show arrows on mobile when overflowing.\n // This matches the default 2.2 behavior\n case true:\n return isOverflowing.value || Math.abs(scrollOffset.value) > 0;\n\n // Always show on mobile\n case 'mobile':\n return mobile.value || isOverflowing.value || Math.abs(scrollOffset.value) > 0;\n\n // https://material.io/components/tabs#scrollable-tabs\n // Always show arrows when\n // overflowed on desktop\n default:\n return !mobile.value && (isOverflowing.value || Math.abs(scrollOffset.value) > 0);\n }\n });\n const hasPrev = computed(() => {\n return Math.abs(scrollOffset.value) > 0;\n });\n const hasNext = computed(() => {\n // Check one scroll ahead to know the width of right-most item\n return contentSize.value > Math.abs(scrollOffset.value) + containerSize.value;\n });\n useRender(() => _createVNode(props.tag, {\n \"class\": ['v-slide-group', {\n 'v-slide-group--vertical': !isHorizontal.value,\n 'v-slide-group--has-affixes': hasAffixes.value,\n 'v-slide-group--is-overflowing': isOverflowing.value\n }, displayClasses.value, props.class],\n \"style\": props.style,\n \"tabindex\": isFocused.value || group.selected.value.length ? -1 : 0,\n \"onFocus\": onFocus\n }, {\n default: () => [hasAffixes.value && _createVNode(\"div\", {\n \"key\": \"prev\",\n \"class\": ['v-slide-group__prev', {\n 'v-slide-group__prev--disabled': !hasPrev.value\n }],\n \"onClick\": () => hasPrev.value && scrollTo('prev')\n }, [slots.prev?.(slotProps.value) ?? _createVNode(VFadeTransition, null, {\n default: () => [_createVNode(VIcon, {\n \"icon\": isRtl.value ? props.nextIcon : props.prevIcon\n }, null)]\n })]), _createVNode(\"div\", {\n \"key\": \"container\",\n \"ref\": containerRef,\n \"class\": \"v-slide-group__container\",\n \"onScroll\": onScroll\n }, [_createVNode(\"div\", {\n \"ref\": contentRef,\n \"class\": \"v-slide-group__content\",\n \"style\": contentStyles.value,\n \"onTouchstartPassive\": onTouchstart,\n \"onTouchmovePassive\": onTouchmove,\n \"onTouchendPassive\": onTouchend,\n \"onFocusin\": onFocusin,\n \"onFocusout\": onFocusout,\n \"onKeydown\": onKeydown\n }, [slots.default?.(slotProps.value)])]), hasAffixes.value && _createVNode(\"div\", {\n \"key\": \"next\",\n \"class\": ['v-slide-group__next', {\n 'v-slide-group__next--disabled': !hasNext.value\n }],\n \"onClick\": () => hasNext.value && scrollTo('next')\n }, [slots.next?.(slotProps.value) ?? _createVNode(VFadeTransition, null, {\n default: () => [_createVNode(VIcon, {\n \"icon\": isRtl.value ? props.prevIcon : props.nextIcon\n }, null)]\n })])]\n }));\n return {\n selected: group.selected,\n scrollTo,\n scrollOffset,\n focus\n };\n }\n});\n//# sourceMappingURL=VSlideGroup.mjs.map","// Composables\nimport { makeGroupItemProps, useGroupItem } from \"../../composables/group.mjs\"; // Utilities\nimport { VSlideGroupSymbol } from \"./VSlideGroup.mjs\";\nimport { genericComponent } from \"../../util/index.mjs\"; // Types\nexport const VSlideGroupItem = genericComponent()({\n name: 'VSlideGroupItem',\n props: makeGroupItemProps(),\n emits: {\n 'group:selected': val => true\n },\n setup(props, _ref) {\n let {\n slots\n } = _ref;\n const slideGroupItem = useGroupItem(props, VSlideGroupSymbol);\n return () => slots.default?.({\n isSelected: slideGroupItem.isSelected.value,\n select: slideGroupItem.select,\n toggle: slideGroupItem.toggle,\n selectedClass: slideGroupItem.selectedClass.value\n });\n }\n});\n//# sourceMappingURL=VSlideGroupItem.mjs.map"],"names":["EcommerceEventName","useSendMetricsOfProduct","currentProduct","$metrics","useNuxtApp","route","useRoute","cityStore","useCityStore","currencyCode","computed","typeEvent","quantity","ecommerceData","mapEcommerceData","_a","useProductCounter","productId","product","previousQuantity","ref","countClickedQuantity","appStore","useAppStore","basketStore","useBasketStore","basketChangeStore","useBasketChangeStore","basketError","quantitySelectedProducts","totalSelectedProductsQuantity","totalCount","id","pushMetrics","setProductQuantity","setTotalProductsQuantity","value","changeQuantity","debounce","eventType","SnackbarType","newQuantity","props","__props","emit","__emit","onUpdate","bias","val","x","calculateUpdatedOffset","_ref","selectedElement","containerSize","contentSize","isRtl","currentScrollOffset","isHorizontal","clientSize","offsetStart","adjustedOffsetStart","totalSize","itemOffset","additionalOffset","calculateCenteredOffset","_ref2","offsetCentered","VSlideGroupSymbol","makeVSlideGroupProps","propsFactory","IconValue","v","makeComponentProps","makeDisplayProps","makeTagProps","makeGroupProps","VSlideGroup","genericComponent","slots","useRtl","displayClasses","mobile","useDisplay","group","useGroup","isOverflowing","shallowRef","scrollOffset","containerRef","containerRect","useResizeObserver","contentRef","contentRect","firstSelectedIndex","item","lastSelectedIndex","IN_BROWSER","frame","watch","sizeProperty","disableTransition","startTouch","startOffset","onTouchstart","e","onTouchmove","sign","onTouchend","maxScrollOffset","onScroll","isFocused","onFocusin","el","onFocusout","onFocus","focus","onKeydown","location","focusableChildren","_b","_c","_d","_e","scrollTo","newAbsoluteOffset","clamp","contentStyles","scrollAmount","slotProps","hasAffixes","hasPrev","hasNext","useRender","_createVNode","VFadeTransition","VIcon","VSlideGroupItem","makeGroupItemProps","slideGroupItem","useGroupItem"],"mappings":"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","debug_id":"8cecbb70-72d9-506f-9f97-24b7acb066a9"}