{
  "version": 3,
  "sources": ["../../assets/js/popover.js", "../../assets/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs", "../../assets/node_modules/@floating-ui/core/dist/floating-ui.core.mjs", "../../assets/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs", "../../assets/node_modules/@floating-ui/dom/dist/floating-ui.dom.esm.js", "../../assets/js/date_picker.js", "../../assets/js/select.js", "../../assets/js/loading.js", "../../assets/js/tooltip.js", "../../assets/js/flash.js", "../../assets/js/tabs.js", "../../assets/js/sidebar.js", "../../assets/js/chart_hook.js", "../../assets/node_modules/uplot/dist/uPlot.esm.js", "../../assets/js/bar_chart.js", "../../assets/js/line_chart.js", "../../assets/js/sparkline_chart.js", "../../assets/js/index.js"],
  "sourcesContent": ["import { ViewHook } from \"phoenix_live_view\";\nimport {\n  computePosition,\n  offset,\n  flip,\n  shift,\n  autoUpdate,\n  getOverflowAncestors,\n  hide,\n  size,\n} from \"@floating-ui/dom\";\n\nexport default class Popover extends ViewHook {\n  expanded = false;\n  name = \"popover\";\n  placement = \"bottom-start\";\n  defaultPlacement = \"bottom-start\";\n  activePlacement = \"bottom-start\";\n  strategy = \"absolute\"; // floating-ui strategy\n  defaultStrategy = \"absolute\";\n  currentStrategy = \"absolute\";\n  event_trigger = \"click\"; // \"click\" | \"hover\" | \"focus\"\n  currentIndex = -1;\n  expand_popover = false; // expand popover to match width of trigger\n  focus_selected = true;\n\n  #outside_listener;\n  #clear_floating;\n  #triggerClickHandler;\n  #triggerMouseEnterHandler;\n  #triggerMouseLeaveHandler;\n  #triggerFocusHandler;\n  #triggerBlurHandler;\n  #containerKeyDownHandler;\n  #triggerKeyDownHandler;\n\n  mounted() {\n    this.defaultPlacement = this.el.dataset.placement || this.placement;\n    this.activePlacement = this.defaultPlacement;\n    this.placement = this.defaultPlacement;\n    this.strategy = this.el.dataset.strategy || this.strategy;\n    this.currentStrategy = this.resolveStrategy();\n    this.event_trigger = this.el.dataset.trigger || this.event_trigger;\n    this.cacheElements();\n\n    this.refreshExpanded();\n\n    this.#triggerClickHandler = this.handleTriggerClick.bind(this);\n    this.#triggerMouseEnterHandler = this.handleTriggerMouseEnter.bind(this);\n    this.#triggerMouseLeaveHandler = this.handleTriggerMouseLeave.bind(this);\n    this.#triggerFocusHandler = this.handleTriggerFocus.bind(this);\n    this.#triggerBlurHandler = this.handleTriggerBlur.bind(this);\n    this.#containerKeyDownHandler = this.handleContainerKeyDown.bind(this);\n    this.#triggerKeyDownHandler = this.handleTriggerKeyDown.bind(this);\n\n    this.bindEventListeners();\n\n    this.#outside_listener = (event) => {\n      const target = event.target;\n      const clickedOnTrigger = this.trigger?.contains(target);\n      const clickedOnPopup = this.popup?.contains(target);\n      if (!clickedOnTrigger && !clickedOnPopup && this.expanded) {\n        this.closePopover();\n      }\n    };\n\n    this.initFloatingUI();\n  }\n\n  listenOutside() {\n    document.addEventListener(\"click\", this.#outside_listener);\n  }\n\n  removeOutsideListener() {\n    document.removeEventListener(\"click\", this.#outside_listener);\n  }\n\n  updated() {\n    const previousTrigger = this.trigger;\n\n    this.cacheElements();\n    this.rebindEventListeners(previousTrigger);\n    this.restoreExpanded();\n    this.initFloatingUI();\n    this.refreshFloatingUI();\n  }\n\n  destroyed() {\n    this.unbindEventListeners(this.trigger);\n    document.removeEventListener(\"click\", this.#outside_listener);\n\n    if (this.#clear_floating) {\n      this.#clear_floating();\n    }\n  }\n\n  handleTriggerKeyDown(event) {\n    if (\n      !this.expanded &&\n      (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")\n    ) {\n      event.preventDefault();\n      this.openPopover({ placement: this.getPlacementForKey(event.key) });\n      return;\n    }\n\n    if (!this.expanded && this.isPrintableKeyEvent(event)) {\n      const handled = this.handleTriggerTypeahead(event);\n      if (handled) {\n        event.preventDefault();\n      }\n    }\n  }\n\n  handleTriggerClick() {\n    if (this.expanded) {\n      this.closePopover();\n    } else {\n      this.openPopover({ placement: this.getOpenPlacement() });\n    }\n\n    this.refreshExpanded();\n  }\n\n  handleTriggerMouseEnter() {\n    this.openPopover();\n    this.refreshExpanded();\n  }\n\n  handleTriggerMouseLeave() {\n    this.closePopover();\n    this.refreshExpanded();\n  }\n\n  handleTriggerFocus() {\n    this.openPopover();\n    this.refreshExpanded();\n  }\n\n  handleTriggerBlur() {\n    this.closePopover();\n    this.refreshExpanded();\n  }\n\n  handleContainerKeyDown(event) {\n    if (!this.expanded) return;\n\n    switch (event.key) {\n      case \"Escape\":\n        event.preventDefault();\n        event.stopPropagation();\n        this.closePopover();\n        this.trigger?.focus();\n        break;\n      case \"ArrowDown\":\n      case \"ArrowUp\":\n      case \"Home\":\n      case \"End\":\n        this.handleArrowNavigation(event);\n        break;\n      case \"Enter\":\n        this.handleKeyEnter(event);\n\n        break;\n      case \"Tab\":\n        this.closePopover();\n        break;\n      default:\n        if (this.isPrintableKeyEvent(event)) {\n          const handled = this.handlePrintableKey(event);\n          if (handled) {\n            event.preventDefault();\n          }\n        }\n    }\n  }\n\n  handleKeyEnter(event) {\n    // see select.js for example\n  }\n\n  handleTriggerTypeahead(_event) {\n    return false;\n  }\n\n  handlePrintableKey(_event) {\n    return false;\n  }\n\n  handleArrowNavigation(event) {\n    if (!this.expanded) return;\n\n    const visibleItems = this.getNavigableItems();\n    const itemCount = visibleItems.length;\n\n    if (itemCount === 0) return;\n\n    event.preventDefault();\n\n    let newIndex = this.currentIndex;\n\n    switch (event.key) {\n      case \"ArrowDown\":\n        newIndex = (this.currentIndex + 1) % itemCount;\n        break;\n      case \"ArrowUp\":\n        newIndex = (this.currentIndex - 1 + itemCount) % itemCount;\n        break;\n      case \"Home\":\n        newIndex = 0;\n        break;\n      case \"End\":\n        newIndex = itemCount - 1;\n        break;\n    }\n\n    this.setCurrentItemByIndex(newIndex, visibleItems);\n  }\n\n  initFloatingUI() {\n    if (this.#clear_floating) {\n      this.#clear_floating();\n    }\n    if (!this.trigger || !this.popup) {\n      return;\n    }\n\n    if (!this.expanded) {\n      return;\n    }\n\n    this.currentStrategy = this.resolveStrategy();\n\n    this.#clear_floating = autoUpdate(\n      this.trigger,\n      this.popup,\n      () => {\n        this.refreshFloatingUI();\n      },\n      {\n        animationFrame: this.currentStrategy === \"fixed\",\n      },\n    );\n  }\n\n  bindEventListeners() {\n    this.el.addEventListener(\"keydown\", this.#containerKeyDownHandler);\n    this.trigger?.addEventListener(\"keydown\", this.#triggerKeyDownHandler);\n\n    if (this.event_trigger === \"click\") {\n      this.trigger?.addEventListener(\"click\", this.#triggerClickHandler);\n      return;\n    }\n\n    if (this.event_trigger === \"hover\") {\n      this.trigger?.addEventListener(\n        \"mouseenter\",\n        this.#triggerMouseEnterHandler,\n      );\n      this.trigger?.addEventListener(\n        \"mouseleave\",\n        this.#triggerMouseLeaveHandler,\n      );\n      return;\n    }\n\n    if (this.event_trigger === \"focus\") {\n      this.trigger?.addEventListener(\"focus\", this.#triggerFocusHandler);\n      this.trigger?.addEventListener(\"blur\", this.#triggerBlurHandler);\n    }\n  }\n\n  unbindEventListeners(trigger) {\n    this.el.removeEventListener(\"keydown\", this.#containerKeyDownHandler);\n    trigger?.removeEventListener(\"keydown\", this.#triggerKeyDownHandler);\n    trigger?.removeEventListener(\"click\", this.#triggerClickHandler);\n    trigger?.removeEventListener(\"mouseenter\", this.#triggerMouseEnterHandler);\n    trigger?.removeEventListener(\"mouseleave\", this.#triggerMouseLeaveHandler);\n    trigger?.removeEventListener(\"focus\", this.#triggerFocusHandler);\n    trigger?.removeEventListener(\"blur\", this.#triggerBlurHandler);\n  }\n\n  rebindEventListeners(previousTrigger) {\n    if (previousTrigger === this.trigger) {\n      return;\n    }\n\n    this.unbindEventListeners(previousTrigger);\n    this.bindEventListeners();\n  }\n\n  refreshFloatingUI() {\n    if (!this.trigger || !this.popup || !this.expanded) {\n      return Promise.resolve();\n    }\n\n    const expand_popover = this.expand_popover;\n    const collisionPadding = 8;\n    const nextStrategy = this.resolveStrategy();\n\n    if (nextStrategy !== this.currentStrategy) {\n      this.currentStrategy = nextStrategy;\n      this.initFloatingUI();\n    } else {\n      this.currentStrategy = nextStrategy;\n    }\n\n    return computePosition(this.trigger, this.popup, {\n      placement: this.activePlacement,\n      strategy: this.currentStrategy,\n      middleware: [\n        offset(collisionPadding),\n        flip({ padding: collisionPadding }),\n        shift({ padding: collisionPadding }),\n        size({\n          padding: collisionPadding,\n          apply({ rects, elements }) {\n            if (expand_popover) {\n              elements.floating.style.width = `${Math.max(0, Math.floor(rects.reference.width))}px`;\n            } else {\n              elements.floating.style.removeProperty(\"width\");\n            }\n          },\n        }),\n        hide({ padding: collisionPadding }),\n      ],\n    }).then(({ x, y, strategy, placement, middlewareData }) => {\n      const referenceHidden = Boolean(middlewareData.hide?.referenceHidden);\n\n      Object.assign(this.popup.style, {\n        left: `${x}px`,\n        top: `${y}px`,\n        position: strategy,\n      });\n\n      this.popup.dataset.side = placement.split(\"-\")[0];\n      this.popup.dataset.floatingStrategy = strategy;\n      this.popup.dataset.referenceHidden = String(referenceHidden);\n\n      if (referenceHidden && this.expanded) {\n        this.closePopover({ restoreFocus: false });\n      }\n    });\n  }\n\n  closePopover(options = {}) {\n    const { restoreFocus = true } = options;\n\n    this.trigger?.setAttribute(\"aria-expanded\", \"false\");\n    this.popup?.setAttribute(\"aria-hidden\", \"true\");\n\n    this.expanded = false;\n    this.currentIndex = -1;\n    this.activePlacement = this.defaultPlacement;\n\n    this.onPopupClosed(restoreFocus);\n    this.popup?.setAttribute(\"data-reference-hidden\", \"false\");\n    this.removeOutsideListener();\n    this.initFloatingUI();\n  }\n\n  onPopupOpened() {}\n\n  onPopupClosed(restoreFocus = true) {\n    if (\n      this.popup?.contains(document.activeElement) ||\n      this.trigger?.contains(document.activeElement)\n    ) {\n      if (restoreFocus) {\n        this.focusElement(this.trigger);\n      } else if (typeof document.activeElement?.blur === \"function\") {\n        document.activeElement.blur();\n      }\n    }\n  }\n\n  openPopover(options = {}) {\n    this.activePlacement = options.placement || this.getOpenPlacement();\n    this.trigger?.setAttribute(\"aria-expanded\", \"true\");\n    this.popup?.setAttribute(\"aria-hidden\", \"false\");\n    this.popup?.setAttribute(\"data-reference-hidden\", \"false\");\n\n    this.focusElement(this.popup);\n    this.expanded = true;\n    this.currentIndex = this.getInitialNavigationIndex(\n      this.getNavigableItems(),\n    );\n\n    this.onPopupOpened();\n    this.listenOutside();\n    this.initFloatingUI();\n    this.refreshFloatingUI();\n  }\n\n  log(msg, data) {\n    console.log(`${this.name}: ${msg}`, data);\n  }\n\n  refreshExpanded() {\n    this.expanded = this.trigger?.getAttribute(\"aria-expanded\") == \"true\";\n  }\n\n  restoreExpanded() {\n    if (this.expanded) {\n      this.openPopover({ placement: this.activePlacement });\n    } else {\n      this.closePopover();\n    }\n  }\n\n  cacheElements() {\n    this.trigger = this.el.querySelector(\"[aria-haspopup],[role='combobox']\");\n    this.popup = this.el.querySelector(\"[role='menu'],[role='listbox']\");\n    this.items =\n      this.popup?.querySelectorAll(\"[role='option'],[role='menuitem']\") ?? [];\n  }\n\n  getOpenPlacement() {\n    return this.defaultPlacement;\n  }\n\n  getPlacementForKey(_key) {\n    return this.defaultPlacement;\n  }\n\n  getNavigableItems() {\n    return Array.from(this.items).filter(\n      (item) =>\n        item.style.display !== \"none\" &&\n        item.getAttribute(\"aria-disabled\") !== \"true\" &&\n        item.getAttribute(\"aria-hidden\") !== \"true\",\n    );\n  }\n\n  getInitialNavigationIndex(items) {\n    return items.length > 0 ? 0 : -1;\n  }\n\n  setCurrentItemByIndex(index, items = this.getNavigableItems()) {\n    const itemCount = items.length;\n    if (itemCount === 0 || index < 0 || index >= itemCount) {\n      this.currentIndex = -1;\n      return null;\n    }\n\n    items.forEach((item, itemIndex) => {\n      if (itemIndex === index) {\n        item.setAttribute(\"aria-selected\", \"true\");\n        item.setAttribute(\"tabindex\", \"0\");\n        if (this.focus_selected) {\n          this.focusElement(item);\n        }\n        this.scrollItemIntoView(item);\n      } else {\n        item.setAttribute(\"tabindex\", \"-1\");\n        item.removeAttribute(\"aria-selected\");\n      }\n    });\n\n    this.currentIndex = index;\n    return items[index];\n  }\n\n  isPrintableKeyEvent(event) {\n    return (\n      event.key.length === 1 &&\n      !event.altKey &&\n      !event.ctrlKey &&\n      !event.metaKey\n    );\n  }\n\n  focusElement(element) {\n    if (!element) {\n      return;\n    }\n\n    if (typeof element.focus === \"function\") {\n      try {\n        element.focus({ preventScroll: true });\n      } catch {\n        element.focus();\n      }\n    }\n  }\n\n  resolveStrategy() {\n    if (this.strategy === \"absolute\" || this.strategy === \"fixed\") {\n      return this.strategy;\n    }\n\n    return this.hasNestedClippingAncestor() ? \"fixed\" : this.defaultStrategy;\n  }\n\n  hasNestedClippingAncestor() {\n    if (!this.trigger) {\n      return false;\n    }\n\n    return getOverflowAncestors(this.trigger).some((ancestor) =>\n      this.isNestedClippingAncestor(ancestor),\n    );\n  }\n\n  isNestedClippingAncestor(ancestor) {\n    if (!(ancestor instanceof HTMLElement)) {\n      return false;\n    }\n\n    const doc = ancestor.ownerDocument;\n\n    if (\n      !doc ||\n      ancestor === doc.body ||\n      ancestor === doc.documentElement ||\n      ancestor === this.el ||\n      ancestor === this.trigger ||\n      ancestor === this.popup\n    ) {\n      return false;\n    }\n\n    const style = window.getComputedStyle(ancestor);\n\n    return [style.overflow, style.overflowX, style.overflowY].some((value) =>\n      [\"auto\", \"scroll\", \"hidden\", \"clip\", \"overlay\"].includes(value),\n    );\n  }\n\n  scrollItemIntoView(item) {\n    if (!item || !this.popup) {\n      return;\n    }\n\n    const popupRect = this.popup.getBoundingClientRect();\n    const itemRect = item.getBoundingClientRect();\n\n    if (itemRect.top < popupRect.top) {\n      this.popup.scrollTop -= popupRect.top - itemRect.top;\n    } else if (itemRect.bottom > popupRect.bottom) {\n      this.popup.scrollTop += itemRect.bottom - popupRect.bottom;\n    }\n  }\n}\n", "/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n  x: v,\n  y: v\n});\nconst oppositeSideMap = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n  start: 'end',\n  end: 'start'\n};\nfunction clamp(start, value, end) {\n  return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n  return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n  return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n  return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n  return axis === 'y' ? 'height' : 'width';\n}\nconst yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);\nfunction getSideAxis(placement) {\n  return yAxisSides.has(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n  return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n  if (rtl === void 0) {\n    rtl = false;\n  }\n  const alignment = getAlignment(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const length = getAxisLength(alignmentAxis);\n  let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n  if (rects.reference[length] > rects.floating[length]) {\n    mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n  }\n  return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n  const oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n  return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n  switch (side) {\n    case 'top':\n    case 'bottom':\n      if (rtl) return isStart ? rlPlacement : lrPlacement;\n      return isStart ? lrPlacement : rlPlacement;\n    case 'left':\n    case 'right':\n      return isStart ? tbPlacement : btPlacement;\n    default:\n      return [];\n  }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n  const alignment = getAlignment(placement);\n  let list = getSideList(getSide(placement), direction === 'start', rtl);\n  if (alignment) {\n    list = list.map(side => side + \"-\" + alignment);\n    if (flipAlignment) {\n      list = list.concat(list.map(getOppositeAlignmentPlacement));\n    }\n  }\n  return list;\n}\nfunction getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    ...padding\n  };\n}\nfunction getPaddingObject(padding) {\n  return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n    top: padding,\n    right: padding,\n    bottom: padding,\n    left: padding\n  };\n}\nfunction rectToClientRect(rect) {\n  const {\n    x,\n    y,\n    width,\n    height\n  } = rect;\n  return {\n    width,\n    height,\n    top: y,\n    left: x,\n    right: x + width,\n    bottom: y + height,\n    x,\n    y\n  };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n", "import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n  let {\n    reference,\n    floating\n  } = _ref;\n  const sideAxis = getSideAxis(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const alignLength = getAxisLength(alignmentAxis);\n  const side = getSide(placement);\n  const isVertical = sideAxis === 'y';\n  const commonX = reference.x + reference.width / 2 - floating.width / 2;\n  const commonY = reference.y + reference.height / 2 - floating.height / 2;\n  const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n  let coords;\n  switch (side) {\n    case 'top':\n      coords = {\n        x: commonX,\n        y: reference.y - floating.height\n      };\n      break;\n    case 'bottom':\n      coords = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n    case 'right':\n      coords = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n    case 'left':\n      coords = {\n        x: reference.x - floating.width,\n        y: commonY\n      };\n      break;\n    default:\n      coords = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n  switch (getAlignment(placement)) {\n    case 'start':\n      coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n    case 'end':\n      coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n  }\n  return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform\n  } = config;\n  const validMiddleware = middleware.filter(Boolean);\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n  let rects = await platform.getElementRects({\n    reference,\n    floating,\n    strategy\n  });\n  let {\n    x,\n    y\n  } = computeCoordsFromPlacement(rects, placement, rtl);\n  let statefulPlacement = placement;\n  let middlewareData = {};\n  let resetCount = 0;\n  for (let i = 0; i < validMiddleware.length; i++) {\n    const {\n      name,\n      fn\n    } = validMiddleware[i];\n    const {\n      x: nextX,\n      y: nextY,\n      data,\n      reset\n    } = await fn({\n      x,\n      y,\n      initialPlacement: placement,\n      placement: statefulPlacement,\n      strategy,\n      middlewareData,\n      rects,\n      platform,\n      elements: {\n        reference,\n        floating\n      }\n    });\n    x = nextX != null ? nextX : x;\n    y = nextY != null ? nextY : y;\n    middlewareData = {\n      ...middlewareData,\n      [name]: {\n        ...middlewareData[name],\n        ...data\n      }\n    };\n    if (reset && resetCount <= 50) {\n      resetCount++;\n      if (typeof reset === 'object') {\n        if (reset.placement) {\n          statefulPlacement = reset.placement;\n        }\n        if (reset.rects) {\n          rects = reset.rects === true ? await platform.getElementRects({\n            reference,\n            floating,\n            strategy\n          }) : reset.rects;\n        }\n        ({\n          x,\n          y\n        } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n      }\n      i = -1;\n    }\n  }\n  return {\n    x,\n    y,\n    placement: statefulPlacement,\n    strategy,\n    middlewareData\n  };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n  var _await$platform$isEle;\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    x,\n    y,\n    platform,\n    rects,\n    elements,\n    strategy\n  } = state;\n  const {\n    boundary = 'clippingAncestors',\n    rootBoundary = 'viewport',\n    elementContext = 'floating',\n    altBoundary = false,\n    padding = 0\n  } = evaluate(options, state);\n  const paddingObject = getPaddingObject(padding);\n  const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n  const element = elements[altBoundary ? altContext : elementContext];\n  const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n    element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n    boundary,\n    rootBoundary,\n    strategy\n  }));\n  const rect = elementContext === 'floating' ? {\n    x,\n    y,\n    width: rects.floating.width,\n    height: rects.floating.height\n  } : rects.reference;\n  const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n  const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n    x: 1,\n    y: 1\n  } : {\n    x: 1,\n    y: 1\n  };\n  const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  }) : rect);\n  return {\n    top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n    bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n    left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n    right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n  };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n  name: 'arrow',\n  options,\n  async fn(state) {\n    const {\n      x,\n      y,\n      placement,\n      rects,\n      platform,\n      elements,\n      middlewareData\n    } = state;\n    // Since `element` is required, we don't Partial<> the type.\n    const {\n      element,\n      padding = 0\n    } = evaluate(options, state) || {};\n    if (element == null) {\n      return {};\n    }\n    const paddingObject = getPaddingObject(padding);\n    const coords = {\n      x,\n      y\n    };\n    const axis = getAlignmentAxis(placement);\n    const length = getAxisLength(axis);\n    const arrowDimensions = await platform.getDimensions(element);\n    const isYAxis = axis === 'y';\n    const minProp = isYAxis ? 'top' : 'left';\n    const maxProp = isYAxis ? 'bottom' : 'right';\n    const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n    const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n    const startDiff = coords[axis] - rects.reference[axis];\n    const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n    let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n    // DOM platform can return `window` as the `offsetParent`.\n    if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n      clientSize = elements.floating[clientProp] || rects.floating[length];\n    }\n    const centerToReference = endDiff / 2 - startDiff / 2;\n\n    // If the padding is large enough that it causes the arrow to no longer be\n    // centered, modify the padding so that it is centered.\n    const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n    const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n    const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n    // Make sure the arrow doesn't overflow the floating element if the center\n    // point is outside the floating element's bounds.\n    const min$1 = minPadding;\n    const max = clientSize - arrowDimensions[length] - maxPadding;\n    const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n    const offset = clamp(min$1, center, max);\n\n    // If the reference is small enough that the arrow's padding causes it to\n    // to point to nothing for an aligned placement, adjust the offset of the\n    // floating element itself. To ensure `shift()` continues to take action,\n    // a single reset is performed when this is true.\n    const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n    const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n    return {\n      [axis]: coords[axis] + alignmentOffset,\n      data: {\n        [axis]: offset,\n        centerOffset: center - offset - alignmentOffset,\n        ...(shouldAddOffset && {\n          alignmentOffset\n        })\n      },\n      reset: shouldAddOffset\n    };\n  }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n  const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n  return allowedPlacementsSortedByAlignment.filter(placement => {\n    if (alignment) {\n      return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n    }\n    return true;\n  });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'autoPlacement',\n    options,\n    async fn(state) {\n      var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n      const {\n        rects,\n        middlewareData,\n        placement,\n        platform,\n        elements\n      } = state;\n      const {\n        crossAxis = false,\n        alignment,\n        allowedPlacements = placements,\n        autoAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n      const currentPlacement = placements$1[currentIndex];\n      if (currentPlacement == null) {\n        return {};\n      }\n      const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n      // Make `computeCoords` start from the right place.\n      if (placement !== currentPlacement) {\n        return {\n          reset: {\n            placement: placements$1[0]\n          }\n        };\n      }\n      const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n      const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n        placement: currentPlacement,\n        overflows: currentOverflows\n      }];\n      const nextPlacement = placements$1[currentIndex + 1];\n\n      // There are more placements to check.\n      if (nextPlacement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: nextPlacement\n          }\n        };\n      }\n      const placementsSortedByMostSpace = allOverflows.map(d => {\n        const alignment = getAlignment(d.placement);\n        return [d.placement, alignment && crossAxis ?\n        // Check along the mainAxis and main crossAxis side.\n        d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n        // Check only the mainAxis.\n        d.overflows[0], d.overflows];\n      }).sort((a, b) => a[1] - b[1]);\n      const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n      // Aligned placements should not check their opposite crossAxis\n      // side.\n      getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n      const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n      if (resetPlacement !== placement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: resetPlacement\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'flip',\n    options,\n    async fn(state) {\n      var _middlewareData$arrow, _middlewareData$flip;\n      const {\n        placement,\n        middlewareData,\n        rects,\n        initialPlacement,\n        platform,\n        elements\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true,\n        fallbackPlacements: specifiedFallbackPlacements,\n        fallbackStrategy = 'bestFit',\n        fallbackAxisSideDirection = 'none',\n        flipAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n\n      // If a reset by the arrow was caused due to an alignment offset being\n      // added, we should skip any logic now since `flip()` has already done its\n      // work.\n      // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n      if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      const side = getSide(placement);\n      const initialSideAxis = getSideAxis(initialPlacement);\n      const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n      const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n      const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n      const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n      if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n        fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n      }\n      const placements = [initialPlacement, ...fallbackPlacements];\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const overflows = [];\n      let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n      if (checkMainAxis) {\n        overflows.push(overflow[side]);\n      }\n      if (checkCrossAxis) {\n        const sides = getAlignmentSides(placement, rects, rtl);\n        overflows.push(overflow[sides[0]], overflow[sides[1]]);\n      }\n      overflowsData = [...overflowsData, {\n        placement,\n        overflows\n      }];\n\n      // One or more sides is overflowing.\n      if (!overflows.every(side => side <= 0)) {\n        var _middlewareData$flip2, _overflowsData$filter;\n        const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n        const nextPlacement = placements[nextIndex];\n        if (nextPlacement) {\n          const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n          if (!ignoreCrossAxisOverflow ||\n          // We leave the current main axis only if every placement on that axis\n          // overflows the main axis.\n          overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n            // Try next placement and re-run the lifecycle.\n            return {\n              data: {\n                index: nextIndex,\n                overflows: overflowsData\n              },\n              reset: {\n                placement: nextPlacement\n              }\n            };\n          }\n        }\n\n        // First, find the candidates that fit on the mainAxis side of overflow,\n        // then find the placement that fits the best on the main crossAxis side.\n        let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n        // Otherwise fallback.\n        if (!resetPlacement) {\n          switch (fallbackStrategy) {\n            case 'bestFit':\n              {\n                var _overflowsData$filter2;\n                const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n                  if (hasFallbackAxisSideDirection) {\n                    const currentSideAxis = getSideAxis(d.placement);\n                    return currentSideAxis === initialSideAxis ||\n                    // Create a bias to the `y` side axis due to horizontal\n                    // reading directions favoring greater width.\n                    currentSideAxis === 'y';\n                  }\n                  return true;\n                }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n                if (placement) {\n                  resetPlacement = placement;\n                }\n                break;\n              }\n            case 'initialPlacement':\n              resetPlacement = initialPlacement;\n              break;\n          }\n        }\n        if (placement !== resetPlacement) {\n          return {\n            reset: {\n              placement: resetPlacement\n            }\n          };\n        }\n      }\n      return {};\n    }\n  };\n};\n\nfunction getSideOffsets(overflow, rect) {\n  return {\n    top: overflow.top - rect.height,\n    right: overflow.right - rect.width,\n    bottom: overflow.bottom - rect.height,\n    left: overflow.left - rect.width\n  };\n}\nfunction isAnySideFullyClipped(overflow) {\n  return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'hide',\n    options,\n    async fn(state) {\n      const {\n        rects\n      } = state;\n      const {\n        strategy = 'referenceHidden',\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      switch (strategy) {\n        case 'referenceHidden':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              elementContext: 'reference'\n            });\n            const offsets = getSideOffsets(overflow, rects.reference);\n            return {\n              data: {\n                referenceHiddenOffsets: offsets,\n                referenceHidden: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        case 'escaped':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              altBoundary: true\n            });\n            const offsets = getSideOffsets(overflow, rects.floating);\n            return {\n              data: {\n                escapedOffsets: offsets,\n                escaped: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        default:\n          {\n            return {};\n          }\n      }\n    }\n  };\n};\n\nfunction getBoundingRect(rects) {\n  const minX = min(...rects.map(rect => rect.left));\n  const minY = min(...rects.map(rect => rect.top));\n  const maxX = max(...rects.map(rect => rect.right));\n  const maxY = max(...rects.map(rect => rect.bottom));\n  return {\n    x: minX,\n    y: minY,\n    width: maxX - minX,\n    height: maxY - minY\n  };\n}\nfunction getRectsByLine(rects) {\n  const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n  const groups = [];\n  let prevRect = null;\n  for (let i = 0; i < sortedRects.length; i++) {\n    const rect = sortedRects[i];\n    if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n      groups.push([rect]);\n    } else {\n      groups[groups.length - 1].push(rect);\n    }\n    prevRect = rect;\n  }\n  return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'inline',\n    options,\n    async fn(state) {\n      const {\n        placement,\n        elements,\n        rects,\n        platform,\n        strategy\n      } = state;\n      // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n      // ClientRect's bounds, despite the event listener being triggered. A\n      // padding of 2 seems to handle this issue.\n      const {\n        padding = 2,\n        x,\n        y\n      } = evaluate(options, state);\n      const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n      const clientRects = getRectsByLine(nativeClientRects);\n      const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n      const paddingObject = getPaddingObject(padding);\n      function getBoundingClientRect() {\n        // There are two rects and they are disjoined.\n        if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n          // Find the first rect in which the point is fully inside.\n          return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n        }\n\n        // There are 2 or more connected rects.\n        if (clientRects.length >= 2) {\n          if (getSideAxis(placement) === 'y') {\n            const firstRect = clientRects[0];\n            const lastRect = clientRects[clientRects.length - 1];\n            const isTop = getSide(placement) === 'top';\n            const top = firstRect.top;\n            const bottom = lastRect.bottom;\n            const left = isTop ? firstRect.left : lastRect.left;\n            const right = isTop ? firstRect.right : lastRect.right;\n            const width = right - left;\n            const height = bottom - top;\n            return {\n              top,\n              bottom,\n              left,\n              right,\n              width,\n              height,\n              x: left,\n              y: top\n            };\n          }\n          const isLeftSide = getSide(placement) === 'left';\n          const maxRight = max(...clientRects.map(rect => rect.right));\n          const minLeft = min(...clientRects.map(rect => rect.left));\n          const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n          const top = measureRects[0].top;\n          const bottom = measureRects[measureRects.length - 1].bottom;\n          const left = minLeft;\n          const right = maxRight;\n          const width = right - left;\n          const height = bottom - top;\n          return {\n            top,\n            bottom,\n            left,\n            right,\n            width,\n            height,\n            x: left,\n            y: top\n          };\n        }\n        return fallback;\n      }\n      const resetRects = await platform.getElementRects({\n        reference: {\n          getBoundingClientRect\n        },\n        floating: elements.floating,\n        strategy\n      });\n      if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n        return {\n          reset: {\n            rects: resetRects\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n  const {\n    placement,\n    platform,\n    elements\n  } = state;\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n  const side = getSide(placement);\n  const alignment = getAlignment(placement);\n  const isVertical = getSideAxis(placement) === 'y';\n  const mainAxisMulti = originSides.has(side) ? -1 : 1;\n  const crossAxisMulti = rtl && isVertical ? -1 : 1;\n  const rawValue = evaluate(options, state);\n\n  // eslint-disable-next-line prefer-const\n  let {\n    mainAxis,\n    crossAxis,\n    alignmentAxis\n  } = typeof rawValue === 'number' ? {\n    mainAxis: rawValue,\n    crossAxis: 0,\n    alignmentAxis: null\n  } : {\n    mainAxis: rawValue.mainAxis || 0,\n    crossAxis: rawValue.crossAxis || 0,\n    alignmentAxis: rawValue.alignmentAxis\n  };\n  if (alignment && typeof alignmentAxis === 'number') {\n    crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n  }\n  return isVertical ? {\n    x: crossAxis * crossAxisMulti,\n    y: mainAxis * mainAxisMulti\n  } : {\n    x: mainAxis * mainAxisMulti,\n    y: crossAxis * crossAxisMulti\n  };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n  if (options === void 0) {\n    options = 0;\n  }\n  return {\n    name: 'offset',\n    options,\n    async fn(state) {\n      var _middlewareData$offse, _middlewareData$arrow;\n      const {\n        x,\n        y,\n        placement,\n        middlewareData\n      } = state;\n      const diffCoords = await convertValueToCoords(state, options);\n\n      // If the placement is the same and the arrow caused an alignment offset\n      // then we don't need to change the positioning coordinates.\n      if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      return {\n        x: x + diffCoords.x,\n        y: y + diffCoords.y,\n        data: {\n          ...diffCoords,\n          placement\n        }\n      };\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'shift',\n    options,\n    async fn(state) {\n      const {\n        x,\n        y,\n        placement\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = false,\n        limiter = {\n          fn: _ref => {\n            let {\n              x,\n              y\n            } = _ref;\n            return {\n              x,\n              y\n            };\n          }\n        },\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const crossAxis = getSideAxis(getSide(placement));\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      if (checkMainAxis) {\n        const minSide = mainAxis === 'y' ? 'top' : 'left';\n        const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n        const min = mainAxisCoord + overflow[minSide];\n        const max = mainAxisCoord - overflow[maxSide];\n        mainAxisCoord = clamp(min, mainAxisCoord, max);\n      }\n      if (checkCrossAxis) {\n        const minSide = crossAxis === 'y' ? 'top' : 'left';\n        const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n        const min = crossAxisCoord + overflow[minSide];\n        const max = crossAxisCoord - overflow[maxSide];\n        crossAxisCoord = clamp(min, crossAxisCoord, max);\n      }\n      const limitedCoords = limiter.fn({\n        ...state,\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      });\n      return {\n        ...limitedCoords,\n        data: {\n          x: limitedCoords.x - x,\n          y: limitedCoords.y - y,\n          enabled: {\n            [mainAxis]: checkMainAxis,\n            [crossAxis]: checkCrossAxis\n          }\n        }\n      };\n    }\n  };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    options,\n    fn(state) {\n      const {\n        x,\n        y,\n        placement,\n        rects,\n        middlewareData\n      } = state;\n      const {\n        offset = 0,\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const crossAxis = getSideAxis(placement);\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      const rawOffset = evaluate(offset, state);\n      const computedOffset = typeof rawOffset === 'number' ? {\n        mainAxis: rawOffset,\n        crossAxis: 0\n      } : {\n        mainAxis: 0,\n        crossAxis: 0,\n        ...rawOffset\n      };\n      if (checkMainAxis) {\n        const len = mainAxis === 'y' ? 'height' : 'width';\n        const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n        const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n        if (mainAxisCoord < limitMin) {\n          mainAxisCoord = limitMin;\n        } else if (mainAxisCoord > limitMax) {\n          mainAxisCoord = limitMax;\n        }\n      }\n      if (checkCrossAxis) {\n        var _middlewareData$offse, _middlewareData$offse2;\n        const len = mainAxis === 'y' ? 'width' : 'height';\n        const isOriginSide = originSides.has(getSide(placement));\n        const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n        const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n        if (crossAxisCoord < limitMin) {\n          crossAxisCoord = limitMin;\n        } else if (crossAxisCoord > limitMax) {\n          crossAxisCoord = limitMax;\n        }\n      }\n      return {\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      };\n    }\n  };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element \u2014\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'size',\n    options,\n    async fn(state) {\n      var _state$middlewareData, _state$middlewareData2;\n      const {\n        placement,\n        rects,\n        platform,\n        elements\n      } = state;\n      const {\n        apply = () => {},\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const side = getSide(placement);\n      const alignment = getAlignment(placement);\n      const isYAxis = getSideAxis(placement) === 'y';\n      const {\n        width,\n        height\n      } = rects.floating;\n      let heightSide;\n      let widthSide;\n      if (side === 'top' || side === 'bottom') {\n        heightSide = side;\n        widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n      } else {\n        widthSide = side;\n        heightSide = alignment === 'end' ? 'top' : 'bottom';\n      }\n      const maximumClippingHeight = height - overflow.top - overflow.bottom;\n      const maximumClippingWidth = width - overflow.left - overflow.right;\n      const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n      const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n      const noShift = !state.middlewareData.shift;\n      let availableHeight = overflowAvailableHeight;\n      let availableWidth = overflowAvailableWidth;\n      if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n        availableWidth = maximumClippingWidth;\n      }\n      if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n        availableHeight = maximumClippingHeight;\n      }\n      if (noShift && !alignment) {\n        const xMin = max(overflow.left, 0);\n        const xMax = max(overflow.right, 0);\n        const yMin = max(overflow.top, 0);\n        const yMax = max(overflow.bottom, 0);\n        if (isYAxis) {\n          availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n        } else {\n          availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n        }\n      }\n      await apply({\n        ...state,\n        availableWidth,\n        availableHeight\n      });\n      const nextDimensions = await platform.getDimensions(elements.floating);\n      if (width !== nextDimensions.width || height !== nextDimensions.height) {\n        return {\n          reset: {\n            rects: true\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n", "function hasWindow() {\n  return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n  if (isNode(node)) {\n    return (node.nodeName || '').toLowerCase();\n  }\n  // Mocked nodes in testing environments may not be instances of Node. By\n  // returning `#document` an infinite loop won't occur.\n  // https://github.com/floating-ui/floating-ui/issues/2317\n  return '#document';\n}\nfunction getWindow(node) {\n  var _node$ownerDocument;\n  return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n  var _ref;\n  return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n  if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n  return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nconst invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);\nfunction isOverflowElement(element) {\n  const {\n    overflow,\n    overflowX,\n    overflowY,\n    display\n  } = getComputedStyle(element);\n  return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);\n}\nconst tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);\nfunction isTableElement(element) {\n  return tableElements.has(getNodeName(element));\n}\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(element) {\n  return topLayerSelectors.some(selector => {\n    try {\n      return element.matches(selector);\n    } catch (_e) {\n      return false;\n    }\n  });\n}\nconst transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];\nconst willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];\nconst containValues = ['paint', 'layout', 'strict', 'content'];\nfunction isContainingBlock(elementOrCss) {\n  const webkit = isWebKit();\n  const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n  return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n  let currentNode = getParentNode(element);\n  while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    if (isContainingBlock(currentNode)) {\n      return currentNode;\n    } else if (isTopLayer(currentNode)) {\n      return null;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  return null;\n}\nfunction isWebKit() {\n  if (typeof CSS === 'undefined' || !CSS.supports) return false;\n  return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nconst lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);\nfunction isLastTraversableNode(node) {\n  return lastTraversableNodeNames.has(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n  if (isElement(element)) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n  return {\n    scrollLeft: element.scrollX,\n    scrollTop: element.scrollY\n  };\n}\nfunction getParentNode(node) {\n  if (getNodeName(node) === 'html') {\n    return node;\n  }\n  const result =\n  // Step into the shadow DOM of the parent of a slotted node.\n  node.assignedSlot ||\n  // DOM Element detected.\n  node.parentNode ||\n  // ShadowRoot detected.\n  isShadowRoot(node) && node.host ||\n  // Fallback.\n  getDocumentElement(node);\n  return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n  const parentNode = getParentNode(node);\n  if (isLastTraversableNode(parentNode)) {\n    return node.ownerDocument ? node.ownerDocument.body : node.body;\n  }\n  if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n    return parentNode;\n  }\n  return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n  var _node$ownerDocument2;\n  if (list === void 0) {\n    list = [];\n  }\n  if (traverseIframes === void 0) {\n    traverseIframes = true;\n  }\n  const scrollableAncestor = getNearestOverflowAncestor(node);\n  const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n  const win = getWindow(scrollableAncestor);\n  if (isBody) {\n    const frameElement = getFrameElement(win);\n    return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n  }\n  return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n  return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n", "import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n  const css = getComputedStyle$1(element);\n  // In testing environments, the `width` and `height` properties are empty\n  // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n  let width = parseFloat(css.width) || 0;\n  let height = parseFloat(css.height) || 0;\n  const hasOffset = isHTMLElement(element);\n  const offsetWidth = hasOffset ? element.offsetWidth : width;\n  const offsetHeight = hasOffset ? element.offsetHeight : height;\n  const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n  if (shouldFallback) {\n    width = offsetWidth;\n    height = offsetHeight;\n  }\n  return {\n    width,\n    height,\n    $: shouldFallback\n  };\n}\n\nfunction unwrapElement(element) {\n  return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n  const domElement = unwrapElement(element);\n  if (!isHTMLElement(domElement)) {\n    return createCoords(1);\n  }\n  const rect = domElement.getBoundingClientRect();\n  const {\n    width,\n    height,\n    $\n  } = getCssDimensions(domElement);\n  let x = ($ ? round(rect.width) : rect.width) / width;\n  let y = ($ ? round(rect.height) : rect.height) / height;\n\n  // 0, NaN, or Infinity should always fallback to 1.\n\n  if (!x || !Number.isFinite(x)) {\n    x = 1;\n  }\n  if (!y || !Number.isFinite(y)) {\n    y = 1;\n  }\n  return {\n    x,\n    y\n  };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n  const win = getWindow(element);\n  if (!isWebKit() || !win.visualViewport) {\n    return noOffsets;\n  }\n  return {\n    x: win.visualViewport.offsetLeft,\n    y: win.visualViewport.offsetTop\n  };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n  if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n    return false;\n  }\n  return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n  const clientRect = element.getBoundingClientRect();\n  const domElement = unwrapElement(element);\n  let scale = createCoords(1);\n  if (includeScale) {\n    if (offsetParent) {\n      if (isElement(offsetParent)) {\n        scale = getScale(offsetParent);\n      }\n    } else {\n      scale = getScale(element);\n    }\n  }\n  const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n  let x = (clientRect.left + visualOffsets.x) / scale.x;\n  let y = (clientRect.top + visualOffsets.y) / scale.y;\n  let width = clientRect.width / scale.x;\n  let height = clientRect.height / scale.y;\n  if (domElement) {\n    const win = getWindow(domElement);\n    const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n    let currentWin = win;\n    let currentIFrame = getFrameElement(currentWin);\n    while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n      const iframeScale = getScale(currentIFrame);\n      const iframeRect = currentIFrame.getBoundingClientRect();\n      const css = getComputedStyle$1(currentIFrame);\n      const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n      const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n      x *= iframeScale.x;\n      y *= iframeScale.y;\n      width *= iframeScale.x;\n      height *= iframeScale.y;\n      x += left;\n      y += top;\n      currentWin = getWindow(currentIFrame);\n      currentIFrame = getFrameElement(currentWin);\n    }\n  }\n  return rectToClientRect({\n    width,\n    height,\n    x,\n    y\n  });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n  const leftScroll = getNodeScroll(element).scrollLeft;\n  if (!rect) {\n    return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n  }\n  return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n  const htmlRect = documentElement.getBoundingClientRect();\n  const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n  const y = htmlRect.top + scroll.scrollTop;\n  return {\n    x,\n    y\n  };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n  let {\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  } = _ref;\n  const isFixed = strategy === 'fixed';\n  const documentElement = getDocumentElement(offsetParent);\n  const topLayer = elements ? isTopLayer(elements.floating) : false;\n  if (offsetParent === documentElement || topLayer && isFixed) {\n    return rect;\n  }\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  let scale = createCoords(1);\n  const offsets = createCoords(0);\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isHTMLElement(offsetParent)) {\n      const offsetRect = getBoundingClientRect(offsetParent);\n      scale = getScale(offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    }\n  }\n  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n  return {\n    width: rect.width * scale.x,\n    height: rect.height * scale.y,\n    x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n    y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n  };\n}\n\nfunction getClientRects(element) {\n  return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n  const html = getDocumentElement(element);\n  const scroll = getNodeScroll(element);\n  const body = element.ownerDocument.body;\n  const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n  const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n  let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n  const y = -scroll.scrollTop;\n  if (getComputedStyle$1(body).direction === 'rtl') {\n    x += max(html.clientWidth, body.clientWidth) - width;\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy) {\n  const win = getWindow(element);\n  const html = getDocumentElement(element);\n  const visualViewport = win.visualViewport;\n  let width = html.clientWidth;\n  let height = html.clientHeight;\n  let x = 0;\n  let y = 0;\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    const visualViewportBased = isWebKit();\n    if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n  const windowScrollbarX = getWindowScrollBarX(html);\n  // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n  // visual width of the <html> but this is not considered in the size\n  // of `html.clientWidth`.\n  if (windowScrollbarX <= 0) {\n    const doc = html.ownerDocument;\n    const body = doc.body;\n    const bodyStyles = getComputedStyle(body);\n    const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n    const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n    if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n      width -= clippingStableScrollbarWidth;\n    }\n  } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n    // If the <body> scrollbar is on the left, the width needs to be extended\n    // by the scrollbar amount so there isn't extra space on the right.\n    width += windowScrollbarX;\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n  const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n  const top = clientRect.top + element.clientTop;\n  const left = clientRect.left + element.clientLeft;\n  const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n  const width = element.clientWidth * scale.x;\n  const height = element.clientHeight * scale.y;\n  const x = left * scale.x;\n  const y = top * scale.y;\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n  let rect;\n  if (clippingAncestor === 'viewport') {\n    rect = getViewportRect(element, strategy);\n  } else if (clippingAncestor === 'document') {\n    rect = getDocumentRect(getDocumentElement(element));\n  } else if (isElement(clippingAncestor)) {\n    rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n  } else {\n    const visualOffsets = getVisualOffsets(element);\n    rect = {\n      x: clippingAncestor.x - visualOffsets.x,\n      y: clippingAncestor.y - visualOffsets.y,\n      width: clippingAncestor.width,\n      height: clippingAncestor.height\n    };\n  }\n  return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n  const parentNode = getParentNode(element);\n  if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n    return false;\n  }\n  return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n  const cachedResult = cache.get(element);\n  if (cachedResult) {\n    return cachedResult;\n  }\n  let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n  let currentContainingBlockComputedStyle = null;\n  const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n  let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    const computedStyle = getComputedStyle$1(currentNode);\n    const currentNodeIsContaining = isContainingBlock(currentNode);\n    if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n      currentContainingBlockComputedStyle = null;\n    }\n    const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n    if (shouldDropCurrentNode) {\n      // Drop non-containing blocks.\n      result = result.filter(ancestor => ancestor !== currentNode);\n    } else {\n      // Record last containing block for next iteration.\n      currentContainingBlockComputedStyle = computedStyle;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  cache.set(element, result);\n  return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n  let {\n    element,\n    boundary,\n    rootBoundary,\n    strategy\n  } = _ref;\n  const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n  const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n  const firstClippingAncestor = clippingAncestors[0];\n  const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n    const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n  return {\n    width: clippingRect.right - clippingRect.left,\n    height: clippingRect.bottom - clippingRect.top,\n    x: clippingRect.left,\n    y: clippingRect.top\n  };\n}\n\nfunction getDimensions(element) {\n  const {\n    width,\n    height\n  } = getCssDimensions(element);\n  return {\n    width,\n    height\n  };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  const documentElement = getDocumentElement(offsetParent);\n  const isFixed = strategy === 'fixed';\n  const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  const offsets = createCoords(0);\n\n  // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n  // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n  function setLeftRTLScrollbarOffset() {\n    offsets.x = getWindowScrollBarX(documentElement);\n  }\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isOffsetParentAnElement) {\n      const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    } else if (documentElement) {\n      setLeftRTLScrollbarOffset();\n    }\n  }\n  if (isFixed && !isOffsetParentAnElement && documentElement) {\n    setLeftRTLScrollbarOffset();\n  }\n  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n  const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n  const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n  return {\n    x,\n    y,\n    width: rect.width,\n    height: rect.height\n  };\n}\n\nfunction isStaticPositioned(element) {\n  return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n  if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n    return null;\n  }\n  if (polyfill) {\n    return polyfill(element);\n  }\n  let rawOffsetParent = element.offsetParent;\n\n  // Firefox returns the <html> element as the offsetParent if it's non-static,\n  // while Chrome and Safari return the <body> element. The <body> element must\n  // be used to perform the correct calculations even if the <html> element is\n  // non-static.\n  if (getDocumentElement(element) === rawOffsetParent) {\n    rawOffsetParent = rawOffsetParent.ownerDocument.body;\n  }\n  return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n  const win = getWindow(element);\n  if (isTopLayer(element)) {\n    return win;\n  }\n  if (!isHTMLElement(element)) {\n    let svgOffsetParent = getParentNode(element);\n    while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n      if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n        return svgOffsetParent;\n      }\n      svgOffsetParent = getParentNode(svgOffsetParent);\n    }\n    return win;\n  }\n  let offsetParent = getTrueOffsetParent(element, polyfill);\n  while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n    offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n  }\n  if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n    return win;\n  }\n  return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n  const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n  const getDimensionsFn = this.getDimensions;\n  const floatingDimensions = await getDimensionsFn(data.floating);\n  return {\n    reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n    floating: {\n      x: 0,\n      y: 0,\n      width: floatingDimensions.width,\n      height: floatingDimensions.height\n    }\n  };\n};\n\nfunction isRTL(element) {\n  return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n  convertOffsetParentRelativeRectToViewportRelativeRect,\n  getDocumentElement,\n  getClippingRect,\n  getOffsetParent,\n  getElementRects,\n  getClientRects,\n  getDimensions,\n  getScale,\n  isElement,\n  isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n  return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n  let io = null;\n  let timeoutId;\n  const root = getDocumentElement(element);\n  function cleanup() {\n    var _io;\n    clearTimeout(timeoutId);\n    (_io = io) == null || _io.disconnect();\n    io = null;\n  }\n  function refresh(skip, threshold) {\n    if (skip === void 0) {\n      skip = false;\n    }\n    if (threshold === void 0) {\n      threshold = 1;\n    }\n    cleanup();\n    const elementRectForRootMargin = element.getBoundingClientRect();\n    const {\n      left,\n      top,\n      width,\n      height\n    } = elementRectForRootMargin;\n    if (!skip) {\n      onMove();\n    }\n    if (!width || !height) {\n      return;\n    }\n    const insetTop = floor(top);\n    const insetRight = floor(root.clientWidth - (left + width));\n    const insetBottom = floor(root.clientHeight - (top + height));\n    const insetLeft = floor(left);\n    const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n    const options = {\n      rootMargin,\n      threshold: max(0, min(1, threshold)) || 1\n    };\n    let isFirstUpdate = true;\n    function handleObserve(entries) {\n      const ratio = entries[0].intersectionRatio;\n      if (ratio !== threshold) {\n        if (!isFirstUpdate) {\n          return refresh();\n        }\n        if (!ratio) {\n          // If the reference is clipped, the ratio is 0. Throttle the refresh\n          // to prevent an infinite loop of updates.\n          timeoutId = setTimeout(() => {\n            refresh(false, 1e-7);\n          }, 1000);\n        } else {\n          refresh(false, ratio);\n        }\n      }\n      if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n        // It's possible that even though the ratio is reported as 1, the\n        // element is not actually fully within the IntersectionObserver's root\n        // area anymore. This can happen under performance constraints. This may\n        // be a bug in the browser's IntersectionObserver implementation. To\n        // work around this, we compare the element's bounding rect now with\n        // what it was at the time we created the IntersectionObserver. If they\n        // are not equal then the element moved, so we refresh.\n        refresh();\n      }\n      isFirstUpdate = false;\n    }\n\n    // Older browsers don't support a `document` as the root and will throw an\n    // error.\n    try {\n      io = new IntersectionObserver(handleObserve, {\n        ...options,\n        // Handle <iframe>s\n        root: root.ownerDocument\n      });\n    } catch (_e) {\n      io = new IntersectionObserver(handleObserve, options);\n    }\n    io.observe(element);\n  }\n  refresh(true);\n  return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    ancestorScroll = true,\n    ancestorResize = true,\n    elementResize = typeof ResizeObserver === 'function',\n    layoutShift = typeof IntersectionObserver === 'function',\n    animationFrame = false\n  } = options;\n  const referenceEl = unwrapElement(reference);\n  const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n  ancestors.forEach(ancestor => {\n    ancestorScroll && ancestor.addEventListener('scroll', update, {\n      passive: true\n    });\n    ancestorResize && ancestor.addEventListener('resize', update);\n  });\n  const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n  let reobserveFrame = -1;\n  let resizeObserver = null;\n  if (elementResize) {\n    resizeObserver = new ResizeObserver(_ref => {\n      let [firstEntry] = _ref;\n      if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n        // Prevent update loops when using the `size` middleware.\n        // https://github.com/floating-ui/floating-ui/issues/1740\n        resizeObserver.unobserve(floating);\n        cancelAnimationFrame(reobserveFrame);\n        reobserveFrame = requestAnimationFrame(() => {\n          var _resizeObserver;\n          (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n        });\n      }\n      update();\n    });\n    if (referenceEl && !animationFrame) {\n      resizeObserver.observe(referenceEl);\n    }\n    resizeObserver.observe(floating);\n  }\n  let frameId;\n  let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n  if (animationFrame) {\n    frameLoop();\n  }\n  function frameLoop() {\n    const nextRefRect = getBoundingClientRect(reference);\n    if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n      update();\n    }\n    prevRefRect = nextRefRect;\n    frameId = requestAnimationFrame(frameLoop);\n  }\n  update();\n  return () => {\n    var _resizeObserver2;\n    ancestors.forEach(ancestor => {\n      ancestorScroll && ancestor.removeEventListener('scroll', update);\n      ancestorResize && ancestor.removeEventListener('resize', update);\n    });\n    cleanupIo == null || cleanupIo();\n    (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n    resizeObserver = null;\n    if (animationFrame) {\n      cancelAnimationFrame(frameId);\n    }\n  };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element \u2014\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n  // This caches the expensive `getClippingElementAncestors` function so that\n  // multiple lifecycle resets re-use the same result. It only lives for a\n  // single call. If other functions become expensive, we can add them as well.\n  const cache = new Map();\n  const mergedOptions = {\n    platform,\n    ...options\n  };\n  const platformWithCache = {\n    ...mergedOptions.platform,\n    _c: cache\n  };\n  return computePosition$1(reference, floating, {\n    ...mergedOptions,\n    platform: platformWithCache\n  });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n", "import { ViewHook } from \"phoenix_live_view\";\nimport {\n  computePosition,\n  offset,\n  flip,\n  shift,\n  autoUpdate,\n  getOverflowAncestors,\n  hide,\n  size,\n} from \"@floating-ui/dom\";\n\nexport default class DatePicker extends ViewHook {\n  expanded = false;\n  name = \"date-picker\";\n  placement = \"bottom-start\";\n  defaultPlacement = \"bottom-start\";\n  activePlacement = \"bottom-start\";\n  strategy = \"auto\"; // \"auto\" | \"absolute\" | \"fixed\"\n  defaultStrategy = \"absolute\";\n  currentStrategy = \"absolute\";\n  event_trigger = \"click\"; // \"click\" | \"hover\" | \"focus\"\n  currentIndex = -1;\n  expand_popover = false; // expand popover to match width of trigger\n  focus_selected = true;\n  pendingCalendarFocusDate = null;\n\n  #outside_listener;\n  #clear_floating;\n  #triggerClickHandler;\n  #triggerMouseEnterHandler;\n  #triggerMouseLeaveHandler;\n  #triggerFocusHandler;\n  #triggerBlurHandler;\n  #containerKeyDownHandler;\n  #triggerKeyDownHandler;\n  #externalCloseHandler;\n  #inputSyncHandler;\n  #selectChangeHandler;\n\n  mounted() {\n    this.defaultPlacement = this.el.dataset.placement || this.placement;\n    this.activePlacement = this.defaultPlacement;\n    this.placement = this.defaultPlacement;\n    this.strategy = this.el.dataset.strategy || this.strategy;\n    this.currentStrategy = this.resolveStrategy();\n    this.event_trigger = this.el.dataset.trigger || this.event_trigger;\n    this.cacheElements();\n\n    this.refreshExpanded();\n\n    this.#triggerClickHandler = this.handleTriggerClick.bind(this);\n    this.#triggerMouseEnterHandler = this.handleTriggerMouseEnter.bind(this);\n    this.#triggerMouseLeaveHandler = this.handleTriggerMouseLeave.bind(this);\n    this.#triggerFocusHandler = this.handleTriggerFocus.bind(this);\n    this.#triggerBlurHandler = this.handleTriggerBlur.bind(this);\n    this.#containerKeyDownHandler = this.handleContainerKeyDown.bind(this);\n    this.#triggerKeyDownHandler = this.handleTriggerKeyDown.bind(this);\n    this.#externalCloseHandler = this.handleExternalClose.bind(this);\n    this.#inputSyncHandler = this.handleInputSync.bind(this);\n    this.#selectChangeHandler = this.handleSelectChange.bind(this);\n\n    this.bindEventListeners();\n    this.el.addEventListener(\"pui:popover-close\", this.#externalCloseHandler);\n    this.el.addEventListener(\"pui:date-picker-sync\", this.#inputSyncHandler);\n    this.el.addEventListener(\"change\", this.#selectChangeHandler);\n    this.ignoreHookManagedAttributes();\n\n    this.#outside_listener = (event) => {\n      const target = event.target;\n      const clickedOnTrigger = this.trigger?.contains(target);\n      const clickedOnPopup = this.popup?.contains(target);\n      if (!clickedOnTrigger && !clickedOnPopup && this.expanded) {\n        this.closePopover();\n      }\n    };\n\n    this.initFloatingUI();\n  }\n\n  listenOutside() {\n    document.addEventListener(\"click\", this.#outside_listener);\n  }\n\n  removeOutsideListener() {\n    document.removeEventListener(\"click\", this.#outside_listener);\n  }\n\n  updated() {\n    const previousTrigger = this.trigger;\n\n    this.cacheElements();\n    this.ignoreHookManagedAttributes();\n    this.rebindEventListeners(previousTrigger);\n    this.restoreExpanded();\n    this.initFloatingUI();\n    this.refreshFloatingUI();\n    this.restorePendingCalendarFocus();\n  }\n\n  destroyed() {\n    this.unbindEventListeners(this.trigger);\n    document.removeEventListener(\"click\", this.#outside_listener);\n    this.el.removeEventListener(\"pui:popover-close\", this.#externalCloseHandler);\n    this.el.removeEventListener(\"pui:date-picker-sync\", this.#inputSyncHandler);\n    this.el.removeEventListener(\"change\", this.#selectChangeHandler);\n\n    if (this.#clear_floating) {\n      this.#clear_floating();\n    }\n  }\n\n  handleTriggerKeyDown(event) {\n    if (\n      !this.expanded &&\n      (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")\n    ) {\n      event.preventDefault();\n      this.openPopover({ placement: this.getPlacementForKey(event.key) });\n      return;\n    }\n\n    if (!this.expanded && this.isPrintableKeyEvent(event)) {\n      const handled = this.handleTriggerTypeahead(event);\n      if (handled) {\n        event.preventDefault();\n      }\n    }\n  }\n\n  handleTriggerClick() {\n    if (this.expanded) {\n      this.closePopover();\n    } else {\n      this.openPopover({ placement: this.getOpenPlacement() });\n    }\n\n    this.refreshExpanded();\n  }\n\n  handleTriggerMouseEnter() {\n    this.openPopover();\n    this.refreshExpanded();\n  }\n\n  handleTriggerMouseLeave() {\n    this.closePopover();\n    this.refreshExpanded();\n  }\n\n  handleTriggerFocus() {\n    this.openPopover();\n    this.refreshExpanded();\n  }\n\n  handleTriggerBlur() {\n    this.closePopover();\n    this.refreshExpanded();\n  }\n\n  handleContainerKeyDown(event) {\n    if (!this.expanded) return;\n\n    if ([\"SELECT\", \"INPUT\", \"TEXTAREA\"].includes(event.target?.tagName)) {\n      return;\n    }\n\n    switch (event.key) {\n      case \"Escape\":\n        event.preventDefault();\n        event.stopPropagation();\n        this.closePopover();\n        this.trigger?.focus();\n        break;\n      case \"ArrowDown\":\n      case \"ArrowUp\":\n      case \"ArrowLeft\":\n      case \"ArrowRight\":\n      case \"Home\":\n      case \"End\":\n        this.handleArrowNavigation(event);\n        break;\n      case \"Enter\":\n        this.handleKeyEnter(event);\n\n        break;\n      case \"Tab\":\n        this.closePopover();\n        break;\n      default:\n        if (this.isPrintableKeyEvent(event)) {\n          const handled = this.handlePrintableKey(event);\n          if (handled) {\n            event.preventDefault();\n          }\n        }\n    }\n  }\n\n  handleKeyEnter(event) {\n    // see select.js for example\n  }\n\n  handleExternalClose() {\n    if (!this.expanded) return;\n\n    this.closePopover();\n    this.refreshExpanded();\n  }\n\n  handleInputSync(event) {\n    const inputId = event.detail?.input;\n    const input = inputId ? document.getElementById(inputId) : null;\n\n    if (!input) {\n      return;\n    }\n\n    input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n    input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n  }\n\n  handleSelectChange(event) {\n    const target = event.target;\n\n    if (!(target instanceof HTMLSelectElement)) {\n      return;\n    }\n\n    const offset = target.dataset.offset;\n\n    if (target.dataset.pui === \"calendar-month-select\") {\n      event.stopPropagation();\n      this.pushEventTo(this.el, \"select_month\", {\n        month: target.value,\n        offset,\n      });\n      return;\n    }\n\n    if (target.dataset.pui === \"calendar-year-select\") {\n      event.stopPropagation();\n      this.pushEventTo(this.el, \"select_year\", {\n        year: target.value,\n        offset,\n      });\n    }\n  }\n\n  handleTriggerTypeahead(_event) {\n    return false;\n  }\n\n  handlePrintableKey(_event) {\n    return false;\n  }\n\n  handleArrowNavigation(event) {\n    if (!this.expanded) return;\n\n    if (\n      this.popup?.dataset.gridNavigation === \"calendar\" &&\n      [\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)\n    ) {\n      event.preventDefault();\n      this.handleCalendarArrowNavigation(event.key);\n      return;\n    }\n\n    const visibleItems = this.getNavigableItems();\n    const itemCount = visibleItems.length;\n\n    if (itemCount === 0) return;\n\n    event.preventDefault();\n\n    let newIndex = this.currentIndex;\n\n    switch (event.key) {\n      case \"ArrowDown\":\n        newIndex = (this.currentIndex + 1) % itemCount;\n        break;\n      case \"ArrowUp\":\n        newIndex = (this.currentIndex - 1 + itemCount) % itemCount;\n        break;\n      case \"Home\":\n        newIndex = 0;\n        break;\n      case \"End\":\n        newIndex = itemCount - 1;\n        break;\n    }\n\n    this.setCurrentItemByIndex(newIndex, visibleItems);\n  }\n\n  handleCalendarArrowNavigation(key) {\n    const items = this.getNavigableItems();\n    const currentIndex =\n      this.currentIndex === -1\n        ? this.getInitialNavigationIndex(items)\n        : this.currentIndex;\n    const currentItem = items[currentIndex];\n    const currentDate = currentItem?.dataset?.date;\n\n    if (!currentDate) {\n      return;\n    }\n\n    const dayOffset =\n      key === \"ArrowLeft\"\n        ? -1\n        : key === \"ArrowRight\"\n          ? 1\n          : key === \"ArrowUp\"\n            ? -7\n            : 7;\n\n    const targetDate = this.addDays(currentDate, dayOffset);\n    const targetIndex = this.findCalendarTargetIndex(\n      items,\n      currentIndex,\n      targetDate,\n      key,\n    );\n\n    if (targetIndex !== -1) {\n      this.setCurrentItemByIndex(targetIndex, items);\n      return;\n    }\n\n    const direction = dayOffset < 0 ? \"prev\" : \"next\";\n    const navButton = this.popup?.querySelector(`[data-pui=\"calendar-${direction}\"]`);\n\n    if (!navButton || navButton.disabled) {\n      return;\n    }\n\n    this.pendingCalendarFocusDate = targetDate;\n    this.pushEventTo(this.el, \"navigate\", { direction });\n  }\n\n  initFloatingUI() {\n    if (this.#clear_floating) {\n      this.#clear_floating();\n    }\n    if (!this.trigger || !this.popup) {\n      return;\n    }\n\n    if (!this.expanded) {\n      return;\n    }\n\n    this.currentStrategy = this.resolveStrategy();\n\n    this.#clear_floating = autoUpdate(\n      this.trigger,\n      this.popup,\n      () => {\n        this.refreshFloatingUI();\n      },\n      {\n        animationFrame: this.currentStrategy === \"fixed\",\n      },\n    );\n  }\n\n  bindEventListeners() {\n    this.el.addEventListener(\"keydown\", this.#containerKeyDownHandler);\n    this.trigger?.addEventListener(\"keydown\", this.#triggerKeyDownHandler);\n\n    if (this.event_trigger === \"click\") {\n      this.trigger?.addEventListener(\"click\", this.#triggerClickHandler);\n      return;\n    }\n\n    if (this.event_trigger === \"hover\") {\n      this.trigger?.addEventListener(\n        \"mouseenter\",\n        this.#triggerMouseEnterHandler,\n      );\n      this.trigger?.addEventListener(\n        \"mouseleave\",\n        this.#triggerMouseLeaveHandler,\n      );\n      return;\n    }\n\n    if (this.event_trigger === \"focus\") {\n      this.trigger?.addEventListener(\"focus\", this.#triggerFocusHandler);\n      this.trigger?.addEventListener(\"blur\", this.#triggerBlurHandler);\n    }\n  }\n\n  unbindEventListeners(trigger) {\n    this.el.removeEventListener(\"keydown\", this.#containerKeyDownHandler);\n    trigger?.removeEventListener(\"keydown\", this.#triggerKeyDownHandler);\n    trigger?.removeEventListener(\"click\", this.#triggerClickHandler);\n    trigger?.removeEventListener(\"mouseenter\", this.#triggerMouseEnterHandler);\n    trigger?.removeEventListener(\"mouseleave\", this.#triggerMouseLeaveHandler);\n    trigger?.removeEventListener(\"focus\", this.#triggerFocusHandler);\n    trigger?.removeEventListener(\"blur\", this.#triggerBlurHandler);\n  }\n\n  rebindEventListeners(previousTrigger) {\n    if (previousTrigger === this.trigger) {\n      return;\n    }\n\n    this.unbindEventListeners(previousTrigger);\n    this.bindEventListeners();\n  }\n\n  refreshFloatingUI() {\n    if (!this.trigger || !this.popup || !this.expanded) {\n      return Promise.resolve();\n    }\n\n    const expand_popover = this.expand_popover;\n    const collisionPadding = 8;\n    const nextStrategy = this.resolveStrategy();\n\n    if (nextStrategy !== this.currentStrategy) {\n      this.currentStrategy = nextStrategy;\n      this.initFloatingUI();\n    } else {\n      this.currentStrategy = nextStrategy;\n    }\n\n    return computePosition(this.trigger, this.popup, {\n      placement: this.activePlacement,\n      strategy: this.currentStrategy,\n      middleware: [\n        offset(collisionPadding),\n        flip({ padding: collisionPadding }),\n        shift({ padding: collisionPadding }),\n        size({\n          padding: collisionPadding,\n          apply({ rects, elements }) {\n            if (expand_popover) {\n              elements.floating.style.width = `${Math.max(0, Math.floor(rects.reference.width))}px`;\n            } else {\n              elements.floating.style.removeProperty(\"width\");\n            }\n          },\n        }),\n        hide({ padding: collisionPadding }),\n      ],\n    }).then(({ x, y, strategy, placement, middlewareData }) => {\n      const referenceHidden = Boolean(middlewareData.hide?.referenceHidden);\n\n      Object.assign(this.popup.style, {\n        left: `${x}px`,\n        top: `${y}px`,\n        position: strategy,\n      });\n\n      this.popup.dataset.side = placement.split(\"-\")[0];\n      this.popup.dataset.floatingStrategy = strategy;\n      this.popup.dataset.referenceHidden = String(referenceHidden);\n\n      if (referenceHidden && this.expanded) {\n        this.closePopover({ restoreFocus: false });\n      }\n    });\n  }\n\n  closePopover(options = {}) {\n    const { restoreFocus = true } = options;\n\n    this.trigger?.setAttribute(\"aria-expanded\", \"false\");\n    this.popup?.setAttribute(\"aria-hidden\", \"true\");\n\n    this.expanded = false;\n    this.currentIndex = -1;\n    this.activePlacement = this.defaultPlacement;\n\n    this.onPopupClosed(restoreFocus);\n    this.popup?.setAttribute(\"data-reference-hidden\", \"false\");\n    this.removeOutsideListener();\n    this.initFloatingUI();\n  }\n\n  onPopupOpened() {}\n\n  onPopupClosed(restoreFocus = true) {\n    if (\n      this.popup?.contains(document.activeElement) ||\n      this.trigger?.contains(document.activeElement)\n    ) {\n      if (restoreFocus) {\n        this.focusElement(this.trigger);\n      } else if (typeof document.activeElement?.blur === \"function\") {\n        document.activeElement.blur();\n      }\n    }\n  }\n\n  openPopover(options = {}) {\n    this.activePlacement = options.placement || this.getOpenPlacement();\n    this.trigger?.setAttribute(\"aria-expanded\", \"true\");\n    this.popup?.setAttribute(\"aria-hidden\", \"false\");\n    this.popup?.setAttribute(\"data-reference-hidden\", \"false\");\n\n    this.focusElement(this.popup);\n    this.expanded = true;\n    this.currentIndex = this.getInitialNavigationIndex(\n      this.getNavigableItems(),\n    );\n\n    this.onPopupOpened();\n    this.listenOutside();\n    this.initFloatingUI();\n    this.refreshFloatingUI();\n\n    requestAnimationFrame(() => {\n      if (!this.expanded) return;\n\n      if (this.currentIndex !== -1) {\n        this.setCurrentItemByIndex(this.currentIndex);\n      } else {\n        this.focusElement(this.popup);\n      }\n    });\n  }\n\n  log(msg, data) {\n    console.log(`${this.name}: ${msg}`, data);\n  }\n\n  refreshExpanded() {\n    this.expanded = this.trigger?.getAttribute(\"aria-expanded\") == \"true\";\n  }\n\n  restoreExpanded() {\n    if (this.expanded) {\n      this.openPopover({ placement: this.activePlacement });\n    } else {\n      this.closePopover();\n    }\n  }\n\n  cacheElements() {\n    this.trigger = this.el.querySelector(\"[aria-haspopup],[role='combobox']\");\n    this.popup = this.el.querySelector(\"[role='menu'],[role='listbox']\");\n    this.items =\n      this.popup?.querySelectorAll(\"[role='option'],[role='menuitem']\") ?? [];\n  }\n\n  ignoreHookManagedAttributes() {\n    if (this.trigger) {\n      this.js().ignoreAttributes(this.trigger, [\"aria-expanded\"]);\n    }\n\n    if (this.popup) {\n      this.js().ignoreAttributes(this.popup, [\"aria-*\", \"data-*\", \"style\"]);\n    }\n  }\n\n  getOpenPlacement() {\n    return this.defaultPlacement;\n  }\n\n  getPlacementForKey(_key) {\n    return this.defaultPlacement;\n  }\n\n  getNavigableItems() {\n    return Array.from(this.items).filter(\n      (item) =>\n        item.style.display !== \"none\" &&\n        item.getAttribute(\"aria-disabled\") !== \"true\" &&\n        item.getAttribute(\"aria-hidden\") !== \"true\",\n    );\n  }\n\n  getInitialNavigationIndex(items) {\n    const focusDate = this.popup?.dataset.focusDate;\n\n    if (focusDate) {\n      const focusedIndex = items.findIndex((item) => item.dataset?.date === focusDate);\n      if (focusedIndex !== -1) {\n        return focusedIndex;\n      }\n    }\n\n    return items.length > 0 ? 0 : -1;\n  }\n\n  setCurrentItemByIndex(index, items = this.getNavigableItems()) {\n    const itemCount = items.length;\n    if (itemCount === 0 || index < 0 || index >= itemCount) {\n      this.currentIndex = -1;\n      return null;\n    }\n\n    items.forEach((item, itemIndex) => {\n      if (itemIndex === index) {\n        item.setAttribute(\"aria-selected\", \"true\");\n        item.setAttribute(\"tabindex\", \"0\");\n        if (this.focus_selected) {\n          this.focusElement(item);\n        }\n        this.scrollItemIntoView(item);\n      } else {\n        item.setAttribute(\"tabindex\", \"-1\");\n        item.removeAttribute(\"aria-selected\");\n      }\n    });\n\n    this.currentIndex = index;\n    return items[index];\n  }\n\n  isPrintableKeyEvent(event) {\n    return (\n      event.key.length === 1 &&\n      !event.altKey &&\n      !event.ctrlKey &&\n      !event.metaKey\n    );\n  }\n\n  focusElement(element) {\n    if (!element) {\n      return;\n    }\n\n    if (typeof element.focus === \"function\") {\n      try {\n        element.focus({ preventScroll: true });\n      } catch {\n        element.focus();\n      }\n    }\n  }\n\n  restorePendingCalendarFocus() {\n    if (!this.pendingCalendarFocusDate || !this.expanded) {\n      return;\n    }\n\n    requestAnimationFrame(() => {\n      if (!this.expanded) return;\n\n      const items = this.getNavigableItems();\n      const targetIndex = items.findIndex(\n        (item) => item.dataset?.date === this.pendingCalendarFocusDate,\n      );\n\n      if (targetIndex !== -1) {\n        this.setCurrentItemByIndex(targetIndex, items);\n      }\n\n      this.pendingCalendarFocusDate = null;\n    });\n  }\n\n  addDays(value, offset) {\n    const date = this.parseISODate(value);\n    if (!date) {\n      return value;\n    }\n\n    date.setUTCDate(date.getUTCDate() + offset);\n    return this.formatISODate(date);\n  }\n\n  parseISODate(value) {\n    const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n\n    if (!match) {\n      return null;\n    }\n\n    const [, year, month, day] = match;\n    const date = new Date(Date.UTC(Number(year), Number(month) - 1, Number(day)));\n\n    return Number.isNaN(date.getTime()) ? null : date;\n  }\n\n  formatISODate(date) {\n    const year = String(date.getUTCFullYear());\n    const month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n    const day = String(date.getUTCDate()).padStart(2, \"0\");\n\n    return `${year}-${month}-${day}`;\n  }\n\n  findCalendarTargetIndex(items, currentIndex, targetDate, key) {\n    const candidates = items\n      .map((item, index) => ({ item, index }))\n      .filter(({ item }) => item.dataset?.date === targetDate);\n\n    if (candidates.length === 0) {\n      return -1;\n    }\n\n    const inMonthCandidate = candidates.find(\n      ({ item }) => item.dataset?.outsideMonth !== \"true\",\n    );\n\n    if (inMonthCandidate) {\n      return inMonthCandidate.index;\n    }\n\n    if (key === \"ArrowRight\" || key === \"ArrowDown\") {\n      return (\n        candidates.find(({ index }) => index > currentIndex)?.index ??\n        candidates[candidates.length - 1].index\n      );\n    }\n\n    if (key === \"ArrowLeft\" || key === \"ArrowUp\") {\n      return (\n        [...candidates].reverse().find(({ index }) => index < currentIndex)?.index ??\n        candidates[0].index\n      );\n    }\n\n    return candidates[0].index;\n  }\n\n  resolveStrategy() {\n    if (this.strategy === \"absolute\" || this.strategy === \"fixed\") {\n      return this.strategy;\n    }\n\n    return this.hasNestedClippingAncestor() ? \"fixed\" : this.defaultStrategy;\n  }\n\n  hasNestedClippingAncestor() {\n    if (!this.trigger) {\n      return false;\n    }\n\n    return getOverflowAncestors(this.trigger).some((ancestor) =>\n      this.isNestedClippingAncestor(ancestor),\n    );\n  }\n\n  isNestedClippingAncestor(ancestor) {\n    if (!(ancestor instanceof HTMLElement)) {\n      return false;\n    }\n\n    const doc = ancestor.ownerDocument;\n\n    if (\n      !doc ||\n      ancestor === doc.body ||\n      ancestor === doc.documentElement ||\n      ancestor === this.el ||\n      ancestor === this.trigger ||\n      ancestor === this.popup\n    ) {\n      return false;\n    }\n\n    const style = window.getComputedStyle(ancestor);\n\n    return [style.overflow, style.overflowX, style.overflowY].some((value) =>\n      [\"auto\", \"scroll\", \"hidden\", \"clip\", \"overlay\"].includes(value),\n    );\n  }\n\n  scrollItemIntoView(item) {\n    if (!item || !this.popup) {\n      return;\n    }\n\n    const popupRect = this.popup.getBoundingClientRect();\n    const itemRect = item.getBoundingClientRect();\n\n    if (itemRect.top < popupRect.top) {\n      this.popup.scrollTop -= popupRect.top - itemRect.top;\n    } else if (itemRect.bottom > popupRect.bottom) {\n      this.popup.scrollTop += itemRect.bottom - popupRect.bottom;\n    }\n  }\n}\n", "import { ViewHook } from \"phoenix_live_view\";\nimport {\n  autoUpdate,\n  computePosition,\n  flip,\n  getOverflowAncestors,\n  hide,\n  offset,\n  shift,\n  size,\n} from \"@floating-ui/dom\";\n\nexport default class Select extends ViewHook {\n  expanded = false;\n  placement = \"bottom-start\";\n  activePlacement = \"bottom-start\";\n  strategy = \"auto\";\n  defaultStrategy = \"absolute\";\n  currentStrategy = \"absolute\";\n  currentIndex = -1;\n  expandPopover = true;\n  focusSelected = false;\n  popupMinWidth = 208;\n\n  #clearFloating;\n  #outsideListener;\n  #triggerClickHandler;\n  #triggerKeyDownHandler;\n  #containerKeyDownHandler;\n  #popupClickHandler;\n  #searchInputHandler;\n  #searchKeyDownHandler;\n  #typeaheadBuffer = \"\";\n  #typeaheadTimeout;\n\n  mounted() {\n    this.placement = this.el.dataset.placement || this.placement;\n    this.activePlacement = this.placement;\n    this.strategy = this.el.dataset.strategy || this.strategy;\n    this.currentStrategy = this.resolveStrategy();\n\n    this.cacheElements();\n    this.refreshExpanded();\n\n    this.#triggerClickHandler = this.handleTriggerClick.bind(this);\n    this.#triggerKeyDownHandler = this.handleTriggerKeyDown.bind(this);\n    this.#containerKeyDownHandler = this.handleContainerKeyDown.bind(this);\n    this.#popupClickHandler = this.handlePopupClick.bind(this);\n    this.#searchInputHandler = this.handleSearchInput.bind(this);\n    this.#searchKeyDownHandler = this.handleSearchKeyDown.bind(this);\n\n    this.bindEventListeners();\n\n    this.#outsideListener = (event) => {\n      const target = event.target;\n      const clickedOnTrigger = this.trigger?.contains(target);\n      const clickedOnPopup = this.popup?.contains(target);\n\n      if (!clickedOnTrigger && !clickedOnPopup && this.expanded) {\n        this.closePopover();\n      }\n    };\n\n    this.initFloatingUI();\n    this.ensureOptionMetadata();\n    this.selectDefaultValue();\n  }\n\n  updated() {\n    const previousTrigger = this.trigger;\n    const previousPopup = this.popup;\n    const previousSearch = this.search;\n\n    this.cacheElements();\n    this.rebindEventListeners(previousTrigger, previousPopup, previousSearch);\n    this.ensureOptionMetadata();\n    this.syncValueFromDataset();\n    this.restoreExpanded();\n    this.initFloatingUI();\n    this.refreshFloatingUI();\n  }\n\n  destroyed() {\n    this.unbindEventListeners(this.trigger, this.popup, this.search);\n    document.removeEventListener(\"click\", this.#outsideListener);\n\n    if (this.#clearFloating) {\n      this.#clearFloating();\n    }\n\n    this.resetTypeahead();\n  }\n\n  cacheElements() {\n    this.trigger = this.el.querySelector(\"[aria-haspopup],[role='combobox']\");\n    this.popup = this.el.querySelector(\"[role='menu'],[role='listbox']\");\n    this.viewport = this.el.querySelector(\"[data-pui='menu-viewport']\") || this.popup;\n    this.items =\n      this.popup?.querySelectorAll(\"[role='option'],[role='menuitem']\") ?? [];\n    this.search = this.el.querySelector(\n      \"input[type='text'][role='searchbox'], input[type='text'][role='combobox']\",\n    );\n    this.hiddenInput = this.el.querySelector(\"input[data-pui='select-value']\");\n    this.label = this.el.querySelector(\"[data-pui='selected-label']\");\n    this.popupMinWidth =\n      Number.parseFloat(this.popup?.dataset.popupMinWidth || `${this.popupMinWidth}`) ||\n      this.popupMinWidth;\n  }\n\n  bindEventListeners() {\n    this.el.addEventListener(\"keydown\", this.#containerKeyDownHandler);\n    this.trigger?.addEventListener(\"click\", this.#triggerClickHandler);\n    this.trigger?.addEventListener(\"keydown\", this.#triggerKeyDownHandler);\n    this.popup?.addEventListener(\"click\", this.#popupClickHandler);\n    this.search?.addEventListener(\"keydown\", this.#searchKeyDownHandler);\n  }\n\n  unbindEventListeners(trigger, popup, search) {\n    this.el.removeEventListener(\"keydown\", this.#containerKeyDownHandler);\n    trigger?.removeEventListener(\"click\", this.#triggerClickHandler);\n    trigger?.removeEventListener(\"keydown\", this.#triggerKeyDownHandler);\n    popup?.removeEventListener(\"click\", this.#popupClickHandler);\n    search?.removeEventListener(\"keydown\", this.#searchKeyDownHandler);\n    search?.removeEventListener(\"input\", this.#searchInputHandler);\n  }\n\n  rebindEventListeners(previousTrigger, previousPopup, previousSearch) {\n    if (\n      previousTrigger === this.trigger &&\n      previousPopup === this.popup &&\n      previousSearch === this.search\n    ) {\n      return;\n    }\n\n    this.unbindEventListeners(previousTrigger, previousPopup, previousSearch);\n    this.bindEventListeners();\n\n    if (this.expanded) {\n      this.search?.addEventListener(\"input\", this.#searchInputHandler);\n    }\n  }\n\n  refreshExpanded() {\n    this.expanded = this.trigger?.getAttribute(\"aria-expanded\") === \"true\";\n  }\n\n  restoreExpanded() {\n    if (this.expanded) {\n      this.openPopover({ placement: this.activePlacement });\n    } else {\n      this.closePopover();\n    }\n  }\n\n  handleTriggerClick() {\n    if (this.expanded) {\n      this.closePopover();\n    } else {\n      this.openPopover({ placement: this.placement });\n    }\n\n    this.refreshExpanded();\n  }\n\n  handleTriggerKeyDown(event) {\n    if (!this.expanded && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")) {\n      event.preventDefault();\n      event.stopPropagation();\n      this.openPopover({ placement: this.getPlacementForKey(event.key) });\n      return;\n    }\n\n    if (!this.expanded && this.isPrintableKeyEvent(event)) {\n      const handled = this.handleTriggerTypeahead(event);\n      if (handled) {\n        event.preventDefault();\n      }\n    }\n  }\n\n  handleContainerKeyDown(event) {\n    if (!this.expanded) {\n      return;\n    }\n\n    switch (event.key) {\n      case \"Escape\":\n        event.preventDefault();\n        event.stopPropagation();\n        this.closePopover();\n        this.focusElement(this.trigger);\n        break;\n      case \"ArrowDown\":\n      case \"ArrowUp\":\n      case \"Home\":\n      case \"End\":\n        this.handleArrowNavigation(event);\n        break;\n      case \"Enter\":\n        this.handleKeyEnter(event);\n        break;\n      case \"Tab\":\n        this.closePopover();\n        break;\n      default:\n        if (this.isPrintableKeyEvent(event)) {\n          const handled = this.handlePrintableKey(event);\n          if (handled) {\n            event.preventDefault();\n          }\n        }\n    }\n  }\n\n  handleArrowNavigation(event) {\n    const visibleItems = this.getNavigableItems();\n    const itemCount = visibleItems.length;\n\n    if (itemCount === 0) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (this.currentIndex < 0) {\n      const initialIndex = this.getInitialNavigationIndex(visibleItems);\n      this.setCurrentItemByIndex(initialIndex, visibleItems);\n      return;\n    }\n\n    let newIndex = this.currentIndex;\n\n    switch (event.key) {\n      case \"ArrowDown\":\n        newIndex = (this.currentIndex + 1) % itemCount;\n        break;\n      case \"ArrowUp\":\n        newIndex = (this.currentIndex - 1 + itemCount) % itemCount;\n        break;\n      case \"Home\":\n        newIndex = 0;\n        break;\n      case \"End\":\n        newIndex = itemCount - 1;\n        break;\n    }\n\n    this.setCurrentItemByIndex(newIndex, visibleItems);\n  }\n\n  handleKeyEnter(event) {\n    if (this.currentIndex < 0) {\n      return;\n    }\n\n    event.preventDefault();\n    const visibleItems = this.getNavigableItems();\n    const currentItem = visibleItems[this.currentIndex];\n\n    if (currentItem) {\n      this.selectItem(currentItem);\n    }\n  }\n\n  handlePopupClick(event) {\n    const item = event.target?.closest(\"[role='option'],[role='menuitem']\");\n    if (item && this.popup?.contains(item)) {\n      this.selectItem(item);\n    }\n  }\n\n  handleSearchInput(event) {\n    event.stopPropagation();\n\n    const query = event.target.value.toLowerCase();\n\n    this.currentIndex = -1;\n    this.items.forEach((item) => {\n      const itemText = (item.dataset.label || item.textContent).trim().toLowerCase();\n      const matches = itemText.includes(query);\n      item.setAttribute(\"aria-hidden\", String(!matches));\n    });\n\n    const visibleItems = this.getNavigableItems();\n    const nextIndex = this.getInitialNavigationIndex(visibleItems);\n    this.setCurrentItemByIndex(nextIndex, visibleItems);\n  }\n\n  handleSearchKeyDown(event) {\n    switch (event.key) {\n      case \"ArrowDown\":\n      case \"ArrowUp\":\n      case \"Home\":\n      case \"End\":\n      case \"Enter\":\n      case \"Escape\":\n        this.handleContainerKeyDown(event);\n        event.stopPropagation();\n        break;\n    }\n  }\n\n  handleTriggerTypeahead(event) {\n    const item = this.findTypeaheadMatch(event.key);\n\n    if (!item) {\n      return false;\n    }\n\n    this.selectItem(item, { close: false });\n    return true;\n  }\n\n  handlePrintableKey(event) {\n    if (event.target === this.search) {\n      return false;\n    }\n\n    const visibleItems = this.getNavigableItems();\n    const item = this.findTypeaheadMatch(event.key, visibleItems);\n\n    if (!item) {\n      return false;\n    }\n\n    const itemIndex = visibleItems.findIndex((visibleItem) => visibleItem === item);\n    this.setCurrentItemByIndex(itemIndex, visibleItems);\n    this.selectItem(item, { close: false, focusTrigger: false });\n    return true;\n  }\n\n  getPlacementForKey(key) {\n    if (key === \"ArrowUp\") {\n      return \"top-start\";\n    }\n\n    return this.placement;\n  }\n\n  getNavigableItems() {\n    return Array.from(this.items).filter(\n      (item) =>\n        item.style.display !== \"none\" &&\n        item.getAttribute(\"aria-disabled\") !== \"true\" &&\n        item.getAttribute(\"aria-hidden\") !== \"true\",\n    );\n  }\n\n  getInitialNavigationIndex(items) {\n    const selectedValue = this.hiddenInput?.value;\n    const selectedIndex = items.findIndex(\n      (item) => item.dataset.value === selectedValue,\n    );\n\n    return selectedIndex >= 0 ? selectedIndex : (items.length > 0 ? 0 : -1);\n  }\n\n  setCurrentItemByIndex(index, items = this.getNavigableItems(), options = {}) {\n    const { scrollAlignment = \"nearest\" } = options;\n    const itemCount = items.length;\n\n    if (itemCount === 0 || index < 0 || index >= itemCount) {\n      this.currentIndex = -1;\n      this.clearActiveItems();\n      this.setActiveDescendant(null);\n      return null;\n    }\n\n    items.forEach((item, itemIndex) => {\n      item.setAttribute(\"tabindex\", itemIndex === index ? \"0\" : \"-1\");\n      item.dataset.active = String(itemIndex === index);\n\n      if (itemIndex === index) {\n        if (this.focusSelected) {\n          this.focusElement(item);\n        }\n        this.scrollItemIntoView(item, { alignment: scrollAlignment });\n      }\n    });\n\n    this.currentIndex = index;\n    this.setActiveDescendant(items[index]);\n    return items[index];\n  }\n\n  syncValueFromDataset() {\n    const serverValue = this.el.dataset.value;\n\n    if (!this.hiddenInput) {\n      return;\n    }\n\n    if (serverValue !== undefined && this.hiddenInput.value !== serverValue) {\n      const serverItem = Array.from(this.items).find(\n        (item) => item.dataset.value === serverValue,\n      );\n\n      if (serverItem) {\n        this.selectItem(serverItem, { close: false, focusTrigger: false });\n      } else {\n        this.hiddenInput.value = serverValue;\n        this.updatePlaceholder();\n      }\n    }\n  }\n\n  ensureOptionMetadata() {\n    this.items.forEach((item, index) => {\n      if (!item.id) {\n        item.id = `${this.el.id || \"pui-select\"}-option-${index}`;\n      }\n\n      if (!item.dataset.label) {\n        item.dataset.label = item.textContent.trim();\n      }\n\n      item.setAttribute(\"tabindex\", \"-1\");\n    });\n  }\n\n  selectDefaultValue() {\n    const defaultValue = this.el.dataset.value;\n\n    if (!defaultValue) {\n      return;\n    }\n\n    const defaultItem = Array.from(this.items).find(\n      (item) => item.dataset.value === defaultValue,\n    );\n\n    if (defaultItem) {\n      this.selectItem(defaultItem, { close: false, focusTrigger: false });\n    }\n  }\n\n  selectItem(itemEl, options = {}) {\n    const { close = true, focusTrigger = true } = options;\n\n    if (this.hiddenInput) {\n      const newValue = itemEl.dataset.value;\n      if (newValue && this.hiddenInput.value !== newValue) {\n        this.hiddenInput.value = newValue;\n        this.hiddenInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n      }\n    }\n\n    this.setSelectedItem(itemEl);\n    this.updatePlaceholder();\n\n    if (close) {\n      this.closePopover();\n    } else if (focusTrigger) {\n      this.focusElement(this.trigger);\n    }\n  }\n\n  setSelectedItem(selectedItem) {\n    this.items.forEach((item) => {\n      const isSelected = item === selectedItem;\n      item.setAttribute(\"aria-selected\", String(isSelected));\n      item.setAttribute(\"tabindex\", isSelected ? \"0\" : \"-1\");\n    });\n\n    const visibleItems = this.getNavigableItems();\n    this.currentIndex = visibleItems.findIndex((item) => item === selectedItem);\n    this.setActiveDescendant(selectedItem);\n  }\n\n  clearActiveItems() {\n    this.items.forEach((item) => {\n      delete item.dataset.active;\n    });\n  }\n\n  updatePlaceholder() {\n    const selectedItem = Array.from(this.items).find(\n      (item) => item.dataset.value === this.hiddenInput?.value,\n    );\n\n    if (this.label) {\n      this.label.textContent = selectedItem ? selectedItem.textContent : \"\";\n    }\n  }\n\n  setActiveDescendant(item) {\n    const activeId = item?.id;\n\n    if (activeId) {\n      this.trigger?.setAttribute(\"aria-activedescendant\", activeId);\n      this.search?.setAttribute(\"aria-activedescendant\", activeId);\n      return;\n    }\n\n    this.trigger?.removeAttribute(\"aria-activedescendant\");\n    this.search?.removeAttribute(\"aria-activedescendant\");\n  }\n\n  clearSearch() {\n    if (this.search) {\n      this.search.value = \"\";\n    }\n\n    this.items.forEach((item) => {\n      item.removeAttribute(\"aria-hidden\");\n    });\n\n    this.resetTypeahead();\n  }\n\n  openPopover(options = {}) {\n    this.activePlacement = options.placement || this.placement;\n    this.trigger?.setAttribute(\"aria-expanded\", \"true\");\n    this.popup?.setAttribute(\"aria-hidden\", \"false\");\n    this.popup?.setAttribute(\"data-reference-hidden\", \"false\");\n\n    this.expanded = true;\n    const visibleItems = this.getNavigableItems();\n    this.currentIndex = this.getInitialNavigationIndex(visibleItems);\n    this.setCurrentItemByIndex(this.currentIndex, visibleItems, {\n      scrollAlignment: \"none\",\n    });\n\n    if (this.search) {\n      this.search.setAttribute(\"aria-expanded\", \"true\");\n      this.search.addEventListener(\"input\", this.#searchInputHandler);\n      this.focusElement(this.search);\n    } else {\n      this.focusElement(this.popup);\n    }\n\n    this.initFloatingUI();\n    this.listenOutside();\n    this.refreshFloatingUI().then(() => {\n      const currentItems = this.getNavigableItems();\n      this.currentIndex = this.getInitialNavigationIndex(currentItems);\n      this.setCurrentItemByIndex(this.currentIndex, currentItems, {\n        scrollAlignment: \"center-if-needed\",\n      });\n    });\n  }\n\n  closePopover(options = {}) {\n    const { restoreFocus = true } = options;\n\n    this.trigger?.setAttribute(\"aria-expanded\", \"false\");\n    this.popup?.setAttribute(\"aria-hidden\", \"true\");\n    this.search?.setAttribute(\"aria-expanded\", \"false\");\n    this.search?.removeEventListener(\"input\", this.#searchInputHandler);\n\n    this.expanded = false;\n    this.currentIndex = -1;\n    this.activePlacement = this.placement;\n    this.clearActiveItems();\n\n    if (this.search) {\n      this.clearSearch();\n    }\n\n    this.setActiveDescendant(\n      Array.from(this.items).find(\n        (item) => item.dataset.value === this.hiddenInput?.value,\n      ),\n    );\n\n    if (\n      this.popup?.contains(document.activeElement) ||\n      this.trigger?.contains(document.activeElement)\n    ) {\n      if (restoreFocus) {\n        this.focusElement(this.trigger);\n      } else if (typeof document.activeElement?.blur === \"function\") {\n        document.activeElement.blur();\n      }\n    }\n\n    this.popup?.setAttribute(\"data-reference-hidden\", \"false\");\n    this.popup?.style.removeProperty(\"--pui-select-content-available-height\");\n    this.removeOutsideListener();\n    this.initFloatingUI();\n  }\n\n  initFloatingUI() {\n    if (this.#clearFloating) {\n      this.#clearFloating();\n    }\n\n    if (!this.trigger || !this.popup) {\n      return;\n    }\n\n    if (!this.expanded) {\n      return;\n    }\n\n    this.currentStrategy = this.resolveStrategy();\n\n    this.#clearFloating = autoUpdate(this.trigger, this.popup, () => {\n      this.refreshFloatingUI();\n    }, {\n      animationFrame: this.currentStrategy === \"fixed\",\n    });\n  }\n\n  refreshFloatingUI() {\n    if (!this.trigger || !this.popup || !this.expanded) {\n      return Promise.resolve();\n    }\n\n    const expandPopover = this.expandPopover;\n    const defaultPopupMinWidth = this.popupMinWidth;\n    const collisionPadding = 8;\n    const nextStrategy = this.resolveStrategy();\n\n    if (nextStrategy !== this.currentStrategy) {\n      this.currentStrategy = nextStrategy;\n      this.initFloatingUI();\n    } else {\n      this.currentStrategy = nextStrategy;\n    }\n\n    return computePosition(this.trigger, this.popup, {\n      placement: this.activePlacement,\n      strategy: this.currentStrategy,\n      middleware: [\n        offset(collisionPadding),\n        flip({ padding: collisionPadding }),\n        shift({ padding: collisionPadding }),\n        size({\n          padding: collisionPadding,\n          apply({ availableHeight, rects, elements }) {\n            const nextAvailableHeight = `${Math.max(0, Math.floor(availableHeight))}px`;\n            const nextTriggerWidth = Math.max(0, Math.floor(rects.reference.width));\n            const popupMinWidth =\n              Number.parseFloat(\n                elements.floating.dataset.popupMinWidth || `${defaultPopupMinWidth}`,\n              ) || defaultPopupMinWidth;\n            const nextPopupWidth = `${Math.max(\n              popupMinWidth,\n              nextTriggerWidth,\n            )}px`;\n\n            elements.floating.style.setProperty(\n              \"--pui-select-content-available-height\",\n              nextAvailableHeight,\n            );\n            elements.floating.style.setProperty(\n              \"--pui-select-trigger-width\",\n              `${nextTriggerWidth}px`,\n            );\n            elements.floating.style.minWidth = nextPopupWidth;\n\n            if (expandPopover) {\n              elements.floating.style.width = nextPopupWidth;\n            } else {\n              elements.floating.style.removeProperty(\"width\");\n            }\n          },\n        }),\n        hide({ padding: collisionPadding }),\n      ],\n    }).then(({ x, y, strategy, placement, middlewareData }) => {\n      const referenceHidden = Boolean(middlewareData.hide?.referenceHidden);\n\n      Object.assign(this.popup.style, {\n        left: `${x}px`,\n        top: `${y}px`,\n        position: strategy,\n      });\n\n      this.popup.dataset.side = placement.split(\"-\")[0];\n      this.popup.dataset.floatingStrategy = strategy;\n      this.popup.dataset.referenceHidden = String(referenceHidden);\n\n      if (referenceHidden && this.expanded) {\n        this.closePopover({ restoreFocus: false });\n      }\n    });\n  }\n\n  listenOutside() {\n    document.addEventListener(\"click\", this.#outsideListener);\n  }\n\n  removeOutsideListener() {\n    document.removeEventListener(\"click\", this.#outsideListener);\n  }\n\n  findTypeaheadMatch(key, items = Array.from(this.items)) {\n    const normalizedKey = key.toLowerCase();\n    const navigableItems = items.filter(\n      (item) =>\n        item.getAttribute(\"aria-hidden\") !== \"true\" &&\n        item.getAttribute(\"aria-disabled\") !== \"true\",\n    );\n\n    if (navigableItems.length === 0) {\n      return null;\n    }\n\n    this.#typeaheadBuffer = `${this.#typeaheadBuffer}${normalizedKey}`;\n    this.resetTypeaheadTimer();\n\n    const currentValue = this.hiddenInput?.value;\n    const startIndex = navigableItems.findIndex(\n      (item) => item.dataset.value === currentValue,\n    );\n    const orderedItems = [\n      ...navigableItems.slice(startIndex + 1),\n      ...navigableItems.slice(0, startIndex + 1),\n    ];\n\n    return (\n      orderedItems.find((item) =>\n        item.dataset.label.toLowerCase().startsWith(this.#typeaheadBuffer),\n      ) ||\n      orderedItems.find((item) =>\n        item.dataset.label.toLowerCase().startsWith(normalizedKey),\n      ) ||\n      null\n    );\n  }\n\n  resetTypeaheadTimer() {\n    window.clearTimeout(this.#typeaheadTimeout);\n    this.#typeaheadTimeout = window.setTimeout(() => {\n      this.resetTypeahead();\n    }, 700);\n  }\n\n  resetTypeahead() {\n    this.#typeaheadBuffer = \"\";\n    window.clearTimeout(this.#typeaheadTimeout);\n  }\n\n  isPrintableKeyEvent(event) {\n    return (\n      event.key.length === 1 &&\n      !event.altKey &&\n      !event.ctrlKey &&\n      !event.metaKey\n    );\n  }\n\n  focusElement(element) {\n    if (!element || typeof element.focus !== \"function\") {\n      return;\n    }\n\n    try {\n      element.focus({ preventScroll: true });\n    } catch {\n      element.focus();\n    }\n  }\n\n  resolveStrategy() {\n    if (this.strategy === \"absolute\" || this.strategy === \"fixed\") {\n      return this.strategy;\n    }\n\n    return this.hasNestedClippingAncestor() ? \"fixed\" : this.defaultStrategy;\n  }\n\n  hasNestedClippingAncestor() {\n    if (!this.trigger) {\n      return false;\n    }\n\n    return getOverflowAncestors(this.trigger).some((ancestor) =>\n      this.isNestedClippingAncestor(ancestor),\n    );\n  }\n\n  isNestedClippingAncestor(ancestor) {\n    if (!(ancestor instanceof HTMLElement)) {\n      return false;\n    }\n\n    const doc = ancestor.ownerDocument;\n\n    if (\n      !doc ||\n      ancestor === doc.body ||\n      ancestor === doc.documentElement ||\n      ancestor === this.el ||\n      ancestor === this.trigger ||\n      ancestor === this.popup\n    ) {\n      return false;\n    }\n\n    const style = window.getComputedStyle(ancestor);\n\n    return [style.overflow, style.overflowX, style.overflowY].some((value) =>\n      [\"auto\", \"scroll\", \"hidden\", \"clip\", \"overlay\"].includes(value),\n    );\n  }\n\n  scrollItemIntoView(item, options = {}) {\n    const scrollContainer = this.viewport || this.popup;\n\n    if (!item || !scrollContainer) {\n      return;\n    }\n\n    const { alignment = \"nearest\" } = options;\n    const containerRect = scrollContainer.getBoundingClientRect();\n    const itemRect = item.getBoundingClientRect();\n    const itemIsAbove = itemRect.top < containerRect.top;\n    const itemIsBelow = itemRect.bottom > containerRect.bottom;\n\n    if (alignment === \"none\") {\n      return;\n    }\n\n    if (alignment === \"center-if-needed\") {\n      if (!itemIsAbove && !itemIsBelow) {\n        return;\n      }\n\n      const maxScrollTop = Math.max(\n        0,\n        scrollContainer.scrollHeight - scrollContainer.clientHeight,\n      );\n      const centeredScrollTop =\n        scrollContainer.scrollTop +\n        (itemRect.top - containerRect.top) -\n        scrollContainer.clientHeight / 2 +\n        itemRect.height / 2;\n\n      scrollContainer.scrollTop = Math.min(\n        maxScrollTop,\n        Math.max(0, centeredScrollTop),\n      );\n\n      return;\n    }\n\n    if (itemIsAbove) {\n      scrollContainer.scrollTop -= containerRect.top - itemRect.top;\n    } else if (itemIsBelow) {\n      scrollContainer.scrollTop += itemRect.bottom - containerRect.bottom;\n    }\n  }\n}\n", "import { ViewHook } from \"phoenix_live_view\";\n\nState = {\n  IDLE: 0,\n  STARTING: 1,\n};\n\nexport default class LoadingBar extends ViewHook {\n  progress = 0;\n\n  delay = 300;\n  delayTimer = null;\n  raf = null;\n  state = State.IDLE;\n  #boundShow = null;\n  #boundHide = null;\n\n  mounted() {\n    this.progressEl = this.el.querySelector(\"#loadingbar-progress\");\n    this.delay = parseInt(this.el.dataset.delay || \"0\") || this.delay;\n\n    this.#boundShow = this._show.bind(this);\n    this.#boundHide = this._hide.bind(this);\n    this.state = State.IDLE;\n\n    window.addEventListener(\"phx:page-loading-start\", this.#boundShow);\n    window.addEventListener(\"phx:page-loading-stop\", this.#boundHide);\n  }\n\n  _show(info) {\n    this._clear();\n\n    this.delayTimer = setTimeout(() => {\n      if (this.state === State.IDLE) {\n        this.state = State.STARTING;\n        this._start();\n      }\n    }, this.delay);\n  }\n\n  _start() {\n    let lastTime = performance.now();\n\n    const step = (now) => {\n      const dt = now - lastTime;\n      lastTime = now;\n      if (this.progress < 50) {\n        const delta = (100 - this.progress) * 0.01 * (dt / 16);\n        this.progress = Math.min(this.progress + delta, 50);\n      } else if (this.progress < 90) {\n        const delta = (100 - this.progress) * 0.0025 * (dt / 16);\n        this.progress = Math.min(this.progress + delta, 90);\n      } else if (this.progress < 99) {\n        const delta = (100 - this.progress) * 0.0005 * (dt / 16);\n        this.progress = Math.min(this.progress + delta, 99);\n      }\n\n      this.progressEl.style.width = `${this.progress}%`;\n      this.raf = requestAnimationFrame(step);\n    };\n\n    this.raf = requestAnimationFrame(step);\n  }\n\n  _reset() {\n    this.progressEl.style.transition = \"none\";\n    this.progressEl.style.width = \"0%\";\n    this.progressEl.offsetHeight; // force reflow\n    this.progressEl.style.transition = \"\";\n    this.progress = 0;\n\n    this._clear();\n\n    this.state = State.IDLE;\n\n    cancelAnimationFrame(this.raf);\n  }\n\n  _hide(info) {\n    this.state = State.IDLE;\n    this._clear();\n\n    if (this.progress > 0) {\n      this.progress = 100;\n      this.progressEl.style.width = \"100%\";\n    }\n\n    setTimeout(() => {\n      this._reset();\n    }, 500);\n  }\n\n  _clear() {\n    if (this.delayTimer) {\n      clearTimeout(this.delayTimer);\n      this.delayTimer = null;\n    }\n  }\n\n  destroyed() {\n    window.removeEventListener(\"phx:page-loading-start\", this.#boundShow);\n    window.removeEventListener(\"phx:page-loading-stop\", this.#boundHide);\n  }\n}\n", "import { ViewHook } from \"phoenix_live_view\";\nimport {\n  computePosition,\n  offset,\n  flip,\n  shift,\n  autoUpdate,\n  arrow,\n} from \"@floating-ui/dom\";\n\nconst activeTooltips = new Set();\n\nexport default class Tooltip extends ViewHook {\n  placement = \"top\";\n  delay = 300;\n  hovering = false;\n  #clear_floating;\n\n  #enterBind;\n  #leaveBind;\n  #focusInBind;\n  #focusOutBind;\n  leaveTimeout = null;\n\n  mounted() {\n    this.trigger = this.el.querySelector(':scope > :not([role=\"tooltip\"])');\n    this.tooltip = this.el.querySelector(':scope > [role=\"tooltip\"]');\n    this.arrow = this.el.querySelector(\n      ':scope > [role=\"tooltip\"] > [data-arrow]',\n    );\n    // this attribute controlled on client side, prevent liveview patching this attr\n    this.js().ignoreAttributes(this.tooltip, [\"aria-*\", \"data-*\", \"style\"]);\n    this.trigger?.setAttribute(\"aria-describedby\", this.tooltip?.id || \"\");\n\n    this.placement = this.el.dataset.placement || this.placement;\n    this.delay = this.el.dataset.delay || this.delay;\n    this.#clear_floating = autoUpdate(this.trigger, this.tooltip, () => {\n      this._calculatePosition();\n    });\n\n    this.#enterBind = this._onMouseEnter.bind(this);\n    this.#leaveBind = this._onMouseLeave.bind(this);\n    this.#focusInBind = this._onFocusIn.bind(this);\n    this.#focusOutBind = this._onFocusOut.bind(this);\n\n    this.el?.addEventListener(\"mouseenter\", this.#enterBind);\n    this.el?.addEventListener(\"mouseleave\", this.#leaveBind);\n    this.el?.addEventListener(\"focusin\", this.#focusInBind);\n    this.el?.addEventListener(\"focusout\", this.#focusOutBind);\n  }\n\n  updated() {\n    this.setHidden(this.hovering ? false : true);\n\n    this._calculatePosition();\n  }\n\n  destroyed() {\n    activeTooltips.delete(this);\n\n    if (this.#clear_floating) {\n      this.#clear_floating();\n    }\n\n    this.el?.removeEventListener(\"mouseenter\", this.#enterBind);\n    this.el?.removeEventListener(\"mouseleave\", this.#leaveBind);\n    this.el?.removeEventListener(\"focusin\", this.#focusInBind);\n    this.el?.removeEventListener(\"focusout\", this.#focusOutBind);\n  }\n\n  setHidden(hidden) {\n    if (hidden) {\n      activeTooltips.delete(this);\n    } else {\n      activeTooltips.add(this);\n    }\n\n    requestAnimationFrame(() => {\n      this.tooltip?.setAttribute(\"aria-hidden\", hidden ? \"true\" : \"false\");\n    });\n  }\n\n  _onMouseEnter(e) {\n    this.hovering = true;\n    if (this.leaveTimeout) clearTimeout(this.leaveTimeout);\n    this.#dismissOthers();\n    this.setHidden(false);\n  }\n\n  _onMouseLeave(e) {\n    if (this.leaveTimeout) clearTimeout(this.leaveTimeout);\n    this.hovering = false;\n    this.leaveTimeout = setTimeout(() => {\n      this.setHidden(true);\n    }, this.delay);\n  }\n\n  _onFocusIn() {\n    this.hovering = true;\n    if (this.leaveTimeout) clearTimeout(this.leaveTimeout);\n    this.#dismissOthers();\n    this.setHidden(false);\n  }\n\n  _onFocusOut(event) {\n    const nextFocusedElement = event.relatedTarget;\n\n    if (nextFocusedElement && this.el?.contains(nextFocusedElement)) {\n      return;\n    }\n\n    if (this.leaveTimeout) clearTimeout(this.leaveTimeout);\n    this.hovering = false;\n    this.leaveTimeout = setTimeout(() => {\n      this.setHidden(true);\n    }, this.delay);\n  }\n\n  #dismissOthers() {\n    for (const tooltip of activeTooltips) {\n      if (tooltip !== this) {\n        tooltip.#dismiss();\n      }\n    }\n  }\n\n  #dismiss() {\n    if (this.leaveTimeout) clearTimeout(this.leaveTimeout);\n    this.hovering = false;\n    this.setHidden(true);\n  }\n\n  _calculatePosition(data) {\n    computePosition(this.trigger, this.tooltip, {\n      placement: this.placement,\n      strategy: \"fixed\",\n      middleware: [offset(8), flip(), shift(), arrow({ element: this.arrow })],\n    }).then(({ x, y, strategy, middlewareData, placement }) => {\n      Object.assign(this.tooltip.style, {\n        left: `${x}px`,\n        top: `${y}px`,\n        position: strategy,\n      });\n      if (middlewareData.arrow) {\n        const { x, y } = middlewareData.arrow;\n\n        const p = placement.split(\"-\").at(0) ?? null;\n        const arrowPlacement = {\n          top: \"bottom\",\n          left: \"right\",\n          right: \"left\",\n          bottom: \"top\",\n        };\n\n        const style = {\n          left: x != null ? `${x}px` : \"\",\n          top: y != null ? `${y}px` : \"\",\n        };\n\n        style[arrowPlacement[p]] = \"-4px\";\n\n        Object.assign(this.arrow.style, style);\n      }\n    });\n  }\n}\n", "import { ViewHook } from \"phoenix_live_view\";\n\nexport default class FlashGroup extends ViewHook {\n  max_flashes = 3;\n  flash_timeout = 5;\n  #timers = new Map();\n  #pausedTimers = new Map();\n\n  mounted() {\n    this._updateFlashList();\n    this.max_flashes = this.el.dataset.maxFlashes || this.max_flashes;\n    this.flash_timeout = this.el.dataset.flashTimeout || this.flash_timeout;\n\n    this.el.addEventListener(\n      \"mouseenter\",\n      this._onContainerMouseEnter.bind(this),\n    );\n    this.el.addEventListener(\n      \"mouseleave\",\n      this._onContainerMouseLeave.bind(this),\n    );\n  }\n\n  updated() {\n    this._updateFlashList();\n  }\n\n  destroyed() {\n    this.#timers.forEach((timerObj) => clearTimeout(timerObj.timer));\n    this.#timers.clear();\n\n    this.el.removeEventListener(\n      \"mouseenter\",\n      this._onContainerMouseEnter.bind(this),\n    );\n    this.el.removeEventListener(\n      \"mouseleave\",\n      this._onContainerMouseLeave.bind(this),\n    );\n  }\n\n  _onContainerMouseEnter() {\n    this._pauseAllTimers();\n  }\n\n  _onContainerMouseLeave() {\n    this._resumeAllTimers();\n  }\n\n  _onClose(event) {\n    const flash = event.currentTarget.closest('[role=\"alert\"]');\n\n    this._removeFlash(flash);\n  }\n\n  _removeFlash(flash) {\n    if (this.liveSocket?.isConnected()) {\n      this.pushEvent(\"lv:clear-flash\", { value: flash.dataset.flashId });\n    }\n\n    const flashId = flash.dataset.flashId;\n\n    // Clear timer if exists\n    if (this.#timers.has(flashId)) {\n      const timerObj = this.#timers.get(flashId);\n      clearTimeout(timerObj.timer);\n      this.#timers.delete(flashId);\n    }\n\n    flash.style.transition =\n      \"transform 100ms ease-in-out, opacity 100ms ease-in-out\";\n    flash.style.transform = \"scale(0.9)\";\n    flash.style.opacity = \"0\";\n\n    const animationEndHandler = () => {\n      flash.removeEventListener(\"transitionend\", animationEndHandler);\n      flash.remove();\n      this._updateFlashList();\n    };\n\n    flash.addEventListener(\"transitionend\", animationEndHandler);\n  }\n\n  _startTimerForFlash(flash) {\n    const flashId = flash.dataset.flashId;\n    let duration = parseInt(flash.dataset.duration);\n\n    if (duration === -1) {\n      return;\n    }\n\n    const flashTimeout =\n      (!isNaN(duration) ? duration : this.flash_timeout) * 1000;\n\n    if (this.#timers.has(flashId)) {\n      const existingTimer = this.#timers.get(flashId);\n      clearTimeout(existingTimer.timer);\n    }\n\n    const remainingTime = this.#pausedTimers.has(flashId)\n      ? this.#pausedTimers.get(flashId)\n      : flashTimeout;\n\n    const startTime = Date.now();\n\n    const timer = setTimeout(() => {\n      this._removeFlash(flash);\n    }, remainingTime);\n\n    this.#timers.set(flashId, { timer, startTime, timeout: flashTimeout });\n\n    if (this.#pausedTimers.has(flashId)) {\n      this.#pausedTimers.delete(flashId);\n    }\n  }\n\n  _pauseAllTimers() {\n    this.#timers.forEach((timerObj, flashId) => {\n      clearTimeout(timerObj.timer);\n\n      const elapsed = Date.now() - timerObj.startTime;\n      const remainingTime = Math.max(0, timerObj.timeout - elapsed);\n\n      this.#pausedTimers.set(flashId, remainingTime);\n    });\n\n    this.#timers.clear();\n  }\n\n  _resumeAllTimers() {\n    this.#pausedTimers.forEach((remainingTime, flashId) => {\n      const flash = this.el.querySelector(`[data-flash-id=\"${flashId}\"]`);\n      if (flash) {\n        const duration = parseInt(flash.dataset.duration);\n\n        if (duration !== -1) {\n          const flashTimeout =\n            (!isNaN(duration) ? duration : this.flash_timeout) * 1000;\n          const startTime = Date.now();\n          const timer = setTimeout(() => {\n            this._removeFlash(flash);\n          }, remainingTime);\n\n          this.#timers.set(flashId, {\n            timer,\n            startTime,\n            timeout: flashTimeout,\n          });\n        }\n      }\n    });\n\n    this.#pausedTimers.clear();\n  }\n\n  _updateFlashList() {\n    this.flash = this.el.querySelectorAll('[role=\"alert\"]');\n    const position = this.el.dataset.position;\n\n    this.flash.forEach((flash, index) => {\n      flash.dataset.index = index;\n      flash.dataset.position = position;\n      flash.style.setProperty(\"--flash-index\", index);\n\n      if (flash.phxPrivate?.[\"JS:ignore_attrs\"] == null) {\n        this.js().ignoreAttributes(flash, [\"aria-*\", \"data-visible\", \"style\"]);\n      }\n\n      if (index === 0 && flash.dataset.visible !== \"true\") {\n        flash.setAttribute(\"aria-hidden\", \"true\");\n        flash.style.transition = \"none\";\n        flash.style.setProperty(\n          \"--flash-offset-y\",\n          position.startsWith(\"bottom-\") ? \"200%\" : \"-200%\",\n        );\n      }\n      flash.dataset.visible = \"true\";\n\n      const height = flash.offsetHeight;\n\n      const offsetY = Array.from(this.flash)\n        .slice(0, index)\n        .reduce((acc, item) => acc + item.offsetHeight + 10, 0);\n\n      flash.style.setProperty(\"--flash-height\", `${height}px`);\n\n      flash.setAttribute(\"aria-hidden\", \"false\");\n      requestAnimationFrame(() => {\n        flash.style.transition = \"\";\n        flash.style.setProperty(\n          \"--flash-offset-y\",\n          position.startsWith(\"bottom-\") ? `${-offsetY}px` : `${offsetY}px`,\n        );\n      });\n\n      // Flash close button\n      const closeButton = flash.querySelector(\"button[data-close]\");\n      if (closeButton?.dataset.close == \"\") {\n        closeButton?.addEventListener(\"click\", this._onClose.bind(this));\n        closeButton.dataset.close = \"true\";\n      }\n\n      const flashId = flash.dataset.flashId;\n      if (!this.#timers.has(flashId)) {\n        this._startTimerForFlash(flash);\n      }\n    });\n  }\n}\n", "import { ViewHook } from \"phoenix_live_view\";\n\nexport default class Tabs extends ViewHook {\n  #clickHandler;\n  #keyDownHandler;\n  #focusHandler;\n\n  mounted() {\n    this.cacheElements();\n    this.bindEventListeners();\n    this.syncFromRootDataset();\n  }\n\n  updated() {\n    const previousTabs = this.tabs;\n    this.cacheElements();\n    this.rebindEventListeners(previousTabs);\n    this.syncFromRootDataset();\n  }\n\n  destroyed() {\n    this.unbindEventListeners(this.tabs);\n  }\n\n  cacheElements() {\n    this.tabs = Array.from(this.el.querySelectorAll(\"[role='tab']\"));\n    this.panels = Array.from(this.el.querySelectorAll(\"[role='tabpanel']\"));\n    this.orientation = this.el.dataset.orientation || \"horizontal\";\n    this.activationMode = this.el.dataset.activationMode || \"automatic\";\n    this.clientControlled = this.el.dataset.clientControlled !== \"false\";\n  }\n\n  bindEventListeners() {\n    this.#clickHandler = this.handleClick.bind(this);\n    this.#keyDownHandler = this.handleKeyDown.bind(this);\n    this.#focusHandler = this.handleFocus.bind(this);\n\n    this.tabs.forEach((tab) => {\n      tab.addEventListener(\"click\", this.#clickHandler);\n      tab.addEventListener(\"keydown\", this.#keyDownHandler);\n      tab.addEventListener(\"focus\", this.#focusHandler);\n    });\n  }\n\n  unbindEventListeners(tabs) {\n    tabs?.forEach((tab) => {\n      tab.removeEventListener(\"click\", this.#clickHandler);\n      tab.removeEventListener(\"keydown\", this.#keyDownHandler);\n      tab.removeEventListener(\"focus\", this.#focusHandler);\n    });\n  }\n\n  rebindEventListeners(previousTabs) {\n    if (\n      previousTabs &&\n      previousTabs.length === this.tabs.length &&\n      previousTabs.every((tab, index) => tab === this.tabs[index])\n    ) {\n      return;\n    }\n\n    this.unbindEventListeners(previousTabs);\n    this.bindEventListeners();\n  }\n\n  handleClick(event) {\n    const tab = event.currentTarget;\n\n    if (!this.clientControlled || this.isDisabled(tab)) {\n      return;\n    }\n\n    this.activateTab(tab, { focus: false });\n  }\n\n  handleFocus(event) {\n    if (!this.clientControlled || this.activationMode !== \"automatic\") {\n      return;\n    }\n\n    const tab = event.currentTarget;\n\n    if (this.isDisabled(tab)) {\n      return;\n    }\n\n    this.activateTab(tab, { focus: false });\n  }\n\n  handleKeyDown(event) {\n    const currentTab = event.currentTarget;\n    const enabledTabs = this.enabledTabs();\n\n    if (enabledTabs.length === 0) {\n      return;\n    }\n\n    switch (event.key) {\n      case \"ArrowRight\":\n        if (this.orientation !== \"horizontal\") return;\n        event.preventDefault();\n        this.moveFocus(currentTab, enabledTabs, 1);\n        break;\n      case \"ArrowLeft\":\n        if (this.orientation !== \"horizontal\") return;\n        event.preventDefault();\n        this.moveFocus(currentTab, enabledTabs, -1);\n        break;\n      case \"ArrowDown\":\n        if (this.orientation !== \"vertical\") return;\n        event.preventDefault();\n        this.moveFocus(currentTab, enabledTabs, 1);\n        break;\n      case \"ArrowUp\":\n        if (this.orientation !== \"vertical\") return;\n        event.preventDefault();\n        this.moveFocus(currentTab, enabledTabs, -1);\n        break;\n      case \"Home\":\n        event.preventDefault();\n        this.focusTab(enabledTabs[0]);\n        break;\n      case \"End\":\n        event.preventDefault();\n        this.focusTab(enabledTabs[enabledTabs.length - 1]);\n        break;\n      case \"Enter\":\n      case \" \":\n        if (!this.clientControlled) return;\n        event.preventDefault();\n        this.activateTab(currentTab);\n        break;\n    }\n  }\n\n  moveFocus(currentTab, enabledTabs, delta) {\n    const currentIndex = enabledTabs.findIndex((tab) => tab === currentTab);\n    const nextIndex = (currentIndex + delta + enabledTabs.length) % enabledTabs.length;\n    this.focusTab(enabledTabs[nextIndex]);\n  }\n\n  focusTab(tab) {\n    if (!tab) {\n      return;\n    }\n\n    tab.focus();\n\n    if (this.clientControlled && this.activationMode === \"automatic\") {\n      this.activateTab(tab, { focus: false });\n    }\n  }\n\n  activateTab(tab, options = {}) {\n    const value = tab?.dataset.value;\n\n    if (!value) {\n      return;\n    }\n\n    this.el.dataset.value = value;\n\n    this.tabs.forEach((item) => {\n      const selected = item === tab;\n      item.setAttribute(\"aria-selected\", String(selected));\n      item.setAttribute(\"data-state\", selected ? \"active\" : \"inactive\");\n      item.setAttribute(\"tabindex\", selected ? \"0\" : \"-1\");\n    });\n\n    this.panels.forEach((panel) => {\n      const selected = panel.dataset.value === value;\n      panel.setAttribute(\"data-state\", selected ? \"active\" : \"inactive\");\n      panel.hidden = !selected;\n    });\n\n    if (options.focus !== false) {\n      tab.focus();\n    }\n  }\n\n  syncFromRootDataset() {\n    const value =\n      this.el.dataset.value ||\n      this.el.dataset.defaultValue ||\n      this.enabledTabs()[0]?.dataset.value;\n\n    const activeTab = this.tabs.find((tab) => tab.dataset.value === value) || this.enabledTabs()[0];\n\n    if (activeTab) {\n      this.activateTab(activeTab, { focus: false });\n      return;\n    }\n\n    this.tabs.forEach((tab) => {\n      tab.setAttribute(\"aria-selected\", \"false\");\n      tab.setAttribute(\"data-state\", \"inactive\");\n      tab.setAttribute(\"tabindex\", \"-1\");\n    });\n\n    this.panels.forEach((panel) => {\n      panel.setAttribute(\"data-state\", \"inactive\");\n      panel.hidden = true;\n    });\n  }\n\n  enabledTabs() {\n    return this.tabs.filter((tab) => !this.isDisabled(tab));\n  }\n\n  isDisabled(tab) {\n    return tab?.disabled || tab?.dataset.disabled === \"true\";\n  }\n}\n", "const Sidebar = {\n  mounted() {\n    if (this.el.dataset.shell) {\n      this.initShell();\n    } else if (this.el.dataset.target) {\n      this.initMenuItem();\n    } else {\n      this.initShell();\n    }\n  },\n\n  updated() {\n    if (this.el.dataset.shell) {\n      this.syncShell(this.collapsed ?? this.shell?.dataset.collapsed === \"true\");\n    } else if (this.el.dataset.target) {\n      this.syncMenuItem(this.el.dataset.expanded !== \"false\");\n    } else {\n      this.syncShell(this.collapsed ?? this.el.dataset.collapsed === \"true\");\n    }\n  },\n\n  destroyed() {\n    if (this.trigger && this.onClick) {\n      this.trigger.removeEventListener(\"click\", this.onClick);\n    }\n\n    if (this.toggleButton && this.onToggleClick) {\n      this.toggleButton.removeEventListener(\"click\", this.onToggleClick);\n    }\n\n  },\n\n  initMenuItem() {\n    this.targetId = this.el.dataset.target;\n    this.trigger = this.el.querySelector(\"button\");\n    this.chevron = this.el.querySelector(\".sidebar-collapsible-chevron\");\n    this.onClick = () => this.toggleMenuItem();\n    this.syncMenuItem(this.el.dataset.expanded !== \"false\");\n\n    if (this.trigger) this.trigger.addEventListener(\"click\", this.onClick);\n  },\n\n  initShell() {\n    this.shell = this.el.dataset.shell ? document.getElementById(this.el.dataset.shell) : this.el;\n    this.toggleButton = this.shell\n      ? document.getElementById(`${this.shell.id}-sidebar-collapse-toggle`)\n      : null;\n    this.onToggleClick = () => this.toggleShell();\n\n    if (this.shell) {\n      this.js().ignoreAttributes(this.shell, [\"data-collapsed\"]);\n    }\n\n    this.syncShell(this.readShellState());\n\n    if (this.toggleButton) {\n      this.toggleButton.addEventListener(\"click\", this.onToggleClick);\n    }\n  },\n\n  toggleMenuItem() {\n    const expanded = this.el.dataset.expanded !== \"false\";\n    this.syncMenuItem(!expanded);\n  },\n\n  toggleShell() {\n    const collapsed = this.shell?.dataset.collapsed === \"true\";\n\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        this.syncShell(!collapsed, { emit: true });\n      });\n    });\n  },\n\n  syncMenuItem(expanded) {\n    const value = expanded ? \"true\" : \"false\";\n    const target = this.targetId ? document.getElementById(this.targetId) : null;\n\n    this.el.dataset.expanded = value;\n    if (this.trigger) this.trigger.setAttribute(\"aria-expanded\", value);\n    if (this.chevron) this.chevron.dataset.expanded = value;\n\n    if (target) {\n      target.dataset.expanded = value;\n      target.setAttribute(\"aria-hidden\", expanded ? \"false\" : \"true\");\n    }\n  },\n\n  syncShell(collapsed, options = {}) {\n    if (!this.shell) return;\n\n    this.collapsed = collapsed;\n    this.shell.dataset.collapsed = collapsed ? \"true\" : \"false\";\n\n    if (options.emit) {\n      this.shell.dispatchEvent(\n        new CustomEvent(\"pui:sidebar-collapsed\", {\n          bubbles: true,\n          detail: { collapsed },\n        })\n      );\n    }\n  },\n\n  readShellState() {\n    if (!this.shell) return false;\n\n    return this.shell.dataset.collapsed === \"true\";\n  },\n};\n\nexport default Sidebar;\n", "import { ViewHook } from \"phoenix_live_view\";\nimport { computePosition, flip, offset, shift } from \"@floating-ui/dom\";\nimport uPlot from \"uplot\";\n\nconst DEFAULT_HEIGHT = 320;\nconst DEFAULT_PALETTE = [\n  \"--chart-1\",\n  \"--chart-2\",\n  \"--chart-3\",\n  \"--chart-4\",\n  \"--chart-5\",\n];\n\nconst DEFAULT_BAR_SIZE = [0.72, 64];\nconst SERIES_META_KEYS = new Set([\n  \"color\",\n  \"curve\",\n  \"data\",\n  \"format\",\n  \"name\",\n  \"prefix\",\n  \"precision\",\n  \"suffix\",\n  \"value_format\",\n]);\n\nfunction isPlainObject(value) {\n  return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction mergeDeep(...values) {\n  return values.reduce((acc, value) => mergePair(acc, value), {});\n}\n\nfunction mergePair(left, right) {\n  if (!isPlainObject(left)) {\n    return cloneValue(right);\n  }\n\n  if (!isPlainObject(right)) {\n    return cloneValue(right == null ? left : right);\n  }\n\n  const merged = { ...left };\n\n  Object.entries(right).forEach(([key, value]) => {\n    if (isPlainObject(value) && isPlainObject(merged[key])) {\n      merged[key] = mergePair(merged[key], value);\n      return;\n    }\n\n    merged[key] = cloneValue(value);\n  });\n\n  return merged;\n}\n\nfunction cloneValue(value) {\n  if (Array.isArray(value)) {\n    return value.map((entry) => cloneValue(entry));\n  }\n\n  if (isPlainObject(value)) {\n    return Object.fromEntries(\n      Object.entries(value).map(([key, entry]) => [key, cloneValue(entry)]),\n    );\n  }\n\n  return value;\n}\n\nfunction stripSeriesMeta(series) {\n  return Object.fromEntries(\n    Object.entries(series || {}).filter(([key]) => !SERIES_META_KEYS.has(key)),\n  );\n}\n\nfunction toArray(value) {\n  return Array.isArray(value) ? value : [];\n}\n\nfunction toSecondsTimestamp(value) {\n  if (typeof value !== \"number\") {\n    return value;\n  }\n\n  return value > 1_000_000_000_000 ? value : value * 1000;\n}\n\nexport class ChartHook extends ViewHook {\n  uPlot = uPlot;\n  chart = null;\n  data = [];\n  opts = {};\n  payload = {};\n  colorResolutionCache = new Map();\n  root = null;\n  tooltip = null;\n  resizeObserver = null;\n  size = { width: 0, height: 0 };\n  structureSignature = null;\n  dataSignature = null;\n\n  mounted() {\n    this.cacheElements();\n    this.connectResizeObserver();\n    this.renderChart(true);\n  }\n\n  updated() {\n    this.cacheElements();\n    this.renderChart();\n  }\n\n  destroyed() {\n    this.hideTooltip();\n    this.resizeObserver?.disconnect();\n    this.resizeObserver = null;\n    this.destroyChart();\n  }\n\n  cacheElements() {\n    this.root = this.el.querySelector(\"[data-chart-root]\");\n    this.tooltip = this.el.querySelector(\"[data-chart-tooltip]\");\n  }\n\n  connectResizeObserver() {\n    this.resizeObserver?.disconnect();\n\n    if (!this.root) {\n      return;\n    }\n\n    this.resizeObserver = new ResizeObserver(() => {\n      if (!this.chart) {\n        return;\n      }\n\n      const nextSize = this.measureSize(this.payload);\n\n      if (\n        nextSize.width === this.size.width &&\n        nextSize.height === this.size.height\n      ) {\n        return;\n      }\n\n      this.size = nextSize;\n      this.chart.setSize(nextSize);\n      this.updateTooltipPosition(this.chart);\n    });\n\n    this.resizeObserver.observe(this.root);\n  }\n\n  readPayload() {\n    try {\n      return JSON.parse(this.el.dataset.chartConfig || \"{}\");\n    } catch (_error) {\n      return {};\n    }\n  }\n\n  inferPreset(rawPayload) {\n    if (rawPayload?.preset) {\n      return rawPayload.preset;\n    }\n\n    const inferred = this.constructor.name\n      .replace(/Hook$/, \"\")\n      .replace(/Chart$/, \"\")\n      .toLowerCase();\n\n    return inferred === \"chart\" ? null : inferred;\n  }\n\n  normalizePayload(rawPayload) {\n    const payload = rawPayload || {};\n\n    return {\n      ...payload,\n      preset: this.inferPreset(payload),\n      data: toArray(payload.data),\n      series: toArray(payload.series),\n      options: isPlainObject(payload.options) ? payload.options : {},\n      tooltip: mergeDeep({ show: true }, payload.tooltip || {}),\n      legend: mergeDeep({ show: false }, payload.legend || {}),\n      grid: payload.grid !== false,\n      height: payload.height || DEFAULT_HEIGHT,\n    };\n  }\n\n  measureSize(payload) {\n    const width = Math.max(\n      Math.round(this.root?.clientWidth || this.el.clientWidth || 0),\n      240,\n    );\n\n    return {\n      width,\n      height: payload.height || DEFAULT_HEIGHT,\n    };\n  }\n\n  renderChart(force = false) {\n    if (!this.root) {\n      return;\n    }\n\n    const payload = this.normalizePayload(this.readPayload());\n    const size = this.measureSize(payload);\n    const structureSignature = JSON.stringify({\n      ...payload,\n      data: undefined,\n      width: size.width,\n      height: size.height,\n    });\n    const dataSignature = JSON.stringify(payload.data);\n\n    this.payload = payload;\n    this.size = size;\n\n    if (\n      !this.chart ||\n      force ||\n      structureSignature !== this.structureSignature\n    ) {\n      this.rebuildChart(payload, size);\n      this.structureSignature = structureSignature;\n      this.dataSignature = dataSignature;\n      return;\n    }\n\n    const nextData = this.buildData(payload);\n    const nextOpts = this.buildOptions(payload, size);\n\n    this.data = nextData;\n    this.opts = nextOpts;\n\n    if (dataSignature !== this.dataSignature) {\n      this.chart.setData(nextData, payload.reset_scales !== false);\n      this.dataSignature = dataSignature;\n    }\n\n    if (size.width !== this.chart.width || size.height !== this.chart.height) {\n      this.chart.setSize(size);\n    }\n  }\n\n  rebuildChart(payload, size) {\n    this.destroyChart();\n    this.data = this.buildData(payload);\n    this.opts = this.buildOptions(payload, size);\n    this.chart = new this.uPlot(this.opts, this.data, this.root);\n    this.hideTooltip();\n  }\n\n  destroyChart() {\n    if (!this.chart) {\n      return;\n    }\n\n    this.chart.destroy();\n    this.chart = null;\n  }\n\n  buildData(payload) {\n    return toArray(payload.data);\n  }\n\n  buildOptions(payload, size) {\n    const preset = payload.preset;\n\n    const defaults = {\n      width: size.width,\n      height: size.height,\n      padding: [10, 8, 6, 0],\n      focus: { alpha: 0.3 },\n      legend: {\n        show: payload.legend?.show === true,\n        live: payload.legend?.live ?? true,\n      },\n      cursor: {\n        y: false,\n        x: true,\n        focus: { prox: 24 },\n        points: { show: false },\n      },\n      select: { show: false },\n      axes: this.buildAxes(payload),\n      scales: this.buildScales(payload),\n      series: [{}, ...this.buildSeries(payload, preset)],\n    };\n\n    const options = mergeDeep(defaults, payload.options);\n    options.width = size.width;\n    options.height = size.height;\n    options.hooks = this.mergeHooks(options.hooks, this.buildHooks(payload));\n\n    return this.resolveColors(options);\n  }\n\n  buildScales(payload) {\n    const xLength = toArray(payload.data[0]).length;\n\n    if (payload.preset === \"bar\") {\n      return {\n        x: { time: false, range: [-0.5, Math.max(xLength - 0.5, 0.5)] },\n        y: { auto: true },\n      };\n    }\n\n    if (payload.time) {\n      return {\n        x: { time: true },\n        y: { auto: true },\n      };\n    }\n\n    return {\n      x: { time: false },\n      y: { auto: true },\n    };\n  }\n\n  buildAxes(payload) {\n    const font = this.axisFont();\n    const axisColor = this.resolveCssValue(\"var(--chart-axis-color)\");\n    const gridColor = this.resolveCssValue(\"var(--chart-grid-color)\");\n    const baseX = {\n      ticks: { show: false },\n      border: { show: false },\n      grid: { show: false },\n      gap: 6,\n      size: 28,\n      font,\n      stroke: axisColor,\n    };\n    const baseY = {\n      ticks: { show: false },\n      border: { show: false },\n      grid: { show: payload.grid, stroke: gridColor, width: 0.5 },\n      gap: 6,\n      size: 52,\n      font,\n      stroke: axisColor,\n      values: (_self, values) =>\n        values.map((value) => this.formatNumericValue(value, payload.y_axis)),\n    };\n\n    if (payload.time) {\n      return [baseX, baseY];\n    }\n\n    if (Array.isArray(payload.categories) && payload.categories.length > 0) {\n      return [\n        {\n          ...baseX,\n          values: (_self, values) =>\n            values.map((value) => this.lookupLabel(payload.categories, value)),\n        },\n        baseY,\n      ];\n    }\n\n    if (Array.isArray(payload.labels) && payload.labels.length > 0) {\n      return [\n        {\n          ...baseX,\n          values: (_self, values) =>\n            values.map((value) => this.lookupLabel(payload.labels, value)),\n        },\n        baseY,\n      ];\n    }\n\n    return [baseX, baseY];\n  }\n\n  buildSeries(payload, preset) {\n    return payload.series.map((series, index) => {\n      const stroke = this.resolveCssValue(\n        series.color || series.stroke || this.paletteColor(index),\n      );\n      const shared = {\n        label: series.label || series.name || `Series ${index + 1}`,\n        stroke,\n        width: series.width ?? (preset === \"bar\" ? 0 : 2),\n        points: mergeDeep({ show: false }, series.points || {}),\n      };\n      const nextSeries = mergeDeep(shared, stripSeriesMeta(series));\n\n      if (preset === \"bar\") {\n        nextSeries.fill = this.resolveCssValue(series.fill || stroke);\n        nextSeries.paths = this.uPlot.paths.bars({\n          size: payload.bar?.size || DEFAULT_BAR_SIZE,\n          radius: payload.bar?.radius ?? 0.1,\n        });\n      }\n\n      if (preset === \"line\") {\n        if (payload.area || series.area) {\n          nextSeries.fill = this.resolveCssValue(\n            series.fill || this.withAlpha(stroke, 0.18),\n          );\n        }\n\n        nextSeries.paths = this.resolveLinePath(series, payload);\n      }\n\n      return nextSeries;\n    });\n  }\n\n  resolveLinePath(series, payload) {\n    const curve = series.curve || payload.curve || \"linear\";\n\n    switch (curve) {\n      case \"stepped\":\n        return this.uPlot.paths.stepped({ align: 1 });\n      case \"spline\":\n        return this.uPlot.paths.spline();\n      default:\n        return this.uPlot.paths.linear();\n    }\n  }\n\n  buildHooks(payload) {\n    return {\n      setCursor: [\n        (chart) => {\n          if (!payload.tooltip?.show) {\n            return;\n          }\n\n          this.updateTooltipPosition(chart);\n        },\n      ],\n      setSeries: [\n        () => {\n          this.hideTooltip();\n        },\n      ],\n      destroy: [\n        () => {\n          this.hideTooltip();\n        },\n      ],\n    };\n  }\n\n  mergeHooks(existingHooks = {}, additionalHooks = {}) {\n    const keys = new Set([\n      ...Object.keys(existingHooks || {}),\n      ...Object.keys(additionalHooks || {}),\n    ]);\n\n    return Array.from(keys).reduce((hooks, key) => {\n      hooks[key] = [\n        ...toArray(existingHooks?.[key]),\n        ...toArray(additionalHooks?.[key]),\n      ];\n\n      return hooks;\n    }, {});\n  }\n\n  updateTooltipPosition(chart) {\n    if (!this.tooltip) {\n      return;\n    }\n\n    const idx = chart?.cursor?.idx;\n    const left = chart?.cursor?.left;\n    const top = chart?.cursor?.top;\n\n    if (idx == null || left == null || top == null || left < 0 || top < 0) {\n      this.hideTooltip();\n      return;\n    }\n\n    const rows = this.tooltipRows(chart, idx);\n\n    if (rows.length === 0) {\n      this.hideTooltip();\n      return;\n    }\n\n    this.renderTooltipContent(chart, idx, rows);\n\n    const rect = chart.over.getBoundingClientRect();\n    const x = rect.left + left;\n    const y = rect.top + top;\n    const virtualElement = {\n      getBoundingClientRect: () => new DOMRect(x, y, 0, 0),\n    };\n\n    this.tooltip.classList.remove(\"hidden\");\n\n    computePosition(virtualElement, this.tooltip, {\n      strategy: \"fixed\",\n      placement: \"top-start\",\n      middleware: [offset(14), flip(), shift({ padding: 12 })],\n    }).then(({ x: tooltipX, y: tooltipY }) => {\n      Object.assign(this.tooltip.style, {\n        left: `${tooltipX}px`,\n        top: `${tooltipY}px`,\n      });\n    });\n  }\n\n  tooltipRows(chart, idx) {\n    return chart.series\n      .slice(1)\n      .map((series, offset) => {\n        const value = chart.data[offset + 1]?.[idx];\n\n        if (value == null || series.show === false) {\n          return null;\n        }\n\n        const config = this.payload.series[offset] || {};\n        const color = this.resolveCssValue(\n          config.color || config.stroke || this.paletteColor(offset),\n        );\n\n        return {\n          label: series.label,\n          color,\n          value: this.formatSeriesValue(value, config),\n        };\n      })\n      .filter(Boolean);\n  }\n\n  renderTooltipContent(chart, idx, rows) {\n    if (!this.tooltip) {\n      return;\n    }\n\n    const title = document.createElement(\"div\");\n    title.className = \"pui-chart-tooltip__title\";\n    title.textContent = this.tooltipTitle(chart, idx);\n\n    const list = document.createElement(\"div\");\n    list.className = \"pui-chart-tooltip__list\";\n\n    rows.forEach((row) => {\n      const item = document.createElement(\"div\");\n      item.className = \"pui-chart-tooltip__row\";\n\n      const label = document.createElement(\"div\");\n      label.className = \"pui-chart-tooltip__label\";\n\n      const marker = document.createElement(\"span\");\n      marker.className = \"pui-chart-tooltip__marker\";\n      marker.style.backgroundColor = row.color;\n\n      const text = document.createElement(\"span\");\n      text.textContent = row.label;\n\n      const value = document.createElement(\"span\");\n      value.className = \"pui-chart-tooltip__value\";\n      value.textContent = row.value;\n\n      label.append(marker, text);\n      item.append(label, value);\n      list.append(item);\n    });\n\n    this.tooltip.replaceChildren(title, list);\n  }\n\n  tooltipTitle(chart, idx) {\n    if (this.payload.tooltip?.title) {\n      return this.payload.tooltip.title;\n    }\n\n    const xValue = chart.data[0]?.[idx];\n\n    if (\n      Array.isArray(this.payload.categories) &&\n      this.payload.categories[idx] != null\n    ) {\n      return `${this.payload.categories[idx]}`;\n    }\n\n    if (\n      Array.isArray(this.payload.labels) &&\n      this.payload.labels[idx] != null\n    ) {\n      return `${this.payload.labels[idx]}`;\n    }\n\n    if (this.payload.time) {\n      const formatter = new Intl.DateTimeFormat(undefined, {\n        month: \"short\",\n        day: \"numeric\",\n        hour: \"2-digit\",\n        minute: \"2-digit\",\n      });\n\n      return formatter.format(new Date(toSecondsTimestamp(xValue)));\n    }\n\n    return `${xValue}`;\n  }\n\n  formatSeriesValue(value, series) {\n    const number = this.formatNumericValue(value, series);\n    const prefix = series.prefix || \"\";\n    const suffix = series.suffix || \"\";\n    return `${prefix}${number}${suffix}`;\n  }\n\n  formatNumericValue(value, config = {}) {\n    if (typeof value !== \"number\") {\n      return `${value}`;\n    }\n\n    if (Number.isInteger(value) && config.precision == null) {\n      return new Intl.NumberFormat(undefined).format(value);\n    }\n\n    const maximumFractionDigits =\n      config.precision != null ? config.precision : value % 1 === 0 ? 0 : 2;\n\n    return new Intl.NumberFormat(undefined, {\n      maximumFractionDigits,\n    }).format(value);\n  }\n\n  lookupLabel(labels, value) {\n    const index = Math.round(value);\n    return index >= 0 && index < labels.length ? `${labels[index]}` : \"\";\n  }\n\n  hideTooltip() {\n    if (!this.tooltip) {\n      return;\n    }\n\n    this.tooltip.classList.add(\"hidden\");\n    this.tooltip.replaceChildren();\n  }\n\n  axisFont() {\n    const fontFamily =\n      getComputedStyle(this.el).getPropertyValue(\"--font-sans\").trim() ||\n      \"system-ui, sans-serif\";\n\n    return `12px ${fontFamily}`;\n  }\n\n  paletteColor(index) {\n    return `var(${DEFAULT_PALETTE[index % DEFAULT_PALETTE.length]})`;\n  }\n\n  resolveCssValue(value) {\n    if (typeof value !== \"string\") {\n      return value;\n    }\n\n    const match = value.trim().match(/^var\\((--[^)]+)\\)$/);\n    const resolved = match\n      ? getComputedStyle(this.el).getPropertyValue(match[1]).trim() || value\n      : value;\n\n    return this.resolveCanvasColor(resolved);\n  }\n\n  resolveCanvasColor(value) {\n    if (!this.isColorLikeValue(value)) {\n      return value;\n    }\n\n    const trimmed = value.trim();\n    const cached = this.colorResolutionCache.get(trimmed);\n\n    if (cached) {\n      return cached;\n    }\n\n    const probe = document.createElement(\"span\");\n    probe.style.color = trimmed;\n    probe.style.position = \"absolute\";\n    probe.style.visibility = \"hidden\";\n    probe.style.pointerEvents = \"none\";\n\n    this.el.appendChild(probe);\n    const resolved = getComputedStyle(probe).color || trimmed;\n    probe.remove();\n\n    this.colorResolutionCache.set(trimmed, resolved);\n\n    return resolved;\n  }\n\n  withAlpha(color, alpha) {\n    const resolved = this.resolveCanvasColor(color);\n    const match = resolved.match(/^rgba?\\(([^)]+)\\)$/i);\n\n    if (!match) {\n      return resolved;\n    }\n\n    const [red, green, blue] = match[1]\n      .split(\",\")\n      .slice(0, 3)\n      .map((channel) => channel.trim());\n\n    return `rgba(${red}, ${green}, ${blue}, ${alpha})`;\n  }\n\n  isColorLikeValue(value) {\n    if (typeof value !== \"string\") {\n      return false;\n    }\n\n    const trimmed = value.trim();\n\n    return (\n      /^#(?:[\\da-f]{3,8})$/i.test(trimmed) ||\n      /^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix)\\(/i.test(\n        trimmed,\n      )\n    );\n  }\n\n  resolveColors(value) {\n    if (Array.isArray(value)) {\n      return value.map((entry) => this.resolveColors(entry));\n    }\n\n    if (isPlainObject(value)) {\n      return Object.fromEntries(\n        Object.entries(value).map(([key, entry]) => [\n          key,\n          this.resolveColors(entry),\n        ]),\n      );\n    }\n\n    return this.resolveCssValue(value);\n  }\n}\n\nexport default ChartHook;\n", "/**\n* Copyright (c) 2025, Leon Sorokin\n* All rights reserved. (MIT Licensed)\n*\n* uPlot.js (\u03BCPlot)\n* A small, fast chart for time series, lines, areas, ohlc & bars\n* https://github.com/leeoniya/uPlot (v1.6.32)\n*/\n\nconst FEAT_TIME          = true;\n\nconst pre = \"u-\";\n\nconst UPLOT          =       \"uplot\";\nconst ORI_HZ         = pre + \"hz\";\nconst ORI_VT         = pre + \"vt\";\nconst TITLE          = pre + \"title\";\nconst WRAP           = pre + \"wrap\";\nconst UNDER          = pre + \"under\";\nconst OVER           = pre + \"over\";\nconst AXIS           = pre + \"axis\";\nconst OFF            = pre + \"off\";\nconst SELECT         = pre + \"select\";\nconst CURSOR_X       = pre + \"cursor-x\";\nconst CURSOR_Y       = pre + \"cursor-y\";\nconst CURSOR_PT      = pre + \"cursor-pt\";\nconst LEGEND         = pre + \"legend\";\nconst LEGEND_LIVE    = pre + \"live\";\nconst LEGEND_INLINE  = pre + \"inline\";\nconst LEGEND_SERIES  = pre + \"series\";\nconst LEGEND_MARKER  = pre + \"marker\";\nconst LEGEND_LABEL   = pre + \"label\";\nconst LEGEND_VALUE   = pre + \"value\";\n\nconst WIDTH       = \"width\";\nconst HEIGHT      = \"height\";\nconst TOP         = \"top\";\nconst BOTTOM      = \"bottom\";\nconst LEFT        = \"left\";\nconst RIGHT       = \"right\";\nconst hexBlack    = \"#000\";\nconst transparent = hexBlack + \"0\";\n\nconst mousemove   = \"mousemove\";\nconst mousedown   = \"mousedown\";\nconst mouseup     = \"mouseup\";\nconst mouseenter  = \"mouseenter\";\nconst mouseleave  = \"mouseleave\";\nconst dblclick    = \"dblclick\";\nconst resize      = \"resize\";\nconst scroll      = \"scroll\";\n\nconst change      = \"change\";\nconst dppxchange  = \"dppxchange\";\n\nconst LEGEND_DISP = \"--\";\n\nconst domEnv = typeof window != 'undefined';\n\nconst doc = domEnv ? document  : null;\nconst win = domEnv ? window    : null;\nconst nav = domEnv ? navigator : null;\n\nlet pxRatio;\n\n//export const canHover = domEnv && !win.matchMedia('(hover: none)').matches;\n\nlet query;\n\nfunction setPxRatio() {\n\tlet _pxRatio = devicePixelRatio;\n\n\t// during print preview, Chrome fires off these dppx queries even without changes\n\tif (pxRatio != _pxRatio) {\n\t\tpxRatio = _pxRatio;\n\n\t\tquery && off(change, query, setPxRatio);\n\t\tquery = matchMedia(`(min-resolution: ${pxRatio - 0.001}dppx) and (max-resolution: ${pxRatio + 0.001}dppx)`);\n\t\ton(change, query, setPxRatio);\n\n\t\twin.dispatchEvent(new CustomEvent(dppxchange));\n\t}\n}\n\nfunction addClass(el, c) {\n\tif (c != null) {\n\t\tlet cl = el.classList;\n\t\t!cl.contains(c) && cl.add(c);\n\t}\n}\n\nfunction remClass(el, c) {\n\tlet cl = el.classList;\n\tcl.contains(c) && cl.remove(c);\n}\n\nfunction setStylePx(el, name, value) {\n\tel.style[name] = value + \"px\";\n}\n\nfunction placeTag(tag, cls, targ, refEl) {\n\tlet el = doc.createElement(tag);\n\n\tif (cls != null)\n\t\taddClass(el, cls);\n\n\tif (targ != null)\n\t\ttarg.insertBefore(el, refEl);\n\n\treturn el;\n}\n\nfunction placeDiv(cls, targ) {\n\treturn placeTag(\"div\", cls, targ);\n}\n\nconst xformCache = new WeakMap();\n\nfunction elTrans(el, xPos, yPos, xMax, yMax) {\n\tlet xform = \"translate(\" + xPos + \"px,\" + yPos + \"px)\";\n\tlet xformOld = xformCache.get(el);\n\n\tif (xform != xformOld) {\n\t\tel.style.transform = xform;\n\t\txformCache.set(el, xform);\n\n\t\tif (xPos < 0 || yPos < 0 || xPos > xMax || yPos > yMax)\n\t\t\taddClass(el, OFF);\n\t\telse\n\t\t\tremClass(el, OFF);\n\t}\n}\n\nconst colorCache = new WeakMap();\n\nfunction elColor(el, background, borderColor) {\n\tlet newColor = background + borderColor;\n\tlet oldColor = colorCache.get(el);\n\n\tif (newColor != oldColor) {\n\t\tcolorCache.set(el, newColor);\n\t\tel.style.background = background;\n\t\tel.style.borderColor = borderColor;\n\t}\n}\n\nconst sizeCache = new WeakMap();\n\nfunction elSize(el, newWid, newHgt, centered) {\n\tlet newSize = newWid + \"\" + newHgt;\n\tlet oldSize = sizeCache.get(el);\n\n\tif (newSize != oldSize) {\n\t\tsizeCache.set(el, newSize);\n\t\tel.style.height = newHgt + \"px\";\n\t\tel.style.width = newWid + \"px\";\n\t\tel.style.marginLeft = centered ? -newWid/2 + \"px\" : 0;\n\t\tel.style.marginTop = centered ? -newHgt/2 + \"px\" : 0;\n\t}\n}\n\nconst evOpts = {passive: true};\nconst evOpts2 = {...evOpts, capture: true};\n\nfunction on(ev, el, cb, capt) {\n\tel.addEventListener(ev, cb, capt ? evOpts2 : evOpts);\n}\n\nfunction off(ev, el, cb, capt) {\n\tel.removeEventListener(ev, cb, evOpts);\n}\n\ndomEnv && setPxRatio();\n\n// binary search for index of closest value\nfunction closestIdx(num, arr, lo, hi) {\n\tlet mid;\n\tlo = lo || 0;\n\thi = hi || arr.length - 1;\n\tlet bitwise = hi <= 2147483647;\n\n\twhile (hi - lo > 1) {\n\t\tmid = bitwise ? (lo + hi) >> 1 : floor((lo + hi) / 2);\n\n\t\tif (arr[mid] < num)\n\t\t\tlo = mid;\n\t\telse\n\t\t\thi = mid;\n\t}\n\n\tif (num - arr[lo] <= arr[hi] - num)\n\t\treturn lo;\n\n\treturn hi;\n}\n\nfunction makeIndexOfs(predicate) {\n\t let indexOfs = (data, _i0, _i1) => {\n\t\tlet i0 = -1;\n\t\tlet i1 = -1;\n\n\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\tif (predicate(data[i])) {\n\t\t\t\ti0 = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = _i1; i >= _i0; i--) {\n\t\t\tif (predicate(data[i])) {\n\t\t\t\ti1 = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn [i0, i1];\n\t };\n\n\t return indexOfs;\n}\n\nconst notNullish = v => v != null;\nconst isPositive = v => v != null && v > 0;\n\nconst nonNullIdxs = makeIndexOfs(notNullish);\nconst positiveIdxs = makeIndexOfs(isPositive);\n\nfunction getMinMax(data, _i0, _i1, sorted = 0, log = false) {\n//\tconsole.log(\"getMinMax()\");\n\n\tlet getEdgeIdxs = log ? positiveIdxs : nonNullIdxs;\n\tlet predicate = log ? isPositive : notNullish;\n\n\t[_i0, _i1] = getEdgeIdxs(data, _i0, _i1);\n\n\tlet _min = data[_i0];\n\tlet _max = data[_i0];\n\n\tif (_i0 > -1) {\n\t\tif (sorted == 1) {\n\t\t\t_min = data[_i0];\n\t\t\t_max = data[_i1];\n\t\t}\n\t\telse if (sorted == -1) {\n\t\t\t_min = data[_i1];\n\t\t\t_max = data[_i0];\n\t\t}\n\t\telse {\n\t\t\tfor (let i = _i0; i <= _i1; i++) {\n\t\t\t\tlet v = data[i];\n\n\t\t\t\tif (predicate(v)) {\n\t\t\t\t\tif (v < _min)\n\t\t\t\t\t\t_min = v;\n\t\t\t\t\telse if (v > _max)\n\t\t\t\t\t\t_max = v;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [_min ?? inf, _max ?? -inf]; // todo: fix to return nulls\n}\n\nfunction rangeLog(min, max, base, fullMags) {\n\tlet minSign = sign(min);\n\tlet maxSign = sign(max);\n\n\tif (min == max) {\n\t\tif (minSign == -1) {\n\t\t\tmin *= base;\n\t\t\tmax /= base;\n\t\t}\n\t\telse {\n\t\t\tmin /= base;\n\t\t\tmax *= base;\n\t\t}\n\t}\n\n\tlet logFn = base == 10 ? log10 : log2;\n\n\tlet growMinAbs = minSign == 1 ? floor : ceil;\n\tlet growMaxAbs = maxSign == 1 ? ceil : floor;\n\n\tlet minExp = growMinAbs(logFn(abs(min)));\n\tlet maxExp = growMaxAbs(logFn(abs(max)));\n\n\tlet minIncr = pow(base, minExp);\n\tlet maxIncr = pow(base, maxExp);\n\n\t// fix values like Math.pow(10, -5) === 0.000009999999999999999\n\tif (base == 10) {\n\t\tif (minExp < 0)\n\t\t\tminIncr = roundDec(minIncr, -minExp);\n\t\tif (maxExp < 0)\n\t\t\tmaxIncr = roundDec(maxIncr, -maxExp);\n\t}\n\n\tif (fullMags || base == 2) {\n\t\tmin = minIncr * minSign;\n\t\tmax = maxIncr * maxSign;\n\t}\n\telse {\n\t\tmin = incrRoundDn(min, minIncr);\n\t\tmax = incrRoundUp(max, maxIncr);\n\t}\n\n\treturn [min, max];\n}\n\nfunction rangeAsinh(min, max, base, fullMags) {\n\tlet minMax = rangeLog(min, max, base, fullMags);\n\n\tif (min == 0)\n\t\tminMax[0] = 0;\n\n\tif (max == 0)\n\t\tminMax[1] = 0;\n\n\treturn minMax;\n}\n\nconst rangePad = 0.1;\n\nconst autoRangePart = {\n\tmode: 3,\n\tpad: rangePad,\n};\n\nconst _eqRangePart = {\n\tpad:  0,\n\tsoft: null,\n\tmode: 0,\n};\n\nconst _eqRange = {\n\tmin: _eqRangePart,\n\tmax: _eqRangePart,\n};\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction rangeNum(_min, _max, mult, extra) {\n\tif (isObj(mult))\n\t\treturn _rangeNum(_min, _max, mult);\n\n\t_eqRangePart.pad  = mult;\n\t_eqRangePart.soft = extra ? 0 : null;\n\t_eqRangePart.mode = extra ? 3 : 0;\n\n\treturn _rangeNum(_min, _max, _eqRange);\n}\n\n// nullish coalesce\nfunction ifNull(lh, rh) {\n\treturn lh == null ? rh : lh;\n}\n\n// checks if given index range in an array contains a non-null value\n// aka a range-bounded Array.some()\nfunction hasData(data, idx0, idx1) {\n\tidx0 = ifNull(idx0, 0);\n\tidx1 = ifNull(idx1, data.length - 1);\n\n\twhile (idx0 <= idx1) {\n\t\tif (data[idx0] != null)\n\t\t\treturn true;\n\t\tidx0++;\n\t}\n\n\treturn false;\n}\n\nfunction _rangeNum(_min, _max, cfg) {\n\tlet cmin = cfg.min;\n\tlet cmax = cfg.max;\n\n\tlet padMin = ifNull(cmin.pad, 0);\n\tlet padMax = ifNull(cmax.pad, 0);\n\n\tlet hardMin = ifNull(cmin.hard, -inf);\n\tlet hardMax = ifNull(cmax.hard,  inf);\n\n\tlet softMin = ifNull(cmin.soft,  inf);\n\tlet softMax = ifNull(cmax.soft, -inf);\n\n\tlet softMinMode = ifNull(cmin.mode, 0);\n\tlet softMaxMode = ifNull(cmax.mode, 0);\n\n\tlet delta = _max - _min;\n\tlet deltaMag = log10(delta);\n\n\tlet scalarMax = max(abs(_min), abs(_max));\n\tlet scalarMag = log10(scalarMax);\n\n\tlet scalarMagDelta = abs(scalarMag - deltaMag);\n\n\t// this handles situations like 89.7, 89.69999999999999\n\t// by assuming 0.001x deltas are precision errors\n//\tif (delta > 0 && delta < abs(_max) / 1e3)\n//\t\tdelta = 0;\n\n\t// treat data as flat if delta is less than 1e-24\n\t// or range is 11+ orders of magnitude below raw values, e.g. 99999999.99999996 - 100000000.00000004\n\tif (delta < 1e-24 || scalarMagDelta > 10) {\n\t\tdelta = 0;\n\n\t\t// if soft mode is 2 and all vals are flat at 0, avoid the 0.1 * 1e3 fallback\n\t\t// this prevents 0,0,0 from ranging to -100,100 when softMin/softMax are -1,1\n\t\tif (_min == 0 || _max == 0) {\n\t\t\tdelta = 1e-24;\n\n\t\t\tif (softMinMode == 2 && softMin != inf)\n\t\t\t\tpadMin = 0;\n\n\t\t\tif (softMaxMode == 2 && softMax != -inf)\n\t\t\t\tpadMax = 0;\n\t\t}\n\t}\n\n\tlet nonZeroDelta = delta || scalarMax || 1e3;\n\tlet mag          = log10(nonZeroDelta);\n\tlet base         = pow(10, floor(mag));\n\n\tlet _padMin  = nonZeroDelta * (delta == 0 ? (_min == 0 ? .1 : 1) : padMin);\n\tlet _newMin  = roundDec(incrRoundDn(_min - _padMin, base/10), 24);\n\tlet _softMin = _min >= softMin && (softMinMode == 1 || softMinMode == 3 && _newMin <= softMin || softMinMode == 2 && _newMin >= softMin) ? softMin : inf;\n\tlet minLim   = max(hardMin, _newMin < _softMin && _min >= _softMin ? _softMin : min(_softMin, _newMin));\n\n\tlet _padMax  = nonZeroDelta * (delta == 0 ? (_max == 0 ? .1 : 1) : padMax);\n\tlet _newMax  = roundDec(incrRoundUp(_max + _padMax, base/10), 24);\n\tlet _softMax = _max <= softMax && (softMaxMode == 1 || softMaxMode == 3 && _newMax >= softMax || softMaxMode == 2 && _newMax <= softMax) ? softMax : -inf;\n\tlet maxLim   = min(hardMax, _newMax > _softMax && _max <= _softMax ? _softMax : max(_softMax, _newMax));\n\n\tif (minLim == maxLim && minLim == 0)\n\t\tmaxLim = 100;\n\n\treturn [minLim, maxLim];\n}\n\n// alternative: https://stackoverflow.com/a/2254896\nconst numFormatter = new Intl.NumberFormat(domEnv ? nav.language : 'en-US');\nconst fmtNum = val => numFormatter.format(val);\n\nconst M = Math;\n\nconst PI = M.PI;\nconst abs = M.abs;\nconst floor = M.floor;\nconst round = M.round;\nconst ceil = M.ceil;\nconst min = M.min;\nconst max = M.max;\nconst pow = M.pow;\nconst sign = M.sign;\nconst log10 = M.log10;\nconst log2 = M.log2;\n// TODO: seems like this needs to match asinh impl if the passed v is tweaked?\nconst sinh =  (v, linthresh = 1) => M.sinh(v) * linthresh;\nconst asinh = (v, linthresh = 1) => M.asinh(v / linthresh);\n\nconst inf = Infinity;\n\nfunction numIntDigits(x) {\n\treturn (log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;\n}\n\nfunction clamp(num, _min, _max) {\n\treturn min(max(num, _min), _max);\n}\n\nfunction isFn(v) {\n\treturn typeof v == \"function\";\n}\n\nfunction fnOrSelf(v) {\n\treturn isFn(v) ? v : () => v;\n}\n\nconst noop = () => {};\n\n// note: these identity fns may get deoptimized if reused for different arg types\n// a TS version would enforce they stay monotyped and require making variants\nconst retArg0 = _0 => _0;\n\nconst retArg1 = (_0, _1) => _1;\n\nconst retNull = _ => null;\n\nconst retTrue = _ => true;\n\nconst retEq = (a, b) => a == b;\n\nconst regex6 = /\\.\\d*?(?=9{6,}|0{6,})/gm;\n\n// e.g. 17999.204999999998 -> 17999.205\nconst fixFloat = val => {\n\tif (isInt(val) || fixedDec.has(val))\n\t\treturn val;\n\n\tconst str = `${val}`;\n\n\tconst match = str.match(regex6);\n\n\tif (match == null)\n\t\treturn val;\n\n\tlet len = match[0].length - 1;\n\n\t// e.g. 1.0000000000000001e-24\n\tif (str.indexOf('e-') != -1) {\n\t\tlet [num, exp] = str.split('e');\n\t\treturn +`${fixFloat(num)}e${exp}`;\n\t}\n\n\treturn roundDec(val, len);\n};\n\nfunction incrRound(num, incr) {\n\treturn fixFloat(roundDec(fixFloat(num/incr))*incr);\n}\n\nfunction incrRoundUp(num, incr) {\n\treturn fixFloat(ceil(fixFloat(num/incr))*incr);\n}\n\nfunction incrRoundDn(num, incr) {\n\treturn fixFloat(floor(fixFloat(num/incr))*incr);\n}\n\n// https://stackoverflow.com/a/48764436\n// rounds half away from zero\nfunction roundDec(val, dec = 0) {\n\tif (isInt(val))\n\t\treturn val;\n//\telse if (dec == 0)\n//\t\treturn round(val);\n\n\tlet p = 10 ** dec;\n\tlet n = (val * p) * (1 + Number.EPSILON);\n\treturn round(n) / p;\n}\n\nconst fixedDec = new Map();\n\nfunction guessDec(num) {\n\treturn ((\"\"+num).split(\".\")[1] || \"\").length;\n}\n\nfunction genIncrs(base, minExp, maxExp, mults) {\n\tlet incrs = [];\n\n\tlet multDec = mults.map(guessDec);\n\n\tfor (let exp = minExp; exp < maxExp; exp++) {\n\t\tlet expa = abs(exp);\n\t\tlet mag = roundDec(pow(base, exp), expa);\n\n\t\tfor (let i = 0; i < mults.length; i++) {\n\t\t\tlet _incr = base == 10 ? +`${mults[i]}e${exp}` : mults[i] * mag;\n\t\t\tlet dec = (exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]);\n\t\t\tlet incr = base == 10 ? _incr : roundDec(_incr, dec);\n\t\t\tincrs.push(incr);\n\t\t\tfixedDec.set(incr, dec);\n\t\t}\n\t}\n\n\treturn incrs;\n}\n\n//export const assign = Object.assign;\n\nconst EMPTY_OBJ = {};\nconst EMPTY_ARR = [];\n\nconst nullNullTuple = [null, null];\n\nconst isArr = Array.isArray;\nconst isInt = Number.isInteger;\nconst isUndef = v => v === void 0;\n\nfunction isStr(v) {\n\treturn typeof v == 'string';\n}\n\nfunction isObj(v) {\n\tlet is = false;\n\n\tif (v != null) {\n\t\tlet c = v.constructor;\n\t\tis = c == null || c == Object;\n\t}\n\n\treturn is;\n}\n\nfunction fastIsObj(v) {\n\treturn v != null && typeof v == 'object';\n}\n\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\n\nconst __proto__ = \"__proto__\";\n\nfunction copy(o, _isObj = isObj) {\n\tlet out;\n\n\tif (isArr(o)) {\n\t\tlet val = o.find(v => v != null);\n\n\t\tif (isArr(val) || _isObj(val)) {\n\t\t\tout = Array(o.length);\n\t\t\tfor (let i = 0; i < o.length; i++)\n\t\t\t\tout[i] = copy(o[i], _isObj);\n\t\t}\n\t\telse\n\t\t\tout = o.slice();\n\t}\n\telse if (o instanceof TypedArray) // also (ArrayBuffer.isView(o) && !(o instanceof DataView))\n\t\tout = o.slice();\n\telse if (_isObj(o)) {\n\t\tout = {};\n\t\tfor (let k in o) {\n\t\t\tif (k != __proto__)\n\t\t\t\tout[k] = copy(o[k], _isObj);\n\t\t}\n\t}\n\telse\n\t\tout = o;\n\n\treturn out;\n}\n\nfunction assign(targ) {\n\tlet args = arguments;\n\n\tfor (let i = 1; i < args.length; i++) {\n\t\tlet src = args[i];\n\n\t\tfor (let key in src) {\n\t\t\tif (key != __proto__) {\n\t\t\t\tif (isObj(targ[key]))\n\t\t\t\t\tassign(targ[key], copy(src[key]));\n\t\t\t\telse\n\t\t\t\t\ttarg[key] = copy(src[key]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn targ;\n}\n\n// nullModes\nconst NULL_REMOVE = 0;  // nulls are converted to undefined (e.g. for spanGaps: true)\nconst NULL_RETAIN = 1;  // nulls are retained, with alignment artifacts set to undefined (default)\nconst NULL_EXPAND = 2;  // nulls are expanded to include any adjacent alignment artifacts\n\n// sets undefined values to nulls when adjacent to existing nulls (minesweeper)\nfunction nullExpand(yVals, nullIdxs, alignedLen) {\n\tfor (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) {\n\t\tlet nullIdx = nullIdxs[i];\n\n\t\tif (nullIdx > lastNullIdx) {\n\t\t\txi = nullIdx - 1;\n\t\t\twhile (xi >= 0 && yVals[xi] == null)\n\t\t\t\tyVals[xi--] = null;\n\n\t\t\txi = nullIdx + 1;\n\t\t\twhile (xi < alignedLen && yVals[xi] == null)\n\t\t\t\tyVals[lastNullIdx = xi++] = null;\n\t\t}\n\t}\n}\n\n// nullModes is a tables-matched array indicating how to treat nulls in each series\n// output is sorted ASC on the joined field (table[0]) and duplicate join values are collapsed\nfunction join(tables, nullModes) {\n\tif (allHeadersSame(tables)) {\n\t//\tconsole.log('cheap join!');\n\n\t\tlet table = tables[0].slice();\n\n\t\tfor (let i = 1; i < tables.length; i++)\n\t\t\ttable.push(...tables[i].slice(1));\n\n\t\tif (!isAsc(table[0]))\n\t\t\ttable = sortCols(table);\n\n\t\treturn table;\n\t}\n\n\tlet xVals = new Set();\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\t\tlet len = xs.length;\n\n\t\tfor (let i = 0; i < len; i++)\n\t\t\txVals.add(xs[i]);\n\t}\n\n\tlet data = [Array.from(xVals).sort((a, b) => a - b)];\n\n\tlet alignedLen = data[0].length;\n\n\tlet xIdxs = new Map();\n\n\tfor (let i = 0; i < alignedLen; i++)\n\t\txIdxs.set(data[0][i], i);\n\n\tfor (let ti = 0; ti < tables.length; ti++) {\n\t\tlet t = tables[ti];\n\t\tlet xs = t[0];\n\n\t\tfor (let si = 1; si < t.length; si++) {\n\t\t\tlet ys = t[si];\n\n\t\t\tlet yVals = Array(alignedLen).fill(undefined);\n\n\t\t\tlet nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN;\n\n\t\t\tlet nullIdxs = [];\n\n\t\t\tfor (let i = 0; i < ys.length; i++) {\n\t\t\t\tlet yVal = ys[i];\n\t\t\t\tlet alignedIdx = xIdxs.get(xs[i]);\n\n\t\t\t\tif (yVal === null) {\n\t\t\t\t\tif (nullMode != NULL_REMOVE) {\n\t\t\t\t\t\tyVals[alignedIdx] = yVal;\n\n\t\t\t\t\t\tif (nullMode == NULL_EXPAND)\n\t\t\t\t\t\t\tnullIdxs.push(alignedIdx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tyVals[alignedIdx] = yVal;\n\t\t\t}\n\n\t\t\tnullExpand(yVals, nullIdxs, alignedLen);\n\n\t\t\tdata.push(yVals);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nconst microTask = typeof queueMicrotask == \"undefined\" ? fn => Promise.resolve().then(fn) : queueMicrotask;\n\n// TODO: https://github.com/dy/sort-ids (~2x faster for 1e5+ arrays)\nfunction sortCols(table) {\n\tlet head = table[0];\n\tlet rlen = head.length;\n\n\tlet idxs = Array(rlen);\n\tfor (let i = 0; i < idxs.length; i++)\n\t\tidxs[i] = i;\n\n\tidxs.sort((i0, i1) => head[i0] - head[i1]);\n\n\tlet table2 = [];\n\tfor (let i = 0; i < table.length; i++) {\n\t\tlet row = table[i];\n\t\tlet row2 = Array(rlen);\n\n\t\tfor (let j = 0; j < rlen; j++)\n\t\t\trow2[j] = row[idxs[j]];\n\n\t\ttable2.push(row2);\n\t}\n\n\treturn table2;\n}\n\n// test if we can do cheap join (all join fields same)\nfunction allHeadersSame(tables) {\n\tlet vals0 = tables[0][0];\n\tlet len0 = vals0.length;\n\n\tfor (let i = 1; i < tables.length; i++) {\n\t\tlet vals1 = tables[i][0];\n\n\t\tif (vals1.length != len0)\n\t\t\treturn false;\n\n\t\tif (vals1 != vals0) {\n\t\t\tfor (let j = 0; j < len0; j++) {\n\t\t\t\tif (vals1[j] != vals0[j])\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction isAsc(vals, samples = 100) {\n\tconst len = vals.length;\n\n\t// empty or single value\n\tif (len <= 1)\n\t\treturn true;\n\n\t// skip leading & trailing nullish\n\tlet firstIdx = 0;\n\tlet lastIdx = len - 1;\n\n\twhile (firstIdx <= lastIdx && vals[firstIdx] == null)\n\t\tfirstIdx++;\n\n\twhile (lastIdx >= firstIdx && vals[lastIdx] == null)\n\t\tlastIdx--;\n\n\t// all nullish or one value surrounded by nullish\n\tif (lastIdx <= firstIdx)\n\t\treturn true;\n\n\tconst stride = max(1, floor((lastIdx - firstIdx + 1) / samples));\n\n\tfor (let prevVal = vals[firstIdx], i = firstIdx + stride; i <= lastIdx; i += stride) {\n\t\tconst v = vals[i];\n\n\t\tif (v != null) {\n\t\t\tif (v <= prevVal)\n\t\t\t\treturn false;\n\n\t\t\tprevVal = v;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nconst months = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\n\nconst days = [\n\t\"Sunday\",\n\t\"Monday\",\n\t\"Tuesday\",\n\t\"Wednesday\",\n\t\"Thursday\",\n\t\"Friday\",\n\t\"Saturday\",\n];\n\nfunction slice3(str) {\n\treturn str.slice(0, 3);\n}\n\nconst days3 = days.map(slice3);\n\nconst months3 = months.map(slice3);\n\nconst engNames = {\n\tMMMM: months,\n\tMMM:  months3,\n\tWWWW: days,\n\tWWW:  days3,\n};\n\nfunction zeroPad2(int) {\n\treturn (int < 10 ? '0' : '') + int;\n}\n\nfunction zeroPad3(int) {\n\treturn (int < 10 ? '00' : int < 100 ? '0' : '') + int;\n}\n\n/*\nfunction suffix(int) {\n\tlet mod10 = int % 10;\n\n\treturn int + (\n\t\tmod10 == 1 && int != 11 ? \"st\" :\n\t\tmod10 == 2 && int != 12 ? \"nd\" :\n\t\tmod10 == 3 && int != 13 ? \"rd\" : \"th\"\n\t);\n}\n*/\n\nconst subs = {\n\t// 2019\n\tYYYY:\td => d.getFullYear(),\n\t// 19\n\tYY:\t\td => (d.getFullYear()+'').slice(2),\n\t// July\n\tMMMM:\t(d, names) => names.MMMM[d.getMonth()],\n\t// Jul\n\tMMM:\t(d, names) => names.MMM[d.getMonth()],\n\t// 07\n\tMM:\t\td => zeroPad2(d.getMonth()+1),\n\t// 7\n\tM:\t\td => d.getMonth()+1,\n\t// 09\n\tDD:\t\td => zeroPad2(d.getDate()),\n\t// 9\n\tD:\t\td => d.getDate(),\n\t// Monday\n\tWWWW:\t(d, names) => names.WWWW[d.getDay()],\n\t// Mon\n\tWWW:\t(d, names) => names.WWW[d.getDay()],\n\t// 03\n\tHH:\t\td => zeroPad2(d.getHours()),\n\t// 3\n\tH:\t\td => d.getHours(),\n\t// 9 (12hr, unpadded)\n\th:\t\td => {let h = d.getHours(); return h == 0 ? 12 : h > 12 ? h - 12 : h;},\n\t// AM\n\tAA:\t\td => d.getHours() >= 12 ? 'PM' : 'AM',\n\t// am\n\taa:\t\td => d.getHours() >= 12 ? 'pm' : 'am',\n\t// a\n\ta:\t\td => d.getHours() >= 12 ? 'p' : 'a',\n\t// 09\n\tmm:\t\td => zeroPad2(d.getMinutes()),\n\t// 9\n\tm:\t\td => d.getMinutes(),\n\t// 09\n\tss:\t\td => zeroPad2(d.getSeconds()),\n\t// 9\n\ts:\t\td => d.getSeconds(),\n\t// 374\n\tfff:\td => zeroPad3(d.getMilliseconds()),\n};\n\nfunction fmtDate(tpl, names) {\n\tnames = names || engNames;\n\tlet parts = [];\n\n\tlet R = /\\{([a-z]+)\\}|[^{]+/gi, m;\n\n\twhile (m = R.exec(tpl))\n\t\tparts.push(m[0][0] == '{' ? subs[m[1]] : m[0]);\n\n\treturn d => {\n\t\tlet out = '';\n\n\t\tfor (let i = 0; i < parts.length; i++)\n\t\t\tout += typeof parts[i] == \"string\" ? parts[i] : parts[i](d, names);\n\n\t\treturn out;\n\t}\n}\n\nconst localTz = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n// https://stackoverflow.com/questions/15141762/how-to-initialize-a-javascript-date-to-a-particular-time-zone/53652131#53652131\nfunction tzDate(date, tz) {\n\tlet date2;\n\n\t// perf optimization\n\tif (tz == 'UTC' || tz == 'Etc/UTC')\n\t\tdate2 = new Date(+date + date.getTimezoneOffset() * 6e4);\n\telse if (tz == localTz)\n\t\tdate2 = date;\n\telse {\n\t\tdate2 = new Date(date.toLocaleString('en-US', {timeZone: tz}));\n\t\tdate2.setMilliseconds(date.getMilliseconds());\n\t}\n\n\treturn date2;\n}\n\n//export const series = [];\n\n// default formatters:\n\nconst onlyWhole = v => v % 1 == 0;\n\nconst allMults = [1,2,2.5,5];\n\n// ...0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5\nconst decIncrs = genIncrs(10, -32, 0, allMults);\n\n// 1, 2, 2.5, 5, 10, 20, 25, 50...\nconst oneIncrs = genIncrs(10, 0, 32, allMults);\n\n// 1, 2,      5, 10, 20, 25, 50...\nconst wholeIncrs = oneIncrs.filter(onlyWhole);\n\nconst numIncrs = decIncrs.concat(oneIncrs);\n\nconst NL = \"\\n\";\n\nconst yyyy    = \"{YYYY}\";\nconst NLyyyy  = NL + yyyy;\nconst md      = \"{M}/{D}\";\nconst NLmd    = NL + md;\nconst NLmdyy  = NLmd + \"/{YY}\";\n\nconst aa      = \"{aa}\";\nconst hmm     = \"{h}:{mm}\";\nconst hmmaa   = hmm + aa;\nconst NLhmmaa = NL + hmmaa;\nconst ss      = \":{ss}\";\n\nconst _ = null;\n\nfunction genTimeStuffs(ms) {\n\tlet\ts  = ms * 1e3,\n\t\tm  = s  * 60,\n\t\th  = m  * 60,\n\t\td  = h  * 24,\n\t\tmo = d  * 30,\n\t\ty  = d  * 365;\n\n\t// min of 1e-3 prevents setting a temporal x ticks too small since Date objects cannot advance ticks smaller than 1ms\n\tlet subSecIncrs = ms == 1 ? genIncrs(10, 0, 3, allMults).filter(onlyWhole) : genIncrs(10, -3, 0, allMults);\n\n\tlet timeIncrs = subSecIncrs.concat([\n\t\t// minute divisors (# of secs)\n\t\ts,\n\t\ts * 5,\n\t\ts * 10,\n\t\ts * 15,\n\t\ts * 30,\n\t\t// hour divisors (# of mins)\n\t\tm,\n\t\tm * 5,\n\t\tm * 10,\n\t\tm * 15,\n\t\tm * 30,\n\t\t// day divisors (# of hrs)\n\t\th,\n\t\th * 2,\n\t\th * 3,\n\t\th * 4,\n\t\th * 6,\n\t\th * 8,\n\t\th * 12,\n\t\t// month divisors TODO: need more?\n\t\td,\n\t\td * 2,\n\t\td * 3,\n\t\td * 4,\n\t\td * 5,\n\t\td * 6,\n\t\td * 7,\n\t\td * 8,\n\t\td * 9,\n\t\td * 10,\n\t\td * 15,\n\t\t// year divisors (# months, approx)\n\t\tmo,\n\t\tmo * 2,\n\t\tmo * 3,\n\t\tmo * 4,\n\t\tmo * 6,\n\t\t// century divisors\n\t\ty,\n\t\ty * 2,\n\t\ty * 5,\n\t\ty * 10,\n\t\ty * 25,\n\t\ty * 50,\n\t\ty * 100,\n\t]);\n\n\t// [0]:   minimum num secs in the tick incr\n\t// [1]:   default tick format\n\t// [2-7]: rollover tick formats\n\t// [8]:   mode: 0: replace [1] -> [2-7], 1: concat [1] + [2-7]\n\tconst _timeAxisStamps = [\n\t//   tick incr    default          year                    month   day                   hour    min       sec   mode\n\t\t[y,           yyyy,            _,                      _,      _,                    _,      _,        _,       1],\n\t\t[d * 28,      \"{MMM}\",         NLyyyy,                 _,      _,                    _,      _,        _,       1],\n\t\t[d,           md,              NLyyyy,                 _,      _,                    _,      _,        _,       1],\n\t\t[h,           \"{h}\" + aa,      NLmdyy,                 _,      NLmd,                 _,      _,        _,       1],\n\t\t[m,           hmmaa,           NLmdyy,                 _,      NLmd,                 _,      _,        _,       1],\n\t\t[s,           ss,              NLmdyy + \" \" + hmmaa,   _,      NLmd + \" \" + hmmaa,   _,      NLhmmaa,  _,       1],\n\t\t[ms,          ss + \".{fff}\",   NLmdyy + \" \" + hmmaa,   _,      NLmd + \" \" + hmmaa,   _,      NLhmmaa,  _,       1],\n\t];\n\n\t// the ensures that axis ticks, values & grid are aligned to logical temporal breakpoints and not an arbitrary timestamp\n\t// https://www.timeanddate.com/time/dst/\n\t// https://www.timeanddate.com/time/dst/2019.html\n\t// https://www.epochconverter.com/timezones\n\tfunction timeAxisSplits(tzDate) {\n\t\treturn (self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n\t\t\tlet splits = [];\n\t\t\tlet isYr = foundIncr >= y;\n\t\t\tlet isMo = foundIncr >= mo && foundIncr < y;\n\n\t\t\t// get the timezone-adjusted date\n\t\t\tlet minDate = tzDate(scaleMin);\n\t\t\tlet minDateTs = roundDec(minDate * ms, 3);\n\n\t\t\t// get ts of 12am (this lands us at or before the original scaleMin)\n\t\t\tlet minMin = mkDate(minDate.getFullYear(), isYr ? 0 : minDate.getMonth(), isMo || isYr ? 1 : minDate.getDate());\n\t\t\tlet minMinTs = roundDec(minMin * ms, 3);\n\n\t\t\tif (isMo || isYr) {\n\t\t\t\tlet moIncr = isMo ? foundIncr / mo : 0;\n\t\t\t\tlet yrIncr = isYr ? foundIncr / y  : 0;\n\t\t\t//\tlet tzOffset = scaleMin - minDateTs;\t\t// needed?\n\t\t\t\tlet split = minDateTs == minMinTs ? minDateTs : roundDec(mkDate(minMin.getFullYear() + yrIncr, minMin.getMonth() + moIncr, 1) * ms, 3);\n\t\t\t\tlet splitDate = new Date(round(split / ms));\n\t\t\t\tlet baseYear = splitDate.getFullYear();\n\t\t\t\tlet baseMonth = splitDate.getMonth();\n\n\t\t\t\tfor (let i = 0; split <= scaleMax; i++) {\n\t\t\t\t\tlet next = mkDate(baseYear + yrIncr * i, baseMonth + moIncr * i, 1);\n\t\t\t\t\tlet offs = next - tzDate(roundDec(next * ms, 3));\n\n\t\t\t\t\tsplit = roundDec((+next + offs) * ms, 3);\n\n\t\t\t\t\tif (split <= scaleMax)\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet incr0 = foundIncr >= d ? d : foundIncr;\n\t\t\t\tlet tzOffset = floor(scaleMin) - floor(minDateTs);\n\t\t\t\tlet split = minMinTs + tzOffset + incrRoundUp(minDateTs - minMinTs, incr0);\n\t\t\t\tsplits.push(split);\n\n\t\t\t\tlet date0 = tzDate(split);\n\n\t\t\t\tlet prevHour = date0.getHours() + (date0.getMinutes() / m) + (date0.getSeconds() / h);\n\t\t\t\tlet incrHours = foundIncr / h;\n\n\t\t\t\tlet minSpace = self.axes[axisIdx]._space;\n\t\t\t\tlet pctSpace = foundSpace / minSpace;\n\n\t\t\t\twhile (1) {\n\t\t\t\t\tsplit = roundDec(split + foundIncr, ms == 1 ? 0 : 3);\n\n\t\t\t\t\tif (split > scaleMax)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif (incrHours > 1) {\n\t\t\t\t\t\tlet expectedHour = floor(roundDec(prevHour + incrHours, 6)) % 24;\n\t\t\t\t\t\tlet splitDate = tzDate(split);\n\t\t\t\t\t\tlet actualHour = splitDate.getHours();\n\n\t\t\t\t\t\tlet dstShift = actualHour - expectedHour;\n\n\t\t\t\t\t\tif (dstShift > 1)\n\t\t\t\t\t\t\tdstShift = -1;\n\n\t\t\t\t\t\tsplit -= dstShift * h;\n\n\t\t\t\t\t\tprevHour = (prevHour + incrHours) % 24;\n\n\t\t\t\t\t\t// add a tick only if it's further than 70% of the min allowed label spacing\n\t\t\t\t\t\tlet prevSplit = splits[splits.length - 1];\n\t\t\t\t\t\tlet pctIncr = roundDec((split - prevSplit) / foundIncr, 3);\n\n\t\t\t\t\t\tif (pctIncr * pctSpace >= .7)\n\t\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsplits.push(split);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn splits;\n\t\t}\n\t}\n\n\treturn [\n\t\ttimeIncrs,\n\t\t_timeAxisStamps,\n\t\ttimeAxisSplits,\n\t];\n}\n\nconst [ timeIncrsMs, _timeAxisStampsMs, timeAxisSplitsMs ] = genTimeStuffs(1);\nconst [ timeIncrsS,  _timeAxisStampsS,  timeAxisSplitsS  ] = genTimeStuffs(1e-3);\n\n// base 2\ngenIncrs(2, -53, 53, [1]);\n\n/*\nconsole.log({\n\tdecIncrs,\n\toneIncrs,\n\twholeIncrs,\n\tnumIncrs,\n\ttimeIncrs,\n\tfixedDec,\n});\n*/\n\nfunction timeAxisStamps(stampCfg, fmtDate) {\n\treturn stampCfg.map(s => s.map((v, i) =>\n\t\ti == 0 || i == 8 || v == null ? v : fmtDate(i == 1 || s[8] == 0 ? v : s[1] + v)\n\t));\n}\n\n// TODO: will need to accept spaces[] and pull incr into the loop when grid will be non-uniform, eg for log scales.\n// currently we ignore this for months since they're *nearly* uniform and the added complexity is not worth it\nfunction timeAxisVals(tzDate, stamps) {\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => {\n\t\tlet s = stamps.find(s => foundIncr >= s[0]) || stamps[stamps.length - 1];\n\n\t\t// these track boundaries when a full label is needed again\n\t\tlet prevYear;\n\t\tlet prevMnth;\n\t\tlet prevDate;\n\t\tlet prevHour;\n\t\tlet prevMins;\n\t\tlet prevSecs;\n\n\t\treturn splits.map(split => {\n\t\t\tlet date = tzDate(split);\n\n\t\t\tlet newYear = date.getFullYear();\n\t\t\tlet newMnth = date.getMonth();\n\t\t\tlet newDate = date.getDate();\n\t\t\tlet newHour = date.getHours();\n\t\t\tlet newMins = date.getMinutes();\n\t\t\tlet newSecs = date.getSeconds();\n\n\t\t\tlet stamp = (\n\t\t\t\tnewYear != prevYear && s[2] ||\n\t\t\t\tnewMnth != prevMnth && s[3] ||\n\t\t\t\tnewDate != prevDate && s[4] ||\n\t\t\t\tnewHour != prevHour && s[5] ||\n\t\t\t\tnewMins != prevMins && s[6] ||\n\t\t\t\tnewSecs != prevSecs && s[7] ||\n\t\t\t\t                       s[1]\n\t\t\t);\n\n\t\t\tprevYear = newYear;\n\t\t\tprevMnth = newMnth;\n\t\t\tprevDate = newDate;\n\t\t\tprevHour = newHour;\n\t\t\tprevMins = newMins;\n\t\t\tprevSecs = newSecs;\n\n\t\t\treturn stamp(date);\n\t\t});\n\t}\n}\n\n// for when axis.values is defined as a static fmtDate template string\nfunction timeAxisVal(tzDate, dateTpl) {\n\tlet stamp = fmtDate(dateTpl);\n\treturn (self, splits, axisIdx, foundSpace, foundIncr) => splits.map(split => stamp(tzDate(split)));\n}\n\nfunction mkDate(y, m, d) {\n\treturn new Date(y, m, d);\n}\n\nfunction timeSeriesStamp(stampCfg, fmtDate) {\n\treturn fmtDate(stampCfg);\n}\nconst _timeSeriesStamp = '{YYYY}-{MM}-{DD} {h}:{mm}{aa}';\n\nfunction timeSeriesVal(tzDate, stamp) {\n\treturn (self, val, seriesIdx, dataIdx) => dataIdx == null ? LEGEND_DISP : stamp(tzDate(val));\n}\n\nfunction legendStroke(self, seriesIdx) {\n\tlet s = self.series[seriesIdx];\n\treturn s.width ? s.stroke(self, seriesIdx) : s.points.width ? s.points.stroke(self, seriesIdx) : null;\n}\n\nfunction legendFill(self, seriesIdx) {\n\treturn self.series[seriesIdx].fill(self, seriesIdx);\n}\n\nconst legendOpts = {\n\tshow: true,\n\tlive: true,\n\tisolate: false,\n\tmount: noop,\n\tmarkers: {\n\t\tshow: true,\n\t\twidth: 2,\n\t\tstroke: legendStroke,\n\t\tfill: legendFill,\n\t\tdash: \"solid\",\n\t},\n\tidx: null,\n\tidxs: null,\n\tvalues: [],\n};\n\nfunction cursorPointShow(self, si) {\n\tlet o = self.cursor.points;\n\n\tlet pt = placeDiv();\n\n\tlet size = o.size(self, si);\n\tsetStylePx(pt, WIDTH, size);\n\tsetStylePx(pt, HEIGHT, size);\n\n\tlet mar = size / -2;\n\tsetStylePx(pt, \"marginLeft\", mar);\n\tsetStylePx(pt, \"marginTop\", mar);\n\n\tlet width = o.width(self, si, size);\n\twidth && setStylePx(pt, \"borderWidth\", width);\n\n\treturn pt;\n}\n\nfunction cursorPointFill(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._fill || sp._stroke;\n}\n\nfunction cursorPointStroke(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp._stroke || sp._fill;\n}\n\nfunction cursorPointSize(self, si) {\n\tlet sp = self.series[si].points;\n\treturn sp.size;\n}\n\nconst moveTuple = [0,0];\n\nfunction cursorMove(self, mouseLeft1, mouseTop1) {\n\tmoveTuple[0] = mouseLeft1;\n\tmoveTuple[1] = mouseTop1;\n\treturn moveTuple;\n}\n\nfunction filtBtn0(self, targ, handle, onlyTarg = true) {\n\treturn e => {\n\t\te.button == 0 && (!onlyTarg || e.target == targ) && handle(e);\n\t};\n}\n\nfunction filtTarg(self, targ, handle, onlyTarg = true) {\n\treturn e => {\n\t\t(!onlyTarg || e.target == targ) && handle(e);\n\t};\n}\n\nconst cursorOpts = {\n\tshow: true,\n\tx: true,\n\ty: true,\n\tlock: false,\n\tmove: cursorMove,\n\tpoints: {\n\t\tone:    false,\n\t\tshow:   cursorPointShow,\n\t\tsize:   cursorPointSize,\n\t\twidth:  0,\n\t\tstroke: cursorPointStroke,\n\t\tfill:   cursorPointFill,\n\t},\n\n\tbind: {\n\t\tmousedown:   filtBtn0,\n\t\tmouseup:     filtBtn0,\n\t\tclick:       filtBtn0, // legend clicks, not .u-over clicks\n\t\tdblclick:    filtBtn0,\n\n\t\tmousemove:   filtTarg,\n\t\tmouseleave:  filtTarg,\n\t\tmouseenter:  filtTarg,\n\t},\n\n\tdrag: {\n\t\tsetScale: true,\n\t\tx: true,\n\t\ty: false,\n\t\tdist: 0,\n\t\tuni: null,\n\t\tclick: (self, e) => {\n\t\t//\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t},\n\t\t_x: false,\n\t\t_y: false,\n\t},\n\n\tfocus: {\n\t\tdist: (self, seriesIdx, dataIdx, valPos, curPos) => valPos - curPos,\n\t\tprox: -1,\n\t\tbias: 0,\n\t},\n\n\thover: {\n\t\tskip: [void 0],\n\t\tprox: null,\n\t\tbias: 0,\n\t},\n\n\tleft: -10,\n\ttop: -10,\n\tidx: null,\n\tdataIdx: null,\n\tidxs: null,\n\n\tevent: null,\n};\n\nconst axisLines = {\n\tshow: true,\n\tstroke: \"rgba(0,0,0,0.07)\",\n\twidth: 2,\n//\tdash: [],\n};\n\nconst grid = assign({}, axisLines, {\n\tfilter: retArg1,\n});\n\nconst ticks = assign({}, grid, {\n\tsize: 10,\n});\n\nconst border = assign({}, axisLines, {\n\tshow: false,\n});\n\nconst font      = '12px system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"';\nconst labelFont = \"bold \" + font;\nconst lineGap = 1.5;\t// font-size multiplier\n\nconst xAxisOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tstroke: hexBlack,\n\tspace: 50,\n\tgap: 5,\n\talignTo: 1,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 2,\n//\tclass: \"x-vals\",\n//\tincrs: timeIncrs,\n//\tvalues: timeVals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\tlineGap,\n\trotate: 0,\n};\n\nconst numSeriesLabel = \"Value\";\nconst timeSeriesLabel = \"Time\";\n\nconst xSeriesOpts = {\n\tshow: true,\n\tscale: \"x\",\n\tauto: false,\n\tsorted: 1,\n//\tlabel: \"Time\",\n//\tvalue: v => stamp(new Date(v * 1e3)),\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n};\n\nfunction numAxisVals(self, splits, axisIdx, foundSpace, foundIncr) {\n\treturn splits.map(v => v == null ? \"\" : fmtNum(v));\n}\n\nfunction numAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet splits = [];\n\n\tlet numDec = fixedDec.get(foundIncr) || 0;\n\n\tscaleMin = forceMin ? scaleMin : roundDec(incrRoundUp(scaleMin, foundIncr), numDec);\n\n\tfor (let val = scaleMin; val <= scaleMax; val = roundDec(val + foundIncr, numDec))\n\t\tsplits.push(Object.is(val, -0) ? 0 : val);\t\t// coalesces -0\n\n\treturn splits;\n}\n\n// this doesnt work for sin, which needs to come off from 0 independently in pos and neg dirs\nfunction logAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tconst splits = [];\n\n\tconst logBase = self.scales[self.axes[axisIdx].scale].log;\n\n\tconst logFn = logBase == 10 ? log10 : log2;\n\n\tconst exp = floor(logFn(scaleMin));\n\n\tfoundIncr = pow(logBase, exp);\n\n\t// boo: 10 ** -24 === 1.0000000000000001e-24\n\t// this grabs the proper 1e-24 one\n\tif (logBase == 10)\n\t\tfoundIncr = numIncrs[closestIdx(foundIncr, numIncrs)];\n\n\tlet split = scaleMin;\n\tlet nextMagIncr = foundIncr * logBase;\n\n\tif (logBase == 10)\n\t\tnextMagIncr = numIncrs[closestIdx(nextMagIncr, numIncrs)];\n\n\tdo {\n\t\tsplits.push(split);\n\t\tsplit = split + foundIncr;\n\n\t\tif (logBase == 10 && !fixedDec.has(split))\n\t\t\tsplit = roundDec(split, fixedDec.get(foundIncr));\n\n\t\tif (split >= nextMagIncr) {\n\t\t\tfoundIncr = split;\n\t\t\tnextMagIncr = foundIncr * logBase;\n\n\t\t\tif (logBase == 10)\n\t\t\t\tnextMagIncr = numIncrs[closestIdx(nextMagIncr, numIncrs)];\n\t\t}\n\t} while (split <= scaleMax);\n\n\treturn splits;\n}\n\nfunction asinhAxisSplits(self, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace, forceMin) {\n\tlet sc = self.scales[self.axes[axisIdx].scale];\n\n\tlet linthresh = sc.asinh;\n\n\tlet posSplits = scaleMax > linthresh ? logAxisSplits(self, axisIdx, max(linthresh, scaleMin), scaleMax, foundIncr) : [linthresh];\n\tlet zero = scaleMax >= 0 && scaleMin <= 0 ? [0] : [];\n\tlet negSplits = scaleMin < -linthresh ? logAxisSplits(self, axisIdx, max(linthresh, -scaleMax), -scaleMin, foundIncr): [linthresh];\n\n\treturn negSplits.reverse().map(v => -v).concat(zero, posSplits);\n}\n\nconst RE_ALL   = /./;\nconst RE_12357 = /[12357]/;\nconst RE_125   = /[125]/;\nconst RE_1     = /1/;\n\nconst _filt = (splits, distr, re, keepMod) => splits.map((v, i) => ((distr == 4 && v == 0) || i % keepMod == 0 && re.test(v.toExponential()[v < 0 ? 1 : 0])) ? v : null);\n\nfunction log10AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet sc = self.scales[scaleKey];\n\n//\tif (sc.distr == 3 && sc.log == 2)\n//\t\treturn splits;\n\n\tlet valToPos = self.valToPos;\n\n\tlet minSpace = axis._space;\n\n\tlet _10 = valToPos(10, scaleKey);\n\n\tlet re = (\n\t\tvalToPos(9, scaleKey) - _10 >= minSpace ? RE_ALL :\n\t\tvalToPos(7, scaleKey) - _10 >= minSpace ? RE_12357 :\n\t\tvalToPos(5, scaleKey) - _10 >= minSpace ? RE_125 :\n\t\tRE_1\n\t);\n\n\tif (re == RE_1) {\n\t\tlet magSpace = abs(valToPos(1, scaleKey) - _10);\n\n\t\tif (magSpace < minSpace)\n\t\t\treturn _filt(splits.slice().reverse(), sc.distr, re, ceil(minSpace / magSpace)).reverse(); // max->min skip\n\t}\n\n\treturn _filt(splits, sc.distr, re, 1);\n}\n\nfunction log2AxisValsFilt(self, splits, axisIdx, foundSpace, foundIncr) {\n\tlet axis = self.axes[axisIdx];\n\tlet scaleKey = axis.scale;\n\tlet minSpace = axis._space;\n\tlet valToPos = self.valToPos;\n\n\tlet magSpace = abs(valToPos(1, scaleKey) - valToPos(2, scaleKey));\n\n\tif (magSpace < minSpace)\n\t\treturn _filt(splits.slice().reverse(), 3, RE_ALL, ceil(minSpace / magSpace)).reverse(); // max->min skip\n\n\treturn splits;\n}\n\nfunction numSeriesVal(self, val, seriesIdx, dataIdx) {\n\treturn dataIdx == null ? LEGEND_DISP : val == null ? \"\" : fmtNum(val);\n}\n\nconst yAxisOpts = {\n\tshow: true,\n\tscale: \"y\",\n\tstroke: hexBlack,\n\tspace: 30,\n\tgap: 5,\n\talignTo: 1,\n\tsize: 50,\n\tlabelGap: 0,\n\tlabelSize: 30,\n\tlabelFont,\n\tside: 3,\n//\tclass: \"y-vals\",\n//\tincrs: numIncrs,\n//\tvalues: (vals, space) => vals,\n//\tfilter: retArg1,\n\tgrid,\n\tticks,\n\tborder,\n\tfont,\n\tlineGap,\n\trotate: 0,\n};\n\n// takes stroke width\nfunction ptDia(width, mult) {\n\tlet dia = 3 + (width || 1) * 2;\n\treturn roundDec(dia * mult, 3);\n}\n\nfunction seriesPointsShow(self, si) {\n\tlet { scale, idxs } = self.series[0];\n\tlet xData = self._data[0];\n\tlet p0 = self.valToPos(xData[idxs[0]], scale, true);\n\tlet p1 = self.valToPos(xData[idxs[1]], scale, true);\n\tlet dim = abs(p1 - p0);\n\n\tlet s = self.series[si];\n//\tconst dia = ptDia(s.width, pxRatio);\n\tlet maxPts = dim / (s.points.space * pxRatio);\n\treturn idxs[1] - idxs[0] <= maxPts;\n}\n\nconst facet = {\n\tscale: null,\n\tauto: true,\n\tsorted: 0,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n};\n\nconst gaps = (self, seriesIdx, idx0, idx1, nullGaps) => nullGaps;\n\nconst xySeriesOpts = {\n\tshow: true,\n\tauto: true,\n\tsorted: 0,\n\tgaps,\n\talpha: 1,\n\tfacets: [\n\t\tassign({}, facet, {scale: 'x'}),\n\t\tassign({}, facet, {scale: 'y'}),\n\t],\n};\n\nconst ySeriesOpts = {\n\tscale: \"y\",\n\tauto: true,\n\tsorted: 0,\n\tshow: true,\n\tspanGaps: false,\n\tgaps,\n\talpha: 1,\n\tpoints: {\n\t\tshow: seriesPointsShow,\n\t\tfilter: null,\n\t//  paths:\n\t//\tstroke: \"#000\",\n\t//\tfill: \"#fff\",\n\t//\twidth: 1,\n\t//\tsize: 10,\n\t},\n//\tlabel: \"Value\",\n//\tvalue: v => v,\n\tvalues: null,\n\n\t// internal caches\n\tmin: inf,\n\tmax: -inf,\n\tidxs: [],\n\n\tpath: null,\n\tclip: null,\n};\n\nfunction clampScale(self, val, scaleMin, scaleMax, scaleKey) {\n/*\n\tif (val < 0) {\n\t\tlet cssHgt = self.bbox.height / pxRatio;\n\t\tlet absPos = self.valToPos(abs(val), scaleKey);\n\t\tlet fromBtm = cssHgt - absPos;\n\t\treturn self.posToVal(cssHgt + fromBtm, scaleKey);\n\t}\n*/\n\treturn scaleMin / 10;\n}\n\nconst xScaleOpts = {\n\ttime: FEAT_TIME,\n\tauto: true,\n\tdistr: 1,\n\tlog: 10,\n\tasinh: 1,\n\tmin: null,\n\tmax: null,\n\tdir: 1,\n\tori: 0,\n};\n\nconst yScaleOpts = assign({}, xScaleOpts, {\n\ttime: false,\n\tori: 1,\n});\n\nconst syncs = {};\n\nfunction _sync(key, opts) {\n\tlet s = syncs[key];\n\n\tif (!s) {\n\t\ts = {\n\t\t\tkey,\n\t\t\tplots: [],\n\t\t\tsub(plot) {\n\t\t\t\ts.plots.push(plot);\n\t\t\t},\n\t\t\tunsub(plot) {\n\t\t\t\ts.plots = s.plots.filter(c => c != plot);\n\t\t\t},\n\t\t\tpub(type, self, x, y, w, h, i) {\n\t\t\t\tfor (let j = 0; j < s.plots.length; j++)\n\t\t\t\t\ts.plots[j] != self && s.plots[j].pub(type, self, x, y, w, h, i);\n\t\t\t},\n\t\t};\n\n\t\tif (key != null)\n\t\t\tsyncs[key] = s;\n\t}\n\n\treturn s;\n}\n\nconst BAND_CLIP_FILL   = 1 << 0;\nconst BAND_CLIP_STROKE = 1 << 1;\n\nfunction orient(u, seriesIdx, cb) {\n\tconst mode = u.mode;\n\tconst series = u.series[seriesIdx];\n\tconst data = mode == 2 ? u._data[seriesIdx] : u._data;\n\tconst scales = u.scales;\n\tconst bbox   = u.bbox;\n\n\tlet dx = data[0],\n\t\tdy = mode == 2 ? data[1] : data[seriesIdx],\n\t\tsx = mode == 2 ? scales[series.facets[0].scale] : scales[u.series[0].scale],\n\t\tsy = mode == 2 ? scales[series.facets[1].scale] : scales[series.scale],\n\t\tl = bbox.left,\n\t\tt = bbox.top,\n\t\tw = bbox.width,\n\t\th = bbox.height,\n\t\tH = u.valToPosH,\n\t\tV = u.valToPosV;\n\n\treturn (sx.ori == 0\n\t\t? cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tH,\n\t\t\tV,\n\t\t\tl,\n\t\t\tt,\n\t\t\tw,\n\t\t\th,\n\t\t\tmoveToH,\n\t\t\tlineToH,\n\t\t\trectH,\n\t\t\tarcH,\n\t\t\tbezierCurveToH,\n\t\t)\n\t\t: cb(\n\t\t\tseries,\n\t\t\tdx,\n\t\t\tdy,\n\t\t\tsx,\n\t\t\tsy,\n\t\t\tV,\n\t\t\tH,\n\t\t\tt,\n\t\t\tl,\n\t\t\th,\n\t\t\tw,\n\t\t\tmoveToV,\n\t\t\tlineToV,\n\t\t\trectV,\n\t\t\tarcV,\n\t\t\tbezierCurveToV,\n\t\t)\n\t);\n}\n\nfunction bandFillClipDirs(self, seriesIdx) {\n\tlet fillDir = 0;\n\n\t// 2 bits, -1 | 1\n\tlet clipDirs = 0;\n\n\tlet bands = ifNull(self.bands, EMPTY_ARR);\n\n\tfor (let i = 0; i < bands.length; i++) {\n\t\tlet b = bands[i];\n\n\t\t// is a \"from\" band edge\n\t\tif (b.series[0] == seriesIdx)\n\t\t\tfillDir = b.dir;\n\t\t// is a \"to\" band edge\n\t\telse if (b.series[1] == seriesIdx) {\n\t\t\tif (b.dir == 1)\n\t\t\t\tclipDirs |= 1;\n\t\t\telse\n\t\t\t\tclipDirs |= 2;\n\t\t}\n\t}\n\n\treturn [\n\t\tfillDir,\n\t\t(\n\t\t\tclipDirs == 1 ? -1 : // neg only\n\t\t\tclipDirs == 2 ?  1 : // pos only\n\t\t\tclipDirs == 3 ?  2 : // both\n\t\t\t                 0   // neither\n\t\t)\n\t];\n}\n\nfunction seriesFillTo(self, seriesIdx, dataMin, dataMax, bandFillDir) {\n\tlet mode = self.mode;\n\tlet series = self.series[seriesIdx];\n\tlet scaleKey = mode == 2 ? series.facets[1].scale : series.scale;\n\tlet scale = self.scales[scaleKey];\n\n\treturn (\n\t\tbandFillDir == -1 ? scale.min :\n\t\tbandFillDir ==  1 ? scale.max :\n\t\tscale.distr ==  3 ? (\n\t\t\tscale.dir == 1 ? scale.min :\n\t\t\tscale.max\n\t\t) : 0\n\t);\n}\n\n// creates inverted band clip path (from stroke path -> yMax || yMin)\n// clipDir is always inverse of fillDir\n// default clip dir is upwards (1), since default band fill is downwards/fillBelowTo (-1) (highIdx -> lowIdx)\nfunction clipBandLine(self, seriesIdx, idx0, idx1, strokePath, clipDir) {\n\treturn orient(self, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\tlet pxRound = series.pxRound;\n\n\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\tconst lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\tlet frIdx, toIdx;\n\n\t\tif (dir == 1) {\n\t\t\tfrIdx = idx0;\n\t\t\ttoIdx = idx1;\n\t\t}\n\t\telse {\n\t\t\tfrIdx = idx1;\n\t\t\ttoIdx = idx0;\n\t\t}\n\n\t\t// path start\n\t\tlet x0 = pxRound(valToPosX(dataX[frIdx], scaleX, xDim, xOff));\n\t\tlet y0 = pxRound(valToPosY(dataY[frIdx], scaleY, yDim, yOff));\n\t\t// path end x\n\t\tlet x1 = pxRound(valToPosX(dataX[toIdx], scaleX, xDim, xOff));\n\t\t// upper or lower y limit\n\t\tlet yLimit = pxRound(valToPosY(clipDir == 1 ? scaleY.max : scaleY.min, scaleY, yDim, yOff));\n\n\t\tlet clip = new Path2D(strokePath);\n\n\t\tlineTo(clip, x1, yLimit);\n\t\tlineTo(clip, x0, yLimit);\n\t\tlineTo(clip, x0, y0);\n\n\t\treturn clip;\n\t});\n}\n\nfunction clipGaps(gaps, ori, plotLft, plotTop, plotWid, plotHgt) {\n\tlet clip = null;\n\n\t// create clip path (invert gaps and non-gaps)\n\tif (gaps.length > 0) {\n\t\tclip = new Path2D();\n\n\t\tconst rect = ori == 0 ? rectH : rectV;\n\n\t\tlet prevGapEnd = plotLft;\n\n\t\tfor (let i = 0; i < gaps.length; i++) {\n\t\t\tlet g = gaps[i];\n\n\t\t\tif (g[1] > g[0]) {\n\t\t\t\tlet w = g[0] - prevGapEnd;\n\n\t\t\t\tw > 0 && rect(clip, prevGapEnd, plotTop, w, plotTop + plotHgt);\n\n\t\t\t\tprevGapEnd = g[1];\n\t\t\t}\n\t\t}\n\n\t\tlet w = plotLft + plotWid - prevGapEnd;\n\n\t\t// hack to ensure we expand the clip enough to avoid cutting off strokes at edges\n\t\tlet maxStrokeWidth = 10;\n\n\t\tw > 0 && rect(clip, prevGapEnd, plotTop - maxStrokeWidth / 2, w, plotTop + plotHgt + maxStrokeWidth);\n\t}\n\n\treturn clip;\n}\n\nfunction addGap(gaps, fromX, toX) {\n\tlet prevGap = gaps[gaps.length - 1];\n\n\tif (prevGap && prevGap[0] == fromX)\t\t\t// TODO: gaps must be encoded at stroke widths?\n\t\tprevGap[1] = toX;\n\telse\n\t\tgaps.push([fromX, toX]);\n}\n\nfunction findGaps(xs, ys, idx0, idx1, dir, pixelForX, align) {\n\tlet gaps = [];\n\tlet len = xs.length;\n\n\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\tlet yVal = ys[i];\n\n\t\tif (yVal === null) {\n\t\t\tlet fr = i, to = i;\n\n\t\t\tif (dir == 1) {\n\t\t\t\twhile (++i <= idx1 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (--i >= idx0 && ys[i] === null)\n\t\t\t\t\tto = i;\n\t\t\t}\n\n\t\t\tlet frPx = pixelForX(xs[fr]);\n\t\t\tlet toPx = to == fr ? frPx : pixelForX(xs[to]);\n\n\t\t\t// if value adjacent to edge null is same pixel, then it's partially\n\t\t\t// filled and gap should start at next pixel\n\t\t\tlet fri2 = fr - dir;\n\t\t\tlet frPx2 = align <= 0 && fri2 >= 0 && fri2 < len ? pixelForX(xs[fri2]) : frPx;\n\t\t//\tif (frPx2 == frPx)\n\t\t//\t\tfrPx++;\n\t\t//\telse\n\t\t\t\tfrPx = frPx2;\n\n\t\t\tlet toi2 = to + dir;\n\t\t\tlet toPx2 = align >= 0 && toi2 >= 0 && toi2 < len ? pixelForX(xs[toi2]) : toPx;\n\t\t//\tif (toPx2 == toPx)\n\t\t//\t\ttoPx--;\n\t\t//\telse\n\t\t\t\ttoPx = toPx2;\n\n\t\t\tif (toPx >= frPx)\n\t\t\t\tgaps.push([frPx, toPx]); // addGap\n\t\t}\n\t}\n\n\treturn gaps;\n}\n\nfunction pxRoundGen(pxAlign) {\n\treturn pxAlign == 0 ? retArg0 : pxAlign == 1 ? round : v => incrRound(v, pxAlign);\n}\n\n/*\n// inefficient linear interpolation that does bi-directinal scans on each call\nexport function costlyLerp(i, idx0, idx1, _dirX, dataY) {\n\tlet prevNonNull = nonNullIdx(dataY, _dirX == 1 ? idx0 : idx1, i, -_dirX);\n\tlet nextNonNull = nonNullIdx(dataY, i, _dirX == 1 ? idx1 : idx0,  _dirX);\n\n\tlet prevVal = dataY[prevNonNull];\n\tlet nextVal = dataY[nextNonNull];\n\n\treturn prevVal + (i - prevNonNull) / (nextNonNull - prevNonNull) * (nextVal - prevVal);\n}\n*/\n\nfunction rect(ori) {\n\tlet moveTo = ori == 0 ?\n\t\tmoveToH :\n\t\tmoveToV;\n\n\tlet arcTo = ori == 0 ?\n\t\t(p, x1, y1, x2, y2, r) => { p.arcTo(x1, y1, x2, y2, r); } :\n\t\t(p, y1, x1, y2, x2, r) => { p.arcTo(x1, y1, x2, y2, r); };\n\n\tlet rect = ori == 0 ?\n\t\t(p, x, y, w, h) => { p.rect(x, y, w, h); } :\n\t\t(p, y, x, h, w) => { p.rect(x, y, w, h); };\n\n\t// TODO (pending better browser support): https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/roundRect\n\treturn (p, x, y, w, h, endRad = 0, baseRad = 0) => {\n\t\tif (endRad == 0 && baseRad == 0)\n\t\t\trect(p, x, y, w, h);\n\t\telse {\n\t\t\tendRad  = min(endRad,  w / 2, h / 2);\n\t\t\tbaseRad = min(baseRad, w / 2, h / 2);\n\n\t\t\t// adapted from https://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-using-html-canvas/7838871#7838871\n\t\t\tmoveTo(p, x + endRad, y);\n\t\t\tarcTo(p, x + w, y, x + w, y + h, endRad);\n\t\t\tarcTo(p, x + w, y + h, x, y + h, baseRad);\n\t\t\tarcTo(p, x, y + h, x, y, baseRad);\n\t\t\tarcTo(p, x, y, x + w, y, endRad);\n\t\t\tp.closePath();\n\t\t}\n\t};\n}\n\n// orientation-inverting canvas functions\nconst moveToH = (p, x, y) => { p.moveTo(x, y); };\nconst moveToV = (p, y, x) => { p.moveTo(x, y); };\nconst lineToH = (p, x, y) => { p.lineTo(x, y); };\nconst lineToV = (p, y, x) => { p.lineTo(x, y); };\nconst rectH = rect(0);\nconst rectV = rect(1);\nconst arcH = (p, x, y, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst arcV = (p, y, x, r, startAngle, endAngle) => { p.arc(x, y, r, startAngle, endAngle); };\nconst bezierCurveToH = (p, bp1x, bp1y, bp2x, bp2y, p2x, p2y) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\nconst bezierCurveToV = (p, bp1y, bp1x, bp2y, bp2x, p2y, p2x) => { p.bezierCurveTo(bp1x, bp1y, bp2x, bp2y, p2x, p2y); };\n\n// TODO: drawWrap(seriesIdx, drawPoints) (save, restore, translate, clip)\nfunction points(opts) {\n\treturn (u, seriesIdx, idx0, idx1, filtIdxs) => {\n\t//\tlog(\"drawPoints()\", arguments);\n\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet { pxRound, points } = series;\n\n\t\t\tlet moveTo, arc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tarc = arcH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tarc = arcV;\n\t\t\t}\n\n\t\t\tconst width = roundDec(points.width * pxRatio, 3);\n\n\t\t\tlet rad = (points.size - points.width) / 2 * pxRatio;\n\t\t\tlet dia = roundDec(rad * 2, 3);\n\n\t\t\tlet fill = new Path2D();\n\t\t\tlet clip = new Path2D();\n\n\t\t\tlet { left: lft, top: top, width: wid, height: hgt } = u.bbox;\n\n\t\t\trectH(clip,\n\t\t\t\tlft - dia,\n\t\t\t\ttop - dia,\n\t\t\t\twid + dia * 2,\n\t\t\t\thgt + dia * 2,\n\t\t\t);\n\n\t\t\tconst drawPoint = pi => {\n\t\t\t\tif (dataY[pi] != null) {\n\t\t\t\t\tlet x = pxRound(valToPosX(dataX[pi], scaleX, xDim, xOff));\n\t\t\t\t\tlet y = pxRound(valToPosY(dataY[pi], scaleY, yDim, yOff));\n\n\t\t\t\t\tmoveTo(fill, x + rad, y);\n\t\t\t\t\tarc(fill, x, y, rad, 0, PI * 2);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (filtIdxs)\n\t\t\t\tfiltIdxs.forEach(drawPoint);\n\t\t\telse {\n\t\t\t\tfor (let pi = idx0; pi <= idx1; pi++)\n\t\t\t\t\tdrawPoint(pi);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstroke: width > 0 ? fill : null,\n\t\t\t\tfill,\n\t\t\t\tclip,\n\t\t\t\tflags: BAND_CLIP_FILL | BAND_CLIP_STROKE,\n\t\t\t};\n\t\t});\n\t};\n}\n\nfunction _drawAcc(lineTo) {\n\treturn (stroke, accX, minY, maxY, inY, outY) => {\n\t\tif (minY != maxY) {\n\t\t\tif (inY != minY && outY != minY)\n\t\t\t\tlineTo(stroke, accX, minY);\n\t\t\tif (inY != maxY && outY != maxY)\n\t\t\t\tlineTo(stroke, accX, maxY);\n\n\t\t\tlineTo(stroke, accX, outY);\n\t\t}\n\t};\n}\n\nconst drawAccH = _drawAcc(lineToH);\nconst drawAccV = _drawAcc(lineToV);\n\nfunction linear(opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\t[idx0, idx1] = nonNullIdxs(dataY, idx0, idx1);\n\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo, drawAcc;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tdrawAcc = drawAccH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tdrawAcc = drawAccV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet hasGap = false;\n\n\t\t\t// decimate when number of points >= 4x available pixels\n\t\t\tconst decimate = idx1 - idx0 >= xDim * 4;\n\n\t\t\tif (decimate) {\n\t\t\t\tlet xForPixel = pos => u.posToVal(pos, scaleX.key, true);\n\n\t\t\t\tlet minY = null,\n\t\t\t\t\tmaxY = null,\n\t\t\t\t\tinY, outY, drawnAtX;\n\n\t\t\t\tlet accX = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\n\t\t\t\tlet idx0px = pixelForX(dataX[idx0]);\n\t\t\t\tlet idx1px = pixelForX(dataX[idx1]);\n\n\t\t\t\t// tracks limit of current x bucket to avoid having to get x pixel for every x value\n\t\t\t\tlet nextAccXVal = xForPixel(dir == 1 ? idx0px + 1 : idx1px - 1);\n\n\t\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet reuseAccX = dir == 1 ? (xVal < nextAccXVal) : (xVal > nextAccXVal);\n\t\t\t\t\tlet x = reuseAccX ? accX :  pixelForX(xVal);\n\n\t\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t\tif (x == accX) {\n\t\t\t\t\t\tif (yVal != null) {\n\t\t\t\t\t\t\toutY = yVal;\n\n\t\t\t\t\t\t\tif (minY == null) {\n\t\t\t\t\t\t\t\tlineTo(stroke, x, pixelForY(outY));\n\t\t\t\t\t\t\t\tinY = minY = maxY = outY;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (outY < minY)\n\t\t\t\t\t\t\t\t\tminY = outY;\n\t\t\t\t\t\t\t\telse if (outY > maxY)\n\t\t\t\t\t\t\t\t\tmaxY = outY;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (yVal === null)\n\t\t\t\t\t\t\t\thasGap = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (minY != null)\n\t\t\t\t\t\t\tdrawAcc(stroke, accX, pixelForY(minY), pixelForY(maxY), pixelForY(inY), pixelForY(outY));\n\n\t\t\t\t\t\tif (yVal != null) {\n\t\t\t\t\t\t\toutY = yVal;\n\t\t\t\t\t\t\tlineTo(stroke, x, pixelForY(outY));\n\t\t\t\t\t\t\tminY = maxY = inY = outY;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tminY = maxY = null;\n\n\t\t\t\t\t\t\tif (yVal === null)\n\t\t\t\t\t\t\t\thasGap = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\taccX = x;\n\t\t\t\t\t\tnextAccXVal = xForPixel(accX + dir);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (minY != null && minY != maxY && drawnAtX != accX)\n\t\t\t\t\tdrawAcc(stroke, accX, pixelForY(minY), pixelForY(maxY), pixelForY(inY), pixelForY(outY));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\t\tif (yVal === null)\n\t\t\t\t\t\thasGap = true;\n\t\t\t\t\telse if (yVal != null)\n\t\t\t\t\t\tlineTo(stroke, pixelForX(dataX[i]), pixelForY(yVal));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillToVal = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillToVal);\n\n\t\t\t\tlet frX = pixelForX(dataX[idx0]);\n\t\t\t\tlet toX = pixelForX(dataX[idx1]);\n\n\t\t\t\tif (dir == -1)\n\t\t\t\t\t[toX, frX] = [frX, toX];\n\n\t\t\t\tlineTo(fill, toX, fillToY);\n\t\t\t\tlineTo(fill, frX, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) { // skip in mode: 2?\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\thasGap && gaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke,  1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\n// BUG: align: -1 behaves like align: 1 when scale.dir: -1\nfunction stepped(opts) {\n\tconst align = ifNull(opts.align, 1);\n\t// whether to draw ascenders/descenders at null/gap bondaries\n\tconst ascDesc = ifNull(opts.ascDesc, false);\n\tconst alignGaps = ifNull(opts.alignGaps, 0);\n\tconst extend = ifNull(opts.extend, false);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\t[idx0, idx1] = nonNullIdxs(dataY, idx0, idx1);\n\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet { left, width } = u.bbox;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet lineTo = scaleX.ori == 0 ? lineToH : lineToV;\n\n\t\t\tconst _paths = {stroke: new Path2D(), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tlet prevYPos  = pixelForY(dataY[dir == 1 ? idx0 : idx1]);\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet firstXPosExt = firstXPos;\n\n\t\t\tif (extend && align == -1) {\n\t\t\t\tfirstXPosExt = left;\n\t\t\t\tlineTo(stroke, firstXPosExt, prevYPos);\n\t\t\t}\n\n\t\t\tlineTo(stroke, firstXPos, prevYPos);\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal1 = dataY[i];\n\n\t\t\t\tif (yVal1 == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet x1 = pixelForX(dataX[i]);\n\t\t\t\tlet y1 = pixelForY(yVal1);\n\n\t\t\t\tif (align == 1)\n\t\t\t\t\tlineTo(stroke, x1, prevYPos);\n\t\t\t\telse\n\t\t\t\t\tlineTo(stroke, prevXPos, y1);\n\n\t\t\t\tlineTo(stroke, x1, y1);\n\n\t\t\t\tprevYPos = y1;\n\t\t\t\tprevXPos = x1;\n\t\t\t}\n\n\t\t\tlet prevXPosExt = prevXPos;\n\n\t\t\tif (extend && align == 1) {\n\t\t\t\tprevXPosExt = left + width;\n\t\t\t\tlineTo(stroke, prevXPosExt, prevYPos);\n\t\t\t}\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPosExt, fillToY);\n\t\t\t\tlineTo(fill, firstXPosExt, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t// expand/contract clips for ascenders/descenders\n\t\t\t\tlet halfStroke = (series.width * pxRatio) / 2;\n\t\t\t\tlet startsOffset = (ascDesc || align ==  1) ?  halfStroke : -halfStroke;\n\t\t\t\tlet endsOffset   = (ascDesc || align == -1) ? -halfStroke :  halfStroke;\n\n\t\t\t\tgaps.forEach(g => {\n\t\t\t\t\tg[0] += startsOffset;\n\t\t\t\t\tg[1] += endsOffset;\n\t\t\t\t});\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke,  1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid = inf) {\n\tif (dataX.length > 1) {\n\t\t// prior index with non-undefined y data\n\t\tlet prevIdx = null;\n\n\t\t// scan full dataset for smallest adjacent delta\n\t\t// will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end\n\t\tfor (let i = 0, minDelta = Infinity; i < dataX.length; i++) {\n\t\t\tif (dataY[i] !== undefined) {\n\t\t\t\tif (prevIdx != null) {\n\t\t\t\t\tlet delta = abs(dataX[i] - dataX[prevIdx]);\n\n\t\t\t\t\tif (delta < minDelta) {\n\t\t\t\t\t\tminDelta = delta;\n\t\t\t\t\t\tcolWid = abs(valToPosX(dataX[i], scaleX, xDim, xOff) - valToPosX(dataX[prevIdx], scaleX, xDim, xOff));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprevIdx = i;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn colWid;\n}\n\nfunction bars(opts) {\n\topts = opts || EMPTY_OBJ;\n\tconst size = ifNull(opts.size, [0.6, inf, 1]);\n\tconst align = opts.align || 0;\n\tconst _extraGap = (opts.gap || 0);\n\n\tlet ro = opts.radius;\n\n\tro =\n\t\t// [valueRadius, baselineRadius]\n\t\tro == null ? [0, 0] :\n\t\ttypeof ro == 'number' ? [ro, 0] : ro;\n\n\tconst radiusFn = fnOrSelf(ro);\n\n\tconst gapFactor = 1 - size[0];\n\tconst _maxWidth  = ifNull(size[1], inf);\n\tconst _minWidth  = ifNull(size[2], 1);\n\n\tconst disp = ifNull(opts.disp, EMPTY_OBJ);\n\tconst _each = ifNull(opts.each, _ => {});\n\n\tconst { fill: dispFills, stroke: dispStrokes } = disp;\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\tlet pxRound = series.pxRound;\n\t\t\tlet _align = align;\n\n\t\t\tlet extraGap = _extraGap * pxRatio;\n\t\t\tlet maxWidth = _maxWidth * pxRatio;\n\t\t\tlet minWidth = _minWidth * pxRatio;\n\n\t\t\tlet valRadius, baseRadius;\n\n\t\t\tif (scaleX.ori == 0)\n\t\t\t\t[valRadius, baseRadius] = radiusFn(u, seriesIdx);\n\t\t\telse\n\t\t\t\t[baseRadius, valRadius] = radiusFn(u, seriesIdx);\n\n\t\t\tconst _dirX = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\t\t//\tconst _dirY = scaleY.dir * (scaleY.ori == 1 ? 1 : -1);\n\n\t\t\tlet rect = scaleX.ori == 0 ? rectH : rectV;\n\n\t\t\tlet each = scaleX.ori == 0 ? _each : (u, seriesIdx, i, top, lft, hgt, wid) => {\n\t\t\t\t_each(u, seriesIdx, i, lft, top, wid, hgt);\n\t\t\t};\n\n\t\t\t// band where this series is the \"from\" edge\n\t\t\tlet band = ifNull(u.bands, EMPTY_ARR).find(b => b.series[0] == seriesIdx);\n\n\t\t\tlet fillDir = band != null ? band.dir : 0;\n\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, fillDir);\n\t\t\tlet fillToY = pxRound(valToPosY(fillTo, scaleY, yDim, yOff));\n\n\t\t\t// barWid is to center of stroke\n\t\t\tlet xShift, barWid, fullGap, colWid = xDim;\n\n\t\t\tlet strokeWidth = pxRound(series.width * pxRatio);\n\n\t\t\tlet multiPath = false;\n\n\t\t\tlet fillColors = null;\n\t\t\tlet fillPaths = null;\n\t\t\tlet strokeColors = null;\n\t\t\tlet strokePaths = null;\n\n\t\t\tif (dispFills != null && (strokeWidth == 0 || dispStrokes != null)) {\n\t\t\t\tmultiPath = true;\n\n\t\t\t\tfillColors = dispFills.values(u, seriesIdx, idx0, idx1);\n\t\t\t\tfillPaths = new Map();\n\t\t\t\t(new Set(fillColors)).forEach(color => {\n\t\t\t\t\tif (color != null)\n\t\t\t\t\t\tfillPaths.set(color, new Path2D());\n\t\t\t\t});\n\n\t\t\t\tif (strokeWidth > 0) {\n\t\t\t\t\tstrokeColors = dispStrokes.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tstrokePaths = new Map();\n\t\t\t\t\t(new Set(strokeColors)).forEach(color => {\n\t\t\t\t\t\tif (color != null)\n\t\t\t\t\t\t\tstrokePaths.set(color, new Path2D());\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { x0, size } = disp;\n\n\t\t\tif (x0 != null && size != null) {\n\t\t\t\t_align = 1;\n\t\t\t\tdataX = x0.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (x0.unit == 2)\n\t\t\t\t\tdataX = dataX.map(pct => u.posToVal(xOff + pct * xDim, scaleX.key, true));\n\n\t\t\t\t// assumes uniform sizes, for now\n\t\t\t\tlet sizes = size.values(u, seriesIdx, idx0, idx1);\n\n\t\t\t\tif (size.unit == 2)\n\t\t\t\t\tbarWid = sizes[0] * xDim;\n\t\t\t\telse\n\t\t\t\t\tbarWid = valToPosX(sizes[0], scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff); // assumes linear scale (delta from 0)\n\n\t\t\t\tcolWid = findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid);\n\n\t\t\t\tlet gapWid = colWid - barWid;\n\t\t\t\tfullGap = gapWid + extraGap;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcolWid = findColWidth(dataX, dataY, valToPosX, scaleX, xDim, xOff, colWid);\n\n\t\t\t\tlet gapWid = colWid * gapFactor;\n\n\t\t\t\tfullGap = gapWid + extraGap;\n\t\t\t\tbarWid = colWid - fullGap;\n\t\t\t}\n\n\t\t\tif (fullGap < 1)\n\t\t\t\tfullGap = 0;\n\n\t\t\tif (strokeWidth >= barWid / 2)\n\t\t\t\tstrokeWidth = 0;\n\n\t\t\t// for small gaps, disable pixel snapping since gap inconsistencies become noticible and annoying\n\t\t\tif (fullGap < 5)\n\t\t\t\tpxRound = retArg0;\n\n\t\t\tlet insetStroke = fullGap > 0;\n\n\t\t\tlet rawBarWid = colWid - fullGap - (insetStroke ? strokeWidth : 0);\n\n\t\t\tbarWid = pxRound(clamp(rawBarWid, minWidth, maxWidth));\n\n\t\t\txShift = (_align == 0 ? barWid / 2 : _align == _dirX ? 0 : barWid) - _align * _dirX * ((_align == 0 ? extraGap / 2 : 0) + (insetStroke ? strokeWidth / 2 : 0));\n\n\n\t\t\tconst _paths = {stroke: null, fill: null, clip: null, band: null, gaps: null, flags: 0};  // disp, geom\n\n\t\t\tconst stroke = multiPath ? null : new Path2D();\n\n\t\t\tlet dataY0 = null;\n\n\t\t\tif (band != null)\n\t\t\t\tdataY0 = u.data[band.series[1]];\n\t\t\telse {\n\t\t\t\tlet { y0, y1 } = disp;\n\n\t\t\t\tif (y0 != null && y1 != null) {\n\t\t\t\t\tdataY = y1.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t\tdataY0 = y0.values(u, seriesIdx, idx0, idx1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet radVal = valRadius * barWid;\n\t\t\tlet radBase = baseRadius * barWid;\n\n\t\t\tfor (let i = _dirX == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += _dirX) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal == null)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (dataY0 != null) {\n\t\t\t\t\tlet yVal0 = dataY0[i] ?? 0;\n\n\t\t\t\t\tif (yVal - yVal0 == 0)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tfillToY = valToPosY(yVal0, scaleY, yDim, yOff);\n\t\t\t\t}\n\n\t\t\t\tlet xVal = scaleX.distr != 2 || disp != null ? dataX[i] : i;\n\n\t\t\t\t// TODO: all xPos can be pre-computed once for all series in aligned set\n\t\t\t\tlet xPos = valToPosX(xVal, scaleX, xDim, xOff);\n\t\t\t\tlet yPos = valToPosY(ifNull(yVal, fillTo), scaleY, yDim, yOff);\n\n\t\t\t\tlet lft = pxRound(xPos - xShift);\n\t\t\t\tlet btm = pxRound(max(yPos, fillToY));\n\t\t\t\tlet top = pxRound(min(yPos, fillToY));\n\t\t\t\t// this includes the stroke\n\t\t\t\tlet barHgt = btm - top;\n\n\t\t\t\tif (yVal != null) {  // && yVal != fillTo (0 height bar)\n\t\t\t\t\tlet rv = yVal < 0 ? radBase : radVal;\n\t\t\t\t\tlet rb = yVal < 0 ? radVal : radBase;\n\n\t\t\t\t\tif (multiPath) {\n\t\t\t\t\t\tif (strokeWidth > 0 && strokeColors[i] != null)\n\t\t\t\t\t\t\trect(strokePaths.get(strokeColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb);\n\n\t\t\t\t\t\tif (fillColors[i] != null)\n\t\t\t\t\t\t\trect(fillPaths.get(fillColors[i]), lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\trect(stroke, lft, top + floor(strokeWidth / 2), barWid, max(0, barHgt - strokeWidth), rv, rb);\n\n\t\t\t\t\teach(u, seriesIdx, i,\n\t\t\t\t\t\tlft    - strokeWidth / 2,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\tbarWid + strokeWidth,\n\t\t\t\t\t\tbarHgt,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (strokeWidth > 0)\n\t\t\t\t_paths.stroke = multiPath ? strokePaths : stroke;\n\t\t\telse if (!multiPath) {\n\t\t\t\t_paths._fill = series.width == 0 ? series._fill : series._stroke ?? series._fill;\n\t\t\t\t_paths.width = 0;\n\t\t\t}\n\n\t\t\t_paths.fill = multiPath ? fillPaths : stroke;\n\n\t\t\treturn _paths;\n\t\t});\n\t};\n}\n\nfunction splineInterp(interp, opts) {\n\tconst alignGaps = ifNull(opts?.alignGaps, 0);\n\n\treturn (u, seriesIdx, idx0, idx1) => {\n\t\treturn orient(u, seriesIdx, (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n\t\t\t[idx0, idx1] = nonNullIdxs(dataY, idx0, idx1);\n\n\t\t\tlet pxRound = series.pxRound;\n\n\t\t\tlet pixelForX = val => pxRound(valToPosX(val, scaleX, xDim, xOff));\n\t\t\tlet pixelForY = val => pxRound(valToPosY(val, scaleY, yDim, yOff));\n\n\t\t\tlet moveTo, bezierCurveTo, lineTo;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tmoveTo = moveToH;\n\t\t\t\tlineTo = lineToH;\n\t\t\t\tbezierCurveTo = bezierCurveToH;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmoveTo = moveToV;\n\t\t\t\tlineTo = lineToV;\n\t\t\t\tbezierCurveTo = bezierCurveToV;\n\t\t\t}\n\n\t\t\tconst dir = scaleX.dir * (scaleX.ori == 0 ? 1 : -1);\n\n\t\t\tlet firstXPos = pixelForX(dataX[dir == 1 ? idx0 : idx1]);\n\t\t\tlet prevXPos = firstXPos;\n\n\t\t\tlet xCoords = [];\n\t\t\tlet yCoords = [];\n\n\t\t\tfor (let i = dir == 1 ? idx0 : idx1; i >= idx0 && i <= idx1; i += dir) {\n\t\t\t\tlet yVal = dataY[i];\n\n\t\t\t\tif (yVal != null) {\n\t\t\t\t\tlet xVal = dataX[i];\n\t\t\t\t\tlet xPos = pixelForX(xVal);\n\n\t\t\t\t\txCoords.push(prevXPos = xPos);\n\t\t\t\t\tyCoords.push(pixelForY(dataY[i]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _paths = {stroke: interp(xCoords, yCoords, moveTo, lineTo, bezierCurveTo, pxRound), fill: null, clip: null, band: null, gaps: null, flags: BAND_CLIP_FILL};\n\t\t\tconst stroke = _paths.stroke;\n\n\t\t\tlet [ bandFillDir, bandClipDir ] = bandFillClipDirs(u, seriesIdx);\n\n\t\t\tif (series.fill != null || bandFillDir != 0) {\n\t\t\t\tlet fill = _paths.fill = new Path2D(stroke);\n\n\t\t\t\tlet fillTo = series.fillTo(u, seriesIdx, series.min, series.max, bandFillDir);\n\t\t\t\tlet fillToY = pixelForY(fillTo);\n\n\t\t\t\tlineTo(fill, prevXPos, fillToY);\n\t\t\t\tlineTo(fill, firstXPos, fillToY);\n\t\t\t}\n\n\t\t\tif (!series.spanGaps) {\n\t\t\t//\tconsole.time('gaps');\n\t\t\t\tlet gaps = [];\n\n\t\t\t\tgaps.push(...findGaps(dataX, dataY, idx0, idx1, dir, pixelForX, alignGaps));\n\n\t\t\t//\tconsole.timeEnd('gaps');\n\n\t\t\t//\tconsole.log('gaps', JSON.stringify(gaps));\n\n\t\t\t\t_paths.gaps = gaps = series.gaps(u, seriesIdx, idx0, idx1, gaps);\n\n\t\t\t\t_paths.clip = clipGaps(gaps, scaleX.ori, xOff, yOff, xDim, yDim);\n\t\t\t}\n\n\t\t\tif (bandClipDir != 0) {\n\t\t\t\t_paths.band = bandClipDir == 2 ? [\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke, -1),\n\t\t\t\t\tclipBandLine(u, seriesIdx, idx0, idx1, stroke,  1),\n\t\t\t\t] : clipBandLine(u, seriesIdx, idx0, idx1, stroke, bandClipDir);\n\t\t\t}\n\n\t\t\treturn _paths;\n\n\t\t\t//  if FEAT_PATHS: false in rollup.config.js\n\t\t\t//\tu.ctx.save();\n\t\t\t//\tu.ctx.beginPath();\n\t\t\t//\tu.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n\t\t\t//\tu.ctx.clip();\n\t\t\t//\tu.ctx.strokeStyle = u.series[sidx].stroke;\n\t\t\t//\tu.ctx.stroke(stroke);\n\t\t\t//\tu.ctx.fillStyle = u.series[sidx].fill;\n\t\t\t//\tu.ctx.fill(fill);\n\t\t\t//\tu.ctx.restore();\n\t\t\t//\treturn null;\n\t\t});\n\t};\n}\n\nfunction monotoneCubic(opts) {\n\treturn splineInterp(_monotoneCubic, opts);\n}\n\n// Monotone Cubic Spline interpolation, adapted from the Chartist.js implementation:\n// https://github.com/gionkunz/chartist-js/blob/e7e78201bffe9609915e5e53cfafa29a5d6c49f9/src/scripts/interpolation.js#L240-L369\nfunction _monotoneCubic(xs, ys, moveTo, lineTo, bezierCurveTo, pxRound) {\n\tconst n = xs.length;\n\n\tif (n < 2)\n\t\treturn null;\n\n\tconst path = new Path2D();\n\n\tmoveTo(path, xs[0], ys[0]);\n\n\tif (n == 2)\n\t\tlineTo(path, xs[1], ys[1]);\n\telse {\n\t\tlet ms  = Array(n),\n\t\t\tds  = Array(n - 1),\n\t\t\tdys = Array(n - 1),\n\t\t\tdxs = Array(n - 1);\n\n\t\t// calc deltas and derivative\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tdys[i] = ys[i + 1] - ys[i];\n\t\t\tdxs[i] = xs[i + 1] - xs[i];\n\t\t\tds[i]  = dys[i] / dxs[i];\n\t\t}\n\n\t\t// determine desired slope (m) at each point using Fritsch-Carlson method\n\t\t// http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\t\tms[0] = ds[0];\n\n\t\tfor (let i = 1; i < n - 1; i++) {\n\t\t\tif (ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0))\n\t\t\t\tms[i] = 0;\n\t\t\telse {\n\t\t\t\tms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n\t\t\t\t\t(2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n\t\t\t\t\t(dxs[i] + 2 * dxs[i - 1]) / ds[i]\n\t\t\t\t);\n\n\t\t\t\tif (!isFinite(ms[i]))\n\t\t\t\t\tms[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tms[n - 1] = ds[n - 2];\n\n\t\tfor (let i = 0; i < n - 1; i++) {\n\t\t\tbezierCurveTo(\n\t\t\t\tpath,\n\t\t\t\txs[i] + dxs[i] / 3,\n\t\t\t\tys[i] + ms[i] * dxs[i] / 3,\n\t\t\t\txs[i + 1] - dxs[i] / 3,\n\t\t\t\tys[i + 1] - ms[i + 1] * dxs[i] / 3,\n\t\t\t\txs[i + 1],\n\t\t\t\tys[i + 1],\n\t\t\t);\n\t\t}\n\t}\n\n\treturn path;\n}\n\nconst cursorPlots = new Set();\n\nfunction invalidateRects() {\n\tfor (let u of cursorPlots)\n\t\tu.syncRect(true);\n}\n\nif (domEnv) {\n\ton(resize, win, invalidateRects);\n\ton(scroll, win, invalidateRects, true);\n\ton(dppxchange, win, () => { uPlot.pxRatio = pxRatio; });\n}\n\nconst linearPath = linear() ;\nconst pointsPath = points() ;\n\nfunction setDefaults(d, xo, yo, initY) {\n\tlet d2 = initY ? [d[0], d[1]].concat(d.slice(2)) : [d[0]].concat(d.slice(1));\n\treturn d2.map((o, i) => setDefault(o, i, xo, yo));\n}\n\nfunction setDefaults2(d, xyo) {\n\treturn d.map((o, i) => i == 0 ? {} : assign({}, xyo, o));  // todo: assign() will not merge facet arrays\n}\n\nfunction setDefault(o, i, xo, yo) {\n\treturn assign({}, (i == 0 ? xo : yo), o);\n}\n\nfunction snapNumX(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : [dataMin, dataMax];\n}\n\nconst snapTimeX = snapNumX;\n\n// this ensures that non-temporal/numeric y-axes get multiple-snapped padding added above/below\n// TODO: also account for incrs when snapping to ensure top of axis gets a tick & value\nfunction snapNumY(self, dataMin, dataMax) {\n\treturn dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, rangePad, true);\n}\n\nfunction snapLogY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeLog(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapLogX = snapLogY;\n\nfunction snapAsinhY(self, dataMin, dataMax, scale) {\n\treturn dataMin == null ? nullNullTuple : rangeAsinh(dataMin, dataMax, self.scales[scale].log, false);\n}\n\nconst snapAsinhX = snapAsinhY;\n\n// dim is logical (getClientBoundingRect) pixels, not canvas pixels\nfunction findIncr(minVal, maxVal, incrs, dim, minSpace) {\n\tlet intDigits = max(numIntDigits(minVal), numIntDigits(maxVal));\n\n\tlet delta = maxVal - minVal;\n\n\tlet incrIdx = closestIdx((minSpace / dim) * delta, incrs);\n\n\tdo {\n\t\tlet foundIncr = incrs[incrIdx];\n\t\tlet foundSpace = dim * foundIncr / delta;\n\n\t\tif (foundSpace >= minSpace && intDigits + (foundIncr < 5 ? fixedDec.get(foundIncr) : 0) <= 17)\n\t\t\treturn [foundIncr, foundSpace];\n\t} while (++incrIdx < incrs.length);\n\n\treturn [0, 0];\n}\n\nfunction pxRatioFont(font) {\n\tlet fontSize, fontSizeCss;\n\tfont = font.replace(/(\\d+)px/, (m, p1) => (fontSize = round((fontSizeCss = +p1) * pxRatio)) + 'px');\n\treturn [font, fontSize, fontSizeCss];\n}\n\nfunction syncFontSize(axis) {\n\tif (axis.show) {\n\t\t[axis.font, axis.labelFont].forEach(f => {\n\t\t\tlet size = roundDec(f[2] * pxRatio, 1);\n\t\t\tf[0] = f[0].replace(/[0-9.]+px/, size + 'px');\n\t\t\tf[1] = size;\n\t\t});\n\t}\n}\n\nfunction uPlot(opts, data, then) {\n\tconst self = {\n\t\tmode: ifNull(opts.mode, 1),\n\t};\n\n\tconst mode = self.mode;\n\n\tfunction getHPos(val, scale, dim, off) {\n\t\tlet pct = scale.valToPct(val);\n\t\treturn off + dim * (scale.dir == -1 ? (1 - pct) : pct);\n\t}\n\n\tfunction getVPos(val, scale, dim, off) {\n\t\tlet pct = scale.valToPct(val);\n\t\treturn off + dim * (scale.dir == -1 ? pct : (1 - pct));\n\t}\n\n\tfunction getPos(val, scale, dim, off) {\n\t\treturn scale.ori == 0 ? getHPos(val, scale, dim, off) : getVPos(val, scale, dim, off);\n\t}\n\n\tself.valToPosH = getHPos;\n\tself.valToPosV = getVPos;\n\n\tlet ready = false;\n\tself.status = 0;\n\n\tconst root = self.root = placeDiv(UPLOT);\n\n\tif (opts.id != null)\n\t\troot.id = opts.id;\n\n\taddClass(root, opts.class);\n\n\tif (opts.title) {\n\t\tlet title = placeDiv(TITLE, root);\n\t\ttitle.textContent = opts.title;\n\t}\n\n\tconst can = placeTag(\"canvas\");\n\tconst ctx = self.ctx = can.getContext(\"2d\");\n\n\tconst wrap = placeDiv(WRAP, root);\n\n\ton(\"click\", wrap, e => {\n\t\tif (e.target === over) {\n\t\t\tlet didDrag = mouseLeft1 != mouseLeft0 || mouseTop1 != mouseTop0;\n\t\t\tdidDrag && drag.click(self, e);\n\t\t}\n\t}, true);\n\n\tconst under = self.under = placeDiv(UNDER, wrap);\n\twrap.appendChild(can);\n\tconst over = self.over = placeDiv(OVER, wrap);\n\n\topts = copy(opts);\n\n\tconst pxAlign = +ifNull(opts.pxAlign, 1);\n\n\tconst pxRound = pxRoundGen(pxAlign);\n\n\t(opts.plugins || []).forEach(p => {\n\t\tif (p.opts)\n\t\t\topts = p.opts(self, opts) || opts;\n\t});\n\n\tconst ms = opts.ms || 1e-3;\n\n\tconst series  = self.series = mode == 1 ?\n\t\tsetDefaults(opts.series || [], xSeriesOpts, ySeriesOpts, false) :\n\t\tsetDefaults2(opts.series || [null], xySeriesOpts);\n\tconst axes    = self.axes   = setDefaults(opts.axes   || [], xAxisOpts,   yAxisOpts,    true);\n\tconst scales  = self.scales = {};\n\tconst bands   = self.bands  = opts.bands || [];\n\n\tbands.forEach(b => {\n\t\tb.fill = fnOrSelf(b.fill || null);\n\t\tb.dir = ifNull(b.dir, -1);\n\t});\n\n\tconst xScaleKey = mode == 2 ? series[1].facets[0].scale : series[0].scale;\n\n\tconst drawOrderMap = {\n\t\taxes: drawAxesGrid,\n\t\tseries: drawSeries,\n\t};\n\n\tconst drawOrder = (opts.drawOrder || [\"axes\", \"series\"]).map(key => drawOrderMap[key]);\n\n\tfunction initValToPct(sc) {\n\t\tconst getVal = (\n\t\t\tsc.distr == 3   ? val => log10(val > 0 ? val : sc.clamp(self, val, sc.min, sc.max, sc.key)) :\n\t\t\tsc.distr == 4   ? val => asinh(val, sc.asinh) :\n\t\t\tsc.distr == 100 ? val => sc.fwd(val) :\n\t\t\tval => val\n\t\t);\n\n\t\treturn val => {\n\t\t\tlet _val = getVal(val);\n\t\t\tlet { _min, _max } = sc;\n\t\t\tlet delta = _max - _min;\n\t\t\treturn (_val - _min) / delta;\n\t\t};\n\t}\n\n\tfunction initScale(scaleKey) {\n\t\tlet sc = scales[scaleKey];\n\n\t\tif (sc == null) {\n\t\t\tlet scaleOpts = (opts.scales || EMPTY_OBJ)[scaleKey] || EMPTY_OBJ;\n\n\t\t\tif (scaleOpts.from != null) {\n\t\t\t\t// ensure parent is initialized\n\t\t\t\tinitScale(scaleOpts.from);\n\t\t\t\t// dependent scales inherit\n\t\t\t\tlet sc = assign({}, scales[scaleOpts.from], scaleOpts, {key: scaleKey});\n\t\t\t\tsc.valToPct = initValToPct(sc);\n\t\t\t\tscales[scaleKey] = sc;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsc = scales[scaleKey] = assign({}, (scaleKey == xScaleKey ? xScaleOpts : yScaleOpts), scaleOpts);\n\n\t\t\t\tsc.key = scaleKey;\n\n\t\t\t\tlet isTime = sc.time;\n\n\t\t\t\tlet rn = sc.range;\n\n\t\t\t\tlet rangeIsArr = isArr(rn);\n\n\t\t\t\tif (scaleKey != xScaleKey || (mode == 2 && !isTime)) {\n\t\t\t\t\t// if range array has null limits, it should be auto\n\t\t\t\t\tif (rangeIsArr && (rn[0] == null || rn[1] == null)) {\n\t\t\t\t\t\trn = {\n\t\t\t\t\t\t\tmin: rn[0] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[0],\n\t\t\t\t\t\t\t\tsoft: rn[0],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmax: rn[1] == null ? autoRangePart : {\n\t\t\t\t\t\t\t\tmode: 1,\n\t\t\t\t\t\t\t\thard: rn[1],\n\t\t\t\t\t\t\t\tsoft: rn[1],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t\trangeIsArr = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!rangeIsArr && isObj(rn)) {\n\t\t\t\t\t\tlet cfg = rn;\n\t\t\t\t\t\t// this is similar to snapNumY\n\t\t\t\t\t\trn = (self, dataMin, dataMax) => dataMin == null ? nullNullTuple : rangeNum(dataMin, dataMax, cfg);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsc.range = fnOrSelf(rn || (isTime ? snapTimeX : scaleKey == xScaleKey ?\n\t\t\t\t\t(sc.distr == 3 ? snapLogX : sc.distr == 4 ? snapAsinhX : snapNumX) :\n\t\t\t\t\t(sc.distr == 3 ? snapLogY : sc.distr == 4 ? snapAsinhY : snapNumY)\n\t\t\t\t));\n\n\t\t\t\tsc.auto = fnOrSelf(rangeIsArr ? false : sc.auto);\n\n\t\t\t\tsc.clamp = fnOrSelf(sc.clamp || clampScale);\n\n\t\t\t\t// caches for expensive ops like asinh() & log()\n\t\t\t\tsc._min = sc._max = null;\n\n\t\t\t\tsc.valToPct = initValToPct(sc);\n\t\t\t}\n\t\t}\n\t}\n\n\tinitScale(\"x\");\n\tinitScale(\"y\");\n\n\t// TODO: init scales from facets in mode: 2\n\tif (mode == 1) {\n\t\tseries.forEach(s => {\n\t\t\tinitScale(s.scale);\n\t\t});\n\t}\n\n\taxes.forEach(a => {\n\t\tinitScale(a.scale);\n\t});\n\n\tfor (let k in opts.scales)\n\t\tinitScale(k);\n\n\tconst scaleX = scales[xScaleKey];\n\n\tconst xScaleDistr = scaleX.distr;\n\n\tlet valToPosX, valToPosY;\n\n\tif (scaleX.ori == 0) {\n\t\taddClass(root, ORI_HZ);\n\t\tvalToPosX = getHPos;\n\t\tvalToPosY = getVPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotWid;\n\t\t\txOffCan = plotLft;\n\t\t\tyDimCan = plotHgt;\n\t\t\tyOffCan = plotTop;\n\n\t\t\txDimCss = plotWidCss;\n\t\t\txOffCss = plotLftCss;\n\t\t\tyDimCss = plotHgtCss;\n\t\t\tyOffCss = plotTopCss;\n\t\t};\n\t\t*/\n\t}\n\telse {\n\t\taddClass(root, ORI_VT);\n\t\tvalToPosX = getVPos;\n\t\tvalToPosY = getHPos;\n\t\t/*\n\t\tupdOriDims = () => {\n\t\t\txDimCan = plotHgt;\n\t\t\txOffCan = plotTop;\n\t\t\tyDimCan = plotWid;\n\t\t\tyOffCan = plotLft;\n\n\t\t\txDimCss = plotHgtCss;\n\t\t\txOffCss = plotTopCss;\n\t\t\tyDimCss = plotWidCss;\n\t\t\tyOffCss = plotLftCss;\n\t\t};\n\t\t*/\n\t}\n\n\tconst pendScales = {};\n\n\t// explicitly-set initial scales\n\tfor (let k in scales) {\n\t\tlet sc = scales[k];\n\n\t\tif (sc.min != null || sc.max != null) {\n\t\t\tpendScales[k] = {min: sc.min, max: sc.max};\n\t\t\tsc.min = sc.max = null;\n\t\t}\n\t}\n\n//\tself.tz = opts.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;\n\tconst _tzDate  = (opts.tzDate || (ts => new Date(round(ts / ms))));\n\tconst _fmtDate = (opts.fmtDate || fmtDate);\n\n\tconst _timeAxisSplits = (ms == 1 ? timeAxisSplitsMs(_tzDate) : timeAxisSplitsS(_tzDate));\n\tconst _timeAxisVals   = timeAxisVals(_tzDate, timeAxisStamps((ms == 1 ? _timeAxisStampsMs : _timeAxisStampsS), _fmtDate));\n\tconst _timeSeriesVal  = timeSeriesVal(_tzDate, timeSeriesStamp(_timeSeriesStamp, _fmtDate));\n\n\tconst activeIdxs = [];\n\n\tconst legend     = (self.legend = assign({}, legendOpts, opts.legend));\n\tconst cursor     =                (self.cursor = assign({}, cursorOpts, {drag: {y: mode == 2}}, opts.cursor));\n\tconst showLegend = legend.show;\n\tconst showCursor =                cursor.show;\n\tconst markers    = legend.markers;\n\n\t{\n\t\tlegend.idxs = activeIdxs;\n\n\t\tmarkers.width  = fnOrSelf(markers.width);\n\t\tmarkers.dash   = fnOrSelf(markers.dash);\n\t\tmarkers.stroke = fnOrSelf(markers.stroke);\n\t\tmarkers.fill   = fnOrSelf(markers.fill);\n\t}\n\n\tlet legendTable;\n\tlet legendHead;\n\tlet legendBody;\n\tlet legendRows = [];\n\tlet legendCells = [];\n\tlet legendCols;\n\tlet multiValLegend = false;\n\tlet NULL_LEGEND_VALUES = {};\n\n\tif (legend.live) {\n\t\tconst getMultiVals = series[1] ? series[1].values : null;\n\t\tmultiValLegend = getMultiVals != null;\n\t\tlegendCols = multiValLegend ? getMultiVals(self, 1, 0) : {_: 0};\n\n\t\tfor (let k in legendCols)\n\t\t\tNULL_LEGEND_VALUES[k] = LEGEND_DISP;\n\t}\n\n\tif (showLegend) {\n\t\tlegendTable = placeTag(\"table\", LEGEND, root);\n\t\tlegendBody = placeTag(\"tbody\", null, legendTable);\n\n\t\t// allows legend to be moved out of root\n\t\tlegend.mount(self, legendTable);\n\n\t\tif (multiValLegend) {\n\t\t\tlegendHead = placeTag(\"thead\", null, legendTable, legendBody);\n\n\t\t\tlet head = placeTag(\"tr\", null, legendHead);\n\t\t\tplaceTag(\"th\", null, head);\n\n\t\t\tfor (var key in legendCols)\n\t\t\t\tplaceTag(\"th\", LEGEND_LABEL, head).textContent = key;\n\t\t}\n\t\telse {\n\t\t\taddClass(legendTable, LEGEND_INLINE);\n\t\t\tlegend.live && addClass(legendTable, LEGEND_LIVE);\n\t\t}\n\t}\n\n\tconst son  = {show: true};\n\tconst soff = {show: false};\n\n\tfunction initLegendRow(s, i) {\n\t\tif (i == 0 && (multiValLegend || !legend.live || mode == 2))\n\t\t\treturn nullNullTuple;\n\n\t\tlet cells = [];\n\n\t\tlet row = placeTag(\"tr\", LEGEND_SERIES, legendBody, legendBody.childNodes[i]);\n\n\t\taddClass(row, s.class);\n\n\t\tif (!s.show)\n\t\t\taddClass(row, OFF);\n\n\t\tlet label = placeTag(\"th\", null, row);\n\n\t\tif (markers.show) {\n\t\t\tlet indic = placeDiv(LEGEND_MARKER, label);\n\n\t\t\tif (i > 0) {\n\t\t\t\tlet width  = markers.width(self, i);\n\n\t\t\t\tif (width)\n\t\t\t\t\tindic.style.border = width + \"px \" + markers.dash(self, i) + \" \" + markers.stroke(self, i);\n\n\t\t\t\tindic.style.background = markers.fill(self, i);\n\t\t\t}\n\t\t}\n\n\t\tlet text = placeDiv(LEGEND_LABEL, label);\n\n\t\tif (s.label instanceof HTMLElement)\n\t\t\ttext.appendChild(s.label);\n\t\telse\n\t\t\ttext.textContent = s.label;\n\n\t\tif (i > 0) {\n\t\t\tif (!markers.show)\n\t\t\t\ttext.style.color = s.width > 0 ? markers.stroke(self, i) : markers.fill(self, i);\n\n\t\t\tonMouse(\"click\", label, e => {\n\t\t\t\tif (cursor._lock)\n\t\t\t\t\treturn;\n\n\t\t\t\tsetCursorEvent(e);\n\n\t\t\t\tlet seriesIdx = series.indexOf(s);\n\n\t\t\t\tif ((e.ctrlKey || e.metaKey) != legend.isolate) {\n\t\t\t\t\t// if any other series is shown, isolate this one. else show all\n\t\t\t\t\tlet isolate = series.some((s, i) => i > 0 && i != seriesIdx && s.show);\n\n\t\t\t\t\tseries.forEach((s, i) => {\n\t\t\t\t\t\ti > 0 && setSeries(i, isolate ? (i == seriesIdx ? son : soff) : son, true, syncOpts.setSeries);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tsetSeries(seriesIdx, {show: !s.show}, true, syncOpts.setSeries);\n\t\t\t}, false);\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tonMouse(mouseenter, label, e => {\n\t\t\t\t\tif (cursor._lock)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tsetCursorEvent(e);\n\n\t\t\t\t\tsetSeries(series.indexOf(s), FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t\t\t}, false);\n\t\t\t}\n\t\t}\n\n\t\tfor (var key in legendCols) {\n\t\t\tlet v = placeTag(\"td\", LEGEND_VALUE, row);\n\t\t\tv.textContent = \"--\";\n\t\t\tcells.push(v);\n\t\t}\n\n\t\treturn [row, cells];\n\t}\n\n\tconst mouseListeners = new Map();\n\n\tfunction onMouse(ev, targ, fn, onlyTarg = true) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\t\tconst listener = cursor.bind[ev](self, targ, fn, onlyTarg);\n\n\t\tif (listener) {\n\t\t\ton(ev, targ, targListeners[ev] = listener);\n\t\t\tmouseListeners.set(targ, targListeners);\n\t\t}\n\t}\n\n\tfunction offMouse(ev, targ, fn) {\n\t\tconst targListeners = mouseListeners.get(targ) || {};\n\n\t\tfor (let k in targListeners) {\n\t\t\tif (ev == null || k == ev) {\n\t\t\t\toff(k, targ, targListeners[k]);\n\t\t\t\tdelete targListeners[k];\n\t\t\t}\n\t\t}\n\n\t\tif (ev == null)\n\t\t\tmouseListeners.delete(targ);\n\t}\n\n\tlet fullWidCss = 0;\n\tlet fullHgtCss = 0;\n\n\tlet plotWidCss = 0;\n\tlet plotHgtCss = 0;\n\n\t// plot margins to account for axes\n\tlet plotLftCss = 0;\n\tlet plotTopCss = 0;\n\n\t// previous values for diffing\n\tlet _plotLftCss = plotLftCss;\n\tlet _plotTopCss = plotTopCss;\n\tlet _plotWidCss = plotWidCss;\n\tlet _plotHgtCss = plotHgtCss;\n\n\n\tlet plotLft = 0;\n\tlet plotTop = 0;\n\tlet plotWid = 0;\n\tlet plotHgt = 0;\n\n\tself.bbox = {};\n\n\tlet shouldSetScales = false;\n\tlet shouldSetSize = false;\n\tlet shouldConvergeSize = false;\n\tlet shouldSetCursor = false;\n\tlet shouldSetSelect = false;\n\tlet shouldSetLegend = false;\n\n\tfunction _setSize(width, height, force) {\n\t\tif (force || (width != self.width || height != self.height))\n\t\t\tcalcSize(width, height);\n\n\t\tresetYSeries(false);\n\n\t\tshouldConvergeSize = true;\n\t\tshouldSetSize = true;\n\n\t\tcommit();\n\t}\n\n\tfunction calcSize(width, height) {\n\t//\tlog(\"calcSize()\", arguments);\n\n\t\tself.width  = fullWidCss = plotWidCss = width;\n\t\tself.height = fullHgtCss = plotHgtCss = height;\n\t\tplotLftCss  = plotTopCss = 0;\n\n\t\tcalcPlotRect();\n\t\tcalcAxesRects();\n\n\t\tlet bb = self.bbox;\n\n\t\tplotLft = bb.left   = incrRound(plotLftCss * pxRatio, 0.5);\n\t\tplotTop = bb.top    = incrRound(plotTopCss * pxRatio, 0.5);\n\t\tplotWid = bb.width  = incrRound(plotWidCss * pxRatio, 0.5);\n\t\tplotHgt = bb.height = incrRound(plotHgtCss * pxRatio, 0.5);\n\n\t//\tupdOriDims();\n\t}\n\n\t// ensures size calc convergence\n\tconst CYCLE_LIMIT = 3;\n\n\tfunction convergeSize() {\n\t\tlet converged = false;\n\n\t\tlet cycleNum = 0;\n\n\t\twhile (!converged) {\n\t\t\tcycleNum++;\n\n\t\t\tlet axesConverged = axesCalc(cycleNum);\n\t\t\tlet paddingConverged = paddingCalc(cycleNum);\n\n\t\t\tconverged = cycleNum == CYCLE_LIMIT || (axesConverged && paddingConverged);\n\n\t\t\tif (!converged) {\n\t\t\t\tcalcSize(self.width, self.height);\n\t\t\t\tshouldSetSize = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setSize({width, height}) {\n\t\t_setSize(width, height);\n\t}\n\n\tself.setSize = setSize;\n\n\t// accumulate axis offsets, reduce canvas width\n\tfunction calcPlotRect() {\n\t\t// easements for edge labels\n\t\tlet hasTopAxis = false;\n\t\tlet hasBtmAxis = false;\n\t\tlet hasRgtAxis = false;\n\t\tlet hasLftAxis = false;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet {side, _size} = axis;\n\t\t\t\tlet isVt = side % 2;\n\t\t\t\tlet labelSize = axis.label != null ? axis.labelSize : 0;\n\n\t\t\t\tlet fullSize = _size + labelSize;\n\n\t\t\t\tif (fullSize > 0) {\n\t\t\t\t\tif (isVt) {\n\t\t\t\t\t\tplotWidCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 3) {\n\t\t\t\t\t\t\tplotLftCss += fullSize;\n\t\t\t\t\t\t\thasLftAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasRgtAxis = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplotHgtCss -= fullSize;\n\n\t\t\t\t\t\tif (side == 0) {\n\t\t\t\t\t\t\tplotTopCss += fullSize;\n\t\t\t\t\t\t\thasTopAxis = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\thasBtmAxis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tsidesWithAxes[0] = hasTopAxis;\n\t\tsidesWithAxes[1] = hasRgtAxis;\n\t\tsidesWithAxes[2] = hasBtmAxis;\n\t\tsidesWithAxes[3] = hasLftAxis;\n\n\t\t// hz padding\n\t\tplotWidCss -= _padding[1] + _padding[3];\n\t\tplotLftCss += _padding[3];\n\n\t\t// vt padding\n\t\tplotHgtCss -= _padding[2] + _padding[0];\n\t\tplotTopCss += _padding[0];\n\t}\n\n\tfunction calcAxesRects() {\n\t\t// will accum +\n\t\tlet off1 = plotLftCss + plotWidCss;\n\t\tlet off2 = plotTopCss + plotHgtCss;\n\t\t// will accum -\n\t\tlet off3 = plotLftCss;\n\t\tlet off0 = plotTopCss;\n\n\t\tfunction incrOffset(side, size) {\n\t\t\tswitch (side) {\n\t\t\t\tcase 1: off1 += size; return off1 - size;\n\t\t\t\tcase 2: off2 += size; return off2 - size;\n\t\t\t\tcase 3: off3 -= size; return off3 + size;\n\t\t\t\tcase 0: off0 -= size; return off0 + size;\n\t\t\t}\n\t\t}\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (axis.show && axis._show) {\n\t\t\t\tlet side = axis.side;\n\n\t\t\t\taxis._pos = incrOffset(side, axis._size);\n\n\t\t\t\tif (axis.label != null)\n\t\t\t\t\taxis._lpos = incrOffset(side, axis.labelSize);\n\t\t\t}\n\t\t});\n\t}\n\n\tif (cursor.dataIdx == null) {\n\t\tlet hov = cursor.hover;\n\n\t\tlet skip = hov.skip = new Set(hov.skip ?? []);\n\t\tskip.add(void 0); // alignment artifacts\n\t\tlet prox = hov.prox = fnOrSelf(hov.prox);\n\t\tlet bias = hov.bias ??= 0;\n\n\t\t// TODO: only scan between in-view idxs (i0, i1)\n\t\tcursor.dataIdx = (self, seriesIdx, cursorIdx, valAtPosX) => {\n\t\t\tif (seriesIdx == 0)\n\t\t\t\treturn cursorIdx;\n\n\t\t\tlet idx2 = cursorIdx;\n\n\t\t\tlet _prox = prox(self, seriesIdx, cursorIdx, valAtPosX) ?? inf;\n\t\t\tlet withProx = _prox >= 0 && _prox < inf;\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\t\tlet cursorLft = cursor.left;\n\n\t\t\tlet xValues = data[0];\n\t\t\tlet yValues = data[seriesIdx];\n\n\t\t\tif (skip.has(yValues[cursorIdx])) {\n\t\t\t\tidx2 = null;\n\n\t\t\t\tlet nonNullLft = null,\n\t\t\t\t\tnonNullRgt = null,\n\t\t\t\t\tj;\n\n\t\t\t\tif (bias == 0 || bias == -1) {\n\t\t\t\t\tj = cursorIdx;\n\t\t\t\t\twhile (nonNullLft == null && j-- > 0) {\n\t\t\t\t\t\tif (!skip.has(yValues[j]))\n\t\t\t\t\t\t\tnonNullLft = j;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (bias == 0 || bias == 1) {\n\t\t\t\t\tj = cursorIdx;\n\t\t\t\t\twhile (nonNullRgt == null && j++ < yValues.length) {\n\t\t\t\t\t\tif (!skip.has(yValues[j]))\n\t\t\t\t\t\t\tnonNullRgt = j;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nonNullLft != null || nonNullRgt != null) {\n\t\t\t\t\tif (withProx) {\n\t\t\t\t\t\tlet lftPos = nonNullLft == null ? -Infinity : valToPosX(xValues[nonNullLft], scaleX, xDim, 0);\n\t\t\t\t\t\tlet rgtPos = nonNullRgt == null ?  Infinity : valToPosX(xValues[nonNullRgt], scaleX, xDim, 0);\n\n\t\t\t\t\t\tlet lftDelta = cursorLft - lftPos;\n\t\t\t\t\t\tlet rgtDelta = rgtPos - cursorLft;\n\n\t\t\t\t\t\tif (lftDelta <= rgtDelta) {\n\t\t\t\t\t\t\tif (lftDelta <= _prox)\n\t\t\t\t\t\t\t\tidx2 = nonNullLft;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (rgtDelta <= _prox)\n\t\t\t\t\t\t\t\tidx2 = nonNullRgt;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tidx2 =\n\t\t\t\t\t\t\tnonNullRgt == null ? nonNullLft :\n\t\t\t\t\t\t\tnonNullLft == null ? nonNullRgt :\n\t\t\t\t\t\t\tcursorIdx - nonNullLft <= nonNullRgt - cursorIdx ? nonNullLft : nonNullRgt;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (withProx) {\n\t\t\t\tlet dist = abs(cursorLft - valToPosX(xValues[cursorIdx], scaleX, xDim, 0));\n\n\t\t\t\tif (dist > _prox)\n\t\t\t\t\tidx2 = null;\n\t\t\t}\n\n\t\t\treturn idx2;\n\t\t};\n\t}\n\n\tconst setCursorEvent = e => { cursor.event = e; };\n\n\tcursor.idxs = activeIdxs;\n\n\tcursor._lock = false;\n\n\tlet points = cursor.points;\n\n\tpoints.show   = fnOrSelf(points.show);\n\tpoints.size   = fnOrSelf(points.size);\n\tpoints.stroke = fnOrSelf(points.stroke);\n\tpoints.width  = fnOrSelf(points.width);\n\tpoints.fill   = fnOrSelf(points.fill);\n\n\tconst focus = self.focus = assign({}, opts.focus || {alpha: 0.3}, cursor.focus);\n\n\tconst cursorFocus = focus.prox >= 0;\n\tconst cursorOnePt = cursorFocus && points.one;\n\n\t// series-intersection markers\n\tlet cursorPts = [];\n\t// position caches in CSS pixels\n\tlet cursorPtsLft = [];\n\tlet cursorPtsTop = [];\n\n\tfunction initCursorPt(s, si) {\n\t\tlet pt = points.show(self, si);\n\n\t\tif (pt instanceof HTMLElement) {\n\t\t\taddClass(pt, CURSOR_PT);\n\t\t\taddClass(pt, s.class);\n\t\t\telTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\tover.insertBefore(pt, cursorPts[si]);\n\n\t\t\treturn pt;\n\t\t}\n\t}\n\n\tfunction initSeries(s, i) {\n\t\tif (mode == 1 || i > 0) {\n\t\t\tlet isTime = mode == 1 && scales[s.scale].time;\n\n\t\t\tlet sv = s.value;\n\t\t\ts.value = isTime ? (isStr(sv) ? timeSeriesVal(_tzDate, timeSeriesStamp(sv, _fmtDate)) : sv || _timeSeriesVal) : sv || numSeriesVal;\n\t\t\ts.label = s.label || (isTime ? timeSeriesLabel : numSeriesLabel);\n\t\t}\n\n\t\tif (cursorOnePt || i > 0) {\n\t\t\ts.width  = s.width == null ? 1 : s.width;\n\t\t\ts.paths  = s.paths || linearPath || retNull;\n\t\t\ts.fillTo = fnOrSelf(s.fillTo || seriesFillTo);\n\t\t\ts.pxAlign = +ifNull(s.pxAlign, pxAlign);\n\t\t\ts.pxRound = pxRoundGen(s.pxAlign);\n\n\t\t\ts.stroke = fnOrSelf(s.stroke || null);\n\t\t\ts.fill   = fnOrSelf(s.fill || null);\n\t\t\ts._stroke = s._fill = s._paths = s._focus = null;\n\n\t\t\tlet _ptDia = ptDia(max(1, s.width), 1);\n\t\t\tlet points = s.points = assign({}, {\n\t\t\t\tsize: _ptDia,\n\t\t\t\twidth: max(1, _ptDia * .2),\n\t\t\t\tstroke: s.stroke,\n\t\t\t\tspace: _ptDia * 2,\n\t\t\t\tpaths: pointsPath,\n\t\t\t\t_stroke: null,\n\t\t\t\t_fill: null,\n\t\t\t}, s.points);\n\t\t\tpoints.show   = fnOrSelf(points.show);\n\t\t\tpoints.filter = fnOrSelf(points.filter);\n\t\t\tpoints.fill   = fnOrSelf(points.fill);\n\t\t\tpoints.stroke = fnOrSelf(points.stroke);\n\t\t\tpoints.paths  = fnOrSelf(points.paths);\n\t\t\tpoints.pxAlign = s.pxAlign;\n\t\t}\n\n\t\tif (showLegend) {\n\t\t\tlet rowCells = initLegendRow(s, i);\n\t\t\tlegendRows.splice(i, 0, rowCells[0]);\n\t\t\tlegendCells.splice(i, 0, rowCells[1]);\n\t\t\tlegend.values.push(null);\t// NULL_LEGEND_VALS not yet avil here :(\n\t\t}\n\n\t\tif (showCursor) {\n\t\t\tactiveIdxs.splice(i, 0, null);\n\n\t\t\tlet pt = null;\n\n\t\t\tif (cursorOnePt) {\n\t\t\t\tif (i == 0)\n\t\t\t\t\tpt = initCursorPt(s, i);\n\t\t\t}\n\t\t\telse if (i > 0)\n\t\t\t\tpt = initCursorPt(s, i);\n\n\t\t\tcursorPts.splice(i, 0, pt);\n\t\t\tcursorPtsLft.splice(i, 0, 0);\n\t\t\tcursorPtsTop.splice(i, 0, 0);\n\t\t}\n\n\t\tfire(\"addSeries\", i);\n\t}\n\n\tfunction addSeries(opts, si) {\n\t\tsi = si == null ? series.length : si;\n\n\t\topts = mode == 1 ? setDefault(opts, si, xSeriesOpts, ySeriesOpts) : setDefault(opts, si, {}, xySeriesOpts);\n\n\t\tseries.splice(si, 0, opts);\n\t\tinitSeries(series[si], si);\n\t}\n\n\tself.addSeries = addSeries;\n\n\tfunction delSeries(i) {\n\t\tseries.splice(i, 1);\n\n\t\tif (showLegend) {\n\t\t\tlegend.values.splice(i, 1);\n\n\t\t\tlegendCells.splice(i, 1);\n\t\t\tlet tr = legendRows.splice(i, 1)[0];\n\t\t\toffMouse(null, tr.firstChild);\n\t\t\ttr.remove();\n\t\t}\n\n\t\tif (showCursor) {\n\t\t\tactiveIdxs.splice(i, 1);\n\t\t\tcursorPts.splice(i, 1)[0].remove();\n\t\t\tcursorPtsLft.splice(i, 1);\n\t\t\tcursorPtsTop.splice(i, 1);\n\t\t}\n\n\t\t// TODO: de-init no-longer-needed scales?\n\n\t\tfire(\"delSeries\", i);\n\t}\n\n\tself.delSeries = delSeries;\n\n\tconst sidesWithAxes = [false, false, false, false];\n\n\tfunction initAxis(axis, i) {\n\t\taxis._show = axis.show;\n\n\t\tif (axis.show) {\n\t\t\tlet isVt = axis.side % 2;\n\n\t\t\tlet sc = scales[axis.scale];\n\n\t\t\t// this can occur if all series specify non-default scales\n\t\t\tif (sc == null) {\n\t\t\t\taxis.scale = isVt ? series[1].scale : xScaleKey;\n\t\t\t\tsc = scales[axis.scale];\n\t\t\t}\n\n\t\t\t// also set defaults for incrs & values based on axis distr\n\t\t\tlet isTime = sc.time;\n\n\t\t\taxis.size   = fnOrSelf(axis.size);\n\t\t\taxis.space  = fnOrSelf(axis.space);\n\t\t\taxis.rotate = fnOrSelf(axis.rotate);\n\n\t\t\tif (isArr(axis.incrs)) {\n\t\t\t\taxis.incrs.forEach(incr => {\n\t\t\t\t\t!fixedDec.has(incr) && fixedDec.set(incr, guessDec(incr));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\taxis.incrs  = fnOrSelf(axis.incrs  || (          sc.distr == 2 ? wholeIncrs : (isTime ? (ms == 1 ? timeIncrsMs : timeIncrsS) : numIncrs)));\n\t\t\taxis.splits = fnOrSelf(axis.splits || (isTime && sc.distr == 1 ? _timeAxisSplits : sc.distr == 3 ? logAxisSplits : sc.distr == 4 ? asinhAxisSplits : numAxisSplits));\n\n\t\t\taxis.stroke        = fnOrSelf(axis.stroke);\n\t\t\taxis.grid.stroke   = fnOrSelf(axis.grid.stroke);\n\t\t\taxis.ticks.stroke  = fnOrSelf(axis.ticks.stroke);\n\t\t\taxis.border.stroke = fnOrSelf(axis.border.stroke);\n\n\t\t\tlet av = axis.values;\n\n\t\t\taxis.values = (\n\t\t\t\t// static array of tick values\n\t\t\t\tisArr(av) && !isArr(av[0]) ? fnOrSelf(av) :\n\t\t\t\t// temporal\n\t\t\t\tisTime ? (\n\t\t\t\t\t// config array of fmtDate string tpls\n\t\t\t\t\tisArr(av) ?\n\t\t\t\t\t\ttimeAxisVals(_tzDate, timeAxisStamps(av, _fmtDate)) :\n\t\t\t\t\t// fmtDate string tpl\n\t\t\t\t\tisStr(av) ?\n\t\t\t\t\t\ttimeAxisVal(_tzDate, av) :\n\t\t\t\t\tav || _timeAxisVals\n\t\t\t\t) : av || numAxisVals\n\t\t\t);\n\n\t\t\taxis.filter = fnOrSelf(axis.filter || (          sc.distr >= 3 && sc.log == 10 ? log10AxisValsFilt : sc.distr == 3 && sc.log == 2 ? log2AxisValsFilt : retArg1));\n\n\t\t\taxis.font      = pxRatioFont(axis.font);\n\t\t\taxis.labelFont = pxRatioFont(axis.labelFont);\n\n\t\t\taxis._size   = axis.size(self, null, i, 0);\n\n\t\t\taxis._space  =\n\t\t\taxis._rotate =\n\t\t\taxis._incrs  =\n\t\t\taxis._found  =\t// foundIncrSpace\n\t\t\taxis._splits =\n\t\t\taxis._values = null;\n\n\t\t\tif (axis._size > 0) {\n\t\t\t\tsidesWithAxes[i] = true;\n\t\t\t\taxis._el = placeDiv(AXIS, wrap);\n\t\t\t}\n\n\t\t\t// debug\n\t\t//\taxis._el.style.background = \"#\"  + Math.floor(Math.random()*16777215).toString(16) + '80';\n\t\t}\n\t}\n\n\tfunction autoPadSide(self, side, sidesWithAxes, cycleNum) {\n\t\tlet [hasTopAxis, hasRgtAxis, hasBtmAxis, hasLftAxis] = sidesWithAxes;\n\n\t\tlet ori = side % 2;\n\t\tlet size = 0;\n\n\t\tif (ori == 0 && (hasLftAxis || hasRgtAxis))\n\t\t\tsize = (side == 0 && !hasTopAxis || side == 2 && !hasBtmAxis ? round(xAxisOpts.size / 3) : 0);\n\t\tif (ori == 1 && (hasTopAxis || hasBtmAxis))\n\t\t\tsize = (side == 1 && !hasRgtAxis || side == 3 && !hasLftAxis ? round(yAxisOpts.size / 2) : 0);\n\n\t\treturn size;\n\t}\n\n\tconst padding = self.padding = (opts.padding || [autoPadSide,autoPadSide,autoPadSide,autoPadSide]).map(p => fnOrSelf(ifNull(p, autoPadSide)));\n\tconst _padding = self._padding = padding.map((p, i) => p(self, i, sidesWithAxes, 0));\n\n\tlet dataLen;\n\n\t// rendered data window\n\tlet i0 = null;\n\tlet i1 = null;\n\tconst idxs = mode == 1 ? series[0].idxs : null;\n\n\tlet data0 = null;\n\n\tlet viaAutoScaleX = false;\n\n\tfunction setData(_data, _resetScales) {\n\t\tdata = _data == null ? [] : _data;\n\n\t\tself.data = self._data = data;\n\n\t\tif (mode == 2) {\n\t\t\tdataLen = 0;\n\t\t\tfor (let i = 1; i < series.length; i++)\n\t\t\t\tdataLen += data[i][0].length;\n\t\t}\n\t\telse {\n\t\t\tif (data.length == 0)\n\t\t\t\tself.data = self._data = data = [[]];\n\n\t\t\tdata0 = data[0];\n\t\t\tdataLen = data0.length;\n\n\t\t\tlet scaleData = data;\n\n\t\t\tif (xScaleDistr == 2) {\n\t\t\t\tscaleData = data.slice();\n\n\t\t\t\tlet _data0 = scaleData[0] = Array(dataLen);\n\t\t\t\tfor (let i = 0; i < dataLen; i++)\n\t\t\t\t\t_data0[i] = i;\n\t\t\t}\n\n\t\t\tself._data = data = scaleData;\n\t\t}\n\n\t\tresetYSeries(true);\n\n\t\tfire(\"setData\");\n\n\t\t// forces x axis tick values to re-generate when neither x scale nor y scale changes\n\t\t// in ordinal mode, scale range is by index, so will not change if new data has same length, but tick values are from data\n\t\tif (xScaleDistr == 2) {\n\t\t\tshouldConvergeSize = true;\n\n\t\t\t/* or somewhat cheaper, and uglier:\n\t\t\tif (ready) {\n\t\t\t\t// logic extracted from axesCalc()\n\t\t\t\tlet i = 0;\n\t\t\t\tlet axis = axes[i];\n\t\t\t\tlet _splits = axis._splits.map(i => data0[i]);\n\t\t\t\tlet [_incr, _space] = axis._found;\n\t\t\t\tlet incr = data0[_splits[1]] - data0[_splits[0]];\n\t\t\t\taxis._values = axis.values(self, axis.filter(self, _splits, i, _space, incr), i, _space, incr);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\n\t\tif (_resetScales !== false) {\n\t\t\tlet xsc = scaleX;\n\n\t\t\tif (xsc.auto(self, viaAutoScaleX))\n\t\t\t\tautoScaleX();\n\t\t\telse\n\t\t\t\t_setScale(xScaleKey, xsc.min, xsc.max);\n\n\t\t\tshouldSetCursor = shouldSetCursor || cursor.left >= 0;\n\t\t\tshouldSetLegend = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setData = setData;\n\n\tfunction autoScaleX() {\n\t\tviaAutoScaleX = true;\n\n\t\tlet _min, _max;\n\n\t\tif (mode == 1) {\n\t\t\tif (dataLen > 0) {\n\t\t\t\ti0 = idxs[0] = 0;\n\t\t\t\ti1 = idxs[1] = dataLen - 1;\n\n\t\t\t\t_min = data[0][i0];\n\t\t\t\t_max = data[0][i1];\n\n\t\t\t\tif (xScaleDistr == 2) {\n\t\t\t\t\t_min = i0;\n\t\t\t\t\t_max = i1;\n\t\t\t\t}\n\t\t\t\telse if (_min == _max) {\n\t\t\t\t\tif (xScaleDistr == 3)\n\t\t\t\t\t\t[_min, _max] = rangeLog(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (xScaleDistr == 4)\n\t\t\t\t\t\t[_min, _max] = rangeAsinh(_min, _min, scaleX.log, false);\n\t\t\t\t\telse if (scaleX.time)\n\t\t\t\t\t\t_max = _min + round(86400 / ms);\n\t\t\t\t\telse\n\t\t\t\t\t\t[_min, _max] = rangeNum(_min, _max, rangePad, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ti0 = idxs[0] = _min = null;\n\t\t\t\ti1 = idxs[1] = _max = null;\n\t\t\t}\n\t\t}\n\n\t\t_setScale(xScaleKey, _min, _max);\n\t}\n\n\tlet ctxStroke, ctxFill, ctxWidth, ctxDash, ctxJoin, ctxCap, ctxFont, ctxAlign, ctxBaseline;\n\tlet ctxAlpha;\n\n\tfunction setCtxStyle(stroke, width, dash, cap, fill, join) {\n\t\tstroke ??= transparent;\n\t\tdash   ??= EMPTY_ARR;\n\t\tcap    ??= \"butt\"; // (\u203F|\u203F)\n\t\tfill   ??= transparent;\n\t\tjoin   ??= \"round\";\n\n\t\tif (stroke != ctxStroke)\n\t\t\tctx.strokeStyle = ctxStroke = stroke;\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (width != ctxWidth)\n\t\t\tctx.lineWidth = ctxWidth = width;\n\t\tif (join != ctxJoin)\n\t\t\tctx.lineJoin = ctxJoin = join;\n\t\tif (cap != ctxCap)\n\t\t\tctx.lineCap = ctxCap = cap;\n\t\tif (dash != ctxDash)\n\t\t\tctx.setLineDash(ctxDash = dash);\n\t}\n\n\tfunction setFontStyle(font, fill, align, baseline) {\n\t\tif (fill != ctxFill)\n\t\t\tctx.fillStyle = ctxFill = fill;\n\t\tif (font != ctxFont)\n\t\t\tctx.font = ctxFont = font;\n\t\tif (align != ctxAlign)\n\t\t\tctx.textAlign = ctxAlign = align;\n\t\tif (baseline != ctxBaseline)\n\t\t\tctx.textBaseline = ctxBaseline = baseline;\n\t}\n\n\tfunction accScale(wsc, psc, facet, data, sorted = 0) {\n\t\tif (data.length > 0 && wsc.auto(self, viaAutoScaleX) && (psc == null || psc.min == null)) {\n\t\t\tlet _i0 = ifNull(i0, 0);\n\t\t\tlet _i1 = ifNull(i1, data.length - 1);\n\n\t\t\t// only run getMinMax() for invalidated series data, else reuse\n\t\t\tlet minMax = facet.min == null ? getMinMax(data, _i0, _i1, sorted, wsc.distr == 3) : [facet.min, facet.max];\n\n\t\t\t// initial min/max\n\t\t\twsc.min = min(wsc.min, facet.min = minMax[0]);\n\t\t\twsc.max = max(wsc.max, facet.max = minMax[1]);\n\t\t}\n\t}\n\n\tconst AUTOSCALE = {min: null, max: null};\n\n\tfunction setScales() {\n\t//\tlog(\"setScales()\", arguments);\n\n\t\t// implicitly add auto scales, and unranged scales\n\t\tfor (let k in scales) {\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (pendScales[k] == null &&\n\t\t\t\t(\n\t\t\t\t\t// scales that have never been set (on init)\n\t\t\t\t\tsc.min == null ||\n\t\t\t\t\t// or auto scales when the x scale was explicitly set\n\t\t\t\t\tpendScales[xScaleKey] != null && sc.auto(self, viaAutoScaleX)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tpendScales[k] = AUTOSCALE;\n\t\t\t}\n\t\t}\n\n\t\t// implicitly add dependent scales\n\t\tfor (let k in scales) {\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (pendScales[k] == null && sc.from != null && pendScales[sc.from] != null)\n\t\t\t\tpendScales[k] = AUTOSCALE;\n\t\t}\n\n\t\t// explicitly setting the x-scale invalidates everything (acts as redraw)\n\t\tif (pendScales[xScaleKey] != null)\n\t\t\tresetYSeries(true); // TODO: only reset series on auto scales?\n\n\t\tlet wipScales = {};\n\n\t\tfor (let k in pendScales) {\n\t\t\tlet psc = pendScales[k];\n\n\t\t\tif (psc != null) {\n\t\t\t\tlet wsc = wipScales[k] = copy(scales[k], fastIsObj);\n\n\t\t\t\tif (psc.min != null)\n\t\t\t\t\tassign(wsc, psc);\n\t\t\t\telse if (k != xScaleKey || mode == 2) {\n\t\t\t\t\tif (dataLen == 0 && wsc.from == null) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, null, null, k);\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\twsc.min = inf;\n\t\t\t\t\t\twsc.max = -inf;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (dataLen > 0) {\n\t\t\t// pre-range y-scales from y series' data values\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 1) {\n\t\t\t\t\tlet k = s.scale;\n\t\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\t\tif (psc == null)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tlet wsc = wipScales[k];\n\n\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\tlet minMax = wsc.range(self, wsc.min, wsc.max, k);\n\n\t\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\t\twsc.max = minMax[1];\n\n\t\t\t\t\t\ti0 = closestIdx(wsc.min, data[0]);\n\t\t\t\t\t\ti1 = closestIdx(wsc.max, data[0]);\n\n\t\t\t\t\t\t// don't try to contract same or adjacent idxs\n\t\t\t\t\t\tif (i1 - i0 > 1) {\n\t\t\t\t\t\t\t// closest indices can be outside of view\n\t\t\t\t\t\t\tif (data[0][i0] < wsc.min)\n\t\t\t\t\t\t\t\ti0++;\n\t\t\t\t\t\t\tif (data[0][i1] > wsc.max)\n\t\t\t\t\t\t\t\ti1--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ts.min = data0[i0];\n\t\t\t\t\t\ts.max = data0[i1];\n\t\t\t\t\t}\n\t\t\t\t\telse if (s.show && s.auto)\n\t\t\t\t\t\taccScale(wsc, psc, s, data[i], s.sorted);\n\n\t\t\t\t\ts.idxs[0] = i0;\n\t\t\t\t\ts.idxs[1] = i1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\tif (s.show && s.auto) {\n\t\t\t\t\t\t\t// TODO: only handles, assumes and requires facets[0] / 'x' scale, and facets[1] / 'y' scale\n\t\t\t\t\t\t\tlet [ xFacet, yFacet ] = s.facets;\n\t\t\t\t\t\t\tlet xScaleKey = xFacet.scale;\n\t\t\t\t\t\t\tlet yScaleKey = yFacet.scale;\n\t\t\t\t\t\t\tlet [ xData, yData ] = data[i];\n\n\t\t\t\t\t\t\tlet wscx = wipScales[xScaleKey];\n\t\t\t\t\t\t\tlet wscy = wipScales[yScaleKey];\n\n\t\t\t\t\t\t\t// null can happen when only x is zoomed, but y has static range and doesnt get auto-added to pending\n\t\t\t\t\t\t\twscx != null && accScale(wscx, pendScales[xScaleKey], xFacet, xData, xFacet.sorted);\n\t\t\t\t\t\t\twscy != null && accScale(wscy, pendScales[yScaleKey], yFacet, yData, yFacet.sorted);\n\n\t\t\t\t\t\t\t// temp\n\t\t\t\t\t\t\ts.min = yFacet.min;\n\t\t\t\t\t\t\ts.max = yFacet.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// range independent scales\n\t\t\tfor (let k in wipScales) {\n\t\t\t\tlet wsc = wipScales[k];\n\t\t\t\tlet psc = pendScales[k];\n\n\t\t\t\tif (wsc.from == null && (psc == null || psc.min == null)) {\n\t\t\t\t\tlet minMax = wsc.range(\n\t\t\t\t\t\tself,\n\t\t\t\t\t\twsc.min ==  inf ? null : wsc.min,\n\t\t\t\t\t\twsc.max == -inf ? null : wsc.max,\n\t\t\t\t\t\tk\n\t\t\t\t\t);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// range dependent scales\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\n\t\t\tif (wsc.from != null) {\n\t\t\t\tlet base = wipScales[wsc.from];\n\n\t\t\t\tif (base.min == null)\n\t\t\t\t\twsc.min = wsc.max = null;\n\t\t\t\telse {\n\t\t\t\t\tlet minMax = wsc.range(self, base.min, base.max, k);\n\t\t\t\t\twsc.min = minMax[0];\n\t\t\t\t\twsc.max = minMax[1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet changed = {};\n\t\tlet anyChanged = false;\n\n\t\tfor (let k in wipScales) {\n\t\t\tlet wsc = wipScales[k];\n\t\t\tlet sc = scales[k];\n\n\t\t\tif (sc.min != wsc.min || sc.max != wsc.max) {\n\t\t\t\tsc.min = wsc.min;\n\t\t\t\tsc.max = wsc.max;\n\n\t\t\t\tlet distr = sc.distr;\n\n\t\t\t\tsc._min = distr == 3 ? log10(sc.min) : distr == 4 ? asinh(sc.min, sc.asinh) : distr == 100 ? sc.fwd(sc.min) : sc.min;\n\t\t\t\tsc._max = distr == 3 ? log10(sc.max) : distr == 4 ? asinh(sc.max, sc.asinh) : distr == 100 ? sc.fwd(sc.max) : sc.max;\n\n\t\t\t\tchanged[k] = anyChanged = true;\n\t\t\t}\n\t\t}\n\n\t\tif (anyChanged) {\n\t\t\t// invalidate paths of all series on changed scales\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (mode == 2) {\n\t\t\t\t\tif (i > 0 && changed.y)\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (changed[s.scale])\n\t\t\t\t\t\ts._paths = null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor (let k in changed) {\n\t\t\t\tshouldConvergeSize = true;\n\t\t\t\tfire(\"setScale\", k);\n\t\t\t}\n\n\t\t\tif (showCursor && cursor.left >= 0)\n\t\t\t\tshouldSetCursor = shouldSetLegend = true;\n\t\t}\n\n\t\tfor (let k in pendScales)\n\t\t\tpendScales[k] = null;\n\t}\n\n\t// grabs the nearest indices with y data outside of x-scale limits\n\tfunction getOuterIdxs(ydata) {\n\t\tlet _i0 = clamp(i0 - 1, 0, dataLen - 1);\n\t\tlet _i1 = clamp(i1 + 1, 0, dataLen - 1);\n\n\t\twhile (ydata[_i0] == null && _i0 > 0)\n\t\t\t_i0--;\n\n\t\twhile (ydata[_i1] == null && _i1 < dataLen - 1)\n\t\t\t_i1++;\n\n\t\treturn [_i0, _i1];\n\t}\n\n\tfunction drawSeries() {\n\t\tif (dataLen > 0) {\n\t\t\tlet shouldAlpha = series.some(s => s._focus) && ctxAlpha != focus.alpha;\n\n\t\t\tif (shouldAlpha)\n\t\t\t\tctx.globalAlpha = ctxAlpha = focus.alpha;\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tcacheStrokeFill(i, false);\n\t\t\t\t\tcacheStrokeFill(i, true);\n\n\t\t\t\t\tif (s._paths == null) {\n\t\t\t\t\t\tlet _ctxAlpha = ctxAlpha;\n\n\t\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\t\tlet _idxs = mode == 2 ? [0, data[i][0].length - 1] : getOuterIdxs(data[i]);\n\t\t\t\t\t\ts._paths = s.paths(self, i, _idxs[0], _idxs[1]);\n\n\t\t\t\t\t\tif (ctxAlpha != _ctxAlpha)\n\t\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = _ctxAlpha;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tseries.forEach((s, i) => {\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet _ctxAlpha = ctxAlpha;\n\n\t\t\t\t\tif (ctxAlpha != s.alpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = s.alpha;\n\n\t\t\t\t\ts._paths != null && drawPath(i, false);\n\n\t\t\t\t\t{\n\t\t\t\t\t\tlet _gaps = s._paths != null ? s._paths.gaps : null;\n\n\t\t\t\t\t\tlet show = s.points.show(self, i, i0, i1, _gaps);\n\t\t\t\t\t\tlet idxs = s.points.filter(self, i, show, _gaps);\n\n\t\t\t\t\t\tif (show || idxs) {\n\t\t\t\t\t\t\ts.points._paths = s.points.paths(self, i, i0, i1, idxs);\n\t\t\t\t\t\t\tdrawPath(i, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctxAlpha != _ctxAlpha)\n\t\t\t\t\t\tctx.globalAlpha = ctxAlpha = _ctxAlpha;\n\n\t\t\t\t\tfire(\"drawSeries\", i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (shouldAlpha)\n\t\t\t\tctx.globalAlpha = ctxAlpha = 1;\n\t\t}\n\t}\n\n\tfunction cacheStrokeFill(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\ts._stroke = s.stroke(self, si);\n\t\ts._fill   = s.fill(self, si);\n\t}\n\n\tfunction drawPath(si, _points) {\n\t\tlet s = _points ? series[si].points : series[si];\n\n\t\tlet {\n\t\t\tstroke,\n\t\t\tfill,\n\t\t\tclip: gapsClip,\n\t\t\tflags,\n\n\t\t\t_stroke: strokeStyle = s._stroke,\n\t\t\t_fill:   fillStyle   = s._fill,\n\t\t\t_width:  width       = s.width,\n\t\t} = s._paths;\n\n\t\twidth = roundDec(width * pxRatio, 3);\n\n\t\tlet boundsClip = null;\n\t\tlet offset = (width % 2) / 2;\n\n\t\tif (_points && fillStyle == null)\n\t\t\tfillStyle = width > 0 ? \"#fff\" : strokeStyle;\n\n\t\tlet _pxAlign = s.pxAlign == 1 && offset > 0;\n\n\t\t_pxAlign && ctx.translate(offset, offset);\n\n\t\tif (!_points) {\n\t\t\tlet lft = plotLft - width / 2,\n\t\t\t\ttop = plotTop - width / 2,\n\t\t\t\twid = plotWid + width,\n\t\t\t\thgt = plotHgt + width;\n\n\t\t\tboundsClip = new Path2D();\n\t\t\tboundsClip.rect(lft, top, wid, hgt);\n\t\t}\n\n\t\t// the points pathbuilder's gapsClip is its boundsClip, since points dont need gaps clipping, and bounds depend on point size\n\t\tif (_points)\n\t\t\tstrokeFill(strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, gapsClip);\n\t\telse\n\t\t\tfillStroke(si, strokeStyle, width, s.dash, s.cap, fillStyle, stroke, fill, flags, boundsClip, gapsClip);\n\n\t\t_pxAlign && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction fillStroke(si, strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip) {\n\t\tlet didStrokeFill = false;\n\n\t\t// for all bands where this series is the top edge, create upwards clips using the bottom edges\n\t\t// and apply clips + fill with band fill or dfltFill\n\t\tflags != 0 && bands.forEach((b, bi) => {\n\t\t\t// isUpperEdge?\n\t\t\tif (b.series[0] == si) {\n\t\t\t\tlet lowerEdge = series[b.series[1]];\n\t\t\t\tlet lowerData = data[b.series[1]];\n\n\t\t\t\tlet bandClip = (lowerEdge._paths || EMPTY_OBJ).band;\n\n\t\t\t\tif (isArr(bandClip))\n\t\t\t\t\tbandClip = b.dir == 1 ? bandClip[0] : bandClip[1];\n\n\t\t\t\tlet gapsClip2;\n\n\t\t\t\tlet _fillStyle = null;\n\n\t\t\t\t// hasLowerEdge?\n\t\t\t\tif (lowerEdge.show && bandClip && hasData(lowerData, i0, i1)) {\n\t\t\t\t\t_fillStyle = b.fill(self, bi) || fillStyle;\n\t\t\t\t\tgapsClip2 = lowerEdge._paths.clip;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tbandClip = null;\n\n\t\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, _fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip);\n\n\t\t\t\tdidStrokeFill = true;\n\t\t\t}\n\t\t});\n\n\t\tif (!didStrokeFill)\n\t\t\tstrokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip);\n\t}\n\n\tconst CLIP_FILL_STROKE = BAND_CLIP_FILL | BAND_CLIP_STROKE;\n\n\tfunction strokeFill(strokeStyle, lineWidth, lineDash, lineCap, fillStyle, strokePath, fillPath, flags, boundsClip, gapsClip, gapsClip2, bandClip) {\n\t\tsetCtxStyle(strokeStyle, lineWidth, lineDash, lineCap, fillStyle);\n\n\t\tif (boundsClip || gapsClip || bandClip) {\n\t\t\tctx.save();\n\t\t\tboundsClip && ctx.clip(boundsClip);\n\t\t\tgapsClip && ctx.clip(gapsClip);\n\t\t}\n\n\t\tif (bandClip) {\n\t\t\tif ((flags & CLIP_FILL_STROKE) == CLIP_FILL_STROKE) {\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_STROKE) {\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t\telse if (flags & BAND_CLIP_FILL) {\n\t\t\t\tctx.save();\n\t\t\t\tctx.clip(bandClip);\n\t\t\t\tgapsClip2 && ctx.clip(gapsClip2);\n\t\t\t\tdoFill(fillStyle, fillPath);\n\t\t\t\tctx.restore();\n\t\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdoFill(fillStyle, fillPath);\n\t\t\tdoStroke(strokeStyle, strokePath, lineWidth);\n\t\t}\n\n\t\tif (boundsClip || gapsClip || bandClip)\n\t\t\tctx.restore();\n\t}\n\n\tfunction doStroke(strokeStyle, strokePath, lineWidth) {\n\t\tif (lineWidth > 0) {\n\t\t\tif (strokePath instanceof Map) {\n\t\t\t\tstrokePath.forEach((strokePath, strokeStyle) => {\n\t\t\t\t\tctx.strokeStyle = ctxStroke = strokeStyle;\n\t\t\t\t\tctx.stroke(strokePath);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse\n\t\t\t\tstrokePath != null && strokeStyle && ctx.stroke(strokePath);\n\t\t}\n\t}\n\n\tfunction doFill(fillStyle, fillPath) {\n\t\tif (fillPath instanceof Map) {\n\t\t\tfillPath.forEach((fillPath, fillStyle) => {\n\t\t\t\tctx.fillStyle = ctxFill = fillStyle;\n\t\t\t\tctx.fill(fillPath);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t\tfillPath != null && fillStyle && ctx.fill(fillPath);\n\t}\n\n\tfunction getIncrSpace(axisIdx, min, max, fullDim) {\n\t\tlet axis = axes[axisIdx];\n\n\t\tlet incrSpace;\n\n\t\tif (fullDim <= 0)\n\t\t\tincrSpace = [0, 0];\n\t\telse {\n\t\t\tlet minSpace = axis._space = axis.space(self, axisIdx, min, max, fullDim);\n\t\t\tlet incrs    = axis._incrs = axis.incrs(self, axisIdx, min, max, fullDim, minSpace);\n\t\t\tincrSpace    = findIncr(min, max, incrs, fullDim, minSpace);\n\t\t}\n\n\t\treturn (axis._found = incrSpace);\n\t}\n\n\tfunction drawOrthoLines(offs, filts, ori, side, pos0, len, width, stroke, dash, cap) {\n\t\tlet offset = (width % 2) / 2;\n\n\t\tpxAlign == 1 && ctx.translate(offset, offset);\n\n\t\tsetCtxStyle(stroke, width, dash, cap, stroke);\n\n\t\tctx.beginPath();\n\n\t\tlet x0, y0, x1, y1, pos1 = pos0 + (side == 0 || side == 3 ? -len : len);\n\n\t\tif (ori == 0) {\n\t\t\ty0 = pos0;\n\t\t\ty1 = pos1;\n\t\t}\n\t\telse {\n\t\t\tx0 = pos0;\n\t\t\tx1 = pos1;\n\t\t}\n\n\t\tfor (let i = 0; i < offs.length; i++) {\n\t\t\tif (filts[i] != null) {\n\t\t\t\tif (ori == 0)\n\t\t\t\t\tx0 = x1 = offs[i];\n\t\t\t\telse\n\t\t\t\t\ty0 = y1 = offs[i];\n\n\t\t\t\tctx.moveTo(x0, y0);\n\t\t\t\tctx.lineTo(x1, y1);\n\t\t\t}\n\t\t}\n\n\t\tctx.stroke();\n\n\t\tpxAlign == 1 && ctx.translate(-offset, -offset);\n\t}\n\n\tfunction axesCalc(cycleNum) {\n\t//\tlog(\"axesCalc()\", arguments);\n\n\t\tlet converged = true;\n\n\t\taxes.forEach((axis, i) => {\n\t\t\tif (!axis.show)\n\t\t\t\treturn;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tif (scale.min == null) {\n\t\t\t\tif (axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = false;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (!axis._show) {\n\t\t\t\t\tconverged = false;\n\t\t\t\t\taxis._show = true;\n\t\t\t\t\tresetYSeries(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet {min, max} = scale;\t\t// \t\t// should this toggle them ._show = false\n\n\t\t\tlet [_incr, _space] = getIncrSpace(i, min, max, ori == 0 ? plotWidCss : plotHgtCss);\n\n\t\t\tif (_space == 0)\n\t\t\t\treturn;\n\n\t\t\t// if we're using index positions, force first tick to match passed index\n\t\t\tlet forceMin = scale.distr == 2;\n\n\t\t\tlet _splits = axis._splits = axis.splits(self, i, min, max, _incr, _space, forceMin);\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr   = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet values = axis._values = axis.values(self, axis.filter(self, splits, i, _space, incr), i, _space, incr);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\taxis._rotate = side == 2 ? axis.rotate(self, values, i, _space) : 0;\n\n\t\t\tlet oldSize = axis._size;\n\n\t\t\taxis._size = ceil(axis.size(self, values, i, cycleNum));\n\n\t\t\tif (oldSize != null && axis._size != oldSize)\t\t\t// ready && ?\n\t\t\t\tconverged = false;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction paddingCalc(cycleNum) {\n\t\tlet converged = true;\n\n\t\tpadding.forEach((p, i) => {\n\t\t\tlet _p = p(self, i, sidesWithAxes, cycleNum);\n\n\t\t\tif (_p != _padding[i])\n\t\t\t\tconverged = false;\n\n\t\t\t_padding[i] = _p;\n\t\t});\n\n\t\treturn converged;\n\t}\n\n\tfunction drawAxesGrid() {\n\t\tfor (let i = 0; i < axes.length; i++) {\n\t\t\tlet axis = axes[i];\n\n\t\t\tif (!axis.show || !axis._show)\n\t\t\t\tcontinue;\n\n\t\t\tlet side = axis.side;\n\t\t\tlet ori = side % 2;\n\n\t\t\tlet x, y;\n\n\t\t\tlet fillStyle = axis.stroke(self, i);\n\n\t\t\tlet shiftDir = side == 0 || side == 3 ? -1 : 1;\n\n\t\t\tlet [_incr, _space] = axis._found;\n\n\t\t\t// axis label\n\t\t\tif (axis.label != null) {\n\t\t\t\tlet shiftAmt = axis.labelGap * shiftDir;\n\t\t\t\tlet baseLpos = round((axis._lpos + shiftAmt) * pxRatio);\n\n\t\t\t\tsetFontStyle(axis.labelFont[0], fillStyle, \"center\", side == 2 ? TOP : BOTTOM);\n\n\t\t\t\tctx.save();\n\n\t\t\t\tif (ori == 1) {\n\t\t\t\t\tx = y = 0;\n\n\t\t\t\t\tctx.translate(\n\t\t\t\t\t\tbaseLpos,\n\t\t\t\t\t\tround(plotTop + plotHgt / 2),\n\t\t\t\t\t);\n\t\t\t\t\tctx.rotate((side == 3 ? -PI : PI) / 2);\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tx = round(plotLft + plotWid / 2);\n\t\t\t\t\ty = baseLpos;\n\t\t\t\t}\n\n\t\t\t\tlet _label = isFn(axis.label) ? axis.label(self, i, _incr, _space) : axis.label;\n\n\t\t\t\tctx.fillText(_label, x, y);\n\n\t\t\t\tctx.restore();\n\t\t\t}\n\n\t\t\tif (_space == 0)\n\t\t\t\tcontinue;\n\n\t\t\tlet scale = scales[axis.scale];\n\n\t\t\tlet plotDim = ori == 0 ? plotWid : plotHgt;\n\t\t\tlet plotOff = ori == 0 ? plotLft : plotTop;\n\n\t\t\tlet _splits = axis._splits;\n\n\t\t\t// tick labels\n\t\t\t// BOO this assumes a specific data/series\n\t\t\tlet splits = scale.distr == 2 ? _splits.map(i => data0[i]) : _splits;\n\t\t\tlet incr   = scale.distr == 2 ? data0[_splits[1]] - data0[_splits[0]] : _incr;\n\n\t\t\tlet ticks = axis.ticks;\n\t\t\tlet border = axis.border;\n\t\t\tlet _tickSize = ticks.show ? ticks.size : 0;\n\t\t\tlet tickSize = round(_tickSize * pxRatio);\n\t\t\tlet axisGap = round((axis.alignTo == 2 ? axis._size - _tickSize - axis.gap : axis.gap) * pxRatio);\n\n\t\t\t// rotating of labels only supported on bottom x axis\n\t\t\tlet angle = axis._rotate * -PI/180;\n\n\t\t\tlet basePos  = pxRound(axis._pos * pxRatio);\n\t\t\tlet shiftAmt = (tickSize + axisGap) * shiftDir;\n\t\t\tlet finalPos = basePos + shiftAmt;\n\t\t\t    y        = ori == 0 ? finalPos : 0;\n\t\t\t    x        = ori == 1 ? finalPos : 0;\n\n\t\t\tlet font         = axis.font[0];\n\t\t\tlet textAlign    = axis.align == 1 ? LEFT :\n\t\t\t                   axis.align == 2 ? RIGHT :\n\t\t\t                   angle > 0 ? LEFT :\n\t\t\t                   angle < 0 ? RIGHT :\n\t\t\t                   ori == 0 ? \"center\" : side == 3 ? RIGHT : LEFT;\n\t\t\tlet textBaseline = angle ||\n\t\t\t                   ori == 1 ? \"middle\" : side == 2 ? TOP   : BOTTOM;\n\n\t\t\tsetFontStyle(font, fillStyle, textAlign, textBaseline);\n\n\t\t\tlet lineHeight = axis.font[1] * axis.lineGap;\n\n\t\t\tlet canOffs = _splits.map(val => pxRound(getPos(val, scale, plotDim, plotOff)));\n\n\t\t\tlet _values = axis._values;\n\n\t\t\tfor (let i = 0; i < _values.length; i++) {\n\t\t\t\tlet val = _values[i];\n\n\t\t\t\tif (val != null) {\n\t\t\t\t\tif (ori == 0)\n\t\t\t\t\t\tx = canOffs[i];\n\t\t\t\t\telse\n\t\t\t\t\t\ty = canOffs[i];\n\n\t\t\t\t\tval = \"\" + val;\n\n\t\t\t\t\tlet _parts = val.indexOf(\"\\n\") == -1 ? [val] : val.split(/\\n/gm);\n\n\t\t\t\t\tfor (let j = 0; j < _parts.length; j++) {\n\t\t\t\t\t\tlet text = _parts[j];\n\n\t\t\t\t\t\tif (angle) {\n\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\tctx.translate(x, y + j * lineHeight); // can this be replaced with position math?\n\t\t\t\t\t\t\tctx.rotate(angle); // can this be done once?\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0);\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tctx.fillText(text, x, y + j * lineHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ticks\n\t\t\tif (ticks.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tticks.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tside,\n\t\t\t\t\tbasePos,\n\t\t\t\t\ttickSize,\n\t\t\t\t\troundDec(ticks.width * pxRatio, 3),\n\t\t\t\t\tticks.stroke(self, i),\n\t\t\t\t\tticks.dash,\n\t\t\t\t\tticks.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// grid\n\t\t\tlet grid = axis.grid;\n\n\t\t\tif (grid.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\tcanOffs,\n\t\t\t\t\tgrid.filter(self, splits, i, _space, incr),\n\t\t\t\t\tori,\n\t\t\t\t\tori == 0 ? 2 : 1,\n\t\t\t\t\tori == 0 ? plotTop : plotLft,\n\t\t\t\t\tori == 0 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(grid.width * pxRatio, 3),\n\t\t\t\t\tgrid.stroke(self, i),\n\t\t\t\t\tgrid.dash,\n\t\t\t\t\tgrid.cap,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (border.show) {\n\t\t\t\tdrawOrthoLines(\n\t\t\t\t\t[basePos],\n\t\t\t\t\t[1],\n\t\t\t\t\tori == 0 ? 1 : 0,\n\t\t\t\t\tori == 0 ? 1 : 2,\n\t\t\t\t\tori == 1 ? plotTop : plotLft,\n\t\t\t\t\tori == 1 ? plotHgt : plotWid,\n\t\t\t\t\troundDec(border.width * pxRatio, 3),\n\t\t\t\t\tborder.stroke(self, i),\n\t\t\t\t\tborder.dash,\n\t\t\t\t\tborder.cap,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfire(\"drawAxes\");\n\t}\n\n\tfunction resetYSeries(minMax) {\n\t//\tlog(\"resetYSeries()\", arguments);\n\n\t\tseries.forEach((s, i) => {\n\t\t\tif (i > 0) {\n\t\t\t\ts._paths = null;\n\n\t\t\t\tif (minMax) {\n\t\t\t\t\tif (mode == 1) {\n\t\t\t\t\t\ts.min = null;\n\t\t\t\t\t\ts.max = null;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\ts.facets.forEach(f => {\n\t\t\t\t\t\t\tf.min = null;\n\t\t\t\t\t\t\tf.max = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tlet queuedCommit = false;\n\tlet deferHooks = false;\n\tlet hooksQueue = [];\n\n\tfunction flushHooks() {\n\t\tdeferHooks = false;\n\n\t\tfor (let i = 0; i < hooksQueue.length; i++)\n\t\t\tfire(...hooksQueue[i]);\n\n\t\thooksQueue.length = 0;\n\t}\n\n\tfunction commit() {\n\t\tif (!queuedCommit) {\n\t\t\tmicroTask(_commit);\n\t\t\tqueuedCommit = true;\n\t\t}\n\t}\n\n\t// manual batching (aka immediate mode), skips microtask queue\n\tfunction batch(fn, _deferHooks = false) {\n\t\tqueuedCommit = true;\n\t\tdeferHooks = _deferHooks;\n\n\t\tfn(self);\n\t\t_commit();\n\n\t\tif (_deferHooks && hooksQueue.length > 0)\n\t\t\tqueueMicrotask(flushHooks);\n\t}\n\n\tself.batch = batch;\n\n\tfunction _commit() {\n\t//\tlog(\"_commit()\", arguments);\n\n\t\tif (shouldSetScales) {\n\t\t\tsetScales();\n\t\t\tshouldSetScales = false;\n\t\t}\n\n\t\tif (shouldConvergeSize) {\n\t\t\tconvergeSize();\n\t\t\tshouldConvergeSize = false;\n\t\t}\n\n\t\tif (shouldSetSize) {\n\t\t\tsetStylePx(under, LEFT,   plotLftCss);\n\t\t\tsetStylePx(under, TOP,    plotTopCss);\n\t\t\tsetStylePx(under, WIDTH,  plotWidCss);\n\t\t\tsetStylePx(under, HEIGHT, plotHgtCss);\n\n\t\t\tsetStylePx(over, LEFT,    plotLftCss);\n\t\t\tsetStylePx(over, TOP,     plotTopCss);\n\t\t\tsetStylePx(over, WIDTH,   plotWidCss);\n\t\t\tsetStylePx(over, HEIGHT,  plotHgtCss);\n\n\t\t\tsetStylePx(wrap, WIDTH,   fullWidCss);\n\t\t\tsetStylePx(wrap, HEIGHT,  fullHgtCss);\n\n\t\t\t// NOTE: mutating this during print preview in Chrome forces transparent\n\t\t\t// canvas pixels to white, even when followed up with clearRect() below\n\t\t\tcan.width  = round(fullWidCss * pxRatio);\n\t\t\tcan.height = round(fullHgtCss * pxRatio);\n\n\t\t\taxes.forEach(({ _el, _show, _size, _pos, side }) => {\n\t\t\t\tif (_el != null) {\n\t\t\t\t\tif (_show) {\n\t\t\t\t\t\tlet posOffset = (side === 3 || side === 0 ? _size : 0);\n\t\t\t\t\t\tlet isVt = side % 2 == 1;\n\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"left\"   : \"top\",    _pos - posOffset);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"width\"  : \"height\", _size);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"top\"    : \"left\",   isVt ? plotTopCss : plotLftCss);\n\t\t\t\t\t\tsetStylePx(_el, isVt ? \"height\" : \"width\",  isVt ? plotHgtCss : plotWidCss);\n\n\t\t\t\t\t\tremClass(_el, OFF);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\taddClass(_el, OFF);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// invalidate ctx style cache\n\t\t\tctxStroke = ctxFill = ctxWidth = ctxJoin = ctxCap = ctxFont = ctxAlign = ctxBaseline = ctxDash = null;\n\t\t\tctxAlpha = 1;\n\n\t\t\tsyncRect(true);\n\n\t\t\tif (\n\t\t\t\tplotLftCss != _plotLftCss ||\n\t\t\t\tplotTopCss != _plotTopCss ||\n\t\t\t\tplotWidCss != _plotWidCss ||\n\t\t\t\tplotHgtCss != _plotHgtCss\n\t\t\t) {\n\t\t\t\tresetYSeries(false);\n\n\t\t\t\tlet pctWid = plotWidCss / _plotWidCss;\n\t\t\t\tlet pctHgt = plotHgtCss / _plotHgtCss;\n\n\t\t\t\tif (showCursor && !shouldSetCursor && cursor.left >= 0) {\n\t\t\t\t\tcursor.left *= pctWid;\n\t\t\t\t\tcursor.top  *= pctHgt;\n\n\t\t\t\t\tvCursor && elTrans(vCursor, round(cursor.left), 0, plotWidCss, plotHgtCss);\n\t\t\t\t\thCursor && elTrans(hCursor, 0, round(cursor.top), plotWidCss, plotHgtCss);\n\n\t\t\t\t\tfor (let i = 0; i < cursorPts.length; i++) {\n\t\t\t\t\t\tlet pt = cursorPts[i];\n\n\t\t\t\t\t\tif (pt != null) {\n\t\t\t\t\t\t\tcursorPtsLft[i] *= pctWid;\n\t\t\t\t\t\t\tcursorPtsTop[i] *= pctHgt;\n\t\t\t\t\t\t\telTrans(pt, ceil(cursorPtsLft[i]), ceil(cursorPtsTop[i]), plotWidCss, plotHgtCss);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (select.show && !shouldSetSelect && select.left >= 0 && select.width > 0) {\n\t\t\t\t\tselect.left   *= pctWid;\n\t\t\t\t\tselect.width  *= pctWid;\n\t\t\t\t\tselect.top    *= pctHgt;\n\t\t\t\t\tselect.height *= pctHgt;\n\n\t\t\t\t\tfor (let prop in _hideProps)\n\t\t\t\t\t\tsetStylePx(selectDiv, prop, select[prop]);\n\t\t\t\t}\n\n\t\t\t\t_plotLftCss = plotLftCss;\n\t\t\t\t_plotTopCss = plotTopCss;\n\t\t\t\t_plotWidCss = plotWidCss;\n\t\t\t\t_plotHgtCss = plotHgtCss;\n\t\t\t}\n\n\t\t\tfire(\"setSize\");\n\n\t\t\tshouldSetSize = false;\n\t\t}\n\n\t\tif (fullWidCss > 0 && fullHgtCss > 0) {\n\t\t\tctx.clearRect(0, 0, can.width, can.height);\n\t\t\tfire(\"drawClear\");\n\t\t\tdrawOrder.forEach(fn => fn());\n\t\t\tfire(\"draw\");\n\t\t}\n\n\t\tif (select.show && shouldSetSelect) {\n\t\t\tsetSelect(select);\n\t\t\tshouldSetSelect = false;\n\t\t}\n\n\t\tif (showCursor && shouldSetCursor) {\n\t\t\tupdateCursor(null, true, false);\n\t\t\tshouldSetCursor = false;\n\t\t}\n\n\t\tif (legend.show && legend.live && shouldSetLegend) {\n\t\t\tsetLegend();\n\t\t\tshouldSetLegend = false; // redundant currently\n\t\t}\n\n\t\tif (!ready) {\n\t\t\tready = true;\n\t\t\tself.status = 1;\n\n\t\t\tfire(\"ready\");\n\t\t}\n\n\t\tviaAutoScaleX = false;\n\n\t\tqueuedCommit = false;\n\t}\n\n\tself.redraw = (rebuildPaths, recalcAxes) => {\n\t\tshouldConvergeSize = recalcAxes || false;\n\n\t\tif (rebuildPaths !== false)\n\t\t\t_setScale(xScaleKey, scaleX.min, scaleX.max);\n\t\telse\n\t\t\tcommit();\n\t};\n\n\t// redraw() => setScale('x', scales.x.min, scales.x.max);\n\n\t// explicit, never re-ranged (is this actually true? for x and y)\n\tfunction setScale(key, opts) {\n\t\tlet sc = scales[key];\n\n\t\tif (sc.from == null) {\n\t\t\tif (dataLen == 0) {\n\t\t\t\tlet minMax = sc.range(self, opts.min, opts.max, key);\n\t\t\t\topts.min = minMax[0];\n\t\t\t\topts.max = minMax[1];\n\t\t\t}\n\n\t\t\tif (opts.min > opts.max) {\n\t\t\t\tlet _min = opts.min;\n\t\t\t\topts.min = opts.max;\n\t\t\t\topts.max = _min;\n\t\t\t}\n\n\t\t\tif (dataLen > 1 && opts.min != null && opts.max != null && opts.max - opts.min < 1e-16)\n\t\t\t\treturn;\n\n\t\t\tif (key == xScaleKey) {\n\t\t\t\tif (sc.distr == 2 && dataLen > 0) {\n\t\t\t\t\topts.min = closestIdx(opts.min, data[0]);\n\t\t\t\t\topts.max = closestIdx(opts.max, data[0]);\n\n\t\t\t\t\tif (opts.min == opts.max)\n\t\t\t\t\t\topts.max++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t//\tlog(\"setScale()\", arguments);\n\n\t\t\tpendScales[key] = opts;\n\n\t\t\tshouldSetScales = true;\n\t\t\tcommit();\n\t\t}\n\t}\n\n\tself.setScale = setScale;\n\n//\tINTERACTION\n\n\tlet xCursor;\n\tlet yCursor;\n\tlet vCursor;\n\tlet hCursor;\n\n\t// starting position before cursor.move\n\tlet rawMouseLeft0;\n\tlet rawMouseTop0;\n\n\t// starting position\n\tlet mouseLeft0;\n\tlet mouseTop0;\n\n\t// current position before cursor.move\n\tlet rawMouseLeft1;\n\tlet rawMouseTop1;\n\n\t// current position\n\tlet mouseLeft1;\n\tlet mouseTop1;\n\n\tlet dragging = false;\n\n\tconst drag = cursor.drag;\n\n\tlet dragX = drag.x;\n\tlet dragY = drag.y;\n\n\tif (showCursor) {\n\t\tif (cursor.x)\n\t\t\txCursor = placeDiv(CURSOR_X, over);\n\t\tif (cursor.y)\n\t\t\tyCursor = placeDiv(CURSOR_Y, over);\n\n\t\tif (scaleX.ori == 0) {\n\t\t\tvCursor = xCursor;\n\t\t\thCursor = yCursor;\n\t\t}\n\t\telse {\n\t\t\tvCursor = yCursor;\n\t\t\thCursor = xCursor;\n\t\t}\n\n\t\tmouseLeft1 = cursor.left;\n\t\tmouseTop1 = cursor.top;\n\t}\n\n\tconst select = self.select = assign({\n\t\tshow:   true,\n\t\tover:   true,\n\t\tleft:   0,\n\t\twidth:  0,\n\t\ttop:    0,\n\t\theight: 0,\n\t}, opts.select);\n\n\tconst selectDiv = select.show ? placeDiv(SELECT, select.over ? over : under) : null;\n\n\tfunction setSelect(opts, _fire) {\n\t\tif (select.show) {\n\t\t\tfor (let prop in opts) {\n\t\t\t\tselect[prop] = opts[prop];\n\n\t\t\t\tif (prop in _hideProps)\n\t\t\t\t\tsetStylePx(selectDiv, prop, opts[prop]);\n\t\t\t}\n\n\t\t\t_fire !== false && fire(\"setSelect\");\n\t\t}\n\t}\n\n\tself.setSelect = setSelect;\n\n\tfunction toggleDOM(i) {\n\t\tlet s = series[i];\n\n\t\tif (s.show)\n\t\t\tshowLegend && remClass(legendRows[i], OFF);\n\t\telse {\n\t\t\tshowLegend && addClass(legendRows[i], OFF);\n\n\t\t\tif (showCursor) {\n\t\t\t\tlet pt = cursorOnePt ? cursorPts[0] : cursorPts[i];\n\t\t\t\tpt != null && elTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction _setScale(key, min, max) {\n\t\tsetScale(key, {min, max});\n\t}\n\n\tfunction setSeries(i, opts, _fire, _pub) {\n\t//\tlog(\"setSeries()\", arguments);\n\n\t\tif (opts.focus != null)\n\t\t\tsetFocus(i);\n\n\t\tif (opts.show != null) {\n\t\t\tseries.forEach((s, si) => {\n\t\t\t\tif (si > 0 && (i == si || i == null)) {\n\t\t\t\t\ts.show = opts.show;\n\t\t\t\t\ttoggleDOM(si);\n\n\t\t\t\t\tif (mode == 2) {\n\t\t\t\t\t\t_setScale(s.facets[0].scale, null, null);\n\t\t\t\t\t\t_setScale(s.facets[1].scale, null, null);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\t_setScale(s.scale, null, null);\n\n\t\t\t\t\tcommit();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_fire !== false && fire(\"setSeries\", i, opts);\n\n\t\t_pub && pubSync(\"setSeries\", self, i, opts);\n\t}\n\n\tself.setSeries = setSeries;\n\n\tfunction setBand(bi, opts) {\n\t\tassign(bands[bi], opts);\n\t}\n\n\tfunction addBand(opts, bi) {\n\t\topts.fill = fnOrSelf(opts.fill || null);\n\t\topts.dir = ifNull(opts.dir, -1);\n\t\tbi = bi == null ? bands.length : bi;\n\t\tbands.splice(bi, 0, opts);\n\t}\n\n\tfunction delBand(bi) {\n\t\tif (bi == null)\n\t\t\tbands.length = 0;\n\t\telse\n\t\t\tbands.splice(bi, 1);\n\t}\n\n\tself.addBand = addBand;\n\tself.setBand = setBand;\n\tself.delBand = delBand;\n\n\tfunction setAlpha(i, value) {\n\t\tseries[i].alpha = value;\n\n\t\tif (showCursor && cursorPts[i] != null)\n\t\t\tcursorPts[i].style.opacity = value;\n\n\t\tif (showLegend && legendRows[i])\n\t\t\tlegendRows[i].style.opacity = value;\n\t}\n\n\t// y-distance\n\tlet closestDist;\n\tlet closestSeries;\n\tlet focusedSeries;\n\tconst FOCUS_TRUE  = {focus: true};\n\n\tfunction setFocus(i) {\n\t\tif (i != focusedSeries) {\n\t\t//\tlog(\"setFocus()\", arguments);\n\n\t\t\tlet allFocused = i == null;\n\n\t\t\tlet _setAlpha = focus.alpha != 1;\n\n\t\t\tseries.forEach((s, i2) => {\n\t\t\t\tif (mode == 1 || i2 > 0) {\n\t\t\t\t\tlet isFocused = allFocused || i2 == 0 || i2 == i;\n\t\t\t\t\ts._focus = allFocused ? null : isFocused;\n\t\t\t\t\t_setAlpha && setAlpha(i2, isFocused ? 1 : focus.alpha);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfocusedSeries = i;\n\t\t\t_setAlpha && commit();\n\t\t}\n\t}\n\n\tif (showLegend && cursorFocus) {\n\t\tonMouse(mouseleave, legendTable, e => {\n\t\t\tif (cursor._lock)\n\t\t\t\treturn;\n\n\t\t\tsetCursorEvent(e);\n\n\t\t\tif (focusedSeries != null)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, syncOpts.setSeries);\n\t\t});\n\t}\n\n\tfunction posToVal(pos, scale, can) {\n\t\tlet sc = scales[scale];\n\n\t\tif (can)\n\t\t\tpos = pos / pxRatio - (sc.ori == 1 ? plotTopCss : plotLftCss);\n\n\t\tlet dim = plotWidCss;\n\n\t\tif (sc.ori == 1) {\n\t\t\tdim = plotHgtCss;\n\t\t\tpos = dim - pos;\n\t\t}\n\n\t\tif (sc.dir == -1)\n\t\t\tpos = dim - pos;\n\n\t\tlet _min = sc._min,\n\t\t\t_max = sc._max,\n\t\t\tpct = pos / dim;\n\n\t\tlet sv = _min + (_max - _min) * pct;\n\n\t\tlet distr = sc.distr;\n\n\t\treturn (\n\t\t\tdistr == 3 ? pow(10, sv) :\n\t\t\tdistr == 4 ? sinh(sv, sc.asinh) :\n\t\t\tdistr == 100 ? sc.bwd(sv) :\n\t\t\tsv\n\t\t);\n\t}\n\n\tfunction closestIdxFromXpos(pos, can) {\n\t\tlet v = posToVal(pos, xScaleKey, can);\n\t\treturn closestIdx(v, data[0], i0, i1);\n\t}\n\n\tself.valToIdx = val => closestIdx(val, data[0]);\n\tself.posToIdx = closestIdxFromXpos;\n\tself.posToVal = posToVal;\n\tself.valToPos = (val, scale, can) => (\n\t\tscales[scale].ori == 0 ?\n\t\tgetHPos(val, scales[scale],\n\t\t\tcan ? plotWid : plotWidCss,\n\t\t\tcan ? plotLft : 0,\n\t\t) :\n\t\tgetVPos(val, scales[scale],\n\t\t\tcan ? plotHgt : plotHgtCss,\n\t\t\tcan ? plotTop : 0,\n\t\t)\n\t);\n\n\tself.setCursor = (opts, _fire, _pub) => {\n\t\tmouseLeft1 = opts.left;\n\t\tmouseTop1 = opts.top;\n\t//\tassign(cursor, opts);\n\t\tupdateCursor(null, _fire, _pub);\n\t};\n\n\tfunction setSelH(off, dim) {\n\t\tsetStylePx(selectDiv, LEFT,  select.left = off);\n\t\tsetStylePx(selectDiv, WIDTH, select.width = dim);\n\t}\n\n\tfunction setSelV(off, dim) {\n\t\tsetStylePx(selectDiv, TOP,    select.top = off);\n\t\tsetStylePx(selectDiv, HEIGHT, select.height = dim);\n\t}\n\n\tlet setSelX = scaleX.ori == 0 ? setSelH : setSelV;\n\tlet setSelY = scaleX.ori == 1 ? setSelH : setSelV;\n\n\tfunction syncLegend() {\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tif (i == 0 && multiValLegend)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlet vals = legend.values[i];\n\n\t\t\t\tlet j = 0;\n\n\t\t\t\tfor (let k in vals)\n\t\t\t\t\tlegendCells[i][j++].firstChild.nodeValue = vals[k];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setLegend(opts, _fire) {\n\t\tif (opts != null) {\n\t\t\tif (opts.idxs) {\n\t\t\t\topts.idxs.forEach((didx, sidx) => {\n\t\t\t\t\tactiveIdxs[sidx] = didx;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (!isUndef(opts.idx))\n\t\t\t\tactiveIdxs.fill(opts.idx);\n\n\t\t\tlegend.idx = activeIdxs[0];\n\t\t}\n\n\t\tif (showLegend && legend.live) {\n\t\t\tfor (let sidx = 0; sidx < series.length; sidx++) {\n\t\t\t\tif (sidx > 0 || mode == 1 && !multiValLegend)\n\t\t\t\t\tsetLegendValues(sidx, activeIdxs[sidx]);\n\t\t\t}\n\n\t\t\tsyncLegend();\n\t\t}\n\n\t\tshouldSetLegend = false;\n\n\t\t_fire !== false && fire(\"setLegend\");\n\t}\n\n\tself.setLegend = setLegend;\n\n\tfunction setLegendValues(sidx, idx) {\n\t\tlet s = series[sidx];\n\t\tlet src = sidx == 0 && xScaleDistr == 2 ? data0 : data[sidx];\n\t\tlet val;\n\n\t\tif (multiValLegend)\n\t\t\tval = s.values(self, sidx, idx) ?? NULL_LEGEND_VALUES;\n\t\telse {\n\t\t\tval = s.value(self, idx == null ? null : src[idx], sidx, idx);\n\t\t\tval = val == null ? NULL_LEGEND_VALUES : {_: val};\n\t\t}\n\n\t\tlegend.values[sidx] = val;\n\t}\n\n\tfunction updateCursor(src, _fire, _pub) {\n\t//\tts == null && log(\"updateCursor()\", arguments);\n\n\t\trawMouseLeft1 = mouseLeft1;\n\t\trawMouseTop1 = mouseTop1;\n\n\t\t[mouseLeft1, mouseTop1] = cursor.move(self, mouseLeft1, mouseTop1);\n\n\t\tcursor.left = mouseLeft1;\n\t\tcursor.top = mouseTop1;\n\n\t\tif (showCursor) {\n\t\t\tvCursor && elTrans(vCursor, round(mouseLeft1), 0, plotWidCss, plotHgtCss);\n\t\t\thCursor && elTrans(hCursor, 0, round(mouseTop1), plotWidCss, plotHgtCss);\n\t\t}\n\n\t\tlet idx;\n\n\t\t// when zooming to an x scale range between datapoints the binary search\n\t\t// for nearest min/max indices results in this condition. cheap hack :D\n\t\tlet noDataInRange = i0 > i1; // works for mode 1 only\n\n\t\tclosestDist = inf;\n\t\tclosestSeries = null;\n\n\t\t// TODO: extract\n\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss;\n\t\tlet yDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss;\n\n\t\t// if cursor hidden, hide points & clear legend vals\n\t\tif (mouseLeft1 < 0 || dataLen == 0 || noDataInRange) {\n\t\t\tidx = cursor.idx = null;\n\n\t\t\tfor (let i = 0; i < series.length; i++) {\n\t\t\t\tlet pt = cursorPts[i];\n\t\t\t\tpt != null && elTrans(pt, -10, -10, plotWidCss, plotHgtCss);\n\t\t\t}\n\n\t\t\tif (cursorFocus)\n\t\t\t\tsetSeries(null, FOCUS_TRUE, true, src == null && syncOpts.setSeries);\n\n\t\t\tif (legend.live) {\n\t\t\t\tactiveIdxs.fill(idx);\n\t\t\t\tshouldSetLegend = true;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t//\tlet pctY = 1 - (y / rect.height);\n\n\t\t\tlet mouseXPos, valAtPosX, xPos;\n\n\t\t\tif (mode == 1) {\n\t\t\t\tmouseXPos = scaleX.ori == 0 ? mouseLeft1 : mouseTop1;\n\t\t\t\tvalAtPosX = posToVal(mouseXPos, xScaleKey);\n\t\t\t\tidx = cursor.idx = closestIdx(valAtPosX, data[0], i0, i1);\n\t\t\t\txPos = valToPosX(data[0][idx], scaleX, xDim, 0);\n\t\t\t}\n\n\t\t\t// closest pt values\n\t\t\tlet _ptLft = -10;\n\t\t\tlet _ptTop = -10;\n\t\t\tlet _ptWid = 0;\n\t\t\tlet _ptHgt = 0;\n\t\t\tlet _centered = true;\n\t\t\tlet _ptFill = '';\n\t\t\tlet _ptStroke = '';\n\n\t\t\tfor (let i = mode == 2 ? 1 : 0; i < series.length; i++) {\n\t\t\t\tlet s = series[i];\n\n\t\t\t\tlet idx1  = activeIdxs[i];\n\t\t\t\tlet yVal1 = idx1 == null ? null : (mode == 1 ? data[i][idx1] : data[i][1][idx1]);\n\n\t\t\t\tlet idx2  = cursor.dataIdx(self, i, idx, valAtPosX);\n\t\t\t\tlet yVal2 = idx2 == null ? null : (mode == 1 ? data[i][idx2] : data[i][1][idx2]);\n\n\t\t\t\tshouldSetLegend = shouldSetLegend || yVal2 != yVal1 || idx2 != idx1;\n\n\t\t\t\tactiveIdxs[i] = idx2;\n\n\t\t\t\tif (i > 0 && s.show) {\n\t\t\t\t\tlet xPos2 = idx2 == null ? -10 : idx2 == idx ? xPos : valToPosX(mode == 1 ? data[0][idx2] : data[i][0][idx2], scaleX, xDim, 0);\n\n\t\t\t\t\t// this doesnt really work for state timeline, heatmap, status history (where the value maps to color, not y coords)\n\t\t\t\t\tlet yPos = yVal2 == null ? -10 : valToPosY(yVal2, mode == 1 ? scales[s.scale] : scales[s.facets[1].scale], yDim, 0);\n\n\t\t\t\t\tif (cursorFocus && yVal2 != null) {\n\t\t\t\t\t\tlet mouseYPos = scaleX.ori == 1 ? mouseLeft1 : mouseTop1;\n\t\t\t\t\t\tlet dist = abs(focus.dist(self, i, idx2, yPos, mouseYPos));\n\n\t\t\t\t\t\tif (dist < closestDist) {\n\t\t\t\t\t\t\tlet bias = focus.bias;\n\n\t\t\t\t\t\t\tif (bias != 0) {\n\t\t\t\t\t\t\t\tlet mouseYVal = posToVal(mouseYPos, s.scale);\n\n\t\t\t\t\t\t\t\tlet seriesYValSign = yVal2     >= 0 ? 1 : -1;\n\t\t\t\t\t\t\t\tlet mouseYValSign  = mouseYVal >= 0 ? 1 : -1;\n\n\t\t\t\t\t\t\t\t// with a focus bias, we will never cross zero when prox testing\n\t\t\t\t\t\t\t\t// it's either closest towards zero, or closest away from zero\n\t\t\t\t\t\t\t\tif (mouseYValSign == seriesYValSign && (\n\t\t\t\t\t\t\t\t\tmouseYValSign == 1 ?\n\t\t\t\t\t\t\t\t\t\t(bias == 1 ? yVal2 >= mouseYVal : yVal2 <= mouseYVal) :  // >= 0\n\t\t\t\t\t\t\t\t\t\t(bias == 1 ? yVal2 <= mouseYVal : yVal2 >= mouseYVal)    //  < 0\n\t\t\t\t\t\t\t\t)) {\n\t\t\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tclosestDist = dist;\n\t\t\t\t\t\t\t\tclosestSeries = i;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSetLegend || cursorOnePt) {\n\t\t\t\t\t\tlet hPos, vPos;\n\n\t\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\t\thPos = xPos2;\n\t\t\t\t\t\t\tvPos = yPos;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\thPos = yPos;\n\t\t\t\t\t\t\tvPos = xPos2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet ptWid, ptHgt, ptLft, ptTop,\n\t\t\t\t\t\t\tptStroke, ptFill,\n\t\t\t\t\t\t\tcentered = true,\n\t\t\t\t\t\t\tgetBBox = points.bbox;\n\n\t\t\t\t\t\tif (getBBox != null) {\n\t\t\t\t\t\t\tcentered = false;\n\n\t\t\t\t\t\t\tlet bbox = getBBox(self, i);\n\n\t\t\t\t\t\t\tptLft = bbox.left;\n\t\t\t\t\t\t\tptTop = bbox.top;\n\t\t\t\t\t\t\tptWid = bbox.width;\n\t\t\t\t\t\t\tptHgt = bbox.height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tptLft = hPos;\n\t\t\t\t\t\t\tptTop = vPos;\n\t\t\t\t\t\t\tptWid = ptHgt = points.size(self, i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tptFill = points.fill(self, i);\n\t\t\t\t\t\tptStroke = points.stroke(self, i);\n\n\t\t\t\t\t\tif (cursorOnePt) {\n\t\t\t\t\t\t\tif (i == closestSeries && closestDist <= focus.prox) {\n\t\t\t\t\t\t\t\t_ptLft = ptLft;\n\t\t\t\t\t\t\t\t_ptTop = ptTop;\n\t\t\t\t\t\t\t\t_ptWid = ptWid;\n\t\t\t\t\t\t\t\t_ptHgt = ptHgt;\n\t\t\t\t\t\t\t\t_centered = centered;\n\t\t\t\t\t\t\t\t_ptFill = ptFill;\n\t\t\t\t\t\t\t\t_ptStroke = ptStroke;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tlet pt = cursorPts[i];\n\n\t\t\t\t\t\t\tif (pt != null) {\n\t\t\t\t\t\t\t\tcursorPtsLft[i] = ptLft;\n\t\t\t\t\t\t\t\tcursorPtsTop[i] = ptTop;\n\n\t\t\t\t\t\t\t\telSize(pt, ptWid, ptHgt, centered);\n\t\t\t\t\t\t\t\telColor(pt, ptFill, ptStroke);\n\t\t\t\t\t\t\t\telTrans(pt, ceil(ptLft), ceil(ptTop), plotWidCss, plotHgtCss);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if only using single hover point (at cursorPts[0])\n\t\t\t// we have trigger styling at last visible series (once closestSeries is settled)\n\t\t\tif (cursorOnePt) {\n\t\t\t\t// some of this logic is similar to series focus below, since it matches the behavior by design\n\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tlet focusChanged = focusedSeries == null ? closestDist <= p : (closestDist > p || closestSeries != focusedSeries);\n\n\t\t\t\tif (shouldSetLegend || focusChanged) {\n\t\t\t\t\tlet pt = cursorPts[0];\n\n\t\t\t\t\tif (pt != null) {\n\t\t\t\t\t\tcursorPtsLft[0] = _ptLft;\n\t\t\t\t\t\tcursorPtsTop[0] = _ptTop;\n\n\t\t\t\t\t\telSize(pt, _ptWid, _ptHgt, _centered);\n\t\t\t\t\t\telColor(pt, _ptFill, _ptStroke);\n\t\t\t\t\t\telTrans(pt, ceil(_ptLft), ceil(_ptTop), plotWidCss, plotHgtCss);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// nit: cursor.drag.setSelect is assumed always true\n\t\tif (select.show && dragging) {\n\t\t\tif (src != null) {\n\t\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\t\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\t\t\t\tlet [xKeySrc, yKeySrc] = src.cursor.sync.scales;\n\n\t\t\t\t// match the dragX/dragY implicitness/explicitness of src\n\t\t\t\tlet sdrag = src.cursor.drag;\n\t\t\t\tdragX = sdrag._x;\n\t\t\t\tdragY = sdrag._y;\n\n\t\t\t\tif (dragX || dragY) {\n\t\t\t\t\tlet { left, top, width, height } = src.select;\n\n\t\t\t\t\tlet sori = src.scales[xKeySrc].ori;\n\t\t\t\t\tlet sPosToVal = src.posToVal;\n\n\t\t\t\t\tlet sOff, sDim, sc, a, b;\n\n\t\t\t\t\tlet matchingX = xKey != null && matchXKeys(xKey, xKeySrc);\n\t\t\t\t\tlet matchingY = yKey != null && matchYKeys(yKey, yKeySrc);\n\n\t\t\t\t\tif (matchingX && dragX) {\n\t\t\t\t\t\tif (sori == 0) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[xKey];\n\n\t\t\t\t\t\ta = valToPosX(sPosToVal(sOff, xKeySrc),        sc, xDim, 0);\n\t\t\t\t\t\tb = valToPosX(sPosToVal(sOff + sDim, xKeySrc), sc, xDim, 0);\n\n\t\t\t\t\t\tsetSelX(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelX(0, xDim);\n\n\t\t\t\t\tif (matchingY && dragY) {\n\t\t\t\t\t\tif (sori == 1) {\n\t\t\t\t\t\t\tsOff = left;\n\t\t\t\t\t\t\tsDim = width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsOff = top;\n\t\t\t\t\t\t\tsDim = height;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsc = scales[yKey];\n\n\t\t\t\t\t\ta = valToPosY(sPosToVal(sOff, yKeySrc),        sc, yDim, 0);\n\t\t\t\t\t\tb = valToPosY(sPosToVal(sOff + sDim, yKeySrc), sc, yDim, 0);\n\n\t\t\t\t\t\tsetSelY(min(a,b), abs(b-a));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\thideSelect();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet rawDX = abs(rawMouseLeft1 - rawMouseLeft0);\n\t\t\t\tlet rawDY = abs(rawMouseTop1 - rawMouseTop0);\n\n\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\tlet _rawDX = rawDX;\n\t\t\t\t\trawDX = rawDY;\n\t\t\t\t\trawDY = _rawDX;\n\t\t\t\t}\n\n\t\t\t\tdragX = drag.x && rawDX >= drag.dist;\n\t\t\t\tdragY = drag.y && rawDY >= drag.dist;\n\n\t\t\t\tlet uni = drag.uni;\n\n\t\t\t\tif (uni != null) {\n\t\t\t\t\t// only calc drag status if they pass the dist thresh\n\t\t\t\t\tif (dragX && dragY) {\n\t\t\t\t\t\tdragX = rawDX >= uni;\n\t\t\t\t\t\tdragY = rawDY >= uni;\n\n\t\t\t\t\t\t// force unidirectionality when both are under uni limit\n\t\t\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\t\t\tif (rawDY > rawDX)\n\t\t\t\t\t\t\t\tdragY = true;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdragX = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (drag.x && drag.y && (dragX || dragY))\n\t\t\t\t\t// if omni with no uni then both dragX / dragY should be true if either is true\n\t\t\t\t\tdragX = dragY = true;\n\n\t\t\t\tlet p0, p1;\n\n\t\t\t\tif (dragX) {\n\t\t\t\t\tif (scaleX.ori == 0) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelX(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragY)\n\t\t\t\t\t\tsetSelY(0, yDim);\n\t\t\t\t}\n\n\t\t\t\tif (dragY) {\n\t\t\t\t\tif (scaleX.ori == 1) {\n\t\t\t\t\t\tp0 = mouseLeft0;\n\t\t\t\t\t\tp1 = mouseLeft1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp0 = mouseTop0;\n\t\t\t\t\t\tp1 = mouseTop1;\n\t\t\t\t\t}\n\n\t\t\t\t\tsetSelY(min(p0, p1), abs(p1 - p0));\n\n\t\t\t\t\tif (!dragX)\n\t\t\t\t\t\tsetSelX(0, xDim);\n\t\t\t\t}\n\n\t\t\t\t// the drag didn't pass the dist requirement\n\t\t\t\tif (!dragX && !dragY) {\n\t\t\t\t\tsetSelX(0, 0);\n\t\t\t\t\tsetSelY(0, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrag._x = dragX;\n\t\tdrag._y = dragY;\n\n\t\tif (src == null) {\n\t\t\tif (_pub) {\n\t\t\t\tif (syncKey != null) {\n\t\t\t\t\tlet [xSyncKey, ySyncKey] = syncOpts.scales;\n\n\t\t\t\t\tsyncOpts.values[0] = xSyncKey != null ? posToVal(scaleX.ori == 0 ? mouseLeft1 : mouseTop1, xSyncKey) : null;\n\t\t\t\t\tsyncOpts.values[1] = ySyncKey != null ? posToVal(scaleX.ori == 1 ? mouseLeft1 : mouseTop1, ySyncKey) : null;\n\t\t\t\t}\n\n\t\t\t\tpubSync(mousemove, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, idx);\n\t\t\t}\n\n\t\t\tif (cursorFocus) {\n\t\t\t\tlet shouldPub = _pub && syncOpts.setSeries;\n\t\t\t\tlet p = focus.prox;\n\n\t\t\t\tif (focusedSeries == null) {\n\t\t\t\t\tif (closestDist <= p)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (closestDist > p)\n\t\t\t\t\t\tsetSeries(null, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t\telse if (closestSeries != focusedSeries)\n\t\t\t\t\t\tsetSeries(closestSeries, FOCUS_TRUE, true, shouldPub);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (shouldSetLegend) {\n\t\t\tlegend.idx = idx;\n\t\t\tsetLegend();\n\t\t}\n\n\t\t_fire !== false && fire(\"setCursor\");\n\t}\n\n\tlet rect = null;\n\n\tObject.defineProperty(self, 'rect', {\n\t\tget() {\n\t\t\tif (rect == null)\n\t\t\t\tsyncRect(false);\n\n\t\t\treturn rect;\n\t\t},\n\t});\n\n\tfunction syncRect(defer = false) {\n\t\tif (defer)\n\t\t\trect = null;\n\t\telse {\n\t\t\trect = over.getBoundingClientRect();\n\t\t\tfire(\"syncRect\", rect);\n\t\t}\n\t}\n\n\tfunction mouseMove(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\t// Chrome on Windows has a bug which triggers a stray mousemove event after an initial mousedown event\n\t\t// when clicking into a plot as part of re-focusing the browser window.\n\t\t// we gotta ignore it to avoid triggering a phantom drag / setSelect\n\t\t// However, on touch-only devices Chrome-based browsers trigger a 0-distance mousemove before mousedown\n\t\t// so we don't ignore it when mousedown has set the dragging flag\n\t\tif (dragging && e != null && e.movementX == 0 && e.movementY == 0)\n\t\t\treturn;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, e != null);\n\n\t\tif (e != null)\n\t\t\tupdateCursor(null, true, true);\n\t\telse\n\t\t\tupdateCursor(src, true, false);\n\t}\n\n\tfunction cacheMouse(e, src, _l, _t, _w, _h, _i, initial, snap) {\n\t\tif (rect == null)\n\t\t\tsyncRect(false);\n\n\t\tsetCursorEvent(e);\n\n\t\tif (e != null) {\n\t\t\t_l = e.clientX - rect.left;\n\t\t\t_t = e.clientY - rect.top;\n\t\t}\n\t\telse {\n\t\t\tif (_l < 0 || _t < 0) {\n\t\t\t\tmouseLeft1 = -10;\n\t\t\t\tmouseTop1 = -10;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet [xKey, yKey] = syncOpts.scales;\n\n\t\t\tlet syncOptsSrc = src.cursor.sync;\n\t\t\tlet [xValSrc, yValSrc] = syncOptsSrc.values;\n\t\t\tlet [xKeySrc, yKeySrc] = syncOptsSrc.scales;\n\t\t\tlet [matchXKeys, matchYKeys] = syncOpts.match;\n\n\t\t\tlet rotSrc = src.axes[0].side % 2 == 1;\n\n\t\t\tlet xDim = scaleX.ori == 0 ? plotWidCss : plotHgtCss,\n\t\t\t\tyDim = scaleX.ori == 1 ? plotWidCss : plotHgtCss,\n\t\t\t\t_xDim = rotSrc ? _h : _w,\n\t\t\t\t_yDim = rotSrc ? _w : _h,\n\t\t\t\t_xPos = rotSrc ? _t : _l,\n\t\t\t\t_yPos = rotSrc ? _l : _t;\n\n\t\t\tif (xKeySrc != null)\n\t\t\t\t_l = matchXKeys(xKey, xKeySrc) ? getPos(xValSrc, scales[xKey], xDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_l = xDim * (_xPos/_xDim);\n\n\t\t\tif (yKeySrc != null)\n\t\t\t\t_t = matchYKeys(yKey, yKeySrc) ? getPos(yValSrc, scales[yKey], yDim, 0) : -10;\n\t\t\telse\n\t\t\t\t_t = yDim * (_yPos/_yDim);\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\tlet __l = _l;\n\t\t\t\t_l = _t;\n\t\t\t\t_t = __l;\n\t\t\t}\n\t\t}\n\n\t\tif (snap && (src == null || src.cursor.event.type == mousemove)) {\n\t\t\tif (_l <= 1 || _l >= plotWidCss - 1)\n\t\t\t\t_l = incrRound(_l, plotWidCss);\n\n\t\t\tif (_t <= 1 || _t >= plotHgtCss - 1)\n\t\t\t\t_t = incrRound(_t, plotHgtCss);\n\t\t}\n\n\t\tif (initial) {\n\t\t\trawMouseLeft0 = _l;\n\t\t\trawMouseTop0 = _t;\n\n\t\t\t[mouseLeft0, mouseTop0] = cursor.move(self, _l, _t);\n\t\t}\n\t\telse {\n\t\t\tmouseLeft1 = _l;\n\t\t\tmouseTop1 = _t;\n\t\t}\n\t}\n\n\tconst _hideProps = {\n\t\twidth: 0,\n\t\theight: 0,\n\t\tleft: 0,\n\t\ttop: 0,\n\t};\n\n\tfunction hideSelect() {\n\t\tsetSelect(_hideProps, false);\n\t}\n\n\tlet downSelectLeft;\n\tlet downSelectTop;\n\tlet downSelectWidth;\n\tlet downSelectHeight;\n\n\tfunction mouseDown(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = true;\n\t\tdragX = dragY = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, true, false);\n\n\t\tif (e != null) {\n\t\t\tonMouse(mouseup, doc, mouseUp, false);\n\t\t\tpubSync(mousedown, self, mouseLeft0, mouseTop0, plotWidCss, plotHgtCss, null);\n\t\t}\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tdownSelectLeft   = left;\n\t\tdownSelectTop    = top;\n\t\tdownSelectWidth  = width;\n\t\tdownSelectHeight = height;\n\n\t//\thideSelect();\n\t}\n\n\tfunction mouseUp(e, src, _l, _t, _w, _h, _i) {\n\t\tdragging = drag._x = drag._y = false;\n\n\t\tcacheMouse(e, src, _l, _t, _w, _h, _i, false, true);\n\n\t\tlet { left, top, width, height } = select;\n\n\t\tlet hasSelect = width > 0 || height > 0;\n\t\tlet chgSelect = (\n\t\t\tdownSelectLeft   != left   ||\n\t\t\tdownSelectTop    != top    ||\n\t\t\tdownSelectWidth  != width  ||\n\t\t\tdownSelectHeight != height\n\t\t);\n\n\t\thasSelect && chgSelect && setSelect(select);\n\n\t\tif (drag.setScale && hasSelect && chgSelect) {\n\t\t//\tif (syncKey != null) {\n\t\t//\t\tdragX = drag.x;\n\t\t//\t\tdragY = drag.y;\n\t\t//\t}\n\n\t\t\tlet xOff = left,\n\t\t\t\txDim = width,\n\t\t\t\tyOff = top,\n\t\t\t\tyDim = height;\n\n\t\t\tif (scaleX.ori == 1) {\n\t\t\t\txOff = top,\n\t\t\t\txDim = height,\n\t\t\t\tyOff = left,\n\t\t\t\tyDim = width;\n\t\t\t}\n\n\t\t\tif (dragX) {\n\t\t\t\t_setScale(xScaleKey,\n\t\t\t\t\tposToVal(xOff, xScaleKey),\n\t\t\t\t\tposToVal(xOff + xDim, xScaleKey)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (dragY) {\n\t\t\t\tfor (let k in scales) {\n\t\t\t\t\tlet sc = scales[k];\n\n\t\t\t\t\tif (k != xScaleKey && sc.from == null && sc.min != inf) {\n\t\t\t\t\t\t_setScale(k,\n\t\t\t\t\t\t\tposToVal(yOff + yDim, k),\n\t\t\t\t\t\t\tposToVal(yOff, k)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thideSelect();\n\t\t}\n\t\telse if (cursor.lock) {\n\t\t\tcursor._lock = !cursor._lock;\n\t\t\tupdateCursor(src, true, e != null);\n\t\t}\n\n\t\tif (e != null) {\n\t\t\toffMouse(mouseup, doc);\n\t\t\tpubSync(mouseup, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t\t}\n\t}\n\n\tfunction mouseLeave(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tsetCursorEvent(e);\n\n\t\tlet _dragging = dragging;\n\n\t\tif (dragging) {\n\t\t\t// handle case when mousemove aren't fired all the way to edges by browser\n\t\t\tlet snapH = true;\n\t\t\tlet snapV = true;\n\t\t\tlet snapProx = 10;\n\n\t\t\tlet dragH, dragV;\n\n\t\t\tif (scaleX.ori == 0) {\n\t\t\t\tdragH = dragX;\n\t\t\t\tdragV = dragY;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdragH = dragY;\n\t\t\t\tdragV = dragX;\n\t\t\t}\n\n\t\t\tif (dragH && dragV) {\n\t\t\t\t// maybe omni corner snap\n\t\t\t\tsnapH = mouseLeft1 <= snapProx || mouseLeft1 >= plotWidCss - snapProx;\n\t\t\t\tsnapV = mouseTop1  <= snapProx || mouseTop1  >= plotHgtCss - snapProx;\n\t\t\t}\n\n\t\t\tif (dragH && snapH)\n\t\t\t\tmouseLeft1 = mouseLeft1 < mouseLeft0 ? 0 : plotWidCss;\n\n\t\t\tif (dragV && snapV)\n\t\t\t\tmouseTop1 = mouseTop1 < mouseTop0 ? 0 : plotHgtCss;\n\n\t\t\tupdateCursor(null, true, true);\n\n\t\t\tdragging = false;\n\t\t}\n\n\t\tmouseLeft1 = -10;\n\t\tmouseTop1 = -10;\n\n\t\tactiveIdxs.fill(null);\n\n\t\t// passing a non-null timestamp to force sync/mousemove event\n\t\tupdateCursor(null, true, true);\n\n\t\tif (_dragging)\n\t\t\tdragging = _dragging;\n\t}\n\n\tfunction dblClick(e, src, _l, _t, _w, _h, _i) {\n\t\tif (cursor._lock)\n\t\t\treturn;\n\n\t\tsetCursorEvent(e);\n\n\t\tautoScaleX();\n\n\t\thideSelect();\n\n\t\tif (e != null)\n\t\t\tpubSync(dblclick, self, mouseLeft1, mouseTop1, plotWidCss, plotHgtCss, null);\n\t}\n\n\tfunction syncPxRatio() {\n\t\taxes.forEach(syncFontSize);\n\t\t_setSize(self.width, self.height, true);\n\t}\n\n\ton(dppxchange, win, syncPxRatio);\n\n\t// internal pub/sub\n\tconst events = {};\n\n\tevents.mousedown = mouseDown;\n\tevents.mousemove = mouseMove;\n\tevents.mouseup = mouseUp;\n\tevents.dblclick = dblClick;\n\tevents[\"setSeries\"] = (e, src, idx, opts) => {\n\t\tlet seriesIdxMatcher = syncOpts.match[2];\n\t\tidx = seriesIdxMatcher(self, src, idx);\n\t\tidx != -1 && setSeries(idx, opts, true, false);\n\t};\n\n\tif (showCursor) {\n\t\tonMouse(mousedown,  over, mouseDown);\n\t\tonMouse(mousemove,  over, mouseMove);\n\t\tonMouse(mouseenter, over, e => {\n\t\t\tsetCursorEvent(e);\n\t\t\tsyncRect(false);\n\t\t});\n\t\tonMouse(mouseleave, over, mouseLeave);\n\n\t\tonMouse(dblclick, over, dblClick);\n\n\t\tcursorPlots.add(self);\n\n\t\tself.syncRect = syncRect;\n\t}\n\n\t// external on/off\n\tconst hooks = self.hooks = opts.hooks || {};\n\n\tfunction fire(evName, a1, a2) {\n\t\tif (deferHooks)\n\t\t\thooksQueue.push([evName, a1, a2]);\n\t\telse {\n\t\t\tif (evName in hooks) {\n\t\t\t\thooks[evName].forEach(fn => {\n\t\t\t\t\tfn.call(null, self, a1, a2);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t(opts.plugins || []).forEach(p => {\n\t\tfor (let evName in p.hooks)\n\t\t\thooks[evName] = (hooks[evName] || []).concat(p.hooks[evName]);\n\t});\n\n\tconst seriesIdxMatcher = (self, src, srcSeriesIdx) => srcSeriesIdx;\n\n\tconst syncOpts = assign({\n\t\tkey: null,\n\t\tsetSeries: false,\n\t\tfilters: {\n\t\t\tpub: retTrue,\n\t\t\tsub: retTrue,\n\t\t},\n\t\tscales: [xScaleKey, series[1] ? series[1].scale : null],\n\t\tmatch: [retEq, retEq, seriesIdxMatcher],\n\t\tvalues: [null, null],\n\t}, cursor.sync);\n\n\tif (syncOpts.match.length == 2)\n\t\tsyncOpts.match.push(seriesIdxMatcher);\n\n\tcursor.sync = syncOpts;\n\n\tconst syncKey = syncOpts.key;\n\n\tconst sync = _sync(syncKey);\n\n\tfunction pubSync(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.pub(type, src, x, y, w, h, i))\n\t\t\tsync.pub(type, src, x, y, w, h, i);\n\t}\n\n\tsync.sub(self);\n\n\tfunction pub(type, src, x, y, w, h, i) {\n\t\tif (syncOpts.filters.sub(type, src, x, y, w, h, i))\n\t\t\tevents[type](null, src, x, y, w, h, i);\n\t}\n\n\tself.pub = pub;\n\n\tfunction destroy() {\n\t\tsync.unsub(self);\n\t\tcursorPlots.delete(self);\n\t\tmouseListeners.clear();\n\t\toff(dppxchange, win, syncPxRatio);\n\t\troot.remove();\n\t\tlegendTable?.remove(); // in case mounted outside of root\n\t\tfire(\"destroy\");\n\t}\n\n\tself.destroy = destroy;\n\n\tfunction _init() {\n\t\tfire(\"init\", opts, data);\n\n\t\tsetData(data || opts.data, false);\n\n\t\tif (pendScales[xScaleKey])\n\t\t\tsetScale(xScaleKey, pendScales[xScaleKey]);\n\t\telse\n\t\t\tautoScaleX();\n\n\t\tshouldSetSelect = select.show && (select.width > 0 || select.height > 0);\n\t\tshouldSetCursor = shouldSetLegend = true;\n\n\t\t_setSize(opts.width, opts.height);\n\t}\n\n\tseries.forEach(initSeries);\n\n\taxes.forEach(initAxis);\n\n\tif (then) {\n\t\tif (then instanceof HTMLElement) {\n\t\t\tthen.appendChild(root);\n\t\t\t_init();\n\t\t}\n\t\telse\n\t\t\tthen(self, _init);\n\t}\n\telse\n\t\t_init();\n\n\treturn self;\n}\n\nuPlot.assign = assign;\nuPlot.fmtNum = fmtNum;\nuPlot.rangeNum = rangeNum;\nuPlot.rangeLog = rangeLog;\nuPlot.rangeAsinh = rangeAsinh;\nuPlot.orient   = orient;\nuPlot.pxRatio = pxRatio;\n\n{\n\tuPlot.join = join;\n}\n\n{\n\tuPlot.fmtDate = fmtDate;\n\tuPlot.tzDate  = tzDate;\n}\n\nuPlot.sync = _sync;\n\n{\n\tuPlot.addGap = addGap;\n\tuPlot.clipGaps = clipGaps;\n\n\tlet paths = uPlot.paths = {\n\t\tpoints,\n\t};\n\n\t(paths.linear  = linear);\n\t(paths.stepped = stepped);\n\t(paths.bars    = bars);\n\t(paths.spline  = monotoneCubic);\n}\n\nexport { uPlot as default };\n", "import ChartHook from \"./chart_hook\";\n\nexport default class BarChart extends ChartHook {}\n", "import ChartHook from \"./chart_hook\";\n\nexport default class LineChart extends ChartHook {}\n", "import ChartHook from \"./chart_hook\";\n\nexport default class SparklineChart extends ChartHook {\n  measureSize(payload) {\n    const width = Math.max(\n      Math.round(this.root?.clientWidth || this.el.clientWidth || 0),\n      48,\n    );\n\n    return {\n      width,\n      height: payload.height || 56,\n    };\n  }\n\n  buildOptions(payload, size) {\n    const options = super.buildOptions(\n      {\n        ...payload,\n        preset: \"line\",\n        grid: false,\n        tooltip: { ...payload.tooltip, show: false },\n        legend: { ...payload.legend, show: false, live: false },\n      },\n      size,\n    );\n\n    return {\n      ...options,\n      padding: [4, 2, 4, 2],\n      cursor: { show: false },\n      select: { show: false },\n      legend: { show: false },\n      axes: [{ show: false }, { show: false }],\n      series: options.series.map((series, index) => {\n        if (index === 0) {\n          return series;\n        }\n\n        return {\n          ...series,\n          width: payload.series[index - 1]?.width ?? 1.5,\n          points: { show: false },\n          fill:\n            payload.series[index - 1]?.fill || this.withAlpha(series.stroke, 0.18),\n          paths: this.uPlot.paths.linear(),\n        };\n      }),\n    };\n  }\n}\n", "import Popover from \"./popover\";\nimport DatePicker from \"./date_picker\";\nimport Select from \"./select\";\nimport LoadingBar from \"./loading\";\nimport Tooltip from \"./tooltip\";\nimport FlashGroup from \"./flash\";\nimport Tabs from \"./tabs\";\nimport Sidebar from \"./sidebar\";\nimport ChartHook from \"./chart_hook\";\nimport BarChart from \"./bar_chart\";\nimport LineChart from \"./line_chart\";\nimport SparklineChart from \"./sparkline_chart\";\n\nexport const Hooks = {\n  \"PUI.LoadingBar\": LoadingBar,\n  \"PUI.Popover\": Popover,\n  \"PUI.DatePicker\": DatePicker,\n  \"PUI.Select\": Select,\n  \"PUI.Tabs\": Tabs,\n  \"PUI.Tooltip\": Tooltip,\n  \"PUI.FlashGroup\": FlashGroup,\n  \"PUI.Sidebar\": Sidebar,\n  \"PUI.Chart\": ChartHook,\n  \"PUI.BarChart\": BarChart,\n  \"PUI.LineChart\": LineChart,\n  \"PUI.SparklineChart\": SparklineChart,\n};\n\nexport {\n  Popover,\n  DatePicker,\n  Select,\n  LoadingBar,\n  Tabs,\n  Tooltip,\n  FlashGroup,\n  Sidebar,\n  ChartHook,\n  BarChart,\n  LineChart,\n  SparklineChart,\n};\n"],
  "mappings": "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",
  "names": ["rect", "platform", "rect", "max", "offset", "platform", "placements", "sides", "side", "placement", "overflow", "rect", "platform", "x", "y", "min", "max", "platform", "getComputedStyle", "win", "getComputedStyle", "rect", "win", "scroll", "doc", "offset", "shift", "flip", "size", "hide", "arrow", "computePosition", "computePosition", "offset", "flip", "shift", "size", "hide", "doc", "ViewHook", "ViewHook", "offset", "computePosition", "flip", "shift", "size", "hide", "doc", "ViewHook", "ViewHook", "query", "computePosition", "offset", "flip", "shift", "size", "hide", "doc", "ViewHook", "ViewHook", "ViewHook", "computePosition", "offset", "flip", "shift", "arrow", "x", "y", "ViewHook", "ViewHook", "ViewHook", "floor", "min", "max", "round", "clamp", "_", "tzDate", "fmtDate", "s", "size", "gaps", "rect", "w", "points", "u", "seriesIdx", "font", "off", "key", "sc", "self", "i", "opts", "sidesWithAxes", "join", "facet", "data", "xScaleKey", "idxs", "offset", "strokePath", "strokeStyle", "fillPath", "fillStyle", "shiftAmt", "ticks", "border", "grid", "can", "seriesIdxMatcher", "ViewHook", "size", "font", "rect", "computePosition", "offset", "flip", "shift", "size"]
}
