{"version":3,"sources":["../packages/snap/src/debounce.ts","../packages/snap/src/element.ts","../packages/snap/src/uid.ts","../packages/snap/src/snap.ts"],"sourcesContent":["export function debounce<CB extends (...args: unknown[]) => void>(\n  callback: CB,\n  delay: number\n) {\n  let timer: ReturnType<typeof setTimeout> | undefined\n  return function <T>(this: T, ...args: Parameters<typeof callback>): void {\n    clearTimeout(timer)\n    timer = setTimeout(() => {\n      timer = undefined\n      callback.apply(this, args)\n    }, delay)\n  }\n}\n","import { debounce } from './debounce'\n\nfunction removeParentSticky(element: HTMLElement) {\n  const position = getComputedStyle(element).position\n\n  const isSticky = position === 'sticky'\n\n  if (isSticky) {\n    element.style.setProperty('position', 'static')\n    element.dataset.sticky = 'true'\n  }\n\n  if (element.offsetParent) {\n    removeParentSticky(element.offsetParent as HTMLElement)\n  }\n}\n\nfunction addParentSticky(element: HTMLElement) {\n  if (element?.dataset?.sticky === 'true') {\n    element.style.removeProperty('position')\n    delete element.dataset.sticky\n  }\n\n  if (element.offsetParent) {\n    addParentSticky(element.offsetParent as HTMLElement)\n  }\n}\n\nfunction offsetTop(element: HTMLElement, accumulator = 0) {\n  const top = accumulator + element.offsetTop\n  if (element.offsetParent) {\n    return offsetTop(element.offsetParent as HTMLElement, top)\n  }\n  return top\n}\n\nfunction offsetLeft(element: HTMLElement, accumulator = 0) {\n  const left = accumulator + element.offsetLeft\n  if (element.offsetParent) {\n    return offsetLeft(element.offsetParent as HTMLElement, left)\n  }\n  return left\n}\n\nfunction scrollTop(element: HTMLElement, accumulator = 0) {\n  const top = accumulator + element.scrollTop\n  if (element.offsetParent) {\n    return scrollTop(element.offsetParent as HTMLElement, top)\n  }\n  return top + window.scrollY\n}\n\nfunction scrollLeft(element: HTMLElement, accumulator = 0) {\n  const left = accumulator + element.scrollLeft\n  if (element.offsetParent) {\n    return scrollLeft(element.offsetParent as HTMLElement, left)\n  }\n  return left + window.scrollX\n}\n\nexport type SnapElementOptions = {\n  align?: string | string[]\n  ignoreSticky?: boolean\n  ignoreTransform?: boolean\n}\n\ntype Rect = {\n  top: number\n  left: number\n  width: number\n  height: number\n  x: number\n  y: number\n  bottom: number\n  right: number\n  element: HTMLElement\n}\n\nexport class SnapElement {\n  element: HTMLElement\n  options: SnapElementOptions\n  align: string[]\n  // @ts-expect-error\n  rect: Rect = {}\n  wrapperResizeObserver: ResizeObserver\n  resizeObserver: ResizeObserver\n  debouncedWrapperResize: () => void\n\n  constructor(\n    element: HTMLElement,\n    {\n      align = ['start'],\n      ignoreSticky = true,\n      ignoreTransform = false,\n    }: SnapElementOptions = {}\n  ) {\n    this.element = element\n\n    this.options = { align, ignoreSticky, ignoreTransform }\n\n    this.align = [align].flat()\n\n    this.debouncedWrapperResize = debounce(this.onWrapperResize, 500)\n\n    this.wrapperResizeObserver = new ResizeObserver(this.debouncedWrapperResize)\n    this.wrapperResizeObserver.observe(document.body)\n    this.onWrapperResize()\n\n    this.resizeObserver = new ResizeObserver(this.onResize)\n    this.resizeObserver.observe(this.element)\n    this.setRect({\n      width: this.element.offsetWidth,\n      height: this.element.offsetHeight,\n    })\n  }\n\n  destroy() {\n    this.wrapperResizeObserver.disconnect()\n    this.resizeObserver.disconnect()\n  }\n\n  setRect({\n    top,\n    left,\n    width,\n    height,\n    element,\n  }: {\n    top?: number\n    left?: number\n    width?: number\n    height?: number\n    element?: HTMLElement\n  } = {}) {\n    top = top ?? this.rect.top\n    left = left ?? this.rect.left\n    width = width ?? this.rect.width\n    height = height ?? this.rect.height\n    element = element ?? this.rect.element\n\n    if (\n      top === this.rect.top &&\n      left === this.rect.left &&\n      width === this.rect.width &&\n      height === this.rect.height &&\n      element === this.rect.element\n    )\n      return\n\n    this.rect.top = top\n    this.rect.y = top\n    this.rect.width = width\n    this.rect.height = height\n    this.rect.left = left\n    this.rect.x = left\n    this.rect.bottom = top + height\n    this.rect.right = left + width\n  }\n\n  onWrapperResize = () => {\n    let top: number | undefined\n    let left: number | undefined\n\n    if (this.options.ignoreSticky) removeParentSticky(this.element)\n    if (this.options.ignoreTransform) {\n      top = offsetTop(this.element)\n      left = offsetLeft(this.element)\n    } else {\n      const rect = this.element.getBoundingClientRect()\n      top = rect.top + scrollTop(this.element)\n      left = rect.left + scrollLeft(this.element)\n    }\n    if (this.options.ignoreSticky) addParentSticky(this.element)\n\n    this.setRect({ top, left })\n  }\n\n  onResize = ([entry]: ResizeObserverEntry[]) => {\n    if (!entry?.borderBoxSize[0]) return\n    const width = entry.borderBoxSize[0].inlineSize\n    const height = entry.borderBoxSize[0].blockSize\n\n    this.setRect({ width, height })\n  }\n}\n","let index = 0\n\nexport type UID = number\n\nexport function uid(): UID {\n  return index++\n}\n","import type Lenis from 'lenis'\nimport type { VirtualScrollData } from 'lenis'\nimport { debounce } from './debounce'\nimport type { SnapElementOptions } from './element'\nimport { SnapElement } from './element'\nimport type { SnapItem, SnapOptions } from './types'\nimport type { UID } from './uid'\nimport { uid } from './uid'\n\n// TODO:\n// - fix wheel scrolling after limits (see console scroll to)\n// - arrow, spacebar\n\ntype RequiredPick<T, F extends keyof T> = Omit<T, F> & Required<Pick<T, F>>\n\n/**\n * Snap class to handle the snap functionality\n *\n * @example\n * const snap = new Snap(lenis, {\n *   type: 'mandatory', // 'mandatory', 'proximity' or 'lock'\n *   onSnapStart: (snap) => {\n *     console.log('onSnapStart', snap)\n *   },\n *   onSnapComplete: (snap) => {\n *     console.log('onSnapComplete', snap)\n *   },\n * })\n *\n * snap.add(500) // snap at 500px\n *\n * const removeSnap = snap.add(500)\n *\n * if (someCondition) {\n *   removeSnap()\n * }\n */\nexport class Snap {\n  options: RequiredPick<SnapOptions, 'type' | 'debounce'>\n  elements = new Map<UID, SnapElement>()\n  snaps = new Map<UID, SnapItem>()\n  viewport: { width: number; height: number } = {\n    width: window.innerWidth,\n    height: window.innerHeight,\n  }\n  isStopped = false\n  onSnapDebounced: (e: VirtualScrollData) => void\n  currentSnapIndex?: number\n\n  constructor(\n    private lenis: Lenis,\n    {\n      type = 'proximity',\n      lerp,\n      easing,\n      duration,\n      distanceThreshold = '50%', // useless when type is \"mandatory\"\n      debounce: debounceDelay = 500,\n      onSnapStart,\n      onSnapComplete,\n    }: SnapOptions = {}\n  ) {\n    if (!window.lenis) {\n      window.lenis = {}\n    }\n\n    window.lenis.snap = true\n\n    this.options = {\n      type,\n      lerp,\n      easing,\n      duration,\n      distanceThreshold,\n      debounce: debounceDelay,\n      onSnapStart,\n      onSnapComplete,\n    }\n\n    this.onWindowResize()\n    window.addEventListener('resize', this.onWindowResize)\n\n    this.onSnapDebounced = debounce(\n      this.onSnap as (...args: unknown[]) => void,\n      this.options.debounce\n    )\n\n    this.lenis.on('virtual-scroll', this.onSnapDebounced)\n  }\n\n  /**\n   * Destroy the snap instance\n   */\n  destroy() {\n    this.lenis.off('virtual-scroll', this.onSnapDebounced)\n    window.removeEventListener('resize', this.onWindowResize)\n    this.elements.forEach((element) => {\n      element.destroy()\n    })\n  }\n\n  /**\n   * Start the snap after it has been stopped\n   */\n  start() {\n    this.isStopped = false\n  }\n\n  /**\n   * Stop the snap\n   */\n  stop() {\n    this.isStopped = true\n  }\n\n  /**\n   * Add a snap to the snap instance\n   *\n   * @param value The value to snap to\n   * @param userData User data that will be forwarded through the snap event\n   * @returns Unsubscribe function\n   */\n  add(value: number): () => void {\n    const id = uid()\n\n    this.snaps.set(id, { value })\n\n    return () => this.snaps.delete(id)\n  }\n\n  /**\n   * Add an element to the snap instance\n   *\n   * @param element The element to add\n   * @param options The options for the element\n   * @returns Unsubscribe function\n   */\n  addElement(\n    element: HTMLElement,\n    options: SnapElementOptions = {}\n  ): () => void {\n    const id = uid()\n\n    this.elements.set(id, new SnapElement(element, options))\n\n    return () => this.elements.delete(id)\n  }\n\n  addElements(\n    elements: HTMLElement[],\n    options: SnapElementOptions = {}\n  ): () => void {\n    const map = [...elements].map((element) =>\n      this.addElement(element, options)\n    )\n    return () => {\n      map.forEach((remove) => {\n        remove()\n      })\n    }\n  }\n\n  private onWindowResize = () => {\n    this.viewport.width = window.innerWidth\n    this.viewport.height = window.innerHeight\n  }\n\n  private computeSnaps = () => {\n    const { isHorizontal } = this.lenis\n\n    let snaps = [...this.snaps.values()] as SnapItem[]\n\n    this.elements.forEach(({ rect, align }) => {\n      let value: number | undefined\n\n      align.forEach((align) => {\n        if (align === 'start') {\n          value = rect.top\n        } else if (align === 'center') {\n          value = isHorizontal\n            ? rect.left + rect.width / 2 - this.viewport.width / 2\n            : rect.top + rect.height / 2 - this.viewport.height / 2\n        } else if (align === 'end') {\n          value = isHorizontal\n            ? rect.left + rect.width - this.viewport.width\n            : rect.top + rect.height - this.viewport.height\n        }\n\n        if (typeof value === 'number') {\n          snaps.push({ value: Math.ceil(value) })\n        }\n      })\n    })\n\n    snaps = snaps.sort((a, b) => Math.abs(a.value) - Math.abs(b.value))\n\n    return snaps\n  }\n\n  previous() {\n    this.goTo((this.currentSnapIndex ?? 0) - 1)\n  }\n\n  next() {\n    this.goTo((this.currentSnapIndex ?? 0) + 1)\n  }\n\n  goTo(index: number) {\n    const snaps = this.computeSnaps()\n\n    if (snaps.length === 0) return\n\n    this.currentSnapIndex = Math.max(0, Math.min(index, snaps.length - 1))\n\n    const currentSnap = snaps[this.currentSnapIndex]\n    if (currentSnap === undefined) return\n\n    this.lenis.scrollTo(currentSnap.value, {\n      duration: this.options.duration,\n      easing: this.options.easing,\n      lerp: this.options.lerp,\n      lock: this.options.type === 'lock',\n      userData: { initiator: 'snap' },\n      onStart: () => {\n        this.options.onSnapStart?.({\n          index: this.currentSnapIndex,\n          ...currentSnap,\n        })\n      },\n      onComplete: () => {\n        this.options.onSnapComplete?.({\n          index: this.currentSnapIndex,\n          ...currentSnap,\n        })\n      },\n    })\n  }\n\n  get distanceThreshold() {\n    let distanceThreshold = Number.POSITIVE_INFINITY\n    if (this.options.type === 'mandatory') return Number.POSITIVE_INFINITY\n\n    const { isHorizontal } = this.lenis\n\n    const axis = isHorizontal ? 'width' : 'height'\n\n    if (\n      typeof this.options.distanceThreshold === 'string' &&\n      this.options.distanceThreshold.endsWith('%')\n    ) {\n      distanceThreshold =\n        (Number(this.options.distanceThreshold.replace('%', '')) / 100) *\n        this.viewport[axis]\n    } else if (typeof this.options.distanceThreshold === 'number') {\n      distanceThreshold = this.options.distanceThreshold\n    } else {\n      distanceThreshold = this.viewport[axis]\n    }\n\n    return distanceThreshold\n  }\n\n  private onSnap = (e: VirtualScrollData) => {\n    if (this.isStopped) return\n\n    if (e.event.type === 'touchmove') return\n\n    if (\n      this.options.type === 'lock' &&\n      this.lenis.userData?.initiator === 'snap'\n    )\n      return\n\n    let { scroll, isHorizontal } = this.lenis\n    const delta = isHorizontal ? e.deltaX : e.deltaY\n    scroll = Math.ceil(this.lenis.scroll + delta)\n\n    const snaps = this.computeSnaps()\n\n    if (snaps.length === 0) return\n\n    let snapIndex: number | undefined\n\n    const prevSnapIndex = snaps.findLastIndex(({ value }) => value < scroll)\n    const nextSnapIndex = snaps.findIndex(({ value }) => value > scroll)\n\n    if (this.options.type === 'lock') {\n      if (delta > 0) {\n        snapIndex = nextSnapIndex\n      } else if (delta < 0) {\n        snapIndex = prevSnapIndex\n      }\n    } else {\n      const prevSnap = snaps[prevSnapIndex]!\n      const distanceToPrevSnap = prevSnap\n        ? Math.abs(scroll - prevSnap.value)\n        : Number.POSITIVE_INFINITY\n\n      const nextSnap = snaps[nextSnapIndex]!\n      const distanceToNextSnap = nextSnap\n        ? Math.abs(scroll - nextSnap.value)\n        : Number.POSITIVE_INFINITY\n      snapIndex =\n        distanceToPrevSnap < distanceToNextSnap ? prevSnapIndex : nextSnapIndex\n    }\n\n    if (snapIndex === undefined) return\n    if (snapIndex === -1) return\n\n    snapIndex = Math.max(0, Math.min(snapIndex, snaps.length - 1))\n\n    const snap = snaps[snapIndex]!\n\n    const distance = Math.abs(scroll - snap.value)\n\n    if (distance <= this.distanceThreshold) {\n      this.goTo(snapIndex)\n    }\n  }\n\n  resize() {\n    this.elements.forEach((element) => {\n      element.onWrapperResize()\n    })\n  }\n}\n"],"mappings":";AAAO,SAAS,SACd,UACA,OACA;AACA,MAAI;AACJ,SAAO,YAAyB,MAAyC;AACvE,iBAAa,KAAK;AAClB,YAAQ,WAAW,MAAM;AACvB,cAAQ;AACR,eAAS,MAAM,MAAM,IAAI;AAAA,IAC3B,GAAG,KAAK;AAAA,EACV;AACF;;;ACVA,SAAS,mBAAmB,SAAsB;AAChD,QAAM,WAAW,iBAAiB,OAAO,EAAE;AAE3C,QAAM,WAAW,aAAa;AAE9B,MAAI,UAAU;AACZ,YAAQ,MAAM,YAAY,YAAY,QAAQ;AAC9C,YAAQ,QAAQ,SAAS;AAAA,EAC3B;AAEA,MAAI,QAAQ,cAAc;AACxB,uBAAmB,QAAQ,YAA2B;AAAA,EACxD;AACF;AAEA,SAAS,gBAAgB,SAAsB;AAC7C,MAAI,SAAS,SAAS,WAAW,QAAQ;AACvC,YAAQ,MAAM,eAAe,UAAU;AACvC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,MAAI,QAAQ,cAAc;AACxB,oBAAgB,QAAQ,YAA2B;AAAA,EACrD;AACF;AAEA,SAAS,UAAU,SAAsB,cAAc,GAAG;AACxD,QAAM,MAAM,cAAc,QAAQ;AAClC,MAAI,QAAQ,cAAc;AACxB,WAAO,UAAU,QAAQ,cAA6B,GAAG;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,WAAW,SAAsB,cAAc,GAAG;AACzD,QAAM,OAAO,cAAc,QAAQ;AACnC,MAAI,QAAQ,cAAc;AACxB,WAAO,WAAW,QAAQ,cAA6B,IAAI;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,SAAS,UAAU,SAAsB,cAAc,GAAG;AACxD,QAAM,MAAM,cAAc,QAAQ;AAClC,MAAI,QAAQ,cAAc;AACxB,WAAO,UAAU,QAAQ,cAA6B,GAAG;AAAA,EAC3D;AACA,SAAO,MAAM,OAAO;AACtB;AAEA,SAAS,WAAW,SAAsB,cAAc,GAAG;AACzD,QAAM,OAAO,cAAc,QAAQ;AACnC,MAAI,QAAQ,cAAc;AACxB,WAAO,WAAW,QAAQ,cAA6B,IAAI;AAAA,EAC7D;AACA,SAAO,OAAO,OAAO;AACvB;AAoBO,IAAM,cAAN,MAAkB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA,OAAa,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACE,SACA;AAAA,IACE,QAAQ,CAAC,OAAO;AAAA,IAChB,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB,IAAwB,CAAC,GACzB;AACA,SAAK,UAAU;AAEf,SAAK,UAAU,EAAE,OAAO,cAAc,gBAAgB;AAEtD,SAAK,QAAQ,CAAC,KAAK,EAAE,KAAK;AAE1B,SAAK,yBAAyB,SAAS,KAAK,iBAAiB,GAAG;AAEhE,SAAK,wBAAwB,IAAI,eAAe,KAAK,sBAAsB;AAC3E,SAAK,sBAAsB,QAAQ,SAAS,IAAI;AAChD,SAAK,gBAAgB;AAErB,SAAK,iBAAiB,IAAI,eAAe,KAAK,QAAQ;AACtD,SAAK,eAAe,QAAQ,KAAK,OAAO;AACxC,SAAK,QAAQ;AAAA,MACX,OAAO,KAAK,QAAQ;AAAA,MACpB,QAAQ,KAAK,QAAQ;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,UAAU;AACR,SAAK,sBAAsB,WAAW;AACtC,SAAK,eAAe,WAAW;AAAA,EACjC;AAAA,EAEA,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAMI,CAAC,GAAG;AACN,UAAM,OAAO,KAAK,KAAK;AACvB,WAAO,QAAQ,KAAK,KAAK;AACzB,YAAQ,SAAS,KAAK,KAAK;AAC3B,aAAS,UAAU,KAAK,KAAK;AAC7B,cAAU,WAAW,KAAK,KAAK;AAE/B,QACE,QAAQ,KAAK,KAAK,OAClB,SAAS,KAAK,KAAK,QACnB,UAAU,KAAK,KAAK,SACpB,WAAW,KAAK,KAAK,UACrB,YAAY,KAAK,KAAK;AAEtB;AAEF,SAAK,KAAK,MAAM;AAChB,SAAK,KAAK,IAAI;AACd,SAAK,KAAK,QAAQ;AAClB,SAAK,KAAK,SAAS;AACnB,SAAK,KAAK,OAAO;AACjB,SAAK,KAAK,IAAI;AACd,SAAK,KAAK,SAAS,MAAM;AACzB,SAAK,KAAK,QAAQ,OAAO;AAAA,EAC3B;AAAA,EAEA,kBAAkB,MAAM;AACtB,QAAI;AACJ,QAAI;AAEJ,QAAI,KAAK,QAAQ,aAAc,oBAAmB,KAAK,OAAO;AAC9D,QAAI,KAAK,QAAQ,iBAAiB;AAChC,YAAM,UAAU,KAAK,OAAO;AAC5B,aAAO,WAAW,KAAK,OAAO;AAAA,IAChC,OAAO;AACL,YAAM,OAAO,KAAK,QAAQ,sBAAsB;AAChD,YAAM,KAAK,MAAM,UAAU,KAAK,OAAO;AACvC,aAAO,KAAK,OAAO,WAAW,KAAK,OAAO;AAAA,IAC5C;AACA,QAAI,KAAK,QAAQ,aAAc,iBAAgB,KAAK,OAAO;AAE3D,SAAK,QAAQ,EAAE,KAAK,KAAK,CAAC;AAAA,EAC5B;AAAA,EAEA,WAAW,CAAC,CAAC,KAAK,MAA6B;AAC7C,QAAI,CAAC,OAAO,cAAc,CAAC,EAAG;AAC9B,UAAM,QAAQ,MAAM,cAAc,CAAC,EAAE;AACrC,UAAM,SAAS,MAAM,cAAc,CAAC,EAAE;AAEtC,SAAK,QAAQ,EAAE,OAAO,OAAO,CAAC;AAAA,EAChC;AACF;;;ACxLA,IAAI,QAAQ;AAIL,SAAS,MAAW;AACzB,SAAO;AACT;;;AC+BO,IAAM,OAAN,MAAW;AAAA,EAYhB,YACU,OACR;AAAA,IACE,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA;AAAA,IACpB,UAAU,gBAAgB;AAAA,IAC1B;AAAA,IACA;AAAA,EACF,IAAiB,CAAC,GAClB;AAXQ;AAYR,QAAI,CAAC,OAAO,OAAO;AACjB,aAAO,QAAQ,CAAC;AAAA,IAClB;AAEA,WAAO,MAAM,OAAO;AAEpB,SAAK,UAAU;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAEA,SAAK,eAAe;AACpB,WAAO,iBAAiB,UAAU,KAAK,cAAc;AAErD,SAAK,kBAAkB;AAAA,MACrB,KAAK;AAAA,MACL,KAAK,QAAQ;AAAA,IACf;AAEA,SAAK,MAAM,GAAG,kBAAkB,KAAK,eAAe;AAAA,EACtD;AAAA,EAlDA;AAAA,EACA,WAAW,oBAAI,IAAsB;AAAA,EACrC,QAAQ,oBAAI,IAAmB;AAAA,EAC/B,WAA8C;AAAA,IAC5C,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,EACjB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EA8CA,UAAU;AACR,SAAK,MAAM,IAAI,kBAAkB,KAAK,eAAe;AACrD,WAAO,oBAAoB,UAAU,KAAK,cAAc;AACxD,SAAK,SAAS,QAAQ,CAAC,YAAY;AACjC,cAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AACL,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,OAA2B;AAC7B,UAAM,KAAK,IAAI;AAEf,SAAK,MAAM,IAAI,IAAI,EAAE,MAAM,CAAC;AAE5B,WAAO,MAAM,KAAK,MAAM,OAAO,EAAE;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WACE,SACA,UAA8B,CAAC,GACnB;AACZ,UAAM,KAAK,IAAI;AAEf,SAAK,SAAS,IAAI,IAAI,IAAI,YAAY,SAAS,OAAO,CAAC;AAEvD,WAAO,MAAM,KAAK,SAAS,OAAO,EAAE;AAAA,EACtC;AAAA,EAEA,YACE,UACA,UAA8B,CAAC,GACnB;AACZ,UAAM,MAAM,CAAC,GAAG,QAAQ,EAAE;AAAA,MAAI,CAAC,YAC7B,KAAK,WAAW,SAAS,OAAO;AAAA,IAClC;AACA,WAAO,MAAM;AACX,UAAI,QAAQ,CAAC,WAAW;AACtB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAM;AAC7B,SAAK,SAAS,QAAQ,OAAO;AAC7B,SAAK,SAAS,SAAS,OAAO;AAAA,EAChC;AAAA,EAEQ,eAAe,MAAM;AAC3B,UAAM,EAAE,aAAa,IAAI,KAAK;AAE9B,QAAI,QAAQ,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AAEnC,SAAK,SAAS,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM;AACzC,UAAI;AAEJ,YAAM,QAAQ,CAACA,WAAU;AACvB,YAAIA,WAAU,SAAS;AACrB,kBAAQ,KAAK;AAAA,QACf,WAAWA,WAAU,UAAU;AAC7B,kBAAQ,eACJ,KAAK,OAAO,KAAK,QAAQ,IAAI,KAAK,SAAS,QAAQ,IACnD,KAAK,MAAM,KAAK,SAAS,IAAI,KAAK,SAAS,SAAS;AAAA,QAC1D,WAAWA,WAAU,OAAO;AAC1B,kBAAQ,eACJ,KAAK,OAAO,KAAK,QAAQ,KAAK,SAAS,QACvC,KAAK,MAAM,KAAK,SAAS,KAAK,SAAS;AAAA,QAC7C;AAEA,YAAI,OAAO,UAAU,UAAU;AAC7B,gBAAM,KAAK,EAAE,OAAO,KAAK,KAAK,KAAK,EAAE,CAAC;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,YAAQ,MAAM,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,KAAK,CAAC;AAElE,WAAO;AAAA,EACT;AAAA,EAEA,WAAW;AACT,SAAK,MAAM,KAAK,oBAAoB,KAAK,CAAC;AAAA,EAC5C;AAAA,EAEA,OAAO;AACL,SAAK,MAAM,KAAK,oBAAoB,KAAK,CAAC;AAAA,EAC5C;AAAA,EAEA,KAAKC,QAAe;AAClB,UAAM,QAAQ,KAAK,aAAa;AAEhC,QAAI,MAAM,WAAW,EAAG;AAExB,SAAK,mBAAmB,KAAK,IAAI,GAAG,KAAK,IAAIA,QAAO,MAAM,SAAS,CAAC,CAAC;AAErE,UAAM,cAAc,MAAM,KAAK,gBAAgB;AAC/C,QAAI,gBAAgB,OAAW;AAE/B,SAAK,MAAM,SAAS,YAAY,OAAO;AAAA,MACrC,UAAU,KAAK,QAAQ;AAAA,MACvB,QAAQ,KAAK,QAAQ;AAAA,MACrB,MAAM,KAAK,QAAQ;AAAA,MACnB,MAAM,KAAK,QAAQ,SAAS;AAAA,MAC5B,UAAU,EAAE,WAAW,OAAO;AAAA,MAC9B,SAAS,MAAM;AACb,aAAK,QAAQ,cAAc;AAAA,UACzB,OAAO,KAAK;AAAA,UACZ,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MACA,YAAY,MAAM;AAChB,aAAK,QAAQ,iBAAiB;AAAA,UAC5B,OAAO,KAAK;AAAA,UACZ,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,oBAAoB;AACtB,QAAI,oBAAoB,OAAO;AAC/B,QAAI,KAAK,QAAQ,SAAS,YAAa,QAAO,OAAO;AAErD,UAAM,EAAE,aAAa,IAAI,KAAK;AAE9B,UAAM,OAAO,eAAe,UAAU;AAEtC,QACE,OAAO,KAAK,QAAQ,sBAAsB,YAC1C,KAAK,QAAQ,kBAAkB,SAAS,GAAG,GAC3C;AACA,0BACG,OAAO,KAAK,QAAQ,kBAAkB,QAAQ,KAAK,EAAE,CAAC,IAAI,MAC3D,KAAK,SAAS,IAAI;AAAA,IACtB,WAAW,OAAO,KAAK,QAAQ,sBAAsB,UAAU;AAC7D,0BAAoB,KAAK,QAAQ;AAAA,IACnC,OAAO;AACL,0BAAoB,KAAK,SAAS,IAAI;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,CAAC,MAAyB;AACzC,QAAI,KAAK,UAAW;AAEpB,QAAI,EAAE,MAAM,SAAS,YAAa;AAElC,QACE,KAAK,QAAQ,SAAS,UACtB,KAAK,MAAM,UAAU,cAAc;AAEnC;AAEF,QAAI,EAAE,QAAQ,aAAa,IAAI,KAAK;AACpC,UAAM,QAAQ,eAAe,EAAE,SAAS,EAAE;AAC1C,aAAS,KAAK,KAAK,KAAK,MAAM,SAAS,KAAK;AAE5C,UAAM,QAAQ,KAAK,aAAa;AAEhC,QAAI,MAAM,WAAW,EAAG;AAExB,QAAI;AAEJ,UAAM,gBAAgB,MAAM,cAAc,CAAC,EAAE,MAAM,MAAM,QAAQ,MAAM;AACvE,UAAM,gBAAgB,MAAM,UAAU,CAAC,EAAE,MAAM,MAAM,QAAQ,MAAM;AAEnE,QAAI,KAAK,QAAQ,SAAS,QAAQ;AAChC,UAAI,QAAQ,GAAG;AACb,oBAAY;AAAA,MACd,WAAW,QAAQ,GAAG;AACpB,oBAAY;AAAA,MACd;AAAA,IACF,OAAO;AACL,YAAM,WAAW,MAAM,aAAa;AACpC,YAAM,qBAAqB,WACvB,KAAK,IAAI,SAAS,SAAS,KAAK,IAChC,OAAO;AAEX,YAAM,WAAW,MAAM,aAAa;AACpC,YAAM,qBAAqB,WACvB,KAAK,IAAI,SAAS,SAAS,KAAK,IAChC,OAAO;AACX,kBACE,qBAAqB,qBAAqB,gBAAgB;AAAA,IAC9D;AAEA,QAAI,cAAc,OAAW;AAC7B,QAAI,cAAc,GAAI;AAEtB,gBAAY,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,MAAM,SAAS,CAAC,CAAC;AAE7D,UAAM,OAAO,MAAM,SAAS;AAE5B,UAAM,WAAW,KAAK,IAAI,SAAS,KAAK,KAAK;AAE7C,QAAI,YAAY,KAAK,mBAAmB;AACtC,WAAK,KAAK,SAAS;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,SAAS;AACP,SAAK,SAAS,QAAQ,CAAC,YAAY;AACjC,cAAQ,gBAAgB;AAAA,IAC1B,CAAC;AAAA,EACH;AACF;","names":["align","index"]}