{"version":3,"file":"simple-details-vanilla.cjs","sources":["../../src/scripts/helpers.ts","../../src/scripts/DetailsController.ts","../../src/vanilla/SimpleDetails.ts"],"sourcesContent":["import { debounce as esDebounce, clamp, sortBy } from 'es-toolkit'\nimport type { EasingFunction, Breakpoints } from 'src/types'\n\nexport interface AnimationOptions {\n  durationMin: number\n  durationMax: number\n  durationPerHeight: number\n  easing?: EasingFunction\n  disabled?: boolean\n}\n\nexport function calculateDuration(\n  startHeight: number,\n  endHeight: number,\n  options: AnimationOptions\n): number {\n  const heightDiff = Math.abs(endHeight - startHeight)\n  const calculatedDuration = options.durationMin + heightDiff * options.durationPerHeight\n  return clamp(calculatedDuration, options.durationMin, options.durationMax)\n}\n\nexport function animateHeight(\n  element: HTMLElement,\n  startHeight: number,\n  endHeight: number,\n  duration: number,\n  easing: EasingFunction,\n  onFinish: () => void,\n  onCancel?: () => void\n): Animation {\n  const animation = element.animate(\n    { height: [`${ startHeight }px`, `${ endHeight }px`] },\n    { duration, easing }\n  )\n  animation.onfinish = onFinish\n  animation.oncancel = onCancel ?? null\n  return animation\n}\n\nexport function setupScrollbarStyles(\n  element: HTMLElement,\n  scrollbarClass: string = 'has-vertical-scrollbar'\n): void {\n  const hasVerticalScrollbar = element.scrollHeight > element.clientHeight\n  element.classList.toggle(scrollbarClass, hasVerticalScrollbar)\n}\n\nexport function getActiveBreakpointOptions<T extends AnimationOptions>(\n  baseOptions: T,\n  breakpoints?: Breakpoints\n): T & { disabled: boolean } {\n  const result: T & { disabled: boolean } = { ...baseOptions, disabled: false }\n\n  if (!breakpoints || typeof window === 'undefined') {\n    return result\n  }\n\n  const breakpointEntries = Object.entries(breakpoints).map(([width, options]) => ({\n    width: Number(width),\n    options\n  }))\n  const sortedBreakpoints = sortBy(breakpointEntries, ['width'])\n\n  const windowWidth = window.innerWidth\n\n  for (const { width, options } of sortedBreakpoints) {\n    if (windowWidth >= width) {\n      Object.assign(result, options)\n    }\n  }\n\n  return result\n}\n\nexport function debounce<T extends (...args: any[]) => void>(\n  fn: T,\n  delay: number\n) {\n  return esDebounce(fn, delay)\n}\n\nexport { clamp, sortBy } from 'es-toolkit'\n","import {\n  calculateDuration,\n  animateHeight,\n  setupScrollbarStyles,\n  type AnimationOptions,\n} from './helpers'\n\nexport interface DetailsCallbacks {\n  onStateChange?: (state: { isOpen: boolean; isOpening: boolean; isClosing: boolean }) => void\n  onOpenChange?: (open: boolean) => void\n  onOpen?: () => void\n  onClose?: () => void\n  onAnimationStart?: (opening: boolean) => void\n  onAnimationEnd?: (opening: boolean) => void\n}\n\nexport interface DetailsControllerOptions {\n  details: HTMLDetailsElement\n  content: HTMLElement\n  summary: HTMLElement\n  button?: HTMLElement | null\n  getOptions: () => AnimationOptions & { disabled: boolean }\n  getScrollbarClass: () => string\n  callbacks?: DetailsCallbacks\n  initialOpen?: boolean\n}\n\nexport class DetailsController {\n  private _animation: Animation | null = null\n  private readonly details: HTMLDetailsElement\n  private readonly content: HTMLElement\n  private readonly summary: HTMLElement\n  private readonly button: HTMLElement | null | undefined\n  private readonly getOptions: () => AnimationOptions & { disabled: boolean }\n  private readonly getScrollbarClass: () => string\n  private readonly callbacks: DetailsCallbacks\n\n  constructor(options: DetailsControllerOptions) {\n    this.details = options.details\n    this.content = options.content\n    this.summary = options.summary\n    this.button = options.button\n    this.getOptions = options.getOptions\n    this.getScrollbarClass = options.getScrollbarClass\n    this.callbacks = options.callbacks ?? {}\n\n    const initialOpen = options.initialOpen ?? false\n    this.button?.setAttribute('aria-expanded', String(initialOpen))\n\n    if (initialOpen) {\n      this._isOpen = true\n      this.details.open = true\n      this.details.classList.add('open')\n      this.content.classList.add('open')\n      setupScrollbarStyles(this.content, this.getScrollbarClass())\n    }\n  }\n\n  private _isOpen = false\n\n  get isOpen() {\n    return this._isOpen\n  }\n\n  private _isOpening = false\n\n  get isOpening() {\n    return this._isOpening\n  }\n\n  private _isClosing = false\n\n  get isClosing() {\n    return this._isClosing\n  }\n\n  get isAnimating() {\n    return this._isOpening || this._isClosing\n  }\n\n  public cancelAnimation(): void {\n    if (this._animation) {\n      this._animation.cancel()\n      this._animation = null\n    }\n  }\n\n  public openWithAnimation(): void {\n    const startHeight = this.details.offsetHeight\n    this.details.style.height = `${ startHeight }px`\n    this.details.style.overflow = 'hidden'\n    this.details.open = true\n    requestAnimationFrame(() => this.expand())\n  }\n\n  public closeWithAnimation(): void {\n    this.details.style.overflow = 'hidden'\n    this.shrink()\n  }\n\n  public openInstant(): void {\n    this._isOpen = true\n    this.details.open = true\n    this.details.classList.add('open')\n    this.content.classList.add('open')\n    setupScrollbarStyles(this.content, this.getScrollbarClass())\n    this.updateButtonAria(true)\n    this.notifyState()\n    this.callbacks.onOpenChange?.(true)\n    this.callbacks.onOpen?.()\n  }\n\n  public closeInstant(): void {\n    this._isOpen = false\n    this.details.open = false\n    this.details.classList.remove('open')\n    this.content.classList.remove('open')\n    this.updateButtonAria(false)\n    this.notifyState()\n    this.callbacks.onOpenChange?.(false)\n    this.callbacks.onClose?.()\n  }\n\n  public toggle(): void {\n    const options = this.getOptions()\n\n    if (options.disabled) {\n      if (this._isOpen) {\n        this.closeInstant()\n      } else {\n        this.openInstant()\n      }\n      return\n    }\n\n    if (this.isAnimating) {\n      this.cancelAnimation()\n      if (this._isOpening) {\n        this._isOpening = false\n        this.closeWithAnimation()\n      } else {\n        this._isClosing = false\n        this.openWithAnimation()\n      }\n      return\n    }\n\n    if (this._isOpen) {\n      this.closeWithAnimation()\n    } else {\n      this.openWithAnimation()\n    }\n  }\n\n  public open(): void {\n    if (!this._isOpen && !this._isOpening) {\n      const options = this.getOptions()\n      if (options.disabled) {\n        this.openInstant()\n      } else {\n        this.openWithAnimation()\n      }\n    }\n  }\n\n  public close(): void {\n    if (this._isOpen && !this._isClosing) {\n      const options = this.getOptions()\n      if (options.disabled) {\n        this.closeInstant()\n      } else {\n        this.closeWithAnimation()\n      }\n    }\n  }\n\n  public destroy(): void {\n    this.cancelAnimation()\n  }\n\n  private updateButtonAria(open: boolean): void {\n    this.button?.setAttribute('aria-expanded', String(open))\n  }\n\n  private notifyState(): void {\n    this.callbacks.onStateChange?.({\n      isOpen: this._isOpen,\n      isOpening: this._isOpening,\n      isClosing: this._isClosing,\n    })\n  }\n\n  private onAnimationFinish(open: boolean): void {\n    this._isOpening = false\n    this._isClosing = false\n    this._animation = null\n    this._isOpen = open\n\n    this.details.open = open\n    this.details.style.height = ''\n    this.details.style.overflow = ''\n    this.details.classList.remove('is-opening', 'is-closing')\n    this.content.classList.remove('is-opening', 'is-closing')\n\n    if (open) {\n      this.details.classList.add('open')\n      this.content.classList.add('open')\n      setupScrollbarStyles(this.content, this.getScrollbarClass())\n    } else {\n      this.details.classList.remove('open')\n      this.content.classList.remove('open')\n    }\n\n    this.updateButtonAria(open)\n    this.notifyState()\n    this.callbacks.onOpenChange?.(open)\n    this.callbacks.onAnimationEnd?.(open)\n    if (open) {\n      this.callbacks.onOpen?.()\n    } else {\n      this.callbacks.onClose?.()\n    }\n  }\n\n  private onAnimationCancel(wasOpening: boolean): void {\n    if (wasOpening) {\n      this._isOpening = false\n    } else {\n      this._isClosing = false\n    }\n    this.notifyState()\n  }\n\n  private expand(): void {\n    const options = this.getOptions()\n\n    this._isOpening = true\n    this.details.classList.add('is-opening')\n    this.content.classList.add('is-opening')\n    this.notifyState()\n    this.callbacks.onAnimationStart?.(true)\n\n    const startHeight = this.details.offsetHeight\n    const endHeight = this.summary.offsetHeight + this.content.offsetHeight\n\n    this.cancelAnimation()\n\n    this._animation = animateHeight(\n      this.details,\n      startHeight,\n      endHeight,\n      calculateDuration(startHeight, endHeight, options),\n      options.easing ?? 'ease-in-out',\n      () => this.onAnimationFinish(true),\n      () => this.onAnimationCancel(true),\n    )\n  }\n\n  private shrink(): void {\n    const options = this.getOptions()\n\n    this._isClosing = true\n    this.details.classList.add('is-closing')\n    this.content.classList.add('is-closing')\n    this.notifyState()\n    this.callbacks.onAnimationStart?.(false)\n\n    const startHeight = this.details.offsetHeight\n    const endHeight = this.summary.offsetHeight\n\n    this.cancelAnimation()\n\n    this._animation = animateHeight(\n      this.details,\n      startHeight,\n      endHeight,\n      calculateDuration(startHeight, endHeight, options),\n      options.easing ?? 'ease-in-out',\n      () => this.onAnimationFinish(false),\n      () => this.onAnimationCancel(false),\n    )\n  }\n}\n","import { toMerged } from 'es-toolkit'\nimport type { iElementData, iOptions, iSelectors } from 'src/types/index.d'\nimport { getActiveBreakpointOptions, debounce, type AnimationOptions } from 'src/scripts/helpers'\nimport { DetailsController } from 'src/scripts/DetailsController'\n\nexport class SimpleDetails {\n  private static readonly optionsDefault: iOptions = {\n    clickArea: 'summary-and-button',\n    selectors: {\n      details: '.SimpleDetails',\n      summary: '.SimpleDetailsSummary',\n      button: '.SimpleDetailsButton',\n      content: '.SimpleDetailsBody',\n      scrollbars: {\n        vertical: 'has-vertical-scrollbar',\n      },\n    },\n    durationMin: 333,\n    durationMax: 1000,\n    durationPerHeight: 0.5,\n    easing: 'ease-in-out',\n    theme: 'default',\n    accordion: false,\n    breakpoints: undefined,\n  }\n\n  public elements: iElementData[] = []\n  public options: iOptions\n  public selectors: iSelectors\n\n  private readonly onClick: (event: MouseEvent) => void\n  private readonly onResize: () => void\n\n  constructor(optionsCustom?: Partial<iOptions>) {\n    this.options = toMerged(SimpleDetails.optionsDefault, optionsCustom ?? {}) as iOptions\n    this.selectors = this.options.selectors\n    this.onClick = this.handleClick.bind(this)\n    this.onResize = debounce(this.handleResize.bind(this), 100)\n  }\n\n  public init(): void {\n    this.updateListeners()\n    this.updateElements()\n    this.checkDisabledState()\n  }\n\n  public updateElements(): void {\n    this.elements.forEach((el) => el.controller.destroy())\n\n    const detailsEls = Array.from(\n      document.body.querySelectorAll<HTMLDetailsElement>(this.selectors.details)\n    )\n\n    this.elements = detailsEls.map((detailsEl) => {\n      const summary = detailsEl.querySelector<HTMLElement>(this.selectors.summary)\n      const content = detailsEl.querySelector<HTMLElement>(this.selectors.content)\n      const button = detailsEl.querySelector<HTMLElement>(this.selectors.button)\n\n      if (!summary || !content) {\n        throw new Error(`SimpleDetails: Missing required elements (summary or content) in ${ detailsEl }`)\n      }\n\n      detailsEl.classList.add(`sd_${ this.options.theme.replace(' ', '_') }`)\n\n      const isOpen = detailsEl.classList.contains('open') || detailsEl.hasAttribute('open')\n\n      const controller = new DetailsController({\n        details: detailsEl,\n        content,\n        summary,\n        button,\n        getOptions: () => this.getActiveOptions(),\n        getScrollbarClass: () => this.selectors.scrollbars.vertical,\n        initialOpen: isOpen,\n        callbacks: {\n          onOpen: () => {\n            if (this.options.accordion) {\n              this.elements\n                .filter((el) => el.controller !== controller && el.controller.isOpen)\n                .forEach((el) => el.controller.close())\n            }\n            this.options.onOpen?.()\n          },\n          onClose: this.options.onClose,\n          onAnimationStart: this.options.onAnimationStart,\n          onAnimationEnd: this.options.onAnimationEnd,\n        },\n      })\n\n      return { details: detailsEl, summary, button, content, controller }\n    })\n  }\n\n  public openAll(): void {\n    this.elements.forEach((el) => el.controller.open())\n  }\n\n  public collapseAll(): void {\n    this.elements.forEach((el) => el.controller.close())\n  }\n\n  public destroy(): void {\n    window.removeEventListener('resize', this.onResize)\n    document.removeEventListener('click', this.onClick)\n    this.elements.forEach((el) => el.controller.destroy())\n    this.elements = []\n  }\n\n  private getActiveOptions(): AnimationOptions & { disabled: boolean } {\n    return getActiveBreakpointOptions(\n      {\n        durationMin: this.options.durationMin,\n        durationMax: this.options.durationMax,\n        durationPerHeight: this.options.durationPerHeight,\n        easing: this.options.easing,\n      },\n      this.options.breakpoints,\n    )\n  }\n\n  private checkDisabledState(): void {\n    const options = this.getActiveOptions()\n    if (options.disabled) {\n      this.elements.forEach((el) => {\n        if (!el.controller.isOpen) el.controller.openInstant()\n      })\n    }\n  }\n\n  private handleClick(event: MouseEvent): void {\n    const target = event.target as HTMLElement\n    const summaryEl = target.closest<HTMLElement>(this.selectors.summary)\n    const buttonEl = target.closest<HTMLElement>(this.selectors.button)\n\n    if (!summaryEl && !buttonEl) return\n    if (target.closest('a[href]')) return\n\n    event.preventDefault()\n\n    const { clickArea } = this.options\n    if (summaryEl && !buttonEl && !(clickArea === 'summary' || clickArea === 'summary-and-button')) return\n    if (buttonEl && !(clickArea === 'button' || clickArea === 'summary-and-button')) return\n\n    const summary = summaryEl ?? buttonEl!.closest<HTMLElement>(this.selectors.summary)\n    const data = this.elements.find((d) => d.summary === summary)\n    if (!data) return\n\n    data.controller.toggle()\n  }\n\n  private handleResize(): void {\n    this.checkDisabledState()\n  }\n\n  private updateListeners(): void {\n    window.removeEventListener('resize', this.onResize)\n    document.removeEventListener('click', this.onClick)\n\n    window.addEventListener('resize', this.onResize)\n    document.addEventListener('click', this.onClick)\n  }\n}\n"],"names":["calculateDuration","startHeight","endHeight","options","heightDiff","calculatedDuration","clamp","animateHeight","element","duration","easing","onFinish","onCancel","animation","setupScrollbarStyles","scrollbarClass","hasVerticalScrollbar","getActiveBreakpointOptions","baseOptions","breakpoints","result","breakpointEntries","width","sortedBreakpoints","sortBy","windowWidth","debounce","fn","delay","esDebounce","DetailsController","initialOpen","open","wasOpening","_SimpleDetails","optionsCustom","toMerged","el","detailsEls","detailsEl","summary","content","button","isOpen","controller","event","target","summaryEl","buttonEl","clickArea","data","d","SimpleDetails"],"mappings":"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"}