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.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.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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"}
@@ -361,7 +361,7 @@
361
361
  </div>
362
362
  </div>
363
363
 
364
- <script src="../dist/peek-carousel.min.js"></script>
364
+ <script src="../dist/peek-carousel.js"></script>
365
365
  <script src="./example.min.js"></script>
366
366
  </body>
367
367
  </html>