peek-carousel 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"peek-carousel.esm.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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"}
1
+ {"version":3,"file":"peek-carousel.esm.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 this.previousIndex = null;\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 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 // ==========================================\n // Classic Mode - Seamless Infinite Scroll\n // ==========================================\n\n getWrapInfo(prevIndex, currentIndex) {\n if (prevIndex === null) return { isWrap: false, direction: 0 };\n\n const total = this.carousel.totalItems;\n const isForwardWrap = prevIndex === total - 1 && currentIndex === 0;\n const isBackwardWrap = prevIndex === 0 && currentIndex === total - 1;\n\n if (isForwardWrap) return { isWrap: true, direction: 1 };\n if (isBackwardWrap) return { isWrap: true, direction: -1 };\n\n return { isWrap: false, direction: currentIndex > prevIndex ? 1 : -1 };\n }\n\n getClassicItemPosition(itemIndex, currentIndex, itemSpacing, wrapDirection = 0) {\n const { prev, next } = this.getAdjacentIndices(currentIndex);\n const total = this.carousel.totalItems;\n\n if (itemIndex === currentIndex) {\n return {\n x: CLASSIC_POSITIONS.center.x,\n scale: CLASSIC_POSITIONS.center.scale,\n isCenter: true,\n };\n }\n\n if (itemIndex === prev) {\n return {\n x: CLASSIC_POSITIONS.center.x - itemSpacing,\n scale: CLASSIC_POSITIONS.peek.scale,\n isPrev: true,\n };\n }\n\n if (itemIndex === next) {\n return {\n x: CLASSIC_POSITIONS.center.x + itemSpacing,\n scale: CLASSIC_POSITIONS.peek.scale,\n isNext: true,\n };\n }\n\n // For other items, calculate based on circular distance\n const forwardDist = (itemIndex - currentIndex + total) % total;\n const backwardDist = (currentIndex - itemIndex + total) % total;\n const isOnRight = forwardDist < backwardDist;\n\n return {\n x: isOnRight\n ? CLASSIC_POSITIONS.center.x + itemSpacing * 2\n : CLASSIC_POSITIONS.center.x - itemSpacing * 2,\n scale: CLASSIC_POSITIONS.hidden.scale,\n isHidden: true,\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 const { isWrap, direction } = this.getWrapInfo(this.previousIndex, currentIndex);\n\n const items = this.carousel.items;\n\n // Get previous prev/next for transition handling\n const prevAdj = this.previousIndex !== null\n ? this.getAdjacentIndices(this.previousIndex)\n : { prev: null, next: null };\n\n // For wrapping, only disable transitions on items that would cross the screen\n if (isWrap) {\n // Items that should animate: current, prev, next, previousIndex, and previous prev/next\n const animatingItems = new Set([\n currentIndex,\n prev,\n next,\n this.previousIndex,\n prevAdj.prev,\n prevAdj.next,\n ].filter(i => i !== null));\n\n for (let i = 0; i < items.length; i++) {\n if (!animatingItems.has(i)) {\n items[i].style.transition = 'none';\n }\n }\n // Force reflow\n this.carousel.container.offsetHeight;\n }\n\n // Update all items to their final positions\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const pos = this.getClassicItemPosition(i, currentIndex, itemSpacing);\n\n this.setCSSVariables(item, {\n '--item-x': `${this.round(pos.x, 2)}%`,\n '--item-scale': String(pos.scale),\n });\n\n // Update visibility and opacity\n if (pos.isCenter) {\n item.style.opacity = '1';\n item.style.visibility = 'visible';\n item.style.zIndex = '100';\n } else if (pos.isPrev || pos.isNext) {\n item.style.opacity = '0.6';\n item.style.visibility = 'visible';\n item.style.zIndex = '50';\n } else {\n item.style.opacity = '0';\n item.style.visibility = 'hidden';\n item.style.zIndex = '0';\n }\n }\n\n // Re-enable transitions\n if (isWrap) {\n requestAnimationFrame(() => {\n for (let i = 0; i < items.length; i++) {\n items[i].style.transition = '';\n }\n });\n }\n\n this.previousIndex = currentIndex;\n this.carousel.ui.setPeekItems(prev, next);\n }\n\n // ==========================================\n // Momentum\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\nlet handlerId = 0;\n\nexport class EventHandler {\n constructor(carousel) {\n this.carousel = carousel;\n this.boundHandlers = new Map();\n this.resizeTimer = null;\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 const handler = () => {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n if (this.carousel) {\n this.carousel.animator.updateCarousel();\n }\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}-${++handlerId}`;\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 if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = 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.drag.active = false;\n this.drag.velocity = 0;\n this.wheel.isScrolling = false;\n this.wheel.accumulatedDelta = 0;\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","DEFAULT_OPTIONS","validateOptions","options","validated","CLASS_NAMES","SELECTORS","ARIA","BREAKPOINTS","DURATIONS","KEYS","getElement","selector","getElements","parent","addClass","element","classes","removeClass","setCSSVar","property","value","setAttribute","name","loadingCache","preloadImage","src","resolve","reject","img","promise","res","rej","preloadImages","sources","uniqueSources","preloadImagesInRange","items","currentIndex","range","totalItems","imagesToPreload","distance","prevIndex","nextIndex","prevImg","nextImg","err","iconCache","createSVGIcon","path","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","className","cacheKey","svg","ICONS","getIcon","iconName","customOptions","icon","injectIcon","button","iconHTML","injectAutoRotateIcons","playHTML","pauseHTML","isMobile","normalizeIndex","index","length","PROXIMITY_THRESHOLD","Navigator","carousel","from","to","total","normalizedTo","normalizedFrom","forwardDist","backwardDist","direction","normalizedIndex","targetIndex","callback","layoutMode","shortestDist","RADIAL_RADIUS","CLASSIC_POSITIONS","CLASSIC_SPACING","MOMENTUM_CONFIG","STACK_POSITION_CLASSES","Animator","diff","decimals","angle","rounded","variables","key","targetAngle","currentRotation","currentAngle","finalAngle","angleUnit","i","item","prev","next","containerWidth","itemWidth","baseSpacing","additionalSpacing","isForwardWrap","isBackwardWrap","itemIndex","itemSpacing","wrapDirection","isWrap","prevAdj","animatingItems","pos","velocity","currentVelocity","momentumStep","AutoRotate","isActive","rotateInterval","WHEEL_CONFIG","DRAG_CONFIG","RESIZE_DEBOUNCE","handlerId","EventHandler","navigationFn","currentIndicator","dragDistance","threshold","clientX","e","deltaX","deltaY","prevBtn","nextBtn","autoRotateBtn","handler","navigator","autoRotate","numKey","currentTime","indicators","swipeDistance","swipeThreshold","deltaTime","event","DRAG_TRANSFORM_CONFIG","UIManager","indicator","currentItem","prevItem","nextItem","leftClass","rightClass","progress","config","easedProgress","dragOffset","dragRotation","FULL_CIRCLE_DEGREES","PeekCarousel","existingNav","nav","existingControls","indicatorsWrapper","controls","wrapper","existingCounter","counter","currentSpan","startIndex","preloadRange","isNearby","currentMode","newMode"],"mappings":"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"}