motion-dom
Version:
1 lines • 51 kB
Source Map (JSON)
{"version":3,"file":"VisualElementDragControls.mjs","sources":["../../../../src/gestures/drag/VisualElementDragControls.ts"],"sourcesContent":["import { Axis, invariant, Point } from \"motion-utils\"\nimport { animateMotionValue } from \"../../animation/interfaces/motion-value\"\nimport type { Transition } from \"../../animation/types\"\nimport { getVariableValue } from \"../../animation/utils/css-variables-conversion\"\nimport { isCSSVariableToken } from \"../../animation/utils/is-css-variable\"\nimport { addDomEvent } from \"../../events/add-dom-event\"\nimport { addPointerEvent } from \"../../events/add-pointer-event\"\nimport { frame } from \"../../frameloop/frame\"\nimport type { MotionNodeOptions } from \"../../node/types\"\nimport {\n convertBoundingBoxToBox,\n convertBoxToBoundingBox,\n} from \"../../projection/geometry/conversion\"\nimport { calcLength } from \"../../projection/geometry/delta-calc\"\nimport { createBox } from \"../../projection/geometry/models\"\nimport type {\n IProjectionNode,\n LayoutUpdateData,\n} from \"../../projection/node/types\"\nimport { eachAxis } from \"../../projection/utils/each-axis\"\nimport { measurePageBox } from \"../../projection/utils/measure\"\nimport type { VisualElement } from \"../../render/VisualElement\"\nimport { resize } from \"../../resize\"\nimport { mixNumber } from \"../../utils/mix/number\"\nimport { percent, px } from \"../../value/types/numbers/units\"\nimport { addValueToWillChange } from \"../../value/will-change/add-will-change\"\nimport type { PanInfo } from \"../pan/types\"\nimport { PanSession } from \"../pan/PanSession\"\nimport { isElementTextInput } from \"../press/utils/is-keyboard-accessible\"\nimport { setDragLock } from \"./state/set-active\"\nimport type { DragPointConstraint, ResolvedConstraints } from \"./types\"\nimport {\n applyConstraints,\n calcOrigin,\n calcRelativeConstraints,\n calcViewportConstraints,\n defaultElastic,\n rebaseAxisConstraints,\n resolveDragElastic,\n} from \"./utils/constraints\"\n\n/**\n * Re-read the scroll of the projection's ancestors, and return that of the\n * `layoutScroll` ones as a key that changes when any of them scroll.\n *\n * Clear the cached scroll first so `updateScroll` bypasses its\n * per-animationId cache and re-reads the live value.\n */\nfunction measureScroll(projection: IProjectionNode) {\n let key = \"\"\n\n for (const node of projection.path) {\n node.scroll = undefined\n node.updateScroll()\n\n const { scroll } = node as IProjectionNode\n if (node !== projection.root && scroll) {\n key += scroll.offset.x + \",\" + scroll.offset.y + \",\"\n }\n }\n\n return key\n}\n\nexport const elementDragControls = new WeakMap<\n VisualElement,\n VisualElementDragControls\n>()\n\nexport interface DragControlOptions {\n /**\n * This distance after which dragging starts and a direction is locked in.\n *\n * @public\n */\n distanceThreshold?: number\n\n /**\n * Whether to immediately snap to the cursor when dragging starts.\n *\n * @public\n */\n snapToCursor?: boolean\n\n /**\n * Start dragging straight away, rather than once the pointer has moved\n * past `distanceThreshold`. For instance, to carry on a drag from\n * another element.\n *\n * @public\n */\n immediate?: boolean\n}\n\ntype DragDirection = \"x\" | \"y\"\n\nexport class VisualElementDragControls {\n visualElement: VisualElement<HTMLElement>\n\n panSession?: PanSession\n\n private openDragLock: VoidFunction | null = null\n\n isDragging = false\n private currentDirection: DragDirection | null = null\n\n /**\n * Where the drag started, which pointer offsets are added to. Public\n * so pinch() can restart a drag from where it leaves the element.\n */\n originPoint: Point = { x: 0, y: 0 }\n\n /**\n * The permitted boundaries of travel, in pixels.\n */\n private constraints: ResolvedConstraints | false = false\n\n private hasMutatedConstraints = false\n\n /**\n * A constraint, from a `dragConstraints` function, that moves the\n * element itself, from the drag's latest pointer position.\n */\n private point?: DragPointConstraint | false\n\n /**\n * The `layoutScroll` ancestors' scroll (see measureScroll) when ref\n * constraints were last measured.\n */\n private scroll?: string\n\n /**\n * The per-axis resolved elastic values.\n */\n elastic = createBox()\n\n /**\n * The latest pointer event. Used as fallback when the `cancel` and `stop` functions are called without arguments.\n */\n private latestPointerEvent: PointerEvent | null = null\n\n /**\n * The latest pan info. Used as fallback when the `cancel` and `stop` functions are called without arguments.\n */\n private latestPanInfo: PanInfo | null = null\n\n /**\n * Where drag options are read from. By default these are the\n * VisualElement's props (as with a React `motion` component), but the\n * vanilla `drag()` API provides its own.\n */\n private readProps: () => MotionNodeOptions\n\n constructor(\n visualElement: VisualElement<HTMLElement>,\n readProps: () => MotionNodeOptions = () => visualElement.getProps()\n ) {\n this.visualElement = visualElement\n this.readProps = readProps\n }\n\n start(originEvent: PointerEvent, options: DragControlOptions = {}) {\n /**\n * Don't start dragging if this component is exiting\n */\n if (this.visualElement.presenceContext?.isPresent === false) return\n\n const onSessionStart = (event: PointerEvent) => {\n if (options.snapToCursor) this.snapToCursor(event)\n this.stopAnimation()\n }\n\n const onStart = (event: PointerEvent, info: PanInfo) => {\n // Attempt to grab the global drag gesture lock - maybe make this part of PanSession\n const { drag, dragConstraints, dragPropagation, onDragStart } =\n this.getProps()\n\n if (drag && !dragPropagation) {\n this.openDragLock?.()\n\n this.openDragLock = setDragLock(drag)\n\n // If we don 't have the lock, don't start dragging\n if (!this.openDragLock) return\n }\n\n this.latestPointerEvent = event\n this.latestPanInfo = info\n this.isDragging = true\n\n this.currentDirection = null\n\n this.resolveConstraints()\n\n const { projection } = this.visualElement\n if (projection) {\n projection.isAnimationBlocked = true\n projection.target = undefined\n }\n\n /**\n * Record gesture origin and pointer offset\n */\n eachAxis((axis) => {\n let current = this.getAxisMotionValue(axis).get() || 0\n\n /**\n * If the MotionValue is a CSS variable, like \"var(--y)\",\n * resolve it so it can be converted to px below.\n */\n if (isCSSVariableToken(current)) {\n current =\n getVariableValue(\n current,\n this.visualElement.current!\n ) || 0\n }\n\n /**\n * If the MotionValue is a px or percentage value convert to px\n */\n if (px.test(current)) {\n current = parseFloat(current)\n } else if (percent.test(current)) {\n const measuredAxis = projection?.layout?.layoutBox[axis]\n\n if (measuredAxis) {\n current =\n calcLength(measuredAxis) *\n (parseFloat(current) / 100)\n }\n }\n\n this.originPoint[axis] = current\n })\n\n this.point =\n typeof dragConstraints === \"function\" && dragConstraints(this)\n\n // Fire onDragStart event\n if (onDragStart) {\n frame.update(() => onDragStart(event, info), false, true)\n }\n\n addValueToWillChange(this.visualElement, \"transform\")\n\n this.visualElement.animationState?.setActive(\"whileDrag\", true)\n }\n\n const onMove = (event: PointerEvent, info: PanInfo) => {\n this.latestPointerEvent = event\n this.latestPanInfo = info\n\n const {\n dragPropagation,\n dragDirectionLock,\n onDirectionLock,\n onDrag,\n } = this.getProps()\n\n // If we didn't successfully receive the gesture lock, early return.\n if (!dragPropagation && !this.openDragLock) return\n\n const { offset } = info\n // Attempt to detect drag direction if directionLock is true\n if (dragDirectionLock && this.currentDirection === null) {\n this.currentDirection = getCurrentDirection(offset)\n\n /**\n * Wait for more movement until a direction is set. Once\n * it is, apply this move too: it can be the last before\n * release when the browser coalesces a fast gesture.\n */\n if (this.currentDirection === null) return\n\n onDirectionLock && onDirectionLock(this.currentDirection)\n }\n\n // Update each point with the latest position\n this.updateAxis(\"x\", offset)\n this.updateAxis(\"y\", offset)\n this.point && this.point.move()\n\n /**\n * Ideally we would leave the renderer to fire naturally at the end of\n * this frame but if the element is about to change layout as the result\n * of a re-render we want to ensure the browser can read the latest\n * bounding box to ensure the pointer and element don't fall out of sync.\n */\n this.visualElement.render()\n\n /**\n * This must fire after the render call as it might trigger a state\n * change which itself might trigger a layout update.\n */\n if (onDrag) {\n frame.update(() => onDrag(event, info), false, true)\n }\n }\n\n const onSessionEnd = (event: PointerEvent, info: PanInfo) => {\n this.latestPointerEvent = event\n this.latestPanInfo = info\n\n this.stop(event, info)\n\n this.latestPointerEvent = null\n this.latestPanInfo = null\n }\n\n const resumeAnimation = () => {\n const { dragSnapToOrigin: snap } = this.getProps()\n if (snap || this.constraints || this.point) {\n this.startAnimation({ x: 0, y: 0 })\n }\n }\n\n const { dragSnapToOrigin } = this.getProps()\n this.panSession = new PanSession(\n originEvent,\n {\n onSessionStart,\n onStart,\n onMove,\n onSessionEnd,\n resumeAnimation,\n },\n {\n ...options,\n transformPagePoint: this.visualElement.getTransformPagePoint(),\n dragSnapToOrigin,\n contextWindow:\n this.visualElement.current?.ownerDocument.defaultView,\n element: this.visualElement.current,\n }\n )\n }\n\n /**\n * @param dragAxes - The axes to animate on release, if not the `drag`\n * prop's, e.g. when drag was disabled mid-gesture.\n */\n stop(\n event?: PointerEvent,\n panInfo?: PanInfo,\n dragAxes?: MotionNodeOptions[\"drag\"]\n ) {\n const finalEvent = event || this.latestPointerEvent\n const finalPanInfo = panInfo || this.latestPanInfo\n\n const isDragging = this.isDragging\n this.cancel()\n if (!isDragging || !finalPanInfo || !finalEvent) return\n\n const { velocity } = finalPanInfo\n this.startAnimation(velocity, dragAxes)\n\n const { onDragEnd } = this.getProps()\n if (onDragEnd) {\n frame.postRender(() => onDragEnd(finalEvent, finalPanInfo))\n }\n }\n\n cancel() {\n this.isDragging = false\n\n const { projection, animationState } = this.visualElement\n\n if (projection) {\n projection.isAnimationBlocked = false\n }\n\n this.endPanSession()\n\n if (!this.getProps().dragPropagation && this.openDragLock) {\n this.openDragLock()\n this.openDragLock = null\n }\n\n animationState?.setActive(\"whileDrag\", false)\n }\n\n /**\n * Clean up the pan session without modifying other drag state.\n * This is used during unmount to ensure event listeners are removed\n * without affecting projection animations or drag locks.\n */\n endPanSession() {\n this.panSession?.end()\n this.panSession = undefined\n }\n\n private updateAxis(axis: DragDirection, offset?: Point) {\n /**\n * Read drag per axis: a callback fired while updating the x axis\n * can synchronously re-render with new props.\n */\n const { drag } = this.readProps()\n\n // If we're not dragging this axis, do an early return.\n if (!offset || !shouldDrag(axis, drag, this.currentDirection)) return\n\n const axisValue = this.getAxisMotionValue(axis)\n let next = this.originPoint[axis] + offset[axis]\n\n // Apply constraints\n const constraints = this.constraints && this.constraints[axis]\n if (constraints) {\n next = applyConstraints(next, constraints, this.elastic[axis])\n }\n\n this.point ? (this.point[axis] = next) : axisValue.set(next)\n }\n\n private resolveConstraints() {\n const { dragConstraints, dragElastic } = this.getProps()\n\n const { projection } = this.visualElement\n const layout =\n projection && (projection.layout || projection.measure(false))\n\n const prevConstraints = this.constraints\n\n if (isElementConstraints(dragConstraints)) {\n /**\n * Ref constraints are measured with the layout. Scrolling a\n * `layoutScroll` ancestor since can move the element relative\n * to them without a layout measurement, so measure them again\n * (#2024). Otherwise keep them: they and the layout can both\n * have moved on the page since, e.g. when content above grows.\n */\n if (\n !this.constraints ||\n this.scroll !== measureScroll(projection!)\n ) {\n this.constraints = this.resolveRefConstraints()\n }\n } else {\n if (\n dragConstraints &&\n layout &&\n typeof dragConstraints === \"object\"\n ) {\n this.constraints = calcRelativeConstraints(\n layout.layoutBox,\n dragConstraints\n )\n } else {\n this.constraints = false\n }\n }\n\n this.elastic = resolveDragElastic(dragElastic)\n\n /**\n * If we're outputting to external MotionValues, we want to rebase the measured constraints\n * from viewport-relative to component-relative. This only applies to relative (non-ref)\n * constraints, as ref-based constraints from calcViewportConstraints are already in the\n * correct coordinate space for the motion value transform offset.\n */\n if (\n prevConstraints !== this.constraints &&\n !isElementConstraints(dragConstraints) &&\n layout &&\n this.constraints &&\n !this.hasMutatedConstraints\n ) {\n eachAxis((axis) => {\n if (\n this.constraints !== false &&\n this.getAxisMotionValue(axis)\n ) {\n this.constraints[axis] = rebaseAxisConstraints(\n layout.layoutBox[axis],\n this.constraints[axis]\n )\n }\n })\n }\n }\n\n private resolveRefConstraints() {\n const { dragConstraints: constraints, onMeasureDragConstraints } =\n this.getProps()\n if (!isElementConstraints(constraints)) return false\n\n const constraintsElement = resolveConstraintsElement(constraints)\n\n process.env.NODE_ENV !== \"production\" &&\n invariant(\n !!constraintsElement,\n \"If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.\",\n \"drag-constraints-ref\"\n )\n\n const { projection } = this.visualElement\n\n // TODO\n if (!projection || !projection.layout) return false\n\n /**\n * Refresh the scroll offsets of the root and `layoutScroll`\n * ancestors so the constraint's viewport box translates to the\n * layout's coordinates. The scroll captured when the layout was\n * measured can be stale if they've scrolled since — e.g. via the\n * browser restoring scroll on refresh, or an ancestor layout effect\n * running after this element's mount (#2829).\n */\n this.scroll = measureScroll(projection)\n\n const constraintsBox = measurePageBox(\n constraintsElement as HTMLElement,\n projection.root!,\n this.visualElement.getTransformPagePoint()\n )\n\n /**\n * layoutBox removes the scroll of `layoutScroll` ancestors, so\n * remove it from the constraints box too.\n */\n let measuredConstraints = calcViewportConstraints(\n projection.layout.layoutBox,\n projection.removeElementScroll(constraintsBox)\n )\n\n /**\n * If there's an onMeasureDragConstraints listener we call it and\n * if different constraints are returned, set constraints to that\n */\n if (onMeasureDragConstraints) {\n const userConstraints = onMeasureDragConstraints(\n convertBoxToBoundingBox(measuredConstraints)\n )\n\n this.hasMutatedConstraints = !!userConstraints\n\n if (userConstraints) {\n measuredConstraints = convertBoundingBoxToBox(userConstraints)\n }\n }\n\n return measuredConstraints\n }\n\n private startAnimation(\n velocity: Point,\n dragAxes?: MotionNodeOptions[\"drag\"]\n ) {\n const {\n drag,\n dragMomentum,\n dragElastic,\n dragTransition,\n dragSnapToOrigin,\n onDragTransitionEnd,\n } = this.getProps()\n\n /**\n * Overdamp the boundary spring if `dragElastic` is disabled. There's still a frame\n * of spring animations so we should look into adding a disable spring option to `inertia`.\n * We could do something here where we affect the `bounceStiffness` and `bounceDamping`\n * using the value of `dragElastic`.\n */\n const options = {\n bounceStiffness: dragElastic ? 200 : 1000000,\n bounceDamping: dragElastic ? 40 : 10000000,\n timeConstant: 750,\n restDelta: 1,\n restSpeed: 10,\n ...dragTransition,\n }\n\n const axisVelocity = (axis: DragDirection) =>\n dragMomentum &&\n !(this.point && dragSnapToOrigin) &&\n shouldDrag(axis, dragAxes || drag, this.currentDirection)\n ? velocity[axis]\n : 0\n\n if (this.point && !dragSnapToOrigin) {\n return this.point\n .release(\n { x: axisVelocity(\"x\"), y: axisVelocity(\"y\") },\n options\n )\n .then(onDragTransitionEnd)\n }\n\n const constraints: Partial<ResolvedConstraints> = this.constraints || {}\n\n const momentumAnimations = eachAxis((axis) => {\n if (!shouldDrag(axis, dragAxes || drag, this.currentDirection)) {\n return\n }\n\n let transition = constraints[axis] || {}\n\n if (\n dragSnapToOrigin === true ||\n (dragSnapToOrigin as unknown) === axis\n )\n transition = { min: 0, max: 0 }\n\n const inertia: Transition = {\n type: \"inertia\",\n velocity: axisVelocity(axis),\n ...options,\n ...transition,\n }\n\n // If we're not animating on an externally-provided `MotionValue` we can use the\n // component's animation controls which will handle interactions with whileHover (etc),\n // otherwise we just have to animate the `MotionValue` itself.\n return this.startAxisValueAnimation(axis, inertia)\n })\n\n // Run all animations and then resolve the new drag constraints.\n return Promise.all(momentumAnimations).then(onDragTransitionEnd)\n }\n\n private startAxisValueAnimation(\n axis: DragDirection,\n transition: Transition\n ) {\n const axisValue = this.getAxisMotionValue(axis)\n\n addValueToWillChange(this.visualElement, axis)\n\n return axisValue.start(\n animateMotionValue(\n axis,\n axisValue,\n 0,\n transition,\n this.visualElement,\n false\n )\n )\n }\n\n stopAnimation() {\n eachAxis((axis) => this.getAxisMotionValue(axis).stop())\n }\n\n /**\n * Drag works differently depending on which props are provided.\n *\n * - If _dragX and _dragY are provided, we output the gesture delta directly to those motion values.\n * - Otherwise, we apply the delta to the x/y motion values.\n */\n getAxisMotionValue(axis: DragDirection) {\n const dragKey =\n `_drag${axis.toUpperCase()}` as `_drag${Uppercase<DragDirection>}`\n const props = this.readProps()\n const externalMotionValue = props[dragKey]\n\n return externalMotionValue\n ? externalMotionValue\n : this.visualElement.getValue(\n axis,\n this.visualElement.latestValues[axis] ?? 0\n )\n }\n\n /**\n * Measure the live box - projection.layout may or may not include the\n * drag transform, depending on when it was measured.\n */\n private snapToCursor({ clientX, clientY }: PointerEvent) {\n const { drag } = this.getProps()\n const point = { x: clientX, y: clientY }\n const cursor =\n this.visualElement.getTransformPagePoint()?.(point) || point\n const box = this.visualElement.measureViewportBox()\n\n eachAxis((axis) => {\n if (!shouldDrag(axis, drag, this.currentDirection)) return\n\n const axisValue = this.getAxisMotionValue(axis)\n const { min, max } = box[axis]\n\n axisValue.set(\n (axisValue.get() || 0) + cursor[axis] - mixNumber(min, max, 0.5)\n )\n })\n }\n\n /**\n * When the viewport resizes we want to check if the measured constraints\n * have changed and, if so, reposition the element within those new constraints\n * relative to where it was before the resize.\n */\n scalePositionWithinConstraints() {\n if (!this.visualElement.current) return\n\n const { drag, dragConstraints } = this.getProps()\n const { projection } = this.visualElement\n if (\n !isElementConstraints(dragConstraints) ||\n !projection ||\n !this.constraints\n )\n return\n\n /**\n * Stop current animations as there can be visual glitching if we try to do\n * this mid-animation\n */\n this.stopAnimation()\n\n /**\n * Record the relative position of the dragged element relative to the\n * constraints box and save as a progress value.\n */\n const constraints = this.constraints as ResolvedConstraints\n const boxProgress = { x: 0, y: 0 }\n eachAxis((axis) => {\n const latest = this.getAxisMotionValue(axis).get()\n boxProgress[axis] = calcOrigin(\n { min: latest, max: latest },\n constraints[axis] as Axis\n )\n })\n\n /**\n * Update the layout of this element and resolve the latest drag constraints\n */\n const { transformTemplate } = this.visualElement.getProps()\n this.visualElement.current.style.transform = transformTemplate\n ? transformTemplate({}, \"\")\n : \"none\"\n projection.root?.updateScroll()\n projection.updateLayout()\n\n /**\n * Reset constraints so resolveConstraints() will recalculate them\n * with the freshly measured layout rather than returning the cached value.\n */\n this.constraints = false\n this.resolveConstraints()\n\n /**\n * For each axis, calculate the current progress of the layout axis\n * within the new constraints.\n */\n eachAxis((axis) => {\n const axisValue = this.getAxisMotionValue(axis)\n\n /**\n * An element resting at its origin has no offset to preserve,\n * and re-projecting 0 into the new constraints would move it.\n */\n if (!shouldDrag(axis, drag, null) || !axisValue.get()) return\n\n /**\n * Calculate a new transform based on the previous box progress\n */\n const { min, max } = (this.constraints as ResolvedConstraints)[\n axis\n ] as Axis\n axisValue.set(mixNumber(min, max, boxProgress[axis]))\n })\n\n /**\n * Flush the updated transform to the DOM synchronously to prevent\n * a visual flash at the element's CSS layout position (0,0) when\n * the transform was stripped for measurement.\n */\n this.visualElement.render()\n }\n\n addListeners() {\n if (!this.visualElement.current) return\n elementDragControls.set(this.visualElement, this)\n const element = this.visualElement.current\n\n /**\n * Attach a pointerdown event listener on this DOM element to initiate drag tracking.\n */\n const stopPointerListener = addPointerEvent(\n element,\n \"pointerdown\",\n (event) => {\n const { drag, dragListener = true } = this.getProps()\n const target = event.target as Element\n\n /**\n * Only block drag if clicking on a text input child element\n * (input, textarea, select, contenteditable) where users might\n * want to select text or interact with the control.\n *\n * Buttons and links don't block drag since they don't have\n * click-and-move actions of their own.\n */\n const isClickingTextInputChild =\n target !== element && isElementTextInput(target)\n\n if (drag && dragListener && !isClickingTextInputChild) {\n this.start(event)\n }\n }\n )\n\n /**\n * If using ref-based constraints, observe both the draggable element\n * and the constraint container for size changes via ResizeObserver.\n * Setup is deferred because dragConstraints.current is null when\n * addListeners first runs (React hasn't committed the ref yet).\n */\n let stopResizeObservers: VoidFunction | undefined\n\n const measureDragConstraints = () => {\n const { dragConstraints } = this.getProps()\n const constraintsElement =\n isElementConstraints(dragConstraints) &&\n resolveConstraintsElement(dragConstraints)\n\n if (constraintsElement) {\n this.constraints = this.resolveRefConstraints()\n\n if (!stopResizeObservers) {\n stopResizeObservers = startResizeObservers(\n element,\n constraintsElement as HTMLElement,\n () => this.scalePositionWithinConstraints()\n )\n }\n }\n }\n\n const { projection } = this.visualElement\n\n const stopMeasureLayoutListener = projection!.addEventListener(\n \"measure\",\n measureDragConstraints\n )\n\n if (!projection!.layout) {\n projection!.root?.updateScroll()\n projection!.updateLayout()\n }\n\n frame.read(measureDragConstraints)\n\n /**\n * Attach a window resize listener to scale the draggable target within its defined\n * constraints as the window resizes.\n */\n const stopResizeListener = addDomEvent(window, \"resize\", () =>\n this.scalePositionWithinConstraints()\n )\n\n /**\n * If the element's layout changes, calculate the delta and apply that to\n * the drag gesture's origin point.\n */\n const stopLayoutUpdateListener = projection!.addEventListener(\n \"didUpdate\",\n (({ delta, hasLayoutChanged }: LayoutUpdateData) => {\n if (this.isDragging && hasLayoutChanged) {\n eachAxis((axis) => {\n /**\n * Only compensate axes this gesture drags. A\n * non-drag axis follows its layout instead, as\n * nothing would ever move it back (e.g. snapping\n * to origin only animates drag axes).\n */\n if (\n !shouldDrag(\n axis,\n this.getProps().drag,\n this.currentDirection\n )\n )\n return\n\n const motionValue = this.getAxisMotionValue(axis)\n this.originPoint[axis] += delta[axis].translate\n motionValue.set(\n motionValue.get() + delta[axis].translate\n )\n })\n\n this.visualElement.render()\n }\n }) as any\n )\n\n return () => {\n stopResizeListener()\n stopPointerListener()\n stopMeasureLayoutListener()\n stopLayoutUpdateListener()\n stopResizeObservers?.()\n }\n }\n\n getProps(): MotionNodeOptions {\n const props = this.readProps()\n const { dragElastic = defaultElastic, dragMomentum = true } = props\n return { ...props, dragElastic, dragMomentum }\n }\n}\n\ntype ConstraintsElement = Element | { current: Element | null }\n\n/**\n * `dragConstraints` can be an element, or a ref (`{ current }`) to one.\n */\nfunction isElementConstraints(\n constraints: MotionNodeOptions[\"dragConstraints\"]\n): constraints is ConstraintsElement {\n return (\n !!constraints &&\n typeof constraints === \"object\" &&\n (\"current\" in constraints || \"nodeType\" in constraints)\n )\n}\n\nconst resolveConstraintsElement = (constraints: ConstraintsElement) =>\n \"current\" in constraints ? constraints.current : constraints\n\nfunction skipFirstCall(callback: VoidFunction): VoidFunction {\n let isFirst = true\n return () => {\n if (isFirst) {\n isFirst = false\n return\n }\n callback()\n }\n}\n\nfunction startResizeObservers(\n element: HTMLElement,\n constraintsElement: HTMLElement,\n onResize: VoidFunction\n): VoidFunction {\n const stopElement = resize(element, skipFirstCall(onResize))\n const stopContainer = resize(constraintsElement, skipFirstCall(onResize))\n return () => {\n stopElement()\n stopContainer()\n }\n}\n\nfunction shouldDrag(\n direction: DragDirection,\n drag: boolean | DragDirection | undefined,\n currentDirection: null | DragDirection\n) {\n return (\n (drag === true || drag === direction) &&\n (currentDirection === null || currentDirection === direction)\n )\n}\n\n/**\n * Based on an x/y offset determine the current drag direction. If both axis' offsets are lower\n * than the provided threshold, return `null`.\n *\n * @param offset - The x/y offset from origin.\n * @param lockThreshold - (Optional) - the minimum absolute offset before we can determine a drag direction.\n */\nfunction getCurrentDirection(\n offset: Point,\n lockThreshold = 10\n): DragDirection | null {\n let direction: DragDirection | null = null\n\n if (Math.abs(offset.y) > lockThreshold) {\n direction = \"y\"\n } else if (Math.abs(offset.x) > lockThreshold) {\n direction = \"x\"\n }\n\n return direction\n}\n\nexport function expectsResolvedDragConstraints({\n dragConstraints,\n onMeasureDragConstraints,\n}: MotionNodeOptions) {\n return isElementConstraints(dragConstraints) && !!onMeasureDragConstraints\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAyCA;;;;;;AAMG;AACH,SAAS,aAAa,CAAC,UAA2B,EAAA;IAC9C,IAAI,GAAG,GAAG,EAAE;AAEZ,IAAA,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE;AAChC,QAAA,IAAI,CAAC,MAAM,GAAG,SAAS;QACvB,IAAI,CAAC,YAAY,EAAE;AAEnB,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAuB;QAC1C,IAAI,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,MAAM,EAAE;AACpC,YAAA,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG;QACxD;IACJ;AAEA,IAAA,OAAO,GAAG;AACd;AAEO,MAAM,mBAAmB,GAAG,IAAI,OAAO;MAgCjC,yBAAyB,CAAA;IAyDlC,WAAA,CACI,aAAyC,EACzC,SAAA,GAAqC,MAAM,aAAa,CAAC,QAAQ,EAAE,EAAA;QAtD/D,IAAA,CAAA,YAAY,GAAwB,IAAI;QAEhD,IAAA,CAAA,UAAU,GAAG,KAAK;QACV,IAAA,CAAA,gBAAgB,GAAyB,IAAI;AAErD;;;AAGG;QACH,IAAA,CAAA,WAAW,GAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAEnC;;AAEG;QACK,IAAA,CAAA,WAAW,GAAgC,KAAK;QAEhD,IAAA,CAAA,qBAAqB,GAAG,KAAK;AAcrC;;AAEG;QACH,IAAA,CAAA,OAAO,GAAG,SAAS,EAAE;AAErB;;AAEG;QACK,IAAA,CAAA,kBAAkB,GAAwB,IAAI;AAEtD;;AAEG;QACK,IAAA,CAAA,aAAa,GAAmB,IAAI;AAaxC,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;IAC9B;AAEA,IAAA,KAAK,CAAC,WAAyB,EAAE,OAAA,GAA8B,EAAE,EAAA;AAC7D;;AAEG;QACH,IAAI,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,SAAS,KAAK,KAAK;YAAE;AAE7D,QAAA,MAAM,cAAc,GAAG,CAAC,KAAmB,KAAI;YAC3C,IAAI,OAAO,CAAC,YAAY;AAAE,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YAClD,IAAI,CAAC,aAAa,EAAE;AACxB,QAAA,CAAC;AAED,QAAA,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAE,IAAa,KAAI;;AAEnD,YAAA,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,GACzD,IAAI,CAAC,QAAQ,EAAE;AAEnB,YAAA,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;AAC1B,gBAAA,IAAI,CAAC,YAAY,IAAI;AAErB,gBAAA,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC;;gBAGrC,IAAI,CAAC,IAAI,CAAC,YAAY;oBAAE;YAC5B;AAEA,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AAEtB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;YAE5B,IAAI,CAAC,kBAAkB,EAAE;AAEzB,YAAA,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,aAAa;YACzC,IAAI,UAAU,EAAE;AACZ,gBAAA,UAAU,CAAC,kBAAkB,GAAG,IAAI;AACpC,gBAAA,UAAU,CAAC,MAAM,GAAG,SAAS;YACjC;AAEA;;AAEG;AACH,YAAA,QAAQ,CAAC,CAAC,IAAI,KAAI;AACd,gBAAA,IAAI,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC;AAEtD;;;AAGG;AACH,gBAAA,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE;oBAC7B,OAAO;wBACH,gBAAgB,CACZ,OAAO,EACP,IAAI,CAAC,aAAa,CAAC,OAAQ,CAC9B,IAAI,CAAC;gBACd;AAEA;;AAEG;AACH,gBAAA,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AAClB,oBAAA,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;gBACjC;AAAO,qBAAA,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBAC9B,MAAM,YAAY,GAAG,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC;oBAExD,IAAI,YAAY,EAAE;wBACd,OAAO;4BACH,UAAU,CAAC,YAAY,CAAC;AACxB,iCAAC,UAAU,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;oBACnC;gBACJ;AAEA,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO;AACpC,YAAA,CAAC,CAAC;AAEF,YAAA,IAAI,CAAC,KAAK;gBACN,OAAO,eAAe,KAAK,UAAU,IAAI,eAAe,CAAC,IAAI,CAAC;;YAGlE,IAAI,WAAW,EAAE;AACb,gBAAA,KAAK,CAAC,MAAM,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;YAC7D;AAEA,YAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC;YAErD,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC;AACnE,QAAA,CAAC;AAED,QAAA,MAAM,MAAM,GAAG,CAAC,KAAmB,EAAE,IAAa,KAAI;AAClD,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAEzB,YAAA,MAAM,EACF,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,MAAM,GACT,GAAG,IAAI,CAAC,QAAQ,EAAE;;AAGnB,YAAA,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE;AAE5C,YAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;;YAEvB,IAAI,iBAAiB,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;AACrD,gBAAA,IAAI,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC;AAEnD;;;;AAIG;AACH,gBAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;oBAAE;AAEpC,gBAAA,eAAe,IAAI,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAC7D;;AAGA,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;AAC5B,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;YAC5B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AAE/B;;;;;AAKG;AACH,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;AAE3B;;;AAGG;YACH,IAAI,MAAM,EAAE;AACR,gBAAA,KAAK,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;YACxD;AACJ,QAAA,CAAC;AAED,QAAA,MAAM,YAAY,GAAG,CAAC,KAAmB,EAAE,IAAa,KAAI;AACxD,YAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAEzB,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;AAEtB,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAC7B,QAAA,CAAC;QAED,MAAM,eAAe,GAAG,MAAK;YACzB,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;YAClD,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE;AACxC,gBAAA,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACvC;AACJ,QAAA,CAAC;QAED,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5C,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAC5B,WAAW,EACX;YACI,cAAc;YACd,OAAO;YACP,MAAM;YACN,YAAY;YACZ,eAAe;SAClB,EACD;AACI,YAAA,GAAG,OAAO;AACV,YAAA,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE;YAC9D,gBAAgB;YAChB,aAAa,EACT,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,WAAW;AACzD,YAAA,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO;AACtC,SAAA,CACJ;IACL;AAEA;;;AAGG;AACH,IAAA,IAAI,CACA,KAAoB,EACpB,OAAiB,EACjB,QAAoC,EAAA;AAEpC,QAAA,MAAM,UAAU,GAAG,KAAK,IAAI,IAAI,CAAC,kBAAkB;AACnD,QAAA,MAAM,YAAY,GAAG,OAAO,IAAI,IAAI,CAAC,aAAa;AAElD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU;QAClC,IAAI,CAAC,MAAM,EAAE;AACb,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU;YAAE;AAEjD,QAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY;AACjC,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAEvC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;QACrC,IAAI,SAAS,EAAE;AACX,YAAA,KAAK,CAAC,UAAU,CAAC,MAAM,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC/D;IACJ;IAEA,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;QAEvB,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,aAAa;QAEzD,IAAI,UAAU,EAAE;AACZ,YAAA,UAAU,CAAC,kBAAkB,GAAG,KAAK;QACzC;QAEA,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY,EAAE;YACvD,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC5B;AAEA,QAAA,cAAc,EAAE,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC;IACjD;AAEA;;;;AAIG;IACH,aAAa,GAAA;AACT,QAAA,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;IAC/B;IAEQ,UAAU,CAAC,IAAmB,EAAE,MAAc,EAAA;AAClD;;;AAGG;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;;AAGjC,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC;YAAE;QAE/D,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAC/C,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;;AAGhD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAC9D,IAAI,WAAW,EAAE;AACb,YAAA,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClE;QAEA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAChE;IAEQ,kBAAkB,GAAA;QACtB,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AAExD,QAAA,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,aAAa;AACzC,QAAA,MAAM,MAAM,GACR,UAAU,KAAK,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAElE,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW;AAExC,QAAA,IAAI,oBAAoB,CAAC,eAAe,CAAC,EAAE;AACvC;;;;;;AAMG;YACH,IACI,CAAC,IAAI,CAAC,WAAW;gBACjB,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,UAAW,CAAC,EAC5C;AACE,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,qBAAqB,EAAE;YACnD;QACJ;aAAO;AACH,YAAA,IACI,eAAe;gBACf,MAAM;AACN,gBAAA,OAAO,eAAe,KAAK,QAAQ,EACrC;gBACE,IAAI,CAAC,WAAW,GAAG,uBAAuB,CACtC,MAAM,CAAC,SAAS,EAChB,eAAe,CAClB;YACL;iBAAO;AACH,gBAAA,IAAI,CAAC,WAAW,GAAG,KAAK;YAC5B;QACJ;AAEA,QAAA,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC;AAE9C;;;;;AAKG;AACH,QAAA,IACI,eAAe,KAAK,IAAI,CAAC,WAAW;YACpC,CAAC,oBAAoB,CAAC,eAAe,CAAC;YACtC,MAAM;AACN,YAAA,IAAI,CAAC,WAAW;AAChB,YAAA,CAAC,IAAI,CAAC,qBAAqB,EAC7B;AACE,YAAA,QAAQ,CAAC,CAAC,IAAI,KAAI;AACd,gBAAA,IACI,IAAI,CAAC,WAAW,KAAK,KAAK;AAC1B,oBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAC/B;oBACE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAC1C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CACzB;gBACL;AACJ,YAAA,CAAC,CAAC;QACN;IACJ;IAEQ,qBAAqB,GAAA;AACzB,QAAA,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,wBAAwB,EAAE,GAC5D,IAAI,CAAC,QAAQ,EAAE;AACnB,QAAA,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;AAAE,YAAA,OAAO,KAAK;AAEpD,QAAA,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,WAAW,CAAC;AAEjE,QAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACjC,SAAS,CACL,CAAC,CAAC,kBAAkB,EACpB,wGAAwG,EACxG,sBAAsB,CACzB;AAEL,QAAA,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,aAAa;;AAGzC,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AAEnD;;;;;;;AAOG;AACH,QAAA,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;AAEvC,QAAA,MAAM,cAAc,GAAG,cAAc,CACjC,kBAAiC,EACjC,UAAU,CAAC,IAAK,EAChB,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAC7C;AAED;;;AAGG;AACH,QAAA,IAAI,mBAAmB,GAAG,uBAAuB,CAC7C,UAAU,CAAC,MAAM,CAAC,SAAS,EAC3B,UAAU,CAAC,mBAAmB,CAAC,cAAc,CAAC,CACjD;AAED;;;AAGG;QACH,IAAI,wBAAwB,EAAE;YAC1B,MAAM,eAAe,GAAG,wBAAwB,CAC5C,uBAAuB,CAAC,mBAAmB,CAAC,CAC/C;AAED,YAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,eAAe;YAE9C,IAAI,eAAe,EAAE;AACjB,gBAAA,mBAAmB,GAAG,uBAAuB,CAAC,eAAe,CAAC;YAClE;QACJ;AAEA,QAAA,OAAO,mBAAmB;IAC9B;IAEQ,cAAc,CAClB,QAAe,EACf,QAAoC,EAAA;AAEpC,QAAA,MAAM,EACF,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACtB,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEnB;;;;;AAKG;AACH,QAAA,MAAM,OAAO,GAAG;YACZ,eAAe,EAAE,WAAW,GAAG,GAAG,GAAG,OAAO;YAC5C,aAAa,EAAE,WAAW,GAAG,EAAE,GAAG,QAAQ;AAC1C,YAAA,YAAY,EAAE,GAAG;AACjB,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,SAAS,EAAE,EAAE;AACb,YAAA,GAAG,cAAc;SACpB;AAED,QAAA,MAAM,YAAY,GAAG,CAAC,IAAmB,KACrC,YAAY;AACZ,YAAA,EAAE,IAAI,CAAC,KAAK,IAAI,gBAAgB,CAAC;YACjC,UAAU,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,IAAI,CAAC,gBAAgB;AACpD,cAAE,QAAQ,CAAC,IAAI;cACb,CAAC;AAEX,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,gBAAgB,EAAE;YACjC,OAAO,IAAI,CAAC;AACP,iBAAA,OAAO,CACJ,EAAE,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,EAC9C,OAAO;iBAEV,IAAI,CAAC,mBAAmB,CAAC;QAClC;AAEA,QAAA,MAAM,WAAW,GAAiC,IAAI,CAAC,WAAW,IAAI,EAAE;AAExE,QAAA,MAAM,kBAAkB,GAAG,QAAQ,CAAC,CAAC,IAAI,KAAI;AACzC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE;gBAC5D;YACJ;YAEA,IAAI,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE;YAExC,IACI,gBAAgB,KAAK,IAAI;AACxB,gBAAA,gBAA4B,KAAK,IAAI;gBAEtC,UAAU,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;AAEnC,YAAA,MAAM,OAAO,GAAe;AACxB,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC;AAC5B,gBAAA,GAAG,OAAO;AACV,gBAAA,GAAG,UAAU;aAChB;;;;YAKD,OAAO,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC;AACtD,QAAA,CAAC,CAAC;;QAGF,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;IACpE;IAEQ,uBAAuB,CAC3B,IAAmB,EACnB,UAAsB,EAAA;QAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAE/C,QAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC;QAE9C,OAAO,SAAS,CAAC,KAAK,CAClB,kBAAkB,CACd,IAAI,EACJ,SAAS,EACT,CAAC,EACD,UAAU,EACV,IAAI,CAAC,aAAa,EAClB,KAAK,CACR,CACJ;IACL;IAEA,aAAa,GAAA;AACT,QAAA,QAAQ,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D;AAEA;;;;;AAKG;AACH,IAAA,kBAAkB,CAAC,IAAmB,EAAA;QAClC,MAAM,OAAO,GACT,CAAA,KAAA,EAAQ,IAAI,CAAC,WAAW,EAAE,EAAwC;AACtE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;AAC9B,QAAA,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC;AAE1C,QAAA,OAAO;AACH,cAAE;cACA,IAAI,CAAC,aAAa,CAAC,QAAQ,CACvB,IAAI,EACJ,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7C;IACX;AAEA;;;AAGG;AACK,IAAA,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,EAAgB,EAAA;QACnD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE;AACxC,QAAA,MAAM,MAAM,GACR,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE;AAEnD,QAAA,QAAQ,CAAC,CAAC,IAAI,KAAI;YACd,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC;gBAAE;YAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAC/C,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAE9B,SAAS,CAAC,GAAG,CACT,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CACnE;AACL,QAAA,CAAC,CAAC;IACN;AAEA;;;;AAIG;IACH,8BAA8B,GAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO;YAAE;QAEjC,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AACjD,QAAA,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,aAAa;AACzC,QAAA,IACI,CAAC,oBAAoB,CAAC,eAAe,CAAC;AACtC,YAAA,CAAC,UAAU;YACX,CAAC,IAAI,CAAC,WAAW;YAEjB;AAEJ;;;AAGG;QACH,IAAI,CAAC,aAAa,EAAE;AAEpB;;;AAGG;AACH,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAkC;QAC3D,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAClC,QAAA,QAAQ,CAAC,CAAC,IAAI,KAAI;YACd,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE;YAClD,WAAW,CAAC,IAAI,CAAC,GAAG,UAAU,CAC1B,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAC5B,WAAW,CAAC,IAAI,CAAS,CAC5B;AACL,QAAA,CAAC,CAAC;AAEF;;AAEG;QACH,MAAM,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;QAC3D,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG;AACzC,cAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE;cACxB,MAAM;AACZ,QAAA,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE;QAC/B,UAAU,CAAC,YAAY,EAAE;AAEzB;;;AAGG;AACH,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QACxB,IAAI,CAAC,kBAAkB,EAAE;AAEzB;;;AAGG;AACH,QAAA,QAAQ,CAAC,CAAC,IAAI,KAAI;YACd,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAE/C;;;AAGG;AACH,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;gBAAE;AAEvD;;AAEG;AACH,YAAA,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAI,IAAI,CAAC,WAAmC,CAC1D,IAAI,CACC;AACT,YAAA,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,QAAA,CAAC,CAAC;AAEF;;;;AAIG;AACH,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;IAC/B;IAEA,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO;YAAE;QACjC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC;AACjD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO;AAE1C;;AAEG;QACH,MAAM,mBAAmB,GAAG,eAAe,CACvC,OAAO,EACP,aAAa,EACb,CAAC,KAAK,KAAI;AACN,YAAA,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AACrD,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAiB;AAEtC;;;;;;;AAOG;YACH,MAAM,wBAAwB,GAC1B,MAAM,KAAK,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC;AAEpD,YAAA,IAAI,IAAI,IAAI,YAAY,IAAI,CAAC,wBAAwB,EAAE;AACnD,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACrB;AACJ,QAAA,CAAC,CACJ;AAED;;;;;AAKG;AACH,QAAA,IAAI,mBAA6C;QAEjD,MAAM,sBAAsB,GAAG,MAAK;YAChC,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3C,YAAA,MAAM,kBAAkB,GACpB,oBAAoB,CAAC,eAAe,CAAC;gBACrC,yBAAyB,CAAC,eAAe,CAAC;YAE9C,IAAI,kBAAkB,EAAE;AACpB,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,qBAAqB,EAAE;gBAE/C,IAAI,CAAC,mBAAmB,EAAE;AACtB,oBAAA,mBAAmB,GAAG,oBAAoB,CACtC,OAAO,EACP,kBAAiC,EACjC,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAC9C;gBACL;YACJ;AACJ,QAAA,CAAC;AAED,QAAA,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,aAAa;QAEzC,MAAM,yBAAyB,GAAG,UAAW,CAAC,gBAAgB,CAC1D,SAAS,EACT,sBAAsB,CACzB;AAED,QAAA,IAAI,CAAC,UAAW,CAAC,MAAM,EAAE;AACrB,YAAA,UAAW,CAAC,IAAI,EAAE,YAAY,EAAE;YAChC,UAAW,CAAC,YAAY,EAAE;QAC9B;AAEA,QAAA,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC;AAElC;;;AAGG;AACH,QAAA,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,MACrD,IAAI,CAAC,8BAA8B,EAAE,CACxC;AAED;;;AAGG;AACH,QAAA,MAAM,wBAAwB,GAAG,UAAW,CAAC,gBAAgB,CACzD,WAAW,GACV,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAoB,KAAI;AAC/C,YAAA,IAAI,IAAI,CAAC,UAAU,IAAI,gBAAgB,EAAE;AACrC,gBAAA,QAAQ,CAAC,CAAC,IAAI,KAAI;AACd;;;;;AAKG;AACH,oBAAA,IACI,CAAC,UAAU,CACP,IAAI,EACJ,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EACpB,IAAI,CAAC,gBAAgB,CACxB;wBAED;oBAEJ,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AACjD,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS;AAC/C,oBAAA,WAAW,CAAC,GAAG,CACX,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,CAC5C;AACL,gBAAA,CAAC,CAAC;AAEF,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;YAC/B;QACJ,CAAC,EACJ;AAED,QAAA,OAAO,MAAK;AACR,YAAA,kBAAkB,EAAE;AACpB,YAAA,mBAAmB,EAAE;AACrB,YAAA,yBAAyB,EAAE;AAC3B,YAAA,wBAAwB,EAAE;YAC1B,mBAAmB,IAAI;AAC3B,QAAA,CAAC;IACL;IAEA,QAAQ,GAAA;AACJ,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;QAC9B,MAAM,EAAE,WAAW,GAAG,cAAc,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,KAAK;QACnE,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE;IAClD;AACH;AAID;;AAEG;AACH,SAAS,oBAAoB,CACzB,WAAiD,EAAA;IAEjD,QACI,CAAC,CAAC,WAAW;QACb,OAAO,WAAW,KAAK,QAAQ;SAC9B,SAAS,IAAI,WAAW,IAAI,UAAU,IAAI,WAAW,CAAC;AAE/D;AAEA,MAAM,yBAAyB,GAAG,CAAC,WAA+B,KAC9D,SAAS,IAAI,WAAW,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW;AAEhE,SAAS,aAAa,CAAC,QAAsB,EAAA;IACzC,IAAI,OAAO,GAAG,IAAI;AAClB,IAAA,OAAO,MAAK;QACR,IAAI,OAAO,EAAE;YACT,OAAO,GAAG,KAAK;YACf;QACJ;AACA,QAAA,QAAQ,EAAE;AACd,IAAA,CAAC;AACL;AAEA,SAAS,oBAAoB,CACzB,OAAoB,EACpB,kBAA+B,EAC/B,QAAsB,EAAA;IAEtB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,kBAAkB,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;AACzE,IAAA,OAAO,MAAK;AACR,QAAA,WAAW,EAAE;AACb,QAAA,aAAa,EAAE;AACnB,IAAA,CAAC;AACL;AAEA,SAAS,UAAU,CACf,SAAwB,EACxB,IAAyC,EACzC,gBAAsC,EAAA;IAEtC,QACI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;SACnC,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,KAAK,SAAS,CAAC;AAErE;AAEA;;;;;;AAMG;AACH,SAAS,mBAAmB,CACxB,MAAa,EACb,aAAa,GAAG,EAAE,EAAA;IAElB,IAAI,SAAS,GAAyB,IAAI;IAE1C,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE;QACpC,SAAS,GAAG,GAAG;IACnB;SAAO,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE;QAC3C,SAAS,GAAG,GAAG;IACnB;AAEA,IAAA,OAAO,SAAS;AACpB;SAEgB,8BAA8B,CAAC,EAC3C,eAAe,EACf,wBAAwB,GACR,EAAA;IAChB,OAAO,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,wBAAwB;AAC9E;;;;"}