peek-carousel 1.0.2
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/LICENSE +21 -0
- package/README.en.md +238 -0
- package/README.md +234 -0
- package/dist/peek-carousel.css +1 -0
- package/dist/peek-carousel.esm.js +1368 -0
- package/dist/peek-carousel.esm.js.map +1 -0
- package/dist/peek-carousel.esm.min.js +8 -0
- package/dist/peek-carousel.esm.min.js.map +1 -0
- package/dist/peek-carousel.js +1376 -0
- package/dist/peek-carousel.js.map +1 -0
- package/dist/peek-carousel.min.css +1 -0
- package/dist/peek-carousel.min.js +8 -0
- package/dist/peek-carousel.min.js.map +1 -0
- package/examples/example-built.html +367 -0
- package/examples/example.css +2216 -0
- package/examples/example.js +404 -0
- package/examples/example.min.css +1 -0
- package/examples/example.min.js +1 -0
- package/package.json +92 -0
- package/src/core/PeekCarousel.js +294 -0
- package/src/core/config.js +49 -0
- package/src/core/constants.js +73 -0
- package/src/modules/Animator.js +244 -0
- package/src/modules/AutoRotate.js +43 -0
- package/src/modules/EventHandler.js +390 -0
- package/src/modules/Navigator.js +116 -0
- package/src/modules/UIManager.js +170 -0
- package/src/peek-carousel.d.ts +34 -0
- package/src/styles/base/_accessibility.scss +16 -0
- package/src/styles/base/_mixins.scss +7 -0
- package/src/styles/base/_variables.scss +75 -0
- package/src/styles/components/_carousel.scss +5 -0
- package/src/styles/components/_counter.scss +109 -0
- package/src/styles/components/_indicators.scss +154 -0
- package/src/styles/components/_navigation.scss +193 -0
- package/src/styles/components/carousel/_carousel-base.scss +99 -0
- package/src/styles/components/carousel/_carousel-classic.scss +76 -0
- package/src/styles/components/carousel/_carousel-mixins.scss +18 -0
- package/src/styles/components/carousel/_carousel-radial.scss +72 -0
- package/src/styles/components/carousel/_carousel-stack.scss +84 -0
- package/src/styles/components/carousel/_carousel-variables.scss +118 -0
- package/src/styles/peek-carousel.scss +11 -0
- package/src/utils/dom.js +53 -0
- package/src/utils/helpers.js +46 -0
- package/src/utils/icons.js +92 -0
- package/src/utils/preloader.js +69 -0
- package/types/index.d.ts +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peek-carousel.js","sources":["../src/core/config.js","../src/core/constants.js","../src/utils/dom.js","../src/utils/preloader.js","../src/utils/icons.js","../src/utils/helpers.js","../src/modules/Navigator.js","../src/modules/Animator.js","../src/modules/AutoRotate.js","../src/modules/EventHandler.js","../src/modules/UIManager.js","../src/core/PeekCarousel.js"],"sourcesContent":["export const LAYOUT_MODES = Object.freeze({\n STACK: 'stack',\n RADIAL: 'radial',\n CLASSIC: 'classic',\n});\n\nexport const DEFAULT_OPTIONS = Object.freeze({\n startIndex: 1,\n layoutMode: LAYOUT_MODES.STACK,\n autoRotate: false,\n autoRotateInterval: 2500,\n preloadRange: 2,\n swipeThreshold: 50,\n dragThreshold: 80,\n enableKeyboard: true,\n enableWheel: true,\n enableTouch: true,\n enableMouse: true,\n showNavigation: true,\n showCounter: true,\n showIndicators: true,\n showAutoRotateButton: true,\n});\n\nexport function validateOptions(options) {\n const validated = { ...DEFAULT_OPTIONS, ...options };\n\n if (validated.startIndex < 0) {\n console.warn('PeekCarousel: startIndex는 0 이상이어야 합니다. 기본값 1 사용');\n validated.startIndex = 1;\n }\n\n if (!Object.values(LAYOUT_MODES).includes(validated.layoutMode)) {\n console.warn(`PeekCarousel: 유효하지 않은 layoutMode \"${validated.layoutMode}\". 기본값 \"stack\" 사용`);\n validated.layoutMode = LAYOUT_MODES.STACK;\n }\n\n if (validated.autoRotateInterval < 100) {\n console.warn('PeekCarousel: autoRotateInterval은 100ms 이상이어야 합니다. 기본값 2500 사용');\n validated.autoRotateInterval = 2500;\n }\n\n if (validated.preloadRange < 0) {\n console.warn('PeekCarousel: preloadRange는 0 이상이어야 합니다. 기본값 2 사용');\n validated.preloadRange = 2;\n }\n\n return validated;\n}\n","export const CLASS_NAMES = Object.freeze({\n carousel: 'peek-carousel',\n track: 'peek-carousel__track',\n item: 'peek-carousel__item',\n itemActive: 'peek-carousel__item--active',\n itemPrev: 'peek-carousel__item--prev',\n itemNext: 'peek-carousel__item--next',\n itemCenter: 'peek-carousel__item--center',\n itemHidden: 'peek-carousel__item--hidden',\n itemDraggingLeft: 'peek-carousel__item--dragging-left',\n itemDraggingRight: 'peek-carousel__item--dragging-right',\n figure: 'peek-carousel__figure',\n image: 'peek-carousel__image',\n caption: 'peek-carousel__caption',\n nav: 'peek-carousel__nav',\n navBtn: 'nav-btn',\n btn: 'peek-carousel__btn',\n prevBtn: 'prev-btn',\n nextBtn: 'next-btn',\n autoRotateBtn: 'auto-rotate-btn',\n btnAutoRotate: 'peek-carousel__btn--auto-rotate',\n btnActive: 'peek-carousel__btn--active',\n controls: 'peek-carousel__controls',\n indicators: 'peek-carousel__indicators',\n indicator: 'indicator',\n indicatorPeek: 'peek-carousel__indicator',\n indicatorActive: 'peek-carousel__indicator--active',\n indicatorProgress: 'peek-carousel__indicator--progress',\n indicatorCompleted: 'peek-carousel__indicator--completed',\n counter: 'peek-carousel__counter',\n counterCurrent: 'peek-carousel__counter-current',\n counterSeparator: 'peek-carousel__counter-separator',\n counterTotal: 'peek-carousel__counter-total',\n playIcon: 'play-icon',\n pauseIcon: 'pause-icon',\n});\n\nexport const SELECTORS = Object.freeze({\n carousel: '.peek-carousel__track',\n item: '.peek-carousel__item',\n indicator: '.indicator',\n prevBtn: '.prev-btn',\n nextBtn: '.next-btn',\n autoRotateBtn: '.auto-rotate-btn',\n playIcon: '.play-icon',\n pauseIcon: '.pause-icon',\n image: 'img',\n});\n\nexport const ARIA = Object.freeze({\n current: 'aria-current',\n selected: 'aria-selected',\n pressed: 'aria-pressed',\n label: 'aria-label',\n tabindex: 'tabindex',\n});\n\nexport const BREAKPOINTS = Object.freeze({\n mobile: 768, // [개발참고] px\n});\n\nexport const DURATIONS = Object.freeze({\n transition: 500, // [개발참고] ms\n progressReset: 10, // [개발참고] ms\n});\n\nexport const KEYS = Object.freeze({\n arrowLeft: 'ArrowLeft',\n arrowRight: 'ArrowRight',\n home: 'Home',\n end: 'End',\n space: ' ',\n});\n","export function getElement(selector) {\n if (typeof selector === 'string') {\n return document.querySelector(selector);\n }\n return selector instanceof HTMLElement ? selector : null;\n}\n\nexport function getElements(selector, parent = document) {\n if (typeof selector !== 'string') return [];\n return Array.from(parent.querySelectorAll(selector));\n}\n\nexport function addClass(element, ...classes) {\n if (element instanceof HTMLElement && classes.length > 0) {\n element.classList.add(...classes);\n }\n}\n\nexport function removeClass(element, ...classes) {\n if (element instanceof HTMLElement && classes.length > 0) {\n element.classList.remove(...classes);\n }\n}\n\nexport function toggleClass(element, className, force) {\n if (element instanceof HTMLElement && className) {\n element.classList.toggle(className, force);\n }\n}\n\nexport function setStyle(element, property, value) {\n if (element instanceof HTMLElement && property) {\n element.style[property] = value;\n }\n}\n\nexport function setCSSVar(element, property, value) {\n if (element instanceof HTMLElement && property) {\n element.style.setProperty(property, value);\n }\n}\n\nexport function setAttribute(element, name, value) {\n if (element instanceof HTMLElement && name) {\n element.setAttribute(name, value);\n }\n}\n\nexport function removeAttribute(element, name) {\n if (element instanceof HTMLElement && name) {\n element.removeAttribute(name);\n }\n}\n","const loadingCache = new Map();\n\nexport function preloadImage(src) {\n return new Promise((resolve, reject) => {\n if (!src) {\n reject(new Error('이미지 소스가 제공되지 않았습니다'));\n return;\n }\n\n if (loadingCache.has(src)) {\n return loadingCache.get(src);\n }\n\n const img = new Image();\n const promise = new Promise((res, rej) => {\n img.onload = () => {\n loadingCache.delete(src);\n res(img);\n };\n img.onerror = () => {\n loadingCache.delete(src);\n rej(new Error(`이미지 로드 실패: ${src}`));\n };\n img.src = src;\n });\n\n loadingCache.set(src, promise);\n promise.then(resolve, reject);\n });\n}\n\nexport function preloadImages(sources) {\n if (!sources || sources.length === 0) {\n return Promise.resolve([]);\n }\n\n const uniqueSources = [...new Set(sources)];\n return Promise.all(uniqueSources.map(src => preloadImage(src)));\n}\n\nexport function preloadImagesInRange(items, currentIndex, range) {\n if (!items || items.length === 0 || range < 0) {\n return;\n }\n\n const totalItems = items.length;\n const imagesToPreload = new Set();\n\n for (let distance = 1; distance <= range; distance++) {\n const prevIndex = (currentIndex - distance + totalItems) % totalItems;\n const nextIndex = (currentIndex + distance) % totalItems;\n\n const prevImg = items[prevIndex]?.querySelector('img');\n const nextImg = items[nextIndex]?.querySelector('img');\n\n if (prevImg && prevImg.src && !prevImg.complete) {\n imagesToPreload.add(prevImg.src);\n }\n if (nextImg && nextImg.src && !nextImg.complete) {\n imagesToPreload.add(nextImg.src);\n }\n }\n\n if (imagesToPreload.size > 0) {\n preloadImages([...imagesToPreload]).catch(err => {\n console.warn('일부 이미지 프리로드 실패:', err);\n });\n }\n}\n","const iconCache = new Map();\n\nfunction createSVGIcon(path, options = {}) {\n const {\n width = 24,\n height = 24,\n viewBox = '0 0 24 24',\n fill = 'none',\n stroke = 'currentColor',\n strokeWidth = 2,\n strokeLinecap = 'round',\n strokeLinejoin = 'round',\n className = '',\n } = options;\n\n const cacheKey = `${path}-${JSON.stringify(options)}`;\n if (iconCache.has(cacheKey)) {\n return iconCache.get(cacheKey);\n }\n\n const svg = `<svg width=\"${width}\" height=\"${height}\" viewBox=\"${viewBox}\" fill=\"${fill}\" xmlns=\"http://www.w3.org/2000/svg\" class=\"${className}\"><path d=\"${path}\" stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\" stroke-linecap=\"${strokeLinecap}\" stroke-linejoin=\"${strokeLinejoin}\"/></svg>`;\n\n iconCache.set(cacheKey, svg);\n return svg;\n}\n\nexport const ICONS = {\n prev: {\n path: 'M15 18L9 12L15 6',\n options: {},\n },\n next: {\n path: 'M9 18L15 12L9 6',\n options: {},\n },\n play: {\n path: 'M8 6.5v11l9-5.5z',\n options: {\n fill: 'currentColor',\n stroke: 'currentColor',\n strokeWidth: 0,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n },\n pause: {\n path: 'M7 5.5C7 5.22386 7.22386 5 7.5 5H9.5C9.77614 5 10 5.22386 10 5.5V18.5C10 18.7761 9.77614 19 9.5 19H7.5C7.22386 19 7 18.7761 7 18.5V5.5ZM14 5.5C14 5.22386 14.2239 5 14.5 5H16.5C16.7761 5 17 5.22386 17 5.5V18.5C17 18.7761 16.7761 19 16.5 19H14.5C14.2239 19 14 18.7761 14 18.5V5.5Z',\n options: {\n fill: 'currentColor',\n stroke: 'none',\n },\n },\n};\n\nexport function getIcon(iconName, customOptions = {}) {\n const icon = ICONS[iconName];\n if (!icon) {\n console.warn(`PeekCarousel: 아이콘 \"${iconName}\"을 찾을 수 없습니다`);\n return '';\n }\n\n const options = { ...icon.options, ...customOptions };\n return createSVGIcon(icon.path, options);\n}\n\nexport function injectIcon(button, iconName, options = {}) {\n if (!button || !(button instanceof HTMLElement)) return;\n\n if (button.querySelector('svg')) {\n return;\n }\n\n const iconHTML = getIcon(iconName, options);\n if (iconHTML) {\n button.innerHTML = iconHTML;\n }\n}\n\nexport function injectAutoRotateIcons(button) {\n if (!button || !(button instanceof HTMLElement)) return;\n\n if (button.querySelector('svg')) {\n return;\n }\n\n const playHTML = getIcon('play', { className: 'play-icon' });\n const pauseHTML = getIcon('pause', { className: 'pause-icon' });\n\n if (playHTML && pauseHTML) {\n button.innerHTML = playHTML + pauseHTML;\n }\n}\n","export function isMobile() {\n return window.innerWidth <= 768;\n}\n\nexport function normalizeIndex(index, length) {\n if (length <= 0) return 0;\n return ((index % length) + length) % length;\n}\n\nexport function clamp(value, min, max) {\n if (min > max) [min, max] = [max, min];\n return Math.min(Math.max(value, min), max);\n}\n\nexport function debounce(func, wait) {\n if (typeof func !== 'function') {\n throw new TypeError('첫 번째 인자는 함수여야 합니다');\n }\n\n let timeout;\n return function executedFunction(...args) {\n const context = this;\n const later = () => {\n clearTimeout(timeout);\n func.apply(context, args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n\nexport function throttle(func, limit) {\n if (typeof func !== 'function') {\n throw new TypeError('첫 번째 인자는 함수여야 합니다');\n }\n\n let inThrottle;\n return function executedFunction(...args) {\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n}\n","import { normalizeIndex } from '../utils/helpers.js';\n\nconst PROXIMITY_THRESHOLD = 2;\n\nexport class Navigator {\n constructor(carousel) {\n this.carousel = carousel;\n }\n\n get currentIndex() {\n return this.carousel.state.currentIndex;\n }\n\n set currentIndex(value) {\n this.carousel.state.currentIndex = normalizeIndex(value, this.carousel.totalItems);\n }\n\n getShortestDistance(from, to) {\n const total = this.carousel.totalItems;\n const normalizedTo = normalizeIndex(to, total);\n const normalizedFrom = normalizeIndex(from, total);\n\n const forwardDist = (normalizedTo - normalizedFrom + total) % total;\n const backwardDist = (normalizedFrom - normalizedTo + total) % total;\n\n return forwardDist <= backwardDist ? forwardDist : -backwardDist;\n }\n\n isNearby(from, to) {\n const distance = Math.abs(this.getShortestDistance(from, to));\n return distance <= PROXIMITY_THRESHOLD;\n }\n\n updateAfterNavigation() {\n this.carousel.animator.updateCarousel();\n this.carousel.updateCounter();\n\n if (this.carousel.options.preloadRange > 0) {\n this.carousel.preloadImages();\n }\n }\n\n rotate(direction) {\n this.currentIndex = this.currentIndex + direction;\n this.updateAfterNavigation();\n }\n\n next() {\n this.rotate(1);\n }\n\n prev() {\n this.rotate(-1);\n }\n\n goTo(index) {\n const normalizedIndex = normalizeIndex(index, this.carousel.totalItems);\n if (normalizedIndex === this.currentIndex) return;\n\n this.currentIndex = normalizedIndex;\n this.updateAfterNavigation();\n }\n\n navigateIfDifferent(targetIndex, callback) {\n const normalizedIndex = normalizeIndex(targetIndex, this.carousel.totalItems);\n if (normalizedIndex === this.currentIndex) return false;\n\n callback(normalizedIndex);\n return true;\n }\n\n handleItemClick(index) {\n this.navigateIfDifferent(index, (normalizedIndex) => {\n const { layoutMode } = this.carousel.options;\n\n if (layoutMode === 'radial') {\n this.handleRadialItemClick(normalizedIndex);\n } else {\n this.handleStackItemClick(normalizedIndex);\n }\n });\n }\n\n handleRadialItemClick(normalizedIndex) {\n const shortestDist = this.getShortestDistance(this.currentIndex, normalizedIndex);\n\n if (Math.abs(shortestDist) > 1) {\n const direction = shortestDist > 0 ? 1 : -1;\n this.rotate(direction);\n } else {\n this.rotate(shortestDist);\n }\n }\n\n handleStackItemClick(normalizedIndex) {\n if (this.isNearby(this.currentIndex, normalizedIndex)) {\n const shortestDist = this.getShortestDistance(this.currentIndex, normalizedIndex);\n this.rotate(shortestDist);\n } else {\n this.goTo(normalizedIndex);\n }\n }\n\n handleIndicatorClick(index) {\n this.navigateIfDifferent(index, (normalizedIndex) => {\n const { layoutMode } = this.carousel.options;\n\n if (layoutMode === 'radial') {\n const shortestDist = this.getShortestDistance(this.currentIndex, normalizedIndex);\n this.rotate(shortestDist);\n } else {\n this.goTo(normalizedIndex);\n }\n });\n }\n}\n","import { normalizeIndex } from '../utils/helpers.js';\nimport { CLASS_NAMES } from '../core/constants.js';\n\nconst RADIAL_RADIUS = 400;\n\nconst CLASSIC_POSITIONS = Object.freeze({\n center: { x: 50, scale: 1 },\n peek: { scale: 1 },\n hidden: { scale: 0.85 },\n});\n\nconst CLASSIC_SPACING = Object.freeze({\n gapPercent: 5,\n additionalMobile: 40,\n additionalDesktop: 15,\n mobileBreakpoint: 768,\n});\n\nconst MOMENTUM_CONFIG = Object.freeze({\n friction: 0.92,\n minVelocity: 0.05,\n navigationThreshold: 1.5,\n dampingFactor: 0.6,\n});\n\nconst STACK_POSITION_CLASSES = [\n CLASS_NAMES.itemCenter,\n CLASS_NAMES.itemPrev,\n CLASS_NAMES.itemNext,\n CLASS_NAMES.itemHidden,\n];\n\nexport class Animator {\n constructor(carousel) {\n this.carousel = carousel;\n this.momentumAnimation = null;\n this.isAnimating = false;\n }\n\n normalizeAngleDiff(diff) {\n return ((diff + 180) % 360) - 180;\n }\n\n round(value, decimals = 2) {\n return Math.round(value * 10 ** decimals) / 10 ** decimals;\n }\n\n getAdjacentIndices(currentIndex) {\n return {\n prev: normalizeIndex(currentIndex - 1, this.carousel.totalItems),\n next: normalizeIndex(currentIndex + 1, this.carousel.totalItems),\n };\n }\n\n setCarouselRotation(angle) {\n const rounded = this.round(angle, 2);\n this.carousel.container.style.setProperty('--carousel-rotation', `${rounded}deg`);\n }\n\n setCSSVariables(element, variables) {\n for (const [key, value] of Object.entries(variables)) {\n element.style.setProperty(key, value);\n }\n }\n\n updateRadialRotation(currentIndex) {\n const targetAngle = -this.carousel.state.angleUnit * currentIndex;\n const currentRotation = this.carousel.container.style.getPropertyValue('--carousel-rotation');\n\n if (!currentRotation || currentRotation === '0deg') {\n this.setCarouselRotation(targetAngle);\n return;\n }\n\n // [개발참고] 최단 경로 계산: -180 ~ 180 범위로 정규화\n const currentAngle = parseFloat(currentRotation);\n const diff = this.normalizeAngleDiff(targetAngle - currentAngle);\n const finalAngle = currentAngle + diff;\n this.setCarouselRotation(finalAngle);\n }\n\n updateCarousel() {\n const { currentIndex } = this.carousel.state;\n const { layoutMode } = this.carousel.options;\n\n if (layoutMode === 'stack' || layoutMode === 'classic') {\n this.setCarouselRotation(0);\n } else if (layoutMode === 'radial') {\n this.updateRadialRotation(currentIndex);\n }\n\n this.updateActiveItem();\n }\n\n updateActiveItem() {\n const { currentIndex } = this.carousel.state;\n const { layoutMode } = this.carousel.options;\n\n this.carousel.ui.updateActiveStates(currentIndex);\n\n if (layoutMode === 'radial') {\n this.updateRadialPositions(currentIndex);\n } else if (layoutMode === 'classic') {\n this.updateClassicPositions(currentIndex);\n } else {\n this.updateStackPositions(currentIndex);\n }\n }\n\n updateRadialPositions(currentIndex) {\n const { angleUnit } = this.carousel.state;\n\n for (let i = 0; i < this.carousel.items.length; i++) {\n const item = this.carousel.items[i];\n const angle = angleUnit * i;\n\n this.setCSSVariables(item, {\n '--item-angle': `${this.round(angle, 2)}deg`,\n '--item-radius': `${RADIAL_RADIUS}px`,\n });\n }\n\n const { prev, next } = this.getAdjacentIndices(currentIndex);\n this.carousel.ui.setPeekItems(prev, next);\n }\n\n updateStackPositions(currentIndex) {\n const { prev, next } = this.getAdjacentIndices(currentIndex);\n\n for (let i = 0; i < this.carousel.items.length; i++) {\n const item = this.carousel.items[i];\n\n item.classList.remove(...STACK_POSITION_CLASSES);\n\n if (i === currentIndex) {\n item.classList.add(CLASS_NAMES.itemCenter);\n } else if (i === prev) {\n item.classList.add(CLASS_NAMES.itemPrev);\n } else if (i === next) {\n item.classList.add(CLASS_NAMES.itemNext);\n } else {\n item.classList.add(CLASS_NAMES.itemHidden);\n }\n }\n }\n\n calculateClassicSpacing(containerWidth) {\n const itemWidth = Math.max(300, Math.min(containerWidth * 0.35, 500));\n const isMobile = containerWidth <= CLASSIC_SPACING.mobileBreakpoint;\n\n const itemHalfPercent = (itemWidth / containerWidth) * 50;\n const baseSpacing = itemHalfPercent + CLASSIC_SPACING.gapPercent;\n const additionalSpacing = isMobile\n ? CLASSIC_SPACING.additionalMobile\n : CLASSIC_SPACING.additionalDesktop;\n\n return baseSpacing + additionalSpacing;\n }\n\n getClassicItemPosition(itemIndex, currentIndex, itemSpacing) {\n const { prev, next } = this.getAdjacentIndices(currentIndex);\n\n if (itemIndex === currentIndex) {\n return {\n x: CLASSIC_POSITIONS.center.x,\n scale: CLASSIC_POSITIONS.center.scale,\n };\n }\n\n if (itemIndex === prev) {\n return {\n x: CLASSIC_POSITIONS.center.x - itemSpacing,\n scale: CLASSIC_POSITIONS.peek.scale,\n };\n }\n\n if (itemIndex === next) {\n return {\n x: CLASSIC_POSITIONS.center.x + itemSpacing,\n scale: CLASSIC_POSITIONS.peek.scale,\n };\n }\n\n const distanceFromCurrent = itemIndex - currentIndex;\n return {\n x: distanceFromCurrent < 0\n ? CLASSIC_POSITIONS.center.x - itemSpacing * 2\n : CLASSIC_POSITIONS.center.x + itemSpacing * 2,\n scale: CLASSIC_POSITIONS.hidden.scale,\n };\n }\n\n updateClassicPositions(currentIndex) {\n const { prev, next } = this.getAdjacentIndices(currentIndex);\n const containerWidth = this.carousel.container.offsetWidth;\n const itemSpacing = this.calculateClassicSpacing(containerWidth);\n\n for (let i = 0; i < this.carousel.items.length; i++) {\n const item = this.carousel.items[i];\n const { x, scale } = this.getClassicItemPosition(i, currentIndex, itemSpacing);\n\n this.setCSSVariables(item, {\n '--item-x': `${this.round(x, 2)}%`,\n '--item-scale': String(scale),\n });\n }\n\n this.carousel.ui.setPeekItems(prev, next);\n }\n\n startMomentum(velocity) {\n this.stopMomentum();\n\n let currentVelocity = velocity;\n\n const momentumStep = () => {\n currentVelocity *= MOMENTUM_CONFIG.friction;\n\n if (Math.abs(currentVelocity) < MOMENTUM_CONFIG.minVelocity) {\n this.stopMomentum();\n return;\n }\n\n if (Math.abs(currentVelocity) > MOMENTUM_CONFIG.navigationThreshold) {\n const direction = currentVelocity > 0 ? -1 : 1;\n this.carousel.navigator.rotate(direction);\n currentVelocity *= MOMENTUM_CONFIG.dampingFactor;\n }\n\n this.momentumAnimation = requestAnimationFrame(momentumStep);\n };\n\n this.isAnimating = true;\n this.momentumAnimation = requestAnimationFrame(momentumStep);\n }\n\n stopMomentum() {\n if (this.momentumAnimation) {\n cancelAnimationFrame(this.momentumAnimation);\n this.momentumAnimation = null;\n }\n this.isAnimating = false;\n }\n}\n","export class AutoRotate {\n constructor(carousel) {\n this.carousel = carousel;\n this.interval = null;\n this.isActive = false;\n }\n\n setActiveState(isActive) {\n this.isActive = isActive;\n this.carousel.ui.updateAutoRotateButton(isActive);\n }\n\n toggle() {\n this.isActive ? this.stop() : this.start();\n }\n\n start() {\n if (this.isActive) return;\n\n this.setActiveState(true);\n\n const rotateInterval = this.carousel.options.autoRotateInterval;\n this.interval = setInterval(() => {\n this.carousel.navigator.next();\n }, rotateInterval);\n }\n\n stop() {\n if (!this.isActive) return;\n\n this.setActiveState(false);\n\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n }\n\n destroy() {\n this.stop();\n this.carousel = null;\n }\n}\n","import { KEYS, BREAKPOINTS } from '../core/constants.js';\nimport { isMobile } from '../utils/helpers.js';\n\nconst WHEEL_CONFIG = Object.freeze({\n threshold: 50,\n timeout: 150,\n cooldown: 100,\n});\n\nconst DRAG_CONFIG = Object.freeze({\n touchThreshold: 15,\n mouseThreshold: 10,\n velocityThreshold: 0.5,\n});\n\nconst RESIZE_DEBOUNCE = 100;\n\nexport class EventHandler {\n constructor(carousel) {\n this.carousel = carousel;\n this.boundHandlers = new Map();\n\n this.touch = {\n startX: 0,\n endX: 0,\n };\n\n this.drag = {\n active: false,\n startX: 0,\n currentX: 0,\n lastX: 0,\n lastTime: 0,\n velocity: 0,\n };\n\n this.wheel = {\n isScrolling: false,\n scrollTimeout: null,\n lastWheelTime: 0,\n accumulatedDelta: 0,\n };\n }\n\n init() {\n this.initNavigationButtons();\n this.initKeyboard();\n this.initWheel();\n this.initItemClick();\n this.initIndicatorClick();\n this.initTouch();\n this.initMouse();\n this.initResize();\n }\n\n stopAutoRotateAndNavigate(navigationFn) {\n this.completeCurrentIndicator();\n this.carousel.autoRotate.stop();\n navigationFn();\n }\n\n completeCurrentIndicator() {\n const currentIndicator = this.carousel.indicators[this.carousel.state.currentIndex];\n if (currentIndicator && currentIndicator.classList.contains('peek-carousel__indicator--active')) {\n currentIndicator.classList.add('peek-carousel__indicator--completed');\n }\n }\n\n resetDragState(index) {\n this.carousel.ui.removeDraggingClass(index);\n this.carousel.ui.clearDragTransform();\n }\n\n updateDraggingClass(dragDistance, currentIndex, threshold) {\n if (dragDistance > threshold) {\n this.carousel.ui.addDraggingClass(currentIndex, 'right');\n } else if (dragDistance < -threshold) {\n this.carousel.ui.addDraggingClass(currentIndex, 'left');\n }\n }\n\n initDragState(clientX) {\n this.drag.active = true;\n this.drag.startX = clientX;\n this.drag.currentX = clientX;\n this.drag.lastX = clientX;\n this.drag.lastTime = Date.now();\n this.drag.velocity = 0;\n }\n\n resetMouseCursor() {\n this.carousel.elements.carousel.style.cursor = 'grab';\n }\n\n calculateWheelDelta(e) {\n const deltaX = Math.abs(e.deltaX);\n const deltaY = Math.abs(e.deltaY);\n const isHorizontal = deltaX > deltaY;\n\n // [개발참고] 수평: 왼쪽(-) = 다음, 오른쪽(+) = 이전\n // 수직: 아래(+) = 다음, 위(-) = 이전\n return isHorizontal ? -e.deltaX : e.deltaY;\n }\n\n resetWheelState() {\n this.wheel.isScrolling = false;\n this.wheel.accumulatedDelta = 0;\n }\n\n initNavigationButtons() {\n const { prevBtn, nextBtn, autoRotateBtn } = this.carousel.elements;\n\n if (prevBtn) {\n this.addHandler(prevBtn, 'click', () => {\n this.stopAutoRotateAndNavigate(() => this.carousel.navigator.prev());\n });\n }\n\n if (nextBtn) {\n this.addHandler(nextBtn, 'click', () => {\n this.stopAutoRotateAndNavigate(() => this.carousel.navigator.next());\n });\n }\n\n if (autoRotateBtn) {\n this.addHandler(autoRotateBtn, 'click', () => {\n this.carousel.autoRotate.toggle();\n });\n }\n }\n\n initKeyboard() {\n if (!this.carousel.options.enableKeyboard) return;\n\n const handler = (e) => {\n const { navigator, autoRotate, totalItems } = this.carousel;\n\n switch (e.key) {\n case KEYS.arrowLeft:\n autoRotate.stop();\n navigator.prev();\n break;\n\n case KEYS.arrowRight:\n autoRotate.stop();\n navigator.next();\n break;\n\n case KEYS.home:\n e.preventDefault();\n autoRotate.stop();\n navigator.goTo(0);\n break;\n\n case KEYS.end:\n e.preventDefault();\n autoRotate.stop();\n navigator.goTo(totalItems - 1);\n break;\n\n case KEYS.space:\n e.preventDefault();\n autoRotate.toggle();\n break;\n\n default:\n const numKey = parseInt(e.key);\n if (numKey >= 1 && numKey <= totalItems) {\n e.preventDefault();\n autoRotate.stop();\n navigator.goTo(numKey - 1);\n }\n }\n };\n\n this.addHandler(document, 'keydown', handler);\n }\n\n initWheel() {\n if (!this.carousel.options.enableWheel) return;\n\n const handler = (e) => {\n const deltaX = Math.abs(e.deltaX);\n const deltaY = Math.abs(e.deltaY);\n\n if (deltaX < 1 && deltaY < 1) {\n return;\n }\n\n if (deltaX === deltaY) {\n return;\n }\n\n e.preventDefault();\n\n const currentTime = Date.now();\n\n if (currentTime - this.wheel.lastWheelTime < WHEEL_CONFIG.cooldown) {\n return;\n }\n\n if (!this.wheel.isScrolling) {\n this.wheel.isScrolling = true;\n this.wheel.accumulatedDelta = 0;\n this.carousel.autoRotate.stop();\n this.carousel.animator.stopMomentum();\n }\n\n this.wheel.accumulatedDelta += this.calculateWheelDelta(e);\n\n if (Math.abs(this.wheel.accumulatedDelta) >= WHEEL_CONFIG.threshold) {\n const direction = this.wheel.accumulatedDelta > 0 ? 1 : -1;\n this.carousel.navigator.rotate(direction);\n\n this.wheel.accumulatedDelta = 0;\n this.wheel.lastWheelTime = currentTime;\n }\n\n clearTimeout(this.wheel.scrollTimeout);\n this.wheel.scrollTimeout = setTimeout(() => {\n this.resetWheelState();\n }, WHEEL_CONFIG.timeout);\n };\n\n this.addHandler(\n this.carousel.elements.carousel,\n 'wheel',\n handler,\n { passive: false }\n );\n }\n\n initItemClick() {\n const { items } = this.carousel;\n for (let i = 0; i < items.length; i++) {\n this.addHandler(items[i], 'click', () => {\n this.carousel.autoRotate.stop();\n this.carousel.navigator.handleItemClick(i);\n });\n }\n }\n\n initIndicatorClick() {\n const { indicators } = this.carousel;\n for (let i = 0; i < indicators.length; i++) {\n this.addHandler(indicators[i], 'click', () => {\n this.carousel.autoRotate.stop();\n this.carousel.navigator.handleIndicatorClick(i);\n });\n }\n }\n\n initTouch() {\n if (!this.carousel.options.enableTouch) return;\n\n this.addHandler(this.carousel.elements.carousel, 'touchstart', (e) => {\n this.touch.startX = e.changedTouches[0].screenX;\n });\n\n this.addHandler(this.carousel.elements.carousel, 'touchmove', (e) => {\n const touchCurrentX = e.changedTouches[0].screenX;\n const dragDistance = touchCurrentX - this.touch.startX;\n const { currentIndex } = this.carousel.state;\n\n this.carousel.ui.updateDragTransform(dragDistance);\n this.updateDraggingClass(dragDistance, currentIndex, DRAG_CONFIG.touchThreshold);\n });\n\n this.addHandler(this.carousel.elements.carousel, 'touchend', (e) => {\n this.touch.endX = e.changedTouches[0].screenX;\n const swipeDistance = this.touch.endX - this.touch.startX;\n const { swipeThreshold } = this.carousel.options;\n const { currentIndex } = this.carousel.state;\n\n this.resetDragState(currentIndex);\n\n if (swipeDistance < -swipeThreshold) {\n this.carousel.autoRotate.stop();\n this.carousel.navigator.next();\n } else if (swipeDistance > swipeThreshold) {\n this.carousel.autoRotate.stop();\n this.carousel.navigator.prev();\n }\n });\n }\n\n initMouse() {\n if (!this.carousel.options.enableMouse) return;\n\n this.addHandler(this.carousel.elements.carousel, 'mousedown', (e) => {\n if (isMobile()) return;\n\n this.initDragState(e.clientX);\n this.carousel.autoRotate.stop();\n this.carousel.animator.stopMomentum();\n this.carousel.elements.carousel.style.cursor = 'grabbing';\n e.preventDefault();\n });\n\n this.addHandler(document, 'mousemove', (e) => {\n if (!this.drag.active) return;\n\n const currentTime = Date.now();\n const deltaTime = currentTime - this.drag.lastTime;\n const deltaX = e.clientX - this.drag.lastX;\n\n if (deltaTime > 0) {\n this.drag.velocity = deltaX / deltaTime;\n }\n\n this.drag.currentX = e.clientX;\n this.drag.lastX = e.clientX;\n this.drag.lastTime = currentTime;\n\n const dragDistance = this.drag.currentX - this.drag.startX;\n const { currentIndex } = this.carousel.state;\n\n this.carousel.ui.updateDragTransform(dragDistance);\n this.updateDraggingClass(dragDistance, currentIndex, DRAG_CONFIG.mouseThreshold);\n\n if (Math.abs(dragDistance) > this.carousel.options.dragThreshold) {\n const direction = dragDistance > 0 ? -1 : 1;\n this.carousel.navigator.rotate(direction);\n this.drag.startX = this.drag.currentX;\n this.resetDragState(currentIndex);\n }\n });\n\n this.addHandler(document, 'mouseup', () => {\n if (!this.drag.active) return;\n\n this.drag.active = false;\n this.resetMouseCursor();\n\n const { currentIndex } = this.carousel.state;\n this.resetDragState(currentIndex);\n\n if (Math.abs(this.drag.velocity) > DRAG_CONFIG.velocityThreshold) {\n this.carousel.animator.startMomentum(this.drag.velocity);\n }\n });\n\n this.addHandler(this.carousel.elements.carousel, 'mouseleave', () => {\n if (this.drag.active) {\n this.drag.active = false;\n this.resetMouseCursor();\n\n const { currentIndex } = this.carousel.state;\n this.resetDragState(currentIndex);\n }\n });\n\n if (window.innerWidth > BREAKPOINTS.mobile) {\n this.resetMouseCursor();\n }\n }\n\n initResize() {\n let resizeTimer;\n const handler = () => {\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(() => {\n this.carousel.animator.updateCarousel();\n }, RESIZE_DEBOUNCE);\n };\n\n this.addHandler(window, 'resize', handler);\n }\n\n addHandler(element, event, handler, options) {\n element.addEventListener(event, handler, options);\n\n const key = `${event}-${Date.now()}-${Math.random()}`;\n this.boundHandlers.set(key, { element, event, handler, options });\n }\n\n destroy() {\n if (this.wheel.scrollTimeout) {\n clearTimeout(this.wheel.scrollTimeout);\n this.wheel.scrollTimeout = null;\n }\n\n for (const { element, event, handler, options } of this.boundHandlers.values()) {\n element.removeEventListener(event, handler, options);\n }\n this.boundHandlers.clear();\n\n this.carousel = null;\n }\n}\n","import { CLASS_NAMES, ARIA, DURATIONS } from '../core/constants.js';\nimport { addClass, removeClass, setAttribute, setCSSVar } from '../utils/dom.js';\n\nconst DRAG_TRANSFORM_CONFIG = Object.freeze({\n stack: {\n maxDrag: 200,\n offsetMultiplier: 100,\n rotationMultiplier: 3,\n },\n radial: {\n rotationSensitivity: 0.2,\n },\n classic: {\n dragSensitivity: 0.5,\n },\n});\n\nexport class UIManager {\n constructor(carousel) {\n this.carousel = carousel;\n }\n\n updateActiveStates(currentIndex) {\n for (let i = 0; i < this.carousel.items.length; i++) {\n const item = this.carousel.items[i];\n removeClass(item, CLASS_NAMES.itemActive, CLASS_NAMES.itemPrev, CLASS_NAMES.itemNext);\n item.removeAttribute(ARIA.current);\n }\n\n for (let i = 0; i < this.carousel.indicators.length; i++) {\n const indicator = this.carousel.indicators[i];\n removeClass(\n indicator,\n CLASS_NAMES.indicatorActive,\n CLASS_NAMES.indicatorProgress\n );\n setAttribute(indicator, ARIA.selected, 'false');\n setAttribute(indicator, ARIA.tabindex, '-1');\n }\n\n const currentItem = this.carousel.items[currentIndex];\n const currentIndicator = this.carousel.indicators[currentIndex];\n\n if (currentItem) {\n addClass(currentItem, CLASS_NAMES.itemActive);\n setAttribute(currentItem, ARIA.current, 'true');\n }\n\n if (currentIndicator) {\n removeClass(currentIndicator, CLASS_NAMES.indicatorCompleted);\n addClass(currentIndicator, CLASS_NAMES.indicatorActive);\n setAttribute(currentIndicator, ARIA.selected, 'true');\n setAttribute(currentIndicator, ARIA.tabindex, '0');\n\n if (this.carousel.autoRotate.isActive) {\n this.updateIndicatorProgress(currentIndicator);\n }\n }\n }\n\n updateIndicatorProgress(indicator) {\n setCSSVar(\n indicator,\n '--progress-duration',\n `${this.carousel.options.autoRotateInterval}ms`\n );\n\n setTimeout(() => {\n if (indicator) {\n addClass(indicator, CLASS_NAMES.indicatorProgress);\n }\n }, DURATIONS.progressReset);\n }\n\n clearPeekItems() {\n for (let i = 0; i < this.carousel.items.length; i++) {\n const item = this.carousel.items[i];\n removeClass(item, CLASS_NAMES.itemPrev, CLASS_NAMES.itemNext);\n }\n }\n\n setPeekItems(prevIndex, nextIndex) {\n const prevItem = this.carousel.items[prevIndex];\n const nextItem = this.carousel.items[nextIndex];\n\n if (prevItem) addClass(prevItem, CLASS_NAMES.itemPrev);\n if (nextItem) addClass(nextItem, CLASS_NAMES.itemNext);\n }\n\n updateAutoRotateButton(isActive) {\n const { autoRotateBtn } = this.carousel.elements;\n if (!autoRotateBtn) return;\n\n if (isActive) {\n addClass(autoRotateBtn, CLASS_NAMES.btnActive);\n setAttribute(autoRotateBtn, ARIA.pressed, 'true');\n } else {\n removeClass(autoRotateBtn, CLASS_NAMES.btnActive);\n setAttribute(autoRotateBtn, ARIA.pressed, 'false');\n }\n }\n\n addDraggingClass(index, direction) {\n const item = this.carousel.items[index];\n if (!item) return;\n\n const leftClass = CLASS_NAMES.itemDraggingLeft;\n const rightClass = CLASS_NAMES.itemDraggingRight;\n\n removeClass(item, leftClass, rightClass);\n\n if (direction === 'left') {\n addClass(item, leftClass);\n } else if (direction === 'right') {\n addClass(item, rightClass);\n }\n }\n\n removeDraggingClass(index) {\n const item = this.carousel.items[index];\n if (!item) return;\n\n removeClass(item, CLASS_NAMES.itemDraggingLeft, CLASS_NAMES.itemDraggingRight);\n }\n\n round(value, decimals = 2) {\n return Math.round(value * 10 ** decimals) / 10 ** decimals;\n }\n\n applyEasing(progress) {\n return progress * (2 - Math.abs(progress));\n }\n\n updateDragTransform(dragDistance) {\n const { layoutMode } = this.carousel.options;\n\n if (layoutMode === 'stack') {\n // [개발참고] Stack 모드: 탄성 효과 적용 (easeOutQuad)\n const config = DRAG_TRANSFORM_CONFIG.stack;\n const clampedDrag = Math.max(-config.maxDrag, Math.min(config.maxDrag, dragDistance));\n const progress = clampedDrag / config.maxDrag;\n const easedProgress = this.applyEasing(progress);\n\n const dragOffset = this.round(easedProgress * config.offsetMultiplier);\n const dragRotation = this.round(easedProgress * config.rotationMultiplier);\n\n this.carousel.container.style.setProperty('--drag-offset', `${dragOffset}px`);\n this.carousel.container.style.setProperty('--drag-rotation', `${dragRotation}deg`);\n } else if (layoutMode === 'radial') {\n const config = DRAG_TRANSFORM_CONFIG.radial;\n const dragRotation = this.round(dragDistance * config.rotationSensitivity);\n\n this.carousel.container.style.setProperty('--drag-rotation-y', `${dragRotation}deg`);\n } else if (layoutMode === 'classic') {\n const config = DRAG_TRANSFORM_CONFIG.classic;\n const dragOffset = this.round(dragDistance * config.dragSensitivity);\n\n this.carousel.container.style.setProperty('--drag-offset', `${dragOffset}px`);\n }\n }\n\n clearDragTransform() {\n this.carousel.container.style.setProperty('--drag-offset', '0px');\n this.carousel.container.style.setProperty('--drag-rotation', '0deg');\n this.carousel.container.style.setProperty('--drag-rotation-y', '0deg');\n }\n\n destroy() {\n }\n}\n","import { validateOptions } from './config.js';\nimport { SELECTORS, CLASS_NAMES } from './constants.js';\nimport { getElement, getElements } from '../utils/dom.js';\nimport { preloadImagesInRange } from '../utils/preloader.js';\nimport { injectIcon, injectAutoRotateIcons } from '../utils/icons.js';\nimport { Navigator } from '../modules/Navigator.js';\nimport { Animator } from '../modules/Animator.js';\nimport { AutoRotate } from '../modules/AutoRotate.js';\nimport { EventHandler } from '../modules/EventHandler.js';\nimport { UIManager } from '../modules/UIManager.js';\n\nconst FULL_CIRCLE_DEGREES = 360;\n\nclass PeekCarousel {\n constructor(selector, options = {}) {\n this.container = getElement(selector);\n if (!this.container) {\n throw new Error(`PeekCarousel: 셀렉터 \"${selector}\"에 해당하는 컨테이너를 찾을 수 없습니다`);\n }\n\n this.options = validateOptions(options);\n this.initElements();\n\n if (this.items.length === 0) {\n throw new Error('PeekCarousel: 캐러셀 아이템을 찾을 수 없습니다');\n }\n\n this.state = {\n currentIndex: this.options.startIndex,\n angleUnit: FULL_CIRCLE_DEGREES / this.totalItems,\n };\n\n this.initModules();\n this.init();\n }\n\n initElements() {\n this.elements = {\n carousel: this.container.querySelector(SELECTORS.carousel),\n prevBtn: null,\n nextBtn: null,\n autoRotateBtn: null,\n controls: null,\n nav: null,\n };\n\n this.items = getElements(SELECTORS.item, this.container);\n this.totalItems = this.items.length;\n this.indicators = [];\n }\n\n initModules() {\n this.navigator = new Navigator(this);\n this.animator = new Animator(this);\n this.autoRotate = new AutoRotate(this);\n this.eventHandler = new EventHandler(this);\n this.ui = new UIManager(this);\n }\n\n init() {\n this.updateLayoutClass();\n this.createNavigation();\n this.createControls();\n this.injectIcons();\n this.createCounter();\n this.setImageLoadingAttributes();\n this.initCSSVariables();\n\n this.eventHandler.init();\n this.animator.updateCarousel();\n\n if (this.options.autoRotate) {\n this.autoRotate.start();\n }\n\n if (this.options.preloadRange > 0) {\n this.preloadImages();\n }\n }\n\n initCSSVariables() {\n this.container.style.setProperty('--carousel-rotation', '0deg');\n this.container.style.setProperty('--drag-offset', '0px');\n this.container.style.setProperty('--drag-rotation', '0deg');\n this.container.style.setProperty('--drag-rotation-y', '0deg');\n }\n\n createNavigation() {\n if (!this.options.showNavigation) return;\n\n const existingNav = this.container.querySelector(`.${CLASS_NAMES.nav}`);\n if (existingNav) {\n this.elements.nav = existingNav;\n this.elements.prevBtn = existingNav.querySelector(SELECTORS.prevBtn);\n this.elements.nextBtn = existingNav.querySelector(SELECTORS.nextBtn);\n return;\n }\n\n const nav = document.createElement('div');\n nav.className = CLASS_NAMES.nav;\n\n const prevBtn = document.createElement('button');\n prevBtn.className = `${CLASS_NAMES.navBtn} ${CLASS_NAMES.btn} ${CLASS_NAMES.prevBtn}`;\n prevBtn.setAttribute('aria-label', 'Previous');\n\n const nextBtn = document.createElement('button');\n nextBtn.className = `${CLASS_NAMES.navBtn} ${CLASS_NAMES.btn} ${CLASS_NAMES.nextBtn}`;\n nextBtn.setAttribute('aria-label', 'Next');\n\n nav.appendChild(prevBtn);\n nav.appendChild(nextBtn);\n this.container.appendChild(nav);\n\n this.elements.nav = nav;\n this.elements.prevBtn = prevBtn;\n this.elements.nextBtn = nextBtn;\n }\n\n createControls() {\n if (!this.options.showIndicators && !this.options.showAutoRotateButton) return;\n\n const existingControls = this.container.querySelector(`.${CLASS_NAMES.controls}`);\n if (existingControls) {\n this.elements.controls = existingControls;\n const indicatorsWrapper = existingControls.querySelector(`.${CLASS_NAMES.indicators}`);\n if (indicatorsWrapper && this.options.showIndicators) {\n indicatorsWrapper.innerHTML = '';\n this.createIndicators(indicatorsWrapper);\n }\n this.elements.autoRotateBtn = existingControls.querySelector(SELECTORS.autoRotateBtn);\n return;\n }\n\n const controls = document.createElement('div');\n controls.className = CLASS_NAMES.controls;\n\n if (this.options.showIndicators) {\n const indicatorsWrapper = document.createElement('div');\n indicatorsWrapper.className = CLASS_NAMES.indicators;\n this.createIndicators(indicatorsWrapper);\n controls.appendChild(indicatorsWrapper);\n }\n\n if (this.options.showAutoRotateButton) {\n const autoRotateBtn = document.createElement('button');\n autoRotateBtn.className = `${CLASS_NAMES.autoRotateBtn} ${CLASS_NAMES.btn} ${CLASS_NAMES.btnAutoRotate}`;\n autoRotateBtn.setAttribute('aria-label', 'Toggle auto-rotate');\n autoRotateBtn.setAttribute('aria-pressed', 'false');\n controls.appendChild(autoRotateBtn);\n this.elements.autoRotateBtn = autoRotateBtn;\n }\n\n this.container.appendChild(controls);\n this.elements.controls = controls;\n }\n\n createIndicators(wrapper) {\n this.indicators = [];\n\n for (let i = 0; i < this.totalItems; i++) {\n const indicator = document.createElement('button');\n const isActive = i === this.state.currentIndex;\n\n indicator.className = CLASS_NAMES.indicator;\n indicator.classList.add(CLASS_NAMES.indicatorPeek);\n indicator.setAttribute('role', 'tab');\n indicator.setAttribute('aria-label', `Image ${i + 1}`);\n indicator.setAttribute('aria-selected', isActive ? 'true' : 'false');\n indicator.setAttribute('tabindex', isActive ? '0' : '-1');\n\n if (isActive) {\n indicator.classList.add(CLASS_NAMES.indicatorActive);\n }\n\n wrapper.appendChild(indicator);\n this.indicators.push(indicator);\n }\n }\n\n injectIcons() {\n const { prevBtn, nextBtn, autoRotateBtn } = this.elements;\n\n if (prevBtn) injectIcon(prevBtn, 'prev');\n if (nextBtn) injectIcon(nextBtn, 'next');\n if (autoRotateBtn) injectAutoRotateIcons(autoRotateBtn);\n }\n\n createCounter() {\n if (!this.options.showCounter) return;\n\n const existingCounter = this.container.querySelector(`.${CLASS_NAMES.counter}`);\n if (existingCounter) {\n this.counterElement = existingCounter;\n this.updateCounter();\n return;\n }\n\n const counter = document.createElement('div');\n counter.className = CLASS_NAMES.counter;\n counter.setAttribute('aria-live', 'polite');\n counter.setAttribute('aria-atomic', 'true');\n\n counter.innerHTML = `\n <span class=\"${CLASS_NAMES.counterCurrent}\">${this.state.currentIndex + 1}</span>\n <span class=\"${CLASS_NAMES.counterSeparator}\">/</span>\n <span class=\"${CLASS_NAMES.counterTotal}\">${this.totalItems}</span>\n `;\n\n this.container.appendChild(counter);\n this.counterElement = counter;\n }\n\n updateCounter() {\n if (!this.counterElement) return;\n\n const currentSpan = this.counterElement.querySelector(`.${CLASS_NAMES.counterCurrent}`);\n if (currentSpan) {\n currentSpan.textContent = this.state.currentIndex + 1;\n }\n }\n\n setImageLoadingAttributes() {\n const { startIndex } = this.options;\n const preloadRange = this.options.preloadRange || 1;\n\n for (let index = 0; index < this.items.length; index++) {\n const item = this.items[index];\n const img = item.querySelector(`.${CLASS_NAMES.image}`);\n if (!img || img.hasAttribute('loading')) continue;\n\n const distance = Math.abs(index - startIndex);\n const isNearby = distance <= preloadRange;\n img.setAttribute('loading', isNearby ? 'eager' : 'lazy');\n }\n }\n\n updateLayoutClass() {\n const currentMode = this.currentLayoutMode;\n const newMode = this.options.layoutMode;\n\n if (currentMode && currentMode !== newMode) {\n this.container.classList.remove(`peek-carousel--${currentMode}`);\n }\n\n this.container.classList.add(`peek-carousel--${newMode}`);\n this.currentLayoutMode = newMode;\n }\n\n preloadImages() {\n preloadImagesInRange(this.items, this.state.currentIndex, this.options.preloadRange);\n }\n\n // [개발참고] Public API\n next() {\n this.navigator.next();\n }\n\n prev() {\n this.navigator.prev();\n }\n\n goTo(index) {\n this.navigator.goTo(index);\n }\n\n startAutoRotate() {\n this.autoRotate.start();\n }\n\n stopAutoRotate() {\n this.autoRotate.stop();\n }\n\n toggleAutoRotate() {\n this.autoRotate.toggle();\n }\n\n destroy() {\n this.autoRotate.destroy();\n this.animator.stopMomentum();\n this.eventHandler.destroy();\n this.ui.destroy();\n }\n\n get currentIndex() {\n return this.state.currentIndex;\n }\n\n get isAutoRotating() {\n return this.autoRotate.isActive;\n }\n}\n\nexport default PeekCarousel;\n"],"names":["LAYOUT_MODES","Object","freeze","STACK","RADIAL","CLASSIC","DEFAULT_OPTIONS","startIndex","layoutMode","autoRotate","autoRotateInterval","preloadRange","swipeThreshold","dragThreshold","enableKeyboard","enableWheel","enableTouch","enableMouse","showNavigation","showCounter","showIndicators","showAutoRotateButton","validateOptions","options","validated","console","warn","values","includes","CLASS_NAMES","carousel","track","item","itemActive","itemPrev","itemNext","itemCenter","itemHidden","itemDraggingLeft","itemDraggingRight","figure","image","caption","nav","navBtn","btn","prevBtn","nextBtn","autoRotateBtn","btnAutoRotate","btnActive","controls","indicators","indicator","indicatorPeek","indicatorActive","indicatorProgress","indicatorCompleted","counter","counterCurrent","counterSeparator","counterTotal","playIcon","pauseIcon","SELECTORS","ARIA","current","selected","pressed","label","tabindex","BREAKPOINTS","mobile","DURATIONS","transition","progressReset","KEYS","arrowLeft","arrowRight","home","end","space","getElement","selector","document","querySelector","HTMLElement","getElements","parent","Array","from","querySelectorAll","addClass","element","classes","length","classList","add","removeClass","remove","setCSSVar","property","value","style","setProperty","setAttribute","name","loadingCache","Map","preloadImage","src","Promise","resolve","reject","Error","has","get","img","Image","promise","res","rej","onload","delete","onerror","set","then","preloadImages","sources","uniqueSources","Set","all","map","preloadImagesInRange","items","currentIndex","range","totalItems","imagesToPreload","distance","prevIndex","nextIndex","prevImg","nextImg","complete","size","catch","err","iconCache","createSVGIcon","path","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","className","cacheKey","JSON","stringify","svg","ICONS","prev","next","play","pause","getIcon","iconName","customOptions","icon","injectIcon","button","iconHTML","innerHTML","injectAutoRotateIcons","playHTML","pauseHTML","isMobile","window","innerWidth","normalizeIndex","index","PROXIMITY_THRESHOLD","Navigator","constructor","state","getShortestDistance","to","total","normalizedTo","normalizedFrom","forwardDist","backwardDist","isNearby","Math","abs","updateAfterNavigation","animator","updateCarousel","updateCounter","rotate","direction","goTo","normalizedIndex","navigateIfDifferent","targetIndex","callback","handleItemClick","handleRadialItemClick","handleStackItemClick","shortestDist","handleIndicatorClick","RADIAL_RADIUS","CLASSIC_POSITIONS","center","x","scale","peek","hidden","CLASSIC_SPACING","gapPercent","additionalMobile","additionalDesktop","mobileBreakpoint","MOMENTUM_CONFIG","friction","minVelocity","navigationThreshold","dampingFactor","STACK_POSITION_CLASSES","Animator","momentumAnimation","isAnimating","normalizeAngleDiff","diff","round","decimals","getAdjacentIndices","setCarouselRotation","angle","rounded","container","setCSSVariables","variables","key","entries","updateRadialRotation","targetAngle","angleUnit","currentRotation","getPropertyValue","currentAngle","parseFloat","finalAngle","updateActiveItem","ui","updateActiveStates","updateRadialPositions","updateClassicPositions","updateStackPositions","i","setPeekItems","calculateClassicSpacing","containerWidth","itemWidth","max","min","itemHalfPercent","baseSpacing","additionalSpacing","getClassicItemPosition","itemIndex","itemSpacing","distanceFromCurrent","offsetWidth","String","startMomentum","velocity","stopMomentum","currentVelocity","momentumStep","navigator","requestAnimationFrame","cancelAnimationFrame","AutoRotate","interval","isActive","setActiveState","updateAutoRotateButton","toggle","stop","start","rotateInterval","setInterval","clearInterval","destroy","WHEEL_CONFIG","threshold","timeout","cooldown","DRAG_CONFIG","touchThreshold","mouseThreshold","velocityThreshold","RESIZE_DEBOUNCE","EventHandler","boundHandlers","touch","startX","endX","drag","active","currentX","lastX","lastTime","wheel","isScrolling","scrollTimeout","lastWheelTime","accumulatedDelta","init","initNavigationButtons","initKeyboard","initWheel","initItemClick","initIndicatorClick","initTouch","initMouse","initResize","stopAutoRotateAndNavigate","navigationFn","completeCurrentIndicator","currentIndicator","contains","resetDragState","removeDraggingClass","clearDragTransform","updateDraggingClass","dragDistance","addDraggingClass","initDragState","clientX","Date","now","resetMouseCursor","elements","cursor","calculateWheelDelta","e","deltaX","deltaY","isHorizontal","resetWheelState","addHandler","handler","preventDefault","numKey","parseInt","currentTime","clearTimeout","setTimeout","passive","changedTouches","screenX","touchCurrentX","updateDragTransform","swipeDistance","deltaTime","resizeTimer","event","addEventListener","random","removeEventListener","clear","DRAG_TRANSFORM_CONFIG","stack","maxDrag","offsetMultiplier","rotationMultiplier","radial","rotationSensitivity","classic","dragSensitivity","UIManager","removeAttribute","currentItem","updateIndicatorProgress","clearPeekItems","prevItem","nextItem","leftClass","rightClass","applyEasing","progress","config","clampedDrag","easedProgress","dragOffset","dragRotation","FULL_CIRCLE_DEGREES","PeekCarousel","initElements","initModules","eventHandler","updateLayoutClass","createNavigation","createControls","injectIcons","createCounter","setImageLoadingAttributes","initCSSVariables","existingNav","createElement","appendChild","existingControls","indicatorsWrapper","createIndicators","wrapper","push","existingCounter","counterElement","currentSpan","textContent","hasAttribute","currentMode","currentLayoutMode","newMode","startAutoRotate","stopAutoRotate","toggleAutoRotate","isAutoRotating"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.peek-carousel__item:focus-visible{border-radius:12px;outline:3px solid rgba(102,126,234,.8);outline-offset:8px}.peek-carousel{animation:fadeInUp .8s cubic-bezier(.4,0,.2,1) forwards;animation-delay:.1s;cursor:grab;display:grid;height:100%;opacity:0;place-items:center;position:relative;transform:translateY(30px);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;--drag-offset:0px;--drag-rotation:0deg;--drag-rotation-y:0deg}.peek-carousel__track{height:100%;position:relative;touch-action:pan-y;transform-style:preserve-3d;width:100%}.peek-carousel__item{aspect-ratio:1.3265306122;backface-visibility:hidden;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) scale(.8);transform-origin:center;width:clamp(300px,35vw,500px);will-change:transform,opacity;z-index:0;--item-x:0%;--item-scale:0.8;--item-offset-x:0px;--item-angle:0deg;--item-radius:400px}.peek-carousel__item--active .peek-carousel__caption{opacity:1}@media(max-width:768px){.peek-carousel__item{width:clamp(280px,80vw,400px);--item-radius:300px}}.peek-carousel__figure{height:100%;margin:0;position:relative;width:100%}.peek-carousel__image{border-radius:16px;box-shadow:0,20px,60px,rgba(0,0,0,.6),0,5px,15px,rgba(0,0,0,.4);height:100%;-o-object-fit:cover;object-fit:cover;transition:filter .4s cubic-bezier(.4,0,.2,1),box-shadow .4s cubic-bezier(.4,0,.2,1);width:100%;will-change:filter,box-shadow}.peek-carousel__caption{background:linear-gradient(0deg,rgba(0,0,0,.8),transparent);border-radius:0 0 16px 16px;color:#fff;inset:auto 0 0;opacity:0;padding:1.5rem;pointer-events:none;position:absolute;text-align:center;transition:opacity .3s ease}@keyframes fadeInUp{to{opacity:1;transform:translateY(0)}}.peek-carousel--stack .peek-carousel__track{transform:none;transition:none}.peek-carousel--stack .peek-carousel__item{cursor:pointer;opacity:.5;transition:transform .05s,opacity .05s,z-index 0s;visibility:visible}.peek-carousel--stack .peek-carousel__item:not(.peek-carousel__item--dragging-left):not(.peek-carousel__item--dragging-right){transition:transform .5s,opacity .5s,z-index 0s}.peek-carousel--stack .peek-carousel__item--active{opacity:1;z-index:100}.peek-carousel--stack .peek-carousel__item--active .peek-carousel__image{box-shadow:0 40px 100px rgba(102,126,234,.6),0 0 40px rgba(102,126,234,.4),0 0 80px rgba(118,75,162,.3);filter:brightness(1.2) saturate(1.1)}.peek-carousel--stack .peek-carousel__item:not(.peek-carousel--stack .peek-carousel__item--active) .peek-carousel__image{box-shadow:0 20px 50px rgba(0,0,0,.5);filter:brightness(.7) saturate(.85)}.peek-carousel--stack .peek-carousel__item:not(.peek-carousel--stack .peek-carousel__item--active):hover .peek-carousel__image{box-shadow:0 30px 70px rgba(102,126,234,.3)!important;filter:brightness(.9) saturate(1)!important;transition:all .3s ease}.peek-carousel--stack .peek-carousel__item--center{transform:translate(-50%,-50%) scale(1.15) translateX(var(--drag-offset)) rotate(var(--drag-rotation))}.peek-carousel--stack .peek-carousel__item--prev{transform:translate(-95%,-50%) scale(.85) translateX(calc(-15px + var(--drag-offset))) rotate(var(--drag-rotation))}.peek-carousel--stack .peek-carousel__item--next{transform:translate(-5%,-50%) scale(.85) translateX(calc(15px + var(--drag-offset))) rotate(var(--drag-rotation))}.peek-carousel--stack .peek-carousel__item--hidden{transform:translate(-50%,-50%) scale(.7) translateX(var(--drag-offset)) rotate(var(--drag-rotation))}.peek-carousel--radial{perspective:1200px}.peek-carousel--radial .peek-carousel__track{transform:rotateY(calc(var(--carousel-rotation, 0deg) + var(--drag-rotation-y)));transition:transform .5s cubic-bezier(.4,0,.2,1)}.peek-carousel--radial .peek-carousel__track:active{transition:transform .05s}.peek-carousel--radial .peek-carousel__item{cursor:default;opacity:0;transform:translate(-50%,-50%) rotateY(var(--item-angle)) translateZ(var(--item-radius));transition:transform .5s cubic-bezier(.4,0,.2,1),opacity .5s cubic-bezier(.4,0,.2,1),visibility 0s .5s,z-index 0s;visibility:hidden}.peek-carousel--radial .peek-carousel__item--active{cursor:grab;opacity:1;transition:transform .5s cubic-bezier(.4,0,.2,1),opacity .5s cubic-bezier(.4,0,.2,1),visibility 0s 0s,z-index 0s;visibility:visible;z-index:100}.peek-carousel--radial .peek-carousel__item--active:active{cursor:grabbing}.peek-carousel--radial .peek-carousel__item--active .peek-carousel__image{box-shadow:0 40px 100px rgba(102,126,234,.6),0 0 40px rgba(102,126,234,.4),0 0 80px rgba(118,75,162,.3);filter:brightness(1.2) saturate(1.1)}.peek-carousel--radial .peek-carousel__item--next,.peek-carousel--radial .peek-carousel__item--prev{opacity:.3;transition:transform .5s cubic-bezier(.4,0,.2,1),opacity .5s cubic-bezier(.4,0,.2,1),visibility 0s 0s,z-index 0s;visibility:visible;z-index:50}.peek-carousel--radial .peek-carousel__item--next .peek-carousel__image,.peek-carousel--radial .peek-carousel__item--prev .peek-carousel__image{box-shadow:0 25px 60px rgba(0,0,0,.6);filter:brightness(.8) saturate(.9)}.peek-carousel--radial .peek-carousel__item:not(.peek-carousel--radial .peek-carousel__item--active) .peek-carousel__image{box-shadow:0 20px 50px rgba(0,0,0,.5);filter:brightness(.7) saturate(.85)}@media(max-width:768px){.peek-carousel--radial .peek-carousel__item{--item-radius:300px}}.peek-carousel--classic{overflow:hidden}.peek-carousel--classic .peek-carousel__track{transform:translateX(calc(var(--track-offset, 0px) + var(--drag-offset)));transition:transform .5s cubic-bezier(.4,0,.2,1)}.peek-carousel--classic .peek-carousel__track:active{transition:transform .05s}.peek-carousel--classic .peek-carousel__item{cursor:default;left:var(--item-x,50%);opacity:0;position:absolute;transform:translate(-50%,-50%) scale(var(--item-scale,1));transition:transform .5s cubic-bezier(.4,0,.2,1),opacity .5s cubic-bezier(.4,0,.2,1),left .5s cubic-bezier(.4,0,.2,1),visibility 0s cubic-bezier(.4,0,.2,1) .5s,z-index 0s;visibility:hidden;z-index:0}.peek-carousel--classic .peek-carousel__item--active{cursor:grab;opacity:1;transition:transform .5s cubic-bezier(.4,0,.2,1),opacity .5s cubic-bezier(.4,0,.2,1),left .5s cubic-bezier(.4,0,.2,1),visibility 0s 0s,z-index 0s;visibility:visible;z-index:100}.peek-carousel--classic .peek-carousel__item--active:active{cursor:grabbing}.peek-carousel--classic .peek-carousel__item--active .peek-carousel__image{box-shadow:0 40px 100px rgba(102,126,234,.6),0 0 40px rgba(102,126,234,.4),0 0 80px rgba(118,75,162,.3);filter:brightness(1.15) saturate(1.1)}.peek-carousel--classic .peek-carousel__item--next,.peek-carousel--classic .peek-carousel__item--prev{cursor:pointer;opacity:.6;transition:transform .5s cubic-bezier(.4,0,.2,1),opacity .5s cubic-bezier(.4,0,.2,1),left .5s cubic-bezier(.4,0,.2,1),visibility 0s 0s,z-index 0s;visibility:visible;z-index:50}.peek-carousel--classic .peek-carousel__item--next .peek-carousel__image,.peek-carousel--classic .peek-carousel__item--prev .peek-carousel__image{box-shadow:0 25px 60px rgba(0,0,0,.5);filter:brightness(.8) saturate(.95)}.peek-carousel--classic .peek-carousel__item--next:hover .peek-carousel__image,.peek-carousel--classic .peek-carousel__item--prev:hover .peek-carousel__image{box-shadow:0 30px 70px rgba(102,126,234,.3)!important;filter:brightness(1) saturate(1.05)!important;transition:all .3s ease}.peek-carousel--classic .peek-carousel__item:not(.peek-carousel--classic .peek-carousel__item--active):not(.peek-carousel--classic .peek-carousel__item--prev):not(.peek-carousel--classic .peek-carousel__item--next) .peek-carousel__image{box-shadow:0 10px 30px rgba(0,0,0,.3);filter:brightness(.5) saturate(.7)}.peek-carousel__controls{align-items:center;animation:fadeInUpControls .6s cubic-bezier(.4,0,.2,1) forwards;animation-delay:.6s;display:flex;gap:.75rem;inset:auto auto 3% 50%;opacity:0;position:absolute;transform:translateX(-50%);z-index:100}.peek-carousel__indicators{align-items:center;backdrop-filter:blur(12px);background:rgba(0,0,0,.5);border:1px solid hsla(0,0%,100%,.15);border-radius:50px;display:flex;gap:.875rem;padding:.625rem 1rem}.peek-carousel__indicator{align-items:center;background:transparent;border:none;border-radius:50%;cursor:pointer;display:flex;height:10px;justify-content:center;padding:0;position:relative;transition:all .3s ease;width:10px}.peek-carousel__indicator:before{background:hsla(0,0%,100%,.4);border-radius:50%;content:"";height:10px;transition:all .3s ease;width:10px}.peek-carousel__indicator:hover:before{background:hsla(0,0%,100%,.6);transform:scale(1.2)}.peek-carousel__indicator--active{border-radius:50px;overflow:hidden;width:50px}.peek-carousel__indicator--active:before{background:hsla(0,0%,100%,.3);border-radius:50px;content:"";height:8px;transition:all .3s ease;width:50px}.peek-carousel__indicator--active:after{background:hsla(0,0%,100%,.95);border-radius:50px;box-shadow:0 2px 8px hsla(0,0%,100%,.3),0 0 12px hsla(0,0%,100%,.2);content:"";height:8px;inset:50% auto auto 0;position:absolute;transform:translateY(-50%);transition:all .3s ease;width:50px}.peek-carousel__indicator--active:hover:before{background:hsla(0,0%,100%,.4)}.peek-carousel__indicator--active:hover:after{background:#fff;box-shadow:0 2px 12px hsla(0,0%,100%,.4),0 0 16px hsla(0,0%,100%,.3)}.peek-carousel__indicator--active.peek-carousel__indicator--progress:after{animation:indicatorProgress linear forwards;animation-duration:var(--progress-duration,2.5s);width:0}.peek-carousel__indicator--completed:after{animation:none;width:50px!important}@keyframes fadeInUpControls{0%{opacity:0;transform:translateX(-50%) translateY(20px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}@keyframes indicatorProgress{0%{width:0}to{width:50px}}.peek-carousel__nav{align-items:center;animation:fadeInUpNav .6s cubic-bezier(.4,0,.2,1) forwards;animation-delay:.5s;display:flex;gap:2rem;inset:auto auto 8% 50%;opacity:0;position:absolute;transform:translateX(-50%);z-index:100}@media(max-width:768px){.peek-carousel__nav{bottom:12%}}.peek-carousel__btn{align-items:center;backdrop-filter:blur(10px);background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);border-radius:50%;color:#fff;cursor:pointer;display:flex;display:grid;font-size:1rem;height:36px;justify-content:center;place-items:center;transition:all .3s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:36px}.peek-carousel__btn svg{flex-shrink:0;height:18px;transition:transform .15s ease-out;width:18px}.peek-carousel__btn:hover{background:hsla(0,0%,100%,.2);transform:scale(1.1)}.peek-carousel__btn:active{transform:scale(.95)}.peek-carousel__btn:focus-visible{outline:3px solid rgba(102,126,234,.8);outline-offset:4px}.peek-carousel__btn:hover svg{transform:translateX(0)}.peek-carousel__btn.prev-btn:hover svg{transform:translateX(-2px)}.peek-carousel__btn.next-btn:hover svg{transform:translateX(2px)}@media(max-width:768px){.peek-carousel__btn{height:36px;width:36px}}.peek-carousel__btn--auto-rotate{align-items:center;backdrop-filter:blur(12px);background:rgba(0,0,0,.5);border:1px solid hsla(0,0%,100%,.15);border-radius:50%;cursor:pointer;display:flex;height:36px;justify-content:center;padding:0;transition:all .3s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:36px}.peek-carousel__btn--auto-rotate svg{flex-shrink:0}.peek-carousel__btn--auto-rotate .play-icon{display:block}.peek-carousel__btn--auto-rotate .pause-icon{display:none}.peek-carousel__btn--auto-rotate:hover{background:rgba(0,0,0,.6);border-color:hsla(0,0%,100%,.3);transform:scale(1.1)}.peek-carousel__btn--auto-rotate:active{transform:scale(.95)}.peek-carousel__btn--auto-rotate:focus-visible{outline:3px solid rgba(102,126,234,.8);outline-offset:4px}.peek-carousel__btn--auto-rotate.peek-carousel__btn--active{background:hsla(0,0%,100%,.2);border-color:hsla(0,0%,100%,.3)}.peek-carousel__btn--auto-rotate.peek-carousel__btn--active .play-icon{display:none}.peek-carousel__btn--auto-rotate.peek-carousel__btn--active .pause-icon{display:block}@keyframes fadeInUpNav{0%{opacity:0;transform:translateX(-50%) translateY(20px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}.peek-carousel__counter{animation:fadeInDown .6s cubic-bezier(.4,0,.2,1) forwards;animation-delay:.7s;backdrop-filter:blur(10px);background:rgba(0,0,0,.5);border:1px solid hsla(0,0%,100%,.15);border-radius:20px;color:#fff;font-size:.875rem;font-weight:500;inset:3% auto auto 3%;line-height:1;opacity:0;padding:.5rem 1rem;pointer-events:none;position:absolute;transform:translateY(-10px);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:100}@media(max-width:768px){.peek-carousel__counter{font-size:.75rem;inset:2% auto auto 2%;padding:.4rem .8rem;position:absolute}}.peek-carousel__counter-separator{margin:0 .25rem;opacity:.7}.peek-carousel__counter-current{font-weight:600}.peek-carousel__counter-total{opacity:.8}@keyframes fadeInDown{to{opacity:1;transform:translateY(0)}}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PeekCarousel - Peek 효과를 가진 캐러셀
|
|
3
|
+
* @version 1.0.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @author lledellebell
|
|
6
|
+
*/
|
|
7
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).PeekCarousel=e()}(this,function(){"use strict";const t=Object.freeze({STACK:"stack",RADIAL:"radial",CLASSIC:"classic"}),e=Object.freeze({startIndex:1,layoutMode:t.STACK,autoRotate:!1,autoRotateInterval:2500,preloadRange:2,swipeThreshold:50,dragThreshold:80,enableKeyboard:!0,enableWheel:!0,enableTouch:!0,enableMouse:!0,showNavigation:!0,showCounter:!0,showIndicators:!0,showAutoRotateButton:!0});const s=Object.freeze({carousel:"peek-carousel",track:"peek-carousel__track",item:"peek-carousel__item",itemActive:"peek-carousel__item--active",itemPrev:"peek-carousel__item--prev",itemNext:"peek-carousel__item--next",itemCenter:"peek-carousel__item--center",itemHidden:"peek-carousel__item--hidden",itemDraggingLeft:"peek-carousel__item--dragging-left",itemDraggingRight:"peek-carousel__item--dragging-right",figure:"peek-carousel__figure",image:"peek-carousel__image",caption:"peek-carousel__caption",nav:"peek-carousel__nav",navBtn:"nav-btn",btn:"peek-carousel__btn",prevBtn:"prev-btn",nextBtn:"next-btn",autoRotateBtn:"auto-rotate-btn",btnAutoRotate:"peek-carousel__btn--auto-rotate",btnActive:"peek-carousel__btn--active",controls:"peek-carousel__controls",indicators:"peek-carousel__indicators",indicator:"indicator",indicatorPeek:"peek-carousel__indicator",indicatorActive:"peek-carousel__indicator--active",indicatorProgress:"peek-carousel__indicator--progress",indicatorCompleted:"peek-carousel__indicator--completed",counter:"peek-carousel__counter",counterCurrent:"peek-carousel__counter-current",counterSeparator:"peek-carousel__counter-separator",counterTotal:"peek-carousel__counter-total",playIcon:"play-icon",pauseIcon:"pause-icon"}),i=Object.freeze({carousel:".peek-carousel__track",item:".peek-carousel__item",indicator:".indicator",prevBtn:".prev-btn",nextBtn:".next-btn",autoRotateBtn:".auto-rotate-btn",playIcon:".play-icon",pauseIcon:".pause-icon",image:"img"}),a=Object.freeze({current:"aria-current",selected:"aria-selected",pressed:"aria-pressed",label:"aria-label",tabindex:"tabindex"}),o=Object.freeze({mobile:768}),r=Object.freeze({transition:500,progressReset:10}),n=Object.freeze({arrowLeft:"ArrowLeft",arrowRight:"ArrowRight",home:"Home",end:"End",space:" "});function c(t,...e){t instanceof HTMLElement&&e.length>0&&t.classList.add(...e)}function l(t,...e){t instanceof HTMLElement&&e.length>0&&t.classList.remove(...e)}function u(t,e,s){t instanceof HTMLElement&&e&&t.setAttribute(e,s)}const h=new Map;function d(t){if(!t||0===t.length)return Promise.resolve([]);const e=[...new Set(t)];return Promise.all(e.map(t=>function(t){return new Promise((e,s)=>{if(!t)return void s(new Error("이미지 소스가 제공되지 않았습니다"));if(h.has(t))return h.get(t);const i=new Image,a=new Promise((e,s)=>{i.onload=()=>{h.delete(t),e(i)},i.onerror=()=>{h.delete(t),s(new Error(`이미지 로드 실패: ${t}`))},i.src=t});h.set(t,a),a.then(e,s)})}(t)))}const m=new Map;const p={prev:{path:"M15 18L9 12L15 6",options:{}},next:{path:"M9 18L15 12L9 6",options:{}},play:{path:"M8 6.5v11l9-5.5z",options:{fill:"currentColor",stroke:"currentColor",strokeWidth:0,strokeLinecap:"round",strokeLinejoin:"round"}},pause:{path:"M7 5.5C7 5.22386 7.22386 5 7.5 5H9.5C9.77614 5 10 5.22386 10 5.5V18.5C10 18.7761 9.77614 19 9.5 19H7.5C7.22386 19 7 18.7761 7 18.5V5.5ZM14 5.5C14 5.22386 14.2239 5 14.5 5H16.5C16.7761 5 17 5.22386 17 5.5V18.5C17 18.7761 16.7761 19 16.5 19H14.5C14.2239 19 14 18.7761 14 18.5V5.5Z",options:{fill:"currentColor",stroke:"none"}}};function g(t,e={}){const s=p[t];if(!s)return console.warn(`PeekCarousel: 아이콘 "${t}"을 찾을 수 없습니다`),"";const i={...s.options,...e};return function(t,e={}){const{width:s=24,height:i=24,viewBox:a="0 0 24 24",fill:o="none",stroke:r="currentColor",strokeWidth:n=2,strokeLinecap:c="round",strokeLinejoin:l="round",className:u=""}=e,h=`${t}-${JSON.stringify(e)}`;if(m.has(h))return m.get(h);const d=`<svg width="${s}" height="${i}" viewBox="${a}" fill="${o}" xmlns="http://www.w3.org/2000/svg" class="${u}"><path d="${t}" stroke="${r}" stroke-width="${n}" stroke-linecap="${c}" stroke-linejoin="${l}"/></svg>`;return m.set(h,d),d}(s.path,i)}function v(t,e,s={}){if(!(t&&t instanceof HTMLElement))return;if(t.querySelector("svg"))return;const i=g(e,s);i&&(t.innerHTML=i)}function f(t,e){return e<=0?0:(t%e+e)%e}class b{constructor(t){this.carousel=t}get currentIndex(){return this.carousel.state.currentIndex}set currentIndex(t){this.carousel.state.currentIndex=f(t,this.carousel.totalItems)}getShortestDistance(t,e){const s=this.carousel.totalItems,i=f(e,s),a=f(t,s),o=(i-a+s)%s,r=(a-i+s)%s;return o<=r?o:-r}isNearby(t,e){return Math.abs(this.getShortestDistance(t,e))<=2}updateAfterNavigation(){this.carousel.animator.updateCarousel(),this.carousel.updateCounter(),this.carousel.options.preloadRange>0&&this.carousel.preloadImages()}rotate(t){this.currentIndex=this.currentIndex+t,this.updateAfterNavigation()}next(){this.rotate(1)}prev(){this.rotate(-1)}goTo(t){const e=f(t,this.carousel.totalItems);e!==this.currentIndex&&(this.currentIndex=e,this.updateAfterNavigation())}navigateIfDifferent(t,e){const s=f(t,this.carousel.totalItems);return s!==this.currentIndex&&(e(s),!0)}handleItemClick(t){this.navigateIfDifferent(t,t=>{const{layoutMode:e}=this.carousel.options;"radial"===e?this.handleRadialItemClick(t):this.handleStackItemClick(t)})}handleRadialItemClick(t){const e=this.getShortestDistance(this.currentIndex,t);if(Math.abs(e)>1){const t=e>0?1:-1;this.rotate(t)}else this.rotate(e)}handleStackItemClick(t){if(this.isNearby(this.currentIndex,t)){const e=this.getShortestDistance(this.currentIndex,t);this.rotate(e)}else this.goTo(t)}handleIndicatorClick(t){this.navigateIfDifferent(t,t=>{const{layoutMode:e}=this.carousel.options;if("radial"===e){const e=this.getShortestDistance(this.currentIndex,t);this.rotate(e)}else this.goTo(t)})}}const y=Object.freeze({center:{x:50,scale:1},peek:{scale:1},hidden:{scale:.85}}),I=Object.freeze({gapPercent:5,additionalMobile:40,additionalDesktop:15,mobileBreakpoint:768}),k=Object.freeze({friction:.92,minVelocity:.05,navigationThreshold:1.5,dampingFactor:.6}),x=[s.itemCenter,s.itemPrev,s.itemNext,s.itemHidden];class C{constructor(t){this.carousel=t,this.momentumAnimation=null,this.isAnimating=!1}normalizeAngleDiff(t){return(t+180)%360-180}round(t,e=2){return Math.round(t*10**e)/10**e}getAdjacentIndices(t){return{prev:f(t-1,this.carousel.totalItems),next:f(t+1,this.carousel.totalItems)}}setCarouselRotation(t){const e=this.round(t,2);this.carousel.container.style.setProperty("--carousel-rotation",`${e}deg`)}setCSSVariables(t,e){for(const[s,i]of Object.entries(e))t.style.setProperty(s,i)}updateRadialRotation(t){const e=-this.carousel.state.angleUnit*t,s=this.carousel.container.style.getPropertyValue("--carousel-rotation");if(!s||"0deg"===s)return void this.setCarouselRotation(e);const i=parseFloat(s),a=i+this.normalizeAngleDiff(e-i);this.setCarouselRotation(a)}updateCarousel(){const{currentIndex:t}=this.carousel.state,{layoutMode:e}=this.carousel.options;"stack"===e||"classic"===e?this.setCarouselRotation(0):"radial"===e&&this.updateRadialRotation(t),this.updateActiveItem()}updateActiveItem(){const{currentIndex:t}=this.carousel.state,{layoutMode:e}=this.carousel.options;this.carousel.ui.updateActiveStates(t),"radial"===e?this.updateRadialPositions(t):"classic"===e?this.updateClassicPositions(t):this.updateStackPositions(t)}updateRadialPositions(t){const{angleUnit:e}=this.carousel.state;for(let t=0;t<this.carousel.items.length;t++){const s=this.carousel.items[t],i=e*t;this.setCSSVariables(s,{"--item-angle":`${this.round(i,2)}deg`,"--item-radius":"400px"})}const{prev:s,next:i}=this.getAdjacentIndices(t);this.carousel.ui.setPeekItems(s,i)}updateStackPositions(t){const{prev:e,next:i}=this.getAdjacentIndices(t);for(let a=0;a<this.carousel.items.length;a++){const o=this.carousel.items[a];o.classList.remove(...x),a===t?o.classList.add(s.itemCenter):a===e?o.classList.add(s.itemPrev):a===i?o.classList.add(s.itemNext):o.classList.add(s.itemHidden)}}calculateClassicSpacing(t){const e=Math.max(300,Math.min(.35*t,500)),s=t<=I.mobileBreakpoint;return e/t*50+I.gapPercent+(s?I.additionalMobile:I.additionalDesktop)}getClassicItemPosition(t,e,s){const{prev:i,next:a}=this.getAdjacentIndices(e);if(t===e)return{x:y.center.x,scale:y.center.scale};if(t===i)return{x:y.center.x-s,scale:y.peek.scale};if(t===a)return{x:y.center.x+s,scale:y.peek.scale};return{x:t-e<0?y.center.x-2*s:y.center.x+2*s,scale:y.hidden.scale}}updateClassicPositions(t){const{prev:e,next:s}=this.getAdjacentIndices(t),i=this.carousel.container.offsetWidth,a=this.calculateClassicSpacing(i);for(let e=0;e<this.carousel.items.length;e++){const s=this.carousel.items[e],{x:i,scale:o}=this.getClassicItemPosition(e,t,a);this.setCSSVariables(s,{"--item-x":`${this.round(i,2)}%`,"--item-scale":String(o)})}this.carousel.ui.setPeekItems(e,s)}startMomentum(t){this.stopMomentum();let e=t;const s=()=>{if(e*=k.friction,Math.abs(e)<k.minVelocity)this.stopMomentum();else{if(Math.abs(e)>k.navigationThreshold){const t=e>0?-1:1;this.carousel.navigator.rotate(t),e*=k.dampingFactor}this.momentumAnimation=requestAnimationFrame(s)}};this.isAnimating=!0,this.momentumAnimation=requestAnimationFrame(s)}stopMomentum(){this.momentumAnimation&&(cancelAnimationFrame(this.momentumAnimation),this.momentumAnimation=null),this.isAnimating=!1}}class A{constructor(t){this.carousel=t,this.interval=null,this.isActive=!1}setActiveState(t){this.isActive=t,this.carousel.ui.updateAutoRotateButton(t)}toggle(){this.isActive?this.stop():this.start()}start(){if(this.isActive)return;this.setActiveState(!0);const t=this.carousel.options.autoRotateInterval;this.interval=setInterval(()=>{this.carousel.navigator.next()},t)}stop(){this.isActive&&(this.setActiveState(!1),this.interval&&(clearInterval(this.interval),this.interval=null))}destroy(){this.stop(),this.carousel=null}}const w=Object.freeze({threshold:50,timeout:150,cooldown:100}),R=Object.freeze({touchThreshold:15,mouseThreshold:10,velocityThreshold:.5});class M{constructor(t){this.carousel=t,this.boundHandlers=new Map,this.touch={startX:0,endX:0},this.drag={active:!1,startX:0,currentX:0,lastX:0,lastTime:0,velocity:0},this.wheel={isScrolling:!1,scrollTimeout:null,lastWheelTime:0,accumulatedDelta:0}}init(){this.initNavigationButtons(),this.initKeyboard(),this.initWheel(),this.initItemClick(),this.initIndicatorClick(),this.initTouch(),this.initMouse(),this.initResize()}stopAutoRotateAndNavigate(t){this.completeCurrentIndicator(),this.carousel.autoRotate.stop(),t()}completeCurrentIndicator(){const t=this.carousel.indicators[this.carousel.state.currentIndex];t&&t.classList.contains("peek-carousel__indicator--active")&&t.classList.add("peek-carousel__indicator--completed")}resetDragState(t){this.carousel.ui.removeDraggingClass(t),this.carousel.ui.clearDragTransform()}updateDraggingClass(t,e,s){t>s?this.carousel.ui.addDraggingClass(e,"right"):t<-s&&this.carousel.ui.addDraggingClass(e,"left")}initDragState(t){this.drag.active=!0,this.drag.startX=t,this.drag.currentX=t,this.drag.lastX=t,this.drag.lastTime=Date.now(),this.drag.velocity=0}resetMouseCursor(){this.carousel.elements.carousel.style.cursor="grab"}calculateWheelDelta(t){return Math.abs(t.deltaX)>Math.abs(t.deltaY)?-t.deltaX:t.deltaY}resetWheelState(){this.wheel.isScrolling=!1,this.wheel.accumulatedDelta=0}initNavigationButtons(){const{prevBtn:t,nextBtn:e,autoRotateBtn:s}=this.carousel.elements;t&&this.addHandler(t,"click",()=>{this.stopAutoRotateAndNavigate(()=>this.carousel.navigator.prev())}),e&&this.addHandler(e,"click",()=>{this.stopAutoRotateAndNavigate(()=>this.carousel.navigator.next())}),s&&this.addHandler(s,"click",()=>{this.carousel.autoRotate.toggle()})}initKeyboard(){if(!this.carousel.options.enableKeyboard)return;this.addHandler(document,"keydown",t=>{const{navigator:e,autoRotate:s,totalItems:i}=this.carousel;switch(t.key){case n.arrowLeft:s.stop(),e.prev();break;case n.arrowRight:s.stop(),e.next();break;case n.home:t.preventDefault(),s.stop(),e.goTo(0);break;case n.end:t.preventDefault(),s.stop(),e.goTo(i-1);break;case n.space:t.preventDefault(),s.toggle();break;default:const a=parseInt(t.key);a>=1&&a<=i&&(t.preventDefault(),s.stop(),e.goTo(a-1))}})}initWheel(){if(!this.carousel.options.enableWheel)return;this.addHandler(this.carousel.elements.carousel,"wheel",t=>{const e=Math.abs(t.deltaX),s=Math.abs(t.deltaY);if(e<1&&s<1)return;if(e===s)return;t.preventDefault();const i=Date.now();if(!(i-this.wheel.lastWheelTime<w.cooldown)){if(this.wheel.isScrolling||(this.wheel.isScrolling=!0,this.wheel.accumulatedDelta=0,this.carousel.autoRotate.stop(),this.carousel.animator.stopMomentum()),this.wheel.accumulatedDelta+=this.calculateWheelDelta(t),Math.abs(this.wheel.accumulatedDelta)>=w.threshold){const t=this.wheel.accumulatedDelta>0?1:-1;this.carousel.navigator.rotate(t),this.wheel.accumulatedDelta=0,this.wheel.lastWheelTime=i}clearTimeout(this.wheel.scrollTimeout),this.wheel.scrollTimeout=setTimeout(()=>{this.resetWheelState()},w.timeout)}},{passive:!1})}initItemClick(){const{items:t}=this.carousel;for(let e=0;e<t.length;e++)this.addHandler(t[e],"click",()=>{this.carousel.autoRotate.stop(),this.carousel.navigator.handleItemClick(e)})}initIndicatorClick(){const{indicators:t}=this.carousel;for(let e=0;e<t.length;e++)this.addHandler(t[e],"click",()=>{this.carousel.autoRotate.stop(),this.carousel.navigator.handleIndicatorClick(e)})}initTouch(){this.carousel.options.enableTouch&&(this.addHandler(this.carousel.elements.carousel,"touchstart",t=>{this.touch.startX=t.changedTouches[0].screenX}),this.addHandler(this.carousel.elements.carousel,"touchmove",t=>{const e=t.changedTouches[0].screenX-this.touch.startX,{currentIndex:s}=this.carousel.state;this.carousel.ui.updateDragTransform(e),this.updateDraggingClass(e,s,R.touchThreshold)}),this.addHandler(this.carousel.elements.carousel,"touchend",t=>{this.touch.endX=t.changedTouches[0].screenX;const e=this.touch.endX-this.touch.startX,{swipeThreshold:s}=this.carousel.options,{currentIndex:i}=this.carousel.state;this.resetDragState(i),e<-s?(this.carousel.autoRotate.stop(),this.carousel.navigator.next()):e>s&&(this.carousel.autoRotate.stop(),this.carousel.navigator.prev())}))}initMouse(){this.carousel.options.enableMouse&&(this.addHandler(this.carousel.elements.carousel,"mousedown",t=>{window.innerWidth<=768||(this.initDragState(t.clientX),this.carousel.autoRotate.stop(),this.carousel.animator.stopMomentum(),this.carousel.elements.carousel.style.cursor="grabbing",t.preventDefault())}),this.addHandler(document,"mousemove",t=>{if(!this.drag.active)return;const e=Date.now(),s=e-this.drag.lastTime,i=t.clientX-this.drag.lastX;s>0&&(this.drag.velocity=i/s),this.drag.currentX=t.clientX,this.drag.lastX=t.clientX,this.drag.lastTime=e;const a=this.drag.currentX-this.drag.startX,{currentIndex:o}=this.carousel.state;if(this.carousel.ui.updateDragTransform(a),this.updateDraggingClass(a,o,R.mouseThreshold),Math.abs(a)>this.carousel.options.dragThreshold){const t=a>0?-1:1;this.carousel.navigator.rotate(t),this.drag.startX=this.drag.currentX,this.resetDragState(o)}}),this.addHandler(document,"mouseup",()=>{if(!this.drag.active)return;this.drag.active=!1,this.resetMouseCursor();const{currentIndex:t}=this.carousel.state;this.resetDragState(t),Math.abs(this.drag.velocity)>R.velocityThreshold&&this.carousel.animator.startMomentum(this.drag.velocity)}),this.addHandler(this.carousel.elements.carousel,"mouseleave",()=>{if(this.drag.active){this.drag.active=!1,this.resetMouseCursor();const{currentIndex:t}=this.carousel.state;this.resetDragState(t)}}),window.innerWidth>o.mobile&&this.resetMouseCursor())}initResize(){let t;this.addHandler(window,"resize",()=>{clearTimeout(t),t=setTimeout(()=>{this.carousel.animator.updateCarousel()},100)})}addHandler(t,e,s,i){t.addEventListener(e,s,i);const a=`${e}-${Date.now()}-${Math.random()}`;this.boundHandlers.set(a,{element:t,event:e,handler:s,options:i})}destroy(){this.wheel.scrollTimeout&&(clearTimeout(this.wheel.scrollTimeout),this.wheel.scrollTimeout=null);for(const{element:t,event:e,handler:s,options:i}of this.boundHandlers.values())t.removeEventListener(e,s,i);this.boundHandlers.clear(),this.carousel=null}}const S=Object.freeze({stack:{maxDrag:200,offsetMultiplier:100,rotationMultiplier:3},radial:{rotationSensitivity:.2},classic:{dragSensitivity:.5}});class T{constructor(t){this.carousel=t}updateActiveStates(t){for(let t=0;t<this.carousel.items.length;t++){const e=this.carousel.items[t];l(e,s.itemActive,s.itemPrev,s.itemNext),e.removeAttribute(a.current)}for(let t=0;t<this.carousel.indicators.length;t++){const e=this.carousel.indicators[t];l(e,s.indicatorActive,s.indicatorProgress),u(e,a.selected,"false"),u(e,a.tabindex,"-1")}const e=this.carousel.items[t],i=this.carousel.indicators[t];e&&(c(e,s.itemActive),u(e,a.current,"true")),i&&(l(i,s.indicatorCompleted),c(i,s.indicatorActive),u(i,a.selected,"true"),u(i,a.tabindex,"0"),this.carousel.autoRotate.isActive&&this.updateIndicatorProgress(i))}updateIndicatorProgress(t){var e,i,a;e=t,i="--progress-duration",a=`${this.carousel.options.autoRotateInterval}ms`,e instanceof HTMLElement&&i&&e.style.setProperty(i,a),setTimeout(()=>{t&&c(t,s.indicatorProgress)},r.progressReset)}clearPeekItems(){for(let t=0;t<this.carousel.items.length;t++){l(this.carousel.items[t],s.itemPrev,s.itemNext)}}setPeekItems(t,e){const i=this.carousel.items[t],a=this.carousel.items[e];i&&c(i,s.itemPrev),a&&c(a,s.itemNext)}updateAutoRotateButton(t){const{autoRotateBtn:e}=this.carousel.elements;e&&(t?(c(e,s.btnActive),u(e,a.pressed,"true")):(l(e,s.btnActive),u(e,a.pressed,"false")))}addDraggingClass(t,e){const i=this.carousel.items[t];if(!i)return;const a=s.itemDraggingLeft,o=s.itemDraggingRight;l(i,a,o),"left"===e?c(i,a):"right"===e&&c(i,o)}removeDraggingClass(t){const e=this.carousel.items[t];e&&l(e,s.itemDraggingLeft,s.itemDraggingRight)}round(t,e=2){return Math.round(t*10**e)/10**e}applyEasing(t){return t*(2-Math.abs(t))}updateDragTransform(t){const{layoutMode:e}=this.carousel.options;if("stack"===e){const e=S.stack,s=Math.max(-e.maxDrag,Math.min(e.maxDrag,t))/e.maxDrag,i=this.applyEasing(s),a=this.round(i*e.offsetMultiplier),o=this.round(i*e.rotationMultiplier);this.carousel.container.style.setProperty("--drag-offset",`${a}px`),this.carousel.container.style.setProperty("--drag-rotation",`${o}deg`)}else if("radial"===e){const e=S.radial,s=this.round(t*e.rotationSensitivity);this.carousel.container.style.setProperty("--drag-rotation-y",`${s}deg`)}else if("classic"===e){const e=S.classic,s=this.round(t*e.dragSensitivity);this.carousel.container.style.setProperty("--drag-offset",`${s}px`)}}clearDragTransform(){this.carousel.container.style.setProperty("--drag-offset","0px"),this.carousel.container.style.setProperty("--drag-rotation","0deg"),this.carousel.container.style.setProperty("--drag-rotation-y","0deg")}destroy(){}}return class{constructor(s,i={}){if(this.container=function(t){return"string"==typeof t?document.querySelector(t):t instanceof HTMLElement?t:null}(s),!this.container)throw new Error(`PeekCarousel: 셀렉터 "${s}"에 해당하는 컨테이너를 찾을 수 없습니다`);if(this.options=function(s){const i={...e,...s};return i.startIndex<0&&(console.warn("PeekCarousel: startIndex는 0 이상이어야 합니다. 기본값 1 사용"),i.startIndex=1),Object.values(t).includes(i.layoutMode)||(console.warn(`PeekCarousel: 유효하지 않은 layoutMode "${i.layoutMode}". 기본값 "stack" 사용`),i.layoutMode=t.STACK),i.autoRotateInterval<100&&(console.warn("PeekCarousel: autoRotateInterval은 100ms 이상이어야 합니다. 기본값 2500 사용"),i.autoRotateInterval=2500),i.preloadRange<0&&(console.warn("PeekCarousel: preloadRange는 0 이상이어야 합니다. 기본값 2 사용"),i.preloadRange=2),i}(i),this.initElements(),0===this.items.length)throw new Error("PeekCarousel: 캐러셀 아이템을 찾을 수 없습니다");this.state={currentIndex:this.options.startIndex,angleUnit:360/this.totalItems},this.initModules(),this.init()}initElements(){this.elements={carousel:this.container.querySelector(i.carousel),prevBtn:null,nextBtn:null,autoRotateBtn:null,controls:null,nav:null},this.items=function(t,e=document){return"string"!=typeof t?[]:Array.from(e.querySelectorAll(t))}(i.item,this.container),this.totalItems=this.items.length,this.indicators=[]}initModules(){this.navigator=new b(this),this.animator=new C(this),this.autoRotate=new A(this),this.eventHandler=new M(this),this.ui=new T(this)}init(){this.updateLayoutClass(),this.createNavigation(),this.createControls(),this.injectIcons(),this.createCounter(),this.setImageLoadingAttributes(),this.initCSSVariables(),this.eventHandler.init(),this.animator.updateCarousel(),this.options.autoRotate&&this.autoRotate.start(),this.options.preloadRange>0&&this.preloadImages()}initCSSVariables(){this.container.style.setProperty("--carousel-rotation","0deg"),this.container.style.setProperty("--drag-offset","0px"),this.container.style.setProperty("--drag-rotation","0deg"),this.container.style.setProperty("--drag-rotation-y","0deg")}createNavigation(){if(!this.options.showNavigation)return;const t=this.container.querySelector(`.${s.nav}`);if(t)return this.elements.nav=t,this.elements.prevBtn=t.querySelector(i.prevBtn),void(this.elements.nextBtn=t.querySelector(i.nextBtn));const e=document.createElement("div");e.className=s.nav;const a=document.createElement("button");a.className=`${s.navBtn} ${s.btn} ${s.prevBtn}`,a.setAttribute("aria-label","Previous");const o=document.createElement("button");o.className=`${s.navBtn} ${s.btn} ${s.nextBtn}`,o.setAttribute("aria-label","Next"),e.appendChild(a),e.appendChild(o),this.container.appendChild(e),this.elements.nav=e,this.elements.prevBtn=a,this.elements.nextBtn=o}createControls(){if(!this.options.showIndicators&&!this.options.showAutoRotateButton)return;const t=this.container.querySelector(`.${s.controls}`);if(t){this.elements.controls=t;const e=t.querySelector(`.${s.indicators}`);return e&&this.options.showIndicators&&(e.innerHTML="",this.createIndicators(e)),void(this.elements.autoRotateBtn=t.querySelector(i.autoRotateBtn))}const e=document.createElement("div");if(e.className=s.controls,this.options.showIndicators){const t=document.createElement("div");t.className=s.indicators,this.createIndicators(t),e.appendChild(t)}if(this.options.showAutoRotateButton){const t=document.createElement("button");t.className=`${s.autoRotateBtn} ${s.btn} ${s.btnAutoRotate}`,t.setAttribute("aria-label","Toggle auto-rotate"),t.setAttribute("aria-pressed","false"),e.appendChild(t),this.elements.autoRotateBtn=t}this.container.appendChild(e),this.elements.controls=e}createIndicators(t){this.indicators=[];for(let e=0;e<this.totalItems;e++){const i=document.createElement("button"),a=e===this.state.currentIndex;i.className=s.indicator,i.classList.add(s.indicatorPeek),i.setAttribute("role","tab"),i.setAttribute("aria-label",`Image ${e+1}`),i.setAttribute("aria-selected",a?"true":"false"),i.setAttribute("tabindex",a?"0":"-1"),a&&i.classList.add(s.indicatorActive),t.appendChild(i),this.indicators.push(i)}}injectIcons(){const{prevBtn:t,nextBtn:e,autoRotateBtn:s}=this.elements;t&&v(t,"prev"),e&&v(e,"next"),s&&function(t){if(!(t&&t instanceof HTMLElement))return;if(t.querySelector("svg"))return;const e=g("play",{className:"play-icon"}),s=g("pause",{className:"pause-icon"});e&&s&&(t.innerHTML=e+s)}(s)}createCounter(){if(!this.options.showCounter)return;const t=this.container.querySelector(`.${s.counter}`);if(t)return this.counterElement=t,void this.updateCounter();const e=document.createElement("div");e.className=s.counter,e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),e.innerHTML=`\n <span class="${s.counterCurrent}">${this.state.currentIndex+1}</span>\n <span class="${s.counterSeparator}">/</span>\n <span class="${s.counterTotal}">${this.totalItems}</span>\n `,this.container.appendChild(e),this.counterElement=e}updateCounter(){if(!this.counterElement)return;const t=this.counterElement.querySelector(`.${s.counterCurrent}`);t&&(t.textContent=this.state.currentIndex+1)}setImageLoadingAttributes(){const{startIndex:t}=this.options,e=this.options.preloadRange||1;for(let i=0;i<this.items.length;i++){const a=this.items[i].querySelector(`.${s.image}`);if(!a||a.hasAttribute("loading"))continue;const o=Math.abs(i-t)<=e;a.setAttribute("loading",o?"eager":"lazy")}}updateLayoutClass(){const t=this.currentLayoutMode,e=this.options.layoutMode;t&&t!==e&&this.container.classList.remove(`peek-carousel--${t}`),this.container.classList.add(`peek-carousel--${e}`),this.currentLayoutMode=e}preloadImages(){!function(t,e,s){if(!t||0===t.length||s<0)return;const i=t.length,a=new Set;for(let o=1;o<=s;o++){const s=(e-o+i)%i,r=(e+o)%i,n=t[s]?.querySelector("img"),c=t[r]?.querySelector("img");n&&n.src&&!n.complete&&a.add(n.src),c&&c.src&&!c.complete&&a.add(c.src)}a.size>0&&d([...a]).catch(t=>{console.warn("일부 이미지 프리로드 실패:",t)})}(this.items,this.state.currentIndex,this.options.preloadRange)}next(){this.navigator.next()}prev(){this.navigator.prev()}goTo(t){this.navigator.goTo(t)}startAutoRotate(){this.autoRotate.start()}stopAutoRotate(){this.autoRotate.stop()}toggleAutoRotate(){this.autoRotate.toggle()}destroy(){this.autoRotate.destroy(),this.animator.stopMomentum(),this.eventHandler.destroy(),this.ui.destroy()}get currentIndex(){return this.state.currentIndex}get isAutoRotating(){return this.autoRotate.isActive}}});
|
|
8
|
+
//# sourceMappingURL=peek-carousel.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peek-carousel.min.js","sources":["../src/core/config.js","../src/core/constants.js","../src/utils/dom.js","../src/utils/preloader.js","../src/utils/icons.js","../src/utils/helpers.js","../src/modules/Navigator.js","../src/modules/Animator.js","../src/modules/AutoRotate.js","../src/modules/EventHandler.js","../src/modules/UIManager.js","../src/core/PeekCarousel.js"],"sourcesContent":["export const LAYOUT_MODES = Object.freeze({\n STACK: 'stack',\n RADIAL: 'radial',\n CLASSIC: 'classic',\n});\n\nexport const DEFAULT_OPTIONS = Object.freeze({\n startIndex: 1,\n layoutMode: LAYOUT_MODES.STACK,\n autoRotate: false,\n autoRotateInterval: 2500,\n preloadRange: 2,\n swipeThreshold: 50,\n dragThreshold: 80,\n enableKeyboard: true,\n enableWheel: true,\n enableTouch: true,\n enableMouse: true,\n showNavigation: true,\n showCounter: true,\n showIndicators: true,\n showAutoRotateButton: true,\n});\n\nexport function validateOptions(options) {\n const validated = { ...DEFAULT_OPTIONS, ...options };\n\n if (validated.startIndex < 0) {\n console.warn('PeekCarousel: startIndex는 0 이상이어야 합니다. 기본값 1 사용');\n validated.startIndex = 1;\n }\n\n if (!Object.values(LAYOUT_MODES).includes(validated.layoutMode)) {\n console.warn(`PeekCarousel: 유효하지 않은 layoutMode \"${validated.layoutMode}\". 기본값 \"stack\" 사용`);\n validated.layoutMode = LAYOUT_MODES.STACK;\n }\n\n if (validated.autoRotateInterval < 100) {\n console.warn('PeekCarousel: autoRotateInterval은 100ms 이상이어야 합니다. 기본값 2500 사용');\n validated.autoRotateInterval = 2500;\n }\n\n if (validated.preloadRange < 0) {\n console.warn('PeekCarousel: preloadRange는 0 이상이어야 합니다. 기본값 2 사용');\n validated.preloadRange = 2;\n }\n\n return validated;\n}\n","export const CLASS_NAMES = Object.freeze({\n carousel: 'peek-carousel',\n track: 'peek-carousel__track',\n item: 'peek-carousel__item',\n itemActive: 'peek-carousel__item--active',\n itemPrev: 'peek-carousel__item--prev',\n itemNext: 'peek-carousel__item--next',\n itemCenter: 'peek-carousel__item--center',\n itemHidden: 'peek-carousel__item--hidden',\n itemDraggingLeft: 'peek-carousel__item--dragging-left',\n itemDraggingRight: 'peek-carousel__item--dragging-right',\n figure: 'peek-carousel__figure',\n image: 'peek-carousel__image',\n caption: 'peek-carousel__caption',\n nav: 'peek-carousel__nav',\n navBtn: 'nav-btn',\n btn: 'peek-carousel__btn',\n prevBtn: 'prev-btn',\n nextBtn: 'next-btn',\n autoRotateBtn: 'auto-rotate-btn',\n btnAutoRotate: 'peek-carousel__btn--auto-rotate',\n btnActive: 'peek-carousel__btn--active',\n controls: 'peek-carousel__controls',\n indicators: 'peek-carousel__indicators',\n indicator: 'indicator',\n indicatorPeek: 'peek-carousel__indicator',\n indicatorActive: 'peek-carousel__indicator--active',\n indicatorProgress: 'peek-carousel__indicator--progress',\n indicatorCompleted: 'peek-carousel__indicator--completed',\n counter: 'peek-carousel__counter',\n counterCurrent: 'peek-carousel__counter-current',\n counterSeparator: 'peek-carousel__counter-separator',\n counterTotal: 'peek-carousel__counter-total',\n playIcon: 'play-icon',\n pauseIcon: 'pause-icon',\n});\n\nexport const SELECTORS = Object.freeze({\n carousel: '.peek-carousel__track',\n item: '.peek-carousel__item',\n indicator: '.indicator',\n prevBtn: '.prev-btn',\n nextBtn: '.next-btn',\n autoRotateBtn: '.auto-rotate-btn',\n playIcon: '.play-icon',\n pauseIcon: '.pause-icon',\n image: 'img',\n});\n\nexport const ARIA = Object.freeze({\n current: 'aria-current',\n selected: 'aria-selected',\n pressed: 'aria-pressed',\n label: 'aria-label',\n tabindex: 'tabindex',\n});\n\nexport const BREAKPOINTS = Object.freeze({\n mobile: 768, // [개발참고] px\n});\n\nexport const DURATIONS = Object.freeze({\n transition: 500, // [개발참고] ms\n progressReset: 10, // [개발참고] ms\n});\n\nexport const KEYS = Object.freeze({\n arrowLeft: 'ArrowLeft',\n arrowRight: 'ArrowRight',\n home: 'Home',\n end: 'End',\n space: ' ',\n});\n","export function getElement(selector) {\n if (typeof selector === 'string') {\n return document.querySelector(selector);\n }\n return selector instanceof HTMLElement ? selector : null;\n}\n\nexport function getElements(selector, parent = document) {\n if (typeof selector !== 'string') return [];\n return Array.from(parent.querySelectorAll(selector));\n}\n\nexport function addClass(element, ...classes) {\n if (element instanceof HTMLElement && classes.length > 0) {\n element.classList.add(...classes);\n }\n}\n\nexport function removeClass(element, ...classes) {\n if (element instanceof HTMLElement && classes.length > 0) {\n element.classList.remove(...classes);\n }\n}\n\nexport function toggleClass(element, className, force) {\n if (element instanceof HTMLElement && className) {\n element.classList.toggle(className, force);\n }\n}\n\nexport function setStyle(element, property, value) {\n if (element instanceof HTMLElement && property) {\n element.style[property] = value;\n }\n}\n\nexport function setCSSVar(element, property, value) {\n if (element instanceof HTMLElement && property) {\n element.style.setProperty(property, value);\n }\n}\n\nexport function setAttribute(element, name, value) {\n if (element instanceof HTMLElement && name) {\n element.setAttribute(name, value);\n }\n}\n\nexport function removeAttribute(element, name) {\n if (element instanceof HTMLElement && name) {\n element.removeAttribute(name);\n }\n}\n","const loadingCache = new Map();\n\nexport function preloadImage(src) {\n return new Promise((resolve, reject) => {\n if (!src) {\n reject(new Error('이미지 소스가 제공되지 않았습니다'));\n return;\n }\n\n if (loadingCache.has(src)) {\n return loadingCache.get(src);\n }\n\n const img = new Image();\n const promise = new Promise((res, rej) => {\n img.onload = () => {\n loadingCache.delete(src);\n res(img);\n };\n img.onerror = () => {\n loadingCache.delete(src);\n rej(new Error(`이미지 로드 실패: ${src}`));\n };\n img.src = src;\n });\n\n loadingCache.set(src, promise);\n promise.then(resolve, reject);\n });\n}\n\nexport function preloadImages(sources) {\n if (!sources || sources.length === 0) {\n return Promise.resolve([]);\n }\n\n const uniqueSources = [...new Set(sources)];\n return Promise.all(uniqueSources.map(src => preloadImage(src)));\n}\n\nexport function preloadImagesInRange(items, currentIndex, range) {\n if (!items || items.length === 0 || range < 0) {\n return;\n }\n\n const totalItems = items.length;\n const imagesToPreload = new Set();\n\n for (let distance = 1; distance <= range; distance++) {\n const prevIndex = (currentIndex - distance + totalItems) % totalItems;\n const nextIndex = (currentIndex + distance) % totalItems;\n\n const prevImg = items[prevIndex]?.querySelector('img');\n const nextImg = items[nextIndex]?.querySelector('img');\n\n if (prevImg && prevImg.src && !prevImg.complete) {\n imagesToPreload.add(prevImg.src);\n }\n if (nextImg && nextImg.src && !nextImg.complete) {\n imagesToPreload.add(nextImg.src);\n }\n }\n\n if (imagesToPreload.size > 0) {\n preloadImages([...imagesToPreload]).catch(err => {\n console.warn('일부 이미지 프리로드 실패:', err);\n });\n }\n}\n","const iconCache = new Map();\n\nfunction createSVGIcon(path, options = {}) {\n const {\n width = 24,\n height = 24,\n viewBox = '0 0 24 24',\n fill = 'none',\n stroke = 'currentColor',\n strokeWidth = 2,\n strokeLinecap = 'round',\n strokeLinejoin = 'round',\n className = '',\n } = options;\n\n const cacheKey = `${path}-${JSON.stringify(options)}`;\n if (iconCache.has(cacheKey)) {\n return iconCache.get(cacheKey);\n }\n\n const svg = `<svg width=\"${width}\" height=\"${height}\" viewBox=\"${viewBox}\" fill=\"${fill}\" xmlns=\"http://www.w3.org/2000/svg\" class=\"${className}\"><path d=\"${path}\" stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\" stroke-linecap=\"${strokeLinecap}\" stroke-linejoin=\"${strokeLinejoin}\"/></svg>`;\n\n iconCache.set(cacheKey, svg);\n return svg;\n}\n\nexport const ICONS = {\n prev: {\n path: 'M15 18L9 12L15 6',\n options: {},\n },\n next: {\n path: 'M9 18L15 12L9 6',\n options: {},\n },\n play: {\n path: 'M8 6.5v11l9-5.5z',\n options: {\n fill: 'currentColor',\n stroke: 'currentColor',\n strokeWidth: 0,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n },\n pause: {\n path: 'M7 5.5C7 5.22386 7.22386 5 7.5 5H9.5C9.77614 5 10 5.22386 10 5.5V18.5C10 18.7761 9.77614 19 9.5 19H7.5C7.22386 19 7 18.7761 7 18.5V5.5ZM14 5.5C14 5.22386 14.2239 5 14.5 5H16.5C16.7761 5 17 5.22386 17 5.5V18.5C17 18.7761 16.7761 19 16.5 19H14.5C14.2239 19 14 18.7761 14 18.5V5.5Z',\n options: {\n fill: 'currentColor',\n stroke: 'none',\n },\n },\n};\n\nexport function getIcon(iconName, customOptions = {}) {\n const icon = ICONS[iconName];\n if (!icon) {\n console.warn(`PeekCarousel: 아이콘 \"${iconName}\"을 찾을 수 없습니다`);\n return '';\n }\n\n const options = { ...icon.options, ...customOptions };\n return createSVGIcon(icon.path, options);\n}\n\nexport function injectIcon(button, iconName, options = {}) {\n if (!button || !(button instanceof HTMLElement)) return;\n\n if (button.querySelector('svg')) {\n return;\n }\n\n const iconHTML = getIcon(iconName, options);\n if (iconHTML) {\n button.innerHTML = iconHTML;\n }\n}\n\nexport function injectAutoRotateIcons(button) {\n if (!button || !(button instanceof HTMLElement)) return;\n\n if (button.querySelector('svg')) {\n return;\n }\n\n const playHTML = getIcon('play', { className: 'play-icon' });\n const pauseHTML = getIcon('pause', { className: 'pause-icon' });\n\n if (playHTML && pauseHTML) {\n button.innerHTML = playHTML + pauseHTML;\n }\n}\n","export function isMobile() {\n return window.innerWidth <= 768;\n}\n\nexport function normalizeIndex(index, length) {\n if (length <= 0) return 0;\n return ((index % length) + length) % length;\n}\n\nexport function clamp(value, min, max) {\n if (min > max) [min, max] = [max, min];\n return Math.min(Math.max(value, min), max);\n}\n\nexport function debounce(func, wait) {\n if (typeof func !== 'function') {\n throw new TypeError('첫 번째 인자는 함수여야 합니다');\n }\n\n let timeout;\n return function executedFunction(...args) {\n const context = this;\n const later = () => {\n clearTimeout(timeout);\n func.apply(context, args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n\nexport function throttle(func, limit) {\n if (typeof func !== 'function') {\n throw new TypeError('첫 번째 인자는 함수여야 합니다');\n }\n\n let inThrottle;\n return function executedFunction(...args) {\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n}\n","import { normalizeIndex } from '../utils/helpers.js';\n\nconst PROXIMITY_THRESHOLD = 2;\n\nexport class Navigator {\n constructor(carousel) {\n this.carousel = carousel;\n }\n\n get currentIndex() {\n return this.carousel.state.currentIndex;\n }\n\n set currentIndex(value) {\n this.carousel.state.currentIndex = normalizeIndex(value, this.carousel.totalItems);\n }\n\n getShortestDistance(from, to) {\n const total = this.carousel.totalItems;\n const normalizedTo = normalizeIndex(to, total);\n const normalizedFrom = normalizeIndex(from, total);\n\n const forwardDist = (normalizedTo - normalizedFrom + total) % total;\n const backwardDist = (normalizedFrom - normalizedTo + total) % total;\n\n return forwardDist <= backwardDist ? forwardDist : -backwardDist;\n }\n\n isNearby(from, to) {\n const distance = Math.abs(this.getShortestDistance(from, to));\n return distance <= PROXIMITY_THRESHOLD;\n }\n\n updateAfterNavigation() {\n this.carousel.animator.updateCarousel();\n this.carousel.updateCounter();\n\n if (this.carousel.options.preloadRange > 0) {\n this.carousel.preloadImages();\n }\n }\n\n rotate(direction) {\n this.currentIndex = this.currentIndex + direction;\n this.updateAfterNavigation();\n }\n\n next() {\n this.rotate(1);\n }\n\n prev() {\n this.rotate(-1);\n }\n\n goTo(index) {\n const normalizedIndex = normalizeIndex(index, this.carousel.totalItems);\n if (normalizedIndex === this.currentIndex) return;\n\n this.currentIndex = normalizedIndex;\n this.updateAfterNavigation();\n }\n\n navigateIfDifferent(targetIndex, callback) {\n const normalizedIndex = normalizeIndex(targetIndex, this.carousel.totalItems);\n if (normalizedIndex === this.currentIndex) return false;\n\n callback(normalizedIndex);\n return true;\n }\n\n handleItemClick(index) {\n this.navigateIfDifferent(index, (normalizedIndex) => {\n const { layoutMode } = this.carousel.options;\n\n if (layoutMode === 'radial') {\n this.handleRadialItemClick(normalizedIndex);\n } else {\n this.handleStackItemClick(normalizedIndex);\n }\n });\n }\n\n handleRadialItemClick(normalizedIndex) {\n const shortestDist = this.getShortestDistance(this.currentIndex, normalizedIndex);\n\n if (Math.abs(shortestDist) > 1) {\n const direction = shortestDist > 0 ? 1 : -1;\n this.rotate(direction);\n } else {\n this.rotate(shortestDist);\n }\n }\n\n handleStackItemClick(normalizedIndex) {\n if (this.isNearby(this.currentIndex, normalizedIndex)) {\n const shortestDist = this.getShortestDistance(this.currentIndex, normalizedIndex);\n this.rotate(shortestDist);\n } else {\n this.goTo(normalizedIndex);\n }\n }\n\n handleIndicatorClick(index) {\n this.navigateIfDifferent(index, (normalizedIndex) => {\n const { layoutMode } = this.carousel.options;\n\n if (layoutMode === 'radial') {\n const shortestDist = this.getShortestDistance(this.currentIndex, normalizedIndex);\n this.rotate(shortestDist);\n } else {\n this.goTo(normalizedIndex);\n }\n });\n }\n}\n","import { normalizeIndex } from '../utils/helpers.js';\nimport { CLASS_NAMES } from '../core/constants.js';\n\nconst RADIAL_RADIUS = 400;\n\nconst CLASSIC_POSITIONS = Object.freeze({\n center: { x: 50, scale: 1 },\n peek: { scale: 1 },\n hidden: { scale: 0.85 },\n});\n\nconst CLASSIC_SPACING = Object.freeze({\n gapPercent: 5,\n additionalMobile: 40,\n additionalDesktop: 15,\n mobileBreakpoint: 768,\n});\n\nconst MOMENTUM_CONFIG = Object.freeze({\n friction: 0.92,\n minVelocity: 0.05,\n navigationThreshold: 1.5,\n dampingFactor: 0.6,\n});\n\nconst STACK_POSITION_CLASSES = [\n CLASS_NAMES.itemCenter,\n CLASS_NAMES.itemPrev,\n CLASS_NAMES.itemNext,\n CLASS_NAMES.itemHidden,\n];\n\nexport class Animator {\n constructor(carousel) {\n this.carousel = carousel;\n this.momentumAnimation = null;\n this.isAnimating = false;\n }\n\n normalizeAngleDiff(diff) {\n return ((diff + 180) % 360) - 180;\n }\n\n round(value, decimals = 2) {\n return Math.round(value * 10 ** decimals) / 10 ** decimals;\n }\n\n getAdjacentIndices(currentIndex) {\n return {\n prev: normalizeIndex(currentIndex - 1, this.carousel.totalItems),\n next: normalizeIndex(currentIndex + 1, this.carousel.totalItems),\n };\n }\n\n setCarouselRotation(angle) {\n const rounded = this.round(angle, 2);\n this.carousel.container.style.setProperty('--carousel-rotation', `${rounded}deg`);\n }\n\n setCSSVariables(element, variables) {\n for (const [key, value] of Object.entries(variables)) {\n element.style.setProperty(key, value);\n }\n }\n\n updateRadialRotation(currentIndex) {\n const targetAngle = -this.carousel.state.angleUnit * currentIndex;\n const currentRotation = this.carousel.container.style.getPropertyValue('--carousel-rotation');\n\n if (!currentRotation || currentRotation === '0deg') {\n this.setCarouselRotation(targetAngle);\n return;\n }\n\n // [개발참고] 최단 경로 계산: -180 ~ 180 범위로 정규화\n const currentAngle = parseFloat(currentRotation);\n const diff = this.normalizeAngleDiff(targetAngle - currentAngle);\n const finalAngle = currentAngle + diff;\n this.setCarouselRotation(finalAngle);\n }\n\n updateCarousel() {\n const { currentIndex } = this.carousel.state;\n const { layoutMode } = this.carousel.options;\n\n if (layoutMode === 'stack' || layoutMode === 'classic') {\n this.setCarouselRotation(0);\n } else if (layoutMode === 'radial') {\n this.updateRadialRotation(currentIndex);\n }\n\n this.updateActiveItem();\n }\n\n updateActiveItem() {\n const { currentIndex } = this.carousel.state;\n const { layoutMode } = this.carousel.options;\n\n this.carousel.ui.updateActiveStates(currentIndex);\n\n if (layoutMode === 'radial') {\n this.updateRadialPositions(currentIndex);\n } else if (layoutMode === 'classic') {\n this.updateClassicPositions(currentIndex);\n } else {\n this.updateStackPositions(currentIndex);\n }\n }\n\n updateRadialPositions(currentIndex) {\n const { angleUnit } = this.carousel.state;\n\n for (let i = 0; i < this.carousel.items.length; i++) {\n const item = this.carousel.items[i];\n const angle = angleUnit * i;\n\n this.setCSSVariables(item, {\n '--item-angle': `${this.round(angle, 2)}deg`,\n '--item-radius': `${RADIAL_RADIUS}px`,\n });\n }\n\n const { prev, next } = this.getAdjacentIndices(currentIndex);\n this.carousel.ui.setPeekItems(prev, next);\n }\n\n updateStackPositions(currentIndex) {\n const { prev, next } = this.getAdjacentIndices(currentIndex);\n\n for (let i = 0; i < this.carousel.items.length; i++) {\n const item = this.carousel.items[i];\n\n item.classList.remove(...STACK_POSITION_CLASSES);\n\n if (i === currentIndex) {\n item.classList.add(CLASS_NAMES.itemCenter);\n } else if (i === prev) {\n item.classList.add(CLASS_NAMES.itemPrev);\n } else if (i === next) {\n item.classList.add(CLASS_NAMES.itemNext);\n } else {\n item.classList.add(CLASS_NAMES.itemHidden);\n }\n }\n }\n\n calculateClassicSpacing(containerWidth) {\n const itemWidth = Math.max(300, Math.min(containerWidth * 0.35, 500));\n const isMobile = containerWidth <= CLASSIC_SPACING.mobileBreakpoint;\n\n const itemHalfPercent = (itemWidth / containerWidth) * 50;\n const baseSpacing = itemHalfPercent + CLASSIC_SPACING.gapPercent;\n const additionalSpacing = isMobile\n ? CLASSIC_SPACING.additionalMobile\n : CLASSIC_SPACING.additionalDesktop;\n\n return baseSpacing + additionalSpacing;\n }\n\n getClassicItemPosition(itemIndex, currentIndex, itemSpacing) {\n const { prev, next } = this.getAdjacentIndices(currentIndex);\n\n if (itemIndex === currentIndex) {\n return {\n x: CLASSIC_POSITIONS.center.x,\n scale: CLASSIC_POSITIONS.center.scale,\n };\n }\n\n if (itemIndex === prev) {\n return {\n x: CLASSIC_POSITIONS.center.x - itemSpacing,\n scale: CLASSIC_POSITIONS.peek.scale,\n };\n }\n\n if (itemIndex === next) {\n return {\n x: CLASSIC_POSITIONS.center.x + itemSpacing,\n scale: CLASSIC_POSITIONS.peek.scale,\n };\n }\n\n const distanceFromCurrent = itemIndex - currentIndex;\n return {\n x: distanceFromCurrent < 0\n ? CLASSIC_POSITIONS.center.x - itemSpacing * 2\n : CLASSIC_POSITIONS.center.x + itemSpacing * 2,\n scale: CLASSIC_POSITIONS.hidden.scale,\n };\n }\n\n updateClassicPositions(currentIndex) {\n const { prev, next } = this.getAdjacentIndices(currentIndex);\n const containerWidth = this.carousel.container.offsetWidth;\n const itemSpacing = this.calculateClassicSpacing(containerWidth);\n\n for (let i = 0; i < this.carousel.items.length; i++) {\n const item = this.carousel.items[i];\n const { x, scale } = this.getClassicItemPosition(i, currentIndex, itemSpacing);\n\n this.setCSSVariables(item, {\n '--item-x': `${this.round(x, 2)}%`,\n '--item-scale': String(scale),\n });\n }\n\n this.carousel.ui.setPeekItems(prev, next);\n }\n\n startMomentum(velocity) {\n this.stopMomentum();\n\n let currentVelocity = velocity;\n\n const momentumStep = () => {\n currentVelocity *= MOMENTUM_CONFIG.friction;\n\n if (Math.abs(currentVelocity) < MOMENTUM_CONFIG.minVelocity) {\n this.stopMomentum();\n return;\n }\n\n if (Math.abs(currentVelocity) > MOMENTUM_CONFIG.navigationThreshold) {\n const direction = currentVelocity > 0 ? -1 : 1;\n this.carousel.navigator.rotate(direction);\n currentVelocity *= MOMENTUM_CONFIG.dampingFactor;\n }\n\n this.momentumAnimation = requestAnimationFrame(momentumStep);\n };\n\n this.isAnimating = true;\n this.momentumAnimation = requestAnimationFrame(momentumStep);\n }\n\n stopMomentum() {\n if (this.momentumAnimation) {\n cancelAnimationFrame(this.momentumAnimation);\n this.momentumAnimation = null;\n }\n this.isAnimating = false;\n }\n}\n","export class AutoRotate {\n constructor(carousel) {\n this.carousel = carousel;\n this.interval = null;\n this.isActive = false;\n }\n\n setActiveState(isActive) {\n this.isActive = isActive;\n this.carousel.ui.updateAutoRotateButton(isActive);\n }\n\n toggle() {\n this.isActive ? this.stop() : this.start();\n }\n\n start() {\n if (this.isActive) return;\n\n this.setActiveState(true);\n\n const rotateInterval = this.carousel.options.autoRotateInterval;\n this.interval = setInterval(() => {\n this.carousel.navigator.next();\n }, rotateInterval);\n }\n\n stop() {\n if (!this.isActive) return;\n\n this.setActiveState(false);\n\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n }\n\n destroy() {\n this.stop();\n this.carousel = null;\n }\n}\n","import { KEYS, BREAKPOINTS } from '../core/constants.js';\nimport { isMobile } from '../utils/helpers.js';\n\nconst WHEEL_CONFIG = Object.freeze({\n threshold: 50,\n timeout: 150,\n cooldown: 100,\n});\n\nconst DRAG_CONFIG = Object.freeze({\n touchThreshold: 15,\n mouseThreshold: 10,\n velocityThreshold: 0.5,\n});\n\nconst RESIZE_DEBOUNCE = 100;\n\nexport class EventHandler {\n constructor(carousel) {\n this.carousel = carousel;\n this.boundHandlers = new Map();\n\n this.touch = {\n startX: 0,\n endX: 0,\n };\n\n this.drag = {\n active: false,\n startX: 0,\n currentX: 0,\n lastX: 0,\n lastTime: 0,\n velocity: 0,\n };\n\n this.wheel = {\n isScrolling: false,\n scrollTimeout: null,\n lastWheelTime: 0,\n accumulatedDelta: 0,\n };\n }\n\n init() {\n this.initNavigationButtons();\n this.initKeyboard();\n this.initWheel();\n this.initItemClick();\n this.initIndicatorClick();\n this.initTouch();\n this.initMouse();\n this.initResize();\n }\n\n stopAutoRotateAndNavigate(navigationFn) {\n this.completeCurrentIndicator();\n this.carousel.autoRotate.stop();\n navigationFn();\n }\n\n completeCurrentIndicator() {\n const currentIndicator = this.carousel.indicators[this.carousel.state.currentIndex];\n if (currentIndicator && currentIndicator.classList.contains('peek-carousel__indicator--active')) {\n currentIndicator.classList.add('peek-carousel__indicator--completed');\n }\n }\n\n resetDragState(index) {\n this.carousel.ui.removeDraggingClass(index);\n this.carousel.ui.clearDragTransform();\n }\n\n updateDraggingClass(dragDistance, currentIndex, threshold) {\n if (dragDistance > threshold) {\n this.carousel.ui.addDraggingClass(currentIndex, 'right');\n } else if (dragDistance < -threshold) {\n this.carousel.ui.addDraggingClass(currentIndex, 'left');\n }\n }\n\n initDragState(clientX) {\n this.drag.active = true;\n this.drag.startX = clientX;\n this.drag.currentX = clientX;\n this.drag.lastX = clientX;\n this.drag.lastTime = Date.now();\n this.drag.velocity = 0;\n }\n\n resetMouseCursor() {\n this.carousel.elements.carousel.style.cursor = 'grab';\n }\n\n calculateWheelDelta(e) {\n const deltaX = Math.abs(e.deltaX);\n const deltaY = Math.abs(e.deltaY);\n const isHorizontal = deltaX > deltaY;\n\n // [개발참고] 수평: 왼쪽(-) = 다음, 오른쪽(+) = 이전\n // 수직: 아래(+) = 다음, 위(-) = 이전\n return isHorizontal ? -e.deltaX : e.deltaY;\n }\n\n resetWheelState() {\n this.wheel.isScrolling = false;\n this.wheel.accumulatedDelta = 0;\n }\n\n initNavigationButtons() {\n const { prevBtn, nextBtn, autoRotateBtn } = this.carousel.elements;\n\n if (prevBtn) {\n this.addHandler(prevBtn, 'click', () => {\n this.stopAutoRotateAndNavigate(() => this.carousel.navigator.prev());\n });\n }\n\n if (nextBtn) {\n this.addHandler(nextBtn, 'click', () => {\n this.stopAutoRotateAndNavigate(() => this.carousel.navigator.next());\n });\n }\n\n if (autoRotateBtn) {\n this.addHandler(autoRotateBtn, 'click', () => {\n this.carousel.autoRotate.toggle();\n });\n }\n }\n\n initKeyboard() {\n if (!this.carousel.options.enableKeyboard) return;\n\n const handler = (e) => {\n const { navigator, autoRotate, totalItems } = this.carousel;\n\n switch (e.key) {\n case KEYS.arrowLeft:\n autoRotate.stop();\n navigator.prev();\n break;\n\n case KEYS.arrowRight:\n autoRotate.stop();\n navigator.next();\n break;\n\n case KEYS.home:\n e.preventDefault();\n autoRotate.stop();\n navigator.goTo(0);\n break;\n\n case KEYS.end:\n e.preventDefault();\n autoRotate.stop();\n navigator.goTo(totalItems - 1);\n break;\n\n case KEYS.space:\n e.preventDefault();\n autoRotate.toggle();\n break;\n\n default:\n const numKey = parseInt(e.key);\n if (numKey >= 1 && numKey <= totalItems) {\n e.preventDefault();\n autoRotate.stop();\n navigator.goTo(numKey - 1);\n }\n }\n };\n\n this.addHandler(document, 'keydown', handler);\n }\n\n initWheel() {\n if (!this.carousel.options.enableWheel) return;\n\n const handler = (e) => {\n const deltaX = Math.abs(e.deltaX);\n const deltaY = Math.abs(e.deltaY);\n\n if (deltaX < 1 && deltaY < 1) {\n return;\n }\n\n if (deltaX === deltaY) {\n return;\n }\n\n e.preventDefault();\n\n const currentTime = Date.now();\n\n if (currentTime - this.wheel.lastWheelTime < WHEEL_CONFIG.cooldown) {\n return;\n }\n\n if (!this.wheel.isScrolling) {\n this.wheel.isScrolling = true;\n this.wheel.accumulatedDelta = 0;\n this.carousel.autoRotate.stop();\n this.carousel.animator.stopMomentum();\n }\n\n this.wheel.accumulatedDelta += this.calculateWheelDelta(e);\n\n if (Math.abs(this.wheel.accumulatedDelta) >= WHEEL_CONFIG.threshold) {\n const direction = this.wheel.accumulatedDelta > 0 ? 1 : -1;\n this.carousel.navigator.rotate(direction);\n\n this.wheel.accumulatedDelta = 0;\n this.wheel.lastWheelTime = currentTime;\n }\n\n clearTimeout(this.wheel.scrollTimeout);\n this.wheel.scrollTimeout = setTimeout(() => {\n this.resetWheelState();\n }, WHEEL_CONFIG.timeout);\n };\n\n this.addHandler(\n this.carousel.elements.carousel,\n 'wheel',\n handler,\n { passive: false }\n );\n }\n\n initItemClick() {\n const { items } = this.carousel;\n for (let i = 0; i < items.length; i++) {\n this.addHandler(items[i], 'click', () => {\n this.carousel.autoRotate.stop();\n this.carousel.navigator.handleItemClick(i);\n });\n }\n }\n\n initIndicatorClick() {\n const { indicators } = this.carousel;\n for (let i = 0; i < indicators.length; i++) {\n this.addHandler(indicators[i], 'click', () => {\n this.carousel.autoRotate.stop();\n this.carousel.navigator.handleIndicatorClick(i);\n });\n }\n }\n\n initTouch() {\n if (!this.carousel.options.enableTouch) return;\n\n this.addHandler(this.carousel.elements.carousel, 'touchstart', (e) => {\n this.touch.startX = e.changedTouches[0].screenX;\n });\n\n this.addHandler(this.carousel.elements.carousel, 'touchmove', (e) => {\n const touchCurrentX = e.changedTouches[0].screenX;\n const dragDistance = touchCurrentX - this.touch.startX;\n const { currentIndex } = this.carousel.state;\n\n this.carousel.ui.updateDragTransform(dragDistance);\n this.updateDraggingClass(dragDistance, currentIndex, DRAG_CONFIG.touchThreshold);\n });\n\n this.addHandler(this.carousel.elements.carousel, 'touchend', (e) => {\n this.touch.endX = e.changedTouches[0].screenX;\n const swipeDistance = this.touch.endX - this.touch.startX;\n const { swipeThreshold } = this.carousel.options;\n const { currentIndex } = this.carousel.state;\n\n this.resetDragState(currentIndex);\n\n if (swipeDistance < -swipeThreshold) {\n this.carousel.autoRotate.stop();\n this.carousel.navigator.next();\n } else if (swipeDistance > swipeThreshold) {\n this.carousel.autoRotate.stop();\n this.carousel.navigator.prev();\n }\n });\n }\n\n initMouse() {\n if (!this.carousel.options.enableMouse) return;\n\n this.addHandler(this.carousel.elements.carousel, 'mousedown', (e) => {\n if (isMobile()) return;\n\n this.initDragState(e.clientX);\n this.carousel.autoRotate.stop();\n this.carousel.animator.stopMomentum();\n this.carousel.elements.carousel.style.cursor = 'grabbing';\n e.preventDefault();\n });\n\n this.addHandler(document, 'mousemove', (e) => {\n if (!this.drag.active) return;\n\n const currentTime = Date.now();\n const deltaTime = currentTime - this.drag.lastTime;\n const deltaX = e.clientX - this.drag.lastX;\n\n if (deltaTime > 0) {\n this.drag.velocity = deltaX / deltaTime;\n }\n\n this.drag.currentX = e.clientX;\n this.drag.lastX = e.clientX;\n this.drag.lastTime = currentTime;\n\n const dragDistance = this.drag.currentX - this.drag.startX;\n const { currentIndex } = this.carousel.state;\n\n this.carousel.ui.updateDragTransform(dragDistance);\n this.updateDraggingClass(dragDistance, currentIndex, DRAG_CONFIG.mouseThreshold);\n\n if (Math.abs(dragDistance) > this.carousel.options.dragThreshold) {\n const direction = dragDistance > 0 ? -1 : 1;\n this.carousel.navigator.rotate(direction);\n this.drag.startX = this.drag.currentX;\n this.resetDragState(currentIndex);\n }\n });\n\n this.addHandler(document, 'mouseup', () => {\n if (!this.drag.active) return;\n\n this.drag.active = false;\n this.resetMouseCursor();\n\n const { currentIndex } = this.carousel.state;\n this.resetDragState(currentIndex);\n\n if (Math.abs(this.drag.velocity) > DRAG_CONFIG.velocityThreshold) {\n this.carousel.animator.startMomentum(this.drag.velocity);\n }\n });\n\n this.addHandler(this.carousel.elements.carousel, 'mouseleave', () => {\n if (this.drag.active) {\n this.drag.active = false;\n this.resetMouseCursor();\n\n const { currentIndex } = this.carousel.state;\n this.resetDragState(currentIndex);\n }\n });\n\n if (window.innerWidth > BREAKPOINTS.mobile) {\n this.resetMouseCursor();\n }\n }\n\n initResize() {\n let resizeTimer;\n const handler = () => {\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(() => {\n this.carousel.animator.updateCarousel();\n }, RESIZE_DEBOUNCE);\n };\n\n this.addHandler(window, 'resize', handler);\n }\n\n addHandler(element, event, handler, options) {\n element.addEventListener(event, handler, options);\n\n const key = `${event}-${Date.now()}-${Math.random()}`;\n this.boundHandlers.set(key, { element, event, handler, options });\n }\n\n destroy() {\n if (this.wheel.scrollTimeout) {\n clearTimeout(this.wheel.scrollTimeout);\n this.wheel.scrollTimeout = null;\n }\n\n for (const { element, event, handler, options } of this.boundHandlers.values()) {\n element.removeEventListener(event, handler, options);\n }\n this.boundHandlers.clear();\n\n this.carousel = null;\n }\n}\n","import { CLASS_NAMES, ARIA, DURATIONS } from '../core/constants.js';\nimport { addClass, removeClass, setAttribute, setCSSVar } from '../utils/dom.js';\n\nconst DRAG_TRANSFORM_CONFIG = Object.freeze({\n stack: {\n maxDrag: 200,\n offsetMultiplier: 100,\n rotationMultiplier: 3,\n },\n radial: {\n rotationSensitivity: 0.2,\n },\n classic: {\n dragSensitivity: 0.5,\n },\n});\n\nexport class UIManager {\n constructor(carousel) {\n this.carousel = carousel;\n }\n\n updateActiveStates(currentIndex) {\n for (let i = 0; i < this.carousel.items.length; i++) {\n const item = this.carousel.items[i];\n removeClass(item, CLASS_NAMES.itemActive, CLASS_NAMES.itemPrev, CLASS_NAMES.itemNext);\n item.removeAttribute(ARIA.current);\n }\n\n for (let i = 0; i < this.carousel.indicators.length; i++) {\n const indicator = this.carousel.indicators[i];\n removeClass(\n indicator,\n CLASS_NAMES.indicatorActive,\n CLASS_NAMES.indicatorProgress\n );\n setAttribute(indicator, ARIA.selected, 'false');\n setAttribute(indicator, ARIA.tabindex, '-1');\n }\n\n const currentItem = this.carousel.items[currentIndex];\n const currentIndicator = this.carousel.indicators[currentIndex];\n\n if (currentItem) {\n addClass(currentItem, CLASS_NAMES.itemActive);\n setAttribute(currentItem, ARIA.current, 'true');\n }\n\n if (currentIndicator) {\n removeClass(currentIndicator, CLASS_NAMES.indicatorCompleted);\n addClass(currentIndicator, CLASS_NAMES.indicatorActive);\n setAttribute(currentIndicator, ARIA.selected, 'true');\n setAttribute(currentIndicator, ARIA.tabindex, '0');\n\n if (this.carousel.autoRotate.isActive) {\n this.updateIndicatorProgress(currentIndicator);\n }\n }\n }\n\n updateIndicatorProgress(indicator) {\n setCSSVar(\n indicator,\n '--progress-duration',\n `${this.carousel.options.autoRotateInterval}ms`\n );\n\n setTimeout(() => {\n if (indicator) {\n addClass(indicator, CLASS_NAMES.indicatorProgress);\n }\n }, DURATIONS.progressReset);\n }\n\n clearPeekItems() {\n for (let i = 0; i < this.carousel.items.length; i++) {\n const item = this.carousel.items[i];\n removeClass(item, CLASS_NAMES.itemPrev, CLASS_NAMES.itemNext);\n }\n }\n\n setPeekItems(prevIndex, nextIndex) {\n const prevItem = this.carousel.items[prevIndex];\n const nextItem = this.carousel.items[nextIndex];\n\n if (prevItem) addClass(prevItem, CLASS_NAMES.itemPrev);\n if (nextItem) addClass(nextItem, CLASS_NAMES.itemNext);\n }\n\n updateAutoRotateButton(isActive) {\n const { autoRotateBtn } = this.carousel.elements;\n if (!autoRotateBtn) return;\n\n if (isActive) {\n addClass(autoRotateBtn, CLASS_NAMES.btnActive);\n setAttribute(autoRotateBtn, ARIA.pressed, 'true');\n } else {\n removeClass(autoRotateBtn, CLASS_NAMES.btnActive);\n setAttribute(autoRotateBtn, ARIA.pressed, 'false');\n }\n }\n\n addDraggingClass(index, direction) {\n const item = this.carousel.items[index];\n if (!item) return;\n\n const leftClass = CLASS_NAMES.itemDraggingLeft;\n const rightClass = CLASS_NAMES.itemDraggingRight;\n\n removeClass(item, leftClass, rightClass);\n\n if (direction === 'left') {\n addClass(item, leftClass);\n } else if (direction === 'right') {\n addClass(item, rightClass);\n }\n }\n\n removeDraggingClass(index) {\n const item = this.carousel.items[index];\n if (!item) return;\n\n removeClass(item, CLASS_NAMES.itemDraggingLeft, CLASS_NAMES.itemDraggingRight);\n }\n\n round(value, decimals = 2) {\n return Math.round(value * 10 ** decimals) / 10 ** decimals;\n }\n\n applyEasing(progress) {\n return progress * (2 - Math.abs(progress));\n }\n\n updateDragTransform(dragDistance) {\n const { layoutMode } = this.carousel.options;\n\n if (layoutMode === 'stack') {\n // [개발참고] Stack 모드: 탄성 효과 적용 (easeOutQuad)\n const config = DRAG_TRANSFORM_CONFIG.stack;\n const clampedDrag = Math.max(-config.maxDrag, Math.min(config.maxDrag, dragDistance));\n const progress = clampedDrag / config.maxDrag;\n const easedProgress = this.applyEasing(progress);\n\n const dragOffset = this.round(easedProgress * config.offsetMultiplier);\n const dragRotation = this.round(easedProgress * config.rotationMultiplier);\n\n this.carousel.container.style.setProperty('--drag-offset', `${dragOffset}px`);\n this.carousel.container.style.setProperty('--drag-rotation', `${dragRotation}deg`);\n } else if (layoutMode === 'radial') {\n const config = DRAG_TRANSFORM_CONFIG.radial;\n const dragRotation = this.round(dragDistance * config.rotationSensitivity);\n\n this.carousel.container.style.setProperty('--drag-rotation-y', `${dragRotation}deg`);\n } else if (layoutMode === 'classic') {\n const config = DRAG_TRANSFORM_CONFIG.classic;\n const dragOffset = this.round(dragDistance * config.dragSensitivity);\n\n this.carousel.container.style.setProperty('--drag-offset', `${dragOffset}px`);\n }\n }\n\n clearDragTransform() {\n this.carousel.container.style.setProperty('--drag-offset', '0px');\n this.carousel.container.style.setProperty('--drag-rotation', '0deg');\n this.carousel.container.style.setProperty('--drag-rotation-y', '0deg');\n }\n\n destroy() {\n }\n}\n","import { validateOptions } from './config.js';\nimport { SELECTORS, CLASS_NAMES } from './constants.js';\nimport { getElement, getElements } from '../utils/dom.js';\nimport { preloadImagesInRange } from '../utils/preloader.js';\nimport { injectIcon, injectAutoRotateIcons } from '../utils/icons.js';\nimport { Navigator } from '../modules/Navigator.js';\nimport { Animator } from '../modules/Animator.js';\nimport { AutoRotate } from '../modules/AutoRotate.js';\nimport { EventHandler } from '../modules/EventHandler.js';\nimport { UIManager } from '../modules/UIManager.js';\n\nconst FULL_CIRCLE_DEGREES = 360;\n\nclass PeekCarousel {\n constructor(selector, options = {}) {\n this.container = getElement(selector);\n if (!this.container) {\n throw new Error(`PeekCarousel: 셀렉터 \"${selector}\"에 해당하는 컨테이너를 찾을 수 없습니다`);\n }\n\n this.options = validateOptions(options);\n this.initElements();\n\n if (this.items.length === 0) {\n throw new Error('PeekCarousel: 캐러셀 아이템을 찾을 수 없습니다');\n }\n\n this.state = {\n currentIndex: this.options.startIndex,\n angleUnit: FULL_CIRCLE_DEGREES / this.totalItems,\n };\n\n this.initModules();\n this.init();\n }\n\n initElements() {\n this.elements = {\n carousel: this.container.querySelector(SELECTORS.carousel),\n prevBtn: null,\n nextBtn: null,\n autoRotateBtn: null,\n controls: null,\n nav: null,\n };\n\n this.items = getElements(SELECTORS.item, this.container);\n this.totalItems = this.items.length;\n this.indicators = [];\n }\n\n initModules() {\n this.navigator = new Navigator(this);\n this.animator = new Animator(this);\n this.autoRotate = new AutoRotate(this);\n this.eventHandler = new EventHandler(this);\n this.ui = new UIManager(this);\n }\n\n init() {\n this.updateLayoutClass();\n this.createNavigation();\n this.createControls();\n this.injectIcons();\n this.createCounter();\n this.setImageLoadingAttributes();\n this.initCSSVariables();\n\n this.eventHandler.init();\n this.animator.updateCarousel();\n\n if (this.options.autoRotate) {\n this.autoRotate.start();\n }\n\n if (this.options.preloadRange > 0) {\n this.preloadImages();\n }\n }\n\n initCSSVariables() {\n this.container.style.setProperty('--carousel-rotation', '0deg');\n this.container.style.setProperty('--drag-offset', '0px');\n this.container.style.setProperty('--drag-rotation', '0deg');\n this.container.style.setProperty('--drag-rotation-y', '0deg');\n }\n\n createNavigation() {\n if (!this.options.showNavigation) return;\n\n const existingNav = this.container.querySelector(`.${CLASS_NAMES.nav}`);\n if (existingNav) {\n this.elements.nav = existingNav;\n this.elements.prevBtn = existingNav.querySelector(SELECTORS.prevBtn);\n this.elements.nextBtn = existingNav.querySelector(SELECTORS.nextBtn);\n return;\n }\n\n const nav = document.createElement('div');\n nav.className = CLASS_NAMES.nav;\n\n const prevBtn = document.createElement('button');\n prevBtn.className = `${CLASS_NAMES.navBtn} ${CLASS_NAMES.btn} ${CLASS_NAMES.prevBtn}`;\n prevBtn.setAttribute('aria-label', 'Previous');\n\n const nextBtn = document.createElement('button');\n nextBtn.className = `${CLASS_NAMES.navBtn} ${CLASS_NAMES.btn} ${CLASS_NAMES.nextBtn}`;\n nextBtn.setAttribute('aria-label', 'Next');\n\n nav.appendChild(prevBtn);\n nav.appendChild(nextBtn);\n this.container.appendChild(nav);\n\n this.elements.nav = nav;\n this.elements.prevBtn = prevBtn;\n this.elements.nextBtn = nextBtn;\n }\n\n createControls() {\n if (!this.options.showIndicators && !this.options.showAutoRotateButton) return;\n\n const existingControls = this.container.querySelector(`.${CLASS_NAMES.controls}`);\n if (existingControls) {\n this.elements.controls = existingControls;\n const indicatorsWrapper = existingControls.querySelector(`.${CLASS_NAMES.indicators}`);\n if (indicatorsWrapper && this.options.showIndicators) {\n indicatorsWrapper.innerHTML = '';\n this.createIndicators(indicatorsWrapper);\n }\n this.elements.autoRotateBtn = existingControls.querySelector(SELECTORS.autoRotateBtn);\n return;\n }\n\n const controls = document.createElement('div');\n controls.className = CLASS_NAMES.controls;\n\n if (this.options.showIndicators) {\n const indicatorsWrapper = document.createElement('div');\n indicatorsWrapper.className = CLASS_NAMES.indicators;\n this.createIndicators(indicatorsWrapper);\n controls.appendChild(indicatorsWrapper);\n }\n\n if (this.options.showAutoRotateButton) {\n const autoRotateBtn = document.createElement('button');\n autoRotateBtn.className = `${CLASS_NAMES.autoRotateBtn} ${CLASS_NAMES.btn} ${CLASS_NAMES.btnAutoRotate}`;\n autoRotateBtn.setAttribute('aria-label', 'Toggle auto-rotate');\n autoRotateBtn.setAttribute('aria-pressed', 'false');\n controls.appendChild(autoRotateBtn);\n this.elements.autoRotateBtn = autoRotateBtn;\n }\n\n this.container.appendChild(controls);\n this.elements.controls = controls;\n }\n\n createIndicators(wrapper) {\n this.indicators = [];\n\n for (let i = 0; i < this.totalItems; i++) {\n const indicator = document.createElement('button');\n const isActive = i === this.state.currentIndex;\n\n indicator.className = CLASS_NAMES.indicator;\n indicator.classList.add(CLASS_NAMES.indicatorPeek);\n indicator.setAttribute('role', 'tab');\n indicator.setAttribute('aria-label', `Image ${i + 1}`);\n indicator.setAttribute('aria-selected', isActive ? 'true' : 'false');\n indicator.setAttribute('tabindex', isActive ? '0' : '-1');\n\n if (isActive) {\n indicator.classList.add(CLASS_NAMES.indicatorActive);\n }\n\n wrapper.appendChild(indicator);\n this.indicators.push(indicator);\n }\n }\n\n injectIcons() {\n const { prevBtn, nextBtn, autoRotateBtn } = this.elements;\n\n if (prevBtn) injectIcon(prevBtn, 'prev');\n if (nextBtn) injectIcon(nextBtn, 'next');\n if (autoRotateBtn) injectAutoRotateIcons(autoRotateBtn);\n }\n\n createCounter() {\n if (!this.options.showCounter) return;\n\n const existingCounter = this.container.querySelector(`.${CLASS_NAMES.counter}`);\n if (existingCounter) {\n this.counterElement = existingCounter;\n this.updateCounter();\n return;\n }\n\n const counter = document.createElement('div');\n counter.className = CLASS_NAMES.counter;\n counter.setAttribute('aria-live', 'polite');\n counter.setAttribute('aria-atomic', 'true');\n\n counter.innerHTML = `\n <span class=\"${CLASS_NAMES.counterCurrent}\">${this.state.currentIndex + 1}</span>\n <span class=\"${CLASS_NAMES.counterSeparator}\">/</span>\n <span class=\"${CLASS_NAMES.counterTotal}\">${this.totalItems}</span>\n `;\n\n this.container.appendChild(counter);\n this.counterElement = counter;\n }\n\n updateCounter() {\n if (!this.counterElement) return;\n\n const currentSpan = this.counterElement.querySelector(`.${CLASS_NAMES.counterCurrent}`);\n if (currentSpan) {\n currentSpan.textContent = this.state.currentIndex + 1;\n }\n }\n\n setImageLoadingAttributes() {\n const { startIndex } = this.options;\n const preloadRange = this.options.preloadRange || 1;\n\n for (let index = 0; index < this.items.length; index++) {\n const item = this.items[index];\n const img = item.querySelector(`.${CLASS_NAMES.image}`);\n if (!img || img.hasAttribute('loading')) continue;\n\n const distance = Math.abs(index - startIndex);\n const isNearby = distance <= preloadRange;\n img.setAttribute('loading', isNearby ? 'eager' : 'lazy');\n }\n }\n\n updateLayoutClass() {\n const currentMode = this.currentLayoutMode;\n const newMode = this.options.layoutMode;\n\n if (currentMode && currentMode !== newMode) {\n this.container.classList.remove(`peek-carousel--${currentMode}`);\n }\n\n this.container.classList.add(`peek-carousel--${newMode}`);\n this.currentLayoutMode = newMode;\n }\n\n preloadImages() {\n preloadImagesInRange(this.items, this.state.currentIndex, this.options.preloadRange);\n }\n\n // [개발참고] Public API\n next() {\n this.navigator.next();\n }\n\n prev() {\n this.navigator.prev();\n }\n\n goTo(index) {\n this.navigator.goTo(index);\n }\n\n startAutoRotate() {\n this.autoRotate.start();\n }\n\n stopAutoRotate() {\n this.autoRotate.stop();\n }\n\n toggleAutoRotate() {\n this.autoRotate.toggle();\n }\n\n destroy() {\n this.autoRotate.destroy();\n this.animator.stopMomentum();\n this.eventHandler.destroy();\n this.ui.destroy();\n }\n\n get currentIndex() {\n return this.state.currentIndex;\n }\n\n get isAutoRotating() {\n return this.autoRotate.isActive;\n }\n}\n\nexport default PeekCarousel;\n"],"names":["LAYOUT_MODES","Object","freeze","STACK","RADIAL","CLASSIC","DEFAULT_OPTIONS","startIndex","layoutMode","autoRotate","autoRotateInterval","preloadRange","swipeThreshold","dragThreshold","enableKeyboard","enableWheel","enableTouch","enableMouse","showNavigation","showCounter","showIndicators","showAutoRotateButton","CLASS_NAMES","carousel","track","item","itemActive","itemPrev","itemNext","itemCenter","itemHidden","itemDraggingLeft","itemDraggingRight","figure","image","caption","nav","navBtn","btn","prevBtn","nextBtn","autoRotateBtn","btnAutoRotate","btnActive","controls","indicators","indicator","indicatorPeek","indicatorActive","indicatorProgress","indicatorCompleted","counter","counterCurrent","counterSeparator","counterTotal","playIcon","pauseIcon","SELECTORS","ARIA","current","selected","pressed","label","tabindex","BREAKPOINTS","mobile","DURATIONS","transition","progressReset","KEYS","arrowLeft","arrowRight","home","end","space","addClass","element","classes","HTMLElement","length","classList","add","removeClass","remove","setAttribute","name","value","loadingCache","Map","preloadImages","sources","Promise","resolve","uniqueSources","Set","all","map","src","reject","Error","has","get","img","Image","promise","res","rej","onload","delete","onerror","set","then","preloadImage","iconCache","ICONS","prev","path","options","next","play","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","pause","getIcon","iconName","customOptions","icon","console","warn","width","height","viewBox","className","cacheKey","JSON","stringify","svg","createSVGIcon","injectIcon","button","querySelector","iconHTML","innerHTML","normalizeIndex","index","Navigator","constructor","this","currentIndex","state","totalItems","getShortestDistance","from","to","total","normalizedTo","normalizedFrom","forwardDist","backwardDist","isNearby","Math","abs","updateAfterNavigation","animator","updateCarousel","updateCounter","rotate","direction","goTo","normalizedIndex","navigateIfDifferent","targetIndex","callback","handleItemClick","handleRadialItemClick","handleStackItemClick","shortestDist","handleIndicatorClick","CLASSIC_POSITIONS","center","x","scale","peek","hidden","CLASSIC_SPACING","gapPercent","additionalMobile","additionalDesktop","mobileBreakpoint","MOMENTUM_CONFIG","friction","minVelocity","navigationThreshold","dampingFactor","STACK_POSITION_CLASSES","Animator","momentumAnimation","isAnimating","normalizeAngleDiff","diff","round","decimals","getAdjacentIndices","setCarouselRotation","angle","rounded","container","style","setProperty","setCSSVariables","variables","key","entries","updateRadialRotation","targetAngle","angleUnit","currentRotation","getPropertyValue","currentAngle","parseFloat","finalAngle","updateActiveItem","ui","updateActiveStates","updateRadialPositions","updateClassicPositions","updateStackPositions","i","items","setPeekItems","calculateClassicSpacing","containerWidth","itemWidth","max","min","isMobile","getClassicItemPosition","itemIndex","itemSpacing","offsetWidth","String","startMomentum","velocity","stopMomentum","currentVelocity","momentumStep","navigator","requestAnimationFrame","cancelAnimationFrame","AutoRotate","interval","isActive","setActiveState","updateAutoRotateButton","toggle","stop","start","rotateInterval","setInterval","clearInterval","destroy","WHEEL_CONFIG","threshold","timeout","cooldown","DRAG_CONFIG","touchThreshold","mouseThreshold","velocityThreshold","EventHandler","boundHandlers","touch","startX","endX","drag","active","currentX","lastX","lastTime","wheel","isScrolling","scrollTimeout","lastWheelTime","accumulatedDelta","init","initNavigationButtons","initKeyboard","initWheel","initItemClick","initIndicatorClick","initTouch","initMouse","initResize","stopAutoRotateAndNavigate","navigationFn","completeCurrentIndicator","currentIndicator","contains","resetDragState","removeDraggingClass","clearDragTransform","updateDraggingClass","dragDistance","addDraggingClass","initDragState","clientX","Date","now","resetMouseCursor","elements","cursor","calculateWheelDelta","e","deltaX","deltaY","resetWheelState","addHandler","document","preventDefault","numKey","parseInt","currentTime","clearTimeout","setTimeout","passive","changedTouches","screenX","updateDragTransform","swipeDistance","window","innerWidth","deltaTime","resizeTimer","handler","event","addEventListener","random","values","removeEventListener","clear","DRAG_TRANSFORM_CONFIG","stack","maxDrag","offsetMultiplier","rotationMultiplier","radial","rotationSensitivity","classic","dragSensitivity","UIManager","removeAttribute","currentItem","updateIndicatorProgress","property","clearPeekItems","prevIndex","nextIndex","prevItem","nextItem","leftClass","rightClass","applyEasing","progress","config","easedProgress","dragOffset","dragRotation","selector","getElement","validated","includes","validateOptions","initElements","initModules","parent","Array","querySelectorAll","getElements","eventHandler","updateLayoutClass","createNavigation","createControls","injectIcons","createCounter","setImageLoadingAttributes","initCSSVariables","existingNav","createElement","appendChild","existingControls","indicatorsWrapper","createIndicators","wrapper","push","playHTML","pauseHTML","injectAutoRotateIcons","existingCounter","counterElement","currentSpan","textContent","hasAttribute","currentMode","currentLayoutMode","newMode","range","imagesToPreload","distance","prevImg","nextImg","complete","size","catch","err","preloadImagesInRange","startAutoRotate","stopAutoRotate","toggleAutoRotate","isAutoRotating"],"mappings":";;;;;;4OAAO,MAAMA,EAAeC,OAAOC,OAAO,CACxCC,MAAO,QACPC,OAAQ,SACRC,QAAS,YAGEC,EAAkBL,OAAOC,OAAO,CAC3CK,WAAY,EACZC,WAAYR,EAAaG,MACzBM,YAAY,EACZC,mBAAoB,KACpBC,aAAc,EACdC,eAAgB,GAChBC,cAAe,GACfC,gBAAgB,EAChBC,aAAa,EACbC,aAAa,EACbC,aAAa,EACbC,gBAAgB,EAChBC,aAAa,EACbC,gBAAgB,EAChBC,sBAAsB,ICrBjB,MAAMC,EAAcrB,OAAOC,OAAO,CACvCqB,SAAU,gBACVC,MAAO,uBACPC,KAAM,sBACNC,WAAY,8BACZC,SAAU,4BACVC,SAAU,4BACVC,WAAY,8BACZC,WAAY,8BACZC,iBAAkB,qCAClBC,kBAAmB,sCACnBC,OAAQ,wBACRC,MAAO,uBACPC,QAAS,yBACTC,IAAK,qBACLC,OAAQ,UACRC,IAAK,qBACLC,QAAS,WACTC,QAAS,WACTC,cAAe,kBACfC,cAAe,kCACfC,UAAW,6BACXC,SAAU,0BACVC,WAAY,4BACZC,UAAW,YACXC,cAAe,2BACfC,gBAAiB,mCACjBC,kBAAmB,qCACnBC,mBAAoB,sCACpBC,QAAS,yBACTC,eAAgB,iCAChBC,iBAAkB,mCAClBC,aAAc,+BACdC,SAAU,YACVC,UAAW,eAGAC,EAAYxD,OAAOC,OAAO,CACrCqB,SAAU,wBACVE,KAAM,uBACNqB,UAAW,aACXP,QAAS,YACTC,QAAS,YACTC,cAAe,mBACfc,SAAU,aACVC,UAAW,cACXtB,MAAO,QAGIwB,EAAOzD,OAAOC,OAAO,CAChCyD,QAAS,eACTC,SAAU,gBACVC,QAAS,eACTC,MAAO,aACPC,SAAU,aAGCC,EAAc/D,OAAOC,OAAO,CACvC+D,OAAQ,MAGGC,EAAYjE,OAAOC,OAAO,CACrCiE,WAAY,IACZC,cAAe,KAGJC,EAAOpE,OAAOC,OAAO,CAChCoE,UAAW,YACXC,WAAY,aACZC,KAAM,OACNC,IAAK,MACLC,MAAO,MC3DF,SAASC,EAASC,KAAYC,GAC/BD,aAAmBE,aAAeD,EAAQE,OAAS,GACrDH,EAAQI,UAAUC,OAAOJ,EAE7B,CAEO,SAASK,EAAYN,KAAYC,GAClCD,aAAmBE,aAAeD,EAAQE,OAAS,GACrDH,EAAQI,UAAUG,UAAUN,EAEhC,CAoBO,SAASO,EAAaR,EAASS,EAAMC,GACtCV,aAAmBE,aAAeO,GACpCT,EAAQQ,aAAaC,EAAMC,EAE/B,CC9CA,MAAMC,EAAe,IAAIC,IA+BlB,SAASC,EAAcC,GAC5B,IAAKA,GAA8B,IAAnBA,EAAQX,OACtB,OAAOY,QAAQC,QAAQ,IAGzB,MAAMC,EAAgB,IAAI,IAAIC,IAAIJ,IAClC,OAAOC,QAAQI,IAAIF,EAAcG,IAAIC,GAnChC,SAAsBA,GAC3B,OAAO,IAAIN,QAAQ,CAACC,EAASM,KAC3B,IAAKD,EAEH,YADAC,EAAO,IAAIC,MAAM,uBAInB,GAAIZ,EAAaa,IAAIH,GACnB,OAAOV,EAAac,IAAIJ,GAG1B,MAAMK,EAAM,IAAIC,MACVC,EAAU,IAAIb,QAAQ,CAACc,EAAKC,KAChCJ,EAAIK,OAAS,KACXpB,EAAaqB,OAAOX,GACpBQ,EAAIH,IAENA,EAAIO,QAAU,KACZtB,EAAaqB,OAAOX,GACpBS,EAAI,IAAIP,MAAM,cAAcF,OAE9BK,EAAIL,IAAMA,IAGZV,EAAauB,IAAIb,EAAKO,GACtBA,EAAQO,KAAKnB,EAASM,IAE1B,CAQ8Cc,CAAaf,IAC3D,CCtCA,MAAMgB,EAAY,IAAIzB,IA0Bf,MAAM0B,EAAQ,CACnBC,KAAM,CACJC,KAAM,mBACNC,QAAS,CAAA,GAEXC,KAAM,CACJF,KAAM,kBACNC,QAAS,CAAA,GAEXE,KAAM,CACJH,KAAM,mBACNC,QAAS,CACPG,KAAM,eACNC,OAAQ,eACRC,YAAa,EACbC,cAAe,QACfC,eAAgB,UAGpBC,MAAO,CACLT,KAAM,yRACNC,QAAS,CACPG,KAAM,eACNC,OAAQ,UAKP,SAASK,EAAQC,EAAUC,EAAgB,IAChD,MAAMC,EAAOf,EAAMa,GACnB,IAAKE,EAEH,OADAC,QAAQC,KAAK,sBAAsBJ,iBAC5B,GAGT,MAAMV,EAAU,IAAKY,EAAKZ,WAAYW,GACtC,OA5DF,SAAuBZ,EAAMC,EAAU,IACrC,MAAMe,MACJA,EAAQ,GAAEC,OACVA,EAAS,GAAEC,QACXA,EAAU,YAAWd,KACrBA,EAAO,OAAMC,OACbA,EAAS,eAAcC,YACvBA,EAAc,EAACC,cACfA,EAAgB,QAAOC,eACvBA,EAAiB,QAAOW,UACxBA,EAAY,IACVlB,EAEEmB,EAAW,GAAGpB,KAAQqB,KAAKC,UAAUrB,KAC3C,GAAIJ,EAAUb,IAAIoC,GAChB,OAAOvB,EAAUZ,IAAImC,GAGvB,MAAMG,EAAM,eAAeP,cAAkBC,eAAoBC,YAAkBd,gDAAmDe,eAAuBnB,cAAiBK,oBAAyBC,sBAAgCC,uBAAmCC,aAG1Q,OADAX,EAAUH,IAAI0B,EAAUG,GACjBA,CACT,CAsCSC,CAAcX,EAAKb,KAAMC,EAClC,CAEO,SAASwB,EAAWC,EAAQf,EAAUV,EAAU,CAAA,GACrD,KAAKyB,GAAYA,aAAkBhE,aAAc,OAEjD,GAAIgE,EAAOC,cAAc,OACvB,OAGF,MAAMC,EAAWlB,EAAQC,EAAUV,GAC/B2B,IACFF,EAAOG,UAAYD,EAEvB,CCxEO,SAASE,EAAeC,EAAOpE,GACpC,OAAIA,GAAU,EAAU,GACfoE,EAAQpE,EAAUA,GAAUA,CACvC,CCHO,MAAMqE,EACXC,WAAAA,CAAY9H,GACV+H,KAAK/H,SAAWA,CAClB,CAEA,gBAAIgI,GACF,OAAOD,KAAK/H,SAASiI,MAAMD,YAC7B,CAEA,gBAAIA,CAAajE,GACfgE,KAAK/H,SAASiI,MAAMD,aAAeL,EAAe5D,EAAOgE,KAAK/H,SAASkI,WACzE,CAEAC,mBAAAA,CAAoBC,EAAMC,GACxB,MAAMC,EAAQP,KAAK/H,SAASkI,WACtBK,EAAeZ,EAAeU,EAAIC,GAClCE,EAAiBb,EAAeS,EAAME,GAEtCG,GAAeF,EAAeC,EAAiBF,GAASA,EACxDI,GAAgBF,EAAiBD,EAAeD,GAASA,EAE/D,OAAOG,GAAeC,EAAeD,GAAeC,CACtD,CAEAC,QAAAA,CAASP,EAAMC,GAEb,OADiBO,KAAKC,IAAId,KAAKI,oBAAoBC,EAAMC,KA3BjC,CA6B1B,CAEAS,qBAAAA,GACEf,KAAK/H,SAAS+I,SAASC,iBACvBjB,KAAK/H,SAASiJ,gBAEVlB,KAAK/H,SAAS8F,QAAQ1G,aAAe,GACvC2I,KAAK/H,SAASkE,eAElB,CAEAgF,MAAAA,CAAOC,GACLpB,KAAKC,aAAeD,KAAKC,aAAemB,EACxCpB,KAAKe,uBACP,CAEA/C,IAAAA,GACEgC,KAAKmB,OAAO,EACd,CAEAtD,IAAAA,GACEmC,KAAKmB,UACP,CAEAE,IAAAA,CAAKxB,GACH,MAAMyB,EAAkB1B,EAAeC,EAAOG,KAAK/H,SAASkI,YACxDmB,IAAoBtB,KAAKC,eAE7BD,KAAKC,aAAeqB,EACpBtB,KAAKe,wBACP,CAEAQ,mBAAAA,CAAoBC,EAAaC,GAC/B,MAAMH,EAAkB1B,EAAe4B,EAAaxB,KAAK/H,SAASkI,YAClE,OAAImB,IAAoBtB,KAAKC,eAE7BwB,EAASH,IACF,EACT,CAEAI,eAAAA,CAAgB7B,GACdG,KAAKuB,oBAAoB1B,EAAQyB,IAC/B,MAAMpK,WAAEA,GAAe8I,KAAK/H,SAAS8F,QAElB,WAAf7G,EACF8I,KAAK2B,sBAAsBL,GAE3BtB,KAAK4B,qBAAqBN,IAGhC,CAEAK,qBAAAA,CAAsBL,GACpB,MAAMO,EAAe7B,KAAKI,oBAAoBJ,KAAKC,aAAcqB,GAEjE,GAAIT,KAAKC,IAAIe,GAAgB,EAAG,CAC9B,MAAMT,EAAYS,EAAe,EAAI,GAAI,EACzC7B,KAAKmB,OAAOC,EACd,MACEpB,KAAKmB,OAAOU,EAEhB,CAEAD,oBAAAA,CAAqBN,GACnB,GAAItB,KAAKY,SAASZ,KAAKC,aAAcqB,GAAkB,CACrD,MAAMO,EAAe7B,KAAKI,oBAAoBJ,KAAKC,aAAcqB,GACjEtB,KAAKmB,OAAOU,EACd,MACE7B,KAAKqB,KAAKC,EAEd,CAEAQ,oBAAAA,CAAqBjC,GACnBG,KAAKuB,oBAAoB1B,EAAQyB,IAC/B,MAAMpK,WAAEA,GAAe8I,KAAK/H,SAAS8F,QAErC,GAAmB,WAAf7G,EAAyB,CAC3B,MAAM2K,EAAe7B,KAAKI,oBAAoBJ,KAAKC,aAAcqB,GACjEtB,KAAKmB,OAAOU,EACd,MACE7B,KAAKqB,KAAKC,IAGhB,EC/GF,MAEMS,EAAoBpL,OAAOC,OAAO,CACtCoL,OAAQ,CAAEC,EAAG,GAAIC,MAAO,GACxBC,KAAM,CAAED,MAAO,GACfE,OAAQ,CAAEF,MAAO,OAGbG,EAAkB1L,OAAOC,OAAO,CACpC0L,WAAY,EACZC,iBAAkB,GAClBC,kBAAmB,GACnBC,iBAAkB,MAGdC,EAAkB/L,OAAOC,OAAO,CACpC+L,SAAU,IACVC,YAAa,IACbC,oBAAqB,IACrBC,cAAe,KAGXC,EAAyB,CAC7B/K,EAAYO,WACZP,EAAYK,SACZL,EAAYM,SACZN,EAAYQ,YAGP,MAAMwK,EACXjD,WAAAA,CAAY9H,GACV+H,KAAK/H,SAAWA,EAChB+H,KAAKiD,kBAAoB,KACzBjD,KAAKkD,aAAc,CACrB,CAEAC,kBAAAA,CAAmBC,GACjB,OAASA,EAAO,KAAO,IAAO,GAChC,CAEAC,KAAAA,CAAMrH,EAAOsH,EAAW,GACtB,OAAOzC,KAAKwC,MAAMrH,EAAQ,IAAMsH,GAAY,IAAMA,CACpD,CAEAC,kBAAAA,CAAmBtD,GACjB,MAAO,CACLpC,KAAM+B,EAAeK,EAAe,EAAGD,KAAK/H,SAASkI,YACrDnC,KAAM4B,EAAeK,EAAe,EAAGD,KAAK/H,SAASkI,YAEzD,CAEAqD,mBAAAA,CAAoBC,GAClB,MAAMC,EAAU1D,KAAKqD,MAAMI,EAAO,GAClCzD,KAAK/H,SAAS0L,UAAUC,MAAMC,YAAY,sBAAuB,GAAGH,OACtE,CAEAI,eAAAA,CAAgBxI,EAASyI,GACvB,IAAK,MAAOC,EAAKhI,KAAUrF,OAAOsN,QAAQF,GACxCzI,EAAQsI,MAAMC,YAAYG,EAAKhI,EAEnC,CAEAkI,oBAAAA,CAAqBjE,GACnB,MAAMkE,GAAenE,KAAK/H,SAASiI,MAAMkE,UAAYnE,EAC/CoE,EAAkBrE,KAAK/H,SAAS0L,UAAUC,MAAMU,iBAAiB,uBAEvE,IAAKD,GAAuC,SAApBA,EAEtB,YADArE,KAAKwD,oBAAoBW,GAK3B,MAAMI,EAAeC,WAAWH,GAE1BI,EAAaF,EADNvE,KAAKmD,mBAAmBgB,EAAcI,GAEnDvE,KAAKwD,oBAAoBiB,EAC3B,CAEAxD,cAAAA,GACE,MAAMhB,aAAEA,GAAiBD,KAAK/H,SAASiI,OACjChJ,WAAEA,GAAe8I,KAAK/H,SAAS8F,QAElB,UAAf7G,GAAyC,YAAfA,EAC5B8I,KAAKwD,oBAAoB,GACD,WAAftM,GACT8I,KAAKkE,qBAAqBjE,GAG5BD,KAAK0E,kBACP,CAEAA,gBAAAA,GACE,MAAMzE,aAAEA,GAAiBD,KAAK/H,SAASiI,OACjChJ,WAAEA,GAAe8I,KAAK/H,SAAS8F,QAErCiC,KAAK/H,SAAS0M,GAAGC,mBAAmB3E,GAEjB,WAAf/I,EACF8I,KAAK6E,sBAAsB5E,GACH,YAAf/I,EACT8I,KAAK8E,uBAAuB7E,GAE5BD,KAAK+E,qBAAqB9E,EAE9B,CAEA4E,qBAAAA,CAAsB5E,GACpB,MAAMmE,UAAEA,GAAcpE,KAAK/H,SAASiI,MAEpC,IAAK,IAAI8E,EAAI,EAAGA,EAAIhF,KAAK/H,SAASgN,MAAMxJ,OAAQuJ,IAAK,CACnD,MAAM7M,EAAO6H,KAAK/H,SAASgN,MAAMD,GAC3BvB,EAAQW,EAAYY,EAE1BhF,KAAK8D,gBAAgB3L,EAAM,CACzB,eAAgB,GAAG6H,KAAKqD,MAAMI,EAAO,QACrC,gBAAiB,SAErB,CAEA,MAAM5F,KAAEA,EAAIG,KAAEA,GAASgC,KAAKuD,mBAAmBtD,GAC/CD,KAAK/H,SAAS0M,GAAGO,aAAarH,EAAMG,EACtC,CAEA+G,oBAAAA,CAAqB9E,GACnB,MAAMpC,KAAEA,EAAIG,KAAEA,GAASgC,KAAKuD,mBAAmBtD,GAE/C,IAAK,IAAI+E,EAAI,EAAGA,EAAIhF,KAAK/H,SAASgN,MAAMxJ,OAAQuJ,IAAK,CACnD,MAAM7M,EAAO6H,KAAK/H,SAASgN,MAAMD,GAEjC7M,EAAKuD,UAAUG,UAAUkH,GAErBiC,IAAM/E,EACR9H,EAAKuD,UAAUC,IAAI3D,EAAYO,YACtByM,IAAMnH,EACf1F,EAAKuD,UAAUC,IAAI3D,EAAYK,UACtB2M,IAAMhH,EACf7F,EAAKuD,UAAUC,IAAI3D,EAAYM,UAE/BH,EAAKuD,UAAUC,IAAI3D,EAAYQ,WAEnC,CACF,CAEA2M,uBAAAA,CAAwBC,GACtB,MAAMC,EAAYxE,KAAKyE,IAAI,IAAKzE,KAAK0E,IAAqB,IAAjBH,EAAuB,MAC1DI,EAAWJ,GAAkB/C,EAAgBI,iBAQnD,OANyB4C,EAAYD,EAAkB,GACjB/C,EAAgBC,YAC5BkD,EACtBnD,EAAgBE,iBAChBF,EAAgBG,kBAGtB,CAEAiD,sBAAAA,CAAuBC,EAAWzF,EAAc0F,GAC9C,MAAM9H,KAAEA,EAAIG,KAAEA,GAASgC,KAAKuD,mBAAmBtD,GAE/C,GAAIyF,IAAczF,EAChB,MAAO,CACLgC,EAAGF,EAAkBC,OAAOC,EAC5BC,MAAOH,EAAkBC,OAAOE,OAIpC,GAAIwD,IAAc7H,EAChB,MAAO,CACLoE,EAAGF,EAAkBC,OAAOC,EAAI0D,EAChCzD,MAAOH,EAAkBI,KAAKD,OAIlC,GAAIwD,IAAc1H,EAChB,MAAO,CACLiE,EAAGF,EAAkBC,OAAOC,EAAI0D,EAChCzD,MAAOH,EAAkBI,KAAKD,OAKlC,MAAO,CACLD,EAF0ByD,EAAYzF,EAEb,EACrB8B,EAAkBC,OAAOC,EAAkB,EAAd0D,EAC7B5D,EAAkBC,OAAOC,EAAkB,EAAd0D,EACjCzD,MAAOH,EAAkBK,OAAOF,MAEpC,CAEA4C,sBAAAA,CAAuB7E,GACrB,MAAMpC,KAAEA,EAAIG,KAAEA,GAASgC,KAAKuD,mBAAmBtD,GACzCmF,EAAiBpF,KAAK/H,SAAS0L,UAAUiC,YACzCD,EAAc3F,KAAKmF,wBAAwBC,GAEjD,IAAK,IAAIJ,EAAI,EAAGA,EAAIhF,KAAK/H,SAASgN,MAAMxJ,OAAQuJ,IAAK,CACnD,MAAM7M,EAAO6H,KAAK/H,SAASgN,MAAMD,IAC3B/C,EAAEA,EAACC,MAAEA,GAAUlC,KAAKyF,uBAAuBT,EAAG/E,EAAc0F,GAElE3F,KAAK8D,gBAAgB3L,EAAM,CACzB,WAAY,GAAG6H,KAAKqD,MAAMpB,EAAG,MAC7B,eAAgB4D,OAAO3D,IAE3B,CAEAlC,KAAK/H,SAAS0M,GAAGO,aAAarH,EAAMG,EACtC,CAEA8H,aAAAA,CAAcC,GACZ/F,KAAKgG,eAEL,IAAIC,EAAkBF,EAEtB,MAAMG,EAAeA,KAGnB,GAFAD,GAAmBvD,EAAgBC,SAE/B9B,KAAKC,IAAImF,GAAmBvD,EAAgBE,YAC9C5C,KAAKgG,mBADP,CAKA,GAAInF,KAAKC,IAAImF,GAAmBvD,EAAgBG,oBAAqB,CACnE,MAAMzB,EAAY6E,EAAkB,GAAI,EAAK,EAC7CjG,KAAK/H,SAASkO,UAAUhF,OAAOC,GAC/B6E,GAAmBvD,EAAgBI,aACrC,CAEA9C,KAAKiD,kBAAoBmD,sBAAsBF,EAR/C,GAWFlG,KAAKkD,aAAc,EACnBlD,KAAKiD,kBAAoBmD,sBAAsBF,EACjD,CAEAF,YAAAA,GACMhG,KAAKiD,oBACPoD,qBAAqBrG,KAAKiD,mBAC1BjD,KAAKiD,kBAAoB,MAE3BjD,KAAKkD,aAAc,CACrB,EClPK,MAAMoD,EACXvG,WAAAA,CAAY9H,GACV+H,KAAK/H,SAAWA,EAChB+H,KAAKuG,SAAW,KAChBvG,KAAKwG,UAAW,CAClB,CAEAC,cAAAA,CAAeD,GACbxG,KAAKwG,SAAWA,EAChBxG,KAAK/H,SAAS0M,GAAG+B,uBAAuBF,EAC1C,CAEAG,MAAAA,GACE3G,KAAKwG,SAAWxG,KAAK4G,OAAS5G,KAAK6G,OACrC,CAEAA,KAAAA,GACE,GAAI7G,KAAKwG,SAAU,OAEnBxG,KAAKyG,gBAAe,GAEpB,MAAMK,EAAiB9G,KAAK/H,SAAS8F,QAAQ3G,mBAC7C4I,KAAKuG,SAAWQ,YAAY,KAC1B/G,KAAK/H,SAASkO,UAAUnI,QACvB8I,EACL,CAEAF,IAAAA,GACO5G,KAAKwG,WAEVxG,KAAKyG,gBAAe,GAEhBzG,KAAKuG,WACPS,cAAchH,KAAKuG,UACnBvG,KAAKuG,SAAW,MAEpB,CAEAU,OAAAA,GACEjH,KAAK4G,OACL5G,KAAK/H,SAAW,IAClB,ECtCF,MAAMiP,EAAevQ,OAAOC,OAAO,CACjCuQ,UAAW,GACXC,QAAS,IACTC,SAAU,MAGNC,EAAc3Q,OAAOC,OAAO,CAChC2Q,eAAgB,GAChBC,eAAgB,GAChBC,kBAAmB,KAKd,MAAMC,EACX3H,WAAAA,CAAY9H,GACV+H,KAAK/H,SAAWA,EAChB+H,KAAK2H,cAAgB,IAAIzL,IAEzB8D,KAAK4H,MAAQ,CACXC,OAAQ,EACRC,KAAM,GAGR9H,KAAK+H,KAAO,CACVC,QAAQ,EACRH,OAAQ,EACRI,SAAU,EACVC,MAAO,EACPC,SAAU,EACVpC,SAAU,GAGZ/F,KAAKoI,MAAQ,CACXC,aAAa,EACbC,cAAe,KACfC,cAAe,EACfC,iBAAkB,EAEtB,CAEAC,IAAAA,GACEzI,KAAK0I,wBACL1I,KAAK2I,eACL3I,KAAK4I,YACL5I,KAAK6I,gBACL7I,KAAK8I,qBACL9I,KAAK+I,YACL/I,KAAKgJ,YACLhJ,KAAKiJ,YACP,CAEAC,yBAAAA,CAA0BC,GACxBnJ,KAAKoJ,2BACLpJ,KAAK/H,SAASd,WAAWyP,OACzBuC,GACF,CAEAC,wBAAAA,GACE,MAAMC,EAAmBrJ,KAAK/H,SAASsB,WAAWyG,KAAK/H,SAASiI,MAAMD,cAClEoJ,GAAoBA,EAAiB3N,UAAU4N,SAAS,qCAC1DD,EAAiB3N,UAAUC,IAAI,sCAEnC,CAEA4N,cAAAA,CAAe1J,GACbG,KAAK/H,SAAS0M,GAAG6E,oBAAoB3J,GACrCG,KAAK/H,SAAS0M,GAAG8E,oBACnB,CAEAC,mBAAAA,CAAoBC,EAAc1J,EAAckH,GAC1CwC,EAAexC,EACjBnH,KAAK/H,SAAS0M,GAAGiF,iBAAiB3J,EAAc,SACvC0J,GAAgBxC,GACzBnH,KAAK/H,SAAS0M,GAAGiF,iBAAiB3J,EAAc,OAEpD,CAEA4J,aAAAA,CAAcC,GACZ9J,KAAK+H,KAAKC,QAAS,EACnBhI,KAAK+H,KAAKF,OAASiC,EACnB9J,KAAK+H,KAAKE,SAAW6B,EACrB9J,KAAK+H,KAAKG,MAAQ4B,EAClB9J,KAAK+H,KAAKI,SAAW4B,KAAKC,MAC1BhK,KAAK+H,KAAKhC,SAAW,CACvB,CAEAkE,gBAAAA,GACEjK,KAAK/H,SAASiS,SAASjS,SAAS2L,MAAMuG,OAAS,MACjD,CAEAC,mBAAAA,CAAoBC,GAOlB,OANexJ,KAAKC,IAAIuJ,EAAEC,QACXzJ,KAAKC,IAAIuJ,EAAEE,SAKHF,EAAEC,OAASD,EAAEE,MACtC,CAEAC,eAAAA,GACExK,KAAKoI,MAAMC,aAAc,EACzBrI,KAAKoI,MAAMI,iBAAmB,CAChC,CAEAE,qBAAAA,GACE,MAAMzP,QAAEA,EAAOC,QAAEA,EAAOC,cAAEA,GAAkB6G,KAAK/H,SAASiS,SAEtDjR,GACF+G,KAAKyK,WAAWxR,EAAS,QAAS,KAChC+G,KAAKkJ,0BAA0B,IAAMlJ,KAAK/H,SAASkO,UAAUtI,UAI7D3E,GACF8G,KAAKyK,WAAWvR,EAAS,QAAS,KAChC8G,KAAKkJ,0BAA0B,IAAMlJ,KAAK/H,SAASkO,UAAUnI,UAI7D7E,GACF6G,KAAKyK,WAAWtR,EAAe,QAAS,KACtC6G,KAAK/H,SAASd,WAAWwP,UAG/B,CAEAgC,YAAAA,GACE,IAAK3I,KAAK/H,SAAS8F,QAAQvG,eAAgB,OA2C3CwI,KAAKyK,WAAWC,SAAU,UAzCTL,IACf,MAAMlE,UAAEA,EAAShP,WAAEA,EAAUgJ,WAAEA,GAAeH,KAAK/H,SAEnD,OAAQoS,EAAErG,KACR,KAAKjJ,EAAKC,UACR7D,EAAWyP,OACXT,EAAUtI,OACV,MAEF,KAAK9C,EAAKE,WACR9D,EAAWyP,OACXT,EAAUnI,OACV,MAEF,KAAKjD,EAAKG,KACRmP,EAAEM,iBACFxT,EAAWyP,OACXT,EAAU9E,KAAK,GACf,MAEF,KAAKtG,EAAKI,IACRkP,EAAEM,iBACFxT,EAAWyP,OACXT,EAAU9E,KAAKlB,EAAa,GAC5B,MAEF,KAAKpF,EAAKK,MACRiP,EAAEM,iBACFxT,EAAWwP,SACX,MAEF,QACE,MAAMiE,EAASC,SAASR,EAAErG,KACtB4G,GAAU,GAAKA,GAAUzK,IAC3BkK,EAAEM,iBACFxT,EAAWyP,OACXT,EAAU9E,KAAKuJ,EAAS,MAMlC,CAEAhC,SAAAA,GACE,IAAK5I,KAAK/H,SAAS8F,QAAQtG,YAAa,OA6CxCuI,KAAKyK,WACHzK,KAAK/H,SAASiS,SAASjS,SACvB,QA7CeoS,IACf,MAAMC,EAASzJ,KAAKC,IAAIuJ,EAAEC,QACpBC,EAAS1J,KAAKC,IAAIuJ,EAAEE,QAE1B,GAAID,EAAS,GAAKC,EAAS,EACzB,OAGF,GAAID,IAAWC,EACb,OAGFF,EAAEM,iBAEF,MAAMG,EAAcf,KAAKC,MAEzB,KAAIc,EAAc9K,KAAKoI,MAAMG,cAAgBrB,EAAaG,UAA1D,CAaA,GATKrH,KAAKoI,MAAMC,cACdrI,KAAKoI,MAAMC,aAAc,EACzBrI,KAAKoI,MAAMI,iBAAmB,EAC9BxI,KAAK/H,SAASd,WAAWyP,OACzB5G,KAAK/H,SAAS+I,SAASgF,gBAGzBhG,KAAKoI,MAAMI,kBAAoBxI,KAAKoK,oBAAoBC,GAEpDxJ,KAAKC,IAAId,KAAKoI,MAAMI,mBAAqBtB,EAAaC,UAAW,CACnE,MAAM/F,EAAYpB,KAAKoI,MAAMI,iBAAmB,EAAI,GAAI,EACxDxI,KAAK/H,SAASkO,UAAUhF,OAAOC,GAE/BpB,KAAKoI,MAAMI,iBAAmB,EAC9BxI,KAAKoI,MAAMG,cAAgBuC,CAC7B,CAEAC,aAAa/K,KAAKoI,MAAME,eACxBtI,KAAKoI,MAAME,cAAgB0C,WAAW,KACpChL,KAAKwK,mBACJtD,EAAaE,QAtBhB,GA6BA,CAAE6D,SAAS,GAEf,CAEApC,aAAAA,GACE,MAAM5D,MAAEA,GAAUjF,KAAK/H,SACvB,IAAK,IAAI+M,EAAI,EAAGA,EAAIC,EAAMxJ,OAAQuJ,IAChChF,KAAKyK,WAAWxF,EAAMD,GAAI,QAAS,KACjChF,KAAK/H,SAASd,WAAWyP,OACzB5G,KAAK/H,SAASkO,UAAUzE,gBAAgBsD,IAG9C,CAEA8D,kBAAAA,GACE,MAAMvP,WAAEA,GAAeyG,KAAK/H,SAC5B,IAAK,IAAI+M,EAAI,EAAGA,EAAIzL,EAAWkC,OAAQuJ,IACrChF,KAAKyK,WAAWlR,EAAWyL,GAAI,QAAS,KACtChF,KAAK/H,SAASd,WAAWyP,OACzB5G,KAAK/H,SAASkO,UAAUrE,qBAAqBkD,IAGnD,CAEA+D,SAAAA,GACO/I,KAAK/H,SAAS8F,QAAQrG,cAE3BsI,KAAKyK,WAAWzK,KAAK/H,SAASiS,SAASjS,SAAU,aAAeoS,IAC9DrK,KAAK4H,MAAMC,OAASwC,EAAEa,eAAe,GAAGC,UAG1CnL,KAAKyK,WAAWzK,KAAK/H,SAASiS,SAASjS,SAAU,YAAcoS,IAC7D,MACMV,EADgBU,EAAEa,eAAe,GAAGC,QACLnL,KAAK4H,MAAMC,QAC1C5H,aAAEA,GAAiBD,KAAK/H,SAASiI,MAEvCF,KAAK/H,SAAS0M,GAAGyG,oBAAoBzB,GACrC3J,KAAK0J,oBAAoBC,EAAc1J,EAAcqH,EAAYC,kBAGnEvH,KAAKyK,WAAWzK,KAAK/H,SAASiS,SAASjS,SAAU,WAAaoS,IAC5DrK,KAAK4H,MAAME,KAAOuC,EAAEa,eAAe,GAAGC,QACtC,MAAME,EAAgBrL,KAAK4H,MAAME,KAAO9H,KAAK4H,MAAMC,QAC7CvQ,eAAEA,GAAmB0I,KAAK/H,SAAS8F,SACnCkC,aAAEA,GAAiBD,KAAK/H,SAASiI,MAEvCF,KAAKuJ,eAAetJ,GAEhBoL,GAAiB/T,GACnB0I,KAAK/H,SAASd,WAAWyP,OACzB5G,KAAK/H,SAASkO,UAAUnI,QACfqN,EAAgB/T,IACzB0I,KAAK/H,SAASd,WAAWyP,OACzB5G,KAAK/H,SAASkO,UAAUtI,UAG9B,CAEAmL,SAAAA,GACOhJ,KAAK/H,SAAS8F,QAAQpG,cAE3BqI,KAAKyK,WAAWzK,KAAK/H,SAASiS,SAASjS,SAAU,YAAcoS,IJhS1DiB,OAAOC,YAAc,MImSxBvL,KAAK6J,cAAcQ,EAAEP,SACrB9J,KAAK/H,SAASd,WAAWyP,OACzB5G,KAAK/H,SAAS+I,SAASgF,eACvBhG,KAAK/H,SAASiS,SAASjS,SAAS2L,MAAMuG,OAAS,WAC/CE,EAAEM,oBAGJ3K,KAAKyK,WAAWC,SAAU,YAAcL,IACtC,IAAKrK,KAAK+H,KAAKC,OAAQ,OAEvB,MAAM8C,EAAcf,KAAKC,MACnBwB,EAAYV,EAAc9K,KAAK+H,KAAKI,SACpCmC,EAASD,EAAEP,QAAU9J,KAAK+H,KAAKG,MAEjCsD,EAAY,IACdxL,KAAK+H,KAAKhC,SAAWuE,EAASkB,GAGhCxL,KAAK+H,KAAKE,SAAWoC,EAAEP,QACvB9J,KAAK+H,KAAKG,MAAQmC,EAAEP,QACpB9J,KAAK+H,KAAKI,SAAW2C,EAErB,MAAMnB,EAAe3J,KAAK+H,KAAKE,SAAWjI,KAAK+H,KAAKF,QAC9C5H,aAAEA,GAAiBD,KAAK/H,SAASiI,MAKvC,GAHAF,KAAK/H,SAAS0M,GAAGyG,oBAAoBzB,GACrC3J,KAAK0J,oBAAoBC,EAAc1J,EAAcqH,EAAYE,gBAE7D3G,KAAKC,IAAI6I,GAAgB3J,KAAK/H,SAAS8F,QAAQxG,cAAe,CAChE,MAAM6J,EAAYuI,EAAe,GAAI,EAAK,EAC1C3J,KAAK/H,SAASkO,UAAUhF,OAAOC,GAC/BpB,KAAK+H,KAAKF,OAAS7H,KAAK+H,KAAKE,SAC7BjI,KAAKuJ,eAAetJ,EACtB,IAGFD,KAAKyK,WAAWC,SAAU,UAAW,KACnC,IAAK1K,KAAK+H,KAAKC,OAAQ,OAEvBhI,KAAK+H,KAAKC,QAAS,EACnBhI,KAAKiK,mBAEL,MAAMhK,aAAEA,GAAiBD,KAAK/H,SAASiI,MACvCF,KAAKuJ,eAAetJ,GAEhBY,KAAKC,IAAId,KAAK+H,KAAKhC,UAAYuB,EAAYG,mBAC7CzH,KAAK/H,SAAS+I,SAAS8E,cAAc9F,KAAK+H,KAAKhC,YAInD/F,KAAKyK,WAAWzK,KAAK/H,SAASiS,SAASjS,SAAU,aAAc,KAC7D,GAAI+H,KAAK+H,KAAKC,OAAQ,CACpBhI,KAAK+H,KAAKC,QAAS,EACnBhI,KAAKiK,mBAEL,MAAMhK,aAAEA,GAAiBD,KAAK/H,SAASiI,MACvCF,KAAKuJ,eAAetJ,EACtB,IAGEqL,OAAOC,WAAa7Q,EAAYC,QAClCqF,KAAKiK,mBAET,CAEAhB,UAAAA,GACE,IAAIwC,EAQJzL,KAAKyK,WAAWa,OAAQ,SAPRI,KACdX,aAAaU,GACbA,EAAcT,WAAW,KACvBhL,KAAK/H,SAAS+I,SAASC,kBA3VP,MAgWtB,CAEAwJ,UAAAA,CAAWnP,EAASqQ,EAAOD,EAAS3N,GAClCzC,EAAQsQ,iBAAiBD,EAAOD,EAAS3N,GAEzC,MAAMiG,EAAM,GAAG2H,KAAS5B,KAAKC,SAASnJ,KAAKgL,WAC3C7L,KAAK2H,cAAcnK,IAAIwG,EAAK,CAAE1I,UAASqQ,QAAOD,UAAS3N,WACzD,CAEAkJ,OAAAA,GACMjH,KAAKoI,MAAME,gBACbyC,aAAa/K,KAAKoI,MAAME,eACxBtI,KAAKoI,MAAME,cAAgB,MAG7B,IAAK,MAAMhN,QAAEA,EAAOqQ,MAAEA,EAAKD,QAAEA,EAAO3N,QAAEA,KAAaiC,KAAK2H,cAAcmE,SACpExQ,EAAQyQ,oBAAoBJ,EAAOD,EAAS3N,GAE9CiC,KAAK2H,cAAcqE,QAEnBhM,KAAK/H,SAAW,IAClB,ECjYF,MAAMgU,EAAwBtV,OAAOC,OAAO,CAC1CsV,MAAO,CACLC,QAAS,IACTC,iBAAkB,IAClBC,mBAAoB,GAEtBC,OAAQ,CACNC,oBAAqB,IAEvBC,QAAS,CACPC,gBAAiB,MAId,MAAMC,EACX3M,WAAAA,CAAY9H,GACV+H,KAAK/H,SAAWA,CAClB,CAEA2M,kBAAAA,CAAmB3E,GACjB,IAAK,IAAI+E,EAAI,EAAGA,EAAIhF,KAAK/H,SAASgN,MAAMxJ,OAAQuJ,IAAK,CACnD,MAAM7M,EAAO6H,KAAK/H,SAASgN,MAAMD,GACjCpJ,EAAYzD,EAAMH,EAAYI,WAAYJ,EAAYK,SAAUL,EAAYM,UAC5EH,EAAKwU,gBAAgBvS,EAAKC,QAC5B,CAEA,IAAK,IAAI2K,EAAI,EAAGA,EAAIhF,KAAK/H,SAASsB,WAAWkC,OAAQuJ,IAAK,CACxD,MAAMxL,EAAYwG,KAAK/H,SAASsB,WAAWyL,GAC3CpJ,EACEpC,EACAxB,EAAY0B,gBACZ1B,EAAY2B,mBAEdmC,EAAatC,EAAWY,EAAKE,SAAU,SACvCwB,EAAatC,EAAWY,EAAKK,SAAU,KACzC,CAEA,MAAMmS,EAAc5M,KAAK/H,SAASgN,MAAMhF,GAClCoJ,EAAmBrJ,KAAK/H,SAASsB,WAAW0G,GAE9C2M,IACFvR,EAASuR,EAAa5U,EAAYI,YAClC0D,EAAa8Q,EAAaxS,EAAKC,QAAS,SAGtCgP,IACFzN,EAAYyN,EAAkBrR,EAAY4B,oBAC1CyB,EAASgO,EAAkBrR,EAAY0B,iBACvCoC,EAAauN,EAAkBjP,EAAKE,SAAU,QAC9CwB,EAAauN,EAAkBjP,EAAKK,SAAU,KAE1CuF,KAAK/H,SAASd,WAAWqP,UAC3BxG,KAAK6M,wBAAwBxD,GAGnC,CAEAwD,uBAAAA,CAAwBrT,GRxBnB,IAAmB8B,EAASwR,EAAU9Q,EAAnBV,EQ0BpB9B,ER1B6BsT,EQ2B7B,sBR3BuC9Q,EQ4BvC,GAAGgE,KAAK/H,SAAS8F,QAAQ3G,uBR3BzBkE,aAAmBE,aAAesR,GACpCxR,EAAQsI,MAAMC,YAAYiJ,EAAU9Q,GQ6BpCgP,WAAW,KACLxR,GACF6B,EAAS7B,EAAWxB,EAAY2B,oBAEjCiB,EAAUE,cACf,CAEAiS,cAAAA,GACE,IAAK,IAAI/H,EAAI,EAAGA,EAAIhF,KAAK/H,SAASgN,MAAMxJ,OAAQuJ,IAAK,CAEnDpJ,EADaoE,KAAK/H,SAASgN,MAAMD,GACfhN,EAAYK,SAAUL,EAAYM,SACtD,CACF,CAEA4M,YAAAA,CAAa8H,EAAWC,GACtB,MAAMC,EAAWlN,KAAK/H,SAASgN,MAAM+H,GAC/BG,EAAWnN,KAAK/H,SAASgN,MAAMgI,GAEjCC,GAAU7R,EAAS6R,EAAUlV,EAAYK,UACzC8U,GAAU9R,EAAS8R,EAAUnV,EAAYM,SAC/C,CAEAoO,sBAAAA,CAAuBF,GACrB,MAAMrN,cAAEA,GAAkB6G,KAAK/H,SAASiS,SACnC/Q,IAEDqN,GACFnL,EAASlC,EAAenB,EAAYqB,WACpCyC,EAAa3C,EAAeiB,EAAKG,QAAS,UAE1CqB,EAAYzC,EAAenB,EAAYqB,WACvCyC,EAAa3C,EAAeiB,EAAKG,QAAS,UAE9C,CAEAqP,gBAAAA,CAAiB/J,EAAOuB,GACtB,MAAMjJ,EAAO6H,KAAK/H,SAASgN,MAAMpF,GACjC,IAAK1H,EAAM,OAEX,MAAMiV,EAAYpV,EAAYS,iBACxB4U,EAAarV,EAAYU,kBAE/BkD,EAAYzD,EAAMiV,EAAWC,GAEX,SAAdjM,EACF/F,EAASlD,EAAMiV,GACQ,UAAdhM,GACT/F,EAASlD,EAAMkV,EAEnB,CAEA7D,mBAAAA,CAAoB3J,GAClB,MAAM1H,EAAO6H,KAAK/H,SAASgN,MAAMpF,GAC5B1H,GAELyD,EAAYzD,EAAMH,EAAYS,iBAAkBT,EAAYU,kBAC9D,CAEA2K,KAAAA,CAAMrH,EAAOsH,EAAW,GACtB,OAAOzC,KAAKwC,MAAMrH,EAAQ,IAAMsH,GAAY,IAAMA,CACpD,CAEAgK,WAAAA,CAAYC,GACV,OAAOA,GAAY,EAAI1M,KAAKC,IAAIyM,GAClC,CAEAnC,mBAAAA,CAAoBzB,GAClB,MAAMzS,WAAEA,GAAe8I,KAAK/H,SAAS8F,QAErC,GAAmB,UAAf7G,EAAwB,CAE1B,MAAMsW,EAASvB,EAAsBC,MAE/BqB,EADc1M,KAAKyE,KAAKkI,EAAOrB,QAAStL,KAAK0E,IAAIiI,EAAOrB,QAASxC,IACxC6D,EAAOrB,QAChCsB,EAAgBzN,KAAKsN,YAAYC,GAEjCG,EAAa1N,KAAKqD,MAAMoK,EAAgBD,EAAOpB,kBAC/CuB,EAAe3N,KAAKqD,MAAMoK,EAAgBD,EAAOnB,oBAEvDrM,KAAK/H,SAAS0L,UAAUC,MAAMC,YAAY,gBAAiB,GAAG6J,OAC9D1N,KAAK/H,SAAS0L,UAAUC,MAAMC,YAAY,kBAAmB,GAAG8J,OAClE,MAAO,GAAmB,WAAfzW,EAAyB,CAClC,MAAMsW,EAASvB,EAAsBK,OAC/BqB,EAAe3N,KAAKqD,MAAMsG,EAAe6D,EAAOjB,qBAEtDvM,KAAK/H,SAAS0L,UAAUC,MAAMC,YAAY,oBAAqB,GAAG8J,OACpE,MAAO,GAAmB,YAAfzW,EAA0B,CACnC,MAAMsW,EAASvB,EAAsBO,QAC/BkB,EAAa1N,KAAKqD,MAAMsG,EAAe6D,EAAOf,iBAEpDzM,KAAK/H,SAAS0L,UAAUC,MAAMC,YAAY,gBAAiB,GAAG6J,MAChE,CACF,CAEAjE,kBAAAA,GACEzJ,KAAK/H,SAAS0L,UAAUC,MAAMC,YAAY,gBAAiB,OAC3D7D,KAAK/H,SAAS0L,UAAUC,MAAMC,YAAY,kBAAmB,QAC7D7D,KAAK/H,SAAS0L,UAAUC,MAAMC,YAAY,oBAAqB,OACjE,CAEAoD,OAAAA,GACA,SC3JF,MACElH,WAAAA,CAAY6N,EAAU7P,EAAU,IAE9B,GADAiC,KAAK2D,UTfF,SAAoBiK,GACzB,MAAwB,iBAAbA,EACFlD,SAASjL,cAAcmO,GAEzBA,aAAoBpS,YAAcoS,EAAW,IACtD,CSUqBC,CAAWD,IACvB5N,KAAK2D,UACR,MAAM,IAAI9G,MAAM,sBAAsB+Q,4BAMxC,GAHA5N,KAAKjC,QXIF,SAAyBA,GAC9B,MAAM+P,EAAY,IAAK9W,KAAoB+G,GAsB3C,OApBI+P,EAAU7W,WAAa,IACzB2H,QAAQC,KAAK,mDACbiP,EAAU7W,WAAa,GAGpBN,OAAOmV,OAAOpV,GAAcqX,SAASD,EAAU5W,cAClD0H,QAAQC,KAAK,qCAAqCiP,EAAU5W,+BAC5D4W,EAAU5W,WAAaR,EAAaG,OAGlCiX,EAAU1W,mBAAqB,MACjCwH,QAAQC,KAAK,kEACbiP,EAAU1W,mBAAqB,MAG7B0W,EAAUzW,aAAe,IAC3BuH,QAAQC,KAAK,qDACbiP,EAAUzW,aAAe,GAGpByW,CACT,CW5BmBE,CAAgBjQ,GAC/BiC,KAAKiO,eAEqB,IAAtBjO,KAAKiF,MAAMxJ,OACb,MAAM,IAAIoB,MAAM,oCAGlBmD,KAAKE,MAAQ,CACXD,aAAcD,KAAKjC,QAAQ9G,WAC3BmN,UAlBsB,IAkBWpE,KAAKG,YAGxCH,KAAKkO,cACLlO,KAAKyI,MACP,CAEAwF,YAAAA,GACEjO,KAAKkK,SAAW,CACdjS,SAAU+H,KAAK2D,UAAUlE,cAActF,EAAUlC,UACjDgB,QAAS,KACTC,QAAS,KACTC,cAAe,KACfG,SAAU,KACVR,IAAK,MAGPkH,KAAKiF,MTvCF,SAAqB2I,EAAUO,EAASzD,UAC7C,MAAwB,iBAAbkD,EAA8B,GAClCQ,MAAM/N,KAAK8N,EAAOE,iBAAiBT,GAC5C,CSoCiBU,CAAYnU,EAAUhC,KAAM6H,KAAK2D,WAC9C3D,KAAKG,WAAaH,KAAKiF,MAAMxJ,OAC7BuE,KAAKzG,WAAa,EACpB,CAEA2U,WAAAA,GACElO,KAAKmG,UAAY,IAAIrG,EAAUE,MAC/BA,KAAKgB,SAAW,IAAIgC,EAAShD,MAC7BA,KAAK7I,WAAa,IAAImP,EAAWtG,MACjCA,KAAKuO,aAAe,IAAI7G,EAAa1H,MACrCA,KAAK2E,GAAK,IAAI+H,EAAU1M,KAC1B,CAEAyI,IAAAA,GACEzI,KAAKwO,oBACLxO,KAAKyO,mBACLzO,KAAK0O,iBACL1O,KAAK2O,cACL3O,KAAK4O,gBACL5O,KAAK6O,4BACL7O,KAAK8O,mBAEL9O,KAAKuO,aAAa9F,OAClBzI,KAAKgB,SAASC,iBAEVjB,KAAKjC,QAAQ5G,YACf6I,KAAK7I,WAAW0P,QAGd7G,KAAKjC,QAAQ1G,aAAe,GAC9B2I,KAAK7D,eAET,CAEA2S,gBAAAA,GACE9O,KAAK2D,UAAUC,MAAMC,YAAY,sBAAuB,QACxD7D,KAAK2D,UAAUC,MAAMC,YAAY,gBAAiB,OAClD7D,KAAK2D,UAAUC,MAAMC,YAAY,kBAAmB,QACpD7D,KAAK2D,UAAUC,MAAMC,YAAY,oBAAqB,OACxD,CAEA4K,gBAAAA,GACE,IAAKzO,KAAKjC,QAAQnG,eAAgB,OAElC,MAAMmX,EAAc/O,KAAK2D,UAAUlE,cAAc,IAAIzH,EAAYc,OACjE,GAAIiW,EAIF,OAHA/O,KAAKkK,SAASpR,IAAMiW,EACpB/O,KAAKkK,SAASjR,QAAU8V,EAAYtP,cAActF,EAAUlB,cAC5D+G,KAAKkK,SAAShR,QAAU6V,EAAYtP,cAActF,EAAUjB,UAI9D,MAAMJ,EAAM4R,SAASsE,cAAc,OACnClW,EAAImG,UAAYjH,EAAYc,IAE5B,MAAMG,EAAUyR,SAASsE,cAAc,UACvC/V,EAAQgG,UAAY,GAAGjH,EAAYe,UAAUf,EAAYgB,OAAOhB,EAAYiB,UAC5EA,EAAQ6C,aAAa,aAAc,YAEnC,MAAM5C,EAAUwR,SAASsE,cAAc,UACvC9V,EAAQ+F,UAAY,GAAGjH,EAAYe,UAAUf,EAAYgB,OAAOhB,EAAYkB,UAC5EA,EAAQ4C,aAAa,aAAc,QAEnChD,EAAImW,YAAYhW,GAChBH,EAAImW,YAAY/V,GAChB8G,KAAK2D,UAAUsL,YAAYnW,GAE3BkH,KAAKkK,SAASpR,IAAMA,EACpBkH,KAAKkK,SAASjR,QAAUA,EACxB+G,KAAKkK,SAAShR,QAAUA,CAC1B,CAEAwV,cAAAA,GACE,IAAK1O,KAAKjC,QAAQjG,iBAAmBkI,KAAKjC,QAAQhG,qBAAsB,OAExE,MAAMmX,EAAmBlP,KAAK2D,UAAUlE,cAAc,IAAIzH,EAAYsB,YACtE,GAAI4V,EAAkB,CACpBlP,KAAKkK,SAAS5Q,SAAW4V,EACzB,MAAMC,EAAoBD,EAAiBzP,cAAc,IAAIzH,EAAYuB,cAMzE,OALI4V,GAAqBnP,KAAKjC,QAAQjG,iBACpCqX,EAAkBxP,UAAY,GAC9BK,KAAKoP,iBAAiBD,SAExBnP,KAAKkK,SAAS/Q,cAAgB+V,EAAiBzP,cAActF,EAAUhB,eAEzE,CAEA,MAAMG,EAAWoR,SAASsE,cAAc,OAGxC,GAFA1V,EAAS2F,UAAYjH,EAAYsB,SAE7B0G,KAAKjC,QAAQjG,eAAgB,CAC/B,MAAMqX,EAAoBzE,SAASsE,cAAc,OACjDG,EAAkBlQ,UAAYjH,EAAYuB,WAC1CyG,KAAKoP,iBAAiBD,GACtB7V,EAAS2V,YAAYE,EACvB,CAEA,GAAInP,KAAKjC,QAAQhG,qBAAsB,CACrC,MAAMoB,EAAgBuR,SAASsE,cAAc,UAC7C7V,EAAc8F,UAAY,GAAGjH,EAAYmB,iBAAiBnB,EAAYgB,OAAOhB,EAAYoB,gBACzFD,EAAc2C,aAAa,aAAc,sBACzC3C,EAAc2C,aAAa,eAAgB,SAC3CxC,EAAS2V,YAAY9V,GACrB6G,KAAKkK,SAAS/Q,cAAgBA,CAChC,CAEA6G,KAAK2D,UAAUsL,YAAY3V,GAC3B0G,KAAKkK,SAAS5Q,SAAWA,CAC3B,CAEA8V,gBAAAA,CAAiBC,GACfrP,KAAKzG,WAAa,GAElB,IAAK,IAAIyL,EAAI,EAAGA,EAAIhF,KAAKG,WAAY6E,IAAK,CACxC,MAAMxL,EAAYkR,SAASsE,cAAc,UACnCxI,EAAWxB,IAAMhF,KAAKE,MAAMD,aAElCzG,EAAUyF,UAAYjH,EAAYwB,UAClCA,EAAUkC,UAAUC,IAAI3D,EAAYyB,eACpCD,EAAUsC,aAAa,OAAQ,OAC/BtC,EAAUsC,aAAa,aAAc,SAASkJ,EAAI,KAClDxL,EAAUsC,aAAa,gBAAiB0K,EAAW,OAAS,SAC5DhN,EAAUsC,aAAa,WAAY0K,EAAW,IAAM,MAEhDA,GACFhN,EAAUkC,UAAUC,IAAI3D,EAAY0B,iBAGtC2V,EAAQJ,YAAYzV,GACpBwG,KAAKzG,WAAW+V,KAAK9V,EACvB,CACF,CAEAmV,WAAAA,GACE,MAAM1V,QAAEA,EAAOC,QAAEA,EAAOC,cAAEA,GAAkB6G,KAAKkK,SAE7CjR,GAASsG,EAAWtG,EAAS,QAC7BC,GAASqG,EAAWrG,EAAS,QAC7BC,GP1GD,SAA+BqG,GACpC,KAAKA,GAAYA,aAAkBhE,aAAc,OAEjD,GAAIgE,EAAOC,cAAc,OACvB,OAGF,MAAM8P,EAAW/Q,EAAQ,OAAQ,CAAES,UAAW,cACxCuQ,EAAYhR,EAAQ,QAAS,CAAES,UAAW,eAE5CsQ,GAAYC,IACdhQ,EAAOG,UAAY4P,EAAWC,EAElC,CO6FuBC,CAAsBtW,EAC3C,CAEAyV,aAAAA,GACE,IAAK5O,KAAKjC,QAAQlG,YAAa,OAE/B,MAAM6X,EAAkB1P,KAAK2D,UAAUlE,cAAc,IAAIzH,EAAY6B,WACrE,GAAI6V,EAGF,OAFA1P,KAAK2P,eAAiBD,OACtB1P,KAAKkB,gBAIP,MAAMrH,EAAU6Q,SAASsE,cAAc,OACvCnV,EAAQoF,UAAYjH,EAAY6B,QAChCA,EAAQiC,aAAa,YAAa,UAClCjC,EAAQiC,aAAa,cAAe,QAEpCjC,EAAQ8F,UAAY,wBACH3H,EAAY8B,mBAAmBkG,KAAKE,MAAMD,aAAe,gCACzDjI,EAAY+B,kDACZ/B,EAAYgC,iBAAiBgG,KAAKG,0BAGnDH,KAAK2D,UAAUsL,YAAYpV,GAC3BmG,KAAK2P,eAAiB9V,CACxB,CAEAqH,aAAAA,GACE,IAAKlB,KAAK2P,eAAgB,OAE1B,MAAMC,EAAc5P,KAAK2P,eAAelQ,cAAc,IAAIzH,EAAY8B,kBAClE8V,IACFA,EAAYC,YAAc7P,KAAKE,MAAMD,aAAe,EAExD,CAEA4O,yBAAAA,GACE,MAAM5X,WAAEA,GAAe+I,KAAKjC,QACtB1G,EAAe2I,KAAKjC,QAAQ1G,cAAgB,EAElD,IAAK,IAAIwI,EAAQ,EAAGA,EAAQG,KAAKiF,MAAMxJ,OAAQoE,IAAS,CACtD,MACM7C,EADOgD,KAAKiF,MAAMpF,GACPJ,cAAc,IAAIzH,EAAYY,SAC/C,IAAKoE,GAAOA,EAAI8S,aAAa,WAAY,SAEzC,MACMlP,EADWC,KAAKC,IAAIjB,EAAQ5I,IACLI,EAC7B2F,EAAIlB,aAAa,UAAW8E,EAAW,QAAU,OACnD,CACF,CAEA4N,iBAAAA,GACE,MAAMuB,EAAc/P,KAAKgQ,kBACnBC,EAAUjQ,KAAKjC,QAAQ7G,WAEzB6Y,GAAeA,IAAgBE,GACjCjQ,KAAK2D,UAAUjI,UAAUG,OAAO,kBAAkBkU,KAGpD/P,KAAK2D,UAAUjI,UAAUC,IAAI,kBAAkBsU,KAC/CjQ,KAAKgQ,kBAAoBC,CAC3B,CAEA9T,aAAAA,IRhNK,SAA8B8I,EAAOhF,EAAciQ,GACxD,IAAKjL,GAA0B,IAAjBA,EAAMxJ,QAAgByU,EAAQ,EAC1C,OAGF,MAAM/P,EAAa8E,EAAMxJ,OACnB0U,EAAkB,IAAI3T,IAE5B,IAAK,IAAI4T,EAAW,EAAGA,GAAYF,EAAOE,IAAY,CACpD,MAAMpD,GAAa/M,EAAemQ,EAAWjQ,GAAcA,EACrD8M,GAAahN,EAAemQ,GAAYjQ,EAExCkQ,EAAUpL,EAAM+H,IAAYvN,cAAc,OAC1C6Q,EAAUrL,EAAMgI,IAAYxN,cAAc,OAE5C4Q,GAAWA,EAAQ1T,MAAQ0T,EAAQE,UACrCJ,EAAgBxU,IAAI0U,EAAQ1T,KAE1B2T,GAAWA,EAAQ3T,MAAQ2T,EAAQC,UACrCJ,EAAgBxU,IAAI2U,EAAQ3T,IAEhC,CAEIwT,EAAgBK,KAAO,GACzBrU,EAAc,IAAIgU,IAAkBM,MAAMC,IACxC9R,QAAQC,KAAK,kBAAmB6R,IAGtC,CQqLIC,CAAqB3Q,KAAKiF,MAAOjF,KAAKE,MAAMD,aAAcD,KAAKjC,QAAQ1G,aACzE,CAGA2G,IAAAA,GACEgC,KAAKmG,UAAUnI,MACjB,CAEAH,IAAAA,GACEmC,KAAKmG,UAAUtI,MACjB,CAEAwD,IAAAA,CAAKxB,GACHG,KAAKmG,UAAU9E,KAAKxB,EACtB,CAEA+Q,eAAAA,GACE5Q,KAAK7I,WAAW0P,OAClB,CAEAgK,cAAAA,GACE7Q,KAAK7I,WAAWyP,MAClB,CAEAkK,gBAAAA,GACE9Q,KAAK7I,WAAWwP,QAClB,CAEAM,OAAAA,GACEjH,KAAK7I,WAAW8P,UAChBjH,KAAKgB,SAASgF,eACdhG,KAAKuO,aAAatH,UAClBjH,KAAK2E,GAAGsC,SACV,CAEA,gBAAIhH,GACF,OAAOD,KAAKE,MAAMD,YACpB,CAEA,kBAAI8Q,GACF,OAAO/Q,KAAK7I,WAAWqP,QACzB"}
|